ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNTYgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKKyMgQmFzZWRPblN0eWxlOiAgTExWTQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDIKK0FsaWduRXNjYXBlZE5ld2xpbmVzTGVmdDogZmFsc2UKK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IGZhbHNlCitBbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0Fsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKK0Fsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQorQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM6IHRydWUKK0JyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hOiBmYWxzZQorQmluUGFja1BhcmFtZXRlcnM6IGZhbHNlCitDb2x1bW5MaW1pdDogICAgIDEwMAorQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCitJbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKK0luZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGU6IGZhbHNlCitNYXhFbXB0eUxpbmVzVG9LZWVwOiAxCitLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczogdHJ1ZQorTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKK09iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCitPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKK1BlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcjogMTkwCitQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKK1BlbmFsdHlCcmVha1N0cmluZzogMTAwMDAKK1BlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAorUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjogMTAwMDAwMAorUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmU6IDEyMDAKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1NwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKK0NwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCitTdGFuZGFyZDogICAgICAgIEF1dG8KK0luZGVudFdpZHRoOiAgICAgMgorVGFiV2lkdGg6ICAgICAgICA0CitVc2VUYWI6ICAgICAgICAgIE5ldmVyCitCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCitTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCitTcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKK1NwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKK1NwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKK0NvbW1lbnRQcmFnbWFzOiAgJ14gSVdZVSBwcmFnbWE6JworRm9yRWFjaE1hY3JvczogICBbIGZvcmVhY2gsIFFfRk9SRUFDSCwgQk9PU1RfRk9SRUFDSCBdCitTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKK0Rpc2FibGVGb3JtYXQ6ICAgZmFsc2UKKy4uLgorCmRpZmYgLS1naXQgYS8uZG9ja2VyaWdub3JlIGIvLmRvY2tlcmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmRvY2tlcmlnbm9yZQpAQCAtMCwwICsxIEBACisuZ2l0LwpkaWZmIC0tZ2l0IGEvLmVkaXRvcmNvbmZpZyBiLy5lZGl0b3Jjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYxMTc2MgotLS0gL2Rldi9udWxsCisrKyBiLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMKKyMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjCisKKyMgRWRpdG9yQ29uZmlnOiBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworIyBzZWUgZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKKworcm9vdCA9IHRydWUKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQorCisjIEFjdGlvblNjcmlwdAorIyBbKi5hc10KKworIyBDCisjIFsqLmNdCisKKyMgQysrCitbKi5jcHBdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgQy1TaGFycAorIyBbKi5jc10KKworIyBECisjIFsqLmRdCisKKyMgRXJsYW5nCisjIFsqLmVybF0KKworIyBHby1sYW5nCitbKi5nb10KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA4CisKKyMgQyBoZWFkZXIgZmlsZXMKKyMgWyouaF0KKworIyBIYXNrZWxsCisjIFsqLmhzXQorCisjIEhheGUKKyMgWyouaHhdCisKKyMgSmF2YQorIyBbKi5qYXZhXQorCisjIEphdmFzY3JpcHQKK1sqLmpzXQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCisjIEpTT04KK1sqLmpzb25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgTHVhCisjIFsqLmx1YV0KKworWyoubWFya2Rvd25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworWyoubWRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworIyBPQ2FtbAorIyBbKi5tbF0KKworIyBEZWxwaGkgUGFzY2FsCisjIFsqLnBhc10KKworIyBQSFAKKyMgWyoucGhwXQorCisjIFBlcmwKKyMgWyoucG1dCisKKyMgUHl0aG9uCisjIFsqLnB5XQorCisjIFJ1YnkKKyMgWyoucmJdCisKKyMgVHlwZXNjcmlwdAorIyBbKi50c10KKworIyBYTUwKKyMgWyoueG1sXQpkaWZmIC0tZ2l0IGEvLmVzbGludGlnbm9yZSBiLy5lc2xpbnRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmRiYQotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRpZ25vcmUKQEAgLTAsMCArMSw5IEBACisjIFRPRE86IFVzZSBlc2xpbnQgb24ganMgbGliIGFuZCBnZW5lcmF0ZWQgY29kZQorCisjIElnbm9yZSBsaWIvanMgZm9yIG5vdywgd2hpY2ggdXNlcyBqc2hpbnQgY3VycmVudGx5CitsaWIvanMvKgorIyBJZ25vcmUgYWxsIGdlbmVyYXRlZCBjb2RlIGZvciBub3cKKyoqL2dlbi0qCisKKyMgRG9uJ3QgbGludCBuZXN0ZWQgbm9kZV9tb2R1bGVzCisqKi9ub2RlX21vZHVsZXMKZGlmZiAtLWdpdCBhLy5lc2xpbnRyYy5qc29uIGIvLmVzbGludHJjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZTgyMAotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRyYy5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgImVudiI6IHsKKyAgICAiZXM2IjogdHJ1ZSwKKyAgICAibm9kZSI6IHRydWUKKyAgfSwKKyAgImV4dGVuZHMiOiBbCisgICAgImVzbGludDpyZWNvbW1lbmRlZCIsCisgICAgInBsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCIKKyAgXSwKKyAgInBhcnNlck9wdGlvbnMiOiB7CisgICAgImVjbWFWZXJzaW9uIjogMjAxNworICB9LAorICAicnVsZXMiOiB7CisgICAgIm5vLWNvbnNvbGUiOiAib2ZmIiwKKyAgICAibm8tdmFyIjogImVycm9yIiwKKyAgICAicHJlZmVyLWNvbnN0IjogImVycm9yIiwKKyAgICAibm8tY29uc3RhbnQtY29uZGl0aW9uIjogWworICAgICAgImVycm9yIiwKKyAgICAgIHsKKyAgICAgICAgImNoZWNrTG9vcHMiOiBmYWxzZQorICAgICAgfQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvLmdpdGF0dHJpYnV0ZXMgYi8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKiB0ZXh0PWF1dG8KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDdhMzk3MTIuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSwxMTcgKzEsMjU4IEBACi0vTWFrZWZpbGUKLS9NYWtlZmlsZS5pbgorIyBnZW5lcmljIGlnbm9yZXMKKyoubGEKKyoubG8KKyoubworKi5kZXBzCisqLmRpcnN0YW1wCisqLmxpYnMKKyoubG9nCisqLnRycworKi5zdW8KKyoucHljCisqLmNhY2hlCisqLnVzZXIKKyouaXBjaAorKi5zZGYKKyouamFyCisqLmV4ZQorKi5kbGwKKypfUmVTaGFycGVyKgorKi5vcGVuc2RmCisqLnN3cAorKi5oaQorKn4KK3RhZ3MKKworLipwcm9qZWN0CisuY2xhc3NwYXRoCisuZHViCisuc2V0dGluZ3MKKy5jaGVja3N0eWxlCitqdW5pdCoucHJvcGVydGllcworLmlkZWEKKyouaW1sCisqLmlwcgorKi5pd3MKK2dlbi0qCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2FjbG9jYWwubTQKK2FjaW5jbHVkZS5tNAorYXBhY2hlLXRocmlmdC10ZXN0LWxpYnJhcnkKK2F1dG9tNHRlLmNhY2hlCitjbWFrZS0qCitkdWIuc2VsZWN0aW9ucy5qc29uCitsaWJhcGFjaGUtdGhyaWZ0LmEKK25vZGVfbW9kdWxlcworY29tcGlsZQordGVzdC1kcml2ZXIKK2VybF9jcmFzaC5kdW1wCitwcm9qZWN0LmxvY2suanNvbgorCisuc29uYXIKKy5EU19TdG9yZQorLnN2bgorLnZhZ3JhbnQKKy52c2NvZGUKKy52cworCiAvYWNsb2NhbC9saWJ0b29sLm00Ci0vYWNsb2NhbC9sdG9wdGlvbnMubTQKLS9hY2xvY2FsL2x0c3VnYXIubTQKLS9hY2xvY2FsL2x0dmVyc2lvbi5tNAotL2FjbG9jYWwvbHR+b2Jzb2xldGUubTQKLS9hY2xvY2FsLm00Ci0vYXV0b200dGUuY2FjaGUKKy9hY2xvY2FsL2x0Ki5tNAogL2F1dG9zY2FuLmxvZwotL2NvbXBpbGVyL2NwcC8uZGVwcwotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZQotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5pbgorL2F1dG9zY2FuLSoubG9nCisvY21ha2VfKgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5kYgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5WQy5vcGVuZGIKKy9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisvY29tcGlsZXIvY3BwL3Rlc3QvKnRlc3QKKy9jb21waWxlci9jcHAvdGVzdC90aHJpZnQtZ2VuLSoKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL2dlbi5zdGFtcAorL2NvbXBpbGVyL2NwcC9EZWJ1ZworL2NvbXBpbGVyL2NwcC9SZWxlYXNlCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbGlicGFyc2UuYQorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5oaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvdmVyc2lvbi5oCiAvY29tcGlsZXIvY3BwL3RocmlmdAotL2NvbXBpbGVyL2NwcC8qLm8KIC9jb21waWxlci9jcHAvdGhyaWZ0bC5jYwogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5oCi0vY29tcGlsZXIvY3BwL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC90aHJpZnR5LmhoCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAvY29uZmlnLioKIC9jb25maWd1cmUKIC9jb25maWd1cmUubGluZW5vCiAvY29uZmlndXJlLnNjYW4KKy9jb250cmliLy52YWdyYW50LworL2NvbnRyaWIvZmIzMDMvY29uZmlnLmNhY2hlCisvY29udHJpYi9mYjMwMy9jb25maWcubG9nCisvY29udHJpYi9mYjMwMy9jb25maWcuc3RhdHVzCisvY29udHJpYi9mYjMwMy9jb25maWd1cmUKKy9jb250cmliL2ZiMzAzL2NwcC9saWJmYjMwMy5hCisvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLworL2NvbnRyaWIvZmIzMDMvcHkvYnVpbGQvCisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va1NlcnZpY2UtcmVtb3RlCisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va1NlcnZpY2UucHkKKy9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL19faW5pdF9fLnB5CisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9jb25zdGFudHMucHkKKy9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL3R0eXBlcy5weQogL2RlcGNvbXAKLS9pZi9NYWtlZmlsZQotL2lmL01ha2VmaWxlLmluCiAvaW5zdGFsbC1zaAotL2xpYi9NYWtlZmlsZQotL2xpYi9NYWtlZmlsZS5pbgotL2xpYi9lcmwvZWJpbgotL2xpYi9jcHAvLmRlcHMKLS9saWIvY3BwLy5saWJzCi0vbGliL2NwcC9NYWtlZmlsZQotL2xpYi9jcHAvTWFrZWZpbGUuaW4KLS9saWIvY3BwL3Rlc3QvLmRlcHMKLS9saWIvY3BwL3Rlc3QvLmxpYnMKLS9saWIvY3BwL3Rlc3QvZ2VuLWNwcAotL2xpYi9jcHAvdGVzdC9NYWtlZmlsZQotL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5pbgorL2xpYi9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvbGliL2NsL2xpYgorL2xpYi9jbC9ydW4tdGVzdHMKKy9saWIvY2wvcXVpY2tsaXNwLmxpc3AKKy9saWIvY2wvZXh0ZXJuYWxzLworL2xpYi9jbC9ydW4tdGVzdHMKKy9saWIvY2wvcXVpY2tsaXNwLworL2xpYi9jcHAvRGVidWcvCisvbGliL2NwcC9EZWJ1Zy1tdC8KKy9saWIvY3BwL1JlbGVhc2UvCisvbGliL2NwcC9SZWxlYXNlLW10LworL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9tb2NfVFFUY3BTZXJ2ZXIuY3BwCisvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L21vY19fVFFUY3BTZXJ2ZXIuY3BwCisvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmZpZy5oCisvbGliL2NwcC9zcmMvdGhyaWZ0L3N0YW1wLWgyCiAvbGliL2NwcC90ZXN0L0JlbmNobWFyaworL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbHNUZXN0CisvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0CiAvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0CisvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0CisvbGliL2NwcC90ZXN0L0VudW1UZXN0CiAvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QKIC9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QKKy9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0CisvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0CiAvbGliL2NwcC90ZXN0L1JlZmxlY3Rpb25UZXN0CisvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdAogL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdAorL2xpYi9jcHAvdGVzdC9USW50ZXJydXB0VGVzdAorL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKIC9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdAorL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0CisvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0CisvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVW5pdFRlc3RzCi0vbGliL2NwcC90ZXN0LyoubGEKLS9saWIvY3BwL3Rlc3QvKi5sbwotL2xpYi9jcHAvdGVzdC8qLm8KKy9saWIvY3BwL3Rlc3QvWmxpYlRlc3QKKy9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0CisvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5X3Rlc3QKKy9saWIvY3BwL3Rlc3QvbGlua190ZXN0CisvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvcl90ZXN0CisvbGliL2NwcC90ZXN0L3Rlc3RzLnhtbAogL2xpYi9jcHAvY29uY3VycmVuY3lfdGVzdAotL2xpYi9jcHAvKi5vCi0vbGliL2NwcC8qLmxhCi0vbGliL2NwcC8qLmxvCiAvbGliL2NwcC8qLnBjCisvbGliL2NwcC94NjQvRGVidWcvCisvbGliL2NwcC94NjQvRGVidWctbXQvCisvbGliL2NwcC94NjQvUmVsZWFzZQorL2xpYi9jcHAveDY0L1JlbGVhc2UtbXQKIC9saWIvY19nbGliLyouZ2NkYQogL2xpYi9jX2dsaWIvKi5nY25vCi0vbGliL2NfZ2xpYi8qLmxhCi0vbGliL2NfZ2xpYi8qLmxvCiAvbGliL2NfZ2xpYi8qLmxvVAotL2xpYi9jX2dsaWIvKi5vCi0vbGliL2NfZ2xpYi8uZGVwcwotL2xpYi9jX2dsaWIvLmxpYnMKLS9saWIvY19nbGliL01ha2VmaWxlLmluCi0vbGliL2NfZ2xpYi9NYWtlZmlsZQotL2xpYi9jX2dsaWIvdGhyaWZ0Yy5wYwotL2xpYi9jX2dsaWIvdGVzdC8qLm8KLS9saWIvY19nbGliL3Rlc3QvKi5sbworL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaAorL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zdGFtcC1oMworL2xpYi9jX2dsaWIvdGVzdC8qLmdjbm8KIC9saWIvY19nbGliL3Rlc3QvdGVzdHdyYXBwZXIuc2gKIC9saWIvY19nbGliL3Rlc3QvdGVzdHdyYXBwZXItdGVzdCoKLS9saWIvY19nbGliL3Rlc3QvLmRlcHMKLS9saWIvY19nbGliL3Rlc3QvLmxpYnMKLS9saWIvY19nbGliL3Rlc3QvZ2VuLWNwcC8KLS9saWIvY19nbGliL3Rlc3QvZ2VuLWNfZ2xpYgotL2xpYi9jc2hhcnAvTWFrZWZpbGUKLS9saWIvY3NoYXJwL01ha2VmaWxlLmluCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QKKy9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8KKy9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlcgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIKKy9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uCisvbGliL2NfZ2xpYi90aHJpZnRjLnBjCisvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCisvbGliL2NzaGFycC8qKi9iaW4vCisvbGliL2NzaGFycC8qKi9vYmovCisvbGliL2NzaGFycC9zcmMvcGFja2FnZXMKKy9saWIvZC90ZXN0LyoucGVtCisvbGliL2QvbGlidGhyaWZ0ZCouYQorL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdAorL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdAorL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsKKy9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlcgorL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50CisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIKKy9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0CisvbGliL2QvdW5pdHRlc3QvCisvbGliL2RhcnQvY292ZXJhZ2UKKy9saWIvZGFydC8qKi8ucGFja2FnZXMKKy9saWIvZGFydC8qKi9wYWNrYWdlcworL2xpYi9kYXJ0LyoqLy5wdWIvCisvbGliL2RhcnQvKiovcHVic3BlYy5sb2NrCisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXF1ZXN0CisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXNwb25zZQorL2xpYi9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvbGliL2RlbHBoaS8qKi8qLmxvY2FsCisvbGliL2RlbHBoaS8qKi8qLmRjdQorL2xpYi9kZWxwaGkvKiovKi4yMDA3CisvbGliL2RlbHBoaS8qKi8qLmRwcm9qCisvbGliL2RlbHBoaS8qKi9jb2RlZ2VuLyouYmF0CisvbGliL2VybC8uZXVuaXQKKy9saWIvZXJsLy5nZW5lcmF0ZWQKKy9saWIvZXJsLy5yZWJhci8KKy9saWIvZXJsL2RlcHMvCisvbGliL2VybC9lYmluCisvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMKKy9saWIvZXJsL3Rlc3QvKi5iZWFtCisvbGliL2VybC90ZXN0LyouaHJsCisvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGhvdXQudGhyaWZ0CisvbGliL2hheGUvdGVzdC9iaW4KKy9saWIvaGF4ZS90ZXN0L2RhdGEudG1wCiAvbGliL2hzL2Rpc3QKLS9saWIvamF2YS9NYWtlZmlsZQotL2xpYi9qYXZhL01ha2VmaWxlLmluCisvbGliL2phdmEvLmdyYWRsZQorL2xpYi9qYXZhL2FuZHJvaWQvLmdyYWRsZQogL2xpYi9qYXZhL2J1aWxkCi0vbGliL2phdmEvZ2VuLWphdmEKLS9saWIvamF2YS9nZW4tamF2YWJlYW4KLS9saWIvamF2YS9saWJ0aHJpZnQuamFyCisvbGliL2phdmEvdGFyZ2V0CisvbGliL2pzL2Rpc3QKKy9saWIvanMvZG9jCisvbGliL2pzL3Rlc3QvYnVpbGQKKy9saWIvbmV0Y29yZS8qKi9iaW4KKy9saWIvbmV0Y29yZS8qKi9vYmoKKy9saWIvbm9kZWpzL2NvdmVyYWdlCisvbGliL25vZGVqcy9ub2RlX21vZHVsZXMvCiAvbGliL3BlcmwvTUFOSUZFU1QKLS9saWIvcGVybC9NYWtlZmlsZQotL2xpYi9wZXJsL01ha2VmaWxlLmluCisvbGliL3BlcmwvTVlNRVRBLmpzb24KKy9saWIvcGVybC9NWU1FVEEueW1sCiAvbGliL3BlcmwvTWFrZWZpbGUtcGVybC5tawogL2xpYi9wZXJsL2JsaWIKIC9saWIvcGVybC9wbV90b19ibGliCi0vbGliL3BlcmwvdGVzdC9NYWtlZmlsZQotL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuaW4KLS9saWIvcGVybC90ZXN0L2dlbi1wZXJsCi0vbGliL3B5L01ha2VmaWxlCi0vbGliL3B5L01ha2VmaWxlLmluCiAvbGliL3B5L2J1aWxkCi0vbGliL3JiL01ha2VmaWxlCi0vbGliL3JiL01ha2VmaWxlLmluCisvbGliL3B5L3RocmlmdC5lZ2ctaW5mby8KKy9saWIvcmIvR2VtZmlsZS5sb2NrCisvbGliL3JiL2RlYnVnX3Byb3RvX3Rlc3QKIC9saWIvcmIvLmNvbmZpZwotL2xpYi9yYi9leHQvTWFrZWZpbGUKLS9saWIvcmIvZXh0LyoubwogL2xpYi9yYi9leHQvY29uZnRlc3QuZFNZTS8KKy9saWIvcmIvZXh0L21rbWYubG9nCiAvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmJ1bmRsZQotL2xpYi9waHAvTWFrZWZpbGUKLS9saWIvcGhwL01ha2VmaWxlLmluCi0vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC8uZGVwcwotL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvLmxpYnMKLS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlCisvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLnNvCisvbGliL3JiL3Rlc3QvCisvbGliL3JiL3RocmlmdC0qLmdlbQogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUuKgotL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYWNpbmNsdWRlLm00Ci0vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9hY2xvY2FsLm00Ci0vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9hdXRvbTR0ZS5jYWNoZS8KIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkLwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLioKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmFjCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4KIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2gKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wKQEAgLTEyMiwxOSArMjYzLDEzNCBAQAogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5sbwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcnVuLXRlc3RzLnBocAogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmxhCi0vbGliL2VybC9NYWtlZmlsZQotL2xpYi9lcmwvTWFrZWZpbGUuaW4KLS9saWIvZXJsL3NyYy9NYWtlZmlsZQotL2xpYi9lcmwvc3JjL01ha2VmaWxlLmluCisvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC90bXAtcGhwLmluaQorL2xpYi9waHAvc3JjL3BhY2thZ2VzLworL2xpYi9waHAvdGVzdC9URVNULSoueG1sCisvbGliL3BocC90ZXN0L3BhY2thZ2VzLworL2xpYi9weS9kaXN0LworL2xpYi9lcmwvbG9ncy8KKy9saWIvZ28vcGtnCisvbGliL2dvL3NyYworL2xpYi9nby90ZXN0L2dvcGF0aC8KKy9saWIvZ28vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorL2xpYi9ycy90YXJnZXQvCisvbGliL3JzL0NhcmdvLmxvY2sKKy9saWIvcnMvdGVzdC9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvdGFyZ2V0LworL2xpYi9ycy90ZXN0L2Jpbi8KKy9saWIvcnMvdGVzdC9zcmMvYmFzZV9vbmUucnMKKy9saWIvcnMvdGVzdC9zcmMvYmFzZV90d28ucnMKKy9saWIvcnMvdGVzdC9zcmMvbWlkbGF5ZXIucnMKKy9saWIvcnMvdGVzdC9zcmMvcmVjdXJzaXZlLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3VsdGltYXRlLnJzCisvbGliL3JzLyouaW1sCisvbGliL3JzLyoqLyouaW1sCisvbGliL3N3aWZ0Ly5idWlsZAogL2xpYnRvb2wKIC9sdG1haW4uc2gKIC9taXNzaW5nCisvbm9kZV9tb2R1bGVzLworL3ZlbmRvci8KKy9jb21wb3Nlci5sb2NrCiAvc3RhbXAtaDEKLS90ZXN0L01ha2VmaWxlCi0vdGVzdC9NYWtlZmlsZS5pbgotL3Rlc3QvcHkvTWFrZWZpbGUKLS90ZXN0L3B5L01ha2VmaWxlLmluCi0vdGVzdC9weS9nZW4tcHkKLS90ZXN0L3JiL01ha2VmaWxlCi0vdGVzdC9yYi9NYWtlZmlsZS5pbgorL3Rlc3QvZmVhdHVyZXMvcmVzdWx0cy5qc29uCisvdGVzdC9yZXN1bHRzLmpzb24KKy90ZXN0L2NfZ2xpYi90ZXN0X2NsaWVudAorL3Rlc3QvY19nbGliL3Rlc3Rfc2VydmVyCisvdGVzdC9jbC9UZXN0U2VydmVyCisvdGVzdC9jbC9UZXN0Q2xpZW50CisvdGVzdC9jcHAvU3RyZXNzVGVzdAorL3Rlc3QvY3BwL1N0cmVzc1Rlc3ROb25CbG9ja2luZworL3Rlc3QvY3BwL1Rlc3RDbGllbnQKKy90ZXN0L2NwcC9UZXN0U2VydmVyCisvdGVzdC9jc2hhcnAvb2JqCisvdGVzdC9jc2hhcnAvYmluCisvdGVzdC9kYXJ0LyoqLy5wYWNrYWdlcworL3Rlc3QvZGFydC8qKi9wYWNrYWdlcworL3Rlc3QvZGFydC8qKi8ucHViLworL3Rlc3QvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90ZXN0L2xvZy8KKy90ZXN0L3Rlc3QubG9nCisvdGVzdC9lcmwvLmdlbmVyYXRlZAorL3Rlc3QvZXJsLy5yZWJhcgorL3Rlc3QvZXJsL2ViaW4KKy90ZXN0L2dvL2Jpbi8KKy90ZXN0L2dvL1RocmlmdFRlc3QudGhyaWZ0CisvdGVzdC9nby9nb3BhdGgKKy90ZXN0L2dvL3BrZy8KKy90ZXN0L2dvL3NyYy9jb2RlLmdvb2dsZS5jb20vCisvdGVzdC9nby9zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbworL3Rlc3QvZ28vc3JjL2dpdGh1Yi5jb20vZ29sYW5nLworL3Rlc3QvZ28vc3JjL2dvbGFuZy5vcmcvCisvdGVzdC9nby9zcmMvZ2VuLworL3Rlc3QvZ28vc3JjL3RocmlmdAorL3Rlc3QvaGF4ZS9iaW4KKy90ZXN0L2hzL1Rlc3RDbGllbnQKKy90ZXN0L2hzL1Rlc3RTZXJ2ZXIKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3B5LnR3aXN0ZWQvX3RyaWFsX3RlbXAvCisvdGVzdC9yYi9HZW1maWxlLmxvY2sKKy90ZXN0L25ldGNvcmUvKiovYmluCisvdGVzdC9uZXRjb3JlLyoqL29iagorL3Rlc3QvbmV0Y29yZS9UaHJpZnQKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3JzL0NhcmdvLmxvY2sKKy90ZXN0L3JzL3NyYy90aHJpZnRfdGVzdC5ycworL3Rlc3QvcnMvYmluLworL3Rlc3QvcnMvdGFyZ2V0LworL3Rlc3QvcnMvKi5pbWwKKy90ZXN0L3JzLyoqLyouaW1sCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLmxpc3AKKy90dXRvcmlhbC9jbC9leHRlcm5hbHMvCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLworL3R1dG9yaWFsL2NsL1R1dG9yaWFsQ2xpZW50CisvdHV0b3JpYWwvY2wvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvdHV0b3JpYWwvY2wvbGliLworL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAorL3R1dG9yaWFsL2NwcC9UdXRvcmlhbENsaWVudAorL3R1dG9yaWFsL2NwcC9UdXRvcmlhbFNlcnZlcgorL3R1dG9yaWFsL2NfZ2xpYi90dXRvcmlhbF9jbGllbnQKKy90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfc2VydmVyCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9vYmoKKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL2JpbgorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9iaW4KKy90dXRvcmlhbC9kL2FzeW5jX2NsaWVudAorL3R1dG9yaWFsL2QvY2xpZW50CisvdHV0b3JpYWwvZC9zZXJ2ZXIKKy90dXRvcmlhbC9kYXJ0LyoqLy5wYWNrYWdlcworL3R1dG9yaWFsL2RhcnQvKiovcGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqLy5wdWIvCisvdHV0b3JpYWwvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5kc2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLnR2c2NvbmZpZworL3R1dG9yaWFsL2RlbHBoaS8qKi9kY3UKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy90dXRvcmlhbC9nby9nb3BhdGgKKy90dXRvcmlhbC9nby9nby10dXRvcmlhbAorL3R1dG9yaWFsL2dvL2NhbGN1bGF0b3ItcmVtb3RlCisvdHV0b3JpYWwvZ28vc3JjL3NoYXJlZAorL3R1dG9yaWFsL2dvL3NyYy90dXRvcmlhbAorL3R1dG9yaWFsL2dvL3NyYy9naXQuYXBhY2hlLm9yZworL3R1dG9yaWFsL2dvL3NyYy9nb2xhbmcub3JnCisvdHV0b3JpYWwvaGF4ZS9iaW4KKy90dXRvcmlhbC9ocy9kaXN0LworL3R1dG9yaWFsL2phdmEvYnVpbGQvCisvdHV0b3JpYWwvanMvYnVpbGQvCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9iaW4KKy90dXRvcmlhbC9uZXRjb3JlLyoqL29iagorL3R1dG9yaWFsL25ldGNvcmUvVGhyaWZ0CisvdHV0b3JpYWwvcnMvKi5pbWwKKy90dXRvcmlhbC9ycy9zcmMvc2hhcmVkLnJzCisvdHV0b3JpYWwvcnMvc3JjL3R1dG9yaWFsLnJzCisvdHV0b3JpYWwvcnMvYmluCisvdHV0b3JpYWwvcnMvdGFyZ2V0CisvdHV0b3JpYWwvcnMvQ2FyZ28ubG9jawogL3lsd3JhcAorCmRpZmYgLS1naXQgYS8ucnVzdGZtdC50b21sIGIvLnJ1c3RmbXQudG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvLnJ1c3RmbXQudG9tbApAQCAtMCwwICsxLDY0IEBACittYXhfd2lkdGggPSAxMDAKK2hhcmRfdGFicyA9IGZhbHNlCit0YWJfc3BhY2VzID0gNAorbmV3bGluZV9zdHlsZSA9ICJBdXRvIgordXNlX3NtYWxsX2hldXJpc3RpY3MgPSAiRGVmYXVsdCIKK2luZGVudF9zdHlsZSA9ICJCbG9jayIKK3dyYXBfY29tbWVudHMgPSBmYWxzZQorZm9ybWF0X2RvY19jb21tZW50cyA9IGZhbHNlCitjb21tZW50X3dpZHRoID0gODAKK25vcm1hbGl6ZV9jb21tZW50cyA9IGZhbHNlCitub3JtYWxpemVfZG9jX2F0dHJpYnV0ZXMgPSBmYWxzZQorbGljZW5zZV90ZW1wbGF0ZV9wYXRoID0gIiIKK2Zvcm1hdF9zdHJpbmdzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19tYXRjaGVycyA9IGZhbHNlCitmb3JtYXRfbWFjcm9fYm9kaWVzID0gdHJ1ZQorZW1wdHlfaXRlbV9zaW5nbGVfbGluZSA9IHRydWUKK3N0cnVjdF9saXRfc2luZ2xlX2xpbmUgPSB0cnVlCitmbl9zaW5nbGVfbGluZSA9IGZhbHNlCit3aGVyZV9zaW5nbGVfbGluZSA9IGZhbHNlCitpbXBvcnRzX2luZGVudCA9ICJCbG9jayIKK2ltcG9ydHNfbGF5b3V0ID0gIk1peGVkIgorbWVyZ2VfaW1wb3J0cyA9IGZhbHNlCityZW9yZGVyX2ltcG9ydHMgPSB0cnVlCityZW9yZGVyX21vZHVsZXMgPSB0cnVlCityZW9yZGVyX2ltcGxfaXRlbXMgPSBmYWxzZQordHlwZV9wdW5jdHVhdGlvbl9kZW5zaXR5ID0gIldpZGUiCitzcGFjZV9iZWZvcmVfY29sb24gPSBmYWxzZQorc3BhY2VfYWZ0ZXJfY29sb24gPSB0cnVlCitzcGFjZXNfYXJvdW5kX3JhbmdlcyA9IGZhbHNlCitiaW5vcF9zZXBhcmF0b3IgPSAiRnJvbnQiCityZW1vdmVfbmVzdGVkX3BhcmVucyA9IHRydWUKK2NvbWJpbmVfY29udHJvbF9leHByID0gdHJ1ZQorb3ZlcmZsb3dfZGVsaW1pdGVkX2V4cHIgPSBmYWxzZQorc3RydWN0X2ZpZWxkX2FsaWduX3RocmVzaG9sZCA9IDAKK2VudW1fZGlzY3JpbV9hbGlnbl90aHJlc2hvbGQgPSAwCittYXRjaF9hcm1fYmxvY2tzID0gdHJ1ZQorZm9yY2VfbXVsdGlsaW5lX2Jsb2NrcyA9IGZhbHNlCitmbl9hcmdzX2RlbnNpdHkgPSAiVGFsbCIKK2JyYWNlX3N0eWxlID0gIlNhbWVMaW5lV2hlcmUiCitjb250cm9sX2JyYWNlX3N0eWxlID0gIkFsd2F5c1NhbWVMaW5lIgordHJhaWxpbmdfc2VtaWNvbG9uID0gdHJ1ZQordHJhaWxpbmdfY29tbWEgPSAiVmVydGljYWwiCittYXRjaF9ibG9ja190cmFpbGluZ19jb21tYSA9IGZhbHNlCitibGFua19saW5lc191cHBlcl9ib3VuZCA9IDEKK2JsYW5rX2xpbmVzX2xvd2VyX2JvdW5kID0gMAorZWRpdGlvbiA9ICIyMDE1IgorbWVyZ2VfZGVyaXZlcyA9IHRydWUKK3VzZV90cnlfc2hvcnRoYW5kID0gZmFsc2UKK3VzZV9maWVsZF9pbml0X3Nob3J0aGFuZCA9IGZhbHNlCitmb3JjZV9leHBsaWNpdF9hYmkgPSB0cnVlCitjb25kZW5zZV93aWxkY2FyZF9zdWZmaXhlcyA9IGZhbHNlCitjb2xvciA9ICJBdXRvIgorcmVxdWlyZWRfdmVyc2lvbiA9ICIxLjAuMCIKK3Vuc3RhYmxlX2ZlYXR1cmVzID0gZmFsc2UKK2Rpc2FibGVfYWxsX2Zvcm1hdHRpbmcgPSBmYWxzZQorc2tpcF9jaGlsZHJlbiA9IGZhbHNlCitoaWRlX3BhcnNlX2Vycm9ycyA9IGZhbHNlCitlcnJvcl9vbl9saW5lX292ZXJmbG93ID0gZmFsc2UKK2Vycm9yX29uX3VuZm9ybWF0dGVkID0gZmFsc2UKK3JlcG9ydF90b2RvID0gIk5ldmVyIgorcmVwb3J0X2ZpeG1lID0gIk5ldmVyIgoraWdub3JlID0gW10KK2VtaXRfbW9kZSA9ICJGaWxlcyIKK21ha2VfYmFja3VwID0gZmFsc2UKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YjVkNQotLS0gL2Rldi9udWxsCisrKyBiLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMTczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBidWlsZCBBcGFjaGUgVGhyaWZ0IG9uIFRyYXZpcyBDSSAtIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy8KKworIworIyBEb2NrZXIgSW50ZWdyYXRpb24KKyMgc2VlOiBidWlsZC9kb2NrZXIvUkVBRE1FLm1kCisjIAorCitzdWRvOiByZXF1aXJlZAorZGlzdDogdHJ1c3R5CitsYW5ndWFnZTogY3BwCisKK3NlcnZpY2VzOgorICAtIGRvY2tlcgorCitpbnN0YWxsOgorICAtIGlmIFtbIGB1bmFtZWAgPT0gIkxpbnV4IiBdXTsgdGhlbiBidWlsZC9kb2NrZXIvcmVmcmVzaC5zaDsgZmkKKworc3RhZ2VzOgorICAtIGRvY2tlciAgICAjIGRvY2tlciBpbWFnZXMKKyAgLSB0aHJpZnQgICAgIyB0aHJpZnQgYnVpbGQgam9icworCitlbnY6CisgIGdsb2JhbDoKKyAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgLSBCVUlMRF9BUkc9IiIKKyAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysgLWUgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT00IgorICAgIC0gRElTVFJPPXVidW50dS1iaW9uaWMKKyAgICAtIEJVSUxEX0xJQlM9IkNQUCBDX0dMSUIgSEFTS0VMTCBKQVZBIFBZVEhPTiBURVNUSU5HIFRVVE9SSUFMUyIgICMgb25seSBtZWFuaW5nZnVsIGZvciBDTWFrZSBidWlsZHMKKyAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT10ZXN0CisgICAgIyBET0NLRVJfUkVQTyAodGhpcyB3b3JrcyBmb3IgYWxsIGJ1aWxkcyBhcyBhIHNvdXJjZSBmb3IgZG9ja2VyIGltYWdlcyAtIHlvdSBjYW4gb3ZlcnJpZGUgZm9yIGZvcmsgYnVpbGRzIGluIHlvdXIgVHJhdmlzIHNldHRpbmdzKQorICAgIC0gRE9DS0VSX1JFUE89InRocmlmdC90aHJpZnQtYnVpbGQiCisgICAgIyBET0NLRVJfVVNFUiAocHJvdmlkZSBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncyBpZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgdXBkYXRlIGRvY2tlciBpbWFnZXMgb25jZSwgaW5zdGVhZCBvZiBvbiBldmVyeSBqb2IpCisgICAgIyBET0NLRVJfUEFTUyAoc2FtZSkKKworam9iczoKKyAgaW5jbHVkZToKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IGRvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLSBzdGFnZTogZG9ja2VyCisgICAgICBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUteGVuaWFsIDE2LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKyAgICAtIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS1iaW9uaWMgMTguMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiB0aHJpZnQgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNyb3NzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYXBhY2hlL3RocmlmdCBvZmZpY2lhbCBQUiBidWlsZHMgY2FuIGV4Y2VlZCA1MCBtaW51dGVzIHBlciBqb2Igc28gY29tYmluZSBhbGwgY3Jvc3MgdGVzdHMKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisKKyAgICAjIGZvcmsgYmFzZWQgUFIgYnVpbGRzIGNhbm5vdCBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChCaW5hcnkgUHJvdG9jb2wpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGJpbmFyeSknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChIZWFkZXIsIEpTT04gUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhoZWFkZXJ8anNvbiknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChDb21wYWN0IGFuZCBNdWx0aXBsZXhlZCBQcm90b2NvbHMpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGNvbXBhY3R8bXVsdGlwbGV4ZWQpJyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogc2NhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBRQSBqb2JzIGZvciBjb2RlIGFuYWx5dGljcyBhbmQgbWV0cmljcworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJTdGF0aWMgQ29kZSBBbmFseXNpcyIKKyAgICAgICAgLSBTQ1JJUFQ9InNjYS5zaCIKKworICAgICMgQyBhbmQgQysrIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAjIEEgYmluYXJ5IGNyYXNoZXMgaWYgdW5kZWZpbmVkIGJlaGF2aW9yIG9jY3VycyBhbmQgcHJvZHVjZXMgYSBzdGFjayB0cmFjZS4KKyAgICAjIHB5dGhvbiBpcyBkaXNhYmxlZCwgc2VlOiBUSFJJRlQtNDM2MAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJVQlNhbiIKKyAgICAgICAgLSBTQ1JJUFQ9InVic2FuLnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcHkzIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBhdXRvdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRPRE86IFJlbW92ZSB0aGVtIG9uY2UgbWlncmF0ZWQgdG8gQ01ha2UKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgQmlvbmljKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImF1dG90b29scy5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJBdXRvdG9vbHMgKFVidW50dSBYZW5pYWwpIgorICAgICAgICAtIERJU1RSTz11YnVudHUteGVuaWFsCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNtYWtlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDTWFrZSIKKworICAgICMgQysrIHNwZWNpZmljIG9wdGlvbnM6IGNvbXBpbGVyIHBsdWctaW4sIHRocmVhZGluZyBtb2RlbAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDKysgKFN0ZCBUaHJlYWQpIGFuZCBQbHVnaW4iCisgICAgICAgIC0gU0NSSVBUPSJjbWFrZS5zaCIKKyAgICAgICAgLSBCVUlMRF9MSUJTPSJDUFAgVEVTVElORyBUVVRPUklBTFMiCisgICAgICAgIC0gQlVJTERfQVJHPSItRFdJVEhfUExVR0lOPU9OIC1EV0lUSF9TVERUSFJFQURTPU9OIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCisgICAgICAgIC0gQlVJTERfRU5WPSItZSBDQz1jbGFuZyAtZSBDWFg9Y2xhbmcrKyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogZGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9Im1ha2UgZGlzdCIKKyAgICAgICAgLSBTQ1JJUFQ9Im1ha2UtZGlzdC5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEZWJpYW4gUGFja2FnZXMiCisgICAgICAgIC0gU0NSSVBUPSJkcGtnLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjb3Zlcml0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFdlIGJ1aWxkIHRoZSBjb3Zlcml0eSBzY2FuIGJ1aWxkIG9uY2UgbW9udGhseSB1c2luZyBhIHRyYXZpcyBjcm9uIGpvYgorICAgIC0gaWY6IChlbnYoQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwpIElTIHByZXNlbnQpIEFORCAoYnJhbmNoIElOIChtYXN0ZXIpKSBBTkQgKHR5cGUgSU4gKGNyb24pKQorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDb3Zlcml0eSBTY2FuIgorICAgICAgICAtIFNDUklQVD0iY292c2Nhbi5zaCIKKyAgICAgCisKKyAgIyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IG9zeCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjIGRpc2FibGVkIGR1ZSB0byB0aGUgdGltZSBkZWxheXMgaXQgaW1wb3NlcyBvbiBidWlsZCBqb2JzCisgICMgLSBvczogb3N4CisgICMgICBvc3hfaW1hZ2U6IHhjb2RlOQorICAjICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKwpkaWZmIC0tZ2l0IGEvQXBhY2hlVGhyaWZ0Lm51c3BlYyBiL0FwYWNoZVRocmlmdC5udXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL0FwYWNoZVRocmlmdC5udXNwZWMKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgYSBudWdldCBwYWNrYWdlOgorCisgIDEuIE9wZW4gVGhyaWZ0LnNsbiBpbiBsaWJcY3NoYXJwXHNyYyBhbmQgYnVpbGQgdGhlIHJlbGVhc2UgdmVyc2lvbgorICAgICBvZiB0aGUgIlRocmlmdCIgYW5kICJUaHJpZnQuNDUiIHByb2plY3RzLgorICAyLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXG5ldGNvcmUgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24gb2YKKyAgICAgdGhlICJUaHJpZnQiIHByb2plY3QuCisgIDMuIG51Z2V0IHNldEFwaUtleSA8eW91ci1hcGkta2V5PgorICAzLiBudWdldCBwYWNrIEFwYWNoZVRocmlmdC5udXNwZWMgLVN5bWJvbHMgLVN5bWJvbFBhY2thZ2VGb3JtYXQgc251cGtnCisgIDQuIG51Z2V0IHB1c2ggQXBhY2hlVGhyaWZ0LjEuMC4wLm51cGtnIC1Tb3VyY2UgaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24KKyAgLS0+CisKKzxwYWNrYWdlIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3BhY2thZ2luZy8yMDEzLzA1L251c3BlYy54c2QiPgorICA8bWV0YWRhdGE+CisgICAgPGlkPkFwYWNoZVRocmlmdDwvaWQ+CisgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgPHRpdGxlPkFwYWNoZSBUaHJpZnQgMS4wLjA8L3RpdGxlPgorICAgIDxhdXRob3JzPkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVyczwvYXV0aG9ycz4KKyAgICA8b3duZXJzPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vd25lcnM+CisgICAgPGxpY2Vuc2UgdHlwZT0iZXhwcmVzc2lvbiI+QXBhY2hlLTIuMDwvbGljZW5zZT4KKyAgICA8cHJvamVjdFVybD5odHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvPC9wcm9qZWN0VXJsPgorICAgIDxyZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+dHJ1ZTwvcmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPgorICAgIDxzdW1tYXJ5PkFwYWNoZSBUaHJpZnQgLk5FVCBMaWJyYXJ5PC9zdW1tYXJ5PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIENvbnRhaW5zIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gbGliL2NzaGFycCBmb3IgbmV0MzUgYW5kIG5ldDQ1IGZyYW1ld29ya3MsIAorICAgICAgYW5kIGZyb20gbGliL25ldGNvcmUgZm9yIG5ldHN0YW5kYXJkMi4wIGZyYW1ld29yayBkZXZlbG9wbWVudC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyZXBvc2l0b3J5IHR5cGU9IkdpdEh1YiIgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIgYnJhbmNoPSJyZWxlYXNlLzEuMC4wIiAvPgorICAgIDx0YWdzPkFwYWNoZSBUaHJpZnQgUlBDPC90YWdzPgorICA8L21ldGFkYXRhPgorICA8ZmlsZXM+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuKiIgdGFyZ2V0PSJsaWJcbmV0MzUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQ0NS4qIiB0YXJnZXQ9ImxpYlxuZXQ0NSIgLz4KKyAgICA8ZmlsZSBzcmM9ImxpYlxuZXRjb3JlXFRocmlmdFxiaW5cUmVsZWFzZVxuZXRzdGFuZGFyZDIuMFwqLioiIHRhcmdldD0ibGliXG5ldHN0YW5kYXJkMi4wIiAvPgorICA8L2ZpbGVzPgorPC9wYWNrYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmluZGV4IGFhMjJmMmYuLjI0NGYwZGEgMTAwNjQ0Ci0tLSBhL0NIQU5HRVMKKysrIGIvQ0hBTkdFUwpAQCAtMSw4NyArMSwyNzUyIEBACi1UaHJpZnQgQ2hhbmdlbG9nCitBcGFjaGUgVGhyaWZ0IENoYW5nZWxvZwogCi1WZXJzaW9uIDAuNi4xCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhyaWZ0IDAuMTIuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIE5ldyBMYW5ndWFnZXMKKyAgICAqIENvbW1vbiBMSVNQIChjbCkKKyAgICAqIFN3aWZ0CisgICAgKiBUeXBlc2NyaXB0IChub2RldHMpCiAKLVRIUklGVC0xMDc0ICAgQnVpbGQgICAgICAgICAgICAgICAgLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24gKEpha2UgRmFycmVsbCkKLVRIUklGVC0xMTMxICAgQyMgICAgICAgICAgICAgICAgICAgQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcgKE1hY2llayBXZWtzZWopCi1USFJJRlQtMzYzICAgIEphdmEgICAgICAgICAgICAgICAgIE1hdmVuIERlcGxveSAoSmFrZSBGYXJyZWxsKQotVEhSSUZULTExMDkgICBKYXZhICAgICAgICAgICAgICAgICBEZXBsb3kgZmIzMDMgYWxvbmcgc2lkZSBsaWJ0aHJpZnQgdG8gbWF2ZW4gcmVwbyAoSmFrZSBGYXJyZWxsKQotVEhJUkZULTExMzMgICBKYXZhU2NyaXB0ICAgICAgICAgICBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudCAoUm9nZXIgTWVpZXIsIEpha2UgRmFycmVsbCkKKyMjIERlcHJlY2F0ZWQgTGFuZ3VhZ2VzCisgICAgKiBDb2NvYQorCisjIyBCcmVha2luZyBDaGFuZ2VzIChzaW5jZSAwLjExLjApCisgICAgKiBbVEhSSUZULTQ1MjldIC0gUnVzdCBlbnVtIHZhcmlhbnRzIGFyZSBub3cgY2FtZWwtY2FzZWQgaW5zdGVhZCBvZiB1cHBlcmNhc2VkIHRvIGNvbmZvcm0gdG8gUnVzdCBuYW1pbmcgY29udmVudGlvbnMKKyAgICAqIFtUSFJJRlQtNDQ0OF0gLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCisgICAgKiBbVEhSSUZULTQ0NzRdIC0gUEhQIG5vdyB1c2VzIHRoZSBQU1ItNCBsb2FkZXIgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGNsYXNzIG1hcHMuCisgICAgKiBbVEhSSUZULTQ1MzJdIC0gbWV0aG9kIHNpZ25hdHVyZXMgY2hhbmdlZCBpbiB0aGUgY29tcGlsZXIncyB0X29vcF9nZW5lcmF0b3IuCisgICAgKiBbVEhSSUZULTQ2NDhdIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKworIyMgS25vd24gSXNzdWVzIChCbG9ja2VyIG9yIENyaXRpY2FsKQorICAgICogW1RIUklGVC00MDM3XSAtIGJ1aWxkOiB1c2UgYSBzaW5nbGUgYnVpbGQgc3lzdGVtIGZvciB0aHJpZnQKKyAgICAqIFtUSFJJRlQtNDExOV0gLSBidWlsZDogYm9vdHN0cmFwLnNoIGlzIG1pc3NpbmcgZnJvbSBzb3VyY2UgdGFyYmFsbAorICAgICogW1RIUklGVC0zMjg5XSAtIGNzaGFycDogc29ja2V0IGV4aGF1c3Rpb24gaW4gY3NoYXJwIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMwMjldIC0gY29jb2E6IEdldHRlcnMgZm9yIGZpZWxkcyBkZWZpbmVkIHdpdGggdXBwZXJjYXNlIG5hbWVzIGRvIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTMzMjVdIC0gY29jb2E6IEV4dGVuZGVkIHNlcnZpY2VzIGFyZW4ndCBzdWJjbGFzc2VzIGluIGdlbmVyYXRlZCBDb2NvYQorICAgICogW1RIUklGVC00MTE2XSAtIGNvY29hOiBUaHJpZnQgZGUtY2FwaXRhbGl6ZXMgdGhlIG5hbWUgb2YgSXNTZXQgcHJvcGVydHkgaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMzg3N10gLSBjcHA6IHRoZSBodHRwIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzdGFuZGFyZDsgaW50ZXJvcCB3aXRoIG90aGVyIGxhbmd1YWdlcyBpcyBzcG90dHkgYXQgYmVzdAorICAgICogW1RIUklGVC00MTgwXSAtIGNwcDogSW1wb3NzaWJsZSB0byBidWlsZCBUaHJpZnQgQysrIGxpYnJhcnkgZm9yIEFuZHJvaWQgKE5ESykKKyAgICAqIFtUSFJJRlQtNDM4NF0gLSBjcHA6IFVzaW5nIG11bHRpcGxlIGFzeW5jIHNlcnZpY2VzIHNpbXVsdGFuZW91c2x5IGlzIG5vdCB0aHJlYWQtc2FmZQorICAgICogW1RIUklGVC0zMTA4XSAtIGhhc2tlbGw6IERlZmF1bHRlZCBzdHJ1Y3QgcGFyYW1ldGVycyBvbiBhIHNlcnZpY2UgZ2VuZXJhdGVzIGludmFsaWQgSGFza2VsbAorICAgICogW1RIUklGVC0zOTkwXSAtIG5vZGVqczogRXhjZXB0aW9uIHN3YWxsb3dlZCBieSBkZXNlcmlhbGl6YXRpb24gZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDIxNF0gLSBub2RlanM6IG1hcDxpNjQsdmFsdWU+IGtleSB0cmVhdGVkIGFzIGhleCB2YWx1ZSBpbiBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTQ2MDJdIC0gbm9kZWpzOiBFUlJPUiBpbiAuL25vZGVfbW9kdWxlcy90aHJpZnQvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMgTW9kdWxlIG5vdCBmb3VuZDogRXJyb3I6IENhbid0IHJlc29sdmUgJ2NoaWxkX3Byb2Nlc3MnCisgICAgKiBbVEhSSUZULTQ2MzldIC0gbm9kZWpzOiBTZXF1ZW5jZSBudW1iZXJpbmcgZm9yIG11bHRpcGxleGVkIHByb3RvY29sIGJyb2tlbgorICAgICogW1RIUklGVC0xMzEwXSAtIHBocDogc2VxdWVuY2UgYW5kIHJlY29ubmVjdGlvbiBtYW5hZ2VtZW50IGlzc3VlcworICAgICogW1RIUklGVC0xNTM4XSAtIHBocDogRXJyb3IgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiBpbnQ2NCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlCisgICAgKiBbVEhSSUZULTE1ODBdIC0gcGhwOiB0aHJpZnQgdHlwZSBpNjQgamF2YSB0byBwaHAgc2VyaWFsaXplL2Rlc2VyZWFsaXplIG5vdCB3b3JraW5nCisgICAgKiBbVEhSSUZULTE5NTBdIC0gcGhwOiBQSFAgZ2V0cyBzdHVjayBpbiBpbmZpbml0ZSBsb29wCisgICAgKiBbVEhSSUZULTI5NTRdIC0gcHl0aG9uOiBzZW5kaW5nIGludCBvciBmbG9hdCBpbiBhIGRvdWJsZSBmaWVsZCBicmVha3MgdGhlIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtNDA4MF0gLSBweXRob246IHVuaXggc29ja2V0cyBjYW4gZ2V0IHN0dWNrIGZvcmV2ZXIKKyAgICAqIFtUSFJJRlQtNDI4MV0gLSBweXRob246IGdlbmVyYXRlZCBjb2RlIGlzIG91dCBvZiBvcmRlciBhbmQgY2F1c2VzIGxvYWQgaXNzdWVzCisgICAgKiBbVEhSSUZULTQ2NzddIC0gcHkzOiBVbmljb2RlRGVjaWRlRXJyb3IgaW4gUHl0aG9uMworCisjIyBCdWlsZCBQcm9jZXNzCisgICAgKiBbVEhSSUZULTQwNjddIC0gV2luZG93cyB0aHJpZnQgY29tcGlsZXIgZGlzdHJpYnV0ZWQgb24gdGhlIGFwYWNoZSB3ZWIgc2l0ZSBoYXMgcnVudGltZSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtNDMwOF0gLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisgICAgKiBbVEhSSUZULTQ1NzldIC0gVXNlIFVidW50dSBCaW9uaWMgKDE4LjA0IExUUykgZm9yIENJIGJ1aWxkcyBpbnN0ZWFkIG9mIEFydGZ1bCAoMTcuMTApCisgICAgKiBbVEhSSUZULTQ1MDhdIC0gRGVmaW5lIENJIG9wZXJhdGluZyBzeXN0ZW0gY292ZXJhZ2UgcnVsZXMgZm9yIHRoZSBwcm9qZWN0IGFuZCAoaG9wZWZ1bGx5KSBzaW1wbGlmeSBDSSBhIGxpdHRsZSBtb3JlCisgICAgKiBbVEhSSUZULTQzOTddIC0gdWJ1bnR1IGluc3RhbGwgaW5zdHJ1Y3Rpb25zIGJyb2tlbiBvbiAxNi4wNAorICAgICogW1RIUklGVC00NTQ1XSAtIEFwcHZleW9yIGJ1aWxkcyBhcmUgZmFpbGluZyBkdWUgdG8gYSBoYXNrZWxsIC8gY2FiYWwgdXBkYXRlIGluIGNob2NvbGF0ZXkKKyAgICAqIFtUSFJJRlQtNDQ1Ml0gLSBvcHRpbWl6ZSBEb2NrZXJmaWxlIChvbmx5IG9uZXRpbWUgYXB0LWdldCB1cGRhdGUpCisgICAgKiBbVEhSSUZULTQ0NDBdIC0gcm0gYGJ1aWxkL2RvY2tlci91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUub3JpZ2AKKyAgICAqIFtUSFJJRlQtNDM1Ml0gLSBVYnVudHUgQXJ0ZnVsIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBUaHJpZnQgYW5kIEhheGUgMy40LjIKKyAgICAqIFtUSFJJRlQtNDY2Nl0gLSBETGFuZyBDbGllbnQgUG9vbCBUZXN0IGZhaWxzIHNwb3JhZGljYWxseQorICAgICogW1RIUklGVC00Njc2XSAtIENMIHR1dG9yaWFsIGJ1aWxkIGZhaWxzIHNwb3JhZGljYWxseQorICAgICogW1RIUklGVC00NDU2XSAtIE1ha2UgaGF4ZWxpYiBkb3dubG9hZCBxdWlldCBzbyBpdCBkb2Vzbid0IGJsb3cgdXAgdGhlIGJ1aWxkIGxvZworICAgICogW1RIUklGVC00NjA1XSAtIGJvb3RzdHJhcC5zaCBmYWlscyBpZiBhdXRvbWFrZT0xLjE2LjEKKworIyMgY19nbGliCisgICAgKiBbVEhSSUZULTQ2NDhdIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKyAgICAqIFtUSFJJRlQtNDYyMl0gLSBnbGliQyBjb21waWxhdGlvbiBpc3N1ZQorICAgICogW1RIUklGVC00NjcxXSAtIGMgZ2xpYiBpcyB1bmFibGUgdG8gaGFuZGxlIGNsaWVudCBjbG9zZSB1bmV4cGVjdGVkbHkKKworIyMgY2wgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtODJdIC0gQ29tbW9uIExpc3Agc3VwcG9ydAorCisjIyBjc2hhcnAKKyAgICAqIFtUSFJJRlQtNDU1OF0gLSByZXNlcnZlZCBDc2hhcnAga2V5d29yZHMgYXJlIG5vdCBlc2NhcGVkIGluIHNvbWUgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDYzN10gLSBDIyBhc3luYyBtb2RlIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSB3aXRoIGluaGVyaXRlZCBzZXJ2aWNlcworICAgICogW1RIUklGVC00NjcyXSAtIElBc3luY1Jlc3VsdCBzdHlsZSBtZXRob2RzIG5vdCBiZWluZyBzdXBwb3J0ZWQgYnkgY2VydGFpbiB0cmFuc3BvcnRzIGxlYWRzIHRvIGlzc3VlcyBpbiBtaXhlZCBJU3luYy9JQXN5bmMgdXNlIGNhc2VzCisgICAgKiBbVEhSSUZULTQ1MzldIC0gQWxsb3cgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRvIGJlIHVzZWQgYXMgYmFzZSBjbGFzcworICAgICogW1RIUklGVC00NTM1XSAtIFhNTCBkb2NzOyBjb2RlIGNsZWFudXAgKHRhYnMtPnNwYWNlczsgU3RyaW5nLT5zdHJpbmcpCisgICAgKiBbVEhSSUZULTQ0OTJdIC0gcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZSBtZW1iZXIgb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNhbm5vdCBiZSBhY2Nlc3NlZAorICAgICogW1RIUklGVC00NDQ2XSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworICAgICogW1RIUklGVC00NDU1XSAtIE1pc3NpbmcgZGlzcG9zZSBjYWxscyBpbiBUaHJlYWRlZFNlcnZlciAmIFRocmVhZHBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDYwOV0gLSBrZWVwIElubmVyRXhjZXB0aW9uIHdoZXJldmVyIGFwcHJvcHJpYXRlCisgICAgKiBbVEhSSUZULTQ2NzNdIC0gSUFzeW5jUmVzdWx0IG5vdCBzdXBwb3J0ZWQgYnkgbGF5ZXJlZCB0cmFuc3BvcnRzIChidWZmZXJlZC9mcmFtZWQpCisKKyMjIGNwcAorICAgICogW1RIUklGVC00NDc2XSAtIFR5cGVjYXN0aW5nIHByb2JsZW0gb24gbGlzdCBpdGVtcworICAgICogW1RIUklGVC00NDY1XSAtIFROb25ibG9ja2luZ1NlcnZlciB0aHJvd2luZyBUSFJJRlQgTE9HR0VSOiBUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiBUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpCisgICAgKiBbVEhSSUZULTQ2ODBdIC0gVEJ1ZmZlclRyYW5zcG9ydHMuaCBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFZpc3VhbCBTdHVkaW8gMjAxNworICAgICogW1RIUklGVC00NjE4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjcmFzaCBiZWNhdXNlIG9mIGxpbWl0YXRpb24gb2Ygc2VsZWN0KCkKKyAgICAqIFtUSFJJRlQtNDYyMF0gLSBUWmxpYlRyYW5zcG9ydC5jcHAgZG9lc24ndCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSB6bGliIGZsdXNoIG1hcmtlciBpbiB0aGUgYnVmZmVyLgorICAgICogW1RIUklGVC00NTcxXSAtIFplcm9NUSBjb250cmliIGxpYnJhcnkgbmVlZHMgYSByZWZyZXNoCisgICAgKiBbVEhSSUZULTQ1NTldIC0gVFNTTFNlcnZlclNvY2tldCBpbmNvcnJlY3RseSBwcmludHMgZXJyb3JzCisgICAgKiBbVEhSSUZULTQ1NzhdIC0gTW92ZSBgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3JgIGludG8gbWFpbiB0aHJpZnQgbGlicmFyeQorICAgICogW1RIUklGVC00NDE4XSAtIGV2aHR0cF9jb25uZWN0aW9uX25ldyBpcyBkZXByZWNhdGVkOyB1c2UgZXZodHRwX2Nvbm5lY3Rpb25fYmFzZV9uZXcKKworIyMgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDY0NF0gLSBDb21waWxlciBjYW5ub3QgYmUgY29tcGlsZWQgb24gbWFjT1MobWF5YmUgYWxzbyBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjbGFuZykKKyAgICAqIFtUSFJJRlQtNDUzMV0gLSBUaHJpZnQgZ2VuZXJhdGVzIHdyb25nIFB5dGhvbiBjb2RlIGZvciBpbW11dGFibGUgc3RydWN0dXJlcyB3aXRoIG9wdGlvbmFsIG1lbWJlcnMKKyAgICAqIFtUSFJJRlQtNDUxM10gLSB0aHJpZnQgZ2VuZXJhdGVkIGNvZGUgaXMgbm90IHN0YWJsZSBmb3IgY29uc3RhbnRzCisgICAgKiBbVEhSSUZULTQ1MzJdIC0gQXZvaWQgdXBkYXRpbmcgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIGlmIHRoZSBvdXRwdXQgaGFzIG5vdCBjaGFuZ2VkCisgICAgKiBbVEhSSUZULTQ0MDBdIC0gVmlzdWFsIFN0dWRpbyBDb21waWxlciBwcm9qZWN0IHNob3VsZCBsaW5rIHJ1bnRpbWUgc3RhdGljYWxseSBpbiByZWxlYXNlIGJ1aWxkcworICAgICogW1RIUklGVC00Mzk5XSAtIHBsdWdpbi50aHJpZnQgdF9jb25zdF92YWx1ZSBpcyBub3QgdXNlZCBhcyBhIHVuaW9uIGluIEMrKyBjb2RlIC0tIGZpeCB0aGlzCisgICAgKiBbVEhSSUZULTQ0OTZdIC0gRGVhbGluZyB3aXRoIGxhbmd1YWdlIGtleXdvcmRzIGluIFRocmlmdCAoZS5nLiBzZXJ2aWNlIG1ldGhvZCBuYW1lcykKKyAgICAqIFtUSFJJRlQtNDM5M10gLSByZXBlYXRlZCBydW5zIG9mIGNvbXBpbGVyIHByb2R1Y2UgZGlmZmVyZW50IGJpbmFyeSBvdXRwdXQgYXQgcGx1Z2luIGludGVyZmFjZQorCisjIyBkbGFuZworICAgICogW1RIUklGVC00NDc4XSAtIFRocmlmdCB3aWxsIG5vdCBidWlsZCB3aXRoIGRsYW5nIDIuMDc4IG9yIGxhdGVyCisgICAgKiBbVEhSSUZULTQ1MDNdIC0gZGxhbmcgc2VydmVycyBsb2dFcnJvciBvbiBub3JtYWwgY2xpZW50IGRpc2Nvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtNDMwOF0gLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisKKyMjIGRhcnQKKyAgICAqIFtUSFJJRlQtNDY0Nl0gLSBFZmZlY3RpdmUgRGFydCBhbmQgRXhjZXB0aW9ucworICAgICogW1RIUklGVC00NDM5XSAtIFNob3VsZG4ndCBkb3dubG9hZCBkYXJ0LmRlYiBkaXJlY3RseS4KKworIyMgZGVscGhpCisgICAgKiBbVEhSSUZULTQ1NjJdIC0gQ2FsbGluZyB3cm9uZyBleGNlcHRpb24gQ1RPUiBsZWFkcyB0byAiY2FsbCBmYWlsZWQ6IHVua25vd24gcmVzdWx0IiBpbnN0ZWFkIG9mIHRoZSByZWFsIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24KKyAgICAqIFtUSFJJRlQtNDU1NF0gLSB1bmNvbXBpbGVhYmxlIGNvZGUgd2l0aCBtZW1iZXIgbmFtZXMgdGhhdCBhcmUgYWxzbyB0eXBlcyB1bmRlciBzcGVjaWZpYyBjb25kaXRpb25zCisgICAgKiBbVEhSSUZULTQ0MjJdIC0gQWRkIEFzeW5jIGltcGxlbWVudGF0aW9uIHZpYSBJRnV0dXJlCisgICAgKiBbVEhSSUZULTQ0ODVdIC0gUG9zc2libGUgaW52YWxpZCBwdHIgQVYgd2l0aCBvdmVybGFwcGVkIHJlYWQvd3JpdGUgb24gcGlwZXMKKyAgICAqIFtUSFJJRlQtNDU0OV0gLSBUaHJpZnQgZXhjZXB0aW9ucyBzaG91bGQgZGVyaXZlIGZyb20gVEV4Y2VwdGlvbgorICAgICogW1RIUklGVC00NTQwXSAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBicm9rZW4gd2hlbiB0cnlpbmcgdG8gcmUtb3BlbiBhIGZvcm1lcmx5IGNsb3NlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDQ3M10gLSBNb3ZlIFRocmlmdC5Db25zb2xlLnBhcyBvdXQgb2YgdGhlIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQ5MF0gLSBBbGxvdyBhIGRlZmF1bHQgc2VydmljZSBhcyBmYWxsYmFjayBmb3IgbXVsdGlwbGV4IHByb2Nlc3NvcnMgY29ubmVjdGVkIGJ5IG9sZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTQ0NTRdIC0gTGFyZ2Ugd3JpdGVzL3JlYWRzIG1heSBjYXVzZSByYW5nZSBjaGVjayBlcnJvcnMgaW4gZGVidWcgbW9kZQorICAgICogW1RIUklGVC00NDYxXSAtIENvbXBpbGVyIGRpcmVjdGl2ZSBzaG91bGQgbWF0Y2ggRGVscGhpIFhFNAorICAgICogW1RIUklGVC00NDYyXSAtIEZpcnN0IGxpbmUgaW4gQ29uc29sZSBkdXBsaWNhdGVkCisgICAgKiBbVEhSSUZULTQ2NDJdIC0gRlBVIGN0cmwgd29yZCBzZXR0aW5ncyBtYXkgY2F1c2UgYW4gdW5leHBlY3RlZCAiZGVub3JtYWxpemVkIiBlcnJvcgorICAgICogW1RIUklGVC00NTg5XSAtIEhUVFAgY2xpZW50IHRpbWVvdXRzIGFyZSBhKSBpbmNvbXBsZXRlIGFuZCBiKSBub3QgdXNlZCBhdCBhbGwKKyAgICAqIFtUSFJJRlQtNDU5MF0gLSBydW5uaW5nIHRoZSB0ZXN0IGNsaWVudCB1c2luZyBIVFRQIHRyYW5zcG9ydCBsZWFkcyB0byAiQ29Jbml0aWFsaXplIG5vdCBjYWxsZWQiCisKKyMjIGVybGFuZworICAgICogW1RIUklGVC00NDk3XSAtIEVybGFuZyByZWNvcmRzIHNob3VsZCB1c2UgbWFwKCkgZm9yIG1hcCB0eXBlCisgICAgKiBbVEhSSUZULTQ0OTVdIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIGFsbG93ICd1bmRlZmluZWQnIGZvciBub24tcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTQ1ODBdIC0gRml4IGVybGFuZyB0dXRvcmlhbCB1bnBhY2sgb24gV2luZG93cworICAgICogW1RIUklGVC00NTgyXSAtIFVidW50dSBYZW5pYWwgZXJsYW5nIDE4LjMgIm1ha2UgY2hlY2siIGZhaWxzCisKKyMjIGdvbGFuZworICAgICogW1RIUklGVC00NDQ4XSAtIFN1cHBvcnQgZm9yIGdvbGFuZyAxLjYgYW5kIGVhcmxpZXIgaGFzIGJlZW4gZHJvcHBlZC4KKyAgICAqIFtUSFJJRlQtNDI1M10gLSBHbyBnZW5lcmF0b3IgYXNzaWducyBzdHJpbmdzIHRvIGZpZWxkIGluIGNvbnN0IGluc3RlYWQgb2YgcG9pbnRlcnMuCisgICAgKiBbVEhSSUZULTQ1NzNdIC0gVW5pb25zIEZpZWxkIENvdW50IERvZXMgTm90IENvbnNpZGVyIEJpbmFyeQorICAgICogW1RIUklGVC00NDQ3XSAtIEdvbGFuZzogUGFuaWMgb24gcC5jLkNhbGwgd2hlbiB1c2luZyBkZXByZWNhdGVkIGluaXRpYWxpemVycworICAgICogW1RIUklGVC00NjUwXSAtIFJlcXVpcmVkIGZpZWxkIGluY29ycmVjdGx5IG1hcmtlZCBhcyBzZXQgd2hlbiBmaWVsZFR5cGUgZG9lcyBub3QgbWF0Y2gKKyAgICAqIFtUSFJJRlQtNDQ4Nl0gLSBHb2xhbmc6IC1yZW1vdGUuZ28gY2xpZW50IGNsZWFudXAKKyAgICAqIFtUSFJJRlQtNDUzN10gLSBUU2ltcGxlU2VydmVyIGNhbiBleGl0IEFjY2VwdCBsb29wIHdpdGggbG9jayBzdGlsbCBhY3F1aXJlZAorICAgICogW1RIUklGVC00NTE2XSAtIEFkZCBzdXBwb3J0IGZvciBnbyAxLjEwCisgICAgKiBbVEhSSUZULTQ0MjFdIC0gZ29sYW5nIHRlc3RzIHJlbHkgb24gZ29tb2NrLCB3aGljaCBoYXMgY2hhbmdlIGJlaGF2aW91ciwgY2F1c2luZyB0ZXN0cyB0byBmYWlsCisgICAgKiBbVEhSSUZULTQ2MjZdIC0gQ29tbXVuaWNhdGlvbiBjcmFzaCB3aGVuIHVzaW5nIGJpbmFyeS9jb21wYWN0IHByb3RvY29sIGFuZCB6bGliIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NjU5XSAtIGdvbGFuZyByYWNlIGRldGVjdGVkIHdoZW4gY2xvc2luZyBsaXN0ZW5lciBzb2NrZXQKKworIyMgaGFza2VsbAorICAgICogW1RIUklGVC00NjM0XSAtIEhhc2tlbGwgYnVpbGRzIHdpdGggb2xkZXIgY2FiYWwgY2Fubm90IHJlY29uY2lsZSBjb21wbGV4IHZlcnNpb24gcmVxdWlyZW1lbnRzCisKKyMjIGphdmEKKyAgICAqIFtUSFJJRlQtNDI1OV0gLSBUaHJpZnQgZG9lcyBub3QgY29tcGlsZSBkdWUgdG8gQW50IE1hdmVuIHRhc2sgZXJyb3JzCisgICAgKiBbVEhSSUZULTE0MThdIC0gQ29tcGlsaW5nIFRocmlmdCBmcm9tIHNvdXJjZTogQ2xhc3Mgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29uZGl0aW9uVGFzayBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCAidHlwZWZvdW5kIiBlbGVtZW50CisgICAgKiBbVEhSSUZULTQ1MzBdIC0gcHJvcG9zYWw6IGFkZCBudWxsYWJpbGl0eSBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgICAgKiBbVEhSSUZULTQ2MTRdIC0gR2VuZXJhdGUgbWlzc2luZyBATnVsbGFibGUgYW5ub3RhdGlvbnMgZm9yIEphdmEgaXRlcmF0b3IgZ2V0dGVycworICAgICogW1RIUklGVC00NTU1XSAtIEdldHRlciBvZiBiaW5hcnkgZmllbGQgaW4gSmF2YSBjcmVhdGVzIHVubmVjZXNzYXJ5IGNvcHkKKyAgICAqIFtUSFJJRlQtMzk4M10gLSBsaWJ0aHJpZnQgaXMgZGVwbG95ZWQgb24gY2VudHJhbCB3aXRoIHBvbSBwYWNrYWdpbmcgaW5zdGVhZCBvZiBqYXIKKyAgICAqIFtUSFJJRlQtNDI5NF0gLSBKYXZhIENvbmZpZ3VyZSBGYWlscyBmb3IgQW50ID49IDEuMTAKKyAgICAqIFtUSFJJRlQtNDE3OF0gLSBKYXZhIGxpYnJhcmllcyBtaXNzaW5nIGZyb20gcGFja2FnZSB3aGVuIHVzaW5nIGNtYWtlCisgICAgKiBbVEhSSUZULTQxMjBdIC0gcG9tIGZpbGVzIGFyZSBub3QgZ2VuZXJhdGVkIG9yIHByb3ZpZGVkIGluIHRoZSBidWlsZAorICAgICogW1RIUklGVC0xNTA3XSAtIE1hdmVuIGNhbid0IGRvd25sb2FkIHJlc291cmNlIGZyb20gY2VudHJhbCB3aGVuIGJlaGluZCBhIHByb3h5IGFuZCB3b24ndCB1c2UgbG9jYWwgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC00NTU2XSAtIE9wdGlvbmFsIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgaW4gamF2YSBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtNDMzN10gLSBBYmxlIHRvIHNldCBrZXlTdG9yZSBhbmQgdHJ1c3RTdG9yZSBhcyBJbnB1dFN0cmVhbSBpbiB0aGUgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMKKyAgICAqIFtUSFJJRlQtNDU2Nl0gLSBQYXNzIG1lc3NhZ2Ugb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0byBvcHRpb25hbCByZXRocm93LgorICAgICogW1RIUklGVC00NTA2XSAtIFJlbW92ZSBhc3NlcnRpb24gaW4gSmF2YSBTQVNMIGNvZGUgdGhhdCB3b3VsZCBiZSBpZ25vcmVkIGluIHJlbGVhc2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTQ0NzBdIC0gSW5jbHVkZSBwb3B1bGFyIElERSBmaWxlIHRlbXBsYXRlcyB0byBnaXRpZ25vcmUKKyAgICAqIFtUSFJJRlQtNDQyOV0gLSBNYWtlIFRUaHJlYWRQb29sU2VydmVyLmV4ZWN1dG9yU2VydmljZV8gYXZhaWxhYmxlIGluIGluaGVyaXRlZCBjbGFzc2VzIGFuZCByZWZhY3RvciBtZXRob2RzIHRvIGJlIGFibGUgY3VzdG9taXphdGlvbgorICAgICogW1RIUklGVC0zNzY5XSAtIEZpeCBsb2dpYyBvZiBUSFJJRlQtMjI2OAorICAgICogW1RIUklGVC00NDk0XSAtIEluY3JlYXNlIEphdmEgU29ja2V0IEJ1ZmZlciBTaXplCisgICAgKiBbVEhSSUZULTQ0OTldIC0gUmVtb3ZlIE1hZ2ljIE51bWJlciBJbiBURklsZVRyYW5zcG9ydAorCisjIyBqcworICAgICogW1RIUklGVC00NDA2XSAtIEphdmFTY3JpcHQ6IFVzZSBtb2Rlcm4gUHJvbWlzZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAqIFtUSFJJRlQtNDYyNV0gLSBsZXQgLyBjb25zdCB2YXJpYWJsZSBkZWNvcmF0b3JzIGZvciBlczYgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDY1M10gLSBFUzYgQ2xhc3NlcworICAgICogW1RIUklGVC00NTkyXSAtIEpTOiByZWFkSTMyIHBlcmZvcm1hbmNlIG9uIGxhcmdlIGFycmF5cyBpcyB2ZXJ5IHBvb3IgaW4gQ2hyb21lCisgICAgKiBbVEhSSUZULTQ1MDldIC0ganMgYW5kIG5vZGVqcyBsaWJyYXJpZXMgbmVlZCB0byBiZSByZWZyZXNoZWQgd2l0aCBjdXJyZW50IGxpYnJhcmllcworICAgICogW1RIUklGVC00NDAzXSAtIHRocmlmdC5qczogSW5jb3JyZWN0IHVzYWdlIG9mICd0aGlzJyBpbiBUV2ViU29ja2V0VHJhbnNwb3J0Ll9fb25PcGVuCisgICAgKiBbVEhSSUZULTQ0MzZdIC0gRGVzZXJpYWxpemF0aW9uIG9mIG5lc3RlZCBsaXN0IGRpc2NhcmRzIGNvbnRlbnQKKyAgICAqIFtUSFJJRlQtNDQzN10gLSBKUyBXZWJTb2NrZXQgY2xpZW50IGNhbGxiYWNrcyBpbnZva2VkIHR3aWNlIG9uIHBhcmFsbGVsIHJlcXVlc3RzCisgICAgKiBbVEhSSUZULTQ2NzldIC0gRHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciBpbiBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcworICAgICogW1RIUklGVC00NTUxXSAtIEFkZCBwcmV0dGllciBmb3IgY29uc2lzdGVudCBKUyBjb2RlIGZvcm1hdHRpbmcKKworIyMgbHVhCisgICAgKiBbVEhSSUZULTQ1OTFdIC0gbHVhIGNsaWVudCB1c2VzIHR3byB3cml0ZSgpIGNhbGxzIHBlciBmcmFtZWQgbWVzc2FnZSBzZW5kCisgICAgKiBbVEhSSUZULTM4NjNdIC0gQ2FuJ3QgIm1ha2UgaW5zdGFsbCIgTHVhIExpYnJhcnkKKworIyMgbmV0Y29yZQorICAgICogW1RIUklGVC00NTI0XSAtIC5ORVQgQ29yZSBTZXJ2ZXIgZG9lc24ndCBjbG9zZSBwcm9wZXJseSB3aGVuIGNhbmNlbGxlZAorICAgICogW1RIUklGVC00NDM0XSAtIFVwZGF0ZSAuTkVUIENvcmUgY29tcG9uZW50cywgYWRkIHRlc3RzIGZvciAuTmV0IENvcmUgbGlicmFyeSBhbmQgLk5ldCBDb3JlIGNvbXBpbGVyLCBmaXggYnVncyBhbmQgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC00NDQ2XSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworCisjIyBub2RlLmpzCisgICAgKiBbVEhSSUZULTQyMjVdIC0gRXJyb3IgaGFuZGxpbmcgbWFsZm9ybWVkIGFyZ3VtZW50cyBsZWFrcyBtZW1vcnksIGNvcnJ1cHRzIHRyYW5zcG9ydCBidWZmZXJzIGNhdXNpbmcgbmV4dCBSUEMgdG8gZmFpbAorICAgICogW1RIUklGVC0zOTUwXSAtIE1lbW9yeSBsZWFrIHdoaWxlIGNhbGxpbmcgb25ld2F5IG1ldGhvZAorICAgICogW1RIUklGVC0zMTQzXSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTQ1NjRdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGNhbiBsZWF2ZSBjb3JydXB0IGRhdGEgaW4gdGhlIGJ1ZmZlcgorICAgICogW1RIUklGVC00NjQ3XSAtIE5vZGUuanMgRmlsZXNlcnZlciB3ZWJyb290IHBhdGgKKyAgICAqIFtUSFJJRlQtNDQ4OV0gLSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCBmb3IgTm9kZUpTIGNsaWVudAorICAgICogW1RIUklGVC00NDQzXSAtIG5vZGUuanMganNvbl9wcm90b2NvbCB0aHJvd3MgZXJyb3IgaW4gc2tpcCBmdW5jdGlvbgorICAgICogW1RIUklGVC00NjA0XSAtIE5vZGVKUzogRXhwb3NlIEludDY0IGZyb20gYnJvd3Nlci5qcyBmb3IgY29uc3VtcHRpb24gYnkgYnJvd3NlcgorICAgICogW1RIUklGVC00NDgwXSAtIE5vZGVKUyB3YXJuaW5nIG9uIGJpbmFyeV9wcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQgd2hlbiBzZXFpZCA9IDAKKworIyMgcGVybAorICAgICogW1RIUklGVC00MzgyXSAtIFJlcGxhY2UgdGhlIHVzZSBvZiBQZXJsIEluZGlyZWN0IE9iamVjdCBTeW50YXggY2FsbHMgdG8gbmV3KCkKKyAgICAqIFtUSFJJRlQtNDQ3MV0gLSBUaHJpZnQgQ1BBTiByZWxlYXNlIGlzIG1pc3NpbmcgTWFrZWZpbGUuUEwgYW5kIHRoZSBjbGllbnRzIGFyZSB1bmFibGUgdG8gYnVpbGQgdGhlIG1vZHVsZQorICAgICogW1RIUklGVC00NDE2XSAtIFBlcmwgQ1BBTiBQYWNrYWdpbmcgSW1wcm92ZW1lbnRzCisKKyMjIHBocAorICAgICogW1RIUklGVC00NDc0XSAtIFBIUCBnZW5lcmF0b3IgdXNlIFBTUi00IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtNDQ2M10gLSBQSFAgZ2VuZXJhdGVkIGNvZGUgbWF0Y2ggUFNSLTIKKyAgICAqIFtUSFJJRlQtNDM3M10gLSBFeHRlbmRpbmcgVGhyaWZ0IGNsYXNzIHJlc3VsdHMgaW4gIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiCisgICAgKiBbVEhSSUZULTQzNTRdIC0gVFNvY2tldCBibG9jayBvbiByZWFkCisgICAgKiBbVEhSSUZULTQ0MjNdIC0gbWlncmF0ZSBwaHAgbGlicmFyeSB0byBwc3ItNAorICAgICogW1RIUklGVC00NjU2XSAtIGluZmluaXRlIGxvb3AgaW4gbGF0ZXN0IFBIUCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0NzddIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IG11c3QgaGF2ZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NDc1XSAtIGxpYi9waHAvdGVzdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgUFNSLTIKKyAgICAqIFtUSFJJRlQtNDQ5OF0gLSBhZGQgcGhwY3MgYmFjaworICAgICogW1RIUklGVC00NDYwXSAtIHBocCBsaWJyYXJ5IHVzZSBQU1ItMgorICAgICogW1RIUklGVC00NjQxXSAtIFRDdXJsQ2xpZW50IGRvZXNuJ3QgY2hlY2sgZm9yIEhUVFAgc3RhdHVzIGNvZGUKKyAgICAqIFtUSFJJRlQtNDY0NV0gLSBUQ3VybENsaWVudDogc2hvdyBhY3R1YWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRocm93aW5nIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDY3NF0gLSBBZGQgc3RyZWFtIGNvbnRleHQgc3VwcG9ydCBpbnRvIFBIUC9USHR0cENsaWVudAorICAgICogW1RIUklGVC00NDU5XSAtIHJlZHVjZSBwaHAgbGlicmFyeSBkaXJlY3RvcnkgZGVwdGgKKworIyMgcHl0aG9uCisgICAgKiBbVEhSSUZULTQ2NzBdIC0gVHdpc3RlZCwgc2xvdHMsIGFuZCB2b2lkIG1ldGhvZCBmYWlscyB3aXRoICJvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc3VjY2VzcyciCisgICAgKiBbVEhSSUZULTQ0NjRdIC0gUG90ZW50aWFsbHkgc2VydmVyLWNyYXNoaW5nIHR5cG8gaW4gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlcgorICAgICogW1RIUklGVC00NTQ4XSAtIFN1cHBvcnRpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgcHJvdG9jb2wgd2hlbiB1c2luZyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW4gUHl0aG9uCisgICAgKiBbVEhSSUZULTQ1NzddIC0gT3V0ZGF0ZWQgY2lwaGVyIHN0cmluZyBpbiBweXRob24gdW5pdCB0ZXN0CisgICAgKiBbVEhSSUZULTQ1MDVdIC0gcHl0aG9uIGJ1aWxkIG9uIFZhZ3JhbnQgV2luZG93cyBib3hlcyBmYWlscworICAgICogW1RIUklGVC00NjIxXSAtIFRIZWFkZXIgZm9yIFB5dGhvbgorICAgICogW1RIUklGVC00NjY4XSAtIG1ha2Ugc29ja2V0IGJhY2tsb2cgY29uZmlndXJhYmxlIGZvciBweXRob24KKyAgICAqIFtUSFJJRlQtNDU2MV0gLSBQeXRob246IGNsZWFudXAgc29ja2V0IHRpbWVvdXQgc2V0dGluZ3MKKworIyMgcnVieQorICAgICogW1RIUklGVC00Mjg5XSAtIFRocmlmdCBSU3BlYyB0ZXN0IHN1aXRlIGZhaWxzIHdpdGggUnVieSAyLjQueCBkdWUgdG8gRml4bnVtIGRlcHJlY2F0aW9uCisgICAgKiBbVEhSSUZULTQzNDJdIC0gU3VwcG9ydCBydWJ5IHJzcGVjIDMKKyAgICAqIFtUSFJJRlQtNDUyNV0gLSBBZGQgc3NsIHNvY2tldCBvcHRpb24gdG8gcnVieSBjcm9zcyB0ZXN0cworICAgICogW1RIUklGVC00NDUwXSAtIEFkZCBzZWVrIHN1cHBvcnQgdG8gVENvbXBhY3RJbnB1dFByb3RvY29sIGluIFJ1c3QKKyAgICAqIFtUSFJJRlQtNDYzMV0gLSBDb2RlZ2VuIENyZWF0ZXMgSW52YWxpZCBSdWJ5IGZvciBSZWN1cnNpdmUgU3RydWN0cworICAgICogW1RIUklGVC00NDcyXSAtIEZpeCB0aGUgZ2Vuc3BlYyBmb3IgcnVieSBzbyBpdCBkb2VzIG5vdCBjb21wbGFpbiBhYm91dCBhbiBpbnZhbGlkIGxpY2Vuc2UKKworIyMgcnVzdAorICAgICogW1RIUklGVC00NjYyXSAtIFJ1c3QgY29uc3Qgc3RyaW5nIGNhbGxzIGZ1bmN0aW9uIGF0IGNvbXBpbGUgdGltZQorICAgICogW1RIUklGVC00NjYxXSAtIFJ1c3QgZW51bSBuYW1lIHdyb25nIGNhc2UgaW4gZ2VuZXJhdGVkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDYxN10gLSBBdm9pZCBnZW5lcmF0aW5nIGNvbmZsaWN0aW5nIHN0cnVjdCBuYW1lcyBpbiBSdXN0IGNvZGUKKyAgICAqIFtUSFJJRlQtNDUyOV0gLSBSdXN0IGdlbmVyYXRpb24gc2hvdWxkIGluY2x1ZGUgIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXSBvciBmb3JjZSBjb25mb3JtIHRvIFJ1c3Qgc3R5bGUgZ3VpZGVsaW5lcworICAgICogW1RIUklGVC00MzkwXSAtIFJ1c3QgYmluYXJ5IHByb3RvY29sIGFuZCBidWZmZXJlZCB0cmFuc3BvcnQgY2Fubm90IGhhbmRsZSB3cml0ZXMgYWJvdmUgNDA5NiBieXRlcworICAgICogW1RIUklGVC00NDE5XSAtIFJ1c3QgZnJhbWVkIHRyYW5zcG9ydCBjYW5ub3QgaGFuZGxlIHdyaXRlcyBhYm92ZSA0MDk2IGJ5dGVzCisgICAgKiBbVEhSSUZULTQ2NThdIC0gUnVzdCdzIFRCaW5hcnlJbnB1dFByb3RvY29sIGZhaWxzIHdoZW4gc3RyaWN0IGlzIGZhbHNlCisgICAgKiBbVEhSSUZULTQxODddIC0gRGFydCAtPiBSdXN0IEZyYW1lZCBjcm9zcyB0ZXN0cyBmYWlsCisgICAgKiBbVEhSSUZULTQ2NjRdIC0gUnVzdCBjYW5ub3QgY3JlYXRlIFJlYWRIYWxmL1dyaXRlSGFsZiB0byBpbXBsZW1lbnQgY3VzdG9tIHRyYW5wb3J0cworICAgICogW1RIUklGVC00NjY1XSAtIEtlZXAgUnVzdCBsaWJyYXJ5IHVwLXRvLWRhdGUgb24gY3JhdGVzLmlvCisKKyMjIHN3aWZ0IChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTM3NzNdIC0gU3dpZnQgTGlicmFyeQorCisjIyB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTQ1MTVdIC0gR3JhY2VmdWxseSBzaHV0ZG93biBjcm9zcy10ZXN0IHNlcnZlcnMgdG8gZnVsbHkgdGVzdCB0ZWFyZG93bgorICAgICogW1RIUklGVC00MDg1XSAtIEFkZCAuTkVUIENvcmUgdG8gdGhlIG1ha2UgY3Jvc3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC00MzU4XSAtIEFkZCB1bml4IGRvbWFpbiBzb2NrZXRzIGluIHJ1YnkgdG8gY3Jvc3MgdGVzdCAtIGNvZGUgZXhpc3RzCisKKyMjIHR5cGVzY3JpcHQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtMzE0M10gLSBhZGQgdHlwZXNjcmlwdCBkaXJlY3Rvcnkgc3VwcG9ydAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhyaWZ0IDAuMTEuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTI3MzNdIC0gRXJsYW5nIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMjc0MF0gLSBQZXJsIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMzYxMF0gLSBTdHJlYW1saW5lIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBQeXRob24gc2VydmVyIGhhbmRsZXIKKyAgICAqIFtUSFJJRlQtMzY4Nl0gLSBKYXZhIHByb2Nlc3NvciBzaG91bGQgcmVwb3J0IGludGVybmFsIGVycm9yIG9uIHVuY2F1Z2h0IGV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MDQ5XSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDA1M10gLSBTa2lwKCkgc2hvdWxkIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQxMzZdIC0gQWxpZ24gaXNfYmluYXJ5KCkgbWV0aG9kIHdpdGggaXNfc3RyaW5nKCkgdG8gc2ltcGxpZnkgdGhvc2UgY2hlY2tzCisgICAgKiBbVEhSSUZULTQxMzddIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIFRocmlmdCBDb21waWxlcgorICAgICogW1RIUklGVC00MTM4XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cyBpbiBDKysgbGlicmFyeQorICAgICogW1RIUklGVC00Mjk2XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgcHl0aG9uIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQyOThdIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBnbyAxLjYgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDI5OV0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIEQgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDMwMF0gLSBGaXggbWFrZSBjcm9zcyBpbiBVYnVudHUgWGVuaWFsIGRvY2tlciBlbnZpcm9ubWVudCwgb25jZSBhbGwgbGFuZ3VhZ2Ugc3VwcG9ydCBpc3N1ZXMgYXJlIGZpeGVkCisgICAgKiBbVEhSSUZULTQzMDJdIC0gRml4IFVidW50dSBYZW5pYWwgbWFrZSBjcm9zcyB0ZXN0aW5nIGZvciBsdWEgYW5kIHBocDcKKyAgICAqIFtUSFJJRlQtNDM5OF0gLSBVcGRhdGUgRVhUUkFfRElTVCBmb3IgIm1ha2UgZGlzdCIKKworIyMgQnVnCisgICAgKiBbVEhSSUZULTM4MV0gLSBGYWlsIGZhc3QgaWYgY29uZmlndXJlIGRldGVjdHMgQysrIHByb2JsZW1zCisgICAgKiBbVEhSSUZULTE2NzddIC0gTWluR1cgc3VwcG9ydCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTgwNV0gLSBUaHJpZnQgc2hvdWxkIG5vdCBzd2FsbG93IEFMTCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIwMjZdIC0gRml4IFRDb21wYWN0UHJvdG9jb2wgNjQgYml0IGJ1aWxkcworICAgICogW1RIUklGVC0yNjQyXSAtIFJlY3Vyc2l2ZSBzdHJ1Y3RzIGRvbid0IHdvcmsgaW4gcHl0aG9uCisgICAgKiBbVEhSSUZULTI4ODldIC0gc3RhYmxlIHJlbGVhc2UgMC45LjIsIGVybGFuZyB0dXRvcmlhbCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMjkxM10gLSBSdWJ5IFNlcnZlciBUaHJpZnQ6OlRocmVhZFBvb2xTZXJ2ZXIgc2hvdWxkIHNlcnZlIGluc2lkZSBhIHRocmVhZAorICAgICogW1RIUklGVC0yOTk4XSAtIE5vZGUuanM6IE1pc3NpbmcgaGVhZGVyIGZyb20gaHR0cCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTMwMDBdIC0gLk5FVCBpbXBsZW1lbnRhdGlvbiBoYXMgdHJvdWJsZSB3aXRoIG1peGVkIElQIG1vZGVzCisgICAgKiBbVEhSSUZULTMyODFdIC0gVHJhdmlzIENJIGJ1aWxkIHBhc3NlZCBidXQgdGhlIGxvZyBzYXlzIEJVSUxEIEZBSUxFRAorICAgICogW1RIUklGVC0zMzU4XSAtIE1ha2VmaWxlOjEzNjI6ICoqKiBtaXNzaW5nIHNlcGFyYXRvci4gU3RvcC4KKyAgICAqIFtUSFJJRlQtMzYwMF0gLSBNYWtlIFRUd2lzdGVkIHNlcnZlciBzZW5kIGV4Y2VwdGlvbiBvbiB1bmV4cGVjdGVkIGhhbmRsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzYwMl0gLSBNYWtlIFRvcm5hZG8gc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorICAgICogW1RIUklGVC0zNjU3XSAtIEQgVEZpbGVXcml0ZXJUcmFuc3BvcnQgY2xvc2Ugc2hvdWxkIHVzZSBub24tcHJpb3JpdHkgc2VuZAorICAgICogW1RIUklGVC0zNzAwXSAtIEdvIE1hcCBoYXMgd3JvbmcgZGVmYXVsdCB2YWx1ZSB3aGVuIG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTM3MDNdIC0gVW5pb25zIEZpZWxkIENvdW50IERvZXMgTm90IENvbnNpZGVyIE1hcC9TZXQvTGlzdCBGaWVsZHMKKyAgICAqIFtUSFJJRlQtMzczMF0gLSBzZXJ2ZXIgbG9nIGVycm9yIHR3aWNlCisgICAgKiBbVEhSSUZULTM3NzhdIC0gZ28gY2xpZW50IGNhbiBub3QgcGFzcyBtZXRob2QgcGFyYW1ldGVyIHRvIHNlcnZlciBvZiBvdGhlciBsYW5ndWFnZSBpZiBubyBmaWVsZF9pZCBpcyBnaXZlbgorICAgICogW1RIUklGVC0zNzg0XSAtIHRocmlmdC1tYXZlbi1wbHVnaW4gZ2VuZXJhdGVzIGludmFsaWQgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgSURMIGluIGRlcGVuZGVuY3kgSkFScworICAgICogW1RIUklGVC0zODAxXSAtIE5vZGUgVGhyaWZ0IGNsaWVudCB0aHJvd3MgZXhjZXB0aW9uIHdpdGggbXVsdGlwbGV4ZXIgYW5kIHJlc3BvbnNlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiBhIHNpbmdsZSBidWZmZXIKKyAgICAqIFtUSFJJRlQtMzgyMV0gLSBUTWVtb3J5QnVmZmVyIGJ1ZmZlciBtYXkgb3ZlcmZsb3cgd2hlbiByZXNpemluZworICAgICogW1RIUklGVC0zODMyXSAtIFRocmlmdCB2ZXJzaW9uIDAuOS4zIGV4YW1wbGUgb24gV2luZG93cywgVmlzdWFsIFN0dWRpbywgbGlua2luZyBlcnJvcnMgZHVyaW5nIGNvbXBpbGluZworICAgICogW1RIUklGVC0zODQ3XSAtIHRocmlmdC9jb25maWcuaCBpbmNsdWRlcyBhICNkZWZpbmUgZm9yIFZFUlNJT04gd2hpY2ggd2lsbCBsaWtlbHkgY29uZmxpY3Qgd2l0aCBleGlzdGluZyB1c2VyIGVudmlyb25tZW50IG9yIGNvZGUKKyAgICAqIFtUSFJJRlQtMzg3M10gLSBGaXggdmFyaW91cyBidWlsZCB3YXJuaW5ncyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtMzg5MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY29uZmlndXJlZCB3aXRoIG1vcmUgdGhhbiBvbmUgSU8gdGhyZWFkcyBkb2VzIG5vdCBhbHdheXMgcmV0dXJuIGZyb20gc2VydmUoKSB1cG9uIHN0b3AoKQorICAgICogW1RIUklGVC0zODkyXSAtIFRocmlmdCB1c2VzIFRMUyBTTkkgZXh0ZW5zaW9uIHByb3ZpZGVkIGJ5IE9wZW5TU0wgbGlicmFyeS4gT2xkZXIgdmVyc2lvbiBvZiBPcGVuU1NMKDwgMC45LjhmKSBtYXkgY3JlYXRlIHByb2JsZW0gYmVjYXVzZSB0aGV5IGRvIG5vdCBzdXBwb3J0ICdTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKScuCisgICAgKiBbVEhSSUZULTM4OTVdIC0gQnVpbGQgZmFpbHMgdXNpbmcgSmF2YSAxLjggd2l0aCBBbnQgPCAxLjkKKyAgICAqIFtUSFJJRlQtMzg5Nl0gLSBtYXA8c3RyaW5nLHN0cmluZz4gZGF0YSB3aXRoIG51bWJlciBzdHJpbmcga2V5IGNhbm5vdCBhY2Nlc3MgdGhhdCBkZXNlcmlhbGl6ZWQgYnkgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zOTM4XSAtIFB5dGhvbiBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3Qgd29yayB3aXRoIFNTTAorICAgICogW1RIUklGVC0zOTQ0XSAtIFRTU0xTb2NrZXQgaGFzIGRlYWQgY29kZSBpbiBjaGVja0hhbmRzaGFrZQorICAgICogW1RIUklGVC0zOTQ2XSAtIEphdmEgMS41IGNvbXBhdGliaWxpdHkgYnJva2VuIGZvciBiaW5hcnkgZmllbGRzIChqYXZhNSBvcHRpb24pCisgICAgKiBbVEhSSUZULTM5NjBdIC0gSW5oZXJpdGVkIHNlcnZpY2VzIGluIEx1YSBnZW5lcmF0b3IgYXJlIG5vdCBuYW1lZCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzk2Ml0gLSBBbnQgYnVpbGQueG1sIGJyb2tlbiBvbiBXaW5kb3dzIGZvciBKYXZhIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzk2M10gLSBUaHJpZnQuY2FiYWwgZmlsZW5hbWUgZG9lcyBub3QgbWF0Y2ggbW9kdWxlIG5hbWUKKyAgICAqIFtUSFJJRlQtMzk2N10gLSBnb2JqZWN0L2dwYXJhbS5oOjE2NjozMzogd2FybmluZzogZW51bWVyYXRvciB2YWx1ZSBmb3Ig4oCYR19QQVJBTV9ERVBSRUNBVEVE4oCZIGlzIG5vdCBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgICAqIFtUSFJJRlQtMzk2OF0gLSBEZXNlcmlhbGl6aW5nIGVtcHR5IHN0cmluZy9iaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTM5NzRdIC0gVXNpbmcgY2xhbmctMy44IGFuZCBUaHJlYWRTYW5pdGl6ZXIgb24gdGhlIGNvbmN1cnJlbmN5X3Rlc3QgY2xhaW1zIGJhZCBQVGhyZWFkIGJlaGF2aW9yCisgICAgKiBbVEhSSUZULTM5ODRdIC0gUEhQNyBleHRlbnNpb24gY2F1c2VzIHNlZ2ZhdWx0CisgICAgKiBbVEhSSUZULTQwMDhdIC0gYnJva2VuIGNpIGR1ZSB0byB1cHN0cmVhbSBkZXBlbmRlbmN5IHZlcnNpb25pbmcgYnJlYWsKKyAgICAqIFtUSFJJRlQtNDAwOV0gLSBVc2UgQGltcGxlbWVudGVyIGluc3RlYWQgb2YgaW1wbGVtZW50cyBpbiBUVHdpc3RlZC5weQorICAgICogW1RIUklGVC00MDEwXSAtIFEuZmNhbGwgbWVzc2luZyB1cCB3aXRoICp0aGlzKiBwb2ludGVyIGluc2lkZSBjYWxsZWQgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDAxMV0gLSBTZXRzIG9mIFRocmlmdCBzdHJ1Y3RzIGdlbmVyYXRlIEdvIGNvZGUgdGhhdCBjYW4ndCBiZSBzZXJpYWxpemVkIHRvIEpTT04KKyAgICAqIFtUSFJJRlQtNDAxMl0gLSBQeXRob24gVHdpc3RlZCBpbXBsZW1lbnRhdGlvbiB1c2VzIGltcGxlbWVudHMsIG5vdCBjb21wYXRpYmxlIHdpdGggUHkzCisgICAgKiBbVEhSSUZULTQwMTRdIC0gYWxpZ24gQyMgbWV0YSBkYXRhIGluIEFzc2VtYmx5SW5mby5jcworICAgICogW1RIUklGVC00MDE1XSAtIEZpeCB3cm9uZ2x5IHNwZWxsZWQgIlRoaXJmdCJzCisgICAgKiBbVEhSSUZULTQwMTZdIC0gdGVzdEluc2FuaXR5KCkgaW1wbCBkb2VzIG5vdCBjb25mb3JtIHRvIHRlc3Qgc3BlYyBpbiBUaHJpZnRUZXN0LnRocmlmdAorICAgICogW1RIUklGVC00MDIzXSAtIFNraXAgdW5leHBlY3RlZCBmaWVsZCB0eXBlcyBvbiByZWFkL3dyaXRlCisgICAgKiBbVEhSSUZULTQwMjRdIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDAyNl0gLSBUU1NMU29ja2V0IGRvZXNuJ3Qgd29yayB3aXRoIFB5dGhvbiA8IDIuNy45CisgICAgKiBbVEhSSUZULTQwMjldIC0gQWNjZWxlcmF0ZWQgcHJvdG9jb2xzIGRvIG5vdCBidWlsZCBmcm9tIHRocmlmdC1weSAwLjEwLjAgb24gUHlQSQorICAgICogW1RIUklGVC00MDMxXSAtIEdvIHBsdWdpbiBnZW5lcmF0ZXMgaW52YWxpZCBjb2RlIGZvciBsaXN0cyBvZiB0eXBlZGVmJ2VkIGJ1aWx0LWluIHR5cGVzCisgICAgKiBbVEhSSUZULTQwMzNdIC0gRGVmYXVsdCBidWlsZCBXSVRIX1BMVUdJTj1PTiBmb3IgYWxsIGJ1aWxkcyByZXN1bHRzIGluIHBhY2thZ2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDAzNF0gLSBDTWFrZSBkb2Vzbid0IHdvcmsgdG8gYnVpbGQgY29tcGlsZXIgb24gTWFjT1MKKyAgICAqIFtUSFJJRlQtNDAzNl0gLSBBZGQgLk5FVCBDb3JlIGVudmlyb25tZW50L2J1aWxkIHN1cHBvcnQgdG8gdGhlIGRvY2tlciBpbWFnZQorICAgICogW1RIUklGVC00MDM4XSAtIHNvY2tldCBjaGVjazogY2hlY2tpbmcgYW4gdW5zaWduZWQgbnVtYmVyIGFnYWluc3QgPj0gMCBuZXZlciBmYWlscworICAgICogW1RIUklGVC00MDQyXSAtIEV4dHJhY3Rpb25FcnJvciB3aGVuIHVzaW5nIGFjY2VsZXJhdGVkIHRocmlmdCBpbiBhIG11bHRpcHJvY2VzcyB0ZXN0CisgICAgKiBbVEhSSUZULTQwNDNdIC0gdGhyaWZ0IHBlcmwgZGViaWFuIHBhY2thZ2UgaXMgcGxhY2luZyBmaWxlcyBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAqIFtUSFJJRlQtNDA0NF0gLSBCdWlsZCBqb2IgMTcgZmFpbGluZyBvbiBldmVyeSBwdWxsIHJlcXVlc3Q7IGhzcGVjIGNvcmUgKGhhc2tlbGwpIDIuNCBpc3N1ZQorICAgICogW1RIUklGVC00MDQ2XSAtIE1pbkdXIHdpdGggZ2NjIDYuMiBkb2VzIG5vdCBjb21waWxlIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDA2MF0gLSBUaHJpZnQgcHJpbnRUbyBvc3RyZWFtIG92ZXJsb2FkIG1lY2hhbmlzbSBicmVha3MgZG93biB3aGVuIHR5cGVzIGFyZSBuZXN0ZWQKKyAgICAqIFtUSFJJRlQtNDA2Ml0gLSBSZW1vdmUgZGVidWcgcHJpbnQgZnJvbSBUU2VydmljZUNsaWVudAorICAgICogW1RIUklGVC00MDY1XSAtIERvY3VtZW50IFBlcmwgRm9ya2luZ1NlcnZlciBzaWduYWwgcmVzdHJpY3Rpb24gaW1wb3NlZCBieSBUSFJJRlQtMzg0OCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvZGUKKyAgICAqIFtUSFJJRlQtNDA2OF0gLSBBIGNvZGUgY29tbWVudCBpbiBKYXZhIFNlcnZlclNvY2tldCBpcyB3cm9uZyBhcm91bmQgYWNjZXB0KCkKKyAgICAqIFtUSFJJRlQtNDA3M10gLSBlbnVtIGZpbGVzIGFyZSBzdGlsbCBiZWluZyBnZW5lcmF0ZWQgd2l0aCB1bnVzZWQgaW1wb3J0cworICAgICogW1RIUklGVC00MDc2XSAtIEFwcHZleW9yIGJ1aWxkcyBmYWlsaW5nIGJlY2F1c2UgYW50IDEuOS44IHdhcyByZW1vdmVkIGZyb20gYXBhY2hlIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtNDA3N10gLSBBSV9BRERSQ09ORklHIHJlZGVmaW5lZCBhZnRlciByZWNlbnQgY2hhbmdlIHRvIFBsYXRmb3JtU29ja2V0IGhlYWRlcgorICAgICogW1RIUklGVC00MDc5XSAtIEdlbmVyYXRlZCBwZXJsIGNvZGUgdGhhdCByZXR1cm5zIHN0cnVjdHVyZXMgZnJvbSBpbmNsdWRlZCB0aHJpZnQgZmlsZXMgaXMgbWlzc2luZyBhIG5lY2Vzc2FyeSB1c2UgY2xhdXNlCisgICAgKiBbVEhSSUZULTQwODddIC0gU3B1cmlvdXMgZXhjZXB0aW9uIGRlc3Ryb3lpbmcgVFRocmVhZGVkU2VydmVyIGJlY2F1c2Ugb2YgaW5jb3JyZWN0IGpvaW4oKSBjYWxsCisgICAgKiBbVEhSSUZULTQxMDJdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IHBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIDAuMTAuMAorICAgICogW1RIUklGVC00MTA2XSAtIGNvbmN1cnJlbmN5X3Rlc3QgZmFpbHMgcmFuZG9tbHkKKyAgICAqIFtUSFJJRlQtNDEwOF0gLSBjX2dsaWIgdGhyaWZ0IHNzbCBoYXMgbXVsdGlwbGUgYnVncyBhbmQgZGVwcmVjYXRlZCBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtNDEwOV0gLSBDb25maWd1cmUgU2NyaXB0IHVzZXMgc3RyaW5nIGNvbXBhcmlzb24gZm9yIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTQxMjldIC0gQysrIFROb25ibG9ja2luZ1NlcnZlciBmZCBsZWFrIHdoZW4gZmFpbGluZyB0byBkaXNwYXRjaCBuZXcgY29ubmVjdGlvbnMKKyAgICAqIFtUSFJJRlQtNDEzMV0gLSBKYXZhc2NyaXB0IHdpdGggV2ViU29ja2V0IGhhbmRsZXMgb25ld2F5IG1ldGhvZHMgd3JvbmcKKyAgICAqIFtUSFJJRlQtNDEzNF0gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMKKyAgICAqIFtUSFJJRlQtNDE0MF0gLSBVc2Ugb2Ygbm9uLXRocmVhZC1zYWZlIGZ1bmN0aW9uIGdtdGltZSgpCisgICAgKiBbVEhSSUZULTQxNDFdIC0gSW5zdGFsbGF0aW9uIG9mIGhheGUgaW4gZG9ja2VyIGZpbGVzIHJlZmVycyB0byBhIHJlZGlyZWN0IGxpbmsgYW5kIGZhaWxzCisgICAgKiBbVEhSSUZULTQxNDddIC0gUnVzdDogcHJvdG9jb2wgc2hvdWxkIGFjY2VwdCB0cmFuc3BvcnRzIHdpdGggbm9uLXN0YXRpYyBsaWZldGltZQorICAgICogW1RIUklGVC00MTQ4XSAtIFttYXZlbi10aHJpZnQtcGx1Z2luXSBjb21waWxlIGVycm9yIHdoaWxlIGltcG9ydCBhIHRocmlmdCBpbiBkZXBlbmRlbmN5IGphciBmaWxlLgorICAgICogW1RIUklGVC00MTQ5XSAtIFN5c3RlbS5vdXQgcG9sbHV0ZXMgbG9nIGZpbGVzIAorICAgICogW1RIUklGVC00MTU0XSAtIFBIUCBjbG9zZSgpIG9mIGEgVFNvY2tldCBuZWVkcyB0byBjbG9zZSBhbnkgdHlwZSBvZiBzb2NrZXQKKyAgICAqIFtUSFJJRlQtNDE1OF0gLSBtaW5vciBpc3N1ZSBpbiBSRUFETUUtTVNZUzIubWQKKyAgICAqIFtUSFJJRlQtNDE1OV0gLSBCdWlsZGluZyB0ZXN0cyBmYWlscyBvbiBNU1lTMiAoTWluR1c2NCkgZHVlIHRvIGEgKHNtYWxsPykgbGlua2VyIGVycm9yCisgICAgKiBbVEhSSUZULTQxNjBdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBmaXggdXNlIG9mIGNsb3NlZC9mcmVlZCBjb25uZWN0aW9ucworICAgICogW1RIUklGVC00MTYxXSAtIFROb25CbG9ja2luZyBzZXJ2ZXIgdXNpbmcgdW5pbml0aWFsaXplZCBldmVudCBpbiBlcnJvciBwYXRocworICAgICogW1RIUklGVC00MTYyXSAtIFROb25CbG9ja2luZyBoYW5kbGluZyBvZiBUU29ja2V0cyBpbiBlcnJvciBzdGF0ZSBpcyBpbmNvcnJlY3QgYWZ0ZXIgZmQgaXMgY2xvc2VkCisgICAgKiBbVEhSSUZULTQxNjRdIC0gQ29yZSBpbiBUU1NMU29ja2V0IGNsZWFudXBPcGVuU1NMIHdoZW4gZGVzdHJveWluZyBhIG11dGV4IHVzZWQgYnkgb3BlbnNzbAorICAgICogW1RIUklGVC00MTY1XSAtIEMrKyBidWlsZCBoYXMgbWFueSB3YXJuaW5ncyB1bmRlciBjKyswMyBkdWUgdG8gcmVjZW50IGNoYW5nZXMsIGNtYWtlIG5lZWRzIGJldHRlciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsYW5ndWFnZSBsZXZlbCBjb250cm9sCisgICAgKiBbVEhSSUZULTQxNjZdIC0gUmVjZW50IGZpeCB0byByZW1vdmUgYm9vc3Q6OmxleGljYWxfY2FzdCB1c2FnZSBicm9rZSBWUzIwMTAKKyAgICAqIFtUSFJJRlQtNDE2N10gLSBNaXNzaW5nIGNvbXBpbGUgZmxhZworICAgICogW1RIUklGVC00MTcwXSAtIFN1cHBvcnQgbHVhIDUuMSBvciBlYXJsaWVyIHByb3Blcmx5IGZvciBvYmplY3QgbGVuZ3RoIGRldGVybWluYXRpb24KKyAgICAqIFtUSFJJRlQtNDE3Ml0gLSBub2RlLmpzIHR1dG9yaWFsIGNsaWVudCBkb2VzIG5vdCBpbXBvcnQgYXNzZXJ0LCBjb25uZWN0aW9uIGlzc3VlcyBhcmUgbm90IGhhbmRsZWQgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtNDE3N10gLSBKYXZhIGNvbXBpbGVyIHByb2R1Y2VzIGRlZXAgY29weSBjb25zdHJ1Y3RvciB0aGF0IGNvdWxkIG1ha2Ugc2hhbGxvdyBjb3B5IGluc3RlYWQKKyAgICAqIFtUSFJJRlQtNDE4NF0gLSBCdWlsZGluZyBvbiBBcHB2ZXlvcjogaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXEwKKyAgICAqIFtUSFJJRlQtNDE4NV0gLSBmYjMwMyBjb3VudGVyIGVuY29kaW5nIGZpeAorICAgICogW1RIUklGVC00MTg5XSAtIEZyYW1lZC9idWZmZXJlZCB0cmFuc3BvcnQgRGlzcG9zZSgpIGRvZXMgbm90IGRpc3Bvc2UgdGhlIG5lc3RlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDE5M10gLSBMb3dlciB0aGUgZGVmYXVsdCBtYXhSZWFkQnVmZmVyQnl0ZXMgZm9yIG5vbi1ibG9ja2luZyBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTQxOTVdIC0gQ29tcGlsYXRpb24gdG8gR08gcHJvZHVjZXMgYnJva2VuIGNvZGUKKyAgICAqIFtUSFJJRlQtNDE5Nl0gLSBDYW5ub3QgZ2VuZXJhdGUgcmVjdXJzaXZlIFJ1c3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDIwNF0gLSB0eXBvIGluIGNvbXBhY3Qgc3BlYworICAgICogW1RIUklGVC00MjA2XSAtIFN0cmluZ3MgaW4gY29udGFpbmVyIGZpZWxkcyBhcmUgbm90IGRlY29kZWQgcHJvcGVybHkgd2l0aCBweTpkeW5hbWljIGFuZCBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC00MjA4XSAtIEMjIE5hbWVkUGlwZXNTZXJ2ZXIgbm90IHJlYWxseSB3b3JraW5nIGluIHNvbWUgc2NlbmFyaW9zCisgICAgKiBbVEhSSUZULTQyMTFdIC0gRml4IEdFcnJvciBnbGliIG1hbmFnZW1lbnQgdW5kZXIgVGhyaWZ0CisgICAgKiBbVEhSSUZULTQyMTJdIC0gY19nbGliIGZsdXNoIHRyaWVzIHRvIGNsb3NlIFNTTCBldmVuIGlmIHNvY2tldCBpcyBpbnZhbGlkCisgICAgKiBbVEhSSUZULTQyMTNdIC0gVHJhdmlzIGJ1aWxkIGZhaWxzIGF0IGN1cmwgLXNTTCBodHRwczovL3d3dy5ucG1qcy5jb20vaW5zdGFsbC5zaCB8IHNoCisgICAgKiBbVEhSSUZULTQyMTVdIC0gR29sYW5nIFRUcmFuc3BvcnRGYWN0b3J5IFBhdHRlcm4gU3F1ZWxjaGVzIEVycm9ycworICAgICogW1RIUklGVC00MjE2XSAtIEdvbGFuZyBIdHRwIENsaWVudHMgRG8gTm90IFJlc3BlY3QgVXNlciBPcHRpb25zCisgICAgKiBbVEhSSUZULTQyMThdIC0gU2V0IFRDUF9OT0RFTEFZIGZvciBQSFAgY2xpZW50IHNvY2tldAorICAgICogW1RIUklGVC00MjE5XSAtIEdvbGFuZyBIVFRQIGNsaWVudHMgY3JlYXRlZCB3aXRoIE5pbCBidWZmZXIKKyAgICAqIFtUSFJJRlQtNDIzMV0gLSBUSlNPTlByb3RvY29sIHRocm93cyB1bmV4cGVjdGVkIG5vbi1UaHJpZnQtZXhjZXB0aW9uIG9uIG51bGwgc3RyaW5ncworICAgICogW1RIUklGVC00MjMyXSAtIC4vY29uZmlndXJlIGRvZXMgYmFkIGFudCB2ZXJzaW9uIGNoZWNrCisgICAgKiBbVEhSSUZULTQyMzRdIC0gVHJhdmlzIGJ1aWxkIGZhaWxzIGNyb3NzIGxhbmd1YWdlIHRlc3RzIHdpdGggIlVuc3VwcG9ydGVkIHNlY3VyaXR5IHByb3RvY29sIHR5cGUiCisgICAgKiBbVEhSSUZULTQyMzddIC0gR28gVFNlcnZlclNvY2tldCBSYWNlIENvbmRpdGlvbnMKKyAgICAqIFtUSFJJRlQtNDI0MF0gLSBHbyBUU2ltcGxlU2VydmVyIGRvZXMgbm90IGNsb3NlIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTQyNDNdIC0gR28gVFNpbXBsZVNlcnZlciByYWNlIG9uIHdhaXQgaW4gU3RvcCgpIG1ldGhvZAorICAgICogW1RIUklGVC00MjQ1XSAtIEdvbGFuZyBURnJhbWVkVHJhbnNwb3J0J3Mgd3JpdGVCdWZmZXIgaW5jcmVhc2VzIGlmIHdyaXRlcyB0byB0cmFuc3BvcnQgZmFpbGVkCisgICAgKiBbVEhSSUZULTQyNDZdIC0gU2VxdWVuY2UgbnVtYmVyIG1pc21hdGNoIG9uIG11bHRpcGxleGVkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtNDI0N10gLSBDb21waWxlIGZhaWxzIHdpdGggb3BlbnNzbCAxLjEKKyAgICAqIFtUSFJJRlQtNDI0OF0gLSBDb21waWxlIGZhaWxzIC0gc3RybmNweSwgbWVtY21wLCBtZW1zZXQgbm90IGRlY2xhcmVkIGluIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTQyNTFdIC0gSmF2YSBFcG9sbCBTZWxlY3RvciBCdWcKKyAgICAqIFtUSFJJRlQtNDI1N10gLSBUeXBlc2NyaXB0IGFzeW5jIGNhbGxiYWNrcyBkbyBub3QgcHJvdmlkZSB0aGUgY29ycmVjdCB0eXBlcworICAgICogW1RIUklGVC00MjU4XSAtIEJvb3N0L3N0ZCB0aHJlYWQgd3JhcHBpbmcgZmF1bHRpbmVzcworICAgICogW1RIUklGVC00MjYwXSAtIEdvIGNvbnRleHQgZ2VuZXJhdGlvbiBpc3N1ZS4gQ29udGV4dCBpcyBwYXJhbWV0ZXIgaW4gSW50ZXJmYWNlIG5vdCBpbiBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC00MjYxXSAtIEdvIGNvbnRleHQgZ2VuZXJhdGlvbiBpc3N1ZTogYnJlYWtpbmcgY2hhbmdlIGluIGdlbmVyYXRlZCBjb2RlIHJlZ2FyZGluZyB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZQorICAgICogW1RIUklGVC00MjYyXSAtIEludmFsaWQgYmluZGluZyB0byBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCkgd2l0aCA2NC1iaXQgdGFyZ2V0cworICAgICogW1RIUklGVC00MjYzXSAtIEZpeCB1c2UgYWZ0ZXIgZnJlZSBidWcgZm9yIHRocm93biBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQyNjZdIC0gRXJsYW5nIGxpYnJhcnkgdGhyb3dzIGR1cmluZyBza2lwcGluZyBmaWVsZHMgb2YgY29tcG9zaXRlIHR5cGUgKG1hcHMsIGxpc3RzLCBzdHJ1Y3RzLCBzZXRzKQorICAgICogW1RIUklGVC00MjY4XSAtIEVybGFuZyBsaWJyYXJ5IGVtaXRzIGRlYnVnZ2luZyBvdXRwdXQgaW4gdHJhbnNwb3J0IGxheWVyCisgICAgKiBbVEhSSUZULTQyNzNdIC0gZXJsYW5nOm5vdy8wOiBEZXByZWNhdGVkIEJJRi4gCisgICAgKiBbVEhSSUZULTQyNzRdIC0gUHl0aG9uIGZlYXR1cmUgdGVzdHMgZm9yIFNTTC9UTFMgZmFpbGluZworICAgICogW1RIUklGVC00Mjc5XSAtIFdyb25nIHBhdGggaW4gaW5jbHVkZSBkaXJlY3RpdmUgaW4gZ2VuZXJhdGVkIFRocmlmdCBzb3VyY2VzCisgICAgKiBbVEhSSUZULTQyODNdIC0gVE5hbWVkUGlwZVNlcnZlciByYWNlIGNvbmRpdGlvbiBpbiBpbnRlcnJ1cHQKKyAgICAqIFtUSFJJRlQtNDI4NF0gLSBGaWxlIGNvbnRhaW5zIGEgTkJTUDogbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKKyAgICAqIFtUSFJJRlQtNDI5MF0gLSBDIyBudWxsYWJsZSBvcHRpb24gZ2VuZXJhdGVzIGludmFsaWQgY29kZSBmb3Igbm9uLXJlcXVpcmVkIGVudW0gZmllbGQgd2l0aCBkZWZhdWx0IHZhbHVlCisgICAgKiBbVEhSSUZULTQyOTJdIC0gVGltZXJNYW5hZ2VyOjpyZW1vdmUoKSBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAqIFtUSFJJRlQtNDMwN10gLSBNYWtlIHNzbC1vcGVuIHRpbWVvdXQgZWZmZWN0aXZlIGluIGdvbGFuZyBjbGllbnQKKyAgICAqIFtUSFJJRlQtNDMxMl0gLSBFcmxhbmcgY2xpZW50IGNhbm5vdCBjb25uZWN0IHRvIFB5dGhvbiBzZXJ2ZXI6IGV4Y2VwdGlvbiBlcnJvcjogZWNvbm5yZWZ1c2VkCisgICAgKiBbVEhSSUZULTQzMTNdIC0gUHJvZ3JhbSBjb2RlIG9mIHRoZSBFcmxhbmcgdHV0b3JpYWwgZmlsZXMgY29udGFpbiBzeW50YXggZXJyb3JzCisgICAgKiBbVEhSSUZULTQzMTZdIC0gVEJ5dGVCdWZmZXIuamF2YSB3aWxsIHJlYWQgdG9vIG11Y2ggZGF0YSBpZiBhIHByZXZpb3VzIHJlYWQgcmV0dXJucyBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZAorICAgICogW1RIUklGVC00MzE5XSAtIGNvbW1hbmQgbGluZSBzd2l0Y2ggZm9yICJldmh0dHAiIGluY29ycmVjdGx5IHJlc29sdmVkIHRvIGFub24gcGlwZXMKKyAgICAqIFtUSFJJRlQtNDMyM10gLSByYW5nZSBjaGVjayBlcnJvcnMgb3IgTlBFIGluIGVkZ2UgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDMyNF0gLSBmaWVsZCBuYW1lcyBjYW4gY29uZmxpY3Qgd2l0aCBsb2NhbCB2YXJzIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTQzMjhdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAoam9iIDEpIGFuZCBoYXhlIGJ1aWxkcyBhcmUgZmFpbGluZyBzaW5jZSA5LzExCisgICAgKiBbVEhSSUZULTQzMjldIC0gY19nbGliIERvZXNuJ3QgaGF2ZSBhIG11bHRpcGxleGVkIHByb2Nlc3NvcgorICAgICogW1RIUklGVC00MzMxXSAtIEMrKzogVFNTTFNvY2tldHMgYnVnIGluIGhhbmRsaW5nIGh1Z2UgbWVzc2FnZXMsIGJ1ZyBpbiBoYW5kbGluZyBwb2xsaW5nCisgICAgKiBbVEhSSUZULTQzMzJdIC0gQmluYXJ5IHByb3RvY29sIGhhcyBtZW1vcnkgbGVha3MKKyAgICAqIFtUSFJJRlQtNDMzNF0gLSBQZXJsIGluZGVudGF0aW9uIGluY29ycmVjdCB3aGVuIGRlZmF1bHRpbmcgZmllbGQgYXR0cmlidXRlIHRvIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTQzMzldIC0gVGhyaWZ0IEZyYW1lZCBUcmFuc3BvcnQgaW4gRXJsYW5nIGNyYXNoZXMgc2VydmVyIHdoZW4gY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgKiBbVEhSSUZULTQzNDBdIC0gRXJsYW5nIGZpeCBhIGNyYXNoIG9uIGNsaWVudCBjbG9zZQorICAgICogW1RIUklGVC00MzU1XSAtIEphdmFzY3JpcHQgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtNDM1Nl0gLSB0aHJpZnRfcHJvdG9jb2wgY2FsbCBUcmFuc3BvcnQgY2F1c2UgU2VnbWVudGF0aW9uIGZhdWx0CisgICAgKiBbVEhSSUZULTQzNTldIC0gSGF4ZSBjb21waWxlciBsb29rcyBsaWtlIGl0IGlzIHByb2R1Y2luZyBpbmNvcnJlY3QgY29kZSBmb3IgbWFwIG9yIHNldCBrZXkgdGhhdCBpcyBiaW5hcnkgdHlwZQorICAgICogW1RIUklGVC00MzYyXSAtIE1pc3Npbmcgc2l6ZS1jaGVjayBjYW4gbGVhZCB0byBodWdlIG1lbW9yeSBhbGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTQzNjRdIC0gV2Vic2l0ZSBjb250cmlidXRpbmcgZ3VpZGUgZXJyb25lb3VzbHkgcmVjb21tZW5kcyBzdWJtaXR0aW5nIHBhdGNoZXMgaW4gSklSQQorICAgICogW1RIUklGVC00MzY1XSAtIFBlcmwgZ2VuZXJhdGVkIGNvZGUgdXNlcyBpbmRpcmVjdCBvYmplY3Qgc3ludGF4LCB3aGljaCBvY2Nhc2lvbmFsbHkgY2F1c2VzIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICAqIFtUSFJJRlQtNDM2N10gLSBweXRob24gVFByb2Nlc3Nvci5wcm9jZXNzIGlzIG1pc3NpbmcgInNlbGYiCisgICAgKiBbVEhSSUZULTQzNzBdIC0gVWJ1bnR1IEFydGZ1bCBjcHBjaGVjayBhbmQgZmxha2U4IGFyZSBtb3JlIHN0cmluZ2VudCBhbmQgY2F1c2luZyBTQ0EgYnVpbGQgam9iIGZhaWx1cmVzCisgICAgKiBbVEhSSUZULTQzNzJdIC0gUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gCisgICAgKiBbVEhSSUZULTQzNzRdIC0gY2Fubm90IGxvYWQgdGhyaWZ0X3Byb3RvY29sIGR1ZSB0byB1bmRlZmluZWQgc3ltYm9sOiBfWlRWTjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FCisgICAgKiBbVEhSSUZULTQzNzVdIC0gVE1lbW9yeSB0aHJvdyBiYWRfYWxsb2MgZHVlIHRvIGNvdW50ZXIgb3ZlcmZsb3cKKyAgICAqIFtUSFJJRlQtNDM3Nl0gLSBDb3Zlcml0eSBoaWdoIGltcGFjdCBpc3N1ZSByZXNvbHV0aW9uCisgICAgKiBbVEhSSUZULTQzNzddIC0gaGF4ZS4gc29ja2V0IGhhbmRsZXMgbGVhayBpbiBUU2ltcGxlU2VydmVyCisgICAgKiBbVEhSSUZULTQzODFdIC0gV3JvbmcgaXNzZXQgYml0ZmllbGQgdmFsdWUgYWZ0ZXIgdHJhbnNtaXNzaW9uCisgICAgKiBbVEhSSUZULTQzODVdIC0gR28gcmVtb3RlIGNsaWVudCAtdSBmbGFnIGlzIGJyb2tlbgorICAgICogW1RIUklGVC00MzkyXSAtIGNvbXBpbGVyLy4uLi4vcGx1Z2luLnRocmlmdCBzdHJ1Y3RzIG1pcy1vcmRlcmVkIGJsb3dzIHVwIG9jYW1sIGdlbmVyYXRvcgorICAgICogW1RIUklGVC00Mzk1XSAtIFVuYWJsZSB0byBidWlsZCBpbiB0aGUgdWJ1bnR1LXhlbmlhbCBkb2NrZXIgaW1hZ2U6IGNsYXAgMi4yOCByZXF1aXJlcyBSdXN0IDEuMjAKKyAgICAqIFtUSFJJRlQtNDM5Nl0gLSBpbmNvbnNpc3RlbnQgKG9yIHBsYWluIHdyb25nKSB2ZXJzaW9uIG51bWJlcnMgaW4gbWFzdGVyL3RydW5rIAorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQxNTddIC0gb3V0ZGF0ZWQgcmVhZG1lIGFib3V0IEhheGUgaW5zdGFsbGF0aW9uIG9uIExpbnV4CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTEwNV0gLSBtYWtlIGEgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0dXJlcyB3aXRoIG5lZ2F0aXZlIHRhZ3MKKyAgICAqIFtUSFJJRlQtMjgxXSAtIENvY29hIGxpYnJhcnkgY29kZSBuZWVkcyBjb21tZW50cywgYmFkbHkKKyAgICAqIFtUSFJJRlQtNzc1XSAtIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgUGVybAorICAgICogW1RIUklGVC0yMjIxXSAtIEdlbmVyYXRlIGMrKyBjb2RlIHdpdGggc3RkOjpzaGFyZWRfcHRyIGluc3RlYWQgb2YgYm9vc3Q6OnNoYXJlZF9wdHIuCisgICAgKiBbVEhSSUZULTIzNjRdIC0gT0NhbWw6IFVzZSBPYXNpcyBleGNsdXNpdmVseSBmb3IgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC0yNTA0XSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBzaG91bGQgYWxsb3cgcmVnaXN0ZXJpbmcgZGVmYXVsdCBwcm9jZXNzb3IgY2FsbGVkIGlmIG5vIHNlcnZpY2UgbmFtZSBpcyBwcmVzZW50CisgICAgKiBbVEhSSUZULTMyMDddIC0gRW5hYmxlIGJ1aWxkIHdpdGggT3BlblNTTCAxLjEuMCBzZXJpZXMKKyAgICAqIFtUSFJJRlQtMzI3Ml0gLSBQZXJsIFNTTCBBdXRoZW50aWNhdGlvbiBTdXBwb3J0CisgICAgKiBbVEhSSUZULTMzNTddIC0gR2VuZXJhdGUgRW51bVNldC9FbnVtTWFwIHdoZXJlIGVsZW1lbnRzL2tleXMgYXJlIGVudW1zCisgICAgKiBbVEhSSUZULTMzNjldIC0gSW1wbGVtZW50IFNTTC9UTFMgc3VwcG9ydCBvbiBDIHdpdGggY19nbGliCisgICAgKiBbVEhSSUZULTM0NjddIC0gR28gTWFwcyBmb3IgVGhyaWZ0IFNldHMgU2hvdWxkIEhhdmUgVmFsdWVzIG9mIFR5cGUgc3RydWN0e30gCisgICAgKiBbVEhSSUZULTM1ODBdIC0gVEhlYWRlciBmb3IgSGFza2VsbAorICAgICogW1RIUklGVC0zNjI3XSAtIE1pc3NpbmcgYmFzaWMgY29kZSBzdHlsZSBjb25zaXN0ZW5jeSBvZiBKYXZhU2NyaXB0LgorICAgICogW1RIUklGVC0zNzA2XSAtIFRoZXJlJ3Mgbm8gc3VwcG9ydCBmb3IgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgb24gY19nbGliIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzc2Nl0gLSBBZGQgZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHRvIFRabGliVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM3NzZdIC0gR28gY29kZSBmcm9tIG11bHRpcGxlIHRocmlmdCBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0zODIzXSAtIEVzY2FwZSBkb2N1bWVudGF0aW9uIHdoaWxlIGdlbmVyYXRpbmcgbm9uIGVzY2FwZWQgZG9jdW1ldGF0aW9uCisgICAgKiBbVEhSSUZULTM4NTRdIC0gYWxsb3cgdXNlcnMgdG8gY2xlYXIgcmVhZCBidWZmZXJzCisgICAgKiBbVEhSSUZULTM4NTldIC0gVW5peCBEb21haW4gU29ja2V0IFN1cHBvcnQgaW4gT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMzkyMV0gLSBDKysgY29kZSBzaG91bGQgcHJpbnQgZW51bXMgYXMgc3RyaW5ncworICAgICogW1RIUklGVC0zOTI2XSAtIFRoZXJlIHNob3VsZCBiZSBhbiBlcnJvciBlbWl0dGVkIHdoZW4gaHR0cCBzdGF0dXMgY29kZSBpcyBub3QgMjAwIAorICAgICogW1RIUklGVC00MDA3XSAtIE1pY3JvLW9wdGltaXphdGlvbiBvZiBUVHJhbnNwb3J0LnB5CisgICAgKiBbVEhSSUZULTQwNDBdIC0gQWRkIHJlYWwgY2F1c2Ugb2YgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IGVycm9yIHRvIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MDY0XSAtIFVwZGF0ZSBub2RlIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTQwNjldIC0gQWxsIHBlcmwgcGFja2FnZXMgc2hvdWxkIGhhdmUgcHJvcGVyIG5hbWVzcGFjZSwgdmVyc2lvbiBzeW50YXgsIGFuZCB1c2UgcHJvcGVyIHRocmlmdCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQwNzFdIC0gQ29uc29saWRhdGUgdGhlIFRyYXZpcyBDSSBqb2JzIHdoZXJlIHBvc3NpYmxlIHRvIHB1dCBsZXNzIHN0cmVzcyBvbiB0aGUgQXBhY2hlIEZvdW5kYXRpb24ncyBhbGxvY2F0aW9uIG9mIENJIGJ1aWxkIHNsYXZlcworICAgICogW1RIUklGVC00MDcyXSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycyBpbiBUQ3VybENsaWVudAorICAgICogW1RIUklGVC00MDc1XSAtIEJldHRlciBNaW5HVyBzdXBwb3J0IGZvciBoZWFkZXJzLW9ubHkgYm9vc3QgKHdpdGhvdXQgdGhyZWFkIGxpYnJhcnkpCisgICAgKiBbVEhSSUZULTQwODFdIC0gUHJvdmlkZSBhIE1pbkdXIDY0LWJpdCBBcHB2ZXlvciBDSSBidWlsZCBmb3IgYmV0dGVyIHB1bGwgcmVxdWVzdCB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTQwODRdIC0gSW1wcm92ZSBTU0wgc2VjdXJpdHkgaW4gdGhyaWZ0IGJ5IGFkZGluZyBhIG1ha2UgY3Jvc3MgY2xpZW50IHRoYXQgY2hlY2tzIHRvIG1ha2Ugc3VyZSBTU0x2MyBwcm90b2NvbCBjYW5ub3QgYmUgbmVnb3RpYXRlZAorICAgICogW1RIUklGVC00MDk1XSAtIEFkZCBtdWx0aXBsZXhlZCBwcm90b2NvbCB0byBUcmF2aXMgQ0kgZm9yIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtNDA5OV0gLSBBdXRvLWRlcml2ZSBIYXNoIGZvciBnZW5lcmF0ZWQgUnVzdCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQxMTBdIC0gVGhlIGRlYmlhbiBidWlsZCBmaWxlcyBkbyBub3QgcHJvZHVjZSBhICItZGJnIiBwYWNrYWdlIGZvciBkZWJ1ZyBzeW1ib2xzIG9mIGxpYnRocmlmdDAKKyAgICAqIFtUSFJJRlQtNDExNF0gLSBTcGFjZSBhZnRlciAnLy8vJyBpbiBkb2MgY29tbWVudHMKKyAgICAqIFtUSFJJRlQtNDEyNl0gLSBWYWxpZGF0ZSBvYmplY3RzIGluIHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtNDEzMF0gLSBFbnN1cmUgQXBhY2hlIEh0dHAgY29ubmVjdGlvbiBpcyByZWxlYXNlZCBiYWNrIHRvIHBvb2wgYWZ0ZXIgdXNlCisgICAgKiBbVEhSSUZULTQxNTFdIC0gVGhyaWZ0IE11dGV4IENvbnRlbnRpb24gUHJvZmlsaW5nIChwdGhyZWFkcykgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtNDE3Nl0gLSBJbXBsZW1lbnQgYSB0aHJlYWRlZCBhbmQgdGhyZWFkcG9vbCBzZXJ2ZXIgdHlwZSBmb3IgUnVzdAorICAgICogW1RIUklGVC00MTgzXSAtIE5hbWVkIHBpcGUgY2xpZW50IGJsb2NrcyBmb3JldmVyIG9uIE9wZW4oKSB3aGVuIHRoZXJlIGlzIG5vIHNlcnZlciBhdCB0aGUgb3RoZXIgZW5kCisgICAgKiBbVEhSSUZULTQxOTBdIC0gaW1wcm92ZSBDIyBUVGhyZWFkUG9vbFNlcnZlciBkZWZhdWx0cworICAgICogW1RIUklGVC00MTk3XSAtIEltcGxlbWVudCB0cmFuc3BhcmVudCBnemlwIGNvbXByZXNzaW9uIGZvciBIVFRQIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00MTk4XSAtIFJ1Ynkgc2hvdWxkIGxvZyBUaHJpZnQgaW50ZXJuYWwgZXJyb3JzIHRvIGdsb2JhbCBsb2dnZXIKKyAgICAqIFtUSFJJRlQtNDIwM10gLSB0aHJpZnQgc2VydmVyIHN0b3AgZ3JhY2VmdWxseQorICAgICogW1RIUklGVC00MjA1XSAtIGNfZ2xpYiBpcyBub3QgbGlua2luZyBhZ2FpbnN0IGdsaWIgKyBnb2JqZWN0CisgICAgKiBbVEhSSUZULTQyMDldIC0gd2FybmluZyBDUzA0MTQgaW4gVFtUTFNdU2VydmVyU29ja2V0LmNzCisgICAgKiBbVEhSSUZULTQyMTBdIC0gaW5jbHVkZSBUaHJpZnQuNDUuY3Nwcm9qIGludG8gQ0kgcnVucyAKKyAgICAqIFtUSFJJRlQtNDIxN10gLSBIdHRwQ2xpZW50IHNob3VsZCBzdXBwb3J0IGd6aXAgYW5kIGRlZmxhdGUKKyAgICAqIFtUSFJJRlQtNDIyMl0gLSBTdXBwb3J0IFVuaXggRG9tYWluIFNvY2tldHMgaW4gR29sYW5nIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtNDIzM10gLSBNYWtlIFRIc0hhU2VydmVyLmludm9rZXIgYXZhaWxhYmxlIChnZXQgbWV0aG9kIG9ubHkpIGluIGluaGVyaXRlZCBjbGFzc2VzCisgICAgKiBbVEhSSUZULTQyMzZdIC0gU3VwcG9ydCBjb250ZXh0IGluIGdvIGdlbmVyYXRlZCBjb2RlLgorICAgICogW1RIUklGVC00MjM4XSAtIEpTT04gZ2VuZXJhdG9yOiBtYWtlIGFubm90YXRpb24tYXdhcmUKKyAgICAqIFtUSFJJRlQtNDI2OV0gLSBEb24ndCBhcHBlbmQgJy4nIHRvIEVybGFuZyBuYW1lc3BhY2UgaWYgaXQgZW5kcyBpbiAnXycuCisgICAgKiBbVEhSSUZULTQyNzBdIC0gR2VuZXJhdGUgRXJsYW5nIG1hcHBpbmcgZnVuY3Rpb25zIGZvciBjb25zdCBtYXBzIGFuZCBsaXN0cworICAgICogW1RIUklGVC00Mjc1XSAtIEFkZCBzdXBwb3J0IGZvciB6b3BlLmludGVyZmFjZSBvbmx5LCBhcGFydCBmcm9tIHR3aXN0ZWQgc3VwcG9ydC4KKyAgICAqIFtUSFJJRlQtNDI4NV0gLSBQdWxsIGdlbmVyYXRlZCBzZW5kL3JlY3YgaW50byBsaWJyYXJ5IHRvIGFsbG93IGJlaGF2aW91ciB0byBiZSBjdXN0b21pc2VkCisgICAgKiBbVEhSSUZULTQyODddIC0gQWRkIGMrKyBjb21waWxlciAibm9fc2tlbGV0b24iIGZsYWcgb3B0aW9uCisgICAgKiBbVEhSSUZULTQyODhdIC0gSW1wbGVtZW50IGxvZ2dpbmcgbGV2ZWxzIHByb3Blcmx5IGZvciBub2RlLmpzCisgICAgKiBbVEhSSUZULTQyOTVdIC0gUmVmcmVzaCB0aGUgRG9ja2VyIGltYWdlIGZpbGUgc3VpdGUgZm9yIFVidW50dSwgRGViaWFuLCBhbmQgQ2VudE9TCisgICAgKiBbVEhSSUZULTQzMDVdIC0gRW1pdCBkZG9jIGZvciBnZW5lcmF0ZWQgaXRlbXMKKyAgICAqIFtUSFJJRlQtNDMwNl0gLSBUaHJpZnQgaW1wb3J0cyBub3QgcmVwbGljYXRlZCB0byBEIHNlcnZpY2Ugb3V0cHV0CisgICAgKiBbVEhSSUZULTQzMTVdIC0gQWRkIGRlZmF1bHQgbWVzc2FnZSBmb3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQzMThdIC0gRGVscGhpIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC00MzI1XSAtIFNpbXBsaWZ5IGF1dG9tYWtlIGNyb3NzIGNvbXBpbGF0aW9uIGJ5IHJlbHlpbmcgb24gb25lIGdsb2JhbCBUSFJJRlQgY29tcGlsZXIgcGF0aAorICAgICogW1RIUklGVC00MzI3XSAtIEltcHJvdmUgVGltZXJNYW5hZ2VyIEFQSSB0byBhbGxvdyByZW1vdmluZyBzcGVjaWZpYyB0YXNrCisgICAgKiBbVEhSSUZULTQzMzBdIC0gQWxsb3cgdW51c2VkIGNyYXRlcyBpbiBSdXN0IGZpbGVzCisgICAgKiBbVEhSSUZULTQzMzNdIC0gRXJsYW5nIHR1dG9yaWFsIGV4YW1wbGVzIGFyZSB1c2luZyBhIGRpZmZlcmVudCBwb3J0ICg5OTk5KQorICAgICogW1RIUklGVC00MzQzXSAtIENoYW5nZSBDSSBidWlsZHMgdG8gdXNlIG5vZGUuanMgOC54IExUUyBvbmNlIGF2YWlsYWJsZQorICAgICogW1RIUklGVC00MzQ1XSAtIENyZWF0ZSBhIGRvY2tlciBidWlsZCBlbnZpcm9ubWVudCB0aGF0IHVzZXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIGxhbmd1YWdlIGxldmVscworICAgICogW1RIUklGVC00MzQ2XSAtIEFsbG93IFpsaWIgdHJhbnNwb3J0IGZhY3RvcnkgdG8gd3JhcCBvdGhlciB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTQzNDhdIC0gUGVybCBIVFRQIENsaWVudCBjdXN0b20gSFRUUCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTQzNTBdIC0gVXBkYXRlIG5ldGNvcmUgYnVpbGQgZm9yIGRvdG5ldCAyLjAgc2RrIGFuZCBtYWtlIGNyb3NzIHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtNDM1MV0gLSBVc2UgVHJhdmlzIENJIEJ1aWxkIFN0YWdlcyB0byBvcHRpbWl6ZSB0aGUgQ0kgYnVpbGQKKyAgICAqIFtUSFJJRlQtNDM1M10gLSBjYW5ub3QgcmVhZCB2aWEgdGhyaWZ0X3Byb3RvY29sIGF0IHNlcnZlciBzaWRlCisgICAgKiBbVEhSSUZULTQzNzhdIC0gYWRkIHNldCBzdG9wVGltZW91dFVuaXQgbWV0aG9kIHRvIFRUaHJlYWRQb29sU2VydmVyCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTc1MF0gLSBDKysgQ29tcGlsZXIgVmlydHVhbCBGdW5jdGlvbiBPcHRpb24KKyAgICAqIFtUSFJJRlQtMjk0NV0gLSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgUnVzdCBsYW5ndWFnZQorICAgICogW1RIUklGVC0zODU3XSAtIHRocmlmdCBqczpub2RlIGNvbXBsaWVyIHN1cHBvcnQgYW4gb2JqZWN0IGFzIHBhcmFtZXRlciBub3QgYW4gaW5zdGFuY2Ugb2Ygc3RydWN0CisgICAgKiBbVEhSSUZULTM5MzNdIC0gUG9ydCBvZmZpY2lhbCBDIyAuTkVUIGxpYnJhcnkgZm9yIFRocmlmdCB0byBDIyAuTkVUIENvcmUgbGliYXJ5CisgICAgKiBbVEhSSUZULTQwMzldIC0gVXBkYXRlIG9mIEFwYWNoZSBUaHJpZnQgLk5ldCBDb3JlIGxpYiAKKyAgICAqIFtUSFJJRlQtNDExM10gLSBQcm92aWRlIGEgYnVmZmVyIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nIGluIG1lbW9yeSBieXRlIHN0cmVhbQorCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0yOTU2XSAtIGF1dG9jb25mIC0gcG9zc2libHkgdW5kZWZpbmVkIG1hY3JvIC0gQUNfUFJPR19CSVNPTgorICAgICogW1RIUklGVC00MjIzXSAtIEFkZCBzdXBwb3J0IHRvIHRoZSBpc1NlcnZpbmcoKSBtZXRob2QgZm9yIHRoZSBDKysgbGlicmFyeQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTM2MjJdIC0gRml4IGRlcHJlY2F0ZWQgdXNlcyBvZiBzdGQ6OmF1dG9fcHRyCisgICAgKiBbVEhSSUZULTQwMjhdIC0gUGxlYXNlIHJlbW92ZSBTeXN0ZW0ub3V0LmZvcm1hdCBmcm9tIHRoZSBzb3VyY2UgY29kZQorICAgICogW1RIUklGVC00MTg2XSAtIEJ1aWxkIGFuZCB0ZXN0IHJ1c3QgY2xpZW50IGluIFRyYXZpcworCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTQyNjRdIC0gUEhQIC0gU3VwcG9ydCBib3RoIHNoYXJlZCAmIHN0YXRpYyBsaW5raW5nIG9mIHNvY2tldHMgbGlicmFyeQorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTQzNDRdIC0gRGVmaW5lIGFuZCBtYWludGFpbiB0aGUgbWluaW11bSBsYW5ndWFnZSBsZXZlbCBmb3IgYWxsIGxhbmd1YWdlcyBpbiBvbmUgcGxhY2UKKworCQorVGhyaWZ0IDAuMTAuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xODQwXSAtIFRocmlmdCBHZW5lcmF0ZWQgQ29kZSBDYXVzZXMgR2xvYmFsIFZhcmlhYmxlIExlYWtzCisgICAgKiBbVEhSSUZULTE4MjhdIC0gbW9jX1RRVGNwU2VydmVyLmNwcCB3YXMgcmVtb3ZlZCBmcm9tIHNvdXJjZSB0cmVlIGJ1dCBpcyBpbiB0aHJpZnQtMC45LjAudGFyLmd6CisgICAgKiBbVEhSSUZULTE3OTBdIC0gY29jb2E6IER1cGxpY2F0ZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBlcnJvcgorICAgICogW1RIUklGVC0xNzc2XSAtIFRQaXBlU2VydmVyIHNob3VsZCBpbXBsZW1lbnQgImxpc3RlbiIsIHNvIHRoYXQgVFNlcnZlckV2ZW50SGFuZGxlciBwcmVTZXJ2ZSB3aWxsIHdvcmsgcmlnaHQKKyAgICAqIFtUSFJJRlQtMTM1MV0gLSBDb21waWxlciBkb2VzIG5vdCBjYXJlIGFib3V0IGJpbmFyeSBzdHJpbmdzCisgICAgKiBbVEhSSUZULTEyMjldIC0gUHl0aG9uIGZhc3RiaW5hcnkuYyBjYW4gbm90IGhhbmRsZSB1bmljb2RlIGFzIGdlbmVyYXRlZCBweXRob24gY29kZQorICAgICogW1RIUklGVC03NDldIC0gQysrIFRCdWZmZXJlZFRyYW5zcG9ydHMgZG8gbm90IGZsdXNoIHRoZWlyIGJ1ZmZlcnMgb24gZGVsZXRlCisgICAgKiBbVEhSSUZULTc0N10gLSBDKysgVFNvY2tldC0+Y2xvc2UgY2FsbHMgc2h1dGRvd24gYnJlYWtpbmcgZm9ya2VkIHBhcmVudCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTczMl0gLSBzZXJ2ZXIgZXhpdHMgYWJub3JtYWxseSB3aGVuIGNsaWVudCBjYWxscyBzZW5kX3h4eCBmdW5jdGlvbiB3aXRob3V0IGNhbGxpbmcgcmVjdl94eHggZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzk0Ml0gLSBUU1NMU29ja2V0IGRvZXMgbm90IGhvbm9yIHNlbmQgYW5kIHJlY2VpdmUgdGltZW91dHMKKyAgICAqIFtUSFJJRlQtMzk0MV0gLSBXaW5YUCB2ZXJzaW9uIG9mIHRocmlmdF9wb2xsKCkgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvciBieSBwYXNzaW5nIGEgZGVzdHJ1Y3RlZCB2YXJpYWJsZSB0byBzZWxlY3QoKQorICAgICogW1RIUklGVC0zOTQwXSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGZvciBjb21waWxlciBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzk0M10gLSBDb3Zlcml0eSBTY2FuIGlkZW50aWZpZWQgc29tZSBoaWdoIHNldmVyaXR5IGRlZmVjdHMKKyAgICAqIFtUSFJJRlQtMzkyOV0gLSBQSFAgIm5zZ2xvYmFsIiBPcHRpb24gUmVzdWx0cyBpbiBTeW50YXggRXJyb3IgaW4gR2VuZXJhdGVkIENvZGUgKFRyYWlsaW5nIEJhY2tzbGFzaCkKKyAgICAqIFtUSFJJRlQtMzkzNl0gLSBDYW5ub3QgY29tcGlsZSAwLjEwLjAgZGV2ZWxvcG1lbnQgdGlwIHdpdGggVlMyMDEzIGFuZCBlYXJsaWVyIChzbnByaW50ZiwgdWludDMyX3QpCisgICAgKiBbVEhSSUZULTM5MzVdIC0gSW5jb3JyZWN0IHNraXBwaW5nIG9mIG1hcCBhbmQgc2V0CisgICAgKiBbVEhSSUZULTM5MjBdIC0gUnVieTogRW5zdXJpbmcgdGhhdCBIVFRQIGZhaWx1cmVzIHdpbGwgY2xlYXIgdGhlIGh0dHAgdHJhbnNwb3J0IG91dGJ1ZiB2YXIKKyAgICAqIFtUSFJJRlQtMzkxOV0gLSBDIyBUVExTU2VydmVyU29ja2V0IGRvZXMgbm90IHVzZSBjbGllbnRUaW1lb3V0CisgICAgKiBbVEhSSUZULTM5MTddIC0gQ2hlY2sgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgdmVyc2lvbgorICAgICogW1RIUklGVC0zOTA5XSAtIEZpeCBjX2dsaWIgc3RhdGljIGxpYiBDTWFrZSBidWlsZAorICAgICogW1RIUklGVC0zOTA0XSAtIFR5cG8gaW4gbm9kZSB0dXRvcmlhbCBsZWFkcyB0byB3cm9uZyB0cmFuc3BvcnQgYmVpbmcgdXNlZAorICAgICogW1RIUklGVC0zODQ4XSAtIEFzIGFuIGltcGxlbWVudGVyIG9mIGEgcGVybCBzb2NrZXQgc2VydmVyLCBJIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gcmVtZW1iZXIgdG8gaWdub3JlIFNJR0NITEQgZm9yIGl0IHRvIHdvcmsgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMzg0NF0gLSB0aHJpZnRfcHJvdG9jb2wgY2Fubm90IGNvbXBpbGUgaW4gNy4wLjcKKyAgICAqIFtUSFJJRlQtMzg0M10gLSBpbnRlZ2VyIGlzc3VlcyB3aXRoIEhheGUgUEhQIHRhcmdldHMgY2F1c2UgWmlnWmFnIGVuY29kaW5nIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtMzg0Ml0gLSBEYXJ0IGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3IgYSBjb25zdCBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMzg0MV0gLSBkYXJ0IGNvbXBhY3QgcHJvdG9jb2wgaW5jb3JyZWN0bHkgc2VyaWFsaXplcy9kZXNlcmlhbGl6ZWQgZG91YmxlcworICAgICogW1RIUklGVC0zNzA4XSAtIE5hbWVFcnJvcjogZ2xvYmFsIG5hbWUgJ1RQcm90b2NvbCcgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMzcwNF0gLSAiVENvbm5lY3RlZENsaWVudCBkaWVkOiBDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIgbWVzc2FnZSBzaG93biB3aGVuIHVzaW5nIEhUVFAgU2VydmVyCisgICAgKiBbVEhSSUZULTM2NzhdIC0gRml4IGphdmFkb2MgZXJyb3JzIG9uIEpESyA4CisgICAgKiBbVEhSSUZULTMwMTRdIC0gQXBwVmV5b3Igc3VwcG9ydAorICAgICogW1RIUklGVC0yOTk0XSAtIE5vZGUuanMgVEpTT05Qcm90b2NvbCBjYW5ub3QgYmUgdXNlZCBmb3Igb2JqZWN0IHNlcmlhbGl6YXRpb24uCisgICAgKiBbVEhSSUZULTI5NzRdIC0gd3JpdGVUb1BhcmNlbCB0aHJvd3MgTlBFIGZvciBvcHRpb25hbCBlbnVtIGZpZWxkcworICAgICogW1RIUklGVC0yOTQ4XSAtIFB5dGhvbiBUSlNPTlByb3RvY29sIGRvZXNuJ3QgaGFuZGxlIHN0cnVjdHMgd2l0aCBiaW5hcnkgZmllbGRzIGNvbnRhaW5pbmcgaW52YWxpZCB1bmljb2RlLgorICAgICogW1RIUklGVC0yODQ1XSAtIENoaWxkU2VydmljZS5QbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMzI3Nl0gLSBCaW5hcnkgZGF0YSBkb2VzIG5vdCBkZWNvZGUgY29ycmVjdGx5IHVzaW5nIHRoZSBUSlNPTlByb3RvY29sIHdoZW4gdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgaXMgcGFkZGVkLgorICAgICogW1RIUklGVC0zMjUzXSAtIFVzaW5nIGxhdGVzdCB2ZXJzaW9uIG9mIEQgZ2l2ZXMgZGVwcmVjYXRpb24gbm90aWNlcworICAgICogW1RIUklGVC0yODgzXSAtIFRUd2lzdGVkLnB5LCBkdXJpbmcgQ29ubmVjdGlvbkxvc3QgcHJvY2Vzc2luZzogZXhjZXB0aW9ucy5SdW50aW1lRXJyb3I6IGRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjAxOV0gLSBXcml0aW5nIG9uIGEgZGlzY29ubmVjdGVkIHNvY2tldCBvbiBNYWMgY2F1c2VzIFNJRyBQSVBFCisgICAgKiBbVEhSSUZULTIwMjBdIC0gVGhyaWZ0IGxpYnJhcnkgaGFzIHNvbWUgZW1wdHkgZmlsZXMgdGhhdCBoYXZlbid0IHJlYWxseSBiZWVuIGRlbGV0ZWQKKyAgICAqIFtUSFJJRlQtMjA0OV0gLSBHbyBjb21waWxlciBkb2Vzbid0IGJ1aWxkIG9uIG5hdGl2ZSBXaW5kb3dzCisgICAgKiBbVEhSSUZULTIwMjRdIC0gVFNlcnZlci5jcHAgd2FybnMgb24gNjQtYml0IHBsYXRmb3JtcyBhYm91dCB0cnVuY2F0aW5nIGFuIHJsaW1fdCBpbnRvIGFuIGludAorICAgICogW1RIUklGVC0yMDIzXSAtIGdldHRpbWVvZmRheSBpbXBsZW1lbnRhdGlvbiBvbiBXaW5kb3dzIGVycm9ycyB3aGVuIG5vIHRpbWUgem9uZSBpcyBwYXNzZWQgaW4uCisgICAgKiBbVEhSSUZULTIwMjJdIC0gQ29CIGFuZCBkZW5zZSBjb2RlIGdlbmVyYXRpb24gc3RpbGwgdXNlcyBUUjEgYmluZCwgZXZlbiB0aG91Z2ggdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCBjbGFuZworICAgICogW1RIUklGVC0yMDI3XSAtIE1pbm9yIDY0LWJpdCBhbmQgTk9NSU5NQVggaXNzdWVzIGluIEMrKyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIxNTZdIC0gVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgaXMgdGhyb3dpbmcgZXhjZXB0aW9ucyB3aXRoIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKyAgICAqIFtUSFJJRlQtMjE1NF0gLSBNaXNzaW5nIDxvcGVyYXRvciBib2R5CisgICAgKiBbVEhSSUZULTIxNDhdIC0gVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCBpbXBvcnRzIGxvZzRqCisgICAgKiBbVEhSSUZULTIxMDNdIC0gW3B5dGhvbl0gU3VwcG9ydCBmb3IgU1NMIGNlcnRpZmljYXRlcyB3aXRoIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZXMKKyAgICAqIFtUSFJJRlQtMTkzMV0gLSBTZW5kaW5nIGEgZnJhbWUgc2l6ZSBvZiB6ZXJvIHRvIGEgVE5vbmJsb2NraW5nU2VydmVyIGNhdXNlcyBhbiBhc3NlcnRpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0xNzUxXSAtIGRlZmluaXRpb24gb2YgaW5jcmVhc2VfbWF4X2ZkcyBkb2Vzbid0IGNvbXBpbGUgd2hlbiBIQVZFX1NZU19SRVNPVVJDRV9IIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE1MjJdIC0gVFNlcnZlclNvY2tldCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgd2l0aCBhZGRyaW5mbyAqcmVzMAorICAgICogW1RIUklGVC0xNTQ3XSAtIFByb2JsZW1zIGJ1aWxkaW5nIGFnYWluc3Qgc3RhdGljIGxpYmV2ZW50CisgICAgKiBbVEhSSUZULTE1NDVdIC0gR2VuZXJhdGVkIGphdmFzY3JpcHQgY29kZSB1c2VzICJmb3IgaW4iIGZvciBsb29waW5nIG92ZXIgYXJyYXlzCisgICAgKiBbVEhSSUZULTE0ODddIC0gTmFtZXNwYWNlIHByb2JsZW0sIGNvbXBpbGUgZmFpbHMgb24gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ3Ml0gLSBDb25maWd1cmF0aW9uIGNvbmZsaWN0cyB3aXRoIGJvb3N0IHBsYXRmb3JtIGluY2x1ZGUgaGVhZGVyCisgICAgKiBbVEhSSUZULTZdIC0gVGhyaWZ0IGxpYnJhcmllcyBhbmQgY29tcGlsZXIgbGFjayB2ZXJzaW9uIG51bWJlcgorICAgICogW1RIUklGVC0xNjgwXSAtIG1ha2UgaW5zdGFsbCByZXF1aXJlcyBHTlUgbWFrZQorICAgICogW1RIUklGVC0zODY5XSAtIERhcnQgVHV0b3JpYWwgYnVpbGQgZmFpbHMgd2l0aCBFcnJvciA2NSBhdCAicHViIGdldCIKKyAgICAqIFtUSFJJRlQtMzg2MV0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSB0aW1pbmcgb3V0IC0gQysrVFNlcnZlckludGVncmF0aW9uVGVzdCBhcHBlYXJzIHRvIGJlIGhhbmdpbmcKKyAgICAqIFtUSFJJRlQtMzg1NV0gLSBJbiB0aGUgZ28gc2ltcGxlIHNlcnZlciwgaWYgU3RvcCgpIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpdCBoYW5ncworICAgICogW1RIUklGVC0zODg1XSAtIFBIUDogRXJyb3Igd2hlbiByZWFkSTY0IGluIFRDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzg4M10gLSBHbyBUZXN0QWxsQ29ubmVjdGlvbiBjYW4gZmFpbCB3aXRoIHBvcnQgOTA5MCBjb2xsaXNpb24KKyAgICAqIFtUSFJJRlQtMzg4NF0gLSBGaXggRXJsYW5nIGNvbXBhY3QgcHJvdG9jb2wgZG91YmxlIGVuZGlhbmVzcyBhbmQgYm9vbGVhbiBsaXN0CisgICAgKiBbVEhSSUZULTM4ODBdIC0gRXJsYW5nIENvbXBhY3QgcHJvdG9jb2wgLSBib29sZWFuIHZhbHVlcyBpbnZlcnRlZAorICAgICogW1RIUklGVC0zODc5XSAtIFVuZGVmaW5lZCBldmFsdWF0aW9uIG9yZGVyIGNhdXNlcyBpbmNvcnJlY3QgcHJvY2Vzc2luZyBpbiB0aGUgQysrIGxpYnJhcnkgSlNPTiBwcm90b2NvbAorICAgICogW1RIUklGVC0zODUxXSAtIEdvbGFuZyB0aHJpZnQgY29udGludWFsbHkgYWRkcyB0aGUgeC90aHJpZnQgY29udGVudCB0eXBlIAorICAgICogW1RIUklGVC0zODUwXSAtIEFsbCBhcGFjaGUgYnVpbGRzIGFyZSBmYWlsaW5nIHdoZW4gaW5pdGlhdGVkIGZyb20gYSBnaXRodWIgcHVsbCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTM4MzddIC0gVGhpZnQgMC45LjMgY2FuJ3QgYmUgYnVpbGQgd2l0aCBRdWlja0NoZWNrIDIuOC4yIGFuZCB1bm9yZGVyZWQtY29udGFpbmVycyAwLjIuNgorICAgICogW1RIUklGVC0zODMxXSAtIGJ1aWxkIG9mIHRlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBmYWlscyB3aXRoIG5ld2VyIGdjYyBvbiBwbGF0Zm9ybXMgd2l0aCB1bnNpZ25lZCBjaGFyIGR1ZSB0byBuYXJyb3dpbmcgY29udmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtMzgyN10gLSBwaHAgQ29tcGFjdFByb3RvY29sIHJlYWRJNjQgZnVuY3Rpb24gaGFzIGJ1Zywgd2hlbiB2YWx1ZSBoYXMgMzJiaXQgfjY0Yml0LCBFeGFtcGxl77yadmFsdWU9MTQ2MTU2MzQ1NzAwMCAKKyAgICAqIFtUSFJJRlQtMzgyNV0gLSBKYXZhc2NyaXB0IHRlc3QgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM4MTRdIC0gRml4IGNvbnRlbnRpb24gaW4gVE5vbmJsb2NraW5nU2VydmVyVGVzdAorICAgICogW1RIUklGVC0zNzkzXSAtIEFwcHZleW9yIGJ1aWxkcyByZWZlcmVuY2UgYW4gYW50IHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKyAgICAqIFtUSFJJRlQtMzc4Nl0gLSBOb2RlLmpzIFRMUyBlbWl0cyAnY29ubmVjdCcgYmVmb3JlIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICAqIFtUSFJJRlQtMzc4MF0gLSBGaXggZGFydCBpbnQ2NCB1c2FnZSB3aGVuIGNvbXBpbGVkIHRvIGpzCisgICAgKiBbVEhSSUZULTM3ODldIC0gTm9kZS5qcyBsYWNrcyBhYmlsaXR5IHRvIGRlc3Ryb3kgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0zNzk2XSAtIFRoZXJlJ3Mgbm8gLS1kYmcgZm9yIGRoX3N0cmlwLCBtYXliZSBzb21lb25lIGhhcyBtaXN0YWtlbiB0aGlzIGZvciAtLWRiZy1wYWNrYWdlLgorICAgICogW1RIUklGVC0zNzk1XSAtIEdlbmVyYXRlZCBoYXNoVmFsdWUgbWV0aG9kIGluIFN3aWZ0IHdpbGwgb3ZlcmZsb3cKKyAgICAqIFtUSFJJRlQtMzc5MF0gLSBGaXggRGVscGhpIG5hbWVkIHBpcGUgY2xpZW50IHRvIHVzZSB0aW1lb3V0IGV2ZW4gd2hlbiBwaXBlIGRvZXNuJ3QgeWV0IGV4aXN0CisgICAgKiBbVEhSSUZULTM3ODddIC0gTm9kZS5qcyBDb25uZWN0aW9uIG9iamVjdCBkb2Vzbid0IGhhbmRsZSBlcnJvcnMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM3OTFdIC0gRGVscGhpIHBpcGUgY2xpZW50IG1heSBmYWlsIGV2ZW4gaW4gYSBub24tZXJyb3IgY29uZGl0aW9uCisgICAgKiBbVEhSSUZULTM3NzFdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGdldHMgaW4gaW52YWxpZCBzdGF0ZSBvbiByZWFkL3dyaXRlIGVycm9ycworICAgICogW1RIUklGVC0zNzY0XSAtIFBIUCAibWFrZSBpbnN0YWxsIiBkb2VzIG5vdCBpbnN0YWxsIFRNdWx0aXBsZXhlZFByb3RvY29sLnBocCBub3IgVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKKyAgICAqIFtUSFJJRlQtMzc2OF0gLSBUVGhyZWFkZWRTZXJ2ZXIgbWF5IGNyYXNoIGlmIGl0IGlzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBhZnRlciBpdCByZXR1cm5zIGZyb20gc2VydmUoKTsgVFRocmVhZGVkU2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzc2NV0gLSBtZW1vcnkgbGVhayBpbiBweXRob24gY29tcGFjdCBwcm90b2NvbCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzc1OF0gLSBUQXBwbGljYXRpb25FeGNlcHRpb246OmdldFR5cGUgYW5kIFRQcm90b2NvbEV4Y2VwdGlvbjo6Z2V0VHlwZSBzaG91bGQgYmUgY29uc3QKKyAgICAqIFtUSFJJRlQtMzc2M10gLSBGaXggc2VyaWFsaXphdGlvbiBvZiBpNjQgbGFyZ2VyIHRoYW4gMl41MyBmb3IgYnJvd3NlcmlmeQorICAgICogW1RIUklGVC0zNzU5XSAtIHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZSBuaWwgYXJlIHNpbGVudGx5IGlnbm9yZWQgb24gd3JpdGUKKyAgICAqIFtUSFJJRlQtMzc1M10gLSBUU2VydmVyRnJhbWV3b3JrOjpzdG9wIG1heSBmYWlsIHRvIGludGVycnVwdCBjb25uZWN0ZWQgY2xpZW50cworICAgICogW1RIUklGVC0zNzU1XSAtIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyBoaXRzIGFzc2VydCBpbiBpc3ByaW50IG9uIFdpbmRvd3Mgd2l0aCBkZWJ1ZyBDUlQKKyAgICAqIFtUSFJJRlQtMzc1MV0gLSBDb21waWxlciBhbGxvd3MgZmllbGQgaWRzIHRoYXQgYXJlIHRvbyBsYXJnZSBmb3IgZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMzc0OF0gLSBOb2RlLmpzIERlc2VyaWFsaXphdGlvbiBvZiBsaXN0cyBvZiBsaXN0cyBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzc2MF0gLSBGaXggaW5zdGFsbCBwYXRocyBldGMgb2YgZGViaWFuIHBhY2thZ2VzIGZvciBweSBhbmQgcGVybAorICAgICogW1RIUklGVC0zNzU3XSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIG9uIFdpbmRvd3Mgd2l0aCBWUzIwMTUgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzc1MF0gLSBOU0NvcHlpbmcgY29weVdpdGhab25lOiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjaGVjayBpc1NldAorICAgICogW1RIUklGVC0zNzQ3XSAtIER1cGxpY2F0ZSBub2RlLmpzIGJ1aWxkIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNzQ0XSAtIFRoZSBwcmVjaXNpb24gc2hvdWxkIGJlIDE3ICgxNiBiaXRzIG5lZWQgYWZ0ZXIgZG90KSBhZnRlciBkb3QgZm9yIGRvdWJsZSB0eXBlLgorICAgICogW1RIUklGVC0zNzQxXSAtIGhheGUgdGVzdCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzczOV0gLSBEZXByZWNhdGlvbiB3YXJuaW5nIGluIGNvZGVnZW4vYmFzZS5kCisgICAgKiBbVEhSSUZULTM3MzVdIC0gSlNPTiBwcm90b2NvbCBsZWZ0IGluIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0zNzM0XSAtIFRvIGNvbXBhcmUgdHdvIHN0cmluZyBhcyBsb3dlcmNhc2UuCisgICAgKiBbVEhSSUZULTM3NDNdIC0gSmF2YSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTM3MzFdIC0gUGVybCBtdWx0aXBsZXggdGVzdCBpcyBmbGFreQorICAgICogW1RIUklGVC0zNzI5XSAtIFJlc3RyaWN0IHJha2UgdmVyc2lvbgorICAgICogW1RIUklGVC0zNzI3XSAtIEluY29ycmVjdCByZXF1aXJlIHBhdGhzIGluIE5vZGUuanMgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMzcyM10gLSBGaXggTHVhIGluY2x1ZGUgcGF0aAorICAgICogW1RIUklGVC0zNzIyXSAtIEZpeCBjZXJ0IHBhdGggaW4gQysrIGNyb3NzIHRlc3RzIGZvciBub24tTGludXggcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMzcyNl0gLSBGaXggaW5jb3JyZWN0IGNvbmRpdGlvbmFsIGluIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQorICAgICogW1RIUklGVC0zNzI1XSAtIFNraXAgYSBmbGFreSBjcm9zcyB0ZXN0IGVudHJ5IChkLWRhcnQgY29tcGFjdCBmcmFtZWQtaXApCisgICAgKiBbVEhSSUZULTM3MjRdIC0gRml4IGluY29ycmVjdCB0aW1ldmFsIGNvbnZlcnNpb24gaW4gbGliZXZlbnQuZAorICAgICogW1RIUklGVC0zNzIxXSAtIENMT05FIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworICAgICogW1RIUklGVC0zNzIwXSAtIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlJlYWQoKSByZXR1cm5zIDAgaWYgbm90IGFsbCByZXF1ZXN0ZWQgYnl0ZXMgY291bGQgYmUgcmVhZAorICAgICogW1RIUklGVC0zNzE5XSAtIERhcnQgZ2VuZXJhdG9yIHNob3VsZCB1c2UgbG93ZXJDYW1lbENhc2UgZm9yIHNlcnZpY2UgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzkwMl0gLSBUU29ja2V0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTM5MDFdIC0gVEZyYW1lZFRyYW5zcG9ydC5vcGVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zODkzXSAtIENvbW1hbmQgaW5qZWN0aW9uIGluIGZvcm1hdF9nb19vdXRwdXQKKyAgICAqIFtUSFJJRlQtMzgwN10gLSBTd2lmdCBjb21waWxlciBkb2VzIG5vdCBlc2NhcGUgcmVzZXJ2ZWQgd29yZHMKKyAgICAqIFtUSFJJRlQtMzc5OF0gLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAqIFtUSFJJRlQtMzgwOV0gLSB3cm9uZy91bnVzZWQgQklOQVJZIHR5cGUgY29kZQorICAgICogW1RIUklGVC0zODA2XSAtIFN3aWZ0IGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgc2VsZi1yZWZlcnJpbmcgc3RydWN0cworICAgICogW1RIUklGVC0zODA1XSAtIEdvbGFuZyBzZXJ2ZXIgc3VzY2VwdGlibGUgdG8gbWVtb3J5IHNwaWtlIGZyb20gbWFsZm9ybWVkIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMzc5N10gLSBHZW5lcmF0ZWQgRGVscGhpIHByb2Nlc3NvciBzaG91bGRuJ3QgZXJyb3Igb3V0IG9uIHRpbWVkIG91dCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTM4MTNdIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBvcGVuc3NsIHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKyAgICAqIFtUSFJJRlQtMzY1OF0gLSBNaXNzaW5nIGZpbGUgaW4gVEhSSUZULTM1OTkKKyAgICAqIFtUSFJJRlQtMzY0OV0gLSBQeXRob24gVFNhc2xDbGllbnRUcmFuc3BvcnQgaW5pdGlhbGl6ZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbmNvcnJlY3RseQorICAgICogW1RIUklGVC0zNjUwXSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uIAorICAgICogW1RIUklGVC0zNzEzXSAtIGxpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGlzIGZsYWt5IG9uIEplbmtpbnMKKyAgICAqIFtUSFJJRlQtMzY2OF0gLSByYW5nZSBjaGVjayBlcnJvciBpbiBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM2NjNdIC0gQ01ha2UgY3BwIHRlc3QgZmFpbHMgdG8gYnVpbGQgb24gc3lzdGVtIHdpdGhvdXQgemxpYgorICAgICogW1RIUklGVC0zNzEyXSAtIFRUb3JuYWRvU2VydmVyIGNhbm5vdCBoYW5kbGUgSVB2NiBhZGRyZXNzCisgICAgKiBbVEhSSUZULTM3MTBdIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgY2FtZWwgY2FzZSBDb25zdGFudHMgY2xhc3MgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzY5N10gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBuYW1lIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtMzY5MF0gLSBXb3JrIGFyb3VuZCBkb2NrZXIgaW1hZ2UgYnVpbGQgZmFpbHVyZXMgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM2ODldIC0gdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQgc3RhcnQgZmFpbGVkIHdoZW4gc2VydmVyIGlzIG5vdCBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzY5NV0gLSBGaXggRCB0ZXN0IHNjcmlwdHMKKyAgICAqIFtUSFJJRlQtMzY3NV0gLSBVbmlvbiBpcyBub3Qgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgVGhyaWZ0IEMgR2xpYgorICAgICogW1RIUklGVC0zNjczXSAtIEFQSSBmYWlscyB3aXRoIHN0ZDo6ZXhjZXB0aW9uIGFmdGVyIGEgdGltZW91dCBvY2N1cmVkIGluIGVhcmxpZXIgYW55IEFQSSBjYWxsCisgICAgKiBbVEhSSUZULTM3MDldIC0gQ29tbWVudCBzeW50YXggY2FuIHByb2R1Y2UgYnJva2VuIGNvZGUKKyAgICAqIFtUSFJJRlQtMzcwNV0gLSBHbyBtYXAgaGFzIGluY29ycmVjdCB0eXBlcyB3aGVuIHVzZWQgd2l0aCBmb3J3YXJkLWRlZmluZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzcwMl0gLSBGaXggY3Jvc3MgdGVzdHMgZm9yIERhcnQgY29tcGFjdCBwcm90b2NvbCAoMyBmYWlsaW5nKQorICAgICogW1RIUklGVC0zNjgzXSAtIEJhZFlpZWxkRXJyb3IgaW4gdGhyaWZ0IHB5OnRvcm5hZG8gc2VydmVyCisgICAgKiBbVEhSSUZULTM2ODJdIC0gRG8gbm90IHJldXNlIHJlZnVzZWQgc29ja2V0cyBpbiB0ZXN0IHNjcmlwdHMKKyAgICAqIFtUSFJJRlQtMzY4MV0gLSBGaXggRGFydCB0dXRvcmlhbCBidWlsZAorICAgICogW1RIUklGVC0zNjgwXSAtIEphdmEgYXN5bmMgcHJvY2Vzc29yIGZhaWxzIHRvIG5vdGlmeSBlcnJvcnMgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNzE0XSAtIFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24gaXMgbm90IGRlZmluZWQgaW4ganMvc3JjL3RocmlmdC5qcworICAgICogW1RIUklGVC0zNjg4XSAtIEZpeCBzb2NrZXQgYmluZCBmYWlsdXJlIGRldGVjdGlvbiBvZiBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM2NDFdIC0gUnVieSBjbGllbnQgc2hvdWxkIHRyeSB0byBjb25uZWN0IHRvIGV2ZXJ5IHJlc3VsdCBvZiBnZXRhZGRyaW5mbworICAgICogW1RIUklGVC0zNjM1XSAtIEQgdHJhbnNwb3J0X3Rlc3QgaXMgZmxha3kgb24gSmVua2lucyBhbmQgVHJhdmlzCisgICAgKiBbVEhSSUZULTM2MThdIC0gUHl0aG9uIFRTU0xTb2NrZXQgZGVwcmVjYXRpb24gbWVzc2FnZSBzaG91bGQgcHJpbnQgY2FsbGVyJ3MgbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtMzE0NV0gLSBKU09OIHByb3RvY29sIGRvZXMgbm90IGhhbmRsZSBib29sIGFuZCBlbXB0eSBjb250YWluZXJzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMTU4XSAtIFRCYXNlPFQsRj4jZGVlcENvcHkgc2hvdWxkIHJldHVybiBUCisgICAgKiBbVEhSSUZULTMxNTddIC0gVEJhc2Ugc2lnbmF0dXJlIHNob3VsZCBiZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4KKyAgICAqIFtUSFJJRlQtMzE1Nl0gLSBOb2RlIFRMUzogc2VydmVyIGV4ZWN1dGVzIHByb2Nlc3NpbmcgbG9naWMgdHdvIGZ1bGwgdGltZXMKKyAgICAqIFtUSFJJRlQtMzE1NF0gLSB0dXRvcmlhbC9weS50b3JuYWRvIHRocm93IEVPRiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzA2M10gLSBDKysgYnVpbGQgLVd1bnVzZWQtcGFyYW1ldGVyIHdhcm5pbmdzIG9uIHByb2Nlc3Nvcl90ZXN0LCBUcmFuc3BvcnRUZXN0CisgICAgKiBbVEhSSUZULTMwNTZdIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdHMgZm9yIFB5dGhvbiBwcm90b2NvbCByZWFkZXJzCisgICAgKiBbVEhSSUZULTMyMzddIC0gRml4IFROYW1lZFBpcGVTZXJ2ZXI6OmNyZWF0ZU5hbWVkUGlwZSBtZW1vcnkgbGVhaworICAgICogW1RIUklGVC0zMjMzXSAtIEZpeCBDKysgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2VyIHdvcmtlciBqb2luCisgICAgKiBbVEhSSUZULTMyMzJdIC0gQ2Fubm90IGRlc2VyaWFsaXplIGpzb24gbWVzc2FnZXMgY3JlYXRlZCB3aXRoIGZpZWxkTmFtZXNBc1N0cmluZyAKKyAgICAqIFtUSFJJRlQtMzIwNl0gLSBGaXggVmlzdWFsIFN0dWRpbyBidWlsZCBmYWlsdXJlIGR1ZSAncHRocmVhZF9zZWxmJzogaWRlbnRpZmllciBub3QgZm91bmQKKyAgICAqIFtUSFJJRlQtMzIwMF0gLSBKUyBhbmQgbm9kZWpzIGRvIG5vdCBlbmNvZGUgSlNPTiBwcm90b2NvbCBiaW5hcnkgZmllbGRzIGFzIGJhc2U2NAorICAgICogW1RIUklGVC0zMTk5XSAtIEV4Y2VwdGlvbiBmaWVsZCBoYXMgYmFzaWMgbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMzE4Ml0gLSBURnJhbWVkVHJhbnNwb3J0IGlzIGluIGFuIGludmFsaWQgc3RhdGUgYWZ0ZXIgZnJhbWUgc2l6ZSBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjUzNl0gLSBuZXcgVFNvY2tldCwgdW5pbml0aWFsaXNlZCB2YWx1ZSByZXBvcnRlZCBieSB2YWxncmluZAorICAgICogW1RIUklGVC0yNTI3XSAtIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBOb2RlLmpzIHNob3VsZCBiZSBqc2hpbnQgY2xlYW4KKyAgICAqIFtUSFJJRlQtMjUxOV0gLSAicHJvY2Vzc29yIiBjbGFzcyBpcyBub3QgYmVpbmcgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTI0MzFdIC0gVEZpbGVUcmFuc3BvcnRUZXN0IGZhaWxzIHdpdGggImNoZWNrIGRlbHRhIDwgWFhYIGZhaWxlZCIKKyAgICAqIFtUSFJJRlQtMjcwOF0gLSBFcmxhbmcgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0ICJvbmV3YXkiIG1lc3NhZ2UgdHlwZQorICAgICogW1RIUklGVC0zMzc3XSAtIERlZXAgY29weSBpcyBhY3R1YWxseSBzaGFsbG93IHdoZW4gdXNpbmcgdHlwZWRlZiBtZW1iZXJzCisgICAgKiBbVEhSSUZULTMzNzZdIC0gQyMgYW5kIFB5dGhvbiBKU09OIHByb3RvY29sIGRvdWJsZSB2YWx1ZXMgbG9zZSBwcmVjaXNpb24KKyAgICAqIFtUSFJJRlQtMzM3M10gLSBWYXJpb3VzIGZpeGVzIGZvciBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzM3MF0gLSBlcnJubyBleHRlcm4gdmFyaWFibGUgcmVkZWZpbmVkLiBOb3QgY29tcGlsaW5nIGZvciBBbmRyb2lkCisgICAgKiBbVEhSSUZULTMzNzldIC0gIFBvdGVudGlhbCBvdXQgb2YgcmFuZ2UgcGFuaWMgaW4gR28gSlNPTiBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzM3MV0gLSBBYnN0cmFjdCBuYW1lc3BhY2UgVW5peCBkb21haW4gc29ja2V0cyBicm9rZW4gaW4gQysrCisgICAgKiBbVEhSSUZULTMzODBdIC0gbm9kZWpzOiAwLjkuMiAtPiAwLjkuMyB1cGdyYWRlIGJyZWFrcyBQcm90b2NvbCBhbmQgVHJhbnNwb3J0IHJlcXVpcmVzCisgICAgKiBbVEhSSUZULTMzNjddIC0gRml4IGJhZCBsaW5rcyB0byBjb2Rpbmdfc3RhbmRhcmRzLm1kICM2MzQgCisgICAgKiBbVEhSSUZULTM0MDFdIC0gTmVzdGVkIGNvbGxlY3Rpb25zIGVtaXQgT2JqZWN0aXZlLUMgY29kZSB0aGF0IGNhbm5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTM0MDNdIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMKKyAgICAqIFtUSFJJRlQtMzM2Ml0gLSBtYWtlIGNoZWNrIGZhaWxzIGZvciBDKysgYXQgdGhlIFNlY3VyaXR5VGVzdAorICAgICogW1RIUklGVC0zMzk1XSAtIENvY29hIGNvbXBpbGVyIHByb2R1Y2VzIGNvcnJ1cHQgY29kZSB3aGVuIGJveGluZyBlbnVtcyBpbnNpZGUgbWFwLgorICAgICogW1RIUklGVC0zMzk0XSAtIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0zMzg4XSAtIGhhc2ggZG9lc24ndCB3b3JrIG9uIHNldC9saXN0CisgICAgKiBbVEhSSUZULTMzOTFdIC0gV3JvbmcgYm9vbCBmb3JtYXR0aW5nIGluIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTMzOTBdIC0gVFRvcm5hZG8gc2VydmVyIGRvZXNuJ3QgaGFuZGxlIGNsb3NlZCBjb25uZWN0aW9ucyBwcm9wZXJseQorICAgICogW1RIUklGVC0zMzgyXSAtIFRCYXNlIGNsYXNzIGZvciBDKysgTGlicmFyeQorICAgICogW1RIUklGVC0zMzkyXSAtIEphdmEgVFpsaWJUcmFuc3BvcnQgZG9lcyBub3QgY2xvc2UgaXRzIHdyYXBwZXIgc3RyZWFtcyB1cG9uIGNsb3NlKCkKKyAgICAqIFtUSFJJRlQtMzM4M10gLSBpNjQgcmVsYXRlZCB3YXJuaW5ncyAKKyAgICAqIFtUSFJJRlQtMzM4Nl0gLSBtaXNjLiB3YXJuaW5ncyB3aXRoIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzM4NV0gLSB3YXJuaW5nOiBmb3JtYXQg4oCYJWx14oCZIGV4cGVjdHMg4oCYbG9uZyB1bnNpZ25lZCBpbnTigJksIGJ1dCBoYXMgdHlwZSDigJhzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjo6c2l6ZV90eXBlIHtha2EgdW5zaWduZWQgaW50fQorICAgICogW1RIUklGVC0zMzU1XSAtIG5wbSBXQVJOIHBhY2thZ2UuanNvbiB0aHJpZnRAMS4wLjAtZGV2IE5vIGxpY2Vuc2UgZmllbGQuCisgICAgKiBbVEhSSUZULTMzNjBdIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMgZnVydGhlcgorICAgICogW1RIUklGVC0zMzU5XSAtIEJpbmFyeSBmaWVsZCBpbmNvbXBhdGliaWxpdGllcworICAgICogW1RIUklGVC0zMzU0XSAtIEZpeCB3b3JkLWV4dHJhY3Rpb24gc3Vic3RyIGJ1ZyBpbiBpbml0aWFsaXNtIGNvZGUKKyAgICAqIFtUSFJJRlQtMzM1MF0gLSBQeXRob24gSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBlbmNvZGUgYmluYXJ5IGFzIEJhc2U2NAorICAgICogW1RIUklGVC0zNTc3XSAtIGFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSA1MTIgb2YgdGVzdGNvbnRhaW5lcnRlc3QuYworICAgICogW1RIUklGVC0zNTc2XSAtIEJvb3N0IHRlc3QgLS1sb2dfZm9ybWF0IGFyZyBkb2VzIG5vdCBhY2NlcHQgbG93ZXJjYXNlCisgICAgKiBbVEhSSUZULTM1NzVdIC0gR28gY29tcGlsZXIgdHJpZXMgdG8gdXNlIHVuZXhwb3J0ZWQgbGlicmFyeSBtZXRob2RzIHdoZW4gdXNpbmcgcmVhZF93cml0ZV9wcml2YXRlCisgICAgKiBbVEhSSUZULTM1NzRdIC0gQ29jb2EgZ2VuZXJhdG9yIG1ha2VzIHVuY29tcGlsYWJsZSBpbXBvcnRzCisgICAgKiBbVEhSSUZULTM1NzBdIC0gUmVtb3ZlIGR1cGxpY2F0ZSBpbnN0YW5jZXMgdGhhdCBhcmUgYWRkZWQgYnkgdXBzdHJlYW0KKyAgICAqIFtUSFJJRlQtMzU3MV0gLSBNYWtlIGZlYXR1cmUgdGVzdCByZXN1bHQgYnJvd3NhYmxlCisgICAgKiBbVEhSSUZULTM1NjldIC0gY19nbGliIHByb3RvY29scyBkbyBub3QgY2hlY2sgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM1NjhdIC0gVEhlYWRlciBzZXJ2ZXIgY3Jhc2hlcyBvbiByZWFkU2xvdworICAgICogW1RIUklGVC0zNTY3XSAtIEdMaWItR09iamVjdC1DUklUSUNBTCAqKjogZ19vYmplY3RfdW5yZWY6IGFzc2VydGlvbiAnR19JU19PQkpFQ1QgKG9iamVjdCknIGZhaWxlZAorICAgICogW1RIUklGVC0zNTY2XSAtIEMrKy9RdDogVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgaXMgbmV2ZXIgZXhlY3V0ZWQKKyAgICAqIFtUSFJJRlQtMzU2NF0gLSBDKysvUXQ6IHBvdGVudGlhbCBjb3JlIGR1bXAgaW4gVFFUY3BTZXJ2ZXIgaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzIGluIFRBc3luY1Byb2Nlc3Nvcjo6cHJvY2VzcygpCisgICAgKiBbVEhSSUZULTM1NThdIC0gdHlwb3MgaW4gY19nbGliIHRlc3RzCisgICAgKiBbVEhSSUZULTM1NTldIC0gRml4IGF3a3dhcmQgZXh0cmEgc2VtaS1jb2xvbnMgd2l0aCBDb2NvYSBjb250YWluZXIgbGl0ZXJhbHMKKyAgICAqIFtUSFJJRlQtMzU1NV0gLSAnY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3QgaG9ub3IgLS13aXRoLW9wZW5zc2w9PHBhdGg+IGZvciBsaWJjcnlwdG8gZm9yIEJOX2luaXQKKyAgICAqIFtUSFJJRlQtMzU1NF0gLSBDb25zdGFudCBkZWNscyBtYXkgbGVhZCB0byAiRXJyb3I6IGludGVybmFsIGVycm9yOiBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKSBhbHJlYWR5IGFjdGl2ZSBmb3IgZGlmZmVyZW50IHN0cnVjdCIKKyAgICAqIFtUSFJJRlQtMzU1Ml0gLSBnbGliX2MgTWVtb3J5IExlYWsKKyAgICAqIFtUSFJJRlQtMzU1MV0gLSBUaHJpZnQgcGVybCBsaWJyYXJ5IG1pc3NpbmcgcGFja2FnZSBkZWNsYXJhdGlvbgorICAgICogW1RIUklGVC0zNTQ5XSAtIEV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBzdHJpbmdpZmllZCBpbiBQZXJsIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzU0Nl0gLSBOb2RlSlMgY29kZSBzaG91bGQgbm90IGJlIG5hbWVzcGFjZWQgKGFuZCBpcyBjdXJyZW50bHkgbm90IHN0cmljdC1tb2RlIGNvbXBsaWFudCkKKyAgICAqIFtUSFJJRlQtMzU0NV0gLSBDb250YWluZXIgdHlwZSBsaXRlcmFscyBkbyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zNTM4XSAtIFJlbW92ZSBVbmJvdW5kTWV0aG9kVHlwZSBpbiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAqIFtUSFJJRlQtMzUzNl0gLSBFcnJvciAnY2hhcicgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdJc0xvd1N1cnJvZ2F0ZScgZm9yIFdQNyB0YXJnZXQKKyAgICAqIFtUSFJJRlQtMzUzNF0gLSBMaW5rIGVycm9yIHdoZW4gYnVpbGRpbmcgd2l0aCBRdDUKKyAgICAqIFtUSFJJRlQtMzUzM10gLSBDYW4gbm90IHNlbmQgbmlsIHBvaW50ZXIgYXMgc2VydmljZSBtZXRob2QgYXJndW1lbnQKKyAgICAqIFtUSFJJRlQtMzUwN10gLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAqIFtUSFJJRlQtMzUwMl0gLSBDKysgVFNlcnZlclNvY2tldCBwYXNzZXMgc21hbGwgYnVmZmVyIHRvIGdldHNvY2tuYW1lCisgICAgKiBbVEhSSUZULTM1MDFdIC0gRm9yd2FyZCBzbGFzaCBpbiBjb21tZW50IGNhdXNlcyBjb21waWxlciBlcnJvcgorICAgICogW1RIUklGVC0zNDk4XSAtIEMrKyBsaWJyYXJ5IGFzc3VtZXMgb3B0aW9uYWwgZnVuY3Rpb24gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGlzIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNDk3XSAtIEJ1aWxkIGZhaWxzIHdpdGggImludmFsaWQgdXNlIG9mIGluY29tcGxldGUgdHlwZSIKKyAgICAqIFtUSFJJRlQtMzQ5Nl0gLSBDKys6IENvYiBzdHlsZSBjbGllbnQgZmFpbHMgd2hlbiBzZW5kaW5nIGEgY29uc2VjdXRpdmUgcmVxdWVzdAorICAgICogW1RIUklGVC0zNDkzXSAtIGxpYnRocmlmdCBkb2VzIG5vdCBjb21waWxlIG9uIHdpbmRvd3MgdXNpbmcgdmlzdWFsIHN0dWRpbworICAgICogW1RIUklGVC0zNDg4XSAtIHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAncHJvZ3JhbScKKyAgICAqIFtUSFJJRlQtMzQ4OV0gLSB3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyBbLVd3cml0ZS1zdHJpbmdzXQorICAgICogW1RIUklGVC0zNDg3XSAtIEZ1bGwgc3VwcG9ydCBmb3IgbmV3ZXIgRGVscGhpIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTM1MjhdIC0gRml4IHdhcm5pbmdzIGluIHRocmlmdC5sbAorICAgICogW1RIUklGVC0zNTI3XSAtIC1nZW4gcHk6ZHluYW1pYyx1dGY4c3RyaW5ncyBpZ25vcmVzIHV0ZjhzdHJpbmdzIG9wdGlvbgorICAgICogW1RIUklGVC0zNTI2XSAtIENvZGUgZ2VuZXJhdGVkIGJ5IHB5OnV0ZjhzdHJpbmdzIGRvZXMgbm90IHdvcmsgZm9yIFB5dGhvbjMKKyAgICAqIFtUSFJJRlQtMzUyNF0gLSBkY2MzMiB3YXJuaW5nICJXMTAwMCBTeW1ib2wgJ0lzTG93U3Vycm9nYXRlJyBpcyBkZXByZWNhdGVkOiAnVXNlIFRDaGFySGVscGVyJyIgaW4gVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCisgICAgKiBbVEhSSUZULTM1MjVdIC0gcHk6ZHluYW1pYyBmYWlscyB0byBoYW5kbGUgYmluYXJ5IGxpc3Qvc2V0L21hcCBlbGVtZW50CisgICAgKiBbVEhSSUZULTM1MjFdIC0gVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgaXMgbm90IGRldGVybWluaXN0aWMgKGZhaWxzIHdoZW4gcnVuIG9uIEpESyA4KQorICAgICogW1RIUklGVC0zNTIwXSAtIERhcnQgVFNvY2tldCBvbkVycm9yIHN0cmVhbSBzaG91bGQgYmUgdHlwZWQgYXMgT2JqZWN0CisgICAgKiBbVEhSSUZULTM1MTldIC0gZmFzdGJpbmFyeSBkb2VzIG5vdCB3b3JrIHdpdGggLWdlbiBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC0zNTE4XSAtIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gZmlsZXMgd2VyZSBtaXNzaW5nIGZvciBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTM1MTJdIC0gY19nbGliOiBCdWlsZCBmYWlscyBkdWUgdG8gbWlzc2luZyBmZWF0dXJlcy5oCisgICAgKiBbVEhSSUZULTM0ODNdIC0gSW5jb3JyZWN0IGVtcHR5IGJpbmFyeSBoYW5kbGluZyBpbnRyb2R1Y2VkIGJ5IFRIUklGVC0zMzU5CisgICAgKiBbVEhSSUZULTM0NzldIC0gT25ld2F5IGNhbGxzIHNob3VsZCBub3QgcmV0dXJuIGV4Y2VwdGlvbnMgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNDc4XSAtIFJlc3RvcmUgZHJvcHBlZCBtZXRob2QgdG8gVEhzSGFTZXJ2ZXIuamF2YQorICAgICogW1RIUklGVC0zNDc3XSAtIFBhcnNlciBmYWlscyBvbiBlbnVtIGl0ZW0gdGhhdCBzdGFydHMgd2l0aCAnRScgbGV0dGVyIGFuZCBjb250aW51ZXMgd2l0aCBudW1iZXIgCisgICAgKiBbVEhSSUZULTM0NzZdIC0gTWlzc2luZyBpbmNsdWRlIGluIC4vc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorICAgICogW1RIUklGVC0zNDc0XSAtIERvY2tlcjogdGhyaWZ0LWNvbXBpbGVyCisgICAgKiBbVEhSSUZULTM0NzNdIC0gV2hlbiAib3B0aW9uYWwnIGlzIHVzZWQgd2l0aCBhIHN0cnVjdCBtZW1iZXIsIEMrKyBzZXJ2ZXIgc2VlbXMgdG8gbm90IHJldHVybiBpdCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzQ2OF0gLSBEYXJ0IFRTb2NrZXRUcmFuc3BvcnQgb25FcnJvciBoYW5kbGVyIGlzIHRvbyByZXN0cmljdGl2ZQorICAgICogW1RIUklGVC0zNDUxXSAtIHRocmlmdF9wcm90b2NvbCBQSFAgZXh0ZW5zaW9uIG1pc3NpbmcgY29uZmlnLm00IGZpbGUKKyAgICAqIFtUSFJJRlQtMzQ1Nl0gLSByb3VuZGluZyBpc3N1ZSBpbiBzdGF0aWMgYXNzZXJ0CisgICAgKiBbVEhSSUZULTM0NTVdIC0gc3RydWN0IHdyaXRlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBpcyBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMzQ1NF0gLSBQeXRob24gVG9ybmFkbyB0dXRvcmlhbCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzQ2M10gLSBKYXZhIGNhbid0IGJlIGRpc2FibGVkIGluIENNYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTM0NTBdIC0gTlBFIHdoZW4gdXNpbmcgU1NMCisgICAgKiBbVEhSSUZULTM0NDldIC0gVEJhc2VBc3luY1Byb2Nlc3NvciBmYi5yZXNwb25zZVJlYWR5KCkgbmV2ZXIgY2FsbGVkIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTM0NzFdIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIHVwcGVyY2FzZSBhcmd1bWVudCBuYW1lcworICAgICogW1RIUklGVC0zNDcwXSAtIFNwb3JhZGljIHRpbWVvdXRzIHdpdGggcGlwZXMKKyAgICAqIFtUSFJJRlQtMzQ2NV0gLSBHbyBDb2RlIFdpdGggQ29tcGxleCBDb25zdCBJbml0aWFsaXplciBDb21waWxhdGlvbiBEZXBlbmRzIE9uIFN0cnVjdCBPcmRlcgorICAgICogW1RIUklGVC0zNDY0XSAtIEZpeCBzZXZlcmFsIGRlZmVjdHMgaW4gY19nbGliIGNvZGUgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM0NjJdIC0gQ29jb2EgZ2VuZXJhdGVzIEluY29ycmVjdCAjaW1wb3J0IGhlYWRlciBuYW1lcworICAgICogW1RIUklGVC0zNDUzXSAtIHJlbW92ZSByYXRfZXhjbHVkZQorICAgICogW1RIUklGVC0zNDE4XSAtIFVzZSBvZiBjaXBoZXJzIGluIHNzbC53cmFwX3NvY2tldCgpIGJyZWFrcyBweXRob24gMi42IGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMzQxN10gLSAibmFtZXNwYWNlIHhzZCIgaXMgbm90IHJlYWxseSB3b3JraW5nCisgICAgKiBbVEhSSUZULTM0MTNdIC0gVGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gR28gd2hlbiBleHRlbmRpbmcgc2VydmljZQorICAgICogW1RIUklGVC0zNDIwXSAtIEMrKzogVFNTTFNvY2tldHMgYXJlIG5vdCBpbnRlcnJ1cHRhYmxlCisgICAgKiBbVEhSSUZULTM0MTVdIC0gaW5jbHVkZSB1bmlzdGQuaCBjb25kaXRpb25hbGx5CisgICAgKiBbVEhSSUZULTM0MTRdIC0gI2luY2x1ZGUgPHB3ZC5oPiBpbiBUSGVhZGVyVHJhbnNwb3J0LmggYnJlYWtzIHdpbmRvd3MgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzQxMV0gLSBHbyBnZW5lcmF0ZXMgcmVtb3RlcyB3aXRoIHdyb25nIHBhY2thZ2UgcXVhbGlmaWVycyB3aGVuIGluY2x1ZGluZworICAgICogW1RIUklGVC0zNDMwXSAtIEdvIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlYWQgSFRUUCByZXNwb25zZSBib2R5IHRvIGNvbXBsZXRpb24gd2hlbiBjbG9zaW5nCisgICAgKiBbVEhSSUZULTM0MjNdIC0gRmlyc3QgY2FsbCB0byB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QgZmFpbHMgdG8gZGlzcGF0Y2ggY29ycmVjdCBmdW5jdGlvbgorICAgICogW1RIUklGVC0zNDIyXSAtIEdvIFRTZXJ2ZXJTb2NrZXQgZG9lc24ndCBjbG9zZSBvbiBJbnRlcnJ1cHQKKyAgICAqIFtUSFJJRlQtMzQyMV0gLSByZWJhciBhcyBkZXBlbmRlbmN5IGluc3RlYWQgb2YgYnVuZGxpbmcgKHdhczogIHJlYmFyIGZhaWxzIGlmIFBXRCBjb250YWlucyBVbmljb2RlKQorICAgICogW1RIUklGVC0zNDI4XSAtIEdvIHRlc3QgZmFpbHMgd2hlbiBydW5uaW5nIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzQ0NV0gLSBUaHJvd2FibGUgbWVzc2FnZXMgYXJlIGhpZGRlbiBmcm9tIEpWTSBzdGFjayB0cmFjZSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMzQ0M10gLSBUaHJpZnQgaW5jbHVkZSBjYW4gZ2VuZXJhdGUgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzQ0NF0gLSBMYXJnZSA2NCBiaXQgSW50ZWdlciBkb2VzIG5vdCBwcmVzZXJ2ZSB2YWx1ZSB0aHJvdWdoIE5vZGUuanMgSlNPTlByb3RvY29sIAorICAgICogW1RIUklGVC0zNDM2XSAtIG1pc2MuIGNyb3NzIHRlc3QgaXNzdWVzIHdpdGggVVRGLTggcGF0aCBuYW1lcworICAgICogW1RIUklGVC0zNDM1XSAtIFB1dCBnZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBmdWxsY2FtZWwgdGVzdHMgaW4gYSBzZXBhcmF0ZSBwYWNrYWdlL25hbWVzcGFjZQorICAgICogW1RIUklGVC0zNDMzXSAtIERvdWJsZXMgYXJlbid0IGludGVycHJldGVkIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNDM3XSAtIE1pbmd3LXc2NCBidWlsZCBmYWlsCisgICAgKiBbVEhSSUZULTM0MzRdIC0gRGFydCBnZW5lcmF0b3IgcHJvZHVjZXMgZW1wdHkgbmFtZSBpbiBwdWJzcGVjLnlhbWwgZm9yIGluY2x1ZGVzIHdpdGhvdXQgbmFtZXNwYWNlcworICAgICogW1RIUklGVC0zNDA4XSAtIEpTT04gZ2VuZXJhdG9yIGVtaXRzIGluY29ycmVjdCB0eXBlcworICAgICogW1RIUklGVC0zNDA2XSAtIENvY29hIGNsaWVudCBzaG91bGQgbm90IHNjaGVkdWxlIHN0cmVhbXMgb24gbWFpbiBydW5sb29wCisgICAgKiBbVEhSSUZULTM0MDRdIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorICAgICogW1RIUklGVC0zNjM2XSAtIERvdWJsZSBwcmVjaXNpb24gaXMgbm90IGZ1bGx5IHByZXNlcnZlZCBpbiBDKysgVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zNjMyXSAtIGNfZ2xpYiB0ZXN0c2VyaWFsaXphdGlvbiBmYWlscyB3aXRoIGdsaWIgYXNzZXJ0aW9uCisgICAgKiBbVEhSSUZULTM2MTldIC0gVXNpbmcgVGhyaWZ0IDAuOS4zIHdpdGggZ29vZ2xldGVzdCBvbiBMaW51eCBnY2MgNC45IC8gQysrMTEKKyAgICAqIFtUSFJJRlQtMzYxN10gLSBDTWFrZSBkb2VzIG5vdCBidWlsZCBndi94bWwgZ2VuZXJhdG9ycworICAgICogW1RIUklGVC0zNjE1XSAtIEZpeCBQeXRob24gU1NMIGNsaWVudCByZXNvdXJjZSBsZWFrIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0zNjE2XSAtIGxpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5IGlzIGZsYWt5CisgICAgKiBbVEhSSUZULTM2NDNdIC0gUGVybCBTU0wgc2VydmVyIGNydXNoZXMgaWYgYSBjbGllbnQgZGlzY29ubmVjdCB3aXRob3V0IGhhbmRzaGFrZQorICAgICogW1RIUklGVC0zNjM5XSAtIEMjIFRocmlmdCBsaWJyYXJ5IGZvcmNlcyBUTFMgMS4wLCB0aHdhcnRpbmcgVExTIDEuMiB1c2FnZQorICAgICogW1RIUklGVC0zNjMzXSAtIFRyYXZpcyAiQyBDKysgLSBHQ0MiIGJ1aWxkIHdhcyB1c2luZyBjbGFuZworICAgICogW1RIUklGVC0zNjM0XSAtIEZpeCBQeXRob24gVFNvY2tldCByZXNvdXJjZSBsZWFrIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0zNjMwXSAtIERlYmlhbi9VYnVudHUgaW5zdGFsbCBkb2NzIG5lZWQgYW4gdXBkYXRlCisgICAgKiBbVEhSSUZULTM2MjldIC0gUGFyc2VyIHNldHMgZXhpdGNvZGUgb24gZXJyb3JzLCBidXQgZ2VuZXJhdG9yIGRvZXMgbm90CisgICAgKiBbVEhSSUZULTM2MDhdIC0gbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdCBpcyBmbGFreSBpbiBqZW5raW5zIFRocmlmdC1wcmVjb21taXQgYnVpbGQuCisgICAgKiBbVEhSSUZULTM2MDFdIC0gQmV0dGVyIGNvbmZvcm1hbmNlIHRvIFBFUDggZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTM1OTldIC0gVmFsaWRhdGUgY2xpZW50IElQIGFkZHJlc3MgYWdhaW5zdCBjZXJ0J3MgU3ViamVjdEFsdE5hbWUKKyAgICAqIFtUSFJJRlQtMzU5OF0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZG9lc24ndCBpbnN0YW50aWF0ZSBjbGllbnQgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0zNTk3XSAtIGBtYWtlIGNoZWNrYCBoYW5ncyBpbiBnbyB0ZXN0cworICAgICogW1RIUklGVC0zNTg5XSAtIERhcnQgZ2VuZXJhdG9yIHVzZXMgd3JvbmcgbmFtZSBpbiBjb25zdHJ1Y3RvciBmb3IgdXBwZXJjYXNlIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHRzCisgICAgKiBbVEhSSUZULTM1ODhdIC0gVXNpbmcgVHlwZVNjcmlwdCB3aXRoIC0tbm9JbXBsaWNpdEFueSBmYWlscworICAgICogW1RIUklGVC0zNTg0XSAtIGJvb2xlYW4gZmFsc2UgdmFsdWUgY2Fubm90IGJlIHRyYW5zZmVycmVkCisgICAgKiBbVEhSSUZULTM1NzhdIC0gTWFrZSBUSGVhZGVyVHJhbnNwb3J0IGRldGVjdCBUQ29tcGFjdCBmcmFtZWQgYW5kIHVuZnJhbWVkCisgICAgKiBbVEhSSUZULTMzMjNdIC0gUHl0aG9uIGxpYnJhcnkgZG9lcyBub3QgaGFuZGxlIGVzY2FwZWQgZm9yd2FyZCBzbGFzaCAoIi8iKSBpbiBKU09OCisgICAgKiBbVEhSSUZULTMzMjJdIC0gQ01ha2UgZ2VuZXJhdGVkICJtYWtlIGNoZWNrIiBmYWlsZXMgb24gcHl0aG9uX3Rlc3QKKyAgICAqIFtUSFJJRlQtMzMyMV0gLSBUaHJpZnQgY2FuJ3QgYmUgYWRkZWQgYXMgYSBzdWJkaXJlY3Rvcnkgb2YgYW5vdGhlciBDTWFrZS1iYXNlZCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTMzMTRdIC0gRG90cyBpbiBmaWxlIG5hbWVzIG9mIGluY2x1ZGVzIGNhdXNlcyBkb3RzIGluIGphdmFzY3JpcHQgdmFyaWFibGUgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzMwN10gLSBTZWdmYXVsdCBpbiBSdWJ5IHNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMzMwOV0gLSBNaXNzaW5nIFRDb25zdGFudC5waHAgaW4gL2xpYi9waHAvTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMzgxMF0gLSB1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbCBwdWJsaWM6IHZpcnR1YWwgdm9pZCBfX2NkZWNsIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKHZvaWQpCisgICAgKiBbVEhSSUZULTM3MzZdIC0gQysrIGxpYnJhcnkgYnVpbGQgZmFpbHMgaWYgT3BlblNTTCBkb2VzIG5vdCBzdXJycG90IFNTTHYzCisgICAgKiBbVEhSSUZULTM4NzhdIC0gQ29tcGlsZSBlcnJvciBpbiBUU1NMU29ja2V0LmNwcCB3aXRoIG5ldyBPcGVuU1NMIFtDUllQVE9fbnVtX2xvY2tzXQorICAgICogW1RIUklGVC0zOTQ5XSAtIG1pc3NpbmcgbWFrZSBkaXN0IGVudHJ5IGZvciBjb21waWxlci9jcHAvdGVzdAorICAgICogW1RIUklGVC00NDldIC0gVGhlIHdpcmUgZm9ybWF0IG9mIHRoZSBKU09OIFByb3RvY29sIG1heSBub3QgYWx3YXlzIGJlIHZhbGlkIEpTT04gaWYgaXQgY29udGFpbnMgbm9uLVVURjggZW5jb2RlZCBzdHJpbmdzCisgICAgKiBbVEhSSUZULTE2Ml0gLSBUaHJpZnQgc3RydWN0dXJlcyBhcmUgdW5oYXNoYWJsZSwgcHJldmVudGluZyB0aGVtIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMKKyAgICAqIFtUSFJJRlQtMzk2MV0gLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGlmIGFuIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBtZXNzYWdlIG9jY3VyZXMuCisgICAgKiBbVEhSSUZULTM4ODFdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgZmFpbGluZyBkdWUgdG8gZG9ja2VyIGZhaWx1cmVzICh0aHJlZSByZXRyaWVzLCBhbmQgZ2l2ZXMgdXApCisgICAgKiBbVEhSSUZULTM5MzddIC0gQ2Fubm90IGNvbXBpbGUgMC4xMC4wIGRldmVsb3BtZW50IHRpcCB3aXRoIGdjYy00LjYueAorICAgICogW1RIUklGVC0zOTY0XSAtIFVuc3VwcG9ydGVkIG1lY2hhbmlzbSB0eXBlID8/Pz8/IGR1ZSB0byBkZXBlbmRlbmN5IG9uIGRlZmF1bHQgT1MtZGVwZW5kZW50IGNoYXJzZXQKKyAgICAqIFtUSFJJRlQtMzAzOF0gLSBVc2Ugb2Ygdm9sYXRpbGUgaW4gY3BwIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzMwMV0gLSBKYXZhIGdlbmVyYXRlZCBjb2RlIHVzZXMgaW1wb3J0cyB0aGF0IGNhbiBsZWFkIHRvIGNsYXNzIG5hbWUgY29sbGlzaW9ucyB3aXRoIElETCBkZWZpbmVkIHR5cGVzCisgICAgKiBbVEhSSUZULTMzNDhdIC0gUEhQIFRDb21wYWN0UHJvdG9jb2wgYm9vbCZpbnQ2NCByZWFkdmFsdWUgYnVnCisgICAgKiBbVEhSSUZULTM5NTVdIC0gVFRocmVhZGVkU2VydmVyIE1lbW9yeSBMZWFrCisgICAgKiBbVEhSSUZULTM4MjldIC0gVGhyaWZ0IGRvZXMgbm90IGluc3RhbGwgUHl0aG9uIExpYnJhcmllcyBpZiBUd2lzdGVkIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMzkzMl0gLSBDKysgVGhyZWFkTWFuYWdlciBoYXMgYSByYXJlIHRlcm1pbmF0aW9uIHJhY2UKKyAgICAqIFtUSFJJRlQtMzgyOF0gLSBjbWFrZSBmYWlscyB3aGVuIEJvb3N0X0lOQ0xVREVfRElSUyAoYW5kIG90aGVyIHZhcmlhYmxlcyBwYXNzZWQgdG8gaW5jbHVkZV9kaXJlY3RvcmllcygpKSBpcyBlbXB0eSAKKyAgICAqIFtUSFJJRlQtMzk1OF0gLSBDTWFrZSBXSVRIX01UIG9wdGlvbiBmb3Igd2luZG93cyBzdGF0aWMgcnVudGltZSBsaW5raW5nIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNtYWtlIGJ1aWxkIHR5cGUgUmVsV2l0aERlYkluZm8KKyAgICAqIFtUSFJJRlQtMzk1N10gLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IGRpc2Nvbm5lY3QgZnJvbSBjbGllbnRzIHdoZW4gdGhlaXIgdGltZW91dCBpcyByZWFjaGVkLgorICAgICogW1RIUklGVC0zOTUzXSAtIFRTU0xTb2NrZXQ6OmNsb3NlIHNob3VsZCBoYW5kbGUgZXhjZXB0aW9ucyBmcm9tIHdhaXRGb3JFdmVudCBiZWNhdXNlIGl0IGlzIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KKyAgICAqIFtUSFJJRlQtMzk3N10gLSBQSFAgZXh0ZW5zaW9uIGNyZWF0ZXMgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGRlc2VyaWFsaXppbmcgc2V0cworICAgICogW1RIUklGVC0zOTQ3XSAtIHNvY2thZGRyIHR5cGUgaXNuJ3QgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIHJldHVybiBvZiBnZXRzb2NrbmFtZQorICAgICogW1RIUklGVC0yNzU1XSAtIFRocmVhZFNhbml0aXplciByZXBvcnRzIGRhdGEgcmFjZSBpbiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIKKyAgICAqIFtUSFJJRlQtMzk0OF0gLSBlcnJubyBpcyBub3QgdGhlIGNvcnJlY3QgbWV0aG9kIG9mIGdldHRpbmcgdGhlIGVycm9yIGluIHdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDAwOF0gLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworICAgICogW1RIUklGVC0zOTk5XSAtIEZpeCBEZWJpYW4gJiBVYnVudHUgcGFja2FnZSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMzg4Nl0gLSBQSFAgY3Jvc3MgdGVzdCBjbGllbnQgcmV0dXJucyAwIGV2ZW4gd2hlbiBmYWlsaW5nCisgICAgKiBbVEhSSUZULTM5OTddIC0gYnVpbGRpbmcgdGhyaWZ0IGxpYnMgZG9lcyBub3Qgc3VwcG9ydCBuZXcgb3BlbnNzbAorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTM4NjddIC0gU3BlY2lmeSBCaW5hcnlQcm90b2NvbCBhbmQgQ29tcGFjdFByb3RvY29sCisKKyMjIEVwaWMKKyAgICAqIFtUSFJJRlQtMzA0OV0gLSBBcyBhbiBpT1MgZGV2ZWxvcGVyLCBJIHdhbnQgYSBnZW5lcmF0b3IgYW5kIGxpYnJhcnkgdGhhdCBwcm9kdWNlcyBTd2lmdCBjb2RlCisgICAgKiBbVEhSSUZULTIzMzZdIC0gVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE4NjddIC0gUHl0aG9uIGNsaWVudC9zZXJ2ZXIgc2hvdWxkIHN1cHBvcnQgY2xpZW50LXNpZGUgY2VydGlmaWNhdGVzLgorICAgICogW1RIUklGVC0xMzEzXSAtIGNfZ2xpYiBjb21wYWN0IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTM4NV0gLSBtYWtlIGluc3RhbGwgZG9lc24ndCBpbnN0YWxsIGphdmEgbGlicmFyeSBpbiB0aGUgc2V0dGVkIGZvbGRlcgorICAgICogW1RIUklGVC0xNDM3XSAtIFVwZGF0ZSBSUE0gc3BlYworICAgICogW1RIUklGVC04NDddIC0gVGVzdCBGcmFtZXdvcmsgaGFybW9uaXphdGlvbiBhY3Jvc3MgYWxsIGxhbmd1YWdlcworICAgICogW1RIUklGVC04MTldIC0gYWRkIEVudW1lcmF0aW9uIGZvciBwcm90b2NvbCwgdHJhbnNwb3J0IGFuZCBzZXJ2ZXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzkyN10gLSBFbWl0IGFuIGVycm9yIGluc3RlYWQgb2YgdGhyb3cgYW4gZXJyb3IgaW4gdGhlIGFzeW5jIGNhbGxiYWNrCisgICAgKiBbVEhSSUZULTM5MzFdIC0gVFNpbXBsZVNlcnZlcjogSWYgcHJvY2VzcyByZXF1ZXN0IGVuY291bnRlciBVTktOT1dOX01FVEhPRCwgZG9uJ3QgY2xvc2UgdHJhbnNwb3J0LgorICAgICogW1RIUklGVC0zOTM0XSAtIEF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBPcGVuU1NMIGJpbmFyeSB2ZXJzaW9uIG9uIFdpbmRvd3MgQ0kKKyAgICAqIFtUSFJJRlQtMzkxOF0gLSBSdW4gc3Vic2V0IG9mIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtMzkwOF0gLSBSZW1vdmUgcmVkdW5kYW50IGRlcGVuZGVuY2llcyBmcm9tIERvY2tlcmZpbGUKKyAgICAqIFtUSFJJRlQtMzkwN10gLSBTa2lwIERvY2tlciBpbWFnZSBidWlsZCBvbiBDSSB3aGVuIHVuY2hhbmdlZAorICAgICogW1RIUklGVC0zODY4XSAtIEphdmEgc3RydWN0IGVxdWFscyBzaG91bGQgZG8gaWRlbnRpdHkgY2hlY2sgYmVmb3JlIGZpZWxkIGNvbXBhcmlzb24KKyAgICAqIFtUSFJJRlQtMzg0OV0gLSBQb3J0IEdvIHNlcmlhbGl6ZXIgYW5kIGRlc2VyaWFsaXplciB0byBkYXJ0CisgICAgKiBbVEhSSUZULTI5ODldIC0gQ29tcGxldGUgQ01ha2UgYnVpbGQgZm9yIEFwYWNoZSBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMjk4MF0gLSBUaHJpZnRNZW1vcnlCdWZmZXIgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igb3B0aW9uIHRvIHRha2UgYW4gZXhpc3RpbmcgYnVmZmVyCisgICAgKiBbVEhSSUZULTI4NTZdIC0gcmVmYWN0b3IgZXJsYW5nIGJhc2ljIHRyYW5zcG9ydHMgYW5kIHVuaWZ5IGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMjg3N10gLSBPcHRpbWl6ZSBnZW5lcmF0ZWQgaGFzaENvZGUKKyAgICAqIFtUSFJJRlQtMjg2OV0gLSBKU09OOiBydW4gc2NoZW1hIHZhbGlkYXRpb24gZnJvbSB0ZXN0cworICAgICogW1RIUklGVC0zMTEyXSAtIFtKYXZhXSBBc3luY01ldGhvZENhbGxiYWNrIHNob3VsZCBiZSB0eXBlZCBpbiBnZW5lcmF0ZWQgQXN5bmNJZmFjZQorICAgICogW1RIUklGVC0zMjYzXSAtIFBIUCBqc29uU2VyaWFsaXplKCkgc2hvdWxkIGNhc3Qgc2NhbGFyIHR5cGVzCisgICAgKiBbVEhSSUZULTI5MDVdIC0gQ29jb2EgY29tcGlsZXIgc2hvdWxkIGhhdmUgb3B0aW9uIHRvIHByb2R1Y2UgIm1vZGVybiIgT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMjgyMV0gLSBFbmFibGUgdGhlIHVzZSBvZiBjdXN0b20gSFRUUC1IZWFkZXIgaW4gdGhlIFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMDkzXSAtIGFkZGVkIHRoZSBhYmlsaXR5IHRvIHNldCBjb21wcmVzc2lvbiBsZXZlbCBpbiBDKysgemxpYiB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA4OV0gLSBDb21waWxlciBpZ25vcmVzIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICAqIFtUSFJJRlQtMjA1Nl0gLSBNb3ZlZCBhbGwgI2luY2x1ZGUgY29uZmlnLmggc3RhdGVtZW50cyB0byAjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorICAgICogW1RIUklGVC0yMDMxXSAtIE1ha2UgU09fS0VFUEFMSVZFIGNvbmZpZ3VyYWJsZSBmb3IgQysrIGxpYgorICAgICogW1RIUklGVC0yMDIxXSAtIEltcHJvdmUgbGFyZ2UgYmluYXJ5IHByb3RvY29sIHN0cmluZyBwZXJmb3JtYW5jZQorICAgICogW1RIUklGVC0yMDI4XSAtIENsZWFudXAgdGhyZWFkaW5nIGhlYWRlcnMgLyBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMjAxNF0gLSBDaGFuZ2UgQysrIGxpYiBpbmNsdWRlcyB0byB1c2UgPG5hbWVzcGFjZS8+IHN0eWxlIHRocm91Z2hvdXQKKyAgICAqIFtUSFJJRlQtMjMxMl0gLSB0cmF2aXMueW1sOiBidWlsZCBldmVyeXRoaW5nCisgICAgKiBbVEhSSUZULTE5MTVdIC0gTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTE3MzZdIC0gVmlzdWFsIFN0dWRpbyB0b3AgbGV2ZWwgcHJvamVjdCBmaWxlcyB3aXRoaW4gbXN2YworICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTUzM10gLSBNYWtlIFRUcmFuc3BvcnQgc2hvdWxkIGJlIENsb3NlYWJsZQorICAgICogW1RIUklGVC0zNV0gLSBNb3ZlIGxhbmd1YWdlIHRlc3RzIGludG8gdGhlaXIgYXBwcm9wcmlhdGUgbGlicmFyeSBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMTA3OV0gLSBTdXBwb3J0IGk2NCBpbiBBUzMKKyAgICAqIFtUSFJJRlQtMTEwOF0gLSBTU0wgc3VwcG9ydCBmb3IgdGhlIFJ1YnkgbGlicmFyeSAKKyAgICAqIFtUSFJJRlQtMzg1Nl0gLSB1cGRhdGUgZGViaWFuIHBhY2thZ2UgZGVlcGVuZGVuY2llcworICAgICogW1RIUklGVC0zODMzXSAtIGhheGUgaHR0cCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gKGJ5IGVtYmVkaW5nIGludG8gcGhwIHdlYiBzZXJ2ZXIpCisgICAgKiBbVEhSSUZULTM4MzldIC0gUGVyZm9ybWFuY2UgaXNzdWUgd2l0aCBiaWcgbWVzc2FnZSBkZXNlcmlhbGl6YXRpb24gdXNpbmcgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zODIwXSAtIEVybGFuZzogRGV0ZWN0IE9UUCA+PSAxOCB0byB1c2UgbmV3IHRpbWUgY29ycmVjdGlvbgorICAgICogW1RIUklGVC0zODE2XSAtIFJlZHVjZSBkb2NrZXIgYnVpbGQgZHVyYXRpb24gb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM4MTVdIC0gUHV0IGFwcHZleW9yIGRlcGVuZGVuY3kgdmVyc2lvbnMgdG8gb25lIHBsYWNlCisgICAgKiBbVEhSSUZULTM3ODhdIC0gQ29tcGF0aWJpbGl0eSBpbXByb3ZlbWVudHMgYW5kIFdpbjY0IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzc5Ml0gLSBUaW1lb3V0cyBmb3IgYW5vbnltb3VzIHBpcGVzIHNob3VsZCBiZSBjb25maWd1cmFibGUKKyAgICAqIFtUSFJJRlQtMzc5NF0gLSBTcGxpdCBEZWxwaGkgYXBwbGljYXRpb24sIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgZXhjZXB0aW9uIHN1YnR5cGVzIGludG8gc2VwYXJhdGUgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0zNzc0XSAtIFRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgaGF2ZSBleGNlcHRpb25fbmFtZXMgbWV0YSBpbmZvCisgICAgKiBbVEhSSUZULTM3NjJdIC0gRml4IGJ1aWxkIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIFRocmlmdCAiYnl0ZSIgZmllbGRzCisgICAgKiBbVEhSSUZULTM3NTZdIC0gSW1wcm92ZSByZXF1aXJlZG5lc3MgZG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zNzYxXSAtIEFkZCBkZWJpYW4gcGFja2FnZSBmb3IgUHl0aG9uMworICAgICogW1RIUklGVC0zNzQyXSAtIGhheGUgcGhwIGNsaSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM3MzNdIC0gU29ja2V0IHRpbWVvdXQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTM3MjhdIC0gaHR0cCB0cmFuc3BvcnQgZm9yIHRocmlmdC1sdWEKKyAgICAqIFtUSFJJRlQtMzkwNV0gLSBEYXJ0IGNvbXBpbGVyIGRvZXMgbm90IGluaXRpYWxpemUgYm9vbCwgaW50LCBhbmQgZG91YmxlIHByb3BlcnRpZXMKKyAgICAqIFtUSFJJRlQtMzkxMV0gLSBMb29zZW4gUnVieSBkZXYgZGVwZW5kZW5jeSB2ZXJzaW9uIHJlcXVpcmVtZW50cworICAgICogW1RIUklGVC0zOTA2XSAtIFJ1biBDIyB0ZXN0cyB3aXRoIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzkwMF0gLSBBZGQgUHl0aG9uIFNTTCBmbGFncworICAgICogW1RIUklGVC0zODk3XSAtIFByb3ZpZGUgbWVhbmluZ2Z1bCBleGNlcHRpb24gdHlwZSBiYXNlZCBvbiBXZWJFeGNlcHRpb25TdGF0dXMgaW4gY2FzZSBvZiB0aW1lb3V0CisgICAgKiBbVEhSSUZULTM4MDhdIC0gTWlzc2luZyBgRE9VQkxFYCBpbiB0aHJpZnQgdHlwZSBlbnVtZXJhdGlvbgorICAgICogW1RIUklGVC0zODAzXSAtIFJlbW92ZSAiZmlsZSIgYXR0cmlidXRlIGZyb20gWE1MIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNjYwXSAtIEFkZCBWNCBtYXBwZWQgYWRkcmVzcyB0byB0ZXN0IGNsaWVudCBjZXJ0J3MgYWx0bmFtZQorICAgICogW1RIUklGVC0zNjYxXSAtIFVzZSBodHRwcyB0byBkb3dubG9hZCBtZWNrIGluIGVybGFuZyB0ZXN0IGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NTldIC0gQ2hlY2sgY29uZmlndXJlIHJlc3VsdCBvZiBDTWFrZSBvbiBDSQorICAgICogW1RIUklGVC0zNjY3XSAtIEFkZCBUTFMgU05JIHN1cHBvcnQgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNjUxXSAtIE1ha2UgYmFja3BvcnRzLm1hdGNoX2hvc3RuYW1lIGFuZCBpcGFkZHJlc3Mgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMzY2Nl0gLSBCdWlsZCBEIHR1dG9yaWFsIGFzIHBhcnQgb2YgQXV0b3Rvb2xzIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NjVdIC0gQWRkIEQgbGliZXZlbnQgYW5kIE9wZW5TU0wgdG8gZG9ja2VyIGltYWdlcworICAgICogW1RIUklGVC0zNjY0XSAtIFJlbW92ZSBtZDUuYworICAgICogW1RIUklGVC0zNjYyXSAtIEFkZCBIYXNrZWxsIHRvIGRlYmlhbiBkb2NrZXIgaW1hZ2UKKyAgICAqIFtUSFJJRlQtMzcxMV0gLSBBZGQgRCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0CisgICAgKiBbVEhSSUZULTM2OTFdIC0gUnVuIGZsYWtlOCBQeXRob24gc3R5bGUgY2hlY2sgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM2OTJdIC0gKFJlKWVuYWJsZSBBcHB2ZXlvciBDKysgYW5kIFB5dGhvbiBidWlsZAorICAgICogW1RIUklGVC0zNjc3XSAtIEltcHJvdmUgQ01ha2UgSmF2YSBidWlsZAorICAgICogW1RIUklGVC0zNjc5XSAtIEFkZCBzdGRvdXQgbG9nIHRvIHRlc3RCaW5hcnkgaW4gSmF2YSB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zNzE4XSAtIFJlZHVjZSBzaXplIG9mIGRvY2tlciBpbWFnZSBmb3IgYnVpbGQgZW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMzY5OF0gLSBbVHJhdmlzLUNJXSBJbnRyb2R1Y2UgcmV0cnkgdG8gYXB0IGNvbW1hbmRzCisgICAgKiBbVEhSSUZULTMxMjddIC0gc3dpdGNoIC1yZWN1cnNlIHRvIC0tcmVjdXJzZSBhbmQgcmVzZXJ2ZSAtcgorICAgICogW1RIUklGVC0zMDg3XSAtIFBhc3Mgb24gZXJyb3JzIGxpa2UgImNvbm5lY3Rpb24gY2xvc2VkIgorICAgICogW1RIUklGVC0zMjQwXSAtIFRocmlmdCBQeXRob24gY2xpZW50IHNob3VsZCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIGFuZCB3aWxkY2FyZCBjZXJ0cyBpbiBUU1NMU29ja2V0CisgICAgKiBbVEhSSUZULTMyMTNdIC0gbWFrZSBjcm9zcyBzaG91bGQgaW5kaWNhdGUgd2hlbiBpdCBza2lwcyBhIGtub3duIGZhaWxpbmcgdGVzdAorICAgICogW1RIUklGVC0zMjA4XSAtIEZpeCBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGJ1aWxkIGZhaWx1cmUgZHVlIHRvIG1pc3Npbmcgc291cmNlCisgICAgKiBbVEhSSUZULTMxODZdIC0gQWRkIFRTZXJ2ZXJIVFRQIHRvIEdvIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjM0Ml0gLSBBZGQgX19GSUxFX18gYW5kIF9fTElORV9fIHRvIFRocmlmdCBDKysgZXhjcGV0aW9ucworICAgICogW1RIUklGVC0zMzcyXSAtIEFkZCBkYXJ0IGdlbmVyYXRvciB0byBWaXN1YWwgU3R1ZGlvIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMzM2Nl0gLSBUaHJpZnRUZXN0IHRvIGltcGxlbWVudCBzdGFuZGFyZCByZXR1cm4gdmFsdWVzIAorICAgICogW1RIUklGVC0zNDAyXSAtIFByb3ZpZGUgYSBwZXJsIFVuaXggU29ja2V0IGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMzNjFdIC0gSW1wcm92ZSBDIyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzOTNdIC0gSW50cm9kdWNlIGk4IHRvIHByb3ZpZGUgY29uc2lzdGVudCBzZXQgb2YgVGhyaWZ0IElETCBpbnRlZ2VyIHR5cGVzCisgICAgKiBbVEhSSUZULTMzMzldIC0gU3VwcG9ydCBmb3IgZGF0YWJhc2Uvc3FsCisgICAgKiBbVEhSSUZULTM1NjVdIC0gQysrOiBUW0FzeW5jXVByb2Nlc3Nvcjo6Z2V0RXZlbnRIYW5kbGVyKCkgc2hvdWxkIGJlIGRlY2xhcmVkIGFzIGNvbnN0IG1lbWJlciBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMzU2M10gLSBDKysvUXQ6IHJlbW92ZWQgdXNhZ2Ugb2YgbWFjcm8gUVRfUFJFUEVORF9OQU1FU1BBQ0UgYXMgaXQgaXNuJ3QgY29uc2VxdWVudGx5IHVzZWQgZm9yIGFsbCByZWZlcmVuY2VzIHRvIFF0IHR5cGVzLgorICAgICogW1RIUklGVC0zNTYyXSAtIFJlbW92ZWQgdW51c2VkIFRBc3luY1Byb2Nlc3Nvcjo6Z2V0QXN5bmNTZXJ2ZXIoKQorICAgICogW1RIUklGVC0zNTYxXSAtIEMrKy9RdDogbWFrZSB1c2Ugb2YgUV9ESVNBQkxFX0NPUFkoKSB0byBnZXQgcmlkIG9mIGNvcHkgY3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICogW1RIUklGVC0zNTU2XSAtIGNfZ2xpYiBmaWxlIGRlc2NyaXB0b3IgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM1NDRdIC0gTWFrZSBjcm9zcyB0ZXN0IGZhaWwgd2hlbiBzZXJ2ZXIgcHJvY2VzcyBkaWVkIHVuZXhwZWN0ZWRseQorICAgICogW1RIUklGVC0zNTQwXSAtIE1ha2UgcHl0aG9uIHR1dG9yaWFsIG1vcmUgaW4gbGluZSB3aXRoIFBFUDgKKyAgICAqIFtUSFJJRlQtMzUzNV0gLSBEYXJ0IGdlbmVyYXRvciBhcmd1bWVudCB0byBwcm9kdWNlIGEgZmlsZSBzdHJ1Y3R1cmUgdXNhYmxlIGluIHBhcmVudCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM1MDVdIC0gRW5oYW5jZSBQeXRob24gVFNTTFNvY2tldAorICAgICogW1RIUklGVC0zNTA2XSAtIEVsaW1pbmF0ZSBvbGQgc3R5bGUgY2xhc3NlcyBmcm9tIGxpYnJhcnkgY29kZQorICAgICogW1RIUklGVC0zNTAzXSAtIEVuYWJsZSBweTp1dGY4c3RyaW5nIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtMzQ5OV0gLSBBZGQgcGFja2FnZV9wcmVmaXggdG8gcHl0aG9uIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNDk1XSAtIE1pbm9yIGVuaGFuY2VtZW50cyBhbmQgZml4ZXMgZm9yIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzQ4Nl0gLSBKYXZhIGdlbmVyYXRlZCBgZ2V0RmllbGRWYWx1ZWAgaXMgaW5jb21wYXRpYmxlIHdpdGggYHNldEZpZWxkVmFsdWVgIGZvciBiaW5hcnkgdmFsdWVzLgorICAgICogW1RIUklGVC0zNDg0XSAtIENvbnNvbGlkYXRlIHRlbXBvcmFyeSBidWZmZXJzIGluIEphdmEncyBUQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTM1MTZdIC0gQWRkIGZlYXR1cmUgdGVzdCBmb3IgVEhlYWRlciBUQmluYXJ5UHJvdG9jb2wgaW50ZXJvcAorICAgICogW1RIUklGVC0zNTE1XSAtIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBhbmQgdGVzdCBvbiBDSQorICAgICogW1RIUklGVC0zNTE0XSAtIFBIUCA3IGNvbXBhdGlibGUgdmVyc2lvbiBvZiBiaW5hcnkgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzQ2OV0gLSBEb2NrZXI6IERlYmlhbiBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM0MTZdIC0gUmV0aXJlIG9sZCAieHh4X25hbWVzcGFjZSIgZGVjbGFyYXRpb25zIGZyb20gdGhlIElETAorICAgICogW1RIUklGVC0zNDI2XSAtIEFsaWduIGF1dG9nZW4gY29tbWVudCBpbiBYU0QKKyAgICAqIFtUSFJJRlQtMzQyNF0gLSBBZGQgQ01ha2UgYW5kcm9pZCBidWlsZCBvcHRpb24KKyAgICAqIFtUSFJJRlQtMzQzOV0gLSBSdW4gbWFrZSBjcm9zcyB1c2luZyBQeXRob24zIHdoZW4gYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM0NDBdIC0gUHl0aG9uIG1ha2UgY2hlY2sgdGFrZXMgdG9vIG11Y2ggdGltZQorICAgICogW1RIUklGVC0zNDQxXSAtIFN0YWJpbGl6ZSBUcmF2aXMtQ0kgYnVpbGRzCisgICAgKiBbVEhSSUZULTM0MzFdIC0gQXZvaWQgInNjaGVtZXMiIEhhc2hNYXAgbG9va3VwcyBkdXJpbmcgc3RydWN0IHJlYWRzL3dyaXRlcworICAgICogW1RIUklGVC0zNDMyXSAtIEFkZCBhIFRCeXRlQnVmZmVyIHRyYW5zcG9ydCB0byB0aGUgSmF2YSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM0MzhdIC0gRW5hYmxlIHB5Om5ld19zdHlsZSBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTM0MDVdIC0gR28gVEh0dHBDbGllbnQgbWlzdXNlcyBodHRwLkNsaWVudCBvYmplY3RzCisgICAgKiBbVEhSSUZULTM2MTRdIC0gSW1wcm92ZSBsb2dnaW5nIG9mIHRlc3Rfc3Nsc29ja2V0LnB5CisgICAgKiBbVEhSSUZULTM2NDddIC0gRml4IHBocCBleHRlbnNpb24gYnVpbGQgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMzY0Ml0gLSBTcGVlZCB1cCBjcm9zcyB0ZXN0IHJ1bm5lcgorICAgICogW1RIUklGVC0zNjM3XSAtIEltcGxlbWVudCBjb21wYWN0IHByb3RvY29sIGZvciBkYXJ0CisgICAgKiBbVEhSSUZULTM2MTNdIC0gUG9ydCBQeXRob24gQyBleHRlbnNpb24gdG8gUHl0aG9uIDMKKyAgICAqIFtUSFJJRlQtMzYxMl0gLSBBZGQgUHl0aG9uIEMgZXh0ZW5zaW9uIGZvciBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM2MTFdIC0gQWRkIC0tcmVnZXggZmlsdGVyIHRvIGNyb3NzIHRlc3QgcnVubmVyCisgICAgKiBbVEhSSUZULTM2MzFdIC0gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCisgICAgKiBbVEhSSUZULTM2MDldIC0gUmVtb3ZlIG9yIHJlcGxhY2UgVGVzdFBvcnRGaXh0dXJlLmgKKyAgICAqIFtUSFJJRlQtMzYwNV0gLSBIYXZlIHRoZSBjb21waWxlciBjb21wbGFpbiBhYm91dCBpbnZhbGlkIGFyZ3VtZW50cyBhbmQgb3B0aW9ucworICAgICogW1RIUklGVC0zNTk2XSAtIEJldHRlciBjb25mb3JtYW5jZSB0byBQRVA4CisgICAgKiBbVEhSSUZULTM1ODVdIC0gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCisgICAgKiBbVEhSSUZULTM1ODJdIC0gRXJsYW5nIGxpYnJhcmllcyBzaG91bGQgaGF2ZSBzZXJ2aWNlIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTM1NzldIC0gSW50cm9kdWNlIHJldHJ5IHRvIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtMzMwNl0gLSBKYXZhOiBUQmluYXJ5UHJvdG9jb2w6IFVzZSAxIHRlbXAgYnVmZmVyIGluc3RlYWQgb2YgYWxsb2NhdGluZyA4CisgICAgKiBbVEhSSUZULTM5MTBdIC0gRG8gbm90IGludm9rZSBwaXAgYXMgcGFydCBvZiBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTE4NTddIC0gUHl0aG9uIDMuWCBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE5NDRdIC0gQmluZGluZyB0byB6ZXJvIHBvcnQKKyAgICAqIFtUSFJJRlQtMzk1NF0gLSBFbmFibGUgdGhlIHVzYWdlIG9mIHN0cnVjdHMgY2FsbGVkICJPYmplY3QiIGluIEphdmEKKyAgICAqIFtUSFJJRlQtMzk4MV0gLSBFbmFibGUgYW5hbHl6ZXIgc3Ryb25nIG1vZGUgaW4gRGFydCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM5OThdIC0gRG9jdW1lbnQgYWJpbGl0eSB0byBhZGQgY3VzdG9tIHRhZ3MgdG8gdGhyaWZ0IHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDAwNl0gLSBBZGQgYSByZW1vdmVFdmVudExpc3RlbmVyIG1ldGhvZCBvbiBUU29ja2V0CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTY0MF0gLSBTdXBwb3J0IGRlcHJlY2F0aW9uCisgICAgKiBbVEhSSUZULTk0OF0gLSBTU0wgc29ja2V0IHN1cHBvcnQgZm9yIFBIUAorICAgICogW1RIUklGVC03NjRdIC0gYWRkIFN1cHBvcnQgZm9yIFZhbGEgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtMzA0Nl0gLSBBbGxvdyBQU1I0IGNsYXNzIGxvYWRpbmcgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIChQSFApCisgICAgKiBbVEhSSUZULTIxMTNdIC0gRXJsYW5nIFNTTCBTb2NrZXQgU3VwcG9ydAorICAgICogW1RIUklGVC0xNDgyXSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IHVuZGVyIFBIUAorICAgICogW1RIUklGVC01MTldIC0gU3VwcG9ydCBjb2xsZWN0aW9ucyBvZiB0eXBlcyB3aXRob3V0IGhhdmluZyB0byBleHBsaWNpdGx5IGRlZmluZSBpdAorICAgICogW1RIUklGVC00NjhdIC0gUmFjayBNaWRkbGV3YXJlIEFwcGxpY2F0aW9uIGZvciBSYWlscworICAgICogW1RIUklGVC0xNzA4XSAtIEFkZCBldmVudCBoYW5kbGVycyBmb3IgcHJvY2Vzc29yIGV2ZW50cworICAgICogW1RIUklGVC0zODM0XSAtIEVybGFuZyBuYW1lc3BhY2luZyBhbmQgZXhjZXB0aW9uIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTI1MTBdIC0gSW1wbGVtZW50IFROb25ibG9ja2luZ1NlcnZlcidzIGFiaWxpdHkgdG8gbGlzdGVuIG9uIHVuaXggZG9tYWluIHNvY2tldHMKKyAgICAqIFtUSFJJRlQtMzM5N10gLSBJbXBsZW1lbnQgVFByb2Nlc3NvckZhY3RvcnkgaW4gQyMgdG8gZW5hYmxlIHBlci1jbGllbnQgcHJvY2Vzc29ycworICAgICogW1RIUklGVC0zNTIzXSAtIFhNTCBHZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzUxMF0gLSBBZGQgSHR0cFRhc2tBc3luY0hhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzMxOF0gLSBQSFA6IFNpbXBsZUpTT05Qcm90b2NvbCBJbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMjk5XSAtIERhcnQgbGFuZ3VhZ2UgYmluZGluZ3MgaW4gVGhyaWZ0CisgICAgKiBbVEhSSUZULTI4MzVdIC0gQWRkIHBvc3NpYmlsaXR5IHRvIGRpc3RyaWJ1dGUgZ2VuZXJhdG9ycyBzZXBhcmF0ZWx5IGZyb20gdGhyaWZ0IGNvcmUsIGFuZCBsb2FkIHRoZW0gZHluYW1pY2FsbHkKKyAgICAqIFtUSFJJRlQtMTg0XSAtIEFkZCBPU0dpIE1hbmlmZXN0IGhlYWRlcnMgdG8gdGhlIGxpYnRocmlmdCBqYXZhIGxpYnJhcnkgdG8gYmUgYWJsZSB0byB1c2UgVGhyaWZ0IGluIHRoZSBPU0dpIHJ1bnRpbWUKKyAgICAqIFtUSFJJRlQtMTQxXSAtIElmIGEgcmVxdWlyZWQgZmllbGQgaXMgbm90IHByZXNlbnQgb24gc2VyaWFsaXphdGlvbiwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE4OTFdIC0gQWRkIFdpbmRvd3MgQUxQQyB0cmFuc3BvcnQgd2hpY2ggaXMgcmlnaHQgY291bnRlcnBhcnQgb2YgVW5peCBkb21haW4gc29ja2V0cworCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0xODA4XSAtIFRoZSBUaHJpZnQgc3RydWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIHNlbGYtY29udGFpbmVkPworICAgICogW1RIUklGVC0yODk1XSAtIFR1dG9yaWFsIGNwcAorICAgICogW1RIUklGVC0zODYwXSAtIEVsZXBoYW50LWJpcmQgYXBwbGljYXRpb24gVGVzdCBmYWlscyBmb3IgVGhyaWZ0CisgICAgKiBbVEhSSUZULTM4MTFdIC0gSFRUUFMgU3VwcG9ydCBmb3IgQysrIGFwcGxpY2F0aW9ucworICAgICogW1RIUklGVC0zNTA5XSAtICJtYWtlIGNoZWNrIiBlcnJvcgorCisjIyBTdG9yeQorICAgICogW1RIUklGVC0zNDUyXSAtIC50cmF2aXMueW1sOiBNaWdyYXRpbmcgZnJvbSBsZWdhY3kgdG8gY29udGFpbmVyLWJhc2VkIGluZnJhc3RydWN0dXJlCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE4MTFdIC0gcnVieSB0dXRvcmlhbCBhcyBwYXJ0IG9mIHRoZSByZWd1bGFyIGJ1aWxkCisgICAgKiBbVEhSSUZULTI3NzldIC0gUEhQIFRKU09OUHJvdG9jb2wgZW5jb2RlIHVuaWNvZGUgaW50byBVQ1MtNExFIHdoaWNoIGNhbid0IGJlIHBhcnNlZCBieSBvdGhlciBsYW5ndWFnZSBiaW5kaW5ncworICAgICogW1RIUklGVC0yMTEwXSAtIEVybGFuZzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzg1Ml0gLSBBIFRyYXZpcy1DSSBqb2IgZmFpbHMgd2l0aCAid3JpdGUgZXJyb3IiCisgICAgKiBbVEhSSUZULTM3NDBdIC0gRml4IGhheGVsaWIuanNvbiBjbGFzc3BhdGggCisgICAgKiBbVEhSSUZULTM2NTNdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzY1Ml0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY1NV0gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbgorICAgICogW1RIUklGVC0zNjU0XSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjU2XSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjk5XSAtIEZpeCBpbnRlZ2VyIGxpbWl0IHN5bWJvbCBpbmNsdWRlcyBpbiBQeXRob24gQyBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzY5M10gLSBGaXggaW5jbHVkZSBpc3N1ZSBpbiBDKysgVFNTTFNvY2tldEludGVycnVwdFRlc3Qgb24gV2luZG93cworICAgICogW1RIUklGVC0zNjk0XSAtIFtXaW5kb3dzXSBEaXNhYmxlIHRlc3RzIG9mIGEgZmV3IHNlcnZlcnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZAorICAgICogW1RIUklGVC0zNjk2XSAtIEluc3RhbGwgcGlwIHRvIENlbnRPUyBEb2NrZXIgaW1hZ2VzIHRvIGZpeCBQeXRob24gYnVpbGRzCisgICAgKiBbVEhSSUZULTM2MzhdIC0gRml4IGhheGVsaWIuanNvbgorICAgICogW1RIUklGVC0zMjUxXSAtIEFkZCBodHRwIHRyYW5zcG9ydCBmb3Igc2VydmVyIHRvIEdvIGxpYgorICAgICogW1RIUklGVC0yNDI0XSAtIFJlY3Vyc2l2ZSBUeXBlcworICAgICogW1RIUklGVC0yNDIzXSAtIFRIZWFkZXIKKyAgICAqIFtUSFJJRlQtMjQxM10gLSBQeXRob246IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDA5XSAtIEphdmE6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDEyXSAtIEQ6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDExXSAtIEMrKzogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTBdIC0gSmF2YU1lOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjY2OF0gLSBUZXN0U3VpdGU6IGRldGFpbGVkIHJlc3VsdCBvbiBwYXNzZWQgdGVzdHMgYnkgZmVhdHVyZQorICAgICogW1RIUklGVC0yNjU5XSAtIHB5dGhvbiBUZXN0IFNlcnZlciBmYWlscyB3aGVuIHRocm93aW5nIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzM5OF0gLSBBZGQgQ01ha2UgYnVpbGQgIGZvciBIYXNrZWxsIGxpYnJhcnkgYW5kIHRlc3RzCisgICAgKiBbVEhSSUZULTMzOTZdIC0gREFSVDogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTMzNjRdIC0gICBGaXggcnVieSBiaW5hcnkgZmllbGQgZW5jb2RpbmcgaW4gVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zMzgxXSAtIEZpeCBmb3IgbWlzYy4gY29kZWdlbiBpc3N1ZXMgd2l0aCBUSFJJRlQtMjkwNQorICAgICogW1RIUklGVC0zNTczXSAtIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgYC4uLy4uLy4uL3Rlc3QvY19nbGliL3NyYy8uZGVwcy90ZXN0dGhyaWZ0dGVzdC10aHJpZnRfdGVzdF9oYW5kbGVyLlBvJy4KKyAgICAqIFtUSFJJRlQtMzU3Ml0gLSAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisgICAgKiBbVEhSSUZULTM1NDJdIC0gQWRkIGxlbmd0aCBsaW1pdCBzdXBwb3J0IHRvIEphdmEgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzUzN10gLSBSZW1vdmUgdGhlIChub3cgb2Jzb2xldGUpIGNzaGFycDphc3luY2N0cCBmbGFnIAorICAgICogW1RIUklGVC0zNTMyXSAtIEFkZCBjb25maWd1cmFibGUgc3RyaW5nIGFuZCBjb250YWluZXIgcmVhZCBzaXplIGxpbWl0IHRvIFB5dGhvbiBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzUzMV0gLSBDcmVhdGUgY3Jvc3MgbGFuZyBmZWF0dXJlIHRlc3QgZm9yIHN0cmluZyBhbmQgY29udGFpbmVyIHJlYWQgbGVuZ3RoIGxpbWl0CisgICAgKiBbVEhSSUZULTM0ODJdIC0gSGFza2VsbCBKU09OIHByb3RvY29sIGRvZXMgbm90IGVuY29kZSBiaW5hcnkgZmllbGQgYXMgQmFzZTY0CisgICAgKiBbVEhSSUZULTM0MjVdIC0gTWlub3IgZml4ZXMgKyBzaW1wbGlmaWNhdGlvbiBmb3IgQ2VudE9TIERvY2tlcmZpbGUKKyAgICAqIFtUSFJJRlQtMzQ0Ml0gLSBSdW4gQ01ha2UgdGVzdHMgb24gQXBwdmV5b3IKKyAgICAqIFtUSFJJRlQtMzQwOV0gLSBOb2RlSlMgYmluYXJ5IGZpZWxkIGlzc3VlcworICAgICogW1RIUklGVC0zNjIxXSAtIEZpeCBsaWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjhdIC0gRml4IGxpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjVdIC0gS2lsbCB1bnVzZWQgI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIiBpbiBsaWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwLgorICAgICogW1RIUklGVC0zNjQ2XSAtIEZpeCBQeXRob24gZXh0ZW5zaW9uIGJ1aWxkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTM2MjZdIC0gRml4IGxpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cy4KKyAgICAqIFtUSFJJRlQtMzYyNF0gLSBGaXggbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjNdIC0gRml4IEZpeCBjcHAvbGliL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzU5Ml0gLSBBZGQgYmFzaWMgdGVzdCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMzk4MF0gLSBhZGQgVEV4dGVuZGVkQmluYXJ5UHJvdG9jb2wuamF2YQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTE4MDFdIC0gU3luYyB1cCBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMgYWNyb3NzIGxhbmd1YWdlcyBhbmQgdGhyaWZ0IGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC0xMjU5XSAtIEF1dG9tYXRlIHZlcnNpb25pbmcgCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMzQwMF0gLSBBZGQgRXJsYW5nIHRvIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzUwNF0gLSBGaXggRmFzdGJpbmFyeVRlc3QucHkKKworIyMgV2lzaAorICAgICogW1RIUklGVC0zOTIzXSAtIE1heWJlIHJlbW92ZSBBZXJlbyBmcm9tIHRoZSAiUG93ZXJlZCBieSIgbGlzdAorICAgICogW1RIUklGVC0yMTQ5XSAtIEFkZCBhbiBvcHRpb24gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycwogCiAKLVZlcnNpb24gMC42LjAKIAotVEhSSUZULTk0MCAgICBCdWlsZCAgICAgICAgICAgICAgICAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocyAoQ2hyaXN0aWFuIExhdm9pZSkKLVRIUklGVC0xMDMyICAgQnVpbGQgICAgICAgICAgICAgICAgIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtIChNaWNoYWVsIEx1bSkKLVRIUklGVC0xMDAyICAgQyBnbGliICAgICAgICAgICAgICAgQ29kZVN0eWxlOiB0X2NfZ2xpYl9nZW5lcmF0b3IuY2MgKEFuYXRvbCBQb21vem92KQotVEhSSUZULTk3NSAgICBDIGdsaWIgICAgICAgICAgICAgICBsaWIvY19nbGliL1JFQURNRSBpcyBtaXNzaW5nID0+IGJyZWFrcyBtYWtlIGRpc3QgKE1pY2hhZWwgTHVtKQotVEhSSUZULTEwMDMgICBDIGdsaWIgICAgICAgICAgICAgICBQb2xpc2hpbmcgY19nbGliIGNvZGUgKEFuYXRvbCBQb21vem92KQotVEhSSUZULTU4MiAgICBDIGdsaWIgICAgICAgICAgICAgICBDIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdCAoQW5hdG9sIFBvbW96b3YpCi1USFJJRlQtOTkyICAgIEMjICAgICAgICAgICAgICAgICAgIE5hbWluZyBjb252ZW50aW9uIGluIEMjIGNvbnN0cnVjdG9yIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggb3RoZXIgZmllbGRzIGNhdXNlcyBjb21waWxlIGVycm9ycyAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTA0ICAgIEMjCQkgICBEaXNhYmxlIG5hZ2xlIGFuZCBsaW5nZXIKLVRIUklGVC05NzcgICAgQysrICAgICAgICAgICAgICAgICAgSGV4IENvbnZlcnNpb24gQnVnIGluIEMrKyBUSlNPTlByb3RvY29sIChBcmF2aW5kIE5hcmF5YW5hbikKLVRIUklGVC05MjIgICAgQysrICAgICAgICAgICAgICAgICAgVGVtcGxhdGl6ZWQgW2RlXXNlcmlhbGl6YXRpb24gY29kZSBmb3IgQysrIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjMgICAgQysrICAgICAgICAgICAgICAgICAgRXZlbnQtZHJpdmVuIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQgZm9yIEMrKyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTI1ICAgIEMrKyAgICAgICAgICAgICAgICAgIFByb3ZpZGUgbmFtZTwtPnZhbHVlIG1hcCBmb3IgZW51bXMgaW4gQysrIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjYgICAgQysrICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjggICAgQysrICAgICAgICAgICAgICAgICAgTWFrZSBtb3JlIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGluIEMrKyBzZXJ2ZXJzIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjkgICAgQysrICAgICAgICAgICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHRoZSBDKysgdGVzdCBzdWl0ZSAoRGF2aWQgUmVpc3MpCi1USFJJRlQtODY4ICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIFJlZmVyZW5jaW5nIGNvbnN0YW50IHZhbHVlcyBkb2Vzbid0IHdvcmsgd2l0aCB3aXRoIHR5cGVkZWYgdHlwZXMgKERhdmlkIFJlaXNzKQotVEhSSUZULTEwMDYgICBHZW5lcmFsICAgICAgICAgICAgICBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtOTMyICAgIEhhc2tlbGwgICAgICAgICAgICAgIEhhc2tlbGwgdGVzdHMgbmVlZCB0byBiZSBydW4gdGhyb3VnaCAnbWFrZSBjaGVjaycgKGFuZCBwcm9iYWJseSAnY2FiYWwgY2hlY2snKSB0b28gKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTMzICAgIEhhc2tlbGwgICAgICAgICAgICAgIEhhc2tlbGwncyBUaHJpZnQuY2FiYWwgaGFzIHdhcm5pbmdzIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTk0MyAgICBIYXNrZWxsICAgICAgICAgICAgICBTaWxseSByZWFkbWUgdHlwbyBmaXguIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTk0NCAgICBIYXNrZWxsICAgICAgICAgICAgICBTdXBwb3J0IGFsbCB2ZXJzaW9uLTRzIG9mIGJhc2UgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtOTUwICAgIEhhc2tlbGwgICAgICAgICAgICAgIEhhc2tlbGwgYmluZGluZ3MgdHJlYXQgJ2J5dGUnIGFzIHVuc2lnbmVkIDgtYml0IGludCAoRGF0YS5Xb3JkLldvcmQ4KSwgamF2YS9jcHAgYXMgc2lnbmVkIChieXRlL2ludDhfdCkuIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTEwMDkgICBKYXZhICAgICAgICAgICAgICAgICBUVW5pb24gZG9lcyBub3QgY29ycmVjdGx5IGRlZXAgY29weSBhIEJ5dGVCdWZmZXIgKFRha2FzaGkgWW9uZWJheWFzaGkpCi1USFJJRlQtMTAxMyAgIEphdmEgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBqYXZhIGNvZGUgbWF5IGhhdmUgbmFtZSBjbGFzaGVzIHdpdGggdGhyaWZ0IGxpYnJhcnkgKFBldGVyIFNjaHVsbGVyKQotVEhSSUZULTEwMTUgICBKYXZhICAgICAgICAgICAgICAgICBUVW5pb24gZG9lcyBub3QgaGFuZGxlIEJ5dGVCdWZmZXIgaW4gdG9TdHJpbmcgKFRha2FzaGkgWW9uZWJheWFzaGkpCi1USFJJRlQtMTAzOCAgIEphdmEgICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIChvciBjb2xsZWN0aW9ucyB0aGVyZW9mKSBhcmUgbm90IHNlcmlhbGl6YWJsZSAoaW4gdGhlIEphdmEgc2Vuc2UpIGV2ZW4gdGhvdWdoIHRoZXkgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlIChNYXRoaWFzIEhlcmJlcnRzKQotVEhSSUZULTEwNiAgICBKYXZhICAgICAgICAgICAgICAgICBUU1NMU2VydmVyU29ja2V0IChOaXJtYWwgUmFuZ2FuYXRoYW4pCi1USFJJRlQtMzc3ICAgIEphdmEgICAgICAgICAgICAgICAgIFRGaWxlVHJhbnNwb3J0IHBvcnQgaW4gSmF2YSAoSm95ZGVlcCBTZW4gU2FybWEpCi1USFJJRlQtNzQ1ICAgIEphdmEgICAgICAgICAgICAgICAgIE1ha2UgaXQgZWFzaWVyIHRvIGluc3RhbnRpYXRlIHNlcnZlcnMgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtODYyICAgIEphdmEgICAgICAgICAgICAgICAgIEFzeW5jIGNsaWVudCBpc3N1ZXMgLyBpbXByb3ZlbWVudHMgKE5pbmcgTGlhbmcpCi1USFJJRlQtOTAzICAgIEphdmEgICAgICAgICAgICAgICAgIGN1c3RvbSBUaHJlYWRGYWN0b3J5IGluIFRIc0hhU2VydmVyIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTkzOSAgICBKYXZhICAgICAgICAgICAgICAgICBvcHRpb25hbCBiaW5hcnkgZmllbGRzIHRocm93IE5QRSBvbiBkZWZhdWx0IGJ5dGVbXSBnZXR0ZXJzIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTk0NyAgICBKYXZhICAgICAgICAgICAgICAgICBQcm92aWRlIGEgaGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIFRQcm90b2NvbCB1c2VkIHRvIHNlcmlhbGl6ZSBzb21lIGRhdGEuIChNYXRoaWFzIEhlcmJlcnRzKQotVEhSSUZULTk1MSAgICBKYXZhICAgICAgICAgICAgICAgICBBZGQgYSBuZXcgaXNTZXJ2aW5nKCkgbWV0aG9kIHRvIFRTZXJ2ZXIgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtOTU3ICAgIEphdmEgICAgICAgICAgICAgICAgIFRIc0hhU2VydmVyOiBDaGFuZ2UgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBpbnZva2VyIGZpZWxkLiAoQmVuamFtaW4gQ292ZXJzdG9uKQotVEhSSUZULTk1OCAgICBKYXZhICAgICAgICAgICAgICAgICBDaGFuZ2UgYWNjZXNzbW9kaWZlciBvbiB0cmFuc18gZmllbGQgaW4gdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHRvIHB1YmxpYy4gKEJlbmphbWluIENvdmVyc3RvbikKLVRIUklGVC05NTkgICAgSmF2YSAgICAgICAgICAgICAgICAgVFNvY2tldCBzZWVtcyB0byBkbyBpdHMgb3duIGJ1ZmZlcmluZyBpbmVmZmljaWVudGx5IChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTk3MCAgICBKYXZhICAgICAgICAgICAgICAgICBVbmRlciBoZWF2eSBsb2FkLCBUSHR0cENsaWVudCBtYXkgZmFpbCB3aXRoICJ0b28gbWFueSBvcGVuIGZpbGVzIiAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC05NzEgICAgSmF2YSAgICAgICAgICAgICAgICAgamF2YSBtb2R1bGUgY2FuJ3QgYmUgY29tcGlsZWQgd2l0aG91dCBpdnkgYW5kIG5ldHdvcmsgY29ubmVjdGlvbiAoUm9nZXIgTWVpZXIpCi0gICAgICAgICAgIEphdmFTY3JpcHQgVGVzdFN1aXRlIHVzaW5nIGFudC9pdnkgYW5kIEphdmEncyBTZXJ2ZXJUZXN0QmFzZSBIYW5kbGVyIChSb2dlciBNZWllcikKLVRIUklGVC0xMDA1ICAgSmF2YSAgICAgICAgICAgICAgICAgR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtMTAwOCAgIEphdmEgICAgICAgICAgICAgICAgIGJ5dGVbXSBhY2Nlc3NvcnMgdGhyb3cgTlBFIG9uIHVuc2V0IGZpZWxkIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTUxNyAgICBKYXZhICAgICAgICAgICAgICAgICBURXhjZXB0aW9ucyB0aHJvd24gYnkgc2VydmVyIHJlc3VsdCBpbiBjcnlwdGljIGVycm9yIG1lc3NhZ2Ugb24gY2xpZW50IC0gVHJpZWQgdG8gcmVhZCA0IGJ5dGVzLCBidXQgb25seSBnb3QgMCBieXRlcyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC05NDYgICAgSmF2YSAgICAgICAgICAgICAgICAgQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4gKE1hdGhpYXMgSGVyYmVydHMpCi1USFJJRlQtOTQ5ICAgIEphdmEgICAgICAgICAgICAgICAgIE1vZGlmeSB0aGUgVEVudW0gaW50ZXJmYWNlIHNvIGl0IGRlZmluZXMgYSBtZXRob2Qgc2ltaWxhciB0byBmaW5kQnlWYWx1ZSAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC05NjAgICAgSmF2YSAgICAgICAgICAgICAgICAgYWRkIFRlc3RTZXJ2ZXIsIFRlc3ROb25ibG9ja2luZ1NlcnZlciBhbmQgVGVzdENsaWVudCBhZ2FpbiAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTY5ICAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgVHV0b3JpYWwgYnJva2VuLCBtb3ZlIENhbGN1bGF0b3JIYW5kbGVyIHRvIGEgc2VwYXJhdGUgZmlsZSAoUm9nZXIgTWVpZXIpCi1USFJJRlQtMTA1MSAgIEphdmEJCSAgIEZpeCBjb21waWxlciBpc3N1ZSBmb3IgamF2YSAxLjUKLVRIUklGVC04MDcgICAgSmF2YVNjcmlwdCAgICAgICAgICAgSmF2YVNjcmlwdDogSW5pdGlhbGl6YXRpb24gb2YgQmFzZSBUeXBlcyB3aXRoIDAgaW5zdGVhZCBvZiBudWxsIChSb2dlciBNZWllcikKLVRIUklGVC05MTMgICAgSmF2YVNjcmlwdCAgICAgICAgICAgVGVzdCBDYXNlIGZvciBVcmwgZW5jb2RlZCBzdHJpbmdzICsgc2ltcGxlIGVuaGFuY2VtZW50IHRvIGxpYi9qcy90ZXN0L1J1blRlc3RTZXJ2ZXIuc2ggKFJvZ2VyIE1laWVyKQotVEhSSUZULTk2MSAgICBKYXZhU2NyaXB0Ci1USFJJRlQtMTAzMyAgIEphdmFTY3JpcHQgICAgICAgICAgIE5vZGUuanMgc3VwcG9ydCAoV2FkZSBTaW1tb25zKQotVEhSSUZULTEwNDIgICBKYXZhU2NyaXB0ICAgICAgICAgICBOb2RlLmpzIEZpeCBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZCBQYXRjaCAoV2FkZSBTaW1tb25zKQotVEhSSUZULTEwNDMgICBKYXZhU2NyaXB0CSAgIE5vZGUuanMgRml4IGhvdyB0aGUgbGVuZ3RoIG9mIGEgbWFwIGlzIGNhbGN1bGF0ZWQKLVRIUklGVC0xMDQ0ICAgSmF2YVNjcmlwdAkgICBGaXggSmF2YVNjcmlwdCBpbmhlcml0YW5jZSBQYXRjaCAoV2FkZSBTaW1tb25zKQotVEhSSUZULTcxICAgICBNaXNjICAgICAgICAgICAgICAgICBEZWJpYW4gcGFja2FnaW5nIGZvciB0aHJpZnQgKFJvZ2VyIE1laWVyKQotVEhSSUZULTEwMjAgICBPQ2FtbCAgICAgICAgICAgICAgICBPQ2FtbCBjb21waWxlciBnZW5lcmF0ZXMgaW52YWxpZCBPQ2FtbCAoUmljaGFyZCBMb3cpCi1USFJJRlQtMzQ3ICAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBUU29ja2V0IFRpbWVvdXQgSXNzdWVzIChUeWxlciBIb2JicykKLVRIUklGVC05MjQgICAgUEhQICAgICAgICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBwaHAgc3RydWN0dXJlIGNvbnN0YW50cyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTI3ICAgIFBIUCAgICAgICAgICAgICAgICAgIEFkZCBvcHRpb24gdG8gbW9kaWZ5IHRoZSBQSFAgaW5jbHVkZSBwYXRoIChEYXZpZCBSZWlzcykKLVRIUklGVC05MzUgICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIEV4dGVuc2lvbiBhYm9ydHMgdGhlIGJ1aWxkIGlmIHBocC1jb25maWcgaXMgbm90IGluc3RhbGxlZCAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTQxICAgIFBIUCAgICAgICAgICAgICAgICAgIE1ha2UgUEhQIEMgRXh0ZW5zaW9uIHVzZSB0aGUgZGVmaW5lZCBQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbiBmdW5jdGlvbiAoQ2hyaXMgR29mZmluZXQpCi1USFJJRlQtOTU1ICAgIFBIUCAgICAgICAgICAgICAgICAgIFRocmlmdCBjb21waWxlciBmb3IgV2luZG93cyB1c2VzIGxvd2VyY2FzZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggaXMgaW5jb25zaXN0ZW50IHdpdGggY29tcGlsaW5nIG9uIG90aGVyIHBsYXRmb3JtcyAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTc5ICAgIFJ1YnkgICAgICAgICAgICAgICAgIHJ1YnkgYmluZGluZ3MgdXNlZCB0byB3b3JrIG9uIGpydWJ5IChKZWZmIEhvZGdlcykKLVRIUklGVC01ODEgICAgVGVzdCBTdWl0ZSAgICAgICAgICAgQWRkIGEgdGVzdHN1aXRlIGZvciB0eFRocmlmdCAoVHdpc3RlZCkgKEVzdGV2ZSBGZXJuYW5kZXopCi1USFJJRlQtMTAyNCAgIFR1dG9yaWFsICAgICAgICAgICAgIEFkZCBQeXRob24gVHdpc3RlZCBleGFtcGxlIHRvIHRoZSBUdXRvcmlhbCAoUm9nZXIgTWVpZXIpCi1USFJJRlQtODkzICAgIFR1dG9yaWFsICAgICAgICAgICAgIGFkZCBKYXZhU2NyaXB0IHRvIHRoZSB0dXRvcmlhbCBleGFtcGxlcyAoUm9nZXIgTWVpZXIpCitUaHJpZnQgMC45LjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMjQ0MV0gLSBDYW5ub3Qgc2h1dGRvd24gVFRocmVhZGVkU2VydmVyIHdoZW4gY2xpZW50cyBhcmUgc3RpbGwgY29ubmVjdGVkCisgICAgKiBbVEhSSUZULTI0NjVdIC0gVEJpbmFyeVByb3RvY29sVCBicmVha3MgaWYgY29waWVkL21vdmVkCisgICAgKiBbVEhSSUZULTI0NzRdIC0gdGhyaWZ0LmggY2F1c2VzIGEgY29tcGlsZSBmYWlsdXJlCisgICAgKiBbVEhSSUZULTI1NDBdIC0gUnVubmluZyBjb25maWd1cmUgZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZhaWxzCisgICAgKiBbVEhSSUZULTI1OThdIC0gQWRkIGNoZWNrIGZvciBtaW5pbXVtIEdvIHZlcnNpb24gdG8gY29uZmlndXJlLmFjCisgICAgKiBbVEhSSUZULTI2NDddIC0gY29tcGlsZXItaHM6IGRvbid0IGRlY2FwaXRhbGl6ZSBmaWVsZCBuYW1lcywgZG8gZGVjYXBpdGFsaXplIGFyZ3VtZW50IGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTI3NzNdIC0gR2VuZXJhdGVkIEphdmEgY29kZSBmb3IgJ29uZXdheScgbWV0aG9kcyBpcyBpbmNvcnJlY3QuCisgICAgKiBbVEhSSUZULTI3ODldIC0gVE5vbmJsb2NraW5nU2VydmVyIGxlYWtzIHNvY2tldCBGRCdzIHVuZGVyIGxvYWQKKyAgICAqIFtUSFJJRlQtMjY4Ml0gLSBUVGhyZWFkZWRTZXJ2ZXIgbGVha3MgcGVyLXRocmVhZCBtZW1vcnkKKyAgICAqIFtUSFJJRlQtMjY3NF0gLSBKYXZhU2NyaXB0OiBkZWNsYXJlIEFjY2VwdDogYW5kIENvbnRlbnQtVHlwZTogaW4gcmVxdWVzdAorICAgICogW1RIUklGVC0zMDc4XSAtIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCdzIGxvZ2dlciBpcyBub3QgbmFtZWQgYWZ0ZXIgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTMwNzddIC0gQysrIFRGaWxlVHJhbnNwb3J0IGlnbm9yZXMgcmV0dXJuIGNvZGUgZnJvbSBmdHJ1bmNhdGUKKyAgICAqIFtUSFJJRlQtMzA2N10gLSBDKysgY3BwY2hlY2sgcGVyZm9ybWFuY2UgcmVsYXRlZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zMDY2XSAtIEMrKyBURGVuc2VQcm90b2NvbCBhc3NlcnQgbW9kaWZpZXMgaW5zdGVhZCBvZiBjaGVja3MKKyAgICAqIFtUSFJJRlQtMzA3MV0gLSBib290c3RyYXAuc2ggb24gVWJ1bnR1IDEyLjA0IChQcmVjaXNlKSBhdXRvbWFrZSBlcnJvcgorICAgICogW1RIUklGVC0zMDY5XSAtIEMrKyBUU2VydmVyU29ja2V0IGxlYWtzIHNvY2tldCBvbiBmY250bCBnZXQgb3Igc2V0IGZsYWdzIGVycm9yCisgICAgKiBbVEhSSUZULTMwNzldIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzA4MF0gLSBDKysgVE5vbmJsb2NraW5nU2VydmVyIGNvbm5lY3Rpb24gbGVhayB3aGlsZSBhY2NlcHQgaHVnZSBudW1iZXIgY29ubmVjdGlvbnMuCisgICAgKiBbVEhSSUZULTMwODZdIC0gQysrIFZhbGdyaW5kIEVycm9yIENsZWFudXAKKyAgICAqIFtUSFJJRlQtMzA4NV0gLSB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCBuZXZlciB0cnkgdG8gcmVjb25uZWN0CisgICAgKiBbVEhSSUZULTMxMjNdIC0gTWlzc2luZyBpbmNsdWRlIGluIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5oIGJyZWFrcyBidWlsZCBpbiBzb21lIGVudmlyb25tZW50cworICAgICogW1RIUklGVC0zMTI1XSAtIEZpeCB0aGUgbGlzdCBvZiBleHBvcnRlZCBoZWFkZXJzIGluIGF1dG9tYWtlIGlucHV0CisgICAgKiBbVEhSSUZULTMxMjZdIC0gUEhQIEpTT04gc2VyaWFsaXplciBjb252ZXJ0cyBlbXB0eSBvciBpbnQtaW5kZXhlZCBtYXBzIHRvIGxpc3RzCisgICAgKiBbVEhSSUZULTMxMzJdIC0gUHJvcGVybHkgZm9ybWF0IGRhdGUgaW4gSmF2YSBAR2VuZXJhdGVkIGFubm90YXRpb25zCisgICAgKiBbVEhSSUZULTMxMzddIC0gVHJhdmlzIGJ1aWxkIGhhbmdzIGFmdGVyIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzEzOF0gLSAibWFrZSBjaGVjayIgcGFyYWxsZWwgZXhlY3V0aW9uIGlzIHVuZGVybWluaXN0aWMKKyAgICAqIFtUSFJJRlQtMzEzOV0gLSBKUyBsaWJyYXJ5IHRlc3QgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzE0MF0gLSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlzIHRocm93biBieSBKYXZhU2NyaXB0IHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTMxMjRdIC0gU29tZSBzaWduZWQvdW5zaWduZWQgd2FybmluZ3Mgd2hpbGUgYnVpbGRpbmcgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzEyOF0gLSBHbyBnZW5lcmF0ZWQgY29kZSBwcm9kdWNlcyBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworICAgICogW1RIUklGVC0zMTQ2XSAtIEdyYXBodml6IGdlbmVyYXRlcyBmdW5jdGlvbiBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworICAgICogW1RIUklGVC0zMTQ3XSAtIFNlZ2ZhdWx0IHdoaWxlIHJlY2VpdmluZyBkYXRhCisgICAgKiBbVEhSSUZULTMxNDhdIC0gTWFya2Rvd24gbGlua3MgdG8gY29kaW5nX3N0YW5kYXJkcyBhcmUgZGVhZAorICAgICogW1RIUklGVC0zMDkwXSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBNYWNPU1gKKyAgICAqIFtUSFJJRlQtMzA5N10gLSBjbWFrZSB0YXJnZXRzIHVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gb3B0aW9uYWwgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTMwOTRdIC0gbWFzdGVyIGFzIG9mIDIwMTUtQVBSLTEzIGZhaWxzIC1EQk9PU1RfVEhSRUFEUyBjbWFrZSBidWlsZAorICAgICogW1RIUklGVC0zMDk5XSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBGcmVlQlNECisgICAgKiBbVEhSSUZULTMwODldIC0gQXNzaWduaW5nIGRlZmF1bHQgRU5VTSB2YWx1ZXMgcmVzdWx0cyBpbiBub24tY29tcGlsYWJsZSBqYXZhIGNvZGUgaWYgamF2YSBuYW1lc3BhY2UgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMzA5M10gLSBtaW5ndyBjb21waWxlIGZpeGVzIGZvciBjKysgbGlicmFyeSAwLjkuMgorICAgICogW1RIUklGVC0zMDk4XSAtIFRocmlmdCBkb2VzIG5vdCBwcmV0dHkgcHJpbnQgYmluYXJ5IHR5cGVkZWZzIHRoZSB3YXkgaXQgZG9lcyBiaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTMwOTFdIC0gY19nbGliIHNlcnZpY2UgbWV0aG9kIHNob3VsZCByZXR1cm4gcmVzdWx0IGZyb20gaGFuZGxlciBtZXRob2QKKyAgICAqIFtUSFJJRlQtMzA4OF0gLSBUVGhyZWFkUG9vbFNlcnZlciB3aXRoIFNhc2wgYXV0aCBtYXkgbGVhayBDTE9TRV9XQUlUIHNvY2tldAorICAgICogW1RIUklGVC0zMTA5XSAtIENyb3NzIHRlc3QgbG9nIGZpbGUgY2Fubm90IGJlIGJyb3dzZWQgd2hlbiBzZXJ2ZWQgaW4gSFRUUCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzExM10gLSBtNCBDKysxMSBtYWNybyBpc3N1ZQorICAgICogW1RIUklGVC0zMTA1XSAtIEMrKyBsaWJ0aHJpZnRuYiBsaWJyYXJ5IG9uIFdpbmRvd3MgYnVpbGQgZmFpbHVyZQorICAgICogW1RIUklGVC0zMTE1XSAtIFVuY29tcGlsZWFibGUgY29kZSBkdWUgdG8gbmFtZSBjb2xsaXNpb24gd2l0aCBwcmVkZWZpbmVkIHVzZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzExN10gLSBKYXZhIFRTU0xUcmFuc3BvcnRGYWN0b3J5IGNhbid0IGxvYWQgY2VydGlmaWNhdGVzIHdpdGhpbiBKQVIgYXJjaGl2ZQorICAgICogW1RIUklGVC0zMTAyXSAtIGNvdWxkIG5vdCBtYWtlIGNoZWNrIGZvciBHbyBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTMxMjBdIC0gTWlub3Igc3BlbGxpbmcgZXJyb3JzIGFuZCBhbiBvdXRkYXRlZCBVUkwKKyAgICAqIFtUSFJJRlQtMzEyMV0gLSBMaWJydCBkb2VzIG5vdCBleGlzdCBvbiBPUyBYCisgICAgKiBbVEhSSUZULTMxNTJdIC0gQ29tcGlsZXIgZXJyb3Igb24gTWFjIE9TWCAobWlzc2luZyAjaW5jbHVkZSA8Y3N0ZGxpYj4pCisgICAgKiBbVEhSSUZULTMxNjJdIC0gbWFrZSBmYWlscyBmb3IgZG1kIDIuMDY3CisgICAgKiBbVEhSSUZULTMxNjRdIC0gVGhyaWZ0IEMrKyBsaWJyYXJ5IFNTTCBzb2NrZXQgYnkgZGVmYXVsdCBhbGxvd3MgZm9yIHVuc2VjdXJlIFNTTHYzIG5lZ290aWF0aW9uCisgICAgKiBbVEhSSUZULTMxNjhdIC0gRml4IE1hdmVuIFBPTQorICAgICogW1RIUklGVC0zMTcwXSAtIEluaXRpYWxpc20gY29kZSBpbiB0aGUgR28gY29tcGlsZXIgY2F1c2VzIGNoYW9zCisgICAgKiBbVEhSSUZULTMxNjldIC0gRG8gbm90IGV4cG9ydCB0aHJpZnQuVGVzdFN0cnVjdCBhbmQgdGhyaWZ0LlRlc3RFbnVtIGluIHRocmlmdCBHbyBsaWJyYXJ5IAorICAgICogW1RIUklGVC0zMTkxXSAtIFBlcmwgY29tcGlsZXIgZG9lcyBub3QgYWRkIHN1cHBvcnQgZm9yIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTMxNzhdIC0gZ2xpYiBDIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzE4OV0gLSBQZXJsIFNlcnZlclNvY2tldCBzaG91bGQgYWxsb3cgYSBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYmUgbGlzdGVuZWQgdG8KKyAgICAqIFtUSFJJRlQtMzI1Ml0gLSBNaXNzaW5nIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCBpbiBjcHAgTWFrZWZpbGUsIHNvIGRvZXNuJ3QgaW5zdGFsbAorICAgICogW1RIUklGVC0zMjU1XSAtIFRocmlmdCBnZW5lcmF0b3IgZG9lc24ndCBleGNsdWRlICdwYWNrYWdlJyBrZXl3b3JkIGZvciB0aHJpZnQgcHJvcGVydHkgbmFtZXMgYnJlYWtpbmcgamF2YSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzI2MF0gLSBtdWx0aXBsZSB3YXJuaW5ncyBpbiBjX2dsaWIgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMzI1Nl0gLSBTb21lIEQgdGVzdCB0aW1pbmdzIGFyZSB0b28gYWdncmVzc2l2ZSBmb3Igc2xvdyBtYWNoaW5lcworICAgICogW1RIUklGVC0zMjU3XSAtIHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZQorICAgICogW1RIUklGVC0zMTg0XSAtIFRocmlmdCBHbyBsZWF2ZXMgZmlsZSBkZXNjcmlwdG9ycyBvcGVuCisgICAgKiBbVEhSSUZULTMyMDNdIC0gRE9BUCAtIHBsZWFzZSBmaXggIk9jYW1sIiA9PiAiT0NhbWwiCisgICAgKiBbVEhSSUZULTMyMTBdIC0gKHVuY29tcGlsZWFibGUpIGNvZGUgZ2VuZXJhdGVkIGZvciBzZXJ2ZXIgZXZlbnRzIHdoaWxlIGFyZSBldmVudHMgbm90IGVuYWJsZWQKKyAgICAqIFtUSFJJRlQtMzIxNV0gLSBUSlNPTlByb3RvY29sICcoYysrKSB1c2VzICJ0aHJvdyBuZXciIHRvIHRocm93IGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiAidGhyb3ciCisgICAgKiBbVEhSSUZULTMyMDJdIC0gQWxsb3cgSFNIQVNlcnZlciB0byBjb25maWd1cmUgbWluIGFuZCBtYXggd29ya2VyIHRocmVhZHMgc2VwYXJhdGVseS4KKyAgICAqIFtUSFJJRlQtMzIwNV0gLSBUQ29tcGFjdFByb3RvY29sIHJldHVybiBhIHdyb25nIGVycm9yIHdoZW4gdGhlIGlvLkVPRiBoYXBwZW5zCisgICAgKiBbVEhSSUZULTMyMDldIC0gTEdQTCBtZW50aW9uZWQgaW4gbGljZW5zZSBmaWxlCisgICAgKiBbVEhSSUZULTMxOTddIC0ga2VlcEFsaXZlVGltZSBpcyBoYXJkIGNvZGVkIGFzIDYwIHNlYyBpbiBUVGhyZWFkUG9vbFNlcnZlcgorICAgICogW1RIUklGVC0zMTk2XSAtIE1pc3NwZWxsaW5nIGluIGx1YSBUQmluYXJ5UHJvdG9jb2wgKHN0aXJjdFdyaXRlID0+IHN0cmljdFdyaXRlKQorICAgICogW1RIUklGVC0zMTk4XSAtIEFsbG93IGNvbnN0cnVjdGlvbiBvZiBUVHJhbnNwb3J0RmFjdG9yeSB3aXRoIGEgc3BlY2lmaWVkIG1heExlbmd0aAorICAgICogW1RIUklGVC0zMTkyXSAtIEdvIGltcG9ydCBwYXRocyBjaGFuZ2VkIGluIDEuNCwgYW5kIGV4cGlyZWQgSnVuZSAxCisgICAgKiBbVEhSSUZULTMyNzFdIC0gQ291bGQgbm90IGZpbmQgb3IgbG9hZCBtYWluIGNsYXNzIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgb24gc29tZSBub24tZW5nbGlzaCBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTMyNzNdIC0gY19nbGliOiBHZW5lcmF0ZWQgY29kZSB0cmllcyB0byBjb252ZXJ0IGJldHdlZW4gZnVuY3Rpb24gYW5kIHZvaWQgcG9pbnRlcnMKKyAgICAqIFtUSFJJRlQtMzI2NF0gLSBGaXggRXJsYW5nIDE2IG5hbWVzcGFjZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzI3MF0gLSByZXVzaW5nIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24gY2F1c2UgZGlydHkgVFNvY2tldAorICAgICogW1RIUklGVC0zMjY3XSAtIGNfZ2xpYjogIkNyaXRpY2FsIiBmYWlsdXJlIGR1cmluZyB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTMyNzddIC0gVEh0dHBDbGllbnQgbGVha3MgY29ubmVjdGlvbnMgaWYgaXQncyB1c2VkIGZvciBtdWx0aXBsZSByZXF1ZXN0cworICAgICogW1RIUklGVC0zMjc4XSAtIE5vZGVKUzogRml4IGV4Y2VwdGlvbiBzdGFjayB0cmFjZXMgYW5kIG5hbWVzCisgICAgKiBbVEhSSUZULTMyNzldIC0gRml4IGEgYnVnIGluIHJldHJ5X21heF9kZWxheSAoTm9kZUpTKQorICAgICogW1RIUklGVC0zMjgwXSAtIEluaXRpYWxpemUgcmV0cnkgdmFyaWFibGVzIG9uIGNvbnN0cnVjdGlvbgorICAgICogW1RIUklGVC0zMjgzXSAtIGNfZ2xpYjogVHV0b3JpYWwgc2VydmVyIGFsd2F5cyBleGl0cyB3aXRoIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMzI4NF0gLSBjX2dsaWI6IEVtcHR5IHNlcnZpY2UgcHJvZHVjZXMgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTkyNV0gLSBjX2dsaWIgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0xODQ5XSAtIGFmdGVyIHRyYW5zcG9ydC0+b3BlbigpIG9wZW5zIGlzT3BlbiByZXR1cm5zIHRydWUgYW5kIG5leHQgb3BlbigpIGdvZXMgdGhydSB3aGVuIGl0IHNoYWxsIG5vdAorICAgICogW1RIUklGVC0xODY2XSAtIGphdmEgY29tcGlsZXIgZ2VuZXJhdGVzIG5vbi1jb21waWxpbmcgY29kZSB3aXRoIGNvbnN0J3MgZGVmaW5lZCBpbiBhIHRocmlmdCB3aGVuIG5hbWUgaW5jbHVkZXMgbm9uLWlkZW50aWZpZXIgY2hhcnMKKyAgICAqIFtUSFJJRlQtMTkzOF0gLSBGdW5jdGlvblJ1bm5lci5oIC0tIHVzZXMgd3JvbmcgcGF0aCBmb3IgVGhyZWFkLmggd2hlbiBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMTg0NF0gLSBQYXNzd29yZCBzdHJpbmcgbm90IGNsZWFyZWQKKyAgICAqIFtUSFJJRlQtMjAwNF0gLSBUaHJpZnQ6OlVuaW9uIHZpb2xhdGVzIDo9PSBtZXRob2QgY29udHJhY3QgYW5kIGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMjA3M10gLSBUaHJpZnQgQysrIFRIdHRwQ2xpZW50IGVycm9yOiBjYW5ub3QgcmVmaWxsIGJ1ZmZlcgorICAgICogW1RIUklGVC0yMTI3XSAtIEF1dG9jb25mIHNjcmlwdGluZyBkb2VzIG5vdCBwcm9wZXJseSBhY2NvdW50IGZvciBjcm9zcy1jb21waWxlCisgICAgKiBbVEhSSUZULTIxODBdIC0gSW50ZWdlciB0eXBlcyBpc3N1ZXMgaW4gQ29jb2EgbGliIG9uIEFSTTY0CisgICAgKiBbVEhSSUZULTIxODldIC0gR28gbmVlZHMgImlzc2V0IiB0byBmdWxseSBzdXBwb3J0ICJ1bmlvbiIgdHlwZSAoYW5kIG9wdGlvbmFscykKKyAgICAqIFtUSFJJRlQtMjE5Ml0gLSBhdXRvdG9vbHMgb24gUmVkaGF0IGJhc2VkIHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMjU0Nl0gLSBjcm9zcyBsYW5ndWFnZSB0ZXN0cyBmYWlscyBhdCAnVGVzdE11bHRpRXhjZXB0aW9uJyB3aGVuIHVzaW5nIG5vZGVqcyBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjU0N10gLSBub2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBmYWlscyB0byBjb25uZWN0IHdpdGggY3BwIHVzaW5nIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjU0OF0gLSBOb2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggIC1zc2wKKyAgICAqIFtUSFJJRlQtMTQ3MV0gLSB0b1N0cmluZygpIGRvZXMgbm90IHByaW50IEJ5dGVCdWZmZXIgdmFsdWVzIHdoZW4gbmVzdGVkIGluIGEgTGlzdAorICAgICogW1RIUklGVC0xMjAxXSAtIGdldGFkZHJpbmZvIHJlc291cmNlIGxlYWsKKyAgICAqIFtUSFJJRlQtNjE1XSAtIFRUaHJlYWRQb29sU2VydmVyIGRvZXNuJ3QgY2FsbCB0YXNrX2RvbmUgYWZ0ZXIgcHVsbGluZyB0YXNrcyBmcm9tIGl0J3MgY2xpZW50cyBxdWV1ZQorICAgICogW1RIUklGVC0xNjJdIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCisgICAgKiBbVEhSSUZULTgxMF0gLSBDcmFzaGVkIGNsaWVudCBvbiBUU29ja2V0OjpjbG9zZSB1bmRlciBsb2FkcworICAgICogW1RIUklGVC01NTddIC0gY2hhcnNldCBwcm9ibGVtIHdpdGggZmlsZSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdAorICAgICogW1RIUklGVC0yMzNdIC0gSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZWdhdGl2ZSBoZXggbGl0ZXJhbHMKKyAgICAqIFtUSFJJRlQtMTY0OV0gLSBjb250cmliL3plcm9tcSBkb2VzIG5vdCBidWlsZCBpbiAwLjguMAorICAgICogW1RIUklGVC0xNjQyXSAtIE1pc2NhbGN1bGF0aW9uIGxlYWQgdG8gdGhyb3cgdW5leHBlY3RlZCAiVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIihvciBjYWxsZWQgIkVBR0FJTiAodGltZWQgb3V0KSIpIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xNTg3XSAtIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0IGVycm9yCisgICAgKiBbVEhSSUZULTEyNDhdIC0gcG9pbnRlciBzdWJ0cmFjdGlvbiBpbiBUTWVtb3J5QnVmZmVyIHJlbGllcyBvbiB1bmRlZmluZWQgYmVoYXZpb3IKKyAgICAqIFtUSFJJRlQtMTc3NF0gLSBTYXNsIFRyYW5zcG9ydCBjbGllbnQgd291bGQgaGFuZyB3aGVuIHRyeWluZyB0byBjb25uZWN0IG5vbi1zYXNsIHRyYW5zcG9ydCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTc1NF0gLSBSYW5nZUVycm9yIGluIGJ1ZmZlciBoYW5kbGluZworICAgICogW1RIUklGVC0xNjE4XSAtIHN0YXRpYyBzdHJ1Y3RNYXAgaW4gRmllbGRNZXRhRGF0YSBpcyBub3QgdGhyZWFkIHNhZmUgYW5kIGNhbiBsZWFkIHRvIGRlYWRsb2NrcworICAgICogW1RIUklGVC0yMzM1XSAtIHRocmlmdCBpbmNvbXBhdGliaWxpdHkgd2l0aCBweTp0b3JuYWRvIGFzIHNlcnZlciwgamF2YSBhcyBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjgwM10gLSBUQ1BfREVGRVJfQUNDRVBUIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb21haW4gc29ja2V0cworICAgICogW1RIUklGVC0yNzk5XSAtIEJ1aWxkIFByb2JsZW0ocyk6IGxkOiBsaWJyYXJ5IG5vdCBmb3VuZCBmb3IgLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICAgKiBbVEhSSUZULTI4MDFdIC0gQysrIHRlc3Qgc3VpdGUgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMjgwMl0gLSBDKysgdHV0b3JpYWwgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMjc5NV0gLSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLmM6ICdkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMnCisgICAgKiBbVEhSSUZULTI4MTddIC0gVFNpbXBsZUpTT05Qcm90b2NvbCByZWFkcyBiZXlvbmQgZW5kIG9mIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMjgyNl0gLSBodG1sOnN0YW5kYWxvbmUgc29tZXRpbWVzIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjgyOV0gLSBTdXBwb3J0IGhheGVsaWIgaW5zdGFsbGF0aW9uIHZpYSBnaXRodWIKKyAgICAqIFtUSFJJRlQtMjgyOF0gLSBzbGlnaHRseSB3cm9uZyBoZWxwIHNjcmVlbiBpbmRlbnQKKyAgICAqIFtUSFJJRlQtMjgzMV0gLSBSZW1vdmVzIGRlYWQgY29kZSBpbiB3ZWJfc2VydmVyLmpzIGludHJvZHVjZWQgaW4gVEhSSUZULTI4MTkKKyAgICAqIFtUSFJJRlQtMjgyM10gLSBBbGwgSlMtdGVzdHMgYXJlIGZhaWxpbmcgd2hlbiBydW4gd2l0aCBncnVudCB0ZXN0CisgICAgKiBbVEhSSUZULTI4MjddIC0gVGhyaWZ0IDAuOS4yIGZhaWxzIHRvIGNvbXBpbGUgb24gWW9zZW1pdGUgZHVlIHRvIHRyMS9mdW5jdGlvbmFsIGluY2x1ZGUgaW4gUHJvY2Vzc29yVGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMjg0M10gLSBBdXRvbWFrZSBjb25maWd1cmUuYWMgaGFzIHBvc3NpYmxlIHR5cG8gcmVsYXRlZCB0byBKYXZhCisgICAgKiBbVEhSSUZULTI4MTNdIC0gbXVsdGlwbGUgaGF4ZSBsaWJyYXJ5IGZpeGVzL2ltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yODI1XSAtIFN1cHBseWluZyB1bmljb2RlIHRvIHB5dGhvbiBUaHJpZnQgY2xpZW50IGNhbiBjYXVzZSBuZXh0IHJlcXVlc3QgYXJndW1lbnRzIHRvIGdldCBvdmVyd3JpdHRlbgorICAgICogW1RIUklGVC0yODQwXSAtIENhYmFsIGZpbGUgcG9pbnRzIHRvIExJQ0VOU0UgZmlsZSBvdXRzaWRlIHRoZSBwYXRoIG9mIHRoZSBIYXNrZWxsIHByb2plY3QuCisgICAgKiBbVEhSSUZULTI4MThdIC0gVHJhaWxpbmcgY29tbWFzIGluIGFycmF5CisgICAgKiBbVEhSSUZULTI4MzBdIC0gQ2xlYW4gdXAgYW50IHdhcm5pbmdzIGluIHR1dG9yaWFsIGRpcgorICAgICogW1RIUklGVC0yODQyXSAtIEVybGFuZyB0aHJpZnQgY2xpZW50IGhhcyBpbmZpbml0ZSB0aW1lb3V0CisgICAgKiBbVEhSSUZULTI4MTBdIC0gRG8gbm90IGxlYXZlIHRoZSB1bmRlcmx5aW5nIFNlcnZlclNvY2tldCBvcGVuIGlmIGNvbnN0cnVjdGlvbiBvZiBUU2VydmVyU29ja2V0IGZhaWxzCisgICAgKiBbVEhSSUZULTI4MTJdIC0gR28gc2VydmVyIGFkZGluZyByZWR1bmRhbnQgYnVmZmVyaW5nIGxheWVyCisgICAgKiBbVEhSSUZULTI4MzldIC0gVEZyYW1lZFRyYW5zcG9ydCByZWFkIGJ1ZworICAgICogW1RIUklGVC0yODQ0XSAtIE5vZGVqcyBzdXBwb3J0IGJyb2tlbiB3aGVuIHJ1bm5pbmcgdW5kZXIgQnJvd3NlcmlmeQorICAgICogW1RIUklGVC0yODE0XSAtIGFyZ3MvcmVzdWx0IGNsYXNzZXMgbm90IGZvdW5kIHdoZW4gbm8gbmFtZXNwYWNlIGlzIHNldAorICAgICogW1RIUklGVC0yODQ3XSAtIGZ1bmN0aW9uIElmVmFsdWUoKSBpcyBhIGR1cGxpY2F0ZSBvZiBTeXN0ZW0uU3RyVXRpbHMuSWZUaGVuCisgICAgKiBbVEhSSUZULTI4NDhdIC0gY2VydGFpbiBEZWxwaGkgdGVzdHMgZG8gbm90IGJ1aWxkIGlmIFR5cGVSZWdpc3RyeSBpcyB1c2VkCisgICAgKiBbVEhSSUZULTI4NTRdIC0gR28gU3RydWN0IHdyaXRlciBhbmQgcmVhZGVyIGxvb3NlcyBpbXBvcnRhbnQgZXJyb3IgaW5mb3JtYXRpb24KKyAgICAqIFtUSFJJRlQtMjg1OF0gLSBFbmFibGUgaGVhZGVyIGZpZWxkIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggaW4gVEh0dHBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjg1N10gLSBDIyBnZW5lcmF0b3IgY3JlYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3Igc3RydWN0IGNvbnN0YW50cworICAgICogW1RIUklGVC0yODYwXSAtIERlbHBoaSBzZXJ2ZXIgY2xvc2VzIGNvbm5lY3Rpb24gb24gdW5leHBlY3RlZCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTI4NjhdIC0gRW5oYW5jZSBlcnJvciBoYW5kbGluZyBpbiB0aGUgR28gY2xpZW50IAorICAgICogW1RIUklGVC0yODc5XSAtIFRNZW1vcnlCdWZmZXI6IHVzaW5nIGx1YSBzdHJpbmcgaW4gd3Jvbmcgd2F5CisgICAgKiBbVEhSSUZULTI4NTFdIC0gUmVtb3ZlIHN0cmFuZ2UgcHVibGljIFBlZWsoKSBmcm9tIEdvIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtMjg1Ml0gLSBCZXR0ZXIgT3Blbi9Jc09wZW4vQ2xvc2UgYmVoYXZpb3IgZm9yIFN0cmVhbVRyYW5zcG9ydC4KKyAgICAqIFtUSFJJRlQtMjg3MV0gLSBNaXNzaW5nIHNlbWljb2xvbiBpbiB0aHJpZnQuanMKKyAgICAqIFtUSFJJRlQtMjg3Ml0gLSBUaHJlYWRNYW5hZ2VyIGRlYWRsb2NrIGZvciB0YXNrIGV4cGlyYXRpb24KKyAgICAqIFtUSFJJRlQtMjg4MV0gLSBIYW5kbGUgZXJyb3JzIGZyb20gQWNjZXB0KCkgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTI4NDldIC0gU3BlbGwgZXJyb3JzIHJlcG9ydGVkIGJ5IGNvZGVzcGVsbCB0b29sCisgICAgKiBbVEhSSUZULTI4NzBdIC0gQysrIFRKU09OUHJvdG9jb2wgdXNpbmcgbG9jYWxlIGRlcGVuZGVudCBmb3JtYXR0aW5nCisgICAgKiBbVEhSSUZULTI4ODJdIC0gTHVhIEdlbmVyYXRvcjogdXNpbmcgc3RyaW5nLmxlbiBmdW50aW9uIHRvIGdldCBzdHJ1Y3QobWFwLGxpc3Qsc2V0KSBzaXplCisgICAgKiBbVEhSSUZULTI4NjRdIC0gSlNPTiBnZW5lcmF0b3IgbWlzc2luZyBmcm9tIFZpc3VhbCBTdHVkaW8gYnVpbGQgcHJvamVjdCAKKyAgICAqIFtUSFJJRlQtMjg3OF0gLSBHbyB2YWxpZGF0aW9uIHN1cHBvcnQgb2YgcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTI4NzNdIC0gVFBpcGUgYW5kIFRQaXBlU2VydmVyIGRvbid0IGNvbXBpbGUgb24gV2luZG93cyB3aXRoIFVOSUNPREUgZW5hYmxlZAorICAgICogW1RIUklGVC0yODg4XSAtIGltcG9ydCBvZiA8bGltaXRzPiBpcyBtaXNzaW5nIGluIEpTT04gZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI5MDBdIC0gUHl0aG9uIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlc2V0IHNvY2tldCB0aW1lb3V0IG9uIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yOTA3XSAtICdudG9obGwnIG1hY3JvIHJlZGVmaW5lZAorICAgICogW1RIUklGVC0yODg0XSAtIE1hcCBkb2VzIG5vdCBzZXJpYWxpemUgY29ycmVjdGx5IGZvciBKU09OIHByb3RvY29sIGluIEdvIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjg4N10gLSAtLXdpdGgtb3BlbnNzbCBjb25maWd1cmUgZmxhZyBpcyBpZ25vcmVkCisgICAgKiBbVEhSSUZULTI4OTRdIC0gUEhQIGpzb24gc2VyaWFsaXplciBza2lwcyBtYXBzIHdpdGggaW50L2Jvb2wga2V5cworICAgICogW1RIUklGVC0yOTA0XSAtIGpzb25fcHJvdG9jb2xfdGVzdC5nbyBmYWlscworICAgICogW1RIUklGVC0yOTA2XSAtIGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMjg5MF0gLSBiaW5hcnkgZGF0YSBtYXkgbG9zZSBieXRlcyB3aXRoIEpTT04gdHJhbnNwb3J0IHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMKKyAgICAqIFtUSFJJRlQtMjg5MV0gLSBiaW5hcnkgZGF0YSBtYXkgY2F1c2UgYSBmYWlsdXJlIHdpdGggSlNPTiB0cmFuc3BvcnQgdW5kZXIgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcworICAgICogW1RIUklGVC0yOTAxXSAtIEZpeCBmb3IgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgZnVuY3Rpb25zICsgaW5kZW50YXRpb24gb2YgSmF2YVNjcmlwdCBtYXBzCisgICAgKiBbVEhSSUZULTI5MTZdIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgRCBsYW5ndWFnZQorICAgICogW1RIUklGVC0yOTE4XSAtIFJhY2UgY29uZGl0aW9uIGluIFB5dGhvbiBUUHJvY2Vzc1Bvb2xTZXJ2ZXIgdGVzdAorICAgICogW1RIUklGVC0yOTIwXSAtIEVybGFuZyBUaHJpZnQgdGVzdCB1c2VzIHdyb25nIElETCBmaWxlCisgICAgKiBbVEhSSUZULTI5MjJdIC0gJFRSSUFMIGlzIHVzZWQgd2l0aCBQeXRob24gdGVzdHMgYnV0IG5vdCB0ZXN0ZWQgYWNjb3JkaW5nbHkKKyAgICAqIFtUSFJJRlQtMjkxMl0gLSBBdXRvdG9vbCBidWlsZCBmb3IgQysrIFF0IGxpYnJhcnkgaXMgaW52YWxpZAorICAgICogW1RIUklGVC0yOTE0XSAtIGV4cGxpY2l0IGRlcGVuZGVuY3kgdG8gTHVhNS4yIGZhaWxzIG9uIHNvbWUgc3lzdGVtcworICAgICogW1RIUklGVC0yOTEwXSAtIGxpYmV2ZW50IGlzIG5vdCByZWFsbHkgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMjkxMV0gLSBmaXggYysrIHZlcnNpb24gemVyb21xIHRyYW5zcG9ydCwgdGhlIG9sZCB2ZXJzaW9uIGNhbm5vdCB3b3JrCisgICAgKiBbVEhSSUZULTI5MTVdIC0gTHVhIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTI5MTddIC0gIm1ha2UgY2xlYW4iIGJyZWFrcyB0ZXN0L2NfZ2xpYgorICAgICogW1RIUklGVC0yOTE5XSAtIEhheGUgdGVzdCBzZXJ2ZXIgdGltZW91dCB0b28gbGFyZ2UKKyAgICAqIFtUSFJJRlQtMjkyM10gLSBKYXZhU2NyaXB0IGNsaWVudCBhc3N1bWVzIGEgbWVzc2FnZSBiZWluZyB3cml0dGVuCisgICAgKiBbVEhSSUZULTI5MjRdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoZXMgd2hlbiB1c2VyLXByb3ZpZGVkIGV2ZW50X2Jhc2UgaXMgdXNlZAorICAgICogW1RIUklGVC0yOTI1XSAtIENNYWtlIGJ1aWxkIGRvZXMgbm90IHdvcmsgd2l0aCBPcGVuU1NMIG5vciBhbnl0aGluZyBpbnN0YWxsZWQgaW4gbm9uLXN5c3RlbSBsb2NhdGlvbgorICAgICogW1RIUklGVC0yOTMxXSAtIEFjY2VzcyB0byB1bmRlY2xhcmVkIHN0YXRpYyBwcm9wZXJ0eTogVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVECisgICAgKiBbVEhSSUZULTI4OTNdIC0gQ01ha2UgYnVpbGQgZmFpbHMgd2l0aCBib29zdCB0aHJlYWQgb3Igc3RkIHRocmVhZAorICAgICogW1RIUklGVC0yOTAyXSAtIEdlbmVyYXRlZCBjX2dsaWIgY29kZSBkb2VzIG5vdCBjb21waWxlIHdpdGggY2xhbmcKKyAgICAqIFtUSFJJRlQtMjkwM10gLSBRdDQgbGlicmFyeSBidWlsdCB3aXRoIENNYWtlIGRvZXMgbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMjk0Ml0gLSBDU2hhcnAgZ2VuZXJhdGUgaW52YWxpZCBjb2RlIGZvciBwcm9wZXJ0eSBuYW1lZCByZWFkIG9yIHdyaXRlCisgICAgKiBbVEhSSUZULTI5MzJdIC0gTm9kZS5qcyBUaHJpZnQgY29ubmVjdGlvbiBsaWJyYXJpZXMgdGhyb3cgRXhjZXB0aW9ucyBpbnRvIGV2ZW50IGVtaXR0ZXIKKyAgICAqIFtUSFJJRlQtMjkzM10gLSB2MC45LjI6IGRvdWJsZXMgZW5jb2RlZCBpbiBub2RlIHdpdGggY29tcGFjdCBwcm90b2NvbCBjYW5ub3QgYmUgZGVjb2RlZCBieSBweXRob24KKyAgICAqIFtUSFJJRlQtMjkzNF0gLSBjcmVhdGVTZXJ2ZXIgc2lnbmF0dXJlIG1pc21hdGNoCisgICAgKiBbVEhSSUZULTI5ODFdIC0gSURMIHdpdGggbm8gbmFtZXNwYWNlIHByb2R1Y2VzIHVucGFyc2FibGUgUEhQCisgICAgKiBbVEhSSUZULTI5OTldIC0gQWRkaXRpb24gb2YgLmdpdGF0dHJpYnV0ZXMgdGV4dCBhdXRvIGluIFRIUklGVC0yNzI0IGNhdXNlcyBtb2RpZmllZCBmaWxlcyBvbiBjaGVja291dAorICAgICogW1RIUklGVC0yOTQ5XSAtIHR5cG8gaW4gY29tcGlsZXIvY3BwL1JFQURNRS5tZAorICAgICogW1RIUklGVC0yOTU3XSAtIHdhcm5pbmc6IHNvdXJjZSBmaWxlICVzIGlzIGluIGEgc3ViZGlyZWN0b3J5LCBidXQgb3B0aW9uICdzdWJkaXItb2JqZWN0cycgaXMgZGlzYWJsZWQKKyAgICAqIFtUSFJJRlQtMjk1M10gLSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IGlzIG5vdCBTdG9wKClhYmxlCisgICAgKiBbVEhSSUZULTI5NjJdIC0gRG9ja2VyIFRocmlmdCBlbnYgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nCisgICAgKiBbVEhSSUZULTI5NzFdIC0gQysrIHRlc3QgYW5kIHR1dG9yaWFsIHBhcmFsbGVsIGJ1aWxkIGlzIHVuc3RhYmxlCisgICAgKiBbVEhSSUZULTI5NzJdIC0gTWlzc2luZyBiYWNrc2xhc2ggaW4gbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTI5NTFdIC0gRml4IEVybGFuZyBuYW1lIGNvbmZsaWN0IHRlc3QKKyAgICAqIFtUSFJJRlQtMjk1NV0gLSBVc2luZyBsaXN0IG9mIHR5cGVkZWZzIGRvZXMgbm90IGNvbXBpbGUgb24gR28KKyAgICAqIFtUSFJJRlQtMjk2MF0gLSBuYW1lc3BhY2UgcmVncmVzc2lvbiBmb3IgUnVieQorICAgICogW1RIUklGVC0yOTU5XSAtIG5vZGVqczogZml4IGJpbmFyeSB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTI5NjZdIC0gbm9kZWpzOiBGaXggYmFkIHJlZmVyZW5jZXMgdG8gVFByb3RvY29sRXhjZXB0aW9uIGFuZCBUUHJvdG9jb2xFeGNlcHRpb25UeXBlCisgICAgKiBbVEhSSUZULTI5NzBdIC0gZ3J1bnQtanNkb2MgZmFpbHMgZHVlIHRvIGRlcGVuZGVuY3kgaXNzdWVzCisgICAgKiBbVEhSSUZULTMwMDFdIC0gQyMgRXF1YWxzIGZhaWxzIGZvciBiaW5hcnkgZmllbGRzIChieXRlW10pCisgICAgKiBbVEhSSUZULTMwMDNdIC0gTWlzc2luZyBMSUNFTlNFIGZpbGUgcHJldmVudHMgcGFja2FnZSBmcm9tIGJlaW5nIGluc3RhbGxlZAorICAgICogW1RIUklGVC0zMDA4XSAtIE5vZGUuanMgc2VydmVyIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMwMDddIC0gVHJhdmlzIGJ1aWxkIGlzIGJyb2tlbiBiZWNhdXNlIG9mIGRpcmVjdG9yeSBjb25mbGljdAorICAgICogW1RIUklGVC0zMDA5XSAtIFRTU0xTb2NrZXQgZG9lcyBub3QgdXNlIHRoZSBjb3JyZWN0IGhvc3RuYW1lIChicmVha3MgY2VydGlmaWNhdGUgY2hlY2tzKQorICAgICogW1RIUklGVC0zMDExXSAtIEMjIHRlc3Qgc2VydmVyIHRlc3RFeGNlcHRpb24oKSBub3QgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHNwZWNzCisgICAgKiBbVEhSSUZULTMwMTJdIC0gVGltaW5nIHByb2JsZW1zIGluIE5hbWVkUGlwZSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdW5uZWNlc3Nhcnkgb3Blbi9jbG9zZQorICAgICogW1RIUklGVC0zMDE5XSAtIEdvbGFuZyBnZW5lcmF0b3IgbWlzc2luZyBkb2NzdHJpbmcgZm9yIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMzAyMV0gLSBTZXJ2aWNlIHJlbW90ZSB0b29sIGRvZXMgbm90IGltcG9ydCBzdHViIHBhY2thZ2Ugd2l0aCBwYWNrYWdlIHByZWZpeAorICAgICogW1RIUklGVC0zMDI2XSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMzAyOF0gLSBSZWdyZXNzaW9uIGNhdXNlZCBieSBUSFJJRlQtMjE4MAorICAgICogW1RIUklGVC0zMDE3XSAtIG9yZGVyIG9mIG1hcCBrZXkvdmFsdWUgdHlwZXMgaW5jb3JyZWN0IGZvciBvbmUgQ1RPUgorICAgICogW1RIUklGVC0zMDIwXSAtIENhbm5vdCBjb21waWxlIHRocmlmdCBhcyBDKyswMworICAgICogW1RIUklGVC0zMDI0XSAtIFVzZXItQWdlbnQgIkJhdHRsZU5ldCIgdXNlZCBpbiBzb21lIFRocmlmdCBsaWJyYXJ5IGZpbGVzCisgICAgKiBbVEhSSUZULTMwNDddIC0gVW5ldmVuIGNhbGxzIHRvIGluZGVudF91cCBhbmQgaW5kZW50X2Rvd24gaW4gQ29jb2EgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTMwNDhdIC0gTm9kZUpTIGRlY29kaW5nIG9mIEk2NCBpcyBpbmNvbnNpc3RlbnQgYWNyb3NzIHByb3RvY29scworICAgICogW1RIUklGVC0zMDQzXSAtIGdvIGNvbXBpbGVyIGdlbmVyYXRvciB1c2VzIG5vbiBDKys5OCBjb2RlCisgICAgKiBbVEhSSUZULTMwNDRdIC0gRG9ja2VyIFJFQURNRS5tZCBwYXRocyB0byBEb2NrZXJmaWxlcyBhcmUgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTMwNDBdIC0gYm93ZXIuanNvbiB3cm9uZyAibWFpbiIgcGF0aAorICAgICogW1RIUklGVC0zMDUxXSAtIEdvIFRocmlmdCBnZW5lcmF0b3IgY3JlYXRlcyBiYWQgZ28gY29kZQorICAgICogW1RIUklGVC0zMDU3XSAtIEphdmEgY29tcGlsZXIgYnVpbGQgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTMwNjFdIC0gQysrIFRTU0xTb2NrZXQgc2h1dGRvd24gZGVsYXkvdnVsbmVyYWJpbGl0eQorICAgICogW1RIUklGVC0zMDYyXSAtIEMrKyBUU2VydmVyU29ja2V0IGludmFsaWQgcG9ydCBudW1iZXIgKG92ZXIgOTk5OTk5KSBjYXVzZXMgc3RhY2sgY29ycnVwdGlvbgorICAgICogW1RIUklGVC0zMDY1XSAtIFVwZGF0ZSBsaWJ0aHJpZnQgZGVwZW5kZW5jaWVzIChzbGY0aiwgaHR0cGNvcmUsIGh0dHBjbGllbnQpCisgICAgKiBbVEhSSUZULTMyNDRdIC0gVHlwZVNjcmlwdDogZml4IG5hbWVzcGFjZSBvZiBpbmNsdWRlZCB0eXBlcworICAgICogW1RIUklGVC0zMjQ2XSAtIFJlZHVjZSB0aGUgbnVtYmVyIG9mIHRyaXZpYWwgd2FybmluZ3MgaW4gV2luZG93cyBDKysgQ01ha2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTMyMjRdIC0gRml4IFROYW1lZFBpcGVTZXJ2ZXIgdW5wcmVkaWN0YWJsZSBiZWhhdmlvciBvbiBhY2NlcHQKKyAgICAqIFtUSFJJRlQtMzIzMF0gLSBQeXRob24gY29tcGlsZXIgZ2VuZXJhdGVzIHdyb25nIGNvZGUgaWYgdGhlcmUgaXMgZnVuY3Rpb24gdGhyb3dpbmcgYSB0eXBlZGVmIG9mIGV4Y2VwdGlvbiB3aXRoIGFub3RoZXIgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTMyMzZdIC0gTWF4U2tpcERlcHRoIG5ldmVyIGNoZWNrZWQKKyAgICAqIFtUSFJJRlQtMzIzOV0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzI0MV0gLSBmYXRhbCBlcnJvcjogcnVudGltZTogY2Fubm90IG1hcCBwYWdlcyBpbiBhcmVuYSBhZGRyZXNzIHNwYWNlCisgICAgKiBbVEhSSUZULTMyNDJdIC0gT1NHaSBJbXBvcnQtUGFja2FnZSBkaXJlY3RpdmUgaXMgbWlzc2luZyB0aGUgQXBhY2hlIEhUVFAgcGFja2FnZXMKKyAgICAqIFtUSFJJRlQtMzIzNF0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzIyMl0gLSBUeXBlU2NyaXB0OiBHZW5lcmF0ZWQgRW51bXMgYXJlIHF1b3RlZAorICAgICogW1RIUklGVC0zMjI5XSAtIHVuZXhwZWN0ZWQgVGltZW91dCBleGNlcHRpb24gd2hlbiBkZXNpcmVkIGJ5dGVzIGFyZSBvbmx5IHBhcnRpYWxseSBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzIzMV0gLSBDUFA6IExpbWl0IHJlY3Vyc2lvbiBkZXB0aCB0byA2NAorICAgICogW1RIUklGVC0zMjM1XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMTc1XSAtIGZhc3RiaW5hcnkuYyBweXRob24gZGVzZXJpYWxpemUgY2FuIGNhdXNlIGh1Z2UgYWxsb2NhdGlvbnMgZnJvbSBnYXJiYWdlCisgICAgKiBbVEhSSUZULTMxNzZdIC0gVW5pb24gaW5jb3JyZWN0bHkgaW1wbGVtZW50cyA9PQorICAgICogW1RIUklGVC0zMTc3XSAtIEZhaWxzIHRvIHJ1biByYWtlIHRlc3QKKyAgICAqIFtUSFJJRlQtMzE4MF0gLSBsdWEgcGx1Z2luOiBmcmFtZWQgdHJhbnNwb3J0IGRvIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTMxNzldIC0gbHVhIHBsdWdpbiBjYW50IGNvbm5lY3QgdG8gcmVtb3RlIHNlcnZlciBiZWNhdXNlIGZ1bmN0aW9uIGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdCBhbHdheXMgYmluZCBzb2NrZXQgdG8gbG9jYWxob3N0CisgICAgKiBbVEhSSUZULTMyNDhdIC0gVHlwZVNjcmlwdDogYWRkaXRpb25hbCBjb21tYSBpbiBtZXRob2Qgc2lnbmF0dXJlIHdpdGhvdXQgcGFyYW1ldGVycworICAgICogW1RIUklGVC0zMzAyXSAtIEdvIEpTT04gcHJvdG9jb2wgc2hvdWxkIGVuY29kZSBUaHJpZnQgYnl0ZSB0eXBlIGFzIHNpZ25lZCBpbnRlZ2VyIHN0cmluZworICAgICogW1RIUklGVC0zMjk3XSAtIGNfZ2xpYjogYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTMyOTRdIC0gVFpsaWJUcmFuc3BvcnQgZm9yIEphdmEgZG9lcyBub3Qgd3JpdGUgZGF0YSBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzI5Nl0gLSBHbyBjcm9zcyB0ZXN0IGRvZXMgbm90IGNvbmZvcm0gdG8gc3BlYworICAgICogW1RIUklGVC0zMjk1XSAtIEMjIGxpYnJhcnkgZG9lcyBub3QgYnVpbGQgb24gTW9ubyA0LjAuMi41IG9yIGxhdGVyCisgICAgKiBbVEhSSUZULTMyOTNdIC0gSmF2YVNjcmlwdDogbnVsbCB2YWx1ZXMgdHVybiBpbnRvIGVtcHR5IHN0cnVjdHMgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMzMxMF0gLSBsaWIvZXJsL1JFQURNRS5tZCBoYXMgaW5jb3JyZWN0IGZvcm1hdHRpbmcKKyAgICAqIFtUSFJJRlQtMzMxOV0gLSBDU2hhcnAgdHV0b3JpYWwgd2lsbCBub3QgYnVpbGQgdXNpbmcgdGhlICouc2xuCisgICAgKiBbVEhSSUZULTMzMzVdIC0gUnVieSBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzMzOF0gLSBTdHJheSB1bmRlcnNjb3JlIGluIGdlbmVyYXRlZCBnbyB3aGVuIHNlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCAiTmV3IgorICAgICogW1RIUklGVC0zMzI0XSAtIFVwZGF0ZSBHbyBEb2NzIGZvciBwdWxsaW5nIGFsbCBwYWNrYWdlcworICAgICogW1RIUklGVC0zMzQ1XSAtIENsaWVudHMgYmxvY2tlZCBpbmRlZmluaXRlbHkgd2hlbiBhIGphdmEubGFuZy5FcnJvciBpcyB0aHJvd24KKyAgICAqIFtUSFJJRlQtMzMzMl0gLSBtYWtlIGRpc3QgZmFpbHMgb24gY2xlYW4gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzMyNl0gLSBUZXN0cyBkbyBub3QgY29tcGlsZSB1bmRlciAqQlNECisgICAgKiBbVEhSSUZULTMzMzRdIC0gTWFya2Rvd24gbm90YXRpb24gb2YgcHJvdG9jb2wgc3BlYyBpcyBtYWxmb3JtZWQKKyAgICAqIFtUSFJJRlQtMzMzMV0gLSB3YXJuaW5nOiDDouKCrMucZXR5cGXDouKCrOKEoiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzM0OV0gLSBQeXRob24gc2VydmVyIGRvZXMgbm90IGhhbmRsZSBwcm9jZXNzb3IgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMzNDNdIC0gRml4IGhhc2tlbGwgUkVBRE1FCisgICAgKiBbVEhSSUZULTMzNDBdIC0gUHl0aG9uOiBlbmFibGUganNvbiB0ZXN0cyBhZ2FpbgorICAgICogW1RIUklGVC0zMzExXSAtIFRvcCBsZXZlbCBSRUFETUUubWQgaGFzIGluY29ycmVjdCBmb3JtbWF0aW5nCisgICAgKiBbVEhSSUZULTI5MzZdIC0gTWlub3IgbWVtb3J5IGxlYWsgaW4gU1NMCisgICAgKiBbVEhSSUZULTMyOTBdIC0gVXNpbmcgZnJvbSBpbiB2YXJpYWJsZSBuYW1lcyBjYXVzZXMgdGhlIGdlbmVyYXRlZCBQeXRob24gY29kZSB0byBoYXZlIGVycm9ycworICAgICogW1RIUklGVC0zMjI1XSAtIEZpeCBUUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGludGVycnVwdCgpCisgICAgKiBbVEhSSUZULTMzNTRdIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorICAgICogW1RIUklGVC0yMDA2XSAtIFRCaW5hcnlQcm90b2NvbCBtZXNzYWdlIGhlYWRlciBjYWxsIG5hbWUgbGVuZ3RoIGlzIG5vdCB2YWxpZGF0ZWQgYW5kIGNhbiBiZSB1c2VkIHRvIGNvcmUgdGhlIHNlcnZlcgorICAgICogW1RIUklGVC0zMzI5XSAtIEMrKyBsaWJyYXJ5IHVuaXQgdGVzdHMgZG9uJ3QgY29tcGlsZSBhZ2FpbnN0IHRoZSBuZXcgYm9vc3QtMS41OSB1bml0IHRlc3QgZnJhbWV3b3JrCisgICAgKiBbVEhSSUZULTI2MzBdIC0gd2luZG93czcgNjRiaXQgcGMuIGlwdjQgYW5kIGlwdjYgcGMuY2FuJ3QgdXNlCisgICAgKiBbVEhSSUZULTMzMzZdIC0gVGhyaWZ0IGdlbmVyYXRlZCBzdHJlYW1pbmcgb3BlcmF0b3JzIGFkZGVkIGluIDAuOS4yIGNhbm5vdCBiZSBvdmVycmlkZGVuCisgICAgKiBbVEhSSUZULTI2ODFdIC0gQ29yZSBvZiB1bndpbmRfY2xlYW51cAorICAgICogW1RIUklGVC0zMzE3XSAtIGNwcCBuYW1lc3BhY2Ugb3JnLmFwYWNoZSBpc3N1ZSBhcHBlYXJzIGluIDAuOQorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMyODZdIC0gQXBhY2hlIEFudCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlbmN5CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTIyN10gLSBCeXRlW10gaW4gY29sbGVjdGlvbnMgYXJlbid0IHByZXR0eSBwcmludGVkIGxpa2UgcmVndWxhciBiaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTI3NDRdIC0gVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKyAgICAqIFtUSFJJRlQtMjY0NF0gLSBIYXhlIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjc1Nl0gLSByZWdpc3RlciBNZWRpYSBUeXBlIEAgSUFOQQorICAgICogW1RIUklGVC0zMDc2XSAtIENvbXBhdGliaWxpdHkgd2l0aCBIYXhlIDMuMi4wCisgICAgKiBbVEhSSUZULTMwODFdIC0gQysrIENvbnNvbGlkYXRlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3BzIGluIFRTZXJ2ZXJzCisgICAgKiBbVEhSSUZULTMwODNdIC0gQysrIENvbnNvbGlkYXRlIHNlcnZlciBwcm9jZXNzaW5nIGxvb3BzIGluIFRTaW1wbGVTZXJ2ZXIsIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzA4NF0gLSBDKysgYWRkIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0IHRvIHRocmVhZGVkIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtMzA3NF0gLSAgICAgQWRkIGNvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjIHRvIGdpdGlnbm9yZS4KKyAgICAqIFtUSFJJRlQtMzEzNF0gLSBSZW1vdmUgdXNlIG9mIGRlcHJlY2F0ZWQgInBoYW50b20uYXJncyIKKyAgICAqIFtUSFJJRlQtMzEzM10gLSBBbGxvdyAibWFrZSBjcm9zcyIgYW5kICJtYWtlIHByZWNyb3NzIiB0byBydW4gd2l0aG91dCBidWlsZGluZyBhbGwgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTMxNDJdIC0gTWFrZSBKYXZhU2NyaXB0IHVzZSBkb3dubG9hZGVkIGxpYnJhcmllcworICAgICogW1RIUklGVC0zMTQxXSAtIEltcHJvdmUgbG9nZ2luZyBvZiBKYXZhU2NyaXB0IHRlc3QKKyAgICAqIFtUSFJJRlQtMzE0NF0gLSBQcm9wb3NhbDogbWFrZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW51bXMgaW4gZ2VuZXJhdGVkIGdvIGNvZGUgbGVzcyB2ZXJib3NlCisgICAgKiBbVEhSSUZULTMxMzBdIC0gUmVtb3ZlIHRoZSBsYXN0IHZlc3RpZ2VzIG9mIFRIUklGVF9PVkVSTE9BRF9JRiBmcm9tIFRIUklGVC0xMzE2CisgICAgKiBbVEhSSUZULTMxMzFdIC0gQ29uc29saWRhdGUgc3VnZ2VzdGVkIGltcG9ydCBwYXRoIGZvciBnbyB0aHJpZnQgbGlicmFyeSB0byBnaXQuYXBhY2hlLm9yZyBpbiBkb2NzIGFuZCBjb2RlCisgICAgKiBbVEhSSUZULTMwOTJdIC0gR2VuZXJhdGVkIEhhc2tlbGwgdHlwZXMgc2hvdWxkIGRlcml2ZSBHZW5lcmljCisgICAgKiBbVEhSSUZULTMxMTBdIC0gIFByaW50IGVycm9yIGxvZyBhZnRlciBjcm9zcyB0ZXN0IGZhaWx1cmVzIG9uIFRyYXZpcworICAgICogW1RIUklGVC0zMTE0XSAtIFVzaW5nIGxvY2FsIHRlbXAgdmFyaWFibGVzIHRvIG5vdCBwb2xsdXRlIHRoZSBnbG9iYWwgdGFibGUKKyAgICAqIFtUSFJJRlQtMzEwNl0gLSBDTWFrZSBzdW1tYXJ5IHNob3VsZCBnaXZlIG1vcmUgaW5mb3JtYXRpb24gd2h5IGEgbGlicmFyeSBpcyBzZXQgdG8gb2ZmCisgICAgKiBbVEhSSUZULTMxMTldIC0gSmF2YSdzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGhhcyBpbmRpc3Rpbmd1aXNoYWJsZSBsb2cgbWVzc2FnZXMgaW4gcnVuKCkKKyAgICAqIFtUSFJJRlQtMzEyMl0gLSBKYXZhc2NyaXB0IHN0cnVjdCBjb25zdHJ1Y3RvciBzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBzdHJ1Y3QgYW5kIGNvbnRhaW5lciBtZW1iZXJzIGZyb20gcGxhaW4ganMgYXJndW1lbnRzCisgICAgKiBbVEhSSUZULTMxNTFdIC0gRml4IGxpbmtzIHRvIGdpdC13aXAqIC0gc2hvdWxkIGJlIGdpdC5hcGFjaGUub3JnCisgICAgKiBbVEhSSUZULTMxNjddIC0gV2luZG93cyBidWlsZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbnMgbmVlZCB0byBiZSByZXZpc2VkCisgICAgKiBbVEhSSUZULTMxNTVdIC0gbW92ZSBjb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIHRvIGJ1aWxkL2NtYWtlLworICAgICogW1RIUklGVC0zMTYwXSAtIE1ha2UgZ2VuZXJhdGVkIGdvIGVudW1zIGltcGxlbWVudCBUZXh0TWFyc2hhbGxlciBhbmQgVGV4dFVubWFyc2hhbGxlciBpbnRlcmZhY2VzCisgICAgKiBbVEhSSUZULTMxNTBdIC0gQWRkIGFuIG9wdGlvbiB0byB0aHJpZnQgZ28gZ2VuZXJhdG9yIHRvIG1ha2UgUmVhZCBhbmQgV3JpdGUgbWV0aG9kcyBwcml2YXRlCisgICAgKiBbVEhSSUZULTMxNDldIC0gTWFrZSBSZWFkRmllbGROIG1ldGhvZHMgaW4gZ2VuZXJhdGVkIEdvIGNvZGUgcHJpdmF0ZQorICAgICogW1RIUklGVC0zMTcyXSAtIEFkZCB0dXRvcmlhbCB0byBUaHJpZnQgd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtMzIxNF0gLSBBZGQgRXJsYW5nIG9wdGlvbiBmb3IgdXNpbmcgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzCisgICAgKiBbVEhSSUZULTMyMDFdIC0gQ2FwdHVyZSBnaXRodWIgdGVzdCBhcnRpZmFjdHMgZm9yIGZhaWxlZCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzI2Nl0gLSBjX2dsaWI6IE11bHRpcGxlIGNvbXBpbGVyIHdhcm5pbmdzIGJ1aWxkaW5nIHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzI4NV0gLSBjX2dsaWI6IEJ1aWxkIGxpYnJhcnkgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTE5NTRdIC0gQWxsb3cgZm9yIGEgc2VwYXJhdGUgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIAorICAgICogW1RIUklGVC0yMDk4XSAtIEFkZCBzdXBwb3J0IGZvciBRdDUrCisgICAgKiBbVEhSSUZULTIxOTldIC0gUmVtb3ZlIERlbnNlIHByb3RvY29sICh3YXM6IG1vdmUgdG8gQ29udHJpYikKKyAgICAqIFtUSFJJRlQtNDA2XSAtIEMrKyBUZXN0IHN1aXRlIGNsZWFudXAKKyAgICAqIFtUSFJJRlQtOTAyXSAtIHNvY2tldCBhbmQgY29ubmVjdCB0aW1lb3V0IGluIFRTb2NrZXQgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQKKyAgICAqIFtUSFJJRlQtMzg4XSAtIFVzZSBhIHNlcGFyYXRlIHdpcmUgZm9ybWF0IGZvciBhc3luYyBjYWxscworICAgICogW1RIUklGVC03MjddIC0gc3VwcG9ydCBuYXRpdmUgQysrIGxhbmd1YWdlIHNwZWNpZmljIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgKiBbVEhSSUZULTE3ODRdIC0gcGVwLTMxMTAgY29tcGxpYW5jZSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIAorICAgICogW1RIUklGVC0xMDI1XSAtIEMrKyBTZXJ2ZXJTb2NrZXQgc2hvdWxkIGluaGVyaXQgZnJvbSBTb2NrZXQgd2l0aCB0aGUgbmVjZXNzYXJ5IEN0b3IgdG8gbGlzdGVuIG9uIGNvbm5lY3Rpb25zIGZyb20gYSBzcGVjaWZpYyBob3N0CisgICAgKiBbVEhSSUZULTIyNjldIC0gQ2FuIGRlcGxveSBsaWJ0aHJpZnQtc291cmNlLmphciB0byBtYXZlbiBjZW50ZXIgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0yODA0XSAtIFB1bGwgYW4gaW50ZXJmYWNlIG91dCBvZiBUQmFzZUFzeW5jUHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTI4MDZdIC0gbW9yZSB3aGl0ZXNwYWNlIGZpeHVwcworICAgICogW1RIUklGVC0yODExXSAtIE1ha2UgcmVtb3RlIHNvY2tldCBhZGRyZXNzIGFjY2Vzc2libGUKKyAgICAqIFtUSFJJRlQtMjgwOV0gLSAuZ2l0aWdub3JlIHVwZGF0ZSBmb3IgY29tcGlsZXIncyB2aXN1YWwgcHJvamVjdAorICAgICogW1RIUklGVC0yODQ2XSAtIEV4cG9zZSBjaXBoZXJzIHBhcmFtZXRlciBmcm9tIHNzbC53cmFwX3NvY2tldCgpCisgICAgKiBbVEhSSUZULTI4NTldIC0gSlNPTiBnZW5lcmF0b3I6IG91dHB1dCBjb21wbGV0ZSBkZXNjcmlwdG9ycworICAgICogW1RIUklGVC0yODYxXSAtIGFkZCBidWZmZXJlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjg2NV0gLSBUZXN0IGNhc2UgZm9yIEdvOiBTZXFJZCBvdXQgb2Ygc2VxdWVuY2UKKyAgICAqIFtUSFJJRlQtMjg2Nl0gLSBHbyBnZW5lcmF0b3Igc291cmNlIGNvZGUgaXMgaGFyZCB0byByZWFkIGFuZCBtYWludGFpbgorICAgICogW1RIUklGVC0yODgwXSAtIFJlYWQgdGhlIG5ldHdvcmsgYWRkcmVzcyBmcm9tIHRoZSBsaXN0ZW5lciBpZiBhdmFpbGFibGUuCisgICAgKiBbVEhSSUZULTI4NzVdIC0gVHlwbyBpbiBURGVuc2VQcm90b2NvbC5oIGNvbW1lbnQKKyAgICAqIFtUSFJJRlQtMjg3NF0gLSBUQmluYXJ5UHJvdG9jb2wgIG1lbWJlciB2YXJpYWJsZSAic3RyaW5nX2J1Zl8iIGlzIG5ldmVyIHVzZWQuCisgICAgKiBbVEhSSUZULTI4NTVdIC0gTW92ZSBjb250cmlidXRpbmcubWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtMjg2Ml0gLSBFbmFibGUgUlRUSSBhbmQvb3IgYnVpbGQgbWFjcm9zIGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0yODc2XSAtICBBZGQgdGVzdCBmb3IgVEhSSUZULTI1MjYgQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAorICAgICogW1RIUklGVC0yODk3XSAtIEdlbmVyYXRlIC1pc0VxdWFsOiBhbmQgLWhhc2ggbWV0aG9kcworICAgICogW1RIUklGVC0yOTA5XSAtIEltcHJvdmUgdHJhdmlzIGJ1aWxkCisgICAgKiBbVEhSSUZULTI5MjFdIC0gTWFrZSBFcmxhbmcgaW1wbCByZWFkeSBmb3IgT1RQIDE4IHJlbGVhc2UgKGRpY3QvMCBhbmQgc2V0LzAgYXJlIGRlcHJlY2F0ZWQpCisgICAgKiBbVEhSSUZULTI5MjhdIC0gUmVuYW1lIHRoZSBlcmxhbmcgdGVzdF9zZXJ2ZXIgbW9kdWxlCisgICAgKiBbVEhSSUZULTI5NDBdIC0gQWxsb3cgaW5zdGFsbGluZyBUaHJpZnQgZnJvbSBnaXQgYXMgTlBNIG1vZHVsZSBieSBwcm92aWRpbmcgcGFja2FnZS5qc29uIGluIHRvcCBsZXZlbCBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMjkzN10gLSBBbGxvdyBzZXR0aW5nIGEgbWF4aW11bSBmcmFtZSBzaXplIGluIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjk3Nl0gLSBub2RlanM6IHhociBhbmQgd2Vic29ja2V0IHN1cHBvcnQgZm9yIGJyb3dzZXJpZnkKKyAgICAqIFtUSFJJRlQtMjk5Nl0gLSBUZXN0IGZvciBIYXhlIDMuMS4zIG9yIGJldHRlciAKKyAgICAqIFtUSFJJRlQtMjk2OV0gLSBub2RlanM6IERSWSB1cCBsaWJyYXJ5IHRlc3RzCisgICAgKiBbVEhSSUZULTI5NzNdIC0gVXBkYXRlIEhheGUgbGliIHJlYWRtZSByZWdhcmRpbmcgSGF4ZSAzLjEuMworICAgICogW1RIUklGVC0yOTUyXSAtIEltcHJvdmUgaGFuZGxpbmcgb2YgU2VydmVyLlN0b3AoKSAKKyAgICAqIFtUSFJJRlQtMjk2NF0gLSBub2RlanM6IG1vdmUgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGludG8gc2VwYXJhdGUgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjk2M10gLSBub2RlanMgLSBhZGQgdGVzdCBjb3ZlcmFnZQorICAgICogW1RIUklGVC0zMDA2XSAtIEF0dGFjaCAnb21pdGVtcHR5JyBqc29uIHRhZyBmb3Igb3B0aW9uYWwgZmllbGRzIGluIEdvCisgICAgKiBbVEhSSUZULTMwMjddIC0gR28gY29tcGlsZXIgZG9lcyBub3QgZW5zdXJlIGNvbW1vbiBpbml0aWFsaXNtcyBoYXZlIGNvbnNpc3RlbnQgY2FzZQorICAgICogW1RIUklGVC0zMDMwXSAtIFRUaHJlYWRlZFNlcnZlcjogUHJvcGVydHkgZm9yIG51bWJlciBvZiBjbGllbnRUaHJlYWRzCisgICAgKiBbVEhSSUZULTMwMjNdIC0gR28gY29tcGlsZXIgaXMgYSBsaXR0bGUgb3Zlcmx5IGNvbnNlcnZhdGl2ZSB3aXRoIG5hbWVzIG9mIGF0dHJpYnV0ZXMKKyAgICAqIFtUSFJJRlQtMzAxOF0gLSBDb21wYWN0IHByb3RvY29sIGZvciBEZWxwaGkKKyAgICAqIFtUSFJJRlQtMzAyNV0gLSBDaGFuZ2UgcHVyZSBJbnQgY29uc3RhbnRzIGludG8gQGVudW1zICh3aGVyZSBwb3NzaWJsZSkKKyAgICAqIFtUSFJJRlQtMzAzMV0gLSBtaWdyYXRlICJzaG91bGRTdG9wIiBmbGFnIHRvIFRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzAyMl0gLSBDb21wYWN0IHByb3RvY29sIGZvciBIYXhlCisgICAgKiBbVEhSSUZULTMwNDFdIC0gR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNsaWVudHMgZm9yIENvY29hCisgICAgKiBbVEhSSUZULTMwNTNdIC0gUGVybCBTU0wgU29ja2V0IFN1cHBvcnQgKEVuY3J5cHRpb24pCisgICAgKiBbVEhSSUZULTMyNDddIC0gR2VuZXJhdGUgYSBDKysgdGhyZWFkLXNhZmUgY2xpZW50CisgICAgKiBbVEhSSUZULTMyMTddIC0gUHJvdmlkZSBhIGxpdHRsZSBlbmRpYW4gdmFyaWFudCBvZiB0aGUgYmluYXJ5IHByb3RvY29sIGluIEMrKworICAgICogW1RIUklGVC0zMjIzXSAtIFR5cGVTY3JpcHQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIEVudW0gTWFwcworICAgICogW1RIUklGVC0zMjIwXSAtIE9wdGlvbiB0byBzdXBwcmVzcyBAR2VuZXJhdGVkIEFubm90YXRpb24gZW50aXJlbHkKKyAgICAqIFtUSFJJRlQtMzMwMF0gLSBSZWltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhIHVzaW5nIHN0cmVhbXMKKyAgICAqIFtUSFJJRlQtMzI4OF0gLSBjX2dsaWI6IEJ1aWxkIHVuaXQgdGVzdHMgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTMzNDddIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzM0Ml0gLSBJbXByb3ZlIHJ1YnkgY3Jvc3MgdGVzdCBjbGllbnQgYW5kIHNlcnZlciBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTIyOTZdIC0gQWRkIEMrKyBCYXNlIGNsYXNzIGZvciBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTMzMzddIC0gQWRkIHRlc3RCb29sIG1ldGhvZCB0byBjcm9zcyB0ZXN0cworICAgICogW1RIUklGVC0zMzAzXSAtIERpc2FibGUgY29uY3VycmVudCBjYWJhbCBqb2JzIG9uIFRyYXZpcyB0byBhdm9pZCBHSEMgY3Jhc2gKKyAgICAqIFtUSFJJRlQtMjYyM10gLSBEb2NrZXIgY29udGFpbmVyIGZvciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMzI5OF0gLSB0aHJpZnQgZW5kaWFuIGNvbnZlcnRlcnMgbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTE1NTldIC0gUHJvdmlkZSBtZW1vcnkgcG9vbCBmb3IgVEJpbmFyeVByb3RvY29sIHRvIGVsaW1pbmF0ZSBtZW1vcnkgZnJhZ21lbnRhdGlvbgorICAgICogW1RIUklGVC00MjRdIC0gU3RlYWwgUHJvdG9jb2xCdWZmZXJzJyBWYXJJbnQgaW1wbGVtZW50YXRpb24gZm9yIEMrKworCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0zMDcwXSAtIEFkZCBhYmlsaXR5IHRvIHNldCB0aGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCisgICAgKiBbVEhSSUZULTE5MDldIC0gSmF2YTogQWRkIGNvbXBpbGVyIGZsYWcgdG8gdXNlIHRoZSAib3B0aW9uIHBhdHRlcm4iIGZvciBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjA5OV0gLSBTdG9wIFRUaHJlYWRQb29sU2VydmVyIHdpdGggYWxpdmUgY29ubmVjdGlvbnMuCisgICAgKiBbVEhSSUZULTEyM10gLSBpbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gSmF2YQorICAgICogW1RIUklGVC0yMzY4XSAtIE5ldyBvcHRpb246IHJldXNlLW9iamVjdHMgZm9yIEphdmEgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI4MzZdIC0gT3B0aW9uYWxseSBnZW5lcmF0ZSBDKysxMSBNb3ZlQ29uc3RydWN0aWJsZSB0eXBlcworICAgICogW1RIUklGVC0yODI0XSAtIEZsYWcgdG8gZGlzYWJsZSBodG1sIGVzY2FwaW5nIGRvY3RleHQKKyAgICAqIFtUSFJJRlQtMjgxOV0gLSBBZGQgV2Vic1NvY2tldCBjbGllbnQgdG8gbm9kZS5qcworICAgICogW1RIUklGVC0zMDUwXSAtIENsaWVudCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBmb3Igbm9uLWh0dHAgVExTIGluIEMjCisgICAgKiBbVEhSSUZULTMyOTJdIC0gSW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEdvCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI1ODNdIC0gVGhyaWZ0IG9uIHhQQyB0YXJnZXQgKFNwZWVkR29hdCkKKyAgICAqIFtUSFJJRlQtMjU5Ml0gLSB0aHJpZnQgc2VydmVyIHVzaW5nIGNfZ2xpYgorICAgICogW1RIUklGVC0yODMyXSAtIGNfZ2xpYjogSGFuZGxlIHN0cmluZyBsaXN0cyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzEzNl0gLSB0aHJpZnQgaW5zdGFsbGF0aW9uIHByb2JsZW0gb24gbWFjCisgICAgKiBbVEhSSUZULTMzNDZdIC0gY19nbGliOiBUdXRvcmlhbHMgZXhhbXBsZSBjcmFzaGVzIHNheWluZyBDYWxjdWxhdG9yLnBpbmcgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTI1NzhdIC0gTW92aW5nICdtYWtlIGNyb3NzJyBmcm9tIHRlc3Quc2ggdG8gdGVzdC5weQorICAgICogW1RIUklGVC0yNzM0XSAtIEdvIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMjc0OF0gLSBBZGQgVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKyAgICAqIFtUSFJJRlQtMjc1M10gLSBNaXNjLiBIYXhlIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yNjQwXSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMzI2Ml0gLSB3YXJuaW5nOiBvdmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIGluIERlbnNlUHJvdG9UZXN0LmNwcAorICAgICogW1RIUklGVC0zMTk0XSAtIENhbid0IGJ1aWxkIHdpdGggZ28gZW5hYmxlZC4gIGdvbW9jayBTQ0MgcGF0aCBpbmNvcnJlY3QuCisgICAgKiBbVEhSSUZULTMyNzVdIC0gY19nbGliIHR1dG9yaWFsIHdhcm5pbmdzIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTExMjVdIC0gTXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjgwN10gLSBQSFAgQ29kZSBTdHlsZQorICAgICogW1RIUklGVC0yODQxXSAtIEFkZCBjb21wcmVoZW5zaXZlIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgd2hvbGUgR28gc3RhY2sKKyAgICAqIFtUSFJJRlQtMjgxNV0gLSBIYXhlOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0yODg2XSAtIEludGVncmF0ZSBiaW5hcnkgdHlwZSBpbiBzdGFuZGFyZCBUaHJpZnQgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0yOTQ2XSAtIEVuaGFuY2UgdXNhYmlsaXR5IG9mIGNyb3NzIHRlc3QgZnJhbWV3b3JrCisgICAgKiBbVEhSSUZULTI5NjddIC0gQWRkIC5lZGl0b3Jjb25maWcgdG8gcm9vdAorICAgICogW1RIUklGVC0zMDMzXSAtIFBlcmw6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTMxNzRdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBkb2Vzbid0IGNoZWNrIGZpcnN0IHdvcmQKKyAgICAqIFtUSFJJRlQtMzE5M10gLSBPcHRpb24gdG8gc3VwcmVzcyBkYXRlIHZhbHVlIGluIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbgorICAgICogW1RIUklGVC0zMzA1XSAtIE1pc3NpbmcgZGlzdCBmaWxlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKyAgICAqIFtUSFJJRlQtMzM0MV0gLSBBZGQgdGVzdEJvb2wgbWV0aG9kcworICAgICogW1RIUklGVC0zMzA4XSAtIEZpeCBicm9rZW4gdGVzdCBjYXNlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKworIyMgVGFzaworICAgICogW1RIUklGVC0yODM0XSAtIFJlbW92ZSBzZW1pLWNvbG9ucyBmcm9tIHB5dGhvbiBjb2RlIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0yODUzXSAtIEFkanVzdCBjb21tZW50cyBub3QgYXBwbHlpbmcgYW55bW9yZSBhZnRlciBUSFJJRlQtMjg1MgorCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTMyMTFdIC0gQWRkIG1ha2UgY3Jvc3Mgc3VwcG9ydCBmb3IgcGhwIFRDb21wYWN0UHJvdG9jb2wKKworIyMgV2lzaAorICAgICogW1RIUklGVC0yODM4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjYW4gYmluZCB0byBwb3J0IDAgKGkuZS4sIGdldCBhbiBPUy1hc3NpZ25lZCBwb3J0KSBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgcG9ydCBudW1iZXIKIAogCi1WZXJzaW9uIDAuNS4wCiAKK1RocmlmdCAwLjkuMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0yNzkzXSAtIEdvIGNvbXBpbGVyIHByb2R1Y2VzIHVuY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTE0ODFdIC0gVW5peCBkb21haW4gc29ja2V0cyBpbiBDKysgZG8gbm90IHN1cHBvcnQgdGhlIGFic3RyYWN0IG5hbWVzcGFjZQorICAgICogW1RIUklGVC0xNDU1XSAtIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nIGNhc3RzIGZyb20gc2l6ZV90IHRvIHVpbnQzMl90LCB3aGljaCBpcyBub3Qgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zCisgICAgKiBbVEhSSUZULTE1NzldIC0gUEhQIEV4dGVudGlvbiAtIGZ1bmN0aW9uIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSBub3Qgd29ya2luZyBmcm9tIFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZQorICAgICogW1RIUklGVC0xNTg0XSAtIEVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIG9uIHNpbmdsZS1jb3JlIG1hY2hpbmVzCisgICAgKiBbVEhSSUZULTE2MTRdIC0gVGhyaWZ0IGJ1aWxkIGZyb20gc3ZuIHJlcG8gc291cmNlcyBmYWlscyB3aXRoIGF1dG9tYWtlLTEuMTIKKyAgICAqIFtUSFJJRlQtMTA0N10gLSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSB0cmVhdHMgYXJnIGFzIHN0cmluZyB3aXRob3V0IGNoZWNrLCBzZWdmYXVsdHMgaWYgeW91IHBhc3Mgbm9uLXN0cmluZworICAgICogW1RIUklGVC0xNjM5XSAtIEphdmEvUHl0aG9uOiBTZXJpYWxpemF0aW9uL0Rlc2VyaWFsaXphdGlvbiBvZiBkb3VibGUgdHlwZSB1c2luZyBDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTY0N10gLSBOb2RlSlMgQnVmZmVyZWRUcmFuc3BvcnQgZG9lcyBub3Qgd29yayBiZXlvbmQgdGhlIGhlbGxvLXdvcmxkIGV4YW1wbGUKKyAgICAqIFtUSFJJRlQtMjEzMF0gLSBUaHJpZnQncyBEIGxpYnJhcnkvdGVzdDogcGFydHMgb2YgIm1ha2UgY2hlY2siIGNvZGUgZG8gbm90IGNvbXBpbGUgd2l0aCByZWNlbnQgZG1kLTIuMDYyIHRocm91Z2ggZG1kLTIuMDY0YWxwaGEKKyAgICAqIFtUSFJJRlQtMjE0MF0gLSBFcnJvciBjb21waWxpbmcgY3BwIHR1dG9yaWFscworICAgICogW1RIUklGVC0yMTM5XSAtIE1TVkMgMjAxMiBFcnJvciAtIENhbm5vdCBjb21waWxlIGR1ZSB0byBCb29zdFRocmVhZEZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMjEzOF0gLSBwa2djb25maWcgZmlsZSBjcmVhdGVkIHdpdGggd3JvbmcgaW5jbHVkZSBwYXRoCisgICAgKiBbVEhSSUZULTIxNjBdIC0gV2FybmluZyBpbiB0aHJpZnQuaCB3aGVuIGNvbXBpbGluZyB3aXRoIC1XdW51c2VkIGFuZCBOREVCVUcKKyAgICAqIFtUSFJJRlQtMjE1OF0gLSBDb21wYWN0LCBKU09OLCBhbmQgU2ltcGxlSlNPTiBwcm90b2NvbHMgYXJlIG5vdCB3b3JraW5nIGNvcnJlY3RseQorICAgICogW1RIUklGVC0yMTY3XSAtIG5vZGVqcyBsaWIgdGhyb3dzIGVycm9yIGlmIG9wdGlvbnMgYXJndW1lbnQgaXNuJ3QgcGFzc2VkCisgICAgKiBbVEhSSUZULTIyODhdIC0gR28gaW1wbCBvZiBUaHJpZnQgSlNPTiBwcm90b2NvbCB3cm9uZ2x5IHdyaXRlcy9leHBlY3RzIHRydWUvZmFsc2UgZm9yIGJvb2xzCisgICAgKiBbVEhSSUZULTIxNDddIC0gVGhyaWZ0IElETCBncmFtbWFyIGFsbG93cyBmb3IgZG90dGVkIGlkZW50aWZpZXIgbmFtZXMKKyAgICAqIFtUSFJJRlQtMjE0NV0gLSBSYWNrIGFuZCBUaGluIGFyZSBub3QganVzdCBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMjI2N10gLSBTaG91bGQgYmUgYWJsZSB0byBjaG9vc2Ugc29ja2V0IGZhbWlseSBpbiBQeXRob24gVFNvY2tldAorICAgICogW1RIUklGVC0yMjc2XSAtIGphdmEgcGF0aCBpbiBzcGVjIGZpbGUgbmVlZHMgdXBkYXRpbmcKKyAgICAqIFtUSFJJRlQtMjI4MV0gLSBHZW5lcmF0ZWQgc2VuZC9yZWN2IGNvZGUgaWdub3JlcyBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjI4MF0gLSBUSlNPTlByb3RvY29sLkZsdXNoKCkgZG9lcyBub3QgcmVhbGx5IGZsdXNoIHRoZSB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjI3NF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGRvIG5vdCBjbG9zZSB0aGVpciBjaGFubmVsIHNlbGVjdG9ycyBvbiBleGl0IGFuZCBsZWFrIGZpbGUgZGVzY3JpcHRvcnMKKyAgICAqIFtUSFJJRlQtMjI2NV0gLSBwaHAgbGlicmFyeSBkb2Vzbid0IGJ1aWxkCisgICAgKiBbVEhSSUZULTIyMzJdIC0gSXNTZXQqIGJyb2tlbiBpbiBHbworICAgICogW1RIUklGVC0yMjQ2XSAtIFVuc2V0IGVudW0gdmFsdWUgaXMgcHJpbnRlZCBieSBUb1N0cmluZygpCisgICAgKiBbVEhSSUZULTIyNDBdIC0gdGhyaWZ0LnZpbSAoY29udHJpYikgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSAndW5pb24nCisgICAgKiBbVEhSSUZULTIyNDNdIC0gVE5vbmJsb2NraW5nU2VydmVyIGluIHRocmlmdCBjcmFzaGVzIHdoZW4gVEZyYW1lZFRyYW5zcG9ydCBvcGVucworICAgICogW1RIUklGVC0yMjMwXSAtIENhbm5vdCBCdWlsZCBvbiBSSEVML0NlbnRvcy9BbWF6b24gTGludXggNi54CisgICAgKiBbVEhSSUZULTIyNDddIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjI1M10gLSBQeXRob24gVG9ybmFkbyBUVG9ybmFkb1NlcnZlciBiYXNlIGNsYXNzIGNoYW5nZQorICAgICogW1RIUklGVC0yMjYxXSAtIGphdmE6IGVycm9yOiB1bm1hcHBhYmxlIGNoYXJhY3RlciBmb3IgZW5jb2RpbmcgQVNDSUkKKyAgICAqIFtUSFJJRlQtMjI1OV0gLSBDIzogdW5leHBlY3RlZCBudWxsIGxvZ0RlbGVnYXRlKCkgcG9pbnRlciBjYXVzZXMgQVYgaW4gVFNlcnZlci5zZXJ2ZSgpCisgICAgKiBbVEhSSUZULTIyMjVdIC0gU1NMQ29udGV4dCBkZXN0cm95IGJlZm9yZSBjbGVhbnVwT3BlblNTTAorICAgICogW1RIUklGVC0yMjI0XSAtIFRTU0xTb2NrZXQuaCBhbmQgVFNTTFNlcnZlclNvY2tldC5oIHNob3VsZCB1c2UgdGhlIHBsYXRmcm9tc29ja2V0IHRvbworICAgICogW1RIUklGVC0yMjI5XSAtIHRocmlmdCBmYWlsZWQgdG8gYnVpbGQgb24gT1NYIDEwLjkgR00KKyAgICAqIFtUSFJJRlQtMjIyN10gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIHNwdXJpb3VzIHdhcm5pbmdzIHdpdGggWGxpbnQKKyAgICAqIFtUSFJJRlQtMjIxOV0gLSBUaHJpZnQgZ2VtIGZhaWxzIHRvIGJ1aWxkIG9uIE9TIFggTWF2ZXJpY2tzIHdpdGggMS45LjMgcnViaWVzCisgICAgKiBbVEhSSUZULTIyMjZdIC0gVFNlcnZlclNvY2tldCAtIGtlZXBBbGl2ZSB3cm9uZyBpbml0aWFsaXphdGlvbiBvcmRlcgorICAgICogW1RIUklGVC0yMjg1XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEphdmEgZG9lc24ndCBhbGxvdyBhIHNsYXNoICgvKSB0byBiZSBlc2NhcGVkIChcLykKKyAgICAqIFtUSFJJRlQtMjIxNl0gLSBFeHRyYW5lb3VzIHNlbWljb2xvbiBpbiBUUHJvdG9jb2xVdGlsLmggbWFrZXMgY2xhbmcgbWFkCisgICAgKiBbVEhSSUZULTIyMTVdIC0gR2VuZXJhdGVkIEhUTUwvR3JhcGh2aXogbGlzdHMgcmVmZXJlbmNlZCBlbnVtIGlkZW50aWZpZXJzIGFzIFVOS05PV04uCisgICAgKiBbVEhSSUZULTIyMTFdIC0gRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGRvZXMgbm90IGNvbnRhaW4gbmFtZXNwYWNlIHByZWZpeC4KKyAgICAqIFtUSFJJRlQtMjIxMF0gLSBsaWIvamF2YSBUU2ltcGxlSlNPTlByb3RvY29sIGNhbiBlbWl0IGludmFsaWQgSlNPTgorICAgICogW1RIUklGVC0yMjA5XSAtIFJ1YnkgZ2VuZXJhdG9yIC0tIHBsZWFzZSBuYW1lc3BhY2UgY2xhc3NlcworICAgICogW1RIUklGVC0yMjAyXSAtIERlbHBoaSBUU2VydmVySW1wbC5EZWZhdWx0TG9nRGVsZWdhdGUgbWF5IHN0b3AgdGhlIHNlcnZlciB3aXRoIEkvTy1FcnJvciAxMDUKKyAgICAqIFtUSFJJRlQtMjIwMV0gLSBUZXJuYXJ5IG9wZXJhdG9yIHJldHVybnMgZGlmZmVyZW50IHR5cGVzIChidWlsZCBlcnJvciBmb3Igc29tZSBjb21waWxlcnMpCisgICAgKiBbVEhSSUZULTIyMDBdIC0gbmVzdGVkIHN0cnVjdHMgY2F1c2UgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB0byBzbG93IGRvd24gYXQgZXhjZXNzaXZlIENQVSBsb2FkCisgICAgKiBbVEhSSUZULTIxOTddIC0gZml4IGphciBvdXRwdXQgZGlyZWN0b3J5IGluIHJwbSBzcGVjIGZpbGUKKyAgICAqIFtUSFJJRlQtMjE5Nl0gLSBGaXggaW52YWxpZCBkZXBlbmRlbmN5IGluIE1ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTIxOTRdIC0gTm9kZTogTm90IGFjdHVhbGx5IHByZXBlbmRpbmcgcmVzaWR1YWwgZGF0YSBpbiBURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyCisgICAgKiBbVEhSSUZULTIxOTNdIC0gSmF2YSBjb2RlIGdlbmVyYXRvciBlbWl0cyBzcHVyaW91cyBzZW1pY29sb24gd2hlbiBkZWVwIGNvcHlpbmcgYmluYXJ5IGRhdGEKKyAgICAqIFtUSFJJRlQtMjE5MV0gLSBGaXggY2hhcnAgSlNPTlByb3RvY29sLlJlYWRKU09ORG91YmxlIChzcGVjaWZ5IEludmFyaWFudEN1bHR1cmUpCisgICAgKiBbVEhSSUZULTIyMTRdIC0gU3lzdGVtIGhlYWRlciBzeXMvcGFyYW0uaCBpcyBpbmNsdWRlZCBpbnNpZGUgdGhlIFRocmlmdCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMjE3OF0gLSBUaHJpZnQgZ2VuZXJhdG9yIHJldHVybnMgZXJyb3IgZXhpdCBjb2RlIG9uIC0tdmVyc2lvbgorICAgICogW1RIUklGVC0yMTcxXSAtIE5vZGVKUyBpbXBsZW1lbnRhdGlvbiBoYXMgZXh0cmVtZWx5IGxvdyB0ZXN0IGNvdmVyYWdlCisgICAgKiBbVEhSSUZULTIxODNdIC0gZ2VtIGluc3RhbGwgZmFpbHMgb24genNoCisgICAgKiBbVEhSSUZULTIxODJdIC0gc2VnZmF1bHQgaW4gcmVncmVzc2lvbiB0ZXN0cyAoR0MgYnVnIGluIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlKQorICAgICogW1RIUklGVC0yMTgxXSAtIG9uZXdheSBjYWxscyBkb24ndCB3b3JrIGluIE5vZGVKUworICAgICogW1RIUklGVC0yMTY5XSAtIEphdmFNRSBUaHJpZnQgTGlicmFyeSBjYXVzZXMgImphdmEuaW8uSU9FeGNlcHRpb246IE5vIFJlc3BvbnNlIEVudHJpZXMgQXZhaWxhYmxlIiBhZnRlciB1c2luZyB0aGUgVGhyaWZ0IGNsaWVudCBmb3Igc29tZSB0aW1lCisgICAgKiBbVEhSSUZULTIxNjhdIC0gTm9kZS5qcyBhcHBlYXJzIGJyb2tlbiAoYXQgbGVhc3QsIGV4YW1wbGVzIGRvbid0IHdvcmsgYXMgaW50ZW5kZWQpCisgICAgKiBbVEhSSUZULTIyOTNdIC0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuY3JlYXRlU1NMQ29udGV4dCgpIGxlYXZlcyBmaWxlcyBvcGVuCisgICAgKiBbVEhSSUZULTIyNzldIC0gVFNlcmlhbGl6ZXIgb25seSByZXR1cm5zIHRoZSBmaXJzdCAxMDI0IGJ5dGVzIHNlcmlhbGl6ZWQKKyAgICAqIFtUSFJJRlQtMjI3OF0gLSBCdWZmZXJlZCB0cmFuc3BvcnQgZG9lc24ndCBzdXBwb3J0IHdyaXRlcyA+IGJ1ZmZlciBzaXplCisgICAgKiBbVEhSSUZULTIyNzVdIC0gRml4IG1lbW9yeSBsZWFrIGluIGdvbGFuZyBjb21wYWN0X3Byb3RvY29sLgorICAgICogW1RIUklGVC0yMjgyXSAtIEluY29yZWN0IGNvZGUgZ2VuZXJhdGVkIGZvciBzb21lIHR5cGVkZWZzCisgICAgKiBbVEhSSUZULTIwMDldIC0gR28gcmVkZWNsYXJhdGlvbiBlcnJvcgorICAgICogW1RIUklGVC0xOTY0XSAtICdJc3NldCcgY2F1c2VzIHByb2JsZW1zIHdpdGggQyMvLk5FVCBzZXJpYWxpemVycworICAgICogW1RIUklGVC0yMDI2XSAtIEZpeCBUQ29tcGFjdFByb3RvY29sIDY0IGJpdCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMjEwOF0gLSBGaXggVEFzeW5jQ2xpZW50TWFuYWdlciB0aW1lb3V0IHJhY2UKKyAgICAqIFtUSFJJRlQtMjA2OF0gLSBNdWx0aXBsZSBjYWxscyBmcm9tIHNhbWUgY29ubmVjdGlvbiBhcmUgbm90IHByb2Nlc3NlZCBpbiBub2RlCisgICAgKiBbVEhSSUZULTE3NTBdIC0gTWFrZSBjb21waWxlciBidWlsZCBjbGVhbmx5IHVuZGVyIHZpc3VhbCBzdHVkaW8gMTAKKyAgICAqIFtUSFJJRlQtMTc1NV0gLSBDb21tZW50IHBhcnNpbmcgYnVnCisgICAgKiBbVEhSSUZULTE3NzFdIC0gIm1ha2UgY2hlY2siIGZhaWxzIG9uIHg2NCBmb3IgbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICAgKiBbVEhSSUZULTE4NDFdIC0gTm9kZUpTIFRocmlmdCBpbmNvcnJlY3RseSBwYXJzZXMgbm9uLVVURjgtc3RyaW5nIHR5cGVzCisgICAgKiBbVEhSSUZULTE5MDhdIC0gVXNpbmcgcGhwIHRocmlmdF9wcm90b2NvbCBhY2NlbGVyYXRlZCB0cmFuc2ZlciBjYXVzZXMgY29yZSBkdW1wCisgICAgKiBbVEhSSUZULTE4OTJdIC0gU29ja2V0IHRpbWVvdXRzIGFyZSBkZWNsYXJlZCBpbiBtaWxsaS1zZWNvbmRzLCBidXQgYXJlIGFjdHVhbGx5IHNldCBpbiBtaWNyby1zZWNvbmRzCisgICAgKiBbVEhSSUZULTIzMDNdIC0gVEJ1ZmZlcnJlZFRyYW5zcG9ydCBub3QgcHJvcGVybHkgY2xvc2luZyB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMzEzXSAtIG5vZGVqcyBzZXJ2ZXIgY3Jhc2ggYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZmlyc3QgcmVxdWVzdCB3aGVuIHVzaW5nIE11bHRpcGxleGVkUHJvY2Vzc29yL0ZyYW1lZEJ1ZmZlci9CaW5hcnlQcm90b2NvbAorICAgICogW1RIUklGVC0yMzExXSAtIEdvOiBpbnZhbGlkIGNvZGUgZ2VuZXJhdGVkIHdoZW4gZXhjZXB0aW9uIG5hbWUgaXMgYSBnbyBrZXl3b3JkCisgICAgKiBbVEhSSUZULTIzMDhdIC0gbm9kZTogVEpTT05Qcm90b2NvbCBwYXJzZSBlcnJvciB3aGVuIHJlYWRpbmcgZnJvbSBidWZmZXJlZCBtZXNzYWdlCisgICAgKiBbVEhSSUZULTIzMTZdIC0gY2NwOiBURmlsZVRyYW5zcG9ydFRlc3QKKyAgICAqIFtUSFJJRlQtMjM1Ml0gLSBtc3ZjIGZhaWxlZCB0byBjb21waWxlIHRocmlmdCB0ZXN0cworICAgICogW1RIUklGVC0yMzM3XSAtIEdvbGFuZyBkb2VzIG5vdCByZXBvcnQgVElNRURfT1VUIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjM0MF0gLSBHZW5lcmF0ZWQgc2VydmVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgcmVzcG9uc2UgdHlwZSBFWENFUFRJT04gb24gdGhlIFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9EIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yMzU0XSAtIENvbm5lY3Rpb24gZXJyb3JzIGNhbiBsZWFkIHRvIGNhc2VfY2xhdXNlIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjMzOV0gLSBVbmNhdWdodCBleGNlcHRpb24gaW4gdGhyaWZ0IGMjIGRyaXZlcgorICAgICogW1RIUklGVC0yMzU2XSAtIGMrKyB0aHJpZnQgY2xpZW50IG5vdCB3b3JraW5nIHdpdGggc3NsIChTU0xfY29ubmVjdCBoYW5ncykKKyAgICAqIFtUSFJJRlQtMjMzMV0gLSBNaXNzaW5nIGNhbGwgdG8gUmVhZFN0cnVjdEJlZ2luKCkgaW4gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoKQorICAgICogW1RIUklGVC0yMzIzXSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZ2VuZXJhdGVkIGZvciB0eXBlZGVmJ2Qgc3RydWN0cworICAgICogW1RIUklGVC0yMzIyXSAtIENvcnJlY3RseSBzaG93IHRoZSBudW1iZXIgb2YgdGltZXMgRXhlY3V0b3JTZXJ2aWNlIChqYXZhKSBoYXMgcmVqZWN0ZWQgdGhlIGNsaWVudC4KKyAgICAqIFtUSFJJRlQtMjM4OV0gLSBuYW1lc3BhY2VzIGhhbmRsZWQgd3JvbmdseSBpbiBhY3Jpb25zY3JpcHQgMy4wIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTIzODhdIC0gR29MYW5nIC0gRml4IGRhdGEgcmFjZXMgaW4gc2ltcGxlX3NlcnZlciBhbmQgc2VydmVyX3NvY2tldAorICAgICogW1RIUklGVC0yMzg2XSAtIFRocmlmdCByZWZ1c2VzIHRvIGxpbmsgeXlsZXgKKyAgICAqIFtUSFJJRlQtMjM3NV0gLSBFeGNlc3NpdmUgPGJyPidzIGluIGdlbmVyYXRlZCBIVE1MCisgICAgKiBbVEhSSUZULTIzNzNdIC0gd2FybmluZyBDUzA0MTQgaW4gVEh0dHBDbGllbnQuY3M6IHByaXZhdGUgZmllbGQgJ1RocmlmdC5UcmFuc3BvcnQuVEh0dHBDbGllbnQuY29ubmVjdGlvbicgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQKKyAgICAqIFtUSFJJRlQtMjM3Ml0gLSB0aHJpZnQvanNvbl9wcm90b2NvbC5nbzoxNjA6IGZ1bmN0aW9uIGVuZHMgd2l0aG91dCBhIHJldHVybiBzdGF0ZW1lbnQKKyAgICAqIFtUSFJJRlQtMjM3MV0gLSBydWJ5IGJ1bmRsZXIgdmVyc2lvbiBmYWlscyBvbiB+MS4zLjEsIHJlbW92ZSBhbmQgdGFrZSBsYXRlc3QgYXZhaWwKKyAgICAqIFtUSFJJRlQtMjM3MF0gLSBDb21waWxlciBTRUdGQVVMVHMgZ2VuZXJhdGluZyBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGNvbXBsZXggc3RydWNyZQorICAgICogW1RIUklGVC0yMzg0XSAtIEJpbmFyeSBtYXAga2V5cyBwcm9kdWNlIHVuY29tcGlsYWJsZSBjb2RlIGluIGdvCisgICAgKiBbVEhSSUZULTIzODBdIC0gdW5yZWFjaGFibGUgY29kZSAoQ0lEIDExNzQ1NDYsIENJRCAxMTc0Njc5KQorICAgICogW1RIUklGVC0yMzc4XSAtIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50cyBvZiBiaW5hcnkgdHlwZSBsZWFkIHRvIHVuY29tcGlsZWFibGUgR28gY29kZQorICAgICogW1RIUklGVC0yMzYzXSAtIElzc3VlIHdpdGggY2hhcmFjdGVyIGVuY29kaW5nIG9mIFN1Y2Nlc3MgcmV0dXJuZWQgZnJvbSBMb2dpbiB1c2luZyBUaHJpZnQgUHJveHkgYW5kIE5vZGVKUworICAgICogW1RIUklGVC0yMzU5XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBkb2Vzbid0IGNsZWFyIGl0J3MgYnVmZmVyIG9uIGEgZmFpbGVkIGZsdXNoIGNhbGwKKyAgICAqIFtUSFJJRlQtMjQyOF0gLSBQeXRob24gMyBzZXR1cC5weSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTIzNjddIC0gQnVpbGQgZmFpbHVyZTogc3RkbGliIGFuZCBib29zdCBib3RoIGRlZmluZSB1aW50NjRfdAorICAgICogW1RIUklGVC0yMzY1XSAtIEMjIGRlY29kZXMgdG9vIG1hbnkgYmluYXJ5IGJ5dGVzIGZyb20gSlNPTgorICAgICogW1RIUklGVC0yNDAyXSAtIGJ5dGUgY291bnQgb2YgRnJhbWVCdWZmZXIgaW4gQVdBSVRJTkdfQ0xPU0Ugc3RhdGUgaXMgbm90IHN1YnRyYWN0ZWQgZnJvbSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQKKyAgICAqIFtUSFJJRlQtMjM5Nl0gLSBCdWlsZCBFcnJvciBvbiBNYWNPU1gKKyAgICAqIFtUSFJJRlQtMjM5NV0gLSB0aHJpZnQgUnVieSBnZW0gcmVxdWlyZXMgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jeSAndGhpbicgcmVnYXJkbGVzcyBvZiBlbnZpcm9ubWVudAorICAgICogW1RIUklGVC0yNDE0XSAtIGNfZ2xpYiBmaXggc2V2ZXJhbCBidWcuCisgICAgKiBbVEhSSUZULTI0MjBdIC0gR28gYXJndW1lbnQgcGFyc2VyIGZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGRvZXMgbm90IHNraXAgZmllbGRzCisgICAgKiBbVEhSSUZULTI0MzldIC0gQnVnIGluIFRQcm90b2NvbERlY29yYXRvciBDbGFzcyBjYXVzZXMgcGFyc2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQxOV0gLSBnb2xhbmcgLSBGaXggZm10LkVycm9yZiBpbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0yNDE4XSAtIEdvIGhhbmRsZXIgZnVuY3Rpb24gcGFuaWNzIG9uIGludGVybmFsIGVycm9yCisgICAgKiBbVEhSSUZULTI0MDVdIC0gTm9kZS5qcyBNdWx0aXBsZXhlciB0ZXN0cyBmYWlsIChzaWxlbnRseSkKKyAgICAqIFtUSFJJRlQtMjU4MV0gLSBURkRUcmFuc3BvcnQgZGVzdHJ1Y3RvciBzaG91bGQgbm90IHRocm93CisgICAgKiBbVEhSSUZULTI1NzVdIC0gVGhyaWZ0IGluY2x1ZGVzIHNpZ2luZm9fdCB3aXRoaW4gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0yNTc3XSAtIFRGaWxlVHJhbnNwb3J0ICBtaXNzdXNlIG9mIGNsb3Nlc29ja2V0IG9uIHdpbmRvd3MgcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMjU3Nl0gLSBJbXBsZW1lbnQgVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZS5za2lwIG1ldGhvZCBpbiBKYXZhU2NyaXB0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjU4OF0gLSBUaHJpZnQgY29tcGlsZXIgaXMgbm90IGJ1aWxkYWJsZSBpbiBWaXN1YWwgU3R1ZGlvIDIwMTAKKyAgICAqIFtUSFJJRlQtMjU5NF0gLSBKUyBDb21waWxlcjogU2luZ2xlIHF1b3RlcyBhcmUgbm90IGJlaW5nIGVzY2FwZWQgaW4gY29uc3RhbnRzLgorICAgICogW1RIUklGVC0yNTkxXSAtIFRGcmFtZWRUcmFuc3BvcnQgZG9lcyBub3QgaGFuZGxlIHBheWxvYWRzIHNwbGl0IGFjcm9zcyBwYWNrZXRzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0yNTk5XSAtIFVuY29tcGlsZWFibGUgRGVscGhpIGNvZGUgZHVlIHRvIG5hbWluZyBjb25mbGljdHMgd2l0aCBJREwKKyAgICAqIFtUSFJJRlQtMjU5MF0gLSBDKysgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBkb2Vzbid0IGluY2x1ZGUgTXVsdGlwbGV4aW5nIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjU5NV0gLSBOb2RlLmpzOiBGaXggZ2xvYmFsIGxlYWtzIGFuZCBjb3B5LXBhc3RlIGVycm9ycworICAgICogW1RIUklGVC0yNTY1XSAtIGF1dG9jb25mIGZhaWxzIHRvIGZpbmQgbWluZ3ctZysrIGNyb3NzIGNvbXBpbGVyIG9uIHRyYXZpcyBDSQorICAgICogW1RIUklGVC0yNTU1XSAtIGV4Y2Vzc2l2ZSAidW51c2VkIGZpZWxkIiBjb21tZW50cworICAgICogW1RIUklGVC0yNTU0XSAtIGRvdWJsZSBpbml0aWFsaXphdGlvbiBpbiBnZW5lcmF0ZWQgUmVhZCgpIG1ldGhvZAorICAgICogW1RIUklGVC0yNTUxXSAtIE91dE9mTWVtb3J5RXJyb3IgInVuYWJsZSB0byBjcmVhdGUgbmV3IG5hdGl2ZSB0aHJlYWQiIGtpbGxzIHNlcnZlIHRocmVhZAorICAgICogW1RIUklGVC0yNTQzXSAtIEdlbmVyYXRlZCBlbnVtIHR5cGUgaW4gaGFza2VsbCBzaG91bGQgYmUgcXVhbGlmaWVkCisgICAgKiBbVEhSSUZULTI1NjBdIC0gVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRvciB0cmllcyB0byBjb25jYXQgaW50cyB3aXRoIHN0cmluZ3MgdXNpbmcgKworICAgICogW1RIUklGVC0yNTU5XSAtIENlbnRvcyA2LjUgdW5hYmxlIHRvICJtYWtlIiB3aXRoIFRocmlmdCAwLjkuMQorICAgICogW1RIUklGVC0yNTI2XSAtIEFzc2lnbm1lbnQgb3BlcmF0b3JzIGFuZCBjb3B5IGNvbnN0cnVjdG9ycyBpbiBjKysgZG9uJ3QgY29weSB0aGUgX19pc3NldCBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMjQ1NF0gLSBjX2dsaWI6IFRoZXJlIGlzIG5vIGdldGhvc3RieW5hbWVfcigpIGluIHNvbWUgT1MuCisgICAgKiBbVEhSSUZULTI0NTFdIC0gRG8gbm90IHVzZSBwb2ludGVycyBmb3Igb3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMuIERvIG5vdCB3cml0ZSBzdWNoIGZpZWxkcyBpZiBpdHMgdmFsdWUgc2V0IHRvIGRlZmF1bHQuIEFsc28sIGRvIG5vdCB1c2UgcG9pbnRlcnMgZm9yIGFueSBvcHRpb25hbCBmaWVsZHMgbWFwcGVkIHRvIGdvIG1hcCBvciBzbGljZS4gZ2VuZXJhdGUgR2V0IGFjY2Vzc29ycworICAgICogW1RIUklGVC0yNDUwXSAtIGluY2x1ZGUgSG93VG9Db250cmlidXRlIGluIHRoZSBzcmMgcmVwbworICAgICogW1RIUklGVC0yNDQ4XSAtIHRocmlmdC90ZXN0L3Rlc3Quc2ggaGFzIGluY29ycmVjdCBOb2RlLmpzIHRlc3QgcGF0aAorICAgICogW1RIUklGVC0yNDYwXSAtIHVub3BlbmVkIHNvY2tldCBmZCBtdXN0IGJlIGxlc3MgdGhhbiB6ZXJvLgorICAgICogW1RIUklGVC0yNDU5XSAtIC0tdmVyc2lvbiBzaG91bGQgbm90IGV4aXQgMQorICAgICogW1RIUklGVC0yNDY4XSAtIFRpbWVzdGFtcCBoYW5kbGluZworICAgICogW1RIUklGVC0yNDY3XSAtIFVuYWJsZSB0byBidWlsZCBjb250cmliL2ZiMzAzIG9uIE9TWCAxMC45LjIKKyAgICAqIFtUSFJJRlQtMjQ2Nl0gLSBJbXByb3BlciBlcnJvciBoYW5kbGluZyBmb3IgU1NML1RMUyBjb25uZWN0aW9ucyB0aGF0IGRvbid0IGNvbXBsZXRlIGEgaGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTI0NjNdIC0gdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgZmFpbHMgc29tZXRpbWVzCisgICAgKiBbVEhSSUZULTI0NThdIC0gR2VuZXJhdGVkIGdvbGFuZyBzZXJ2ZXIgY29kZSBmb3IgIm9uZXdheSIgbWV0aG9kcyBpcyBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMjQ1Nl0gLSBUSHR0cENsaWVudCBmYWlscyB3aGVuIHVzaW5nIGFzeW5jIHN1cHBvcnQgb3V0c2lkZSBTaWx2ZXJsaWdodAorICAgICogW1RIUklGVC0yNTI0XSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIFRUaHJlYWRlZFNlcnZlciBmaWxlcworICAgICogW1RIUklGVC0yNTIzXSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBpcyBtaXNzaW5nIE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIGZpbGVzCisgICAgKiBbVEhSSUZULTI1MjBdIC0gY3BwOmNvYl9zdHlsZSBnZW5lcmF0ZXMgaW5jb3JyZWN0IC50Y2MgZmlsZQorICAgICogW1RIUklGVC0yNTA4XSAtIFVuY29tcGlsZWFibGUgQyMgY29kZSBkdWUgdG8gbGFuZ3VhZ2Uga2V5d29yZHMgaW4gSURMCisgICAgKiBbVEhSSUZULTI1MDZdIC0gVXBkYXRlIFRQcm90b2NvbEV4Y2VwdGlvbiBlcnJvciBjb2RlcyB0byBiZSB1c2VkIGNvbnNpc3RlbnRseSB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTI1MDVdIC0gZ286IHN0cnVjdCBzaG91bGQgYWx3YXlzIGJlIGEgcG9pbnRlciB0byBhdm9pZCBjb3B5aW5nIG9mIHBvdGVudGlhbGx5IHNpemUtdW5ib3VuZGVkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMjUxNV0gLSBUTFMgTWV0aG9kIGVycm9yIGR1cmluZyBtYWtlCisgICAgKiBbVEhSSUZULTI1MDNdIC0gQysrOiBGaXggbmFtZSBjb2xsaXNpb24gd2hlbiBhIHN0cnVjdCBoYXMgYSBtZW1iZXIgbmFtZWQgInZhbCIKKyAgICAqIFtUSFJJRlQtMjQ3N10gLSB0aHJpZnQgLS1oZWxwIHRleHQgd2l0aCBtaXNwbGFjZWQgY29tbWEKKyAgICAqIFtUSFJJRlQtMjQ5Ml0gLSB0ZXN0L2NwcCBkb2VzIG5vdCBjb21waWxlIG9uIG1hYworICAgICogW1RIUklGVC0yNTAwXSAtIHNlbmRpbmcgcmFuZG9tIGRhdGEgY3Jhc2hlcyB0aHJpZnQoZ29sYW5nKSBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTI0NzVdIC0gY19nbGliOiBidWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgZnVuY3Rpb24gcmV0dXJuIGFsd2F5cyBUUlVFLgorICAgICogW1RIUklGVC0yNDk1XSAtIEphdmFTY3JpcHQvTm9kZSBzdHJpbmcgY29uc3RhbnRzIGxhY2sgcHJvcGVyIGVzY2FwaW5nCisgICAgKiBbVEhSSUZULTI0OTFdIC0gdW5hYmxlIHRvIGltcG9ydCBnZW5lcmF0ZWQgVGhyaWZ0VGVzdCBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTI0OTBdIC0gY19nbGliOiBpZiBmYWlsIHRvIHJlYWQgYSBleGNlcHRpb24gZnJvbSBzZXJ2ZXIsIGNsaWVudCBtYXkgYmUgb2NjdXJyZWQgZG91YmxlIGZyZWUKKyAgICAqIFtUSFJJRlQtMjQ3MF0gLSBUSHR0cEhhbmRsZXIgc3dhbGxvd3MgZXhjZXB0aW9ucyBmcm9tIHByb2Nlc3NvcgorICAgICogW1RIUklGVC0yNTMzXSAtIEJvb3N0IHZlcnNpb24gaW4gcmVxdWlyZW1lbnRzIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTI1MzJdIC0gSmF2YSB2ZXJzaW9uIGluIGluc3RhbGxhdGlvbiByZXF1aXJlbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAqIFtUSFJJRlQtMjUyOV0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgc3BsaXQgIFRjcCBkYXRhIGJ1ZyBpbiBub2RlSnMKKyAgICAqIFtUSFJJRlQtMjUzN10gLSBQYXRoIGZvciAiZ28gZ2V0IiBkb2VzIG5vdCB3b3JrIChwdWxsIHJlcXVlc3QgMTE1KQorICAgICogW1RIUklGVC0yNDQzXSAtIE5vZGUgZmFpbHMgY3Jvc3MgbGFuZyB0ZXN0cworICAgICogW1RIUklGVC0yNDM3XSAtIEF1dGhvciBmaWVsZHMgaW4gUHl0aG9uIHNldHVwLnB5IG11c3QgYmUgc3RyaW5ncyBub3QgbGlzdHMuCisgICAgKiBbVEhSSUZULTI0MzVdIC0gSmF2YSBjb21waWxlciBkb2Vzbid0IGxpa2Ugc3RydWN0IG1lbWJlciBuYW1lcyB0aGF0IGFyZSBpZGVudGljYWwgdG8gYW4gZXhpc3RpbmcgZW51bSBvciBzdHJ1Y3QgdHlwZQorICAgICogW1RIUklGVC0yNDM0XSAtIE1pc3NpbmcgbmFtZXNwYWNlIGltcG9ydCBmb3IgcGhwIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yNDMyXSAtIEZsYWt5IHBhcmFsbGVsIGJ1aWxkCisgICAgKiBbVEhSSUZULTI0MzBdIC0gQ3Jhc2ggZHVyaW5nIFRUaHJlYWRQb29sU2VydmVyIHNodXRkb3duCisgICAgKiBbVEhSSUZULTY2N10gLSBQZXJpb2Qgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIGluIGlkZW50aWZpZXIgbmFtZXMKKyAgICAqIFtUSFJJRlQtMTIxMl0gLSBNZW1iZXJzIGNhcGl0YWwgY2FzZSBjb25mbGljdAorICAgICogW1RIUklGVC0yNTg0XSAtIEVycm9yIGhhbmRsZXIgbm90IGxpc3RlbmVkIG9uIGphdmFzY3JpcHQgY2xpZW50CisgICAgKiBbVEhSSUZULTIyOTRdIC0gSW5jb3JyZWN0IE1ha2VmaWxlIGdlbmVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjYwMV0gLSBGaXggdmFncmFudCB0byB3b3JrIGFnYWluIGZvciBidWlsZHMgYWdhaW4KKyAgICAqIFtUSFJJRlQtMjA5Ml0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIHNob3VsZCByZWxlYXNlIGhhbmRsZXIgYXMgc29vbiBhcyBjb25uZWN0aW9uIGNsb3NlcworICAgICogW1RIUklGVC0yNTU3XSAtIENTMDU0MiBtZW1iZXIgbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZWlyIGVuY2xvc2luZyB0eXBlCisgICAgKiBbVEhSSUZULTI2MDVdIC0gVFNvY2tldCB3YXJuaW5nIG9uIGdjYyA0LjguMworICAgICogW1RIUklGVC0yNjA3XSAtIFRocmVhZE1hbmFnZXIuY3BwIHdhcm5pbmcgb24gY2xhbmcrKyAzLjQKKyAgICAqIFtUSFJJRlQtMTk5OF0gLSBUQ29tcGFjdFByb3RvY29sLnRjYyAtIG9uZSBtb3JlIHdhcm5pbmcgb24gVmlzdWFsIDIwMTAKKyAgICAqIFtUSFJJRlQtMjYxMF0gLSBNU1ZDIHdhcm5pbmcgaW4gVFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtMjYxNF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIHdhcm5pbmdzIG9uIE1TVkMKKyAgICAqIFtUSFJJRlQtMjYwOF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIHdhcm5pbmdzIG9uIGNsYW5nIDMuNAorICAgICogW1RIUklGVC0yNjA2XSAtIFRocmVhZE1hbmFnZXIuaCB3YXJuaW5nIGluIGNsYW5nKysgMy40CisgICAgKiBbVEhSSUZULTI2MDldIC0gVEZpbGVUcmFuc3BvcnQuaCB1bnVzZWQgZmllbGQgd2FybmluZyAoY2xhbmcgMy40KQorICAgICogW1RIUklGVC0yNDE2XSAtIENhbm5vdCB1c2UgVENvbXBhY3RQcm90b2NvbCB3aXRoIE1TVkMKKyAgICAqIFtUSFJJRlQtMTgwM10gLSBSdWJ5IFRocmlmdCAwLjkuMCB0cmllcyB0byBlbmNvZGUgVVVJRCB0byBVVEY4IGFuZCBjcmFzaGVzCisgICAgKiBbVEhSSUZULTIzODVdIC0gUHJvYmxlbSB3aXRoIGdldGhvc3RieW5hbWUyIGR1cmluZyBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTIyNjJdIC0gdGhyaWZ0IHNlcnZlciAnTXV0YXRlUm93JyBvcGVyYXRpb24gZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiBzdWNjZXNzIC8gZmFpbHVyZQorICAgICogW1RIUklGVC0yMDQ4XSAtIFByZWZlciBib29sZWFuIGNvbnRleHQgdG8gbnVsbHB0cl90IGNvbnZlcnNpb24KKyAgICAqIFtUSFJJRlQtMjUyOF0gLSBUaHJpZnQgRXJsYW5nIExpYnJhcnk6IE11bHRpcGxlIHRocmlmdCBhcHBsaWNhdGlvbnMgaW4gb25lIGJ1bmRsZQorICAgICogW1RIUklGVC0xOTk5XSAtIHdhcm5pbmcgb24gZ2NjIDQuNyB3aGlsZSBjb21waWxpbmcgQm9vc3RNdXRleC5jcHAKKyAgICAqIFtUSFJJRlQtMjEwNF0gLSBTdHJ1Y3RzIGxvc2UgYmluYXJ5IGRhdGEgd2hlbiB0cmFuc2ZlcnJlZCBmcm9tIHNlcnZlciB0byBjbGllbnQgaW4gSmF2YQorICAgICogW1RIUklGVC0yMTg0XSAtIHVuZGVmaW5lZCBtZXRob2QgcnNwZWNfdmVyaWZ5IGZvciBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMzUxXSAtIFBIUCBUQ29tcGFjdFByb3RvY29sIGhhcyBmYWlscyB0byBkZWNvZGUgbWVzc2FnZXMKKyAgICAqIFtUSFJJRlQtMjAxNl0gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKKyAgICAqIFtUSFJJRlQtMjI3M10gLSBQbGVhc2UgZGVsZXRlIG9sZCByZWxlYXNlcyBmcm9tIG1pcnJvcmluZyBzeXN0ZW0KKyAgICAqIFtUSFJJRlQtMjI3MF0gLSBGYXVsdHkgbGlicmFyeSB2ZXJzaW9uIG51bWJlcmluZyBhdCBidWlsZCBvciBkb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTIyMDNdIC0gVGVzdHMga2VlcGluZyBmYWlsaW5nIG9uIEplbmtpbnMgYW5kIFRyYXZpcyBDSQorICAgICogW1RIUklGVC0yMzk5XSAtIHRocmlmdC5lbDogcmVjb2duaXplICIvLyItc3R5bGUgY29tbWVudHMgaW4gZW1hY3MgdGhyaWZ0LW1vZGUKKyAgICAqIFtUSFJJRlQtMjU4Ml0gLSAiRmlsZVRyYW5zcG9ydCBlcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHRyeWluZyB0byB1c2UgSmF2YSdzIFRGaWxlVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTE2ODJdIC0gTXVsdGlwbGUgdGhyZWFkIGNhbGxpbmcgYSBTZXJ2aWNlIGZ1bmN0aW9uIHVuc2FmZWx5IGNhdXNlcyBtZXNzYWdlIGNvcnJ1cHRpb24gYW5kIHRlcm1pbmF0ZXMgd2l0aCBCcm9rZW4gUGlwZQorICAgICogW1RIUklGVC0yMzU3XSAtIHJlY3Vyc2Ugb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBnZW5lcmF0aW5nIHBocAorICAgICogW1RIUklGVC0yMjQ4XSAtIEdvIGdlbmVyYXRvciBkb2Vzbid0IGRlYWwgd2VsbCB3aXRoIG1hcCBrZXlzIG9mIHR5cGUgYmluYXJ5CisgICAgKiBbVEhSSUZULTI0MjZdIC0gY2xhcmlmeSBJUCByaWdodHMgYW5kIGNvbnRyaWJ1dGlvbnMgZnJvbSBmYnRocmlmdAorICAgICogW1RIUklGVC0yMDQxXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgY29tcGlsYXRpb24gb24gd2luZG93cyAoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyAgICAqIFtUSFJJRlQtMjQwMF0gLSB0aHJpZnQuZWw6IHJlY29nbml6ZSAiLy8iLXN0eWxlIGNvbW1lbnRzIGluIGVtYWNzIHRocmlmdC1tb2RlCisgICAgKiBbVEhSSUZULTE3MTddIC0gRml4IGRlYiBidWlsZCBpbiBqZW5raW5zCisgICAgKiBbVEhSSUZULTIyNjZdIC0gVGhyZWFkTWFuYWdlci5oOjI0OjEwOiBmYXRhbCBlcnJvcjogJ3RyMS9mdW5jdGlvbmFsJyBmaWxlIG5vdCBmb3VuZCBvbiBNYWMgMTAuOSAoTWF2ZXJpY2tzKQorICAgICogW1RIUklGVC0xMzAwXSAtIFRlc3QgZmFpbHVyZXMgd2l0aCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopCisgICAgKiBbVEhSSUZULTI0ODddIC0gVHV0b3JpYWwgcmVxdWlyZXMgdHdvIElETCBmaWxlcyBidXQgb25seSBvbmUgaXMgbGlua2VkIGZyb20gdGhlIFRocmlmdCB3ZWIgc2l0ZQorICAgICogW1RIUklGVC0yMzI5XSAtIG1pc3NpbmcgcmVsZWFzZSB0YWdzIHdpdGhpbiBnaXQKKyAgICAqIFtUSFJJRlQtMjMwNl0gLSBjb25jdXJlbnQgY2xpZW50IGNhbGxzIHdpdGggbm9kZWpzCisgICAgKiBbVEhSSUZULTIyMjJdIC0gcnVieSBnZW0gY2Fubm90IGJlIGNvbXBpbGVkIG9uIE9TIFggbWF2ZXJpY2tzCisgICAgKiBbVEhSSUZULTIzODFdIC0gY29kZSB3aGljaCBnZW5lcmF0ZWQgYnkgdGhyaWZ0Mi9oYmFzZS50aHJpZnQgY29tcGlsZSBlcnJvcgorICAgICogW1RIUklGVC0yMzkwXSAtIG5vIGNsb3NlIGV2ZW50IHdoZW4gY29ubmVjdGlvbiBsb3N0CisgICAgKiBbVEhSSUZULTIxNDZdIC0gVW5hYmxlIHRvIHBhc3MgbXVsdGlwbGUgIi0tZ2VuIiBvcHRpb25zIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMjQzOF0gLSBVbmV4cGVjdGVkIHJlYWRGaWVsZEVuZCBjYWxsIGNhdXNlcyBKU09OIFBhcnNpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTI0OThdIC0gRXJyb3IgbWVzc2FnZSAiSW52YWxpZCBtZXRob2QgbmFtZSIgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgSEJhc2UgVGhyaWZ0IEFQSQorICAgICogW1RIUklGVC04NDFdIC0gQnVpbGQgY3J1ZnQKKyAgICAqIFtUSFJJRlQtMjU3MF0gLSBXcm9uZyBVUkwgZ2l2ZW4gaW4gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RldmVsb3BlcnMKKyAgICAqIFtUSFJJRlQtMjYwNF0gLSBGaXggZGViaWFuIHBhY2thZ2luZworICAgICogW1RIUklGVC0yNjE4XSAtIFVuaWdub3JlIC9hY2xvY2FsIGZpbGVzIHJlcXVpcmVkIGZvciBidWlsZAorICAgICogW1RIUklGVC0yNTYyXSAtIC4vY29uZmlndXJlIGNyZWF0ZSBNYWtlRmlsZSBpbiBsaWIvZCB3aXRoIGVycm9ycworICAgICogW1RIUklGVC0yNTkzXSAtIFVuYWJsZSB0byBidWlsZCB0aHJpZnQgb24gdWJ1bnR1LTEyLjA0IChQcmVjaXNlKQorICAgICogW1RIUklGVC0yNDYxXSAtIENhbid0IGluc3RhbGwgdGhyaWZ0LTAuOC4wIG9uIE9TIFggMTAuOS4yCisgICAgKiBbVEhSSUZULTI2MDJdIC0gRml4IG1pc3NpbmcgZGlzdCBmaWxlcworICAgICogW1RIUklGVC0yNjIwXSAtIEZpeCBweXRob24gcGFja2FnaW5nCisgICAgKiBbVEhSSUZULTI1NDVdIC0gVGVzdCBDUFAgZmFpbHMgdG8gYnVpbGQgKHBvc3NpYmx5IHR5cG8pCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjE1NV0gLSBBZGRpbmcgb25lIGxpbmVyIGd1aWRlIHRvIHJlbmFtZSB0aGUgdmVyc2lvbi5oLmluIGFuZCByZW5hbWUgdGhyaWZ0eS5jYy5oCisgICAgKiBbVEhSSUZULTE5OTFdIC0gQWRkIGV4Y2VwdGlvbnMgdG8gZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMjMzNF0gLSBhZGQgYSB0dXRvcmlhbCBmb3Igbm9kZSBKUworICAgICogW1RIUklGVC0yMzkyXSAtIEFjdGlvbnNjcmlwdCB0dXRvcmlhbAorICAgICogW1RIUklGVC0yMzgzXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBSZWJ1cworICAgICogW1RIUklGVC0yMzgyXSAtIGNvbnRyaWI6IHNhbXBsZSBmb3IgY29ubmVjdGluZyBUaHJpZnQgd2l0aCBTVE9NUAorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNDU3XSAtIENhcGFjaXR5IG9mIFRmcmFtZWRUcmFuc3BvcnQgd3JpdGUgYnVmZmVyIGlzIG5ldmVyIHJlc2V0CisgICAgKiBbVEhSSUZULTExMzVdIC0gTm9kZS5qcyB0dXRvcmlhbAorICAgICogW1RIUklGVC0xMzcxXSAtIFNvY2tldCB0aW1lb3V0cyAoU09fUkNWVElNRU8gYW5kIFNPX1NORFRJTUVPKSBub3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMKKyAgICAqIFtUSFJJRlQtMjE0Ml0gLSBNaW5vciB0d2Vha3MgdG8gdGhyaWZ0LmVsIGZvciBiZXR0ZXIgZW1hY3MgcGFja2FnZSBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTIyNjhdIC0gTW9kaWZ5IFRTYXNsVHJhbnNwb3J0IHRvIGlnbm9yZSBUQ1AgaGVhbHRoIGNoZWNrcyBmcm9tIGxvYWRiYWxhbmNlcnMKKyAgICAqIFtUSFJJRlQtMjI2NF0gLSBHaXRIdWIgcGFnZSBpbmNvcnJlY3RseSBzdGF0ZXMgdGhhdCBUaHJpZnQgaXMgc3RpbGwgaW5jdWJhdGluZworICAgICogW1RIUklGVC0yMjYzXSAtIEFsd2F5cyBnZW5lcmF0ZSBnb29kIGhhc2hDb2RlIGZvciBKYXZhCisgICAgKiBbVEhSSUZULTIyMzNdIC0gSmF2YSBjb21waWxlciBzaG91bGQgZGVmZW5zaXZlbHkgY29weSBpdHMgYmluYXJ5IGlucHV0cworICAgICogW1RIUklGVC0yMjM5XSAtIEFkZHJlc3MgRmluZEJ1Z3MgZXJyb3JzCisgICAgKiBbVEhSSUZULTIyNDldIC0gQWRkIFNNUCBCdWlsZCBvcHRpb24gdG8gdGhyaWZ0LnNwZWMgKGFuZCB0aHJlZSBjb25maWcgZGVmaW5lcykKKyAgICAqIFtUSFJJRlQtMjI1NF0gLSBFeGNlcHRpb25zIGdlbmVyYXRlZCBieSBHbyBjb21waWxlciBzaG91bGQgaW1wbGVtZW50IGVycm9yIGludGVyZmFjZQorICAgICogW1RIUklGVC0yMjYwXSAtIFRocmlmdCBpbXBvc2VzIHVubmVlZGVkIGRlcGVuZGVuY3kgb24gY29tbW9ucy1sYW5nMworICAgICogW1RIUklGVC0yMjU4XSAtIEFkZCBUTFMgdjEuMS8xLjIgc3VwcG9ydCB0byBUU1NMU29ja2V0LmNwcAorICAgICogW1RIUklGVC0yMjA1XSAtIE5vZGUuanMgVGVzdCBTZXJ2ZXIgdG8gc3VwcG9ydCB0ZXN0LmpzIEphdmFTY3JpcHQgQnJvd3NlciB0ZXN0IGFuZCBzdW5kcnkgZml4ZXMKKyAgICAqIFtUSFJJRlQtMjIwNF0gLSBTU0wgY2xpZW50IGZvciB0aGUgY29jb2EgY2xpZW50CisgICAgKiBbVEhSSUZULTIxNzJdIC0gSmF2YSBjb21waWxlciBhbGxvY2F0ZXMgb3B0aW9uYWxzIGFycmF5IGZvciBldmVyeSBzdHJ1Y3Qgd2l0aCBhbiBvcHRpb25hbCBmaWVsZAorICAgICogW1RIUklGVC0yMTg1XSAtIHVzZSBjYWJhbCBpbnN0ZWFkIG9mIHJ1bmhhc2tlbGwgaW4gaGFza2VsbCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE5MjZdIC0gUEhQIENvbnN0YW50IEdlbmVyYXRpb24gUmVmYWN0b3JpbmcKKyAgICAqIFtUSFJJRlQtMjAyOV0gLSBQb3J0IEMrKyB0ZXN0cyB0byBXaW5kb3dzCisgICAgKiBbVEhSSUZULTIwNTRdIC0gVFNpbXBsZUZpbGVUcmFuc3BvcnQgLSBKYXZhIExpYiBoYXMgbm8gc3RyYWlnaHQgZm9yd2FyZCBUVHJhbnNwb3J0IGJhc2VkIGZpbGUgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwNDBdIC0gInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUiIHdhcm5pbmdzIG9uIE1TVkMvd2luZG93cworICAgICogW1RIUklGVC0yMDM0XSAtIEdpdmUgZGV2ZWxvcGVycycgQysrIGNvZGUgZGlyZWN0IGFjY2VzcyB0byBzb2NrZXQgRkRzIG9uIHNlcnZlciBzaWRlCisgICAgKiBbVEhSSUZULTIwOTVdIC0gVXNlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMyBjb21wYXRpYmxpdHkKKyAgICAqIFtUSFJJRlQtMTg2OF0gLSBNYWtlIHRoZSBUUEMgYmFja2xvZyBjb25maWd1cmFibGUgaW4gdGhlIEphdmEgc2VydmVycworICAgICogW1RIUklGVC0xODEzXSAtIEFkZCBAR2VuZXJhdGVkIGFubm90YXRpb24gdG8gZ2VuZXJhdGVkIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0CisgICAgKiBbVEhSSUZULTIzMDVdIC0gVEZyYW1lZFRyYW5zcG9ydCBlbXB0eSBjb25zdHJ1Y3RvciBzaG91bGQgcHJvYmFibHkgYmUgcHJpdmF0ZQorICAgICogW1RIUklGVC0yMzA0XSAtIE1vdmUgY2xpZW50IGFzc2lnbm1lbnRzIGZyb20gY29uc3RydXRvciBpbiBtZXRob2QKKyAgICAqIFtUSFJJRlQtMjMwOV0gLSBSdWJ5IChnZW0pICYgUEhQIFJQTSBzdWJwYWNrYWdlcworICAgICogW1RIUklGVC0yMzE4XSAtIHBlcmw6IGRlcGVuZGVuY3kgQ2xhc3M6OkFjY2Vzc29yIG5vdCBjaGVja2VkCisgICAgKiBbVEhSSUZULTIzMTddIC0gZXhjbHVkZSB0dXRvcmlhbCBmcm9tIGJ1aWxkCisgICAgKiBbVEhSSUZULTIzMjBdIC0gUHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGRvZXMgbm90IGdldCBhdHRhY2hlZCBieSBwYXJzZXIKKyAgICAqIFtUSFJJRlQtMjM0OV0gLSBHb2xhbmcgLSBpbXByb3ZlIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTIzNDhdIC0gUEhQIEdlbmVyYXRvcjogYWRkIGFycmF5IHR5cGVoaW50IHRvIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0yMzQ0XSAtIGNvbmZpZ3VyZS5hYzogY29tcGlsZXItb25seSBvcHRpb24KKyAgICAqIFtUSFJJRlQtMjM0M10gLSBHb2xhbmcgLSBSZXR1cm4gYSBzaW5nbGUgZXJyb3IgZm9yIGFsbCBleGNlcHRpb25zIGluc3RlYWQgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcworICAgICogW1RIUklGVC0yMzQxXSAtIEVuYWJsZSBnZW5lcmF0aW9uIG9mIERlbHBoaSBYTUxEb2MgY29tbWVudHMgKGEuay5hLiAiSGVscCBJbnNpZ2h0IikKKyAgICAqIFtUSFJJRlQtMjM1NV0gLSBBZGQgU1NMIGFuZCBXZWIgU29ja2V0IFN1cHBvcnQgdG8gTm9kZSBhbmQgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzUwXSAtIEFkZCBhc3luYyBjYWxscyB0byBub3JtYWwgSmF2YVNjcmlwdAorICAgICogW1RIUklGVC0yMzMwXSAtIEdlbmVyYXRlIFBIUERvYyBjb21tZW50cworICAgICogW1RIUklGVC0yMzMyXSAtIFJQTUJVSUxEOiBydW4gYm9vdHN0cmFwIChpZiBuZWVkZWQpCisgICAgKiBbVEhSSUZULTIzOTFdIC0gc2ltcGxlIHNvY2tldCB0cmFuc3BvcnQgZm9yIGFjdGlvbnNjcmlwdCAzLjAKKyAgICAqIFtUSFJJRlQtMjM3Nl0gLSBub2RlanM6IGFsbG93IFByb21pc2Ugc3R5bGUgY2FsbHMgZm9yIGNsaWVudCBhbmQgc2VydmVyCisgICAgKiBbVEhSSUZULTIzNjldIC0gQWRkIHNzbCBzdXBwb3J0IGZvciBub2RlanMgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjQwMV0gLSBIYXNrZWxsIHR1dG9yaWFsIGNvbXBpbGVzCisgICAgKiBbVEhSSUZULTI0MTddIC0gQyMgVW5pb24gY2xhc3NlcyBhcmUgbm90IHBhcnRpYWwKKyAgICAqIFtUSFJJRlQtMjQxNV0gLSBOYW1lZCBwaXBlcyBzZXJ2ZXIgcGVyZm9ybWFuY2UgJiBtZXNzYWdlIG1vZGUKKyAgICAqIFtUSFJJRlQtMjQwNF0gLSBlbWl0IHdhcm5pbmcgb24gKHR5cGljYWxseSBpbmVmZmljaWVudCkgbGlzdDxieXRlPgorICAgICogW1RIUklGVC0yMzk4XSAtIEltcHJvdmUgTm9kZSBTZXJ2ZXIgTGlicmFyeQorICAgICogW1RIUklGVC0yMzk3XSAtIEFkZCBDT1JTIGFuZCBDU1Agc3VwcG9ydCBmb3IgSmF2YVNjcmlwdCBhbmQgTm9kZS5qcyBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMjQwN10gLSB1c2UgbWFya2Rvd24gKHJlbmFtZSBSRUFETUUgPT4gUkVBRE1FLm1kKQorICAgICogW1RIUklGVC0yMzAwXSAtIEQgY29uZmlndXJlIGluZm8gb3V0cHV0IHNob3VsZCBmb2xsb3cgc2FtZSBmb3JtYXQgYXMgb3RoZXIgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTI1NzldIC0gV2luZG93cyBDRSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTI1NzRdIC0gQ29tcGlsZXIgb3B0aW9uIHRvIGdlbmVyYXRlIG5hbWVzcGFjZSBkaXJlY3RvcmllcyBmb3IgUnVieQorICAgICogW1RIUklGVC0yNTcxXSAtIFNpbXBsaWZ5IGNyb3NzIGNvbXBpbGF0aW9uIHVzaW5nIENNYWtlCisgICAgKiBbVEhSSUZULTI1NjldIC0gSW50cm9kdWNlIGZpbGUgdG8gc3BlY2lmeSB0aGlyZCBwYXJ0eSBsaWJyYXJ5IGxvY2F0aW9ucyBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTI1NjhdIC0gSW1wbGVtZW50IG93biBjZXJ0aWZpY2F0ZSBoYW5kbGVyCisgICAgKiBbVEhSSUZULTI1NTJdIC0gZWxpbWluYXRlIHdhcm5pbmcgZnJvbSBjb25maWd1cmUuYWMKKyAgICAqIFtUSFJJRlQtMjU0OV0gLSBHZW5lcmF0ZSBqc29uIHRhZyBmb3Igc3RydWN0IG1lbWJlcnMuIHVzZSBnby50YWcgYW5ub3RhdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZW5lcmF0ZWQgdGFnLgorICAgICogW1RIUklGVC0yNTQ0XSAtIEFkZCBzdXBwb3J0IGZvciBzb2NrZXQgdHJhbnNwb3J0IGZvciBjIyBsaWJyYXJ5IHdoZW4gdXNpbmcgV2luZG93cyBQaG9uZSBwcm9qZWN0cworICAgICogW1RIUklGVC0yNDUzXSAtIGhhc2tlbGwgdHV0b3JpYWw6IGZpeCB1cCBkaXZpc2lvbiBieSAwIGV4YW1wbGUKKyAgICAqIFtUSFJJRlQtMjQ0OV0gLSBFbmhhbmNlIHR5cGVkZWYgc3RydWN0dXJlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZm9yd2FyZHMgYW5kIHJlYWwgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMjQ0Nl0gLSBUaGVyZSBpcyBubyB3YXkgdG8gaGFuZGxlIHNlcnZlciBzdHJlYW0gZXJyb3JzCisgICAgKiBbVEhSSUZULTI0NTVdIC0gQWxsb3cgY2xpZW50IGNlcnRpZmljYXRlcyB0byBiZSB1c2VkIHdpdGggVEh0dHBDbGllbnQKKyAgICAqIFtUSFJJRlQtMjUxMV0gLSBOb2RlLmpzIG5lZWRzIHRoZSBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTI0OTNdIC0gTm9kZS5qcyBsaWIgbmVlZHMgSFRUUCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjUwMl0gLSBPcHRpbWl6ZSBnbyBpbXBsZW1lbnRhdGlvbnMgb2YgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29scyBmb3Igc3BlZWQKKyAgICAqIFtUSFJJRlQtMjQ5NF0gLSBBZGQgZW51bSB0b1N0cmluZyBoZWxwZXIgZnVuY3Rpb24gaW4gY19nbGliCisgICAgKiBbVEhSSUZULTI0NzFdIC0gTWFrZSBjcHAucmVmIGFubm90YXRpb24gbGFuZ3VhZ2UgYWdub3N0aWMKKyAgICAqIFtUSFJJRlQtMjQ5N10gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMjUzNV0gLSBUSlNPTlByb3RvY29sIHdoZW4gc2VyaWFsaXplZCB5aWVsZHMgVEZpZWxkIGlkcyByYXRoZXIgdGhhbiBuYW1lcworICAgICogW1RIUklGVC0yMjIwXSAtIEFkZCBhIG5ldyBzdHJ1Y3Qgc3RydWN0dj8KKyAgICAqIFtUSFJJRlQtMTM1Ml0gLSBUaHJpZnQgc2VydmVyCisgICAgKiBbVEhSSUZULTk4OV0gLSBQdXNoIGJvb3N0IG00IG1hY3JvcyB1cHN0cmVhbQorICAgICogW1RIUklGVC0xMzQ5XSAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBwcmludCBvdXRzCisgICAgKiBbVEhSSUZULTI0OTZdIC0gc2VydmVyIGFuZCBjbGllbnQgZm9yIHRlc3QvZ28sIGFsc28gc2V2ZXJhbCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTExMTRdIC0gTWF2ZW4gcHVibGlzaCBzaG91bGRuJ3QgcmVxdWlyZSBwYXNzd29yZHMgaGFyZGNvZGVkIGluIHNldHRpbmdzLnhtbAorICAgICogW1RIUklGVC0yMDQzXSAtIHZpc3VhbCAyMDEwIHdhcm5pbmdzIC0gdW5yZWFjaGFibGUgY29kZQorICAgICogW1RIUklGVC0xNjgzXSAtIEltcGxlbWVudCBhbHRlcm5hdGl2ZXMgdG8gSmF2YXNjcmlwdCBDbGllbnQgc2lkZSBUcmFuc3BvcnQgcHJvdG9jb2wsIGp1c3QgYXMgTlBBUEkgYW5kIFdlYlNvY2tldC4KKyAgICAqIFtUSFJJRlQtMTc0Nl0gLSBwcm92aWRlIGEgU1BEWCBmaWxlCisgICAgKiBbVEhSSUZULTE3NzJdIC0gU2VyaWFsaXphdGlvbiBkb2VzIG5vdCBjaGVjayB0eXBlcyBvZiBlbWJlZGRlZCBzdHJ1Y3R1cmVzLgorICAgICogW1RIUklGVC0yMzg3XSAtIG5vZGVqczogZXh0ZXJuYWwgaW1wb3J0cyBzaG91bGQgYmUgY2VudHJhbGl6ZWQgaW4gaW5kZXguanMKKyAgICAqIFtUSFJJRlQtMjAzN10gLSBNb3JlIGdlbmVyYWwgbWFjcm8gVEhSSUZUX1VOVVNFRF9WQVJJQUJMRQorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xMDEyXSAtIFRyYW5zcG9ydCBmb3IgRGF0YUlucHV0IERhdGFPdXRwdXQgaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTIyNTZdIC0gVXNpbmcgYysrMTEvYysrMHggc3RkIGxpYnJhcnkgIHJlcGxhY2UgYm9vc3QgbGlicmFyeQorICAgICogW1RIUklGVC0yMjUwXSAtIEpTT04gYW5kIE1lbW9yeUJ1ZmZlciBmb3IgSmF2YU1FCisgICAgKiBbVEhSSUZULTIxMTRdIC0gUHl0aG9uIFNlcnZpY2UgUmVtb3RlIFNTTCBPcHRpb24KKyAgICAqIFtUSFJJRlQtMTcxOV0gLSBTQVNMIGNsaWVudCBzdXBwb3J0IGZvciBQeXRob24KKyAgICAqIFtUSFJJRlQtMTg5NF0gLSBUaHJpZnQgbXVsdGktdGhyZWFkZWQgYXN5bmMgSmF2YSBTZXJ2ZXIgdXNpbmcgSmF2YSA3IEFzeW5jaHJvbm91c0NoYW5uZWxHcm91cAorICAgICogW1RIUklGVC0xODkzXSAtIEhUVFAvSlNPTiBzZXJ2ZXIvY2xpZW50IGZvciBub2RlIGpzCisgICAgKiBbVEhSSUZULTIzNDddIC0gQyMgVExTIFRyYW5zcG9ydCBiYXNlZCBvbiBUSFJJRlQtMTgxCisgICAgKiBbVEhSSUZULTIzNzddIC0gQWxsb3cgYWRkaXRpb24gb2YgY3VzdG9tIEhUVFAgSGVhZGVycyB0byBhbiBIVFRQIFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yNDA4XSAtIE5hbWVkIFBpcGUgVHJhbnNwb3J0IE9wdGlvbiBmb3IgQyMKKyAgICAqIFtUSFJJRlQtMjU3Ml0gLSBBZGQgc3RyaW5nL2NvbGxlY3Rpb24gbGVuZ3RoIGxpbWl0IGNoZWNrcyAoZnJvbSBDKyspIHRvIGphdmEgcHJvdG9jb2wgcmVhZGVycworICAgICogW1RIUklGVC0yNDY5XSAtICJqYXZhOmZ1bGxjYW1lbCIgb3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FtZWwtY2FzZSB1bmRlcnNjb3JlZCBhdHRyaWJ1dGUgbmFtZXMKKyAgICAqIFtUSFJJRlQtNzk1XSAtIEltcG9ydGluZyBzZXJ2aWNlIGZ1bmN0aW9ucyAoc2ltdWxhdGlvbiBtdWx0aXBsZSBpbmhlcml0YW5jZSkKKyAgICAqIFtUSFJJRlQtMjE2NF0gLSBBZGQgYSBHZXQvUG9zdCBIdHRwIFNlcnZlciB0byBOb2RlIGFsb25nIHdpdGggZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMjI1NV0gLSBhZGQgUGFyZW50IENsYXNzIGZvciBnZW5lcmF0ZWQgU3RydWN0IGNsYXNzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI1MzldIC0gVHNvY2tldC5jcHAgYWRkcmluZm8gYWlfZmxhZ3MgPSBBSV9BRERSQ09ORklHCisgICAgKiBbVEhSSUZULTI0NDBdIC0gaG93IHRvIGNvbm5lY3QgYXMzIHRvIGphdmEgYnkgdGhyaWZ0ICwKKyAgICAqIFtUSFJJRlQtMjM3OV0gLSBNZW1tb3J5IGxlYWtpbmcgd2hpbGUgdXNpbmcgbXVsdGl0aHJlYWRpbmcgaW4gQysrIHNlcnZlci4KKyAgICAqIFtUSFJJRlQtMjI3N10gLSBUaHJpZnQ6IGluc3RhbGxpbmcgZmIzMDMgZXJyb3IKKyAgICAqIFtUSFJJRlQtMjU2N10gLSBDc2hhcnAgc2xvdyA/CisgICAgKiBbVEhSSUZULTI1NzNdIC0gdGhyaWZ0IDAuOS4yIHJlbGVhc2UKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtOTgxXSAtIGNvY29hOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIxMzJdIC0gR286IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTIyOTldIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgUnVieSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCisgICAgKiBbVEhSSUZULTIyOThdIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgQyMgZG9lcyBub3QgYWxsb3cgZm9yIGJvdGggcG9zc2libGUgc2xhc2ggKHNvbGlkdXMpIGVuY29kaW5ncworICAgICogW1RIUklGVC0yMjk3XSAtIFRKc29uUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIERlbHBoaSBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCisgICAgKiBbVEhSSUZULTIyNzFdIC0gSmF2YVNjcmlwdDogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTIyNTFdIC0gZ28gdGVzdCBmb3IgY29tcGFjdCBwcm90b2NvbCBpcyBub3QgcnVubmluZworICAgICogW1RIUklGVC0yMTk1XSAtIERlbHBoaTogQWRkIGV2ZW50IGhhbmRsZXJzIGZvciBzZXJ2ZXIgYW5kIHByb2Nlc3NpbmcgZXZlbnRzCisgICAgKiBbVEhSSUZULTIxNzZdIC0gVFNpbXBsZUpTT05Qcm90b2NvbC5SZWFkRmllbGRCZWdpbigpIGRvZXMgbm90IHJldHVybiBmaWVsZCB0eXBlIGFuZCBJRAorICAgICogW1RIUklGVC0yMTc1XSAtIFdyb25nIGZpZWxkIHR5cGUgc2V0IGZvciBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjE3NF0gLSBEZXNlcmlhbGl6aW5nIEpTT04gZmFpbHMgaW4gc3BlY2lmaWMgY2FzZXMKKyAgICAqIFtUSFJJRlQtMjA1M10gLSBOb2RlSlM6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0xOTE0XSAtIFB5dGhvbjogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTgxMF0gLSBhZGQgcnVieSB0byB0ZXN0L3Rlc3Quc2gKKyAgICAqIFtUSFJJRlQtMjMxMF0gLSBQSFA6IENsaWVudC1zaWRlIHN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0yMzQ2XSAtIEMjOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjM0NV0gLSBEZWxwaGk6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yMzM4XSAtIEZpcnN0IGRvY3RleHQgd3JvbmdseSBpbnRlcnByZXRlZCBhcyBwcm9ncmFtIGRvY3RleHQgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC0yMzI1XSAtIFNTTCB0ZXN0IGNlcnRpZmljYXRlcworICAgICogW1RIUklGVC0yMzU4XSAtIEMrKzogYWRkIGNvbXBhY3QgcHJvdG9jb2wgdG8gY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC0yNDI1XSAtIFBIUDogU2VydmVyLXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTI0MjFdIC0gVHJlZS9SZWN1cnNpdmUgc3RydWN0IHN1cHBvcnQgaW4gdGhyaWZ0CisgICAgKiBbVEhSSUZULTIyOTBdIC0gVXBkYXRlIEdvIHR1dG9yaWFsIHRvIGFsaWduIHdpdGggVEhSSUZULTIyMzIKKyAgICAqIFtUSFJJRlQtMjU1OF0gLSBDU2hhcnAgY29tcGlsZXIgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbmNhdCBpbnRzIHdpdGggc3RyaW5ncyB1c2luZyArCisgICAgKiBbVEhSSUZULTI1MDddIC0gQWRkaXRpb25hbCBMVUEgVFByb3RvY29sRXhjZXB0aW9uIGVycm9yIGNvZGUgbmVlZGVkPworICAgICogW1RIUklGVC0yNDk5XSAtIENvbXBpbGVyOiBhbGxvdyBhbm5vdGF0aW9ucyB3aXRob3V0ICI9IHZhbHVlIgorICAgICogW1RIUklGVC0yNTM0XSAtIENyb3NzIGxhbmd1YWdlIHRlc3QgcmVzdWx0cyBzaG91bGQgcmVjb3JkZWQgdG8gYSBzdGF0dXMubWQgb3Igc3RhdHVzLmh0bWwgZmlsZSBhdXRvbWF0aWNhbGx5CisgICAgKiBbVEhSSUZULTY2XSAtIEphdmE6IEFsbG93IG11bHRpcGxleGluZyBtdWx0aXBsZSBzZXJ2aWNlcyBvdmVyIGEgc2luZ2xlIFRDUCBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTE2ODFdIC0gQWRkIEx1YSBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE3MjddIC0gUnVieS0xLjk6IGRhdGEgbG9zczogImJpbmFyeSIgZmllbGRzIGFyZSByZS1lbmNvZGVkCisgICAgKiBbVEhSSUZULTE3MjZdIC0gUnVieS0xLjk6ICJiaW5hcnkiIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYnkgc3RyaW5nIHdob3NlIGVuY29kaW5nIGlzICJVVEYtOCIKKyAgICAqIFtUSFJJRlQtOTg4XSAtIHBlcmw6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkgdmlhIGNvbmZpZ3VyZQorICAgICogW1RIUklGVC0zMzRdIC0gQ29tcGFjdCBQcm90b2NvbCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTI0NDRdIC0gcHVsbCByZXF1ZXN0IDg4OiB0aHJpZnQ6IGNsZWFuIHVwIGVudW0gdmFsdWUgYXNzaWdubWVudAorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTIyMjNdIC0gU3BhbSBsaW5rcyBvbiB3aWtpCisgICAgKiBbVEhSSUZULTI1NjZdIC0gUGxlYXNlIGNyZWF0ZSBhIERPQVAgZmlsZSBmb3IgeW91ciBUTFAKKyAgICAqIFtUSFJJRlQtMjIzN10gLSBVcGRhdGUgYXJjaGl2ZSB0byBjb250YWluIGFsbCB2ZXJzaW9ucworICAgICogW1RIUklGVC05NjJdIC0gVHV0b3JpYWwgcGFnZSBvbiBvdXIgd2Vic2l0ZSBpcyByZWFsbHkgdW5oZWxwZnVsCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMjMyN10gLSBub2RlanM6IG5vZGVqcyB0ZXN0IHN1aXRlIHNob3VsZCBiZSBidW5kbGVkIHdpdGggdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjQ0NV0gLSBUSFJJRlQtMjM4NCAoY29kZSBnZW5lcmF0aW9uIGZvciBnbyBtYXBzIHdpdGggYmluYXJ5IGtleXMpIHNob3VsZCBiZSB0ZXN0ZWQKKyAgICAqIFtUSFJJRlQtMjUwMV0gLSBDIyBUaGUgdGVzdCBwYXJhbWV0ZXJzIGZyb20gdGhlIFRlc3RTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvdGVzdC8KKworIyMgV2lzaAorICAgICogW1RIUklGVC0yMTkwXSAtIEFkZCB0aGUgSmF2YVNjcmlwdCB0aHJpZnQuanMgbGliIHRvIHRoZSBCb3dlciByZWdpc3RyeQorICAgICogW1RIUklGVC0yMDc2XSAtIGJvb3N0OjpvcHRpb25hbCBpbnN0ZWFkIG9mIF9faXNzZXQKKworCisKK1RocmlmdCAwLjkuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDQwXSAtIGRlYmlhbiBwYWNrYWdpbmc6IG1pbm9yLWlzaCBwb2xpY3kgcHJvYmxlbXMKKyAgICAqIFtUSFJJRlQtMTQwMl0gLSBHZW5lcmF0ZWQgWV90eXBlcy5qcyBkb2VzIG5vdCByZXF1aXJlKCkgWF90eXBlcy5qcyB3aGVuIGFuIGluY2x1ZGUgaW4gdGhlIElETCBmaWxlIHdhcyB1c2VkCisgICAgKiBbVEhSSUZULTE1NTFdIC0gMiB0aHJpZnQgZmlsZSBkZWZpbmUgb25seSBzdHJ1Y3QgKG5vIHNlcnZpY2UpLCBvbmUgaW5jbHVkZSBhbm90aGVyLCB0aGUgZ2VuIG5vZGVqcyBmaWxlIGRpZG4ndCBoYXZlICJyZXF1aXJlcyIgYXQgdGhlIHRvcAorICAgICogW1RIUklGVC0xMjY0XSAtIFRTb2NrZXRDbGllbnQgaXMgcXVlcmllZCBieSBydW4gbG9vcCBhZnRlciBkZWFsbG9jYXRpb24gaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMTYwMF0gLSBUaHJpZnQgR28gQ29tcGlsZXIgYW5kIExpYnJhcnkgb3V0IG9mIGRhdGUgd2l0aCBHbyAxIFJlbGVhc2UuCisgICAgKiBbVEhSSUZULTE2MDNdIC0gVGhyaWZ0IElETCBhbGxvd3MgZm9yIG11bHRpcGxlIGV4Y2VwdGlvbnMsIGFyZ3Mgb3Igc3RydWN0IG1lbWJlciBuYW1lcyB0byBiZSB0aGUgc2FtZQorICAgICogW1RIUklGVC0xMDYyXSAtIFByb2JsZW1zIHdpdGggcHl0aG9uIHR1dG9yaWFscworICAgICogW1RIUklGVC04NjRdIC0gZGVmYXVsdCB2YWx1ZSBmYWlscyBpZiBpZGVudGlmaWVyIGlzIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTkzMF0gLSBSdWJ5IGFuZCBIYXNrZWxsIGJpbmRpbmdzIGRvbid0IHByb3Blcmx5IHN1cHBvcnQgREVTVERJUiAobWFrZXMgcGFja2FnaW5nIHBhaW5mdWwpCisgICAgKiBbVEhSSUZULTgyMF0gLSBUaGUgcmVhZExlbmd0aCBhdHRyaWJ1dGUgb2YgVEJpbmFyeVByb3RvY29sIGlzIHVzZWQgYXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYW5kIGlzIGRlY3JlbWVudGVkIG9uIGVhY2ggY2FsbCBvZiBjaGVja1JlYWRMZW5ndGgKKyAgICAqIFtUSFJJRlQtMTY0MF0gLSBOb25lIG9mIHRoZSB0dXRvcmlhbHMgbGlua2VkIG9uIHRoZSB3ZWJzaXRlIGNvbnRhaW4gY29udGVudAorICAgICogW1RIUklGVC0xNjM3XSAtIE5QTSByZWdpc3RyeSBkb2VzIG5vdCBpbmNsdWRlIHZlcnNpb24gMC44CisgICAgKiBbVEhSSUZULTE2NDhdIC0gTm9kZUpTIGNsaWVudHMgYWx3YXlzIHJlY2VpdmUgMCBmb3IgJ2RvdWJsZScgdmFsdWVzLgorICAgICogW1RIUklGVC0xNjYwXSAtIFB5dGhvbiBUaHJpZnQgbGlicmFyeSBjYW4gYmUgaW5zdGFsbGVkIHdpdGggcGlwIGJ1dCBub3QgZWFzeV9pbnN0YWxsCisgICAgKiBbVEhSSUZULTE2NTddIC0gQ2hyb21lIGJyb3dzZXIgc2VuZGluZyBPUFRJT05TIG1ldGhvZCBiZWZvcmUgUE9TVCBpbiB4bWxIdHRwUmVxdWVzdAorICAgICogW1RIUklGVC0yMTE4XSAtIENlcnRpZmljYXRlIGVycm9yIGhhbmRsaW5nIHN0aWxsIGluY29ycmVjdAorICAgICogW1RIUklGVC0yMTM3XSAtIFJ1YnkgdGVzdCBsaWIgZmFpbHMgamVua2lucyBidWlsZCAjODY0CisgICAgKiBbVEhSSUZULTIxMzZdIC0gVmFncmFudCBidWlsZCBub3QgY29tcGlsaW5nIGphdmEsIHJ1YnksIHBocCwgZ28gbGlicyBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMjEzNV0gLSBHTyBsaWIgbGVhdmVzIGJlaGluZCB0ZXN0IGZpbGVzIHRoYXQgYXJlIGF1dG8gZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTIxMzRdIC0gbWluZ3ctY3Jvc3MtY29tcGlsZSBzY3JpcHQgZmFpbGluZyB3aXRoIHN0cmlwIGVycm9ycworICAgICogW1RIUklGVC0yMTMzXSAtIGphdmEgVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhIHRlc3QgZmFpbGluZworICAgICogW1RIUklGVC0yMTI2XSAtIGxpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TVEQqIGZpbGVzIG1pc3NpbmcgZnJvbSBESVNUCisgICAgKiBbVEhSSUZULTIxMjVdIC0gZGViaWFuIG1pc3NpbmcgZnJvbSBESVNUCisgICAgKiBbVEhSSUZULTIxMjRdIC0gLm8sIC5zbywgLmxhLCAuZGVwcywgLmxpYnMsIGdlbi0qIGZpbGVzIGxlZnQgdHV0b3JpYWxzLCB0ZXN0IGFuZCBsaWIvY3BwIHdoZW4gbWFraW5nIERJU1QKKyAgICAqIFtUSFJJRlQtMjEyM10gLSBHTyBsaWIgbWlzc2luZyBmaWxlcyBpbiBESVNUIGJ1aWxkCisgICAgKiBbVEhSSUZULTIxMjFdIC0gQ29tcGlsYXRpb24gYnVnIGZvciBOb2RlLmpzCisgICAgKiBbVEhSSUZULTIxMjldIC0gcGhwIGV4dCBtaXNzaW5nIGZyb20gZGlzdAorICAgICogW1RIUklGVC0yMTI4XSAtIGxpYiBHTyB0ZXN0cyBmYWlsIHdpdGggZnVuY3QgZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAorICAgICogW1RIUklGVC0yMjg2XSAtIEZhaWxlZCB0byBjb21waWxlIFRocmlmdDAuOS4xIHdpdGggYm9vc3QxLjU1IGJ5IFZTMjAxMCBpZiBzZWxlY3QgRGVidWctbXQmeDY0IG1vZGUuCisgICAgKiBbVEhSSUZULTE5NzNdIC0gVENvbXBhY3RQcm90b2NvbCBpbiBDIyBsaWIgZG9lcyBub3Qgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBuZWdhdGl2ZSBpbnQzMiBhbmQgaW50NjQgbnVtYmVyIGNvcnJlY3RseQorICAgICogW1RIUklGVC0xOTkyXSAtIGNhc3RzIGluIFRDb21wYWN0UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKKyAgICAqIFtUSFJJRlQtMTkzMF0gLSBDIyBnZW5lcmF0ZXMgdW5zaWduZWQgYnl0ZSBmb3IgVGhyaWZ0ICJieXRlIiB0eXBlCisgICAgKiBbVEhSSUZULTE5MjldIC0gVXBkYXRlIHdlYnNpdGUgdG8gdXNlIE1pcnJvcnMgZm9yIGRvd25sb2FkcworICAgICogW1RIUklGVC0xOTI4XSAtIFJhY2UgbWF5IHN0aWxsIGV4aXN0IGluIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpCisgICAgKiBbVEhSSUZULTE5MzRdIC0gVGFicyBpbiBFeGFtcGxlIHNlY3Rpb24gb24gbWFpbiBwYWdlIGFyZSBub3Qgd29ya2luZworICAgICogW1RIUklGVC0xOTMzXSAtIERlbHBoaSBnZW5lcmF0b3IgY3Jhc2hlcyB3aGVuIGEgdHlwZWRlZiByZWZlcmVuY2VzIGFub3RoZXIgdHlwZWRlZiBmcm9tIGFuIGluY2x1ZGVkIGZpbGUKKyAgICAqIFtUSFJJRlQtMTk0Ml0gLSBCaW5hcnkgYWNjZWxlcmF0ZWQgY3BwIGV4dGVuc2lvbiBkb2VzIG5vdCB1c2UgVGhyaWZ0IG5hbWVzcGFjZXMgZm9yIEV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMTk1OV0gLSBDIzogQWRkIFVuaW9uIFRNZW1vcnlCdWZmZXIgc3VwcG9ydAorICAgICogW1RIUklGVC0xOTU4XSAtIEMjOiBVc2Ugc3RhdGljIE9iamVjdC5FcXVhbHMgaW5zdGVhZCBvZiAuRXF1YWxzKCkgY2FsbHMgaW4gZXF1YWxzCisgICAgKiBbVEhSSUZULTE5NTddIC0gTm9kZUpTIFRGcmFtZWRUcmFuc3BvcnQgYW5kIFRCdWZmZXJlZFRyYW5zcG9ydCByZWFkIGJ5dGVzIGFzIHVuc2lnbmVkCisgICAgKiBbVEhSSUZULTE5NTVdIC0gVW5pb24gVHlwZSB3cml0ZXIgZ2VuZXJhdGVkIGluIEMjIGRvZXMgbm90IFdyaXRlU3RydWN0QmVnaW4KKyAgICAqIFtUSFJJRlQtMTk1Ml0gLSBUcmF2aXMgQ0kKKyAgICAqIFtUSFJJRlQtMTk0OV0gLSBXUDcgYnVpbGQgYnJva2VuCisgICAgKiBbVEhSSUZULTE5NDNdIC0gZG9jc3RyaW5ncyBmb3IgZW51bSB2YWx1ZXMgYXJlIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjA3MF0gLSBJbXByb3BlciBgSGV4Q2hhcicgYW5kICdIZXhWYWwnIGltcGxlbWVudGF0aW9uIGluIFRKU09OUHJvdG9jb2wuY3MKKyAgICAqIFtUSFJJRlQtMjAxN10gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorICAgICogW1RIUklGVC0yMDMyXSAtIEMjIGNsaWVudCBsZWFrcyBzb2NrZXRzL2hhbmRsZXMKKyAgICAqIFtUSFJJRlQtMTk5Nl0gLSBKYXZhTUUgQ29uc3RhbnRzIGdlbmVyYXRpb24gaXMgYnJva2VuIC8gaW5jb25zaXN0ZW50IHdpdGggcmVndWxhciBKYXZhIGdlbmVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjAwMl0gLSBIYXNrZWxsOiBUZXN0IHVzZSBEYXRhLk1heWJlIGluc3RlYWQgb2YgTWF5YmUKKyAgICAqIFtUSFJJRlQtMjA1MV0gLSBWYWdyYW50IGZhaWxzIHRvIGJ1aWxkIGVybGFuZworICAgICogW1RIUklGVC0yMDUwXSAtIFZhZ3JhbnQgQyMgbGliIGNvbXBpbGUgZmFpbHMgd2l0aCBURXhjZXB0aW9uIG1pc3NpbmcKKyAgICAqIFtUSFJJRlQtMTk3OF0gLSBSdWJ5OiBUaHJpZnQgc2hvdWxkIGFsbG93IGZvciB0aGUgU1NMIHZlcmlmeSBtb2RlIHRvIGJlIHNldAorICAgICogW1RIUklGVC0xOTg0XSAtIG5hbWVzcGFjZSBjb2xsaXNpb24gaW4gcHl0aG9uIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTE5ODhdIC0gV2hlbiB0cnlpbmcgdG8gYnVpbGQgYSBkZWJpYW4gcGFja2FnZSBpdCBmYWlscyBhcyB0aGUgZmlsZSBORVdTIGRvZXNuJ3QgZXhpc3QKKyAgICAqIFtUSFJJRlQtMTk3NV0gLSBUQmluYXJ5UHJvdG9jb2wgQ2hlY2tMZW5ndGggY2FuJ3QgYmUgdXNlZCBmb3IgYSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMTk5NV0gLSAnLicgYWxsb3dlZCBhdCBlbmQgb2YgaWRlbnRpZmllciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0yMTEyXSAtIEVycm9yIGluIEdvIGdlbmVyYXRvciB3aGVuIHVzaW5nIHR5cGVkZWZzIGluIG1hcCBrZXlzCisgICAgKiBbVEhSSUZULTIwODhdIC0gVHlwb3MgaW4gVGhyaWZ0IGNvbXBpbGVyIGhlbHAgdGV4dAorICAgICogW1RIUklGVC0yMDgwXSAtIEMjIG11bHRpcGxleCBwcm9jZXNzb3IgZG9lcyBub3QgY2F0Y2ggSU9FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjA4Ml0gLSBFeGVjdXRpbmcgImdtYWtlIGNsZWFuIiBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMjEwMl0gLSBjb25zdGFudHMgYXJlIG5vdCByZWZlcmVuY2luZyB0byBjb3JyZWN0IHR5cGUgd2hlbiBpbmNsdWRlZCBmcm9tIGFub3RoZXIgdGhyaWZ0IGZpbGUKKyAgICAqIFtUSFJJRlQtMjEwMF0gLSB0eXBlZGVmcyBhcmUgbm90IGNvcnJlY3RseSByZWZlcmVuY2VkIHdoZW4gaW5jbHVkaW5nIGZyb20gb3RoZXIgdGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTIwNjZdIC0gJ21ha2UgaW5zdGFsbCcgZG9lcyBub3QgaW5zdGFsbCB0d28gaGVhZGVycyByZXF1aXJlZCBmb3IgQysrIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTIwNjVdIC0gTm90IHZhbGlkIGNvbnN0YW50cyBmaWxlbmFtZSBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIwNDddIC0gVGhyaWZ0LlByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wsIGludFRvWmlnWmFnIGRhdGEgbG9zdCAoVENvbXBhY3RQcm90b2NvbC5jcykKKyAgICAqIFtUSFJJRlQtMjAzNl0gLSBUaHJpZnQgZ2VtIHdhcm5zIGFib3V0IGNsYXNzIHZhcmlhYmxlIGFjY2VzcyBmcm9tIHRvcCBsZXZlbAorICAgICogW1RIUklGVC0yMDU3XSAtIFZhZ3JhbnQgZmFpbHMgb24gcGhwIHRlc3RzCisgICAgKiBbVEhSSUZULTIxMDVdIC0gR2VuZXJhdGVkIGNvZGUgZm9yIGRlZmF1bHQgdmFsdWVzIG9mIGNvbGxlY3Rpb25zIGlnbm9yZXMgdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICogW1RIUklGVC0yMDkxXSAtIFVubmVjZXNzYXJ5ICdmcmllbmQnIGRlY2xhcmF0aW9uIGNhdXNlcyB3YXJuaW5nIGluIFRXaW5zb2NrU2luZ2xldG9uCisgICAgKiBbVEhSSUZULTIwOTBdIC0gR28gZ2VuZXJhdG9yLCBmaXggaW5jbHVkaW5nIG9mIG90aGVyIHRocmlmdCBmaWxlcworICAgICogW1RIUklGVC0yMTA2XSAtIEZpeCBzdXBwb3J0IGZvciBuYW1lc3BhY2VzIGluIEdPIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0xNzgzXSAtIEMjIGRvZXNuJ3QgaGFuZGxlIHJlcXVpcmVkIGZpZWxkcyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTc4Ml0gLSBhc3luYyBvbmx5IGRlZmluZWQgaW4gc2lsdmVybGlnaHQKKyAgICAqIFtUSFJJRlQtMTc3OV0gLSBNaXNzaW5nIHByb2Nlc3NfWFhYWCBtZXRob2QgaW4gZ2VuZXJhdGVkIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gZm9yIGFsbCAnb25ld2F5JyBzZXJ2aWNlIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0xNjkyXSAtIFNPX1JFVVNFQUREUiBhbGxvd3MgZm9yIHNvY2tldCBoaWphY2tpbmcgb24gV2luZG93cworICAgICogW1RIUklGVC0xNzIwXSAtIEpSdWJ5IHRpbWVzIG91dCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMTcxM10gLSBOYW1lZCBhbmQgQW5vbnltb3VzIFBpcGUgdHJhbnNwb3J0IChEZWxwaGkpCisgICAgKiBbVEhSSUZULTE2OTldIC0gTmF0aXZlIFVuaW9uI3JlYWQgaGFzIGV4dHJhIHJlYWRfZmllbGRfZW5kIGNhbGwKKyAgICAqIFtUSFJJRlQtMTc0OV0gLSBQeXRob24gVFNTTFNvY2tldCBlcnJvciBoYW5kbGluZyBvYnNjdXJlcyBhY3R1YWwgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTc0OF0gLSBHdWFyZCBhbmQgUldHdWFyZCBtYWNyb3MgZGVmaW5lZCBpbiBnbG9iYWwgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTE3MzRdIC0gRnJvbnQgd2VicGFnZSBpcyBzdGlsbCBhZHZlcnRpc2luZyB2MC44IGFzIGN1cnJlbnQgcmVsZWFzZQorICAgICogW1RIUklGVC0xNzI5XSAtIEMgZ2xpYiByZWZhY3RvciBsZWZ0IGVtcHR5IGZvbGRlcnMgaW4gc3ZuCisgICAgKiBbVEhSSUZULTE3NjddIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChEZWxwaGkpCisgICAgKiBbVEhSSUZULTE3NjVdIC0gSW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBmb3IgbnVsbCBvciBuZWdhdGl2ZSBrZXlzCisgICAgKiBbVEhSSUZULTE3NzhdIC0gQ29uZmlndXJlIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24gZHVlIHRvIHRhciBmYWlsdXJlCisgICAgKiBbVEhSSUZULTE3NzddIC0gVFBpcGVTZXJ2ZXIgaXMgVU5TVE9QUEFCTEUKKyAgICAqIFtUSFJJRlQtMTc1M10gLSBNdWx0aXBsZSBDKysgV2luZG93cywgT1NYLCBhbmQgaU9TIHBvcnRhYmlsaXR5IGlzc3VlcworICAgICogW1RIUklGVC0xNzU2XSAtICdtYWtlIC1qIDgnIGZhaWxzIHdpdGggInVudGVybWluYXRlZCAjaWZkZWYiIGVycm9yCisgICAgKiBbVEhSSUZULTE3NzNdIC0gUHl0aG9uIGxpYnJhcnkgc2hvdWxkIHJ1biBvbiBweXRob24gMi40CisgICAgKiBbVEhSSUZULTE3NjldIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDKyspCisgICAgKiBbVEhSSUZULTE3NjhdIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDb21waWxlcikKKyAgICAqIFtUSFJJRlQtMTY2Nl0gLSBodG9ubGwgdXNhZ2UgaW4gVEJpbmFyeVByb3RvY29sLnRjYyBnZW5lcmF0ZXMgd2FybmluZyB3aXRoIE1TVkMyMDEwCisgICAgKiBbVEhSSUZULTE5MTldIC0gbGlidGhyaWZ0IGRlcGVuZHMgb24gaHR0cGNvcmUtNC4xLjMgKGRpcmVjdGx5KSBhbmQgaHR0cGNvcmUtNC4xLjQgKHRyYW5zaXRpdmVseSkKKyAgICAqIFtUSFJJRlQtMTg2NF0gLSBpbXBsZW1lbnQgZXZlbnQgaGFuZGxlciBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcgorICAgICogW1RIUklGVC0xODU5XSAtIEdlbmVyYXRlZCBlcnJvciBjKysgY29kZSB3aXRoIC1vdXQgYW5kIGluY2x1ZGVfcHJlZml4IHBhcmFtCisgICAgKiBbVEhSSUZULTE4NjldIC0gVFRocmVhZFBvb2xTZXJ2ZXIgKGphdmEpIGRpZXMgd2hlbiB0aHJlYWRwb29sIGlzIGNvbnN1bWVkCisgICAgKiBbVEhSSUZULTE4NDJdIC0gTWVtb3J5IGxlYWsgd2l0aCBQaXBlcworICAgICogW1RIUklGVC0xODM4XSAtIENhbid0IGJ1aWxkIGNvbXBpbGVyIG9uIE9TIFggYmVjYXVzZSBvZiBtaXNzaW5nIHRocmlmdHkuaAorICAgICogW1RIUklGVC0xODQ2XSAtIFJlc3RvcmUgc29ja2V0LmggaGVhZGVyIHRvIHN1cHBvcnQgYnVpbGRzIHdpdGggQW5kcm9pZCBOREsKKyAgICAqIFtUSFJJRlQtMTg1MF0gLSBtYWtlIGNoZWNrIGhhbmdzIG9uIFRTb2NrZXQgdGVzdHMgaW4gVHJhbnNwb3J0VGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMTg3M10gLSBCaW5hcnkgcHJvdG9jb2wgZmFjdG9yeSBpZ25vcmVzIHN0cnVjdCByZWFkL3dyaXRlIGZsYWdzCisgICAgKiBbVEhSSUZULTE4NzJdIC0gaXNzdWVzIHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0IGJ1ZmZlcgorICAgICogW1RIUklGVC0xOTA0XSAtIEluY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdHlwZWRlZnMgd2hpY2ggdXNlIGluY2x1ZGVkIHR5cGVzCisgICAgKiBbVEhSSUZULTE5MDNdIC0gUEhQIG5hbWVzcGFjZXMgY2F1c2UgYmluYXJ5IHByb3RvY29scyB0byBub3QgYmUgdXNlZAorICAgICogW1RIUklGVC0xODk1XSAtIERlbHBoaTogcmVzZXJ2ZWQgdmFyaWFibGUgbmFtZSAicmVzdWx0IiBub3QgZGV0ZWN0ZWQgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMTg4MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgcmVsZWFzZSBvcGVuIGNvbm5lY3Rpb25zIG9yIHRocmVhZHMgb24gc2h1dGRvd24KKyAgICAqIFtUSFJJRlQtMTg4OF0gLSBKYXZhIFRocmlmdCBjbGllbnQgY2FuJ3QgY29ubmVjdCB0byBQeXRob24gVGhyaWZ0IHNlcnZlciBvbiBzYW1lIGhvc3QKKyAgICAqIFtUSFJJRlQtMTgzMV0gLSBCdWcgaW4gbGlzdCBkZXNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTgyNF0gLSBtYW55IGNvbXBpbGUgd2FybmluZywgYmVjYXNlIFRocmVhZC5oIGluY2x1ZGVzIGNvbmZpZy5oCisgICAgKiBbVEhSSUZULTE4MjNdIC0gTWlzc2luZyBwYXJlbnRoZXNpcyBicmVha3MgIklTXy4uLiIgbWFjcm8gaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTgwNl0gLSBQeXRob24gZ2VuZXJhdGlvbiBhbHdheXMgdHJ1bmNhdGVzIF9faW5pdF9fLnB5IGZpbGVzCisgICAgKiBbVEhSSUZULTE3OTVdIC0gUmFjZSBjb25kaXRpb24gaW4gVFRocmVhZGVkU2VydmVyUG9vbCBqYXZhIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTE3OTRdIC0gQyMgYXN5bmNjdHAgYnJva2VuCisgICAgKiBbVEhSSUZULTE4MDRdIC0gQmluYXJ5K2NvbXBhY3QgcHJvdG9jb2wgc2luZ2xlIGJ5dGUgZXJyb3IgaW4gUnVieSBsaWJyYXJ5IChBUk0gYXJjaGl0ZWN0dXJlKTogY2F1c2VkIGJ5IGRpZmZlcmVudCBjaGFyIHNpZ25lZG5lc3MKKyAgICAqIFtUSFJJRlQtMTgwMF0gLSBEb2N1bWVudGF0aW9uIHRleHQgbm90IGFsd2F5cyBlc2NhcGVkIGNvcnJlY3RseSB3aGVuIHJlbmRlcmVkIHRvIEhUTUwKKyAgICAqIFtUSFJJRlQtMTc4OF0gLSBDIzogQ29uc3RhbnRzIHN0YXRpYyBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTE4MTZdIC0gTmVlZCAicmVxdWlyZSIgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGluICJ4eHhfdHlwZXMuanMiCisgICAgKiBbVEhSSUZULTE5MDddIC0gQ29tcGlsaW5nIG5hbWVzcGFjZSBhbmQgc3ViLW5hbWVzcGFjZSBkaXJlY3RpdmVzIGZvciB1bnJlY29nbml6ZWQgZ2VuZXJhdG9ycyBzaG91bGQgb25seSBiZSBhIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTkxM10gLSBza2lwcGluZyB1bmtub3duIGZpZWxkcyBpbiBqYXZhIHVuaW9ucworICAgICogW1RIUklGVC0yNTUzXSAtIEMrKyBsaW5rZXIgZXJyb3IgLSB0cmFuc3BvcnQvVFNvY2tldAorICAgICogW1RIUklGVC0yNzRdIC0gVG93YXJkcyBhIHdvcmtpbmcgcmVsZWFzZS92ZXJzaW9uaW5nIHByb2Nlc3MKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0xOTcxXSAtIFtHcmFwaHZpel0gQWRkcyB0dXRvcmlhbC9nZW5lcmFsIGRlc2NyaXB0aW9uIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjAwMV0gLSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIEV4YW1wbGUgIkMrKyBTZXJ2ZXIiIHRhYiBpcyBicm9rZW4KKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTU3NF0gLSBBcGFjaGUgcHJvamVjdCBicmFuZGluZyByZXF1aXJlbWVudHM6IERPQVAgZmlsZSBbUEFUQ0hdCisgICAgKiBbVEhSSUZULTEzNDddIC0gVW5pZnkgdGhlIGV4Y2VwdGlvbnMgcmV0dXJuZWQgaW4gZ2VuZXJhdGVkIEdvIGNvZGUKKyAgICAqIFtUSFJJRlQtMTM1M10gLSBTd2l0Y2ggdG8gcGVyZm9ybWFuY2UgYnJhbmNoLCBnZXQgcmlkIG9mIEJpbmFyeVBhcnNlcgorICAgICogW1RIUklGVC0xNjI5XSAtIFJ1YnkgMS45IENvbXBhdGliaWxpdHkgZHVyaW5nIFRocmlmdCBjb25maWd1cmUsIG1ha2UsIGluc3RhbGwKKyAgICAqIFtUSFJJRlQtOTkxXSAtIFJlZmFjdG9yIEhhc2tlbGwgY29kZSBhbmQgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTk5MF0gLSBTYW5pZnkgZ2V0dGltZW9mZGF5IHVzYWdlIGNvZGViYXNlLXdpZGUKKyAgICAqIFtUSFJJRlQtNzkxXSAtIExldCBDKysgVFNpbXBsZVNlcnZlciBiZSBkcml2ZW4gYnkgYW4gZXh0ZXJuYWwgbWFpbiBsb29wCisgICAgKiBbVEhSSUZULTIxMTddIC0gQ29jb2EgVEJpbmFyeVByb3RvY29sIHN0cmljdFdyaXRlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTIwMTRdIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0CisgICAgKiBbVEhSSUZULTE5NzJdIC0gQWRkIHN1cHBvcnQgZm9yIGFzeW5jIHByb2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMTk3MF0gLSBbR3JhcGh2aXpdIEFkZHMgb3B0aW9uIHRvIHJlbmRlciBleGNlcHRpb25zIHJlbGF0aW9uc2hpcHMKKyAgICAqIFtUSFJJRlQtMTk2Nl0gLSBTdXBwb3J0IGRpZmZlcmVudCBmaWxlcyBmb3IgU1NMIGNlcnRpZmljYXRlcyBhbmQga2V5cworICAgICogW1RIUklGVC0xOTY1XSAtIEFkZHMgR3JhcGh2aXogKGdyYXBoIGRlc2NyaXB0aW9uIGxhbmd1YWdlKSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMTk1Nl0gLSBTd2l0Y2ggdG8gQXBhY2hlIENvbW1vbnMgTGFuZyAzCisgICAgKiBbVEhSSUZULTE5NjJdIC0gTXVsdGlwbGV4IHByb2Nlc3NvciBzaG91bGQgc2VuZCBhbnkgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGJhY2sgdG8gY2xpZW50CisgICAgKiBbVEhSSUZULTE5NjBdIC0gbWFpbigpIGRlY2xhcmVzIDIyIHVudXNlZCBnZW4gYm9vbHMKKyAgICAqIFtUSFJJRlQtMTk1MV0gLSBsaWJ0aHJpZnQuamFyIGhhcyBzb3VyY2UgZmlsZXMgaW4gaXQKKyAgICAqIFtUSFJJRlQtMTk5N10gLSBBZGQgYWNjZXB0IGJhY2tsb2cgY29uZmlndXJhdGlvbiBtZXRob2QgdG8gIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMjAwM10gLSBEZXByZWNhdGUgc2VudW0KKyAgICAqIFtUSFJJRlQtMjA1Ml0gLSBWYWdyYW50IG1hY2hpbmUgaW1hZ2UgZGVmYXVsdHMgdG8gb25seSAzODRNQiBvZiBSQU0KKyAgICAqIFtUSFJJRlQtMTk4MF0gLSBNb2Rlcm5pemUgR28gdG9vbGluZywgZml4IGdvIGNsaWVudCBsaWJhcnkuCisgICAgKiBbVEhSSUZULTE5NzddIC0gQyMgY29tcGlsZXIgc2hvdWxkIGdlbmVyYXRlIGNvbnN0YW50IGZpbGVzIHByZWZpeGVkIHdpdGggdGhyaWZ0IGZpbGUgbmFtZQorICAgICogW1RIUklGVC0xOTg1XSAtIGFkZCBhIFZhZ3JhbnRmaWxlIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQgZnVsbHkgcmVwcm9kdWNhYmxlCisgICAgKiBbVEhSSUZULTE5OTRdIC0gRGVwcmVjYXRlIHNsaXN0CisgICAgKiBbVEhSSUZULTE5OTNdIC0gRmFjdG9yeSB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20ga25vd24gKGdlbmVyYXRlZCkgaW50ZXJmYWNlIHR5cGVzIHdpdGggRGVscGhpCisgICAgKiBbVEhSSUZULTIwODFdIC0gU3BlY2lmaWVkIHRpbWVvdXQgc2hvdWxkIGJlIHVzZWQgaW4gVFNvY2tldC5PcGVuKCkKKyAgICAqIFtUSFJJRlQtMjA4NF0gLSBEZWxwaGk6IEFiaWxpdHkgdG8gY3JlYXRlIGVudGl0eSBUaHJpZnQtZ2VuZXJhdGVkIGluc3RhbmNlcyBiYXNlZCBvbiBUeXBlSW5mbworICAgICogW1RIUklGVC0yMDgzXSAtIEltcHJvdmUgdGhlIGdvIGxpYjogYnVmZmVyZWQgVHJhbnNwb3J0LCBzYXZlIG1lbW9yeSBhbGxvY2F0aW9uLCBoYW5kbGUgY29uY3VycmVudCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTIxMDldIC0gU2VjdXJlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQgaW4gR28KKyAgICAqIFtUSFJJRlQtMjEwN10gLSBtaW5vciBHbyBnZW5lcmF0b3IgZml4ZXMKKyAgICAqIFtUSFJJRlQtMTY5NV0gLSBhbGxvdyB3YXJuaW5nLWZyZWUgY29tcGlsYXRpb24gaW4gVlMgMjAxMiBhbmQgR05VIDQuNgorICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTcxNl0gLSBtYXggYWxsb3dlZCBjb25uZWN0aW9ucyBzaG91bGQgYmUgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTCisgICAgKiBbVEhSSUZULTE3MTVdIC0gQWxsb3cgZXhjbHVkaW5nIHB5dGhvbiBwYXJ0cyB3aGVuIGJ1aWxkaW5nIGNvbnRyaWIvZmIzMDMKKyAgICAqIFtUSFJJRlQtMTczM10gLSBGaXggUlBNIGJ1aWxkIGlzc3VlcyBvbiBSSEVMNi9PTDYgc3lzdGVtcworICAgICogW1RIUklGVC0xNzI4XSAtIFVwZ3JhZGF0aW9uIG9mIGh0dHBjb21wb25lbnRzCisgICAgKiBbVEhSSUZULTE4NzZdIC0gVXNlIGVudW0gbmFtZXMgaW5zdGVhZCBvZiBjYXN0ZWQgaW50ZWdlcnMgaW4gYXNzaWdubWVudHMKKyAgICAqIFtUSFJJRlQtMTg3NF0gLSB0aW1lb3V0IGZvciB0aGUgc2VydmVyLXNpZGUgZW5kIG9mIGEgbmFtZWQgcGlwZQorICAgICogW1RIUklGVC0xODk3XSAtIFN1cHBvcnQgdmFsaWRhdGlvbiBvZiByZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTg5Nl0gLSBBZGQgVEJhc2UgcHJvdG9jb2wgZm9yIENvY29hCisgICAgKiBbVEhSSUZULTE4ODBdIC0gTWFrZSBuYW1lZCBwaXBlcyBzZXJ2ZXIgd29yayBhc3luY2hyb25vdXNseSAob3ZlcmxhcHBlZCkgdG8gYWxsb3cgZm9yIGNsZWFuIHNlcnZlciBzdG9wcworICAgICogW1RIUklGVC0xODc4XSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycworICAgICogW1RIUklGVC0xODgyXSAtIFVzZSBzaW5nbGUgaW5jbHVkZQorICAgICogW1RIUklGVC0xNzkzXSAtIEMjOiBVc2Ugc3RhdGljIHJlYWQgaW5zdGVhZCBvZiBpbnN0YW5jZSByZWFkCisgICAgKiBbVEhSSUZULTE3OTldIC0gT3B0aW9uIHRvIGdlbmVyYXRlIEhUTUwgaW4gInN0YW5kYWxvbmUgbW9kZSIKKyAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0CisgICAgKiBbVEhSSUZULTE4OTBdIC0gQysrOiBNYWtlIG5hbWVkIHBpcGVzIHNlcnZlciB3b3JrIGFzeW5jaHJvbm91c2x5CisgICAgKiBbVEhSSUZULTQ3NF0gLSBHZW5lcmF0aW5nIFJ1Ynkgb24gUmFpbHMgZnJpZW5kbHkgY29kZQorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC04MDFdIC0gUHJvdmlkZSBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAoaXJiKSB3aGVuIGdlbmVyYXRpbmcgcnVieSBiaW5kaW5ncworICAgICogW1RIUklGVC0yMjkyXSAtIEFuZHJvaWQgTGlicmFyeSBQcm9qZWN0CisgICAgKiBbVEhSSUZULTIwMTJdIC0gTW9kZXJuaXppbmcgR28KKyAgICAqIFtUSFJJRlQtMTk2OV0gLSBDIzogVGVzdHMgbm90IHByb3Blcmx5IGxpbmtlZCBmcm9tIHRoZSBzb2x1dGlvbgorICAgICogW1RIUklGVC0xNzg1XSAtIEMjOiBBZGQgVE1lbW9yeUJ1ZmZlciBzZXJpYWxpemVyL2Rlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xNzgwXSAtIEFkZCBvcHRpb24gdG8gZ2VuZXJhdGUgbnVsbGFibGUgdmFsdWVzCisgICAgKiBbVEhSSUZULTE3ODZdIC0gQyMgVW5pb24gVHlwaW5nCisgICAgKiBbVEhSSUZULTU5MV0gLSBNYWtlIHRoZSBDKysgcnVudGltZSBsaWJyYXJ5IGJlIGNvbXBhdGlibGUgd2l0aCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTUxNF0gLSBBZGQgb3B0aW9uIHRvIGNvbmZpZ3VyZSBjb21waWxlciBvdXRwdXQgZGlyZWN0b3J5CisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTE3NjRdIC0gaG93IHRvIGdldCB0aGUgY29udGV4dCBvZiBjbGllbnQgd2hlbiBvbiBhIHJwYyBjYWxsIGluIHNlcnZlciBzaWRlPworICAgICogW1RIUklGVC0xNzkxXSAtIHRocmlmdCdzIG5hbWVzcGFjZSBkaXJlY3RpdmUgd2hlbiBnZW5lcmF0aW5nIGhhc2tlbGwgY29kZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNTk0XSAtIEphdmEgdGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIGl0IHN1Y2NlZWRzIG9yIG5vdC4KKyAgICAqIFtUSFJJRlQtMTU5NV0gLSBKYXZhIHRlc3Qgc2VydmVyIHNob3VsZCBmb2xsb3cgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYXMgb2YgVEhSSUZULTE1OTAKKyAgICAqIFtUSFJJRlQtOTg2XSAtIHN0OiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTk4NV0gLSBwaHA6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtOTg0XSAtIG9jYW1sOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE5MjRdIC0gRGVscGhpOiBJbmNvbnNpc3RlbmN5IGluIHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWwgZmllbGRzCisgICAgKiBbVEhSSUZULTE5MjJdIC0gQyM6IEluY29uc2lzdGVuY3kgaW4gc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTk2MV0gLSBDIyB0ZXN0cyBzaG91bGQgYmUgaW4gbGliL2NzaGFycC90ZXN0Ly4uLgorICAgICogW1RIUklGVC0xODIyXSAtIFBIUCB1bml0IHRlc3QgZG9lcyBub3Qgd29yaworICAgICogW1RIUklGVC0xOTAyXSAtIEMrKzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTkwMV0gLSBDIzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTg5OV0gLSBEZWxwaGk6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTU2M10gLSBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorCisKKworVGhyaWZ0IDAuOQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDM4XSAtIGxpYi9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmggc2hvdWxkIHJlYWQgdmVyc2lvbiBmcm9tIGNvbmZpZ3VyZS5hYyByYXRoZXIgdGhhbiBhICNkZWZpbmUKKyAgICAqIFtUSFJJRlQtMTQ0Nl0gLSBDb21waWxlIGVycm9yIHdpdGggRGVscGhpIDIwMDkgaW4gY29uc3RhbnQgaW5pdGlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTQ1MF0gLSBQcm9ibGVtcyBidWlsZGluZyB0aHJpZnQgMC44LjAgZm9yIFB5dGhvbiBhbmQgUnVieQorICAgICogW1RIUklGVC0xNDQ5XSAtIFJ1YnkgY2xpZW50IGRvZXMgbm90IHdvcmsgb24gc29sYXJpcyAoPykKKyAgICAqIFtUSFJJRlQtMTQ0N10gLSBOdWxscG9pbnRlckV4Y2VwdGlvbiBpbiBQcm9jZXNzRnVuY3Rpb24uY2xhc3MgOmluICJvbmV3YXkiIG1ldGhvZAorICAgICogW1RIUklGVC0xNDMzXSAtIFRTZXJ2ZXJTb2NrZXQgZml4IGZvciBNU1ZDCisgICAgKiBbVEhSSUZULTE0MjldIC0gVGhlIG5vbmJsb2NraW5nIHNlcnZlcnMgaXMgc3VwcG9zZWQgdG8gdXNlIFRyYW5zcG9ydEZhY3RvcnkgdG8gcmVhZCB0aGUgZGF0YQorICAgICogW1RIUklGVC0xNDI3XSAtIFBIUCBsaWJyYXJ5IHVzZXMgbm9uLW11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB3aXRoIG1ic3RyaW5nIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCisgICAgKiBbVEhSSUZULTE0MjFdIC0gRGViaWFuIFBhY2thZ2VzIGNhbiBub3QgYmUgYnVpbHQKKyAgICAqIFtUSFJJRlQtMTM5NF0gLSBUcmVhdG1lbnQgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gQysrIGFuZCBKYXZhCisgICAgKiBbVEhSSUZULTE1MTFdIC0gU2VydmVyIHdpdGggb25ld2F5IHN1cHBvcnQgKCBKQVZBICkKKyAgICAqIFtUSFJJRlQtMTQ5Nl0gLSBQSFAgY29tcGlsZXIgbm90IG5hbWVzcGFjaW5nIGVudW1zCisgICAgKiBbVEhSSUZULTE0OTVdIC0gUEhQIFRlc3RDbGllbnQgZmF0YWxzIG9uIG1pc3NpbmcgY2xhc3MKKyAgICAqIFtUSFJJRlQtMTUwOF0gLSBUU2VydmVyU29ja2V0IGRvZXMgbm90IGFsbG93IGZvciB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIHRvIGJpbmQgdG8KKyAgICAqIFtUSFJJRlQtMTUwNF0gLSBDb2NvYSBHZW5lcmF0b3Igc2hvdWxkIHVzZSBsb2NhbCBmaWxlIGltcG9ydHMgZm9yIGJhc2UgVGhyaWZ0IGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtMTUxMl0gLSBUaHJpZnQgc29ja2V0IHN1cHBvcnQgZm9yIFdpbmRvd3MgWFAKKyAgICAqIFtUSFJJRlQtMTUwMl0gLSBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpOiBEbyBub3QgcHJpbnQgb3V0IGVycm9yIG1lc3NhZ2UgaWYgc2VydmVyIHdhcyBzdG9wcGVkLgorICAgICogW1RIUklGVC0xNTAxXSAtIFBIUCBvbGQgbmFtZXNwYWNlcyBub3QgZ2VuZXJhdGVkIGZvciBlbnVtcworICAgICogW1RIUklGVC0xNDgzXSAtIGphdmEgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGUgdHlwZSBwYXJhbWV0ZXJzIGZvciBzZXJ2aWNlcyBpbiBleHRlbmRlZCBjbGF1c2VzCisgICAgKiBbVEhSSUZULTE0NzldIC0gQ29tcGlsZWQgUEhQIHByb2Nlc3MgZnVuY3Rpb25zIG1pc3Npbmcgd3JpdGVNZXNzYWdlRW5kKCkKKyAgICAqIFtUSFJJRlQtMTQ5Ml0gLSBlbmFibGluZyBjX2dsaWIgcmVuZGVyIHRocmlmdCB1bnVzYWJsZSAoZXZlbiBmb3IgQysrIGNvZGUpCisgICAgKiBbVEhSSUZULTE0OTFdIC0gVW5pbml0aWFsaXplIHByb2Nlc3NvckZhY3RvcnlfIG1lbWJlciBpbiBUU2VydmVyLmgKKyAgICAqIFtUSFJJRlQtMTQ3NV0gLSBJbmNvbXBsZXRlIHJlY29yZHMgZ2VuZXJhdGlvbiBmb3IgRXJsYW5nCisgICAgKiBbVEhSSUZULTE0ODZdIC0gSmF2YXNjcmlwdCBtYW51YWwgdGVzdHNlcnZlciBub3QgcmV0dXJuaW5nIGNvbnRlbnQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTQ4OF0gLSBzcmMvY29uY3VycmVuY3kvVGhyZWFkLmg6OTE6NTg6IGVycm9yOiBpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSAncHRocmVhZF90IHtha2EgX29wYXF1ZV9wdGhyZWFkX3QqfScgdG8gJ2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOjppZF90IHtha2EgbG9uZyBsb25nIHVuc2lnbmVkIGludH0nIFstZnBlcm1pc3NpdmVdCisgICAgKiBbVEhSSUZULTE0OTBdIC0gV2luZG93cy1zcGVjaWZpYyBoZWFkZXIgZmlsZXMgLSBmaXhlcyAmIHR3ZWFrcworICAgICogW1RIUklGVC0xNTI2XSAtIFVuaW9uIFR1cGxlU2NoZW1lRmFjdG9yeSByZXR1cm5zIFN0YW5kYXJkU2NoZW1lcworICAgICogW1RIUklGVC0xNTI3XSAtIEdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZVJlYWRTdHJ1Y3QgaW4gdW5pb25zIHJldHVybiBudWxsIHdoZW4gdGhlIHNldGZpZWxkIGlzIHVucmVjb2duaXplZAorICAgICogW1RIUklGVC0xNTI0XSAtIFROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBTdHVkaW8gMjAxMAorICAgICogW1RIUklGVC0xNTI5XSAtIFR1cGxlUHJvdG9jb2wgY2FuIHVuaW50ZW50aW9uYWxseSBpbmNsdWRlIGFuIGV4dHJhIGJ5dGUgaW4gYml0IHZlY3RvcnMgd2hlbiBudW1iZXIgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIGFuIGludGVncmFsIG9mIDgKKyAgICAqIFtUSFJJRlQtMTQ3M10gLSBKU09OIGNvbnRleHQgc3RhY2sgbWF5IGJlIGxlZnQgaW4gYW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTE0NTZdIC0gU3lzdGVtLk5ldC5IdHRwV2ViUmVxdWVzdCcgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdQcm94eScKKyAgICAqIFtUSFJJRlQtMTQ2OF0gLSBNZW1vcnkgbGVhayBpbiBUU2FzbFNlcnZlclRyYW5zcG9ydAorICAgICogW1RIUklGVC0xNDYxXSAtIFJlY2VudCBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2hhbmdlcyBicm9rZSAtLWVuYWJsZS1ib29zdHRocmVhZHM9eWVzLCBXaW5kb3dzCisgICAgKiBbVEhSSUZULTE0NjBdIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworICAgICogW1RIUklGVC0xNDY0XSAtIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXIgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2Vzc29yIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJpdmF0ZQorICAgICogW1RIUklGVC0xNDY3XSAtIFBvc3NpYmxlIEFWIHdpdGggZW1wdHkgc3RyaW5ncyB3aGVuIHVzaW5nIEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTUyM10gLSBjbGllbnRUaW1lb3V0IG5vdCB3b3JrZWQgYXMgZXhwZWN0ZWQgaW4gVFNlcnZlclNvY2tldCBjcmVhdGVkIGJ5IFRTU0xUcmFuc3BvcnRGYWN0b3J5CisgICAgKiBbVEhSSUZULTE1MzddIC0gVEZyYW1lZFRyYW5zcG9ydCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMTUxOV0gLSBUaGlyZnQgQnVpbGQgRmFpbHVyZSByZWZlcmVuY2luZyByYl9pbnRlcm4yIHN5bWJvbAorICAgICogW1RIUklGVC0xNTE4XSAtIEdlbmVyYXRlZCBDKysgY29kZSBvbmx5IHNlbmRzIHRoZSBmaXJzdCBvcHRpb25hbCBmaWVsZCBpbiB0aGUgd3JpdGUoKSBmdW5jdGlvbiBmb3IgYSBzdHJ1Y3QuCisgICAgKiBbVEhSSUZULTE1MTVdIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0xNTU0XSAtIEluaGVyaXRlZCBzZXJ2aWNlIG1ldGhvZHMgYXJlIG5vdCByZXNvbHZlZCBpbiBkZXJpdmVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTE1NTNdIC0gdGhyaWZ0IG5vZGVqcyBzZXJ2aWNlIHNpZGUgY2FuJ3QgcmVhZCBtYXAgc3RydWN0dXJlLCBrZXkgYXMgZW51bSwgdmFsdWUgYXMgT2JqZWN0CisgICAgKiBbVEhSSUZULTE1NzVdIC0gVHlwbyBpbiBzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAorICAgICogW1RIUklGVC0xMzI3XSAtIEZpeCBTcGVjIFN1aXRlIHVuZGVyIFJ1YnktMS44LjcgKHdvcmtzIGZvciBNUkkgUnVieS0xLjkuMikKKyAgICAqIFtUSFJJRlQtMTMyNl0gLSBvbiBzb21lIHBsYXRmb3JtcywgI2luY2x1ZGUgPHN0ZGludC5oPiBpcyBuZWNlc3NhcnkgdG8gYmUgaW5jbHVkZWQgaW4gVGhyaWZ0LmgKKyAgICAqIFtUSFJJRlQtMTE1OV0gLSBUSHR0cENsaWVudC0+Rmx1c2goKSBpc3N1ZSAoY29ubmVjdGlvbiB0aHJ1IHByb3h5KQorICAgICogW1RIUklGVC0xMjc3XSAtIE5vZGUuanMgc2VyaWFsaXplcyBmYWxzZSBib29sZWFucyBhcyBudWxsCisgICAgKiBbVEhSSUZULTEyMjRdIC0gQ2Fubm90IGluc2VydCBVVEYtOCB0ZXh0CisgICAgKiBbVEhSSUZULTEyNjddIC0gTm9kZS5qcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgorICAgICogW1RIUklGVC0xMzM4XSAtIERvIG5vdCB1c2UgYW4gdW5wYXRjaGVkIGF1dG9jb25mIDIuNjUgdG8gZ2VuZXJhdGUgcmVsZWFzZSB0YXJiYWxsCisgICAgKiBbVEhSSUZULTExMjhdIC0gTUFDIE9TIFg6IHRocmlmdC5oIGluY29tcGF0aWJpbGl0eSB3aXRoIFRocmlmdC5oCisgICAgKiBbVEhSSUZULTE2MzFdIC0gRml4IEMrKyBzZXJ2ZXIgY29uc3RydWN0b3IgdHlwb3MKKyAgICAqIFtUSFJJRlQtMTYwMl0gLSBQSFAgQyBFeHRlbnNpb24gaXMgbm90IENvbXBhdGlibGUgd2l0aCBQSFAgNS40CisgICAgKiBbVEhSSUZULTE2MTBdIC0gSVdlYlByb3h5IG5vdCBhdmFpbGFibGUgb24gV1A3IHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTE2MDZdIC0gUmFjZSBjb25kaXRpb24gaW4gQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAorICAgICogW1RIUklGVC0xNjA0XSAtIFB5dGhvbiBleGNlcHRpb24gaGFuZGVsaW5nIGZvciBjaGFuZ2VzIGZyb20gUEVQIDMxMTAKKyAgICAqIFtUSFJJRlQtMTYwN10gLSBJbmNvcnJlY3QgZmlsZSBtb2RlcyBmb3Igc2V2ZXJhbCBzb3VyY2UgZmlsZXMKKyAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5CisgICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCisgICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTU5N10gLSBUSlNPTlByb3RvY29sLnBocCBpcyBtaXNzaW5nIGZyb20gTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMTU5MV0gLSBFbmFibGUgVENQX05PREVMQVkgZm9yIHJ1YnkgZ2VtCisgICAgKiBbVEhSSUZULTE2MjRdIC0gSXNzZXQgR2VuZXJhdGVkIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMKKyAgICAqIFtUSFJJRlQtMTYyMl0gLSBJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCBvbiByZWFkCisgICAgKiBbVEhSSUZULTE2MjFdIC0gTWVtb3J5IGxlYWtzCisgICAgKiBbVEhSSUZULTE2MTJdIC0gQmFzZTY0IGVuY29kaW5nIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0xNjI3XSAtIGNvbXBpbGVyIGJ1aWx0IHVzaW5nIGNvbXBpbGVycy52Y3hwcm9qIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHNvbWUgdGVzdCAudGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTE1NzFdIC0gVXBkYXRlIFJ1YnkgSFRUUCB0cmFuc3BvcnQgZm9yIHJlY2VudCBSdWJ5IHZlcnNpb25zCisgICAgKiBbVEhSSUZULTEwMjNdIC0gVGhyaWZ0IGVuY29kaW5nICAoVVRGLTgpIGlzc3VlIHdpdGggUnVieSAxLjkuMgorICAgICogW1RIUklGVC0xMDkwXSAtIERvY3VtZW50IHRoZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSBjYWxsZWQgIkNvbnN0YW50cy5qYXZhIgorICAgICogW1RIUklGVC0xMDgyXSAtIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IHNvbWV0aW1lcyBjYWxscyBjbG9zZSgpIG9uIGFuIHVuZGVmaW5lZCB2YWx1ZQorICAgICogW1RIUklGVC05NTZdIC0gUHl0aG9uIG1vZHVsZSdzIHZlcnNpb24gbWV0YS1kYXRhIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTk3M10gLSBDb2NvYSBsaWJyYXJ5IHdvbid0IGNvbXBpbGUgdXNpbmcgY2xhbmcKKyAgICAqIFtUSFJJRlQtMTYzMl0gLSBydWJ5OiBkYXRhIGNvcnJ1cHRpb24gaW4gdGhyaWZ0X25hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTY2NV0gLSBUQmluYXJ5UHJvdG9jb2w6IGV4Y2VlZGVkIG1lc3NhZ2UgbGVuZ3RoIHJhaXNlcyBnZW5lcmljIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTY2NF0gLSBSZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIHZhcmlhYmxlIGluIGJ1aWxkIHNjcmlwdAorICAgICogW1RIUklGVC0xNjYzXSAtIEphdmEgVGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0xNjYyXSAtICJyZW1vdmVPYmplY3Q6IiBzaG91bGQgYmUgInJlbW92ZU9ic2VydmVyOiIgaW4gWy1UU29ja2V0U2VydmVyIGRlYWxsb2NdPworICAgICogW1RIUklGVC0xNjQzXSAtIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayBpbiBUQmluYXJ5UHJvdG9jb2wucmVhZFN0cmluZworICAgICogW1RIUklGVC0xNjc0XSAtIFVwZGF0ZSBUaHJpZnQgRCBsaWJyYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCAyLjA2MAorICAgICogW1RIUklGVC0xNjczXSAtIFJ1YnkgY29tcGlsZSBmbGFncyBmb3IgZXh0ZW5zaW9uIGZvciBtdWx0aSBhcmNoIGJ1aWxkcyAob3MgeCkKKyAgICAqIFtUSFJJRlQtMTY1NV0gLSBDb25maWd1cmUgc3RpbGwgdHJ5aW5nIHRvIHVzZSB0aHJpZnRfZ2VuZXJhdG9ycyBpbiBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMTY1NF0gLSBjX2dsaWIgdGhyaWZ0X3NvY2tldF9yZWFkKCkgcmV0dXJucyBjb3JydXB0ZWQgZGF0YQorICAgICogW1RIUklGVC0xNjUzXSAtIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGxlYWtzIENMT1NFX1dBSVQgc29ja2V0cworICAgICogW1RIUklGVC0xNjU4XSAtIEphdmEgdGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE2NTZdIC0gU2V0dGluZyBwcm9wZXIgaGVhZGVycyBpbiBUSHR0cFNlcnZlci5jcHAgc28gdGhhdCAiQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmciIG9uIGpzIGNsaWVudCBjYW4gd29yay4KKyAgICAqIFtUSFJJRlQtMTY1Ml0gLSBUU2FzbFRyYW5zcG9ydCBkb2VzIG5vdCBsb2cgdGhlIGVycm9yIHdoZW4ga2VyYmVyb3MgYXV0aCBmYWlscworICAgICogW1RIUklGVC0yMjcyXSAtIENMT05FIC0gRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIGluIFRCaW5hcnlQcm90b2NvbC5yZWFkU3RyaW5nCisgICAgKiBbVEhSSUZULTIwODZdIC0gSW52YWxpZCBnZW5lcmF0ZWQgY29kZSBmb3IgTm9kZS5KUyB3aGVuIHVzaW5nIG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMTY4Nl0gLSB0X3BocF9nZW5lcmF0b3IuY2MgdXNlcyAiYW5kIiBpbnN0ZWFkIG9mICImJiIsIGFuZCBjYXVzZXMgY29tcGlsZXIgZXJyb3JzIHdpdGggVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0xNjkzXSAtIGxpYnRocmlmdCBoYXMgZGVwZW5kZW5jeSBvbiB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIGh0dHBjb3JlCisgICAgKiBbVEhSSUZULTE2ODldIC0gZG9uJ3QgZXhpdCgtMSkgaW4gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTE2NzldIC0gTm9kZUpTOiBwcm90b2NvbCByZWFkU3RyaW5nKCkgc2hvdWxkIHRyZWF0IHN0cmluZyBhcyB1dGY4LCBub3QgYmluYXJ5CisgICAgKiBbVEhSSUZULTE3MjFdIC0gRGlzdCBicm9rZW4gZHVlIHRvIDAuOC4wIHRvIDAuOS4wIGNoYW5nZXMKKyAgICAqIFtUSFJJRlQtMTcxMF0gLSBNaW5vciBpc3N1ZXMgaW4gdGVzdCBjYXNlIGNvZGUKKyAgICAqIFtUSFJJRlQtMTcwOV0gLSBXYXJuaW5nICJCaXR3aXNlLW9yIG9wZXJhdG9yIHVzZWQgb24gYSBzaWduLWV4dGVuZGVkIG9wZXJhbmQ7IGNvbnNpZGVyIGNhc3RpbmcgdG8gYSBzbWFsbGVyIHVuc2lnbmVkIHR5cGUgZmlyc3QiIGluIFRCaW5hcnlQcm90b2NvbC5jcyBhdCBSZWFkSW50NjQoKQorICAgICogW1RIUklGVC0xNzA3XSAtIFtydWJ5XSBBZGp1c3Qgc2VydmVyX3NwZWMucmIgZm9yIFJTcGVjIDIuMTEueCBhbmQgUnVieSAxLjkuMworICAgICogW1RIUklGVC0xNjcxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXMgbm90IHB1dCBrZXl3b3JkcyBpbnRvIGdlbmVyYXRlZCBtZXRob2QgY2FsbHMKKyAgICAqIFtUSFJJRlQtMTY3MF0gLSBJbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhIFRocmlmdCBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtMTY2OV0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE2NjhdIC0gQ29tcGlsZSBlcnJvciBpbiBjb250cmliL2ZiMzAzLCB0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMTg0NV0gLSBGaXggY29tcGlsZXIgd2FybmluZyBjYXVzZWQgYnkgaW1wbGljaXQgc3RyaW5nIGNvbnZlcnNpb24gd2l0aCBYY29kZSA0LjYKKyAgICAqIFtUSFJJRlQtMzA0XSAtIEJ1aWxkaW5nIHRoZSBQeXRob24gbGlicmFyeSByZXF1aXJlcyBkZXZlbG9wbWVudCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTM2OV0gLSBzZXRzIGFuZCBtYXBzIGJyZWFrIGVxdWFsaXR5CisgICAgKiBbVEhSSUZULTU1Nl0gLSBSdWJ5IGNvbXBpbGVyIGRvZXMgbm90IGNvcnJlY3RseSByZWZlcnJlZCB0byB0b3AtbGV2ZWwgbW9kdWxlcyB3aGVuIGEgc3VibW9kdWxlIG1hc2tzIHRoZSB0b3AtbGV2ZWwgbmFtZQorICAgICogW1RIUklGVC00ODFdIC0gaW5kZW50YXRpb24gb2YgcnVieSBjbGFzc2VzIGlzIG9mZiBieSBhIGZldworCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNDk4XSAtIEFsbG93IFRUaHJlYWRlZFBvb2xTZXJ2ZXIuQXJncyB0byBwYXNzIGEgRXhlY3V0b3JTZXJ2aWNlCisgICAgKiBbVEhSSUZULTE0NDRdIC0gRnVuY3Rpb25SdW5uZXIgLSBhZGQgc3ludGFjdGljIHN1Z2FyIHRvIGNyZWF0ZSBzaGFyZWRfcHRycworICAgICogW1RIUklGVC0xNDQzXSAtIGRlZmluZSBhIFRQcm9jZXNzb3IgaGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwcm9jZXNzKCkKKyAgICAqIFtUSFJJRlQtMTQ0MV0gLSBHZW5lcmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgZm9yIGV4Y2VwdGlvbiBjbGFzcyB0byBsZXQgaXQgdXBkYXRlIG1lc3NhZ2UgcHJvcGVydHkgYXV0b21hdGljYWxseS4KKyAgICAqIFtUSFJJRlQtMTUyMF0gLSBFbWJlZCB2ZXJzaW9uIG51bWJlciBpbiBlcmxhbmcgLmFwcCBmaWxlCisgICAgKiBbVEhSSUZULTE0ODBdIC0gcHl0aG9uOiByZW1vdmUgdGFicywgYWRqdXN0IHdoaXRlc3BhY2UgYW5kIGFkZHJlc3MgUEVQOCB3YXJuaW5ncworICAgICogW1RIUklGVC0xNDg1XSAtIFBlcmZvcm1hbmNlOiBwYXNzIGxhcmdlIGFuZC9vciByZWZjb3VudGVkIGFyZ3VtZW50cyBhcyAiY29uc3QiCisgICAgKiBbVEhSSUZULTE0ODRdIC0gSW50cm9kdWNlIHBocHVuaXQgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC0xNTMyXSAtIFRoZSB0eXBlIHNwZWNpZmljYXRpb25zIGluIHRoZSBnZW5lcmF0ZWQgRXJsYW5nIGNvZGUgc2hvdWxkIGluY2x1ZGUgInVuZGVmaW5lZCIgd2hlcmUgaXQncyB1c2VkIGFzIGEgZGVmYXVsdCB2YWx1ZQorICAgICogW1RIUklGVC0xNTM0XSAtIFJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgRGVscGhpIGNvZGUgZ2VuZXJhdG9yLgorICAgICogW1RIUklGVC0xNDY5XSAtIEphdmEgaXNzZXQgc3BhY2Ugb3B0aW1pemF0aW9uCisgICAgKiBbVEhSSUZULTE0NjVdIC0gVmlzaWJpbGl0eSBvZiBtZXRob2RzIGluIGdlbmVyYXRlZCBqYXZhIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ1M10gLSBEb24ndCBjaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHdoZW4gc2VyaWFsaXppbmcgd2l0aCB0aHJpZnQgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0xNDUyXSAtIGdlbmVyYXRlIGEgc3dhcCgpIG1ldGhvZCBmb3IgYWxsIGdlbmVyYXRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTE0NTFdIC0gRnJhbWVkVHJhbnNwb3J0OiBQcmV2ZW50IGluZmluaXRlIGxvb3Agd2hlbiB3cml0aW5nCisgICAgKiBbVEhSSUZULTE1MjFdIC0gVHdvIHBhdGNoZXMgZm9yIG1vcmUgUGVyZm9ybWFuY2UKKyAgICAqIFtUSFJJRlQtMTU1NV0gLSBEZWxwaGkgdmVyc2lvbiBvZiB0aGUgdHV0b3JpYWwgY29kZQorICAgICogW1RIUklGVC0xNTM1XSAtIFdoeSB0aHJpZnQgZG9uJ3QgdXNlIHdyYXBwZWQgY2xhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcyA/CisgICAgKiBbVEhSSUZULTEyMDRdIC0gUnVieSBhdXRvZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCByZXF1aXJlICd0aHJpZnQnIGdlbQorICAgICogW1RIUklGVC0xMzQ0XSAtIFVzaW5nIHRoZSBodHRwYyBtb2R1bGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdGhlIGRlcHJlY2F0ZWQgaHR0cCBsYXllcgorICAgICogW1RIUklGVC0xMzQzXSAtIG5vX2F1dG9faW1wb3J0IG1pbi8yIHRvIGF2b2lkIGNvbXBpbGUgd2FybmluZworICAgICogW1RIUklGVC0xMzQwXSAtIEFkZCBzdXBwb3J0IG9mIEFSQyB0byBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0xNjExXSAtIEltcHJvdmVkIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMTU5M10gLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIgdG8gdGhlIGhhbmRsZXIgbW9kdWxlCisgICAgKiBbVEhSSUZULTE2MTVdIC0gUEhQIE5hbWVzcGFjZQorICAgICogW1RIUklGVC0xNTY3XSAtIFRocmlmdC9jcHA6IEFsbG93IGFsdGVybmF0ZSBjbGFzc2VzIHRvIGJlIHVzZWQgZm9yCisgICAgKiBbVEhSSUZULTEwNzJdIC0gTWlzc2luZyAtIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3IgaW4gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAorICAgICogW1RIUklGVC0xNjUwXSAtIFtydWJ5XSBVcGRhdGUgY2xlYW4gaXRlbXMgYW5kIHN2bjppZ25vcmUgZW50cmllcyBmb3IgT1MgWCBhcnRpZmFjdHMKKyAgICAqIFtUSFJJRlQtMTY2MV0gLSBbUEFUQ0hdIEFkZCAtLXdpdGgtcXQ0IGNvbmZpZ3VyZSBvcHRpb24KKyAgICAqIFtUSFJJRlQtMTY3NV0gLSBEbyB3ZSBoYXZlIGFueSBwbGFuIHRvIHN1cHBvcnQgc2NhbGE/CisgICAgKiBbVEhSSUZULTE2NDVdIC0gUmVwbGFjZSBPYmplY3QjdGVlIHdpdGggbW9yZSBjb252ZW50aW9uYWwgT2JqZWN0I3RhcCBpbiBzcGVjcworICAgICogW1RIUklGVC0xNjQ0XSAtIFVwZ3JhZGUgUlNwZWMgdG8gMi4xMC54IGFuZCByZWZhY3RvciBzcGVjcyBhcyBuZWVkZWQKKyAgICAqIFtUSFJJRlQtMTY3Ml0gLSBNb25vVG91Y2ggKGFuZCBNb25vIGZvciBBbmRyb2lkKSBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTE3MDJdIC0gYSB0aHJpZnQgbWFudWFsCisgICAgKiBbVEhSSUZULTE2OTRdIC0gUmUtRW5hYmxlIHNlcmlhbGl6YXRpb24gZm9yIFdQNyBTaWx2ZXJsaWdodAorICAgICogW1RIUklGVC0xNjkxXSAtIFNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIHN1cHBvcnQgZm9yIERlbHBoaQorICAgICogW1RIUklGVC0xNjg4XSAtIFVwZGF0ZSBJREwgcGFnZSBtYXJrdXAKKyAgICAqIFtUSFJJRlQtMTcyNV0gLSBUdXRvcmlhbCB3ZWIgcGFnZXMgZm9yIERlbHBoaSBhbmQgQyMKKyAgICAqIFtUSFJJRlQtMTcxNF0gLSBbcnVieV0gRXhwbGljaXRseSBhZGQgQ1dEIHRvIFJ1YnkgdGVzdF9zdWl0ZXMucmIKKyAgICAqIFtUSFJJRlQtMzE3XSAtIElzc3VlcyB3aXRoIEphdmEgc3RydWN0IHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtMTY0XSAtIEJ1aWxkIHdlYiB0dXRvcmlhbCBvbiBJbmN1YmF0b3Igd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtNTQxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3QgcHV0IGtleXdvcmRzIGJlZm9yZSBhbGwgYXJndW1lbnRzLgorICAgICogW1RIUklGVC02ODFdIC0gVGhlIEhUTUwgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSBKYXZhRG9jIHN0eWxlIGNvbW1lbnRzIHZlcnkgd2VsbAorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xNTAwXSAtIEQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3VwcG9ydAorICAgICogW1RIUklGVC0xNTEwXSAtIFRoZXJlIHNob3VsZCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnNvblByb3RvY29sIGZvciBydWJ5CisgICAgKiBbVEhSSUZULTExMTVdIC0gcHl0aG9uIFRCYXNlIGNsYXNzIGZvciBkeW5hbWljIChkZSlzZXJpYWxpemF0aW9uLCBhbmQgX19zbG90c19fIG9wdGlvbiBmb3IgbWVtb3J5IHNhdmluZ3MKKyAgICAqIFtUSFJJRlQtMTk1M10gLSBzdXBwb3J0IGZvciBhc3AubmV0IG12YyAzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTEyMzVdIC0gSG93IGNvdWxkIEkgdXNlIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSB3aXRoVE5vbkJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTEzNjhdIC0gVE5vbmJsb2NraW5nU2VydmVyIHVzYWdlCisgICAgKiBbVEhSSUZULTEwNjFdIC0gUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgb2YgMC4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8KKyAgICAqIFtUSFJJRlQtNDkxXSAtIFJpcHBpbmcgcmF3IHB0aHJlYWRzIG91dCBvZiBURmlsZVRyYW5zcG9ydCBhbmQgYXNzb2NpYXRlZCB0ZXN0IGlzc3VlcworCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNTk2XSAtIERlbHBoaTogVGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIHRoZXkgc3VjY2VlZGVkIG9yIG5vdAorICAgICogW1RIUklGVC05ODJdIC0gamF2YW1lOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE3MjJdIC0gQyMgV1A3IEFzc2VtYmx5IGFkZGl0aW9uIGJlYWtzIG1vbm8gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzM2XSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQyMKKworIyMgVGVzdAorICAgICogW1RIUklGVC0xNjEzXSAtIEFkZCBjb2RlIGJhY2sgaW50byBlbXB0eSBzb3VyY2UgZmlsZSBUb1N0cmluZ1Rlc3QuamF2YQorICAgICogW1RIUklGVC0xNzE4XSAtIEluY29ycmVjdCBjaGVjayBpbiBURmlsZVRyYW5zcG9ydFRlc3QKKworIyMgV2lzaAorICAgICogW1RIUklGVC0xNDYzXSAtIERlY291cGxlIFRocmlmdCBJREwgZnJvbSBnZW5lcmF0b3JzCisgICAgKiBbVEhSSUZULTE0NjZdIC0gUHJvcGVyIERvY3VtZW50YXRpb24gZm9yIFRocmlmdCBDIEdsaWIKKyAgICAqIFtUSFJJRlQtMTUzOV0gLSBCdWlsZCBhbmQgZGlzdHJpYnV0ZSB0aGUgZmIzMDMgcHl0aG9uIGxpYnJhcmllcyBhbG9uZyB3aXRoIHRocmlmdAorICAgICogW1RIUklGVC0xNjg1XSAtIFBsZWFzZSBhZGQgImFlcmVvLmNvbSIgdG8gIlBvd2VyZWQgYnkgQXBhY2hlIFRocmlmdCIgbGlzdCBpbiBhYm91dCBwYWdlCisgICAgKiBbVEhSSUZULTMzMF0gLSBUUHJvY2Vzc29yIC0gYWRkaXRpb25hbCBtZXRob2QgdG8gY2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBicm9rZW4KKworCisKK1RocmlmdCAwLjgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTQzNl0gLSBwaXAgaW5zdGFsbCB0aHJpZnQgZmFpbHMgb24gV2luZG93cyB3aXRoICJVbmFibGUgdG8gZmluZCB2Y3ZhcnNhbGwuYmF0IgorICAgICogW1RIUklGVC0xNDMyXSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZWlyIHN0cnVjdCBkZWZpbml0aW9uIHdpbGwgY2F1c2UgYW4gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTQyOF0gLSBzaGFyZWQudGhyZnQgZG9lcyBub3QgaW5jbHVkZSBuYW1lc3BhY2UgZm9yIHBocCwgc28gdGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlIGluY29ycmVjdCBuYW1lCisgICAgKiBbVEhSSUZULTE0MjZdIC0gRGlzdCBwYWNrYWdlIG1pc3NpbmcgZmlsZXMgZm9yIHJlbGVhc2UgMC44CisgICAgKiBbVEhSSUZULTE0MjVdIC0gVGhlIE5vZGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXRlc3Qgbm9kZSAoMC42KSAmIG5wbSAoMS4wLjI3KQorICAgICogW1RIUklGVC0xNDE2XSAtIFB5dGhvbiBVbml0IHRlc3QgaXMgYnJva2VuIG9uIGNpCisgICAgKiBbVEhSSUZULTE0MTldIC0gQWJzdHJhY3ROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjYXRjaCBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTE0MjRdIC0gUnVieSBzcGVjcyBmYWlsIHdoZW4gcnVuIHdpdGggcmFrZQorICAgICogW1RIUklGVC0xNDIwXSAtIE5vbmJsb2NraW5nIGFuZCBIc0hhIHNlcnZlciBzaG91bGQgbWFrZSBzdXJlIHRvIGNsb3NlIGFsbCB0aGVpciBzb2NrZXQgY29ubmVjdGlvbnMgd2hlbiB0aGUgc2VsZWN0b3IgZXhpdHMKKyAgICAqIFtUSFJJRlQtMTQxM10gLSBHZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCByZWFkIE1hcEVuZCAvIExpc3RFbmQgLyBTZXRFbmQKKyAgICAqIFtUSFJJRlQtMTQwOV0gLSBOYW1lIGNvbmZsaWN0IGNoZWNrIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIGV4Y2VwdGlvbiBvYmplY3QoRGVscGhpKS4KKyAgICAqIFtUSFJJRlQtMTQwOF0gLSBEZWxwaGkgVGVzdCBTZXJ2ZXI6IEV4Y2VwdGlvbiB0ZXN0IGNhc2UgZmFpbHMgZHVlIHRvIG5hbWluZyBjb25mbGljdCB3aXRoIGUubWVzc2FnZQorICAgICogW1RIUklGVC0xNDA3XSAtIFR5cG8gaW4gUHl0aG9uIHNvY2tldCBzZXJ2ZXIgY2F1c2VzIFRocmlmdCB0byBmYWlsIHdoZW4gd2UgZW5hYmxlIGEgZ2xvYmFsIHNvY2tldCB0aW1vdXQKKyAgICAqIFtUSFJJRlQtMTM5N10gLSBDSSBzZXJ2ZXIgZmFpbHMgZHVyaW5nIGJ1aWxkIGR1ZSB0byB1bnVzZWQgcGFyYW1ldGVycyBpbiBkZWxwaGkgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTE0MDRdIC0gRGVscGhpIGNvbXBpbGVyIGdlbmVyYXRlcyBzdHJ1Y3QgcmVhZGVyIGNvZGUgd2l0aCBwcm9ibGVtLgorICAgICogW1RIUklGVC0xNDAwXSAtIFJ1YnkgbmF0aXZlIGV4dGVuc2lvbiBhYm9ydHMgd2l0aCBfX3N0YWNrX2Noa19mYWlsIGluIE9TWAorICAgICogW1RIUklGVC0xMzk5XSAtIE9uZSBvZiB0aGUgVFNlcnZlckltcGwuQ3JlYXRlIENUT1JzIGxhY2tzIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTEzOTBdIC0gRGViaWFuIHBhY2thZ2VzIGJ1aWxkIGZpeCBmb3IgU3F1ZWV6ZSAoYnVpbGQgZnJvbSB0aGUgb2ZmaWNpYWwgIDAuNy4wIHRhcmJhbGwpCisgICAgKiBbVEhSSUZULTEzOTNdIC0gVFRyYW5zcG9ydEV4Y2VwdGlvbidzIHRocm93biBmcm9tIFRIdHRwQ2xpZW50IGNvbnRhaW4gc3VwZXJmbHVvdXMgc2xhc2hlcyBpbiB0aGUgRXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMTM5Ml0gLSBFbmFibGluZyBib3RoIG5hbWVzcGFjZXMgYW5kIGF1dG9sb2FkaW5nIGluIGdlbmVyYXRlZCBQSFAgY29kZSB3b24ndCB3b3JrLgorICAgICogW1RIUklGVC0xNDA2XSAtIEJ1aWxkIGVycm9yIGFmdGVyIGFwcGx5aW5nIFRIUklGVC0xMzk1CisgICAgKiBbVEhSSUZULTE0MDVdIC0gRGVscGhpIGNvbXBpbGVyIGRvZXMgbm90IGdlbmVyYXRlcyBjb250YWluZXIgc2VyaWFsaXplciBwcm9wZXJseS4KKyAgICAqIFtUSFJJRlQtMTQxMV0gLSBqYXZhIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIHR5cGUgcGFyYW1ldGVyIGZvciBUQmFzZVByb2Nlc3NvcgorICAgICogW1RIUklGVC0xNDczXSAtIEpTT04gY29udGV4dCBzdGFjayBtYXkgYmUgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTMzMV0gLSBSdWJ5IGxpYnJhcnkgZGVzZXJpYWxpemVzIGFuIGVtcHR5IG1hcCB0byBuaWwKKyAgICAqIFtUSFJJRlQtMTMzMF0gLSBQSFAgTmFtZXNwYWNlcyBubyBsb25nZXIgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTEzMjhdIC0gVEJhc2VIZWxwZXIudG9TdHJpbmcoLi4uKSBhcHBlbmRzIEJ5dGVCdWZmZXIgZGF0YSBvdXRzaWRlIG9mIHZhbGlkIGJ1ZmZlciByYW5nZQorICAgICogW1RIUklGVC0xMzIyXSAtIE9DYW1sIGxpYiBmYWlsIHRvIGNvbXBpbGU6IFRocmlmdC5tbCBsaW5lIDMwNSwgaW50IHZzIGludDMyIG1pc21hdGNoCisgICAgKiBbVEhSSUZULTExNDNdIC0gQnVpbGQgZG9lc24ndCBkZXRlY3QgY29ycmVjdCBhcmNoaXRlY3R1cmUgdHlwZSBvbiA2NGJpdCBvc3gKKyAgICAqIFtUSFJJRlQtMTIwNV0gLSBwb3J0IHNlcnZlciB1bmR1bHkgZnJhZ2lsZSB3aXRoIGFyYml0cmFyeSBpbnB1dAorICAgICogW1RIUklGVC0xMjc5XSAtIHR5cGUgc2V0IGlzIGhhbmRsZWQgaW5jb3JyZWN0bHkgd2hlbiB3cml0aW5nIG9iamVjdAorICAgICogW1RIUklGVC0xMjk4XSAtIFN0YW5kYXJkIHNjaGVtZSBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgYWxvbmcgd2l0aCBmaWVsZCB2YWx1ZXMKKyAgICAqIFtUSFJJRlQtMTI2NV0gLSBDKysgY29udGFpbmVyIGRlc2VyaWFsaXplCisgICAgKiBbVEhSSUZULTEyNjNdIC0gcHVibGlzaCBydWJ5IGNsaWVudCB0byBydWJ5Z2VtcworICAgICogW1RIUklGVC0xMzg0XSAtIEphdmEgaGVscCBtZW51IG1pc3NpbmcgbmV3bGluZSBuZWFyIGphdmFtZSBmbGFnCisgICAgKiBbVEhSSUZULTEzODJdIC0gQnVuZGxlIGluc3RhbGwgZG9lc25vdCB3b3JrIGJlY2F1c2UgdGhyaWZ0IGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMTM4MV0gLSBUaHJpZnQgQysrIGxpYnMgaGF2ZSBpbmNvcnJlY3RseSB2ZXJzaW9uZWQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMTM1MF0gLSBHbyBsaWJyYXJ5IGNvZGUgZG9lcyBub3QgYnVpbGQgYXMgb2YgcjYwIChtb3N0IHJlY2VudCByZWxlYXNlKQorICAgICogW1RIUklGVC0xMzY1XSAtIFR1cGxlUHJvdG9jb2wjd3JpdGVCaXRTZXQgdW5pbnRlbnRpb25hbGx5IHdyaXRlcyBhIHZhcmlhYmxlIGxlbmd0aCBieXRlIGFycmF5CisgICAgKiBbVEhSSUZULTEzNTldIC0gLS1nZW4tY29iIGNwcDpjb2Jfc3R5bGUgZG9lcyBub3QgY29tcGlsZSBhbnltb3JlCisgICAgKiBbVEhSSUZULTEzMTldIC0gTWlzbWF0Y2ggYmV0d2VlbiBob3cgYSB1bmlvbiByZWFkcyBhbmQgd3JpdGVzIGEgY29udGFpbmVyCisgICAgKiBbVEhSSUZULTEzMDldIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0xMjM4XSAtIFRocmlmdCBKUyBjbGllbnQgY2Fubm90IHJlYWQgbWFwIG9mIHN0cnVjdHVyZXMKKyAgICAqIFtUSFJJRlQtMTI1NF0gLSBDb2RlIGNhbid0IGJlIGNvbXBpbGVkIGFnYWluc3QgYSByZWd1bGFyIEpSRTogT2JqZWN0LmNsb25lKCkgb3ZlcnJpZGUgaGFzIGEgZGlmZmVyZW50IHJldHVybiB0eXBlCisgICAgKiBbVEhSSUZULTEzNjddIC0gTWFjIE9TWCBidWlsZCBmYWlscyB3aXRoICJubyBzdWNoIGZpbGUgdG8gbG9hZCAtLSBzcGVjL3Jha2Uvc3BlY3Rhc2siCisgICAgKiBbVEhSSUZULTEzNTVdIC0gUnVubmluZyBtYWtlIGluIGxpYi9yYiBkb2Vzbid0IGJ1aWxkIHRoZSBuYXRpdmUgZXh0ZW5zaW9ucworICAgICogW1RIUklGVC0xMzcwXSAtIERlYmlhbiBwYWNrYWdpbmcgc2hvdWxkIEJ1aWxkLURlcGVuZCBvbiBsaWJnbGliMi4wLWRldgorICAgICogW1RIUklGVC0xMzQyXSAtIENvbXBpbGF0aW9uIHByb2JsZW0gb24gV2luZG93cyBvZiBmYXN0YmluYXJ5LmMKKyAgICAqIFtUSFJJRlQtMTM0MV0gLSBUUHJvdG9jb2wuaCBlbmRpYW4gZGV0ZWN0aW9uIHdyb25nIHdpdGggYm9vc3QKKyAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5CisgICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCisgICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTAyN10gLSAnbWFrZSAtaiAxNicgZmFpbHMgd2l0aCAidW50ZXJtaW5hdGVkICNpZmRlZiIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTEyMV0gLSBKYXZhIHNlcnZlciBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGluIDAuNgorICAgICogW1RIUklGVC04NTddIC0gdGVzdHMgcnVuIGJ5ICJtYWtlIGluc3RhbGwiIGZhaWwgaWYgZ2VuZXJhdG9ycyBhcmUgZGlzYWJsZWQKKyAgICAqIFtUSFJJRlQtMzgwXSAtIFVzZSBzZXR1cHRvb2xzIGZvciBweXRob24gYnVpbGQKKworIyMgRGVwZW5kZW5jeSB1cGdyYWRlCisgICAgKiBbVEhSSUZULTEyNTddIC0gdGhyaWZ0J3MgZGVwZW5kZW5jeSBzY29wZSBvbiBqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpIHNob3VsZCBiZSAncHJvdmlkZWQnCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE0NDVdIC0gbWlub3IgQysrIGdlbmVyYXRvciB2YXJpYWJsZSBjbGVhbnVwCisgICAgKiBbVEhSSUZULTE0MzVdIC0gbWFrZSBURXhjZXB0aW9uLk1lc3NhZ2UgcHJvcGVydHkgY29uZm9ybWFudCB0byB0aGUgdXN1YWwgZXhwZWN0YXRpb25zCisgICAgKiBbVEhSSUZULTE0MzFdIC0gUmVuYW1lICdzeXMnIG1vZHVsZSB0byAndXRpbCcKKyAgICAqIFtUSFJJRlQtMTM5Nl0gLSBEZXBoaSBnZW5lcmF0b3IgaGFzIGRlcGVuZGFjeSBvbiBib29zdCAxLjQyIGxhdGVyLgorICAgICogW1RIUklGVC0xMzk1XSAtIFBhdGNoIHRvIHByZXZlbnQgd2FybmluZ3MgZm9yIGludGVnZXIgdHlwZXMgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC0xMjc1XSAtICB0aHJpZnQ6IGFsd2F5cyBwcmVmaXggbmFtZXNwYWNlcyB3aXRoICIgOjoiCisgICAgKiBbVEhSSUZULTEyNzRdIC0gIHRocmlmdDogZmFpbCBjb21waWxhdGlvbiBpZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzCisgICAgKiBbVEhSSUZULTEyNzFdIC0gIHRocmlmdDogZml4IG1pc3NpbmcgbmFtZXNwYWNlIGluIGdlbmVyYXRlZCBsb2NhbAorICAgICogW1RIUklGVC0xMjcwXSAtICB0aHJpZnQ6IGFkZCAtLWFsbG93LW5lZy1rZXlzIGFyZ3VtZW50IHRvIGFsbG93CisgICAgKiBbVEhSSUZULTEzNDVdIC0gQWxsb3cgYnVpbGRpbmcgd2l0aG91dCB0ZXN0cworICAgICogW1RIUklGVC0xMjg2XSAtIE1vZGVybml6ZSB0aGUgVGhyaWZ0IFJ1YnkgTGlicmFyeSBEZXYgRW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMTI4NF0gLSAgdGhyaWZ0OiBmaXggcHJvY2Vzc29yIGluaGVyaXRhbmNlCisgICAgKiBbVEhSSUZULTEyODNdIC0gIHRocmlmdDogd3JhcCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oKSB0byA4MAorICAgICogW1RIUklGVC0xMjgyXSAtIFVwZ3JhZGUgaHR0cGNsaWVudCB0byA0LjEuMiAoZnJvbSA0LjAuMSkKKyAgICAqIFtUSFJJRlQtMTI4MV0gLSAgYWRkIEBnZW5lcmF0ZWQgdG8gdGhlIGRvY2Jsb2NrCisgICAgKiBbVEhSSUZULTEyODBdIC0gIFRocmlmdDogSW1wcm92ZSBNb25pdG9yIGV4Y2VwdGlvbi1mcmVlIGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMTI3OF0gLSBqYXZhZG9jIHdhcm5pbmdzIC0gY29tcGlsYXRpb24KKyAgICAqIFtUSFJJRlQtMTIyN10gLSBFcmxhbmcgaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTI5NV0gLSBEdXBsaWNhdGUgaW5jbHVkZSBpbiBUU29ja2V0LmNwcAorICAgICogW1RIUklGVC0xMjk0XSAtICB0aHJpZnQ6IGZpeCBsb2cgbWVzc2FnZSB0eXBvcyBpbiBUU2ltcGxlU2VydmVyCisgICAgKiBbVEhSSUZULTEyOTNdIC0gIHRocmlmdDogaW1wcm92ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zIHRocm93biBieQorICAgICogW1RIUklGVC0xMjkyXSAtICB0aHJpZnQ6IHNpbGVuY2UgbG9nIHNwZXcgZnJvbSBUVGhyZWFkZWRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTI4OF0gLSAgQWxsb3cgdHlwZWRlZmVkIGV4Y2VwdGlvbnMgaW4gdGhyb3dzIGNsYXVzZXMKKyAgICAqIFtUSFJJRlQtMTI5MF0gLSAgdGhyaWZ0OiBUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsZWFuIHVwIHN0YXRlIGluIHRoZQorICAgICogW1RIUklGVC0xMjg3XSAtICB0aHJpZnQ6IHN0YXJ0IHJlZmFjdG9yaW5nIHNvbWUgb2YgdGhlIEMrKyBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMTI4OV0gLSAgdGhyaWZ0OiBpbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkKKyAgICAqIFtUSFJJRlQtMTMwNV0gLSAgdGhyaWZ0OiBtYWtlIFRDb25uZWN0aW9uIGEgcHJpdmF0ZSBpbm5lciBjbGFzcyBvZgorICAgICogW1RIUklGVC0xMzA0XSAtICBUTm9uYmxvY2tpbmdTZXJ2ZXI6IHBhc3MgaW4gdGhlIGNvbm5lY3Rpb24gY29udGV4dCB0bworICAgICogW1RIUklGVC0xMzAyXSAtICB0aHJpZnQ6IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBzZW5kKCkgdGltZXMgb3V0IGluCisgICAgKiBbVEhSSUZULTEzMDFdIC0gIHRocmlmdDogY29uc29saWRhdGUgY29tbW9uIGNvZGUgaW4gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTEzNzddIC0gYWJvcnQgUEhQIGRlc2VyaWFsaXphdGlvbiBvbiB1bmtub3duIGZpZWxkIHR5cGUKKyAgICAqIFtUSFJJRlQtMTM3OV0gLSBmaXggdW5pbml0aWFsaXplZCBlbnVtIHZhbHVlcyBpbiB0aHJpZnQgQysrIG9iamVjdHMKKyAgICAqIFtUSFJJRlQtMTM3Nl0gLSBNYWtlIHBvcnQgc3BlY2lmaWNhdGlvbiBvcHRpb24gaW4gdGhyaWZ0IHJlbW90ZQorICAgICogW1RIUklGVC0xMzc1XSAtIGZpeGVkIGEgaGV4IGNoYXIgY29udmVyc2lvbiBidWcgaW4gVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0xMzczXSAtIEZpeCB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGdlbmVyYXRpb24gaW4gdGhyaWZ0IChweXRob24pCisgICAgKiBbVEhSSUZULTEzNjFdIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgb2YgcHRocmVhZCBieSBib29zdDo6dGhyZWFkCisgICAgKiBbVEhSSUZULTEzMjBdIC0gQ29uc2lzdGVuY3kgb2YgY29uZmlndXJlIGdlbmVyYXRlZCBjb25maWcuaAorICAgICogW1RIUklGVC0xMzE3XSAtICBSZW1vdmUgY29weSBjb25zdHJ1Y3RpYmlsaXR5IGZyb20KKyAgICAqIFtUSFJJRlQtMTMxNl0gLSAgdGhyaWZ0OiB1cGRhdGUgc2VydmVyIGNsYXNzZXMgdG8gYWNjZXB0CisgICAgKiBbVEhSSUZULTEzMTVdIC0gIHRocmlmdDogZ2VuZXJhdGUgc2VydmVyIGludGVyZmFjZSBmYWN0b3J5IGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMTMxNF0gLSAgdGhyaWZ0OiBhZGQgVFByb2Nlc3NvckZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTMzNV0gLSAgQWRkIGFjY2VwdCB0aW1lb3V0IHRvIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMTMzNF0gLSAgQWRkIG1vcmUgaW5mbyB0byBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTMzM10gLSAgTWFrZSBSV0d1YXJkIG5vdCBjb3B5YWJsZQorICAgICogW1RIUklGVC0xMzMyXSAtIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIGNsYXNzIHVzZXMgaGFyZCBjb2RlZCB2YWx1ZSBrZXlNYW5hZ2VyVHlwZTogU3VuWDUwOQorICAgICogW1RIUklGVC0xMjUxXSAtIEdlbmVyYXRlZCBqYXZhIGNvZGUgc2hvdWxkIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbAorICAgICogW1RIUklGVC0xMzg3XSAtIEJ1aWxkIE1TVkMgbGlicmFyaWVzIHdpdGggQm9vc3QgVGhyZWFkcyBpbnN0ZWFkIG9mIFB0aHJlYWRzCisgICAgKiBbVEhSSUZULTEzMzldIC0gRXh0ZW5kIFR1cGxlIFByb3RvY29sIHRvIFRVbmlvbnMKKyAgICAqIFtUSFJJRlQtMTAzMV0gLSBQYXRjaCB0byBjb21waWxlIFRocmlmdCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAKKyAgICAqIFtUSFJJRlQtMTEzMF0gLSBBZGQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBzeW1ib2xpYyBkZWZhdWx0IHZhbHVlIGZvciBvcHRpb25hbCBib29sZWFuCisgICAgKiBbVEhSSUZULTExMjNdIC0gUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgc2VydmVyIGFuZCBjbGllbnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCisgICAgKiBbVEhSSUZULTM4Nl0gLSBNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBQeXRob24gbGlicmFyeSB3aXRob3V0IHRoZSBleHRlbnNpb24KKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTQwMV0gLSBKU09OLXByb3RvY29sIGZvciBEZWxwaGkgWEUgTGlicmFyaWVzCisgICAgKiBbVEhSSUZULTExNjddIC0gSmF2YSBub25ibG9ja2luZyBzZXJ2ZXIgd2l0aCBtb3JlIHRoYW4gb25lIHRocmVhZCBmb3Igc2VsZWN0IGFuZCBoYW5kbGluZyBJTworICAgICogW1RIUklGVC0xMzY2XSAtIERlbHBoaSBnZW5lcmF0b3IsIGxpcmJyYXJ5IGFuZCB1bml0IHRlc3QuCisgICAgKiBbVEhSSUZULTEzNTRdIC0gQWRkIHJha2UgdGFzayB0byBidWlsZCBqdXN0IHRoZSBnZW0gZmlsZQorICAgICogW1RIUklGVC03NjldIC0gUGx1Z2dhYmxlIFNlcmlhbGl6ZXJzCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE0MTVdIC0gZGVscGhpOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTEzOTFdIC0gSW1wcm92ZWQgRGVscGhpIFhFIHRlc3QgY2FzZXMKKworCisKK1RocmlmdCAwLjcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTE0MF0gLSBGcmFtZWQgVHJhbnNwb3J0IENsaWVudCB1c2luZyBDIChHbGliKSBMaWJyYXJ5IGhhbmdzIHdoZW4gY29ubmVjdGluZyB0byBSdWJ5IFNlcnZlcgorICAgICogW1RIUklGVC0xMTU0XSAtIEh0dHBDbGllbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBjbG9zZSBwYXJhbWV0ZXIKKyAgICAqIFtUSFJJRlQtMTE1M10gLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCisgICAgKiBbVEhSSUZULTExNDldIC0gTm9uYmxvY2tpbmcgc2VydmVyIGZhaWxzIHdoZW4gY2xpZW50IGNvbm5lY3Rpb24gaXMgcmVzZXQKKyAgICAqIFtUSFJJRlQtMTE0Nl0gLSBBbmRyb2lkIEluY29tcGF0aWJpbGl0eSA6IGluIEFuZHJvaWQgPCAyLjMgamF2YS5pby5JT0V4Y2VwdGlvbiBkb2Vzbid0IHN1cHBvcnQgZm9yIFRocm93YWJsZSBwYXJhbWV0ZXIgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMTEzM10gLSBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudAorICAgICogW1RIUklGVC0xMTMyXSAtIERlc2VyaWFsaXphdGlvbiBlcnJvciBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24gQyMKKyAgICAqIFtUSFJJRlQtMTEzMV0gLSBDIyBKU09OIFByb3RvY29sIGlzIHVuYWJsZSB0byBkZWNvZGUgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZworICAgICogW1RIUklGVC0xMjA4XSAtIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sLnB5IHdyaXRlQm9vbCBhbmQgcmVhZEJvb2wgbm90IGZvbGxvdyB0aGUgY29tcGFjdC1wcm90by1zcGVjLTIudHh0IHNwZWMgZm9yIENPTlRBSU5FUl9XUklURSwgQ09OVEFJTkVSX1JFQUQKKyAgICAqIFtUSFJJRlQtMTIwMF0gLSBKUyBjb21waWxlciBnZW5lcmF0ZXMgY29kZSB0aGF0IGNsb2JiZXJzIGV4aXN0aW5nIG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMTE4M10gLSBQdXJlLXJ1YnkgQ29tcGFjdFByb3RvY29sIHJhaXNlcyBBcmd1bWVudEVycm9yIHdoZW4gZGVzZXJpYWxpemluZyB1bmRlciBSdWJ5IDEuOQorICAgICogW1RIUklGVC0xMTgyXSAtIE5hdGl2ZSBkZXNlcmlhbGl6ZXIgc2VnZmF1bHRzIG9uIGluY29ycmVjdCBsaXN0IGVsZW1lbnQgdHlwZQorICAgICogW1RIUklGVC0xMTgxXSAtIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMTIzNF0gLSB0aHJpZnQgLS1oZWxwIGlzIG1pc3NpbmcgZG9jIG9uIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTExODBdIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IHR5cGVzLgorICAgICogW1RIUklGVC0xMTk0XSAtIEphdmEgbGliIGRvZXMgbm90IGluc3RhbGwgYXJ0aWZhY3RzIHRvIGxvY2FsIGRpciBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTE5M10gLSBQb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBpbiBub25ibG9ja2luZ19zZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTE5Ml0gLSBUeXBvOiBUUHJvdG9jb2wuaCB0ZXN0cyBmb3IgSEFWRV9TWVNfUEFSQU1fSF8KKyAgICAqIFtUSFJJRlQtMTE5MF0gLSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgaW4gVE5vbmJsb2NraW5nU2VydmVyLmphdmEgc2hvdWxkIGJlIEF0b21pY0xvbmcgdG8gZml4IEZEIGxlYWthZ2UgYW5kIGdlbmVyYWwgc2VydmVyIG1hbGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTExODddIC0gbm9uYmxvY2tpbmdfc2VydmVyIHNodXRkb3duIHJhY2UgdW5kZXIgUnVieSAxLjkKKyAgICAqIFtUSFJJRlQtMTE3OF0gLSBKYXZhOiBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFQgZXh0ZW5kcyBUQmFzZTw/LD8+CisgICAgKiBbVEhSSUZULTExNjRdIC0gU2VnbWVudGF0aW9uIGZhdWx0IG9uIE5VTEwgcG9pbnRlciBpbiB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QKKyAgICAqIFtUSFJJRlQtMTE3MV0gLSBQZXJsIHdyaXRlL3JlYWREb3VibGUgYXNzdW1lcyBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTEyMjJdIC0gVW5oYW5kbGVkIGV4Y2VwdGlvbiBmb3IgVEV2aHR0cFNlcnZlciByZXF1ZXN0CisgICAgKiBbVEhSSUZULTEyMjBdIC0gVFByb2Nlc3Nvcjo6cHJvY2VzcyBuZXZlciByZXR1cm5zIGZhbHNlCisgICAgKiBbVEhSSUZULTEyODVdIC0gU3RhYmxlIDAuNy4wIFdpbmRvd3MgY29tcGlsZXIgZXhlIGF2YWlsYWJsZSBvbiB0aGUgd2Vic2lkZSBpcyBub3QgdGhlIGdvb2Qgb25lCisgICAgKiBbVEhSSUZULTEyMThdIC0gY19nbGliIHVzZXMgd3JvbmcgbmFtZSBpbiBwa2ctY29uZmlnCisgICAgKiBbVEhSSUZULTEyMTVdIC0gVW5kZWZpbmVkIHByb3BlcnR5IFRoaXJmdCBpbiBsaWIvanMvdGhyaWZ0LmpzCisgICAgKiBbVEhSSUZULTEyMTFdIC0gV2hlbiB1c2luZyBUSHR0cENsaWVudCwgbm9uIDIwMCByZXNwb25zZXMgbGVhdmUgdGhlIGNvbm5lY3Rpb24gb3BlbgorICAgICogW1RIUklGVC0xMjI4XSAtIFRoZSBwaHAgYWNjZWxlcmF0b3IgbW9kdWxlIGNhbGxzIGZsdXNoIGluY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTEzMDhdIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0xMjU1XSAtIE1pc21hdGNoIG9mIG1ldGhvZCBuYW1lIGJldHdlZW4gSmF2YU1FJ3MgbGliIGFuZCBnZW5lcmF0ZWQgY29kZSAoY29tcGFyZVRvL2NvbXBhcmVPYmplY3RzKQorICAgICogW1RIUklGVC0xMjUzXSAtIENvZGUgZ2VuZXJhdGVkIGZvciBtYXBzIGlzIG5vdCBjb21waWxpbmcKKyAgICAqIFtUSFJJRlQtMTI1Ml0gLSBTZWdmYXVsdCBpbiBSdWJ5IGRlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xMDk0XSAtIGJ1ZyBpbiBUQ29tcGFjdFByb3RvIHB5dGhvbiByZWFkTWVzc2FnZUVuZCBtZXRob2QgYW5kIHVwZGF0ZWQgdGVzdCBjYXNlcworICAgICogW1RIUklGVC0xMDkzXSAtIHNldmVyYWwgYnVncyBpbiBweXRob24gVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0xMDkyXSAtIGdlbmVyYXRlZCB2YWxpZGF0ZSgpIG1ldGhvZCBoYXMgd3JvbmcgaW5kZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTAxMV0gLSBFcnJvciBnZW5lcmF0aW5nIHBhY2thZ2UgaW1wb3J0cyB3aGVuIHVzaW5nIGNsYXNzZXMgZnJvbSBvdGhlciBwYWNrYWdlcworICAgICogW1RIUklGVC0xMDUwXSAtIERlY2xhcmluZyBhbiBhcmd1bWVudCBuYW1lZCAibWFuYWdlciIgdG8gYSBzZXJ2aWNlIG1ldGhvZCBwcm9kdWNlcyBjb2RlIHRoYXQgZmFpbHMgY29tcGlsZSBkdWUgdG8gbmFtZSBjb25mbGljdHMgd2l0aCBwcm90ZWN0ZWQgaXZhcnMgaW4gVEFzeW5jQ2xpZW50CisgICAgKiBbVEhSSUZULTEwNzRdIC0gLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24KKyAgICAqIFtUSFJJRlQtMTA2N10gLSBUb25zIG9mIGJ1Z3MgaW4gcGhwIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTEwNjVdIC0gVW5leHBlY3RlZCBleGNlcHRpb25zIG5vdCBwcm9wZXIgaGFuZGxlZCBvbiBKUworICAgICogW1RIUklGVC0xMDc2XSAtIEVybGFuZyBUaHJpZnQgc29ja2V0IHNlcnZlciBoYXMgYSBidWcgdGhhdCBjYXVzZXMgamF2YSB0aHJpZnQgY2xpZW50IG9mIGZyYW1lZCBiaW5hcnkgY2xpZW50IHRvIHRocm93ICJvdXQgb2Ygc2VxdWVuY2UiIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xMDU3XSAtIGNhc3RzIGluIFRCaW5hcnlQcm90b2NvbC50Y2MgY2F1c2luZyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIiB3YXJuaW5ncyBmcm9tIGdjYworICAgICogW1RIUklGVC0xMDU1XSAtIGNzaGFycCBUU2VydmVyU29ja2V0IGFuZCBUU29ja2V0IGRvIG5vdCBkaXNhYmxlIE5hZ2xlIHZpYSBTb2NrZXQuTm9EZWxheSA9IHRydWUgbGlrZSBjcHAgYW5kIGphdmEgZG8KKyAgICAqIFtUSFJJRlQtMTA1NF0gLSBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaXMgbWlzc2luZyBhbmQgZmlyc3QgdXNlIG9mIFBLR19DSEVDS19NT0RVTEVTIG1heSBub3QgaGFwcGVuLCBjYXVzZXMgbW9ubyBkZXRlY3Rpb24gdG8gZmFpbAorICAgICogW1RIUklGVC0xMTE3XSAtIEphdmFTY3JpcHQgVW5pdCBUZXN0IGRvZXMgbm90IHdvcmsgYW55bW9yZSBiZWNhdXNlIGxpYnRocmlmdCouamFyIHdoZXJlIG1vdmVkIGJ5IE1hdmVuIERlcGxveW1lbnQKKyAgICAqIFtUSFJJRlQtMTExMV0gLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeSB0eXBlcworICAgICogW1RIUklGVC0xMDMyXSAtICJtYWtlIGRpc3QiIGZhaWxzIGR1ZSB0byBjX2dsaWIgcHJvYmxlbQorICAgICogW1RIUklGVC0xMDM2XSAtIEF1dG8tZ2VuZXJhdGVkIEMrKyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgd2l0aCAiLVdlcnJvciAtV2V4dHJhIC1XYWxsIiBnKysgY29tcGlsZXIgZmxhZ3MKKyAgICAqIFtUSFJJRlQtMTA0MV0gLSBURGVzZXJpYWxpemVyIGhvbGRzIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGFycmF5IGl0IHJlYWRzIGFmdGVyIGl0IGlzIGRvbmUgZGVzZXJpYWxpemluZworICAgICogW1RIUklGVC0xMTA2XSAtIEMrKyBjb2RlIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggJiBUQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBkb250IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMgYnV0IG5vIHZpcnR1YWwgZGVzdHJ1Y3Rvci4gQ2F1c2VzIHdhcm5pbmdzIG9uIC1XYWxsCisgICAgKiBbVEhSSUZULTExMDVdIC0gT0NhbWwgZ2VuZXJhdG9yIGRvZXMgbm90IHByZWZpeCBtZXRob2RzIG9mIGluY2x1ZGVkIHN0cnVjdHMgd2l0aCB0aGVpciB0eXBlCisgICAgKiBbVEhSSUZULTExMDRdIC0gSU5TVEFMTERJUlMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGNvbmZpZ3VyZSBzY3JpcHQKKyAgICAqIFtUSFJJRlQtMTEwMl0gLSB0eXBvIGluIGNvbmZpZ3VyZS5hYzogIj09IiBvcGVyYXRvciBpbiAndGVzdCcgKGluc3RlYWQgb2YiJz0iKQorICAgICogW1RIUklGVC0xMTAxXSAtIGJ5dGVidWZmZXIgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIFRCaW5hcnlQcm90b2NvbCB3cml0ZUJpbmFyeQorICAgICogW1RIUklGVC0xMDk4XSAtIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGluIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTA4MV0gLSBQSFAgdGVzdHMgYnJva2VuIGFuZCBzb21ld2hhdCBpbmNvbXBsZXRlCisgICAgKiBbVEhSSUZULTEwODBdIC0gZXJsYW5nIHRlc3QncyAnbWFrZScgZmFpbHMgb24gTWFjIE9TWAorICAgICogW1RIUklGVC0xMDc4XSAtIFRocmlmdFRlc3QudGhyaWZ0IGdlbmVyYXRlcyBpbnZhbGlkIFBIUCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTExMjBdIC0gcHJvdG8uV3JpdGVMaXN0RW5kIGJlaW5nIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAqIFtUSFJJRlQtMTExOV0gLSBUSlNPTlByb3RvY29sIGZhaWxzIHRvIFVURjggZGVjb2RlIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtODY3XSAtIFBIUCBhY2NlbGVyYXRvciBtb2R1bGUncyBvdXRwdXQgdHJhbnNwb3J0IGlzIGluY29tcGF0aWJsZSB3aXRoIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtODI2XSAtIFBIUCBUU29ja2V0IFdyaXRlIFRpbWVvdXQKKyAgICAqIFtUSFJJRlQtODM1XSAtIEJhZCBBUzMgc3ludGF4IGluIGNvbnN0cnVjdG9ycyB0aGF0IHNldCBkZWZhdWx0IHZhbHVlcworICAgICogW1RIUklGVC03ODhdIC0gdGhyaWZ0X3Byb3RvY29sLnNvOiBtdWx0aWdldC9tdWx0aWdldF9zbGljZSBkb2VzIG5vdCBoYW5kbGUgbW9yZSB0aGFuIDE3IGtleXMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTEyNV0gLSBPQ2FtbCBsaWJyYXJpZXMgZG9uJ3QgY29tcGlsZSB3aXRoIDMyLWJpdCBvY2FtbAorICAgICogW1RIUklGVC0zNDJdIC0gUEhQOiBjYW4ndCBoYXZlIHNldHMgb2YgY29tcGxleCB0eXBlcworICAgICogW1RIUklGVC03MzFdIC0gY29uZmlndXJlIGRvZXNuJ3QgY2hlY2sgZm9yIGFudCA+PSAxLjcKKyAgICAqIFtUSFJJRlQtNjkwXSAtIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMKKyAgICAqIFtUSFJJRlQtNjM4XSAtIEJ1ZmZlcmVkVHJhbnNwb3J0ICsgQyBleHRlbnNpb25zIGJsb2NrIHVudGlsIHJlY3YgdGltZW91dCBpcyByZWFjaGVkIG9uIGxhc3QgZnJlYWQgY2FsbAorCisjIyBEZXBlbmRlbmN5IHVwZ3JhZGUKKyAgICAqIFtUSFJJRlQtMTE3N10gLSBVcGRhdGUgdGhyaWZ0IHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBHbydzIG5ldHdvcmtpbmcgbGlicmFyaWVzCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTExNTVdIC0gUmVtb3ZlIGxvZzRqIGRlcGVuZGVuY3kgZnJvbSBqYXZhIGNsaWVudAorICAgICogW1RIUklGVC0xMTUxXSAtIFByb2R1Y2UgbW9yZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIGR1cmluZyBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTEyMDddIC0gU3VwcG9ydCBERVNURElSIG9uICJtYWtlIGluc3RhbGwiIG9mIHJ1YnkgbGlicworICAgICogW1RIUklGVC0xMTk5XSAtIFVuaW9uIHN0cnVjdHMgc2hvdWxkIGhhdmUgZ2VuZXJhdGVkIG1ldGhvZHMgdG8gdGVzdCB3aGV0aGVyIGEgc3BlY2lmaWMgZmllbGQgaXMgY3VycmVudGx5IHNldAorICAgICogW1RIUklGVC0xMjMzXSAtIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUKKyAgICAqIFtUSFJJRlQtMTE4OV0gLSBSdWJ5IGRlc2VyaWFsaXplciBzcGVlZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMTE3MF0gLSBUaHJpZnQgR2VuZXJhdGVkIENvZGUgYW5kIEphdmEgNQorICAgICogW1RIUklGVC0xMTc0XSAtIFB1Ymxpc2ggYXMzIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB2aWEgTWF2ZW4gZm9yIHVzZSBieSBmbGV4LW1vam9zIHVzZXJzCisgICAgKiBbVEhSSUZULTEyMjVdIC0gVENvbXBhY3RQcm90b2NvbCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTEyMjFdIC0gUmVtb3ZlIFNpbXBsZUNhbGxiYWNrLmgKKyAgICAqIFtUSFJJRlQtMTIxN10gLSBVc2UgZXZ1dGlsX3NvY2tldHBhaXIgaW5zdGVhZCBvZiBwaXBlIChXaW5kb3dzIHBvcnQpCisgICAgKiBbVEhSSUZULTEyMTZdIC0gYnVpbGQgSmF2YSBMaWJyYXJ5IGJlaGluZCBhIHByb3h5CisgICAgKiBbVEhSSUZULTEyMzFdIC0gUmVtb3ZlIGJvZ3VzIGluY2x1ZGUKKyAgICAqIFtUSFJJRlQtMTIxM10gLSBNZW1idWZmZXIgc2hvdWxkIHByb3ZpZGUgYSB3YXkgdG8gZ2V0IGJhY2sgdGhlIGJ1ZmZlcgorICAgICogW1RIUklGVC0xMjM3XSAtIEphdmEgZmIzMDMgbWlzc2luZyBzb21lIG1ldGhvZHMKKyAgICAqIFtUSFJJRlQtMTA2M10gLSBGaXggRXJsYW5nIFR1dG9yaWFsIEZpbGVzCisgICAgKiBbVEhSSUZULTEwNTNdIC0gTWFrZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBhdmFpbGFibGUgZm9yIGFsbCBzb2NrZXQgcmVsYXRlZCB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTExMDldIC0gRGVwbG95IGZiMzAzIGFsb25nIHNpZGUgbGlidGhyaWZ0IHRvIG1hdmVuIHJlcG8KKyAgICAqIFtUSFJJRlQtMTEwN10gLSBpbXByb3ZlbWVudCBmb3IgY29tcGlsZXItZ2VuZXJhdGVkIHB5dGhvbiBmb3IgJ05vbmUnIG9iamVjdCBjb21wYXJpc29ucworICAgICogW1RIUklGVC0xMDY5XSAtIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gaW5zZXJ0aW5nIGdlbi0qIGRpcmVjdG9yaWVzCisgICAgKiBbVEhSSUZULTEwNDldIC0gQWxsb3cgZm9yIFRTZXJ2ZXJTb2NrZXQgcHl0aG9uIGxpYnJhcnkgdG8gYmluZCB0byBhIHNwZWNpZmljIGhvc3QKKyAgICAqIFtUSFJJRlQtMTEyNl0gLSBFeHRlbmRpbmcgc3RydWN0X2luZm8gZm9yIGVybGFuZyBiaW5kaW5ncworICAgICogW1RIUklGVC0xMTAwXSAtIHB5dGhvbiBUU1NMU29ja2V0IGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtOTk0XSAtIERvbid0IHRyeSB0byBpbnZva2UgcGhwaXplIGlmIHdlIGRvbid0IGhhdmUgaXQKKyAgICAqIFtUSFJJRlQtOTkzXSAtIFNvbWUgaW1wcm92ZW1lbnRzIGluIEMrKyBzdHVicyBmb3Igb25ld2F5IG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtOTk3XSAtIFVzaW5nIHZhbHVlT2YgZm9yIGJhc2UgdHlwZXMgaW4gZ2V0RmllbGRWYWx1ZQorICAgICogW1RIUklGVC00MThdIC0gRG9uJ3QgZG8gcnVudGltZSBzb3J0aW5nIG9mIHN0cnVjdCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTUxXSAtIFRTU0xTZXJ2ZXJTb2NrZXQgYW5kIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjddIC0gR2VuZXJhdGVkIGVybGFuZyB0eXBlcyBkb24ndCBjb250YWluIGRlZmF1bHQgdmFsdWVzIGZvciByZWNvcmRzCisgICAgKiBbVEhSSUZULTExM10gLSB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAorICAgICogW1RIUklGVC0zNjNdIC0gTWF2ZW4gRGVwbG95CisgICAgKiBbVEhSSUZULTQ0N10gLSBNYWtlIGFuIGFic3RyYWN0IGJhc2UgQ2xpZW50IGNsYXNzIHNvIHdlIGNhbiBnZW5lcmF0ZSBsZXNzIGNvZGUKKyAgICAqIFtUSFJJRlQtNjI3XSAtIHNob3VsZCBjKysgaGF2ZSBzZXR0ZXJzIGZvciBvcHRpb25hbCBmaWVsZHM/CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEyMzZdIC0gRXJsYW5nIFJlY29ubmVjdGluZyBUaHJpZnQgQ2xpZW50CisgICAgKiBbVEhSSUZULTEwMjFdIC0gRnJhbWVkIHRyYW5zcG9ydCBzdXBwb3J0IGZvciBPQ2FtbAorICAgICogW1RIUklGVC0xMDY4XSAtIFB5dGhvbiBTU0wgU29ja2V0IFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTEwM10gLSBUWmxpYlRyYW5zcG9ydCBmb3IgcHl0aG9uLCBhIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTA4M10gLSBQcmVmb3JraW5nIHB5dGhvbiBwcm9jZXNzIHBvb2wgc2VydmVyCisgICAgKiBbVEhSSUZULTk5OV0gLSBBZGQgVEZvcmtpbmdTZXJ2ZXIKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTE1Ml0gLSBBdHRyaWJ1dGVzIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQKKyAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTg5Ml0gLSBSZWZhY3RvciBlcmxhbmcgYnVpbGQgc3lzdGVtIHdpdGggcmViYXIKKworIyMgV2lzaAorICAgICogW1RIUklGVC02MjVdIC0gQWRkIHN1cHBvcnQgZm9yICdHbycKKworCisKK1RocmlmdCAwLjYuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xMTMzXSAtIEphdmEgYW5kIEphdmFTY3JpcHQgdHV0b3JpYWwgaXMgYnJva2VuIHNpbmNlIHdlIGhhdmUgSmF2YSBtYXZlbiBkZXBsb3ltZW50CisgICAgKiBbVEhSSUZULTExMzFdIC0gQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcKKyAgICAqIFtUSFJJRlQtMTA3NF0gLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMTA5XSAtIERlcGxveSBmYjMwMyBhbG9uZyBzaWRlIGxpYnRocmlmdCB0byBtYXZlbiByZXBvCisgICAgKiBbVEhSSUZULTM2M10gLSBNYXZlbiBEZXBsb3kKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTIwNl0gLSBkaWQgdGhlIFRIUklGVCAwLjYuMSBtZXJnZSBUSFJJRlQtNTYzID8KKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTE2M10gLSBIb3cgY2FuIGkgdXNlIG11bHRpIHNlcnZpY2UgaW4gb25lIHByb2dyYW0/CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMTExMl0gLSBBcHBseSBUSFJJRlQtMzYzIHRvIDAuNiBicmFuY2gKKyAgICAqIFtUSFJJRlQtMTExM10gLSBBcHBseSBUSFJJRlQtMTA3NCB0byAwLjYgYnJhbmNoCisKKworCitUaHJpZnQgMC42CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTEwMjBdIC0gT0NhbWwgY29tcGlsZXIgZ2VuZXJhdGVzIGludmFsaWQgT0NhbWwKKyAgICAqIFtUSFJJRlQtMTAxNV0gLSBUVW5pb24gZG9lcyBub3QgaGFuZGxlIEJ5dGVCdWZmZXIgaW4gdG9TdHJpbmcKKyAgICAqIFtUSFJJRlQtMTAxM10gLSBnZW5lcmF0ZWQgamF2YSBjb2RlIG1heSBoYXZlIG5hbWUgY2xhc2hlcyB3aXRoIHRocmlmdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTEwMDldIC0gVFVuaW9uIGRvZXMgbm90IGNvcnJlY3RseSBkZWVwIGNvcHkgYSBCeXRlQnVmZmVyCisgICAgKiBbVEhSSUZULTEwMzJdIC0gIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCisgICAgKiBbVEhSSUZULTg2OF0gLSBSZWZlcmVuY2luZyBjb25zdGFudCB2YWx1ZXMgZG9lc24ndCB3b3JrIHdpdGggd2l0aCB0eXBlZGVmIHR5cGVzCisgICAgKiBbVEhSSUZULTk3MV0gLSBqYXZhIG1vZHVsZSBjYW4ndCBiZSBjb21waWxlZCB3aXRob3V0IGl2eSBhbmQgbmV0d29yayBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTk3MF0gLSBVbmRlciBoZWF2eSBsb2FkLCBUSHR0cENsaWVudCBtYXkgZmFpbCB3aXRoICJ0b28gbWFueSBvcGVuIGZpbGVzIgorICAgICogW1RIUklGVC05NjldIC0gSmF2YSBUdXRvcmlhbCBicm9rZW4sIG1vdmUgQ2FsY3VsYXRvckhhbmRsZXIgdG8gYSBzZXBhcmF0ZSBmaWxlCisgICAgKiBbVEhSSUZULTgwN10gLSBKYXZhU2NyaXB0OiBJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIHdpdGggMCBpbnN0ZWFkIG9mIG51bGwKKyAgICAqIFtUSFJJRlQtOTU1XSAtIFRocmlmdCBjb21waWxlciBmb3IgV2luZG93cyB1c2VzIGxvd2VyY2FzZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggaXMgaW5jb25zaXN0ZW50IHdpdGggY29tcGlsaW5nIG9uIG90aGVyIHBsYXRmb3JtcworICAgICogW1RIUklGVC05OTJdIC0gTmFtaW5nIGNvbnZlbnRpb24gaW4gQyMgY29uc3RydWN0b3IgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmaWVsZHMgY2F1c2VzIGNvbXBpbGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTEwMDhdIC0gYnl0ZVtdIGFjY2Vzc29ycyB0aHJvdyBOUEUgb24gdW5zZXQgZmllbGQKKyAgICAqIFtUSFJJRlQtMTAwNl0gLSBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUKKyAgICAqIFtUSFJJRlQtOTUwXSAtIEhhc2tlbGwgYmluZGluZ3MgdHJlYXQgJ2J5dGUnIGFzIHVuc2lnbmVkIDgtYml0IGludCAoRGF0YS5Xb3JkLldvcmQ4KSwgamF2YS9jcHAgYXMgc2lnbmVkIChieXRlL2ludDhfdCkuCisgICAgKiBbVEhSSUZULTk3NV0gLSBsaWIvY19nbGliL1JFQURNRSBpcyBtaXNzaW5nID0+IGJyZWFrcyBtYWtlIGRpc3QKKyAgICAqIFtUSFJJRlQtOTQ0XSAtIFN1cHBvcnQgYWxsIHZlcnNpb24tNHMgb2YgYmFzZQorICAgICogW1RIUklGVC05MzldIC0gb3B0aW9uYWwgYmluYXJ5IGZpZWxkcyB0aHJvdyBOUEUgb24gZGVmYXVsdCBieXRlW10gZ2V0dGVycworICAgICogW1RIUklGVC05MzVdIC0gUEhQIEV4dGVuc2lvbiBhYm9ydHMgdGhlIGJ1aWxkIGlmIHBocC1jb25maWcgaXMgbm90IGluc3RhbGxlZAorICAgICogW1RIUklGVC05MzNdIC0gSGFza2VsbCdzIFRocmlmdC5jYWJhbCBoYXMgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtOTMyXSAtIEhhc2tlbGwgdGVzdHMgbmVlZCB0byBiZSBydW4gdGhyb3VnaCAnbWFrZSBjaGVjaycgKGFuZCBwcm9iYWJseSAnY2FiYWwgY2hlY2snKSB0b28KKyAgICAqIFtUSFJJRlQtOTA0XSAtIEMjIFRTb2NrZXQgc2hvdWxkIGRpc2FibGUgbmFnbGUgYW5kIGxpbmdlcgorICAgICogW1RIUklGVC05NDFdIC0gTWFrZSBQSFAgQyBFeHRlbnNpb24gdXNlIHRoZSBkZWZpbmVkIFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTk0MF0gLSAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocworICAgICogW1RIUklGVC05MjRdIC0gRml4IGdlbmVyYXRlZCBwaHAgc3RydWN0dXJlIGNvbnN0YW50cworICAgICogW1RIUklGVC05NzldIC0gcnVieSBiaW5kaW5ncyB1c2VkIHRvIHdvcmsgb24ganJ1YnkKKyAgICAqIFtUSFJJRlQtOTc3XSAtIEhleCBDb252ZXJzaW9uIEJ1ZyBpbiBDKysgVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zNDddIC0gUEhQIFRTb2NrZXQgVGltZW91dCBJc3N1ZXMKKyAgICAqIFtUSFJJRlQtNTE3XSAtIFRFeGNlcHRpb25zIHRocm93biBieSBzZXJ2ZXIgcmVzdWx0IGluIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBvbiBjbGllbnQgLSBUcmllZCB0byByZWFkIDQgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAwIGJ5dGVzCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTEwMjRdIC0gQWRkIFB5dGhvbiBUd2lzdGVkIGV4YW1wbGUgdG8gdGhlIFR1dG9yaWFsCisgICAgKiBbVEhSSUZULTk1OF0gLSBDaGFuZ2UgYWNjZXNzbW9kaWZlciBvbiB0cmFuc18gZmllbGQgaW4gdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHRvIHB1YmxpYy4KKyAgICAqIFtUSFJJRlQtOTU3XSAtIFRIc0hhU2VydmVyOiBDaGFuZ2UgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBpbnZva2VyIGZpZWxkLgorICAgICogW1RIUklGVC0xMDAyXSAtIENvZGVTdHlsZTogdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCisgICAgKiBbVEhSSUZULTEwMDVdIC0gR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMKKyAgICAqIFtUSFJJRlQtOTUxXSAtIEFkZCBhIG5ldyBpc1NlcnZpbmcoKSBtZXRob2QgdG8gVFNlcnZlcgorICAgICogW1RIUklGVC05NDNdIC0gU2lsbHkgcmVhZG1lIHR5cG8gZml4LgorICAgICogW1RIUklGVC05NjFdIC0gSmF2YVNjcmlwdCBUZXN0U3VpdGUgdXNpbmcgYW50L2l2eSBhbmQgSmF2YSdzIFNlcnZlclRlc3RCYXNlIEhhbmRsZXIKKyAgICAqIFtUSFJJRlQtOTYwXSAtIGFkZCBUZXN0U2VydmVyLCBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYWdhaW4KKyAgICAqIFtUSFJJRlQtOTQ5XSAtIE1vZGlmeSB0aGUgVEVudW0gaW50ZXJmYWNlIHNvIGl0IGRlZmluZXMgYSBtZXRob2Qgc2ltaWxhciB0byBmaW5kQnlWYWx1ZQorICAgICogW1RIUklGVC05NDZdIC0gQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4KKyAgICAqIFtUSFJJRlQtOTAzXSAtIGN1c3RvbSBUaHJlYWRGYWN0b3J5IGluIFRIc0hhU2VydmVyCisgICAgKiBbVEhSSUZULTkxM10gLSBUZXN0IENhc2UgZm9yIFVybCBlbmNvZGVkIHN0cmluZ3MgKyBzaW1wbGUgZW5oYW5jZW1lbnQgdG8gbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaAorICAgICogW1RIUklGVC05MjZdIC0gTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTkyOV0gLSBJbXByb3ZlbWVudHMgdG8gdGhlIEMrKyB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTg5M10gLSBhZGQgSmF2YVNjcmlwdCB0byB0aGUgdHV0b3JpYWwgZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMTAwM10gLSBQb2xpc2hpbmcgY19nbGliIGNvZGUKKyAgICAqIFtUSFJJRlQtNzFdIC0gRGViaWFuIHBhY2thZ2luZyBmb3IgdGhyaWZ0CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEwMzNdIC0gTm9kZS5qcyBsYW5ndWFnZSB0YXJnZXQKKyAgICAqIFtUSFJJRlQtOTQ3XSAtIFByb3ZpZGUgYSBoZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgVFByb3RvY29sIHVzZWQgdG8gc2VyaWFsaXplIHNvbWUgZGF0YS4KKyAgICAqIFtUSFJJRlQtOTI4XSAtIE1ha2UgbW9yZSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiBDKysgc2VydmVycworICAgICogW1RIUklGVC05MjJdIC0gVGVtcGxhdGl6ZWQgW2RlXXNlcmlhbGl6YXRpb24gY29kZSBmb3IgQysrCisgICAgKiBbVEhSSUZULTkyM10gLSBFdmVudC1kcml2ZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgQysrCisgICAgKiBbVEhSSUZULTkyNV0gLSBQcm92aWRlIG5hbWU8LT52YWx1ZSBtYXAgZm9yIGVudW1zIGluIEMrKworICAgICogW1RIUklGVC05MjddIC0gQWRkIG9wdGlvbiB0byBtb2RpZnkgdGhlIFBIUCBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMzc3XSAtIFRGaWxlVHJhbnNwb3J0IHBvcnQgaW4gSmF2YQorICAgICogW1RIUklGVC0xMDZdIC0gVFNTTFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC01ODJdIC0gQyBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQKKyAgICAqIFtUSFJJRlQtNzQ1XSAtIE1ha2UgaXQgZWFzaWVyIHRvIGluc3RhbnRpYXRlIHNlcnZlcnMKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTg2Ml0gLSBBc3luYyBjbGllbnQgaXNzdWVzIC8gaW1wcm92ZW1lbnRzCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtNTgxXSAtIEFkZCBhIHRlc3RzdWl0ZSBmb3IgdHhUaHJpZnQgKFR3aXN0ZWQpCisKKworCitUaHJpZnQgMC41LjAgLSBJbmN1YmF0aW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVEhSSUZULTUwNSAgIEJ1aWxkICAgICAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIGdpdmUgYSBzdW1tYXJ5IG9mIHRoZSBlbmFibGVkIGNvbXBvbmVudHMgKERhdmlkIFJlaXNzKQogVEhSSUZULTUwNiAgIEJ1aWxkICAgICAgICAgICAgICAgIEFsbG93IFRocmlmdCB0byBiZSBidWlsdCB3aXRob3V0IHRoZSBDKysgbGlicmFyeSAoRGF2aWQgUmVpc3MpCiBUSFJJRlQtODQ0ICAgQnVpbGQgICAgICAgICAgICAgICAgQnVpbGQgUmVxdWlyZW1lbnRzIHN0YXRlIGF1dG9jb25mIDIuNTkrIGlzIHJlcXVpcmVkLCBidXQgMi42MCsgaXMgbmVlZGVkIChIYXJsYW4gTGllYmVybWFuLUJlcmcpCkBAIC0xNzAsOCArMjgzNSw4IEBACiBUSFJJRlQtNDU2ICAgVGVzdCBTdWl0ZSAgICAgICAgICAgQmFkIElQIGFkZHJlc3Mgc3RyaW5nIGluIHRlc3QvY3BwL3NyYy9tYWluLmNwcCAoUnVzaCBNYW5iZXJ0KQogCiAKLVZlcnNpb24gMC40LjAKLQorVGhyaWZ0IDAuNC4wIC0gSW5jdWJhdGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRIUklGVC02NTAgICBCdWlsZCAgICAgICAgTWFrZSBDaGVjayBmYWlscyBvbiBDZW50b3MvT1NYIHdpdGggMC4yLjAgdGFyYmFsbCAoQW50aG9ueSBNb2xpbmFybykKIFRIUklGVC03NzAgICBCdWlsZCAgICAgICAgR2V0ICdtYWtlIGRpc3QnIHRvIHdvcmsgd2l0aG91dCBmaXJzdCBjb21waWxpbmcgc291cmNlIGNvZGUgKEFudGhvbnkgTW9saW5hcm8pCiBUSFJJRlQtMTYwICAgQyMgICAgICAgICAgIENyZWF0ZWQgVEh0dHBUcmFuc3BvcnQgZm9yIHRoZSBDIyBsaWJyYXJ5IGJhc2VkIG9uIFdlYkh0dHBSZXF1ZXN0IChNaWNoYWVsIEdyZWVuZSkKQEAgLTIxOSw4ICsyODg0LDggQEAKIFRIUklGVC00NTkgICBSdWJ5ICAgICAgICAgUnVieSBpbnN0YWxsYXRpb24gYWx3YXlzIHRyaWVzIHRvIHdyaXRlIHRvIC9MaWJyYXJ5L1J1Ynkvc2l0ZSAoTWF0dGhpZXUgSW1iZXJ0KQogCiAKLVZlcnNpb24gMC4xLjAgUkMxIC8gVW5yZWxlYXNlZAotCitUaHJpZnQgMC4xLjAgLSBJbmN1YmF0aW5nIChub3QgcmVsZWFzZWQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tcGF0aWJpbGl0eSBCcmVha2luZyBDaGFuZ2VzOgogICBDKys6CiAgICAgKiBJdCdzIHF1aXRlIHBvc3NpYmxlIHRoYXQgcmVnZW5lcmF0aW5nIGNvZGUgYW5kIHJlYnVpbGRpbmcgd2lsbCBiZQpAQCAtMjM3LDggKzI5MDIsNyBAQAogICBFcmxhbmc6CiAgICAgKiBHZW5lcmF0ZWQgY29kZSB3aWxsIGhhdmUgdG8gYmUgcmVnZW5lcmF0ZWQsIGFuZCB0aGUgbmV3IGNvZGUgd2lsbAogICAgICAgaGF2ZSB0byBiZSBkZXBsb3llZCBhdG9taWNhbGx5IHdpdGggdGhlIG5ldyBsaWJyYXJ5IGNvZGUgW1RIUklGVC0xMzZdCi0gIAotICAKKwogTmV3IEZlYXR1cmVzIGFuZCBCdWcgRml4ZXM6CiAgIEMrKzoKICAgICAqIFN1cHBvcnQgZm9yIFRDb21wYWN0UHJvdG9jb2wgW1RIUklGVC0zMzNdCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTdhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjEpCisKKyMgQ01ha2UgMy4xIHN1cHBvcnRzIEMrKyBzdGFuZGFyZHMgc2VsZWN0aW9uIHdpdGggQ01BS0VfQ1hYX1NUQU5EQVJECisjIElmIHlvdSBuZWVkIENNYWtlIDMuMSsgZm9yIFVidW50dSAxNC4wNCwgdHJ5CisjICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L35nZW9yZ2UtZWRpc29uNTUvK2FyY2hpdmUvdWJ1bnR1L2NtYWtlLTMueAorIyBJZiB5b3UgbmVlZCBDTWFrZSAzLjErIGZvciBkZWJpYW4gImplc3NpZSIsIGdldCBpdCBmcm9tIGplc3NpZS1iYWNrcG9ydHMKKyMgT3RoZXJ3aXNlCisjICAgaHR0cDovL2NtYWtlLm9yZworCitwcm9qZWN0KCJBcGFjaGUgVGhyaWZ0IikKKworc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX01PRFVMRV9QQVRIfSIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9idWlsZC9jbWFrZSIpCisKKyMgVE9ETzogYWRkIGBnaXQgcmV2LXBhcnNlIC0tc2hvcnQgSEVBRGAKKyMgUmVhZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBdXRvY29uZiBmaWxlCitmaWxlIChTVFJJTkdTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29uZmlndXJlLmFjIiBDT05GSUdVUkVfQUMgUkVHRVggIkFDX0lOSVRcXCguKlxcKSIgKQorCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgdmVyc2lvbi5oLmluIGZpbGUKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJBQ19JTklUXFwoXFxbLipcXF0sIFxcWyhbMC05XStcXC5bMC05XStcXC5bMC05XSsoLWRldik/KVxcXVxcKSIgIlxcMSIgUEFDS0FHRV9WRVJTSU9OICR7Q09ORklHVVJFX0FDfSkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogJHtQQUNLQUdFX1ZFUlNJT059IikKKworIyBUaGVzZSBhcmUgaW50ZXJuYWwgdG8gQ01ha2UKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rKSgtZGV2KT8iICJcXDEiIHRocmlmdF9WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rKVxcLlswLTldK1xcLlswLTldKyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTn0pCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuKFswLTldKStcXC5bMC05XSsiICJcXDEiIHRocmlmdF9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT059KQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLlswLTldK1xcLihbMC05XSspIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OfSkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHZlcnNpb246ICR7dGhyaWZ0X1ZFUlNJT059ICgke3RocmlmdF9WRVJTSU9OX01BSk9SfS4ke3RocmlmdF9WRVJTSU9OX01JTk9SfS4ke3RocmlmdF9WRVJTSU9OX1BBVENIfSkiKQorCisjIFNvbWUgZGVmYXVsdCBzZXR0aW5ncworaW5jbHVkZShEZWZpbmVDTWFrZURlZmF1bHRzKQorCisjIEJ1aWxkIHRpbWUgb3B0aW9ucyBhcmUgZGVmaW5lZCBoZXJlCitpbmNsdWRlKERlZmluZU9wdGlvbnMpCitpbmNsdWRlKERlZmluZUluc3RhbGxhdGlvblBhdGhzKQorCisjIEJhc2VkIG9uIHRoZSBvcHRpb25zIHNldCBzb21lIHBsYXRmb3JtIHNwZWNpZmljcworaW5jbHVkZShEZWZpbmVQbGF0Zm9ybVNwZWNpZmMpCisKKyMgR2VuZXJhdGUgdGhlIGNvbmZpZy5oIGZpbGUKK2luY2x1ZGUoQ29uZmlndXJlQ2hlY2tzKQorCisjIFBhY2thZ2UgaXQKK2luY2x1ZGUoQ1BhY2tDb25maWcpCisKKworZmluZF9wYWNrYWdlKFRocmVhZHMpCisKK2luY2x1ZGUoQ1Rlc3QpCitpZihCVUlMRF9URVNUSU5HKQorICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aCB1bml0dGVzdHMiKQorCisgIGVuYWJsZV90ZXN0aW5nKCkKKyAgIyBEZWZpbmUgIm1ha2UgY2hlY2siIGFzIGFsaWFzIGZvciAibWFrZSB0ZXN0IgorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjayBDT01NQU5EIGN0ZXN0KQorZWxzZSAoKQorICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aG91dCB0ZXN0cyIpCitlbmRpZiAoKQorCitpZihCVUlMRF9DT01QSUxFUikKKyAgICBpZihOT1QgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICAgICAgc2V0KFRIUklGVF9DT01QSUxFUiAkPFRBUkdFVF9GSUxFOnRocmlmdC1jb21waWxlcj4pCisgICAgZW5kaWYoKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVyL2NwcCkKK2Vsc2VpZihFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1jb21waWxlciBJTVBPUlRFRCkKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIHRocmlmdC1jb21waWxlciBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1RIUklGVF9DT01QSUxFUn0pCitlbmRpZigpCisKK2lmKEJVSUxEX0NQUCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvY3BwKQorICAgIGlmKEJVSUxEX1RVVE9SSUFMUykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdHV0b3JpYWwvY3BwKQorICAgIGVuZGlmKCkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBpZihXSVRIX0xJQkVWRU5UIEFORCBXSVRIX1pMSUIgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICAgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvY3BwKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIG1lc3NhZ2UoV0FSTklORyAibGliZXZlbnQgYW5kL29yIFpMSUIgYW5kL29yIE9wZW5TU0wgbm90IGZvdW5kIG9yIGRpc2FibGVkOyB3aWxsIG5vdCBidWlsZCBzb21lIHRlc3RzIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfQ19HTElCKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9jX2dsaWIpCitlbmRpZigpCisKK2lmKEJVSUxEX0pBVkEpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2phdmEpCitlbmRpZigpCisKK2lmKEJVSUxEX1BZVEhPTikKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvcHkpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9weSkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKEJVSUxEX0hBU0tFTEwpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2hzKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvaHMpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitQUklOVF9DT05GSUdfU1VNTUFSWSgpCmRpZmYgLS1naXQgYS9DT05UUklCVVRJTkcubWQgYi9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExZDcxMAotLS0gL2Rldi9udWxsCisrKyBiL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDExNiBAQAorIyBIb3cgdG8gQ29udHJpYnV0ZSAjCisKK1RoYW5rIHlvdSBmb3IgeW91ciBpbnRlcmVzdCBpbiBjb250cmlidXRpbmcgdG8gdGhlIEFwYWNoZSBUaHJpZnQgcHJvamVjdCEgIEluZm9ybWF0aW9uIG9uIHdoeSBhbmQgaG93IHRvIGNvbnRyaWJ1dGUgaXMgYXZhaWxhYmxlIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB3ZWIgc2l0ZS4gSW4gcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcgdG8gYmVjb21lIGFjcXVhaW50ZWQgd2l0aCBBcGFjaGUgQ29udHJpYnV0aW9uczoKKworICogW0NvbnRyaWJ1dG9ycyBUZWNoIEd1aWRlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L2NvbnRyaWJ1dG9ycykKKyAqIFtHZXQgaW52b2x2ZWQhXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9nZXRpbnZvbHZlZC5odG1sKQorICogW0xlZ2FsIGFzcGVjdHMgb24gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zIChQYXRjaGVzKV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwjY29udHJpYnV0aW9ucykKKworIyMgR2l0SHViIHB1bGwgcmVxdWVzdHMgIyMKKworVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiBzdWJtaXR0aW5nIGNoYW5nZXMuICBXaGVuIHlvdSBzdWJtaXQgYSBwdWxsIHJlcXVlc3QgdGhyb3VnaCBnaXRodWIsCitpdCBhY3RpdmF0ZXMgdGhlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gKENJKSBidWlsZCBzeXN0ZW1zIGF0IEFwcHZleW9yIGFuZCBUcmF2aXMgdG8gYnVpbGQgeW91ciBjaGFuZ2VzeGkKK29uIGEgdmFyaWV0eSBvZiBMaW51eCBhbmQgV2luZG93cyBjb25maWd1cmF0aW9ucyBhbmQgcnVuIGFsbCB0aGUgdGVzdCBzdWl0ZXMuICBGb2xsb3cgdGhlc2UgcmVxdWlyZW1lbnRzIAorZm9yIGEgc3VjY2Vzc2Z1bCBwdWxsIHJlcXVlc3Q6CisKKyAxLiBBbGwgY29kZSBjaGFuZ2VzIHJlcXVpcmUgYW4gW0FwYWNoZSBKaXJhIFRIUklGVCBJc3N1ZV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgdGlja2V0LgorCisgMS4gQWxsIHB1bGwgcmVxdWVzdHMgc2hvdWxkIGNvbnRhaW4gYSBzaW5nbGUgY29tbWl0IHBlciBpc3N1ZSwgb3Igd2Ugd2lsbCBhc2sgeW91IHRvIHNxdWFzaCBpdC4KKyAxLiBUaGUgcHVsbCByZXF1ZXN0IHRpdGxlIG11c3QgYmVnaW4gd2l0aCB0aGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIsIGZvciBleGFtcGxlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBhbiBleGFtcGxlIHB1bGwgcmVxdWVzdCB0aXRsZQorICAgICAgICAKKyAxLiBDb21taXQgbWVzc2FnZXMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuIGZvciBjb2RlIGNoYW5nZXMgKGRldmlhdGlvbnMgd2lsbCBub3QgYmUgbWVyZ2VkKToKKyAgICAgICAgCisgICAgICAgIFRIUklGVC05OTk5OiBbc3VtbWFyeSBvZiBmaXgsIG9uZSBsaW5lIGlmIHBvc3NpYmxlXQorICAgICAgICBDbGllbnQ6IFtsYW5ndWFnZShzKSBhZmZlY3RlZCwgY29tbWEgc2VwYXJhdGVkLCB1c2UgbGliLyBkaXJlY3RvcnkgbmFtZXMgcGxlYXNlXQorCitJbnN0cnVjdGlvbnM6CisKKyAxLiBDcmVhdGUgYSBmb3JrIGluIHlvdXIgR2l0SHViIGFjY291bnQgb2YgaHR0cDovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorIDEuIENsb25lIHRoZSBmb3JrIHRvIHlvdXIgZGV2ZWxvcG1lbnQgc3lzdGVtLgorIDEuIENyZWF0ZSBhIGJyYW5jaCBmb3IgeW91ciBjaGFuZ2VzIChiZXN0IHByYWN0aWNlIGlzIGlzc3VlIGFzIGJyYW5jaCBuYW1lLCBlLmcuIFRIUklGVC05OTk5KS4KKyAxLiBNb2RpZnkgdGhlIHNvdXJjZSB0byBpbmNsdWRlIHRoZSBpbXByb3ZlbWVudC9idWdmaXgsIGFuZDoKKworICAgICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0dGVkIGNoYW5nZXMhCisgICAgKiBVc2UgdGVzdC1kcml2ZW4gZGV2ZWxvcG1lbnQgKFRERCk6IGFkZCBhIHRlc3QgdGhhdCB3aWxsIGlzb2xhdGUgdGhlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyB0aGUgY2hhbmdlIHRoYXQgZml4ZXMgaXQuCisgICAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2RvY3MvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykuCisgICAgKiBbKm9wdGlvbmFsKl0gVmVyaWZ5IHRoYXQgeW91ciBjaGFuZ2Ugd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zIGJ5IGFkZGluZyBhIEdpdEh1YiBzZXJ2aWNlIGhvb2sgdG8gW1RyYXZpcyBDSV0oaHR0cDovL2RvY3MudHJhdmlzLWNpLmNvbS91c2VyL2dldHRpbmctc3RhcnRlZC8jU3RlcC1vbmUlM0EtU2lnbi1pbikgYW5kIFtBcHBWZXlvcl0oaHR0cDovL3d3dy5hcHB2ZXlvci5jb20vZG9jcykuICBZb3UgY2FuIHVzZSB0aGlzIHRlY2huaXF1ZSB0byBydW4gdGhlIFRocmlmdCBDSSBqb2JzIGluIHlvdXIgYWNjb3VudCB0byBjaGVjayB5b3VyIGNoYW5nZXMgYmVmb3JlIHRoZXkgYXJlIG1hZGUgcHVibGljLiAgRXZlcnkgR2l0SHViIHB1bGwgcmVxdWVzdCBpbnRvIFRocmlmdCB3aWxsIHJ1biB0aGUgZnVsbCBDSSBidWlsZCBhbmQgdGVzdCBzdWl0ZSBvbiB5b3VyIGNoYW5nZXMuCisKKyAxLiBTcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdC4gIFRoaXMgbWFpbnRhaW5zIGNsZWFuIGNoYW5nZSBoaXN0b3J5LgorIDEuIENvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIHRvIHlvdXIgYnJhbmNoIChwbGVhc2UgdXNlIGlzc3VlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFzIGNvbW1pdCB0aXRsZSwgZS5nLiAiVEhSSUZULTk5OTk6IG1ha2UgaXQgcGVyZmVjdCIpLCB3aXRoIHRoZSBhZmZlY3RlZCBsYW5ndWFnZXMgb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZGVzY3JpcHRpb24uCisgMS4gVXNlIEdpdEh1YiB0byBjcmVhdGUgYSBwdWxsIHJlcXVlc3QgZ29pbmcgZnJvbSB5b3VyIGJyYW5jaCB0byBhcGFjaGU6bWFzdGVyLiAgRW5zdXJlIHRoYXQgdGhlIEppcmEgdGlja2V0IG51bWJlciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aXRsZSBvZiB5b3VyIHB1bGwgcmVxdWVzdCwgc2FtZSBhcyB0aGUgY29tbWl0IHRpdGxlLgorIDEuIFdhaXQgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIG5ldyBhZGRpdGlvbiwgYW5kIGZvciBhIENJIGJ1aWxkIHRvIGNvbXBsZXRlLgorIDEuIFdhaXQgZm9yIGEgY29tbWl0dGVyIHRvIGNvbW1pdCB5b3VyIHBhdGNoLiAgWW91IGNhbiBudWRnZSB0aGUgY29tbWl0dGVycyBpZiBuZWNlc3NhcnkgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIFtBcGFjaGUgVGhyaWZ0IG1haWxpbmcgbGlzdF0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nKS4KKworIyMgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIHByb2plY3QgbG9jYWxseSAjIworCitGb3IgV2luZG93cyBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0NNYWtlIFJFQURNRV0oL2J1aWxkL2NtYWtlL1JFQURNRS5tZCkuCisKK0ZvciBXaW5kb3dzIE5hdGl2ZSBDKysgYnVpbGRzLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW1dpbkNQUCBSRUFETUVdKC9idWlsZC93aW5jcHAvUkVBRE1FLm1kKS4KKworRm9yIHVuaXggc3lzdGVtcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtEb2NrZXIgUkVBRE1FXSgvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkuCisKKyMjIElmIHlvdSB3YW50IHRvIHJldmlldyBvcGVuIGlzc3Vlcy4uLiAjIworCisgMS4gUmV2aWV3IHRoZSBbR2l0SHViIFB1bGwgUmVxdWVzdCBCYWNrbG9nXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9wdWxscykuICBDb2RlIHJldmlld3MgYXJlIG9wZW4gdG8gYWxsLgorIDIuIFJldmlldyB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkuICBZb3UgY2FuIHNlYXJjaCBmb3IgdGlja2V0cyByZWxhdGluZyB0byBsYW5ndWFnZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9yIGN1cnJlbnRseSB1c2luZyB3aXRoIHRocmlmdCwgZm9yIGV4YW1wbGUgYSBKaXJhIHNlYXJjaCAoSXNzdWVzIC0+IFNlYXJjaCBGb3IgSXNzdWVzKSBxdWVyeSBvZiBgYHByb2plY3QgPSBUSFJJRlQgQU5EIGNvbXBvbmVudCBpbiAoIkVybGFuZyAtIExpYnJhcnkiKSBhbmQgc3RhdHVzIG5vdCBpbiAocmVzb2x2ZWQsIGNsb3NlZClgYCB3aWxsIGxvY2F0ZSBhbGwgdGhlIG9wZW4gRXJsYW5nIExpYnJhcnkgaXNzdWVzLgorCisjIyBJZiB5b3UgZGlzY292ZXJlZCBhIGRlZmVjdC4uLiAjIworCisgMS4gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpc3N1ZSBpcyBhbHJlYWR5IGluIHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4KKyAxLiBJZiBub3QsIGNyZWF0ZSBhIHRpY2tldCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UgeW91J3JlIHByb3Bvc2luZyBpbiB0aGUgSmlyYSBpc3N1ZSB0cmFja2VyLgorIDEuIENvbnRyaWJ1dGUgeW91ciBjb2RlIGNoYW5nZXMgdXNpbmcgdGhlIEdpdEh1YiBwdWxsIHJlcXVlc3QgbWV0aG9kOgorCisjIyBDb250cmlidXRpbmcgdmlhIFBhdGNoICMjCisKK1NvbWUgY2hhbmdlcyBkbyBub3QgcmVxdWlyZSBhIGJ1aWxkLCBmb3IgZXhhbXBsZSBpbiBkb2N1bWVudGF0aW9uLiAgRm9yIGNoYW5nZXMgdGhhdCBhcmUgbm90IGNvZGUgb3IgYnVpbGQgcmVsYXRlZCwgeW91IGNhbiBzdWJtaXQgYSBwYXRjaCBvbiBKaXJhIGZvciByZXZpZXcuICBUbyBjcmVhdGUgYSBwYXRjaCBmcm9tIGNoYW5nZXMgaW4geW91ciBsb2NhbCBkaXJlY3Rvcnk6CisKKyAgICBnaXQgZGlmZiA+IC4uL1RIUklGVC1OTk5OLnBhdGNoCisKK3RoZW4gd2FpdCBmb3IgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgY2hhbmdlcywgYW5kIHRoZW4gZm9yIGEgY29tbWl0dGVyIHRvIGFwcGx5IHlvdXIgcGF0Y2guCisKKyMjIEdpdEh1YiByZWNpcGVzIGZvciBQdWxsIFJlcXVlc3RzICMjCisKK1NvbWV0aW1lcyBjb21tbWl0dGVycyBtYXkgYXNrIHlvdSB0byB0YWtlIGFjdGlvbnMgaW4geW91ciBwdWxsIHJlcXVlc3RzLiAgSGVyZSBhcmUgc29tZSByZWNpcGVzIHRoYXQgd2lsbCBoZWxwIHlvdSBhY2NvbXBsaXNoIHRob3NlIHJlcXVlc3RzLiAgVGhlc2UgZXhhbXBsZXMgYXNzdW1lIHlvdSBhcmUgd29ya2luZyBvbiBKaXJhIGlzc3VlIFRIUklGVC05OTk5LiAgWW91IHNob3VsZCBhbHNvIGJlIGZhbWlsaWFyIHdpdGggdGhlIFt1cHN0cmVhbV0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvc3luY2luZy1hLWZvcmsvKSByZXBvc2l0b3J5IGNvbmNlcHQuCisKKyMjIyBTcXVhc2ggeW91ciBjaGFuZ2VzICMjIworCitJZiB5b3UgaGF2ZSBub3Qgc3VibWl0dGVkIGEgcHVsbCByZXF1ZXN0IHlldCwgb3IgaWYgeW91IGhhdmUgbm90IHlldCByZWJhc2VkIHlvdXIgZXhpc3RpbmcgcHVsbCByZXF1ZXN0LCB5b3UgY2FuIHNxdWFzaCBhbGwgeW91ciBjb21taXRzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWtlcyBsaWZlIGVhc2llciBmb3IgdGhlIGNvbW1pdHRlcnMuICBJZiB5b3VyIHB1bGwgcmVxdWVzdCBvbiBHaXRIdWIgaGFzIG1vcmUgdGhhbiBvbmUgY29tbWl0LCB5b3Ugc2hvdWxkIGRvIHRoaXMuCisKKzEuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCBsb2dgYCB0byBpZGVudGlmeSBob3cgbWFueSBjb21taXRzIHlvdSBtYWRlIHNpbmNlIHlvdSBiZWdhbi4KKzIuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCByZWJhc2UgLWkgSEVBRH5OYGAgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMuCiszLiBMZWF2ZSAicHVsbCIgaW4gdGhlIGZpcnN0IGxpbmUuCis0LiBDaGFuZ2UgYWxsIG90aGVyIGxpbmVzIGZyb20gInB1bGwiIHRvICJmaXh1cCIuCis1LiBBbGwgeW91ciBjaGFuZ2VzIGFyZSBub3cgaW4gYSBzaW5nbGUgY29tbWl0LgorCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVsbCByZXF1ZXN0IG91dHN0YW5kaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIGEgImZvcmNlIHB1c2giIHRvIG92ZXJ3cml0ZSBpdCBzaW5jZSB5b3UgY2hhbmdlZCB5b3VyIGNvbW1pdCBoaXN0b3J5OgorCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworQSBtb3JlIGRldGFpbGVkIHdhbGt0aHJvdWdoIG9mIGEgc3F1YXNoIGNhbiBiZSBmb3VuZCBhdCBbR2l0IFJlYWR5XShodHRwOi8vZ2l0cmVhZHkuY29tL2FkdmFuY2VkLzIwMDkvMDIvMTAvc3F1YXNoaW5nLWNvbW1pdHMtd2l0aC1yZWJhc2UuaHRtbCkuCisKKyMjIyBSZWJhc2UgeW91ciBwdWxsIHJlcXVlc3QgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGhhcyBhIGNvbmZsaWN0IHdpdGggbWFzdGVyLCBpdCBuZWVkcyB0byBiZSByZWJhc2VkOgorCisgICAgZ2l0IGNoZWNrb3V0IFRIUklGVC05OTk5CisgICAgZ2l0IHJlYmFzZSB1cHN0cmVhbSBtYXN0ZXIKKyAgICAgIChyZXNvbHZlIGFueSBjb25mbGljdHMsIG1ha2Ugc3VyZSBpdCBidWlsZHMpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworIyMjIEZpeCBhIGJhZCBtZXJnZSAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgY29udGFpbnMgY29tbWl0cyB0aGF0IGFyZSBub3QgeW91cnMsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyB0ZWNobmlxdWUgdG8gZml4IHRoZSBiYWQgbWVyZ2UgaW4geW91ciBicmFuY2g6CisKKyAgICBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgZ2l0IHB1bGwgdXBzdHJlYW0gbWFzdGVyCisgICAgZ2l0IGNoZWNrb3V0IC1iIFRIUklGVC05OTk5LXRha2UtMgorICAgIGdpdCBjaGVycnktcGljayAuLi4KKyAgICAgICAgKHBpY2sgb25seSB5b3VyIGNvbW1pdHMgZnJvbSB5b3VyIG9yaWdpbmFsIHB1bGwgcmVxdWVzdCBpbiBhc2NlbmRpbmcgY2hyb25vbG9naWNhbCBvcmRlcikKKyAgICBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIChzZWUgYWJvdmUpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5LXRha2UtMjpUSFJJRlQtOTk5OQorCitUaGlzIHByb2NlZHVyZSB3aWxsIGFwcGx5IG9ubHkgeW91ciBjb21taXRzIGluIG9yZGVyIHRvIHRoZSBjdXJyZW50IG1hc3RlciwgdGhlbiB5b3Ugd2lsbCBzcXVhc2ggdGhlbSB0byBhIHNpbmdsZSBjb21taXQsIGFuZCB0aGVuIHlvdSBmb3JjZSBwdXNoIHlvdXIgbG9jYWwgVEhSSUZULTk5OTktdGFrZS0yIGludG8gcmVtb3RlIFRIUklGVC05OTk5IHdoaWNoIHJlcHJlc2VudHMgeW91ciBwdWxsIHJlcXVlc3QsIHJlcGxhY2luZyBhbGwgdGhlIGNvbW1pdHMgd2l0aCB0aGUgbmV3IG9uZS4KKworIApkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUT1JTIGIvQ09OVFJJQlVUT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk1NGY4Li4wMDAwMDAwCi0tLSBhL0NPTlRSSUJVVE9SUworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLUNoYWQgV2FsdGVycyA8Y2hhZEBwb3dlcnNldC5jb20+Ci0tVEpTT05Qcm90b2NvbCBmb3IgQysrIGFuZCBKYXZhCi0KLU5pdGF5IDxuaXRheWpAZ21haWwuY29tPgotLVN1cHBvcnQgZm9yICJtYWtlIGNoZWNrIgotCi1XaWxsaWFtIE1vcmdhbiA8d0BhZGFwLnR2PgotLU1pc2NlbGxhbmVvdXMgUnVieSBpbXByb3ZlbWVudHMKLQotQmVuIE1hdXJlciA8Ym1hdXJlckBhbmRyZXcuY211LmVkdT4KLS1SZXN0cnVjdHVyaW5nIHRoZSB3YXkgQXV0b2NvbmYgaXMgdXNlZAotCi1QYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgotLVNtYWxsdGFsayBiaW5kaW5ncwotCi1EYXZlIFNpbXBzb24gPGRhdmVAcG93ZXJzZXQuY29tPgotLUJldHRlciBzdXBwb3J0IGZvciBjb25uZWN0aW9uIHRyYWNraW5nIGluIHRoZSBDKysgc2VydmVyCi0tTWlzY2VsbGFuZW91cyBmaXhlcwotCi1JZ29yIEFmYW5hc3lldiA8YWZhbkBldmVybm90ZS5jb20+Ci0tUGVybCBIdHRwQ2xpZW50IGFuZCBidWdmaXhlcwotCi1Ub2RkIEJlcm1hbiA8dGJlcm1hbkBpbWVlbS5jb20+Ci0tTWluR1cgcG9ydCBvZiB0aGUgY29tcGlsZXIKLS1DIyBiaW5kaW5ncwotLU1TIGJ1aWxkIHRhc2sKLQotLS0tLS0tLS0tLS0tLS0tLQotUmVsZWFzZSAyMDA3MDkxNwotLS0tLS0tLS0tLS0tLS0tLQotCi1EYXZlIEVuZ2JlcmcgPGVuZ2JlcmdAZ21haWwuY29tPgotLUphdmFCZWFuL0phdmFEb2MgZW5oYW5jZW1lbnRzCi0KLUFuZHJldyBNY0dlYWNoaWUgPGdlZWNob3JhbWFAZ21haWwuY29tPgotLUNvY29hL09iamVjdGl2ZS1DIHN1cHBvcnQKLQotQmVuIE1hdXJlciA8Ym1hdXJlckBhbmRyZXcuY211LmVkdT4KLS1QeXRob24gcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLCBmYXN0YmluYXJ5IHN1cHBvcnQKLQotQW5kcmV3IEx1dG9taXJza2kgPGFuZHlAbHV0by51cz4KLS1BZGRlZCBvcHRpb25hbC9yZXF1aXJlZCBrZXl3b3JkcyBmb3IgQysrIG9iamVjdHMKLS1BZGRlZCBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgQysrIHN0cnVjdHMKLQotSm9oYW4gT3NrYXJzc29uIDxqb2hhbkBva3NhcnNzb24ubnU+Ci0tSmF2YSBmaW5kYnVncyBjb21wbGlhbmNlIGZpeGVzCi0KLVBhdWwgU2FhYiA8cHNAcG93ZXJzZXQuY29tPgotLUlQdjYgc3VwcG9ydCBmb3IgVFNvY2tldCBpbiBDKysvUHl0aG9uCi0KLUtldmluIENsYXJrIDxrZXZpbkBwb3dlcnNldC5jb20+Ci0tU2lnbmlmaWNhbnQgb3ZlcmhhdWwgb2YgUnVieSBjb2RlIGdlbmVyYXRpb24gYW5kIHNlcnZlcnMKLQotU2ltb24gRm9ybWFuIDxzZm9ybWFuQGdtYWlsLmNvbT4KLS1UUHJvY2Vzc29yRmFjdG9yeSBhYnN0cmFjdGlvbiBmb3IgSmF2YSBzZXJ2ZXJzCi0KLUpha2UgTHVjaWFuaSA8amFrZXJzQGdtYWlsLmNvbT4KLS1QZXJsIGNvZGUgZ2VuZXJhdGlvbiwgbGlicmFyaWVzLCB0ZXN0IGNvZGUKLQotRGF2aWQgUmVpc3MgPGRyZWlzc0BzdGFuZm9yZC5lZHU+Ci0tc3RyaW5ncy5oIGluY2x1ZGUgZml4IGZvciBiemVybwotLWVuZGlhbm5lc3MgZml4ZXMgb24gVEJpbmFyeVByb3RvY29sIGRvdWJsZSBzZXJpYWxpemF0aW9uCi0taW1wcm92ZWQgbnRvaGxsLGh0b25sbCBpbXBsZW1lbnRhdGlvbgotCi1EYW4gTGkgPGR0b0BkZXYuamF2YS5uZXQ+Ci0tSmF2YSBUZXN0U2VydmVyIGFuZCBUdXRvcmlhbCBGaXhlcwotCi1LZXZpbiBLbyA8a2V2aW4ucy5rb0BnbWFpbC5jb20+Ci0tRml4IGZvciB1bm5lY2Vzc2FyeSBzdGQ6OnN0cmluZyBjb3B5IGNvbnN0cnVjdGlvbiBpbiBQcm90b2NvbC9FeGNlcHRpb24KLQotUGF1bCBRdWVybmEgPHBxdWVybmFAYXBhY2hlLm9yZz4KLS1BdXRvY29uZiBlcnJvciBtZXNzYWdlIGZpeCBmb3IgbGliZXZlbnQgZGV0ZWN0aW9uCi0tY2xvY2tfZ2V0dGltZSBpbXBsZW1lbnRhdGlvbiBmb3IgT1NYCi0KLS0tLS0tLS0tLS0tLS0tLS0KLVJlbGVhc2UgMjAwNzA0MDEKLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RJU0NMQUlNRVIgYi9ESVNDTEFJTUVSCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdlN2VhLi4wMDAwMDAwCi0tLSBhL0RJU0NMQUlNRVIKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFwYWNoZSBUaHJpZnQgaXMgYW4gZWZmb3J0IHVuZGVyZ29pbmcgaW5jdWJhdGlvbiBhdCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRiksIAotc3BvbnNvcmVkIGJ5IHRoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyAKLXVudGlsIGEgZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgYW5kIGRlY2lzaW9uIAotbWFraW5nIHByb2Nlc3MgaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4KLVdoaWxlIGluY3ViYXRpb24gc3RhdHVzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHJlZmxlY3Rpb24gb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgCi1vZiB0aGUgY29kZSwgaXQgZG9lcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9qZWN0IGhhcyB5ZXQgdG8gYmUgZnVsbHkgZW5kb3JzZWQgYnkgdGhlIEFTRi4KZGlmZiAtLWdpdCBhL0xBTkdVQUdFUy5tZCBiL0xBTkdVQUdFUy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEzY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvTEFOR1VBR0VTLm1kCkBAIC0wLDAgKzEsMzU1IEBACisjIEFwYWNoZSBUaHJpZnQgTGFuZ3VhZ2UgU3VwcG9ydCAjCisKK0xhc3QgTW9kaWZpZWQ6IDIwMTgtMTItMTcKKworR3VpZGFuY2UgRm9yOiAwLjEyLjAgb3IgbGF0ZXIKKworVGhyaWZ0IHN1cHBvcnRzIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBoYXMgYW4gaW1wcmVzc2l2ZSB0ZXN0IHN1aXRlIHRoYXQgZXhlcmNpc2VzIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcywgcHJvdG9jb2xzLCBhbmQgdHJhbnNwb3J0cyB0aGF0IHJlcHJlc2VudHMgYSBtYXRyaXggb2YgdGhvdXNhbmRzIG9mIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4gIEVhY2ggbGFuZ3VhZ2UgdHlwaWNhbGx5IGhhcyBhIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBhcyB3ZWxsIGFzIHN1cHBvcnQgbGlicmFyaWVzIC0gc29tZSBtYW5kYXRvcnkgYW5kIHNvbWUgb3B0aW9uYWwuICBBbGwgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBiZWxvdyB0byBoZWxwIHlvdSBhc3Nlc3Mgd2hldGhlciB5b3UgY2FuIHVzZSBBcGFjaGUgVGhyaWZ0IHdpdGggeW91ciBwcm9qZWN0LiAgT2J2aW91c2x5IHRoaXMgaXMgYSBjb21wbGV4IG1hdHJpeCB0byBtYWludGFpbiBhbmQgbWF5IG5vdCBiZSBjb3JyZWN0IGluIGFsbCBjYXNlcyAtIGlmIHlvdSBzcG90IGFuIGVycm9yIHBsZWFzZSBpbmZvcm0gdGhlIGRldmVsb3BlcnMgdXNpbmcgdGhlIG1haWxpbmcgbGlzdC4KKworQXBhY2hlIFRocmlmdCBoYXMgYSBjaG9pY2Ugb2YgdHdvIGJ1aWxkIHN5c3RlbXMuICBUaGUgYGF1dG9jb25mYCBidWlsZCBzeXN0ZW0gaXMgdGhlIG1vc3QgY29tcGxldGUgYnVpbGQgYW5kIGlzIHVzZWQgdG8gYnVpbGQgYWxsIHN1cHBvcnRlZCBsYW5ndWFnZXMuICBUaGUgYGNtYWtlYCBidWlsZCBzeXN0ZW0gaGFzIGJlZW4gZGVzaWduYXRlZCBieSB0aGUgcHJvamVjdCB0byByZXBsYWNlIGBhdXRvY29uZmAgaG93ZXZlciB0aGlzIHRyYW5zaXRpb24gd2lsbCB0YWtlIHF1aXRlIHNvbWUgdGltZSB0byBjb21wbGV0ZS4KKworVGhlIExhbmd1YWdlL0xpYnJhcnkgTGV2ZWxzIGluZGljYXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZlcnNpb25zIHRoYXQgYXJlIHVzZWQgaW4gdGhlIFtjb250aW51b3VzIGludGVncmF0aW9uIGVudmlyb25tZW50c10oYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkgKEFwcHZleW9yLCBUcmF2aXMpIGZvciBBcGFjaGUgVGhyaWZ0LiAgT3RoZXIgbGFuZ3VhZ2UgbGV2ZWxzIG1heSBiZSBzdXBwb3J0ZWQgZm9yIGVhY2ggbGFuZ3VhZ2UsIGhvd2V2ZXIgdGVzdGVkIGxlc3MgdGhvcm91Z2hseTsgY2hlY2sgdGhlIFJFQURNRSBmaWxlIGluc2lkZSBlYWNoIGxpYiBkaXJlY3RvcnkgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4gIE5vdGUgdGhhdCB3aGlsZSBhIGxhbmd1YWdlIG1heSBjb250YWluIHN1cHBvcnQgZm9yIHByb3RvY29scywgdHJhbnNwb3J0cywgYW5kIHNlcnZlcnMsIHRoZSBleHRlbnQgdG8gd2hpY2ggZWFjaCBpcyB0ZXN0ZWQgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBidWlsZCBwcm9jZXNzIHZhcmllcy4gIFRoZSBkZWZpbml0aXZlIGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBwcm9qZWN0IGlzIGNhbGxlZCB0aGUgImNyb3NzIiB0ZXN0IHdoaWNoIGV4ZWN1dGVzIGEgdGVzdCBtYXRyaXggd2l0aCBjbGllbnRzIGFuZCBzZXJ2ZXJzIGNvbW11bmljYXRpbmcgYWNyb3NzIGxhbmd1YWdlcy4KKworPHRhYmxlIHN0eWxlPSJmb250LXNpemU6IDYwJTsgcGFkZGluZzogMXB4OyI+Cis8dGhlYWQ+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkJ1aWxkIFN5c3RlbXM8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+TGFuZy9MaWIgTGV2ZWxzIChUZXN0ZWQpPC90aD4KKzx0aCBjb2xzcGFuPTYgYWxpZ249Y2VudGVyPkxvdy1MZXZlbCBUcmFuc3BvcnRzPC90aD4KKzx0aCBjb2xzcGFuPTMgYWxpZ249Y2VudGVyPlRyYW5zcG9ydCBXcmFwcGVyczwvdGg+Cis8dGggY29sc3Bhbj00IGFsaWduPWNlbnRlcj5Qcm90b2NvbHM8L3RoPgorPHRoIGNvbHNwYW49NSBhbGlnbj1jZW50ZXI+U2VydmVyczwvdGg+Cis8dGggcm93c3Bhbj0yPk9wZW4gSXNzdWVzPC90aD4KKzwvdHI+Cis8dHI+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0aD5hdXRvY29uZjwvdGg+PHRoPmNtYWtlPC90aD4KKzwhLS0gTGFuZy9MaWIgTGV2ZWxzIC0tLS0tLS0+PHRoPk1pbjwvdGg+PHRoPk1heDwvdGg+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0aD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X2RvbWFpbl9zb2NrZXQiPkRvbWFpbjwvYT48L3RoPjx0aD4mbmJzcDtGaWxlJm5ic3A7PC90aD48dGg+TWVtb3J5PC90aD48dGg+Jm5ic3A7UGlwZSZuYnNwOzwvdGg+PHRoPlNvY2tldDwvdGg+PHRoPiZuYnNwO1RMUyZuYnNwOzwvdGg+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0aD5GcmFtZWQ8L3RoPjx0aD4mbmJzcDtodHRwJm5ic3A7PC90aD48dGg+Jm5ic3A7emxpYiZuYnNwOzwvdGg+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCI+QmluYXJ5PC9hPjwvdGg+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZCI+Q29tcGFjdDwvYT48L3RoPjx0aD4mbmJzcDtKU09OJm5ic3A7PC90aD48dGg+TXVsdGlwbGV4PC90aD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRoPkZvcmtpbmc8L3RoPjx0aD5Ob25ibG9ja2luZzwvdGg+PHRoPlNpbXBsZTwvdGg+PHRoPlRocmVhZGVkPC90aD48dGg+VGhyZWFkUG9vbDwvdGg+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keT4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvYXMzL1JFQURNRS5tZCI+QWN0aW9uU2NyaXB0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPkFjdGlvblNjcmlwdCAzPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM3MjIiPkFjdGlvblNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY19nbGliL1JFQURNRS5tZCI+QyAoZ2xpYik8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjQ4LjI8L3RkPjx0ZD4yLjU2LjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzg1NCI+QyAoZ2xpYik8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NwcC9SRUFETUUubWQiPkMrKzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5DKys5ODwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzEzIj5DKys8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NzaGFycC9SRUFETUUubWQiPkMjPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Lk5FVCZuYnNwOzMuNSAvIG1vbm8mbmJzcDszLjIuOC4wPC90ZD48dGQ+Lk5FVCZuYnNwOzQuNi4xIC8gbW9ubyZuYnNwOzQuNi4yLjc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM2MiI+QyMgKC5ORVQpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jb2NvYS9SRUFETUUubWQiPkNvY29hPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM5OCI+Q29jb2E8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NsL1JFQURNRS5tZCI+Q29tbW9uIExpc3A8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+U0JDTCAxLjQuNTwvdGQ+PHRkPlNCQ0wgMS40LjE1PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04MiI+Q29tbW9uIExpc3A8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2QvUkVBRE1FLm1kIj5EbGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMDc1LjE8L3RkPjx0ZD4yLjA4My4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTc5MDQiPkQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2RhcnQvUkVBRE1FLm1kIj5EYXJ0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEwLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuMjIuMTwvdGQ+PHRkPjEuMjQuMzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzI4MDA2Ij5EYXJ0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kZWxwaGkvUkVBRE1FLm1kIj5EZWxwaGk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOC4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yMDEwPC90ZD48dGQ+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE2NjAxIj5EZWxwaGk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25ldGNvcmUvUkVBRE1FLm1kIj4uTkVUIENvcmU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTEuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4xLjQ8L3RkPjx0ZD4yLjIuMTAxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMzExNzYiPi5ORVQgQ29yZTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZXJsL1JFQURNRS5tZCI+RXJsYW5nPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MTguMzwvdGQ+PHRkPjIwLjAuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzkwIj5Fcmxhbmc8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2dvL1JFQURNRS5tZCI+R288L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjcuNjwvdGQ+PHRkPjEuMTEuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE0MzA3Ij5HbzwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvaHMvUkVBRE1FLm1kIj5IYXNrZWxsPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjUuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ny4xMC4zPC90ZD48dGQ+OC4wLjI8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjcwNCI+SGFza2VsbDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvaGF4ZS9SRUFETUUubWQiPkhheGU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4zPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4zLjIuMTwvdGQ+PHRkPjMuNC40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMjQzNDciPkhheGU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2phdmEvUkVBRE1FLm1kIj5KYXZhIChTRSk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjguMF8xNTE8L3RkPjx0ZD4xLjguMF8xOTE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNCI+SmF2YSBTRTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvamF2YW1lL1JFQURNRS5tZCI+SmF2YSAoTUUpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjUuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzc1OSI+SmF2YSBNRTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvanMvUkVBRE1FLm1kIj5KYXZhc2NyaXB0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzQxOCI+SmF2YXNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbHVhL1JFQURNRS5tZCI+THVhPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMjwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+NS4xLjU8L3RkPjx0ZD41LjIuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzIyNjU5Ij5MdWE8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25vZGVqcy9SRUFETUUubWQiPm5vZGUuanM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD42Lng8L3RkPjx0ZD44Lng8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNDMyMCI+bm9kZS5qczwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbm9kZXRzL1JFQURNRS5tZCI+bm9kZS50czwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4zLjEuNjwvdGQ+PHRkPjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjByZXNvbHV0aW9uJTIwJTNEJTIwVW5yZXNvbHZlZCUyMGFuZCUyMENvbXBvbmVudCUyMGluJTIwKCUyMlR5cGVTY3JpcHQlMjAtJTIwTGlicmFyeSUyMiklMjBPUkRFUiUyMEJZJTIwcHJpb3JpdHklMjBERVNDJTJDJTIwdXBkYXRlZCUyMERFU0MiPm5vZGUudHM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL29jYW1sL1JFQURNRS5tZCI+T0NhbWw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+NC4wNC4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM2NjAiPk9DYW1sPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9wZXJsL1JFQURNRS5tZCI+UGVybDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMjIuMTwvdGQ+PHRkPjUuMjYuMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzEyIj5QZXJsPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9waHAvUkVBRE1FLm1kIj5QSFA8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD43LjAuMjI8L3RkPjx0ZD43LjIuMTA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjQzMSI+UEhQPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9weS9SRUFETUUubWQiPlB5dGhvbjwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuNy4xMiwgMy41LjI8L3RkPjx0ZD4yLjcuMTVyYzEsIDMuNi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTUiPlB5dGhvbjwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcmIvUkVBRE1FLm1kIj5SdWJ5PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4zLjFwMTEyPC90ZD48dGQ+Mi41LjFwNTc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNiI+UnVieTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcnMvUkVBRE1FLm1kIj5SdXN0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjExLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuMTcuMDwvdGQ+PHRkPjEuMzAuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzMxNDIwIj5SdXN0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9zdC9SRUFETUUubWQiPlNtYWxsdGFsazwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM4NjEiPlNtYWxsdGFsazwvYT48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8dGZvb3Q+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRoPmF1dG9jb25mPC90aD48dGg+Y21ha2U8L3RoPgorPCEtLSBMYW5nL0xpYiBMZXZlbHMgLS0tLS0tLT48dGg+TWluPC90aD48dGg+TWF4PC90aD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRoPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfZG9tYWluX3NvY2tldCI+RG9tYWluPC9hPjwvdGg+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+QnVpbGQgU3lzdGVtczwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5MYW5nL0xpYiBMZXZlbHMgKFRlc3RlZCk8L3RoPgorPHRoIGNvbHNwYW49NiBhbGlnbj1jZW50ZXI+TG93LUxldmVsIFRyYW5zcG9ydHM8L3RoPgorPHRoIGNvbHNwYW49MyBhbGlnbj1jZW50ZXI+VHJhbnNwb3J0IFdyYXBwZXJzPC90aD4KKzx0aCBjb2xzcGFuPTQgYWxpZ249Y2VudGVyPlByb3RvY29sczwvdGg+Cis8dGggY29sc3Bhbj01IGFsaWduPWNlbnRlcj5TZXJ2ZXJzPC90aD4KKzwvdHI+Cis8L3Rmb290PgorPC90YWJsZT4KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCmluZGV4IDlkMTg5ZWYuLjNiNmQ3ZDcgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UKKysrIGIvTElDRU5TRQpAQCAtMjE2LDY5ICsyMTYsNiBAQAogCiBQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgogCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZm9sbG93aW5nIGZpbGVzIGNvbnRhaW4gc29tZSBwb3J0aW9ucyBvZiBjb2RlIGNvbnRyaWJ1dGVkIHVuZGVyCi10aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UgKHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCksIGFuZCByZWxpY2Vuc2VkCi11bmRlciB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlOgotCi0gIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwotICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAotICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaAotICBjb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5Ci0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagotICBsaWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCi0gIGxpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagotICBsaWIvcmIvbGliL3RocmlmdC5yYgotICBsaWIvc3QvUkVBRE1FCi0gIGxpYi9zdC90aHJpZnQuc3QKLSAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKLSAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLSAgdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6CiAKQEAgLTI4OSwzNiArMjI2LDE0IEBACiAjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvbWQ1LltjaF0gY29tcG9uZW50czoKK0ZvciB0aGUgbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanM6CiAKIC8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICBqc29uX3BhcnNlLmpzCisgICAgMjAxNS0wNS0wMgorICAgIFB1YmxpYyBEb21haW4uCisgICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgogCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZvciB0aGUgbGliL3JiL3NldHVwLnJiOiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raSwKLWxpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlIGFuZCBsaWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUgY29tcG9uZW50czoKLSAgICAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwNyAgTWFya3VzIE1vdHRsCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIuMQotKHNlZSBkb2MvbGdwbC0yLjEudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UpCisqLworKEJ5IERvdWdsYXMgQ3JvY2tmb3JkIDxkb3VnbGFzQGNyb2NrZm9yZC5jb20+KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhYmU4N2RhLi41MTE0NTJkCi0tLSBhL01ha2VmaWxlLmFtCisrKyBiL01ha2VmaWxlLmFtCkBAIC0xOSwxNSArMTksMTE3IEBACiAKIEFDTE9DQUxfQU1GTEFHUyA9IC1JIC4vYWNsb2NhbAogCi1TVUJESVJTID0gY29tcGlsZXIvY3BwIGxpYiB0ZXN0CitpZiBXSVRIX1BMVUdJTgorIyBUbyBlbmFibGUgYm9vdHN0cmFwLCBidWlsZCBvcmRlciBpcyBsaWIvY3BwIC0+IGNvbXBpbGVyIC0+IG90aGVycworU1VCRElSUyA9IGxpYi9jcHAgY29tcGlsZXIvY3BwIGxpYgoraWYgV0lUSF9URVNUUworU1VCRElSUyArPSBsaWIvY3BwL3Rlc3QKK2VuZGlmCitlbHNlCitTVUJESVJTID0gY29tcGlsZXIvY3BwIGxpYgorZW5kaWYKKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitpZiBXSVRIX1RVVE9SSUFMCitTVUJESVJTICs9IHR1dG9yaWFsCitlbmRpZgogCiBkaXN0LWhvb2s6Ci0JZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIuZGVwcyIgLW9yIC1pbmFtZSAiLmxpYnMiIC1vciAtaW5hbWUgIi5naXRpZ25vcmUiIFwKLQkJLW9yIC1pbmFtZSAiLkRTX1N0b3JlIiAtb3IgLWluYW1lICIuXyoiIFwpIHwgeGFyZ3Mgcm0gLXJmCisJZmluZCAkKGRpc3RkaXIpIC10eXBlIGYgXCggLWluYW1lICIuRFNfU3RvcmUiIC1vciAtaW5hbWUgIi5fKiIgLW9yIC1pbmFtZSAiLmdpdGlnbm9yZSIgXCkgfCB4YXJncyBybSAtcmYKKwlmaW5kICQoZGlzdGRpcikgLXR5cGUgZCBcKCAtaW5hbWUgIi5kZXBzIiAtb3IgLWluYW1lICIubGlicyIgXCkgfCB4YXJncyBybSAtcmYKIAlmaW5kICQoZGlzdGRpcikgLXR5cGUgZCBcKCAtaW5hbWUgIi5zdm4iIC1vciAtaW5hbWUgIi5naXQiIFwpIHwgeGFyZ3Mgcm0gLXJmCiAKIHByaW50LXZlcnNpb246Ci0JQGVjaG8gJChWRVJTSU9OKQorCUBlY2hvICQoUEFDS0FHRV9WRVJTSU9OKQogCi1FWFRSQV9ESVNUID0gZG9jIHR1dG9yaWFsIGNvbnRyaWIgXAotICAgICAgICAgICAgIENPTlRSSUJVVE9SUyBMSUNFTlNFIENIQU5HRVMgRElTQ0xBSU1FUiBOT1RJQ0UKKy5QSE9OWTogcHJlY3Jvc3MgY3Jvc3MKK3ByZWNyb3NzLSU6IGFsbAorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiBhbGwgcHJlY3Jvc3MtdGVzdCBwcmVjcm9zcy1saWIKKworZW1wdHkgOj0KK3NwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCitjb21tYSA6PSAsCisKK0NST1NTX0xBTkdTID0gQE1BWUJFX0NQUEAgQE1BWUJFX0NfR0xJQkAgQE1BWUJFX0NMQCBATUFZQkVfREAgQE1BWUJFX0pBVkFAIEBNQVlCRV9DU0hBUlBAIEBNQVlCRV9QWVRIT05AIEBNQVlCRV9QWTNAIEBNQVlCRV9SVUJZQCBATUFZQkVfSEFTS0VMTEAgQE1BWUJFX1BFUkxAIEBNQVlCRV9QSFBAIEBNQVlCRV9HT0AgQE1BWUJFX05PREVKU0AgQE1BWUJFX0RBUlRAIEBNQVlCRV9FUkxBTkdAIEBNQVlCRV9MVUFAIEBNQVlCRV9SU0AgQE1BWUJFX0RPVE5FVENPUkVAIEBNQVlCRV9OT0RFVFNACitDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoQ1JPU1NfTEFOR1MpKQorCitpZiBXSVRIX1BZMworQ1JPU1NfUFk9JChQWVRIT04zKQorZWxzZQorQ1JPU1NfUFk9JChQWVRIT04pCitlbmRpZgorCitpZiBXSVRIX1BZVEhPTgorY3Jvc3NmZWF0dXJlOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1mZWF0dXJlcyAuKiAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpCitlbHNlCisjIGZlYXR1cmUgdGVzdCBuZWVkcyBweXRob24gYnVpbGQKK2Nyb3NzZmVhdHVyZToKK2VuZGlmCisKK2Nyb3NzLSU6IHByZWNyb3NzIGNyb3NzZmVhdHVyZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLWNsaWVudCAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1yZWdleCAiJCoiCisKK2Nyb3NzOiBjcm9zcy0uKgorCitUSU1FUyA9IDEgMiAzCitmYWlsOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSB8fCB0cnVlCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW92ZXJ3cml0ZQorCSQoZm9yZWFjaCB2YXIsJChUSU1FUyksdGVzdC90ZXN0LnB5IC1zIHx8IHRydWU7dGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW1lcmdlOykKKworY29kZXNwZWxsX3NraXBfZmlsZXMgPSBcCisJKi5qYXIgXAorCSouY2xhc3MgXAorCSouc28gXAorCSouYSBcCisJKi5sYSBcCisJKi5vIFwKKwkqLnAxMiBcCisJKk9DYW1sTWFrZWZpbGUgXAorCS5rZXlzdG9yZSBcCisJLnRydXN0c3RvcmUgXAorCUNIQU5HRVMgXAorCWNvbmZpZy5zdWIgXAorCWNvbmZpZ3VyZSBcCisJZGVwY29tcCBcCisJbGlidG9vbC5tNCBcCisJb3V0cHV0LiogXAorCXJlYmFyIFwKKwl0aHJpZnQKKworc2tpcHBlZF9maWxlcyA9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChjb2Rlc3BlbGxfc2tpcF9maWxlcykpCisKK3N0eWxlLWxvY2FsOgorCWNvZGVzcGVsbCAtLXdyaXRlLWNoYW5nZXMgLS1za2lwPSQoc2tpcHBlZF9maWxlcykgLS1kaXNhYmxlLWNvbG9ycworCitFWFRSQV9ESVNUID0gXAorCS5jbGFuZy1mb3JtYXQgXAorCS5lZGl0b3Jjb25maWcgXAorCS50cmF2aXMueW1sIFwKKwkucnVzdGZtdC50b21sIFwKKwkuZG9ja2VyaWdub3JlIFwKKwlhcHB2ZXlvci55bWwgXAorCWJvd2VyLmpzb24gXAorCWJ1aWxkIFwKKwlib290c3RyYXAuc2ggXAorCWNsZWFudXAuc2ggXAorCUNNYWtlTGlzdHMudHh0IFwKKwljb21wb3Nlci5qc29uIFwKKwljb250cmliIFwKKwlDT05UUklCVVRJTkcubWQgXAorCWRlYmlhbiBcCisJZG9jIFwKKwlkb2FwLnJkZiBcCisJcGFja2FnZS5qc29uIFwKKwlzb25hci1wcm9qZWN0LnByb3BlcnRpZXMgXAorCUxBTkdVQUdFUy5tZCBcCisJTElDRU5TRSBcCisJQ0hBTkdFUyBcCisJTk9USUNFIFwKKwlSRUFETUUubWQgXAorCVRocmlmdC5wb2RzcGVjCmRpZmYgLS1naXQgYS9ORVdTIGIvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2OWY2MS4uMDAwMDAwMAotLS0gYS9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotUmVsZWFzZSBOb3RlcyBmb3IgVGhyaWZ0IDIwMDgwNDExCi0KLS5lcXVhbHMgYW5kIC5oYXNoQ29kZSgpIGZvciBKYXZhIHNjdHVyY3RzIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotSW1wcm92bWVudHMgdG8gdGhlIEMrKyBUU29ja2V0UG9vbCAoZGV2ZWxvcGVkIGJ5IGFraGlsKS4KLQotUEhQIChkZSlzZXJpYWxpemF0aW9uIGV4dGVuc2lvbiAoZGV2ZWxvcGVkIGJ5IGR3ZWF0aGVyZm9yZCkuCi0KLUFkZCBmYjMwMyB0byBjb250cmliIChkZXZlbG9wZWQgYnkgRmFjZWJvb2spLgotCi1USlNPTlByb3RvY29sIGZvciBDKysgYW5kIEphdmEgKGNvbnRyaWJ1dGVkIGJ5IENoYWQgV2FsdGVycyBvZiBQb3dlcnNldCkuCi0KLVN1cHBvcnQgZm9yICJtYWtlIGNoZWNrIiBhbmQgYmV0dGVyIHRlc3RzIChjb250cmlidXRlZCBieSBOaXRheSkuCi0KLVNtYWxsdGFsayBzdXBwb3J0IChjb250cmlidXRlZCBieSBQYXRyaWNrIENvbGxpc29uKS4KLQotRGF2ZSBTaW1wc29uIDxkYXZlQHBvd2Vyc2V0LmNvbT4KLUJldHRlciBzdXBwb3J0IGZvciBjb25uZWN0aW9uIHRyYWNraW5nIGluIHRoZSBDKysgc2VydmVyIChjb250cmlidXRlZCBieQotRGF2ZSBTaW1wc29uIG9mIFBvd2Vyc2V0KS4KLQotUGVybCBIdHRwQ2xpZW50IChjb250cmlidXRlZCBieSBJZ29yIEFmYW5hc3lldiBvZiBFdmVybm90ZSkuCi0KLUMjIHN1cHBvcnQgKGNvbnRyaWJ1dGVkIGJ5IFRvZGQgQmVybWFuIG9mIGltZWVtKS4KLQotTWluR1cgcG9ydCBvZiB0aGUgY29tcGlsZXIgKGNvbnRyaWJ1dGVkIGJ5IFRvZGQgQmVybWFuIG9mIGltZWVtKS4KLQotVG9ucyBvZiBzbWFsbCBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KLQotCi1SZWxlYXNlIE5vdGVzIGZvciBUaHJpZnQgMjAwNzA5MTcKLQotVEJpbmFyeVByb3RvY29sIG5vdyBpbmNsdWRlcyBhIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIG1lc3NhZ2VkLgotVGhpcyBpcyBhIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2UuICBQbGVhc2Ugc2VlIHRoZQotVEJpbmFyeVByb3RvY29sIGNvbnN0cnVjdG9yIGZvciBzdHJpY3RSZWFkXyBhbmQgc3RyaWN0V3JpdGVfLgotCi1BZGQgYmluYXJ5IHR5cGUgdG8gc3VwcG9ydCBub24tdGV4dCAic3RyaW5ncyIgaW4gSmF2YS4KLQotVFNvY2tldFBvb2wgZm9yIEMrKyAoZGV2ZWxvcGVkIGJ5IGpzb2JlbCkuCi0KLVN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHZpbSBhbmQgZW1hY3MgKGRldmVsb3BlZCBieSBoemhhbyBhbmQgbWFydGluKS4KLQotUGVybCBzdXBwb3J0IChjb250cmlidXRlZCBieSBKYWtlIEx1Y2lhbmkpLgotCi1Fcmxhbmcgc3VwcG9ydCAoZGV2ZWxvcGVkIGJ5IGNwaXJvKS4KLQotUnVieSBBUEkgb3ZlcmhhdWwgKGNvbnRyaWJ1dGVkIGJ5IEtldmluIENsYXJrIG9mIFBvd2Vyc2V0KS4KLQotSVB2NiBzdXBwb3J0IGluIEMrKyBhbmQgUHl0aG9uIChjb250cmlidXRlZCBieSBQYXVsIFNhYWIgb2YgUG93ZXJzZXQpLgotCi1SZWFkL1dyaXRlIGxvY2tzIChkZXZlbG9wZWQgYnkgYm96KS4KLQotT0NhbWwgc3VwcG9ydCAoZGV2ZWxvcGVkIGJ5IGlwcm9jdG9yKS4KLQotSHVtYW4tcmVhZGFibGUgc3RyaW5ncyBmcm9tIFRocmlmdCBzdHJ1Y3R1cmVzIGluIEMrKyAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLUhhc2tlbGwgc3VwcG9ydCAoZGV2ZWxvcGVkIGJ5IGlwcm9jdG9yKS4KLQotU3VwcG9ydCBmb3Igb3B0aW9uYWwgZmllbGRzIGluIEMrKyAoY29udHJpYnV0ZWQgYnkgQW5keSBMdXRvbWlyc2t5KS4KLQotU3VwcG9ydCBmb3Igb3BlcmF0b3I9PSBmb3IgVGhyaWZ0IHN0cnVjdHVyZXMgKGNvbnRyaWJ1dGVkIGJ5IEFuZHkgTHV0b21pcnNreSkuCi0KLVB5dGhvbi9DIG1vZHVsZSBmb3IgZmFzdCAoZGUpc2VyaWFsaXphdGlvbiAoY29udHJpYnV0ZWQgYnkgQmVuIE1hdXJlcikuCi0KLUxpbWl0ZWQgcmVmbGVjdGlvbiBmb3IgQysrIHNlcnZpY2VzIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotUHl0aG9uIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGRlZmF1bHRzIHRvIC91c3IsIG92ZXJyaWRlIHdpdGggUFlfUFJFRklYLgotCi1TdXBwb3J0IGZvciBKYXZhYmVhbi1zdHlsZSBKYXZhIGNsYXNzZXMgKGNvbnRyaWJ1dGVkIGJ5IERhdmUgRW5nYmVyZykuCi0KLVREZW5zZVByb3RvY29sIGZvciBDKysgKGV4cGVyaW1lbnRhbCB3YXkgdG8gc2hyaW5rIHN0cnVjdHVyZXMpCi0oZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLUNvY29hL09iamVjdGl2ZSBDIHN1cHBvcnQgKGNvbnRyaWJ1dGVkIGJ5IEFuZHJldyBNY0dlYWNoaWUpLgotCi1UaHJpZnQgbm93IGJ1aWxkcyB3aXRob3V0IGxpYmV2ZW50LgotCi1UWmxpYlRyYW5zcG9ydCBmb3IgQysrIChjb21wcmVzcyBzZXJpYWxpemVkIHN0cnVjdHVyZXMpIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotVG9ucyBvZiBzbWFsbCBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQppbmRleCBjMjM5OTVhLi45MDJkYzhkIDEwMDY0NAotLS0gYS9OT1RJQ0UKKysrIGIvTk9USUNFCkBAIC0xLDUgKzEsNSBAQAogQXBhY2hlIFRocmlmdAotQ29weXJpZ2h0IDIwMDYtMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCitDb3B5cmlnaHQgMjAwNi0yMDE3IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KIAogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDRmNjVlLi4wMDAwMDAwCi0tLSBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi1BcGFjaGUgVGhyaWZ0Ci0KLUxhc3QgTW9kaWZpZWQ6IDIwMTAtTm92LTA0Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLVRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCi1hc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4gVGhyaWZ0IHByb3ZpZGVzIGNsZWFuCi1hYnN0cmFjdGlvbnMgZm9yIGRhdGEgdHJhbnNwb3J0LCBkYXRhIHNlcmlhbGl6YXRpb24sIGFuZCBhcHBsaWNhdGlvbgotbGV2ZWwgcHJvY2Vzc2luZy4gVGhlIGNvZGUgZ2VuZXJhdGlvbiBzeXN0ZW0gdGFrZXMgYSBzaW1wbGUgZGVmaW5pdGlvbgotbGFuZ3VhZ2UgYXMgaXRzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKLXVzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KLQotVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCi1hY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KLQotRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCB0YWtlIGEgZ2FuZGVyIGF0Ci10aGUgVGhyaWZ0IHdoaXRlcGFwZXIgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gb3IgYXQgdGhlIFJFQURNRSBmaWxlcwotaW4geW91ciBwYXJ0aWN1bGFyIHN1YmRpcmVjdG9yeSBvZiBpbnRlcmVzdC4KLQotSGllcmFyY2h5Ci09PT09PT09PT0KLQotdGhyaWZ0LwotCi0gIGNvbXBpbGVyLwotICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIsIGltcGxlbWVudGVkIGluIEMrKy4KLQotICBsaWIvCi0gICAgQ29udGFpbnMgdGhlIFRocmlmdCBzb2Z0d2FyZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLCBzdWJkaXZpZGVkIGJ5Ci0gICAgbGFuZ3VhZ2Ugb2YgaW1wbGVtZW50YXRpb24uCi0KLSAgICBjcHAvCi0gICAgamF2YS8KLSAgICBwaHAvCi0gICAgcHkvCi0gICAgcmIvCi0KLSAgdGVzdC8KLQotICAgIENvbnRhaW5zIHNhbXBsZSBUaHJpZnQgZmlsZXMgYW5kIHRlc3QgY29kZSBhY3Jvc3MgdGhlIHRhcmdldCBwcm9ncmFtbWluZwotICAgIGxhbmd1YWdlcy4KLQotICB0dXRvcmlhbC8KLQotICAgIENvbnRhaW5zIGEgYmFzaWMgdHV0b3JpYWwgdGhhdCB3aWxsIHRlYWNoIHlvdSBob3cgdG8gZGV2ZWxvcCBzb2Z0d2FyZQotICAgIHVzaW5nIFRocmlmdC4KLQotUmVxdWlyZW1lbnRzCi09PT09PT09PT09PT0KLQotU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdFJlcXVpcmVtZW50cyBmb3IKLWFuIHVwLXRvLWRhdGUgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMuCi0KLVJlc291cmNlcwotPT09PT09PT09Ci0KLU1vcmUgaW5mb3JtYXRpb24gYWJvdXQgVGhyaWZ0IGNhbiBiZSBvYnRhaW5lZCBvbiB0aGUgVGhyaWZ0IHdlYnBhZ2UgYXQ6Ci0KLSAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCi0KLUFja25vd2xlZGdtZW50cwotPT09PT09PT09PT09PT09Ci0KLVRocmlmdCB3YXMgaW5zcGlyZWQgYnkgcGlsbGFyLCBhIGxpZ2h0d2VpZ2h0IFJQQyB0b29sIHdyaXR0ZW4gYnkgQWRhbSBEJ0FuZ2VsbywKLWFuZCBhbHNvIGJ5IEdvb2dsZSdzIHByb3RvY29sIGJ1ZmZlcnMuCi0KLUluc3RhbGxhdGlvbgotPT09PT09PT09PT09Ci0KLUlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSB0aGUgZmlyc3QgdGltZSBvdXQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5LCB5b3Ugd2lsbAotbmVlZCB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdHMuICAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdQotZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86Ci0KLQkuL2Jvb3RzdHJhcC5zaAotCi1PbmNlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBhcmUgZ2VuZXJhdGVkLCB0aHJpZnQgY2FuIGJlIGNvbmZpZ3VyZWQuCi1Gcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKLQotCS4vY29uZmlndXJlCi0KLVlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9vc3QgZmlsZXMgZXhwbGljaXRseS4KLUlmIHlvdSBpbnN0YWxsZWQgYm9vc3QgaW4gL3Vzci9sb2NhbCwgeW91IHdvdWxkIHJ1biBjb25maWd1cmUgYXMgZm9sbG93czoKLQotCS4vY29uZmlndXJlIC0td2l0aC1ib29zdD0vdXNyL2xvY2FsCi0KLU5vdGUgdGhhdCBieSBkZWZhdWx0IHRoZSB0aHJpZnQgQysrIGxpYnJhcnkgaXMgdHlwaWNhbGx5IGJ1aWx0IHdpdGggZGVidWdnaW5nCi1zeW1ib2xzIGluY2x1ZGVkLiBJZiB5b3Ugd2FudCB0byBjdXN0b21pemUgdGhlc2Ugb3B0aW9ucyB5b3Ugc2hvdWxkIHVzZSB0aGUKLUNYWEZMQUdTIG9wdGlvbiBpbiBjb25maWd1cmUsIGFzIHN1Y2g6Ci0KLSAgICAgICAgLi9jb25maWd1cmUgQ1hYRkxBR1M9Jy1nIC1PMicKLSAgICAgICAgLi9jb25maWd1cmUgQ0ZMQUdTPSctZyAtTzInCi0gICAgICAgIC4vY29uZmlndXJlIENQUEZMQUdTPSctRERFQlVHX01ZX0ZFQVRVUkUnCi0KLVJ1biAuL2NvbmZpZ3VyZSAtLWhlbHAgdG8gc2VlIG90aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotCi1QbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgUHl0aG9uIGxpYnJhcnkgd2lsbCBpZ25vcmUgdGhlIC0tcHJlZml4IG9wdGlvbgotYW5kIGp1c3QgaW5zdGFsbCB3aGVyZXZlciBQeXRob24ncyBkaXN0dXRpbHMgcHV0cyBpdCAodXN1YWxseSBhbG9uZwotdGhlIGxpbmVzIG9mIC91c3IvbGliL3B5dGhvblguWS9zaXRlLXBhY2thZ2VzLykuICBJZiB5b3UgbmVlZCB0byBjb250cm9sCi13aGVyZSB0aGUgUHl0aG9uIG1vZHVsZXMgYXJlIGluc3RhbGxlZCwgc2V0IHRoZSBQWV9QUkVGSVggdmFyaWFibGUuCi0oREVTVERJUiBpcyByZXNwZWN0ZWQgZm9yIFB5dGhvbiBhbmQgQysrLikKLQotTWFrZSB0aHJpZnQ6Ci0KLQltYWtlCi0KLUZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGJlY29tZSBzdXBlcnVzZXIgYW5kIGRvOgotCi0JbWFrZSBpbnN0YWxsCi0KLU5vdGUgdGhhdCBzb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzCi1iZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcyAoYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGlzIGFwcGxpZXMKLXRvIEphdmEsIFJ1YnksIFBIUCkuCi0KLUxvb2sgZm9yIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgbGliLzxsYW5ndWFnZT4vIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQotaW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOWU2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwxOTIgQEAKK0FwYWNoZSBUaHJpZnQKKz09PT09PT09PT09PT0KKworSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4KK2Fzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgcG9pbnQtdG8tcG9pbnQgUlBDLiBUaHJpZnQgcHJvdmlkZXMgCitjbGVhbiBhYnN0cmFjdGlvbnMgZm9yIGRhdGEgdHJhbnNwb3J0LCBkYXRhIHNlcmlhbGl6YXRpb24sIGFuZCBhcHBsaWNhdGlvbgorbGV2ZWwgcHJvY2Vzc2luZy4gVGhlIGNvZGUgZ2VuZXJhdGlvbiBzeXN0ZW0gdGFrZXMgYSBzaW1wbGUgZGVmaW5pdGlvbgorbGFuZ3VhZ2UgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBjb2RlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhhdAordXNlcyB0aGUgYWJzdHJhY3RlZCBzdGFjayB0byBidWlsZCBpbnRlcm9wZXJhYmxlIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorCishW0FwYWNoZSBUaHJpZnQgTGF5ZXJlZCBBcmNoaXRlY3R1cmVdKGRvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcpCisKK1RocmlmdCBtYWtlcyBpdCBlYXN5IGZvciBwcm9ncmFtcyB3cml0dGVuIGluIGRpZmZlcmVudCBwcm9ncmFtbWluZworbGFuZ3VhZ2VzIHRvIHNoYXJlIGRhdGEgYW5kIGNhbGwgcmVtb3RlIHByb2NlZHVyZXMuICBXaXRoIHN1cHBvcnQgCitmb3IgWzI1IHByb2dyYW1taW5nIGxhbmd1YWdlc10oTEFOR1VBR0VTLm1kKSwgY2hhbmNlcyBhcmUgVGhyaWZ0IAorc3VwcG9ydHMgdGhlIGxhbmd1YWdlcyB0aGF0IHlvdSBjdXJyZW50bHkgdXNlLgorCitUaHJpZnQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHN1cHBvcnQgbm9uLWF0b21pYyB2ZXJzaW9uIGNoYW5nZXMKK2Fjcm9zcyBjbGllbnQgYW5kIHNlcnZlciBjb2RlLgorCitGb3IgbW9yZSBkZXRhaWxzIG9uIFRocmlmdCdzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24sIHNlZSB0aGUgVGhyaWZ0Cit3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBvciBhdCB0aGUgUkVBRE1FLm1kIGZpbGUKK2luIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCisKK1N0YXR1cworPT09PT09CisKK3wgQnJhbmNoIHwgVHJhdmlzIHwgQXBwdmV5b3IgfCBDb3Zlcml0eSBTY2FuIHwgY29kZWNvdi5pbyB8IFdlYnNpdGUgfAorfCA6LS0tLS0gfCA6LS0tLS0gfCA6LS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tIHwgOi0tLS0tLSB8Cit8IFtgbWFzdGVyYF0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvdHJlZS9tYXN0ZXIpIHwgWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdC5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvdGhyaWZ0KSB8IFshW0J1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy9naXRodWIvYXBhY2hlL3RocmlmdD9icmFuY2g9bWFzdGVyJnN2Zz10cnVlKV0oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9BcGFjaGVTb2Z0d2FyZUZvdW5kYXRpb24vdGhyaWZ0L2hpc3RvcnkpIHwgWyFbQ292ZXJpdHkgU2NhbiBCdWlsZCBTdGF0dXNdKGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vcHJvamVjdHMvMTM0NS9iYWRnZS5zdmcpXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzL3RocmlmdCkgfCB8IFshW1dlYnNpdGVdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvb2ZmaWNpYWwtd2Vic2l0ZS1icmlnaHRncmVlbi5zdmcpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnLykgfAorCitSZWxlYXNlcworPT09PT09PT0KKworVGhyaWZ0IGRvZXMgbm90IG1haW50YWluIGEgc3BlY2lmaWMgcmVsZWFzZSBjYWxlbmRhciBhdCB0aGlzIHRpbWUuICAKKworV2Ugc3RyaXZlIHRvIHJlbGVhc2UgdHdpY2UgeWVhcmx5LiAgRG93bmxvYWQgdGhlIFtjdXJyZW50IHJlbGVhc2VdKGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb3dubG9hZCkuCisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1Byb2plY3QgSGllcmFyY2h5Cis9PT09PT09PT09PT09PT09PQorCit0aHJpZnQvCisKKyAgY29tcGlsZXIvCisKKyAgICBDb250YWlucyB0aGUgVGhyaWZ0IGNvbXBpbGVyLCBpbXBsZW1lbnRlZCBpbiBDKysuCisKKyAgbGliLworCisgICAgQ29udGFpbnMgdGhlIFRocmlmdCBzb2Z0d2FyZSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLCBzdWJkaXZpZGVkIGJ5CisgICAgbGFuZ3VhZ2Ugb2YgaW1wbGVtZW50YXRpb24uCisKKyAgICBjcHAvCisgICAgZ28vCisgICAgamF2YS8KKyAgICBwaHAvCisgICAgcHkvCisgICAgcmIvCisgICAgLi4uCisKKyAgdGVzdC8KKworICAgIENvbnRhaW5zIHNhbXBsZSBUaHJpZnQgZmlsZXMgYW5kIHRlc3QgY29kZSBhY3Jvc3MgdGhlIHRhcmdldCBwcm9ncmFtbWluZworICAgIGxhbmd1YWdlcy4KKworICB0dXRvcmlhbC8KKworICAgIENvbnRhaW5zIGEgYmFzaWMgdHV0b3JpYWwgdGhhdCB3aWxsIHRlYWNoIHlvdSBob3cgdG8gZGV2ZWxvcCBzb2Z0d2FyZQorICAgIHVzaW5nIFRocmlmdC4KKworRGV2ZWxvcG1lbnQKKz09PT09PT09PT09CisKK1RvIGJ1aWxkIHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgYnVpbGRzIHRoZSBwcm9qZWN0IHlvdSBzaG91bGQgdXNlIGRvY2tlci4KK1dlIGhhdmUgW2NvbXByZWhlbnNpdmUgYnVpbGRpbmcgaW5zdHJ1Y3Rpb25zIGZvciBkb2NrZXJdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpLgorCitSZXF1aXJlbWVudHMKKz09PT09PT09PT09PQorCitTZWUgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvaW5zdGFsbCBmb3IgYSBsaXN0IG9mIGJ1aWxkIHJlcXVpcmVtZW50cyAobWF5IGJlIHN0YWxlKS4gIEFsdGVybmF0aXZlbHkgc2VlIHRoZSBkb2NrZXIgYnVpbGQgZW52aXJvbm1lbnRzIGZvciBhIGxpc3Qgb2YgcHJlcmVxdWlzaXRlcy4KKworUmVzb3VyY2VzCis9PT09PT09PT0KKworTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBUaHJpZnQgY2FuIGJlIG9idGFpbmVkIG9uIHRoZSBUaHJpZnQgd2VicGFnZSBhdDoKKworICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworQWNrbm93bGVkZ21lbnRzCis9PT09PT09PT09PT09PT0KKworVGhyaWZ0IHdhcyBpbnNwaXJlZCBieSBwaWxsYXIsIGEgbGlnaHR3ZWlnaHQgUlBDIHRvb2wgd3JpdHRlbiBieSBBZGFtIEQnQW5nZWxvLAorYW5kIGFsc28gYnkgR29vZ2xlJ3MgcHJvdG9jb2wgYnVmZmVycy4KKworSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT0KKworSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHRoZSBmaXJzdCB0aW1lIG91dCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnksIHlvdSB3aWxsCituZWVkIHRvIGdlbmVyYXRlIHRoZSBjb25maWd1cmUgc2NyaXB0cy4gIChUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaWYgeW91Citkb3dubG9hZGVkIGEgdGFyYmFsbC4pICBGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworICAgIC4vYm9vdHN0cmFwLnNoCisKK09uY2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGFyZSBnZW5lcmF0ZWQsIHRocmlmdCBjYW4gYmUgY29uZmlndXJlZC4KK0Zyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgorCisgICAgLi9jb25maWd1cmUKKworWW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBib29zdCBmaWxlcyBleHBsaWNpdGx5LgorSWYgeW91IGluc3RhbGxlZCBib29zdCBpbiAvdXNyL2xvY2FsLCB5b3Ugd291bGQgcnVuIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgLS13aXRoLWJvb3N0PS91c3IvbG9jYWwKKworTm90ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIHRocmlmdCBDKysgbGlicmFyeSBpcyB0eXBpY2FsbHkgYnVpbHQgd2l0aCBkZWJ1Z2dpbmcKK3N5bWJvbHMgaW5jbHVkZWQuIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGVzZSBvcHRpb25zIHlvdSBzaG91bGQgdXNlIHRoZQorQ1hYRkxBR1Mgb3B0aW9uIGluIGNvbmZpZ3VyZSwgYXMgc3VjaDoKKworICAgIC4vY29uZmlndXJlIENYWEZMQUdTPSctZyAtTzInCisgICAgLi9jb25maWd1cmUgQ0ZMQUdTPSctZyAtTzInCisgICAgLi9jb25maWd1cmUgQ1BQRkxBR1M9Jy1EREVCVUdfTVlfRkVBVFVSRScKKworVG8gZW5hYmxlIGdjb3YgcmVxdWlyZWQgb3B0aW9ucyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UgZW5hYmxlIHRoZW06CisKKyAgICAuL2NvbmZpZ3VyZSAgLS1lbmFibGUtY292ZXJhZ2UKKworUnVuIC4vY29uZmlndXJlIC0taGVscCB0byBzZWUgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zCisKK1BsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBQeXRob24gbGlicmFyeSB3aWxsIGlnbm9yZSB0aGUgLS1wcmVmaXggb3B0aW9uCithbmQganVzdCBpbnN0YWxsIHdoZXJldmVyIFB5dGhvbidzIGRpc3R1dGlscyBwdXRzIGl0ICh1c3VhbGx5IGFsb25nCit0aGUgbGluZXMgb2YgL3Vzci9saWIvcHl0aG9uWC5ZL3NpdGUtcGFja2FnZXMvKS4gIElmIHlvdSBuZWVkIHRvIGNvbnRyb2wKK3doZXJlIHRoZSBQeXRob24gbW9kdWxlcyBhcmUgaW5zdGFsbGVkLCBzZXQgdGhlIFBZX1BSRUZJWCB2YXJpYWJsZS4KKyhERVNURElSIGlzIHJlc3BlY3RlZCBmb3IgUHl0aG9uIGFuZCBDKysuKQorCitNYWtlIHRocmlmdDoKKworCW1ha2UKKworRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgYmVjb21lIHN1cGVydXNlciBhbmQgZG86CisKKwltYWtlIGluc3RhbGwKKworTm90ZSB0aGF0IHNvbWUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgYnVpbGQgdG9vbHMKK2JldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzIChhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgYXBwbGllcwordG8gSmF2YSwgUnVieSwgUEhQKS4KKworTG9vayBmb3IgdGhlIFJFQURNRS5tZCBmaWxlIGluIHRoZSBsaWIvPGxhbmd1YWdlPi8gZm9sZGVyIGZvciBtb3JlIGRldGFpbHMgb24gdGhlCitpbnN0YWxsYXRpb24gb2YgZWFjaCBsYW5ndWFnZSBsaWJyYXJ5IHBhY2thZ2UuCisKK1Rlc3RpbmcKKz09PT09PT0KKworVGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIGNsaWVudCBsaWJyYXJ5IHRlc3RzIHRoYXQgY2FuIGFsbCBiZSBydW4KK2Zyb20gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisKKyAgICAgICAgICBtYWtlIC1rIGNoZWNrCisKK1RoaXMgd2lsbCBtYWtlIGFsbCBvZiB0aGUgbGlicmFyaWVzIChhcyBuZWNlc3NhcnkpLCBhbmQgcnVuIHRocm91Z2gKK3RoZSB1bml0IHRlc3RzIGRlZmluZWQgaW4gZWFjaCBvZiB0aGUgY2xpZW50IGxpYnJhcmllcy4gSWYgYSBzaW5nbGUKK2xhbmd1YWdlIGZhaWxzLCB0aGUgbWFrZSBjaGVjayB3aWxsIGNvbnRpbnVlIG9uIGFuZCBwcm92aWRlIGEgc3lub3BzaXMKK2F0IHRoZSBlbmQuCisKK1RvIHJ1biB0aGUgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZSwgcGxlYXNlIHJ1bjoKKworICAgICAgICAgIG1ha2UgY3Jvc3MKKworVGhpcyB3aWxsIHJ1biBhIHNldCBvZiB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgY2xpZW50cyBhbmQKK3NlcnZlcnMuCisKKwpkaWZmIC0tZ2l0IGEvVGhyaWZ0LXN3aWZ0My5wb2RzcGVjIGIvVGhyaWZ0LXN3aWZ0My5wb2RzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNmMwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9UaHJpZnQtc3dpZnQzLnBvZHNwZWMKQEAgLTAsMCArMSwxNiBAQAorUG9kOjpTcGVjLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICAgID0gIlRocmlmdC1zd2lmdDMiCisgIHMudmVyc2lvbiAgICAgICA9ICIxLjAuMCIKKyAgcy5zdW1tYXJ5ICAgICAgID0gIkFwYWNoZSBUaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbiBhc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4iCisgIHMuZGVzY3JpcHRpb24gICA9IDw8LURFU0MKK1RoZSBBcGFjaGUgVGhyaWZ0IHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNvZnR3YXJlIGZyYW1ld29yayBmb3IgbmV0d29ya2VkIHNlcnZpY2VzIGRldmVsb3BtZW50IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisgICAgICAgICAgICAgICAgICAgIERFU0MKKyAgcy5ob21lcGFnZSAgICAgID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgcy5saWNlbnNlICAgICAgID0geyA6dHlwZSA9PiAnQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wJywgOnVybCA9PiAnaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcgfQorICBzLmF1dGhvciAgICAgICAgPSB7ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiID0+ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciIH0KKyAgcy5pb3MuZGVwbG95bWVudF90YXJnZXQgPSAnOS4wJworICBzLm9zeC5kZXBsb3ltZW50X3RhcmdldCA9ICcxMC4xMCcKKyAgcy5yZXF1aXJlc19hcmMgID0gdHJ1ZQorICBzLnNvdXJjZSAgICAgICAgPSB7IDpnaXQgPT4gImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsIDp0YWcgPT4gInYxLjAuMCIgfQorICBzLnNvdXJjZV9maWxlcyAgPSAibGliL3N3aWZ0L1NvdXJjZXMvKi5zd2lmdCIKK2VuZApkaWZmIC0tZ2l0IGEvVGhyaWZ0LnBvZHNwZWMgYi9UaHJpZnQucG9kc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA2ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvVGhyaWZ0LnBvZHNwZWMKQEAgLTAsMCArMSwxOCBAQAorUG9kOjpTcGVjLm5ldyBkbyB8c3wKKyAgcy5uYW1lICAgICAgICAgID0gIlRocmlmdCIKKyAgcy52ZXJzaW9uICAgICAgID0gIjEuMC4wIgorICBzLnN1bW1hcnkgICAgICAgPSAiQXBhY2hlIFRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuIGFzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgUlBDLiIKKyAgcy5kZXNjcmlwdGlvbiAgID0gPDwtREVTQworVGhlIEFwYWNoZSBUaHJpZnQgc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc29mdHdhcmUgZnJhbWV3b3JrIGZvciBuZXR3b3JrZWQgc2VydmljZXMgZGV2ZWxvcG1lbnQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KKyAgICAgICAgICAgICAgICAgICAgREVTQworICBzLmhvbWVwYWdlICAgICAgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICBzLmxpY2Vuc2UgICAgICAgPSB7IDp0eXBlID0+ICdBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAnLCA6dXJsID0+ICdodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJyB9CisgIHMuYXV0aG9yICAgICAgICA9IHsgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIgPT4gImRldkB0aHJpZnQuYXBhY2hlLm9yZyIgfQorICBzLnJlcXVpcmVzX2FyYyAgPSB0cnVlCisgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzcuMCcKKyAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuOCcKKyAgcy5pb3MuZnJhbWV3b3JrID0gJ0NGTmV0d29yaycKKyAgcy5vc3guZnJhbWV3b3JrID0gJ0NvcmVTZXJ2aWNlcycKKyAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ2MS4wLjAiIH0KKyAgcy5zb3VyY2VfZmlsZXMgID0gJ2xpYi9jb2NvYS9zcmMvKiovKi57aCxtLHN3aWZ0fScKK2VuZApkaWZmIC0tZ2l0IGEvYWNsb2NhbC9hY19wcm9nX2Jpc29uLm00IGIvYWNsb2NhbC9hY19wcm9nX2Jpc29uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTE5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQKQEAgLTAsMCArMSw1NCBAQAorZG5sCitkbmwgQ2hlY2sgQmlzb24gdmVyc2lvbgorZG5sIEFDX1BST0dfQklTT04oW01JTl9WRVJTSU9OPTIuNF0pCitkbmwKK2RubCBXaWxsIGRlZmluZSBCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OIGlmIEF1dG9tYWtlIGlzIDwgMS4xMQorZG5sIGZvciB1c2Ugd2l0aCAuaCBpbmNsdWRlcy4KK2RubAorCitBQ19ERUZVTihbQUNfUFJPR19CSVNPTl0sIFsKK2lmIHRlc3QgIngkMSIgPSAieCIgOyB0aGVuCisgIGJpc29uX3JlcXVpcmVkX3ZlcnNpb249IjIuNCIKK2Vsc2UKKyAgYmlzb25fcmVxdWlyZWRfdmVyc2lvbj0iJDEiCitmaQorCitBQ19DSEVDS19QUk9HKGhhdmVfcHJvZ19iaXNvbiwgW2Jpc29uXSwgW3llc10sW25vXSkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtCSVNPTl9WRVJTSU9OXSwgWzAuMF0sIFtCaXNvbiB2ZXJzaW9uIGlmIGJpc29uIGlzIG5vdCBhdmFpbGFibGVdKQorCisjRG8gbm90IHVzZSAqLmggZXh0ZW5zaW9uIGZvciBwYXJzZXIgaGVhZGVyIGZpbGVzLCB1c2UgbmV3ZXIgKi5oaAorYmlzb25fdXNlX3BhcnNlcl9oX2V4dGVuc2lvbj1mYWxzZQorCitpZiB0ZXN0ICIkaGF2ZV9wcm9nX2Jpc29uIiA9ICJ5ZXMiIDsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBiaXNvbiB2ZXJzaW9uID49ICRiaXNvbl9yZXF1aXJlZF92ZXJzaW9uXSkKKyAgYmlzb25fdmVyc2lvbj1gYmlzb24gLS12ZXJzaW9uIHwgaGVhZCAtbiAxIHwgY3V0ICctZCAnIC1mIDRgCisgIEFDX0RFRklORV9VTlFVT1RFRChbQklTT05fVkVSU0lPTl0sIFskYmlzb25fdmVyc2lvbl0sIFtEZWZpbmVzIGJpc29uIHZlcnNpb25dKQorICBpZiB0ZXN0ICIkYmlzb25fdmVyc2lvbiIgXDwgIiRiaXNvbl9yZXF1aXJlZF92ZXJzaW9uIiA7IHRoZW4KKyAgICBCSVNPTj06CisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIEFDX01TR19FUlJPUihbQmlzb24gdmVyc2lvbiAkYmlzb25fcmVxdWlyZWRfdmVyc2lvbiBvciBoaWdoZXIgbXVzdCBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSFdKQorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICBCSVNPTj1iaXNvbgorICAgIEFDX1NVQlNUKEJJU09OKQorCisgICAgI1ZlcmlmeSBhdXRvbWFrZSB2ZXJzaW9uIDEuMTEgaGVhZGVycyBmb3IgeXkgZmlsZXMgYXJlIC5oLCA+IDEuMTIgdXNlcyAuaGgKKyAgICBhdXRvbWFrZV92ZXJzaW9uPWBhdXRvbWFrZSAtLXZlcnNpb24gfCBoZWFkIC1uIDEgfCBjdXQgJy1kICcgLWYgNGAKKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoW0FVVE9NQUtFX1ZFUlNJT05dLCBbJGF1dG9tYWtlX3ZlcnNpb25dLCBbRGVmaW5lcyBhdXRvbWFrZSB2ZXJzaW9uXSkKKworICAgIGlmIHRlc3QgIiRhdXRvbWFrZV92ZXJzaW9uIiBcPCAiMS4xMiIgOyB0aGVuCisgICAgICAjVXNlICouaCBleHRlbnNpb24gZm9yIHBhcnNlciBoZWFkZXIgZmlsZQorICAgICAgYmlzb25fdXNlX3BhcnNlcl9oX2V4dGVuc2lvbj10cnVlCisgICAgICBlY2hvICJBdXRvbWFrZSB2ZXJzaW9uIDwgMS4xMiIKKyAgICAgIEFDX0RFRklORShbQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTl0sIFsxXSwgW1VzZSAqLmggZXh0ZW5zaW9uIGZvciBwYXJzZXIgaGVhZGVyIGZpbGVdKQorICAgIGZpCisgIGZpCitlbHNlCisgIEJJU09OPToKKyAgQUNfTVNHX1JFU1VMVChbTk9dKQorZmkKKworQU1fQ09ORElUSU9OQUwoW0JJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT05dLCBbdGVzdCB4JGJpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb24gPSB4dHJ1ZV0pCitBQ19TVUJTVChCSVNPTikKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYi9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKaW5kZXggNTg5NGQwYy4uZDU0MDM5NSAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CisrKyBiL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNApAQCAtMSwxNyArMSwxOSBAQAotIyMjIyMgaHR0cDovL2F1dG9jb25mLWFyY2hpdmUuY3J5cC50by9heF9ib29zdF9iYXNlLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2Jvb3N0X2Jhc2UuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKICMKLSMgICBBWF9CT09TVF9CQVNFKFtNSU5JTVVNLVZFUlNJT05dKQorIyAgIEFYX0JPT1NUX0JBU0UoW01JTklNVU0tVkVSU0lPTl0sIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCiAjCiAjIERFU0NSSVBUSU9OCiAjCiAjICAgVGVzdCBmb3IgdGhlIEJvb3N0IEMrKyBsaWJyYXJpZXMgb2YgYSBwYXJ0aWN1bGFyIHZlcnNpb24gKG9yIG5ld2VyKQogIwotIyAgIElmIG5vIHBhdGggdG8gdGhlIGluc3RhbGxlZCBib29zdCBsaWJyYXJ5IGlzIGdpdmVuIHRoZSBtYWNybwotIyAgIHNlYXJjaHMgdW5kZXIgL3VzciwgL3Vzci9sb2NhbCwgL29wdCBhbmQgL29wdC9sb2NhbCBhbmQgZXZhbHVhdGVzCi0jICAgdGhlICRCT09TVF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gaXMKLSMgICBhdmFpbGFibGUgYXQgPGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QvaW5kZXguaHRtbD4uCisjICAgSWYgbm8gcGF0aCB0byB0aGUgaW5zdGFsbGVkIGJvb3N0IGxpYnJhcnkgaXMgZ2l2ZW4gdGhlIG1hY3JvIHNlYXJjaHMKKyMgICB1bmRlciAvdXNyLCAvdXNyL2xvY2FsLCAvb3B0IGFuZCAvb3B0L2xvY2FsIGFuZCBldmFsdWF0ZXMgdGhlCisjICAgJEJPT1NUX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuIEZ1cnRoZXIgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQKKyMgICA8aHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdC9pbmRleC5odG1sPi4KICMKICMgICBUaGlzIG1hY3JvIGNhbGxzOgogIwpAQCAtMjEsMTg3ICsyMywyNzkgQEAKICMKICMgICAgIEhBVkVfQk9PU1QKICMKLSMgTEFTVCBNT0RJRklDQVRJT04KKyMgTElDRU5TRQogIwotIyAgIDIwMDctMDctMjgKLSMgICBNb2RpZmllZCBmb3IgdXNlIGluIFRocmlmdAorIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgUGV0ZXIgQWRvbHBocwogIwotIyBDT1BZTEVGVAotIwotIyAgIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KLSMKLSMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQKLSMgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQKLSMgICB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgNDUKKworIyBleGFtcGxlIGJvb3N0IHByb2dyYW0gKG5lZWQgdG8gcGFzcyB2ZXJzaW9uKQorbTRfZGVmaW5lKFtfQVhfQk9PU1RfQkFTRV9QUk9HUkFNXSwKKyAgICAgICAgICBbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CitdXSxbWworKHZvaWQpICgodm9pZClzaXplb2YoY2hhclsxIC0gMiohISgoQk9PU1RfVkVSU0lPTikgPCAoJDEpKV0pKTsKK11dKV0pCiAKIEFDX0RFRlVOKFtBWF9CT09TVF9CQVNFXSwKIFsKIEFDX0FSR19XSVRIKFtib29zdF0sCi0JQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdEA8OkA9RElSQDo+QF0sIFt1c2UgYm9vc3QgKGRlZmF1bHQgaXMgeWVzKSAtIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIHJvb3QgZGlyZWN0b3J5IGZvciBib29zdCAob3B0aW9uYWwpXSksCi0JWwotICAgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLQkJd2FudF9ib29zdD0ibm8iCi0gICAgZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIjsgdGhlbgotICAgICAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiIKLSAgICBlbHNlCi0JICAgIHdhbnRfYm9vc3Q9InllcyIKLSAgICAgICAgYWNfYm9vc3RfcGF0aD0iJHdpdGh2YWwiCi0JZmkKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3RAPDpAPUFSR0A6PkBdLAorICAgIFt1c2UgQm9vc3QgbGlicmFyeSBmcm9tIGEgc3RhbmRhcmQgbG9jYXRpb24gKEFSRz15ZXMpLAorICAgICBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gKEFSRz08cGF0aD4pLAorICAgICBvciBkaXNhYmxlIGl0IChBUkc9bm8pCisgICAgIEA8OkBBUkc9eWVzQDo+QCBdKV0sCisgICAgWworICAgICBBU19DQVNFKFskd2l0aHZhbF0sCisgICAgICAgW25vXSxbd2FudF9ib29zdD0ibm8iO19BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGg9IiJdLAorICAgICAgIFt5ZXNdLFt3YW50X2Jvb3N0PSJ5ZXMiO19BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGg9IiJdLAorICAgICAgIFt3YW50X2Jvb3N0PSJ5ZXMiO19BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGg9IiR3aXRodmFsIl0pCiAgICAgXSwKICAgICBbd2FudF9ib29zdD0ieWVzIl0pCiAKLWlmIHRlc3QgIngkd2FudF9ib29zdCIgPSAieHllcyI7IHRoZW4KLQlib29zdF9saWJfdmVyc2lvbl9yZXE9aWZlbHNlKFskMV0sICwxLjIwLjAsJDEpCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxX3Nob3J0ZW49YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfbWFqb3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdcKFtbMC05XV0qXCknYAotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9taW5vcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1tbMC05XV0qXC5cKFtbMC05XV0qXCknYAotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdbWzAtOV1dKlwuW1swLTldXSpcLlwoW1swLTldXSpcKSdgCi0JaWYgdGVzdCAieCRib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yIiA9ICJ4IiA7IHRoZW4KLQkJYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcj0iMCIKLSAgICAJZmkKLQlXQU5UX0JPT1NUX1ZFUlNJT049YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9tYWpvciBcKiAxMDAwMDAgXCsgICRib29zdF9saWJfdmVyc2lvbl9yZXFfbWlub3IgXCogMTAwIFwrICRib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yYAotCUFDX01TR19DSEVDS0lORyhmb3IgYm9vc3RsaWIgPj0gJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSkKLQlzdWNjZWVkZWQ9bm8KIAotCWRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKLQlkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KLQlkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KLQlpZiB0ZXN0ICIkYWNfYm9vc3RfcGF0aCIgIT0gIiI7IHRoZW4KLQkJQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aC9saWIiCi0JCUJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoL2luY2x1ZGUiCi0JCUJPT1NUX1JPT1RfUEFUSD0iJGFjX2Jvb3N0X3BhdGgiCi0JZWxzZQotCQlmb3IgYWNfYm9vc3RfcGF0aF90bXAgaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCi0JCQlpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiOyB0aGVuCi0JCQkJQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aF90bXAvbGliIgotCQkJCUJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgotCQkJCUJPT1NUX1JPT1RfUEFUSD0iJGFjX2Jvb3N0X3BhdGhfdG1wIgotCQkJCWJyZWFrOwotCQkJZmkKLQkJZG9uZQotCWZpCitBQ19BUkdfV0lUSChbYm9vc3QtbGliZGlyXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3QtbGliZGlyPUxJQl9ESVJdLAorICAgIFtGb3JjZSBnaXZlbiBkaXJlY3RvcnkgZm9yIGJvb3N0IGxpYnJhcmllcy4KKyAgICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBsaWJyYXJ5IHBhdGggZGV0ZWN0aW9uLAorICAgICBzbyB1c2UgdGhpcyBwYXJhbWV0ZXIgb25seSBpZiBkZWZhdWx0IGxpYnJhcnkgZGV0ZWN0aW9uIGZhaWxzCisgICAgIGFuZCB5b3Uga25vdyBleGFjdGx5IHdoZXJlIHlvdXIgYm9vc3QgbGlicmFyaWVzIGFyZSBsb2NhdGVkLl0pXSwKKyAgWworICAgQVNfSUYoW3Rlc3QgLWQgIiR3aXRodmFsIl0sCisgICAgICAgICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiR3aXRodmFsIl0sCisgICAgW0FDX01TR19FUlJPUihbLS13aXRoLWJvb3N0LWxpYmRpciBleHBlY3RlZCBkaXJlY3RvcnkgbmFtZV0pXSkKKyAgXSwKKyAgW19BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoPSIiXSkKIAotCUNQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCi0JZXhwb3J0IENQUEZMQUdTCitCT09TVF9MREZMQUdTPSIiCitCT09TVF9DUFBGTEFHUz0iIgorQVNfSUYoW3Rlc3QgIngkd2FudF9ib29zdCIgPSAieHllcyJdLAorICAgICAgW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVChbJDFdLFskMl0sWyQzXSldKQorQUNfU1VCU1QoQk9PU1RfQ1BQRkxBR1MpCitBQ19TVUJTVChCT09TVF9MREZMQUdTKQorXSkKIAotCUxERkxBR1NfU0FWRUQ9IiRMREZMQUdTIgotCUxERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgotCWV4cG9ydCBMREZMQUdTCiAKLQlleHBvcnQgQk9PU1RfUk9PVF9QQVRICisjIGNvbnZlcnQgYSB2ZXJzaW9uIHN0cmluZyBpbiAkMiB0byBudW1lcmljIGFuZCBhZmZlY3QgdG8gcG9seW1vcnBoaWMgdmFyICQxCitBQ19ERUZVTihbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl0sWworICBBU19JRihbdGVzdCAieCQyIiA9ICJ4Il0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIxLjIwLjAiXSxbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXE9IiQyIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3Nob3J0ZW49YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9tYWpvcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3IiID0gIngiXSwKKyAgICAgICAgW0FDX01TR19FUlJPUihbWW91IHNob3VsZCBhdCBsZWFzdCBzcGVjaWZ5IGxpYmJvb3N0IG1ham9yIHZlcnNpb25dKV0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3IiID0gIngiXSwKKyAgICAgICAgW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yPSIwIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAorICBBU19JRihbdGVzdCAiWCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3IiID0gIlgiXSwKKyAgICAgICAgW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVD1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3IgXCogMTAwIFwrICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3JgCisgIEFTX1ZBUl9TRVQoJDEsJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fUkVUKQorXSkKIAotCUFDX0xBTkdfUFVTSChDKyspCi0gICAgIAlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0JQCU6QGluY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgotCV1dLCBbWwotCSNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLQkvLyBFdmVyeXRoaW5nIGlzIG9rYXkKLQkjZWxzZQotCSMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotCSNlbmRpZgotCV1dKV0sWworZG5sIFJ1biB0aGUgZGV0ZWN0aW9uIG9mIGJvb3N0IHNob3VsZCBiZSBydW4gb25seSBpZiAkd2FudF9ib29zdAorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVF0sWworICAgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT04oV0FOVF9CT09TVF9WRVJTSU9OLFskMV0pCisgICAgc3VjY2VlZGVkPW5vCisKKworICAgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKKyAgICBkbmwgT24gNjQtYml0IHN5c3RlbXMgY2hlY2sgZm9yIHN5c3RlbSBsaWJyYXJpZXMgaW4gYm90aCBsaWI2NCBhbmQgbGliLgorICAgIGRubCBUaGUgZm9ybWVyIGlzIHNwZWNpZmllZCBieSBGSFMsIGJ1dCBlLmcuIERlYmlhbiBkb2VzIG5vdCBhZGhlcmUgdG8KKyAgICBkbmwgdGhpcyAoYXMgaXQgcmlzZXMgcHJvYmxlbXMgZm9yIGdlbmVyaWMgbXVsdGktYXJjaCBzdXBwb3J0KS4KKyAgICBkbmwgVGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgaXMgY2hvc2VuIGJ5IGRlZmF1bHQgd2hlbiBubyBsaWJyYXJpZXMKKyAgICBkbmwgYXJlIGZvdW5kLCBlLmcuIHdoZW4gb25seSBoZWFkZXItb25seSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCEKKyAgICBBU19DQVNFKFske2hvc3RfY3B1fV0sCisgICAgICBbeDg2XzY0XSxbbGlic3ViZGlycz0ibGliNjQgbGlieDMyIGxpYiBsaWI2NCJdLAorICAgICAgW3BwYzY0fHBvd2VycGM2NHxzMzkweHxzcGFyYzY0fGFhcmNoNjR8cHBjNjRsZXxwb3dlcnBjNjRsZXxyaXNjdjY0XSxbbGlic3ViZGlycz0ibGliNjQgbGliIGxpYjY0Il0sCisgICAgICBbbGlic3ViZGlycz0ibGliIl0KKyAgICApCisKKyAgICBkbmwgYWxsb3cgZm9yIHJlYWwgbXVsdGktYXJjaCBwYXRocyBlLmcuIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUuIEdpdmUKKyAgICBkbmwgdGhlbSBwcmlvcml0eSBvdmVyIHRoZSBvdGhlciBwYXRocyBzaW5jZSwgaWYgbGlicyBhcmUgZm91bmQgdGhlcmUsIHRoZXkKKyAgICBkbmwgYXJlIGFsbW9zdCBhc3N1cmVkbHkgdGhlIG9uZXMgZGVzaXJlZC4KKyAgICBBU19DQVNFKFske2hvc3RfY3B1fV0sCisgICAgICBbaT84Nl0sW211bHRpYXJjaF9saWJzdWJkaXI9ImxpYi9pMzg2LSR7aG9zdF9vc30iXSwKKyAgICAgIFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvJHtob3N0X2NwdX0tJHtob3N0X29zfSJdCisgICAgKQorCisgICAgZG5sIGZpcnN0IHdlIGNoZWNrIHRoZSBzeXN0ZW0gbG9jYXRpb24gZm9yIGJvb3N0IGxpYnJhcmllcworICAgIGRubCB0aGlzIGxvY2F0aW9uIGlzdCBjaG9zZW4gaWYgYm9vc3QgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgd2l0aCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbgorICAgIGRubCBvciBpZiB5b3UgaW5zdGFsbCBib29zdCB3aXRoIFJQTQorICAgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICE9ICJ4Il0sWworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTikgaW5jbHVkZXMgaW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiXSkKKyAgICAgICAgIEFTX0lGKFt0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIl0sWworICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIgorICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAgaW4gJG11bHRpYXJjaF9saWJzdWJkaXIgJGxpYnN1YmRpcnM7IGRvCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pIGxpYiBwYXRoIGluICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiXSkKKyAgICAgICAgICAgICAgICBBU19JRihbdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiIF0sWworICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF0sCisgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgICAgICAgIGRvbmVdLFsKKyAgICAgIEFDX01TR19SRVNVTFQoW25vXSldKQorICAgIF0sWworICAgICAgICBpZiB0ZXN0IFgiJGNyb3NzX2NvbXBpbGluZyIgPSBYeWVzOyB0aGVuCisgICAgICAgICAgICBzZWFyY2hfbGlic3ViZGlycz0kbXVsdGlhcmNoX2xpYnN1YmRpcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWFyY2hfbGlic3ViZGlycz0iJG11bHRpYXJjaF9saWJzdWJkaXIgJGxpYnN1YmRpcnMiCisgICAgICAgIGZpCisgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkc2VhcmNoX2xpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICBdKQorCisgICAgZG5sIG92ZXJ3cml0ZSBsZCBmbGFncyBpZiB3ZSBoYXZlIHJlcXVpcmVkIHNwZWNpYWwgZGlyZWN0b3J5IHdpdGgKKyAgICBkbmwgLS13aXRoLWJvb3N0LWxpYmRpciBwYXJhbWV0ZXIKKyAgICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgIT0gIngiXSwKKyAgICAgICAgICBbQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKV0pCisgICAgQ1BQRkxBR1NfU0FWRUQ9IiRDUFBGTEFHUyIKKyAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKKyAgICBleHBvcnQgQ1BQRkxBR1MKKworICAgIExERkxBR1NfU0FWRUQ9IiRMREZMQUdTIgorICAgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgorICAgIGV4cG9ydCBMREZMQUdTCisKKyAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCisgICAgQUNfTEFOR19QVVNIKEMrKykKKyAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0Jc3VjY2VlZGVkPXllcwotCWZvdW5kX3N5c3RlbT15ZXMKLSAgICAgICAJXSxbCi0gICAgICAgCV0pCi0JQUNfTEFOR19QT1AoW0MrK10pCisgICAgc3VjY2VlZGVkPXllcworICAgIGZvdW5kX3N5c3RlbT15ZXMKKyAgICAgICAgXSxbCisgICAgICAgIF0pCisgICAgQUNfTEFOR19QT1AoW0MrK10pCiAKIAogCi0JZG5sIGlmIHdlIGZvdW5kIG5vIGJvb3N0IHdpdGggc3lzdGVtIGxheW91dCB3ZSBzZWFyY2ggZm9yIGJvb3N0IGxpYnJhcmllcwotCWRubCBidWlsdCBhbmQgaW5zdGFsbGVkIHdpdGhvdXQgdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24gb3IgZm9yIGEgc3RhZ2VkKG5vdCBpbnN0YWxsZWQpIHZlcnNpb24KLQlpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiOyB0aGVuCi0JCV92ZXJzaW9uPTAKLQkJaWYgdGVzdCAiJGFjX2Jvb3N0X3BhdGgiICE9ICIiOyB0aGVuCi0gICAgICAgICAgICAgICAJCUJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGgvbGliIgotCQkJaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotCQkJCWZvciBpIGluIGBscyAtZCAkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbwotCQkJCQlfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJGFjX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCi0JCQkJCVZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0JCQkJCWlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KLQkJCQkJCV92ZXJzaW9uPSRfdmVyc2lvbl90bXAKLQkJCQkJZmkKLQkJCQkJVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCi0JCQkJCUJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKLQkJCQlkb25lCi0JCQlmaQotCQllbHNlCi0JCQlmb3IgYWNfYm9vc3RfcGF0aCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KLQkJCQlpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGgiOyB0aGVuCi0JCQkJCWZvciBpIGluIGBscyAtZCAkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbwotCQkJCQkJX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRhY19ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAotCQkJCQkJVl9DSEVDSz1gZXhwciAkX3ZlcnNpb25fdG1wIFw+ICRfdmVyc2lvbmAKLQkJCQkJCWlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KLQkJCQkJCQlfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCi0JICAgICAgICAgICAgICAgCQkJCQliZXN0X3BhdGg9JGFjX2Jvb3N0X3BhdGgKLQkJCQkJCWZpCi0JCQkJCWRvbmUKLQkJCQlmaQotCQkJZG9uZQotCi0JCQlWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKLQkJCUJPT1NUX0NQUEZMQUdTPSItSSRiZXN0X3BhdGgvaW5jbHVkZS9ib29zdC0kVkVSU0lPTl9VTkRFUlNDT1JFIgotCQkJQk9PU1RfTERGTEFHUz0iLUwkYmVzdF9wYXRoL2xpYiIKLQkJCUJPT1NUX1JPT1RfUEFUSD0iJGJlc3RfcGF0aCIKLQotCSAgICAJCWlmIHRlc3QgIngkQk9PU1RfUk9PVCIgIT0gIngiOyB0aGVuCi0JCQkJaWYgdGVzdCAtZCAiJEJPT1NUX1JPT1QiICYmIHRlc3QgLXIgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1kICIkQk9PU1RfUk9PVC9zdGFnZS9saWIiICYmIHRlc3QgLXIgIiRCT09TVF9ST09UL3N0YWdlL2xpYiI7IHRoZW4KLQkJCQkJdmVyc2lvbl9kaXI9YGV4cHIgLy8kQk9PU1RfUk9PVCA6ICcuKi9cKC4qXCknYAotCQkJCQlzdGFnZV92ZXJzaW9uPWBlY2hvICR2ZXJzaW9uX2RpciB8IHNlZCAncy9ib29zdF8vLycgfCBzZWQgJ3MvXy8uL2cnYAotCQkJICAgICAgICAJc3RhZ2VfdmVyc2lvbl9zaG9ydGVuPWBleHByICRzdGFnZV92ZXJzaW9uIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAotCQkJCQlWX0NIRUNLPWBleHByICRzdGFnZV92ZXJzaW9uX3Nob3J0ZW4gXD5cPSAkX3ZlcnNpb25gCi0JCQkJICAgICAgICBpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQlBQ19NU0dfTk9USUNFKFdlIHdpbGwgdXNlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgZnJvbSAkQk9PU1RfUk9PVCkKLQkJCQkJCUJPT1NUX0NQUEZMQUdTPSItSSRCT09TVF9ST09UIgotCQkJCQkJQk9PU1RfTERGTEFHUz0iLUwkQk9PU1RfUk9PVC9zdGFnZS9saWIiCi0JCQkJCQlCT09TVF9ST09UX1BBVEg9IiRCT09TVF9ST09UIgotCQkJCQlmaQotCQkJCWZpCi0JICAgIAkJZmkKLQkJZmkKLQotCQlDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKLQkJZXhwb3J0IENQUEZMQUdTCi0JCUxERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgotCQlleHBvcnQgTERGTEFHUwotCQlleHBvcnQgQk9PU1RfUk9PVF9QQVRICi0KLQkJQUNfTEFOR19QVVNIKEMrKykKLQkgICAgIAlBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0JCUAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLQkJXV0sIFtbCi0JCSNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLQkJLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0JCSNlbHNlCi0JCSMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotCQkjZW5kaWYKLQkJXV0pXSxbCi0gICAgICAgIAlBQ19NU0dfUkVTVUxUKHllcykKLQkJc3VjY2VlZGVkPXllcwotCQlmb3VuZF9zeXN0ZW09eWVzCi0gICAgICAgCQldLFsKLQkgICAgICAgCV0pCi0JCUFDX0xBTkdfUE9QKFtDKytdKQotCWZpCi0KLQlpZiB0ZXN0ICIkc3VjY2VlZGVkIiAhPSAieWVzIiA7IHRoZW4KLQkJaWYgdGVzdCAiJF92ZXJzaW9uIiA9ICIwIiA7IHRoZW4KLQkJCUFDX01TR19XQVJOKFtbV2UgY291bGQgbm90IGRldGVjdCB0aGUgYm9vc3QgbGlicmFyaWVzICh2ZXJzaW9uICRib29zdF9saWJfdmVyc2lvbl9yZXFfc2hvcnRlbiBvciBoaWdoZXIpLiBJZiB5b3UgaGF2ZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IChzdGlsbCBub3QgaW5zdGFsbGVkKSBwbGVhc2Ugc3BlY2lmeSBcJEJPT1NUX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCBhbmQgZG8gbm90IGdpdmUgYSBQQVRIIHRvIC0td2l0aC1ib29zdCBvcHRpb24uICBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgYm9vc3QgaW5zdGFsbGVkLCB0aGVuIGNoZWNrIHlvdXIgdmVyc2lvbiBudW1iZXIgbG9va2luZyBpbiA8Ym9vc3QvdmVyc2lvbi5ocHA+LiBTZWUgaHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLl1dKQotCQllbHNlCi0JCQlBQ19NU0dfV0FSTihbWW91ciBib29zdCBsaWJyYXJpZXMgc2VlbXMgdG8gb2xkICh2ZXJzaW9uICRfdmVyc2lvbikuXSkKLQkJZmkKLQllbHNlCi0JCUFDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQotCQlBQ19TVUJTVChCT09TVF9MREZMQUdTKQotCQlBQ19TVUJTVChCT09TVF9ST09UX1BBVEgpCi0JCUFDX0RFRklORShIQVZFX0JPT1NULCxbZGVmaW5lIGlmIHRoZSBCb29zdCBsaWJyYXJ5IGlzIGF2YWlsYWJsZV0pCi0JZmkKLQorICAgIGRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKKyAgICBkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCisgICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIiA7IHRoZW4KICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHU19TQVZFRCIKLSAgICAgICAJTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCi1maQorICAgICAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKKyAgICAgICAgQk9PU1RfQ1BQRkxBR1M9CisgICAgICAgIGlmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICBCT09TVF9MREZMQUdTPQorICAgICAgICBmaQorICAgICAgICBfdmVyc2lvbj0wCisgICAgICAgIGlmIHRlc3QgLW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KKyAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAorICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uPSRfdmVyc2lvbl90bXAKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgZG5sIGlmIG5vdGhpbmcgZm91bmQgc2VhcmNoIGZvciBsYXlvdXQgdXNlZCBpbiBXaW5kb3dzIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkQk9PU1RfQ1BQRkxBR1MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG5sIGlmIHdlIGZvdW5kIHNvbWV0aGluZyBhbmQgQk9PU1RfTERGTEFHUyB3YXMgdW5zZXQgYmVmb3JlCisgICAgICAgICAgICAgICAgZG5sIChiZWNhdXNlICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiID0gIiIpLCBzZXQgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfQ1BQRkxBR1MiICYmIHRlc3QgLXogIiRCT09TVF9MREZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uPSRfdmVyc2lvbl90bXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wYXRoPSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKKyAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkYmVzdF9wYXRoLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRiZXN0X3BhdGgvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX1JPT1QiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJGxpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiBscyAiJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtciAiJEJPT1NUX1JPT1QiICYmIHRlc3QgLWQgIiRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIiICYmIHRlc3QgLXIgIiRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fZGlyPWBleHByIC8vJEJPT1NUX1JPT1QgOiAnLiovXCguKlwpJ2AKKyAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9kaXIgfCBzZWQgJ3MvYm9vc3RfLy8nIHwgc2VkICdzL18vLi9nJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3ZlcnNpb25fc2hvcnRlbj1gZXhwciAkc3RhZ2VfdmVyc2lvbiA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgICAgICAgICAgICAgICAgICAgVl9DSEVDSz1gZXhwciAkc3RhZ2VfdmVyc2lvbl9zaG9ydGVuIFw+XD0gJF92ZXJzaW9uYAorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiAmJiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKKyAgICAgICAgZXhwb3J0IENQUEZMQUdTCisgICAgICAgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgorICAgICAgICBleHBvcnQgTERGTEFHUworCisgICAgICAgIEFDX0xBTkdfUFVTSChDKyspCisgICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWworICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgIHN1Y2NlZWRlZD15ZXMKKyAgICAgICAgZm91bmRfc3lzdGVtPXllcworICAgICAgICAgICAgXSxbCisgICAgICAgICAgICBdKQorICAgICAgICBBQ19MQU5HX1BPUChbQysrXSkKKyAgICBmaQorCisgICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCRfdmVyc2lvbiIgPSAieDAiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX05PVElDRShbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkMSBvciBoaWdoZXIpLiBJZiB5b3UgaGF2ZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IChzdGlsbCBub3QgaW5zdGFsbGVkKSBwbGVhc2Ugc3BlY2lmeSBcJEJPT1NUX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCBhbmQgZG8gbm90IGdpdmUgYSBQQVRIIHRvIC0td2l0aC1ib29zdCBvcHRpb24uICBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgYm9vc3QgaW5zdGFsbGVkLCB0aGVuIGNoZWNrIHlvdXIgdmVyc2lvbiBudW1iZXIgbG9va2luZyBpbiA8Ym9vc3QvdmVyc2lvbi5ocHA+LiBTZWUgaHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLl1dKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtZb3VyIGJvb3N0IGxpYnJhcmllcyBzZWVtcyB0byBvbGQgKHZlcnNpb24gJF92ZXJzaW9uKS5dKQorICAgICAgICBmaQorICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLU5PVC1GT1VORCAoaWYgcHJlc2VudCk6CisgICAgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgICAgZWxzZQorICAgICAgICBBQ19ERUZJTkUoSEFWRV9CT09TVCwsW2RlZmluZSBpZiB0aGUgQm9vc3QgbGlicmFyeSBpcyBhdmFpbGFibGVdKQorICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EIChpZiBwcmVzZW50KToKKyAgICAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHU19TQVZFRCIKKyAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKIAogXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNCBiL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGU0OGNiCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CkBAIC0wLDAgKzEsMTI0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NoZWNrX29wZW5zc2wuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DSEVDS19PUEVOU1NMKFthY3Rpb24taWYtZm91bmRbLCBhY3Rpb24taWYtbm90LWZvdW5kXV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTG9vayBmb3IgT3BlblNTTCBpbiBhIG51bWJlciBvZiBkZWZhdWx0IHNwb3RzLCBvciBpbiBhIHVzZXItc2VsZWN0ZWQKKyMgICBzcG90ICh2aWEgLS13aXRoLW9wZW5zc2wpLiAgU2V0cworIworIyAgICAgT1BFTlNTTF9JTkNMVURFUyB0byB0aGUgaW5jbHVkZSBkaXJlY3RpdmVzIHJlcXVpcmVkCisjICAgICBPUEVOU1NMX0xJQlMgdG8gdGhlIC1sIGRpcmVjdGl2ZXMgcmVxdWlyZWQKKyMgICAgIE9QRU5TU0xfTERGTEFHUyB0byB0aGUgLUwgb3IgLVIgZmxhZ3MgcmVxdWlyZWQKKyMKKyMgICBhbmQgY2FsbHMgQUNUSU9OLUlGLUZPVU5EIG9yIEFDVElPTi1JRi1OT1QtRk9VTkQgYXBwcm9wcmlhdGVseQorIworIyAgIFRoaXMgbWFjcm8gc2V0cyBPUEVOU1NMX0lOQ0xVREVTIHN1Y2ggdGhhdCBzb3VyY2UgZmlsZXMgc2hvdWxkIHVzZSB0aGUKKyMgICBvcGVuc3NsLyBkaXJlY3RvcnkgaW4gaW5jbHVkZSBkaXJlY3RpdmVzOgorIworIyAgICAgI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA5LDIwMTAgWm1hbmRhIEluYy4gPGh0dHA6Ly93d3cuem1hbmRhLmNvbS8+CisjICAgQ29weXJpZ2h0IChjKSAyMDA5LDIwMTAgRHVzdGluIEouIE1pdGNoZWxsIDxkdXN0aW5Aem1hbmRhLmNvbT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTAKKworQVVfQUxJQVMoW0NIRUNLX1NTTF0sIFtBWF9DSEVDS19PUEVOU1NMXSkKK0FDX0RFRlVOKFtBWF9DSEVDS19PUEVOU1NMXSwgWworICAgIGZvdW5kPWZhbHNlCisgICAgQUNfQVJHX1dJVEgoW29wZW5zc2xdLAorICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1vcGVuc3NsPURJUl0sCisgICAgICAgICAgICBbcm9vdCBvZiB0aGUgT3BlblNTTCBkaXJlY3RvcnldKV0sCisgICAgICAgIFsKKyAgICAgICAgICAgIGNhc2UgIiR3aXRodmFsIiBpbgorICAgICAgICAgICAgIiIgfCB5IHwgeWUgfCB5ZXMgfCBuIHwgbm8pCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoW0ludmFsaWQgLS13aXRoLW9wZW5zc2wgdmFsdWVdKQorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikgc3NsZGlycz0iJHdpdGh2YWwiCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIF0sIFsKKyAgICAgICAgICAgICMgaWYgcGtnLWNvbmZpZyBpcyBpbnN0YWxsZWQgYW5kIG9wZW5zc2wgaGFzIGluc3RhbGxlZCBhIC5wYyBmaWxlLAorICAgICAgICAgICAgIyB0aGVuIHVzZSB0aGF0IGluZm9ybWF0aW9uIGFuZCBkb24ndCBzZWFyY2ggc3NsZGlycworICAgICAgICAgICAgQUNfQ0hFQ0tfVE9PTChbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKKyAgICAgICAgICAgIGlmIHRlc3QgeCIkUEtHX0NPTkZJRyIgIT0geCIiOyB0aGVuCisgICAgICAgICAgICAgICAgT1BFTlNTTF9MREZMQUdTPWAkUEtHX0NPTkZJRyBvcGVuc3NsIC0tbGlicy1vbmx5LUwgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgaWYgdGVzdCAkPyA9IDA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9MSUJTPWAkUEtHX0NPTkZJRyBvcGVuc3NsIC0tbGlicy1vbmx5LWwgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfSU5DTFVERVM9YCRQS0dfQ09ORklHIG9wZW5zc2wgLS1jZmxhZ3Mtb25seS1JIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBmb3VuZD10cnVlCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICMgbm8gc3VjaCBsdWNrOyB1c2Ugc29tZSBkZWZhdWx0IHNzbGRpcnMKKyAgICAgICAgICAgIGlmICEgJGZvdW5kOyB0aGVuCisgICAgICAgICAgICAgICAgc3NsZGlycz0iL3Vzci9sb2NhbC9zc2wgL3Vzci9saWIvc3NsIC91c3Ivc3NsIC91c3IvcGtnIC91c3IvbG9jYWwgL3VzciIKKyAgICAgICAgICAgIGZpCisgICAgICAgIF0KKyAgICAgICAgKQorCisKKyAgICAjIG5vdGUgdGhhdCB3ZSAjaW5jbHVkZSA8b3BlbnNzbC9mb28uaD4sIHNvIHRoZSBPcGVuU1NMIGhlYWRlcnMgaGF2ZSB0byBiZSBpbgorICAgICMgYW4gJ29wZW5zc2wnIHN1YmRpcmVjdG9yeQorCisgICAgaWYgISAkZm91bmQ7IHRoZW4KKyAgICAgICAgT1BFTlNTTF9JTkNMVURFUz0KKyAgICAgICAgZm9yIHNzbGRpciBpbiAkc3NsZGlyczsgZG8KKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIG9wZW5zc2wvc3NsLmggaW4gJHNzbGRpcl0pCisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkc3NsZGlyL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCI7IHRoZW4KKyAgICAgICAgICAgICAgICBPUEVOU1NMX0lOQ0xVREVTPSItSSRzc2xkaXIvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICBPUEVOU1NMX0xERkxBR1M9Ii1MJHNzbGRpci9saWIiCisgICAgICAgICAgICAgICAgT1BFTlNTTF9MSUJTPSItbHNzbCAtbGNyeXB0byIKKyAgICAgICAgICAgICAgICBmb3VuZD10cnVlCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICAjIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZCwgd2VsbCwgZ28gYWhlYWQgYW5kIHRyeSB0aGUgbGluayBhbnl3YXkgLS0gbWF5YmUKKyAgICAgICAgIyBpdCB3aWxsIGp1c3Qgd29yayEKKyAgICBmaQorCisgICAgIyB0cnkgdGhlIHByZXByb2Nlc3NvciBhbmQgbGlua2VyIHdpdGggb3VyIG5ldyBmbGFncywKKyAgICAjIGJlaW5nIGNhcmVmdWwgbm90IHRvIHBvbGx1dGUgdGhlIGdsb2JhbCBMSUJTLCBMREZMQUdTLCBhbmQgQ1BQRkxBR1MKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBjb21waWxpbmcgYW5kIGxpbmtpbmcgYWdhaW5zdCBPcGVuU1NMIHdvcmtzXSkKKyAgICBlY2hvICJUcnlpbmcgbGluayB3aXRoIE9QRU5TU0xfTERGTEFHUz0kT1BFTlNTTF9MREZMQUdTOyIgXAorICAgICAgICAiT1BFTlNTTF9MSUJTPSRPUEVOU1NMX0xJQlM7IE9QRU5TU0xfSU5DTFVERVM9JE9QRU5TU0xfSU5DTFVERVMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJExERkxBR1MgJE9QRU5TU0xfTERGTEFHUyIKKyAgICBMSUJTPSIkT1BFTlNTTF9MSUJTICRMSUJTIgorICAgIENQUEZMQUdTPSIkT1BFTlNTTF9JTkNMVURFUyAkQ1BQRkxBR1MiCisgICAgQUNfTElOS19JRkVMU0UoCisgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPl0sIFtTU0xfbmV3KE5VTEwpXSldLAorICAgICAgICBbCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgJDEKKyAgICAgICAgXSwgWworICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgJDIKKyAgICAgICAgXSkKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorCisgICAgQUNfU1VCU1QoW09QRU5TU0xfSU5DTFVERVNdKQorICAgIEFDX1NVQlNUKFtPUEVOU1NMX0xJQlNdKQorICAgIEFDX1NVQlNUKFtPUEVOU1NMX0xERkxBR1NdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsMTc3IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ09NUEFSRV9WRVJTSU9OKFZFUlNJT05fQSwgT1AsIFZFUlNJT05fQiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgVGhpcyBtYWNybyBjb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzLiBEdWUgdG8gdGhlIHZhcmlvdXMgbnVtYmVyIG9mCisjICAgbWlub3ItdmVyc2lvbiBudW1iZXJzIHRoYXQgY2FuIGV4aXN0LCBhbmQgdGhlIGZhY3QgdGhhdCBzdHJpbmcKKyMgICBjb21wYXJpc29ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBudW1lcmljIGNvbXBhcmlzb25zLCB0aGlzIGlzIG5vdAorIyAgIG5lY2Vzc2FyaWx5IHRyaXZpYWwgdG8gZG8gaW4gYSBhdXRvY29uZiBzY3JpcHQuIFRoaXMgbWFjcm8gbWFrZXMgZG9pbmcKKyMgICB0aGVzZSBjb21wYXJpc29ucyBlYXN5LgorIworIyAgIFRoZSBzaXggYmFzaWMgY29tcGFyaXNvbnMgYXJlIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBjaGVja2luZyBlcXVhbGl0eQorIyAgIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIG51bWJlciBvZiBtaW5vci12ZXJzaW9uIGxldmVscy4KKyMKKyMgICBUaGUgb3BlcmF0b3IgT1AgZGV0ZXJtaW5lcyB3aGF0IHR5cGUgb2YgY29tcGFyaXNvbiB0byBkbywgYW5kIGNhbiBiZSBvbmUKKyMgICBvZjoKKyMKKyMgICAgZXEgIC0gZXF1YWwgKHRlc3QgQSA9PSBCKQorIyAgICBuZSAgLSBub3QgZXF1YWwgKHRlc3QgQSAhPSBCKQorIyAgICBsZSAgLSBsZXNzIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA8PSBCKQorIyAgICBnZSAgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA+PSBCKQorIyAgICBsdCAgLSBsZXNzIHRoYW4gKHRlc3QgQSA8IEIpCisjICAgIGd0ICAtIGdyZWF0ZXIgdGhhbiAodGVzdCBBID4gQikKKyMKKyMgICBBZGRpdGlvbmFsbHksIHRoZSBlcSBhbmQgbmUgb3BlcmF0b3IgY2FuIGhhdmUgYSBudW1iZXIgYWZ0ZXIgaXQgdG8gbGltaXQKKyMgICB0aGUgdGVzdCB0byB0aGF0IG51bWJlciBvZiBtaW5vciB2ZXJzaW9ucy4KKyMKKyMgICAgZXEwIC0gZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCisjICAgIG5lMCAtIG5vdCBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KKyMgICAgZXFOIC0gZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKKyMgICAgbmVOIC0gbm90IGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCisjCisjICAgV2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1UUlVFIGFyZSBydW4sCisjICAgb3RoZXJ3aXNlIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgZW52aXJvbm1lbnQKKyMgICB2YXJpYWJsZSAnYXhfY29tcGFyZV92ZXJzaW9uJyBpcyBhbHdheXMgc2V0IHRvIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJworIyAgIGFzIHdlbGwuCisjCisjICAgRXhhbXBsZXM6CisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2x0XSxbMy4xNS44XSkKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2x0XSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBib3RoIGJlIHRydWUuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxXSxbMy4xNS44XSkKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2d0XSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBib3RoIGJlIGZhbHNlLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTJdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0d28gbWlub3IgdmVyc2lvbnMuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMF0sWzMuMTVdKQorIworIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0aGUgbGVzc2VyIG51bWJlciBvZiBtaW5vcgorIyAgIHZlcnNpb25zIG9mIHRoZSB0d28gdmFsdWVzLgorIworIyAgIE5vdGU6IFRoZSBjaGFyYWN0ZXJzIHRoYXQgc2VwYXJhdGUgdGhlIHZlcnNpb24gbnVtYmVycyBkbyBub3QgbWF0dGVyLiBBbgorIyAgIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB2ZXJzaW9uIDAuIE9QIGlzIGV2YWx1YXRlZCBieSBhdXRvY29uZiwgbm90CisjICAgY29uZmlndXJlLCBzbyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgYSB2YXJpYWJsZS4KKyMKKyMgICBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UgR3VpZG8gRHJhaGVpbSB3aG9zZSBhZHZpY2UgYWJvdXQKKyMgICB0aGUgbTRfY2FzZSBhbmQgbTRfaWZ2YWxuIGZ1bmN0aW9ucyBtYWtlIHRoaXMgbWFjcm8gb25seSBpbmNsdWRlIHRoZQorIyAgIHBvcnRpb25zIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSBzcGVjaWZpYyBjb21wYXJpc29uIHNwZWNpZmllZCBieSB0aGUKKyMgICBPUCBhcmd1bWVudCBpbiB0aGUgZmluYWwgY29uZmlndXJlIHNjcmlwdC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaW0gVG9vbGFuIDx0b29sYW5AZWxlLnVyaS5lZHU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEyCisKK2RubCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitBQ19ERUZVTihbQVhfQ09NUEFSRV9WRVJTSU9OXSwgWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pCisKKyAgIyBVc2VkIHRvIGluZGljYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uCisgIGF4X2NvbXBhcmVfdmVyc2lvbj1mYWxzZQorCisgICMgQ29udmVydCB0aGUgdHdvIHZlcnNpb24gc3RyaW5ncyB0byBiZSBjb21wYXJlZCBpbnRvIGEgZm9ybWF0IHRoYXQKKyAgIyBhbGxvd3MgYSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uICBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IGEgdmVyc2lvbgorICAjIHN0cmluZyBvZiB0aGUgZm9ybSAxLjEyLjUtcjYxNyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZm9ybQorICAjIDAwMDEwMDEyMDAwNTA2MTcuICBJbiBvdGhlciB3b3JkcywgZWFjaCBudW1iZXIgaXMgemVybyBwYWRkZWQgdG8gZm91cgorICAjIGRpZ2l0cywgYW5kIG5vbiBkaWdpdHMgYXJlIHJlbW92ZWQuCisgIEFTX1ZBUl9QVVNIREVGKFtBXSxbYXhfY29tcGFyZV92ZXJzaW9uX0FdKQorICBBPWBlY2hvICIkMSIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAorCisgIEFTX1ZBUl9QVVNIREVGKFtCXSxbYXhfY29tcGFyZV92ZXJzaW9uX0JdKQorICBCPWBlY2hvICIkMyIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAorCisgIGRubCAjIEluIHRoZSBjYXNlIG9mIGxlLCBnZSwgbHQsIGFuZCBndCwgdGhlIHN0cmluZ3MgYXJlIHNvcnRlZCBhcyBuZWNlc3NhcnkKKyAgZG5sICMgdGhlbiB0aGUgZmlyc3QgbGluZSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCisgIGRubCAjIFRoZSBzZWQgcmlnaHQgYWZ0ZXIgdGhlIGVjaG8gaXMgdG8gcmVtb3ZlIGFueSBpbmRlbnRlZCB3aGl0ZSBzcGFjZS4KKyAgbTRfY2FzZShtNF90b2xvd2VyKCQyKSwKKyAgW2x0XSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCisgIF0sCisgIFtndF0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAorICBdLAorICBbbGVdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKKyAgXSwKKyAgW2dlXSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCisgIF0sWworICAgIGRubCBTcGxpdCB0aGUgb3BlcmF0b3IgZnJvbSB0aGUgc3VidmVyc2lvbiBjb3VudCBpZiBwcmVzZW50LgorICAgIG00X2JtYXRjaChtNF9zdWJzdHIoJDIsMiksCisgICAgWzBdLFsKKyAgICAgICMgQSBjb3VudCBvZiB6ZXJvIG1lYW5zIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24uCisgICAgICAjIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gQSBhbmQgQi4KKyAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQT1gZWNobyAiJEEiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKKyAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQj1gZWNobyAiJEIiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKKworICAgICAgIyBTZXQgQSB0byBubyBtb3JlIHRoYW4gQidzIGxlbmd0aCBhbmQgQiB0byBubyBtb3JlIHRoYW4gQSdzIGxlbmd0aC4KKyAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0JcfVwpLiovXDEvImAKKyAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0FcfVwpLiovXDEvImAKKyAgICBdLAorICAgIFtbMC05XStdLFsKKyAgICAgICMgQSBjb3VudCBncmVhdGVyIHRoYW4gemVybyBtZWFucyB1c2Ugb25seSB0aGF0IG1hbnkgc3VidmVyc2lvbnMKKyAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAorICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCisgICAgXSwKKyAgICBbLitdLFsKKyAgICAgIEFDX1dBUk5JTkcoCisgICAgICAgIFtpbGxlZ2FsIE9QIG51bWVyaWMgcGFyYW1ldGVyOiAkMl0pCisgICAgXSxbXSkKKworICAgICMgUGFkIHplcm9zIGF0IGVuZCBvZiBudW1iZXJzIHRvIG1ha2Ugc2FtZSBsZW5ndGguCisgICAgYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BPSIkQWBlY2hvICRCIHwgc2VkICdzLy4vMC9nJ2AiCisgICAgQj0iJEJgZWNobyAkQSB8IHNlZCAncy8uLzAvZydgIgorICAgIEE9IiRheF9jb21wYXJlX3ZlcnNpb25fdG1wX0EiCisKKyAgICAjIENoZWNrIGZvciBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IGFzIG5lY2Vzc2FyeS4KKyAgICBtNF9jYXNlKG00X3RvbG93ZXIobTRfc3Vic3RyKCQyLDAsMikpLAorICAgIFtlcV0sWworICAgICAgdGVzdCAieCRBIiA9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCisgICAgXSwKKyAgICBbbmVdLFsKKyAgICAgIHRlc3QgIngkQSIgIT0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKKyAgICBdLFsKKyAgICAgIEFDX1dBUk5JTkcoW2lsbGVnYWwgT1AgcGFyYW1ldGVyOiAkMl0pCisgICAgXSkKKyAgXSkKKworICBBU19WQVJfUE9QREVGKFtBXSlkbmwKKyAgQVNfVkFSX1BPUERFRihbQl0pZG5sCisKKyAgZG5sICMgRXhlY3V0ZSBBQ1RJT04tSUYtVFJVRSAvIEFDVElPTi1JRi1GQUxTRS4KKyAgaWYgdGVzdCAiJGF4X2NvbXBhcmVfdmVyc2lvbiIgPSAidHJ1ZSIgOyB0aGVuCisgICAgbTRfaWZ2YWxuKFskNF0sWyQ0XSxbOl0pZG5sCisgICAgbTRfaWZ2YWxuKFskNV0sW2Vsc2UgJDVdKWRubAorICBmaQorXSkgZG5sIEFYX0NPTVBBUkVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTllYWVkCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQKQEAgLTAsMCArMSw5NDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYKFZFUlNJT04sIFtleHR8bm9leHRdLCBbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgc3BlY2lmaWVkCisjICAgdmVyc2lvbiBvZiB0aGUgQysrIHN0YW5kYXJkLiAgSWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYIGFuZAorIyAgIENYWENQUCB0byBlbmFibGUgc3VwcG9ydC4gIFZFUlNJT04gbWF5IGJlICcxMScgKGZvciB0aGUgQysrMTEgc3RhbmRhcmQpCisjICAgb3IgJzE0JyAoZm9yIHRoZSBDKysxNCBzdGFuZGFyZCkuCisjCisjICAgVGhlIHNlY29uZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgd2hldGhlciB5b3UgaW5zaXN0IG9uIGFuCisjICAgZXh0ZW5kZWQgbW9kZSAoZS5nLiAtc3RkPWdudSsrMTEpIG9yIGEgc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUgKGUuZy4KKyMgICAtc3RkPWMrKzExKS4gIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB5b3UgZ2V0IHdoYXRldmVyIHdvcmtzLCB3aXRoCisjICAgcHJlZmVyZW5jZSBmb3IgYW4gZXh0ZW5kZWQgbW9kZS4KKyMKKyMgICBUaGUgdGhpcmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCAnbWFuZGF0b3J5JyBvciBpZiBsZWZ0IHVuc3BlY2lmaWVkLAorIyAgIGluZGljYXRlcyB0aGF0IGJhc2VsaW5lIHN1cHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQysrIHN0YW5kYXJkIGlzCisjICAgcmVxdWlyZWQgYW5kIHRoYXQgdGhlIG1hY3JvIHNob3VsZCBlcnJvciBvdXQgaWYgbm8gbW9kZSB3aXRoIHRoYXQKKyMgICBzdXBwb3J0IGlzIGZvdW5kLiAgSWYgc3BlY2lmaWVkICdvcHRpb25hbCcsIHRoZW4gY29uZmlndXJhdGlvbiBwcm9jZWVkcworIyAgIHJlZ2FyZGxlc3MsIGFmdGVyIGRlZmluaW5nIEhBVkVfQ1hYJHtWRVJTSU9OfSBpZiBhbmQgb25seSBpZiBhCisjICAgc3VwcG9ydGluZyBtb2RlIGlzIGZvdW5kLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMiBaYWNrIFdlaW5iZXJnIDx6YWNrd0BwYW5peC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEzIFJveSBTdG9nbmVyIDxyb3lzdGduckBpY2VzLnV0ZXhhcy5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE1IEdvb2dsZSBJbmMuOyBjb250cmlidXRlZCBieSBBbGV4ZXkgU29rb2xvdiA8c29rb2xvdkBnb29nbGUuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBQYXVsIE5vcm1hbiA8cGVub3JtYW5AbWFjLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgTW9yaXR6IEtsYW1tbGVyIDxtb3JpdHpAa2xhbW1sZXIuZXU+CisjICAgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IEtyemVzaW1pciBOb3dhayA8cWRsYWN6QGdtYWlsLmNvbT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEwCisKK2RubCAgVGhpcyBtYWNybyBpcyBiYXNlZCBvbiB0aGUgY29kZSBmcm9tIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEgbWFjcm8KK2RubCAgKHNlcmlhbCB2ZXJzaW9uIG51bWJlciAxMykuCisKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhdLCBbZG5sCisgIG00X2lmKFskMV0sIFsxMV0sIFtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXM9IjExIDB4Il0sCisgICAgICAgIFskMV0sIFsxNF0sIFtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXM9IjE0IDF5Il0sCisgICAgICAgIFskMV0sIFsxN10sIFtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXM9IjE3IDF6Il0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBmaXJzdCBhcmd1bWVudCBgJDEnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSlkbmwKKyAgbTRfaWYoWyQyXSwgW10sIFtdLAorICAgICAgICBbJDJdLCBbZXh0XSwgW10sCisgICAgICAgIFskMl0sIFtub2V4dF0sIFtdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgc2Vjb25kIGFyZ3VtZW50IGAkMicgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKWRubAorICBtNF9pZihbJDNdLCBbXSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDNdLCBbbWFuZGF0b3J5XSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDNdLCBbb3B0aW9uYWxdLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9ZmFsc2VdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgdGhpcmQgYXJndW1lbnQgYCQzJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgYWNfc3VjY2Vzcz1ubworCisgIG00X2lmKFskMl0sIFtub2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZm9yIGFsdGVybmF0aXZlIGluICR7YXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzfTsgZG8KKyAgICAgIHN3aXRjaD0iLXN0ZD1nbnUrKyR7YWx0ZXJuYXRpdmV9IgorICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eCQxXyRzd2l0Y2hdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKyQxIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgW2FjX3NhdmVfQ1hYPSIkQ1hYIgorICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfJDFdKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWD0iJGFjX3NhdmVfQ1hYIl0pCisgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgaWYgdGVzdCAtbiAiJENYWENQUCIgOyB0aGVuCisgICAgICAgICAgQ1hYQ1BQPSIkQ1hYQ1BQICRzd2l0Y2giCisgICAgICAgIGZpCisgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorCisgIG00X2lmKFskMl0sIFtleHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGRubCBIUCdzIGFDQyBuZWVkcyArc3RkPWMrKzExIGFjY29yZGluZyB0bzoKKyAgICBkbmwgaHR0cDovL2gyMTAwNy53d3cyLmhwLmNvbS9wb3J0YWwvZG93bmxvYWQvZmlsZXMvdW5wcm90L2FDeHgvUERGX1JlbGVhc2VfTm90ZXMvNzY5MTQ5LTAwMS5wZGYKKyAgICBkbmwgQ3JheSdzIGNyYXlDQyBuZWVkcyAiLWggc3RkPWMrKzExIgorICAgIGZvciBhbHRlcm5hdGl2ZSBpbiAke2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlc307IGRvCisgICAgICBmb3Igc3dpdGNoIGluIC1zdGQ9YysrJHthbHRlcm5hdGl2ZX0gK3N0ZD1jKyske2FsdGVybmF0aXZlfSAiLWggc3RkPWMrKyR7YWx0ZXJuYXRpdmV9IjsgZG8KKyAgICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eCQxXyRzd2l0Y2hdKQorICAgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrJDEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgICAgW2FjX3NhdmVfQ1hYPSIkQ1hYIgorICAgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XyQxXSldLAorICAgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgICBDWFg9IiRhY19zYXZlX0NYWCJdKQorICAgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRDWFhDUFAiIDsgdGhlbgorICAgICAgICAgICAgQ1hYQ1BQPSIkQ1hYQ1BQICRzd2l0Y2giCisgICAgICAgICAgZmkKKyAgICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisgIEFDX0xBTkdfUE9QKFtDKytdKQorICBpZiB0ZXN0IHgkYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQgPSB4dHJ1ZTsgdGhlbgorICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoWyoqKiBBIGNvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgQysrJDEgbGFuZ3VhZ2UgZmVhdHVyZXMgaXMgcmVxdWlyZWQuXSkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIEhBVkVfQ1hYJDE9MAorICAgIEFDX01TR19OT1RJQ0UoW05vIGNvbXBpbGVyIHdpdGggQysrJDEgc3VwcG9ydCB3YXMgZm91bmRdKQorICBlbHNlCisgICAgSEFWRV9DWFgkMT0xCisgICAgQUNfREVGSU5FKEhBVkVfQ1hYJDEsMSwKKyAgICAgICAgICAgICAgW2RlZmluZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgYmFzaWMgQysrJDEgc3ludGF4XSkKKyAgZmkKKyAgQUNfU1VCU1QoSEFWRV9DWFgkMSkKK10pCisKKworZG5sICBUZXN0IGJvZHkgZm9yIGNoZWNraW5nIEMrKzExIHN1cHBvcnQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzExXSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKykKKworCitkbmwgIFRlc3QgYm9keSBmb3IgY2hlY2tpbmcgQysrMTQgc3VwcG9ydAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTRdLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNAorKQorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTddLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNworKQorCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTEKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMV0sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzExLCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTEgY29tcGlsZXIiCisKKyNlbHNlCisKK25hbWVzcGFjZSBjeHgxMQoreworCisgIG5hbWVzcGFjZSB0ZXN0X3N0YXRpY19hc3NlcnQKKyAgeworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNoZWNrCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOworICAgIH07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZpbmFsX292ZXJyaWRlCisgIHsKKworICAgIHN0cnVjdCBCYXNlCisgICAgeworICAgICAgdmlydHVhbCB2b2lkIGYoKSB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgRGVyaXZlZCA6IHB1YmxpYyBCYXNlCisgICAgeworICAgICAgdmlydHVhbCB2b2lkIGYoKSBvdmVycmlkZSB7fQorICAgIH07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RvdWJsZV9yaWdodF9hbmdsZV9icmFja2V0cworICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBjaGVjayB7fTsKKworICAgIHR5cGVkZWYgY2hlY2s8dm9pZD4gc2luZ2xlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazx2b2lkPj4gZG91YmxlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxjaGVjazx2b2lkPj4+IHRyaXBsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Y2hlY2s8Y2hlY2s8dm9pZD4+Pj4gcXVhZHJ1cGxlX3R5cGU7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RlY2x0eXBlCisgIHsKKworICAgIGludAorICAgIGYoKQorICAgIHsKKyAgICAgIGludCBhID0gMTsKKyAgICAgIGRlY2x0eXBlKGEpIGIgPSAyOworICAgICAgcmV0dXJuIGEgKyBiOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdHlwZV9kZWR1Y3Rpb24KKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIHN0cnVjdCBpc19zYW1lCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxULCBUPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIGF1dG8KKyAgICBhZGQoVDEgYTEsIFQyIGEyKSAtPiBkZWNsdHlwZShhMSArIGEyKQorICAgIHsKKyAgICAgIHJldHVybiBhMSArIGEyOworICAgIH0KKworICAgIGludAorICAgIHRlc3QoY29uc3QgaW50IGMsIHZvbGF0aWxlIGludCB2KQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKDApPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYyk+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUodik+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgYXV0byBhYyA9IGM7CisgICAgICBhdXRvIGF2ID0gdjsKKyAgICAgIGF1dG8gc3VtaSA9IGFjICsgYXYgKyAneCc7CisgICAgICBhdXRvIHN1bWYgPSBhYyArIGF2ICsgMS4wOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYWMpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYXYpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoc3VtaSk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShzdW1mKT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhZGQoYywgdikpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgcmV0dXJuIChzdW1mID4gMC4wKSA/IHN1bWkgOiBhZGQoYywgdik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ub2V4Y2VwdAorICB7CisKKyAgICBpbnQgZigpIHsgcmV0dXJuIDA7IH0KKyAgICBpbnQgZygpIG5vZXhjZXB0IHsgcmV0dXJuIDA7IH0KKworICAgIHN0YXRpY19hc3NlcnQobm9leGNlcHQoZigpKSA9PSBmYWxzZSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQobm9leGNlcHQoZygpKSA9PSB0cnVlLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICB1bnNpZ25lZCBsb25nIGNvbnN0ZXhwcgorICAgIHN0cmxlbl9jX3IoY29uc3QgQ2hhclQgKmNvbnN0IHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgYWNjKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiAqcyA/IHN0cmxlbl9jX3IocyArIDEsIGFjYyArIDEpIDogYWNjOworICAgIH0KKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIHVuc2lnbmVkIGxvbmcgY29uc3RleHByCisgICAgc3RybGVuX2MoY29uc3QgQ2hhclQgKmNvbnN0IHMpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIHN0cmxlbl9jX3IocywgMFVMKTsKKyAgICB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCIiKSA9PSAwVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCIxIikgPT0gMVVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiZXhhbXBsZSIpID09IDdVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImFub3RoZXJcMGV4YW1wbGUiKSA9PSA3VUwsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfcnZhbHVlX3JlZmVyZW5jZXMKKyAgeworCisgICAgdGVtcGxhdGUgPCBpbnQgTiA+CisgICAgc3RydWN0IGFuc3dlcgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IHZhbHVlID0gTjsKKyAgICB9OworCisgICAgYW5zd2VyPDE+IGYoaW50JikgICAgICAgeyByZXR1cm4gYW5zd2VyPDE+KCk7IH0KKyAgICBhbnN3ZXI8Mj4gZihjb25zdCBpbnQmKSB7IHJldHVybiBhbnN3ZXI8Mj4oKTsgfQorICAgIGFuc3dlcjwzPiBmKGludCYmKSAgICAgIHsgcmV0dXJuIGFuc3dlcjwzPigpOyB9CisKKyAgICB2b2lkCisgICAgdGVzdCgpCisgICAgeworICAgICAgaW50IGkgPSAwOworICAgICAgY29uc3QgaW50IGMgPSAwOworICAgICAgc3RhdGljX2Fzc2VydChkZWNsdHlwZShmKGkpKTo6dmFsdWUgPT0gMSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChkZWNsdHlwZShmKGMpKTo6dmFsdWUgPT0gMiwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChkZWNsdHlwZShmKDApKTo6dmFsdWUgPT0gMywgIiIpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdW5pZm9ybV9pbml0aWFsaXphdGlvbgorICB7CisKKyAgICBzdHJ1Y3QgdGVzdAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgemVybyB7fTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgb25lIHsxfTsKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydCh0ZXN0Ojp6ZXJvID09IDAsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHRlc3Q6Om9uZSA9PSAxLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYXMKKyAgeworCisgICAgdm9pZAorICAgIHRlc3QxKCkKKyAgICB7CisgICAgICBhdXRvIGxhbWJkYTEgPSBbXSgpe307CisgICAgICBhdXRvIGxhbWJkYTIgPSBsYW1iZGExOworICAgICAgbGFtYmRhMSgpOworICAgICAgbGFtYmRhMigpOworICAgIH0KKworICAgIGludAorICAgIHRlc3QyKCkKKyAgICB7CisgICAgICBhdXRvIGEgPSBbXShpbnQgaSwgaW50IGopeyByZXR1cm4gaSArIGo7IH0oMSwgMik7CisgICAgICBhdXRvIGIgPSBbXSgpIC0+IGludCB7IHJldHVybiAnMCc7IH0oKTsKKyAgICAgIGF1dG8gYyA9IFs9XSgpeyByZXR1cm4gYSArIGI7IH0oKTsKKyAgICAgIGF1dG8gZCA9IFsmXSgpeyByZXR1cm4gYzsgfSgpOworICAgICAgYXV0byBlID0gW2EsICZiXShpbnQgeCkgbXV0YWJsZSB7CisgICAgICAgIGNvbnN0IGF1dG8gaWRlbnRpdHkgPSBbXShpbnQgeSl7IHJldHVybiB5OyB9OworICAgICAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBhOyArK2kpCisgICAgICAgICAgYSArPSBiLS07CisgICAgICAgIHJldHVybiB4ICsgaWRlbnRpdHkoYSArIGIpOworICAgICAgfSgwKTsKKyAgICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZTsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0MygpCisgICAgeworICAgICAgY29uc3QgYXV0byBudWxsYXJ5ID0gW10oKXsgcmV0dXJuIDA7IH07CisgICAgICBjb25zdCBhdXRvIHVuYXJ5ID0gW10oaW50IHgpeyByZXR1cm4geDsgfTsKKyAgICAgIHVzaW5nIG51bGxhcnlfdCA9IGRlY2x0eXBlKG51bGxhcnkpOworICAgICAgdXNpbmcgdW5hcnlfdCA9IGRlY2x0eXBlKHVuYXJ5KTsKKyAgICAgIGNvbnN0IGF1dG8gaGlnaGVyMXN0ID0gW10obnVsbGFyeV90IGYpeyByZXR1cm4gZigpOyB9OworICAgICAgY29uc3QgYXV0byBoaWdoZXIybmQgPSBbdW5hcnldKG51bGxhcnlfdCBmMSl7CisgICAgICAgIHJldHVybiBbdW5hcnksIGYxXSh1bmFyeV90IGYyKXsgcmV0dXJuIGYyKHVuYXJ5KGYxKCkpKTsgfTsKKyAgICAgIH07CisgICAgICByZXR1cm4gaGlnaGVyMXN0KG51bGxhcnkpICsgaGlnaGVyMm5kKG51bGxhcnkpKHVuYXJ5KTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3ZhcmlhZGljX3RlbXBsYXRlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8aW50Li4uPgorICAgIHN0cnVjdCBzdW07CisKKyAgICB0ZW1wbGF0ZSA8aW50IE4wLCBpbnQuLi4gTjF0b04+CisgICAgc3RydWN0IHN1bTxOMCwgTjF0b04uLi4+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gTjAgKyBzdW08TjF0b04uLi4+Ojp2YWx1ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPD4KKyAgICBzdHJ1Y3Qgc3VtPD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSAwOworICAgIH07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTw+Ojp2YWx1ZSA9PSAwLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MT46OnZhbHVlID09IDEsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwyMz46OnZhbHVlID09IDIzLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MSwgMj46OnZhbHVlID09IDMsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTw1LCA1LCAxMT46OnZhbHVlID09IDIxLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MiwgMywgNSwgNywgMTEsIDEzPjo6dmFsdWUgPT0gNDEsICIiKTsKKworICB9CisKKyAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzcyODE4NC90ZW1wbGF0ZS1hbGlhc2VzLWFuZC1zZmluYWUKKyAgLy8gQ2xhbmcgMy4xIGZhaWxzIHdpdGggaGVhZGVycyBvZiBsaWJzdGQrKyA0LjguMyB3aGVuIHVzaW5nIHN0ZDo6ZnVuY3Rpb24KKyAgLy8gYmVjYXVzZSBvZiB0aGlzLgorICBuYW1lc3BhY2UgdGVzdF90ZW1wbGF0ZV9hbGlhc19zZmluYWUKKyAgeworCisgICAgc3RydWN0IGZvbyB7fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdXNpbmcgbWVtYmVyID0gdHlwZW5hbWUgVDo6bWVtYmVyX3R5cGU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgZnVuYyguLi4pIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgZnVuYyhtZW1iZXI8VD4qKSB7fQorCisgICAgdm9pZCB0ZXN0KCk7CisKKyAgICB2b2lkIHRlc3QoKSB7IGZ1bmM8Zm9vPigwKTsgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDExCisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCitdXSkKKworCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNF0sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzE0LCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxNDAyTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTQgY29tcGlsZXIiCisKKyNlbHNlCisKK25hbWVzcGFjZSBjeHgxNAoreworCisgIG5hbWVzcGFjZSB0ZXN0X3BvbHltb3JwaGljX2xhbWJkYXMKKyAgeworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgY29uc3QgYXV0byBsYW1iZGEgPSBbXShhdXRvJiYuLi4gYXJncyl7CisgICAgICAgIGNvbnN0IGF1dG8gaXN0aW55ID0gW10oYXV0byB4KXsKKyAgICAgICAgICByZXR1cm4gKHNpemVvZih4KSA9PSAxVUwpID8gMSA6IDA7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IGludCBhcmV0aW55W10gPSB7IGlzdGlueShhcmdzKS4uLiB9OworICAgICAgICByZXR1cm4gYXJldGlueVswXTsKKyAgICAgIH07CisgICAgICByZXR1cm4gbGFtYmRhKDEsIDFMLCAxLjBmLCAnMScpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfYmluYXJ5X2xpdGVyYWxzCisgIHsKKworICAgIGNvbnN0ZXhwciBhdXRvIGl2aWkgPSAwYjAwMDAwMDAwMDAxMDEwMTA7CisgICAgc3RhdGljX2Fzc2VydChpdmlpID09IDQyLCAid3JvbmcgdmFsdWUiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZ2VuZXJhbGl6ZWRfY29uc3RleHByCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nCisgICAgc3RybGVuX2MoY29uc3QgQ2hhclQgKmNvbnN0IHMpIG5vZXhjZXB0CisgICAgeworICAgICAgYXV0byBsZW5ndGggPSAwVUw7CisgICAgICBmb3IgKGF1dG8gcCA9IHM7ICpwOyArK3ApCisgICAgICAgICsrbGVuZ3RoOworICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCIiKSA9PSAwVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJ4IikgPT0gMVVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygidGVzdCIpID09IDRVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImFub3RoZXJcMHRlc3QiKSA9PSA3VUwsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhX2luaXRfY2FwdHVyZQorICB7CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBhdXRvIHggPSAwOworICAgICAgY29uc3QgYXV0byBsYW1iZGExID0gW2EgPSB4XShpbnQgYil7IHJldHVybiBhICsgYjsgfTsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhMiA9IFthID0gbGFtYmRhMSh4KV0oKXsgcmV0dXJuIGE7IH07CisgICAgICByZXR1cm4gbGFtYmRhMigpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZGlnaXRfc2VwYXJhdG9ycworICB7CisKKyAgICBjb25zdGV4cHIgYXV0byB0ZW5fbWlsbGlvbiA9IDEwMCcwMDAnMDAwOworICAgIHN0YXRpY19hc3NlcnQodGVuX21pbGxpb24gPT0gMTAwMDAwMDAwLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3JldHVybl90eXBlX2RlZHVjdGlvbgorICB7CisKKyAgICBhdXRvIGYoaW50JiB4KSB7IHJldHVybiB4OyB9CisgICAgZGVjbHR5cGUoYXV0bykgZyhpbnQmIHgpIHsgcmV0dXJuIHg7IH0KKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IGZhbHNlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBpc19zYW1lPFQsIFQ+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gdHJ1ZTsKKyAgICB9OworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgYXV0byB4ID0gMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGYoeCkpPjo6dmFsdWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQmLCBkZWNsdHlwZShnKHgpKT46OnZhbHVlLCAiIik7CisgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTQKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA+PSAyMDE0MDJMCisKK11dKQorCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxNworCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE3XSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTcsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDE3MDNMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxNyBjb21waWxlciIKKworI2Vsc2UKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGN4eDE3Cit7CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByX2xhbWJkYXMKKyAgeworCisgICAgY29uc3RleHByIGludCBmb28gPSBbXSgpe3JldHVybiA0Mjt9KCk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0OjpuZXN0ZWRfbmFtZXNwYWNlOjpkZWZpbml0aW9ucworICB7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZvbGRfZXhwcmVzc2lvbgorICB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICAgIGludCBtdWx0aXBseShBcmdzLi4uIGFyZ3MpCisgICAgeworICAgICAgcmV0dXJuIChhcmdzICogLi4uICogMSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KKyAgICBib29sIGFsbChBcmdzLi4uIGFyZ3MpCisgICAgeworICAgICAgcmV0dXJuIChhcmdzICYmIC4uLik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leHRlbmRlZF9zdGF0aWNfYXNzZXJ0CisgIHsKKworICAgIHN0YXRpY19hc3NlcnQgKHRydWUpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9hdXRvX2JyYWNlX2luaXRfbGlzdAorICB7CisKKyAgICBhdXRvIGZvbyA9IHs1fTsKKyAgICBhdXRvIGJhciB7NX07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50PiwgZGVjbHR5cGUoZm9vKT46OnZhbHVlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxpbnQsIGRlY2x0eXBlKGJhcik+Ojp2YWx1ZSk7CisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90eXBlbmFtZV9pbl90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJhbWV0ZXIKKyAgeworCisgICAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IHR5cGVuYW1lIFg+IHN0cnVjdCBEOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9mYWxsdGhyb3VnaF9ub2Rpc2NhcmRfbWF5YmVfdW51c2VkX2F0dHJpYnV0ZXMKKyAgeworCisgICAgaW50IGYxKCkKKyAgICB7CisgICAgICByZXR1cm4gNDI7CisgICAgfQorCisgICAgW1tub2Rpc2NhcmRdXSBpbnQgZjIoKQorICAgIHsKKyAgICAgIFtbbWF5YmVfdW51c2VkXV0gYXV0byB1bnVzZWQgPSBmMSgpOworCisgICAgICBzd2l0Y2ggKGYxKCkpCisgICAgICB7CisgICAgICBjYXNlIDE3OgorICAgICAgICBmMSgpOworICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICBjYXNlIDQyOgorICAgICAgICBmMSgpOworICAgICAgfQorICAgICAgcmV0dXJuIGYxKCk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leHRlbmRlZF9hZ2dyZWdhdGVfaW5pdGlhbGl6YXRpb24KKyAgeworCisgICAgc3RydWN0IGJhc2UxCisgICAgeworICAgICAgaW50IGIxLCBiMiA9IDQyOworICAgIH07CisKKyAgICBzdHJ1Y3QgYmFzZTIKKyAgICB7CisgICAgICBiYXNlMigpIHsKKyAgICAgICAgYjMgPSA0MjsKKyAgICAgIH0KKyAgICAgIGludCBiMzsKKyAgICB9OworCisgICAgc3RydWN0IGRlcml2ZWQgOiBiYXNlMSwgYmFzZTIKKyAgICB7CisgICAgICAgIGludCBkOworICAgIH07CisKKyAgICBkZXJpdmVkIGQxIHt7MSwgMn0sIHt9LCA0fTsgIC8vIGZ1bGwgaW5pdGlhbGl6YXRpb24KKyAgICBkZXJpdmVkIGQyIHt7fSwge30sIDR9OyAgICAgIC8vIHZhbHVlLWluaXRpYWxpemVkIGJhc2VzCisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2dlbmVyYWxfcmFuZ2VfYmFzZWRfZm9yX2xvb3AKKyAgeworCisgICAgc3RydWN0IGl0ZXIKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgaW50JiBvcGVyYXRvciogKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGludCYgb3BlcmF0b3IqICgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICBpdGVyJiBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgKytpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBzZW50aW5lbAorICAgIHsKKyAgICAgIGludCBpOworICAgIH07CisKKyAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IGl0ZXImIGksIGNvbnN0IHNlbnRpbmVsJiBzKQorICAgIHsKKyAgICAgIHJldHVybiBpLmkgPT0gcy5pOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgaXRlciYgaSwgY29uc3Qgc2VudGluZWwmIHMpCisgICAgeworICAgICAgcmV0dXJuICEoaSA9PSBzKTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgcmFuZ2UKKyAgICB7CisgICAgICBpdGVyIGJlZ2luKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHswfTsKKyAgICAgIH0KKworICAgICAgc2VudGluZWwgZW5kKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHs1fTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdm9pZCBmKCkKKyAgICB7CisgICAgICByYW5nZSByIHt9OworCisgICAgICBmb3IgKGF1dG8gaSA6IHIpCisgICAgICB7CisgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gYXV0byB2ID0gaTsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYV9jYXB0dXJlX2FzdGVyaXNrX3RoaXNfYnlfdmFsdWUKKyAgeworCisgICAgc3RydWN0IHQKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBmb28oKQorICAgICAgeworICAgICAgICByZXR1cm4gWyp0aGlzXSgpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfSgpOworICAgICAgfQorICAgIH07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2VudW1fY2xhc3NfY29uc3RydWN0aW9uCisgIHsKKworICAgIGVudW0gY2xhc3MgYnl0ZSA6IHVuc2lnbmVkIGNoYXIKKyAgICB7fTsKKworICAgIGJ5dGUgZm9vIHs0Mn07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcl9pZgorICB7CisKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBjb25kPgorICAgIGludCBmICgpCisgICAgeworICAgICAgaWYgY29uc3RleHByKGNvbmQpCisgICAgICB7CisgICAgICAgIHJldHVybiAxMzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDQyOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfc2VsZWN0aW9uX3N0YXRlbWVudF93aXRoX2luaXRpYWxpemVyCisgIHsKKworICAgIGludCBmKCkKKyAgICB7CisgICAgICByZXR1cm4gMTM7CisgICAgfQorCisgICAgaW50IGYyKCkKKyAgICB7CisgICAgICBpZiAoYXV0byBpID0gZigpOyBpID4gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoYXV0byBpID0gZigpOyBpICsgNCkKKyAgICAgIHsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIHJldHVybiAyOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3RlbXBsYXRlX2FyZ3VtZW50X2RlZHVjdGlvbl9mb3JfY2xhc3NfdGVtcGxhdGVzCisgIHsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IHBhaXIKKyAgICB7CisgICAgICBwYWlyIChUMSBwMSwgVDIgcDIpCisgICAgICAgIDogbTEge3AxfSwKKyAgICAgICAgICBtMiB7cDJ9CisgICAgICB7fQorCisgICAgICBUMSBtMTsKKyAgICAgIFQyIG0yOworICAgIH07CisKKyAgICB2b2lkIGYoKQorICAgIHsKKyAgICAgIFtbbWF5YmVfdW51c2VkXV0gYXV0byBwID0gcGFpcnsxMywgNDJ1fTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X25vbl90eXBlX2F1dG9fdGVtcGxhdGVfcGFyYW1ldGVycworICB7CisKKyAgICB0ZW1wbGF0ZSA8YXV0byBuPgorICAgIHN0cnVjdCBCCisgICAge307CisKKyAgICBCPDU+IGIxOworICAgIEI8J2EnPiBiMjsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfc3RydWN0dXJlZF9iaW5kaW5ncworICB7CisKKyAgICBpbnQgYXJyWzJdID0geyAxLCAyIH07CisgICAgc3RkOjpwYWlyPGludCwgaW50PiBwciA9IHsgMSwgMiB9OworCisgICAgYXV0byBmMSgpIC0+IGludCgmKVsyXQorICAgIHsKKyAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgYXV0byBmMigpIC0+IHN0ZDo6cGFpcjxpbnQsIGludD4mCisgICAgeworICAgICAgcmV0dXJuIHByOworICAgIH0KKworICAgIHN0cnVjdCBTCisgICAgeworICAgICAgaW50IHgxIDogMjsKKyAgICAgIHZvbGF0aWxlIGRvdWJsZSB5MTsKKyAgICB9OworCisgICAgUyBmMygpCisgICAgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIGF1dG8gWyB4MSwgeTEgXSA9IGYxKCk7CisgICAgYXV0byYgWyB4cjEsIHlyMSBdID0gZjEoKTsKKyAgICBhdXRvIFsgeDIsIHkyIF0gPSBmMigpOworICAgIGF1dG8mIFsgeHIyLCB5cjIgXSA9IGYyKCk7CisgICAgY29uc3QgYXV0byBbIHgzLCB5MyBdID0gZjMoKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXhjZXB0aW9uX3NwZWNfdHlwZV9zeXN0ZW0KKyAgeworCisgICAgc3RydWN0IEdvb2Qge307CisgICAgc3RydWN0IEJhZCB7fTsKKworICAgIHZvaWQgZzEoKSBub2V4Y2VwdDsKKyAgICB2b2lkIGcyKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEJhZAorICAgIGYoVCosIFQqKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBHb29kCisgICAgZihUMSosIFQyKik7CisKKyAgICBzdGF0aWNfYXNzZXJ0IChzdGQ6OmlzX3NhbWVfdjxHb29kLCBkZWNsdHlwZShmKGcxLCBnMikpPik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2lubGluZV92YXJpYWJsZXMKKyAgeworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmKFQpCisgICAge30KKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIGcoVCkKKyAgICB7CisgICAgICByZXR1cm4gVHt9OworICAgIH0KKworICAgIHRlbXBsYXRlPD4gaW5saW5lIHZvaWQgZjw+KGludCkKKyAgICB7fQorCisgICAgdGVtcGxhdGU8PiBpbnQgZzw+KGludCkKKyAgICB7CisgICAgICByZXR1cm4gNTsKKyAgICB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTcKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA8IDIwMTcwM0wKKworXV0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNCBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzNmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApAQCAtMCwwICsxLDM5IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW2V4dHxub2V4dF0sIFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBDKysxMQorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kIENYWENQUCB0byBlbmFibGUKKyMgICBzdXBwb3J0LgorIworIyAgIFRoaXMgbWFjcm8gaXMgYSBjb252ZW5pZW5jZSBhbGlhcyBmb3IgY2FsbGluZyB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYCisjICAgbWFjcm8gd2l0aCB0aGUgdmVyc2lvbiBzZXQgdG8gQysrMTEuICBUaGUgdHdvIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUKKyMgICBmb3J3YXJkZWQgbGl0ZXJhbGx5IGFzIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50IHJlc3BlY3RpdmVseS4KKyMgICBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYIG1hY3JvIGZvcgorIyAgIG1vcmUgaW5mb3JtYXRpb24uICBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBtYWNybywgeW91IGFsc28gbmVlZCB0bworIyAgIGRvd25sb2FkIHRoZSBheF9jeHhfY29tcGlsZV9zdGRjeHgubTQgZmlsZS4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSBHb29nbGUgSW5jLjsgY29udHJpYnV0ZWQgYnkgQWxleGV5IFNva29sb3YgPHNva29sb3ZAZ29vZ2xlLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUGF1bCBOb3JtYW4gPHBlbm9ybWFuQG1hYy5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IE1vcml0eiBLbGFtbWxlciA8bW9yaXR6QGtsYW1tbGVyLmV1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxOAorCitBWF9SRVFVSVJFX0RFRklORUQoW0FYX0NYWF9DT01QSUxFX1NURENYWF0pCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW0FYX0NYWF9DT01QSUxFX1NURENYWChbMTFdLCBbJDFdLCBbJDJdKV0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2RtZC5tNCBiL2FjbG9jYWwvYXhfZG1kLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjg0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2RtZC5tNApAQCAtMCwwICsxLDEwNyBAQAorZG5sIEBzeW5vcHNpcyBBWF9ETUQKK2RubAorZG5sIFRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIERNRC1jb21wYXRpYmxlIEQyIGNvbXBpbGVyLCBhbmQgKG9wdGlvbmFsbHkpCitkbmwgc3BlY2lmaWVkIG1vZHVsZXMgb24gdGhlIGltcG9ydCBwYXRoLgorZG5sCitkbmwgSWYgIkRNRCIgaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoYXQgd2lsbCBiZSB0aGUgb25seQorZG5sIGRtZCBjb21tYW5kIHRlc3RlZC4gT3RoZXJ3aXNlLCBhIGhhcmQtY29kZWQgbGlzdCB3aWxsIGJlIHVzZWQuCitkbmwKK2RubCBBZnRlciBBWF9ETUQgcnVucywgdGhlIHNoZWxsIHZhcmlhYmxlcyAic3VjY2VzcyIgYW5kICJheF9kbWQiIGFyZSBzZXQgdG8KK2RubCAieWVzIiBvciAibm8iLCBhbmQgIkRNRCIgaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kLiBGdXJ0aGVybW9yZSwKK2RubCAiZG1kX29wdGxpbmsiIHdpbGwgYmUgc2V0IHRvICJ5ZXMiIG9yICJubyIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgT1BUTElOSyBpcworZG5sIHVzZWQgYXMgdGhlIGxpbmtlciAoRE1EL1dpbmRvd3MpLCBhbmQgImRtZF9vZl9kaXJzZXAiIHdpbGwgYmUgc2V0IHRvIHRoZQorZG5sIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdXNlIHdoZW4gcGFzc2luZyAtb2YgdG8gRE1EIChPUFRMSU5LIHJlcXVpcmVzIGEKK2RubCBiYWNrc2xhc2gpLgorZG5sCitkbmwgQVhfQ0hFQ0tfRF9NT0RVTEUgbXVzdCBiZSBydW4gYWZ0ZXIgQVhfRE1ELiBJdCB0ZXN0cyBmb3IgdGhlIHByZXNlbmNlIG9mIGEKK2RubCBtb2R1bGUgaW4gdGhlIGltcG9ydCBwYXRoIG9mIHRoZSBjaG9zZW4gY29tcGlsZXIsIGFuZCBzZXRzIHRoZSBzaGVsbAorZG5sIHZhcmlhYmxlICJzdWNjZXNzIiB0byAieWVzIiBvciAibm8iLgorZG5sCitkbmwgQGNhdGVnb3J5IEQKK2RubCBAdmVyc2lvbiAyMDExLTA1LTMxCitkbmwgQGxpY2Vuc2UgQWxsUGVybWlzc2l2ZQorZG5sCitkbmwgQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIFJlaXNzCitkbmwgQ29weXJpZ2h0IChDKSAyMDExIERhdmlkIE5hZGxpbmdlcgorZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCisKK0FDX0RFRlVOKFtBWF9ETURdLAorICAgICAgICAgWworICAgICAgICAgIGRubCBIYXJkLWNvZGVkIGRlZmF1bHQgY29tbWFuZHMgdG8gdGVzdC4KKyAgICAgICAgICBETURfUFJPR1M9ImRtZCxnZG1kLGxkbWQiCisKKyAgICAgICAgICBkbmwgQWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZS4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkRE1EIiA7IHRoZW4KKyAgICAgICAgICAgIERNRF9QUk9HUz0iJERNRCIKKyAgICAgICAgICBmaQorCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBETUQpCisKKyAgICAgICAgICAjIHN0ZC5hbGdvcml0aG0gYXMgYSBxdWljayB3YXkgdG8gY2hlY2sgZm9yIEQyL1Bob2Jvcy4KKyAgICAgICAgICBlY2hvICJpbXBvcnQgc3RkLmFsZ29yaXRobTsgdm9pZCBtYWluKCkge30iID4gY29uZmlndGVzdF9heF9kbWQuZAorICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBvSUZTPSIkSUZTIgorCisgICAgICAgICAgSUZTPSIsIgorICAgICAgICAgIGZvciBETUQgaW4gJERNRF9QUk9HUyA7IGRvCisgICAgICAgICAgICBJRlM9IiRvSUZTIgorCisgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJERNRCBjb25maWd0ZXN0X2F4X2RtZC5kXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgIGlmICRETUQgY29uZmlndGVzdF9heF9kbWQuZCA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKworICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiAhPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBETUQ9IiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBmaQorCisgICAgICAgICAgYXhfZG1kPSIkc3VjY2VzcyIKKworICAgICAgICAgICMgVGVzdCB3aGV0aGVyIE9QVExJTksgaXMgdXNlZCBieSB0cnlpbmcgaWYgRE1EIGFjY2VwdHMgLUwvPyB3aXRob3V0CisgICAgICAgICAgIyBlcnJvcmluZyBvdXQuCisgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID09ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgRE1EIHVzZXMgT1BUTElOSykKKyAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXOKAnSRETUQgLUwvPyBjb25maWd0ZXN0X2F4X2RtZC5kXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgIGlmICRETUQgLUwvPyBjb25maWd0ZXN0X2F4X2RtZC5kID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICAgIGRtZF9vcHRsaW5rPSJ5ZXMiCisKKyAgICAgICAgICAgICAgIyBUaGlzIGFjdHVhbGx5IHByb2R1Y2VzIGRvdWJsZSBzbGFzaGVzIGluIHRoZSBmaW5hbCBjb25maWd1cmUKKyAgICAgICAgICAgICAgIyBvdXRwdXQsIGJ1dCBhdCBsZWFzdCBpdCB3b3Jrcy4KKyAgICAgICAgICAgICAgZG1kX29mX2RpcnNlcD0iXFxcXCIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgICAgZG1kX29wdGxpbms9Im5vIgorICAgICAgICAgICAgICBkbWRfb2ZfZGlyc2VwPSIvIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorCisgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9kbWQqCisgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19EX01PRFVMRV0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBEIG1vZHVsZSBbJDFdKQorCisgICAgICAgICAgZWNobyAiaW1wb3J0ICQxOyB2b2lkIG1haW4oKSB7fSIgPiBjb25maWd0ZXN0X2F4X2RtZC5kCisKKyAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJERNRCBjb25maWd0ZXN0X2F4X2RtZC5kXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICBpZiAkRE1EIC1jIGNvbmZpZ3Rlc3RfYXhfZG1kLmQgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICBzdWNjZXNzPXllcworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBzdWNjZXNzPW5vCisgICAgICAgICAgZmkKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfZG1kKgorICAgICAgICAgXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CmluZGV4IDAzYWIwOGUuLjAyMDM5NjAgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKKysrIGIvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApAQCAtNyw3ICs3LDcgQEAKIGRubCBqYXZhIGNvbW1hbmQgdGVzdGVkLiAgT3RoZXJ3aXNlLCBhIGhhcmQtY29kZWQgbGlzdCB3aWxsIGJlIHVzZWQuCiBkbmwgU2ltaWxhcmx5IGZvciAiSkFWQUMiLgogZG5sCi1kbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVubHkgc3VwcG9ydCB0ZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKK2RubCBBWF9KQVZBQ19BTkRfSkFWQSBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0ZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKIGRubCBKYXZhIHZlcnNpb24sIHRlc3RpbmcgZm9yIG9ubHkgb25lIG9mICJqYXZhIiBhbmQgImphdmFjIiwgb3IKIGRubCBjb21waWxpbmcgb3IgcnVubmluZyB1c2VyLXByb3ZpZGVkIEphdmEgY29kZS4KIGRubApAQCAtNTcsNiArNTcsMTAgQEAKICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKICAgICAgICAgICAgIGlmICRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgogCisgICAgICAgICAgICAgICMgcHJldmVudCAkSkFWQSBWTSBpc3N1ZXMgd2l0aCBVVEYtOCBwYXRoIG5hbWVzIChUSFJJRlQtMzI3MSkKKyAgICAgICAgICAgICAgb0xDX0FMTD0iJExDX0FMTCIKKyAgICAgICAgICAgICAgTENfQUxMPSIiCisKICAgICAgICAgICAgICAgSUZTPSIsIgogICAgICAgICAgICAgICBmb3IgSkFWQSBpbiAkSkFWQV9QUk9HUyA7IGRvCiAgICAgICAgICAgICAgICAgSUZTPSIkb0lGUyIKQEAgLTY5LDYgKzczLDEwIEBACiAKICAgICAgICAgICAgICAgZG9uZQogCisgICAgICAgICAgICAgICMgcmVzdG9yZSBMQ19BTEwKKyAgICAgICAgICAgICAgTENfQUxMPSIkb0xDX0FMTCIKKyAgICAgICAgICAgICAgb0xDX0FMTD0iIgorCiAgICAgICAgICAgICBmaQogCiAgICAgICAgICAgZG9uZQpAQCAtMTA1LDMgKzExMywxNyBAQAogCiAgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuY2xhc3MKICAgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19BTlRfVkVSU0lPTl0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhbnQgdmVyc2lvbiA+ICQyKQorICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAieCQocHJpbnRmICIkMlxuJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIiB8IHNvcnQgLXQgJy4nIC1rIDEsMSAtayAyLDIgLWsgMywzIC1nIHwgc2VkIC1uIDFwKSIgPSAieCQyImAKKyAgICAgICAgICBpZiB0ZXN0ICJ4JEFOVF9WQUxJRCIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIEFOVD0iIgorICAgICAgICAgIGZpCisgICAgICAgICAgXSkKKwpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9saWJfZXZlbnQubTQgYi9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNAppbmRleCA1NmFlZmNjLi5kNGRjZGM5IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNAorKysgYi9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNApAQCAtNzUsMTIgKzc1LDE0IEBACiAgICAgICAgICAgQUNfTEFOR19QVVNIKFtDXSkKICAgICAgICAgICBkbmwgVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBBQ19MSU5LX0lGRUxTRSBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZywKICAgICAgICAgICBkbmwgYnV0IHRoZW4gdGhlIHZlcnNpb24gY2Fubm90IGJlIGNoZWNrZWQuCi0gICAgICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwogICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICAgICAgICAgICAjaW5jbHVkZSA8ZXZlbnQuaD4KICAgICAgICAgICBdXSwgW1sKICAgICAgICAgICBjb25zdCBjaGFyKiBsaWJfdmVyc2lvbiA9IGV2ZW50X2dldF92ZXJzaW9uKCk7CiAgICAgICAgICAgY29uc3QgY2hhciogd250X3ZlcnNpb24gPSAiJFdBTlRfTElCRVZFTlRfVkVSU0lPTiI7CisgICAgICAgICAgaW50IGxpYl9kaWdpdHM7CisgICAgICAgICAgaW50IHdudF9kaWdpdHM7CiAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB3YW50IHZlcnNpb24uICBXZSBoYXZlIGl0LiAqLwogICAgICAgICAgICAgaWYgKCp3bnRfdmVyc2lvbiA9PSAnXDAnIHx8ICp3bnRfdmVyc2lvbiA9PSAnLScpIHsKQEAgLTkzLDEzICs5NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogSW4gdGhlIDEuNCB2ZXJzaW9uIG51bWJlcmluZyBzdHlsZSwgaWYgdGhlcmUgYXJlIG1vcmUgZGlnaXRzICovCiAgICAgICAgICAgICAvKiBpbiBvbmUgdmVyc2lvbiB0aGFuIHRoZSBvdGhlciwgdGhhdCBvbmUgaXMgaGlnaGVyLiAqLwotICAgICAgICAgICAgaW50IGxpYl9kaWdpdHM7CiAgICAgICAgICAgICBmb3IgKGxpYl9kaWdpdHMgPSAwOwogICAgICAgICAgICAgICAgIGxpYl92ZXJzaW9uW2xpYl9kaWdpdHNdID49ICcwJyAmJgogICAgICAgICAgICAgICAgIGxpYl92ZXJzaW9uW2xpYl9kaWdpdHNdIDw9ICc5JzsKICAgICAgICAgICAgICAgICBsaWJfZGlnaXRzKyspCiAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGludCB3bnRfZGlnaXRzOwogICAgICAgICAgICAgZm9yICh3bnRfZGlnaXRzID0gMDsKICAgICAgICAgICAgICAgICB3bnRfdmVyc2lvblt3bnRfZGlnaXRzXSA+PSAnMCcgJiYKICAgICAgICAgICAgICAgICB3bnRfdmVyc2lvblt3bnRfZGlnaXRzXSA8PSAnOSc7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAogICAgICAgICAgIGRubCBBbGxvdyBzZWFyY2ggcGF0aCB0byBiZSBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICAgICAgQUNfQVJHX1dJVEgoW2xpYmV2ZW50XSwKLSAgICAgICAgICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWxpYmV2ZW50QDw6QD1ESVJAOj5AXSwgW3VzZSBsaWJldmVudCAoZGVmYXVsdCBpcyB5ZXMpIC0gaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgcm9vdCBkaXJlY3RvcnkgZm9yIGxpYmV2ZW50XSksCisgICAgICAgICAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1saWJldmVudEA8OkA9RElSQDo+QF0sIFt1c2UgbGliZXZlbnQgW2RlZmF1bHQ9eWVzXS4gT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSByb290IHByZWZpeCBkaXIgd2hlcmUgbGliZXZlbnQgaXMgaW5zdGFsbGVkXSksCiAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50X2xpYmV2ZW50PSJubyIKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGF4X2xpYmV2ZW50X3BhdGgiOyB0aGVuCiAgICAgICAgICAgICAgIEFYX0xJQl9FVkVOVF9ET19DSEVDSwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmb3IgYXhfbGliZXZlbnRfcGF0aCBpbiAiIiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIC9vcHQvbGliZXZlbnQgIiRMSUJFVkVOVF9ST09UIiA7IGRvCisgICAgICAgICAgICAgIGZvciBheF9saWJldmVudF9wYXRoIGluICIiICRsdF9zeXNyb290L3VzciAkbHRfc3lzcm9vdC91c3IvbG9jYWwgJGx0X3N5c3Jvb3Qvb3B0ICRsdF9zeXNyb290L29wdC9sb2NhbCAkbHRfc3lzcm9vdC9vcHQvbGliZXZlbnQgIiRMSUJFVkVOVF9ST09UIiA7IGRvCiAgICAgICAgICAgICAgICAgQVhfTElCX0VWRU5UX0RPX0NIRUNLCiAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID0gInllcyI7IHRoZW4KICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9saWJfemxpYi5tNCBiL2FjbG9jYWwvYXhfbGliX3psaWIubTQKaW5kZXggOGMxMGFiNC4uYmRiOWUxMSAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9saWJfemxpYi5tNAorKysgYi9hY2xvY2FsL2F4X2xpYl96bGliLm00CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgIyAgIChkZWZpbmVkIGluIHRoZSBsaWJyYXJ5KS4KICAgICAgICAgICBBQ19MQU5HX1BVU0goW0NdKQogICAgICAgICAgIGRubCBUaGlzIGNhbiBiZSBjaGFuZ2VkIHRvIEFDX0xJTktfSUZFTFNFIGlmIHlvdSBhcmUgY3Jvc3MtY29tcGlsaW5nLgotICAgICAgICAgIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworICAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKICAgICAgICAgICAjaW5jbHVkZSA8emxpYi5oPgogICAgICAgICAgICNpZiBaTElCX1ZFUk5VTSA+PSAweCRXQU5UX1pMSUJfVkVSU0lPTgogICAgICAgICAgICNlbHNlCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2x1YS5tNCBiL2FjbG9jYWwvYXhfbHVhLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjAxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2x1YS5tNApAQCAtMCwwICsxLDY2NCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2x1YS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfTFVBWyhbTUlOSU1VTS1WRVJTSU9OXSwgW1RPTy1CSUctVkVSU0lPTl0sIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIyAgIEFYX0xVQV9IRUFERVJTWyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMgICBBWF9MVUFfTElCU1soW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjICAgQVhfTFVBX1JFQURMSU5FWyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBEZXRlY3QgYSBMdWEgaW50ZXJwcmV0ZXIsIG9wdGlvbmFsbHkgc3BlY2lmeWluZyBhIG1pbmltdW0gYW5kIG1heGltdW0KKyMgICB2ZXJzaW9uIG51bWJlci4gU2V0IHVwIGltcG9ydGFudCBMdWEgcGF0aHMsIHN1Y2ggYXMgdGhlIGRpcmVjdG9yaWVzIGluCisjICAgd2hpY2ggdG8gaW5zdGFsbCBzY3JpcHRzIGFuZCBtb2R1bGVzIChzaGFyZWQgbGlicmFyaWVzKS4KKyMKKyMgICBBbHNvIGRldGVjdCBMdWEgaGVhZGVycyBhbmQgbGlicmFyaWVzLiBUaGUgTHVhIHZlcnNpb24gY29udGFpbmVkIGluIHRoZQorIyAgIGhlYWRlciBpcyBjaGVja2VkIHRvIG1hdGNoIHRoZSBMdWEgaW50ZXJwcmV0ZXIgdmVyc2lvbiBleGFjdGx5LiBXaGVuCisjICAgc2VhcmNoaW5nIGZvciBMdWEgbGlicmFyaWVzLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdXNlZCBhcyBhIHN1ZmZpeC4KKyMgICBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgZ29hbCBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIEx1YSBpbnN0YWxscyAoNS4xLAorIyAgIDUuMiwgYW5kIDUuMyBzaWRlLWJ5LXNpZGUpLgorIworIyAgIEEgbm90ZSBvbiBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnM6IFRoaXMgZmlsZSBoYXMgYmVlbgorIyAgIG1vc3RseSByZXdyaXR0ZW4gZm9yIHNlcmlhbCAxOC4gTW9zdCBkZXZlbG9wZXJzIHNob3VsZCBiZSBhYmxlIHRvIHVzZQorIyAgIHRoZXNlIG1hY3JvcyB3aXRob3V0IG5lZWRpbmcgdG8gbW9kaWZ5IGNvbmZpZ3VyZS5hYy4gQ2FyZSBoYXMgYmVlbiB0YWtlbgorIyAgIHRvIHByZXNlcnZlIGVhY2ggbWFjcm8ncyBiZWhhdmlvciwgYnV0IHRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzOgorIworIyAgIDEpIEFYX1dJVEhfTFVBIGlzIGRlcHJlY2F0ZWQ7IGl0IG5vdyBleHBhbmRzIHRvIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzCisjICAgQVhfUFJPR19MVUEgd2l0aCBubyBhcmd1bWVudHMuCisjCisjICAgMikgQVhfTFVBX0hFQURFUlMgbm93IGNoZWNrcyB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBkZWZpbmVkIGluIGx1YS5oCisjICAgbWF0Y2hlcyB0aGUgaW50ZXJwcmV0ZXIgdmVyc2lvbi4gQVhfTFVBX0hFQURFUlNfVkVSU0lPTiBpcyB0aGVyZWZvcmUKKyMgICB1bm5lY2Vzc2FyeSwgc28gaXQgaXMgZGVwcmVjYXRlZCBhbmQgZG9lcyBub3QgZXhwYW5kIHRvIGFueXRoaW5nLgorIworIyAgIDMpIFRoZSBjb25maWd1cmUgZmxhZyAtLXdpdGgtbHVhLXN1ZmZpeCBubyBsb25nZXIgZXhpc3RzOyB0aGUgdXNlcgorIyAgIHNob3VsZCBpbnN0ZWFkIHNwZWNpZnkgdGhlIExVQSBwcmVjaW91cyB2YXJpYWJsZSBvbiB0aGUgY29tbWFuZCBsaW5lLgorIyAgIFNlZSB0aGUgQVhfUFJPR19MVUEgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMuCisjCisjICAgUGxlYXNlIHJlYWQgdGhlIG1hY3JvIGRlc2NyaXB0aW9ucyBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMKKyMgICBUaGlzIGZpbGUgd2FzIGluc3BpcmVkIGJ5IEFuZHJldyBEYWxrZSdzIGFuZCBKYW1lcyBIZW5zdHJpZGdlJ3MKKyMgICBweXRob24ubTQgYW5kIFRvbSBQYXluZSdzLCBNYXR0aGlldSBNb3kncywgYW5kIFJldWJlbiBUaG9tYXMncyBheF9sdWEubTQKKyMgICAoc2VyaWFsIDE3KS4gQmFzaWNhbGx5LCB0aGlzIGZpbGUgaXMgYSBtYXNoLXVwIG9mIHRob3NlIHR3byBmaWxlcy4gSQorIyAgIGxpa2UgdG8gdGhpbmsgaXQgY29tYmluZXMgdGhlIGJlc3Qgb2YgdGhlIHR3byEKKyMKKyMgICBBWF9QUk9HX0xVQTogU2VhcmNoIGZvciB0aGUgTHVhIGludGVycHJldGVyLCBhbmQgc2V0IHVwIGltcG9ydGFudCBMdWEKKyMgICBwYXRocy4gQWRkcyBwcmVjaW91cyB2YXJpYWJsZSBMVUEsIHdoaWNoIG1heSBjb250YWluIHRoZSBwYXRoIG9mIHRoZSBMdWEKKyMgICBpbnRlcnByZXRlci4gSWYgTFVBIGlzIGJsYW5rLCB0aGUgdXNlcidzIHBhdGggaXMgc2VhcmNoZWQgZm9yIGFuCisjICAgc3VpdGFibGUgaW50ZXJwcmV0ZXIuCisjCisjICAgSWYgTUlOSU1VTS1WRVJTSU9OIGlzIHN1cHBsaWVkLCB0aGVuIG9ubHkgTHVhIGludGVycHJldGVycyB3aXRoIGEKKyMgICB2ZXJzaW9uIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIE1JTklNVU0tVkVSU0lPTiB3aWxsIGJlIGFjY2VwdGVkLiBJZgorIyAgIFRPTy1CSUctVkVSU0lPTiBpcyBhbHNvIHN1cHBsaWVkLCB0aGVuIG9ubHkgTHVhIGludGVycHJldGVycyB3aXRoIGEKKyMgICB2ZXJzaW9uIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIE1JTklNVU0tVkVSU0lPTiBhbmQgbGVzcyB0aGFuCisjICAgVE9PLUJJRy1WRVJTSU9OIHdpbGwgYmUgYWNjZXB0ZWQuCisjCisjICAgVGhlIEx1YSB2ZXJzaW9uIG51bWJlciwgTFVBX1ZFUlNJT04sIGlzIGZvdW5kIGZyb20gdGhlIGludGVycHJldGVyLCBhbmQKKyMgICBzdWJzdGl0dXRlZC4gTFVBX1BMQVRGT1JNIGlzIGFsc28gZm91bmQsIGJ1dCBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAobm8KKyMgICBzdGFuZGFyZCByZXByZXNlbnRhdGlvbikuCisjCisjICAgRmluYWxseSwgdGhlIG1hY3JvIGZpbmRzIGZvdXIgcGF0aHM6CisjCisjICAgICBsdWFkaXIgICAgICAgICAgICAgRGlyZWN0b3J5IHRvIGluc3RhbGwgTHVhIHNjcmlwdHMuCisjICAgICBwa2dsdWFkaXIgICAgICAgICAgJGx1YWRpci8kUEFDS0FHRQorIyAgICAgbHVhZXhlY2RpciAgICAgICAgIERpcmVjdG9yeSB0byBpbnN0YWxsIEx1YSBtb2R1bGVzLgorIyAgICAgcGtnbHVhZXhlY2RpciAgICAgICRsdWFleGVjZGlyLyRQQUNLQUdFCisjCisjICAgVGhlc2UgcGF0aHMgYXJlIGZvdW5kIGJhc2VkIG9uICRwcmVmaXgsICRleGVjX3ByZWZpeCwgTHVhJ3MKKyMgICBwYWNrYWdlLnBhdGgsIGFuZCBwYWNrYWdlLmNwYXRoLiBUaGUgZmlyc3QgcGF0aCBvZiBwYWNrYWdlLnBhdGgKKyMgICBiZWdpbm5pbmcgd2l0aCAkcHJlZml4IGlzIHNlbGVjdGVkIGFzIGx1YWRpci4gVGhlIGZpcnN0IHBhdGggb2YKKyMgICBwYWNrYWdlLmNwYXRoIGJlZ2lubmluZyB3aXRoICRleGVjX3ByZWZpeCBpcyB1c2VkIGFzIGx1YWV4ZWNkaXIuIFRoaXMKKyMgICBzaG91bGQgd29yayBvbiBhbGwgcmVhc29uYWJsZSBMdWEgaW5zdGFsbGF0aW9ucy4gSWYgYSBwYXRoIGNhbm5vdCBiZQorIyAgIGRldGVybWluZWQsIGEgZGVmYXVsdCBwYXRoIGlzIHVzZWQuIE9mIGNvdXJzZSwgdGhlIHVzZXIgY2FuIG92ZXJyaWRlCisjICAgdGhlc2UgbGF0ZXIgd2hlbiBpbnZva2luZyBtYWtlLgorIworIyAgICAgbHVhZGlyICAgICAgICAgICAgIERlZmF1bHQ6ICRwcmVmaXgvc2hhcmUvbHVhLyRMVUFfVkVSU0lPTgorIyAgICAgbHVhZXhlY2RpciAgICAgICAgIERlZmF1bHQ6ICRleGVjX3ByZWZpeC9saWIvbHVhLyRMVUFfVkVSU0lPTgorIworIyAgIFRoZXNlIGRpcmVjdG9yaWVzIGNhbiBiZSB1c2VkIGJ5IEF1dG9tYWtlIGFzIGluc3RhbGwgZGVzdGluYXRpb25zLiBUaGUKKyMgICB2YXJpYWJsZSBuYW1lIG1pbnVzICdkaXInIG5lZWRzIHRvIGJlIHVzZWQgYXMgYSBwcmVmaXggdG8gdGhlCisjICAgYXBwcm9wcmlhdGUgQXV0b21ha2UgcHJpbWFyeSwgZS5nLiBsdWFfU0NSSVBTIG9yIGx1YWV4ZWNfTElCUkFSSUVTLgorIworIyAgIElmIGFuIGFjY2VwdGFibGUgTHVhIGludGVycHJldGVyIGlzIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcworIyAgIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcHJlZm9ybWVkLiBJZiBBQ1RJT04tSUYtTk9ULQorIyAgIEZPVU5EIGlzIGJsYW5rLCB0aGVuIGl0IHdpbGwgZGVmYXVsdCB0byBwcmludGluZyBhbiBlcnJvci4gVG8gcHJldmVudAorIyAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBnaXZlICc6JyBhcyBhbiBhY3Rpb24uCisjCisjICAgQVhfTFVBX0hFQURFUlM6IFNlYXJjaCBmb3IgTHVhIGhlYWRlcnMuIFJlcXVpcmVzIHRoYXQgQVhfUFJPR19MVUEgYmUKKyMgICBleHBhbmRlZCBiZWZvcmUgdGhpcyBtYWNyby4gQWRkcyBwcmVjaW91cyB2YXJpYWJsZSBMVUFfSU5DTFVERSwgd2hpY2gKKyMgICBtYXkgY29udGFpbiBMdWEgc3BlY2lmaWMgaW5jbHVkZSBmbGFncywgZS5nLiAtSS91c3IvaW5jbHVkZS9sdWE1LjEuIElmCisjICAgTFVBX0lOQ0xVREUgaXMgYmxhbmssIHRoZW4gdGhpcyBtYWNybyB3aWxsIGF0dGVtcHQgdG8gZmluZCBzdWl0YWJsZQorIyAgIGZsYWdzLgorIworIyAgIExVQV9JTkNMVURFIGNhbiBiZSB1c2VkIGJ5IEF1dG9tYWtlIHRvIGNvbXBpbGUgTHVhIG1vZHVsZXMgb3IKKyMgICBleGVjdXRhYmxlcyB3aXRoIGVtYmVkZGVkIGludGVycHJldGVycy4gVGhlICpfQ1BQRkxBR1MgdmFyaWFibGVzIHNob3VsZAorIyAgIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZSwgZS5nLiBteXByb2dfQ1BQRkxBR1MgPSAkKExVQV9JTkNMVURFKS4KKyMKKyMgICBUaGlzIG1hY3JvIHNlYXJjaGVzIGZvciB0aGUgaGVhZGVyIGx1YS5oIChhbmQgb3RoZXJzKS4gVGhlIHNlYXJjaCBpcworIyAgIHBlcmZvcm1lZCB3aXRoIGEgY29tYmluYXRpb24gb2YgQ1BQRkxBR1MsIENQQVRILCBldGMsIGFuZCBMVUFfSU5DTFVERS4KKyMgICBJZiB0aGUgc2VhcmNoIGlzIHVuc3VjY2Vzc2Z1bCwgdGhlbiBzb21lIGNvbW1vbiBkaXJlY3RvcmllcyBhcmUgdHJpZWQuCisjICAgSWYgdGhlIGhlYWRlcnMgYXJlIHRoZW4gZm91bmQsIHRoZW4gTFVBX0lOQ0xVREUgaXMgc2V0IGFjY29yZGluZ2x5LgorIworIyAgIFRoZSBwYXRocyBhdXRvbWF0aWNhbGx5IHNlYXJjaGVkIGFyZToKKyMKKyMgICAgICogL3Vzci9pbmNsdWRlL2x1YVguWQorIyAgICAgKiAvdXNyL2luY2x1ZGUvbHVhL1guWQorIyAgICAgKiAvdXNyL2luY2x1ZGUvbHVhWFkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YVguWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhLVguWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhL1guWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhWFkKKyMKKyMgICAoV2hlcmUgWC5ZIGlzIHRoZSBMdWEgdmVyc2lvbiBudW1iZXIsIGUuZy4gNS4xLikKKyMKKyMgICBUaGUgTHVhIHZlcnNpb24gbnVtYmVyIGZvdW5kIGluIHRoZSBoZWFkZXJzIGlzIGFsd2F5cyBjaGVja2VkIHRvIG1hdGNoCisjICAgdGhlIEx1YSBpbnRlcnByZXRlcidzIHZlcnNpb24gbnVtYmVyLiBMdWEgaGVhZGVycyB3aXRoIG1pc21hdGNoZWQKKyMgICB2ZXJzaW9uIG51bWJlcnMgYXJlIG5vdCBhY2NlcHRlZC4KKyMKKyMgICBJZiBoZWFkZXJzIGFyZSBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMgcGVyZm9ybWVkLCBvdGhlcndpc2UKKyMgICBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHBlcmZvcm1lZC4gSWYgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBibGFuaywgdGhlbgorIyAgIGl0IHdpbGwgZGVmYXVsdCB0byBwcmludGluZyBhbiBlcnJvci4gVG8gcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciwKKyMgICBzZXQgdGhlIGFjdGlvbiB0byAnOicuCisjCisjICAgQVhfTFVBX0xJQlM6IFNlYXJjaCBmb3IgTHVhIGxpYnJhcmllcy4gUmVxdWlyZXMgdGhhdCBBWF9QUk9HX0xVQSBiZQorIyAgIGV4cGFuZGVkIGJlZm9yZSB0aGlzIG1hY3JvLiBBZGRzIHByZWNpb3VzIHZhcmlhYmxlIExVQV9MSUIsIHdoaWNoIG1heQorIyAgIGNvbnRhaW4gTHVhIHNwZWNpZmljIGxpbmtlciBmbGFncywgZS5nLiAtbGx1YTUuMS4gSWYgTFVBX0xJQiBpcyBibGFuaywKKyMgICB0aGVuIHRoaXMgbWFjcm8gd2lsbCBhdHRlbXB0IHRvIGZpbmQgc3VpdGFibGUgZmxhZ3MuCisjCisjICAgTFVBX0xJQiBjYW4gYmUgdXNlZCBieSBBdXRvbWFrZSB0byBsaW5rIEx1YSBtb2R1bGVzIG9yIGV4ZWN1dGFibGVzIHdpdGgKKyMgICBlbWJlZGRlZCBpbnRlcnByZXRlcnMuIFRoZSAqX0xJQkFERCBhbmQgKl9MREFERCB2YXJpYWJsZXMgc2hvdWxkIGJlIHVzZWQKKyMgICBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuIG15bW9kX0xJQkFERCA9ICQoTFVBX0xJQikuCisjCisjICAgVGhpcyBtYWNybyBzZWFyY2hlcyBmb3IgdGhlIEx1YSBsaWJyYXJ5LiBNb3JlIHRlY2huaWNhbGx5LCBpdCBzZWFyY2hlcworIyAgIGZvciBhIGxpYnJhcnkgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gbHVhX2xvYWQuIFRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkCisjICAgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIExJQlMsIExJQlJBUllfUEFUSCwgYW5kIExVQV9MSUIuCisjCisjICAgSWYgdGhlIHNlYXJjaCBkZXRlcm1pbmVzIHRoYXQgc29tZSBsaW5rZXIgZmxhZ3MgYXJlIG1pc3NpbmcsIHRoZW4gdGhvc2UKKyMgICBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIExVQV9MSUIuCisjCisjICAgSWYgbGlicmFyaWVzIGFyZSBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMgcGVyZm9ybWVkLCBvdGhlcndpc2UKKyMgICBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHBlcmZvcm1lZC4gSWYgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBibGFuaywgdGhlbgorIyAgIGl0IHdpbGwgZGVmYXVsdCB0byBwcmludGluZyBhbiBlcnJvci4gVG8gcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciwKKyMgICBzZXQgdGhlIGFjdGlvbiB0byAnOicuCisjCisjICAgQVhfTFVBX1JFQURMSU5FOiBTZWFyY2ggZm9yIHJlYWRsaW5lIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gUmVxdWlyZXMgdGhlCisjICAgQVhfTElCX1JFQURMSU5FIG1hY3JvLCB3aGljaCBpcyBwcm92aWRlZCBieSBheF9saWJfcmVhZGxpbmUubTQgZnJvbSB0aGUKKyMgICBBdXRvY29uZiBBcmNoaXZlLgorIworIyAgIElmIGEgcmVhZGxpbmUgY29tcGF0aWJsZSBsaWJyYXJ5IGlzIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcworIyAgIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcGVyZm9ybWVkLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFJldWJlbiBUaG9tYXMgPHJydEBzYzNkLm9yZz4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQgVGltIFBlcmtpbnMgPHRwcms3N0BnbWFpbC5jb20+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCA0MAorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX1BST0dfTFVBKFtNSU5JTVVNLVZFUlNJT05dLCBbVE9PLUJJRy1WRVJTSU9OXSwKK2RubCAgICAgICAgICAgICBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9QUk9HX0xVQV0sCitbCisgIGRubCBDaGVjayBmb3IgcmVxdWlyZWQgdG9vbHMuCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSkKKworICBkbmwgTWFrZSBMVUEgYSBwcmVjaW91cyB2YXJpYWJsZS4KKyAgQUNfQVJHX1ZBUihbTFVBXSwgW1RoZSBMdWEgaW50ZXJwcmV0ZXIsIGUuZy4gL3Vzci9iaW4vbHVhNS4xXSkKKworICBkbmwgRmluZCBhIEx1YSBpbnRlcnByZXRlci4KKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BWF9MVUFfSU5URVJQUkVURVJfTElTVF0sCisgICAgW2x1YSBsdWE1LjMgbHVhNTMgbHVhNS4yIGx1YTUyIGx1YTUuMSBsdWE1MSBsdWE1MF0pCisKKyAgbTRfaWYoWyQxXSwgW10sCisgIFsgZG5sIE5vIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLiBGaW5kIGFueSBMdWEgaW50ZXJwcmV0ZXIuCisgICAgQVNfSUYoW3Rlc3QgIngkTFVBIiA9ICd4J10sCisgICAgICBbQUNfUEFUSF9QUk9HUyhbTFVBXSwgW19BWF9MVUFfSU5URVJQUkVURVJfTElTVF0sIFs6XSldKQorICAgIGF4X2Rpc3BsYXlfTFVBPSdsdWEnCisKKyAgICBBU19JRihbdGVzdCAieCRMVUEiICE9ICd4OiddLAorICAgICAgWyBkbmwgQXQgbGVhc3QgY2hlY2sgaWYgdGhpcyBpcyBhIEx1YSBpbnRlcnByZXRlci4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkTFVBIGlzIGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgICAgX0FYX0xVQV9DSEtfSVNfSU5UUlAoWyRMVUFdLAorICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoW25vdCBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICAgICAgXSkKKyAgICAgIF0pCisgIF0sCisgIFsgZG5sIEEgdmVyc2lvbiBjaGVjayBpcyBuZWVkZWQuCisgICAgQVNfSUYoW3Rlc3QgIngkTFVBIiAhPSAneCddLAorICAgIFsgZG5sIENoZWNrIGlmIHRoaXMgaXMgYSBMdWEgaW50ZXJwcmV0ZXIuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICRMVUEgaXMgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgX0FYX0xVQV9DSEtfSVNfSU5UUlAoWyRMVUFdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICBBQ19NU0dfRVJST1IoW25vdCBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICAgIF0pCisgICAgICBkbmwgQ2hlY2sgdGhlIHZlcnNpb24uCisgICAgICBtNF9pZihbJDJdLCBbXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJ3aGV0aGVyICRMVUEgdmVyc2lvbiA+PSAkMSJdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9IndoZXRoZXIgJExVQSB2ZXJzaW9uID49ICQxLCA8ICQyIl0pCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoWyRfYXhfY2hlY2tfdGV4dF0pCisgICAgICBfQVhfTFVBX0NIS19WRVIoWyRMVUFdLCBbJDFdLCBbJDJdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICBBQ19NU0dfRVJST1IoW3ZlcnNpb24gaXMgb3V0IG9mIHJhbmdlIGZvciBzcGVjaWZpZWQgTFVBXSldKQorICAgICAgYXhfZGlzcGxheV9MVUE9JExVQQorICAgIF0sCisgICAgWyBkbmwgVHJ5IGVhY2ggaW50ZXJwcmV0ZXIgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBzYXRpc2ZpZXMgVkVSU0lPTi4KKyAgICAgIG00X2lmKFskMl0sIFtdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9ImZvciBhIEx1YSBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gPj0gJDEiXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJmb3IgYSBMdWEgaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49ICQxLCA8ICQyIl0pCisgICAgICBBQ19DQUNIRV9DSEVDSyhbJF9heF9jaGVja190ZXh0XSwKKyAgICAgICAgW2F4X2N2X3BhdGhsZXNzX0xVQV0sCisgICAgICAgIFsgZm9yIGF4X2N2X3BhdGhsZXNzX0xVQSBpbiBfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1Qgbm9uZTsgZG8KKyAgICAgICAgICAgIHRlc3QgIngkYXhfY3ZfcGF0aGxlc3NfTFVBIiA9ICd4bm9uZScgJiYgYnJlYWsKKyAgICAgICAgICAgIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFskYXhfY3ZfcGF0aGxlc3NfTFVBXSwgW10sIFtjb250aW51ZV0pCisgICAgICAgICAgICBfQVhfTFVBX0NIS19WRVIoWyRheF9jdl9wYXRobGVzc19MVUFdLCBbJDFdLCBbJDJdLCBbYnJlYWtdKQorICAgICAgICAgIGRvbmUKKyAgICAgICAgXSkKKyAgICAgIGRubCBTZXQgJExVQSB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiAkYXhfY3ZfcGF0aGxlc3NfTFVBLgorICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfcGF0aGxlc3NfTFVBIiA9ICd4bm9uZSddLAorICAgICAgICBbTFVBPSc6J10sCisgICAgICAgIFtBQ19QQVRIX1BST0coW0xVQV0sIFskYXhfY3ZfcGF0aGxlc3NfTFVBXSldKQorICAgICAgYXhfZGlzcGxheV9MVUE9JGF4X2N2X3BhdGhsZXNzX0xVQQorICAgIF0pCisgIF0pCisKKyAgQVNfSUYoW3Rlc3QgIngkTFVBIiA9ICd4OiddLAorICBbIGRubCBSdW4gYW55IHVzZXItc3BlY2lmaWVkIGFjdGlvbiwgb3IgYWJvcnQuCisgICAgbTRfZGVmYXVsdChbJDRdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBzdWl0YWJsZSBMdWEgaW50ZXJwcmV0ZXJdKV0pCisgIF0sCisgIFsgZG5sIFF1ZXJ5IEx1YSBmb3IgaXRzIHZlcnNpb24gbnVtYmVyLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIHZlcnNpb25dLAorICAgICAgW2F4X2N2X2x1YV92ZXJzaW9uXSwKKyAgICAgIFsgZG5sIEdldCB0aGUgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpbiBYLlkgZm9ybWF0LiBUaGlzIHNob3VsZCB3b3JrIGZvcgorICAgICAgICBkbmwgaW50ZXJwcmV0ZXJzIHZlcnNpb24gNS4wIGFuZCBiZXlvbmQuCisgICAgICAgIGF4X2N2X2x1YV92ZXJzaW9uPVtgJExVQSAtZSAnCisgICAgICAgICAgLS0gcmV0dXJuIGEgdmVyc2lvbiBudW1iZXIgaW4gWC5ZIGZvcm1hdAorICAgICAgICAgIGxvY2FsIF8sIF8sIHZlciA9IHN0cmluZy5maW5kKF9WRVJTSU9OLCAiXkx1YSAoJWQrJS4lZCspIikKKyAgICAgICAgICBwcmludCh2ZXIpJ2BdCisgICAgICBdKQorICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X2x1YV92ZXJzaW9uIiA9ICd4J10sCisgICAgICBbQUNfTVNHX0VSUk9SKFtpbnZhbGlkIEx1YSB2ZXJzaW9uIG51bWJlcl0pXSkKKyAgICBBQ19TVUJTVChbTFVBX1ZFUlNJT05dLCBbJGF4X2N2X2x1YV92ZXJzaW9uXSkKKyAgICBBQ19TVUJTVChbTFVBX1NIT1JUX1ZFUlNJT05dLCBbYGVjaG8gIiRMVUFfVkVSU0lPTiIgfCAkU0VEICdzfFwufHwnYF0pCisKKyAgICBkbmwgVGhlIGZvbGxvd2luZyBjaGVjayBpcyBub3Qgc3VwcG9ydGVkOgorICAgIGRubCBBdCB0aW1lcyAobGlrZSB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMpIHlvdSBtYXkgd2FudCB0byBrbm93CisgICAgZG5sIHdoaWNoIE9TIHBsYXRmb3JtIEx1YSB0aGlua3MgdGhpcyBpcy4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSBwbGF0Zm9ybV0sCisgICAgICBbYXhfY3ZfbHVhX3BsYXRmb3JtXSwKKyAgICAgIFtheF9jdl9sdWFfcGxhdGZvcm09W2AkTFVBIC1lICdwcmludCgidW5rbm93biIpJ2BdXSkKKyAgICBBQ19TVUJTVChbTFVBX1BMQVRGT1JNXSwgWyRheF9jdl9sdWFfcGxhdGZvcm1dKQorCisgICAgZG5sIFVzZSB0aGUgdmFsdWVzIG9mICRwcmVmaXggYW5kICRleGVjX3ByZWZpeCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBkbmwgdmFsdWVzIG9mIExVQV9QUkVGSVggYW5kIExVQV9FWEVDX1BSRUZJWC4gVGhlc2UgYXJlIG1hZGUgZGlzdGluY3QKKyAgICBkbmwgdmFyaWFibGVzIHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZCBiZS4gSG93ZXZlciwgdGhlIGdlbmVyYWwKKyAgICBkbmwgY29uc2Vuc3VzIGlzIHRoYXQgeW91IHNob3VsZG4ndCBuZWVkIHRoaXMgYWJpbGl0eS4KKyAgICBBQ19TVUJTVChbTFVBX1BSRUZJWF0sIFsnJHtwcmVmaXh9J10pCisgICAgQUNfU1VCU1QoW0xVQV9FWEVDX1BSRUZJWF0sIFsnJHtleGVjX3ByZWZpeH0nXSkKKworICAgIGRubCBMdWEgcHJvdmlkZXMgbm8gd2F5IHRvIHF1ZXJ5IHRoZSBzY3JpcHQgZGlyZWN0b3J5LCBhbmQgaW5zdGVhZAorICAgIGRubCBwcm92aWRlcyBMVUFfUEFUSC4gSG93ZXZlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSBhIHNhZmUgZWR1Y2F0ZWQKKyAgICBkbmwgZ3Vlc3MuIElmIHRoZSBidWlsdC1pbiBzZWFyY2ggcGF0aCBjb250YWlucyBhIGRpcmVjdG9yeSB3aGljaCBpcworICAgIGRubCBwcmVmaXhlZCBieSAkcHJlZml4LCB0aGVuIHdlIGNhbiBzdG9yZSBzY3JpcHRzIHRoZXJlLiBUaGUgZmlyc3QKKyAgICBkbmwgbWF0Y2hpbmcgcGF0aCB3aWxsIGJlIHVzZWQuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgc2NyaXB0IGRpcmVjdG9yeV0sCisgICAgICBbYXhfY3ZfbHVhX2x1YWRpcl0sCisgICAgICBbIEFTX0lGKFt0ZXN0ICJ4JHByZWZpeCIgPSAneE5PTkUnXSwKKyAgICAgICAgICBbYXhfbHVhX3ByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXhdLAorICAgICAgICAgIFtheF9sdWFfcHJlZml4PSRwcmVmaXhdKQorCisgICAgICAgIGRubCBJbml0aWFsaXplIHRvIHRoZSBkZWZhdWx0IHBhdGguCisgICAgICAgIGF4X2N2X2x1YV9sdWFkaXI9IiRMVUFfUFJFRklYL3NoYXJlL2x1YS8kTFVBX1ZFUlNJT04iCisKKyAgICAgICAgZG5sIFRyeSB0byBmaW5kIGEgcGF0aCB3aXRoIHRoZSBwcmVmaXguCisgICAgICAgIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFskTFVBXSwgWyRheF9sdWFfcHJlZml4XSwgW3NjcmlwdF0pCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2x1YV9wcmVmaXhlZF9wYXRoIiAhPSAneCddLAorICAgICAgICBbIGRubCBGaXggdGhlIHByZWZpeC4KKyAgICAgICAgICBfYXhfc3RyaXBfcHJlZml4PWBlY2hvICIkYXhfbHVhX3ByZWZpeCIgfCAkU0VEICdzfC58LnxnJ2AKKyAgICAgICAgICBheF9jdl9sdWFfbHVhZGlyPWBlY2hvICIkYXhfbHVhX3ByZWZpeGVkX3BhdGgiIHwgXAorICAgICAgICAgICAgJFNFRCAic3xeJF9heF9zdHJpcF9wcmVmaXh8JExVQV9QUkVGSVh8ImAKKyAgICAgICAgXSkKKyAgICAgIF0pCisgICAgQUNfU1VCU1QoW2x1YWRpcl0sIFskYXhfY3ZfbHVhX2x1YWRpcl0pCisgICAgQUNfU1VCU1QoW3BrZ2x1YWRpcl0sIFtcJHtsdWFkaXJ9LyRQQUNLQUdFXSkKKworICAgIGRubCBMdWEgcHJvdmlkZXMgbm8gd2F5IHRvIHF1ZXJ5IHRoZSBtb2R1bGUgZGlyZWN0b3J5LCBhbmQgaW5zdGVhZAorICAgIGRubCBwcm92aWRlcyBMVUFfUEFUSC4gSG93ZXZlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSBhIHNhZmUgZWR1Y2F0ZWQKKyAgICBkbmwgZ3Vlc3MuIElmIHRoZSBidWlsdC1pbiBzZWFyY2ggcGF0aCBjb250YWlucyBhIGRpcmVjdG9yeSB3aGljaCBpcworICAgIGRubCBwcmVmaXhlZCBieSAkZXhlY19wcmVmaXgsIHRoZW4gd2UgY2FuIHN0b3JlIG1vZHVsZXMgdGhlcmUuIFRoZSBmaXJzdAorICAgIGRubCBtYXRjaGluZyBwYXRoIHdpbGwgYmUgdXNlZC4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSBtb2R1bGUgZGlyZWN0b3J5XSwKKyAgICAgIFtheF9jdl9sdWFfbHVhZXhlY2Rpcl0sCisgICAgICBbIEFTX0lGKFt0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9ICd4Tk9ORSddLAorICAgICAgICAgIFtheF9sdWFfZXhlY19wcmVmaXg9JGF4X2x1YV9wcmVmaXhdLAorICAgICAgICAgIFtheF9sdWFfZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4XSkKKworICAgICAgICBkbmwgSW5pdGlhbGl6ZSB0byB0aGUgZGVmYXVsdCBwYXRoLgorICAgICAgICBheF9jdl9sdWFfbHVhZXhlY2Rpcj0iJExVQV9FWEVDX1BSRUZJWC9saWIvbHVhLyRMVUFfVkVSU0lPTiIKKworICAgICAgICBkbmwgVHJ5IHRvIGZpbmQgYSBwYXRoIHdpdGggdGhlIHByZWZpeC4KKyAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLAorICAgICAgICAgIFskYXhfbHVhX2V4ZWNfcHJlZml4XSwgW21vZHVsZV0pCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2x1YV9wcmVmaXhlZF9wYXRoIiAhPSAneCddLAorICAgICAgICBbIGRubCBGaXggdGhlIHByZWZpeC4KKyAgICAgICAgICBfYXhfc3RyaXBfcHJlZml4PWBlY2hvICIkYXhfbHVhX2V4ZWNfcHJlZml4IiB8ICRTRUQgJ3N8LnwufGcnYAorICAgICAgICAgIGF4X2N2X2x1YV9sdWFleGVjZGlyPWBlY2hvICIkYXhfbHVhX3ByZWZpeGVkX3BhdGgiIHwgXAorICAgICAgICAgICAgJFNFRCAic3xeJF9heF9zdHJpcF9wcmVmaXh8JExVQV9FWEVDX1BSRUZJWHwiYAorICAgICAgICBdKQorICAgICAgXSkKKyAgICBBQ19TVUJTVChbbHVhZXhlY2Rpcl0sIFskYXhfY3ZfbHVhX2x1YWV4ZWNkaXJdKQorICAgIEFDX1NVQlNUKFtwa2dsdWFleGVjZGlyXSwgW1wke2x1YWV4ZWNkaXJ9LyRQQUNLQUdFXSkKKworICAgIGRubCBSdW4gYW55IHVzZXIgc3BlY2lmaWVkIGFjdGlvbi4KKyAgICAkMworICBdKQorXSkKKworZG5sIEFYX1dJVEhfTFVBIGlzIG5vdyB0aGUgc2FtZSB0aGluZyBhcyBBWF9QUk9HX0xVQS4KK0FDX0RFRlVOKFtBWF9XSVRIX0xVQV0sCitbCisgIEFDX01TR19XQVJOKFtbJDAgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBBWF9QUk9HX0xVQSBpbnN0ZWFkXV0pCisgIEFYX1BST0dfTFVBCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgX0FYX0xVQV9DSEtfSVNfSU5UUlAoUFJPRywgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW19BWF9MVUFfQ0hLX0lTX0lOVFJQXSwKK1sKKyAgZG5sIEEgbWluaW1hbCBMdWEgZmFjdG9yaWFsIHRvIHByb3ZlIHRoaXMgaXMgYW4gaW50ZXJwcmV0ZXIuIFRoaXMgc2hvdWxkIHdvcmsKKyAgZG5sIGZvciBMdWEgaW50ZXJwcmV0ZXJzIHZlcnNpb24gNS4wIGFuZCBiZXlvbmQuCisgIF9heF9sdWFfZmFjdG9yaWFsPVtgJDEgMj4vZGV2L251bGwgLWUgJworICAgIC0tIGEgc2ltcGxlIGZhY3RvcmlhbAorICAgIGZ1bmN0aW9uIGZhY3QgKG4pCisgICAgICBpZiBuID09IDAgdGhlbgorICAgICAgICByZXR1cm4gMQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbiAqIGZhY3Qobi0xKQorICAgICAgZW5kCisgICAgZW5kCisgICAgcHJpbnQoImZhY3QoNSkgaXMgIiAuLiBmYWN0KDUpKSdgXQorICBBU19JRihbdGVzdCAiJF9heF9sdWFfZmFjdG9yaWFsIiA9ICdmYWN0KDUpIGlzIDEyMCddLAorICAgIFskMl0sIFskM10pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgX0FYX0xVQV9DSEtfVkVSKFBST0csIE1JTklNVU0tVkVSU0lPTiwgW1RPTy1CSUctVkVSU0lPTl0sCitkbmwgICAgICAgICAgICAgICAgIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtfQVhfTFVBX0NIS19WRVJdLAorWworICBkbmwgQ2hlY2sgdGhhdCB0aGUgTHVhIHZlcnNpb24gaXMgd2l0aGluIHRoZSBib3VuZHMuIE9ubHkgdGhlIG1ham9yIGFuZCBtaW5vcgorICBkbmwgdmVyc2lvbiBudW1iZXJzIGFyZSBjb25zaWRlcmVkLiBUaGlzIHNob3VsZCB3b3JrIGZvciBMdWEgaW50ZXJwcmV0ZXJzCisgIGRubCB2ZXJzaW9uIDUuMCBhbmQgYmV5b25kLgorICBfYXhfbHVhX2dvb2RfdmVyc2lvbj1bYCQxIC1lICcKKyAgICAtLSBhIHNjcmlwdCB0byBjb21wYXJlIHZlcnNpb25zCisgICAgZnVuY3Rpb24gdmVyc3RyMm51bSh2ZXJzdHIpCisgICAgICBsb2NhbCBfLCBfLCBtYWpvcnZlciwgbWlub3J2ZXIgPSBzdHJpbmcuZmluZCh2ZXJzdHIsICJeKCVkKyklLiglZCspIikKKyAgICAgIGlmIG1ham9ydmVyIGFuZCBtaW5vcnZlciB0aGVuCisgICAgICAgIHJldHVybiB0b251bWJlcihtYWpvcnZlcikgKiAxMDAgKyB0b251bWJlcihtaW5vcnZlcikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGxvY2FsIG1pbnZlciA9IHZlcnN0cjJudW0oIiQyIikKKyAgICBsb2NhbCBfLCBfLCB0cmltdmVyID0gc3RyaW5nLmZpbmQoX1ZFUlNJT04sICJeTHVhICguKikiKQorICAgIGxvY2FsIHZlciA9IHZlcnN0cjJudW0odHJpbXZlcikKKyAgICBsb2NhbCBtYXh2ZXIgPSB2ZXJzdHIybnVtKCIkMyIpIG9yIDFlOQorICAgIGlmIG1pbnZlciA8PSB2ZXIgYW5kIHZlciA8IG1heHZlciB0aGVuCisgICAgICBwcmludCgieWVzIikKKyAgICBlbHNlCisgICAgICBwcmludCgibm8iKQorICAgIGVuZCdgXQorICAgIEFTX0lGKFt0ZXN0ICJ4JF9heF9sdWFfZ29vZF92ZXJzaW9uIiA9ICJ4eWVzIl0sCisgICAgICBbJDRdLCBbJDVdKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFBST0csIFBSRUZJWCwgU0NSSVBULU9SLU1PRFVMRS1ESVIpCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW19BWF9MVUFfRk5EX1BSRlhfUFRIXSwKK1sKKyAgZG5sIEdldCB0aGUgc2NyaXB0IG9yIG1vZHVsZSBkaXJlY3RvcnkgYnkgcXVlcnlpbmcgdGhlIEx1YSBpbnRlcnByZXRlciwKKyAgZG5sIGZpbHRlcmluZyBvbiB0aGUgZ2l2ZW4gcHJlZml4LCBhbmQgc2VsZWN0aW5nIHRoZSBzaGFsbG93ZXN0IHBhdGguIElmIG5vCisgIGRubCBwYXRoIGlzIGZvdW5kIG1hdGNoaW5nIHRoZSBwcmVmaXgsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuCisgIGRubCBUaGUgdGhpcmQgYXJndW1lbnQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBzZWFyY2gsIGl0IGNhbiBiZSAnc2NyaXB0JyBvcgorICBkbmwgJ21vZHVsZScuIFN1cHBseWluZyAnc2NyaXB0JyB3aWxsIHBlcmZvcm0gdGhlIHNlYXJjaCB3aXRoIHBhY2thZ2UucGF0aAorICBkbmwgYW5kIExVQV9QQVRILCBhbmQgc3VwcGx5aW5nICdtb2R1bGUnIHdpbGwgc2VhcmNoIHdpdGggcGFja2FnZS5jcGF0aCBhbmQKKyAgZG5sIExVQV9DUEFUSC4gVGhpcyBpcyBkb25lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMC4KKworICBheF9sdWFfcHJlZml4ZWRfcGF0aD1bYCQxIC1lICcKKyAgICAtLSBnZXQgdGhlIHBhdGggYmFzZWQgb24gc2VhcmNoIHR5cGUKKyAgICBsb2NhbCBzZWFyY2h0eXBlID0gIiQzIgorICAgIGxvY2FsIHBhdGhzID0gIiIKKyAgICBpZiBzZWFyY2h0eXBlID09ICJzY3JpcHQiIHRoZW4KKyAgICAgIHBhdGhzID0gKHBhY2thZ2UgYW5kIHBhY2thZ2UucGF0aCkgb3IgTFVBX1BBVEgKKyAgICBlbHNlaWYgc2VhcmNodHlwZSA9PSAibW9kdWxlIiB0aGVuCisgICAgICBwYXRocyA9IChwYWNrYWdlIGFuZCBwYWNrYWdlLmNwYXRoKSBvciBMVUFfQ1BBVEgKKyAgICBlbmQKKyAgICAtLSBzZWFyY2ggZm9yIHRoZSBwcmVmaXgKKyAgICBsb2NhbCBwcmVmaXggPSAiJyQyJyIKKyAgICBsb2NhbCBtaW5wYXRoID0gIiIKKyAgICBsb2NhbCBtaW5kZXB0aCA9IDFlOQorICAgIHN0cmluZy5nc3ViKHBhdGhzLCAiKEA8OkBeO0A6PkArKSIsCisgICAgICBmdW5jdGlvbiAocGF0aCkKKyAgICAgICAgcGF0aCA9IHN0cmluZy5nc3ViKHBhdGgsICIlPy4qJCIsICIiKQorICAgICAgICBwYXRoID0gc3RyaW5nLmdzdWIocGF0aCwgIi9APDpAXi9AOj5AKiQiLCAiIikKKyAgICAgICAgaWYgc3RyaW5nLmZpbmQocGF0aCwgcHJlZml4KSB0aGVuCisgICAgICAgICAgbG9jYWwgZGVwdGggPSBzdHJpbmcubGVuKHN0cmluZy5nc3ViKHBhdGgsICJAPDpAXi9AOj5AIiwgIiIpKQorICAgICAgICAgIGlmIGRlcHRoIDwgbWluZGVwdGggdGhlbgorICAgICAgICAgICAgbWlucGF0aCA9IHBhdGgKKyAgICAgICAgICAgIG1pbmRlcHRoID0gZGVwdGgKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQpCisgICAgcHJpbnQobWlucGF0aCknYF0KK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9MVUFfSEVBREVSUyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9MVUFfSEVBREVSU10sCitbCisgIGRubCBDaGVjayBmb3IgTFVBX1ZFUlNJT04uCisgIEFDX01TR19DSEVDS0lORyhbaWYgTFVBX1ZFUlNJT04gaXMgZGVmaW5lZF0pCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9WRVJTSU9OIiAhPSAneCddLAorICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBjaGVjayBMdWEgaGVhZGVycyB3aXRob3V0IGtub3dpbmcgTFVBX1ZFUlNJT05dKQorICAgIF0pCisKKyAgZG5sIE1ha2UgTFVBX0lOQ0xVREUgYSBwcmVjaW91cyB2YXJpYWJsZS4KKyAgQUNfQVJHX1ZBUihbTFVBX0lOQ0xVREVdLCBbVGhlIEx1YSBpbmNsdWRlcywgZS5nLiAtSS91c3IvaW5jbHVkZS9sdWE1LjFdKQorCisgIGRubCBTb21lIGRlZmF1bHQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLgorICBMVUFfU0hPUlRfVkVSU0lPTj1gZWNobyAiJExVQV9WRVJTSU9OIiB8ICRTRUQgJ3N8XC58fCdgCisgIG00X2RlZmluZV9kZWZhdWx0KFtfQVhfTFVBX0lOQ0xVREVfTElTVF0sCisgICAgWyAvdXNyL2luY2x1ZGUvbHVhJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvaW5jbHVkZS9sdWEtJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvaW5jbHVkZS9sdWEvJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvaW5jbHVkZS9sdWEkTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhLSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhLyRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICBdKQorCisgIGRubCBUcnkgdG8gZmluZCB0aGUgaGVhZGVycy4KKyAgX2F4X2x1YV9zYXZlZF9jcHBmbGFncz0kQ1BQRkxBR1MKKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkTFVBX0lOQ0xVREUiCisgIEFDX0NIRUNLX0hFQURFUlMoW2x1YS5oIGx1YWxpYi5oIGxhdXhsaWIuaCBsdWFjb25mLmhdKQorICBDUFBGTEFHUz0kX2F4X2x1YV9zYXZlZF9jcHBmbGFncworCisgIGRubCBUcnkgc29tZSBvdGhlciBkaXJlY3RvcmllcyBpZiBMVUFfSU5DTFVERSB3YXMgbm90IHNldC4KKyAgQVNfSUYoW3Rlc3QgIngkTFVBX0lOQ0xVREUiID0gJ3gnICYmCisgICAgICAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sdWFfaCIgIT0gJ3h5ZXMnXSwKKyAgICBbIGRubCBUcnkgc29tZSBjb21tb24gaW5jbHVkZSBwYXRocy4KKyAgICAgIGZvciBfYXhfaW5jbHVkZV9wYXRoIGluIF9BWF9MVUFfSU5DTFVERV9MSVNUOyBkbworICAgICAgICB0ZXN0ICEgLWQgIiRfYXhfaW5jbHVkZV9wYXRoIiAmJiBjb250aW51ZQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIEx1YSBoZWFkZXJzIGluXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJF9heF9pbmNsdWRlX3BhdGhdKQorCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbHVhX2hdKQorICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2x1YWxpYl9oXSkKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sYXV4bGliX2hdKQorICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2x1YWNvbmZfaF0pCisKKyAgICAgICAgX2F4X2x1YV9zYXZlZF9jcHBmbGFncz0kQ1BQRkxBR1MKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRfYXhfaW5jbHVkZV9wYXRoIgorICAgICAgICBBQ19DSEVDS19IRUFERVJTKFtsdWEuaCBsdWFsaWIuaCBsYXV4bGliLmggbHVhY29uZi5oXSkKKyAgICAgICAgQ1BQRkxBR1M9JF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3MKKworICAgICAgICBBU19JRihbdGVzdCAieCRhY19jdl9oZWFkZXJfbHVhX2giID0gJ3h5ZXMnXSwKKyAgICAgICAgICBbIExVQV9JTkNMVURFPSItSSRfYXhfaW5jbHVkZV9wYXRoIgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBdKQorICAgICAgZG9uZQorICAgIF0pCisKKyAgQVNfSUYoW3Rlc3QgIngkYWNfY3ZfaGVhZGVyX2x1YV9oIiA9ICd4eWVzJ10sCisgICAgWyBkbmwgTWFrZSBhIHByb2dyYW0gdG8gcHJpbnQgTFVBX1ZFUlNJT04gZGVmaW5lZCBpbiB0aGUgaGVhZGVyLgorICAgICAgZG5sIFRPRE8gSXQgd291bGQgYmUgcmVhbGx5IG5pY2UgaWYgd2UgY291bGQgZG8gdGhpcyB3aXRob3V0IGNvbXBpbGluZyBhCisgICAgICBkbmwgcHJvZ3JhbSwgdGhlbiBpdCB3b3VsZCB3b3JrIHdoZW4gY3Jvc3MgY29tcGlsaW5nLiBCdXQgSSdtIG5vdCBzdXJlIGhvdworICAgICAgZG5sIHRvIGRvIHRoaXMgcmVsaWFibHkuIEZvciBub3csIGFzc3VtZSB2ZXJzaW9ucyBtYXRjaCB3aGVuIGNyb3NzIGNvbXBpbGluZy4KKworICAgICAgQVNfSUYoW3Rlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiAhPSAneHllcyddLAorICAgICAgICBbIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTHVhIGhlYWRlciB2ZXJzaW9uXSwKKyAgICAgICAgICAgIFtheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb25dLAorICAgICAgICAgICAgWyBfYXhfbHVhX3NhdmVkX2NwcGZsYWdzPSRDUFBGTEFHUworICAgICAgICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRMVUFfSU5DTFVERSIKKyAgICAgICAgICAgICAgQUNfUlVOX0lGRUxTRSgKKyAgICAgICAgICAgICAgICBbIEFDX0xBTkdfU09VUkNFKFtbCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisgIGlmKGFyZ2MgPiAxKSBwcmludGYoIiVzIiwgTFVBX1ZFUlNJT04pOworICBleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CitdXSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFsgYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uPWAuL2NvbmZ0ZXN0JEVYRUVYVCBwIHwgXAorICAgICAgICAgICAgICAgICAgICAkU0VEIC1uICJzfF5MdWEgXChAPDpAMC05QDo+QFx7MSxcfVwuQDw6QDAtOUA6PkBcezEsXH1cKS5cezAsXH18XDF8cCJgCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uPSd1bmtub3duJ10pCisgICAgICAgICAgICAgIENQUEZMQUdTPSRfYXhfbHVhX3NhdmVkX2NwcGZsYWdzCisgICAgICAgICAgICBdKQorCisgICAgICAgICAgZG5sIENvbXBhcmUgdGhpcyB0byB0aGUgcHJldmlvdXNseSBmb3VuZCBMVUFfVkVSU0lPTi4KKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIEx1YSBoZWFkZXIgdmVyc2lvbiBtYXRjaGVzICRMVUFfVkVSU0lPTl0pCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uIiA9ICJ4JExVQV9WRVJTSU9OIl0sCisgICAgICAgICAgICBbIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgIGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoPSd5ZXMnCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICAgIGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoPSdubycKKyAgICAgICAgICAgIF0pCisgICAgICAgIF0sCisgICAgICAgIFsgQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZyBzbyBhc3N1bWluZyBoZWFkZXIgdmVyc2lvbiBudW1iZXIgbWF0Y2hlc10pCisgICAgICAgICAgYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2g9J3llcycKKyAgICAgICAgXSkKKyAgICBdKQorCisgIGRubCBXYXMgTFVBX0lOQ0xVREUgc3BlY2lmaWVkPworICBBU19JRihbdGVzdCAieCRheF9oZWFkZXJfdmVyc2lvbl9tYXRjaCIgIT0gJ3h5ZXMnICYmCisgICAgICAgICB0ZXN0ICJ4JExVQV9JTkNMVURFIiAhPSAneCddLAorICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIGhlYWRlcnMgZm9yIHNwZWNpZmllZCBMVUFfSU5DTFVERV0pXSkKKworICBkbmwgVGVzdCB0aGUgZmluYWwgcmVzdWx0IGFuZCBydW4gdXNlciBjb2RlLgorICBBU19JRihbdGVzdCAieCRheF9oZWFkZXJfdmVyc2lvbl9tYXRjaCIgPSAneHllcyddLCBbJDFdLAorICAgIFttNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIEx1YSBpbmNsdWRlc10pXSldKQorXSkKKworZG5sIEFYX0xVQV9IRUFERVJTX1ZFUlNJT04gbm8gbG9uZ2VyIGV4aXN0cywgdXNlIEFYX0xVQV9IRUFERVJTLgorQUNfREVGVU4oW0FYX0xVQV9IRUFERVJTX1ZFUlNJT05dLAorWworICBBQ19NU0dfV0FSTihbWyQwIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgQVhfTFVBX0hFQURFUlMgaW5zdGVhZF1dKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX0xVQV9MSUJTKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX0xVQV9MSUJTXSwKK1sKKyAgZG5sIFRPRE8gU2hvdWxkIHRoaXMgbWFjcm8gYWxzbyBjaGVjayB2YXJpb3VzIC1MIGZsYWdzPworCisgIGRubCBDaGVjayBmb3IgTFVBX1ZFUlNJT04uCisgIEFDX01TR19DSEVDS0lORyhbaWYgTFVBX1ZFUlNJT04gaXMgZGVmaW5lZF0pCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9WRVJTSU9OIiAhPSAneCddLAorICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBjaGVjayBMdWEgbGlicyB3aXRob3V0IGtub3dpbmcgTFVBX1ZFUlNJT05dKQorICAgIF0pCisKKyAgZG5sIE1ha2UgTFVBX0xJQiBhIHByZWNpb3VzIHZhcmlhYmxlLgorICBBQ19BUkdfVkFSKFtMVUFfTElCXSwgW1RoZSBMdWEgbGlicmFyeSwgZS5nLiAtbGx1YTUuMV0pCisKKyAgQVNfSUYoW3Rlc3QgIngkTFVBX0xJQiIgIT0gJ3gnXSwKKyAgWyBkbmwgQ2hlY2sgdGhhdCBMVUFfTElCUyB3b3Jrcy4KKyAgICBfYXhfbHVhX3NhdmVkX2xpYnM9JExJQlMKKyAgICBMSUJTPSIkTElCUyAkTFVBX0xJQiIKKyAgICBBQ19TRUFSQ0hfTElCUyhbbHVhX2xvYWRdLCBbXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J3llcyddLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0nbm8nXSkKKyAgICBMSUJTPSRfYXhfbHVhX3NhdmVkX2xpYnMKKworICAgIGRubCBDaGVjayB0aGUgcmVzdWx0LgorICAgIEFTX0lGKFt0ZXN0ICJ4JF9heF9mb3VuZF9sdWFfbGlicyIgIT0gJ3h5ZXMnXSwKKyAgICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIGxpYnMgZm9yIHNwZWNpZmllZCBMVUFfTElCXSldKQorICBdLAorICBbIGRubCBGaXJzdCBzZWFyY2ggZm9yIGV4dHJhIGxpYnMuCisgICAgX2F4X2x1YV9leHRyYV9saWJzPScnCisKKyAgICBfYXhfbHVhX3NhdmVkX2xpYnM9JExJQlMKKyAgICBMSUJTPSIkTElCUyAkTFVBX0xJQiIKKyAgICBBQ19TRUFSQ0hfTElCUyhbZXhwXSwgW21dKQorICAgIEFDX1NFQVJDSF9MSUJTKFtkbG9wZW5dLCBbZGxdKQorICAgIExJQlM9JF9heF9sdWFfc2F2ZWRfbGlicworCisgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3Zfc2VhcmNoX2V4cCIgIT0gJ3hubycgJiYKKyAgICAgICAgICAgdGVzdCAieCRhY19jdl9zZWFyY2hfZXhwIiAhPSAneG5vbmUgcmVxdWlyZWQnXSwKKyAgICAgIFtfYXhfbHVhX2V4dHJhX2xpYnM9IiRfYXhfbHVhX2V4dHJhX2xpYnMgJGFjX2N2X3NlYXJjaF9leHAiXSkKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9kbG9wZW4iICE9ICd4bm8nICYmCisgICAgICAgICAgIHRlc3QgIngkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgIT0gJ3hub25lIHJlcXVpcmVkJ10sCisgICAgICBbX2F4X2x1YV9leHRyYV9saWJzPSIkX2F4X2x1YV9leHRyYV9saWJzICRhY19jdl9zZWFyY2hfZGxvcGVuIl0pCisKKyAgICBkbmwgVHJ5IHRvIGZpbmQgdGhlIEx1YSBsaWJzLgorICAgIF9heF9sdWFfc2F2ZWRfbGlicz0kTElCUworICAgIExJQlM9IiRMSUJTICRMVUFfTElCIgorICAgIEFDX1NFQVJDSF9MSUJTKFtsdWFfbG9hZF0sCisgICAgICBbIGx1YSRMVUFfVkVSU0lPTiBcCisgICAgICAgIGx1YSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgICAgIGx1YS0kTFVBX1ZFUlNJT04gXAorICAgICAgICBsdWEtJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICAgICAgbHVhIFwKKyAgICAgIF0sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSd5ZXMnXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J25vJ10sCisgICAgICBbJF9heF9sdWFfZXh0cmFfbGlic10pCisgICAgTElCUz0kX2F4X2x1YV9zYXZlZF9saWJzCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfbHVhX2xvYWQiICE9ICd4bm8nICYmCisgICAgICAgICAgIHRlc3QgIngkYWNfY3Zfc2VhcmNoX2x1YV9sb2FkIiAhPSAneG5vbmUgcmVxdWlyZWQnXSwKKyAgICAgIFtMVUFfTElCPSIkYWNfY3Zfc2VhcmNoX2x1YV9sb2FkICRfYXhfbHVhX2V4dHJhX2xpYnMiXSkKKyAgXSkKKworICBkbmwgVGVzdCB0aGUgcmVzdWx0IGFuZCBydW4gdXNlciBjb2RlLgorICBBU19JRihbdGVzdCAieCRfYXhfZm91bmRfbHVhX2xpYnMiID0gJ3h5ZXMnXSwgWyQxXSwKKyAgICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBMdWEgbGlic10pXSldKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX0xVQV9SRUFETElORShbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9MVUFfUkVBRExJTkVdLAorWworICBBWF9MSUJfUkVBRExJTkUKKyAgQVNfSUYoW3Rlc3QgIngkYWNfY3ZfaGVhZGVyX3JlYWRsaW5lX3JlYWRsaW5lX2giICE9ICd4JyAmJgorICAgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfcmVhZGxpbmVfaGlzdG9yeV9oIiAhPSAneCddLAorICAgIFsgTFVBX0xJQlNfQ0ZMQUdTPSItRExVQV9VU0VfUkVBRExJTkUgJExVQV9MSUJTX0NGTEFHUyIKKyAgICAgICQxCisgICAgXSwKKyAgICBbJDJdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzc0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCAuTkVUIENvcmUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZQorIyAgIHNoZWxsIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcworIyAgIGluIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJGRvdG5ldGNvcmVfdmVyc2lvbiB2YXJpYWJsZSB3aWxsIGJlCisjICAgZmlsbGVkIHdpdGggdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkRE9UTkVUQ09SRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYKKyMgICAkRE9UTkVUQ09SRSBpcyBub3Qgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSxbZG90bmV0XSkKKyMgICAgIEFDX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFsxLjAuMl0sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciAuTkVUIENvcmUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMS4wLjIgaXMKKyMgICBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE2IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRET1RORVRDT1JFIl0sWworICAgICAgICBheF9kb3RuZXRjb3JlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIC5ORVQgQ29yZSB2ZXJzaW9uXSkKKyAgICAgICAgZG90bmV0Y29yZV92ZXJzaW9uPWAkRE9UTkVUQ09SRSAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXClcKC4qXCkvXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkZG90bmV0Y29yZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtET1RORVRDT1JFX1ZFUlNJT05dLFskZG90bmV0Y29yZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9kb3RuZXRjb3JlX3ZlcnNpb25dLFtsZV0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCAuTkVUIENvcmVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhY2M2NwotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSw2MCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19oYXhlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QUk9HX0hBWEVfVkVSU0lPTihbVkVSU0lPTl0sW0FDVElPTi1JRi1UUlVFXSxbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBNYWtlcyBzdXJlIHRoYXQgaGF4ZSBzdXBwb3J0cyB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQuIElmIHRydWUgdGhlIHNoZWxsCisjICAgY29tbWFuZHMgaW4gQUNUSU9OLUlGLVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRzIGluCisjICAgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSAkSEFYRV9WRVJTSU9OIHZhcmlhYmxlIHdpbGwgYmUgZmlsbGVkIHdpdGgKKyMgICB0aGUgZGV0ZWN0ZWQgdmVyc2lvbi4KKyMKKyMgICBUaGlzIG1hY3JvIHVzZXMgdGhlICRIQVhFIHZhcmlhYmxlIHRvIHBlcmZvcm0gdGhlIGNoZWNrLiBJZiAkSEFYRSBpcyBub3QKKyMgICBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1hY3JvLCB0aGUgbWFjcm8gd2lsbCBmYWlsLgorIworIyAgIEV4YW1wbGU6CisjCisjICAgICBBQ19QQVRIX1BST0coW0hBWEVdLFtoYXhlXSkKKyMgICAgIEFDX1BST0dfSEFYRV9WRVJTSU9OKFszLjEuM10sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciBIYXhlLCB0aGVuIGNoZWNrcyBpZiBhdCBsZWFzdCB2ZXJzaW9uIDMuMS4zIGlzIHByZXNlbnQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgSmVucyBHZXllciA8amVuc2dAYXBhY2hlLm9yZz4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMgorCitBQ19ERUZVTihbQVhfUFJPR19IQVhFX1ZFUlNJT05dLFsKKyAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCisKKyAgICBBU19JRihbdGVzdCAtbiAiJEhBWEUiXSxbCisgICAgICAgIGF4X2hheGVfdmVyc2lvbj0iJDEiCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaGF4ZSB2ZXJzaW9uXSkKKyAgICAgICAgaGF4ZV92ZXJzaW9uPWAkSEFYRSAtdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9eLiogXCggQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwpIC4qL1wxLydgCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhheGVfdmVyc2lvbikKKworCSAgICBBQ19TVUJTVChbSEFYRV9WRVJTSU9OXSxbJGhheGVfdmVyc2lvbl0pCisKKyAgICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskYXhfaGF4ZV92ZXJzaW9uXSxbbGVdLFskaGF4ZV92ZXJzaW9uXSxbCisJICAgIDoKKyAgICAgICAgICAgICQyCisgICAgICAgIF0sWworCSAgICA6CisgICAgICAgICAgICAkMworICAgICAgICBdKQorICAgIF0sWworICAgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgSGF4ZV0pCisgICAgICAgICQzCisgICAgXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00IGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNAppbmRleCAxMWEzMjZjLi43MGIzMjMwIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CisrKyBiL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19wZXJsX21vZHVsZXMuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTMyLDcgKzMyLDcgQEAKICMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CiAjICAgd2FycmFudHkuCiAKLSNzZXJpYWwgNworI3NlcmlhbCA4CiAKIEFVX0FMSUFTKFtBQ19QUk9HX1BFUkxfTU9EVUxFU10sIFtBWF9QUk9HX1BFUkxfTU9EVUxFU10pCiBBQ19ERUZVTihbQVhfUFJPR19QRVJMX01PRFVMRVNdLFtkbmwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfc2lnbmVkX3JpZ2h0X3NoaWZ0Lm00IGIvYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQKaW5kZXggMDE5NTIzMy4uOWMzY2ViNyAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQKKysrIGIvYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICAgIEFDX0RFRklORShbTE9HSUNBTF9SSUdIVF9TSElGVF0sIDIsIFtQb3NzaWJsZSB2YWx1ZSBmb3IgU0lHTkVEX1JJR0hUX1NISUZUX0lTXSkKICAgICAgICAgICBBQ19ERUZJTkUoW1VOS05PV05fUklHSFRfU0hJRlRdLCAzLCBbUG9zc2libGUgdmFsdWUgZm9yIFNJR05FRF9SSUdIVF9TSElGVF9JU10pCiAKLSAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2Vzc19hcml0aG1ldGljIiA9ICJ5ZXMiICYmIHRlc3QgIiRzdWNjZXNzX2xvZ2ljYSIgPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2Vzc19hcml0aG1ldGljIiA9ICJ5ZXMiICYmIHRlc3QgIiRzdWNjZXNzX2xvZ2ljYWwiID0gInllcyIgOyB0aGVuCiAgICAgICAgICAgICBBQ19NU0dfRVJST1IoIlJpZ2h0IHNoaWZ0IGFwcGVhcnMgdG8gYmUgYm90aCBhcml0aG1ldGljIGFuZCBsb2dpY2FsISIpCiAgICAgICAgICAgZWxpZiB0ZXN0ICIkc3VjY2Vzc19hcml0aG1ldGljIiA9ICJ5ZXMiIDsgdGhlbgogICAgICAgICAgICAgYXhfc2lnbmVkX3JpZ2h0X3NoaWZ0PWFyaXRobWV0aWMKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00IGIvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKaW5kZXggYTg0Y2I5ZS4uOGMwZTNjYiAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKKysrIGIvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKQEAgLTE1LDIxICsxNSw2IEBACiBkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CiBkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgogCi1BQ19ERUZVTihbQVhfVEhSSUZUX0dFTl0sCi0gICAgICAgICBbCi0gICAgICAgICAgQUNfQVJHX0VOQUJMRShbZ2VuLSQxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nZW4tJDFdLCBbZW5hYmxlIHRoZSAkMiBjb21waWxlciBAPDpAZGVmYXVsdD0kM0A6PkBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtheF90aHJpZnRfZ2VuXyQxPSIkZW5hYmxldmFsIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBbYXhfdGhyaWZ0X2dlbl8kMT0kM10KLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICBpZiB0ZXN0ICJ4JGF4X3RocmlmdF9nZW5fJDEiID0gInh5ZXMiIDsgdGhlbgotICAgICAgICAgICAgdGhyaWZ0X2dlbmVyYXRvcnM9IiR0aHJpZnRfZ2VuZXJhdG9ycyAkMSIKLSAgICAgICAgICBmaQotICAgICAgICAgIGRubCBJJ2QgbGlrZSB0byBydW4gdGhlIEFNX0NPTkRJVElPTkFMIGhlcmUsIGJ1dCBhdXRvbWFrZSBsaWtlcwotICAgICAgICAgIGRubCBhbGwgQU1fQ09ORElUSU9OQUxzIHRvIGJlIG5pY2UgYW5kIGV4cGxpY2l0IGluIGNvbmZpZ3VyZS5hYy4KLSAgICAgICAgICBkbmwgQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fJDFdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fJDEiID0gInllcyJdKQotICAgICAgICAgXSkKLQogQUNfREVGVU4oW0FYX1RIUklGVF9MSUJdLAogICAgICAgICAgWwogICAgICAgICAgIEFDX0FSR19XSVRIKCQxLApkaWZmIC0tZ2l0IGEvYXBwdmV5b3IueW1sIGIvYXBwdmV5b3IueW1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwMjE0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcHB2ZXlvci55bWwKQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQXBwVmV5b3IgLSBodHRwczovL2NpLmFwcHZleW9yLmNvbQorCit2ZXJzaW9uOiAnMS4wLjAue2J1aWxkfScKKworc2hhbGxvd19jbG9uZTogdHJ1ZQorCitvczoKKyAgLSBWaXN1YWwgU3R1ZGlvIDIwMTcKKworbWF0cml4OgorICBhbGxvd19mYWlsdXJlczoKKyAgICAgIC0gUFJPRklMRTogQ1lHV0lOCisgIGZhc3RfZmluaXNoOiB0cnVlCisKK2Vudmlyb25tZW50OgorICBtYXRyaXg6CisgICAtIFBST0ZJTEU6IE1TVkMyMDE3CisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjY1LjEKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4xLjgKKyAgICAgUFlUSE9OX1ZFUlNJT046IDMuNgorICAgICBRVF9WRVJTSU9OOiA1LjEwCisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjExCisgICAgIERJU0FCTEVEX1RFU1RTOiBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKworICAgLSBQUk9GSUxFOiBNU1ZDMjAxMworICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbGVhc2UKKyAgICAgQk9PU1RfVkVSU0lPTjogMS41OC4wCisgICAgIExJQkVWRU5UX1ZFUlNJT046IDIuMC4yMgorICAgICBQWVRIT05fVkVSU0lPTjogMy41CisgICAgIFFUX1ZFUlNJT046IDUuOAorICAgICBaTElCX1ZFUlNJT046IDEuMi44CisgICAgIERJU0FCTEVEX1RFU1RTOiBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKyAgICAgQVBQVkVZT1JfQlVJTERfV09SS0VSX0lNQUdFOiBWaXN1YWwgU3R1ZGlvIDIwMTUKKworICAgLSBQUk9GSUxFOiBNSU5HVworICAgICBQTEFURk9STTogeDY0CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKworICAgLSBQUk9GSUxFOiBDWUdXSU4KKyAgICAgUExBVEZPUk06IHg4NgorICAgICBDT05GSUdVUkFUSU9OOiBSZWxXaXRoRGViSW5mbworICAgICBESVNBQkxFRF9URVNUUzogKFpsaWJUZXN0fE9wZW5TU0xNYW51YWxJbml0VGVzdHxUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0fFN0cmVzc1Rlc3ROb25CbG9ja2luZykKKworIyAgLSBQUk9GSUxFOiBDWUdXSU4KKyMgICAgUExBVEZPUk06IHg2NAorIyAgICBDT05GSUdVUkFUSU9OOiBSZWxXaXRoRGViSW5mbworIyAgICBESVNBQkxFRF9URVNUUzogKFpsaWJUZXN0fE9wZW5TU0xNYW51YWxJbml0VGVzdHxUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0fFN0cmVzc1Rlc3ROb25CbG9ja2luZykKKworaW5zdGFsbDoKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQKKyAgLSByZWZyZXNoZW52CisKK2J1aWxkX3NjcmlwdDoKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0CisKK3Rlc3Rfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci10ZXN0LmJhdAorCisKKyMgYXJ0aWZhY3QgY2FwdHVyZSBkaXNhYmxlZCBhcyBpdCBtaWdodCBpbmNyZWFzZSBzZXJ2aWNlIGNvc3QgZm9yIGxpdHRsZSBnYWluOgorIworIyBhcnRpZmFjdHM6CisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1pbnN0CisjICAgIG5hbWU6IGNtYWtlIGluc3RhbGxlZCBjb250ZW50CisjICAgIHR5cGU6IHppcAorIworIyAgLSBwYXRoOiBsb2NhbC10aHJpZnQtYnVpbGRcVGVzdGluZworIyAgICBuYW1lOiBjdGVzdCBvdXRwdXQKKyMgICAgdHlwZTogemlwCisKKyMgUkRQIHN1cHBvcnQ6IHVzZSBvbmUgb3IgdGhlIG90aGVyLi4uCisjCisjIGVuYWJsZXMgUkRQIGZvciBlYWNoIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGluc3BlY3QgdGhlIGVudmlyb25tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGpvYjoKKyMgaW5pdDoKKyMgIC0gcHM6IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBlbmFibGVzIFJEUCBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCBqb2Igc28geW91IGNhbiBsb2dpbiBhbmQgcmUtcnVuCisjIGNvbW1hbmRzIHRvIHNlZSB3aHkgc29tZXRoaW5nIGZhaWxlZC4uLgorI29uX2ZpbmlzaDoKKyMgIC0gcHM6ICRibG9ja1JkcCA9ICR0cnVlOyBpZXggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBwdmV5b3IvY2kvbWFzdGVyL3NjcmlwdHMvZW5hYmxlLXJkcC5wczEnKSkKKyMKKyMgYWxzbyBuZWVkOgorIyBlbnZpcm9ubWVudDoKKyMgICBBUFBWRVlPUl9SRFBfUEFTU1dPUkQ6IHRocjFGVDIzNDUkeHl6WgpkaWZmIC0tZ2l0IGEvYm9vdHN0cmFwLnNoIGIvYm9vdHN0cmFwLnNoCmluZGV4IGNkYTIxZGYuLjI0NTJlZWEgMTAwNzU1Ci0tLSBhL2Jvb3RzdHJhcC5zaAorKysgYi9ib290c3RyYXAuc2gKQEAgLTIwLDcgKzIwLDExIEBACiAjCiAKIC4vY2xlYW51cC5zaAotKGNkIGxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgcGhwaXplKQoraWYgdGVzdCAtZCBsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sIDsgdGhlbgorICAgIGlmIHBocGl6ZSAtdiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDsgdGhlbgorICAgICAgICAoY2QgbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCAmJiBwaHBpemUpCisgICAgZmkKK2ZpCiAKIHNldCAtZQogCkBAIC0zNCw5ICszOCwyNCBAQAogICBleGl0IDEKIGZpCiAKK2Zvcm1hdF92ZXJzaW9uICgpIHsKKyAgICBwcmludGYgIiUwM2QlMDNkJTAzZCUwM2QiICQoZWNobyAkMSB8IHRyICcuJyAnICcpOworfQorCisjIHdlIHJlcXVpcmUgYXV0b21ha2UgMS4xMyBvciBsYXRlcgorIyBjaGVjayBtdXN0IGhhcHBlbiBleHRlcm5hbGx5IGR1ZSB0byB1c2Ugb2YgbmV3ZXIgbWFjcm8KK0FVVE9NQUtFX1ZFUlNJT049YGF1dG9tYWtlIC0tdmVyc2lvbiB8IGdyZXAgYXV0b21ha2UgfCBlZ3JlcCAtbyAnKFswLTldezEsfVwuKStbMC05XXsxLH0nYAoraWYgIFsgJChmb3JtYXRfdmVyc2lvbiAkQVVUT01BS0VfVkVSU0lPTikgLWx0ICQoZm9ybWF0X3ZlcnNpb24gMS4xMykgXTsgdGhlbgorICBlY2hvID4mMiAiYXV0b21ha2UgdmVyc2lvbiAkQVVUT01BS0VfVkVSU0lPTiBpcyB0b28gb2xkIChuZWVkIDEuMTMgb3IgbGF0ZXIpIgorICBleGl0IDEKK2ZpCisKK3NldCAtZQogYXV0b3NjYW4KICRMSUJUT09MSVpFIC0tY29weSAtLWF1dG9tYWtlCiBhY2xvY2FsIC1JIC4vYWNsb2NhbAogYXV0b2hlYWRlcgorc2VkICcvdW5kZWYgVkVSU0lPTi9kJyBjb25maWcuaGluID4gY29uZmlnLmhpbjIKK212IGNvbmZpZy5oaW4yIGNvbmZpZy5oaW4KIGF1dG9jb25mCiBhdXRvbWFrZSAtLWNvcHkgLS1hZGQtbWlzc2luZyAtLWZvcmVpZ24KZGlmZiAtLWdpdCBhL2Jvd2VyLmpzb24gYi9ib3dlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2I4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9ib3dlci5qc29uCkBAIC0wLDAgKzEsMTUgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwKKyAgImF1dGhvcnMiOiBbCisgICAgIkFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iCisgIF0sCisgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IiwKKyAgIm1haW4iOiAibGliL2pzL3NyYy90aHJpZnQuanMiLAorICAia2V5d29yZHMiOiBbCisgICAgInRocmlmdCIKKyAgXSwKKyAgImxpY2Vuc2UiOiAiQXBhY2hlIHYyIiwKKyAgImlnbm9yZSI6IFtdCit9CmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjYyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDM2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgQ01BS0VBUkdTPV4KKyAgLUcnJUdFTkVSQVRPUiUnIF4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPSVDT05GSUdVUkFUSU9OJSBeCisgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JUlOU1RESVIlIF4KKyAgLURDTUFLRV9DWFhfRVhURU5TSU9OUz1PTiBeCisgIC1EQ01BS0VfQ1hYX0ZMQUdTPSItRF9HTlVfU09VUkNFIiBeCisgIC1EQ01BS0VfQ1hYX1NUQU5EQVJEPTExIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTiBeCisgIC1EV0lUSF9TVERUSFJFQURTPU9OCisKK0BFQ0hPIE9OCislQkFTSCUgLWxjICJta2RpciAtcCAlQlVJTERESVIlICYmIGNkICVCVUlMRERJUiUgJiYgY21ha2UuZXhlICVTUkNESVIlICVDTUFLRUFSR1MlICYmIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyAlQ09ORklHVVJBVElPTiUgLS10YXJnZXQgaW5zdGFsbCIgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWluc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RiN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdApAQCAtMCwwICsxLDM0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQXBwdmV5b3IgaW5zdGFsbCBzY3JpcHQgZm9yIENZR1dJTgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6Cis6OiBJbnN0YWxsIGFwdC1jeWcgZm9yIHBhY2thZ2UgbWFuYWdlbWVudAorOjoKKworJUJBU0glIC1sYyAid2dldCByYXdnaXQuY29tL3RyYW5zY29kZS1vcGVuL2FwdC1jeWcvbWFzdGVyL2FwdC1jeWcgJiYgaW5zdGFsbCBhcHQtY3lnIC9iaW4gJiYgcm0gLWYgYXB0LWN5ZyIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAiYXB0LWN5ZyB1cGRhdGUiIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgaW5zdGFsbCBiaXNvbiBjbWFrZSBmbGV4IGdjYy1nKysgbGliYm9vc3QtZGV2ZWwgbGliZXZlbnQtZGV2ZWwgbWFrZSBvcGVuc3NsLWRldmVsIHpsaWItZGV2ZWwiCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY3ZjliCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSJSAmJiBjdGVzdC5leGUgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICclRElTQUJMRURfVEVTVFMlJyIgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdhOTVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW4vbWluZ3czMi1tYWtlIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW4vZ2NjLmV4ZSBeCisgIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW4vZysrLmV4ZSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0vbWluZ3clTk9STV9QTEFURk9STSUgXgorICAtRFdJVEhfUFlUSE9OPU9GRiBeCisgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgIC1EV0lUSF9TVEFUSUNfTElCPU9OCisKK0BFQ0hPIE9OCislQkFTSCUgLWxjICJta2RpciAtcCAlQlVJTERESVIlICYmIGNkICVCVUlMRERJUiUgJiYgY21ha2UuZXhlICVTUkNESVIlICVDTUFLRUFSR1MlICYmIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyAlQ09ORklHVVJBVElPTiUgLS10YXJnZXQgaW5zdGFsbCIgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWluc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDY5YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdApAQCAtMCwwICsxLDQ1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQXBwdmV5b3IgaW5zdGFsbCBzY3JpcHQgZm9yIE1JTkdXIG9uIE1TWVMyCis6OiBJbnN0YWxscyB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkIGZvciBhIGNtYWtlIGJ1aWxkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLWJvb3N0IF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLWNtYWtlIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLWxpYmV2ZW50IF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLW9wZW5zc2wgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtdG9vbGNoYWluIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXpsaWIKKworOjptaW5ndy13NjQtJU1JTkdXUExBVCUtcXQ1IDogV0FZIHRvbyBsYXJnZSAoMUdCIGRvd25sb2FkISkgLSB0ZXN0ZWQgaW4gY3lnd2luIGJ1aWxkcyBhbnl3YXkKKworOjogUmVtb3ZlIG9sZCBwYWNrYWdlcyB0aGF0IG5vIGxvbmdlciBleGlzdCB0byBhdm9pZCBhbiBlcnJvcgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC0tcmVtb3ZlIGxpYmNhdGdldHMgY2F0Z2V0cyB8fCB0cnVlIiB8fCBFWElUIC9CCisKKzo6IFVwZ3JhZGUgdGhpbmdzCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtU3UgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtICVQQUNLQUdFUyUiICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5YzFmZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyMiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSJSAmJiBjdGVzdC5leGUgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICclRElTQUJMRURfVEVTVFMlJyIgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI5MmEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSw0NyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK01LRElSICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0BFQ0hPIE9OCisgIGNtYWtlICIlU1JDRElSJSIgXgorICAgIC1HIiVHRU5FUkFUT1IlIiBeCisJLURCSVNPTl9FWEVDVVRBQkxFPUM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcbGliXHdpbmZsZXhiaXNvbjNcdG9vbHNcd2luX2Jpc29uLmV4ZSBeCisgICAgLURCT09TVF9ST09UPSIlQk9PU1RfUk9PVCUiIF4KKyAgICAtREJPT1NUX0xJQlJBUllESVI9IiVCT09TVF9MSUJSQVJZRElSJSIgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0iJUNPTkZJR1VSQVRJT04lIiBeCisgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0iJUlOU1RESVIlIiBeCisJLURGTEVYX0VYRUNVVEFCTEU9QzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxsaWJcd2luZmxleGJpc29uM1x0b29sc1x3aW5fZmxleC5leGUgXgorICAgIC1ESU5UVFlQRVNfUk9PVD0iJVdJTjNQJVxtc2ludHR5cGVzIiBeCisgICAgLURMSUJFVkVOVF9ST09UPSIlV0lOM1AlXGxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUiIF4KKyAgICAtRE9QRU5TU0xfUk9PVF9ESVI9IiVPUEVOU1NMX1JPT1QlIiBeCisgICAgLURPUEVOU1NMX1VTRV9TVEFUSUNfTElCUz1PRkYgXgorICAgIC1EWkxJQl9MSUJSQVJZPSIlV0lOM1AlXHpsaWItaW5zdFxsaWJcemxpYiVaTElCX0xJQl9TVUZGSVglLmxpYiIgXgorICAgIC1EWkxJQl9ST09UPSIlV0lOM1AlXHpsaWItaW5zdCIgXgorICAgIC1EV0lUSF9QWVRIT049JVdJVEhfUFlUSE9OJSBeCisgICAgLURXSVRIXyVUSFJFQURNT0RFTCVUSFJFQURTPU9OIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAgIC1EV0lUSF9TVEFUSUNfTElCPU9OICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitARUNITyBPRkYKKworY21ha2UgLS1idWlsZCAuIF4KKyAgLS1jb25maWcgIiVDT05GSUdVUkFUSU9OJSIgXgorICAtLXRhcmdldCBJTlNUQUxMICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWluc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTczZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdApAQCAtMCwwICsxLDU5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQXBwdmV5b3IgaW5zdGFsbCBzY3JpcHQgZm9yIE1TVkMKKzo6IEluc3RhbGxzIChvciBidWlsZHMpIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK2Nob2NvIGZlYXR1cmUgZW5hYmxlIC1uIGFsbG93R2xvYmFsQ29uZmlybWF0aW9uIHx8IEVYSVQgL0IKKworOjogVGhpbmdzIHRvIGluc3RhbGwgd2hlbiBOT1QgcnVubmluZyBpbiBhcHB2ZXlvcjoKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VwIC15IGNob2NvbGF0ZXkgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgY3VybCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgN3ppcCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgcHl0aG9uMyAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgY2luc3QgLXkgb3BlbnNzbC5saWdodCAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK2NpbnN0IC15IGpkazggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NpbnN0IC15IHdpbmZsZXhiaXNvbjMgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogemxpYiAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLXpsaWIuYmF0ICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IGxpYmV2ZW50IC0gbm90IGF2YWlsYWJsZSB0aHJvdWdoIGNob2NvbGF0ZXkKK0NEICIlQVBQVkVZT1JfU0NSSVBUUyUiICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NhbGwgYnVpbGQtbGliZXZlbnQuYmF0ICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogcHl0aG9uIHBhY2thZ2VzIChjb3JyZWN0IHBhdGggdG8gcGlwIHNldCBpbiBjbF9zZXRlbnYuYmF0KQorcGlwLmV4ZSBeCisgICAgaW5zdGFsbCBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIF4KKyAgICAgICAgICAgIGlwYWRkcmVzcyBeCisgICAgICAgICAgICBzaXggXgorICAgICAgICAgICAgdG9ybmFkbyBeCisgICAgICAgICAgICB0d2lzdGVkICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK2NpbnN0IC15IGdoYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTQ1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMzIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9OCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitESVIgQzpcbGlicmFyaWVzCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNTlfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYwXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82Ml8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjNfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzY0XzAKKworOjogQWRkIGRpcmVjdG9yaWVzIHRvIHRoZSBwYXRoIHRvIGZpbmQgRExMcyBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgc28gdGVzdHMgcnVuIHByb3Blcmx5IQorU0VUIFBBVEg9JUJPT1NUX0xJQlJBUllESVI6Lz1cJTslT1BFTlNTTF9ST09UJVxiaW47JVdJTjNQJVx6bGliLWluc3RcYmluOyVQQVRIJQorCitjdGVzdCAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgIiglRElTQUJMRURfVEVTVFMlKSIgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAxNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaAorU0VUIENNQUtFPS9jL21zeXM2NC9taW5ndzY0L2Jpbi9jbWFrZS5leGUKKworQEVDSE8gT04KK1NFVCBDTUFLRUFSR1M9LUdcIiVHRU5FUkFUT1IlXCIgXgorICAtREJvb3N0X0RFQlVHPU9OIF4KKyAgLURCb29zdF9OQU1FU1BBQ0U9bGliYm9vc3QgXgorICAtREJPT1NUX0lOQ0xVREVESVI9JUJPT1NUX0lOQ0xVREVESVIlIF4KKyAgLURCT09TVF9MSUJSQVJZRElSPSVCT09TVF9MSUJSQVJZRElSJSBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0NfQ09NUElMRVI9Z2NjLmV4ZSBeCisgIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKy5leGUgXgorICAtRENNQUtFX01BS0VfUFJPR1JBTT1tYWtlLmV4ZSBeCisgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JUlOU1RESVJfTVNZUyUgXgorICAtRExJQkVWRU5UX1JPT1Q9JUxJQkVWRU5UX1JPT1QlIF4KKyAgLURPUEVOU1NMX0xJQlJBUklFUz0lT1BFTlNTTF9MSUJSQVJJRVMlIF4KKyAgLURPUEVOU1NMX1JPT1RfRElSPSVPUEVOU1NMX1JPT1QlIF4KKyAgLURPUEVOU1NMX1VTRV9TVEFUSUNfTElCUz1PTiBeCisgIC1EV0lUSF9CT09TVF9TVEFUSUM9T04gXgorICAtRFdJVEhfSkFWQT1PRkYgXgorICAtRFdJVEhfTElCRVZFTlQ9T04gXgorICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTgorCislQkFTSCUgLWxjICJta2RpciAlQlVJTERESVJfTVNZUyUgJiYgY2QgJUJVSUxERElSX01TWVMlICYmICVDTUFLRSUgJVNSQ0RJUl9NU1lTJSAlQ01BS0VBUkdTJSAmJiAlQ01BS0UlIC0tYnVpbGQgLiAtLWNvbmZpZyAlQ09ORklHVVJBVElPTiUgLS10YXJnZXQgaW5zdGFsbCIgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWluc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE4ZGYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdApAQCAtMCwwICsxLDQ4IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogQXBwdmV5b3IgaW5zdGFsbCBzY3JpcHQgZm9yIE1TWVMKKzo6IEluc3RhbGxzIChvciBidWlsZHMpIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBXZSdyZSBnb2luZyB0byBrZWVwIGJvb3N0IGF0IGEgdmVyc2lvbiBjbWFrZSB1bmRlcnN0YW5kcworU0VUIEJPT1NUUEtHPW1pbmd3LXc2NC14ODZfNjQtYm9vc3QtMS42NC4wLTMtYW55LnBrZy50YXIueHoKK1NFVCBJR05PUkU9LS1pZ25vcmUgbWluZ3ctdzY0LXg4Nl82NC1ib29zdAorCitTRVQgUEFDS0FHRVM9XgorICAtLW5lZWRlZCAtUyBiaXNvbiBmbGV4IG1ha2UgXgorICBtaW5ndy13NjQteDg2XzY0LWNtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1saWJldmVudCBeCisgIG1pbmd3LXc2NC14ODZfNjQtb3BlbnNzbCBeCisgIG1pbmd3LXc2NC14ODZfNjQtdG9vbGNoYWluIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC16bGliCisKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtU3l1ICVJR05PUkUlIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtICVQQUNLQUdFUyUiICAgIHx8IEVYSVQgL0IKKworOjogSW5zdGFsbCBhIHNsaWdodGx5IG9sZGVyIGJvb3N0ICgxLjY0LjApIGFzIGNtYWtlIDMuMTAKKzo6IGRvZXMgbm90IGhhdmUgYnVpbHQtaW4gZGVwZW5kZW5jaWVzIGZvciBib29zdCAxLjY2LjAgeWV0Cis6OiAtLSB0aGlzIGN1dHMgZG93biBvbiBidWlsZCB3YXJuaW5nIG91dHB1dCAtLQorJUJBU0glIC1sYyAid2dldCBodHRwOi8vcmVwby5tc3lzMi5vcmcvbWluZ3cveDg2XzY0LyVCT09TVFBLRyUgJiYgcGFjbWFuIC0tbm9jb25maXJtIC0tbmVlZGVkIC1VICVCT09TVFBLRyUgJiYgcm0gJUJPT1NUUEtHJSIgfHwgRVhJVCAvQgorCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM3ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDI2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogcmFuZG9tbHkgZmFpbHMgb24gbWluZ3c7IHNlZSBKaXJhIFRIUklGVC00MTA2CitTRVQgRElTQUJMRURfVEVTVFM9Y29uY3VycmVuY3lfdGVzdAorCislQkFTSCUgLWxjICJjZCAlQlVJTERESVJfTVNZUyUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnKCVESVNBQkxFRF9URVNUUyUpJyIgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmFhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9SRUFETUUubWQKQEAgLTAsMCArMSwzNCBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBBcHB2ZXlvciBCdWlsZAorCitBcHB2ZXlvciBpcyBjYXBhYmxlIG9mIGJ1aWxkaW5nIE1TVkMgMjAxMCB0aHJvdWdoIDIwMTUgYXMgd2VsbCBhcworaGF2aW5nIHRoZSBsYXRlc3QgTVNZUzIvTWluR1cgNjQtYml0IGVudmlyb25tZW50LiAgSXQgaGFzIG1hbnkgdmVyc2lvbnMKK29mIGJvb3N0IGFuZCBweXRob24gaW5zdGFsbGVkIGFzIHdlbGwuICBTZWUgd2hhdCBhcHB2ZXlvciBoYXMKK1tpbnN0YWxsZWQgb24gYnVpbGQgd29ya2Vyc10oaHR0cHM6Ly93d3cuYXBwdmV5b3IuY29tL2RvY3MvaW5zdGFsbGVkLXNvZnR3YXJlLykuCisKK1dlIHJ1biBhIG1hdHJpeCBidWlsZCBvbiBBcHB2ZXlvciBhbmQgYnVpbGQgdGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnM6CisKKyogTWluR1cgeDY0IChnY2MgNi4zLjApCisqIE1TVkMgMjAxMCB4ODYsIGFuIG9sZGVyIGJvb3N0LCBhbiBvbGRlciBweXRob24KKyogTVNWQyAyMDE1IHg4Ni94NjQsIHRoZSBsYXRlc3QgYm9vc3QsIHRoZSBsYXRlc3QgcHl0aG9uCisqIE1TWVMyIHg2NCAoZ2NjIDYuMy4wKSAtIHRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzCisKK1RoZSBBcHB2ZXlvciBzY3JpcHQgdGFrZXMgdGhlIGZpcnN0IGZvdXIgbGV0dGVycyBmcm9tIHRoZSBQUk9GSUxFIHNwZWNpZmllZCBpbgordGhlIGVudmlyb25tZW50IHN0YW56YSBhbmQgcnVucyB0aGVzZSBzY3JpcHRzIGluIG9yZGVyOgorCis/Pz8/LWFwcHZleW9yLWluc3RhbGwuYmF0IHdpbGwgaW5zdGFsbCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYW5kIHNldCB1cCB0aGUgZW52aXJvbm1lbnQKKz8/Pz8tYXBwdmV5b3ItYnVpbGQuYmF0IHdpbGwgYnVpbGQgd2l0aCBjbWFrZQorPz8/Py1hcHB2ZXlvci10ZXN0LmJhdCB3aWxsIHJ1biBjdGVzdApkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjYzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC1saWJldmVudC5iYXQKQEAgLTAsMCArMSwzNyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgVVJMRklMRT1saWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlLnRhci5negorU0VUIFVSTD1odHRwczovL2dpdGh1Yi5jb20vbGliZXZlbnQvbGliZXZlbnQvcmVsZWFzZXMvZG93bmxvYWQvcmVsZWFzZS0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlLyVVUkxGSUxFJQorCis6OiBEb3dubG9hZCAtIHN1cHBvcnQgcnVubmluZyBhIGxvY2FsIGJ1aWxkIG9yIGEgYnVpbGQgaW4gYXBwdmV5b3IKK0NEICIlV0lOM1AlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cmwgLUwgLWYgLW8gIiVVUkxGSUxFJSIgIiVVUkwlIgorKSBFTFNFICgKKyAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVVUkwlIgorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgIHx8IEVYSVQgL0IKK0NEICJsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiAgICAgICAgICB8fCBFWElUIC9CCitubWFrZSAtZiBNYWtlZmlsZS5ubWFrZSBzdGF0aWNfbGlicyAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBpbiBsaWJldmVudCAyLjAgdGhlcmUgaXMgbm8gbm1ha2Ugc3ViZGlyZWN0b3J5IGluIFdJTjMyLUNvZGUsIGJ1dCBpbiAyLjEgdGhlcmUgaXMKK21rZGlyIGxpYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCittb3ZlICoubGliIGxpYlwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSBXSU4zMi1Db2RlXGV2ZW50MlwqIGluY2x1ZGVcZXZlbnQyXCAgICAgICAgIHx8IG1vdmUgV0lOMzItQ29kZVxubWFrZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgfHwgRVhJVCAvQgorbW92ZSAqLmggaW5jbHVkZVwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0IGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtemxpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NTcyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0CkBAIC0wLDAgKzEsNTYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFBBQ0tBR0U9emxpYi0lWkxJQl9WRVJTSU9OJQorU0VUIEJVSUxERElSPSVXSU4zUCVcemxpYi1idWlsZAorU0VUIElOU1RESVI9JVdJTjNQJVx6bGliLWluc3QKK1NFVCBTUkNESVI9JVdJTjNQJVwlUEFDS0FHRSUKK1NFVCBVUkxGSUxFPSVQQUNLQUdFJS50YXIuZ3oKKworOjogVGhpcyBhbGxvd3MgdXMgdG8gdG9sZXJhdGUgd2hlbiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGFyY2hpdmVkCitTRVQgVVJMPWh0dHA6Ly96bGliLm5ldC8lVVJMRklMRSUKK1NFVCBGVVJMPWh0dHA6Ly96bGliLm5ldC9mb3NzaWxzLyVVUkxGSUxFJQorCis6OiBEb3dubG9hZCAtIHN1cHBvcnQgcnVubmluZyBhIGxvY2FsIGJ1aWxkIG9yIGEgYnVpbGQgaW4gYXBwdmV5b3IKK0NEICIlV0lOM1AlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlRlVSTCUiCisgICAgKQorKSBFTFNFICgKKyAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVVUkwlIgorICAgIElGIEVSUk9STEVWRUwgMSAoCisgICAgICAgIGFwcHZleW9yIERvd25sb2FkRmlsZSAiJUZVUkwlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICApCispCis3eiB4ICIlVVJMRklMRSUiIC1zbyB8IDd6IHggLXNpIC10dGFyID4gbnVsICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogR2VuZXJhdGUKK01LRElSICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjbWFrZSAiJVNSQ0RJUiUiIF4KKyAgICAgIC1HIk5NYWtlIE1ha2VmaWxlcyIgXgorICAgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0iJUlOU1RESVIlIiBeCisgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9IiVDT05GSUdVUkFUSU9OJSIgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogQnVpbGQKK25tYWtlIC9mTWFrZWZpbGUgaW5zdGFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVDT05GSUdVUkFUSU9OJSIgPT0gIkRlYnVnIiAoCisgICAgQ09QWSAiJUJVSUxERElSJVx6bGliZC5wZGIiICIlSU5TVERJUiVcYmluXCIgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKykKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYyYTJhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2FwYWNoZV90aHJpZnQuYmF0CkBAIC0wLDAgKzEsMjQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1BcGFjaGUlMjBUaHJpZnQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgICAgICAgICAgICBfXyAgICAgICAgIF9fX19fX19fICAgICAgIF8gX19fX18KK0VDSE8gICAvIF8gfCBfX18gIF9fXyBfX19fXy8gLyAgX19fICAgL18gIF9fLyAvICBfX19fKF8pIF8vIC9fCitFQ0hPICAvIF9fIHwvIF8gXC8gXyBgLyBfXy8gXyBcLyAtXykgICAvIC8gLyBfIFwvIF9fLyAvIF8vIF9fLworRUNITyAvXy8gfF8vIC5fXy9cXyxfL1xfXy9fLy9fL1xfXy8gICAvXy8gL18vL18vXy8gL18vXy8gXF9fLworRUNITyAgICAgIC9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1CdWlsZAorCitFQ0hPLworRUNITyAgICBfX18gICAgICAgXyBfXyAgIF9fCitFQ0hPICAgLyBfIClfXyBfXyhfKSAvX18vIC8KK0VDSE8gIC8gXyAgLyAvLyAvIC8gLyBfICAvICAgICBAQEAgQlVJTEQKK0VDSE8gL19fX18vXF8sXy9fL18vXF8sXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlM2RhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9pbnN0YWxsLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9SW5zdGFsbAorCitFQ0hPLworRUNITyAgICBfX19fICAgICAgICAgX18gICAgICAgX19fXworRUNITyAgIC8gIF8vX18gIF9fXyAvIC9fX19fIF8vIC8gLworRUNITyAgXy8gLy8gXyBcKF8tXjwvIF9fLyBfIFwvIC8gLyAgICAgQEBAIElOU1RBTEwKK0VDSE8gL19fXy9fLy9fL19fXy9cX18vXF8sXy9fL18vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTJkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfdGVzdC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PVRlc3QKKworRUNITy8KK0VDSE8gIF9fX19fXyAgICAgICAgX18KK0VDSE8gL18gIF9fL19fIF9fXyAvIC9fCitFQ0hPICAvIC8gLyAtX158Xy1ePC8gX18vICAgICBAQEAgVEVTVAorRUNITyAvXy8gIFxfXy9fX18vXF9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNmZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Y29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4uCis6OiBTZXQgdGhlIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6ICAgZ2NjICAgPSBNaW5HVyAvIE1TWVMyIGFuZCBnY2MgdG9vbGNoYWluCis6OiAgIHZjMTAwID0gVmlzdWFsIFN0dWRpbyAyMDEwCis6OiAgIHZjMTEwID0gVmlzdWFsIFN0dWRpbyAyMDEyCis6OiAgIHZjMTIwID0gVmlzdWFsIFN0dWRpbyAyMDEzCis6OiAgIHZjMTQwID0gVmlzdWFsIFN0dWRpbyAyMDE1Cis6OiAgIHZjMTQxID0gVmlzdWFsIFN0dWRpbyAyMDE3Cis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQ09NUElMRVIgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIENPTVBJTEVSCisgIEVYSVQgL0IgMAorKQorCitJRiBOT1QgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorICBTRVQgQ09NUElMRVI9Z2NjCispIEVMU0UgKAorICBDQUxMIDpDSEVDSyAxNgorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTAwKQorICBDQUxMIDpDSEVDSyAxNworICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTEwKQorICBDQUxMIDpDSEVDSyAxOAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTIwKQorICBDQUxMIDpDSEVDSyAxOS4wCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDApCisgIENBTEwgOkNIRUNLIDE5LjEKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzE0MSkKKykKKworSUYgTk9UIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgY29tcGlsZXIgZWRpdGlvbgorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIGRldGVjdGVkIGNvbXBpbGVyIGVkaXRpb24gICAgJUNPTVBJTEVSJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElIiA+IG51bAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2V0ZW52LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzMzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQKQEAgLTAsMCArMSwxMjEgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorCitJRiAiJVBST0ZJTEUlIiA9PSAiTVNWQzIwMTIiICgKKyAgQ0FMTCAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMS4wXFZDXHZjdmFyc2FsbC5iYXQiICVQTEFURk9STSUKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTVNWQzIwMTMiICgKKyAgQ0FMTCAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMi4wXFZDXHZjdmFyc2FsbC5iYXQiICVQTEFURk9STSUKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTVNWQzIwMTUiICgKKyAgQ0FMTCAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxNC4wXFZDXHZjdmFyc2FsbC5iYXQiICVQTEFURk9STSUKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTVNWQzIwMTciICgKKyAgQ0FMTCA6U0VUVVBORVdFUk1TVkMgICAgfHwgRVhJVCAvQgorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNSU5HVyIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiQ1lHV0lOIiAoCisgIFJFTSBTdXBwb3J0ZWQsIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLgorKSBFTFNFICgKKyAgRUNITyBVbnN1cHBvcnRlZCBQUk9GSUxFPSVQUk9GSUxFJSBvciBQTEFURk9STT0lUExBVEZPUk0lCisgIEVYSVQgL0IgMQorKQorCitDQUxMIGNsX3NldGNvbXBpbGVyLmJhdCAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0Z2VuZXJhdG9yLmJhdCAgfHwgRVhJVCAvQgorCitTRVQgQVBQVkVZT1JfU0NSSVBUUz0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVxidWlsZFxhcHB2ZXlvcgorU0VUIEJVSUxERElSPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXC4uXGJ1aWxkXCVQUk9GSUxFJVwlUExBVEZPUk0lCitTRVQgSU5TVERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIFNSQ0RJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJQorCis6OiBQTEFURk9STSBpcyB4NjQgb3IgeDg2Cis6OiBOT1JNX1BMQVRGT1JNIGlzIDY0IG9yIDMyCitTRVQgTk9STV9QTEFURk9STT0lUExBVEZPUk06fi0yLDIlCitJRiAiJU5PUk1fUExBVEZPUk0lIiA9PSAiODYiIChTRVQgTk9STV9QTEFURk9STT0zMikKKworSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorCisgIDo6IEZpbmRCb29zdCBuZWVkcyBmb3J3YXJkIHNsYXNoZXMgc28gY21ha2UgZG9lc24ndCBzZWUgc29tZXRoaW5nIGFzIGFuIGVzY2FwZWQgY2hhcmFjdGVyCisgIFNFVCBCT09TVF9ST09UPUM6L0xpYnJhcmllcy9ib29zdF8lQk9PU1RfVkVSU0lPTjouPV8lCisgIFNFVCBCT09TVF9MSUJSQVJZRElSPSFCT09TVF9ST09UIS9saWIlTk9STV9QTEFURk9STSUtbXN2Yy0lQ09NUElMRVI6fi0zLDIlLiVDT01QSUxFUjp+LTEsMSUKKyAgU0VUIE9QRU5TU0xfUk9PVD1DOlxPcGVuU1NMLVdpbiVOT1JNX1BMQVRGT1JNJQorICBTRVQgV0lOM1A9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcdGhpcmRwYXJ0eQorCisgIFNFVCBUSFJFQURNT0RFTD1TVEQKKworICBJRiAiJVBZVEhPTl9WRVJTSU9OJSIgPT0gIiIgKAorICAgIFNFVCBXSVRIX1BZVEhPTj1PRkYKKyAgKSBFTFNFICgKKyAgICBTRVQgV0lUSF9QWVRIT049T04KKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFBURVhUPS14NjQKKyAgICBTRVQgUEFUSD1DOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUIVxzY3JpcHRzO0M6XFB5dGhvbiVQWVRIT05fVkVSU0lPTjouPSUhUFRFWFQhOyFQQVRIIQorICApCisgIElGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX0xJQl9TVUZGSVg9ZCkKKworICBJRiBOT1QgIiVRVF9WRVJTSU9OJSIgPT0gIiIgKAorICAgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgUVRFWFQ9XzY0CisgICAgU0VUIFBBVEg9QzpcUXRcJVFUX1ZFUlNJT04lXCVQUk9GSUxFJSFRVEVYVCFcYmluOyFQQVRIIQorICApCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNSU5HIiAoCisKKyAgOjogUExBVEZPUk0gPSB4ODYgbWVhbnMgTUlOR1dQTEFUIGk2ODYKKyAgOjogUExBVEZPUk0gPSB4NjQgbWVhbnMgTUlOR1dQTEFUIHg4Nl82NAorICBTRVQgTUlOR1dQTEFUPXg4Nl82NAorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng4NiIgKFNFVCBNSU5HV1BMQVQ9aTY4NikKKworICBTRVQgQkFTSD1DOlxtc3lzNjRcdXNyXGJpblxiYXNoLmV4ZQorICAhQkFTSCEgLWxjICJzZWQgLWkgJy9leHBvcnQgUEFUSD1cL21pbmd3MzJcL2Jpbi9kJyB+Ly5iYXNoX3Byb2ZpbGUgJiYgc2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzY0XC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIGVjaG8gJ2V4cG9ydCBQQVRIPS9taW5ndyVOT1JNX1BMQVRGT1JNJS9iaW46JFBBVEgnID4+IH4vLmJhc2hfcHJvZmlsZSIgfHwgRVhJVCAvQgorCisgIFNFVCBCVUlMRERJUj0lQlVJTERESVI6XD0vJQorICBTRVQgQlVJTERESVI9L2MhQlVJTERESVI6fjIhCisgIFNFVCBJTlNURElSPSVJTlNURElSOlw9LyUKKyAgU0VUIElOU1RESVI9L2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vYyFTUkNESVI6fjIhCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJDWUdXIiAoCisKKyAgU0VUIENZR1dJTlJPT1Q9QzpcY3lnd2luCisgIElGICIlUExBVEZPUk0lIiA9PSAieDY0IiAoU0VUIENZR1dJTlJPT1Q9IUNZR1dJTlJPT1QhNjQpCisKKyAgU0VUIEJBU0g9IUNZR1dJTlJPT1QhXGJpblxiYXNoLmV4ZQorICBTRVQgU0VUVVA9IUNZR1dJTlJPT1QhXHNldHVwLXg4NgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBTRVRVUD0hU0VUVVAhXzY0KQorICBTRVQgU0VUVVA9IVNFVFVQIS5leGUKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jeWdkcml2ZS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSX0NZRz0vY3lnZHJpdmUvYyFJTlNURElSOn4yIQorICBTRVQgU1JDRElSPSVTUkNESVI6XD0vJQorICBTRVQgU1JDRElSPS9jeWdkcml2ZS9jIVNSQ0RJUjp+MiEKKworKQorCitHT1RPIDpFT0YKKworOlNFVFVQTkVXRVJNU1ZDCisgIEZPUiAvRiAiVVNFQkFDS1EgVE9LRU5TPSoiICUlaSBJTiAoYGNhbGwgIiVQcm9ncmFtRmlsZXMoeDg2KSVcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW9cSW5zdGFsbGVyXHZzd2hlcmUuZXhlIiAtdmVyc2lvbiAiWzE1LjAsMTYuMCkiIC1wcm9wZXJ0eSBpbnN0YWxsYXRpb25QYXRoYCkgRE8gKAorICAgIElGICIlTVNWQ1JPT1QlIiA9PSAiIiAoU0VUIE1TVkNST09UPSUlaSkKKyAgKQorICBTRVQgTVNWQ1BMQVQ9eDg2CisgIElGICIlUExBVEZPUk0lIiA9PSAieDY0IiAoU0VUIE1TVkNQTEFUPWFtZDY0KQorCisgIFNFVCBDVVJSRU5URElSPSVDRCUKKyAgQ0FMTCAiIU1TVkNST09UIVxDb21tb243XFRvb2xzXFZzRGV2Q21kLmJhdCIgLWFyY2g9IU1TVkNQTEFUISB8fCBFWElUIC9CCisgIENEICVDVVJSRU5URElSJQorICBFWElUIC9CCisKKzpFT0YKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjZmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0CkBAIC0wLDAgKzEsNzkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4gYW5kIHRoZW4KKzo6IHNldCB0aGUgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6Cis6OiAgVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTcgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTQgMjAxNSBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE1IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTIgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTAgMjAxMCBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEwIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiSUE2NCIuCis6OiAgTWluR1cgTWFrZWZpbGVzICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIE1pbkdXCis6OiAgTVNZUyBNYWtlZmlsZXMgICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIE1TWVMKKzo6ICBVbml4IE1ha2VmaWxlcyAgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgQ1lHV0lOCis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEdFTkVSQVRPUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIEdFTkVSQVRPUgorICBFWElUIC9CIDAKKykKKworCitJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNSU5HIiAoCisgIFNFVCBHRU5FUkFUT1I9TWluR1cgTWFrZWZpbGVzCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJDWUdXIiAoCisgIFNFVCBHRU5FUkFUT1I9VW5peCBNYWtlZmlsZXMKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TWVMiICgKKyAgU0VUIEdFTkVSQVRPUj1NU1lTIE1ha2VmaWxlcworKSBFTFNFICgKKyAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBHRU5BUkNIPSBXaW42NAorICBDQUxMIDpDSEVDSyAxNgorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTAgMjAxMCFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxNworICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTEgMjAxMiFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTIgMjAxMyFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOS4wCisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNCAyMDE1IUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE5LjEKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE1IDIwMTchR0VOQVJDSCEKKykKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIENNYWtlIGdlbmVyYXRvciB0byB1c2UKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSB1c2luZyBDTWFrZSBnZW5lcmF0b3IgICAgICAgICVHRU5FUkFUT1IlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUiID4gbnVsCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGE0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitFQ0hPLworRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCitFQ0hPIFZlcnNpb25zCitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gYm9vc3QgICAgICAgICAgICAgICAgID0gJUJPT1NUX1ZFUlNJT04lCitFQ0hPIGxpYmV2ZW50ICAgICAgICAgICAgICA9ICVMSUJFVkVOVF9WRVJTSU9OJQorRUNITyBweXRob24gICAgICAgICAgICAgICAgPSAlUFlUSE9OX1ZFUlNJT04lCitFQ0hPIHF0ICAgICAgICAgICAgICAgICAgICA9ICVRVF9WRVJTSU9OJQorRUNITyB6bGliICAgICAgICAgICAgICAgICAgPSAlWkxJQl9WRVJTSU9OJQorRUNITy8KKykKK0VDSE8gQXBwdmV5b3IgVmFyaWFibGVzCitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gQVBQVkVZT1JfQlVJTERfRk9MREVSID0gJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0VDSE8gQ09ORklHVVJBVElPTiAgICAgICAgID0gJUNPTkZJR1VSQVRJT04lCitFQ0hPIFBMQVRGT1JNICAgICAgICAgICAgICA9ICVQTEFURk9STSUKK0VDSE8gUFJPRklMRSAgICAgICAgICAgICAgID0gJVBST0ZJTEUlCitFQ0hPLworRUNITyBPdXIgVmFyaWFibGVzCitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gQVBQVkVZT1JfU0NSSVBUUyAgICAgID0gJUFQUFZFWU9SX1NDUklQVFMlCitFQ0hPIEJBU0ggICAgICAgICAgICAgICAgICA9ICVCQVNIJQorRUNITyBCT09TVF9ST09UICAgICAgICAgICAgPSAlQk9PU1RfUk9PVCUKK0VDSE8gQk9PU1RfSU5DTFVERURJUiAgICAgID0gJUJPT1NUX0lOQ0xVREVESVIlCitFQ0hPIEJPT1NUX0xJQlJBUllESVIgICAgICA9ICVCT09TVF9MSUJSQVJZRElSJQorRUNITyBCVUlMRERJUiAgICAgICAgICAgICAgPSAlQlVJTERESVIlCitFQ0hPIENPTVBJTEVSICAgICAgICAgICAgICA9ICVDT01QSUxFUiUKK0VDSE8gR0VORVJBVE9SICAgICAgICAgICAgID0gJUdFTkVSQVRPUiUKK0VDSE8gSU5TVERJUiAgICAgICAgICAgICAgID0gJUlOU1RESVIlCitFQ0hPIEpBVkFfSE9NRSAgICAgICAgICAgICA9ICVKQVZBX0hPTUUlCitFQ0hPIE9QRU5TU0xfUk9PVCAgICAgICAgICA9ICVPUEVOU1NMX1JPT1QlCitFQ0hPIFNFVFVQICAgICAgICAgICAgICAgICA9ICVTRVRVUCUKK0VDSE8gU1JDRElSICAgICAgICAgICAgICAgID0gJVNSQ0RJUiUKK0VDSE8gV0lOM1AgICAgICAgICAgICAgICAgID0gJVdJTjNQJQorRUNITyBXSVRIX1BZVEhPTiAgICAgICAgICAgPSAlV0lUSF9QWVRIT04lCitFQ0hPIFpMSUJfU1RBVElDX1NVRkZJWCAgICA9ICVaTElCX1NUQVRJQ19TVUZGSVglCitJRiBOT1QgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorICBFQ0hPLworICBFQ0hPIFVOSVh5IFBBVEgKKyAgRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICVCQVNIJSAtbGMgImVjaG8gJFBBVEgiCispCitFQ0hPLworRUNITyBXaW5kb3dzIFBBVEgKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyAlUEFUSCUKK0VDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL3NpbXVsYXRlLWFwcHZleW9yLmJhdCBiL2J1aWxkL2FwcHZleW9yL3NpbXVsYXRlLWFwcHZleW9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc0ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0CkBAIC0wLDAgKzEsMzUgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBIZWxwcyBidWlsZCB0aHJpZnQgYnkgcHJldGVuZGluZyB0byBiZSBhcHB2ZXlvcgorOjogVXNhZ2U6Cis6OiAgIGNkIGJ1aWxkXGFwcHZleW9yCis6OiAgIHNpbXVsYXRlLWFwcHZleW9yLmJhdCBbRGVidWd8UmVsZWFzZV0gW3g4Nnx4NjRdIFtDWUdXSU58TUlOR1d8TVNWQzIwMT9dCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIEFQUFZFWU9SX0JVSUxEX0ZPTERFUj0lfmRwMC4uXC4uCitTRVQgQ09ORklHVVJBVElPTj0lMQorU0VUIFBMQVRGT1JNPSUyCitTRVQgUFJPRklMRT0lMworCitDRCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorQ0FMTCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdCB8fCBFWElUIC9CCitDRCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorQ0FMTCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1idWlsZC5iYXQgICB8fCBFWElUIC9CCitDRCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorQ0FMTCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci10ZXN0LmJhdApkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UgYi9idWlsZC9jbWFrZS9DUGFja0NvbmZpZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGMxYjRlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKQEAgLTAsMCArMSw2OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworI1RPRE86IFNob3VsZCB3ZSBidW5kbGUgc3lzdGVtIGxpYnJhcmllcyBmb3IgRExMcz8KKyNpbmNsdWRlKEluc3RhbGxSZXF1aXJlZFN5c3RlbUxpYnJhcmllcykKKworIyBGb3IgaGVscCB0YWtlIGEgbG9vayBhdDoKKyMgaHR0cDovL3d3dy5jbWFrZS5vcmcvV2lraS9DTWFrZTpDUGFja0NvbmZpZ3VyYXRpb24KKworIyMjIGdlbmVyYWwgc2V0dGluZ3MKK3NldChDUEFDS19QQUNLQUdFX05BTUUgInRocmlmdCIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OICIke1BBQ0tBR0VfVkVSU0lPTn0iKQorc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fU1VNTUFSWSAiQXBhY2hlIFRocmlmdCIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9GSUxFICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vUkVBRE1FLm1kIikKK3NldChDUEFDS19SRVNPVVJDRV9GSUxFX0xJQ0VOU0UgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9MSUNFTlNFIikKK3NldChDUEFDS19QQUNLQUdFX1ZFTkRPUiAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKQorc2V0KENQQUNLX1BBQ0tBR0VfQ09OVEFDVCAiZGV2QHRocmlmdC5hcGFjaGUub3JnIikKK3NldChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICIke0NQQUNLX1BBQ0tBR0VfTkFNRX0iKQorc2V0KENQQUNLX1NZU1RFTV9OQU1FICIke0NNQUtFX1NZU1RFTV9OQU1FfSIpCisKKyMjIyB2ZXJzaW9ucworc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NQUpPUiAke3RocmlmdF9WRVJTSU9OX01BSk9SfSkKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fTUlOT1IgJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0pCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX1BBVENIICR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KQorCisjIyMgc291cmNlIGdlbmVyYXRvcgorc2V0KENQQUNLX1NPVVJDRV9HRU5FUkFUT1IgIlRHWiIpCitzZXQoQ1BBQ0tfU09VUkNFX0lHTk9SRV9GSUxFUyAifiQ7Wy5dc3dwJDsvWy5dc3ZuLzsvWy5dZ2l0LzsuZ2l0aWdub3JlOy9idWlsZC87dGFncztjc2NvcGUuKiIpCitzZXQoQ1BBQ0tfU09VUkNFX1BBQ0tBR0VfRklMRV9OQU1FICIke0NQQUNLX1BBQ0tBR0VfTkFNRX0tJHtDUEFDS19QQUNLQUdFX1ZFUlNJT059IikKKworIyMjIHppcCBnZW5lcmF0b3IKK3NldChDUEFDS19HRU5FUkFUT1IgIlpJUCIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAidGhyaWZ0IikKKworCitpZihDTUFLRV9TWVNURU1fTkFNRSBTVFJFUVVBTCAiV2luZG93cyIpCisgICAgc2V0KENQQUNLX0dFTkVSQVRPUiAiTlNJUyIpCisgICAgc2V0KENQQUNLX05TSVNfSEVMUF9MSU5LICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciKQorICAgIHNldChDUEFDS19OU0lTX01FTlVfTElOS1MKKyAgICAgICAgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIgIkFwYWNoZSBUaHJpZnQgLSBXZWIgU2l0ZSIKKyAgICAgICAgImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIiAiQXBhY2hlIFRocmlmdCAtIElzc3VlcyIpCisgICAgc2V0KENQQUNLX05TSVNfQ09OVEFDVCAke0NQQUNLX1BBQ0tBR0VfQ09OVEFDVH0pCisgICAgc2V0KENQQUNLX05TSVNfTU9ESUZZX1BBVEggIk9OIikKKyAgICBzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiJHtDUEFDS19QQUNLQUdFX05BTUV9IikKK2Vsc2UoKQorICAgIHNldChDUEFDS19HRU5FUkFUT1IgIkRFQiIgKQorICAgIHNldChDUEFDS19ERUJJQU5fUEFDS0FHRV9NQUlOVEFJTkVSICR7Q1BBQ0tfUEFDS0FHRV9DT05UQUNUfSkKK2VuZGlmKCkKKworCitpbmNsdWRlKENQYWNrKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlIGIvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1N2JmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKQEAgLTAsMCArMSw3OSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZXMpCitpbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQorCitpZiAoSW50dHlwZXNfRk9VTkQpCisgICMgVGhpcyBhbGxvd3MgdGhlIGludHR5cGVzLmggYW5kIHN0ZGludC5oIGNoZWNrcyB0byBzdWNjZWVkIG9uIHBsYXRmb3JtcyB0aGF0CisgICMgZG8gbm90IG5hdGl2ZWx5IHByb3ZpZGUgdGhlcmUuCisgIHNldCAoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtJTlRUWVBFU19JTkNMVURFX0RJUlN9KQorZW5kaWYgKCkKKworY2hlY2tfaW5jbHVkZV9maWxlKGFycGEvaW5ldC5oIEhBVkVfQVJQQV9JTkVUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoZmNudGwuaCBIQVZFX0ZDTlRMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoZ2V0b3B0LmggSEFWRV9HRVRPUFRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShpbnR0eXBlcy5oIEhBVkVfSU5UVFlQRVNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShuZXRkYi5oIEhBVkVfTkVUREJfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShuZXRpbmV0L2luLmggSEFWRV9ORVRJTkVUX0lOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc2lnbmFsLmggSEFWRV9TSUdOQUxfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRpbnQuaCBIQVZFX1NURElOVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHVuaXN0ZC5oIEhBVkVfVU5JU1REX0gpCitjaGVja19pbmNsdWRlX2ZpbGUocHRocmVhZC5oIEhBVkVfUFRIUkVBRF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9pb2N0bC5oIEhBVkVfU1lTX0lPQ1RMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BhcmFtLmggSEFWRV9TWVNfUEFSQU1fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvcmVzb3VyY2UuaCBIQVZFX1NZU19SRVNPVVJDRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zb2NrZXQuaCBIQVZFX1NZU19TT0NLRVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvc3RhdC5oIEhBVkVfU1lTX1NUQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdGltZS5oIEhBVkVfU1lTX1RJTUVfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdW4uaCBIQVZFX1NZU19VTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHBvbGwuaCBIQVZFX1BPTExfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvcG9sbC5oIEhBVkVfU1lTX1BPTExfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvc2VsZWN0LmggSEFWRV9TWVNfU0VMRUNUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc2NoZWQuaCBIQVZFX1NDSEVEX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5nLmggSEFWRV9TVFJJTkdfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmdzLmggSEFWRV9TVFJJTkdTX0gpCisKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhnZXRob3N0YnluYW1lIEhBVkVfR0VUSE9TVEJZTkFNRSkKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhnZXRob3N0YnluYW1lX3IgSEFWRV9HRVRIT1NUQllOQU1FX1IpCitjaGVja19mdW5jdGlvbl9leGlzdHMoc3RyZXJyb3JfciBIQVZFX1NUUkVSUk9SX1IpCitjaGVja19mdW5jdGlvbl9leGlzdHMoc2NoZWRfZ2V0X3ByaW9yaXR5X21heCBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVgpCitjaGVja19mdW5jdGlvbl9leGlzdHMoc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4pCisKK2luY2x1ZGUoQ2hlY2tDU291cmNlQ29tcGlsZXMpCitpbmNsdWRlKENoZWNrQ1hYU291cmNlQ29tcGlsZXMpCisKK2NoZWNrX2N4eF9zb3VyY2VfY29tcGlsZXMoCisgICIKKyAgI2luY2x1ZGUgPHN0cmluZy5oPgorICBpbnQgbWFpbigpe2NoYXIgYjtjaGFyICphID0gc3RyZXJyb3JfcigwLCAmYiwgMCk7IHJldHVybigwKTt9CisgICIKKyAgU1RSRVJST1JfUl9DSEFSX1ApCisKKworc2V0KFBBQ0tBR0UgJHtQQUNLQUdFX05BTUV9KQorc2V0KFBBQ0tBR0VfU1RSSU5HICIke1BBQ0tBR0VfTkFNRX0gJHtQQUNLQUdFX1ZFUlNJT059IikKK3NldChWRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059KQorCisjIGdlbmVyYXRlIGEgY29uZmlnLmggZmlsZQorY29uZmlndXJlX2ZpbGUoIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9idWlsZC9jbWFrZS9jb25maWcuaC5pbiIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvY29uZmlnLmgiKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyNTVlMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UKQEAgLTAsMCArMSw5MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyBBbHdheXMgaW5jbHVkZSBzcmNkaXIgYW5kIGJ1aWxkZGlyIGluIGluY2x1ZGUgcGF0aAorIyBUaGlzIHNhdmVzIHR5cGluZyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWX0gaW4KKyMgYWJvdXQgZXZlcnkgc3ViZGlyCisjIHNpbmNlIGNtYWtlIDIuNC4wCitzZXQoQ01BS0VfSU5DTFVERV9DVVJSRU5UX0RJUiBPTikKKworIyBQdXQgdGhlIGluY2x1ZGUgZGlycyB3aGljaCBhcmUgaW4gdGhlIHNvdXJjZSBvciBidWlsZCB0cmVlCisjIGJlZm9yZSBhbGwgb3RoZXIgaW5jbHVkZSBkaXJzLCBzbyB0aGUgaGVhZGVycyBpbiB0aGUgc291cmNlcworIyBhcmUgcHJlZmVycmVkIG92ZXIgdGhlIGFscmVhZHkgaW5zdGFsbGVkIG9uZXMKKyMgc2luY2UgY21ha2UgMi40LjEKK3NldChDTUFLRV9JTkNMVURFX0RJUkVDVE9SSUVTX1BST0pFQ1RfQkVGT1JFIE9OKQorCisjIFVzZSBjb2xvcmVkIG91dHB1dAorIyBzaW5jZSBjbWFrZSAyLjQuMAorc2V0KENNQUtFX0NPTE9SX01BS0VGSUxFIE9OKQorCisjIERlZmluZSB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMgaGVyZQorc2V0KEdFTkVSSUNfTElCX1ZFUlNJT04gIjEuMC4wIikKK3NldChHRU5FUklDX0xJQl9TT1ZFUlNJT04gIjAiKQorCisjIFNldCB0aGUgZGVmYXVsdCBidWlsZCB0eXBlIHRvIHJlbGVhc2Ugd2l0aCBkZWJ1ZyBpbmZvCitpZiAoTk9UIENNQUtFX0JVSUxEX1RZUEUpCisgIHNldChDTUFLRV9CVUlMRF9UWVBFIFJlbFdpdGhEZWJJbmZvCisgICAgQ0FDSEUgU1RSSU5HCisgICAgICAiQ2hvb3NlIHRoZSB0eXBlIG9mIGJ1aWxkLCBvcHRpb25zIGFyZTogTm9uZSBEZWJ1ZyBSZWxlYXNlIFJlbFdpdGhEZWJJbmZvIE1pblNpemVSZWwuIgorICApCitlbmRpZiAoTk9UIENNQUtFX0JVSUxEX1RZUEUpCisKKyMgQ3JlYXRlIHRoZSBjb21waWxlIGNvbW1hbmQgZGF0YWJhc2UgZm9yIGNsYW5nIGJ5IGRlZmF1bHQKK3NldChDTUFLRV9FWFBPUlRfQ09NUElMRV9DT01NQU5EUyBPTikKKworIyBQdXQgdGhlIGxpYnJhcmllcyBhbmQgYmluYXJpZXMgdGhhdCBnZXQgYnVpbHQgaW50byBkaXJlY3RvcmllcyBhdCB0aGUKKyMgdG9wIG9mIHRoZSBidWlsZCB0cmVlIHJhdGhlciB0aGFuIGluIGhhcmQtdG8tZmluZCBsZWFmCisjIGRpcmVjdG9yaWVzLiBUaGlzIHNpbXBsaWZpZXMgbWFudWFsIHRlc3RpbmcgYW5kIHRoZSB1c2Ugb2YgdGhlIGJ1aWxkCisjIHRyZWUgcmF0aGVyIHRoYW4gaW5zdGFsbGVkIHRocmlmdCBsaWJyYXJpZXMuCitzZXQoQ01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vbGliKQorc2V0KENNQUtFX0FSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xpYikKK3NldChDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9iaW4pCisKKyMKKyMgInJwYXRoIiBzdXBwb3J0LgorIyBTZWUgaHR0cDovL3d3dy5pdGsub3JnL1dpa2kvaW5kZXgucGhwP3RpdGxlPUNNYWtlX1JQQVRIX2hhbmRsaW5nCisjCisjIE9uIE1hY09TWCwgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIGVuYWJsZSBycGF0aCBzdXBwb3J0Lgorc2V0KENNQUtFX01BQ09TWF9SUEFUSCBUUlVFKQorIworIyBPbiBhbnkgT1MsIGZvciBleGVjdXRhYmxlcywgYWxsb3cgbGlua2luZyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMgaW4gbm9uLXN5c3RlbQorIyBsb2NhdGlvbnMgYW5kIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGVzIHdpdGhvdXQgTERfUFJFTE9BRCBvciBzaW1pbGFyLgorIyBUaGlzIHJlcXVpcmVzIHRoZSBsaWJyYXJ5IHRvIGJlIGJ1aWx0IHdpdGggcnBhdGggc3VwcG9ydC4KK3NldChDTUFLRV9JTlNUQUxMX1JQQVRIX1VTRV9MSU5LX1BBVEggVFJVRSkKKworIworIyBDKysgTGFuZ3VhZ2UgTGV2ZWwgRGVmYXVsdHMgLSB0aGlzIGRlcGVuZHMgb24gdGhlIGNvbXBpbGVyIGNhcGFiaWxpdGllcworIworaWYgKE5PVCBERUZJTkVEIENNQUtFX0NYWF9TVEFOREFSRCkKKyAgc2V0KENNQUtFX0NYWF9TVEFOREFSRCAxMSkgIyBDKysxMQorICBtZXNzYWdlKFNUQVRVUyAiU2V0dGluZyBDKysxMSBhcyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBsZXZlbC4iKQorICBtZXNzYWdlKFNUQVRVUyAiVG8gc3BlY2lmeSBhIGRpZmZlcmVudCBDKysgbGFuZ3VhZ2UgbGV2ZWwsIHNldCBDTUFLRV9DWFhfU1RBTkRBUkQiKQorZW5kaWYoKQorCitpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEIEVRVUFMIDk4KQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJvbmx5IEMrKzExIG9yIGFib3ZlIEMrKyBzdGFuZGFyZCBpcyBzdXBwb3J0ZWQiKQorZWxzZWlmIChDTUFLRV9DWFhfU1RBTkRBUkQgRVFVQUwgMTEpCisgICMgc2hvdWxkIG5vdCBmYWxsYmFjayB0byBDKys5OAorICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEX1JFUVVJUkVEIE9OKQorZW5kaWYoKQorCitpZiAoTk9UIERFRklORUQgQ01BS0VfQ1hYX0VYVEVOU0lPTlMpCisgIHNldChDTUFLRV9DWFhfRVhURU5TSU9OUyBPRkYpICAgICAgICAjIHVzZSBzdGFuZGFyZHMgY29tcGxpYW50IGxhbmd1YWdlIGxldmVsIGZvciBwb3J0YWJpbGl0eQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lSW5zdGFsbGF0aW9uUGF0aHMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVJbnN0YWxsYXRpb25QYXRocy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJmMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lSW5zdGFsbGF0aW9uUGF0aHMuY21ha2UKQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyBEZWZpbmUgdGhlIGRlZmF1bHQgaW5zdGFsbCBwYXRocworc2V0KEJJTl9JTlNUQUxMX0RJUiAiYmluIiBDQUNIRSBQQVRIICJUaGUgYmluYXJ5IGluc3RhbGwgZGlyIChkZWZhdWx0OiBiaW4pIikKK3NldChMSUJfSU5TVEFMTF9ESVIgImxpYiR7TElCX1NVRkZJWH0iIENBQ0hFIFBBVEggIlRoZSBsaWJyYXJ5IGluc3RhbGwgZGlyIChkZWZhdWx0OiBsaWIke0xJQl9TVUZGSVh9KSIpCitzZXQoSU5DTFVERV9JTlNUQUxMX0RJUiAiaW5jbHVkZSIgQ0FDSEUgUEFUSCAiVGhlIGxpYnJhcnkgaW5zdGFsbCBkaXIgKGRlZmF1bHQ6IGluY2x1ZGUpIikKK3NldChDTUFLRV9JTlNUQUxMX0RJUiAiY21ha2UiIENBQ0hFIFBBVEggIlRoZSBzdWJkaXJlY3RvcnkgdG8gaW5zdGFsbCBjbWFrZSBjb25maWcgZmlsZXMgKGRlZmF1bHQ6IGNtYWtlKSIpCitzZXQoRE9DX0lOU1RBTExfRElSICJzaGFyZS9kb2MiIENBQ0hFIFBBVEggIlRoZSBzdWJkaXJlY3RvcnkgdG8gaW5zdGFsbCBkb2N1bWVudGF0aW9uIGZpbGVzIChkZWZhdWx0OiBzaGFyZS9kb2MpIikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZmY1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlCkBAIC0wLDAgKzEsMjA0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitpbmNsdWRlKENNYWtlRGVwZW5kZW50T3B0aW9uKQorCitzZXQoVEhSSUZUX0NPTVBJTEVSICIiIENBQ0hFIEZJTEVQQVRIICJFeHRlcm5hbCBUaHJpZnQgY29tcGlsZXIgdG8gdXNlIGR1cmluZyBidWlsZCIpCisKKyMgQWRkaXRpb25hbCBjb21wb25lbnRzCitvcHRpb24oQlVJTERfQ09NUElMRVIgIkJ1aWxkIFRocmlmdCBjb21waWxlciIgT04pCisKK2lmKEJVSUxEX0NPTVBJTEVSIE9SIEVYSVNUUyAke1RIUklGVF9DT01QSUxFUn0pCisgICAgc2V0KEhBVkVfQ09NUElMRVIgT04pCitlbmRpZigpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX1RFU1RJTkcgIkJ1aWxkIHdpdGggdW5pdCB0ZXN0cyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfRVhBTVBMRVMgIkJ1aWxkIGV4YW1wbGVzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9UVVRPUklBTFMgIkJ1aWxkIFRocmlmdCB0dXRvcmlhbHMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitvcHRpb24oQlVJTERfTElCUkFSSUVTICJCdWlsZCBUaHJpZnQgbGlicmFyaWVzIiBPTikKKworIyBMaWJyYXJpZXMgdG8gYnVpbGQKKworIyBFYWNoIGxhbmd1YWdlIGxpYnJhcnkgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgdXNpbmcgdGhlIFdJVEhfPExBTkc+IGZsYWcuCisjIEJ5IGRlZmF1bHQgQ01ha2UgY2hlY2tzIGlmIHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgZm9yIGEgbGFuZ3VhZ2UgYXJlIHByZXNlbnQKKyMgYW5kIGVuYWJsZXMgdGhlIGxpYnJhcnkgaWYgYWxsIGFyZSBmb3VuZC4gVGhpcyBtZWFucyB0aGUgZGVmYXVsdCBpcyB0byBidWlsZCBhcworIyBtdWNoIGFzIHBvc3NpYmxlIGJ1dCBsZWF2aW5nIG91dCBsaWJyYXJpZXMgaWYgdGhlaXIgZGVwZW5kZW5jaWVzIGFyZSBub3QgbWV0LgorCitvcHRpb24oV0lUSF9CT09TVF9TVEFUSUMgIkJ1aWxkIHdpdGggQm9vc3Qgc3RhdGljIGxpbmsgbGlicmFyeSIgT0ZGKQorc2V0KEJvb3N0X1VTRV9TVEFUSUNfTElCUyAke1dJVEhfQk9PU1RfU1RBVElDfSkKK2lmIChOT1QgV0lUSF9CT09TVF9TVEFUSUMpCisgICAgYWRkX2RlZmluaXRpb25zKC1EQk9PU1RfQUxMX0RZTl9MSU5LKQorICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX1RFU1RfRFlOX0xJTkspCitlbmRpZigpCisKKyMgQysrCitvcHRpb24oV0lUSF9DUFAgIkJ1aWxkIEMrKyBUaHJpZnQgbGlicmFyeSIgT04pCitpZihXSVRIX0NQUCkKKyAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBRVUlFVCkKKyAgICAjIE5PVEU6IEN1cnJlbnRseSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIEMrKyBzcGVjaWZpYywKKyAgICAjIGJ1dCBpbiBmdXR1cmUgb3RoZXIgbGlicmFyaWVzIG1pZ2h0IHJldXNlIHRoZW0uCisgICAgIyBTbyB0aGV5IGFyZSBub3QgZGVwZW5kZW50IG9uIFdJVEhfQ1BQIGJ1dCBzZXR0aW5nIHRoZW0gd2l0aG91dCBXSVRIX0NQUCBjdXJyZW50bHkKKyAgICAjIGhhcyBubyBlZmZlY3QuCisgICAgaWYoWkxJQl9MSUJSQVJZKQorICAgICAgICAjIEZpbmRaTElCLmNtYWtlIGRvZXMgbm90IG5vcm1hbGl6ZSBwYXRoIHNvIHdlIG5lZWQgdG8gZG8gaXQgb3Vyc2VsdmVzLgorICAgICAgICBmaWxlKFRPX0NNQUtFX1BBVEggJHtaTElCX0xJQlJBUll9IFpMSUJfTElCUkFSWSkKKyAgICBlbmRpZigpCisgICAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1pMSUIgIkJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlpMSUJfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoTGliZXZlbnQgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX0xJQkVWRU5UICJCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGliZXZlbnRfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoUXQ0IFFVSUVUIENPTVBPTkVOVFMgUXRDb3JlIFF0TmV0d29yaykKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUVQ0ICJCdWlsZCB3aXRoIFF0NCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlFUNF9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShRdDUgUVVJRVQgQ09NUE9ORU5UUyBDb3JlIE5ldHdvcmspCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNSAiQnVpbGQgd2l0aCBRdDUgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdDVfRk9VTkQiIE9GRikKKyAgICBpZigke1dJVEhfUVQ0fSBBTkQgJHtXSVRIX1FUNX0gQU5EICR7Q01BS0VfTUFKT1JfVkVSU0lPTn0gTEVTUyAzKQorICAgICAgIyBjbWFrZSA8IDMuMC4wIGNhdXNlcyBjb25mbGljdCB3aGVuIGJ1aWxkaW5nIGJvdGggUXQ0IGFuZCBRdDUKKyAgICAgIHNldChXSVRIX1FUNCBPRkYpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZShPcGVuU1NMIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9PUEVOU1NMICJCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUEVOU1NMX0ZPVU5EIiBPRkYpCisgICAgb3B0aW9uKFdJVEhfU1REVEhSRUFEUyAiQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydCIgT04pCitlbmRpZigpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0NQUCAiQnVpbGQgQysrIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9DUFA7Qm9vc3RfRk9VTkQiIE9GRikKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9QTFVHSU4gIkJ1aWxkIGNvbXBpbGVyIHBsdWdpbiBzdXBwb3J0IiBPRkYKKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0NPTVBJTEVSO0JVSUxEX0NQUCIgT0ZGKQorCisjIEMgR0xpYgorb3B0aW9uKFdJVEhfQ19HTElCICJCdWlsZCBDIChHTGliKSBUaHJpZnQgbGlicmFyeSIgT04pCitpZihXSVRIX0NfR0xJQikKKyAgICBmaW5kX3BhY2thZ2UoR0xJQiBRVUlFVCBDT01QT05FTlRTIGdvYmplY3QpCitlbmRpZigpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0NfR0xJQiAiQnVpbGQgQyAoR0xpYikgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0NfR0xJQjtHTElCX0ZPVU5EIiBPRkYpCisKK2lmKEJVSUxEX0NQUCkKKyAgICBzZXQoYm9vc3RfY29tcG9uZW50cykKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBsaXN0KEFQUEVORCBib29zdF9jb21wb25lbnRzIHN5c3RlbSB0aHJlYWQpCisgICAgZW5kaWYoKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGxpc3QoQVBQRU5EIGJvb3N0X2NvbXBvbmVudHMgdW5pdF90ZXN0X2ZyYW1ld29yayBmaWxlc3lzdGVtIGNocm9ubyBwcm9ncmFtX29wdGlvbnMpCisgICAgZW5kaWYoKQorICAgIGlmKGJvb3N0X2NvbXBvbmVudHMpCisgICAgICAgIGZpbmRfcGFja2FnZShCb29zdCAxLjUzIFJFUVVJUkVEIENPTVBPTkVOVFMgJHtib29zdF9jb21wb25lbnRzfSkKKyAgICBlbmRpZigpCitlbHNlaWYoQlVJTERfQ19HTElCIEFORCBCVUlMRF9URVNUSU5HKQorICAgIGZpbmRfcGFja2FnZShCb29zdCAxLjUzIFJFUVVJUkVEKQorZW5kaWYoKQorCisjIEphdmEKK29wdGlvbihXSVRIX0pBVkEgIkJ1aWxkIEphdmEgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoQU5EUk9JRCkKKyAgICBmaW5kX3BhY2thZ2UoR3JhZGxlIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSkFWQSAiQnVpbGQgSmF2YSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0pBVkE7R1JBRExFX0ZPVU5EIiBPRkYpCitlbHNlKCkKKyAgICBmaW5kX3BhY2thZ2UoR3JhZGxldyBRVUlFVCkKKyAgICBmaW5kX3BhY2thZ2UoSmF2YSBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0pBVkFfRk9VTkQ7R1JBRExFV19GT1VORCIgT0ZGKQorZW5kaWYoKQorCisjIFB5dGhvbgorb3B0aW9uKFdJVEhfUFlUSE9OICJCdWlsZCBQeXRob24gVGhyaWZ0IGxpYnJhcnkiIE9OKQorZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCBRVUlFVCkgIyBmb3IgUHl0aG9uIGV4ZWN1dGFibGUKK2ZpbmRfcGFja2FnZShQeXRob25MaWJzIFFVSUVUKSAjIGZvciBQeXRob24uaAorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9QWVRIT04gIkJ1aWxkIFB5dGhvbiBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfUFlUSE9OO1BZVEhPTkxJQlNfRk9VTkQiIE9GRikKKworIyBIYXNrZWxsCitvcHRpb24oV0lUSF9IQVNLRUxMICJCdWlsZCBIYXNrZWxsIFRocmlmdCBsaWJyYXJ5IiBPTikKK2ZpbmRfcGFja2FnZShHSEMgUVVJRVQpCitmaW5kX3BhY2thZ2UoQ2FiYWwgUVVJRVQpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0hBU0tFTEwgIkJ1aWxkIEdIQyBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSEFTS0VMTDtHSENfRk9VTkQ7Q0FCQUxfRk9VTkQiIE9GRikKKworIyBDb21tb24gbGlicmFyeSBvcHRpb25zCitvcHRpb24oV0lUSF9TSEFSRURfTElCICJCdWlsZCBzaGFyZWQgbGlicmFyaWVzIiBPTikKK29wdGlvbihXSVRIX1NUQVRJQ19MSUIgIkJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiIE9OKQoraWYgKE5PVCBXSVRIX1NIQVJFRF9MSUIgQU5EIE5PVCBXSVRIX1NUQVRJQ19MSUIpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ2Fubm90IGJ1aWxkIHdpdGggYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBvdXRwdXRzIGRpc2FibGVkISIpCitlbmRpZigpCisKKyNOT1RFOiBDKysgY29tcGlsZXIgb3B0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgbGliL2NwcC9DTWFrZUxpc3RzLnR4dAorCisjIFZpc3VhbCBTdHVkaW8gb25seSBvcHRpb25zCitpZihNU1ZDKQorb3B0aW9uKFdJVEhfTVQgIkJ1aWxkIHVzaW5nIE1UIGluc3RlYWQgb2YgTUQgKE1TVkMgb25seSkiIE9GRikKK2VuZGlmKE1TVkMpCisKK21hY3JvKE1FU1NBR0VfREVQIGZsYWcgc3VtbWFyeSkKK2lmKE5PVCAke2ZsYWd9KQorICBtZXNzYWdlKFNUQVRVUyAiICAgLSAke3N1bW1hcnl9IikKK2VuZGlmKCkKK2VuZG1hY3JvKE1FU1NBR0VfREVQIGZsYWcgc3VtbWFyeSkKKworbWFjcm8oUFJJTlRfQ09ORklHX1NVTU1BUlkpCittZXNzYWdlKFNUQVRVUyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCittZXNzYWdlKFNUQVRVUyAiVGhyaWZ0IHZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhyaWZ0X1ZFUlNJT059ICgke3RocmlmdF9WRVJTSU9OX01BSk9SfS4ke3RocmlmdF9WRVJTSU9OX01JTk9SfS4ke3RocmlmdF9WRVJTSU9OX1BBVENIfSkiKQorbWVzc2FnZShTVEFUVVMgIlRocmlmdCBwYWNrYWdlIHZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAke1BBQ0tBR0VfVkVSU0lPTn0iKQorbWVzc2FnZShTVEFUVVMgIkJ1aWxkIGNvbmZpZ3VyYXRpb24gU3VtbWFyeSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBUaHJpZnQgY29tcGlsZXI6ICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ09NUElMRVJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIGNvbXBpbGVyIHBsdWdpbiBzdXBwb3J0OiAgICAgICAgICAgICAgJHtXSVRIX1BMVUdJTn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCB1bml0IHRlc3RzOiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX1RFU1RJTkd9IikKK01FU1NBR0VfREVQKEhBVkVfQ09NUElMRVIgIkRpc2FibGVkIGJlY2F1c2UgQlVJTERfVEhSSUZUPU9GRiBhbmQgbm8gdmFsaWQgVEhSSUZUX0NPTVBJTEVSIGlzIGdpdmVuIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIGV4YW1wbGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9FWEFNUExFU30iKQorTUVTU0FHRV9ERVAoSEFWRV9DT01QSUxFUiAiRGlzYWJsZWQgYmVjYXVzZSBCVUlMRF9USFJJRlQ9T0ZGIGFuZCBubyB2YWxpZCBUSFJJRlRfQ09NUElMRVIgaXMgZ2l2ZW4iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgVGhyaWZ0IGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0xJQlJBUklFU30iKQorbWVzc2FnZShTVEFUVVMgIiBMYW5ndWFnZSBsaWJyYXJpZXM6IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEMrKyBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DUFB9IikKK01FU1NBR0VfREVQKFdJVEhfQ1BQICJEaXNhYmxlZCBieSBXSVRIX0NQUD1PRkYiKQorTUVTU0FHRV9ERVAoQm9vc3RfRk9VTkQgIkJvb3N0IGhlYWRlcnMgbWlzc2luZyIpCittZXNzYWdlKFNUQVRVUyAiICAgIEMrKyBMYW5ndWFnZSBMZXZlbDogICAgICAgICAgICAgICAgICAgICAgICR7Q1hYX0xBTkdVQUdFX0xFVkVMfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDIChHTGliKSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ19HTElCfSIpCitNRVNTQUdFX0RFUChXSVRIX0NfR0xJQiAiRGlzYWJsZWQgYnkgV0lUSF9DX0dMSUI9T0ZGIikKK01FU1NBR0VfREVQKEdMSUJfRk9VTkQgIkdMaWIgbWlzc2luZyIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBKYXZhIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfSkFWQX0iKQorTUVTU0FHRV9ERVAoV0lUSF9KQVZBICJEaXNhYmxlZCBieSBXSVRIX0pBVkE9T0ZGIikKK2lmKEFORFJPSUQpCisgICAgTUVTU0FHRV9ERVAoR1JBRExFX0ZPVU5EICJHcmFkbGUgbWlzc2luZyIpCitlbHNlKCkKKyAgICBNRVNTQUdFX0RFUChKQVZBX0ZPVU5EICJKYXZhIFJ1bnRpbWUgbWlzc2luZyIpCisgICAgTUVTU0FHRV9ERVAoR1JBRExFV19GT1VORCAiR3JhZGxlIFdyYXBwZXIgbWlzc2luZyIpCitlbmRpZigpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBQeXRob24gbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfUFlUSE9OfSIpCitNRVNTQUdFX0RFUChXSVRIX1BZVEhPTiAiRGlzYWJsZWQgYnkgV0lUSF9QWVRIT049T0ZGIikKK01FU1NBR0VfREVQKFBZVEhPTkxJQlNfRk9VTkQgIlB5dGhvbiBsaWJyYXJpZXMgbWlzc2luZyIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBIYXNrZWxsIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfSEFTS0VMTH0iKQorTUVTU0FHRV9ERVAoV0lUSF9IQVNLRUxMICJEaXNhYmxlZCBieSBXSVRIX0hBU0tFTEw9T0ZGIikKK01FU1NBR0VfREVQKEdIQ19GT1VORCAiR0hDIG1pc3NpbmciKQorTUVTU0FHRV9ERVAoQ0FCQUxfRk9VTkQgIkNhYmFsIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiBMaWJyYXJ5IGZlYXR1cmVzOiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBzaGFyZWQgbGlicmFyaWVzOiAgICAgICAgICAgICAgICAgICAgICR7V0lUSF9TSEFSRURfTElCfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBzdGF0aWMgbGlicmFyaWVzOiAgICAgICAgICAgICAgICAgICAgICR7V0lUSF9TVEFUSUNfTElCfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnk6ICAgICAgICR7V0lUSF9CT09TVF9TVEFUSUN9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQysrIHN0ZDo6dGhyZWFkIHN1cHBvcnQ6ICAgICAgICAgJHtXSVRIX1NURFRIUkVBRFN9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggbGliZXZlbnQgc3VwcG9ydDogICAgICAgICAgICAgICAgJHtXSVRIX0xJQkVWRU5UfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydDogICAgICAgICAgICAgICAgICR7V0lUSF9PUEVOU1NMfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NCBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgICR7V0lUSF9RVDR9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggUXQ1IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1FUNX0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBaTElCIHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICAke1dJVEhfWkxJQn0iKQorbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorZW5kbWFjcm8oUFJJTlRfQ09ORklHX1NVTU1BUlkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxMTJiNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQpAQCAtMCwwICsxLDExOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVW5jb21tZW50IHRoaXMgdG8gc2hvdyBzb21lIGJhc2ljIGNtYWtlIHZhcmlhYmxlcyBhYm91dCBwbGF0Zm9ybXMKKyMgaW5jbHVkZSAoTmV3UGxhdGZvcm1EZWJ1ZykKKworIyBWaXN1YWwgU3R1ZGlvIHNwZWNpZmljIG9wdGlvbnMKK2lmKE1TVkMpCisgICAgI0ZvciB2aXN1YWwgc3R1ZGlvIHRoZSBsaWJyYXJ5IG5hbWluZyBpcyBhcyBmb2xsb3dpbmc6CisgICAgIyBEeW5hbWljIGxpYnJhcmllczoKKyAgICAjICAtIHRocmlmdC5kbGwgIGZvciByZWxlYXNlIGxpYnJhcnkKKyAgICAjICAtIHRocmlmdGQuZGxsIGZvciBkZWJ1ZyBsaWJyYXJ5CisgICAgIworICAgICMgU3RhdGljIGxpYnJhcmllczoKKyAgICAjICAtIHRocmlmdG1kLmxpYiBmb3IgL01EIHJlbGVhc2UgYnVpbGQKKyAgICAjICAtIHRocmlmdG10LmxpYiBmb3IgL01UIHJlbGVhc2UgYnVpbGQKKyAgICAjCisgICAgIyAgLSB0aHJpZnRtZGQubGliIGZvciAvTUQgZGVidWcgYnVpbGQKKyAgICAjICAtIHRocmlmdG10ZC5saWIgZm9yIC9NVCBkZWJ1ZyBidWlsZAorICAgICMKKyAgICAjIHRoZSBzYW1lIGhvbGRzIGZvciBvdGhlciBsaWJyYXJpZXMgbGlrZSBsaWJ0aHJpZnR6IGV0Yy4KKworICAgICMgRm9yIERlYnVnIGJ1aWxkIHR5cGVzLCBhcHBlbmQgYSAiZCIgdG8gdGhlIGxpYnJhcnkgbmFtZXMuCisgICAgc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiIENBQ0hFIFNUUklORyAiU2V0IGRlYnVnIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgc2V0KENNQUtFX1JFTEVBU0VfUE9TVEZJWCAiIiBDQUNIRSBTVFJJTkcgIlNldCByZWxlYXNlIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgc2V0KENNQUtFX1JFTFdJVEhERUJJTkZPX1BPU1RGSVggIiIgQ0FDSEUgU1RSSU5HICJTZXQgcmVsZWFzZSBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorCisgICAgIyBCdWlsZCB1c2luZyAvTVQgb3B0aW9uIGluc3RlYWQgb2YgL01EIGlmIHRoZSBXSVRIX01UIG9wdGlvbnMgaXMgc2V0CisgICAgaWYoV0lUSF9NVCkKKyAgICAgICAgc2V0KENvbXBpbGVyRmxhZ3MKKyAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1MKKyAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfREVCVUcKKyAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTworICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1MKKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19SRUxXSVRIREVCSU5GTworICAgICAgICAgICAgICAgICkKKyAgICAgICAgZm9yZWFjaChDb21waWxlckZsYWcgJHtDb21waWxlckZsYWdzfSkKKyAgICAgICAgICBzdHJpbmcoUkVQTEFDRSAiL01EIiAiL01UIiAke0NvbXBpbGVyRmxhZ30gIiR7JHtDb21waWxlckZsYWd9fSIpCisgICAgICAgIGVuZGZvcmVhY2goKQorICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm10IiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBlbHNlKFdJVEhfTVQpCisgICAgICAgIHNldChTVEFUSUNfUE9TVEZJWCAibWQiIENBQ0hFIFNUUklORyAiU2V0IHN0YXRpYyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIGVuZGlmKFdJVEhfTVQpCisKKyAgICAjIERpc2FibGUgYm9vc3QgYXV0byBsaW5raW5nIHByYWdtYXMgLSBjbWFrZSBpbmNsdWRlcyB0aGUgcmlnaHQgZmlsZXMKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi1EQk9PU1RfQUxMX05PX0xJQiIpCisKKyAgICAjIFdpbmRvd3MgYnVpbGQgZG9lcyBub3Qga25vdyBob3cgdG8gbWFrZSBhIHNoYXJlZCBsaWJyYXJ5IHlldAorICAgICMgYXMgdGhlcmUgYXJlIG5vIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBvciBleHBvcnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0LgorICAgIGlmIChXSVRIX1NIQVJFRF9MSUIpCisgICAgICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiV2luZG93cyBidWlsZCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJ5IG91dHB1dCB5ZXQsIHBsZWFzZSBzZXQgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIikKKyAgICBlbmRpZigpCisKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi9NUCIpICMgcGFyYWxsZWwgYnVpbGQKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi9XMyIpICMgd2FybmluZyBsZXZlbCAzCisKKyAgICAjIFZTMjAxMCBkb2VzIG5vdCBwcm92aWRlIGludHR5cGVzIHdoaWNoIHdlIG5lZWQgZm9yICJQUklkNjQiIHVzZWQgaW4gbWFueSBwbGFjZXMKKyAgICBmaW5kX3BhY2thZ2UoSW50dHlwZXMpCisgICAgaWYgKEludHR5cGVzX0ZPVU5EKQorICAgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0lOVFRZUEVTX0lOQ0xVREVfRElSU30pCisgICAgICAjIE9wZW5TU0wgY29uZmxpY3RzIHdpdGggdGhlIGRlZmluaXRpb24gb2YgUFJJZDY0IHVubGVzcyBpdCBpcyBkZWZpbmVkIGZpcnN0CisgICAgICBhZGRfZGVmaW5pdGlvbnMoIi9GSWludHR5cGVzLmgiKQorICAgIGVuZGlmICgpCitlbHNlaWYoVU5JWCkKKyAgZmluZF9wcm9ncmFtKCBNRU1PUllDSEVDS19DT01NQU5EIHZhbGdyaW5kICkKKyAgc2V0KCBNRU1PUllDSEVDS19DT01NQU5EX09QVElPTlMgIi0tZ2VuLXN1cHByZXNzaW9ucz1hbGwgLS1sZWFrLWNoZWNrPWZ1bGwiICkKKyAgc2V0KCBNRU1PUllDSEVDS19TVVBQUkVTU0lPTlNfRklMRSAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MiICkKK2VuZGlmKCkKKworYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19GT1JNQVRfTUFDUk9TIikKK2FkZF9kZWZpbml0aW9ucygiLURfX1NURENfTElNSVRfTUFDUk9TIikKKworIyBXSVRIXypUSFJFQURTIHNlbGVjdHMgd2hpY2ggdGhyZWFkaW5nIGxpYnJhcnkgdG8gdXNlCitpZihXSVRIX1NURFRIUkVBRFMpCisgIGFkZF9kZWZpbml0aW9ucygiLURVU0VfU1REX1RIUkVBRD0xIikKK2VuZGlmKCkKKworIyBDKysgTGFuZ3VhZ2UgTGV2ZWwKK3NldChDWFhfTEFOR1VBR0VfTEVWRUwgIkMrKyR7Q01BS0VfQ1hYX1NUQU5EQVJEfSIpCitpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEX1JFUVVJUkVEKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFtjb21waWxlciBtdXN0IHN1cHBvcnQgaXRdIikKK2Vsc2UoKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFtmYWxsYmFjayB0byBlYXJsaWVyIGlmIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaXRdIikKK2VuZGlmKCkKK2lmIChDTUFLRV9DWFhfRVhURU5TSU9OUykKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbd2l0aCBjb21waWxlci1zcGVjaWZpYyBleHRlbnNpb25zXSIpCitlbmRpZigpCisKK2lmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiQ2xhbmciKQorICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyIikKK2VuZGlmKCkKKworIyBCdWlsZGluZyBXSVRIX1BMVUdJTiByZXF1aXJlcyBib29zdCBtZW1vcnkgb3BlcmF0aW9ucywgZm9yIG5vdywgYW5kIGdjYyA+PSA0LjgKK2lmIChXSVRIX1BMVUdJTikKKyAgaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJHTlUiIEFORCBDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTiBWRVJTSU9OX0xFU1MgIjQuOCIpCisgICAgbWVzc2FnZShTRU5EX0VSUk9SICJUaHJpZnQgY29tcGlsZXIgcGx1Zy1pbiBzdXBwb3J0IGlzIG5vdCBwb3NzaWJsZSB3aXRoIG9sZGVyIGdjYyAoIDwgNC44ICkgY29tcGlsZXIiKQorICBlbmRpZigpCitlbmRpZigpCisKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMDM3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEFOVF9GT1VORCAtIHN5c3RlbSBoYXMgQW50CisjICBBbnRfRVhFQ1VUQUJMRSAtIHRoZSBBbnQgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShBbnRfRVhFQ1VUQUJMRSBOQU1FUyBhbnQgUEFUSFMgJEVOVntBTlRfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEFudCBERUZBVUxUX01TRyBBbnRfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoQW50X0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkMzM3YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBDYWJhbF9GT1VORCAtIHN5c3RlbSBoYXMgQ2FiYWwKKyMgIENhYmFsIC0gdGhlIENhYmFsIGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENBQkFMX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShDQUJBTCBOQU1FUyBjYWJhbCBQQVRIUyAkRU5We0hPTUV9Ly5jYWJhbC9iaW4gJEVOVntDQUJBTF9IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQ0FCQUwgREVGQVVMVF9NU0cgQ0FCQUwpCittYXJrX2FzX2FkdmFuY2VkKENBQkFMKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHSEMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3Mzg0NwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHSEMuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgR0hDX0ZPVU5EIC0gc3lzdGVtIGhhcyBHSEMKKyMgIEdIQyAtIHRoZSBHSEMgZXhlY3V0YWJsZQorIyAgUlVOX0hBU0tFTExfRk9VTkQgLSBzeXN0ZW0gaGFzIHJ1bmhhc2tlbGwKKyMgIFJVTl9IQVNLRUxMIC0gdGhlIHJ1bmhhc2tlbGwgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR0hDX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHSEMgTkFNRVMgZ2hjIFBBVEhTICRFTlZ7R0hDX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhHSEMgREVGQVVMVF9NU0cgR0hDKQorbWFya19hc19hZHZhbmNlZChHSEMpCisKK2ZpbmRfcHJvZ3JhbShSVU5fSEFTS0VMTCBOQU1FUyBydW5oYXNrZWxsIFBBVEhTICRFTlZ7R0hDX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhSVU5fSEFTS0VMTCBERUZBVUxUX01TRyBSVU5fSEFTS0VMTCkKK21hcmtfYXNfYWR2YW5jZWQoUlVOX0hBU0tFTEwpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR0xJQi5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHTElCLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmU0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR0xJQi5jbWFrZQpAQCAtMCwwICsxLDEyMiBAQAorIyAtIFRyeSB0byBmaW5kIEdsaWIgYW5kIGl0cyBjb21wb25lbnRzIChnaW8sIGdvYmplY3QgZXRjKQorIyBPbmNlIGRvbmUsIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEdMSUJfRk9VTkQgLSBzeXN0ZW0gaGFzIEdsaWIKKyMgIEdMSUJfSU5DTFVERV9ESVJTIC0gdGhlIEdsaWIgaW5jbHVkZSBkaXJlY3RvcmllcworIyAgR0xJQl9MSUJSQVJJRVMgLSBsaW5rIHRoZXNlIHRvIHVzZSBHbGliCisjCisjIE9wdGlvbmFsbHksIHRoZSBDT01QT05FTlRTIGtleXdvcmQgY2FuIGJlIHBhc3NlZCB0byBmaW5kX3BhY2thZ2UoKQorIyBhbmQgR2xpYiBjb21wb25lbnRzIGNhbiBiZSBsb29rZWQgZm9yLiAgQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nCisjIGNvbXBvbmVudHMgY2FuIGJlIHVzZWQsIGFuZCB0aGV5IGRlZmluZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBpZgorIyBmb3VuZDoKKyMKKyMgIGdpbzogICAgICAgICAgICAgR0xJQl9HSU9fTElCUkFSSUVTCisjICBnb2JqZWN0OiAgICAgICAgIEdMSUJfR09CSkVDVF9MSUJSQVJJRVMKKyMgIGdtb2R1bGU6ICAgICAgICAgR0xJQl9HTU9EVUxFX0xJQlJBUklFUworIyAgZ3RocmVhZDogICAgICAgICBHTElCX0dUSFJFQURfTElCUkFSSUVTCisjCisjIE5vdGUgdGhhdCB0aGUgcmVzcGVjdGl2ZSBfSU5DTFVERV9ESVIgdmFyaWFibGVzIGFyZSBub3Qgc2V0LCBzaW5jZQorIyBhbGwgaGVhZGVycyBhcmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIEdMSUJfSU5DTFVERV9ESVJTLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmFwaGFlbCBLdWJvIGRhIENvc3RhIDxyYWt1Y29Ad2Via2l0Lm9yZz4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMKKyMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBJVFMKKyMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisjIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisjIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmaW5kX3BhY2thZ2UoUGtnQ29uZmlnKQorcGtnX2NoZWNrX21vZHVsZXMoUENfR0xJQiBRVUlFVCBnbGliLTIuMCkKKworZmluZF9saWJyYXJ5KEdMSUJfTElCUkFSSUVTCisgICAgTkFNRVMgZ2xpYi0yLjAKKyAgICBISU5UUyAke1BDX0dMSUJfTElCRElSfQorICAgICAgICAgICR7UENfR0xJQl9MSUJSQVJZX0RJUlN9CispCisKKyMgRmlsZXMgaW4gZ2xpYidzIG1haW4gaW5jbHVkZSBwYXRoIG1heSBpbmNsdWRlIGdsaWJjb25maWcuaCwgd2hpY2gsCisjIGZvciBzb21lIG9kZCByZWFzb24sIGlzIG5vcm1hbGx5IGluICRMSUJESVIvZ2xpYi0yLjAvaW5jbHVkZS4KK2dldF9maWxlbmFtZV9jb21wb25lbnQoX0dMSUJfTElCUkFSWV9ESVIgJHtHTElCX0xJQlJBUklFU30gUEFUSCkKK2ZpbmRfcGF0aChHTElCQ09ORklHX0lOQ0xVREVfRElSCisgICAgTkFNRVMgZ2xpYmNvbmZpZy5oCisgICAgSElOVFMgJHtQQ19MSUJESVJ9ICR7UENfTElCUkFSWV9ESVJTfSAke19HTElCX0xJQlJBUllfRElSfQorICAgICAgICAgICR7UENfR0xJQl9JTkNMVURFRElSfSAke1BDX0dMSUJfSU5DTFVERV9ESVJTfQorICAgIFBBVEhfU1VGRklYRVMgZ2xpYi0yLjAvaW5jbHVkZQorKQorCitmaW5kX3BhdGgoR0xJQl9JTkNMVURFX0RJUgorICAgIE5BTUVTIGdsaWIuaAorICAgIEhJTlRTICR7UENfR0xJQl9JTkNMVURFRElSfQorICAgICAgICAgICR7UENfR0xJQl9JTkNMVURFX0RJUlN9CisgICAgUEFUSF9TVUZGSVhFUyBnbGliLTIuMAorKQorCitzZXQoR0xJQl9JTkNMVURFX0RJUlMgJHtHTElCX0lOQ0xVREVfRElSfSAke0dMSUJDT05GSUdfSU5DTFVERV9ESVJ9KQorCitpZihHTElCQ09ORklHX0lOQ0xVREVfRElSKQorICAgICMgVmVyc2lvbiBkZXRlY3Rpb24KKyAgICBmaWxlKFJFQUQgIiR7R0xJQkNPTkZJR19JTkNMVURFX0RJUn0vZ2xpYmNvbmZpZy5oIiBHTElCQ09ORklHX0hfQ09OVEVOVFMpCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIjZGVmaW5lIEdMSUJfTUFKT1JfVkVSU0lPTiAoWzAtOV0rKSIgX2R1bW15ICIke0dMSUJDT05GSUdfSF9DT05URU5UU30iKQorICAgIHNldChHTElCX1ZFUlNJT05fTUFKT1IgIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiI2RlZmluZSBHTElCX01JTk9SX1ZFUlNJT04gKFswLTldKykiIF9kdW1teSAiJHtHTElCQ09ORklHX0hfQ09OVEVOVFN9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OX01JTk9SICIke0NNQUtFX01BVENIXzF9IikKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgR0xJQl9NSUNST19WRVJTSU9OIChbMC05XSspIiBfZHVtbXkgIiR7R0xJQkNPTkZJR19IX0NPTlRFTlRTfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTl9NSUNSTyAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTiAiJHtHTElCX1ZFUlNJT05fTUFKT1J9LiR7R0xJQl9WRVJTSU9OX01JTk9SfS4ke0dMSUJfVkVSU0lPTl9NSUNST30iKQorZW5kaWYoKQorCisjIEFkZGl0aW9uYWwgR2xpYiBjb21wb25lbnRzLiAgV2Ugb25seSBsb29rIGZvciBsaWJyYXJpZXMsIGFzIG5vdCBhbGwgb2YgdGhlbQorIyBoYXZlIGNvcnJlc3BvbmRpbmcgaGVhZGVycyBhbmQgYWxsIGhlYWRlcnMgYXJlIGluc3RhbGxlZCBhbG9uZ3NpZGUgdGhlIG1haW4KKyMgZ2xpYiBvbmVzLgorZm9yZWFjaCAoX2NvbXBvbmVudCAke0dMSUJfRklORF9DT01QT05FTlRTfSkKKyAgICBpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ2lvIikKKyAgICAgICAgZmluZF9saWJyYXJ5KEdMSUJfR0lPX0xJQlJBUklFUyBOQU1FUyBnaW8tMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dJT19MSUJSQVJJRVMpCisgICAgZWxzZWlmICgke19jb21wb25lbnR9IFNUUkVRVUFMICJnb2JqZWN0IikKKyAgICAgICAgZmluZF9saWJyYXJ5KEdMSUJfR09CSkVDVF9MSUJSQVJJRVMgTkFNRVMgZ29iamVjdC0yLjAgSElOVFMgJHtfR0xJQl9MSUJSQVJZX0RJUn0pCisgICAgICAgIHNldChBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9IEdMSUJfR09CSkVDVF9MSUJSQVJJRVMpCisgICAgZWxzZWlmICgke19jb21wb25lbnR9IFNUUkVRVUFMICJnbW9kdWxlIikKKyAgICAgICAgZmluZF9saWJyYXJ5KEdMSUJfR01PRFVMRV9MSUJSQVJJRVMgTkFNRVMgZ21vZHVsZS0yLjAgSElOVFMgJHtfR0xJQl9MSUJSQVJZX0RJUn0pCisgICAgICAgIHNldChBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9IEdMSUJfR01PRFVMRV9MSUJSQVJJRVMpCisgICAgZWxzZWlmICgke19jb21wb25lbnR9IFNUUkVRVUFMICJndGhyZWFkIikKKyAgICAgICAgZmluZF9saWJyYXJ5KEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMgTkFNRVMgZ3RocmVhZC0yLjAgSElOVFMgJHtfR0xJQl9MSUJSQVJZX0RJUn0pCisgICAgICAgIHNldChBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9IEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMpCisgICAgZWxzZWlmICgke19jb21wb25lbnR9IFNUUkVRVUFMICJnaW8tdW5peCIpCisgICAgICAgICMgZ2lvLXVuaXggaXMgY29tcGlsZWQgYXMgcGFydCBvZiB0aGUgZ2lvIGxpYnJhcnksIGJ1dCB0aGUgaW5jbHVkZSBwYXRocworICAgICAgICAjIGFyZSBzZXBhcmF0ZSBmcm9tIHRoZSBzaGFyZWQgZ2xpYiBvbmVzLiBTaW5jZSB0aGlzIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQKKyAgICAgICAgIyBieSBXZWJLaXRHVEsrIHdlIGRvbid0IGdvIHRvIGV4dHJhb3JkaW5hcnkgbWVhc3VyZXMgYmV5b25kIHBrZy1jb25maWcuCisgICAgICAgIHBrZ19jaGVja19tb2R1bGVzKEdJT19VTklYIFFVSUVUIGdpby11bml4LTIuMCkKKyAgICBlbmRpZiAoKQorZW5kZm9yZWFjaCAoKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorRklORF9QQUNLQUdFX0hBTkRMRV9TVEFOREFSRF9BUkdTKEdMSUIgUkVRVUlSRURfVkFSUyBHTElCX0lOQ0xVREVfRElSUyBHTElCX0xJQlJBUklFUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fVkFSICAgR0xJQl9WRVJTSU9OKQorCittYXJrX2FzX2FkdmFuY2VkKAorICAgIEdMSUJDT05GSUdfSU5DTFVERV9ESVIKKyAgICBHTElCX0dJT19MSUJSQVJJRVMKKyAgICBHTElCX0dJT19VTklYX0xJQlJBUklFUworICAgIEdMSUJfR01PRFVMRV9MSUJSQVJJRVMKKyAgICBHTElCX0dPQkpFQ1RfTElCUkFSSUVTCisgICAgR0xJQl9HVEhSRUFEX0xJQlJBUklFUworICAgIEdMSUJfSU5DTFVERV9ESVIKKyAgICBHTElCX0lOQ0xVREVfRElSUworICAgIEdMSUJfTElCUkFSSUVTCispCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ1ZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZS5jbWFrZQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHUkFETEVfRk9VTkQgLSBzeXN0ZW0gaGFzIEdyYWRsZQorIyAgR1JBRExFX0VYRUNVVEFCTEUgLSB0aGUgR3JhZGxlIGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEFOVF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oR1JBRExFX0VYRUNVVEFCTEUgTkFNRVMgZ3JhZGxlIFBBVEhTICRFTlZ7R1JBRExFX0hPTUV9L2JpbiBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSCkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhHcmFkbGUgREVGQVVMVF9NU0cgR1JBRExFX0VYRUNVVEFCTEUpCittYXJrX2FzX2FkdmFuY2VkKEdSQURMRV9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JiOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgR1JBRExFV19GT1VORCAtIHN5c3RlbSBoYXMgR3JhZGxldworIyAgR1JBRExFV19FWEVDVVRBQkxFIC0gdGhlIEdyYWRsZXcgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgbG9jYXRpb24gQ01BS0VfU09VUkNFX0RJUi9saWIvamF2YQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oR1JBRExFV19FWEVDVVRBQkxFIGdyYWRsZXcgUEFUSFMgJHtDTUFLRV9TT1VSQ0VfRElSfS9saWIvamF2YSBOT19ERUZBVUxUX1BBVEggTk9fQ01BS0VfRklORF9ST09UX1BBVEgpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR3JhZGxldyBERUZBVUxUX01TRyBHUkFETEVXX0VYRUNVVEFCTEUpCittYXJrX2FzX2FkdmFuY2VkKEdSQURMRVdfRVhFQ1VUQUJMRSkKKworIyBCdWdneSBmaW5kX3Byb2dyYW0gY2Fubm90IGZpbmQgZ3JhZGxldy5iYXQgd2hlbiBncmFkbGV3IGlzIGF0IHRoZSBzYW1lIHBhdGgKKyMgYW5kIGV2ZW4gYnVnZ2llciBjdGVzdCB3aWxsIG5vdCBleGVjdXRlIGdyYWRsZXcuYmF0IHdoZW4gZ3JhZGxldyBpcyBnaXZlbi4KK2lmKENNQUtFX0hPU1RfV0lOMzIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIiguK2dyYWRsZXcpJCIgIlxcMS5iYXQiIEdSQURMRVdfRVhFQ1VUQUJMRSAke0dSQURMRVdfRVhFQ1VUQUJMRX0pCitlbmRpZihDTUFLRV9IT1NUX1dJTjMyKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjFmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgZmluZCBtc2ludHR5cGVzIG9uIGNvbXBpbGVycyB0aGF0IGRvbid0IHByb3ZpZGUgaXQsIGZvciBleGFtcGxlCisjICAgVlMyMDEwCisKKyMgVXNhZ2U6IAorIyBQcm92aWRlIElOVFRZUEVTX1JPT1QgaWYgeW91IG5lZWQgaXQKKyMgUmVzdWx0OiBJTlRUWVBFU19JTkNMVURFX0RJUlMsIHdoZXJlIHRvIGZpbmQgaW50dHlwZXMuaAorIyBSZXN1bHQ6IEludHR5cGVzX0ZPVU5ELCBJZiBmYWxzZSwgaW50dHlwZXMuaCB3YXMgbm90IGZvdW5kCisKK2ZpbmRfcGF0aChJTlRUWVBFU19JTkNMVURFX0RJUlMgaW50dHlwZXMuaCBISU5UUyAke0lOVFRZUEVTX1JPT1R9KQoraWYgKElOVFRZUEVTX0lOQ0xVREVfRElSUykKKyAgc2V0KEludHR5cGVzX0ZPVU5EIFRSVUUpCitlbHNlICgpCisgIHNldChJbnR0eXBlc19GT1VORCBGQUxTRSkKKyAgaWYgKEludHR5cGVzX0ZJTkRfUkVRVUlSRUQpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgaW50dHlwZXMuaCIpCisgIGVuZGlmICgpCisgIG1lc3NhZ2UoU1RBVFVTICJpbnR0eXBlcy5oIE5PVCBmb3VuZCIpCitlbmRpZiAoKQorCittYXJrX2FzX2FkdmFuY2VkKAorICBJTlRUWVBFU19JTkNMVURFX0RJUlMKKykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZhMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlCkBAIC0wLDAgKzEsNDUgQEAKKyMgZmluZCBMaWJFdmVudAorIyBhbiBldmVudCBub3RpZmljYXRpb24gbGlicmFyeSAoaHR0cDovL2xpYmV2ZW50Lm9yZy8pCisjCisjIFVzYWdlOiAKKyMgTElCRVZFTlRfSU5DTFVERV9ESVJTLCB3aGVyZSB0byBmaW5kIExpYkV2ZW50IGhlYWRlcnMKKyMgTElCRVZFTlRfTElCUkFSSUVTLCBMaWJFdmVudCBsaWJyYXJpZXMKKyMgTGliZXZlbnRfRk9VTkQsIElmIGZhbHNlLCBkbyBub3QgdHJ5IHRvIHVzZSBsaWJldmVudAorCitzZXQoTElCRVZFTlRfUk9PVCBDQUNIRSBQQVRIICJSb290IGRpcmVjdG9yeSBvZiBsaWJldmVudCBpbnN0YWxsYXRpb24iKQorc2V0KExpYkV2ZW50X0VYVFJBX1BSRUZJWEVTIC91c3IvbG9jYWwgL29wdC9sb2NhbCAiJEVOVntIT01FfSIgJHtMSUJFVkVOVF9ST09UfSkKK2ZvcmVhY2gocHJlZml4ICR7TGliRXZlbnRfRVhUUkFfUFJFRklYRVN9KQorICBsaXN0KEFQUEVORCBMaWJFdmVudF9JTkNMVURFX1BBVEhTICIke3ByZWZpeH0vaW5jbHVkZSIpCisgIGxpc3QoQVBQRU5EIExpYkV2ZW50X0xJQlJBUklFU19QQVRIUyAiJHtwcmVmaXh9L2xpYiIpCitlbmRmb3JlYWNoKCkKKworIyBMb29raW5nIGZvciAiZXZlbnQuaCIgd2lsbCBmaW5kIHRoZSBQbGF0Zm9ybSBTREsgaW5jbHVkZSBkaXIgb24gd2luZG93cworIyBzbyB3ZSBhbHNvIGxvb2sgZm9yIGEgcGVlciBoZWFkZXIgbGlrZSBldmh0dHAuaCB0byBnZXQgdGhlIHJpZ2h0IHBhdGgKK2ZpbmRfcGF0aChMSUJFVkVOVF9JTkNMVURFX0RJUlMgZXZodHRwLmggZXZlbnQuaCBQQVRIUyAke0xpYkV2ZW50X0lOQ0xVREVfUEFUSFN9KQorCisjICJsaWIiIHByZWZpeCBpcyBuZWVkZWQgb24gV2luZG93cyBpbiBzb21lIGNhc2VzCisjIG5ld2VyIHZlcnNpb25zIG9mIGxpYmV2ZW50IHVzZSB0aHJlZSBsaWJyYXJpZXMKK2ZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgZXZlbnRfY29yZSBldmVudF9leHRyYSBsaWJldmVudCBQQVRIUyAke0xpYkV2ZW50X0xJQlJBUklFU19QQVRIU30pCisKK2lmIChMSUJFVkVOVF9MSUJSQVJJRVMgQU5EIExJQkVWRU5UX0lOQ0xVREVfRElSUykKKyAgc2V0KExpYmV2ZW50X0ZPVU5EIFRSVUUpCisgIHNldChMSUJFVkVOVF9MSUJSQVJJRVMgJHtMSUJFVkVOVF9MSUJSQVJJRVN9KQorZWxzZSAoKQorICBzZXQoTGliZXZlbnRfRk9VTkQgRkFMU0UpCitlbmRpZiAoKQorCitpZiAoTGliZXZlbnRfRk9VTkQpCisgIGlmIChOT1QgTGliZXZlbnRfRklORF9RVUlFVExZKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCBsaWJldmVudDogJHtMSUJFVkVOVF9MSUJSQVJJRVN9IikKKyAgZW5kaWYgKCkKK2Vsc2UgKCkKKyAgaWYgKExpYkV2ZW50X0ZJTkRfUkVRVUlSRUQpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgbGliZXZlbnQuIikKKyAgZW5kaWYgKCkKKyAgbWVzc2FnZShTVEFUVVMgImxpYmV2ZW50IE5PVCBmb3VuZC4iKQorZW5kaWYgKCkKKworbWFya19hc19hZHZhbmNlZCgKKyAgICBMSUJFVkVOVF9MSUJSQVJJRVMKKyAgICBMSUJFVkVOVF9JTkNMVURFX0RJUlMKKyAgKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZSBiL2J1aWxkL2NtYWtlL05ld1BsYXRmb3JtRGVidWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0ZDMwMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL05ld1BsYXRmb3JtRGVidWcuY21ha2UKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgRm9yIGRlYnVnZ2luZyBuZXcgcGxhdGZvcm1zLCBqdXN0IHRvIHNlZSB3aGF0IHNvbWUgZW52aXJvbm1lbnQgZmxhZ3MgYXJlLi4uCisjCittYWNybyhTSE9XRkxBRyBmbGFnKQorICBtZXNzYWdlKFNUQVRVUyAiJHtmbGFnfSA9ICR7JHtmbGFnfX0iKQorZW5kbWFjcm8oU0hPV0ZMQUcpCisKK3NldChORVdQTEFURk9STURFQlVHIE9OKQorCitpZihORVdQTEFURk9STURFQlVHKQorICBTSE9XRkxBRygiQVBQTEUiKQorICBTSE9XRkxBRygiQk9STEFORCIpCisgIFNIT1dGTEFHKCJDTUFLRV9DX0NPTVBJTEVSX0lEIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NYWF9DT01QSUxFUl9JRCIpCisgIFNIT1dGTEFHKCJDTUFLRV9DT01QSUxFUl9JU19HTlVDQyIpCisgIFNIT1dGTEFHKCJDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgiKQorICBTSE9XRkxBRygiQ1lHV0lOIikKKyAgU0hPV0ZMQUcoIk1JTkdXIikKKyAgU0hPV0ZMQUcoIk1TVkMiKQorICBTSE9XRkxBRygiTVNWQ19WRVJTSU9OIikKKyAgU0hPV0ZMQUcoIk1TWVMiKQorICBTSE9XRkxBRygiVU5JWCIpCisgIFNIT1dGTEFHKCJXQVRDT00iKQorICBTSE9XRkxBRygiV0lOMzIiKQorZW5kaWYoTkVXUExBVEZPUk1ERUJVRykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1JFQURNRS1NU1lTMi5tZCBiL2J1aWxkL2NtYWtlL1JFQURNRS1NU1lTMi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NhZDkyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kCkBAIC0wLDAgKzEsNjMgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQnVpbGRpbmcgdGhyaWZ0IG9uIFdpbmRvd3MgKE1pbkdXNjQvTVNZUzIpCisKK1RocmlmdCB1c2VzIGNtYWtlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIHRoZSBwcm9qZWN0IG9uIG11bHRpcGxlIHBsYXRmb3JtcywgaG93ZXZlciB0byBidWlsZCBhIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHByb2R1Y3Rpb24gcmVhZHkgdGhyaWZ0IG9uIFdpbmRvd3MgcmVxdWlyZXMgYSBudW1iZXIgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJlIG9idGFpbmVkLiAgT25jZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYXJlIHJlYWR5LCB0aGUgcmlnaHQgY29tYmluYXRpb24gb2Ygb3B0aW9ucyBtdXN0IGJlIHBhc3NlZCB0byBjbWFrZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBlbnZpcm9ubWVudC4KKworPiBOb3RlOiBsaWJldmVudCBhbmQgbGliZXZlbnQtZGV2ZWwgZG8gbm90IHdvcmsgd2l0aCB0aGlzIHRvb2xjaGFpbiBhcyB0aGV5IGRvIG5vdCBwcm9wZXJseSBkZXRlY3QgbWluZ3c2NCBhbmQgZXhwZWN0IHNvbWUgaGVhZGVycyB0byBleGlzdCB0aGF0IGRvIG5vdCwgc28gdGhlIG5vbi1ibG9ja2luZyBzZXJ2ZXIgaXMgbm90IGN1cnJlbnRseSBidWlsdCBpbnRvIHRoaXMgc29sdXRpb24uCisKKyMjIE1TWVMyCisKK0Rvd25sb2FkIGFuZCBmdWxseSB1cGdyYWRlIG1zeXMyIGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGF0OgorCisgICAgaHR0cHM6Ly9tc3lzMi5naXRodWIuaW8vCisKK0luc3RhbGwgdGhlIG5lY2Vzc2FyeSB0b29sY2hhaW4gaXRlbXMgZm9yIEMrKzoKKworICAgICQgcGFjbWFuIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXAorICAgICAgICAgICAgICAgIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBcCisgICAgICAgICAgICAgICAgbWluZ3ctdzY0LXg4Nl82NC10b29sY2hhaW4gbWluZ3ctdzY0LXg4Nl82NC16bGliCisKK1VwZGF0ZSB5b3VyIG1zeXMyIGJhc2ggcGF0aCB0byBpbmNsdWRlIC9taW5ndzY0L2JpbiBieSBhZGRpbmcgYSBsaW5lIHRvIHlvdXIgfi8uYmFzaF9wcm9maWxlcyB1c2luZyB0aGlzIGNvbW1hbmQ6CisKKyAgICBlY2hvICJleHBvcnQgUEFUSD0vbWluZ3c2NC9iaW46XCRQQVRIIiA+PiB+Ly5iYXNoX3Byb2ZpbGUKKworQWZ0ZXIgdGhhdCwgY2xvc2UgeW91ciBzaGVsbCBhbmQgb3BlbiBhIG5ldyBvbmUuCisKK1VzZSBjbWFrZSB0byBjcmVhdGUgYSBNaW5HVyBtYWtlZmlsZSwgb3V0IG9mIHRyZWUgKGFzc3VtZXMgeW91IGFyZSBpbiB0aGUgdG9wIGxldmVsIG9mIHRoZSB0aHJpZnQgc291cmNlIHRyZWUpOgorCisgICAgbWtkaXIgLi4vdGhyaWZ0LWJ1aWxkCisgICAgY2QgLi4vdGhyaWZ0LWJ1aWxkCisgICAgY21ha2UgLUciTWluR1cgTWFrZWZpbGVzIiAtRENNQUtFX01BS0VfUFJPR1JBTT0vbWluZ3c2NC9iaW4vbWluZ3czMi1tYWtlIFwKKyAgICAgICAtRENNQUtFX0NfQ09NUElMRVI9eDg2XzY0LXc2NC1taW5ndzMyLWdjYy5leGUgXAorICAgICAgIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPXg4Nl82NC13NjQtbWluZ3czMi1nKysuZXhlIFwKKyAgICAgICAtRFdJVEhfTElCRVZFTlQ9T0ZGIFwKKyAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgLURXSVRIX1NUQVRJQ19MSUI9T04gXAorICAgICAgIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfUEVSTD1PRkYgXAorICAgICAgIC4uL3RocmlmdAorCitCdWlsZCB0aHJpZnQgKGluc2lkZSB0aHJpZnQtYnVpbGQpOgorCisgICAgY21ha2UgLS1idWlsZCAuCisKK1J1biB0aGUgdGVzdHMgKGluc2lkZSB0aHJpZnQtYnVpbGQpOgorCisgICAgY3Rlc3QKKworPiBJZiB5b3UgcnVuIGludG8gaXNzdWVzLCBjaGVjayBBcGFjaGUgSmlyYSBUSFJJRlQtNDA0NiBmb3IgcGF0Y2hlcyByZWxhdGluZyB0byBNaW5HVzY0L01TWVMyIGJ1aWxkcy4KKworIyMgVGVzdGVkIFdpdGgKKworbXN5czIgNjQtYml0IDIwMTYtMTAtMjYgZGlzdHJpYnV0aW9uCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9SRUFETUUubWQgYi9idWlsZC9jbWFrZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMTI4YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1JFQURNRS5tZApAQCAtMCwwICsxLDYwIEBACisjIEFwYWNoZSBUaHJpZnQgLSBDTWFrZSBidWlsZAorCisjIyBHb2FsCitFeHRlbmQgQXBhY2hlIFRocmlmdCdzICptYWtlIGNyb3NzKiBhcHByb2FjaCB0byB0aGUgYnVpbGQgc3lzdGVtLgorCitEdWUgdG8gZ3Jvd2luZyB0aGUgZmllbGQgb2Ygb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0LCBhIHByb3BlciBleGVjdXRhYmxlCithbmQgbGlicmFyeSBkZXRlY3Rpb24gbWVjaGFuaXNtIHJ1bm5pbmcgb24gYXMgbXVjaCBwbGF0Zm9ybXMgYXMgcG9zc2libGUKK2JlY29tZXMgcmVxdWlyZWQuIFRoZSBvdGhlciBhc3BlY3QgdG8gc2ltcGxpZnkgdGhlIHJlbGVhc2UgcHJvY2VzcyBhbmQKK3BhY2thZ2UgZ2VuZXJhdGlvbiBwcm9jZXNzLgorCitBcyBuaWNlIHNpZGUgYmVuZWZpdCBvZiBDTWFrZSBpcyB0aGUgZ2VuZXJhdGlvbiBvZiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudAorc3BlY2lmaWMgc291bHRpb24gZmlsZXMuID0+IE5vIHNvbHV0aW9uIGZpbGVzIHdpdGhpbiBzb3VyY2UgdHJlZS4KKworCisjIyBVc2FnZQoranVzdCBkbyB0aGlzOgorCisgICAgbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKKyAgICBjbWFrZSAuLgorCitpZiB5b3UgdXNlIGEgc3BlY2lmaWMgdG9vbGNoYWluIHBhc3MgaXQgdG8gY21ha2UsIHRoZSBzYW1lIGZvciBvcHRpb25zOgorCisgICAgY21ha2UgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSAuLgorICAgIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZy0zLjUgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKy0zLjUgLi4KKyAgICBjbWFrZSAtRFRIUklGVF9DT01QSUxFUl9IUz1PRkYgLi4KKyAgICBjbWFrZSAtRFdJVEhfWkxJQj1PTiAuLgorCitvciBvbiBXaW5kb3dzCisKKyAgICBjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFdpbjY0IiBcCisgICAgLURCT09TVF9ST09UPUM6LzNyZHBhcnR5L2Jvb3N0XzFfNThfMCBcCisgICAgLURaTElCX1JPT1Q9QzovM3JkcGFydHkvemxpYjEyOC1kbGwgXAorICAgIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgorCithbmQgb3BlbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGxpa2Ugd2l0aCB0aGUgc29sdXRpb24gb3IgZG8gdGhpczoKKworICAgIG1ha2UKKyAgICBtYWtlIGNoZWNrCisgICAgbWFrZSBjcm9zcworICAgIG1ha2UgZGlzdAorCit0byBnZW5lcmF0ZSBhbiBpbnN0YWxsZXIgYW5kIGRpc3RyaWJ1dGlvbiBwYWNrYWdlIGRvIHRoaXM6CisKKyAgICBjcGFjaworCisjIyBUT0RPCisqIGdpdCBoYXNoIG9yIHRhZyBiYXNlZCB2ZXJzaW9uaW5nIGRlcGVuZGluZyBvbiBzb3VyY2Ugc3RhdGUKKyogYnVpbGQgdHV0b3JpYWwKKyogYnVpbGQgdGVzdAorKiB3aXRoL3dpdGhvdXQgbGFuZ3VhZ2UgbGliLzxsYW5nPi8KKyogZW5hYmxlL2Rpc2FibGUKKyogbWFrZSBjcm9zcworKiBtYWtlIGRpc3QgKGNyZWF0ZSBhbiBhbGlhcyB0byBtYWtlIHBhY2thZ2Vfc291cmNlKQorKiBtYWtlIGRvYworKiBjcGFjayAoQysrIGFuZCBtYWtlIGRpc3Qgb25seSA/KQorICAqIHRocmlmdC1jb21waWxlcgorICAqIGxpYnRocmlmdAorICAqIHR1dG9yaWFsCisgICogdGVzdAorKiBtZXJnZSBpbnRvIC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZSBiL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM3Zjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlCkBAIC0wLDAgKzEsMTA1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiZCIgQ0FDSEUgU1RSSU5HICJTZXQgZGVidWcgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKworCittYWNybyhBRERfTElCUkFSWV9USFJJRlQgbmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIGFkZF9saWJyYXJ5KCR7bmFtZX0gU0hBUkVEICR7QVJHTn0pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUworICAgICAgICBPVVRQVVRfTkFNRSAke25hbWV9CisgICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgU09WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059ICkKKyAgICAjc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUyBQVUJMSUNfSEVBREVSICIke3RocmlmdGNwcF9IRUFERVJTfSIpCisgICAgaW5zdGFsbChUQVJHRVRTICR7bmFtZX0KKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IgorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIpCitlbmRpZigpCisKK2lmKFdJVEhfU1RBVElDX0xJQikKKyAgICBhZGRfbGlicmFyeSgke25hbWV9X3N0YXRpYyBTVEFUSUMgJHtBUkdOfSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfV9zdGF0aWMgUFJPUEVSVElFUworICAgICAgICBPVVRQVVRfTkFNRSAke25hbWV9JHtTVEFUSUNfUE9TVEZJWH0KKyAgICAgICAgVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfQorICAgICAgICBTT1ZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0gKQorICAgIGluc3RhbGwoVEFSR0VUUyAke25hbWV9X3N0YXRpYworICAgICAgICBSVU5USU1FIERFU1RJTkFUSU9OICIke0JJTl9JTlNUQUxMX0RJUn0iCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBQVUJMSUNfSEVBREVSIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IikKK2VuZGlmKCkKKworZW5kbWFjcm8oQUREX0xJQlJBUllfVEhSSUZUKQorCisKK21hY3JvKFRBUkdFVF9JTkNMVURFX0RJUkVDVE9SSUVTX1RIUklGVCBuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtuYW1lfSAke0FSR059KQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtuYW1lfV9zdGF0aWMgJHtBUkdOfSkKK2VuZGlmKCkKKworZW5kbWFjcm8oVEFSR0VUX0lOQ0xVREVfRElSRUNUT1JJRVNfVEhSSUZUKQorCisKK21hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQgbmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7QVJHTn0pCitlbmRpZigpCisKK2lmKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfV9zdGF0aWMgJHtBUkdOfSkKK2VuZGlmKCkKKworZW5kbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCkKKworCittYWNybyhMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkgdGFyZ2V0IGxpYm5hbWUpCisKK2lmIChXSVRIX1NIQVJFRF9MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fSAke2xpYm5hbWV9KQorZWxzZWlmIChXSVRIX1NUQVRJQ19MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fSAke2xpYm5hbWV9X3N0YXRpYykKK2Vsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUwgIk5vdCBsaW5raW5nIHdpdGggc2hhcmVkIG9yIHN0YXRpYyBsaWJyYXJpZXM/IikKK2VuZGlmKCkKKworZW5kbWFjcm8oTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKQorCisKK21hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSB0YXJnZXQgbGlibmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtBUkdOfSAke2xpYm5hbWV9KQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fV9zdGF0aWMgJHtBUkdOfSAke2xpYm5hbWV9X3N0YXRpYykKK2VuZGlmKCkKKworZW5kbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UgYi9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYzZDAwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSwyNiBAQAorc2V0KEFORFJPSURfTkRLICIvb3B0L2FuZHJvaWQtbmRrIiBDQUNIRSkKK3NldChBTkRST0lEX1BMQVRGT1JNICJhbmRyb2lkLTE1IiBDQUNIRSkKK3NldChBTkRST0lEX0FSQ0ggImFyY2gtYXJtIiBDQUNIRSkKK3NldChBTkRST0lEX1RPT0xfQVJDSCAiYW5kcm9pZC1hcm0iIENBQ0hFKQorc2V0KEFORFJPSURfQ1BVICJhcm1lYWJpLXY3YSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9HQ0NfVkVSU0lPTiA0LjkgQ0FDSEUpCitzZXQoSE9TVF9BUkNIIGxpbnV4LXg4Nl82NCBDQUNIRSkKKworc2V0KENNQUtFX1NZU1RFTV9OQU1FIEFuZHJvaWQpCitzZXQoQU5EUk9JRF9TWVNST09UICIke0FORFJPSURfTkRLfS9wbGF0Zm9ybXMvJHtBTkRST0lEX1BMQVRGT1JNfS8ke0FORFJPSURfQVJDSH0iKQorc2V0KEFORFJPSURfVFJJUExFVCBhcm0tbGludXgtYW5kcm9pZGVhYmkpCitzZXQoQU5EUk9JRF9TVEwgIiR7QU5EUk9JRF9OREt9L3NvdXJjZXMvY3h4LXN0bC9nbnUtbGlic3RkKysvJHtBTkRST0lEX0dDQ19WRVJTSU9OfSIpCisKK3NldChfQ09NUElMRVJfUk9PVCAke0FORFJPSURfTkRLfS9wcmVidWlsdC8ke0FORFJPSURfVFJJUExFVH0tJHtBTkRST0lEX0dDQ19WRVJTSU9OfS9wcmVidWlsdC8ke0hPU1RfQVJDSH0pCitzZXQoQ01BS0VfQ19DT01QSUxFUiAke19DT01QSUxFUl9ST09UfS9iaW4vJHtBTkRST0lEX1RSSVBMRVR9LWdjYykKK3NldChDTUFLRV9DWENYX0NPTVBJTEVSICR7X0NPTVBJTEVSX1JPT1R9L2Jpbi8ke0FORFJPSURfVFJJUExFVH0tZysrKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAgICR7QU5EUk9JRF9TVEx9L2luY2x1ZGUKKyAgICAke0FORFJPSURfU1RMfS9saWJzLyR7QU5EUk9JRF9DUFV9L2luY2x1ZGUpCisKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSCAke0FORFJPSURfU1lTUk9PVH0pCisKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gTkVWRVIpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE9OTFkpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFIE9OTFkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9jb25maWcuaC5pbiBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGFlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9jb25maWcuaC5pbgpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBjb25maWcuaCBnZW5lcmF0ZWQgYnkgQ01ha2UgZnJvbSBjb25maWcuaC5pbiAqLworCisjaWZuZGVmIENPTkZJR19ICisjZGVmaW5lIENPTkZJR19ICisKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjY21ha2VkZWZpbmUgUEFDS0FHRSAiJHtQQUNLQUdFfSIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiR7UEFDS0FHRV9CVUdSRVBPUlR9IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9OQU1FICIke1BBQ0tBR0VfTkFNRX0iCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiR7UEFDS0FHRV9UQVJOQU1FfSIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX1VSTCAiJHtQQUNLQUdFX1VSTH0iCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJHtQQUNLQUdFX1ZFUlNJT059IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIke1BBQ0tBR0VfU1RSSU5HfSIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERFRklORVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5lIGlmIHRoZSBBSV9BRERSQ09ORklHIHN5bWJvbCBpcyB1bmF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEFJX0FERFJDT05GSUcgMAorCisvKiBQb3NzaWJsZSB2YWx1ZSBmb3IgU0lHTkVEX1JJR0hUX1NISUZUX0lTICovCisvKiBUT0RPOiBUaGlzIGlzIGp1c3Qgc2V0IHRvIDEgZm9yIHRoZSBtb21lbnQKKyAgIHBvcnQgdGhlIG1hY3JvIGFjbG9jYWwvYXhfc2lnbmVkX3JpZ2h0X3NoaWZ0Lm00IHRvIENNYWtlIHRvIG1ha2UgdGhpcyB3b3JrICovCisjZGVmaW5lIEFSSVRITUVUSUNfUklHSFRfU0hJRlQgMQorCisvKiBJbmRpY2F0ZXMgdGhlIGVmZmVjdCBvZiB0aGUgcmlnaHQgc2hpZnQgb3BlcmF0b3Igb24gbmVnYXRpdmUgc2lnbmVkCisgICBpbnRlZ2VycyAqLworLyogVE9ETzogVGhpcyBpcyBqdXN0IHNldCB0byAxIGZvciB0aGUgbW9tZW50ICovCisjZGVmaW5lIFNJR05FRF9SSUdIVF9TSElGVF9JUyAxCisKKy8qIFVzZSAqLmggZXh0ZW5zaW9uIGZvciBwYXJzZXIgaGVhZGVyIGZpbGUgKi8KKy8qIFRPRE86IFRoaXMgbWlnaHQgbm93IGJlIG5lY2Vzc2FyeSBhbnltb3JlIGFzIGl0IGlzIHNldCBvbmx5IGZvciBhdXRvbWFrZSA8IDEuMTEKKyAgIHNlZTogYWNsb2NhbC9hY19wcm9nX2Jpc29uLm00ICovCisjY21ha2VkZWZpbmUgQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTiAxCisKKy8qIHJlcGxhY2VzIFBPU0lYIHB0aHJlYWQgYnkgc3RkOjp0aHJlYWQgKi8KKyNjbWFrZWRlZmluZSBVU0VfU1REX1RIUkVBRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHN0cmVycm9yX3IgcmV0dXJucyBjaGFyICouICovCisjY21ha2VkZWZpbmUgU1RSRVJST1JfUl9DSEFSX1AgMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBIRUFERVIgRklMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhcnBhL2luZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9BUlBBX0lORVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTkVUREJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BUSFJFQURfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX0lPQ1RMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUkVTT1VSQ0VfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVU5fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BPTExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUE9MTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNjaGVkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0aG9zdGJ5bmFtZScgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lX3InIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcl9yJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUkVSUk9SX1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNjaGVkX2dldF9wcmlvcml0eV9tYXgnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOIDEKKworCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI2NtYWtlZGVmaW5lIFNUUkVSUk9SX1JfQ0hBUl9QIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSBiL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NGMwZWIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZQpAQCAtMCwwICsxLDI0IEBACisjIENNYWtlIG1pbmd3MzIgY3Jvc3MgY29tcGlsZSB0b29sY2hhaW4gZmlsZQorCisjIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgb3BlcmF0aW5nIHN5c3RlbQorU0VUKENNQUtFX1NZU1RFTV9OQU1FIFdpbmRvd3MpCisKKyMgd2hpY2ggY29tcGlsZXJzIHRvIHVzZSBmb3IgQyBhbmQgQysrCitTRVQoQ01BS0VfQ19DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLWdjYykKK1NFVChDTUFLRV9DWFhfQ09NUElMRVIgaTU4Ni1taW5ndzMybXN2Yy1nKyspCitTRVQoQ01BS0VfUkNfQ09NUElMRVIgaTU4Ni1taW5ndzMybXN2Yy13aW5kcmVzKQorCisjIGhlcmUgaXMgdGhlIHRhcmdldCBlbnZpcm9ubWVudCBsb2NhdGVkCitTRVQoQ01BS0VfRklORF9ST09UX1BBVEggL3Vzci9pNTg2LW1pbmd3MzJtc3ZjKQorCisjIGFkanVzdCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgdGhlIEZJTkRfWFhYKCkgY29tbWFuZHM6CisjIHNlYXJjaCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudCwgc2VhcmNoCisjIHByb2dyYW1zIGluIHRoZSBob3N0IGVudmlyb25tZW50CitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERSBPTkxZKQorCitzZXQoQlVJTERfU0hBUkVEX0xJQlMgT0ZGKQorU0VUKENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgIi1zdGF0aWMiKQorc2V0KENNQUtFX0NfRkxBR1MgJHtDTUFLRV9DX0ZMQUdTfSAiLXN0YXRpYy1saWJnY2MiKQorc2V0KENNQUtFX0NYWF9GTEFHUyAke0NNQUtFX0NYWF9GTEFHU30gIi1zdGF0aWMtbGlic3RkYysrIikKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9SRUFETUUubWQgYi9idWlsZC9kb2NrZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmQ2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTk4IEBACisjIERvY2tlciBJbnRlZ3JhdGlvbiAjCisKK0R1ZSB0byB0aGUgbGFyZ2UgbnVtYmVyIG9mIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgQXBhY2hlIFRocmlmdCwKK2RvY2tlciBjb250YWluZXJzIGFyZSB1c2VkIHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZSBwcm9qZWN0IG9uIGEKK3ZhcmlldHkgb2YgcGxhdGZvcm1zIHRvIHByb3ZpZGUgbWF4aW11bSB0ZXN0IGNvdmVyYWdlLgorCisjIyBBcHB2ZXlvciBJbnRlZ3JhdGlvbiAjIworCitBdCB0aGlzIHRpbWUgdGhlIEFwcHZleW9yIHNjcmlwdHMgZG8gbm90IHVzZSBkb2NrZXIgY29udGFpbmVycy4KK09uY2UgTWljcm9zb2Z0IHN1cHBvcnRzIFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgcnVubmluZyBpbnNpZGUKK25hbm8gY29udGFpbmVycyAoaW5zdGVhZCBvZiBDb3JlLCB3aGljaCBpcyBodWdlKSB0aGVuIHdlIHdpbGwKK2NvbnNpZGVyIHVzaW5nIGNvbnRhaW5lcnMgZm9yIHRoZSBXaW5kb3dzIGJ1aWxkcyBhcyB3ZWxsLgorCisjIyBUcmF2aXMgQ0kgSW50ZWdyYXRpb24gIyMKKworVGhlIFRyYXZpcyBDSSBzY3JpcHRzIHVzZSB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQKK2xvZ2ljIHRvIGRldGVybWluZSB0aGVpciBiZWhhdmlvcjoKKworIyMjIEVudmlyb25tZW50IFZhcmlhYmxlcyAjIyMKKworfCBWYXJpYWJsZSB8IERlZmF1bHQgfCBVc2FnZSB8Cit8IC0tLS0tLS0tIHwgLS0tLS0gfCAtLS0tLS0tIHwKK3wgYERJU1RST2AgfCBgdWJ1bnR1LWJpb25pY2AgfCBTZXQgYnkgdmFyaW91cyBidWlsZCBqb2JzIGluIGAudHJhdmlzLnltbGAgdG8gcnVuIGJ1aWxkcyBpbiBkaWZmZXJlbnQgY29udGFpbmVycy4gIE5vdCBpbnRlbmRlZCB0byBiZSBzZXQgZXh0ZXJuYWxseS58Cit8IGBET0NLRVJfUkVQT2AgfCBgdGhyaWZ0L3RocmlmdC1idWlsZGAgfCBUaGUgbmFtZSBvZiB0aGUgRG9ja2VyIEh1YiByZXBvc2l0b3J5IHRvIG9idGFpbiBhbmQgc3RvcmUgZG9ja2VyIGltYWdlcy4gfAorfCBgRE9DS0VSX1VTRVJgIHwgYDxub25lPmAgfCBUaGUgRG9ja2VyIEh1YiBhY2NvdW50IG5hbWUgY29udGFpbmluZyB0aGUgcmVwb3NpdG9yeS4gfAorfCBgRE9DS0VSX1BBU1NgIHwgYDxub25lPmAgfCBUaGUgRG9ja2VyIEh1YiBhY2NvdW50IHBhc3N3b3JkIHRvIHVzZSB3aGVuIHB1c2hpbmcgbmV3IHRhZ3MuIHwKKworRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGRvY2tlciBpbWFnZSB0aGF0IGlzIHVzZWQgaW4gYnVpbGRzIGlmIG5vIG92ZXJyaWRlcyBhcmUgc3BlY2lmaWVkIHdvdWxkIGJlOiBgdGhyaWZ0L3RocmlmdC1idWlsZDp1YnVudHUtYmlvbmljYAorCisjIyMgRm9ya3MgIyMjCisKK0lmIHlvdSBoYXZlIGZvcmtlZCB0aGUgQXBhY2hlIFRocmlmdCByZXBvc2l0b3J5IGFuZCB5b3Ugd291bGQgbGlrZQordG8gdXNlIHlvdXIgb3duIERvY2tlciBIdWIgYWNjb3VudCB0byBzdG9yZSB0aHJpZnQgYnVpbGQgaW1hZ2VzLAoreW91IGNhbiB1c2UgdGhlIFRyYXZpcyBDSSB3ZWIgaW50ZXJmYWNlIHRvIHNldCB0aGUgYERPQ0tFUl9VU0VSYCwKK2BET0NLRVJfUEFTU2AsIGFuZCBgRE9DS0VSX1JFUE9gIHZhcmlhYmxlcyBpbiBhIHNlY3VyZSBtYW5uZXIuCitZb3VyIGZvcmsgYnVpbGRzIHdpbGwgdGhlbiBwdWxsLCBwdXNoLCBhbmQgdGFnIHRoZSBkb2NrZXIgaW1hZ2VzCitpbiB5b3VyIGFjY291bnQuCisKKyMjIyBMb2dpYyAjIyMKKworVGhlIFRyYXZpcyBDSSBidWlsZCBydW5zIGluIHR3byBwaGFzZXMgLSBmaXJzdCB0aGUgZG9ja2VyIGltYWdlcyBhcmUgcmVidWlsdAorZm9yIGVhY2ggb2YgdGhlIHN1cHBvcnRlZCBjb250YWluZXJzIGlmIHRoZXkgZG8gbm90IG1hdGNoIHRoZSBEb2NrZXJmaWxlIHRoYXQKK3dhcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb3N0IHJlY2VudCB0YWcuICBJZiBhIGBET0NLRVJfUEFTU2AgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIGlzIHNwZWNpZmllZCwgdGhlIGRvY2tlciBzdGFnZSBidWlsZHMgd2lsbCBhdHRlbXB0IHRvIGxvZyBpbnRvCitEb2NrZXIgSHViIGFuZCBwdXNoIHRoZSByZXN1bHRpbmcgdGFncy4KKworIyMgU3VwcG9ydGVkIENvbnRhaW5lcnMgIyMKKworVGhlIFRyYXZpcyBDSSAoY29udGludW91cyBpbnRlZ3JhdGlvbikgYnVpbGRzIHVzZSB0aGUgVWJ1bnR1IEJpb25pYworKDE4LjA0IExUUykgYW5kIFhlbmlhbCAoMTYuMDQgTFRTKSBpbWFnZXMgdG8gbWF4aW1pemUgbGFuZ3VhZ2UgbGV2ZWwKK2NvdmVyYWdlLgorCisjIyMgVWJ1bnR1ICMjIworCisqIGJpb25pYyAoc3RhYmxlLCBjdXJyZW50KQorKiBhcnRmdWwgKHByZXZpb3VzIHN0YWJsZSkKKyogeGVuaWFsIChsZWdhY3kpCisKKyMjIFVuc3VwcG9ydGVkIENvbnRhaW5lcnMgIyMKKworVGhlc2UgY29udGFpbmVycyBtYXkgYmUgaW4gdmFyaW91cyBzdGF0ZXMsIGFuZCBtYXkgbm90IGJ1aWxkIGV2ZXJ5dGhpbmcuCitUaGV5IGNhbiBiZSBmb3VuZCBpbiB0aGUgYG9sZC9gIHN1YmRpcmVjdG9yeS4KKworIyMjIENlbnRPUyAjIyMKKyogNy4zCisgICogbWFrZSBjaGVjayBpbiBsaWIvcHkgbWF5IGhhbmcgaW4gdGVzdF9zc2xzb2NrZXQgLSByb290IGNhdXNlIHVua25vd24KKworIyMjIERlYmlhbiAjIyMKKworKiBqZXNzaWUKKyogc3RyZXRjaAorICAqIG1ha2UgY2hlY2sgaW4gbGliL2NwcCBmYWlscyBkdWUgdG8gaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTI1MDcKKworIyMgQnVpbGRpbmcgbGlrZSBUcmF2aXMgQ0kgZG9lcywgbG9jYWxseSAjIworCitXZSByZWNvbW1lbmQgeW91IGJ1aWxkIGxvY2FsbHkgdGhlIHNhbWUgd2F5IFRyYXZpcyBDSSBkb2VzLCBzbyB0aGF0IHdoZW4geW91CitzdWJtaXQgeW91ciBwdWxsIHJlcXVlc3QgeW91IHdpbGwgcnVuIGludG8gZmV3ZXIgc3VycHJpc2VzLiAgVG8gbWFrZSBpdCBhCitsaXR0bGUgZWFzaWVyLCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIHlvdXIgYH4vLmJhc2hfYWxpYXNlc2AgZmlsZToKKworICAgICMgS2lsbCBhbGwgcnVubmluZyBjb250YWluZXJzLgorICAgIGFsaWFzIGRvY2tlcmtpbGxhbGw9J2RvY2tlciBraWxsICQoZG9ja2VyIHBzIC1xKScKKworICAgICMgRGVsZXRlIGFsbCBzdG9wcGVkIGNvbnRhaW5lcnMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW5jPSdwcmludGYgIlxuPj4+IERlbGV0aW5nIHN0b3BwZWQgY29udGFpbmVyc1xuXG4iICYmIGRvY2tlciBybSAkKGRvY2tlciBwcyAtYSAtcSknCisKKyAgICAjIERlbGV0ZSBhbGwgdW50YWdnZWQgaW1hZ2VzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuaT0ncHJpbnRmICJcbj4+PiBEZWxldGluZyB1bnRhZ2dlZCBpbWFnZXNcblxuIiAmJiBkb2NrZXIgcm1pICQoZG9ja2VyIGltYWdlcyAtcSAtZiBkYW5nbGluZz10cnVlKScKKworICAgICMgRGVsZXRlIGFsbCBzdG9wcGVkIGNvbnRhaW5lcnMgYW5kIHVudGFnZ2VkIGltYWdlcy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbj0nZG9ja2VyY2xlYW5jIHx8IHRydWUgJiYgZG9ja2VyY2xlYW5pJworCisgICAgIyBCdWlsZCBhIHRocmlmdCBkb2NrZXIgaW1hZ2UgKHJ1biBmcm9tIHRvcCBsZXZlbCBvZiBnaXQgcmVwbyk6IGFyZ3VtZW50ICMxIGlzIGltYWdlIHR5cGUgKHVidW50dSwgY2VudG9zLCBldGMpLgorICAgIGZ1bmN0aW9uIGRvY2tlcmJ1aWxkCisgICAgeworICAgICAgZG9ja2VyIGJ1aWxkIC10ICQxIGJ1aWxkL2RvY2tlci8kMQorICAgIH0KKworICAgICMgUnVuIGEgdGhyaWZ0IGRvY2tlciBpbWFnZTogYXJndW1lbnQgIzEgaXMgaW1hZ2UgdHlwZSAodWJ1bnR1LCBjZW50b3MsIGV0YykuCisgICAgZnVuY3Rpb24gZG9ja2VycnVuCisgICAgeworICAgICAgZG9ja2VyIHJ1biAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgLWl0ICQxIC9iaW4vYmFzaAorICAgIH0KKworVGhlbiwgdG8gcHVsbCBkb3duIHRoZSBjdXJyZW50IGltYWdlIGJlaW5nIHVzZWQgdG8gYnVpbGQgKHRoZSBzYW1lIHdheQorVHJhdmlzIENJIGRvZXMgaXQpIC0gaWYgaXQgaXMgb3V0IG9mIGRhdGUgaW4gYW55IHdheSBpdCB3aWxsIGJ1aWxkIGEKK25ldyBvbmUgZm9yIHlvdToKKworICAgIHRocmlmdCQgRE9DS0VSX1JFUE89dGhyaWZ0L3RocmlmdC1idWlsZCBESVNUUk89dWJ1bnR1LWJpb25pYyBidWlsZC9kb2NrZXIvcmVmcmVzaC5zaAorCitUbyBydW4gYWxsIHVuaXQgdGVzdHMgKGp1c3QgbGlrZSBUcmF2aXMgQ0kgZG9lcyk6CisKKyAgICB0aHJpZnQkIGRvY2tlcnJ1biB1YnVudHUtYmlvbmljCisgICAgcm9vdEA4Y2FmNTZiMGNlN2I6L3RocmlmdC9zcmMjIGJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaAorCitUbyBydW4gdGhlIGNyb3NzIHRlc3RzIChqdXN0IGxpa2UgVHJhdmlzIENJIGRvZXMpOgorCisgICAgdGhyaWZ0JCBkb2NrZXJydW4gdWJ1bnR1LWJpb25pYworICAgIHJvb3RAOGNhZjU2YjBjZTdiOi90aHJpZnQvc3JjIyBidWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoCisKK1doZW4geW91IGFyZSBkb25lLCB5b3Ugd2FudCB0byBjbGVhbiB1cCBvY2Nhc2lvbmFsbHkgc28gdGhhdCBkb2NrZXIgaXNuJ3QgdXNpbmcgbG90cyBvZiBleHRyYSBkaXNrIHNwYWNlOgorCisgICAgdGhyaWZ0JCBkb2NrZXJjbGVhbgorCitZb3UgbmVlZCB0byBydW4gdGhlIGRvY2tlciBjb21tYW5kcyBmcm9tIHRoZSByb290IG9mIHRoZSBsb2NhbCBjbG9uZSBvZiB0aGUKK3RocmlmdCBnaXQgcmVwb3NpdG9yeSBmb3IgdGhlbSB0byB3b3JrLgorCitXaGVuIHlvdSBhcmUgZG9uZSBpbiB0aGUgcm9vdCBkb2NrZXIgc2hlbGwgeW91IGNhbiBgZXhpdGAgdG8gZ28gYmFjayB0bworeW91ciB1c2VyIGhvc3Qgc2hlbGwuICBPbmNlIHRoZSB1bml0IHRlc3RzIGFuZCBjcm9zcyB0ZXN0IHBhc3NlcyBsb2NhbGx5LAorc3VibWl0IHRoZSBjaGFuZ2VzLCBhbmQgaWYgZGVzaXJlZCBzcXVhc2ggdGhlIHB1bGwgcmVxdWVzdCB0byBvbmUgY29tbWl0Cit0byBtYWtlIGl0IGVhc2llciB0byBtZXJnZSAodGhlIGNvbW1pdHRlcnMgY2FuIHNxdWFzaCBhdCBjb21taXQgdGltZSBub3cKK3RoYXQgR2l0SHViIGlzIHRoZSBtYXN0ZXIgcmVwb3NpdG9yeSkuICBOb3cgeW91IGFyZSBidWlsZGluZyBsaWtlIFRyYXZpcyBDSSBkb2VzIQorCisjIyBSYXcgQ29tbWFuZHMgZm9yIEJ1aWxkaW5nIHdpdGggRG9ja2VyICMjCisKK0lmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlIHNhbWUgc2NyaXB0cyBUcmF2aXMgQ0kgZG9lcywgeW91IGNhbiBkbyBpdCBtYW51YWxseToKKworQnVpbGQgdGhlIGltYWdlOgorCisgICAgdGhyaWZ0JCBkb2NrZXIgYnVpbGQgLXQgdGhyaWZ0IGJ1aWxkL2RvY2tlci91YnVudHUtYmlvbmljCisKK09wZW4gYSBjb21tYW5kIHByb21wdCBpbiB0aGUgaW1hZ2U6CisKKyAgICB0aHJpZnQkIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCB0aHJpZnQgL2Jpbi9iYXNoCisKKyMjIENvcmUgVG9vbCBWZXJzaW9ucyBwZXIgRG9ja2VyZmlsZSAjIworCitMYXN0IHVwZGF0ZWQ6IE9jdG9iZXIgMSwgMjAxNworCit8IFRvb2wgICAgICB8IHVidW50dS14ZW5pYWwgfCB1YnVudHUtYmlvbmljIHwgTm90ZXMgfAorfCA6LS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tIHwKK3wgYW50ICAgICAgIHwgMS45LjYgICAgICAgICB8IDEuMTAuMyAgICAgICAgfCAgICAgICB8Cit8IGF1dG9jb25mICB8IDIuNjkgICAgICAgICAgfCAyLjY5ICAgICAgICAgIHwgICAgICAgfAorfCBhdXRvbWFrZSAgfCAxLjE1ICAgICAgICAgIHwgMS4xNS4xICAgICAgICB8ICAgICAgIHwKK3wgYmlzb24gICAgIHwgMy4wLjQgICAgICAgICB8IDMuMC40ICAgICAgICAgfCAgICAgICB8Cit8IGJvb3N0ICAgICB8IDEuNTguMCAgICAgICAgfCAxLjY1LjEgICAgICAgIHwgICAgICAgfAorfCBjbWFrZSAgICAgfCAzLjUuMSAgICAgICAgIHwgMy4xMC4yICAgICAgICB8ICAgICAgIHwKK3wgY3BwY2hlY2sgIHwgMS43MiAgICAgICAgICB8IDEuODIgICAgICAgICAgfCAgICAgICB8Cit8IGZsZXggICAgICB8IDIuNi4wICAgICAgICAgfCAyLjYuNCAgICAgICAgIHwgICAgICAgfAorfCBsaWJjNiAgICAgfCAyLjIzICAgICAgICAgIHwgMi4yNyAgICAgICAgICB8IGdsaWJjIHwKK3wgbGliZXZlbnQgIHwgMi4wLjIxICAgICAgICB8IDIuMS44ICAgICAgICAgfCAgICAgICB8Cit8IGxpYnN0ZGMrKyB8IDUuNC4wICAgICAgICAgfCA3LjMuMCAgICAgICAgIHwgICAgICAgfAorfCBtYWtlICAgICAgfCA0LjEgICAgICAgICAgIHwgNC4xICAgICAgICAgICB8ICAgICAgIHwKK3wgb3BlbnNzbCAgIHwgMS4wLjJnICAgICAgICB8IDEuMS4wZyAgICAgICAgfCAgICAgICB8Cit8IHF0NSAgICAgICB8IDUuNS4xICAgICAgICAgfCA1LjkuNSAgICAgICAgIHwgICAgICAgfAorCisjIyBDb21waWxlci9MYW5ndWFnZSBWZXJzaW9ucyBwZXIgRG9ja2VyZmlsZSAjIworCit8IExhbmd1YWdlICB8IHVidW50dS14ZW5pYWwgfCB1YnVudHUtYmlvbmljIHwgTm90ZXMgfAorfCA6LS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tIHwKK3wgYXMgb2YgICAgIHwgTWFyIDA2LCAyMDE4ICB8IEphbiA0LCAyMDE5ICAgfCAgICAgICB8Cit8IGFzMyAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgQysrIGdjYyAgIHwgNS40LjAgICAgICAgICB8IDcuMy4wICAgICAgICAgfCAgICAgICB8Cit8IEMrKyBjbGFuZyB8IDMuOCAgICAgICAgICAgfCA2LjAgICAgICAgICAgIHwgICAgICAgfAorfCBDIyAobW9ubykgfCA0LjIuMS4wICAgICAgIHwgNC42LjIuNyAgICAgICB8ICAgICAgIHwKK3wgY19nbGliICAgIHwgMi40OC4yICAgICAgICB8IDIuNTYuMCAgICAgICAgfCAgICAgICB8Cit8IGNsIChzYmNsKSB8ICAgICAgICAgICAgICAgfCAxLjQuMTUgICAgICAgIHwgICAgICAgfAorfCBjb2NvYSAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IGQgICAgICAgICB8IDIuMDc1LjEgICAgICAgfCAyLjA4My4xICAgICAgIHwgICAgICAgfAorfCBkYXJ0ICAgICAgfCAxLjIyLjEgICAgICAgIHwgMS4yNC4zICAgICAgICB8ICAgICAgIHwKK3wgZGVscGhpICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBkb3RuZXQgICAgfCAyLjEuNCAgICAgICAgIHwgMi4yLjEwMSAgICAgICB8ICAgICAgIHwKK3wgZXJsYW5nICAgIHwgMTguMyAgICAgICAgICB8IDIwLjIuMiAgICAgICAgfCAgICAgICB8Cit8IGdvICAgICAgICB8IDEuNy42ICAgICAgICAgfCAxLjExLjQgICAgICAgIHwgICAgICAgfAorfCBoYXNrZWxsICAgfCA3LjEwLjMgICAgICAgIHwgOC4wLjIgICAgICAgICB8ICAgICAgIHwKK3wgaGF4ZSAgICAgIHwgMy4yLjEgICAgICAgICB8IDMuNC40ICAgICAgICAgfCBUSFJJRlQtNDM1MjogYXZvaWQgMy40LjIgfAorfCBqYXZhICAgICAgfCAxLjguMF8xNTEgICAgIHwgMS44LjBfMTkxICAgICB8ICAgICAgIHwKK3wganMgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBVbnN1cmUgaG93IHRvIGxvb2sgZm9yIHZlcnNpb24gaW5mbz8gfAorfCBsdWEgICAgICAgfCA1LjIuNCAgICAgICAgIHwgNS4yLjQgICAgICAgICB8IEx1YSA1LjM6IHNlZSBUSFJJRlQtNDM4NiB8Cit8IG5vZGVqcyAgICB8IDYuMTMuMCAgICAgICAgfCA4LjE1LjAgICAgICAgIHwgICAgICAgfAorfCBvY2FtbCAgICAgfCAgICAgICAgICAgICAgIHwgNC4wNS4wICAgICAgICB8IFRIUklGVC00NTE3OiBvY2FtbCA0LjAyLjMgb24geGVuaWFsIGFwcGVhcnMgYnJva2VuIHwKK3wgcGVybCAgICAgIHwgNS4yMi4xICAgICAgICB8IDUuMjYuMSAgICAgICAgfCAgICAgICB8Cit8IHBocCAgICAgICB8IDcuMC4yMiAgICAgICAgfCA3LjIuMTAgICAgICAgIHwgICAgICAgfAorfCBweXRob24gICAgfCAyLjcuMTIgICAgICAgIHwgMi43LjE1cmMxICAgICB8ICAgICAgIHwKK3wgcHl0aG9uMyAgIHwgMy41LjIgICAgICAgICB8IDMuNi43ICAgICAgICAgfCAgICAgICB8Cit8IHJ1YnkgICAgICB8IDIuMy4xcDExMiAgICAgfCAyLjUuMXA1NyAgICAgIHwgICAgICAgfAorfCBydXN0ICAgICAgfCAxLjE3LjAgICAgICAgIHwgMS4zMC4wICAgICAgICB8ICAgICAgIHwKK3wgc21hbGx0YWxrIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBzd2lmdCAgICAgfCAgICAgICAgICAgICAgIHwgNC4yLjEgICAgICAgICB8ICAgICAgIHwKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvVmFncmFudGZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYWM2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsNTkgQEAKKyMgLSotIG1vZGU6IHJ1YnkgLSotCisjIHZpOiBzZXQgZnQ9cnVieSA6CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQmFzZSBzeXN0ZW0gYm9vdHN0cmFwIHNjcmlwdAorJGJvb3RzdHJhcF9zY3JpcHQgPSA8PF9fQk9PVFNUUkFQX18KK2VjaG8gIlByb3Zpc2lvbmluZyBkZWZhdWx0cyIKKworc3VkbyBhcHQtZ2V0IHVwZGF0ZSAteQorc3VkbyBhcHQtZ2V0IHVwZ3JhZGUgLXkKKworIyBJbnN0YWxsIGRlZmF1bHQgcGFja2FnZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGJ1aWxkLWVzc2VudGlhbCBjdXJsIGdpdAorCisjIEluc3RhbGwgbGF0ZXN0IERvY2tlciB2ZXJzaW9uCitzdWRvIGN1cmwgLXNTTCBodHRwczovL2dldC5kb2NrZXIuaW8vZ3BnIHwgc3VkbyBhcHQta2V5IGFkZCAtCitzdWRvIGVjaG8gImRlYiBodHRwOi8vZ2V0LmRvY2tlci5pby91YnVudHUgZG9ja2VyIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG9ja2VyLmxpc3QKK3N1ZG8gYXB0LWdldCB1cGRhdGUgLXkKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGxpbnV4LWltYWdlLWV4dHJhLWB1bmFtZSAtcmAgYXVmcy10b29scworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgbHhjLWRvY2tlcgorCitlY2hvICJGaW5pc2hlZCBwcm92aXNpb25pbmcgZGVmYXVsdHMiCitfX0JPT1RTVFJBUF9fCisKK1ZhZ3JhbnQuY29uZmlndXJlKCIyIikgZG8gfGNvbmZpZ3wKKyAgY29uZmlnLnZtLmJveCA9ICJ0cnVzdHk2NCIKKyAgY29uZmlnLnZtLmJveF91cmwgPSAiaHR0cHM6Ly9jbG91ZC1pbWFnZXMudWJ1bnR1LmNvbS92YWdyYW50L3RydXN0eS9jdXJyZW50L3RydXN0eS1zZXJ2ZXItY2xvdWRpbWctYW1kNjQtdmFncmFudC1kaXNrMS5ib3giCisgIGNvbmZpZy5zc2guZm9yd2FyZF9hZ2VudCA9IHRydWUKKworICBjb25maWcudm0ucHJvdmlkZXIgOnZpcnR1YWxib3ggZG8gfHZib3h8CisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tbWVtb3J5IiwgIjEwMjQiXQorICAgIHZib3guY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLWNwdXMiLCAiMiJdCisgIGVuZAorCisgICMgU2V0dXAgdGhlIGRlZmF1bHQgYm9vdHN0cmFwIHNjcmlwdCBmb3Igb3VyIHVidW50dSBiYXNlIGJveCBpbWFnZQorICBjb25maWcudm0ucHJvdmlzaW9uICJzaGVsbCIsIGlubGluZTogJGJvb3RzdHJhcF9zY3JpcHQKKworICAjIFNldHVwIHRoZSBjdXN0b20gZG9ja2VyIGltYWdlIGZyb20gb3VyIFVidW50dSBEb2NrZXJmaWxlCisgIGNvbmZpZy52bS5wcm92aXNpb24gImRvY2tlciIgZG8gfGR8CisgICAgZC5idWlsZF9pbWFnZSAiL3ZhZ3JhbnQvdWJ1bnR1IiwgYXJnczogIi10IHRocmlmdCIKKyAgZW5kCisKKyAgIyBTZXR1cCB0aGUgY3VzdG9tIGRvY2tlciBpbWFnZSBmcm9tIG91ciBDZW50b3MgRG9ja2VyZmlsZQorICAjY29uZmlnLnZtLnByb3Zpc2lvbiAiZG9ja2VyIiBkbyB8ZHwKKyAgIyAgZC5idWlsZF9pbWFnZSAiL3ZhZ3JhbnQvY2VudG9zIiwgYXJnczogIi10IHRocmlmdC1jZW50b3MiCisgICNlbmQKKworZW5kCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDE5OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBDZW50T1MKKyMKKyMgS25vd24gbWlzc2luZyBjbGllbnQgbGlicmFyaWVzOgorIyAgLSBkb3RuZXQgKHdpbGwgdXBkYXRlIHRvIDIuMC4wIHNlcGFyYXRlbHkpCisjICAtIGhheGUgKG5vdCBpbiBjZW50b3MpCisKK0ZST00gY2VudG9zOjcuMy4xNjExCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworUlVOIHl1bSBpbnN0YWxsIC15IGVwZWwtcmVsZWFzZQorCisjIEdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYXV0b2NvbmYgXAorICAgICAgYmlzb24gXAorICAgICAgYmlzb24tZGV2ZWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY2xhbmctYW5hbHl6ZXIgXAorICAgICAgY21ha2UzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZmxleCBcCisgICAgICBnY2MgXAorICAgICAgZ2NjLWMrKyBcCisgICAgICBnZGIgXAorICAgICAgZ2l0IFwKKyAgICAgIGxpYnRvb2wgXAorICAgICAgbTQgXAorICAgICAgbWFrZSBcCisgICAgICB0YXIgXAorICAgICAgdW56aXAgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgd2dldCAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jbWFrZTMgL3Vzci9iaW4vY21ha2UgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY3BhY2szIC91c3IvYmluL2NwYWNrICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2N0ZXN0MyAvdXNyL2Jpbi9jdGVzdAorCisjIEMrKyBkZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBib29zdC1kZXZlbC1zdGF0aWMgXAorICAgICAgemxpYi1kZXZlbCBcCisgICAgICBvcGVuc3NsLWRldmVsIFwKKyAgICAgIGxpYmV2ZW50LWRldmVsICYmIFwKKyAgICBjZCAvdXNyL2xpYjY0ICYmIFwKKyAgICBsbiAtcyBsaWJib29zdF90aHJlYWQtbXQuYSBsaWJib29zdF90aHJlYWQuYQorCisjIEMjIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG1vbm8tY29yZSBcCisgICAgICBtb25vLWRldmVsIFwKKyAgICAgIG1vbm8td2ViLWRldmVsIFwKKyAgICAgIG1vbm8tZXh0cmFzCisKKyMgRCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvMi4wNzYuMC9kbWQtMi4wNzYuMC0wLmZlZG9yYS54ODZfNjQucnBtIHhkZy11dGlscworUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciBvcGVuc3NsLW1hc3RlcgorCisjIERhcnQKK1JVTiBjZCAvdXNyL2xvY2FsICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kYXJ0LWFyY2hpdmUvY2hhbm5lbHMvc3RhYmxlL3JlbGVhc2UvMS4yNC4yL3Nkay9kYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcCAmJiBcCisgICAgdW56aXAgLXEgZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAgJiYgXAorICAgIHJtIGRhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwCitFTlYgUEFUSCAvdXNyL2xvY2FsL2RhcnQtc2RrL2JpbjokUEFUSAorCisjIEVybGFuZyBEZXBlbmRlbmNpZXMKK1JVTiBjdXJsIC1zU0wgaHR0cDovL3BhY2thZ2VzLmVybGFuZy1zb2x1dGlvbnMuY29tL3JwbS9jZW50b3MvZXJsYW5nX3NvbHV0aW9ucy5yZXBvIC1vIC9ldGMveXVtLnJlcG9zLmQvZXJsYW5nX3NvbHV0aW9ucy5yZXBvICYmIFwKKyAgICB5dW0gaW5zdGFsbCAteSBcCisgICAgICBlcmxhbmcta2VybmVsIFwKKyAgICAgIGVybGFuZy1lcnRzIFwKKyAgICAgIGVybGFuZy1zdGRsaWIgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1yZWJhciBcCisgICAgICBlcmxhbmctdG9vbHMKKworIyBHTGliQyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBnbGliMi1kZXZlbAorCisjIEdvIERlcGVuZGVuY2llcworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS45LmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xvY2FsLyAteHoKK0VOViBQQVRIIC91c3IvbG9jYWwvZ28vYmluOiRQQVRICisKKyMgSGFza2VsbCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gLXkgaW5zdGFsbCBoYXNrZWxsLXBsYXRmb3JtCisKKyMgSGF4ZSBEZXBlbmRlbmNpZXMKKyMgTm90IGluIGRlYmlhbi9zdHJldGNoCisKKyMgSmF2YSBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBhbnQgXAorICAgICAganVuaXQgXAorICAgICAgYW50LWp1bml0IFwKKyAgICAgIGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAorCisjIEx1YSBEZXBlbmRlbmNpZXMKKyMgTHVhIGluIGVwZWwgaXMgdG9vIG9sZCAoNS4xLjQsIG5lZWQgNS4yKSBzbyB3ZSBnZXQgdGhlIGxhdGVzdAorUlVOIHl1bSBpbnN0YWxsIC15IHJlYWRsaW5lLWRldmVsICYmIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly93d3cubHVhLm9yZy9mdHAvbHVhLTUuMy40LnRhci5neiAmJiBcCisgICAgdGFyIHh6ZiBsdWEtNS4zLjQudGFyLmd6ICYmIFwKKyAgICBjZCBsdWEtNS4zLjQgJiYgXAorICAgIHNlZCAtaSAncy9DRkxBR1M9IC9DRkxBR1M9IC1mUElDIC9nJyBzcmMvTWFrZWZpbGUgJiYgXAorICAgIG1ha2UgbGludXggJiYgXAorICAgIG1ha2UgaW5zdGFsbCAmJiBcCisgICAgY2QgLi4gJiYgXAorICAgIHJtIC1yZiBsdWEtNSoKKworIyBNaW5HVyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKKyAgICAgIG1pbmd3MzItY3J0IFwKKyAgICAgIG1pbmd3MzItbnNpcworCisjIE5vZGUuanMgRGVwZW5kZW5jaWVzCisjIFdvcmsgYXJvdW5kIGVwZWwgaXNzdWUgd2hlcmUgdGhleSByZW1vdmVkIGh0dHAtcGFyc2VyIHRoYXQgbm9kZWpzIGRlcGVuZHMgb24hCitSVU4geXVtIC15IGluc3RhbGwgaHR0cHM6Ly9vcGVuc291cmNlLmVuZGEuZXUvcGFja2FnZXMvaHR0cC1wYXJzZXItMi43LjEtMy5lbDcueDg2XzY0LnJwbQorUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG5vZGVqcyBcCisgICAgICBucG0KKworIyBPY2FtbCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBvY2FtbCBcCisgICAgICBvY2FtbC1vY2FtbGRvYyAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3Jhdy5naXRodWIuY29tL29jYW1sL29wYW0vbWFzdGVyL3NoZWxsL29wYW1faW5zdGFsbGVyLnNoIC1PIC0gfCBzaCAtcyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMgJiYgXAorICAgIGVjaG8gJy4gL3Jvb3QvLm9wYW0vb3BhbS1pbml0L2luaXQuc2ggPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIHx8IHRydWUnID4+IH4vLmJhc2hyYworCisjIFBlcmwgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcGVybCBcCisgICAgICBwZXJsLXZlcnNpb24gXAorICAgICAgcGVybC1CaXQtVmVjdG9yIFwKKyAgICAgIHBlcmwtQ2xhc3MtQWNjZXNzb3IgXAorICAgICAgcGVybC1FeHRVdGlscy1NYWtlTWFrZXIgXAorICAgICAgcGVybC1UZXN0LVNpbXBsZSBcCisgICAgICBwZXJsLUlPLVNvY2tldC1TU0wgXAorICAgICAgcGVybC1OZXQtU1NMZWF5IFwKKyAgICAgIHBlcmwtQ3J5cHQtU1NMZWF5CisKKyMgUEhQIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtZGV2ZWwgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHAtcGhwdW5pdC1QSFBVbml0IFwKKyAgICAgIGJ6aXAyCisKKyMgUHl0aG9uIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHB5dGhvbiBcCisgICAgICBweXRob24tZGV2ZWwgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24zNCBcCisgICAgICBweXRob24zNC1kZXZlbCBcCisgICAgICBweXRob24zNC1waXAgXAorICAgICAgcHl0aG9uMzQtc2V0dXB0b29scworUlVOIHBpcDIgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwCitSVU4gcGlwMiBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyBzZXR1cHRvb2xzIHNpeCB0b3JuYWRvIHRvcm5hZG8tdGVzdGluZyB0d2lzdGVkIHZpcnR1YWxlbnYgem9wZS1pbnRlcmZhY2UKK1JVTiBwaXAzIGluc3RhbGwgLS11cGdyYWRlIHBpcAorUlVOIHBpcDMgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcGFkZHJlc3Mgc2V0dXB0b29scyBzaXggdG9ybmFkbyB0b3JuYWRvLXRlc3RpbmcgdHdpc3RlZCB2aXJ0dWFsZW52IHpvcGUtaW50ZXJmYWNlCisKKyMgUnVieSBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2ZWwgXAorICAgICAgcnVieWdlbXMgJiYgXAorICAgIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQorCisjIFJ1c3QKK1JVTiBjdXJsIGh0dHBzOi8vc2gucnVzdHVwLnJzIC1zU2YgfCBzaCAtcyAtLSAteSAtLWRlZmF1bHQtdG9vbGNoYWluIDEuMTcuMAorRU5WIFBBVEggL3Jvb3QvLmNhcmdvL2JpbjokUEFUSAorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC90bXAvKiAmJiBcCisgICAgeXVtIGNsZWFuIGFsbAorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjNzRmYwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjA0IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIERlYmlhbgorIworIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6CisjICAtIGRvdG5ldGNvcmUKKyMgIC0gcnVzdAorCitGUk9NIGJ1aWxkcGFjay1kZXBzOmplc3NpZS1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMgQWRkIGFwdCBzb3VyY2VzCisjIGplc3NpZS1iYWNrcG9ydHMgZm9yIGNtYWtlIGFuZCBzb21lIHJ1YnkgYml0cworUlVOIGVjaG8gImRlYiBodHRwOi8vZnRwLmRlYmlhbi5vcmcvZGViaWFuIGplc3NpZS1iYWNrcG9ydHMgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9qZXNzaWUtYmFja3BvcnRzLmxpc3QKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgcGtnLWNvbmZpZyAmJiBcCisgICAgYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgY21ha2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXBpcAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IC10IGplc3NpZS1iYWNrcG9ydHMgaW5zdGFsbCAteSBydWJ5LWJ1bmRsZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNSBcCisgICAgICBwaHA1LWRldiBcCisgICAgICBwaHA1LWNsaSBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbCBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiBcCisgICAgICBsaWJuZWtvMAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMgXAorICAgICAgbm9kZWpzLWRldiBcCisgICAgICBub2RlanMtbGVnYWN5IFwKKyAgICAgIG5wbQorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIENTaGFycCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICB4ZGctdXRpbHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYgXAorYCMgTWluR1cgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtaW5ndzMyIFwKKyAgICAgIG1pbmd3MzItYmludXRpbHMgXAorYCMgICAgICBtaW5ndzMyLXJ1bnRpbWVgIFwKKyAgICAgIG5zaXMgXAorYCMgQ2xlYW4gdXBgIFwKKyAgICAmJiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCisjIFJ1YnkKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKKyMgUHl0aG9uIG9wdGlvbmFsIGRlcGVuZGVuY2llcworUlVOIHBpcDIgaW5zdGFsbCAtVSBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCitSVU4gcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworCisjIEdvCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjQuMy5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6CitFTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAorCisjIEhheGUKK1JVTiBta2RpciAtcCAvdXNyL2xpYi9oYXhlICYmIFwKKyAgICB3Z2V0IC1PIC0gaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvcmVsZWFzZXMvZG93bmxvYWQvMy4yLjEvaGF4ZS0zLjIuMS1saW51eDY0LnRhci5neiB8IFwKKyAgICB0YXIgLUMgL3Vzci9saWIvaGF4ZSAtLXN0cmlwLWNvbXBvbmVudHM9MSAteHogJiYgXAorICAgIGxuIC1zIC91c3IvbGliL2hheGUvaGF4ZSAvdXNyL2Jpbi9oYXhlICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGVsaWIgL3Vzci9iaW4vaGF4ZWxpYiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9saWIvaGF4ZS9saWIgICYmIFwKKyAgICBjaG1vZCAtUiA3NzcgL3Vzci9saWIvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgL3Vzci9saWIvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCBoeGNwcAorCisjIEQKK1JVTiBjdXJsIC1zU0wgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDcwLjAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgLW8gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgZHBrZyAtaSAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBybSAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgb3BlbnNzbC1tYXN0ZXIgJiYgXAorICAgIGVjaG8gJ2djYyAtV2wsLS1uby1hcy1uZWVkZWQgJConID4gL3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCAmJiBcCisgICAgY2htb2QgNzU1IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGVjaG8gJ0NDPS91c3IvbG9jYWwvYmluL2djYy1kbWQnID4+IC9ldGMvZG1kLmNvbmYKKworIyBEYXJ0CitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCisjIE9DYW1sCitSVU4gZWNobyAnZGViIGh0dHA6Ly9wcGEubGF1bmNocGFkLm5ldC9hdnNtL3BwYS91YnVudHUgdHJ1c3R5IG1haW4nID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvYXZzbS1vZmZpY2lhbC1vY2FtbC5saXN0ICYmIFwKKyAgICBncGcgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2IDYxNzA3QjA5ICYmIFwKKyAgICBncGcgLS1leHBvcnQgLS1hcm1vciA2MTcwN0IwOSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgb2NhbWwgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0ICYmIFwKKyAgICBvcGFtIGluc3RhbGwgb2FzaXMKKworIyBGb3JjZSB1dGY4IGxvY2FsZSB0byBzdWNjZXNzZnVsbHkgYnVpbGQgSGFza2VsbCB0Zi1yYW5kb20KK0VOViBMQ19BTEwgQy5VVEYtOAorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDNlZWNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjMxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIERlYmlhbiBTdHJldGNoCisjCisjIEtub3duIGlzc3VlczoKKyMgLSBkOiBkZWltb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGRpc2FibGVkIC0gYnVpbGQgZXJyb3JzCisjIC0gZG90bmV0Y29yZSwgYmVjYXVzZSBuZXRjb3JlIGlzIGZvciAxLjAuMC1wcmV2aWV3IGFuZCAyLjAuMCBpcyBvdXQKKyMgLSBydXN0OiBjYXJnbyBub3QgaW4gZGViaWFuIHJlcG8gLSBwZXJoYXBzIG5vdCBuZWVkZWQ/CisKK0ZST00gYnVpbGRwYWNrLWRlcHM6c3RyZXRjaC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgYXB0IGFwdC10cmFuc3BvcnQtaHR0cHMgY3VybCB3Z2V0IGFwdC11dGlscworCisjIEQKK1JVTiB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZworCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAmJiBcCisgICAgc2VkIC1pIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgLWUgJ3MvaHR0cHM6L2h0dHA6L2cnCisKKyMgZG90bmV0IChjb3JlKSAyLjAuMCAtIHByb2plY3QgaXNuJ3QgcmVhZHkgZm9yIHRoaXMgeWV0OgorIyBSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisjICAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LXhlbmlhbC1wcm9kIHhlbmlhbCBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgbm9kZS5qcyAodGhpcyBzdGVwIHJ1bnMgYXB0LWdldCB1cGRhdGUgaW50ZXJuYWxseSkKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9zZXR1cF84LnggfCBiYXNoCisKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCisKKworIyMjIGxhbmd1YWdlcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW4gXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCisjIGxpYmV2ZW50IGRlaW1vcyBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyBSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorIyAgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisjICAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyMgICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKKyMgb3BlbnNzbCBkZWltb3MgZG9lc24ndCB3b3JrIHdpdGggb3BlbnNzbC0xLjEuMCAtIGRpc2FibGluZyBpdCBmb3Igbm93OgorIyBSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyMgICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0CitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCisjIHByb2plY3QgaXNuJ3QgcmVhZHkgZm9yIHRoaXMgcXVpdGUgeWV0OgorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIGRvdG5ldC1zZGstMi4wLjAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZ29sYW5nIChnbykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnb2xhbmctZ28KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2CitSVU4gaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBzYW1lIGZvciBkZWJpYW4gc3RyZXRjaAorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMgc28gc3RpY2sgd2l0aCA1LjIgaGVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA3LjAgXAorICAgICAgcGhwNy4wLWNsaSBcCisgICAgICBwaHA3LjAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwdW5pdAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1c3RjCisKKyMgVXBkYXRlIGFueXRoaW5nIGVsc2UgbGVmdCBoYW5naW5nCitSVU4gYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNDQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IFRydXN0eQorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IFRydXN0eSBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBkOiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMi4wNzAuMAorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIwLjEKKyMgLSBkb3RuZXRjb3JlLCBkaXNhYmxlZCBiZWNhdXNlIG5ldGNvcmUgaXMgZm9yIDEuMC4wLXByZXZpZXcgYW5kIDIuMC4wIGlzIG91dAorIyAtIGhheGUsIGRpc2FibGVkIGJlY2F1c2UgdGhlIGRpc3RybyBjb21lcyB3aXRoIDMuMC4wIGFuZCBpdCBjb3JlcyB3aGlsZSBpbnN0YWxsaW5nCisjIC0gbm9kZS5qcywgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyBhdCAwLjEwLjAgaW4gdGhlIGRpc3RybyB3aGljaCBpcyB0b28gb2xkIChuZWVkIDQrKQorIyAtIG9jYW1sLCBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp0cnVzdHktc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIEQKK1JVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBFQkNGOTc1RTVCQTI0RDVFICYmIFwKKyAgICAgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgICAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0yLjA3MC4yLTAgXAorICAgICAgbGlicGhvYm9zMi1kZXY9Mi4wNzAuMi0wIFwKKyAgICAgIGR1YiBcCisgICAgICBkZm10IFwKKyAgICAgIGRzY2FubmVyIFwKKyAgICAgIHhkZy11dGlscworUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0xLjIwLjEtMQorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgaGF4ZSBcCisjICAgICAgIG5la28gXAorIyAgICAgICBuZWtvLWRldiAmJiBcCisjICAgICBoYXhlbGliIHNldHVwIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorIyAgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwIDMuMi4xMDIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4xIFwKKyAgICAgIGx1YTUuMS1kZXYKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIHRvbyBvbGQKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG5vZGVqcyBcCisjICAgICAgIG5wbQorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdG8gaW5zdGFsbCBwcm9wZXJseQorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA1IFwKKyAgICAgIHBocDUtY2xpIFwKKyAgICAgIHBocDUtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgJiYgXAorICAgICAgd2dldCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9pbnN0YWxsZXIgLU8gLSAtcSB8IHBocCAtLSAtLXF1aWV0IC0taW5zdGFsbC1kaXI9L3Vzci9sb2NhbC9iaW4vIC0tZmlsZW5hbWU9Y29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbyAmJiBcCisgICAgcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworIyBpbnN0YWxsaW5nIHRvcm5hZG8gYnkgcGlwL3BpcDMgaW5zdGVhZCBvZiBkZWJpYW4gcGFja2FnZQorIyBpZiB3ZSBpbnN0YWxsIHRoZSBkZWJpYW4gcGFja2FnZSwgdGhlIGJ1aWxkIGZhaWxzIGluIHB5MgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4CisKKyMgSW5zdGFsbCBCb3VuY3lDYXN0bGUgcHJvdmlkZXIgdG8gZml4IEphdmEgYnVpbGRzIGlzc3VlcyB3aXRoIEpESyA3CisjIEJ1aWxkcyBhY2Nlc3NpbmcgcmVwb3RlIHJlcG9zaXRvcmllcyBmYWlsIGFzIHNlZW4gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3RyYXZpcy1jaS90cmF2aXMtY2kvaXNzdWVzLzg1MDMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQm91bmN5Q2FzdGxlIEpDRSBQcm92aWRlciBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJjcHJvdi1qYXZhICYmIFwKKyAgICBsbiAtcyAvdXNyL3NoYXJlL2phdmEvYmNwcm92LmphciAvdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQvanJlL2xpYi9leHQvYmNwcm92LmphciAmJiBcCisgICAgYXdrIC1GIC4gLXYgT0ZTPS4gJ0JFR0lOe249Mn0vXnNlY3VyaXR5XC5wcm92aWRlci8ge3NwbGl0KCQzLCBwb3NBbmRFcXVhbHMsICI9Iik7JDM9bisrIj0icG9zQW5kRXF1YWxzWzJdO3ByaW50O25leHR9IDEnIC9ldGMvamF2YS03LW9wZW5qZGsvc2VjdXJpdHkvamF2YS5zZWN1cml0eSA+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIGVjaG8gInNlY3VyaXR5LnByb3ZpZGVyLjE9b3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQm91bmN5Q2FzdGxlUHJvdmlkZXIiID4+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIG12IC90bXAvamF2YS5zZWN1cml0eSAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2ggYi9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOGNiYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKQEAgLTAsMCArMSw4MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSBidWlsZCBoYXMgdHdvIHN0YWdlczogImRvY2tlciIgYW5kICJ0ZXN0IgorIyBUaGUgImRvY2tlciIgc3RhZ2UgaXMgbWVhbnQgdG8gcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlcworIyAgIGlmIG5lZWRlZC4gIElmIHdlIGNhbm5vdCBwdXNoIHRoYXQgcmVzdWx0IGhvd2V2ZXIgdGhlbgorIyAgIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZy4KKyMgVGhlICJ0ZXN0IiBzdGFnZSBpcyBhbiBhY3R1YWwgdGVzdCBqb2IuICBFdmVuIGlmIHRoZSBkb2NrZXIKKyMgICBpbWFnZSBkb2Vzbid0IG1hdGNoIHdoYXQncyBpbiB0aGUgcmVwbywgd2Ugc3RpbGwgYnVpbGQKKyMgICB0aGUgaW1hZ2Ugc28gdGhlIGJ1aWxkIGpvYiBjYW4gcnVuIHByb3Blcmx5LgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitmdW5jdGlvbiBkb2NrZXJmaWxlX2NoYW5nZWQgeworICAjIGltYWdlIG1heSBub3QgZXhpc3QgeWV0LCBzbyB3ZSBoYXZlIHRvIGxldCBpdCBmYWlsIHNpbGVudGx5OgorICBkb2NrZXIgcHVsbCAkRE9DS0VSX1RBRyB8fCB0cnVlCisgIGRvY2tlciBydW4gJERPQ0tFUl9UQUcgYmFzaCAtYyAnY2QgLi4gJiYgc2hhNTEyc3VtIERvY2tlcmZpbGUnID4gLkRvY2tlcmZpbGUuc2hhNTEyCisgIHNoYTUxMnN1bSAtYyAuRG9ja2VyZmlsZS5zaGE1MTIKK30KKworIworIyBJZiB0aGlzIGJ1aWxkIGhhcyBubyBET0NLRVJfUEFTUyBhbmQgaXQgaXMgaW4gdGhlIGRvY2tlciBzdGFnZQorIyB0aGVuIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGRvIGFueSBwcm9jZXNzaW5nIGJlY2F1c2Ugd2UgY2Fubm90CisjIHB1c2ggdGhlIHJlc3VsdCBpZiB0aGUgRG9ja2VyZmlsZSBjaGFuZ2VkLiAgCisjCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAteiAiJERPQ0tFUl9QQVNTIiBdXTsgdGhlbgorICBlY2hvIERldGVjdGVkIGRvY2tlciBzdGFnZSBidWlsZCBhbmQgbm8gZGVmaW5lZCBET0NLRVJfUEFTUywgdGhpcyBidWlsZCBqb2Igd2lsbCBiZSBza2lwcGVkLgorICBlY2hvIFN1YnNlcXVlbnQgam9icyBpbiB0aGUgdGVzdCBzdGFnZSBtYXkgZWFjaCByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UuCisgIGV4aXQgMAorZmkKKworCitwdXNoZCAke1NDUklQVF9ESVJ9LyRESVNUUk8KK2lmIGRvY2tlcmZpbGVfY2hhbmdlZDsgdGhlbgorICBlY2hvIERvY2tlcmZpbGUgaGFzIG5vdCBjaGFuZ2VkLiAgTm8gbmVlZCB0byByZWJ1aWxkLgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkLgorZmkKK3BvcGQKKworIworIyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkIC0gcmVidWlsZCBpdCBmb3IgdGhlIGN1cnJlbnQgYnVpbGQgam9iLgorIyBJZiBpdCBpcyBhICJkb2NrZXIiIHN0YWdlIGJ1aWxkIHRoZW4gd2Ugd2FudCB0byBwdXNoIGl0IGJhY2sKKyMgdG8gdGhlIERPQ0tFUl9SRVBPLiAgSWYgaXQgaXMgYSAidGVzdCIgc3RhZ2UgYnVpbGQgdGhlbiB3ZSBkbworIyBub3QuICBJZiBub2JvZHkgZGVmaW5lZCBhIERPQ0tFUl9QQVNTIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIuCisjCisKK2VjaG8gUmVidWlsZGluZyBkb2NrZXIgaW1hZ2UgJERJU1RSTworZG9ja2VyIGJ1aWxkIC0tdGFnICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci8kRElTVFJPCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1VTRVIiIF1dICYmIFtbICEgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4gCisgIGVjaG8gUHVzaGluZyBkb2NrZXIgaW1hZ2UgJERPQ0tFUl9UQUcKKyAgZG9ja2VyIGxvZ2luIC11ICRET0NLRVJfVVNFUiAtcCAkRE9DS0VSX1BBU1MKKyAgZG9ja2VyIHB1c2ggJERPQ0tFUl9UQUcKK2Vsc2UKKyAgZWNobyBOb3QgcHVzaGluZyBkb2NrZXIgaW1hZ2U6IGVpdGhlciBub3QgYSBkb2NrZXIgc3RhZ2UgYnVpbGQgam9iLCBvciBvbmUgb2YgRE9DS0VSX1VTRVIgb3IgRE9DS0VSX1BBU1MgaXMgdW5kZWZpbmVkLgorZmkKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3J1bi5zaCBiL2J1aWxkL2RvY2tlci9ydW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZlMTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9ydW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitwcmludGVudiB8IHNvcnQKKworZG9ja2VyIHJ1biAtLW5ldD1ob3N0IC1lIEJVSUxEX0xJQlM9IiRCVUlMRF9MSUJTIiAkQlVJTERfRU5WIC12ICQocHdkKTovdGhyaWZ0L3NyYyBcCisJLWl0ICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci9zY3JpcHRzLyRTQ1JJUFQgJEJVSUxEX0FSRworCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODM4OGY3MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaApAQCAtMCwwICsxLDYgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgJCoKK21ha2UgY2hlY2sgLWozCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjYzMxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworQ01BS0VfRkxBR1M9JCoKK01BS0VQUk9HPW1ha2UKKworaWYgbmluamEgLS12ZXJzaW9uICA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgTUFLRVBST0c9bmluamEKKyAgQ01BS0VfRkxBR1M9Ii1HTmluamEgJENNQUtFX0ZMQUdTIgorZmkKKworbWtkaXIgLXAgY21ha2VfYnVpbGQgJiYgY2QgY21ha2VfYnVpbGQKK2NtYWtlICRDTUFLRV9GTEFHUyAuLgorZm9yIExJQiBpbiAkQlVJTERfTElCUzsgZG8KKyAgaWYgISBncmVwICJeQlVJTERfJHtMSUJ9OkJPT0w9T04kIiBDTWFrZUNhY2hlLnR4dCA7IHRoZW4KKyAgICBlY2hvICJmYWlsZWQgdG8gY29uZmlndXJlICRMSUIiCisgICAgZXhpdCAxCisgIGZpCitkb25lCiskTUFLRVBST0cgLWozCitjcGFjaworY3Rlc3QgLVZWIC1FICIocHl0aG9uX3Rlc3QpIgorIyBkaXNhYmxlZCBjbWFrZSBweXRob25fdGVzdCBmb3Igbm93IHNpbmNlIGl0IGZhaWxzIGluIHRyYXZpcyB1bmRlciBjZW50b3MKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiM2YyODMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgQ292ZXJpdHkgU2NhbiBUcmF2aXMgYnVpbGQgc2NyaXB0CisjIFRvIHJ1biB0aGlzIGludGVyYWN0aXZlbHksIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHlvdXJzZWxmLAorIyBhbmQgcnVuIHRoaXMgaW5zaWRlIGEgZG9ja2VyIGNvbnRhaW5lci4KKyMKKyMgQ29tbWFuZC1MaW5lIEFyZ3VtZW50cworIworIyAtLXNraXBkb3dubG9hZCAgIHRvIHNraXAgcmUtZG93bmxvYWRpbmcgdGhlIENvdmVyaXR5IFNjYW4gYnVpbGQgcGFja2FnZSAobGFyZ2UpCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlcyAocmVxdWlyZWQpCisjCisjIENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMICAtIGVtYWlsIGFkZHJlc3MgdG8gbm90aWZ5CisjIENPVkVSSVRZX1NDQU5fVE9LRU4gICAgICAgICAgICAgICAtIHRoZSBDb3Zlcml0eSBTY2FuIHRva2VuIChzaG91bGQgYmUgc2VjdXJlKQorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKGRlZmF1bHRlZCkKKyMKKyMgQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EICAgICAgIC0gZGVmYXVsdHMgdG8gImJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCIKKyMgQ09WRVJJVFlfU0NBTl9ERVNDUklQVElPTiAgICAgICAgIC0gZGVmYXVsdHMgdG8gVFJBVklTX0JSQU5DSCBvciAibWFzdGVyIiBpZiBlbXB0eQorIyBDT1ZFUklUWV9TQ0FOX1BST0pFQ1QgICAgICAgICAgICAgLSBkZWZhdWx0cyB0byAidGhyaWZ0IgorCitzZXQgLWV4CisKK0NPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORD0ke0NPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORDotYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNofQorQ09WRVJJVFlfU0NBTl9ERVNDUklQVElPTj0ke0NPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT046LSR7VFJBVklTX0JSQU5DSDotbWFzdGVyfX0KK0NPVkVSSVRZX1NDQU5fUFJPSkVDVD0ke0NPVkVSSVRZX1NDQU5fUFJPSkVDVDotdGhyaWZ0fQorCisjIGRvd25sb2FkIHRoZSBjb3Zlcml0eSBzY2FuIHBhY2thZ2UKKworcHVzaGQgL3RtcAoraWYgW1sgIiQxIiAhPSAiLS1za2lwZG93bmxvYWQiIF1dOyB0aGVuCisgIHJtIC1yZiBjb3Zlcml0eV90b29sLnRneiBjb3YtYW5hbHlzaXMqCisgIHdnZXQgaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9kb3dubG9hZC9saW51eDY0IC0tcG9zdC1kYXRhICJ0b2tlbj0kQ09WRVJJVFlfU0NBTl9UT0tFTiZwcm9qZWN0PSRDT1ZFUklUWV9TQ0FOX1BST0pFQ1QiIC1PIGNvdmVyaXR5X3Rvb2wudGd6CisgIHRhciB4emYgY292ZXJpdHlfdG9vbC50Z3oKK2ZpCitDT1ZCSU49JChlY2hvICQocHdkKS9jb3YtYW5hbHlzaXMqL2JpbikKK2V4cG9ydCBQQVRIPSRDT1ZCSU46JFBBVEgKK3BvcGQKKworIyBidWlsZCB0aGUgcHJvamVjdCB3aXRoIGNvdmVyaXR5IHNjYW4KKworcm0gLXJmIGNvdi1pbnQvCitjb3YtYnVpbGQgLS1kaXIgY292LWludCAkQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5ECit0YXIgY0pmIGNvdi1pbnQudGFyLnh6IGNvdi1pbnQvCitjdXJsIC0tZm9ybSB0b2tlbj0iJENPVkVSSVRZX1NDQU5fVE9LRU4iIFwKKyAgICAgLS1mb3JtIGVtYWlsPSIkQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwiIFwKKyAgICAgLS1mb3JtIGZpbGU9QGNvdi1pbnQudGFyLnh6IFwKKyAgICAgLS1mb3JtIHZlcnNpb249IiQoZ2l0IGRlc2NyaWJlIC0tdGFncykiIFwKKyAgICAgLS1mb3JtIGRlc2NyaXB0aW9uPSIkQ09WRVJJVFlfU0NBTl9ERVNDUklQVElPTiIgXAorICAgICBodHRwczovL3NjYW4uY292ZXJpdHkuY29tL2J1aWxkcz9wcm9qZWN0PSIkQ09WRVJJVFlfU0NBTl9QUk9KRUNUIgorCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzU4MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlIC0tZW5hYmxlLXR1dG9yaWFsPW5vCittYWtlIC1qMyBwcmVjcm9zcworCitzZXQgK2UKK21ha2UgY3Jvc3MkMQorCitSRVQ9JD8KK2lmIFsgJFJFVCAtbmUgMCBdOyB0aGVuCisgIGNhdCB0ZXN0L2xvZy91bmV4cGVjdGVkX2ZhaWx1cmVzLmxvZworZmkKKworZXhpdCAkUkVUCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9kcGtnLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYmEwY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaApAQCAtMCwwICsxLDUgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCitkcGtnLWJ1aWxkcGFja2FnZSAtdGMgLXVzIC11YworbHMgLWFsIC4uCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWEzNjgxZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL21ha2UtZGlzdC5zaApAQCAtMCwwICsxLDkgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgJCoKK21ha2UgZGlzdAordGFyIHh2ZiB0aHJpZnQtKi50YXIuZ3oKK2NkIHRocmlmdC0qCisuL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTZkNTgyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaApAQCAtMCwwICsxLDY2IEBACisjIS9iaW4vYmFzaAorc2V0IC1ldgorCisjCisjIEdlbmVyYXRlIHRocmlmdCBmaWxlcyBzbyB0aGUgc3RhdGljIGNvZGUgYW5hbHlzaXMgaW5jbHVkZXMgYW4gYW5hbHlzaXMKKyMgb2YgdGhlIGZpbGVzIHRoZSB0aHJpZnQgY29tcGlsZXIgc3BpdHMgb3V0LiAgSWYgcnVubmluZyBpbnRlcmFjdGl2ZWx5CisjIHNldCB0aGUgTk9CVUlMRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBza2lwIHRoZSBib290L2NvbmZpZy9tYWtlIHBoYXNlLgorIworCitpZiBbWyAteiAiJE5PQlVJTEQiIF1dOyB0aGVuCisgIC4vYm9vdHN0cmFwLnNoCisgIC4vY29uZmlndXJlIC0tZW5hYmxlLXR1dG9yaWFsPW5vCisgIG1ha2UgLWozIHByZWNyb3NzCitmaQorCisjCisjIEMvQysrIHN0YXRpYyBjb2RlIGFuYWx5c2lzIHdpdGggY3BwY2hlY2sKKyMgYWRkIC0tZXJyb3ItZXhpdGNvZGU9MSB0byAtLWVuYWJsZT1hbGwgYXMgc29vbiBhcyBldmVyeXRoaW5nIGlzIGZpeGVkCisjCisjIFB5dGhvbiBjb2RlIHN0eWxlIGNoZWNrIHdpdGggZmxha2U4CisjCisjIHNlYXJjaCBmb3IgVE9ETyBldGMgd2l0aGluIHNvdXJjZSB0cmVlCisjIHNvbWUgc3RhdGlzdGljcyBhYm91dCB0aGUgY29kZSBiYXNlCisjIHNvbWUgaW5mbyBhYm91dCB0aGUgYnVpbGQgbWFjaGluZQorCisjIENvbXBpbGVyIGNwcGNoZWNrIChBbGwpCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBjb21waWxlci9jcHAvc3JjCisKKyMgQysrIGNwcGNoZWNrIChBbGwpCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCisKKyMgQyBHbGliIGNwcGNoZWNrIChBbGwpCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBsaWIvY19nbGliL3NyYyBsaWIvY19nbGliL3Rlc3QgdGVzdC9jX2dsaWIvc3JjIHR1dG9yaWFsL2NfZ2xpYgorCisjIFNpbGVudCBlcnJvciBjaGVja3MKKyMgU2VlIFRIUklGVC00MzcxIDogZmxleCBnZW5lcmF0ZWQgY29kZSB0cmlnZ2VycyAicG9zc2libGUgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIiBpbiB5eV9pbml0X2J1ZmZlcgorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tc3VwcHJlc3M9Iio6dGhyaWZ0L3RocmlmdGwuY2MiIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgY29tcGlsZXIvY3BwL3NyYworY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKKworIyBQeXRob24gY29kZSBzdHlsZQorZmxha2U4IC0taWdub3JlPVc1MDQsRTUwMSBsaWIvcHkKK2ZsYWtlOCAtLWV4Y2x1ZGU9dHV0b3JpYWwvcHkvYnVpbGQgdHV0b3JpYWwvcHkKKyMgVEhSSUZULTQzNzEgOiBnZW5lcmF0ZWQgZmlsZXMgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgdGhleSBoYXZlbid0IGJlZW4gc2NydWJiZWQgeWV0CitmbGFrZTggLS1pZ25vcmU9RTUwMSAtLWV4Y2x1ZGU9IiovZ2VuLXB5Ki8qIix0ZXN0L3B5L2J1aWxkIHRlc3QvcHkKK2ZsYWtlOCB0ZXN0L3B5LnR3aXN0ZWQKK2ZsYWtlOCB0ZXN0L3B5LnRvcm5hZG8KK2ZsYWtlOCAtLWlnbm9yZT1FNTAxIHRlc3QvdGVzdC5weQorZmxha2U4IC0taWdub3JlPUU1MDEsRTcyMiB0ZXN0L2Nyb3NzcnVubmVyCitmbGFrZTggdGVzdC9mZWF0dXJlcworCisjIFBIUCBjb2RlIHN0eWxlCitjb21wb3NlciBpbnN0YWxsIC0tcXVpZXQKKy4vdmVuZG9yL2Jpbi9waHBjcworCisjIFRPRE8gZXRjCitlY2hvIEZJWE1FczogYGdyZXAgLXIgRklYTUUgKiB8IHdjIC1sYAorZWNobyAgSEFDS3M6IGBncmVwIC1yIEhBQ0sgKiB8IHdjIC1sYAorZWNobyAgVE9ET3M6IGBncmVwIC1yIFRPRE8gKiB8IHdjIC1sYAorCisjIExvQworc2xvY2NvdW50IC4KKworIyBTeXN0ZW0gSW5mbworZHBrZyAtbAordW5hbWUgLWEKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjUwZGJhMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorCitzZXQgLWUKKworIyBXcmFwcyBhdXRvdG9vbHMuc2gsIGJ1dCBlYWNoIGJpbmFyeSBjcmFzaGVzIGlmIGl0IGV4aGliaXRzIHVuZGVmaW5lZCBiZWhhdmlvci4gCisjIFNldCB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yIGZsYWdzLiBUaGlzIGNyYXNoZXMgb24gYWxsIHVuZGVmaW5lZCBiZWhhdmlvciBleGNlcHQgZm9yCisjIHVuZGVmaW5lZCBjYXN0aW5nLCBha2EgInZwdHIiLgorIyBUT0RPOiBmaXggdW5kZWZpbmVkIHZwdHIgYmVoYXZpb3IgYW5kIHR1cm4gdGhpcyBvcHRpb24gYmFjayBvbi4KKworZXhwb3J0IENGTEFHUz0iLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1zYW5pdGl6ZS1yZWNvdmVyPXVuZGVmaW5lZCAtTzAgLWdnZGIzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgorZXhwb3J0IENYWEZMQUdTPSIke0NGTEFHU30iCitleHBvcnQgTERGTEFHUz0iLWx1YnNhbiIKK2V4cG9ydCBVQlNBTl9PUFRJT05TPXByaW50X3N0YWNrdHJhY2U9MQorCisjCisjIHdvcmsgYXJvdW5kIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzExNjMyIGlmIHByZXNlbnQKKyMKKworc2VkIC1pICdzLywgc3RyZWFtX3QocmRidWYoKSkgLywgc3RyZWFtX3QocGJhc2VfdHlwZTo6bWVtYmVyLmdldCgpKS9nJyAvdXNyL2luY2x1ZGUvYm9vc3QvZm9ybWF0L2FsdF9zc3RyZWFtLmhwcAorCisjIGxsdm0tc3ltYm9saXplciBtdXN0IGJlIG9uIFBBVEggdG8gZ2V0IGEgc3RhY2sgdHJhY2Ugb24gZXJyb3IKKworQ0xBTkdfUEFUSD0iJChta3RlbXAgLWQpIgordHJhcCAicm0gLXJmICR7Q0xBTkdfUEFUSH0iIEVYSVQKK2xuIC1zICIkKHdoZXJlaXMgbGx2bS1zeW1ib2xpemVyLTQuMCAgfCByZXYgfCBjdXQgLWQgJyAnIC1mIDEgfCByZXYpIiBcCisgICIke0NMQU5HX1BBVEh9L2xsdm0tc3ltYm9saXplciIKK2V4cG9ydCBQQVRIPSIke0NMQU5HX1BBVEh9OiR7UEFUSH0iCitsbHZtLXN5bWJvbGl6ZXIgLXZlcnNpb24KKworYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoICQqCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU4NGQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3MCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgQXJ0ZnVsCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgQXJ0ZnVsIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGNwcDogc3RvY2sgYm9vc3QgMS42MiBpbiBhcnRmdWwgaGFzIGEgbmFzdHkgYnVnIHNvIHdlIHVzZSBzdG9jayBib29zdCAxLjYzCisjIC0gZDogZG1kIGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1LiBQaW5uZWQgdG8gbGFzdCAxLnggcmVsZWFzZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGhheGU6IHZlcnNpb24gMy40LjIgdGhhdCBjb21lcyB3aXRoIFVidW50dSBjb3JlcyBpbiBvdXIgQ0kgYnVpbGQKKyMgLSBnbzogYXJ0ZnVsIGNvbWVzIHdpdGggMS45LCB3ZSB3YW50IHRoZSBsYXRlc3QgKHN1cHBvcnRlZCkKKyMgLSBub2RlanM6IHdhbnQgdjgsIGFydGZ1bCBjb21lcyB3aXRoIHY2CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6YXJ0ZnVsLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pIC0gaWYgd2UgZXZlciB3YW50IGEgbGF0ZXIgdmVyc2lvbgorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjI0LjMtMQorCisjIGRvdG5ldCAobmV0Y29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LWFydGZ1bC1wcm9kIGFydGZ1bCBtYWluIiA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgaGF4ZSAoaHR0cHM6Ly9oYXhlLm9yZy9kb3dubG9hZC9saW51eC8pCitSVU4gYWRkLWFwdC1yZXBvc2l0b3J5IHBwYTpoYXhlL3JlbGVhc2VzIC15CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV84LnggYXJ0ZnVsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKKyMgYm9vc3QtMS42MiBoYXMgYSB0ZXJyaWJsZSBidWcgaW4gYm9vc3Q6OnRlc3QsIHNlZSBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMjUwNworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdDEuNjMtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBTQkNMX1ZFUlNJT04gMS40LjUKK1JVTiBcCitgIyBDb21tb24gTGlzcCAoc2JjbCkgZGVwZW5kZW5jaWVzYCBcCisgICAgY3VybCAtLXZlcnNpb24gJiYgXAorICAgIGN1cmwgLU8gLUogLUwgaHR0cHM6Ly9rZW50LmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3NiY2wvc2JjbC8ke1NCQ0xfVkVSU0lPTn0vc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICB0YXIgeGpmIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgY2Qgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4ICYmIFwKKyAgICAuL2luc3RhbGwuc2ggJiYgXAorICAgIHNiY2wgLS12ZXJzaW9uICYmIFwKKyAgICBybSAtcmYgc2JjbCoKKworRU5WIERfVkVSU0lPTiAgICAgMi4wODAuMAorRU5WIERNRF9ERUIgICAgICAgZG1kXzIuMDgwLjAtMF9hbWQ2NC5kZWIKK1JVTiBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgIHdnZXQgLXEgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LyR7RF9WRVJTSU9OfS8ke0RNRF9ERUJ9ICYmIFwKKyAgICBkcGtnIC0taW5zdGFsbCAke0RNRF9ERUJ9ICYmIFwKKyAgICBybSAtZiAke0RNRF9ERUJ9ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjEuNAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjEwCitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBiNWE2NDMzNWYxNDkwMjc3YjU4NTgzMmQxZjZjN2Y4YzZjMTEyMDZjYmE1Y2QzZjc3MWRjYjg3Yjk4YWQxYTMzCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgICAgICAgICAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2ICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAyPiYxID4gL2Rldi9udWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIQorIyBuZWVkIHRvIHVwZGF0ZSBvdXIgbHVhc29ja2V0IGNvZGUsIGx1YSBkb2Vzbid0IGhhdmUgbHVhTF9vcGVubGliIGFueSBtb3JlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWNsaSBcCisgICAgICBwaHAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgJiYgXAorICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24zIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXBpcCBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzk5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjc5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBCaW9uaWMKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBCaW9uaWMgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gY2w6IHdhbnQgbGF0ZXN0CisjIC0gZDogZG1kIGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1LiBQaW5uZWQgdG8gbGFzdCAxLnggcmVsZWFzZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGdvOiB3YW50IGxhdGVzdAorIyAtIG5vZGVqczogd2FudCB2OCwgYmlvbmljIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczpiaW9uaWMtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjQuMy0xCisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIHdnZXQgLXEgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbWljcm9zb2Z0LXByb2QubGlzdCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vY29uZmlnL3VidW50dS8xOC4wNC9wcm9kLmxpc3QgJiYgXAorICAgIGNob3duIHJvb3Q6cm9vdCAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGNob3duIHJvb3Q6cm9vdCAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9taWNyb3NvZnQtcHJvZC5saXN0CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV84LnggYmlvbmljIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS02LjAvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBTQkNMX1ZFUlNJT04gMS40LjE1CitSVU4gXAorYCMgQ29tbW9uIExpc3AgKHNiY2wpIGRlcGVuZGVuY2llc2AgXAorICAgIGN1cmwgLS12ZXJzaW9uICYmIFwKKyAgICBjdXJsIC1vIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAtSiAtTCBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zYmNsL2ZpbGVzL3NiY2wvJHtTQkNMX1ZFUlNJT059L3NiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6Mi9kb3dubG9hZD91c2VfbWlycm9yPW1hbmFnZWR3YXkjICYmIFwKKyAgICB0YXIgeGpmIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgY2Qgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4ICYmIFwKKyAgICAuL2luc3RhbGwuc2ggJiYgXAorICAgIHNiY2wgLS12ZXJzaW9uICYmIFwKKyAgICBjZCAuLiAmJiBcCisgICAgcm0gLXJmIHNiY2wqCisKK0VOViBEX1ZFUlNJT04gICAgIDIuMDgzLjEKK0VOViBETURfREVCICAgICAgIGRtZF8yLjA4My4xLTBfYW1kNjQuZGViCitSVU4gXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8ke0RfVkVSU0lPTn0vJHtETURfREVCfSAmJiBcCisgICAgZHBrZyAtLWluc3RhbGwgJHtETURfREVCfSAmJiBcCisgICAgcm0gLWYgJHtETURfREVCfSAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGdpdCBjbG9uZSAtYiAndjIuMC4yKzIuMC4xNicgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50LmdpdCBkZWltb3MtbGliZXZlbnQtMi4wICYmIFwKKyAgICBtdiBkZWltb3MtbGliZXZlbnQtMi4wL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGRlaW1vcy1saWJldmVudC0yLjAvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgZGVpbW9zLWxpYmV2ZW50LTIuMCAmJiBcCisgICAgZ2l0IGNsb25lIC1iICd2Mi4wLjArMS4xLjBoJyBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC5naXQgZGVpbW9zLW9wZW5zc2wtMS4xLjBoICYmIFwKKyAgICBtdiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGRlaW1vcy1vcGVuc3NsLTEuMS4waAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGAjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjExLjQKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGZiMjZjMzBlNmEwNGFkOTM3YmJjNjU3YTFiNWJiYTkyZjgwMDk2YWYxZThlZTZkYTY0MzBjMDQ1YThkYjNhNWIKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICAgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgICAgICAgICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDI+JjEgPiAvZGV2L251bGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuICYmIFwKKyAgICB1cGRhdGUtYWx0ZXJuYXRpdmVzIC0tc2V0IGphdmEgL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0L2pyZS9iaW4vamF2YQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIQorIyBuZWVkIHRvIHVwZGF0ZSBvdXIgbHVhc29ja2V0IGNvZGUsIGx1YSBkb2Vzbid0IGhhdmUgbHVhTF9vcGVubGliIGFueSBtb3JlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWNsaSBcCisgICAgICBwaHAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgJiYgXAorICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24zIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXBpcCBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworIyBTd2lmdCBvbiBMaW51eCBmb3IgY3Jvc3MgdGVzdHMKK1JVTiBjZCAvICYmIFwKKyAgICB3Z2V0IC0tcXVpZXQgaHR0cHM6Ly9zd2lmdC5vcmcvYnVpbGRzL3N3aWZ0LTQuMi4xLXJlbGVhc2UvdWJ1bnR1MTgwNC9zd2lmdC00LjIuMS1SRUxFQVNFL3N3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6ICYmIFwKKyAgICB0YXIgeGYgc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogLS1zdHJpcC1jb21wb25lbnRzPTEgJiYgXAorICAgIHJtIHN3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6ICYmIFwKKyAgICBzd2lmdCAtLXZlcnNpb24KKworIyBjcHBjaGVjay0xLjgyIGhhcyBhIG5hc3R5IGNwcCBwYXJzZXIgYnVnLCBzbyB3ZSdyZSB1c2luZyBzb21ldGhpbmcgbmV3ZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOCAmJiBcCisgICAgd2dldCAtcSAiaHR0cHM6Ly9sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2NwcGNoZWNrLzEuODMtMi8rYnVpbGQvMTQ4NzQ3MDMvK2ZpbGVzL2NwcGNoZWNrXzEuODMtMl9hbWQ2NC5kZWIiICYmIFwKKyAgICBkcGtnIC1pIGNwcGNoZWNrXzEuODMtMl9hbWQ2NC5kZWIgJiYgXAorICAgIHJtIGNwcGNoZWNrXzEuODMtMl9hbWQ2NC5kZWIKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3MmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzEgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IFhlbmlhbAorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IFhlbmlhbCBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBkOiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMi4wNzUuMSBmb3IgY292ZXJhZ2UKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMS4yMi4xIGZvciBjb3ZlcmFnZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGdvOiBYZW5pYWwgY29tZXMgd2l0aCAxLjYsIGJ1dCB3ZSBuZWVkIDEuNyBvciBsYXRlcgorIyAtIG5vZGVqczogWGVuaWFsIGNvbWVzIHdpdGggNC4yLjYgd2hpY2ggZXhpdHMgTFRTIEFwcmlsIDIwMTgsIHNvIHdlJ3JlIGluc3RhbGxpbmcgNi54CisjIC0gb2NhbWw6IGNhdXNlcyBzdGFjayBvdmVyZmxvdyBlcnJvciwganVzdCBzdGFydGVkIE1hcmNoIDIwMTggbm90IHN1cmUgd2h5CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6eGVuaWFsLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKQorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIEQKK1JVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBFQkNGOTc1RTVCQTI0RDVFICYmIFwKKyAgICB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICB3Z2V0IC1xTyAtIGh0dHBzOi8vZGxhbmcub3JnL2Qta2V5cmluZy5ncGcgfCBhcHQta2V5IGFkZCAtCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjIuMS0xCisKKyMgZG90bmV0IChjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUteGVuaWFsLXByb2QgeGVuaWFsIG1haW4iID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzYueCB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworIyMjIGxhbmd1YWdlcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBEX1ZFUlNJT04gMi4wNzUuMS0wCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluPSREX1ZFUlNJT04gXAorICAgICAgbGlicGhvYm9zMi1kZXY9JERfVkVSU0lPTiBcCisgICAgICBkdWI9MS42LjAtMCBcCisgICAgICBkZm10IFwKKyAgICAgIGRzY2FubmVyIFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHhkZy11dGlscworUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL3YxLjEuNisxLjAuMWcudGFyLmd6IHwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLTEuMS42LTEuMC4xZy9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLTEuMS42LTEuMC4xZy9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLTEuMS42LTEuMC4xZworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMS40CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuNy42CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBhZDU4MDhiZjQyYjAxNGMyMmRkNzY0NjQ1OGY2MzEzODUwMDMwNDlkZWQwYmI2YWYyZWZjN2YxZjc5ZmEyOWVhCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworIyBkdWUgdG8gYSBidWcgaW4gY2FiYWwgaW4geGVuaWFsIChjYWJhbC1pbnN0YWxsIHBhY2thZ2UpIHdlIHB1bGwgaW4gYW5vdGhlcjoKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyAmJiBcCisgICAgY2QgL3RtcCAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3d3dy5oYXNrZWxsLm9yZy9jYWJhbC9yZWxlYXNlL2NhYmFsLWluc3RhbGwtMS4yNC4wLjIvY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi14ODZfNjQtdW5rbm93bi1saW51eC50YXIuZ3ogJiYgXAorICAgIHRhciB4emYgY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi14ODZfNjQtdW5rbm93bi1saW51eC50YXIuZ3ogJiYgXAorICAgIGZpbmQgZGlzdC1uZXdzdHlsZS8gLXR5cGUgZiAtbmFtZSBjYWJhbCAtZXhlYyBtdiB7fSAvdXNyL2JpbiBcOyAmJiBcCisgICAgcm0gLXJmIC90bXAvY2FiYWwqICYmIFwKKyAgICBjYWJhbCAtLXZlcnNpb24KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2IFwKKyAgICAgIGxpYm5la28wICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAzLjQuNjQgMj4mMSA+IC9kZXYvbnVsbAorIyBub3RlOiBoeGNwcCAzLjQuMTg1IChsYXRlc3QpIG5vIGxvbmdlciBzaGlwcyBzdGF0aWMgbGlicmFyaWVzLCBhbmQgY2F1c2VkIGEgYnVpbGQgZmFpbHVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyBzbyBzdGljayB3aXRoIDUuMiBoZXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEgXAorICAgICAgbGliYXRrLWJyaWRnZTIuMC0wIFwKKyAgICAgIGxpYmd0ay0zLTAKKworIyBUSFJJRlQtNDUxNzogY2F1c2VzIHN0YWNrIG92ZXJmbG93czsgdmVyc2lvbiB0b28gb2xkOyBza2lwIG9jYW1sIGluIHhlbmlhbAorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA3LjAgXAorICAgICAgcGhwNy4wLWNsaSBcCisgICAgICBwaHA3LjAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgRE9UTkVUX0NMSV9URUxFTUVUUllfT1BUT1VUIDEKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZml4Y2hhbmdlcy5zaCBiL2J1aWxkL2ZpeGNoYW5nZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmM1N2I1NAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2ZpeGNoYW5nZXMuc2gKQEAgLTAsMCArMSwzOSBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIGZpeGNoYW5nZXMgd2lsbCB0YWtlIGEgZmlsZSBhcyBpbnB1dCBhbmQgbG9vayBmb3IgdGV4dCBtYXRjaGluZworIyB0aGUgcGF0dGVybiBbVEhSSUZULW5ubm5dICh0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpcyBub3QgaW1wb3J0YW50KQorIyB3aGljaCBpcyBub3QgYSBtYXJrZG93biBsaW5rLCBhbmQgY2hhbmdlIGl0IHRvIGJlIGEgbWFya2Rvd24gbGluay4KKyMgVGhlIHRvb2wgd3JpdGVzIHRvIHN0ZG91dCBzbyB5b3UgY2FuIHJlZGlyZWN0IGl0IHRvIGEgdGVtcG9yYXJ5CisjIGZpbGUgYW5kIHRoZW4gY29tcGFyZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBmaWxlIGJlZm9yZSByZXBsYWNpbmcKKyMgaXQuCisjCisjIFRoaXMgdG9vbCB3YXMgZGV2ZWxvcGVkIGFmdGVyIHRoZSAwLjEyLjAgcmVsZWFzZSB0byBhc3Npc3Qgd2l0aAorIyBnZW5lcmF0aW9uIG9mIENIQU5HRVMubWQgY29udGVudC4KKyMKKword2hpbGUgSUZTPScnIHJlYWQgLXIgbGluZSB8fCBbWyAtbiAiJGxpbmUiIF1dOyBkbworICAgIGlmIFtbICIkbGluZSIgPX4gXiguKilcWyhUSFJJRlQtW1s6ZGlnaXQ6XV0rKVxdW15cKF0oLiopJCBdXTsgdGhlbgorICAgICAgICBlY2hvICIke0JBU0hfUkVNQVRDSFsxXX1bJHtCQVNIX1JFTUFUQ0hbMl19XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlLyR7QkFTSF9SRU1BVENIWzJdfSkgJHtCQVNIX1JFTUFUQ0hbM119IgorICAgIGVsc2UKKyAgICAgICAgZWNobyAiJGxpbmUiCisgICAgZmkKK2RvbmUgPCAiJDEiCmRpZmYgLS1naXQgYS9idWlsZC92ZXJhbGlnbi5zaCBiL2J1aWxkL3ZlcmFsaWduLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxNzQ0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC92ZXJhbGlnbi5zaApAQCAtMCwwICsxLDMxMyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhlIHZlcmFsaWduIHNjcmlwdCBzZXRzIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9ucyBpbiBhbGwgb2YKKyMgdGhlIHBhY2thZ2UgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgYWxsIG9mIHRoZSBzdXBwb3J0ZWQKKyMgbGFuZ3VhZ2VzLiAgSXQgaXMgdXNlZCB0byBwcmVwYXJlIGEgcmVsZWFzZSBvciBtb3ZlIG1hc3RlcgorIyBmb3J3YXJkIHRvIHRoZSBuZXh0IGFudGljaXBhdGVkIHZlcnNpb24uCisjCisjIFVTQUdFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHVzYWdlOiB2ZXJhbGlnbi5zaCA8b2xkVmVyc2lvbj4gPG5ld1ZlcnNpb24+CisjCisjIEVYQU1QTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgJCAuL3ZlcmFsaWduLnNoIDAuMTIuMCAxLjAuMAorIyAkIC4vdmVyYWxpZ24uc2ggMS4wLjAgMS4xLjAKKyMKKyMgSU1QT1JUQU5UIFVTQUdFIE5PVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBEUllSVU4gdG8gaGF2ZSB0aGUgc2NyaXB0CisjIHByaW50IG91dCBhbGwgbWF0Y2hlcyB0byB0aGUgb2xkVmVyc2lvbiBoaWxpZ2h0ZWQgc28gdGhhdAorIyB5b3UgY2FuIHZlcmlmeSBpdCB3aWxsIGNoYW5nZSB0aGUgcmlnaHQgdGhpbmdzLgorIworCitkZWNsYXJlIC1BIEZJTEVTCisKKyMgVGhlc2UgZmlsZXMgcmVxdWlyZSBhIG1hbnVhbCB0b3VjaDoKK0ZJTEVTW0NIQU5HRVMubWRdPW1hbnVhbAorRklMRVNbZGViaWFuL2NoYW5nZWxvZ109bWFudWFsCitGSUxFU1tkb2FwLnJkZl09bWFudWFsCisKKyMgVGhlc2UgZmlsZXMgY2FuIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseToKK0ZJTEVTW0FwYWNoZVRocmlmdC5udXNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW1RocmlmdC1zd2lmdDMucG9kc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbVGhyaWZ0LnBvZHNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2FwcHZleW9yLnltbF09c2ltcGxlUmVwbGFjZQorRklMRVNbYm93ZXIuanNvbl09anNvblJlcGxhY2UKK0ZJTEVTW2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2VdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2NvbmZpZ3VyZS5hY109Y29uZmlndXJlUmVwbGFjZQorRklMRVNbY29udHJpYi90aHJpZnQuc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NvY29hL3NyYy9UaHJpZnQuaF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2RhcnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9oYXhlL2hheGVsaWIuanNvbl09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2hzL3RocmlmdC5jYWJhbF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9qcy9wYWNrYWdlLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tsaWIvanMvc3JjL3RocmlmdC5qc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2x1YS9UaHJpZnQubHVhXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9USHR0cENsaWVudFRyYW5zcG9ydC5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL29jYW1sL19vYXNpc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3BlcmwvbGliL1RocmlmdC5wbV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3B5L3NldHVwLnB5XT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcmIvdGhyaWZ0LmdlbXNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ycy9DYXJnby50b21sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvc3QvcGFja2FnZS54bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3BhY2thZ2UuanNvbl09anNvblJlcGxhY2UKK0ZJTEVTW3NvbmFyLXByb2plY3QucHJvcGVydGllc109c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbF09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvb2NhbWwvX29hc2lzXT1zaW1wbGVSZXBsYWNlCisKK2lmIFsgISAtZiAiQ0hBTkdFUyIgXTsgdGhlbgorICAgID4mMiBlY2hvICJlcnJvcjogcnVuIHZlcmFsaWduLnNoIHdoaWxlIGluIHRoZSB0aHJpZnQgcm9vdCBkaXJlY3RvcnkiCisgICAgZXhpdCAxCitmaQorCitpZiBbICQjIC1uZSAyIF07IHRoZW4KKyAgICA+JjIgZWNobyAidXNhZ2U6IHZlcmFsaWduLnNoIDxvbGRWZXJzaW9uPiA8bmV3VmVyc2lvbj4iCisgICAgZXhpdCAxCitmaQorCitqcSAtLXZlcnNpb24gMT4vZGV2L251bGwgMj4vZGV2L251bGwKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgID4mMiBlY2hvICJlcnJvcjogdGhlICdqcScgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkIgorICAgIGV4aXQgMQorZmkKKworIworIyB2YWxpZGF0ZVZlcnNpb246IGNoZWNrIHRoYXQgYSB2ZXJzaW9uIG1hdGNoZXMgdGhlIG1ham9yLm1pbm9yLnBhdGNoCisjICAgZm9ybWF0IHdoaWNoIGlzIHRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIHN1cHBvcnRlZCBieSBhbGwKKyMgICBwcm9qZWN0IHN5c3RlbXMuCisjIFxwYXJhbSAkMSB0aGUgdmVyc2lvbgorIyBccmV0dXJucyAwIGlmIHRoZSB2ZXJzaW9uIGlzIGNvbXBsaWFudAorIworZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uCit7CisgICAgbG9jYWwgcmVzdWx0CisgICAgbG9jYWwgdmFsaWQKKyAgICB2YWxpZD0kKGVjaG8gIiQxIiB8IHNlZCAnL15bWzpkaWdpdDpdXVwrXC5bWzpkaWdpdDpdXVwrXC5bWzpkaWdpdDpdXVwrJC8he3EyMn0nKQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJHJlc3VsdCAtZXEgMjIgXTsgdGhlbgorICAgICAgICA+JjIgZWNobyAiZXJyb3I6IHZlcnNpb24gJyQxJyBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSByZXF1aXJlZCBtYWpvci5taW5vci5wYXRjaCBmb3JtYXQiCisgICAgICAgIHJldHVybiAke3Jlc3VsdH0KKyAgICBmaQorfQorCitPTERWRVJTSU9OPSQxCitORVdWRVJTSU9OPSQyCit2YWxpZGF0ZVZlcnNpb24gIiR7T0xEVkVSU0lPTn0iIHx8IGV4aXQgJD8KK3ZhbGlkYXRlVmVyc2lvbiAiJHtORVdWRVJTSU9OfSIgfHwgZXhpdCAkPworCisjCisjIGVzY2FwZVZlcnNpb246IGVzY2FwZSB0aGUgdmVyc2lvbiBmb3IgdXNlIGFzIGEgc2VkIHNlYXJjaAorIyBccGFyYW0gJDEgdGhlIHZlcnNpb24gdG8gZXNjYXBlCisjIFxvdXRwdXQgdGhlIGVzY2FwZWQgc3RyaW5nCisjIFxyZXR1cm5zIDAKKyMgXGV4YW1wbGUgVkVSU0VBUkNIPSQoZXNjYXBlVmVyc2lvbiAiWzEuMC4wXSIpOyBlY2hvICRWRVJTRUFSQ0g7ID0+ICJcWzFcLjBcLjBcXSIKKyMKK2Z1bmN0aW9uIGVzY2FwZVZlcnNpb24KK3sKKyAgICBlY2hvICIkKGVjaG8gJDEgfCBzZWQgJ3MvXC4vXFwuL2cnIHwgc2VkICdzL1xbL1xcXFsvZycgfCBzZWQgJ3MvXF0vXFxcXS9nJykiCit9CisKKyMgU2V0IHVwIHZlcmJvc2UgaGlsaWdodGluZyBpZiBydW5uaW5nIGludGVyYWN0aXZlCitpZiBbICIkKHRwdXQgY29sb3JzKSIgLW5lIDAgXTsgdGhlbgorICAgIHJldmVyc2U9JCh0cHV0IHJldikKKyAgICByZWQ9JCh0cHV0IHNldGFmIDEpCisgICAgZ3JlZW49JCh0cHV0IHNldGFmIDIpCisgICAgeWVsbG93PSQodHB1dCBzZXRhZiAzKQorICAgIG5vcm1hbD0kKHRwdXQgc2dyMCkKK2ZpCisKK2RlY2xhcmUgLUEgTUFOVUFMCisKKyMKKyMgbWFudWFsOiBub3RlIHRoYXQgdXBkYXRlIG9mIHNhaWQgZmlsZSBpcyBtYW51YWwKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwCisjCitmdW5jdGlvbiBtYW51YWwKK3sKKyAgICBNQU5VQUxbIiQxIl09IiIKKyAgICByZXR1cm4gMAorfQorCisjCisjIGNvbmZpZ3VyZVJlcGxhY2U6IHJlcGxhY2UgdGhlIEFDX0lOSVQgZmllbGQgaW4gY29uZmlndXJlLmFjCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIGNvbmZpZ3VyZVJlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgIlt0aHJpZnRdLCBbJHtPTERWRVJTSU9OfV0iICJbdGhyaWZ0XSwgWyR7TkVXVkVSU0lPTn1dIgorfQorCisjCisjIGpzb25SZXBsYWNlOiByZXBsYWNlIGEgc3BlY2lmaWMgdmVyc2lvbiBmaWVsZCBpbiBhIEpTT04gZmlsZQorIyAgIG11c3QgYmUgYSB0b3AgbGV2ZWwgInZlcnNpb24iIGZpZWxkIGluIHRoZSBqc29uIHN0cnVjdHVyZQorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworCitmdW5jdGlvbiBqc29uUmVwbGFjZQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIG91dHB1dAorICAgIGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBvdXRwdXQ9JChqcSAtZSAiLnZlcnNpb24iICIkMSIpCisgICAgZWxzZQorICAgICAgICBvdXRwdXQ9JChqcSAtZSAiLnZlcnNpb24gPSBcIiR7TkVXVkVSU0lPTn1cIiIgIiQxIiA+IHRtcC4kJC5qc29uICYmIG12IHRtcC4kJC5qc29uICIkMSIpCisgICAgZmkKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7cmVkfUVSUk9SJHtub3JtYWx9OiB2ZXJzaW9uIHRhZyBub3QgZm91bmQiICIkMSIgIiRjb3VudCIKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMQorICAgIGVsaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIG91dHB1dD0ke291dHB1dCVcIn0KKyAgICAgICAgb3V0cHV0PSR7b3V0cHV0I1wifQorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgTUFUQ0hFUzogICB2ZXJzaW9uOiBcIiR7cmV2ZXJzZX0ke2dyZWVufSR7b3V0cHV0fSR7bm9ybWFsfVwiIiAiJDEiIDEKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7Z3JlZW59T0ske25vcm1hbH0iICIkMSIgMQorICAgIGVjaG8KKyAgICByZXR1cm4gMAorfQorCisjCisjIHB1YnNwZWNSZXBsYWNlOiByZXBsYWNlIGEgc3BlY2lmaWMgdmVyc2lvbiBmaWVsZCBpbiBhIFlBTUwgZmlsZQorIyAgIG11c3QgYmUgYSB0b3AgbGV2ZWwgInZlcnNpb24iIGZpZWxkIGluIHRoZSB5YW1sIHN0cnVjdHVyZQorIyAgIGRpZCBub3QgZmluZCBhIHBhY2thZ2UgdGhhdCBwcmVzZXJ2ZXMgY29tbWVudHMgc28gdGhpcyBpcworIyAgIHNvbWV3aGF0IGJyYWluLWRlYWQsIGJ1dCBpdCBnZXRzIHRoZSBqb2IgZG9uZQorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworCitmdW5jdGlvbiBwdWJzcGVjUmVwbGFjZQoreworICAgIHJlcGxhY2UgIiQxIiAidmVyc2lvbjogJHtPTERWRVJTSU9OfSIgInZlcnNpb246ICR7TkVXVkVSU0lPTn0iCit9CisKKyMKKyMgcmVwbGFjZTogcmVwbGFjZSBvY2N1cnJlbmNlcyBvZiBvbmUgc3RyaW5nIHdpdGggYW5vdGhlcgorIyAgICAgdGhlIGZpbGUgc3BlY2lmaWVkIG11c3QgY29udGFpbiB0aGUgb2xkIHN0cmluZyBhdCBsZWFzdCBvbmNlCisjICAgICBpbiBvcmRlciB0byBiZSBzdWNjZXNzZnVsLgorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxwYXJhbSAkMiB0aGUgIm9sZCIgc3RyaW5nIHRvIGJlIHJlcGxhY2VkCisjIFxwYXJhbSAkMyB0aGUgIm5ldyIgc3RyaWluZyB0byByZXBsYWNlIGl0IHdpdGgKKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCitmdW5jdGlvbiByZXBsYWNlCit7CisgICAgbG9jYWwgcmVzdWx0CisgICAgbG9jYWwgb3V0cHV0CisgICAgbG9jYWwgb2xkU3RyaW5nPSIkMiIKKyAgICBsb2NhbCBuZXdTdHJpbmc9IiQzIgorICAgIGxvY2FsIG9sZFJlZ2V4PSQoZXNjYXBlVmVyc2lvbiAiJHtvbGRTdHJpbmd9IikKKyAgICBsb2NhbCBjb3VudD0kKGdyZXAgLUVjICIke29sZFJlZ2V4fSIgIiQxIikKKyAgICBsb2NhbCB2ZXJib3NlCisgICAgaWYgWyAkY291bnQgLWVxIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9Tk9UIEZPVU5EJHtub3JtYWx9OiAke29sZFN0cmluZ30iICIkMSIgMAorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZWxpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8IE1BVENIRVM6IiAiJDEiICIkY291bnQiCisgICAgICAgIGVjaG8KKyAgICAgICAgd2hpbGUgcmVhZCAtciBsaW5lOyBkbworICAgICAgICAgICAgZWNobyAiID4gJChlY2hvICIkbGluZSIgfCBzZWQgInMvJHtvbGRSZWdleH0vJHtyZXZlcnNlfSR7Z3JlZW59JHtvbGRTdHJpbmd9JHtub3JtYWx9L2ciKSIKKyAgICAgICAgZG9uZSA8IDwoZ3JlcCAtRSAiJHtvbGRSZWdleH0iICIkMSIpCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKyAgICBvdXRwdXQ9JChzZWQgLWkgInMvJHtvbGRSZWdleH0vJHtuZXdTdHJpbmd9L2ciICIkMSIpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkcmVzdWx0IC1uZSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7cmVkfUVSUk9SJHtub3JtYWx9OiAlcyIgIiQxIiAiJGNvdW50IiAiJG91dHB1dCIKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMQorICAgIGZpCisgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7Z3JlZW59T0ske25vcm1hbH0iICIkMSIgIiRjb3VudCIKKyAgICBlY2hvCisgICAgcmV0dXJuIDAKK30KKworIworIyBzaW1wbGVSZXBsYWNlOiByZXBsYWNlIG9jY3VycmVuY2VzIG9mICR7T0xEVkVSU0lPTn0gd2l0aCAke05FV1ZFUlNJT059CisjICAgICB0aGUgZmlsZSBzcGVjaWZpZWQgbXVzdCBjb250YWluIE9MRFZFUlNJT04gYXQgbGVhc3Qgb25jZQorIyAgICAgaW4gb3JkZXIgdG8gYmUgc3VjY2Vzc2Z1bC4KKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccGFyYW0gJDIgdGhlICJvbGQiIHN0cmluZyB0byBiZSByZXBsYWNlZAorIyBccGFyYW0gJDMgdGhlICJuZXciIHN0cmlpbmcgdG8gcmVwbGFjZSBpdCB3aXRoCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworZnVuY3Rpb24gc2ltcGxlUmVwbGFjZQoreworICAgIHJlcGxhY2UgIiQxIiAiJHtPTERWRVJTSU9OfSIgIiR7TkVXVkVSU0lPTn0iCit9CisKK2VjaG8gIiIKK2VjaG8gIkFwYWNoZSBUaHJpZnQgVmVyc2lvbiBBbGlnbm1lbnQgVG9vbCIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIiIKK2VjaG8gIlByZXZpb3VzIFZlcnNpb246ICR7T0xEVkVSU0lPTn0iCitlY2hvICIgICAgIE5ldyBWZXJzaW9uOiAke05FV1ZFUlNJT059IgorZWNobyAiIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICJGaWxlbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb3VudCB8IFN0YXR1cyAgICAgICAgICAgICAgICIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCitmb3IgZmlsZSBpbiAkKGVjaG8gIiR7IUZJTEVTW0BdfSIgfCBzb3J0KTsgZG8KKyAgICAke0ZJTEVTWyRmaWxlXX0gJGZpbGUgfHwgZXhpdCAkPworZG9uZQorCitlY2hvCitlY2hvICJGaWxlcyB0aGF0IG11c3QgYmUgbW9kaWZpZWQgbWFudWFsbHk6IgorZWNobworZm9yIG1hbnUgaW4gJChlY2hvICIkeyFNQU5VQUxbQF19IiB8IHNvcnQpOyBkbworICAgIGVjaG8gIiA+ICR7eWVsbG93fSR7bWFudX0ke25vcm1hbH0iCitkb25lCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL1JFQURNRS5tZCBiL2J1aWxkL3dpbmNwcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzMTc4MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9SRUFETUUubWQKQEAgLTAsMCArMSwyMTkgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQnVpbGRpbmcgdGhyaWZ0IG9uIFdpbmRvd3MgKE5hdGl2ZSkKKworVGhyaWZ0IHVzZXMgY21ha2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgdGhlIHByb2plY3Qgb24gbXVsdGlwbGUgcGxhdGZvcm1zLCBob3dldmVyIHRvIGJ1aWxkIGEgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcHJvZHVjdGlvbiByZWFkeSB0aHJpZnQgb24gV2luZG93cyByZXF1aXJlcyBhIG51bWJlciBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYmUgb2J0YWluZWQgb3IgYnVpbHQuICBPbmNlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhcmUgcmVhZHksIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBvcHRpb25zIG11c3QgYmUgcGFzc2VkIHRvIGNtYWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGVudmlyb25tZW50LgorCisjIyBTdW1tYXJ5CisKK1RoZXNlIGluc3RydWN0aW9ucyB3aWxsIGhlbHAgeW91IGJ1aWxkIHRocmlmdCBmb3Igd2luZG93cyB1c2luZyBWaXN1YWwKK1N0dWRpbyAyMDEwIG9yIGxhdGVyLiAgVGhlIGNvbnRyaWJ1dGVkIGJhdGNoIGZpbGVzIHdpbGwgaGVscCB5b3UgYnVpbGQKK3RoZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgbmVlZGVkIGZvciBjb21wbGV0ZSB0aHJpZnQgZnVuY3Rpb25hbGl0eSBhcword2VsbCBhcyB0aHJpZnQgaXRzZWxmLgorCitUaGVzZSBpbnN0cnVjdGlvbnMgZm9sbG93IGEgZGlyZWN0b3J5IGxheW91dCB0aGF0IGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICAgIHdvcmtzcGFjZVwKKyAgICAgIGJ1aWxkXCAgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIG91dC1vZi10cmVlIHRocmlmdCBjbWFrZSBidWlsZHMgYXJlIGdlbmVyYXRlZAorICAgICAgZGlzdFwgICAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgdGhyaWZ0IGJ1aWxkIHJlc3VsdHMgZW5kIHVwCisgICAgICB0aGlyZHBhcnR5XCAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBiaW5hcmllcyBhbmQgbGlicmFyaWVzIGxpdmUKKyAgICAgICAgYnVpbGRcICAgICAgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgb3V0LW9mLXRyZWUgYnVpbGRzIGFyZSBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgKGV4Y2VwdCBmb3Igb3BlbnNzbCwgd2hpY2ggb25seSBidWlsZHMgaW4tdHJlZSkKKyAgICAgICAgZGlzdFwgICAgICAgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgZGlzdHJpYnV0aW9ucyBlbmQgdXAKKyAgICAgICAgc3JjXCAgICAgICAgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgc291cmNlIHByb2plY3RzIGxpdmUKKyAgICAgIHNjcmlwdHNcICAgICAtIGJhdGNoIGZpbGVzIHVzZWQgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgYnVpbGRzCisgICAgICB0aHJpZnRcICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSB0aHJpZnQgc291cmNlIHByb2plY3QgbGl2ZXMKKworQ3JlYXRlIGEgIndvcmtzcGFjZSIgZGlyZWN0b3J5IHNvbWV3aGVyZSBvbiB5b3VyIHN5c3RlbSBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGlzCitkaXJlY3RvcnkgdG8gdGhlcmUsIHRoZW4gY2xvbmUgb3IgdW5wYWNrIHRocmlmdCBpbnRvIGB3b3Jrc3BhY2VcdGhyaWZ0YC4KKworIyMgVGhpcmQgUGFydHkgTGlicmFyaWVzCisKK0JhdGNoIHNjcmlwdHMgYXJlIHByb3ZpZGVkIHRvIGJ1aWxkIHNvbWUgdGhpcmQgcGFydHkgbGlicmFyaWVzLiAgWW91IG11c3QgZG93bmxvYWQgdGhlbSBhbmQgcGxhY2UgdGhlbSBpbnRvIHRoZSBkaXJlY3Rvcnkgbm90ZWQgZm9yIGVhY2guICBZb3UgY2FuIHVzZSBkaWZmZXJlbnQgdmVyc2lvbnMgaWYgeW91IHByZWZlcjsgdGhlc2UgaW5zdHJ1Y3Rpb25zIHdlcmUgbWFkZSB3aXRoIHRoZSB2ZXJzaW9ucyBsaXN0ZWQuICAKKworPiBUSVA6IFRvIG1vZGlmeSB0aGUgdmVyc2lvbnMgdXNlZCBpbiB0aGUgYmF0Y2ggc2NyaXB0cywgbG9vayBpbiBzY3JpcHRzXHRwdmVyc2lvbnMuYmF0LgorCitCdWlsZCB0aGVtIGluIHRoZSBvcmRlciBsaXN0ZWQgdG8gc2F0aXNmeSB0aGVpciBkZXBlbmRlbmNpZXMuCisKKyMjIyB3aW5mbGV4Ymlzb24KKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uL2ZpbGVzL3dpbl9mbGV4X2Jpc29uLWxhdGVzdC56aXAvZG93bmxvYWQKKyAgICAgICB2ZXJzaW9uOiAibGF0ZXN0IgorICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uCisKK1RoaXMgcGFja2FnZSBpcyByZXF1aXJlZCB0byBidWlsZCB0aGUgY29tcGlsZXIuICBUaGlzIHRoaXJkIHBhcnR5IHBhY2thZ2UgZG9lcyBub3QgbmVlZCB0byBiZSBidWlsdCBhcyBpdCBpcyBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgdGhlICJiaXNvbiIgYW5kICJmbGV4IiB0b29scyBub3JtYWxseSBmb3VuZCBvbiBVbml4IGJveGVzLgorCis+IFRJUDogSWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYnVpbGRpbmcgdGhlIGNvbXBpbGVyLCB5b3UgY2FuIHNraXAgdGhlIHJlbWFpbmluZyB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMuCisKKyMjIyB6bGliCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHA6Ly96bGliLm5ldC8KKyAgICAgICB2ZXJzaW9uOiAxLjIuOQorICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1x6bGliLTEuMi45CisKK1RvIGJ1aWxkLCBvcGVuIHRoZSBhcHByb3ByaWF0ZSBWaXN1YWwgU3R1ZGlvIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biAKK3RoZSBidWlsZC16bGliLmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisgCisjIyMgb3BlbnNzbAorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy8KKyAgICAgICB2ZXJzaW9uOiAxLjEuMGMKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxzcmNcb3BlbnNzbC0xLjEuMGMKKyAgICBkZXBlbmRzLW9uOiB6bGliCisKK0lmIHlvdSBhcmUgdXNpbmcgb3BlbnNzbC0xLjEuMCBvciBsYXRlciwgdGhleSBjaGFuZ2VkIHN0YXRpYyBidWlsZHMgdG8gdXNlIE1pY3Jvc29mdCBTdGF0aWMgUlRMIGZvciByZWxlYXNlIGJ1aWxkcy4gIHpsaWIgYnkgZGVmYXVsdCB1c2VzIGEgZHluYW1pYyBydW50aW1lLCBhcyBkb2VzIGxpYmV2ZW50LiAgRWRpdCB0aGUgZmlsZSBDb25maWd1cmF0aW9ucy8xMC1tYWluLmNvbmYgYW5kIHJlcGxhY2UgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yICJWQy1ub0NFLWNvbW1vbiIgd2l0aCB3aGF0IGFwcGVhcnMgYmVsb3cgdG8gbWFrZSBvcGVuc3NsIGJ1aWxkIHdpdGggZHluYW1pYyBydW50aW1lIGluc3RlYWQ6CisKKyAgICAiVkMtbm9DRS1jb21tb24iID0+IHsKKyAgICAgICAgaW5oZXJpdF9mcm9tICAgICA9PiBbICJWQy1jb21tb24iIF0sCisgICAgICAgIHRlbXBsYXRlICAgICAgICAgPT4gMSwKKyAgICAgICAgY2ZsYWdzICAgICAgICAgICA9PiBhZGQocGlja2VyKGRlZmF1bHQgPT4gIi1EVU5JQ09ERSAtRF9VTklDT0RFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnICAgPT4gIi9NRGQgL09kIC1EREVCVUcgLURfREVCVUciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9PiAiL01EIC9PMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSksCisgICAgICAgIGJpbl9jZmxhZ3MgICAgICAgPT4gYWRkKHBpY2tlcihkZWJ1ZyAgID0+ICIvTURkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPT4gIi9NRCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICBiaW5fbGZsYWdzICAgICAgID0+IGFkZCgiL3N1YnN5c3RlbTpjb25zb2xlIC9vcHQ6cmVmIiksCisgICAgICAgIGV4X2xpYnMgICAgICAgICAgPT4gYWRkKHN1YiB7CisgICAgICAgICAgICBteSBAZXhfbGlicyA9ICgpOworICAgICAgICAgICAgcHVzaCBAZXhfbGlicywgJ3dzMl8zMi5saWInIHVubGVzcyAkZGlzYWJsZWR7c29ja307CisgICAgICAgICAgICBwdXNoIEBleF9saWJzLCAnZ2RpMzIubGliIGFkdmFwaTMyLmxpYiBjcnlwdDMyLmxpYiB1c2VyMzIubGliJzsKKyAgICAgICAgICAgIHJldHVybiBqb2luKCIgIiwgQGV4X2xpYnMpOworICAgICAgICB9KSwKKyAgICB9LAorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtb3BlbnNzbC5iYXQgc2NyaXB0IGluIHRoaXJkcGFydHlcc3JjLgorCisjIyMgbGliZXZlbnQKKworICAgICAgICBzb3VyY2U6IGdpdAorICAgICAgbG9jYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9ubWF0aGV3c29uL0xpYmV2ZW50LmdpdAorICAgICAgICAgICB1c2U6IGNvbW1pdCAzODIxY2NhMWE2MzdmNGRhNDA5OWM5MzQzZTczMjZkYTAwZjY5ODFjIG9yIGxhdGVyCisgICAgICAgICAgZGF0ZTogRnJpIERlYyAyMyAxNjoxOTozNSAyMDE2ICswODAwIG9yIGxhdGVyCisgICAgICAgdmVyc2lvbjogY29ycmVzcG9uZHMgdG8gMi4xLjdyYyArIHBhdGNoZXMKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxzcmNcbGliZXZlbnQtMi4xLjdyYzIKKyAgICBkZXBlbmRzLW9uOiBvcGVuc3NsLCB6bGliCisKK1RvIGJ1aWxkLCBvcGVuIHRoZSBhcHByb3ByaWF0ZSBWaXN1YWwgU3R1ZGlvIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biAKK3RoZSBidWlsZC1saWJldmVudC5iYXQgc2NyaXB0IGluIHRoaXJkcGFydHlcc3JjLgorCisjIyMgbXNpbnR0eXBlcworCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9hcmNoaXZlL3AvbXNpbnR0eXBlcy9kb3dubG9hZHMKKyAgICAgICB2ZXJzaW9uOiAyNgorICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XGRpc3RcbXNpbnR0eXBlcworCis+IFRJUDogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgVmlzdWFsIFN0dWRpbyAyMDEwLCB3aGljaCBkaWQgbm90IGluY2x1ZGUgYW4gPGludHR5cGVzLmg+IGhlYWRlci4KKworVGhpcyB0aGlyZCBwYXJ0eSBwYWNrYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgYnVpbHQgYXMgaXQgaXMgYSBkaXN0cmlidXRpb24gb2YgaGVhZGVyIGZpbGVzLgorCisjIyMgYm9vc3QKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cDovL2Jvb3N0LnRlZWtzOTkuY29tLworICAgICAgIHZlcnNpb246IDFfNjJfMAorICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XGRpc3RcYm9vc3RfMV82Ml8wCisKK1RoZSBwcmUtYnVpbHQgYmluYXJ5IHZlcnNpb25zIG9mIGJvb3N0IGNvbWUgaW4gc2VsZi11bnBhY2tpbmcgZXhlY3V0YWJsZXMuICBSdW4gZWFjaCBvZiB0aGUgb25lcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYW5kIHBvaW50IHRoZW0gYXQgdGhlIHNhbWUgdGhpcmRwYXJ0eSBkaXN0IGRpcmVjdG9yeS4KKworIyMgQnVpbGRpbmcgYSBQcm9kdWN0aW9uIHRocmlmdCBDb21waWxlcgorCisjIyMgUHJlcmVxdWlzaXRlcworCisqIENNYWtlLTIuOC4xMi4yIG9yIGxhdGVyCisqIFZpc3VhbCBTdHVkaW8gMjAxMCBvciBsYXRlcgorKiB0aHJpZnQgc291cmNlIHBsYWNlZCBpbnRvIHdvcmtzcGFjZVx0aHJpZnQKKyogd2luZmxleGJpc29uIHBsYWNlZCBpbnRvIHdvcmtzcGFjZVx0aGlyZHBhcnR5XGRpc3QKKworIyMjIEluc3RydWN0aW9ucworCitCeSBmb2xsb3dpbmcgdGhlc2UgaW5zdHJ1Y3Rpb25zIHlvdSB3aWxsIGVuZCB1cCB3aXRoIGEgcmVsZWFzZSBtb2RlIHRocmlmdCBjb21waWxlciB0aGF0IGlzIHN1aXRhYmxlIGZvciBkaXN0cmlidXRpb24gYXMgaXQgaGFzIG5vIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gIAorCisxLiBPcGVuIHRoZSBhcHByb3ByaWF0ZSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0LgorMi4gYGNkIHdvcmtzcGFjZWAKKzMuIGBidWlsZC10aHJpZnQtY29tcGlsZXIuYmF0YAorCitUaGUgYmF0Y2ggZmlsZSB1c2VzIENNYWtlIHRvIGdlbmVyYXRlIGFuIG91dC1vZi10cmVlIGJ1aWxkIGRpcmVjdG9yeSBpbiBgd29ya3NwYWNlXGJ1aWxkYCBhbmQgdGhlbiBidWlsZHMgdGhlIGNvbXBpbGVyLiAgVGhlIHJlc3VsdGluZyBgdGhyaWZ0LmV4ZWAgcHJvZ3JhbSBpcyBwbGFjZWQgaW50byBgd29ya3NwYWNlXGRpc3RgIGluIGEgcGF0aCB0aGF0IGRlcGVuZHMgb24geW91ciBjb21waWxlciB2ZXJzaW9uIGFuZCBwbGF0Zm9ybS4gIEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIGEgVmlzdWFsIFN0dWRpbyAyMDEwIHg2NCBDb21tYW5kIFByb21wdCwgdGhlIGNvbXBpbGVyIHdpbGwgYmUgcGxhY2VkIGludG8gYHdvcmtzcGFjZVxkaXN0XHRocmlmdC1jb21waWxlci1kZXZcdmMxMDBceDY0XFJlbGVhc2VcdGhyaWZ0LmV4ZWAKKworIyMjIyBEZXRhaWxzCisKK1RoaXMgc2VjdGlvbiBpcyBmb3IgdGhvc2Ugd2hvIGFyZSBjdXJpb3VzIGFib3V0IHRoZSBDTWFrZSBvcHRpb25zIHVzZWQgaW4gdGhlIGJ1aWxkIHByb2Nlc3MuCisKK0NNYWtlIHRha2VzIHRoZSBzb3VyY2UgdHJlZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIHVzZXMgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgZm9yIGNvbmZpZ3VyYXRpb24uICBUaGUgYmF0Y2ggZmlsZSBgYnVpbGQtdGhyaWZ0LWNvbXBpbGVyYCBlc3NlbnRpYWxseSBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgICAgQzpcPiBDRCB3b3Jrc3BhY2VcYnVpbGQKKyAgICBDOlx3b3Jrc3BhY2VcYnVpbGQ+ICJDOlxQcm9ncmFtIEZpbGVzXENNYWtlXGJpblxjbWFrZS5leGUiIC4uXHRocmlmdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURCSVNPTl9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAtREZMRVhfRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfTVQ9T04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1HIk5NYWtlIE1ha2VmaWxlcyIKKyAgICBDOlx3b3Jrc3BhY2VcYnVpbGQ+IE5NQUtFIC9GTWFrZWZpbGUgdGhyaWZ0LWNvbXBpbGVyCisKK1dJVEhfTVQgY29udHJvbHMgdGhlIGR5bmFtaWMgb3Igc3RhdGljIHJ1bnRpbWUgbGlicmFyeSBzZWxlY3Rpb24uICBUbyBidWlsZCBhIHByb2R1Y3Rpb24gY29tcGlsZXIsIHRoZSB0aHJpZnQgcHJvamVjdCByZWNvbW1lbmRzIHVzaW5nIHRoZSBzdGF0aWMgcnVudGltZSBsaWJyYXJ5IHRvIG1ha2UgdGhlIGV4ZWN1dGFibGUgcG9ydGFibGUuICBUaGUgYmF0Y2ggZmlsZSBzZXRzIHRoaXMuCisKK1lvdSBjYW4gYnVpbGQgYSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZSBieSBmb2xsb3dpbmcgdGhlIGV4YW1wbGUgYnV0IHN1YnN0aXR1dGluZyBhIGRpZmZlcmVudCBnZW5lcmF0b3IgZm9yIHRoZSAiLUciIG9wdGlvbi4gIFJ1biBgY21ha2UuZXhlIC0taGVscGAgZm9yIGEgbGlzdCBvZiBnZW5lcmF0b3JzLiAgVHlwaWNhbGx5LCB0aGlzIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9uIFdpbmRvd3MgKG9taXQgIldpbjY0IiB0byBidWlsZCAzMi1iaXQgaW5zdGVhZCk6CisKKyogIlZpc3VhbCBTdHVkaW8gMTAgMjAxMCBXaW42NCIKKyogIlZpc3VhbCBTdHVkaW8gMTEgMjAxMiBXaW42NCIKKyogIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIKKyogIlZpc3VhbCBTdHVkaW8gMTQgMjAxNSBXaW42NCIKKyogIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyBXaW42NCIKKworRm9yIGV4YW1wbGUgeW91IGNhbiBidWlsZCB1c2luZyBhIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lIGJ5IGRvaW5nOgorCisgICAgQzpcPiBDRCB3b3Jrc3BhY2VcYnVpbGQKKyAgICBDOlx3b3Jrc3BhY2VcYnVpbGQ+ICJDOlxQcm9ncmFtIEZpbGVzXENNYWtlXGJpblxjbWFrZS5leGUiIC4uXHRocmlmdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURCSVNPTl9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAtREZMRVhfRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfTVQ9T04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1HIlZpc3VhbCBTdHVkaW8gMTQgMjAxNSBXaW42NCIKKyAgICBDOlx3b3Jrc3BhY2VcYnVpbGQ+IE1TQlVJTEQgIkFwYWNoZSBUaHJpZnQuc2xuIiAvcDpDb25maWd1cmF0aW9uPVJlbGVhc2UgL3A6UGxhdGZvcm09eDY0IC90OnRocmlmdC1jb21waWxlcgorCitZb3UgY2FuIGFsc28gZG91YmxlLWNsaWNrIG9uIHRoZSBzb2x1dGlvbiBmaWxlIHRvIGJyaW5nIGl0IHVwIGluIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkIG9yIGRlYnVnIGludGVyYWN0aXZlbHkgZnJvbSB0aGVyZS4KKworIyMgQnVpbGRpbmcgdGhlIHRocmlmdCBDKysgUnVuLVRpbWUgTGlicmFyeQorCitUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIGNvbXBpbGVyIGJ1aWxkIGhvd2V2ZXIgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9uIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBidWlsZCBhIGZlYXR1cmUtY29tcGxldGUgcnVudGltZS4gIFRoZSByZXN1bHRpbmcgc3RhdGljIGxpbmsgbGlicmFyeSBmb3IgdGhyaWZ0IHVzZXMgYSBkeW5hbWljIE1pY3Jvc29mdCBydW50aW1lLgorCisxLiBPcGVuIHRoZSBkZXNpcmVkIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQuCisyLiBgY2Qgd29ya3NwYWNlYAorMy4gYGJ1aWxkLXRocmlmdC5iYXRgCisKK1RocmlmdCBkZXBlbmRzIG9uIGJvb3N0LCBsaWJldmVudCwgb3BlbnNzbCwgYW5kIHpsaWIgaW4gb3JkZXIgdG8gYnVpbGQgd2l0aCBhbGwgc2VydmVyIGFuZCB0cmFuc3BvcnQgdHlwZXMuICBUbyB1c2UgbGF0ZXIgdmVyc2lvbnMgb2YgYm9vc3QgbGlrZSAxLjYyIHlvdSB3aWxsIG5lZWQgYSByZWNlbnQgdmVyc2lvbiBvZiBjbWFrZSAoYXQgbGVhc3QgMy43KS4KKworVGhlIGJ1aWxkLXRocmlmdCBzY3JpcHQgaGFzIG9wdGlvbnMgdG8gYnVpbGQgZGVidWcgb3IgcmVsZWFzZSBhbmQgdG8gb3B0aW9uYWxseSBkaXNhYmxlIGFueSBvZiB0aGUgZ2VuZXJhdGlvbiAoY21ha2UpLCBidWlsZCwgb3IgdGVzdCBwaGFzZXMuICBCeSBkZWZhdWx0LCB0aGUgYmF0Y2ggZmlsZSB3aWxsIGdlbmVyYXRlIGFuIG91dC1vZi10cmVlIGJ1aWxkIGRpcmVjdG9yeSBpbnNpZGUgYHdvcmtzcGFjZVxidWlsZGAsIHRoZW4gcGVyZm9ybSBhIHJlbGVhc2UgYnVpbGQsIHRoZW4gcnVuIHRoZSB1bml0IHRlc3RzLiAgVGhlIGJhdGNoIGZpbGUgYWNjZXB0cyBzb21lIG9wdGlvbiBmbGFncyB0byBjb250cm9sIGl0cyBiZWhhdmlvcjoKKworICAgIDo6IEZsYWdzIHlvdSBjYW4gdXNlIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW9yOgorICAgIDo6CisgICAgOjogICAvREVCVUcgICAgICAgICAgICAtIGlmIGJ1aWxkaW5nLCBwZXJmb3JtIGEgZGVidWcgYnVpbGQgaW5zdGVhZAorICAgIDo6ICAgL05PR0VORVJBVEUgICAgICAgLSBza2lwIGNtYWtlIGdlbmVyYXRpb24gLSB1c2VmdWwgaWYgeW91CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYWxyZWFkeSBnZW5lcmF0ZWQgYSBzb2x1dGlvbiBhbmQganVzdAorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGJ1aWxkCisgICAgOjogICAvTk9CVUlMRCAgICAgICAgICAtIHNraXAgY21ha2UgYnVpbGQgLSB1c2VmdWwgaWYgeW91IGp1c3QKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBnZW5lcmF0ZSBhIHNvbHV0aW9uCisgICAgOjogICAvTk9URVNUICAgICAgICAgICAtIHNraXAgY3Rlc3QgZXhlY3V0aW9uCisKK0ZvciBleGFtcGxlIGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIHRoZSBjbWFrZSBlbnZpcm9ubWVudCB3aXRob3V0IGJ1aWxkaW5nIG9yIHJ1bm5pbmcgdGVzdHM6CisKKyAgICBDOlx3b3Jrc3BhY2U+IGJ1aWxkLXRocmlmdC5iYXQgL05PQlVJTEQgL05PVEVTVApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC1jb21waWxlci5iYXQgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI0MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC1jb21waWxlci5iYXQKQEAgLTAsMCArMSw3OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IFByb2R1Y2VzIGEgcHJvZHVjdGlvbiB0aHJpZnQgY29tcGlsZXIgc3VpdGFibGUgZm9yIHJlZGlzdHJpYnV0aW9uLgorOjogVGhlIGNvbXBpbGVyIGlzIGxpbmtlZCB0byBydW50aW1lIHN0YXRpY2FsbHkgZm9yIG1heGltdW0gcG9ydGFiaWxpdHkuCis6OiBBc3N1bWVzIHRoZSB0aGlyZHBhcnR5IGZpbGVzIGZvciAid2luZmxleGJpc29uIiBoYXZlIGJlZW4gcGxhY2VkCis6OiBhY2NvcmRpbmcgdG8gdGhlIFJFQURNRS5tZCBpbnN0cnVjdGlvbnMuCis6OgorOjogT3BlbiBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgb2YgeW91ciBjaG9vc2luZyBhbmQgdGhlbgorOjogcnVuIHRoaXMgc2NyaXB0LiAgCisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT10aHJpZnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPWRldgorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwdGhpcmRwYXJ0eQorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgR0VORVJBVE9SIGZvciBDTWFrZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRnZW5lcmF0b3IuYmF0IHx8IEVYSVQgL0IKKworSUYgTk9UIERFRklORUQgQlVJTERUWVBFICgKKyAgU0VUIEJVSUxEVFlQRT1SZWxlYXNlCispCisKKyAgU0VUIEJVSUxERElSPSV+ZHAwYnVpbGRcJVBBQ0tBR0VfTkFNRSUtY29tcGlsZXJcJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwKKyAgU0VUIE9VVERJUj0lfmRwMGRpc3RcJVBBQ0tBR0VfTkFNRSUtY29tcGlsZXItJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcCisgIFNFVCBCT09TVF9MSUJESVI9bGliJUFSQ0g6fi0yLDIlLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4wCisgIElGICIlQlVJTERUWVBFJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfU1RBVElDX1NVRkZJWD1kKQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICBDb25maWd1cmF0aW9uOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTolQlVJTERUWVBFJSAiJUdFTkVSQVRPUiUiCitJRiBERUZJTkVEIENPTVBJTEVST05MWSAoCisgIEVDSE8gICAgICAgICAgICAgICAgICAgIENPTVBJTEVSIE9OTFkKKykKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogJUJVSUxERElSJQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAlT1VURElSJQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBNS0RJUiAiJUJVSUxERElSJSIKKyAgQ0QgIiVCVUlMRERJUiUiIHx8IEVYSVQgL0IKKworICBDTUFLRS5FWEUgJX5kcDB0aHJpZnQgXgorICAgIC1HIiVHRU5FUkFUT1IlIiBeCisgICAgLURCSVNPTl9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9JUJVSUxEVFlQRSUgXgorICAgIC1ERkxFWF9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUgXgorICAgIC1EV0lUSF9NVD1PTiBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIHx8IEVYSVQgL0IKKworICBDRCAlQlVJTERESVIlCisKKyAgQ01BS0UuRVhFIC0tYnVpbGQgLiAtLWNvbmZpZyAlQlVJTERUWVBFJSAtLXRhcmdldCB0aHJpZnQtY29tcGlsZXIgfHwgRVhJVCAvQgorICBYQ09QWSAvRiAvWSAlQlVJTERESVIlXGJpblwlQlVJTERUWVBFJVx0aHJpZnQuZXhlICVPVVRESVIlCisKK0VORExPQ0FMCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LmJhdCBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjdhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LmJhdApAQCAtMCwwICsxLDE2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEdlbmVyYXRlcyBhIFZpc3VhbCBTdHVkaW8gc29sdXRpb24gZm9yIHRocmlmdCBhbmQgdGhlbiBidWlsZHMgaXQuCis6OiBBc3N1bWVzIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBoYXZlIGJlZW4gYnVpbHQgb3IgcGxhY2VkIGFscmVhZHkuCis6OgorOjogT3BlbiBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgb2YgeW91ciBjaG9vc2luZyBhbmQgdGhlbgorOjogcnVuIHRoaXMgc2NyaXB0LiAgCis6OgorOjogTm9ybWFsbHkgdGhlIHNjcmlwdCB3aWxsIHJ1biBjbWFrZSB0byBnZW5lcmF0ZSBhIHNvbHV0aW9uLCB0aGVuCis6OiBwZXJmb3JtIGEgYnVpbGQsIHRoZW4gcnVuIHRlc3RzIG9uIHRoZSBjb21wbGV0ZSB0aHJpZnQgbGlicmFyeQorOjogaW4gcmVsZWFzZSBtb2RlLgorOjoKKzo6IEZsYWdzIHlvdSBjYW4gdXNlIHRvIGNoYW5nZSB0aGlzIGJlaGF2aW9yOgorOjoKKzo6ICAgL0RFQlVHICAgICAgICAgICAgLSBkZWJ1ZyBpbnN0ZWFkIG9mIHJlbGVhc2UKKzo6ICAgL0lERSAgICAgICAgICAgICAgLSBsYXVuY2ggVmlzdWFsIFN0dWRpbyB3aXRoIGEgcGF0aCBzZXQKKzo6ICAgICAgICAgICAgICAgICAgICAgICB1cCBjb3JyZWN0bHkgdG8gcnVuIHRlc3RzIGluc3RlYWQgb2YKKzo6ICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtaW5nIGFueSBvdGhlciBhY3Rpb25zLCBpLmUuCis6OiAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllcyBzZXR0aW5nIHRoZSBuZXh0IHRocmVlIGZsYWdzCis6OiAgIC9OT0dFTkVSQVRFICAgICAgIC0gc2tpcCBjbWFrZSBnZW5lcmF0aW9uIC0gdXNlZnVsIGlmIHlvdQorOjogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYWxyZWFkeSBnZW5lcmF0ZWQgYSBzb2x1dGlvbiBhbmQganVzdAorOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gYnVpbGQKKzo6ICAgL05PQlVJTEQgICAgICAgICAgLSBza2lwIGNtYWtlIGJ1aWxkIC0gdXNlZnVsIGlmIHlvdSBqdXN0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBnZW5lcmF0ZSBhIHNvbHV0aW9uCis6OiAgIC9OT1RFU1QgICAgICAgICAgIC0gc2tpcCBjdGVzdCBleGVjdXRpb24KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCBzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9dGhyaWZ0CitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj1kZXYKK0lGIE5PVCBERUZJTkVEIFNPVVJDRV9ESVIgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMHRoaXJkcGFydHkKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEdFTkVSQVRPUiBmb3IgQ01ha2UgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Z2VuZXJhdG9yLmJhdCB8fCBFWElUIC9CCisKKzo6IERlZmF1bHRzCisKK0lGIE5PVCBERUZJTkVEIEJVSUxEVFlQRSBTRVQgQlVJTERUWVBFPVJlbGVhc2UKK1NFVCBPUFRfSURFPTAKK1NFVCBPUFRfQlVJTEQ9MQorU0VUIE9QVF9HRU5FUkFURT0xCitTRVQgT1BUX1RFU1Q9MQorCis6OiBBcHBseSBGbGFncworCitJRiAvSSAiJTEiID09ICIvREVCVUciICAgICAgICBTRVQgQlVJTERUWVBFPURlYnVnCitJRiAvSSAiJTIiID09ICIvREVCVUciICAgICAgICBTRVQgQlVJTERUWVBFPURlYnVnCitJRiAvSSAiJTMiID09ICIvREVCVUciICAgICAgICBTRVQgQlVJTERUWVBFPURlYnVnCitJRiAvSSAiJTEiID09ICIvSURFIiAgICAgICAgICBTRVQgT1BUX0lERT0xCitJRiAvSSAiJTIiID09ICIvSURFIiAgICAgICAgICBTRVQgT1BUX0lERT0xCitJRiAvSSAiJTMiID09ICIvSURFIiAgICAgICAgICBTRVQgT1BUX0lERT0xCitJRiAvSSAiJTEiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMiIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUzIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTEiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMiIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUzIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTEiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorSUYgL0kgIiUyIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKK0lGIC9JICIlMyIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCisKK0lGICVPUFRfSURFJSA9PSAxICgKKyAgU0VUIE9QVF9HRU5FUkFURT0wCisgIFNFVCBPUFRfQlVJTEQ9MAorICBTRVQgT1BUX1RFU1Q9MAorKQorCisgIFNFVCBCVUlMRERJUj0lfmRwMGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXAorICBTRVQgT1VURElSPSV+ZHAwZGlzdFwlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVwKKyAgU0VUIEJPT1NUX0xJQkRJUj1saWIlQVJDSDp+LTIsMiUtbXN2Yy0lQ09NUElMRVI6fi0zLDIlLjAKKyAgSUYgIiVCVUlMRFRZUEUlIiA9PSAiRGVidWciIChTRVQgWkxJQl9TVEFUSUNfU1VGRklYPWQpCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgIENvbmZpZ3VyYXRpb246ICVQQUNLQUdFX05BTUUlICVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiVCVUlMRFRZUEUlICIlR0VORVJBVE9SJSIKK0lGIERFRklORUQgQ09NUElMRVJPTkxZICgKKyAgRUNITyAgICAgICAgICAgICAgICAgICAgQ09NUElMRVIgT05MWQorKQorICBFQ0hPICAgQnVpbGQgRGlyZWN0b3J5OiAlQlVJTERESVIlCisgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICVPVVRESVIlCisgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPLworCitJRiAlT1BUX0lERSUgPT0gMSAoCisKKyAgQ0FMTCA6U0VUUlVOUEFUSCB8fCBFWElUIC9CCisgIENBTEwgREVWRU5WICIhQlVJTERESVIhQXBhY2hlIFRocmlmdC5zbG4iIHx8IEVYSVQgL0IKKyAgRVhJVCAvQgorICAKKykKKworICBNS0RJUiAiJUJVSUxERElSJSIKKyAgQ0QgIiVCVUlMRERJUiUiIHx8IEVYSVQgL0IKKworSUYgJU9QVF9HRU5FUkFURSUgPT0gMSAoCisKKyAgQ01BS0UuRVhFICV+ZHAwdGhyaWZ0IF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorICAgIC1EQklTT05fRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZSBeCisgICAgLURCT09TVF9ST09UPSVXSU4zUF9ST09UJVxkaXN0XGJvb3N0XyVUUF9CT09TVF9WRVJTSU9OJSBeCisgICAgLURCT09TVF9MSUJSQVJZRElSPSVXSU4zUF9ST09UJVxkaXN0XGJvb3N0XyVUUF9CT09TVF9WRVJTSU9OJVwlQk9PU1RfTElCRElSJSBeCisgICAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lT1VURElSJSBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSVCVUlMRFRZUEUlIF4KKyAgICAtREZMRVhfRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlIF4KKyAgICAtRElOVFRZUEVTX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcbXNpbnR0eXBlcyBeCisgICAgLURMSUJFVkVOVF9ST09UPSVXSU4zUF9ST09UJVxkaXN0XGxpYmV2ZW50LSVUUF9MSUJFVkVOVF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJSBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcZHluYW1pYyBeCisgICAgLURPUEVOU1NMX1VTRV9TVEFUSUNfTElCUz1PRkYgXgorICAgIC1EWkxJQl9MSUJSQVJZPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIgXgorICAgIC1EWkxJQl9ST09UPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUgXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgICAgLURXSVRIX1NUQVRJQ19MSUI9T04gfHwgRVhJVCAvQgorCispCisKK0lGICVPUFRfQlVJTEQlID09IDEgKAorCisgIENEICVCVUlMRERJUiUKKyAgQ01BS0UuRVhFIC0tYnVpbGQgLiAtLWNvbmZpZyAlQlVJTERUWVBFJSAtLXRhcmdldCBJTlNUQUxMIHx8IEVYSVQgL0IKKworKQorCitJRiAlT1BUX1RFU1QlID09IDEgKAorCisgIENBTEwgOlNFVFJVTlBBVEggfHwgRVhJVCAvQgorICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IFJVTl9URVNUUyB8fCBFWElUIC9CCisgIAorKQorCis6U0VUUlVOUEFUSAorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lXCVCT09TVF9MSUJESVIlCisgIFNFVCBQQVRIPSFQQVRIITslV0lOM1BfUk9PVCVcZGlzdFxvcGVuc3NsLSVUUF9PUEVOU1NMX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXGR5bmFtaWNcYmluCisgIFNFVCBQQVRIPSFQQVRIITslV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGJpbgorICBFWElUIC9CCisKK0VORExPQ0FMCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRhcmNoLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzBhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRhcmNoLmJhdApAQCAtMCwwICsxLDQ3IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogRGV0ZWN0IHRoZSBhcmNoaXRlY3R1cmUgd2UncmUgYnVpbGRpbmcgZm9yLgorOjogU2V0IHRoZSBBUkNIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6ICAgd2luMzIKKzo6ICAgeDY0Cis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBBUkNIIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBBUkNIIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBBUkNIICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIEFSQ0gKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIHg2NAorSUYgJUVSUk9STEVWRUwlID09IDAgKFNFVCBBUkNIPXg2NCkgRUxTRSAoU0VUIEFSQ0g9d2luMzIpCisKK0lGIE5PVCBERUZJTkVEIEFSQ0ggKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIGRldGVjdGVkIHRhcmdldCBhcmNoaXRlY3R1cmUgJUFSQ0glCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiIGZvciAlMSUiID4gbnVsCitFWElUIC9CICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Y29tcGlsZXIuYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Y29tcGlsZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDVkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQKQEAgLTAsMCArMSw1OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbi4KKzo6IFNldCB0aGUgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE1MCA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgMTYKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMDApCitDQUxMIDpDSEVDSyAxNworSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzExMCkKK0NBTEwgOkNIRUNLIDE4CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTIwKQorQ0FMTCA6Q0hFQ0sgMTkuMDAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxNDApCitDQUxMIDpDSEVDSyAxOS4xMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzE1MCkKKworSUYgTk9UIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgY29tcGlsZXIgZWRpdGlvbgorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIGRldGVjdGVkIGNvbXBpbGVyIGVkaXRpb24gICAgJUNPTVBJTEVSJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElLiIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Z2VuZXJhdG9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUyNzQyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Z2VuZXJhdG9yLmJhdApAQCAtMCwwICsxLDY5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluIGFuZCB0aGVuIAorOjogc2V0IHRoZSBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjoKKzo6ICBWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTUgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTIgMjAxMyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEzIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDExIDIwMTIgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMiBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTAgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJJQTY0Ii4KKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgR0VORVJBVE9SIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKzo6IFJlcXVpcmVzIGNsX3NldGFyY2guYmF0IHRvIGhhdmUgYmVlbiBleGVjdXRlZCBvciB0aGUgQVJDSCBlbnZpcm9ubWVudAorOjogdmFyaWFibGUgdG8gYmUgc2V0LgorOjoKKworSUYgIiVBUkNIJSIgPT0gIng2NCIgKFNFVCBHRU5BUkNIPSBXaW42NCkKKworSUYgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgR0VORVJBVE9SCisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyAxNgorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTAgMjAxMCVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE3CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMSAyMDEyJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTgKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEyIDIwMTMlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOS4wMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTQgMjAxNSVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE5LjEwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNSAyMDE3JUdFTkFSQ0glKQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgQ01ha2UgZ2VuZXJhdG9yIHRvIHVzZQorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIHVzaW5nIENNYWtlIGdlbmVyYXRvciAgICAgICAgJUdFTkVSQVRPUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJS4iID4gbnVsCitFWElUIC9CICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvdHB2ZXJzaW9ucy5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODBjODY4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvdHB2ZXJzaW9ucy5iYXQKQEAgLTAsMCArMSwyNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IFNldCB0aGUgdmVyc2lvbnMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIHVzZS4KKzo6CisKK0lGIE5PVCBERUZJTkVEIFRQX0JPT1NUX1ZFUlNJT04gICAgU0VUIFRQX0JPT1NUX1ZFUlNJT049MV82Ml8wCitJRiBOT1QgREVGSU5FRCBUUF9MSUJFVkVOVF9WRVJTSU9OIFNFVCBUUF9MSUJFVkVOVF9WRVJTSU9OPTIuMS43cmMyCitJRiBOT1QgREVGSU5FRCBUUF9PUEVOU1NMX1ZFUlNJT04gIFNFVCBUUF9PUEVOU1NMX1ZFUlNJT049MS4xLjBjCitJRiBOT1QgREVGSU5FRCBUUF9aTElCX1ZFUlNJT04gICAgIFNFVCBUUF9aTElCX1ZFUlNJT049MS4yLjkKKworRVhJVCAvQiAwCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0IGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY1MDVjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLWxpYmV2ZW50LmJhdApAQCAtMCwwICsxLDg2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciBsaWJldmVudCBvbiB3aW5kb3dzCis6OiBVc2UgbGliZXZlbnQgbWFzdGVyIGZyb20gZ2l0aHViIHdoaWNoIGhhcyBjbWFrZSBpbnRlZ3JhdGlvbgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlcgorOjoKKzo6IENyZWF0ZXMgYSBzdGF0aWMgbGluayBsaWJyYXJ5LgorOjogTGlua3MgYWdhaW5zdCBPcGVuU1NMIGFuZCB6bGliIHN0YXRpY2FsbHkuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgLi5cLi5cc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKKzo6IHVzZSAiYnVpbGQtbGliZXZlbnQuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgICAgICAgU0VUIEdFTkVSQVRPUj1OTWFrZSBNYWtlZmlsZXMKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPWxpYmV2ZW50CitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfTElCRVZFTlRfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFNPVVJDRURJUiAgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMC4uCisKK0ZPUiAlJVggSU4gKAorICBEZWJ1ZyAKKyAgUmVsZWFzZQorKSBETyAoCisgIFNFVCBCVUlMRFRZUEU9JSVYCisgIFNFVCBCVUlMRERJUj0lV0lOM1BfUk9PVCVcYnVpbGRcJVBBQ0tBR0VfTkFNRSVcJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSEKKyAgU0VUIE9VVERJUj0lV0lOM1BfUk9PVCVcZGlzdFwlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorCisgIElGICIhQlVJTERUWVBFISIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfTElCX1NVRkZJWD1kKQorCisgIFNFVCBDTUFLRV9ERUZTPV4KKyAgIC1ERVZFTlRfX0RJU0FCTEVfU0FNUExFUz1PTiBeCisgICAtREVWRU5UX19ESVNBQkxFX1RFU1RTPU9OIF4KKyAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgIC1ET1BFTlNTTF9ST09UX0RJUj0lV0lOM1BfUk9PVCVcZGlzdFxvcGVuc3NsLSVUUF9PUEVOU1NMX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhXGR5bmFtaWMgXgorICAgLURaTElCX0xJQlJBUlk9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxsaWJcemxpYiFaTElCX0xJQl9TVUZGSVghLmxpYiBeCisgICAtRFpMSUJfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgICAgICAgQnVpbGRpbmc6ICVQQUNLQUdFX05BTUUlIHYlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohQlVJTERUWVBFISAiJUdFTkVSQVRPUiUiCisgIEVDSE8gQ01ha2UgRGVmaW5pdGlvbnM6ICFDTUFLRV9ERUZTIQorICBFQ0hPICAgQnVpbGQgRGlyZWN0b3J5OiAhQlVJTERESVIhCisgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICFPVVRESVIhCisgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPLworCisgIElGIE5PVCBERUZJTkVEIE5PQVNLICgKKyAgICBDSE9JQ0UgL00gIkRvIHlvdSB3YW50IHRvIGJ1aWxkIHRoaXMgY29uZmlndXJhdGlvbj8gIiAvYyBZTgorICAgIElGICFFUlJPUkxFVkVMISBORVEgMSAoRVhJVCAvQiAhRVJST1JMRVZFTCEpCisgICkKKyAgCisgIE1LRElSICIhQlVJTERESVIhIgorICBDRCAiIUJVSUxERElSISIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAtRyIlR0VORVJBVE9SJSIgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0hT1VURElSISAtRENNQUtFX0JVSUxEX1RZUEU9IUJVSUxEVFlQRSEgIUNNQUtFX0RFRlMhICIlU09VUkNFRElSJSIgfHwgRVhJVCAvQgorICBOTUFLRSAvZk1ha2VmaWxlIGluc3RhbGwgfHwgRVhJVCAvQgorKQorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLW9wZW5zc2wuYmF0IGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLW9wZW5zc2wuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjcwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQKQEAgLTAsMCArMSwxMDYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBCdWlsZCBzY3JpcHQgZm9yIG9wZW5zc2wgb24gd2luZG93cworOjogb3BlbnNzbCB1c2VzIGFuIGluLXRyZWUgYnVpbGQgc28geW91IGhhdmUgdG8gY2xlYW4gYmV0d2VlbiBlYWNoIG9uZQorOjoKKzo6IFVzZXMgdGhlIGVudmlyb25tZW50IHNldCB1cCBieSBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgc2hvcnRjdXQKKzo6IHRvIHRhcmdldCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIKKzo6Cis6OiBJZiB5b3UgdXNlIExhdmFzb2Z0IEFkLUF3YXJlLCBkaXNhYmxlIGl0IGZvciB0aGlzIGJ1aWxkLiAgSXQgYmxvY2tzIHRoZSBjcmVhdGlvbgorOjogb2YgYW55IGZpbGUgbmFtZWQgImNsaWVudGhlbGxvdGVzdC5leGUiIGZvciB3aGF0ZXZlciByZWFzb24sIHdoaWNoIGJyZWFrcyB0aGUgYnVpbGQuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgLi5cLi5cc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKKzo6IHVzZSAiYnVpbGQtb3BlbnNzbC5iYXQgL3llcyIgdG8gc2tpcCB0aGUgcXVlc3Rpb24gcGFydAorSUYgL0kgIiUxIiA9PSAiL1lFUyIgICAgICAgICAgIFNFVCBOT0FTSz0xCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPW9wZW5zc2wKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9PUEVOU1NMX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VESVIgICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCitJRiAiJUFSQ0glIiA9PSAieDY0IiAoCisgIFNFVCBUT0RPPWRlYnVnLVZDLVdJTjY0QSBWQy1XSU42NEEKKykgRUxTRSAoCisgIFNFVCBUT0RPPWRlYnVnLVZDLVdJTjMyIFZDLVdJTjMyCispCisKK0ZPUiAlJVggSU4gKCAhVE9ETyEgKSBETyAoCisgIFNFVCBCVUlMRFRZUEU9JSVYCisgIEZPUiAlJVkgSU4gKAorICAgIG50CisgICAgbnRkbGwKKyAgKSBETyAoCisgICAgU0VUIExJQlRZUEU9JSVZCisKKyAgICBJRiAiIUJVSUxEVFlQRTp+MCw2ISIgPT0gImRlYnVnLSIgKAorICAgICAgU0VUIE9VVEJVSUxEVFlQRT1kZWJ1ZworICAgICAgU0VUIFpMSUJMSUJTVUZGSVg9ZAorICAgICkgRUxTRSAoCisgICAgICBTRVQgT1VUQlVJTERUWVBFPXJlbGVhc2UKKyAgICAgIFNFVCBaTElCTElCU1VGRklYPQorICAgICkKKworICAgIElGICIhTElCVFlQRSEiID09ICJudGRsbCIgKAorICAgICAgU0VUIEJVSUxEX09QVElPTlM9c2hhcmVkCisgICAgICBTRVQgT1VUTElCVFlQRT1keW5hbWljCisgICAgICBTRVQgWkxJQkxJQj16bGliIVpMSUJMSUJTVUZGSVghCisgICAgICBTRVQgWkxJQk9QVD16bGliLWR5bmFtaWMKKyAgICApIEVMU0UgKAorICAgICAgU0VUIEJVSUxEX09QVElPTlM9bm8tc2hhcmVkCisgICAgICBTRVQgT1VUTElCVFlQRT1zdGF0aWMKKyAgICAgIFNFVCBaTElCTElCPXpsaWJzdGF0aWMhWkxJQkxJQlNVRkZJWCEubGliCisgICAgICBTRVQgWkxJQk9QVD16bGliCisgICAgKQorCisgICAgU0VUIExJQj0lfmRwMC4uXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwhQ09NUElMRVIhXCFBUkNIIVxsaWI7IUxJQiEKKyAgICBTRVQgQlVJTERfT1BUSU9OUz0hQlVJTERfT1BUSU9OUyEgbm8tYXNtIG5vLXVuaXQtdGVzdCAhWkxJQk9QVCEgLS1vcGVuc3NsZGlyPXNzbCAtLXdpdGgtemxpYi1pbmNsdWRlPSV+ZHAwLi5cZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCFDT01QSUxFUiFcIUFSQ0ghXGluY2x1ZGUgLS13aXRoLXpsaWItbGliPSFaTElCTElCIQorICAgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIU9VVEJVSUxEVFlQRSFcIU9VVExJQlRZUEUhCisKKyAgICBFQ0hPLworICAgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEVDSE8gICAgICAgICAgQnVpbGRpbmc6ICVQQUNLQUdFX05BTUUlICVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFPVVRCVUlMRFRZUEUhOiFPVVRMSUJUWVBFISBbIUJVSUxEVFlQRSFdCisgICAgRUNITyBDb25maWd1cmUgT3B0aW9uczogIUJVSUxEX09QVElPTlMhCisgICAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICAgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEVDSE8vCisKKyAgICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgICBDSE9JQ0UgL00gIkRvIHlvdSB3YW50IHRvIGJ1aWxkIHRoaXMgY29uZmlndXJhdGlvbj8gIiAvYyBZTgorICAgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgICApCisKKyAgICBDRCAlU09VUkNFRElSJSB8fCBFWElUIC9CCisgICAgcGVybCBDb25maWd1cmUgIUJVSUxEVFlQRSEgLS1wcmVmaXg9IiFPVVRESVIhIiAhQlVJTERfT1BUSU9OUyEgfHwgRVhJVCAvQgorICAgIE5NQUtFIC9GTWFrZWZpbGUgaW5zdGFsbF9zdyB8fCBFWElUIC9CCisgICAgTk1BS0UgL0ZNYWtlZmlsZSBjbGVhbiB8fCBFWElUIC9CCisgICkKKykKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC16bGliLmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC16bGliLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDI3MjMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0CkBAIC0wLDAgKzEsNzUgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBCdWlsZCBzY3JpcHQgZm9yIHpsaWIgb24gd2luZG93cy4KKzo6IFVzZXMgdGhlIGVudmlyb25tZW50IHNldCB1cCBieSBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgc2hvcnRjdXQKKzo6IHRvIHRhcmdldCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgLi5cLi5cc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKKzo6IHVzZSAiYnVpbGQtemxpYi5iYXQgL3llcyIgdG8gc2tpcCB0aGUgcXVlc3Rpb24gcGFydAorSUYgL0kgIiUxIiA9PSAiL1lFUyIgICAgICAgICAgIFNFVCBOT0FTSz0xCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAgICAgICBTRVQgR0VORVJBVE9SPU5NYWtlIE1ha2VmaWxlcworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9emxpYgorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX1pMSUJfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFNPVVJDRV9ESVIgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMC4uCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0ZPUiAlJVggSU4gKAorICBEZWJ1ZyAKKyAgUmVsZWFzZQorKSBETyAoCisgIFNFVCBCVUlMRFRZUEU9JSVYCisgIFNFVCBCVUlMRERJUj0lV0lOM1BfUk9PVCVcYnVpbGRcJVBBQ0tBR0VfTkFNRSVcJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSEKKyAgU0VUIE9VVERJUj0lV0lOM1BfUk9PVCVcZGlzdFwlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSB2JVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IUJVSUxEVFlQRSEgIiVHRU5FUkFUT1IlIgorICBFQ0hPICAgQnVpbGQgRGlyZWN0b3J5OiAhQlVJTERESVIhCisgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICFPVVRESVIhCisgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPLworCisgIElGIE5PVCBERUZJTkVEIE5PQVNLICgKKyAgICBDSE9JQ0UgL00gIkRvIHlvdSB3YW50IHRvIGJ1aWxkIHRoaXMgY29uZmlndXJhdGlvbj8gIiAvYyBZTgorICAgIElGICFFUlJPUkxFVkVMISBORVEgMSAoRVhJVCAvQiAhRVJST1JMRVZFTCEpCisgICkKKworICBNS0RJUiAiIUJVSUxERElSISIKKyAgQ0QgIiFCVUlMRERJUiEiIHx8IEVYSVQgL0IKKworICBDTUFLRS5FWEUgLUciJUdFTkVSQVRPUiUiIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IU9VVERJUiEgLURDTUFLRV9CVUlMRF9UWVBFPSFCVUlMRFRZUEUhICIlU09VUkNFRElSJSIgfHwgRVhJVCAvQgorICBOTUFLRSAvZk1ha2VmaWxlIGluc3RhbGwgfHwgRVhJVCAvQgorCisgIElGICIhQlVJTERUWVBFISIgPT0gIkRlYnVnIiAoCisgICAgQ09QWSAiIUJVSUxERElSIVx6bGliZC5wZGIiICIhT1VURElSIVxiaW5cIiB8fCBFWElUIC9CCisgICkKKykKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGY3OTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjIxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguMTIpCisKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKK2lmKE1TVkMpCisgICAgIyBUaGUgd2luZmxleGJpc29uIGdlbmVyYXRvciBvdXRwdXRzIHNvbWUgbWFjcm9zIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUgVmlzdWFsIFN0dWRpbyAyMDEwIGNvcHkgb2Ygc3RkaW50LmgKKyAgICAjIFRoaXMgbWlnaHQgYmUgZml4ZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbywgYnV0IGFuIGVhc3kgc29sdXRpb24gaXMgdG8gaW5jbHVkZSBzdGRpbnQuaCBmaXJzdAorICAgIGlmKEhBVkVfU1RESU5UX0gpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9fU1REQ19GT1JNQVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoL0ZJInN0ZGludC5oIikKKyAgICBlbmRpZihIQVZFX1NURElOVF9IKQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoRkxFWCBSRVFVSVJFRCkKK2ZpbmRfcGFja2FnZShCSVNPTiBSRVFVSVJFRCkKKworIyBjcmVhdGUgZGlyZWN0b3J5IGZvciB0aHJpZnR5IGFuZCB0aHJpZnRsCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvKQorCisjIENyZWF0ZSBmbGV4IGFuZCBiaXNvbiBmaWxlcyBhbmQgYnVpbGQgdGhlIGxpYiBwYXJzZSBzdGF0aWMgbGlicmFyeQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQorQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCisKK3NldChwYXJzZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmhoCispCisKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IGNvbXBpbGVyCitzZXQoY29tcGlsZXJfY29yZQorICAgIHNyYy90aHJpZnQvY29tbW9uLmNjCisgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYworICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCisgICAgc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oCispCisKK3NldCh0aHJpZnQtY29tcGlsZXJfU09VUkNFUworICAgIHNyYy90aHJpZnQvbWFpbi5jYworICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKKykKKworc2V0KHRocmlmdF9jb21waWxlcl9MQU5HUworKQorCisjIFRoaXMgbWFjcm8gYWRkcyBhbiBvcHRpb24gVEhSSUZUX0NPTVBJTEVSXyR7TkFNRX0KKyMgdGhhdCBhbGxvd3MgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNlcnRhaW4gbGFuZ3VhZ2VzCittYWNybyhUSFJJRlRfQUREX0NPTVBJTEVSIG5hbWUgZGVzY3JpcHRpb24gaW5pdGlhbCkKKyAgICBzdHJpbmcoVE9VUFBFUiAiVEhSSUZUX0NPTVBJTEVSXyR7bmFtZX0iIGVuYWJsZXIpCisgICAgc2V0KHNyYyAic3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKKyAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQorICAgIGlmKCR7ZW5hYmxlcn0pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdC1jb21waWxlcl9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0X2NvbXBpbGVyX0xBTkdTICR7bmFtZX0pCisgICAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIFRoZSBmb2xsb3dpbmcgY29tcGlsZXIgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKK1RIUklGVF9BRERfQ09NUElMRVIoY19nbGliICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIHdpdGggR2xpYiIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGNwcCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQysrIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIiAgIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihhczMgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEFjdGlvblNjcmlwdCAzIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZGFydCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEYXJ0IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoaGF4ZSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXhlIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoY3NoYXJwICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocHkgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQeXRob24gMi4wIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocmIgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdWJ5IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocGhwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQSFAiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihlcmwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEVybGFuZyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGNvY29hICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgT2JqZWN0aXZlLUMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihzd2lmdCAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIFN3aWZ0IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoc3QgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBTbWFsbHRhbGsiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihvY2FtbCAgICJFbmFibGUgY29tcGlsZXIgZm9yIE9DYW1sIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoaHMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXNrZWxsIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoeHNkICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYU0QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihodG1sICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhUTUwgRG9jdW1lbnRhdGlvbiIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YVNjcmlwdCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzb24gICAgIkVuYWJsZSBjb21waWxlciBmb3IgSlNPTiIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmFtZSAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSBNRSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGRlbHBoaSAgIkVuYWJsZSBjb21waWxlciBmb3IgRGVscGhpIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZ28gICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHbyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGQgICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGx1YSAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgTHVhIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZ3YgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHcmFwaFZpeiIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHJzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVzdCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHhtbCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWE1MIiBPTikKKworIyBUaHJpZnQgaXMgbG9va2luZyBmb3IgaW5jbHVkZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeQorIyB3ZSBhbHNvIGFkZCB0aGUgY3VycmVudCBiaW5hcnkgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgZmlsZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IHNyYykKKworaWYoTk9UIERFRklORUQgV0lUSF9QTFVHSU4gT1IgTk9UICR7V0lUSF9QTFVHSU59KQorICAgIGxpc3QoQVBQRU5EIHRocmlmdC1jb21waWxlcl9TT1VSQ0VTICR7Y29tcGlsZXJfY29yZX0pCitlbmRpZigpCisKK2FkZF9leGVjdXRhYmxlKHRocmlmdC1jb21waWxlciAke3RocmlmdC1jb21waWxlcl9TT1VSQ0VTfSkKKworaWYoJHtXSVRIX1BMVUdJTn0pCisgICAgYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWJvb3RzdHJhcCAke2NvbXBpbGVyX2NvcmV9CisgICAgICAgIHNyYy90aHJpZnQvbWFpbi5jYworICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCisgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisgICAgKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtYm9vdHN0cmFwIHBhcnNlKQorCisgICAgc2V0KFBMVUdJTl9HRU5fU09VUkNFUworICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaAorICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaAorICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmNwcAorICAgICkKKworICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4pCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke1BMVUdJTl9HRU5fU09VUkNFU30KKyAgICAgICAgREVQRU5EUyB0aHJpZnQtYm9vdHN0cmFwIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKKyAgICAgICAgQ09NTUFORCB0aHJpZnQtYm9vdHN0cmFwIC1nZW4gY3BwCisgICAgICAgIC1vdXQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4KKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKKyAgICApCisKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2xpYi9jcHAvc3JjKQorCisgICAgaW5jbHVkZShUaHJpZnRNYWNyb3MpCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdGMKKyAgICAgICAgJHtjb21waWxlcl9jb3JlfQorICAgICAgICAke1BMVUdJTl9HRU5fU09VUkNFU30KKyAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmNjCisgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MKKyAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCisgICAgKQorICAgIFRBUkdFVF9JTkNMVURFX0RJUkVDVE9SSUVTX1RIUklGVCh0aHJpZnRjIFBVQkxJQyAke0Jvb3N0X0lOQ0xVREVfRElSU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdGMgdGhyaWZ0IFBVQkxJQykKKyAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh0aHJpZnQtY29tcGlsZXIgUFVCTElDIFRIUklGVF9FTkFCTEVfUExVR0lOKQorICAgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnQtY29tcGlsZXIgdGhyaWZ0YykKK2VuZGlmKCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdC1jb21waWxlciBQUk9QRVJUSUVTIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSBiaW4vKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdC1jb21waWxlciBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHRocmlmdCkKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1jb21waWxlciBwYXJzZSkKKworaW5zdGFsbChUQVJHRVRTIHRocmlmdC1jb21waWxlciBERVNUSU5BVElPTiBiaW4pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAjIEluc3RhbGwgdGhlIGhlYWRlcnMKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvY29tbW9uLmgiCisgICAgICAic3JjL3RocmlmdC9nbG9iYWxzLmgiCisgICAgICAic3JjL3RocmlmdC9sb2dnaW5nLmgiCisgICAgICAic3JjL3RocmlmdC9tYWluLmgiCisgICAgICAic3JjL3RocmlmdC9wbGF0Zm9ybS5oIgorICAgICAgIiR7Q01BS0VfQklOQVJZX0RJUn0vY29tcGlsZXIvY3BwL3RocmlmdC92ZXJzaW9uLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvYXVkaXQiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L2dlbmVyYXRlIikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3NldC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvcGFyc2UiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3BsdWdpbiIpCitpZihNU1ZDKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3dpbmRvd3MiKQorZW5kaWYoKQorZW5kaWYoKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQppbmRleCBjYmIxMmY1Li4wYjhlZjJlIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KKysrIGIvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCkBAIC0yMSwxMTMgKzIxLDE4NyBAQAogIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgogIyBkZXRhaWxzLgogCi1BTV9ZRkxBR1MgPSAtZAotQlVJTFRfU09VUkNFUyA9CitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworIyBOb3RlIG9uIHdoeSB3ZSBoYXZlIHNyYy90aHJpZnQgYW5kIHNyYy90aHJpZnQvcGx1Z2luIGRpcmVjdG9yaWVzOgorIyBTaW5jZSBBdXRvbWFrZSBzdXBwb3J0cyBvbmx5IG9uZSBzZXQgb2YgQlVJTFRfU09VUkNFUyBwZXIgZmlsZSBhbmQgZG9lcyBub3QgYWxsb3cKKyMgU1VCRElSUyBidWlsdCBiZWZvcmUgQlVJTFRfU09VUkNFUywgd2UgZW5kIHVwIHNlcGFyYXRlIE1ha2VmaWxlLmFtIGZvciBlYWNoIHNvdXJjZQorIyBjb2RlIGdlbmVyYXRpb24sIGkuZS4gbGV4LXlhY2MgYW5kIFRocmlmdCwgdG8gYWNoaWV2ZSBzdGFibGUgcGFyYWxsZWwgbWFrZS4KKworU1VCRElSUyA9IHNyYyBzcmMvdGhyaWZ0L3BsdWdpbiAuCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCiAKIGJpbl9QUk9HUkFNUyA9IHRocmlmdAogCi1ub2luc3RfTElCUkFSSUVTID0gbGlicGFyc2UuYQotCiB0aHJpZnRfT0JKRElSID0gb2JqCiAKLXRocmlmdF9TT1VSQ0VTID0gc3JjL21haW4uY2MgXAotICAgICAgICAgICAgICAgICBzcmMvbWQ1LmMgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9nbG9iYWxzLmggXAotICAgICAgICAgICAgICAgICBzcmMvbWFpbi5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BsYXRmb3JtLmggXAotICAgICAgICAgICAgICAgICBzcmMvbWQ1LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9kb2MuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3R5cGUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZW51bS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZWRlZi5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29udGFpbmVyLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9saXN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zZXQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X21hcC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc3RydWN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9maWVsZC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2VydmljZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3Byb2dyYW0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3Njb3BlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb25zdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS9wYXJzZS5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCitwbHVnaW5fZ2VuID0gc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmggXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5jcHAgXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKIAotaWYgVEhSSUZUX0dFTl9jX2dsaWIKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2NwcAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5famF2YQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2FzMwotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fY3NoYXJwCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9weQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9yYgotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9wZXJsCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fcGhwCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9lcmwKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2NvY29hCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3N0Ci10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX29jYW1sCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2hzCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3hzZAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5faHRtbAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2pzCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2phdmFtZQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwotZW5kaWYKK2NvbXBpbGVyX2NvcmUgPSAgc3JjL3RocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCAKKwordGhyaWZ0X1NPVVJDRVMgPSBzcmMvdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbWFpbi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaAorCisjIFNwZWNpZmljIGNsaWVudCBnZW5lcmF0b3Igc291cmNlCit0aHJpZnRfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCiAKIHRocmlmdF9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYwotdGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwKLXRocmlmdF9MREFERCA9IEBMRVhMSUJAIGxpYnBhcnNlLmEKK3RocmlmdF9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljIC1XZXJyb3IKK3RocmlmdF9MREFERCA9IEBMRVhMSUJAIHNyYy90aHJpZnQvbGlicGFyc2UuYQogCi1saWJwYXJzZV9hX0NQUEZMQUdTID0gLUkkKHNyY2Rpcikvc3JjCi1saWJwYXJzZV9hX0NYWEZMQUdTID0gLVdhbGwgLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQKK2lmICFXSVRIX1BMVUdJTgordGhyaWZ0X1NPVVJDRVMgKz0gJChjb21waWxlcl9jb3JlKQorZWxzZQogCi1saWJwYXJzZV9hX1NPVVJDRVMgPSBzcmMvdGhyaWZ0eS55eSBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0bC5sbAorbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0Yy5sYQogCi1FWFRSQV9ESVNUID0gUkVBRE1FCit0aHJpZnRfQ1BQRkxBR1MgKz0gLURUSFJJRlRfRU5BQkxFX1BMVUdJTj0xCit0aHJpZnRfTERBREQgKz0gbGlidGhyaWZ0Yy5sYQorCitub2Rpc3RfbGlidGhyaWZ0Y19sYV9TT1VSQ0VTID0gJChwbHVnaW5fZ2VuKQorbGlidGhyaWZ0Y19sYV9TT1VSQ0VTID0gJChjb21waWxlcl9jb3JlKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKKworCitsaWJ0aHJpZnRjX2xhX0NQUEZMQUdTID0gLUkkKHNyY2Rpcikvc3JjIC1Jc3JjIC1JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvc3JjIC1EVEhSSUZUX0VOQUJMRV9QTFVHSU49MQorbGlidGhyaWZ0Y19sYV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCitsaWJ0aHJpZnRjX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitpbmNsdWRlX3RocmlmdGRpciA9ICQoaW5jbHVkZWRpcikvdGhyaWZ0CitpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gc3JjL3RocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nbG9iYWxzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3ZlcnNpb24uaAorCitpbmNsdWRlX2F1ZGl0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvd2luZG93cworaW5jbHVkZV9hdWRpdF9IRUFERVJTID0gc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKKworaW5jbHVkZV9nZW5lcmF0ZWRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL2dlbmVyYXRlCitpbmNsdWRlX2dlbmVyYXRlX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggCisKK2luY2x1ZGVfcGFyc2VkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wYXJzZQoraW5jbHVkZV9wYXJzZV9IRUFERVJTID0gc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaAorCitpbmNsdWRlX3BsdWdpbmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3BsdWdpbgoraW5jbHVkZV9wbHVnaW5fSEVBREVSUyA9IHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCisKK2luY2x1ZGVfd2luZG93c2RpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3dpbmRvd3MKK2luY2x1ZGVfd2luZG93c19IRUFERVJTID0gc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCitlbmRpZgorCitXSU5ET1dTX0RJU1QgPSBcCisgICAgICAgICAgICAgY29tcGlsZXIuc2xuIFwKKyAgICAgICAgICAgICBjb21waWxlci52Y3hwcm9qIFwKKyAgICAgICAgICAgICBjb21waWxlci52Y3hwcm9qLmZpbHRlcnMKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKyAgICAgICAgICAgICBSRUFETUUubWQgXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICB0ZXN0IFwKKyAgICAgICAgICAgICAkKFdJTkRPV1NfRElTVCkKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgdGhyaWZ0bC5jYyB0aHJpZnR5LmNjIHRocmlmdHkuaCB2ZXJzaW9uLmgKKwkkKFJNKSB2ZXJzaW9uLmggJChwbHVnaW5fZ2VuKQogCi1zcmMvbWFpbi5jYzogdmVyc2lvbi5oCitzcmMvdGhyaWZ0L21haW4uY2M6IHNyYy90aHJpZnQvdmVyc2lvbi5oCisKK3N0eWxlLWxvY2FsOgorICAkKENQUFNUWUxFX0NNRCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9SRUFETUUgYi9jb21waWxlci9jcHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjEwMGE4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1UaHJpZnQgQ29kZSBDb21waWxlcgotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaHJpZnQgQ29kZSBDb21waWxlcgotPT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBjb21waWxlciB0YWtlcyB0aHJpZnQgZmlsZXMgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBvdXRwdXQgY29kZSBhY3Jvc3MKLXZhcmlvdXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBUbyBidWlsZCBhbmQgaW5zdGFsbCBpdCwgZG8gdGhpczoKLQotICAuL2Jvb3RzdHJhcC5zaAotICAuL2NvbmZpZ3VyZQotICBtYWtlCi0gIHN1ZG8gbWFrZSBpbnN0YWxsCi0KLUl0IHJlcXVpcmVzIHNvbWUgZm9ybSBvZiBMRVggYW5kIFlBQ0MgdG8gYmUgaW5zdGFsbGVkLCB3aGljaCBzaG91bGQgYmUKLXBpY2tlZCB1cCBieSBhdXRvY29uZi4KLQotTm90IG11Y2ggZWxzZSB0byByZXBvcnQgaGVyZS4gWW91J2xsIGhhdmUgdG8gbG9vayBhdCB0aGUgY29kZSB0byBnZXQgeW91cgotcXVlc3Rpb25zIGFuc3dlcmVkLiBPciBqdXN0IHJ1biB0aGUgZXhlY3V0YWJsZSBhZnRlciB5b3UgYnVpbGQgYW5kIHRha2UKLWEgbG9vayBhdCB0aGUgdXNhZ2UgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9SRUFETUUubWQgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWFjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTc1IEBACisjIEJ1aWxkIFRocmlmdCBJREwgY29tcGlsZXIgdXNpbmcgQ01ha2UKKworPCEtLSBUT0MgLS0+CisKKy0gW0J1aWxkIFRocmlmdCBJREwgY29tcGlsZXIgdXNpbmcgQ01ha2VdKCNidWlsZC10aHJpZnQtaWRsLWNvbXBpbGVyLXVzaW5nLWNtYWtlKQorICAgIC0gW0J1aWxkIG9uIFVuaXgtbGlrZSBTeXN0ZW1dKCNidWlsZC1vbi11bml4LWxpa2Utc3lzdGVtKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzXSgjcHJlcmVxdWlzaXRlcykKKyAgICAgICAgLSBbQnVpbGQgdXNpbmcgQ01ha2VdKCNidWlsZC11c2luZy1jbWFrZSkKKyAgICAgICAgICAgIC0gW0J1aWxkIHdpdGggRWNsaXBzZSBJREVdKCNidWlsZC13aXRoLWVjbGlwc2UtaWRlKQorICAgICAgICAgICAgLSBbQnVpbGQgd2l0aCBYQ29kZSBJREUgaW4gTWFjT1NdKCNidWlsZC13aXRoLXhjb2RlLWlkZS1pbi1tYWNvcykKKyAgICAgICAgICAgIC0gW1VzYWdlIG9mIG90aGVyIElERXNdKCN1c2FnZS1vZi1vdGhlci1pZGVzKQorICAgIC0gW0J1aWxkIG9uIFdpbmRvd3NdKCNidWlsZC1vbi13aW5kb3dzKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzXSgjcHJlcmVxdWlzaXRlcy0xKQorICAgICAgICAtIFtCdWlsZCB1c2luZyBHaXQgQmFzaF0oI2J1aWxkLXVzaW5nLWdpdC1iYXNoKQorICAgICAgICAtIFtVc2luZyBWaXN1YWwgU3R1ZGlvIGFuZCBXaW4gZmxleC1iaXNvbl0oI3VzaW5nLXZpc3VhbC1zdHVkaW8tYW5kLXdpbi1mbGV4LWJpc29uKQorICAgICAgICAtIFtDcm9zcyBjb21waWxlIHVzaW5nIG1pbmd3MzIgYW5kIGdlbmVyYXRlIGEgV2luZG93cyBJbnN0YWxsZXIgd2l0aCBDUGFja10oI2Nyb3NzLWNvbXBpbGUtdXNpbmctbWluZ3czMi1hbmQtZ2VuZXJhdGUtYS13aW5kb3dzLWluc3RhbGxlci13aXRoLWNwYWNrKQorLSBbT3RoZXIgY2FzZXNdKCNvdGhlci1jYXNlcykKKyAgICAtIFtCdWlsZGluZyB0aGUgVGhyaWZ0IElETCBjb21waWxlciBpbiBXaW5kb3dzIHdpdGhvdXQgQ01ha2VdKCNidWlsZGluZy10aGUtdGhyaWZ0LWlkbC1jb21waWxlci1pbi13aW5kb3dzLXdpdGhvdXQtY21ha2UpCistIFtVbml0IHRlc3RzIGZvciBjb21waWxlcl0oI3VuaXQtdGVzdHMtZm9yLWNvbXBpbGVyKQorICAgIC0gW1VzaW5nIGJvb3N0IHRlc3RdKCN1c2luZy1ib29zdC10ZXN0KQorICAgIC0gW1VzaW5nIENhdGNoIEMrKyB0ZXN0IGxpYnJhcnldKCN1c2luZy1jYXRjaC1jLXRlc3QtbGlicmFyeSkKKy0gW0hhdmUgYSBIYXBweSBmcmVlIHRpbWUgYW5kIGhvbGlkYXlzXSgjaGF2ZS1hLWhhcHB5LWZyZWUtdGltZS1hbmQtaG9saWRheXMpCisKKzwhLS0gL1RPQyAtLT4KKworIyMgQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbQorCisjIyMgUHJlcmVxdWlzaXRlcworLSBJbnN0YWxsIENNYWtlCistIEluc3RhbGwgZmxleCBhbmQgYmlzb24KKworIyMjIEJ1aWxkIHVzaW5nIENNYWtlCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC4uCittYWtlCitgYGAKKworIyMjIyBCdWlsZCB3aXRoIEVjbGlwc2UgSURFCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtZWMgJiYgY2QgY21ha2UtZWMKK2NtYWtlIC1HICJFY2xpcHNlIENEVDQgLSBVbml4IE1ha2VmaWxlcyIgLi4KK21ha2UKK2BgYAorCitOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLWVjIHVzaW5nIGVjbGlwc2UuCisKKyMjIyMgQnVpbGQgd2l0aCBYQ29kZSBJREUgaW4gTWFjT1MKKworLSBJbnN0YWxsL3VwZGF0ZSBmbGV4LCBiaXNvbiBhbmQgY21ha2Ugd2l0aCBicmV3CisKK2BgYAorYnJldyBpbnN0YWxsIGNtYWtlCiticmV3IGluc3RhbGwgYmlzb24KK2BgYAorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CisKK2BgYAorbWtkaXIgY21ha2UtYnVpbGQgJiYgY2QgY21ha2UtYnVpbGQKK2NtYWtlIC1HICJYY29kZSIgLURXSVRIX1BMVUdJTj1PRkYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyMgVXNhZ2Ugb2Ygb3RoZXIgSURFcworCitQbGVhc2UgY2hlY2sgbGlzdCBvZiBzdXBwb3J0ZWQgSURFIAorCitgYGAKK2NtYWtlIC0taGVscAorYGBgCisKKyMjIEJ1aWxkIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZSAtIGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLworLSBJbiBjYXNlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGhvdXQgR2l0IEJhc2ggLSBpbnN0YWxsIHdpbmZsZXhiaXNvbiAtIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIFZpc3VhbCBTdHVkaW8gLSBpbnN0YWxsIFZpc3VhbCBTdHVkaW8gCisgIC0gQmV0dGVyIHRvIHVzZSB0aGUgbGF0ZXN0IHN0YWJsZSBWaXN1YWwgU3R1ZGlvIENvbW11bml0eSBFZGl0aW9uIC0gaHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy93aGF0c25ldy8gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpIC0gTWljcm9zb2Z0IGFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgQ01ha2UgYW5kIGltcHJvdmluZyBpdCBpbiBWaXN1YWwgU3R1ZGlvCisKKyMjIyBCdWlsZCB1c2luZyBHaXQgQmFzaAorCitHaXQgQmFzaCBwcm92aWRlcyBmbGV4IGFuZCBiaXNvbgorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KK2NtYWtlIC0tYnVpbGQgLgorYGBgCisKKyMjIyBVc2luZyBWaXN1YWwgU3R1ZGlvIGFuZCBXaW4gZmxleC1iaXNvbgorCistIEdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZvciB2ZXJzaW9uIG9mIFZpc3VhbCBTdHVkaW8gd2hpY2ggeW91IGhhdmUgKCoqY21ha2UgLS1oZWxwKiogY2FuIHNob3cgbGlzdCBvZiBzdXBwb3J0YWJsZSBWUyB2ZXJzaW9ucyk6CistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmU6CitgYGAKK21rZGlyIGNtYWtlLXZzCitjZCBjbWFrZS12cworY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTUgMjAxNyIgLURXSVRIX1BMVUdJTj1PRkYgLi4KK2BgYAorLSBOb3cgb3BlbiB0aGUgZm9sZGVyIGNtYWtlLXZzIHVzaW5nIFZpc3VhbCBTdHVkaW8uCisKKyMjIyBDcm9zcyBjb21waWxlIHVzaW5nIG1pbmd3MzIgYW5kIGdlbmVyYXRlIGEgV2luZG93cyBJbnN0YWxsZXIgd2l0aCBDUGFjaworCitgYGAKK21rZGlyIGNtYWtlLW1pbmd3MzIgJiYgY2QgY21ha2UtbWluZ3czMgorY21ha2UgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSAtREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIC4uCitjcGFjaworYGBgCisKKyMgT3RoZXIgY2FzZXMKKworIyMgQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cyB3aXRob3V0IENNYWtlCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBDTWFrZSB5b3UgY2FuIHVzZSB0aGUgYWxyZWFkeSBhdmFpbGFibGUgVmlzdWFsIFN0dWRpbyAyMDEwIHNvbHV0aW9uLgorCitUaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGNvbnRhaW5zIHByZS1idWlsZCBjb21tYW5kcyB0byBnZW5lcmF0ZSB0aGUgdGhyaWZ0bC5jYywgdGhyaWZ0eS5jYyBhbmQgdGhyaWZ0eS5oaCBmaWxlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBjb21waWxlci4gCisKK1RoZXNlIGRlcGVuZCBvbiBiaXNvbiwgZmxleCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIHRvIHdvcmsgcHJvcGVybHkuCisKK0Rvd25sb2FkIGZsZXggJiBiaXNvbiBhcyBkZXNjcmliZWQgYWJvdmUuIAorCitQbGFjZSB0aGVzZSBiaW5hcmllcyBzb21ld2hlcmUgaW4gdGhlIHBhdGggYW5kIHJlbmFtZSB3aW5fZmxleC5leGUgYW5kIHdpbl9iaXNvbi5leGUgdG8gZmxleC5leGUgYW5kIGJpc29uLmV4ZSByZXNwZWN0aXZlbHkuCisKK0lmIHRoaXMgZG9lc24ndCB3b3JrIG9uIGEgc3lzdGVtLCB0cnkgdGhlc2UgbWFudWFsIHByZS1idWlsZCBzdGVwcy4KKworT3BlbiBjb21waWxlci5zbG4gYW5kIHJlbW92ZSB0aGUgUHJlLWJ1aWxkIGNvbW1hbmRzIHVuZGVyIHRoZSBwcm9qZWN0J3M6IFByb3BlcnRpZXMgLT4gQnVpbGQgRXZlbnRzIC0+IFByZS1CdWlsZCBFdmVudHMuCisKK0Zyb20gYSBjb21tYW5kIHByb21wdDoKK2BgYAorY2QgdGhyaWZ0L2NvbXBpbGVyL2NwcAorZmxleCAtbyBzcmNcdGhyaWZ0XHRocmlmdGwuY2Mgc3JjXHRocmlmdFx0aHJpZnRsLmxsCitgYGAKK0luIHRoZSBnZW5lcmF0ZWQgdGhyaWZ0bC5jYywgY29tbWVudCBvdXQgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitQbGFjZSBhIGNvcHkgb2YgYmlzb24uc2ltcGxlIGluIHRocmlmdC9jb21waWxlci9jcHAKK2BgYAorYmlzb24gLXkgLW8gInNyYy90aHJpZnQvdGhyaWZ0eS5jYyIgLS1kZWZpbmVzIHNyYy90aHJpZnQvdGhyaWZ0eS55eQorbW92ZSBzcmNcdGhyaWZ0XHRocmlmdHkuY2MuaGggIHNyY1x0aHJpZnRcdGhyaWZ0eS5oaAorYGBgCisKK0Jpc29uIG1pZ2h0IGdlbmVyYXRlIHRoZSB5YWNjIGhlYWRlciBmaWxlICJ0aHJpZnR5LmNjLmgiIHdpdGgganVzdCBvbmUgaCAiLmgiIGV4dGVuc2lvbjsgaW4gdGhpcyBjYXNlIHlvdSdsbCBoYXZlIHRvIHJlbmFtZSB0byAidGhyaWZ0eS5oIi4KKworYGBgCittb3ZlIHNyY1x0aHJpZnRcdmVyc2lvbi5oLmluIHNyY1x0aHJpZnRcdmVyc2lvbi5oCitgYGAKKworRG93bmxvYWQgaW50dHlwZXMuaCBmcm9tIHRoZSBpbnRlcndlYnMgYW5kIHBsYWNlIGl0IGluIGFuIGluY2x1ZGUgcGF0aAorbG9jYXRpb24gKGUuZy4gdGhyaWZ0L2NvbXBpbGVyL2NwcC9zcmMpLgorCitCdWlsZCB0aGUgY29tcGlsZXIgaW4gVmlzdWFsIFN0dWRpby4KKworIyBVbml0IHRlc3RzIGZvciBjb21waWxlcgorCisjIyBVc2luZyBib29zdCB0ZXN0CistIHBscyBjaGVjayAqKnRlc3QqKiBmb2xkZXIKKworIyMgVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeQorCitBZGRlZCBnZW5lcmljIHdheSB0byBjb3ZlciBjb2RlIGJ5IHRlc3RzIGZvciBtYW55IGxhbmd1YWdlcyAoeW91IGp1c3QgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBoZWFkZXIgZmlsZSBmb3IgZ2VuZXJhdG9yIGZvciB5b3VyIGxhbmd1YWdlIC0gZXhhbXBsZSBpbiAqKm5ldGNvcmUqKiBpbXBsZW1lbnRhdGlvbikKKworLSBwbHMgY2hlY2sgKip0ZXN0cyoqIGZvbGRlcgorCisjIEhhdmUgYSBIYXBweSBmcmVlIHRpbWUgYW5kIGhvbGlkYXlzIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwODk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNCBAQAorIyMgQ29tcGlsZXIgQ29kaW5nIFN0YW5kYXJkcworCisgKiBXaGVuIG1ha2luZyBzbWFsbCBjaGFuZ2UgLyBidWdmaXggLSBmb2xsb3cgc3R5bGUgYXMgc2VlbiBpbiBuZWFyYnkgY29kZS4KKyAqIFdoZW4gbWFraW5nIG1ham9yIHJlZmFjdG9yIGFuZCAvIG9yIGFkZGluZyBuZXcgZmVhdHVyZSAtIGZvbGxvdyBzdHlsZSBmb3IgQysrIGxpYnJhcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29tcGlsZXIuc2xuIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk2MWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnNsbgpAQCAtMCwwICsxLDIwIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJjb21waWxlciIsICJjb21waWxlci52Y3hwcm9qIiwgIns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvaiBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjhiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvagpAQCAtMCwwICsxLDI1MCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGF1ZGl0XHRfYXVkaXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29tbW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb29wX2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdsb2JhbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcbWFpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2Jhc2VfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29uc3RfdmFsdWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb250YWluZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9kb2MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9lbnVtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZW51bV92YWx1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2ZpZWxkLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZnVuY3Rpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9saXN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfbWFwLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfcHJvZ3JhbS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3Njb3BlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2VydmljZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3NldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3N0cnVjdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlZGVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBsYXRmb3JtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuaGgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHZlcnNpb24uaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGF1ZGl0XHRfYXVkaXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb21tb24uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfYXMzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jb2NvYV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY3BwX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X25ldGNvcmVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NfZ2xpYl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZGFydF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9lcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nb19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ3ZfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2hheGVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2phdmFfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X29jYW1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9wZXJsX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9waHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3B5X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcnNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9zd2lmdF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfeG1sX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxtYWluLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVxwYXJzZS5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlZGVmLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnRsLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnR5LmNjIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwubGwiIC8+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnR5Lnl5IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPmNvbXBpbGVyPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHdpbmRvd3NcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8VGFyZ2V0TmFtZT50aHJpZnQ8L1RhcmdldE5hbWU+CisgICAgPEV4ZWN1dGFibGVQYXRoPiQoRXhlY3V0YWJsZVBhdGgpO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcR2l0XGJpbjwvRXhlY3V0YWJsZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHdpbmRvd3NcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8VGFyZ2V0TmFtZT50aHJpZnQ8L1RhcmdldE5hbWU+CisgICAgPEV4ZWN1dGFibGVQYXRoPiQoRXhlY3V0YWJsZVBhdGgpO0M6XFByb2dyYW0gRmlsZXMgKHg4NilcR2l0XGJpbjwvRXhlY3V0YWJsZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcd2luZG93c1w7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxUYXJnZXROYW1lPnRocmlmdDwvVGFyZ2V0TmFtZT4KKyAgICA8RXhlY3V0YWJsZVBhdGg+JChFeGVjdXRhYmxlUGF0aCk7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxHaXRcYmluPC9FeGVjdXRhYmxlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcd2luZG93c1w7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxUYXJnZXROYW1lPnRocmlmdDwvVGFyZ2V0TmFtZT4KKyAgICA8RXhlY3V0YWJsZVBhdGg+JChFeGVjdXRhYmxlUGF0aCk7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxHaXRcYmluPC9FeGVjdXRhYmxlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Njg2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMTk5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X29vcF9nZW5lcmF0b3IuaCI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnbG9iYWxzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWFpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfYmFzZV90eXBlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29uc3QuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb25zdF92YWx1ZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnRhaW5lci5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2RvYy5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW0uaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9lbnVtX3ZhbHVlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZmllbGQuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9mdW5jdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2xpc3QuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9tYXAuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9wcm9ncmFtLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2NvcGUuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXJ2aWNlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc2V0LmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfc3RydWN0LmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGVkZWYuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGxhdGZvcm0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnR5LmhoIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHdpbmRvd3NcY29uZmlnLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcd2luZG93c1x2ZXJzaW9uLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YWU5ZDBhMTUtNTdhZS00ZjAxLTg3YTQtODFmNzkwMjQ5YjgzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InBhcnNlIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns1ZGYwMTZiYi01OTFiLTQyMGEtYTUzNS00MzMwZDkxODdmYmZ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iZ2VuZXJhdGUiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2I1YzYyNmFmLWFmYTUtNDMzYy04ZTEwLWVlNzM0NTMzY2I2OH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kYXJ0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaGF4ZV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2phdmFtZV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X29jYW1sX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9wZXJsX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9waHBfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3B5X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcnNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3N0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zd2lmdF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeHNkX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xtYWluLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHBhcnNlLmNjIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRsLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VcdF90eXBlZGVmLmNjIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2pzb25fZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS55eSIgLz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJjNWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK0FNX1lGTEFHUyA9IC1kCisKK0JVSUxUX1NPVVJDRVMgPSB0aHJpZnQvdGhyaWZ0eS5jYworCitub2luc3RfTElCUkFSSUVTID0gdGhyaWZ0L2xpYnBhcnNlLmEKKwordGhyaWZ0X2xpYnBhcnNlX2FfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKQordGhyaWZ0X2xpYnBhcnNlX2FfQ1hYRkxBR1MgPSAtV2FsbCAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZAorCit0aHJpZnRfbGlicGFyc2VfYV9TT1VSQ0VTID0gdGhyaWZ0L3RocmlmdHkueXkgXAorICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0L3RocmlmdGwubGwKKworY2xlYW4tbG9jYWw6CisJJChSTSkgdGhyaWZ0L3RocmlmdGwuY2MgdGhyaWZ0L3RocmlmdHkuY2MgdGhyaWZ0L3RocmlmdHkuaCB0aHJpZnQvdGhyaWZ0eS5oaAorCitpZiBXSVRIX1BMVUdJTgorbm9pbnN0X1BST0dSQU1TID0gdGhyaWZ0L3RocmlmdC1ib290c3RyYXAKKwordGhyaWZ0X3RocmlmdF9ib290c3RyYXBfU09VUkNFUyA9IFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2NvbW1vbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2NvbW1vbi5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9hdWRpdC90X2F1ZGl0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nbG9iYWxzLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZW51bS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2V0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9tYXAuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3N0cnVjdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zY29wZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvcGFyc2UuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvd2luZG93cy9jb25maWcuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC92ZXJzaW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9tYWluLmNjCisKK21haW4uY2M6IHZlcnNpb24uaAorCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9MREFERCA9IEBMRVhMSUJAIHRocmlmdC9saWJwYXJzZS5hCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1MzJlMS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2MTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEFTMyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfYXMzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9hczNfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYmluZGFibGUiKTsKLSAgICBiaW5kYWJsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tYXMzIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIC8vcmVtb3ZlZCAtLSBlcXVhbGl0eSxjb21wYXJlX3RvCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7Ci0gIC8vcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0gIAotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2FzM19kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBhczNfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBhczNfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAKLSAgYm9vbCBiaW5kYWJsZV87CQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEFzMyB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3R5cGVfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArCi0gICAgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5O1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBBczMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmFzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgYXMzX3BhY2thZ2UoKSA8PCBlbmRsOwotICAKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgLy8gQWRkIGFzMyBpbXBvcnRzCi0gIGZfZW51bSA8PCBzdHJpbmcoKSArCi0gICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0OyIgPDwgZW5kbCA8PAotICAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8Ci0gICAgICAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfZW51bSA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMSURfVkFMVUVTOlNldCA9IG5ldyBTZXQoIjsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gcG9wdWxhdGUgc2V0Ci0gICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZmlyc3RWYWx1ZSA9IGZhbHNlOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfZW51bSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMVUVTX1RPX05BTUVTOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBzY29wZV91cChmX2VudW0pOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGluZGVudChmX2VudW0pIDw8ICJWQUxVRVNfVE9fTkFNRVNbIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIl0gPSBcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0gIAotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKLSAgCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKLSAgCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5hcyI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfY29uc3RzKTsKLSAgZl9jb25zdHMgPDwgZW5kbDsKLSAgCi0gIGZfY29uc3RzIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLQotIAotICAKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PAotICAgIChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBjb25zdCAiKTsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotICAKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotICAKLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuYXMiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc3RydWN0KTsKLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLSAgCi0gIGZfc3RydWN0IDw8Ci0gICAgYXMzX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIAotICBpZiAoYmluZGFibGVfICYmICEgaXNfZXhjZXB0aW9uKSB7Ci0gICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOyIgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgbXguZXZlbnRzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7IiA8PCBlbmRsOwotICB9Ci0gIAotICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOwotICAKLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7IC8vIGVuZCBvZiBwYWNrYWdlCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgYm9vbCBiaW5kYWJsZSA9ICEgaXNfZXhjZXB0aW9uICYmICEgaW5fY2xhc3MgJiYgYmluZGFibGVfOwotCi0gIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PAotICAgICAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7Ci0gIH0KLSAgZWxzZSBpZiAoYmluZGFibGUpIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBjb25zdCBTVFJVQ1RfREVTQzpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtYXMzLCBwcml2YXRlIGZvciAtYXMzYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiX0ZJRUxEX0RFU0M6VEZpZWxkID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOmludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIG91dCA8PCBlbmRsOwotICAKLSAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpewotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOkJvb2xlYW4gPSBmYWxzZTsiIDw8ICBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLSAgCi0gIG91dCA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKLSAgCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PAotICAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBmaWVsZDpURmllbGQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCi0gICAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCi0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOyAgCi0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIAotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IAotICB9ICAKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgKHZvaWQpIHR5cGU7Ci0gICh2b2lkKSBjYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCkgdHlwZTsKLSAgKHZvaWQpIGNhcF9uYW1lOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRDppbnQsIHZhbHVlOiopOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50KToqIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCi0gIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEOmludCk6Qm9vbGVhbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgQXMzIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQotICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0gICAgICAgIAotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCk6IiA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcE5hbWUgPSB0bXAoInRocmlmdFByb3BlcnR5Q2hhbmdlIik7Ci0gICAgaWYgKGJpbmRhYmxlKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW0JpbmRhYmxlKGV2ZW50PVwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpXSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lCi0gICAgICA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8Ci0gICAgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7Ci0gICAgCi0gICAgaWYgKGJpbmRhYmxlKSB7Ci0gICAgICAvLyBXZSBoYXZlIHRvIHVzZSBhIGN1c3RvbSBldmVudCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCwgYmVjYXVzZSBpZiB5b3UgdXNlIHRoZSBkZWZhdWx0LAotICAgICAgLy8gdGhlIHNldHRlciBvbmx5IGdldHMgY2FsbGVkIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCAtIHRoaXMgbWVhbnMgY2FsbGluZyBmb28uc2V0SW50VmFsdWUoMCkKLSAgICAgIC8vIHdpbGwgbm90IGNhdXNlIGZvby5pc0ludFZhbHVlU2V0KCkgdG8gcmV0dXJuIHRydWUgc2luY2UgdGhlIHZhbHVlIG9mIGZvby5faW50VmFsdWUgd2Fzbid0IGNoYW5nZWQKLSAgICAgIC8vIHNvIHRoZSBzZXR0ZXIgd2FzIG5ldmVyIGNhbGxlZC4KLSAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIiIgPDwgcHJvcE5hbWUgPDwgIlwiKSk7IiA8PCBlbmRsOwotICAgICAgCi0gICAgICAvLyBIb3dldmVyLCBpZiB5b3UganVzdCB1c2UgYSBjdXN0b20gZXZlbnQsIHRoZW4gY29sbGVjdGlvbnMgd29uJ3QgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBlbGVtZW50cwotICAgICAgLy8gaW4gdGhlIGNvbGxlY3Rpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGV5IGxpc3RlZCBmb3IgUHJvcGVydHlDaGFuZ2VFdmVudHMuICBTbywgd2UgZGlzcGF0Y2ggYm90aC4KLSAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQuUFJPUEVSVFlfQ0hBTkdFKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk6Qm9vbGVhbiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpIHsKLSAgLy8gSWYgaXQncyBiaW5kYWJsZSwgaXQgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgc28gdG9TdHJpbmcgaXMgYW4gb3ZlcnJpZGUuCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGJpbmRhYmxlID8gIm92ZXJyaWRlICIgOiAiIikgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgcmV0OlN0cmluZyA9IG5ldyBTdHJpbmcoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdDpCb29sZWFuID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU6U3RyaW5nID0gIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyI8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgbWV0YURhdGFNYXA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIC8vIFBvcHVsYXRlIG1hcAotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCi0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOwotICAgICAgfQotCi0gICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgb3V0ICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFzMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfYXMzX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJUVHlwZS5WT0lEIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyA6IHJldHVybiAgICAiVFR5cGUuU1RSSU5HIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJUVHlwZS5CT09MIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJUVHlwZS5CWVRFIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiVFR5cGUuRE9VQkxFIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSl7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAgIAotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICAgIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICAgIGFzM190aHJpZnRfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIAotICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIkltcGwuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIAotICBmX3NlcnZpY2VfIDw8Ci0gIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgCi0gIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIlByb2Nlc3Nvci5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgCi0gIGZfc2VydmljZV8gPDwKLSAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICAKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAgIAotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kczsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiIDw8ICIoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2w9bnVsbCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBpcHJvdF86VFByb3RvY29sOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIG9wcm90XzpUUHJvdG9jb2w7IiAgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgc2VxaWRfOmludDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICAKLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DQUxMLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgIAotICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkVycm9yKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcih4KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcyhyZXN1bHQuc3VjY2Vzcyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlOlRFcnJvcikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIAotICAgICAgCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAifSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcihpZmFjZToiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIlBST0NFU1NfTUFQW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpZmFjZV86IiAgPDwgc2VydmljZV9uYW1lXyA8PCAiOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBjb25zdCBQUk9DRVNTX01BUDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6Qm9vbGVhbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/Ci0gIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKLSAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/Ci0gIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGZuOkZ1bmN0aW9uID0gUFJPQ0VTU19NQVBbbXNnLm5hbWVdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZuLmNhbGwodGhpcyxtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKTpGdW5jdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJyZXR1cm4gZnVuY3Rpb24oc2VxaWQ6aW50LCBpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6dm9pZCIKLSAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBhcmdzOiI8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0OiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoIChUaHJvd2FibGUgdGgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIkxPR0dFUi5lcnJvcihcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0aCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRNYXAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRTZXQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTGlzdCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KQotICAgIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKLSAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQotICAgIDw8ICIoIgotICAgIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKHZhciAiIDw8IGkgPDwgIjppbnQgPSAwOyAiIDw8Ci0gICAgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIiA8PCAiOyAiIDw8Ci0gICAgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7Ci0gICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICI6aW50ID0gMDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IGNvdW50ZXIgPDwgKyIrKzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgY291bnRlciA8PCAiKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLmxlbmd0aCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQXMzIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEFzMyB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7Ci0gICh2b2lkKSBpbl9pbml0OwotICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlNldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiQXJyYXkiOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gICh2b2lkKSBpbl9jb250YWluZXI7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJieXRlW10iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCb29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICB0aHJvdyAiaTY0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGFzMyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiTnVtYmVyIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgaWYgKCEgdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKLSAgICAgIGFyZ3VtZW50cyArPSAiLCAiOwotICAgIH0KLSAgICBhcmd1bWVudHMgKz0gIm9uRXJyb3I6RnVuY3Rpb24sIG9uU3VjY2VzczpGdW5jdGlvbiI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIAotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpOnZvaWQiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIi8qKlxuIiwKLSAgICAgICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfQotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHNzLnN0cigpLAotICAgICAgIiAqL1xuIik7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoYXMzLCAiQVMzIiwKLSIgICAgYmluZGFibGU6ICAgICAgICAgIEFkZCBbYmluZGFibGVdIG1ldGFkYXRhIHRvIGFsbCB0aGUgc3RydWN0IGNsYXNzZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmM3MDIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLXN0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotCi0vKioKLSAqIEMgY29kZSBnZW5lcmF0b3IsIHVzaW5nIGdsaWIgZm9yIEMgdHlwaW5nLgotICovCi1jbGFzcyB0X2NfZ2xpYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0KLSAgLyogY29uc3RydWN0b3IgKi8KLSAgdF9jX2dsaWJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZvcHRpb25fc3RyaW5nKSA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIC8qIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICAgIHRoaXMtPm91dF9kaXJfYmFzZV8gPSAiZ2VuLWNfZ2xpYiI7Ci0KLSAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLwotICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKLQotICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgewotICAgICAgdGhpcy0+bnNwYWNlID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKLSAgICB9IGVsc2UgewotICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KLSAgICAgIGNoYXIgKnRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKLSAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKLSAgICAgICAgICB0bXBbaV0gPSAnXyc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKLSAgICAgIGZyZWUodG1wKTsKLQotICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KLSAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgotICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcwotICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKLSAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcwotICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKLSAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKLSAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgotICAgICAgICovCi0gICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKLSAgICB9Ci0gIH0KLQotICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYgKnR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSAqdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCAqPiBjb25zdHMpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCAqdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCAqdHN0cnVjdCk7Ci0KLSBwcml2YXRlOgotCi0gIC8qIGZpbGUgc3RyZWFtcyAqLwotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgb2ZzdHJlYW0gZl9oZWFkZXJfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KLSAgc3RyaW5nIG5zcGFjZTsKLSAgc3RyaW5nIG5zcGFjZV91OwotICBzdHJpbmcgbnNwYWNlX3VjOwotICBzdHJpbmcgbnNwYWNlX2xjOwotCi0gIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlICp0dHlwZSk7Ci0gIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmPWZhbHNlLCBib29sIGlzX2NvbnN0PWZhbHNlKTsKLSAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlICp0eXBlKTsKLSAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUgKnR5cGUpOwotICBzdHJpbmcgY29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpOwotICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24gKnRmdW5jdGlvbik7Ci0gIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0ICp0c3RydWN0KTsKLSAgc3RyaW5nIHhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpOwotICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkICp0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBwb2ludGVyPWZhbHNlLCBib29sIGNvbnN0YW50PWZhbHNlLCBib29sIHJlZmVyZW5jZT1mYWxzZSk7Ci0KLSAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlICp0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlICp0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0ICp0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgdGhpc19uYW1lLCBzdHJpbmcgdGhpc19nZXQ9IiIsIGJvb2wgaXNfZnVuY3Rpb249dHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHRoaXNfbmFtZSwgc3RyaW5nIHRoaXNfZ2V0PSIiLCBib29sIGlzX2Z1bmN0aW9uPXRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsIHRfZmllbGQgKnRmaWVsZCwgc3RyaW5nIHByZWZpeCwgc3RyaW5nIHN1ZmZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9tYXAgKnRtYXAsIHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfc2V0ICp0c2V0LCBzdHJpbmcgZWxlbWVudCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X2xpc3QgKnRsaXN0LCBzdHJpbmcgbGlzdCwgc3RyaW5nIGluZGV4LCBpbnQgZXJyb3JfcmV0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsIHRfZmllbGQgKnRmaWVsZCwgc3RyaW5nIHByZWZpeCwgc3RyaW5nIHN1ZmZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwgdF90eXBlICp0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9tYXAgKnRtYXAsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfc2V0ICp0c2V0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9saXN0ICp0bGlzdCwgc3RyaW5nIHByZWZpeCwgc3RyaW5nIGluZGV4LCBpbnQgZXJyb3JfcmV0KTsKLQotICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSAqIHR0eXBlKTsKLSAgc3RyaW5nIGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlICogdHR5cGUpOyAKLX07Ci0KLS8qKgotICogUHJlcGFyZSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlCi0gKiBvdXRwdXQgc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvKiBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0KLSAgLyogY3JlYXRlIG91dHB1dCBmaWxlcyAqLwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmgiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuYyI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvKiBhZGQgdGhyaWZ0IGJvaWxlcnBsYXRlIGhlYWRlcnMgKi8KLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLyogaW5jbHVkZSBpbmNsdXNpb24gZ3VhcmQgKi8KLSAgZl90eXBlc18gPDwgCi0gICAgIiNpZm5kZWYgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8qIGluY2x1ZGUgYmFzZSB0eXBlcyAqLwotICBmX3R5cGVzXyA8PAotICAgICIvKiBiYXNlIGluY2x1ZGVzICovIiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxnbGliLW9iamVjdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0X3N0cnVjdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8cHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+IiA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovCi0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0gKj4gJmluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIvKiBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+ICZjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7Ci0gIGZfdHlwZXNfIDw8ICIvKiBjdXN0b20gdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY19pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIjaW5jbHVkZSAiIDw8IGNfaW5jbHVkZXNbaV0gPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBpbmNsdWRlIHRoZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX3UgPDwgCi0gICAgICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQuaD4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgIi8qIGJlZ2luIHR5cGVzICovIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogIEZpbmlzaCB1cCBnZW5lcmF0aW9uIGFuZCBjbG9zZSBhbGwgZmlsZSBzdHJlYW1zLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZSAKLSAgICAoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pKTsKLQotICAvKiBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQgKi8KLSAgZl90eXBlc18gPDwKLSAgICAiI2VuZGlmIC8qICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0ggKi8iIDw8IGVuZGw7Ci0KLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl90eXBlc19pbXBsXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFRocmlmdCB0eXBlZGVmIGluIEMgY29kZS4gIEZvciBleGFtcGxlOgotICogCi0gKiBUaHJpZnQ6IAotICogdHlwZWRlZiBtYXA8aTMyLGkzMj4gU29tZU1hcAotICogCi0gKiBDOiAKLSAqIHR5cGVkZWYgR0hhc2hUYWJsZSAqIFRocmlmdFNvbWVNYXA7Ci0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwKLSAgICAgICAgIiAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfSAKLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBDIGVudW1lcmF0aW9uLiAgRm9yIGV4YW1wbGU6Ci0gKgotICogVGhyaWZ0OgotICogZW51bSBNeUVudW0gewotICogICBPTkUgPSAxLAotICogICBUV08KLSAqIH0KLSAqCi0gKiBDOgotICogZW51bSBfVGhyaWZ0TXlFbnVtIHsKLSAqICAgVEhSSUZUX01ZX0VOVU1fT05FID0gMSwKLSAqICAgVEhSSUZUX01ZX0VOVU1fVFdPCi0gKiB9OwotICogdHlwZWRlZiBlbnVtIF9UaHJpZnRNeUVudW0gVGhyaWZ0TXlFbnVtOwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0gKnRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSkpOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUgKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSAqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAvKiBvdXRwdXQgZWFjaCBvZiB0aGUgZW51bWVyYXRpb24gZWxlbWVudHMgKi8KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfdHlwZXNfIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIGVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgVGhyaWZ0IGNvbnN0YW50cyBpbiBDIGNvZGUuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMgKHZlY3Rvcjx0X2NvbnN0ICo+IGNvbnN0cykgewotICBmX3R5cGVzXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfY29uc3QgKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZSk7Ci0gICAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWUpOwotICAgIHRfdHlwZSAqdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB0X2NvbnN0X3ZhbHVlICp2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiICIgPDwKLSAgICAgICAgICBjb25zdGFudF92YWx1ZSAobmFtZV9sYywgdHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAobmFtZV9sYywgdHlwZSwgdmFsdWUpOwotICB9Ci0KLSAgZl90eXBlc18gPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIFRocmlmdCBzdHJ1Y3RzIGluIEMgY29kZSwgYXMgR09iamVjdHMuICBFeGFtcGxlOgotICoKLSAqIFRocmlmdDoKLSAqIHN0cnVjdCBCb25rCi0gKiB7Ci0gKiAgIDE6IHN0cmluZyBtZXNzYWdlLAotICogICAyOiBpMzIgdHlwZQotICogfQotICoKLSAqIEMgR09iamVjdCBpbnN0YW5jZSBoZWFkZXI6Ci0gKiBzdHJ1Y3QgX1RocmlmdEJvbmsKLSAqIHsKLSAqICAgR09iamVjdCBwYXJlbnQ7Ci0gKgotICogICBnY2hhciAqIG1lc3NhZ2U7Ci0gKiAgIGdpbnQzMiB0eXBlOwotICogfTsKLSAqIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRCb25rIFRocmlmdEJvbmsKLSAqIC8vIC4uLiBhZGRpdGlvbmFsIEdPYmplY3QgYm9pbGVycGxhdGUgLi4uCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QgKHRfc3RydWN0ICp0c3RydWN0KSB7Ci0gIGZfdHlwZXNfIDw8ICIvKiBzdHJ1Y3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBDIGNvZGUgdG8gcmVwcmVzZW50IFRocmlmdCBzZXJ2aWNlcy4gIENyZWF0ZXMgYSBuZXcgR09iamVjdAotICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlICp0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIHN2Y25hbWVfdWMgPSB0aGlzLT5uc3BhY2VfdWMgKyB0b191cHBlcl9jYXNlKHN2Y25hbWVfdSk7Ci0gIHN0cmluZyBmaWxlbmFtZSA9IHRoaXMtPm5zcGFjZV9sYyArIHRvX2xvd2VyX2Nhc2Uoc3ZjbmFtZV91KTsKLQotICAvLyBtYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuaCI7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0KLSAgLy8gYWRkIGhlYWRlciBmaWxlIGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIGFkZCBhbiBpbmNsdXNpb24gZ3VhcmQKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcwotICBmX2hlYWRlcl8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfbGMgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgLy8gaWYgd2UgYXJlIGluaGVyaXRpbmcgZnJvbSBhbm90aGVyIHNlcnZpY2UsIGluY2x1ZGUgaXRzIGhlYWRlcgotICB0X3NlcnZpY2UgKmV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSkpIDw8ICIuaFwiIiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gYWRkIHRoZSBib2lsZXJwbGFjZSBoZWFkZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIGluY2x1ZGUgdGhlIGhlYWRlcnMKLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjaW5jbHVkZSA8c3RyaW5nLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGZpbGVuYW1lIDw8ICIuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdHMKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgKHRzZXJ2aWNlKTsKLQotICAvLyBnZW5lcmF0ZSB0aGUgc2VydmVyIG9iamVjdHMKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgKHRzZXJ2aWNlKTsKLQotICAvLyBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNlbmRpZiAvKiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IICovIiA8PCBlbmRsOwotCi0gIC8vIGNsb3NlIHRoZSBmaWxlcwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfaGVhZGVyXy5jbG9zZSgpOwotfQotCi0vKioKLSAqCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0KLSAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOwotCi0gIGZfdHlwZXNfIDw8ICIvKiBleGNlcHRpb24gKi8iIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBlbnVtIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfQ09ERSwiIDw8IGVuZGwgPDwKLSAgICAifSAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJFcnJvcjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIkdRdWFyayAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpOyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUiAoIiA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyaygpKSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAiLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBleGNlcHRpb25zICovIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0RPTUFJTiBcIiIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFya1wiIiA8PCBlbmRsIDw8Ci0gICAgIkdRdWFyayIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwKLSAgICAgICAgIl9FUlJPUl9ET01BSU4pOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBIRUxQRVIgRlVOQ1RJT05TICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdHR5cGUgaXMgbm90IGEgcHJpbWl0aXZlLgotICovCi1ib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfY29tcGxleF90eXBlKHRfdHlwZSAqdHR5cGUpIHsKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlICh0dHlwZSk7Ci0KLSAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKQotICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cnVjdCgpCi0gICAgICAgICB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQotICAgICAgICAgfHwgKHR0eXBlLT5pc19iYXNlX3R5cGUoKQotICAgICAgICAgICAgICYmICgoKHRfYmFzZV90eXBlICopIHR0eXBlKS0+Z2V0X2Jhc2UoKQotICAgICAgICAgICAgICAgICAgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSk7Ci19Ci0KLQotLyoqCi0gKiBNYXBzIGEgVGhyaWZ0IHRfdHlwZSB0byBhIEMgdHlwZS4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV9uYW1lICh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgaXNfY29uc3QpIHsKLSAgKHZvaWQpIGluX3R5cGVkZWY7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSAoKHRfYmFzZV90eXBlICopIHR0eXBlKTsKLQotICAgIGlmIChpc19jb25zdCkgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBibmFtZTsKLSAgICB9Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lOwotCi0gICAgdF9jb250YWluZXIgKnRjb250YWluZXIgPSAodF9jb250YWluZXIgKikgdHR5cGU7Ci0gICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlICoiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAvLyBzaW5jZSBhIHNldCByZXF1aXJlcyB1bmlxdWUgZWxlbWVudHMsIHVzZSBhIEdIYXNoVGFibGUsIGFuZAotICAgICAgLy8gcG9wdWxhdGUgdGhlIGtleXMgYW5kIHZhbHVlcyB3aXRoIHRoZSBzYW1lIGRhdGEsIHVzaW5nIGtleXMgZm9yCi0gICAgICAvLyB0aGUgYWN0dWFsIHdyaXRlcyBhbmQgcmVhZHMuCi0gICAgICAvLyBUT0RPOiBkaXNjdXNzIHdoZXRoZXIgb3Igbm90IHRvIGltcGxlbWVudCBUU2V0LCBUSGFzaFNldCBvciBHSGFzaFNldAotICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSAqIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIG90aGVyIGltcGxlbWVudGF0aW9ucyBiZXNpZGVzIEdQdHJBcnJheQotICAgICAgY25hbWUgPSAiR1B0ckFycmF5ICoiOwotICAgICAgdF90eXBlICpldHlwZSA9ICgodF9saXN0ICopIHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSBldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGNuYW1lID0gIkdBcnJheSAqIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaXNfY29uc3QpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gY25hbWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gY2hlY2sgZm9yIGEgbmFtZXNwYWNlCi0gIHN0cmluZyBwbmFtZSA9IHRoaXMtPm5zcGFjZSArIHR0eXBlLT5nZXRfbmFtZSgpOwotCi0gIGlmIChpc19jb21wbGV4X3R5cGUgKHR0eXBlKSkgewotICAgIHBuYW1lICs9ICIgKiI7Ci0gIH0KLQotICBpZiAoaXNfY29uc3QpIHsKLSAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcG5hbWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byBhIEMgcHJpbWl0aXZlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSAqdHlwZSkgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgICByZXR1cm4gIkdCeXRlQXJyYXkgKiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gImdjaGFyICoiOwotICAgICAgfQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiZ2Jvb2xlYW4iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiZ2ludDgiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJnaW50MTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJnaW50MzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJnaW50NjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJnZG91YmxlIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIgotICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgYSBtZW1iZXIgb2YgdGhlIFRocmlmdFR5cGUgQyBlbnVtZXJhdGlvbiBpbiB0aHJpZnRfcHJvdG9jb2wuaAotICogZm9yIGEgVGhyaWZ0IHR5cGUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSAodF90eXBlICp0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlICh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAiVF9TVFJJTkciOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRfQk9PTCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiVF9CWVRFIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gIlRfSTE2IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIlRfSTMyIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIlRfSTY0IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gIlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBjb25zdGFudC4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Y29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpIHsKLSAgb3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgLyogcHJpbWl0aXZlcyAqLwotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZW5kZXIgPDwgIlwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAxIDogMCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIgotICAgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSAodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbGlzdCgpCi0gICAgICAgICAgICAgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PAotICAgICAgdG9fbG93ZXJfY2FzZShuYW1lKSA8PCAiX2NvbnN0YW50KCkpIjsKLSAgfSBlbHNlIHsKLSAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgdF9zdHJ1Y3QqIHhsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHN0cmluZyBmbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotCi0gIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOwotICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gIHJldHVybgotICAgICJnYm9vbGVhbiAiICsgdGhpcy0+bnNwYWNlX2xjICsgZm5hbWUgKyAiICgiICsgdGhpcy0+bnNwYWNlCi0gICAgKyBzZXJ2aWNlX25hbWVfICsgIklmICogaWZhY2UiCi0gICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0IChhcmdsaXN0KSkpIAotICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCAoeGxpc3QpKSkKLSAgICArICIsIEdFcnJvciAqKiBlcnJvcikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCAodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSArICIgIiArCi0gICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgbXV0YWJsZSBleGNlcHRpb24gbGlzdHMKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp4Y2VwdGlvbl9saXN0ICh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIqICIgKwotICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIGluY2x1ZGluZyBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQgKnRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgaWYgKGNvbnN0YW50KSB7Ci0gICAgcmVzdWx0ICs9ICJjb25zdCAiOwotICB9Ci0gIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHBvaW50ZXIpIHsKLSAgICByZXN1bHQgKz0gIioiOwotICB9Ci0gIGlmIChyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIioiOwotICB9Ci0gIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IChnZG91YmxlKSAwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgaW50aWFsaXplciBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lICh0eXBlKSArICIpIDAiOwotICAgIH0KLSAgfQotCi0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IGluaXRpYWxpemVzIGNvbXBsZXggY29uc3RhbnRzLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpIHsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7Ci0gIHN0cmluZyB0eXBlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZS0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyB0eXBlX3VjID0gdG9fdXBwZXJfY2FzZSh0eXBlX3UpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9ICgodF9zdHJ1Y3QgKikgdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSAqLCB0X2NvbnN0X3ZhbHVlICo+ICZ2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlICosIHRfY29uc3RfdmFsdWUgKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIC8vIGluaXRpYWxpemUgYW55IGNvbnN0YW50cyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHRoaXMgaW5pdGlhbGl6ZXIKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlICpmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBmaWVsZF9uYW1lID0gdG1wIChmaWVsZF9uYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAiICAgIGNvbnN0YW50LT4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PAotICAgICAgICBjb25zdGFudF92YWx1ZSAobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICBjb25zdGFudC0+X19pc3NldF8iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PAotICAgICAgICAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgY29uc3RhbnQgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwKLSAgICAgICAgICB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICIgIHJldHVybiBjb25zdGFudDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBsaXN0X3R5cGUgPSAiR1B0ckFycmF5ICoiOwotICAgIHN0cmluZyBsaXN0X2luaXRpYWxpemVyID0gImdfcHRyX2FycmF5X25ldygpIjsKLSAgICBzdHJpbmcgbGlzdF9hcHBlbmRlciA9ICJnX3B0cl9hcnJheV9hZGQiOwotICAgIGJvb2wgbGlzdF92YXJpYWJsZSA9IGZhbHNlOwotCi0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIGV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGxpc3RfdHlwZSA9ICJHQXJyYXkgKiI7Ci0gICAgICAgICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUgKGV0eXBlKTsKLSAgICAgICAgICBsaXN0X2FwcGVuZGVyID0gImdfYXJyYXlfYXBwZW5kX3ZhbCI7Ci0gICAgICAgICAgbGlzdF92YXJpYWJsZSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmbmFtZSA9IHRtcCAobmFtZSk7Ci0KLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyIChmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7Ci0gICAgICBpZiAobGlzdF92YXJpYWJsZSkgewotICAgICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgICAiICAgICIgPDwgdHlwZV9uYW1lIChldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgICBjb25zdGFudF92YWx1ZSAoZm5hbWUsICh0X3R5cGUgKikgZXR5cGUsICgqdl9pdGVyKSkgPDwgIjsiIDw8Ci0gICAgICAgICAgICAgICAgZW5kbCA8PAotICAgICAgICAgICIgICAgIiA8PCBsaXN0X2FwcGVuZGVyIDw8ICIoY29uc3RhbnQsICIgPDwgZm5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5pdGlhbGl6ZXJzIDw8Ci0gICAgICAgICAgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChmbmFtZSwgKHRfdHlwZSAqKSBldHlwZSwgKCp2X2l0ZXIpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyAiIDw8IGxpc3RfdHlwZSA8PCBlbmRsIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbCA8PAotICAgICAgInsiIDw8IGVuZGwgPDwKLSAgICAgICIgIHN0YXRpYyAiIDw8IGxpc3RfdHlwZSA8PCAiIGNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgIiAgICBjb25zdGFudCA9ICIgPDwgbGlzdF9pbml0aWFsaXplciA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICIgIHJldHVybiBjb25zdGFudDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfc2V0ICopIHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUgKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAgKG5hbWUpOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKLSAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAiICAgICIgPDwgdHlwZV9uYW1lIChldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgY29uc3RhbnRfdmFsdWUgKGZuYW1lLCAodF90eXBlICopIGV0eXBlLCAoKnZfaXRlcikpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICYiIDw8IGZuYW1lIDw8ICIsICYiIDw8IGZuYW1lIDw8Ci0gICAgICAgICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAic3RhdGljIEdIYXNoVGFibGUgKiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOyAKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSAqa3R5cGUgPSAoKHRfbWFwICopIHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUgKnZ0eXBlID0gKCh0X21hcCAqKSB0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUgKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAgKG5hbWUpOwotICAgICAgc3RyaW5nIGtuYW1lID0gZm5hbWUgKyAia2V5IjsKLSAgICAgIHN0cmluZyB2bmFtZSA9IGZuYW1lICsgInZhbCI7Ci0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAoa25hbWUsIGt0eXBlLCAoKnZfaXRlcikpOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKHZuYW1lLCB2dHlwZSwgKCp2X2l0ZXIpKTsKLQotICAgICAgaW5pdGlhbGl6ZXJzIDw8Ci0gICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGt0eXBlKSA8PCAiICIgPDwga25hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICBjb25zdGFudF92YWx1ZSAoa25hbWUsICh0X3R5cGUgKikga3R5cGUsICgqdl9pdGVyKSkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICAiIDw8IHR5cGVfbmFtZSAodnR5cGUpIDw8ICIgIiA8PCB2bmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlICh2bmFtZSwgKHRfdHlwZSAqKSB2dHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAmIiA8PCBmbmFtZSA8PCAiLCAmIiA8PCBmbmFtZSA8PAotICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgIiAgICBjb25zdGFudCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICIgIHJldHVybiBjb25zdGFudDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgY2xpZW50LgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlICp0c2VydmljZSkgewotICAvKiBnZXQgc29tZSBDIGZyaWVuZGx5IHNlcnZpY2UgbmFtZXMgKi8KLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBkdW1teSBvYmplY3QgaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgaW50ZXJmYWNlICovIiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsgIiA8PAotICAgICAgICAiIC8qIGR1bW15IG9iamVjdCAqLyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBpbnRlcmZhY2Ugb2JqZWN0IGluIHRoZSBoZWFkZXIuCi0gIGZfaGVhZGVyXyA8PAotICAgICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBHVHlwZUludGVyZmFjZSBwYXJlbnQ7IiA8PCBlbmRsIDw8Ci0gIGVuZGw7Ci0KLSAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbnMgZm9yIHRoaXMgaW50ZXJmYWNlICovCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHRfdHlwZSAqdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QgKmFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QgKnhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0KLSAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lICh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0IChhcmdsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCAoeGxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBHRXJyb3IgKiplcnJvcikiOwotICAgICAgICAgICAgICAgICAgICAKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IGZ1bm5hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgYWxsIHRoZSBpbnRlcmZhY2UgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PAotICAgICAgICAiX2lmX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGICIgPDwKLSAgICAgICAgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSgpKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgIl9JRl9HRVRfSU5URVJGQUNFKGluc3QpIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0lOVEVSRkFDRSAoKGluc3QpLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSkpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyB3cml0ZSBvdXQgYWxsIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb24gcHJvdG90eXBlcwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwgImdib29sZWFuICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PAotICAgICAgICAgICAgICAgICAiX2lmXyIgPDwgZnVubmFtZSA8PCAiICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0IGluc3RhbmNlIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgY2xpZW50ICovIiA8PCBlbmRsIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50IiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBHT2JqZWN0IHBhcmVudDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICIgIFRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgIiA8PAotICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCi0gIGZfaGVhZGVyXyA8PAotICAgICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBHT2JqZWN0Q2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgIiA8PAotICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gQ3JlYXRlIGFsbCB0aGUgR09iamVjdCBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8IAotICAgICAgICAiX2NsaWVudF9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgIiA8PAotICAgICAgICAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSgpKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVChvYmopICIgPDwKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCkpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0NMQVNTKGMpICIgPDwgCi0gICAgICAgICIoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5ULCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVChvYmopICIgPDwKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8IAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0lTX0NMSUVOVF9DTEFTUyhjKSAiIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgIl9DTElFTlRfR0VUX0NMQVNTKG9iaikgIiA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiIDw8IGVuZGwgPDwgCi0gICAgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotCi0gICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcgKCJfY2xpZW50XyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VydmljZV9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24gKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9zZW5kXyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgLy8gaW1wbGVtZW50IHJlY3YgaWYgbm90IGEgb25ld2F5IHNlcnZpY2UKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyAocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZyAoIl9jbGllbnRfcmVjdl8iKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUgKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwgZW5kbDsKLSAgLy8gZW5kIG9mIGhlYWRlciBjb2RlCi0KLSAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHRfdHlwZSAqdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QgKmFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QgKnhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0KLSAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lICh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0IChhcmdsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCAoeGxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBHRXJyb3IgKiplcnJvcikiOwotCi0gICAgc3RyaW5nIHBhcmFtc193aXRob3V0X3R5cGUgPSBzdHJpbmcoImlmYWNlLCAiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICJfcmV0dXJuLCAiIDogIiIpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4mIGZpZWxkcyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcl9maWVsZDsKLSAgICBmb3IgKGZfaXRlcl9maWVsZCA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXJfZmllbGQgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcl9maWVsZCkgewotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKmZfaXRlcl9maWVsZCktPmdldF9uYW1lKCk7IAotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+JiB4Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiZ2Jvb2xlYW4iIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUgPDwgIiAiIDw8Ci0gICAgICAgICAgcGFyYW1zIDw8IGVuZGwgPDwKLSAgICAgICJ7IiA8PCBlbmRsIDw8IAotICAgICAgIiAgcmV0dXJuICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAgICJfSUZfR0VUX0lOVEVSRkFDRSAoaWZhY2UpLT4iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PAotICAgICAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgPDwgImVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCi0gIGZfc2VydmljZV8gPDwKLSAgICAiR1R5cGUiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgIiAgaWYgKHR5cGUgPT0gMCkiIDw8IGVuZGwgPDwKLSAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IiA8PCBlbmRsIDw8Ci0gICAgIiAgICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpLCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwgIC8qIGJhc2VfZmluYWxpemUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgIH07IiA8PCBlbmRsIDw8Ci0gICAgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR19UWVBFX0lOVEVSRkFDRSwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwKLSAgICAgICAgIklmXCIsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgYm9pbGVycGxhdGUKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwKLSAgICAgICAgIklmSW50ZXJmYWNlICppZmFjZSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgIkNsaWVudCwgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50LCIgPDwgZW5kbCA8PAotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgR19UWVBFX09CSkVDVCwgIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0KSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgcHJvcGVydGllcwotICBmX3NlcnZpY2VfIDw8Ci0gICAgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudFByb3BlcnRpZXMiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIFBST1BfMCwiIDw8IGVuZGwgPDwKLSAgICAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTCwiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHkgKCIgPDwKLSAgICAgICAgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIGNvbnN0IEdWYWx1ZSAqdmFsdWUsICIgPDwKLSAgICAgICAgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbCA8PAotICAgICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICIgICAgICBjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbCA8PAotICAgICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHkgKCIgPDwKLSAgICAgICAgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsICIgPDwKLSAgICAgICAgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5pbnB1dF9wcm90b2NvbCk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gIGVuZGw7Ci0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMgYW5kIGV4Y2VwdGlvbnMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uIChnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZyAoIl9jbGllbnRfc2VuZF8iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdW5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgCi0gICAgICAgICJfQ0xJRU5UIChpZmFjZSktPm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwKLSAgICAgICAgbmFtZSA8PCAiXCIsIFRfQ0FMTCwgY3NlcWlkLCBlcnJvcikgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIgKGZfc2VydmljZV8sIGFyZ19zdHJ1Y3QsICIiLCAiIiwgZmFsc2UpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImlmICghdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IAotICAgICAgICAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIGFzeW5jIGZ1bmN0aW9uCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MgKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcgKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLCAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlICgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImdpbnQzMiByc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJnY2hhciAqIGZuYW1lOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIiA8PCAKLSAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgIl9DTElFTlQgKGlmYWNlKS0+aW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luICIgPDwgCi0gICAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgJmZuYW1lLCAmbXR5cGUsICZyc2VxaWQsIGVycm9yKSA8IDApIiA8PAotICAgICAgICAgICAgICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVF9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOyIgPDwgZW5kbCA8PAotCi0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCBwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsIHhjZXB0aW9uLT50eXBlLCBcImFwcGxpY2F0aW9uIGVycm9yOiAlc1wiLCB4Y2VwdGlvbi0+bWVzc2FnZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAobXR5cGUgIT0gVF9SRVBMWSkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8IAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsIFwiaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQsIGV4cGVjdGVkIFRfUkVQTFlcIiwgbXR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKHN0cm5jbXAgKGZuYW1lLCBcIiIgPDwgbmFtZSA8PCAiXCIsICIgPDwgbmFtZS5sZW5ndGgoKSA8PCAiKSAhPSAwKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsIFwid3JvbmcgbWV0aG9kIG5hbWUgJXMsIGV4cGVjdGVkICIgPDwgbmFtZSA8PCAiXCIsIGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgIGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAgICAgewotICAgICAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiKl9yZXR1cm4iLCAwKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHJlYWRlcnMgZm9yIGV4Y2VwdGlvbnMsIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIuCi0gICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7Ci0gICAgICAgICAgdF9maWVsZCAqeGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKnhfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9rZXkoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCAoeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlciAoZl9zZXJ2aWNlXywgJnJlc3VsdCwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotICAgICAgLy8gY29weSBvdmVyIGFueSB0aHJvdyBleGNlcHRpb25zIGFuZCByZXR1cm4gZmFpbHVyZQotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCoiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIGdfc2V0X2Vycm9yIChlcnJvciwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwKLSAgICAgICAgICAgICAgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKSA8PAotICAgICAgICAgICAgICAiX0VSUk9SLCAiIDw8Ci0gICAgICAgICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PAotICAgICAgICAgICAgICB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpIDw8Ci0gICAgICAgICAgICAgICJfRVJST1JfQ09ERSwgXCIiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAKLSAgICAgICAgICAgICAgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nICgiX2NsaWVudF8iKSArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUgKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gd3JhcCBlYWNoIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICAgICAgICAgICAgIl9jbGllbnRfc2VuZF8iIDw8IGZ1bm5hbWUgPDwKLSAgICAgICIgKGlmYWNlIjsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+ICZmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIsIGVycm9yKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpZiBub3Qgb25ld2F5LCBpbXBsZW1lbnQgcmVjdgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJldCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiwgIjsKLQotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4mIHhjZXB0aW9ucyA9Ci0gICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgcmV0ICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgcmV0ICs9ICIsICI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICAgIl9jbGllbnRfcmVjdl8iIDw8IGZ1bm5hbWUgPDwKLSAgICAgICAgICAiIChpZmFjZSwgIiA8PCByZXQgPDwgImVycm9yKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gVFJVRSB3aGljaCBtZWFucyBhbGwgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIE9LCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIGludGVyZmFjZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIgIGlmYWNlLT4iIDw8IGZ1bm5hbWUgPDwgIiA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PAotICAgICAgICAiX2NsaWVudF8iIDw8IGZ1bm5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGNsaWVudCBpbnN0YW5jZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9pbml0ICgiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICIgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBjbGllbnQgY2xhc3MgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfY2xhc3NfaW5pdCAoIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgKmNscykiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbCA8PAotICAgICIgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8Ci0gICAgICAgIHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgICAgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaW5wdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpbnB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IGlucHV0IHByb3RvY29sXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgICAgIHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTCwgcGFyYW1fc3BlYyk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcIm91dHB1dF9wcm90b2NvbFwiLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm91dHB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IG91dHB1dCBwcm90b2NvbFwiLCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbCA8PAotICAgICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PAotICAgICAgICBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBzZXJ2ZXIuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAodF9zZXJ2aWNlICp0c2VydmljZSkgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLwotICBzdHJpbmcgc2VydmljZV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXyk7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV91KTsKLQotICAvLyB3cml0ZSB0aGUgc2VydmVyIG9iamVjdCBpbnN0YW5jZSBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCi0gIC8vIFRPRE86IGltcGxlbWVudCBhZnRlciBpbXBsZW1lbnQgVFNlcnZlciBhbmQgVFByb2Nlc3NvcgotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdG8gcmVwcmVzZW50IGEgVEhyaWZ0IHN0cnVjdHVyZSBhcyBhIEdPYmplY3QuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICAvLyB3cml0ZSB0aGUgaW5zdGFuY2UgZGVmaW5pdGlvbgotICBmX3R5cGVzXyA8PAotICAgICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgZW5kbCA8PAotICAgICJ7ICIgPDwgZW5kbCA8PAotICAgICIgIFRocmlmdFN0cnVjdCBwYXJlbnQ7ICIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICAvKiBwdWJsaWMgKi8iIDw8IGVuZGw7Ci0KLSAgLy8gZm9yIGVhY2ggZmllbGQsIGFkZCBhIG1lbWJlciB2YXJpYWJsZQotICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJm1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlICp0ID0gZ2V0X3RydWVfdHlwZSAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiAgIiA8PCB0eXBlX25hbWUgKHQpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiAgZ2Jvb2xlYW4gX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBjbG9zZSB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24gYW5kIGNyZWF0ZSBhIHR5cGVkZWYKLSAgZl90eXBlc18gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAvLyB3cml0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbgotICBmX3R5cGVzXyA8PAotICAgICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHdyaXRlIHRoZSBzdGFuZGFyZCBHT2JqZWN0IGJvaWxlcnBsYXRlCi0gIGZfdHlwZXNfIDw8Ci0gICAgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJfVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gc3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIC5jIGZpbGUKLSAgLy8gZ2VuZXJhdGUgc3RydWN0IEkvTyBtZXRob2RzCi0gIHN0cmluZyB0aGlzX2dldCA9IHRoaXMtPm5zcGFjZSArIG5hbWUgKyAiICogdGhpc19vYmplY3QgPSAiIAotICAgICAgICAgICAgICAgICAgICArIHRoaXMtPm5zcGFjZV91YyArIG5hbWVfdWMgKyAiKG9iamVjdCk7IjsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlciAoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIgKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsICJ0aGlzX29iamVjdC0+IiwgdGhpc19nZXQpOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBpbnN0YW5jZSBpbml0IGZ1bmN0aW9uCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAidm9pZCAiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICogb2JqZWN0KSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotCi0gIC8vIHNhdGlzZnkgY29tcGlsZXJzIHdpdGggLVdhbGwgdHVybmVkIG9uCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIi8qIHNhdGlzZnkgLVdhbGwgKi8iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAvLyBvbmx5IGhhdmUgaW5pdCdzIGZvciBiYXNlIHR5cGVzCi0gICAgICBzdHJpbmcgZHZhbCA9ICIgPSAiOwotICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSAodCkgKyAiKSI7Ci0gICAgICB9Ci0gICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICBkdmFsICs9IGNvbnN0YW50X3ZhbHVlICgiIiwgdCwgY3YpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZHZhbCArPSB0LT5pc19zdHJpbmcoKSA/ICJOVUxMIiA6ICIwIjsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIHR5cGVfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UKLSAgICAgICAgKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKTsKLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCB0eXBlX25hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgICAgaWYgKHQtPmlzX21hcCgpIHx8IHQtPmlzX3NldCgpKSB7Ci0gICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfbGlzdCAqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBzdHJpbmcgaW5pdF9mdW5jdGlvbiA9ICJnX3B0cl9hcnJheV9uZXcoKSI7Ci0KLSAgICAgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIGV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSAoZXR5cGUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZnVuY3Rpb24gPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBpZiBub3QgcmVxdWlyZWQsIGluaXRpYWxpemUgdGhlIF9faXNzZXQgdmFyaWFibGUgKi8KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPl9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gIGVuZGw7Ci0KLSAgLyogY3JlYXRlIHRoZSBkZXN0cnVjdG9yICovCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAidm9pZCAiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8Ci0gICAgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqdG9iamVjdCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSB0b2JqZWN0ICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0b2JqZWN0KTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7IAotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodC0+aXNfbWFwKCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUgKmV0eXBlID0gKCh0X2xpc3QgKikgdCktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgc3RyaW5nIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19wdHJfYXJyYXlfZnJlZSI7Ci0KLSAgICAgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIGV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6ICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19hcnJheV9mcmVlIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBkZXN0cnVjdG9yX2Z1bmN0aW9uIDw8ICIgKHRvYmplY3QtPiIgPDwgbmFtZSA8PAotICAgICAgICAgICAgICAgICAgICAgICAiLCBGQUxTRSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgInZvaWQgIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2NsYXNzX2luaXQgKFRocmlmdFN0cnVjdENsYXNzICogY2xzKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3R5cGVzX2ltcGxfIDw8ICAgCi0gICAgaW5kZW50KCkgPDwgIkdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xzLT5yZWFkID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xzLT53cml0ZSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX3dyaXRlOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJHVHlwZSIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgaWYgKHR5cGUgPT0gMCkgIiA8PCBlbmRsIDw8Ci0gICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSAiIDw8IGVuZGwgPDwKLSAgICAiICAgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyksIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAvKiBiYXNlX2ZpbmFsaXplICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIChHQ2xhc3NJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfY2xhc3NfaW5pdCwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogY2xhc3NfZmluYWxpemUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiksIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIDAsIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgIH07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKFRIUklGVF9UWVBFX1NUUlVDVCwgIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJUeXBlXCIsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgfSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGZ1bmN0aW9ucyB0byB3cml0ZSBUaHJpZnQgc3RydWN0dXJlcyB0byBhIHN0cmVhbS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+ICZmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3IgPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgaW50IGVycm9yX3JldCA9IDA7Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgZXJyb3JfcmV0ID0gLTE7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJnaW50MzIiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwKLSAgICAgICJfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7Ci0gIC8vIHNhdGlzZnkgLVdhbGwgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHkgc3RydWN0Ci0gIGlmICghdGhpc19nZXQuZW1wdHkoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodGhpc19vYmplY3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZSA8PCAiXCIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzX29iamVjdC0+X19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IFRSVUUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IAotCi0gICAgb3V0IDw8Ci0gICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgIHR5cGVfdG9fZW51bSAoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gd3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gcmVhZCBUaHJpZnQgc3RydWN0dXJlcyBmcm9tIGEgc3RyZWFtLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotICBpbnQgZXJyb3JfcmV0ID0gMDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3RvciA8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGVycm9yX3JldCA9IC0xOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLyogcmVhZHMgYSAiIDw8IG5hbWVfdSA8PCAiIG9iamVjdCAqLyIgPDwgZW5kbCA8PAotICAgICAgImdpbnQzMiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PAotICAgICAgICAgICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2NoYXIgKm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQxNiBmaWQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImd1aW50MzIgbGVuID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ3BvaW50ZXIgZGF0YSA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ2Jvb2xlYW4gaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHNvbWUgdmFyaWFibGVzCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2UgdGhlc2UgYXJlbid0IHVzZWQgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGxlbik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChkYXRhKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodGhpc19vYmplY3QpOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cnVjdHVyZSBtYXJrZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIndoaWxlICgxKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyByZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLCAmZmlkLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHN3aXRjaCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUKLSAgaW5kZW50KG91dCkgPDwKLSAgICAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gIC8vIHN0YXJ0IHN3aXRjaAotICBzY29wZV91cChvdXQpOwotCi0gIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtICgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIGRlZmF1bHQgY2FzZQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gIC8vIGVuZCBzd2l0Y2gKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIHJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotCi0gIC8vIGVuZCB3aGlsZSBsb29wCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZywgdGhyb3cgYW4gZXJyb3IKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgIFwibWlzc2luZyBmaWVsZFwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIC0xOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZW5kIHRoZSBmdW5jdGlvbi9zdHJ1Y3R1cmUKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCAqdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSAqdHlwZSA9IGdldF90cnVlX3R5cGUgKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0IChvdXQsICh0X3N0cnVjdCAqKSB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIgotICAgICAgICAgICAgICAgICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlICopIHR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8Ci0gICAgICAgICAgICAgICAgICAgIiktPmRhdGEsICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwKLSAgICAgICAgICAgICAgICAgICAiKS0+bGVuIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKSArIG5hbWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgKGdpbnQzMikgIiA8PCBuYW1lOwotICAgIH0KLSAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmICgiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgdHlwZV9uYW1lICh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXggPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSAqdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgbGVuZ3RoID0gImdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiICsgcHJlZml4ICsgIikiOwotICAgIHRfdHlwZSAqdGtleSA9ICgodF9tYXAgKikgdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUgKnR2YWwgPSAoKHRfbWFwICopIHR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgc3RyaW5nIHRrZXlfbmFtZSA9IHR5cGVfbmFtZSAodGtleSk7Ci0gICAgc3RyaW5nIHR2YWxfbmFtZSA9IHR5cGVfbmFtZSAodHZhbCk7Ci0gICAgc3RyaW5nIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0gICAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgICAvKgotICAgICAqIFNvbWUgdWdsaW5lc3MgaGVyZS4gIFRvIG1heGltaXplIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZQotICAgICAqIGF2b2lkIHVzaW5nIEdIYXNoVGFibGVJdGVyIGFuZCBpbnN0ZWFkIGdldCBhIEdMaXN0IG9mIGFsbCBrZXlzLAotICAgICAqIHRoZW4gY29weSBpdCBpbnRvIGEgYXJyYXkgb24gdGhlIHN0YWNrLCBhbmQgZnJlZSBpdC4KLSAgICAgKiBUaGlzIGlzIGJlY2F1c2Ugd2UgbWF5IGV4aXQgZWFybHkgYmVmb3JlIHdlIGdldCBhIGNoYW5jZSB0byBmcmVlIHRoZQotICAgICAqIEdMaXN0LgotICAgICAqLwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0gKHRrZXkpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtICh0dmFsKSA8PAotICAgICAgICAgICAgICAgICAgICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8ICIga2V5OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyIDw8ICIgdmFsdWU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8IAotICAgICAgICAgICAgICAgICAgICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8Ci0gICAgICAgICAgICAgICAgICAgIiBrZXlzW2dfbGlzdF9sZW5ndGggKGtleV9saXN0KV07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaW50IGk9MCwga2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBrZXlzW2krK10gPSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwKLSAgICAgICAgICAgICAgICAgICAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImtleSA9IGtleXNbaV07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFsdWUgPSAoIiA8PCB0dmFsX25hbWUgPDwgdHZhbF9wdHIgPDwKLSAgICAgICAgICAgICAgICAgICAiKSBnX2hhc2hfdGFibGVfbG9va3VwICgoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwKLSAgICAgICAgICAgICAgICAgICAiKSwgKGdwb2ludGVyKSBrZXkpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgKG91dCwgKHRfbWFwICopIHR0eXBlLCB0a2V5X3B0ciArICIga2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2YWxfcHRyICsgIiB2YWx1ZSIsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBsZW5ndGggPSAiZ19oYXNoX3RhYmxlX3NpemUgKChHSGFzaFRhYmxlICopICIgKyBwcmVmaXggKyAiKSI7Ci0gICAgdF90eXBlICp0ZWxlbSA9ICgodF9zZXQgKikgdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgc3RyaW5nIHRlbGVtX25hbWUgPSB0eXBlX25hbWUgKHRlbGVtKTsKLSAgICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgdHlwZV90b19lbnVtICh0ZWxlbSkgPDwgIiwgKGdpbnQzMikgIiA8PCBsZW5ndGggPDwKLSAgICAgICAgICAgICAgICAgICAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJncG9pbnRlciB2YWx1ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwKLSAgICAgICAgICAgICAgICAgICAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICJrZXlzW2dfbGlzdF9sZW5ndGggKGtleV9saXN0KV07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaW50IGk9MCwga2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBrZXlzW2krK10gPSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaT0wOyBpPGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZWxlbSA9IGtleXNbaV07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFsdWUgPSAoZ3BvaW50ZXIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8Ci0gICAgICAgICAgICAgICAgICAgcHJlZml4IDw8ICIpLCAoZ3BvaW50ZXIpIGVsZW0pOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgKG91dCwgKHRfc2V0ICopIHR0eXBlLCB0ZWxlbV9wdHIgKyAiZWxlbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGxlbmd0aCA9IHByZWZpeCArICItPmxlbiI7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0gKCgodF9saXN0ICopIHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PAotICAgICAgICAgICAgICAgICAgICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQgaTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGk9MDsgaTwiIDw8IGxlbmd0aCA8PCAiOyBpKyspIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50IChvdXQsICh0X2xpc3QgKikgdHR5cGUsIHByZWZpeCwgImkiLCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAgKnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X2ZpZWxkIGtmaWVsZCAodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAma2ZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQgKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWx1ZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQgKnRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfZmllbGQgZWZpZWxkICh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnQpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0ICp0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUgKnR0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKLQotICAvLyBjYXN0IHRvIG5vbi1jb25zdAotICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIKLSAgICAgICAgICAgICAgICArIGluZGV4ICsgIikiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7IAotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdib29sZWFuLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDgsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQxNiwgIiArIGluZGV4ICsgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDMyLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50NjQsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdkb3VibGUsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfQotCi0gIHRfZmllbGQgZWZpZWxkICh0dHlwZSwgbmFtZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAmZWZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci19Ci0KLS8qIGRlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLiAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCAqdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSAqdHlwZSA9IGdldF90cnVlX3R5cGUgKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0IChvdXQsICh0X3N0cnVjdCAqKSB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyIChvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkXyI7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUgKikgdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotCi0gICAgLy8gbG9hZCB0aGUgYnl0ZSBhcnJheSB3aXRoIHRoZSBkYXRhCi0gICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORwotICAgICAgICAmJiAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gZ19ieXRlX2FycmF5X25ldygpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnX2J5dGVfYXJyYXlfYXBwZW5kICgiIDw8IG5hbWUgPDwgIiwgKGd1aW50OCAqKSBkYXRhLCAoZ3VpbnQpIGxlbik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSAoZGF0YSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgdCA9IHRtcCAoImVjYXN0Iik7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ2ludDMyICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJiIgPDwgdCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lICh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYgKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lICh0eXBlKS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIGlmIHRoZSB0eXBlIGlzIG5vdCByZXF1aXJlZCBhbmQgdGhpcyBpcyBhIHRocmlmdCBzdHJ1Y3QgKG5vIHByZWZpeCksCi0gIC8vIHNldCB0aGUgaXNzZXQgdmFyaWFibGUuICBpZiB0aGUgdHlwZSBpcyByZXF1aXJlZCwgdGhlbiBzZXQgdGhlCi0gIC8vIGxvY2FsIHZhcmlhYmxlIGluZGljYXRpbmcgdGhlIHZhbHVlIHdhcyBzZXQsIHNvIHRoYXQgd2UgY2FuIGRvICAgIC8vIHZhbGlkYXRpb24gbGF0ZXIuCi0gIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmIHByZWZpeCAhPSAiIikgewotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiX19pc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCBzdWZmaXggPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0ICp0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXggPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyIChvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGtleV90eXBlOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgdmFsdWVfdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLCAmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICAvLyBpdGVyYXRlIG92ZXIgbWFwIGVsZW1lbnRzCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIG1hcCdzIGZpZWxkcyAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50IChvdXQsICh0X21hcCAqKSB0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgCi0gICAgLy8gcmVhZCBtYXAgZW5kCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGVuZCBtYXJrZXIgKi8iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXQgZWxlbWVudHMgKi8iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50IChvdXQsICh0X3NldCAqKSB0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIC8vIHJlYWQgc2V0IGVuZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGxpc3QgZWxlbWVudHMgKi8iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAob3V0LCAodF9saXN0ICopIHR0eXBlLCBwcmVmaXgsICJpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCAKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAgKnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSAqdGtleSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOwotICB0X3R5cGUgKnR2YWwgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKLSAgc3RyaW5nIHRrZXlfbmFtZSA9IHR5cGVfbmFtZSAodGtleSk7Ci0gIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUgKHR2YWwpOwotICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7Ci0KLSAgaWYgKHRrZXktPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwgIiAiIDw8IGtleW5hbWUgPDwgIiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiICIgPDwga2V5bmFtZSA8PCAodGtleV9wdHIgIT0gIiIgPyAiID0gZ19uZXcgKCIgKyB0a2V5X25hbWUgKyAiLCAxKSIgOiAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHZhbC0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0ciA8PCAiICIgPDwgdmFsbmFtZSA8PCAiID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyIDw8ICIgIiA8PCB2YWxuYW1lIDw8ICh0dmFsX3B0ciAhPSAiIiA/ICIgPSBnX25ldyAoIiArIHR2YWxfbmFtZSArICIsIDEpIiA6ICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGRlc2VyaWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIG1hcCBlbGVtZW50Ci0gIHRfZmllbGQgZmtleSAodGtleSwgdGtleV9wdHIgKyBrZXluYW1lKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKG91dCwgJmZrZXksICIiLCAiIiwgZXJyb3JfcmV0KTsKLSAgdF9maWVsZCBmdmFsICh0dmFsLCB0dmFsX3B0ciArIHZhbG5hbWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZnZhbCwgIiIsICIiLCBlcnJvcl9yZXQpOwotCi0gIC8vIGluc2VydCBpbnRvIHRoZSBoYXNodGFibGUuICBpZiB0aGUgZmllbGQgaXMgbm90IGEgcG9pbnRlciwgdGhlbiB1c2UKLSAgLy8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdC4KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgKHRrZXlfcHRyICE9ICIiID8gIiIgOiAiJiIpIDw8IGtleW5hbWUgPDwgIiwgKGdwb2ludGVyKSAiIDw8ICh0dmFsX3B0ciAhPSAiIiA/ICIiIDogIiYiKSA8PCB2YWxuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQgKnRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSAqdGVsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHN0cmluZyB0ZWxlbV9uYW1lID0gdHlwZV9uYW1lICh0ZWxlbSk7Ci0gIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGlmICh0ZWxlbS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbSA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbSIgPDwgKHRlbGVtX3B0ciAhPSAiIiA/ICIgPSBnX25ldyAoIiArIHRlbGVtX25hbWUgKyAiLCAxKSIgOiAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X2ZpZWxkIGZlbGVtICh0ZWxlbSwgdGVsZW1fcHRyICsgImVsZW0iKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSBlbGVtLCAoZ3BvaW50ZXIpIDEpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QgKnRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgKHZvaWQpIGluZGV4OwotICBzdHJpbmcgZWxlbSA9IHRtcCAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0gKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQgKCZmZWxlbSwgdHJ1ZSkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCk7Ci0KLSAgdF90eXBlICp0dHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJnX3B0cl9hcnJheV9hZGQgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgImdfYXJyYXlfYXBwZW5kX3ZhbCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8ICJnX3B0cl9hcnJheV9hZGQgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSAodF90eXBlICogdHR5cGUpIHsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3ICh0aHJpZnRfZ2Jvb2xlYW5faGFzaCwgdGhyaWZ0X2dib29sZWFuX2VxdWFsKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKHRocmlmdF9naW50OF9oYXNoLCB0aHJpZnRfZ2ludDhfZXF1YWwpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3ICh0aHJpZnRfZ2ludDE2X2hhc2gsIHRocmlmdF9naW50MTZfZXF1YWwpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3ICh0aHJpZnRfZ2ludDMyX2hhc2gsIHRocmlmdF9naW50MzJfZXF1YWwpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3ICh0aHJpZnRfZ2ludDY0X2hhc2gsIHRocmlmdF9naW50NjRfZXF1YWwpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3ICh0aHJpZnRfZ2RvdWJsZV9oYXNoLCB0aHJpZnRfZ2RvdWJsZV9lcXVhbCk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfQotICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyI7Ci19Ci0KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlICogdHR5cGUpIHsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2Jvb2xlYW4pKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQ4KSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQxNikpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50MzIpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDY0KSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdkb3VibGUpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3KCk7IjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9Ci0gIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3KCk7IjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFVwcGVyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgotICovCi1zdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcyAobmFtZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtIChzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b3VwcGVyKTsKLSAgcmV0dXJuIHM7Ci0vLyAgcmV0dXJuIGJvb3N0Ojp0b191cHBlcl9jb3B5IChuYW1lKTsKLX0KLQotLyoqCi0gKiBMb3dlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KLSAqLwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHMgKG5hbWUpOwotICBzdGQ6OnRyYW5zZm9ybSAocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0gIHJldHVybiBzOwotLy8gIHJldHVybiBib29zdDo6dG9fbG93ZXJfY29weSAobmFtZSk7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBzdHJpbmcgZnJpZW5kbHkgdG8gQyBjb2RlIHN0YW5kYXJkcyBieSBsb3dlcmNhc2luZyBhbmQgYWRkaW5nCi0gKiB1bmRlcnNjb3Jlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKLSAqCi0gKiBJbnB1dDogIlpvbWdDYW1lbENhc2UiCi0gKiBPdXRwdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCi0gKi8KLXN0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHJldDsKLSAgY29uc3QgY2hhciAqdG1wID0gbmFtZS5jX3N0cigpOwotICBpbnQgcG9zID0gMDsKLQotICAvKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzbid0IHVuZGVyc2NvcmVkIGlmIHVwcGVyY2FzZSwganVzdCBsb3dlcmNhc2VkICovCi0gIHJldCArPSB0b2xvd2VyICh0bXBbcG9zXSk7Ci0gIHBvcysrOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gcG9zOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgY2hhciBsYyA9IHRvbG93ZXIgKHRtcFtpXSk7IAotICAgIGlmIChsYyAhPSB0bXBbaV0pIHsKLSAgICAgIHJldCArPSAnXyc7Ci0gICAgfQotICAgIHJldCArPSBsYzsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIHJlZ2lzdGVyIHRoaXMgZ2VuZXJhdG9yIHdpdGggdGhlIG1haW4gcHJvZ3JhbSAqLwotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjX2dsaWIsICJDLCB1c2luZyBHTGliIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1MzdhYy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfY29jb2FfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibG9nX3VuZXhwZWN0ZWQiKTsKLSAgICBsb2dfdW5leHBlY3RlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7ICAgIAotICAgIAotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNvY29hIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0PWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbiAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24gKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWU9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGlzdE5hbWUpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXgoKTsKLSAgc3RkOjpzdHJpbmcgY29jb2FfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWY9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgY2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotICBzdGQ6OnN0cmluZyBjb250YWluZXJpemUodF90eXBlICogdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY29udGFpbmVyaXplKHRfZmllbGQgKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKTsKLSAgfQotCi0gcHJpdmF0ZToKLQotICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXhfOwotICBzdGQ6OnN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtIGZfaW1wbF87Ci0KLSAgYm9vbCBsb2dfdW5leHBlY3RlZF87Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgY29jb2FfcHJlZml4XyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpOwotCi0gIC8vIHdlIGhhdmUgYSAuaCBoZWFkZXIgZmlsZS4uLgotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IHByb2dyYW1fbmFtZV8rIi5oIjsKLSAgc3RyaW5nIGZfaGVhZGVyX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKStmX2hlYWRlcl9uYW1lOwotICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9mdWxsbmFtZS5jX3N0cigpKTsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgY29jb2FfaW1wb3J0cygpIDw8Ci0gICAgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICAvLyAuLi5hbmQgYSAubSBpbXBsZW1lbnRhdGlvbiBmaWxlCi0gIHN0cmluZyBmX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiLm0iOwotICBmX2ltcGxfLm9wZW4oZl9pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pbXBsXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgZW5kbDsKLQotICBmX2ltcGxfIDw8Ci0gICAgY29jb2FfaW1wb3J0cygpIDw8Ci0gICAgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKSA8PAotICAgICIjaW1wb3J0IFwiIiA8PCBmX2hlYWRlcl9uYW1lIDw8ICJcIiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgIiNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPlxuIiArCi0gICAgIlxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhyaWZ0IHJ1bnRpbWUgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0IHJ1bnRpbWUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV90aHJpZnRfaW1wb3J0cygpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygpICsKLSAgICAiI2ltcG9ydCA8VFByb3RvY29sLmg+XG4iICsKLSAgICAiI2ltcG9ydCA8VEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+XG4iICsKLSAgICAiI2ltcG9ydCA8VFByb3RvY29sVXRpbC5oPlxuIiArCi0gICAgIiNpbXBvcnQgPFRQcm9jZXNzb3IuaD5cbiIgKwotICAgICJcbiI7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiI2ltcG9ydCBcIiIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICIuaFwiIiArICJcbiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIEZpbmlzaCB1cCBnZW5lcmF0aW9uLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQotewotICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQotICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCi0gIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCi0gKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUKLSAqIGVudW0ga2V5d29yZCBpbiBPYmplY3RpdmUtQy4gIEZvciBuYW1lc3BhY2UgcHVycG9zZXMsIHRoZSBuYW1lIG9mCi0gKiB0aGUgZW51bSBwbHVzIGFuIHVuZGVyc2NvcmUgaXMgcHJlZml4ZWQgb250byBlYWNoIGVsZW1lbnQuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuICBQcmltaXRpdmUgdmFsdWVzCi0gKiBjb3VsZCBoYXZlIGJlZW4gcGxhY2VkIG91dHNpZGUgdGhpcyBjbGFzcywgYnV0IEkganVzdCBwdXQKLSAqIGV2ZXJ5dGhpbmcgaW4gZm9yIGNvbnNpc3RlbmN5LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3RfaW50ZXJmYWNlOwotICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiOwotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGludGVyZmFjZSAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8ICIgOiBOU09iamVjdCAiOwotICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOwotICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBkZWZpbmVkLgotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGNvbnN0X2ludGVyZmFjZSA8PAotICAgICAgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGVuZCI7Ci0KLSAgLy8gdGhpcyBnZXRzIHNwaXQgaW50byB0aGUgaGVhZGVyIGZpbGUgaW4gOjpjbG9zZV9nZW5lcmF0b3IKLSAgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPSBjb25zdF9pbnRlcmZhY2Uuc3RyKCk7Ci0KLSAgLy8gc3RhdGljIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgY29uc3RhbnQgdmFsdWVzCi0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZTsKLSAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbXBsXyA8PCBlbmRsOwotCi0gIGZfaW1wbF8gPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKLSAgZl9pbXBsXyA8PCAiKyAodm9pZCkgaW5pdGlhbGl6ZSAiOwotICBzY29wZV91cChmX2ltcGxfKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmdldF90eXBlKCktPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBzY29wZV9kb3duKGZfaW1wbF8pOwotCi0gIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9pbXBsXyA8PAotICAgICAgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZTsKLSAgICBzY29wZV91cChmX2ltcGxfKTsKLSAgICBpbmRlbnQoZl9pbXBsXykgPDwgInJldHVybiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfaW1wbF8pOwotICB9Ci0KLSAgZl9pbXBsXyA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIHByb3RlY3RlZCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGdldHRlcnMgYW5kIHNldHRlcnMuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHN0cnVjdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBOU0V4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0eGNlcHRpb24sIHRydWUpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIk5TRXhjZXB0aW9uICI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOU09iamVjdCAiOwotICB9Ci0gIG91dCA8PCAiPE5TQ29kaW5nPiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gbWVtYmVycyBhcmUgcHJvdGVjdGVkLiAgdGhpcyBpcyByZWR1bmRhbnQsIGJ1dCBleHBsaWNpdC4KLSAgLy8gIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICJAcHJvdGVjdGVkOiIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBtZW1iZXIgdmFyaWFsYmVzCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIpIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgLy8gaXNzZXQgZmllbGRzCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIkJPT0wgX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0OyIgPDwgIGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBwcm9wZXJ0aWVzCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgIiNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSkiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlcikgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGluaXRpYWxpemVyIGZvciBhbGwgZmllbGRzCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIGFuZCB3cml0ZQotICBvdXQgPDwgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKLSAqIGVhY2ggZmllbGQuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGgiOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICkgewotICAgIGlmIChtX2l0ZXIgPT0gbWVtYmVycy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PAotICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICsrbV9pdGVyOwotICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIgIjsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIGdldHRlciBhbmQgc2V0dGVyIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGZpZWxkcywgcGx1cyBhbgotICogSXNTZXQgZ2V0dGVyLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfZGVjbGFyYXRpb25zKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZCkgaXNfZXhjZXB0aW9uOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgZGVjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpbml0V2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKLSAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgCi17Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGhDb2RlcjogKE5TQ29kZXIgKikgZGVjb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0V2l0aENvZGVyOiBkZWNvZGVyXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChbZGVjb2RlciBjb250YWluc1ZhbHVlRm9yS2V5OiBAXCIiPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IlwiXSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIAotICAgIHsKLSAgICAgIG91dCA8PCAiW1tkZWNvZGVyIGRlY29kZU9iamVjdEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSByZXRhaW5dOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAodC0+aXNfZW51bSgpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdCktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKQotICAgICAgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVCb29sRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDMyRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQ2NEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlRG91YmxlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogICAgCi0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUgdGhyaWZ0IHR5cGU6ICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBlbmNvZGVXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAotICogdGhlIE5TQ29kaW5nIHByb3RvY29sCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSAKLXsKLSAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIGVuY29kZVdpdGhDb2RlcjogKE5TQ29kZXIgKikgZW5jb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGVuY29kZVdpdGhDb2RlcjogZW5jb2Rlcl07IiA8PCBlbmRsOwotICB9Ci0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfXyI8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwiX2lzc2V0KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIC8vb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZU9iamVjdDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgCi0gICAgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHQpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlQm9vbDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQzMjogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50NjQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZURvdWJsZTogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICAgIAotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZW5jb2RlIHRocmlmdCB0eXBlOiAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkKSBpbml0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3N1cGVyIGluaXRXaXRoTmFtZTogQFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiByZWFzb246IEBcInVua25vd25cIiB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmV0YWluXTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotICAKLSAgLy8gaW5pdFdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAvLyBlbmNvZGVXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOyAgCi0KLSAgLy8gZGVhbGxvYwotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewotICAgIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIltfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2NdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIGluZGVudChvdXQpIDw8ICJOU1N0cmluZyAqIGZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgZmllbGRUeXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZElEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltpblByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogJmZpZWxkTmFtZSB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6ICZmaWVsZElEXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZpZWxkVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgY2FsbF9maWVsZF9zZXR0ZXIoKmZfaXRlciwgImZpZWxkVmFsdWUiKSA8PCBlbmRsOwotICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFsbG9jYXRlZCBmaWVsZCwgcmVsZWFzZSBpdCBzaW5jZSB0aGUgc3RydWN0Ci0gICAgICAgIC8vIGlzIG5vdyByZXRhaW5pbmcgaXQKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIC8vIGRlc2VyaWFsaXplZCBzdHJpbmdzIGFyZSBhdXRvcmVsZWFzZSwgc28gZG9uJ3QgcmVsZWFzZSB0aGVtCi0gICAgICAgICAgaWYgKCEoZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJbZmllbGRWYWx1ZSByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IGZpZWxkIElEICVpIGhhcyB1bmV4cGVjdGVkIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZmllbGRJRCwgZmllbGRUeXBlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IHVuZXhwZWN0ZWQgZmllbGQgSUQgJWkgd2l0aCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGZpZWxkSUQsIGZpZWxkVHlwZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbaW5Qcm90b2NvbCByZWFkRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX18iKygqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsIHdoaWNoCi0gKiBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4gaWYgdGhleSBhcmUKLSAqIHNldCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgIihfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX18iKygqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0LgotICogZ2V0dGVyLCBzZXR0ZXIsIGlzc2V0IGdldHRlci4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgKHZvaWQpIGlzX2V4Y2VwdGlvbjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBmaWVsZF9uYW1lOwotICAgIGNhcF9uYW1lWzBdID0gdG91cHBlcihjYXBfbmFtZVswXSk7Ci0KLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICI7Ci0gICAgb3V0IDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBbW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluXSBhdXRvcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8Ci0gICAgICAiKSAiIDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0ID0gWUVTOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBJc1NldAotICAgIGluZGVudChvdXQpIDw8ICItIChCT09MKSAiIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlciAtIGRvIHdlIG5lZWQgdGhpcz8KLSAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIltfXyIgPDwgZmllbGRfbmFtZSA8PCAiIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmlsOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBOTzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiTlNNdXRhYmxlU3RyaW5nICogbXMgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IEBcIiIgPDwKLSAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCJdOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIsIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kRm9ybWF0OiBAXCIiIDw8IGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodHR5cGUpIDw8ICJcIiwgX18iIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIpXCJdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBPYmplY3RpdmUtQyB0aGlzIGNvbnNpc3RzIG9mIGEKLSAqIHByb3RvY29sIGRlZmluaXRpb24sIGEgY2xpZW50IGludGVyZmFjZSBhbmQgYSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaW1wbF8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzLCBmYWxzZSwgZmFsc2UpOyAgCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotICB9Ci19Ci0KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjcmVhdGUgYSByZXN1bHQgc3RydWN0IHdpdGggYSBzdWNjZXNzIGZpZWxkIG9mIHRoZSByZXR1cm4gdHlwZSwKLSAgLy8gYW5kIGEgZmllbGQgZm9yIGVhY2ggdHlwZSBvZiBleGNlcHRpb24gdGhyb3duCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0ZnVuY3Rpb24pKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHRoZSByZXN1bHQgc3RydWN0Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOyAgCi19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PAotICAgICAgIiAgLy8gdGhyb3dzICI7Ci0gICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7Ci0gICAgfQotICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgOiBOU09iamVjdCA8IiA8PAotICAgIGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIjsKLQotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yIHRoZQotICogc2VydmljZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIjsKLSAgCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCI+IG1TZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtTWV0aG9kTWFwOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZDwiPDxjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZXJzCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzZWxmIGluaXRXaXRoSW5Qcm90b2NvbDogcHJvdG9jb2wgb3V0UHJvdG9jb2w6IHByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuSW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBhbk91dFByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5Qcm90b2NvbCA9IFthbkluUHJvdG9jb2wgcmV0YWluXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0UHJvdG9jb2wgPSBbYW5PdXRQcm90b2NvbCByZXRhaW5dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gZGVhbGxvYwotICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVsZWFzZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2NdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PAotICAgICAgIiB0eXBlOiBUTWVzc2FnZVR5cGVfQ0FMTCIgPDwKLSAgICAgICIgc2VxdWVuY2VJRDogMF07IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBhcmdzbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICAgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgZmllbGROYW1lIDw8ICIgIT0gbmlsKSI7Ci0gICAgICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmaWVsZE5hbWUgPDwgIlwiIgotICAgICAgICAiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PAotICAgICAgICAiIGZpZWxkSUQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmbGRfaXRlciwgZmllbGROYW1lKTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBNZXNzYWdlIHZhbGlkYXRpb24gaGVyZSwgd2FzIHRoZSBzZXFpZCBldGMgb2s/Ci0KLSAgICAgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW50IG1zZ1R5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IG5pbCB0eXBlOiAmbXNnVHlwZSBzZXF1ZW5jZUlEOiBOVUxMXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2dUeXBlID09IFRNZXNzYWdlVHlwZV9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgQHRocm93IHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICAvLyBGSVhNRSAtIGNvdWxkIG9wdGltaXplIGhlcmUgdG8gcmVkdWNlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzLgotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZSA8PCAiICogcmVzdWx0ID0gW1tbIiA8PCBjb2NvYV9wcmVmaXhfIDw8Ci0gICAgICAgIHJlc3VsdG5hbWUgPDwgIiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbcmVzdWx0IHJlYWQ6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChbcmVzdWx0IHN1Y2Nlc3NJc1NldF0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gW3Jlc3VsdCBzdWNjZXNzXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChbcmVzdWx0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldF0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgW3Jlc3VsdCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJAdGhyb3cgW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIl07IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbc2VsZiBzZW5kXyIgPDwgZnVubmFtZTsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIjogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgb3V0IDw8Ci0gICAgICAgICJbc2VsZiByZWN2XyIgPDwgZnVubmFtZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4gIEluIG90aGVyIHdvcmRzIHRoZSBhY3R1YWwgVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgotICogZm9yIHRoZSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgLy8gaW5pdGlhbGl6ZXIKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXNlbGYpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm1TZXJ2aWNlID0gW3NlcnZpY2UgcmV0YWluXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibU1ldGhvZE1hcCA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XSByZXRhaW5dOyIgPDwgZW5kbDsKLSAgCi0gIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlNFTCBzID0gQHNlbGVjdG9yKHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6aW5Qcm90b2NvbDpvdXRQcm90b2NvbDopOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTWV0aG9kU2lnbmF0dXJlICogc2lnID0gW3NlbGYgbWV0aG9kU2lnbmF0dXJlRm9yU2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBzaWddOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHNldFNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiByZXRhaW5Bcmd1bWVudHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHNldFZhbHVlOiBpbnZvY2F0aW9uIGZvcktleTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAvLyBwcm9jZXNzb3IKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8Ijw8Y29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFtbbVNlcnZpY2UgcmV0YWluXSBhdXRvcmVsZWFzZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFByb2Nlc3MgbWV0aG9kLCB3aGljaCBkaXNwYXRjaGVzIHRoZSBpbmNvbWluZyBjYWxsIHVzaW5nIHRoZSBtZXRob2QgbWFwCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TU3RyaW5nICogbWVzc2FnZU5hbWU7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaW50IG1lc3NhZ2VUeXBlOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGludCBzZXFJRDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogJm1lc3NhZ2VOYW1lIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICZtZXNzYWdlVHlwZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAmc2VxSURdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbbU1ldGhvZE1hcCB2YWx1ZUZvcktleTogbWVzc2FnZU5hbWVdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIChpbnZvY2F0aW9uID09IG5pbCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IFRUeXBlX1NUUlVDVCBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqIHggPSBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQFwiSW52YWxpZCBtZXRob2QgbmFtZTogJyVAJ1wiLCBtZXNzYWdlTmFtZV1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IG1lc3NhZ2VOYW1lIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFt4IHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAvLyBOU0ludm9jYXRpb24gZG9lcyBub3QgY29uZm9ybSB0byBOU0NvcHlpbmcgcHJvdG9jb2wiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogW2ludm9jYXRpb24gbWV0aG9kU2lnbmF0dXJlXV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0U2VsZWN0b3I6IFtpbnZvY2F0aW9uIHNlbGVjdG9yXV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZzZXFJRCBhdEluZGV4OiAyXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJmluUHJvdG9jb2wgYXRJbmRleDogM107IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZvdXRQcm90b2NvbCBhdEluZGV4OiA0XTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRUYXJnZXQ6IHNlbGZdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIGludm9rZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIGdlbmVyYXRlIGEgcHJvY2Vzc19YWFhYIG1ldGhvZCBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uLCB3aGljaCByZWFkcyBhcmdzLCBjYWxscyB0aGUgc2VydmljZSwgYW5kIHdyaXRlcyByZXN1bHRzCi0gIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAodm9pZCkgcHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDogKGludDMyX3QpIHNlcUlEIGluUHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQ8VFByb3RvY29sPikgb3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBzdHJpbmcgYXJnc3R5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGFyZ3N0eXBlIDw8ICIgKiBhcmdzID0gW1siIDw8IGFyZ3N0eXBlIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlthcmdzIHJlYWQ6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgc3RyaW5nIHJlc3VsdHR5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSgqZl9pdGVyKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0dHlwZSA8PCAiICogcmVzdWx0ID0gW1siIDw8IHJlc3VsdHR5cGUgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotCi0gICAgLy8gbWFrZSB0aGUgY2FsbCB0byB0aGUgYWN0dWFsIHNlcnZpY2Ugb2JqZWN0Ci0gICAgb3V0IDw8IGluZGVudCgpOwotICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PCAiW3Jlc3VsdCBzZXRTdWNjZXNzOiAiOwotICAgIH0KLSAgICBvdXQgPDwgIlttU2VydmljZSAiIDw8IGZ1bm5hbWU7Ci0gICAgLy8gc3VwcGx5aW5nIGFyZ3VtZW50cwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIG91dCA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJdIjsKLSAgICB9Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIAotICAgIC8vIHdyaXRlIG91dCB0aGUgcmVzdWx0Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVfUkVQTFkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSURdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgd3JpdGU6IG91dFByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FyZ3MgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIAotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAKLSAgLy8gZGVhbGxvYwotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIlttU2VydmljZSByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21NZXRob2RNYXAgcmVsZWFzZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBkZWFsbG9jXTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gZmllbGROYW1lIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiID0gW2luUHJvdG9jb2wgIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5XTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZ107IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGVdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjRdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyXTsiOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgYWxsb2NhdGVzIHRoZSBzdHJ1Y3QgYW5kIGludm9rZXMgcmVhZDoKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZmllbGROYW1lIDw8ICIgPSBbWyIgPDwKLSAgICB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiBOVUxMIHZhbHVlVHlwZTogTlVMTCBzaXplOiAmIiA8PAotICAgICAgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiAiIDw8IGZpZWxkTmFtZSA8PAotICAgICAgIiA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVTZXQgKiAiIDw8IGZpZWxkTmFtZSA8PAotICAgICAgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlQXJyYXkgKiAiIDw8IGZpZWxkTmFtZSA8PAotICAgICAgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0KLSAgLy8gRklYTUUgLSB0aGUgY29kZSBhYm92ZSBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBvZgotICAvLyB0aGUgY29udGFpbmVycyBiZWluZyByZWFkIG1hdGNoIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZQotICAvLyBjb250YWluZXJzIHdlIGFyZSByZWFkaW5nIGludG8uICBEb2VzIHRoYXQgbWF0dGVyPwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8Ci0gICAgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBmaWVsZE5hbWUpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZE1hcEVuZF07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkU2V0RW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTGlzdEVuZF07IiA8PCBlbmRsOwotICB9Ci0KLX0KLQotCi0vKioKLSAqIFRha2UgYSB2YXJpYWJsZSBvZiBhIGdpdmVuIHR5cGUgYW5kIHdyYXAgaXQgaW4gY29kZSB0byBtYWtlIGl0Ci0gKiBzdWl0YWJsZSBmb3IgcHV0dGluZyBpbnRvIGEgY29udGFpbmVyLCBpZiBuZWNlc3NhcnkuICBCYXNpY2FsbHksCi0gKiB3cmFwIHNjYWxlciBwcmltaXRpdmVzIGluIE5TTnVtYmVyIG9iamVjdHMuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y29udGFpbmVyaXplKHRfdHlwZSAqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkKLXsKLSAgLy8gRklYTUUgLSBvcHRpbWl6ZSBoZXJlIHRvIGF2b2lkIGF1dG9yZWxlYXNlIHBvb2w/Ci0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aEludDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY2FuJ3QgY29udGFpbmVyaXplIHZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhCb29sOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhVbnNpZ25lZENoYXI6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoU2hvcnQ6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoTG9uZzogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhMb25nTG9uZzogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIGRvIG5vdGhpbmcKLSAgcmV0dXJuIGZpZWxkTmFtZTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwIGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF90eXBlKiBrZXlUeXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7Ci0gIHRfdHlwZSogdmFsVHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOwotICB0X2ZpZWxkIGZrZXkoa2V5VHlwZSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHZhbFR5cGUsIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwga2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBzZXRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHZhbFR5cGUsIHZhbCkgPDwKLSAgICAiIGZvcktleTogIiA8PCBjb250YWluZXJpemUoa2V5VHlwZSwga2V5KSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwoa2V5VHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKGtleVR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUoa2V5VHlwZSwga2V5KSA8PCAiIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh2YWxUeXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUodmFsVHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh2YWxUeXBlLCB2YWwpIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAvLyBkZXNlcmlhbGl6ZWQgc3RyaW5ncyBhcmUgYXV0b3JlbGVhc2UsIHNvIGRvbid0IHJlbGVhc2UgdGhlbQotICAgIGlmICghKGdldF90cnVlX3R5cGUodHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X3R5cGUqIHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUodHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSB0byBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgZmllbGQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbb3V0UHJvdG9jb2wgIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgZmllbGROYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbDogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgc3RydWN0Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIGNvbnRhaW5lcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiB2YWx1ZVR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8Ci0gICAgICBmaWVsZE5hbWUgPDwgIiBjb3VudF1dOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogWyIgPDwKLSAgICAgIGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PAotICAgICAgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgc3RyaW5nIGtleTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGtleSA9IHRtcCgia2V5Iik7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIga2V5RW51bWVyYXRvcl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAga2V5ID0gdG1wKCJvYmoiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBvYmplY3RFbnVtZXJhdG9yXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAga2V5ID0gdG1wKCJpIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PCBrZXkgPDwgIiA9IDA7ICIgPDwga2V5IDw8ICIgPCBbIiA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF07ICIgPDwga2V5IDw8ICIrKykiIDw8IGVuZGw7Ci0gIH0KLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGtleSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiW291dFByb3RvY29sIHdyaXRlTWFwRW5kXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVTZXRFbmRdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBHaXZlbiBhIGZpZWxkIHZhcmlhYmxlIG5hbWUsIHdyYXAgaXQgaW4gY29kZSB0aGF0IGNvbnZlcnRzIGl0IHRvIGEKLSAqIHByaW1pdGl2ZSB0eXBlLCBpZiBuZWNlc3NhcnkuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjb250YWluZXJpemUodF9maWVsZCAqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkKLXsKLSAgdF90eXBlICogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgaW50VmFsdWVdIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY2FuJ3QgZGVjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgYm9vbFZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgdW5zaWduZWRDaGFyVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIHNob3J0VmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGxvbmdWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgbG9uZ0xvbmdWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgZG91YmxlVmFsdWVdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwTmFtZSkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgZGVjb250YWluZXJpemUoJmtmaWVsZCwga2V5KSk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiWyIgKyBtYXBOYW1lICsgIiBvYmplY3RGb3JLZXk6ICIgKyBrZXkgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmdmZpZWxkLCB2ZmllbGQuZ2V0X25hbWUoKSkpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50TmFtZSkgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnROYW1lKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgZGVjb250YWluZXJpemUoJmVmaWVsZCwgZWxlbWVudE5hbWUpKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0TmFtZSkgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiWyIgKyBsaXN0TmFtZSArICIgb2JqZWN0QXRJbmRleDogIiArIGluZGV4ICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgZGVjb250YWluZXJpemUoJmVmaWVsZCwgZWZpZWxkLmdldF9uYW1lKCkpKTsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgYW4gT2JqZWN0aXZlLUMgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNsYXNzX3JlZiBEbyB3ZSB3YW50IGEgQ2xhc3MgcmVmZXJlbmNlIGlzdGVhZCBvZiBhIHR5cGUgcmVmZXJlbmNlPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYpIHsKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gY29jb2FfcHJlZml4XyArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIHJlc3VsdDsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJlc3VsdCA9ICJOU0RpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJlc3VsdCA9ICJOU1NldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJlc3VsdCA9ICJOU0FycmF5IjsKLSAgfSBlbHNlIHsKLSAgICAvLyBDaGVjayBmb3IgcHJlZml4Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCkgewotICAgICAgcmVzdWx0ID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWNsYXNzX3JlZikgewotICAgIHJlc3VsdCArPSAiICoiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgT2JqZWN0aXZlLUMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJOU0RhdGEgKiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiTlNTdHJpbmcgKiI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCT09MIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAidWludDhfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvYmplY3RpdmUtYyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotCi0vKioKLSAqIFNwaXQgb3V0IGNvZGUgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCB2YWx1ZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIHJlbmRlciA8PCBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHNBbmRLZXlzOiAiOwotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgdmFsIDw8ICIsICIgPDwga2V5OwotICAgIH0KLSAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgIH0KLSAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNTZXQgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiZG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIGNvbnN0YW50IGZvciB0eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmIChjb250YWluZXJpemVfaXQpIHsKLSAgICByZXR1cm4gY29udGFpbmVyaXplKHR5cGUsIHJlbmRlci5zdHIoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZC4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCkgewotICByZXR1cm4gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiIF9fIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI7IjsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0gIHJlbmRlciA8PCAiQHByb3BlcnR5IChub25hdG9taWMsICI7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkKLSAgICByZW5kZXIgPDwgInJldGFpbiwgIjsKLSAgCi0gIHJlbmRlciA8PCAiZ2V0dGVyPSIgPDwgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwKLSAgICAiLCBzZXR0ZXI9c2V0IiA8PCBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOikgIiA8PAotICAgIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiOwotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0KLSAgICAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiB0eXBlcyBhbmQgbmFtZXMsIHN1aXRhYmxlIGZvciBhbgotICogb2JqZWN0aXZlLWMgcGFyYW1ldGVyIGxpc3QKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICI6ICgiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBPYmplY3RpdmUtQyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGVfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGVfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGVfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZm9ybWF0IHN0cmluZyBzcGVjaWZpZXIgZm9yIHRoZSBzdXBwbGllZCBwYXJzZSB0eXBlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJcXFwiJUBcXFwiIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiJWhpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICIlcWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIlZiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiJWkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY2FsbCB0byBhIGZpZWxkJ3Mgc2V0dGVyLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgRmllbGQgdGhlIHNldHRlciBpcyBiZWluZyBjYWxsZWQgb24KLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSB0byBwYXNzIHRvIHNldHRlcgotICovCi0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHJldHVybiAiW3NlbGYgc2V0IiArIGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI6ICIgKyBmaWVsZE5hbWUgKyAiXTsiOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY29jb2EsICJDb2NvYSIsCi0iICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgotKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVkYzg5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDEyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogQysrIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzIGxlZ2l0aW1hY3kgaW5jYXJuYXRlLgotICoKLSAqLwotY2xhc3MgdF9jcHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2NwcF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInB1cmVfZW51bXMiKTsKLSAgICBnZW5fcHVyZV9lbnVtc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZGVuc2UiKTsKLSAgICBnZW5fZGVuc2VfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImluY2x1ZGVfcHJlZml4Iik7Ci0gICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJjb2Jfc3R5bGUiKTsKLSAgICBnZW5fY29iX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub19jbGllbnRfY29tcGxldGlvbiIpOwotICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidGVtcGxhdGVzIik7Ci0gICAgZ2VuX3RlbXBsYXRlc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jcHAiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICAgIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLSAgfQotICB2b2lkIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbj1mYWxzZSwgYm9vbCBwb2ludGVycz1mYWxzZSwgYm9vbCByZWFkPXRydWUsIGJvb2wgd3JpdGU9dHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZGVmaW5pdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlciAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnM9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycz1mYWxzZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX251bGwgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsIGJvb2wgc3BlY2lhbGl6ZWQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24gKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4KTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsICAgICAgICAgICAgKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCk7Ci0gIC8qCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXgoc3RkOjpzdHJpbmcgbnMpOwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2Vfb3BlbihzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9jbG9zZShzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWY9ZmFsc2UsIGJvb2wgYXJnPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgcG9pbnRlcj1mYWxzZSwgYm9vbCBjb25zdGFudD1mYWxzZSwgYm9vbCByZWZlcmVuY2U9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBzdHlsZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiLCBib29sIG5hbWVfcGFyYW1zPXRydWUpOwotICBzdGQ6OnN0cmluZyBjb2JfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiLCBib29sIG5hbWVfcGFyYW1zPXRydWUpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zPXRydWUsIGJvb2wgc3RhcnRfY29tbWE9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGxvY2FsX3JlZmxlY3Rpb25fbmFtZShjb25zdCBjaGFyKiwgdF90eXBlKiB0dHlwZSwgYm9vbCBleHRlcm5hbD1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKTsKLQotICAvLyBUaGVzZSBoYW5kbGVzIGNoZWNraW5nIGdlbl9kZW5zZV8gYW5kIGNoZWNraW5nIGZvciBkdXBsaWNhdGVzLgotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBib29sIGlzX2RlZmluaXRpb24pOwotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOwotCi0gIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKLSAgfQotCi0gIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgewotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlIHByZWZpeCB0byB1c2UgZm9yIGEgZmlsZSBnZW5lcmF0ZWQgYnkgcHJvZ3JhbSwgb3IgdGhlCi0gICAqIGVtcHR5IHN0cmluZyBpZiBubyBpbmNsdWRlIHByZWZpeCBzaG91bGQgYmUgdXNlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0OwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHVyZSBlbnVtcyBmb3IgVGhyaWZ0IGVudW1zLCBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy4KLSAgICovCi0gIGJvb2wgZ2VuX3B1cmVfZW51bXNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbG9jYWwgcmVmbGVjdGlvbiBtZXRhZGF0YSBmb3IgVERlbnNlUHJvdG9jb2wuCi0gICAqLwotICBib29sIGdlbl9kZW5zZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgdXNlIGEgcGF0aCBwcmVmaXggaW4gb3VyICNpbmNsdWRlIHN0YXRlbWVudHMgZm9yIG90aGVyCi0gICAqIHRocmlmdC1nZW5lcmF0ZWQgaGVhZGVyIGZpbGVzLgotICAgKi8KLSAgYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXhfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgIkNvbnRpbnVhdGlvbiBPQmplY3QiLXN0eWxlIGNsYXNzZXMgYXMgd2VsbC4KLSAgICovCi0gIGJvb2wgZ2VuX2NvYl9zdHlsZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLgotICAgKi8KLSAgYm9vbCBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fOwotCi0gIC8qKgotICAgKiBTdHJpbmdzIGZvciBuYW1lc3BhY2UsIGNvbXB1dGVkIG9uY2UgdXAgZnJvbnQgdGhlbiB1c2VkIGRpcmVjdGx5Ci0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5zX29wZW5fOwotICBzdGQ6OnN0cmluZyBuc19jbG9zZV87Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKLSAgICogZnVuY3Rpb24uCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX3RjY187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX3RjY187Ci0KLSAgLyoqCi0gICAqIFdoZW4gZ2VuZXJhdGluZyBsb2NhbCByZWZsZWN0aW9ucywgbWFrZSBzdXJlIHdlIGRvbid0IGdlbmVyYXRlIGR1cGxpY2F0ZXMuCi0gICAqLwotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcmVmbGVjdGVkX2ZpbmdlcnByaW50c187Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuaCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmNwcCI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBJZiB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIGl0IGFwcGVhcnMgdG8ganVzdCBkaXNjYXJkIGRhdGEsCi0gICAgLy8gd2hpY2ggaXMgZmluZS4KLSAgICBzdHJpbmcgZl90eXBlc190Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLnRjYyI7Ci0gICAgZl90eXBlc190Y2NfLm9wZW4oZl90eXBlc190Y2NfbmFtZS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfdGNjXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX3R5cGVzXyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIGJhc2UgdHlwZXMKLSAgZl90eXBlc18gPDwKLSAgICAiI2luY2x1ZGUgPFRocmlmdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8VEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PAotICAgICAgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgICAvLyBYWFgoc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgIC8vIGluY2x1ZGVkIGZpbGVzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICBmX3R5cGVzX3RjY18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PAotICAgICAgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgPDwgIl90eXBlcy50Y2NcIiIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIEluY2x1ZGUgY3VzdG9tIGhlYWRlcnMKLSAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNwcF9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfY3BwX2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3BwX2luY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKGNwcF9pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIjaW5jbHVkZSAiIDw8IGNwcF9pbmNsdWRlc1tpXSA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiI2luY2x1ZGUgXCIiIDw8IGNwcF9pbmNsdWRlc1tpXSA8PCAiXCIiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfdHlwZXNfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIHRoZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgbG9jYWwgcmVmbGVjdGlvbiBtZXRhZGF0YSwgd2UgbmVlZCB0byBpbmNsdWRlCi0gIC8vIHRoZSBkZWZpbml0aW9uIG9mIFR5cGVTcGVjLgotICBpZiAoZ2VuX2RlbnNlXykgewotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICIjaW5jbHVkZSA8VFJlZmxlY3Rpb25Mb2NhbC5oPiIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIE9wZW4gbmFtZXNwYWNlCi0gIG5zX29wZW5fID0gbmFtZXNwYWNlX29wZW4ocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgbnNfY2xvc2VfID0gbmFtZXNwYWNlX2Nsb3NlKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgZl90eXBlc18gPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSBvdXRwdXQgZmlsZXMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIG5hbWVzcGFjZQotICBmX3R5cGVzXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSB0aGUgdHlwZXMudGNjIGZpbGUgZnJvbSB0aGUgdHlwZXMgaGVhZGVyIGZpbGUsCi0gIC8vIHNvIGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHRjYyBmaWxlLgotICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uLgotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAgICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBDbG9zZSBpZm5kZWYKLSAgZl90eXBlc18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIG91dHB1dCBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfaW1wbF8uY2xvc2UoKTsKLSAgZl90eXBlc190Y2NfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gQysrCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KHN0ZDo6b2ZzdHJlYW0mIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcykgewotICBmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZiA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGYpCi0gICAgICA8PCBwcmVmaXggPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeDsKLSAgICBpZiAoaW5jbHVkZV92YWx1ZXMgJiYgKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgZiA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIGYgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGYpIDw8ICJ9OyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBDKyssIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUKLSAqIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nIHRoZSBlbnVtIGtleXdvcmQgaW4gQysrLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLQotICBzdGQ6OnN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKLSAgICBlbnVtX25hbWUgPSAidHlwZSI7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdHJ1Y3QgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGVudW1fbmFtZTsKLQotICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc18sIGNvbnN0YW50cywgIiIsICIiLCB0cnVlKTsKLQotICBpZiAoIWdlbl9wdXJlX2VudW1zXykgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvKioKLSAgICAgR2VuZXJhdGUgYSBjaGFyYWN0ZXIgYXJyYXkgb2YgZW51bSBuYW1lcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICAqLwotICBzdGQ6OnN0cmluZyBwcmVmaXggPSB0ZW51bS0+Z2V0X25hbWUoKSArICI6OiI7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50IF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzW10gPSI7Ci0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsIHByZWZpeC5jX3N0cigpLCAiIiwgZmFsc2UpOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBpbmRlbnQoKSA8PCAiY29uc3QgY2hhciogX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lc1tdID0iOwotICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCAiXCIiLCAiXCIiLCBmYWxzZSk7Ci0KLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAiZXh0ZXJuIGNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8Ci0gICAgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVM7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICJjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgICJfVkFMVUVTX1RPX05BTUVTKDo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoIiA8PCBjb25zdGFudHMuc2l6ZSgpIDw8Ci0gICAgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXMiIDw8Ci0gICAgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lcyksICIgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigtMSwgTlVMTCwgTlVMTCkpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc18sIHRlbnVtLCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc19pbXBsXywgdGVudW0sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX2NvbnN0YW50cy5oIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmNwcCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzX2ltcGw7Ci0gIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfY29uc3RzX2ltcGwgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl9jb25zdHMgPDwKLSAgICAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgImNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfY29uc3RzIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9jb25zdHMgPDwKLSAgICAifTsiIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgICJjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzX2ltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHNfaW1wbCkgPDwKLSAgICAifSIgPDwgZW5kbDsKLQotICBmX2NvbnN0cyA8PAotICAgIGVuZGwgPDwKLSAgICAiZXh0ZXJuIGNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotCi0gIGZfY29uc3RzX2ltcGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotLyoqCi0gKgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTEwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBkYXRhIG1lbWJlcnMgYW5kIGEgcmVhZC93cml0ZSgpIGZ1bmN0aW9uLCBwbHVzIGEgbWlycm9yaW5nIGlzc2V0Ci0gKiBpbm5lciBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZmluZ2VycHJpbnQoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCB0cnVlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotCi0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfdHlwZXNfdGNjXyA6IGZfdHlwZXNfaW1wbF8pOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdCBkZWZpbml0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlCi0gKgotICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGV4dGVuZHMgPSAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24iOwotICB9Ci0KLSAgLy8gR2V0IG1lbWJlcnMKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBXcml0ZSB0aGUgaXNzZXQgc3RydWN0dXJlIGRlY2xhcmF0aW9uIG91dHNpZGUgdGhlIGNsYXNzLiBUaGlzIG1ha2VzCi0gIC8vIHRoZSBnZW5lcmF0ZWQgY29kZSBhbWVuYWJsZSB0byBwcm9jZXNzaW5nIGJ5IFNXSUcuCi0gIC8vIFdlIG9ubHkgZGVjbGFyZSB0aGUgc3RydWN0IGlmIGl0IGdldHMgdXNlZCBpbiB0aGUgY2xhc3MuCi0KLSAgLy8gSXNzZXQgc3RydWN0IGhhcyBib29sZWFuIGZpZWxkcywgYnV0IG9ubHkgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCgpICI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgIjogIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIihmYWxzZSkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIihmYWxzZSkiOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIiB7fSIgPDwgZW5kbDsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJ9IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQ7IiA8PCBlbmRsOwotICAgIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBPcGVuIHN0cnVjdCBkZWYKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFB1dCB0aGUgZmluZ2VycHJpbnQgdXAgdG9wIGZvciBhbGwgdG8gc2VlLgotICBnZW5lcmF0ZV9zdHJ1Y3RfZmluZ2VycHJpbnQob3V0LCB0c3RydWN0LCBmYWxzZSk7Ci0KLSAgaWYgKCFwb2ludGVycykgewotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiOwotCi0gICAgYm9vbCBpbml0X2N0b3IgPSBmYWxzZTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICBzdHJpbmcgZHZhbDsKLSAgICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOwotICAgICAgICB9Ci0gICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiXCJcIiIgOiAiMCI7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbml0X2N0b3IpIHsKLSAgICAgICAgICBpbml0X2N0b3IgPSB0cnVlOwotICAgICAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBXaGVuIGV2ZXJ5dGhpbmcgZWxzZSBpbiBUaHJpZnQgaXMgcGVyZmVjdCwKLSAgICAvLyBkbyBtb3JlIG9mIHRoZXNlIGluIHRoZSBpbml0aWFsaXplciBsaXN0LgotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQotICAgICAgaWYgKCF0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB0aHJvdygpIHt9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBQb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlJ3MgcmVmbGVjdGlvbiBsb2NhbCB0eXBlc3BlYy4KLSAgaWYgKGdlbl9kZW5zZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN0YXRpYyA6OmFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6VHlwZVNwZWMqIGxvY2FsX3JlZmxlY3Rpb247IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRGVjbGFyZSBhbGwgZmllbGRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgcG9pbnRlcnMgJiYgISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSwgIXJlYWQpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBBZGQgdGhlIF9faXNzZXQgZGF0YSBtZW1iZXIgaWYgd2UgbmVlZCBpdCwgdXNpbmcgdGhlIGRlZmluaXRpb24gZnJvbSBhYm92ZQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghcG9pbnRlcnMpIHsKLSAgICAvLyBHZW5lcmF0ZSBhbiBlcXVhbGl0eSB0ZXN0aW5nIG9wZXJhdG9yLiAgTWFrZSBpdCBpbmxpbmUgc2luY2UgdGhlIGNvbXBpbGVyCi0gICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgIiA8PAotICAgICAgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gcmhzLl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQotICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgaWYgdGhleSB3aXNoIHRvIHVzZSBpdC4gIChUaGV5Ci0gICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yIDwgKGNvbnN0ICIKLSAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAocmVhZCkgewotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpZiAod3JpdGUpIHsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCB3cml0ZSgiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBmaW5nZXJwcmludCBvZiBhIHN0cnVjdCB0byBlaXRoZXIgdGhlIGhlYWRlciBvciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIHN0cmluZyBzdGF0LCBuc3BhY2UsIGNvbW1lbnQ7Ci0gIGlmIChpc19kZWZpbml0aW9uKSB7Ci0gICAgc3RhdCA9ICIiOwotICAgIG5zcGFjZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiOjoiOwotICAgIGNvbW1lbnQgPSAiICI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdCA9ICJzdGF0aWMgIjsKLSAgICBuc3BhY2UgPSAiIjsKLSAgICBjb21tZW50ID0gIjsgLy8gIjsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgc3RhdCA8PCAiY29uc3QgY2hhciogIiA8PCBuc3BhY2UKLSAgICAgICAgPDwgImFzY2lpX2ZpbmdlcnByaW50IiA8PCBjb21tZW50IDw8ICI9IFwiIiA8PAotICAgICAgICB0c3RydWN0LT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSA8PCAiXCI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzdGF0IDw8ICJjb25zdCB1aW50OF90ICIgPDwgbnNwYWNlIDw8Ci0gICAgICAgICJiaW5hcnlfZmluZ2VycHJpbnRbIiA8PCB0X3R5cGU6OmZpbmdlcnByaW50X2xlbiA8PCAiXSIgPDwgY29tbWVudCA8PCAiPSB7IjsKLSAgICBjb25zdCBjaGFyKiBjb21tYSA9ICIiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdF90eXBlOjpmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgb3V0IDw8IGNvbW1hIDw8ICIweCIgPDwgdF9zdHJ1Y3Q6OmJ5dGVfdG9faGV4KHRzdHJ1Y3QtPmdldF9iaW5hcnlfZmluZ2VycHJpbnQoKVtpXSk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZSAoZWl0aGVyIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24pLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIGlmICghZ2VuX2RlbnNlXykgewotICAgIHJldHVybjsKLSAgfQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBhc3NlcnQodHR5cGUtPmhhc19maW5nZXJwcmludCgpKTsKLSAgc3RyaW5nIGtleSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSArIChpc19kZWZpbml0aW9uID8gIi1kZWZuIiA6ICItZGVjbCIpOwotICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBnZW5lcmF0ZWQgdGhpcyBmaW5nZXJwcmludC4gIElmIHdlIGFscmVhZHkgZGlkLCBiYWlsIG91dC4KLSAgaWYgKCFyZWZsZWN0ZWRfZmluZ2VycHJpbnRzXy5pbnNlcnQoa2V5KS5zZWNvbmQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gTGV0IGVhY2ggcHJvZ3JhbSBoYW5kbGUgaXRzIG93biBzdHJ1Y3R1cmVzLgotICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCAmJiB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERvIGRlcGVuZGVuY2llcy4KLSAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgLy8gSGFja3kgaGFja3kuICBGb3IgZWZmaWNpZW5jeSBhbmQgY29udmVuaWVuY2UsIHdlIG5lZWQgYSBkdW1teSAiVF9TVE9QIgotICAgIC8vIHR5cGUgYXQgdGhlIGVuZCBvZiBvdXIgdHlwZXNwZWMgYXJyYXkuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubwotICAgIC8vIFRfU1RPUCB0eXBlLCBzbyB3ZSB1c2UgdGhlIGdsb2JhbCB2b2lkIHR5cGUsIGFuZCBzcGVjaWFsIGNhc2UgaXQgd2hlbgotICAgIC8vIGdlbmVyYXRpbmcgaXRzIHR5cGVzcGVjLgotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9ICgodF9zdHJ1Y3QqKXR0eXBlKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKiptX2l0ZXIpLmdldF90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICAgIH0KLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgZ190eXBlX3ZvaWQsIGlzX2RlZmluaXRpb24pOwotCi0gICAgLy8gRm9yIGRlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMsIGRvIHRoZSBhcnJheXMgb2YgbWV0YXMgYW5kIGZpZWxkIHNwZWNzIGFsc28uCi0gICAgaWYgKGlzX2RlZmluaXRpb24pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OkZpZWxkTWV0YSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwKLSAgICAgICAgICAoKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpID8gInRydWUiIDogImZhbHNlIikgPDwKLSAgICAgICAgICAiIH0sIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWmVybyBmb3IgdGhlIFRfU1RPUCBtYXJrZXIuCi0gICAgICBpbmRlbnQob3V0KSA8PCAieyAwLCBmYWxzZSB9IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJiIgPDwKLSAgICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICImIiA8PAotICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgZ190eXBlX3ZvaWQpIDw8ICIsIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLy8gIiA8PCB0dHlwZS0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IChpc19kZWZpbml0aW9uID8gIiIgOiAiZXh0ZXJuICIpIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjIiA8PCBlbmRsIDw8Ci0gICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgdHR5cGUpIDw8Ci0gICAgICAoaXNfZGVmaW5pdGlvbiA/ICIoIiA6ICI7IikgPDwgZW5kbDsKLQotICBpZiAoIWlzX2RlZmluaXRpb24pIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX3RvX2VudW0odHR5cGUpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpiaW5hcnlfZmluZ2VycHJpbnQsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJOVUxMIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIH0KLQotICBvdXQgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdHVyZSdzIHN0YXRpYyBwb2ludGVyIHRvIGl0cyBsb2NhbCByZWZsZWN0aW9uIHR5cGVzcGVjCi0gKiBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSkgewotICBpZiAoIWdlbl9kZW5zZV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiAiIDw8Ci0gICAgICB0dHlwZS0+Z2V0X25hbWUoKSA8PCAiOjpsb2NhbF9yZWZsZWN0aW9uID0gIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsIHR0eXBlKSA8PCAiOyIgPDwKLSAgICBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OnJlYWQoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpbnQxNl90IGZpZDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGZ0eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKmlzc2V0X3ByZWZpeCA9Ci0gICAgICAgICAgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIiA6ICJpc3NldF8iOwotCi0jaWYgMAotICAgICAgICAvLyBUaGlzIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBmaWVsZCBpcyBlbmNvdW50ZXJlZCB0d2ljZS4KLSAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0gICAgICAgIC8vIFRPRE8oZHJlaXNzKTogR2VuZXJhdGUgdGhpcyBjb2RlIGFuZCAiaWYiIGl0IG91dCB0byBtYWtlIGl0IGVhc2llcgotICAgICAgICAvLyBmb3IgcGVvcGxlIHJlY29tcGlsaW5nIHRocmlmdCB0byBpbmNsdWRlIGl0LgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICAgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgYW4gb3B0aW9uIHdoZW4gdGhyaWZ0IHN0cnVjdHMKLSAgICAgICAgICAvLyBoYXZlIGEgY29tbW9uIGJhc2UgY2xhc3MuCi0gICAgICAgICAgLy8gaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCi0gIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0Ci0gIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCi0gIG91dCA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICAgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAotICAgICAgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgfQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICd9JyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cwotICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCi0gKiBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKLSAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi5oIjsKLSAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIgZmlsZSBpbmNsdWRlcwotICBmX2hlYWRlcl8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+IiA8PCBlbmRsIDw8Ci0gICAgICAvLyBUT0RPKGRyZWlzcyk6IExpYmlmeSB0aGUgYmFzZSBjbGllbnQgc28gd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIHRoaXMuCi0gICAgICAiI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4iIDw8IGVuZGwgPDwKLSAgICAgICJuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7IiA8PCBlbmRsIDw8Ci0gICAgICAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9fX0iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+IiA8PCBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSA8YXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGV4dGVuZHNfc2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpIDw8Ci0gICAgICBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiLmNwcCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIjaW5jbHVkZSBcImFzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOwotICB9Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8Ci0gICAgICAiLnRjY1wiIiA8PCBlbmRsOwotCi0gICAgc3RyaW5nIGZfc2VydmljZV90Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiLnRjYyI7Ci0gICAgZl9zZXJ2aWNlX3RjY18ub3BlbihmX3NlcnZpY2VfdGNjX25hbWUuY19zdHIoKSk7Ci0gICAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAgIGF1dG9nZW5fY29tbWVudCgpOwotICAgIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PAotICAgICAgIi5oXCIiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICAgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfVENDIiA8PCBlbmRsIDw8Ci0gICAgICAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICAgIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgICAgICIjaW5jbHVkZSBcImFzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvbXBvbmVudHMKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0c2VydmljZSk7Ci0KLSAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb2IgY29tcG9uZW50cwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIkNvYkNsIik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JTdiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIkNvYlN2Iik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb2IiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIkNvYiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odHNlcnZpY2UpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIG5hbWVzcGFjZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX3NlcnZpY2VfdGNjXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIFRPRE8oc2ltcGtpbnMpOiBNYWtlIHRoaXMgYSBzZXBhcmF0ZSBvcHRpb24KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PAotICAgICAgIi50Y2NcIiIgPDwgZW5kbCA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAgICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgdGhlIGZpbGVzCi0gIGZfc2VydmljZV90Y2NfLmNsb3NlKCk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9oZWFkZXJfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4gQmFzaWNhbGx5LCB0aGlzIGdlbmVyYXRlcyB0eXBlcwotICogZm9yIGFsbCB0aGUgYXJndW1lbnRzIGFuZCByZXN1bHRzIHRvIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHN0cmluZyBuYW1lX29yaWcgPSB0cy0+Z2V0X25hbWUoKTsKLQotICAgIC8vIFRPRE8oZHJlaXNzKTogV2h5IGlzIHRoaXMgc3R1ZmYgbm90IGluIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnM/Ci0gICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0cyk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzKTsKLSAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMsIHRydWUpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lX29yaWcpOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0KLSAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7Ci0gIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7Ci0gICAgLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjbGllbnQuCi0gICAgc3RyaW5nIGNsaWVudF9uYW1lID0gc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOwotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgY2xpZW50X25hbWUgKz0gIlQiOwotICAgICAgc2VydmljZV9pZl9uYW1lICs9ICJUIjsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8Ci0gICAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImNsYXNzICIgPDwgY2xpZW50X25hbWUgPDwgIjsiIDw8Ci0gICAgICBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKwotICAgICAgc3R5bGUgKyAiSWYiOwotICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKLSAgICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgICBleHRlbmRzICs9ICJUPFByb3RvY29sXz4iOwotICAgIH0KLSAgfQotCi0gIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9oZWFkZXJfIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIigpIHt9IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIGdlbmVyYXRlIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdHlwZWRlZiBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdAotICAgIC8vIGtub3cgYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PAotICAgICAgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIiA8PAotICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiSWY7IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiAsIHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiTnVsbCI7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiTnVsbCA6IHZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiSWYiIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiTnVsbCgpIHt9IiA8PCBlbmRsOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSwgIiIsIGZhbHNlKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOwotCi0gICAgaWYgKHN0eWxlID09ICIiKSB7Ci0gICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpIHx8IGlzX2NvbXBsZXhfdHlwZShyZXR1cm50eXBlKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gX3JldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7Ci0gICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOwotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKF9yZXR1cm4pOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyB0YXJnZXQsIHN0cmluZyBpZmFjZSwgc3RyaW5nIGFyZ19wcmVmaXgpIHsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogcmV0X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gIG91dCA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICFyZXRfdHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZShyZXRfdHlwZSkpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IHRhcmdldDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IHRhcmdldCA8PCAiID0gIiA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgIH0KLSAgICBvdXQgPDwgYXJnX3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKStzdmNuYW1lKyJfYXN5bmNfc2VydmVyLnNrZWxldG9uLmNwcCI7Ci0KLSAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIG9mc3RyZWFtIGZfc2tlbGV0b247Ci0gIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgb25lIHdheSB0byBhZGFwdCBhIHN5bmNocm9ub3VzIiA8PCBlbmRsIDw8Ci0gICAgIi8vIGludGVyZmFjZSBpbnRvIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIiA8PCBlbmRsIDw8Ci0gICAgIi8vIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0IGFuZCByZXdyaXRlIGFzIGFzeW5jaHJvbm91cyBhbnkgZnVuY3Rpb25zIiA8PCBlbmRsIDw8Ci0gICAgIi8vIHRoYXQgd291bGQgb3RoZXJ3aXNlIGludHJvZHVjZSB1bndhbnRlZCBsYXRlbmN5LiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxhc3luYy9URXZlbnRTZXJ2ZXIuaD4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKCFucy5lbXB0eSgpKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpLTIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlciA6ICIgPDwKLSAgICAicHVibGljICIgPDwgc3ZjbmFtZSA8PCAiQ29iU3ZJZiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PAotICAgICAgICAgICAgICAgICJIYW5kbGVyPihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiQXN5bmNIYW5kbGVyKCk7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLQotICAgIHN0cmluZyB0YXJnZXQgPSByZXR1cm50eXBlLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuIjsKLSAgICBpZiAoIXJldHVybnR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgZl9za2VsZXRvbiA8PAotICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChmX3NrZWxldG9uLCAqZl9pdGVyLCB0YXJnZXQsICJzeW5jSGFuZGxlcl8iLCAiIik7Ci0gICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigiIDw8IHRhcmdldCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2tlbGV0b24pOwotICB9Ci0gIGZfc2tlbGV0b24gPDwgZW5kbCA8PAotICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4gc3luY0hhbmRsZXJfOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAotICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKLSAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOwotICB9Ci0KLSAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PAotICAgIGV4dGVuZHNfbXVsdGlmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgiIDw8IGxpc3RfdHlwZSA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoKml0ZXIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgbGlzdF90eXBlIDw8ICIgaWZhY2VzXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLQotICAgIHN0cmluZyBjYWxsID0gc3RyaW5nKCJpZmFjZXNfW2ldLT4iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgIGNhbGwgKz0gIl9yZXR1cm4iOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYWxsICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICBjYWxsICs9ICgqYV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgY2FsbCArPSAiKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHN6ID0gaWZhY2VzXy5zaXplKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN6OyArK2kpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChpID09IHN6IC0gMSkgeyIgPDwgZW5kbDsKLSAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotICBzdHJpbmcgaWZzdHlsZTsKLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgaWZzdHlsZSA9ICJDb2JDbCI7Ci0gIH0KLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyLCB0ZW1wbGF0ZV9zdWZmaXgsIHNob3J0X3N1ZmZpeCwgcHJvdG9jb2xfdHlwZSwgX3RoaXM7Ci0gIHN0cmluZyBjb25zdCBwcm90X2ZhY3RvcnlfdHlwZSA9Ci0gICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5IjsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgdGVtcGxhdGVfaGVhZGVyID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOwotICAgIHNob3J0X3N1ZmZpeCA9ICJUIjsKLSAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKLSAgICBwcm90b2NvbF90eXBlID0gIlByb3RvY29sXyI7Ci0gICAgX3RoaXMgPSAidGhpcy0+IjsKLSAgfSBlbHNlIHsKLSAgICBwcm90b2NvbF90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOwotICB9Ci0gIHN0cmluZyBwcm90X3B0ciA9ICJib29zdDo6c2hhcmVkX3B0cjwgIiArIHByb3RvY29sX3R5cGUgKyAiPiI7Ci0gIHN0cmluZyBjbGllbnRfc3VmZml4ID0gIkNsaWVudCIgKyB0ZW1wbGF0ZV9zdWZmaXg7Ci0gIHN0cmluZyBpZl9zdWZmaXggPSAiSWYiOwotICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKLSAgICBpZl9zdWZmaXggKz0gdGVtcGxhdGVfc3VmZml4OwotICB9Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICB0ZW1wbGF0ZV9oZWFkZXIgPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgaWZzdHlsZSA8PCBpZl9zdWZmaXggPDwKLSAgICBleHRlbmRzX2NsaWVudCA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICIoIiA8PCBwcm90X3B0ciA8PCAiIHByb3QpIDoiIDw8Ci0gICAgICBlbmRsOwotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3QpLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKHByb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKHByb3QsIHByb3QpIHt9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpIDoiIDw8IGVuZGw7Ci0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHBpcHJvdF8oaXByb3QpLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKG9wcm90KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90XyA9IGlwcm90LmdldCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdF8gPSBvcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgZ2V0dGVycyBmb3IgdGhlIHByb3RvY29scy4KLSAgICAvLyBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgdGVtcGxhdGVkIGZvciBzaW1wbGljaXR5LgotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBzaG91bGQgdGhleSBiZSB0ZW1wbGF0ZWQ/Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBvcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwKLSAgICAgICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWwsICIgPDwKLSAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5KSA6IiA8PAotICAgICAgZW5kbDsKLSAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGl0cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3RyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbDsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgotICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiIDw8Ci0gICAgICAgICAgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIgPDwKLSAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkpIHsiIDw8IGVuZGw7Ci0gICAgICAgIC8vIFRocm93IGEgVEV4Y2VwdGlvbiBpZiBlaXRoZXIgZHluYW1pYyBjYXN0IGZhaWxlZC4KLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKCFwaXByb3RfIHx8ICFwb3Byb3RfKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKFwiIiA8PAotICAgICAgICAgICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8Ci0gICAgICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwKLSAgICAgICAgICAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcGlwcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PAotICAgICAgICAiKGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSkge30iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBnZXRDaGFubmVsKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaWYgKCFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCBjb21wbGV0ZWRfXyhib29sIHN1Y2Nlc3MpIHt9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBpZnN0eWxlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFVzZSBwcml2YXRlIGluaGVyaXRhbmNlIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhpc2UgaW4gY29iLXN0eWxlLgotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICZub2FyZ3MpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiAgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiICA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIgIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIGlwcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIG9wcm90XzsiICA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZwotICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgIGZfaGVhZGVyXyA8PAotICAgICAgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8Ci0gICAgICAiQ2xpZW50VDwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIiA8PAotICAgICAgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybik7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiIDw8Ci0gICAgICAgICAgInN0ZDo6dHIxOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCksICIgPDwKLSAgICAgICAgICBfdGhpcyA8PCAiaXRyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIiA8PAotICAgICAgICAgICJzdGQ6OnRyMTo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vaWYgKHN0eWxlICE9ICJDb2IiKSAvLyBUT0RPKGRyZWlzcyk6IExpYmlmeSB0aGUgY2xpZW50IGFuZCBkb24ndCBnZW5lcmF0ZSB0aGlzIGZvciBjb2Itc3R5bGUKLSAgICBpZiAodHJ1ZSkgewotICAgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCi0gICAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCI7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMLCBjc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICYiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBfdGhpcyA8PCAib3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gb25ld2F5IGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgICAvLyBPcGVuIHRoZSByZWN2IGZ1bmN0aW9uCi0gICAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOwotICAgICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCByc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImJvb2wgY29tcGxldGVkID0gZmFsc2U7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyI7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8Ci0gICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8Ci0gICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmCi0gICAgICAgICAgICAhaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgIl9yZXR1cm4iKTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkKSA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7Ci0KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGVuZGw7Ci0KLSAgICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBfcmV0dXJuIHBvaW50ZXIgaGFzIG5vdyBiZWVuIGZpbGxlZCIgPDwgZW5kbDsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBfcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0ICA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgYXJlIGEgdm9pZCBmdW5jdGlvbgotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSBjYXRjaCAoLi4uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoIWNvbXBsZXRlZCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm9jZXNzb3IgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0gIHN0cmluZyBpZnN0eWxlOwotICBzdHJpbmcgcHN0eWxlOwotICBzdHJpbmcgZmluaXNoX2NvYjsKLSAgc3RyaW5nIGZpbmlzaF9jb2JfZGVjbDsKLSAgc3RyaW5nIGNvYl9hcmc7Ci0gIHN0cmluZyBjYWxsX2NvbnRleHQgPSAiLCB2b2lkKiBjYWxsQ29udGV4dCI7Ci0gIHN0cmluZyBjYWxsX2NvbnRleHRfYXJnID0gIiwgY2FsbENvbnRleHQiOwotICBzdHJpbmcgY2FsbF9jb250ZXh0X2RlY2wgPSAiLCB2b2lkKiI7Ci0gIHN0cmluZyByZXRfdHlwZSA9ICJib29sICI7Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGlmc3R5bGUgPSAiQ29iU3YiOwotICAgIHBzdHlsZSA9ICJBc3luYyI7Ci0gICAgZmluaXNoX2NvYiA9ICJzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCAiOwotICAgIGZpbmlzaF9jb2JfZGVjbCA9ICJzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4sICI7Ci0gICAgY2FsbF9jb250ZXh0ID0gIiI7ICAvLyBUT0RPKGVkaGFsbCkgcmVtb3ZlIHdoZW4gY2FsbENvbnRleHQgaXMgYWRlZCB0byBUQXN5bmNQcm9jZXNzb3IKLSAgICBjYWxsX2NvbnRleHRfYXJnID0gIiI7ICAvLyBkaXR0bwotICAgIGNhbGxfY29udGV4dF9kZWNsID0gIiI7IC8vIGRpdHRvCi0gICAgY29iX2FyZyA9ICJjb2IsICI7Ci0gICAgcmV0X3R5cGUgPSAidm9pZCAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBwc3R5bGUgKyAiUHJvY2Vzc29yIjsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiwgcHVibGljICIgKyBleHRlbmRzOwotICB9Ci0KLSAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCB0eXBlbmFtZV9zdHI7Ci0gIHN0cmluZyBjbGFzc19zdWZmaXggPSAiUHJvY2Vzc29yIjsKLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgY2xhc3Nfc3VmZml4ID0gIlByb2Nlc3NvclQiOwotICAgIHRlbXBsYXRlX2hlYWRlciA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKLSAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiPFByb3RvY29sXz4iOwotICAgIHR5cGVuYW1lX3N0ciA9ICJ0eXBlbmFtZSAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgIHRlbXBsYXRlX2hlYWRlciA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICIgOiB2aXJ0dWFsIHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpUIiA8PCBwc3R5bGUgPDwgIlByb2Nlc3NvciIgPDwKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycwotICBmX2hlYWRlcl8gPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgIklmPiBpZmFjZV87IiA8PCBlbmRsOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlIDw8ICJwcm9jZXNzX2ZuKCIgPDwgZmluaXNoX2NvYiA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dCA8PCAiKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcml2YXRlOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdm9pZCAoIiA8PAotICAgIHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjoqKSgiIDw8IGZpbmlzaF9jb2JfZGVjbCA8PAotICAgICJpbnQzMl90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIiA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiIgPDwgY2FsbF9jb250ZXh0X2RlY2wgPDwKLSAgICAiKT4gcHJvY2Vzc01hcF87IiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8Ci0gICAgICAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QiIDw8IGNhbGxfY29udGV4dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PAotICAgICAgICAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iIDw8Ci0gICAgICAgICJpbnQzMl90IHNlcWlkLCBQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90IiA8PAotICAgICAgICBjYWxsX2NvbnRleHQgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKLSAgICAgIC8vIFhYWCBGYWN0b3IgdGhpcyBvdXQsIGV2ZW4gaWYgaXQgaXMgYSBwYWluLgotICAgICAgc3RyaW5nIHJldF9hcmcgPSAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOwotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiIDw8Ci0gICAgICAgICJ2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgICAgICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWFhYIERvbid0IGRlY2xhcmUgdGhyb3cgaWYgaXQgZG9lc24ndCBleGlzdAotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgICAgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBkZWNsYXJlX21hcCA9ICIiOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGRlY2xhcmVfbWFwICs9IGluZGVudCgpOwotICAgIGRlY2xhcmVfbWFwICs9ICJwcm9jZXNzTWFwX1tcIiI7Ci0gICAgZGVjbGFyZV9tYXAgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGRlY2xhcmVfbWFwICs9ICJcIl0gPSAmIjsKLSAgICBkZWNsYXJlX21hcCArPSBzZXJ2aWNlX25hbWVfOwotICAgIGRlY2xhcmVfbWFwICs9IHBzdHlsZTsKLSAgICBkZWNsYXJlX21hcCArPSBjbGFzc19zdWZmaXg7Ci0gICAgZGVjbGFyZV9tYXAgKz0gIjo6cHJvY2Vzc18iOwotICAgIGRlY2xhcmVfbWFwICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBkZWNsYXJlX21hcCArPSAiO1xuIjsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICIoYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgIklmPiBpZmFjZSkgOiIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICIoaWZhY2UpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgIGRlY2xhcmVfbWFwIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZSA8PCAicHJvY2VzcygiIDw8IGZpbmlzaF9jb2IgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsIGJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QiIDw8IGNhbGxfY29udGV4dCA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZSA8PCBjbGFzc19zdWZmaXggPDwKLSAgICAiKCkge30iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLSAgb3V0IDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyIDw8Ci0gICAgcmV0X3R5cGUgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGUgPDwgY2xhc3Nfc3VmZml4IDw8IHRlbXBsYXRlX3N1ZmZpeCA8PAotICAgICI6OnByb2Nlc3MoIiA8PCBmaW5pc2hfY29iIDw8Ci0gICAgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsICIgPDwKLSAgICAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCIgPDwKLSAgICBjYWxsX2NvbnRleHQgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCA9IHBpcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QgPSBwb3Byb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHNlcWlkOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9PTkVXQVkpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgKHN0eWxlID09ICJDb2IiID8gIiAgcmV0dXJuIGNvYih0cnVlKTsiIDogIiAgcmV0dXJuIHRydWU7IikgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcHJvY2Vzc19mbigiIDw8IChzdHlsZSA9PSAiQ29iIiA/ICJjb2IsICIgOiAiIikKLSAgICAgICAgICAgICA8PCAiaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQiIDw8IGNhbGxfY29udGV4dF9hcmcgPDwgIik7IiA8PAotICAgIGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIG91dCA8PAotICAgIHRlbXBsYXRlX2hlYWRlciA8PAotICAgIHJldF90eXBlIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8IGNsYXNzX3N1ZmZpeCA8PCB0ZW1wbGF0ZV9zdWZmaXggPDwKLSAgICAiOjpwcm9jZXNzX2ZuKCIgPDwgZmluaXNoX2NvYiA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIiA8PAotICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIiA8PAotICAgICJzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dCA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBIT1Q6IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCB0eXBlbmFtZV9zdHIgPDwgInN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB2b2lkICgiIDw8Ci0gICAgc2VydmljZV9uYW1lXyA8PCBwc3R5bGUgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OiopKCIgPDwgZmluaXNoX2NvYl9kZWNsIDw8Ci0gICAgImludDMyX3QsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqLCAiIDw8Ci0gICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIiA8PCBjYWxsX2NvbnRleHRfZGVjbCA8PCAiKT46Oml0ZXJhdG9yIHBmbjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicGZuID0gcHJvY2Vzc01hcF8uZmluZChmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChwZm4gPT0gcHJvY2Vzc01hcF8uZW5kKCkpIHsiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrZm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgKHN0eWxlID09ICJDb2IiID8gIiAgcmV0dXJuIGNvYih0cnVlKTsiIDogIiAgcmV0dXJuIHRydWU7IikgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiCi0gICAgICAgICAgICAgICA8PCBleHRlbmRzIDw8ICI6OnByb2Nlc3NfZm4oIgotICAgICAgICAgICAgICAgPDwgKHN0eWxlID09ICJDb2IiID8gImNvYiwgIiA6ICIiKQotICAgICAgICAgICAgICAgPDwgImlwcm90LCBvcHJvdCwgZm5hbWUsIHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfYXJnIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZCkpKCIgPDwgY29iX2FyZyA8PCAic2VxaWQsIGlwcm90LCBvcHJvdCIgPDwgY2FsbF9jb250ZXh0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiByZXR1cm4gcGZuIHJldD8KLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyLCBzdHlsZSwgZmFsc2UpOwotICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlciwgc3R5bGUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyLCBzdHlsZSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIEdlbmVyYXRlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgdHlwZWRlZiwgZm9yIGNhbGxlcnMgd2hvIGRvbid0IGtub3cKLSAgICAvLyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUuCi0gICAgLy8KLSAgICAvLyBXZSBjYW4ndCB1c2UgVFByb3RvY29sIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHNpbmNlIFByb2Nlc3NvclQKLSAgICAvLyBwcm92aWRlcyBvdmVybG9hZGVkIHZlcnNpb25zIG9mIG1vc3QgbWV0aG9kcywgb25lIG9mIHdoaWNoIGFjY2VwdHMKLSAgICAvLyBUUHJvdG9jb2wgcG9pbnRlcnMsIGFuZCBvbmUgd2hpY2ggYWNjZXB0cyBQcm90b2NvbF8gcG9pbnRlcnMuICBUaGlzCi0gICAgLy8gcmVzdWx0cyBpbiBhIGNvbXBpbGUgZXJyb3IgaWYgaW5zdGFudGlhdGVkIHdpdGggUHJvdG9jb2xfID09IFRQcm90b2NvbC4KLSAgICAvLyBUaGVyZWZvcmUsIHdlIGRlZmluZSBURHVtbXlQcm90b2NvbCBzb2xlbHkgc28gd2UgY2FuIHVzZSBpdCBhcyB0aGUKLSAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICJ0eXBlZGVmICIgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGUgPDwKLSAgICAgICJQcm9jZXNzb3JUPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2w+ICIgPDwKLSAgICAgIHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsICZyZXN1bHQpOwotCi0gIHJlc3VsdC5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCIpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlLCBnZW5fY29iX3N0eWxlXyk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsICZyZXN1bHQsIHRydWUpOwotICB9Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCkgewotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgc3RyaW5nIHNlcnZpY2VfZnVuY19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLiIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgcHJvdF90eXBlID0KLSAgICAoc3BlY2lhbGl6ZWQgPyAiUHJvdG9jb2xfIiA6ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIik7Ci0gIHN0cmluZyBjbGFzc19zdWZmaXg7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGNsYXNzX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOwotICB9Ci0KLSAgLy8gSSB0cmllZCB0byBkbyB0aGlzIGFzIG9uZSBmdW5jdGlvbi4gIEkgcmVhbGx5IGRpZC4gIEJ1dCBpdCB3YXMgdG9vIGhhcmQuCi0gIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6IiA8PAotICAgICAgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjYWxsQ29udGV4dCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKLSAgICAgIC8vIElmIHRoZXNlIGFyZSBpbnN0YW5jZXMgb2YgUHJvdG9jb2xfLCBpbnN0ZWFkIG9mIGFueSBvbGQgVFByb3RvY29sLAotICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCBwcm9jZXNzIGZ1bmN0aW9uIGluc3RlYWQuCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX2lwcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGlwcm90KTsiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChfaXByb3QgJiYgX29wcm90KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoc2VxaWQsIF9pcHJvdCwgX29wcm90LCBjYWxsQ29udGV4dCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaXByb3QsIF9pcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGN0eCA9IGV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgY2FsbENvbnRleHQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKGV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIC8vIERlY2xhcmUgcmVzdWx0Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBmdW5jdGlvbnMgd2l0aCBleGNlcHRpb25zCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpZiAoaXNfY29tcGxleF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIocmVzdWx0LnN1Y2Nlc3MiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9IGlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIH0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENvYiBzdHlsZS4KLSAgZWxzZSB7Ci0gICAgLy8gUHJvY2Vzc29yIGVudHJ5IHBvaW50LgotICAgIC8vIFRPRE8oZWRoYWxsKSB1cGRhdGUgZm9yIGNhbGxDb250ZXh0IHdoZW4gVEV2ZW50U2VydmVyIGlzIHJlYWR5Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwKLSAgICAgICI6OnByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiB3ZSBjb3VsZCB0cnkgdG8gY29uc29sZGF0ZSB0aGlzCi0gICAgLy8gd2l0aCB0aGUgbm9uLWNvYiBjb2RlIGFib3ZlCi0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgewotICAgICAgLy8gSWYgdGhlc2UgYXJlIGluc3RhbmNlcyBvZiBQcm90b2NvbF8sIGluc3RlYWQgb2YgYW55IG9sZCBUUHJvdG9jb2wsCi0gICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHByb2Nlc3MgZnVuY3Rpb24gaW5zdGVhZC4KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfaXByb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaXByb3QpOyIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9pcHJvdCAmJiBfb3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihjb2IsIHNlcWlkLCBfaXByb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaXByb3QsIF9pcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyIgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgY3R4ID0gZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dChcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcihldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEhhbmRsZSBURXhjZXB0aW9ucz8gIEV4cG9zZSB0byBzZXJ2ZXI/Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleG4pIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gY29iKGZhbHNlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpZ3VyZSBvdXQgYSBzdHJhdGVneSBmb3IgZXhjZXB0aW9ucyBpbiBhc3luYyBoYW5kbGVycy4KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmcmVlci51bnJlZ2lzdGVyKCk7IiA8PCBlbmRsOwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAvLyBObyByZXR1cm4uICBKdXN0IGhhbmQgb2ZmIG91ciBjb2IuCi0gICAgICAvLyBUT0RPKGRyZWlzcyk6IENhbGwgdGhlIGNvYiBpbW1lZGlhdGVseT8KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwKLSAgICAgICAgInN0ZDo6dHIxOjpiaW5kKGNvYiwgdHJ1ZSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsgaW5kZW50X3VwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cmluZyByZXRfYXJnLCByZXRfcGxhY2Vob2xkZXI7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHJldF9hcmcgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKwotICAgICAgICAgICImIF9yZXR1cm4iOwotICAgICAgICByZXRfcGxhY2Vob2xkZXIgPSAiLCBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSI7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdoZW4gZ2VuX3RlbXBsYXRlc18gaXMgdHJ1ZSwgdGhlIHJldHVybl8gYW5kIHRocm93XyBmdW5jdGlvbnMgYXJlCi0gICAgICAvLyBvdmVybG9hZGVkLiAgV2UgaGF2ZSB0byBkZWNsYXJlIHBvaW50ZXJzIHRvIHRoZW0gc28gdGhhdCB0aGUgY29tcGlsZXIKLSAgICAgIC8vIGNhbiByZXNvbHZlIHRoZSBjb3JyZWN0IG92ZXJsb2FkZWQgdmVyc2lvbi4KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8Ci0gICAgICAgIGNsYXNzX3N1ZmZpeCA8PCAiOjoqcmV0dXJuX2ZuKShzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIiA8PAotICAgICAgICAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PAotICAgICAgICByZXRfYXJnIDw8ICIpID0iIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICBjbGFzc19zdWZmaXggPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8Ci0gICAgICAgICAgY2xhc3Nfc3VmZml4IDw8ICI6Oip0aHJvd19mbikoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIgPDwKLSAgICAgICAgICAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiIDw8Ci0gICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpID0iIDw8IGVuZGw7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwKLSAgICAgICAgICBjbGFzc19zdWZmaXggPDwgIjo6dGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOyBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic3RkOjp0cjE6OmJpbmQocmV0dXJuX2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgY3R4IiA8PAotICAgICAgICByZXRfcGxhY2Vob2xkZXIgPDwgIikiOwotICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgewotICAgICAgICBvdXQKLSAgICAgICAgICA8PCAnLCcgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnRyMTo6YmluZCh0aHJvd19mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsICIgPDwKLSAgICAgICAgICAiY3R4LCBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSkiOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFhYWCBXaGl0ZXNwYWNlIGNsZWFudXAuCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIG91dAotICAgICAgICAgICAgICAgICA8PCAnLCcgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOyBpbmRlbnRfZG93bigpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vIE5vcm1hbCByZXR1cm4uCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmV0X2FyZ19kZWNsLCByZXRfYXJnX25hbWU7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHJldF9hcmdfZGVjbCA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArCi0gICAgICAgICAgIiYgX3JldHVybiI7Ci0gICAgICAgIHJldF9hcmdfbmFtZSA9ICIsIF9yZXR1cm4iOwotICAgICAgfQotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIG91dCA8PAotICAgICAgICAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8Ci0gICAgICAgICI6OnJldHVybl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmdfZGVjbCA8PCAnKScgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKLSAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCi0gICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcmV0dXJuIGZ1bmN0aW9uIGluc3RlYWQuCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXR1cm5fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4IiA8PCByZXRfYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcHJlc3VsdCByZXN1bHQ7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAotICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGNvbnN0X2Nhc3Q8IiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKj4oJl9yZXR1cm4pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBjdHggPSBldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcihldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgXCIiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICJcIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgICAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgewotICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKLSAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCB0aHJvdyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4LCBfdGhyb3cpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcmVzdWx0IHJlc3VsdDsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiX3Rocm93LT50aHJvd19pdCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYihmYWxzZSk7IiA8PCBlbmRsOyAgLy8gSXMgdGhpcyBwb3NzaWJsZT8gIFRCRC4KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgJ30nOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8ICIgIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIH0KLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uIGlzIHRocm93bj8KLQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY3R4ID0gZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dChcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCBcIiIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIlwiKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsIFwiIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiXCIsIGJ5dGVzKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfSAvLyBmb3IgZWFjaCBmdW5jdGlvbgotICB9IC8vIGNvYiBzdHlsZQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIl9zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKLQotICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIiA8PCBlbmRsIDw8Ci0gICAgIi8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKCFucy5lbXB0eSgpKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpLTIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIklmIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NrZWxldG9uIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHByaW50ZihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcXG5cIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8ICJpbnQgcG9ydCA9IDkwOTA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyPiBoYW5kbGVyKG5ldyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyAiIDw8IHN2Y25hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBDbG9zZSB0aGUgZmlsZXMKLSAgZl9za2VsZXRvbi5jbG9zZSgpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gaXByb3QtPiI7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBvdXQgPDwgInJlYWRCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICJyZWFkSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgcmVhZGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkSTMyKCIgPDwgdCA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7Ci0gIGJvb2wgdXNlX3B1c2ggPSB0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGt0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgdnR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTGlzdEJlZ2luKCIgPDwKLSAgICAgIGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCF1c2VfcHVzaCkgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVzaXplKCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIHVzZV9wdXNoLCBpKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiID0gIiA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuaW5zZXJ0KCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfcHVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4KSB7Ci0gIGlmICh1c2VfcHVzaCkgewotICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2hfYmFjaygiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgcHJlZml4ICsgIlsiICsgaW5kZXggKyAiXSIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICI6OmNvbnN0X2l0ZXJhdG9yICIgPDwgaXRlciA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggIDw8ICIuYmVnaW4oKTsgIiA8PCBpdGVyIDw8ICIgIT0gIiA8PCBwcmVmaXggPDwgIi5lbmQoKTsgKysiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlcik7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLT5maXJzdCIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLT5zZWNvbmQiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogTWFrZXMgYSA6OiBwcmVmaXggZm9yIGEgbmFtZXNwYWNlCi0gKgotICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKLSAqIEByZXR1cm4gTmFtZXNwYWNlcwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfcHJlZml4KHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICI6OiI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIE9wZW5zIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9vcGVuKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBzdHJpbmcgc2VwYXJhdG9yID0gIiI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7Ci0gICAgcmVzdWx0ICs9ICJuYW1lc3BhY2UgIjsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICIgeyI7Ci0gICAgc2VwYXJhdG9yID0gIiAiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3IgKyAibmFtZXNwYWNlICIgKyBucyArICIgeyI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgbmFtZXNwYWNlLgotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX2Nsb3NlKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICJ9IjsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9ICJ9IjsKLSAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgLy8gbmFtZXNwYWNlIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQysrIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHR5cGUgbmFtZSwgaS5lLiBzdGQ6OnNldDx0eXBlPgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGFyZykgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKLSAgICBpZiAoIWFyZykgewotICAgICAgcmV0dXJuIGJuYW1lOwotICAgIH0KLQotICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGEgY3VzdG9tIG92ZXJsb2FkZWQgQysrIG5hbWUKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIHN0cmluZyBjbmFtZTsKLQotICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKikgdHR5cGU7Ci0gICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjptYXA8IiArCi0gICAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiLCAiICsKLSAgICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0KikgdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6OnNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6dmVjdG9yPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOwotICAgIH0KLQotICAgIGlmIChhcmcpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gY25hbWU7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIGNsYXNzX3ByZWZpeDsKLSAgaWYgKGluX3R5cGVkZWYgJiYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICBjbGFzc19wcmVmaXggPSAiY2xhc3MgIjsKLSAgfQotCi0gIC8vIENoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIG5hbWVzcGFjZWQKLSAgc3RyaW5nIHBuYW1lOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcG5hbWUgPQotICAgICAgY2xhc3NfcHJlZml4ICsKLSAgICAgIG5hbWVzcGFjZV9wcmVmaXgocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpICsKLSAgICAgIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9IGVsc2UgewotICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSAmJiAhZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgcG5hbWUgKz0gIjo6dHlwZSI7Ci0gIH0KLQotICBpZiAoYXJnKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHBuYW1lOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEByZXR1cm4gRXhwbGljaXQgQysrIHR5cGUsIGkuZS4gImludDMyX3QiCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2wiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJpbnQ4X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gImludDE2X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludDMyX3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEByZXR1cm4gRmllbGQgZGVjbGFyYXRpb24sIGkuZS4gaW50IHggPSAwOwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIHBvaW50ZXIsIGJvb2wgY29uc3RhbnQsIGJvb2wgcmVmZXJlbmNlKSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGlmIChjb25zdGFudCkgewotICAgIHJlc3VsdCArPSAiY29uc3QgIjsKLSAgfQotICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICBpZiAocmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICImIjsKLSAgfQotICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IFwiXCIiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7Ci0gICAgfQotICB9Ci0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBib29sIGhhc194Y2VwdGlvbnMgPSAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKTsKLQotICBpZiAoc3R5bGUgPT0gIiIpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgICAgcmV0dXJuCi0gICAgICAgICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgICAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgKG5hbWVfcGFyYW1zID8gIiYgX3JldHVybiIgOiAiJiAvKiBfcmV0dXJuICovIikgKwotICAgICAgICBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuCi0gICAgICAgIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgICAiKCIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoc3R5bGUuc3Vic3RyKDAsMykgPT0gIkNvYiIpIHsKLSAgICBzdHJpbmcgY29iX3R5cGU7Ci0gICAgc3RyaW5nIGV4bl9jb2I7Ci0gICAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKLSAgICAgIGNvYl90eXBlID0gIigiICsgc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOwotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgIGNvYl90eXBlICs9ICJUPFByb3RvY29sXz4iOwotICAgICAgfQotICAgICAgY29iX3R5cGUgKz0gIiogY2xpZW50KSI7Ci0gICAgfSBlbHNlIGlmIChzdHlsZSA9PSJDb2JTdiIpIHsKLSAgICAgIGNvYl90eXBlID0gKHR0eXBlLT5pc192b2lkKCkKLSAgICAgICAgICAgICAgICAgID8gIigpIgotICAgICAgICAgICAgICAgICAgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOwotICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKLSAgICAgICAgZXhuX2NvYiA9ICIsIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOwotICAgIH0KLQotICAgIHJldHVybgotICAgICAgInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkIiArIGNvYl90eXBlICsgIj4gY29iIiArIGV4bl9jb2IgKwotICAgICAgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOwotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zLCBib29sIHN0YXJ0X2NvbW1hKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSAhc3RhcnRfY29tbWE7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSArICIgIiArCi0gICAgICAobmFtZV9wYXJhbXMgPyAoKmZfaXRlciktPmdldF9uYW1lKCkgOiAiLyogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgKi8iKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHlwZSBUaHJpZnQgVHlwZQotICogQHJldHVybiBTdHJpbmcgb2YgQysrIGNvZGUgdG8gZGVmaW5pdGlvbiBvZiB0aGF0IHR5cGUgY29uc3RhbnQKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgc3ltYm9sIG5hbWUgb2YgdGhlIGxvY2FsIHJlZmxlY3Rpb24gb2YgYSB0eXBlLgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpsb2NhbF9yZWZsZWN0aW9uX25hbWUoY29uc3QgY2hhciogcHJlZml4LCB0X3R5cGUqIHR0eXBlLCBib29sIGV4dGVybmFsKSB7Ci0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgLy8gV2UgaGF2ZSB0byB1c2UgdGhlIHByb2dyYW0gbmFtZSBhcyBwYXJ0IG9mIHRoZSBpZGVudGlmaWVyIGJlY2F1c2UKLSAgLy8gaWYgdHdvIHRocmlmdCAicHJvZ3JhbXMiIGFyZSBjb21waWxlZCBpbnRvIG9uZSBhY3R1YWwgcHJvZ3JhbQotICAvLyB5b3Ugd291bGQgZ2V0IGEgc3ltYm9sIGNvbGxpc2lvbiBpZiB0aGV5IGJvdGggZGVmaW5lZCBsaXN0PGkzMj4uCi0gIC8vIHRybG8gPSBUaHJpZnQgUmVmbGVjdGlvbiBMT2NhbC4KLSAgc3RyaW5nIHByb2c7Ci0gIHN0cmluZyBuYW1lOwotICBzdHJpbmcgbnNwYWNlOwotCi0gIC8vIFRPRE8oZHJlaXNzKTogV291bGQgaXQgYmUgYmV0dGVyIHRvIHByZWdlbmVyYXRlIHRoZSBiYXNlIHR5cGVzCi0gIC8vICAgICAgICAgICAgICAgYW5kIHB1dCB0aGVtIGluIFRocmlmdC57aCxjcHB9ID8KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcHJvZyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIGFzc2VydCh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMKTsKLSAgICBwcm9nID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7Ci0gICAgbmFtZSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBwcm9nID0gcHJvZ3JhbV8tPmdldF9uYW1lKCk7Ci0gICAgbmFtZSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKTsKLSAgICBhc3NlcnQodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCk7Ci0gICAgcHJvZyA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBpZiAoZXh0ZXJuYWwgJiYKLSAgICAgIHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwgJiYKLSAgICAgIHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7Ci0gICAgbnNwYWNlID0gbmFtZXNwYWNlX3ByZWZpeCh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotICB9Ci0KLSAgcmV0dXJuIG5zcGFjZSArICJ0cmxvXyIgKyBwcmVmaXggKyAiXyIgKyBwcm9nICsgIl8iICsgbmFtZTsKLX0KLQotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6Z2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgewotICBzdHJpbmcgaW5jbHVkZV9wcmVmaXggPSBwcm9ncmFtLmdldF9pbmNsdWRlX3ByZWZpeCgpOwotICBpZiAoIXVzZV9pbmNsdWRlX3ByZWZpeF8gfHwKLSAgICAgIChpbmNsdWRlX3ByZWZpeC5zaXplKCkgPiAwICYmIGluY2x1ZGVfcHJlZml4WzBdID09ICcvJykpIHsKLSAgICAvLyBpZiBmbGFnIGlzIHR1cm5lZCBvZmYgb3IgdGhpcyBpcyBhYnNvbHV0ZSBwYXRoLCByZXR1cm4gZW1wdHkgcHJlZml4Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKLSAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9wcmVmaXgucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuIGluY2x1ZGVfcHJlZml4LnN1YnN0cigwLCBsYXN0X3NsYXNoKSArICIvIiArIG91dF9kaXJfYmFzZV8gKyAiLyI7Ci0gIH0KLQotICByZXR1cm4gIiI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjcHAsICJDKysiLAotIiAgICBwdXJlX2VudW1zOiAgICAgIEdlbmVyYXRlIHB1cmUgZW51bXMgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuXG4iCi0iICAgIGRlbnNlOiAgICAgICAgICAgR2VuZXJhdGUgdHlwZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRlbnNlIHByb3RvY29sLlxuIgotIiAgICBpbmNsdWRlX3ByZWZpeDogIFVzZSBmdWxsIGluY2x1ZGUgcGF0aHMgaW4gZ2VuZXJhdGVkIGZpbGVzLlxuIgotKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWVkNjQ2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvcgotewotICBwdWJsaWM6Ci0gICAgdF9jc2hhcnBfZ2VuZXJhdG9yKAotICAgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gICAgewotICAgICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jc2hhcnAiOwotICAgIH0KLSAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgICB2b2lkIGdlbmVyYXRlX2VudW0gKHRfZW51bSogdGVudW0pOwotICAgIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYyk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKLSAgICBib29sIHByaW50X2NvbnN0X3ZhbHVlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSwgYm9vbCBuZWVkdHlwZT1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotICAgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6OnN0cmluZyBtYXApOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0gICAgdm9pZCBlbmRfY3NoYXJwX25hbWVzcGFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLQotICAgIHN0ZDo6c3RyaW5nIGNzaGFycF90eXBlX3VzaW5ncygpOwotICAgIHN0ZDo6c3RyaW5nIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb3VudGFpbmVyPWZhbHNlLCBib29sIGluX2luaXQ9ZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCk7Ci0KLSAgICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOwotICAgIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLX07Ci0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7Ci0KLSAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8ICJcbiI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZW5kX2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90eXBlX3VzaW5ncygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsKLSAgICAidXNpbmcgU3lzdGVtO1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iICsKLSAgICAidXNpbmcgVGhyaWZ0O1xuIiArCi0gICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90aHJpZnRfdXNpbmdzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKwotICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2w7XG4iICsKLSAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDtcbiI7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7IH0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfKyIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkrIi5jcyI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKXsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvQ29uc3RhbnRzLmNzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKLQotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBDb25zdGFudHMiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfY29uc3RzKTsKLQotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpLCBmYWxzZSkpIHsKLSAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpIHsKLSAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihmX2NvbnN0cywgY29uc3RzKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9jb25zdHMpOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKLXsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIENvbnN0YW50cygpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLy9pdCBzZWVtcyBsaWtlIGFsbCB0aGF0IG1ldGhvZHMgdGhhdCBjYWxsIHRoaXMgYXJlIHVzaW5nIGluX3N0YXRpYyB0byBiZSB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBpdCB3b3VsZCBpbXBseQotYm9vbCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCwgYm9vbCBuZWVkdHlwZSkgewotICBpbmRlbnQob3V0KTsKLSAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSAhaW5fc3RhdGljOwotICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkgewotICAgIG91dCA8PAotICAgICAgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgIikgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gIH0KLQotICByZXR1cm4gbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCkgbmFtZTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRiYXNlOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0KLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PAotICAgIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGluX2NsYXNzLCBib29sIGlzX3Jlc3VsdCkgewotCi0gIGlmICghaW5fY2xhc3MpIHsKLSAgICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOwotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0gCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIkV4Y2VwdGlvbiwgIjsKLSAgfQotICBvdXQgPDwgIlRCYXNlIjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy9tYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSk7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInB1YmxpYyBib29sICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuXyIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghaW5fY2xhc3MpCi0gIHsKLSAgICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgdm9pZCBSZWFkIChUUHJvdG9jb2wgaXByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZGVmYXVsdDogIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKF9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICIgZWxzZSBpZiAiOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgIih0aGlzLl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5OYW1lID0gXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iOwotICAgIH0KLSAgfQotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoXCIiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoXCIsIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiPT0gbnVsbCA/IFwiPG51bGw+XCIgOiAiPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJzYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicmV0dXJuIHNiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PAotICAgIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCi0gIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpcHJvdCwgb3Byb3QpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gaXByb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIG9wcm90XzsgfSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DYWxsLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QgKnhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0KLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3M7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCAqeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpKTsgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgbmFtZSA8PCAiID0gIjsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCi0gICAgewotICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgImlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PGVuZGw7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IoIGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudCIgPDwgIjsgIiA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0KLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQpOwotICAKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIAotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICBzd2l0Y2godGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0YmFzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJXcml0ZUkzMigoaW50KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiBpbiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5LZXlzKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIGluICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgaW4gIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3V0LCB0ZmllbGQsIGlzUHVibGljLCAiXyIpOwotfQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJnZXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgewotICAgIHN0cmluZyBuYW1lICh0ZmllbGQtPmdldF9uYW1lKCkpOwotICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICAgIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgewotICAodm9pZCkgaW5faW5pdDsKLSAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKwotICAgICAgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKLSAgICBpZiAoIW5zLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBucyArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcikgewotICAodm9pZCkgaW5fY29udGFpbmVyOwotICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgcmV0dXJuICJieXRlW10iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgICAgfQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAic2hvcnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJsb25nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRiYXNlLT5nZXRfYmFzZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0ZDo6c3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTWFwIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU2V0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3NoYXJwLCAiQyMiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5YTgyMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogRXJsYW5nIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9lcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfZXJsX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHByb2dyYW1fbmFtZV9bMF0gPSB0b2xvd2VyKHByb2dyYW1fbmFtZV9bMF0pOwotICAgIHNlcnZpY2VfbmFtZV9bMF0gPSB0b2xvd2VyKHNlcnZpY2VfbmFtZV9bMF0pOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWVybCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpvc3RyZWFtJiBocmxfb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgZXJsX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBlcmxfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotCi0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX3R5cGVfdGVybSh0X3R5cGUqIHR0eXBlLCBib29sIGV4cGFuZF9zdHJ1Y3RzKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG91cHBlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdW5jYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICByZXR1cm4gaW47Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAotICAgKi8KLQotICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZXhwb3J0X3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICB2b2lkIGV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKLQotICAvKioKLSAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcwotICAgKi8KLQotICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcwotICAgKi8KLQotICBib29sIGV4cG9ydF9saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOwotCi0gIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2hybF9maWxlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2ZpbGVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9ocmxfOwotCi19OwotCi0KLS8qKgotICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCi0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLQotICAvLyB0eXBlcyBmaWxlcwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuZXJsIjsKLSAgc3RyaW5nIGZfdHlwZXNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5ocmwiOwotCi0gIGZfdHlwZXNfZmlsZV8ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIGZfdHlwZXNfaHJsX2ZpbGVfLm9wZW4oZl90eXBlc19ocmxfbmFtZS5jX3N0cigpKTsKLQotICBocmxfaGVhZGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBwcm9ncmFtX25hbWVfICsgIl90eXBlcyIpOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwKLSAgICBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICItbW9kdWxlKCIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzKS4iIDw8IGVuZGwgPDwKLSAgICBlcmxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19maWxlXyA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgLy8gY29uc3RzIGZpbGUKLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuaHJsIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0c18gPDwKLSAgICBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEJvaWxlcnBsYXRlIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGhlYWRlciBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2hlYWRlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiLWlmbmRlZihfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQpLiIgPDwgZW5kbCA8PAotICAgICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIiA8PCBlbmRsOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2Zvb3Rlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgdW5jYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuaHJsXCIpLlxuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiUlXG4iKSArCi0gICAgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAiJSVcbiIgKwotICAgICIlJSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiJSVcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9pbXBvcnRzKCkgewotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKLQotICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbDsKLSAgZl90eXBlc19maWxlXyA8PCBmX3R5cGVzXy5zdHIoKTsKLSAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oJ2kgYW0gYSBkdW1teSBzdHJ1Y3QnKSAtPiB1bmRlZmluZWQuIiA8PCBlbmRsOwotCi0gIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7Ci0KLSAgZl90eXBlc19maWxlXy5jbG9zZSgpOwotICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBubyBvcAotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc19ocmxfZmlsZV8pIDw8Ci0gICAgICAiLWRlZmluZSgiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCBuYW1lIDw8ICIsICIgPDwgdmFsdWUgPDwgIikuIjw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICItZGVmaW5lKCIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiXyIgPDwgbmFtZSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIjIiA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICJ7IjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgIiA9ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiKCIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpICA8PCAiLCIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCAiXSkiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgInNldHM6ZnJvbV9saXN0KFsiOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICIsdHJ1ZSkiOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9lcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdAotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgZl90eXBlc19ocmxfZmlsZV8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGhybF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpCi17Ci0gICh2b2lkKSBpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSAgICAgPDwgIiUgLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKLSAgICBpbmRlbnQoaHJsX291dCkgPDwgICAiLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0ICAgICA8PCAiLCAiOwotICAgICAgICBocmxfb3V0IDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdW5jYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgICAgIDw8IG5hbWU7Ci0gICAgICBocmxfb3V0IDw8IG5hbWU7Ci0gICAgfQotICAgIG91dCAgICAgPDwgIn0pLiIgPDwgZW5kbDsKLSAgICBocmxfb3V0IDw8ICJ9KS4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7IC8vIG5vIG1lbWJlcnM7IGV4cGxpY2l0IGNvbW1lbnQKLSAgICBpbmRlbnQob3V0KSAgICAgPDwgIiUgLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7fSkuIiA8PCBlbmRsOwotICAgIGluZGVudChocmxfb3V0KSA8PCAgICItcmVjb3JkKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHt9KS4iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgaHJsX291dCA8PCBlbmRsOwotCi0KLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mbygnIiA8PCBuYW1lIDw8ICInKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGdlbmVyYXRlX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gc29tZWhvdyB0aGlzIHBvaW50IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBhbmQgaXQncyBub3QgZG93bmNhc2VkIHlldAotICAvLyAuLi5hd2Vzb21lCi0gIHNlcnZpY2VfbmFtZV9bMF0gPSB0b2xvd2VyKHNlcnZpY2VfbmFtZV9bMF0pOwotCi0gIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIl90aHJpZnQuaHJsIjsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyJfdGhyaWZ0LmVybCI7Ci0gIGZfc2VydmljZV9maWxlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfaHJsXy5vcGVuKGZfc2VydmljZV9ocmxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCBzZXJ2aWNlIHRleHQgYWdncmVnYXRpbmcgc3RyZWFtIHN0cmVhbXMKLSAgZl9zZXJ2aWNlXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfLnN0cigiIik7Ci0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIGhybF9oZWFkZXIoZl9zZXJ2aWNlX2hybF8sIHNlcnZpY2VfbmFtZV8pOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIiA8PAotICAgICAgdW5jYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfaHJsXyA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7IC8vIGNwaXJvOiBOZXcgRXJsYW5nIE9yZGVyCi0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIC8vIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICAiLW1vZHVsZSgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl90aHJpZnQpLiIgPDwgZW5kbCA8PAotICAgICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7Ci0KLSAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfICAgIDw8ICJzdHJ1Y3RfaW5mbygnaSBhbSBhIGR1bW15IHN0cnVjdCcpIC0+IHVuZGVmaW5lZC4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRmdW5jdGlvbjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi0gIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgICAvLyBVc2UgYSBzcGVjaWFsIHJldHVybiBjb2RlIGZvciBub25leGlzdGVudCBmdW5jdGlvbnMKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhfRnVuYywgX0luZm8pIC0+IG5vX2Z1bmN0aW9uLiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHBhcmFtc190eXBlKSBhbmQKLSAqIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCByZXBseV90eXBlKQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgc3RyaW5nIG5hbWVfYXRvbSA9ICInIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICInIjsKLQotCi0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZ2VuZXJhdGVfdHlwZV90ZXJtKGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHJlcGx5X3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBnZW5lcmF0ZV90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7Ci0gIGVsc2UKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIGV4Y2VwdGlvbnMpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGdlbmVyYXRlX3R5cGVfdGVybSh4cywgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKSB7ICAvLyBUT0RPCi0gIHN0cmluZyByZXN1bHQgPSAiQCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgKz0gIiA9IG5pbCI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoVGhpcyIgKyAgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpICsgIikiOwotfQotCi0vKioKLSAqIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBleHBvcnRzIGxpc3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF9saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF9saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF90eXBlc19zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICApOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgewotICBpZiAoZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XykgewotICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfIDw8ICIsICI7Ci0gIH0KLSAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgZXhwb3J0X3N0cmluZyhwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgMSAvLyBUaGlzCi0gICAgICAgICAgICAgICAgKyAoKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSktPmdldF9tZW1iZXJzKCkpLnNpemUoKQotICAgICAgICAgICAgICAgICk7Ci19Ci0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHJlc3VsdCArPSAiLCAiOyAvLyBpbml0aWFsIGNvbW1hIHRvIGNvbXBlbnNhdGUgZm9yIGluaXRpYWwgVGhpcwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgbmFtZSA9IHVuY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEVybGFuZyAidHlwZSIgKG1hY3JvIGZvciBpbnQgY29uc3RhbnRzKQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI/dFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiP3RUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIGFuIEVybGFuZyB0ZXJtIHdoaWNoIHJlcHJlc2VudHMgYSB0aHJpZnQgdHlwZQotICovCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVfdGVybSh0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF9zdHJ1Y3RzKSB7Ci0gICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaWYgKGV4cGFuZF9zdHJ1Y3RzKSB7Ci0gICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFR5cGVUZXJtfSwge0ZpZCwgVHlwZVRlcm19Li4uXX0KLSAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJldDsKLQotCi0gICAgICByZXQgPDwgIntzdHJ1Y3QsIFsiOwotCi0gICAgICBpbnQgZmlyc3QgPSB0cnVlOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIC8vIENvbW1hIHNlcGFyYXRlIHRoZSB0dXBsZXMKLSAgICAgICAgaWYgKCFmaXJzdCkgcmV0IDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpOwotICAgICAgICBmaXJzdCA9IGZhbHNlOwotCi0gICAgICAgIHJldCA8PCAieyIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PAotICAgICAgICAgIGdlbmVyYXRlX3R5cGVfdGVybSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlKSA8PCAifSI7Ci0gICAgICB9Ci0KLSAgICAgIHJldCA8PCAiXX0iIDw8IGVuZGw7Ci0KLSAgICAgIHJldHVybiByZXQuc3RyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAie3N0cnVjdCwgeyciICsgdHlwZV9tb2R1bGUodHlwZSkgKyAiJywgJyIgKyB0eXBlX25hbWUodHlwZSkgKyAiJ319IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAvLyB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfQotICAgIHRfdHlwZSAqa2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlICp2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIHJldHVybiAie21hcCwgIiArIGdlbmVyYXRlX3R5cGVfdGVybShrZXlfdHlwZSwgZmFsc2UpICsgIiwgIiArCi0gICAgICBnZW5lcmF0ZV90eXBlX3Rlcm0odmFsX3R5cGUsIGZhbHNlKSArICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlICplbGVtX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgcmV0dXJuICJ7c2V0LCAiICsgZ2VuZXJhdGVfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlICplbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie2xpc3QsICIgKyBnZW5lcmF0ZV90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSkgewotICByZXR1cm4gdW5jYXBpdGFsaXplKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICJfdHlwZXMiOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGVybCwgIkVybGFuZyIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxOTI5Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIFRvcCBsZXZlbCBwcm9ncmFtIGdlbmVyYXRpb24gZnVuY3Rpb24uIENhbGxzIHRoZSBnZW5lcmF0b3Igc3ViY2xhc3MgbWV0aG9kcwotICogZm9yIHByZXBhcmluZyBmaWxlIHN0cmVhbXMgZXRjLiB0aGVuIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiB0aGUKLSAqIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBhY3Rpb25zLgotICoKLSAqIEBwYXJhbSBwcm9ncmFtIFRoZSB0aHJpZnQgcHJvZ3JhbSB0byBjb21waWxlIGludG8gQysrIHNvdXJjZQotICovCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKLSAgaW5pdF9nZW5lcmF0b3IoKTsKLQotICAvLyBHZW5lcmF0ZSBlbnVtcwotICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgfQotCi0gIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKLSAgY2xvc2VfZ2VuZXJhdG9yKCk7Ci19Ci0KLXN0cmluZyB0X2dlbmVyYXRvcjo6ZXNjYXBlX3N0cmluZyhjb25zdCBzdHJpbmcgJmluKSBjb25zdCB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW4uYmVnaW4oKTsgaXQgPCBpbi5lbmQoKTsgaXQrKykgewotICAgIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgcmVzID0gZXNjYXBlXy5maW5kKCppdCk7Ci0gICAgaWYgKHJlcyAhPSBlc2NhcGVfLmVuZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKHJlcy0+c2Vjb25kKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0LnB1c2hfYmFjaygqaXQpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGdlbmVyYXRlX2NvbnN0KCpjX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpIHsKLSAgaWYgKGNvbW1lbnRfc3RhcnQgIT0gIiIpIGluZGVudChvdXQpIDw8IGNvbW1lbnRfc3RhcnQ7Ci0gIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBpb3NfYmFzZTo6aW4pOwotICB3aGlsZSAoIWRvY3MuZW9mKCkpIHsKLSAgICBjaGFyIGxpbmVbMTAyNF07Ci0gICAgZG9jcy5nZXRsaW5lKGxpbmUsIDEwMjQpOwotCi0gICAgLy8gSnVzdCBwcm50IGEgbmV3bGluZSB3aGVuIHRoZSBsaW5lICYgcHJlZml4IGFyZSBlbXB0eS4KLSAgICBpZiAoc3RybGVuKGxpbmUpID09IDAgJiYgbGluZV9wcmVmaXggPT0gIiIgJiYgIWRvY3MuZW9mKCkpIHsKLSAgICAgICAgb3V0IDw8IHN0ZDo6ZW5kbDsKLSAgICB9IGVsc2UgaWYgKHN0cmxlbihsaW5lKSA+IDAgfHwgIWRvY3MuZW9mKCkpIHsgIC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQotICAgICAgaW5kZW50KG91dCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9Ci0gIGlmIChjb21tZW50X2VuZCAhPSAiIikgaW5kZW50KG91dCkgPDwgY29tbWVudF9lbmQ7Ci19Ci0KLQotdm9pZCB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpIHsKLSAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgaWYgKHRoZV9tYXAuZmluZChmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpKSAhPSB0aGVfbWFwLmVuZCgpKSB7Ci0gICAgZmFpbHVyZSgiRHVwbGljYXRlIGdlbmVyYXRvcnMgZm9yIGxhbmd1YWdlIFwiJXNcIiFcbiIsIGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLSAgdGhlX21hcFtmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpXSA9IGZhY3Rvcnk7Ci19Ci0KLXRfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25zKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gb3B0aW9ucy5maW5kKCc6Jyk7Ci0gIHN0cmluZyBsYW5ndWFnZSA9IG9wdGlvbnMuc3Vic3RyKDAsIGNvbG9uKTsKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zOwotICBpZiAoY29sb24gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gY29sb24rMTsKLSAgICB3aGlsZSAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgPCBvcHRpb25zLnNpemUoKSkgewotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbmV4dF9wb3MgPSBvcHRpb25zLmZpbmQoJywnLCBwb3MpOwotICAgICAgc3RyaW5nIG9wdGlvbiA9IG9wdGlvbnMuc3Vic3RyKHBvcywgbmV4dF9wb3MtcG9zKTsKLSAgICAgIHBvcyA9ICgobmV4dF9wb3MgPT0gc3RyaW5nOjpucG9zKSA/IG5leHRfcG9zIDogbmV4dF9wb3MrMSk7Ci0KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNlcGFyYXRvciA9IG9wdGlvbi5maW5kKCc9Jyk7Ci0gICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKLSAgICAgIGlmIChzZXBhcmF0b3IgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGtleSA9IG9wdGlvbjsKLSAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGtleSA9IG9wdGlvbi5zdWJzdHIoMCwgc2VwYXJhdG9yKTsKLSAgICAgICAgdmFsdWUgPSBvcHRpb24uc3Vic3RyKHNlcGFyYXRvcisxKTsKLSAgICAgIH0KLQotICAgICAgcGFyc2VkX29wdGlvbnNba2V5XSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIGdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlciA9IHRoZV9tYXAuZmluZChsYW5ndWFnZSk7Ci0KLSAgaWYgKGl0ZXIgPT0gdGhlX21hcC5lbmQoKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGl0ZXItPnNlY29uZC0+Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9ucyk7Ci19Ci0KLXRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QmIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpIHsKLSAgLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9jdG9ycy5odG1sI2ZhcS0xMC4xMgotICBzdGF0aWMgZ2VuX21hcF90KiB0aGVfbWFwID0gbmV3IGdlbl9tYXBfdCgpOwotICByZXR1cm4gKnRoZV9tYXA7Ci19Ci0KLXRfZ2VuZXJhdG9yX2ZhY3Rvcnk6OnRfZ2VuZXJhdG9yX2ZhY3RvcnkoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKLSAgOiBzaG9ydF9uYW1lXyhzaG9ydF9uYW1lKQotICAsIGxvbmdfbmFtZV8obG9uZ19uYW1lKQotICAsIGRvY3VtZW50YXRpb25fKGRvY3VtZW50YXRpb24pCi17Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodGhpcyk7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTA1NjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dFTkVSQVRPUl9ICi0jZGVmaW5lIFRfR0VORVJBVE9SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMKLSAqIHJvdXRpbmVzIGZvciBjb2RlIGdlbmVyYXRpb24gYW5kIGNvbnRhaW5zIHRoZSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQKLSAqIGRpc3BhdGNoZXMgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyB2YXJpb3VzIGNvbXBvbmVudHMuCi0gKgotICovCi1jbGFzcyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgICB0bXBfID0gMDsKLSAgICBpbmRlbnRfID0gMDsKLSAgICBwcm9ncmFtXyA9IHByb2dyYW07Ci0gICAgcHJvZ3JhbV9uYW1lXyA9IGdldF9wcm9ncmFtX25hbWUocHJvZ3JhbSk7Ci0gICAgZXNjYXBlX1snXG4nXSA9ICJcXG4iOwotICAgIGVzY2FwZV9bJ1xyJ10gPSAiXFxyIjsKLSAgICBlc2NhcGVfWydcdCddID0gIlxcdCI7Ci0gICAgZXNjYXBlX1snIiddICA9ICJcXFwiIjsKLSAgICBlc2NhcGVfWydcXCddID0gIlxcXFwiOwotICB9Ci0KLSAgdmlydHVhbCB+dF9nZW5lcmF0b3IoKSB7fQotCi0gIC8qKgotICAgKiBGcmFtZXdvcmsgZ2VuZXJhdG9yIG1ldGhvZCB0aGF0IGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiBhIHByb2dyYW0KLSAgICogYW5kIHBlcmZvcm1zIGdlbmVyYWwgYWN0aW9ucy4gVGhpcyBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYmFzZSBjbGFzcyBhbmQKLSAgICogc2hvdWxkIG5vdCBub3JtYWxseSBiZSBvdmVyd3JpdHRlbiBpbiB0aGUgc3ViY2xhc3Nlcy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0KLSAgY29uc3QgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIHByb2dyYW1fOyB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmVfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudF9lbmQpOwotCi0gIC8qKgotICAgKiBjaGVjayB3aGV0aGVyIHN1Yi1uYW1lc3BhY2UgZGVjbGFyYWN0aW9uIGlzIHVzZWQgYnkgZ2VuZXJhdG9yLgotICAgKiBlLmcuIGFsbG93Ci0gICAqIG5hbWVzcGFjZSBweS50d2lzdGVkIGJhcgotICAgKiB0byBzcGVjaWZ5IG5hbWVzcGFjZSB0byB1c2Ugd2hlbiAtZ2VuIHB5OnR3aXN0ZWQgaXMgc3BlY2lmaWVkLgotICAgKiBXaWxsIGJlIGNhbGxlZCB3aXRoIHN1Ym5hbWVzcGFjZSwgaS5lLiBpc192YWxpZF9uYW1lc3BhY2UoInR3aXN0ZWQiKQotICAgKiB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIGFib3ZlIGV4YW1wbGUuCi0gICAqLwotICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgICAodm9pZCkgc3ViX25hbWVzcGFjZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogRXNjYXBlIHN0cmluZyB0byB1c2Ugb25lIGluIGdlbmVyYXRlZCBzb3VyY2VzLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBlc2NhcGVfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZpbikgY29uc3Q7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2VzY2FwZWRfc3RyaW5nKHRfY29uc3RfdmFsdWUqIGNvbnN0dmFsKSB7Ci0gICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLQotICAvKioKLSAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbWxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gdGFrZSBuZWNlc3NhcnkKLSAgICogc3RlcHMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgY29kZSBnZW5lcmF0aW9uLgotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7fQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQdXJlIHZpcnR1YWwgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzZXMuCi0gICAqLwotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pICAgICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KSB7Ci0gICAgKHZvaWQpIHRjb25zdDsKLSAgfQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpICAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKSAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbikgewotICAgIC8vIEJ5IGRlZmF1bHQgZXhjZXB0aW9ucyBhcmUgdGhlIHNhbWUgYXMgc3RydWN0cwotICAgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHByb2dyYW0gbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3Byb2dyYW1fbmFtZSh0X3Byb2dyYW0qIHRwcm9ncmFtKSB7Ci0gICAgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5Ci0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9vdXRfZGlyKCkgY29uc3QgewotICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUsIHdoaWNoIGlzIGp1c3QgIm5hbWUiIHdpdGggYQotICAgKiBudW1iZXIgYXBwZW5kZWQgdG8gaXQgKGkuZS4gbmFtZTM1KQotICAgKi8KLSAgc3RkOjpzdHJpbmcgdG1wKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIG91dCA8PCBuYW1lIDw8IHRtcF8rKzsKLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVycwotICAgKi8KLQotICB2b2lkIGluZGVudF91cCgpewotICAgICsraW5kZW50XzsKLSAgfQotCi0gIHZvaWQgaW5kZW50X2Rvd24oKSB7Ci0gICAgLS1pbmRlbnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCi0gICAqLwotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgewotICAgICAgaW5kICs9ICIgICI7Ci0gICAgfQotICAgIHJldHVybiBpbmQ7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCi0gICAqLwotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0gJm9zKSB7Ci0gICAgcmV0dXJuIG9zIDw8IGluZGVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBsb3dlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKLSAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAotICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCi0gICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCi0gICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCi0gICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCi0gICAqLwotICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKLSAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKLSAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgdG8gYSBjYW1lbCBjYXNlIGVxdWl2YWxlbnQKLSAgICAqIGUuZy4gYV9tdWx0aV93b3JkIC0+IGFNdWx0aVdvcmQKLSAgICAqICAgICAgc29tZV9uYW1lICAgIC0+ICBzb21lTmFtZQotICAgICogICAgICBuYW1lICAgICAgICAgLT4gIG5hbWUKLSAgICAqLwotICBzdGQ6OnN0cmluZyBjYW1lbGNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGJvb2wgdW5kZXJzY29yZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGluW2ldID09ICdfJykgewotICAgICAgICB1bmRlcnNjb3JlID0gdHJ1ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAodW5kZXJzY29yZSkgewotICAgICAgICBvdXQgPDwgKGNoYXIpIHRvdXBwZXIoaW5baV0pOwotICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgb3V0IDw8IGluW2ldOwotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgICByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKLSAgICovCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCi0gICAqLwotICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOwotCi0gIC8qKgotICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgotICAgKi8KLSAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87Ci0KLSBwcml2YXRlOgotICAvKioKLSAgICogQ3VycmVudCBjb2RlIGluZGVudGF0aW9uIGxldmVsCi0gICAqLwotICBpbnQgaW5kZW50XzsKLQotICAvKioKLSAgICogVGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIsIGZvciBtYWtpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCi0gICAqLwotICBpbnQgdG1wXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDEwZTk0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICi0KLWNsYXNzIHRfZ2VuZXJhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIGdlbmVyYXRvciBjbGFzc2VzIG9mIGEgcGFydGljdWxhciBsYW5ndWFnZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGFsc28gcmVzcG9uc2libGUgZm9yOgotICogIC0gUmVnaXN0ZXJpbmcgaXRzZWxmIHdpdGggdGhlIGdlbmVyYXRvciByZWdpc3RyeS4KLSAqICAtIFByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2VuZXJhdG9ycyBpdCBwcm9kdWNlcy4KLSAqLwotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeSB7Ci0gcHVibGljOgotICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOwotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCi0gICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3Nob3J0X25hbWUoKSB7IHJldHVybiBzaG9ydF9uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfbG9uZ19uYW1lKCkgeyByZXR1cm4gbG9uZ19uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfZG9jdW1lbnRhdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50YXRpb25fOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKLSAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pCi0gIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKLSAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOwotICB9Ci19OwotCi1jbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7Ci0KLSAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OwotICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gcHJpdmF0ZToKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKLX07Ci0KLSNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICBcCi0gIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+ICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oICAgICAgICBcCi0gICAgICAgICAgI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2MwNTVhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogSGFza2VsbCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfaHNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2hzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3QgICAgICAgICAgICAodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlciA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIgICAgIChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyICAgICAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyAgKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCk7Ci0KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZSAgICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RyaW5nIGhzX2F1dG9nZW5fY29tbWVudCgpOwotICBzdHJpbmcgaHNfbGFuZ3VhZ2VfcHJhZ21hKCk7Ci0gIHN0cmluZyBoc19pbXBvcnRzKCk7Ci0KLSAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7Ci0KLSAgc3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9ucyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWV0aG9kID0gZmFsc2UpOwotCi0gIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcGFyZW5zID0gdHJ1ZSk7Ci0KLSBwcml2YXRlOgotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl9jb25zdHNfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBvZnN0cmVhbSBmX2lmYWNlXzsKLSAgb2ZzdHJlYW0gZl9jbGllbnRfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfVHlwZXMuaHMiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfQ29uc3RzLmhzIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfVHlwZXMgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX0NvbnN0cyB3aGVyZSIgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgImltcG9ydCAiIDw8IHBuYW1lIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgewotICByZXR1cm4gc3RyaW5nKCJ7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfVxuIgotICAgICAgICAgICAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgotICAgICAgICAgICAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3Npbmctc2lnbmF0dXJlcyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtbWF0Y2hlcyAjLX1cbiIpOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4gc3RyaW5nKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikgKwotICAgICAgICAgICAgICAgICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIiArCi0gICAgICAgICAgICAgICAgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iICsKLSAgICAgICAgICAgICAgICAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIgKwotICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19pbXBvcnRzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gc3RyaW5nKAotICAgICAgImltcG9ydCBQcmVsdWRlICggQm9vbCguLiksIEVudW0sIERvdWJsZSwgU3RyaW5nLCBNYXliZSguLiksXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICBFcSwgU2hvdywgT3JkLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgcmV0dXJuLCBsZW5ndGgsIElPLCBmcm9tSW50ZWdyYWwsIGZyb21FbnVtLCB0b0VudW0sXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAoJiYpLCAofHwpLCAoPT0pLCAoKyspLCAoJCksICgtKSApXG4iCi0gICAgICAiXG4iCi0gICAgICAiaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uXG4iCi0gICAgICAiaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5XG4iCi0gICAgICAiaW1wb3J0IERhdGEuSW50XG4iCi0gICAgICAiaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXBcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuU2V0IGFzIFNldFxuIgotICAgICAgIlxuIgotICAgICAgImltcG9ydCBUaHJpZnRcbiIKLSAgICAgICJcbiIpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpCi0gICAgcmVzdWx0ICs9ICJpbXBvcnQgcXVhbGlmaWVkICIgKyBjYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfVHlwZXNcbiI7Ci0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApCi0gICAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdHJpbmcgdG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSk7Ci0gIHN0cmluZyB0ZGVmID0gcmVuZGVyX2hzX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRkZWYgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBpbmRlbnQoZl90eXBlc18pIDw8ICJkYXRhICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICI7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgZl90eXBlc18gPDwgKGZpcnN0ID8gIiIgOiAifCIpOwotICAgIGZfdHlwZXNfIDw8IG5hbWU7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJkZXJpdmluZyAoU2hvdyxFcSwgVHlwZWFibGUsIE9yZCkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIEVudW0gIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0KLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA6OiAiIDw8IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKSA8PCBlbmRsOwotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDgpIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIgOjogSW50MTYpIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIgOjogSW50MzIpIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIgOjogSW50NjQpIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0eXBlOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpbnQgdmFsID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmICh2YWwgPT0gdmFsdWUtPmdldF9pbnRlZ2VyKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOwotICAgIGluZGVudChvdXQpIDw8IGNuYW1lIDw8ICJ7IjsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLQotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCi0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpCi0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0KLSAgICAgIHN0cmluZyBmbmFtZSA9IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIHN0cmluZyBjb25zdF92YWx1ZSA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0KLSAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7Ci0gICAgICBvdXQgPDwgImZfIiA8PCBjbmFtZSA8PCAiXyIgPDwgZm5hbWUgPDwgIiA9IEp1c3QgKCIgPDwgY29uc3RfdmFsdWUgPDwgIikiOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBvdXQgPDwgIihNYXAuZnJvbUxpc3QgWyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwiIDw8IHZhbCA8PCAiKSI7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSB0eXBlLT5pc19saXN0KCkKLSAgICAgICAgPyAoKHRfbGlzdCopIHR5cGUpLT5nZXRfZWxlbV90eXBlKCkKLSAgICAgICAgOiAoKHRfc2V0KikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkKLSAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAiOwotCi0gICAgb3V0IDw8ICJbIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLQotICAgIG91dCA8PCAiXSI7Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpCi0gICAgICBvdXQgPDwgIikiOwotCi0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBIYXNrZWxsIHN0cnVjdAotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sdHN0cnVjdCwgaXNfZXhjZXB0aW9uLGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7Ci0gICh2b2lkKSBoZWxwZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRhdGEgIiA8PCB0bmFtZSA8PCAiID0gIiA8PCB0bmFtZTsKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCAieyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8ICJmXyIgPDwgdG5hbWUgPDwgIl8iIDw8IG1uYW1lIDw8ICIgOjogTWF5YmUgIiA8PCByZW5kZXJfaHNfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgb3V0IDw8ICJ9IjsKLSAgfQotCi0gIG91dCA8PCAiIGRlcml2aW5nIChTaG93LEVxLE9yZCxUeXBlYWJsZSkiIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikKLSAgICBvdXQgPDwgImluc3RhbmNlIEV4Y2VwdGlvbiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyB0ID0gdG1wKCJfdCIpOwotICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOwotCi0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIl9maWVsZHMgaXByb3QgcmVjb3JkID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiKF8sIiA8PCB0IDw8ICIsIiA8PCBpZCA8PCAiKSA8LSByZWFkRmllbGRCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAiIDw8IHQgPDwgIiA9PSBUX1NUT1AgdGhlbiByZXR1cm4gcmVjb3JkIGVsc2UiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgaWQgPDwgIiBvZiAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgc3RyaW5nIGV0eXBlID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICIgLT4gIiA8PCAiaWYgIiA8PCB0IDw8ICIgPT0gIiA8PCBldHlwZSA8PCAiIHRoZW4gZG8iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicyA8LSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcixzdHIpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgc3RyaW5nIGZuYW1lID0gZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCByZWNvcmR7Zl8iIDw8IHNuYW1lIDw8ICJfIiA8PCBmbmFtZSA8PCAiPUp1c3Qgc30iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSBkbyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICIgPDwgdCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCByZWNvcmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIGluZGVudChvdXQpIDw8ICJfIC0+IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInNraXAgaXByb3QgIiA8PCB0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkRmllbGRFbmQgaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIl9maWVsZHMgaXByb3QgcmVjb3JkIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIHJlYWQKLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiXyA8LSByZWFkU3RydWN0QmVnaW4gaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWNvcmQgPC0gcmVhZF8iIDw8IHNuYW1lIDw8ICJfZmllbGRzIGlwcm90ICgiIDw8IHNuYW1lIDw8ICJ7IjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgIG91dCA8PCAiZl8iIDw8IHNuYW1lIDw8ICJfIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiPU5vdGhpbmciOwotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLQotICBvdXQgPDwgIn0pIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZFN0cnVjdEVuZCBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiByZWNvcmQiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIGYgPSB0bXAoIl9mIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIndyaXRlU3RydWN0QmVnaW4gb3Byb3QgXCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlIGZfIiA8PCBuYW1lIDw8ICJfIiA8PCBtbmFtZSA8PCAiIHJlY29yZCBvZiB7Tm90aGluZyAtPiByZXR1cm4gKCk7IEp1c3QgX3YgLT4gZG8iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAid3JpdGVGaWVsZEJlZ2luIG9wcm90IChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwiCi0gICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGluZGVudChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfdiIpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRFbmQgb3Byb3R9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBpbmRlbnQob3V0KSA8PCAid3JpdGVGaWVsZFN0b3Agb3Byb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ3cml0ZVN0cnVjdEVuZCBvcHJvdCIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIuaHMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSBhcyBJZmFjZSIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIC0tIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0KLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKLSAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOwotCi0gIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCBlbmRsOwotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotCi0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOwotICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCAgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaWZhY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuIFRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfQ2xpZW50LmhzIjsKLSAgZl9jbGllbnRfLm9wZW4oZl9jbGllbnRfbmFtZS5jX3N0cigpKTsKLSAgZl9jbGllbnRfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfY2xpZW50XyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHBvcnRzID0gIiI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZXhwb3J0cyArPSAoZmlyc3QgPyAiIiA6ICIsIik7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXhwb3J0cyArPSBkZWNhcGl0YWxpemUoZnVubmFtZSk7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBzbmFtZSA8PCAiX0NsaWVudCgiIDw8IGV4cG9ydHMgPDwgIikgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0NsaWVudCIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgRGF0YS5JT1JlZiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGw7Ci0KLSAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBuZXdJT1JlZiAwIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyBmYXJncyA9ICIiOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQotICAgICAgZmFyZ3MgKz0gIiBhcmdfIiArIGRlY2FwaXRhbGl6ZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgZGVjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgKGlwLG9wKSIgPDwgIGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOwotCi0gICAgZl9jbGllbnRfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcSA8LSBzZXFpZCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxbiA8LSByZWFkSU9SZWYgc2VxIiA8PCBlbmRsOwotICAgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcCAoXCIiIDw8IGZuYW1lIDw8ICJcIiwgTV9DQUxMLCBzZXFuKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVfIiA8PCBhcmdzbmFtZSA8PCAiIG9wICgiIDw8IGFyZ3NuYW1lIDw8ICJ7IjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGRuYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBmX2NsaWVudF8gPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgZl9jbGllbnRfIDw8ICJmXyIgPDwgYXJnc25hbWUgPDwgIl8iIDw8IGZpZWxkbmFtZSA8PCAiPUp1c3QgYXJnXyIgPDwgZmllbGRuYW1lOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ0Rmx1c2ggKGdldFRyYW5zcG9ydCBvcCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICBzdHJpbmcgZnVubmFtZSA9IHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZ1bm5hbWUsICZub2FyZ3MpOwotCi0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBmdW5uYW1lIDw8ICIgaXAgPSBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA8LSByZWFkTWVzc2FnZUJlZ2luIGlwIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgImlmIG10eXBlID09IE1fRVhDRVBUSU9OIHRoZW4gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICB4IDwtIHJlYWRBcHBFeG4gaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICByZWFkTWVzc2FnZUVuZCBpcCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICIgIHRocm93IHgiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICBlbHNlIHJldHVybiAoKSIgPDwgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlcyA8LSByZWFkXyIgPDwgcmVzdWx0bmFtZSA8PCAiIGlwIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlYWRNZXNzYWdlRW5kIGlwIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgImNhc2UgZl8iIDw8IHJlc3VsdG5hbWUgPDwgIl9zdWNjZXNzIHJlcyBvZiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIkp1c3QgdiAtPiByZXR1cm4gdiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk5vdGhpbmcgLT4gZG8iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBzdHJpbmcgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJjYXNlIGZfIiA8PCByZXN1bHRuYW1lIDw8ICJfIiA8PCB4bmFtZSA8PCAiIHJlcyBvZiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk5vdGhpbmcgLT4gcmV0dXJuICgpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiSnVzdCBfdiAtPiB0aHJvdyBfdiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJldHVybiAoKSIgPDwgZW5kbDsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyaW5nIHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAidGhyb3cgKEFwcEV4biBBRV9NSVNTSU5HX1JFU1VMVCBcIiIgPDwgdG5hbWUgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBmX2NsaWVudF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkgPSBjYXNlIG5hbWUgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXCIiIDw8IGZuYW1lIDw8ICJcIiAtPiBwcm9jZXNzXyIgPDwgZGVjYXBpdGFsaXplKGZuYW1lKSA8PCAiIChzZXFpZCxpcHJvdCxvcHJvdCxoYW5kbGVyKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyAtPiAiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSA8PCAiLnByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpIiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJza2lwIGlwcm90IFRfU1RSVUNUIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAobmFtZSxNX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZUFwcEV4biBvcHJvdCAoQXBwRXhuIEFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gXCIgKysgbmFtZSkpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidEZsdXNoIChnZXRUcmFuc3BvcnQgb3Byb3QpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIobmFtZSwgdHlwLCBzZXFpZCkgPC0gcmVhZE1lc3NhZ2VCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgc3RyaW5nIGZ1bm5hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90LCBoYW5kbGVyKSA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncyA8LSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWFkTWVzc2FnZUVuZCBpcHJvdCIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBzaXplX3QgbiA9IHhjZXB0aW9ucy5zaXplKCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCi0gICAgICBuKys7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJzIDwtIHJldHVybiAoIiA8PCByZXN1bHRuYW1lOwotCi0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykKLSAgICAgIGZfc2VydmljZV8gPDwgIiBOb3RoaW5nIjsKLQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlcyA8LSAiOwotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB4Y2VwdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIihDb250cm9sLkV4Y2VwdGlvbi5jYXRjaCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgIihkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIGZfc2VydmljZV8gPDwgInJlcyA8LSAiOwotCi0gIGZfc2VydmljZV8gPDwgIklmYWNlLiIgPDwgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIiBoYW5kbGVyIjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCi0gICAgZl9zZXJ2aWNlXyA8PCAgIiAoZl8iIDw8IGFyZ3NuYW1lIDw8ICAiXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgYXJncykiOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcnN7Zl8iIDw8IHJlc3VsdG5hbWUgPDwgIl9zdWNjZXNzPSBKdXN0IHJlc30iOwotCi0gIH0gZWxzZSBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcnMiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDAgJiYgIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoXFxlICAtPiAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJze2ZfIiA8PCByZXN1bHRuYW1lIDw8ICJfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9SnVzdCBlfSI7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuICgpIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuICgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8gKSA8PCAid3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBNX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXyApIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfICkgPDwgIndyaXRlTWVzc2FnZUVuZCBvcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8gKSA8PCAidEZsdXNoIChnZXRUcmFuc3BvcnQgb3Byb3QpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSBwcmVmaXg7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsdHlwZSk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpCi0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpID8gInJlYWRCaW5hcnkiIDogInJlYWRTdHJpbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgIiBpcHJvdCI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgIG91dCA8PCAiKGRvIHtpIDwtIHJlYWRJMzIgaXByb3Q7IHJldHVybiAkIHRvRW51bSAkIGZyb21JbnRlZ3JhbCBpfSkiOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBvdXQgPDwgIihyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8ICIobGV0IHtmIDAgPSByZXR1cm4gW107IGYgbiA9IGRvIHtrIDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0KLSAgICBvdXQgPDwgIjsgdiA8LSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotCi0gICAgb3V0IDw8ICI7ciA8LSBmIChuLTEpOyByZXR1cm4gJCAoayx2KTpyfX0gaW4gZG8geygiIDw8IGt0eXBlIDw8ICIsIiA8PCB2dHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA8LSByZWFkTWFwQmVnaW4gaXByb3Q7IGwgPC0gZiAiIDw8IHNpemUgPDwgIjsgcmV0dXJuICQgTWFwLmZyb21MaXN0IGx9KSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgIihsZXQge2YgMCA9IHJldHVybiBbXTsgZiBuID0gZG8ge3YgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIHY6cn19IGluIGRvIHsoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA8LSByZWFkU2V0QmVnaW4gaXByb3Q7IGwgPC0gZiAiIDw8IHNpemUgPDwgIjsgcmV0dXJuICQgU2V0LmZyb21MaXN0IGx9KSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8ICIobGV0IHtmIDAgPSByZXR1cm4gW107IGYgbiA9IGRvIHt2IDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICI7ciA8LSBmIChuLTEpOyByZXR1cm4gJCB2OnJ9fSBpbiBkbyB7KCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPC0gcmVhZExpc3RCZWdpbiBpcHJvdDsgZiAiIDw8IHNpemUgPDwgIn0pIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpCi0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmIChuYW1lLmxlbmd0aCgpID09IDApCi0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJ3cml0ZUJpbmFyeSIgOiAid3JpdGVTdHJpbmciKSA8PCAiIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2wgb3Byb3QgIiA8PCBuYW1lOwotICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2IG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0IG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaHMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyIG9wcm90IChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCwgIndyaXRlXyIpIDw8ICIgb3Byb3QgIiA8PCBwcmVmaXg7Ci19Ci0KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGsgPSB0bXAoIl9raXRlciIpOwotICAgIHN0cmluZyB2ID0gdG1wKCJfdml0ZXIiKTsKLSAgICBvdXQgPDwgIihsZXQge2YgW10gPSByZXR1cm4gKCk7IGYgKCgiIDw8IGsgPDwgIiwiIDw8IHYgPDwgIik6dCkgPSBkbyB7IjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrLCB2KTsKLSAgICBvdXQgPDwgIjtmIHR9fSBpbiBkbyB7d3JpdGVNYXBCZWdpbiBvcHJvdCAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLGZyb21JbnRlZ3JhbCAkIE1hcC5zaXplICIgPDwgcHJlZml4IDw8ICIpOyBmIChNYXAudG9MaXN0ICIgPDwgcHJlZml4IDw8ICIpO3dyaXRlTWFwRW5kIG9wcm90fSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIiA8PCB2IDw8ICI6dCkgPSBkbyB7IjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCB2KTsKLSAgICBvdXQgPDwgIjtmIHR9fSBpbiBkbyB7d3JpdGVTZXRCZWdpbiBvcHJvdCAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsZnJvbUludGVncmFsICQgU2V0LnNpemUgIiA8PCBwcmVmaXggPDwgIik7IGYgKFNldC50b0xpc3QgIiA8PCBwcmVmaXggPDwgIik7d3JpdGVTZXRFbmQgb3Byb3R9KSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIiA8PCB2IDw8ICI6dCkgPSBkbyB7IjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHYpOwotICAgIG91dCA8PCAiO2YgdH19IGluIGRvIHt3cml0ZUxpc3RCZWdpbiBvcHJvdCAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLGZyb21JbnRlZ3JhbCAkIFByZWx1ZGUubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyBmICIgPDwgcHJlZml4IDw8ICI7d3JpdGVMaXN0RW5kIG9wcm90fSkiOwotICB9Ci0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBvdXQgPDwgImRvIHsiOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLSAgb3V0IDw8ICI7IjsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLSAgb3V0IDw8ICJ9IjsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBvcHRpb25zLCBib29sIGlvLCBib29sIG1ldGhvZCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAob3B0aW9ucykgcmVzdWx0ICs9ICJNYXliZSAiOwotICAgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbnMpOwotICAgIHJlc3VsdCArPSAiIC0+ICI7Ci0gIH0KLQotICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkKLSAgICByZXN1bHQgKz0gIigpIC0+ICI7Ci0KLSAgaWYgKGlvKQotICAgIHJlc3VsdCArPSAiSU8gIjsKLQotICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIGlvKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZnVuY3Rpb25fcHJlZml4KSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0KLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzLiI7Ci0KLSAgcmV0dXJuIHByZWZpeCArIGZ1bmN0aW9uX3ByZWZpeCArIGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOiAgIHJldHVybiAiVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogcmV0dXJuICJUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOiAgIHJldHVybiAiVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6ICAgcmV0dXJuICJUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OiAgICByZXR1cm4gIlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjogICAgcmV0dXJuICJUX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIHJldHVybiAiVF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiByZXR1cm4gIlRfRE9VQkxFIjsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRfSTMyIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRfU1RSVUNUIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUX01BUCI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVF9TRVQiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIGhhc2tlbGwgdHlwZQotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0cmluZyB0eXBlX3JlcHI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6ICAgcmV0dXJuICIoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IHJldHVybiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpID8gIkJ5dGVTdHJpbmciIDogIlN0cmluZyIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDogICByZXR1cm4gIkJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURTogICByZXR1cm4gIkludDgiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OiAgICByZXR1cm4gIkludDE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjogICAgcmV0dXJuICJJbnQzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIHJldHVybiAiSW50NjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiByZXR1cm4gIkRvdWJsZSI7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUoKCh0X2VudW0qKXR5cGUpLT5nZXRfbmFtZSgpKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICB0eXBlX3JlcHIgPSAiTWFwLk1hcCAiICsgcmVuZGVyX2hzX3R5cGUoa3R5cGUsIHRydWUpICsgIiAiICsgcmVuZGVyX2hzX3R5cGUodnR5cGUsIHRydWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB0eXBlX3JlcHIgPSAiU2V0LlNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpIDsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gIlsiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIGZhbHNlKSArICJdIjsKLQotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBuZWVkc19wYXJlbnMgPyAiKCIgKyB0eXBlX3JlcHIgKyAiKSIgOiB0eXBlX3JlcHI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHMsICJIYXNrZWxsIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWUwZjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEhUTUwgY29kZSBnZW5lcmF0b3IKLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9odG1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2h0bWxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7ICAKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKLSAgICBlc2NhcGVfLmNsZWFyKCk7Ci0gICAgZXNjYXBlX1snJiddICA9ICImYW1wOyI7Ci0gICAgZXNjYXBlX1snPCddICA9ICImbHQ7IjsKLSAgICBlc2NhcGVfWyc+J10gID0gIiZndDsiOwotICAgIGVzY2FwZV9bJyInXSAgPSAiJnF1b3Q7IjsKLSAgICBlc2NhcGVfWydcJyddID0gIiZhcG9zOyI7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0JCQkJIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc3MoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLQotICB2b2lkIHByaW50X2RvYyAgICAgICAgKHRfZG9jKiB0ZG9jKTsKLSAgaW50ICBwcmludF90eXBlICAgICAgICh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOwotfTsKLQotLyoqCi0gKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgewotICBmX291dF8gPDwgIjx0YWJsZT48dHI+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD4iCi0JIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKLSAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKLSAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0JCQkJIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgewotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7Ci0gICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cygqaXRlciwgZmluaXNoZWQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgewotICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7Ci0gIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNTdmNfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLQkgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0Jc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotCXN0cmluZyBodG1sID0gIjxsaT48YSBocmVmPVwiIiArIGZuYW1lICsgIiNGbl8iICsgbmFtZSArICJfIiArCi0JICBmbl9uYW1lICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7Ci0JZm5faHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihmbl9uYW1lLCBodG1sKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKG1hcDxzdHJpbmcsc3RyaW5nPjo6aXRlcmF0b3IgaHRtbF9pdGVyID0gZm5faHRtbC5iZWdpbigpOwotCSAgIGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOyBodG1sX2l0ZXIrKykgewotCWZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhX3R5cGVzOwotICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotCSI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gdHByb2ctPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCp0ZF9pdGVyKS0+Z2V0X3N5bWJvbGljKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy8gPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotCSI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gdHByb2ctPmdldF9vYmplY3RzKCk7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqb19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBmbmFtZSA8PCAiI1N0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy88PCAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBmbmFtZSArICIjU3RydWN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsKLQkiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7Ci0gICAgICAgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOyBkdF9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+PGNvZGU+IjsKLSAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3RfaHRtbDsKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7Ci0gICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7Ci0gICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaHRtbCA9IjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0NvbnN0XyIgKyBuYW1lICsKLQkiXCI+IiArIG5hbWUgKyAiPC9hPiI7Ci0gICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gICAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGNvbl9pdGVyID0gY29uc3RfaHRtbC5iZWdpbigpOwotCSBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOyBjb25faXRlcisrKSB7Ci0gICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKLSAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU5cIiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICIgICAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8aGVhZD4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOFwiIC8+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIKLQkgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKQotCSA8PCAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIgotCSA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC9oMT4iIDw8IGVuZGw7Ci0KLSAgcHJpbnRfZG9jKHByb2dyYW1fKTsKLQotICBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkNvbnN0YW50c1wiPkNvbnN0YW50czwvaDI+IiA8PCBlbmRsOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgICBmX291dF8gPDwgIjx0YWJsZT4iOwotICAgIGZfb3V0XyA8PCAiPHRyPjx0aD5Db25zdGFudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0gICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIGVudW1zCi0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLQlnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0JZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU2VydmljZXNcIj5TZXJ2aWNlczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGZfb3V0XyA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotCi0gIGdlbmVyYXRlX2luZGV4KCk7Ci0gIGdlbmVyYXRlX2NzcygpOwotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgewotICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgImluZGV4Lmh0bWwiOwotICBmX291dF8ub3BlbihpbmRleF9mbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICI8aHRtbD48aGVhZD4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGxpbmsgaHJlZj1cInN0eWxlLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIi8+IgotCSA8PCBlbmRsOwotICBmX291dF8gPDwgIjx0aXRsZT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvdGl0bGU+PC9oZWFkPjxib2R5PiIKLQkgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPjx0cj48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCi0JIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RyPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOwotICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKLSAgc3RyaW5nIGNzc19mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAic3R5bGUuY3NzIjsKLSAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgIi8qIEF1dG8tZ2VuZXJhdGVkIENTUyBmb3IgZ2VuZXJhdGVkIFRocmlmdCBkb2NzICovIiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiYm9keSB7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIHNhbnMtc2VyaWY7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJwcmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOyBwYWRkaW5nOiA2cHg7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJoMyxoNCB7IHBhZGRpbmctdG9wOiAwcHg7IG1hcmdpbi10b3A6IDBweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgbWFyZ2luOiAxMHB4OyBwYWRkaW5nOiAxMHB4OyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiZGl2LmV4dGVuZHMgeyBtYXJnaW46IC0wLjVlbSAwIDFlbSA1ZW0gfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRhYmxlIHsgYm9yZGVyOiAxcHggc29saWQgZ3JleTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRkIHsgYm9yZGVyOiAxcHggc29saWQgZ3JleTsgcGFkZGluZzogMXB4IDZweDsgdmVydGljYWwtYWxpZ246IHRvcDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRoIHsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNiYmJiYmI7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMXB4IDZweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKLSAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIHN0cmluZyBkb2MgPSB0ZG9jLT5nZXRfZG9jKCk7Ci0gICAgc2l6ZV90IGluZGV4OwotICAgIHdoaWxlICgoaW5kZXggPSBkb2MuZmluZF9maXJzdF9vZigiXHJcbiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGlmIChpbmRleCA9PSAwKSB7Ci0JZl9vdXRfIDw8ICI8cC8+IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlmX291dF8gPDwgZG9jLnN1YnN0cigwLCBpbmRleCkgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChpbmRleCArIDEgPCBkb2Muc2l6ZSgpICYmIGRvYy5hdChpbmRleCkgIT0gZG9jLmF0KGluZGV4ICsgMSkgJiYKLQkgIChkb2MuYXQoaW5kZXggKyAxKSA9PSAnXHInIHx8IGRvYy5hdChpbmRleCArIDEpID09ICdcbicpKSB7Ci0JaW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIGRvYyA9IGRvYy5zdWJzdHIoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IGRvYyA8PCAiPGJyLz4iOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCi0gKi8KLWludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgaW50IGxlbiA9IDA7Ci0gIGZfb3V0XyA8PCAiPGNvZGU+IjsKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBmX291dF8gPDwgImxpc3QmbHQ7IjsKLSAgICAgIGxlbiA9IDYgKyBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBmX291dF8gPDwgInNldCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZl9vdXRfIDw8ICJtYXAmbHQ7IjsKLSAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICBsZW4gKz0gcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IHByb2dfbmFtZSA8PCAiLmh0bWwjIjsKLSAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgZl9vdXRfIDw8ICJUeXBlZGVmXyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3RydWN0XyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBmX291dF8gPDwgIkVudW1fIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3ZjXyI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIlwiPiI7Ci0gICAgbGVuID0gdHlwZV9uYW1lLnNpemUoKTsKLSAgICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pIHsKLSAgICAgIGZfb3V0XyA8PCBwcm9nX25hbWUgPDwgIi4iOwotICAgICAgbGVuICs9IHByb2dfbmFtZS5zaXplKCkgKyAxOwotICAgIH0KLSAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICI8L2E+IjsKLSAgfQotICBmX291dF8gPDwgIjwvY29kZT4iOwotICByZXR1cm4gbGVuOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgotICAgIGZfb3V0XyA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgJyInOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKLSAgICB7Ci0gICAgICBmX291dF8gPDwgInsgIjsKLSAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7Ci0JICAgbWFwX2l0ZXIrKykgewotCWlmICghZmlyc3QpIHsKLQkgIGZfb3V0XyA8PCAiLCAiOwotCX0KLQlmaXJzdCA9IGZhbHNlOwotCXByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5maXJzdCk7Ci0JZl9vdXRfIDw8ICIgPSAiOwotCXByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5zZWNvbmQpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICIgfSI7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6Ci0gICAgewotICAgICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7OwotICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOwotCSAgIGxpc3RfaXRlcisrKSB7Ci0JaWYgKCFmaXJzdCkgewotCSAgZl9vdXRfIDw8ICIsICI7Ci0JfQotCWZpcnN0ID0gZmFsc2U7Ci0JcHJpbnRfY29uc3RfdmFsdWUoKmxpc3RfaXRlcik7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgIiB9IjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZQotCSA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKLSAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lCi0JIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHRlbnVtKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7Ci0gIGZfb3V0XyA8PCAiPGJyLz48dGFibGU+IiA8PCBlbmRsOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZQotCSA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKLSAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPiI7Ci0gIGZfb3V0XyA8PCAiPHRyPjx0aD5LZXk8L3RoPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvdGg+PHRoPkRlZmF1bHQgdmFsdWU8L3RoPjwvdHI+IgotCSA8PCBlbmRsOwotICBmb3IgKCA7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOwotICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X2RvYygpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBmX291dF8gPDwgIm9wdGlvbmFsIjsKLSAgICB9IGVsc2UgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZl9vdXRfIDw8ICJyZXF1aXJlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PCAiZGVmYXVsdCI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICB0X2NvbnN0X3ZhbHVlKiBkZWZhdWx0X3ZhbCA9ICgqbWVtX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpZiAoZGVmYXVsdF92YWwgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoZGVmYXVsdF92YWwpOwotICAgIH0KLSAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RhYmxlPjxici8+IjsKLSAgcHJpbnRfZG9jKHRzdHJ1Y3QpOwotICBmX291dF8gPDwgIjwvZGl2PiI7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3BlY2lhbCBzdHJ1Y3RzCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIEhUTUwgYmxvY2sgZm9yIGEgVGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdmNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJcIj5TZXJ2aWNlOiAiCi0JIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjwvaDM+IiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgewotICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImV4dGVuZHNcIj48ZW0+ZXh0ZW5kczwvZW0+ICI7Ci0gICAgcHJpbnRfdHlwZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L2Rpdj5cbiI7Ci0gIH0KLSAgcHJpbnRfZG9jKHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gIGZvciAoIDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgewotICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgICBmX291dF8gPDwgIjxoNCBpZD1cIkZuXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgZm5fbmFtZQotCSAgIDw8ICJcIj5GdW5jdGlvbjogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIiA8PCBmbl9uYW1lCi0JICAgPDwgIjwvaDQ+IiA8PCBlbmRsOwotICAgIGZfb3V0XyA8PCAiPHByZT4iOwotICAgIGludCBvZmZzZXQgPSBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCkpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZfb3V0XyA8PCAiICIgPDwgZm5fbmFtZSA8PCAiKCI7Ci0gICAgb2Zmc2V0ICs9IGZuX25hbWUuc2l6ZSgpICsgMjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOwotICAgIGlmIChhcmdfaXRlciAhPSBhcmdzLmVuZCgpKSB7Ci0gICAgICBmb3IgKCA7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKLQlpZiAoIWZpcnN0KSB7Ci0JICBmX291dF8gPDwgIiwiIDw8IGVuZGw7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7Ci0JICAgIGZfb3V0XyA8PCAiICI7Ci0JICB9Ci0JfQotCWZpcnN0ID0gZmFsc2U7Ci0JcHJpbnRfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0JZl9vdXRfIDw8ICIgIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKLQlpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLQkgIGZfb3V0XyA8PCAiID0gIjsKLQkgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0JfQotICAgICAgfQotICAgIH0KLSAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOwotICAgICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotCWlmICghZmlyc3QpIHsKLQkgIGZfb3V0XyA8PCAiLCAiOwotCX0KLQlmaXJzdCA9IGZhbHNlOwotCXByaW50X3R5cGUoKCpleF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3ByZT4iOwotICAgIHByaW50X2RvYygqZm5faXRlcik7Ci0gICAgZl9vdXRfIDw8ICI8L2Rpdj4iOwotICB9Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHRtbCwgIkhUTUwiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmI4NDM5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEphdmEgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2phdmFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2phdmFfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiZWFucyIpOwotICAgIGJlYW5fc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInByaXZhdGUtbWVtYmVycyIpOwotICAgIHByaXZhdGVfbWVtYmVyc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9jYW1lbCIpOwotICAgIG5vY2FtZWxfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImhhc2hjb2RlIik7Ci0gICAgZ2VuX2hhc2hfY29kZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gKGJlYW5fc3R5bGVfID8gImdlbi1qYXZhYmVhbiIgOiAiZ2VuLWphdmEiKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAodF9zdHJ1Y3QqICAgdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX25hbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgICAgdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudHMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLCB0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlLCBib29sIGluX2luaXQ9ZmFsc2UsIGJvb2wgc2tpcF9nZW5lcmljPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIHVzZV9iYXNlX21ldGhvZCA9IGZhbHNlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHVzZV9iYXNlX21ldGhvZCA9IHRydWUsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyBhc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfdHlwZSogdHR5cGUsIGJvb2wgaW5jbHVkZV90eXBlcz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCkgfHwKLSAgICAgIHR0eXBlLT5pc19lbnVtKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotCi0gIGJvb2wgYmVhbl9zdHlsZV87Ci0gIGJvb2wgcHJpdmF0ZV9tZW1iZXJzXzsKLSAgYm9vbCBub2NhbWVsX3N0eWxlXzsKLSAgYm9vbCBnZW5faGFzaF9jb2RlXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgcGFja2FnZV9kaXJfID0gc3ViZGlyOwotfQotCi0vKioKLSAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQotICoKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX3BhY2thZ2UoKSB7Ci0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEphdmEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX3R5cGVfaW1wb3J0cygpIHsKLSAgc3RyaW5nIGhhc2hfYnVpbGRlcjsKLSAgaWYgKGdlbl9oYXNoX2NvZGVfKSB7Ci0gICAgaGFzaF9idWlsZGVyID0gImltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyLkhhc2hDb2RlQnVpbGRlcjtcbiI7Ci0gIH0KLQotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgaGFzaF9idWlsZGVyICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuRW51bVNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuQml0U2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyO1xuIgotICAgICJpbXBvcnQgamF2YS51dGlsLkFycmF5cztcbiIgKwotICAgICJpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjtcbiIgKwotICAgICJpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7XG5cbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBKYXZhCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodGVudW0tPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8IGVuZGw7Ci0KLSAgLy8gQWRkIGphdmEgaW1wb3J0cwotICBmX2VudW0gPDwgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URW51bTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfZW51bSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOwotICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdmFsdWUgPDwgIikiOwotICB9Ci0gIGZfZW51bSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEZpZWxkIGZvciB0aHJpZnRDb2RlCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoaW50IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICB0aGlzLnZhbHVlID0gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZmluZEJ5VmFsdWUoaW50IHZhbHVlKSB7ICIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAic3dpdGNoICh2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJjYXNlICIgPDwgdmFsdWUgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsgIAotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfKyIvQ29uc3RhbnRzLmphdmEiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAgIChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIAotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOwotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi0vKioKLSAqIEphdmEgdW5pb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQoZl9zdHJ1Y3QpIDw8Ci0gICAgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICA8PCAiIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVFVuaW9uPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiAiOwotCi0gIHNjb3BlX3VwKGZfc3RydWN0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKG90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSAiY29uc3RydWN0b3JzIiBmb3IgZWFjaCBmaWVsZAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIihCeXRlQnVmZmVyLndyYXAodmFsdWUpKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZShidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKEJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihCeXRlQnVmZmVyLndyYXAodmFsdWUpKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3JlYWRfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIF9GaWVsZHMgZW51bUZvcklkKHNob3J0IGlkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZE9yVGhyb3coaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgaW5zdGFuY2VvZiAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIgCi0gICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKLSAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCi0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZmllbGQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB3cml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgICAgPDwgIiA9ICgiIDw8ICB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgc2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotCi0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBlcXVhbGl0eQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmIGdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksIG90aGVyLmdldFNldEZpZWxkKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksIG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIEhhc2hDb2RlQnVpbGRlciBoY2IgPSBuZXcgSGFzaENvZGVCdWlsZGVyKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGhjYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSBzZXRGaWVsZCA9IGdldFNldEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgaGNiLmFwcGVuZChzZXRGaWVsZC5nZXRUaHJpZnRGaWVsZElkKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIE9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC5URW51bSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgICAgaGNiLmFwcGVuZCgoKG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICAgIGhjYi5hcHBlbmQodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gaGNiLnRvSGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAqIElmIHlvdSdkIGxpa2UgdGhpcyB0byBwZXJmb3JtIG1vcmUgcmVzcGVjdGFibHksIHVzZSB0aGUgaGFzaGNvZGUgZ2VuZXJhdG9yIG9wdGlvbi4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PAotICAgICAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFeGNlcHRpb24gIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIjsKLQotICBvdXQgPDwgIiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoYmVhbl9zdHlsZV8gfHwgcHJpdmF0ZV9tZW1iZXJzXykgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICB9Ci0gICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIGlzc2V0IGRhdGEKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOwotCi0gICAgaW50IGkgPSAwOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKQotICAgICAgICAgIDw8ICIgPSAiIDw8IGkgPDwgIjsiIDw8ICBlbmRsOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBCaXRTZXQgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IEJpdFNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKLSAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8Ci0gICAgICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKCptX2l0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gY29weSBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGhhc19iaXRfdmVjdG9yKHRzdHJ1Y3QpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5jbGVhcigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLm9yKG90aGVyLl9faXNzZXRfYml0X3ZlY3Rvcik7IiA8PCBlbmRsOyAgICAKLSAgfQotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvdXQsIHRzdHJ1Y3QpOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aGlzLmVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpdGhhdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KLSAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyB0aGlzX3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHRoYXRfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdW5lcXVhbDsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgdGhpc19wcmVzZW50ICs9ICIgJiYgdGhpcy4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgICB0aGF0X3ByZXNlbnQgKz0gIiAmJiB0aGF0LiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgfHwgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKLSAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZ2VuX2hhc2hfY29kZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaENvZGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSGFzaENvZGVCdWlsZGVyKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgICAgc3RyaW5nIHByZXNlbnQgPSAidHJ1ZSI7Ci0KLSAgICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgICBwcmVzZW50ICs9ICIgJiYgKCIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKSArICIpIjsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgImJvb2xlYW4gcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgcHJlc2VudCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJidWlsZGVyLmFwcGVuZChwcmVzZW50XyIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIiA8PCBlbmRsOwotICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICBidWlsZGVyLmFwcGVuZCgiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICBidWlsZGVyLmFwcGVuZCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gYnVpbGRlci50b0hhc2hDb2RlKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB0eXBlZE90aGVyID0gKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpb3RoZXI7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZigiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKS5jb21wYXJlVG8odHlwZWRPdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHR5cGVkT3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKLSAgICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgICBpZiAoIWJlYW5fc3R5bGVfKXsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSBjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gICAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0gZWxzZXsKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIigiIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKLQotICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwotICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgICB0X3R5cGUqIGVsZW1lbnRfdHlwZTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEl0ZXJhdG9yIGdldHRlciBmb3Igc2V0cyBhbmQgbGlzdHMKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwKLSAgICAgICAgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICAiPiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwKLSAgICAgICAgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIC8vIFB1dCB0byBtYXAKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIKLSAgICAgICAgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PAotICAgICAgICB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZSgiIDw8IGZpZWxkX25hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gbnVsbCA6ICIgPDwgZmllbGRfbmFtZSA8PCAiLmFycmF5KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBCeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmCi0gICAgICAgICAgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgewotICAgICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiBnZXQiOwotICAgICAgfQotICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICAgIGlmIChiZWFuX3N0eWxlXykgewotICAgICAgICBvdXQgPDwgInZvaWQiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIihieXRlW10gIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IChCeXRlQnVmZmVyKW51bGwgOiBCeXRlQnVmZmVyLndyYXAoIiA8PCBmaWVsZF9uYW1lIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIWJlYW5fc3R5bGVfKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB0aGlzOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgIG91dCA8PCAidm9pZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gICAgfQotICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PAotICAgICAgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7Ci0gICAgaWYgKCFiZWFuX3N0eWxlXykgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEgbWFwcGluZ3MKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOyIgPDwgZW5kbDsKLQotICAvLyBQb3B1bGF0ZSBtYXAKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0bXBNYXAucHV0KF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICIsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCi0gICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgIG91dCAgPDwgIikpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5jbGFzcywgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqIAotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQotICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiKQotICovCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5WT0lEIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyA6IHJldHVybiAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6IHJldHVybiAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSl7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSl7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5MaXN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgICAKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlNldE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgCi0gICAgfSBlbHNleyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKLSAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOwotICAgIH0gZWxzZSBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLCB0cnVlIjsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8ICIpIjsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIi5qYXZhIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIgLkFzeW5jSWZhY2UiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBBc3luY0lmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgdHJ1ZSkgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50LCBJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50RmFjdG9yeTxDbGllbnQ+IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KHByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkNBTEwsICsrc2VxaWRfKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZy50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgIi5Bc3luY0NsaWVudCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY0NsaWVudCBleHRlbmRzICIgPDwgZXh0ZW5kcyA8PCAiIGltcGxlbWVudHMgQXN5bmNJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBGYWN0b3J5IG1ldGhvZAotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudEZhY3Rvcnk8QXN5bmNDbGllbnQ+IHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlcjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHB1YmxpYyBGYWN0b3J5KG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlciwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMuY2xpZW50TWFuYWdlciA9IGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOyAKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHB1YmxpYyBBc3luY0NsaWVudCBnZXRBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgcmV0dXJuIG5ldyBBc3luY0NsaWVudChwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlciwgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHJldF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHN0cmluZyBmdW5jbGFzc25hbWUgPSBmdW5uYW1lICsgIl9jYWxsIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGFyZ3NfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgc3RyaW5nIHJlc3VsdF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgLy8gTWFpbiBtZXRob2QgYm9keSAgIAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIGZhbHNlKSA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIGNoZWNrUmVhZHkoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICIgPDwgZnVuY2xhc3NuYW1lIDw8ICIgbWV0aG9kX2NhbGwgPSBuZXcgIiArIGZ1bmNsYXNzbmFtZSArICIoIiA8PCBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlKSA8PCAiLCB0aGlzLCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLmN1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIG1hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIFRBc3luY01ldGhvZCBvYmplY3QgZm9yIHRoaXMgZnVuY3Rpb24gY2FsbAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiICsgZnVuY2xhc3NuYW1lICsgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIE1lbWJlciB2YXJpYWJsZXMKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlICIgKyB0eXBlX25hbWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBOT1RFIHNpbmNlIHdlIHVzZSBhIG5ldyBDbGllbnQgaW5zdGFuY2UgdG8gZGVzZXJpYWxpemUsIGxldCdzIGtlZXAgc2VxaWQgdG8gMCBmb3Igbm93Ci0gICAgLy8gaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGludCBzZXFpZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIENvbnN0cnVjdG9yCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIGZ1bmNsYXNzbmFtZSArICIoIiArIGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUsIHRydWUpIDw8ICIsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCBjbGllbnQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIC8vIEFzc2lnbiBtZW1iZXIgdmFyaWFibGVzCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLiIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSAiICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgd3JpdGVfYXJncyhvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSByZXF1ZXN0Ci0gICAgLy8gTk9URSB3ZSBhcmUgbGVhdmluZyBzZXFpZCBhcyAwLCBmb3Igbm93IChzZWUgYWJvdmUpCi0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgIGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzX25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc19uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUocHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gUmV0dXJuIG1ldGhvZCAgCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIHR5cGVfbmFtZShyZXRfdHlwZSkgKyAiIGdldFJlc3VsdCgpIHRocm93cyAiOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCFcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCA9IGNsaWVudC5nZXRQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbChtZW1vcnlUcmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKLSAgICAgIGlmICghcmV0X3R5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsgCi0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIobmV3IENsaWVudChwcm90KSkucmVjdl8iICsgZnVubmFtZSArICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENsb3NlIEFzeW5jQ2xpZW50Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5Qcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIElmYWNlIGlmYWNlXzsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyBIYXNoTWFwPFN0cmluZyxQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBib29sZWFuIHByb2Nlc3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlIG1zZyA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSBwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2UobXNnLm5hbWUsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgCi0gICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJMT0dHRVIuZXJyb3IoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpCi0gICAgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgPDwgIigiCi0gICAgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIgKQotICAgIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PAotICAgIGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5wdXQoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChNYXAuRW50cnk8IiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLmVudHJ5U2V0KCkpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewotICAodm9pZCkgbWFwOwotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlciArICIuZ2V0S2V5KCkiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCwgYm9vbCBza2lwX2dlbmVyaWMpIHsKLSAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkhhc2hNYXAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmVmaXggPSAiTWFwIjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArCi0gICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwiICsKLSAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0KikgdHR5cGU7Ci0gICAgaWYgKGluX2luaXQpIHsKLSAgICAgIHByZWZpeCA9ICJIYXNoU2V0IjsKLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIlNldCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0KikgdHR5cGU7Ci0gICAgaWYgKGluX2luaXQpIHsKLSAgICAgIHByZWZpeCA9ICJBcnJheUxpc3QiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmVmaXggPSAiTGlzdCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLSAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcikgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHJldHVybiAiQnl0ZUJ1ZmZlciI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCeXRlIiA6ICJieXRlIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlNob3J0IiA6ICJzaG9ydCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJJbnRlZ2VyIiA6ICJpbnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiTG9uZyIgOiAibG9uZyIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJEb3VibGUiIDogImRvdWJsZSIpOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBpbml0IFdoZXRoZXIgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7OwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0KLSAgICB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7Ci0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOwotICB9Ci0gIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3ZvaWQgbmFtZShhcmdzLCByZXN1bHRIYW5kbGVyKScKLSAgKgotICAqIEBwYXJhbXMgdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCB1c2VfYmFzZV9tZXRob2QsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKLSAgaWYgKHVzZV9iYXNlX21ldGhvZCkgewotICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOwotICB9Ci0gIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ2xpc3QgKyAiKSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9ICIiOwotICBpZiAodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgewotICAgIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX3R5cGVzKSArICIsICI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXRfdHlwZSA9ICIiOwotICBpZiAodXNlX2Jhc2VfbWV0aG9kKSB7Ci0gICAgcmV0X3R5cGUgKz0gIkFzeW5jQ2xpZW50LiI7Ci0gIH0KLSAgcmV0X3R5cGUgKz0gdGZ1bmMtPmdldF9uYW1lKCkgKyAiX2NhbGwiOwotCi0gIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgYXJnbGlzdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiICsgcmV0X3R5cGUgKyAiPiAiOwotICB9Ci0gIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOwotCi0gIHJldHVybiBhcmdsaXN0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsIHRfc3RydWN0KiB0c3RydWN0LCB0X3R5cGUqIHR0eXBlLCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgKHZvaWQpIHR0eXBlOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAoIWZpcnN0KSB7Ci0gICAgcmVzdWx0ICs9ICIsICI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IiArIHRmdW5jdC0+Z2V0X25hbWUoKSArICJfY2FsbCIgKyAiPiAiOwotICB9Ci0gIHJlc3VsdCArPSAicmVzdWx0SGFuZGxlciI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBKYXZhIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAiLyoqXG4iLAotICAgICIgKiAiLCBjb250ZW50cywKLSAgICAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLCB0X3R5cGUqIHR5cGUpIHsKLQotICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOwotICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKLSAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotCi0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7Ci0KLSAgaWYoY29udGFpbmVyLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIiA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmVudHJ5U2V0KCkpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5Ci0gICAgICBpZigoKHRfYmFzZV90eXBlKillbGVtX3R5cGUpLT5pc19iaW5hcnkoKSl7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJCeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgInRlbXBfYmluYXJ5X2VsZW1lbnQiLCBlbGVtX3R5cGUpOwotICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSkgewotICAodm9pZCkgZGVzdF9uYW1lOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKLSAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIl9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICIvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKChzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsIFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSI7Ci0gIH0KLQotICBvdXQgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoKGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogaWYgaXQgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJGaWVsZCBcIiArIGZpZWxkSWQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBmaWVsZHM7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX3RocmlmdElkID0gdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfZmllbGROYW1lID0gZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX3RocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX2ZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLWJvb2wgdF9qYXZhX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIGZpZWxkLT5nZXRfbmFtZSgpLCB0LCBmaWVsZC0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQotICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKLSAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKikgdDsKLQotICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwLjA7IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJ1bnN1cHBvcnRlZCB0eXBlOiAiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIiBmb3IgZmllbGQgIiArIGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBzZXJpYWxpemUgKGluIHRoZSBKYXZhIHNlbnNlKSB0aGUgb2JqZWN0Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGlmICghdHN0cnVjdC0+aXNfdW5pb24oKSAmJiBoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IEJpdFNldCgxKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmEsICJKYXZhIiwKLSIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCi0iICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSB1c3VhbC5cbiIKLSIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKLSIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBxdWFsaXR5IGhhc2hDb2RlIG1ldGhvZHMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MWJmNzguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9qYXZhbWVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2phdmFtZV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qYXZhbWUiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbiAgICh0X3N0cnVjdCogICB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWw9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICAgIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRlbnRzKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLCB0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwgdF90eXBlKiB0eXBlKTsKLQotICBib29sIGhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlLCBib29sIGluX2luaXQ9ZmFsc2UsIGJvb2wgc2tpcF9nZW5lcmljPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgYm94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLQotICAgIHJldHVybgotICAgICAgdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgIHR0eXBlLT5pc194Y2VwdGlvbigpIHx8Ci0gICAgICB0dHlwZS0+aXNfc3RyaW5nKCkgfHwKLSAgICAgIHR0eXBlLT5pc19lbnVtKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3BhY2thZ2UoKSB7Ci0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEphdmEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247XG5cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0Ci0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdGhyaWZ0X2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKLX0KLQotLyoqCi0gKiBOb3RoaW5nIGluIEphdmEKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCi0gKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKLSAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0ZW51bS0+Z2V0X25hbWUoKSkrIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7Ci0gIGluZGVudChmX2VudW0pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URW51bSAiOwotICBzY29wZV91cChmX2VudW0pOwotICBmX2VudW0gPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwKLSAgICAgICIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG5ldyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiKCIgPDwgdmFsdWUgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0gIGZfZW51bSA8PCBlbmRsOwotCi0gIC8vIEZpZWxkIGZvciB0aHJpZnRDb2RlCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoaW50IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICB0aGlzLnZhbHVlID0gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZmluZEJ5VmFsdWUoaW50IHZhbHVlKSB7ICIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAic3dpdGNoICh2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJjYXNlICIgPDwgdmFsdWUgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsgIAotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi9Db25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0KLSAgZl9jb25zdHMgPDwKLSAgICAicHVibGljIGNsYXNzIENvbnN0YW50cyB7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICghZGVmdmFsKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7Ci0gICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGt0eXBlLCBrZXkpIDw8ICIsICIgPDwKLQlib3hfdHlwZSh2dHlwZSwgdmFsKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotCWluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwKLQkgIGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIsICIgPDwKLQkgIGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCkgbmFtZTsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpib3hfdHlwZSh0X3R5cGUqIHR5cGUsIHN0cmluZyB2YWx1ZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJuZXcgQm9vbGVhbigiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJuZXcgQnl0ZSgiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIm5ldyBTaG9ydCgiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIm5ldyBJbnRlZ2VyKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAibmV3IExvbmcoIiArIHZhbHVlICsgIikiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJuZXcgRG91YmxlKCIgKyB2YWx1ZSArICIpIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBUQmFzZSAKLSAqIGltcGxlbWVudG9yLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7Ci0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0JICAgICAgPDwgIiBleHRlbmRzIFRVbmlvbiAiOwotCi0gIHNjb3BlX3VwKGZfc3RydWN0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0gIAotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7IAotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIAotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY2hlY2tfdHlwZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIGJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oXCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgIiAKLSAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgZm9yIGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgICAgPDwgIicsIGJ1dCBnb3QgXCIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7IiA8PCBlbmRsOwotICAgIC8vIGRvIHRoZSByZWFsIGNoZWNrIGhlcmUKLSAgfQotICAKLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB3cml0ZVZhbHVlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgICAgPDwgIiA9ICgiIDw8ICB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgc2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotCi0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRGaWVsZCBnZXRGaWVsZERlc2MoX0ZpZWxkcyBzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBlcXVhbGl0eQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmIGdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksIG90aGVyLmdldFNldEZpZWxkKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIFRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksIG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIElmIHlvdSdkIGxpa2UgdGhpcyB0byBwZXJmb3JtIG1vcmUgcmVzcGVjdGFibHksIHVzZSB0aGUgaGFzaGNvZGUgZ2VuZXJhdG9yIG9wdGlvbi4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8Ci0gICAgIChpbl9jbGFzcyA/ICJzdGF0aWMgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEV4Y2VwdGlvbiAiOwotICB9Ci0gIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiOwotICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOwotICB9Ci0KLSAgLy8gaXNzZXQgZGF0YQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQgaWQgYXNzaWdubWVudHMiIDw8IGVuZGw7Ci0KLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpCi0gICAgICAgICAgPDwgIiA9ICIgPDwgaSA8PCAiOyIgPDwgIGVuZGw7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGJvb2xlYW5bXSBfX2lzc2V0X3ZlY3RvciA9IG5ldyBib29sZWFuWyIgPDwgaSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICBib29sIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gdHJ1ZTsKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IGZhbHNlOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmICghbWVtYmVycy5lbXB0eSgpICYmICFhbGxfb3B0aW9uYWxfbWVtYmVycykgewotICAgIC8vIEZ1bGwgY29uc3RydWN0b3IgZm9yIGFsbCBmaWVsZHMKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzKCk7IiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlcikpOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjb3B5IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoaGFzX2JpdF92ZWN0b3IodHN0cnVjdCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weShvdGhlci5fX2lzc2V0X3ZlY3RvciwgMCwgX19pc3NldF92ZWN0b3IsIDAsIG90aGVyLl9faXNzZXRfdmVjdG9yLmxlbmd0aCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgY2xvbmUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBlcXVhbHMgbWV0aG9kcyBhbmQgYSBoYXNoQ29kZSBtZXRob2QgZm9yIGEgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKLSAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB1bmVxdWFsOwotCi0gICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgICAgICAgICAgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgICAgICAgICAgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHVuZXF1YWwgPSAiVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiArIG5hbWUgKyAiLCB0aGF0LiIgKwotCW5hbWUgKyAiKSAhPSAwIjsKLSAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXJPYmplY3QpIHsiIDw8IGVuZGw7Ci0gIC8vICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlciA9ICgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKW90aGVyT2JqZWN0OyI7Ci0KLSAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbygiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiLCBvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5jb21wYXJlVG8ob3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLSAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gICAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAotICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCi0gKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQotICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX3N0cmluZygpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKLQotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKCIgPDwgKGJhc2VfdHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgb3V0OwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQotICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgICB0X3R5cGUqIGVsZW1lbnRfdHlwZTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEl0ZXJhdG9yIGdldHRlciBmb3Igc2V0cyBhbmQgbGlzdHMKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgRW51bWVyYXRpb24gZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIkVudW1lcmF0aW9uKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IG51bGwgOiAiIDw8Ci0gICAgICAgICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmVsZW1lbnRzKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8Ci0gICAgICAgICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLQlpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoIiA8PAotCSAgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIsICIgPDwKLQkgIGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCWluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PAotCSAgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgLy8gUHV0IHRvIG1hcAotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXRUbyIKLQkgIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUpIDw8ICIga2V5LCAiCi0JICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8Ci0gICAgICAgIHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmCi0gICAgICAgICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKLSAgICAgIG91dCA8PCAiIGlzIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZ2V0IjsKLSAgICB9Ci0gICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICBvdXQgPDwgInZvaWQiOwotICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PAotICAgICAgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgY2FwX25hbWUgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoYm9vbGVhbiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7IAotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJUQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKiAKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuRU5VTSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJUVHlwZS5WT0lEIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyA6IHJldHVybiAgICAiVFR5cGUuU1RSSU5HIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJUVHlwZS5CT09MIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJUVHlwZS5CWVRFIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiVFR5cGUuRE9VQkxFIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSl7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKXsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7ICAgCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgCi0gICAgfSBlbHNleyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBFbnVtTWV0YURhdGEoVFR5cGUuRU5VTSwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKLSAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOwotICAgIH0KLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIuamF2YSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UgZXh0ZW5kcyAiIDw8Ci0gICAgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UgeyB9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGZfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIklmYWNlLmphdmEiOwotICBzdGQ6Om9mc3RyZWFtIGZfaWZhY2U7Ci0gIGZfaWZhY2Uub3BlbihmX2ludGVyZmFjZV9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJJZmFjZSI7Ci0gIH0KLSAgCi0gIGZfaWZhY2UgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgdHNlcnZpY2UpOwotICBmX2lmYWNlIDw8Ci0gICAgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgKmZfaXRlcik7Ci0gICAgZl9pZmFjZSA8PCAiICBwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBmX2lmYWNlIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwKLSAgICAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5DbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnQsIElmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ0aGlzKHByb3QsIHByb3QpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBpbnQgc2VxaWRfOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgKytzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIElmYWNlIGlmYWNlXzsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIHByb2Nlc3NNYXBfID0gbmV3IEhhc2h0YWJsZSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gKFByb2Nlc3NGdW5jdGlvbilwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcml2YXRlIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50cyBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IAotICAgIGluZGVudCgpIDw8ICJ9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICghKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpCi0gICAgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgPDwgIigiCi0gICAgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIgKQotICAgIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PAotICAgIGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1dCgiIDw8Ci0gICAgYm94X3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIiwgIiA8PAotICAgIGJveF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1dCgiIDw8Ci0gICAgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiLCAiIDw8Ci0gICAgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkRWxlbWVudCgiIDw8Ci0gICAgYm94X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIHN0cmluZyBrZXlfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IGtleV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIiA8PCBrZXlfdHlwZSA8PCAiKSIgPDwgZW51bWVyIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpCi0gICAgICA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIKLSAgICAgIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lciA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiCi0gICAgICA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHN0cmluZyB2YWxfdHlwZSA9IHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIigiICsgdmFsX3R5cGUgKyAiKSIgKyBtYXAgKyAiLmdldCgiICsgaXRlciArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gVmVjdG9yCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0LCBib29sIHNraXBfZ2VuZXJpYykgewotICAodm9pZCkgaW5faW5pdDsKLSAgKHZvaWQpIHNraXBfZ2VuZXJpYzsKLSAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJIYXNodGFibGUiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiSGFzaHRhYmxlIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJWZWN0b3IiOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLSAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBKYXZhIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJTdHJpbmciOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9Ci0gICAgdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOwotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgfQotICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAiLyoqXG4iLAotICAgICIgKiAiLCBjb250ZW50cywKLSAgICAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7Ci0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKLSAgc3RkOjpzdHJpbmcgZW51bWVyYXRpb25fbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbnVtIjsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKLQotICBpZihjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUgPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICgiCi0JCTw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUgPDwgIi5lbGVtZW50cygpOyAiIAotICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgotICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCWluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiLCAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpdGVyYXRpdmUgY29weQotICAgICAgaWYoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotCWlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgewotCSAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLQl9IGVsc2UgewotCSAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQodGVtcF9iaW5hcnlfZWxlbWVudCwgdGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotCX0KLSAgICAgIH0gZWxzZXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7Ci0gICAgfQotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOwotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1ib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCi0gICAgICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAotICAgICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihmYWxzZSk7IiA8PCBlbmRsOwotICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiAgLy8gcHJldmVudCBnY2MgY29tcGlsZXIgd2FybmluZwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTRmYzkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi0vKioKLSAqIEpTIGNvZGUgZ2VuZXJhdG9yLgotICovCi1jbGFzcyB0X2pzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9qc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSA6Ci0gICAgIHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgICAKLSAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAgCi0gICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub2RlIik7Ci0gICAgIGdlbl9ub2RlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tbm9kZWpzIjsKLSAgICAgfSBlbHNlIHsKLSAgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7Ci0gICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19leHBvcnRlZD10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0ICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBqc19pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybgotICAgICAgc3RkOjpzdHJpbmcoIi8vXG4iKSArCi0gICAgICAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICAgIi8vXG4iICsKLSAgICAgICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICIvL1xuIjsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBqc19uYW1lc3BhY2VfcGllY2VzKHRfcHJvZ3JhbSogcCkgewotICAgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotCi0gICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlICAgbG9jOwotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlczsKLQotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7Ci0gICAgICAgICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwaWVjZXM7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc190eXBlX25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90dHlwZXMuIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiAidHR5cGVzLiI7Ci0gICAgfQotICAgIHJldHVybiBqc19uYW1lc3BhY2UocHJvZ3JhbSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc19leHBvcnRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIHJldHVybiAiZXhwb3J0cy4iOwotICAgIH0KLSAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICBucyArPSAiLiI7Ci0gICAgICB9Ci0KLQotICAgICAgcmV0dXJuIG5zOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgTm9kZUpTLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KLSAgICovCi0gIGJvb2wgZ2VuX25vZGVfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpcitwcm9ncmFtXy0+Z2V0X25hbWUoKSsiX3R5cGVzLmpzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqc19pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfdHlwZXNfIDw8ICJ2YXIgdHR5cGVzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgcG5zOwotCi0gIC8vc2V0dXAgdGhlIG5hbWVzcGFjZQotICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/Ci0gIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMoIHByb2dyYW1fICk7Ci0gIGlmKCBuc19waWVjZXMuc2l6ZSgpID4gMCl7Ci0gICAgICBmX3R5cGVzXyA8PCAidmFyICIgPDwgbnNfcGllY2VzWzBdIDw8ICIgPSB7fSI8PGVuZGw7Ci0KLSAgICAgIHBucyA9IG5zX3BpZWNlc1swXTsKLQotICAgICAgZm9yKHNpemVfdCBpPTE7IGk8bnNfcGllY2VzLnNpemUoKTsgaSsrKXsKLSAgICAgICAgICBwbnMgKz0gIi4iICsgbnNfcGllY2VzW2ldOwotCi0gICAgICAgICAgZl90eXBlc18gPDwgcG5zIDw8ICIgPSB7fSI8PGVuZGw7Ci0gICAgICB9Ci0gIH0KLQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqcyBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6anNfaW5jbHVkZXMoKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gc3RyaW5nKCJ2YXIgVGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JykuVGhyaWZ0OyIpOwotICB9Ci0gIHN0cmluZyBpbmM7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgcmVzdWx0ICs9ICJ2YXIgIiArIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICJfdHlwZXMnKVxuIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHN0cmluZyBpbmM7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0KLSAgZl90eXBlc18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEpTLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIEpTLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UodGVudW0pPDx0ZW51bS0+Z2V0X25hbWUoKTw8IiA9IHsgIjw8ZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKQotICAgICAgICBmX3R5cGVzXyA8PCAiLCI7Ci0KLSAgICBmX3R5cGVzXyA8PCAiJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIDogIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc18gPDwgIn0iPDxlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZSh0eXBlKSAgPDwgbmFtZSA8PCAiID0gIjsKLSAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICInIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIGJvb2wgICAga2V5X2lzX3N0cmluZyA9IGZhbHNlOwotICAgIGlmIChrdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopa3R5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyl7Ci0gICAgICAgIGtleV9pc19zdHJpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IjsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKLSAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0KLSAgICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGwgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIlsiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogTWFrZSBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gSlMKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhwb3J0ZWQpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgaWYgKGlzX2V4cG9ydGVkKSB7Ci0gICAgICBvdXQgPDwgInZhciAiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8Ci0gICAgICAgICJtb2R1bGUuZXhwb3J0cy4iIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihhcmdzKXtcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAidmFyICIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3Mpe1xuIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IiA9IGZ1bmN0aW9uKGFyZ3Mpe1xuIjsKLSAgfQotCi0gIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRocmlmdC5URXhjZXB0aW9uLmNhbGwodGhpcywgXCIiIDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5uYW1lID0gXCIiIDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCBlbmRsOwotICB9Ci0KLSAgLy9tZW1iZXJzIHdpdGggYXJndW1lbnRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlcixmYWxzZSx0cnVlKTsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIGR2YWwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpICA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCAiaWYoIGFyZ3MgIT0gbnVsbCApeyI7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDxlbmRsCi0gICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSAgPDwgZW5kbCA7Ci0KLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOwotCi0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgIn1cbiI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgVGhyaWZ0LlRFeGNlcHRpb24pIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vaW5pdCBwcm90b3R5cGUKLSAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ii5wcm90b3R5cGUgPSB7fVxuIjsKLSAgfQotCi0KLSAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpeyAiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0ID0gaW5wdXQucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7Ci0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSAiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAidmFyIHJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZm5hbWUgPSByZXQuZm5hbWUiIDw8ZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmdHlwZSA9IHJldC5mdHlwZSIgPDxlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZpZCAgID0gcmV0LmZpZCIgICA8PGVuZGw7Ci0KLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiI7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAgIiAgaW5wdXQuc2tpcChmdHlwZSkiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0KLSAgfQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIGluZGVudChvdXQpIDw8ICAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICAiICBpbnB1dC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpeyAiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8aW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyIuanMiOwotICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAiID0gcmVxdWlyZSgnLi8iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgPSAiIDw8Ci0gICAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudCIgPDwgZW5kbDsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICJ2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAidmFyICIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8Ci0gICAgICAgICJleHBvcnRzLlByb2Nlc3NvciA9IGZ1bmN0aW9uKGhhbmRsZXIpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSAiOwotCi0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgciA9IGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzWydwcm9jZXNzXycgKyByLmZuYW1lXSkgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdmFyIHggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJyArIHIuZm5hbWUpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oci5mbmFtZSwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgci5yc2VxaWQpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG91dHB1dCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3V0cHV0LmZsdXNoKCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSAiOwotCi0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAganNfbmFtZXNwYWNlKHByb2dyYW1fKSsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAganNfbmFtZXNwYWNlKHByb2dyYW1fKSsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaW5wdXQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnB1dC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gICAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJmdW5jdGlvbihzdWNjZXNzKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gc3VjY2VzcyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3V0cHV0KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgICAgICB0cy0+c2V0X25hbWUobmFtZSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAodm9pZCkgdHNlcnZpY2U7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJ2YXIgIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9ICIgPDwgCi0gICAgICAgICJleHBvcnRzLkNsaWVudCA9IGZ1bmN0aW9uKG91dHB1dCwgcENsYXNzKSB7Ijw8ZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyI8PGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMucENsYXNzID0gcENsYXNzOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5zZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLl9yZXFzID0ge30iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5pbnB1dCAgPSBpbnB1dCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQgPSBudWxsID09IG91dHB1dCA/IGlucHV0IDogb3V0cHV0IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLnNlcWlkICA9IDAiIDw8IGVuZGw7Ci0gIH0KLQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PAotICAgICAgICBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQsICIgPDwKLSAgICAgICAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgICAvL2luaXQgcHJvdG90eXBlCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUgPSB7fSI8PGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV88PCJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCBnZW5fbm9kZV8pIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aGlzLnNlcWlkICs9IDE7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWRdID0gY2FsbGJhY2s7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PAotICAgICAgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIGlmICghZ2VuX25vZGVfICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICJDbGllbnQucHJvdG90eXBlLnNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgInsiIDw8ZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgb3V0cHV0VmFyOwotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciBvdXRwdXQgPSBuZXcgdGhpcy5wQ2xhc3ModGhpcy5vdXRwdXQpOyIgPDwgZW5kbDsKLSAgICAgIG91dHB1dFZhciA9ICJvdXRwdXQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRwdXRWYXIgPSAidGhpcy5vdXRwdXQiOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gIGpzX25hbWVzcGFjZShwcm9ncmFtXykrIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwsIHRoaXMuc2VxaWQpIiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IG91dHB1dFZhciA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfQotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBlbmRsIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICAgICAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihpbnB1dCxtdHlwZSxyc2VxaWQpeyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGVuZGwgPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV8gPDwKLSAgICAgICAgICAgICJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGlucHV0VmFyOwotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICBpbnB1dFZhciA9ICJpbnB1dCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnB1dFZhciA9ICJ0aGlzLmlucHV0IjsKLSAgICAgIH0KLQotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBjYWxsYmFjayA9IHRoaXMuX3JlcXNbcnNlcWlkXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1tyc2VxaWRdOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJldCA9IHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgbXR5cGUgPSByZXQubXR5cGUiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJzZXFpZD0gcmV0LnJzZXFpZCIgPDxlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdmFyIHggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIngiKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpIiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobnVsbCAhPSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coInJlc3VsdC4iICsgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gcmVzdWx0LnN1Y2Nlc3MgKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl9yZXR1cm4oInJlc3VsdC5zdWNjZXNzIikgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIlwiIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiIikgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjYWxsYmFjayhudWxsKSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn0iPDxlbmRsOwotCi0gICAgfQotICB9Ci0KLX0KLQotc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcikgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2soIiArIHZhciArICIpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJ0aHJvdyAiICsgdmFyOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gInJldHVybiBjYWxsYmFjayhudWxsLCAiICsgdmFyICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInJldHVybiAiICsgdmFyOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKSBpbmNsYXNzOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4K3RmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaW5wdXQuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgIH0KLQotICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICAgIG91dCA8PCAiLnZhbHVlIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCAganNfdHlwZV9uYW1lc3BhY2UodHN0cnVjdCk8PHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaW5wdXQpIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgc2l6ZSA8PCAiID0gMCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcnRtcDMiIDw8IGVuZGw7Ci0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBrdHlwZSA8PCAiID0gMCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCB2dHlwZSA8PCAiID0gMCIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJydG1wMyA9IGlucHV0LnJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGt0eXBlIDw8ICI9IHJ0bXAzLmt0eXBlIiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZ0eXBlIDw8ICI9IHJ0bXAzLnZ0eXBlIiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHNpemUgIDw8ICI9IHJ0bXAzLnNpemUiIDw8IGVuZGw7Ci0KLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGV0eXBlIDw8ICIgPSAwIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJydG1wMyA9IGlucHV0LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGV0eXBlIDw8ICI9IHJ0bXAzLmV0eXBlIjw8ZW5kbDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHNpemUgPDwgIiA9IHJ0bXAzLnNpemUiPDxlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGV0eXBlIDw8ICIgPSAwIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJydG1wMyA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBldHlwZSA8PCAiID0gcnRtcDMuZXR5cGUiPDxlbmRsPDwKLSAgICAgICAgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gcnRtcDMuc2l6ZSI8PGVuZGw7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKHZhciAiIDw8Ci0gICAgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGwiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGwiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggK3RmaWVsZC0+Z2V0X25hbWUoKSApOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgICBpZighcHJlZml4LmVtcHR5KCkpCi0gICAgICBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvdXRwdXQpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3V0cHV0LndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiVGhyaWZ0Lm9iamVjdExlbmd0aCgiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKSIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvdXRwdXQud3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLmxlbmd0aCkiIDw8IGVuZGw7Ci0KLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcih2YXIgIjw8a2l0ZXI8PCIgaW4gIjw8cHJlZml4PDwiKSI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCI8PHByZWZpeDw8Ii5oYXNPd25Qcm9wZXJ0eSgiPDxraXRlcjw8IikpIiA8PGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICI8PHZpdGVyPDwiID0gIjw8cHJlZml4PDwiWyI8PGtpdGVyPDwiXSI8PGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yKHZhciAiPDxpdGVyPDwiIGluICIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgiPDxwcmVmaXg8PCIuaGFzT3duUHJvcGVydHkoIjw8aXRlcjw8IikpIiA8PGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICI9IiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl0iPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZm9yKHZhciAiPDxpdGVyPDwiIGluICI8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCI8PHByZWZpeDw8Ii5oYXNPd25Qcm9wZXJ0eSgiPDxpdGVyPDwiKSkiIDw8ZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIj0iIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXSI8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZVNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYoIW9iail7Ci0gICAgICByZXN1bHQgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKXsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICtqc190eXBlX25hbWVzcGFjZSh0eXBlKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciAgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiID0gZnVuY3Rpb24oIjsKLQotCi0gIC8vTmVlZCB0byBjcmVhdGUganMgZnVuY3Rpb24gYXJnIGlucHV0cwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+ICZmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgICBpZihmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpCi0gICAgICAgICAgc3RyICs9ICIsIjsKLQotICAgICAgc3RyICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmIChpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgewotICAgICAgc3RyICs9ICIsIjsKLSAgICB9Ci0gICAgc3RyICs9ICJjYWxsYmFjayI7Ci0gIH0KLQotICBzdHIgKz0gIikiOwotICByZXR1cm4gc3RyOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLCAiSmF2YXNjcmlwdCIsIAotIiAgICBub2RlOiAgICAgICAgICAgIEdlbmVyYXRlIG5vZGUuanMgY29tcGF0aWJsZSBjb2RlLlxuIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjNiNTMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4ODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vY2FtbF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tb2NhbWwiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0gICgpOwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQgKnRtZW1iZXIpOwotICBib29sIHN0cnVjdF9tZW1iZXJfb21pdGFibGUodF9maWVsZCAqdG1lbWJlcik7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0X2ZpZWxkICp0bWVtYmVyKTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSAqdHlwZSwgc3RyaW5nIHdoYXQpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+JiBtZW1iZXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQgKm1lbWJlcik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQpOwotCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZT0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgb2NhbWxfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIG9jYW1sX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZD1mYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOwotCi0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2lfOwotCi19OwotCi0KLS8qCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAotICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMKLSAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKLSAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgewotICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKLSAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5tbCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl90eXBlc19pX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5tbGkiOwotICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdHMubWwiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pPDwiX3R5cGVzIjw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIigqXG4iKSArCi0gICAgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCi0gICAgIlxuIiArCi0gICAgIiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIiopXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2ltcG9ydHMoKSB7Ci0gIHJldHVybiAib3BlbiBUaHJpZnQiOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlICI8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IGVuZGwgPDwgInN0cnVjdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBlbmRsIDw8ICJzaWciIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IHRvX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgdG9faSA6IHQgLT4gaW50IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IG9mX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgb2ZfaSA6IGludCAtPiB0IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IHZhbHVlIDw8ICIgLT4gIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCBfIC0+IHJhaXNlIFRocmlmdF9lcnJvciIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZW5kIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgImVuZCIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCAibGV0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAvLyBPQ2FtbCByZXF1aXJlcyBhbGwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb250YWluIGEgZGVjaW1hbCBwb2ludAotICBvdXQuc2V0Zihpb3M6OnNob3dwb2ludCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IGN0IDw8IiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSAic3RydWN0IgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoZl90eXBlc19pXyx0c3RydWN0LGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgbWVtYmVycykgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0ICovCi0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX25ldyA9IE9vLmNvcHkgc2VsZiBpbiIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQotICAgICAgICBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvdXQsICptX2l0ZXIpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiX25ldyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUgKnR5cGUsIHN0cmluZyB3aGF0KSB7Ci0gICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgcmV0dXJuIHdoYXQgKyBzdHJpbmcgKCIjY29weSIpOwotICAgIH0gaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHN0cmluZyBjb3B5X29mX2sgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X21hcCAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2ZfdiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwICopdHlwZSktPmdldF92YWxfdHlwZSgpLCAidiIpOwotCi0gICAgICAgIGlmKGNvcHlfb2ZfayA9PSAiayIgJiYgY29weV9vZl92ID09ICJ2IikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBIYXNodGJsLmFkZCBuaCAiKQotICAgICAgICAgICAgICAgICAgICArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92Ci0gICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICAgICAgICAgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X3NldCAqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7Ci0KLSAgICAgICAgaWYoY29weV9vZiA9PSAiayIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nICgiKEhhc2h0YmwuY29weSAiKSArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nICgiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5hZGQgbmggIikKLSAgICAgICAgICAgICAgICAgICAgKyBjb3B5X29mICsgc3RyaW5nKCIgdHJ1ZSIpCi0gICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICAgICAgICAgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0ICopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgIngiKTsKLSAgICAgICAgaWYoY29weV9vZiAhPSAieCIpIHsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcoIihMaXN0Lm1hcCAoZnVuIHggLT4gIikKLSAgICAgICAgICAgICAgICArIGNvcHlfb2YgKyBzdHJpbmcgKCIpICIpCi0gICAgICAgICAgICAgICAgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gd2hhdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd2hhdDsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgIHN0cmluZyBncmFiX2ZpZWxkID0gc3RyaW5nKCJzZWxmI2dyYWJfIikgKyBtbmFtZTsKLSAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKLSAgICBpZihjb3B5X29mICE9IGdyYWJfZmllbGQpIHsKLSAgICAgICAgaW5kZW50KG91dCk7Ci0gICAgICAgIGlmKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICIgICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOwotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgaWYoaXNfZXhjZXB0aW9uKXsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHN0cmluZyB4ID0gdG1wKCJfeCIpOwotICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhbCBtdXRhYmxlIF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotICB0X2NvbnN0X3ZhbHVlICp2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgaWYodmFsKSB7Ci0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQotICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAgb3V0IDw8ICIgb3B0aW9uID0gU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBhc3NlcnQoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKLSAgICBvdXQgPDwgIiBvcHRpb24gPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IFNvbWUgXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIiA8PCB4IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIjw8bW5hbWU8PCIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiPDx0bmFtZTw8Ii4iPDxtbmFtZTw8IlwiKSB8IFNvbWUgIiA8PCB4IDw8IiAtPiAiIDw8IHggPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBTb21lICIgPDwgeCA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiOwotICBpZih2YWwpIHsKLSAgICBpZihzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOwotICB9Ci0KLQotfQotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkICp0bWVtYmVyKSB7Ci0gIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotfQotCi0vKioKLSAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcwotICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIGlmKCF2YWwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZih0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8vIEJhc2UgdHlwZXMgYXJlIGdlbmVyYWxseSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgotICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZih2YWwtPmdldF9kb3VibGUoKSA9PSAwLjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCi0gICAgLy8gSXMgZW1wdHkgbGlzdD8KLSAgICBpZih2YWwtPmdldF9saXN0KCkuc2l6ZSgpID09IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIHggPSB0bXAoIl94Iik7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpZighc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmKGlzX2V4Y2VwdGlvbil7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8IiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKLSAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImlnbm9yZShpcHJvdCNyZWFkU3RydWN0QmVnaW4pOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImxldCAoXywiIDw8IHQgPDwiLCI8PGlkPDwiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgIiA8PCB0IDw8IiA9IFByb3RvY29sLlRfU1RPUCB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAgICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZDw8IiB3aXRoICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOwotICAgICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLHN0cik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIjw8IHQgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ8IF8gLT4gIiA8PCAiaXByb3Qjc2tpcCAiPDx0PDwiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyAoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgc3RyIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qjd3JpdGVTdHJ1Y3RCZWdpbiBcIiI8PG5hbWU8PCJcIjsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkICp0bWVtYmVyID0gKCpmX2l0ZXIpOwotICAgIHN0cmluZyBtbmFtZSA9ICJfIitkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIF92OwotCi0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0KLSAgICAgIGlmKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikKLSAgICAgICAgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICBfdiA9ICJfdiI7Ci0gICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCi0gICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICA8PCAiIC0+ICgpIHwgIiA8PCBfdiA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIF92ID0gbW5hbWU7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiOwotCi0gICAgICBpZihzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7Ci0KLSAgICAgICAgaWYoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIgotICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICAgIDw8ICIgLT4gKCkiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiCi0gICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIF92ID0gIl92IjsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiI8PCB0bWVtYmVyLT5nZXRfbmFtZSgpPDwiXCIsIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIKLSAgICAgICAgICAgICAgICA8PCB0bWVtYmVyLT5nZXRfa2V5KCk8PCIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZUZpZWxkU3RvcDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWwiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWxpIjsKLSAgZl9zZXJ2aWNlX2lfLm9wZW4oZl9zZXJ2aWNlX2lfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIH0KLSAgKi8KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSx0cnVlKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBmdCAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ0IDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4gVGhpcyBpcyBiZWNhdXNlCi0gKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8Ci0gICAgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICAgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ1bmN0aW9uX3R5cGUoKmZfaXRlcix0cnVlLGZhbHNlKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgUHJvdG9jb2wuQ0FMTCwgc2VxaWQpOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJsZXQgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncyNzZXRfIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgcmVzID0gIl8iOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzID0gInJlc3VsdCI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJsZXQgIjw8cmVzPDwiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJtYXRjaCByZXN1bHQjZ2V0X3N1Y2Nlc3Mgd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gKCIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLQotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiIF92KSk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSAoQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uTUlTU0lOR19SRVNVTFQgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBwcm9jZXNzb3IgKGhhbmRsZXIgOiBpZmFjZSkgPSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyBpcHJvdCBvcHJvdCA9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBIYXNodGJsLm1lbSBwcm9jZXNzTWFwIG5hbWUgdGhlbiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIChIYXNodGJsLmZpbmQgcHJvY2Vzc01hcCBuYW1lKSAoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uIFwiXm5hbWUpIGluIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBQcm90b2NvbC5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHgjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ0cnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5pdGlhbGl6ZXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHNlbGYjcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIm1ldGhvZCBwcml2YXRlIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBhcmdzID0gImFyZ3MiOwotICBpZihmaWVsZHMuc2l6ZSgpID09IDApewotICAgIGFyZ3M9Il8iOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJsZXQgIjw8YXJnczw8IiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotCi0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifCAiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpewotICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCNzZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFByb3RvY29sLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0KLQotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiNzZXRfIjw8bmFtZSA8PCAiICI7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LHR5cGUpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotICB9Ci0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIG91dCA8PCAiaXByb3QjIjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgIG91dCA8PCAiKCIgPDxlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIocmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotCi19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8a3R5cGU8PCIsIjw8dnR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSBIYXNodGJsLmNyZWF0ZSAiPDxzaXplPDwiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIjw8c2l6ZTw8IiBkbyIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX3YgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiPDxjb248PCAiIF9rIF92IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZE1hcEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkU2V0QmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSBIYXNodGJsLmNyZWF0ZSAiPDxzaXplPDwiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIjw8c2l6ZTw8IiBkbyIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiPDxjb248PCIgIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkU2V0RW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkTGlzdEJlZ2luIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIjw8Y29uPDwiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIjw8c2l6ZTw8IiAoZnVuIF8gLT4gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiKSkpIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkTGlzdEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYobmFtZS5sZW5ndGgoKSA9PSAwKXsKLSAgICBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCMiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCI8PGVuYW1lPDwiLnRvX2kgIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIG91dCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZU1hcEJlZ2luKCI8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIjw8a2l0ZXI8PCIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiPDxpdGVyPDwiIC0+IGZ1biBfIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkxpc3QuaXRlciAoZnVuICI8PGl0ZXI8PCIgLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8ICBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVNYXBFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEVuZCI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lIGFyZ3MnCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybgotICAgIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKLSAgICAiICIgKyAgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kLCBib29sIG9wdGlvbnMpewotICBzdHJpbmcgcmVzdWx0PSIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYob3B0aW9ucykKLSAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7Ci0gICAgcmVzdWx0ICs9ICIgLT4gIjsKLSAgfQotICBpZihmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKXsKLSAgICByZXN1bHQgKz0gInVuaXQgLT4gIjsKLSAgfQotICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYodHR5cGUtPmlzX3NlcnZpY2UoKSl7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKLSAgfQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gb2NhbWwgdHlwZQotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9vY2FtbF90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAidW5pdCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIkludDY0LnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkrIi50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHJldHVybiAiKCIrcmVuZGVyX29jYW1sX3R5cGUoa3R5cGUpKyIsIityZW5kZXJfb2NhbWxfdHlwZSh2dHlwZSkrIikgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiKCIrcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpKyIsYm9vbCkgSGFzaHRibC50IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgcmV0dXJuIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSsiIGxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Iob2NhbWwsICJPQ2FtbCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NTc4Ni4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICi0jZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotLyoqCi0gKiBDbGFzcyB3aXRoIHV0aWxpdHkgbWV0aG9kcyBzaGFyZWQgYWNyb3NzIGNvbW1vbiBvYmplY3Qgb3JpZW50ZWQgbGFuZ3VhZ2VzLgotICogU3BlY2lmaWNhbGx5LCBtb3N0IG9mIHRoaXMgc3R1ZmYgaXMgZm9yIEMrKy9KYXZhLgotICoKLSAqLwotY2xhc3MgdF9vb3BfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X2dlbmVyYXRvcihwcm9ncmFtKSB7fQotCi0gIC8qKgotICAgKiBTY29waW5nLCB1c2luZyBjdXJseSBicmFjZXMhCi0gICAqLwotCi0gIHZvaWQgc2NvcGVfdXAoc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgc3RkOjplbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdm9pZCBzY29wZV9kb3duKHN0ZDo6b3N0cmVhbSYgb3V0KSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgc3RkOjplbmRsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdXBjYXNlX3N0cmluZyhzdGQ6OnN0cmluZyBvcmlnaW5hbCkgewotICAgIHN0ZDo6dHJhbnNmb3JtKG9yaWdpbmFsLmJlZ2luKCksIG9yaWdpbmFsLmVuZCgpLCBvcmlnaW5hbC5iZWdpbigpLCAoaW50KCopKGludCkpIHRvdXBwZXIpOwotICAgIHJldHVybiBvcmlnaW5hbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgYSBjb21tZW50IGFib3V0IHRoaXMgY29kZSBiZWluZyBhdXRvZ2VuZXJhdGVkLCB1c2luZyBDKysgc3R5bGUKLSAgICogY29tbWVudHMsIHdoaWNoIGFyZSBhbHNvIGZhaXIgZ2FtZSBpbiBKYXZhIC8gUEhQLCB5YXkhCi0gICAqCi0gICAqIEByZXR1cm4gQy1zdHlsZSBjb21tZW50IG1lbnRpb25pbmcgdGhhdCB0aGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybgotICAgICAgc3RkOjpzdHJpbmcoIi8qKlxuIikgKwotICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAgICIgKlxuIiArCi0gICAgICAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiICovXG4iOwotICB9Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTc5NmRjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBQRVJMIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9wZXJsX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9wZXJsX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1wZXJsIjsKLSAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKLSAgICBlc2NhcGVfWydAJ10gPSAiXFxAIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlLCBib29sIG9iaj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybgotICAgICAgc3RkOjpzdHJpbmcoIiNcbiIpICsKLSAgICAgICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAgICIjXG4iICsKLSAgICAgICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICAgIiNcbiI7Ci0gIH0KLQotICB2b2lkIHBlcmxfbmFtZXNwYWNlX2RpcnModF9wcm9ncmFtKiBwLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBkaXJzKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwZXJsIik7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGRpcnMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKLSAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICBkaXJzLnB1c2hfYmFjayhucyk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjpzdHJpbmcgcGVybF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwZXJsIik7Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKLSAgICAgICAgcmVzdWx0ICs9ICI6OiI7Ci0gICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgewotICAgIHN0ZDo6c3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOwotICAgIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKLSAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7Ci0gICAgfQotICAgIHJldHVybiBvdXRkaXI7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWxwZXJzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IGRpcnM7Ci0gIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOwotICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdDsKLSAgZm9yIChpdCA9IGRpcnMuYmVnaW4oKTsgaXQgIT0gZGlycy5lbmQoKTsgaXQrKykgewotICAgICAgb3V0ZGlyICs9ICppdCArICIvIjsKLSAgICAgIE1LRElSKG91dGRpci5jX3N0cigpKTsKLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpcisiVHlwZXMucG0iOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIrIkNvbnN0YW50cy5wbSI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwZXJsX2luY2x1ZGVzKCk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgInBhY2thZ2UgIjw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCJDb25zdGFudHM7Ijw8ZW5kbDw8Ci0gICAgcGVybF9pbmNsdWRlcygpIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpwZXJsX2luY2x1ZGVzKCkgewotICBzdHJpbmcgaW5jOwotCi0gIGluYyAgPSAicmVxdWlyZSA1LjYuMDtcbiI7Ci0gIGluYyArPSAidXNlIHN0cmljdDtcbiI7Ci0gIGluYyArPSAidXNlIHdhcm5pbmdzO1xuIjsKLSAgaW5jICs9ICJ1c2UgVGhyaWZ0O1xuXG4iOwotCi0gIHJldHVybiBpbmM7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl90eXBlc18uY2xvc2UoKTsKLQotICBmX2NvbnN0c18gPDwgIjE7IiA8PCBlbmRsOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBFUkwsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PHRlbnVtLT5nZXRfbmFtZSgpPDwiOyI8PGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl90eXBlc18gPDwgInVzZSBjb25zdGFudCAiPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7Ci0gIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotCi0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiAxIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gUEVSTAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8Ci0gICAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiO1xuIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7Ci0gIH0KLQotICAvL0NyZWF0ZSBzaW1wbGUgYWNlc3NvciBtZXRob2RzCi0gIG91dCA8PCAidXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTtcbiI7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgICAgICBpZiAoIXQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICI7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBvdXQgPDwgIikgKTtcbiI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBuZXcoKQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgInN1YiBuZXcgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkY2xhc3NuYW1lID0gc2hpZnQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHZhbHMgICAgICA9IHNoaWZ0IHx8IHt9OyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSAidW5kZWYiOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChVTklWRVJTQUw6OmlzYSgkdmFscywnSEFTSCcpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHZhbHMtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAifVxuXG4iOwotCi0gIG91dCA8PAotICAgICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgInN1YiByZWFkIHsiIDw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQpID0gQF87IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiICAgICA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmaWQgICA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcXCRmbmFtZSk7IiA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkgIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXFwkZm5hbWUsIFxcJGZ0eXBlLCBcXCRmaWQpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7Ci0KLSAgfQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0KLSAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJzdWIgd3JpdGUgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIm15ICgkc2VsZiwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJteSAkeGZlciAgID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkc2VsZi0+eyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIG91dCA8PGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfbmFtZXNwYWNlX291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyIucG0iOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIC8vLyAgICAgICJwYWNrYWdlICI8PHNlcnZpY2VfbmFtZV88PCI7Ijw8ZW5kbDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwZXJsX2luY2x1ZGVzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKLQotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEVSTCkKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAidXNlIGJhc2UgcXcoIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yKTsiOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRoYW5kbGVyKSA9IEBfOyI8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgICA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aGFuZGxlcn0gPSAkaGFuZGxlcjsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7Ijw8ZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdWIgcHJvY2VzcyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZm5hbWUgID0gdW5kZWY7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRtdHlwZSAgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGw7Ci0KLSAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCEkc2VsZi0+Y2FuKCRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnNraXAoVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCBUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkc2VsZi0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIDE7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8ZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3ViIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiB7Ijw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJldmFsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiRyZXN1bHQtPntzdWNjZXNzfSA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIkc2VsZi0+e2hhbmRsZXJ9LT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifTsgaWYoIFVOSVZFUlNBTDo6aXNhKCRALCciIDw8Ci0gICAgICAgICAgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKSA8PAotICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICInKSApeyAiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgICB0cy0+c2V0X25hbWUobmFtZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKSArICJJZik7IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PAotICAgIGV4dGVuZHNfaWYgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDxlbmRsPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzICAgID0gIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpICsgIlJlc3QpOyI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3Q7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwKLSAgICBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7Ci0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfICA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzdWIgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICJ7IiAgICA8PGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGF0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgc3RyaW5nIHJlcSA9ICIkcmVxdWVzdC0+eyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIid9IjsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gKCIgPDwgcmVxIDw8ICIpID8gIiA8PCByZXEgPDwgIiA6IHVuZGVmOyIgPDwgZW5kbDsKLSAgICAgIGlmIChhdHlwZS0+aXNfc3RyaW5nKCkgJiYKLSAgICAgICAgICAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpICAgICA8PCAiJCI8PCgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCIgPSBcXEAiPDwoKmFfaXRlciktPmdldF9uYW1lKCk8PGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHNlbGYtPntpbXBsfS0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDxlbmRsOwotICB9Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAidXNlIGJhc2UgcXcoIiArIGV4dGVuZHMgKyAiQ2xpZW50KTsiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBleHRlbmRzX2NsaWVudCA8PCBlbmRsIDw8Ci0gICAgICAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpOyIgPDwgZW5kbDsKLQotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgICA8PGVuZGw7Ci0KLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fSAgPSAkaW5wdXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9ID0gZGVmaW5lZCAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e3NlcWlkfSAgPSAwOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyI8PGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwKLSAgICAgICIkc2VsZi0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgIiRzZWxmLT5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3ViIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6Q0FMTCwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHNlbGYtPntvdXRwdXR9KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICR4LT5yZWFkKCRzZWxmLT57aW5wdXR9KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGRpZSAkeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImRpZSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ9Ijw8ZW5kbDsKLQotICAgIH0KLSAgfQotCi19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpIGluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgaWYgKCFwcmVmaXguZW1wdHkoKSkgewotICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZyhcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IHZ0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiIDw8Ci0gICAgICAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIiA8PAotICAgICAgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yIChteSAkIiA8PAotICAgIGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGtleSA8PCAifSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgInsiK3RmaWVsZC0+Z2V0X25hbWUoKSsifSIgKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSsifSIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICAvL0hhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICAgIGlmKCFwcmVmaXguZW1wdHkoKSkKLSAgICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotCi0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAid2hpbGUoIG15ICgkIjw8a2l0ZXI8PCIsJCI8PHZpdGVyPDwiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCBteSAkIjw8aXRlcjw8IiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggbXkgJCI8PGl0ZXI8PCIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgewotICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gW10iOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciAgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKLSAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOwotCi0gIC8vTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gJmZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGU6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWIzM2E5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBQSFAgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcGhwX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaW5saW5lZCIpOwotICAgIGJpbmFyeV9pbmxpbmVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJlc3QiKTsKLSAgICByZXN0XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJzZXJ2ZXIiKTsKLSAgICBwaHBzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhdXRvbG9hZCIpOwotICAgIGF1dG9sb2FkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJvb3AiKTsKLSAgICBvb3BfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOwotICAgIH0KLQotICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKLSAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKLSAgfQotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIF9nZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3R5cGUqIHQpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhzdGQ6Om9mc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0ICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBfZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwaHBfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19jYXN0KHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOwotICAgIHJldHVybiBucy5zaXplKCkgPyAobnMgKyAiXyIpIDogIiI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBwaHBfcGF0aCh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocC5wYXRoIik7Ci0gICAgaWYgKG5zLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIC8vIFRyYW5zZm9ybSB0aGUgamF2YS1zdHlsZSBuYW1lc3BhY2UgaW50byBhIHBhdGguCi0gICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBucy5iZWdpbigpOyBpdCAhPSBucy5lbmQoKTsgKytpdCkgewotICAgICAgaWYgKCppdCA9PSAnLicpIHsKLSAgICAgICAgKml0ID0gJy8nOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBucyArICcvJyArIHAtPmdldF9uYW1lKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWxwZXJzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLSAgLyoqCi0gICAqIEdlbmVyYXRlIHByb3RvY29sLWluZGVwZW5kZW50IHRlbXBsYXRlPyBPciBCaW5hcnkgaW5saW5lIGNvZGU/Ci0gICAqLwotICBib29sIGJpbmFyeV9pbmxpbmVfOwotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBhIFJFU1QgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgYm9vbCByZXN0XzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgc3R1YnMgZm9yIGEgUEhQIHNlcnZlcgotICAgKi8KLSAgYm9vbCBwaHBzXzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgUEhQIGNvZGUgdGhhdCB1c2VzIGF1dG9sb2FkCi0gICAqLwotICBib29sIGF1dG9sb2FkXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byB1c2UgT09QIGJhc2UgY2xhc3MgVEJhc2UKLSAgICovCi0gIGJvb2wgb29wXzsKLQotfTsKLQotCi1ib29sIHRfcGhwX2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwYXRoIjsKLX0KLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpKyIvIitwcm9ncmFtX25hbWVfKyIvIjsKLSAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8rcHJvZ3JhbV9uYW1lXysiX3R5cGVzLnBocCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgICI8P3BocCIgPDwgZW5kbCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGhwX2luY2x1ZGVzKCk7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHN0cmluZyBwYWNrYWdlID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHByZWZpeCA9IHBocF9wYXRoKGluY2x1ZGVzW2ldKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLyIgPDwgcHJlZml4IDw8ICIvIiA8PCBwYWNrYWdlIDw8ICJfdHlwZXMucGhwJzsiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXytwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLnBocCI7Ci0gICAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLSAgICBmX2NvbnN0c18gPDwKLSAgICAgICI8P3BocCIgPDwgZW5kbCA8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICJpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy8iICsgcGhwX3BhdGgocHJvZ3JhbV8pICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMucGhwJzsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTJ10gPSBhcnJheSgpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnO1xuXG4iKTsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBmX2NvbnN0c18gPDwgIj8+IiA8PCBlbmRsOwotICAgIGZfY29uc3RzXy5jbG9zZSgpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQSFAsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PAotICAgICIkR0xPQkFMU1snIiA8PCBwaHBfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCAiRV8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICInXSA9IGFycmF5KCIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgIiAgJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInID0+ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzXyA8PAotICAgICIpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgLy8gV2UncmUgYWxzbyBkb2luZyBpdCB0aGlzIHdheSB0byBzZWUgaG93IGl0IHBlcmZvcm1zLiBJdCdzIG1vcmUgbGVnaWJsZQotICAvLyBjb2RlIGJ1dCB5b3UgY2FuJ3QgZG8gdGhpbmdzIGxpa2UgYW4gJ2V4dHJhY3QnIG9uIGl0LCB3aGljaCBpcyBhIGJpdCBvZgotICAvLyBhIGRvd25lci4KLSAgZl90eXBlc18gPDwKLSAgICAiZmluYWwgY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiICAiIDw8IHZhbHVlIDw8ICIgPT4gJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX2NvbnN0c18gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFMnXVsnIiA8PCBuYW1lIDw8ICInXSA9ICI7Ci0gIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0gIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgewotICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8IicsIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8IiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgc3RydWN0IHNwZWNpZmljYXRpb24gc3RydWN0dXJlLCB3aGljaCBmdWxseSBxdWFsaWZpZXMgZW5vdWdoCi0gKiB0eXBlIGluZm9ybWF0aW9uIHRvIGdlbmVyYWxpemUgc2VyaWFsaXphdGlvbiByb3V0aW5lcy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldChzZWxmOjokX1RTUEVDKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInNlbGY6OiRfVFNQRUMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiICApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgaWYgKGF1dG9sb2FkXykgewotICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgICBvZnN0cmVhbSBhdXRvbG9hZF9vdXQ7Ci0gICAgc3RyaW5nIGZfc3RydWN0ID0gcHJvZ3JhbV9uYW1lXysiLiIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIucGhwIjsKLSAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXytmX3N0cnVjdDsKLSAgICBhdXRvbG9hZF9vdXQub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotICAgIGF1dG9sb2FkX291dCA8PCAiPD9waHAiIDw8IGVuZGw7Ci0gICAgX2dlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihhdXRvbG9hZF9vdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgYXV0b2xvYWRfb3V0IDw8IGVuZGwgPDwgIj8+IiA8PCBlbmRsOwotICAgIGF1dG9sb2FkX291dC5jbG9zZSgpOwotCi0gICAgZl90eXBlc18gPDwKLSAgICAgICIkR0xPQkFMU1snVEhSSUZUX0FVVE9MT0FEJ11bJyIgPDwgbG93ZXJjYXNlKHBocF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgKyB0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiJ10gPSAnIiA8PCBwcm9ncmFtX25hbWVfIDw8ICIvIiA8PCBmX3N0cnVjdCA8PCAiJzsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQSFAKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6X2dlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwKLSAgICAiY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiBleHRlbmRzIFRFeGNlcHRpb24iOwotICB9IGVsc2UgaWYgKG9vcF8pIHsKLSAgICBvdXQgPDwgIiBleHRlbmRzIFRCYXNlIjsKLSAgfQotICBvdXQgPDwKLSAgICAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgJF9UU1BFQzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSAibnVsbCI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHM9bnVsbCIgOiAiIjsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAob29wXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChpc3NldCgkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddKSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmaWQgPSAwOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgdF9maWVsZCBmZnR5cGUoZ190eXBlX2J5dGUsICJmdHlwZSIpOwotICAgICAgdF9maWVsZCBmZmlkKGdfdHlwZV9pMTYsICJmaWQiKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmdHlwZSk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7Ci0gICAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoICgkZmlkKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIGluZGVudChvdXQpIDw8ICAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9IFRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJiRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAob29wXykgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl93cml0ZSgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiR4ZmVyID0gMDsiIDw8IGVuZGw7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgZXhwZWN0OwotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZXhwZWN0ID0gImFycmF5IjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBleHBlY3QgPSAib2JqZWN0IjsKLSAgICB9Ci0gICAgaWYgKCFleHBlY3QuZW1wdHkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIWlzXyIgPDwgZXhwZWN0IDw8ICIoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB0eXBlIGluIHN0cnVjdHVyZS4nLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCBUVHlwZTo6U1RPUCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rc2VydmljZV9uYW1lXysiLnBocCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLyIgPDwgcGhwX3BhdGgocHJvZ3JhbV8pIDw8ICIvIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMucGhwJzsiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiA8PCBwaHBfcGF0aCh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkgPDwgIi8iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIucGhwJzsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGlmIChyZXN0XykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIH0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpZiAocGhwc18pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIH0KLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfYnl0ZSwgIm10eXBlIik7Ci0gICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmZm5hbWUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZm10eXBlLCAiIiwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZzZXFpZCwgIiIsIHRydWUpOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5za2lwKFRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCBUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKCRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKCIgPDwgcGhwX25hbWVzcGFjZSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCkpIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICQiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRvdXRwdXQgaW5zdGFuY2VvZiBUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJG91dHB1dCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAkcmVzdWx0LCAkc2VxaWQsICRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCBUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpICsgIlJlc3QiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJSZXN0IiA8PCBleHRlbmRzX2lmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGltcGxfOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbXBsKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmltcGxfID0gJGltcGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCRyZXF1ZXN0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBzdHJpbmcgY2FzdCA9IHR5cGVfdG9fY2FzdChhdHlwZSk7Ci0gICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0WyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiddIjsKLSAgICAgIGlmIChhdHlwZS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGNhc3QgPDwgIighZW1wdHkoIiA8PCByZXEgPDwgIikgJiYgKCIgPDwgcmVxIDw8ICIgIT09ICdmYWxzZScpKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gaXNzZXQoIiA8PCByZXEgPDwgIikgPyAiIDw8IGNhc3QgPDwgcmVxIDw8ICIgOiBudWxsOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHlwZS0+aXNfc3RyaW5nKCkgJiYKLSAgICAgICAgICAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGV4cGxvZGUoJywnLCAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfbWFwKCkgfHwgYXR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0ganNvbl9kZWNvZGUoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcnJheV9maWxsX2tleXMoanNvbl9kZWNvZGUoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpLCAxKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zdHJ1Y3QoKSB8fCBhdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZShhdHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgYXR5cGUtPmdldF9uYW1lKCkgPDwgIihqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICR0aGlzLT5pbXBsXy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBpZiAoYXV0b2xvYWRfKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICAgIG9mc3RyZWFtIGF1dG9sb2FkX291dDsKLSAgICBzdHJpbmcgZl9zdHJ1Y3QgPSBwcm9ncmFtX25hbWVfKyIuIisodHNlcnZpY2UtPmdldF9uYW1lKCkpKyIuY2xpZW50LnBocCI7Ci0gICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rZl9zdHJ1Y3Q7Ci0gICAgYXV0b2xvYWRfb3V0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLSAgICBhdXRvbG9hZF9vdXQgPDwgIjw/cGhwIiA8PCBlbmRsOwotICAgIF9nZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChhdXRvbG9hZF9vdXQsIHRzZXJ2aWNlKTsKLSAgICBhdXRvbG9hZF9vdXQgPDwgZW5kbCA8PCAiPz4iIDw8IGVuZGw7Ci0gICAgYXV0b2xvYWRfb3V0LmNsb3NlKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiJEdMT0JBTFNbJ1RIUklGVF9BVVRPTE9BRCddWyciIDw8IGxvd2VyY2FzZShzZXJ2aWNlX25hbWVfICsgIkNsaWVudCIpIDw8ICInXSA9ICciIDw8IHByb2dyYW1fbmFtZV8gPDwgIi8iIDw8IGZfc3RydWN0IDw8ICInOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIF9nZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpfZ2VuZXJhdGVfc2VydmljZV9jbGllbnQob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIG91dCA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHJpdmF0ZSBtZW1iZXJzCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGlucHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRvdXRwdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRzZXFpZF8gPSAwOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0PW51bGwpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmlucHV0XyA9ICRpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5vdXRwdXRfID0gJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+b3V0cHV0XyBpbnN0YW5jZW9mIFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCR0aGlzLT5vdXRwdXRfLCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICR0aGlzLT5zZXFpZF8sICR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkpOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8IFRNZXNzYWdlVHlwZTo6Q0FMTCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IGZ1bm5hbWUgPDwgIicpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgZnVubmFtZSA8PCAiJzsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OkNBTEwsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJHRoaXMtPmlucHV0XyBpbnN0YW5jZW9mIFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSIKLSAgICAgICAgICAgICAgICAgPDwgIiAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgJHJlc3VsdCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkdGhpcy0+aW5wdXRfLCAnIiA8PCByZXN1bHRuYW1lIDw8ICInLCAkdGhpcy0+aW5wdXRfLT5pc1N0cmljdFJlYWQoKSk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7Ci0gICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR2ZXIgPSB1bnBhY2soJ04nLCAkdGhpcy0+aW5wdXRfLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZlciA9ICR2ZXJbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcuJHZlciwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZm5hbWUsICIiLCB0cnVlKTsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93ICR4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPnN1Y2Nlc3MgIT09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJHJlc3VsdC0+c3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgRXhjZXB0aW9uKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIHsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGl0cmFucyA9IChpbmNsYXNzID8gIiR0aGlzLT5pbnB1dF8iIDogIiRpbnB1dCIpOwotCi0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgICAgICBuYW1lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRsZW4gPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoJGxlbik7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCduJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgyKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnTjInLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gMCAtICRhcnJbMV0qNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnZCcsIHN0cnJldigiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkYXJyWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICIkeGZlciArPSAkaW5wdXQtPiI7Ci0KLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgICAgIG5hbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIiA8PAotICAgICAgICAiJCIgPDwga3R5cGUgPDwgIiwgJCIgPDwgdnR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmV0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoJCIgPDwKLSAgICBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBrZXkgPDwgIl0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgc3RybGVuKCQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gJCIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04yJywgJCIgPDwgbmFtZSA8PCAiID4+IDMyLCAkIiA8PCBuYW1lIDw8ICIgJiAweEZGRkZGRkZGKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2QnLCAkIiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PAotICAgICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIgPDwgZW5kbDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgIiA8PAotICAgICAgIiQiIDw8IGtpdGVyIDw8ICIgPT4gJCIgPDwgdml0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiID0+ICR0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBhcnJheSgpIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogR2V0cyBhIHR5cGVjYXN0IHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fY2FzdCh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIGJ0eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOwotICAgIHN3aXRjaCAoYnR5cGUtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIihib29sKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICIoaW50KSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIihkb3VibGUpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiKHN0cmluZykiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiKGludCkiOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGU6OkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpNQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHBocCwgIlBIUCIsCi0iICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKLSIgICAgc2VydmVyOiAgICAgICAgICBHZW5lcmF0ZSBQSFAgc2VydmVyIHN0dWJzXG4iCi0iICAgIGF1dG9sb2FkOiAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggYXV0b2xvYWRcbiIKLSIgICAgb29wOiAgICAgICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBvYmplY3Qgb3JpZW50ZWQgc3ViY2xhc3Nlc1xuIgotIiAgICByZXN0OiAgICAgICAgICAgIEdlbmVyYXRlIFBIUCBSRVNUIHByb2Nlc3NvcnNcbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTk1MGYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9weV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibmV3X3N0eWxlIik7Ci0gICAgZ2VuX25ld3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0d2lzdGVkIik7Ci0gICAgZ2VuX3R3aXN0ZWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInV0ZjhzdHJpbmdzIik7Ci0gICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudHdpc3RlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBweV9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgcHlfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkKSB7Ci0gICAgaWYoZ2VuX3R3aXN0ZWQpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOwotICAgICAgaWYoIXR3aXN0ZWRfbW9kdWxlLmVtcHR5KCkpewotICAgICAgICByZXR1cm4gdHdpc3RlZF9tb2R1bGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweSIpOwotICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWxfbW9kdWxlOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuCi0gICAqLwotICBib29sIGdlbl9uZXdzdHlsZV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSBUd2lzdGVkLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KLSAgICovCi0gIGJvb2wgZ2VuX3R3aXN0ZWRfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiBzdHJpbmdzIHNob3VsZCBiZSBlbmNvZGVkIHVzaW5nIHV0Zi04LgotICAgKi8KLSAgYm9vbCBnZW5fdXRmOHN0cmluZ3NfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW1fLCBnZW5fdHdpc3RlZF8pOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgotICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgICBzdGQ6Om9mc3RyZWFtIGluaXRfcHkoKHBhY2thZ2VfZGlyXysiL19faW5pdF9fLnB5IikuY19zdHIoKSk7Ci0gICAgaW5pdF9weS5jbG9zZSgpOwotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgbW9kdWxlLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOwotICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcysxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyJ0dHlwZXMucHkiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrImNvbnN0YW50cy5weSI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfaW5pdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvX19pbml0X18ucHkiOwotICBvZnN0cmVhbSBmX2luaXQ7Ci0gIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOwotICBmX2luaXQgIDw8Ci0gICAgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKLSAgfQotICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7Ci0gIGZfaW5pdC5jbG9zZSgpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIDw8Ci0gICAgZW5kbCA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJmcm9tIHR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJpbXBvcnQgIiArIGdldF9yZWFsX3B5X21vZHVsZShpbmNsdWRlc1tpXSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuCi0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydFxuIgotICAgICJmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUUHJvdG9jb2xcbiIKLSAgICAidHJ5OlxuIgotICAgICIgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5XG4iCi0gICAgImV4Y2VwdDpcbiIKLSAgICAiICBmYXN0YmluYXJ5ID0gTm9uZVxuIjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiNcbiIpICsKLSAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCi0gICAgIiNcbiIgKwotICAgICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIjXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCAqIik7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFB5dGhvbiwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgIChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKSA8PAotICAgICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotCi0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLQotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCB2YWx1ZSA8PCAiOiBcIiIgPDwKLSAgICAgIGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOwotICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgIGluZGVudCgpIDw8IGluZGVudCgpIDw8ICciJyA8PCBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJcIjogIiA8PCB2YWx1ZSA8PCAnLCcgPDwgZW5kbDsKLSAgfQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKCoqeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgInNldCgiOwotICAgIH0KLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiXSI7Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIikiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gICh2b2lkKSBpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IHN0ZDo6ZW5kbCA8PAotICAgICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIihFeGNlcHRpb24pIjsKLSAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfKSB7Ci0gICAgb3V0IDw8ICIob2JqZWN0KSI7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLyoKLSAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKLSAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCi0gICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCi0gICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAotICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCi0gICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCi0KLSAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgKi8KLQotICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQotICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiciIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHR5cGVfdG9fc3BlY19hcmdzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgIiwgIgotICAgICAgICAgICAgPDwgIiksIgotICAgICAgICAgICAgPDwgIiAjICIgPDwgc29ydGVkX2tleXNfcG9zCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICBzb3J0ZWRfa2V5c19wb3MgKys7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9IE5vbmUiIDw8IGVuZGw7Ci0gIH0KLQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwiOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscwotICAgICAgb3V0IDw8ICIgIiA8PCBkZWNsYXJlX2FyZ3VtZW50KCptX2l0ZXIpIDw8ICIsIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIik6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBJbml0aWFsaXplIGZpZWxkcwotICAgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpICYmICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PAotICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl1bNF06IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCi0gIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KLSAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX3N0cl9fKHNlbGYpOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAotICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCi0gICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgIgotICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKLSAgICAiYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgIgotICAgICJhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIihmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZWxpZiAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgICIgIGlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAiYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5vbmU6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZShzZWxmKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgIiA8PAotICAgICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIi5weSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImltcG9ydCAiIDw8IGdldF9yZWFsX3B5X21vZHVsZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSwgZ2VuX3R3aXN0ZWRfKSA8PAotICAgICAgIi4iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvciIgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IEludGVyZmFjZSwgaW1wbGVtZW50cyIgPDwgZW5kbCA8PAotICAgICAgImZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIiIDw8IGVuZGwgPDwKLSAgICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKLSAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgZ2VuX25ld3N0eWxlXykgewotICAgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3Q9Tm9uZSk6IiA8PCBlbmRsOwotICB9Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIG9wcm90ICE9IE5vbmU6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgc2VsZi5fb3Byb3QgPSBvcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fc2VxaWQgKz0gMSIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiZCA9IHNlbGYuX3JlcXNbc2VsZi5fc2VxaWRdID0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAic2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICAgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKSIKLSAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICAgIihzZWxmLCBpcHJvdCwgbXR5cGUsIHJzZXFpZCk6IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IHNlbGYuX2lwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOwotCi0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2soeCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoc2VsZi5faXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJhaXNlIHgiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChzZWxmLl9pcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LnN1Y2Nlc3MgIT0gTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2socmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyItcmVtb3RlIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7Ci0gIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKLQotICBmX3JlbW90ZSA8PAotICAgICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBzeXMiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwKLSAgICAiaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQgJyciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXSciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHByaW50ICdGdW5jdGlvbnM6JyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgIiAgcHJpbnQgJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3JlbW90ZSA8PAotICAgICAgICBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSciIDw8IGVuZGw7Ci0gIH0KLSAgZl9yZW1vdGUgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHN5cy5leGl0KDApIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudCA9IDIpIiA8PCBlbmRsIDw8Ci0gICAgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbCA8PAotICAgICJwb3J0ID0gOTA5MCIgPDwgZW5kbCA8PAotICAgICJ1cmkgPSAnJyIgPDwgZW5kbCA8PAotICAgICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbCA8PAotICAgICJodHRwID0gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAiYXJnaSA9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcGFydHMgPSBzeXMuYXJndlthcmdpKzFdLnNwbGl0KCc6JykiIDw8IGVuZGwgPDwKLSAgICAiICBob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwgPDwKLSAgICAiICBwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbCA8PAotICAgICIgIGFyZ2kgKz0gMiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy11JzoiIDw8IGVuZGwgPDwKLSAgICAiICB1cmwgPSB1cmxwYXJzZShzeXMuYXJndlthcmdpKzFdKSIgPDwgZW5kbCA8PAotICAgICIgIHBhcnRzID0gdXJsWzFdLnNwbGl0KCc6JykiIDw8IGVuZGwgPDwKLSAgICAiICBob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwgPDwKLSAgICAiICBpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsIDw8Ci0gICAgIiAgZWxzZToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHBvcnQgPSA4MCIgPDwgZW5kbCA8PAotICAgICIgIHVyaSA9IHVybFsyXSIgPDwgZW5kbCA8PAotICAgICIgIGlmIHVybFs0XToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHVyaSArPSAnPyVzJyAlIHVybFs0XSIgPDwgZW5kbCA8PAotICAgICIgIGh0dHAgPSBUcnVlIiA8PCBlbmRsIDw8Ci0gICAgIiAgYXJnaSArPSAyIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWYnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctZnJhbWVkJzoiIDw8IGVuZGwgPDwKLSAgICAiICBmcmFtZWQgPSBUcnVlIiA8PCBlbmRsIDw8Ci0gICAgIiAgYXJnaSArPSAxIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJjbWQgPSBzeXMuYXJndlthcmdpXSIgPDwgZW5kbCA8PAotICAgICJhcmdzID0gc3lzLmFyZ3ZbYXJnaSsxOl0iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIGh0dHA6IiA8PCBlbmRsIDw8Ci0gICAgIiAgdHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQoaG9zdCwgcG9ydCwgdXJpKSIgPDwgZW5kbCA8PAotICAgICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChob3N0LCBwb3J0KSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGZyYW1lZDoiIDw8IGVuZGwgPDwKLSAgICAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgZWxzZToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwgPDwKLSAgICAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkiIDw8IGVuZGwgPDwKLSAgICAiY2xpZW50ID0gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuQ2xpZW50KHByb3RvY29sKSIgPDwgZW5kbCA8PAotICAgICJ0cmFuc3BvcnQub3BlbigpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9yZW1vdGUgPDwgImVsIjsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICBpbnQgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLQotICAgIGZfcmVtb3RlIDw8Ci0gICAgICAiaWYgY21kID09ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzoiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIGxlbihhcmdzKSAhPSAiIDw8IG51bV9hcmdzIDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIHByaW50ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzJyIgPDwgZW5kbCA8PAotICAgICAgIiAgICBzeXMuZXhpdCgxKSIgPDwgZW5kbCA8PAotICAgICAgIiAgcHAucHByaW50KGNsaWVudC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgImFyZ3NbIiA8PCBpIDw8ICJdLCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCAiZXZhbChhcmdzWyIgPDwgaSA8PCAiXSksIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOwotCi0gICAgZl9yZW1vdGUgPDwgZW5kbDsKLSAgfQotICBmX3JlbW90ZSA8PCAiZWxzZToiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8ICIgIHByaW50ICdVbnJlY29nbml6ZWQgbWV0aG9kICVzJyAlIGNtZCIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgIiAgc3lzLmV4aXQoMSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0gIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAotICAgICAgICAgIFNfSVJVU1IKLSAgICAgICAgfCBTX0lXVVNSCi0gICAgICAgIHwgU19JWFVTUgotI2lmbmRlZiBNSU5HVwotICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgfCBTX0lYR1JQCi0gICAgICAgIHwgU19JUk9USAotICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICApOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGwgPDwKLSAgICAgICIgIGltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBuYW1lIG5vdCBpbiBzZWxmLl9wcm9jZXNzTWFwOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJXMnICUgKG5hbWUpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZCA9IGRlZmVyLm1heWJlRGVmZXJyZWQoc2VsZi5faGFuZGxlci4iIDw8Ci0gICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImQuYWRkQ2FsbGJhY2soc2VsZi53cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PAotICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0KLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgICAiZC5hZGRFcnJiYWNrKHNlbGYud3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PAotICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gc3VjY2VzcyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotCi0gICAgICAvLyBLaW5kYSBhYnN1cmQKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0KLSAgICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgKHZvaWQpIGluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpIHx8ICFnZW5fdXRmOHN0cmluZ3NfKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkgIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBzZXQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgIiA8PCBpIDw8ICIgaW4geHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hcHBlbmQoIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgfHwgIWdlbl91dGY4c3RyaW5nc18pIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIi5lbmNvZGUoJ3V0Zi04JykpIjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpIiA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgIHRkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKLSAgYm9vbCBoYXNfZG9jID0gZmFsc2U7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGlmIChoYXNfZG9jKSB7Ci0gICAgICBzcyA8PCBlbmRsOwotICAgIH0KLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICIgLSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3MgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoaGFzX2RvYykgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICJcIlwiXCJcbiIsCi0gICAgICAiIiwgc3Muc3RyKCksCi0gICAgICAiXCJcIlwiXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiXCJcIlwiXG4iLAotICAgICAgIiIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICJcIlwiXCJcbiIpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYW4gYXJndW1lbnQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIHJlc3VsdCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIj0iOwotICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgcmVzdWx0IDw8ICJ0aHJpZnRfc3BlY1siIDw8Ci0gICAgICB0ZmllbGQtPmdldF9rZXkoKSA8PCAiXVs0XSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0IDw8ICJOb25lIjsKLSAgfQotICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBkZWZhdWx0IHZhbHVlLCByZXR1cm5zIE5vbmUgb3RoZXJ3aXNlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKHNlbGYsICIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbiBpbnRlcmZhY2UgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7Ci0gIGlmICghZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgc2lnbmF0dXJlICs9ICJzZWxmLCAiOwotICB9Ci0gIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci0gIHJldHVybiBzaWduYXR1cmU7Ci19Ci0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfKSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiKCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgIikiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocHksICJQeXRob24iLAotIiAgICBuZXdfc3R5bGU6ICAgICAgIEdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLlxuIiBcCi0iICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRiMjlhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcmJfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXJiIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAgICAgICh0X3N0cnVjdCogICB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZWZucyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGF0YSAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiBmaWVsZF90eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUsIGJvb2wgb3B0aW9uYWwpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9yZG9jICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHJiX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcnVieV9tb2R1bGVzKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicmIiKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlczsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG1vZHVsZXM7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIHBvcyA9IG5zLmJlZ2luKCk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBkZWxpbSA9IHN0ZDo6ZmluZChwb3MsIG5zLmVuZCgpLCAnLicpOwotICAgICAgbW9kdWxlcy5wdXNoX2JhY2soY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyhwb3MsIGRlbGltKSkpOwotICAgICAgcG9zID0gZGVsaW07Ci0gICAgICBpZiAocG9zID09IG5zLmVuZCgpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytwb3M7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZXM7Ci0gIH0KLQotICB2b2lkIGJlZ2luX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKLSAgdm9pZCBlbmRfbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSsiX3R5cGVzLnJiIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3VuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykrIl9jb25zdGFudHMucmIiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICJyZXF1aXJlICciIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICAgIGJlZ2luX25hbWVzcGFjZShmX2NvbnN0c18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotCi19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzJ1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiI1xuIjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKLSAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAotICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCi0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9yZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotICAKLSAgLy8gQ3JlYXRlIGEgaGFzaCBtYXBwaW5nIHZhbHVlcyBiYWNrIHRvIHRoZWlyIG5hbWVzIChhcyBzdHJpbmdzKSBzaW5jZSBydWJ5IGhhcyBubyBuYXRpdmUgZW51bSB0eXBlCi0gIGluZGVudChmX3R5cGVzXykgPDwgIlZBTFVFX01BUCA9IHsiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIC8vIFBvcHVsYXRlIHRoZSBoYXNoCi0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmaXJzdCA/IGZpcnN0ID0gZmFsc2UgOiBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IHZhbHVlIDw8ICIgPT4gXCIiIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIiOwotICB9Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiVkFMSURfVkFMVUVTID0gU2V0Lm5ldyhbIjsKLSAgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIC8vIFBvcHVsYXRlIHRoZSBzZXQKLSAgICBmaXJzdCA/IGZpcnN0ID0gZmFsc2UgOiBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwKLSAgICAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICIlcVwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IGZ1bGxfdHlwZV9uYW1lKHR5cGUpIDw8ICIubmV3KHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIlNldC5uZXcoWyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl0pIjsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl0iOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0Ci0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX3JiX3VuaW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0LCA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICI6OlRocmlmdDo6U3RydWN0LmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1YnkgdW5pb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICAodm9pZCkgaXNfZXhjZXB0aW9uOwotICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmICIgPDwgZmllbGRfbmFtZSA8PCAiKHZhbCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICB9Ci0gIAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDEpIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJkZWYgaW5pdGlhbGl6ZShtZXNzYWdlPW5pbCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuIiA8PCBuYW1lIDw8ICIgPSBtZXNzYWdlIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgaWYgKG5hbWUgIT0gIm1lc3NhZ2UiKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJkZWYgbWVzc2FnZTsgIiA8PCBuYW1lIDw8ICIgZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX2ZpZWxkX25hbWUgPSB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8IGNhcF9maWVsZF9uYW1lIDw8ICIgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RlZm5zKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gZ2VuZXJhdGUgdGhlIGZpZWxkIGRvY3N0cmluZ3Mgd2l0aGluIHRoZSBGSUVMRFMgY29uc3RhbnQuIG5vIHJlYWwgYmV0dGVyIHBsYWNlLi4uCi0gICAgZ2VuZXJhdGVfcmRvYyhvdXQsICpmX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0+ICI7Ci0KLSAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmZfaXRlciktPmdldF9uYW1lKCksICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCksIAotICAgICAgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmIHN0cnVjdF9maWVsZHM7IEZJRUxEUzsgZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiBmaWVsZF90eXBlLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lID0gIiIsIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlID0gTlVMTCwgYm9vbCBvcHRpb25hbCA9IGZhbHNlKSB7Ci0gIGZpZWxkX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkX3R5cGUpOwotCi0gIC8vIEJlZ2luIHRoaXMgZmllbGQncyBkZWZuCi0gIG91dCA8PCAiezp0eXBlID0+ICIgPDwgdHlwZV90b19lbnVtKGZpZWxkX3R5cGUpOwotCi0gIGlmICghZmllbGRfbmFtZS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICIsIDpuYW1lID0+ICciIDw8IGZpZWxkX25hbWUgPDwgIiciOwotICB9Ci0KLSAgaWYgKGZpZWxkX3ZhbHVlICE9IE5VTEwpIHsKLSAgICBvdXQgPDwgIiwgOmRlZmF1bHQgPT4gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOwotICB9Ci0KLSAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKLSAgICB9Ci0gIH0KLSAgCi0gIGlmKG9wdGlvbmFsKSB7Ci0gICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKLSAgfQotCi0gIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKLSAgfQotCi0gIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIn0iOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJtb2R1bGUgIiA8PCAqbV9pdGVyIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6ZW5kX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcykgewotICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46OnJldmVyc2VfaXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5yYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMucmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSsiLnJiIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgInJlcXVpcmUgJ3RocmlmdCciIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAicmVxdWlyZSAnIiA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicmVxdWlyZSAnIiA8PCB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMnIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBiZWdpbl9uYW1lc3BhY2UoZl9zZXJ2aWNlXywgcnVieV9tb2R1bGVzKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgdHMpOwotICAgIGdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCAmcmVzdWx0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGZ1bGxfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgPCAiICsgZXh0ZW5kcyArICI6OkNsaWVudCAiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImluY2x1ZGUgOjpUaHJpZnQ6OkNsaWVudCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kX21lc3NhZ2UoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9IHJlY2VpdmVfbWVzc2FnZSgiIDw8IHJlc3VsdG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyB1bmxlc3MgcmVzdWx0LnN1Y2Nlc3MubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJhaXNlIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgIiB1bmxlc3MgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpQcm9jZXNzb3IiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgIihzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzID0gcmVhZF9hcmdzKGlwcm90LCAiIDw8IGFyZ3NuYW1lIDw8ICIpIiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLm5ldygpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIkBoYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXNjdWUgIiA8PCBmdWxsX3R5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgPT4gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIndyaXRlX3Jlc3VsdChyZXN1bHQsIG9wcm90LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIHNlcWlkKSIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKCIgKyAgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIHJldHVybiBwcmVmaXggKyBuYW1lOwotfQotCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMgPSBydWJ5X21vZHVsZXModHR5cGUtPmdldF9wcm9ncmFtKCkpOwotICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsKLSAgICAgICBtX2l0ZXIgIT0gbW9kdWxlcy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBwcmVmaXggKz0gKm1faXRlciArICI6OiI7Ci0gIH0KLSAgcmV0dXJuIHByZWZpeCArIHR5cGVfbmFtZSh0dHlwZSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBSdWJ5IHR5b2UKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIiLCAiIyAiLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ1JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSI7Ci0gICAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jvb2woKSkgewotICAgICAgICBvdXQgPDwgIiBpZiBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIgdW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKXsgICAgICAKLSAgICAgIGluZGVudChvdXQpIDw8ICJ1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IHx8ICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAnSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykiIDw8IGVuZGw7ICAKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJyYWlzZShTdGFuZGFyZEVycm9yLCAnVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LicpIGlmIGdldF9zZXRfZmllbGQubmlsPyB8fCBnZXRfdmFsdWUubmlsPyIgPDwgZW5kbDsKLQotICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGNvbnN0IHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpeyAgICAgIAotICAgICAgaW5kZW50KG91dCkgPDwgImlmIGdldF9zZXRfZmllbGQgPT0gOiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAnSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhnZXRfdmFsdWUpIiA8PCBlbmRsOyAgCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihyYiwgIlJ1YnkiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYTM3MDEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFNtYWxsdGFsayBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfc3RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3N0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uICgpOwotICB2b2lkIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cyAoKTsKLQotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHN0ZDo6c3RyaW5nIG1hcF9yZWFkZXIgKHRfbWFwICp0bWFwKTsKLSAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIgKHRfbGlzdCAqdGxpc3QpOwotICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyICh0X3NldCAqdHNldCk7Ci0gIHN0ZDo6c3RyaW5nIHN0cnVjdF9yZWFkZXIgKHRfc3RydWN0ICp0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyICh0X21hcCAqdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyICh0X2xpc3QgKnRsaXN0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc2V0X3dyaXRlciAodF9zZXQgKnRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyICh0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotCi0gIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCAodF90eXBlICp0LCBzdGQ6OnN0cmluZyBmbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlYWRfdmFsICh0X3R5cGUgKnQpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKLQotICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKLSAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOwotICB2b2lkIHN0X2dldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7Ci0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0gIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7Ci0gIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgaW50IHRlbXBvcmFyeV92YXI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHRlbXBvcmFyeV92YXIgPSAwOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkrIi8iK3Byb2dyYW1fbmFtZV8rIi5zdCI7Ci0gIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7Ci0gIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOwotCi0gIC8vR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci19Ci0KLWJvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7Ci0gIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7Ci0gIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgewotICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiJyIpICsKLSAgICAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICJcbiIgKwotICAgICJETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiJyFcbiI7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpIHsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwKLSAgICBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwKLSAgICBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKTsKLSAgZl8uY2xvc2UoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZWRfY2F0ZWdvcnkoKSB7Ci0gIHN0cmluZyBjYXQgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLmNhdGVnb3J5Iik7Ci0gIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFRocmlmdCBncmFtbWFyLCB0aGUgY2F0ZWdvcnkgbXVzdAotICAvLyBiZSBwdW5jdHVhdGVkIGJ5IGRvdHMuICBSZXBsYWNlcyB0aGVtIHdpdGggZGFzaGVzIGhlcmUuCi0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gY2F0LmJlZ2luKCk7IGl0ZXIgIT0gY2F0LmVuZCgpOyArK2l0ZXIpIHsKLSAgICBpZiAoKml0ZXIgPT0gJy4nKSB7Ci0gICAgICAqaXRlciA9ICctJzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNhdC5zaXplKCkgPyBjYXQgOiAiR2VuZXJhdGVkLSIgKyBjbGFzc19uYW1lKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBTbWFsbHRhbGssIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIG5hbWUpIHsKLSAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNsYXNzVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicG9vbERpY3Rpb25hcmllczogJyciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCBjYXRlZ29yeSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKLSAgY2hhciB0aW1lc3RyWzUwXTsKLSAgdGltZV90IHJhd3RpbWU7Ci0gIHN0cnVjdCB0bSAqdGluZm87Ci0KLSAgdGltZSgmcmF3dGltZSk7Ci0gIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKLSAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKLQotICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8Ci0gICAgIiBtZXRob2RzRm9yOiAnIitjYXRlZ29yeSsiJyBzdGFtcDogJ3RocmlmdCAiIDw8IHRpbWVzdHIgPDwgIichXG4iIDw8Ci0gICAgbmFtZSA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2Nsb3NlX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQpIHsKLSAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiOiAiICsgdHlwZSk7Ci0gIG91dCA8PCBuYW1lIDw8ICIgOj0gIiArIHR5cGU7Ci0gIHN0X2Nsb3NlX21ldGhvZChvdXQpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiIik7Ci0gIG91dCA8PCAiXiAiIDw8IG5hbWU7Ci0gIHN0X2Nsb3NlX21ldGhvZChvdXQpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9hY2Nlc3NvcnMoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7Ci0gIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7Ci0gIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PAotICAgICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJ2NvbnN0YW50cyBlbnVtcychIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImVudW1zIik7Ci0gIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJjb25zdGFudHMiKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zOiBEaWN0aW9uYXJ5IG5ldyEiIDw8IGVuZGw7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzOiBEaWN0aW9uYXJ5IG5ldyEiIDw8IGVuZGw7Ci0KLSAgZl8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIGNsc19uYW1lID0gcHJvZ3JhbV9uYW1lXyArIGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMgYXQ6ICciIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogWyIgPDwKLSAgICAiKERpY3Rpb25hcnkgbmV3ICIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmXyA8PCAiXHRhdDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8ICJcdHlvdXJzZWxmKV0hIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiAnIiA8PCBuYW1lIDw8ICInIHB1dDogWyIgPDwKLSAgICByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIigiIDw8IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiBuZXcgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICI6ICIgPDwKLSAgICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiBwdXQ6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0Ci0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGlmIChpc19leGNlcHRpb24pCi0gICAgb3V0IDw8ICJFcnJvciI7Ci0gIGVsc2UKLSAgICBvdXQgPDwgIk9iamVjdCI7Ci0KLSAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwKLSAgICAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICciOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuYmVnaW4oKSkgb3V0IDw8ICIgIjsKLSAgICAgIG91dCA8PCBjYW1lbGNhc2UoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgIidcbiIgPDwKLSAgICAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iIDw8Ci0gICAgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIgPDwKLSAgICAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7Ci0KLSAgZ2VuZXJhdGVfYWNjZXNzb3JzKG91dCwgdHN0cnVjdCk7Ci19Ci0KLWJvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3Zvd2VsKGNoYXIgYykgewotICBzd2l0Y2godG9sb3dlcihjKSkgewotICAgIGNhc2UgJ2EnOiBjYXNlICdlJzogY2FzZSAnaSc6IGNhc2UgJ28nOiBjYXNlICd1JzoKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQotICAgIHByZWZpeCA9ICJhbiI7Ci0gIGVsc2UKLSAgICBwcmVmaXggPSAiYSI7Ci0KLSAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHR5cGU7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0X2FjY2Vzc29ycyhvdXQsCi0gICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHN0cnVjdCkpLAotICAgICAgICAgICAgICAgICAgIGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgIGFfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICAvLyBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dGVtcF9uYW1lKCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBvdXQgPDwgInRlbXAiIDw8IHRlbXBvcmFyeV92YXIrKzsKLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfd3JpdGVyKHRfbWFwICp0bWFwLCBzdHJpbmcgZm5hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGtleSA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVNYXBCZWdpbjogKFRNYXAgbmV3IGtleVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF9rZXlfdHlwZSgpKSA8PAotICAgICI7IHZhbHVlVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X3ZhbF90eXBlKCkpIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGtleXNBbmRWYWx1ZXNEbzogWzoiIDw8IGtleSA8PCAiIDoiIDw8IHZhbCA8PCAiIHwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZU1hcEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3JlYWRlcih0X21hcCAqdG1hcCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTWFwQmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gRGljdGlvbmFyeSBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhdDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgPDwKLSAgICAiIHB1dDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkTWFwRW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF93cml0ZXIodF9saXN0ICp0bGlzdCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZUxpc3RCZWdpbjogKFRMaXN0IG5ldyBlbGVtVHlwZTogIiA8PAotICAgIHR5cGVfdG9fZW51bSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBkbzogWzoiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUxpc3RFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3RfcmVhZGVyKHRfbGlzdCAqdGxpc3QpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTGlzdEJlZ2luLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90IHJlYWRMaXN0RW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3dyaXRlcih0X3NldCAqdHNldCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVNldEJlZ2luOiAoVFNldCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgPDwKLSAgICAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBkbzogWzoiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU2V0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfcmVhZGVyKHRfc2V0ICp0c2V0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZFNldEJlZ2luLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IFNldCBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTZXRFbmQuIiA8PCBlbmRsIDw8Ci0gIGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgc25hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlU3RydWN0QmVnaW46ICIgPDwKLSAgICAiKFRTdHJ1Y3QgbmV3IG5hbWU6ICciICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArIicpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBib29sIG9wdGlvbmFsID0gKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIGFjY2Vzc29yID0gc25hbWUgKyAiICIgKyBjYW1lbGNhc2UoZm5hbWUpOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzb3IgPDwgIiBpZk5vdE5pbDogWyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZSA8PAotICAgICAgIic7IHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PAotICAgICAgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBhY2Nlc3NvcikgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kIjsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8ICJdIjsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIuIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyBjbHNOYW1lID0gIiIpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIGZvdW5kID0gdGVtcF9uYW1lKCk7Ci0KLSAgaWYgKGNsc05hbWUuc2l6ZSgpID09IDApIHsKLSAgICBjbHNOYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy9UaGlzIGlzIG5hc3R5LCBidXQgd2l0aG91dCBpdCB3ZSdsbCBicmVhayB0aGluZ3MgYnkgcHJlZml4aW5nIFRSZXN1bHQuCi0gIHN0cmluZyBuYW1lID0gKChjYXBpdGFsaXplKGNsc05hbWUpID09ICJUUmVzdWx0IikgPyBjYXBpdGFsaXplKGNsc05hbWUpIDogcHJlZml4KGNsc05hbWUpKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9ICIgPDwgbmFtZSA8PCAiIG5ldy4iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU3RydWN0QmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlsiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkRmllbGRCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgdHlwZSA9IFRUeXBlIHN0b3BdIHdoaWxlRmFsc2U6IFt8IiA8PCBmb3VuZCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIGlkID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8Ci0gICAgICAiIGlmVHJ1ZTogWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIDo9IHRydWUuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB2YWwgPDwgIiAiIDw8IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PAotICAgICAgcmVhZF92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwgIl0uIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZvdW5kIDw8ICIgaWZOaWw6IFtpcHJvdCBza2lwOiAiIDw8IGRlc2MgPDwgIiB0eXBlXV0uIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZFN0cnVjdEVuZC4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6d3JpdGVfdmFsKHRfdHlwZSAqdCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOwotCi0gIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKikgdCktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlRG91YmxlOiAiICsgZm5hbWUgKyAiIGFzRmxvYXQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOwotICAgIH0KLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHN0cnVjdF93cml0ZXIoKHRfc3RydWN0KikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiBsaXN0X3dyaXRlcigodF9saXN0KikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0KikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaXByb3Qgd3JpdGVJMzI6ICIgKyBmbmFtZTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKLSAgfQotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlYWRfdmFsKHRfdHlwZSAqdCkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHJlYWQiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuIG1hcF9yZWFkZXIoKHRfbWFwKikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBzdHJ1Y3RfcmVhZGVyKCh0X3N0cnVjdCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0KikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gc2V0X3JlYWRlcigodF9zZXQqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHJlYWRJMzIiOwotICB9IGVsc2UgewotICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byByZWFkIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7Ci0gIH0KLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VuZF9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSBmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZShmdW5jdGlvbik7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotCi0gIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInNlbmQiICsgY2FwaXRhbGl6ZShzaWduYXR1cmUpKTsKLSAgZl8gPDwgIm9wcm90IHdyaXRlTWVzc2FnZUJlZ2luOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIihUQ2FsbE1lc3NhZ2UgbmV3IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAibmFtZTogJyIgPDwgZnVubmFtZSA8PCAiJzsgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNlcWlkOiBzZWxmIG5leHRTZXFpZCkuIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiIDw8Ci0gICAgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKLQotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZSA8PAotICAgICAgIic7IHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PAotICAgICAgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7Ci0KLSAgICBmXyA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGZuYW1lKSA8PCAiLiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOwotICB9Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7Ci0KLSAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLX0KLQotLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLQotICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKLSAgICB0X2ZpZWxkICpleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOwotICB9Ci0KLSAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKLSAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm1zZyA6PSBvcHJvdCByZWFkTWVzc2FnZUJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZWxmIHZhbGlkYXRlUmVtb3RlTWVzc2FnZTogbXNnLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRNZXNzYWdlRW5kLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2guIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIl4gcmVzIjsKLSAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGZuLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJcIiI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKGZfaXRlciArIDEpICE9IGZpZWxkcy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICJcIiI7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIlRDbGllbnQiOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICJDbGllbnQiOwotICB9Ci0KLSAgZl8gPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBzdWJjbGFzczogIyIgPDwgcHJlZml4KGNsaWVudF9jbGFzc19uYW1lKCkpIDw8IGVuZGwgPDwKLSAgICAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdHBvb2xEaWN0aW9uYXJpZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOwotCi0gICAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCBzaWduYXR1cmUpOwotICAgIGZfIDw8IGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQoKmZfaXRlcikgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInNlbGYgc2VuZCIgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBzdF9jbG9zZV9tZXRob2QoZl8pOwotCi0gICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZSBieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUgaTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUgaTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUgZG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBpMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIHN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIG1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIHNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHN0LCAiU21hbGx0YWxrIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2VjNzAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfeHNkX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhzZCI7Ci0gIH0KLQotICB2aXJ0dWFsIH50X3hzZF9nZW5lcmF0b3IoKSB7fQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gICAgKHZvaWQpIHRlbnVtOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgZ2VuZXJhdGVfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9zdHJ1Y3QqIGF0dHJzPU5VTEwsIGJvb2wgb3B0aW9uYWw9ZmFsc2UsIGJvb2wgbmlsbGFibGU9ZmFsc2UsIGJvb2wgbGlzdF9lbGVtZW50PWZhbHNlKTsKLQotICBzdGQ6OnN0cmluZyBucyhzdGQ6OnN0cmluZyBpbiwgc3RkOjpzdHJpbmcgbnMpIHsKLSAgICByZXR1cm4gbnMgKyAiOiIgKyBpbjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHhzZChzdGQ6OnN0cmluZyBpbikgewotICAgIHJldHVybiBucyhpbiwgInhzZCIpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKLQotICAvKioKLSAgICogT3V0cHV0IHhzZC9waHAgZmlsZQotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3hzZF87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9waHBfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgc3RyaW5nIHN0cmVhbQotICAgKi8KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfeHNkX3R5cGVzXzsKLQotfTsKLQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfcGhwX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fLT5nZXRfbmFtZSgpKyJfeHNkLnBocCI7Ci0gIGZfcGhwXy5vcGVuKGZfcGhwX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9waHBfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIGZfcGhwXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfcGhwXy5jbG9zZSgpOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPVwiIiA8PCB0dHlwZWRlZi0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZ19lbnVtKCkpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7Ci0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICAgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8L3hzZDpyZXN0cmljdGlvbj4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjwveHNkOnNpbXBsZVR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgYm9vbCB4c2RfYWxsID0gdHN0cnVjdC0+Z2V0X3hzZF9hbGwoKTsKLQotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmFsbD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KHNfeHNkX3R5cGVzXywgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3hzZF9hdHRycygpLCAoKm1faXRlciktPmdldF94c2Rfb3B0aW9uYWwoKSB8fCB4c2RfYWxsLCAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpZiAoeHNkX2FsbCkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCkgewotICBzdHJpbmcgc21pbk9jY3VycyA9IChvcHRpb25hbCB8fCBsaXN0X2VsZW1lbnQpID8gIiBtaW5PY2N1cnM9XCIwXCIiIDogIiI7Ci0gIHN0cmluZyBzbWF4T2NjdXJzID0gbGlzdF9lbGVtZW50ID8gIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiIgOiAiIjsKLSAgc3RyaW5nIHNvcHRpb25hbCA9IHNtaW5PY2N1cnMgKyBzbWF4T2NjdXJzOwotICBzdHJpbmcgc25pbGxhYmxlID0gbmlsbGFibGUgPyAiIG5pbGxhYmxlPVwidHJ1ZVwiIiA6ICIiOwotCi0gIGlmICh0dHlwZS0+aXNfdm9pZCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAoYXR0cnMgPT0gTlVMTCAmJiB0dHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDpjb21wbGV4VHlwZSAvPiIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCI+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgc3RyaW5nIHN1Ym5hbWU7Ci0gICAgICAgIHRfdHlwZSogc3VidHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgaWYgKHN1YnR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHN1YnR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgc3VibmFtZSA9IG5hbWUgKyAiX2VsdCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3VibmFtZSA9IHR5cGVfbmFtZShzdWJ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBmX3BocF8gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICJfeHNkX2VsdF8iIDw8IG5hbWUgPDwgIiddID0gJyIgPDwgc3VibmFtZSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2VsZW1lbnQob3V0LCBzdWJuYW1lLCBzdWJ0eXBlLCBOVUxMLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cImxpc3RcIiB0eXBlPVwieHNkOmJvb2xlYW5cIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRycyAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChhdHRycyA9PSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCAiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICIgLz4iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdvdywgYWxsIHRoaXMgd29yayBmb3IgYSBTSU1QTEUgVFlQRSB3aXRoIGF0dHJpYnV0ZXM/IT8hPyEKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfeHNkX25hbWUgPSBnZXRfb3V0X2RpcigpK3RzZXJ2aWNlLT5nZXRfbmFtZSgpKyIueHNkIjsKLSAgZl94c2RfLm9wZW4oZl94c2RfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgbnMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgieHNkIik7Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgbnMgPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBucyArICJcIiB4bWxucz1cIiIgKyBucyArICJcIiAiICsKLSAgICAgICJlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIiI7Ci0gIH0KLQotICAvLyBQcmludCB0aGUgWFNEIGhlYWRlcgotICBmX3hzZF8gPDwKLSAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PiIgPDwgZW5kbCA8PAotICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIiA8PCBucyA8PCAiPiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiPCEtLSBZbyB5byB5bywgdGhpcyBYU0Qgd296IGJlIGdlbmVyYXRlZCBieSBUaHJpZnQuIC0tPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUHJpbnQgb3V0IHRoZSB0eXBlIGRlZmluaXRpb25zCi0gIGluZGVudChmX3hzZF8pIDw8IHNfeHNkX3R5cGVzXy5zdHIoKTsKLQotICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhhdCBtaWdodCBnZXQgdGhyb3duCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj4gYWxsX3hjZXB0aW9uczsKLQotICAvLyBMaXN0IHRoZSBlbGVtZW50cyB0aGF0IHlvdSBtaWdodCBhY3R1YWxseSBnZXQKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGVsZW1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXNwb25zZSI7Ci0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBlbGVtbmFtZSwgcmV0dXJudHlwZSk7Ci0gICAgZl94c2RfIDw8IGVuZGw7Ci0KLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgYWxsX3hjZXB0aW9uc1soKnhfaXRlciktPmdldF9uYW1lKCldID0gKHRfc3RydWN0KikoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBheF9pdGVyOwotICBmb3IgKGF4X2l0ZXIgPSBhbGxfeGNlcHRpb25zLmJlZ2luKCk7IGF4X2l0ZXIgIT0gYWxsX3hjZXB0aW9ucy5lbmQoKTsgKytheF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGF4X2l0ZXItPmZpcnN0LCBheF9pdGVyLT5zZWNvbmQpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIFhTRCBkb2N1bWVudAotICBmX3hzZF8gPDwgZW5kbCA8PCAiPC94c2Q6c2NoZW1hPiIgPDwgZW5kbDsKLSAgZl94c2RfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiB4c2QoYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB4c2QoImludCIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiAiY29udGFpbmVyIjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBYU0QgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHJldHVybiBFeHBsaWNpdCBYU0QgdHlwZSwgaS5lLiB4c2Q6c3RyaW5nCi0gKi8KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiYnl0ZSI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAic2hvcnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAibG9uZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZGVjaW1hbCI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjA0MTQzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2xvYmFscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dMT0JBTFNfSAotI2RlZmluZSBUX0dMT0JBTFNfSAotCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qKgotICogVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIChzbGFwIG9uIHRoZSB3cmlzdCkgdGhhdCBhcmUKLSAqIHNoYXJlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGZhY2lsaXRhdGUgc2ltcGxlCi0gKiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtLiBCZWZvcmUgY2FsbGluZwotICogeXlwYXJzZSgpLCB0aGUgbWFpbi5jYyBwcm9ncmFtIHdpbGwgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgdG8gdGhlc2UKLSAqIGdsb2JhbCB2YXJpYWJsZXMgc3VjaCB0aGF0IHRoZSBwYXJzZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcgYW5kIHB1dHMgZW50cmllcwotICogaW50byB0aGUgcmlnaHQgY29udGFpbmVycywgZXRjLgotICoKLSAqLwotCi0vKioKLSAqIEhvb3JheSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0eXBlcyEKLSAqLwotCi1jbGFzcyB0X3Byb2dyYW07Ci1jbGFzcyB0X3Njb3BlOwotY2xhc3MgdF90eXBlOwotCi0vKioKLSAqIFBhcnNpbmcgbW9kZSwgdHdvIHBhc3NlcyB1cCBpbiB0aGlzIGdpbiBydW1teSEKLSAqLwotCi1lbnVtIFBBUlNFX01PREUgewotICBJTkNMVURFUyA9IDEsCi0gIFBST0dSQU0gPSAyCi19OwotCi0vKioKLSAqIFN0cmljdG5lc3MgbGV2ZWwKLSAqLwotZXh0ZXJuIGludCBnX3N0cmljdDsKLQotLyoqCi0gKiBUaGUgbWFzdGVyIHByb2dyYW0gcGFyc2UgdHJlZS4gVGhpcyBpcyBhY2Nlc3NlZCBmcm9tIHdpdGhpbiB0aGUgcGFyc2VyIGNvZGUKLSAqIHRvIGJ1aWxkIHVwIHRoZSBwcm9ncmFtIGVsZW1lbnRzLgotICovCi1leHRlcm4gdF9wcm9ncmFtKiBnX3Byb2dyYW07Ci0KLS8qKgotICogR2xvYmFsIHR5cGVzIGZvciB0aGUgcGFyc2VyIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlCi0gKi8KLQotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3ZvaWQ7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfc3RyaW5nOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2JpbmFyeTsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9zbGlzdDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9ib29sOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2J5dGU7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTE2OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kzMjsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pNjQ7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfZG91YmxlOwotCi0vKioKLSAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCi0gKi8KLWV4dGVybiB0X3Njb3BlKiBnX3Njb3BlOwotCi0vKioKLSAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bwotICovCi1leHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7Ci0KLS8qKgotICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCi0gKi8KLWV4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7Ci0KLS8qKgotICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCi0gKi8KLWV4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKLQotLyoqCi0gKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCi0gKi8KLWV4dGVybiBjaGFyKiBnX3RpbWVfc3RyOwotCi0vKioKLSAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWV4dGVybiBjaGFyKiBnX2RvY3RleHQ7Ci0KLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWV4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21haW4uY2MgYi9jb21waWxlci9jcHAvc3JjL21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTYxYjkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogdGhyaWZ0IC0gYSBsaWdodHdlaWdodCBjcm9zcy1sYW5ndWFnZSBycGMvc2VyaWFsaXphdGlvbiB0b29sCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGNvbXBpbGVyIGVuZ2luZSBmb3IgVGhyaWZ0LCB3aGljaCBpbnZva2VzIHRoZQotICogc2Nhbm5lci9wYXJzZXIgdG8gYnVpbGQgdGhlIHRocmlmdCBvYmplY3QgdHJlZS4gVGhlIGludGVyZmFjZSBnZW5lcmF0aW9uCi0gKiBjb2RlIGZvciBlYWNoIGxhbmd1YWdlIGxpdmVzIGluIGEgZmlsZSBieSB0aGUgbGFuZ3VhZ2UgbmFtZSB1bmRlciB0aGUKLSAqIGdlbmVyYXRlLyBmb2xkZXIsIGFuZCBhbGwgcGFyc2Ugc3RydWN0dXJlcyBsaXZlIGluIHBhcnNlLwotICoKLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2lmZGVmIE1JTkdXCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLwotI2VuZGlmCi0KLS8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9zY29wZS5oIgotI2luY2x1ZGUgImdlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCi0KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogR2xvYmFsIHByb2dyYW0gdHJlZQotICovCi10X3Byb2dyYW0qIGdfcHJvZ3JhbTsKLQotLyoqCi0gKiBHbG9iYWwgdHlwZXMKLSAqLwotCi10X3R5cGUqIGdfdHlwZV92b2lkOwotdF90eXBlKiBnX3R5cGVfc3RyaW5nOwotdF90eXBlKiBnX3R5cGVfYmluYXJ5OwotdF90eXBlKiBnX3R5cGVfc2xpc3Q7Ci10X3R5cGUqIGdfdHlwZV9ib29sOwotdF90eXBlKiBnX3R5cGVfYnl0ZTsKLXRfdHlwZSogZ190eXBlX2kxNjsKLXRfdHlwZSogZ190eXBlX2kzMjsKLXRfdHlwZSogZ190eXBlX2k2NDsKLXRfdHlwZSogZ190eXBlX2RvdWJsZTsKLQotLyoqCi0gKiBHbG9iYWwgc2NvcGUKLSAqLwotdF9zY29wZSogZ19zY29wZTsKLQotLyoqCi0gKiBQYXJlbnQgc2NvcGUgdG8gYWxzbyBwYXJzZSB0eXBlcwotICovCi10X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKLQotLyoqCi0gKiBQcmVmaXggZm9yIHB1dHRpbmcgdHlwZXMgaW4gcGFyZW50IHNjb3BlCi0gKi8KLXN0cmluZyBnX3BhcmVudF9wcmVmaXg7Ci0KLS8qKgotICogUGFyc2luZyBwYXNzCi0gKi8KLVBBUlNFX01PREUgZ19wYXJzZV9tb2RlOwotCi0vKioKLSAqIEN1cnJlbnQgZGlyZWN0b3J5IG9mIGZpbGUgYmVpbmcgcGFyc2VkCi0gKi8KLXN0cmluZyBnX2N1cmRpcjsKLQotLyoqCi0gKiBDdXJyZW50IGZpbGUgYmVpbmcgcGFyc2VkCi0gKi8KLXN0cmluZyBnX2N1cnBhdGg7Ci0KLS8qKgotICogU2VhcmNoIHBhdGggZm9yIGluY2x1c2lvbnMKLSAqLwotdmVjdG9yPHN0cmluZz4gZ19pbmNsX3NlYXJjaHBhdGg7Ci0KLS8qKgotICogU2hvdWxkIEMrKyBpbmNsdWRlIHN0YXRlbWVudHMgdXNlIHBhdGggcHJlZml4ZXMgZm9yIG90aGVyIHRocmlmdC1nZW5lcmF0ZWQKLSAqIGhlYWRlciBmaWxlcwotICovCi1ib29sIGdfY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCA9IGZhbHNlOwotCi0vKioKLSAqIEdsb2JhbCBkZWJ1ZyBzdGF0ZQotICovCi1pbnQgZ19kZWJ1ZyA9IDA7Ci0KLS8qKgotICogU3RyaWN0bmVzcyBsZXZlbAotICovCi1pbnQgZ19zdHJpY3QgPSAxMjc7Ci0KLS8qKgotICogV2FybmluZyBsZXZlbAotICovCi1pbnQgZ193YXJuID0gMTsKLQotLyoqCi0gKiBWZXJib3NlIG91dHB1dAotICovCi1pbnQgZ192ZXJib3NlID0gMDsKLQotLyoqCi0gKiBHbG9iYWwgdGltZSBzdHJpbmcKLSAqLwotY2hhciogZ190aW1lX3N0cjsKLQotLyoqCi0gKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1jaGFyKiBnX2RvY3RleHQ7Ci0KLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWludCBnX2RvY3RleHRfbGluZW5vOwotCi0vKioKLSAqIEZsYWdzIHRvIGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uCi0gKi8KLWJvb2wgZ2VuX2NwcCA9IGZhbHNlOwotYm9vbCBnZW5fZGVuc2UgPSBmYWxzZTsKLWJvb2wgZ2VuX2phdmEgPSBmYWxzZTsKLWJvb2wgZ2VuX2phdmFiZWFuID0gZmFsc2U7Ci1ib29sIGdlbl9yYiA9IGZhbHNlOwotYm9vbCBnZW5fcHkgPSBmYWxzZTsKLWJvb2wgZ2VuX3B5X25ld3N0eWxlID0gZmFsc2U7Ci1ib29sIGdlbl94c2QgPSBmYWxzZTsKLWJvb2wgZ2VuX3BocCA9IGZhbHNlOwotYm9vbCBnZW5fcGhwaSA9IGZhbHNlOwotYm9vbCBnZW5fcGhwcyA9IHRydWU7Ci1ib29sIGdlbl9waHBhID0gZmFsc2U7Ci1ib29sIGdlbl9waHBvID0gZmFsc2U7Ci1ib29sIGdlbl9yZXN0ID0gZmFsc2U7Ci1ib29sIGdlbl9wZXJsID0gZmFsc2U7Ci1ib29sIGdlbl9lcmwgPSBmYWxzZTsKLWJvb2wgZ2VuX29jYW1sID0gZmFsc2U7Ci1ib29sIGdlbl9ocyA9IGZhbHNlOwotYm9vbCBnZW5fY29jb2EgPSBmYWxzZTsKLWJvb2wgZ2VuX2NzaGFycCA9IGZhbHNlOwotYm9vbCBnZW5fc3QgPSBmYWxzZTsKLWJvb2wgZ2VuX3JlY3Vyc2UgPSBmYWxzZTsKLQotLyoqCi0gKiBNaW5HVyBkb2Vzbid0IGhhdmUgcmVhbHBhdGgsIHNvIHVzZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpbiB0aGF0IGNhc2UsCi0gKiBvdGhlcndpc2UgdGhpcyBqdXN0IGNhbGxzIHRocm91Z2ggdG8gcmVhbHBhdGgKLSAqLwotY2hhciAqc2FmZXJlYWxwYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKnJlc29sdmVkX3BhdGgpIHsKLSNpZmRlZiBNSU5HVwotICBjaGFyIGJ1ZltNQVhfUEFUSF07Ci0gIGNoYXIqIGJhc2VuYW1lOwotICBEV09SRCBsZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKLSAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSl7Ci0gICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHBhdGgpOwotICB9IGVsc2UgewotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBidWYpOwotICB9Ci0KLSAgLy8gUmVwbGFjZSBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBzbyB0aGUKLSAgLy8gcmVzdCBvZiB0aGUgY29kZSBiZWhhdmVzIGNvcnJlY3RseS4KLSAgc2l6ZV90IHJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZF9wYXRoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlZF9sZW47IGkrKykgewotICAgIGlmIChyZXNvbHZlZF9wYXRoW2ldID09ICdcXCcpIHsKLSAgICAgIHJlc29sdmVkX3BhdGhbaV0gPSAnLyc7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXNvbHZlZF9wYXRoOwotI2Vsc2UKLSAgcmV0dXJuIHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkX3BhdGgpOwotI2VuZGlmCi19Ci0KLQotLyoqCi0gKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuIFRoaXMgaXMgY2FsbGVkIHl5ZXJyb3IgZm9yIGhpc3RvcmljYWwKLSAqIHJlYXNvbnMgKGxleCBhbmQgeWFjYyBleHBlY3QgdGhlIGVycm9yIHJlcG9ydGluZyByb3V0aW5lIHRvIGJlIGNhbGxlZAotICogdGhpcykuIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgYW55IGVycm9ycyB0byB0aGUgdXNlci4KLSAqIHl5ZXJyb3IgdGFrZXMgcHJpbnRmIHN0eWxlIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAiW0VSUk9SOiVzOiVkXSAobGFzdCB0b2tlbiB3YXMgJyVzJylcbiIsCi0gICAgICAgICAgZ19jdXJwYXRoLmNfc3RyKCksCi0gICAgICAgICAgeXlsaW5lbm8sCi0gICAgICAgICAgeXl0ZXh0KTsKLQotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBmcm9tIHRoZSBwYXJzZXIuCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfZGVidWcgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgdmVyYm9zZSBvdXRwdXQgbW9kZSBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICBpZiAoZ192ZXJib3NlID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UKLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfd2FybiA8IGxldmVsKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGV4aXRzCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLSAgZXhpdCgxKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQotICovCi1zdHJpbmcgcHJvZ3JhbV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgewotICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7Ci0gIGlmIChzbGFzaCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cihzbGFzaCsxKTsKLSAgfQotICBzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBmaWxlbmFtZS5yZmluZCgiLiIpOwotICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgewotICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGRvdCk7Ci0gIH0KLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKLSAqLwotc3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgewotICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7Ci0gIC8vIE5vIHNsYXNoLCBqdXN0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgaWYgKHNsYXNoID09IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiAiLiI7Ci0gIH0KLSAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cigwLCBzbGFzaCk7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lCi0gKi8KLXN0cmluZyBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGVuYW1lKSB7Ci0gIC8vIEFic29sdXRlIHBhdGg/IEp1c3QgdHJ5IHRoYXQKLSAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgewotICAgIC8vIFJlYWxwYXRoIQotICAgIGNoYXIgcnBbUEFUSF9NQVhdOwotICAgIGlmIChzYWZlcmVhbHBhdGgoZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKLSAgICAgIHB3YXJuaW5nKDAsICJDYW5ub3Qgb3BlbiBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gU3RhdCB0aGlzIGZpbGUKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gcnA7Ci0gICAgfQotICB9IGVsc2UgeyAvLyByZWxhdGl2ZSBwYXRoLCBzdGFydCBzZWFyY2hpbmcKLSAgICAvLyBuZXcgc2VhcmNoIHBhdGggd2l0aCBjdXJyZW50IGRpciBnbG9iYWwKLSAgICB2ZWN0b3I8c3RyaW5nPiBzcCA9IGdfaW5jbF9zZWFyY2hwYXRoOwotICAgIHNwLmluc2VydChzcC5iZWdpbigpLCBnX2N1cmRpcik7Ci0KLSAgICAvLyBpdGVyYXRlIHRocm91Z2ggcGF0aHMKLSAgICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IHNwLmJlZ2luKCk7IGl0ICE9IHNwLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBzdHJpbmcgc2ZpbGVuYW1lID0gKihpdCkgKyAiLyIgKyBmaWxlbmFtZTsKLQotICAgICAgLy8gUmVhbHBhdGghCi0gICAgICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgICAgIGlmIChzYWZlcmVhbHBhdGgoc2ZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyBTdGF0IHRoaXMgZmlsZXMKLSAgICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgewotICAgICAgICByZXR1cm4gcnA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gVWggb2gKLSAgcHdhcm5pbmcoMCwgIkNvdWxkIG5vdCBmaW5kIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygpOwotfQotCi0vKioKLSAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCi0gKiBBbHNvIHByaW50cyBhIHdhcm5pbmcgaWYgd2UgYXJlIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24uCi0gKi8KLXZvaWQgY2xlYXJfZG9jdGV4dCgpIHsKLSAgaWYgKGdfZG9jdGV4dCAhPSBOVUxMKSB7Ci0gICAgcHdhcm5pbmcoMiwgIlVuY2FwdHVyZWQgZG9jdGV4dCBhdCBvbiBsaW5lICVkLiIsIGdfZG9jdGV4dF9saW5lbm8pOwotICB9Ci0gIGZyZWUoZ19kb2N0ZXh0KTsKLSAgZ19kb2N0ZXh0ID0gTlVMTDsKLX0KLQotLyoqCi0gKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKLSAqCi0gKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKLSAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKLSAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgotICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKLSAgZG9jc3RyaW5nLmVyYXNlKAotICAgICAgcmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLAotICAgICAgZG9jc3RyaW5nLmVuZCgpKTsKLQotICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgotICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOwotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OwotICB3aGlsZSAodHJ1ZSkgewotICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zKzE7Ci0gICAgcG9zID0gZG9jc3RyaW5nLmZpbmQoJ1xuJywgbGFzdCk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIEZpcnN0IGJpdCBvZiBjbGVhbmluZy4gIElmIHRoZSBsYXN0IGxpbmUgaXMgb25seSB3aGl0ZXNwYWNlLCBkcm9wIGl0LgotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbm9ud2hpdGUgPSBkb2NzdHJpbmcuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGxhc3QpOwotICAgICAgaWYgKG5vbndoaXRlICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0KSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCwgcG9zLWxhc3QpKTsKLSAgfQotCi0gIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCi0gIGlmIChsaW5lcy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KLSAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKLQotICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAotICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCi0gIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOwotICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOwotICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKLSAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAoIWZvdW5kX3ByZWZpeCkgewotICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKLSAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOwotICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KLSAgICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MKLSAgICAgICAgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJwotICAgICAgICAmJiBwb3MgPT0gcHJlZml4X2xlbikgewotICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCi0gICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgotICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCi0gICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKGhhdmVfcHJlZml4KSB7Ci0gICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KLSAgICBwcmVmaXhfbGVuKys7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm93IGRlbGV0ZSB0aGUgbWluaW11bSBhbW91bnQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lLgotICBwcmVmaXhfbGVuID0gc3RyaW5nOjpucG9zOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkrMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcwotICAgICAgICAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKLSAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpLTEpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UocG9zKzEpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCi0gIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCi0gIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKLSAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKLSAgfQotCi0gIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCi0gIGRvY3N0cmluZy5jbGVhcigpOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKLSAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKLSAgfQotCi0gIGFzc2VydChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKTsKLSAgc3RyY3B5KGRvY3RleHQsIGRvY3N0cmluZy5jX3N0cigpKTsKLSAgcmV0dXJuIGRvY3RleHQ7Ci19Ci0KLS8qKiBTZXQgdG8gdHJ1ZSB0byBkZWJ1ZyBkb2NzdHJpbmcgcGFyc2luZyAqLwotc3RhdGljIGJvb2wgZHVtcF9kb2NzID0gZmFsc2U7Ci0KLS8qKgotICogRHVtcHMgZG9jc3RyaW5ncyB0byBzdGRvdXQKLSAqIE9ubHkgd29ya3MgZm9yIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBhbmQgdGhlIHdob2xlIHByb2dyYW0gZG9jCi0gKiAoaS5lLiwgbm90IGVudW0gY29uc3RhbnRzLCBzdHJ1Y3QgZmllbGRzLCBvciBmdW5jdGlvbnMuCi0gKi8KLXZvaWQgZHVtcF9kb2NzdHJpbmdzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICBzdHJpbmcgcHJvZ2RvYyA9IHByb2dyYW0tPmdldF9kb2MoKTsKLSAgaWYgKCFwcm9nZG9jLmVtcHR5KCkpIHsKLSAgICBwcmludGYoIldob2xlIHByb2dyYW0gZG9jOlxuJXNcbiIsIHByb2dkb2MuY19zdHIoKSk7Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfdHlwZWRlZio+JiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOwotICB2ZWN0b3I8dF90eXBlZGVmKj46OmNvbnN0X2l0ZXJhdG9yIHRfaXRlcjsKLSAgZm9yICh0X2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0X2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdF9pdGVyKSB7Ci0gICAgdF90eXBlZGVmKiB0ZCA9ICp0X2l0ZXI7Ci0gICAgaWYgKHRkLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigidHlwZWRlZiAlczpcbiVzXG4iLCB0ZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0ZC0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOwotICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2VudW0qIGVuID0gKmVfaXRlcjsKLSAgICBpZiAoZW4tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJlbnVtICVzOlxuJXNcbiIsIGVuLT5nZXRfbmFtZSgpLmNfc3RyKCksIGVuLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X2NvbnN0Kj4mIGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHRfY29uc3QqIGNvID0gKmNfaXRlcjsKLSAgICBpZiAoY28tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJjb25zdCAlczpcbiVzXG4iLCBjby0+Z2V0X25hbWUoKS5jX3N0cigpLCBjby0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOwotICAgIGlmIChzdC0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInN0cnVjdCAlczpcbiVzXG4iLCBzdC0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdC0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHRfc3RydWN0KiB4biA9ICp4X2l0ZXI7Ci0gICAgaWYgKHhuLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigieGNlcHRpb24gJXM6XG4lc1xuIiwgeG4tPmdldF9uYW1lKCkuY19zdHIoKSwgeG4tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7Ci0gICAgaWYgKHN2LT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50Zigic2VydmljZSAlczpcbiVzXG4iLCBzdi0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENhbGwgZ2VuZXJhdGVfZmluZ2VycHJpbnQgZm9yIGV2ZXJ5IHN0cnVjdHVyZSBhbmQgZW51bS4KLSAqLwotdm9pZCBnZW5lcmF0ZV9hbGxfZmluZ2VycHJpbnRzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOwotICAgIHN0LT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqeF9pdGVyOwotICAgIHN0LT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKLSAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7Ci0gICAgdF9lbnVtKiBlID0gKmVfaXRlcjsKLSAgICBlLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgZ190eXBlX3ZvaWQtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0KLSAgLy8gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgZmluZ2VycHJpbnRzIGZvciBpbXBsaWNpdCBzdHJ1Y3R1cmVzLCBzdGFydCBoZXJlLgotICAvKgotICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4mIHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICBmb3IgKHZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICB0X3NlcnZpY2UqIHN2ID0gKnZfaXRlcjsKLSAgfQotICAqLwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIKLSAqLwotdm9pZCB2ZXJzaW9uKCkgewotICBwcmludGYoIlRocmlmdCB2ZXJzaW9uICVzXG4iLCBUSFJJRlRfVkVSU0lPTik7Ci19Ci0KLS8qKgotICogRGlwbGF5cyB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQgdGhlbiBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUuCi0gKi8KLXZvaWQgdXNhZ2UoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcnNpb24gICAgUHJpbnQgdGhlIGNvbXBpbGVyIHZlcnNpb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW8gZGlyICAgICAgU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBnZW4tKiBwYWNrYWdlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtSSBkaXIgICAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ub3dhcm4gICAgIFN1cHByZXNzIGFsbCBjb21waWxlciB3YXJuaW5ncyAoQkFEISlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXN0cmljdCAgICAgU3RyaWN0IGNvbXBpbGVyIHdhcm5pbmdzIG9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12W2VyYm9zZV0gIFZlcmJvc2UgbW9kZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcltlY3Vyc2VdICBBbHNvIGdlbmVyYXRlIGluY2x1ZGVkIGZpbGVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kZWJ1ZyAgICAgIFBhcnNlIGRlYnVnIHRyYWNlIHRvIHN0ZG91dFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTIsW2tleTM9dmFsM11dXS5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7Ci0KLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgJXMgKCVzKTpcbiIsCi0gICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAotICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOwotICB9Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCi0gKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAotICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCi0gKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKLSAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCi0gKiBydW50aW1lLgotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJ5dGUiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTE2IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkzMiI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpNjQiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUiAmJgotICAgICAgICAgIHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRSkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZG91YmxlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZW51bSI7Ci0gICAgfQotCi0gICAgLy8gc2VlIGlmIHRoZXJlJ3MgYSBkb3QgaW4gdGhlIGlkZW50aWZpZXIKLSAgICBzdGQ6OnN0cmluZyBuYW1lX3BvcnRpb24gPSB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICgodF9lbnVtKil0eXBlKS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lX3BvcnRpb24pIHsKLSAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0ICIgKyBuYW1lICsgIiB3YXMgZGVjbGFyZWQgYXMgdHlwZSAiIAotICAgICAgICArIHR5cGUtPmdldF9uYW1lKCkgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiIAotICAgICAgICArIHZhbHVlLT5nZXRfaWRlbnRpZmllcigpICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGVfdHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOwotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFBhcnNlcyBhIHByb2dyYW0KLSAqLwotdm9pZCBwYXJzZSh0X3Byb2dyYW0qIHByb2dyYW0sIHRfcHJvZ3JhbSogcGFyZW50X3Byb2dyYW0pIHsKLSAgLy8gR2V0IHNjb3BlIGZpbGUgcGF0aAotICBzdHJpbmcgcGF0aCA9IHByb2dyYW0tPmdldF9wYXRoKCk7Ci0KLSAgLy8gU2V0IGN1cnJlbnQgZGlyIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCBpbiB0aGUgaW5jbHVkZV9maWxlIGZ1bmN0aW9uCi0gIGdfY3VyZGlyID0gZGlyZWN0b3J5X25hbWUocGF0aCk7Ci0gIGdfY3VycGF0aCA9IHBhdGg7Ci0KLSAgLy8gT3BlbiB0aGUgZmlsZQotICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKLSAgfQotCi0gIC8vIENyZWF0ZSBuZXcgc2NvcGUgYW5kIHNjYW4gZm9yIGluY2x1ZGVzCi0gIHB2ZXJib3NlKCJTY2FubmluZyAlcyBmb3IgaW5jbHVkZXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIGdfcGFyc2VfbW9kZSA9IElOQ0xVREVTOwotICBnX3Byb2dyYW0gPSBwcm9ncmFtOwotICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKLSAgdHJ5IHsKLSAgICB5eWxpbmVubyA9IDE7Ci0gICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7Ci0gICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIGluY2x1ZGUgcGFzcy4iKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyB4KSB7Ci0gICAgZmFpbHVyZSh4LmNfc3RyKCkpOwotICB9Ci0gIGZjbG9zZSh5eWluKTsKLQotICAvLyBSZWN1cnNpdmVseSBwYXJzZSBhbGwgdGhlIGluY2x1ZGUgcHJvZ3JhbXMKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraXRlcikgewotICAgIHBhcnNlKCppdGVyLCBwcm9ncmFtKTsKLSAgfQotCi0gIC8vIFBhcnNlIHRoZSBwcm9ncmFtIGZpbGUKLSAgZ19wYXJzZV9tb2RlID0gUFJPR1JBTTsKLSAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKLSAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7Ci0gIGdfcGFyZW50X3Njb3BlID0gKHBhcmVudF9wcm9ncmFtICE9IE5VTEwpID8gcGFyZW50X3Byb2dyYW0tPnNjb3BlKCkgOiBOVUxMOwotICBnX3BhcmVudF9wcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIi4iOwotICBnX2N1cnBhdGggPSBwYXRoOwotICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKLSAgfQotICBwdmVyYm9zZSgiUGFyc2luZyAlcyBmb3IgdHlwZXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIHl5bGluZW5vID0gMTsKLSAgdHJ5IHsKLSAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKLSAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgdHlwZXMgcGFzcy4iKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyB4KSB7Ci0gICAgZmFpbHVyZSh4LmNfc3RyKCkpOwotICB9Ci0gIGZjbG9zZSh5eWluKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBjb2RlCi0gKi8KLXZvaWQgZ2VuZXJhdGUodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgZ2VuZXJhdG9yX3N0cmluZ3MpIHsKLSAgLy8gT29vb2hoLCByZWN1cnNpdmUgY29kZSBnZW5lcmF0aW9uLCBob3QhIQotICBpZiAoZ2VuX3JlY3Vyc2UpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgLy8gUHJvcG9nYXRlIG91dHB1dCBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIHByb2dyYW1zCi0gICAgICBpbmNsdWRlc1tpXS0+c2V0X291dF9wYXRoKHByb2dyYW0tPmdldF9vdXRfcGF0aCgpKTsKLQotICAgICAgZ2VuZXJhdGUoaW5jbHVkZXNbaV0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb2RlIQotICB0cnkgewotICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKLQotICAgIC8vIENvbXB1dGUgZmluZ2VycHJpbnRzLgotICAgIGdlbmVyYXRlX2FsbF9maW5nZXJwcmludHMocHJvZ3JhbSk7Ci0KLSAgICBpZiAoZHVtcF9kb2NzKSB7Ci0gICAgICBkdW1wX2RvY3N0cmluZ3MocHJvZ3JhbSk7Ci0gICAgfQotCi0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gZ2VuZXJhdG9yX3N0cmluZ3MuYmVnaW4oKTsgaXRlciAhPSBnZW5lcmF0b3Jfc3RyaW5ncy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICB0X2dlbmVyYXRvciogZ2VuZXJhdG9yID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgKml0ZXIpOwotCi0gICAgICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKLSAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgcHJpbnRmKCJFcnJvcjogJXNcbiIsIHMuY19zdHIoKSk7Ci0gIH0gY2F0Y2ggKGNvbnN0IGNoYXIqIGV4YykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBleGMpOwotICB9Ci0KLX0KLQotLyoqCi0gKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKLSAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpbnQgaTsKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7Ci0KLSAgLy8gU2V0dXAgdGltZSBzdHJpbmcKLSAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKLQotICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKLSAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKLSAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOwotCi0gIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCi0gIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOwotCi0gIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYy0xOyBpKyspIHsKLSAgICBjaGFyKiBhcmc7Ci0KLSAgICBhcmcgPSBzdHJ0b2soYXJndltpXSwgIiAiKTsKLSAgICB3aGlsZSAoYXJnICE9IE5VTEwpIHsKLSAgICAgIC8vIFRyZWF0IGRvdWJsZSBkYXNoZXMgYXMgc2luZ2xlIGRhc2hlcwotICAgICAgaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJykgewotICAgICAgICArK2FyZzsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKLSAgICAgICAgdmVyc2lvbigpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgewotICAgICAgICBnX2RlYnVnID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7Ci0gICAgICAgIGdfd2FybiA9IDA7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgewotICAgICAgICBnX3N0cmljdCA9IDI1NTsKLSAgICAgICAgZ193YXJuID0gMjsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwICkgewotICAgICAgICBnX3ZlcmJvc2UgPSAxOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXIiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItcmVjdXJzZSIpID09IDAgKSB7Ci0gICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1nZW4iKSA9PSAwKSB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICIhISEgTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZW5zZSIpID09IDApIHsKLSAgICAgICAgZ2VuX2RlbnNlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jcHAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9jcHAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWphdmFiZWFuIikgPT0gMCkgewotICAgICAgICBnZW5famF2YWJlYW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWphdmEiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9qYXZhID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocGkiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHBpID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBzIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocGwiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwcyA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocGEiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwcyA9IGZhbHNlOwotICAgICAgICBnZW5fcGhwYSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwbyIpID09IDApIHsKLSAgICAgICAgZ2VuX3BocCA9IHRydWU7Ci0gICAgICAgIGdlbl9waHBvID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yZXN0IikgPT0gMCkgewotICAgICAgICBnZW5fcmVzdCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcHkiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9weSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcHlucyIpID09IDApIHsKLSAgICAgICAgZ2VuX3B5ID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3B5X25ld3N0eWxlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yYiIpID09IDApIHsKLSAgICAgICAgZ2VuX3JiID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi14c2QiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl94c2QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBlcmwiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9wZXJsID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1lcmwiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9lcmwgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW9jYW1sIikgPT0gMCkgewotICAgICAgICBnZW5fb2NhbWwgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWhzIikgPT0gMCkgewotICAgICAgICBnZW5faHMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWNvY29hIikgPT0gMCkgewotICAgICAgICBnZW5fY29jb2EgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0IikgPT0gMCkgewotICAgICAgICBnZW5fc3QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWNzaGFycCIpID09IDApIHsKLSAgICAgICAgZ2VuX2NzaGFycCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCIpID09IDApIHsKLSAgICAgICAgZ19jcHBfdXNlX2luY2x1ZGVfcHJlZml4ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgewotICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotCi0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbyIpID09IDApIHsKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1vOiBtaXNzaW5nIG91dHB1dCBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0X3BhdGggPSBhcmc7Ci0KLSNpZmRlZiBNSU5HVwotICAgICAgICAvL3N0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKLSAgICAgICAgaW50IGxhc3QgPSBvdXRfcGF0aC5sZW5ndGgoKS0xOwotICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykKLSAgICAgICAgewotICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgICAgICAgaWYgKHN0YXQob3V0X3BhdGguY19zdHIoKSwgJnNiKSA8IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6ICVzXG4iLCBvdXRfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBvdXRfcGF0aC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIFVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOwotICAgICAgICB1c2FnZSgpOwotICAgICAgfQotCi0gICAgICAvLyBUb2tlbml6ZSBtb3JlCi0gICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQotICBpZiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi12ZXJzaW9uIikgPT0gMCkgewotICAgIHZlcnNpb24oKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBEZWxldGUgdGhlc2Ugd2hlbiBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuCi0gIGlmIChnZW5fY3BwKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1jcHAgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBjcHAiKTsKLSAgICBzdHJpbmcgZ2VuX3N0cmluZyA9ICJjcHA6IjsKLSAgICBpZiAoZ2VuX2RlbnNlKSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgiZGVuc2UsIik7Ci0gICAgfQotICAgIGlmIChnX2NwcF91c2VfaW5jbHVkZV9wcmVmaXgpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJpbmNsdWRlX3ByZWZpeCwiKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGdlbl9zdHJpbmcpOwotICB9Ci0gIGlmIChnZW5famF2YSkgewotICAgIHB3YXJuaW5nKDEsICItamF2YSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGphdmEiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImphdmEiKTsKLSAgfQotICBpZiAoZ2VuX2phdmFiZWFuKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1qYXZhYmVhbiBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGphdmE6YmVhbnMiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImphdmE6YmVhbnMiKTsKLSAgfQotICBpZiAoZ2VuX2NzaGFycCkgewotICAgIHB3YXJuaW5nKDEsICItY3NoYXJwIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY3NoYXJwIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJjc2hhcnAiKTsKLSAgfQotICBpZiAoZ2VuX3B5KSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1weSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHB5Iik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJweSIpOwotICB9Ci0gIGlmIChnZW5fcmIpIHsKLSAgICBwd2FybmluZygxLCAiLXJiIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcmIiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soInJiIik7Ci0gIH0KLSAgaWYgKGdlbl9wZXJsKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1wZXJsIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcGVybCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygicGVybCIpOwotICB9Ci0gIGlmIChnZW5fcGhwIHx8IGdlbl9waHBpKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1waHAgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBwaHAiKTsKLSAgICBzdHJpbmcgZ2VuX3N0cmluZyA9ICJwaHA6IjsKLSAgICBpZiAoZ2VuX3BocGkpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJpbmxpbmVkLCIpOwotICAgIH0gZWxzZSBpZihnZW5fcGhwcykgewotICAgICAgZ2VuX3N0cmluZy5hcHBlbmQoInNlcnZlciwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocGEpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJhdXRvbG9hZCwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocG8pIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJvb3AsIik7Ci0gICAgfSBlbHNlIGlmKGdlbl9yZXN0KSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgicmVzdCwiKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGdlbl9zdHJpbmcpOwotICB9Ci0gIGlmIChnZW5fY29jb2EpIHsKLSAgICBwd2FybmluZygxLCAiLWNvY29hIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY29jb2EiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImNvY29hIik7Ci0gIH0KLSAgaWYgKGdlbl9lcmwpIHsKLSAgICBwd2FybmluZygxLCAiLWVybCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGVybCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygiZXJsIik7Ci0gIH0KLSAgaWYgKGdlbl9zdCkgewotICAgIHB3YXJuaW5nKDEsICItc3QgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBzdCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygic3QiKTsKLSAgfQotICBpZiAoZ2VuX29jYW1sKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1vY2FtbCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIG9jYW1sIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJvY2FtbCIpOwotICB9Ci0gIGlmIChnZW5faHMpIHsKLSAgICBwd2FybmluZygxLCAiLWhzIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gaHMiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImhzIik7Ci0gIH0KLSAgaWYgKGdlbl94c2QpIHsKLSAgICBwd2FybmluZygxLCAiLXhzZCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHhzZCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygieHNkIik7Ci0gIH0KLQotICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQotICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcblxuIik7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8vIFJlYWwtcGF0aGlmeSBpdAotICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgZmlsZSBuYW1lXG4iKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgcnApID09IE5VTEwpIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7Ci0gIH0KLSAgc3RyaW5nIGlucHV0X2ZpbGUocnApOwotCi0gIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOwotICBpZiAob3V0X3BhdGguc2l6ZSgpKSB7Ci0gICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoKTsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIGNwcCBpbmNsdWRlIHByZWZpeC4KLSAgLy8gaW5mZXIgdGhpcyBmcm9tIHRoZSBmaWxlbmFtZSBwYXNzZWQgaW4KLSAgc3RyaW5nIGlucHV0X2ZpbGVuYW1lID0gYXJndltpXTsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4OwotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGlucHV0X2ZpbGVuYW1lLnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIGluY2x1ZGVfcHJlZml4ID0gaW5wdXRfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOwotICB9Ci0KLSAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKLQotICAvLyBJbml0aWFsaXplIGdsb2JhbCB0eXBlcwotICBnX3R5cGVfdm9pZCAgID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgICB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKLSAgZ190eXBlX3N0cmluZyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgZ190eXBlX2JpbmFyeSA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX2JpbmFyeSktPnNldF9iaW5hcnkodHJ1ZSk7Ci0gIGdfdHlwZV9zbGlzdCAgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9zbGlzdCktPnNldF9zdHJpbmdfbGlzdCh0cnVlKTsKLSAgZ190eXBlX2Jvb2wgICA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsICAgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7Ci0gIGdfdHlwZV9ieXRlICAgPSBuZXcgdF9iYXNlX3R5cGUoImJ5dGUiLCAgIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUpOwotICBnX3R5cGVfaTE2ICAgID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCAgICB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOwotICBnX3R5cGVfaTMyICAgID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCAgICB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOwotICBnX3R5cGVfaTY0ICAgID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCAgICB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOwotICBnX3R5cGVfZG91YmxlID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOwotCi0gIC8vIFBhcnNlIGl0IQotICBwYXJzZShwcm9ncmFtLCBOVUxMKTsKLQotICAvLyBUaGUgY3VycmVudCBwYXRoIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgd2hlbiB3ZSBhcmUgZG9pbmcgZ2VuZXJhdGlvbi4KLSAgLy8gUmVzZXQgdGhlIHZhcmlhYmxlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgotICBnX2N1cnBhdGggPSAiZ2VuZXJhdGlvbiI7Ci0gIC8vIFJlc2V0IHl5bGluZW5vIGZvciB0aGUgaGVjayBvZiBpdC4gIFVzZSAxIGluc3RlYWQgb2YgMCBiZWNhdXNlCi0gIC8vIFRoYXQgaXMgd2hhdCBzaG93cyB1cCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZy4KLSAgeXlsaW5lbm8gPSAxOwotCi0gIC8vIEdlbmVyYXRlIGl0IQotICBnZW5lcmF0ZShwcm9ncmFtLCBnZW5lcmF0b3Jfc3RyaW5ncyk7Ci0KLSAgLy8gQ2xlYW4gdXAuIFdobyBhbSBJIGtpZGRpbmcuLi4gdGhpcyBwcm9ncmFtIHByb2JhYmx5IG9ycGhhbnMgaGVhcCBtZW1vcnkKLSAgLy8gYWxsIG92ZXIgdGhlIHBsYWNlLCBidXQgd2hvIGNhcmVzIGJlY2F1c2UgaXQgaXMgYWJvdXQgdG8gZXhpdCBhbmQgaXQgaXMKLSAgLy8gYWxsIHJlZmVyZW5jZWQgYW5kIHVzZWQgYnkgdGhpcyB3YWNreSBwYXJzZSB0cmVlIHVwIHVudGlsIG5vdyBhbnl3YXlzLgotCi0gIGRlbGV0ZSBwcm9ncmFtOwotICBkZWxldGUgZ190eXBlX3ZvaWQ7Ci0gIGRlbGV0ZSBnX3R5cGVfc3RyaW5nOwotICBkZWxldGUgZ190eXBlX2Jvb2w7Ci0gIGRlbGV0ZSBnX3R5cGVfYnl0ZTsKLSAgZGVsZXRlIGdfdHlwZV9pMTY7Ci0gIGRlbGV0ZSBnX3R5cGVfaTMyOwotICBkZWxldGUgZ190eXBlX2k2NDsKLSAgZGVsZXRlIGdfdHlwZV9kb3VibGU7Ci0KLSAgLy8gRmluaXNoZWQKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21haW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdkODJkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX01BSU5fSAotI2RlZmluZSBUX01BSU5fSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInBhcnNlL3RfY29uc3QuaCIKLSNpbmNsdWRlICJwYXJzZS90X2ZpZWxkLmgiCi0KLS8qKgotICogRGVmaW5lZCBpbiB0aGUgZmxleCBsaWJyYXJ5Ci0gKi8KLQotaW50IHl5bGV4KHZvaWQpOwotCi1pbnQgeXlwYXJzZSh2b2lkKTsKLQotLyoqCi0gKiBFeHBlY3RlZCB0byBiZSBkZWZpbmVkIGJ5IEZsZXgvQmlzb24KLSAqLwotdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBQYXJzZSBkZWJ1Z2dpbmcgb3V0cHV0LCB1c2VkIHRvIHByaW50IGhlbHBmdWwgaW5mbwotICovCi12b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogUGFyc2VyIHdhcm5pbmcKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBGYWlsdXJlIQotICovCi12b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIENoZWNrIGNvbnN0YW50IHR5cGVzCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKTsKLQotLyoqCi0gKiBDaGVjayBjb25zdGFudCB0eXBlcwotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdik7Ci0KLS8qKgotICogQ2hlY2sgbWVtYmVycyBvZiBhIHRocm93cyBibG9jawotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKTsKLQotLyoqCi0gKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQotICovCi1zdGQ6OnN0cmluZyBwcm9ncmFtX25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKLSAqLwotc3RkOjpzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYW4gaW5jbHVkZSBmaWxlCi0gKi8KLXN0ZDo6c3RyaW5nIGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KLSAqLwotdm9pZCBjbGVhcl9kb2N0ZXh0KCk7Ci0KLS8qKgotICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCi0gKi8KLWNoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCk7Ci0KLS8qKgotICogRmxleCB1dGlsaXRpZXMKLSAqLwotCi1leHRlcm4gaW50ICAgeXlsaW5lbm87Ci1leHRlcm4gY2hhciAgeXl0ZXh0W107Ci1leHRlcm4gRklMRSogeXlpbjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21kNS5jIGIvY29tcGlsZXIvY3BwL3NyYy9tZDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1ZDk2Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLS8qICRJZDogbWQ1LmMsdiAxLjYgMjAwMi8wNC8xMyAxOToyMDoyOCBscGQgRXhwICQgKi8KLS8qCi0gIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgotCi0gIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCi0gIHRleHQgaXMgYXZhaWxhYmxlIGF0Ci0JaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKLSAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQotICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKLSAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZwotICBjb3B5cmlnaHRlZC4KLQotICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmMgaXMgTC4gUGV0ZXIgRGV1dHNjaAotICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5Ci0gIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKLQotICAyMDAyLTA0LTEzIGxwZCBDbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOyBub3cgaGFuZGxlcyBieXRlIG9yZGVyCi0JZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHk7IGFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPHN0cmluZy5oPgotCWluIGxpYnJhcnkuCi0gIDIwMDItMDMtMTEgbHBkIENvcnJlY3RlZCBhcmd1bWVudCBsaXN0IGZvciBtYWluKCksIGFuZCBhZGRlZCBpbnQgcmV0dXJuCi0JdHlwZSwgaW4gdGVzdCBwcm9ncmFtIGFuZCBUIHZhbHVlIHByb2dyYW0uCi0gIDIwMDItMDItMjEgbHBkIEFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPHN0ZGlvLmg+IGluIHRlc3QgcHJvZ3JhbS4KLSAgMjAwMC0wNy0wMyBscGQgUGF0Y2hlZCB0byBlbGltaW5hdGUgd2FybmluZ3MgYWJvdXQgImNvbnN0YW50IGlzCi0JdW5zaWduZWQgaW4gQU5TSSBDLCBzaWduZWQgaW4gdHJhZGl0aW9uYWwiOyBtYWRlIHRlc3QgcHJvZ3JhbQotCXNlbGYtY2hlY2tpbmcuCi0gIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgotICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpLgotICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlICJtZDUuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI3VuZGVmIEJZVEVfT1JERVIJLyogMSA9IGJpZy1lbmRpYW4sIC0xID0gbGl0dGxlLWVuZGlhbiwgMCA9IHVua25vd24gKi8KLSNpZmRlZiBBUkNIX0lTX0JJR19FTkRJQU4KLSMgIGRlZmluZSBCWVRFX09SREVSIChBUkNIX0lTX0JJR19FTkRJQU4gPyAxIDogLTEpCi0jZWxzZQotIyAgZGVmaW5lIEJZVEVfT1JERVIgMAotI2VuZGlmCi0KLSNkZWZpbmUgVF9NQVNLICgobWQ1X3dvcmRfdCl+MCkKLSNkZWZpbmUgVDEgLyogMHhkNzZhYTQ3OCAqLyAoVF9NQVNLIF4gMHgyODk1NWI4NykKLSNkZWZpbmUgVDIgLyogMHhlOGM3Yjc1NiAqLyAoVF9NQVNLIF4gMHgxNzM4NDhhOSkKLSNkZWZpbmUgVDMgICAgMHgyNDIwNzBkYgotI2RlZmluZSBUNCAvKiAweGMxYmRjZWVlICovIChUX01BU0sgXiAweDNlNDIzMTExKQotI2RlZmluZSBUNSAvKiAweGY1N2MwZmFmICovIChUX01BU0sgXiAweDBhODNmMDUwKQotI2RlZmluZSBUNiAgICAweDQ3ODdjNjJhCi0jZGVmaW5lIFQ3IC8qIDB4YTgzMDQ2MTMgKi8gKFRfTUFTSyBeIDB4NTdjZmI5ZWMpCi0jZGVmaW5lIFQ4IC8qIDB4ZmQ0Njk1MDEgKi8gKFRfTUFTSyBeIDB4MDJiOTZhZmUpCi0jZGVmaW5lIFQ5ICAgIDB4Njk4MDk4ZDgKLSNkZWZpbmUgVDEwIC8qIDB4OGI0NGY3YWYgKi8gKFRfTUFTSyBeIDB4NzRiYjA4NTApCi0jZGVmaW5lIFQxMSAvKiAweGZmZmY1YmIxICovIChUX01BU0sgXiAweDAwMDBhNDRlKQotI2RlZmluZSBUMTIgLyogMHg4OTVjZDdiZSAqLyAoVF9NQVNLIF4gMHg3NmEzMjg0MSkKLSNkZWZpbmUgVDEzICAgIDB4NmI5MDExMjIKLSNkZWZpbmUgVDE0IC8qIDB4ZmQ5ODcxOTMgKi8gKFRfTUFTSyBeIDB4MDI2NzhlNmMpCi0jZGVmaW5lIFQxNSAvKiAweGE2Nzk0MzhlICovIChUX01BU0sgXiAweDU5ODZiYzcxKQotI2RlZmluZSBUMTYgICAgMHg0OWI0MDgyMQotI2RlZmluZSBUMTcgLyogMHhmNjFlMjU2MiAqLyAoVF9NQVNLIF4gMHgwOWUxZGE5ZCkKLSNkZWZpbmUgVDE4IC8qIDB4YzA0MGIzNDAgKi8gKFRfTUFTSyBeIDB4M2ZiZjRjYmYpCi0jZGVmaW5lIFQxOSAgICAweDI2NWU1YTUxCi0jZGVmaW5lIFQyMCAvKiAweGU5YjZjN2FhICovIChUX01BU0sgXiAweDE2NDkzODU1KQotI2RlZmluZSBUMjEgLyogMHhkNjJmMTA1ZCAqLyAoVF9NQVNLIF4gMHgyOWQwZWZhMikKLSNkZWZpbmUgVDIyICAgIDB4MDI0NDE0NTMKLSNkZWZpbmUgVDIzIC8qIDB4ZDhhMWU2ODEgKi8gKFRfTUFTSyBeIDB4Mjc1ZTE5N2UpCi0jZGVmaW5lIFQyNCAvKiAweGU3ZDNmYmM4ICovIChUX01BU0sgXiAweDE4MmMwNDM3KQotI2RlZmluZSBUMjUgICAgMHgyMWUxY2RlNgotI2RlZmluZSBUMjYgLyogMHhjMzM3MDdkNiAqLyAoVF9NQVNLIF4gMHgzY2M4ZjgyOSkKLSNkZWZpbmUgVDI3IC8qIDB4ZjRkNTBkODcgKi8gKFRfTUFTSyBeIDB4MGIyYWYyNzgpCi0jZGVmaW5lIFQyOCAgICAweDQ1NWExNGVkCi0jZGVmaW5lIFQyOSAvKiAweGE5ZTNlOTA1ICovIChUX01BU0sgXiAweDU2MWMxNmZhKQotI2RlZmluZSBUMzAgLyogMHhmY2VmYTNmOCAqLyAoVF9NQVNLIF4gMHgwMzEwNWMwNykKLSNkZWZpbmUgVDMxICAgIDB4Njc2ZjAyZDkKLSNkZWZpbmUgVDMyIC8qIDB4OGQyYTRjOGEgKi8gKFRfTUFTSyBeIDB4NzJkNWIzNzUpCi0jZGVmaW5lIFQzMyAvKiAweGZmZmEzOTQyICovIChUX01BU0sgXiAweDAwMDVjNmJkKQotI2RlZmluZSBUMzQgLyogMHg4NzcxZjY4MSAqLyAoVF9NQVNLIF4gMHg3ODhlMDk3ZSkKLSNkZWZpbmUgVDM1ICAgIDB4NmQ5ZDYxMjIKLSNkZWZpbmUgVDM2IC8qIDB4ZmRlNTM4MGMgKi8gKFRfTUFTSyBeIDB4MDIxYWM3ZjMpCi0jZGVmaW5lIFQzNyAvKiAweGE0YmVlYTQ0ICovIChUX01BU0sgXiAweDViNDExNWJiKQotI2RlZmluZSBUMzggICAgMHg0YmRlY2ZhOQotI2RlZmluZSBUMzkgLyogMHhmNmJiNGI2MCAqLyAoVF9NQVNLIF4gMHgwOTQ0YjQ5ZikKLSNkZWZpbmUgVDQwIC8qIDB4YmViZmJjNzAgKi8gKFRfTUFTSyBeIDB4NDE0MDQzOGYpCi0jZGVmaW5lIFQ0MSAgICAweDI4OWI3ZWM2Ci0jZGVmaW5lIFQ0MiAvKiAweGVhYTEyN2ZhICovIChUX01BU0sgXiAweDE1NWVkODA1KQotI2RlZmluZSBUNDMgLyogMHhkNGVmMzA4NSAqLyAoVF9NQVNLIF4gMHgyYjEwY2Y3YSkKLSNkZWZpbmUgVDQ0ICAgIDB4MDQ4ODFkMDUKLSNkZWZpbmUgVDQ1IC8qIDB4ZDlkNGQwMzkgKi8gKFRfTUFTSyBeIDB4MjYyYjJmYzYpCi0jZGVmaW5lIFQ0NiAvKiAweGU2ZGI5OWU1ICovIChUX01BU0sgXiAweDE5MjQ2NjFhKQotI2RlZmluZSBUNDcgICAgMHgxZmEyN2NmOAotI2RlZmluZSBUNDggLyogMHhjNGFjNTY2NSAqLyAoVF9NQVNLIF4gMHgzYjUzYTk5YSkKLSNkZWZpbmUgVDQ5IC8qIDB4ZjQyOTIyNDQgKi8gKFRfTUFTSyBeIDB4MGJkNmRkYmIpCi0jZGVmaW5lIFQ1MCAgICAweDQzMmFmZjk3Ci0jZGVmaW5lIFQ1MSAvKiAweGFiOTQyM2E3ICovIChUX01BU0sgXiAweDU0NmJkYzU4KQotI2RlZmluZSBUNTIgLyogMHhmYzkzYTAzOSAqLyAoVF9NQVNLIF4gMHgwMzZjNWZjNikKLSNkZWZpbmUgVDUzICAgIDB4NjU1YjU5YzMKLSNkZWZpbmUgVDU0IC8qIDB4OGYwY2NjOTIgKi8gKFRfTUFTSyBeIDB4NzBmMzMzNmQpCi0jZGVmaW5lIFQ1NSAvKiAweGZmZWZmNDdkICovIChUX01BU0sgXiAweDAwMTAwYjgyKQotI2RlZmluZSBUNTYgLyogMHg4NTg0NWRkMSAqLyAoVF9NQVNLIF4gMHg3YTdiYTIyZSkKLSNkZWZpbmUgVDU3ICAgIDB4NmZhODdlNGYKLSNkZWZpbmUgVDU4IC8qIDB4ZmUyY2U2ZTAgKi8gKFRfTUFTSyBeIDB4MDFkMzE5MWYpCi0jZGVmaW5lIFQ1OSAvKiAweGEzMDE0MzE0ICovIChUX01BU0sgXiAweDVjZmViY2ViKQotI2RlZmluZSBUNjAgICAgMHg0ZTA4MTFhMQotI2RlZmluZSBUNjEgLyogMHhmNzUzN2U4MiAqLyAoVF9NQVNLIF4gMHgwOGFjODE3ZCkKLSNkZWZpbmUgVDYyIC8qIDB4YmQzYWYyMzUgKi8gKFRfTUFTSyBeIDB4NDJjNTBkY2EpCi0jZGVmaW5lIFQ2MyAgICAweDJhZDdkMmJiCi0jZGVmaW5lIFQ2NCAvKiAweGViODZkMzkxICovIChUX01BU0sgXiAweDE0NzkyYzZlKQotCi0KLXN0YXRpYyB2b2lkCi1tZDVfcHJvY2VzcyhtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhIC8qWzY0XSovKQotewotICAgIG1kNV93b3JkX3QKLQlhID0gcG1zLT5hYmNkWzBdLCBiID0gcG1zLT5hYmNkWzFdLAotCWMgPSBwbXMtPmFiY2RbMl0sIGQgPSBwbXMtPmFiY2RbM107Ci0gICAgbWQ1X3dvcmRfdCB0OwotI2lmIEJZVEVfT1JERVIgPiAwCi0gICAgLyogRGVmaW5lIHN0b3JhZ2Ugb25seSBmb3IgYmlnLWVuZGlhbiBDUFVzLiAqLwotICAgIG1kNV93b3JkX3QgWFsxNl07Ci0jZWxzZQotICAgIC8qIERlZmluZSBzdG9yYWdlIGZvciBsaXR0bGUtZW5kaWFuIG9yIGJvdGggdHlwZXMgb2YgQ1BVcy4gKi8KLSAgICBtZDVfd29yZF90IHhidWZbMTZdOwotICAgIGNvbnN0IG1kNV93b3JkX3QgKlg7Ci0jZW5kaWYKLQotICAgIHsKLSNpZiBCWVRFX09SREVSID09IDAKLQkvKgotCSAqIERldGVybWluZSBkeW5hbWljYWxseSB3aGV0aGVyIHRoaXMgaXMgYSBiaWctZW5kaWFuIG9yCi0JICogbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBzaW5jZSB3ZSBjYW4gdXNlIGEgbW9yZSBlZmZpY2llbnQKLQkgKiBhbGdvcml0aG0gb24gdGhlIGxhdHRlci4KLQkgKi8KLQlzdGF0aWMgY29uc3QgaW50IHcgPSAxOwotCi0JaWYgKCooKGNvbnN0IG1kNV9ieXRlX3QgKikmdykpIC8qIGR5bmFtaWMgbGl0dGxlLWVuZGlhbiAqLwotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA8PSAwCQkvKiBsaXR0bGUtZW5kaWFuICovCi0JewotCSAgICAvKgotCSAgICAgKiBPbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCB3ZSBjYW4gcHJvY2VzcyBwcm9wZXJseSBhbGlnbmVkCi0JICAgICAqIGRhdGEgd2l0aG91dCBjb3B5aW5nIGl0LgotCSAgICAgKi8KLQkgICAgaWYgKCEoKGRhdGEgLSAoY29uc3QgbWQ1X2J5dGVfdCAqKTApICYgMykpIHsKLQkJLyogZGF0YSBhcmUgcHJvcGVybHkgYWxpZ25lZCAqLwotCQlYID0gKGNvbnN0IG1kNV93b3JkX3QgKilkYXRhOwotCSAgICB9IGVsc2UgewotCQkvKiBub3QgYWxpZ25lZCAqLwotCQltZW1jcHkoeGJ1ZiwgZGF0YSwgNjQpOwotCQlYID0geGJ1ZjsKLQkgICAgfQotCX0KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPT0gMAotCWVsc2UJCQkvKiBkeW5hbWljIGJpZy1lbmRpYW4gKi8KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPj0gMAkJLyogYmlnLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gYmlnLWVuZGlhbiBtYWNoaW5lcywgd2UgbXVzdCBhcnJhbmdlIHRoZSBieXRlcyBpbiB0aGUKLQkgICAgICogcmlnaHQgb3JkZXIuCi0JICAgICAqLwotCSAgICBjb25zdCBtZDVfYnl0ZV90ICp4cCA9IGRhdGE7Ci0JICAgIGludCBpOwotCi0jICBpZiBCWVRFX09SREVSID09IDAKLQkgICAgWCA9IHhidWY7CQkvKiAoZHluYW1pYyBvbmx5KSAqLwotIyAgZWxzZQotIyAgICBkZWZpbmUgeGJ1ZiBYCQkvKiAoc3RhdGljIG9ubHkpICovCi0jICBlbmRpZgotCSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSwgeHAgKz0gNCkKLQkJeGJ1ZltpXSA9IHhwWzBdICsgKHhwWzFdIDw8IDgpICsgKHhwWzJdIDw8IDE2KSArICh4cFszXSA8PCAyNCk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0jZGVmaW5lIFJPVEFURV9MRUZUKHgsIG4pICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMiAtIChuKSkpKQotCi0gICAgLyogUm91bmQgMS4gKi8KLSAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgYSA9IGIgKyAoKGEgKyBGKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKH4oeCkgJiAoeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEYoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA3LCAgVDEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMSwgMTIsICBUMik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNywgIFQzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDMsIDIyLCAgVDQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgNCwgIDcsICBUNSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA1LCAxMiwgIFQ2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE3LCAgVDcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNywgMjIsICBUOCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNywgIFQ5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDksIDEyLCBUMTApOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMCwgMTcsIFQxMSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDExLCAyMiwgVDEyKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA3LCBUMTMpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMywgMTIsIFQxNCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNywgVDE1KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTUsIDIyLCBUMTYpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFJvdW5kIDIuICovCi0gICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICBhID0gYiArICgoYSArIEcoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgfih6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgRyhiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDEsICA1LCBUMTcpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNiwgIDksIFQxOCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNCwgVDE5KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDAsIDIwLCBUMjApOwotICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDUsIFQyMSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEwLCAgOSwgVDIyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE0LCBUMjMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNCwgMjAsIFQyNCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA5LCAgNSwgVDI1KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTQsICA5LCBUMjYpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTQsIFQyNyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA4LCAyMCwgVDI4KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA1LCBUMjkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMiwgIDksIFQzMCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA3LCAxNCwgVDMxKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTIsIDIwLCBUMzIpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFJvdW5kIDMuICovCi0gICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICBhID0gYiArICgoYSArIEgoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEgoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNCwgVDMzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDgsIDExLCBUMzQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTYsIFQzNSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDE0LCAyMywgVDM2KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDEsICA0LCBUMzcpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNCwgMTEsIFQzOCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA3LCAxNiwgVDM5KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTAsIDIzLCBUNDApOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDQsIFQ0MSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAwLCAxMSwgVDQyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE2LCBUNDMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNiwgMjMsIFQ0NCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA5LCAgNCwgVDQ1KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTIsIDExLCBUNDYpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTYsIFQ0Nyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAyLCAyMywgVDQ4KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCA0LiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBJKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCB+KHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBJKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDYsIFQ0OSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA3LCAxMCwgVDUwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE1LCBUNTEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNSwgMjEsIFQ1Mik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNiwgVDUzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDMsIDEwLCBUNTQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMCwgMTUsIFQ1NSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAxLCAyMSwgVDU2KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA2LCBUNTcpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxNSwgMTAsIFQ1OCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNSwgVDU5KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTMsIDIxLCBUNjApOwotICAgIFNFVChhLCBiLCBjLCBkLCAgNCwgIDYsIFQ2MSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDExLCAxMCwgVDYyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE1LCBUNjMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgOSwgMjEsIFQ2NCk7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogVGhlbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zLiAoVGhhdCBpcyBpbmNyZW1lbnQgZWFjaAotICAgICAgICBvZiB0aGUgZm91ciByZWdpc3RlcnMgYnkgdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgdGhpcyBibG9jawotICAgICAgICB3YXMgc3RhcnRlZC4pICovCi0gICAgcG1zLT5hYmNkWzBdICs9IGE7Ci0gICAgcG1zLT5hYmNkWzFdICs9IGI7Ci0gICAgcG1zLT5hYmNkWzJdICs9IGM7Ci0gICAgcG1zLT5hYmNkWzNdICs9IGQ7Ci19Ci0KLXZvaWQKLW1kNV9pbml0KG1kNV9zdGF0ZV90ICpwbXMpCi17Ci0gICAgcG1zLT5jb3VudFswXSA9IHBtcy0+Y291bnRbMV0gPSAwOwotICAgIHBtcy0+YWJjZFswXSA9IDB4Njc0NTIzMDE7Ci0gICAgcG1zLT5hYmNkWzFdID0gLyoweGVmY2RhYjg5Ki8gVF9NQVNLIF4gMHgxMDMyNTQ3NjsKLSAgICBwbXMtPmFiY2RbMl0gPSAvKjB4OThiYWRjZmUqLyBUX01BU0sgXiAweDY3NDUyMzAxOwotICAgIHBtcy0+YWJjZFszXSA9IDB4MTAzMjU0NzY7Ci19Ci0KLXZvaWQKLW1kNV9hcHBlbmQobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSwgaW50IG5ieXRlcykKLXsKLSAgICBjb25zdCBtZDVfYnl0ZV90ICpwID0gZGF0YTsKLSAgICBpbnQgbGVmdCA9IG5ieXRlczsKLSAgICBpbnQgb2Zmc2V0ID0gKHBtcy0+Y291bnRbMF0gPj4gMykgJiA2MzsKLSAgICBtZDVfd29yZF90IG5iaXRzID0gKG1kNV93b3JkX3QpKG5ieXRlcyA8PCAzKTsKLQotICAgIGlmIChuYnl0ZXMgPD0gMCkKLQlyZXR1cm47Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoLiAqLwotICAgIHBtcy0+Y291bnRbMV0gKz0gbmJ5dGVzID4+IDI5OwotICAgIHBtcy0+Y291bnRbMF0gKz0gbmJpdHM7Ci0gICAgaWYgKHBtcy0+Y291bnRbMF0gPCBuYml0cykKLQlwbXMtPmNvdW50WzFdKys7Ci0KLSAgICAvKiBQcm9jZXNzIGFuIGluaXRpYWwgcGFydGlhbCBibG9jay4gKi8KLSAgICBpZiAob2Zmc2V0KSB7Ci0JaW50IGNvcHkgPSAob2Zmc2V0ICsgbmJ5dGVzID4gNjQgPyA2NCAtIG9mZnNldCA6IG5ieXRlcyk7Ci0KLQltZW1jcHkocG1zLT5idWYgKyBvZmZzZXQsIHAsIGNvcHkpOwotCWlmIChvZmZzZXQgKyBjb3B5IDwgNjQpCi0JICAgIHJldHVybjsKLQlwICs9IGNvcHk7Ci0JbGVmdCAtPSBjb3B5OwotCW1kNV9wcm9jZXNzKHBtcywgcG1zLT5idWYpOwotICAgIH0KLQotICAgIC8qIFByb2Nlc3MgZnVsbCBibG9ja3MuICovCi0gICAgZm9yICg7IGxlZnQgPj0gNjQ7IHAgKz0gNjQsIGxlZnQgLT0gNjQpCi0JbWQ1X3Byb2Nlc3MocG1zLCBwKTsKLQotICAgIC8qIFByb2Nlc3MgYSBmaW5hbCBwYXJ0aWFsIGJsb2NrLiAqLwotICAgIGlmIChsZWZ0KQotCW1lbWNweShwbXMtPmJ1ZiwgcCwgbGVmdCk7Ci19Ci0KLXZvaWQKLW1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKQotewotICAgIHN0YXRpYyBjb25zdCBtZDVfYnl0ZV90IHBhZFs2NF0gPSB7Ci0JMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotICAgIH07Ci0gICAgbWQ1X2J5dGVfdCBkYXRhWzhdOwotICAgIGludCBpOwotCi0gICAgLyogU2F2ZSB0aGUgbGVuZ3RoIGJlZm9yZSBwYWRkaW5nLiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JZGF0YVtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmNvdW50W2kgPj4gMl0gPj4gKChpICYgMykgPDwgMykpOwotICAgIC8qIFBhZCB0byA1NiBieXRlcyBtb2QgNjQuICovCi0gICAgbWQ1X2FwcGVuZChwbXMsIHBhZCwgKCg1NSAtIChwbXMtPmNvdW50WzBdID4+IDMpKSAmIDYzKSArIDEpOwotICAgIC8qIEFwcGVuZCB0aGUgbGVuZ3RoLiAqLwotICAgIG1kNV9hcHBlbmQocG1zLCBkYXRhLCA4KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKLQlkaWdlc3RbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5hYmNkW2kgPj4gMl0gPj4gKChpICYgMykgPDwgMykpOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGM5OTUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLS8qICRJZDogbWQ1LmgsdiAxLjQgMjAwMi8wNC8xMyAxOToyMDoyOCBscGQgRXhwICQgKi8KLS8qCi0gIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgotCi0gIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCi0gIHRleHQgaXMgYXZhaWxhYmxlIGF0Ci0JaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKLSAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQotICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKLSAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZwotICBjb3B5cmlnaHRlZC4KLQotICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmggaXMgTC4gUGV0ZXIgRGV1dHNjaAotICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5Ci0gIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKLQotICAyMDAyLTA0LTEzIGxwZCBSZW1vdmVkIHN1cHBvcnQgZm9yIG5vbi1BTlNJIGNvbXBpbGVyczsgcmVtb3ZlZAotCXJlZmVyZW5jZXMgdG8gR2hvc3RzY3JpcHQ7IGNsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7Ci0Jbm93IGhhbmRsZXMgYnl0ZSBvcmRlciBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseS4KLSAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCi0gIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSk7Ci0JYWRkZWQgY29uZGl0aW9uYWxpemF0aW9uIGZvciBDKysgY29tcGlsYXRpb24gZnJvbSBNYXJ0aW4KLQlQdXJzY2hrZSA8cHVyc2Noa2VAYm5sLmdvdj4uCi0gIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBtZDVfSU5DTFVERUQKLSMgIGRlZmluZSBtZDVfSU5DTFVERUQKLQotLyoKLSAqIFRoaXMgcGFja2FnZSBzdXBwb3J0cyBib3RoIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgZGV0ZXJtaW5hdGlvbiBvZiBDUFUKLSAqIGJ5dGUgb3JkZXIuICBJZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZCBhcyAwLCB0aGUgY29kZSB3aWxsIGJlCi0gKiBjb21waWxlZCB0byBydW4gb25seSBvbiBsaXR0bGUtZW5kaWFuIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcwotICogZGVmaW5lZCBhcyBub24temVybywgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0byBydW4gb25seSBvbiBiaWctZW5kaWFuCi0gKiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgbm90IGRlZmluZWQsIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8KLSAqIHJ1biBvbiBlaXRoZXIgYmlnLSBvciBsaXR0bGUtZW5kaWFuIENQVXMsIGJ1dCB3aWxsIHJ1biBzbGlnaHRseSBsZXNzCi0gKiBlZmZpY2llbnRseSBvbiBlaXRoZXIgb25lIHRoYW4gaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQuCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1kNV9ieXRlX3Q7IC8qIDgtYml0IGJ5dGUgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IG1kNV93b3JkX3Q7IC8qIDMyLWJpdCB3b3JkICovCi0KLS8qIERlZmluZSB0aGUgc3RhdGUgb2YgdGhlIE1ENSBBbGdvcml0aG0uICovCi10eXBlZGVmIHN0cnVjdCBtZDVfc3RhdGVfcyB7Ci0gICAgbWQ1X3dvcmRfdCBjb3VudFsyXTsJLyogbWVzc2FnZSBsZW5ndGggaW4gYml0cywgbHN3IGZpcnN0ICovCi0gICAgbWQ1X3dvcmRfdCBhYmNkWzRdOwkJLyogZGlnZXN0IGJ1ZmZlciAqLwotICAgIG1kNV9ieXRlX3QgYnVmWzY0XTsJCS8qIGFjY3VtdWxhdGUgYmxvY2sgKi8KLX0gbWQ1X3N0YXRlX3Q7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiAKLXsKLSNlbmRpZgotCi0vKiBJbml0aWFsaXplIHRoZSBhbGdvcml0aG0uICovCi12b2lkIG1kNV9pbml0KG1kNV9zdGF0ZV90ICpwbXMpOwotCi0vKiBBcHBlbmQgYSBzdHJpbmcgdG8gdGhlIG1lc3NhZ2UuICovCi12b2lkIG1kNV9hcHBlbmQobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSwgaW50IG5ieXRlcyk7Ci0KLS8qIEZpbmlzaCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBkaWdlc3QuICovCi12b2lkIG1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBlbmQgZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBtZDVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvcGFyc2UuY2MgYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU1NjUyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvcGFyc2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0KLSNpbmNsdWRlICJtZDUuaCIKLQotdm9pZCB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICBzdGQ6OnN0cmluZyBtYXRlcmlhbCA9IGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICBtZDVfc3RhdGVfdCBjdHg7Ci0gIG1kNV9pbml0KCZjdHgpOwotICBtZDVfYXBwZW5kKCZjdHgsIChtZDVfYnl0ZV90KikobWF0ZXJpYWwuZGF0YSgpKSwgKGludCltYXRlcmlhbC5zaXplKCkpOwotICBtZDVfZmluaXNoKCZjdHgsIChtZDVfYnl0ZV90KilmaW5nZXJwcmludF8pOwotfQotCi10X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGhpczsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLSAgcmV0dXJuIHR5cGU7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Njc3MmIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Jhc2VfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0JBU0VfVFlQRV9ICi0jZGVmaW5lIFRfQkFTRV9UWVBFX0gKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0KLS8qKgotICogQSB0aHJpZnQgYmFzZSB0eXBlLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUgZGVmaW5lZCBlbnVtZXJhdGVkIHR5cGVzIGluc2lkZQotICogdGhpcyBkZWZpbml0aW9uLgotICoKLSAqLwotY2xhc3MgdF9iYXNlX3R5cGUgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBFbnVtZXJhdGlvbiBvZiB0aHJpZnQgYmFzZSB0eXBlcwotICAgKi8KLSAgZW51bSB0X2Jhc2UgewotICAgIFRZUEVfVk9JRCwKLSAgICBUWVBFX1NUUklORywKLSAgICBUWVBFX0JPT0wsCi0gICAgVFlQRV9CWVRFLAotICAgIFRZUEVfSTE2LAotICAgIFRZUEVfSTMyLAotICAgIFRZUEVfSTY0LAotICAgIFRZUEVfRE9VQkxFCi0gIH07Ci0KLSAgdF9iYXNlX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF9iYXNlIGJhc2UpIDoKLSAgICB0X3R5cGUobmFtZSksCi0gICAgYmFzZV8oYmFzZSksCi0gICAgc3RyaW5nX2xpc3RfKGZhbHNlKSwKLSAgICBiaW5hcnlfKGZhbHNlKSwKLSAgICBzdHJpbmdfZW51bV8oZmFsc2Upe30KLQotICB0X2Jhc2UgZ2V0X2Jhc2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfOwotICB9Ci0KLSAgYm9vbCBpc192b2lkKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX1ZPSUQ7Ci0gIH0KLQotICBib29sIGlzX3N0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkc7Ci0gIH0KLQotICBib29sIGlzX2Jvb2woKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfQk9PTDsKLSAgfQotCi0gIHZvaWQgc2V0X3N0cmluZ19saXN0KGJvb2wgdmFsKSB7Ci0gICAgc3RyaW5nX2xpc3RfID0gdmFsOwotICB9Ci0KLSAgYm9vbCBpc19zdHJpbmdfbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBzdHJpbmdfbGlzdF87Ci0gIH0KLQotICB2b2lkIHNldF9iaW5hcnkoYm9vbCB2YWwpIHsKLSAgICBiaW5hcnlfID0gdmFsOwotICB9Ci0KLSAgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlXyA9PSBUWVBFX1NUUklORykgJiYgYmluYXJ5XzsKLSAgfQotCi0gIHZvaWQgc2V0X3N0cmluZ19lbnVtKGJvb2wgdmFsKSB7Ci0gICAgc3RyaW5nX2VudW1fID0gdmFsOwotICB9Ci0KLSAgYm9vbCBpc19zdHJpbmdfZW51bSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkcgJiYgc3RyaW5nX2VudW1fOwotICB9Ci0KLSAgdm9pZCBhZGRfc3RyaW5nX2VudW1fdmFsKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHN0cmluZ19lbnVtX3ZhbHNfLnB1c2hfYmFjayh2YWwpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfc3RyaW5nX2VudW1fdmFscygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyaW5nX2VudW1fdmFsc187Ci0gIH0KLQotICBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJ2ID0gdF9iYXNlX25hbWUoYmFzZV8pOwotICAgIGlmIChydiA9PSAiKHVua25vd24pIikgewotICAgICAgdGhyb3cgIkJVRzogQ2FuJ3QgZ2V0IGZpbmdlcnByaW50IG1hdGVyaWFsIGZvciB0aGlzIGJhc2UgdHlwZS4iOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgdF9iYXNlX25hbWUodF9iYXNlIHRiYXNlKSB7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSBUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJ2b2lkIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfU1RSSU5HIDogcmV0dXJuICAgICJzdHJpbmciOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9CT09MICAgOiByZXR1cm4gICAgICAiYm9vbCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJieXRlIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfSTE2ICAgIDogcmV0dXJuICAgICAgICJpMTYiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgImkzMiI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiaTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfRE9VQkxFIDogcmV0dXJuICAgICJkb3VibGUiOyBicmVhazsKLSAgICAgIGRlZmF1bHQgICAgICAgICAgOiByZXR1cm4gIih1bmtub3duKSI7IGJyZWFrOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdF9iYXNlIGJhc2VfOwotCi0gIGJvb2wgc3RyaW5nX2xpc3RfOwotICBib29sIGJpbmFyeV87Ci0gIGJvb2wgc3RyaW5nX2VudW1fOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nX2VudW1fdmFsc187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDgxYmQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05TVF9ICi0jZGVmaW5lIFRfQ09OU1RfSAotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9jb25zdF92YWx1ZS5oIgotCi0vKioKLSAqIEEgY29uc3QgaXMgYSBjb25zdGFudCB2YWx1ZSBkZWZpbmVkIGFjcm9zcyBsYW5ndWFnZXMgdGhhdCBoYXMgYSB0eXBlIGFuZAotICogYSB2YWx1ZS4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBtaWdodCBub3QgbWF0Y2ggdGhlIHR5cGUKLSAqIG9mIHRoZSB2YWx1ZSBvYmplY3QsIHNpbmNlIHRoYXQgaXMgbm90IGRldGVybWluZWQgdW50aWwgYWZ0ZXIgcGFyc2luZyB0aGUKLSAqIHdob2xlIHRoaW5nIG91dC4KLSAqCi0gKi8KLWNsYXNzIHRfY29uc3QgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9jb25zdCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSA6Ci0gICAgdHlwZV8odHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgdmFsdWVfKHZhbHVlKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0MjJhZS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05TVF9WQUxVRV9ICi0jZGVmaW5lIFRfQ09OU1RfVkFMVUVfSAotCi0jaW5jbHVkZSAidF9lbnVtLmgiCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qKgotICogQSBjb25zdCB2YWx1ZSBpcyBzb21ldGhpbmcgcGFyc2VkIHRoYXQgY291bGQgYmUgYSBtYXAsIHNldCwgbGlzdCwgc3RydWN0Ci0gKiBvciB3aGF0ZXZlci4KLSAqCi0gKi8KLWNsYXNzIHRfY29uc3RfdmFsdWUgewotIHB1YmxpYzoKLQotICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7Ci0gICAgQ1ZfSU5URUdFUiwKLSAgICBDVl9ET1VCTEUsCi0gICAgQ1ZfU1RSSU5HLAotICAgIENWX01BUCwKLSAgICBDVl9MSVNULAotICAgIENWX0lERU5USUZJRVIKLSAgfTsKLQotICB0X2NvbnN0X3ZhbHVlKCkge30KLQotICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSB7Ci0gICAgc2V0X2ludGVnZXIodmFsKTsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgc2V0X3N0cmluZyh2YWwpOwotICB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfU1RSSU5HOwotICAgIHN0cmluZ1ZhbF8gPSB2YWw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfc3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBzdHJpbmdWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfaW50ZWdlcihpbnQ2NF90IHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfSU5URUdFUjsKLSAgICBpbnRWYWxfID0gdmFsOwotICB9Ci0KLSAgaW50NjRfdCBnZXRfaW50ZWdlcigpIGNvbnN0IHsKLSAgICBpZiAodmFsVHlwZV8gPT0gQ1ZfSURFTlRJRklFUikgewotICAgICAgaWYgKGVudW1fID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgImhhdmUgaWRlbnRpZmllciBcIiIgKyBnZXRfaWRlbnRpZmllcigpICsgIlwiLCBidXQgdW5zZXQgZW51bSBvbiBsaW5lISI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyID0gZ2V0X2lkZW50aWZpZXIoKTsKLSAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90ID0gaWRlbnRpZmllci5yZmluZCgnLicpOwotICAgICAgaWYgKGRvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5zdWJzdHIoZG90KzEpOwotICAgICAgfQotICAgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSBlbnVtXy0+Z2V0X2NvbnN0YW50X2J5X25hbWUoaWRlbnRpZmllcik7Ci0gICAgICBpZiAodmFsID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgZW51bSB2YWx1ZSBcIiIgKyBpZGVudGlmaWVyICsKLSAgICAgICAgICAiXCIgaW4gZW51bSBcIiIgKyBlbnVtXy0+Z2V0X25hbWUoKSArICJcIiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdmFsLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGludFZhbF87Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX0RPVUJMRTsKLSAgICBkb3VibGVWYWxfID0gdmFsOwotICB9Ci0KLSAgZG91YmxlIGdldF9kb3VibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvdWJsZVZhbF87Ci0gIH0KLQotICB2b2lkIHNldF9tYXAoKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9NQVA7Ci0gIH0KLQotICB2b2lkIGFkZF9tYXAodF9jb25zdF92YWx1ZSoga2V5LCB0X2NvbnN0X3ZhbHVlKiB2YWwpIHsKLSAgICBtYXBWYWxfW2tleV0gPSB2YWw7Ci0gIH0KLQotICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBnZXRfbWFwKCkgY29uc3QgewotICAgIHJldHVybiBtYXBWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfbGlzdCgpIHsKLSAgICB2YWxUeXBlXyA9IENWX0xJU1Q7Ci0gIH0KLQotICB2b2lkIGFkZF9saXN0KHRfY29uc3RfdmFsdWUqIHZhbCkgewotICAgIGxpc3RWYWxfLnB1c2hfYmFjayh2YWwpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBnZXRfbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbGlzdFZhbF87Ci0gIH0KLQotICB2b2lkIHNldF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfSURFTlRJRklFUjsKLSAgICBpZGVudGlmaWVyVmFsXyA9IHZhbDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyKCkgY29uc3QgewotICAgIHJldHVybiBpZGVudGlmaWVyVmFsXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX25hbWUoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKLSAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7Ci0gICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOwotICAgIH0KLSAgICByZXQgPSByZXQuc3Vic3RyKHMrMSk7Ci0gICAgcyA9IHJldC5maW5kKCcuJyk7Ci0gICAgaWYgKHMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldCA9IHJldC5zdWJzdHIocysxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7Ci0gICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOwotICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKLSAgICB9Ci0gICAgc2l6ZV90IHMyID0gcmV0LmZpbmQoJy4nLCBzKzEpOwotICAgIGlmIChzMiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcmV0ID0gcmV0LnN1YnN0cihzKzEpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgdm9pZCBzZXRfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gICAgZW51bV8gPSB0ZW51bTsKLSAgfQotCi0gIHRfY29uc3RfdmFsdWVfdHlwZSBnZXRfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsVHlwZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwVmFsXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RWYWxfOwotICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxfOwotICBpbnQ2NF90IGludFZhbF87Ci0gIGRvdWJsZSBkb3VibGVWYWxfOwotICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyVmFsXzsKLSAgdF9lbnVtKiBlbnVtXzsKLQotICB0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsVHlwZV87Ci0KLX07Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTM0OTMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OVEFJTkVSX0gKLSNkZWZpbmUgVF9DT05UQUlORVJfSAotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0KLWNsYXNzIHRfY29udGFpbmVyIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0X2NvbnRhaW5lcigpIDoKLSAgICBjcHBfbmFtZV8oKSwKLSAgICBoYXNfY3BwX25hbWVfKGZhbHNlKSB7fQotCi0gIHZpcnR1YWwgfnRfY29udGFpbmVyKCkge30KLQotICB2b2lkIHNldF9jcHBfbmFtZShzdGQ6OnN0cmluZyBjcHBfbmFtZSkgewotICAgIGNwcF9uYW1lXyA9IGNwcF9uYW1lOwotICAgIGhhc19jcHBfbmFtZV8gPSB0cnVlOwotICB9Ci0KLSAgYm9vbCBoYXNfY3BwX25hbWUoKSB7Ci0gICAgcmV0dXJuIGhhc19jcHBfbmFtZV87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfY3BwX25hbWUoKSB7Ci0gICAgcmV0dXJuIGNwcF9uYW1lXzsKLSAgfQotCi0gIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBjcHBfbmFtZV87Ci0gIGJvb2wgaGFzX2NwcF9uYW1lXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZG9jLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZG9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjA2OGMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRE9DX0gKLSNkZWZpbmUgVF9ET0NfSAotCi0vKioKLSAqIERvY3VtZW50YXRpb24gc3R1YnMKLSAqCi0gKi8KLWNsYXNzIHRfZG9jIHsKLQotIHB1YmxpYzoKLSAgdF9kb2MoKSA6IGhhc19kb2NfKGZhbHNlKSB7fQotCi0gIHZvaWQgc2V0X2RvYyhjb25zdCBzdGQ6OnN0cmluZyYgZG9jKSB7Ci0gICAgZG9jXyA9IGRvYzsKLSAgICBoYXNfZG9jXyA9IHRydWU7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2RvYygpIGNvbnN0IHsKLSAgICByZXR1cm4gZG9jXzsKLSAgfQotCi0gIGJvb2wgaGFzX2RvYygpIHsKLSAgICByZXR1cm4gaGFzX2RvY187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGRvY187Ci0gIGJvb2wgaGFzX2RvY187Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDE2MDYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0VOVU1fSAotI2RlZmluZSBUX0VOVU1fSAotCi0jaW5jbHVkZSAidF9lbnVtX3ZhbHVlLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0vKioKLSAqIEFuIGVudW1lcmF0ZWQgdHlwZS4gQSBsaXN0IG9mIGNvbnN0YW50IG9iamVjdHMgd2l0aCBhIG5hbWUgZm9yIHRoZSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9lbnVtIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0X2VudW0odF9wcm9ncmFtKiBwcm9ncmFtKSA6Ci0gICAgdF90eXBlKHByb2dyYW0pIHt9Ci0KLSAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIG5hbWVfID0gbmFtZTsKLSAgfQotCi0gIHZvaWQgYXBwZW5kKHRfZW51bV92YWx1ZSogY29uc3RhbnQpIHsKLSAgICBjb25zdGFudHNfLnB1c2hfYmFjayhjb25zdGFudCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZ2V0X2NvbnN0YW50cygpIHsKLSAgICByZXR1cm4gY29uc3RhbnRzXzsKLSAgfQotCi0gIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAqY19pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID09IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAqY19pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJvb2wgaXNfZW51bSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAiZW51bSI7Ci0gIH0KLQotICB2b2lkIHJlc29sdmVfdmFsdWVzKCkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGludCBsYXN0VmFsdWUgPSAtMTsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICghICgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgICAgKCpjX2l0ZXIpLT5zZXRfdmFsdWUoKytsYXN0VmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbGFzdFZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50c187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODNhODdlLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9FTlVNX1ZBTFVFX0gKLSNkZWZpbmUgVF9FTlVNX1ZBTFVFX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIEEgY29uc3RhbnQuIFRoZXNlIGFyZSB1c2VkIGluc2lkZSBvZiBlbnVtIGRlZmluaXRpb25zLiBDb25zdGFudHMgYXJlIGp1c3QKLSAqIHN5bWJvbCBpZGVudGlmaWVycyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gZXhwbGljaXQgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCB0aGVtLgotICoKLSAqLwotY2xhc3MgdF9lbnVtX3ZhbHVlIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgbmFtZV8obmFtZSksCi0gICAgaGFzX3ZhbHVlXyhmYWxzZSksCi0gICAgdmFsdWVfKDApIHt9Ci0KLSAgdF9lbnVtX3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgOgotICAgIG5hbWVfKG5hbWUpLAotICAgIGhhc192YWx1ZV8odHJ1ZSksCi0gICAgdmFsdWVfKHZhbHVlKSB7fQotCi0gIH50X2VudW1fdmFsdWUoKSB7fQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICBib29sIGhhc192YWx1ZSgpIHsKLSAgICByZXR1cm4gaGFzX3ZhbHVlXzsKLSAgfQotCi0gIGludCBnZXRfdmFsdWUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3ZhbHVlKGludCB2YWwpIHsKLSAgICBoYXNfdmFsdWVfID0gdHJ1ZTsKLSAgICB2YWx1ZV8gPSB2YWw7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBib29sIGhhc192YWx1ZV87Ci0gIGludCB2YWx1ZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjM2MyYjEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRklFTERfSAotI2RlZmluZSBUX0ZJRUxEX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAidF9kb2MuaCIKLQotLy8gRm9yd2FyZCBkZWNsYXJlIGZvciB4c2RfYXR0cnMKLWNsYXNzIHRfc3RydWN0OwotCi0vKioKLSAqIENsYXNzIHRvIHJlcHJlc2VudCBhIGZpZWxkIGluIGEgdGhyaWZ0IHN0cnVjdHVyZS4gQSBmaWVsZCBoYXMgYSBkYXRhIHR5cGUsCi0gKiBhIHN5bWJvbGljIG5hbWUsIGFuZCBhIG51bWVyaWMgaWRlbnRpZmllci4KLSAqCi0gKi8KLWNsYXNzIHRfZmllbGQgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBrZXlfKDApLAotICAgIHZhbHVlXyhOVUxMKSwKLSAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKLSAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKLSAgICB4c2RfYXR0cnNfKE5VTEwpIHt9Ci0KLSAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KSA6Ci0gICAgdHlwZV8odHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAga2V5XyhrZXkpLAotICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCi0gICAgdmFsdWVfKE5VTEwpLAotICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAotICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAotICAgIHhzZF9hdHRyc18oTlVMTCkge30KLQotICB+dF9maWVsZCgpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgaW50MzJfdCBnZXRfa2V5KCkgY29uc3QgewotICAgIHJldHVybiBrZXlfOwotICB9Ci0KLSAgZW51bSBlX3JlcSB7Ci0gICAgVF9SRVFVSVJFRCwKLSAgICBUX09QVElPTkFMLAotICAgIFRfT1BUX0lOX1JFUV9PVVQKLSAgfTsKLQotICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7Ci0gICAgcmVxXyA9IHJlcTsKLSAgfQotCi0gIGVfcmVxIGdldF9yZXEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlcV87Ci0gIH0KLQotICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAgIHZhbHVlXyA9IHZhbHVlOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICB2b2lkIHNldF94c2Rfb3B0aW9uYWwoYm9vbCB4c2Rfb3B0aW9uYWwpIHsKLSAgICB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgewotICAgIHJldHVybiB4c2Rfb3B0aW9uYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7Ci0gICAgeHNkX25pbGxhYmxlXyA9IHhzZF9uaWxsYWJsZTsKLSAgfQotCi0gIGJvb2wgZ2V0X3hzZF9uaWxsYWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4geHNkX25pbGxhYmxlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7Ci0gICAgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgewotICAgIHJldHVybiB4c2RfYXR0cnNfOwotICB9Ci0KLSAgLy8gVGhpcyBpcyBub3QgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdF90eXBlOjpnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwsCi0gIC8vIGJ1dCBpdCBkb2VzIHRoZSBzYW1lIHRoaW5nLgotICBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIGtleXN0bTsKLSAgICBrZXlzdG0gPDwga2V5XzsKLSAgICByZXR1cm4ga2V5c3RtLnN0cigpICsgIjoiICsKLSAgICAgICgocmVxXyA9PSBUX09QVElPTkFMKSA/ICJvcHQtIiA6ICIiKSArCi0gICAgICB0eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgotICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCi0gICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KLSAgICovCi0gIHN0cnVjdCBrZXlfY29tcGFyZSB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QgKiBjb25zdCAmIGEsIHRfZmllbGQgY29uc3QgKiBjb25zdCAmIGIpIHsKLSAgICAgIHJldHVybiBhLT5nZXRfa2V5KCkgPCBiLT5nZXRfa2V5KCk7Ci0gICAgfQotICB9OwotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGludDMyX3Qga2V5XzsKLSAgZV9yZXEgcmVxXzsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWVfOwotCi0gIGJvb2wgeHNkX29wdGlvbmFsXzsKLSAgYm9vbCB4c2RfbmlsbGFibGVfOwotICB0X3N0cnVjdCogeHNkX2F0dHJzXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJhYTZjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRlVOQ1RJT05fSAotI2RlZmluZSBUX0ZVTkNUSU9OX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8qKgotICogUmVwcmVzZW50YXRpb24gb2YgYSBmdW5jdGlvbi4gS2V5IHBhcnRzIGFyZSByZXR1cm4gdHlwZSwgZnVuY3Rpb24gbmFtZSwKLSAqIG9wdGlvbmFsIG1vZGlmaWVycywgYW5kIGFuIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGlzIGltcGxlbWVudGVkIGFzIGEgdGhyaWZ0Ci0gKiBzdHJ1Y3QuCi0gKgotICovCi1jbGFzcyB0X2Z1bmN0aW9uIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAotICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCi0gICAgICAgICAgICAgYm9vbCBvbmV3YXk9ZmFsc2UpIDoKLSAgICByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBhcmdsaXN0XyhhcmdsaXN0KSwKLSAgICBvbmV3YXlfKG9uZXdheSkgewotICAgIHhjZXB0aW9uc18gPSBuZXcgdF9zdHJ1Y3QoTlVMTCk7Ci0gIH0KLQotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAotICAgICAgICAgICAgIHRfc3RydWN0KiB4Y2VwdGlvbnMsCi0gICAgICAgICAgICAgYm9vbCBvbmV3YXk9ZmFsc2UpIDoKLSAgICByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBhcmdsaXN0XyhhcmdsaXN0KSwKLSAgICB4Y2VwdGlvbnNfKHhjZXB0aW9ucyksCi0gICAgb25ld2F5XyhvbmV3YXkpCi0gIHsKLSAgICBpZiAob25ld2F5XyAmJiAheGNlcHRpb25zXy0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7Ci0gICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT25ld2F5IG1ldGhvZHMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4iKTsKLSAgICB9Ci0gIH0KLQotICB+dF9mdW5jdGlvbigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfcmV0dXJudHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmV0dXJudHlwZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGdldF9hcmdsaXN0KCkgY29uc3QgewotICAgIHJldHVybiBhcmdsaXN0XzsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfeGNlcHRpb25zKCkgY29uc3QgewotICAgIHJldHVybiB4Y2VwdGlvbnNfOwotICB9Ci0KLSAgYm9vbCBpc19vbmV3YXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9uZXdheV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogcmV0dXJudHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICB0X3N0cnVjdCogYXJnbGlzdF87Ci0gIHRfc3RydWN0KiB4Y2VwdGlvbnNfOwotICBib29sIG9uZXdheV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWE5NjI1Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9MSVNUX0gKLSNkZWZpbmUgVF9MSVNUX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBsaXN0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9saXN0IDogcHVibGljIHRfY29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIHRfbGlzdCh0X3R5cGUqIGVsZW1fdHlwZSkgOgotICAgIGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZWxlbV90eXBlXzsKLSAgfQotCi0gIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAibGlzdDwiICsgZWxlbV90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKyAiPiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGVsZW1fdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogZWxlbV90eXBlXzsKLX07Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbWFwLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZTM1OGYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTUFQX0gKLSNkZWZpbmUgVF9NQVBfSAotCi0jaW5jbHVkZSAidF9jb250YWluZXIuaCIKLQotLyoqCi0gKiBBIG1hcCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIHR3byBkYXRhCi0gKiB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfbWFwIDogcHVibGljIHRfY29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIHRfbWFwKHRfdHlwZSoga2V5X3R5cGUsIHRfdHlwZSogdmFsX3R5cGUpIDoKLSAgICBrZXlfdHlwZV8oa2V5X3R5cGUpLAotICAgIHZhbF90eXBlXyh2YWxfdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9rZXlfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5X3R5cGVfOwotICB9Ci0KLSAgdF90eXBlKiBnZXRfdmFsX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbF90eXBlXzsKLSAgfQotCi0gIGJvb2wgaXNfbWFwKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJtYXA8IiArIGtleV90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKwotICAgICAgIiwiICsgdmFsX3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArICI+IjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAga2V5X3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIHZhbF90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiBrZXlfdHlwZV87Ci0gIHRfdHlwZSogdmFsX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwZDE1MS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1BST0dSQU1fSAotI2RlZmluZSBUX1BST0dSQU1fSAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8vIEZvciBwcm9ncmFtX25hbWUoKQotI2luY2x1ZGUgIm1haW4uaCIKLQotI2luY2x1ZGUgInRfZG9jLmgiCi0jaW5jbHVkZSAidF9zY29wZS5oIgotI2luY2x1ZGUgInRfYmFzZV90eXBlLmgiCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0jaW5jbHVkZSAidF9lbnVtLmgiCi0jaW5jbHVkZSAidF9jb25zdC5oIgotI2luY2x1ZGUgInRfc3RydWN0LmgiCi0jaW5jbHVkZSAidF9zZXJ2aWNlLmgiCi0jaW5jbHVkZSAidF9saXN0LmgiCi0jaW5jbHVkZSAidF9tYXAuaCIKLSNpbmNsdWRlICJ0X3NldC5oIgotI2luY2x1ZGUgImdlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCi0vLyNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFRvcCBsZXZlbCBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW50aXJlIHRocmlmdCBwcm9ncmFtLiBBIHByb2dyYW0gY29uc2lzdHMKLSAqIGZ1bmRhbWVudGFsbHkgb2YgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgIFR5cGVkZWZzCi0gKiAgIEVudW1lcmF0aW9ucwotICogICBDb25zdGFudHMKLSAqICAgU3RydWN0cwotICogICBFeGNlcHRpb25zCi0gKiAgIFNlcnZpY2VzCi0gKgotICogVGhlIHByb2dyYW0gbW9kdWxlIGFsc28gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9wcm9ncmFtIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcGF0aF8ocGF0aCksCi0gICAgbmFtZV8obmFtZSksCi0gICAgb3V0X3BhdGhfKCIuLyIpIHsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgICBwYXRoXyhwYXRoKSwKLSAgICBvdXRfcGF0aF8oIi4vIikgewotICAgIG5hbWVfID0gcHJvZ3JhbV9uYW1lKHBhdGgpOwotICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7Ci0gIH0KLQotICAvLyBQYXRoIGFjY2Vzc29yCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9Ci0KLSAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQotCi0gIC8vIE5hbWUgYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICAvLyBOYW1lc3BhY2UKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQotCi0gIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mICAgIGdldF9lbnVtcygpICAgICBjb25zdCB7IHJldHVybiBlbnVtc187ICAgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgICBnZXRfY29uc3RzKCkgICAgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiAgZ2V0X3N0cnVjdHMoKSAgIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyAgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mICBnZXRfb2JqZWN0cygpICAgY29uc3QgeyByZXR1cm4gb2JqZWN0c187ICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgIH0KLQotICAvLyBQcm9ncmFtIGVsZW1lbnRzCi0gIHZvaWQgYWRkX3R5cGVkZWYgICh0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyAgfQotICB2b2lkIGFkZF9lbnVtICAgICAodF9lbnVtKiAgICB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgICAgIH0KLSAgdm9pZCBhZGRfY29uc3QgICAgKHRfY29uc3QqICAgdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyAgICB9Ci0gIHZvaWQgYWRkX3N0cnVjdCAgICh0X3N0cnVjdCogIHRzKSB7IG9iamVjdHNfLnB1c2hfYmFjayh0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7ICAgfQotICB2b2lkIGFkZF94Y2VwdGlvbiAodF9zdHJ1Y3QqICB0eCkgeyBvYmplY3RzXy5wdXNoX2JhY2sodHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7IH0KLSAgdm9pZCBhZGRfc2VydmljZSAgKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7ICB9Ci0KLSAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgpIHsKLSAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKLSAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKLSAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOwotICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKLSAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTY29waW5nIGFuZCBuYW1lc3BhY2luZwotICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIG5hbWVzcGFjZV8gPSBuYW1lOwotICB9Ci0KLSAgLy8gU2NvcGUgYWNjZXNzb3IKLSAgdF9zY29wZSogc2NvcGUoKSB7Ci0gICAgcmV0dXJuIHNjb3BlXzsKLSAgfQotCi0gIC8vIEluY2x1ZGVzCi0KLSAgdm9pZCBhZGRfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBpbmNsdWRlX3NpdGUpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgpOwotCi0gICAgLy8gaW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc2l0ZSBhdCB3aGljaCBpdCB3YXMgaW5jbHVkZWQKLSAgICAvLyAobWludXMgdGhlIGZpbGVuYW1lKQotICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0ZDo6c3RyaW5nOjpucG9zOwotICAgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfc2l0ZS5yZmluZCgiLyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbmNsdWRlX3NpdGUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOwotICAgIH0KLQotICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0gICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGluY2x1ZGVzXzsKLSAgfQotCi0gIHZvaWQgc2V0X2luY2x1ZGVfcHJlZml4KHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4KSB7Ci0gICAgaW5jbHVkZV9wcmVmaXhfID0gaW5jbHVkZV9wcmVmaXg7Ci0KLSAgICAvLyB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGEgZGlyZWN0b3J5OyBhZGQgYSB0cmFpbGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKLSAgICBpbnQgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKLSAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOwotICAgIH0KLSAgfQotCi0gIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgewotICAgIGlmIChsYW5ndWFnZSAhPSAiKiIpIHsKLSAgICAgIHNpemVfdCBzdWJfaW5kZXggPSBsYW5ndWFnZS5maW5kKCcuJyk7Ci0gICAgICBzdGQ6OnN0cmluZyBiYXNlX2xhbmd1YWdlID0gbGFuZ3VhZ2Uuc3Vic3RyKDAsIHN1Yl9pbmRleCk7Ci0gICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlOwotCi0gICAgICBpZihiYXNlX2xhbmd1YWdlID09ICJzbWFsbHRhbGsiKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJOYW1lc3BhY2UgJ3NtYWxsdGFsaycgaXMgZGVwcmVjYXRlZC4gVXNlICdzdCcgaW5zdGVhZCIpOwotICAgICAgICBiYXNlX2xhbmd1YWdlID0gInN0IjsKLSAgICAgIH0KLQotICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBteV9jb3B5ID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7Ci0KLSAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0OwotICAgICAgaXQ9bXlfY29weS5maW5kKGJhc2VfbGFuZ3VhZ2UpOwotCi0gICAgICBpZiAoaXQgPT0gbXlfY29weS5lbmQoKSkgewotICAgICAgICB0aHJvdyAiTm8gZ2VuZXJhdG9yIG5hbWVkICciICsgYmFzZV9sYW5ndWFnZSArICInIGNvdWxkIGJlIGZvdW5kISI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdWJfaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZSA9IGxhbmd1YWdlLnN1YnN0cihzdWJfaW5kZXgrMSk7Ci0gICAgICAgIGlmKCEgaXQtPnNlY29uZC0+aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgdGhyb3cgYmFzZV9sYW5ndWFnZSArIiBnZW5lcmF0b3IgZG9lcyBub3QgYWNjZXB0ICciICsgc3ViX25hbWVzcGFjZSArICInIGFzIHN1Yi1uYW1lc3BhY2UhIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBpZiAoKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKGxhbmd1YWdlKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkgfHwKLSAgICAgICAgKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKCIqIiAgICAgKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICB9Ci0KLSAgLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0KLSAgdm9pZCBhZGRfY3BwX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgewotICAgIGNwcF9pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY3BwX2luY2x1ZGVzKCkgewotICAgIHJldHVybiBjcHBfaW5jbHVkZXNfOwotICB9Ci0KLSAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsKLSAgICBjX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jX2luY2x1ZGVzKCkgewotICAgIHJldHVybiBjX2luY2x1ZGVzXzsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvLyBGaWxlIHBhdGgKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLy8gTmFtZQotICBzdGQ6OnN0cmluZyBuYW1lXzsKLQotICAvLyBPdXRwdXQgZGlyZWN0b3J5Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoXzsKLQotICAvLyBOYW1lc3BhY2UKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKLQotICAvLyBJbmNsdWRlZCBwcm9ncmFtcwotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55Ci0gIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKLQotICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQotICB0X3Njb3BlKiBzY29wZV87Ci0KLSAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgotICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bSo+ICAgIGVudW1zXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+ICAgY29uc3RzXzsKLSAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiAgb2JqZWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gIHN0cnVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+ICB4Y2VwdGlvbnNfOwotICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlc187Ci0KLSAgLy8gRHluYW1pYyBuYW1lc3BhY2VzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbmFtZXNwYWNlc187Ci0KLSAgLy8gQysrIGV4dHJhIGluY2x1ZGVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcHBfaW5jbHVkZXNfOwotCi0gIC8vIEMgZXh0cmEgaW5jbHVkZXMKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNfaW5jbHVkZXNfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTdiZjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0NPUEVfSAotI2RlZmluZSBUX1NDT1BFX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0jaW5jbHVkZSAidF9iYXNlX3R5cGUuaCIKLSNpbmNsdWRlICJ0X21hcC5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKLSAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAotICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKLSAqIHBhcnNlIHRpbWUuCi0gKgotICovCi1jbGFzcyB0X3Njb3BlIHsKLSBwdWJsaWM6Ci0gIHRfc2NvcGUoKSB7fQotCi0gIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gICAgdHlwZXNfW25hbWVdID0gdHlwZTsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiB0eXBlc19bbmFtZV07Ci0gIH0KLQotICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgewotICAgIHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gc2VydmljZXNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKLSAgICBpZiAoY29uc3RhbnRzXy5maW5kKG5hbWUpICE9IGNvbnN0YW50c18uZW5kKCkpIHsKLSAgICAgIHRocm93ICJFbnVtICIgKyBuYW1lICsgIiBpcyBhbHJlYWR5IGRlZmluZWQhIjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3RhbnRzX1tuYW1lXSA9IGNvbnN0YW50OwotICAgIH0KLQkJICAgCi0gIH0KLQotICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBjb25zdGFudHNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBwcmludCgpIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsCi0gICAgICAgICAgICAgaXRlci0+Zmlyc3QuY19zdHIoKSwKLSAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOwotICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7Ci0gICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICB0aHJvdyAiTm8gZmllbGQgbmFtZWQgXCIiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpICsgIlwiIHdhcyBmb3VuZCBpbiBzdHJ1Y3Qgb2YgdHlwZSBcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiIjsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25zdF92YWwtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgewotICAgICAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgodF9lbnVtKil0dHlwZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X2NvbnN0KiBjb25zdGFudCA9IGdldF9jb25zdGFudChjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkpOwotICAgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkgewotICAgICAgICAgIHRocm93ICJObyBlbnVtIHZhbHVlIG9yIGNvbnN0YW50IGZvdW5kIG5hbWVkIFwiIiArIGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSArICJcIiEiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0eXBlZGVmcyB0byB0aGUgdW5kZXJseWluZyB0eXBlCi0gICAgICAgIHRfdHlwZSogY29uc3RfdHlwZSA9IGNvbnN0YW50LT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbnN0X3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdF90eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19tYXAoKSkgewotICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X21hcCgpOwotICAgICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X21hcCgpOwotICAgICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBjb25zdF92YWwtPmFkZF9tYXAodl9pdGVyLT5maXJzdCwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQotICAgICAgLy8gdmFsdWUncyBuYW1lLgotICAgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR0eXBlOwotICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX3ZhbHVlID0gdGVudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShjb25zdF92YWwtPmdldF9pbnRlZ2VyKCkpOwotICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgewotICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFsc3RtOwotICAgICAgICB2YWxzdG0gPDwgY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB0aHJvdyAiQ291bGRuJ3QgZmluZCBhIG5hbWVkIHZhbHVlIGluIGVudW0gIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmb3IgdmFsdWUgIiArIHZhbHN0bS5zdHIoKTsKLSAgICAgIH0KLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIodGVudW0tPmdldF9uYW1lKCkgKyAiLiIgKyBlbnVtX3ZhbHVlLT5nZXRfbmFtZSgpKTsKLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0odGVudW0pOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gdHlwZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+IHR5cGVzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gY29uc3RhbnRzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gY29uc3RhbnRzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gc2VydmljZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IHNlcnZpY2VzXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlNjkyNC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0VSVklDRV9ICi0jZGVmaW5lIFRfU0VSVklDRV9ICi0KLSNpbmNsdWRlICJ0X2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKi8KLWNsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9zZXJ2aWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSwKLSAgICBleHRlbmRzXyhOVUxMKSB7fQotCi0gIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgc2V0X2V4dGVuZHModF9zZXJ2aWNlKiBleHRlbmRzKSB7Ci0gICAgZXh0ZW5kc18gPSBleHRlbmRzOwotICB9Ci0KLSAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgewotICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7Ci0gICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uc187Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgewotICAgIHJldHVybiBleHRlbmRzXzsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIC8vIFNlcnZpY2VzIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIGZpbmdlcnByaW50cy4KLSAgICB0aHJvdyAiQlVHOiBDYW4ndCBnZXQgZmluZ2VycHJpbnQgbWF0ZXJpYWwgZm9yIHNlcnZpY2UuIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9uc187Ci0gIHRfc2VydmljZSogZXh0ZW5kc187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5ODM1Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TRVRfSAotI2RlZmluZSBUX1NFVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgc2V0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9zZXQgOiBwdWJsaWMgdF9jb250YWluZXIgewotIHB1YmxpYzoKLSAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDoKLSAgICBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGVsZW1fdHlwZV87Ci0gIH0KLQotICBib29sIGlzX3NldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAic2V0PCIgKyBlbGVtX3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArICI+IjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgZWxlbV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiBlbGVtX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWUxMTIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3N0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NUUlVDVF9ICi0jZGVmaW5lIFRfU1RSVUNUX0gKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X2ZpZWxkLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSB0aGF0IHB1cHB5Ci1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIG1lbWJlciBmaWVsZHMgdGhhdCBoYXMgYSBuYW1lLiBTdHJ1Y3RzCi0gKiBhcmUgYWxzbyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3N0cnVjdCA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVyc190eXBlOwotCi0gIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIHhzZF9hbGxfKGZhbHNlKSB7fQotCi0gIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDoKLSAgICB0X3R5cGUocHJvZ3JhbSwgbmFtZSksCi0gICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKLSAgICB4c2RfYWxsXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdm9pZCBzZXRfeGNlcHRpb24oYm9vbCBpc194Y2VwdGlvbikgewotICAgIGlzX3hjZXB0aW9uXyA9IGlzX3hjZXB0aW9uOwotICB9Ci0KLSAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgewotICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX2FsbChib29sIHhzZF9hbGwpIHsKLSAgICB4c2RfYWxsXyA9IHhzZF9hbGw7Ci0gIH0KLQotICBib29sIGdldF94c2RfYWxsKCkgY29uc3QgewotICAgIHJldHVybiB4c2RfYWxsXzsKLSAgfQotCi0gIGJvb2wgYXBwZW5kKHRfZmllbGQqIGVsZW0pIHsKLSAgICBtZW1iZXJzXy5wdXNoX2JhY2soZWxlbSk7Ci0KLSAgICB0eXBlZGVmIG1lbWJlcnNfdHlwZTo6aXRlcmF0b3IgaXRlcl90eXBlOwotICAgIHN0ZDo6cGFpcjxpdGVyX3R5cGUsIGl0ZXJfdHlwZT4gYm91bmRzID0gc3RkOjplcXVhbF9yYW5nZSgKLSAgICAgICAgICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCksIG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpLCBlbGVtLCB0X2ZpZWxkOjprZXlfY29tcGFyZSgpCi0gICAgICAgICk7Ci0gICAgaWYgKGJvdW5kcy5maXJzdCAhPSBib3VuZHMuc2Vjb25kKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmluc2VydChib3VuZHMuc2Vjb25kLCBlbGVtKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X21lbWJlcnMoKSB7Ci0gICAgcmV0dXJuIG1lbWJlcnNfOwotICB9Ci0KLSAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfc29ydGVkX21lbWJlcnMoKSB7Ci0gICAgcmV0dXJuIG1lbWJlcnNfaW5faWRfb3JkZXJfOwotICB9Ci0KLSAgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFpc194Y2VwdGlvbl87Ci0gIH0KLQotICBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBpc194Y2VwdGlvbl87Ci0gIH0KLSAgCi0gIGJvb2wgaXNfdW5pb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlzX3VuaW9uXzsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJ2ID0gInsiOwotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgcnYgKz0gKCptX2l0ZXIpLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgICAgIHJ2ICs9ICI7IjsKLSAgICB9Ci0gICAgcnYgKz0gIn0iOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAoKm1faXRlciktPmdldF90eXBlKCktPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgfQotICB9Ci0KLSAgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7Ci0gICAgICAgIHJldHVybiAqbV9pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gcHJpdmF0ZToKLQotICBtZW1iZXJzX3R5cGUgbWVtYmVyc187Ci0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzX2luX2lkX29yZGVyXzsKLSAgYm9vbCBpc194Y2VwdGlvbl87Ci0gIGJvb2wgaXNfdW5pb25fOwotCi0gIGJvb2wgeHNkX2FsbF87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDI0Mjc5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRV9ICi0jZGVmaW5lIFRfVFlQRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAidF9kb2MuaCIKLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKLSAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KLSAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQotICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKLSAqIHZhcmlvdXMgdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+dF90eXBlKCkge30KLQotICB2aXJ0dWFsIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zdHJpbmcoKSAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3R5cGVkZWYoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RydWN0KCkgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3hjZXB0aW9uKCkgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NldCgpICAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19tYXAoKSAgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc2VydmljZSgpICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgewotICAgIHJldHVybiBwcm9ncmFtXzsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpOwotCi0gIC8vIFJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlCi0gIC8vIGZyb20gYW55IG90aGVyIHRocmlmdCB0eXBlIGluIHRoZSB3b3JsZCwgYXMgZmFyIGFzCi0gIC8vIFREZW5zZVByb3RvY29sIGlzIGNvbmNlcm5lZC4KLSAgLy8gV2UgZG9uJ3QgY2FjaGUgdGhpcywgd2hpY2ggaXMgYSBsaXR0bGUgc2xvcHB5LAotICAvLyBidXQgdGhlIGNvbXBpbGVyIGlzIHNvIGZhc3QgdGhhdCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgPSAwOwotCi0gIC8vIEZpbmdlcnByaW50IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIgKGFuZCBvbmx5IHdoZW4pCi0gIC8vIHRoZSBlbmNvZGluZyB2aWEgVERlbnNlUHJvdG9jb2wgY2hhbmdlcy4KLSAgc3RhdGljIGNvbnN0IGludCBmaW5nZXJwcmludF9sZW4gPSAxNjsKLQotICAvLyBDYWxsIHRoaXMgYmVmb3JlIHRyeWluZyBnZXRfKl9maW5nZXJwcmludCgpLgotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLQotICBib29sIGhhc19maW5nZXJwcmludCgpIGNvbnN0IHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmdlcnByaW50X2xlbjsgaSsrKSB7Ci0gICAgICBpZiAoZmluZ2VycHJpbnRfW2ldICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QqIGdldF9iaW5hcnlfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbmdlcnByaW50XzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9hc2NpaV9maW5nZXJwcmludCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBjb25zdCB1aW50OF90KiBmcCA9IGdldF9iaW5hcnlfZmluZ2VycHJpbnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmdlcnByaW50X2xlbjsgaSsrKSB7Ci0gICAgICBydiArPSBieXRlX3RvX2hleChmcFtpXSk7Ci0gICAgfQotICAgIHJldHVybiBydjsKLSAgfQotCi0gIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBicmVhayAobWF5YmUgYmFkbHkpIHVubGVzcyAwIDw9IG51bSA8PSAxNi4KLSAgc3RhdGljIGNoYXIgbnliYmxlX3RvX3hkaWdpdChpbnQgbnVtKSB7Ci0gICAgaWYgKG51bSA8IDEwKSB7Ci0gICAgICByZXR1cm4gJzAnICsgbnVtOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gJ0EnICsgbnVtIC0gMTA7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGJ5dGVfdG9faGV4KHVpbnQ4X3QgYnl0ZSkgewotICAgIHN0ZDo6c3RyaW5nIHJ2OwotICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSA+PiA0KTsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgJiAweDBmKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKLQotIHByb3RlY3RlZDoKLSAgdF90eXBlKCkgOgotICAgIHByb2dyYW1fKE5VTEwpCi0gIHsKLSAgICBtZW1zZXQoZmluZ2VycHJpbnRfLCAwLCBzaXplb2YoZmluZ2VycHJpbnRfKSk7Ci0gIH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtKSA6Ci0gICAgcHJvZ3JhbV8ocHJvZ3JhbSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0sIHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICBwcm9ncmFtXyhwcm9ncmFtKSwKLSAgICBuYW1lXyhuYW1lKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICBwcm9ncmFtXyhOVUxMKSwKLSAgICBuYW1lXyhuYW1lKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0KLSAgdWludDhfdCBmaW5nZXJwcmludF9bZmluZ2VycHJpbnRfbGVuXTsKLX07Ci0KLQotLyoqCi0gKiBQbGFjZWhvbGRlciBzdHJ1Y3QgZm9yIHJldHVybmluZyB0aGUga2V5IGFuZCB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uCi0gKiBkdXJpbmcgcGFyc2luZy4KLSAqLwotc3RydWN0IHRfYW5ub3RhdGlvbiB7Ci0gIHN0ZDo6c3RyaW5nIGtleTsKLSAgc3RkOjpzdHJpbmcgdmFsOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3N2Q5Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRURFRl9ICi0jZGVmaW5lIFRfVFlQRURFRl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0KLS8qKgotICogQSB0eXBlZGVmIGlzIGEgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMgbmFtZSB0byBhbm90aGVyIHR5cGUuIEluIGR5bWFuaWNhbGx5Ci0gKiB0eXBlZCBsYW5ndWFnZXMgKGkuZS4gcGhwL3B5dGhvbikgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbiBhY3R1YWxseSB1c3VhbGx5Ci0gKiBpZ25vcmUgdHlwZWRlZnMgYW5kIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGlyZWN0bHksIHRob3VnaCBpbiBDKysKLSAqIHRoZSBzeW1ib2xpYyBuYW1pbmcgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY29kZSBjbGFyaXR5LgotICoKLSAqLwotY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIHN5bWJvbGljKSA6Ci0gICAgdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBzeW1ib2xpY18oc3ltYm9saWMpIHt9Ci0KLSAgfnRfdHlwZWRlZigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3N5bWJvbGljKCkgY29uc3QgewotICAgIHJldHVybiBzeW1ib2xpY187Ci0gIH0KLQotICBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBpZiAoIXR5cGVfLT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgICAgdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBzeW1ib2xpY187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5N2Y2OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogZGVmaW5lIGZvciBta2RpcixzaW5jZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICogaXMgZGlmZmVyZW50IGZvciB0aGUgbm9uLVBPU0lYIE1pbkdXCi0gKi8KLQotI2lmZGVmIE1JTkdXCi0jaW5jbHVkZSA8aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBNSU5HVwotI2RlZmluZSBNS0RJUih4KSBta2Rpcih4KQotI2Vsc2UKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzlkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApAQCAtMCwwICsxLDQ2NCBAQAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucworI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCIKKworZXh0ZXJuIGludCBnX3dhcm47CitleHRlcm4gc3RkOjpzdHJpbmcgZ19jdXJwYXRoOworZXh0ZXJuIGJvb2wgZ19yZXR1cm5fZmFpbHVyZTsKKwordm9pZCB0aHJpZnRfYXVkaXRfd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICAgIHJldHVybjsKKyAgIH0KKyAgIHZhX2xpc3QgYXJnczsKKyAgIHByaW50ZigiW1RocmlmdCBBdWRpdCBXYXJuaW5nOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7CisgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgdnByaW50ZihmbXQsIGFyZ3MpOworICAgdmFfZW5kKGFyZ3MpOworICAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHRocmlmdF9hdWRpdF9mYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbVGhyaWZ0IEF1ZGl0IEZhaWx1cmU6JXNdICIsIGdfY3VycGF0aC5jX3N0cigpKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZ19yZXR1cm5fZmFpbHVyZSA9IHRydWU7Cit9CisKK3ZvaWQgY29tcGFyZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBuZXdQcm9ncmFtLCB0X3Byb2dyYW0qIG9sZFByb2dyYW0pCit7CisgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBuZXdOYW1lc3BhY2VNYXAgPSBuZXdQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKKyAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIG9sZE5hbWVzcGFjZU1hcCA9IG9sZFByb2dyYW0tPmdldF9hbGxfbmFtZXNwYWNlcygpOworCisgICBmb3Ioc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igb2xkTmFtZXNwYWNlTWFwSXQgPSBvbGROYW1lc3BhY2VNYXAuYmVnaW4oKTsKKyAgICAgICAgIG9sZE5hbWVzcGFjZU1hcEl0ICE9IG9sZE5hbWVzcGFjZU1hcC5lbmQoKTsKKyAgICAgICAgIG9sZE5hbWVzcGFjZU1hcEl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuZXdOYW1lc3BhY2VNYXBJdCA9IG5ld05hbWVzcGFjZU1hcC5maW5kKG9sZE5hbWVzcGFjZU1hcEl0LT5maXJzdCk7CisgICAgICBpZihuZXdOYW1lc3BhY2VNYXBJdCA9PSBuZXdOYW1lc3BhY2VNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTGFuZ3VhZ2UgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LT5maXJzdCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKChuZXdOYW1lc3BhY2VNYXBJdC0+c2Vjb25kKSAhPSBvbGROYW1lc3BhY2VNYXBJdC0+c2Vjb25kKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIk5hbWVzcGFjZSAlcyBjaGFuZ2VkIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LT5zZWNvbmQpLmNfc3RyKCkpOworICAgICAgfQorICAgfQorfQorCit2b2lkIGNvbXBhcmVfZW51bV92YWx1ZXModF9lbnVtKiBuZXdFbnVtLHRfZW51bSogb2xkRW51bSkKK3sKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBvbGRFbnVtVmFsdWVzID0gb2xkRW51bS0+Z2V0X2NvbnN0YW50cygpOworICAgZm9yKHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRFbnVtVmFsdWVzSXQgPSBvbGRFbnVtVmFsdWVzLmJlZ2luKCk7CisgICAgICAgICBvbGRFbnVtVmFsdWVzSXQgIT0gb2xkRW51bVZhbHVlcy5lbmQoKTsKKyAgICAgICAgIG9sZEVudW1WYWx1ZXNJdCsrKQorICAgeworICAgICAgaW50IGVudW1WYWx1ZSA9ICgqb2xkRW51bVZhbHVlc0l0KS0+Z2V0X3ZhbHVlKCk7CisgICAgICB0X2VudW1fdmFsdWUqIG5ld0VudW1WYWx1ZSA9IG5ld0VudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShlbnVtVmFsdWUpOworICAgICAgaWYobmV3RW51bVZhbHVlICE9IE5VTEwpCisgICAgICB7CisgICAgICAgICBzdGQ6OnN0cmluZyBlbnVtTmFtZSA9ICgqb2xkRW51bVZhbHVlc0l0KS0+Z2V0X25hbWUoKTsKKyAgICAgICAgIGlmKGVudW1OYW1lICE9IG5ld0VudW1WYWx1ZS0+Z2V0X25hbWUoKSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lIG9mIHRoZSB2YWx1ZSAlZCBjaGFuZ2VkIGluIGVudW0gJXNcbiIsIGVudW1WYWx1ZSwgb2xkRW51bS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJFbnVtIHZhbHVlICVkIG1pc3NpbmcgaW4gJXNcbiIsIGVudW1WYWx1ZSwgb2xkRW51bS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIH0KKworICAgfQorfQorCit2b2lkIGNvbXBhcmVfZW51bXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG5ld0VudW1MaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgb2xkRW51bUxpc3QpCit7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPiBuZXdFbnVtTWFwOworICAgc3RkOjp2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIG5ld0VudW1JdDsKKyAgIGZvcihuZXdFbnVtSXQgPSBuZXdFbnVtTGlzdC5iZWdpbigpOyBuZXdFbnVtSXQgIT0gbmV3RW51bUxpc3QuZW5kKCk7IG5ld0VudW1JdCsrKQorICAgeworICAgICAgbmV3RW51bU1hcFsoKm5ld0VudW1JdCktPmdldF9uYW1lKCldID0gKm5ld0VudW1JdDsKKyAgIH0KKyAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBvbGRFbnVtSXQ7CisgICBmb3Iob2xkRW51bUl0ID0gb2xkRW51bUxpc3QuYmVnaW4oKTsgb2xkRW51bUl0ICE9IG9sZEVudW1MaXN0LmVuZCgpOyBvbGRFbnVtSXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHRfZW51bSo+OjppdGVyYXRvciBuZXdFbnVtTWFwSXQ7CisgICAgICBuZXdFbnVtTWFwSXQgPSBuZXdFbnVtTWFwLmZpbmQoKCpvbGRFbnVtSXQpLT5nZXRfbmFtZSgpKTsKKworICAgICAgaWYobmV3RW51bU1hcEl0ID09IG5ld0VudW1NYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiRW51bSAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGNvbXBhcmVfZW51bV92YWx1ZXMobmV3RW51bU1hcEl0LT5zZWNvbmQsICpvbGRFbnVtSXQpOworICAgICAgfQorICAgfQorfQorCisvL1RoaXMgZnVuY3Rpb24gcmV0dXJucyAndHJ1ZScgaWYgdGhlIHR3byBhcmd1ZW1lbnRzIGFyZSBvZiBzYW1lIHR5cGVzLgorLy9SZXR1cm5zIGZhbHNlIGlmIHRoZXkgYXJlIG9mIGRpZmZlcmVudCB0eXBlCitib29sIGNvbXBhcmVfdHlwZSh0X3R5cGUqIG5ld1R5cGUsIHRfdHlwZSogb2xkVHlwZSkKK3sKKyAgIC8vQ29tcGFyaW5nIG5hbWVzIG9mIHR3byB0eXBlcyB3aWxsIHdvcmsgd2hlbiB0aGUgbmV3VHlwZSBhbmQgb2xkVHlwZSBhcmUgYmFzaWMgdHlwZXMgb3Igc3RydWN0cyBvciBlbnVtcy4KKyAgIC8vSG93ZXZlciwgd2hlbiB0aGV5IGFyZSBjb250YWluZXJzLCBnZXRfbmFtZSgpIHJldHVybnMgZW1wdHkgZm9yIHdoaWNoIHdlIGhhdmUgdG8gY29tcGFyZSB0aGUgdHlwZSBvZgorICAgLy90aGVpciBlbGVtZW50cyBhcyB3ZWxsLgorICAgaWYoKG5ld1R5cGUtPmdldF9uYW1lKCkpLmVtcHR5KCkgJiYgKG9sZFR5cGUtPmdldF9uYW1lKCkpLmVtcHR5KCkpCisgICB7CisKKyAgICAgIGlmKG5ld1R5cGUtPmlzX2xpc3QoKSAmJiBvbGRUeXBlLT5pc19saXN0KCkpCisgICAgICB7CisgICAgICAgICB0X3R5cGUqIG5ld0VsZW1lbnRUeXBlID0gKCh0X2xpc3QqKW5ld1R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZEVsZW1lbnRUeXBlID0gKCh0X2xpc3QqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1R5cGUtPmlzX21hcCgpICYmIG9sZFR5cGUtPmlzX21hcCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdLZXlUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRLZXlUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF9rZXlfdHlwZSgpOworCisgICAgICAgICB0X3R5cGUqIG5ld1ZhbFR5cGUgPSAoKHRfbWFwKiluZXdUeXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZFZhbFR5cGUgPSAoKHRfbWFwKilvbGRUeXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICAgICAgIHJldHVybiAoY29tcGFyZV90eXBlKG5ld0tleVR5cGUsIG9sZEtleVR5cGUpICYmIGNvbXBhcmVfdHlwZShuZXdWYWxUeXBlLCBvbGRWYWxUeXBlKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1R5cGUtPmlzX3NldCgpICYmIG9sZFR5cGUtPmlzX3NldCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9zZXQqKW5ld1R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZEVsZW1lbnRUeXBlID0gKCh0X3NldCopb2xkVHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgIHJldHVybiBjb21wYXJlX3R5cGUobmV3RWxlbWVudFR5cGUsIG9sZEVsZW1lbnRUeXBlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYobmV3VHlwZS0+Z2V0X25hbWUoKSA9PSBvbGRUeXBlLT5nZXRfbmFtZSgpKQorICAgeworICAgICAgcmV0dXJuIHRydWU7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9CisKK2Jvb2wgY29tcGFyZV9wYWlyKHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG5ld01hcFBhaXIsIHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG9sZE1hcFBhaXIpCit7CisgICByZXR1cm4gY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLmZpcnN0LCBvbGRNYXBQYWlyLmZpcnN0KSAmJiBjb21wYXJlX2RlZmF1bHRzKG5ld01hcFBhaXIuc2Vjb25kLCBvbGRNYXBQYWlyLnNlY29uZCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAndHJ1ZScgaWYgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBzYW1lLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KK2Jvb2wgY29tcGFyZV9kZWZhdWx0cyh0X2NvbnN0X3ZhbHVlKiBuZXdTdHJ1Y3REZWZhdWx0LCB0X2NvbnN0X3ZhbHVlKiBvbGRTdHJ1Y3REZWZhdWx0KQoreworICAgaWYobmV3U3RydWN0RGVmYXVsdCA9PSBOVUxMICYmIG9sZFN0cnVjdERlZmF1bHQgPT0gTlVMTCkgcmV0dXJuIHRydWU7CisgICBlbHNlIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ICE9IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgIGVsc2UgaWYgKG5ld1N0cnVjdERlZmF1bHQgIT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgaWYobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSAhPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfdHlwZSgpKQorICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBzd2l0Y2gobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKKyAgIHsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfaW50ZWdlcigpKTsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfZG91YmxlKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfc3RyaW5nKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgb2xkRGVmYXVsdExpc3QgPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBuZXdEZWZhdWx0TGlzdCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9saXN0KCk7CisgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZERlZmF1bHRMaXN0LnNpemUoKSA9PSBuZXdEZWZhdWx0TGlzdC5zaXplKCkpOworCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlc0NvbXBhcmUgJiYgc3RkOjplcXVhbChuZXdEZWZhdWx0TGlzdC5iZWdpbigpLCBuZXdEZWZhdWx0TGlzdC5lbmQoKSwgb2xkRGVmYXVsdExpc3QuYmVnaW4oKSwgY29tcGFyZV9kZWZhdWx0cyk7CisgICAgICAgICB9CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbmV3TWFwID0gbmV3U3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOworICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBvbGRNYXAgPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfbWFwKCk7CisKKyAgICAgICAgICAgIGJvb2wgZGVmYXVsdFZhbHVlc0NvbXBhcmUgPSAob2xkTWFwLnNpemUoKSA9PSBuZXdNYXAuc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3TWFwLmJlZ2luKCksIG5ld01hcC5lbmQoKSwgb2xkTWFwLmJlZ2luKCksIGNvbXBhcmVfcGFpcik7CisgICAgICAgICB9CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RfZmllbGQodF9maWVsZCogbmV3RmllbGQsIHRfZmllbGQqIG9sZEZpZWxkLCBzdGQ6OnN0cmluZyBvbGRTdHJ1Y3ROYW1lKQoreworICAgdF90eXBlKiBuZXdGaWVsZFR5cGUgPSBuZXdGaWVsZC0+Z2V0X3R5cGUoKTsKKyAgIHRfdHlwZSogb2xkRmllbGRUeXBlID0gb2xkRmllbGQtPmdldF90eXBlKCk7CisgICBpZighY29tcGFyZV90eXBlKG5ld0ZpZWxkVHlwZSwgb2xkRmllbGRUeXBlKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgVHlwZSBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKworICAgLy8gQSBTdHJ1Y3QgbWVtYmVyIGNhbiBiZSBvcHRpb25hbCBpZiBpdCBpcyBtZW50aW9uZWQgZXhwbGljaXRseSwgb3IgaWYgaXQgaXMgYXNzaWduZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgIGJvb2wgbmV3U3RydWN0RmllbGRPcHRpb25hbCA9IChuZXdGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgYm9vbCBvbGRTdHJ1Y3RGaWVsZE9wdGlvbmFsID0gKG9sZEZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisKKyAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgIT0gb2xkU3RydWN0RmllbGRPcHRpb25hbCkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgUmVxdWlyZWRuZXNzIENoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorICAgaWYobmV3U3RydWN0RmllbGRPcHRpb25hbCB8fCBvbGRTdHJ1Y3RGaWVsZE9wdGlvbmFsKQorICAgeworICAgICAgaWYoIWNvbXBhcmVfZGVmYXVsdHMobmV3RmllbGQtPmdldF92YWx1ZSgpLCBvbGRGaWVsZC0+Z2V0X3ZhbHVlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkRlZmF1bHQgdmFsdWUgY2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICB9CisgICB9CisKKyAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSA9IG5ld0ZpZWxkLT5nZXRfbmFtZSgpOworICAgaWYoZmllbGROYW1lICE9IG9sZEZpZWxkLT5nZXRfbmFtZSgpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIlN0cnVjdCBmaWVsZCBuYW1lIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXNcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisKK30KKwordm9pZCBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QodF9zdHJ1Y3QqIG5ld1N0cnVjdCwgdF9zdHJ1Y3QqIG9sZFN0cnVjdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG9sZFN0cnVjdE5hbWUgPSBzdGQ6OnN0cmluZygpKQoreworICAgc3RkOjpzdHJpbmcgc3RydWN0TmFtZSA9IG9sZFN0cnVjdE5hbWUuZW1wdHkoKSA/IG9sZFN0cnVjdC0+Z2V0X25hbWUoKSA6IG9sZFN0cnVjdE5hbWU7CisgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIgPSBvbGRTdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gbmV3U3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU3RydWN0TWVtYmVySXQgPSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmJlZ2luKCk7CisgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG5ld1N0cnVjdE1lbWJlckl0ID0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOworCisgICAvLyBTaW5jZSB3ZSBoYXZlIHRoZSBzdHJ1Y3QgbWVtYmVycyBpbiB0aGVpciBJRCBvcmRlciwgY29tcGFyaW5nIHRoZWlyIElEcyBjYW4gYmUgZG9uZSBieSB0cmF2ZXJzaW5nIHRoZSB0d28gbWVtYmVyCisgICAvLyBsaXN0cyB0b2dldGhlci4KKyAgIHdoaWxlKCEob2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKSkKKyAgIHsKKyAgICAgIGlmKG5ld1N0cnVjdE1lbWJlckl0ID09IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgIT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vIEEgZmllbGQgSUQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBlbmQuCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIHJlbW92ZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYobmV3U3RydWN0TWVtYmVySXQgIT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBvbGRTdHJ1Y3RNZW1iZXJJdCA9PSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKQorICAgICAgeworICAgICAgICAgLy9OZXcgZmllbGQgSUQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGVuZC4KKyAgICAgICAgIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXF1aXJlZCBTdHJ1Y3QgRmllbGQgQWRkZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgfQorICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA9PSAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9GaWVsZCBJRCBmb3VuZCBpbiBib3RoIHN0cnVjdHMuIENvbXBhcmUgZmllbGQgdHlwZXMsIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAgY29tcGFyZV9zdHJ1Y3RfZmllbGQoKm5ld1N0cnVjdE1lbWJlckl0LCAqb2xkU3RydWN0TWVtYmVySXQsIHN0cnVjdE5hbWUpOworCisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA8ICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkpCisgICAgICB7CisgICAgICAgICAvL05ldyBGaWVsZCBJZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuCisgICAgICAgICAvL0FkZGluZyBmaWVsZHMgdG8gc3RydWN0IGlzIGZpbmUsIGJ1dCBhZGRpbmcgdGhlbSBpbiB0aGUgbWlkZGxlIGlzIHN1c3BpY2lvdXMuIEVycm9yISEKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgZmllbGQgaXMgYWRkZWQgaW4gdGhlIG1pZGRsZSB3aXRoIElkID0gJWQgaW4gJXNcbiIsICAoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCAgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPiAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9BIGZpZWxkIGlzIGRlbGV0ZWQgaW4gbmV3U3RydWN0LgorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCksIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBvbGRTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorCisgICB9Cit9CisKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG9sZFN0cnVjdExpc3QpCit7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X3N0cnVjdCo+IG5ld1N0cnVjdE1hcDsKKyAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld1N0cnVjdExpc3RJdDsKKyAgIGZvcihuZXdTdHJ1Y3RMaXN0SXQgPSBuZXdTdHJ1Y3RMaXN0LmJlZ2luKCk7IG5ld1N0cnVjdExpc3RJdCAhPSBuZXdTdHJ1Y3RMaXN0LmVuZCgpOyBuZXdTdHJ1Y3RMaXN0SXQrKykKKyAgIHsKKyAgICAgIG5ld1N0cnVjdE1hcFsoKm5ld1N0cnVjdExpc3RJdCktPmdldF9uYW1lKCldID0gKm5ld1N0cnVjdExpc3RJdDsKKyAgIH0KKworICAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU3RydWN0TGlzdEl0OworICAgZm9yKG9sZFN0cnVjdExpc3RJdCA9IG9sZFN0cnVjdExpc3QuYmVnaW4oKTsgb2xkU3RydWN0TGlzdEl0ICE9IG9sZFN0cnVjdExpc3QuZW5kKCk7IG9sZFN0cnVjdExpc3RJdCsrKQorICAgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIG5ld1N0cnVjdE1hcEl0OworICAgICAgbmV3U3RydWN0TWFwSXQgPSBuZXdTdHJ1Y3RNYXAuZmluZCgoKm9sZFN0cnVjdExpc3RJdCktPmdldF9uYW1lKCkpOworICAgICAgaWYobmV3U3RydWN0TWFwSXQgPT0gbmV3U3RydWN0TWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAoKm9sZFN0cnVjdExpc3RJdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3U3RydWN0TWFwSXQtPnNlY29uZCwgKm9sZFN0cnVjdExpc3RJdCk7CisgICAgICB9CisgICB9CisKK30KKwordm9pZCBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiBuZXdGdW5jdGlvbiwgdF9mdW5jdGlvbiogb2xkRnVuY3Rpb24pCit7CisgICB0X3R5cGUqIG5ld0Z1bmN0aW9uUmV0dXJuVHlwZSA9IG5ld0Z1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworCisgICBpZihuZXdGdW5jdGlvbi0+aXNfb25ld2F5KCkgIT0gb2xkRnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk9uZXdheSBhdHRyaWJ1dGUgY2hhbmdlZCBmb3IgZnVuY3Rpb24gJXNcbiIsb2xkRnVuY3Rpb24tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICB9CisgICBpZighY29tcGFyZV90eXBlKG5ld0Z1bmN0aW9uUmV0dXJuVHlwZSwgb2xkRnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlJldHVybiB0eXBlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgfQorCisgICAvL0NvbXBhcmUgZnVuY3Rpb24gYXJndW1lbnRzLgorICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld0Z1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBvbGRGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgICBzdGQ6OnN0cmluZyBleGNlcHRpb25OYW1lID0gb2xkRnVuY3Rpb24tPmdldF9uYW1lKCk7CisgICBleGNlcHRpb25OYW1lICs9ICJfZXhjZXB0aW9uIjsKKyAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLCBvbGRGdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLCBleGNlcHRpb25OYW1lKTsKK30KKwordm9pZCBjb21wYXJlX2Z1bmN0aW9ucyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIG5ld0Z1bmN0aW9uTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBvbGRGdW5jdGlvbkxpc3QpCit7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9mdW5jdGlvbio+IG5ld0Z1bmN0aW9uTWFwOworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgbmV3RnVuY3Rpb25NYXBJdDsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG5ld0Z1bmN0aW9uSXQgPSBuZXdGdW5jdGlvbkxpc3QuYmVnaW4oKTsKKyAgICAgICAgIG5ld0Z1bmN0aW9uSXQgIT0gbmV3RnVuY3Rpb25MaXN0LmVuZCgpOworICAgICAgICAgbmV3RnVuY3Rpb25JdCsrKQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBbKCpuZXdGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3RnVuY3Rpb25JdDsKKyAgIH0KKworICAgZm9yKHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRnVuY3Rpb25JdCA9IG9sZEZ1bmN0aW9uTGlzdC5iZWdpbigpOworICAgICAgICAgb2xkRnVuY3Rpb25JdCAhPSBvbGRGdW5jdGlvbkxpc3QuZW5kKCk7CisgICAgICAgICBvbGRGdW5jdGlvbkl0KyspCisgICB7CisgICAgICBuZXdGdW5jdGlvbk1hcEl0ID0gbmV3RnVuY3Rpb25NYXAuZmluZCgoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld0Z1bmN0aW9uTWFwSXQgPT0gbmV3RnVuY3Rpb25NYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiTmV3IFRocmlmdCBGaWxlIGhhcyBtaXNzaW5nIGZ1bmN0aW9uICVzXG4iLCgqb2xkRnVuY3Rpb25JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIC8vRnVuY3Rpb24gaXMgZm91bmQgaW4gYm90aCB0aHJpZnQgZmlsZXMuIENvbXBhcmUgcmV0dXJuIHR5cGUgYW5kIGFyZ3VtZW50IGxpc3QKKyAgICAgICAgIGNvbXBhcmVfc2luZ2xlX2Z1bmN0aW9uKG5ld0Z1bmN0aW9uTWFwSXQtPnNlY29uZCwgKm9sZEZ1bmN0aW9uSXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBvbGRTZXJ2aWNlcykKK3sKKyAgIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRTZXJ2aWNlSXQ7CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBuZXdTZXJ2aWNlTWFwOworICAgZm9yKHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBuZXdTZXJ2aWNlSXQgPSBuZXdTZXJ2aWNlcy5iZWdpbigpOworICAgICAgICAgbmV3U2VydmljZUl0ICE9IG5ld1NlcnZpY2VzLmVuZCgpOworICAgICAgICAgbmV3U2VydmljZUl0KyspCisgICB7CisgICAgICBuZXdTZXJ2aWNlTWFwWygqbmV3U2VydmljZUl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3U2VydmljZUl0OworICAgfQorCisKKyAgIGZvcihvbGRTZXJ2aWNlSXQgPSBvbGRTZXJ2aWNlcy5iZWdpbigpOyBvbGRTZXJ2aWNlSXQgIT0gb2xkU2VydmljZXMuZW5kKCk7IG9sZFNlcnZpY2VJdCsrKQorICAgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb2xkU2VydmljZU5hbWUgPSAoKm9sZFNlcnZpY2VJdCktPmdldF9uYW1lKCk7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj46Oml0ZXJhdG9yIG5ld1NlcnZpY2VNYXBJdCA9IG5ld1NlcnZpY2VNYXAuZmluZChvbGRTZXJ2aWNlTmFtZSk7CisKKyAgICAgIGlmKG5ld1NlcnZpY2VNYXBJdCA9PSBuZXdTZXJ2aWNlTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgZmlsZSBpcyBtaXNzaW5nIGEgc2VydmljZSAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0X3NlcnZpY2UqIG9sZFNlcnZpY2VFeHRlbmRzID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZXh0ZW5kcygpOworICAgICAgICAgdF9zZXJ2aWNlKiBuZXdTZXJ2aWNlRXh0ZW5kcyA9IChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9leHRlbmRzKCk7CisKKyAgICAgICAgIGlmKG9sZFNlcnZpY2VFeHRlbmRzID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICAvLyBJdCBpcyBmaW5lIHRvIGFkZCBleHRlbmRzLiBTbyBpZiBzZXJ2aWNlIGluIG9sZGVyIHRocmlmdCBkaWQgbm90IGhhdmUgYW55IGV4dGVuZHMsIHdlIGFyZSBmaW5lLgorICAgICAgICAgICAgLy8gRE8gTm90aGluZworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZihvbGRTZXJ2aWNlRXh0ZW5kcyAhPSBOVUxMICYmIG5ld1NlcnZpY2VFeHRlbmRzID09IE5VTEwpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiQ2hhbmdlIGluIFNlcnZpY2UgaW5oZXJpdGFuY2UgZm9yICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9sZEV4dGVuZHNOYW1lID0gb2xkU2VydmljZUV4dGVuZHMtPmdldF9uYW1lKCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuZXdFeHRlbmRzTmFtZSA9IG5ld1NlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOworCisgICAgICAgICAgICBpZiggbmV3RXh0ZW5kc05hbWUgIT0gb2xkRXh0ZW5kc05hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiQ2hhbmdlIGluIFNlcnZpY2UgaW5oZXJpdGFuY2UgZm9yICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgY29tcGFyZV9mdW5jdGlvbnMoKG5ld1NlcnZpY2VNYXBJdC0+c2Vjb25kKS0+Z2V0X2Z1bmN0aW9ucygpLCAoKm9sZFNlcnZpY2VJdCktPmdldF9mdW5jdGlvbnMoKSk7CisgICAgICB9CisKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfY29uc3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgbmV3Q29uc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgb2xkQ29uc3QpCit7CisgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0SXQ7CisgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZENvbnN0SXQ7CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gbmV3Q29uc3RNYXA7CisKKyAgIGZvcihuZXdDb25zdEl0ID0gbmV3Q29uc3QuYmVnaW4oKTsgbmV3Q29uc3RJdCAhPSBuZXdDb25zdC5lbmQoKTsgbmV3Q29uc3RJdCsrKQorICAgeworICAgICAgbmV3Q29uc3RNYXBbKCpuZXdDb25zdEl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3Q29uc3RJdDsKKyAgIH0KKworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgbmV3Q29uc3RNYXBJdDsKKyAgIGZvcihvbGRDb25zdEl0ID0gb2xkQ29uc3QuYmVnaW4oKTsgb2xkQ29uc3RJdCAhPSBvbGRDb25zdC5lbmQoKTsgb2xkQ29uc3RJdCsrKQorICAgeworICAgICAgbmV3Q29uc3RNYXBJdCA9IG5ld0NvbnN0TWFwLmZpbmQoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdDb25zdE1hcEl0ID09IG5ld0NvbnN0TWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50cyBNaXNzaW5nICVzIFxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZighY29tcGFyZV90eXBlKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdHlwZSgpLCAoKm9sZENvbnN0SXQpLT5nZXRfdHlwZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudCAlcyBpcyBvZiBkaWZmZXJlbnQgdHlwZSBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIWNvbXBhcmVfZGVmYXVsdHMoKG5ld0NvbnN0TWFwSXQtPnNlY29uZCktPmdldF92YWx1ZSgpLCAoKm9sZENvbnN0SXQpLT5nZXRfdmFsdWUoKSkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaGFzIGRpZmZlcmVudCB2YWx1ZVxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOworICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzllMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBUX0FVRElUX0gKKyNkZWZpbmUgVF9BVURJVF9ICisKK3ZvaWQgY29tcGFyZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBuZXdQcm9ncmFtLCB0X3Byb2dyYW0qIG9sZFByb2dyYW0pOwordm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgb2xkRW51bUxpc3QpOworYm9vbCBjb21wYXJlX2RlZmF1bHRzKHRfY29uc3RfdmFsdWUqIG5ld1N0cnVjdERlZmF1bHQsIHRfY29uc3RfdmFsdWUqIG9sZFN0cnVjdERlZmF1bHQpOwordm9pZCBjb21wYXJlX3N0cnVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgbmV3U3RydWN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG9sZFN0cnVjdExpc3QpOwordm9pZCBjb21wYXJlX3NlcnZpY2VzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBuZXdTZXJ2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpOwordm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyYjlkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5jYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisKK3RfdHlwZSogZ190eXBlX3ZvaWQ7Cit0X3R5cGUqIGdfdHlwZV9zdHJpbmc7Cit0X3R5cGUqIGdfdHlwZV9iaW5hcnk7Cit0X3R5cGUqIGdfdHlwZV9zbGlzdDsKK3RfdHlwZSogZ190eXBlX2Jvb2w7Cit0X3R5cGUqIGdfdHlwZV9pODsKK3RfdHlwZSogZ190eXBlX2kxNjsKK3RfdHlwZSogZ190eXBlX2kzMjsKK3RfdHlwZSogZ190eXBlX2k2NDsKK3RfdHlwZSogZ190eXBlX2RvdWJsZTsKKwordm9pZCBpbml0R2xvYmFscygpIHsKKyAgZ190eXBlX3ZvaWQgPSBuZXcgdF9iYXNlX3R5cGUoInZvaWQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKKyAgZ190eXBlX3N0cmluZyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgZ190eXBlX2JpbmFyeSA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX2JpbmFyeSktPnNldF9iaW5hcnkodHJ1ZSk7CisgIGdfdHlwZV9zbGlzdCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX3NsaXN0KS0+c2V0X3N0cmluZ19saXN0KHRydWUpOworICBnX3R5cGVfYm9vbCA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOworICBnX3R5cGVfaTggPSBuZXcgdF9iYXNlX3R5cGUoImk4IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTgpOworICBnX3R5cGVfaTE2ID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOworICBnX3R5cGVfaTMyID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOworICBnX3R5cGVfaTY0ID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOworICBnX3R5cGVfZG91YmxlID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworfQorCit2b2lkIGNsZWFyR2xvYmFscygpIHsKKyAgZGVsZXRlIGdfdHlwZV92b2lkOworICBkZWxldGUgZ190eXBlX3N0cmluZzsKKyAgZGVsZXRlIGdfdHlwZV9ib29sOworICBkZWxldGUgZ190eXBlX2k4OworICBkZWxldGUgZ190eXBlX2kxNjsKKyAgZGVsZXRlIGdfdHlwZV9pMzI7CisgIGRlbGV0ZSBnX3R5cGVfaTY0OworICBkZWxldGUgZ190eXBlX2RvdWJsZTsKK30KKworLyoqCisgKiBUaG9zZSBhcmUgbm90IHJlYWxseSBuZWVkZWQgZm9yIHBsdWdpbnMgYnV0IGNhdXNlcyBsaW5rIGVycm9ycyB3aXRob3V0CisgKi8KKworLyoqCisgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworaW50IGdfZG9jdGV4dF9saW5lbm87CitpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gMDsKK1BST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ4ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09NTU9OX0gKKyNkZWZpbmUgVF9DT01NT05fSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEdsb2JhbCB0eXBlcyBmb3IgdGhlIHBhcnNlciB0byBiZSBhYmxlIHRvIHJlZmVyZW5jZQorICovCisKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV92b2lkOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3N0cmluZzsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9iaW5hcnk7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfc2xpc3Q7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfYm9vbDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pODsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pMTY7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTMyOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k2NDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9kb3VibGU7CisKK3ZvaWQgaW5pdEdsb2JhbHMoKTsKK3ZvaWQgY2xlYXJHbG9iYWxzKCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzI0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBBUzMgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2FzM19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9hczNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGJpbmRhYmxlXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJpbmRhYmxlIikgPT0gMCkgeworICAgICAgICBiaW5kYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGFzMzoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tYXMzIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIC8vIHJlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOworICB2b2lkIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgYXMzX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3R5cGVfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKworICBib29sIGJpbmRhYmxlXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3BhY2thZ2UoKSB7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiICI7CisgIH0KKyAgcmV0dXJuICJwYWNrYWdlICI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEFzMyB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3R5cGVfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7XG4iICsgImltcG9ydCBmbGFzaC51dGlscy5CeXRlQXJyYXk7XG4iCisgICAgICAgICArICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIgorICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zdHJ1Y3QKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJuZXQgbmFtZXNwYWNlCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc2VydmljZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGltcG9ydHM7CisgIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJuZXQgbmFtZXNwYWNlCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGltcG9ydHMpOworICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCksIGltcG9ydHMpOworICB9CisKKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBBczMKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEFzMywgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5hcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKSA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfZW51bSk7CisgIC8vIEFkZCBhczMgaW1wb3J0cworICBmX2VudW0gPDwgc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDsiIDw8IGVuZGwgPDwgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5OyIKKyAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOmludCA9ICIgPDwgdmFsdWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMSURfVkFMVUVTOlNldCA9IG5ldyBTZXQoIjsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZW51bSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMVUVTX1RPX05BTUVTOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKKworICBzY29wZV91cChmX2VudW0pOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluZGVudChmX2VudW0pIDw8ICJWQUxVRVNfVE9fTkFNRVNbIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIl0gPSBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBwYWNrYWdlCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfY29uc3RzKTsKKyAgZl9jb25zdHMgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7CisKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9jb25zdHMpOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgY29uc3QgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9hczNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3N0cnVjdCk7CisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgc3RyaW5nIGltcG9ydHM7CisKKyAgZl9zdHJ1Y3QgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHN0cnVjdCwgaW1wb3J0cykKKyAgICAgICAgICAgPDwgZW5kbDsKKworICBpZiAoYmluZGFibGVfICYmICFpc19leGNlcHRpb24pIHsKKyAgICBmX3N0cnVjdCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudDsiIDw8IGVuZGwgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnREaXNwYXRjaGVyOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgbXguZXZlbnRzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworCisgIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOyAvLyBlbmQgb2YgcGFja2FnZQorICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQorICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0CisgKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCB0c3RydWN0KTsKKworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIGJvb2wgYmluZGFibGUgPSAhaXNfZXhjZXB0aW9uICYmICFpbl9jbGFzcyAmJiBiaW5kYWJsZV87CisKKyAgaW5kZW50KG91dCkgPDwgKGluX2NsYXNzID8gIiIgOiAicHVibGljICIpIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXJyb3IgIjsKKyAgfSBlbHNlIGlmIChiaW5kYWJsZSkgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjb25zdCBTVFJVQ1RfREVTQzpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtYXMzLCBwcml2YXRlIGZvciAtYXMzYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY29uc3QgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0M6VEZpZWxkID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiOmludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjpCb29sZWFuID0gZmFsc2U7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOworICBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQ6VEZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRDppbnQsIHZhbHVlOiopOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50KToqIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEOmludCk6Qm9vbGVhbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgQXMzIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCk6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOworICAgIHN0ZDo6c3RyaW5nIHByb3BOYW1lID0gdG1wKCJ0aHJpZnRQcm9wZXJ0eUNoYW5nZSIpOworICAgIGlmIChiaW5kYWJsZSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIltCaW5kYWJsZShldmVudD1cIiIgPDwgcHJvcE5hbWUgPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIik6dm9pZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisKKyAgICBpZiAoYmluZGFibGUpIHsKKyAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgY3VzdG9tIGV2ZW50IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LCBiZWNhdXNlIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQsCisgICAgICAvLyB0aGUgc2V0dGVyIG9ubHkgZ2V0cyBjYWxsZWQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIC0gdGhpcyBtZWFucyBjYWxsaW5nCisgICAgICAvLyBmb28uc2V0SW50VmFsdWUoMCkKKyAgICAgIC8vIHdpbGwgbm90IGNhdXNlIGZvby5pc0ludFZhbHVlU2V0KCkgdG8gcmV0dXJuIHRydWUgc2luY2UgdGhlIHZhbHVlIG9mIGZvby5faW50VmFsdWUgd2Fzbid0CisgICAgICAvLyBjaGFuZ2VkCisgICAgICAvLyBzbyB0aGUgc2V0dGVyIHdhcyBuZXZlciBjYWxsZWQuCisgICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCIiIDw8IHByb3BOYW1lIDw8ICJcIikpOyIgPDwgZW5kbDsKKworICAgICAgLy8gSG93ZXZlciwgaWYgeW91IGp1c3QgdXNlIGEgY3VzdG9tIGV2ZW50LCB0aGVuIGNvbGxlY3Rpb25zIHdvbid0IGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4KKyAgICAgIC8vIGVsZW1lbnRzCisgICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbnMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZXkgbGlzdGVkIGZvciBQcm9wZXJ0eUNoYW5nZUV2ZW50cy4gIFNvLCB3ZQorICAgICAgLy8gZGlzcGF0Y2ggYm90aC4KKyAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQuUFJPUEVSVFlfQ0hBTkdFKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk6dm9pZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpOkJvb2xlYW4geyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7CisgIC8vIElmIGl0J3MgYmluZGFibGUsIGl0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHNvIHRvU3RyaW5nIGlzIGFuIG92ZXJyaWRlLgorICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChiaW5kYWJsZSA/ICJvdmVycmlkZSAiIDogIiIpIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0OlN0cmluZyA9IG5ldyBTdHJpbmcoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdDpCb29sZWFuID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIl9uYW1lOlN0cmluZyA9ICIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInJldCArPSBcIilcIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KKyAqIGZpZWxkTmFtZSBtYXBwaW5nCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IG1ldGFEYXRhTWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICAvLyBQb3B1bGF0ZSBtYXAKKyAgICBzY29wZV91cChvdXQpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXBbIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKKworICAgICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgYXMzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZXRfYXMzX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgeyAvLyBtYXAKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfYXMzX3R5cGVfc3RyaW5nKHR5cGUpOworICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJbXBsLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3Nvci5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOworICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkltcGwiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2w9bnVsbCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBpcHJvdF86VFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCB2YXIgb3Byb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCB2YXIgc2VxaWRfOmludDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkVycm9yKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcih4KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGU6VEVycm9yKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfQorICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcihpZmFjZToiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST0NFU1NfTUFQW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyIGlmYWNlXzoiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBjb25zdCBQUk9DRVNTX01BUDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTpCb29sZWFuIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKyAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgorICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KKyAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KKyAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbjpGdW5jdGlvbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuVU5LTk9XTl9NRVRIT0QsICIKKyAgICAgICAgICJcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuLmNhbGwodGhpcyxtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKTpGdW5jdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKHNlcWlkOmludCwgaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOnZvaWQiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0OiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIi8vIHNvcnJ5IHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBFcnJvcihcIlRoaXMgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aDpFcnJvcikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cmFjZShcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VE1hcCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VFNldCA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRMaXN0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgPDwgIigiCisgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpIDw8ICI6aW50ID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyBjb3VudGVyID0gdG1wKCJfc2l6ZUNvdW50ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgY291bnRlciA8PCAiOmludCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiLnRvQXJyYXkoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgQXMzIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEFzMyB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7CisgICh2b2lkKWluX2luaXQ7CisgIC8vIEluIEFzMyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIkRpY3Rpb25hcnkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiU2V0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJBcnJheSI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEFTMyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgQXMzIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIkJ5dGVBcnJheSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICB0aHJvdyAiaTY0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGFzMyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiTnVtYmVyIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKKyAgICAgIGFyZ3VtZW50cyArPSAiLCAiOworICAgIH0KKyAgICBhcmd1bWVudHMgKz0gIm9uRXJyb3I6RnVuY3Rpb24sIG9uU3VjY2VzczpGdW5jdGlvbiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpOnZvaWQiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCisvKioKKyAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBhczMsCisgICAgIkFTMyIsCisgICAgIiAgICBiaW5kYWJsZTogICAgICAgIEFkZCBbYmluZGFibGVdIG1ldGFkYXRhIHRvIGFsbCB0aGUgc3RydWN0IGNsYXNzZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlM2JhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw0NTg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKTsKK3N0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpOworc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpOworc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpOworCisvKioKKyAqIEMgY29kZSBnZW5lcmF0b3IsIHVzaW5nIGdsaWIgZm9yIEMgdHlwaW5nLgorICovCitjbGFzcyB0X2NfZ2xpYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgLyogY29uc3RydWN0b3IgKi8KKyAgdF9jX2dsaWJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBzZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgKi8KKyAgICB0aGlzLT5vdXRfZGlyX2Jhc2VfID0gImdlbi1jX2dsaWIiOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjX2dsaWI6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIC8qIHNldCB0aGUgbmFtZXNwYWNlICovCisgICAgdGhpcy0+bnNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpOworCisgICAgaWYgKHRoaXMtPm5zcGFjZS5lbXB0eSgpKSB7CisgICAgICB0aGlzLT5uc3BhY2UgPSAiIjsKKyAgICAgIHRoaXMtPm5zcGFjZV91ID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfdWMgPSAiIjsKKyAgICAgIHRoaXMtPm5zcGFjZV9sYyA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICAvKiByZXBsYWNlIGRvdHMgd2l0aCB1bmRlcnNjb3JlcyAqLworICAgICAgY2hhciogdG1wID0gc3RyZHVwKHRoaXMtPm5zcGFjZS5jX3N0cigpKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3RybGVuKHRtcCk7IGkrKykgeworICAgICAgICBpZiAodG1wW2ldID09ICcuJykgeworICAgICAgICAgIHRtcFtpXSA9ICdfJzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy0+bnNwYWNlID0gc3RyaW5nKHRtcCwgc3RybGVuKHRtcCkpOworICAgICAgZnJlZSh0bXApOworCisgICAgICAvKiBjbGVhbiB1cCB0aGUgbmFtZXNwYWNlIGZvciBDLgorICAgICAgICogQW4gaW5wdXQgb2YgJ25hbWVzcGFjZSBmb28nIHNob3VsZCByZXN1bHQgaW46CisgICAgICAgKiAgLSBuc3BhY2UgPSBmb28gICAgICAgLSBmb3IgdGhyaWZ0IG9iamVjdHMgYW5kIHR5cGVkZWZzCisgICAgICAgKiAgLSBuc3BhY2VfdSA9IEZvbyAgICAgLSBmb3IgaW50ZXJuYWwgR09iamVjdCBwcmVmaXhlcworICAgICAgICogIC0gbnNwYWNlX3VjID0gRk9PXyAgIC0gZm9yIG1hY3JvIHByZWZpeGVzCisgICAgICAgKiAgLSBuc3BhY2VfbGMgPSBmb29fICAgLSBmb3IgZmlsZW5hbWUgYW5kIG1ldGhvZCBwcmVmaXhlcworICAgICAgICogVGhlIHVuZGVyc2NvcmVzIGFyZSB0aGVyZSBzaW5jZSB1YyBhbmQgbGMgc3RyaW5ncyBhcmUgdXNlZCBhcyBmaWxlIGFuZAorICAgICAgICogdmFyaWFibGUgcHJlZml4ZXMuCisgICAgICAgKi8KKyAgICAgIHRoaXMtPm5zcGFjZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRoaXMtPm5zcGFjZSk7CisgICAgICB0aGlzLT5uc3BhY2VfdWMgPSB0b191cHBlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKKyAgICAgIHRoaXMtPm5zcGFjZV9sYyA9IHRvX2xvd2VyX2Nhc2UodGhpcy0+bnNwYWNlX3UpICsgIl8iOworICAgIH0KKyAgfQorCisgIC8qIGluaXRpYWxpemF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCitwcml2YXRlOgorICAvKiBmaWxlIHN0cmVhbXMgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KKyAgc3RyaW5nIG5zcGFjZTsKKyAgc3RyaW5nIG5zcGFjZV91OworICBzdHJpbmcgbnNwYWNlX3VjOworICBzdHJpbmcgbnNwYWNlX2xjOworCisgIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KKyAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIGJvb2wgaXNfbnVtZXJpYyh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBpc19jb25zdCA9IGZhbHNlKTsKKyAgc3RyaW5nIHByb3BlcnR5X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBpc19jb25zdCA9IGZhbHNlKTsKKyAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKTsKKyAgc3RyaW5nIGNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0cmluZyBjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0cmluZyBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RyaW5nIHhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKKyAgdm9pZCBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBiYXNlX25hbWUsIGJvb2wgZm9yX2hhc2hfdGFibGUpOworICB2b2lkIGRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBiYXNlX25hbWUpOworCisgIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdG9wX2xldmVsID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgZWxlbWVudCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKworICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSoga2V5LCB0X3R5cGUqIHZhbHVlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworfTsKKworLyoqCisgKiBQcmVwYXJlIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUKKyAqIG91dHB1dCBzdHJlYW1zLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8qIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5ICovCisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKKworICAvKiBjcmVhdGUgb3V0cHV0IGZpbGVzICovCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5oIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmMiOworICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7CisKKyAgLyogYWRkIHRocmlmdCBib2lsZXJwbGF0ZSBoZWFkZXJzICovCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8qIGluY2x1ZGUgaW5jbHVzaW9uIGd1YXJkICovCisgIGZfdHlwZXNfIDw8ICIjaWZuZGVmICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgYmFzZSB0eXBlcyAqLworICBmX3R5cGVzXyA8PCAiLyogYmFzZSBpbmNsdWRlcyAqLyIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4iIDw8IGVuZGw7CisKKyAgLyogaW5jbHVkZSBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8KKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgaWYgKCFpbmNsdWRlcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgIi8qIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbDsKKworICAgIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7CisgICAgICAgICArK2l0ZXIpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmNsdWRlX25zcGFjZSA9ICgqaXRlciktPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgaW5jbHVkZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGluY2x1ZGVfbnNwYWNlKSArICJfIjsKKworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBpbmNsdWRlX25zcGFjZV9wcmVmaXgKKyAgICAgICAgICAgICAgIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKml0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIC8qIGluY2x1ZGUgY3VzdG9tIGhlYWRlcnMgKi8KKyAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NfaW5jbHVkZXMoKTsKKyAgZl90eXBlc18gPDwgIi8qIGN1c3RvbSB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY19pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChjX2luY2x1ZGVzW2ldWzBdID09ICc8JykgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY19pbmNsdWRlc1tpXSA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGNfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgbWF0aC5oIChmb3IgIklORklOSVRZIikgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUsIGluIGNhc2Ugd2UKKyAgICAgZW5jb3VudGVyIGEgc3RydWN0IHdpdGggYSBtZW1iZXIgb2YgdHlwZSBkb3VibGUgKi8KKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8bWF0aC5oPiIgPDwgZW5kbDsKKworICAvLyBpbmNsdWRlIHRoZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiLyogYmVnaW4gdHlwZXMgKi8iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiAgRmluaXNoIHVwIGdlbmVyYXRpb24gYW5kIGNsb3NlIGFsbCBmaWxlIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKSk7CisKKyAgLyogZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkICovCisgIGZfdHlwZXNfIDw8ICIjZW5kaWYgLyogIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCAqLyIgPDwgZW5kbDsKKworICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgVGhyaWZ0IHR5cGVkZWYgaW4gQyBjb2RlLiAgRm9yIGV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogdHlwZWRlZiBtYXA8aTMyLGkzMj4gU29tZU1hcAorICoKKyAqIEM6CisgKiB0eXBlZGVmIEdIYXNoVGFibGUgKiBUaHJpZnRTb21lTWFwOworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIEMgZW51bWVyYXRpb24uICBGb3IgZXhhbXBsZToKKyAqCisgKiBUaHJpZnQ6CisgKiBlbnVtIE15RW51bSB7CisgKiAgIE9ORSA9IDEsCisgKiAgIFRXTworICogfQorICoKKyAqIEM6CisgKiBlbnVtIF9UaHJpZnRNeUVudW0geworICogICBUSFJJRlRfTVlfRU5VTV9PTkUgPSAxLAorICogICBUSFJJRlRfTVlfRU5VTV9UV08KKyAqIH07CisgKiB0eXBlZGVmIGVudW0gX1RocmlmdE15RW51bSBUaHJpZnRNeUVudW07CisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKSk7CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLyogb3V0cHV0IGVhY2ggb2YgdGhlIGVudW1lcmF0aW9uIGVsZW1lbnRzICovCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIvKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50ICovIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKTsgIiA8PCBlbmRsIDw8IGVuZGw7CisgIDsKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiY29uc3QgY2hhciAqIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ0b1N0cmluZ18iIDw8IG5hbWUgPDwgIihpbnQgdmFsdWUpICIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAieyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICBzdGF0aWMgX190aHJlYWQgY2hhciBidWZbMTZdID0gezB9OyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICBzd2l0Y2godmFsdWUpIHsiIDw8IGVuZGw7CisgIHN0ZDo6c2V0PGludD4gZG9uZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIC8vIFNraXBwaW5nIGR1cGxpY2F0ZSB2YWx1ZQorICAgIGlmIChkb25lLmZpbmQodmFsdWUpID09IGRvbmUuZW5kKCkpIHsKKyAgICAgIGRvbmUuaW5zZXJ0KHZhbHVlKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiAgY2FzZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIjoiCisgICAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gXCIiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc19pbXBsXyA8PCAiICBkZWZhdWx0OiBnX3NucHJpbnRmKGJ1ZiwgMTYsIFwiJWRcIiwgdmFsdWUpOyByZXR1cm4gYnVmOyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiICB9IiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIFRocmlmdCBjb25zdGFudHMgaW4gQyBjb2RlLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGZfdHlwZXNfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWUpOworICAgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0eXBlKSkgeworICAgICAgZl90eXBlc18gPDwgdHlwZV9uYW1lKHR5cGUpIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50KCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIiAiCisgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZV9sYywgdHlwZSwgdmFsdWUpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lX2xjLCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgVGhyaWZ0IHN0cnVjdHMgaW4gQyBjb2RlLCBhcyBHT2JqZWN0cy4gIEV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogc3RydWN0IEJvbmsKKyAqIHsKKyAqICAgMTogc3RyaW5nIG1lc3NhZ2UsCisgKiAgIDI6IGkzMiB0eXBlCisgKiB9CisgKgorICogQyBHT2JqZWN0IGluc3RhbmNlIGhlYWRlcjoKKyAqIHN0cnVjdCBfVGhyaWZ0Qm9uaworICogeworICogICBHT2JqZWN0IHBhcmVudDsKKyAqCisgKiAgIGdjaGFyICogbWVzc2FnZTsKKyAqICAgZ2ludDMyIHR5cGU7CisgKiB9OworICogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJvbmsgVGhyaWZ0Qm9uaworICogLy8gLi4uIGFkZGl0aW9uYWwgR09iamVjdCBib2lsZXJwbGF0ZSAuLi4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBmX3R5cGVzXyA8PCAiLyogc3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICovIiA8PCBlbmRsOworICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgQyBjb2RlIHRvIHJlcHJlc2VudCBUaHJpZnQgc2VydmljZXMuICBDcmVhdGVzIGEgbmV3IEdPYmplY3QKKyAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc2VydmljZS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHN2Y25hbWVfdWMgPSB0aGlzLT5uc3BhY2VfdWMgKyB0b191cHBlcl9jYXNlKHN2Y25hbWVfdSk7CisgIHN0cmluZyBmaWxlbmFtZSA9IHRoaXMtPm5zcGFjZV9sYyArIHRvX2xvd2VyX2Nhc2Uoc3ZjbmFtZV91KTsKKworICAvLyBtYWtlIG91dHB1dCBmaWxlcworICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuaCI7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisKKyAgLy8gYWRkIGhlYWRlciBmaWxlIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBhZGQgYW4gaW5jbHVzaW9uIGd1YXJkCisgIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHByb2dyYW1fbmFtZV9sYyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKKworICAvLyBpZiB3ZSBhcmUgaW5oZXJpdGluZyBmcm9tIGFub3RoZXIgc2VydmljZSwgaW5jbHVkZSBpdHMgaGVhZGVyCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgICA8PCB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkpKSA8PCAiLmhcIiIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5jIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIC8vIGFkZCB0aGUgYm9pbGVycGxhY2UgaGVhZGVyCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gaW5jbHVkZSB0aGUgaGVhZGVycworICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSA8c3RyaW5nLmg+IiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiCisgICAgICAgICAgICAgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSB0aGUgc2VydmljZS1oZWxwZXIgY2xhc3NlcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZlciBvYmplY3RzCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQKKyAgZl9oZWFkZXJfIDw8ICIjZW5kaWYgLyogIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCAqLyIgPDwgZW5kbDsKKworICAvLyBjbG9zZSB0aGUgZmlsZXMKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX2hlYWRlcl8uY2xvc2UoKTsKK30KKworLyoqCisgKgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOworCisgIGZfdHlwZXNfIDw8ICIvKiBleGNlcHRpb24gKi8iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInR5cGVkZWYgZW51bSIgPDwgZW5kbAorICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfQ09ERSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIn0gIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiRXJyb3I7IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIkdRdWFyayAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1IgKCIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyaygpKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBleGNlcHRpb25zICovIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0RPTUFJTiBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwgIkdRdWFyayIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9ET01BSU4pOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioqKioqKioqKioqKioqKioqKioKKyAqIEhFTFBFUiBGVU5DVElPTlMgKgorICoqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCisgKi8KK2Jvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOworfQorCitib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfbnVtZXJpYyh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiB0dHlwZS0+aXNfZW51bSgpIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKSk7Cit9CisKKy8qKgorICogTWFwcyBhIFRocmlmdCB0X3R5cGUgdG8gYSBDIHR5cGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgaXNfY29uc3QpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKHR0eXBlKTsKKworICAgIGlmIChpc19jb25zdCkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBibmFtZTsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgc3RyaW5nIGNuYW1lOworCisgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIC8vIHNpbmNlIGEgc2V0IHJlcXVpcmVzIHVuaXF1ZSBlbGVtZW50cywgdXNlIGEgR0hhc2hUYWJsZSwgYW5kCisgICAgICAvLyBwb3B1bGF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIHdpdGggdGhlIHNhbWUgZGF0YSwgdXNpbmcga2V5cyBmb3IKKyAgICAgIC8vIHRoZSBhY3R1YWwgd3JpdGVzIGFuZCByZWFkcy4KKyAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0CisgICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBpZiAoZXR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICAgICAgfQorICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGJlc2lkZXMgR1B0ckFycmF5CisgICAgICBjbmFtZSA9IGlzX251bWVyaWMoZXR5cGUpID8gIkdBcnJheSIgOiAiR1B0ckFycmF5IjsKKyAgICB9CisKKyAgICAvKiBPbWl0IHRoZSBkZXJlZmVyZW5jZSBvcGVyYXRvciBpZiB3ZSBhcmUgYWxpYXNpbmcgdGhpcyB0eXBlIHdpdGhpbiBhCisgICAgICAgdHlwZWRlZiwgdG8gYWxsb3cgdGhlIHR5cGUgdG8gYmUgdXNlZCBtb3JlIG5hdHVyYWxseSBpbiBjbGllbnQgY29kZTsKKyAgICAgICBvdGhlcndpc2UsIGluY2x1ZGUgaXQgKi8KKyAgICBpZiAoIWluX3R5cGVkZWYpIHsKKyAgICAgIGNuYW1lICs9ICIgKiI7CisgICAgfQorCisgICAgaWYgKGlzX2NvbnN0KSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNuYW1lOworICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIGZvciBhIG5hbWVzcGFjZQorICB0X3Byb2dyYW0qIHRwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwbmFtZSA9ICh0cHJvZ3JhbSA/IHRwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiKSArIHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgcG5hbWUgKz0gIiAqIjsKKyAgfQorCisgIGlmIChpc19jb25zdCkgeworICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOworICB9IGVsc2UgeworICAgIHJldHVybiBwbmFtZTsKKyAgfQorfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIHRoZSB0eXBlIG5lZWRlZCB0byBob2xkIGl0cyB2YWx1ZSB3aGVuIHVzZWQgYXMgYW4KKyAqIG9iamVjdCBwcm9wZXJ0eS4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgYmVjYXVzZSBhbGwgaW50ZWdlciBwcm9wZXJ0aWVzIG9mIHdpZHRoIGxlc3MgdGhhbiA2NAorICogYml0cyBtYXAgdG8gdGhlIHNhbWUgdHlwZSwgZ2ludCwgYXMgb3Bwb3NlZCB0byB0aGVpciB3aWR0aC1zcGVjaWZpYyB0eXBlCisgKiAoZ2ludDgsIGdpbnQxNiBvciBnaW50MzIpLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7CisgIHN0cmluZyByZXN1bHQ7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGlmIChpc19jb25zdCkgeworICAgICAgICByZXN1bHQgPSAiY29uc3QgZ2ludCI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSAiZ2ludCI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIGEgQyBwcmltaXRpdmUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0eXBlKTsKKyAgfQorICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJPbmx5IGJhc2UgdHlwZXMgYXJlIHN1cHBwb3J0ZWQuIik7CisgIH0KKyAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKTsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKTsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiR0J5dGVBcnJheSAqIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJnY2hhciAqIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImdib29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gImdpbnQ4IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJnaW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImdpbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiZ2ludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJnZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJjb21waWxlciBlcnJvcjogbm8gQyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgbWVtYmVyIG9mIHRoZSBUaHJpZnRUeXBlIEMgZW51bWVyYXRpb24gaW4gdGhyaWZ0X3Byb3RvY29sLmgKKyAqIGZvciBhIFRocmlmdCB0eXBlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiVF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBUaHJpZnQgY29uc3RhbnQgZm9ybWF0dGVkIGFzIGEgbGl0ZXJhbCBmb3IgaW5jbHVzaW9uIGluIEMgY29kZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Y29uc3RhbnRfbGl0ZXJhbCh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIlwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsdWVfdHlwZSA9IHZhbHVlLT5nZXRfdHlwZSgpOworCisgICAgc3dpdGNoICh2YWx1ZV90eXBlKSB7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmVuZGVyIDw8ICJ7ICI7CisgICAgICB7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgbGlzdF9pdGVyOworCisgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICBsaXN0X2l0ZXIgPSBsaXN0LmJlZ2luKCk7CisgICAgICAgICAgcmVuZGVyIDw8IGNvbnN0YW50X2xpdGVyYWwoZWxlbV90eXBlLCAqbGlzdF9pdGVyKTsKKworICAgICAgICAgIHdoaWxlICgrK2xpc3RfaXRlciAhPSBsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICByZW5kZXIgPDwgIiwgIiA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZW5kZXIgPDwgIiB9IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIGRlZmF1bHQ6CisgICAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgY29uc3RhbnQuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJnX3N0cmR1cCAoXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgIkdfR0lOVDY0X0NPTlNUQU5UICgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmIChpc19jb21wbGV4X3R5cGUodHlwZSkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCB0b19sb3dlcl9jYXNlKG5hbWUpIDw8ICJfY29uc3RhbnQoKSkiOworICB9IGVsc2UgeworICAgIHJlbmRlciA8PCAiTlVMTCAvKiBub3Qgc3VwcG9ydGVkICovIjsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICB0X3N0cnVjdCogeGxpc3QgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgc3RyaW5nIGZuYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgcmV0dXJuICJnYm9vbGVhbiAiICsgdGhpcy0+bnNwYWNlX2xjICsgZm5hbWUgKyAiICgiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqIGlmYWNlIgorICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqIGVycm9yKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIG11dGFibGUgZXhjZXB0aW9uIGxpc3RzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6eGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIqICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCBpbmNsdWRpbmcgYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGlmIChjb25zdGFudCkgeworICAgIHJlc3VsdCArPSAiY29uc3QgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChwb2ludGVyKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICBpZiAocmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGdkb3VibGUpIDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyBpbnRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKSAwIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOworICAgIH0KKyAgfQorCisgIGlmICghcmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICI7IjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShzdHJpbmcgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKyAgaWYgKGlzX251bWVyaWMoZXR5cGUpKSB7CisgICAgcmVuZGVyIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgKiIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgImdfbmV3ICgiIDw8IGJhc2VfdHlwZV9uYW1lKGV0eXBlKSA8PCAiLCAxKTsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgICAqIiA8PCBmbmFtZSA8PCAiID0gIiA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsIHZhbHVlKSA8PCAiOyIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IGluaXRpYWxpemVzIGNvbXBsZXggY29uc3RhbnRzLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdG9wX2xldmVsKSB7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOworICBzdHJpbmcgdHlwZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGUtPmdldF9uYW1lKCkpOworICBzdHJpbmcgdHlwZV91YyA9IHRvX3VwcGVyX2Nhc2UodHlwZV91KTsKKyAgc3RyaW5nIG1heWJlX3N0YXRpYyA9IHRvcF9sZXZlbCA/ICIiIDogInN0YXRpYyAiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisKKyAgICAvLyBpbml0aWFsaXplIGFueSBjb25zdGFudHMgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZCBieSB0aGlzIGluaXRpYWxpemVyCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOworCisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbml0aWFsaXplcnMgPDwgIiAgICBjb25zdGFudC0+IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8ICIgICAgY29uc3RhbnQtPl9faXNzZXRfIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgorICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgKiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgPDwgIlRZUEVfIiA8PCB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbGl6ZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkX25hbWUgPSB0bXAoZmllbGRfbmFtZSk7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgbGlzdF90eXBlID0gIkdQdHJBcnJheSAqIjsKKyAgICBzdHJpbmcgZnJlZV9mdW5jCisgICAgICAgID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShyZWludGVycHJldF9jYXN0PHRfbGlzdCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIHN0cmluZyBsaXN0X2luaXRpYWxpemVyID0gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoIiArIGZyZWVfZnVuYyArICIpOyI7CisgICAgc3RyaW5nIGxpc3RfYXBwZW5kZXIgPSAiZ19wdHJfYXJyYXlfYWRkIjsKKyAgICBib29sIGxpc3RfdmFyaWFibGUgPSBmYWxzZTsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBsaXN0X2luaXRpYWxpemVyID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZShldHlwZSk7CisgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOworICAgICAgICBsaXN0X2FwcGVuZGVyID0gImdfYXJyYXlfYXBwZW5kX3ZhbCI7CisgICAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOworICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOworICAgICAgbGlzdF92YXJpYWJsZSA9IHRydWU7CisgICAgfQorCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOworICAgICAgaWYgKGxpc3RfdmFyaWFibGUpIHsKKyAgICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgYXBwZW5kZXJzIDw8ICIgICAgIiA8PCBsaXN0X2FwcGVuZGVyIDw8ICIoY29uc3RhbnQsICIgPDwgZm5hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiCisgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsICgqdl9pdGVyKSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCBsaXN0X3R5cGUgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgaWYgKCFpbml0aWFsaXplcnMuc3RyKCkuZW1wdHkoKSkgeworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGxpc3RfaW5pdGlhbGl6ZXIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisgICAgICBzdHJpbmcgcHRyID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiKiIgOiAiIjsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKKyAgICAgIGluaXRpYWxpemVycyA8PCBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2UoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIsIDApOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCAiR0hhc2hUYWJsZSAqIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShldHlwZSwgTlVMTCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKyAgICAgIHN0cmluZyBrbmFtZSA9IGZuYW1lICsgImtleSI7CisgICAgICBzdHJpbmcgdm5hbWUgPSBmbmFtZSArICJ2YWwiOworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoa25hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHZuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKGtuYW1lLCAodF90eXBlKilrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHZuYW1lLCAodF90eXBlKil2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgYXBwZW5kZXJzIDw8ICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICIgPDwga25hbWUgPDwgIiwgIiA8PCB2bmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgIkdIYXNoVGFibGUgKiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoa3R5cGUsIHZ0eXBlKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBjbGFzc2VzIGZvciBhIHNlcnZpY2UsIGNvbnNpc3Rpbmcgb2YgYSBUaHJpZnRTdHJ1Y3Qgc3ViY2xhc3MKKyAqIGZvciB0aGUgYXJndW1lbnRzIHRvIGFuZCB0aGUgcmVzdWx0IGZyb20gZWFjaCBtZXRob2QuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBoZWxwZXIgY2xhc3NlcworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VydmljZSdzIG1ldGhvZHMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgYXJnX2xpc3RfbmFtZV9vcmlnID0gYXJnX2xpc3QtPmdldF9uYW1lKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgYXJndW1lbnRzIGNsYXNzCisgICAgYXJnX2xpc3QtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIkFyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QoYXJnX2xpc3QpOworCisgICAgYXJnX2xpc3QtPnNldF9uYW1lKGFyZ19saXN0X25hbWVfb3JpZyk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgcmVzdWx0IGNsYXNzCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLAorICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKGZ1bmN0aW9uX25hbWUpICsgIlJlc3VsdCIpOworICAgICAgdF9maWVsZCBzdWNjZXNzKCgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOworICAgICAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgICAgKCpmaWVsZF9pdGVyKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgqZmllbGRfaXRlcik7CisgICAgICB9CisKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgmcmVzdWx0KTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIGNsaWVudC4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLyogZ2V0IHNvbWUgQyBmcmllbmRseSBzZXJ2aWNlIG5hbWVzICovCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWU7CisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjOworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YzsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWUgPSAiR09iamVjdCI7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOworCisgIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8KKyAgLy8gc2VydmljZQorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2aWNlCisgICAgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgLy8gVGhlIG5hbWVzIG9mIHRoZSBjbGllbnQgY2xhc3MnIHBhcmVudCBjbGFzcyBhbmQgdHlwZQorICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJDbGllbnQiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfQ0xJRU5UIjsKKyAgfQorCisgIC8vIFRoZSBiYXNlIHNlcnZpY2UgKHRoZSB0b3Btb3N0IGluIHRoZSAiZXh0ZW5kcyIgaGllcmFyY2h5KSwgb24KKyAgLy8gd2hvc2UgY2xpZW50IGNsYXNzIHRoZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIgorICAvLyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkCisgIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7CisgIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIH0KKworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWUgPSBiYXNlX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGJhc2Vfc2VydmljZV9uYW1lKSk7CisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoYmFzZV9zZXJ2aWNlX25hbWVfbGMpOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgaW50ZXJmYWNlICovIiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiCisgICAgICAgICAgICA8PCAiIC8qIGR1bW15IG9iamVjdCAqLyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIG9iamVjdCBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IGZ1bm5hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGFsbCB0aGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRShpbnN0KSAoR19UWVBFX0lOU1RBTkNFX0dFVF9JTlRFUkZBQ0UgKChpbnN0KSwgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSkpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgb3V0IGFsbCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgZl9oZWFkZXJfIDw8ICJnYm9vbGVhbiAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUgPDwgIiAiCisgICAgICAgICAgICAgIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdCBpbnN0YW5jZSBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBjbGllbnQgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiIHBhcmVudDsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gRGVmaW5lICJpbnB1dF9wcm90b2NvbCIgYW5kICJvdXRwdXRfcHJvdG9jb2wiIHByb3BlcnRpZXMgb25seQorICAgIC8vIGZvciBiYXNlIHNlcnZpY2VzOyBjaGlsZCBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIHdpbGwgaW5oZXJpdAorICAgIC8vIHRoZXNlCisgICAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiICBUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiICAiIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGFsbCB0aGUgR09iamVjdCBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAiCisgICAgICAgICAgICA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfdHlwZSgpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JU19DTElFTlRfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworCisgICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3NlbmRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAvLyBpbXBsZW1lbnQgcmVjdiBpZiBub3QgYSBvbmV3YXkgc2VydmljZQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvKiB3cml0ZSBvdXQgdGhlIGdldC9zZXQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworICBmX2hlYWRlcl8gPDwgInZvaWQgIiArIHNlcnZpY2VfbmFtZV9sYyArICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYyk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisgIC8vIGVuZCBvZiBoZWFkZXIgY29kZQorCisgIC8vIEdlbmVyYXRlIGludGVyZmFjZSBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIHN0cmluZyBwYXJhbXNfd2l0aG91dF90eXBlID0gc3RyaW5nKCJpZmFjZSwgIikgKyAoaGFzX3JldHVybiA/ICJfcmV0dXJuLCAiIDogIiIpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXJfZmllbGQ7CisgICAgZm9yIChmX2l0ZXJfZmllbGQgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyX2ZpZWxkICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXJfZmllbGQpIHsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCpmX2l0ZXJfZmllbGQpLT5nZXRfbmFtZSgpOworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgPDwgIiAiIDw8IHBhcmFtcyA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgIHJldHVybiAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUZfR0VUX0lOVEVSRkFDRSAoaWZhY2UpLT4iIDw8IGZ1bm5hbWUgPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgcGFyYW1zX3dpdGhvdXRfdHlwZSA8PCAiZXJyb3IpOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgIkdUeXBlIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCkiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0iIDw8IGVuZGwgPDwgIiAgICB7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2ZpbmFsaXplICovIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIDAsICAgICAvKiBpbnN0YW5jZV9zaXplICovIiA8PCBlbmRsIDw8ICIgICAgICAwLCAgICAgLyogbl9wcmVhbGxvY3MgKi8iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGluc3RhbmNlX2luaXQgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCAgIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8ICIgICAgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZcIiwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICA8PCAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwgIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvcGVydHktcmVsYXRlZCBjb2RlIG9ubHkgZm9yIGJhc2Ugc2VydmljZXMtLS1jaGlsZAorICAvLyBzZXJ2aWNlLWNsaWVudCBjbGFzc2VzIGhhdmUgb25seSBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tIHRoZWlyCisgIC8vIHBhcmVudCBjbGFzcworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIEdlbmVyYXRlIGNsaWVudCBwcm9wZXJ0aWVzCisgICAgZl9zZXJ2aWNlXyA8PCAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgUFJPUF8wLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIiA8PCBlbmRsIDw8ICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKKyAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5ICgiCisgICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIgorICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgorICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgorICAgIGZfc2VydmljZV8gPDwgInZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHkgKCIKKyAgICAgICAgICAgICAgIDw8ICJHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKnZhbHVlLCAiCisgICAgICAgICAgICAgICA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iCisgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPm91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgIH0iIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgc3RyaW5nIHJlcVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIGNzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5vdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8IHJlcVR5cGUgPDwgIiwgY3NlcWlkLCBlcnJvcikgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3NlcnZpY2VfLCBhcmdfc3RydWN0LCAiIiwgIiIsIGZhbHNlKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRSVUU7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBhc3luYyBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3JlY3ZfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnaW50MzIgcnNlcWlkOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKiBmbmFtZSA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiCisgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAoaWZhY2UpLT5pbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCAmZm5hbWUsICZtdHlwZSwgJnJzZXFpZCwgZXJyb3IpIDwgMCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVF9FWENFUFRJT04pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAiCisgICAgICAgICAgICAgICAgICAgICIoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCAiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IseGNlcHRpb24tPnR5cGUsICIKKyAgICAgICAgICAgICAgICAgICAgIlwiYXBwbGljYXRpb24gZXJyb3I6ICVzXCIsIHhjZXB0aW9uLT5tZXNzYWdlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAobXR5cGUgIT0gVF9SRVBMWSkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFLCAiCisgICAgICAgICAgICAgICAgICAgICJcImludmFsaWQgbWVzc2FnZSB0eXBlICVkLCBleHBlY3RlZCBUX1JFUExZXCIsIG10eXBlKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChzdHJuY21wIChmbmFtZSwgXCIiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8IG5hbWUubGVuZ3RoKCkgPDwgIikgIT0gMCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIgorICAgICAgICAgICAgICAgICAgICAiZXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FLCAiCisgICAgICAgICAgICAgICAgICAgICJcIndyb25nIG1ldGhvZCBuYW1lICVzLCBleHBlY3RlZCAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICIqX3JldHVybiIsIDApOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgcmVhZGVycyBmb3IgZXhjZXB0aW9ucywgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlci4KKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKKyAgICAgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X2tleSgpKTsKKyAgICAgICAgICByZXN1bHQuYXBwZW5kKHhjZXB0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCwgIiIsICIiLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gY29weSBvdmVyIGFueSB0aHJvdyBleGNlcHRpb25zIGFuZCByZXR1cm4gZmFpbHVyZQorICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCoiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKQorICAgICAgICAgICAgICAgICAgIDw8ICJfRVJST1IsICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SX0NPREUsIFwiIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gd3JhcCBlYWNoIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfc2VuZF8iCisgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlIjsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiLCBlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisKKyAgICAvLyBpZiBub3Qgb25ld2F5LCBpbXBsZW1lbnQgcmVjdgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJldCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiwgIjsKKworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICByZXQgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICByZXQgKz0gIiwgIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfcmVjdl8iCisgICAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiAoaWZhY2UsICIgPDwgcmV0IDw8ICJlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gcmV0dXJuIFRSVUUgd2hpY2ggbWVhbnMgYWxsIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCBPSworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlLT4iIDw8IGZ1bm5hbWUgPDwgIiA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF8iIDw8IGZ1bm5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGNsaWVudCBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfaW5pdCAoIgorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNsaWVudCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGNsaWVudCBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9jbGllbnRfY2xhc3NfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgKmNscykiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICAgIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaW5wdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXQgdGhlIGNsaWVudCBpbnB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJvdXRwdXRfcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm91dHB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgb3V0cHV0IHByb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBoYW5kbGVyLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBoYW5kbGVyLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHNlcnZpY2VfaGFuZGxlcl9uYW1lID0gc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfaGFuZGxlcl9uYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2hhbmRsZXJfbmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOworCisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUgaGFuZGxlciBjbGFzcycKKyAgLy8gcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJIYW5kbGVyIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIiOworICB9IGVsc2UgeworICAgIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOworICAgIHBhcmVudF90eXBlX25hbWUgPSAiR19UWVBFX09CSkVDVCI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaGFuZGxlciAoYWJzdHJhY3QgYmFzZSBjbGFzcykgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIgorICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBkZWZpbml0aW9uLCBpbmNsdWRpbmcgaXRzIGNsYXNzIG1lbWJlcnMKKyAgLy8gKG1ldGhvZHMpCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IG1ldGhvZF9uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgIgorICAgICAgICAgICAgPDwgIigiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVJfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIG1ldGhvZCBkZWZpbml0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUocmV0dXJuX3R5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdfbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeF9saXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBtZXRob2RfbmFtZSA8PCAiICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDI1LCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsICIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhmdW5jdGlvbl9uYW1lKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKKworICAgIHRfZnVuY3Rpb24gaW1wbGVtZW50aW5nX2Z1bmN0aW9uKHJldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArICJfaGFuZGxlcl8iICsgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJmltcGxlbWVudGluZ19mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3JldHVybl92YWxfaWZfZmFpbCAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgKGlmYWNlKSwgRkFMU0UpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmV0dXJuICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoaWZhY2UpIgorICAgICAgICAgICAgICAgPDwgIi0+IiA8PCBtZXRob2RfbmFtZSA8PCAiIChpZmFjZSwgIjsKKworICAgIGlmICghcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiX3JldHVybiwgIjsKKyAgICB9CisgICAgZm9yIChmaWVsZF9pdGVyID0gYXJncy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorICAgIGZvciAoZmllbGRfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGludGVyZmFjZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIgorICAgICAgICAgICAgICAgICA8PCBtZXRob2RfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICpjbHMpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7CisKKyAgICAgIC8vIEFsbCBtZXRob2RzIGFyZSBwdXJlIHZpcnR1YWwgYW5kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xzLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNscyk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHByb2Nlc3Nvci4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9wcm9jZXNzb3JfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9wcm9jZXNzb3JfbmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7CisgIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOworCisgIHN0cmluZyBoYW5kbGVyX2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOworICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lX2xjID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGhhbmRsZXJfY2xhc3NfbmFtZSk7CisKKyAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lID0gY2xhc3NfbmFtZSArICJQcm9jZXNzRnVuY3Rpb24iOworICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lID0KKyAgICBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiI7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWU7CisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUKKyAgLy8gcHJvY2Vzc29yIGNsYXNzJyBwYXJlbnQgY2xhc3MgbmFtZSBhbmQgdHlwZQorICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgcGFyZW50X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBwYXJlbnRfc2VydmljZV9uYW1lICsgIlByb2Nlc3NvciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9QUk9DRVNTT1IiOworICB9IGVsc2UgeworICAgIHBhcmVudF9jbGFzc19uYW1lID0gIlRocmlmdERpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gIlRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGNsYXNzJyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIgZmlsZQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHByb2Nlc3NvciAqLyIgPDwgZW5kbCA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgZW5kbAorICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciAqaGFuZGxlcjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJHSGFzaFRhYmxlICpwcm9jZXNzX21hcDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIvKiBwcm90ZWN0ZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJnYm9vbGVhbiAoKmRpc3BhdGNoX2NhbGwpIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqcHJvY2Vzc29yLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyNywgJyAnKTsKKyAgZl9oZWFkZXJfIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqaW4sIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0LCIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICpmbmFtZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXFpZCwiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcmVtYWluaW5nIGhlYWRlciBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUl9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX1BST0NFU1NPUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydGllcyBlbnVtCisgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfMCwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIgorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZQorICBhcmdzX2luZGVudCA9IHN0cmluZygxNSwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAiR19ERUZJTkVfVFlQRSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IGNsYXNzX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24gdHlwZQorICBhcmdzX2luZGVudCA9IHN0cmluZyhwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZS5sZW5ndGgoKSArIDIzLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJ0eXBlZGVmIGdib29sZWFuICgqICIgPDwgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPDwgIikgKCIKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKiwgIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uLWRlZmluaXRpb24gdHlwZQorICBmX3NlcnZpY2VfIDw8ICJ0eXBlZGVmIHN0cnVjdCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2NoYXIgKm5hbWU7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPDwgIiBmdW5jdGlvbjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0gIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBzbyB3ZQorICAvLyBjYW4gcmVmZXIgdG8gdGhlbSBpbiB0aGUgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHN0cnVjdCBiZWxvdyBhbmQKKyAgLy8ga2VlcCBhbGwgb2YgdGhlIHByb2Nlc3NvcidzIGRlY2xhcmF0aW9ucyBpbiBvbmUgcGxhY2UKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoIgorICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiopOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGlmIHRoZSBzZXJ2aWNlCisgIC8vIGRlZmluZXMgYW55IG1ldGhvZHMKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzWyIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIl0gPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJvY2Vzc19mdW5jdGlvbl9uYW1lIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgICAgPDwgKGZ1bmN0aW9uX2l0ZXIgPT0gLS1mdW5jdGlvbnMuZW5kKCkgPyAiIiA6ICIsIikgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nIGZ1bmN0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgPSB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjKTsKKworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGJvb2wgaGFzX3JldHVybl92YWx1ZSA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworCisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYXJnX2l0ZXI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKKworICAgIHN0cmluZyBhcmdzX2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIkFyZ3MiOworICAgIHN0cmluZyBhcmdzX2NsYXNzX3R5cGUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9BUkdTIjsKKworICAgIHN0cmluZyByZXN1bHRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgKyAiUmVzdWx0IjsKKyAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX3R5cGUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgKyAiX1JFU1VMVCI7CisKKyAgICBzdHJpbmcgaGFuZGxlcl9mdW5jdGlvbl9uYW1lID0gaGFuZGxlcl9jbGFzc19uYW1lX2xjICsgIl8iICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2xjOworCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfIgorICAgICAgICAgICAgICAgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworCisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYsIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnYm9vbGVhbiByZXN1bHQgPSBUUlVFOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2NsYXNzX25hbWUgKyAiICogYXJncyA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoIiA8PCBhcmdzX2NsYXNzX3R5cGUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpZiAoKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZXF1ZW5jZV9pZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChpbnB1dF9wcm90b2NvbCwgXCJ0cmFuc3BvcnRcIiwgIgorICAgICAgICAgICAgICAgPDwgIiZ0cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gUmVhZCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgodGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUIChhcmdzKSwgIgorICAgICAgICAgICAgICAgPDwgImlucHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAgICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoaW5wdXRfcHJvdG9jb2wsICIKKyAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAgICh0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAhPSBGQUxTRSkpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUoKCphcmdfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqeGNlcHRpb25faXRlciktPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIgcmV0dXJuX3ZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRfY2xhc3NfbmFtZSA8PCAiICogcmVzdWx0X3N0cnVjdDsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmIChhcmdzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoYXJncywiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgICBzdHJpbmcgYXJnX25hbWUgPSAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgYXJnX25hbWUgPDwgIlwiLCAmIiA8PCBhcmdfbmFtZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfZ2V0IChvdXRwdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKKyAgICAgICAgICAgICAgICAgPDwgIiZ0cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHRfc3RydWN0ID0gZ19vYmplY3RfbmV3ICgiIDw8IHJlc3VsdF9jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAocmVzdWx0X3N0cnVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcInN1Y2Nlc3NcIiwgJnJldHVybl92YWx1ZSwgTlVMTCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFBhc3MgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgaW4gdGhlIGhhbmRsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBoYW5kbGVyX2Z1bmN0aW9uX25hbWUgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGIChzZWxmLT5oYW5kbGVyKSwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyhoYW5kbGVyX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyA2LCAnICcpOworICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICBzdHJpbmcgcmV0dXJuX3R5cGVfbmFtZSA9IHR5cGVfbmFtZShyZXR1cm5fdHlwZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQ7CisKKyAgICAgIC8vIENhc3QgcmV0dXJuX3ZhbHVlIGlmIGl0IHdhcyBkZWNsYXJlZCBhcyBhIHR5cGUgb3RoZXIgdGhhbiB0aGUgcmV0dXJuCisgICAgICAvLyB2YWx1ZSdzIGFjdHVhbCB0eXBlLS0tdGhpcyBpcyB0cnVlIGZvciBpbnRlZ2VyIHZhbHVlcyAzMiBiaXRzIG9yIGZld2VyCisgICAgICAvLyBpbiB3aWR0aCwgZm9yIHdoaWNoIEdMaWIgcmVxdWlyZXMgYSBwbGFpbiBnaW50IHR5cGUgYmUgdXNlZCB3aGVuCisgICAgICAvLyBzdG9yaW5nIG9yIHJldHJpZXZpbmcgYXMgYW4gb2JqZWN0IHByb3BlcnR5CisgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZSAhPSBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpKSB7CisgICAgICAgIGlmIChyZXR1cm5fdHlwZV9uYW1lW3JldHVybl90eXBlX25hbWUubGVuZ3RoKCkgLSAxXSAhPSAnKicpIHsKKyAgICAgICAgICByZXR1cm5fdHlwZV9uYW1lICs9ICcgJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm5fdHlwZV9uYW1lICs9ICcqJzsKKworICAgICAgICBmX3NlcnZpY2VfIDw8ICIoIiA8PCByZXR1cm5fdHlwZV9uYW1lIDw8ICIpIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCAiJnJldHVybl92YWx1ZSwiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICImIiA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSA9PSBUUlVFKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFRoZSBoYW5kbGVyIHJlcG9ydGVkIHN1Y2Nlc3M7IHJldHVybiB0aGUgcmVzdWx0LCBpZiBhbnksIHRvIHRoZSBjYWxsZXIKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIFwic3VjY2Vzc1wiLCAiOworICAgICAgICBpZiAodHlwZV9uYW1lKHJldHVybl90eXBlKSAhPSBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpKSB7CisgICAgICAgICAgLy8gUm91bmR0cmlwIGNhc3QgdG8gZml4IHRoZSBwb3NpdGlvbiBvZiBzaWduIGJpdC4KKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIoIiA8PCBwcm9wZXJ0eV90eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgIigiIDw8IHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIikiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybl92YWx1ZSwgIgorICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMKTsiIDw8IGVuZGw7CisKKyAgICAgICAgLy8gRGVhbGxvY2F0ZSAob3IgdW5yZWYpIHJldHVybl92YWx1ZQorICAgICAgICByZXR1cm5fdHlwZSA9IGdldF90cnVlX3R5cGUocmV0dXJuX3R5cGUpOworICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXJldHVybl90eXBlKTsKKworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopcmV0dXJuX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19tYXAoKSB8fCByZXR1cm5fdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHJlc3VsdF9zdHJ1Y3QpLCIgPDwgZW5kbDsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlOyBjaGVjayB0byBzZWUgaWYgYW4gYXBwbGljYXRpb24tZGVmaW5lZAorICAgIC8vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGFuZCBpZiBzbywgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3NldCAocmVzdWx0X3N0cnVjdCwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgPDwgIlRfUkVQTFksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHJlc3VsdF9zdHJ1Y3QpLCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgaGFuZGxlciByZXBvcnRlZCBmYWlsdXJlIGJ1dCByYWlzZWQgbm8gYXBwbGljYXRpb24tZGVmaW5lZAorICAgIC8vIGV4Y2VwdGlvbiwgcmV0dXJuIGEgVGhyaWZ0IGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB3aXRoIHRoZSBpbmZvcm1hdGlvbgorICAgIC8vIHJldHVybmVkIHZpYSBHTGliJ3Mgb3duIGVycm9yLXJlcG9ydGluZyBtZWNoYW5pc20KKyAgICBmX3NlcnZpY2VfIDw8ICJpZiAoKmVycm9yID09IE5VTEwpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfd2FybmluZyAoXCIiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi4iCisgICAgICAgICAgICAgICA8PCAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHN0cmluZygxMSwgJyAnKSA8PCAiXCJidXQgZGlkIG5vdCBzZXQgYW4gZXJyb3JcIik7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ4Y2VwdGlvbiA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwidHlwZVwiLCAgICAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5jb2RlIDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IHN0cmluZygxMSwgJyAnKSA8PCAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIlwibWVzc2FnZVwiLCAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5tZXNzYWdlIDogTlVMTCwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2NsZWFyX2Vycm9yIChlcnJvcik7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVF9FWENFUFRJT04sIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gRGVsbG9jYXRlIG9yIHVucmVmIHJldHJpZXZlZCBhcmd1bWVudCB2YWx1ZXMgYXMgbmVjZXNzYXJ5CisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIGFyZ190eXBlID0gZ2V0X3RydWVfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChhcmdfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKWFyZ190eXBlKTsKKworICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfYnl0ZV9hcnJheV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGlmIChhcmdfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopYXJnX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICAgIGlmIChpc19udW1lcmljKGVsZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgfQorICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX21hcCgpIHx8IGFyZ190eXBlLT5pc19zZXQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmVzdWx0X3N0cnVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChyZXN1bHQgPT0gVFJVRSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAiCisgICAgICAgICAgICAgICAgIDw8ICIob3V0cHV0X3Byb3RvY29sLCBlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSAiCisgICAgICAgICAgICAgICAgIDw8ICIhPSBGQUxTRSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBlcnJvcikgIgorICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJnX29iamVjdF91bnJlZiAoYXJncyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgZGlzcGF0Y2hfY2FsbCBpbXBsZW1lbnRhdGlvbgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZGlzcGF0Y2hfY2FsbCI7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgPDwgIiAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKmRpc3BhdGNoX3Byb2Nlc3NvciwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqb3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2NoYXIgKm1ldGhvZF9uYW1lLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIkdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmICoiCisgICAgICAgICAgICAgPDwgInByb2Nlc3NfZnVuY3Rpb25fZGVmOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gZGlzcGF0Y2hfcmVzdWx0ID0gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZGlzcGF0Y2hfcHJvY2Vzc29yKTsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKnBhcmVudF9jbGFzcyA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50ICgiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9HRVRfQ0xBU1MgKHNlbGYpKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NfZnVuY3Rpb25fZGVmID0gIgorICAgICAgICAgICAgIDw8ICJnX2hhc2hfdGFibGVfbG9va3VwIChzZWxmLT5wcm9jZXNzX21hcCwgbWV0aG9kX25hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAocHJvY2Vzc19mdW5jdGlvbl9kZWYgIT0gTlVMTCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDUzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGlzcGF0Y2hfcmVzdWx0ID0gIgorICAgICAgICAgICAgIDw8ICIoKnByb2Nlc3NfZnVuY3Rpb25fZGVmLT5mdW5jdGlvbikgKHNlbGYsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAvLyBNZXRob2QgbmFtZSBub3QgcmVjb2duaXplZDsgY2hhaW4gdXAgdG8gb3VyIHBhcmVudCBwcm9jZXNzb3ItLS1ub3RlIHRoZQorICAvLyB0b3AtbW9zdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCwgaW4gVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgaXRzZWxmLAorICAvLyB3aWxsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNhbGxlciBpZiBubyBjbGFzcyBpbiB0aGUKKyAgLy8gaGllcmFyY2h5IHJlY29nbml6ZXMgdGhlIG1ldGhvZCBuYW1lCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9IHBhcmVudF9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDQ3LCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJpbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAibWV0aG9kX25hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZGlzcGF0Y2hfcmVzdWx0OyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0eSBzZXR0ZXIKKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7CisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSBQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdfb2JqZWN0X3JlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gQ2hhaW4gdXAgdG8gc2V0IHRoZSBoYW5kbGVyIGluIGV2ZXJ5IHN1cGVyY2xhc3MgYXMgd2VsbAorICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcyktPiIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2V0X3Byb3BlcnR5IChvYmplY3QsIHByb3BlcnR5X2lkLCB2YWx1ZSwgcHNwZWMpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgZ2V0dGVyCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOworICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRvciB0aGUgcHJvY2Vzc29yJ3MgZGlzcG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChnb2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+aGFuZGxlciAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZGlzcG9zZSAoZ29iamVjdCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgZmluYWxpemUgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciAqc2VsZiA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SIChnb2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlbGYtPnByb2Nlc3NfbWFwKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5maW5hbGl6ZSAoZ29iamVjdCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImd1aW50IGluZGV4OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAic2VsZi0+cHJvY2Vzc19tYXAgPSAiCisgICAgICAgICAgICAgICAgImdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsiIDw8IGVuZGw7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDIxLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaW5kZXggPSAwOyBpbmRleCA8ICIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIjsgaW5kZXggKz0gMSkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoc2VsZi0+cHJvY2Vzc19tYXAsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0ubmFtZSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiJiIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0iIDw8ICIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGNsYXNzIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICA8PCAiQ2xhc3MgKmNscykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTIChjbHMpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfcHJvcGVydHk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJkaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3MtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbHMtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImhhbmRsZXJcIiwiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzNCwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCJTZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb25cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiXCJUaGUgc2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIFwiIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlwidG8gd2hpY2ggbWV0aG9kIGNhbGxzIGFyZSBkaXNwYXRjaGVkLlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDMzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgInBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHNlcnZlci4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgaGFuZGxlciBjbGFzcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodHNlcnZpY2UpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgcHJvY2Vzc29yIGNsYXNzCisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRvIHJlcHJlc2VudCBhIFRIcmlmdCBzdHJ1Y3R1cmUgYXMgYSBHT2JqZWN0LgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBuYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOworCisgIHN0cmluZyBmdW5jdGlvbl9uYW1lOworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gd3JpdGUgdGhlIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCBlbmRsIDw8ICJ7ICIgPDwgZW5kbAorICAgICAgICAgICA8PCAiICBUaHJpZnRTdHJ1Y3QgcGFyZW50OyAiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICAvKiBwdWJsaWMgKi8iIDw8IGVuZGw7CisKKyAgLy8gZm9yIGVhY2ggZmllbGQsIGFkZCBhIG1lbWJlciB2YXJpYWJsZQorICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIgIGdib29sZWFuIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gY2xvc2UgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGFuZCBjcmVhdGUgYSB0eXBlZGVmCisgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB3cml0ZSB0aGUgc3RhbmRhcmQgR09iamVjdCBib2lsZXJwbGF0ZQorICBmX3R5cGVzXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIl9UWVBFXyIKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gc3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIC5jIGZpbGUKKworICAvLyBnZW5lcmF0ZSBwcm9wZXJ0aWVzIGVudW0KKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZfdHlwZXNfaW1wbF8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKm1faXRlciktPmdldF9uYW1lKCkpKSk7CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfIiA8PCBtZW1iZXJfbmFtZV91YzsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHN0cnVjdCBJL08gbWV0aG9kcworICBzdHJpbmcgdGhpc19nZXQgPSB0aGlzLT5uc3BhY2UgKyBuYW1lICsgIiAqIHRoaXNfb2JqZWN0ID0gIiArIHRoaXMtPm5zcGFjZV91YyArIG5hbWVfdWMKKyAgICAgICAgICAgICAgICAgICAgKyAiKG9iamVjdCk7IjsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKKworICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIgYW5kIGdldHRlcgorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKKyAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOworCisgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKKworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYnl0ZV9hcnJheV91bnJlZiI7CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2ZyZWUiOworICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfc3RyaW5nIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA8PCAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2Jvb2xlYW4iOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9pbnQ2NCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfZG91YmxlIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9ICIgPDwgYXNzaWduX2Z1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKKyAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOworCisgICAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgICAvLyBMaXN0cyBvZiBiYXNlIHR5cGVzIG90aGVyIHRoYW4gc3RyaW5ncyBhcmUgcmVwcmVzZW50ZWQgYXMgR0FycmF5czsKKyAgICAgICAgICAvLyBhbGwgb3RoZXJzIGFzIEdQdHJBcnJheXMKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgfQorCisgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19oYXNoX3RhYmxlX3VucmVmIjsKKyAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+X19pc3NldF8iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgZ2V0dGVyCisgICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2dldF9wcm9wZXJ0eSI7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBzdHJpbmcgc2V0dGVyX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKKworICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm9vbGVhbiI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50NjQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2RvdWJsZSI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfc3RyaW5nIjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfb2JqZWN0IjsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2JveGVkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUgZm9yIHN0cnVjdCBtZW1iZXIgXCIiICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgfQorCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHNldHRlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKHZhbHVlLCBzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGluc3RhbmNlIGluaXQgZnVuY3Rpb24KKworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2luc3RhbmNlX2luaXQgKCIKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICogb2JqZWN0KSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gZ2VuZXJhdGUgZGVmYXVsdC12YWx1ZSBzdHJ1Y3R1cmVzIGZvciBjb250YWluZXItdHlwZSBtZW1iZXJzCisgIGJvb2wgY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0ID0gZmFsc2U7CisgIGJvb2wgc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0ID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAqbV9pdGVyOworICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IHdpdGggdGhlIGxpc3QgbGl0ZXJhbAorICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInN0YXRpYyAiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIGZhbHNlLCB0cnVlKSA8PCAiIF9fZGVmYXVsdF8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBtZW1iZXJfbmFtZSA8PCAiWyIgPDwgbGlzdC5zaXplKCkgPDwgIl0gPSAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNvbnN0YW50X2xpdGVyYWwobWVtYmVyX3R5cGUsIG1lbWJlcl92YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0ID0gdHJ1ZTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB2YWx1ZXMgZm9yIGEgcG9pbnRlciBhcnJheSAoaS5lLiBhIGxpc3Qgb2YKKyAgICAgICAgLy8gc3RyaW5ncyksIHNldCBhIGZsYWcgc28gd2Uga25vdyB0byBhbHNvIGRlY2xhcmUgYW4gaW5kZXggdmFyaWFibGUgdG8KKyAgICAgICAgLy8gdXNlIGluIHByZS1wb3B1bGF0aW5nIHRoZSBhcnJheQorICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgICAgIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKKyAgICB9CisgIH0KKyAgaWYgKGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCkgeworICAgIGlmIChzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQpIHsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAidW5zaWduZWQgaW50IGxpc3RfaW5kZXg7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorCisgIC8vIHNhdGlzZnkgY29tcGlsZXJzIHdpdGggLVdhbGwgdHVybmVkIG9uCisgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAiLyogc2F0aXNmeSAtV2FsbCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlcl90eXBlKTsKKyAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7CisgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOworICAgICAgfQorICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgZHZhbCArPSBjb25zdGFudF92YWx1ZSgiIiwgdCwgY3YpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHZhbCArPSB0LT5pc19zdHJpbmcoKSA/ICJOVUxMIiA6ICIwIjsKKyAgICAgIH0KKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF9wcm9ncmFtKiB0eXBlX3Byb2dyYW0gPSBtZW1iZXJfdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgIHN0cmluZyB0eXBlX25zcGFjZSA9IHR5cGVfcHJvZ3JhbSA/IHR5cGVfcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIjsKKyAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICB0eXBlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZV9uc3BhY2UpICsgIl8iOworICAgICAgc3RyaW5nIHR5cGVfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpKSk7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBnX29iamVjdF9uZXcgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgPDwgIlRZUEVfIiA8PCB0eXBlX25hbWVfdWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIGluaXRfZnVuY3Rpb247CisgICAgICB0X3R5cGUqIGV0eXBlID0gTlVMTDsKKworICAgICAgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga2V5ID0gKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZhbHVlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGtleSwgdmFsdWUpOworICAgICAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgICAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoZXR5cGUsIE5VTEwpOworICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOworICAgICAgfQorCisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSAiIDw8IGluaXRfZnVuY3Rpb24gPDwgZW5kbDsKKworICAgICAgLy8gUHJlLXBvcHVsYXRlIHRoZSBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWVzLCBpZiBhbnkKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpKSB7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgICAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGxpc3QgPSBtZW1iZXJfdmFsdWUtPmdldF9saXN0KCk7CisKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhldHlwZSkpIHsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZ19hcnJheV9hcHBlbmRfdmFscyAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwgJl9fZGVmYXVsdF8iIDw8CisgICAgICAgICAgICAgIG5hbWUgPDwgIiwgIiA8PCBsaXN0LnNpemUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJmb3IgKGxpc3RfaW5kZXggPSAwOyBsaXN0X2luZGV4IDwgIiA8PCBsaXN0LnNpemUoKSA8PCAiOyAiIDw8CisgICAgICAgICAgICAgICJsaXN0X2luZGV4ICs9IDEpIiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImdfcHRyX2FycmF5X2FkZCAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgc3RyaW5nKDE3LCAnICcpIDw8ICJnX3N0cmR1cCAoX19kZWZhdWx0XyIgPDwKKyAgICAgICAgICAgICAgbmFtZSA8PCAiW2xpc3RfaW5kZXhdKSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAorICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vdCByZXF1aXJlZCwgaW5pdGlhbGl6ZSB0aGUgX19pc3NldCB2YXJpYWJsZSAqLworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+X19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiBjcmVhdGUgdGhlIGRlc3RydWN0b3IgKi8KKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKnRvYmplY3QgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgICAgICAgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHRvYmplY3QgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRvYmplY3QpOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICh0LT5pc19jb250YWluZXIoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAodC0+aXNfbWFwKCkgfHwgdC0+aXNfc2V0KCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIHN0cmluZyBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfcHRyX2FycmF5X3VucmVmIjsKKworICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBkZXN0cnVjdG9yX2Z1bmN0aW9uIDw8ICIgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIFRPRE86IGdfY2xlYXJfb2JqZWN0IG5lZWRzIGdsaWIgPj0gMi4yOAorICAgICAgLy8gZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9vYmplY3QgKCYodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICAvLyBkb2VzIGdfb2JqZWN0X3VucmVmIHRoZSB0cmljaz8KKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJpbmcoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodCkgPDwgIih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSB0aGUgY2xhc3MgaW5pdCBmdW5jdGlvbgorCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiQ2xhc3MgKiBjbHMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0U3RydWN0Q2xhc3MgKnN0cnVjdF9jbGFzcyA9ICIKKyAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1NUUlVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3RfY2xhc3MtPnJlYWQgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9yZWFkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3RfY2xhc3MtPndyaXRlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfd3JpdGU7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYworICAgICAgICAgICAgICAgICAgPDwgIl9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbDsKKworICAgIC8vIGluc3RhbGwgYSBwcm9wZXJ0eSBmb3IgZWFjaCBtZW1iZXIKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gbWVtYmVyLT5nZXRfdmFsdWUoKTsKKworICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyAnICc7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcHJvcGVydHlfaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudDsKKworICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgICBpZiAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfVFlQRV9CWVRFX0FSUkFZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMSwgJyAnKTsKKyAgICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19zdHJpbmcgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgPyAiXCIiICsgbWVtYmVyX3ZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIk5VTEwiKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIyLCAnICcpOworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib29sZWFuIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCgobWVtYmVyX3ZhbHVlICE9IE5VTEwpICYmIChtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkZBTFNFIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIGlmICgoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kxNikKKyAgICAgICAgICAgICAgICAgICB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0kzMikgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpCisgICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpKSB7CisgICAgICAgICAgc3RyaW5nIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50IjsKKyAgICAgICAgICBzdHJpbmcgbWluX3ZhbHVlOworICAgICAgICAgIHN0cmluZyBtYXhfdmFsdWU7CisgICAgICAgICAgb3N0cmluZ3N0cmVhbSBkZWZhdWx0X3ZhbHVlOworCisgICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UOCI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ4IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQxNiI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQxNiI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMzIiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMzIiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50NjQiOworICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UNjQiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UNjQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfZG91YmxlIjsKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICItSU5GSU5JVFkiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIklORklOSVRZIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgbWVtYmVyX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgPyBtZW1iZXJfdmFsdWUtPmdldF9kb3VibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1lbWJlcl92YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgIjAiOworICAgICAgICAgIH0KKworICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZyhwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lIDw8ICIgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBkZWZhdWx0X3ZhbHVlLnN0cigpIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9taW5fdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWluX3ZhbHVlKCk7CisgICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9tYXhfdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWF4X3ZhbHVlKCk7CisgICAgICAgIGludCBtaW5fdmFsdWUgPSAoZW51bV9taW5fdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21pbl92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOworICAgICAgICBpbnQgbWF4X3ZhbHVlID0gKGVudW1fbWF4X3ZhbHVlICE9IE5VTEwpID8gZW51bV9tYXhfdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMTgsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19pbnQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICB0X3Byb2dyYW0qIHR5cGVfcHJvZ3JhbSA9IG1lbWJlcl90eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICAgIHR5cGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgICAgc3RyaW5nIHBhcmFtX3R5cGUgPSB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgKyAiVFlQRV8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworCisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX29iamVjdCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIHN0cmluZyBwYXJhbV90eXBlOworCisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFlbGVtX3R5cGUtPmlzX3N0cmluZygpKSB7CisgICAgICAgICAgcGFyYW1fdHlwZSA9ICJHX1RZUEVfQVJSQVkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX1BUUl9BUlJBWSI7CisgICAgICAgIH0KKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1fdHlwZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfSEFTSF9UQUJMRSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIGlmICh0eXBlID09IDApICIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9ICIgPDwgZW5kbCA8PCAiICAgIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogYmFzZV9maW5hbGl6ZSAqLyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAoR0NsYXNzSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2NsYXNzX2luaXQsIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2ZpbmFsaXplICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsIC8qIGNsYXNzX2RhdGEgKi8iIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIpLCIgPDwgZW5kbCA8PCAiICAgICAgMCwgLyogbl9wcmVhbGxvY3MgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0LCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChUSFJJRlRfVFlQRV9TVFJVQ1QsICIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiVHlwZVwiLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2luZm8sIDApOyIgPDwgZW5kbCA8PCAiICB9IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZnVuY3Rpb25zIHRvIHdyaXRlIFRocmlmdCBzdHJ1Y3R1cmVzIHRvIGEgc3RyZWFtLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbnQgZXJyb3JfcmV0ID0gMDsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBlcnJvcl9yZXQgPSAtMTsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCB0aGlzX2dldCA8PCBlbmRsOworICAvLyBzYXRpc2Z5IC1XYWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IHN0cnVjdAorICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lCisgICAgICA8PCAiXCIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzX29iamVjdC0+X19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IFRSVUUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0CisgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIHJlYWQgVGhyaWZ0IHN0cnVjdHVyZXMgZnJvbSBhIHN0cmVhbS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworICBpbnQgZXJyb3JfcmV0ID0gMDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGVycm9yX3JldCA9IC0xOworICAgIGluZGVudChvdXQpIDw8ICIvKiByZWFkcyBhICIgPDwgbmFtZV91IDw8ICIgb2JqZWN0ICovIiA8PCBlbmRsIDw8ICJzdGF0aWMgZ2ludDMyIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdjaGFyICpuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ2ludDE2IGZpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgbGVuID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJncG9pbnRlciBkYXRhID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ2Jvb2xlYW4gaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHNvbWUgdmFyaWFibGVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHRoZXNlIGFyZW4ndCB1c2VkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGxlbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoZGF0YSk7IiA8PCBlbmRsOworCisgIGlmICghdGhpc19nZXQuZW1wdHkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzICovIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gcmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwgJmZpZCwgZXJyb3IpKSA8IDApIgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmdHlwZSA9PSBUX1NUT1ApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBzd2l0Y2ggZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7CisKKyAgLy8gc3RhcnQgc3dpdGNoCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIHR5cGVzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBnZW5lcmF0ZSBkZXNlcmlhbGl6ZSBmaWVsZAorICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0LCBmYWxzZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgZGVmYXVsdCBjYXNlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICAvLyBlbmQgc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyByZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisKKyAgLy8gZW5kIHdoaWxlIGxvb3AKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nLCB0aHJvdyBhbiBlcnJvcgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgXCJtaXNzaW5nIGZpZWxkXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gLTE7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIHRoZSBmdW5jdGlvbi9zdHJ1Y3R1cmUKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlXyI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJib29sIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiYmluYXJ5IChwcm90b2NvbCwgIiA8PCBuYW1lIDw8ICIgPyAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5kYXRhIDogTlVMTCwgIgorICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIgPyAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5sZW4gOiAwIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgKGdpbnQzMikgIiA8PCBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnIiArIG5hbWUgKyAiJyBUWVBFICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiB0a2V5ID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHR2YWwgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHN0cmluZyB0a2V5X25hbWUgPSB0eXBlX25hbWUodGtleSk7CisgICAgc3RyaW5nIHR2YWxfbmFtZSA9IHR5cGVfbmFtZSh0dmFsKTsKKyAgICBzdHJpbmcgdGtleV9wdHI7CisgICAgc3RyaW5nIHR2YWxfcHRyOworICAgIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKKyAgICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7CisKKyAgICBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvdXQsIHRrZXksIGtleW5hbWUpOworICAgIGRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG91dCwgdHZhbCwgdmFsbmFtZSk7CisKKyAgICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvCisgICAgICAgd2UgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLworICAgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOworICAgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOworCisgICAgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgICB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworCisgICAgLyoKKyAgICAgKiBTb21lIHVnbGluZXNzIGhlcmUuICBUbyBtYXhpbWl6ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UKKyAgICAgKiBhdm9pZCB1c2luZyBHSGFzaFRhYmxlSXRlciBhbmQgaW5zdGVhZCBnZXQgYSBHTGlzdCBvZiBhbGwga2V5cywKKyAgICAgKiB0aGVuIGNvcHkgaXQgaW50byBhIGFycmF5IG9uIHRoZSBzdGFjaywgYW5kIGZyZWUgaXQuCisgICAgICogVGhpcyBpcyBiZWNhdXNlIHdlIG1heSBleGl0IGVhcmx5IGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gZnJlZSB0aGUKKyAgICAgKiBHTGlzdC4KKyAgICAgKi8KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8ICIqIGtleXM7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgaSA9IDAsIGtleV9jb3VudDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0odGtleSkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0odHZhbCkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIiA/ICIKKyAgICAgICAgPDwgIihnaW50MzIpIGdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSA6IDAiCisgICAgICAgIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKKyAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCisgICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKKyAgICAgICAgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwga2V5bmFtZSA8PCAiID0ga2V5c1tpXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdmFsbmFtZSA8PCAiID0gKCIgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyCisgICAgICAgIDw8ICIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiKSwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbWFwKil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtleV9wdHIgKyAiICIgKyBrZXluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmFsX3B0ciArICIgIiArIHZhbG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogdGVsZW0gPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBzdHJpbmcgdGVsZW1fbmFtZSA9IHR5cGVfbmFtZSh0ZWxlbSk7CisgICAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIqIGtleXM7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgaSA9IDAsIGtleV9jb3VudDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIiBlbGVtOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3BvaW50ZXIgdmFsdWU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0ZWxlbSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIiA/ICIKKyAgICAgICAgPDwgIihnaW50MzIpIGdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSA6IDAiCisgICAgICAgIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgorICAgICAgICA8PCAiLCBrZXlfY291bnQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7ICIKKyAgICAgICAgICAgIml0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImtleXNbaSsrXSA9ICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyCisgICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbGVtID0ga2V5c1tpXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhbHVlID0gKGdwb2ludGVyKSBnX2hhc2hfdGFibGVfbG9va3VwICIKKyAgICAgICAgICAgIigoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiksIChncG9pbnRlcikgZWxlbSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc2V0Kil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsZW1fcHRyICsgImVsZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGxlbmd0aCA9ICIoIiArIHByZWZpeCArICIgPyAiICsgcHJlZml4ICsgIi0+bGVuIDogMCkiOworICAgIHN0cmluZyBpID0gdG1wKCJpIik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgKGdpbnQzMikgIgorICAgICAgICA8PCBsZW5ndGggPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgbGVuZ3RoIDw8ICI7ICIKKyAgICAgICAgPDwgaSA8PCAiKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIGksIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsdWUpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50KTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworCisgIC8vIGNhc3QgdG8gbm9uLWNvbnN0CisgIHN0cmluZyBjYXN0ID0gIiI7CisgIHN0cmluZyBuYW1lID0gImdfcHRyX2FycmF5X2luZGV4ICgoR1B0ckFycmF5ICopICIgKyBsaXN0ICsgIiwgIiArIGluZGV4ICsgIikiOworCisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgfSBlbHNlIGlmIChpc19udW1lcmljKHR0eXBlKSkgeworICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCAiICsgYmFzZV90eXBlX25hbWUodHR5cGUpICsgIiwgIiArIGluZGV4ICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJpbmcoKSkgeworICAgIGNhc3QgPSAiKGdjaGFyKikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBjYXN0ID0gIihHSGFzaFRhYmxlKikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmIChldHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICAgIH0KKyAgICBjYXN0ID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiKEdBcnJheSopIiA6ICIoR1B0ckFycmF5KikiOworICB9CisKKyAgdF9maWVsZCBlZmllbGQodHR5cGUsICIoIiArIGNhc3QgKyBuYW1lICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCisvKiBkZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4gKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGVycm9yX3JldCwgYWxsb2NhdGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IgorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gbG9hZCB0aGUgYnl0ZSBhcnJheSB3aXRoIHRoZSBkYXRhCisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gZ19ieXRlX2FycmF5X25ldygpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2J5dGVfYXJyYXlfYXBwZW5kICgiIDw8IG5hbWUgPDwgIiwgKGd1aW50OCAqKSBkYXRhLCAoZ3VpbnQpIGxlbik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSAoZGF0YSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJiIgPDwgdCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyBUWVBFICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KKworICAvLyBpZiB0aGUgdHlwZSBpcyBub3QgcmVxdWlyZWQgYW5kIHRoaXMgaXMgYSB0aHJpZnQgc3RydWN0IChubyBwcmVmaXgpLAorICAvLyBzZXQgdGhlIGlzc2V0IHZhcmlhYmxlLiAgaWYgdGhlIHR5cGUgaXMgcmVxdWlyZWQsIHRoZW4gc2V0IHRoZQorICAvLyBsb2NhbCB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoZSB2YWx1ZSB3YXMgc2V0LCBzbyB0aGF0IHdlIGNhbiBkbyAgICAvLyB2YWxpZGF0aW9uIGxhdGVyLgorICBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIl9faXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgc3VmZml4IDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChwcmVmaXggIT0gIiIgJiYgdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogVGhpcyBzdHJ1Y3QgaXMgYW4gZXhjZXB0aW9uICovIiA8PCBlbmRsOworICAgIGFsbG9jYXRlID0gdHJ1ZTsKKyAgfQorCisgIGlmIChhbGxvY2F0ZSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCAiIDw8IHByZWZpeCA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeAorICAgICAgPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoYWxsb2NhdGUpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUga2V5X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIHZhbHVlX3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmtleV90eXBlLCAmdmFsdWVfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgbWFwIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiB0aGUgbWFwJ3MgZmllbGRzICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIHJlYWQgbWFwIGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGVuZCBtYXJrZXIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmVsZW1lbnRfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHNldCBlbGVtZW50cyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyByZWFkIHNldCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGU7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBpdGVyYXRlIHRocm91Z2ggbGlzdCBlbGVtZW50cyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9saXN0Kil0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gcmVhZCBsaXN0IGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgbmFtZSwgYm9vbCBmb3JfaGFzaF90YWJsZSkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHR5cGUpOworCisgIC8qIElmIHRoZSBnaXZlbiB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZyB0eXBlIHNvIHdlCisgICAgIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHB0ciA9ICFpc19udW1lcmljKHR0eXBlKSA/ICIiIDogIioiOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZm9yX2hhc2hfdGFibGUgJiYgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lCisgICAgICAgIDw8IChwdHIgIT0gIiIgPyAiID0gZ19uZXcgKCIgKyB0bmFtZSArICIsIDEpIiA6ICIgPSBOVUxMIikgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHR5cGUpOworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHRyID0gdHR5cGUtPmlzX3N0cmluZygpIHx8ICF0dHlwZS0+aXNfYmFzZV90eXBlKCkgPyAiICIgOiAiKiAiOworICBzdHJpbmcgaW5pdF92YWwgPSB0dHlwZS0+aXNfZW51bSgpID8gIiIgOiAiID0gTlVMTCI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgbmFtZSA8PCBpbml0X3ZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0a2V5ID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdHZhbCA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWxuYW1lID0gdG1wKCJ2YWwiKTsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGtleSwga2V5bmFtZSwgdHJ1ZSk7CisgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dmFsLCB2YWxuYW1lLCB0cnVlKTsKKworICAvKiBJZiBlaXRoZXIgdGhlIGtleSBvciB2YWx1ZSB0eXBlIGlzIGEgdHlwZWRlZiwgZmluZCBpdHMgdW5kZXJseWluZworICAgICB0eXBlIHNvIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8KKyAgICAgaXQgKi8KKyAgdGtleSA9IGdldF90cnVlX3R5cGUodGtleSk7CisgIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKHR2YWwpOworCisgIHN0cmluZyB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICBzdHJpbmcgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICAvLyBkZXNlcmlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSBtYXAgZWxlbWVudAorICB0X2ZpZWxkIGZrZXkodGtleSwgdGtleV9wdHIgKyBrZXluYW1lKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsICIiLCBlcnJvcl9yZXQpOworICB0X2ZpZWxkIGZ2YWwodHZhbCwgdHZhbF9wdHIgKyB2YWxuYW1lKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiAmJiAiIDw8IGtleW5hbWUgPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZQorICAgICAgICAgICAgICA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgdmFsbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdGVsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGVsZW0sIGVsZW0sIHRydWUpOworCisgIHRfZmllbGQgZmVsZW0odGVsZW0sIHRlbGVtX3B0ciArIGVsZW0pOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIiAmJiAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0KKyAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgICh2b2lkKWluZGV4OworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHN0cmluZyB0ZWxlbV9wdHIgPSAhaXNfbnVtZXJpYyh0dHlwZSkgPyAiIiA6ICIqIjsKKworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHR5cGUsIGVsZW0sIGZhbHNlKTsKKworICB0X2ZpZWxkIGZlbGVtKHR0eXBlLCB0ZWxlbV9wdHIgKyBlbGVtKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19hcnJheV9hcHBlbmRfdmFscyAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIsIDEpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gIk5VTEwiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2ZyZWUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJ0aHJpZnRfc3RyaW5nX2ZyZWUiOworICAgICAgfQorICAgICAgcmV0dXJuICJnX2ZyZWUiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIk5VTEwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfb2JqZWN0X3VucmVmIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19hcnJheV91bnJlZiI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfY29udGFpbmVyKCkgfHwgZXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgOworICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOworICAgIH0KKyAgICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSB0aGUgYXJyYXk6ICVzXG4iLCBldHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQgaW5zaWRlIGFycmF5IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdF9ib29sZWFuX2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQ4X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50MTZfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImdfaW50X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJnX2ludDY0X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2RvdWJsZV9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiZ19zdHJfaGFzaCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdF9ib29sZWFuX2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50OF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQxNl9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImdfaW50X2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiZ19pbnQ2NF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImdfZG91YmxlX2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiZ19zdHJfZXF1YWwiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2VxdWFsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpIHsKKyAgc3RyaW5nIGhhc2hfZnVuYyA9IGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIGNtcF9mdW5jID0gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyBrZXlfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcgdmFsdWVfZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh2YWx1ZSk7CisKKyAgcmV0dXJuICJnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKCIgKyBoYXNoX2Z1bmMgKyAiLCAiICsgY21wX2Z1bmMgKyAiLCAiICsga2V5X2ZyZWVfZnVuYyArICIsICIKKyAgICAgICAgICsgdmFsdWVfZnJlZV9mdW5jICsgIik7IjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKCIgKyBiYXNlX3R5cGVfbmFtZSh0dHlwZSkgKyAiKSk7IjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0dHlwZSk7CisgICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVXBwZXIgY2FzZSBhIHN0cmluZy4gIFdyYXBzIGJvb3N0J3Mgc3RyaW5nIHV0aWxpdHkuCisgKi8KK3N0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBzKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybShzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b3VwcGVyKTsKKyAgcmV0dXJuIHM7CisgIC8vICByZXR1cm4gYm9vc3Q6OnRvX3VwcGVyX2NvcHkgKG5hbWUpOworfQorCisvKioKKyAqIExvd2VyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgorICovCitzdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcyhuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIHJldHVybiBzOworICAvLyAgcmV0dXJuIGJvb3N0Ojp0b19sb3dlcl9jb3B5IChuYW1lKTsKK30KKworLyoqCisgKiBNYWtlcyBhIHN0cmluZyBmcmllbmRseSB0byBDIGNvZGUgc3RhbmRhcmRzIGJ5IGxvd2VyY2FzaW5nIGFuZCBhZGRpbmcKKyAqIHVuZGVyc2NvcmVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlOgorICoKKyAqIElucHV0OiAiWm9tZ0NhbWVsQ2FzZSIKKyAqIE91dHB1dDogInpvbWdfY2FtZWxfY2FzZSIKKyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGludCBwb3MgPSAwOworCisgIC8qIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNuJ3QgdW5kZXJzY29yZWQgaWYgdXBwZXJjYXNlLCBqdXN0IGxvd2VyY2FzZWQgKi8KKyAgcmV0ICs9IHRvbG93ZXIodG1wW3Bvc10pOworICBwb3MrKzsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IHBvczsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgbGMgPSB0b2xvd2VyKHRtcFtpXSk7CisgICAgaWYgKGxjICE9IHRtcFtpXSkgeworICAgICAgcmV0ICs9ICdfJzsKKyAgICB9CisgICAgcmV0ICs9IGxjOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBQZXJmb3JtcyB0aGUgcmV2ZXJzZSBvcGVyYXRpb24gb2YgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzOiBUaGUgZmlyc3QKKyAqIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGlzIG1hZGUgdXBwZXJjYXNlLCBhbG9uZyB3aXRoIGVhY2ggY2hhcmFjdGVyIHRoYXQKKyAqIGZvbGxvd3MgYW4gdW5kZXJzY29yZSAod2hpY2ggaXMgcmVtb3ZlZCkuIFVzZWZ1bCBmb3IgY29udmVydGluZyBUaHJpZnQKKyAqIHNlcnZpY2UtbWV0aG9kIG5hbWVzIGludG8gR09iamVjdC1zdHlsZSBjbGFzcyBuYW1lcy4KKyAqCisgKiBJbnB1dDogInpvbWdfY2FtZWxfY2FzZSIKKyAqIE91dHB1dDogIlpvbWdDYW1lbENhc2UiCisgKi8KK3N0cmluZyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIHVwcGVyY2FzZV9uZXh0ID0gdHJ1ZTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgYyA9IHRtcFtpXTsKKyAgICBpZiAoYyA9PSAnXycpIHsKKyAgICAgIHVwcGVyY2FzZV9uZXh0ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHVwcGVyY2FzZV9uZXh0KSB7CisgICAgICAgIHJldCArPSB0b3VwcGVyKGMpOworICAgICAgICB1cHBlcmNhc2VfbmV4dCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ICs9IGM7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogcmVnaXN0ZXIgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgbWFpbiBwcm9ncmFtICovCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNfZ2xpYiwgIkMsIHVzaW5nIEdMaWIiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4ZDBkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LSBQYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgorICogQ29weXJpZ2h0IChjKSAyMDA2LSBGYWNlYm9vaworICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCisvKioKKyAqIENvbW1vbiBMaXNwIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KKyAqLworY2xhc3MgdF9jbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIHRfY2xfZ2VuZXJhdG9yKAorICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQorICB7CisgICAgbm9fYXNkID0gZmFsc2U7CisgICAgc3lzdGVtX3ByZWZpeCA9ICJ0aHJpZnQtZ2VuLSI7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZm9yKGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2FzZCIpID09IDApIHsKKyAgICAgICAgbm9fYXNkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgic3lzX3ByZWYiKSA9PSAwKSB7CisJc3lzdGVtX3ByZWZpeCA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY2wiOworICAgIGNvcHlfb3B0aW9uc18gPSBvcHRpb25fc3RyaW5nOworICB9CisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgICAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAgICAodF9lbnVtKiAgICAgdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAgICAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NsX3N0cnVjdCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsIChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHN0ZDo6c3RyaW5nIGNsX2F1dG9nZW5fY29tbWVudCgpOworICB2b2lkIGFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KTsKKyAgdm9pZCBwYWNrYWdlX2RlZihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHZvaWQgcGFja2FnZV9pbihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlZF9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9vZih0X3Byb2dyYW0qIHByb2dyYW0pOworICBzdGQ6OnN0cmluZyBwYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZXNwZWMgKHRfdHlwZSAqdCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworICBzdGQ6OnN0cmluZyBjbF9kb2NzdHJpbmcoc3RkOjpzdHJpbmcgcmF3KTsKKworIHByaXZhdGU6CisKKyAgaW50IHRlbXBvcmFyeV92YXI7CisgIC8qKgorICAgKiBJc29sYXRlIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9ucywgYXMgdGhleSBjYW4gcmVxdWlyZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9hc2RfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdmFyc187CisKKyAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKKworICBib29sIG5vX2FzZDsKKyAgc3RkOjpzdHJpbmcgc3lzdGVtX3ByZWZpeDsKK307CisKKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHN0cmluZyBwcm9ncmFtX2RpciA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBwcm9ncmFtX25hbWVfOworICBNS0RJUihwcm9ncmFtX2Rpci5jX3N0cigpKTsKKworICB0ZW1wb3JhcnlfdmFyID0gMDsKKworICBzdHJpbmcgZl90eXBlc19uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi10eXBlcy5saXNwIjsKKyAgc3RyaW5nIGZfdmFyc19uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi12YXJzLmxpc3AiOworCisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBmX3R5cGVzXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX3ZhcnNfLm9wZW4oZl92YXJzX25hbWUuY19zdHIoKSk7CisgIGZfdmFyc18gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBwYWNrYWdlX2RlZihmX3R5cGVzXyk7CisgIHBhY2thZ2VfaW4oZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdmFyc18pOworCisgIGlmICghbm9fYXNkKSB7CisgICAgc3RyaW5nIGZfYXNkX25hbWUgPSBwcm9ncmFtX2RpciArICIvIiArIHN5c3RlbV9wcmVmaXggKyBwcm9ncmFtX25hbWVfICsgIi5hc2QiOworICAgIGZfYXNkXy5vcGVuKGZfYXNkX25hbWUuY19zdHIoKSk7CisgICAgZl9hc2RfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgICAgYXNkZl9kZWYoZl9hc2RfKTsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgcmVzdWx0ICs9ICI6ZGVwZW5kcy1vbiAoOnRocmlmdCI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICByZXN1bHQgKz0gIiA6IiArIHN5c3RlbV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXN1bHQgKz0gIilcbiI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9vZih0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RyaW5nIHByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNsIik7CisgIHJldHVybiBwcmVmaXguZW1wdHkoKSA/ICJ0aHJpZnQtZ2VuZXJhdGVkIiA6IHByZWZpeDsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlKCkgeworICByZXR1cm4gcGFja2FnZV9vZihwcm9ncmFtXyk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBzeW1ib2wpIHsKKyAgcmV0dXJuICJcIiIgKyBzeW1ib2wgKyAiXCIiOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuCisgICAgc3RkOjpzdHJpbmcoIjs7OyAiKSArICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCisgICAgIjs7OyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKKyAgICAiOzs7IG9wdGlvbnMgc3RyaW5nOiAiICsgY29weV9vcHRpb25zXyArICJcbiI7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Y2xfZG9jc3RyaW5nKHN0cmluZyByYXcpIHsKKyAgcmVwbGFjZShyYXcuYmVnaW4oKSwgcmF3LmVuZCgpLCAnIicsICdcJycpOworICByZXR1cm4gcmF3OworfQorCisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9hc2RfLmNsb3NlKCk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfdmFyc18uY2xvc2UoKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZWRfcGFja2FnZSgpIHsKKyAgcmV0dXJuIHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6YXNkZl9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgb3V0IDw8ICIoYXNkZjpkZWZzeXN0ZW0gIzoiIDw8IHN5c3RlbV9wcmVmaXggPDwgcHJvZ3JhbV9uYW1lXyA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9pbmNsdWRlcygpCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOnNlcmlhbCB0IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOmNvbXBvbmVudHMgKCIKKyAgICAgIDw8ICIoOmZpbGUgXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIi10eXBlc1wiKSAiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdmFyc1wiKSkpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioqCisgKiBHZW5lcmF0ZSBhIHBhY2thZ2UgZGVmaW5pdGlvbi4gQWRkIHVzZSByZWZlcmVuY2VzIGVxdWl2YWxlbnQgdG8gdGhlIGlkbCBmaWxlJ3MgaW5jbHVkZSBzdGF0ZW1lbnRzLgorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlX2RlZihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworCisgIG91dCA8PCAiKHRocmlmdDpkZWYtcGFja2FnZSA6IiA8PCBwYWNrYWdlKCk7CisgIGlmICggaW5jbHVkZXMuc2l6ZSgpID4gMCApIHsKKyAgICBvdXQgPDwgIiA6dXNlICgiOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIG91dCA8PCAiIDoiIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIikiOworICB9CisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlX2luKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGNsOmluLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBDb21tb24gTGlzcCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAiKHRocmlmdDpkZWYtZW51bSAiIDw8IHByZWZpeCh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGludCB2YWx1ZSA9IC0xOworCisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiKCI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIjsKKworICAgIGZfdHlwZXNfIDw8ICIoXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgLiAiIDw8IHZhbHVlIDw8ICIpIjsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCAiKSkiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl92YXJzXyA8PCAiKHRocmlmdDpkZWYtY29uc3RhbnQgIiA8PCBwcmVmaXgobmFtZSkgPDwgIiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIlwiIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0IiA6ICJuaWwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICh0eXBlLT5pc19zdHJ1Y3QoKSA/ICIobWFrZS1pbnN0YW5jZSAnIiA6ICIobWFrZS1leGNlcHRpb24gJyIpIDw8CisgICAgICAgICAgIGxvd2VyY2FzZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiAiIDw8CisgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAvLyBlbWl0IGFuIGhhc2ggZm9ybSB3aXRoIGJvdGgga2V5cyBhbmQgdmFsdWVzIHRvIGJlIGV2YWx1YXRlZAorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIih0aHJpZnQ6bWFwICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiKGNsOmNvbnMgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIpIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKHRocmlmdDpzZXQiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKHRocmlmdDpsaXN0IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3QoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgIigiOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworCisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8ICIoIiA8PCBwcmVmaXgoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwKKyAgICAgICAgKCAoTlVMTCAhPSB2YWx1ZSkgPyByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDogIm5pbCIgKSA8PAorICAgICAgICAiIDppZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpOworICAgIGlmICggdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgInN0cmluZyIgPT0gdHlwZXNwZWModHlwZSkgKQorICAgICAgaWYgKCAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgKQorICAgICAgICBvdXQgPDwgIiA6dHlwZSBiaW5hcnkiOworICAgICAgZWxzZQorICAgICAgICBvdXQgPDwgIiA6dHlwZSBzdHJpbmciOworICAgIGVsc2UKKyAgICAgIG91dCA8PCAiIDp0eXBlICIgPDwgdHlwZXNwZWModHlwZSk7CisgICAgaWYgKCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMICkgeworICAgICAgb3V0IDw8ICIgOm9wdGlvbmFsIHQiOworICAgIH0KKyAgICBpZiAoICgqbV9pdGVyKS0+aGFzX2RvYygpKSB7CisgICAgICBvdXQgPDwgIiA6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X2RvYygpKSA8PCAiXCIiOworICAgIH0KKyAgICBvdXQgPDwiKSI7CisgIH0KKworICBvdXQgPDwgIikiOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7CisgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIG91dCA8PCAoaXNfZXhjZXB0aW9uID8gIih0aHJpZnQ6ZGVmLWV4Y2VwdGlvbiAiIDogIih0aHJpZnQ6ZGVmLXN0cnVjdCAiKSA8PAorICAgICAgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoIHRzdHJ1Y3QtPmhhc19kb2MoKSApIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgOworICAgIG91dCA8PCAiXCIiIDw8IGNsX2RvY3N0cmluZyh0c3RydWN0LT5nZXRfZG9jKCkpIDw8ICJcIiIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgOworICBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZikgeworICBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwob3V0LCBmLT5nZXRfeGNlcHRpb25zKCksIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50OworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfY2xpZW50ID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorCisgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kc19jbGllbnQuZW1wdHkoKSA/ICJuaWwiIDogcHJlZml4KGV4dGVuZHNfY2xpZW50KTsKKworICBmX3R5cGVzXyA8PCAiKHRocmlmdDpkZWYtc2VydmljZSAiIDw8IHByZWZpeChzZXJ2aWNlX25hbWVfKSA8PCAiICIKKyAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQ7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCB0c2VydmljZS0+aGFzX2RvYygpKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiKDpkb2N1bWVudGF0aW9uIFwiIiA8PCBjbF9kb2NzdHJpbmcodHNlcnZpY2UtPmdldF9kb2MoKSkgPDwgIlwiKSI7CisgICAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogZnVuY3Rpb24gPSAqZl9pdGVyOworICAgIHN0cmluZyBmbmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICAgIHRfc3RydWN0KiBleGNlcHRpb25zID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4bWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoOm1ldGhvZCAiIDw8IHByZWZpeChmbmFtZSk7CisgICAgZl90eXBlc18gPDwgIiAoIiA8PCBzaWduYXR1cmUgPDwgIiAiICA8PCB0eXBlc3BlYygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpIjsKKyAgICBpZiAoeG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpleGNlcHRpb25zICIgOworICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhmX3R5cGVzXywgZnVuY3Rpb24pOworICAgIH0KKyAgICBpZiAoICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOm9uZXdheSB0IjsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmhhc19kb2MoKSApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZG9jdW1lbnRhdGlvbiBcIiIKKyAgICAgICAgICAgICAgIDw8IGNsX2RvY3N0cmluZygoKmZfaXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgfQorICAgIGZfdHlwZXNfIDw8ICIpIjsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlc3BlYyh0X3R5cGUgKnQpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQgLT4gaXNfYmluYXJ5KCkpeworICAgIHJldHVybiAiYmluYXJ5IjsKKyAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodCk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbSA9ICh0X21hcCopIHQ7CisgICAgcmV0dXJuICIodGhyaWZ0Om1hcCAiICsgdHlwZXNwZWMobS0+Z2V0X2tleV90eXBlKCkpICsgIiAiICsKKyAgICAgIHR5cGVzcGVjKG0tPmdldF92YWxfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIoc3RydWN0ICIgKyBwcmVmaXgodHlwZV9uYW1lKHQpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6bGlzdCAiICsgdHlwZXNwZWMoKCh0X2xpc3QqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKHRocmlmdDpzZXQgIiArIHR5cGVzcGVjKCgodF9zZXQqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihlbnVtIFwiIiArICgodF9lbnVtKikgdCktPmdldF9uYW1lKCkgKyAiXCIpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gZ2VuZXJhdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZ3N0cmVhbSByZXM7CisgIHJlcyA8PCAiKCI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA8PCAiICI7CisgICAgfQorICAgIHJlcyA8PCAiKCIgKyBwcmVmaXgoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwKKyAgICAgIHR5cGVzcGVjKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8CisgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAgIikiOworCisKKyAgfQorICByZXMgPDwgIikiOworICByZXR1cm4gcmVzLnN0cigpOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHByZWZpeCA9IHBhY2thZ2Vfb2YocHJvZ3JhbSkgPT0gcGFja2FnZSgpID8gIiIgOiBwYWNrYWdlX29mKHByb2dyYW0pICsgIjoiOworCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICBuYW1lID0gbG93ZXJjYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjbCwKKyAgICAiQ29tbW9uIExpc3AiLAorICAgICIgICAgbm9fYXNkOiAgICAgICAgICBEbyBub3QgZGVmaW5lIEFTREYgc3lzdGVtcyBmb3IgZWFjaCBnZW5lcmF0ZWQgVGhyaWZ0IHByb2dyYW0uXG4iCisgICAgIiAgICBzeXNfcHJlZj0gICAgICAgIFRoZSBwcmVmaXggdG8gZ2l2ZSBBU0RGIHN5c3RlbSBuYW1lcy4gRGVmYXVsdDogdGhyaWZ0LWdlbi1cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjQ0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMzMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIE9iamVjdGl2ZS1DIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgorICovCitjbGFzcyB0X2NvY29hX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2NvY29hX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbG9nX3VuZXhwZWN0ZWRfID0gZmFsc2U7CisgICAgdmFsaWRhdGVfcmVxdWlyZWRfID0gZmFsc2U7CisgICAgYXN5bmNfY2xpZW50c18gPSBmYWxzZTsKKyAgICBwcm9taXNlX2tpdF8gPSBmYWxzZTsKKyAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gZmFsc2U7CisgICAgcG9kc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsb2dfdW5leHBlY3RlZCIpID09IDApIHsKKyAgICAgICAgbG9nX3VuZXhwZWN0ZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidmFsaWRhdGVfcmVxdWlyZWQiKSA9PSAwKSB7CisgICAgICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jX2NsaWVudHMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jX2NsaWVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJvbWlzZV9raXQiKSA9PSAwKSB7CisgICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImRlYnVnX2Rlc2NyaXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBvZHMiKSA9PSAwKSB7CisgICAgICAgIHBvZHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjb2NvYToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY29jb2EiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2NvcHlfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZhaWx1cmVCbG9ja05hbWUpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaXN0TmFtZSk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeCgpOworICBzdGQ6OnN0cmluZyBjb2NvYV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGNvY29hX3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZiA9IGZhbHNlLCBib29sIG5lZWRzX211dGFibGUgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGVsZW1lbnRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHlfaXNzZXQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eV91bnNldCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKTsKKyAgc3RkOjpzdHJpbmcgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKTsKKyAgc3RkOjpzdHJpbmcgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByb3RvY29sX25hbWUsIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBmb3JtYXRfY2FzdF9mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7CisgIHN0ZDo6c3RyaW5nIGJveCh0X3R5cGUgKnR0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgdW5ib3godF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldHRlcl9uYW1lKHN0cmluZyBmaWVsZF9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgc2V0dGVyX25hbWUoc3RyaW5nIGZpZWxkX25hbWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfY29weSh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgICAKKyAgICByZXR1cm4gdHR5cGUtPmlzX3N0cmluZygpOworICB9CisgIAorICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187CisgIGludCBlcnJvcl9jb25zdGFudF87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2ltcGxfOworCisgIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOworICBib29sIHZhbGlkYXRlX3JlcXVpcmVkXzsKKyAgYm9vbCBhc3luY19jbGllbnRzXzsKKyAgYm9vbCBwcm9taXNlX2tpdF87CisgIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKKyAgYm9vbCBwb2RzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgY29jb2FfcHJlZml4XyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpOworCisgIC8vIHdlIGhhdmUgYSAuaCBoZWFkZXIgZmlsZS4uLgorICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pICsgIi5oIjsKKyAgc3RyaW5nIGZfaGVhZGVyX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKSArIGZfaGVhZGVyX25hbWU7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBjb2NvYV9pbXBvcnRzKCkgPDwgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKKworICAvLyAuLi5hbmQgYSAubSBpbXBsZW1lbnRhdGlvbiBmaWxlCisgIHN0cmluZyBmX2ltcGxfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pICsgIi5tIjsKKyAgc3RyaW5nIGZfaW1wbF9mdWxsbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmX2ltcGxfbmFtZTsKKyAgZl9pbXBsXy5vcGVuKGZfaW1wbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBjb2NvYV9pbXBvcnRzKCkgPDwgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKSA8PCAiI2ltcG9ydCBcIiIgPDwgZl9oZWFkZXJfbmFtZSA8PCAiXCIiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIGVycm9yX2NvbnN0YW50XyA9IDYwMDAwOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBDb2NvYSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIENvY29hIGxpYnJhcmllcworICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICIjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD5cbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyB0aHJpZnQgcnVudGltZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQgcnVudGltZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX3RocmlmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2wuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sRmFjdG9yeS5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQXBwbGljYXRpb25FcnJvci5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2xFcnJvci5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2xVdGlsLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm9jZXNzb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEJhc2UuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEFzeW5jVHJhbnNwb3J0LmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRCYXNlQ2xpZW50LmgiKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gaW5jbHVkZXM7CisKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgZm9yIChpX2l0ZXI9aW5jbHVkZXNfbGlzdC5iZWdpbigpOyBpX2l0ZXIhPWluY2x1ZGVzX2xpc3QuZW5kKCk7ICsraV9pdGVyKSB7CisgICAgaW5jbHVkZXMgPDwgIiNpbXBvcnQgIjsKKyAgICBpZiAocG9kc18pIHsKKyAgICAgIGluY2x1ZGVzIDw8ICI8VGhyaWZ0LyIgPDwgKmlfaXRlciA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluY2x1ZGVzIDw8ICJcIiIgPDwgKmlfaXRlciA8PCAiXCIiOworICAgIH0KKyAgICBpbmNsdWRlcyA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgaW5jbHVkZXMgPDwgIiNpbXBvcnQgIjsKKyAgICBpZiAocG9kc18pIHsKKyAgICAgIGluY2x1ZGVzIDw8ICI8UHJvbWlzZUtpdC9Qcm9taXNlS2l0Lmg+IjsKKyAgICB9IGVsc2UgeworICAgICAgaW5jbHVkZXMgPDwgIlwiUHJvbWlzZUtpdC5oXCIiOworICAgIH0KKyAgICBpbmNsdWRlcyA8PCBlbmRsOworICB9CisKKyAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBvdGhlcl9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdGhlcl9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0IFwiIgorICAgICAgICAgICAgIDw8IG90aGVyX2luY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpCisgICAgICAgICAgICAgPDwgY2FwaXRhbGl6ZShvdGhlcl9pbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICA8PCAiLmhcIiIgPDwgZW5kbDsKKyAgfQorCisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgcmV0dXJuIGluY2x1ZGVzLnN0cigpOworfQorCisvKioKKyAqIEZpbmlzaCB1cCBnZW5lcmF0aW9uLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIHN0aWNrIG91ciBjb25zdGFudHMgZGVjbGFyYXRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBmaWxlCisgIC8vIHNpbmNlIHRoZXkgcmVmZXIgdG8gdGhpbmdzIHdlIGFyZSBkZWZpbmluZy4KKyAgZl9oZWFkZXJfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gb2JqZWN0aXZlLWMKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19tYXAoKSkgeworICAgIHRfbWFwICptYXAgPSAodF9tYXAgKil0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKyAgICBpZiAobWFwLT5nZXRfa2V5X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobWFwLT5nZXRfdmFsX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGVkZWYtPmdldF90eXBlKCk7CisgICAgaWYgKHNldC0+Z2V0X2VsZW1fdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlZGVmLT5nZXRfdHlwZSgpOworICAgIGlmIChsaXN0LT5nZXRfZWxlbV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfCisgICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19jb250YWluZXIoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfCisgICAgICAgICAgICAgIDw8ICJNdXRhYmxlIiA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCisgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCBpbnN0ZWFkIHVzaW5nCisgKiBOU19FTlVNIGtleXdvcmQgaW4gT2JqZWN0aXZlLUMuICBGb3IgbmFtZXNwYWNlIHB1cnBvc2VzLCB0aGUgbmFtZSBvZgorICogdGhlIGVudW0gaXMgcHJlZml4ZWQgdG8gZWFjaCBlbGVtZW50IGluIGtlZXBpbmcgd2l0aCBDb2NvYSAmIFN3aWZ0CisgKiBzdGFuZGFyZHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIE5TX0VOVU0oU0ludDMyLCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfaGVhZGVyXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNvbnN0X2ludGVyZmFjZTsKKworICBjb25zdF9pbnRlcmZhY2UgPDwgIkZPVU5EQVRJT05fRVhQT1JUIE5TU3RyaW5nICoiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW47IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisKKyAgYm9vbCBuZWVkc19jbGFzcyA9IGZhbHNlOworCisgIC8vIFB1YmxpYyBjb25zdGFudHMgZm9yIGJhc2UgdHlwZXMgJiBzdHJpbmdzCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgY29uc3RfaW50ZXJmYWNlIDw8ICJGT1VOREFUSU9OX0VYUE9SVCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBuZWVkc19jbGFzcyA9IHRydWU7CisgICAgfQorICB9CisKKworICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMiOworCisgIGlmIChuZWVkc19jbGFzcykgeworCisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGw7CisKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCAiIDogTlNPYmplY3QgIjsKKyAgICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOworICAgIHNjb3BlX2Rvd24oY29uc3RfaW50ZXJmYWNlKTsKKworICAgIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQgZGVmaW5lZC4KKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8ICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGwgPDwgIkBlbmQiOworICB9CisKKyAgLy8gdGhpcyBnZXRzIHNwaXQgaW50byB0aGUgaGVhZGVyIGZpbGUgaW4gOjpjbG9zZV9nZW5lcmF0b3IKKyAgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPSBjb25zdF9pbnRlcmZhY2Uuc3RyKCk7CisKKyAgZl9pbXBsXyA8PCAiTlNTdHJpbmcgKiIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpbiA9ICIKKyAgICAgICAgICA8PCAiQFwiIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluXCI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gdmFyaWFibGVzIGluIHRoZSAubSBob2xkIGFsbCBzaW1wbGUgY29uc3RhbnQgdmFsdWVzCisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGZfaW1wbF8gPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWU7CisgICAgdF90eXBlKiB0dHlwZSA9IHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoIXR0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2ltcGxfIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmX2ltcGxfLCB0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgaWYgKG5lZWRzX2NsYXNzKSB7CisKKyAgICBmX2ltcGxfIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpbml0aWFsaXplIGNvbXBsZXggY29uc3RhbnRzIHdoZW4gdGhlIGNsYXNzIGlzIGxvYWRlZAorICAgIGZfaW1wbF8gPDwgIisgKHZvaWQpIGluaXRpYWxpemUgIjsKKyAgICBzY29wZV91cChmX2ltcGxfKTsKKworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBmX2ltcGxfIDw8IGVuZGw7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfaW1wbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvY29hX3ByZWZpeF8gKyAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKGZfaW1wbF8pOworCisgICAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudAorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGZfaW1wbF8gPDwgZW5kbCA8PCAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICIgIjsKKyAgICAgICAgc2NvcGVfdXAoZl9pbXBsXyk7CisgICAgICAgIGluZGVudChmX2ltcGxfKSA8PCAicmV0dXJuICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKGZfaW1wbF8pOworICAgICAgfQorICAgIH0KKworICAgIGZfaW1wbF8gPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBwcm90ZWN0ZWQgZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gTlNFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHhjZXB0aW9uLCB0cnVlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImVudW0geyIgPDwgZW5kbAorICAgICAgICA8PCAiICAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3IiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgICIgPSAtIiA8PCBlcnJvcl9jb25zdGFudF8rKyA8PCBlbmRsCisgICAgICAgIDw8ICJ9OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIk5TRXJyb3IgIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIk5TT2JqZWN0ICI7CisgIH0KKyAgb3V0IDw8ICI8VEJhc2UsIE5TQ29kaW5nLCBOU0NvcHlpbmc+ICIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKworICAvLyBwcm9wZXJ0aWVzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIpIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eV9pc3NldCgqbV9pdGVyKSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHlfdW5zZXQoKm1faXRlcikgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIGluaXRpYWxpemVyIGZvciBhbGwgZmllbGRzCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBzaWduYXR1cmUgZm9yIGluaXRpYWxpemVyIG9mIHN0cnVjdCB3aXRoIGEgcGFyYW1ldGVyIGZvcgorICogZWFjaCBmaWVsZC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoIjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGlmIChtX2l0ZXIgPT0gbWVtYmVycy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgKyttX2l0ZXI7CisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiAiOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpbml0V2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKKyAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdFdpdGhDb2RlcjogKE5TQ29kZXIgKikgZGVjb2RlciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCisgICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDb2RlcjogZGVjb2Rlcl07IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoW2RlY29kZXIgY29udGFpbnNWYWx1ZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSkiCisgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVPYmplY3RGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUJvb2xGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDMyRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQ2NEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlRG91YmxlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGRlY29kZSB0aHJpZnQgdHlwZTogIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQgPSBZRVM7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgZW5jb2RlV2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKKyAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIGVuY29kZVdpdGhDb2RlcjogKE5TQ29kZXIgKikgZW5jb2RlciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZW5jb2RlV2l0aENvZGVyOiBlbmNvZGVyXTsiIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVPYmplY3Q6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUJvb2w6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDMyOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ2NDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlRG91YmxlOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGVuY29kZSB0aHJpZnQgdHlwZTogIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBjb3B5IG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2NvcHlfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB2YWwgPSBbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBlcnJvcldpdGhEb21haW46IHNlbGYuZG9tYWluIGNvZGU6IHNlbGYuY29kZSB1c2VySW5mbzogc2VsZi51c2VySW5mb107IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB2YWwgPSBbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhbC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gW3NlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBjb3B5XTsiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhbC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gc2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHZhbDsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaGFzaCBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9oYXNoX21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICItIChOU1VJbnRlZ2VyKSBoYXNoIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TVUludGVnZXIgaGFzaCA9IDE3OyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoID0gKGhhc2ggKiAzMSkgXiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIklzU2V0ID8gMjY1NDQzNTc2MSA6IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGhhc2hdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoID0gKGhhc2ggKiAzMSkgXiBbQChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikgaGFzaF07IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGhhc2g7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpc0VxdWFsIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgaXNFcXVhbDogKGlkKSBhbk9iamVjdCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYgPT0gYW5PYmplY3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtzdXBlciBpc0VxdWFsOmFuT2JqZWN0XSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2FuT2JqZWN0IGlzS2luZE9mQ2xhc3M6WyIgPDwgY2xhc3NfbmFtZSA8PCAiIGNsYXNzXV0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBjbGFzc19uYW1lIDw8ICIgKm90aGVyID0gKCIgPDwgY2xhc3NfbmFtZSA8PCAiICopYW5PYmplY3Q7IiA8PCBlbmRsOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgoXyIgPDwgbmFtZSA8PCAiSXNTZXQgIT0gb3RoZXItPl8iIDw8IG5hbWUgPDwgIklzU2V0KSB8fCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAiCisgICAgICAgICAgICA8PCAiKF8iIDw8IG5hbWUgPDwgIklzU2V0ICYmICIKKyAgICAgICAgICAgIDw8ICIoKF8iIDw8IG5hbWUgPDwgIiB8fCBvdGhlci0+XyIgPDwgbmFtZSA8PCAiKSAmJiAiCisgICAgICAgICAgICA8PCAiIVtfIiA8PCBuYW1lIDw8ICIgaXNFcXVhbDpvdGhlci0+XyIgPDwgbmFtZSA8PCAiXSkpKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF8iIDw8IG5hbWUgPDwgIklzU2V0ICE9IG90aGVyLT5fIiA8PCBuYW1lIDw8ICJJc1NldCkgfHwiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICJJc1NldCAmJiAiCisgICAgICAgICAgICA8PCAiKF8iIDw8IG5hbWUgPDwgIiAhPSBvdGhlci0+XyIgPDwgbmFtZSA8PCAiKSkpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gZXhjZXB0aW9ucyBuZWVkIHRvIGNhbGwgdGhlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb24gTlNFeGNlcHRpb24KKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3N1cGVyIGluaXRXaXRoRG9tYWluOiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvciIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBuaWxdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gc3RydWN0CisKKyAgICAvLyBkZWZhdWx0IGluaXRpYWxpemVyCisgICAgLy8gc2V0dXAgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAgICBpbmRlbnQob3V0KSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGYuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIC8vIGluaXRpYWxpemVyIHdpdGggYWxsIGZpZWxkcyBhcyBwYXJhbXMKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc2VsZiBpbml0XTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgIGlmIChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgbXV0YWJsZUNvcHldOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQgPSBZRVM7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBpbml0V2l0aENvZGVyIGZvciBOU0NvZGluZworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGVuY29kZVdpdGhDb2RlciBmb3IgTlNDb2RpbmcKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGhhc2ggYW5kIGlzRXF1YWwgZm9yIE5TT2JqZWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9oYXNoX21ldGhvZChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgLy8gY29weSBmb3IgTlNPYmplY3QKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2NvcHlfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgIi0gKEJPT0wpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcworICBpbmRlbnQob3V0KSA8PCAiTlNTdHJpbmcgKiBmaWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyIGZpZWxkVHlwZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJTSW50MzIgZmllbGRJRDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTEwgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KQorICAgICAgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAmZmllbGROYW1lIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogJmZpZWxkSUQgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09IFRUeXBlU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZFR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiZmllbGRWYWx1ZSIpOworICAgIGluZGVudChvdXQpIDw8IGNhbGxfZmllbGRfc2V0dGVyKCpmX2l0ZXIsICJmaWVsZFZhbHVlIikgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGw7CisgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiBmaWVsZCBJRCAlaSBoYXMgdW5leHBlY3RlZCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX19QUkVUVFlfRlVOQ1RJT05fXywgKGludClmaWVsZElELCAoaW50KWZpZWxkVHlwZSk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaWYgKGxvZ191bmV4cGVjdGVkXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogdW5leHBlY3RlZCBmaWVsZCBJRCAlaSB3aXRoIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAiX19QUkVUVFlfRlVOQ1RJT05fXywgKGludClmaWVsZElELCAoaW50KWZpZWxkVHlwZSk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZEZpZWxkRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpZiAodmFsaWRhdGVfcmVxdWlyZWRfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHZhbGlkYXRlOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG5pbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiXCIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LCB3aGljaAorICogaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuIGlmIHRoZXkgYXJlCisgKiBzZXQsIGFuZCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKyAqIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB2YWxpZGF0ZTogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkgIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFRQcm90b2NvbEVycm9yVW5rbm93biIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogQHtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IEAoVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc3NpbmdSZXF1aXJlZEZpZWxkKSwiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIn1dOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCisgKiBnZXR0ZXIsIHNldHRlciwgaXNzZXQgZ2V0dGVyLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBmaWVsZF9uYW1lOworICAgIGNhcF9uYW1lWzBdID0gdG91cHBlcihjYXBfbmFtZVswXSk7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgZmllbGRfbmFtZSA8PCAiSXNTZXQgPSBZRVM7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyIC0gZG8gd2UgbmVlZCB0aGlzPworICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSB1bnNldCIgPDwgY2FwX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmlsOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0ID0gTk87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIC8vIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uCisgIGlmIChkZWJ1Z19kZXNjcmlwdGlvbnNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZWJ1Z0Rlc2NyaXB0aW9uIHsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNdXRhYmxlU3RyaW5nICogbXMgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IEBcIiIKKyAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiXTsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiLCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKKyAgICB9CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiW21zIGFwcGVuZEZvcm1hdDogQFwiIiA8PCBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHR0eXBlKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCBmb3JtYXRfY2FzdF9mb3JfdHlwZSh0dHlwZSkgPDwgIl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIpXCJdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogbXNdOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiAgSW4gT2JqZWN0aXZlLUMgdGhpcyBjb25zaXN0cyBvZiBhCisgKiBwcm90b2NvbCBkZWZpbml0aW9uLCBhIGNsaWVudCBpbnRlcmZhY2UgYW5kIGEgY2xpZW50IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIGlmIChhc3luY19jbGllbnRzXykgeworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIHFuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgdF9zdHJ1Y3QgcW5hbWVfdHMgPSB0X3N0cnVjdCh0cy0+Z2V0X3Byb2dyYW0oKSwgcW5hbWUpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBxbmFtZV90cy5hcHBlbmQoKm1faXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcW5hbWVfdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnFuYW1lX3RzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICB9Cit9CisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gY3JlYXRlIGEgcmVzdWx0IHN0cnVjdCB3aXRoIGEgc3VjY2VzcyBmaWVsZCBvZiB0aGUgcmV0dXJuIHR5cGUsCisgIC8vIGFuZCBhIGZpZWxkIGZvciBlYWNoIHR5cGUgb2YgZXhjZXB0aW9uIHRocm93bgorICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbikpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8ICI7IgorICAgICAgICA8PCAiICAvLyB0aHJvd3MgIjsKKyAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpICsgIiwgIjsKKyAgICB9CisgICAgb3V0IDw8ICJURXhjZXB0aW9uIiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBhc3luY2hyb25vdXMgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmMiCisgICAgICA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8ICItICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgICBvdXQgPDwgIi0gIiA8PCBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IDogVEJhc2VDbGllbnQgPCIKKyAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIiA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSAiCisgICAgICAgICAib3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnRBc3luYyA6IFRCYXNlQ2xpZW50IDwiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYz4gIiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkgIgorICAgICAgPDwgInRyYW5zcG9ydEZhY3Rvcnk6IChpZCA8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4pIHRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqdGhlCisgKiBzZXJ2aWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKQorICAgICAgPDwgIlByb2Nlc3NvciA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yPiAiIDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfCisgICAgICA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7CisgIG91dCA8PCAiLSAoaWQ8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbigKKyAgICBvc3RyZWFtJiBvdXQsCisgICAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgeworICBzdHJpbmcgZnVubmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2Jvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIG5lZWRzX3Byb3RvY29sID8gIm91dFByb3RvY29sIiA6ICIiLCB0cnVlKSA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiCisgICAgICA8PCAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSA/ICIgdHlwZTogVE1lc3NhZ2VUeXBlT05FV0FZIiA6ICIgdHlwZTogVE1lc3NhZ2VUeXBlQ0FMTCIpCisgICAgICA8PCAiIHNlcXVlbmNlSUQ6IDAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICA8PCAiXCIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGZpZWxkTmFtZSA8PCAiICE9IG5pbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgPDwgIlwiIgorICAgICAgICAgICAiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmbGRfaXRlciwgZmllbGROYW1lKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCisgICAgb3N0cmVhbSYgb3V0LAorICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIHJlY3ZfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgKikgcmVzdWx0ICI7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgInByb3RvY29sIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJlcnJvciI7CisgICAgfQorICB9CisgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgIG91dCA8PCAiOiAoaWQ8VFByb3RvY29sPikgaW5Qcm90b2NvbCBlcnJvciI7CisgIH0KKyAgb3V0IDw8ICI6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFRPRE8obWNzbGVlKTogTWVzc2FnZSB2YWxpZGF0aW9uIGhlcmUsIHdhcyB0aGUgc2VxaWQgZXRjIG9rPworCisgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICppbmNvbWluZ0V4Y2VwdGlvbiA9IFtzZWxmIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uOiBpblByb3RvY29sXTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoaW5jb21pbmdFeGNlcHRpb24pIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX190aHJpZnRFcnJvcikiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gaW5jb21pbmdFeGNlcHRpb247IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCisgIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZSA8PCAiICogcmVzdWx0ZXIgPSBbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHJlc3VsdG5hbWUgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghW3Jlc3VsdGVyIHJlYWQ6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHRlci5zdWNjZXNzSXNTZXQpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKnJlc3VsdCA9IHJlc3VsdGVyLnN1Y2Nlc3M7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHRlci4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBbcmVzdWx0ZXIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX3RocmlmdEVycm9yKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IEB7VEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk6IEBcIiIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIn1dOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuICdzZW5kXycgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgb3V0IDw8ICIgIjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgIjogIiA8PCBmaWVsZE5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBmaWVsZE5hbWUgPDwgIjogIiA8PCBmaWVsZE5hbWU7CisgICAgfQorICB9CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiBlcnJvciI7CisgIH0KKyAgb3V0IDw8ICI6IF9fdGhyaWZ0RXJyb3JdKSAiIDw8IGludmFsaWRfcmV0dXJuX3N0YXRlbWVudCh0ZnVuY3Rpb24pIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiAnc2VuZF8nIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmYWlsdXJlQmxvY2tOYW1lKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCAiICI7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0KKyAgfQorICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICIgcHJvdG9jb2wiOworICB9CisgIG91dCA8PCAiOiBwcm90b2NvbCBlcnJvcjogJnRocmlmdEVycm9yXSkgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZhaWx1cmVCbG9ja05hbWUgPDwgIih0aHJpZnRFcnJvcik7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgbmFtZSA8PCAiICgpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gaW5Qcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBvdXRQcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IG5hbWUgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplcnMKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3NlbGYgaW5pdFdpdGhJblByb3RvY29sOiBwcm90b2NvbCBvdXRQcm90b2NvbDogcHJvdG9jb2xdOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgYW5JblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pICIKKyAgICAgICAgICJhbk91dFByb3RvY29sIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzZWxmKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImluUHJvdG9jb2wgPSBhbkluUHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dFByb3RvY29sID0gYW5PdXRQcm90b2NvbDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIGZhbHNlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2g6IF9fdGhyaWZ0RXJyb3JdKSAiIDw8IGludmFsaWRfcmV0dXJuX3N0YXRlbWVudCgqZl9pdGVyKSA8PCBlbmRsOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiIF9fcmVzdWx0OyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAmX19yZXN1bHQgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSAiCisgICAgICAgICAgICA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9fcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBAKF9fcmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgaXRzIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50QXN5bmMiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKworICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IG5hbWUgPDwgZW5kbAorICAgICAgPDwgZW5kbCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBhUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydEZhY3Rvcnk6IChpZCA8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4pIGFUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzZWxmKSB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gYVByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB0cmFuc3BvcnRGYWN0b3J5ID0gYVRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgIi0gIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUQXN5bmNUcmFuc3BvcnQ+IHRyYW5zcG9ydCA9IFt0cmFuc3BvcnRGYWN0b3J5IG5ld1RyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IHByb3RvY29sID0gW3Byb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyLCAiZmFpbHVyZUJsb2NrIik7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlt0cmFuc3BvcnQgZmx1c2hXaXRoQ29tcGxldGlvbjpeeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgIjogJnJlc3VsdCBwcm90b2NvbCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmYWlsdXJlQmxvY2sodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzcG9uc2VCbG9jaygiOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSAmJiAhKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZmFpbHVyZTpmYWlsdXJlQmxvY2tdOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUHJvbWlzZSBmdW5jdGlvbgorICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgIi0gIiA8PCBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW0FueVByb21pc2UgcHJvbWlzZVdpdGhSZXNvbHZlckJsb2NrOl4oUE1LUmVzb2x2ZXIgcmVzb2x2ZXIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VEFzeW5jVHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBbdHJhbnNwb3J0RmFjdG9yeSBuZXdUcmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IHByb3RvY29sID0gW3Byb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlciwgInJlc29sdmVyIik7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3RyYW5zcG9ydCBmbHVzaFdpdGhDb21wbGV0aW9uOl57IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCAiOiAmcmVzdWx0IHByb3RvY29sIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXNvbHZlcigiOworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgfHwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJAWUVTIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiQChyZXN1bHQpIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBmYWlsdXJlOl4oTlNFcnJvciAqZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIoZXJyb3IpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn1dOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifV07IiA8PCBlbmRsOworCisgICAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgfQorCisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4gIEluIG90aGVyIHdvcmRzIHRoZSBhY3R1YWwgVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbgorICogZm9yIHRoZSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgbmFtZSA8PCAiICgpICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+IHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRGljdGlvbmFyeSAqIG1ldGhvZE1hcDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IG5hbWUgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplcgorICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBhU2VydmljZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZXJ2aWNlID0gYVNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm1ldGhvZE1hcCA9IFtOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOyIgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBtZXRob2QgbWFwIGZvciByb3V0aW5nIGluY29taW5nIGNhbGxzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJTRUwgcyA9IEBzZWxlY3Rvcihwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiX3dpdGhTZXF1ZW5jZUlEOmluUHJvdG9jb2w6b3V0UHJvdG9jb2w6ZXJyb3I6KTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU01ldGhvZFNpZ25hdHVyZSAqIHNpZyA9IFtzZWxmIG1ldGhvZFNpZ25hdHVyZUZvclNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogc2lnXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiBzZXRTZWxlY3Rvcjogc107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gcmV0YWluQXJndW1lbnRzXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbbWV0aG9kTWFwIHNldFZhbHVlOiBpbnZvY2F0aW9uIGZvcktleTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIl07IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLyBwcm9jZXNzb3IKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VydmljZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFByb2Nlc3MgbWV0aG9kLCB3aGljaCBkaXNwYXRjaGVzIHRoZSBpbmNvbWluZyBjYWxsIHVzaW5nIHRoZSBtZXRob2QgbWFwCisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFNJbnQzMiBtZXNzYWdlVHlwZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBTSW50MzIgc2VxSUQ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogJm1lc3NhZ2VOYW1lIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICZtZXNzYWdlVHlwZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAmc2VxSUQiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW21ldGhvZE1hcCB2YWx1ZUZvcktleTogbWVzc2FnZU5hbWVdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIChpbnZvY2F0aW9uID09IG5pbCkgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTogVFR5cGVTVFJVQ1Qgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBOU0Vycm9yICogeCA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUQXBwbGljYXRpb25FcnJvclVua25vd25NZXRob2QiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBAe1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBtZXNzYWdlTmFtZX1dOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogbWVzc2FnZU5hbWUiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZUVYQ0VQVElPTiIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSUQiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVt4IHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgLy8gTlNJbnZvY2F0aW9uIGRvZXMgbm90IGNvbmZvcm0gdG8gTlNDb3B5aW5nIHByb3RvY29sIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaSA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6ICIKKyAgICAgICAgICAgICAgICAgICAgICJbaW52b2NhdGlvbiBtZXRob2RTaWduYXR1cmVdXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRTZWxlY3RvcjogW2ludm9jYXRpb24gc2VsZWN0b3JdXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJnNlcUlEIGF0SW5kZXg6IDJdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmaW5Qcm90b2NvbCBhdEluZGV4OiAzXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJm91dFByb3RvY29sIGF0SW5kZXg6IDRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmX190aHJpZnRFcnJvciBhdEluZGV4OiA1XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRUYXJnZXQ6IHNlbGZdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIGludm9rZV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhIHByb2Nlc3NfWFhYWCBtZXRob2QgZm9yIGVhY2ggc2VydmljZSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYXJncywgY2FsbHMgdGhlIHNlcnZpY2UsCisgIC8vIGFuZCB3cml0ZXMgcmVzdWx0cworICBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBlbmRsOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgcHJvY2Vzc18iIDw8IGZ1bm5hbWUKKyAgICAgICAgPDwgIl93aXRoU2VxdWVuY2VJRDogKFNJbnQzMikgc2VxSUQgaW5Qcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6ICIKKyAgICAgICAgICAgIihpZDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIHN0cmluZyBhcmdzdHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgKmZfaXRlcik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFyZ3N0eXBlIDw8ICIgKiBhcmdzID0gWyIgPDwgYXJnc3R5cGUgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW2FyZ3MgcmVhZDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIC8vIHByZXBhcmUgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0dHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHR0eXBlIDw8ICIgKiByZXN1bHQgPSBbIiA8PCByZXN1bHR0eXBlIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gbWFrZSB0aGUgY2FsbCB0byB0aGUgYWN0dWFsIHNlcnZpY2Ugb2JqZWN0CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8ICJCT09MIjsKKyAgICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJOU051bWJlciAqIjsKKyAgICB9CisgICAgb3V0IDw8ICIgc2VydmljZVJlc3VsdCA9ICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3RydWVfdHlwZSgpLT5pc19jb250YWluZXIoKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgIltzZXJ2aWNlICIgPDwgZnVubmFtZTsKKyAgICAvLyBzdXBwbHlpbmcgYXJndW1lbnRzCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7CisgICAgICB9CisgICAgfQorICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAiIGVycm9yIjsKKyAgICB9CisgICAgb3V0IDw8ICI6IF9fdGhyaWZ0RXJyb3JdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VydmljZVJlc3VsdCkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgc2V0U3VjY2VzczogIiA8PCB1bmJveCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJzZXJ2aWNlUmVzdWx0IikgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHdyaXRlIG91dCB0aGUgcmVzdWx0IGlmIG5vdCBvbmV3YXkKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlUkVQTFkiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEIiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbcmVzdWx0IHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gZmllbGROYW1lIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCAiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnk6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmc6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbDomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGU6KFVJbnQ4ICopJiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMjomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQ6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzI6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICB9CisgICAgb3V0IDw8ICIpIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgYWxsb2NhdGVzIHRoZSBzdHJ1Y3QgYW5kIGludm9rZXMgcmVhZDoKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBmaWVsZE5hbWUgPDwgIiA9IFtbIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSkKKyAgICAgICAgICAgICAgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbIiA8PCBmaWVsZE5hbWUgPDwgIiByZWFkOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIGluZGVudChvdXQpIDw8ICJTSW50MzIgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogTlVMTCB2YWx1ZVR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlRGljdGlvbmFyeSAqICIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZVNldCAqICIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVBcnJheSAqICIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7CisgIH0KKyAgLy8gRklYTUUgLSB0aGUgY29kZSBhYm92ZSBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBvZgorICAvLyB0aGUgY29udGFpbmVycyBiZWluZyByZWFkIG1hdGNoIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZQorICAvLyBjb250YWluZXJzIHdlIGFyZSByZWFkaW5nIGludG8uICBEb2VzIHRoYXQgbWF0dGVyPworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiCisgICAgICAgICAgICAgIDw8IHNpemUgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGZpZWxkTmFtZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWFwRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU2V0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZExpc3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogVGFrZSBhIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgd3JhcCBpdCBpbiBjb2RlIHRvIG1ha2UgaXQKKyAqIHN1aXRhYmxlIGZvciBwdXR0aW5nIGludG8gYSBjb250YWluZXIsIGlmIG5lY2Vzc2FyeS4gIEJhc2ljYWxseSwKKyAqIHdyYXAgc2NhbGVyIHByaW1pdGl2ZXMgaW4gTlNOdW1iZXIgb2JqZWN0cy4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpib3godF90eXBlKiB0dHlwZSwgc3RyaW5nIGZpZWxkX25hbWUpIHsKKworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiQCgiICsgZmllbGRfbmFtZSArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNhbid0IGJveCB2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJAKCIgKyBmaWVsZF9uYW1lICsgIikiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gZG8gbm90aGluZworICByZXR1cm4gZmllbGRfbmFtZTsKK30KKworLyoqCisgKiBFeHRyYWN0cyB0aGUgYWN0dWFsIHZhbHVlIGZyb20gYSBib3hlZCB2YWx1ZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnVuYm94KHRfdHlwZSogdHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJbIiArIGZpZWxkX25hbWUgKyAiIGludFZhbHVlXSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjYW4ndCB1bmJveCB2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJbIiArIGZpZWxkX25hbWUgKyAiIGJvb2xWYWx1ZV0iOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgcmV0dXJuICIoKFNJbnQ4KVsiICsgZmllbGRfbmFtZSArICIgY2hhclZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAiKChTSW50MTYpWyIgKyBmaWVsZF9uYW1lICsgIiBzaG9ydFZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiKChTSW50MzIpWyIgKyBmaWVsZF9uYW1lICsgIiBsb25nVmFsdWVdKSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICIoKFNJbnQ2NClbIiArIGZpZWxkX25hbWUgKyAiIGxvbmdMb25nVmFsdWVdKSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJbIiArIGZpZWxkX25hbWUgKyAiIGRvdWJsZVZhbHVlXSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBkbyBub3RoaW5nCisgIHJldHVybiBmaWVsZF9uYW1lOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwIGVsZW1lbnQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X3R5cGUqIGtleVR5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxUeXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisgIHRfZmllbGQgZmtleShrZXlUeXBlLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodmFsVHlwZSwgdmFsKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCBrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBzZXRPYmplY3Q6ICIgPDwgYm94KHZhbFR5cGUsIHZhbCkKKyAgICAgICAgICAgICAgPDwgIiBmb3JLZXk6ICIgPDwgYm94KGtleVR5cGUsIGtleSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF90eXBlKiB0eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGJveCh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X3R5cGUqIHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGJveCh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIHRvIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBmaWVsZAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCAiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgZmllbGROYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5OiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZzogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbDogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlOiAoVUludDgpIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2OiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NDogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgfQorICAgIG91dCA8PCAiKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghWyIgPDwgZmllbGROYW1lIDw8ICIgd3JpdGU6IG91dFByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIGNvbnRhaW5lcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIgc2l6ZTogKFNJbnQzMilbIgorICAgICAgICAgICAgICAgIDw8IGZpZWxkTmFtZSA8PCAiIGNvdW50XSBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogKFNJbnQzMilbIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGNvdW50XSBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogKFNJbnQzMilbIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGNvdW50XSBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgc3RyaW5nIGtleTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGtleSA9IHRtcCgia2V5Iik7CisgICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIga2V5RW51bWVyYXRvcl07IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAga2V5ID0gdG1wKCJvYmoiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBvYmplY3RFbnVtZXJhdG9yXTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBrZXkgPSB0bXAoImlkeCIpOworICAgIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBrZXkgPDwgIiA9IDA7ICIgPDwga2V5IDw8ICIgPCBbIiA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF07ICIgPDwga2V5CisgICAgICAgICAgICAgICAgPDwgIisrKSIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBrZXkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWFwRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTZXRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVMaXN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcE5hbWUpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIHVuYm94KGtmaWVsZC5nZXRfdHlwZSgpLCBrZXkpKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICJbIiArIG1hcE5hbWUgKyAiIG9iamVjdEZvcktleTogIiArIGtleSArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIHVuYm94KHZmaWVsZC5nZXRfdHlwZSgpLCB2ZmllbGQuZ2V0X25hbWUoKSkpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnROYW1lKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudE5hbWUpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCB1bmJveChlZmllbGQuZ2V0X3R5cGUoKSwgZWxlbWVudE5hbWUpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3ROYW1lKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICJbIiArIGxpc3ROYW1lICsgIiBvYmplY3RBdEluZGV4OiAiICsgaW5kZXggKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCB1bmJveChlZmllbGQuZ2V0X3R5cGUoKSwgZWZpZWxkLmdldF9uYW1lKCkpKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KKyAqIEByZXR1cm4gT2JqZWN0aXZlLUMgdHlwZSBuYW1lLCBpLmUuIE5TRGljdGlvbmFyeTxLZXksVmFsdWU+ICoKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYsIGJvb2wgbmVlZHNfbXV0YWJsZSkgeworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHN0cmluZyBuYW1lID0gKG5lZWRzX211dGFibGUgJiYgdHR5cGUtPmdldF90cnVlX3R5cGUoKS0+aXNfY29udGFpbmVyKCkpID8gIk11dGFibGUiICsgdHR5cGUtPmdldF9uYW1lKCkgOiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICByZXR1cm4gcHJvZ3JhbSA/IChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgbmFtZSkgOiBuYW1lOworICB9CisKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIGNvY29hX3ByZWZpeF8gKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ID0gbmVlZHNfbXV0YWJsZSA/ICJOU011dGFibGVEaWN0aW9uYXJ5IiA6ICJOU0RpY3Rpb25hcnkiOworICAgIHJlc3VsdCArPSAiPCIgKyBlbGVtZW50X3R5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyBlbGVtZW50X3R5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gbmVlZHNfbXV0YWJsZSA/ICJOU011dGFibGVTZXQiIDogIk5TU2V0IjsKKyAgICByZXN1bHQgKz0gIjwiICsgZWxlbWVudF90eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gbmVlZHNfbXV0YWJsZSA/ICJOU011dGFibGVBcnJheSIgOiAiTlNBcnJheSI7CisgICAgcmVzdWx0ICs9ICI8IiArIGVsZW1lbnRfdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSB7CisgICAgLy8gQ2hlY2sgZm9yIHByZWZpeAorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwpIHsKKyAgICAgIHJlc3VsdCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNvY29hIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgaWYgKCFjbGFzc19yZWYpIHsKKyAgICByZXN1bHQgKz0gIiAqIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgYW4gT2JqZWN0aXZlLUMgdHlwZSBuYW1lIGZvciBjb250YWluZXIgdHlwZXMKKyAqCisgKiBAcGFyYW0gdHR5cGUgdGhlIHR5cGUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjplbGVtZW50X3R5cGVfbmFtZSh0X3R5cGUqIGV0eXBlKSB7CisKKyAgdF90eXBlKiB0dHlwZSA9IGV0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgaWYgKGV0eXBlLT5pc190eXBlZGVmKCkgJiYgdHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKGV0eXBlKTsKKyAgfQorCisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2UgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gIk5TRGF0YSAqIjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSAiTlNTdHJpbmcgKiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gIk5TTnVtYmVyICoiOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCA9ICJOU051bWJlciAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ID0gIk5TRGljdGlvbmFyeTwiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gIk5TU2V0PCIgKyBlbGVtZW50X3R5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU0FycmF5PCIgKyBlbGVtZW50X3R5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmVzdWx0ID0gY29jb2FfcHJlZml4XyArIHR0eXBlLT5nZXRfbmFtZSgpICsgIiAqIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgT2JqZWN0aXZlLUMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJOU0RhdGEgKiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiTlNTdHJpbmcgKiI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCT09MIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIlNJbnQ4IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJTSW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIlNJbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiU0ludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgbmV3XTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvc3RyaW5nc3RyZWFtIG1hcG91dDsKKyAgICBpbmRlbnQobWFwb3V0KTsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgbWFwb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgbWFwb3V0IDw8IG5hbWUgPDwgIiA9IEB7IjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgbWFwb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgbWFwb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG1hcG91dCA8PCAifSI7CisgICAgb3V0IDw8IG1hcG91dC5zdHIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvc3RyaW5nc3RyZWFtIGxpc3RvdXQ7CisgICAgaW5kZW50KGxpc3RvdXQpOworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIGxpc3RvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBsaXN0b3V0IDw8IG5hbWUgPDwgIiA9IEBbIjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgbGlzdG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIGxpc3RvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgbGlzdG91dCA8PCAiXSI7CisgICAgb3V0IDw8IGxpc3RvdXQuc3RyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvc3RyaW5nc3RyZWFtIHNldG91dDsKKyAgICBpbmRlbnQoc2V0b3V0KTsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIHNldG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIHNldG91dCA8PCBuYW1lIDw8ICIgPSBbTlNTZXQgc2V0V2l0aEFycmF5OkBbIjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgc2V0b3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgc2V0b3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIHNldG91dCA8PCAiXV0iOworICAgIG91dCA8PCBzZXRvdXQuc3RyKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBib3hfaXQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIC8vIFdlIG11c3QgaGFuZGxlIGJpbmFyeSBjb25zdGFudCBidXQgdGhlIHN5bnRheCBvZiBJREwgZGVmaW5lcworICAgICAgLy8gbm90aGluZyBhYm91dCBiaW5hcnkgY29uc3RhbnQuCisgICAgICAvLyAgIGlmIHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgLy8gICAgICAvLyBiaW5hcnkgY29kZQorICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICBpZiAoYm94X2l0KSB7CisgICAgcmV0dXJuIGJveCh0eXBlLCByZW5kZXIuc3RyKCkpOworICB9CisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKyNpZiAwCisvKioKK09SSUdJTkFMCisgKiBTcGl0IG91dCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgdmFsdWUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveF9pdCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAodmFsLnNpemUoKSA+IDApCisgICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdFdpdGgiOworICAgIGVsc2UKKyAgICAgIHJlbmRlciA8PCAiW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0IjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgLy8gRklYTUUgVGhlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5pdFdpdGhYWFgKKyAgICAgIC8vICAgICAgIGluaXRpYWxpemVyIGFuZCBjYXVzZXMgY29tcGlsZSBlcnJvci4KKyAgICAgIC8vICAgICAgIFRyeTogdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYW5kIHRlc3QvU21hbGxUZXN0LnRocmlmdAorICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIHJlbmRlciA8PCBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIHJlbmRlciA8PCAiXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXIgPDwgIltbTlNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHNBbmRLZXlzOiAiOworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIsICI7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgdmFsIDw8ICIsICIgPDwga2V5OworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKKyAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXIgPDwgIltbTlNTZXQgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKKyAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiLCAiOworICAgICAgfQorICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICAgIHJlbmRlciA8PCAiIG5pbF0iOworICAgIGVsc2UKKyAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiZG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIGNvbnN0YW50IGZvciB0eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChib3hfaXQpIHsKKyAgICByZXR1cm4gYm94KHR5cGUsIHJlbmRlci5zdHIoKSk7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorI2VuZGlmCisKKy8qKgorICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworICByZW5kZXIgPDwgIkBwcm9wZXJ0eSAoIjsKKworICBpZiAodHlwZV9jYW5fYmVfY29weSh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgcmVuZGVyIDw8ICJjb3B5LCAiOworICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHJlbmRlciA8PCAic3Ryb25nLCAiOworICB9IGVsc2UgeworICAgIHJlbmRlciA8PCAiYXNzaWduLCAiOworICB9CisKKyAgcmVuZGVyIDw8ICJub25hdG9taWMpICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgIgorICA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiOworCisgIC8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIGFuIE9iamVjdGl2ZS1DIHJldHVybiArMSBjb3VudCBzaWduYWwKKyAgaWYgKCh0ZmllbGQtPmdldF9uYW1lKCkubGVuZ3RoKCkgPj0gMyAmJiB0ZmllbGQtPmdldF9uYW1lKCkuc3Vic3RyKDAsMykgPT0gIm5ldyIpIHx8CisgICAgICAodGZpZWxkLT5nZXRfbmFtZSgpLmxlbmd0aCgpID49IDYgJiYgdGZpZWxkLT5nZXRfbmFtZSgpLnN1YnN0cigwLDYpID09ICJjcmVhdGUiKSB8fAorICAgICAgKHRmaWVsZC0+Z2V0X25hbWUoKS5sZW5ndGgoKSA+PSA1ICYmIHRmaWVsZC0+Z2V0X25hbWUoKS5zdWJzdHIoMCw1KSA9PSAiYWxsb2MiKSkgeworICAgIC8vIExldCBPYmplY3RpdmUtQyBrbm93IG5vdCB0byByZXR1cm4gKzEgZm9yIG9iamVjdCBwb2ludGVycworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIHJlbmRlciA8PCBlbmRsOworICAgICAgcmVuZGVyIDw8ICItICgiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiIF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShub25lKSkpOyI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHlfaXNzZXQodF9maWVsZCogdGZpZWxkKSB7CisgIHJldHVybiAiQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgQk9PTCAiICsgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiSXNTZXQ7IjsKK30KKworLyoqCisgKiBEZWNsYXJlcyBwcm9wZXJ0eSB1bnNldCBtZXRob2QuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHlfdW5zZXQodF9maWVsZCogdGZpZWxkKSB7CisgIHJldHVybiAiLSAodm9pZCkgdW5zZXQiICsgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgdGhlIGVhcmx5IG91dCByZXR1cm4gc3RhdGVtZW50CisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBpbnZhbGlkIHJldHVybiBzdGF0bWVudAorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmludmFsaWRfcmV0dXJuX3N0YXRlbWVudCh0X2Z1bmN0aW9uICp0ZnVuY3Rpb24pIHsKKyAgaWYgKCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICByZXR1cm4gInJldHVybiBOTzsiOworICB9CisgIHJldHVybiAicmV0dXJuIG5pbDsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfZXJyb3IpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQgPSAiKEJPT0wpIjsKKyAgfQorICBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR0eXBlKSkgeworICAgIHJlc3VsdCA9ICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKSI7CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gIihOU051bWJlciAqKSI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgaW5jbHVkZV9lcnJvcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYXN5bmNocm9ub3VzbHkgaW5zdGVhZCBvZgorICogbGl0ZXJhbGx5IHJldHVybmluZy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfZXJyb3IpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIHRhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAidm9pZCAoXikoIiArICgodHR5cGUtPmlzX3ZvaWQoKSkgPyAiIiA6IHR5cGVfbmFtZSh0dHlwZSkpICsgIikiOworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiKHZvaWQpICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGluY2x1ZGVfZXJyb3IpCisgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIgcmVzcG9uc2UiIDogIiIpICsgIjogKCIKKyAgKyByZXNwb25zZV9wYXJhbSArICIpIHJlc3BvbnNlQmxvY2sgIgorICArICJmYWlsdXJlIDogKFRBc3luY0ZhaWx1cmVCbG9jaykgZmFpbHVyZUJsb2NrIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhIHByb21pc2UgaW5zdGVhZCBvZgorICogbGl0ZXJhbGx5IHJldHVybmluZy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuICIoQW55UHJvbWlzZSAqKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHR5cGVzIGFuZCBuYW1lcywgc3VpdGFibGUgZm9yIGFuCisgKiBvYmplY3RpdmUtYyBwYXJhbWV0ZXIgbGlzdAorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGluY2x1ZGVfZXJyb3IpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBib29sIGluY2x1ZGVfcHJvdG9jb2wgPSAhcHJvdG9jb2xfbmFtZS5lbXB0eSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGFyZ1ByZWZpeCA9ICIiOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJnUHJlZml4ID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IGFyZ1ByZWZpeCArICI6ICgiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGlmIChpbmNsdWRlX3Byb3RvY29sKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgcmVzdWx0ICs9ICIgcHJvdG9jb2wiOworICAgIH0KKyAgICByZXN1bHQgKz0gIjogKGlkPFRQcm90b2NvbD4pICIgKyBwcm90b2NvbF9uYW1lOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgaWYgKGluY2x1ZGVfZXJyb3IpIHsKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICByZXN1bHQgKz0gIiBlcnJvciI7CisgICAgfQorICAgIHJlc3VsdCArPSAiOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciI7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIE9iamVjdGl2ZS1DIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZVNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZUJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGVJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZUk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZUkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGVTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZU1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWVyIGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiXFxcIiVAXFxcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICIlaGkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIiVxaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIiVmIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIlaSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X3N0cmluZ19mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGZvcm1hdCBjYXN0IGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfY2FzdF9mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIiI7IC8vICJcXFwiJUBcXFwiIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIiI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVoaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIihpbnQpIjsgLy8gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVxaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIiI7IC8vICIlZiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKGludCkiOyAvLyAiJWkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBmb3JtYXRfY2FzdF9mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjYWxsIHRvIGEgZmllbGQncyBzZXR0ZXIuCisgKgorICogQHBhcmFtIHRmaWVsZCBGaWVsZCB0aGUgc2V0dGVyIGlzIGJlaW5nIGNhbGxlZCBvbgorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIHRvIHBhc3MgdG8gc2V0dGVyCisgKi8KKworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgcmV0dXJuICJzZWxmLiIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiID0gIiArIGZpZWxkTmFtZSArICI7IjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjb2NvYSwKKyAgICAiQ29jb2EiLAorICAgICIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCisgICAgIiAgICBkZWJ1Z19kZXNjcmlwdGlvbnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uXG4iCisgICAgIiAgICB2YWxpZGF0ZV9yZXF1aXJlZDpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgcmVxdWlyZWQgZmllbGQgaXMgbm90IHNldC5cbiIKKyAgICAiICAgIGFzeW5jX2NsaWVudHM6ICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2NrIHN5bnRheC5cbiIKKyAgICAiICAgIHBvZHM6ICAgICAgICAgICAgR2VuZXJhdGUgaW1wb3J0cyBpbiBDb2NvcG9kcyBmcmFtZXdvcmsgZm9ybWF0LlxuIgorICAgICIgICAgcHJvbWlzZV9raXQ6ICAgICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgcHJvbWlzZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzAzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw0NDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEMrKyBjb2RlIGdlbmVyYXRvci4gVGhpcyBpcyBsZWdpdGltYWN5IGluY2FybmF0ZS4KKyAqCisgKi8KK2NsYXNzIHRfY3BwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2NwcF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisKKyAgICBnZW5fcHVyZV9lbnVtc18gPSBmYWxzZTsKKyAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gZmFsc2U7CisgICAgZ2VuX2NvYl9zdHlsZV8gPSBmYWxzZTsKKyAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gZmFsc2U7CisgICAgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXyA9IGZhbHNlOworICAgIGdlbl90ZW1wbGF0ZXNfID0gZmFsc2U7CisgICAgZ2VuX3RlbXBsYXRlc19vbmx5XyA9IGZhbHNlOworICAgIGdlbl9tb3ZlYWJsZV8gPSBmYWxzZTsKKyAgICBnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfID0gZmFsc2U7CisgICAgZ2VuX25vX3NrZWxldG9uXyA9IGZhbHNlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHVyZV9lbnVtcyIpID09IDApIHsKKyAgICAgICAgZ2VuX3B1cmVfZW51bXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5jbHVkZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb2Jfc3R5bGUiKSA9PSAwKSB7CisgICAgICAgIGdlbl9jb2Jfc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fY2xpZW50X2NvbXBsZXRpb24iKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19kZWZhdWx0X29wZXJhdG9ycyIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRlbXBsYXRlcyIpID09IDApIHsKKyAgICAgICAgZ2VuX3RlbXBsYXRlc18gPSB0cnVlOworICAgICAgICBnZW5fdGVtcGxhdGVzX29ubHlfID0gKGl0ZXItPnNlY29uZCA9PSAib25seSIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtb3ZlYWJsZV90eXBlcyIpID09IDApIHsKKyAgICAgICAgZ2VuX21vdmVhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19vc3RyZWFtX29wZXJhdG9ycyIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19za2VsZXRvbiIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX3NrZWxldG9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY3BwOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jcHAiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsgfQorICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOyB9CisgIHZvaWQgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgZm9yY2VfY3BwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldHRlcnMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9tb3ZlX2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjcGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21vdmUpOworICB2b2lkIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfbW92ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9zd2FwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BlY2lhbGl6ZWQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVzaF9iYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFyZ19wcmVmaXgpOworICAvKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfcHJlZml4KHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX29wZW4oc3RkOjpzdHJpbmcgbnMpOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfY2xvc2Uoc3RkOjpzdHJpbmcgbnMpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgYXJnID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgY29iX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSwgYm9vbCBzdGFydF9jb21tYSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KHN0ZDo6b3N0cmVhbSYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKTsKKworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dGVybmFsID0gZmFsc2UpOworCisgIGJvb2wgaXNfcmVmZXJlbmNlKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVmZXJlbmNlKCk7IH0KKworICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAgICYmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSk7CisgIH0KKworICB2b2lkIHNldF91c2VfaW5jbHVkZV9wcmVmaXgoYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXgpIHsgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHVzZV9pbmNsdWRlX3ByZWZpeDsgfQorCisgIC8qKgorICAgKiBUaGUgY29tcGlsZXIgb3B0aW9uICJub190aHJpZnRfb3N0cmVhbV9pbXBsIiBjYW4gYmUgdXNlZCB0byBwcmV2ZW50CisgICAqIHRoZSBjb21waWxlciBmcm9tIGVtaXR0aW5nIGltcGxlbWVudGF0aW9ucyBmb3Igb3BlcmF0b3IgPDwuICBJbiB0aGlzCisgICAqIGNhc2UgdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgYW55IG5lZWRlZCB0byBidWlsZC4KKyAgICoKKyAgICogVG8gZGlzYWJsZSB0aGlzIG9uIGEgcGVyIHN0cnVjdHVyZSBiYXNlcywgb25lIGNhbiBhbHRlcm5hdGl2ZWx5IHNldAorICAgKiB0aGUgYW5ub3RhdGlvbiAiY3BwLmN1c3RvbW9zdHJlYW0iIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gZW1pdHRpbmcgYW4KKyAgICogb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYpLgorICAgKgorICAgKiBTZWUgQW5ub3RhdGlvblRlc3QgZm9yIHZhbGlkYXRpb24gb2YgdGhpcyBhbm5vdGF0aW9uIGZlYXR1cmUuCisgICAqLworICBib29sIGhhc19jdXN0b21fb3N0cmVhbSh0X3R5cGUqIHR0eXBlKSBjb25zdCB7CisgICAgcmV0dXJuIChnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfKSB8fAorICAgICAgICAgICAodHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJjcHAuY3VzdG9tb3N0cmVhbSIpICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCkpOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlIHByZWZpeCB0byB1c2UgZm9yIGEgZmlsZSBnZW5lcmF0ZWQgYnkgcHJvZ3JhbSwgb3IgdGhlCisgICAqIGVtcHR5IHN0cmluZyBpZiBubyBpbmNsdWRlIHByZWZpeCBzaG91bGQgYmUgdXNlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0OworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBwdXJlIGVudW1zIGZvciBUaHJpZnQgZW51bXMsIGluc3RlYWQgb2Ygd3JhcHBlciBjbGFzc2VzLgorICAgKi8KKyAgYm9vbCBnZW5fcHVyZV9lbnVtc187CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRlbXBsYXRpemVkIHJlYWRlci93cml0ZXIgbWV0aG9kcy4KKyAgICovCisgIGJvb2wgZ2VuX3RlbXBsYXRlc187CisKKyAgLyoqCisgICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSBwcm9jZXNzIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBvbmx5IHRlbXBsYXRpemVkCisgICAqIHJlYWRlci93cml0ZXIgbWV0aG9kcy4KKyAgICovCisgIGJvb2wgZ2VuX3RlbXBsYXRlc19vbmx5XzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbW92ZSBjb25zdHJ1Y3RvcnMgJiBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgICovCisgIGJvb2wgZ2VuX21vdmVhYmxlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgb3N0cmVhbSBkZWZpbml0aW9ucworICAgKi8KKyAgYm9vbCBnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfOworCisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgdXNlIGEgcGF0aCBwcmVmaXggaW4gb3VyICNpbmNsdWRlIHN0YXRlbWVudHMgZm9yIG90aGVyCisgICAqIHRocmlmdC1nZW5lcmF0ZWQgaGVhZGVyIGZpbGVzLgorICAgKi8KKyAgYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXhfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSAiQ29udGludWF0aW9uIE9CamVjdCItc3R5bGUgY2xhc3NlcyBhcyB3ZWxsLgorICAgKi8KKyAgYm9vbCBnZW5fY29iX3N0eWxlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBjYWxscyB0byBjb21wbGV0aW9uX18oKSBpbiBDb2JDbGllbnQgY2xhc3MuCisgICAqLworICBib29sIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgZ2VuZXJhdGluZyB0aGUgZGVmYXVsdCBvcGVhcnRvcnMgPT0sICE9IGFuZCA8LgorICAgKi8KKyAgYm9vbCBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfOworCisgICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgc2tlbGV0b24uCisgICAqLworICBib29sIGdlbl9ub19za2VsZXRvbl87CisKKyAgLyoqCisgICAqIFN0cmluZ3MgZm9yIG5hbWVzcGFjZSwgY29tcHV0ZWQgb25jZSB1cCBmcm9udCB0aGVuIHVzZWQgZGlyZWN0bHkKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgbnNfb3Blbl87CisgIHN0ZDo6c3RyaW5nIG5zX2Nsb3NlXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQorICAgKiBmdW5jdGlvbi4KKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfdGNjXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfdGNjXzsKKworICAvLyBUaGUgUHJvY2Vzc29yR2VuZXJhdG9yIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcGFydHMgb2YgdGhlIGNvZGUsCisgIC8vIHNvIGl0IG5lZWRzIGFjY2VzcyB0byBtYW55IG9mIG91ciBwcm90ZWN0ZWQgbWVtYmVycyBhbmQgbWV0aG9kcy4KKyAgLy8KKyAgLy8gVE9ETzogVGhlIGNvZGUgcmVhbGx5IHNob3VsZCBiZSBjbGVhbmVkIHVwIHNvIHRoYXQgaGVscGVyIG1ldGhvZHMgZm9yCisgIC8vIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBmaWxlcyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgZ2VuZXJhdG9yIGNsYXNzZXMKKyAgLy8gdGhlbXNlbHZlcy4KKyAgZnJpZW5kIGNsYXNzIFByb2Nlc3NvckdlbmVyYXRvcjsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmgiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZSk7CisKKyAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmNwcCI7CisgIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBJZiB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIGl0IGFwcGVhcnMgdG8ganVzdCBkaXNjYXJkIGRhdGEsCisgICAgLy8gd2hpY2ggaXMgZmluZS4KKyAgICBzdHJpbmcgZl90eXBlc190Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy50Y2MiOworICAgIGZfdHlwZXNfdGNjXy5vcGVuKGZfdHlwZXNfdGNjX25hbWUuY19zdHIoKSk7CisgIH0KKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfdHlwZXNfdGNjXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBTdGFydCBpZm5kZWYKKyAgZl90eXBlc18gPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgYmFzZSB0eXBlcworICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPGlvc2Z3ZD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RCYXNlLmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworICAvLyBJbmNsdWRlIEMrK3h4IGNvbXBhdGliaWxpdHkgaGVhZGVyCisgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD4iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8bWVtb3J5PiIgPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisKKyAgICAvLyBYWFgoc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgIC8vIGluY2x1ZGVkIGZpbGVzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIGN1c3RvbSBoZWFkZXJzCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjcHBfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NwcF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNwcF9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChjcHBfaW5jbHVkZXNbaV1bMF0gPT0gJzwnKSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBUaGUgc3dhcCgpIGNvZGUgbmVlZHMgPGFsZ29yaXRobT4gZm9yIHN0ZDo6c3dhcCgpCisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+IiA8PCBlbmRsOworICAvLyBmb3Igb3BlcmF0b3I8PAorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8b3N0cmVhbT4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBPcGVuIG5hbWVzcGFjZQorICBuc19vcGVuXyA9IG5hbWVzcGFjZV9vcGVuKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisgIG5zX2Nsb3NlXyA9IG5hbWVzcGFjZV9jbG9zZShwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIGZfdHlwZXNfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX3RjY18gPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgb3V0cHV0IGZpbGVzLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSBuYW1lc3BhY2UKKyAgZl90eXBlc18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCBuc19jbG9zZV8gPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSB0aGUgdHlwZXMudGNjIGZpbGUgZnJvbSB0aGUgdHlwZXMgaGVhZGVyIGZpbGUsCisgIC8vIHNvIGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHRjYyBmaWxlLgorICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uLgorICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIGlmbmRlZgorICBmX3R5cGVzXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3R5cGVzX2ltcGxfLmNsb3NlKCk7CisgIGZfdHlwZXNfdGNjXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIEMrKworICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIgorICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcykgeworICBmIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZiA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGYpIDw8IHByZWZpeCA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgc3VmZml4OworICAgIGlmIChpbmNsdWRlX3ZhbHVlcykgeworICAgICAgZiA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIH0KKyAgfQorCisgIGYgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGYpIDw8ICJ9OyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBDKyssIHRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUKKyAqIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nIHRoZSBlbnVtIGtleXdvcmQgaW4gQysrLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICBzdGQ6OnN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBlbnVtX25hbWUgPSAidHlwZSI7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN0cnVjdCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGVudW1fbmFtZTsKKworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc18sIGNvbnN0YW50cywgIiIsICIiLCB0cnVlKTsKKworICBpZiAoIWdlbl9wdXJlX2VudW1zXykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvKioKKyAgICAgR2VuZXJhdGUgYSBjaGFyYWN0ZXIgYXJyYXkgb2YgZW51bSBuYW1lcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAqLworICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIjsKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBwcmVmaXggPSB0ZW51bS0+Z2V0X25hbWUoKSArICI6OiI7CisgIH0KKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpbnQgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXNbXSA9IjsKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgcHJlZml4LmNfc3RyKCksICIiLCBmYWxzZSk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3QgY2hhciogX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lc1tdID0iOworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCAiXCIiLCAiXCIiLCBmYWxzZSk7CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImV4dGVybiBjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKQorICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJfVkFMVUVTX1RPX05BTUVTKDo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoIiA8PCBjb25zdGFudHMuc2l6ZSgpIDw8ICIsIF9rIgorICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXMiCisgICAgICAgICAgICAgICAgPDwgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lcyksICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigtMSwgTlVMTCwgTlVMTCkpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKGZfdHlwZXNfLCB0ZW51bSk7CisgIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0ZW51bSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkgeworCisgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiOworICBpZiAoZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOjp0eXBlJiI7CisgIH0KKyAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKSB7CisKKyAgLy8gSWYgd2UndmUgYmVlbiB0b2xkIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gd2lsbCBwcm92aWRlIGFuIG9zdHJlYW0KKyAgLy8gb3BlcmF0b3IgZGVmaW5pdGlvbiB0aGVuIHdlIG9ubHkgbWFrZSBhIGRlY2xhcmF0aW9uOgorCisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRlbnVtKSkgeworICAgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiOworICAgIGlmIChnZW5fcHVyZV9lbnVtc18pIHsKKyAgICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICI6OnR5cGUmIjsKKyAgICB9CisgICAgb3V0IDw8ICIgdmFsKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IF8iCisgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMuZmluZCh2YWwpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpdCAhPSBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUy5lbmQoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBpdC0+c2Vjb25kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgc3RhdGljX2Nhc3Q8aW50Pih2YWwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5oIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lKTsKKworICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5jcHAiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2ltcGw7CisgIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9jb25zdHNfaW1wbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBTdGFydCBpZm5kZWYKKyAgZl9jb25zdHMgPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0c19pbXBsIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8ICJjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCAiICAiCisgICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9jb25zdHMgPDwgIn07IiA8PCBlbmRsOworCisgIGZfY29uc3RzX2ltcGwgPDwgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0c19pbXBsKSA8PCAifSIgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworCisgIGZfY29uc3RzX2ltcGwgPDwgZW5kbCA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX2NvbnN0c19pbXBsLmNsb3NlKCk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGJvb2wgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSAoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmIChpc19ub25yZXF1aXJlZF9maWVsZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuX19pc3NldC4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoc3RkOjptYWtlX3BhaXIoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXNoX2JhY2soIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHByaW50X2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCisvKioKKyAqCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkxMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICJzdGF0aWNfY2FzdDxkb3VibGU+KCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycyBhbmQgYSByZWFkL3dyaXRlKCkgZnVuY3Rpb24sIHBsdXMgYSBtaXJyb3JpbmcgaXNzZXQKKyAqIGlubmVyIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc19pbXBsXywgZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICB9CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29weV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovZmFsc2UpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovdHJ1ZSk7Cit9CisKK25hbWVzcGFjZSB7CisvLyBIZWxwZXIgdG8gY29udmVydCBhIHZhcmlhYmxlIHRvIHJ2YWx1ZSwgaWYgbW92ZSBpcyBlbmFibGVkCitzdGQ6OnN0cmluZyBtYXliZU1vdmUoc3RkOjpzdHJpbmcgY29uc3QmIG90aGVyLCBib29sIG1vdmUpIHsKKyAgaWYgKG1vdmUpIHsKKyAgICByZXR1cm4gInN0ZDo6bW92ZSgiICsgb3RoZXIgKyAiKSI7CisgIH0KKyAgcmV0dXJuIG90aGVyOworfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX21vdmUpIHsKKworICBzdGQ6OnN0cmluZyB0bXBfbmFtZSA9IHRtcCgib3RoZXIiKTsKKworICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfbW92ZSkgeworICAgIG91dCA8PCAiKCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICI7CisgIH0KKyAgb3V0IDw8IHRtcF9uYW1lIDw8ICIpICI7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICI6IFRFeGNlcHRpb24oKSAiOworICBvdXQgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZworICBpZiAobWVtYmVycy5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLiIgKyAoKmZfaXRlciktPmdldF9uYW1lKCksIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi5fX2lzc2V0IiwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fzc2lnbm1lbnRfb3BlcmF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL2ZhbHNlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpIHsKKyAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CisKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6b3BlcmF0b3I9KCI7CisKKyAgaWYgKGlzX21vdmUpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYgIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgImNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOworICB9CisgIG91dCA8PCB0bXBfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIGVsaW1pbmF0ZSBjb21waWxlciB1bnVzZWQgd2FybmluZworICBpZiAobWVtYmVycy5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8ICIodm9pZCkgIiA8PCB0bXBfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLiIgKyAoKmZfaXRlciktPmdldF9uYW1lKCksIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAqdGhpczsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgc3RydWN0IGRlY2xhcmF0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlCisgKgorICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0KSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBleHRlbmRzID0gIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfdXNlcl9zdHJ1Y3QgJiYgIWdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBleHRlbmRzID0gIiA6IHB1YmxpYyB2aXJ0dWFsIDo6YXBhY2hlOjp0aHJpZnQ6OlRCYXNlIjsKKyAgICB9CisgIH0KKworICAvLyBHZXQgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIFdyaXRlIHRoZSBpc3NldCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gb3V0c2lkZSB0aGUgY2xhc3MuIFRoaXMgbWFrZXMKKyAgLy8gdGhlIGdlbmVyYXRlZCBjb2RlIGFtZW5hYmxlIHRvIHByb2Nlc3NpbmcgYnkgU1dJRy4KKyAgLy8gV2Ugb25seSBkZWNsYXJlIHRoZSBzdHJ1Y3QgaWYgaXQgZ2V0cyB1c2VkIGluIHRoZSBjbGFzcy4KKworICAvLyBJc3NldCBzdHJ1Y3QgaGFzIGJvb2xlYW4gZmllbGRzLCBidXQgb25seSBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCgpICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzdHJpbmcgaXNTZXQgPSAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICI6ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIge30iIDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDoxOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQ7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gT3BlbiBzdHJ1Y3QgZGVmCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCFwb2ludGVycykgeworICAgIC8vIENvcHkgY29uc3RydWN0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImKTsiIDw8IGVuZGw7CisKKyAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yCisgICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQXNzaWdubWVudCBPcGVyYXRvcgorICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiBvcGVyYXRvcj0oIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7CisKKyAgICBib29sIGluaXRfY3RvciA9IGZhbHNlOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpIHsKKyAgICAgICAgc3RyaW5nIGR2YWw7CisgICAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKKyAgICAgICAgfQorICAgICAgICBkdmFsICs9ICh0LT5pc19zdHJpbmcoKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpID8gIiIgOiAiMCI7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbml0X2N0b3IpIHsKKyAgICAgICAgICBpbml0X2N0b3IgPSB0cnVlOworICAgICAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gVE9ETyhkcmVpc3MpOiBXaGVuIGV2ZXJ5dGhpbmcgZWxzZSBpbiBUaHJpZnQgaXMgcGVyZmVjdCwKKyAgICAvLyBkbyBtb3JlIG9mIHRoZXNlIGluIHRoZSBpbml0aWFsaXplciBsaXN0LgorICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKCF0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgbm9leGNlcHQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gRGVjbGFyZSBhbGwgZmllbGRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludGVycyAmJiAhKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZWFkKSA8PCBlbmRsOworICB9CisKKyAgLy8gQWRkIHRoZSBfX2lzc2V0IGRhdGEgbWVtYmVyIGlmIHdlIG5lZWQgaXQsIHVzaW5nIHRoZSBkZWZpbml0aW9uIGZyb20gYWJvdmUKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgeworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAocG9pbnRlcnMpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaXNfcmVmZXJlbmNlKCgqbV9pdGVyKSkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOworICAgICAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKTsKKyAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBpZiAoIXBvaW50ZXJzKSB7CisgICAgLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGRlZmF1bHQgb3BlcmF0b3JzPworICAgIGlmICghZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXykgeworICAgICAgLy8gR2VuZXJhdGUgYW4gZXF1YWxpdHkgdGVzdGluZyBvcGVyYXRvci4gIE1ha2UgaXQgaW5saW5lIHNpbmNlIHRoZSBjb21waWxlcgorICAgICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yID09IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICIKKyAgICAgICAgICA8PCAobWVtYmVycy5zaXplKCkgPiAwID8gInJocyIgOiAiLyogcmhzICovIikgPDwgIikgY29uc3QiIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAgICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gcmhzLiIKKyAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSByaHMuX19pc3NldC4iCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgJiYgISgiCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJnJocykgY29uc3QgeyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAhKCp0aGlzID09IHJocyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgLy8gR2VuZXJhdGUgdGhlIGRlY2xhcmF0aW9uIG9mIGEgbGVzcy10aGFuIG9wZXJhdG9yLiAgVGhpcyBtdXN0IGJlCisgICAgICAvLyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGlmIHRoZXkgd2lzaCB0byB1c2UgaXQuICAoVGhleQorICAgICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA8IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAocmVhZCkgeworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ1aW50MzJfdCByZWFkKFByb3RvY29sXyogaXByb3QpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCByZWFkKCIKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKHdyaXRlKSB7CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInVpbnQzMl90IHdyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB3cml0ZSgiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGlmIChpc191c2VyX3N0cnVjdCAmJiAhaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICI7CisgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgTlVMTCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gc3RkOjpleGNlcHRpb246OndoYXQoKQorICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJtdXRhYmxlIHN0ZDo6c3RyaW5nIHRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXzsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgZmFsc2UpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChzd2FwKSB7CisgICAgLy8gR2VuZXJhdGUgYSBuYW1lc3BhY2Utc2NvcGUgc3dhcCgpIGZ1bmN0aW9uCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiICZiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc191c2VyX3N0cnVjdCkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2wob3V0LCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgLy8gR2V0IG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBEZXN0cnVjdG9yCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICBmb3JjZV9jcHBfb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKCkgbm9leGNlcHQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZm9yY2VfY3BwX291dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCisgIGlmIChzZXR0ZXJzKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOworICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6X19zZXRfIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIG91dCA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdmFsOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIC8vIGFzc3VtZSBhbGwgZmllbGRzIGFyZSByZXF1aXJlZCBleGNlcHQgb3B0aW9uYWwgZmllbGRzLgorICAgICAgLy8gZm9yIG9wdGlvbmFsIGZpZWxkcyBjaGFuZ2UgX19pc3NldC5uYW1lIHRvIHRydWUKKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmIChpc191c2VyX3N0cnVjdCkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICI6OnJlYWQoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcworICBvdXQgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSW5wdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIoKmlwcm90KTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50MTZfdCBmaWQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEJlZ2luKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmdHlwZSA9PSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBjb25zdCBjaGFyKiBpc3NldF9wcmVmaXggPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgPyAidGhpcy0+X19pc3NldC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiaXNzZXRfIjsKKworI2lmIDAKKyAgICAgICAgICAvLyBUaGlzIGNvZGUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBmaWVsZCBpcyBlbmNvdW50ZXJlZCB0d2ljZS4KKyAgICAgICAgICAvLyBXZSd2ZSBkZWNpZGVkIHRvIGxlYXZlIGl0IG91dCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IEdlbmVyYXRlIHRoaXMgY29kZSBhbmQgImlmIiBpdCBvdXQgdG8gbWFrZSBpdCBlYXNpZXIKKyAgICAgICAgICAvLyBmb3IgcGVvcGxlIHJlY29tcGlsaW5nIHRocmlmdCB0byBpbmNsdWRlIGl0LgorICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgiIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworI2VuZGlmCisKKyAgICAgIGlmIChwb2ludGVycyAmJiAhKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PAorICAgICAgICAgIC8vIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGFuIG9wdGlvbiB3aGVuIHRocmlmdCBzdHJ1Y3RzCisgICAgICAgICAgLy8gaGF2ZSBhIGNvbW1vbiBiYXNlIGNsYXNzLgorICAgICAgICAgIC8vIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSAvLyFmaWVsZHMuZW1wdHkoKQorICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gVGhyb3cgaWYgYW55IHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KKyAgLy8gV2UgZG8gdGhpcyBhZnRlciByZWFkaW5nIHRoZSBzdHJ1Y3QgZW5kIHNvIHRoYXQKKyAgLy8gdGhlcmUgbWlnaHQgcG9zc2libHkgYmUgYSBjaGFuY2Ugb2YgY29udGludWluZy4KKyAgb3V0IDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgJyknIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRPdXRwdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIoKm9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjaGVja19pZl9zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCk7CisgICAgaWYgKGNoZWNrX2lmX3NldCkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisgICAgfQorICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIGlmIChjaGVja19pZl9zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAnfSc7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cworICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCisgKiBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigiCisgICAgICAgIDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGlmIChwb2ludGVycykgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisgICAgfQorICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzd2FwIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICIgJmIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIExldCBhcmd1bWVudC1kZXBlbmRlbnQgbmFtZSBsb29rdXAgZmluZCB0aGUgY29ycmVjdCBzd2FwKCkgZnVuY3Rpb24gdG8KKyAgLy8gdXNlIGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlcy4gIElmIG5vbmUgaXMgZm91bmQgaW4gdGhlIGFyZ3VtZW50cycKKyAgLy8gbmFtZXNwYWNlcywgZmFsbCBiYWNrIHRvIDo6c3RkOjpzd2FwKCkuCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjpzdGQ6OnN3YXA7IiA8PCBlbmRsOworCisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisKKyAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2FwKGEuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgYi4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiCisgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dhcChhLl9faXNzZXQsIGIuX19pc3NldCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gaGFuZGxlIGVtcHR5IHN0cnVjdHMKKyAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIGE7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIGI7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiJiBvYmopOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICAvLyB0aHJpZnQgZGVmaW5lcyB0aGlzIGJlaGF2aW9yCisgICAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiJiBvYmopIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvYmoucHJpbnRUbyhvdXQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCAidm9pZCAiOworICBpZiAodHN0cnVjdCkgeworICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7CisgIH0KKyAgb3V0IDw8ICJwcmludFRvKHN0ZDo6b3N0cmVhbSYgb3V0KSBjb25zdCI7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dGVybmFsKSB7CisgIG91dCA8PCAiY29uc3QgY2hhciogIjsKKyAgaWYgKGV4dGVybmFsKSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IjsKKyAgfQorICBvdXQgPDwgIndoYXQoKSBjb25zdCBub2V4Y2VwdCI7Cit9CisKK25hbWVzcGFjZSBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3Igewordm9pZCBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICIgPDwgdG9fc3RyaW5nKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikiOworfQorCit2b2lkIGdlbmVyYXRlX29wdGlvbmFsX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBvdXQgPDwgIjsgKF9faXNzZXQuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID8gKG91dCI7CisgIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworICBvdXQgPDwgIikgOiAob3V0IDw8IFwiPG51bGw+XCIpKSI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpCisgICAgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7CisgIGVsc2UKKyAgICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBvdXQgPDwgIlwiIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPVwiIjsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgZ2VuZXJhdGVfZmllbGRfbmFtZShvdXQsIGZpZWxkKTsKKyAgZ2VuZXJhdGVfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluZGVudCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBiZWcgPSBmaWVsZHMuYmVnaW4oKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gZmllbGRzLmVuZCgpOworCisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIG91dCA8PCBpbmRlbnQgPDwgIm91dCA8PCAiOworCisgICAgaWYgKGl0ICE9IGJlZykgeworICAgICAgb3V0IDw8ICJcIiwgXCIgPDwgIjsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9maWVsZChvdXQsICppdCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9Cit9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIG9wZXJhdG9yPDwKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojp0b19zdHJpbmc7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiOyIgPDwgZW5kbDsKKyAgc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZHMob3V0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCBpbmRlbnQoKSk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IFwiKVwiOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgd2hhdCgpIG1ldGhvZCBmb3IgZXhjZXB0aW9ucworICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCk7CisgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgdHJ1ZSk7CisgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmdzdHJlYW0gc3M7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNzIDw8IFwiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogXCIgPDwgKnRoaXM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMtPnRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXyA9IHNzLnN0cigpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy0+dGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfLmNfc3RyKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBcIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIuaCI7CisgIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyIGZpbGUgaW5jbHVkZXMKKyAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIC8vIFRNZW1vcnlCdWZmZXIKKyAgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPiIgPDwgZW5kbCAKKyAgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDxtZW1vcnk+IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICJuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICJjbGFzcyBUQXN5bmNDaGFubmVsOyIgPDwgZW5kbCA8PCAifX19IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oPiIgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaFwiIgorICAgICAgICAgICAgPDwgZW5kbDsKKworICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKQorICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIi5oXCIiIDw8IGVuZGw7CisgIH0KKworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8ICIjaWZkZWYgX01TQ19WRVJcbiIKKyAgICAgICAgICAgICAgICIgICNwcmFnbWEgd2FybmluZyggcHVzaCApXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjUwICkgLy9pbmhlcml0aW5nIG1ldGhvZHMgdmlhIGRvbWluYW5jZSBcbiIKKyAgICAgICAgICAgICAgICIjZW5kaWZcblxuIjsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLmNwcCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbDsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHN0cmluZyBmX3NlcnZpY2VfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIudGNjIjsKKyAgICBmX3NlcnZpY2VfdGNjXy5vcGVuKGZfc2VydmljZV90Y2NfbmFtZS5jX3N0cigpKTsKKyAgICBmX3NlcnZpY2VfdGNjXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfVENDIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaW5jbHVkZSBcInRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvbXBvbmVudHMKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0c2VydmljZSwgIiIpOworICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIkNvbmN1cnJlbnQiKTsKKworICAvLyBHZW5lcmF0ZSBza2VsZXRvbgorICBpZiAoIWdlbl9ub19za2VsZXRvbl8pIHsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odHNlcnZpY2UpOworICB9CisKKyAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb2IgY29tcG9uZW50cworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIkNvYkNsIik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIkNvYlN2Iik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb2IiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIkNvYiIpOworCisgICAgaWYgKCFnZW5fbm9fc2tlbGV0b25fKSB7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRzZXJ2aWNlKTsKKyAgICB9CisKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiI2lmZGVmIF9NU0NfVkVSXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApXG4iCisgICAgICAgICAgICAgICAiI2VuZGlmXG5cbiI7CisKKyAgLy8gQ2xvc2UgdGhlIG5hbWVzcGFjZQorICBmX3NlcnZpY2VfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfc2VydmljZV90Y2NfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFRPRE8oc2ltcGtpbnMpOiBNYWtlIHRoaXMgYSBzZXBhcmF0ZSBvcHRpb24KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIudGNjXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgPDwgIl90eXBlcy50Y2NcIiIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGZfc2VydmljZV90Y2NfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgdGhlIGZpbGVzCisgIGZfc2VydmljZV90Y2NfLmNsb3NlKCk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9oZWFkZXJfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4gQmFzaWNhbGx5LCB0aGlzIGdlbmVyYXRlcyB0eXBlcworICogZm9yIGFsbCB0aGUgYXJndW1lbnRzIGFuZCByZXN1bHRzIHRvIGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWVfb3JpZyA9IHRzLT5nZXRfbmFtZSgpOworCisgICAgLy8gVE9ETyhkcmVpc3MpOiBXaHkgaXMgdGhpcyBzdHVmZiBub3QgaW4gZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycz8KKyAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHMpOworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cyk7CisgICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyIpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMsIHRydWUpOworICAgIHRzLT5zZXRfbmFtZShuYW1lX29yaWcpOworCisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisKKyAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7CisgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7CisgICAgLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjbGllbnQuCisgICAgc3RyaW5nIGNsaWVudF9uYW1lID0gc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgY2xpZW50X25hbWUgKz0gIlQiOworICAgICAgc2VydmljZV9pZl9uYW1lICs9ICJUIjsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImNsYXNzICIgPDwgY2xpZW50X25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIklmIjsKKyAgICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgeworICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgorICAgICAgZXh0ZW5kcyArPSAiVDxQcm90b2NvbF8+IjsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5oYXNfZG9jKCkpCisgICAgICBmX2hlYWRlcl8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2hlYWRlcl8sICpmX2l0ZXIpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSkgPDwgIiA9IDA7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIGdlbmVyYXRlIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdHlwZWRlZiBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdAorICAgIC8vIGtub3cgYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlCisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIKKyAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBmYWN0b3J5LgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZmFjdG9yeSBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKKworICAvLyBGaWd1cmUgb3V0IHRoZSBuYW1lIG9mIHRoZSB1cHBlci1tb3N0IHBhcmVudCBjbGFzcy4KKyAgLy8gR2V0dGluZyBldmVyeXRoaW5nIHRvIHdvcmsgb3V0IHByb3Blcmx5IHdpdGggaW5oZXJpdGFuY2UgaXMgYW5ub3lpbmcuCisgIC8vIEhlcmUncyB3aGF0IHdlJ3JlIGRvaW5nIGZvciBub3c6CisgIC8vCisgIC8vIC0gQWxsIGhhbmRsZXJzIGltcGxlbWVudCBnZXRIYW5kbGVyKCksIGJ1dCBzdWJjbGFzc2VzIHVzZSBjb3ZhcmlhbnQgcmV0dXJuCisgIC8vICAgdHlwZXMgdG8gcmV0dXJuIHRoZWlyIHNwZWNpZmljIHNlcnZpY2UgaW50ZXJmYWNlIGNsYXNzIHR5cGUuICBXZSBoYXZlIHRvCisgIC8vICAgdXNlIHJhdyBwb2ludGVycyBiZWNhdXNlIG9mIHRoaXM7IHNoYXJlZF9wdHI8PiBjYW4ndCBiZSB1c2VkIGZvcgorICAvLyAgIGNvdmFyaWFudCByZXR1cm4gdHlwZXMuCisgIC8vCisgIC8vIC0gU2luY2Ugd2UncmUgbm90IHVzaW5nIHNoYXJlZF9wdHI8Piwgd2UgYWxzbyBwcm92aWRlIGEgcmVsZWFzZUhhbmRsZXIoKQorICAvLyAgIGZ1bmN0aW9uIHRoYXQgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSBhIHBvaW50ZXIgdG8gYSBoYW5kbGVyIG9idGFpbmVkCisgIC8vICAgdmlhIGdldEhhbmRsZXIoKS4KKyAgLy8KKyAgLy8gICByZWxlYXNlSGFuZGxlcigpIGFsd2F5cyBhY2NlcHRzIGEgcG9pbnRlciB0byB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MKKyAgLy8gICB0eXBlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIHBhcmVudCB2ZXJzaW9ucyBvZiByZWxlYXNlSGFuZGxlcigpCisgIC8vICAgbWF5IGFjY2VwdCBhbnkgb2YgdGhlIHBhcmVudCB0eXBlcywgbm90IGp1c3QgdGhlIG1vc3Qgc3BlY2lmaWMgc3ViY2xhc3MKKyAgLy8gICB0eXBlLiAgSW1wbGVtZW50YXRpb25zIGNhbiB1c2UgZHluYW1pY19jYXN0IHRvIGNhc3QgdGhlIHBvaW50ZXIgdG8gdGhlCisgIC8vICAgc3ViY2xhc3MgdHlwZSBpZiBkZXNpcmVkLgorICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOworICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIH0KKyAgc3RyaW5nIGJhc2VfaWZfbmFtZSA9IHR5cGVfbmFtZShiYXNlX3NlcnZpY2UpICsgc3R5bGUgKyAiSWYiOworCisgIC8vIEdlbmVyYXRlIHRoZSBhYnN0cmFjdCBmYWN0b3J5IGNsYXNzCisgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBzZXJ2aWNlX2lmX25hbWUgKyAiRmFjdG9yeSI7CisgIHN0cmluZyBleHRlbmRzOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJJZkZhY3RvcnkiOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGZhY3RvcnlfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiBIYW5kbGVyOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB+IiA8PCBmYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIgorICAgICAgICAgICAgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIgorICAgICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNpbmdsZXRvbiBmYWN0b3J5IGNsYXNzCisgIHN0cmluZyBzaW5nbGV0b25fZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIlNpbmdsZXRvbkZhY3RvcnkiOworICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiIDogdmlydHVhbCBwdWJsaWMgIiA8PCBmYWN0b3J5X25hbWUgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKGNvbnN0IDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCisgICAgICAgICAgICA8PCAiPiYgaWZhY2UpIDogaWZhY2VfKGlmYWNlKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IgorICAgICAgICAgICAgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiCisgICAgICAgICAgICA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiCisgICAgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGlmYWNlXy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykge30iIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICAgICAgICAgICAgPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiAsIHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiTnVsbCI7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJJZiIgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwoKSB7fSIgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSwgIiIsIGZhbHNlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOworCisgICAgaWYgKHN0eWxlID09ICIiKSB7CisgICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpIHx8IGlzX2NvbXBsZXhfdHlwZShyZXR1cm50eXBlKSkgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gX3JldHVybjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7CisgICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIGNvYihfcmV0dXJuKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KSB7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB0X3R5cGUqIHJldF90eXBlID0gZ2V0X3RydWVfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICBvdXQgPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhcmV0X3R5cGUtPmlzX3ZvaWQoKSkgeworICAgIGlmIChpc19jb21wbGV4X3R5cGUocmV0X3R5cGUpKSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0YXJnZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0YXJnZXQgPDwgIiA9ICIgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgICAgb3V0IDw8IGFyZ19wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIl9hc3luY19zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKKworICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOworICBmX3NrZWxldG9uIDw8ICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBvbmUgd2F5IHRvIGFkYXB0IGEgc3luY2hyb25vdXMiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gaW50ZXJmYWNlIGludG8gYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZS4gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIiCisgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIvLyBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdCBhbmQgcmV3cml0ZSBhcyBhc3luY2hyb25vdXMgYW55IGZ1bmN0aW9ucyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIvLyB0aGF0IHdvdWxkIG90aGVyd2lzZSBpbnRyb2R1Y2UgdW53YW50ZWQgbGF0ZW5jeS4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OworICBpZiAoKCFucy5lbXB0eSgpKSAmJiAobnMuY29tcGFyZSgiIDo6IikgIT0gMCkpIHsKKyAgICBmX3NrZWxldG9uIDw8ICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKSAtIDIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NrZWxldG9uIDw8ICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlciA6ICIKKyAgICAgICAgICAgICA8PCAicHVibGljICIgPDwgc3ZjbmFtZSA8PCAiQ29iU3ZJZiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiQXN5bmNIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgIHN5bmNIYW5kbGVyXyA9IHN0ZDo6YXV0b19wdHI8IiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyPihuZXcgIiA8PCBzdmNuYW1lCisgICAgICAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkFzeW5jSGFuZGxlcigpOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICJDb2JTdiIsICIiLCB0cnVlKSA8PCAiIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKworICAgIHN0cmluZyB0YXJnZXQgPSByZXR1cm50eXBlLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuIjsKKyAgICBpZiAoIXJldHVybnR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChmX3NrZWxldG9uLCAqZl9pdGVyLCB0YXJnZXQsICJzeW5jSGFuZGxlcl8iLCAiIik7CisgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigiIDw8IHRhcmdldCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2tlbGV0b24pOworICB9CisgIGZfc2tlbGV0b24gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN0ZDo6YXV0b19wdHI8IiA8PCBzdmNuYW1lCisgICAgICAgICAgICAgPDwgIkhhbmRsZXI+IHN5bmNIYW5kbGVyXzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2tlbGV0b24gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgbXVsdGlmYWNlLCB3aGljaCBpcyBhIHNpbmdsZSBzZXJ2ZXIgdGhhdCBqdXN0IHRha2VzIGEgc2V0CisgKiBvZiBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGFuZCBjYWxscyB0aGVtIGFsbCwgcmV0dXJuaW5nIHRoZQorICogdmFsdWUgb2YgdGhlIGxhc3Qgb25lIHRvIGJlIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBtdWx0aXNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX211bHRpZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfbXVsdGlmYWNlID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgIk11bHRpZmFjZSI7CisgIH0KKworICBzdHJpbmcgbGlzdF90eXBlID0gc3RyaW5nKCJzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSA6ICIKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBleHRlbmRzX211bHRpZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoIiA8PCBsaXN0X3R5cGUKKyAgICAgICAgICAgIDw8ICImIGlmYWNlcykgOiBpZmFjZXNfKGlmYWNlcykgeyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPCIgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+OjppdGVyYXRvciBpdGVyOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBmb3IgKGl0ZXIgPSBpZmFjZXMuYmVnaW4oKTsgaXRlciAhPSBpZmFjZXMuZW5kKCk7ICsraXRlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoKml0ZXIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycworICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGxpc3RfdHlwZSA8PCAiIGlmYWNlc187IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBhZGQoOjpzdGQ6OnNoYXJlZF9wdHI8IgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY+IGlmYWNlKSB7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmYWNlc18ucHVzaF9iYWNrKGlmYWNlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisKKyAgICBzdHJpbmcgY2FsbCA9IHN0cmluZygiaWZhY2VzX1tpXS0+IikgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICBjYWxsICs9ICJfcmV0dXJuIjsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FsbCArPSAiLCAiOworICAgICAgfQorICAgICAgY2FsbCArPSAoKmFfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGNhbGwgKz0gIikiOworCisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAic2l6ZV90IHN6ID0gaWZhY2VzXy5zaXplKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzaXplX3QgaSA9IDA7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKDsgaSA8IChzeiAtIDEpOyArK2kpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIHN0cmluZyBpZnN0eWxlOworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBpZnN0eWxlID0gIkNvYkNsIjsKKyAgfQorCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKyAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCBzaG9ydF9zdWZmaXgsIHByb3RvY29sX3R5cGUsIF90aGlzOworICBzdHJpbmcgY29uc3QgcHJvdF9mYWN0b3J5X3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkiOworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICB0ZW1wbGF0ZV9oZWFkZXIgPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7CisgICAgc2hvcnRfc3VmZml4ID0gIlQiOworICAgIHRlbXBsYXRlX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOworICAgIHByb3RvY29sX3R5cGUgPSAiUHJvdG9jb2xfIjsKKyAgICBfdGhpcyA9ICJ0aGlzLT4iOworICB9IGVsc2UgeworICAgIHByb3RvY29sX3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7CisgIH0KKyAgc3RyaW5nIHByb3RfcHRyID0gInN0ZDo6c2hhcmVkX3B0cjwgIiArIHByb3RvY29sX3R5cGUgKyAiPiI7CisgIHN0cmluZyBjbGllbnRfc3VmZml4ID0gIkNsaWVudCIgKyB0ZW1wbGF0ZV9zdWZmaXg7CisgIHN0cmluZyBpZl9zdWZmaXggPSAiSWYiOworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBpZl9zdWZmaXggKz0gdGVtcGxhdGVfc3VmZml4OworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgZl9oZWFkZXJfIDw8ICIvLyBUaGUgXCdjb25jdXJyZW50XCcgY2xpZW50IGlzIGEgdGhyZWFkIHNhZmUgY2xpZW50IHRoYXQgY29ycmVjdGx5IGhhbmRsZXNcbiIKKyAgICAgICAgICAgICAgICAgIi8vIG91dCBvZiBvcmRlciByZXNwb25zZXMuICBJdCBpcyBzbG93ZXIgdGhhbiB0aGUgcmVndWxhciBjbGllbnQsIHNvIHNob3VsZFxuIgorICAgICAgICAgICAgICAgICAiLy8gb25seSBiZSB1c2VkIHdoZW4geW91IG5lZWQgdG8gc2hhcmUgYSBjb25uZWN0aW9uIGFtb25nIG11bHRpcGxlIHRocmVhZHNcbiI7CisgIH0KKyAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeAorICAgICAgICAgICAgPDwgIiA6ICIKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgaWZzdHlsZSA8PCBpZl9zdWZmaXggPDwgZXh0ZW5kc19jbGllbnQgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIKKyAgICAgICAgICAgICAgPDwgIiBwcm90KSAiOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICI6IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCBzdHlsZSA8PCBjbGllbnRfc3VmZml4IDw8ICIocHJvdCwgcHJvdCkge30iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisgICAgICAgICAgICAgIDw8ICIgaXByb3QsICIgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgIjsKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgInsiIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKGlwcm90LG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICI6IiA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoaXByb3QsIG9wcm90KSB7fSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIHNldFByb3RvY29sIG1ldGhvZHMKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiBwcml2YXRlOiIgPDwgZW5kbDsKKyAgICAgIC8vIDE6IG9uZSBwYXJhbWV0ZXIKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIHByb3QpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAic2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKHByb3QscHJvdCk7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgLy8gMjogdHdvIHBhcmFtZXRlcgorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyIDw8ICIgaXByb3QsICIKKyAgICAgICAgICAgICAgICA8PCBwcm90X3B0ciA8PCAiIG9wcm90KSB7IiA8PCBlbmRsOworCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgcGlwcm90Xz1pcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xz1vcHJvdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8gPSBpcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICBvcHJvdF8gPSBvcHJvdC5nZXQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgZ2V0dGVycyBmb3IgdGhlIHByb3RvY29scy4KKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgdGVtcGxhdGVkIGZvciBzaW1wbGljaXR5LgorICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBzaG91bGQgdGhleSBiZSB0ZW1wbGF0ZWQ/CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRPdXRwdXRQcm90b2NvbCgpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBvcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIH0gZWxzZSAvKiBpZiAoc3R5bGUgPT0gIkNvYiIpICovIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsLCAiCisgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5KSA6IiA8PCBlbmRsOworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBjaGFubmVsXyhjaGFubmVsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICBpdHJhbnNfKG5ldyA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIoKSksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3RyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIC8vIFRQcm90b2NvbEZhY3RvcnkgY2xhc3NlcyByZXR1cm4gZ2VuZXJpYyBUUHJvdG9jb2wgcG9pbnRlcnMuCisgICAgICAgIC8vIFdlIGhhdmUgdG8gZHluYW1pYyBjYXN0IHRvIHRoZSBQcm90b2NvbF8gdHlwZSB3ZSBhcmUgZXhwZWN0aW5nLgorICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyg6OnN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiCisgICAgICAgICAgICAgICAgICA8PCAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChpdHJhbnNfKSkpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgcG9wcm90Xyg6OnN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiCisgICAgICAgICAgICAgICAgICA8PCAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkpIHsiIDw8IGVuZGw7CisgICAgICAgIC8vIFRocm93IGEgVEV4Y2VwdGlvbiBpZiBlaXRoZXIgZHluYW1pYyBjYXN0IGZhaWxlZC4KKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmICghcGlwcm90XyB8fCAhcG9wcm90XykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKFwiIgorICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEZhY3RvcnkgcmV0dXJuZWQgdW5leHBlY3RlZCBwcm90b2NvbCB0eXBlIGluICIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIgY29uc3RydWN0b3JcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiICB9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8ocHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChpdHJhbnNfKSksIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBwb3Byb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gcGlwcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICBvcHJvdF8gPSBwb3Byb3RfLmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCBzdHlsZSA8PCBjbGllbnRfc3VmZml4CisgICAgICAgICAgICAgICAgPDwgIihjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkpIHt9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBnZXRDaGFubmVsKCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAiY2hhbm5lbF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmICghZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIHZvaWQgY29tcGxldGVkX18oYm9vbCAvKiBzdWNjZXNzICovKSB7fSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgLy8gVE9ETyhkcmVpc3MpOiBVc2UgcHJpdmF0ZSBpbmhlcml0YW5jZSB0byBhdm9pZCBnZW5lcmF0aW5nIHRoaXNlIGluIGNvYi1zdHlsZS4KKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAvLyBjb25jdXJyZW50IGNsaWVudHMgbmVlZCB0byBtb3ZlIHRoZSBzZXFpZCBmcm9tIHRoZSBzZW5kIGZ1bmN0aW9uIHRvIHRoZQorICAgICAgLy8gcmVjdiBmdW5jdGlvbi4gIE9uZXdheSBtZXRob2RzIGRvbid0IGhhdmUgYSByZWN2IGZ1bmN0aW9uLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAvLyBtb3ZlIHRoZSBzZXFpZCBmb3IgdGhlbS4gIEF0dGVtcHRpbmcgdG8gZG8gc28gd291bGQgcmVzdWx0IGluIGEgc2VxaWQgbGVhay4KKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfaTMyLCAvKnJldHVybmluZyBzZXFpZCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICB0X2ZpZWxkIHNlcUlkQXJnKGdfdHlwZV9pMzIsICJzZXFpZCIpOworICAgICAgICB0X3N0cnVjdCBzZXFJZEFyZ1N0cnVjdChwcm9ncmFtXyk7CisgICAgICAgIHNlcUlkQXJnU3RydWN0LmFwcGVuZCgmc2VxSWRBcmcpOworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcUlkQXJnU3RydWN0KTsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsXzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpdHJhbnNfOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG90cmFuc187IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwaXByb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdF9wdHIgPDwgIiBwb3Byb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBpcHJvdF87IiA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIG9wcm90XzsiIDw8IGVuZGw7CisKKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICBmX2hlYWRlcl8gPDwKKyAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIHN5bmNfOyI8PGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gT3V0cHV0IGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHlwZWRlZiB1c2luZworICAgIC8vIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKKyAgICAgICAgICAgICAgPDwgIkNsaWVudFQ8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZQorICAgICAgICAgICAgICA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIHNjb3BlID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgY2xpZW50X3N1ZmZpeCArICI6OiI7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgc2VxSWRDYXB0dXJlOworICAgIHN0cmluZyBzZXFJZFVzZTsKKyAgICBzdHJpbmcgc2VxSWRDb21tYVVzZTsKKyAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzZXFJZENhcHR1cmUgPSAiaW50MzJfdCBzZXFpZCA9ICI7CisgICAgICBzZXFJZFVzZSA9ICJzZXFpZCI7CisgICAgICBzZXFJZENvbW1hVXNlID0gIiwgc2VxaWQiOworICAgIH0KKworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSwgc2NvcGUpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBzZXFJZENhcHR1cmUgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybiIgPDwgc2VxSWRDb21tYVVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAicmV0dXJuIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IHNlcUlkVXNlIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZEFuZFJlY3ZNZXNzYWdlKCIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpLCAiIDw8IF90aGlzIDw8ICJpdHJhbnNfLmdldCgpKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIgorICAgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gaWYgKHN0eWxlICE9ICJDb2IiKSAvLyBUT0RPKGRyZWlzcyk6IExpYmlmeSB0aGUgY2xpZW50IGFuZCBkb24ndCBnZW5lcmF0ZSB0aGlzIGZvciBjb2Itc3R5bGUKKyAgICBpZiAodHJ1ZSkgeworICAgICAgdF90eXBlKiBzZW5kX2Z1bmNfcmV0dXJuX3R5cGUgPSBnX3R5cGVfdm9pZDsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIgJiYgISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX2kzMjsKKyAgICAgIH0KKyAgICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oc2VuZF9mdW5jX3JldHVybl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICAvLyBGdW5jdGlvbiBhcmd1bWVudHMgYW5kIHJlc3VsdHMKKyAgICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyI7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0IjsKKworICAgICAgc3RyaW5nIGNzZXFpZFZhbCA9ICIwIjsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgY3NlcWlkVmFsID0gInRoaXMtPnN5bmNfLmdlbmVyYXRlU2VxSWQoKSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgICAgb3V0IDw8CisgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IGNzZXFpZCA9ICIgPDwgY3NlcWlkVmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRTZW5kU2VudHJ5IHNlbnRyeSgmdGhpcy0+c3luY18pOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3RyYW5zXy0+cmVzZXRCdWZmZXIoKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwKKyAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8CisgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAorICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjoiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiKSA8PAorICAgICAgICAiLCBjc2VxaWQpOyIgPDwgZW5kbCA8PCBlbmRsIDw8CisgICAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAmIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IF90aGlzIDw8ICJvcHJvdF8pOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNzZXFpZDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIG9uZXdheSBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKworICAgICAgICB0X3N0cnVjdCogcmVjdl9mdW5jdGlvbl9hcmdzID0gJm5vYXJnczsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIHJlY3ZfZnVuY3Rpb25fYXJncyA9ICZzZXFJZEFyZ1N0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MpOworICAgICAgICAvLyBPcGVuIHRoZSByZWN2IGZ1bmN0aW9uCisgICAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgICBvdXQgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbDsKKyAgICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gdGhlIHJlYWQgbXV0ZXggZ2V0cyBkcm9wcGVkIGFuZCByZWFjcXVpcmVkIGFzIHBhcnQgb2Ygd2FpdEZvcldvcmsoKSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIFRoZSBkZXN0cnVjdG9yIG9mIHRoaXMgc2VudHJ5IHdha2VzIHVwIG90aGVyIGNsaWVudHMiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRSZWN2U2VudHJ5IHNlbnRyeSgmdGhpcy0+c3luY18sIHNlcWlkKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIGNvbXBsZXRlZCA9IGZhbHNlOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0cnkgeyI7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJ3aGlsZSh0cnVlKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZighdGhpcy0+c3luY18uZ2V0UGVuZGluZyhmbmFtZSwgbXR5cGUsIHJzZXFpZCkpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHJzZXFpZCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoc2VxaWQgPT0gcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHg7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChmbmFtZS5jb21wYXJlKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSAhPSAwKSB7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gaW4gYSBiYWQgc3RhdGUsIGRvbid0IGNvbW1pdCIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAgICAgICAmJiAhaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgIl9yZXR1cm4iKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQpIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAmX3JldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKCIgPDwgX3RoaXMgPDwgImlwcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgICA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgICAgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAvLyBDYXJlZnVsLCBvbmx5IGxvb2sgZm9yIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOworICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIF9yZXR1cm4gcG9pbnRlciBoYXMgbm93IGJlZW4gZmlsbGVkIiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gX3JldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgYXJlIGEgdm9pZCBmdW5jdGlvbgorICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gaW4gYSBiYWQgc3RhdGUsIGRvbid0IGNvbW1pdCIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBzZXFpZCAhPSByc2VxaWQiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLnVwZGF0ZVBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gdGhpcyB3aWxsIHRlbXBvcmFyaWx5IHVubG9jayB0aGUgcmVhZE11dGV4LCBhbmQgbGV0IG90aGVyIGNsaWVudHMgZ2V0IHdvcmsgZG9uZSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+c3luY18ud2FpdEZvcldvcmsoc2VxaWQpOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gLy8gZW5kIHdoaWxlKHRydWUpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoICguLi4pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFjb21wbGV0ZWQpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBjb21wbGV0ZWRfXyhmYWxzZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2NsYXNzIFByb2Nlc3NvckdlbmVyYXRvciB7CitwdWJsaWM6CisgIFByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwgdF9zZXJ2aWNlKiBzZXJ2aWNlLCBjb25zdCBzdHJpbmcmIHN0eWxlKTsKKworICB2b2lkIHJ1bigpIHsKKyAgICBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2hDYWxsKCkgZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGZhbHNlKTsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwodHJ1ZSk7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgYWxsIG9mIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7CisKKyAgICBnZW5lcmF0ZV9mYWN0b3J5KCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKTsKKyAgdm9pZCBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7CisgIHZvaWQgZ2VuZXJhdGVfZmFjdG9yeSgpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBhcmcgPSBmYWxzZSkgeworICAgIHJldHVybiBnZW5lcmF0b3JfLT50eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGFyZyk7CisgIH0KKworICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQoKTsgfQorICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBnZW5lcmF0b3JfLT5pbmRlbnQob3MpOyB9CisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7IGdlbmVyYXRvcl8tPmluZGVudF91cCgpOyB9CisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IGdlbmVyYXRvcl8tPmluZGVudF9kb3duKCk7IH0KKworICB0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvcl87CisgIHRfc2VydmljZSogc2VydmljZV87CisgIHN0ZDo6b3N0cmVhbSYgZl9oZWFkZXJfOworICBzdGQ6Om9zdHJlYW0mIGZfb3V0XzsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV87CisgIHN0cmluZyBzdHlsZV87CisgIHN0cmluZyBwc3R5bGVfOworICBzdHJpbmcgY2xhc3NfbmFtZV87CisgIHN0cmluZyBpZl9uYW1lXzsKKyAgc3RyaW5nIGZhY3RvcnlfY2xhc3NfbmFtZV87CisgIHN0cmluZyBmaW5pc2hfY29iXzsKKyAgc3RyaW5nIGZpbmlzaF9jb2JfZGVjbF87CisgIHN0cmluZyByZXRfdHlwZV87CisgIHN0cmluZyBjYWxsX2NvbnRleHRfOworICBzdHJpbmcgY29iX2FyZ187CisgIHN0cmluZyBjYWxsX2NvbnRleHRfYXJnXzsKKyAgc3RyaW5nIGNhbGxfY29udGV4dF9kZWNsXzsKKyAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlcl87CisgIHN0cmluZyB0ZW1wbGF0ZV9zdWZmaXhfOworICBzdHJpbmcgdHlwZW5hbWVfc3RyXzsKKyAgc3RyaW5nIGNsYXNzX3N1ZmZpeF87CisgIHN0cmluZyBleHRlbmRzXzsKK307CisKK1Byb2Nlc3NvckdlbmVyYXRvcjo6UHJvY2Vzc29yR2VuZXJhdG9yKHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHlsZSkKKyAgOiBnZW5lcmF0b3JfKGdlbmVyYXRvciksCisgICAgc2VydmljZV8oc2VydmljZSksCisgICAgZl9oZWFkZXJfKGdlbmVyYXRvci0+Zl9oZWFkZXJfKSwKKyAgICBmX291dF8oZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXyA/IGdlbmVyYXRvci0+Zl9zZXJ2aWNlX3RjY18gOiBnZW5lcmF0b3ItPmZfc2VydmljZV8pLAorICAgIHNlcnZpY2VfbmFtZV8oZ2VuZXJhdG9yLT5zZXJ2aWNlX25hbWVfKSwKKyAgICBzdHlsZV8oc3R5bGUpIHsKKyAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgIHBzdHlsZV8gPSAiQXN5bmMiOworICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iU3ZJZiI7CisKKyAgICBmaW5pc2hfY29iXyA9ICI6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCAiOworICAgIGZpbmlzaF9jb2JfZGVjbF8gPSAiOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+LCAiOworICAgIGNvYl9hcmdfID0gImNvYiwgIjsKKyAgICByZXRfdHlwZV8gPSAidm9pZCAiOworICB9IGVsc2UgeworICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOworICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJJZiI7CisKKyAgICByZXRfdHlwZV8gPSAiYm9vbCAiOworICAgIC8vIFRPRE8oZWRoYWxsKSBjYWxsQ29udGV4dCBzaG91bGQgZXZlbnR1YWxseSBiZSBhZGRlZCB0byBUQXN5bmNQcm9jZXNzb3IKKyAgICBjYWxsX2NvbnRleHRfID0gIiwgdm9pZCogY2FsbENvbnRleHQiOworICAgIGNhbGxfY29udGV4dF9hcmdfID0gIiwgY2FsbENvbnRleHQiOworICAgIGNhbGxfY29udGV4dF9kZWNsXyA9ICIsIHZvaWQqIjsKKyAgfQorCisgIGZhY3RvcnlfY2xhc3NfbmFtZV8gPSBjbGFzc19uYW1lXyArICJGYWN0b3J5IjsKKworICBpZiAoZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXykgeworICAgIHRlbXBsYXRlX2hlYWRlcl8gPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7CisgICAgdGVtcGxhdGVfc3VmZml4XyA9ICI8UHJvdG9jb2xfPiI7CisgICAgdHlwZW5hbWVfc3RyXyA9ICJ0eXBlbmFtZSAiOworICAgIGNsYXNzX25hbWVfICs9ICJUIjsKKyAgICBmYWN0b3J5X2NsYXNzX25hbWVfICs9ICJUIjsKKyAgfQorCisgIGlmIChzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc18gPSB0eXBlX25hbWUoc2VydmljZV8tPmdldF9leHRlbmRzKCkpICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgorICAgICAgZXh0ZW5kc18gKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgcGFyZW50X2NsYXNzOworICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHBhcmVudF9jbGFzcyA9IGV4dGVuZHNfOworICB9IGVsc2UgeworICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICAgIHBhcmVudF9jbGFzcyA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IiOworICAgIH0gZWxzZSB7CisgICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6VERpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIHBhcmVudF9jbGFzcyArPSAiVDxQcm90b2NvbF8+IjsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZV8gPDwgIiA6IHB1YmxpYyAiIDw8IHBhcmVudF9jbGFzcyA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXyA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbCgiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIgorICAgICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8IGVuZGw7CisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QsICIKKyAgICAgICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBQcm9jZXNzIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICBmX2hlYWRlcl8gPDwgIiBwcml2YXRlOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRGVjbGFyZSBwcm9jZXNzTWFwXworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIKKyAgICAgICAgICAgIDw8ICJQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqLCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8IGVuZGw7CisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCisgICAgICAgICAgICAgIDw8ICJTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbikoIiA8PCBmaW5pc2hfY29iX2RlY2xfIDw8ICJpbnQzMl90LCAiCisgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qLCBQcm90b2NvbF8qIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJzdHJ1Y3QgUHJvY2Vzc0Z1bmN0aW9ucyB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFByb2Nlc3NGdW5jdGlvbiBnZW5lcmljOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbiBzcGVjaWFsaXplZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucyhQcm9jZXNzRnVuY3Rpb24gZywgIgorICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gcykgOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIGdlbmVyaWMoZyksIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgc3BlY2lhbGl6ZWQocykge30iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9ucygpIDogZ2VuZXJpYyhOVUxMKSwgc3BlY2lhbGl6ZWQoTlVMTCkgIgorICAgICAgICAgICAgICA8PCAie30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb25zPiAiCisgICAgICAgICAgICAgIDw8ICJQcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gIgorICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzTWFwIHByb2Nlc3NNYXBfOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgICAgICAgICAgPDwgImludDMyX3Qgc2VxaWQsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCBQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICAgIC8vIFhYWCBGYWN0b3IgdGhpcyBvdXQsIGV2ZW4gaWYgaXQgaXMgYSBwYWluLgorICAgICAgc3RyaW5nIHJldF9hcmcgPSAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiLCBjb25zdCAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIik7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCisgICAgICAgICAgICAgICAgPDwgInZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIFhYWCBEb24ndCBkZWNsYXJlIHRocm93IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCB0aHJvd18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXworICAgICAgICAgICAgPDwgIj4gaWZhY2UpIDoiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc18uZW1wdHkoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHNfIDw8ICIoaWZhY2UpLCIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdID0gIjsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiUHJvY2Vzc0Z1bmN0aW9ucygiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgeworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICBOVUxMLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICImIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBjbGFzc19uYW1lXyA8PCAiKCkge30iCisgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gR2VuZXJhdGUgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSB0eXBlZGVmLCBmb3IgY2FsbGVycyB3aG8gZG9uJ3Qga25vdworICAgIC8vIGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZS4KKyAgICAvLworICAgIC8vIFdlIGNhbid0IHVzZSBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciwgc2luY2UgUHJvY2Vzc29yVAorICAgIC8vIHByb3ZpZGVzIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgbW9zdCBtZXRob2RzLCBvbmUgb2Ygd2hpY2ggYWNjZXB0cworICAgIC8vIFRQcm90b2NvbCBwb2ludGVycywgYW5kIG9uZSB3aGljaCBhY2NlcHRzIFByb3RvY29sXyBwb2ludGVycy4gIFRoaXMKKyAgICAvLyByZXN1bHRzIGluIGEgY29tcGlsZSBlcnJvciBpZiBpbnN0YW50aWF0ZWQgd2l0aCBQcm90b2NvbF8gPT0gVFByb3RvY29sLgorICAgIC8vIFRoZXJlZm9yZSwgd2UgZGVmaW5lIFREdW1teVByb3RvY29sIHNvbGVseSBzbyB3ZSBjYW4gdXNlIGl0IGFzIHRoZQorICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciBoZXJlLgorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IGNsYXNzX25hbWVfIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIKKyAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoYm9vbCB0ZW1wbGF0ZV9wcm90b2NvbCkgeworICBzdHJpbmcgcHJvdG9jb2wgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7CisgIHN0cmluZyBmdW5jdGlvbl9zdWZmaXg7CisgIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgeworICAgIHByb3RvY29sID0gIlByb3RvY29sXyI7CisgICAgLy8gV2UgY2FsbCB0aGUgZ2VuZXJpYyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbCgpLCBhbmQgdGhlIHNwZWNpYWxpemVkCisgICAgLy8gdmVyc2lvbiBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoKS4gIFdlIGNhbid0IGNhbGwgdGhlbSBib3RoCisgICAgLy8gZGlzcGF0Y2hDYWxsKCksIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSB0aGUgY29tcGlsZXIgdG8gaXNzdWUgYSB3YXJuaW5nIGlmCisgICAgLy8gYSBzZXJ2aWNlIHRoYXQgZG9lc24ndCB1c2UgdGVtcGxhdGVzIGluaGVyaXRzIGZyb20gYSBzZXJ2aWNlIHRoYXQgZG9lcworICAgIC8vIHVzZSB0ZW1wbGF0ZXM6IHRoZSBjb21waWxlciBjb21wbGFpbnMgdGhhdCB0aGUgc3ViY2xhc3Mgb25seSBpbXBsZW1lbnRzCisgICAgLy8gdGhlIGdlbmVyaWMgdmVyc2lvbiBvZiBkaXNwYXRjaENhbGwoKSwgYW5kIGhpZGVzIHRoZSB0ZW1wbGF0ZWQgdmVyc2lvbi4KKyAgICAvLyBVc2luZyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gZnVuY3Rpb25zIHByZXZlbnRzIHRoaXMuCisgICAgZnVuY3Rpb25fc3VmZml4ID0gIlRlbXBsYXRlZCI7CisgIH0KKworICBmX291dF8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCByZXRfdHlwZV8gPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpkaXNwYXRjaENhbGwiCisgICAgICAgICA8PCBmdW5jdGlvbl9zdWZmaXggPDwgIigiIDw8IGZpbmlzaF9jb2JfIDw8IHByb3RvY29sIDw8ICIqIGlwcm90LCAiIDw8IHByb3RvY29sCisgICAgICAgICA8PCAiKiBvcHJvdCwgIgorICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBIT1Q6IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIG1hcAorICBmX291dF8gPDwgaW5kZW50KCkgPDwgdHlwZW5hbWVfc3RyXyA8PCAiUHJvY2Vzc01hcDo6aXRlcmF0b3IgcGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgInBmbiA9IHByb2Nlc3NNYXBfLmZpbmQoZm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgImlmIChwZm4gPT0gcHJvY2Vzc01hcF8uZW5kKCkpIHsiIDw8IGVuZGw7CisgIGlmIChleHRlbmRzXy5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIGlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgIngoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCisgICAgICAgICAgICAgICInXCIrZm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oZm5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIKKyAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICIgIHJldHVybiBjb2IodHJ1ZSk7IiA6ICIgIHJldHVybiB0cnVlOyIpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGV4dGVuZHNfIDw8ICI6OmRpc3BhdGNoQ2FsbCgiCisgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiY29iLCAiIDogIiIpIDw8ICJpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0X2FyZ18KKyAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5zcGVjaWFsaXplZCkpIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgeworICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIG51bGwgcG9pbnRlciwgc28gbm90aGluZyBnb29kIHdpbGwgY29tZSBmcm9tIGNhbGxpbmcKKyAgICAgIC8vIGl0LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGluc3RlYWQuCisgICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7CisgICAgfSBlbHNlIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kKSkiOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIigiIDw8IGNvYl9hcmdfIDw8ICJzZXFpZCwgaXByb3QsIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfYXJnXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhkcmVpc3MpOiByZXR1cm4gcGZuIHJldD8KKyAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfb3V0XyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gc2VydmljZV8tPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7CisgICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2ZhY3RvcnkoKSB7CisgIHN0cmluZyBpZl9mYWN0b3J5X25hbWUgPSBpZl9uYW1lXyArICJGYWN0b3J5IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgZmFjdG9yeSBjbGFzcyBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3JGYWN0b3J5IiA6ICJUUHJvY2Vzc29yRmFjdG9yeSIpIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiKGNvbnN0IDo6c3RkOjpzaGFyZWRfcHRyPCAiIDw8IGlmX2ZhY3RvcnlfbmFtZQorICAgICAgICAgICAgPDwgIiA+JiBoYW5kbGVyRmFjdG9yeSkgOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgICBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKKyAgICAgICAgICAgIDw8ICJnZXRQcm9jZXNzb3IoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbyk7IiA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8ICIKKyAgICAgICAgICAgIDw8IGlmX2ZhY3RvcnlfbmFtZSA8PCAiID4gaGFuZGxlckZhY3RvcnlfOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdGVtcGxhdGVzLCBvdXRwdXQgYSB0eXBlZGVmIGZvciB0aGUgcGxhaW4KKyAgLy8gZmFjdG9yeSBuYW1lLgorICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfCisgICAgICAgICAgICAgIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGVfCisgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3JGYWN0b3J5OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGdldFByb2Nlc3NvcigpIG1ldGhvZAorICBmX291dF8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6Z2V0UHJvY2Vzc29yKCIKKyAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX291dF8gPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlJlbGVhc2VIYW5kbGVyPCAiIDw8IGlmX2ZhY3RvcnlfbmFtZQorICAgICAgICAgPDwgIiA+IGNsZWFudXAoaGFuZGxlckZhY3RvcnlfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCAiCisgICAgICAgICA8PCBpZl9uYW1lXyA8PCAiID4gaGFuZGxlcigiCisgICAgICAgICA8PCAiaGFuZGxlckZhY3RvcnlfLT5nZXRIYW5kbGVyKGNvbm5JbmZvKSwgY2xlYW51cCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICA8PCAicHJvY2Vzc29yKG5ldyAiIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIihoYW5kbGVyKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAicmV0dXJuIHByb2Nlc3NvcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm9jZXNzb3IgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIFByb2Nlc3NvckdlbmVyYXRvciBnZW5lcmF0b3IodGhpcywgdHNlcnZpY2UsIHN0eWxlKTsKKyAgZ2VuZXJhdG9yLnJ1bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgJnJlc3VsdCk7CisKKyAgcmVzdWx0LnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0Iik7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlLCBnZW5fY29iX3N0eWxlXyk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkKSB7CisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBzdHJpbmcgc2VydmljZV9mdW5jX25hbWUgPSAiXCIiICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLiIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiXCIiOworCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgcHJvdF90eXBlID0gKHNwZWNpYWxpemVkID8gIlByb3RvY29sXyIgOiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCIpOworICBzdHJpbmcgY2xhc3Nfc3VmZml4OworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBjbGFzc19zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKKyAgfQorCisgIC8vIEkgdHJpZWQgdG8gZG8gdGhpcyBhcyBvbmUgZnVuY3Rpb24uICBJIHJlYWxseSBkaWQuICBCdXQgaXQgd2FzIHRvbyBoYXJkLgorICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgIH0KKyAgICBjb25zdCBib29sIHVubmFtZWRfb3Byb3Rfc2VxaWQgPSB0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICEoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKTsKKyAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6IgorICAgICAgICA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgPDwgImludDMyX3QiIDw8ICh1bm5hbWVkX29wcm90X3NlcWlkID8gIiwgIiA6ICIgc2VxaWQsICIpIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIgorICAgICAgICA8PCBwcm90X3R5cGUgPDwgIioiIDw8ICh1bm5hbWVkX29wcm90X3NlcWlkID8gIiwgIiA6ICIgb3Byb3QsICIpIDw8ICJ2b2lkKiBjYWxsQ29udGV4dCkiCisgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXVubmFtZWRfb3Byb3Rfc2VxaWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIHNlcWlkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIG9wcm90OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBjYWxsQ29udGV4dCk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBEZWNsYXJlIHJlc3VsdAorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFRyeSBibG9jayBmb3IgZnVuY3Rpb25zIHdpdGggZXhjZXB0aW9ucworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpZiAoaXNfY29tcGxleF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIocmVzdWx0LnN1Y2Nlc3MiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9IGlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIH0KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAifSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCAiIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBDb2Igc3R5bGUuCisgIGVsc2UgeworICAgIC8vIFByb2Nlc3NvciBlbnRyeSBwb2ludC4KKyAgICAvLyBUT0RPKGVkaGFsbCkgdXBkYXRlIGZvciBjYWxsQ29udGV4dCB3aGVuIFRFdmVudFNlcnZlciBpcyByZWFkeQorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6cHJvY2Vzc18iCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIC8vIFRPRE8oc2ltcGtpbnMpOiB3ZSBjb3VsZCB0cnkgdG8gY29uc29sZGF0ZSB0aGlzCisgICAgLy8gd2l0aCB0aGUgbm9uLWNvYiBjb2RlIGFib3ZlCisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgeworICAgICAgLy8gSWYgdGhlc2UgYXJlIGluc3RhbmNlcyBvZiBQcm90b2NvbF8sIGluc3RlYWQgb2YgYW55IG9sZCBUUHJvdG9jb2wsCisgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHByb2Nlc3MgZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfaXByb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmIChfaXByb3QgJiYgX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzXyIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfaXByb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpcHJvdCwgX2lwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfYXJncyBhcmdzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RSZWFkKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIFRPRE8oZHJlaXNzKTogSGFuZGxlIFRFeGNlcHRpb25zPyAgRXhwb3NlIHRvIHNlcnZlcj8KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICAgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGNvYihmYWxzZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBUT0RPKGRyZWlzcyk6IEZpZ3VyZSBvdXQgYSBzdHJhdGVneSBmb3IgZXhjZXB0aW9ucyBpbiBhc3luYyBoYW5kbGVycy4KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZyZWVyLnVucmVnaXN0ZXIoKTsiIDw8IGVuZGw7CisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIC8vIE5vIHJldHVybi4gIEp1c3QgaGFuZCBvZmYgb3VyIGNvYi4KKyAgICAgIC8vIFRPRE8oZHJlaXNzKTogQ2FsbCB0aGUgY29iIGltbWVkaWF0ZWx5PworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRydWUpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaW5nIHJldF9hcmcsIHJldF9wbGFjZWhvbGRlcjsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmV0X2FyZyA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iOworICAgICAgICByZXRfcGxhY2Vob2xkZXIgPSAiLCA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMSI7CisgICAgICB9CisKKyAgICAgIC8vIFdoZW4gZ2VuX3RlbXBsYXRlc18gaXMgdHJ1ZSwgdGhlIHJldHVybl8gYW5kIHRocm93XyBmdW5jdGlvbnMgYXJlCisgICAgICAvLyBvdmVybG9hZGVkLiAgV2UgaGF2ZSB0byBkZWNsYXJlIHBvaW50ZXJzIHRvIHRoZW0gc28gdGhhdCB0aGUgY29tcGlsZXIKKyAgICAgIC8vIGNhbiByZXNvbHZlIHRoZSBjb3JyZWN0IG92ZXJsb2FkZWQgdmVyc2lvbi4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgIDw8ICI6OipyZXR1cm5fZm4pKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiCisgICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZworICAgICAgICAgIDw8ICIpID0iIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICA8PCAiOjpyZXR1cm5fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgICAgPDwgIjo6KnRocm93X2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgorICAgICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpID0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgICAgPDwgIjo6dGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpiaW5kKHJldHVybl9mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsIGN0eCIgPDwgcmV0X3BsYWNlaG9sZGVyCisgICAgICAgICAgPDwgIikiOworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBvdXQgPDwgJywnIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpiaW5kKHRocm93X2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgIgorICAgICAgICAgICAgPDwgImN0eCwgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzEpIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBYWFggV2hpdGVzcGFjZSBjbGVhbnVwLgorICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBvdXQgPDwgJywnIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIE5vcm1hbCByZXR1cm4uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmV0X2FyZ19kZWNsLCByZXRfYXJnX25hbWU7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHJldF9hcmdfZGVjbCA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iOworICAgICAgICByZXRfYXJnX25hbWUgPSAiLCBfcmV0dXJuIjsKKyAgICAgIH0KKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6cmV0dXJuXyIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmdfZGVjbCA8PCAnKScgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCisgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcmV0dXJuIGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJldHVybl8iCisgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCIgPDwgcmV0X2FyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcHJlc3VsdCByZXN1bHQ7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIC8vIFRoZSBjb25zdF9jYXN0IGhlcmUgaXMgdW5mb3J0dW5hdGUsIGJ1dCBpdCB3b3VsZCBiZSBhIHBhaW4gdG8gYXZvaWQsCisgICAgICAgIC8vIGFuZCB3ZSBvbmx5IGRvIGEgd3JpdGUgd2l0aCB0aGlzIHN0cnVjdCwgd2hpY2ggaXMgY29uc3Qtc2FmZS4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGNvbnN0X2Nhc3Q8IiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKQorICAgICAgICAgICAgPDwgIio+KCZfcmV0dXJuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEV4Y2VwdGlvbiByZXR1cm4uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjp0aHJvd18iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpIiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgeworICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKKyAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCB0aHJvdyBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJvd18iCisgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCwgX3Rocm93KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBHZXQgdGhlIGV2ZW50IGhhbmRsZXIgY29udGV4dAorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gVGhyb3cgdGhlIFREZWxheWVkRXhjZXB0aW9uLCBhbmQgY2F0Y2ggdGhlIHJlc3VsdAorICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9yZXN1bHQgcmVzdWx0OyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl90aHJvdy0+dGhyb3dfaXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoZmFsc2UpOyIKKyAgICAgICAgICA8PCBlbmRsOyAvLyBJcyB0aGlzIHBvc3NpYmxlPyAgVEJELgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAnfSc7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgIiAgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9CisKKyAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgIG91dCA8PCAiIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgLy8gV2UgcGFzcyB0cnVlIHRvIHRoZSBjb2IgaGVyZSwgc2luY2Ugd2UgZGlkIHN1Y2Nlc3NmdWxseSB3cml0ZSBhCisgICAgICAgICAgLy8gcmVzcG9uc2UsIGV2ZW4gdGhvdWdoIGl0IGlzIGFuIGV4Y2VwdGlvbiByZXNwb25zZS4KKyAgICAgICAgICAvLyBJdCBsb29rcyBsaWtlIHRoZSBhcmd1bWVudCBpcyBjdXJyZW50bHkgaWdub3JlZCwgYW55d2F5LgorICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfSAvLyBmb3IgZWFjaCBmdW5jdGlvbgorICB9ICAgLy8gY29iIHN0eWxlCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2tlbGV0b24gZmlsZSBvZiBhIHNlcnZlcgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKKworICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOworICBmX3NrZWxldG9uIDw8ICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIi8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgbm90IGNvbXBpbGU6CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA7CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA6OjsKKyAgaWYgKCghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7CisgICAgZl9za2VsZXRvbiA8PCAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCkgLSAyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9za2VsZXRvbiA8PCAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzdmNuYW1lIDw8ICJJZiB7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9za2VsZXRvbiwgKmZfaXRlcik7CisgICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcHJpbnRmKFwiIgorICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcXG5cIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgImludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24KKyAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQgcG9ydCA9IDkwOTA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHN2Y25hbWUKKyAgICAgIDw8ICJIYW5kbGVyPiBoYW5kbGVyKG5ldyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyAiIDw8IHN2Y25hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIlRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgdGhlIGZpbGVzCisgIGZfc2tlbGV0b24uY2xvc2UoKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgaXNfcmVmZXJlbmNlKHRmaWVsZCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+IjsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJyZWFkSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnQzMl90ICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEkzMigiIDw8IHQKKyAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKKyAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQorICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKKyAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcikgeworICBpZiAocG9pbnRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoISIgPDwgcHJlZml4IDw8ICIpIHsgIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgcHJlZml4IDw8ICIgPSA6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiPihuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi0+cmVhZChpcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJib29sIHdhc1NldCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICItPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIpIHsgd2FzU2V0ID0gdHJ1ZTsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImlmICghd2FzU2V0KSB7ICIgPDwgcHJlZml4IDw8ICIucmVzZXQoKTsgfSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgYm9vbCB1c2VfcHVzaCA9IHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGt0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCB2dHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEJlZ2luKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRCZWdpbigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0QmVnaW4oIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIGlmICghdXNlX3B1c2gpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlc2l6ZSgiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpCisgICAgICA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIHVzZV9wdXNoLCBpKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGtleQorICAgICAgICAgICAgICA8PCAiXTsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmluc2VydCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfcHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4KSB7CisgIGlmICh1c2VfcHVzaCkgeworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2hfYmFjaygiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgcHJlZml4ICsgIlsiICsgaW5kZXggKyAiXSIpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgaXNfcmVmZXJlbmNlKHRmaWVsZCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCisgICAgICAgICAgICArIG5hbWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoKGludDMyX3QpIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIpIHsKKyAgaWYgKHBvaW50ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeGZlciArPSAiIDw8IHByZWZpeCA8PCAiLT53cml0ZShvcHJvdCk7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiCisgICAgICAgICAgICAgICAgPDwgIm9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpjb25zdF9pdGVyYXRvciAiIDw8IGl0ZXIgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmb3IgKCIgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5iZWdpbigpOyAiIDw8IGl0ZXIgPDwgIiAhPSAiIDw8IHByZWZpeAorICAgICAgPDwgIi5lbmQoKTsgKysiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLT5maXJzdCIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLT5zZWNvbmQiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBNYWtlcyBhIDo6IHByZWZpeCBmb3IgYSBuYW1lc3BhY2UKKyAqCisgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAorICogQHJldHVybiBOYW1lc3BhY2VzCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9wcmVmaXgoc3RyaW5nIG5zKSB7CisgIC8vIEFsd2F5cyBzdGFydCB3aXRoICI6OiIsIHRvIGF2b2lkIHBvc3NpYmxlIG5hbWUgY29sbGlzaW9ucyB3aXRoCisgIC8vIG90aGVyIG5hbWVzIGluIG9uZSBvZiB0aGUgY3VycmVudCBuYW1lc3BhY2VzLgorICAvLworICAvLyBXZSBhbHNvIG5lZWQgYSBsZWFkaW5nIHNwYWNlLCBpbiBjYXNlIHRoZSBuYW1lIGlzIHVzZWQgaW5zaWRlIG9mIGEKKyAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgIk15VGVtcGxhdGU8Ojpmb286OkJhcj4iIGlzIG5vdCB2YWxpZCBDKyssCisgIC8vIHNpbmNlICI8OiIgaXMgYW4gYWx0ZXJuYXRpdmUgdG9rZW4gZm9yICJbIi4KKyAgc3RyaW5nIHJlc3VsdCA9ICIgOjoiOworCisgIGlmIChucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgIHJlc3VsdCArPSAiOjoiOworICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIE9wZW5zIG5hbWVzcGFjZS4KKyAqCisgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAorICogQHJldHVybiBOYW1lc3BhY2VzCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9vcGVuKHN0cmluZyBucykgeworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBzdHJpbmcgc2VwYXJhdG9yID0gIiI7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7CisgICAgcmVzdWx0ICs9ICJuYW1lc3BhY2UgIjsKKyAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgcmVzdWx0ICs9ICIgeyI7CisgICAgc2VwYXJhdG9yID0gIiAiOworICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9IHNlcGFyYXRvciArICJuYW1lc3BhY2UgIiArIG5zICsgIiB7IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlcyBuYW1lc3BhY2UuCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfY2xvc2Uoc3RyaW5nIG5zKSB7CisgIGlmIChucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorICBzdHJpbmcgcmVzdWx0ID0gIn0iOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gIn0iOworICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICB9CisgIHJlc3VsdCArPSAiIC8vIG5hbWVzcGFjZSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEMrKyB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSB0eXBlIG5hbWUsIGkuZS4gc3RkOjpzZXQ8dHlwZT4KKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBhcmcpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7CisgICAgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLnR5cGUiKTsKKyAgICBpZiAoaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgICAgYm5hbWUgPSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGlmICghYXJnKSB7CisgICAgICByZXR1cm4gYm5hbWU7CisgICAgfQorCisgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lICsgIiYiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgYSBjdXN0b20gb3ZlcmxvYWRlZCBDKysgbmFtZQorICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgc3RyaW5nIGNuYW1lOworCisgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjptYXA8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiLCAiCisgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6c2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKKyAgICB9CisKKyAgICBpZiAoYXJnKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNuYW1lOworICAgIH0KKyAgfQorCisgIHN0cmluZyBjbGFzc19wcmVmaXg7CisgIGlmIChpbl90eXBlZGVmICYmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgY2xhc3NfcHJlZml4ID0gImNsYXNzICI7CisgIH0KKworICAvLyBDaGVjayBpZiBpdCBuZWVkcyB0byBiZSBuYW1lc3BhY2VkCisgIHN0cmluZyBwbmFtZTsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgbmFtZXNwYWNlX3ByZWZpeChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSkgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkgJiYgIWdlbl9wdXJlX2VudW1zXykgeworICAgIHBuYW1lICs9ICI6OnR5cGUiOworICB9CisKKyAgaWYgKGFyZykgeworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBwbmFtZTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcmV0dXJuIEV4cGxpY2l0IEMrKyB0eXBlLCBpLmUuICJpbnQzMl90IgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJldHVybiAic3RkOjpzdHJpbmciOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gImludDhfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiaW50MTZfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50MzJfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaW50NjRfdCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBGaWVsZCBkZWNsYXJhdGlvbiwgaS5lLiBpbnQgeCA9IDA7CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgaWYgKGNvbnN0YW50KSB7CisgICAgcmVzdWx0ICs9ICJjb25zdCAiOworICB9CisgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGlzX3JlZmVyZW5jZSh0ZmllbGQpKSB7CisgICAgcmVzdWx0ID0gIjo6c3RkOjpzaGFyZWRfcHRyPCIgKyByZXN1bHQgKyAiPiI7CisgIH0KKyAgaWYgKHBvaW50ZXIpIHsKKyAgICByZXN1bHQgKz0gIioiOworICB9CisgIGlmIChyZWZlcmVuY2UpIHsKKyAgICByZXN1bHQgKz0gIiYiOworICB9CisgIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikwIjsKKyAgICB9CisgIH0KKyAgaWYgKCFyZWZlcmVuY2UpIHsKKyAgICByZXN1bHQgKz0gIjsiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGJvb2wgaGFzX3hjZXB0aW9ucyA9ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpOworCisgIGlmIChzdHlsZSA9PSAiIikgeworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CisgICAgICByZXR1cm4gInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIHR5cGVfbmFtZSh0dHlwZSkKKyAgICAgICAgICAgICArIChuYW1lX3BhcmFtcyA/ICImIF9yZXR1cm4iIDogIiYgLyogX3JldHVybiAqLyIpCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMpICsgIikiOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHlsZS5zdWJzdHIoMCwgMykgPT0gIkNvYiIpIHsKKyAgICBzdHJpbmcgY29iX3R5cGU7CisgICAgc3RyaW5nIGV4bl9jb2I7CisgICAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKKyAgICAgIGNvYl90eXBlID0gIigiICsgc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGNvYl90eXBlICs9ICJUPFByb3RvY29sXz4iOworICAgICAgfQorICAgICAgY29iX3R5cGUgKz0gIiogY2xpZW50KSI7CisgICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7CisgICAgICBjb2JfdHlwZSA9ICh0dHlwZS0+aXNfdm9pZCgpID8gIigpIiA6ICgiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiBjb25zdCYgX3JldHVybikiKSk7CisgICAgICBpZiAoaGFzX3hjZXB0aW9ucykgeworICAgICAgICBleG5fY29iCisgICAgICAgICAgICA9ICIsIDo6c3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOworICAgIH0KKworICAgIHJldHVybiAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZCIgKyBjb2JfdHlwZSArICI+IGNvYiIKKyAgICAgICAgICAgKyBleG5fY29iICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zLCBib29sIHN0YXJ0X2NvbW1hKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSAhc3RhcnRfY29tbWE7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSArICIgIgorICAgICAgICAgICAgICArIChuYW1lX3BhcmFtcyA/ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA6ICIvKiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiAqLyIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICoKKyAqIEBwYXJhbSB0eXBlIFRocmlmdCBUeXBlCisgKiBAcmV0dXJuIFN0cmluZyBvZiBDKysgY29kZSB0byBkZWZpbml0aW9uIG9mIHRoYXQgdHlwZSBjb25zdGFudAorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKKyAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKKyAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8IChpbmNsdWRlX3ByZWZpeC5zaXplKCkgPiAwICYmIGluY2x1ZGVfcHJlZml4WzBdID09ICcvJykpIHsKKyAgICAvLyBpZiBmbGFnIGlzIHR1cm5lZCBvZmYgb3IgdGhpcyBpcyBhYnNvbHV0ZSBwYXRoLCByZXR1cm4gZW1wdHkgcHJlZml4CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKKyAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9wcmVmaXgucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmV0dXJuIGluY2x1ZGVfcHJlZml4LnN1YnN0cigwLCBsYXN0X3NsYXNoKQorICAgICAgICAgICArIChnZXRfcHJvZ3JhbSgpLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpID8gIi8iIDogIi8iICsgb3V0X2Rpcl9iYXNlXyArICIvIik7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY3BwLAorICAgICJDKysiLAorICAgICIgICAgY29iX3N0eWxlOiAgICAgICBHZW5lcmF0ZSBcIkNvbnRpbnVhdGlvbiBPQmplY3RcIi1zdHlsZSBjbGFzc2VzLlxuIgorICAgICIgICAgbm9fY2xpZW50X2NvbXBsZXRpb246XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLlxuIgorICAgICIgICAgbm9fZGVmYXVsdF9vcGVyYXRvcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXRzIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBvcGVyYXRvcnMgPT0sICE9IGFuZCA8XG4iCisgICAgIiAgICB0ZW1wbGF0ZXM6ICAgICAgIEdlbmVyYXRlIHRlbXBsYXRpemVkIHJlYWRlci93cml0ZXIgbWV0aG9kcy5cbiIKKyAgICAiICAgIHB1cmVfZW51bXM6ICAgICAgR2VuZXJhdGUgcHVyZSBlbnVtcyBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy5cbiIKKyAgICAiICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCisgICAgIiAgICBtb3ZlYWJsZV90eXBlczogIEdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9ycy5cbiIKKyAgICAiICAgIG5vX29zdHJlYW1fb3BlcmF0b3JzOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0IGdlbmVyYXRpb24gb2Ygb3N0cmVhbSBkZWZpbml0aW9ucy5cbiIKKyAgICAiICAgIG5vX3NrZWxldG9uOiAgICAgT21pdHMgZ2VuZXJhdGlvbiBvZiBza2VsZXRvbi5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxZTI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMyNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworc3RydWN0IG1lbWJlcl9tYXBwaW5nX3Njb3BlIHsKKyAgdm9pZCogc2NvcGVfbWVtYmVyOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1hcHBpbmdfdGFibGU7Cit9OworCitjbGFzcyB0X2NzaGFycF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jc2hhcnBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYXN5bmNfID0gZmFsc2U7CisgICAgbnVsbGFibGVfID0gZmFsc2U7CisgICAgaGFzaGNvZGVfID0gZmFsc2U7CisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jIikgPT0gMCkgeworICAgICAgICBhc3luY18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJudWxsYWJsZSIpID09IDApIHsKKyAgICAgICAgbnVsbGFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiaGFzaGNvZGUiKSA9PSAwKSB7CisgICAgICAgIGhhc2hjb2RlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInVuaW9uIikgPT0gMCkgeworICAgICAgICB1bmlvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJpYWwiKSA9PSAwKSB7CisgICAgICAgIHNlcmlhbGl6ZV8gPSB0cnVlOworICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQorICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ3Y2YiKSA9PSAwKSB7CisgICAgICAgIHdjZl8gPSB0cnVlOworICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjc2hhcnA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNzaGFycCI7CisgIH0KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZUlzc2V0ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcGFyYXRlX3NlcnZpY2VfaW50ZXJmYWNlcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NpbHZlcmxpZ2h0X2FzeW5jX21ldGhvZHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworCisgIHZvaWQgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgZW5kX2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvc3RyZWFtJiBvdXQpOworCisgIHN0ZDo6c3RyaW5nIGNzaGFycF90eXBlX3VzaW5ncygpOworICBzdGQ6OnN0cmluZyBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb3VudGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisKKyAgYm9vbCBmaWVsZF9oYXNfZGVmYXVsdCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTDsgfQorCisgIGJvb2wgZmllbGRfaXNfcmVxdWlyZWQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEOyB9CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87CisgIGJvb2wgYXN5bmNfOworICBib29sIG51bGxhYmxlXzsKKyAgYm9vbCB1bmlvbl87CisgIGJvb2wgaGFzaGNvZGVfOworICBib29sIHNlcmlhbGl6ZV87CisgIGJvb2wgd2NmXzsKKyAgc3RkOjpzdHJpbmcgd2NmX25hbWVzcGFjZV87CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gY3NoYXJwX2tleXdvcmRzOworICBzdGQ6OnZlY3RvcjxtZW1iZXJfbWFwcGluZ19zY29wZT4gIG1lbWJlcl9tYXBwaW5nX3Njb3BlczsKKworICB2b2lkIGluaXRfa2V5d29yZHMoKTsKKyAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKTsKKyAgdm9pZCBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpOworICBzdHJpbmcgZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgb2xkbmFtZSk7Cit9OworCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKKworICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKS5jX3N0cigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworICBpbml0X2tleXdvcmRzKCk7CisKKyAgd2hpbGUoICEgbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpIHsKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCkuc2NvcGVfbWVtYmVyKTsKKyAgfQorCisgIHB2ZXJib3NlKCJDIyBvcHRpb25zOlxuIik7CisgIHB2ZXJib3NlKCItIGFzeW5jIC4uLi4uLiAlc1xuIiwgKGFzeW5jXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gdW5pb24gLi4uLi4uICVzXG4iLCAodW5pb25fID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIGhhc2hjb2RlIC4uLiAlc1xuIiwgKGhhc2hjb2RlXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHdjZiAuLi4uLi4uLiAlc1xuIiwgKHdjZl8gPyAiT04iIDogIm9mZiIpKTsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHN0cmluZyB0bXAobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOworCisgIC8vIHVuLWNvbmZsaWN0IGtleXdvcmRzIGJ5IHByZWZpeGluZyB3aXRoICJAIgorICBpZiAoY3NoYXJwX2tleXdvcmRzLmZpbmQodG1wKSAhPSBjc2hhcnBfa2V5d29yZHMuZW5kKCkpIHsKKyAgICByZXR1cm4gIkAiICsgbmFtZTsKKyAgfQorCisgIC8vIG5vIGNoYW5nZXMgbmVjZXNzYXJ5CisgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6aW5pdF9rZXl3b3JkcygpIHsKKyAgY3NoYXJwX2tleXdvcmRzLmNsZWFyKCk7CisKKyAgLy8gQyMga2V5d29yZHMKKyAgY3NoYXJwX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJvb2wiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYnJlYWsiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNhdGNoIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2hlY2tlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjb250aW51ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWNpbWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVsZWdhdGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZW51bSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJleHBsaWNpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJleHRlcm4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmaXhlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZm9yZWFjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImlmIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImltcGxpY2l0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImluIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibG9jayJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsb25nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm5hbWVzcGFjZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJuZXciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3BlcmF0b3IiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm92ZXJyaWRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInBhcmFtcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmVmIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJldHVybiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZWFsZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2hvcnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0YWNrYWxsb2MiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RhdGljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdHJ1Y3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3dpdGNoIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidGhyb3ciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHJ1ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHlwZW9mIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVpbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidW5jaGVja2VkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVuc2FmZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidXNpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidmlydHVhbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZvbGF0aWxlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIndoaWxlIl0gPSAxOworCisgIC8vIEMjIGNvbnRleHR1YWwga2V5d29yZHMKKyAgY3NoYXJwX2tleXdvcmRzWyJhZGQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYWxpYXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXNjZW5kaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzeW5jIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImF3YWl0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlc2NlbmRpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZHluYW1pYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmcm9tIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdldCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnbG9iYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ3JvdXAiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50byJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJqb2luIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxldCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvcmRlcmJ5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInBhcnRpYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmVtb3ZlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNlbGVjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidmFsdWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidmFyIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIndoZXJlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInlpZWxkIl0gPSAxOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6c3RhcnRfY3NoYXJwX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgeworICAgIG91dCA8PCAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8ICJcbiI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZW5kX2NzaGFycF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KSB7CisgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3R5cGVfdXNpbmdzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgU3lzdGVtO1xuIiArICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICArICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIgKyAidXNpbmcgU3lzdGVtLlRleHQ7XG4iICsgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICsgKChhc3luY18pID8gInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iIDogIiIpICsgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICsgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAiI2lmICFTSUxWRVJMSUdIVFxuIiA6ICIiKQorICAgICAgICAgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAidXNpbmcgU3lzdGVtLlhtbC5TZXJpYWxpemF0aW9uO1xuIiA6ICIiKQorICAgICAgICAgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAiI2VuZGlmXG4iIDogIiIpCisgICAgICAgICArICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y3NoYXJwX3RocmlmdF91c2luZ3MoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJ1c2luZyBUaHJpZnQuUHJvdG9jb2w7XG4iICsgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7XG4iOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgdGVudW0pOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJcbiI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOworCisgIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pCisgICAgICAgICAgICAgICAgICAgPDwgIkNvbnN0YW50cyIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7CisgICAgaWYgKHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yKSB7CisgICAgcHJpbnRfY29uc3RfY29uc3RydWN0b3IoZl9jb25zdHMsIGNvbnN0cyk7CisgIH0KKworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygodF9zdHJ1Y3QqKXR5cGUpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygodF9zdHJ1Y3QqKXR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpbmRlbnQob3V0KSA8PCAic3RhdGljICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKS5jX3N0cigpIDw8ICJDb25zdGFudHMoKSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvLyBpdCBzZWVtcyBsaWtlIGFsbCB0aGF0IG1ldGhvZHMgdGhhdCBjYWxsIHRoaXMgYXJlIHVzaW5nIGluX3N0YXRpYyB0byBiZSB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBpdAorLy8gd291bGQgaW1wbHkKK2Jvb2wgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSkgeworICBpbmRlbnQob3V0KTsKKyAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSAhaW5fc3RhdGljOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikKKyAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKQorICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgIH0KKworICByZXR1cm4gbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworCisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisKKyAgaWYgKCFpbl9jbGFzcykgeworICAgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCB0c3RydWN0KTsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworCisgIGluZGVudChvdXQpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiAhaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOyAvLyBkbyBub3QgbWFrZSBleGNlcHRpb24gY2xhc3NlcyBkaXJlY3RseSBXQ0Ygc2VyaWFsaXphYmxlLCB3ZSBwcm92aWRlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZSAiZmF1bHQiIGZvciB0aGF0CisgIH0KKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIgorICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiIDogIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJURXhjZXB0aW9uLCAiOworICB9CisgIG91dCA8PCAiVEJhc2UiOworCisgIG91dCA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpICYmICghbnVsbGFibGVfIHx8IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBib29sIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSBmYWxzZTsKKyAgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKm1faXRlcik7CisgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCB0cnVlKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQpIHsKKyAgICAgIGhhc19yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaGFzX2RlZmF1bHQpIHsKKyAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IHRydWU7CisgICAgICB9CisgICAgICBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgfQorICB9CisKKyAgYm9vbCBnZW5lcmF0ZV9pc3NldCA9IChudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghbnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZmllbGRzKTsKKyAgaWYgKGdlbmVyYXRlX2lzc2V0KSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbWG1sSWdub3JlXSAvLyBYbWxTZXJpYWxpemVyIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMSldICAvLyBYbWxPYmplY3RTZXJpYWxpemVyLCBEYXRhQ29udHJhY3RKc29uU2VyaWFsaXplciwgZXRjLiIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBJc3NldCBfX2lzc2V0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKSB7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFNZW1iZXJdIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKGdlbmVyYXRlX2lzc2V0ICYmIChzZXJpYWxpemVfIHx8IHdjZl8pKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiI3JlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIigpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIFdlIGFsd2F5cyB3YW50IGEgZGVmYXVsdCwgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgZm9yIFJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIHByb3BfbmFtZSgqbV9pdGVyKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLl8iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgLy8gT3B0aW9uYWxzIHdpdGggZGVmYXVsdHMgYXJlIG1hcmtlZCBzZXQKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChoYXNfcmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikgOiB0aGlzKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIiA9ICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAoaGFzaGNvZGVfKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZyBXQ0YgZmF1bHQgdG8gd3JhcCB0aGUgZXhjZXB0aW9uCisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQob3V0LCB0c3RydWN0KTsKKyAgfQorCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKyAgaWYgKCFpbl9jbGFzcykgeworICAgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiRmF1bHQiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgUmVhZCAoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgIGlmIChpc19yZXF1aXJlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgPDwgIlwicmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiIG5vdCBzZXRcIik7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKGlzX3JlcXVpcmVkKQorICAgICAgeworICAgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICAgICAgPDwgIlwicmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiIG5vdCBzZXRcIik7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCisgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICAgIH0KKworICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nQnVpbGRlciBfX3NiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgX19maXJzdCA9IHRydWU7IiA8PCBlbmRsOworICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKworICBib29sIGhhZF9yZXF1aXJlZCA9IGZhbHNlOyAvLyBzZXQgdG8gdHJ1ZSBhZnRlciBmaXJzdCByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBwcm9jZXNzZWQKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOworICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIKKyAgICAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZighX19maXJzdCkgeyBfX3NiLkFwcGVuZChcIiwgXCIpOyB9IiA8PCBlbmRsOworICAgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKQorICAgICAgICAgICAgICAgICAgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiKVwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zYi5Ub1N0cmluZygpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pIHsKKyAgc3RyaW5nIGZfdW5pb25fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHR1bmlvbi0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VuaW9uOworCisgIGZfdW5pb24ub3BlbihmX3VuaW9uX25hbWUuY19zdHIoKSk7CisKKyAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKKworICBmX3VuaW9uLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgeworICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0CisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyBfX191bmRlZmluZWQgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX19fdW5kZWZpbmVkKCkgOiBiYXNlKGZhbHNlKSB7fSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgcHJvdG9jb2wpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgXCJDYW5ub3QgcGVyc2lzdCAiCisgICAgICAgICAgICAgICAgICJhbiB1bmlvbiB0eXBlIHdoaWNoIGlzIG5vdCBzZXQuXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKG91dCwgdHVuaW9uLCAoKmZfaXRlcikpOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHVuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIF9kYXRhOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBfZGF0YTsgfSB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICA8PCAiIGRhdGEpIDogYmFzZSh0cnVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRmaWVsZCwgIl9kYXRhIiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiYmICI7CisgICAgfQorICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKKyAgICAgIG91dCA8PCAiKChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID09IG90aGVyLl9faXNzZXQuIgorICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgJiYgKCghX19pc3NldC4iCisgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKKyAgICB9CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKKyAgICB9CisgICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKKyAgICAgIG91dCA8PCAiKSkpIjsKKyAgICB9CisgIH0KKyAgaWYgKGZpcnN0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hjb2RlID0gMDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ1bmNoZWNrZWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgb3V0IDw8ICIoIjsKKyAgICB9IGVsc2UgaWYgKG51bGxhYmxlXykgeworICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwgPyAwIDogIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKKyAgICB9CisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuY3MiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModHNlcnZpY2UpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgaWYgKGFzeW5jXykgeworICAgIGdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgfQorCisgIGdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklTeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSVN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgIGlmICh3Y2ZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLk9wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgorICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FzeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JQXN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgIGlmICh3Y2ZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLk9wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgorICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbWJpbmVkX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIDogSVN5bmMiOworCisgIGlmIChhc3luY18pIHsKKyAgICBleHRlbmRzX2lmYWNlICs9ICIsIElBc3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIFdlIG5lZWQgdG8gZ2VuZXJhdGUgZXh0cmEgb2xkIHN0eWxlIGFzeW5jIG1ldGhvZHMgZm9yIHNpbHZlcmxpZ2h0LiBTaW5jZQorICAvLyB0aGlzIGlzbid0IHNvbWV0aGluZyB5b3UnZCB3YW50IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSwganVzdCBwdXQgdGhlbSBpbnRvCisgIC8vIHRoZSBtYWluIElmYWNlIGludGVyZmFjZS4KKyAgZ2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaW5jbHVkZSB0aGUgQmVnaW5fLCBFbmRfIG1ldGhvZHMgaWYgd2UncmUgZ2VuZXJhdGluZworICAgIC8vIHdpdGggdGhlIGFzeW5jIGZsYWcuIEknbSBub3Qgc3VyZSB0aGlzIGlzIG5lY2Vzc2FyeSwgc28gc29tZW9uZSB3aXRoIG1vcmUga25vd2xlZGdlCisgICAgLy8gY2FuIG1heWJlIHJlbW92ZSB0aGVzZSBjaGVja3MgaWYgdGhleSBrbm93IGl0J3Mgc2FmZS4KKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiSURpc3Bvc2FibGUsICI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJZmFjZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSA6IHRoaXMocHJvdCwgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpcHJvdCwgb3Byb3QpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gaXByb3RfOyB9IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIG9wcm90XzsgfSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjcmVnaW9uIFwiIElEaXNwb3NhYmxlIFN1cHBvcnQgXCIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBJRGlzcG9zYWJsZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIERpc3Bvc2UoKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIkRpc3Bvc2UodHJ1ZSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoIV9Jc0Rpc3Bvc2VkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChkaXNwb3NpbmcpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGlwcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpaXByb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob3Byb3RfICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChJRGlzcG9zYWJsZSlvcHJvdF8pLkRpc3Bvc2UoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfSXNEaXNwb3NlZCA9IHRydWU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kcmVnaW9uIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworICAgIH0KKyAgICAvLyBCZWdpbl8KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKGNhbGxiYWNrLCBzdGF0ZSI7CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBFbmQKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5FbmRGbHVzaChhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIGFzeW5jCisgICAgYm9vbCBmaXJzdDsKKyAgICBpZiAoYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCAiIikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImF3YWl0IFRhc2suUnVuKCgpID0+IiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gc2lsdmVybGlnaHQgaW52b2tlCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBhc3luY1Jlc3VsdCA9IEJlZ2luXyIgPDwgZnVubmFtZSA8PCAiKG51bGwsIG51bGwiOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgICAgCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgIkVuZF8iIDw8IGZ1bm5hbWUgPDwgIihhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHN5bmNocm9ub3VzIGludm9rZQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAKKyAgICBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgLy8gU2VuZAorICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBvcHJvdF8uVHJhbnNwb3J0LkJlZ2luRmx1c2goY2FsbGJhY2ssIHN0YXRlKTsiIDw8IGVuZGw7CisgICAgICAKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKKyAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGFzeW5jXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRzZXJ2aWNlKTsKKyAgfQorICBlbHNlIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRzZXJ2aWNlKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSVN5bmMgaWZhY2UpIjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSVN5bmMgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKKyAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBuZXcgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXworICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCisgICAgIm1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yLCAiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQXN5bmNQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUQXN5bmNQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSUFzeW5jIGlmYWNlKSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3NBc3luYzsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIFRhc2sgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElBc3luYyBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgIgorICAgICAgIkRpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXworICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCisgICAgIm1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIi5WYWx1ZSI7CisgICAgfQorICB9CisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgVGFzayAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgIDw8ICJfUHJvY2Vzc0FzeW5jKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImF3YWl0IGlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIkFzeW5jKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIi5WYWx1ZSI7CisgICAgfQorICB9CisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKKyAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IgorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7CisgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIFJlYWQoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisgIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInRlbXAiLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChpcHJvdC5SZWFkRmllbGRCZWdpbigpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAorICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiOworCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgcHJlZml4IDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IoIGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudCIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuYW1lOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiV3JpdGVJMzIoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQpIHsKKyAgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKK30KK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuZXJhdGVJc3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzUHVibGljKSB7CisgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOworICB9CisgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpOworICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKKyAgaWYgKChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB8fCAoaXNfcmVxdWlyZWQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGlzX3JlcXVpcmVkKSA8PCAiICIKKyAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCAiIHsgZ2V0OyBzZXQ7IH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKQorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgYm9vbCB1c2VfbnVsbGFibGUgPSBmYWxzZTsKKyAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHVzZV9udWxsYWJsZSA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh1c2VfbnVsbGFibGUpIHsKKyAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOworICBpZiAoc3RyLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKKyAgICBzdHIgPSAiXyIgKyBzdHI7CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBjID0gc3RyLmF0KGkpOworICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQorICAgICAgICAmJiAoJ18nICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpIHsKKyAgaWYoIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBubyBzY29wZSBhY3RpdmUiOworICB9CisKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgIGlmIChhY3RpdmUuc2NvcGVfbWVtYmVyICE9IHNjb3BlKSB7CisgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBjYWxsZWQgZm9yIHdyb25nIHN0cnVjdCI7CisgIH0KKworICBtZW1iZXJfbWFwcGluZ19zY29wZXMucG9wX2JhY2soKTsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgbmFtZSkgeworICBpZiggISBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBhY3RpdmUubWFwcGluZ190YWJsZS5maW5kKG5hbWUpOworICAgIGlmIChhY3RpdmUubWFwcGluZ190YWJsZS5lbmQoKSAhPSBpdGVyKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgfQorCisgIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKSB7CisgIC8vIGJlZ2luIG5ldyBzY29wZQorICBtZW1iZXJfbWFwcGluZ19zY29wZSBkdW1teTsKKyAgZHVtbXkuc2NvcGVfbWVtYmVyID0gMDsKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnB1c2hfYmFjayhkdW1teSk7CisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OgorICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKKyAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOworCisgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBrbm93biBtZXRob2RzIChUSFJJRlQtMjk0MikKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7CisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKKworICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgorICAgICAgaWYgKHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpIHsKKyAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLAorICAgICAgICAgICAgICAgICBzdHJ1Y3RuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgIG5ld25hbWUgKz0gJ18nOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCisgICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKKyAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLAorICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgb2xkbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgIGFjdGl2ZS5tYXBwaW5nX3RhYmxlW29sZG5hbWVdID0gbmV3bmFtZTsKKyAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZykgeworICBzdHJpbmcgbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICBpZiAoc3VwcHJlc3NfbWFwcGluZykgeworICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICB9IGVsc2UgeworICAgIG5hbWUgPSBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7CisgICh2b2lkKWluX2luaXQ7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7CisgICAgaWYgKCFucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gbnMgKyAiLiIgKyBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworICAgIH0KKyAgfQorCisgIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKKyAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJieXRlW10iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJzYnl0ZSIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gInNob3J0IiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSIgKyBwb3N0Zml4OworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICB9Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0ZDo6c3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCkpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGNvbW1hID0gKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwID8gIiwgIiA6ICIiKTsKKyAgcmV0dXJuICJJQXN5bmNSZXN1bHQgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICsgIihBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUiICsgY29tbWEgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKKyAgICAgICAgICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICsgIihJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBzdHJpbmcgdGFzayA9ICJUYXNrIjsKKyAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKQorICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgcmV0dXJuIHRhc2sgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIkFzeW5jKCIKKyAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8vLyA8c3VtbWFyeT5cbiIsICIvLy8gIiwgY29udGVudHMsICIvLy8gPC9zdW1tYXJ5PlxuIik7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSArICJcIi8+IjsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICBzdHIuZXJhc2Uoc3RkOjpyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksCisgICAgICAgICAgICAgICAgICBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgorICAgICAgICBwcyA8PCBzdHI7CisgICAgICB9CisgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT5cbiIgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjc2hhcnAsCisgICAgIkMjIiwKKyAgICAiICAgIGFzeW5jOiAgICAgICAgICAgQWRkcyBBc3luYyBzdXBwb3J0IHVzaW5nIFRhc2suUnVuLlxuIgorICAgICIgICAgd2NmOiAgICAgICAgICAgICBBZGRzIGJpbmRpbmdzIGZvciBXQ0YgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBzZXJpYWw6ICAgICAgICAgIEFkZCBzZXJpYWxpemF0aW9uIHN1cHBvcnQgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBudWxsYWJsZTogICAgICAgIFVzZSBudWxsYWJsZSB0eXBlcyBmb3IgcHJvcGVydGllcy5cbiIKKyAgICAiICAgIGhhc2hjb2RlOiAgICAgICAgR2VuZXJhdGUgYSBoYXNoY29kZSBhbmQgZXF1YWxzIGltcGxlbWVudGF0aW9uIGZvciBjbGFzc2VzLlxuIgorICAgICIgICAgdW5pb246ICAgICAgICAgICBVc2UgbmV3IHVuaW9uIHR5cGluZywgd2hpY2ggaW5jbHVkZXMgYSBzdGF0aWMgcmVhZCBmdW5jdGlvbiBmb3IgdW5pb24gIgorICAgICJ0eXBlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU2Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBEIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIGdlbmVyYXRlXyooKSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgYmFzZSBjbGFzcyB0byBlbWl0IGNvZGUgZm9yIHRoZQorICogZ2l2ZW4gZW50aXR5LCBwcmludF8qKCkgZnVuY3Rpb25zIHdyaXRlIGEgcGllY2Ugb2YgY29kZSB0byB0aGUgcGFzc2VkCisgKiBzdHJlYW0sIGFuZCByZW5kZXJfKigpIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mCisgKiB0aGUgcGFzc2VkIGVudGl0eS4KKyAqLworY2xhc3MgdF9kX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kIjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHsKKyAgICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgICAgc3RyaW5nIGRpciA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkIik7CisgICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgICBpZiAoIWRpci5lbXB0eSgpKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgfQorCisgICAgcGFja2FnZV9kaXJfID0gc3ViZGlyICsgIi8iOworCisgICAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICAgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5kIjsKKyAgICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICAgIC8vIFByaW50IGhlYWRlcgorICAgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICA8PCAiX3R5cGVzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfdHlwZXNfKTsKKworICAgIC8vIEluY2x1ZGUgdHlwZSBtb2R1bGVzIGZyb20gb3RoZXIgaW1wb3J0ZWQgcHJvZ3JhbXMuCisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICBmX3R5cGVzXyA8PCAicHVibGljIGltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgeworICAgIC8vIENsb3NlIG91dHB1dCBmaWxlCisgICAgZl90eXBlc18uY2xvc2UoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICAgIGlmICghY29uc3RzLmVtcHR5KCkpIHsKKyAgICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmQiOworICAgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAgICAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX2NvbnN0cyk7CisKKyAgICAgIGZfY29uc3RzIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgdGhpcy0+ZW1pdF9kb2MoKmNfaXRlciwgZl9jb25zdHMpOworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9jb25zdHMgPDwgZW5kbCA8PCAic3RhdGljIHRoaXMoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX2NvbnN0cyA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUodHlwZSkpIHsKKyAgICAgICAgICBmX2NvbnN0cyA8PCAiY2FzdChpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpKSAiOworICAgICAgICB9CisgICAgICAgIGZfY29uc3RzIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgICB0aGlzLT5lbWl0X2RvYyh0dHlwZWRlZiwgZl90eXBlc18pOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJhbGlhcyAiIDw8IHJlbmRlcl90eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIgorICAgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworCisgICAgdGhpcy0+ZW1pdF9kb2ModGVudW0sIGZfdHlwZXNfKTsKKyAgICBzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgdGhpcy0+ZW1pdF9kb2MoKmNfaXRlciwgZl90eXBlc18pOworICAgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8ICIsIjsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKKyAgICBzdHJpbmcgZl9zZXJ2aWNlbmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIi5kIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZTsKKyAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VuYW1lLmNfc3RyKCkpOworICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBzdmNfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfc2VydmljZSk7CisKKyAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsOworCisgICAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgIGZfc2VydmljZSA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKQorICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2UgPDwgZW5kbDsKKworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgIGV4dGVuZHMgPSAiIDogIiArIHJlbmRlcl90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIH0KKworICAgIHRoaXMtPmVtaXRfZG9jKHRzZXJ2aWNlLCBmX3NlcnZpY2UpOworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAiaW50ZXJmYWNlICIgPDwgc3ZjX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZXhjZXB0aW9uIHR5cGVzIHNlcnZpY2UgbWV0aG9kcyBjYW4gdGhyb3cgc28gd2UgY2FuCisgICAgLy8gZW1pdCB0aGUgbmVjZXNzYXJ5IGFsaWFzZXMgbGF0ZXIuCisgICAgc2V0PHRfdHlwZSo+IGV4Y2VwdGlvbl90eXBlczsKKworICAgIC8vIFByaW50IHRoZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKKyAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgdGhpcy0+ZW1pdF9kb2MoKmZuX2l0ZXIsIGZfc2VydmljZSk7CisgICAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCk7CisgICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUoZl9zZXJ2aWNlLCAqZm5faXRlcik7CisgICAgICBmX3NlcnZpY2UgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbnMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBleF9pdGVyOworICAgICAgZm9yIChleF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyBleF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsrZXhfaXRlcikgeworICAgICAgICBleGNlcHRpb25fdHlwZXMuaW5zZXJ0KCgqZXhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEFsaWFzIHRoZSBleGNlcHRpb24gdHlwZXMgaW50byB0aGUgY3VycmVudCBzY29wZS4KKyAgICBpZiAoIWV4Y2VwdGlvbl90eXBlcy5lbXB0eSgpKQorICAgICAgZl9zZXJ2aWNlIDw8IGVuZGw7CisgICAgc2V0PHRfdHlwZSo+Ojpjb25zdF9pdGVyYXRvciBldF9pdGVyOworICAgIGZvciAoZXRfaXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBldF9pdGVyICE9IGV4Y2VwdGlvbl90eXBlcy5lbmQoKTsgKytldF9pdGVyKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfcGFja2FnZSgqKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZXRfaXRlciktPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgPDwgIl90eXBlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIiA8PCAoKmV0X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKmV0X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgbWV0aG9kIG1ldGFkYXRhLgorICAgIG9zdHJpbmdzdHJlYW0gbWV0YTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgaWYgKCgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKQorICAgICAgICAgICYmICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpICYmICEoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZXRhIDw8ICIsIjsKKyAgICAgIH0KKworICAgICAgbWV0YSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUTWV0aG9kTWV0YShgIiA8PCAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChtZXRhKSA8PCAiWyI7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgcGFyYW1zID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgIGZvciAocF9pdGVyID0gcGFyYW1zLmJlZ2luKCk7IHBfaXRlciAhPSBwYXJhbXMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWV0YSA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgbWV0YSA8PCAiVFBhcmFtTWV0YShgIiA8PCAoKnBfaXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCpwX2l0ZXIpLT5nZXRfa2V5KCk7CisKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKnBfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIG1ldGEgPDwgIiwgcXsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKnBfaXRlciktPmdldF90eXBlKCksIGN2KSA8PCAifSI7CisgICAgICAgIH0KKyAgICAgICAgbWV0YSA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIG1ldGEgPDwgIl0iOworCisgICAgICBpZiAoISgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpIHx8ICgqZm5faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG1ldGEgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlsiOworCisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBleF9pdGVyOworICAgICAgICBmb3IgKGV4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IGV4X2l0ZXIgIT0gZXhjZXB0aW9ucy5lbmQoKTsgKytleF9pdGVyKSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRhIDw8ICIsICI7CisgICAgICAgICAgfQorCisgICAgICAgICAgbWV0YSA8PCAiVEV4Y2VwdGlvbk1ldGEoYCIgPDwgKCpleF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICAgICAgICAgIDw8ICIsIGAiIDw8ICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgImApIjsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEgPDwgIl0iOworICAgICAgfQorCisgICAgICBpZiAoKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgbWV0YSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVE1ldGhvZFR5cGUuT05FV0FZIjsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG1ldGEgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKSI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzdHJpbmcgbWV0YV9zdHIobWV0YS5zdHIoKSk7CisgICAgaWYgKCFtZXRhX3N0ci5lbXB0eSgpKSB7CisgICAgICBmX3NlcnZpY2UgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZW51bSBtZXRob2RNZXRhID0gWyIgPDwgbWV0YV9zdHIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2UpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gU2VydmVyIHNrZWxldG9uIGdlbmVyYXRpb24uCisgICAgc3RyaW5nIGZfc2tlbGV0b25uYW1lID0gcGFja2FnZV9kaXJfICsgc3ZjX25hbWUgKyAiX3NlcnZlci5za2VsZXRvbi5kIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2tlbGV0b247CisgICAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25uYW1lLmNfc3RyKCkpOworICAgIHByaW50X3NlcnZlcl9za2VsZXRvbihmX3NrZWxldG9uLCB0c2VydmljZSk7CisgICAgZl9za2VsZXRvbi5jbG9zZSgpOworICB9CisKKyAgdm9pZCBlbWl0X2RvYyh0X2RvYyAqZG9jLCBzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGlmICghZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgc3RkOjplbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIE5vIGVuZGwgLS0gY29tbWVudHMgcmVsaWFibHkgaGF2ZSBhIG5ld2xpbmUgYXQgdGhlIGVuZC4KKyAgICAvLyBUaGlzIGlzIHRydWUgZXZlbiBmb3Igc3R1ZmYgbGlrZToKKyAgICAvLyAgICAgLyoqIG1ldGhvZCBpbmZvcyAqLyB2b2lkIGZvbygvKiogaHVoPyovIDE6IGk2NCBzdHVmZikKKyAgICBpbmRlbnQob3V0KSA8PCBkb2MtPmdldF9kb2MoKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIqLyIgPDwgc3RkOjplbmRsOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBXcml0ZXMgYSBzZXJ2ZXIgc2tlbGV0b24gZm9yIHRoZSBwYXNzZWQgc2VydmljZSB0byBvdXQuCisgICAqLworICB2b2lkIHByaW50X3NlcnZlcl9za2VsZXRvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgICBzdHJpbmcgc3ZjX25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAgIG91dCA8PCAiLyoiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIFRoaXMgYXV0by1nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIElmIHlvdSIgPDwgZW5kbAorICAgICAgICA8PCAiICogaW50ZW5kIHRvIGN1c3RvbWl6ZSBpdCwgeW91IHNob3VsZCBlZGl0IGEgY29weSB3aXRoIGFub3RoZXIgZmlsZSBuYW1lIHRvICIgPDwgZW5kbAorICAgICAgICA8PCAiICogYXZvaWQgb3ZlcndyaXRpbmcgaXQgd2hlbiBydW5uaW5nIHRoZSBnZW5lcmF0b3IgYWdhaW4uIiA8PCBlbmRsIDw8ICIgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIl9zZXJ2ZXI7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwgPDwgImltcG9ydCBzdGQuc3RkaW87IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOyIgPDwgZW5kbAorICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7IiA8PCBlbmRsCisgICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7IgorICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiaW1wb3J0ICIKKyAgICAgICAgPDwgcmVuZGVyX3BhY2thZ2UoKnRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzdmNfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCAiaW1wb3J0ICIKKyAgICAgICAgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8ICJjbGFzcyAiIDw8IHN2Y19uYW1lIDw8ICJIYW5kbGVyIDogIiA8PCBzdmNfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlLiIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKG91dCwgKmZfaXRlcik7CisgICAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIndyaXRlbG4oXCIiCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgY2FsbGVkXCIpOyIgPDwgZW5kbDsKKworCSAgdF90eXBlKiBydCA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKwkgIGlmICghcnQtPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHR5cGVvZihyZXR1cm4pLmluaXQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIG1haW4oKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yISIgPDwgc3ZjX25hbWUgPDwgIihuZXcgIiA8PCBzdmNfbmFtZQorICAgICAgICA8PCAiSGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhdXRvIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3Qgb3IgYW4gZXhjZXB0aW9uIHR5cGUgdG8gb3V0LgorICAgKi8KKyAgdm9pZCBwcmludF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworCisgICAgLy8gRGVjbGFyZSBhbGwgZmllbGRzLgorICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpCisgICAgICBpbmRlbnQob3V0KSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtaXhpbiBUU3RydWN0SGVscGVycyEoIjsKKworICAgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGZpZWxkcywgY29uc3RydWN0IHRoZSBURmllbGRNZXRhIGFycmF5IHRvIHBhc3MgdG8KKyAgICAgIC8vIFRTdHJ1Y3RIZWxwZXJzLiBXZSBjYW4ndCBqdXN0IHBhc3MgYW4gZW1wdHkgYXJyYXkgaWYgbm90IGJlY2F1c2UgW10KKyAgICAgIC8vIGRvZXNuJ3QgcGFzcyB0aGUgVEZpZWxkTWV0YVtdIGNvbnN0cmFpbnQuCisgICAgICBvdXQgPDwgIlsiOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZE1ldGEoYCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gKCptX2l0ZXIpLT5nZXRfcmVxKCk7CisgICAgICAgIG91dCA8PCAiLCAiIDw8IHJlbmRlcl9yZXEocmVxKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBvdXQgPDwgIiwgcXsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksIGN2KSA8PCAifSI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIjsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJdIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLyoqCisgICAqIFByaW50cyB0aGUgRCBmdW5jdGlvbiBzaWduYXR1cmUgKGluY2x1ZGluZyByZXR1cm4gdHlwZSkgZm9yIHRoZSBnaXZlbgorICAgKiBtZXRob2QuCisgICAqLworICB2b2lkIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZuKSB7CisgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoZm4tPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgIiA8PCBmbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIHRydWUpIDw8ICIgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgb3V0IDw8ICIpIjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlLiBUaGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYQorICAgKiBzaW5nbGUgZXhwcmVzc2lvbjsgZm9yIGNvbXBsZXggdHlwZXMsIGltbWVkaWF0ZWx5IGNhbGxlZCBkZWxlZ2F0ZQorICAgKiBsaXRlcmFscyBhcmUgdXNlZCB0byBhY2hpZXZlIHRoaXMuCisgICAqLworICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgICAvLyBSZXNvbHZlIGFueSB0eXBlZGVmcy4KKyAgICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICAgIG9zdHJpbmdzdHJlYW0gb3V0OworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgImNhc3QoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogTm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgImNhc3QoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIiB2OyIgPDwgZW5kbDsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ2ID0gIiA8PCAodHlwZS0+aXNfeGNlcHRpb24oKSA/ICJuZXcgIiA6ICIiKSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpCisgICAgICAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgdGhyb3cgIlR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidi5zZXQhYCIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICJgKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInZbIjsKKyAgICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgICAgb3V0IDw8ICJjYXN0KGltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUoa3R5cGUpIDw8ICIpKSI7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2IH49ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2IH49ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiByZW5kZXJfY29uc3RfdmFsdWU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB2OyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCkiOworICAgIH0KKworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRCBwYWNrYWdlIHRvIHdoaWNoIG1vZHVsZXMgZm9yIHByb2dyYW0gYXJlIHdyaXR0ZW4gKHdpdGggYQorICAgKiB0cmFpbGluZyBkb3QsIGlmIG5vdCBlbXB0eSkuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3BhY2thZ2UoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLmdldF9uYW1lc3BhY2UoImQiKTsKKyAgICBpZiAocGFja2FnZS5zaXplKCkgPT0gMCkKKyAgICAgIHJldHVybiAiIjsKKyAgICByZXR1cm4gcGFja2FnZSArICIuIjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBEIHJlcGVzZW50YXRpb24gb2YgdHR5cGUuCisgICAqCisgICAqIElmIGlzQXJnIGlzIHRydWUsIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHdpbGwgYmUgcmV0dXJuZWQgZm9yCisgICAqIHN0cnVjdHMuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlLCBib29sIGlzQXJnID0gZmFsc2UpIGNvbnN0IHsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICByZXR1cm4gInZvaWQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJib29sIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgcmV0dXJuICJzaG9ydCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJpbnQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAibG9uZyI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJkb3VibGUiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBObyBEIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgeworICAgICAgICByZXR1cm4gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICAgIHRfdHlwZSoga3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKworICAgICAgICBzdHJpbmcgbmFtZSA9IHJlbmRlcl90eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIlsiOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgIG5hbWUgKz0gImltbXV0YWJsZSgiOworICAgICAgICB9CisgICAgICAgIG5hbWUgKz0gcmVuZGVyX3R5cGVfbmFtZShrdHlwZSk7CisgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7CisgICAgICAgICAgbmFtZSArPSAiKSI7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSArPSAiXSI7CisgICAgICAgIHJldHVybiBuYW1lOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgICByZXR1cm4gIkhhc2hTZXQhKCIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgICAgICByZXR1cm4gcmVuZGVyX3R5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICJbXSI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSAmJiBpc0FyZykgeworICAgICAgcmV0dXJuICJyZWYgY29uc3QoIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEQgVFJlcSBlbnVtIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIHJlcS4KKyAgICovCisgIHN0cmluZyByZW5kZXJfcmVxKHRfZmllbGQ6OmVfcmVxIHJlcSkgY29uc3QgeworICAgIHN3aXRjaCAocmVxKSB7CisgICAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgorICAgICAgcmV0dXJuICJUUmVxLk9QVF9JTl9SRVFfT1VUIjsKKyAgICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgICByZXR1cm4gIlRSZXEuT1BUSU9OQUwiOworICAgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICAgIHJldHVybiAiVFJlcS5SRVFVSVJFRCI7CisgICAgZGVmYXVsdDogeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCAiQ29tcGlsZXIgZXJyb3I6IEludmFsaWQgcmVxdWlyZW1lbnQgbGV2ZWwgIiA8PCByZXE7CisgICAgICB0aHJvdyBzcy5zdHIoKTsKKyAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIGltcG9ydHMgKHdoaWNoIGFyZSB3cml0dGVuIHRvIGV2ZXJ5IGdlbmVyYXRlZAorICAgKiBtb2R1bGUpIHRvIGYuCisgICAqLworICB2b2lkIHByaW50X2RlZmF1bHRfaW1wb3J0cyhvc3RyZWFtJiBvdXQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW1wb3J0IHRocmlmdC5iYXNlOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgImltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlciB0eXBlIGlzIMK7aW50cmluc2ljYWxseSBpbW11dGFibGXCqywgaW4gdGhlIHNlbnNlIHRoYXQKKyAgICogYSB2YWx1ZSBvZiB0aGF0IHR5cGUgaXMgaW1wbGljaXRseSBjYXN0YWJsZSB0byBpbW11dGFibGUodHlwZSksIGFuZCBpdCBpcworICAgKiBhbGxvd2VkIGZvciBBQSBrZXlzIHdpdGhvdXQgYW4gaW1tdXRhYmxlKCkgcXVhbGlmaWVyLgorICAgKi8KKyAgYm9vbCBpc19pbW11dGFibGVfdHlwZSh0X3R5cGUqIHR5cGUpIGNvbnN0IHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCk7CisgIH0KKworICAvKgorICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5CisgICAqIGZ1bmN0aW9uLgorICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisKKyAgc3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZCwgIkQiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGMzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjUxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwyID0gIlxuXG4iOworCisvKioKKyAqIFVzZSB0aGUgY3VycmVudCBUaHJpZnQgdmVyc2lvbiBmb3Igc3RhdGljIGxpYnJhcmllcy4gIFdoZW4gcmVsZWFzaW5nLCB1cGRhdGUKKyAqIHRoZSB2ZXJzaW9uIGluIHRoZXNlIGZpbGVzLgorICogLSBsaWIvZGFydC9wdWJzcGVjLnlhbWwKKyAqIC0gdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbAorICogLSB0dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCisgKiBTZWUgaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2NvbW1pdHRlcnMvSG93VG9WZXJzaW9uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJpbmcgZGFydF90aHJpZnRfdmVyc2lvbiA9IFRIUklGVF9WRVJTSU9OOworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7CisKKy8qKgorICogRGFydCBjb2RlIGdlbmVyYXRvcgorICoKKyAqLworY2xhc3MgdF9kYXJ0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RhcnRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxpYnJhcnlfbmFtZV8gPSAiIjsKKyAgICBsaWJyYXJ5X3ByZWZpeF8gPSAiIjsKKyAgICBwYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBwdWJzcGVjX2xpYl8gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsaWJyYXJ5X25hbWUiKSA9PSAwKSB7CisgICAgICAgIGxpYnJhcnlfbmFtZV8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGlicmFyeV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIGxpYnJhcnlfcHJlZml4XyA9IChpdGVyLT5zZWNvbmQpICsgIi4iOworICAgICAgICBwYWNrYWdlX3ByZWZpeF8gPSByZXBsYWNlX2FsbChsaWJyYXJ5X3ByZWZpeF8sICIuIiwgIi8iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHVic3BlY19saWIiKSA9PSAwKSB7CisgICAgICAgIHB1YnNwZWNfbGliXyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGRhcnQ6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWRhcnQiOworICB9CisKKyAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgcHJlZml4PSIgIikgeworICAgIG91dCA8PCBwcmVmaXggPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHBvc3RmaXg9ZW5kbCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHBvc3RmaXg7CisgIH0KKworICBzdHJpbmcgcmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbCkgeworICAgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgICAgc2l6ZV90IHNsZW4gPSBzZWFyY2gubGVuZ3RoKCk7CisgICAgc2l6ZV90IHJsZW4gPSByZXBsLmxlbmd0aCgpOworICAgIHNpemVfdCBpbmNyID0gKHJsZW4gPiAwKSA/IHJsZW4gOiAxOworCisgICAgaWYgKHNsZW4gPiAwKSB7CisgICAgICBzaXplX3QgZm91bmQgPSBzdHIuZmluZChzZWFyY2gpOworICAgICAgd2hpbGUgKChmb3VuZCAhPSBzdHJpbmc6Om5wb3MpICYmIChmb3VuZCA8IHN0ci5sZW5ndGgoKSkpIHsKKyAgICAgICAgc3RyLnJlcGxhY2UoZm91bmQsIHNsZW4sIHJlcGwpOworICAgICAgICBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCwgZm91bmQgKyBpbmNyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworICB9CisKKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lLCBzdHJpbmcgY2xhc3NfbmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHBvcnRfZmlsZV9uYW1lID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGdldF9kYXJ0X3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgaW5pdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9tZW1iZXJfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2FyZ3NfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGZpbmRfbGlicmFyeV9uYW1lKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHN0ZDo6c3RyaW5nIGRhcnRfbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgc2VydmljZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGRhcnRfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3R0eXBlX2NsYXNzX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0pIHsKKyAgICB2ZWN0b3I8c3RkOjpzdHJpbmc+IGVsZW1zOworICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKKyAgICBzdHJpbmcgaXRlbTsKKyAgICB3aGlsZSAoZ2V0bGluZShzcywgaXRlbSwgZGVsaW0pKSB7CisgICAgICBlbGVtcy5wdXNoX2JhY2soaXRlbSk7CisgICAgfQorICAgIHJldHVybiBlbGVtczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X25hbWVfOworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgcHVic3BlY19saWJfOworCisgIHN0ZDo6c3RyaW5nIGJhc2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgc3JjX2Rpcl87CisgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfZXhwb3J0c187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIGlmIChsaWJyYXJ5X25hbWVfLmVtcHR5KCkpIHsKKyAgICBsaWJyYXJ5X25hbWVfID0gZmluZF9saWJyYXJ5X25hbWUocHJvZ3JhbV8pOworICB9CisKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBsaWJyYXJ5X25hbWVfOworICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIGJhc2VfZGlyXyA9IHN1YmRpcjsKKworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBzdWJkaXIgKz0gIi9saWIiOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBzdWJkaXIgKz0gIi9zcmMiOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBzcmNfZGlyXyA9IHN1YmRpcjsKKyAgfSBlbHNlIHsKKyAgICBzcmNfZGlyXyA9IGJhc2VfZGlyXzsKKyAgfQorfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZmluZF9saWJyYXJ5X25hbWUodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZGFydCIpOworICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgbmFtZSA9IHByb2dyYW0tPmdldF9uYW1lKCk7CisgIH0KKyAgbmFtZSA9IHJlcGxhY2VfYWxsKG5hbWUsICIuIiwgIl8iKTsKKyAgbmFtZSA9IHJlcGxhY2VfYWxsKG5hbWUsICItIiwgIl8iKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogVGhlIERhcnQgbGlicmFyeQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBsaWJyYXJ5LCBlLmcuICJsaWJyYXJ5IG15c2VydmljZTsiCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkYXJ0X2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSkgeworICBzdHJpbmcgb3V0ID0gImxpYnJhcnkgIiArIGxpYnJhcnlfcHJlZml4XyArIGxpYnJhcnlfbmFtZV87CisgIGlmICghZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIG91dCArPSAiLnNyYy4iICsgZmlsZV9uYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgKz0gIi4iICsgZmlsZV9uYW1lOworICAgIH0KKyAgfQorICByZXR1cm4gb3V0ICsgIjtcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgZm9yIHNlcnZpY2VzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIHNlcnZpY2VzCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpzZXJ2aWNlX2ltcG9ydHMoKSB7CisgIHJldHVybiAiaW1wb3J0ICdkYXJ0OmFzeW5jJzsiICsgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgZGFydCBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmRhcnRfdGhyaWZ0X2ltcG9ydHMoKSB7CisgIHN0cmluZyBpbXBvcnRzID0gImltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsiICsgZW5kbCArCisgICAgICAgICAgICAgICAgICAgImltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOyIgKyBlbmRsOworCisgIC8vIGFkZCBpbXBvcnQgZm9yIHRoaXMgbGlicmFyeQorICBpZiAocGFja2FnZV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIGxpYnJhcnlfbmFtZV8gKyAiLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0JzsiICsgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIHBhY2thZ2VfcHJlZml4XyArIGxpYnJhcnlfbmFtZV8gKyAiLmRhcnQnOyIgKyBlbmRsOworICB9CisKKyAgLy8gYWRkIGltcG9ydHMgZm9yIGluY2x1ZGVkIHRocmlmdCBmaWxlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgc3RyaW5nIGluY2x1ZGVfbmFtZSA9IGZpbmRfbGlicmFyeV9uYW1lKGluY2x1ZGVzW2ldKTsKKyAgICBzdHJpbmcgbmFtZWRfaW1wb3J0ID0gInRfIiArIGluY2x1ZGVfbmFtZTsKKyAgICBpZiAocGFja2FnZV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgaW5jbHVkZV9uYW1lICsgIi8iICsgaW5jbHVkZV9uYW1lICsgIi5kYXJ0JyBhcyAiICsgbmFtZWRfaW1wb3J0ICsgIjsiICsgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBpbmNsdWRlX25hbWUgKyAiLmRhcnQnIGFzICIgKyBuYW1lZF9pbXBvcnQgKyAiOyIgKyBlbmRsOworICAgIH0KKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKTsKKworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKTsKKyAgfQorfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfbGlicmFyeSgpIHsKKyAgc3RyaW5nIGZfbGlicmFyeV9uYW1lOworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBmX2xpYnJhcnlfbmFtZSA9IGJhc2VfZGlyXyArICIvbGliLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0IjsKKyAgfSBlbHNlIHsKKyAgICBmX2xpYnJhcnlfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0IjsKKyAgfQorCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9saWJyYXJ5OworICBmX2xpYnJhcnkub3BlbihmX2xpYnJhcnlfbmFtZS5jX3N0cigpKTsKKworICBmX2xpYnJhcnkgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9saWJyYXJ5IDw8ICJsaWJyYXJ5ICIgPDwgbGlicmFyeV9wcmVmaXhfIDw8IGxpYnJhcnlfbmFtZV8gPDwgIjsiIDw8IGVuZGwyOworICBmX2xpYnJhcnkgPDwgbGlicmFyeV9leHBvcnRzXzsKKworICBmX2xpYnJhcnkuY2xvc2UoKTsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpleHBvcnRfY2xhc3NfdG9fbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lLCBzdHJpbmcgY2xhc3NfbmFtZSkgeworICBzdHJpbmcgc3ViZGlyOworICBpZiAobGlicmFyeV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBzdWJkaXIgPSAic3JjIjsKKyAgfSBlbHNlIHsKKyAgICBzdWJkaXIgPSBsaWJyYXJ5X25hbWVfOworICB9CisgIGxpYnJhcnlfZXhwb3J0c18gKz0gImV4cG9ydCAnIiArIHN1YmRpciArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCcgc2hvdyAiICsgY2xhc3NfbmFtZSArICI7IiArIGVuZGw7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9wdWJzcGVjKCkgeworICBzdHJpbmcgZl9wdWJzcGVjX25hbWUgPSBiYXNlX2Rpcl8gKyAiL3B1YnNwZWMueWFtbCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9wdWJzcGVjOworICBmX3B1YnNwZWMub3BlbihmX3B1YnNwZWNfbmFtZS5jX3N0cigpKTsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAibmFtZTogIiA8PCBsaWJyYXJ5X25hbWVfIDw8IGVuZGw7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJ2ZXJzaW9uOiAwLjAuMSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImRlc2NyaXB0aW9uOiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciIgPDwgZW5kbDsKKyAgZl9wdWJzcGVjIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImVudmlyb25tZW50OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJzZGs6IF4xLjEyLjAiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJkZXBlbmRlbmNpZXM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAocHVic3BlY19saWJfLmVtcHR5KCkpIHsKKyAgICAvLyBkZWZhdWx0IHRvIHJlbGF0aXZlIHBhdGggd2l0aGluIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCB3b3JrcyBmb3IgdGVzdHMKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAidGhyaWZ0OiAgIyBeIiA8PCBkYXJ0X3RocmlmdF92ZXJzaW9uIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInBhdGg6IC4uLy4uLy4uLy4uL2xpYi9kYXJ0IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lcyA9IHNwbGl0KHB1YnNwZWNfbGliXywgJ3wnKTsKKyAgICBmb3IgKHNpemVfdCBsaW5lX2luZGV4ID0gMDsgbGluZV9pbmRleCA8IGxpbmVzLnNpemUoKTsgbGluZV9pbmRleCsrKSB7CisgICAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBsaW5lc1tsaW5lX2luZGV4XSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGFkZCBpbmNsdWRlZCB0aHJpZnQgZmlsZXMgYXMgZGVwZW5kZW5jaWVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBzdHJpbmcgaW5jbHVkZV9uYW1lID0gZmluZF9saWJyYXJ5X25hbWUoaW5jbHVkZXNbaV0pOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8IGluY2x1ZGVfbmFtZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAicGF0aDogLi4vIiA8PCBpbmNsdWRlX25hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9wdWJzcGVjIDw8IGVuZGw7CisKKyAgZl9wdWJzcGVjLmNsb3NlKCk7Cit9CisKKy8qKgorICogTm90IHVzZWQKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBzdHJpbmcgZl9lbnVtX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICAvLyBDb21tZW50IGFuZCBhZGQgbGlicmFyeQorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShmaWxlX25hbWUsIGNsYXNzX25hbWUpOworICBmX2VudW0gPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZTsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGNvbnN0IGludCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGZpbmFsIFNldDxpbnQ+IFZBTElEX1ZBTFVFUyA9IG5ldyBTZXQuZnJvbShbIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBwb3B1bGF0ZSBzZXQKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIik7CisgICAgZl9lbnVtIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9lbnVtKSA8PCAiXSk7IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgZmluYWwgTWFwPGludCwgU3RyaW5nPiBWQUxVRVNfVE9fTkFNRVMgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpOworICAgIGZfZW51bSAgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn07IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IGdldF9jb25zdGFudHNfY2xhc3NfbmFtZShwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUoY2xhc3NfbmFtZSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKyAgZl9jb25zdHMgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lOworICBzY29wZV91cChmX2NvbnN0cyk7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgZl9jb25zdHMgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9jb25zdHMpOworCisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInN0YXRpYyBmaW5hbCAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lOworICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIi4uIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICI6ICIgPDwgdmFsIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCwgIjsiICsgZW5kbCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiOworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5mcm9tKFsiIDw8IGVuZGw7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGluZGVudF91cCgpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgdmFsIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXSk7IiA8PCBlbmRsOworICAgIH0KKworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2RhcnRfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIERhcnQgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHNyY19kaXJfICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisKKyAgc3RyaW5nIGltcG9ydHM7CisKKyAgZl9zdHJ1Y3QgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSwgZmlsZV9uYW1lKTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIERhcnQgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHBvcnRfZmlsZV9uYW1lKSB7CisgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoIWV4cG9ydF9maWxlX25hbWUuZW1wdHkoKSkgeworICAgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGV4cG9ydF9maWxlX25hbWUsIGNsYXNzX25hbWUpOworICB9CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgIiAiOworCisgIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiwgRXhjZXB0aW9uICI7CisgIH0KKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGZpbmFsIFRTdHJ1Y3QgX1NUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgICAgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtZGFydCwgcHJpdmF0ZSBmb3IgLWRhcnRiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgZmluYWwgVEZpZWxkIF8iIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiIF8iCisgICAgICAgICAgICAgICAgPDwgZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgaW5pdF92YWx1ZSgqbV9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgY29uc3QgaW50ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhpcy4iICsgZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kYXJ0X2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJyZWFkKFRQcm90b2NvbCBpcHJvdCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisKKyAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDI7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBpbmRlbnQob3V0KSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgZmllbGRfbmFtZQorICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8vIGdlbmVyYXRlcyBkYXJ0IG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIjsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgaW5kZW50KG91dCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIiA8PCBmaWVsZF9uYW1lIDw8ICIpKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgIgorICAgICAgICAgICAgICAgICAgPDwgIiQiIDw8IGZpZWxkX25hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ3cml0ZShUUHJvdG9jb2wgb3Byb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKF8iIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJ3cml0ZShUUHJvdG9jb2wgb3Byb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKF9TVFJVQ1RfREVTQyk7IiA8PCBlbmRsMjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oXyIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCwgIiIpOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgImdldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJzZXRGaWVsZFZhbHVlKGludCBmaWVsZElELCBPYmplY3QgdmFsdWUpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJ1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7ICAvLyBzd2l0Y2gKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsgIC8vIG1ldGhvZAorfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc1NldChpbnQgZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7ICAvLyBzd2l0Y2gKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsgIC8vIG1ldGhvZAorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBEYXJ0IEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vICIgPDwgZmllbGRfbmFtZSA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGwyOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2RhcnRfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKyAgICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIjsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgb3V0IDw8ICIgPT4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiID0+IHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGwyOworICAgIH0KKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJTdHJpbmcgdG9TdHJpbmcoKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICI6XCIpOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0LCAiIGVsc2UiKTsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIkJJTkFSWVwiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nICIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgPSAiCisgICAgICAgICAgICAgICAgICA8PCBnZXRfdHR5cGVfY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSAhPSBudWxsKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZSgiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiIChcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCIpXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiKVwiKTsiIDw8IGVuZGwyOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmV0LnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBkYXJ0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9kYXJ0X3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2RhcnRfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfZGFydF9nZW5lcmF0b3I6OmdldF9kYXJ0X3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHNyY19kaXJfICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBzZXJ2aWNlX2ltcG9ydHMoKSA8PCBkYXJ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGdldF90dHlwZV9jbGFzc19uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorCisgIGdlbmVyYXRlX2RhcnRfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHNlcnZpY2VfbmFtZV87CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyksIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFic3RyYWN0IGNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCBleHRlbmRzX2lmYWNlOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGFydF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiQ2xpZW50IjsKKyAgfQorCisgIHN0cmluZyBjbGFzc19uYW1lID0gc2VydmljZV9uYW1lXyArICJDbGllbnQiOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV87CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGNsYXNzX25hbWUgPDwgIihUUHJvdG9jb2wgaXByb3QsIFtUUHJvdG9jb2wgb3Byb3QgPSBudWxsXSkiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiOiBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2lwcm90ID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX29wcm90ID0gKG9wcm90ID09IG51bGwpID8gaXByb3QgOiBvcHJvdDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sIF9pcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sIGdldCBpcHJvdCA9PiBfaXByb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBfb3Byb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBnZXQgb3Byb3QgPT4gX29wcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbnQgX3NlcWlkID0gMDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW50IGdldCBzZXFpZCA9PiBfc2VxaWQ7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImludCBuZXh0U2VxaWQoKSA9PiArK19zZXFpZDsiIDw8IGVuZGwyOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiBhc3luYyI7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2FyZ3NfY2xhc3NfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgbmV4dFNlcWlkKCkpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RyaW5nIGFyZ19maWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy4iIDw8IGFyZ19maWVsZF9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IGFyZ19maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsMjsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXdhaXQgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsMjsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikiOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRBcHBsaWNhdGlvbkVycm9yIGVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgZXJyb3I7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisKKyAgICAgIHN0cmluZyByZXN1bHRfY2xhc3MgPSBnZXRfcmVzdWx0X2NsYXNzX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRfY2xhc3MgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRfY2xhc3MgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIjsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIHN0cmluZyByZXN1bHRfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiICE9IG51bGwpIjsKKyAgICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyB0eXBlZGVmCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHlwZWRlZiB2b2lkIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsiIDw8IGVuZGwyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF90dHlwZV9jbGFzc19uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIHN0cmluZyBjbGFzc19uYW1lID0gIHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIjsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGNsYXNzX25hbWUgPDwgIigiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBpZmFjZSkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIjogc3VwZXIoaWZhY2UpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgc2VydmljZV9uYW1lXyA8PCAiIGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZmluYWwgTWFwPFN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBQUk9DRVNTX01BUCA9IHt9OyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gUFJPQ0VTU19NQVBbbXNnLm5hbWVdOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZm4gPT0gbnVsbCkiOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRBcHBsaWNhdGlvbkVycm9yIHggPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAiXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZm4obXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOyAvLyBwcm9jZXNzIGZ1bmN0aW9uCisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsgLy8gY2xhc3MKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKworICBib29sIGF3YWl0X3Jlc3VsdCA9ICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBnZXRfbWVtYmVyX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKKyAgaWYgKGF3YWl0X3Jlc3VsdCkgeworICAgIGZfc2VydmljZV8gPDwgIiBhc3luYyI7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2FyZ3NfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9yZXN1bHRfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSI7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKGF3YWl0X3Jlc3VsdCkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gYXdhaXQgIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCBnZXRfbWVtYmVyX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIHN0cmluZyByZXN1bHRfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCAiIik7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgb24gIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICA8PCAiIGNhdGNoKCIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIikiOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuIiA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8sICIgIik7CisgICAgZl9zZXJ2aWNlXyA8PCAiY2F0Y2ggKHRoKSI7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBJbnRlcm5hbCBlcnJvciIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRBcHBsaWNhdGlvbkVycm9yIHggPSBuZXcgIgorICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICB9CisKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgZmllbGRfbmFtZTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgZmllbGRfbmFtZTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBmaWVsZF9uYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpOworICBzY29wZV91cChvdXQsICIiKTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5sZW5ndGgiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgZmllbGRfbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgZmllbGRfbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgZmllbGRfbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIGZpZWxkX25hbWU7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgZmllbGRfbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgorICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KTsKKyAgc2NvcGVfdXAob3V0LCAiIik7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoImVsZW0iKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLmtleXMpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIERhcnQgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIERhcnQgdHlwZSBuYW1lLCBpLmUuIE1hcDxLZXksIFZhbHVlPgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiTWFwPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIlNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorCisgIHJldHVybiBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0dHlwZSk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgRGFydCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiVWludDhMaXN0IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJpbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEYXJ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKKyAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgZmllbGRfbmFtZTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6OiBvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgZmllbGRfbmFtZSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0ZDo6c3RyaW5nIHJldHVybnR5cGU7CisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJldHVybnR5cGUgPSAiRnV0dXJlIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm50eXBlID0gIkZ1dHVyZTwiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiPiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSByZXR1cm50eXBlICsgIiAiICsgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAiKCIgKyBhcmd1bWVudHMgKyAiKSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBmaWVsZF9uYW1lOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjppbml0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIC8vIERvIG5vdCBpbml0aWFsaXplIG9wdGlvbmFsIGZpZWxkcworICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgdF90eXBlKiB0dHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworCisgIC8vIEdldCB0aGUgYWN0dWFsIHR5cGUgZm9yIGEgdHlwZWRlZgorICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIC8vIE9ubHkgY29uc2lkZXIgYmFzZSB0eXBlcyBmb3IgZGVmYXVsdCBpbml0aWFsaXphdGlvbgorICBpZiAoIXR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAiIjsKKyAgfQorICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworCisgIC8vIEluaXRpYWxpemUgYm9vbHMsIGludHMsIGFuZCBkb3VibGVzIHdpdGggc2FuZSBkZWZhdWx0cworICBzdHJpbmcgcmVzdWx0OworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXN1bHQgPSAiID0gZmFsc2UiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJlc3VsdCA9ICIgPSAwIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmVzdWx0ID0gIiA9IDAuMCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgcmVzdWx0ID0gIiI7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9tZW1iZXJfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIG5hbWVbMF0gPSB0b2xvd2VyKG5hbWVbMF0pOworICByZXR1cm4gbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2FyZ3NfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHJldHVybiBuYW1lICsgIl9hcmdzIjsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X3Jlc3VsdF9jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgcmV0dXJuIG5hbWUgKyAiX3Jlc3VsdCI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9maWxlX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICAvLyBlLmcuIGNoYW5nZSBBUElGb3JGaWxlSU8gdG8gYXBpX2Zvcl9maWxlX2lvCisKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIGlzX3ByZXZfbGMgPSB0cnVlOworICBib29sIGlzX2N1cnJlbnRfbGMgPSB0bXBbMF0gPT0gdG9sb3dlcih0bXBbMF0pOworICBib29sIGlzX25leHRfbGMgPSBmYWxzZTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGNoYXIgbGMgPSB0b2xvd2VyKHRtcFtpXSk7CisKKyAgICBpZiAoaSA9PSBuYW1lLmxlbmd0aCgpIC0gMSkgeworICAgICAgaXNfbmV4dF9sYyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpc19uZXh0X2xjID0gKHRtcFtpKzFdID09IHRvbG93ZXIodG1wW2krMV0pKTsKKyAgICB9CisKKyAgICBpZiAoaSAhPSAwICYmICFpc19jdXJyZW50X2xjICYmIChpc19wcmV2X2xjIHx8IGlzX25leHRfbGMpKSB7CisgICAgICByZXQgKz0gIl8iOworICAgIH0KKyAgICByZXQgKz0gbGM7CisKKyAgICBpc19wcmV2X2xjID0gaXNfY3VycmVudF9sYzsKKyAgICBpc19jdXJyZW50X2xjID0gaXNfbmV4dF9sYzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9jb25zdGFudHNfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIC8vIGUuZy4gY2hhbmdlIG15X2dyZWF0X21vZGVsIHRvIE15R3JlYXRNb2RlbENvbnN0YW50cworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGJvb2wgaXNfcHJldl91bmRlcnNjb3JlID0gdHJ1ZTsKKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgIGlmICh0bXBbaV0gPT0gJ18nKSB7CisgICAgICBpc19wcmV2X3VuZGVyc2NvcmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfcHJldl91bmRlcnNjb3JlKSB7CisgICAgICAgIHJldCArPSB0b3VwcGVyKHRtcFtpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgKz0gdG1wW2ldOworICAgICAgfQorCisgICAgICBpc19wcmV2X3VuZGVyc2NvcmUgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0ICsgIkNvbnN0YW50cyI7Cit9CisKK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKworLyoqCisgKiBFbWl0cyBhIGRvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIGRvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHAtPmdldF9uYW1lKCkpOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgZmllbGRfbmFtZTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vLyAiLCBzcy5zdHIoKSwgIiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkX25hbWUpOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X3R0eXBlX2NsYXNzX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAocHJvZ3JhbV8gPT0gdHR5cGUtPmdldF9wcm9ncmFtKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIG5hbWVkX2ltcG9ydCA9ICJ0XyIgKyBmaW5kX2xpYnJhcnlfbmFtZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgcmV0dXJuIG5hbWVkX2ltcG9ydCArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZGFydCwKKyAgICAiRGFydCIsCisgICAgIiAgICBsaWJyYXJ5X25hbWU6ICAgIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBsaWJyYXJ5IG5hbWUuXG4iCisgICAgIiAgICBsaWJyYXJ5X3ByZWZpeDogIEdlbmVyYXRlIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoaW4gYW4gZXhpc3RpbmcgbGlicmFyeS5cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVXNlIGEgZG90LXNlcGFyYXRlZCBzdHJpbmcsIGUuZy4gXCJteV9wYXJlbnRfbGliLnNyYy5nZW5cIlxuIgorICAgICIgICAgcHVic3BlY19saWI6ICAgICBPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhyaWZ0IGxpYiBkZXBlbmRlbmN5IGluIHB1YnNwZWMueWFtbCxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgZS5nLiBcInRocmlmdDogMC54LnhcIi4gIFVzZSBhIHBpcGUgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIGxpbmVzLFxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBlLmcuIFwidGhyaWZ0OnwgIGdpdDp8ICAgIHVybDogZ2l0QGZvby5jb21cIlxuIgorKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDc3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw0MDExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2NsYXNzIHRfZGVscGhpX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2RlbHBoaV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBpbmRlbnRfaW1wbF8gPSAwOworICAgIGhhc19mb3J3YXJkID0gZmFsc2U7CisgICAgaGFzX2VudW0gPSBmYWxzZTsKKyAgICBoYXNfY29uc3QgPSBmYWxzZTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYW5zaXN0cl9iaW5hcnlfID0gZmFsc2U7CisgICAgcmVnaXN0ZXJfdHlwZXNfID0gZmFsc2U7CisgICAgY29uc3RwcmVmaXhfID0gZmFsc2U7CisgICAgZXZlbnRzXyA9IGZhbHNlOworICAgIHhtbGRvY18gPSBmYWxzZTsKKyAgICBhc3luY18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhbnNpc3RyX2JpbmFyeSIpID09IDApIHsKKyAgICAgICAgYW5zaXN0cl9iaW5hcnlfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmVnaXN0ZXJfdHlwZXMiKSA9PSAwKSB7CisgICAgICAgIHJlZ2lzdGVyX3R5cGVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvbnN0cHJlZml4IikgPT0gMCkgeworICAgICAgICBjb25zdHByZWZpeF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJldmVudHMiKSA9PSAwKSB7CisgICAgICAgIGV2ZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ4bWxkb2MiKSA9PSAwKSB7CisgICAgICAgIHhtbGRvY18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luYyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkZWxwaGk6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWRlbHBoaSI7CisgICAgZXNjYXBlXy5jbGVhcigpOworICAgIGVzY2FwZV9bJ1wnJ10gPSAiJyciOworICB9CisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHlfd3JpdGVyXyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdF9pc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpOworCisgIHZvaWQgYWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKTsKKworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICBib29sIGNvbnN0X25lZWRzX3Zhcih0X3R5cGUqIHR5cGUpOworICB2b2lkIHByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBpbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBmaW5hbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19ubSA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKKyAgdm9pZCBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBib29sIGZvcl9hc3luYyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBkZWxwaGlfdHlwZV91c2luZ3Moc3RkOjpvc3RyZWFtJiBvdXQpOworICBzdGQ6OnN0cmluZyBkZWxwaGlfdGhyaWZ0X3VzaW5ncygpOworCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2NscyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX25vX3Bvc3RmaXggPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fZmFjdG9yeSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9jbHNubShzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgc3RkOjpzdHJpbmcgaW5wdXRfYXJnX3ByZWZpeCh0X3R5cGUqIHR0eXBlKTsKKworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYXN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscyA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGN1cnJlbnRfaW5kZW50KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBwcm9wX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSk7CisKKyAgdm9pZCB3cml0ZV9lbnVtKHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX2ZvcndhcmRfZGVjcihzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9jb25zdChzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9zdHJ1Y3Qoc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfc2VydmljZShzdGQ6OnN0cmluZyBsaW5lKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIigqKlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiICopXG4iOworICB9CisKKyAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UpOworICBzdHJpbmcgeG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpOworICBzdHJpbmcgeG1sZG9jX2VuY29kZShzdHJpbmcgY29udGVudHMpOworICBzdHJpbmcgeG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2ZvcndhcmRfZGVjcjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZW51bTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3Q7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3N0cnVjdDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc2VydmljZTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3RfaW1wbDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0X2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2VfaW1wbDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X2Z1bmNzOworICBib29sIGhhc19mb3J3YXJkOworICBib29sIGhhc19lbnVtOworICBib29sIGhhc19jb25zdDsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9rZXl3b3JkczsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZDsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb247CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHR5cGVzX2tub3duOworICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj4gdHlwZWRlZnNfcGVuZGluZzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVzZXNfbGlzdDsKKyAgdm9pZCBjcmVhdGVfa2V5d29yZHMoKTsKKyAgYm9vbCBmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX21ldGhvZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKTsKKyAgYm9vbCBpc19mdWxseV9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgYWRkX2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKKyAgYm9vbCBpc192b2lkKHRfdHlwZSogdHlwZSk7CisgIGludCBpbmRlbnRfaW1wbF87CisgIGJvb2wgYW5zaXN0cl9iaW5hcnlfOworICBib29sIHJlZ2lzdGVyX3R5cGVzXzsKKyAgYm9vbCBjb25zdHByZWZpeF87CisgIGJvb2wgZXZlbnRzXzsKKyAgYm9vbCB4bWxkb2NfOworICBib29sIGFzeW5jXzsKKyAgdm9pZCBpbmRlbnRfdXBfaW1wbCgpIHsgKytpbmRlbnRfaW1wbF87IH07CisgIHZvaWQgaW5kZW50X2Rvd25faW1wbCgpIHsgLS1pbmRlbnRfaW1wbF87IH07CisgIHN0ZDo6c3RyaW5nIGluZGVudF9pbXBsKCkgeworICAgIHN0ZDo6c3RyaW5nIGluZCA9ICIiOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnRfaW1wbF87ICsraSkgeworICAgICAgaW5kICs9ICIgICI7CisgICAgfQorICAgIHJldHVybiBpbmQ7CisgIH07CisgIHN0ZDo6b3N0cmVhbSYgaW5kZW50X2ltcGwoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gb3MgPDwgaW5kZW50X2ltcGwoKTsgfTsKK307CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGwpIHsKKyAgc3RyaW5nIHN0cihjb250ZW50cyk7CisKKyAgc2l6ZV90IHNsZW4gPSBzZWFyY2gubGVuZ3RoKCk7CisgIHNpemVfdCBybGVuID0gcmVwbC5sZW5ndGgoKTsKKyAgc2l6ZV90IGluY3IgPSAocmxlbiA+IDApID8gcmxlbiA6IDE7CisKKyAgaWYgKHNsZW4gPiAwKSB7CisgICAgc2l6ZV90IGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoKTsKKyAgICB3aGlsZSAoKGZvdW5kICE9IHN0cmluZzo6bnBvcykgJiYgKGZvdW5kIDwgc3RyLmxlbmd0aCgpKSkgeworICAgICAgc3RyLnJlcGxhY2UoZm91bmQsIHNsZW4sIHJlcGwpOworICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kICsgaW5jcik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGVuY29kaW5nCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICAvLyBlc2NhcGUgdGhlIGVzY2FwZQorICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICImIiwgIiZhbXA7Iik7CisKKyAgLy8gb3RoZXIgc3RhbmRhcmQgWE1MIGVudGl0aWVzCisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIjwiLCAiJmx0OyIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICI+IiwgIiZndDsiKTsKKworICByZXR1cm4gc3RyOworfQorCisvLyBYTUwgYXR0cmlidXRlIGVuY29kaW5nCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxhdHRyaWJfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKHhtbF9lbmNvZGUoY29udGVudHMpKTsKKworICAvLyBvdXIgYXR0cmlicyBhcmUgZW5jbG9zZWQgaW4gIgorICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcIiIsICJcXFwiIik7CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGVuY29kaW5nIGZvciBkb2MgY29tbWVudHMKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbGRvY19lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7CisgIHN0cmluZyBzdHIoeG1sX2VuY29kZShjb250ZW50cykpOworCisgIC8vIFhNTERvYyBzcGVjaWZpYzogY29udmVydCBsaW5lYnJlYWtzIGludG8gPHBhcmE+Z3JhcGhzPC9wYXJhPgorICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcclxuIiwgIlxyIik7CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxuIiwgIlxyIik7CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxyIiwgIjwvcGFyYT5cbjxwYXJhPiIpOworCisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgaWYgKHhtbGRvY18pIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskUkVHSU9OICdYTUxEb2MnfS8vLyA8c3VtbWFyeT5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8cGFyYT4iICsgY29udGVudHMgKyAiPC9wYXJhPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG57JEVORFJFR0lPTn1cbiIpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKHhtbGRvY18pIHsKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSB4bWxkb2NfZW5jb2RlKGZpZWxkLT5nZXRfZG9jKCkpICsgIlxuPHNlZWFsc28gY3JlZj1cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB4bWxkb2NfZW5jb2RlKHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpICsgIlwiLz4iOworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpICYmIHhtbGRvY18pIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB4bWxkb2NfZW5jb2RlKHRkb2MtPmdldF9kb2MoKSkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7CisgICAgc3RyaW5nc3RyZWFtIHBzOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHhtbGF0dHJpYl9lbmNvZGUocC0+Z2V0X25hbWUoKSkgPDwgIlwiPiI7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLAorICAgICAgICAgICAgICAgICAgc3RyLmVuZCgpKTsgLy8gcmVtb3ZlIHRoZSBuZXdsaW5lcyB0aGF0IGFwcGVhciBmcm9tIHRoZSBwYXJzZXIKKyAgICAgICAgcHMgPDwgeG1sZG9jX2VuY29kZShzdHIpOworICAgICAgfQorICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JFJFR0lPTiAnWE1MRG9jJ30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+PHBhcmE+IiArIHhtbGRvY19lbmNvZGUodGZ1bmN0aW9uLT5nZXRfZG9jKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9wYXJhPjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskRU5EUkVHSU9OfVxuIik7CisgIH0KK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmZpbmRfa2V5d29yZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiYga2V5d29yZF9tYXAsIHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSBuYW1lLmxlbmd0aCgpOworCisgIGlmIChsZW4gPD0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbmxhc3QgPSBuYW1lLmZpbmRfbGFzdF9vZignXycpOworCisgIGlmIChubGFzdCA+PSAxKSB7CisgICAgaWYgKG5sYXN0ID09IChsZW4gLSAxKSkgeworICAgICAgc3RyaW5nIG5ld19uYW1lKG5hbWUsIDAsIG5sYXN0KTsKKyAgICAgIHJldHVybiBmaW5kX2tleXdvcmQoa2V5d29yZF9tYXAsIG5ld19uYW1lKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChrZXl3b3JkX21hcFtuYW1lXSA9PSAxKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX21ldGhvZCkgeworICBzdHJpbmcgdG1wKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50ICgqKShpbnQpPihzdGQ6OnRvbG93ZXIpKTsKKworICBib29sIGJfZm91bmQgPSBmYWxzZTsKKworICBpZiAoZmluZF9rZXl3b3JkKGRlbHBoaV9rZXl3b3JkcywgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9IGVsc2UgaWYgKGJfbWV0aG9kICYmIGZpbmRfa2V5d29yZChkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kLCB0bXApKSB7CisgICAgYl9mb3VuZCA9IHRydWU7CisgIH0gZWxzZSBpZiAoYl9leGNlcHRpb25fbWV0aG9kICYmIGZpbmRfa2V5d29yZChkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbiwgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9CisKKyAgaWYgKGJfZm91bmQpIHsKKyAgICByZXR1cm4gbmFtZSArICJfIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Y3JlYXRlX2tleXdvcmRzKCkgeworICBkZWxwaGlfa2V5d29yZHNbImFuZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJlbmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJhaXNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVzZXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXJyYXkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZXhjZXB0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImlzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJlY29yZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZXhwb3J0cyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJsYWJlbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZXBlYXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXNtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZpbGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibGlicmFyeSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZXNvdXJjZXN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ3aXRoIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImJlZ2luIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZpbmFsaXphdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJtb2QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2V0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInhvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibmlsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNobCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibm90Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNociJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmdW5jdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNvbnN0cnVjdG9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImdvdG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib2YiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhlbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkZXN0cnVjdG9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImlmIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRocmVhZHZhciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkaXNwaW50ZXJmYWNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImltcGxlbWVudGF0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkaXYiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicGFja2VkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRyeSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkbyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbmhlcml0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvY2VkdXJlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInR5cGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG93bnRvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluaXRpYWxpemF0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb2dyYW0iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidW5pdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImlubGluZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9wZXJ0eSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1bnRpbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHVibGlzaGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImF1dG9tYXRlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvbiJdID0gMTsKKworICAvLyByZXNlcnZlZC9wcmVkZWZpbmVkIHZhcmlhYmxlcyBhbmQgdHlwZXMgKGxvd2VyY2FzZSEpCisgIGRlbHBoaV9rZXl3b3Jkc1sicmVzdWx0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN5c3RlbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzeXN1dGlscyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aHJpZnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGJ5dGVzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRvYmplY3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGNsYXNzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRpbnRlcmZhY2Vkb2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFuc2lzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImJvb2xlYW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hvcnRpbnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic21hbGxpbnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50ZWdlciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnQ2NCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7CisKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY3JlYXRlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbml0aW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsZWFudXBpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3N0eXBlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZWlzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3BhcmVudCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbnN0YW5jZXNpemUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaGVyaXRzZnJvbSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibWV0aG9kbmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlZW50cnkiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZXRhYmxlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ1bml0bmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZXF1YWxzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRoYXNoY29kZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidG9zdHJpbmciXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInNhZmVjYWxsZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJhZnRlcmNvbnN0cnVjdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYmVmb3JlZGVzdHJ1Y3Rpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRpc3BhdGNoIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZWZhdWx0aGFuZGxlciJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsibmV3aW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWVpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVzdHJveSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsicmVhZCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsid3JpdGUiXSA9IDE7CisKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldGlubmVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0c3RhY2tpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2t0cmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNpbmdleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXMiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10aGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2hlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNmbXRoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0YmFzZWV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImJhc2VleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJoZWxwY29udGV4dCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImlubmVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsibWVzc2FnZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNrdHJhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja2luZm8iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRleGNlcHRpb25zdGFja2luZm9wcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0c3RhY2tpbmZvc3RyaW5ncHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNsZWFudXBzdGFja2luZm9wcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2VvdXRlcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInRocm93b3V0ZXJleGNlcHRpb24iXSA9IDE7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVscGhpX3VzZXNfbGlzdChzdHJpbmcgdW5pdG5hbWUpIHsKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgaWYgKCgqc19pdGVyKSA9PSB1bml0bmFtZSkgeworICAgICAgZm91bmQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZm91bmQpIHsKKyAgICB1c2VzX2xpc3QucHVzaF9iYWNrKHVuaXRuYW1lKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIGluZGVudF9pbXBsXyA9IDA7CisgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKKyAgaGFzX2VudW0gPSBmYWxzZTsKKyAgaGFzX2NvbnN0ID0gZmFsc2U7CisgIGNyZWF0ZV9rZXl3b3JkcygpOworCisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJDbGFzc2VzIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXNVdGlscyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiR2VuZXJpY3MuQ29sbGVjdGlvbnMiKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlN5c3RlbS5UaHJlYWRpbmciKTsKKyAgfQorCisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHlwZVJlZ2lzdHJ5Iik7CisgIH0KKworICBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKKworICBzdHJpbmcgdW5pdG5hbWUsIG5zbmFtZTsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHVuaXRuYW1lID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lKCk7CisgICAgbnNuYW1lID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImRlbHBoaSIpOworICAgIGlmICgiIiAhPSBuc25hbWUpIHsKKyAgICAgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUobnNuYW1lKTsKKyAgICB9CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QodW5pdG5hbWUpOworICB9CisKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgc3RkOjpzdHJpbmcgdW5pdG5hbWUgPSBwcm9ncmFtX25hbWVfOworICBpZiAoIiIgIT0gbmFtZXNwYWNlX25hbWVfKSB7CisgICAgdW5pdG5hbWUgPSBuYW1lc3BhY2VfbmFtZV87CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdW5pdG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAodW5pdG5hbWVbaV0gPT0gJyAnKSB7CisgICAgICB1bml0bmFtZS5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgdW5pdG5hbWUgPSBub3JtYWxpemVfbmFtZSh1bml0bmFtZSk7CisgIAorICBzdGQ6OnN0cmluZyBmX25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgdW5pdG5hbWUgKyAiLnBhcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9hbGw7CisKKyAgZl9hbGwub3BlbihmX25hbWUuY19zdHIoKSk7CisKKyAgZl9hbGwgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhmX2FsbCwgcHJvZ3JhbV8pOworICBmX2FsbCA8PCAidW5pdCAiIDw8IHVuaXRuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJpbnRlcmZhY2UiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgInVzZXMiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgeworICAgIGlmIChzX2l0ZXIgIT0gdXNlc19saXN0LmJlZ2luKCkpIHsKKyAgICAgIGZfYWxsIDw8ICIsIjsKKyAgICAgIGZfYWxsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmX2FsbCkgPDwgKnNfaXRlcjsKKyAgfQorCisgIGZfYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdHJpbmcgdG1wX3VuaXQodW5pdG5hbWUpOworICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdG1wX3VuaXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAodG1wX3VuaXRbaV0gPT0gJy4nKSB7CisgICAgICB0bXBfdW5pdC5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgZl9hbGwgPDwgImNvbnN0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9BbnNpU3RyX0JpbmFyeSA9ICIgPDwgKGFuc2lzdHJfYmluYXJ5XyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fUmVnaXN0ZXJfVHlwZXMgPSAiIDw8IChyZWdpc3Rlcl90eXBlc18gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX0NvbnN0UHJlZml4ICAgID0gIiA8PCAoY29uc3RwcmVmaXhfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX0V2ZW50cyAgICAgICAgID0gIiA8PCAoZXZlbnRzXyA/ICJUcnVlIiA6ICJGYWxzZSIpCisgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX1htbERvYyAgICAgICAgID0gIiA8PCAoeG1sZG9jXyA/ICJUcnVlIiA6ICJGYWxzZSIpCisgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9hbGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgInR5cGUiIDw8IGVuZGw7CisgIGlmIChoYXNfZm9yd2FyZCkgeworICAgIGZfYWxsIDw8IHNfZm9yd2FyZF9kZWNyLnN0cigpIDw8IGVuZGw7CisgIH0KKyAgaWYgKGhhc19lbnVtKSB7CisgICAgaW5kZW50KGZfYWxsKSA8PCBlbmRsOworICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT059IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgc19lbnVtLnN0cigpOworICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT0ZGfSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IHNfc3RydWN0LnN0cigpOworICBmX2FsbCA8PCBzX3NlcnZpY2Uuc3RyKCk7CisgIGZfYWxsIDw8IHNfY29uc3Quc3RyKCk7CisgIGZfYWxsIDw8ICJpbXBsZW1lbnRhdGlvbiIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCBzX3N0cnVjdF9pbXBsLnN0cigpOworICBmX2FsbCA8PCBzX3NlcnZpY2VfaW1wbC5zdHIoKTsKKyAgZl9hbGwgPDwgc19jb25zdF9pbXBsLnN0cigpOworCisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBmX2FsbCA8PCBlbmRsOworICAgIGZfYWxsIDw8ICIvLyBUeXBlIGZhY3RvcnkgbWV0aG9kcyBhbmQgcmVnaXN0cmF0aW9uIiA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfdHlwZV9mYWN0b3J5X2Z1bmNzLnN0cigpOworICAgIGZfYWxsIDw8ICJwcm9jZWR1cmUgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uLnN0cigpOworICAgIGZfYWxsIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIGZfYWxsIDw8ICJpbml0aWFsaXphdGlvbiIgPDwgZW5kbDsKKyAgaWYgKGhhc19jb25zdCkgeworICAgIGZfYWxsIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9ICAvLyBEMjAxMCIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgInskSUZFTkR9IiA8PCBlbmRsOworICB9CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBmX2FsbCA8PCAiICBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IGVuZGw7CisKKyAgZl9hbGwgPDwgImZpbmFsaXphdGlvbiIgPDwgZW5kbDsKKyAgaWYgKGhhc19jb25zdCkgeworICAgIGZfYWxsIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9ICAvLyBEMjAxMCIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfRmluYWxpemU7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9hbGwgPDwgImVuZC4iIDw8IGVuZGw7CisgIGZfYWxsLmNsb3NlKCk7CisKKyAgaWYgKCF0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpIHsKKyAgICBwd2FybmluZygwLCAiJWQgdHlwZWRlZnMgd2l0aCB1bnJlc29sdmVkIHR5cGUgcmVmZXJlbmNlcyBsZWZ0OlxuIiwgdHlwZWRlZnNfcGVuZGluZy5zaXplKCkpOworICAgIGZvciAoc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciBpdGVyID0gdHlwZWRlZnNfcGVuZGluZy5iZWdpbigpOworICAgICAgICAgdHlwZWRlZnNfcGVuZGluZy5lbmQoKSAhPSBpdGVyOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBwd2FybmluZygwLCAiLSAlc1xuIiwgKCppdGVyKS0+Z2V0X3N5bWJvbGljKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpkZWxwaGlfdHlwZV91c2luZ3Mob3N0cmVhbSYgb3V0KSB7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiQ2xhc3NlcywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUaHJpZnQuQ29sbGVjdGlvbnMsIFRocmlmdC5Qcm90b2NvbCwiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJUaHJpZnQuVHJhbnNwb3J0OyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgorICBoYXNfZm9yd2FyZCA9IHRydWU7CisgIHB2ZXJib3NlKCJmb3J3YXJkIGRlY2xhcmF0aW9uIG9mICVzXG4iLCB0eXBlX25hbWUodHN0cnVjdCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIHdoYXQgPSB0c3RydWN0LT5pc194Y2VwdGlvbigpID8gImNsYXNzIiA6ICJpbnRlcmZhY2UiOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19mb3J3YXJkX2RlY3IpIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpLCB0cnVlKSA8PCAiID0gIiA8PCB3aGF0IDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgYWRkX2RlZmluZWRfdHlwZSh0c3RydWN0KTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICB0X3R5cGUqIHR5cGUgPSB0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKworICAvLyB3cml0ZSBub3cgb3Igc2F2ZSBmb3IgbGF0ZXI/CisgIGlmICghaXNfZnVsbHlfZGVmaW5lZF90eXBlKHR5cGUpKSB7CisgICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IHVucmVzb2x2ZWQgZGVwZW5kZW5jaWVzIGZvdW5kXG4iLCB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOworICAgIHR5cGVkZWZzX3BlbmRpbmcucHVzaF9iYWNrKHR0eXBlZGVmKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3N0cnVjdCwgdHR5cGVkZWYpOworICBpbmRlbnQoc19zdHJ1Y3QpIDw8IHR5cGVfbmFtZSh0dHlwZWRlZikgPDwgIiA9ICI7CisKKyAgLy8gY29tbWVudGVkIG91dDogdGhlIGJlbmVmaXQgaXMgbm90IGJpZyBlbm91Z2ggdG8gcmlzayBicmVha2luZyBleGlzdGluZyBjb2RlCisgIC8vIGJvb2wgY29udGFpbmVyID0gdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpOworICAvLyBpZiggISBjb250YWluZXIpCisgIC8vICBzX3N0cnVjdCA8PCAidHlwZSAiOyAgLy90aGUgInR5cGUgQSA9IHR5cGUgQiIgc3ludGF4IGxlYWRzIHRvIEUyNTc0IHdpdGggZ2VuZXJpY3MKKworICBzX3N0cnVjdCA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgYWRkX2RlZmluZWRfdHlwZSh0dHlwZWRlZik7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjppc19mdWxseV9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAoKE5VTEwgIT0gdHR5cGUtPmdldF9wcm9ncmFtKCkpICYmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykpIHsKKyAgICB0X3Njb3BlKiBzY29wZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5zY29wZSgpOworICAgIGlmIChOVUxMICE9IHNjb3BlLT5nZXRfdHlwZSh0dHlwZS0+Z2V0X25hbWUoKSkpIHsKKyAgICAgIC8vIHByaW50ZigidHlwZSAlcyBmb3VuZCBpbiBpbmNsdWRlZCBzY29wZSAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgIC8vIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0pOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93bltiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKV0pOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsgLy8gZW51bXMgYXJlIHdyaXR0ZW4gZmlyc3QsIGJlZm9yZSBhbGwgb3RoZXIgdHlwZXMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgJiYgaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgLy8gbWFyayBhcyBrbm93biB0eXBlCisgIHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldID0gMTsKKworICAvLyBjaGVjayBhbGwgcGVuZGluZyB0eXBlZGVmcworICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj46Oml0ZXJhdG9yIGl0ZXI7CisgIGJvb2wgbW9yZSA9IHRydWU7CisgIHdoaWxlIChtb3JlICYmICghdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSkgeworICAgIG1vcmUgPSBmYWxzZTsKKworICAgIGZvciAoaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsgdHlwZWRlZnNfcGVuZGluZy5lbmQoKSAhPSBpdGVyOyArK2l0ZXIpIHsKKyAgICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAoKml0ZXIpOworICAgICAgaWYgKGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IGFsbCBwZW5kaW5nIHJlZmVyZW5jZXMgYXJlIG5vdyByZXNvbHZlZFxuIiwKKyAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKHR0eXBlZGVmKS5jX3N0cigpKTsKKyAgICAgICAgdHlwZWRlZnNfcGVuZGluZy5lcmFzZShpdGVyKTsKKyAgICAgICAgZ2VuZXJhdGVfdHlwZWRlZih0dHlwZWRlZik7CisgICAgICAgIG1vcmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfa25vd25fdHlwZXNfbGlzdCgpIHsKKyAgLy8ga25vd24gYmFzZSB0eXBlcworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX3N0cmluZyldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9iaW5hcnkpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfYm9vbCldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pOCldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pMTYpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTMyKV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2k2NCldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9kb3VibGUpXSA9IDE7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaGFzX2VudW0gPSB0cnVlOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2VudW0sIHRlbnVtKTsKKyAgaW5kZW50KHNfZW51bSkgPDwgdHlwZV9uYW1lKHRlbnVtLCB0cnVlLCB0cnVlKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICBpZiAoY29uc3RhbnRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19lbnVtKSA8PCAiZHVtbXkgPSAwICAvLyBlbXB0eSBlbnVtcyBhcmUgbm90IGFsbG93ZWQiOworICB9IGVsc2UgeworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgeworICAgICAgICBzX2VudW0gPDwgIiwiOworICAgICAgICBzX2VudW0gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19lbnVtLCAqY19pdGVyKTsKKyAgICAgIGluZGVudChzX2VudW0pIDw8IG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgdmFsdWU7CisgICAgfQorICB9CisgIHNfZW51bSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19lbnVtKSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpIHsKKyAgaWYgKGNvbnN0cHJlZml4XykgeworICAgIHJldHVybiBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKCJUIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzIik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJUQ29uc3RhbnRzIjsgLy8gY29tcGF0aWJpbGl0eQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBoYXNfY29uc3QgPSB0cnVlOworICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzID0gbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiID0gY2xhc3MiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIHByaW50X3ByaXZhdGVfZmllbGQoc19jb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19jb25zdCwgKmNfaXRlcik7CisgICAgcHJpbnRfY29uc3RfcHJvcChzX2NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudChzX2NvbnN0KSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgInskSUZFTkR9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19jb25zdCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFycywgY29kZTsKKworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluaXRpYWxpemVfZmllbGQodmFycywKKyAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAiRiIgKyBwcm9wX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgY29uc3RydWN0b3IgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiLkNyZWF0ZTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKKyAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGRlc3RydWN0b3IgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiLkRlc3Ryb3k7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskRUxTRX0iIDw8IGVuZGw7CisKKyAgdmFycy5zdHIoIiIpOworICBjb2RlLnN0cigiIik7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluaXRpYWxpemVfZmllbGQodmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzX2NsYXNzICsgIi5GIiArIHByb3BfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAicHJvY2VkdXJlICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9Jbml0aWFsaXplOyIgPDwgZW5kbDsKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgc19jb25zdF9pbXBsIDw8IHZhcnMuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgc19jb25zdF9pbXBsIDw8IGNvZGUuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfRmluYWxpemU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsCisgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICBjb25zdGFudHNfY2xhc3MpOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRJRkVORH0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19ubSkgeworCisgIHN0cmluZyBjbHNfcHJlZml4OworCisgIGlmIChjbHNfbm0gPT0gIiIpIHsKKyAgICBjbHNfcHJlZml4ID0gIiI7CisgIH0gZWxzZSB7CisgICAgY2xzX3ByZWZpeCA9IGNsc19ubSArICIuIjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiWyIgPDwga2V5IDw8ICJdIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfcHJpdmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpdmFsdWU7CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyB2YXIgRiIgPDwgbmFtZSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0X25lZWRzX3Zhcih0X3R5cGUqIHR5cGUpIHsKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisgIHJldHVybiAoIXRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCl2YWx1ZTsKKyAgaWYgKGNvbnN0X25lZWRzX3Zhcih0eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyBwcm9wZXJ0eSAiIDw8IG5hbWUgPDwgIjogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiByZWFkIEYiIDw8IG5hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFyczsgLy8gZHVtbXkKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLy8gYWxyZWFkeSBkb25lCisgICAgLy8gc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCB2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICAvLyBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHR5cG5hbWU7CisgICAgdHlwbmFtZSA9IHR5cGVfbmFtZSh0cnVldHlwZSwgdHJ1ZSwgZmFsc2UsIHR5cGUtPmlzX3hjZXB0aW9uKCksIHR5cGUtPmlzX3hjZXB0aW9uKCkpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwbmFtZSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHJ1ZXR5cGUsIHZhbHVlKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgcHJpbnRfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5hbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19ubSkgeworICAodm9pZClvdXQ7CisgICh2b2lkKW5hbWU7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKXZhbHVlOworICAodm9pZCljbHNfbm07Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIlRydWUiIDogIkZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICJTaG9ydEludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiU21hbGxJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgIkxvbmdJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgIkludDY0KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7IC8vIG1ha2UgaXQgYSBkb3VibGUgY29uc3RhbnQgYnkgYWRkaW5nICIuMCIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHZhcnMgPDwgIiAgIiA8PCB0IDw8ICIgOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBwcmludF9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIHQsIHR5cGUsIHZhbHVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGluZGVudF9kb3duKCk7CisKKyAgYWRkX2RlZmluZWRfdHlwZSh0c3RydWN0KTsKKworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zdHJ1Y3RfaW1wbCwgIiIsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShzX3R5cGVfZmFjdG9yeV9mdW5jcywgIiIsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQsIHRydWUpOworICB9CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBzdHJpbmcgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5LCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluaXRpYWxpemVfZmllbGQodmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnRfaW1wbChjb2RlKSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVHJ1ZTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJDcmVhdGU7IiA8PCBlbmRsOworCisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgb3V0IDw8IHZhcnMuc3RyKCk7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCcnKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgb3V0IDw8IGNvZGUuc3RyKCk7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0c3RydWN0LCBpbmRlbnRfaW1wbCgpKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgcHJvcG5hbWUgPSBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pOworICAgICAgc3RyaW5nIHBhcmFtX25hbWUgPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwYXJhbV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJVcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJkZXN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkRlc3Ryb3k7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGZpbmFsaXplX2ZpZWxkKG91dCwgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbiksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiOiBJIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiID0gbmlsIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInRoZW4gRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDo9IFQiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAicmVzdWx0IDo9IEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgICB9CisKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdC0+aXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgICAgfQorICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7CisgICAgfQorICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19ubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1faXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QtPmlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOworICAgIH0KKyAgfQorCisgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgaWYgKGlzX3Jlc3VsdCkgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc194X2ZhY3RvcnkpOworCisgIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgb3V0IDw8ICJDcmVhdGVfIjsKKyAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7CisgIG91dCA8PCAiX0ltcGwiOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgcmV0dXJuOworICBpZiAoaXNfcmVzdWx0KQorICAgIHJldHVybjsKKyAgaWYgKGlzX3hfZmFjdG9yeSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworCisgIG91dCA8PCAiZnVuY3Rpb24gIjsKKyAgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIjogIjsKKyAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7CisgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICAodm9pZCljbHNfcHJlZml4OworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHJldHVybjsKKyAgaWYgKGlzX3Jlc3VsdCkKKyAgICByZXR1cm47CisgIGlmIChpc194X2ZhY3RvcnkpCisgICAgcmV0dXJuOworCisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworCisgIGluZGVudChvdXQpIDw8ICIgIFR5cGVSZWdpc3RyeS5SZWdpc3RlclR5cGVGYWN0b3J5PCIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiPigiOworICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCAiKTsiOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWU7CisgIHN0cmluZyBzdHJ1Y3RfbmFtZTsKKyAgc3RyaW5nIGlzc2V0X25hbWU7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBzdHJ1Y3RfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSk7CisgIH0gZWxzZSB7CisgICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSk7CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworCisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRzdHJ1Y3QpOworICAgIGluZGVudChvdXQpIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIiA9IGludGVyZmFjZShJQmFzZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoaXNfeF9mYWN0b3J5KSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnQob3V0KSA8PCBzdHJ1Y3RfbmFtZSA8PCAiID0gIjsKKyAgaWYgKGlzX2ZpbmFsKSB7CisgICAgb3V0IDw8ICJzZWFsZWQgIjsKKyAgfQorICBvdXQgPDwgImNsYXNzKCI7CisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgb3V0IDw8ICJURXhjZXB0aW9uIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIlRJbnRlcmZhY2VkT2JqZWN0LCBJQmFzZSwgIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICB9CisgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInR5cGUiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpbl9jbGFzcywgaXNfcmVzdWx0LCB0cnVlKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDoiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiRiIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGlzc2V0X25hbWUgPSAiRl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgIH0KKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBDbGVhciB2YWx1ZXMoZm9yIHVuaW9uJ3MgcHJvcGVydHkgc2V0dGVyKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIENsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50KCkpCisgICAgICAgICAgICAgICAgPDwgIik7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBFeGNlcHRpb24gRmFjdG9yeSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI6ICIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIElCYXNlIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBQcm9wZXJ0aWVzIiA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IiA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSxmYWxzZSk7CisgIGlmKGFzeW5jXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLHRydWUpOworICB9Cit9CisKKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIGJvb2wgZm9yX2FzeW5jKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIHN0cmluZyBpZmFjZV9uYW1lID0gZm9yX2FzeW5jID8gIklBc3luYyIgOiAiSWZhY2UiOworCisgIGluZGVudF91cCgpOworCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19pZmFjZSA9IGV4dGVuZHMgKyAiLiIgKyBpZmFjZV9uYW1lOworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlKCIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBpZmFjZV9uYW1lIDw8ICIgPSBpbnRlcmZhY2UiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmb3JfYXN5bmMpIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaW5kZW50X3VwKCk7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUSW50ZXJmYWNlZE9iamVjdCI7CisgIHN0cmluZyBpbXBsZW1lbnRzID0gYXN5bmNfID8gIklmYWNlLCBJQXN5bmMiIDogIklmYWNlIjsKKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuVENsaWVudCI7CisgIH0KKyAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRDbGllbnQgPSBjbGFzcyggIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiLCAiIDw8IGltcGxlbWVudHMgPDwgIikiIDw8IGVuZGw7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggcHJvdDogSVByb3RvY29sKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5UQ2xpZW50LkNyZWF0ZSggcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQ3JlYXRlKCBwcm90LCBwcm90ICk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpCisgICAgICA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5UQ2xpZW50LkNyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8gOj0gaXByb3Q7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90XyA6PSBvcHJvdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaXByb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJvcHJvdF86IElQcm90b2NvbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInNlcWlkXzogU3lzdGVtLkludGVnZXI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBJbnB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBpcHJvdF87IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBPdXRwdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgb3Byb3RfOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgIi8vIElmYWNlIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8IGVuZGw7CisgIH0KKworICBpZiggYXN5bmNfKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiLy8gSUFzeW5jIiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRDbGllbnQiOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gb25lIGZvciBzeW5jIG9ubHksIHR3byBmb3IgYXN5bmMrc3luYworICAgIGludCBtb2RlID0gYXN5bmNfID8gMSA6IDA7CisgICAgd2hpbGUoIG1vZGUgPj0gMCkgeworICAgICAgYm9vbCBmb3JfYXN5bmMgPSAobW9kZSAhPSAwKTsKKyAgICAgIG1vZGUtLTsKKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmb3JfYXN5bmMsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgICBpZiggZm9yX2FzeW5jKSB7CisgICAgICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgICAgICAvLyBEZWxwaGkgZm9yY2VzIHVzIHRvIHNwZWNpZnkgYSB0eXBlIHdpdGggSUZ1dHVyZTxUPiwgc28gd2UgdXNlIEludGVnZXI9MCBmb3Igdm9pZCBtZXRob2RzCisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXN1bHQgOj0gVFRhc2suRnV0dXJlPFN5c3RlbS5JbnRlZ2VyPihmdW5jdGlvbjogU3lzdGVtLkludGVnZXIiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyaW5nIHJldHR5cGUgPSB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXN1bHQgOj0gVFRhc2suRnV0dXJlPCIgPDwgcmV0dHlwZSA8PCAiPihmdW5jdGlvbjogIiA8PCByZXR0eXBlIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiUmVzdWx0IDo9ICI7CisgICAgICAgIH0KKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICAgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gMDsiIDw8IGVuZGw7ICAvLyBubyBJRnV0dXJlPHZvaWQ+IGluIERlbHBoaQorICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKGFyZ3NuYW1lLCAiVCIpOworICAgIHN0cmluZyBhcmdzX2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIkkiKTsKKworICAgIHN0cmluZyBhcmdzdmFyID0gdG1wKCJfYXJncyIpOworICAgIHN0cmluZyBtc2d2YXIgPSB0bXAoIl9tc2ciKTsKKworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZmFsc2UpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZmFsc2UsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJzZXFpZF8gOj0gc2VxaWRfICsgMTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBtc2d2YXIgPDwgIiwgJyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXyk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4oICIgPDwgbXNndmFyIDw8ICIgKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbDsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiVCIpOworICAgICAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgICBzdHJpbmcgZXhjZXB0dmFyID0gdG1wKCJfZXgiKTsKKyAgICAgIHN0cmluZyBhcHBleHZhciA9IHRtcCgiX2F4Iik7CisgICAgICBzdHJpbmcgcmV0dmFyID0gdG1wKCJfcmV0Iik7CisKKyAgICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCBmYWxzZSwgZnVsbF9jbHMpIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICAgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6IEV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXBwZXh2YXIgPDwgIiA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIgOiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDo9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCBtc2d2YXIgPDwgIi5UeXBlXyA9IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIHRoZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBhcHBleHZhciA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCByZXR2YXIgPDwgIi5fX2lzc2V0X3N1Y2Nlc3MpIHRoZW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9ICIgPDwgcmV0dmFyIDw8ICIuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfbGlzdCgpCisgICAgICAgICAgICB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIi5TdWNjZXNzIDo9IG5pbDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF8iIDw8IHByb3BfbmFtZSgqeF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdGhlbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGV4Y2VwdHZhciA8PCAiIDo9ICIgPDwgcmV0dmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyYWlzZSAiIDw8IGV4Y2VwdHZhciA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICAgICAgICA8PCAicmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdC5DcmVhdGUoJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworCisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlRQcm9jZXNzb3JJbXBsIjsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NvckltcGwgPSBjbGFzcygiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIsIElQcm9jZXNzb3IpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb2Nlc3NvcikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkNyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGUoIGlmYWNlXyk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJTZWxmLmlmYWNlXyA6PSBpZmFjZV87IiA8PCBlbmRsOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQVNTRVJUKCBwcm9jZXNzTWFwXyA8PiBuaWwpOyAgLy8gaW5oZXJpdGVkIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgICA8PCAicHJvY2Vzc01hcF8gOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj4uQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJwcm9jZXNzTWFwXy5BZGRPclNldFZhbHVlKCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2Vzcyk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJkZXN0cnVjdG9yICIgPDwgZnVsbF9jbHMgPDwgIi5EZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcml2YXRlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImlmYWNlXzogSWZhY2U7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAidHlwZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NGdW5jdGlvbiA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2Vzc01hcF86IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyByZWludHJvZHVjZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZ1bmN0aW9uICIgPDwgZnVsbF9jbHMgPDwgIi5Qcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgIDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6IFRQcm9jZXNzRnVuY3Rpb247IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dCA6IElSZXF1ZXN0RXZlbnRzOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuIDo9IG5pbDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgbm90IHByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBmbikiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Igbm90IEFzc2lnbmVkKGZuKSB0aGVuIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieCA6PSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZC5DcmVhdGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJycgKyBtc2cuTmFtZSArICcnJycpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0aGVuIGNvbnRleHQgOj0gZXZlbnRzLkNyZWF0ZVJlcXVlc3RDb250ZXh0KG1zZy5OYW1lKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVsc2UgY29udGV4dCA6PSBuaWw7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCwgY29udGV4dCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGNvbnRleHQgPD4gbmlsIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQuQ2xlYW51cENvbnRleHQ7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dCA6PSBuaWw7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImV4Y2VwdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgZG8gYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbHNlIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBGYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgIlN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIHN0cmluZyBmdW5jbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRQcm9jZXNzb3JJbXBsIjsKKworICBzdHJpbmcgb3JnX2FyZ3NuYW1lID0gZnVuY25hbWUgKyAiX2FyZ3MiOworICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfYXJnc25hbWUsICJUIik7CisgIHN0cmluZyBhcmdzX2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfYXJnc25hbWUsICJJIik7CisKKyAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gZnVuY25hbWUgKyAiX3Jlc3VsdCI7CisgIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJUIik7CisgIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiSSIpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9jZWR1cmUgIiA8PCBmdW5jbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBvbmUgd2F5IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIGJvdGggd2F5IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgPDwgInByb2NlZHVyZSAiIDw8IGZ1bGxfY2xzIDw8ICIuIiA8PCBmdW5jbmFtZQorICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3M6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0OiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVSZWFkOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RSZWFkOyIgPDwgZW5kbDsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQgOj0gIiA8PCByZXN1bHRfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgc19zZXJ2aWNlX2ltcGwgPDwgInJldC5TdWNjZXNzIDo9ICI7CisgIH0KKyAgc19zZXJ2aWNlX2ltcGwgPDwgImlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7CisgICAgfQorICAgIHNfc2VydmljZV9pbXBsIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICB9CisgIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleGNlcHQiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkbyBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCksICIiLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkZhY3RvcnkiOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA6PSBFLiIgPDwgZmFjdG9yeV9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5VbmhhbmRsZWRFcnJvcihFKTsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IuQ3JlYXRlKEUuTWVzc2FnZSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaWYoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgICAgaWYoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweC5GcmVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpZiAoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuT25ld2F5Q29tcGxldGU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCAiIik7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIjsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIoIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRBbnNpU3RyaW5nKCk7IjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiUmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgICBvdXQgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgdHlwX25hbWU7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwX25hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycykgeworCisgIHN0cmluZyBvYmo7CisgIHN0cmluZyBjb3VudGVyOworICBzdHJpbmcgbG9jYWxfdmFyOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IFRUaHJpZnRNYXA7IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0U2V0OyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IFRUaHJpZnRMaXN0OyI7CisgIH0KKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOworICBjb3VudGVyID0gdG1wKCJfaSIpOworICBsb2NhbF92YXIgPSBjb3VudGVyICsgIjogU3lzdGVtLkludGVnZXI7IjsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCB0cnVlKSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBjb3VudGVyIDw8ICIgOj0gMCB0byAiIDw8IG9iaiA8PCAiLkNvdW50IC0gMSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworCisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICBzdHJpbmcgbG9jYWxfdmFyOworCisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmtleSwgIiIsIGxvY2FsX3ZhcnMpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZnZhbCwgIiIsIGxvY2FsX3ZhcnMpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkT3JTZXRWYWx1ZSggIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmZWxlbSwgIiIsIGxvY2FsX3ZhcnMpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgICh2b2lkKWxvY2FsX3ZhcnM7CisKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlQW5zaVN0cmluZygiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKFN5c3RlbS5JbnRlZ2VyKCIgPDwgbmFtZSA8PCAiKSk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgKHZvaWQpbG9jYWxfdmFyczsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudF9pbXBsKCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgb2JqOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJtYXAiKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0TWFwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBvYmogPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTWFwQmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoInNldF8iKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0U2V0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBvYmogPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlU2V0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJsaXN0XyIpOworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRMaXN0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggIiA8PCBvYmogPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzIGRvIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9saXN0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAma2ZpZWxkLCAiIiwgbG9jYWxfdmFycyk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZ2ZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmVmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvdXQsIGlzX3hjZXB0aW9uLCB0ZmllbGQsIGlzUHVibGljLCAiR2V0Iik7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdF9pc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgeworICAodm9pZClpc1B1YmxpYzsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0ZmllbGQpOworICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICI6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIgcmVhZCAiCisgICAgICAgICAgICAgIDw8IGZpZWxkUHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiIHdyaXRlIFNldCIKKyAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOyIgPDwgZW5kbDsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKSB7CisgIHJldHVybiBwcm9wX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpLCBpc194Y2VwdGlvbik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHN0cmluZyBuYW1lLCBib29sIGlzX3hjZXB0aW9uKSB7CisgIHN0cmluZyByZXQgPSBuYW1lOworICByZXRbMF0gPSB0b3VwcGVyKHJldFswXSk7CisgIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIHRydWUsIGlzX3hjZXB0aW9uKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQgPSBuYW1lOworICByZXRbMF0gPSB0b3VwcGVyKHJldFswXSk7CisgIHJldCA9ICJBIiArIHJldDsKKyAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHJldCwgZmFsc2UsIGZhbHNlKTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX2Nsc25tKHN0cmluZyBjbHNubSwgc3RyaW5nIHByZWZpeCwgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQpIHsKKyAgaWYgKGNsc25tLnNpemUoKSA+IDApIHsKKyAgICBjbHNubVswXSA9IHRvdXBwZXIoY2xzbm1bMF0pOworICB9CisgIGlmIChiX25vX2NoZWNrX2tleXdvcmQpIHsKKyAgICByZXR1cm4gcHJlZml4ICsgY2xzbm07CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIGNsc25tKTsKKyAgfQorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgeworCisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0ZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7CisgICAgaWYgKHRkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpKSB7IC8vIGZvcndhcmQgdHlwZXMgYWNjb3JkaW5nIHRvIFRIUklGVC0yNDIxCisgICAgICBpZiAodGRlZi0+Z2V0X3R5cGUoKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0eXBlX25hbWUodGRlZi0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX25vX3Bvc3RmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9leGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVucmVzb2x2ZWQgZm9yd2FyZCBkZWNsYXJhdGlvbjogIiArIHRkZWYtPmdldF9zeW1ib2xpYygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbm9ybWFsaXplX25hbWUoIlQiICsgdGRlZi0+Z2V0X3N5bWJvbGljKCkpOworICAgIH0KKyAgfQorCisgIHN0cmluZyB0eXBfbm07CisKKyAgc3RyaW5nIHNfZmFjdG9yeTsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBiX2NscyA9IHRydWU7CisgICAgYl9ub19wb3N0Zml4ID0gdHJ1ZTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgaWYgKGJfY2xzKSB7CisgICAgICB0eXBfbm0gPSAiVFRocmlmdERpY3Rpb25hcnlJbXBsIjsKKyAgICB9IGVsc2UgeworICAgICAgdHlwX25tID0gIklUaHJpZnREaWN0aW9uYXJ5IjsKKyAgICB9CisgICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKQorICAgICAgICAgICArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgaWYgKGJfY2xzKSB7CisgICAgICB0eXBfbm0gPSAiVEhhc2hTZXRJbXBsIjsKKyAgICB9IGVsc2UgeworICAgICAgdHlwX25tID0gIklIYXNoU2V0IjsKKyAgICB9CisgICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgaWYgKGJfY2xzKSB7CisgICAgICB0eXBfbm0gPSAiVFRocmlmdExpc3RJbXBsIjsKKyAgICB9IGVsc2UgeworICAgICAgdHlwX25tID0gIklUaHJpZnRMaXN0IjsKKyAgICB9CisgICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorCisgIHN0cmluZyB0eXBlX3ByZWZpeDsKKworICBpZiAoYl9jbHMpIHsKKyAgICB0eXBlX3ByZWZpeCA9ICJUIjsKKyAgfSBlbHNlIHsKKyAgICB0eXBlX3ByZWZpeCA9ICJJIjsKKyAgfQorCisgIHN0cmluZyBubSA9IG5vcm1hbGl6ZV9jbHNubSh0dHlwZS0+Z2V0X25hbWUoKSwgdHlwZV9wcmVmaXgpOworCisgIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5KSB7CisgICAgbm0gPSBubSArICJGYWN0b3J5IjsKKyAgfQorCisgIGlmIChiX2NscykgeworICAgIGlmICghYl9ub19wb3N0Zml4KSB7CisgICAgICBubSA9IG5tICsgIkltcGwiOworICAgIH0KKyAgfQorCisgIGlmIChiX2V4Y2VwdGlvbl9mYWN0b3J5ICYmIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSkgKyAiLiIgKyBubTsKKyAgfQorCisgIHJldHVybiBubTsKK30KKworLy8gcmV0dXJucyAiY29uc3QgIiBmb3Igc29tZSBhcmd1bWVudCB0eXBlcworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5wdXRfYXJnX3ByZWZpeCh0X3R5cGUqIHR0eXBlKSB7CisKKyAgLy8gYmFzZSB0eXBlcworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpIHsKKworICAgIC8vIHRoZXNlIHNob3VsZCBiZSBjb25zdCdlZCBmb3Igb3B0aW1hbCBwZXJmb3JtYW1jZQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiAvLyByZWZjb3VudGVkIHBvaW50ZXIKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogICAgLy8gbGFyZ2VyIHRoYW4gMzIgYml0CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6IC8vIGxhcmdlciB0aGFuIDMyIGJpdAorICAgICAgcmV0dXJuICJjb25zdCAiOworCisgICAgLy8gYWxsIG90aGVycyBkb24ndCBuZWVkIHRvIGJlCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIiOworCisgICAgLy8gd2UgYmV0dGVyIGFsd2F5cyByZXBvcnQgYW55IHVua25vd24gdHlwZXMKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBpbnB1dF9hcmdfcHJlZml4KCkgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKKyAgICB9CisKKyAgICAvLyBlbnVtcworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIiI7IC8vIHVzdWFsbHkgPD0gMzIgYml0CisKKyAgICAvLyBjb250YWluZXJzCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKKyAgfQorCisgIC8vIGFueSBvdGhlciB0eXBlLCBlaXRoZXIgVFNvbWV0aGluZyBvciBJU29tZXRoaW5nCisgIHJldHVybiAiY29uc3QgIjsgLy8gcG9zc2libHkgcmVmY291bnRlZCBwb2ludGVyCit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAvLyBubyAidm9pZCIgaW4gRGVscGhpIGxhbmd1YWdlCisgICAgcmV0dXJuICIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgIHJldHVybiAiU3lzdGVtLkFuc2lTdHJpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTeXNVdGlscy5UQnl0ZXMiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN5c3RlbS5zdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiU3lzdGVtLkJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiU3lzdGVtLlNob3J0SW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJTeXN0ZW0uU21hbGxJbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIlN5c3RlbS5JbnRlZ2VyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJTeXN0ZW0uSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIlN5c3RlbS5Eb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKKyAgfQorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgKHZvaWQpaW5pdDsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgc3RyaW5nIHJlc3VsdCA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yX2FzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZ1bGxfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHByZWZpeDsKKyAgaWYgKGZ1bGxfY2xzID09ICIiKSB7CisgICAgcHJlZml4ID0gIiI7CisgIH0gZWxzZSB7CisgICAgcHJlZml4ID0gZnVsbF9jbHMgKyAiLiI7CisgIH0KKworICBpZiggZm9yX2FzeW5jKSB7CisgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICJBc3luYygiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogSUZ1dHVyZTxJbnRlZ2VyPjsiOyAgLy8gbm8gSUZ1dHVyZTx2b2lkPiBpbiBEZWxwaGkKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiQXN5bmMoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6IElGdXR1cmU8IgorICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIj47IjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICByZXR1cm4gInByb2NlZHVyZSAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogIgorICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOworICAgIH0KKyAgfQorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiB0dDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICI7ICI7CisgICAgfQorCisgICAgdHQgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgcmVzdWx0ICs9IGlucHV0X2FyZ19wcmVmaXgodHQpOyAvLyBjb25zdD8KKyAgICByZXN1bHQgKz0gbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICI6ICIKKyAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHQsIGZhbHNlLCB0cnVlLCB0dC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIGN1cnJlbnRfaW5kZW50KSB7CisgIG9zdHJpbmdzdHJlYW0gcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB0X3R5cGUqIHR0OworICBzdHJpbmcgbGluZSA9ICIiOworICBzdHJpbmcgbmV3bGluZV9pbmRlbnQgPSBjdXJyZW50X2luZGVudCArICIgICI7CisKKyAgYm9vbCBmaXJzdGxpbmUgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lICs9ICI7IjsKKyAgICB9CisKKyAgICBpZiAobGluZS5zaXplKCkgPiA4MCkgeworICAgICAgaWYgKGZpcnN0bGluZSkgeworICAgICAgICByZXN1bHQgPDwgZW5kbCA8PCBuZXdsaW5lX2luZGVudDsKKyAgICAgICAgZmlyc3RsaW5lID0gZmFsc2U7CisgICAgICB9CisgICAgICByZXN1bHQgPDwgbGluZSA8PCBlbmRsOworICAgICAgbGluZSA9IG5ld2xpbmVfaW5kZW50OworICAgIH0gZWxzZSBpZiAobGluZS5zaXplKCkgPiAwKSB7CisgICAgICBsaW5lICs9ICIgIjsKKyAgICB9CisKKyAgICB0dCA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBsaW5lICs9IGlucHV0X2FyZ19wcmVmaXgodHQpOyAvLyBjb25zdD8KKyAgICBsaW5lICs9IGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICI6ICIKKyAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOworICB9CisKKyAgaWYgKGxpbmUuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCA8PCBsaW5lOworICB9CisKKyAgc3RyaW5nIHJlc3VsdF9zdHI7CisKKyAgaWYgKGZpcnN0bGluZSkgeworICAgIHJlc3VsdF9zdHIgPSAiICIgKyByZXN1bHQuc3RyKCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0X3N0ciA9IHJlc3VsdC5zdHIoKTsKKyAgfQorCisgIHJldHVybiByZXN1bHRfc3RyOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZ18iOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQm9vbF8iOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJ5dGVfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlXyI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TZXRfIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjplbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgIHJldHVybiAiJyciOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICInJyI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJGYWxzZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjAuMCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVCIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigwKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXRfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgKHZvaWQpbmFtZTsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpaXNfdW5pb247CisgICh2b2lkKWlzX3hjZXB0aW9uX2ZhY3Rvcnk7CisgICh2b2lkKXhjZXB0aW9uX2ZhY3RvcnlfbmFtZTsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiB0aGVuIGJlZ2luIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gRmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiRGVmYXVsdCggIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJTZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgICAgICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmIChpc191bmlvbikgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICB9CisgIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKKworICBpZiAoaXNfeGNlcHRpb25fY2xhc3MgJiYgKCFpc194Y2VwdGlvbl9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgeGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgKHZvaWQpdHlwZTsKKworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgKHZvaWQpdHlwZTsKKworICBzdHJpbmcgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgaXNzZXRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZCljbHNfcHJlZml4OworCisgIHN0cmluZyBleGNlcHRpb25fY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpOworICBzdHJpbmcgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGVFeGNlcHRpb246ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LkYiIDw8IGZhY3RvcnlfbmFtZSA8PCAiIDo9IFNlbGY7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgcHJvcG5hbWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBwcm9wbmFtZSA9IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBfX2lzc2V0XyIgPDwgcHJvcG5hbWUgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LiIgPDwgcHJvcG5hbWUgPDwgIiA6PSAiIDw8IHByb3BuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5VcGRhdGVNZXNzYWdlUHJvcGVydHk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7CisgIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IGlwcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CisKKyAgLy8gbG9jYWwgYm9vbHMgZm9yIHJlcXVpcmVkIGZpZWxkcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOiBTeXN0ZW0uQm9vbGVhbjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IEZBTFNFOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAid2hpbGUgKHRydWUpIGRvIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXyA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIkJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgaWYgKGZpcnN0KSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiY2FzZSBmaWVsZF8uSUQgb2YiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0KKworICAgIGZpcnN0ID0gZmFsc2U7CisgICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgeworICAgICAgY29kZV9ibG9jayA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworCisgICAgLy8gcmVxdWlyZWQgZmllbGQ/CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBUUlVFOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd25faW1wbCgpOworCisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCBlbHNlIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIjsKKyAgfQorCisgIGlmICghZmlyc3QpIHsKKyAgICBjb2RlX2Jsb2NrIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVsc2UgYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOworCisgIGlmICghZmlyc3QpIHsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRGaWVsZEVuZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICAvLyBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgYmVlbiByZWFkPworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgbm90IF9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykKKyAgICAgICAgICA8PCAidGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoIgorICAgICAgICAgIDw8ICIncmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIG5vdCBzZXQnKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCkgPDwgZW5kbDsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7CisgIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IG9wcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBzdHJ1YywgJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggZmllbGRfKTsiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIpIHRoZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5UeXBlXyAgOj0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkXyk7IiA8PCBlbmRsOworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggc3RydWMsICciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIGZpZWxkXyk7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRuYW1lID0gcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKTsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGJvb2wgaGFzX2lzc2V0ID0gKCFpc19yZXF1aXJlZCk7CisgICAgaWYgKGlzX3JlcXVpcmVkICYmIG51bGxfYWxsb3dlZCkgeworICAgICAgbnVsbF9hbGxvd2VkID0gZmFsc2U7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKFNlbGYuIiA8PCBmaWVsZG5hbWUgPDwgIiA9IG5pbCkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIidyZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkbmFtZSA8PCAiIG5vdCBzZXQnKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKFNlbGYuIiA8PCBmaWVsZG5hbWUgPDwgIiA8PiBuaWwpIjsKKyAgICAgIGlmIChoYXNfaXNzZXQpIHsKKyAgICAgICAgY29kZV9ibG9jayA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgZmllbGRuYW1lOworICAgICAgfQorICAgICAgY29kZV9ibG9jayA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaGFzX2lzc2V0KSB7CisgICAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoX19pc3NldF8iIDw8IGZpZWxkbmFtZSA8PCAiKSB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLk5hbWUgOj0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgaWYgKG51bGxfYWxsb3dlZCB8fCBoYXNfaXNzZXQpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdHJpbmcgY2xzX25tOworCisgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgY2xzX25tOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnksIHRydWUpOworICB9IGVsc2UgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdHJpbmcgdG1wX3NiID0gdG1wKCJfc2IiKTsKKyAgc3RyaW5nIHRtcF9maXJzdCA9IHRtcCgiX2ZpcnN0Iik7CisgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlRvU3RyaW5nOiBzdHJpbmc7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOiBUVGhyaWZ0U3RyaW5nQnVpbGRlcjsiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOj0gVFRocmlmdFN0cmluZ0J1aWxkZXIuQ3JlYXRlKCcoJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaWYgKHVzZUZpcnN0RmxhZykgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gVFJVRTsiIDw8IGVuZGw7CisgIH0KKworICBib29sIGhhZF9yZXF1aXJlZCA9IGZhbHNlOyAvLyBzZXQgdG8gdHJ1ZSBhZnRlciBmaXJzdCByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBwcm9jZXNzZWQKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPD4gbmlsKSI7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgb3V0IDw8ICIgYW5kIF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIGJlZ2luIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIG5vdCAiIDw8IHRtcF9maXJzdCA8PCAiIHRoZW4gIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJywnKTsiIDw8IGVuZGw7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6PSBGQUxTRTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJywgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPSBuaWwpIHRoZW4gIiA8PCB0bXBfc2IKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIFNlbGYuIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoU3lzdGVtLkludGVnZXIoIFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCBTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKG51bGxfYWxsb3dlZCB8fCBpc19vcHRpb25hbCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWlzX29wdGlvbmFsKSB7CisgICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnKScpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgdG1wX3NiIDw8ICIuVG9TdHJpbmc7IiA8PCBlbmRsOworICBpZiAodXNlRmlyc3RGbGFnKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuIHtwcmV2ZW50IHdhcm5pbmd9OyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5GcmVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfdm9pZCh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZGVscGhpLAorICAgICJkZWxwaGkiLAorICAgICIgICAgYW5zaXN0cl9iaW5hcnk6ICBVc2UgQW5zaVN0cmluZyBmb3IgYmluYXJ5IGRhdGF0eXBlIChkZWZhdWx0IGlzIFRCeXRlcykuXG4iCisgICAgIiAgICByZWdpc3Rlcl90eXBlczogIEVuYWJsZSBUeXBlUmVnaXN0cnksIGFsbG93cyBmb3IgY3JlYXRpb24gb2Ygc3RydWN0LCB1bmlvblxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgY29udGFpbmVyIGluc3RhbmNlcyBieSBpbnRlcmZhY2Ugb3IgVHlwZUluZm8oKVxuIgorICAgICIgICAgY29uc3RwcmVmaXg6ICAgICBOYW1lIFRDb25zdGFudHMgY2xhc3NlcyBhZnRlciBJREwgdG8gcmVkdWNlIGFtYmlndWl0aWVzXG4iCisgICAgIiAgICBldmVudHM6ICAgICAgICAgIEVuYWJsZSBhbmQgdXNlIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiIKKyAgICAiICAgIHhtbGRvYzogICAgICAgICAgRW5hYmxlIFhNTERvYyBjb21tZW50cyBmb3IgSGVscCBJbnNpZ2h0IGV0Yy5cbiIKKyAgICAiICAgIGFzeW5jOiAgICAgICAgICAgR2VuZXJhdGUgSUFzeW5jIGludGVyZmFjZSB0byB1c2UgUGFyYWxsZWwgUHJvZ3JhbW1pbmcgTGlicmFyeSAoWEU3KyBvbmx5KS5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkOTFhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBFcmxhbmcgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2VybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2VybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsZWdhY3lfbmFtZXNfID0gZmFsc2U7CisgICAgbWFwc18gPSBmYWxzZTsKKyAgICBvdHAxNl8gPSBmYWxzZTsKKyAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxlZ2FjeW5hbWVzIikgPT0gMCkgeworICAgICAgICBsZWdhY3lfbmFtZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWFwcyIpID09IDApIHsKKyAgICAgICAgbWFwc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJvdHAxNiIpID09IDApIHsKKyAgICAgICAgb3RwMTZfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBlcmw6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXBzXyAmJiBvdHAxNl8pIHsKKyAgICAgIHRocm93ICJhcmd1bWVudCBlcnJvcjogQ2Fubm90IHNwZWNpZnkgYm90aCBtYXBzIGFuZCBvdHAxNjsgbWFwcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgRXJsYW5nL09UUCBSMTYgb3Igb2xkZXIiOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWVybCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3R5cGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3R5cGUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3ZhbHVlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCogZmllbGQpOworCisgIC8vICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3R5cGVfdGVybSh0X3R5cGUqIHR0eXBlLCBib29sIGV4cGFuZF9zdHJ1Y3RzLCBib29sIGV4dGVuZGVkX2luZm8gPSBmYWxzZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9tZW1iZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9leHRlbmRlZF9zdHJ1Y3RfaW5mbyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YShzdGQ6OnN0cmluZyBmdW5jdGlvbl9uYW1lLCB2ZWN0b3I8c3RyaW5nPiBuYW1lcyk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9pbmZvKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbih0X2NvbnN0KiB0Y29uc3QsIG9zdHJpbmdzdHJlYW0mIGV4cG9ydHMsIG9zdHJpbmdzdHJlYW0mIGZ1bmN0aW9ucyk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGVybF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgZXJsX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKTsKKworICBzdGQ6OnN0cmluZyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKKyAgICAgIHJldHVybiBkZWNhcGl0YWxpemUoaW4pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdW5kZXJzY29yZShpbik7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgYXRvbWlmeShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gIiciICsgZGVjYXBpdGFsaXplKGluKSArICInIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICInIiArIGluICsgIiciOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0aWZ5KHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKKyAgICAgIHJldHVybiBjYXBpdGFsaXplKGluKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHVwcGVyY2FzZShpbik7CisgICAgfQorICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbW1lbnQoc3RyaW5nIGluKTsKKworcHJpdmF0ZToKKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKik7CisKKyAgLyogaWYgdHJ1ZSByZXRhaW4gcHJlIDAuOS4yIG5hbWluZyBzY2hlbWUgZm9yIGZ1bmN0aW9ucywgYXRvbXMgYW5kIGNvbnN0cyAqLworICBib29sIGxlZ2FjeV9uYW1lc187CisKKyAgLyogaWYgdHJ1ZSB1c2UgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzIGluIGdlbmVyYXRlZCBjb2RlICovCisgIGJvb2wgbWFwc187CisKKyAgLyogaWYgdHJ1ZSB1c2Ugbm9uLW5hbWVzcGFjZWQgZGljdCBhbmQgc2V0IGluc3RlYWQgb2YgZGljdDpkaWN0IGFuZCBzZXRzOnNldCAqLworICBib29sIG90cDE2XzsKKworICAvKioKKyAgICogYWRkIGZ1bmN0aW9uIHRvIGV4cG9ydCBsaXN0CisgICAqLworCisgIHZvaWQgZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGV4cG9ydF9zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7CisKKyAgdm9pZCBleHBvcnRfdHlwZXNfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOworCisgIC8qKgorICAgKiB3cml0ZSBvdXQgaGVhZGVycyBhbmQgZm9vdGVycyBmb3IgaHJsIGZpbGVzCisgICAqLworCisgIHZvaWQgaHJsX2hlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgaHJsX2Zvb3RlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisKKyAgLyoqCisgICAqIHN0dWZmIHRvIHNwaXQgb3V0IGF0IHRoZSB0b3Agb2YgZ2VuZXJhdGVkIGZpbGVzCisgICAqLworCisgIGJvb2wgZXhwb3J0X2xpbmVzX2ZpcnN0XzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF9saW5lc187CisKKyAgYm9vbCBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X3R5cGVzX2xpbmVzXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvX2V4dF87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfaHJsX2ZpbGVfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfaHJsX2ZpbGVfOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfaHJsXzsKKworICAvKioKKyAgICogTWV0YWRhdGEgY29udGFpbmVycworICAgKi8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfc3RydWN0X25hbWVzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfZW51bV9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X2V4Y2VwdGlvbl9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHRfZW51bSo+IHZfZW51bXNfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gdl9jb25zdHNfOworfTsKKworLyoqCisgKiBVSSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBzZXR1cCBleHBvcnQgbGluZXMKKyAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSB0cnVlOworCisgIHN0cmluZyBwcm9ncmFtX21vZHVsZV9uYW1lID0gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKTsKKworICAvLyB0eXBlcyBmaWxlcworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzLmVybCI7CisgIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzLmhybCI7CisKKyAgZl90eXBlc19maWxlXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgZl90eXBlc19ocmxfZmlsZV8ub3BlbihmX3R5cGVzX2hybF9uYW1lLmNfc3RyKCkpOworCisgIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzIik7CisKKyAgZl90eXBlc19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICItbW9kdWxlKCIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7CisKKyAgLy8gY29uc3RzIGZpbGVzCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX2NvbnN0YW50cy5lcmwiOworICBzdHJpbmcgZl9jb25zdHNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfY29uc3RhbnRzLmhybCI7CisKKyAgZl9jb25zdHNfZmlsZV8ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBmX2NvbnN0c19ocmxfZmlsZV8ub3BlbihmX2NvbnN0c19ocmxfbmFtZS5jX3N0cigpKTsKKworICBmX2NvbnN0c19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl9jb25zdGFudHMpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfY29uc3RzX2hybF9maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBCb2lsZXJwbGF0ZSBhdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBoZWFkZXIgZmlsZXMKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9oZWFkZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICBvdXQgPDwgIi1pZm5kZWYoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkKS4iIDw8IGVuZGwgPDwgIi1kZWZpbmUoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkLCB5ZWFoKS4iCisgICAgICA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2Zvb3Rlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIG91dCA8PCAiLWVuZGlmLiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVzdWx0ICs9ICItaW5jbHVkZShcIiIgKyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICArICJfdHlwZXMuaHJsXCIpLlxuIjsKKyAgfQorICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSAiXG4iOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIlJVxuIikgKyAiJSUgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIlJVxuIiArICIlJSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICArICIlJVxuIjsKK30KKworLyoqCisgKiBDb21tZW50IG91dCB0ZXh0CisgKi8KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6Y29tbWVudChzdHJpbmcgaW4pIHsKKyAgc2l6ZV90IHBvcyA9IDA7CisgIGluLmluc2VydChwb3MsICIlJSAiKTsKKyAgd2hpbGUgKChwb3MgPSBpbi5maW5kX2ZpcnN0X29mKCdcbicsIHBvcykpICE9IHN0cmluZzo6bnBvcykgeworICAgIGluLmluc2VydCgrK3BvcywgIiUlICIpOworICB9CisgIHJldHVybiBpbjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2ltcG9ydHMoKSB7CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mb19leHQiLCAxKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygiZW51bV9pbmZvIiwgMSk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImVudW1fbmFtZXMiLCAwKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X25hbWVzIiwgMCk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImV4Y2VwdGlvbl9uYW1lcyIsIDApOworCisgIGZfdHlwZXNfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X3R5cGVzX2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fLnN0cigpOworICBmX3R5cGVzX2ZpbGVfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ZpbGVfIDw8IGZfaW5mb19leHRfLnN0cigpOworICBmX3R5cGVzX2ZpbGVfIDw8ICJzdHJ1Y3RfaW5mb19leHQoXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCk7CisKKyAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgic3RydWN0X25hbWVzIiwgdl9zdHJ1Y3RfbmFtZXNfKTsKKyAgZ2VuZXJhdGVfZW51bV9tZXRhZGF0YSgpOworICBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKCJlbnVtX25hbWVzIiwgdl9lbnVtX25hbWVzXyk7CisgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoImV4Y2VwdGlvbl9uYW1lcyIsIHZfZXhjZXB0aW9uX25hbWVzXyk7CisKKyAgaHJsX2Zvb3RlcihmX3R5cGVzX2hybF9maWxlXywgc3RyaW5nKCJCT0dVUyIpKTsKKworICBmX3R5cGVzX2ZpbGVfLmNsb3NlKCk7CisgIGZfdHlwZXNfaHJsX2ZpbGVfLmNsb3NlKCk7CisgIGZfY29uc3RzX2ZpbGVfLmNsb3NlKCk7CisgIGZfY29uc3RzX2hybF9maWxlXy5jbG9zZSgpOworfQorCitjb25zdCBzdGQ6OnN0cmluZyBlbWl0X2RvdWJsZV9hc19zdHJpbmcoY29uc3QgZG91YmxlIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvdWJsZV9vdXRwdXRfc3RyZWFtOworICAvLyBzZXRzIHRoZSBtYXhpbXVtIHByZWNpc2lvbjogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvc2V0cHJlY2lzaW9uCisgIC8vIHNldHMgdGhlIG91dHB1dCBmb3JtYXQgdG8gZml4ZWQ6IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL2ZpeGVkIChub3QgaW4gc2NpZW50aWZpYyBub3RhdGlvbikKKyAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDEpOworCisgICNpZmRlZiBfTVNDX1ZFUgorICAgICAgLy8gc3RydG9kIGlzIGJyb2tlbiBpbiBNU1ZDIGNvbXBpbGVycyBvbGRlciB0aGFuIDIwMTUsIHNvIHN0ZDo6Zml4ZWQgZmFpbHMgdG8gZm9ybWF0IGEgZG91YmxlIGxpdGVyYWwuCisgICAgICAvLyBtb3JlIGRldGFpbHM6IGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL3ZjYmxvZy8yMDE0LzA2LzE4LworICAgICAgLy8gICAgICAgICAgICAgICBjLXJ1bnRpbWUtY3J0LWZlYXR1cmVzLWZpeGVzLWFuZC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMTQtY3RwMS8KKyAgICAgIC8vICAgICAgICAgICAgICAgYW5kCisgICAgICAvLyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS92aXN1YWwtYy1wbHVzLXBsdXMtc3RydG9kLXN0aWxsLWJyb2tlbi8KKyAgICAgICNpZiBfTVNDX1ZFUiA+PSBNU0NfMjAxNV9WRVIKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAgICAgI2Vsc2UKKyAgICAgICAgICAvLyBub3RlIHRoYXQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgZXJsYW5nIGdlbmVyYXRvciBhbmQgdGhlIE1TVkMgY29tcGlsZXIgaXMgb2xkZXIgdGhhbiAyMDE1LAorICAgICAgICAgIC8vIHRoZSBkb3VibGUgbGl0ZXJhbCBtdXN0IGJlIG91dHB1dCBpbiB0aGUgc2NpZW50aWZpYyBmb3JtYXQuIFRoZXJlIGNhbiBiZSBzb21lIGNhc2VzIHdoZXJlIHRoZQorICAgICAgICAgIC8vIG1hbnRpc3NhIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgaGF2ZSBmcmFjdGlvbmFscywgd2hpY2ggaXMgaWxsZWdhbCBpbiBFcmxhbmcuCisgICAgICAgICAgLy8gZXhhbXBsZSA9PiAxMDAwMDAwMDAwMDAwMDAwMC4wIGJlaW5nIG91dHB1dCBhcyAxZSsxNgorICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2NpZW50aWZpYzsKKyAgICAgICNlbmRpZgorICAjZWxzZQorICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgI2VuZGlmCisKKyAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgdmFsdWU7CisKKyAgcmV0dXJuIGRvdWJsZV9vdXRwdXRfc3RyZWFtLnN0cigpOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZV9tZXRhZGF0YShzdGQ6OnN0cmluZyBmdW5jdGlvbl9uYW1lLCB2ZWN0b3I8c3RyaW5nPiBuYW1lcykgeworICBzaXplX3QgbnVtX3N0cnVjdHMgPSBuYW1lcy5zaXplKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8IGZ1bmN0aW9uX25hbWUgPDwgIigpIC0+XG4iOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJbIjsKKworCisgIGZvcihzaXplX3QgaT0wOyBpIDwgbnVtX3N0cnVjdHM7IGkrKykgeworICAgIGZfdHlwZXNfZmlsZV8gPDwgbmFtZXMuYXQoaSk7CisKKyAgICBpZiAoaSA8IG51bV9zdHJ1Y3RzIC0gMSkgeworICAgICAgZl90eXBlc19maWxlXyA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIGZfdHlwZXNfZmlsZV8gPDwgIl0uXG5cbiI7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gbm8gb3AKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbih0X2NvbnN0KiB0Y29uc3QsIG9zdHJpbmdzdHJlYW0mIGV4cG9ydHMsIG9zdHJpbmdzdHJlYW0mIGZ1bmN0aW9ucykgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHN0cmluZyBjb25zdF9mdW5fbmFtZSA9IGxvd2VyY2FzZShuYW1lKTsKKworICAgIC8vIEVtaXQgY29uc3QgZnVuY3Rpb24gZXhwb3J0LgorICAgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7IGV4cG9ydHMgPDwgIiwgIjsgfQorICAgIGV4cG9ydHMgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8xLCAiIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMiI7CisKKyAgICAvLyBFbWl0IGNvbnN0IGZ1bmN0aW9uIGRlZmluaXRpb24uCisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgLy8gVGhlIG9uZS1hcmd1bWVudCBmb3JtIHRocm93cyBhbiBlcnJvciBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAuCisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIikgLT4gIgorICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgaS0+c2Vjb25kKTsKKyAgICAgICsraTsKKyAgICAgIGZ1bmN0aW9ucyA8PCAoaSAhPSBlbmQgPyAiO1xuIiA6ICIuXG5cbiIpOworICAgIH0KKworICAgIC8vIFRoZSB0d28tYXJndW1lbnQgZm9ybSByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAuCisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisgICAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIigiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIsIF8pIC0+ICIKKyAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCkgPDwgIjtcbiI7CisgICAgfQorICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKF8sIERlZmF1bHQpIC0+IERlZmF1bHQuXG5cbiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGNvbnN0X2Z1bl9uYW1lID0gbG93ZXJjYXNlKG5hbWUpOworCisgICAgaWYgKGV4cG9ydHMudGVsbHAoKSA+IDApIHsgZXhwb3J0cyA8PCAiLCAiOyB9CisgICAgZXhwb3J0cyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzEsICIgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8yIjsKKworICAgIHNpemVfdCBsaXN0X3NpemUgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5zaXplKCk7CisgICAgc3RyaW5nIHJlbmRlcmVkX2xpc3QgPSByZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModHlwZSwgdmFsdWUpOworICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKE4pIHdoZW4gTiA+PSAxLCBOID08ICIgPDwgbGlzdF9zaXplIDw8ICIgLT5cbiIKKyAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbGVtZW50KE4sIHsiIDw8IHJlbmRlcmVkX2xpc3QgPDwgIn0pLlxuIjsKKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihOLCBfKSB3aGVuIE4gPj0gMSwgTiA9PCAiIDw8IGxpc3Rfc2l6ZSA8PCAiIC0+XG4iCisgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxlbWVudChOLCB7IiA8PCByZW5kZXJlZF9saXN0IDw8ICJ9KTtcbiIKKyAgICAgICAgICAgICAgPDwgY29uc3RfZnVuX25hbWUgPDwgIihfLCBEZWZhdWx0KSAtPiBEZWZhdWx0LlxuXG4iOworICAgIGluZGVudF9kb3duKCk7CisgIH0KK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpIHsKKyAgb3N0cmluZ3N0cmVhbSBleHBvcnRzOworICBvc3RyaW5nc3RyZWFtIGZ1bmN0aW9uczsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IHZfY29uc3RzXy5iZWdpbigpOyBjX2l0ZXIgIT0gdl9jb25zdHNfLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9uKCpjX2l0ZXIsIGV4cG9ydHMsIGZ1bmN0aW9ucyk7CisgIH0KKyAgaWYgKGV4cG9ydHMudGVsbHAoKSA+IDApIHsKKyAgICBmX2NvbnN0c19maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRzLnN0cigpIDw8ICJdKS5cblxuIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zdHIoKTsKKyAgfQorfQorCisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgdl9lbnVtc18ucHVzaF9iYWNrKHRlbnVtKTsKKyAgdl9lbnVtX25hbWVzXy5wdXNoX2JhY2soYXRvbWlmeSh0ZW51bS0+Z2V0X25hbWUoKSkpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQoZl90eXBlc19ocmxfZmlsZV8pIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfIiA8PCBjb25zdGlmeSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIl8iIDw8IGNvbnN0aWZ5KG5hbWUpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICIpLiIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfaHJsX2ZpbGVfIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2luZm8odF9lbnVtKiB0ZW51bSl7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICBzaXplX3QgbnVtX2NvbnN0YW50cyA9IGNvbnN0YW50cy5zaXplKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJlbnVtX2luZm8oIiA8PCBhdG9taWZ5KHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiKSAtPlxuIjsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiW1xuIjsKKworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IG51bV9jb25zdGFudHM7IGkrKykgeworICAgIGluZGVudF91cCgpOworICAgIHRfZW51bV92YWx1ZSogdmFsdWUgPSBjb25zdGFudHMuYXQoaSk7CisgICAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJ7IiA8PCBhdG9taWZ5KHZhbHVlLT5nZXRfbmFtZSgpKSA8PCAiLCAiIDw8IHZhbHVlLT5nZXRfdmFsdWUoKSA8PCAifSI7CisKKyAgICBpZiAoaSA8IG51bV9jb25zdGFudHMgLSAxKSB7CisgICAgICBmX3R5cGVzX2ZpbGVfIDw8ICIsXG4iOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfdHlwZXNfZmlsZV8gPDwgIlxuIjsKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJdO1xuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9tZXRhZGF0YSgpIHsKKyAgc2l6ZV90IGVudW1fY291bnQgPSB2X2VudW1zXy5zaXplKCk7CisKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBlbnVtX2NvdW50OyBpKyspIHsKKyAgICB0X2VudW0qIHRlbnVtID0gdl9lbnVtc18uYXQoaSk7CisgICAgZ2VuZXJhdGVfZW51bV9pbmZvKHRlbnVtKTsKKyAgfQorCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiZW51bV9pbmZvKF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLlxuXG4iOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgLy8gU2F2ZSB0aGUgdGNvbnN0IHNvIHRoYXQgZnVuY3Rpb24gY2FuIGJlIGVtaXR0ZWQgaW4gZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCkuCisgIHZfY29uc3RzXy5wdXNoX2JhY2sodGNvbnN0KTsKKworICBmX2NvbnN0c19ocmxfZmlsZV8gPDwgIi1kZWZpbmUoIiA8PCBjb25zdGlmeShtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pKSA8PCAiXyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0aWZ5KG5hbWUpIDw8ICIsICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiKS4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgImZsb2F0KCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIjIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgInsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIG91dCA8PCAiID0gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgaWYgKG1hcHNfKSB7CisgICAgICBvdXQgPDwgIm1hcHM6ZnJvbV9saXN0KFsiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImRpY3Q6ZnJvbV9saXN0KFsiOworICAgIH0KKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgb3V0IDw8ICJ7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiLCIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCkgPDwgIn0iOworICAgICAgaWYgKCsraSAhPSBlbmQpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBvdXQgPDwgInNldHM6ZnJvbV9saXN0KFsiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbGlzdCgpLmVuZCgpOworICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbGlzdCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKmkpOworICAgICAgaWYgKCsraSAhPSBlbmQpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModHlwZSwgdmFsdWUpIDw8ICJdIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiIyIgKyB0eXBlX25hbWUodHlwZSkgKyAie30iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKG1hcHNfKSB7CisgICAgICByZXR1cm4gIiN7fSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZGljdDpuZXcoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXRzOm5ldygpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIltdIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInVuZGVmaW5lZCI7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmcoKSB8IGJpbmFyeSgpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2xlYW4oKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaW50ZWdlcigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZmxvYXQoKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludGVnZXIoKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHlwZSkgKyAiKCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKG1hcHNfKSB7CisgICAgICByZXR1cm4gIm1hcCgpIjsKKyAgICB9IGVsc2UgaWYgKG90cDE2XykgeworICAgICAgcmV0dXJuICJkaWN0KCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImRpY3Q6ZGljdCgpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAob3RwMTZfKSB7CisgICAgICByZXR1cm4gInNldCgpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJzZXRzOnNldCgpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0KCkiOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkKiBmaWVsZCkgeworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHJldHVybiAicmVxdWlyZWQiOworICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgcmV0dXJuICJvcHRpb25hbCI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJ1bmRlZmluZWQiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgdl9zdHJ1Y3RfbmFtZXNfLnB1c2hfYmFjayh0eXBlX25hbWUodHN0cnVjdCkpOworICBnZW5lcmF0ZV9lcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgdl9leGNlcHRpb25fbmFtZXNfLnB1c2hfYmFjayh0eXBlX25hbWUodHhjZXB0aW9uKSk7CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWlzX2V4Y2VwdGlvbjsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaHJsX2ZpbGVfLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKGZfaW5mb18sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oZl9pbmZvX2V4dF8sIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiJSUgc3RydWN0ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgIGJ1ZiA8PCBpbmRlbnQoKSA8PCAiLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKKyAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9tZW1iZXIoYnVmLCAqbV9pdGVyKTsKKyAgICBpZiAoKyttX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgeworICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKKyAgICB9CisgIH0KKyAgYnVmIDw8ICJ9KS4iOworCisgIG91dCA8PCBidWYuc3RyKCkgPDwgZW5kbDsKKyAgb3V0IDw8ICItdHlwZSAiICsgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSA6OiAjIiArIHR5cGVfbmFtZSh0c3RydWN0KSArICJ7fS4iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlY29yZCBmaWVsZCBkZWZpbml0aW9uCisgKi8KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgeworICBvdXQgPDwgYXRvbWlmeSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKHRtZW1iZXIpKQorICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfbWVtYmVyX3ZhbHVlKHRtZW1iZXIpOworICBvdXQgPDwgIiA6OiAiIDw8IHJlbmRlcl9tZW1iZXJfdHlwZSh0bWVtYmVyKTsKKyAgaWYgKHRtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgIG91dCA8PCAiIHwgJ3VuZGVmaW5lZCciOworfQorCitib29sIHRfZXJsX2dlbmVyYXRvcjo6aGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgIGlmICghZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkKKyAgICAgICAgICB8fCB0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIWZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIHJldHVybiByZW5kZXJfZGVmYXVsdF92YWx1ZShmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3R5cGUoKSwgZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RydWN0X2luZm9fZXh0KCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc2VydmljZV9uYW1lXyA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoc2VydmljZV9uYW1lXyk7CisKKyAgc3RyaW5nIGZfc2VydmljZV9ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuaHJsIjsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiX3RocmlmdC5lcmwiOworICBmX3NlcnZpY2VfZmlsZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgZl9zZXJ2aWNlX2hybF8ub3BlbihmX3NlcnZpY2VfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUmVzZXQgc2VydmljZSB0ZXh0IGFnZ3JlZ2F0aW5nIHN0cmVhbSBzdHJlYW1zCisgIGZfc2VydmljZV8uc3RyKCIiKTsKKyAgZXhwb3J0X2xpbmVzXy5zdHIoIiIpOworICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICBocmxfaGVhZGVyKGZfc2VydmljZV9ocmxfLCBzZXJ2aWNlX25hbWVfKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV9ocmxfIDw8ICItaW5jbHVkZShcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0LmhybFwiKS4gJSBpbmhlcml0ICIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV9ocmxfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzLmhybFwiKS4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOyAvLyBjcGlybzogTmV3IEVybGFuZyBPcmRlcgorCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGFkYXRhKHRzZXJ2aWNlKTsKKworICAvLyBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV9maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCAiLW1vZHVsZSgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl90aHJpZnQpLiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi1iZWhhdmlvdXIodGhyaWZ0X3NlcnZpY2UpLiIgPDwgZW5kbCA8PCBlbmRsIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQuaHJsXCIpLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2VydmljZV9maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRfbGluZXNfLnN0cigpIDw8ICJdKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgZl9zZXJ2aWNlXy5zdHIoKTsKKworICBocmxfZm9vdGVyKGZfc2VydmljZV9ocmxfLCBmX3NlcnZpY2VfbmFtZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV9maWxlXy5jbG9zZSgpOworICBmX3NlcnZpY2VfaHJsXy5jbG9zZSgpOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX25hbWVzIiwgMCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc2l6ZV90IG51bV9mdW5jdGlvbnMgPSBmdW5jdGlvbnMuc2l6ZSgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25fbmFtZXMoKSAtPiAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlsiOworCisgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG51bV9mdW5jdGlvbnM7IGkrKykgeworICAgIHRfZnVuY3Rpb24qIGN1cnJlbnQgPSBmdW5jdGlvbnMuYXQoaSk7CisgICAgZl9zZXJ2aWNlXyA8PCBhdG9taWZ5KGN1cnJlbnQtPmdldF9uYW1lKCkpOworICAgIGlmIChpIDwgbnVtX2Z1bmN0aW9ucyAtIDEpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJdLlxuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyAgaW5kZW50KGZfc2VydmljZV8pIDw8CisgIC8vICAiJSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZXhwb3J0X3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9CisgIGZfc2VydmljZV8gPDwgInN0cnVjdF9pbmZvKF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0ZnVuY3Rpb247Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9pbmZvIiwgMik7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgIiUlJSBpbnRlcmZhY2UiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpIC0+IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdDpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkuIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgLy8gcmV0dXJuIGZ1bmN0aW9uX2NsYXVzZSBlcnJvciBmb3Igbm9uLWV4aXN0ZW50IGZ1bmN0aW9ucworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhfRnVuYywgX0luZm8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCBwYXJhbXNfdHlwZSkgYW5kCisgKiBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcmVwbHlfdHlwZSkKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBzdHJpbmcgbmFtZV9hdG9tID0gYXRvbWlmeSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKworICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBwYXJhbXNfdHlwZSkgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCByZXBseV90eXBlKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgZWxzZSBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9uZXdheV92b2lkOyIgPDwgZW5kbDsKKyAgZWxzZQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAie3N0cnVjdCwgW119IgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBleGNlcHRpb25zKToKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIGV4Y2VwdGlvbnMpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0oeHMsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICByZXR1cm4gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIihUaGlzIgorICAgICAgICAgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSkgKyAiKSI7Cit9CisKKy8qKgorICogQWRkIGEgZnVuY3Rpb24gdG8gdGhlIGV4cG9ydHMgbGlzdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgeworICBpZiAoZXhwb3J0X2xpbmVzX2ZpcnN0XykgeworICAgIGV4cG9ydF9saW5lc19maXJzdF8gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRfbGluZXNfIDw8ICIsICI7CisgIH0KKyAgZXhwb3J0X2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfdHlwZXNfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7CisgIGlmIChleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfKSB7CisgICAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGV4cG9ydF90eXBlc19saW5lc18gPDwgIiwgIjsKKyAgfQorICBleHBvcnRfdHlwZXNfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6c2l6ZV90eXBlIG51bSA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCk7CisgIGlmIChudW0gPiBzdGF0aWNfY2FzdDx0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpzaXplX3R5cGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50PigpLm1heCgpKSkgeworICAgIHRocm93ICJpbnRlZ2VyIG92ZXJmbG93IGluIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uLCBuYW1lICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0KKyAgZXhwb3J0X3N0cmluZyhwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgMSAvLyBUaGlzCisgICAgICAgICAgICAgICAgKyBzdGF0aWNfY2FzdDxpbnQ+KG51bSkpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcmVzdWx0ICs9ICIsICI7IC8vIGluaXRpYWwgY29tbWEgdG8gY29tcGVuc2F0ZSBmb3IgaW5pdGlhbCBUaGlzCisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiZXJsIik7CisgIHNpemVfdCBwcmVmaXhfbGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpOworICBpZiAocHJlZml4X2xlbmd0aCA+IDAgJiYgcHJlZml4W3ByZWZpeF9sZW5ndGggLSAxXSAhPSAnXycpIHsKKyAgICBwcmVmaXggKz0gJy4nOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKworICByZXR1cm4gYXRvbWlmeShwcmVmaXggKyBuYW1lKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEVybGFuZyAidHlwZSIgKG1hY3JvIGZvciBpbnQgY29uc3RhbnRzKQorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICI/dFR5cGVfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIj90VHlwZV9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiP3RUeXBlX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIj90VHlwZV9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI/dFR5cGVfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiP3RUeXBlX01BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiP3RUeXBlX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGFuIEVybGFuZyB0ZXJtIHdoaWNoIHJlcHJlc2VudHMgYSB0aHJpZnQgdHlwZQorICovCitzdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhwYW5kX3N0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlbmRlZF9pbmZvKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaWYgKGV4cGFuZF9zdHJ1Y3RzKSB7CisKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgICAgIGJ1ZiA8PCAie3N0cnVjdCwgWyI7CisgICAgICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7CisKKyAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGUgY29uc3QmIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSBmaWVsZHMuZW5kKCk7CisgICAgICBmb3IgKGkgPSBmaWVsZHMuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnZhbHVlX3R5cGUgbWVtYmVyID0gKmk7CisgICAgICAgIGludDMyX3Qga2V5ID0gbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX3R5cGVfdGVybShtZW1iZXItPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk7IC8vIHJlY3Vyc2l2ZSBjYWxsCisKKyAgICAgICAgaWYgKCFleHRlbmRlZF9pbmZvKSB7CisgICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBUeXBlfXwuLi5dfQorICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgPDwgdHlwZSA8PCAifSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBSZXEsIFR5cGUsIE5hbWUsIERlZn18Li4uXX0KKyAgICAgICAgICBzdHJpbmcgbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBzdHJpbmcgdmFsdWUgPSByZW5kZXJfbWVtYmVyX3ZhbHVlKG1lbWJlcik7CisgICAgICAgICAgc3RyaW5nIHJlcXVpcmVkbmVzcyA9IHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKG1lbWJlcik7CisgICAgICAgICAgYnVmIDw8ICJ7IiA8PCBrZXkgPDwgIiwgIiA8PCByZXF1aXJlZG5lc3MgPDwgIiwgIiA8PCB0eXBlIDw8ICIsICIgPDwgYXRvbWlmeShuYW1lKSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICJ9IjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBidWYgPDwgIl19IiA8PCBlbmRsOworICAgICAgcmV0dXJuIGJ1Zi5zdHIoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJ7c3RydWN0LCB7IiArIGF0b21pZnkodHlwZV9tb2R1bGUodHlwZSkpICsgIiwgIiArIHR5cGVfbmFtZSh0eXBlKSArICJ9fSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgLy8ge21hcCwgS2V5VHlwZSwgVmFsVHlwZX0KKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICByZXR1cm4gInttYXAsICIgKyByZW5kZXJfdHlwZV90ZXJtKGtleV90eXBlLCBmYWxzZSkgKyAiLCAiICsgcmVuZGVyX3R5cGVfdGVybSh2YWxfdHlwZSwgZmFsc2UpCisgICAgICAgICAgICsgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICByZXR1cm4gIntzZXQsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIHJldHVybiAie2xpc3QsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpIHsKKyAgcmV0dXJuIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIl90eXBlcyI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZXJsLAorICAgICJFcmxhbmciLAorICAgICIgICAgbGVnYWN5bmFtZXM6IE91dHB1dCBmaWxlcyByZXRhaW4gbmFtaW5nIGNvbnZlbnRpb25zIG9mIFRocmlmdCAwLjkuMSBhbmQgZWFybGllci5cbiIKKyAgICAiICAgIG1hcHM6ICAgICAgICBHZW5lcmF0ZSBtYXBzIGluc3RlYWQgb2YgZGljdHMuXG4iCisgICAgIiAgICBvdHAxNjogICAgICAgR2VuZXJhdGUgbm9uLW5hbWVzcGFjZWQgZGljdCBhbmQgc2V0IGluc3RlYWQgb2YgZGljdDpkaWN0IGFuZCBzZXRzOnNldC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2Y1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvKioKKyAqIFRvcCBsZXZlbCBwcm9ncmFtIGdlbmVyYXRpb24gZnVuY3Rpb24uIENhbGxzIHRoZSBnZW5lcmF0b3Igc3ViY2xhc3MgbWV0aG9kcworICogZm9yIHByZXBhcmluZyBmaWxlIHN0cmVhbXMgZXRjLiB0aGVuIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiB0aGUKKyAqIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBhY3Rpb25zLgorICoKKyAqIEBwYXJhbSBwcm9ncmFtIFRoZSB0aHJpZnQgcHJvZ3JhbSB0byBjb21waWxlIGludG8gQysrIHNvdXJjZQorICovCit2b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbigqb19pdGVyKTsKKyAgfQorICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgorICBjbG9zZV9nZW5lcmF0b3IoKTsKK30KKworc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRfZ2VuZXJhdG9yOjpsYW5nX2tleXdvcmRzKCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBrZXl3b3Jkc1tdID0geyAiQkVHSU4iLCAiRU5EIiwgIl9fQ0xBU1NfXyIsICJfX0RJUl9fIiwgIl9fRklMRV9fIiwgIl9fRlVOQ1RJT05fXyIsCisgICAgICAiX19MSU5FX18iLCAiX19NRVRIT0RfXyIsICJfX05BTUVTUEFDRV9fIiwgImFic3RyYWN0IiwgImFsaWFzIiwgImFuZCIsICJhcmdzIiwgImFzIiwKKyAgICAgICJhc3NlcnQiLCAiYmVnaW4iLCAiYnJlYWsiLCAiY2FzZSIsICJjYXRjaCIsICJjbGFzcyIsICJjbG9uZSIsICJjb250aW51ZSIsICJkZWNsYXJlIiwKKyAgICAgICJkZWYiLCAiZGVmYXVsdCIsICJkZWwiLCAiZGVsZXRlIiwgImRvIiwgImR5bmFtaWMiLCAiZWxpZiIsICJlbHNlIiwgImVsc2VpZiIsICJlbHNpZiIsCisgICAgICAiZW5kIiwgImVuZGRlY2xhcmUiLCAiZW5kZm9yIiwgImVuZGZvcmVhY2giLCAiZW5kaWYiLCAiZW5kc3dpdGNoIiwgImVuZHdoaWxlIiwgImVuc3VyZSIsCisgICAgICAiZXhjZXB0IiwgImV4ZWMiLCAiZmluYWxseSIsICJmbG9hdCIsICJmb3IiLCAiZm9yZWFjaCIsICJmcm9tIiwgImZ1bmN0aW9uIiwgImdsb2JhbCIsCisgICAgICAiZ290byIsICJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbiIsICJpbmxpbmUiLCAiaW5zdGFuY2VvZiIsICJpbnRlcmZhY2UiLCAiaXMiLAorICAgICAgImxhbWJkYSIsICJtb2R1bGUiLCAibmF0aXZlIiwgIm5ldyIsICJuZXh0IiwgIm5pbCIsICJub3QiLCAib3IiLCAicGFja2FnZSIsICJwYXNzIiwKKyAgICAgICJwdWJsaWMiLCAicHJpbnQiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicmFpc2UiLCAicmVkbyIsICJyZXNjdWUiLCAicmV0cnkiLCAicmVnaXN0ZXIiLAorICAgICAgInJldHVybiIsICJzZWxmIiwgInNpemVvZiIsICJzdGF0aWMiLCAic3VwZXIiLCAic3dpdGNoIiwgInN5bmNocm9uaXplZCIsICJ0aGVuIiwgInRoaXMiLAorICAgICAgInRocm93IiwgInRyYW5zaWVudCIsICJ0cnkiLCAidW5kZWYiLCAidW5sZXNzIiwgInVuc2lnbmVkIiwgInVudGlsIiwgInVzZSIsICJ2YXIiLAorICAgICAgInZpcnR1YWwiLCAidm9sYXRpbGUiLCAid2hlbiIsICJ3aGlsZSIsICJ3aXRoIiwgInhvciIsICJ5aWVsZCIgfTsKKyAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihrZXl3b3Jkcywga2V5d29yZHMgKyBzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkgKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGVfaW5wdXQoKSBjb25zdCB7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfZW51bXMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfb2JqZWN0cygpKTsKKyAgdmFsaWRhdGUocHJvZ3JhbV8tPmdldF9jb25zdHMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfc2VydmljZXMoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUoY29uc3QgdmVjdG9yPFQ+JiBsaXN0KSBjb25zdHsKKyAgdHlwZW5hbWUgdmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yKGl0PWxpc3QuYmVnaW4oKTsgaXQgIT0gbGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgdmFsaWRhdGUoKml0KTsKKyAgfQorfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2Z1bmN0aW9uIGNvbnN0KiBmKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGYtPmdldF9uYW1lKCkpOworICB2YWxpZGF0ZShmLT5nZXRfYXJnbGlzdCgpKTsKKyAgdmFsaWRhdGUoZi0+Z2V0X3hjZXB0aW9ucygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9zZXJ2aWNlIGNvbnN0KiBzKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKHMtPmdldF9uYW1lKCkpOworICB2YWxpZGF0ZShzLT5nZXRfZnVuY3Rpb25zKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2VudW0gY29uc3QqIGVuKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGVuLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUoZW4tPmdldF9jb25zdGFudHMoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X3N0cnVjdCBjb25zdCogcykgY29uc3QgeworICB2YWxpZGF0ZV9pZChzLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUocy0+Z2V0X21lbWJlcnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfZW51bV92YWx1ZSBjb25zdCogZW5fdmFsKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGVuX3ZhbC0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X3R5cGVkZWYgY29uc3QqIHRkKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKHRkLT5nZXRfbmFtZSgpKTsKK30KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfY29uc3QgY29uc3QqIGMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQoYy0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2ZpZWxkIGNvbnN0KiBmKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGYtPmdldF9uYW1lKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZV9pZChjb25zdCBzdHJpbmcmIGlkKSBjb25zdCB7CisgIGlmIChrZXl3b3Jkc18uZmluZChpZCkgIT0ga2V5d29yZHNfLmVuZCgpKSB7CisgICAgZmFpbHVyZSgiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkOiBcIiVzXCIiLCBpZC5jX3N0cigpKTsKKyAgfQorfQorCitzdHJpbmcgdF9nZW5lcmF0b3I6OmVzY2FwZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbikgY29uc3QgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IGluLmJlZ2luKCk7IGl0IDwgaW4uZW5kKCk7IGl0KyspIHsKKyAgICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHJlcyA9IGVzY2FwZV8uZmluZCgqaXQpOworICAgIGlmIChyZXMgIT0gZXNjYXBlXy5lbmQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZChyZXMtPnNlY29uZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soKml0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jb25zdCgqY19pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpIHsKKyAgaWYgKCFjb21tZW50X3N0YXJ0LmVtcHR5KCkpCisgICAgaW5kZW50KG91dCkgPDwgY29tbWVudF9zdGFydDsKKyAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIGlvc19iYXNlOjppbik7CisgIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKSB7CisgICAgY2hhciBsaW5lWzEwMjRdOworICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKKworICAgIGlmIChzdHJsZW4obGluZSkgPiAwKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgaWYgKGxpbmVfcHJlZml4LmVtcHR5KCkpeworICAgICAgb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgaWYoIWRvY3MuZW9mKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCFjb21tZW50X2VuZC5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfZW5kOworfQorCit2b2lkIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSkgeworICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOworICBpZiAodGhlX21hcC5maW5kKGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkpICE9IHRoZV9tYXAuZW5kKCkpIHsKKyAgICBmYWlsdXJlKCJEdXBsaWNhdGUgZ2VuZXJhdG9ycyBmb3IgbGFuZ3VhZ2UgXCIlc1wiIVxuIiwgZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorICB0aGVfbWFwW2ZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCldID0gZmFjdG9yeTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhjb25zdCBzdHJpbmcmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gb3B0aW9ucy5maW5kKCc6Jyk7CisgIGxhbmd1YWdlID0gb3B0aW9ucy5zdWJzdHIoMCwgY29sb24pOworCisgIGlmIChjb2xvbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBjb2xvbiArIDE7CisgICAgd2hpbGUgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zIDwgb3B0aW9ucy5zaXplKCkpIHsKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5leHRfcG9zID0gb3B0aW9ucy5maW5kKCcsJywgcG9zKTsKKyAgICAgIHN0cmluZyBvcHRpb24gPSBvcHRpb25zLnN1YnN0cihwb3MsIG5leHRfcG9zIC0gcG9zKTsKKyAgICAgIHBvcyA9ICgobmV4dF9wb3MgPT0gc3RyaW5nOjpucG9zKSA/IG5leHRfcG9zIDogbmV4dF9wb3MgKyAxKTsKKworICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2VwYXJhdG9yID0gb3B0aW9uLmZpbmQoJz0nKTsKKyAgICAgIHN0cmluZyBrZXksIHZhbHVlOworICAgICAgaWYgKHNlcGFyYXRvciA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAga2V5ID0gb3B0aW9uOworICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAga2V5ID0gb3B0aW9uLnN1YnN0cigwLCBzZXBhcmF0b3IpOworICAgICAgICB2YWx1ZSA9IG9wdGlvbi5zdWJzdHIoc2VwYXJhdG9yICsgMSk7CisgICAgICB9CisKKyAgICAgIHBhcnNlZF9vcHRpb25zW2tleV0gPSB2YWx1ZTsKKyAgICB9CisgIH0KK30KKwordF9nZW5lcmF0b3IqIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKSB7CisgIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7CisgIGdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlciA9IHRoZV9tYXAuZmluZChsYW5ndWFnZSk7CisKKyAgaWYgKGl0ZXIgPT0gdGhlX21hcC5lbmQoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC0+Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9ucyk7Cit9CisKK3RfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0cmluZyYgb3B0aW9ucykgeworICBzdHJpbmcgbGFuZ3VhZ2U7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnM7CisgIHRfZ2VuZXJhdG9yOjpwYXJzZV9vcHRpb25zKG9wdGlvbnMsIGxhbmd1YWdlLCBwYXJzZWRfb3B0aW9ucyk7CisgIHJldHVybiBnZXRfZ2VuZXJhdG9yKHByb2dyYW0sIGxhbmd1YWdlLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9ucyk7Cit9CisKK3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QmIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpIHsKKyAgLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9jdG9ycy5odG1sI2ZhcS0xMC4xMgorICBzdGF0aWMgZ2VuX21hcF90KiB0aGVfbWFwID0gbmV3IGdlbl9tYXBfdCgpOworICByZXR1cm4gKnRoZV9tYXA7Cit9CisKK3RfZ2VuZXJhdG9yX2ZhY3Rvcnk6OnRfZ2VuZXJhdG9yX2ZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQorICA6IHNob3J0X25hbWVfKHNob3J0X25hbWUpLCBsb25nX25hbWVfKGxvbmdfbmFtZSksIGRvY3VtZW50YXRpb25fKGRvY3VtZW50YXRpb24pIHsKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0aGlzKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOWQwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9HRU5FUkFUT1JfSAorI2RlZmluZSBUX0dFTkVSQVRPUl9ICisjZGVmaW5lIE1TQ18yMDE1X1ZFUiAxOTAwCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMKKyAqIHJvdXRpbmVzIGZvciBjb2RlIGdlbmVyYXRpb24gYW5kIGNvbnRhaW5zIHRoZSB0b3AgbGV2ZWwgbWV0aG9kIHRoYXQKKyAqIGRpc3BhdGNoZXMgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyB2YXJpb3VzIGNvbXBvbmVudHMuCisgKgorICovCitjbGFzcyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkKKyAgICA6IGtleXdvcmRzXyhsYW5nX2tleXdvcmRzKCkpeworICAgIHRtcF8gPSAwOworICAgIGluZGVudF8gPSAwOworICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKKyAgICBwcm9ncmFtX25hbWVfID0gZ2V0X3Byb2dyYW1fbmFtZShwcm9ncmFtKTsKKyAgICBlc2NhcGVfWydcbiddID0gIlxcbiI7CisgICAgZXNjYXBlX1snXHInXSA9ICJcXHIiOworICAgIGVzY2FwZV9bJ1x0J10gPSAiXFx0IjsKKyAgICBlc2NhcGVfWyciJ10gPSAiXFxcIiI7CisgICAgZXNjYXBlX1snXFwnXSA9ICJcXFxcIjsKKyAgfQorCisgIHZpcnR1YWwgfnRfZ2VuZXJhdG9yKCkge30KKworICAvKioKKyAgICogRnJhbWV3b3JrIGdlbmVyYXRvciBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgYSBwcm9ncmFtCisgICAqIGFuZCBwZXJmb3JtcyBnZW5lcmFsIGFjdGlvbnMuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MgYW5kCisgICAqIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgb3ZlcndyaXR0ZW4gaW4gdGhlIHN1YmNsYXNzZXMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworCisgIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmVfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudF9lbmQpOworCisgIHN0YXRpYyB2b2lkIHBhcnNlX29wdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMsIHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zKTsKKworICAvKioKKyAgICogY2hlY2sgd2hldGhlciBzdWItbmFtZXNwYWNlIGRlY2xhcmFjdGlvbiBpcyB1c2VkIGJ5IGdlbmVyYXRvci4KKyAgICogZS5nLiBhbGxvdworICAgKiBuYW1lc3BhY2UgcHkudHdpc3RlZCBiYXIKKyAgICogdG8gc3BlY2lmeSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gLWdlbiBweTp0d2lzdGVkIGlzIHNwZWNpZmllZC4KKyAgICogV2lsbCBiZSBjYWxsZWQgd2l0aCBzdWJuYW1lc3BhY2UsIGkuZS4gaXNfdmFsaWRfbmFtZXNwYWNlKCJ0d2lzdGVkIikKKyAgICogd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBhYm92ZSBleGFtcGxlLgorICAgKi8KKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgICAgKHZvaWQpc3ViX25hbWVzcGFjZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogRXNjYXBlIHN0cmluZyB0byB1c2Ugb25lIGluIGdlbmVyYXRlZCBzb3VyY2VzLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBlc2NhcGVfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbikgY29uc3Q7CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2VzY2FwZWRfc3RyaW5nKHRfY29uc3RfdmFsdWUqIGNvbnN0dmFsKSB7CisgICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogQ2hlY2sgaWYgYWxsIGlkZW50aWZpZXJzIGFyZSB2YWxpZCBmb3IgdGhlIHRhcmdldCBsYW5ndWFnZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlX2lucHV0KCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0OworCisgIC8qKgorICAgKiBBIGxpc3Qgb2YgcmVzZXJ2ZWQgd29yZHMgdGhhdCBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycy4KKyAgICovCisgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrZXl3b3Jkc187CisKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlX2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZW51bSBjb25zdCogZW4pIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9lbnVtX3ZhbHVlIGNvbnN0KiBlbl92YWwpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3N0cnVjdCBjb25zdCogYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2ZpZWxkIGNvbnN0KiBmKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZnVuY3Rpb24gY29uc3QqIGYpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHZhbGlkYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBsaXN0KSBjb25zdDsKKworICAvKioKKyAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHRha2UgbmVjZXNzYXJ5CisgICAqIHN0ZXBzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGNvZGUgZ2VuZXJhdGlvbi4KKyAgICovCisKKyAgdmlydHVhbCB2b2lkIGluaXRfZ2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHVyZSB2aXJ0dWFsIG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhlIGdlbmVyYXRvciBzdWJjbGFzc2VzLgorICAgKi8KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeyAodm9pZCl0Y29uc3Q7IH0KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0Kikge30KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgICAvLyBCeSBkZWZhdWx0IGV4Y2VwdGlvbnMgYXJlIHRoZSBzYW1lIGFzIHN0cnVjdHMKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBwcm9ncmFtIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9wcm9ncmFtX25hbWUodF9wcm9ncmFtKiB0cHJvZ3JhbSkgeyByZXR1cm4gdHByb2dyYW0tPmdldF9uYW1lKCk7IH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGdldCB0aGUgc2VydmljZSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfc2VydmljZV9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9vdXRfZGlyKCkgY29uc3QgeworICAgIGlmIChwcm9ncmFtXy0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArICIvIjsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvZ3JhbV8tPmdldF9vdXRfcGF0aCgpICsgb3V0X2Rpcl9iYXNlXyArICIvIjsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgdW5pcXVlIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lLCB3aGljaCBpcyBqdXN0ICJuYW1lIiB3aXRoIGEKKyAgICogbnVtYmVyIGFwcGVuZGVkIHRvIGl0IChpLmUuIG5hbWUzNSkKKyAgICovCisgIHN0ZDo6c3RyaW5nIHRtcChzdGQ6OnN0cmluZyBuYW1lKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQgPDwgbmFtZSA8PCB0bXBfKys7CisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmF0ZXMgYSBjb21tZW50IGFib3V0IHRoaXMgY29kZSBiZWluZyBhdXRvZ2VuZXJhdGVkLCB1c2luZyBDKysgc3R5bGUKKyAgICogY29tbWVudHMsIHdoaWNoIGFyZSBhbHNvIGZhaXIgZ2FtZSBpbiBKYXZhIC8gUEhQLCB5YXkhCisgICAqCisgICAqIEByZXR1cm4gQy1zdHlsZSBjb21tZW50IG1lbnRpb25pbmcgdGhhdCB0aGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLyoqXG4iKSArICIgKiAiICsgYXV0b2dlbl9zdW1tYXJ5KCkgKyAiXG4iICsgIiAqXG4iCisgICAgICAgICAgICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiICogIEBnZW5lcmF0ZWRcbiIgKyAiICovXG4iOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX3N1bW1hcnkoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIikgKyBUSFJJRlRfVkVSU0lPTiArICIpIjsKKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiBsZXZlbCBtb2RpZmllcnMKKyAgICovCisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7ICsraW5kZW50XzsgfQorCisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IC0taW5kZW50XzsgfQorCisgIC8qKgorICAqIEluZGVudGF0aW9uIHZhbGlkYXRpb24gaGVscGVyCisgICovCisgIGludCBpbmRlbnRfY291bnQoKSB7IHJldHVybiBpbmRlbnRfOyB9CisKKyAgdm9pZCBpbmRlbnRfdmFsaWRhdGUoIGludCBleHBlY3RlZCwgY29uc3QgY2hhciAqIGZ1bmNfbmFtZSkgeworICAgIGlmIChpbmRlbnRfICE9IGV4cGVjdGVkKSB7IAorICAgICAgcHZlcmJvc2UoIldyb25nIGluZGVudCBjb3VudCBpbiAlczogZGlmZmVyZW5jZSA9ICVpIFxuIiwgZnVuY19uYW1lLCAoZXhwZWN0ZWQgLSBpbmRlbnRfKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCisgICAqLworICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7CisgICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgeworICAgICAgaW5kICs9IGluZGVudF9zdHIoKTsKKyAgICB9CisgICAgcmV0dXJuIGluZDsKKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiB1dGlsaXR5IHdyYXBwZXIKKyAgICovCisgIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudCgpOyB9CisKKyAgLyoqCisgICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKKyAgICovCisgIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOworICAgIHJldHVybiBpbjsKKyAgfQorICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOworICAgIHJldHVybiBpbjsKKyAgfQorICBzdGF0aWMgc3RkOjpzdHJpbmcgbG93ZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgeworICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisgIHN0YXRpYyBzdGQ6OnN0cmluZyB1cHBlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7CisgICAgICBpbltpXSA9IHRvdXBwZXIoaW5baV0pOworICAgIH0KKyAgICByZXR1cm4gaW47CisgIH0KKworICAvKioKKyAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3RyaW5nIHRvIGFuIGVxdWl2YWxlbnQgb25lIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcworICAgKiBlLmcuIGFNdWx0aVdvcmQgLT4gYV9tdWx0aV93b3JkCisgICAqICAgICAgc29tZU5hbWUgICAtPiBzb21lX25hbWUKKyAgICogICAgICBDYW1lbENhc2UgIC0+IGNhbWVsX2Nhc2UKKyAgICogICAgICBuYW1lICAgICAgIC0+IG5hbWUKKyAgICogICAgICBOYW1lICAgICAgIC0+IG5hbWUKKyAgICovCisgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChpc3VwcGVyKGluW2ldKSkgeworICAgICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOworICAgICAgICBpbi5pbnNlcnQoaSwgIl8iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisKKyAgLyoqCisgICAgKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzIHRvIGEgY2FtZWwgY2FzZSBlcXVpdmFsZW50CisgICAgKiBlLmcuIGFfbXVsdGlfd29yZCAtPiBhTXVsdGlXb3JkCisgICAgKiAgICAgIHNvbWVfbmFtZSAgICAtPiAgc29tZU5hbWUKKyAgICAqICAgICAgbmFtZSAgICAgICAgIC0+ICBuYW1lCisgICAgKi8KKyAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBib29sIHVuZGVyc2NvcmUgPSBmYWxzZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChpbltpXSA9PSAnXycpIHsKKyAgICAgICAgdW5kZXJzY29yZSA9IHRydWU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHVuZGVyc2NvcmUpIHsKKyAgICAgICAgb3V0IDw8IChjaGFyKXRvdXBwZXIoaW5baV0pOworICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgb3V0IDw8IGluW2ldOworICAgIH0KKworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyBlbWl0X2RvdWJsZV9hc19zdHJpbmcoY29uc3QgZG91YmxlIHZhbHVlKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBkb3VibGVfb3V0cHV0X3N0cmVhbTsKKyAgICAgIC8vIHNldHMgdGhlIG1heGltdW0gcHJlY2lzaW9uOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9zZXRwcmVjaXNpb24KKyAgICAgIC8vIHNldHMgdGhlIG91dHB1dCBmb3JtYXQgdG8gZml4ZWQ6IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL2ZpeGVkIChub3QgaW4gc2NpZW50aWZpYyBub3RhdGlvbikKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAxKTsKKworICAgICAgI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgLy8gc3RydG9kIGlzIGJyb2tlbiBpbiBNU1ZDIGNvbXBpbGVycyBvbGRlciB0aGFuIDIwMTUsIHNvIHN0ZDo6Zml4ZWQgZmFpbHMgdG8gZm9ybWF0IGEgZG91YmxlIGxpdGVyYWwuCisgICAgICAgICAgLy8gbW9yZSBkZXRhaWxzOiBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxNC8wNi8xOC8KKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGMtcnVudGltZS1jcnQtZmVhdHVyZXMtZml4ZXMtYW5kLWJyZWFraW5nLWNoYW5nZXMtaW4tdmlzdWFsLXN0dWRpby0xNC1jdHAxLworICAgICAgICAgIC8vICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBodHRwOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgICAgICAgICAgI2lmIF9NU0NfVkVSID49IE1TQ18yMDE1X1ZFUgorICAgICAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAgICAgICAgICNlbmRpZgorICAgICAgI2Vsc2UKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAgICAgI2VuZGlmCisKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHZhbHVlOworCisgICAgICByZXR1cm4gZG91YmxlX291dHB1dF9zdHJlYW0uc3RyKCk7CisgIH0KKworcHVibGljOgorICAvKioKKyAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHRfdHlwZSogZ2V0X3RydWVfdHlwZShjb25zdCB0X3R5cGUqIHR5cGUpIHsgcmV0dXJuIHR5cGUtPmdldF90cnVlX3R5cGUoKTsgfQorICBzdGF0aWMgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKHRfdHlwZSogdHlwZSkgeyByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOyB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFRoZSBwcm9ncmFtIGJlaW5nIGdlbmVyYXRlZAorICAgKi8KKyAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKKworICAvKioKKyAgICogUXVpY2sgYWNjZXNzb3IgZm9yIGZvcm1hdHRlZCBwcm9ncmFtIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKKyAgICogZ2VuZXJhdGVkLgorICAgKi8KKyAgc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lXzsKKworICAvKioKKyAgICogUXVpY2sgYWNjZXNzb3IgZm9yIGZvcm1hdHRlZCBzZXJ2aWNlIG5hbWUgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKKyAgICogZ2VuZXJhdGVkLgorICAgKi8KKyAgc3RkOjpzdHJpbmcgc2VydmljZV9uYW1lXzsKKworICAvKioKKyAgICogT3V0cHV0IHR5cGUtc3BlY2lmYyBkaXJlY3RvcnkgbmFtZSAoImdlbi0qIikKKyAgICovCisgIHN0ZDo6c3RyaW5nIG91dF9kaXJfYmFzZV87CisKKyAgLyoqCisgICAqIE1hcCBvZiBjaGFyYWN0ZXJzIHRvIGVzY2FwZSBpbiBzdHJpbmcgbGl0ZXJhbHMuCisgICAqLworICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz4gZXNjYXBlXzsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICI7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEN1cnJlbnQgY29kZSBpbmRlbnRhdGlvbiBsZXZlbAorICAgKi8KKyAgaW50IGluZGVudF87CisKKyAgLyoqCisgICAqIFRlbXBvcmFyeSB2YXJpYWJsZSBjb3VudGVyLCBmb3IgbWFraW5nIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcworICAgKi8KKyAgaW50IHRtcF87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4gPgorY2xhc3MgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSA6IHB1YmxpYyBzdGQ6Om9zdHJpbmdzdHJlYW0geworcHVibGljOgorICB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKCk6IGNvbnRlbnRzX3dyaXR0ZW4oZmFsc2UpIHt9CisKKyAgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZShzdGQ6OnN0cmluZyBjb25zdCYgb3V0cHV0X2ZpbGVfcGF0aF8pCisgIDogb3V0cHV0X2ZpbGVfcGF0aChvdXRwdXRfZmlsZV9wYXRoXyksIGNvbnRlbnRzX3dyaXR0ZW4oZmFsc2UpIHt9CisKKyAgfnRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoKSB7CisgICAgaWYgKCFjb250ZW50c193cml0dGVuKSB7CisgICAgICBjbG9zZSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgb3BlbihzdGQ6OnN0cmluZyBjb25zdCYgb3V0cHV0X2ZpbGVfcGF0aF8pIHsKKyAgICBvdXRwdXRfZmlsZV9wYXRoID0gb3V0cHV0X2ZpbGVfcGF0aF87CisgICAgY2xlYXJfYnVmKCk7CisgICAgY29udGVudHNfd3JpdHRlbiA9IGZhbHNlOworICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoY29udGVudHNfd3JpdHRlbiB8fCBvdXRwdXRfZmlsZV9wYXRoID09ICIiKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKCFpc19yZWFkYWJsZShvdXRwdXRfZmlsZV9wYXRoKSkgeworICAgICAgZHVtcCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6aWZzdHJlYW0gb2xkX2ZpbGU7CisgICAgb2xkX2ZpbGUuZXhjZXB0aW9ucyhvbGRfZmlsZS5leGNlcHRpb25zKCkgfCBzdGQ6Omlmc3RyZWFtOjpiYWRiaXQgfCBzdGQ6Omlmc3RyZWFtOjpmYWlsYml0KTsKKyAgICBvbGRfZmlsZS5vcGVuKG91dHB1dF9maWxlX3BhdGguY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKworICAgIGlmIChvbGRfZmlsZSkgeworICAgICAgc3RkOjpzdHJpbmcgY29uc3Qgb2xkX2ZpbGVfY29udGVudHMoc3RhdGljX2Nhc3Q8c3RkOjpvc3RyaW5nc3RyZWFtIGNvbnN0Jj4oc3RkOjpvc3RyaW5nc3RyZWFtKCkgPDwgb2xkX2ZpbGUucmRidWYoKSkuc3RyKCkpOworICAgICAgb2xkX2ZpbGUuY2xvc2UoKTsKKworICAgICAgaWYgKG9sZF9maWxlX2NvbnRlbnRzICE9IHN0cigpKSB7CisgICAgICAgIGR1bXAoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIGR1bXAoKSB7CisgICAgc3RkOjpvZnN0cmVhbSBvdXRfZmlsZTsKKyAgICBvdXRfZmlsZS5leGNlcHRpb25zKG91dF9maWxlLmV4Y2VwdGlvbnMoKSB8IHN0ZDo6b2ZzdHJlYW06OmJhZGJpdCB8IHN0ZDo6b2ZzdHJlYW06OmZhaWxiaXQpOworICAgIHRyeSB7CisgICAgICBvdXRfZmlsZS5vcGVuKG91dHB1dF9maWxlX3BhdGguY19zdHIoKSwgc3RkOjppb3M6Om91dCk7CisgICAgfQorICAgIGNhdGNoIChjb25zdCBzdGQ6Omlvc19iYXNlOjpmYWlsdXJlJiBlKSB7CisgICAgICA6OmZhaWx1cmUoImZhaWxlZCB0byB3cml0ZSB0aGUgb3V0cHV0IHRvIHRoZSBmaWxlICclcycsIGRldGFpbHM6ICclcyciLCBvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIGUud2hhdCgpKTsKKyAgICB9CisgICAgb3V0X2ZpbGUgPDwgc3RyKCk7CisgICAgb3V0X2ZpbGUuY2xvc2UoKTsKKyAgICBjbGVhcl9idWYoKTsKKyAgICBjb250ZW50c193cml0dGVuID0gdHJ1ZTsKKyAgfQorCisgIHZvaWQgY2xlYXJfYnVmKCkgeworICAgIHN0cihzdGQ6OnN0cmluZygpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX3JlYWRhYmxlKHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlX25hbWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oc3RkOjppZnN0cmVhbShmaWxlX25hbWUuY19zdHIoKSkpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlX3BhdGg7CisgIGJvb2wgY29udGVudHNfd3JpdHRlbjsKK307Cit0eXBlZGVmIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU8Y2hhcj4gb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjAyMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKKyNkZWZpbmUgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAorCitjbGFzcyB0X2dlbmVyYXRvcjsKKworLyoqCisgKiBBIGZhY3RvcnkgZm9yIHByb2R1Y2luZyBnZW5lcmF0b3IgY2xhc3NlcyBvZiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvcjoKKyAqICAtIFJlZ2lzdGVyaW5nIGl0c2VsZiB3aXRoIHRoZSBnZW5lcmF0b3IgcmVnaXN0cnkuCisgKiAgLSBQcm92aWRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGdlbmVyYXRvcnMgaXQgcHJvZHVjZXMuCisgKi8KK2NsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgeworcHVibGljOgorICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOworCisgIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCisgICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSA9IDA7CisKKyAgdmlydHVhbCBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgPSAwOworCisgIHN0ZDo6c3RyaW5nIGdldF9zaG9ydF9uYW1lKCkgeyByZXR1cm4gc2hvcnRfbmFtZV87IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X2xvbmdfbmFtZSgpIHsgcmV0dXJuIGxvbmdfbmFtZV87IH0KKyAgc3RkOjpzdHJpbmcgZ2V0X2RvY3VtZW50YXRpb24oKSB7IHJldHVybiBkb2N1bWVudGF0aW9uXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKKyAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgorY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgeworcHVibGljOgorICB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCisgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5KHNob3J0X25hbWUsIGxvbmdfbmFtZSwgZG9jdW1lbnRhdGlvbikge30KKworICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgeworICAgIHJldHVybiBuZXcgZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgICByZXR1cm4gZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSk7CisgIH0KK307CisKK2NsYXNzIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5IHsKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgcmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpOworCisgIHN0YXRpYyB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKKyAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYXVnbmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZ2VuZXJhdG9yX2ZhY3RvcnkqPiBnZW5fbWFwX3Q7CisgIHN0YXRpYyBnZW5fbWFwX3QmIGdldF9nZW5lcmF0b3JfbWFwKCk7CisKK3ByaXZhdGU6CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5KCk7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5KGNvbnN0IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5Jik7Cit9OworCisjZGVmaW5lIFRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IobGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+KCNsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpIHt9ICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNmI4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzcxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIHByb2dyYW1tYXRpY2FsbHkgc2FuaXRpemVkIGZvciBzdHlsZToKKyAqIGFzdHlsZSAtLXN0eWxlPTF0YnMgLWYgLXAgLUggLWogLVUgdF9nb19nZW5lcmF0b3IuY2MKKyAqCisgKiBUaGUgb3V0cHV0IG9mIGFzdHlsZSBzaG91bGQgbm90IGJlIHRha2VuIHVucXVlc3Rpb25pbmdseSwgYnV0IGl0IGlzIGEgZ29vZAorICogZ3VpZGUgZm9yIGVuc3VyaW5nIHVuaWZvcm1pdHkgYW5kIHJlYWRhYmlsaXR5LgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbG9jYWxlPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQSBoZWxwZXIgZm9yIGF1dG9tYXRpY2FsbHkgZm9ybWF0dGluZyB0aGUgZW1pdHRlZCBHbyBjb2RlIGZyb20gdGhlIFRocmlmdAorICogSURMIHBlciB0aGUgR28gc3R5bGUgZ3VpZGUuCisgKgorICogUmV0dXJuczoKKyAqICAtIHRydWUsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3Mgc3VjY2VlZGVkLgorICogIC0gZmFsc2UsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3MgZmFpbGVkLCB3aGljaCBtZWFucyB0aGUgYmFzaWMgb3V0cHV0IHdhcworICogICAgICAgICAgIHN0aWxsIGdlbmVyYXRlZC4KKyAqLworYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKTsKKworY29uc3Qgc3RyaW5nIERFRkFVTFRfVEhSSUZUX0lNUE9SVCA9ICJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCI7CitzdGF0aWMgc3RkOjpzdHJpbmcgcGFja2FnZV9mbGFnOworCisvKioKKyAqIEdvIGNvZGUgZ2VuZXJhdG9yLgorICovCitjbGFzcyB0X2dvX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZ29fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworCisgICAgZ2VuX3RocmlmdF9pbXBvcnRfID0gREVGQVVMVF9USFJJRlRfSU1QT1JUOworICAgIGdlbl9wYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBwYWNrYWdlX2ZsYWcgPSAiIjsKKyAgICByZWFkX3dyaXRlX3ByaXZhdGVfID0gZmFsc2U7CisgICAgaWdub3JlX2luaXRpYWxpc21zXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2VfcHJlZml4IikgPT0gMCkgeworICAgICAgICBnZW5fcGFja2FnZV9wcmVmaXhfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRocmlmdF9pbXBvcnQiKSA9PSAwKSB7CisgICAgICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwYWNrYWdlIikgPT0gMCkgeworICAgICAgICBwYWNrYWdlX2ZsYWcgPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmVhZF93cml0ZV9wcml2YXRlIikgPT0gMCkgeworICAgICAgICByZWFkX3dyaXRlX3ByaXZhdGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiaWdub3JlX2luaXRpYWxpc21zIikgPT0gMCkgeworICAgICAgICBpZ25vcmVfaW5pdGlhbGlzbXNfID0gIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZ286IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWdvIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdCA9IGZhbHNlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJncyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvdW50c2V0ZmllbGRzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0OworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGdvX2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBnb19wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHNfYmVnaW4oYm9vbCBjb25zdHMpOworICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2VuZCgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoYm9vbCBjb25zdHMpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXMoc3RyaW5nJiB1bnVzZWRfcHJvdGVjdGlvbik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdGlvbmFsX2ZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBtb2R1bGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZEVycm9yID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fa2V5X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9nb19tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisKKyAgICBpZiAoIXBhY2thZ2VfZmxhZy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZV9mbGFnOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIik7CisgICAgaWYgKCFyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcmVhbF9tb2R1bGU7CisgICAgfQorCisgICAgcmV0dXJuIGxvd2VyY2FzZShwcm9ncmFtLT5nZXRfbmFtZSgpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBnZW5fcGFja2FnZV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBnZW5fdGhyaWZ0X2ltcG9ydF87CisgIGJvb2wgcmVhZF93cml0ZV9wcml2YXRlXzsKKyAgYm9vbCBpZ25vcmVfaW5pdGlhbGlzbXNfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgc3RkOjpzdHJpbmcgZl90eXBlc19uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIHN0ZDo6c3RyaW5nIGZfY29uc3RzX25hbWVfOworICBzdGQ6OnN0cmluZ3N0cmVhbSBmX2NvbnN0X3ZhbHVlc187CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICBzdGQ6OnN0cmluZyByZWFkX21ldGhvZF9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgd3JpdGVfbWV0aG9kX25hbWVfOworCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb21tb25Jbml0aWFsaXNtczsKKworICBzdGQ6OnN0cmluZyBjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBmaXhfY29tbW9uX2luaXRpYWxpc20oc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQgaSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIHB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQgPSBmYWxzZSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIHByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICBzdGQ6OnN0cmluZyBuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgc3RhdGljIGJvb2wgaXNfcG9pbnRlcl9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGF0aWMgYm9vbCBvbWl0X2luaXRpYWxpemF0aW9uKHRfZmllbGQqIHRmaWVsZCk7Cit9OworCisvLyByZXR1cm5zIHRydWUgaWYgZmllbGQgaW5pdGlhbGl6YXRpb24gY2FuIGJlIG9taXR0ZWQgc2luY2UgaXQgaGFzIGNvcnJlc3BvbmRpbmcgZ28gdHlwZSB6ZXJvIHZhbHVlCisvLyBvciBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQKK2Jvb2wgdF9nb19nZW5lcmF0b3I6Om9taXRfaW5pdGlhbGl6YXRpb24odF9maWVsZCogdGZpZWxkKSB7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKKyAgaWYgKCF2YWx1ZSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAvL1tdYnl0ZSBhcmUgYWx3YXlzIGlubGluZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBzdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAorICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfc3RyaW5nKCkuZW1wdHkoKTsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfaW50ZWdlcigpID09IDA7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZXR1cm4gdmFsdWUtPmdldF9pbnRlZ2VyKCkgPT0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2RvdWJsZSgpID09IDAuOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBuZWVkIGEgcmVmZXJlbmNlIGlmIHVzZWQgYXMgb3B0aW9uYWwgd2l0aG91dCBkZWZhdWx0CitzdGF0aWMgYm9vbCB0eXBlX25lZWRfcmVmZXJlbmNlKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpCisgICAgICB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyByZXR1cm5zIGZhbHNlIGlmIGZpZWxkIGNvdWxkIG5vdCB1c2UgY29tcGFyaXNvbiB0byBkZWZhdWx0IHZhbHVlIGFzICFJc1NldCoKK2Jvb2wgdF9nb19nZW5lcmF0b3I6OmlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgeworICAodm9pZClpbl9jb250YWluZXJfdmFsdWU7CisgIGlmICh0ZmllbGQtPmFubm90YXRpb25zXy5jb3VudCgiY3BwLnJlZiIpICE9IDApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgLy8gU3RydWN0cyBpbiBjb250YWluZXJzIGFyZSBwb2ludGVycworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgaGFzX2RlZmF1bHQgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAvL1tdYnl0ZSBhcmUgYWx3YXlzIGlubGluZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBzdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAorICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19nb190eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmNhbWVsY2FzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKyAgc3RkOjpzZXRsb2NhbGUoTENfQUxMLCAiQyIpOyAvLyBzZXQgbG9jYWxlIHRvIGNsYXNzaWMKKworICAvLyBGaXggY29tbW9uIGluaXRpYWxpc20gaW4gZmlyc3Qgd29yZAorICBmaXhfY29tbW9uX2luaXRpYWxpc20odmFsdWUyLCAwKTsKKworICAvLyBhcyBsb25nIGFzIHdlIGFyZSBjaGFuZ2luZyB0aGluZ3MsIGxldCdzIGNoYW5nZSBfIGZvbGxvd2VkIGJ5IGxvd2VyY2FzZSB0bworICAvLyBjYXBpdGFsIGFuZCBmaXggY29tbW9uIGluaXRpYWxpc21zCisgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMTsgaSA8IHZhbHVlMi5zaXplKCkgLSAxOyArK2kpIHsKKyAgICBpZiAodmFsdWUyW2ldID09ICdfJykgeworICAgICAgaWYgKGlzbG93ZXIodmFsdWUyW2kgKyAxXSkpIHsKKyAgICAgICAgdmFsdWUyLnJlcGxhY2UoaSwgMiwgMSwgdG91cHBlcih2YWx1ZTJbaSArIDFdKSk7CisgICAgICB9CisKKyAgICAgIGlmIChpID4gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+KCkubWF4KCkpKSB7CisgICAgICAgIHRocm93ICJpbnRlZ2VyIG92ZXJmbG93IGluIHRfZ29fZ2VuZXJhdG9yOjpjYW1lbGNhc2UsIHZhbHVlID0gIiArIHZhbHVlOworICAgICAgfQorICAgICAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgc3RhdGljX2Nhc3Q8aW50PihpKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHZhbHVlMjsKK30KKworLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgd29yZCBzdGFydGluZyBhdCBpIGluIHZhbHVlIGNvbnRhaW5zIGEgY29tbW9uIGluaXRpYWxpc20KKy8vIGFuZCBpZiBzbyByZXBsYWNlcyBpdCB3aXRoIHRoZSB1cHBlciBjYXNlIHZlcnNpb24gb2YgdGhlIHdvcmQuCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpmaXhfY29tbW9uX2luaXRpYWxpc20oc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQgaSkgY29uc3QgeworICBpZiAoIWlnbm9yZV9pbml0aWFsaXNtc18pIHsKKyAgICBzaXplX3Qgd29yZExlbiA9IHZhbHVlLmZpbmQoJ18nLCBpKTsKKyAgICBpZiAod29yZExlbiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgd29yZExlbiAtPSBpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB3b3JkID0gdmFsdWUuc3Vic3RyKGksIHdvcmRMZW4pOworICAgIHN0ZDo6dHJhbnNmb3JtKHdvcmQuYmVnaW4oKSwgd29yZC5lbmQoKSwgd29yZC5iZWdpbigpLCA6OnRvdXBwZXIpOworICAgIGlmIChjb21tb25Jbml0aWFsaXNtcy5maW5kKHdvcmQpICE9IGNvbW1vbkluaXRpYWxpc21zLmVuZCgpKSB7CisgICAgICB2YWx1ZS5yZXBsYWNlKGksIHdvcmQubGVuZ3RoKCksIHdvcmQpOworICAgIH0KKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgY29uc3QgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpLCBwcmVmaXg7CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7CisgIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgeworICAgIHByZWZpeCA9IHZhbHVlLnN1YnN0cigwLCBkb3RfcG9zICsgMSkgKyBwcmVmaXg7CisgICAgdmFsdWUyID0gdmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKTsKKyAgfQorCisgIGlmICghaXN1cHBlcih2YWx1ZTJbMF0pKSB7CisgICAgdmFsdWUyWzBdID0gdG91cHBlcih2YWx1ZTJbMF0pOworICB9CisKKyAgdmFsdWUyID0gY2FtZWxjYXNlKHZhbHVlMik7CisKKyAgLy8gZmluYWwgbGVuZ3RoIGJlZm9yZSBmdXJ0aGVyIGNoZWNrcywgdGhlIHN0cmluZyBtYXkgYmVjb21lIGxvbmdlcgorICBzaXplX3QgbGVuX2JlZm9yZSA9IHZhbHVlMi5sZW5ndGgoKTsKKworICAvLyBJREwgaWRlbnRpZmllcnMgbWF5IHN0YXJ0IHdpdGggIk5ldyIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBDVE9SIHBhdHRlcm4KKyAgLy8gQWRkaW5nIGFuIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCisgIGlmICgobGVuX2JlZm9yZSA+PSAzKSAmJiAodmFsdWUyLnN1YnN0cigwLCAzKSA9PSAiTmV3IikpIHsKKyAgICB2YWx1ZTIgKz0gJ18nOworICB9CisKKyAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBlbmQgd2l0aCAiQXJncyIvIlJlc3VsdCIgd2hpY2ggaW50ZXJmZXJlcyB3aXRoIHRoZSBpbXBsaWNpdCBzZXJ2aWNlCisgIC8vIGZ1bmN0aW9uIHN0cnVjdHMKKyAgLy8gQWRkaW5nIGFub3RoZXIgZXh0cmEgdW5kZXJzY29yZSB0byBhbGwgdGhvc2UgaWRlbnRpZmllcnMgc29sdmVzIHRoaXMKKyAgLy8gU3VwcHJlc3MgdGhpcyBjaGVjayBmb3IgdGhlIGFjdHVhbCBoZWxwZXIgc3RydWN0IG5hbWVzCisgIGlmICghaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgICBib29sIGVuZHNfd2l0aF9hcmdzID0gKGxlbl9iZWZvcmUgPj0gNCkgJiYgKHZhbHVlMi5zdWJzdHIobGVuX2JlZm9yZSAtIDQsIDQpID09ICJBcmdzIik7CisgICAgYm9vbCBlbmRzX3dpdGhfcnNsdCA9IChsZW5fYmVmb3JlID49IDYpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA2LCA2KSA9PSAiUmVzdWx0Iik7CisgICAgaWYgKGVuZHNfd2l0aF9hcmdzIHx8IGVuZHNfd2l0aF9yc2x0KSB7CisgICAgICB2YWx1ZTIgKz0gJ18nOworICAgIH0KKyAgfQorCisgIC8vIEF2b2lkIG5hbWluZyBjb2xsaXNpb25zIHdpdGggb3RoZXIgc2VydmljZXMKKyAgaWYgKGlzX2FyZ3Nfb3JfcmVzdWx0KSB7CisgICAgcHJlZml4ICs9IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKTsKKyAgfQorCisgIHJldHVybiBwcmVmaXggKyB2YWx1ZTI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gdmFsdWUucmZpbmQoJy4nKTsKKyAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmV0dXJuIHZhbHVlLnN1YnN0cigwLCBkb3RfcG9zICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZSh2YWx1ZS5zdWJzdHIoZG90X3BvcyArIDEpKTsKKyAgfQorICByZXR1cm4gIk5ldyIgKyBwdWJsaWNpemUodmFsdWUpOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOworCisgIGlmICghaXNsb3dlcih2YWx1ZTJbMF0pKSB7CisgICAgdmFsdWUyWzBdID0gdG9sb3dlcih2YWx1ZTJbMF0pOworICB9CisKKyAgdmFsdWUyID0gY2FtZWxjYXNlKHZhbHVlMik7CisKKyAgcmV0dXJuIHZhbHVlMjsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKyAgc3RkOjp0cmFuc2Zvcm0odmFsdWUyLmJlZ2luKCksIHZhbHVlMi5lbmQoKSwgdmFsdWUyLmJlZ2luKCksIDo6dG9sb3dlcik7CisKKyAgc3dpdGNoICh2YWx1ZVswXSkgeworICBjYXNlICdiJzoKKyAgY2FzZSAnQic6CisgICAgaWYgKHZhbHVlMiAhPSAiYnJlYWsiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnYyc6CisgIGNhc2UgJ0MnOgorICAgIGlmICh2YWx1ZTIgIT0gImNhc2UiICYmIHZhbHVlMiAhPSAiY2hhbiIgJiYgdmFsdWUyICE9ICJjb25zdCIgJiYgdmFsdWUyICE9ICJjb250aW51ZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdkJzoKKyAgY2FzZSAnRCc6CisgICAgaWYgKHZhbHVlMiAhPSAiZGVmYXVsdCIgJiYgdmFsdWUyICE9ICJkZWZlciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdlJzoKKyAgY2FzZSAnRSc6CisgICAgaWYgKHZhbHVlMiAhPSAiZWxzZSIgJiYgdmFsdWUyICE9ICJlcnJvciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdmJzoKKyAgY2FzZSAnRic6CisgICAgaWYgKHZhbHVlMiAhPSAiZmFsbHRocm91Z2giICYmIHZhbHVlMiAhPSAiZm9yIiAmJiB2YWx1ZTIgIT0gImZ1bmMiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZyc6CisgIGNhc2UgJ0cnOgorICAgIGlmICh2YWx1ZTIgIT0gImdvIiAmJiB2YWx1ZTIgIT0gImdvdG8iKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnaSc6CisgIGNhc2UgJ0knOgorICAgIGlmICh2YWx1ZTIgIT0gImlmIiAmJiB2YWx1ZTIgIT0gImltcG9ydCIgJiYgdmFsdWUyICE9ICJpbnRlcmZhY2UiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnbSc6CisgIGNhc2UgJ00nOgorICAgIGlmICh2YWx1ZTIgIT0gIm1hcCIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdwJzoKKyAgY2FzZSAnUCc6CisgICAgaWYgKHZhbHVlMiAhPSAicGFja2FnZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdyJzoKKyAgY2FzZSAnUic6CisgICAgaWYgKHZhbHVlMiAhPSAicmFuZ2UiICYmIHZhbHVlMiAhPSAicmV0dXJuIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3MnOgorICBjYXNlICdTJzoKKyAgICBpZiAodmFsdWUyICE9ICJzZWxlY3QiICYmIHZhbHVlMiAhPSAic3RydWN0IiAmJiB2YWx1ZTIgIT0gInN3aXRjaCIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICd0JzoKKyAgY2FzZSAnVCc6CisgICAgaWYgKHZhbHVlMiAhPSAidHlwZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICd2JzoKKyAgY2FzZSAnVic6CisgICAgaWYgKHZhbHVlMiAhPSAidmFyIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcmV0dXJuIHZhbHVlMiArICJfYTEiOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgdGFyZ2V0ID0gbW9kdWxlOworICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworCisgIC8vIFRoaXMgc2V0IGlzIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9saW50L2Jsb2IvbWFzdGVyL2xpbnQuZ28jTDY5MgorICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkFQSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkFTQ0lJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQ1BVIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQ1NTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiRE5TIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiRU9GIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiR1VJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUTUwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVFRQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIklQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSlNPTiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkxIUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlFQUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJBTSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJIUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlJQQyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNMQSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNNVFAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTU0giKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUQ1AiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUTFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJUVEwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVRFAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVUkkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVUkwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVEY4Iik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVk0iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYTUwiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYU1JGIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNTIik7CisKKyAgLy8gbmFtZXMgb2YgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcworICBpZiAocmVhZF93cml0ZV9wcml2YXRlXykgeworICAgIHJlYWRfbWV0aG9kX25hbWVfID0gInJlYWQiOworICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJ3cml0ZSI7CisgIH0gZWxzZSB7CisgICAgcmVhZF9tZXRob2RfbmFtZV8gPSAiUmVhZCI7CisgICAgd3JpdGVfbWV0aG9kX25hbWVfID0gIldyaXRlIjsKKyAgfQorCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworCisgICAgaWYgKG1vZHVsZS5lbXB0eSgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOworCisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOworICAgICAgcGFja2FnZV9uYW1lXyA9IG1vZHVsZTsKKyAgICAgIG1vZHVsZS5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKKyAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSB0YXJnZXQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB0YXJnZXQucmVwbGFjZShsb2MsIDEsIDEsICcvJyk7CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlcworICBmX3R5cGVzX25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICIuZ28iOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZV8uY19zdHIoKSk7CisKKyAgZl9jb25zdHNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi1jb25zdHMuZ28iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lXy5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbmNsdWRlcyhmYWxzZSk7CisKKyAgZl9jb25zdHNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXModHJ1ZSk7CisKKyAgZl9jb25zdF92YWx1ZXNfIDw8IGVuZGwgPDwgImZ1bmMgaW5pdCgpIHsiIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGZpbGUgZm9yIHRoZSBHb1VudXNlZFByb3RlY3Rpb25fXyB2YXJpYWJsZQorICBzdHJpbmcgZl91bnVzZWRfcHJvdF9uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArICJHb1VudXNlZFByb3RlY3Rpb25fXy5nbyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl91bnVzZWRfcHJvdF87CisgIGZfdW51c2VkX3Byb3RfLm9wZW4oZl91bnVzZWRfcHJvdF9uYW1lXy5jX3N0cigpKTsKKyAgZl91bnVzZWRfcHJvdF8gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpOworICBmX3VudXNlZF9wcm90Xy5jbG9zZSgpOworfQorCisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKHN0cmluZyYgdW51c2VkX3Byb3RlY3Rpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIHVudXNlZF9wcm90ZWN0aW9uID0gIiI7CisKKyAgc3RyaW5nIGxvY2FsX25hbWVzcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFsb2NhbF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBsb2NhbF9uYW1lc3BhY2UgPT0gaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0cmluZyBnb19tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZXNbaV0pOworICAgIHNpemVfdCBmb3VuZCA9IDA7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBnb19tb2R1bGUuc2l6ZSgpOyBqKyspIHsKKyAgICAgIC8vIEltcG9ydCBzdGF0ZW1lbnQgdXNlcyBzbGFzaGVzICgnLycpIGluIG5hbWVzcGFjZQorICAgICAgaWYgKGdvX21vZHVsZVtqXSA9PSAnLicpIHsKKyAgICAgICAgZ29fbW9kdWxlW2pdID0gJy8nOworICAgICAgICBmb3VuZCA9IGogKyAxOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCArPSAiXHRcIiIgKyBnZW5fcGFja2FnZV9wcmVmaXhfICsgZ29fbW9kdWxlICsgIlwiXG4iOworICAgIHVudXNlZF9wcm90ZWN0aW9uICs9ICJ2YXIgXyA9ICIgKyBnb19tb2R1bGUuc3Vic3RyKGZvdW5kKSArICIuR29VbnVzZWRQcm90ZWN0aW9uX19cbiI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0uCisgKiBJZiBjb25zdHMgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBpbXBvcnRzLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcyhib29sIGNvbnN0cykgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHN0cmluZyB1bnVzZWRfcHJvdCA9ICIiOworCisgIHN0cmluZyBsb2NhbF9uYW1lc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmICghbG9jYWxfbmFtZXNwYWNlLmVtcHR5KCkgJiYgbG9jYWxfbmFtZXNwYWNlID09IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJnbyIpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKKyAgICBzaXplX3QgZm91bmQgPSAwOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7CisgICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKKyAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7CisgICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKKyAgICAgICAgZm91bmQgPSBqICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKKyAgICB1bnVzZWRfcHJvdCArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOworICB9CisKKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorCisgIHJldHVybiBnb19pbXBvcnRzX2JlZ2luKGNvbnN0cykgKyByZXN1bHQgKyBnb19pbXBvcnRzX2VuZCgpICsgdW51c2VkX3Byb3Q7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCkgeworICByZXR1cm4gc3RyaW5nKCJ2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50O1xuXG4iKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4KKyAgICAgICAgc3RkOjpzdHJpbmcoKSArCisgICAgICAgICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IHBhY2thZ2UKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19wYWNrYWdlKCkgeworICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICJcblxuIjsKK30KKworLyoqCisgKiBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudC4KKyAqIElmIGNvbnN0cyBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGltcG9ydHMuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29faW1wb3J0c19iZWdpbihib29sIGNvbnN0cykgeworICBzdHJpbmcgZXh0cmE7CisKKyAgLy8gSWYgbm90IHdyaXRpbmcgY29uc3RhbnRzLCBhbmQgdGhlcmUgYXJlIGVudW1zLCBuZWVkIGV4dHJhIGltcG9ydHMuCisgIGlmICghY29uc3RzICYmIGdldF9wcm9ncmFtKCktPmdldF9lbnVtcygpLnNpemUoKSA+IDApIHsKKyAgICBleHRyYSArPQorICAgICAgIlx0XCJkYXRhYmFzZS9zcWwvZHJpdmVyXCJcbiIKKyAgICAgICJcdFwiZXJyb3JzXCJcbiI7CisgIH0KKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICJpbXBvcnQgKFxuIgorICAgICAgIlx0XCJieXRlc1wiXG4iCisgICAgICAiXHRcImNvbnRleHRcIlxuIgorICAgICAgIlx0XCJyZWZsZWN0XCJcbiIKKyAgICAgICsgZXh0cmEgKworICAgICAgIlx0XCJmbXRcIlxuIgorICAgICAgIlx0XCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiXG4iKTsKK30KKworLyoqCisgKiBFbmQgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIGluY2x1ZGUgdW5kc2NvcmUtYXNzaWdubWVudHMKKyAqCisgKiBUaGVzZSAiXyA9IiBwcmV2ZW50IHRoZSBnbyBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1bnVzZWQgaW1wb3J0cy4KKyAqIFRoaXMgd2lsbCBoYXZlIHRvIGRvIGluIGxpZXUgb2YgbW9yZSBpbnRlbGxpZ2VudCBpbXBvcnQgc3RhdGVtZW50IGNvbnN0cnVjdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfZW5kKCkgeworICByZXR1cm4gc3RyaW5nKAorICAgICAgIilcblxuIgorICAgICAgIi8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pXG4iCisgICAgICAidmFyIF8gPSB0aHJpZnQuWkVST1xuIgorICAgICAgInZhciBfID0gZm10LlByaW50ZlxuIgorICAgICAgInZhciBfID0gY29udGV4dC5CYWNrZ3JvdW5kXG4iCisgICAgICAidmFyIF8gPSByZWZsZWN0LkRlZXBFcXVhbFxuIgorICAgICAgInZhciBfID0gYnl0ZXMuRXF1YWxcblxuIik7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9jb25zdF92YWx1ZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBmX2NvbnN0X3ZhbHVlc18uc3RyKCk7CisKKyAgLy8gQ2xvc2UgdHlwZXMgYW5kIGNvbnN0YW50cyBmaWxlcworICBmX2NvbnN0c18uY2xvc2UoKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX3R5cGVzX25hbWVfKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX2NvbnN0c19uYW1lXyk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0dHlwZWRlZik7CisgIHN0cmluZyBuZXdfdHlwZV9uYW1lKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKKyAgc3RyaW5nIGJhc2VfdHlwZSh0eXBlX3RvX2dvX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKTsKKworICBpZiAoYmFzZV90eXBlID09IG5ld190eXBlX25hbWUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IG5ld190eXBlX25hbWUgPDwgIiAiIDw8IGJhc2VfdHlwZSA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhIHR5cGUKKyAgLy8gKHdoaWNoIG1heSBiZSBhIGNvbnN0YW50KSBpbnRvIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBhIHR5cGUuCisgIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiUHRyKHYgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIpICoiIDw8IG5ld190eXBlX25hbWUKKyAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKKyAgc3RkOjpzdHJpbmcgdGVudW1fbmFtZShwdWJsaWNpemUodGVudW0tPmdldF9uYW1lKCkpKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7CisgIGZfdHlwZXNfIDw8ICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludDY0IiA8PCBlbmRsIDw8ICJjb25zdCAoIiA8PCBlbmRsOworCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHAgeyIgPDwgZW5kbDsKKworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzIHN0cmluZykgKCIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yKSB7IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBzIHsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIHN0cmluZyBpdGVyX3N0ZF9uYW1lKGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICcgJyA8PCB0ZW51bV9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgPDwgdmFsdWUgPDwgZW5kbDsKKyAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKKyAgICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdGVudW1fbmFtZSA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICI6IHJldHVybiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiIgPDwgZW5kbDsKKworICAgIGlmIChpdGVyX3N0ZF9uYW1lICE9IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSkgeworICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIiwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoaXRlcl9uYW1lKSA8PCAiXCI6IHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl0ZXJfbmFtZSA8PCAiLCBuaWwgIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgXCIiIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfIiA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gXCI8VU5TRVQ+XCIiIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKDApLCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZtdC5FcnJvcmYoXCJub3QgYSB2YWxpZCAiIDw8IHRlbnVtX25hbWUgPDwgIiBzdHJpbmdcIikiIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIikiIDw8IGVuZGwgPDwgZW5kbCA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkKKyAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhbiBpbnN0YW5jZSBvZiBhbiBlbnVtCisgIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhhdCBlbnVtCisgIC8vIHR5cGUuCisgIGZfdHlwZXNfIDw8ICJmdW5jICIgPDwgdGVudW1fbmFtZSA8PCAiUHRyKHYgIiA8PCB0ZW51bV9uYW1lIDw8ICIpICoiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgPDwgIiB7IHJldHVybiAmdiB9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgTWFyc2hhbFRleHQKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIE1hcnNoYWxUZXh0KCkgKFtdYnl0ZSwgZXJyb3IpIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gW11ieXRlKHAuU3RyaW5nKCkpLCBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgVW5tYXJzaGFsVGV4dAorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFVubWFyc2hhbFRleHQodGV4dCBbXWJ5dGUpIGVycm9yIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJxLCBlcnIgOj0gIiA8PCB0ZW51bV9uYW1lIDw8ICJGcm9tU3RyaW5nKHN0cmluZyh0ZXh0KSkiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJpZiAoZXJyICE9IG5pbCkgeyIgPDwgZW5kbCA8PCAicmV0dXJuIGVyciIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIipwID0gcSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgU2NhbiBmb3Igc3FsLlNjYW5uZXIgaW50ZXJmYWNlCisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICoiIDw8IHRlbnVtX25hbWUgPDwgIikgU2Nhbih2YWx1ZSBpbnRlcmZhY2V7fSkgZXJyb3IgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAidiwgb2sgOj0gdmFsdWUuKGludDY0KSIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiaWYgIW9rIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBlcnJvcnMuTmV3KFwiU2NhbiB2YWx1ZSBpcyBub3QgaW50NjRcIikiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIipwID0gIiA8PCB0ZW51bV9uYW1lIDw8ICIodikiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFZhbHVlIGZvciBkcml2ZXIuVmFsdWVyIGludGVyZmFjZQorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqICIgPDwgdGVudW1fbmFtZSA8PCAiKSBWYWx1ZSgpIChkcml2ZXIuVmFsdWUsIGVycm9yKSB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgIGlmIHAgPT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgICAgcmV0dXJuIG5pbCwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiICB9IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIGludDY0KCpwKSwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBwdWJsaWNpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KGZfY29uc3RzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9jb25zdF92YWx1ZXNfIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2NvbnN0c18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IG5hbWUgPDwgIiAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0eXBlKSA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lLCBib29sIG9wdCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBpZiAob3B0KSB7CisgICAgICBvdXQgPDwgIiYoJnN0cnVjdHt4ICI7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgImJvb2x9eyI7CisgICAgICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCAiaW50OH17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIG91dCA8PCAiaW50MTZ9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBvdXQgPDwgImludDMyfXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgb3V0IDw8ICJpbnQ2NH17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgb3V0IDw8ICJmbG9hdDY0fXsiOworICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBvdXQgPDwgInN0cmluZ317IjsKKyAgICAgICAgICBvdXQgPDwgJyInICsgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSArICciJzsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgICAgb3V0IDw8ICJ9KS54IjsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIG91dCA8PCAiW11ieXRlKFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICJcIikiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCBpbnR9eyI7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBpZiAob3B0KSB7CisgICAgICAgICAgICBvdXQgPDwgIn0pLngiOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICImIiA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKSA8PCAieyI7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSBmYWxzZTsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBpc19vcHRpb25hbCA9IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSwgaXNfb3B0aW9uYWwpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG91dCA8PCAibWFwWyIgPDwgdHlwZV90b19nb190eXBlKGt0eXBlKSA8PCAiXSIgPDwgdHlwZV90b19nb190eXBlKHZ0eXBlKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QsIG5hbWUpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgb3V0IDw8ICJbXSIgPDwgdHlwZV90b19nb19rZXlfdHlwZShldHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIG5hbWUpIDw8ICIsICI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZ28gc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0IHsKKyAgY29uc3Qgc3RyaW5nIGJhc2VfZmllbGRfbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoYmFzZV9maWVsZF9uYW1lKTsKKyAgKk9VVF9wdWJfbmFtZSA9IHB1YmxpY2l6ZShlc2NhcGVkX2ZpZWxkX25hbWUpOworICAqT1VUX2RlZl92YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCkgeworICBvdXQgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0c3RydWN0KSwgaXNfYXJnc19vcl9yZXN1bHQpIDw8ICJ7IjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIGJvb2wgcG9pbnRlcl9maWVsZCA9IGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcik7CisgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7CisgICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOworICAgIGlmICghcG9pbnRlcl9maWVsZCAmJiBkZWZfdmFsdWUgIT0gTlVMTCAmJiAhb21pdF9pbml0aWFsaXphdGlvbigqbV9pdGVyKSkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHVibGljaXplZF9uYW1lIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSgqbV9pdGVyLCAoKm1faXRlciktPmdldF9uYW1lKCksIHBvaW50ZXJfZmllbGQpIDw8ICIsIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJncykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodHN0cnVjdC0+Z2V0X25hbWUoKSwgaXNfYXJncyB8fCBpc19yZXN1bHQpKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOworICAvKgorICAgICBIZXJlIHdlIGdlbmVyYXRlIHRoZSBzdHJ1Y3R1cmUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGZhc3RiaW5hcnkgY29kZWMuCisgICAgIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgICAgIHRocmlmdF9zcGVjIC0+IHR1cGxlIG9mIGl0ZW1fc3BlYworICAgICBpdGVtX3NwZWMgLT4gbmlsIHwgKHRhZywgdHlwZV9lbnVtLCBuYW1lLCBzcGVjX2FyZ3MsIGRlZmF1bHQpCisgICAgIHRhZyAtPiBpbnRlZ2VyCisgICAgIHR5cGVfZW51bSAtPiBUVHlwZS5JMzIgfCBUVHlwZS5TVFJJTkcgfCBUVHlwZS5TVFJVQ1QgfCAuLi4KKyAgICAgbmFtZSAtPiBzdHJpbmdfbGl0ZXJhbAorICAgICBkZWZhdWx0IC0+IG5pbCAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCisgICAgIHNwZWNfYXJncyAtPiBuaWwgICMgRm9yIHNpbXBsZSB0eXBlcworICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzKSAgIyBWYWx1ZSB0eXBlIGZvciBsaXN0L3NldAorICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzLCB0eXBlX2VudW0sIHNwZWNfYXJncykKKyAgICAgICAgICAgICAgICAgICMgS2V5IGFuZCB2YWx1ZSBmb3IgbWFwCisgICAgICAgICAgICAgICAgfCAoY2xhc3NfbmFtZSwgc3BlY19hcmdzX3B0cikgIyBGb3Igc3RydWN0L2V4Y2VwdGlvbgorICAgICBjbGFzc19uYW1lIC0+IGlkZW50aWZpZXIgICMgQmFzaWNhbGx5IGEgcG9pbnRlciB0byB0aGUgY2xhc3MKKyAgICAgc3BlY19hcmdzX3B0ciAtPiBleHByZXNzaW9uICAjIGp1c3QgY2xhc3NfbmFtZS5zcGVjX2FyZ3MKKworICAgICBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1ha2luZyB0aGlzIHdvcmsgZm9yIHN0cnVjdHMgd2l0aCBuZWdhdGl2ZSB0YWdzLgorICAqLworICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgbmlsCisgIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KKyAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCisgIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCisgIGluZGVudF91cCgpOworCisgIGludCBudW1fc2V0YWJsZSA9IDA7CisgIGlmIChzb3J0ZWRfbWVtYmVycy5lbXB0eSgpIHx8IChzb3J0ZWRfbWVtYmVyc1swXS0+Z2V0X2tleSgpID49IDApKSB7CisgICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7CisKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIFNldCBmaWVsZCB0byBvcHRpb25hbCBpZiBmaWVsZCBpcyB1bmlvbiwgdGhpcyBpcyBzbyB3ZSBjYW4gZ2V0IGEKKyAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGZpZWxkLgorICAgICAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgICAgICgqbV9pdGVyKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIGlmIChzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCkpIHsKKyAgICAgICAgaW50IGZpcnN0X3VudXNlZCA9IChzdGQ6Om1heCkoMSwgc29ydGVkX2tleXNfcG9zKyspOworICAgICAgICB3aGlsZSAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7CisgICAgICAgICAgKytzb3J0ZWRfa2V5c19wb3M7CisgICAgICAgIH0KKyAgICAgICAgaW50IGxhc3RfdW51c2VkID0gc29ydGVkX2tleXNfcG9zIC0gMTsKKyAgICAgICAgaWYgKGZpcnN0X3VudXNlZCA8IGxhc3RfdW51c2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZHMgIyAiIDw8IGZpcnN0X3VudXNlZCA8PCAiIHRvICIgPDwgbGFzdF91bnVzZWQgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIGlmIChmaXJzdF91bnVzZWQgPT0gbGFzdF91bnVzZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gdW51c2VkIGZpZWxkICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKTsKKyAgICAgIHN0cmluZyBnb3RhZyA9ICJkYjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgICsgIlwiICI7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBnb3RhZyArPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLG9taXRlbXB0eVwiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdGFnICs9ICJqc29uOlwiIiArIGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSArICJcIiI7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciB1c2VyIG92ZXJyaWRlIG9mIGRiIGFuZCBqc29uIHRhZ3MgdXNpbmcgImdvLnRhZyIKKyAgICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSAoKm1faXRlciktPmFubm90YXRpb25zXy5maW5kKCJnby50YWciKTsKKyAgICAgIGlmIChpdCAhPSAoKm1faXRlciktPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgICAgICBnb3RhZyA9IGl0LT5zZWNvbmQ7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIgPDwgZ29UeXBlIDw8ICIgYHRocmlmdDpcIiIKKyAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCIgPDwgc29ydGVkX2tleXNfcG9zOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgb3V0IDw8ICIscmVxdWlyZWQiOworICAgICAgfQorCisgICAgICBvdXQgPDwgIlwiICIgPDwgZ290YWcgPDwgImAiIDw8IGVuZGw7CisgICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIgorICAgICAgICAgIDw8IHR5cGVfdG9fZ29fdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAmIjsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0IHx8IGlzX2FyZ3MpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbmFsIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7CisgICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOworICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBmYWxzZSk7CisgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIHB1YmxpY2l6ZWRfbmFtZSArICJfREVGQVVMVCI7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBkZWZfdmFyX25hbWUgPDwgIiAiIDw8IGdvVHlwZTsKKyAgICAgIGlmIChkZWZfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkVHlwZSwgZGVmX3ZhbHVlLCAoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gbnVtX3NldGFibGUgaXMgdXNlZCBmb3IgZGVjaWRpbmcgaWYgQ291bnQqIG1ldGhvZHMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHVuaW9uIGZpZWxkcy4KKyAgICAvLyBUaGlzIGFwcGxpZXMgdG8gYWxsIG51bGxhYmxlIGZpZWxkcyBpbmNsdWRpbmcgc2xpY2VzICh1c2VkIGZvciBzZXQsIGxpc3QgYW5kIGJpbmFyeSkgYW5kIG1hcHMsIG5vdCBqdXN0IHBvaW50ZXJzLgorICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkVHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBudW1fc2V0YWJsZSArPSAxOworICAgIH0KKworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKSB7CisgICAgICBzdHJpbmcgZ29PcHRUeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgdHJ1ZSk7CisgICAgICBzdHJpbmcgbWF5YmVwb2ludGVyID0gZ29PcHRUeXBlICE9IGdvVHlwZSA/ICIqIiA6ICIiOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBHZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgIgorICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgIXAuSXNTZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IG1heWJlcG9pbnRlciA8PCAicC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKKyAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLiIgPDwgcHVibGljaXplZF9uYW1lIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYgbnVtX3NldGFibGUgPiAwKSB7CisgICAgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOworICB9CisKKyAgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0LCBudW1fc2V0YWJsZSA+IDApOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gXCI8bmlsPlwiIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBFcnJvcigpIHN0cmluZyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5TdHJpbmcoKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgSXNTZXQgaGVscGVyIG1ldGhvZHMgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBJc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkgYm9vbCB7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGJvb2wgaXNfYnl0ZXNsaWNlID0gdHR5cGUtPmlzX2JpbmFyeSgpOworICAgICAgYm9vbCBjb21wYXJlX3RvX25pbF9vbmx5ID0gdHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX21hcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfYnl0ZXNsaWNlICYmICEoKmZfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpIHx8IGNvbXBhcmVfdG9fbmlsX29ubHkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBuaWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgZmllbGRfbmFtZSArICJfREVGQVVMVCI7CisgICAgICAgIGlmIChpc19ieXRlc2xpY2UpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAhYnl0ZXMuRXF1YWwocC4iIDw8IGZpZWxkX25hbWUgPDwgIiwgIiA8PCBkZWZfdmFyX25hbWUgPDwgIikiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDb3VudFNldEZpZWxkcyBoZWxwZXIgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBDb3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKSBpbnQgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50IDo9IDAiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBjb250aW51ZTsKKworICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworCisgICAgaWYgKCEoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChwLklzU2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50KysiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb3VudCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgIihpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHJlYWQgZXJyb3I6IFwiLCBwKSwgZXJyKSIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBkb2VzIG5vdCBoYXZlIElzU2V0IGZ1bmN0aW9ucywgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgYm9vbCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiBcIiwgcCwgZmllbGRJZCksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09IHRocmlmdC5TVE9QIHsgYnJlYWs7IH0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIHRocmlmdEZpZWxkVHlwZUlkOworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nLCBmYWxzZSBpZiBubyBmaWVsZHMgcHJlc2VudAorICBib29sIGhhdmVfc3dpdGNoID0gIWZpZWxkcy5lbXB0eSgpOworICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIGZpZWxkSWQgeyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEFsbCB0aGUgZmllbGRzIHdlIGtub3cKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgLy8gaWYgbmVnYXRpdmUgaWQsIGVuc3VyZSB3ZSBnZW5lcmF0ZSBhIHZhbGlkIG1ldGhvZCBuYW1lCisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdGhyaWZ0RmllbGRUeXBlSWQgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0aHJpZnRGaWVsZFR5cGVJZCA9PSAidGhyaWZ0LkJJTkFSWSIpIHsKKyAgICAgIHRocmlmdEZpZWxkVHlwZUlkID0gInRocmlmdC5TVFJJTkciOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRUeXBlSWQgPT0gIiA8PCB0aHJpZnRGaWVsZFR5cGVJZCA8PCAiIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4IDw8ICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiCisgICAgICAgIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKworICAgIC8vIE1hcmsgcmVxdWlyZWQgZmllbGQgYXMgcmVhZAorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWUiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBCZWdpbiBzd2l0Y2ggZGVmYXVsdCBjYXNlCisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBTa2lwIHVua25vd24gZmllbGRzIGluIGVpdGhlciBjYXNlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gRW5kIHN3aXRjaCBkZWZhdWx0IGNhc2UKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIHJlYWQgc3RydWN0IGVuZCBlcnJvcjogXCIsIHApLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gUmV0dXJuIGVycm9yIGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgIWlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICJ7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmbXQuRXJyb3JmKFwiUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgbm90IHNldFwiKSk7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfdHlwZV9uYW1lKHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKTsKKyAgICBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIlJlYWRGaWVsZCIpOworICAgIGludDMyX3QgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgICIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIGZhbHNlLCAicC4iKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBzdHJpbmcgbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKKyAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGMgOj0gcC5Db3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKTsgYyAhPSAxIHsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCIlVCB3cml0ZSB1bmlvbjogZXhhY3RseSBvbmUgZmllbGQgbXVzdCBiZSBzZXQgKCVkIHNldCkuXCIsIHAsIGMpIgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgd3JpdGUgc3RydWN0IGJlZ2luIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICBzdHJpbmcgZmllbGRfbmFtZTsKKyAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOworICAvLyB0X2NvbnN0X3ZhbHVlKiBmaWVsZF9kZWZhdWx0X3ZhbHVlOworICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXF1aXJlZDsKKyAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcCAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOworICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJ3cml0ZSBzdHJ1Y3Qgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJ3cml0ZUZpZWxkIik7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKKyAgICAvLyBmaWVsZF9kZWZhdWx0X3ZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmaWVsZF9yZXF1aXJlZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBwLklzU2V0IiA8PCBwdWJsaWNpemUoZmllbGRfbmFtZSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oXCIiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICJcIiwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8IGZpZWxkX2lkIDw8ICIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgIgorICAgICAgICA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJwLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yICIKKyAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgdGVzdF9zdWZmaXgoIl90ZXN0Iik7CisgIHN0cmluZyBmaWxlbmFtZSA9IGxvd2VyY2FzZShzZXJ2aWNlX25hbWVfKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZl90eXBlc18gPDwgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBzdWNjZXNzLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZiA9ICpmX2l0ZXI7CisgICAgICBmLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgcmVzdWx0LmFwcGVuZChmKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisgIHN0cmluZyBpbnRlcmZhY2VOYW1lID0gc2VydmljZU5hbWU7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgIiAgIiArIGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyBwdWJsaWNpemUoZXh0ZW5kcykgKyAiXG4iOworICAgIH0KKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgaW50ZXJmYWNlTmFtZSA8PCAiIGludGVyZmFjZSB7IiA8PCBleHRlbmRzX2lmOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKworICBpZiAoIWZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCAoKmZfaXRlcikpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2ZpZWxkID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnRfbmV3ID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICArICJDbGllbnQiOworICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOworICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKKyAgICB9CisgIH0KKworICBleHRlbmRzX2ZpZWxkID0gZXh0ZW5kc19jbGllbnQuc3Vic3RyKGV4dGVuZHNfY2xpZW50LmZpbmQoIi4iKSArIDEpOworCisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHNlcnZpY2UpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgc3RydWN0IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghZXh0ZW5kc19jbGllbnQuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIqIiA8PCBleHRlbmRzX2NsaWVudCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjIHRocmlmdC5UQ2xpZW50IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBMZWdhY3kgY29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgIDw8ICJDbGllbnRGYWN0b3J5KHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGYgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICJGYWN0b3J5KHQsIGYpfSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoZi5HZXRQcm90b2NvbCh0KSwgZi5HZXRQcm90b2NvbCh0KSksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAvLyBMZWdhY3kgY29uc3RydWN0b3IgZnVuY3Rpb24gd2l0aCBjdXN0b20gaW5wdXQgJiBvdXRwdXQgcHJvdG9jb2xzCisgIGZfdHlwZXNfCisgICAgICA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgICA8PCAiQ2xpZW50UHJvdG9jb2wodCB0aHJpZnQuVFRyYW5zcG9ydCwgaXByb3QgdGhyaWZ0LlRQcm90b2NvbCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKiIKKyAgICAgIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiUHJvdG9jb2wodCwgaXByb3QsIG9wcm90KX0iCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiB0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICA8PCAiQ2xpZW50KGMgdGhyaWZ0LlRDbGllbnQpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiKGMpLCIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogYywiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgQ2xpZW50XygpIHRocmlmdC5UQ2xpZW50IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBwLmMiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sICgqZl9pdGVyKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgIgorICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtZXRob2QgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgYXJnc1R5cGUgPSBwdWJsaWNpemUobWV0aG9kICsgIl9hcmdzIiwgdHJ1ZSk7CisgICAgc3RkOjpzdHJpbmcgYXJnc05hbWUgPSB0bXAoIl9hcmdzIik7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGFyZ3NOYW1lIDw8ICIgIiA8PCBhcmdzVHlwZSA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGFyZ3NOYW1lIDw8ICIuIiA8PCBwdWJsaWNpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHROYW1lID0gdG1wKCJfcmVzdWx0Iik7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfcmVzdWx0IiwgdHJ1ZSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcmVzdWx0TmFtZSA8PCAiICIgPDwgcmVzdWx0VHlwZSA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgICAgPDwgbWV0aG9kIDw8ICJcIiwgJiIgPDwgYXJnc05hbWUgPDwgIiwgJiIgPDwgcmVzdWx0TmFtZSA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHsiIDw8IGVuZGw7CisKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwdWJuYW1lID0gcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGQgPSByZXN1bHROYW1lICsgIi4iICsgcHVibmFtZTsKKworICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGQgPDwgIiE9IG5pbDoiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHIsICIgPDwgZmllbGQgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiPDwgZmllbGQgPDwgZW5kbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgcmVzdWx0TmFtZSA8PCAiLkdldFN1Y2Nlc3MoKSwgbmlsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE86IHdvdWxkIGJlIG5pY2UgdG8gbm90IHRvIGR1cGxpY2F0ZSB0aGUgY2FsbCBnZW5lcmF0aW9uCisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgIDw8IG1ldGhvZCA8PCAiXCIsICYiPDwgYXJnc05hbWUgPDwgIiwgbmlsKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdF9zZXJ2aWNlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBjb2xsZWN0IGluaGVyaXRlZCBmdW5jdGlvbnMKKyAgd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBwX2Z1bmN0aW9ucyA9IHBhcmVudC0+Z2V0X2Z1bmN0aW9ucygpOworICAgIGZ1bmN0aW9ucy5pbnNlcnQoZnVuY3Rpb25zLmVuZCgpLCBwX2Z1bmN0aW9ucy5iZWdpbigpLCBwX2Z1bmN0aW9ucy5lbmQoKSk7CisgICAgcGFyZW50ID0gcGFyZW50LT5nZXRfZXh0ZW5kcygpOworICB9CisKKyAgLy8gVGhpcyBmaWxlIGlzIG5vdCB1c2VmdWwgaWYgdGhlcmUgYXJlIG5vIGZ1bmN0aW9uczsgZG9uJ3QgZ2VuZXJhdGUgaXQKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX3JlbW90ZV9kaXIgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUiOworICBNS0RJUihmX3JlbW90ZV9kaXIuY19zdHIoKSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IGZfcmVtb3RlX2RpciArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlLmdvIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3JlbW90ZTsKKyAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgc2VydmljZV9tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgd2hpbGUgKChsb2MgPSBzZXJ2aWNlX21vZHVsZS5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHNlcnZpY2VfbW9kdWxlLnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOworICB9CisgIGlmICghZ2VuX3BhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc2VydmljZV9tb2R1bGUgPSBnZW5fcGFja2FnZV9wcmVmaXhfICsgc2VydmljZV9tb2R1bGU7CisgIH0KKworICBzdHJpbmcgdW51c2VkX3Byb3RlY3Rpb247CisKKyAgc3RyaW5nIGN0eFBhY2thZ2UgPSAiY29udGV4dCI7CisKKyAgZl9yZW1vdGUgPDwgZ29fYXV0b2dlbl9jb21tZW50KCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJwYWNrYWdlIG1haW4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImltcG9ydCAoIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgY3R4UGFja2FnZSA8PCAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiZmxhZ1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZtdFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm1hdGhcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXRcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJuZXQvdXJsXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwib3NcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJjb252XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyaW5nc1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyh1bnVzZWRfcHJvdGVjdGlvbik7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiIiA8PCBzZXJ2aWNlX21vZHVsZSA8PCAiXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCB1bnVzZWRfcHJvdGVjdGlvbjsgLy8gZmlsbGVkIGluIHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcygpCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIFVzYWdlKCkgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJVc2FnZSBvZiBcIiwgb3MuQXJnc1swXSwgXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXTpcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZsYWcuUHJpbnREZWZhdWx0cygpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIlxcbkZ1bmN0aW9uczpcIikiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3JlbW90ZSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIiAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorCisgICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGZfcmVtb3RlIDw8ICIpXCIpIiA8PCBlbmRsOworICB9CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0eXBlIGh0dHBIZWFkZXJzIG1hcFtzdHJpbmddc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHZhciBtIG1hcFtzdHJpbmddc3RyaW5nID0gaCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5TcHJpbnRmKFwiJXNcIiwgbSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU2V0KHZhbHVlIHN0cmluZykgZXJyb3IgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFydHMgOj0gc3RyaW5ncy5TcGxpdCh2YWx1ZSwgXCI6IFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKHBhcnRzKSAhPSAyIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGZtdC5FcnJvcmYoXCJoZWFkZXIgc2hvdWxkIGJlIG9mIGZvcm1hdCAnS2V5OiBWYWx1ZSdcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGhbcGFydHNbMF1dID0gcGFydHNbMV0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIG1haW4oKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBob3N0IHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwb3J0IGludCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXJsU3RyaW5nIHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBmcmFtZWQgYm9vbCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJoZWFkZXJzIDo9IG1ha2UoaHR0cEhlYWRlcnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHBhcnNlZFVybCAqdXJsLlVSTCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8gPSBzdHJjb252LkF0b2kiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gbWF0aC5BYnMiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmaG9zdCwgXCJoXCIsIFwibG9jYWxob3N0XCIsIFwiU3BlY2lmeSBob3N0IGFuZCBwb3J0XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5JbnRWYXIoJnBvcnQsIFwicFwiLCA5MDkwLCBcIlNwZWNpZnkgcG9ydFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgXCJQXCIsIFwiYmluYXJ5XCIsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbiwganNvbilcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmdXJsU3RyaW5nLCBcInVcIiwgXCJcIiwgXCJTcGVjaWZ5IHRoZSB1cmxcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJmZyYW1lZCwgXCJmcmFtZWRcIiwgZmFsc2UsIFwiVXNlIGZyYW1lZCB0cmFuc3BvcnRcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVmFyKGhlYWRlcnMsIFwiSFwiLCBcIkhlYWRlcnMgdG8gc2V0IG9uIHRoZSBodHRwKHMpIHJlcXVlc3QgKGUuZy4gLUggXFxcIktleTogVmFsdWVcXFwiKVwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuUGFyc2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGxlbih1cmxTdHJpbmcpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB2YXIgZXJyIGVycm9yIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwYXJzZWRVcmwsIGVyciA9IHVybC5QYXJzZSh1cmxTdHJpbmcpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBob3N0ID0gcGFyc2VkVXJsLkhvc3QiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHVzZUh0dHAgPSBsZW4ocGFyc2VkVXJsLlNjaGVtZSkgPD0gMCB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cFwiIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwc1wiIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHVzZUh0dHAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgXywgZXJyIDo9IHVybC5QYXJzZShmbXQuU3ByaW50KFwiaHR0cDovL1wiLCBob3N0LCBcIjpcIiwgcG9ydCkpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNtZCA6PSBmbGFnLkFyZygwKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBlcnIgZXJyb3IiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQocGFyc2VkVXJsLlN0cmluZygpKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKGhlYWRlcnMpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGh0dHB0cmFucyA6PSB0cmFucy4oKnRocmlmdC5USHR0cENsaWVudCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2UgaGVhZGVycyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgaHR0cHRyYW5zLlNldEhlYWRlcihrZXksIHZhbHVlKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBvcnRTdHIgOj0gZm10LlNwcmludChwb3J0KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgc3RyaW5ncy5Db250YWlucyhob3N0LCBcIjpcIikgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGhvc3QsIHBvcnRTdHIsIGVyciA9IG5ldC5TcGxpdEhvc3RQb3J0KGhvc3QpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHdpdGggaG9zdDpcIiwgZXJyKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChuZXQuSm9pbkhvc3RQb3J0KGhvc3QsIHBvcnRTdHIpKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiZXJyb3IgcmVzb2x2aW5nIGFkZHJlc3M6XCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZnJhbWVkIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIGNyZWF0aW5nIHRyYW5zcG9ydFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyIHRyYW5zLkNsb3NlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHByb3RvY29sIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiY29tcGFjdFwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcInNpbXBsZWpzb25cIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJqc29uXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiYmluYXJ5XCIsIFwiXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZDogXCIsIHByb3RvY29sKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAib3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNsaWVudCA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKQorICAgICAgICAgICA8PCAiQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3Igb3BlbmluZyBzb2NrZXQgdG8gXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3QsIFwiOlwiLCBwb3J0LCBcIiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggY21kIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgc3RyaW5nIGZ1bmNOYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgc3RyaW5nIHB1Yk5hbWUocHVibGljaXplKGZ1bmNOYW1lKSk7CisgICAgc3RyaW5nIGFyZ3VtZW50c05hbWUocHVibGljaXplKGZ1bmNOYW1lICsgIl9hcmdzIiwgdHJ1ZSkpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiIiA8PCBlc2NhcGVfc3RyaW5nKGZ1bmNOYW1lKSA8PCAiXCI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBmbGFnLk5BcmcoKSAtIDEgIT0gIiA8PCBudW1fYXJncyA8PCAiIHsiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIiIDw8IGVzY2FwZV9zdHJpbmcocHViTmFtZSkgPDwgIiByZXF1aXJlcyAiCisgICAgICAgICAgICAgPDwgbnVtX2FyZ3MgPDwgIiBhcmdzXCIpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBmbGFnQXJnID0gaSArIDE7CisgICAgICB0X3R5cGUqIHRoZV90eXBlKGFyZ3NbaV0tPmdldF90eXBlKCkpOworICAgICAgdF90eXBlKiB0aGVfdHlwZTIoZ2V0X3RydWVfdHlwZSh0aGVfdHlwZSkpOworCisgICAgICBpZiAodGhlX3R5cGUyLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCBlcnIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iCisgICAgICAgICAgICAgICAgIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopdGhlX3R5cGUyKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3RyaW5nIGVycih0bXAoImVyciIpKTsKKworICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmICh0aGVfdHlwZTItPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBbXWJ5dGUoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQ4KHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDE2KHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDMyKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIKKyAgICAgICAgICAgICAgICAgICA8PCAiIDo9IChzdHJjb252LlBhcnNlSW50KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgMTAsIDY0KSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCisgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUZsb2F0KGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSwgNjQpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAorICAgICAgICAvLyAiKSkpIjsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOworICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7CisgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOworICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7CisgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7CisgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOworICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbW9kdWxlKCBtb2R1bGVfbmFtZSh0aGVfdHlwZSkpOworICAgICAgICBpZih0c3RydWN0X21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgICAgdHN0cnVjdF9tb2R1bGUgPSBwYWNrYWdlX25hbWVfOworICAgICAgICB9CisKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0c3RydWN0X21vZHVsZSA8PCAiLk5ldyIgPDwgdHN0cnVjdF9uYW1lCisgICAgICAgICAgICAgICAgIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9IGFyZ3ZhbHVlIiA8PCBpIDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIigiIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2NvbnRhaW5lcigpIHx8IHRoZV90eXBlMi0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOworICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7CisgICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOworICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7CisgICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7CisgICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOworICAgICAgICBzdGQ6OnN0cmluZyBhcmdOYW1lKHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSk7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyAiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IgorICAgICAgICAgICAgICAgICA8PCBhcmd1bWVudHNOYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZXJyMiA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLlJlYWRGaWVsZCIgPDwgKGkgKyAxKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLiIgPDwgYXJnTmFtZQorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3coIkludmFsaWQgYXJndW1lbnQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgfQorCisgICAgICBpZiAodGhlX3R5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlZGVmX21vZHVsZSggbW9kdWxlX25hbWUodGhlX3R5cGUpKTsKKyAgICAgICAgaWYodHlwZWRlZl9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICAgIHR5cGVkZWZfbW9kdWxlID0gcGFja2FnZV9uYW1lXzsKKyAgICAgICAgfQorICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHR5cGVkZWZfbW9kdWxlIDw8ICIuIgorICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIoYXJndmFsdWUiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbXQuUHJpbnQoY2xpZW50LiIgPDwgcHViTmFtZSA8PCAiKCI7CisgICAgYm9vbCBhcmdGaXJzdCA9IHRydWU7CisKKyAgICBmX3JlbW90ZSA8PCAiY29udGV4dC5CYWNrZ3JvdW5kKCkiOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoYXJnRmlyc3QpIHsKKyAgICAgICAgYXJnRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisKKyAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKikoYXJnc1tpXS0+Z2V0X3R5cGUoKSkpLT5nZXRfYmFzZSgpOworCisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8CisgICAgICAgIC8vICIpKSkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOworICAgICAgfQorICAgIH0KKworICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KFwiXFxuXCIpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJicmVhayIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBmdW5jdGlvbiBcIiwgY21kKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9yZW1vdGUuY2xvc2UoKTsKKyAgZm9ybWF0X2dvX291dHB1dChmX3JlbW90ZV9uYW1lKTsKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgorICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCisgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICisjZW5kaWYKKyAgICAgICAgKTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb2Nlc3NvciI7CisgICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgIk5ldyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIlByb2Nlc3NvciI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gcHVibGljaXplKGV4dGVuZHMpICsgIlByb2Nlc3NvciI7CisgICAgICBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPSAiTmV3IiArIGV4dGVuZHNfcHJvY2Vzc29yOworICAgIH0KKyAgfQorCisgIHN0cmluZyBwU2VydmljZU5hbWUocHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBzdHJpbmcgc2VsZih0bXAoInNlbGYiKSk7CisKKyAgaWYgKGV4dGVuZHNfcHJvY2Vzc29yLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yTWFwIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgc2VydmljZU5hbWUgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBBZGRUb1Byb2Nlc3Nvck1hcChrZXkgc3RyaW5nLCBwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbikgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcC5wcm9jZXNzb3JNYXBba2V5XSA9IHByb2Nlc3NvciIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBHZXRQcm9jZXNzb3JGdW5jdGlvbihrZXkgc3RyaW5nKSAiCisgICAgICAgICAgICAgICAgICAiKHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uLCBvayBib29sKSB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvciwgb2sgPSBwLnByb2Nlc3Nvck1hcFtrZXldIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzb3IsIG9rIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3Nvck1hcCgpIG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLnByb2Nlc3Nvck1hcCIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgIDw8ICJQcm9jZXNzb3J7aGFuZGxlcjpoYW5kbGVyLCBwcm9jZXNzb3JNYXA6bWFrZShtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pfSIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5wcm9jZXNzb3JNYXBbXCIiIDw8IGVzY2FwZWRGdW5jTmFtZSA8PCAiXCJdID0gJiIKKyAgICAgICAgICAgICAgICAgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgeCh0bXAoIngiKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgIgorICAgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG5hbWUsIF8sIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gZmFsc2UsIGVyciB9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIHByb2Nlc3Nvciwgb2sgOj0gcC5HZXRQcm9jZXNzb3JGdW5jdGlvbihuYW1lKTsgb2sgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBwcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNlcUlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuU2tpcCh0aHJpZnQuU1RSVUNUKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgeAorICAgICAgICAgICAgICAgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5VTktOT1dOX01FVEhPRCwgXCJVbmtub3duIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICJcIiArIG5hbWUpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHggPDwgIi5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsICIgPDwgeCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgKiIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyICIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yeyIKKyAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yX25ldyA8PCAiKGhhbmRsZXIpfSIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5BZGRUb1Byb2Nlc3Nvck1hcChcIiIgPDwgZXNjYXBlZEZ1bmNOYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgJiIgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSkiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBzdHJpbmcgcHJvY2Vzc29yTmFtZSA9IHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc29yIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBhcmdzbmFtZSA9IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiLCB0cnVlKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiLCB0cnVlKTsKKworICAvLyB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgLy8gY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGhhbmRsZXIgIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHByb2Nlc3Nvck5hbWUKKyAgICAgICAgICAgICA8PCAiKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IGFyZ3MuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuUFJPVE9DT0xfRVJST1IsIGVyci5FcnJvcigpKSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgfQorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsIGVyciIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA6PSAiIDw8IHJlc3VsdG5hbWUgPDwgInt9IiA8PCBlbmRsOworICB9CisgIGJvb2wgbmVlZF9yZWZlcmVuY2UgPSB0eXBlX25lZWRfcmVmZXJlbmNlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3R5cGVzXyA8PCAidmFyIHJldHZhbCAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyIGVycjIgZXJyb3IiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiAiOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICJyZXR2YWwsICI7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmX3R5cGVzXyA8PCAiZXJyMiA9IHAuaGFuZGxlci4iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZl90eXBlc18gPDwgImN0eCI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCAiYXJncy4iIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisKKyAgZl90eXBlc18gPDwgIik7IGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeF9maWVsZHMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICBpZiAoIXhfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHYgOj0gZXJyMi4odHlwZSkgeyIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhmX2l0ZXI7CisKKyAgICBmb3IgKHhmX2l0ZXIgPSB4X2ZpZWxkcy5iZWdpbigpOyB4Zl9pdGVyICE9IHhfZmllbGRzLmVuZCgpOyArK3hmX2l0ZXIpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCgqeGZfaXRlciktPmdldF90eXBlKCkpKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwdWJsaWNpemUoKCp4Zl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHYiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZGVmYXVsdDoiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiOiBcIiArIGVycjIuRXJyb3IoKSkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlLCBlcnIyIiA8PCBlbmRsOworCisgIGlmICgheF9maWVsZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iOyAvLyBjbG9zZXMgZXJyMiAhPSBuaWwKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiIGVsc2UgeyIgPDwgZW5kbDsgLy8gbWFrZSBzdXJlIHdlIHNldCBTdWNjZXNzIHJldHZhbCBvbmx5IG9uIHN1Y2Nlc3MKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgICAgIGlmIChuZWVkX3JlZmVyZW5jZSkgeworICAgICAgICBmX3R5cGVzXyA8PCAiJiI7CisgICAgICB9CisgICAgICBmX3R5cGVzXyA8PCAicmV0dmFsIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgdGhyaWZ0LlJFUExZLCBzZXFJZCk7IGVycjIgIT0gbmlsIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSByZXN1bHQuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LkZsdXNoKGN0eCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgZXJyIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBuaWwiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgeworICAodm9pZClpbmNsYXNzOworICAodm9pZCljb2VyY2VEYXRhOworICB0X3R5cGUqIG9yaWdfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOworICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCwgaW5fY29udGFpbmVyX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCBvcmlnX3R5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgZGVjbGFyZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpZiAoZGVjbGFyZSkgeworICAgICAgc3RyaW5nIHR5cGVfbmFtZSA9IGlua2V5ID8gdHlwZV90b19nb19rZXlfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgICAgb3V0IDw8ICJ2YXIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiB2LCBlcnIgOj0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpIjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiUmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIlJlYWRJMzIoKSI7CisgICAgfQorCisgICAgb3V0IDw8ICI7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBmaWVsZCAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCisgICAgICAgIDw8ICI6IFwiLCBlcnIpIiA8PCBlbmRsOworCisgICAgb3V0IDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBzdHJpbmcgd3JhcDsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgb3JpZ190eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHdyYXAgPSBwdWJsaWNpemUodHlwZV9uYW1lKG9yaWdfdHlwZSkpOworICAgIH0gZWxzZSBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHsKKyAgICAgIHdyYXAgPSAiaW50OCI7CisgICAgfQorCisgICAgc3RyaW5nIG1heWJlX2FkZHJlc3MgPSAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpID8gIiYiIDogIiIpOworICAgIGlmICh3cmFwID09ICIiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IG1heWJlX2FkZHJlc3MgPDwgInYiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0ZW1wIDo9ICIgPDwgd3JhcCA8PCAiKHYpIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ0ZW1wIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICciICsgdHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBmaWVsZCAnIgorICAgICAgICArIHRmaWVsZC0+Z2V0X25hbWUoKSArICInIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZXEoZGVjbGFyZSA/ICIgOj0gIiA6ICIgPSAiKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpOworICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCBlcnJvciByZWFkaW5nIHN0cnVjdDogXCIsICIKKyAgICAgIDw8IHByZWZpeCA8PCAiKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogb3JpZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOworICBzdHJpbmcgZXEoIiA9ICIpOworCisgIGlmIChkZWNsYXJlKSB7CisgICAgZXEgPSAiIDo9ICI7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0TWFwIDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCBzaXplKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidE1hcCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNldCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTZXQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGxpc3QgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTbGljZSA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTbGljZSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIHByZWZpeCAnIgorICAgICAgICArIHByZWZpeCArICInIjsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSArKyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAocG9pbnRlcl9maWVsZCkgeworICAgIHByZWZpeCA9ICIoKiIgKyBwcmVmaXggKyAiKSI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFNldEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRMaXN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGxpc3QgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBma2V5LnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGZ2YWwuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0oKCh0X2xpc3QqKXRsaXN0KS0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgZmVsZW0uc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBhcHBlbmQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGdlbmVyYXRlIHNlcmlhbGl6ZSBmb3Igdm9pZCB0eXBlOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgZXJyIDo9IG9wcm90LiI7CisKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpKSB7CisgICAgICBuYW1lID0gIioiICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKHN0cmluZygiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKGJvb2woIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZShpbnQ4KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMTYoaW50MTYoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KGludDY0KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoZmxvYXQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gR28gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOworICAgIH0KKworICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVULiIKKyAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgKCIgPDwgdGZpZWxkLT5nZXRfa2V5KCkKKyAgICAgICAgPDwgIikgZmllbGQgd3JpdGUgZXJyb3I6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiJyBmb3IgZmllbGQgJyIgKyBuYW1lICsgIiciOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9ICIgPDwgcHJlZml4IDw8ICIuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgZXJyb3Igd3JpdGluZyBzdHJ1Y3Q6IFwiLCAiCisgICAgICA8PCBwcmVmaXggPDwgIiksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBpZiAocG9pbnRlcl9maWVsZCkgeworICAgIHByZWZpeCA9ICIqIiArIHByZWZpeDsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIicgZm9yIHByZWZpeCAnIiArIHByZWZpeCArICInIjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgdG1hcCwgImsiLCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaTxsZW4oIiA8PCBwcmVmaXggPDwgIik7IGkrKyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBmb3IgaiA6PSBpKzE7IGo8bGVuKCIgPDwgcHJlZml4IDw8ICIpOyBqKysgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiByZWZsZWN0LkRlZXBFcXVhbCgiIDw8IHByZWZpeCA8PCAiW2ldLCIgPDwgcHJlZml4IDw8ICJbal0pIHsgIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJcIiwgZm10LkVycm9yZihcIiVUIGVycm9yIHdyaXRpbmcgc2V0IGZpZWxkOiBzbGljZSBpcyBub3QgdW5pcXVlXCIsICIgPDwgcHJlZml4IDw8ICJbaV0pKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBfLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCB0c2V0LCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBfLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCB0bGlzdCwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIG1hcCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIiIpOworICBrZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgdmZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGtpdGVyLCB0cnVlKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgdml0ZXIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIiIpOworICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIiIpOworICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7CisgIGJvb2wgaGFzX2RvYyA9IGZhbHNlOworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorCisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICIgLSAiIDw8IHB1YmxpY2l6ZShwLT5nZXRfbmFtZSgpKTsKKworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGhhc19kb2MpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgcmVzdWx0IDw8IHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICI9IjsKKworICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgcmVzdWx0IDw8ICJ0aHJpZnRfc3BlY1siIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPDwgIm5pbCI7CisgIH0KKworICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBzdHJ1Y3QgZmllbGQgaW5pdGlhbCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCwgd2hpY2ggbXVzdCBoYXZlIGB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTExgCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmIChvcHRpb25hbF9maWVsZCkgeworICAgIC8vIFRoZSBjYWxsZXIgd2lsbCBtYWtlIGEgc2Vjb25kIHBhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcywKKyAgICAvLyBhc3NpZ25pbmcgdGhlIHJlc3VsdCBvZiByZW5kZXJfY29uc3RfdmFsdWUgdG8gIipmaWVsZF9uYW1lIi4gSXQKKyAgICAvLyBpcyBtYWRkZW5pbmcgdGhhdCBHbyBzeW50YXggZG9lcyBub3QgYWxsb3cgZm9yIGEgdHlwZS1hZ25vc3RpYworICAgIC8vIHdheSB0byBpbml0aWFsaXplIGEgcG9pbnRlciB0byBhIGNvbnN0IHZhbHVlLCBidXQgc28gaXQgZ29lcy4KKyAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gd3JpdGUgdHlwZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdAorICAgIC8vIGNvbnZlcnQgZnJvbSBjb25zdCB2YWx1ZXMgdG8gcG9pbnRlciB0eXBlcywgYnV0IGdpdmVuIHRoZSBsYWNrCisgICAgLy8gb2Ygb3ZlcmxvYWRpbmcgaXQgd291bGQgYmUgbWVzc3kuCisgICAgcmV0dXJuICJuZXcoIiArIHR5cGVfdG9fZ29fdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikiOworICB9IGVsc2UgeworICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSwgbmFtZSk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQorICByZXR1cm4gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKKyAgICAgICAgICsgIikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgsIGJvb2wgYWRkRXJyb3IpIHsKKyAgc3RyaW5nIHNpZ25hdHVyZSA9IHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiOworICBzaWduYXR1cmUgKz0gImN0eCBjb250ZXh0LkNvbnRleHQiOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgc2lnbmF0dXJlICs9ICIsICIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIH0KKyAgc2lnbmF0dXJlICs9ICIpICgiOworCisgIHRfdHlwZSogcmV0ID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBzdHJpbmcgZXJycyA9IGFyZ3VtZW50X2xpc3QoZXhjZXB0aW9ucyk7CisKKyAgaWYgKCFyZXQtPmlzX3ZvaWQoKSkgeworICAgIHNpZ25hdHVyZSArPSAiciAiICsgdHlwZV90b19nb190eXBlKHJldCk7CisKKyAgICBpZiAoYWRkRXJyb3IgfHwgZXJycy5zaXplKCkgPT0gMCkgeworICAgICAgc2lnbmF0dXJlICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGFkZEVycm9yKSB7CisgICAgc2lnbmF0dXJlICs9ICJlcnIgZXJyb3IiOworICB9CisKKyAgc2lnbmF0dXJlICs9ICIpIjsKKyAgcmV0dXJuIHNpZ25hdHVyZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisKKyAgICByZXN1bHQgKz0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiICIKKyAgICAgICAgICAgICAgKyB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIG1vZHVsZSggbW9kdWxlX25hbWUodHR5cGUpKTsKKyAgaWYoICEgbW9kdWxlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gbW9kdWxlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6bW9kdWxlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBpZiAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKS5lbXB0eSgpIHx8CisgICAgICAgIHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpLmVtcHR5KCkgfHwKKyAgICAgICAgcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKSAhPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgc3RyaW5nIG1vZHVsZShnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbSkpOworICAgICAgLy8gZm9yIG5hbWVzcGFjZWQgaW5jbHVkZXMsIG9ubHkga2VlcCBwYXJ0IGFmdGVyIGRvdC4KKyAgICAgIHNpemVfdCBkb3QgPSBtb2R1bGUucmZpbmQoJy4nKTsKKyAgICAgIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIG1vZHVsZSA9IG1vZHVsZS5zdWJzdHIoZG90ICsgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gbW9kdWxlOworICAgIH0KKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5b2UKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIC8qIHRoaXMgaXMgd3JvbmcsIGJpbmFyeSBpcyBzdGlsbCBhIHN0cmluZyB0eXBlIGludGVybmFsbHkKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIHJldHVybiAidGhyaWZ0LkJJTkFSWSI7CisgICAgICB9CisgICAgICAqLworICAgICAgcmV0dXJuICJ0aHJpZnQuU1RSSU5HIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAidGhyaWZ0LkJPT0wiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0LkJZVEUiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdC5JMTYiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gInRocmlmdC5JMzIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gInRocmlmdC5JNjQiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gInRocmlmdC5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAidGhyaWZ0LlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyBtYXAgdHlwZSwgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgd2lsbAorICogbm90IHByb2R1Y2UgYSB2YWxpZCBnbyBtYXAgdHlwZS4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHlwZSkgeworICB0X3R5cGUqIHJlc29sdmVkX3R5cGUgPSB0eXBlOworCisgIHdoaWxlIChyZXNvbHZlZF90eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXNvbHZlZF90eXBlID0gKCh0X3R5cGVkZWYqKXJlc29sdmVkX3R5cGUpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIH0KKworICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfbWFwKCkgfHwgcmVzb2x2ZWRfdHlwZS0+aXNfbGlzdCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX3NldCgpKSB7CisgICAgdGhyb3cgIkNhbm5vdCBwcm9kdWNlIGEgdmFsaWQgdHlwZSBmb3IgYSBHbyBtYXAga2V5OiAiICsgdHlwZV90b19nb190eXBlKHR5cGUpICsgIiAtIGFib3J0aW5nLiI7CisgIH0KKworICBpZiAocmVzb2x2ZWRfdHlwZS0+aXNfYmluYXJ5KCkpCisgICAgcmV0dXJuICJzdHJpbmciOworCisgIHJldHVybiB0eXBlX3RvX2dvX3R5cGUodHlwZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlKHRfdHlwZSogdHlwZSkgeworICByZXR1cm4gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHR5cGUsIGZhbHNlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5cGUsIHRha2luZyBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgZmllbGQKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHlwZSBpcyBUX09QVElPTkFMLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKSB7CisgIHN0cmluZyBtYXliZV9wb2ludGVyKG9wdGlvbmFsX2ZpZWxkID8gIioiIDogIiIpOworCisgIGlmICh0eXBlLT5pc190eXBlZGVmKCkgJiYgKCh0X3R5cGVkZWYqKXR5cGUpLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90cnVlX3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgIltdYnl0ZSI7CisgICAgICB9CisKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgInN0cmluZyI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJib29sIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ4IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MTYiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQzMiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDY0IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiZmxvYXQ2NCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKiIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0ID0gKHRfbWFwKil0eXBlOworICAgIHN0cmluZyBrZXlUeXBlID0gdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfa2V5X3R5cGUoKSk7CisgICAgc3RyaW5nIHZhbHVlVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfdmFsX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIm1hcFsiKSArIGtleVR5cGUgKyAiXSIgKyB2YWx1ZVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdCA9ICh0X3NldCopdHlwZTsKKyAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygiW10iKSArIGVsZW1UeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdCA9ICh0X2xpc3QqKXR5cGU7CisgICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLnRocmlmdF9zcGVjKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fc3BlY19hcmdzOiAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK2Jvb2wgZm9ybWF0X2dvX291dHB1dChjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCkgeworCisgIC8vIGZvcm1hdHRpbmcgdmlhIGdvZm10IGRlYWN0aXZhdGVkIGR1ZSB0byBUSFJJRlQtMzg5MworICAvLyBQbGVhc2UgbG9vayBhdCB0aGUgdGlja2V0IGFuZCBtYWtlIHN1cmUgeW91IGZ1bGx5IHVuZGVyc3RhbmQgYWxsIHRoZSBpbXBsaWNhdGlvbnMKKyAgLy8gYmVmb3JlIHN1Ym1pdHRpbmcgYSBwYXRjaCB0aGF0IGVuYWJsZXMgdGhpcyBmZWF0dXJlIGFnYWluLiBUaGFuayB5b3UuCisgICh2b2lkKSBmaWxlX3BhdGg7CisgIHJldHVybiBmYWxzZTsKKworICAvKgorICBjb25zdCBzdHJpbmcgY29tbWFuZCA9ICJnb2ZtdCAtdyAiICsgZmlsZV9wYXRoOworCisgIGlmIChzeXN0ZW0oY29tbWFuZC5jX3N0cigpKSA9PSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkcgLSBSdW5uaW5nICclcycgZmFpbGVkLlxuIiwgY29tbWFuZC5jX3N0cigpKTsKKyAgcmV0dXJuIGZhbHNlOworICAqLworIH0KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihnbywgIkdvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0gIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0aHJpZnRfaW1wb3J0PSAgIE92ZXJyaWRlIHRocmlmdCBwYWNrYWdlIGltcG9ydCBwYXRoIChkZWZhdWx0OiIgKyBERUZBVUxUX1RIUklGVF9JTVBPUlQgKyAiKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZT0gICAgICAgICBQYWNrYWdlIG5hbWUgKGRlZmF1bHQ6IGluZmVycmVkIGZyb20gdGhyaWZ0IGZpbGUgbmFtZSlcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlnbm9yZV9pbml0aWFsaXNtc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBhdXRvbWF0aWMgc3BlbGxpbmcgY29ycmVjdGlvbiBvZiBpbml0aWFsaXNtcyAoZS5nLiBcIlVSTFwiKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVhZF93cml0ZV9wcml2YXRlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBNYWtlIHJlYWQvd3JpdGUgbWV0aG9kcyBwcml2YXRlLCBkZWZhdWx0IGlzIHB1YmxpYyBSZWFkL1dyaXRlXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjgzMDFhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogR3JhcGh2aXogY29kZSBnZW5lcmF0b3IKKyAqLworY2xhc3MgdF9ndl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2d2X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBleGNlcHRpb25fYXJyb3dzID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgZXhjZXB0aW9uX2Fycm93cyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZ3Y6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWd2IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBlbmQgb2YgZ2VuZXJhdG9yCisgICAqLworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBIZWxwZXJzCisgICAqLworICB2b2lkIHByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX291dF87CisgIHN0ZDo6bGlzdDxzdHJpbmc+IGVkZ2VzOworICBib29sIGV4Y2VwdGlvbl9hcnJvd3M7Cit9OworCisvKioKKyAqIEluaXQgZ2VuZXJhdG9yOgorICogLSBBZGRzIHNvbWUgZXNjYXBpbmcgZm9yIHRoZSBHcmFwaHZpeiBkb21haW4uCisgKiAtIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCBvcGVuIGZpbGUgZm9yIHdyaXR0aW5nLgorICogLSBXcml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBlc2NhcGVfWyd7J10gPSAiXFx7IjsKKyAgZXNjYXBlX1snfSddID0gIlxcfSI7CisKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuZ3YiOworICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICJkaWdyYXBoIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHByb2dyYW1fbmFtZV8pIDw8ICJcIiB7IiA8PCBlbmRsOworICBmX291dF8gPDwgIm5vZGUgW3N0eWxlPWZpbGxlZCwgc2hhcGU9cmVjb3JkXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiZWRnZSBbYXJyb3dzaXplPTAuNV07IiA8PCBlbmRsOworICBmX291dF8gPDwgInJhbmtkaXI9TFIiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQ2xvc2VzIGdlbmVyYXRvcjoKKyAqIC0gUHJpbnQgYWNjdW11bGF0ZWQgbm9kZXMgY29ubmVjdGlvbnMuCisgKiAtIFByaW50IGZvb3Rub3RlLgorICogLSBDbG9zZXMgZmlsZS4KKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBQcmludCBlZGdlcworICBzdGQ6Omxpc3Q8c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGVkZ2VzLmJlZ2luKCk7CisgIGZvciAoOyBpdGVyICE9IGVkZ2VzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBmX291dF8gPDwgKCppdGVyKSA8PCBlbmRsOworICB9CisKKyAgLy8gUHJpbnQgZ3JhcGggZW5kIH0gYW5kIGNsb3NlIGZpbGUKKyAgZl9vdXRfIDw8ICJ9IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyBuYW1lID0gdHR5cGVkZWYtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWF6dXJlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKworICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgZl9vdXRfIDw8ICIgOjogIjsKKyAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgbmFtZSk7CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9d2hpdGVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCJlbnVtICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICBmX291dF8gPDwgJ3wnIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YWxpY2VibHVlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiY29uc3RfIiA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKworICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgZl9vdXRfIDw8ICIgPSAiOworICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOworICBmX291dF8gPDwgIiA6OiAiOworICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSwgImNvbnN0XyIgKyBuYW1lKTsKKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodHBpbmtdOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJleGNlcHRpb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1saWdodGN5YW5dOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJ1bmlvbiAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmVpZ2VdOyIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisgICAgZl9vdXRfIDw8ICJzdHJ1Y3QgIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9CisKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIHByaW50IHBvcnQgKGFuY2hvciByZWZlcmVuY2UpCisgICAgZl9vdXRfIDw8ICJ8PGZpZWxkXyIgPDwgZmllbGRfbmFtZSA8PCAnPic7CisKKyAgICAvLyBmaWVsZCBuYW1lIDo6IGZpZWxkIHR5cGUKKyAgICBmX291dF8gPDwgKCptZW1faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBuYW1lICsgIjpmaWVsZF8iICsgZmllbGRfbmFtZSk7CisgIH0KKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OnByaW50X3R5cGUodF90eXBlKiB0dHlwZSwgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWYpIHsKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBmX291dF8gPDwgImxpc3RcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOworICAgICAgZl9vdXRfIDw8ICJcXD4iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBmX291dF8gPDwgInNldFxcPCI7CisgICAgICBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgZl9vdXRfIDw8ICJtYXBcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgZWRnZXMucHVzaF9iYWNrKHN0cnVjdF9maWVsZF9yZWYgKyAiIC0+ICIgKyB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgb3V0IGFuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIGZfb3V0XyA8PCAiXFxcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgIlxcXCIiOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIGZfb3V0XyA8PCAiXFx7ICI7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1hcF9pdGVyOworICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKKyAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIFxcfSI7CisgIH0gYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIGZfb3V0XyA8PCAiXFx7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgICAgfQorICAgIH0KKyAgICBmX291dF8gPDwgIiBcXH0iOworICB9IGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcodHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCisgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGZfb3V0XyA8PCAiVU5LTk9XTiI7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzZXJ2aWNlX25hbWUgPSBnZXRfc2VydmljZV9uYW1lKHRzZXJ2aWNlKTsKKyAgZl9vdXRfIDw8ICJzdWJncmFwaCBjbHVzdGVyXyIgPDwgc2VydmljZV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmlzcXVlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAic3R5bGU9ZGFzaGVkOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJsYWJlbCA9IFwiIiA8PCBlc2NhcGVfc3RyaW5nKHNlcnZpY2VfbmFtZSkgPDwgIiBzZXJ2aWNlXCI7IiA8PCBlbmRsOworCisgIC8vIFRPRE86IHNlcnZpY2UgZXh0ZW5kcworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfb3V0XyA8PCAiZnVuY3Rpb25fIiA8PCBzZXJ2aWNlX25hbWUgPDwgZm5fbmFtZTsKKyAgICBmX291dF8gPDwgIltsYWJlbD1cIjxyZXR1cm5fdHlwZT5mdW5jdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcoZm5fbmFtZSk7CisgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCksICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cmV0dXJuX3R5cGUiKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGZfb3V0XyA8PCAifDxwYXJhbV8iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI+IjsKKyAgICAgIGZfb3V0XyA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICIgOjogIjsKKyAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cGFyYW1fIiArICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgLy8gZW5kIG9mIG5vZGUKKyAgICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7CisKKyAgICAvLyBFeGNlcHRpb24gZWRnZXMKKyAgICBpZiAoZXhjZXB0aW9uX2Fycm93cykgeworICAgICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBlZGdlcy5wdXNoX2JhY2soImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIiAtPiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiIFtjb2xvcj1yZWRdIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZl9vdXRfIDw8ICIgfSIgPDwgZW5kbDsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBndiwKKyAgICAiR3JhcGh2aXoiLAorICAgICIgICAgZXhjZXB0aW9uczogICAgICBXaGV0aGVyIHRvIGRyYXcgYXJyb3dzIGZyb20gZnVuY3Rpb25zIHRvIGV4Y2VwdGlvbi5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg4YzRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI5ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEhheGUgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2hheGVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaGF4ZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBjYWxsYmFja3NfID0gZmFsc2U7CisgICAgcnR0aV8gPSBmYWxzZTsKKyAgICBidWlsZG1hY3JvXyA9ICIiOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNhbGxiYWNrcyIpID09IDApIHsKKyAgICAgICAgY2FsbGJhY2tzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJ0dGkiKSA9PSAwKSB7CisgICAgICAgIHJ0dGlfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYnVpbGRtYWNybyIpID09IDApIHsKKyAgICAgICAgYnVpbGRtYWNyb18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBoYXhlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1oYXhlIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIC8vIHJlbW92ZWQgLS0gZXF1YWxpdHksY29tcGFyZV90bworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBoYXhlX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgYXNfdHlwZSwgYm9vbCBvbWl0X25hbWUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAvLyBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogIC0gSW50NjQgaXMgbm90IHJlYWxseSBudWxsYWJsZSwgZXZlbiB0aG91Z2ggaXQgYmVoYXZlZCB0aGF0CisgICAgICAgIC8vIHdheSBiZWZvcmUgSGF4ZSAzLjIuMAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBib29sIGNhbGxiYWNrc187CisgIGJvb2wgcnR0aV87CisgIHN0cmluZyBidWlsZG1hY3JvXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworCisgIC8vIEhheGUgcGFja2FnZSBuYW1lcyBhcmUgbG93ZXJjYXNlCisgIGlmIChwYWNrYWdlX25hbWVfLmxlbmd0aCgpID4gMCkgeworICAgIHBhY2thZ2VfbmFtZV9bMF0gPSB0b2xvd2VyKHBhY2thZ2VfbmFtZV9bMF0pOworICAgIHNpemVfdCBpbmRleCA9IHBhY2thZ2VfbmFtZV8uZmluZCgnLicpOworICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaWYgKCsraW5kZXggPCBwYWNrYWdlX25hbWVfLmxlbmd0aCgpKSB7CisgICAgICAgIHBhY2thZ2VfbmFtZV9baW5kZXhdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfW2luZGV4XSk7CisgICAgICB9CisgICAgICBpbmRleCA9IHBhY2thZ2VfbmFtZV8uZmluZCgnLicsIGluZGV4KTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV9wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfOworICB9CisgIHJldHVybiAicGFja2FnZSI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGhheGUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBoYXhlIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7XG4iICsgImltcG9ydCBoYXhlLmlvLkJ5dGVzO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuSW50TWFwO1xuIiArICJpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7XG4iCisgICAgICAgICArICJpbXBvcnQgaGF4ZS5kcy5PYmplY3RNYXA7XG4iICsgIlxuIiArICIjaWYgZmxhc2hcbiIKKyAgICAgICAgICsgImltcG9ydCBmbGFzaC5lcnJvcnMuQXJndW1lbnRFcnJvcjtcbiIgKyAiI2VuZFxuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGhheGUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zdHJ1Y3QKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc2VydmljZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgaW1wb3J0czsKKyAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIjtcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKKyAgICBoYXhlX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIGhheGUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBoYXhlLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBBZGQgaGF4ZSBpbXBvcnRzCisgIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfZW51bSk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9lbnVtKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDogSW50ID0gIiA8PCB2YWx1ZQorICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMSURfVkFMVUVTID0geyBuZXcgSW50U2V0KCBbIjsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZW51bSA8PCAiXSk7IH07IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIHZhciBWQUxVRVNfVE9fTkFNRVMgPSB7IFsiOworICBpbmRlbnRfdXAoKTsKKyAgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCIpIDw8IGVuZGw7CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIiOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIl07IH07IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBoYXhlX3R5cGVfaW1wb3J0cygpOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2NvbnN0cyk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9jb25zdHMpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBpbmxpbmUgdmFyICAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2hheGVfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEhheGUgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5oeCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogaGF4ZSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQorICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0CisgKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCB0c3RydWN0KTsKKworICBzdHJpbmcgY2xzbmFtZSA9IGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3V0KTsKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbHNuYW1lIDw8ICIgIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIFRFeGNlcHRpb24gIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgdmFyIFNUUlVDVF9ERVNDID0geyBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyB9OyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IHsgbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IH07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgKm1faXRlcik7CisgICAgLy8gaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsKKyAgICAvLyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiQDppc1ZhciIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciAiCisgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIihnZXQsc2V0KSA6ICIKKyAgICAgICAgICAgICAgICAgICArIGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlubGluZSBzdGF0aWMgdmFyICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRCA6IEludCA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBJbm5lciBJc3NldCBjbGFzcworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEJvb2wgPSBmYWxzZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCisgIGlmIChmYWxzZSkgeworICAgIC8vIFRPRE86IHJlYWN0aXZhdGUgd2hlbiBuZWVkZWQKKyAgICBnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpOyIgPDwgZW5kbDsKKyAgfQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZCggaXByb3QgOiBUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkIDogVEZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IgorICAgICAgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBoYXhlIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZS4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiCisgICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSkgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEIDogSW50LCB2YWx1ZSA6IER5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworICAgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEIDogSW50KSA6IER5bmFtaWMgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQgOiBJbnQpIDogQm9vbCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgcHJvcGVydHkgc2V0dGVycy9nZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCkgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpCisgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKKyAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKSA8PCAiKSA6ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIiB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSA6IEJvb2wgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiCisgICAgICA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXQgOiBTdHJpbmcgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSByZXQgKz0gIFwiLCBcIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwibnVsbFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIl9uYW1lIDogU3RyaW5nID0gIiA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciBtZXRhRGF0YU1hcCA6IEludE1hcCA9IG5ldyBJbnRNYXAoKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgLy8gUG9wdWxhdGUgbWFwCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9JRF0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGhheGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2hheGVfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9oYXhlX3R5cGVfc3RyaW5nKHR5cGUpOworICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICIuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiSW1wbC5oeCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaGVscGVyIGNsYXNzIGZpbGVzCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICJQcm9jZXNzb3IuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pLmNfc3RyKCkKKyAgICAgICAgICAgICAgIDw8ICJJbXBsOyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IGZvciB0aGUgb25TdWNjZXNzIGNhbGxiYWNrcworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb21pdF9uYW1lKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSAiIjsKKyAgaWYgKCFvbWl0X25hbWUpIHsKKyAgICBuYW1lID0gIm9uU3VjY2VzcyI7CisgICAgaWYgKGFzX3R5cGUpIHsKKyAgICAgIG5hbWUgKz0gIiA6ICI7CisgICAgfQorICB9CisKKyAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgaWYgKGFzX3R5cGUpIHsKKyAgICAgIHJldHVybiBuYW1lICsgIlZvaWQtPlZvaWQgPSBudWxsIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5hbWUgKyAiKCkgOiBWb2lkIjsKKyAgICB9CisgIH0KKworICBpZiAoYXNfdHlwZSkgeworICAgIHJldHVybiBuYW1lICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiLT5Wb2lkID0gbnVsbCI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWUgKyAiKCByZXR2YWwgOiAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKSI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmIChjYWxsYmFja3NfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbiwgaXNfaW50ZXJmYWNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgbWV0aG9kIGhlYWRlciBpbiAibm9ybWFsIiBzdHlsZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbnRlcmZhY2UpIHsKKyAgaWYgKGlzX2ludGVyZmFjZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodGZ1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gImNhbGxiYWNrIiBzdHlsZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHN0ZDo6c3RyaW5nIG9uX3N1Y2Nlc3NfaW1wbCA9IGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIGZhbHNlLCBmYWxzZSk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiBvbkVycm9yKER5bmFtaWMpIDogVm9pZDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvLyBmdW5jdGlvbiAiIDw8IG9uX3N1Y2Nlc3NfaW1wbC5jX3N0cigpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGlzX2ludGVyZmFjZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodGZ1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgIH0KKworICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsgLSBub3QgeWV0LCBiZWNhdXNlIG9mCisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjI2CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKKyAgfQorCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKKyAgLy8gYnVpbGQgbWFjcm8gaXMgaW5oZXJpdGVkIGZyb20gaW50ZXJmYWNlCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sID0gbnVsbCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpcHJvdF8gOiBUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgb3Byb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIHNlcWlkXyA6IEludDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldElucHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpIDogVFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIHN0cmluZyBjYWxsdHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiT05FV0FZIiA6ICJDQUxMIjsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS4iIDw8IGNhbGx0eXBlIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInZhciBhcmdzIDogIiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJldHZhbCA6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RHluYW1pYykgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MocmVzdWx0LnN1Y2Nlc3MpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR2YWwgPSByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgICAgICAgPDwgIm9uRXJyb3IoIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCggZSA6IFRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykKKyAgICAgICAgICAgICA8PCAiX2lmYWNlXyA6ICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgUFJPQ0VTU19NQVAgPSBuZXcgU3RyaW5nTWFwPCBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkID4oKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldyggaWZhY2UgOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUC5zZXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBvdmVycmlkZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA6IFRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKyAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgorICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KKyAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KKyAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBmbiAgPSBQUk9DRVNTX01BUC5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICB2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgIgorICAgICAgICAgIm1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiggbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdG5hbWUpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QoJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKCkgOiBJbnQtPlRQcm90b2NvbC0+VFByb3RvY29sLT5Wb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnVuY3Rpb24oIHNlcWlkIDogSW50LCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogVm9pZCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDogIiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhbnkgIGZ1bmN0aW9uIHRvIGNhdGNoIChkZWZpbmVkIG9yIHVuZGVmaW5lZCkgZXhjZXB0aW9ucworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBzdHlsZSBvbkVycm9yL29uU3VjY2VzcworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiX2lmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIG9uX3N1Y2Nlc3MgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCwgIC8vIGVycm9ycyBhcmUgdGhyb3duIGJ5IHRoZSBoYW5kbGVyIiA8PCBlbmRsOworICAgICAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibnVsbCk7IC8vIG5vIHJldHZhbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb24iIDw8IG9uX3N1Y2Nlc3MuY19zdHIoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvLyBub3JtYWwgZnVuY3Rpb24oKTpyZXN1bHQgc3R5bGUKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgaWYgKCEodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSB8fCB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIC8vIGNhdGNoIGV4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgSURMCisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gYWx3YXlzIGNhdGNoIGFsbCBleGNlcHRpb25zIHRvIHByZXZlbnQgZnJvbSBzZXJ2aWNlIGRlbmlhbAorICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoIDogRHluYW1pYykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpIDw8ICIgaW4gMCAuLi4gIiA8PCBvYmogPDwgIi5zaXplKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5zZXQoICIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIiA6IEludCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBjb3VudGVyIDw8ICsiKys7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IGNvdW50ZXIgPDwgIikpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLmtleXMoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiLmdldCgiICsgaXRlciArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGhheGUgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gaGF4ZSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgeworICAodm9pZClpbl9pbml0OworCisgIC8vIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJJbnQiOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgdF90eXBlKiB0dmFsID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoISh0a2V5LT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgICByZXR1cm4gIlN0cmluZ01hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiSW50TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiSW50NjRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RNYXA8PgorICAgICAgfQorICAgIH0KKyAgICBpZiAodGtleS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICB9CisgICAgcmV0dXJuICJPYmplY3RNYXA8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiLCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIGlmICh0a2V5LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRrZXkpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICghKHRrZXktPmlzX2JpbmFyeSgpKSkgeworICAgICAgICAgIHJldHVybiAiU3RyaW5nU2V0IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIkludFNldCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJJbnQ2NFNldCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRrZXktPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICJJbnRTZXQiOworICAgIH0KKyAgICByZXR1cm4gIk9iamVjdFNldDwgIiArIHR5cGVfbmFtZSh0a2V5KSArICI+IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiB0ZWxtID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHJldHVybiAiTGlzdDwgIiArIHR5cGVfbmFtZSh0ZWxtKSArICI+IjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGhheGUgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIGhheGUgY29udGFpbmVyPworICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJWb2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImhheGUuaW8uQnl0ZXMiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaGF4ZS5JbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaGF4ZS5JbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiRmxvYXQiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgb25fZXJyb3Jfc3VjY2VzcyA9ICJvbkVycm9yIDogRHluYW1pYy0+Vm9pZCA9IG51bGwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgdHJ1ZSwgZmFsc2UpOworCisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgeworICAgICAgYXJndW1lbnRzICs9ICIsICI7CisgICAgfQorICAgIGFyZ3VtZW50cyArPSBvbl9lcnJvcl9zdWNjZXNzOyAvLyJvbkVycm9yIDogRnVuY3Rpb24sIG9uU3VjY2VzcyA6IEZ1bmN0aW9uIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiBWb2lkIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0dHlwZTsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHR0eXBlID0gIlZvaWQiOworICB9IGVsc2UgeworICAgIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiAiICsgcmVzdWx0dHlwZTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBIYXhlIGNsYXNzIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyLCBidXQgSGF4ZSBuYW1lc3BhY2VzIG11c3Qgbm90LgorICovCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvLyB0ZXN0LmZvci5HZW5lcmljPCBkYXRhLlR5cGUsIG9yLnRoZS5MaWtlPiBhbmQgaGFuZGxlIGl0IHJlY3Vyc2l2ZWx5CisgIHNpemVfdCBnZW5lcmljX2ZpcnN0ID0gbmFtZS5maW5kKCc8Jyk7CisgIHNpemVfdCBnZW5lcmljX2xhc3QgPSBuYW1lLnJmaW5kKCc+Jyk7CisgIGlmICgoZ2VuZXJpY19maXJzdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYgKGdlbmVyaWNfbGFzdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICBzdHJpbmcgb3V0ZXJfdHlwZSA9IG5hbWUuc3Vic3RyKDAsIGdlbmVyaWNfZmlyc3QpOworICAgIHN0cmluZyBpbm5lcl90eXBlcyA9IG5hbWUuc3Vic3RyKGdlbmVyaWNfZmlyc3QgKyAxLCBnZW5lcmljX2xhc3QgLSBnZW5lcmljX2ZpcnN0IC0gMSk7CisKKyAgICBzdHJpbmcgbmV3X2lubmVyID0gIiI7CisgICAgc2l6ZV90IGNvbW1hX3N0YXJ0ID0gMDsKKyAgICB3aGlsZSAoY29tbWFfc3RhcnQgPCBpbm5lcl90eXBlcy5sZW5ndGgoKSkgeworICAgICAgc2l6ZV90IGNvbW1hX3BvcyA9IGNvbW1hX3N0YXJ0OworICAgICAgaW50IG5lc3RlZCA9IDA7CisKKyAgICAgIHdoaWxlIChjb21tYV9wb3MgPCBpbm5lcl90eXBlcy5sZW5ndGgoKSkgeworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoaW5uZXJfdHlwZXNbY29tbWFfcG9zXSkgeworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICArK25lc3RlZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgLS1uZXN0ZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgIGZvdW5kID0gKG5lc3RlZCA9PSAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK2NvbW1hX3BvczsKKyAgICAgIH0KKworICAgICAgaWYgKG5ld19pbm5lci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbmV3X2lubmVyICs9ICIsIjsKKyAgICAgIH0KKworICAgICAgc3RyaW5nIGlubmVyID0gaW5uZXJfdHlwZXMuc3Vic3RyKGNvbW1hX3N0YXJ0LCBjb21tYV9wb3MgLSBjb21tYV9zdGFydCk7CisgICAgICBuZXdfaW5uZXIgKz0gZ2V0X2NhcF9uYW1lKGlubmVyKTsKKyAgICAgIGNvbW1hX3N0YXJ0ID0gKytjb21tYV9wb3M7CisgICAgfQorCisgICAgcmV0dXJuIGdldF9jYXBfbmFtZShvdXRlcl90eXBlKSArICI8IiArIG5ld19pbm5lciArICI+IjsKKyAgfQorCisgIC8vIHBhY2thZ2UgbmFtZQorICBzaXplX3QgaW5kZXggPSBuYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXG5cclx0Iik7CisgIGlmIChpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICBuYW1lW2luZGV4XSA9IHRvbG93ZXIobmFtZVtpbmRleF0pOworICAgIGluZGV4ID0gbmFtZS5maW5kKCcuJyk7CisgICAgd2hpbGUgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpZiAoKytpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICAgICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKKyAgICAgIH0KKyAgICAgIGluZGV4ID0gbmFtZS5maW5kKCcuJywgaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8vIGNsYXNzIG5hbWUKKyAgaW5kZXggPSBuYW1lLnJmaW5kKCcuJyk7CisgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICsraW5kZXg7CisgIH0gZWxzZSB7CisgICAgaW5kZXggPSBuYW1lLmZpbmRfZmlyc3Rfbm90X29mKCIgXG5cclx0Iik7CisgIH0KKworICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgbmFtZVtpbmRleF0gPSB0b3VwcGVyKG5hbWVbaW5kZXhdKTsKKyAgfQorCisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW5hYmxlcyBSVFRJIGZvciBhIGNsYXNzIG9yIGludGVyZmFjZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKHJ0dGlfKSB7CisgICAgb3V0IDw8ICJAOnJ0dGkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBBZGRzIGJ1aWxkIG1hY3JvcyB0byBhIGNsYXNzIG9yIGludGVyZmFjZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CisgIGlmICghYnVpbGRtYWNyb18uZW1wdHkoKSkgeworICAgIG91dCA8PCAiI2lmICEgbWFjcm8iIDw8IGVuZGw7CisgICAgb3V0IDw8ICJAOmJ1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAgICAgLy8gY3VycmVudCBjbGFzcy9pbnRlcmZhY2UKKyAgICBvdXQgPDwgIkA6YXV0b0J1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAvLyBpbmhlcml0ZWQgY2xhc3Nlcy9pbnRlcmZhY2VzCisgICAgb3V0IDw8ICIjZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBoYXhlRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgdGRvYy0+Z2V0X2RvYygpLCAiICovXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAvKiYmIHByb2dyYW0gIT0gcHJvZ3JhbV8qLykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGhheGUsCisgICAgIkhheGUiLAorICAgICIgICAgY2FsbGJhY2tzICAgICAgICBVc2Ugb25FcnJvcigpL29uU3VjY2VzcygpIGNhbGxiYWNrcyBmb3Igc2VydmljZSBtZXRob2RzIChsaWtlIEFTMylcbiIKKyAgICAiICAgIHJ0dGkgICAgICAgICAgICAgRW5hYmxlIEA6cnR0aSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIKKyAgICAiICAgIGJ1aWxkbWFjcm89bXkubWFjcm9zLkNsYXNzLm1ldGhvZChhcmdzKVxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgQDpidWlsZCBtYWNybyBjYWxscyB0byBnZW5lcmF0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2ZDRiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTcyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBIYXNrZWxsIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9oc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9oc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGhzOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc190eXBlbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGtpdGVyLCBzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0cmluZyBoc19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RyaW5nIGhzX2xhbmd1YWdlX3ByYWdtYSgpOworICBzdHJpbmcgaHNfaW1wb3J0cygpOworCisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCA9ICIiKTsKKworICBzdHJpbmcgZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9ucyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlvID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWV0aG9kID0gZmFsc2UpOworCisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHR5cGVfdG9fZGVmYXVsdCh0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgcmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLCBib29sIG5lZWRzX3BhcmVucyk7CisKKyAgc3RyaW5nIHR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSogdHlwZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pZmFjZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jbGllbnRfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfVHlwZXMuaHMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwbmFtZSArICJfQ29uc3RzLmhzIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfVHlwZXMgd2hlcmUiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfY29uc3RzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX0NvbnN0cyB3aGVyZSIgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgImltcG9ydCAiIDw8IHBuYW1lIDw8ICJfVHlwZXMiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgeworICByZXR1cm4gc3RyaW5nKAorICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19XG4iCisgICAgICAiey0jIExBTkdVQUdFIERlcml2ZUdlbmVyaWMgIy19XG4iCisgICAgICAiey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1maWVsZHMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLXNpZ25hdHVyZXMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1pbXBvcnRzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLW1hdGNoZXMgIy19XG4iKTsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0cmluZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCisgICAgICAgICArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIikgICAgICAgICAgICAgICAgICAgICAgLS1cbiIKKyAgICAgICAgICsgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCisgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyAtLVxuIgorICAgICAgICAgKyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfaW1wb3J0cygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygKKyAgICAgICJpbXBvcnQgUHJlbHVkZSAoKCQpLCAoLiksICg+Pj0pLCAoPT0pLCAoKyspKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgUHJlbHVkZSBhcyBQXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbiBhcyBYXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLk1vbmFkIGFzIE0gKCBsaWZ0TSwgYXAsIHdoZW4gKVxuIgorICAgICAgImltcG9ydCBEYXRhLkZ1bmN0b3IgKCAoPCQ+KSApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlNcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaGFibGUgYXMgSFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JbnQgYXMgSVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXliZSBhcyBNIChjYXRNYXliZXMpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyBhcyBFICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgR0hDLkdlbmVyaWNzIGFzIEcgKEdlbmVyaWMpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlR5cGVhYmxlIGFzIFRZICggVHlwZWFibGUgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXBcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvclxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeSBhcyBRQyAoIEFyYml0cmFyeSguLikgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGVzdC5RdWlja0NoZWNrIGFzIFFDICggZWxlbWVudHMgKVxuIgorICAgICAgIlxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0IGFzIFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdC5UeXBlcyBhcyBUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuQXJiaXRyYXJpZXMgYXMgVFxuIgorICAgICAgIlxuIik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkKKyAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl9UeXBlc1xuIjsKKworICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkKKyAgICByZXN1bHQgKz0gIlxuIjsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gRXouCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyB0bmFtZSA9IGNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKTsKKyAgc3RyaW5nIHRkZWYgPSByZW5kZXJfaHNfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgZmFsc2UpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdGRlZiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGluZGVudChmX3R5cGVzXykgPDwgImRhdGEgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiID0gIjsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBmX3R5cGVzXyA8PCAoZmlyc3QgPyAiIiA6ICJ8Iik7CisgICAgZl90eXBlc18gPDwgbmFtZTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgImRlcml2aW5nIChQLlNob3csIFAuRXEsIEcuR2VuZXJpYywgVFkuVHlwZWFibGUsIFAuT3JkLCBQLkJvdW5kZWQpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFAuRW51bSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0b0VudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8IHZhbHVlIDw8ICIgLT4gIiA8PCBuYW1lIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiXyAtPiBYLnRocm93IFQuVGhyaWZ0RXhjZXB0aW9uIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIEguSGFzaGFibGUgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgPSBILmhhc2hXaXRoU2FsdCBzYWx0IFAuLiBQLmZyb21FbnVtIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJhcmJpdHJhcnkgPSBRQy5lbGVtZW50cyAoUC5lbnVtRnJvbVRvIFAubWluQm91bmQgUC5tYXhCb3VuZCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworCisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIHR5cGVfdG9fZGVmYXVsdCh0eXBlKTsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgb3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiUC5UcnVlIiA6ICJQLkZhbHNlIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9kb3VibGUoKSA8PCAiKSI7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7CisgICAgICAgICArK2NfaXRlcikgeworICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7CisgICAgICAgIHRfcHJvZ3JhbSogcHJvZyA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICAgIGlmIChwcm9nICE9IE5VTEwgJiYgcHJvZyAhPSBwcm9ncmFtXykKKyAgICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZShwcm9nLT5nZXRfbmFtZSgpKSA8PCAiX1R5cGVzLiI7CisgICAgICAgIG91dCA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7CisgICAgb3V0IDw8ICJkZWZhdWx0XyIgPDwgY25hbWUgPDwgInsiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXIgPSB2YWwuYmVnaW4oKTsKKyAgICAgICAgIHZfaXRlciAhPSB2YWwuZW5kKCk7CisgICAgICAgICArK3ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworCisgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOworICAgICAgICAgICArK2ZfaXRlcikKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpCisgICAgICAgICAgZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIGNuYW1lICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKworICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgc3RyaW5nIGNvbnN0X3ZhbHVlID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdHlwZSgpLCB2X2l0ZXItPnNlY29uZCk7CisKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsICIpOworICAgICAgb3V0IDw8IGZpZWxkX25hbWUoY25hbWUsIGZuYW1lKSA8PCAiID0gIjsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGNvbnN0X3ZhbHVlOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisKKyAgICBvdXQgPDwgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgb3V0IDw8ICJdKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpID8gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCBbIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgWyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisKKyAgICBvdXQgPDwgIl0pIjsKKworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgSGFza2VsbCBzdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7CisgICh2b2lkKWhlbHBlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgICArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ7ICI7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgb3V0IDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIDo6ICI7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCAiUC5NYXliZSAiOworICAgICAgfQorICAgICAgb3V0IDw8IHJlbmRlcl9oc190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBvdXQgPDwgIiBkZXJpdmluZyAoUC5TaG93LFAuRXEsRy5HZW5lcmljLFRZLlR5cGVhYmxlKSIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiaW5zdGFuY2UgWC5FeGNlcHRpb24gIiA8PCB0bmFtZSA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgdG5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCByZWNvcmQgPSBzYWx0IjsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICIgYEguaGFzaFdpdGhTYWx0YCAiIDw8IGZpZWxkX25hbWUodG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc190eXBlbWFwKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX2RlZmF1bHQob3V0LCB0c3RydWN0KTsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgdG5hbWUgPDwgIiB3aGVyZSAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IE0ubGlmdE0gIiA8PCB0bmFtZTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgICArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiYE0uYXBgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKCI7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCAiTS5saWZ0TSBQLkp1c3QgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiUUMuYXJiaXRyYXJ5KSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIFNocmluaworICAgIGluZGVudChvdXQpIDw8ICJzaHJpbmsgb2JqIHwgb2JqID09IGRlZmF1bHRfIiA8PCB0bmFtZSA8PCAiID0gW10iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICAgICAgICAgfCBQLm90aGVyd2lzZSA9IE0uY2F0TWF5YmVzIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgICArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJbICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgICAgfQorICAgICAgc3RyaW5nIGZuYW1lID0gZmllbGRfbmFtZSh0bmFtZSwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIG91dCA8PCAiaWYgb2JqID09IGRlZmF1bHRfIiA8PCB0bmFtZTsKKyAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9ICI7CisgICAgICBvdXQgPDwgInRoZW4gUC5Ob3RoaW5nICI7CisgICAgICBvdXQgPDwgImVsc2UgUC5KdXN0ICQgZGVmYXVsdF8iIDw8IHRuYW1lOworICAgICAgb3V0IDw8ICJ7IiA8PCBmbmFtZSA8PCAiID0gIiA8PCBmbmFtZSA8PCAiIG9ian0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7IC8qIDAgPT0gbWVtYmVycy5zaXplKCkgKi8KKyAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgWyIgPDwgdG5hbWUgPDwgIl0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBzdHJpbmcgc25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBpZCA9IHRtcCgiX2lkIik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIDo6IFQuVGhyaWZ0VmFsIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiAoVC5UU3RydWN0IGZpZWxkcykgPSAiIDw8IHNuYW1lIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIHN0cmluZyBldHlwZSA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEZpbGwgaW4gRmllbGQKKyAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7CisKKyAgICBvdXQgPDwgIlAubWF5YmUgKCI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCAiUC5lcnJvciBcIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6ICIgPDwgZm5hbWUgPDwgIlwiIjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSAmJiAoKmZfaXRlciktPmdldF92YWx1ZSgpID09IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICJQLk5vdGhpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGZpZWxkX25hbWUoc25hbWUsIGZuYW1lKSA8PCAiIGRlZmF1bHRfIiA8PCBzbmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpICI7CisKKyAgICBvdXQgPDwgIihcXChfLCIgPDwgdmFsIDw8ICIpIC0+ICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdmFsKTsKKyAgICBvdXQgPDwgIikiOworICAgIG91dCA8PCAiIChNYXAubG9va3VwICgiIDw8IGtleSA8PCAiKSBmaWVsZHMpIjsKKyAgfQorCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyByZWFkCisgIHN0cmluZyB0bWFwID0gdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0eXBlbWFwXyIpOworICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIF8gPSBQLmVycm9yIFwibm90IGEgc3RydWN0XCIiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIDo6IFQuUHJvdG9jb2wgcCA9PiBwIC0+IFAuSU8gIiA8PCBzbmFtZQorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8ICIgaXByb3QgPSB0b18iIDw8IHNuYW1lOworICBvdXQgPDwgIiA8JD4gVC5yZWFkVmFsIGlwcm90IChULlRfU1RSVUNUICIgPDwgdG1hcCA8PCAiKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUKKyAgICAgICAgICAgICAgPDwgIiA6OiBULlN0YXRlbGVzc1Byb3RvY29sIHAgPT4gcCAtPiBMQlMuQnl0ZVN0cmluZyAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJkZWNvZGVfIiA8PCBzbmFtZSA8PCAiIGlwcm90IGJzID0gdG9fIiA8PCBzbmFtZSA8PCAiICQgIjsKKyAgb3V0IDw8ICJULmRlc2VyaWFsaXplVmFsIGlwcm90IChULlRfU1RSVUNUICIgPDwgdG1hcCA8PCAiKSBicyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOworICBzdHJpbmcgZiA9IHRtcCgiX2YiKTsKKyAgc3RyaW5nIHYgPSB0bXAoIl92Iik7CisKKyAgaW5kZW50KG91dCkgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8ICIgLT4gVC5UaHJpZnRWYWwiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIHJlY29yZCA9IFQuVFN0cnVjdCAkIE1hcC5mcm9tTGlzdCAiOworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZXQgRXhjZXB0aW9ucworICBib29sIGhhc0V4biA9IGZhbHNlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaGFzRXhuID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGJvb2wgaXNmaXJzdCA9IHRydWU7CisgIGlmIChoYXNFeG4pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCBleG5zID0gTS5jYXRNYXliZXMgIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOworICAgICAgICAgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpZiAoaXNmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiWyAiOworICAgICAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgICAgIG91dCA8PCAiKFxcIiA8PCB2IDw8ICIgLT4gKCIgPDwga2V5IDw8ICIsIChcIiIgPDwgbW5hbWUgPDwgIlwiLCI7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB2KTsKKyAgICAgICAgb3V0IDw8ICIpKSkgPCQ+ICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiXSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW4gaWYgUC5ub3QgKFAubnVsbCBleG5zKSB0aGVuIGV4bnMgZWxzZSAiOworICAgIGluZGVudF91cCgpOworICB9IGVsc2UgeworICAgIG91dCA8PCAiJCAiOworICB9CisKKyAgb3V0IDw8ICJNLmNhdE1heWJlcyIgPDwgZW5kbDsKKyAgLy8gR2V0IHRoZSBSZXN0CisgIGlzZmlyc3QgPSB0cnVlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGlmIChpc2ZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOworICAgICAgaXNmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOworICAgIH0KKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBvdXQgPDwgIihcXCI7CisgICAgb3V0IDw8IHYgPDwgIiAtPiAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICYmICEoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICB9CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdik7CisgICAgb3V0IDw8ICIpKSkgIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAmJiAhKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiJCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiPCQ+IjsKKyAgICB9CisgICAgb3V0IDw8ICIgIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGlmIChpc2ZpcnN0KSB7CisgICAgaW5kZW50KG91dCkgPDwgIltdIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOworICB9CisgIGlmIChoYXNFeG4pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gd3JpdGUKKyAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIDo6IFQuUHJvdG9jb2wgcCA9PiBwIC0+ICIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiIC0+IFAuSU8gKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULndyaXRlVmFsIG9wcm90ICQgZnJvbV8iOworICBvdXQgPDwgbmFtZSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKKworICAvLyBlbmNvZGUKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiA6OiBULlN0YXRlbGVzc1Byb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgPDwgIiAtPiBMQlMuQnl0ZVN0cmluZyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULnNlcmlhbGl6ZVZhbCBvcHJvdCAkICI7CisgIG91dCA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5ocyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIGFzIElmYWNlIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgLS0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZpZWxkX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCAicmVzdWx0IikpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIG1hcCBmcm9tIGZpZWxkIG5hbWVzIHRvICh0eXBlLCBpZCkKKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfdHlwZW1hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA6OiBULlR5cGVNYXAiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0eXBlbWFwXyIgPDwgbmFtZSA8PCAiID0gTWFwLmZyb21MaXN0IFsiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLChcIiIgPDwgbW5hbWUgPDwgIlwiLCIgPDwgdHlwZV90b19lbnVtKHR5cGUpIDw8ICIpKSI7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgIl0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogZ2VuZXJhdGUgdGhlIHN0cnVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzIGZpbGxlZCBpbgorICogQHBhcmFtIHRzdHJ1Y3QgdGhlIFN0cnVjdAorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19kZWZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBmbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCAiZGVmYXVsdF8iKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA9ICIgPDwgbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmZfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChvdXQpIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgPSAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlAuSnVzdCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICAgIH0KKyAgfQorICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKKyAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOworCisgIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBmX2lmYWNlXyA8PCBlbmRsOworCisgIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworCisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOworICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9pZmFjZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLiBOb3RlIHRoYXQgaW4gSGFza2VsbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KKyAqVGhpcyBpcyBiZWNhdXNlCisgKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vdGhpbmcuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9jbGllbnRfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9DbGllbnQuaHMiOworICBmX2NsaWVudF8ub3BlbihmX2NsaWVudF9uYW1lLmNfc3RyKCkpOworICBmX2NsaWVudF8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9jbGllbnRfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4cG9ydHMgPSAiIjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBleHBvcnRzICs9IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBleHBvcnRzICs9IGRlY2FwaXRhbGl6ZShmdW5uYW1lKTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisKKyAgc3RyaW5nIHNuYW1lID0gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKTsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgIm1vZHVsZSAiIDw8IHNuYW1lIDw8ICJfQ2xpZW50KCIgPDwgZXhwb3J0cyA8PCAiKSB3aGVyZSIgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8ICJfQ2xpZW50IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JT1JlZiBhcyBSIiA8PCBlbmRsOworICBpbmRlbnQoZl9jbGllbnRfKSA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgZW5kbDsKKworICAvLyBEQVRTIFJJVEUgQSBHTE9CQUwgVkFSCisgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFpZCA9IFIubmV3SU9SZWYgMCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKKyAgICAgIGZhcmdzICs9ICIgYXJnXyIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBkZWNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiAoaXAsb3ApIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOworCisgICAgZl9jbGllbnRfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcSA8LSBzZXFpZCIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxbiA8LSBSLnJlYWRJT1JlZiBzZXEiIDw8IGVuZGw7CisgICAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG1zZ1R5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlQuTV9PTkVXQVkiIDogIlQuTV9DQUxMIjsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3AgKFwiIiA8PCBmbmFtZSA8PCAiXCIsICIgPDwgbXNnVHlwZSA8PCAiLCBzZXFuKSAkIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIiA8PCBhcmdzbmFtZSA8PCAieyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmaWVsZG5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGZfY2xpZW50XyA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBmX2NsaWVudF8gPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgZmllbGRuYW1lKSA8PCAiPSI7CisgICAgICBpZiAoKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCh0X3R5cGUqKSgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKKyAgICAgICAgZl9jbGllbnRfIDw8ICJQLkp1c3QgIjsKKyAgICAgIGZfY2xpZW50XyA8PCAiYXJnXyIgPDwgZmllbGRuYW1lOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmdW5uYW1lLCAmbm9hcmdzKTsKKworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZnVubmFtZSA8PCAiIGlwID0gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQucmVhZE1lc3NhZ2UgaXAgJCBcXChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgLT4gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJNLndoZW4gKG10eXBlID09IFQuTV9FWENFUFRJT04pICQgZG8geyBleG4gPC0gVC5yZWFkQXBwRXhuIGlwIDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlgudGhyb3cgZXhuIH0iIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZXMgPC0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAubWF5YmUgKFAucmV0dXJuICgpKSBYLnRocm93ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIHJlcykiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLnJldHVybiAkICIgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAic3VjY2VzcyIpIDw8ICIgcmVzIiA8PCBlbmRsOworICAgICAgZWxzZQorICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBmX2NsaWVudF8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkgPSBjYXNlIG5hbWUgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXCIiIDw8IGZuYW1lIDw8ICJcIiAtPiBwcm9jZXNzXyIgPDwgZGVjYXBpdGFsaXplKGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCxpcHJvdCxvcHJvdCxoYW5kbGVyKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyAtPiAiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKQorICAgICAgICAgICAgICAgPDwgIi5wcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyA8LSBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgTWFwLmVtcHR5KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChuYW1lLFQuTV9FWENFUFRJT04sc2VxaWQpICQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgKysgTFQudW5wYWNrIG5hbWUpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnJlYWRNZXNzYWdlIGlwcm90ICgiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuIFAuVHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworYm9vbCBoYXNOb0FyZ3VtZW50cyh0X2Z1bmN0aW9uKiBmdW5jKSB7CisgIHJldHVybiAoZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKTsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHR5cGVfc3RyID0gcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpOworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZvdW5kID0gLTE7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBmb3VuZCA9IHR5cGVfc3RyLmZpbmRfZmlyc3Rfb2YoIltdLiAiLCBmb3VuZCArIDEpOworICAgIGlmIChzdHJpbmc6Om5wb3MgPT0gc2l6ZV90KGZvdW5kKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHR5cGVfc3RyW2ZvdW5kXSA9PSAnLicpCisgICAgICB0eXBlX3N0cltmb3VuZF0gPSAnXyc7CisgICAgZWxzZQorICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ1onOworICB9CisgIHJldHVybiB0eXBlX3N0cjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBzdHJpbmcgZnVubmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICIgKHNlcWlkLCBpcHJvdCwgb3Byb3QsIGhhbmRsZXIpID0gZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzIDwtIHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIHNpemVfdCBuID0geGNlcHRpb25zLnNpemUoKSArIDE7CisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKG4gPiAwKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFguY2F0Y2giIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgIH0KKworICBpZiAobiA+IDApIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICBmX3NlcnZpY2VfIDw8ICJ2YWwgPC0gIjsKKworICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIgaGFuZGxlciI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBmaWVsZF9uYW1lKGFyZ3NuYW1lLCAoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgYXJncykiOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiID0gdmFsfSI7CisKKyAgfSBlbHNlIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpZiAobiA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAobiA+IDApIHsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoXFxlICAtPiBkbyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IFAuSnVzdCBlfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIjsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoXFxfIC0+IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fRVhDRVBUSU9OLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV04gXCJcIikiOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSA6OiBYLlNvbWVFeGNlcHRpb24gLT4gUC5JTyAoKSkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsIHR5cGUsIHByZWZpeCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBhcmcpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgb3V0IDw8ICIoY2FzZSAiIDw8IGFyZyA8PCAiIG9mIHsiIDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiIDw8IHZhbCA8PCAiIC0+ICI7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHZhbCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHZhbCk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJFLmRlY29kZVV0ZjggIjsKKyAgICB9CisgICAgb3V0IDw8IHZhbDsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIC8vIFNpbmNlIHdpcmUgdHlwZSBvZiBiaW5hcnkgaXMgdGhlIHNhbWUgYXMgc3RyaW5nLCB3ZSBhY3R1YWxseSByZWNlaXZlIFQuVFN0cmluZyBub3QKKyAgICAgIC8vIFQuVEJpbmFyeQorICAgICAgb3V0IDw8ICI7IFQuVFN0cmluZyAiIDw8IHZhbCA8PCAiIC0+ICIgPDwgdmFsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgIlAudG9FbnVtICQgUC5mcm9tSW50ZWdyYWwgIiA8PCB2YWw7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgb3V0IDw8ICI7IF8gLT4gUC5lcnJvciBcIndyb25nIHR5cGVcIn0pIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lKSB7CisKKyAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgInRvXyIpIDw8ICIgKFQuVFN0cnVjdCAiIDw8IG5hbWUgPDwgIikpIjsKK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIGFyZykgeworCisgIHN0cmluZyB2YWwgPSB0bXAoIl92Iik7CisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2siKTsKKyAgICBvdXQgPDwgIihNYXAuZnJvbUxpc3QgJCBQLm1hcCAoXFwoIiA8PCBrZXkgPDwgIiwiIDw8IHZhbCA8PCAiKSAtPiAoIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKworICAgIG91dCA8PCAiLCI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgIikpICIgPDwgYXJnIDw8ICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAkIFAubWFwIChcXCIgPDwgdmFsIDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CisgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdmFsKTsKKyAgICBvdXQgPDwgIikgIiA8PCBhcmcgPDwgIikiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUpIHsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBvdXQgPDwgdHlwZV90b19jb25zdHJ1Y3Rvcih0eXBlKSA8PCAiICI7CisgICAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgIiQgRS5lbmNvZGVVdGY4ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgbmFtZTsKKworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJULlRJMzIgJCBQLmZyb21JbnRlZ3JhbCAkIFAuZnJvbUVudW0gIiA8PCBuYW1lOworICAgIH0KKworICB9IGVsc2UgeworICAgIHRocm93ICJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEIE9GIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IHR5cGVfbmFtZSh0c3RydWN0LCAiZnJvbV8iKSA8PCAiICIgPDwgcHJlZml4OworfQorCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgayA9IHRtcCgiX2siKTsKKyAgc3RyaW5nIHYgPSB0bXAoIl92Iik7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAiVC5UTWFwICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKTsKKyAgICBvdXQgPDwgIiAkIFAubWFwIChcXCgiIDw8IGsgPDwgIiwiIDw8IHYgPDwgIikgLT4gKCI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCBrdHlwZSwgayk7CisgICAgb3V0IDw8ICIsICI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCB2dHlwZSwgdik7CisgICAgb3V0IDw8ICIpKSAkIE1hcC50b0xpc3QgIiA8PCBwcmVmaXg7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgIlQuVFNldCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSAkIFNldC50b0xpc3QgIiA8PCBwcmVmaXg7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICJULlRMaXN0ICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikgJCBWZWN0b3IudG9MaXN0ICIgPDwgcHJlZml4OworICB9Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBvcHRpb25zLCBib29sIGlvLCBib29sIG1ldGhvZCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICByZXN1bHQgKz0gIlAuTWF5YmUgIjsKKyAgICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25zKTsKKyAgICByZXN1bHQgKz0gIiAtPiAiOworICB9CisKKyAgaWYgKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpCisgICAgcmVzdWx0ICs9ICIoKSAtPiAiOworCisgIGlmIChpbykKKyAgICByZXN1bHQgKz0gIlAuSU8gIjsKKworICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIGlvKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpCisgICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl9UeXBlcy4iOworCisgIHJldHVybiBwcmVmaXggKyBmdW5jdGlvbl9wcmVmaXggKyBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpmaWVsZF9uYW1lKHN0cmluZyB0bmFtZSwgc3RyaW5nIGZuYW1lKSB7CisgIHJldHVybiBkZWNhcGl0YWxpemUodG5hbWUpICsgIl8iICsgZm5hbWU7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlQuVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0eXBlLT5pc19iaW5hcnkoKSA/ICJULlRfQklOQVJZIiA6ICJULlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlQuVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJULlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlQuVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJULlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVC5UX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlQuVF9ET1VCTEUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVC5UX0kzMiI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIoVC5UX1NUUlVDVCAiICsgdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgInR5cGVtYXBfIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBrdHlwZSA9IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2dHlwZSA9IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIHJldHVybiAiKFQuVF9NQVAgIiArIGt0eXBlICsgIiAiICsgdnR5cGUgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKFQuVF9TRVQgIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiKFQuVF9MSVNUICIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZGVmYXVsdCB2YWx1ZQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fZGVmYXVsdCh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlAuZXJyb3IgXCJObyBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFRfVk9JRFwiIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiXCJcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJQLkZhbHNlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiMCI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoUC50b0VudW0gMCkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlLCAiZGVmYXVsdF8iKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJNYXAuZW1wdHkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNldC5lbXB0eSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlZlY3Rvci5lbXB0eSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZGVmYXVsdDogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gaGFza2VsbCB0eXBlCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLCBib29sIG5lZWRzX3BhcmVucykgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RyaW5nIHR5cGVfcmVwcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICh0eXBlLT5pc19iaW5hcnkoKSA/ICJMQlMuQnl0ZVN0cmluZyIgOiAiTFQuVGV4dCIpOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUC5Cb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJJLkludDgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJJLkludDE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiSS5JbnQzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIkkuSW50NjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJQLkRvdWJsZSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9lbnVtKil0eXBlKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICB0eXBlX3JlcHIgPSAiTWFwLkhhc2hNYXAgIiArIHJlbmRlcl9oc190eXBlKGt0eXBlLCB0cnVlKSArICIgIiArIHJlbmRlcl9oc190eXBlKHZ0eXBlLCB0cnVlKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIlNldC5IYXNoU2V0ICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIlZlY3Rvci5WZWN0b3IgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKTsKKworICB9IGVsc2UgeworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBuZWVkc19wYXJlbnMgPyAiKCIgKyB0eXBlX3JlcHIgKyAiKSIgOiB0eXBlX3JlcHI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBoYXNrZWxsIGNvbnN0cnVjdG9yCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19jb25zdHJ1Y3Rvcih0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiaW52YWxpZCB0eXBlOiBUX1ZPSUQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIHR5cGUtPmlzX2JpbmFyeSgpID8gIlQuVEJpbmFyeSIgOiAiVC5UU3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlQuVEJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlQuVEJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJULlRJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJULlRJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJULlRJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJULlREb3VibGUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVC5USTMyIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlQuVFN0cnVjdCI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVC5UTWFwIF8gXyI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVC5UU2V0IF8iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJULlRMaXN0IF8iOworICB9CisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihocywgIkhhc2tlbGwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmEzODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTA4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworZW51bSBpbnB1dF90eXBlIHsgSU5QVVRfVU5LTk9XTiwgSU5QVVRfVVRGOCwgSU5QVVRfUExBSU4gfTsKKworLyoqCisgKiBIVE1MIGNvZGUgZ2VuZXJhdG9yCisgKgorICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCisgKi8KK2NsYXNzIHRfaHRtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2h0bWxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzdGFuZGFsb25lXyA9IGZhbHNlOworICAgIHVuc2FmZV8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzdGFuZGFsb25lIikgPT0gMCkgeworICAgICAgICBzdGFuZGFsb25lXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vZXNjYXBlIikgPT0gMCkgeworICAgICAgICB1bnNhZmVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBodG1sOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWh0bWwiOworICAgIGlucHV0X3R5cGVfID0gSU5QVVRfVU5LTk9XTjsKKworICAgIGVzY2FwZV8uY2xlYXIoKTsKKyAgICBlc2NhcGVfWycmJ10gPSAiJmFtcDsiOworICAgIGVzY2FwZV9bJzwnXSA9ICImbHQ7IjsKKyAgICBlc2NhcGVfWyc+J10gPSAiJmd0OyI7CisgICAgZXNjYXBlX1snIiddID0gIiZxdW90OyI7CisgICAgZXNjYXBlX1snXCcnXSA9ICImYXBvczsiOworCisgICAgaW5pdF9hbGxvd2VkX19tYXJrdXAoKTsKKyAgfQorCisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3ModF9wcm9ncmFtKiB0cHJvZywgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pbmRleCgpOworICBzdGQ6OnN0cmluZyBlc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCYgc3RyKTsKKyAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc3MoKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9zdHJlYW0mIGZfdGFyZ2V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV9maWxlX2xpbmsoc3RkOjpzdHJpbmcgbmFtZSk7CisgIGJvb2wgaXNfdXRmOF9zZXF1ZW5jZShzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOworICB2b2lkIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOworICB2b2lkIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisKKyAgdm9pZCBwcmludF9kb2ModF9kb2MqIHRkb2MpOworICBpbnQgcHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisgIHZvaWQgcHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX291dF87CisgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfZmlsZV87CisgIGlucHV0X3R5cGUgaW5wdXRfdHlwZV87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGFsbG93ZWRfbWFya3VwOworICBib29sIHN0YW5kYWxvbmVfOworICBib29sIHVuc2FmZV87Cit9OworCisvKioKKyAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2MoKSB7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCisgICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+IgorICAgICAgICAgPDwgIjx0aD5EYXRhIHR5cGVzPC90aD48dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHByb2dyYW1fKTsKKyAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKKyAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKKyAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKSB7CisgIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyID0gZmluaXNoZWQuYmVnaW4oKTsgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7CisgICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOworICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7IGl0ZXIrKykgeworICAgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MoKml0ZXIsIGZpbmlzaGVkKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpIHsKKyAgc3RyaW5nIGZuYW1lID0gdHByb2ctPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICBmX291dF8gPDwgIjx0cj4iIDw8IGVuZGwgPDwgIjx0ZD4iIDw8IHRwcm9nLT5nZXRfbmFtZSgpIDw8ICI8L3RkPjx0ZD4iOworICBpZiAoIXRwcm9nLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gdHByb2ctPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1N2Y18iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgICAgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7CisgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IGZuX2h0bWw7CisgICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9ICgqc3ZfaXRlciktPmdldF9mdW5jdGlvbnMoKTsKKyAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7CisgICAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHN0cmluZyBodG1sID0gIjxsaT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRm5fIiArIG5hbWUgKyAiXyIgKyBmbl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgKyAiXCI+IiArIGZuX25hbWUgKyAiPC9hPjwvbGk+IjsKKyAgICAgICAgZm5faHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4oZm5fbmFtZSwgaHRtbCkpOworICAgICAgfQorICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBodG1sX2l0ZXIgPSBmbl9odG1sLmJlZ2luKCk7IGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOworICAgICAgICAgICBodG1sX2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgaHRtbF9pdGVyLT5zZWNvbmQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC91bD4iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGRhdGFfdHlwZXM7CisgIGlmICghdHByb2ctPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSB0cHJvZy0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmVuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNFbnVtXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsgIjwvYT4iOworICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgfQorICBpZiAoIXRwcm9nLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gdHByb2ctPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCp0ZF9pdGVyKS0+Z2V0X3N5bWJvbGljKCk7CisgICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1R5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjVHlwZWRlZl8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgaWYgKCF0cHJvZy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHRwcm9nLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm9faXRlciktPmdldF9uYW1lKCk7CisgICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1N0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy88PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1N0cnVjdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBkdF9pdGVyID0gZGF0YV90eXBlcy5iZWdpbigpOyBkdF9pdGVyICE9IGRhdGFfdHlwZXMuZW5kKCk7CisgICAgICAgZHRfaXRlcisrKSB7CisgICAgZl9vdXRfIDw8IGR0X2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7CisgIGlmICghdHByb2ctPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBjb25zdF9odG1sOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gdHByb2ctPmdldF9jb25zdHMoKTsKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjb25faXRlcjsKKyAgICBmb3IgKGNvbl9pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjb25faXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBodG1sID0gIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7CisgICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgY29uX2l0ZXIgPSBjb25zdF9odG1sLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0X2h0bWwuZW5kKCk7CisgICAgICAgICBjb25faXRlcisrKSB7CisgICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Cit9CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbS4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgY3VycmVudF9maWxlXyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKKyAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgIGZfb3V0Xy5vcGVuKGZuYW1lLmNfc3RyKCkpOworICBmX291dF8gPDwgIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiICAgIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPGhlYWQ+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sO2NoYXJzZXQ9dXRmLThcIiAvPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIGZfb3V0XyA8PCAiPHRpdGxlPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbAorICAgICAgICAgPDwgIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC9oMT4iIDw8IGVuZGw7CisKKyAgcHJpbnRfZG9jKHByb2dyYW1fKTsKKworICBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOworCisgIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkNvbnN0YW50c1wiPkNvbnN0YW50czwvaDI+IiA8PCBlbmRsOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+Q29uc3RhbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOworICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X2VudW1zKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJFbnVtZXJhdGlvbnNcIj5FbnVtZXJhdGlvbnM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBlbnVtcworICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlR5cGVkZWZzXCI+VHlwZSBkZWNsYXJhdGlvbnM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU3RydWN0c1wiPkRhdGEgc3RydWN0dXJlczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7CisgICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU2VydmljZXNcIj5TZXJ2aWNlczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICAgIH0KKyAgfQorCisgIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworCisgIGdlbmVyYXRlX2luZGV4KCk7CisgIGdlbmVyYXRlX2NzcygpOworfQorCisvKioKKyAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcworICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgeworICBjdXJyZW50X2ZpbGVfID0gImluZGV4Lmh0bWwiOworICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKKyAgZl9vdXRfLm9wZW4oaW5kZXhfZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOworICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKKyAgZl9vdXRfIDw8ICI8dGl0bGU+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsIDw8ICI8aDE+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L2gxPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkICIKKyAgICAgICAgICAgICJ0YWJsZS1jb25kZW5zZWRcIj48dGhlYWQ+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD48dGg+RGF0YSB0eXBlczwvdGg+IgorICAgICAgICAgPDwgIjx0aD5Db25zdGFudHM8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICB2ZWN0b3I8dF9wcm9ncmFtKj4gcHJvZ3JhbXM7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MocHJvZ3JhbV8sIHByb2dyYW1zKTsKKyAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NzKCkgeworICBpZiAoIXN0YW5kYWxvbmVfKSB7CisgICAgY3VycmVudF9maWxlXyA9ICJzdHlsZS5jc3MiOworICAgIHN0cmluZyBjc3NfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKKyAgICBmX291dF8ub3Blbihjc3NfZm5hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKKyAgICBmX291dF8uY2xvc2UoKTsKKyAgfQorfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b3N0cmVhbSYgZl90YXJnZXQpIHsKKyAgZl90YXJnZXQgPDwgQk9PVFNUUkFQX0NTUygpIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICIvKiBBdXRvLWdlbmVyYXRlZCBDU1MgZm9yIGdlbmVyYXRlZCBUaHJpZnQgZG9jcyAqLyIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImgzLCBoNCB7IG1hcmdpbi1ib3R0b206IDZweDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgI0NDQzsgbWFyZ2luLWJvdHRvbTogMTBweDsgcGFkZGluZzogMTBweDsgfSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImRpdi5leHRlbmRzIHsgbWFyZ2luOiAtMC41ZW0gMCAxZW0gNWVtIH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJ0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJ0YWJsZSB7IGVtcHR5LWNlbGxzOiBzaG93OyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiY29kZSB7IGxpbmUtaGVpZ2h0OiAyMHB4OyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiLnRhYmxlLWJvcmRlcmVkIHRoLCAudGFibGUtYm9yZGVyZWQgdGQgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERERERDsgfSIKKyAgICAgICAgICAgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIENTUyB0YWcuCisgKiBEZXBlbmRpbmcgb24gInN0YW5kYWxvbmUiLCBlaXRoZXIgYSBDU1MgZmlsZSBsaW5rIChkZWZhdWx0KSwgb3IgdGhlIGVudGlyZSBDU1MgaXMgZW1iZWRkZWQKKyAqIGlubGluZS4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHlsZV90YWcoKSB7CisgIGlmICghc3RhbmRhbG9uZV8pIHsKKyAgICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIi8+PCEtLSIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9jc3NfY29udGVudChmX291dF8pOworICAgIGZfb3V0XyA8PCAiLS0+PC9zdHlsZT4iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSB0YXJnZXQgZmlsZSBmb3IgYSA8YSBocmVmPiBsaW5rCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGVtcHR5LCB3aGVuZXZlciBmaWxlbmFtZSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZmlsZS4KKyAqLworc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6bWFrZV9maWxlX2xpbmsoc3RkOjpzdHJpbmcgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIChjdXJyZW50X2ZpbGVfLmNvbXBhcmUoZmlsZW5hbWUpICE9IDApID8gZmlsZW5hbWUgOiAiIjsKK30KKworLyoqCisgKiBJZiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRhYmxlIG9iamVjdCBoYXMgZG9jdW1lbnRhdGlvbiBhdHRhY2hlZCwgdGhpcworICogd2lsbCBlbWl0IGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIEhUTUwgZm9ybWF0LgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2RvYyh0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaWYgKHVuc2FmZV8pIHsKKyAgICAgIGZfb3V0XyA8PCB0ZG9jLT5nZXRfZG9jKCkgPDwgIjxici8+IjsKKyAgICB9IGVsc2UgeworICAgICAgZl9vdXRfIDw8ICI8cHJlPiIgPDwgZXNjYXBlX2h0bWwodGRvYy0+Z2V0X2RvYygpKSA8PCAiPC9wcmU+PGJyLz4iOworICAgIH0KKyAgfQorfQorCitib29sIHRfaHRtbF9nZW5lcmF0b3I6OmlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKSB7CisgIC8vIGxlYWRpbmcgY2hhciBkZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlCisgIHVuc2lnbmVkIGNoYXIgYyA9IHN0ci5hdChmaXJzdHBvcyk7CisgIGludCBjb3VudCA9IDA7CisgIGlmICgoYyAmIDB4RTApID09IDB4QzApIHsKKyAgICBjb3VudCA9IDE7CisgIH0gZWxzZSBpZiAoKGMgJiAweEYwKSA9PSAweEUwKSB7CisgICAgY291bnQgPSAyOworICB9IGVsc2UgaWYgKChjICYgMHhGOCkgPT0gMHhGMCkgeworICAgIGNvdW50ID0gMzsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RkMpID09IDB4RjgpIHsKKyAgICBjb3VudCA9IDQ7CisgIH0gZWxzZSBpZiAoKGMgJiAweEZFKSA9PSAweEZDKSB7CisgICAgY291bnQgPSA1OworICB9IGVsc2UgeworICAgIC8vIHBkZWJ1ZygiVVRGLTggdGVzdDogY2hhciAnJWMnICglZCkgaXMgbm90IGEgdmFsaWQgVVRGLTggbGVhZGluZyBieXRlIiwgYywgaW50KGMpKTsKKyAgICByZXR1cm4gZmFsc2U7IC8vIG5vIFVURi04CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnMKKyAgc2l6ZV90IHBvcyA9IGZpcnN0cG9zICsgMTsKKyAgd2hpbGUgKChwb3MgPCBzdHIubGVuZ3RoKCkpICYmICgwIDwgY291bnQpKSB7CisgICAgYyA9IHN0ci5hdChwb3MpOworICAgIGlmICgoYyAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgIC8vIHBkZWJ1ZygiVVRGLTggdGVzdDogY2hhciAnJWMnICglZCkgaXMgbm90IGEgdmFsaWQgVVRGLTggZm9sbG93aW5nIGJ5dGUiLCBjLCBpbnQoYykpOworICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAorICAgIH0KKyAgICAtLWNvdW50OworICAgICsrcG9zOworICB9CisKKyAgLy8gdHJ1ZSBpZiB0aGUgc2VxdWVuY2UgaXMgY29tcGxldGUKKyAgcmV0dXJuICgwID09IGNvdW50KTsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKSB7CisgIGlmIChpc191dGY4X3NlcXVlbmNlKHN0ciwgZmlyc3Rwb3MpKSB7CisgICAgcGRlYnVnKCJJbnB1dCBzZWVtcyB0byBiZSBhbHJlYWR5IFVURi04IGVuY29kZWQiKTsKKyAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VURjg7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZmFsbGJhY2sKKyAgcHdhcm5pbmcoMSwgIklucHV0IGlzIG5vdCBVVEYtOCwgdHJlYXRpbmcgYXMgcGxhaW4gQU5TSSIpOworICBpbnB1dF90eXBlXyA9IElOUFVUX1BMQUlOOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmluaXRfYWxsb3dlZF9fbWFya3VwKCkgeworICBhbGxvd2VkX21hcmt1cC5jbGVhcigpOworICAvLyBzdGFuZGFsb25lIHRhZ3MKKyAgYWxsb3dlZF9tYXJrdXBbImJyIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYnIvIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaW1nIl0gPSAxOworICAvLyBwYWlyZWQgdGFncworICBhbGxvd2VkX21hcmt1cFsiYiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9iIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi91Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9pIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYmlnIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2JpZyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInNtYWxsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3NtYWxsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsic3VwIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3N1cCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInN1YiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zdWIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJwcmUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcHJlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidHQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdHQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJ1bCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi91bCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIm9sIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL29sIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsibGkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvbGkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJhIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2EiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJwIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3AiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJjb2RlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2NvZGUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImR0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2R0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZGQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZGQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgyIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gyIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg1Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g1Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDYiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDYiXSA9IDE7Cit9CisKK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6OmVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworCisgIHVuc2lnbmVkIGNoYXIgYyA9ICc/JzsKKyAgc2l6ZV90IGxhc3Rwb3M7CisgIHNpemVfdCBmaXJzdHBvcyA9IDA7CisgIHdoaWxlIChmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworCisgICAgLy8gbG9vayBmb3Igbm9uLUFTQ0lJIGNoYXIKKyAgICBsYXN0cG9zID0gZmlyc3Rwb3M7CisgICAgd2hpbGUgKGxhc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQobGFzdHBvcyk7CisgICAgICBpZiAoKCc8JyA9PSBjKSB8fCAoJz4nID09IGMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytsYXN0cG9zOworICAgIH0KKworICAgIC8vIGNvcHkgd2hhdCB3ZSBnb3Qgc28gZmFyCisgICAgaWYgKGxhc3Rwb3MgPiBmaXJzdHBvcykgeworICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICBmaXJzdHBvcyA9IGxhc3Rwb3M7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHRhZyBlbmQgd2l0aG91dCBjb3JyZXNwb25kaW5nIGJlZ2luCisgICAgKytmaXJzdHBvczsKKyAgICBpZiAoJz4nID09IGMpIHsKKyAgICAgIHJlc3VsdCA8PCAiJmd0OyI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBleHRyYWN0IHRoZSB0YWcKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdGFnc3RyZWFtOworICAgIHdoaWxlIChmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgYyA9IHN0ci5hdChmaXJzdHBvcyk7CisgICAgICArK2ZpcnN0cG9zOworICAgICAgaWYgKCc8JyA9PSBjKSB7CisgICAgICAgIHRhZ3N0cmVhbSA8PCAiJmx0OyI7IC8vIG5lc3RlZCBiZWdpbj8KKyAgICAgIH0gZWxzZSBpZiAoJz4nID09IGMpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWdzdHJlYW0gPDwgYzsgLy8gbm90IHZlcnkgZWZmaWNpZW50LCBidXQgdGFncyBzaG91bGQgYmUgcXVpdGUgc2hvcnQKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZSBhbGxvdyBmb3Igc2V2ZXJhbCBtYXJrdXAgaW4gZG9jc3RyaW5ncywgYWxsIGVsc2Ugd2lsbCBiZWNvbWUgZXNjYXBlZAorICAgIHN0cmluZyB0YWdfY29udGVudCA9IHRhZ3N0cmVhbS5zdHIoKTsKKyAgICBzdHJpbmcgdGFnX2tleSA9IHRhZ19jb250ZW50OworICAgIHNpemVfdCBmaXJzdF93aGl0ZSA9IHRhZ19rZXkuZmluZF9maXJzdF9vZigiIFx0XGZcdlxuXHIiKTsKKyAgICBpZiAoZmlyc3Rfd2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICB0YWdfa2V5LmVyYXNlKGZpcnN0X3doaXRlKTsKKyAgICB9CisgICAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgdGFnX2tleS5sZW5ndGgoKTsgKytpKSB7CisgICAgICB0YWdfa2V5W2ldID0gdG9sb3dlcih0YWdfa2V5W2ldKTsKKyAgICB9CisgICAgaWYgKGFsbG93ZWRfbWFya3VwLmZpbmQodGFnX2tleSkgIT0gYWxsb3dlZF9tYXJrdXAuZW5kKCkpIHsKKyAgICAgIHJlc3VsdCA8PCAiPCIgPDwgdGFnX2NvbnRlbnQgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPDwgIiZsdDsiIDw8IHRhZ3N0cmVhbS5zdHIoKSA8PCAiJmd0OyI7CisgICAgICBwdmVyYm9zZSgiaWxsZWdhbCBtYXJrdXAgPCVzPiBpbiBkb2MtY29tbWVudFxuIiwgdGFnX2tleS5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCYgc3RyKSB7CisgIC8vIHRoZSBnZW5lcmF0ZWQgSFRNTCBoZWFkZXIgc2F5cyBpdCBpcyBVVEYtOCBlbmNvZGVkCisgIC8vIGlmIFVURi04IGlucHV0IGhhcyBiZWVuIGRldGVjdGVkIGJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcKKyAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VURjgpIHsKKyAgICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhzdHIpOworICB9CisKKyAgLy8gY29udmVydCB1bnNhZmUgY2hhcnMgdG8gdGhlaXIgJiM8bnVtPjsgZXF1aXZhbGVudAorICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHVuc2lnbmVkIGludCBpYyA9IDA7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWMgPSBjOworICAgICAgaWYgKCgzMiA+IGljKSB8fCAoMTI3IDwgaWMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytsYXN0cG9zOworICAgIH0KKworICAgIC8vIGNvcHkgd2hhdCB3ZSBnb3Qgc28gZmFyCisgICAgaWYgKGxhc3Rwb3MgPiBmaXJzdHBvcykgeworICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICBmaXJzdHBvcyA9IGxhc3Rwb3M7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHNvbWUgY29udHJvbCBjb2RlPworICAgIGlmIChpYyA8PSAzMSkgeworICAgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlICdccic6CisgICAgICBjYXNlICdcbic6CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIHJlc3VsdCA8PCBjOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8vIHNpbGVudGx5IGNvbnN1bWUgYWxsIG90aGVyIGN0cmwgY2hhcnMKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2ZpcnN0cG9zOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kPworICAgIGlmIChmaXJzdHBvcyA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHRyeSB0byBkZXRlY3QgaW5wdXQgZW5jb2RpbmcKKyAgICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVU5LTk9XTikgeworICAgICAgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ciwgZmlyc3Rwb3MpOworICAgICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VURjgpIHsKKyAgICAgICAgbGFzdHBvcyA9IHN0ci5sZW5ndGgoKTsKKyAgICAgICAgcmVzdWx0IDw8IHN0ci5zdWJzdHIoZmlyc3Rwb3MsIGxhc3Rwb3MgLSBmaXJzdHBvcyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBzb21ldGhpbmcgdXNlZnVsIGJhc2VkIG9uIHRoZSBkZXRlY3RlZCBlbmNvZGluZworICAgIHN3aXRjaCAoaW5wdXRfdHlwZV8pIHsKKyAgICBjYXNlIElOUFVUX1BMQUlOOgorICAgICAgcmVzdWx0IDw8ICImIyIgPDwgaWMgPDwgIjsiOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiVW5leHBlY3RlZCBvciB1bnJlY29nbml6ZWQgaW5wdXQgZW5jb2RpbmciOworICAgIH0KKyAgfQorCisgIHJldHVybiBlc2NhcGVfaHRtbF90YWdzKHJlc3VsdC5zdHIoKSk7Cit9CisKKy8qKgorICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCisgKi8KK2ludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSAwOworICBmX291dF8gPDwgIjxjb2RlPiI7CisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZl9vdXRfIDw8ICJsaXN0Jmx0OyI7CisgICAgICBsZW4gPSA2ICsgcHJpbnRfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgZl9vdXRfIDw8ICJzZXQmbHQ7IjsKKyAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibWFwJmx0OyI7CisgICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgbGVuICs9IHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX291dF8gPDwgKHR0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOworICAgIGxlbiA9IHR0eXBlLT5nZXRfbmFtZSgpLnNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgcHJvZ19uYW1lID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHR5cGVfbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsocHJvZ19uYW1lICsgIi5odG1sIikgPDwgIiMiOworICAgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgZl9vdXRfIDw8ICJFbnVtXyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBmX291dF8gPDwgIlN2Y18iOworICAgIH0KKyAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICJcIj4iOworICAgIGxlbiA9IHR5cGVfbmFtZS5zaXplKCk7CisgICAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7CisgICAgICBmX291dF8gPDwgcHJvZ19uYW1lIDw8ICIuIjsKKyAgICAgIGxlbiArPSBwcm9nX25hbWUuc2l6ZSgpICsgMTsKKyAgICB9CisgICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiPC9hPiI7CisgIH0KKyAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKKyAgcmV0dXJuIChpbnQpbGVuOworfQorCisvKioKKyAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworCisgIC8vIGlmIHR2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLCB0aGUgY29uc3RhbnQgY29udGVudCBpcyBhbHJlYWR5IHNob3duIGVsc2V3aGVyZQorICBpZiAodHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgICAgc3RyaW5nIG5hbWUgPSBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyKCkpOworICAgIGZfb3V0XyA8PCAiPGNvZGU+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0NvbnN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCisgICAgICAgICAgICAgICsgIjwvYT48L2NvZGU+IjsKKyAgICByZXR1cm47CisgIH0KKworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgZl9vdXRfIDw8ICciJyA8PCBlc2NhcGVfaHRtbChnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9vdXRfIDw8ICgodHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZl9vdXRfIDw8ICJVTktOT1dOIEJBU0UgVFlQRSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh0cnVldHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCisgICAgICAgICAgIDw8IGVzY2FwZV9odG1sKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc3RydWN0KCkgfHwgdHJ1ZXR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0cnVldHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHJ1ZXR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19tYXAoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0cnVldHlwZSktPmdldF9rZXlfdHlwZSgpLCBtYXBfaXRlci0+Zmlyc3QpOworICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19saXN0KCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zZXQoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X3NldCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIlVOS05PV04gVFlQRSI7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgb3V0IGRvY3VtZW50YXRpb24gZm9yIGFyZ3VtZW50cy9leGNlcHRpb25zIG9mIGEgZnVuY3Rpb24sIGlmIGFueSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuCisgKiBzdXBwbGllZC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgYm9vbCBoYXNfZG9jcyA9IGZhbHNlOworICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICBpZiAoYXJnX2l0ZXIgIT0gYXJncy5lbmQoKSkgeworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBpZiAoKCphcmdfaXRlciktPmhhc19kb2MoKSAmJiAhKCphcmdfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQorICAgICAgICBoYXNfZG9jcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXNfZG9jcykgeworICAgICAgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiUGFyYW1ldGVyc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIj5QYXJhbWV0ZXJzPC9oND4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5OYW1lPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdGhlYWQ+IjsKKyAgICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmFyZ19pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7CisgICAgfQorICB9CisKKyAgaGFzX2RvY3MgPSBmYWxzZTsKKyAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKKyAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgIGlmICgoKmV4X2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqZXhfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQorICAgICAgICBoYXNfZG9jcyA9IHRydWU7CisgICAgfQorICAgIGlmIChoYXNfZG9jcykgeworICAgICAgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICAgIGZfb3V0XyA8PCAiPGJyLz48aDQgaWQ9XCJFeGNlcHRpb25zXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiPkV4Y2VwdGlvbnM8L2g0PiIgPDwgZW5kbDsKKyAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOworICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqZXhfaXRlciktPmdldF9kb2MoKSk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKKyAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKKyAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKKyAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKKyAgcHJpbnRfZG9jKHRlbnVtKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZfb3V0XyA8PCAiPGJyLz48dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiIgPDwgZW5kbDsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+PGNvZGU+IjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKKyAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPiIgPDwgZW5kbDsKKyAgICBwcmludF9kb2MoKCp2YWxfaXRlcikpOworICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZSA8PCAiPC9jb2RlPjwvdGQ+PHRkPiI7CisgIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKKyAgZl9vdXRfIDw8ICI8L3RkPjx0ZD48Y29kZT4iOworICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOworICBmX291dF8gPDwgIjwvY29kZT48L3RkPjwvdHI+IjsKKyAgaWYgKHRjb25zdC0+aGFzX2RvYygpKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkIGNvbHNwYW49XCIzXCI+PGJsb2NrcXVvdGU+IjsKKyAgICBwcmludF9kb2ModGNvbnN0KTsKKyAgICBmX291dF8gPDwgIjwvYmxvY2txdW90ZT48L3RkPjwvdHI+IjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IjsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX291dF8gPDwgIkV4Y2VwdGlvbjogIjsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJVbmlvbjogIjsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIlN0cnVjdDogIjsKKyAgfQorICBmX291dF8gPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPktleTwvdGg+PHRoPkZpZWxkPC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48dGg+UmVxdWlyZWRuZXNzPC8iCisgICAgICAgICAgICAidGg+PHRoPkRlZmF1bHQgdmFsdWU8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqbWVtX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjwvdGQ+PHRkPiI7CisgICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqbWVtX2l0ZXIpLT5nZXRfZG9jKCkpOworICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBmX291dF8gPDwgIm9wdGlvbmFsIjsKKyAgICB9IGVsc2UgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZl9vdXRfIDw8ICJyZXF1aXJlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCAiZGVmYXVsdCI7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICB0X2NvbnN0X3ZhbHVlKiBkZWZhdWx0X3ZhbCA9ICgqbWVtX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoZGVmYXVsdF92YWwgIT0gTlVMTCkgeworICAgICAgZl9vdXRfIDw8ICI8Y29kZT4iOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCptZW1faXRlciktPmdldF90eXBlKCksIGRlZmF1bHRfdmFsKTsKKyAgICAgIGZfb3V0XyA8PCAiPC9jb2RlPiI7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgIjwvdGFibGU+PGJyLz4iOworICBwcmludF9kb2ModHN0cnVjdCk7CisgIGZfb3V0XyA8PCAiPC9kaXY+IjsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKKyAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKKyAgfQorICBwcmludF9kb2ModHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgICAgZl9vdXRfIDw8ICI8aDQgaWQ9XCJGbl8iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IGZuX25hbWUgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgPDwgIi4iIDw8IGZuX25hbWUgPDwgIjwvaDQ+IiA8PCBlbmRsOworICAgIGZfb3V0XyA8PCAiPHByZT4iOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgb2Zmc2V0ID0gcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmX291dF8gPDwgIiAiIDw8IGZuX25hbWUgPDwgIigiOworICAgIG9mZnNldCArPSBmbl9uYW1lLnNpemUoKSArIDI7CisgICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7CisgICAgICAgICAgZl9vdXRfIDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICIgIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgfQorICAgIH0KKyAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7CisgICAgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOworICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBwcmludF90eXBlKCgqZXhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgfQorICAgICAgZl9vdXRfIDw8IGVuZGw7CisgICAgfQorICAgIGZfb3V0XyA8PCAiPC9wcmU+IjsKKyAgICBwcmludF9kb2MoKmZuX2l0ZXIpOworICAgIHByaW50X2ZuX2FyZ3NfZG9jKCpmbl9pdGVyKTsKKyAgICBmX291dF8gPDwgIjwvZGl2PiI7CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBodG1sLAorICAgICJIVE1MIiwKKyAgICAiICAgIHN0YW5kYWxvbmU6ICAgICAgU2VsZi1jb250YWluZWQgbW9kZSwgaW5jbHVkZXMgYWxsIENTUyBpbiB0aGUgSFRNTCBmaWxlcy5cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIG5vIHN0eWxlLmNzcyBmaWxlLCBidXQgSFRNTCBmaWxlcyB3aWxsIGJlIGxhcmdlci5cbiIKKyAgICAiICAgIG5vZXNjYXBlOiAgICAgICAgRG8gbm90IGVzY2FwZSBodG1sIGluIGRvYyB0ZXh0LlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDBiMTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMjQwIEBACisjZGVmaW5lIEJPT1RTVFJBUF9DU1MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIvKiFcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBCb290c3RyYXAgdjIuMC4zXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBDb3B5cmlnaHQgMjAxMiBUd2l0dGVyLCBJbmNcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIgKiBEZXNpZ25lZCBhbmQgYnVpbHQgd2l0aCBhbGwgdGhlIGxvdmUgaW4gdGhlIHdvcmxkIEB0d2l0dGVyIGJ5IEBtZG8gYW5kIEBmYXQuXG4iICAgICAgICAgICAgICBcCisgICIgKi9cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY2xlYXJmaXh7Knpvb206MTt9LmNsZWFyZml4OmJlZm9yZSwuY2xlYXJmaXg6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICBcCisgICIuY2xlYXJmaXg6YWZ0ZXJ7Y2xlYXI6Ym90aDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuaGlkZS10ZXh0e2ZvbnQ6MC8wICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhO2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICBcCisgICIuaW5wdXQtYmxvY2stbGV2ZWx7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstIiAgICBcCisgICJtb3otYm94LXNpemluZzpib3JkZXItYm94Oy1tcy1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O31cbiIgICAgICAgICAgICAgICAgICBcCisgICJhcnRpY2xlLGFzaWRlLGRldGFpbHMsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9jazt9XG4iICAgICBcCisgICJhdWRpbyxjYW52YXMsdmlkZW97ZGlzcGxheTppbmxpbmUtYmxvY2s7KmRpc3BsYXk6aW5saW5lOyp6b29tOjE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJodG1se2ZvbnQtc2l6ZToxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy1tcy10ZXh0LXNpemUtYWRqdXN0OjEwMCU7fVxuIiAgICAgICAgICAgICAgICBcCisgICJhOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQgIzMzMztvdXRsaW5lOjVweCBhdXRvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICItd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhOmhvdmVyLGE6YWN0aXZle291dGxpbmU6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzdWIsc3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt9XG4iICAgICAgICAgICAgICBcCisgICJzdXB7dG9wOi0wLjVlbTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzdWJ7Ym90dG9tOi0wLjI1ZW07fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbWd7bWF4LXdpZHRoOjEwMCU7dmVydGljYWwtYWxpZ246bWlkZGxlO2JvcmRlcjowOy1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6YmljdWJpYzt9XG4iICAgICAgICAgICBcCisgICJidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe21hcmdpbjowO2ZvbnQtc2l6ZToxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt9XG4iICAgICAgICAgICAgICAgICBcCisgICJidXR0b24saW5wdXR7Km92ZXJmbG93OnZpc2libGU7bGluZS1oZWlnaHQ6bm9ybWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXJ7cGFkZGluZzowO2JvcmRlcjowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJidXR0b24saW5wdXRbdHlwZT1cImJ1dHRvblwiXSxpbnB1dFt0eXBlPVwicmVzZXRcIl0saW5wdXRbdHlwZT1cInN1Ym1pdFwiXXtjdXJzb3I6cG9pbnRlcjstIiAgICBcCisgICJ3ZWJraXQtYXBwZWFyYW5jZTpidXR0b247fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbnB1dFt0eXBlPVwic2VhcmNoXCJdey13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzoiICBcCisgICJjb250ZW50LWJveDstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLGlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLSIgICAgICBcCisgICJjYW5jZWwtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZXh0YXJlYXtvdmVyZmxvdzphdXRvO3ZlcnRpY2FsLWFsaWduOnRvcDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJib2R5e21hcmdpbjowO2ZvbnQtZmFtaWx5OlwiSGVsdmV0aWNhICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJOZXVlXCIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweDtjb2xvcjojMzMzMzMzO2JhY2tncm91bmQtIiAgICBcCisgICJjb2xvcjojZmZmZmZmO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhe2NvbG9yOiMwMDg4Y2M7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhOmhvdmVye2NvbG9yOiMwMDU1ODA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93e21hcmdpbi1sZWZ0Oi0yMHB4Oyp6b29tOjE7fS5yb3c6YmVmb3JlLC5yb3c6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICBcCisgICIucm93OmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJbY2xhc3MqPVwic3BhblwiXXtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OjIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtdG9wIC5jb250YWluZXIsLm5hdmJhci1maXhlZC1ib3R0b20gLmNvbnRhaW5lcnt3aWR0aDo5NDBweDt9XG4iICAgICAgICBcCisgICIuc3BhbjEye3dpZHRoOjk0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjExe3dpZHRoOjg2MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjEwe3dpZHRoOjc4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3Bhbjl7d2lkdGg6NzAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3Bhbjh7d2lkdGg6NjIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3Bhbjd7d2lkdGg6NTQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjZ7d2lkdGg6NDYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjV7d2lkdGg6MzgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjR7d2lkdGg6MzAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjN7d2lkdGg6MjIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjJ7d2lkdGg6MTQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuc3BhbjF7d2lkdGg6NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6OTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MTF7bWFyZ2luLWxlZnQ6OTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MTB7bWFyZ2luLWxlZnQ6ODIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0OXttYXJnaW4tbGVmdDo3NDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0OHttYXJnaW4tbGVmdDo2NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0N3ttYXJnaW4tbGVmdDo1ODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0NnttYXJnaW4tbGVmdDo1MDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0NXttYXJnaW4tbGVmdDo0MjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0NHttYXJnaW4tbGVmdDozNDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0M3ttYXJnaW4tbGVmdDoyNjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MnttYXJnaW4tbGVmdDoxODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIub2Zmc2V0MXttYXJnaW4tbGVmdDoxMDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlke3dpZHRoOjEwMCU7Knpvb206MTt9LnJvdy1mbHVpZDpiZWZvcmUsLnJvdy1mbHVpZDphZnRlcntkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9IiBcCisgICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkOmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJbY2xhc3MqPVwic3BhblwiXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7bWluLWhlaWdodDoyOHB4Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otIiBcCisgICJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1zLWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDoiICBcCisgICIyLjEyNzY1OTU3NCU7Km1hcmdpbi1sZWZ0OjIuMDc0NDY4MDg0NjM4Mjk3NyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIFtjbGFzcyo9XCJzcGFuXCJdOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMTJ7d2lkdGg6OTkuOTk5OTk5OTg5OTk5OTklOyp3aWR0aDo5OS45NDY4MDg1MDA2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMTF7d2lkdGg6OTEuNDg5MzYxNjkzJTsqd2lkdGg6OTEuNDM2MTcwMjAzNjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMTB7d2lkdGg6ODIuOTc4NzIzMzk1OTk5OTklOyp3aWR0aDo4Mi45MjU1MzE5MDY2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuOXt3aWR0aDo3NC40NjgwODUwOTklOyp3aWR0aDo3NC40MTQ4OTM2MDk2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuOHt3aWR0aDo2NS45NTc0NDY4MDE5OTk5OSU7KndpZHRoOjY1LjkwNDI1NTMxMjYzODI4JTt9XG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuN3t3aWR0aDo1Ny40NDY4MDg1MDUlOyp3aWR0aDo1Ny4zOTM2MTcwMTU2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuNnt3aWR0aDo0OC45MzYxNzAyMDc5OTk5OSU7KndpZHRoOjQ4Ljg4Mjk3ODcxODYzODI5JTt9XG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuNXt3aWR0aDo0MC40MjU1MzE5MTElOyp3aWR0aDo0MC4zNzIzNDA0MjE2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuNHt3aWR0aDozMS45MTQ4OTM2MTQlOyp3aWR0aDozMS44NjE3MDIxMjQ2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuM3t3aWR0aDoyMy40MDQyNTUzMTclOyp3aWR0aDoyMy4zNTEwNjM4Mjc2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMnt3aWR0aDoxNC44OTM2MTcwMiU7KndpZHRoOjE0Ljg0MDQyNTUzMDYzODMlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucm93LWZsdWlkIC5zcGFuMXt3aWR0aDo2LjM4Mjk3ODcyMyU7KndpZHRoOjYuMzI5Nzg3MjMzNjM4Mjk4JTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVye21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG87Knpvb206MTt9LmNvbnRhaW5lcjpiZWZvcmUsLmNvbnRhaW5lcjphZnRlcnsiICAgICBcCisgICJkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyOmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyLWZsdWlke3BhZGRpbmctcmlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDsqem9vbToxO30uY29udGFpbmVyLWZsdWlkOmJlZm9yZSwuIiAgICAgICBcCisgICJjb250YWluZXItZmx1aWQ6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuY29udGFpbmVyLWZsdWlkOmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwe21hcmdpbjowIDAgOXB4O2ZvbnQtZmFtaWx5OlwiSGVsdmV0aWNhICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJOZXVlXCIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweDt9cCAiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbHtmb250LXNpemU6MTFweDtjb2xvcjojOTk5OTk5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGVhZHttYXJnaW4tYm90dG9tOjE4cHg7Zm9udC1zaXplOjIwcHg7Zm9udC13ZWlnaHQ6MjAwO2xpbmUtaGVpZ2h0OjI3cHg7fVxuIiAgICAgICAgICAgICAgICAgICBcCisgICJoMSxoMixoMyxoNCxoNSxoNnttYXJnaW46MDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6aW5oZXJpdDt0ZXh0LXJlbmRlcmluZzoiICBcCisgICJvcHRpbWl6ZWxlZ2liaWxpdHk7fWgxIHNtYWxsLGgyIHNtYWxsLGgzIHNtYWxsLGg0IHNtYWxsLGg1IHNtYWxsLGg2ICIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbHtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoMXtmb250LXNpemU6MzBweDtsaW5lLWhlaWdodDozNnB4O31oMSBzbWFsbHtmb250LXNpemU6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoMntmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNnB4O31oMiBzbWFsbHtmb250LXNpemU6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoM3tmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O31oMyBzbWFsbHtmb250LXNpemU6MTRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNCxoNSxoNntsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNHtmb250LXNpemU6MTRweDt9aDQgc21hbGx7Zm9udC1zaXplOjEycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNXtmb250LXNpemU6MTJweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJoNntmb250LXNpemU6MTFweDtjb2xvcjojOTk5OTk5O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIucGFnZS1oZWFkZXJ7cGFkZGluZy1ib3R0b206MTdweDttYXJnaW46MThweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWVlZWU7fVxuIiAgICAgICAgICAgICBcCisgICIucGFnZS1oZWFkZXIgaDF7bGluZS1oZWlnaHQ6MTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bCxvbHtwYWRkaW5nOjA7bWFyZ2luOjAgMCA5cHggMjVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bCB1bCx1bCBvbCxvbCBvbCxvbCB1bHttYXJnaW4tYm90dG9tOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bHtsaXN0LXN0eWxlOmRpc2M7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJvbHtsaXN0LXN0eWxlOmRlY2ltYWw7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsaXtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bC51bnN0eWxlZCxvbC51bnN0eWxlZHttYXJnaW4tbGVmdDowO2xpc3Qtc3R5bGU6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkbHttYXJnaW4tYm90dG9tOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkdCxkZHtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkdHtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE3cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkZHttYXJnaW4tbGVmdDo5cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuZGwtaG9yaXpvbnRhbCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJkdHtmbG9hdDpsZWZ0O3dpZHRoOjEyMHB4O2NsZWFyOmxlZnQ7dGV4dC1hbGlnbjpyaWdodDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczsiICBcCisgICJ3aGl0ZS1zcGFjZTpub3dyYXA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoxMzBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJocnttYXJnaW46MThweCAwO2JvcmRlcjowO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWVlZWU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZmZmZjt9XG4iICAgICBcCisgICJzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJlbXtmb250LXN0eWxlOml0YWxpYzt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubXV0ZWR7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhYmJyW3RpdGxlXXtjdXJzb3I6aGVscDtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgI2RkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhYmJyLmluaXRpYWxpc217Zm9udC1zaXplOjkwJTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJibG9ja3F1b3Rle3BhZGRpbmc6MCAwIDAgMTVweDttYXJnaW46MCAwIDE4cHg7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICNlZWVlZWU7fWJsb2NrcXVvdGUgIiAgICAgICBcCisgICJwe21hcmdpbi1ib3R0b206MDtmb250LXNpemU6MTZweDtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MjIuNXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJibG9ja3F1b3RlIHNtYWxse2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6MThweDtjb2xvcjojOTk5OTk5O31ibG9ja3F1b3RlICIgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbDpiZWZvcmV7Y29udGVudDonXFwyMDE0IFxcMDBBMCc7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJibG9ja3F1b3RlLnB1bGwtcmlnaHR7ZmxvYXQ6cmlnaHQ7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDowO2JvcmRlci1yaWdodDo1cHggc29saWQgIiAgICBcCisgICIjZWVlZWVlO2JvcmRlci1sZWZ0OjA7fWJsb2NrcXVvdGUucHVsbC1yaWdodCBwLGJsb2NrcXVvdGUucHVsbC1yaWdodCAiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJzbWFsbHt0ZXh0LWFsaWduOnJpZ2h0O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJxOmJlZm9yZSxxOmFmdGVyLGJsb2NrcXVvdGU6YmVmb3JlLGJsb2NrcXVvdGU6YWZ0ZXJ7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRyZXNze2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2xpbmUtaGVpZ2h0OjE4cHg7fVxuIiAgICAgICAgICAgICAgICBcCisgICJzbWFsbHtmb250LXNpemU6MTAwJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaXRle2ZvbnQtc3R5bGU6bm9ybWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjb2RlLHByZXtwYWRkaW5nOjAgM3B4IDJweDtmb250LWZhbWlseTpNZW5sbyxNb25hY28sQ29uc29sYXMsXCJDb3VyaWVyICIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJOZXdcIixtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7Y29sb3I6IzMzMzMzMzstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7IiBcCisgICJib3JkZXItcmFkaXVzOjNweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjb2Rle3BhZGRpbmc6MnB4IDRweDtjb2xvcjojZDE0O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmOTtib3JkZXI6MXB4IHNvbGlkICNlMWUxZTg7fVxuIiAgICAgICAgICBcCisgICJwcmV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjguNXB4O21hcmdpbjowIDAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICI5cHg7Zm9udC1zaXplOjEyLjAyNXB4O2xpbmUtaGVpZ2h0OjE4cHg7d29yZC1icmVhazpicmVhay1hbGw7d29yZC13cmFwOmJyZWFrLXdvcmQ7d2hpdGUtc3BhY2U6IiBcCisgICJwcmU7d2hpdGUtc3BhY2U6cHJlLXdyYXA7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXI6MXB4IHNvbGlkICIgICAgICBcCisgICJyZ2JhKDAsIDAsIDAsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIwLjE1KTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7fXByZS5wcmV0dHlwcmludHsiICAgICBcCisgICJtYXJnaW4tYm90dG9tOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwcmUgY29kZXtwYWRkaW5nOjA7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowO31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICIucHJlLXNjcm9sbGFibGV7bWF4LWhlaWdodDozNDBweDtvdmVyZmxvdy15OnNjcm9sbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwsLmJhZGdle2ZvbnQtc2l6ZToxMC45OThweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE0cHg7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC0iICAgICBcCisgICJhbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIwLjI1KTtiYWNrZ3JvdW5kLWNvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWx7cGFkZGluZzoxcHggNHB4ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4O31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICIuYmFkZ2V7cGFkZGluZzoxcHggOXB4ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIycHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjlweDstbW96LWJvcmRlci1yYWRpdXM6OXB4O2JvcmRlci1yYWRpdXM6OXB4O31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICJhLmxhYmVsOmhvdmVyLGEuYmFkZ2U6aG92ZXJ7Y29sb3I6I2ZmZmZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcjt9XG4iICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW1wb3J0YW50LC5iYWRnZS1pbXBvcnRhbnR7YmFja2dyb3VuZC1jb2xvcjojYjk0YTQ4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW1wb3J0YW50W2hyZWZdLC5iYWRnZS1pbXBvcnRhbnRbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojOTUzYjM5O31cbiIgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtd2FybmluZywuYmFkZ2Utd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmODk0MDY7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtd2FybmluZ1tocmVmXSwuYmFkZ2Utd2FybmluZ1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiNjNjc2MDU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtc3VjY2VzcywuYmFkZ2Utc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM0Njg4NDc7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtc3VjY2Vzc1tocmVmXSwuYmFkZ2Utc3VjY2Vzc1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMzNTY2MzU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW5mbywuYmFkZ2UtaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiMzYTg3YWQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW5mb1tocmVmXSwuYmFkZ2UtaW5mb1tocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMyZDY5ODc7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW52ZXJzZSwuYmFkZ2UtaW52ZXJzZXtiYWNrZ3JvdW5kLWNvbG9yOiMzMzMzMzM7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIubGFiZWwtaW52ZXJzZVtocmVmXSwuYmFkZ2UtaW52ZXJzZVtocmVmXXtiYWNrZ3JvdW5kLWNvbG9yOiMxYTFhMWE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZXttYXgtd2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowO30iICBcCisgICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGV7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjE4cHg7fS50YWJsZSB0aCwudGFibGUgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZHtwYWRkaW5nOjhweDtsaW5lLWhlaWdodDoxOHB4O3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgIiAgICAgICBcCisgICIjZGRkZGRkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGh7Zm9udC13ZWlnaHQ6Ym9sZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGhlYWQgdGh7dmVydGljYWwtYWxpZ246Ym90dG9tO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgY2FwdGlvbit0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY2FwdGlvbit0aGVhZCB0cjpmaXJzdC1jaGlsZCB0ZCwudGFibGUgIiAgICAgICAgICBcCisgICJjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlICIgICAgICAgICAgICAgICBcCisgICJ0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICBcCisgICJ0ZHtib3JkZXItdG9wOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGJvZHkrdGJvZHl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtY29uZGVuc2VkIHRoLC50YWJsZS1jb25kZW5zZWQgdGR7cGFkZGluZzo0cHggNXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIjZGRkZGRkO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTsqYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlZDtib3JkZXItbGVmdDowOy13ZWJraXQtYm9yZGVyLSIgICAgICBcCisgICJyYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7fS50YWJsZS1ib3JkZXJlZCB0aCwudGFibGUtYm9yZGVyZWQgIiAgICAgICBcCisgICJ0ZHtib3JkZXItbGVmdDoxcHggc29saWQgI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0Ym9keSB0cjpmaXJzdC1jaGlsZCAiICBcCisgICJ0aCwudGFibGUtYm9yZGVyZWQgY2FwdGlvbit0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGhlYWQgIiAgICAgICAgICAgICBcCisgICJ0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICBcCisgICJjb2xncm91cCt0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZCwudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICBcCisgICJ0aCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkICIgICAgICBcCisgICJ0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICAgICBcCisgICJ0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZDpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLSIgICAgICBcCisgICJyYWRpdXMtdG9wbGVmdDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgIiAgICAgICAgICAgICAgICBcCisgICJ0Ym9keTpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci0iICAgICBcCisgICJyYWRpdXMtdG9wcmlnaHQ6NHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgICAgICBcCisgICJ0Ym9keTpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAgMCAwICIgICAgICAgICAgICAgICAgICAgICBcCisgICI0cHg7LW1vei1ib3JkZXItcmFkaXVzOjAgMCAwIDRweDtib3JkZXItcmFkaXVzOjAgMCAwICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICI0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtIiAgICBcCisgICJib3R0b21sZWZ0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgIiBcCisgICJ0cjpsYXN0LWNoaWxkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDstbW96LSIgICAgICBcCisgICJib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUtc3RyaXBlZCB0Ym9keSB0cjpudGgtY2hpbGQob2RkKSB0ZCwudGFibGUtc3RyaXBlZCB0Ym9keSB0cjpudGgtY2hpbGQob2RkKSAiICAgICAgICAgICAgICBcCisgICJ0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmOWY5Zjk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIudGFibGUgdGJvZHkgdHI6aG92ZXIgdGQsLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRoe2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTt9XG4iICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjF7ZmxvYXQ6bm9uZTt3aWR0aDo0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjN7ZmxvYXQ6bm9uZTt3aWR0aDoyMDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjR7ZmxvYXQ6bm9uZTt3aWR0aDoyODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjV7ZmxvYXQ6bm9uZTt3aWR0aDozNjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjZ7ZmxvYXQ6bm9uZTt3aWR0aDo0NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3Bhbjd7ZmxvYXQ6bm9uZTt3aWR0aDo1MjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3Bhbjh7ZmxvYXQ6bm9uZTt3aWR0aDo2MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3Bhbjl7ZmxvYXQ6bm9uZTt3aWR0aDo2ODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjEwe2Zsb2F0Om5vbmU7d2lkdGg6NzY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjExe2Zsb2F0Om5vbmU7d2lkdGg6ODQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjEye2Zsb2F0Om5vbmU7d2lkdGg6OTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjEze2Zsb2F0Om5vbmU7d2lkdGg6MTAwNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE0e2Zsb2F0Om5vbmU7d2lkdGg6MTA4NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE1e2Zsb2F0Om5vbmU7d2lkdGg6MTE2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE2e2Zsb2F0Om5vbmU7d2lkdGg6MTI0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE3e2Zsb2F0Om5vbmU7d2lkdGg6MTMyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE4e2Zsb2F0Om5vbmU7d2lkdGg6MTQwNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjE5e2Zsb2F0Om5vbmU7d2lkdGg6MTQ4NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIwe2Zsb2F0Om5vbmU7d2lkdGg6MTU2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIxe2Zsb2F0Om5vbmU7d2lkdGg6MTY0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIye2Zsb2F0Om5vbmU7d2lkdGg6MTcyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjIze2Zsb2F0Om5vbmU7d2lkdGg6MTgwNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ0YWJsZSAuc3BhbjI0e2Zsb2F0Om5vbmU7d2lkdGg6MTg4NHB4O21hcmdpbi1sZWZ0OjA7fSIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODQ1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNTQ1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjdGltZT4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0ZmlsbDsKK3VzaW5nIHN0ZDo6c2V0dzsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEphdmEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2phdmFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiZWFuX3N0eWxlXyA9IGZhbHNlOworICAgIGFuZHJvaWRfc3R5bGVfID0gZmFsc2U7CisgICAgcHJpdmF0ZV9tZW1iZXJzXyA9IGZhbHNlOworICAgIG5vY2FtZWxfc3R5bGVfID0gZmFsc2U7CisgICAgZnVsbGNhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGFuZHJvaWRfbGVnYWN5XyA9IGZhbHNlOworICAgIHNvcnRlZF9jb250YWluZXJzXyA9IGZhbHNlOworICAgIGphdmE1XyA9IGZhbHNlOworICAgIHJldXNlX29iamVjdHNfID0gZmFsc2U7CisgICAgdXNlX29wdGlvbl90eXBlXyA9IGZhbHNlOworICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSBmYWxzZTsKKyAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gZmFsc2U7CisgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSBmYWxzZTsKKyAgICB1bnNhZmVfYmluYXJpZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYmVhbnMiKSA9PSAwKSB7CisgICAgICAgIGJlYW5fc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5kcm9pZCIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcml2YXRlLW1lbWJlcnMiKSA9PSAwKSB7CisgICAgICAgIHByaXZhdGVfbWVtYmVyc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2NhbWVsIikgPT0gMCkgeworICAgICAgICBub2NhbWVsX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImZ1bGxjYW1lbCIpID09IDApIHsKKyAgICAgICAgZnVsbGNhbWVsX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWRfbGVnYWN5IikgPT0gMCkgeworICAgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzb3J0ZWRfY29udGFpbmVycyIpID09IDApIHsKKyAgICAgICAgc29ydGVkX2NvbnRhaW5lcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiamF2YTUiKSA9PSAwKSB7CisgICAgICAgIGphdmE1XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJldXNlLW9iamVjdHMiKSA9PSAwKSB7CisgICAgICAgIHJldXNlX29iamVjdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib3B0aW9uX3R5cGUiKSA9PSAwKSB7CisgICAgICAgIHVzZV9vcHRpb25fdHlwZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zIikgPT0gMCkgeworICAgICAgICByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImdlbmVyYXRlZF9hbm5vdGF0aW9ucyIpID09IDApIHsKKyAgICAgICAgaWYoIGl0ZXItPnNlY29uZC5jb21wYXJlKCJ1bmRhdGVkIikgPT0gMCkgeworICAgICAgICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYoaXRlci0+c2Vjb25kLmNvbXBhcmUoInN1cHByZXNzIikgPT0gMCkgeworICAgICAgICAgIHN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdCArICI9IiArIGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bnNhZmVfYmluYXJpZXMiKSA9PSAwKSB7CisgICAgICAgIHVuc2FmZV9iaW5hcmllc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChqYXZhNV8pIHsKKyAgICAgIGFuZHJvaWRfbGVnYWN5XyA9IHRydWU7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9IChiZWFuX3N0eWxlXyA/ICJnZW4tamF2YWJlYW4iIDogImdlbi1qYXZhIik7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCA9IHRydWUpOworICBzdGQ6OnN0cmluZyBnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zY2hlbWVfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvc3RyZWFtJiBvdXQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3N0cmVhbSYgb3V0KTsKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworCisgIGVudW0gaXNzZXRfdHlwZSB7IElTU0VUX05PTkUsIElTU0VUX1BSSU1JVElWRSwgSVNTRVRfQklUU0VUIH07CisgIGlzc2V0X3R5cGUgbmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlID0gTlVMTCk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBqYXZhX3N1cHByZXNzaW9ucygpOworICBzdGQ6OnN0cmluZyBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBjb21tZW50ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgYXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2FyZ3VtZW50X2xpc3QodF9mdW5jdGlvbiogdGZ1bmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19lbnVtKCk7CisgIH0KKworICBib29sIGlzX2RlcHJlY2F0ZWQoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgYW5ub3RhdGlvbnMpIHsKKyAgICByZXR1cm4gYW5ub3RhdGlvbnMuZmluZCgiZGVwcmVjYXRlZCIpICE9IGFubm90YXRpb25zLmVuZCgpOworICB9CisKKyAgYm9vbCBpc19lbnVtX3NldCh0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKCFzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICAgIHJldHVybiBlbGVtX3R5cGUtPmlzX2VudW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc19lbnVtX21hcCh0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKCFzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBrZXlfdHlwZSA9IGdldF90cnVlX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpOworICAgICAgICByZXR1cm4ga2V5X3R5cGUtPmlzX2VudW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW5uZXJfZW51bV90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9IGdldF90cnVlX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpOworICAgICAgcmV0dXJuIHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgKyAiLmNsYXNzIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICByZXR1cm4gdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSkgKyAiLmNsYXNzIjsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKworICBib29sIGJlYW5fc3R5bGVfOworICBib29sIGFuZHJvaWRfc3R5bGVfOworICBib29sIHByaXZhdGVfbWVtYmVyc187CisgIGJvb2wgbm9jYW1lbF9zdHlsZV87CisgIGJvb2wgZnVsbGNhbWVsX3N0eWxlXzsKKyAgYm9vbCBhbmRyb2lkX2xlZ2FjeV87CisgIGJvb2wgamF2YTVfOworICBib29sIHNvcnRlZF9jb250YWluZXJzXzsKKyAgYm9vbCByZXVzZV9vYmplY3RzXzsKKyAgYm9vbCB1c2Vfb3B0aW9uX3R5cGVfOworICBib29sIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKKyAgYm9vbCBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfOworICBib29sIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfOworICBib29sIHVuc2FmZV9iaW5hcmllc187CisKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX3N1cHByZXNzaW9ucygpIHsKKyAgcmV0dXJuICJAU3VwcHJlc3NXYXJuaW5ncyh7XCJjYXN0XCIsIFwicmF3dHlwZXNcIiwgXCJzZXJpYWxcIiwgXCJ1bmNoZWNrZWRcIiwgXCJ1bnVzZWRcIn0pXG4iOworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgeworICByZXR1cm4gIkBvcmcuYXBhY2hlLnRocmlmdC5hbm5vdGF0aW9uLk51bGxhYmxlIjsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIEphdmEKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQodGVudW0tPmFubm90YXRpb25zXyk7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfZW51bSk7CisgIH0KKworICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgIGluZGVudChmX2VudW0pIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZW51bSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOworICAgIGlmICh0aGlzLT5pc19kZXByZWNhdGVkKCgqY19pdGVyKS0+YW5ub3RhdGlvbnNfKSkgeworICAgICAgaW5kZW50KGZfZW51bSkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpIjsKKyAgfQorICBmX2VudW0gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICcvJyArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShwcm9ncmFtX25hbWVfKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvbnN0YW50cy5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGZfY29uc3RzIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB1bnNvcnRlZF9maWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHVuc29ydGVkX2ZpZWxkczsKKyAgICBzdGQ6OnNvcnQoZmllbGRzLmJlZ2luKCksIGZpZWxkcy5lbmQoKSwgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgICAgaWYgKGlzX2VudW1fbWFwKHR5cGUpKSB7CisgICAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKGlzX2VudW1fc2V0KHR5cGUpKSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeCA9IHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKyAgICBpZiAobmFtZXNwYWNlX3ByZWZpeC5sZW5ndGgoKSA+IDApIHsKKyAgICAgIG5hbWVzcGFjZV9wcmVmaXggKz0gIi4iOworICAgIH0KKyAgICByZW5kZXIgPDwgbmFtZXNwYWNlX3ByZWZpeCA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlCisgKiBpbXBsZW1lbnRvci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiAiOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBkZWZhdWx0X3ZhbHVlID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIik7IiA8PCBlbmRsOworICAgICAgZGVmYXVsdF92YWx1ZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGRlZmF1bHRfdmFsdWUgPT0gZmFsc2UpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKG90aGVyKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSAiY29uc3RydWN0b3JzIiBmb3IgZWFjaCBmaWVsZAorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSk7IiA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLmNsb25lKCkpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgYm9vbCBpc19kZXByZWNhdGVkID0gdGhpcy0+aXNfZGVwcmVjYXRlZChmaWVsZC0+YW5ub3RhdGlvbnNfKTsKKworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoYnVmZmVyIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBqYXZhLm5pby5CeXRlQnVmZmVyIGIgPSBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBiID09IG51bGwgPyBudWxsIDogYi5hcnJheSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKQorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoamF2YS5uaW8uQnl0ZUJ1ZmZlcilnZXRGaWVsZFZhbHVlKCkpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKGJ5dGVbXSB2YWx1ZSkgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZXRGaWVsZF8gPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgX0ZpZWxkcyBlbnVtRm9ySWQoc2hvcnQgaWQpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhpZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgdGhyb3dzIGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7CisgICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCisgICAgICAgICAgICAgICAgICJpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGZpZWxkKSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgorICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBudWxsOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAib3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArICIKKyAgICAgICAgICAgICAgICAgInNldEZpZWxkXyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgdHVwbGVTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgImlwcm90LCBzaG9ydCBmaWVsZElEKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElEKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCisgICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJDb3VsZG4ndCBmaW5kIGEgZmllbGQgd2l0aCBmaWVsZCBpZCBcIiArIGZpZWxkSUQpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSAiCisgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCisgICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVxdWFsaXR5CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICIKKyAgICAgICAgICAgICAgICAgImdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksICIKKyAgICAgICAgICAgICAgICAgIm90aGVyLmdldFNldEZpZWxkKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksICIKKyAgICAgICAgICAgICAgICAgIm90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5PYmplY3Q+IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuT2JqZWN0PigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgbGlzdC5hZGQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgICBsaXN0LmFkZCgoKG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQodmFsdWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKKworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQodHN0cnVjdC0+YW5ub3RhdGlvbnNfKTsKKworICBpZiAoIWluX2NsYXNzICYmICFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3V0KTsKKyAgfQorCisgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICIuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IjsKKworICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKKyAgICBvdXQgPDwgIiwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIjsKKyAgfQorCisgIG91dCA8PCAiICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2NoZW1lX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoYmVhbl9zdHlsZV8gfHwgcHJpdmF0ZV9tZW1iZXJzXykgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICB9CisgICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKG91dCwgdHN0cnVjdCk7CisgIH0KKworICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIGlzc2V0IGRhdGEKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOworCisgICAgaW50IGkgPSAwOworICAgIGludCBvcHRpb25hbHMgPSAwOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG9wdGlvbmFscysrOworICAgICAgfQorICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpIDw8ICIgPSAiIDw8IGkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBwcmltaXRpdmVUeXBlOworICAgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJnByaW1pdGl2ZVR5cGUpKSB7CisgICAgY2FzZSBJU1NFVF9OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IHByaW1pdGl2ZVR5cGUgPDwgIiBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGphdmEudXRpbC5CaXRTZXQgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IGphdmEudXRpbC5CaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChvcHRpb25hbHMgPiAwKSB7CisgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyaW5nID0gInByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7IjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgICBvdXRwdXRfc3RyaW5nID0gb3V0cHV0X3N0cmluZyArICJfRmllbGRzLiIgKyBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLCI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IG91dHB1dF9zdHJpbmcuc3Vic3RyKDAsIG91dHB1dF9zdHJpbmcubGVuZ3RoKCkgLSAxKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKKyAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKCptX2l0ZXIpLCAiIik7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gY29weSBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3RoZXIuX19pc3NldF9iaXRmaWVsZDsiIDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5vcihvdGhlci5fX2lzc2V0X2JpdF92ZWN0b3IpOyIgPDwgZW5kbDsKKyAgICBicmVhazsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvdXQpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogZ2VuZXJhdGVzIHBhcmNlbGFibGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB0bmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBzdHJpbmcgYml0c2V0UHJpbWl0aXZlVHlwZSA9ICIiOworICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKKyAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVCeXRlKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoX19pc3NldF9iaXRmaWVsZCkuaW50VmFsdWUoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxvbmcoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBicmVhazsKKyAgY2FzZSBJU1NFVF9CSVRTRVQ6CisgICAgaW5kZW50KG91dCkgPDwgIi8vQml0U2V0IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTZXJpYWxpemFibGUoX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVBhcmNlbGFibGUoIiA8PCBuYW1lIDw8ICIsIGZsYWdzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0eXBlX25hbWUodCkgPT0gImZsb2F0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUZsb2F0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCA/ICIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkgOiAtMSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICBpZiAoKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVR5cGVkTGlzdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTWFwKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIhPW51bGwgPyAxIDogMCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCkgeyAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZUFycmF5KCIgPDwgbmFtZSA8PCAiLmFycmF5KCksICIgPDwgbmFtZSA8PCAiLnBvc2l0aW9uKCkgKyAiCisgICAgICAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIi5hcnJheU9mZnNldCgpLCAiIDw8IG5hbWUgPDwgIi5saW1pdCgpIC0gIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIucG9zaXRpb24oKSApOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KG5ldyBTaG9ydCgiIDw8IG5hbWUgPDwgIikuaW50VmFsdWUoKSk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiID8gMSA6IDApOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIihhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIHJlYWQgaW4gdGhlIHJlcXVpcmVkIGJpdGZpZWxkCisgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJmJpdHNldFByaW1pdGl2ZVR5cGUpKSB7CisgIGNhc2UgSVNTRVRfTk9ORToKKyAgICBicmVhazsKKyAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgaW5kZW50KG91dCkgPDwgIi8vcHJpbWl0aXZlIGJpdGZpZWxkIG9mIHR5cGU6ICIgPDwgYml0c2V0UHJpbWl0aXZlVHlwZSA8PCBlbmRsOworICAgIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJieXRlIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkQnl0ZSgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJpbnQiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yID0gKGphdmEudXRpbC5CaXRTZXQpIGluLnJlYWRTZXJpYWxpemFibGUoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKyAgLy8gcmVhZCBhbGwgdGhlIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwcmVmaXggPSAidGhpcy4iICsgbmFtZTsKKworICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRQYXJjZWxhYmxlKCIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIuZmluZEJ5VmFsdWUoaW4ucmVhZEludCgpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgIHRfbGlzdCogbGlzdCA9ICh0X2xpc3QqKXQ7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0LT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImluLnJlYWRUeXBlZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAiLkNSRUFUT1IpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkTGlzdCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHQsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiBpbi5yZWFkTWFwKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lKHQpID09ICJmbG9hdCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEZsb2F0KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlKiBidCA9ICh0X2Jhc2VfdHlwZSopdDsKKyAgICAgIGlmIChidC0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKGluLnJlYWRJbnQoKT09MSkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKGluLmNyZWF0ZUJ5dGVBcnJheSgpKTsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoYnQtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEludCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKGluLnJlYWRJbnQoKT09MSk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZERvdWJsZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRTdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8IiA8PCB0bmFtZQorICAgICAgICAgICAgICA8PCAiPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUgPDwgIj4oKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiW10gbmV3QXJyYXkoaW50IHNpemUpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICJbc2l6ZV07IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lCisgICAgICAgICAgICAgIDw8ICIgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdG5hbWUgPDwgIihpbik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCB0aGF0KSB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzID09IHRoYXQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7CisgICAgc3RyaW5nIHVuZXF1YWw7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgorICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IGludCBNVUwgPSA4MTkxOyAvLyBIYXNoQ29kZSBtdWx0aXBsaWVyCisgIGNvbnN0IGludCBCX1lFUyA9IDEzMTA3MTsKKyAgY29uc3QgaW50IEJfTk8gPSA1MjQyODc7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpbnQgaGFzaENvZGUgPSAxOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICgoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKQorICAgICAgICAgICAgICAgICAgPDwgIikgPyAiIDw8IEJfWUVTIDw8ICIgOiAiIDw8IEJfTk8gPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikgKyAiKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmhhc2hDb2RlKCk7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgKCgiIDw8IG5hbWUgPDwgIikgPyAiCisgICAgICAgICAgICAgICAgICAgIDw8IEJfWUVTIDw8ICIgOiAiIDw8IEJfTk8gPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArIChpbnQpICgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5oYXNoQ29kZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IGEgc3RydWN0IGZpZWxkIGNhbm5vdCBiZSB2b2lkIik7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJjb21waWxlciBlcnJvcjogdGhlIGZvbGxvd2luZyBiYXNlIHR5cGUgaGFzIG5vIGhhc2hjb2RlIGdlbmVyYXRvcjogIiArCisgICAgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgIiA8PCBuYW1lIDw8ICIuaGFzaENvZGUoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hDb2RlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gamF2YS5sYW5nLkJvb2xlYW4udmFsdWVPZigiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQorICAgICAgICAgICAgICAgIDw8ICIpLmNvbXBhcmVUbyhvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iCisgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUoaXByb3QpLnJlYWQoaXByb3QsIHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmIChiZWFuX3N0eWxlXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgJiYgISgodF9zdHJ1Y3QqKXR5cGUpLT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIi52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInNjaGVtZShvcHJvdCkud3JpdGUob3Byb3QsIHRoaXMpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUob3Byb3QpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8ICh0eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgY29uc3QgYm9vbCBpc19iaW5hcnkgPSB0eXBlLT5pc19iaW5hcnkoKTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaWYgKGlzX2JpbmFyeSkgeworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKChieXRlW10pdmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOworICBpZiAoaXNfYmluYXJ5KSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgIiA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKQorICAgICAgICAgICAgICA8PCAiIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaXNzZXRfdHlwZSBpc3NldFR5cGUgPSBuZWVkc19pc3NldCh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisgICAgYm9vbCBvcHRpb25hbCA9IHVzZV9vcHRpb25fdHlwZV8gJiYgZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KKyAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjxJbnRlZ2VyPiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24ubm9uZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGdldCIgPDwgY2FwX25hbWU7CisgICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IDAgOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCisgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb248amF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIDw8ICI+PiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJpdGVyYXRvcigpIHsiKSA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8IiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IG51bGwgOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLml0ZXJhdG9yKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBBZGQgdG8gc2V0IG9yIGxpc3QsIGNyZWF0ZSBpZiB0aGUgc2V0L2xpc3QgaXMgbnVsbAorICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGFkZCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOworICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlKSA8PCAiIGVsZW0pIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZTsKKyAgICAgIGlmIChpc19lbnVtX3NldCh0eXBlKSkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuYWRkKGVsZW0pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIC8vIFB1dCB0byBtYXAKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7CisgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgICAgaWYgKGlzX2VudW1fbWFwKHR5cGUpKSB7CisgICAgICAgIGNvbnN0cnVjdG9yX2FyZ3MgPSBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0eXBlKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KGtleSwgdmFsKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZSgiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IG51bGwgOiAiIDw8IGZpZWxkX25hbWUgPDwgIi5hcnJheSgpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IGZpZWxkX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uPCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICI+IjsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgICAgICBvdXQgPDwgIiBpcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIgZ2V0IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy5pc1NldCIgPDwgY2FwX25hbWUgPDwgIigpKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgb3V0IDw8ICIgaXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiIGdldCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgICAgb3V0IDw8ICJ2b2lkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoYnl0ZVtdICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyAoamF2YS5uaW8uQnl0ZUJ1ZmZlciludWxsIjsKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgOiBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiIDogamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiLmNsb25lKCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB0aGlzOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgIG91dCA8PCAidm9pZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgICAgfQorICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8ICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpID8gKGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpICsgIiAiKSA6ICIiKQorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICF1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkX25hbWU7CisgICAgfQorICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCwgIiIpOworICAgIGlmICghYmVhbl9zdHlsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoaXNzZXRUeXBlID09IElTU0VUX1BSSU1JVElWRSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsICIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpCisgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgIgorICAgICAgICAgICAgICAgICAgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHNiID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX3NldCgpKQorICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X3NldCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX2xpc3QoKSkKKyAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9saXN0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSktPmlzX2JpbmFyeSgpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KKyAqIGZpZWxkTmFtZSBtYXBwaW5nCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpCisgICAgICA8PCAicHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgIgorICAgICAgICAgICAgICAgICAiamF2YS51dGlsLkVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQb3B1bGF0ZSBtYXAKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJ0bXBNYXAucHV0KF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgPDwgIiwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKKworICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgIH0KKworICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKKyAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXAgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLmNsYXNzLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKKyAgICAgIHJldHVybiAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3ICIKKyAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLiIKKyAgICAgICAgICAgICAgICAgICAiU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlNldE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpCisgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCAiCisgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEoIgorICAgICAgICAgICAgICAgIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOworICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7CisgICAgfQorICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzZXJ2aWNlX25hbWVfKSArICIuamF2YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zZXJ2aWNlXyk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiIC5Bc3luY0lmYWNlIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgQXN5bmNJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSAib3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnQiOworICB9IGVsc2UgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnRGYWN0b3J5PENsaWVudD4geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKHByb3QsIHByb3QpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHNlcCA9ICJfIjsKKyAgICBzdHJpbmcgamF2YW5hbWUgPSBmdW5uYW1lOworICAgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgICBzZXAgPSAiIjsKKyAgICAgIGphdmFuYW1lID0gYXNfY2FtZWxfY2FzZShmdW5uYW1lKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmQiIDw8IHNlcCA8PCBqYXZhbmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2IiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZCIpICsgc2VwICsgamF2YW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgY29uc3Qgc3RyaW5nIHNlbmRCYXNlTmFtZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZEJhc2VPbmV3YXkiIDogInNlbmRCYXNlIjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgc2VuZEJhc2VOYW1lIDw8ICIoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBhcmdzKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdiIpICsgc2VwICsgamF2YW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlY2VpdmVCYXNlKHJlc3VsdCwgXCIiIDw8IGZ1bm5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY0NsaWVudCBleHRlbmRzICIgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIEFzeW5jSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRmFjdG9yeSBtZXRob2QKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50RmFjdG9yeTxBc3luY0NsaWVudD4geyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgRmFjdG9yeShvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnkpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMuY2xpZW50TWFuYWdlciA9IGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEFzeW5jQ2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHJldHVybiBuZXcgQXN5bmNDbGllbnQocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXAgPSAiXyI7CisgICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKKyAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgICAgc2VwID0gIiI7CisgICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoamF2YW5hbWUpOworICAgIH0KKyAgICB0X3R5cGUqIHJldF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBmdW5jbGFzc25hbWUgPSBmdW5uYW1lICsgIl9jYWxsIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGFyZ3NfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIHJlc3VsdF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgLy8gTWFpbiBtZXRob2QgYm9keQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIGNoZWNrUmVhZHkoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICIgPDwgZnVuY2xhc3NuYW1lIDw8ICIgbWV0aG9kX2NhbGwgPSBuZXcgIiArIGZ1bmNsYXNzbmFtZSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIFRBc3luY01ldGhvZCBvYmplY3QgZm9yIHRoaXMgZnVuY3Rpb24gY2FsbAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiICsgZnVuY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGw8IgorICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIHRydWUpICsgIj4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIE1lbWJlciB2YXJpYWJsZXMKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlICIgKyB0eXBlX25hbWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIE5PVEUgc2luY2Ugd2UgdXNlIGEgbmV3IENsaWVudCBpbnN0YW5jZSB0byBkZXNlcmlhbGl6ZSwgbGV0J3Mga2VlcCBzZXFpZCB0byAwIGZvciBub3cKKyAgICAvLyBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgaW50IHNlcWlkOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgZnVuY2xhc3NuYW1lICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gQXNzaWduIG1lbWJlciB2YXJpYWJsZXMKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9ICIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBTZXJpYWxpemUgcmVxdWVzdAorICAgIC8vIE5PVEUgd2UgYXJlIGxlYXZpbmcgc2VxaWQgYXMgMCwgZm9yIG5vdyAoc2VlIGFib3ZlKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiXCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLiIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikgPDwgIiwgMCkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc19uYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBSZXR1cm4gbWV0aG9kCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIHR5cGVfbmFtZShyZXRfdHlwZSwgdHJ1ZSkgKyAiIGdldFJlc3VsdCgpIHRocm93cyAiOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkIVwiKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3ICIKKyAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICBpZiAocmV0X3R5cGUtPmlzX3ZvaWQoKSkgeyAvLyBOQjogSW5jbHVkZXMgb25ld2F5cyB3aGljaCBhbHdheXMgcmV0dXJuIHZvaWQuCisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAobmV3IENsaWVudChwcm90KSkucmVjdiIgKyBzZXAgKyBqYXZhbmFtZSArICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIEFzeW5jQ2xpZW50CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlUHJvY2Vzc29yPEk+IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvcjxJPiI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvcjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLnNsZjRqLkxvZ2dlciBfTE9HR0VSID0gb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4oKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgUHJvY2Vzc29yKEkgaWZhY2UsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBJZmFjZT4gamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UHJvY2Vzc01hcChqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc01hcC5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBwcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlQXN5bmNQcm9jZXNzb3I8ST4iOworICB9IGVsc2UgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3I8ST4iOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Byb2Nlc3NvcjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyAiCisgICAgICAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLnNsZjRqLkxvZ2dlciBfTE9HR0VSID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBc3luY1Byb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4oKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsPz4+IGdldFByb2Nlc3NNYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzTWFwLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHByb2Nlc3NNYXA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOworICB9CisKKyAgc3RyaW5nIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKTsKKworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIiwgIiA8PCByZXN1bHR0eXBlIDw8ICI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBhcmdzbmFtZSA8PCAiIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBpbnQgc2VxaWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4oKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25Db21wbGV0ZSgiIDw8IHJlc3VsdHR5cGUgPDwgIiBvKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBvOyIgPDwgZW5kbDsKKyAgICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLCByZXN1bHQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWSxzZXFpZCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiX0xPR0dFUi5lcnJvcihcIlRUcmFuc3BvcnRFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBlKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib25FcnJvcihlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25FcnJvcihqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKSB7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIlRUcmFuc3BvcnRFeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmIuY2xvc2UoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIGluc2lkZSBvbmV3YXkgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImJ5dGUgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXphYmxlIG1zZzsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaWYgKHhfaXRlciA9PSB4Y2VwdGlvbnMuYmVnaW4oKSkKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBzdHJpbmcgdHlwZSA9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8ICJpZiAoZSBpbnN0YW5jZW9mICIgPDwgdHlwZSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZSA8PCAiKSBlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUobmFtZSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUQXBwbGljYXRpb25FeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbillOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiBpbnNpZGUgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtc2cgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLG1zZyxtc2dUeXBlLHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGV4KSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBfTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGV4KTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBmYi5jbG9zZSgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBzdGFydChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IiA8PCByZXN1bHR0eXBlCisgICAgICAgICAgICAgICAgICAgICA8PCAiPiByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2UuIiA8PCBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoIWZpcnN0KQorICAgIGZfc2VydmljZV8gPDwgIiwiOworICBmX3NlcnZpY2VfIDw8ICJyZXN1bHRIYW5kbGVyIjsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7CisgIH0KKworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgocmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18pID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgcmVzdWx0bmFtZSA8PCAiIGdldFJlc3VsdChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBDbG9zZSBjbGFzcworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGlmIChoYXNfbWV0YWRhdGEpIHsKKyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgImlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgaXByb3QucmVhZEkzMigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqCisgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGlmIChpc19lbnVtX3NldCh0dHlwZSkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIC8vIGNvbnN0cnVjdCB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkgaS5lLiB3aXRoIGFwcHJvcHJpYXRlIHNpemUvdHlwZQorICBpZiAoaXNfZW51bV9zZXQodHR5cGUpIHx8IGlzX2VudW1fbWFwKHR0eXBlKSkgeworICAgIG91dCA8PCAiKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18gJiYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpKSB7CisgICAgLy8gVHJlZVNldCBhbmQgVHJlZU1hcCBkb24ndCBoYXZlIGFueSBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBhIGNhcGFjaXR5IGFzIGFuIGFyZ3VtZW50CisgICAgb3V0IDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsIGhhc19tZXRhZGF0YSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBrZXkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBrZXkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZ2YWwuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsIGhhc19tZXRhZGF0YSk7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBlbGVtIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCksIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoc3RydWN0LiIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgcHJlZml4IDw8ICIuZW50cnlTZXQoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PCAiIDogIgorICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgICh2b2lkKW1hcDsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gamF2YS51dGlsLkhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX25hbWVzcGFjZSkgeworICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgaWYgKGluX2luaXQpIHsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0bWFwKSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1NYXAiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlTWFwIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaE1hcCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuTWFwIjsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgaWYgKGluX2luaXQpIHsKKyAgICAgIGlmIChpc19lbnVtX3NldCh0c2V0KSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1TZXQiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlU2V0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaFNldCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuU2V0IjsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkFycmF5TGlzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuTGlzdCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAoKHByb2dyYW0gIT0gTlVMTCkgJiYgKChwcm9ncmFtICE9IHByb2dyYW1fKSB8fCBmb3JjZV9uYW1lc3BhY2UpKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPworICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlZvaWQiIDogInZvaWQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImphdmEubmlvLkJ5dGVCdWZmZXIiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Cb29sZWFuIiA6ICJib29sZWFuIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLkJ5dGUiIDogImJ5dGUiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLlNob3J0IiA6ICJzaG9ydCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuSW50ZWdlciIgOiAiaW50Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Mb25nIiA6ICJsb25nIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Eb3VibGUiIDogImRvdWJsZSIpOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBpbml0IFdoZXRoZXIgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgY29tbWVudCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXN1bHQgKz0gamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgKyAiICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJlc3VsdCArPSAiOyI7CisgIGlmIChjb21tZW50KSB7CisgICAgcmVzdWx0ICs9ICIgLy8gIjsKKyAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgcmVzdWx0ICs9ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZWQiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIGZuX25hbWUgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgIH0KKyAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd2b2lkIG5hbWUoYXJncywgcmVzdWx0SGFuZGxlciknCisgKgorICogQHBhcmFtcyB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKKyAgaWYgKHVzZV9iYXNlX21ldGhvZCkgeworICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOworICB9CisgIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7CisKKyAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSBwcmVmaXggKyAidm9pZCAiICsgZm5fbmFtZSArICIoIiArIGFyZ2xpc3QgKyAiKSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgKHZvaWQpdXNlX2Jhc2VfbWV0aG9kOworICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gIiI7CisgIGlmICh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwKSB7CisgICAgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QodGZ1bmMtPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfdHlwZXMpICsgIiwgIjsKKyAgfQorCisgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgYXJnbGlzdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiOworICAgIGFyZ2xpc3QgKz0gdHlwZV9uYW1lKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKSArICI+ICI7CisgIH0KKyAgYXJnbGlzdCArPSAicmVzdWx0SGFuZGxlciI7CisKKyAgcmV0dXJuIGFyZ2xpc3Q7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcykgeworICAodm9pZCl0ZnVuY3Q7CisgICh2b2lkKXR0eXBlOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoIWZpcnN0KSB7CisgICAgcmVzdWx0ICs9ICIsICI7CisgIH0KKyAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IjsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmdW5jdC0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSkgKyAiPiAiOworICB9CisgIHJlc3VsdCArPSAicmVzdWx0SGFuZGxlciI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBKYXZhIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBUYWtlcyBhIG5hbWUgYW5kIHByb2R1ZXMgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUgZnJvbSBpdAorICoKKyAqIEBwYXJhbSBmcm9tTmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUKKyAqIEByZXR1cm4gVGhlIHByb2R1Y2VkIGlkZW50aWZpZXIKKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICAvLyBpZiBhbnkgZnVydGhlciBydWxlcyBhcHBseSB0byBzb3VyY2UgZmlsZSBuYW1lcyBpbiBKYXZhLCBtb2RpZnkgYXMgbmVjZXNzYXJ5CisgIHJldHVybiBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihmcm9tTmFtZSk7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCisgKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCkgeworICBzdGQ6OnN0cmluZyBuZXdfbmFtZTsKKyAgc2l6ZV90IGkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmIChuYW1lW2ldICE9ICdfJykKKyAgICAgIGJyZWFrOworICB9CisgIGlmICh1Y2ZpcnN0KSB7CisgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2krK10pOworICB9IGVsc2UgeworICAgIG5ld19uYW1lICs9IHRvbG93ZXIobmFtZVtpKytdKTsKKyAgfQorICBmb3IgKDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSA9PSAnXycpIHsKKyAgICAgIGlmIChpIDwgbmFtZS5zaXplKCkgLSAxKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2ldKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbmV3X25hbWUgKz0gbmFtZVtpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ld19uYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKworLyoqCisgKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXworICogYW5kL29yIGZ1bGxjYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuICJfIiArIG5hbWU7CisgIH0gZWxzZSBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgIHJldHVybiBhc19jYW1lbF9jYXNlKG5hbWUpOworICB9IGVsc2UgeworICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKworICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOworICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKKyAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDE7CisgIGVsc2UKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7CisKKyAgYm9vbCBjb3B5X2NvbnN0cnVjdF9jb250YWluZXI7CisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKWNvbnRhaW5lcjsKKyAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0bWFwLT5nZXRfdmFsX3R5cGUoKS0+aXNfYmFzZV90eXBlKCk7CisgIH0gZWxzZSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBjb250YWluZXItPmlzX2xpc3QoKSA/ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvcHlfY29uc3RydWN0X2NvbnRhaW5lciA9IGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCk7CisgIH0KKworICBpZiAoY29weV9jb25zdHJ1Y3RfY29udGFpbmVyKSB7CisgICAgLy8gZGVlcCBjb3B5IG9mIGJhc2UgdHlwZXMgY2FuIGJlIGRvbmUgbXVjaCBtb3JlIGVmZmljaWVudGx5IHRoYW4gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZQorICAgIC8vIGVsZW1lbnRzIG1hbnVhbGx5CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKKyAgaWYgKGlzX2VudW1fc2V0KGNvbnRhaW5lcikgfHwgaXNfZW51bV9tYXAoY29udGFpbmVyKSkgeworICAgIGNvbnN0cnVjdG9yX2FyZ3MgPSBpbm5lcl9lbnVtX3R5cGVfbmFtZShjb250YWluZXIpOworICB9IGVsc2UgaWYgKCEoc29ydGVkX2NvbnRhaW5lcnNfICYmIChjb250YWluZXItPmlzX21hcCgpIHx8IGNvbnRhaW5lci0+aXNfc2V0KCkpKSkgeworICAgIC8vIHVuc29ydGVkIGNvbnRhaW5lcnMgYWNjZXB0IGEgY2FwYWNpdHkgdmFsdWUKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gc291cmNlX25hbWUgKyAiLnNpemUoKSI7CisgIH0KKworICBpZiAoaXNfZW51bV9zZXQoY29udGFpbmVyKSkgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKKworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChqYXZhLnV0aWwuTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgPDwgc291cmNlX25hbWUgPDwgIi5lbnRyeVNldCgpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0VmFsdWUoKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlOworCisgICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJqYXZhLm5pby5CeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworICAodm9pZClkZXN0X25hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NjaGVtZV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgVFVQTEVfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciAiCisgICAgICAgICAgICAgICAgICJmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiOworICB9CisKKyAgb3V0IDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxqYXZhLmxhbmcuU3RyaW5nLCBfRmllbGRzPigpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgZm9yIChfRmllbGRzIGZpZWxkIDogamF2YS51dGlsLkVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIGlmIGl0IGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIkZpZWxkIFwiICsgZmllbGRJZCArICIKKyAgICAgICAgICAgICAgICAgIlwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGZpZWxkczsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9maWVsZE5hbWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIGphdmEubGFuZy5TdHJpbmcgZmllbGROYW1lKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWVsZE5hbWUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX2ZpZWxkTmFtZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3RfamF2YV9nZW5lcmF0b3I6Omlzc2V0X3R5cGUgdF9qYXZhX2dlbmVyYXRvcjo6bmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICBpZiAoY291bnQgPT0gMCkgeworICAgIHJldHVybiBJU1NFVF9OT05FOworICB9IGVsc2UgaWYgKGNvdW50IDw9IDY0KSB7CisgICAgaWYgKG91dFByaW1pdGl2ZVR5cGUgIT0gTlVMTCkgeworICAgICAgaWYgKGNvdW50IDw9IDgpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImJ5dGUiOworICAgICAgZWxzZSBpZiAoY291bnQgPD0gMTYpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gInNob3J0IjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDMyKQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJpbnQiOworICAgICAgZWxzZSBpZiAoY291bnQgPD0gNjQpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImxvbmciOworICAgIH0KKyAgICByZXR1cm4gSVNTRVRfUFJJTUlUSVZFOworICB9IGVsc2UgeworICAgIHJldHVybiBJU1NFVF9CSVRTRVQ7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKCFqYXZhNV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgZmllbGQtPmdldF9uYW1lKCksIHQsIGZpZWxkLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworCisgICAgICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgKHQtPmlzX2NvbnRhaW5lcigpIHx8IHQtPmlzX3N0cnVjdCgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY2xlYXIoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICB9IGVsc2UgeworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAorICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoZmFsc2UpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXQ7CisKKyAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KQorICAgICAgPDwgInByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlIiA8PCAoYW5kcm9pZF9sZWdhY3lfID8gIi5nZXRNZXNzYWdlKCkiIDogIiIpCisgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgImphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRyeSB7IiA8PCBlbmRsOworICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QpKSB7CisgICAgY2FzZSBJU1NFVF9OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSAiCisgICAgICAgICAgICAgICAgICAgICAic2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgorICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdF92ZWN0b3IgPSBuZXcgamF2YS51dGlsLkJpdFNldCgxKTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgInNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC4iCisgICAgICAgICAgICAgICAgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIGlmICghYmVhbl9zdHlsZV8pIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCAiCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzdHJ1Y3QuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgfHwgKGlzX3Jlc3VsdCAmJiAhbnVsbF9hbGxvd2VkKTsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIgorICAgICAgICAgICAgICAgICAgPDwgInN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInN0cnVjdC4iLCB0cnVlKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sIGlwcm90ID0gKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKKyAgaW50IG9wdGlvbmFsX2NvdW50ID0gMDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIG9wdGlvbmFsX2NvdW50Kys7CisgICAgfQorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKG9wdGlvbmFsX2NvdW50ID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGluY29taW5nLmdldCgiIDw8IGkgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3Quc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sIG9wcm90ID0gKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX29wdGlvbmFsID0gZmFsc2U7CisgIGludCBvcHRpb25hbF9jb3VudCA9IDA7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgb3B0aW9uYWxfY291bnQrKzsKKyAgICAgIGhhc19vcHRpb25hbCA9IHRydWU7CisgICAgfQorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgIH0KKyAgfQorICBpZiAoaGFzX29wdGlvbmFsKSB7CisgICAgaW5kZW50KG91dCkgPDwgImphdmEudXRpbC5CaXRTZXQgb3B0aW9uYWxzID0gbmV3IGphdmEudXRpbC5CaXRTZXQoKTsiIDw8IGVuZGw7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3B0aW9uYWxzLnNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsICIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOworICAgIGludCBqID0gMDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIlR1cGxlU2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyA8UyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lPiBTIHNjaGVtZSgiCisgICAgICA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3RvKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAob3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lLmNsYXNzLmVxdWFscyhwcm90by5nZXRTY2hlbWUoKSkgIgorICAgICAgPDwgIj8gU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgIgorICAgICAgPDwgIjogVFVQTEVfU0NIRU1FX0ZBQ1RPUlkiCisgICAgICA8PCAiKS5nZXRTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCkgeworICB0aW1lX3Qgc2Vjb25kcyA9IHRpbWUoTlVMTCk7CisgIHN0cnVjdCB0bSogbm93ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsKKyAgaW5kZW50KG91dCkgPDwgIkBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCh2YWx1ZSA9IFwiIiA8PCBhdXRvZ2VuX3N1bW1hcnkoKSA8PCAiXCIiOworICBpZiAodW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICIsIGRhdGUgPSBcIiIgPDwgKG5vdy0+dG1feWVhciArIDE5MDApIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKQorICAgICAgICAgICAgICAgIDw8IChub3ctPnRtX21vbiArIDEpIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKSA8PCBub3ctPnRtX21kYXkKKyAgICAgICAgICAgICAgICA8PCAiXCIpIiA8PCBlbmRsOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgamF2YSwKKyAgICAiSmF2YSIsCisgICAgIiAgICBiZWFuczogICAgICAgICAgIE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBhbmQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gdm9pZC5cbiIKKyAgICAiICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSAiCisgICAgInVzdWFsLlxuIgorICAgICIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKKyAgICAiICAgIGZ1bGxjYW1lbDogICAgICAgQ29udmVydCB1bmRlcnNjb3JlZF9hY2Nlc3Nvcl9vcl9zZXJ2aWNlX25hbWVzIHRvIGNhbWVsQ2FzZS5cbiIKKyAgICAiICAgIGFuZHJvaWQ6ICAgICAgICAgR2VuZXJhdGVkIHN0cnVjdHVyZXMgYXJlIFBhcmNlbGFibGUuXG4iCisgICAgIiAgICBhbmRyb2lkX2xlZ2FjeTogIERvIG5vdCB1c2UgamF2YS5pby5JT0V4Y2VwdGlvbih0aHJvd2FibGUpIChhdmFpbGFibGUgZm9yIEFuZHJvaWQgMi4zIGFuZCAiCisgICAgImFib3ZlKS5cbiIKKyAgICAiICAgIG9wdGlvbl90eXBlOiAgICAgV3JhcCBvcHRpb25hbCBmaWVsZHMgaW4gYW4gT3B0aW9uIHR5cGUuXG4iCisgICAgIiAgICByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBFbmFibGUgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBhbmQgbGV0IHRoZW0gcHJvcGFnYXRlIGZ1dGhlci4iCisgICAgIiAoRGVmYXVsdCBiZWhhdmlvciBpcyB0byBjYXRjaCBhbmQgbG9nIGl0LilcbiIKKyAgICAiICAgIGphdmE1OiAgICAgICAgICAgR2VuZXJhdGUgSmF2YSAxLjUgY29tcGxpYW50IGNvZGUgKGluY2x1ZGVzIGFuZHJvaWRfbGVnYWN5IGZsYWcpLlxuIgorICAgICIgICAgcmV1c2Utb2JqZWN0czogICBEYXRhIG9iamVjdHMgd2lsbCBub3QgYmUgYWxsb2NhdGVkLCBidXQgZXhpc3RpbmcgaW5zdGFuY2VzIHdpbGwgYmUgdXNlZCAiCisgICAgIihyZWFkIGFuZCB3cml0ZSkuXG4iCisgICAgIiAgICBzb3J0ZWRfY29udGFpbmVyczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVXNlIFRyZWVTZXQvVHJlZU1hcCBpbnN0ZWFkIG9mIEhhc2hTZXQvSGFzaE1hcCBhcyBhIGltcGxlbWVudGF0aW9uIG9mICIKKyAgICAic2V0L21hcC5cbiIKKyAgICAiICAgIGdlbmVyYXRlZF9hbm5vdGF0aW9ucz1bdW5kYXRlZHxzdXBwcmVzc106XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHVuZGF0ZWQ6IHN1cHByZXNzIHRoZSBkYXRlIGF0IEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnNcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3M6IHN1cHByZXNzIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgZW50aXJlbHlcbiIKKyAgICAiICAgIHVuc2FmZV9iaW5hcmllczogRG8gbm90IGNvcHkgQnl0ZUJ1ZmZlcnMgaW4gY29uc3RydWN0b3JzLCBnZXR0ZXJzLCBhbmQgc2V0dGVycy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3NDNjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMyOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEphdmEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2phdmFtZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9qYXZhbWVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YW1lOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qYXZhbWUiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgYm94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iCisgICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBKYXZhCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKworICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKTsKKworICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgZmluYWwgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGt0eXBlLCBrZXkpIDw8ICIsICIgPDwgYm94X3R5cGUodnR5cGUsIHZhbCkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIsICIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIGZhbHNlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Ym94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAibmV3IEJvb2xlYW4oIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIm5ldyBCeXRlKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAibmV3IFNob3J0KCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAibmV3IEludGVnZXIoIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJuZXcgTG9uZygiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm5ldyBEb3VibGUoIiArIHZhbHVlICsgIikiOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlCisgKiBpbXBsZW1lbnRvci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIEphdmEgdW5pb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChmX3N0cnVjdCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIGV4dGVuZHMgVFVuaW9uICI7CisKKyAgc2NvcGVfdXAoZl9zdHJ1Y3QpOworCisgIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWx1ZSk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKKyAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiKWdldEZpZWxkVmFsdWUoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KQorICAgICAgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKKyAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDLnR5cGUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKKyAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgorICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBURmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVxdWFsaXR5CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgIgorICAgICAgICAgICAgICAgICAiZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFeGNlcHRpb24gIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKKyAgICBvdXQgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKKyAgfQorCisgIC8vIGlzc2V0IGRhdGEKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOworCisgICAgaW50IGkgPSAwOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKSA8PCAiID0gIiA8PCBpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPiAwKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBib29sZWFuW10gX19pc3NldF92ZWN0b3IgPSBuZXcgYm9vbGVhblsiIDw8IGkgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKKyAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJTeXN0ZW0uYXJyYXljb3B5KG90aGVyLl9faXNzZXRfdmVjdG9yLCAwLCBfX2lzc2V0X3ZlY3RvciwgMCwgIgorICAgICAgICAgICAgICAgICAgICJvdGhlci5fX2lzc2V0X3ZlY3Rvci5sZW5ndGgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBlcXVhbHMgbWV0aG9kcyBhbmQgYSBoYXNoQ29kZSBtZXRob2QgZm9yIGEgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzID09IHRoYXQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7CisgICAgc3RyaW5nIHVuZXF1YWw7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgorICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICB1bmVxdWFsID0gIlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgKyBuYW1lICsgIiwgdGhhdC4iICsgbmFtZSArICIpICE9IDAiOworICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlck9iamVjdCkgeyIgPDwgZW5kbDsKKyAgLy8gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlck9iamVjdC5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlck9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyID0gKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpb3RoZXJPYmplY3Q7IjsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpCisgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkgfHwgZmllbGQtPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY29tcGFyZVRvKG90aGVyLiIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiLCBvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCisgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG9wdGlvbmFsID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOworCisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKW91dDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCisgKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgorICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKKworICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEVudW1lcmF0aW9uIGdldCIgPDwgY2FwX25hbWU7CisgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJFbnVtZXJhdGlvbigpIHsiKSA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgorICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuZWxlbWVudHMoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKKyAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAvLyBQdXQgdG8gbWFwCisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIHB1dFRvIiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSA8PCAiIGtleSwgIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSkgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgIG91dCA8PCAiIGlzIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZ2V0IjsKKyAgICB9CisgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICBvdXQgPDwgInZvaWQiOworICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIlN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSBzYi5hcHBlbmQoXCIsIFwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiKTsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNiLmFwcGVuZChcIm51bGxcIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IudG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5FTlVNIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRW51bU1ldGFEYXRhKFRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7CisgICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICIpIjsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5qYXZhIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UgZXh0ZW5kcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIHsgfSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGZfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIklmYWNlLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaWZhY2U7CisgIGZfaWZhY2Uub3BlbihmX2ludGVyZmFjZV9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJJZmFjZSI7CisgIH0KKworICBmX2lmYWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCB0c2VydmljZSk7CisgIGZfaWZhY2UgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCAqZl9pdGVyKTsKKyAgICBmX2lmYWNlIDw8ICIgIHB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGZfaWZhY2UgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5DbGllbnQiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudCwgSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsICsrc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIKKyAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgorICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIHByb2Nlc3NNYXBfID0gbmV3IEhhc2h0YWJsZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PworCisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSAoUHJvY2Vzc0Z1bmN0aW9uKXByb2Nlc3NNYXBfLmdldChtc2cubmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCisgICAgICAgICAiJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgUHJvY2Vzc0Z1bmN0aW9uIHsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCisgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAidHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgPDwgIigiIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiKSA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGJveF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgYm94X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBzdHJpbmcga2V5X3R5cGUgPSB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBrZXlfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwga2V5X3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOworICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOworICAgIGluZGVudChvdXQpIDw8IGVsZV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIiA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICBzdHJpbmcgdmFsX3R5cGUgPSB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIoKCIgKyB2YWxfdHlwZSArICIpIiArIG1hcCArICIuZ2V0KCIgKyBpdGVyICsgIikpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gVmVjdG9yCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYykgeworICAodm9pZClpbl9pbml0OworICAodm9pZClza2lwX2dlbmVyaWM7CisgIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiSGFzaHRhYmxlIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIkhhc2h0YWJsZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVmVjdG9yIjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKKyAgfQorICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7CisgIHN0ZDo6c3RyaW5nIGVudW1lcmF0aW9uX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZW51bSI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7CisKKyAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lIDw8ICIua2V5cygpOyAiCisgICAgICAgICAgICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiCisgICAgICAgICAgICAgICAgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5KTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlOworCisgICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiLmVsZW1lbnRzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA9ICgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZWxlbV90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgLy8gcmVjdXJzaXZlIGRlZXAgY29weQorICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUsIGVsZW1fdHlwZSk7CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIiwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQodGVtcF9iaW5hcnlfZWxlbWVudCwgdGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsIHJlc3VsdF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAvLyBiaW5hcnkgZmllbGRzIG5lZWQgdG8gYmUgY29waWVkIHdpdGggU3lzdGVtLmFycmF5Y29weQorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJuZXcgYnl0ZVsiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIsIDAsICIgPDwgZGVzdF9uYW1lIDw8ICIsIDAsICIKKyAgICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7CisgICAgfQorICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5CisgICAgZWxzZQorICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOworICB9IGVsc2UgeworICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKK2Jvb2wgdF9qYXZhbWVfZ2VuZXJhdG9yOjpoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCisgICAgICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAorICAgICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgPDwgIihmYWxzZSk7IiA8PCBlbmRsOworICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIHByZXZlbnQgZ2NjIGNvbXBpbGVyIHdhcm5pbmcKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoamF2YW1lLCAiSmF2YSBNRSIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc4MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCisKKy8qKgorICogSlMgY29kZSBnZW5lcmF0b3IuCisgKi8KK2NsYXNzIHRfanNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfanNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBnZW5fbm9kZV8gPSBmYWxzZTsKKyAgICBnZW5fanF1ZXJ5XyA9IGZhbHNlOworICAgIGdlbl90c18gPSBmYWxzZTsKKyAgICBnZW5fZXM2XyA9IGZhbHNlOworCisgICAgYm9vbCB3aXRoX25zXyA9IGZhbHNlOworCisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9kZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25vZGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgianF1ZXJ5IikgPT0gMCkgeworICAgICAgICBnZW5fanF1ZXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRzIikgPT0gMCkgeworICAgICAgICBnZW5fdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2l0aF9ucyIpID09IDApIHsKKyAgICAgICAgd2l0aF9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJlczYiKSA9PSAwKSB7CisgICAgICAgIGdlbl9lczZfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqczoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9qcXVlcnlfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOmVzNixqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUiOworICAgIH0KKworICAgIGlmIChnZW5fbm9kZV8gJiYgZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6bm9kZSxqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUsIHRyeTogWy1nZW4ganM6bm9kZSAtZ2VuICIKKyAgICAgICAgICAgICJqczpqcXVlcnldIjsKKyAgICB9CisKKyAgICBpZiAoIWdlbl9ub2RlXyAmJiB3aXRoX25zXykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczp3aXRoX25zXSBpcyBvbmx5IHZhbGlkIHdoZW4gdXNpbmcgbm9kZS5qcyI7CisgICAgfQorCisgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzaW5nIGZsYWdzLCB3ZSB3aWxsIHVwZGF0ZSB0aGVzZSB0byBiZSBFUzYgY29tcGF0aWJsZQorICAgIGpzX2NvbnN0X3R5cGVfID0gInZhciAiOworICAgIGpzX2xldF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc192YXJfdHlwZV8gPSAidmFyICI7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBqc19jb25zdF90eXBlXyA9ICJjb25zdCAiOworICAgICAganNfbGV0X3R5cGVfID0gImxldCAiOworICAgIH0KKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5vZGVqcyI7CisgICAgICBub19uc18gPSAhd2l0aF9uc187CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzIjsKKyAgICAgIG5vX25zXyA9IGZhbHNlOworICAgIH0KKworICAgIGVzY2FwZV9bJ1wnJ10gPSAiXFwnIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGpzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHRzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjayA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKTsKKworICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIvL1xuIikgKyAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIi8vXG4iICsgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiLy9cbiI7CisgIH0KKworICB0X3R5cGUqIGdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBqc19uYW1lc3BhY2VfcGllY2VzKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXM7CisKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gcGllY2VzOworICAgIH0KKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7CisgICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGllY2VzOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfdHlwZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwICE9IHByb2dyYW1fKSB7CisgICAgICAgIHJldHVybiBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHAtPmdldF9uYW1lKCkpICsgIl90dHlwZXMuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAidHR5cGVzLiI7CisgICAgfQorICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc19leHBvcnRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIHJldHVybiAiZXhwb3J0cy4iOworICAgIH0KKyAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOworICB9CisKKyAgYm9vbCBoYXNfanNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworICAgIHJldHVybiAobnMuc2l6ZSgpID4gMCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc19uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIG5zICs9ICIuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvKioKKyAgICogVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgaGVscGVyIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrLCBib29sIG9wdGlvbmFsX2NhbGxiYWNrKTsKKyAgc3RyaW5nIHRzX2dldF90eXBlKHRfdHlwZSogdHlwZSk7CisKKyAgLyoqCisgICAqIFNwZWNpYWwgaW5kZW50YXRpb24gZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbnMgYmVjYXVzZSBvZiB0aGUgbW9kdWxlLgorICAgKiBSZXR1cm5zIHRoZSBub3JtYWwgaW5kZW50YXRpb24gKyAiICAiIGlmIGEgbW9kdWxlIHdhcyBkZWZpbmVkLgorICAgKiBAcmV0dXJuIHN0cmluZworICAgKi8KKyAgc3RyaW5nIHRzX2luZGVudCgpIHsgcmV0dXJuIGluZGVudCgpICsgKCF0c19tb2R1bGVfLmVtcHR5KCkgPyAiICAiIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgImRlY2xhcmUgIiBpZiBubyBtb2R1bGUgd2FzIGRlZmluZWQuCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfZGVjbGFyZSgpIHsgcmV0dXJuICh0c19tb2R1bGVfLmVtcHR5KCkgPyAiZGVjbGFyZSAiIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgIj8iIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyBvcHRpb25hbCBvciBoYXMgYSBkZWZhdWx0IHZhbHVlLgorICAgKiBAcGFyYW0gdF9maWVsZCBUaGUgZmllbGQgdG8gY2hlY2sKKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19nZXRfcmVxKHRfZmllbGQqIGZpZWxkKSB7cmV0dXJuIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwgPyAiPyIgOiAiIik7IH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiwgaWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIG9uZS4KKyAgICogQHBhcmFtIHRfZG9jIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20KKyAgICogQHJldHVybiBzdHJpbmcgVGhlIGRvY3VtZW50YXRpb24KKyAgICovCisgIHN0cmluZyB0c19wcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gZW5kbDsKKworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvYyh0ZG9jLT5nZXRfZG9jKCkpOworICAgICAgc3RyaW5nIGl0ZW07CisKKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIvKioiICsgZW5kbDsKKyAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZG9jLCBpdGVtKSkgeworICAgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiICogIiArIGl0ZW0gKyBlbmRsOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqLyIgKyBlbmRsOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBOb2RlSlMtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9kZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNlcnZpY2VzIHRoYXQgdXNlIGpRdWVyeSBhamF4IChhc3luYy9zeW5jKS4KKyAgICovCisgIGJvb2wgZ2VuX2pxdWVyeV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgZm9yIGVhY2ggc2VydmljZS4KKyAgICovCisgIGJvb2wgZ2VuX3RzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgRVM2IGNvZGUsIGkuZS4gd2l0aCBQcm9taXNlcworICAgKi8KKyAgYm9vbCBnZW5fZXM2XzsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIGRlZmluZWQgbW9kdWxlKHMpLCBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGVzLgorICAgKi8KKyAgc3RyaW5nIHRzX21vZHVsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG5vdCBnZW5lcmF0ZSBuYW1lc3BhY2Ugb2JqZWN0cyBmb3Igbm9kZS4KKyAgICovCisgIGJvb2wgbm9fbnNfOworCisgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAiY29uc3QiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19jb25zdF90eXBlXzsKKworICAgLyoqCisgICAqIFRoZSB2YXJpYWJsZSBkZWNvcmF0b3IgZm9yICJsZXQiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19sZXRfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgZGVmYXVsdCB2YXJpYWJsZSBkZWNvcmF0b3IuIFN1cHBvcnRzIGFsbCBqYXZhc2NyaXB0IGxhbmd1YWdlcywgYnV0IGlzIG5vdCBzY29wZWQgdG8gZnVuY3Rpb25zIG9yIGNsb3N1cmVzLgorICAgKi8KKyAgc3RyaW5nIGpzX3Zhcl90eXBlXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc190c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlKHMpCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuanMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3R5cGVzX3RzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuZC50cyI7CisgICAgZl90eXBlc190c18ub3BlbihmX3R5cGVzX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfdHlwZXNfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGZfdHlwZXNfIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ0dHlwZXMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9OyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBwbnM7CisKKyAgLy8gc2V0dXAgdGhlIG5hbWVzcGFjZQorICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/CisgIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMocHJvZ3JhbV8pOworICBpZiAobnNfcGllY2VzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zX3BpZWNlcy5zaXplKCk7ICsraSkgeworICAgICAgcG5zICs9ICgoaSA9PSAwKSA/ICIiIDogIi4iKSArIG5zX3BpZWNlc1tpXTsKKyAgICAgIGZfdHlwZXNfIDw8ICJpZiAodHlwZW9mICIgPDwgcG5zIDw8ICIgPT09ICd1bmRlZmluZWQnKSB7IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgdHNfbW9kdWxlXyA9IHBuczsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQganMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmpzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IGpzX2NvbnN0X3R5cGVfICsgInRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICArIGpzX2NvbnN0X3R5cGVfICsgIlRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iOworICAgIGlmICghZ2VuX2VzNl8pIHsKKyAgICAgIHJlc3VsdCArPSBqc19jb25zdF90eXBlXyArICJRID0gdGhyaWZ0LlE7XG4iOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0cyBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfaW5jbHVkZXMoKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAiaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICAiaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iCisgICAgICAgICJpbXBvcnQgUSA9IHRocmlmdC5RO1xuIik7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHJlc3VsdCArPSBqc19jb25zdF90eXBlXyArIG1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICsgIl90eXBlcycpO1xuIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdCArPSAiXG4iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZShzKQorCisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgZl90eXBlc190c18gPDwgIn0iOworICAgIH0KKyAgICBmX3R5cGVzX3RzXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKUywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKKyAqIGluIEpTLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UodGVudW0tPmdldF9wcm9ncmFtKCkpIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRlbnVtKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImVudW0gIgorICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdCYgY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworICAgICAgLy8gYWRkICd2YWx1ZToga2V5JyBpbiBhZGRpdGlvbiB0byAna2V5OiB2YWx1ZScgZm9yIFR5cGVTY3JpcHQgZW51bXMKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCB2YWx1ZSA8PCAiJyA6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgOiAiIDw8IHZhbHVlOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpIC0gMSkgeworICAgICAgZl90eXBlc18gPDwgIiwiOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZShwcm9ncmFtXykgPDwgbmFtZSA8PCAiID0gIjsKKyAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0Y29uc3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCBqc19jb25zdF90eXBlXyA8PCBuYW1lIDw8ICI6ICIKKyAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgOiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisKKyAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIG91dCA8PCAiWyI7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgfQorICAgIG91dCA8PCAiXSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBNYWtlIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisvKioKKyAqIFJldHVybiB0eXBlIG9mIGNvbnRhaW5lZCBlbGVtZW50cyBmb3IgYSBjb250YWluZXIgdHlwZS4gRm9yIG1hcHMKKyAqIHRoaXMgaXMgdHlwZSBvZiB2YWx1ZSAoa2V5cyBhcmUgYWx3YXlzIHN0cmluZ3MgaW4ganMpCisgKi8KK3RfdHlwZSogdF9qc19nZW5lcmF0b3I6OmdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpIHsKKyAgdF90eXBlKiBldHlwZTsKKyAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgIH0gZWxzZSB7CisgICAgZXR5cGUgPSAoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIGV0eXBlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBKUworICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQorICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgb3V0IDw8IHByZWZpeCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8CisgICAgICAoaXNfZXhwb3J0ZWQgPyAiID0gbW9kdWxlLmV4cG9ydHMuIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgOiAiIik7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgKGlzX2V4Y2VwdGlvbiA/ICIgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiIgOiAiIikKKyAgICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiID0gY2xhc3MgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvcihhcmdzKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIENhbGwgc3VwZXIoKSBtZXRob2Qgb24gaW5oZXJpdGVkIEVycm9yIGNsYXNzCisgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoYXJncyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiVGhyaWZ0LlRFeGNlcHRpb24uY2FsbCh0aGlzLCBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5uYW1lID0gXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBtZW1iZXJzIHdpdGggYXJndW1lbnRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgCisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRWFybHkgcmV0dXJucyBmb3IgZXhjZXB0aW9ucworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGFyZ3MgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICA8PCB0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInRoaXMuIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmIChhcmdzKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihhcmdzPzogeyAiOworICAgIH0KKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQgJiYgYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIG91dCA8PCAoIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgKyB0LT5nZXRfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAiKGFyZ3MuIisoKm1faXRlciktPmdldF9uYW1lKCkgKyIpOyIpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZSh0KTsKKyAgICAgICAgc3RyaW5nIGNvcHlGdW5jID0gdC0+aXNfbWFwKCkgPyAiVGhyaWZ0LmNvcHlNYXAiIDogIlRocmlmdC5jb3B5TGlzdCI7CisgICAgICAgIHN0cmluZyB0eXBlX2xpc3QgPSAiIjsKKworICAgICAgICB3aGlsZSAoZXR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0gZXR5cGUtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOworICAgICAgICAgIGV0eXBlID0gZ2V0X2NvbnRhaW5lZF90eXBlKGV0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChldHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSBqc190eXBlX25hbWVzcGFjZShldHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyBldHlwZS0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSAibnVsbCI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgKCIgPSAiICsgY29weUZ1bmMgKyAiKGFyZ3MuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArCisgICAgICAgICAgICAgICAgIiwgWyIgKyB0eXBlX2xpc3QgKyAiXSk7Iik7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaWYgKCEoKm1faXRlciktPmdldF9yZXEoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuVU5LTk9XTiwgIgorICAgICAgICAgICAgICAgIidSZXF1aXJlZCBmaWVsZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKGdlbl90c18pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHRzX2dldF9yZXEoKm1faXRlcikgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7ICI7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9lczZfKSB7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICIsIFRocmlmdC5URXhjZXB0aW9uKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUubmFtZSA9ICciCisgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlIG1hbnVhbGx5IGlmIHdlIGFyZW4ndCB1c2luZyBlczYKKyAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZSA9IHt9OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICB9CisKKyAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gQ2xvc2Ugb3V0IHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJyZWFkIChpbnB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqc19jb25zdF90eXBlXyA8PCAiZnR5cGUgPSByZXQuZnR5cGU7IiA8PCBlbmRsOworICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZpZCA9IHJldC5maWQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMSkgeworICAgICAgLy8gcHNldWRvIGNhc2UgdG8gbWFrZSBqc2xpbnQgaGFwcHkKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIDA6IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJ3cml0ZSAob3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCAmJiB0aGlzLiIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLmpzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV90c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLmQudHMiOworICAgIGZfc2VydmljZV90c18ub3BlbihmX3NlcnZpY2VfdHNfbmFtZS5jX3N0cigpKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfc2VydmljZV8gPDwgIlwidXNlIHN0cmljdFwiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiLmQudHNcIiAvPiIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlX3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgICAgIC8vIEdlbmVyYXRlIHR5cGUgYWxpYXNlcworICAgICAgLy8gZW51bQorICAgICAgdmVjdG9yPHRfZW51bSo+IGNvbnN0JiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgICAgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICAgICAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCplX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBjb25zdAorICAgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdCYgY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBleGNlcHRpb24KKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+IGNvbnN0JiBleGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBzdHJ1Y3RzCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICAgICAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgICAgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKnNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOworICAgIH0KKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIiA9IHJlcXVpcmUoJy4vIgorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyk7IiA8PCBlbmRsIDw8IGpzX2NvbnN0X3R5cGVfCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgPSAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuQ2xpZW50OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBqc19jb25zdF90eXBlXyA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvcjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSI7CisgICAgfQorICAgIGZfc2VydmljZV90c18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIGZfc2VydmljZV8gPDwgcHJlZml4IDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciA9ICIgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCBlbmRsIDw8ICJkZWNsYXJlIGNsYXNzIFByb2Nlc3NvciAiOworICAgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgX2hhbmRsZXI6IE9iamVjdDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXI6IE9iamVjdCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2VzcyhpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiCisgICAgICAgICAgICAgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgfQorCisgIGJvb2wgaXNfc3ViY2xhc3Nfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEw7CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaGFuZGxlcikgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBpZiAoZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIoaGFuZGxlcik7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlciA9IGhhbmRsZXI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEVTNSBzZXJ2aWNlIGluaGVyaXRhbmNlCisgIGlmICghZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IsICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvcik7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3MgKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJpZiAodGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICIgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAgICAgICAgIidVbmtub3duIGZ1bmN0aW9uICcgKyByLmZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oci5mbmFtZSwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgci5yc2VxaWQpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICAvLyBDbG9zZSBvZmYgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX25vZGVfICYmIGdlbl90c18pIHsKKyAgICBmX3NlcnZpY2VfdHNfIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiIChzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdHNfKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkOiBudW1iZXIsIGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk6IHZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICArICJfcmVzdWx0IjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImFyZ3MucmVhZChpbnB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFByb21pc2Ugc3R5bGUgaW52b2NhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmICh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIi5sZW5ndGggPT09ICIgPDwgZmllbGRzLnNpemUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlByb21pc2UucmVzb2x2ZSh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSgiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZmllbGRzLnNpemUoKSA+IDAgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJRLmZjYWxsKHRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIi5iaW5kKHRoaXMuX2hhbmRsZXIpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBtYXliZUNvbW1hIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWF5YmVDb21tYSA9IChmX2l0ZXIgIT0gZmllbGRzLmVuZCgpIC0gMSA/ICIsIiA6ICIiKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIpKS50aGVuKHJlc3VsdCA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXN1bHRfb2JqID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJyZXN1bHRfb2JqLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGVyciA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSkuY2F0Y2goZnVuY3Rpb24gKGVycikgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0OyIgPDwgZW5kbDsKKworICBib29sIGhhc19leGNlcHRpb24gPSBmYWxzZTsKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgaWYgKGV4Y2VwdGlvbnMpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGlmICghaGFzX2V4Y2VwdGlvbikgeworICAgICAgICAgIGhhc19leGNlcHRpb24gPSB0cnVlOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZXhjZXB0aW9uKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIihlcnIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEVuZCBwcm9taXNlIHN0eWxlIGludm9jYXRpb24KKworICAvLyBDYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKGVyciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0X29iajsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoKGVyciA9PT0gbnVsbCB8fCB0eXBlb2YgZXJyID09PSAndW5kZWZpbmVkJykiOworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ICE9IG1lbWJlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCppdCktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUKKyAgICAgICAgICAgICA8PCAiKChlcnIgIT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpID8gZXJyIDoge3N1Y2Nlc3M6IHJlc3VsdH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iaiA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gRW5kIGNhbGxiYWNrIHN0eWxlIGludm9jYXRpb24KKworICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gRG8gbm90IGdlbmVyYXRlIFRTIGRlZmluaXRpb25zIGZvciBoZWxwZXIgZnVuY3Rpb25zCisgIGJvb2wgZ2VuX3RzX3RtcCA9IGdlbl90c187CisgIGdlbl90c18gPSBmYWxzZTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8ICIvL0hFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisgICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KKworICBnZW5fdHNfID0gZ2VuX3RzX3RtcDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgZl9zZXJ2aWNlXyA8PCBwcmVmaXggPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gIiA8PCAiZXhwb3J0cy5DbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50ICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgPDwgIkNsaWVudCI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKHRzZXJ2aWNlKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICI7CisgICAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBFUzYgQ29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIGV4dGVuZHMgIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBmdW5jdGlvbihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLnBDbGFzcyA9IHBDbGFzczsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fcmVxcyA9IHt9OyIgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIHNlcWlkOiBudW1iZXI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgImNvbnN0cnVjdG9yKGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0PzogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLmlucHV0ID0gaW5wdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSAoIW91dHB1dCkgPyBpbnB1dCA6IG91dHB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbDsiIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIm91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaW5pdCBwcm90b3R5cGUKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlID0ge307IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHV0aWxzIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlcworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJuZXdfc2VxaWQgKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQgKz0gMTsgfSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH07IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdChhcmdfc3RydWN0KTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVubmFtZSA8PCAiICgiIDw8IGFyZ2xpc3QgPDwgIikgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS4iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX2VzNl8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGhvdXQgY2FsbGJhY2sKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3ZlcmxvYWQgd2l0aCBjYWxsYmFjaworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX2VzNl8gJiYgZ2VuX25vZGVfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZWxmLnNlcWlkKCldID0gKGVycm9yLCByZXN1bHQpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fbm9kZV8pIHsgLy8gTm9kZS5qcyBvdXRwdXQgICAgICAuL2dlbi1ub2RlanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJfZGVmZXIgPSBRLmRlZmVyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvcikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVqZWN0KGVycm9yKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX2RlZmVyLnByb21pc2U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGNhbGxiYWNrOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgIihlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgaWYgKGdlbl9qcXVlcnlfKSB7IC8vIGpRdWVyeSBvdXRwdXQgICAgICAgLi9nZW4tanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJwb3N0RGF0YSA9IHRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgInRydWUpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiLmpxUmVxdWVzdCh0aGlzLCBwb3N0RGF0YSwgYXJndW1lbnRzLCB0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeyAvLyBTdGFuZGFyZCBKYXZhU2NyaXB0IC4vZ2VuLWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJjYWxsYmFjayk7ICIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIWNhbGxiYWNrKSB7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICByZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFUzYganMgc3RpbGwgdXNlcyBjYWxsYmFja3MgaGVyZS4gU2hvdWxkIHJlZmFjdG9yIHRoaXMgdG8gcHJvbWlzZSBzdHlsZSBsYXRlci4uCisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmd1bWVudF9saXN0KGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuc2VuZF8iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXRWYXI7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAib3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7CisgICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICJfYXJncyI7CisKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwiOworICAgIC8vIEJ1aWxkIGFyZ3MKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicGFyYW1zID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCktMSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIocGFyYW1zKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyIHdpdGhpbiB0cnkvY2F0Y2gKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgdGhpcy5zZXFpZCgpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQpOyIgPDwgZW5kbDsKKyAgICB9CisKKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgb3V0cHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIKKyAgICAgICAgICAgICAgIDw8ICIud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV07IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhudWxsKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnZW5fanF1ZXJ5XykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goY2FsbGJhY2spOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgbnVsbCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsICgpID0+IHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19sZXRfdHlwZV8gPDwgImVycm9yID0gbnVsbCwgcmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVycm9yID0gZTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhlcnJvciwgcmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjaykgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBudWxsKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIGZ1bmN0aW9uKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2socmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIFJlc2V0IHRoZSB0cmFuc3BvcnQgYW5kIGRlbGV0ZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlmIHRoZXJlIHdhcyBhIHNlcmlhbGl6YXRpb24gZXJyb3IKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBDbG9zZSBzZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIC8vIE9wZW4gcmVjZWl2ZSBmdW5jdGlvbgorICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAoaW5wdXQsIG10eXBlLCByc2VxaWQpIHsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gZnVuY3Rpb24oaW5wdXQsbXR5cGUscnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAoKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIHN0ZDo6c3RyaW5nIGlucHV0VmFyOworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpbnB1dFZhciA9ICJpbnB1dCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFZhciA9ICJ0aGlzLmlucHV0IjsKKyAgICAgIH0KKworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJjYWxsYmFjayA9IHRoaXMuX3JlcXNbcnNlcWlkXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1tyc2VxaWRdOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJtdHlwZSA9IHJldC5tdHlwZTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIngiKSA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coInJlc3VsdC4iICsgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAiCisgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfcmV0dXJuKCJyZXN1bHQuc3VjY2VzcyIpIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfcmVjdl90aHJvdygiJyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnIikKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2FsbGJhY2sobnVsbCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDbG9zZSByZWNlaXZlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRmluaXNoIGNsYXNzIGRlZmluaXRpb25zCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKCIgKyB2YXIgKyAiKTsiOworICB9IGVsc2UgeworICAgIHJldHVybiAidGhyb3cgIiArIHZhciArICI7IjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcikgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2sobnVsbCwgIiArIHZhciArICIpOyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJyZXR1cm4gIiArIHZhciArICI7IjsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgICh2b2lkKWluY2xhc3M7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpbnB1dC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICh0eXBlLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5KCkiIDogInJlYWRTdHJpbmcoKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisKKyAgICBpZiAoIWdlbl9ub2RlXykgeworICAgICAgb3V0IDw8ICIudmFsdWUiOworICAgIH0KKworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBydG1wMyA9IHRtcCgiX3J0bXAzIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZSB8fCAwOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIWdlbl9ub2RlXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBpIDw8ICIgPiAwICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGlmIChpbnB1dC5yc3RhY2subGVuZ3RoID4gaW5wdXQucnBvc1tpbnB1dC5ycG9zLmxlbmd0aCAtMV0gKyAxKSB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBpbnB1dC5yc3RhY2sucG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAodHlwZS0+aXNfYmluYXJ5KCkgPyAid3JpdGVCaW5hcnkoIiA6ICJ3cml0ZVN0cmluZygiKSA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJUaHJpZnQub2JqZWN0TGVuZ3RoKCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIubGVuZ3RoKTsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwga2l0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGtpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCB2aXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGtpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gInRoaXMuIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAoIW9iaikgeworICAgIHJlc3VsdCA9IGpzX2xldF90eXBlXyArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworCisgIHN0cmluZyBzdHI7CisKKyAgc3RyID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7CisKKyAgc3RyICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX2NhbGxiYWNrKTsKKworICBzdHIgKz0gIikiOworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgeworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gImNhbGxiYWNrIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIHRfdHlwZSB0byBhIFR5cGVTY3JpcHQgdHlwZSAoc3RyaW5nKS4KKyAqIEBwYXJhbSB0X3R5cGUgVHlwZSB0byBjb252ZXJ0IHRvIFR5cGVTY3JpcHQKKyAqIEByZXR1cm4gU3RyaW5nIFR5cGVTY3JpcHQgdHlwZQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2dldF90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdGQ6OnN0cmluZyB0c190eXBlOworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICB0c190eXBlID0gInN0cmluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICB0c190eXBlID0gImJvb2xlYW4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgdHNfdHlwZSA9ICJudW1iZXIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdHNfdHlwZSA9ICJ2b2lkIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWU7CisgICAgaWYgKHR5cGUtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHR5cGVfbmFtZSA9IGpzX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgICB9CisgICAgdHlwZV9uYW1lLmFwcGVuZCh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICB0c190eXBlID0gdHlwZV9uYW1lOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgdHNfdHlwZSA9IHRzX2dldF90eXBlKGV0eXBlKSArICJbXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2dHlwZSA9IHRzX2dldF90eXBlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisKKworICAgIGlmIChrdHlwZSA9PSAibnVtYmVyIiB8fCBrdHlwZSA9PSAic3RyaW5nIiApIHsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogIiArIGt0eXBlICsgIl06ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSBpZiAoKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgICAgLy8gTm90IHlldCBzdXBwb3J0ZWQgKGVudW0gbWFwKTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvMjY1MgorICAgICAgLy90c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogbnVtYmVyIC8qIiArIGt0eXBlICsgIiovXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHNfdHlwZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgVHlwZVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUoYXJnczogdHlwZXMpOiB0eXBlOycKKyAqCisgKiBAcGFyYW0gdF9mdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcGFyYW0gYm9vbCBpbi0vZXhjbHVkZSB0aGUgY2FsbGJhY2sgYXJndW1lbnQKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaywgYm9vbCBvcHRpb25hbF9jYWxsYmFjaykgeworICBzdHJpbmcgc3RyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHIgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHIgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgdHNfZ2V0X3JlcSgqZl9pdGVyKSArICI6ICIgKyB0c19nZXRfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgaWYgKGZfaXRlciArIDEgIT0gZmllbGRzLmVuZCgpIHx8IChpbmNsdWRlX2NhbGxiYWNrICYmIGZpZWxkcy5zaXplKCkgPiAwKSkgeworICAgICAgc3RyICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBzdHJpbmcgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nID0gb3B0aW9uYWxfY2FsbGJhY2sgPyAiPyIgOiAiIjsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlczsKKyAgICAgIGlmIChleGNlcHRpb25zKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgaWYgKGl0ID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzID0gdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzICs9ICIgfCAiICsgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChleGNlcHRpb25fdHlwZXMgPT0gIiIpIHsKKyAgICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZXJyb3I6IHZvaWQsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiAiICsgZXhjZXB0aW9uX3R5cGVzICsgIiwgcmVzcG9uc2U6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIik9PnZvaWQpOiAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChkYXRhOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHN0ciArPSAiSlF1ZXJ5UHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArIj47IjsKKyAgICB9IGVsc2UgeworICAgICAgc3RyICs9ICJ2b2lkOyI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgc3RyICs9ICIpOiBQcm9taXNlPCIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj47IjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHIgKz0gIik6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIjsiOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWNlcyBhIHZhbGlkIE5vZGVKUyBpZGVudGlmaWVyIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllcgorICogQHJldHVybiBUaGUgbW9kaWZpZWQgbmFtZSB3aXRoIHRoZSB1cGRhdGVkIGlkZW50aWZpZXIKKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6Om1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gbmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSAmJiAoJyQnICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXZhc2NyaXB0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBqcXVlcnk6ICAgICAgICAgIEdlbmVyYXRlIGpRdWVyeSBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbm9kZTogICAgICAgICAgICBHZW5lcmF0ZSBub2RlLmpzIGNvbXBhdGlibGUgY29kZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0czogICAgICAgICAgICAgIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmaWxlcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB3aXRoX25zOiAgICAgICAgIENyZWF0ZSBnbG9iYWwgbmFtZXNwYWNlIG9iamVjdHMgd2hlbiB1c2luZyBub2RlLmpzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZXM2OiAgICAgICAgICAgICBDcmVhdGUgRVM2IGNvZGUgd2l0aCBQcm9taXNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTM2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNzkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0YWNrOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKK3N0YXRpYyBjb25zdCBib29sIE5PX0lOREVOVCA9IGZhbHNlOworc3RhdGljIGNvbnN0IGJvb2wgRk9SQ0VfU1RSSU5HID0gdHJ1ZTsKKworY2xhc3MgdF9qc29uX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfanNvbl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtZXJnZSIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24ganNvbjoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanNvbiI7CisgIH0KKworICB2aXJ0dWFsIH50X2pzb25fZ2VuZXJhdG9yKCkge30KKworICAvKioKKyAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCitwcml2YXRlOgorICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2pzb25fOworICBzdGQ6OnN0YWNrPGJvb2w+IGNvbW1hX25lZWRlZF87CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cmluZyBudW1iZXJfdG9fc3RyaW5nKFQgdCkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgb3V0LmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICAgIG91dC5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzMTApOworICAgIG91dCA8PCB0OworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCB3cml0ZV9udW1iZXIoVCBuKSB7CisgICAgZl9qc29uXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOworICB9CisKKyAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50ID0gdHJ1ZSk7CisgIHZvaWQgc3RhcnRfYXJyYXkoKTsKKyAgdm9pZCBlbmRfb2JqZWN0KCk7CisgIHZvaWQgZW5kX2FycmF5KCk7CisgIHZvaWQgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIHZvaWQgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIHN0cmluZyBlc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisgIHN0cmluZyBqc29uX3N0cihjb25zdCBzdHJpbmcmIHN0cik7CisgIHZvaWQgbWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKik7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOworCisgIHZvaWQgd3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3N0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCB3cml0ZV92YWx1ZSh0X3R5cGUqIHR2YWx1ZSk7CisgIHZvaWQgd3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgZm9yY2Vfc3RyaW5nID0gZmFsc2UpOworICB2b2lkIHdyaXRlX2tleV9hbmQoc3RyaW5nIGtleSk7CisgIHZvaWQgd3JpdGVfa2V5X2FuZF9zdHJpbmcoc3RyaW5nIGtleSwgc3RyaW5nIHZhbCk7CisgIHZvaWQgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCk7Cit9OworCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2pzb25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuanNvbiI7CisgIGZfanNvbl8ub3BlbihmX2pzb25fbmFtZS5jX3N0cigpKTsKKworICAvLyBNZXJnZSBhbGwgaW5jbHVkZWQgcHJvZ3JhbXMgaW50byB0aGlzIG9uZSBzbyB3ZSBjYW4gb3V0cHV0IG9uZSBiaWcgZmlsZS4KKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICBtZXJnZV9pbmNsdWRlcyhwcm9ncmFtXyk7CisgIH0KK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmVzY2FwZV9qc29uX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgeworICAgIHN3aXRjaCAoKml0ZXIpIHsKKyAgICBjYXNlICdcXCc6CisgICAgICBzcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICJcXFwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJy8nOgorICAgICAgc3MgPDwgIlxcLyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcYic6CisgICAgICBzcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xmJzoKKyAgICAgIHNzIDw8ICJcXGYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXG4nOgorICAgICAgc3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdccic6CisgICAgICBzcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICAgIHNzIDw8ICJcXHQiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8ICppdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50KSB7CisgIGZfanNvbl8gPDwgKHNob3VsZF9pbmRlbnQgPyBpbmRlbnQoKSA6ICIiKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbW1hX25lZWRlZF8ucHVzaChmYWxzZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfYXJyYXkoKSB7CisgIGZfanNvbl8gPDwgIlsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbW1hX2lmX25lZWRlZCgpIHsKKyAgaWYgKGNvbW1hX25lZWRlZF8udG9wKCkpIHsKKyAgICBmX2pzb25fIDw8ICIsIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6aW5kaWNhdGVfY29tbWFfbmVlZGVkKCkgeworICBjb21tYV9uZWVkZWRfLnBvcCgpOworICBjb21tYV9uZWVkZWRfLnB1c2godHJ1ZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZChzdHJpbmcga2V5KSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX2ludGVnZXIoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCBudW1iZXJfdG9fc3RyaW5nKHZhbCk7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwganNvbl9zdHIodmFsKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9ib29sKHN0cmluZyBrZXksIGJvb2wgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8ICh2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX29iamVjdCgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9qc29uXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjplbmRfYXJyYXkoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7CisgICAgZl9qc29uXyA8PCBlbmRsOworICB9CisgIGluZGVudChmX2pzb25fKSA8PCAiXSI7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX29iamVjdChjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKG5hbWUpOworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIHdyaXRlX2tleV9hbmQoInR5cGVJZCIpOworICAgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7CisgICAgZW5kX29iamVjdCgpOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpIHsKKyAgd3JpdGVfa2V5X2FuZChuYW1lKTsKKyAgd3JpdGVfdHlwZV9zcGVjKHR0eXBlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV90eXBlX3NwZWModF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgd3JpdGVfc3RyaW5nKGdldF90eXBlX25hbWUodHR5cGUpKTsKKworICBpZiAodHR5cGUtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImNsYXNzIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHR0eXBlKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImtleVR5cGVJZCIsIGdldF90eXBlX25hbWUoa3R5cGUpKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygidmFsdWVUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKHZ0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgia2V5VHlwZSIsIGt0eXBlKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ2YWx1ZVR5cGUiLCB2dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImVsZW1UeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGV0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgiZWxlbVR5cGUiLCBldHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2pzb25fIDw8IGVuZGw7CisgIGZfanNvbl8uY2xvc2UoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjptZXJnZV9pbmNsdWRlcyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaW5jX2l0ZXI7CisgIGZvciAoaW5jX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXRlcikgeworICAgIHRfcHJvZ3JhbSogaW5jbHVkZSA9ICppbmNfaXRlcjsKKyAgICAvLyByZWN1cnNlIGluIGNhc2Ugd2UgZ2V0IGNyYXp5CisgICAgbWVyZ2VfaW5jbHVkZXMoaW5jbHVkZSk7CisgICAgLy8gbWVyZ2UgZW51bXMKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBpbmNsdWRlLT5nZXRfZW51bXMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfZW51bSgqZW5faXRlcik7CisgICAgfQorICAgIC8vIG1lcmdlIHR5cGVkZWZzCisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gaW5jbHVkZS0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3R5cGVkZWYoKnRkX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSBzdHJ1Y3RzCisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IGluY2x1ZGUtPmdldF9vYmplY3RzKCk7CisgICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSBjb25zdGFudHMKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IGluY2x1ZGUtPmdldF9jb25zdHMoKTsKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9jb25zdCgqY19pdGVyKTsKKyAgICB9CisKKyAgICAvLyBtZXJnZSBzZXJ2aWNlcworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGluY2x1ZGUtPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgc3RhcnRfb2JqZWN0KCk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgcHJvZ3JhbV8tPmdldF9uYW1lKCkpOworICBpZiAocHJvZ3JhbV8tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBwcm9ncmFtXy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIC8vIFdoZW4gbWVyZ2luZyBpbmNsdWRlcywgdGhlICJuYW1lc3BhY2VzIiBhbmQgImluY2x1ZGVzIiBzZWN0aW9ucworICAvLyBiZWNvbWUgYW1iaWd1b3VzLCBzbyBqdXN0IHNraXAgdGhlbS4KKyAgaWYgKCFzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgLy8gR2VuZXJhdGUgbmFtZXNwYWNlcworICAgIHdyaXRlX2tleV9hbmQoIm5hbWVzcGFjZXMiKTsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2VzKCk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7CisgICAgZm9yIChuc19pdCA9IG5hbWVzcGFjZXMuYmVnaW4oKTsgbnNfaXQgIT0gbmFtZXNwYWNlcy5lbmQoKTsgKytuc19pdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcobnNfaXQtPmZpcnN0LCBuc19pdC0+c2Vjb25kKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisKKyAgICAvLyBHZW5lcmF0ZSBpbmNsdWRlcworICAgIHdyaXRlX2tleV9hbmQoImluY2x1ZGVzIik7CisgICAgc3RhcnRfYXJyYXkoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7CisgICAgZm9yIChpbmNfaXQgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXQgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIHdyaXRlX3N0cmluZygoKmluY19pdCktPmdldF9uYW1lKCkpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9hcnJheSgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgd3JpdGVfa2V5X2FuZCgiZW51bXMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHdyaXRlX2tleV9hbmQoInR5cGVkZWZzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCisgIHdyaXRlX2tleV9hbmQoInN0cnVjdHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHdyaXRlX2tleV9hbmQoImNvbnN0YW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9jb25zdGFudCgqY19pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB3cml0ZV9rZXlfYW5kKCJzZXJ2aWNlcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworCisgIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0YXJ0X29iamVjdCgpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZWRlZikpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCB0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKKyAgaWYgKHR0eXBlZGVmLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHR5cGVkZWYtPmdldF9kb2MoKSk7CisgIH0KKyAgaWYgKHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGVkZWYtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBmX2pzb25fIDw8IHF1b3QgPDwgZXNjYXBlX2pzb25fc3RyaW5nKHZhbHVlKSA8PCBxdW90OworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKworICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgaWYgKHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKyAgICAgIHdyaXRlX3N0cmluZyhudW1iZXJfdG9fc3RyaW5nKHZhbHVlLT5nZXRfaW50ZWdlcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisgICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgd3JpdGVfc3RyaW5nKHZhbHVlLT5nZXRfc3RyaW5nKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIHN0YXJ0X2FycmF5KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKKyAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIGZfanNvbl8gPDwgaW5kZW50KCk7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfYXJyYXkoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1pdDsKKyAgICBmb3IgKG1pdCA9IG1hcC5iZWdpbigpOyBtaXQgIT0gbWFwLmVuZCgpOyArK21pdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICBmX2pzb25fIDw8IGluZGVudCgpOworICAgICAgLy8gSlNPTiBvYmplY3RzIG9ubHkgYWxsb3cgc3RyaW5nIGtleXMKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QsIEZPUkNFX1NUUklORyk7CisgICAgICBmX2pzb25fIDw8ICI6ICI7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICAgIGJyZWFrOworICB9CisKKyAgZGVmYXVsdDoKKyAgICBmX2pzb25fIDw8ICJudWxsIjsKKyAgICBicmVhazsKKyAgfQorfQorCitzdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6anNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHF1b3QgKyBlc2NhcGVfanNvbl9zdHJpbmcoc3RyKSArIHF1b3Q7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgY29uLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUoY29uLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBjb24tPmdldF90eXBlKCkpOworCisgIGlmIChjb24tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBjb24tPmdldF9kb2MoKSk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJ2YWx1ZSIpOworICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOworCisgIGlmICh0ZW51bS0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRlbnVtLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRlbnVtLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICAgIHN0YXJ0X29iamVjdCgpOworICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRlbnVtLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdGVudW0tPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgICAgfQorICAgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgibWVtYmVycyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9rZXlfYW5kX2ludGVnZXIoInZhbHVlIiwgdmFsLT5nZXRfdmFsdWUoKSk7CisgICAgaWYgKHZhbC0+aGFzX2RvYygpKSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdmFsLT5nZXRfZG9jKCkpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworCisgIGlmICh0c3RydWN0LT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHN0cnVjdC0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmRfYm9vbCgiaXNFeGNlcHRpb24iLCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzVW5pb24iLCB0c3RydWN0LT5pc191bmlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kKCJmaWVsZHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZXh0ZW5kcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHNlcnZpY2UtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHNlcnZpY2UtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0c2VydmljZS0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJmdW5jdGlvbnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygicmV0dXJuVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJyZXR1cm5UeXBlIiwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIHdyaXRlX2tleV9hbmRfYm9vbCgib25ld2F5IiwgdGZ1bmMtPmlzX29uZXdheSgpKTsKKworICBpZiAodGZ1bmMtPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZnVuYy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZnVuYy0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRmdW5jLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoImFyZ3VtZW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICB3cml0ZV9rZXlfYW5kKCJleGNlcHRpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJrZXkiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgZmllbGQtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAoZmllbGQtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZmllbGQtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSBmaWVsZC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJyZXF1aXJlZCIpOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHdyaXRlX3N0cmluZygicmVxdWlyZWQiKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgorICAgIHdyaXRlX3N0cmluZygicmVxX291dCIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHdyaXRlX3N0cmluZygib3B0aW9uYWwiKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGVuZF9vYmplY3QoKTsKK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkgPyAidW5pb24iIDogInN0cnVjdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJleGNlcHRpb24iOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICByZXR1cm4gdGJhc2V0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKworICByZXR1cm4gIih1bmtub3duKSI7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXyB8fCB0dHlwZS0+Z2V0X3Byb2dyYW0oKSA9PSBwcm9ncmFtXykgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbWVyZ2U6ICAgICAgICAgICBHZW5lcmF0ZSBvdXRwdXQgd2l0aCBpbmNsdWRlZCBmaWxlcyBtZXJnZWRcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlZTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDExMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjptYXA7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBMVUEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2x1YV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9sdWFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9yZXF1aXJlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9taXRfcmVxdWlyZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZXF1aXJlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBsdWE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWx1YSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbHVhIHJlcXVpcmUgc3RhdGVtZW50cy4KKyAgICovCisgIGJvb2wgZ2VuX3JlcXVpcmVzXzsKKworICAvKioKKyAgICogU3RydWN0LWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXphdGlvbiAoUmVhZCkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gKFdyaXRlKQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKyAgc3RkOjpzdHJpbmcgbHVhX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLS1cbiIpICsgIi0tIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsgIi0tXG4iCisgICAgICAgICAgICsgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiLS0gQCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZWRcbiIKKyAgICAgICAgICAgKyAiLS1cbiI7CisgIH0KKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworfTsKKworLyoqCisgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGN1cl9uYW1lc3BhY2UgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyBjdXJfbmFtZXNwYWNlICsgImNvbnN0YW50cy5sdWEiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJ0dHlwZXMubHVhIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQWRkIGhlYWRlcnMKKyAgZl9jb25zdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9uYW1lc3BhY2UgPDwgImNvbnN0YW50cyciOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0eXBlZGVmIChlc3NlbnRpYWxseSBhIGNvbnN0YW50KQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF90eXBlKCktPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZSAodGFibGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTspIHsKKyAgICBpbnQzMl90IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgICsrY19pdGVyOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCI7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgKG5vbi1sb2NhbCkgdmFsdWUKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl9jb25zdHNfIDw8IGVuZGwgPDwgZW5kbCA8PCBuYW1lIDw8ICIgPSAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJsdWFsb25nbnVtYmVyLm5ldygnIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPSAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KQorICAgICAgICAgICAgICAgICAgPDwgIl0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICJdIjsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9IHRydWUiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBmYWxzZSI7CisgICAgICB9CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdAorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IGV4Y2VwdGlvbgorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0IG9yIGV4Y2VwdGlvbiAobHVhIHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA9IFRFeGNlcHRpb246bmV3eyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBfX3R5cGUgPSAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IF9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgaW5kZW50KG91dCk7CisgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK21faXRlcjsKKyAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCBlbmRsIDw8ICJ9IjsKKworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiByZWFkZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyB3aGlsZTogUmVhZCBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGlmOiBDaGVjayB3aGF0IHRvIHJlYWQKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2VpZiBmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gUmVhZCBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJzZWxmLiIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIGlmCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiB3cml0ZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBUbyBjaGVjayBlbGVtZW50IG9mIHNlbGYgd2hldGhlciBuaWwgb3Igbm90LgorICAgIC8vIGF2b2lkIHRoZSB2YWx1ZShmYWxzZSkgb2YgQk9PTCBpcyBsb3N0LgorICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgfj0gbmlsIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHNlcnZpY2UKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZXQgb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBPcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCisgIHN0cmluZyBjdXJfbnMgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gb3V0ZGlyICsgY3VyX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLmx1YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBIZWFkZXJzCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9ucyA8PCAidHR5cGVzJyIgPDwgZW5kbDsKKworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IGdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIC8vIENsb3NlIHRoZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiSWZhY2UiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIEludGVyZmFjZSBvYmplY3QgZGVmaW5pdGlvbgorICBvdXQgPDwgY2xhc3NuYW1lIDw8ICIgPSAiOworICBpZiAoZXh0ZW5kc19zKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiSWZhY2U6bmV3eyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBDbGllbnQgb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gX19UT2JqZWN0Lm5ldygiOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBvdXQgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UQ2xpZW50IjsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0pIiA8PCBlbmRsOworCisgIC8vIFNlbmQvUmVjdiBmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNpZyA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBzdHJpbmcgZnVuY25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjoiIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGY6c2VuZF8iIDw8IHNpZyA8PCBlbmRsIDw8IGluZGVudCgpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZWxmOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpzZW5kXyIgPDwgc2lnIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbignIiA8PCBmdW5jbmFtZSA8PCAiJywgIgorICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgICA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsIGFyZ3MgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfYXJnczpuZXd7fSIgPDwgZW5kbDsKKworICAgIC8vIFNldCB0aGUgYXJncworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RkOjpzdHJpbmcgYXJnbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgImFyZ3MuIiA8PCBhcmduYW1lIDw8ICIgPSAiIDw8IGFyZ25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYXJnczp3cml0ZShzZWxmLm9wcm90KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gUmVjdiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBmbmFtZSwgbXR5cGUsIHJzZXFpZCA9IHNlbGYuaXByb3Q6IgorICAgICAgICAgIDw8ICJyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04gdGhlbiIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGxvY2FsIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB4OnJlYWQoc2VsZi5pcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IoeCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfcmVzdWx0Om5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInJlc3VsdDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IGlmIGl0J3Mgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIH49IG5pbCB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzcyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgICAgLy8gVGhyb3cgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGYuYmVnaW4oKTsgeF9pdGVyICE9IHhmLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHRoZW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJlcnJvcihUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e2Vycm9yQ29kZSA9ICIKKyAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFR9KSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGVmaW5lIHByb2Nlc3NvciB0YWJsZQorICBvdXQgPDwgZW5kbCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UUHJvY2Vzc29yIiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiLCB7IiA8PCBlbmRsIDw8ICIgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBQcm9jZXNzIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cHJvY2VzcyhpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgbmFtZSwgbXR5cGUsIHNlcWlkID0gaXByb3Q6cmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgZnVuY19uYW1lID0gJ3Byb2Nlc3NfJyAuLiBuYW1lIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgbm90IHNlbGZbZnVuY19uYW1lXSBvciB0dHlwZShzZWxmW2Z1bmNfbmFtZV0pIH49ICdmdW5jdGlvbicgdGhlbiI7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3Q6c2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvckNvZGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAiCisgICAgICA8PCAic2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBzZWxmW2Z1bmNfbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBzdHJpbmcgZm5fbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3NfIiA8PCBmbl9uYW1lCisgICAgICAgICAgICAgIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibG9jYWwgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJnczpyZWFkKGlwcm90KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZQorICAgICAgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgc3RhdHVzLCByZXMgPSBwY2FsbChzZWxmLmhhbmRsZXIuIiA8PCBmbl9uYW1lCisgICAgICA8PCAiLCBzZWxmLmhhbmRsZXIiOworCisgIC8vIFByaW50IGFyZ3VtZW50cworICB0X3N0cnVjdCogYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgaWYgKGFyZ3MtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCAiLCAiIDw8IGFyZ3VtZW50X2xpc3QoYXJncywgImFyZ3MuIik7CisgIH0KKworICAvLyBDaGVjayBmb3IgZXJyb3JzCisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IHN0YXR1cyB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXBseV90eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gcmVzfSIgPDwgZW5kbDsKKworICAvLyBIYW5kbGUgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICBpZiAoeGYuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHR0eXBlKHJlcykgPT0gJyIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHJlcyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBTZXQgdGhlIHJlc3VsdCBhbmQgd3JpdGUgdGhlIHJlcGx5CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuc3VjY2VzcyA9IHJlcyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZm5fbmFtZSA8PCAiJywgcmVwbHlfdHlwZSwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8vIFNlcnZpY2UgaGVscGVycwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorICAgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplIChSZWFkKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgbmFtZSA8PCAiID0gaXByb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjpuZXd7fSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCAiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTWFwQmVnaW4oKSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlc2VyaWFsaXplCisgIGluZGVudChvdXQpIDw8ICJmb3IgX2k9MSwiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGFibGUgYnkgYW55IGx1YSB0eXBlCisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwgZWxlbSA8PCAiXSA9ICIgPDwgZWxlbSA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIGxpc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IGludGVnZXIgdmFsdWVzCisgIC8vIExVQSBuYXRpdmVseSBwcm92aWRlcyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byBtYWludGFpbiBhIGxpc3QKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJ0YWJsZS5pbnNlcnQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSAoV3JpdGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEJlZ2luIHdyaXRpbmcKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0dGFibGVfc2l6ZSgiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiIyIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2VyaWFsaXplCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIsXyBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBfLCIgPDwgaXRlciA8PCAiIGluIGlwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZpbmlzaCB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiAgSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6bHVhX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIHJldHVybiAiXG5cbnJlcXVpcmUgJ1RocmlmdCciOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImx1YSIpOworICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl8iOworICB9CisgIHJldHVybiByZWFsX21vZHVsZSArICJfIjsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHN0ZDo6c3RyaW5nIHJldCA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RkOjpzdHJpbmcgcmV0ID0gIiI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHJldCArPSBwcmVmaXggKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK2ZsZF9pdGVyOworICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIHJldCArPSAiLCAiOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgbHVhLAorICAgICJMdWEiLAorICAgICIgICAgb21pdF9yZXF1aXJlczogICBTdXBwcmVzcyBnZW5lcmF0aW9uIG9mIHJlcXVpcmUgJ3NvbWVmaWxlJy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLy9UT0RPOiBjaGVjayBmb3IgaW5kZW50YXRpb24KKy8vVE9ETzogRG8gd2UgbmVlZCBzZXFJZF8gaW4gZ2VuZXJhdGlvbj8KKwordF9uZXRjb3JlX2dlbmVyYXRvcjo6dF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKK3sKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgbnVsbGFibGVfID0gZmFsc2U7CisgICAgaGFzaGNvZGVfID0gZmFsc2U7CisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJudWxsYWJsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaGFzaGNvZGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInVuaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJpYWwiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2NmXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBuZXRjb3JlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5ldGNvcmUiOworfQorCitzdGF0aWMgc3RyaW5nIGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoc3RyaW5nIGNvbnN0JiBmdW5jdGlvbl9uYW1lKQoreworICAgIHN0cmluZyBjb25zdCBhc3luY19lbmQgPSAiQXN5bmMiOworICAgIHNpemVfdCBpID0gZnVuY3Rpb25fbmFtZS5maW5kKGFzeW5jX2VuZCk7CisgICAgaWYgKGkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWUgKyBhc3luY19lbmQ7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWU7Cit9CisKKy8qKgorKiBcYnJpZWYgU2VhcmNoIGFuZCByZXBsYWNlICJfYXJncyIgc3Vic3RyaW5nIGluIHN0cnVjdCBuYW1lIGlmIGV4aXN0IChmb3IgQyMgY2xhc3MgbmFtaW5nKQorKiBccGFyYW0gc3RydWN0X25hbWUKKyogXHJldHVybiBNb2RpZmllZCBzdHJ1Y3QgbmFtZSAoIlN0cnVjdF9hcmdzIiAtPiAiU3RydWN0QXJncyIpIG9yIG9yaWdpbmFsIG5hbWUKKyovCitzdGF0aWMgc3RyaW5nIGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpCit7CisgICAgc3RyaW5nIGFyZ3NfZW5kID0gIl9hcmdzIjsKKyAgICBzaXplX3QgaSA9IHN0cnVjdF9uYW1lLmZpbmQoYXJnc19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaSwgYXJnc19lbmQubGVuZ3RoKCksICJBcmdzIik7CisgICAgICAgIHJldHVybiBuZXdfc3RydWN0X25hbWU7CisgICAgfQorCisgICAgc3RyaW5nIHJlc3VsdF9lbmQgPSAiX3Jlc3VsdCI7CisgICAgc2l6ZV90IGogPSBzdHJ1Y3RfbmFtZS5maW5kKHJlc3VsdF9lbmQpOworICAgIGlmIChqICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaiwgcmVzdWx0X2VuZC5sZW5ndGgoKSwgIlJlc3VsdCIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHJldHVybiBzdHJ1Y3RfbmFtZTsKK30KKworc3RhdGljIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworc3RhdGljIGJvb2wgZmllbGRfaXNfcmVxdWlyZWQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEOyB9CisKK3N0YXRpYyBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkKK3sKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc193Y2ZfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHdjZl87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGhhc2hjb2RlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gc2VyaWFsaXplXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB1bmlvbl87IH0KKworbWFwPHN0cmluZywgaW50PiB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfa2V5d29yZHNfbGlzdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG5ldGNvcmVfa2V5d29yZHM7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKQoreworICAgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgICAvLyBmb3IgdXNhZ2Ugb2YgY3NoYXJwIG5hbWVzcGFjZXMgaW4gdGhyaWZ0IGZpbGVzIChmcm9tIGZpbGVzIGZvciBjc2hhcnApCisgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICBpZiAobmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgIH0KKworICAgIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgICBpZiAoZGlyLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICB9CisKKyAgICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgICBpbml0X2tleXdvcmRzKCk7CisKKyAgICB3aGlsZSAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCkuc2NvcGVfbWVtYmVyKTsKKyAgICB9CisKKyAgICBwdmVyYm9zZSgiLk5FVCBDb3JlIG9wdGlvbnM6XG4iKTsKKyAgICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgc3RyaW5nIHRtcChuYW1lKTsKKyAgICB0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCgqKShpbnQpPih0b2xvd2VyKSk7CisKKyAgICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgICBpZiAobmV0Y29yZV9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gbmV0Y29yZV9rZXl3b3Jkcy5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiQCIgKyBuYW1lOworICAgIH0KKworICAgIC8vIG5vIGNoYW5nZXMgbmVjZXNzYXJ5CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9rZXl3b3JkcygpCit7CisgICAgbmV0Y29yZV9rZXl3b3Jkcy5jbGVhcigpOworCisgICAgLy8gQyMga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJvb2wiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnJlYWsiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNhdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb250aW51ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWNpbWFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVsZWdhdGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZW51bSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHRlcm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmaXhlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yZWFjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImltcGxpY2l0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImluIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9jayJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm5hbWVzcGFjZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuZXciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3BlcmF0b3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm92ZXJyaWRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcmFtcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJldHVybiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZWFsZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YWNrYWxsb2MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RhdGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJ1Y3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3dpdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidGhyb3ciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHlwZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidW5jaGVja2VkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuc2FmZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmlydHVhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZvbGF0aWxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoaWxlIl0gPSAxOworCisgICAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcworICAgIG5ldGNvcmVfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZyb20iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ2V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJncm91cCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibGV0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sieWllbGQiXSA9IDE7CisKKwluZXRjb3JlX2tleXdvcmRzWyJ3aGVuIl0gPSAxOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiI7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG5hbWVzcGFjZXMgKz0gInVzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iOworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjtcbiI7CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkKK3sKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpCit7CisgICAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKQoreworCWludCBpYyA9IGluZGVudF9jb3VudCgpOworICAgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICAgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisJZ2VuZXJhdGVfZW51bShmX2VudW0sIHRlbnVtKTsKKworICAgIGZfZW51bS5jbG9zZSgpOworCWluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX2VudW0iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKG9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkKK3sKKwlvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworCXN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisJZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0ZW51bSk7CisKKwlvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbDsKKwlzY29wZV91cChvdXQpOworCisJdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisJdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKwlmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikKKwl7CisJCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmNfaXRlcik7CisJCWludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisJCW91dCA8PCBpbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisJfQorCisJc2NvcGVfZG93bihvdXQpOworCWVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICBnZW5lcmF0ZV9jb25zdHMoZl9jb25zdHMsIGNvbnN0cyk7CisKKyAgICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIGlmIChjb25zdHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworICAgICAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKmNfaXRlciktPmdldF9uYW1lKCksICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihvdXQsIGNvbnN0cyk7CisgICAgfQorCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworCisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSAqZl9pdGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSogZXR5cGU7CisgICAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwsIGJvb2wgbmVlZHR5cGUpCit7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKQorICAgIHsKKyAgICAgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIG91dCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgICh2b2lkKW5hbWU7CisgICAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICByZW5kZXIgPDwgdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICAgIGZfc3RydWN0LmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaW5fY2xhc3MsIGJvb2wgaXNfcmVzdWx0KQoreworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIGJvb2wgaXNfZmluYWwgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7CisKKyAgICBzdHJpbmcgc2hhcnBfc3RydWN0X25hbWUgPSBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHNoYXJwX3N0cnVjdF9uYW1lIDw8ICIgOiAiOworCisgICAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIlRCYXNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgICAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgICAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICptX2l0ZXIpOworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzX2RlZmF1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKSB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgICAgaWYgKGdlbmVyYXRlX2lzc2V0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXJdIiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKTsKKyAgICAgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKQorICAgICAgICB7CisgICAgICAgICAgICB0ID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odCktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLl8iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAorICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChoYXNfcmVxdWlyZWRfZmllbGRzKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCI7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSA6IHRoaXMoKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBwcm9wX25hbWUoKm1faXRlcikgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgaWYgKGlzX3Jlc3VsdCkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGlmIChoYXNoY29kZV8pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJGYXVsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCBpcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCpmX2l0ZXIpOworICAgICAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoIV9fZmlyc3QpIHsgc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfdW5pb25fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHR1bmlvbi0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CisKKyAgICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgICAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOworCisgICAgZl91bmlvbi5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV91bmlvbi4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIExldCdzIGRlZmluZSB0aGUgY2xhc3MgZmlyc3QKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVEFic3RyYWN0QmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBvYmplY3QgRGF0YSB7IGdldDsgfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIoYm9vbCBpc3NldCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJJc3NldCA9IGlzc2V0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgX2RhdGE7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGRhdGEpIDogYmFzZSh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdGZpZWxkLCAiX2RhdGEiLCB0cnVlLCB0cnVlKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IHRoYXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIG90aGVyID0gdGhhdCBhcyAiIDw8IGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJiYgIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgICAgIH0KKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIpKSkiOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoY29kZSA9IChoYXNoY29kZSAqIDM5NykgXiAiOworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudWxsYWJsZV8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIighX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA/IDAgOiAiOworICAgICAgICB9CisgICAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuR2V0SGFzaENvZGUoKSkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaGFzaGNvZGU7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZTsKKyAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKGZfc2VydmljZSk7CisKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKGZfc2VydmljZSk7CisgICAgZl9zZXJ2aWNlLmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9zZXJ2aWNlLiIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSUFzeW5jIjsKKyAgICB9CisKKyAgICAvL291dCA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRzZXJ2aWNlKTsKKworICAgIGlmICh3Y2ZfKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElBc3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgICAgICBpZiAod2NmXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvdXQsICpmX2l0ZXIpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSAiVEJhc2VDbGllbnQsIElEaXNwb3NhYmxlLCAiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJQXN5bmMiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3RvY29sKSA6IHRoaXMocHJvdG9jb2wsIHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wpIDogYmFzZShpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkiCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uc19pdGVyYXRvcjsKKworICAgIGZvciAoZnVuY3Rpb25zX2l0ZXJhdG9yID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uc19pdGVyYXRvciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25zX2l0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgICAgLy8gYXN5bmMKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZ1bmN0aW9uc19pdGVyYXRvciwgIiIpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiQXJncyI7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikgPDwgIiwgU2VxSWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgICAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuV3JpdGVBc3luYyhPdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKyAgICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gYXdhaXQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWRBc3luYyhJbnB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHJlc3VsdC5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCEoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzLkhhc1ZhbHVlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2Vzcy5WYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3IsICI7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgQXN5bmNQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJVEFzeW5jUHJvY2Vzc29yIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSUFzeW5jIF9pQXN5bmM7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJQXN5bmMgaUFzeW5jKSI7CisKKyAgICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAiIDogYmFzZShpQXN5bmMpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlBc3luYyA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpQXN5bmMpKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiX2lBc3luYyA9IGlBc3luYzsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKGZ1bmN0aW9uX25hbWUpIDw8ICJcIl0gPSAiIDw8IGZ1bmN0aW9uX25hbWUgPDwgIl9Qcm9jZXNzQXN5bmM7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgVGFzayBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBtc2cgPSBhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIFRUeXBlLlN0cnVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgeC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgKHZvaWQpdHNlcnZpY2U7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiX1Byb2Nlc3NBc3luYyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiQXJncyI7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBhcmdzLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImF3YWl0IF9pQXN5bmMuIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJBc3luYygiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIuVmFsdWUiOworICAgICAgICB9CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworCisgICAgaWYgKCFmaXJzdCkKKyAgICB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKworICAgIG91dCA8PCAiY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgICA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShleC5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pCit7CisgICAgLy8gVGhhbmtzIHRvIFRIUklGVC0xNzY4LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHVuaW9uCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBhc3luYyBUYXNrPCIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICI+IFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJ0ZW1wIiwgdHJ1ZSk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKS5UeXBlICE9IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyBlbmQgb2YgZWxzZSBmb3IgVFN0b3AKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiYXdhaXQgaXByb3QuIjsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBhd2FpdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCAiIDw8IHByZWZpeCA8PCAiLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgb2JqOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX21hcCIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZFNldEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudDsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICAgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX2VsZW1lbnQsIGJvb2wgaXNfcHJvcGVydHlsZXNzKQoreworICAgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LiI7CisKKyAgICAgICAgc3RyaW5nIG51bGxhYmxlX25hbWUgPSBudWxsYWJsZV8gJiYgIWlzX2VsZW1lbnQgJiYgIWZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCkgPyBuYW1lICsgIi5WYWx1ZSIgOiBuYW1lOworCisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnlBc3luYygiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nQXN5bmMoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2xBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkxNkFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzJBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTY0QXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZUFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyQXN5bmMoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLCBwcmVmaXguY19zdHIoKSwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KQoreworICAgICh2b2lkKXRzdHJ1Y3Q7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCAiIDw8IHByZWZpeCA8PCAiLldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBCZWdpbkFzeW5jKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgIDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0QmVnaW5Bc3luYyhuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTGlzdEJlZ2luQXN5bmMobmV3IFRMaXN0KCIKKyAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgaXRlciwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCkKK3sKKyAgICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIsIHRydWUpOworICAgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKQoreworICAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCkKK3sKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQsIHN0cmluZyBmaWVsZFByZWZpeCkKK3sKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNQdWJsaWMpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOworICAgIH0KKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKKyAgICBpZiAoKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHx8IGlzX3JlcXVpcmVkKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgaXNfcmVxdWlyZWQpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCAiIHsgZ2V0OyBzZXQ7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgYm9vbCB1c2VfbnVsbGFibGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgeworICAgICAgICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2VfbnVsbGFibGUgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpZiAodXNlX251bGxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB2YWx1ZS5IYXNWYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZS5WYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0cmluZyBjb25zdCYgZnJvbU5hbWUpCit7CisgICAgc3RyaW5nIHN0ciA9IGZyb21OYW1lOworICAgIGlmIChzdHIuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgICAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgICAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkKKyAgICB7CisgICAgICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgICB9CisKKyAgICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICAgIGMgPSBzdHIuYXQoaSk7CisgICAgICAgIGlmICgoJ0EnID4gYyB8fCBjID4gJ1onKSAmJiAoJ2EnID4gYyB8fCBjID4gJ3onKSAmJiAoJzAnID4gYyB8fCBjID4gJzknKSAmJiAnXycgIT0gYykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKQoreworICAgIGlmIChtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICAgIH0KKworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wb3BfYmFjaygpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgbmFtZSkKK3sKKyAgICBpZiAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBhY3RpdmUubWFwcGluZ190YWJsZS5maW5kKG5hbWUpOworICAgICAgICBpZiAoYWN0aXZlLm1hcHBpbmdfdGFibGUuZW5kKCkgIT0gaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkKK3sKKyAgICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMucHVzaF9iYWNrKG1lbWJlcl9tYXBwaW5nX3Njb3BlKCkpOworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIGFjdGl2ZS5zY29wZV9tZW1iZXIgPSBzY29wZTsKKworICAgIC8vIGN1cnJlbnQgQyMgZ2VuZXJhdG9yIHBvbGljeToKKyAgICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKKyAgICAvLyAtIHN0cnVjdCBuYW1lcyBhcmUgdXNlZCBhcyBnaXZlbgorICAgIHN0ZDo6c2V0PHN0cmluZz4gdXNlZF9tZW1iZXJfbmFtZXM7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoc3RydWN0bmFtZSk7CisKKyAgICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7CisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJXcml0ZSIpOworCisgICAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgc3RyaW5nIG5ld25hbWUgPSBwcm9wX25hbWUoKml0ZXIsIHRydWUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKKyAgICAgICAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwgc3RydWN0bmFtZS5jX3N0cigpLCBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG5ld25hbWUgKz0gJ18nOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQgYWx3YXlzLCB0aGlzIGhlbHBzIHVzIHRvIGRldGVjdCBlZGdlIGNhc2VzIGxpa2UKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBzcGVsbGluZ3MgKCJmb28iIGFuZCAiRm9vIikgd2l0aGluIHRoZSBzYW1lIHN0cnVjdAorICAgICAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyIG1hcHBpbmcgJXMgPT4gJXNcbiIsIHN0cnVjdG5hbWUuY19zdHIoKSwgb2xkbmFtZS5jX3N0cigpLCBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgYWN0aXZlLm1hcHBpbmdfdGFibGVbb2xkbmFtZV0gPSBuZXduYW1lOworICAgICAgICAgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KG5ld25hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcpCit7CisgICAgc3RyaW5nIG5hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBpZiAoc3VwcHJlc3NfbWFwcGluZykKKyAgICB7CisgICAgICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuYW1lID0gZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkKK3sKKyAgICAodm9pZClpbl9pbml0OworCisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICB0X3NldCogdHNldCA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIHRfbGlzdCogdGxpc3QgPSBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgeworICAgICAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgICAgIGlmICghbnMuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkKK3sKKyAgICAodm9pZClpbl9jb250YWluZXI7CisgICAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKKyAgICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKQorICAgIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJieXRlW10iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXR1cm4gImJvb2wiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gInNieXRlIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAic2hvcnQiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJpbnQiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJsb25nIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiZG91YmxlIiArIHBvc3RmaXg7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaWYgKGluaXQpCisgICAgeworICAgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpCit7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KQoreworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgc3RyaW5nIHRhc2sgPSAiVGFzayI7CisgICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGFzayArPSAiPCIgKyB0eXBlX25hbWUodHR5cGUpICsgIj4iOworICAgIH0KKworICAgIHN0cmluZyByZXN1bHQgPSB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiOworICAgIHN0cmluZyBhcmdzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgIHJlc3VsdCArPSBhcmdzOworICAgIGlmICghYXJncy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKQoreworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5TZXQiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICAgIH0KKworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKQoreworICAgIGRvY3N0cmluZ19jb21tZW50KG91dCwgIi8vLyA8c3VtbWFyeT4iICsgZW5kbCwgIi8vLyAiLCBjb250ZW50cywgIi8vLyA8L3N1bW1hcnk+IiArIGVuZGwpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpCit7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyBlbmRsICsgIjxzZWVhbHNvIGNyZWY9XCIiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCBzdGF0aWNfY2FzdDx0X2RvYyo+KGZpZWxkKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpCit7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpCisgICAgeworICAgICAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgICAgICBwcyA8PCBlbmRsIDw8ICI8cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKKyAgICAgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgICAgICAgICBzdHIuZXJhc2UocmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLCBzdHIuZW5kKCkpOworICAgICAgICAgICAgICAgIHBzIDw8IHN0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgICAgIH0KKworICAgICAgICBkb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT4iICsgZW5kbCArIHRmdW5jdGlvbi0+Z2V0X2RvYygpICsgIjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpCit7CisgICAgaWYgKGNvbW1lbnRfc3RhcnQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9zdGFydDsKKyAgICB9CisKKyAgICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgc3RkOjppb3NfYmFzZTo6aW4pOworCisgICAgd2hpbGUgKCEoZG9jcy5lb2YoKSB8fCBkb2NzLmZhaWwoKSkpCisgICAgeworICAgICAgICBjaGFyIGxpbmVbMTAyNF07CisgICAgICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKKworICAgICAgICAvLyBKdXN0IHBybnQgYSBuZXdsaW5lIHdoZW4gdGhlIGxpbmUgJiBwcmVmaXggYXJlIGVtcHR5LgorICAgICAgICBpZiAoc3RybGVuKGxpbmUpID09IDAgJiYgbGluZV9wcmVmaXggPT0gIiIgJiYgIWRvY3MuZW9mKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmxlbihsaW5lKSA+IDAgfHwgIWRvY3MuZW9mKCkpCisgICAgICAgIHsgLy8gc2tpcCB0aGUgZW1wdHkgbGFzdCBsaW5lCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb21tZW50X2VuZCAhPSAiIikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBjb21tZW50X2VuZDsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkKK3sKKyAgICBzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKSArICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIG5ldGNvcmUsCisgICAgIkMjIiwKKyAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCisgICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uIHR5cGVzLlxuIgorKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmM5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworY2xhc3MgdF9uZXRjb3JlX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IKK3sKKworICAgIHN0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlKCkgOiBzY29wZV9tZW1iZXIoMCkgeyB9CisgICAgICAgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBtYXBwaW5nX3RhYmxlOworICAgIH07CisKK3B1YmxpYzoKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZyk7CisKKyAgICBib29sIGlzX3djZl9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19oYXNoY29kZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfdW5pb25fZW5hYmxlZCgpIGNvbnN0OworICAgIG1hcDxzdHJpbmcsIGludD4gZ2V0X2tleXdvcmRzX2xpc3QoKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlcworICAgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgICAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bShvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICAgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGluY2x1ZGVJc3NldCA9IHRydWUsIHN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKKyAgICBib29sIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCA9IGZhbHNlLCBib29sIG5lZWR0eXBlID0gZmFsc2UpOworICAgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCA9ICIiLCBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RyaW5nIGl0ZXIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisgICAgdm9pZCBkb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwgY29uc3Qgc3RyaW5nJiBjb250ZW50cywgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCk7CisgICAgdm9pZCBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworICAgIHZvaWQgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCk7CisKKyAgICBzdHJpbmcgbmV0Y29yZV90eXBlX3VzaW5ncygpIGNvbnN0OworICAgIHN0cmluZyBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdDsKKworICAgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb3VudGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlLCBib29sIGluX3BhcmFtID0gZmFsc2UsIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgICAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgICAgc3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAgIHN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIG5hbWVzcGFjZV9kaXJfOworCisgICAgYm9vbCBudWxsYWJsZV87CisgICAgYm9vbCB1bmlvbl87CisgICAgYm9vbCBoYXNoY29kZV87CisgICAgYm9vbCBzZXJpYWxpemVfOworICAgIGJvb2wgd2NmXzsKKworICAgIHN0cmluZyB3Y2ZfbmFtZXNwYWNlXzsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IG5ldGNvcmVfa2V5d29yZHM7CisgICAgdmVjdG9yPG1lbWJlcl9tYXBwaW5nX3Njb3BlPiBtZW1iZXJfbWFwcGluZ19zY29wZXM7CisKKyAgICB2b2lkIGluaXRfa2V5d29yZHMoKTsKKyAgICBzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpOworICAgIHN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICAgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKTsKKyAgICB2b2lkIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSk7CisgICAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjODFiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTc2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6OmlvczsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29jYW1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBvY2FtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tb2NhbWwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBib29sIHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBib29sIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcik7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogbWVtYmVyKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgb2NhbWxfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QgPSBmYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2lfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9pXzsKK307CisKKy8qCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAorICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgorICBpbml0X2dlbmVyYXRvcigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHN0cnVjdHMKKyAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKKyAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgeworICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKKyAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLm1sIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3R5cGVzX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbGkiOworICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RzLm1sIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl90eXBlc19pXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PCAib3BlbiAiCisgICAgICAgICAgICA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiKCpcbiIpICsgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICIgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiKilcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKKyAgcmV0dXJuICJvcGVuIFRocmlmdCI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZW5kbCA8PCAic2lnIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IHZhbHVlIDw8ICJsIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgInwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3IiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgImxldCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgLy8gT0NhbWwgcmVxdWlyZXMgYWxsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQKKyAgb3V0LnNldGYoaW9zOjpzaG93cG9pbnQpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIuIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIHN0cmluZyBjdCA9IHRtcCgiX2MiKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGN0IDw8ICIgPSBuZXcgIiA8PCBjbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgY3QgPDwgIiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKGZfdHlwZXNfaV8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycykgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QgKi8KKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCBfbmV3ID0gT28uY29weSBzZWxmIGluIiA8PCBlbmRsOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG91dCwgKm1faXRlcik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIl9uZXciIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSogdHlwZSwgc3RyaW5nIHdoYXQpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gd2hhdCArIHN0cmluZygiI2NvcHkiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgY29weV9vZl9rID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKKyAgICBzdHJpbmcgY29weV9vZl92ID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgInYiKTsKKworICAgIGlmIChjb3B5X29mX2sgPT0gImsiICYmIGNvcHlfb2ZfdiA9PSAidiIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92ICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKKyAgICAgICAgICAgICArIHdoYXQgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7CisKKyAgICBpZiAoY29weV9vZiA9PSAiayIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIiB0cnVlIikgKyBzdHJpbmcoIikgb2g7IG5oKSAiKSArIHdoYXQKKyAgICAgICAgICAgICArICIpIjsKKyAgICB9CisgIH0KKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAieCIpOworICAgIGlmIChjb3B5X29mICE9ICJ4IikgeworICAgICAgcmV0dXJuIHN0cmluZygiKExpc3QubWFwIChmdW4geCAtPiAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIikgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB3aGF0OworICAgIH0KKyAgfQorICByZXR1cm4gd2hhdDsKK30KKwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICBzdHJpbmcgZ3JhYl9maWVsZCA9IHN0cmluZygic2VsZiNncmFiXyIpICsgbW5hbWU7CisgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKHR5cGUsIGdyYWJfZmllbGQpOworICBpZiAoY29weV9vZiAhPSBncmFiX2ZpZWxkKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICAgIG91dCA8PCAiaWYgXyIgPDwgbW5hbWUgPDwgIiA8PiBOb25lIHRoZW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiOworICAgIH0KKyAgICBvdXQgPDwgIl9uZXcjc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IGNvcHlfb2YgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvdXQsIHRuYW1lLCAoKm1faXRlcikpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG91dCwgbWVtYmVycyk7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdG5hbWUgTmFtZSBvZiB0aGUgcGFyZW50IHN0cnVjdHVyZSBmb3IgdGhlIG1lbWJlcgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworCisgIGluZGVudChvdXQpIDw8ICJ2YWwgbXV0YWJsZSBfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiBvcHRpb24gPSBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gYXNzZXJ0KCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCisgICAgb3V0IDw8ICIgb3B0aW9uID0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBTb21lIF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiIDw8IHggPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIiA8PCBtbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHRuYW1lIDw8ICIuIiA8PCBtbmFtZSA8PCAiXCIpIHwgU29tZSAiCisgICAgICAgICAgICAgICAgPDwgeCA8PCAiIC0+ICIgPDwgeCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHgKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBOb25lIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICI7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBub3QgaGF2ZSB1bmRlZmluZWQgdmFsdWUKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcikgeworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgcmV0dXJuICh2YWwgPyB0cnVlIDogZmFsc2UpOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgZW5jb2RpbmcKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgcmV0dXJuICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Cit9CisKKy8qKgorICogRmlndXJlIG91dCB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgaGFzCisgKiBhIGNoZWFwbHkgY29tcGFyYWJsZSBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK2Jvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcikgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgaWYgKCF2YWwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvLyBCYXNlIHR5cGVzIGFyZSBnZW5lcmFsbHkgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsLT5nZXRfZG91YmxlKCkgPT0gMC4wKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgLy8gSXMgZW1wdHkgbGlzdD8KKyAgICBpZiAodmFsLT5nZXRfbGlzdCgpLnNpemUoKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvYmplY3QgKCdhKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfb2NhbWxfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgb3B0aW9uIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgLT4gdW5pdCIgPDwgZW5kbDsKKyAgICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQorICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwgIiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyB0ID0gdG1wKCJfdCIpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBpbmRlbnQob3V0KSA8PCAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZ25vcmUoaXByb3QjcmVhZFN0cnVjdEJlZ2luKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICIodHJ5IHdoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywiIDw8IHQgPDwgIiwiIDw8IGlkIDw8ICIpID0gaXByb3QjcmVhZEZpZWxkQmVnaW4gaW4iIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCB0IDw8ICIgPSBQcm90b2NvbC5UX1NUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UgKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZCA8PCAiIHdpdGggIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOworICAgIG91dCA8PCAiaWYgIiA8PCB0IDw8ICIgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHN0cik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcCAiIDw8IHQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ8IF8gLT4gIgorICAgICAgPDwgImlwcm90I3NraXAgIiA8PCB0IDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgKCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8IHN0ciA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU3RydWN0QmVnaW4gXCIiIDw8IG5hbWUgPDwgIlwiOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIHRtZW1iZXIgPSAoKmZfaXRlcik7CisgICAgc3RyaW5nIG1uYW1lID0gIl8iICsgZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBfdjsKKworICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICBfdiA9ICJfdiI7CisgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgIiAtPiAoKSB8ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgX3YgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdiA9IG1uYW1lOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIjsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikpIHsKKyAgICAgICAgb3V0IDw8ICJOb25lIC0+ICgpIjsKKworICAgICAgICBpZiAoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCisgICAgICAgICAgICAgIDw8ICIgLT4gKCkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIF92ID0gIl92IjsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiIgPDwgdG1lbWJlci0+Z2V0X25hbWUoKSA8PCAiXCIsIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgdG1lbWJlci0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVGaWVsZFN0b3A7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIubWwiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1saSI7CisgIGZfc2VydmljZV9pXy5vcGVuKGZfc2VydmljZV9pX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvKiBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorICAqLworICBmX3NlcnZpY2VfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2lfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX3NlcnZpY2VfaV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgOiIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIE9DYW1sLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgorICpUaGlzIGlzIGJlY2F1c2UKKyAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm9uZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgY2xpZW50IDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+ICIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAibWV0aG9kICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZiNzZW5kXyIgPDwgZnVubmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlByb3RvY29sLk9ORVdBWSIgOiAiUHJvdG9jb2wuQ0FMTCIpIDw8ICIsIHNlcWlkKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mjc2V0XyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgcHJpdmF0ZSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiA9IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdCNyZWFkTWVzc2FnZUJlZ2luIGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoaWYgbXR5cGUgPSBQcm90b2NvbC5FWENFUFRJT04gdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5yZWFkIGlwcm90IGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIChpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICByYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgeCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UgKCkpOyIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyByZXMgPSAiXyI7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICByZXMgPSAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHJlcyA8PCAiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggcmVzdWx0I2dldF9zdWNjZXNzIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+ICgiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBfdiAtPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJhaXNlICgiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIF92KSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJyYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgKEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLk1JU1NJTkdfUkVTVUxUIFwiIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIChoYW5kbGVyIDogaWZhY2UpID0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCAoc2VsZikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIChoYW5kbGVyIDo+ICIgKyBleHRlbmRzICsgIi5pZmFjZSkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBwcm9jZXNzTWFwID0gSGFzaHRibC5jcmVhdGUgIiA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV9pXykKKyAgICAgIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByb2Nlc3MgaXByb3Qgb3Byb3QgPSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCBwcm9jZXNzIDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+IGJvb2wiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgSGFzaHRibC5tZW0gcHJvY2Vzc01hcCBuYW1lIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAoSGFzaHRibC5maW5kIHByb2Nlc3NNYXAgbmFtZSkgKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImVsc2UgKCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNza2lwKFByb3RvY29sLlRfU1RSVUNUKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLlVOS05PV05fTUVUSE9EIChcIlVua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiBcIl5uYW1lKSBpbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgUHJvdG9jb2wuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgICB4I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaXRpYWxpemVyIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiBzZWxmI3Byb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBhcmdzID0gImFyZ3MiOworICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7CisgICAgYXJncyA9ICJfIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IGFyZ3MgPDwgIiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKHRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQjc2V0X3N1Y2Nlc3MgIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXJncyNnZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInwgIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQjc2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBQcm90b2NvbC5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3dyaXRlIG9wcm90OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjc2V0XyIgPDwgbmFtZSA8PCAiICI7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgb3V0IDw8ICJpcHJvdCMiOworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgInJlYWRTdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgb3V0IDw8ICIoIiA8PCBlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7CisgIH0KKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIG91dCA8PCAiKCIgPDwgcHJlZml4IDw8ICJyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisgIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF92ID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgY29uIDw8ICIgX2sgX3YiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICIgPDwgY29uIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIiA8PCBzaXplIDw8ICIgKGZ1biBfIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBuYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCMiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgZW5hbWUgPDwgIi50b19pICIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorICBvdXQgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3dyaXRlKG9wcm90KSI7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIjsKKyAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCI7CisgICAgb3V0IDw8ICJMaXN0Lmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJfa2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoIl92aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGtpdGVyIDw8ICIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiBmdW4gXyAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJMaXN0Lml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEVuZCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RFbmQiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZSBhcmdzJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZCwgYm9vbCBvcHRpb25zKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChvcHRpb25zKQorICAgICAgcmVzdWx0ICs9ICIgb3B0aW9uIjsKKyAgICByZXN1bHQgKz0gIiAtPiAiOworICB9CisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKSB7CisgICAgcmVzdWx0ICs9ICJ1bml0IC0+ICI7CisgIH0KKyAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIG9jYW1sIHR5cGUKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInVuaXQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiSW50MzIudCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIkludDY0LnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkgKyAiLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSArICIsIiArIHJlbmRlcl9vY2FtbF90eXBlKHZ0eXBlKSArICIpIEhhc2h0YmwudCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIigiICsgcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIixib29sKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIiBsaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihvY2FtbCwgIk9DYW1sIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGE1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICisjZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qKgorICogQ2xhc3Mgd2l0aCB1dGlsaXR5IG1ldGhvZHMgc2hhcmVkIGFjcm9zcyBjb21tb24gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlcy4KKyAqIFNwZWNpZmljYWxseSwgbW9zdCBvZiB0aGlzIHN0dWZmIGlzIGZvciBDKysvSmF2YS4KKyAqCisgKi8KK2NsYXNzIHRfb29wX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkge30KKworICAvKioKKyAgICogU2NvcGluZywgdXNpbmcgY3VybHkgYnJhY2VzIQorICAgKi8KKworICB2b2lkIHNjb3BlX3VwKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgc2NvcGVfZG93bihzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHVwY2FzZV9zdHJpbmcoc3RkOjpzdHJpbmcgb3JpZ2luYWwpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShvcmlnaW5hbC5iZWdpbigpLCBvcmlnaW5hbC5lbmQoKSwgb3JpZ2luYWwuYmVnaW4oKSwgKGludCAoKikoaW50KSl0b3VwcGVyKTsKKyAgICByZXR1cm4gb3JpZ2luYWw7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgICAgc3RkOjpzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY29udGVudHMpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgICAgfQorICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjRhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTY4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUEVSTCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9wZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSksIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfKGZhbHNlKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1wZXJsIjsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgICBlc2NhcGVfWydAJ10gPSAiXFxAIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKKyAgfQorCisgIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgZGlycy5wdXNoX2JhY2sobnMpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIHJlc3VsdCArPSAiOjoiOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgeworICAgIHN0ZDo6c3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICAgIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7CisgICAgfQorICAgIHJldHVybiBvdXRkaXI7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWxwZXJzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIGJvb2wgZl90eXBlc191c2VfaW5jbHVkZXNfZW1pdHRlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIE1LRElSKG91dGRpci5jX3N0cigpKTsKKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArICJUeXBlcy5wbSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpciArICJDb25zdGFudHMucG0iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAiQ29uc3RhbnRzOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgcGVybF9pbmNsdWRlcygpIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIGluYzsKKworICBpbmMgID0gInVzZSA1LjEwLjA7XG4iOworICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOworICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6RXhjZXB0aW9uO1xuIjsKKyAgaW5jICs9ICJ1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6VHlwZTtcblxuIjsKKworICByZXR1cm4gaW5jOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7CisgIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICItPm5ldyh7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPT4gMSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV91c2VfaW5jbHVkZXMoZl90eXBlc18sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBFUkwKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiO1xuIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7CisgIH0KKworICAvLyBDcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcworICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikgKTtcbiI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBuZXcoKQorICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8ICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiCisgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9XG5cbiI7CisKKyAgb3V0IDw8ICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiByZWFkIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFxcJGZuYW1lLCBcXCRmdHlwZSwgXFwkZmlkKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7CisgIH0KKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorCisgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdXNlIGNsYXVzZXMgZm9yIGluY2x1ZGVkIGVudGl0aWVzCisgKgorICogQHBhcmFtICBvcyAgICAgICBUaGUgb3V0cHV0IHN0cmVhbQorICogQHBhcmFtICBkb25lICAgICBBIGZsYWcgcmVmZXJlbmNlIHRvIGRlYm91bmNlIHRoZSBhY3Rpb24KKyAqIEBwYXJhbSAgdHlwZSAgICAgVGhlIHR5cGUgYmVpbmcgcHJvY2Vzc2VkCisgKiBAcGFyYW0gIHNlbGZpc2ggIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHR5cGVzIHNob3VsZCBiZSAidXNlImQgYXMgd2VsbC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91c2VfaW5jbHVkZXMoc3RkOjpvc3RyZWFtJiBvcywgYm9vbCYgZG9uZSwgdF90eXBlICp0eXBlLCBib29sIHNlbGZpc2gpIHsKKyAgdF9wcm9ncmFtICpjdXJyZW50ID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKGN1cnJlbnQgJiYgIWRvbmUpIHsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgY3VyckluYyA9IGN1cnJlbnQtPmdldF9pbmNsdWRlcygpOworICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgbnVtSW5jID0gY3VyckluYy5zaXplKCk7CisgICAgaWYgKHNlbGZpc2gpIHsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShjdXJyZW50KSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1JbmM7ICsraSkgeworICAgICAgdF9wcm9ncmFtKiBpbmNQcm9ncmFtID0gY3VyckluYy5hdChpKTsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShpbmNQcm9ncmFtKSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBvcyA8PCBlbmRsOworICAgIGRvbmUgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5wbSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBlcmxfaW5jbHVkZXMoKTsKKworICBib29sIGRvbmUgPSBmYWxzZTsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfc2VydmljZV8sIGRvbmUsIHRzZXJ2aWNlLCB0cnVlKTsKKworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpIDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBFUkwpCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgIjE7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIlByb2Nlc3Nvcik7IjsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRoYW5kbGVyKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2hhbmRsZXJ9ID0gJGhhbmRsZXI7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3MgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lICA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkbXR5cGUgID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbDsKKworICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKCEkc2VsZi0+Y2FuKCRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5za2lwKFRocmlmdDo6VFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHggPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgIlRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRzZWxmLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDE7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIKKyAgICAgICAgICAgICAgICAgPDwgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIicpICl7ICIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gY2F0Y2gtYWxsIGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgKFRIUklGVC0zMTkxKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkQCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9fiBzL15cXHMrfFxccyskLy9nOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRlcnIgPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KFwiVW5leHBlY3RlZCBFeGNlcHRpb246IFwiIC4gJEAsIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRlcnItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRAID0gdW5kZWY7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0aGUgcmVwbHkKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7CisgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKKyAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICsgIklmKTsiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBleHRlbmRzX3MtPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJSZXN0KTsiOworICB9CisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxCisgICAgICAgICAgICAgICAgIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIgorICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gXFxAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PCAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCAkc2VsZi0+e3NlcWlkfSk7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQorICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7CisgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwga3R5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwga3R5cGUgPDwgIiwgXFwkIiA8PCB2dHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKG15ICQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBrZXkgPDwgIn0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihrZXlzICV7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlKCBteSAoJCIgPDwga2l0ZXIgPDwgIiwkIiA8PCB2aXRlciA8PCAiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCBteSAkIiA8PCBpdGVyIDw8ICIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICItPm5ldygpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJ7XG4iOworICBzdHIgKz0gIiAgbXkgJHNlbGYgPSBzaGlmdDtcbiI7CisKKyAgLy8gTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTQ0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjZGVmaW5lIE5TR0xPQkFMIChuc2dsb2JhbF8uc2l6ZSgpID8gbnNnbG9iYWxfIDogIiIpCisjZGVmaW5lIE5TR0xPQkFMX0EgKCJcXCIgKyBOU0dMT0JBTCkKKyNkZWZpbmUgTlNHTE9CQUxfQiAoTlNHTE9CQUwgKyAiXFwiKQorI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKKworLyoqCisgKiBQSFAgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9waHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGJpbmFyeV9pbmxpbmVfID0gZmFsc2U7CisgICAgcmVzdF8gPSBmYWxzZTsKKyAgICBwaHBzXyA9IGZhbHNlOworICAgIG9vcF8gPSBmYWxzZTsKKyAgICB2YWxpZGF0ZV8gPSBmYWxzZTsKKyAgICBqc29uX3NlcmlhbGl6YWJsZV8gPSBmYWxzZTsKKyAgICBuc2dsb2JhbF8gPSAiIjsgLy8gYnkgZGVmYXVsdCBnbG9iYWwgbmFtZXNwYWNlIGlzIGVtcHR5CisgICAgY2xhc3NtYXBfID0gZmFsc2U7CisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5saW5lZCIpID09IDApIHsKKyAgICAgICAgYmluYXJ5X2lubGluZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJyZXN0IikgPT0gMCkgeworICAgICAgICByZXN0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcnZlciIpID09IDApIHsKKyAgICAgICAgcGhwc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJvb3AiKSA9PSAwKSB7CisgICAgICAgIG9vcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ2YWxpZGF0ZSIpID09IDApIHsKKyAgICAgICAgdmFsaWRhdGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgianNvbiIpID09IDApIHsKKyAgICAgICAganNvbl9zZXJpYWxpemFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnNnbG9iYWwiKSA9PSAwKSB7CisgICAgICAgIG5zZ2xvYmFsXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiY2xhc3NtYXAiKSA9PSAwKSB7CisgICAgICAgIGNsYXNzbWFwXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInBzcjQiKSA9PSAwKSB7CisgICAgICAgIGlmKGNsYXNzbWFwXyl7CisgICAgICAgICAgdGhyb3cgInBzcjQgYW5kIGNsYXNzbWFwIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwd2FybmluZygwLCAicHNyNCBpcyBkZWZhdWx0IG9wdGlvbiEgbmVlZG4ndCBhZGQgcHNyNCBvcHRpb24hXG4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHBocDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgICAiOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKTsKKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgYm9vbCBuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGludCBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdGQ6Om9zdHJlYW0mIGZpbGUpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGhwX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBvYmogPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19jYXN0KHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fcGhwZG9jKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgcGhwX2lzX3NjYWxhcih0X3R5cGUgKnR0eXBlKSB7CisgICAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZV9iYXNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwIik7CisgICAgY29uc3QgY2hhciogZGVsaW1pdGVyID0gIlxcIjsKKyAgICBzaXplX3QgcG9zaXRpb24gPSBucy5maW5kKCcuJyk7CisgICAgd2hpbGUgKHBvc2l0aW9uICE9IHN0cmluZzo6bnBvcykgeworICAgICAgbnMucmVwbGFjZShwb3NpdGlvbiwgMSwgZGVsaW1pdGVyKTsKKyAgICAgIHBvc2l0aW9uID0gbnMuZmluZCgnLicsIHBvc2l0aW9uICsgMSk7CisgICAgfQorICAgIHJldHVybiBuczsKKyAgfQorCisgIC8vIGdlbmVyYWwgdXNlIG5hbWVzcGFjZSBwcmVmaXhpbmc6IFxteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KKyAgc3RyaW5nIHBocF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0FCIDogTlNHTE9CQUxfQikgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyByZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiBhIGZpbGU6CisgIC8vIGdsb2JhbFxuc1xzdWJcbnMgb3IgZ2xvYmFsXG5zIG9yIHN1YlxucworICBzdHJpbmcgcGhwX25hbWVzcGFjZV9zdWZmaXgoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworCisgICAgcmV0dXJuIE5TR0xPQkFMCisgICAgICArIChucy5zaXplKCkgJiYgTlNHTE9CQUwuc2l6ZSgpID8gIlxcIiA6ICIiKQorICAgICAgKyBuczsKKyAgfQorCisgIC8vIGFkZCBhIGRpcmVjdG9yeSB0byBhbHJlYWR5IGV4aXN0aW5nIG5hbWVzcGFjZQorICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kaXJlY3Rvcnkoc3RyaW5nIGRpcmVjdG9yeSwgYm9vbCBlbmQgPSB0cnVlKSB7CisgICAgKHZvaWQpZGlyZWN0b3J5OworICAgIGlmIChlbmQpIHsKKyAgICAgIHJldHVybiAiOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0KKworICAvLyB3cml0aW5nIGFuIGF1dGxvYWQgaWRlbnRpZmllciBpbnRvIGdsb2JhO2xzOiBteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfYXV0b2xvYWQoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7CisgICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKKyAgfQorCisgIC8vIGRlY2xhcmluZyBhIHR5cGU6IHR5cGVuYW1lIG9yIG15X25hbWVzcGFjZV90eXBlbmFtZQorICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0X3R5cGUqIHQpIHsgcmV0dXJuIHQtPmdldF9uYW1lKCk7IH0KKworICBzdGQ6OnN0cmluZyBwaHBfcGF0aCh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocC5wYXRoIik7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSB0aGUgamF2YS1zdHlsZSBuYW1lc3BhY2UgaW50byBhIHBhdGguCisgICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBucy5iZWdpbigpOyBpdCAhPSBucy5lbmQoKTsgKytpdCkgeworICAgICAgaWYgKCppdCA9PSAnLicpIHsKKyAgICAgICAgKml0ID0gJy8nOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBucyArICcvJzsKKyAgfQorCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gY2xhc3NfbWV0aG9kIGludG8gQ2xhc3NNZXRob2QKKyAgICoKKyAgICogQHBhcmFtIHN0cgorICAgKiBAcmV0dXJuIHN0aXJuZworICAgKi8KKyAgc3RyaW5nIGNsYXNzaWZ5KHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgY2xhc3NlID0gIiI7CisKKyAgICB2ZWN0b3I8c3RyaW5nPiB4ID0gc3BsaXQoc3RyLCAnXycpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7CisgICAgICBjbGFzc2UgPSBjbGFzc2UgKyBjYXBpdGFsaXplKHhbaV0pOworICAgIH0KKworICAgIHJldHVybiBjbGFzc2U7CisgIH0KKworICAvKioKKyAgICogU3BsaXQgbWV0aG9kCisgICAqIEBwYXJhbSBzCisgICAqIEBwYXJhbSBkZWxpbQorICAgKiBAcGFyYW0gZWxlbXMKKyAgICogQHJldHVybgorICAgKi8KKyAgdmVjdG9yPHN0cmluZz4mIHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSwgdmVjdG9yPHN0cmluZz4mIGVsZW1zKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzKHMpOworICAgIHN0cmluZyBpdGVtOworCisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKworICAgIHJldHVybiBlbGVtczsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSkgeworICAgIHZlY3RvcjxzdHJpbmc+IGVsZW1zOworCisgICAgcmV0dXJuIHNwbGl0KHMsIGRlbGltLCBlbGVtcyk7CisgIH0KKworICAvKioKKyAgICogQ2FwaXRhbGl6ZSBtZXRob2QKKyAgICogQHBhcmFtIHN0cgorICAgKiBAcmV0dXJuCisgICAqLworICBzdHJpbmcgY2FwaXRhbGl6ZShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nOjppdGVyYXRvciBpdChzdHIuYmVnaW4oKSk7CisKKyAgICBpZiAoaXQgIT0gc3RyLmVuZCgpKQorICAgICAgc3RyWzBdID0gdG91cHBlcigodW5zaWduZWQgY2hhcilzdHJbMF0pOworCisgICAgLy8gICAgd2hpbGUoKytpdCAhPSBzdHIuZW5kKCkpCisgICAgLy8gICAgeworICAgIC8vICAgICAgKml0ID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqaXQpOworICAgIC8vICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIC8qKgorICAgKiBHZW5lcmF0ZSBwcm90b2NvbC1pbmRlcGVuZGVudCB0ZW1wbGF0ZT8gT3IgQmluYXJ5IGlubGluZSBjb2RlPworICAgKi8KKyAgYm9vbCBiaW5hcnlfaW5saW5lXzsKKworICAvKioKKyAgICogR2VuZXJhdGUgYSBSRVNUIGhhbmRsZXIgY2xhc3MKKyAgICovCisgIGJvb2wgcmVzdF87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIHN0dWJzIGZvciBhIFBIUCBzZXJ2ZXIKKyAgICovCisgIGJvb2wgcGhwc187CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIE9PUCBiYXNlIGNsYXNzIFRCYXNlCisgICAqLworICBib29sIG9vcF87CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgb2xkLXN0eWxlIFBIUCBmaWxlIHRvIHVzZSBjbGFzc21hcCBhdXRvbG9hZGluZworICAgKi8KKyAgYm9vbCBjbGFzc21hcF87CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgdmFsaWRhdG9yIGNvZGUKKyAgICovCisgIGJvb2wgdmFsaWRhdGVfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcworICAgKi8KKyAgYm9vbCBqc29uX3NlcmlhbGl6YWJsZV87CisKKyAgLyoqCisgICAqIEdsb2JhbCBuYW1lc3BhY2UgZm9yIFBIUCA1LjMKKyAgICovCisgIHN0ZDo6c3RyaW5nIG5zZ2xvYmFsXzsKK307CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInBhdGgiOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSBSZWFsIGRpcmVjdG9yeSBOYW1lc3BhY2VzCisgIHZlY3RvcjxzdHJpbmc+IE5TeCA9IHNwbGl0KHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpLCAnXFwnKTsKKyAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5TeC5zaXplKCk7ICsraSkgeworICAgIHBhY2thZ2VfZGlyXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIE5TeFtpXSArICIvIjsKKyAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7CisgIH0KKworICAvLyBQcmVwYXJlIG91dHB1dCBmaWxlIGZvciBhbGwgdGhlIHR5cGVzIGluIGNsYXNzbWFwIG1vZGUKKyAgaWYgKGNsYXNzbWFwXykgeworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgIlR5cGVzLnBocCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl90eXBlc18pOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHBocCBpbmNsdWRlcworICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpwaHBfaW5jbHVkZXMoKSB7CisgIHN0cmluZyBpbmNsdWRlcyA9ICJ1c2UgVGhyaWZ0XFxCYXNlXFxUQmFzZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRUeXBlO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcVHlwZVxcVE1lc3NhZ2VUeXBlO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxURXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb247XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxQcm90b2NvbFxcVFByb3RvY29sO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb247XG4iOworCisgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKKyAgICBpbmNsdWRlcyArPSAidXNlIEpzb25TZXJpYWxpemFibGU7XG4iCisgICAgICAgICAgICAgICAgInVzZSBzdGRDbGFzcztcbiI7CisgIH0KKworICByZXR1cm4gaW5jbHVkZXM7Cit9CisKKy8qKgorICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgICAgZl90eXBlc18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHNlcnZpY2UgaGVhZGVyIGNvbnRhaW5zIG5hbWVzcGFjZSBzdWZmaXggYW5kIGluY2x1ZGVzIGluc2lkZSBmaWxlIHNwZWNpZmllZAorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKSB7CisgIGZpbGUgPDwgIjw/cGhwIiA8PCBlbmRsOworICBpZiAoIXBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7CisgICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworICB9CisgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CisKKyAgZmlsZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBwcm9ncmFtIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7CisgICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZmlsZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKKworICBmaWxlIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKKyAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX2VudW0gPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyB0ZW51bS0+Z2V0X25hbWUoKSArICIucGhwIjsKKyAgICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihmX2VudW0pOworICB9CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKKyAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKKyAgLy8gYSBkb3duZXIuCisgIGdlbmVyYXRlX3BocF9kb2MoZl9lbnVtLCB0ZW51bSk7CisgIGZfZW51bSA8PCAiZmluYWwgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGdlbmVyYXRlX3BocF9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCB2YWx1ZSA8PCAiID0+ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9lbnVtIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9lbnVtLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBjb25zdGFudCBjbGFzcworICoKKyAqIE92ZXJyaWRlIHRoZSBvbmUgZnJvbSB0X2dlbmVyYXRvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICAvLyBDcmVhdGUgY2xhc3Mgb25seSBpZiBuZWVkZWQKKyAgaWYgKGNvbnN0cy5zaXplKCkgPiAwKSB7CisKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX2NvbnN0cyA9IGZfdHlwZXNfOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJDb25zdGFudC5waHAiOworICAgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICAgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9jb25zdHMpOworICAgIH0KKyAgICBmX2NvbnN0cyA8PCAiZmluYWwgY2xhc3MgQ29uc3RhbnQgZXh0ZW5kcyBcXFRocmlmdFxcVHlwZVxcVENvbnN0YW50Ijw8IGVuZGwKKyAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gQ3JlYXRlIHN0YXRpYyBwcm9wZXJ0eQorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAic3RhdGljIHByb3RlY3RlZCAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENyZWF0ZSBpbml0IGZ1bmN0aW9uCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBmX2NvbnN0cyA8PCBlbmRsOworCisgICAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpbml0XyIgPDwgbmFtZSA8PCAiKCkiIDw8ZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAicmV0dXJuICI7CisgICAgICBnZW5lcmF0ZV9waHBfZG9jKGZfY29uc3RzLCAqY19pdGVyKTsKKyAgICAgIGZfY29uc3RzIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgZl9jb25zdHMgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9jb25zdHMgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIGZfY29uc3RzLmNsb3NlKCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIihhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIG91dCA8PCAiID0+IHRydWUiOworICAgICAgfQorICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3QgPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfc3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zdHJ1Y3QuY2xvc2UoKTsKKyAgfQorfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKyAgaW5kZW50KG91dCkgPDwgIid0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh0KSA8PCAiLCIgPDwgZW5kbDsKKworICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpKSB7CisgICAgLy8gTm9vcCwgdHlwZSBpcyBhbGwgd2UgbmVlZAorICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ2NsYXNzJyA9PiAnIiA8PCBwaHBfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCkgPDwgIicsIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCkpOworICAgIHRfdHlwZSogdnR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgIidrdHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oa3R5cGUpIDw8ICIsIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIndnR5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKSA8PCAiLCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ2tleScgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBrdHlwZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIid2YWwnID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdnR5cGUpOworICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSB8fCB0LT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiJ2V0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHN0cnVjdCBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSwgd2hpY2ggZnVsbHkgcXVhbGlmaWVzIGVub3VnaAorICogdHlwZSBpbmZvcm1hdGlvbiB0byBnZW5lcmFsaXplIHNlcmlhbGl6YXRpb24gcm91dGluZXMuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHB1YmxpYyAkX1RTUEVDID0gYXJyYXkoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGluZGVudChvdXQpIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIidpc1JlcXVpcmVkJyA9PiAiIDw8ICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEID8gInRydWUiIDogImZhbHNlIikgPDwgIiwiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHQpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAorICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQorICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c3RydWN0KTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIGV4dGVuZHMgIgorICAgICAgICA8PCAiVEV4Y2VwdGlvbiI7CisgIH0gZWxzZSBpZiAob29wXykgeworICAgIG91dCA8PCAiIGV4dGVuZHMgIgorICAgICAgICA8PCAiVEJhc2UiOworICB9CisgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKKyAgICBvdXQgPDwgIiBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUiOworICB9CisgIG91dCA8PCBlbmRsCisgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGF0aWMgcHVibGljICRpc1ZhbGlkYXRlID0gIiA8PCAodmFsaWRhdGVfID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3V0LCB0c3RydWN0KTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSAibnVsbCI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBnZW5lcmF0ZV9waHBfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKKyAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHMgPSBudWxsIiA6ICIiOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIjw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAob29wXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXNzZXQoJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXSkpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChvb3BfKSB7CisgICAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHRtcCA9ICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0bXA7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmaWQgPSAwOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIHRfZmllbGQgZmZ0eXBlKGdfdHlwZV9pOCwgImZ0eXBlIik7CisgICAgdF9maWVsZCBmZmlkKGdfdHlwZV9pMTYsICJmaWQiKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZnR5cGUpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSAiCisgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKKyAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIgorICAgICAgICAgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoICgkZmlkKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9IFRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gIgorICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCYkb3V0cHV0KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChvb3BfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZXhwZWN0OworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZXhwZWN0ID0gImFycmF5IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBleHBlY3QgPSAib2JqZWN0IjsKKyAgICB9CisgICAgaWYgKCFleHBlY3QuZW1wdHkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzXyIgPDwgZXhwZWN0IDw8ICIoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSB7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdHlwZSBpbiBzdHJ1Y3R1cmUuJywgIgorICAgICAgICAgIDw8ICJUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKKyAgICAgICAgPDwgIlRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvclJlYWQiLCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvcldyaXRlIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZV9tb2RlKSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgbWV0aG9kX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICAgICAgIHx8IChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQgJiYgd3JpdGVfbW9kZSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgkdGhpcy0+IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID09PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ1JlcXVpcmVkIGZpZWxkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvcldyaXRlKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIiRqc29uID0gbmV3IHN0ZENsYXNzOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgIGlmICghKGtleV90eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBrZXlfdHlwZS0+aXNfZW51bSgpKSkgeworICAgICAgICAgIC8vIEpTT04gb2JqZWN0IGtleXMgbXVzdCBiZSBzdHJpbmdzLiBQSFAncyBqc29uX2VuY29kZSgpCisgICAgICAgICAgLy8gZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGFueSBzY2FsYXIga2V5IHRvIHN0cmluZ3MsIGJ1dAorICAgICAgICAgIC8vIHdlIHNraXAgdGhyaWZ0IG1hcHMgd2l0aCBub24tc2NhbGFyIGtleXMuCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgbmFtZSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJGpzb24tPiIgPDwgbmFtZSA8PCAiID0gIjsKKyAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICBvdXQgPDwgIihvYmplY3QpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB0eXBlX3RvX2Nhc3QodHlwZSk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiR0aGlzLT4iIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAkanNvbjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK2ludCB0X3BocF9nZW5lcmF0b3I6OmdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyhjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsIGJvb2wgd3JpdGVfbW9kZSkgeworICBpbnQgbnVtX3JlcSA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICAgICAgIHx8ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7CisgICAgICAgICsrbnVtX3JlcTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9yZXE7Cit9CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0ICYmICF0c3RydWN0LT5pc191bmlvbigpCisgICAgICAgICAgJiYgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRydWUpID4gMCk7Cit9CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIHJldHVybiAodmFsaWRhdGVfICYmICFpc19yZXN1bHQKKyAgICAgICAgICAmJiAoZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGZhbHNlKSA+IDApKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmKGNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiLnBocCI7CisgICAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgaWYgKHJlc3RfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgfQorICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGlmIChwaHBzXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGlmKGNsYXNzbWFwXykgeworICAgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9wcm9jZXNzb3IgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3Nvci5waHAiOworICAgIGZfc2VydmljZV9wcm9jZXNzb3Iub3BlbihmX3NlcnZpY2VfcHJvY2Vzc29yX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9wcm9jZXNzb3IpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaGFuZGxlcl8gPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikiPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmhhbmRsZXJfID0gJGhhbmRsZXI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3QoJGhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIHRfZmllbGQgZmZuYW1lKGdfdHlwZV9zdHJpbmcsICJmbmFtZSIpOworICAgIHRfZmllbGQgZm10eXBlKGdfdHlwZV9pOCwgIm10eXBlIik7CisgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9wcm9jZXNzb3IsICZmZm5hbWUsICIiLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfcHJvY2Vzc29yLCAmZm10eXBlLCAiIiwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX3Byb2Nlc3NvciwgJmZzZXFpZCwgIiIsIHRydWUpOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+c2tpcCgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oZl9zZXJ2aWNlX3Byb2Nlc3NvciwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJGlucHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbicpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4oIiA8PGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCBhcmdzbmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPmlzU3RyaWN0UmVhZCgpIiA8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8Iik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgIiRyZXN1bHQtPnN1Y2Nlc3MgPSAiOworICB9CisgIG91dCA8PCAiJHRoaXMtPmhhbmRsZXJfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorICAgIG91dCA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoICgiCisgICAgICAgICAgICAgICAgIDw8IHBocF9uYW1lc3BhY2UoZ2V0X3RydWVfdHlwZSgoKnhfaXRlciktPmdldF90eXBlKCkpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRvdXRwdXQgaW5zdGFuY2VvZiAiCisgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQsIjw8ZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTw8ICInLCIgPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSwiPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJHNlcWlkLCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSI8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiCisgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Zmx1c2goKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3RfZGVmaW5pdGlvbiA9IGZfc2VydmljZV87CisgIGlmIChjbGFzc21hcF8pIHsKKyAgICBmX3N0cnVjdF9kZWZpbml0aW9uIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfc3RydWN0X2RlZmluaXRpb25fbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lICsgIi5waHAiOworICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5vcGVuKGZfc3RydWN0X2RlZmluaXRpb25fbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3N0cnVjdF9kZWZpbml0aW9uKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3RfZGVmaW5pdGlvbiwgdHMpOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX3N0cnVjdF9kZWZpbml0aW9uLmNsb3NlKCk7CisgICAgfQorCisgICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3RfaGVscGVyID0gZl9zZXJ2aWNlXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfc3RydWN0X2hlbHBlcl9uYW1lID0gcGFja2FnZV9kaXJfICsgcmVzdWx0LmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgICBmX3N0cnVjdF9oZWxwZXIub3BlbihmX3N0cnVjdF9oZWxwZXJfbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3N0cnVjdF9oZWxwZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3RfaGVscGVyLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIGZfc3RydWN0X2hlbHBlci5jbG9zZSgpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9pbnRlcmZhY2UgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIklmLnBocCI7CisgICAgZl9zZXJ2aWNlX2ludGVyZmFjZS5vcGVuKGZfc2VydmljZV9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX2ludGVyZmFjZSk7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJJZiI7CisgIH0KKyAgZ2VuZXJhdGVfcGhwX2RvYyhmX3NlcnZpY2VfaW50ZXJmYWNlLCB0c2VydmljZSk7CisgIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgImludGVyZmFjZSAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlX2ludGVyZmFjZSwgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV9pbnRlcmZhY2UpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2ludGVyZmFjZSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGludGVyZmFjZSBmaWxlCisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX2ludGVyZmFjZS5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9yZXN0ID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3Jlc3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiUmVzdC5waHAiOworICAgIGZfc2VydmljZV9yZXN0Lm9wZW4oZl9zZXJ2aWNlX3Jlc3RfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX3Jlc3QpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7CisgIH0KKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdCIgPDwgZXh0ZW5kc19pZiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbXBsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgJHRoaXMtPmltcGxfID0gJGltcGw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV9yZXN0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOworICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBjYXN0IDw8ICIoIWVtcHR5KCIgPDwgcmVxCisgICAgICAgICAgICAgICAgICAgPDwgIikgJiYgKCIgPDwgcmVxIDw8ICIgIT09ICdmYWxzZScpKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIKKyAgICAgICAgICAgICAgICAgICA8PCBjYXN0IDw8IHJlcSA8PCAiIDogbnVsbDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBleHBsb2RlKCcsJywgJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX21hcCgpIHx8IGF0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0ganNvbl9kZWNvZGUoJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICJpZiAoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR0aGlzLT5pbXBsXy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgZmFsc2UpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfcmVzdCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcmVzdCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENsb3NlIHNlcnZpY2UgcmVzdCBmaWxlCisgIGZfc2VydmljZV9yZXN0IDw8IGVuZGw7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX3Jlc3QuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zZXJ2aWNlX2NsaWVudCA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV9jbGllbnRfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50LnBocCI7CisgICAgZl9zZXJ2aWNlX2NsaWVudC5vcGVuKGZfc2VydmljZV9jbGllbnRfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX2NsaWVudCk7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfc2VydmljZV9jbGllbnQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c2VydmljZSkgPDwgIkNsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8InsiPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUHJpdmF0ZSBtZW1iZXJzCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGlucHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkICRvdXRwdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0ID0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8gPSAkaW5wdXQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgZW5kbDsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworICAgIGluZGVudChmX3NlcnZpY2VfY2xpZW50KSA8PCAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgIiQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIkdGhpcy0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5vdXRwdXRfIGluc3RhbmNlb2YgIgorICAgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUTWVzc2FnZVR5cGU6OkNBTEwiOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0XywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBtZXNzYWdlVHlwZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRhcmdzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5zZXFpZF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPmlzU3RyaWN0V3JpdGUoKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgZnVubmFtZSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHRoaXMtPm91dHB1dF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5pbnB1dF8gaW5zdGFuY2VvZiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCByZXN1bHRuYW1lIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+aXNTdHJpY3RSZWFkKCkiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKKyAgICAgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdmVyID0gdW5wYWNrKCdOJywgJHRoaXMtPmlucHV0Xy0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gJHZlciAmIDB4ZmY7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyICYgMHhmZmZmMDAwMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaWYgKCR2ZXIgIT0gMHg4MDAxMDAwMCkgdGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpZGVudGlmaWVyOiAnLiR2ZXIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfY2xpZW50LCAmZmZuYW1lLCAiIiwgdHJ1ZSk7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9jbGllbnQsICZmc2VxaWQsICIiLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHgtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93ICR4OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT5zdWNjZXNzICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHJlc3VsdC0+c3VjY2VzczsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocm93ICRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfY2xpZW50KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBcXEV4Y2VwdGlvbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGNsaWVudCBmaWxlCisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudC5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSB7CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgICBzdGQ6OnN0cmluZyBpdHJhbnMgPSAoaW5jbGFzcyA/ICIkdGhpcy0+aW5wdXRfIiA6ICIkaW5wdXQiKTsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkbGVuID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKCRsZW4pOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gKGJvb2wpJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkIiA8PCBuYW1lIDw8ICJbMV07IiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ24nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDIpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdOMicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgJGFyclsyXSA9ICRhcnJbMl0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdkJywgc3RycmV2KCIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXTsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCisgICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+IjsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZEJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IgorICAgICAgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCB2dHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma3R5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZ0eXBlKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGt0eXBlIDw8ICIsICQiIDw8IHZ0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgICA8PCAiJCIgPDwgZXR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKCQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICJbJCIgPDwga2V5IDw8ICJdID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgaWYocGhwX2lzX3NjYWxhcihlbGVtX3R5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGVsZW0gPDwgIl0gPSB0cnVlOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICJbXSA9ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCBzdHJsZW4oJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIkb3V0cHV0IC49ICQiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04yJywgJCIgPDwgbmFtZSA8PCAiID4+IDMyLCAkIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgJiAweEZGRkZGRkZGKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnZCcsICQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPiI7CisKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKKyAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiCisgICAgICAgICAgPDwgZW5kbDsKKworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgIgorICAgICAgICAgICAgICAgIDw8ICIkIiA8PCBraXRlciA8PCAiID0+ICQiIDw8IHZpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBzdHJpbmcgaXRlcl92YWwgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiID0+ICQiIDw8IGl0ZXJfdmFsIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXJfdmFsKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZmllbGQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgLy8gcHJlcGVuZCBmcmVlLXN0eWxlIGRvYyBpZiBhdmFpbGFibGUKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICBzcyA8PCBmaWVsZC0+Z2V0X2RvYygpIDw8IGVuZGw7CisgIH0KKworICAvLyBhcHBlbmQgQHZhciB0YWcKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHNzIDw8ICJAdmFyICIgPDwgdHlwZV90b19waHBkb2ModHlwZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBzcy5zdHIoKSk7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmdW5jdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgaWYgKGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzcyA8PCBmdW5jdGlvbi0+Z2V0X2RvYygpIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSBwYXJhbWV0ZXIgdHlwZXMgZG9jCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgdF9maWVsZCogYXJnID0gKmFfaXRlcjsKKyAgICBzcyA8PCAiQHBhcmFtICIgPDwgdHlwZV90b19waHBkb2MoYXJnLT5nZXRfdHlwZSgpKSA8PCAiICQiIDw8IGFyZy0+Z2V0X25hbWUoKTsKKyAgICBpZiAoYXJnLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCBhcmctPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHJldHVybiB0eXBlIGRvYworICB0X3R5cGUqIHJldF90eXBlID0gZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIGlmICghcmV0X3R5cGUtPmlzX3ZvaWQoKSB8fCByZXRfdHlwZS0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgIkByZXR1cm4gIiA8PCB0eXBlX3RvX3BocGRvYyhyZXRfdHlwZSk7CisgICAgaWYgKHJldF90eXBlLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCByZXRfdHlwZS0+Z2V0X2RvYygpOworICAgIH0KKyAgICBzcyA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgZXhjZXB0aW9ucyBkb2MKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjcyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgZm9yIChlX2l0ZXIgPSBleGNzLmJlZ2luKCk7IGVfaXRlciAhPSBleGNzLmVuZCgpOyArK2VfaXRlcikgeworICAgIHRfZmllbGQqIGV4YyA9ICplX2l0ZXI7CisgICAgc3MgPDwgIkB0aHJvd3MgIiA8PCB0eXBlX3RvX3BocGRvYyhleGMtPmdldF90eXBlKCkpOworICAgIGlmIChleGMtPmhhc19kb2MoKSkgeworICAgICAgc3MgPDwgIiAiIDw8IGV4Yy0+Z2V0X2RvYygpOworICAgIH0KKyAgICBzcyA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gJyciOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBhcnJheSgpIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisKKyAgICAvLyBTZXQgdHlwZSBuYW1lCisgICAgaWYgKGFkZFR5cGVIaW50cykgeworICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIHN0cmluZyBjbGFzc05hbWUgPSBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KCJEZWZpbml0aW9uIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzaWZ5KHR5cGUtPmdldF9uYW1lKCkpOworCisgICAgICAgIHJlc3VsdCArPSBjbGFzc05hbWUgKyAiICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHJlc3VsdCArPSAiYXJyYXkgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyBhIHR5cGVjYXN0IHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fY2FzdCh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIGJ0eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOworICAgIHN3aXRjaCAoYnR5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIihib29sKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiKGludCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIoZG91YmxlKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIihzdHJpbmcpIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihpbnQpIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFBIUERvYyBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gImFycmF5IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKTsKKyAgICB0X3R5cGUqIHRfZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSk7CisgICAgdF90eXBlKiB0X2VsZW0gPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmICh0X2VsZW0tPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXR1cm4gIigiICsgdHlwZV90b19waHBkb2ModF9lbGVtKSArICIpW10iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHlwZV90b19waHBkb2ModF9lbGVtKSArICJbXSI7CisgICAgfQorICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHBocCwKKyAgICAiUEhQIiwKKyAgICAiICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKKyAgICAiICAgIHNlcnZlcjogICAgICAgICAgR2VuZXJhdGUgUEhQIHNlcnZlciBzdHVic1xuIgorICAgICIgICAgb29wOiAgICAgICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBvYmplY3Qgb3JpZW50ZWQgc3ViY2xhc3Nlc1xuIgorICAgICIgICAgY2xhc3NtYXA6ICAgICAgICBHZW5lcmF0ZSBvbGQtc3R5bGUgUEhQIGZpbGVzICh1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcpXG4iCisgICAgIiAgICByZXN0OiAgICAgICAgICAgIEdlbmVyYXRlIFBIUCBSRVNUIHByb2Nlc3NvcnNcbiIKKyAgICAiICAgIG5zZ2xvYmFsPU5BTUU6ICAgU2V0IGdsb2JhbCBuYW1lc3BhY2VcbiIKKyAgICAiICAgIHZhbGlkYXRlOiAgICAgICAgR2VuZXJhdGUgUEhQIHZhbGlkYXRvciBtZXRob2RzXG4iCisgICAgIiAgICBqc29uOiAgICAgICAgICAgIEdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcyAocmVxdWlyZXMgUEhQID49IDUuNClcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjIwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI3NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBQeXRob24gY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3B5X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcHlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IgKHByb2dyYW0pIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZ2VuX25ld3N0eWxlXyA9IHRydWU7CisgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IHRydWU7CisgICAgZ2VuX2R5bmJhc2VfID0gZmFsc2U7CisgICAgZ2VuX3Nsb3RzXyA9IGZhbHNlOworICAgIGdlbl90b3JuYWRvXyA9IGZhbHNlOworICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSBmYWxzZTsKKyAgICBnZW5fdHdpc3RlZF8gPSBmYWxzZTsKKyAgICBnZW5fZHluYW1pY18gPSBmYWxzZTsKKyAgICBjb2RpbmdfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiIjsKKyAgICBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPSAiIjsKKyAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiIjsKKyAgICBpbXBvcnRfZHluYmFzZV8gPSAiIjsKKyAgICBwYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuZXdfc3R5bGUiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJuZXdfc3R5bGUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGUgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib2xkX3N0eWxlIikgPT0gMCkgeworICAgICAgICBnZW5fbmV3c3R5bGVfID0gZmFsc2U7CisgICAgICAgIHB3YXJuaW5nKDAsICJvbGRfc3R5bGUgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgcHdhcm5pbmcoMCwgInV0ZjhzdHJpbmdzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX3V0ZjhzdHJpbmdzIikgPT0gMCkgeworICAgICAgICBnZW5fdXRmOHN0cmluZ3NfID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNsb3RzIikgPT0gMCkgeworICAgICAgICBnZW5fc2xvdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIHBhY2thZ2VfcHJlZml4XyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluYW1pYyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmFtaWNfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOyAvLyBkeW5hbWljIGlzIG5ld3N0eWxlCisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzXy5lbXB0eSgpKSB7CisgICAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiVEJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXyA9ICJURnJvemVuQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGdlbl9keW5iYXNlY2xhc3NfZXhjXy5lbXB0eSgpKSB7CisgICAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIlRFeGNlcHRpb25CYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggaW1wb3J0X2R5bmJhc2VfLmVtcHR5KCkpIHsKKyAgICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJhc2UgaW1wb3J0IFRCYXNlLCBURnJvemVuQmFzZSwgVEV4Y2VwdGlvbkJhc2UsIFRUcmFuc3BvcnRcbiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluYmFzZSIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluZnJvemVuIikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluZXhjIikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluaW1wb3J0IikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOworICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiem9wZS5pbnRlcmZhY2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0d2lzdGVkIikgPT0gMCkgeworICAgICAgICBnZW5fdHdpc3RlZF8gPSB0cnVlOworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidG9ybmFkbyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Rvcm5hZG9fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29kaW5nIikgPT0gMCkgeworICAgICAgICBjb2RpbmdfID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHB5OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfICYmIGdlbl90b3JuYWRvXykgeworICAgICAgdGhyb3cgImF0IG1vc3Qgb25lIG9mICd0d2lzdGVkJyBhbmQgJ3Rvcm5hZG8nIGFyZSBhbGxvd2VkIjsKKyAgICB9CisKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5LnR3aXN0ZWQiOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50b3JuYWRvIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkiOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgICAiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHB5X2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBweV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwcmUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcG9zdCA9IE5VTEwpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOworCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkLCBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcj0iIikgeworICAgIGlmIChnZW5fdHdpc3RlZCkgeworICAgICAgc3RkOjpzdHJpbmcgdHdpc3RlZF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweS50d2lzdGVkIik7CisgICAgICBpZiAoIXR3aXN0ZWRfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHR3aXN0ZWRfbW9kdWxlOworICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkiKTsKKyAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIHJldHVybiBwYWNrYWdlX2RpciArIHJlYWxfbW9kdWxlOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfaW1tdXRhYmxlKHRfdHlwZSogdHR5cGUpIHsKKyAgICByZXR1cm4gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJweXRob24uaW1tdXRhYmxlIikgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsKKyAgfQorCitwcml2YXRlOgorCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy4KKyAgICovCisgIGJvb2wgZ2VuX25ld3N0eWxlXzsKKworICAvKioKKyAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBkeW5hbWljIHN0eWxlIGNsYXNzZXMuCisgICovCisgIGJvb2wgZ2VuX2R5bmFtaWNfOworCisgIGJvb2wgZ2VuX2R5bmJhc2VfOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzX2V4Y187CisKKyAgc3RkOjpzdHJpbmcgaW1wb3J0X2R5bmJhc2VfOworCisgIGJvb2wgZ2VuX3Nsb3RzXzsKKworICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS4KKyAgICovCisgIGJvb2wgZ2VuX3pvcGVfaW50ZXJmYWNlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCisgICAqLworICBib29sIGdlbl90d2lzdGVkXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggVG9ybmFkbworICAgKi8KKyAgYm9vbCBnZW5fdG9ybmFkb187CisKKyAgLyoqCisgICAqIFRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgZW5jb2RlZCB1c2luZyB1dGYtOC4KKyAgICovCisgIGJvb2wgZ2VuX3V0ZjhzdHJpbmdzXzsKKworICAvKioKKyAgICogc3BlY2lmeSBnZW5lcmF0ZWQgZmlsZSBlbmNvZGluZworICAgKiBlZy4gIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyAgICovCisgIHN0cmluZyBjb2RpbmdfOworCisgIHN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlXzsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsYW5nX2tleXdvcmRzKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGtleXdvcmRzW10gPSB7ICJGYWxzZSIsICJOb25lIiwgIlRydWUiLCAiYW5kIiwgImFzIiwgImFzc2VydCIsICJicmVhayIsICJjbGFzcyIsCisgICAgICAgICAgImNvbnRpbnVlIiwgImRlZiIsICJkZWwiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZm9yIiwgImZyb20iLAorICAgICAgICAgICJnbG9iYWwiLCAiaWYiLCAiaW1wb3J0IiwgImluIiwgImlzIiwgImxhbWJkYSIsICJub25sb2NhbCIsICJub3QiLCAib3IiLCAicGFzcyIsICJwcmludCIsCisgICAgICAgICAgInJhaXNlIiwgInJldHVybiIsICJ0cnkiLCAid2hpbGUiLCAid2l0aCIsICJ5aWVsZCIgfTsKKyAgICByZXR1cm4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KGtleXdvcmRzLCBrZXl3b3JkcyArIHNpemVvZihrZXl3b3Jkcykvc2l6ZW9mKGtleXdvcmRzWzBdKSApOworICB9Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbV8sIGdlbl90d2lzdGVkXyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIG1vZHVsZV8gPSBtb2R1bGU7CisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfICsgIi9fX2luaXRfXy5weSIpLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6OmFwcCk7CisgICAgaW5pdF9weS5jbG9zZSgpOworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOworICAgICAgbW9kdWxlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOworICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJ0dHlwZXMucHkiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMucHkiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2luaXRfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaW5pdDsKKyAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7CisgIGZfaW5pdCA8PCAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOworICB9CisgIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKKyAgZl9pbml0LmNsb3NlKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbAorICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGltcG9ydF9keW5iYXNlXzsKKworICBmX3R5cGVzXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwKKyAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8CisgICAgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwKKyAgICAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBnZXRfcmVhbF9weV9tb2R1bGUoaW5jbHVkZXNbaV0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzXG4iOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHN0cmluZyBjb2Rpbmc7CisgIGlmICghY29kaW5nXy5lbXB0eSgpKSB7CisgICAgICBjb2RpbmcgPSAiIyAtKi0gY29kaW5nOiAiICsgY29kaW5nXyArICIgLSotXG4iOworICB9CisgIHJldHVybiBjb2RpbmcgKyBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiIKKyAgICAgICAgICsgIiMgIG9wdGlvbnMgc3RyaW5nOiAiICsgY29weV9vcHRpb25zXyArICJcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgeworICBvc3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZSwgVE1lc3NhZ2VUeXBlLCBURnJvemVuRGljdCwgVEV4Y2VwdGlvbiwgIgorICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICAgICA8PCBlbmRsCisgICAgIDw8ICJmcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgICAgPDwgZW5kbAorICAgICA8PCAiZnJvbSB0aHJpZnQuVFJlY3Vyc2l2ZSBpbXBvcnQgZml4X3NwZWMiCisgICAgIDw8IGVuZGw7CisKKyAgaWYgKGdlbl91dGY4c3RyaW5nc18pIHsKKyAgICBzcyA8PCBlbmRsIDw8ICJpbXBvcnQgc3lzIjsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKworICAvLyBGaXggdGhyaWZ0X3NwZWMgZGVmaW5pdGlvbnMgZm9yIHJlY3Vyc2l2ZSBzdHJ1Y3RzLgorICBmX3R5cGVzXyA8PCAiZml4X3NwZWMoYWxsX3N0cnVjdHMpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiZGVsIGFsbF9zdHJ1Y3RzIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQeXRob24sIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7CisKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKQorICAgICAgICAgICA8PCAoZ2VuX2R5bmFtaWNfID8gIigiICsgZ2VuX2R5bmJhc2VjbGFzc18gKyAiKSIgOiAiIikgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMgPSB7IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfTkFNRVNfVE9fVkFMVUVTID0geyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOworCisgICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCisgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgdmFsdWUgPDwgIjogXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiwiIDw8IGVuZGw7CisgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAnIicgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCI6ICIgPDwgdmFsdWUgPDwgJywnIDw8IGVuZGw7CisgIH0KKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgIGZfY29uc3RzXyA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCoqeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9KSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSkgeworICAgICAgb3V0IDw8ICJURnJvemVuRGljdCgiOworICAgIH0KKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgICAgb3V0IDw8ICJmcm96ZW4iOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZXQoIjsKKyAgICB9CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdIjsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSAiZm9yd2FyZCBkZWNsYXJhdGlvbnMiIGZvciBweXRob24gc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBhY3R1YWxseSBmdWxsIGNsYXNzIGRlZmluaXRpb25zIHNvIHRoYXQgY2FsbHMgdG8gZ2VuZXJhdGVfc3RydWN0CisgKiBjYW4gYWRkIHRoZSB0aHJpZnRfc3BlYyBmaWVsZC4gIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgYWxsIHRocmlmdF9zcGVjCisgKiBkZWZpbml0aW9ucyBhcmUgZ3JvdXBlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIGVuYWJsZSBjby1yZWN1cnNpdmUgc3RydWN0cy4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIHRoZSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3QKKyAqIEZvciBleGFtcGxlLAorICogICBhbGxfc3RydWN0cy5hcHBlbmQoUmVjdXJzaXZlKQorICogICBSZWN1cnNpdmUudGhyaWZ0X3NwZWMgPSAoCisgKiAgICAgICBOb25lLCAgIyAwCisgKiAgICAgICAoMSwgVFR5cGUuTElTVCwgJ0NoaWxkcmVuJywgKFRUeXBlLlNUUlVDVCwgKFJlY3Vyc2l2ZSwgTm9uZSksIEZhbHNlKSwgTm9uZSwgKSwgICMgMQorICogICApCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX2V4Y2VwdGlvbiovKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBBZGQgc3RydWN0IGRlZmluaXRpb24gdG8gbGlzdCBzbyB0aHJpZnRfc3BlYyBjYW4gYmUgZml4ZWQgZm9yIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmVzLgorICBpbmRlbnQob3V0KSA8PCAiYWxsX3N0cnVjdHMuYXBwZW5kKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi50aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKworICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIgorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX3NwZWNfYXJncygoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICIpLCIKKyAgICAgICAgICAgICAgICAgIDw8ICIgICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKKworICAgICAgc29ydGVkX2tleXNfcG9zKys7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpZiAoZ2VuX2R5bmFtaWNfKSB7CisgICAgICBvdXQgPDwgIigiIDw8IGdlbl9keW5iYXNlY2xhc3NfZXhjXyA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKFRFeGNlcHRpb24pIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ2VuX2R5bmFtaWNfKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPDwgIikiOworICAgIH0gZWxzZSAgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzXyA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKKyAgICBvdXQgPDwgIihvYmplY3QpIjsKKyAgfQorICBvdXQgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKKyAgICAgdGFnIC0+IGludGVnZXIKKyAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgorICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCisgICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCisgICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKworICBpZiAoZ2VuX3Nsb3RzXykgeworICAgIGluZGVudChvdXQpIDw8ICJfX3Nsb3RzX18gPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBOb25lCisgIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KKyAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCisgIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIjsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAiICIgPDwgZGVjbGFyZV9hcmd1bWVudCgqbV9pdGVyKSA8PCAiLCI7CisgICAgfQorICAgIG91dCA8PCAiKToiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIEluaXRpYWxpemUgZmllbGRzCisgICAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkgJiYgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiXVs0XToiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgICBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsIHNlbGYpLl9fc2V0YXR0cl9fKCciCisgICAgICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5fX2RpY3RfX1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ10gPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc2V0YXR0cl9fKHNlbGYsICphcmdzKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUeXBlRXJyb3IoXCJjYW4ndCBtb2RpZnkgaW1tdXRhYmxlIGluc3RhbmNlXCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19kZWxhdHRyX18oc2VsZiwgKmFyZ3MpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFR5cGVFcnJvcihcImNhbid0IG1vZGlmeSBpbW11dGFibGUgaW5zdGFuY2VcIikiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIEhhc2ggYWxsIG9mIHRoZSBtZW1iZXJzIGluIG9yZGVyLCBhbmQgYWxzbyBoYXNoIGluIHRoZSBjbGFzcworICAgIC8vIHRvIGF2b2lkIGNvbGxpc2lvbnMgZm9yIHN0dWZmIGxpa2Ugc2luZ2xlLWZpZWxkIHN0cnVjdHVyZXMuCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19oYXNoX18oc2VsZik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pIF4gaGFzaCgoIjsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKworICAgIG91dCA8PCAiKSkiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9keW5hbWljXykgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKworICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCisgIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KKyAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc3RyX18oc2VsZik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9zbG90c18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAorICAgIC8vIHN0cnVjdHMgbG9vayBwcmV0dHkgbGlrZSBkaWN0aW9uYXJpZXMKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZW1zKCldIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbm90IChzZWxmID09IG90aGVyKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKCFnZW5fZHluYW1pY18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICAvLyBubyBiYXNlIGNsYXNzIGF2YWlsYWJsZSB0byBpbXBsZW1lbnQgX19lcV9fIGFuZCBfX3JlcHJfXyBhbmQgX19uZV9fIGZvciB1cworICAgIC8vIHNvIHdlIG11c3QgcHJvdmlkZSBvbmUgdGhhdCB1c2VzIF9fc2xvdHNfXworICAgIGluZGVudChvdXQpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEVxdWFsaXR5IG1ldGhvZCB0aGF0IGNvbXBhcmVzIGVhY2ggYXR0cmlidXRlIGJ5IHZhbHVlIGFuZCB0eXBlLCB3YWxraW5nIF9fc2xvdHNfXworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJvdGhlcl92YWwgPSBnZXRhdHRyKG90aGVyLCBhdHRyKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIG15X3ZhbCAhPSBvdGhlcl92YWw6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBGYWxzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gbm90IChzZWxmID09IG90aGVyKSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzbWV0aG9kIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcmVhZChjbHMsIGlwcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgY2hhciogaWQgPSBpc19pbW11dGFibGUodHN0cnVjdCkgPyAiY2xzIiA6ICJzZWxmIjsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lICIKKyAgICAgICAgICAgICAgICAgImFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgIgorICAgICAgICAgICAgICAgICAiYW5kICIKKyAgICAgICAgICAgICAgPDwgaWQgPDwgIi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwgW2NscywgY2xzLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90Ll9mYXN0X2RlY29kZShzZWxmLCBpcHJvdCwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHQuc3RyKCkgPDwgZW5kbDsKKyAgICAgfQorICB9CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICIoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxpZiAiOworICAgIH0KKyAgICBvdXQgPDwgImZpZCA9PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBjbHMoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIj0iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIG9wcm90Ll9mYXN0X2VuY29kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpCisgICAgICA8PCAib3Byb3QudHJhbnMud3JpdGUob3Byb3QuX2Zhc3RfZW5jb2RlKHNlbGYsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pKSIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJykiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKSIKKyAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZShzZWxmKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5weSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIgorICAgICAgICAgICAgICAgPDwgZ2V0X3JlYWxfcHlfbW9kdWxlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgPDwgIi4iCisgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IGxvZ2dpbmciIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvciIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRlciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGNvbmN1cnJlbnQiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJhbGxfc3RydWN0cyA9IFtdIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXyA8PCAiZml4X3NwZWMoYWxsX3N0cnVjdHMpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImRlbCBhbGxfc3RydWN0cyIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWYgPSAiKCIgKyBleHRlbmRzICsgIi5JZmFjZSkiOworICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKKyAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZXh0ZW5kc19pZiA9ICIob2JqZWN0KSI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGwgPDwgImNsYXNzIElmYWNlIiA8PCBleHRlbmRzX2lmIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgaWYgKGZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfICYmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXykpIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gIihvYmplY3QpIjsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgIkBpbXBsZW1lbnRlcihJZmFjZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImNsYXNzIENsaWVudCgiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJZmFjZSk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSk6IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90PU5vbmUpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90X2ZhY3RvcnkgPSBpcHJvdF9mYWN0b3J5IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdF9mYWN0b3J5ID0gKG9wcm90X2ZhY3RvcnkgaWYgb3Byb3RfZmFjdG9yeSBpcyBub3QgTm9uZSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlwcm90X2ZhY3RvcnkpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0LmlvX2xvb3Auc3Bhd25fY2FsbGJhY2soc2VsZi5fc3RhcnRfcmVjZWl2aW5nKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBvcHJvdCBpcyBub3QgTm9uZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9vcHJvdCA9IG9wcm90IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl90b3JuYWRvXyAmJiBleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8ICJAZ2VuLmVuZ2luZSIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgImRlZiBfc3RhcnRfcmVjZWl2aW5nKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndoaWxlIFRydWU6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnJhbWUgPSB5aWVsZCBzZWxmLl90cmFuc3BvcnQucmVhZEZyYW1lKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZvciBmdXR1cmUgaW4gc2VsZi5fcmVxcy52YWx1ZXMoKToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdCA9IHNlbGYuX2lwcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3JlY3ZfJyArIGZuYW1lKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZ1dHVyZSA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCwgTm9uZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBub3QgZnV0dXJlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICIjIGZ1dHVyZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJjb250aW51ZSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0ID0gbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb24gYXMgZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X3Jlc3VsdChyZXN1bHQpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCA9IHNlbGYuX3NlcWlkID0gc2VsZi5fc2VxaWQgKyAxIiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9yZXFzW3NlcWlkXSA9IGRlZmVyLkRlZmVycmVkKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZCA9IGRlZmVyLm1heWJlRGVmZXJyZWQoc2VsZi5zZW5kXyIgPDwgZnVubmFtZTsKKworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3NlcWlkICs9IDEiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdXR1cmUgPSBzZWxmLl9yZXFzW3NlbGYuX3NlcWlkXSA9IGNvbmN1cnJlbnQuRnV0dXJlKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisgICAgfQorCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgLy8gd2UgbmVlZCBhIGxlYWRpbmcgY29tbWEgaWYgdGhlcmUgYXJlIGFyZ3MsIHNpbmNlIGl0J3MgY2FsbGVkIGFzIG1heWJlRGVmZXJyZWQoZnVuY25hbWUsCisgICAgICAvLyBhcmcpCisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgLy8gbm90aGluZy4gU2VlIHRoZSBuZXh0IGJsb2NrLgorICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnV0dXJlIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgLy8gVGhpcyBibG9jayBpbmplY3RzIHRoZSBib2R5IG9mIHRoZSBzZW5kXzw+IG1ldGhvZCBmb3IgdHdpc3RlZCAoYW5kIGEgY2IvZWIgcGFpcikKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkLmFkZENhbGxiYWNrcygiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2s9c2VsZi5jYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiY2FsbGJhY2tBcmdzPShzZXFpZCwpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFjaz1zZWxmLmViX3NlbmRfIgorICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlcnJiYWNrQXJncz0oc2VxaWQsKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBfLCBzZXFpZCk6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAvLyBpZiBvbmUtd2F5LCBmaXJlIHRoZSBkZWZlcnJlZCAmIHJlbW92ZSBpdCBmcm9tIF9yZXFzCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiZC5jYWxsYmFjayhOb25lKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZi5fcmVxc1tzZXFpZF0iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICAvLyBhZGQgYW4gZXJyYmFjayB0byBmYWlsIHRoZSByZXF1ZXN0IGlmIHRoZSBjYWxsIHRvIHNlbmRfPD4gcmFpc2VkIGFuIGV4Y2VwdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgZWJfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBmLCBzZXFpZCk6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkLmVycmJhY2soZikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QgPSBzZWxmLl9vcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHNlbGYuX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHNlbGYuX29wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBpcHJvdCwgbXR5cGUsIHJzZXFpZCk6IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICI6IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdCA9IHNlbGYuX2lwcm90IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT046IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOworCisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayh4KSIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgeCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCB4bmFtZSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgeG5hbWUgPDwgIiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAicmV0dXJuIGQuZXJyYmFjayhUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIC8vIEdldCBhbGwgZnVuY3Rpb24gZnJvbSBwYXJlbnRzCisgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKKyAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOworICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi1yZW1vdGUiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcmVtb3RlOworICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIiA8PCBlbmRsIDw8CisgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAorICAgICJpbXBvcnQgc3lzIiA8PCBlbmRsIDw8CisgICAgImltcG9ydCBwcHJpbnQiIDw8IGVuZGwgPDwKKyAgICAiaWYgc3lzLnZlcnNpb25faW5mb1swXSA+IDI6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UiIDw8IGVuZGwgPDwKKyAgICAiZWxzZToiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgImZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlIiA8PCBlbmRsIDw8CisgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCwgVFNvY2tldCwgVFNTTFNvY2tldCwgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKKyAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wiIDw8IGVuZGwgPDwKKyAgICBlbmRsOworCisgIGZfcmVtb3RlIDw8CisgICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIgaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8CisgICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8CisgICAgZW5kbDsKKworICBmX3JlbW90ZSA8PAorICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdVc2FnZTogJyArIHN5cy5hcmd2WzBdICsgJyBbLWggaG9zdFs6cG9ydF1dIFstdSB1cmxdIFstZltyYW1lZF1dIFstc1tzbF1dIFstbm92YWxpZGF0ZV0gWy1jYV9jZXJ0cyBjZXJ0c10gWy1rZXlmaWxlIGtleWZpbGVdIFstY2VydGZpbGUgY2VydGZpbGVdIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV0nKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnRnVuY3Rpb25zOicpIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfcmVtb3RlIDw8IGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfcmVtb3RlIDw8ICIpJykiIDw8IGVuZGw7CisgIH0KKyAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgwKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8ICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudD0yKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiaG9zdCA9ICdsb2NhbGhvc3QnIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJwb3J0ID0gOTA5MCIgPDwgZW5kbAorICAgICAgICAgICA8PCAidXJpID0gJyciIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImZyYW1lZCA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJzc2wgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAidmFsaWRhdGUgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjYV9jZXJ0cyA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImtleWZpbGUgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjZXJ0ZmlsZSA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImh0dHAgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiYXJnaSA9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1oJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJwYXJ0cyA9IHN5cy5hcmd2W2FyZ2kgKyAxXS5zcGxpdCgnOicpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidXJsID0gdXJscGFyc2Uoc3lzLmFyZ3ZbYXJnaSArIDFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInBhcnRzID0gdXJsWzFdLnNwbGl0KCc6JykiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gODAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmkgPSB1cmxbMl0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiB1cmxbNF06IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInVyaSArPSAnPyVzJyAlIHVybFs0XSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImh0dHAgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctZicgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mcmFtZWQnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImZyYW1lZCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLXNzbCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAic3NsID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLW5vdmFsaWRhdGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInZhbGlkYXRlID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1jYV9jZXJ0cyc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiY2FfY2VydHMgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICcta2V5ZmlsZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAia2V5ZmlsZSA9IHN5cy5hcmd2W2FyZ2krMV0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1jZXJ0ZmlsZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiY2VydGZpbGUgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJhcmdzID0gc3lzLmFyZ3ZbYXJnaSArIDE6XSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBodHRwOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHVyaSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgc3NsOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgIgorICAgICAgICAgICAgICAidmFsaWRhdGU9dmFsaWRhdGUsIGNhX2NlcnRzPWNhX2NlcnRzLCBrZXlmaWxlPWtleWZpbGUsIGNlcnRmaWxlPWNlcnRmaWxlKSIKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChob3N0LCBwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGZyYW1lZDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ0cmFuc3BvcnQub3BlbigpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfcmVtb3RlIDw8ICJlbCI7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworCisgICAgZl9yZW1vdGUgPDwgImlmIGNtZCA9PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4oYXJncykgIT0gIiA8PCBudW1fYXJncyA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncworICAgICAgICAgICAgIDw8ICIgYXJncycpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgxKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0X2FyZykKKyAgICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgICBlbHNlCisgICAgICAgIGZfcmVtb3RlIDw8ICIgIjsKKyAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgeworICAgICAgICBmX3JlbW90ZSA8PCAiYXJnc1siIDw8IGkgPDwgIl0sIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJldmFsKGFyZ3NbIiA8PCBpIDw8ICJdKSwiOworICAgICAgfQorICAgIH0KKyAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7CisKKyAgICBmX3JlbW90ZSA8PCBlbmRsOworICB9CisKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9yZW1vdGUgPDwgImVsc2U6IiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ1VucmVjb2duaXplZCBtZXRob2QgJXMnICUgY21kKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInN5cy5leGl0KDEpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGVuZGw7CisgIH0KKworICBmX3JlbW90ZSA8PCAidHJhbnNwb3J0LmNsb3NlKCkiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfcmVtb3RlLmNsb3NlKCk7CisKKyNpZm5kZWYgX01TQ19WRVIKKworICAvLyBNYWtlIGZpbGUgZXhlY3V0YWJsZSwgbG92ZSB0aGF0IGJpdHdpc2UgT1IgYWN0aW9uCisgIGNobW9kKGZfcmVtb3RlX25hbWUuY19zdHIoKSwKKyAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lYVVNSCisjaWZuZGVmIF9XSU4zMgorICAgICAgICB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEgKKyNlbmRpZgorICAgICAgICApOworCisjZW5kaWYgLy8gX01TQ19WRVIKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJAaW1wbGVtZW50ZXIoSWZhY2UpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSWZhY2UsIFRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwID0ge30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbmFtZSBub3QgaW4gc2VsZi5fcHJvY2Vzc01hcDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5za2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAnVW5rbm93biAiCisgICAgICAgICAgICAgICAgImZ1bmN0aW9uICVzJyAlIChuYW1lKSkiCisgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRlZmVyLnN1Y2NlZWQoTm9uZSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkBnZW4uY29yb3V0aW5lIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIsICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi5oYW5kbGVfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIKKyAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHNlcWlkKToiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisKKyAgICAvLyBLaW5kYSBhYnN1cmQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIiA8PCB4bmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAieWllbGQgZ2VuLm1heWJlX2Z1dHVyZShzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworCisgIH0gZWxzZSB7IC8vIHB5CisgICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICAgIC8vIEl0IGFsc28gY2F0Y2hlcyBhcmJpdHJhcnkgZXhjZXB0aW9ucyByYWlzZWQgYnkgaGFuZGxlciBtZXRob2QgdG8gcHJvcGFnYXRlIHRoZW0gdG8gdGhlIGNsaWVudAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCB4bmFtZSA8PCAiID0gIiA8PCB4bmFtZSA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIGluZGVudF9kb3duKCk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgaWYoIWdlbl91dGY4c3RyaW5nc18pIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlIGlwcm90LnJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5yZWFkKGlwcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUKKyAgICAgICAgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCisgICAgICAgIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwKKyAgICAiZm9yICIgPDwgaSA8PCAiIGluIHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gVEZyb3plbkRpY3QoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gZnJvemVuc2V0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gdHVwbGUoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgaWYgKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlICIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGtpdGVyIDw8ICIsICIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgc3Muc3RyKCksICJcIlwiXCJcbiIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgdGRvYy0+Z2V0X2RvYygpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0ZmllbGQpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiAiTm9uZSI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UpIHsKKyAgdmVjdG9yPHN0cmluZz4gcHJlOworICB2ZWN0b3I8c3RyaW5nPiBwb3N0OworICBzdHJpbmcgc2lnbmF0dXJlID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGlmICghKGdlbl96b3BlX2ludGVyZmFjZV8gJiYgaW50ZXJmYWNlKSkgeworICAgIHByZS5wdXNoX2JhY2soInNlbGYiKTsKKyAgfQorCisgIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgJnByZSwgJnBvc3QpICsgIikiOworICByZXR1cm4gc2lnbmF0dXJlOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgdmVjdG9yPHN0cmluZz4qIHByZSwgdmVjdG9yPHN0cmluZz4qIHBvc3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmIChwcmUpIHsKKyAgICBmb3IgKHNfaXRlciA9IHByZS0+YmVnaW4oKTsgc19pdGVyICE9IHByZS0+ZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0ICs9ICpzX2l0ZXI7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocG9zdCkgeworICAgIGZvciAoc19pdGVyID0gcG9zdC0+YmVnaW4oKTsgc19pdGVyICE9IHBvc3QtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICByZXR1cm4gICInQklOQVJZJyI7CisgIH0gZWxzZSBpZiAoZ2VuX3V0ZjhzdHJpbmdzXyAmJiB0dHlwZS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAmJiByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5pc19zdHJpbmcoKSkgeworICAgIHJldHVybiAiJ1VURjgnIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAgIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiWyIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgTm9uZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHB5LAorICAgICJQeXRob24iLAorICAgICIgICAgem9wZS5pbnRlcmZhY2U6ICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS5cbiIKKyAgICAiICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iCisgICAgIiAgICB0b3JuYWRvOiAgICAgICAgIEdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8uXG4iCisgICAgIiAgICBub191dGY4c3RyaW5nczogIERvIG5vdCBFbmNvZGUvZGVjb2RlIHN0cmluZ3MgdXNpbmcgdXRmOCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIEJhc2ljYWxseSBubyBlZmZlY3QgZm9yIFB5dGhvbiAzLlxuIgorICAgICIgICAgY29kaW5nPUNPRElORzogICBBZGQgZmlsZSBlbmNvZGluZyBkZWNsYXJlIGluIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgc2xvdHM6ICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIHVzaW5nIHNsb3RzIGZvciBpbnN0YW5jZSBtZW1iZXJzLlxuIgorICAgICIgICAgZHluYW1pYzogICAgICAgICBHZW5lcmF0ZSBkeW5hbWljIGNvZGUsIGxlc3MgY29kZSBnZW5lcmF0ZWQgYnV0IHNsb3dlci5cbiIKKyAgICAiICAgIGR5bmJhc2U9Q0xTICAgICAgRGVyaXZlIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEJhc2UuXG4iCisgICAgIiAgICBkeW5mcm96ZW49Q0xTICAgIERlcml2ZSBnZW5lcmF0ZWQgaW1tdXRhYmxlIGNsYXNzZXMgZnJvbSBjbGFzcyBDTFMgaW5zdGVhZCBvZiBURnJvemVuQmFzZS5cbiIKKyAgICAiICAgIGR5bmV4Yz1DTFMgICAgICAgRGVyaXZlIGdlbmVyYXRlZCBleGNlcHRpb25zIGZyb20gQ0xTIGluc3RlYWQgb2YgVEV4Y2VwdGlvbkJhc2UuXG4iCisgICAgIiAgICBkeW5pbXBvcnQ9J2Zyb20gZm9vLmJhciBpbXBvcnQgQ0xTJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgYW4gaW1wb3J0IGxpbmUgdG8gZ2VuZXJhdGVkIGNvZGUgdG8gZmluZCB0aGUgZHluYmFzZSBjbGFzcy5cbiIKKyAgICAiICAgIHBhY2thZ2VfcHJlZml4PSd0b3AucGFja2FnZS4nXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iCisgICAgIiAgICBvbGRfc3R5bGU6ICAgICAgIERlcHJlY2F0ZWQuIEdlbmVyYXRlIG9sZC1zdHlsZSBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYTI0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTI4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQSBzdWJjbGFzcyBvZiBzdGQ6Om9mc3RyZWFtIHRoYXQgaW5jbHVkZXMgaW5kZW50aW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KK2NsYXNzIHRfcmJfb2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvZnN0cmVhbSB7Citwcml2YXRlOgorICBpbnQgaW5kZW50XzsKKworcHVibGljOgorICB0X3JiX29mc3RyZWFtKCkgOiBzdGQ6Om9mc3RyZWFtKCksIGluZGVudF8oMCkge30KKyAgZXhwbGljaXQgdF9yYl9vZnN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCA9IDApCisgICAgOiBzdGQ6Om9mc3RyZWFtKGZpbGVuYW1lLCBtb2RlKSwgaW5kZW50XyhpbmRlbnQpIHt9CisKKyAgdF9yYl9vZnN0cmVhbSYgaW5kZW50KCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7CisgICAgICAqdGhpcyA8PCAiICAiOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIGluZGVudF91cCgpIHsgaW5kZW50XysrOyB9CisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IGluZGVudF8tLTsgfQorfTsKKworLyoqCisgKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9yYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHJlcXVpcmVfcnVieWdlbXNfID0gZmFsc2U7CisgICAgbmFtZXNwYWNlZF8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydWJ5Z2VtcyIpID09IDApIHsKKyAgICAgICAgcmVxdWlyZV9ydWJ5Z2Vtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcnVieToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHRfcmJfb2ZzdHJlYW0mIHJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZWZucyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyByYl9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJ1YnlfbW9kdWxlcyhjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInJiIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXM7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBtb2R1bGVzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBwb3MgPSBucy5iZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgZGVsaW0gPSBzdGQ6OmZpbmQocG9zLCBucy5lbmQoKSwgJy4nKTsKKyAgICAgIG1vZHVsZXMucHVzaF9iYWNrKGNhcGl0YWxpemUoc3RkOjpzdHJpbmcocG9zLCBkZWxpbSkpKTsKKyAgICAgIHBvcyA9IGRlbGltOworICAgICAgaWYgKHBvcyA9PSBucy5lbmQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrcG9zOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVzOworICB9CisKKyAgdm9pZCBiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisgIHZvaWQgZW5kX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICB0X3JiX29mc3RyZWFtIGZfdHlwZXNfOworICB0X3JiX29mc3RyZWFtIGZfY29uc3RzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6OnN0cmluZyByZXF1aXJlX3ByZWZpeF87CisKKyAgLyoqIElmIHRydWUsIGFkZCBhICJyZXF1aXJlICdydWJ5Z2VtcyciIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbi1yYiBmaWxlLiAqLworICBib29sIHJlcXVpcmVfcnVieWdlbXNfOworCisgIC8qKiBJZiB0cnVlLCBnZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy4gKi8KKyAgYm9vbCBuYW1lc3BhY2VkXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIHJlcXVpcmVfcHJlZml4XyA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisKKyAgICBzdHJpbmcgZGlyID0gcmVxdWlyZV9wcmVmaXhfOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyBkaXIuc3Vic3RyKDAsIGxvYykgKyAiLyI7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgfQorCisgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMucmIiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfY29uc3RhbnRzLnJiIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworCisgIGZfY29uc3RzXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIDw8ICJyZXF1aXJlICciCisgICAgICAgICAgICA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSByZXF1aXJlIG9mIHRocmlmdCBpdHNlbGYsIGFuZCBwb3NzaWJseSBvZiB0aGUgcnVieWdlbXMgZGVwZW5kZW5jeS4KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfcmVxdWlyZV90aHJpZnQoKSB7CisgIGlmIChyZXF1aXJlX3J1YnlnZW1zXykgeworICAgIHJldHVybiAicmVxdWlyZSAncnVieWdlbXMnXG5yZXF1aXJlICd0aHJpZnQnXG4iOworICB9IGVsc2UgeworICAgIHJldHVybiAicmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgdF9wcm9ncmFtKiBpbmNsdWRlZCA9IGluY2x1ZGVzW2ldOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXgKKyAgICAgICAgICA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChpbmNsdWRlZC0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlZF9uYW1lID0gaW5jbHVkZWQtPmdldF9uYW1lKCk7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmUgJyIgKyBpbmNsdWRlZF9yZXF1aXJlX3ByZWZpeCArIHVuZGVyc2NvcmUoaW5jbHVkZWRfbmFtZSkgKyAiX3R5cGVzJ1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzJ1xuIjsKKyAgICB9CisgIH0KKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZW5kX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGVuZF9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBSdWJ5LCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfdHlwZXNfLmluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKKyAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAorICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBnZW5lcmF0ZV9yZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKKyAgICBmX3R5cGVzXy5pbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBoYXNoIG1hcHBpbmcgdmFsdWVzIGJhY2sgdG8gdGhlaXIgbmFtZXMgKGFzIHN0cmluZ3MpIHNpbmNlIHJ1YnkgaGFzIG5vIG5hdGl2ZSBlbnVtCisgIC8vIHR5cGUKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTFVFX01BUCA9IHsiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIFBvcHVsYXRlIHRoZSBoYXNoCisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKQorICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICBmX3R5cGVzXyA8PCB2YWx1ZSA8PCAiID0+IFwiIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIjsKKyAgfQorICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDcmVhdGUgYSBzZXQgd2l0aCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMSURfVkFMVUVTID0gU2V0Lm5ldyhbIjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBQb3B1bGF0ZSB0aGUgc2V0CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgZl90eXBlc18gPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIGZfdHlwZXNfIDw8ICJdKS5mcmVlemUiIDw8IGVuZGw7CisKKyAgZl90eXBlc18uaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKworICBmX2NvbnN0c18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfY29uc3RzXywgdHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit0X3JiX29mc3RyZWFtJiB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dC5pbmRlbnQoKSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IGZ1bGxfdHlwZV9uYW1lKHR5cGUpIDw8ICIubmV3KHsiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQuaW5kZW50KCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgPT4gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICJTZXQubmV3KFsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiXSkiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIl0iOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0CisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX3JiX3VuaW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcnVieSBzdHJ1Y3RzLgorICogVGhlc2UgYXJlIHNpbXBseSBhIGRlY2xhcmF0aW9uIG9mIGVhY2ggY2xhc3Mgd2l0aCBwcm9wZXIgaW5oZXJpdGFuY2UuCisgKiBUaGUgcmVzdCBvZiB0aGUgc3RydWN0IGlzIHN0aWxsIGdlbmVyYXRlZCBpbiBnZW5lcmF0ZV9zdHJ1Y3QgYXMgaGFzCisgKiBhbHdheXMgYmVlbiB0aGUgY2FzZS4gVGhlc2UgZGVjbGFyYXRpb25zIGFsbG93IHRocmlmdCB0byBnZW5lcmF0ZSB2YWxpZAorICogcnVieSBpbiBjYXNlcyB3aGVyZSB0aHJpZnQgc3RydWN0cyByZWx5IG9uIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiI7CisgIH0KKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8ICI7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQuaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6RXhjZXB0aW9uIjsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X3VwKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0LCA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKworICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlN0cnVjdC5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHVuaW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICAodm9pZClpc19leGNlcHRpb247CisgIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOworCisgIG91dC5pbmRlbnRfdXAoKTsKKyAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOworCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgIiA8PCBmaWVsZF9uYW1lIDw8ICIodmFsKSIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50KCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAxKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworCisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBvdXQuaW5kZW50KCkgPDwgImRlZiBpbml0aWFsaXplKG1lc3NhZ2U9bmlsKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAic3VwZXIoKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAic2VsZi4iIDw8IG5hbWUgPDwgIiA9IG1lc3NhZ2UiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGlmIChuYW1lICE9ICJtZXNzYWdlIikgeworICAgICAgICBvdXQuaW5kZW50KCkgPDwgImRlZiBtZXNzYWdlOyAiIDw8IG5hbWUgPDwgIiBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfZmllbGRfbmFtZSA9IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSk7CisKKyAgICBvdXQuaW5kZW50KCkgPDwgY2FwX2ZpZWxkX25hbWUgPDwgIiA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0LmluZGVudCgpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgorICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKKworICAgIG91dC5pbmRlbnQoKSA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOworCisgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCk7CisgIH0KKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworICBvdXQuaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQuaW5kZW50KCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgeworICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKKworICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgorICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKKworICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgeworICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKKyAgfQorCisgIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7CisgICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOworICB9CisKKyAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKKyAgICB9CisgIH0KKworICBpZiAob3B0aW9uYWwpIHsKKyAgICBvdXQgPDwgIiwgOm9wdGlvbmFsID0+IHRydWUiOworICB9CisKKyAgaWYgKGZpZWxkX3R5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAiLCA6ZW51bV9jbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkX3R5cGUpOworICB9CisKKyAgLy8gRW5kIG9mIHRoaXMgZmllbGQncyBkZWZuCisgIG91dCA8PCAifSI7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmJlZ2luX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiBvdXQsIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcykgeworICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0LmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCAqbV9pdGVyIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMucmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLnJlbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICIucmIiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJyYiIpKQorICAgICAgICAgICAgICAgICA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8KKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgYmVnaW5fbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBlbmRfbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sIHRzKTsKKyAgICBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpDbGllbnQgIjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpDbGllbnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VTZW5kUHJvYyA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZF9vbmV3YXlfbWVzc2FnZSIgOiAic2VuZF9tZXNzYWdlIjsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgbWVzc2FnZVNlbmRQcm9jIDw8ICIoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsIDoiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgorCisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzIHVubGVzcyByZXN1bHQuc3VjY2Vzcy5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB1bmxlc3MgcmVzdWx0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIi5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JU1NJTkdfUkVTVUxULCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpQcm9jZXNzb3IgIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYXJncyA9IHJlYWRfYXJncyhpcHJvdCwgIiA8PCBhcmdzbmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLm5ldygpIiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiQGhhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIndyaXRlX3Jlc3VsdChyZXN1bHQsIG9wcm90LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIHNlcWlkKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiOjoiOworICB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMgPSBydWJ5X21vZHVsZXModHR5cGUtPmdldF9wcm9ncmFtKCkpOworICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgcHJlZml4ICs9ICptX2l0ZXIgKyAiOjoiOworICB9CisgIHJldHVybiBwcmVmaXggKyB0eXBlX25hbWUodHR5cGUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUnVieSB0eW9lCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdHJpbmcgcmJfbmFtZXNwYWNlKSB7CisgIHN0cmluZyBuYW1lc3BhY2VzX2xlZnQgPSByYl9uYW1lc3BhY2U7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICBzdHJpbmcgcGF0aF9wcmVmaXggPSAiIjsKKworICB3aGlsZSAoKGxvYyA9IG5hbWVzcGFjZXNfbGVmdC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHBhdGhfcHJlZml4ID0gcGF0aF9wcmVmaXggKyB1bmRlcnNjb3JlKG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIoMCwgbG9jKSkgKyAiLyI7CisgICAgbmFtZXNwYWNlc19sZWZ0ID0gbmFtZXNwYWNlc19sZWZ0LnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobmFtZXNwYWNlc19sZWZ0LnNpemUoKSA+IDApIHsKKyAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQpICsgIi8iOworICB9CisgIHJldHVybiBwYXRoX3ByZWZpeDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBvdXQuaW5kZW50KCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dC5pbmRlbnQoKSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpIjsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYm9vbCgpKSB7CisgICAgICAgIG91dCA8PCAiIGlmIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiB1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAidW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyB8fCAiCisgICAgICAgICAgICAgICAgICAgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhAIgorICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF91cCgpOworICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQuaW5kZW50KCkKKyAgICAgIDw8ICJyYWlzZShTdGFuZGFyZEVycm9yLCAnVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LicpIGlmIGdldF9zZXRfZmllbGQubmlsPyB8fCBnZXRfdmFsdWUubmlsPyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImlmIGdldF9zZXRfZmllbGQgPT0gOiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiICByYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiCisgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSB1bmxlc3MgIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oZ2V0X3ZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgcmIsCisgICAgIlJ1YnkiLAorICAgICIgICAgcnVieWdlbXM6ICAgICAgICBBZGQgYSBcInJlcXVpcmUgJ3J1YnlnZW1zJ1wiIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMzMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnNldDsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsKCJcbiIpOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCitzdGF0aWMgY29uc3Qgc3RyaW5nIFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKCJyZXN1bHRfdmFsdWUiKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgUkVTVUxUX1NUUlVDVF9TVUZGSVgoIlJlc3VsdCIpOworc3RhdGljIGNvbnN0IHN0cmluZyBSVVNUX1JFU0VSVkVEX1dPUkRTW10gPSB7CisgICJhYnN0cmFjdCIsICJhbGlnbm9mIiwgImFzIiwgImJlY29tZSIsCisgICJib3giLCAiYnJlYWsiLCAiY29uc3QiLCAiY29udGludWUiLAorICAiY3JhdGUiLCAiZG8iLCAiZWxzZSIsICJlbnVtIiwKKyAgImV4dGVybiIsICJmYWxzZSIsICJmaW5hbCIsICJmbiIsCisgICJmb3IiLCAiaWYiLCAiaW1wbCIsICJpbiIsCisgICJsZXQiLCAibG9vcCIsICJtYWNybyIsICJtYXRjaCIsCisgICJtb2QiLCAibW92ZSIsICJtdXQiLCAib2Zmc2V0b2YiLAorICAib3ZlcnJpZGUiLCAicHJpdiIsICJwcm9jIiwgInB1YiIsCisgICJwdXJlIiwgInJlZiIsICJyZXR1cm4iLCAiU2VsZiIsCisgICJzZWxmIiwgInNpemVvZiIsICJzdGF0aWMiLCAic3RydWN0IiwKKyAgInN1cGVyIiwgInRyYWl0IiwgInRydWUiLCAidHlwZSIsCisgICJ0eXBlb2YiLCAidW5zYWZlIiwgInVuc2l6ZWQiLCAidXNlIiwKKyAgInZpcnR1YWwiLCAid2hlcmUiLCAid2hpbGUiLCAieWllbGQiCit9OworY29uc3Qgc2V0PHN0cmluZz4gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQoCisgIFJVU1RfUkVTRVJWRURfV09SRFMsCisgIFJVU1RfUkVTRVJWRURfV09SRFMgKyBzaXplb2YoUlVTVF9SRVNFUlZFRF9XT1JEUykvc2l6ZW9mKFJVU1RfUkVTRVJWRURfV09SRFNbMF0pCispOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUygiPElQLCBPUD4iKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMoIndoZXJlIElQOiBUSW5wdXRQcm90b2NvbCwgT1A6IFRPdXRwdXRQcm90b2NvbCIpOworCisvLyBGSVhNRTogZXh0cmFjdCBjb21tb24gVE1lc3NhZ2VJZGVudGlmaWVyIGZ1bmN0aW9uCisvLyBGSVhNRTogaGF2ZSB0b19ydXN0X3R5cGUgZGVhbCB3aXRoIE9wdGlvbgorCitjbGFzcyB0X3JzX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcnNfZ2VuZXJhdG9yKAorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYKKyAgKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICBnZW5fZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKK3ByaXZhdGU6CisgIC8vIHN0cnVjdCB0eXBlCisgIC8vIFRfUkVHVUxBUjogdXNlci1kZWZpbmVkIHN0cnVjdCBpbiB0aGUgSURMCisgIC8vIFRfQVJHUzogc3RydWN0IHVzZWQgdG8gaG9sZCBhbGwgc2VydmljZS1jYWxsIHBhcmFtZXRlcnMKKyAgLy8gVF9SRVNVTFQ6IHN0cnVjdCB1c2VkIHRvIGhvbGQgYWxsIHNlcnZpY2UtY2FsbCByZXR1cm5zIGFuZCBleGNlcHRpb25zCisgIC8vIFRfRVhDRVBUSU9OOiB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGluIHRoZSBJREwKKyAgZW51bSBlX3N0cnVjdF90eXBlIHsgVF9SRUdVTEFSLCBUX0FSR1MsIFRfUkVTVUxULCBUX0VYQ0VQVElPTiB9OworCisgIC8vIERpcmVjdG9yeSB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBpcyB3cml0dGVuLgorICBzdHJpbmcgZ2VuX2Rpcl87CisKKyAgLy8gRmlsZSB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBpcyB3cml0dGVuLgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZ2VuXzsKKworICAvLyBXcml0ZSB0aGUgY29tbW9uIGNvbXBpbGVyIGF0dHJpYnV0ZXMgYW5kIG1vZHVsZSBpbmNsdWRlcyB0byB0aGUgdG9wIG9mIHRoZSBhdXRvLWdlbmVyYXRlZCBmaWxlLgorICB2b2lkIHJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpOworCisgIC8vIENyZWF0ZSB0aGUgY2xvc3VyZSBvZiBSdXN0IG1vZHVsZXMgcmVmZXJlbmNlZCBieSB0aGlzIHNlcnZpY2UuCisgIHZvaWQgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBzZXQ8c3RyaW5nPiAmcmVmZXJlbmNlZF9tb2R1bGVzKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnVtLgorICB2b2lkIHJlbmRlcl9lbnVtX2RlZmluaXRpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWl0cyBuZWNlc3NhcnkgdG8gY29udmVydCBhbiBlbnVtIHRvL2Zyb20gYW4gaTMyLgorICB2b2lkIHJlbmRlcl9lbnVtX2NvbnZlcnNpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnVtLiBUaGlzIGluY2x1ZGVzIG1ldGhvZHMKKyAgLy8gdG8gd3JpdGUgdGhlIGVudW0gdG8gYSBwcm90b2NvbCwgcmVhZCBpdCBmcm9tIGEgcHJvdG9jb2wsIGV0Yy4KKyAgdm9pZCByZW5kZXJfZW51bV9pbXBsKGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSBhIHNpbXBsZSBydXN0IGNvbnN0IHZhbHVlIChpZS4gYHB1YiBjb25zdCBGT086IGZvby4uLmApLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZShjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdGFudCBsaXN0LCBzZXQsIG1hcCBvciBzdHJ1Y3QuIFRoZXNlIGNvbnN0YW50cyByZXF1aXJlIGFsbG9jYXRpb24gYW5kIGNhbm5vdCBiZSBkZWZpbmVkCisgIC8vIHVzaW5nIGEgJ3B1YiBjb25zdCcuIEFzIGEgcmVzdWx0LCBJIGNyZWF0ZSBhIGhvbGRlciBzdHJ1Y3Qgd2l0aCBhIHNpbmdsZSBgY29uc3RfdmFsdWVgIG1ldGhvZCB0aGF0CisgIC8vIHJldHVybnMgdGhlIGluaXRpYWxpemVkIGluc3RhbmNlLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIHRoZSBhY3R1YWwgY29uc3QgdmFsdWUgLSB0aGUgcmlnaHQgc2lkZSBvZiBhIGNvbnN0IGRlZmluaXRpb24uCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSwgYm9vbCBpc19vd25lZCA9IHRydWUpOworCisgIC8vIFdyaXRlIGEgY29uc3Qgc3RydWN0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3Rfc3RydWN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBsaXN0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfbGlzdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3Qgc2V0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3Rfc2V0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBtYXAgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9tYXAodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBpbnNlcnQgY29uc3RhbnQgdmFsdWVzIGludG8gYSBydXN0IHZlYyBvciBzZXQuIFRoZQorICAvLyBgaW5zZXJ0X2Z1bmN0aW9uYCBpcyB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IHdlJ2xsIHVzZSB0byBpbnNlcnQgdGhlIGVsZW1lbnRzLgorICB2b2lkIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoCisgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRfZnVuY3Rpb24sCisgICAgdF90eXBlKiB0dHlwZSwKKyAgICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUKKyAgKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCBzdHJ1Y3QgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBTZXQgYHN0cnVjdF90eXBlYCB0byBgVF9BUkdTYAorICAvLyBpZiByZW5kZXJpbmcgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgYXJndW1lbnRzIGZvciBhIHNlcnZpY2UgY2FsbC4gV2hlbiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgIHRoZQorICAvLyBzdHJ1Y3QgYW5kIGl0cyBtZW1iZXJzIGhhdmUgbW9kdWxlIHZpc2liaWxpdHksIGFuZCBhbGwgZmllbGRzIGFyZSByZXF1aXJlZC4gV2hlbiBgc3RydWN0X3R5cGVgIGlzCisgIC8vIGFueXRoaW5nIGVsc2UgdGhlIHN0cnVjdCBhbmQgaXRzIG1lbWJlcnMgaGF2ZSBwdWJsaWMgdmlzaWJpbGl0eSBhbmQgZmllbGRzIGhhdmUgdGhlIHZpc2liaWxpdHkgc2V0CisgIC8vIGluIHRoZWlyIGRlZmluaXRpb24uCisgIHZvaWQgcmVuZGVyX3N0cnVjdChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFdyaXRlIHRoZSBjb21tZW50IGJsb2NrIHByZWNlZGluZyBhIHR5cGUgZGVmaW5pdGlvbiAoYW5kIGltcGxlbWVudGF0aW9uKS4KKyAgdm9pZCByZW5kZXJfdHlwZV9jb21tZW50KGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHN0cnVjdC4gU3VwcG9ydHMgYXJndW1lbnQgc3RydWN0cywgcmVzdWx0IHN0cnVjdHMsCisgIC8vIHVzZXItZGVmaW5lZCBzdHJ1Y3RzIGFuZCBleGNlcHRpb24gc3RydWN0cy4gVGhlIGV4YWN0IHN0cnVjdCB0eXBlIHRvIGJlIGdlbmVyYXRlZCBpcyBjb250cm9sbGVkCisgIC8vIGJ5IHRoZSBgc3RydWN0X3R5cGVgIHBhcmFtZXRlciwgd2hpY2ggKGFtb25nIG90aGVyIHRoaW5ncykgbW9kaWZpZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCisgIC8vIHdyaXR0ZW4gc3RydWN0IGFuZCBtZW1iZXJzLCBjb250cm9scyB3aGljaCB0cmFpdCBpbXBsZW1lbnRhdGlvbnMgYXJlIGdlbmVyYXRlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2RlZmluaXRpb24oCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIFdyaXRlcyB0aGUgaW1wbCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJ1Y3QuIEF0IG1pbmltdW0gdGhpcworICAvLyBjb250YWlucyB0aGUgbWV0aG9kcyB0byByZWFkIGZyb20gYSBwcm90b2NvbCBhbmQgd3JpdGUgdG8gYSBwcm90b2NvbC4gQWRkaXRpb25hbCBtZXRob2RzIG1heQorICAvLyBiZSBnZW5lcmF0ZWQgZGVwZW5kaW5nIG9uIGBzdHJ1Y3RfdHlwZWAuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9pbXBsKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBHZW5lcmF0ZSBhIGBmbiBuZXcoLi4uKWAgZm9yIGEgc3RydWN0IHdpdGggbmFtZSBgc3RydWN0X25hbWVgIGFuZCB0eXBlIGB0X3N0cnVjdGAuIFRoZSBhdXRvLWdlbmVyYXRlZAorICAvLyBjb2RlIG1heSBpbmNsdWRlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIHRvIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG1vcmUgZXJnb25vbWljLiBgc3RydWN0X3R5cGVgIGNvbnRyb2xzCisgIC8vIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3IuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcigKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gV3JpdGUgdGhlIGBva19vcmAgbWV0aG9kIGFkZGVkIHRvIGFsbCBUaHJpZnQgc2VydmljZSBjYWxsIHJlc3VsdCBzdHJ1Y3RzLiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZAorICAvLyB0byBjb252ZXJ0IGEgc3RydWN0IGludG8gYSBgUmVzdWx0YCBhbmQgdXNlIGl0IGluIGEgYHRyeSFgIG9yIGNvbWJpbmF0b3IgY2hhaW4uCisgIHZvaWQgcmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGBFcnJvcmAgYW5kIGBEZWJ1Z2AgdHJhaXRzLiBUaGVzZSB0cmFpdHMgYXJlIG5lY2Vzc2FyeSBmb3IgYQorICAvLyB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIHRvIGJlIHByb3Blcmx5IGhhbmRsZWQgYXMgUnVzdCBlcnJvcnMuCisgIHZvaWQgcmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBgRGVmYXVsdGAuIFRoaXMgdHJhaXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG9ubHkgdGhlIGZpZWxkcyB5b3Ugd2FudAorICAvLyBhbmQgdXNlIGAuLkRlZmF1bHQ6OmRlZmF1bHQoKWAgdG8gZmlsbCBpbiB0aGUgcmVzdC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHN0cnVjdCB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4gSWYgYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYAorICAvLyB0aGVuIGFsbCBmaWVsZHMgYXJlIGNvbnNpZGVyZWQgInJlcXVpcmVkIiwgaWYgbm90LCB0aGUgZGVmYXVsdCBvcHRpb25hbGl0eSBpcyB1c2VkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSh0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzaW5nbGUgc3RydWN0IGZpZWxkIHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLiBVbnBhY2tzIHRoZQorICAvLyB2YXJpYWJsZSAoc2luY2UgaXQgbWF5IGJlIG9wdGlvbmFsKSBhbmQgc2VyaWFsaXplcyBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbmFsaXR5IHJ1bGVzIHJlcXVpcmVkIGJ5IGByZXFgLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYGZpZWxkX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKAorICAgIGNvbnN0IHN0cmluZyAmZmllbGRfdmFyLAorICAgIGJvb2wgZmllbGRfdmFyX2lzX3JlZiwKKyAgICB0X2ZpZWxkICp0ZmllbGQsCisgICAgdF9maWVsZDo6ZV9yZXEgcmVxKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzaW5nbGUgdHlwZSAoaS5lLiBhIGkzMiBldGMuKSB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGB0eXBlX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3R5cGVfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCBib29sIHR5cGVfdmFyX2lzX3JlZiwgdF90eXBlICp0dHlwZSk7CisKKyAgLy8gV3JpdGUgYSBsaXN0IHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBsaXN0X3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbGlzdAorICAvLyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYGxpc3RfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfbGlzdF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbGlzdF92YXIsIGJvb2wgbGlzdF92YXJfaXNfcmVmLCB0X2xpc3QgKnRsaXN0KTsKKworICAvLyBXcml0ZSBhIHNldCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgc2V0X3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgc2V0IHRoYXQgd2lsbAorICAvLyBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgc2V0X3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3NldF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmc2V0X3ZhciwgYm9vbCBzZXRfdmFyX2lzX3JlZiwgdF9zZXQgKnRzZXQpOworCisgIC8vIFdyaXRlIGEgbWFwIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBtYXBfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBtYXAgdGhhdCB3aWxsCisgIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBtYXBfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfbWFwX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZtYXBfdmFyLCBib29sIG1hcF92YXJfaXNfcmVmLCB0X21hcCAqdHNldCk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBuZWVkIHRvIGRlcmVmZXJlbmNlIHRocyB0eXBlIHdoZW4gd3JpdGluZyBhbiBlbGVtZW50IGZyb20gYSBjb250YWluZXIuCisgIC8vIEl0ZXJhdGlvbnMgb24gcnVzdCBjb250YWluZXJzIGFyZSBwZXJmb3JtZWQgYXMgZm9sbG93czogYGZvciB2IGluICZ2YWx1ZXMgeyAuLi4gfWAKKyAgLy8gd2hlcmUgYHZgIGhhcyB0eXBlIGAmUlVTVF9UWVBFYCBBbGwgZGVmaW5lZCBmdW5jdGlvbnMgdGFrZSBwcmltaXRpdmVzIGJ5IHZhbHVlLCBzbywgaWYgdGhlCisgIC8vIHJlbmRlcmVkIGNvZGUgaXMgY2FsbGluZyBzdWNoIGEgZnVuY3Rpb24gaXQgaGFzIHRvIGRlcmVmZXJlbmNlIGB2YC4KKyAgYm9vbCBuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB2YXJpYWJsZSAoaW5jbHVkaW5nIGFsbCBkZXJlZmVyZW5jZXMpIHJlcXVpcmVkIHRvIHdyaXRlIHZhbHVlcyBmcm9tIGEgcnVzdCBjb250YWluZXIKKyAgLy8gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgY29udGFpbmVyIGFuZCB1c2luZyB0aGUgdGVtcAorICAvLyB2YXJpYWJsZSBgdmAgdG8gcmVwcmVzZW50IGVhY2ggZWxlbWVudCwgdGhlbiBgdHR5cGVgIGlzIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgY29udGFpbmVyIGFuZAorICAvLyBgYmFzZV92YXJgIGlzICJ2Ii4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZyB5b3Ugd2lsbCBoYXZlIHRvIHVzZSB0byBwcm9wZXJseSByZWZlcmVuY2UKKyAgLy8gdGhlIHRlbXAgdmFyaWFibGUgZm9yIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgc3RyaW5nIHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodF90eXBlKiB0dHlwZSwgY29uc3Qgc3RyaW5nJiBiYXNlX3Zhcik7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gcmVhZCBieXRlcyBmcm9tIHRoZSB3aXJlIGludG8gdGhlIGdpdmVuIGB0X3N0cnVjdGAuIGBzdHJ1Y3RfbmFtZWAgaXMgdGhlCisgIC8vIGFjdHVhbCBSdXN0IG5hbWUgb2YgdGhlIGB0X3N0cnVjdGAuIElmIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AgdGhlbiBhbGwgc3RydWN0IGZpZWxkcyBhcmUKKyAgLy8gbmVjZXNzYXJ5LiBPdGhlcndpc2UsIHRoZSBmaWVsZCdzIGRlZmF1bHQgb3B0aW9uYWxpdHkgaXMgdXNlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnN0cnVjdF9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgZGVzZXJpYWxpemVzIGEgc2luZ2xlIHR5cGUgKGkuZS4gaTMyIGV0Yy4pIGZyb20gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIC8vIFNldCBgaXNfYm94ZWRgIHRvIGB0cnVlYCBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHNob3VsZCBiZSB3cmFwcGVkIGluIGEgYEJveDo6bmV3KC4uLilgLgorICB2b2lkIHJlbmRlcl90eXBlX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCB0X3R5cGUgKnR0eXBlLCBib29sIGlzX2JveGVkID0gZmFsc2UpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgbGlzdCBpcyBzdG9yZWQgaW4gYGxpc3RfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9saXN0X3N5bmNfcmVhZCh0X2xpc3QgKnRsaXN0LCBjb25zdCBzdHJpbmcgJmxpc3RfdmFyaWFibGUpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBzZXQgaXMgc3RvcmVkIGluIGBzZXRfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9zZXRfc3luY19yZWFkKHRfc2V0ICp0c2V0LCBjb25zdCBzdHJpbmcgJnNldF92YXJpYWJsZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIG1hcCBpcyBzdG9yZWQgaW4gYG1hcF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX21hcF9zeW5jX3JlYWQodF9tYXAgKnRtYXAsIGNvbnN0IHN0cmluZyAmbWFwX3ZhcmlhYmxlKTsKKworICAvLyBSZXR1cm4gYSB0ZW1wb3JhcnkgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB2YWx1ZXMgd2hlbiBkZXNlcmlhbGl6aW5nIG5lc3RlZCBjb250YWluZXJzLgorICBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0X2ZpZWxkKiB0ZmllbGQpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSB2YXJpb3VzIHJlbmRlciBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uCisgIC8vIG9mIGEgdGhyaWZ0IHVuaW9uIChpLmUuIGFuIGVudW0pLgorICB2b2lkIHJlbmRlcl91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgVGhyaWZ0IHVuaW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9kZWZpbml0aW9uKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBlbnVtIGltcGwgKHdpdGggcmVhZC93cml0ZSBmdW5jdGlvbnMpIGZvciB0aGUgVGhyaWZ0IHVuaW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9pbXBsKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBgRU5VTTo6d3JpdGVfdG9fb3V0X3Byb3RvY29sYCBmdW5jdGlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fc3luY193cml0ZShjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgYEVOVU06OnJlYWRfZnJvbV9pbl9wcm90b2NvbGAgZnVuY3Rpb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdmFyaW91cyByZW5kZXIgZnVuY3Rpb25zIG5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbgorICAvLyBvZiBhIFRocmlmdCBjbGllbnQuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSB0cmFpdCB3aXRoIHRoZSBzZXJ2aWNlLWNhbGwgbWV0aG9kcyBmb3IgYHRzZXJ2aWNlYC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIHRyYWl0IHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGllbnQgaW1wbCBpZiBlbmQgdXNlcnMgY2FuIHVzZSBpdCB0byBtYWtlIHNlcnZpY2UgY2FsbHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIFRocmlmdCBzZXJ2aWNlIHN5bmMgY2xpZW50IHN0cnVjdCBhbmQgaXRzIG1hdGNoaW5nICdpbXBsJyBibG9jay4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjb25zdCBzdHJpbmcmIGNsaWVudF9pbXBsX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgYFN5bmNDbGllbnQ6Om5ld2AgZnVuY3Rpb25zIGFzIHdlbGwgYXMgYW55IG90aGVyIGZ1bmN0aW9ucworICAvLyBjYWxsZXJzIHdvdWxkIGxpa2UgdG8gdXNlIG9uIHRoZSBUaHJpZnQgc2VydmljZSBzeW5jIGNsaWVudC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjb25zdCBzdHJpbmcmIGNsaWVudF9zdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgaW1wbCBibG9jayBmb3IgdGhlIGBUVGhyaWZ0Q2xpZW50YCB0cmFpdC4gU2luY2UgZ2VuZXJhdGVkCisgIC8vIFJ1c3QgVGhyaWZ0IGNsaWVudHMgcGVyZm9ybSBhbGwgdGhlaXIgb3BlcmF0aW9ucyB1c2luZyBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyB0cmFpdCwgd2UKKyAgLy8gaGF2ZSB0byBpbXBsZW1lbnQgaXQgZm9yIHRoZSBjbGllbnQgc3RydWN0cy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNvbnN0IHN0cmluZyAmY2xpZW50X2ltcGxfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIG1hcmtlciB0cmFpdHMgZm9yIGFueSBzZXJ2aWNlKHMpIGJlaW5nIGV4dGVuZGVkLCBpbmNsdWRpbmcgdGhlIG9uZSBmb3IgdGhlIGN1cnJlbnQKKyAgLy8gc2VydmljZSBpdHNlbGYgKGkuZS4gYHRzZXJ2aWNlYCkKKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRfc2VydmljZSAqdHNlcnZpY2UsIGNvbnN0IHN0cmluZyAmaW1wbF9zdHJ1Y3RfbmFtZSk7CisKKyAgLy8gR2VuZXJhdGUgYSBsaXN0IG9mIGFsbCB0aGUgdHJhaXRzIHRoaXMgVGhyaWZ0IGNsaWVudCBzdHJ1Y3QgZXh0ZW5kcy4KKyAgc3RyaW5nIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCB3cml0ZXMgdGhlIGNvZGUgdG8gbWFrZSB0aGUgVGhyaWZ0IHNlcnZpY2UgY2FsbHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgb3V0IHRvIHRoZSByZW1vdGUgc2VydmljZSBhbmQgcHJvY2Vzc2VzIGl0cyByZXNwb25zZS4KKyAgdm9pZCByZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGUgdGhlIGBzZW5kYCBmdW5jdGlvbmFsaXR5IGZvciBhIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVwcmVzZW50ZWQgYnkgYSBgdF9zZXJ2aWNlLT50X2Z1bmN0aW9uYC4KKyAgdm9pZCByZW5kZXJfc3luY19zZW5kKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZSB0aGUgYHJlY3ZgIGZ1bmN0aW9uYWxpdHkgZm9yIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXByZXNlbnRlZCBieSBhIGB0X3NlcnZpY2UtPnRfZnVuY3Rpb25gLgorICAvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBmdW5jdGlvbiBpcyAqbm90KiBvbmV3YXkuCisgIHZvaWQgcmVuZGVyX3N5bmNfcmVjdih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZoYW5kbGVyX3R5cGUpOworICB2b2lkIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmYXBwX2Vycl92YXIpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZlcnJfdmFyKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICBzdHJpbmcgaGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlcyB0aGUgcmVzdWx0IG9mIGByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdGAgd3JhcHBlZCBpbiBhbiBgRXJyKHRocmlmdDo6RXJyb3IoLi4uKSlgLgorICB2b2lkIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICAgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCisgICk7CisKKyAgLy8gV3JpdGUgYSB0aHJpZnQ6OkVycm9yIHZhcmlhbnQgc3RydWN0LiBFcnJvciBzdHJ1Y3RzIHRha2UgdGhlIGZvcm06CisgIC8vIGBgYAorICAvLyBwdWIgc3RydWN0IGVycm9yX3N0cnVjdCB7CisgIC8vICAga2luZDogc3ViX2Vycm9yX2tpbmQsCisgIC8vICAgbWVzc2FnZTogZXJyb3JfbWVzc2FnZSwKKyAgLy8gfQorICAvLyBgYGAKKyAgLy8gQSBjb25jcmV0ZSBleGFtcGxlIGlzOgorICAvLyBgYGAKKyAgLy8gIHB1YiBzdHJ1Y3QgQXBwbGljYXRpb25FcnJvciB7CisgIC8vICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAvLyAgICBtZXNzYWdlOiAiVGhpcyBpcyBzb21lIGVycm9yIG1lc3NhZ2UiLAorICAvLyAgfQorICAvLyBgYGAKKyAgdm9pZCByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorICApOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgdW5wYWNrZWQgc2VydmljZSBjYWxsIGFyZ3MgZ2l2ZW4gYSBzZXJ2aWNlIGNhbGwgZnVuY3Rpb24KKyAgLy8gYHRfZnVuY3Rpb25gLiBQcmVwZW5kcyB0aGUgYXJncyB3aXRoIGVpdGhlciBgJm11dCBzZWxmYCBvciBgJnNlbGZgIGFuZCBpbmNsdWRlcyB0aGUgYXJnIHR5cGVzCisgIC8vIGluIHRoZSByZXR1cm5lZCBzdHJpbmcsIGZvciBleGFtcGxlOgorICAvLyBgZm4gZm9vKCZtdXQgc2VsZiwgZmllbGRfMDogU3RyaW5nKWAuCisgIHN0cmluZyBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHNlbGZfaXNfbXV0YWJsZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSB1bnBhY2tlZCBzZXJ2aWNlIGNhbGwgYXJncyBnaXZlbiBhIHNlcnZpY2UgY2FsbCBmdW5jdGlvbgorICAvLyBgdF9mdW5jdGlvbmAuIE9ubHkgaW5jbHVkZXMgdGhlIGFyZyBuYW1lcywgZWFjaCBvZiB3aGljaCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBvcHRpb25hbCBwcmVmaXgKKyAgLy8gYGZpZWxkX3ByZWZpeGAsIGZvciBleGFtcGxlOiBgc2VsZi5maWVsZF8wYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXggPSAiIik7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0IGB0c3RydWN0YCBmb3IgdXNlIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIC8vIEVhY2ggZmllbGQgaXMgZm9sbG93ZWQgYnkgaXRzIHR5cGUsIGZvciBleGFtcGxlOiBgZmllbGRfMDogU3RyaW5nYC4KKyAgc3RyaW5nIHN0cnVjdF90b19kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdCBgdHN0cnVjdGAgZm9yIHVzZSBpbiBhIGZ1bmN0aW9uIGNhbGwsCisgIC8vIGZvciBleGFtcGxlOiBgZmllbGRfMDogU3RyaW5nYC4KKyAgc3RyaW5nIHN0cnVjdF90b19pbnZvY2F0aW9uKHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCA9ICIiKTsKKworICAvLyBXcml0ZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBzdHJ1Y3QsIHNlcnZpY2UtY2FsbCBvciBvdGhlciBkb2N1bWVudGF0aW9uLWFubm90YXRlZCBlbGVtZW50LgorICB2b2lkIHJlbmRlcl9ydXN0ZG9jKHRfZG9jKiB0ZG9jKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSB0cnVlIHR5cGUgb2YgYHR0eXBlYCBpcyBhIHRocmlmdCBkb3VibGUsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX2RvdWJsZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBydXN0IHR5cGUgZ2l2ZW4gYSBgdF90eXBlYC4KKyAgc3RyaW5nIHRvX3J1c3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQgPSB0cnVlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgY29uc3RgIHJ1c3QgdHlwZSBnaXZlbiBhIGB0X3R5cGVgCisgIHN0cmluZyB0b19ydXN0X2NvbnN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0ID0gdHJ1ZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmlmdCBgcHJvdG9jb2w6OlRUeXBlYCBnaXZlbiBhIGB0X3R5cGVgLgorICBzdHJpbmcgdG9fcnVzdF9maWVsZF90eXBlX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgYSBzdHJ1Y3QgZmllbGQgd2hpY2ggaGFzIGBPUFRfSU5fUkVRX09VVGAKKyAgLy8gb3B0aW9uYWxpdHkuCisgIHN0cmluZyBvcHRfaW5fcmVxX291dF92YWx1ZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIGNhbiB3cml0ZSBhIGNvbnN0IG9mIHRoZSBmb3JtIGBwdWIgY29uc3QgRk9POiAuLi5gLgorICBib29sIGNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBjYW5ub3Qgd3JpdGUgYSBzdGFuZGFyZCBSdXN0IGNvbnN0YW50IChiZWNhdXNlIHRoZSB0eXBlIG5lZWRzIHNvbWUgYWxsb2NhdGlvbikuCisgIGJvb2wgY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhIHZvaWQsIGFuZCBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHJ1c3QgYCgpYCB0eXBlLgorICBib29sIGlzX3ZvaWQodF90eXBlKiB0dHlwZSk7CisKKyAgdF9maWVsZDo6ZV9yZXEgYWN0dWFsX2ZpZWxkX3JlcSh0X2ZpZWxkKiB0ZmllbGQsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgYHRfZmllbGQ6OmVfcmVxYCBpcyBlaXRoZXIgYHRfZmllbGQ6OlRfT1BUSU9OQUxgIG9yIGB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUYAorICAvLyBhbmQgbmVlZHMgdG8gYmUgd3JhcHBlZCBieSBhbiBgT3B0aW9uPFRZUEVfTkFNRT5gLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19vcHRpb25hbCh0X2ZpZWxkOjplX3JlcSByZXEpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHNlcnZpY2UgY2FsbCBoYXMgYXJndW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBoYXNfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiBhIHNlcnZpY2UgY2FsbCBoYXMgbm9uLWAoKWAgYXJndW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBoYXNfbm9uX3ZvaWRfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIGBwdWIgYCAobm90aWNlIHRyYWlsaW5nIHdoaXRlc3BhY2UhKSBpZiB0aGUgc3RydWN0IHNob3VsZCBiZSBwdWJsaWMsIGBgIChlbXB0eSBzdHJpbmcpIG90aGVyd2lzZS4KKyAgc3RyaW5nIHZpc2liaWxpdHlfcXVhbGlmaWVyKHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciBhIGdpdmVuIFRocmlmdCBzZXJ2aWNlLiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBwcmVzZW50bHktY29tcHV0ZWQKKyAgLy8gVGhyaWZ0IHByb2dyYW0sIHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICBzdHJpbmcgcnVzdF9uYW1lc3BhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgYSBnaXZlbiBUaHJpZnQgdHlwZS4gSWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgcHJlc2VudGx5LWNvbXB1dGVkCisgIC8vIFRocmlmdCBwcm9ncmFtLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgc3RyaW5nIHJ1c3RfbmFtZXNwYWNlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybnMgdGhlIGNhbWVsLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCBzdHJ1Y3QgdHlwZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgdHN0cnVjdC0+Z2V0X25hbWUoKWAgaXMKKyAgLy8gYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF9zdHJ1Y3RfbmFtZSh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc25ha2UtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlCisgIC8vIGB0ZmllbGQtPmdldF9uYW1lKClgIGlzIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3RfZmllbGRfbmFtZSh0X2ZpZWxkKiB0c3RydWN0KTsKKworICAvLyBSZXR1cm5zIHRoZSBjYW1lbC1jYXNlZCBuYW1lIGZvciBhIFJ1c3QgdW5pb24gdHlwZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgdHN0cnVjdC0+Z2V0X25hbWUoKWAgaXMKKyAgLy8gYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF91bmlvbl9maWVsZF9uYW1lKHRfZmllbGQqIHRzdHJ1Y3QpOworCisgIC8vIENvbnZlcnRzIGFueSB2YXJpYWJsZSBuYW1lIGludG8gYSAnc2FmZScgdmFyaWFudCB0aGF0IGRvZXMgbm90IGNsYXNoIHdpdGggYW55IFJ1c3QgcmVzZXJ2ZWQga2V5d29yZHMuCisgIHN0cmluZyBydXN0X3NhZmVfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIG5hbWUgaXMgYSByZXNlcnZlZCBSdXN0IGtleXdvcmQsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX3Jlc2VydmVkKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHVzZXJzIHdpbGwgaW52b2tlIHRvIG1ha2Ugb3V0Z29pbmcgc2VydmljZSBjYWxscy4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHVzZXJzIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdG8gaGFuZGxlIGluY29taW5nIHNlcnZpY2UgY2FsbHMuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHRocmlmdCBzZXJ2aWNlIGNhbGwuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIHRoZSByZXR1cm4gdmFsdWUKKyAgLy8gYW5kIHVzZXItZGVmaW5lZCBleGNlcHRpb25zIGZvciB0aGUgdGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdHJhaXQgbmFtZSBmb3IgdGhlIHN5bmMgc2VydmljZSBjbGllbnQgZ2l2ZW4gYSBgdF9zZXJ2aWNlYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBzeW5jIHNlcnZpY2UgY2xpZW50IHN0cnVjdCBnaXZlbiBhIGB0X3NlcnZpY2VgLgorICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB0cmFpdCBuYW1lIHRoYXQgdXNlcnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCBmb3IgdGhlIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgc3RydWN0IG5hbWUgZm9yIHRoZSAgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdCBuYW1lIGZvciB0aGUgc3RydWN0IHRoYXQgY29udGFpbnMgYWxsIHRoZSBzZXJ2aWNlLWNhbGwgaW1wbGVtZW50YXRpb25zIGZvcgorICAvLyB0aGUgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdmFyaWFudCBuYW1lIGZvciBhbiBlbnVtIHZhcmlhbnQKKyAgc3RyaW5nIHJ1c3RfZW51bV92YXJpYW50X25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBQcm9wZXJseSB1cHBlcmNhc2UgbmFtZXMgZm9yIHVzZSBpbiBSdXN0LgorICBzdHJpbmcgcnVzdF91cHBlcl9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gU25ha2UtY2FzZSBmaWVsZCwgcGFyYW1ldGVyIGFuZCBmdW5jdGlvbiBuYW1lcyBhbmQgbWFrZSB0aGVtIFJ1c3QgZnJpZW5kbHkuCisgIHN0cmluZyBydXN0X3NuYWtlX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBDYW1lbC1jYXNlIHR5cGUvdmFyaWFudCBuYW1lcyBhbmQgbWFrZSB0aGVtIFJ1c3QgZnJpZW5kbHkuCisgIHN0cmluZyBydXN0X2NhbWVsX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgYHNlYXJjaF9zdHJpbmdgIHdpdGggYHJlcGxhY2Vfc3RyaW5nYCBpbiBgdGFyZ2V0YC4KKyAgdm9pZCBzdHJpbmdfcmVwbGFjZShzdHJpbmcmIHRhcmdldCwgY29uc3Qgc3RyaW5nJiBzZWFyY2hfc3RyaW5nLCBjb25zdCBzdHJpbmcmIHJlcGxhY2Vfc3RyaW5nKTsKK307CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBtYWtlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoaXMgdGhyaWZ0IHByb2dyYW0KKyAgTUtESVIoZ2VuX2Rpcl8uY19zdHIoKSk7CisKKyAgLy8gY3JlYXRlIHRoZSBmaWxlIGludG8gd2hpY2ggd2UncmUgZ29pbmcgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBjb2RlCisgIHN0cmluZyBmX2dlbl9uYW1lID0gZ2VuX2Rpcl8gKyAiLyIgKyBydXN0X3NuYWtlX2Nhc2UoZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiLnJzIjsKKyAgZl9nZW5fLm9wZW4oZl9nZW5fbmFtZS5jX3N0cigpKTsKKworICAvLyBoZWFkZXIgY29tbWVudAorICBmX2dlbl8gPDwgIi8vICIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICByZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCkgeworICAvLyB0dXJuIG9mZiBzb21lIGNvbXBpbGVyL2NsaXBweSB3YXJuaW5ncworCisgIC8vIGNvZGUgYWx3YXlzIGluY2x1ZGVzIEJUcmVlTWFwL0JUcmVlU2V0L09yZGVyZWRGbG9hdAorICBmX2dlbl8gPDwgIiMhW2FsbG93KHVudXNlZF9pbXBvcnRzKV0iIDw8IGVuZGw7CisgIC8vIGNvZGUgbWlnaHQgbm90IGluY2x1ZGUgaW1wb3J0cyBmcm9tIGNyYXRlcworICBmX2dlbl8gPDwgIiMhW2FsbG93KHVudXNlZF9leHRlcm5fY3JhdGVzKV0iIDw8IGVuZGw7CisgIC8vIGNvbnN0cnVjdG9ycyB0YWtlICphbGwqIHN0cnVjdCBwYXJhbWV0ZXJzLCB3aGljaCBjYW4gdHJpZ2dlciB0aGUgInRvbyBtYW55IGFyZ3VtZW50cyIgd2FybmluZworICAvLyBzb21lIGF1dG8tZ2VuJ2QgdHlwZXMgY2FuIGJlIGRlZXBseSBuZXN0ZWQuIGNsaXBweSByZWNvbW1lbmRzIGZhY3RvcmluZyB0aGVtIG91dCB3aGljaCBpcyBoYXJkIHRvIGF1dG9nZW4KKyAgZl9nZW5fIDw8ICIjIVtjZmdfYXR0cihmZWF0dXJlID0gXCJjYXJnby1jbGlwcHlcIiwgYWxsb3codG9vX21hbnlfYXJndW1lbnRzLCB0eXBlX2NvbXBsZXhpdHkpKV0iIDw8IGVuZGw7CisgIC8vIHByZXZlbnQgcnVzdGZtdCBmcm9tIHJ1bm5pbmcgYWdhaW5zdCB0aGlzIGZpbGUKKyAgLy8gbGluZXMgYXJlIHRvbyBsb25nLCBjb2RlIGlzICh0aGFua2Z1bGx5ISkgbm90IHZpc3VhbC1pbmRlbnRlZCwgZXRjLgorICBmX2dlbl8gPDwgIiMhW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXRfc2tpcCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhZGQgc3RhbmRhcmQgaW5jbHVkZXMKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIHRocmlmdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y2VsbDo6UmVmQ2VsbDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjplcnJvcjo6RXJyb3I7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmZtdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6cmM6OlJjOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdHJ5X2Zyb206OlRyeUZyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojp7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmQsIFByb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kLCBUVGhyaWZ0Q2xpZW50fTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OntURmllbGRJZGVudGlmaWVyLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjpmaWVsZF9pZDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGU7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHM7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFkZCBhbGwgdGhlIHByb2dyYW0gaW5jbHVkZXMKKyAgLy8gTk9URTogdGhpcyBpcyBtb3JlIGludm9sdmVkIHRoYW4geW91IHdvdWxkIGV4cGVjdCBiZWNhdXNlIG9mIHNlcnZpY2UgZXh0ZW5zaW9uCisgIC8vIEJhc2ljYWxseSwgSSBoYXZlIHRvIGZpbmQgdGhlIGNsb3N1cmUgb2YgYWxsIHRoZSBzZXJ2aWNlcyBhbmQgaW5jbHVkZSB0aGVpciBtb2R1bGVzIGF0IHRoZSB0b3AtbGV2ZWwKKworICBzZXQ8c3RyaW5nPiByZWZlcmVuY2VkX21vZHVsZXM7CisKKyAgLy8gZmlyc3QsIHN0YXJ0IGJ5IGFkZGluZyBleHBsaWNpdCB0aHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gZ2V0X3Byb2dyYW0oKS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jbHVkZXNfaXRlcjsKKyAgZm9yKGluY2x1ZGVzX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNsdWRlc19pdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY2x1ZGVzX2l0ZXIpIHsKKyAgICByZWZlcmVuY2VkX21vZHVsZXMuaW5zZXJ0KCgqaW5jbHVkZXNfaXRlciktPmdldF9uYW1lKCkpOworICB9CisKKyAgLy8gbmV4dCwgcmVjdXJzaXZlbHkgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgc2VydmljZXMgYW5kIGFkZCB0aGUgbmFtZXMgb2YgYW55IHByb2dyYW1zIHRoZXkgcmVmZXJlbmNlCisgIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGdldF9wcm9ncmFtKCktPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHNlcnZpY2VfaXRlcjsKKyAgZm9yIChzZXJ2aWNlX2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzZXJ2aWNlX2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc2VydmljZV9pdGVyKSB7CisgICAgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcygqc2VydmljZV9pdGVyLCByZWZlcmVuY2VkX21vZHVsZXMpOworICB9CisKKyAgLy8gZmluYWxseSwgd3JpdGUgYWxsIHRoZSAicHViIHVzZS4uLiIgZGVjbGFyYXRpb25zCisgIGlmICghcmVmZXJlbmNlZF9tb2R1bGVzLmVtcHR5KCkpIHsKKyAgICBzZXQ8c3RyaW5nPjo6aXRlcmF0b3IgbW9kdWxlX2l0ZXI7CisgICAgZm9yIChtb2R1bGVfaXRlciA9IHJlZmVyZW5jZWRfbW9kdWxlcy5iZWdpbigpOyBtb2R1bGVfaXRlciAhPSByZWZlcmVuY2VkX21vZHVsZXMuZW5kKCk7ICsrbW9kdWxlX2l0ZXIpIHsKKyAgICAgIGZfZ2VuXyA8PCAidXNlICIgPDwgcnVzdF9zbmFrZV9jYXNlKCptb2R1bGVfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfZ2VuXyA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoCisgIHRfc2VydmljZSAqdHNlcnZpY2UsCisgIHNldDxzdHJpbmc+ICZyZWZlcmVuY2VkX21vZHVsZXMKKykgeworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICBpZiAoZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKSAhPSBnZXRfcHJvZ3JhbSgpKSB7CisgICAgICByZWZlcmVuY2VkX21vZHVsZXMuaW5zZXJ0KGV4dGVuZHMtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKGV4dGVuZHMsIHJlZmVyZW5jZWRfbW9kdWxlcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2dlbl8uY2xvc2UoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvbnN0cworLy8KKy8vIE5PVEU6IGNvbnNpZGVyIHVzaW5nIG1hY3JvcyB0byBnZW5lcmF0ZSBjb25zdGFudHMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgaXMgd29yc2UgdGhhbiBpdCBzaG91bGQgYmUgYmVjYXVzZSBjb25zdGFudHMKKy8vIGFyZW4ndCAoc2Vuc2libHkpIGxpbWl0ZWQgdG8gc2NhbGFyIHR5cGVzCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfdHlwZSogdHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaWYgKGNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodHR5cGUpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKGNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodHR5cGUpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihuYW1lLCB0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IGZvciAiICsgbmFtZTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgaWYgKCFjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHR0eXBlKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgc2ltcGxlIHJ1c3QgY29uc3RhbnQgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGZfZ2VuXyA8PCAicHViIGNvbnN0ICIgPDwgcnVzdF91cHBlcl9jYXNlKG5hbWUpIDw8ICI6ICIgPDwgdG9fcnVzdF9jb25zdF90eXBlKHR0eXBlKSA8PCAiID0gIjsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUsIGZhbHNlKTsKKyAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICBpZiAoIWNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodHR5cGUpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdGFudCBob2xkZXIgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBob2xkZXJfbmFtZSgiQ29uc3QiICsgcnVzdF9jYW1lbF9jYXNlKG5hbWUpKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBzdHJ1Y3QgIiA8PCBob2xkZXJfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpbXBsICIgPDwgaG9sZGVyX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBmbiBjb25zdF92YWx1ZSgpIC0+ICIgPDwgdG9fcnVzdF90eXBlKHR0eXBlKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlLCBib29sIGlzX293bmVkKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKGlzX293bmVkKSB7CisgICAgICAgICAgZl9nZW5fIDw8ICJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjw8ICAiLnRvX293bmVkKCkuaW50b19ieXRlcygpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX2dlbl8gPDwgImJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8ICJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgICAgaWYgKGlzX293bmVkKSB7CisgICAgICAgICAgZl9nZW5fIDw8ICIudG9fb3duZWQoKSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCAodHZhbHVlLT5nZXRfaW50ZWdlcigpID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8ICJPcmRlcmVkRmxvYXQ6OmZyb20oIiA8PCB0dmFsdWUtPmdldF9kb3VibGUoKSA8PCAiIGFzIGY2NCkiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgdmFsdWUgZm9yICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUoZ2V0X3RydWVfdHlwZSh0dHlwZSksIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCB0b19ydXN0X3R5cGUodHR5cGUpCisgICAgICA8PCAiOjp0cnlfZnJvbSgiCisgICAgICA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCkKKyAgICAgIDw8ICIpLmV4cGVjdChcImV4cGVjdGluZyB2YWxpZCBjb25zdCB2YWx1ZVwiKSIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmVuZGVyX2NvbnN0X3N0cnVjdCh0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X2xpc3QodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9zZXQodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9tYXAodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgY29udGFpbmVyIHZhbHVlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCB2YWx1ZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9zdHJ1Y3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSopIHsKKyAgaWYgKCgodF9zdHJ1Y3QqKXR0eXBlKS0+aXNfdW5pb24oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInVuaW1wbGVtZW50ZWQhKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidW5pbXBsZW1lbnRlZCEoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbGlzdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCBsOiBWZWM8IiA8PCB0b19ydXN0X3R5cGUoZWxlbV90eXBlKSA8PCAiPiA9IFZlYzo6bmV3KCk7IiA8PCBlbmRsOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGVsZW1fdmFsdWUgPSAoKmVsZW1faXRlcik7CisgICAgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgibC5wdXNoIiwgZWxlbV90eXBlLCBlbGVtX3ZhbHVlKTsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImwiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9zZXQodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCBzOiBCVHJlZVNldDwiIDw8IHRvX3J1c3RfdHlwZShlbGVtX3R5cGUpIDw8ICI+ID0gQlRyZWVTZXQ6Om5ldygpOyIgPDwgZW5kbDsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBlbGVtX3ZhbHVlID0gKCplbGVtX2l0ZXIpOworICAgIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoInMuaW5zZXJ0IiwgZWxlbV90eXBlLCBlbGVtX3ZhbHVlKTsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9tYXAodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCBtOiBCVHJlZU1hcDwiCisgICAgPDwgdG9fcnVzdF90eXBlKGtleV90eXBlKSA8PCAiLCAiIDw8IHRvX3J1c3RfdHlwZSh2YWxfdHlwZSkKKyAgICA8PCAiPiA9IEJUcmVlTWFwOjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvciAoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGtleV92YWx1ZSA9IGVsZW1faXRlci0+Zmlyc3Q7CisgICAgdF9jb25zdF92YWx1ZSogdmFsX3ZhbHVlID0gZWxlbV9pdGVyLT5zZWNvbmQ7CisgICAgaWYgKGdldF90cnVlX3R5cGUoa2V5X3R5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgayA9ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUoa2V5X3R5cGUsIGtleV92YWx1ZSk7CisgICAgICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGsgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUoa2V5X3R5cGUsIGtleV92YWx1ZSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdldF90cnVlX3R5cGUodmFsX3R5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgdiA9ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUodmFsX3R5cGUsIHZhbF92YWx1ZSk7CisgICAgICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHYgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUodmFsX3R5cGUsIHZhbF92YWx1ZSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9nZW5fIDw8ICBpbmRlbnQoKSA8PCAibS5pbnNlcnQoaywgdik7IiA8PCBlbmRsOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgKKyAgY29uc3Qgc3RyaW5nJiBpbnNlcnRfZnVuY3Rpb24sCisgIHRfdHlwZSogdHR5cGUsCisgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZQorKSB7CisgIGlmIChnZXRfdHJ1ZV90eXBlKHR0eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaW5zZXJ0X2Z1bmN0aW9uIDw8ICIoIjsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgICAgZl9nZW5fIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaW5zZXJ0X2Z1bmN0aW9uIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFR5cGVkZWZzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsX3R5cGUgPSB0b19ydXN0X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOworICBmX2dlbl8gPDwgInB1YiB0eXBlICIgPDwgcnVzdF9zYWZlX25hbWUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCBhY3R1YWxfdHlwZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBFbnVtcworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBlbnVtX25hbWUocnVzdF9jYW1lbF9jYXNlKHRlbnVtLT5nZXRfbmFtZSgpKSk7CisgIHJlbmRlcl9lbnVtX2RlZmluaXRpb24odGVudW0sIGVudW1fbmFtZSk7CisgIHJlbmRlcl9lbnVtX2ltcGwoZW51bV9uYW1lKTsKKyAgcmVuZGVyX2VudW1fY29udmVyc2lvbih0ZW51bSwgZW51bV9uYW1lKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1fZGVmaW5pdGlvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZW51bSk7CisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ29weSwgQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJwdWIgZW51bSAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNvbnN0YW50c19pdGVyOworICBmb3IgKGNvbnN0YW50c19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNvbnN0YW50c19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjb25zdGFudHNfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCpjb25zdGFudHNfaXRlcik7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdmFsKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBydXN0X2VudW1fdmFyaWFudF9uYW1lKHZhbC0+Z2V0X25hbWUoKSkKKyAgICAgIDw8ICIgPSAiCisgICAgICA8PCB2YWwtPmdldF92YWx1ZSgpCisgICAgICA8PCAiLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9pbXBsKGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMzIoKnNlbGYgYXMgaTMyKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGVudW1fbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGVudW1fdmFsdWUgPSBpX3Byb3QucmVhZF9pMzIoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZW51bV9uYW1lIDw8ICI6OnRyeV9mcm9tKGVudW1fdmFsdWUpIjsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1fY29udmVyc2lvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICBmX2dlbl8gPDwgImltcGwgVHJ5RnJvbTxpMzI+IGZvciAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidHlwZSBFcnIgPSB0aHJpZnQ6OkVycm9yOyI7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiB0cnlfZnJvbShpOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggaSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjb25zdGFudHNfaXRlcjsKKyAgZm9yIChjb25zdGFudHNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjb25zdGFudHNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY29uc3RhbnRzX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqY29uc3RhbnRzX2l0ZXIpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHZhbC0+Z2V0X3ZhbHVlKCkKKyAgICAgIDw8ICIgPT4gT2soIiA8PCBlbnVtX25hbWUgPDwgIjo6IiA8PCBydXN0X2VudW1fdmFyaWFudF9uYW1lKHZhbC0+Z2V0X25hbWUoKSkgPDwgIiksIgorICAgICAgPDwgZW5kbDsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgImZvcm1hdCEoXCJjYW5ub3QgY29udmVydCBlbnVtIGNvbnN0YW50IHt9IHRvICIgKyBlbnVtX25hbWUgKyAiXCIsIGkpIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN0cnVjdHMsIFVuaW9ucyBhbmQgRXhjZXB0aW9ucworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICByZW5kZXJfc3RydWN0KHJ1c3Rfc3RydWN0X25hbWUodHhjZXB0aW9uKSwgdHhjZXB0aW9uLCB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICByZW5kZXJfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfc3RydWN0KCkpIHsKKyAgICByZW5kZXJfc3RydWN0KHJ1c3Rfc3RydWN0X25hbWUodHN0cnVjdCksIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIpOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgc3RydWN0IGZvciBleGNlcHRpb24iOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3QoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQoc3RydWN0X25hbWUpOworICByZW5kZXJfc3RydWN0X2RlZmluaXRpb24oc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgcmVuZGVyX3N0cnVjdF9pbXBsKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSIHx8IHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKHN0cnVjdF9uYW1lLCB0c3RydWN0KTsKKyAgfQorICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoc3RydWN0X25hbWUsIHRzdHJ1Y3QpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbigKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHN0cnVjdCk7CisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKSA8PCAic3RydWN0ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgIC8vIHJlbmRlciB0aGUgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgICBzdHJpbmcgcnVzdF90eXBlID0gdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBydXN0X3R5cGUgPSBpc19vcHRpb25hbChtZW1iZXJfcmVxKSA/ICJPcHRpb248IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKworICAgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgbWVtYmVyKTsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICAgICAgPDwgcnVzdF9maWVsZF9uYW1lKG1lbWJlcikgPDwgIjogIiA8PCBydXN0X3R5cGUgPDwgIiwiCisgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVycm9yOjpFcnJvciB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRXJyb3IgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgInJlbW90ZSBzZXJ2aWNlIHRocmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8IGVuZGw7IC8vIHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGNvbnZlcnQ6OkZyb20gdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIEZyb208IiA8PCBzdHJ1Y3RfbmFtZSA8PCAiPiBmb3IgdGhyaWZ0OjpFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBmcm9tKGU6ICIgPDwgc3RydWN0X25hbWUgPDwgIikgLT4gU2VsZiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KGUpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGZtdDo6RGlzcGxheSB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRGlzcGxheSBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuZGVzY3JpcHRpb24oKS5mbXQoZikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICptZW1iZXJzX2l0ZXI7CisgICAgaWYgKCFpc19vcHRpb25hbChtZW1iZXItPmdldF9yZXEoKSkpIHsKKyAgICAgIGhhc19yZXF1aXJlZF9maWVsZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9nZW5fIDw8ICJpbXBsIERlZmF1bHQgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBkZWZhdWx0KCkgLT4gU2VsZiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5lbXB0eSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCAqbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG9wdF9pbl9yZXFfb3V0X3ZhbHVlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2ltcGwoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIgfHwgc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcihzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICB9CisKKyAgcmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgcmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUKSB7CisgICAgcmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0c3RydWN0KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3IoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworCisgIC8vIGJ1aWxkIHRoZSBjb252ZW5pZW5jZSB0eXBlIHBhcmFtZXRlcnMgdGhhdCBhbGxvd3MgdXMgdG8gcGFzcyB1bndyYXBwZWQgdmFsdWVzIHRvIGEgY29uc3RydWN0b3IgYW5kCisgIC8vIGhhdmUgdGhlbSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBpbnRvIE9wdGlvbjx2YWx1ZT4KKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworCisgIG9zdHJpbmdzdHJlYW0gZ2VuZXJpY190eXBlX3BhcmFtZXRlcnM7CisgIG9zdHJpbmdzdHJlYW0gZ2VuZXJpY190eXBlX3F1YWxpZmllcnM7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzIDw8ICIsICI7CisgICAgICAgIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzIDw8ICIsICI7CisgICAgICB9CisgICAgICBnZW5lcmljX3R5cGVfcGFyYW1ldGVycyA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgICBnZW5lcmljX3R5cGVfcXVhbGlmaWVycyA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCkgPDwgIjogSW50bzxPcHRpb248IiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiPj4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgPSBnZW5lcmljX3R5cGVfcGFyYW1ldGVycy5zdHIoKTsKKyAgaWYgKHR5cGVfcGFyYW1ldGVyX3N0cmluZy5sZW5ndGgoKSAhPSAwKSB7CisgICAgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nID0gIjwiICsgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nICsgIj4iOworICB9CisKKyAgc3RyaW5nIHR5cGVfcXVhbGlmaWVyX3N0cmluZyA9IGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzLnN0cigpOworICBpZiAodHlwZV9xdWFsaWZpZXJfc3RyaW5nLmxlbmd0aCgpICE9IDApIHsKKyAgICB0eXBlX3F1YWxpZmllcl9zdHJpbmcgPSAid2hlcmUgIiArIHR5cGVfcXVhbGlmaWVyX3N0cmluZyArICIgIjsKKyAgfQorCisgIC8vIG5vdyBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yIGFyZyBsaXN0CisgIC8vIHdoZW4gd2UncmUgYnVpbGRpbmcgdGhpcyBsaXN0IHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHBhcmFtZXRlcnMgaW4gcGxhY2Ugb2YgdGhlIGFjdHVhbCB0eXBlIG5hbWVzCisgIC8vIGlmIG5lY2Vzc2FyeQorICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisgIGZpcnN0X2FyZyA9IHRydWU7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgIGFyZ3MgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgYXJnX3N0cmluZyA9IGFyZ3Muc3RyKCk7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkodmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpKTsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5CisgICAgPDwgImZuIG5ldyIKKyAgICA8PCB0eXBlX3BhcmFtZXRlcl9zdHJpbmcKKyAgICA8PCAiKCIKKyAgICA8PCBhcmdfc3RyaW5nCisgICAgPDwgIikgLT4gIgorICAgIDw8IHN0cnVjdF9uYW1lCisgICAgPDwgIiAiCisgICAgPDwgdHlwZV9xdWFsaWZpZXJfc3RyaW5nCisgICAgPDwgInsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDApIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgIiB7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisKKyAgICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLmludG8oKSwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyB3ZSBkb24ndCB1c2UgdGhlIHJ1c3Qgc3RydWN0IG5hbWUgaW4gdGhpcyBtZXRob2QsIGp1c3QgdGhlIHNlcnZpY2UgY2FsbCBuYW1lCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgLy8gY2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgcmVzdWx0CisgIHNpemVfdCBpbmRleCA9IHNlcnZpY2VfY2FsbF9uYW1lLmZpbmQoUkVTVUxUX1NUUlVDVF9TVUZGSVgsIDApOworICBpZiAoaW5kZXggPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICB0aHJvdyAicmVzdWx0IHN0cnVjdCAiICsgc2VydmljZV9jYWxsX25hbWUgKyAiIG1pc3NpbmcgcmVzdWx0IHN1ZmZpeCI7CisgIH0gZWxzZSB7CisgICAgIHNlcnZpY2VfY2FsbF9uYW1lLnJlcGxhY2UoaW5kZXgsIDYsICIiKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworCisgIC8vIGZpbmQgb3V0IHdoYXQgdGhlIGNhbGwncyBleHBlY3RlZCByZXR1cm4gdHlwZSB3YXMKKyAgc3RyaW5nIHJ1c3RfcmV0dXJuX3R5cGUgPSAiKCkiOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgaWYgKG1lbWJlci0+Z2V0X25hbWUoKSA9PSBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSkgeyAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIHNhZmUgbmFtZSBoZXJlCisgICAgICBydXN0X3JldHVybl90eXBlID0gdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBOT1RFOiBpZGVhbGx5IEkgd291bGQgZ2VuZXJhdGUgdGhlIGJyYW5jaGVzIGFuZCByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5CisgIC8vIEkgdHJpZWQgdGhpcyBob3dldmVyLCBhbmQgdGhlIHJlc3VsdGluZyBjb2RlIHdhcyBoYXJkZXIgdG8gdW5kZXJzdGFuZAorICAvLyBtYWludGFpbmluZyBhIHJlbmRlcmVkIGJyYW5jaCBjb3VudCAod2hpbGUgYSBsaXR0bGUgdWdseSkgZ290IG1lIHRoZQorICAvLyByZW5kZXJpbmcgSSB3YW50ZWQgd2l0aCBjb2RlIHRoYXQgd2FzIHJlYXNvbmFibHkgdW5kZXJzdGFuZGFibGUKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIG9rX29yKHNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgcnVzdF9yZXR1cm5fdHlwZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbnQgcmVuZGVyZWRfYnJhbmNoX2NvdW50ID0gMDsKKworICAvLyByZW5kZXIgdGhlIGV4Y2VwdGlvbiBicmFuY2hlcworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgaWYgKHRmaWVsZC0+Z2V0X25hbWUoKSAhPSBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSkgeyAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIHNhZmUgbmFtZSBoZXJlCisgICAgICBzdHJpbmcgZmllbGRfbmFtZSgic2VsZi4iICsgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkpOworICAgICAgc3RyaW5nIGJyYW5jaF9zdGF0ZW1lbnQgPSByZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCA/ICJpZiIgOiAifSBlbHNlIGlmIjsKKworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGJyYW5jaF9zdGF0ZW1lbnQgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIi5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldygiIDw8IGZpZWxkX25hbWUgPDwgIi51bndyYXAoKSkpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIHJlbmRlcmVkX2JyYW5jaF9jb3VudCsrOworICAgIH0KKyAgfQorCisgIC8vIHJlbmRlciB0aGUgcmV0dXJuIHZhbHVlIGJyYW5jaGVzCisgIGlmIChydXN0X3JldHVybl90eXBlID09ICIoKSIpIHsKKyAgICBpZiAocmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDApIHsKKyAgICAgIC8vIHdlIGhhdmUgdGhlIHVuaXQgcmV0dXJuIGFuZCB0aGlzIHNlcnZpY2UgY2FsbCBoYXMgbm8gdXNlci1kZWZpbmVkCisgICAgICAvLyBleGNlcHRpb25zLiB0aGlzIG1lYW5zIHRoYXQgd2UndmUgYSB0cml2aWFsIHJldHVybiAoaGFwcGVucyB3aXRoIG9uZXdheXMpCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UgaGF2ZSB0aGUgdW5pdCByZXR1cm4sIGJ1dCB0aGVyZSBhcmUgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgICAgIC8vIGlmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhciB0aGVuIHdlIGhhdmUgdGhlIGRlZmF1bHQgcmV0dXJuIChpLmUuIGNhbGwgc3VjY2Vzc2Z1bCkKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIGJyYW5jaF9zdGF0ZW1lbnQgPSByZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCA/ICJpZiIgOiAifSBlbHNlIGlmIjsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgYnJhbmNoX3N0YXRlbWVudCA8PCAiIHNlbGYuIiA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soc2VsZi4iIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICIudW53cmFwKCkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBpZiB3ZSBoYXZlbid0IGZvdW5kIGEgdmFsaWQgcmV0dXJuIHZhbHVlICpvciogYSB1c2VyIGV4Y2VwdGlvbgorICAgIC8vIHRoZW4gd2UncmUgaW4gdHJvdWJsZTsgcmV0dXJuIGEgZGVmYXVsdCBlcnJvcgorICAgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgICAiQXBwbGljYXRpb24iLAorICAgICAgIkFwcGxpY2F0aW9uRXJyb3IiLAorICAgICAgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0IiwKKyAgICAgICJcIm5vIHJlc3VsdCByZWNlaXZlZCBmb3IgIiArIHNlcnZpY2VfY2FsbF9uYW1lICsgIlwiIgorICAgICk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdW5pb25fbmFtZShydXN0X3N0cnVjdF9uYW1lKHRzdHJ1Y3QpKTsKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh1bmlvbl9uYW1lKTsKKyAgcmVuZGVyX3VuaW9uX2RlZmluaXRpb24odW5pb25fbmFtZSwgdHN0cnVjdCk7CisgIHJlbmRlcl91bmlvbl9pbXBsKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fZGVmaW5pdGlvbihjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgcnVzdCBlbnVtIHdpdGggMCBtZW1iZXJzIjsgLy8gbWF5IGJlIHZhbGlkIHRocmlmdCwgYnV0IGl0J3MgaW52YWxpZCBydXN0CisgIH0KKworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAicHViIGVudW0gIiA8PCB1bmlvbl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyX2l0ZXI7CisgIGZvcihtZW1iZXJfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyX2l0ZXIpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZSh0ZmllbGQpCisgICAgICA8PCAiKCIgPDwgdG9fcnVzdF90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiksIgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9pbXBsKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgdW5pb25fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHJlbmRlcl91bmlvbl9zeW5jX3JlYWQodW5pb25fbmFtZSwgdHN0cnVjdCk7CisgIHJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFN0cnVjdCBXcml0ZQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKAorICAgIHRfc3RydWN0ICp0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICA8PCAiZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyB3cml0ZSBzdHJ1Y3QgaGVhZGVyIHRvIG91dHB1dCBwcm90b2NvbAorICAvLyBub3RlOiB1c2UgdGhlICpvcmlnaW5hbCogc3RydWN0IG5hbWUgaGVyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIpOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpPzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgc3RydWN0IG1lbWJlcnMgdG8gb3V0cHV0IHByb3RvY29sCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIG1lbWJlcl92YXIoInNlbGYuIiArIHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZShtZW1iZXJfdmFyLCBmYWxzZSwgbWVtYmVyLCBtZW1iZXJfcmVxKTsKKyAgICB9CisgIH0KKworICAvLyB3cml0ZSBzdHJ1Y3QgZm9vdGVyIHRvIG91dHB1dCBwcm90b2NvbAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyB3cml0ZSBzdHJ1Y3QgaGVhZGVyIHRvIG91dHB1dCBwcm90b2NvbAorICAvLyBub3RlOiB1c2UgdGhlICpvcmlnaW5hbCogc3RydWN0IG5hbWUgaGVyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIpOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpPzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIGVudW0gZmllbGQgdG8gdGhlIG91dHB1dCBwcm90b2NvbAorICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoICpzZWxmIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7CisgICAgICB0X3R5cGUqIHR0eXBlID0gbWVtYmVyLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIG1hdGNoX3ZhcigodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCkpID8gImYiIDogInJlZiBmIik7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgdW5pb25fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZShtZW1iZXIpCisgICAgICAgIDw8ICIoIiA8PCBtYXRjaF92YXIgPDwgIikgPT4geyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKCJmIiwgdHJ1ZSwgbWVtYmVyLCBtZW1iZXJfcmVxKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHdyaXRlIHN0cnVjdCBmb290ZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoCisgIGNvbnN0IHN0cmluZyAmZmllbGRfdmFyLAorICBib29sIGZpZWxkX3Zhcl9pc19yZWYsCisgIHRfZmllbGQgKnRmaWVsZCwKKyAgdF9maWVsZDo6ZV9yZXEgcmVxCispIHsKKyAgdF90eXBlKiBmaWVsZF90eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKKworICBvc3RyaW5nc3RyZWFtIGZpZWxkX3N0cmVhbTsKKyAgZmllbGRfc3RyZWFtCisgICAgPDwgIlRGaWVsZElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgIlwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCAiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShmaWVsZF90eXBlKSA8PCAiLCAiCisgICAgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIikiOworICBzdHJpbmcgZmllbGRfaWRlbnRfc3RyaW5nID0gZmllbGRfc3RyZWFtLnN0cigpOworCisgIGlmIChpc19vcHRpb25hbChyZXEpKSB7CisgICAgc3RyaW5nIGxldF92YXIoKGFjdHVhbF90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhYWN0dWFsX3R5cGUtPmlzX3N0cmluZygpKSA/ICJmbGRfdmFyIiA6ICJyZWYgZmxkX3ZhciIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IFNvbWUoIiA8PCBsZXRfdmFyIDw8ICIpID0gIiA8PCBmaWVsZF92YXIgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCYiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiKT87IiA8PCBlbmRsOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoImZsZF92YXIiLCB0cnVlLCBmaWVsZF90eXBlKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBleHRyYW5lb3VzICcoKScKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7IC8vIEZJWE1FOiByZW1vdmUgZWxzZSBicmFuY2gKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvKiBGSVhNRTogcmV0aGluayBob3cgSSBkZWFsIHdpdGggT1BUX0lOX1JFUV9PVVQKKyAgICBpZiAocmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIjsiIDw8IGVuZGw7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICAgIH0qLworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJiIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZShmaWVsZF92YXIsIGZpZWxkX3Zhcl9pc19yZWYsIHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIGJvb2wgdHlwZV92YXJfaXNfcmVmLCB0X3R5cGUgKnR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCB3cml0ZSBmaWVsZCBvZiB0eXBlIFRZUEVfVk9JRCB0byBvdXRwdXQgcHJvdG9jb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiB7CisgICAgICBzdHJpbmcgcmVmKHR5cGVfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9ieXRlcygiICsgcmVmICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RyaW5nKCIgKyByZWYgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2Jvb2woIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTgoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kxNigiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTMyKCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pNjQoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2RvdWJsZSgiICsgdHlwZV92YXIgKyAiLmludG8oKSk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKikgdHR5cGU7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCB0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHR5cGVfdmFyICsgIi53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXJfbWFwX3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfbWFwICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyX3NldF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X3NldCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXJfbGlzdF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X2xpc3QgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfQorCisgIHRocm93ICJjYW5ub3Qgd3JpdGUgdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9saXN0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZsaXN0X3ZhciwgYm9vbCBsaXN0X3Zhcl9pc19yZWYsIHRfbGlzdCAqdGxpc3QpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCIKKyAgICA8PCAiJlRMaXN0SWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShlbGVtX3R5cGUpIDw8ICIsICIKKyAgICA8PCBsaXN0X3ZhciA8PCAiLmxlbigpIGFzIGkzMiIgPDwgIikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYobGlzdF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBlIGluICIgPDwgcmVmIDw8IGxpc3RfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShlbGVtX3R5cGUsICJlIiksIHRydWUsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2xpc3RfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2V0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZzZXRfdmFyLCBib29sIHNldF92YXJfaXNfcmVmLCB0X3NldCAqdHNldCkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCIKKyAgICA8PCAiJlRTZXRJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGVsZW1fdHlwZSkgPDwgIiwgIgorICAgIDw8IHNldF92YXIgPDwgIi5sZW4oKSBhcyBpMzIiIDw8ICIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKHNldF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBlIGluICIgPDwgcmVmIDw8IHNldF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGVsZW1fdHlwZSwgImUiKSwgdHJ1ZSwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc2V0X2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX21hcF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbWFwX3ZhciwgYm9vbCBtYXBfdmFyX2lzX3JlZiwgdF9tYXAgKnRtYXApIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX21hcF9iZWdpbigiCisgICAgPDwgIiZUTWFwSWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShrZXlfdHlwZSkgPDwgIiwgIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHZhbF90eXBlKSA8PCAiLCAiCisgICAgPDwgbWFwX3ZhciA8PCAiLmxlbigpIGFzIGkzMikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYobWFwX3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIChrLCB2KSBpbiAiIDw8IHJlZiA8PCBtYXBfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShrZXlfdHlwZSwgImsiKSwgdHJ1ZSwga2V5X3R5cGUpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodmFsX3R5cGUsICJ2IiksIHRydWUsIHZhbF90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWFwX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHRfdHlwZSogdHR5cGUsIGNvbnN0IHN0cmluZyYgYmFzZV92YXIpIHsKKyAgYm9vbCB0eXBlX25lZWRzX2RlcmVmID0gbmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHR0eXBlKTsKKyAgYm9vbCB0eXBlX2lzX2RvdWJsZSA9IGlzX2RvdWJsZSh0dHlwZSk7CisKKyAgc3RyaW5nIHdyaXRlX3ZhcmlhYmxlOworCisgIGlmICh0eXBlX2lzX2RvdWJsZSAmJiB0eXBlX25lZWRzX2RlcmVmKSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSAiKCoiICsgYmFzZV92YXIgKyAiKSI7CisgIH0gZWxzZSBpZiAodHlwZV9uZWVkc19kZXJlZikgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gIioiICsgYmFzZV92YXI7CisgIH0gZWxzZSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSBiYXNlX3ZhcjsKKyAgfQorCisgIHJldHVybiB3cml0ZV92YXJpYWJsZTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6bmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBTdHJ1Y3QgUmVhZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoCisgICAgY29uc3Qgc3RyaW5nICZzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgIDw8ICJmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHN0cnVjdF9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZXM6IG9uZSBmb3IgZWFjaCBmaWVsZCBpbiB0aGUgc3RydWN0CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG11dCAiIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUobWVtYmVyKQorICAgICAgPDwgIjogT3B0aW9uPCIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIj4gPSAiOworICAgICAgaWYgKG1lbWJlcl9yZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBmX2dlbl8gPDwgb3B0X2luX3JlcV9vdXRfdmFsdWUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgIk5vbmU7IjsKKyAgICAgIH0KKyAgICAgIGZfZ2VuXyA8PCBlbmRsOworICB9CisKKyAgLy8gbm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIHdlJ3ZlIHJlY2VpdmVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibG9vcCB7IiA8PCBlbmRsOyAvLyBzdGFydCBsb29wCisgIGluZGVudF91cCgpOworCisgIC8vIGJyZWFrIG91dCBpZiB5b3UndmUgZm91bmQgdGhlIFN0b3AgZmllbGQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSBpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBub3cgcmVhZCBhbGwgdGhlIGZpZWxkcyBmb3VuZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZCA9IGZpZWxkX2lkKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBmaWVsZF9pZCB7IiA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKCJ2YWwiLCB0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCkgPDwgIiA9IFNvbWUodmFsKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gZGVmYXVsdCBjYXNlIChza2lwIGZpZWxkcykKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsgLy8gZmluaXNoIG1hdGNoCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBmaW5pc2ggbG9vcAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKT87IiA8PCBlbmRsOyAvLyByZWFkIG1lc3NhZ2UgZm9vdGVyIGZyb20gdGhlIHdpcmUKKworICAvLyB2ZXJpZnkgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGV4aXN0CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICBpZiAoIWlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0cygiCisgICAgICAgIDw8ICJcIiIgPDwgc3RydWN0X25hbWUgPDwgIi4iIDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpIDw8ICJcIiIKKyAgICAgICAgPDwgIiwgIgorICAgICAgICA8PCAiJiIgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpCisgICAgICAgIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gY29uc3RydWN0IHRoZSBzdHJ1Y3QKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDApIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IHN0cnVjdF9uYW1lIDw8ICIge307IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lKHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpKTsKKyAgICAgIHN0cmluZyBmaWVsZF9rZXkgPSBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCk7CisgICAgICBpZiAoaXNfb3B0aW9uYWwocmVxKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZmllbGRfbmFtZSA8PCAiOiAiIDw8IGZpZWxkX2tleSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXworICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgZmllbGRfbmFtZQorICAgICAgICAgIDw8ICI6ICIKKyAgICAgICAgICA8PCBmaWVsZF9rZXkKKyAgICAgICAgICA8PCAiLmV4cGVjdChcImF1dG8tZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGhhdmUgY2hlY2tlZCBmb3IgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgZmllbGRzXCIpIgorICAgICAgICAgIDw8ICIsIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCB2YWx1ZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHJldCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgdW5pb25fbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGhvbGQgdGhlCisgIC8vIGNvbXBsZXRlZCB1bmlvbiBhcyB3ZWxsIGFzIGEgY291bnQgb2YgZmllbGRzIHJlYWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHJldDogT3B0aW9uPCIgPDwgdW5pb25fbmFtZSA8PCAiPiA9IE5vbmU7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgcmVjZWl2ZWRfZmllbGRfY291bnQgPSAwOyIgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBzdHJ1Y3QgcHJlYW1ibGUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIC8vIG5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyB3ZSd2ZSByZWNlaXZlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxvb3AgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbG9vcAorICBpbmRlbnRfdXAoKTsKKworICAvLyBicmVhayBvdXQgaWYgeW91J3ZlIGZvdW5kIHRoZSBTdG9wIGZpZWxkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gbm93IHJlYWQgYWxsIHRoZSBmaWVsZHMgZm91bmQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWQgPSBmaWVsZF9pZCgmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggZmllbGRfaWQgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyLT5nZXRfa2V5KCkgPDwgIiA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCgidmFsIiwgbWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIHJldC5pc19ub25lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicmV0ID0gU29tZSgiIDw8IHVuaW9uX25hbWUgPDwgIjo6IiA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUobWVtYmVyKSA8PCAiKHZhbCkpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlZF9maWVsZF9jb3VudCArPSAxOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBkZWZhdWx0IGNhc2UgKHNraXAgZmllbGRzKQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlZF9maWVsZF9jb3VudCArPSAxOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOyAvLyBmaW5pc2ggbWF0Y2gKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGZpbmlzaCBsb29wCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpPzsiIDw8IGVuZGw7IC8vIGZpbmlzaCByZWFkaW5nIG1lc3NhZ2UgZnJvbSB3aXJlCisKKyAgLy8gcmV0dXJuIHRoZSB2YWx1ZSBvciBhbiBlcnJvcgorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIHJlY2VpdmVkX2ZpZWxkX2NvdW50ID09IDAgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgIlwicmVjZWl2ZWQgZW1wdHkgdW5pb24gZnJvbSByZW1vdGUgIiArIHVuaW9uX25hbWUgKyAiXCIiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHJlY2VpdmVkX2ZpZWxkX2NvdW50ID4gMSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiXCJyZWNlaXZlZCBtdWx0aXBsZSBmaWVsZHMgZm9yIHVuaW9uIGZyb20gcmVtb3RlICIgKyB1bmlvbl9uYW1lICsgIlwiIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhyZXQuZXhwZWN0KFwicmV0dXJuIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4gY29uc3RydWN0ZWRcIikpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIHRfdHlwZSAqdHR5cGUsIGJvb2wgaXNfYm94ZWQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IHJlYWQgZmllbGQgb2YgdHlwZSBUWVBFX1ZPSUQgZnJvbSBpbnB1dCBwcm90b2NvbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfYnl0ZXMoKT87IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfc3RyaW5nKCk/OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9ib29sKCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTgoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTE2KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2kzMigpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pNjQoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gT3JkZXJlZEZsb2F0Ojpmcm9tKGlfcHJvdC5yZWFkX2RvdWJsZSgpPyk7IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gRklYTUU6IG5vdCBhIGZhbiBvZiBzZXBhcmF0ZSBgaXNfYm94ZWRgIHBhcmFtZXRlcgorICAgIC8vIFRoaXMgaXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCdzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciwgYW5kIG9ubHkgY29tZXMKKyAgICAvLyBpbnRvIHBsYXkgb25jZS4gVGhlIGNvcmUgaXNzdWUgaXMgdGhhdCBJIGxvc2UgYW4gaW1wb3J0YW50IHBpZWNlIG9mIHR5cGUKKyAgICAvLyBpbmZvcm1hdGlvbiAod2hldGhlciB0aGUgdHlwZSBpcyBhIGZ3ZCByZWYpIGJ5IHVud3JhcHBpbmcgdGhlIHR5cGVkZWYnZAorICAgIC8vIHR5cGUgYW5kIG1ha2luZyB0aGUgcmVjdXJzaXZlIGNhbGwgdXNpbmcgaXQuIEkgY2FuJ3QgbW9kaWZ5IG9yIHdyYXAgdGhlCisgICAgLy8gZ2VuZXJhdGVkIHN0cmluZyBhZnRlciB0aGUgZmFjdCBiZWNhdXNlIGl0J3Mgd3JpdHRlbiBkaXJlY3RseSBpbnRvIHRoZSBmaWxlLAorICAgIC8vIHNvIEkgaGF2ZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFsb25nLiBHb2luZyB3aXRoIHRoaXMgYXBwcm9hY2ggYmVjYXVzZSBpdAorICAgIC8vIHNlZW1zIGxpa2UgdGhlIGxvd2VzdC1jb3N0IG9wdGlvbiB0byBlYXNpbHkgc3VwcG9ydCByZWN1cnNpdmUgdHlwZXMuCisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCh0eXBlX3ZhciwgdHR5cGVkZWYtPmdldF90eXBlKCksIHR0eXBlZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIHJlYWRfY2FsbCh0b19ydXN0X3R5cGUodHR5cGUpICsgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdCk/Iik7CisgICAgcmVhZF9jYWxsID0gaXNfYm94ZWQgPyAiQm94OjpuZXcoIiArIHJlYWRfY2FsbCArICIpIiA6IHJlYWRfY2FsbDsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9ICIgPDwgIHJlYWRfY2FsbCA8PCAiOyIKKyAgICAgIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJlbmRlcl9tYXBfc3luY19yZWFkKCh0X21hcCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXJfc2V0X3N5bmNfcmVhZCgodF9zZXQgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlcl9saXN0X3N5bmNfcmVhZCgodF9saXN0ICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhyb3cgImNhbm5vdCByZWFkIHVuc3VwcG9ydGVkIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbGlzdF9zeW5jX3JlYWQodF9saXN0ICp0bGlzdCwgY29uc3Qgc3RyaW5nICZsaXN0X3ZhcikgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbGlzdF9pZGVudCA9IGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgbGlzdF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRsaXN0KQorICAgIDw8ICIgPSBWZWM6OndpdGhfY2FwYWNpdHkobGlzdF9pZGVudC5zaXplIGFzIHVzaXplKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5saXN0X2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbGlzdF9lbGVtX3ZhciA9IHRtcCgibGlzdF9lbGVtXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQobGlzdF9lbGVtX3ZhciwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGxpc3RfdmFyIDw8ICIucHVzaCgiIDw8IGxpc3RfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2xpc3RfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2V0X3N5bmNfcmVhZCh0X3NldCAqdHNldCwgY29uc3Qgc3RyaW5nICZzZXRfdmFyKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHNldF9pZGVudCA9IGlfcHJvdC5yZWFkX3NldF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBzZXRfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0c2V0KQorICAgIDw8ICIgPSBCVHJlZVNldDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4uc2V0X2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgc2V0X2VsZW1fdmFyID0gdG1wKCJzZXRfZWxlbV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHNldF9lbGVtX3ZhciwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHNldF92YXIgPDwgIi5pbnNlcnQoIiA8PCBzZXRfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3NldF9lbmQoKT87IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9tYXBfc3luY19yZWFkKHRfbWFwICp0bWFwLCBjb25zdCBzdHJpbmcgJm1hcF92YXIpIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWFwX2lkZW50ID0gaV9wcm90LnJlYWRfbWFwX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IG1hcF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRtYXApCisgICAgPDwgIiA9IEJUcmVlTWFwOjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5tYXBfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBrZXlfZWxlbV92YXIgPSB0bXAoIm1hcF9rZXlfIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChrZXlfZWxlbV92YXIsIGtleV90eXBlKTsKKyAgc3RyaW5nIHZhbF9lbGVtX3ZhciA9IHRtcCgibWFwX3ZhbF8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHZhbF9lbGVtX3ZhciwgdmFsX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWFwX3ZhciA8PCAiLmluc2VydCgiIDw8IGtleV9lbGVtX3ZhciA8PCAiLCAiIDw8IHZhbF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfbWFwX2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZvc3M7CisgIGZvc3MgPDwgImZfIiA8PCB0ZmllbGQtPmdldF9rZXkoKTsKKyAgcmV0dXJuIGZvc3Muc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIENsaWVudAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJlbmRlcl9zeW5jX2NsaWVudCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKworICAvLyB0aHJpZnQgYXJncyBmb3Igc2VydmljZSBjYWxscyBhcmUgcGFja2VkCisgIC8vIGludG8gYSBzdHJ1Y3QgdGhhdCdzIHRyYW5zbWl0dGVkIG92ZXIgdGhlIHdpcmUsIHNvCisgIC8vIGdlbmVyYXRlIHN0cnVjdHMgZm9yIHRob3NlIHRvbworICAvLworICAvLyB0aHJpZnQgcmV0dXJucyBhcmUgKmFsc28qIHBhY2tlZCBpbnRvIGEgc3RydWN0CisgIC8vIHRoYXQncyBwYXNzZWQgb3ZlciB0aGUgd2lyZSwgc28sIGdlbmVyYXRlIHRoZSBzdHJ1Y3QKKyAgLy8gZm9yIHRoYXQgdG9vLiBOb3RlIHRoYXQgdGhpcyByZXN1bHQgc3RydWN0ICphbHNvKgorICAvLyBjb250YWlucyB0aGUgZXhjZXB0aW9ucyBhcyB3ZWxsCisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRmdW5jKTsKKyAgICBpZiAoIXRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgICAgcmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRmdW5jKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsaWVudF9pbXBsX25hbWUocnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodHNlcnZpY2UpKTsKKworICByZW5kZXJfdHlwZV9jb21tZW50KHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIiBzZXJ2aWNlIGNsaWVudCIpOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIHJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjbGllbnRfaW1wbF9uYW1lKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjbGllbnRfaW1wbF9uYW1lKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0c2VydmljZSwgY2xpZW50X2ltcGxfbmFtZSk7IGZfZ2VuXyA8PCBlbmRsOworICByZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuc2lvbiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBleHRlbnNpb24gPSAiIDogIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKGV4dGVuZHMpOworICB9CisKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHNlcnZpY2UpOworICBmX2dlbl8gPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgZXh0ZW5zaW9uIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgICAgc3RyaW5nIGZ1bmNfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIHRydWUpOworICAgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGZ1bmMpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gIiA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfYXJncyA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4gPDwgIj47IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgIiB7fSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModF9zZXJ2aWNlICp0c2VydmljZSwgY29uc3Qgc3RyaW5nICZpbXBsX3N0cnVjdF9uYW1lKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IHJ1c3RfbmFtZXNwYWNlKHRzZXJ2aWNlKSA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKQorICAgIDw8ICIgZm9yICIKKyAgICA8PCBpbXBsX3N0cnVjdF9uYW1lIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7fSIKKyAgICA8PCBlbmRsOworCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHMoZXh0ZW5kcywgaW1wbF9zdHJ1Y3RfbmFtZSk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY29uc3Qgc3RyaW5nJiBjbGllbnRfaW1wbF9uYW1lKSB7CisKKyAgLy8gcmVuZGVyIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgY2xpZW50IHN0cnVjdAorICBmX2dlbl8KKyAgICA8PCAicHViIHN0cnVjdCAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9pX3Byb3Q6IElQLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfb19wcm90OiBPUCwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX3NlcXVlbmNlX251bWJlcjogaTMyLCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyByZW5kZXIgdGhlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbgorICAvLyB0aGlzIGluY2x1ZGVzIHRoZSBuZXcoKSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHRoZSBoZWxwZXIgc2VuZC9yZWN2IG1ldGhvZHMgZm9yIGVhY2ggc2VydmljZSBjYWxsCisgIGZfZ2VuXworICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNsaWVudF9pbXBsX25hbWUpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjb25zdCBzdHJpbmcmIGNsaWVudF9zdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIG5ldyhpbnB1dF9wcm90b2NvbDogSVAsIG91dHB1dF9wcm90b2NvbDogT1ApIC0+ICIKKyAgICA8PCBjbGllbnRfc3RydWN0CisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgY2xpZW50X3N0cnVjdAorICAgIDw8ICIgeyBfaV9wcm90OiBpbnB1dF9wcm90b2NvbCwgX29fcHJvdDogb3V0cHV0X3Byb3RvY29sLCBfc2VxdWVuY2VfbnVtYmVyOiAwIH0iCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY29uc3Qgc3RyaW5nICZjbGllbnRfaW1wbF9uYW1lKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgVFRocmlmdENsaWVudCBmb3IgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBpX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUSW5wdXRQcm90b2NvbCB7ICZtdXQgc2VsZi5faV9wcm90IH0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gb19wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVE91dHB1dFByb3RvY29sIHsgJm11dCBzZWxmLl9vX3Byb3QgfSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBzZXF1ZW5jZV9udW1iZXIoJnNlbGYpIC0+IGkzMiB7IHNlbGYuX3NlcXVlbmNlX251bWJlciB9IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiBpbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCZtdXQgc2VsZikgLT4gaTMyIHsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyICs9IDE7IHNlbGYuX3NlcXVlbmNlX251bWJlciB9IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBtYXJrZXJfZXh0ZW5zaW9uID0gIiIgKyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odHNlcnZpY2UpOworCisgIGZfZ2VuXworICAgIDw8ICJpbXBsIDxDOiBUVGhyaWZ0Q2xpZW50ICsgIiA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBtYXJrZXJfZXh0ZW5zaW9uIDw8ICI+ICIKKyAgICA8PCBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodHNlcnZpY2UpCisgICAgPDwgIiBmb3IgQyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiBmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKGZ1bmMpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgbWFya2VyX2V4dGVuc2lvbjsKKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICBtYXJrZXJfZXh0ZW5zaW9uID0gIiArICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgICAgbWFya2VyX2V4dGVuc2lvbiA9IG1hcmtlcl9leHRlbnNpb24gKyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24oZXh0ZW5kcyk7CisgIH0KKworICByZXR1cm4gbWFya2VyX2V4dGVuc2lvbjsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgIHN0cmluZyBmdW5jX2RlY2xfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIHRydWUpOworICBzdHJpbmcgZnVuY19jYWxsX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odGZ1bmMpOworICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuICIgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2RlY2xfYXJncyA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4KKyAgICA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX3NlbmQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIik/OyIgPDwgZW5kbDsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX3JlY3YodGZ1bmMpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19zZW5kKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIgYW5kIGdlbmVyYXRlIHRoZSBjYWxsIGhlYWRlcgorICBzdHJpbmcgbWVzc2FnZV90eXBlID0gdGZ1bmMtPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T25lV2F5IiA6ICJUTWVzc2FnZVR5cGU6OkNhbGwiOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigpOyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSAiCisgICAgPDwgIlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KFwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIDw8IG1lc3NhZ2VfdHlwZSA8PCAiLCAiCisgICAgPDwgInNlbGYuc2VxdWVuY2VfbnVtYmVyKCkpOyIKKyAgICA8PCBlbmRsOworICAvLyBwYWNrIHRoZSBhcmd1bWVudHMgaW50byB0aGUgY29udGFpbmluZyBzdHJ1Y3QgdGhhdCB3ZSdsbCB3cml0ZSBvdXQgb3ZlciB0aGUgd2lyZQorICAvLyBub3RlIHRoYXQgdGhpcyBzdHJ1Y3QgaXMgZ2VuZXJhdGVkIGV2ZW4gaWYgd2UgaGF2ZSAwIGFyZ3MKKyAgb3N0cmluZ3N0cmVhbSBzdHJ1Y3RfZGVmaW5pdGlvbjsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICBzdHJ1Y3RfZGVmaW5pdGlvbiA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIsICI7CisgIH0KKyAgc3RyaW5nIHN0cnVjdF9maWVsZHMgPSBzdHJ1Y3RfZGVmaW5pdGlvbi5zdHIoKTsKKyAgaWYgKHN0cnVjdF9maWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHN0cnVjdF9maWVsZHMgPSBzdHJ1Y3RfZmllbGRzLnN1YnN0cigwLCBzdHJ1Y3RfZmllbGRzLnNpemUoKSAtIDIpOyAvLyBzdHJpcCB0cmFpbGluZyBjb21tYQorICB9CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBjYWxsX2FyZ3MgPSAiCisgICAgPDwgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpCisgICAgPDwgIiB7ICIKKyAgICA8PCBzdHJ1Y3RfZmllbGRzCisgICAgPDwgIiB9OyIKKyAgICA8PCBlbmRsOworICAvLyB3cml0ZSBldmVyeXRoaW5nIG92ZXIgdGhlIHdpcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImNhbGxfYXJncy53cml0ZV90b19vdXRfcHJvdG9jb2woc2VsZi5vX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7IC8vIHdyaXR0ZW4gZXZlbiBpZiB3ZSBoYXZlIDAgYXJncworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS5mbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcmVjdih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIoc2VsZi5zZXF1ZW5jZV9udW1iZXIoKSwgbWVzc2FnZV9pZGVudC5zZXF1ZW5jZV9udW1iZXIpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbChcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwiXCIsICZtZXNzYWdlX2lkZW50Lm5hbWUpPzsiIDw8IGVuZGw7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgLy8gRklYTUU6IHJlcGxhY2Ugd2l0aCBhICJ0cnkiIGJsb2NrCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgbWVzc2FnZV9pZGVudC5tZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlbW90ZV9lcnJvciA9IHRocmlmdDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbChzZWxmLmlfcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJlbW90ZV9lcnJvcikpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZShUTWVzc2FnZVR5cGU6OlJlcGx5LCBtZXNzYWdlX2lkZW50Lm1lc3NhZ2VfdHlwZSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzdWx0ID0gIiA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKSA8PCAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woc2VsZi5pX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Lm9rX29yKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgc2VsZl9pc19tdXRhYmxlKSB7CisgIG9zdHJpbmdzdHJlYW0gZnVuY19hcmdzOworCisgIGlmIChzZWxmX2lzX211dGFibGUpIHsKKyAgICBmdW5jX2FyZ3MgPDwgIigmbXV0IHNlbGYiOworICB9IGVsc2UgeworICAgIGZ1bmNfYXJncyA8PCAiKCZzZWxmIjsKKyAgfQorCisgIGlmIChoYXNfYXJncyh0ZnVuYykpIHsKKyAgICBmdW5jX2FyZ3MgPDwgIiwgIjsgLy8gcHV0IGNvbW1hIGFmdGVyICJzZWxmIgorICAgIGZ1bmNfYXJncyA8PCBzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odGZ1bmMtPmdldF9hcmdsaXN0KCksIFRfQVJHUyk7CisgIH0KKworICBmdW5jX2FyZ3MgPDwgIikiOworICByZXR1cm4gZnVuY19hcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXgpIHsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jX2FyZ3M7CisgIGZ1bmNfYXJncyA8PCAiKCI7CisKKyAgaWYgKGhhc19hcmdzKHRmdW5jKSkgeworICAgIGZ1bmNfYXJncyA8PCBzdHJ1Y3RfdG9faW52b2NhdGlvbih0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgZmllbGRfcHJlZml4KTsKKyAgfQorCisgIGZ1bmNfYXJncyA8PCAiKSI7CisgIHJldHVybiBmdW5jX2FyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X3RvX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisKKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmZpZWxkX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIGZpZWxkX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHRvX3J1c3RfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIHJ1c3RfdHlwZSA9IGlzX29wdGlvbmFsKGZpZWxkX3JlcSkgPyAiT3B0aW9uPCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGFyZ3MgPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkgPDwgIjogIiA8PCBydXN0X3R5cGU7CisgIH0KKworICByZXR1cm4gYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfdG9faW52b2NhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXgpIHsKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworCisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCpmaWVsZF9pdGVyKTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgYXJncyA8PCBmaWVsZF9wcmVmaXggPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCk7CisgIH0KKworICByZXR1cm4gYXJncy5zdHIoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICAgIHN0cmluZyBhcmdzX3N0cnVjdF9uYW1lKHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKSk7CisgICAgcmVuZGVyX3N0cnVjdChhcmdzX3N0cnVjdF9uYW1lLCB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgdF9yc19nZW5lcmF0b3I6OlRfQVJHUyk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdHJpbmcgcmVzdWx0X3N0cnVjdF9uYW1lID0gc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYyk7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgcmVzdWx0X3N0cnVjdF9uYW1lKTsKKworICB0X2ZpZWxkIHJldHVybl92YWx1ZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUsIDApOworICByZXR1cm5fdmFsdWUuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgaWYgKCF0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmcmV0dXJuX3ZhbHVlKTsKKyAgfQorCisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9uX3R5cGVzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhjZXB0aW9uX2l0ZXI7CisgIGZvcihleGNlcHRpb25faXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBleGNlcHRpb25faXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXhjZXB0aW9uX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBleGNlcHRpb25fdHlwZSA9ICpleGNlcHRpb25faXRlcjsKKyAgICBleGNlcHRpb25fdHlwZS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICByZXN1bHQuYXBwZW5kKGV4Y2VwdGlvbl90eXBlKTsKKyAgfQorCisgIHJlbmRlcl9zdHJ1Y3QocmVzdWx0X3N0cnVjdF9uYW1lLCAmcmVzdWx0LCB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBQcm9jZXNzb3IKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiIHNlcnZpY2UgcHJvY2Vzc29yIik7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbnNpb24gPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBleHRlbnNpb24gPSAiIDogIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c2VydmljZSk7CisgIGZfZ2VuXyA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgZXh0ZW5zaW9uIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgICAgc3RyaW5nIGZ1bmNfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIGZhbHNlKTsKKyAgICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRmdW5jKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4gIgorICAgICAgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2FyZ3MKKyAgICAgIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybiA8PCAiPjsiCisgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodHNlcnZpY2UpOworICBzdHJpbmcgaGFuZGxlcl90cmFpdF9uYW1lID0gcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0c2VydmljZSk7CisKKyAgLy8gc3RydWN0CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBzdHJ1Y3QgIiA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIOiAiIDw8IGhhbmRsZXJfdHJhaXRfbmFtZQorICAgIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaGFuZGxlcjogSCwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gZGVsZWdhdGluZyBpbXBsCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgPEg6ICIgPDwgaGFuZGxlcl90cmFpdF9uYW1lIDw8ICI+ICIKKyAgICA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBmbiBuZXcoaGFuZGxlcjogSCkgLT4gIiA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lIDw8ICI8SD4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaGFuZGxlciwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRzZXJ2aWNlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhY3R1YWwgaW1wbAorICBzdHJpbmcgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPSBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0c2VydmljZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHN0cnVjdCAiIDw8IHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpbXBsICIgPDwgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odGZ1bmMsIGhhbmRsZXJfdHJhaXRfbmFtZSk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIHByb2Nlc3NvciBpbXBsCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgPEg6ICIKKyAgICA8PCBoYW5kbGVyX3RyYWl0X25hbWUgPDwgIj4gVFByb2Nlc3NvciBmb3IgIgorICAgIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gcHJvY2Vzcygmc2VsZiwgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzID0gbWF0Y2ggJiptZXNzYWdlX2lkZW50Lm5hbWUgeyIgPDwgZW5kbDsgLy8gW3NpZ2hdIGV4cGxpY2l0IGRlcmVmIGNvZXJjaW9uCisgIGluZGVudF91cCgpOworICByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtZXRob2QgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIkFwcGxpY2F0aW9uIiwKKyAgICAiQXBwbGljYXRpb25FcnJvciIsCisgICAgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kIiwKKyAgICAiZm9ybWF0IShcInVua25vd24gbWV0aG9kIHt9XCIsIG1ldGhvZCkiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OnNlcnZlcjo6aGFuZGxlX3Byb2Nlc3NfcmVzdWx0KCZtZXNzYWdlX2lkZW50LCByZXMsIG9fcHJvdCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgYWN0dWFsX3Byb2Nlc3NvcihydXN0X25hbWVzcGFjZSh0c2VydmljZSkgKyBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0c2VydmljZSkpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUoInByb2Nlc3NfIiArIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiAiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgIDw8ICIoJnNlbGYsICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXI6IGkzMiwgIgorICAgICAgPDwgImlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgIgorICAgICAgPDwgIm9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpICIKKyAgICAgIDw8ICItPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBhY3R1YWxfcHJvY2Vzc29yCisgICAgICA8PCAiOjoiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgIDw8ICIoIgorICAgICAgPDwgIiZzZWxmLmhhbmRsZXIsICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIsICIKKyAgICAgIDw8ICJpX3Byb3QsICIKKyAgICAgIDw8ICJvX3Byb3QiCisgICAgICA8PCAiKSIKKyAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnMoZXh0ZW5kcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCAiID0+IHsiIDw8IGVuZGw7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAic2VsZi5wcm9jZXNzXyIgPDwgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKQorICAgICAgPDwgIihtZXNzYWdlX2lkZW50LnNlcXVlbmNlX251bWJlciwgaV9wcm90LCBvX3Byb3QpIgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKGV4dGVuZHMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmaGFuZGxlcl90eXBlKSB7CisgIHN0cmluZyBzZXF1ZW5jZV9udW1iZXJfcGFyYW0oImluY29taW5nX3NlcXVlbmNlX251bWJlciIpOworICBzdHJpbmcgb3V0cHV0X3Byb3RvY29sX3BhcmFtKCJvX3Byb3QiKTsKKworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgc2VxdWVuY2VfbnVtYmVyX3BhcmFtID0gIl8iOworICAgIG91dHB1dF9wcm90b2NvbF9wYXJhbSA9ICJfIjsKKyAgfQorCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiBwcm9jZXNzXyIgPDwgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKQorICAgIDw8ICI8SDogIiA8PCBoYW5kbGVyX3R5cGUgPDwgIj4iCisgICAgPDwgIihoYW5kbGVyOiAmSCwgIgorICAgIDw8IHNlcXVlbmNlX251bWJlcl9wYXJhbSA8PCAiOiBpMzIsICIKKyAgICA8PCAiaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCAiCisgICAgPDwgb3V0cHV0X3Byb3RvY29sX3BhcmFtIDw8ICI6ICZtdXQgVE91dHB1dFByb3RvY29sKSAiCisgICAgPDwgIi0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gKmFsd2F5cyogcmVhZCBhcmd1bWVudHMgZnJvbSB0aGUgaW5wdXQgcHJvdG9jb2wKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0ICIKKyAgICA8PCAoaGFzX25vbl92b2lkX2FyZ3ModGZ1bmMpID8gImFyZ3MiIDogIl8iKQorICAgIDw8ICIgPSAiCisgICAgPDwgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpCisgICAgPDwgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdCk/OyIKKyAgICA8PCBlbmRsOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm1hdGNoIGhhbmRsZXIuIgorICAgIDw8IHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodGZ1bmMpCisgICAgPDwgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRmdW5jLCAiYXJncy4iKQorICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICAvLyBoYW5kbGVyIHN1Y2NlZWRlZAorICBzdHJpbmcgaGFuZGxlcl9yZXR1cm5fdmFyaWFibGUgPSB0ZnVuYy0+aXNfb25ld2F5KCkgfHwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICJfIiA6ICJoYW5kbGVyX3JldHVybiI7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soIiA8PCBoYW5kbGVyX3JldHVybl92YXJpYWJsZSA8PCAiKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICAvLyBoYW5kbGVyIGZhaWxlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycihlKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZW5kIG1hdGNoCisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBlbmQgZnVuY3Rpb24KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJlcGx5LCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0ZnVuYykgPDwiOyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldC53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIHN0cmluZyBlcnJfdmFyKCJlIik7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCAiIDw8IGVycl92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpZiB0aGVyZSBhcmUgYW55IHVzZXItZGVmaW5lZCBleGNlcHRpb25zIGZvciB0aGlzIHNlcnZpY2UgY2FsbCBoYW5kbGUgdGhlbSBmaXJzdAorICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSAhPSBOVUxMICYmIHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKKyAgICBzdHJpbmcgdXNlcl9lcnJfdmFyKCJ1c3JfZXJyIik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpVc2VyKCIgPDwgdXNlcl9lcnJfdmFyIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRmdW5jKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBhcHBsaWNhdGlvbiBlcnJvcgorICBzdHJpbmcgYXBwX2Vycl92YXIoImFwcF9lcnIiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigiIDw8IGFwcF9lcnJfdmFyIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKHRmdW5jLCBhcHBfZXJyX3Zhcik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgLy8gZGVmYXVsdCBjYXNlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSA9PSBOVUxMIHx8IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiY2Fubm90IHJlbmRlciB1c2VyIGV4Y2VwdGlvbiBicmFuY2hlcyBpZiBubyB1c2VyIGV4Y2VwdGlvbnMgZGVmaW5lZCI7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IHR4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKKyAgaW50IGJyYW5jaGVzX3JlbmRlcmVkID0gMDsKKworICAvLyBydW4gdGhyb3VnaCBhbGwgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgZm9yICh4Y2VwdGlvbl9pdGVyID0gdHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHR4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgIHRfZmllbGQqIHhjZXB0aW9uX2ZpZWxkID0gKCp4Y2VwdGlvbl9pdGVyKTsKKworICAgIHN0cmluZyBpZl9zdGF0ZW1lbnQoYnJhbmNoZXNfcmVuZGVyZWQgPT0gMCA/ICJpZiB1c3JfZXJyIiA6ICJ9IGVsc2UgaWYgdXNyX2VyciIpOworICAgIHN0cmluZyBleGNlcHRpb25fdHlwZSh0b19ydXN0X3R5cGUoeGNlcHRpb25fZmllbGQtPmdldF90eXBlKCkpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaWZfc3RhdGVtZW50IDw8ICIuZG93bmNhc3RfcmVmOjo8IiA8PCBleGNlcHRpb25fdHlwZSA8PCAiPigpLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBlcnIgPSB1c3JfZXJyLmRvd25jYXN0Ojo8IiA8PCBleGNlcHRpb25fdHlwZSA8PCAiPigpLmV4cGVjdChcImRvd25jYXN0IGFscmVhZHkgY2hlY2tlZFwiKTsiCisgICAgICA8PCBlbmRsOworCisgICAgLy8gcmVuZGVyIHRoZSBtZW1iZXJzIG9mIHRoZSByZXR1cm4gc3RydWN0CisgICAgb3N0cmluZ3N0cmVhbSBtZW1iZXJzOworCisgICAgYm9vbCBoYXNfcmVzdWx0X3ZhcmlhYmxlID0gISh0ZnVuYy0+aXNfb25ld2F5KCkgfHwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSk7CisgICAgaWYgKGhhc19yZXN1bHRfdmFyaWFibGUpIHsKKyAgICAgIG1lbWJlcnMgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIjogTm9uZSwgIjsKKyAgICB9CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9tZW1iZXJzX2l0ZXI7CisgICAgZm9yKHhjZXB0aW9uX21lbWJlcnNfaXRlciA9IHR4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25fbWVtYmVyc19pdGVyICE9IHR4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25fbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKnhjZXB0aW9uX21lbWJlcnNfaXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgaWYgKG1lbWJlciA9PSB4Y2VwdGlvbl9maWVsZCkgeworICAgICAgICBtZW1iZXJzIDw8IG1lbWJlcl9uYW1lIDw8ICI6IFNvbWUoKmVyciksICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1iZXJzIDw8IG1lbWJlcl9uYW1lIDw8ICI6IE5vbmUsICI7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIG1lbWJlcl9zdHJpbmcgPSBtZW1iZXJzLnN0cigpOworICAgIG1lbWJlcl9zdHJpbmcucmVwbGFjZShtZW1iZXJfc3RyaW5nLnNpemUoKSAtIDIsIDIsICIgIik7IC8vIHRyaW0gdHJhaWxpbmcgY29tbWEKKworICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHJldHVybiBzdHJ1Y3QKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IHJldF9lcnIgPSAiCisgICAgICA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKQorICAgICAgPDwgInsgIiA8PCBtZW1iZXJfc3RyaW5nIDw8ICJ9OyIKKyAgICAgIDw8IGVuZGw7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSAiCisgICAgICA8PCAiVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UmVwbHksICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldF9lcnIud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBicmFuY2hlc19yZW5kZXJlZCsrOworICB9CisKKyAgLy8gdGhlIGNhdGNoIGFsbCwgaWYgc29tZWhvdyBpdCB3YXMgYSB1c2VyIGV4Y2VwdGlvbiB0aGF0IHdlIGRvbid0IHN1cHBvcnQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRklYTUU6IHNhbWUgYXMgZGVmYXVsdCBibG9jayBiZWxvdworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldF9lcnIgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoIkFwcGxpY2F0aW9uRXJyb3IiLCAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24iLCAidXNyX2Vyci5kZXNjcmlwdGlvbigpIik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsICJyZXRfZXJyIik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKAorICAgIHRfZnVuY3Rpb24gKnRmdW5jLAorICAgIGNvbnN0IHN0cmluZyAmYXBwX2Vycl92YXIKKykgeworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oIiA8PCBhcHBfZXJyX3ZhciA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgYXBwX2Vycl92YXIpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXRfZXJyID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KCJBcHBsaWNhdGlvbkVycm9yIiwgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duIiwgImUuZGVzY3JpcHRpb24oKSIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmV0X2VycikpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsICJyZXRfZXJyIik7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZlcnJfdmFyKSB7CisgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjp3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woJiIgPDwgZXJyX3ZhciA8PCAiLCBvX3Byb3QpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBpbnQgbWVtYmVyX2NvdW50ID0gMDsKKyAgb3N0cmluZ3N0cmVhbSByZXR1cm5fc3RydWN0OworCisgIHJldHVybl9zdHJ1Y3QgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykgPDwgIiB7ICI7CisKKyAgLy8gYWN0dWFsIHJldHVybgorICBpZiAoIXRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXR1cm5fc3RydWN0IDw8ICJyZXN1bHRfdmFsdWU6IFNvbWUoaGFuZGxlcl9yZXR1cm4pIjsKKyAgICBtZW1iZXJfY291bnQrKzsKKyAgfQorCisgIC8vIGFueSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSAhPSBOVUxMKSB7CisgICAgdF9zdHJ1Y3QqIHR4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHR4Y2VwdGlvbnMtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbl9maWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIGlmIChtZW1iZXJfY291bnQgPiAwKSB7IHJldHVybl9zdHJ1Y3QgPDwgIiwgIjsgfQorICAgICAgcmV0dXJuX3N0cnVjdCA8PCBydXN0X2ZpZWxkX25hbWUoeGNlcHRpb25fZmllbGQpIDw8ICI6IE5vbmUiOworICAgICAgbWVtYmVyX2NvdW50Kys7CisgICAgfQorICB9CisKKyAgcmV0dXJuX3N0cnVjdCA8PCAiIH0iOworCisgIHJldHVybiAgcmV0dXJuX3N0cnVjdC5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdHkKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX2NvbW1lbnQoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKKyAgZl9nZW5fIDw8ICIvLyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8gTk9URTogZG8gKm5vdCogcHV0IGluIGFuIGV4dHJhIG5ld2xpbmUgYWZ0ZXIgZG9jIGlzIGdlbmVyYXRlZC4KKy8vIFRoaXMgaXMgYmVjYXVzZSBydXN0IGRvY3MgaGF2ZSB0byBhYnV0IHRoZSBsaW5lIHRoZXkncmUgZG9jdW1lbnRpbmcuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcnVzdGRvYyh0X2RvYyogdGRvYykgeworICBpZiAoIXRkb2MtPmhhc19kb2MoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KGZfZ2VuXywgIiIsICIvLy8gIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90aHJpZnRfZXJyb3IoCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6IiA8PCBlcnJvcl9raW5kIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoZXJyb3Jfc3RydWN0LCBzdWJfZXJyb3Jfa2luZCwgZXJyb3JfbWVzc2FnZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlcnJvcl9zdHJ1Y3QgPDwgIjo6bmV3KCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdWJfZXJyb3Jfa2luZCA8PCAiLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVycm9yX21lc3NhZ2UgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19kb3VibGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCkgeworICAvLyB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOyA8LS0gcmVjdXJzZXMgdGhyb3VnaCBhcyBtYW55IHR5cGVkZWYgbGF5ZXJzIGFzIG5lY2Vzc2FyeQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJWZWM8dTg+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImk4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmIChvcmRlcmVkX2Zsb2F0KSB7CisgICAgICAgIHJldHVybiAiT3JkZXJlZEZsb2F0PGY2ND4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJmNjQiOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIHN0cmluZyBydXN0X3R5cGUgPSBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCk7CisgICAgcnVzdF90eXBlID0gIHR0eXBlZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSA/ICJCb3g8IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKyAgICByZXR1cm4gcnVzdF90eXBlOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgcnVzdF9jYW1lbF9jYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgcnVzdF9jYW1lbF9jYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuICJCVHJlZU1hcDwiICsgdG9fcnVzdF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyB0b19ydXN0X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIkJUcmVlU2V0PCIgKyB0b19ydXN0X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiVmVjPCIgKyB0b19ydXN0X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGZpbmQgcnVzdCB0eXBlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF9jb25zdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgaWYgKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICImW3U4XSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIiZzdHIiOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0b19ydXN0X3R5cGUodHR5cGUsIG9yZGVyZWRfZmxvYXQpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJ3aWxsIG5vdCBnZW5lcmF0ZSBwcm90b2NvbDo6VFR5cGUgZm9yIFRZUEVfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IC8vIGJvdGggc3RyaW5ncyBhbmQgYmluYXJ5IGFyZSBhY3R1YWxseSBlbmNvZGVkIGFzIFRUeXBlOjpTdHJpbmcKKyAgICAgIHJldHVybiAiVFR5cGU6OlN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZTo6Qm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkwOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlOjpEb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGU6Ok1hcCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U2V0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TGlzdCI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGZpbmQgVFR5cGUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpvcHRfaW5fcmVxX291dF92YWx1ZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIE9QVF9JTl9SRVFfT1VUIHZhbHVlIGZvciB2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIlNvbWUoVmVjOjpuZXcoKSkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTb21lKFwiXCIudG9fb3duZWQoKSkiOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiU29tZShmYWxzZSkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlNvbWUoMCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJTb21lKE9yZGVyZWRGbG9hdDo6ZnJvbSgwLjApKSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlNvbWUoVmVjOjpuZXcoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiU29tZShCVHJlZVNldDo6bmV3KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlNvbWUoQlRyZWVNYXA6Om5ldygpKSI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIG9wdC1pbi1yZXEtb3V0IHZhbHVlIGZvciB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6Y2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0X3R5cGUqIHR0eXBlKSB7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKGFjdHVhbF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKilhY3R1YWxfdHlwZTsKKyAgICByZXR1cm4gISh0YmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodF90eXBlKiB0dHlwZSkgeworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHJldHVybiAhY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdChhY3R1YWxfdHlwZSkgJiYgIWFjdHVhbF90eXBlLT5pc19zZXJ2aWNlKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX3ZvaWQodF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19vcHRpb25hbCh0X2ZpZWxkOjplX3JlcSByZXEpIHsKKyAgcmV0dXJuIHJlcSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IHJlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworfQorCit0X2ZpZWxkOjplX3JlcSB0X3JzX2dlbmVyYXRvcjo6YWN0dWFsX2ZpZWxkX3JlcSh0X2ZpZWxkKiB0ZmllbGQsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIHJldHVybiBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTID8gdF9maWVsZDo6VF9SRVFVSVJFRCA6IHRmaWVsZC0+Z2V0X3JlcSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpoYXNfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gdGZ1bmMtPmdldF9hcmdsaXN0KCkgIT0gTlVMTCAmJiAhdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpLmVtcHR5KCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Omhhc19ub25fdm9pZF9hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGJvb2wgaGFzX25vbl92b2lkX2FyZ3MgPSBmYWxzZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ3NfaXRlcjsKKyAgZm9yIChhcmdzX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ3NfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ3NfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqYXJnc19pdGVyKTsKKyAgICBpZiAoIXRmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBoYXNfbm9uX3ZvaWRfYXJncyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gaGFzX25vbl92b2lkX2FyZ3M7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dmlzaWJpbGl0eV9xdWFsaWZpZXIodF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgc3dpdGNoKHN0cnVjdF90eXBlKSB7CisgIGNhc2UgdF9yc19nZW5lcmF0b3I6OlRfQVJHUzoKKyAgY2FzZSB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQ6CisgICAgcmV0dXJuICIiOworICBkZWZhdWx0OgorICAgIHJldHVybiAicHViICI7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X25hbWVzcGFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSAhPSBnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSB7CisgICAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiOjoiOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfbmFtZXNwYWNlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICE9IGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpIHsKKyAgICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICI6OiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICIiOworICB9Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX3Jlc2VydmVkKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQuZmluZChuYW1lKSAhPSBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVC5lbmQoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N0cnVjdF9uYW1lKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBiYXNlX3N0cnVjdF9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX3N0cnVjdF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2ZpZWxkX25hbWUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0cmluZyBiYXNlX2ZpZWxkX25hbWUocnVzdF9zbmFrZV9jYXNlKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9maWVsZF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3VuaW9uX2ZpZWxkX25hbWUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0cmluZyBiYXNlX2ZpZWxkX25hbWUocnVzdF9jYW1lbF9jYXNlKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9maWVsZF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3NhZmVfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgaWYgKGlzX3Jlc2VydmVkKG5hbWUpKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gImhhbmRsZV8iICsgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICAvLyBUaHJpZnQgYXV0b21hdGljYWxseSBhcHBlbmRzIGBBcmdzYCB0byB0aGUgYXJnbGlzdCBuYW1lLiBObyBuZWVkIHRvIGRvIGl0IGhlcmUuCisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2Uoc2VydmljZV9uYW1lXykgKyBydXN0X2NhbWVsX2Nhc2UodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZShzZXJ2aWNlX25hbWVfKSArIHJ1c3RfY2FtZWxfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkgKyBSRVNVTFRfU1RSVUNUX1NVRkZJWDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudE1hcmtlciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudCI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50IjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0hhbmRsZXIiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNQcm9jZXNzb3IiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc0Z1bmN0aW9ucyI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9lbnVtX3ZhcmlhbnRfbmFtZShjb25zdCBzdHJpbmcgJm5hbWUpIHsKKyAgYm9vbCBhbGxfdXBwZXJjYXNlID0gdHJ1ZTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoaXNhbG51bShuYW1lW2ldKSAmJiBpc2xvd2VyKG5hbWVbaV0pKSB7CisgICAgICBhbGxfdXBwZXJjYXNlID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoYWxsX3VwcGVyY2FzZSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKGNhbWVsY2FzZShsb3dlcmNhc2UobmFtZSkpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShjYW1lbGNhc2UobmFtZSkpOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF91cHBlcl9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKHVwcGVyY2FzZSh1bmRlcnNjb3JlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl9fIiwgIl8iKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3NuYWtlX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIoZGVjYXBpdGFsaXplKHVuZGVyc2NvcmUobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiX18iLCAiXyIpOworICByZXR1cm4gc3RyOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfY2FtZWxfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cihjYXBpdGFsaXplKGNhbWVsY2FzZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfIiwgIiIpOworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpzdHJpbmdfcmVwbGFjZShzdHJpbmcmIHRhcmdldCwgY29uc3Qgc3RyaW5nJiBzZWFyY2hfc3RyaW5nLCBjb25zdCBzdHJpbmcmIHJlcGxhY2Vfc3RyaW5nKSB7CisgIGlmICh0YXJnZXQuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBtYXRjaF9sZW4gPSBzZWFyY2hfc3RyaW5nLmxlbmd0aCgpOworICBzaXplX3QgcmVwbGFjZV9sZW4gPSByZXBsYWNlX3N0cmluZy5sZW5ndGgoKTsKKworICBzaXplX3Qgc2VhcmNoX2lkeCA9IDA7CisgIHNpemVfdCBtYXRjaF9pZHg7CisgIHdoaWxlICgobWF0Y2hfaWR4ID0gdGFyZ2V0LmZpbmQoc2VhcmNoX3N0cmluZywgc2VhcmNoX2lkeCkpICE9IHN0cmluZzo6bnBvcykgeworICAgIHRhcmdldC5yZXBsYWNlKG1hdGNoX2lkeCwgbWF0Y2hfbGVuLCByZXBsYWNlX3N0cmluZyk7CisgICAgc2VhcmNoX2lkeCA9IG1hdGNoX2lkeCArIHJlcGxhY2VfbGVuOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgIHJzLAorICAiUnVzdCIsCisgICJcbiIpIC8vIG5vIFJ1c3QtZ2VuZXJhdG9yLXNwZWNpZmljIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YTk0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTA1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogU21hbGx0YWxrIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9zdF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9zdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgdGVtcG9yYXJ5X3ZhciA9IDA7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3Q6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICBzdGQ6OnN0cmluZyBtYXBfcmVhZGVyKHRfbWFwKiB0bWFwKTsKKyAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCk7CisgIHN0ZDo6c3RyaW5nIHNldF9yZWFkZXIodF9zZXQqIHRzZXQpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKKworICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNldF93cml0ZXIodF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmbmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgd3JpdGVfdmFsKHRfdHlwZSogdCwgc3RkOjpzdHJpbmcgZm5hbWUpOworICBzdGQ6OnN0cmluZyByZWFkX3ZhbCh0X3R5cGUqIHQpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKKworICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKKyAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CisgIHZvaWQgc3RfZ2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKKworICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7CisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisgIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOworICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7CisgIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgaW50IHRlbXBvcmFyeV92YXI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLnN0IjsKKyAgZl8ub3BlbihmX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfIDw8IHN0X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgc3RfY2xhc3NfZGVmKGZfLCBwcm9ncmFtX25hbWVfKTsKKyAgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Cit9CisKK2Jvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOworICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7CisgIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgeworICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiciKSArICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICJETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIichXG4iOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7CisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8IHByZWZpeChjbGFzc19uYW1lKCkpCisgICAgIDw8ICIgZW51bXMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQorICAgICA8PCAiIGNvbnN0YW50cyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7CisgIGZfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgeworICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOworICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKKyAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgorICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCppdGVyID09ICcuJykgeworICAgICAgKml0ZXIgPSAnLSc7CisgICAgfQorICB9CisgIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICBvdXQgPDwgIk9iamVjdCBzdWJjbGFzczogIyIgPDwgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImluc3RhbmNlVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNsYXNzVmFyaWFibGVOYW1lczogJyciCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwb29sRGljdGlvbmFyaWVzOiAnJyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2F0ZWdvcnk6ICciCisgICAgICA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgY2F0ZWdvcnkpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKKyAgY2hhciB0aW1lc3RyWzUwXTsKKyAgdGltZV90IHJhd3RpbWU7CisgIHN0cnVjdCB0bSogdGluZm87CisKKyAgdGltZSgmcmF3dGltZSk7CisgIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKKyAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKKworICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8ICIgbWV0aG9kc0ZvcjogJyIgKyBjYXRlZ29yeSArICInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0cgorICAgICAgPDwgIichXG4iIDw8IG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICI6ICIgKyB0eXBlKTsKKyAgb3V0IDw8IG5hbWUgPDwgIiA6PSAiICsgdHlwZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOworICBvdXQgPDwgIl4gIiA8PCBuYW1lOworICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7CisgIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIKKyAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworCisgIGZfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiCisgICAgIDw8ICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfIDw8ICJcdGF0OiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgcHV0OiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgIlx0eW91cnNlbGYpXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6ICciIDw8IG5hbWUgPDwgIicgcHV0OiBbIgorICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiBwdXQ6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0CisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICJFcnJvciI7CisgIGVsc2UKKyAgICBvdXQgPDwgIk9iamVjdCI7CisKKyAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiICI7CisgICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisKKyAgb3V0IDw8ICInXG4iCisgICAgICA8PCAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKKyAgc3dpdGNoICh0b2xvd2VyKGMpKSB7CisgIGNhc2UgJ2EnOgorICBjYXNlICdlJzoKKyAgY2FzZSAnaSc6CisgIGNhc2UgJ28nOgorICBjYXNlICd1JzoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcHJlZml4OworCisgIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQorICAgIHByZWZpeCA9ICJhbiI7CisgIGVsc2UKKyAgICBwcmVmaXggPSAiYSI7CisKKyAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdHlwZTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RfYWNjZXNzb3JzKG91dCwKKyAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHR5cGVfbmFtZSh0c3RydWN0KSksCisgICAgICAgICAgICAgICAgICAgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgYV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0ZW1wX25hbWUoKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIG91dCA8PCAidGVtcCIgPDwgdGVtcG9yYXJ5X3ZhcisrOworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF93cml0ZXIodF9tYXAqIHRtYXAsIHN0cmluZyBmbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcga2V5ID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZU1hcEJlZ2luOiAoVE1hcCBuZXcga2V5VHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICA8PCAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIga2V5c0FuZFZhbHVlc0RvOiBbOiIgPDwga2V5IDw8ICIgOiIgPDwgdmFsIDw8ICIgfCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTWFwRW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfcmVhZGVyKHRfbWFwKiB0bWFwKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRNYXBCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsCisgICAgICA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGF0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRNYXBFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3dyaXRlcih0X2xpc3QqIHRsaXN0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlTGlzdEJlZ2luOiAoVExpc3QgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTGlzdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRMaXN0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gT3JkZXJlZENvbGxlY3Rpb24gbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZExpc3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU2V0QmVnaW46IChUU2V0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTZXRFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF9yZWFkZXIodF9zZXQqIHRzZXQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkU2V0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gU2V0IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFNldEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF93cml0ZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBzbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIgorICAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiJykuIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgc3RyaW5nIGZuYW1lID0gY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgYWNjZXNzb3IgPSBzbmFtZSArICIgIiArIGNhbWVsY2FzZShmbmFtZSk7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3NvciA8PCAiIGlmTm90TmlsOiBbIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkQmVnaW46IChURmllbGQgbmV3IG5hbWU6ICciIDw8IGZuYW1lCisgICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBhY2Nlc3NvcikgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQiOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgIl0iOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgIi4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIGNsc05hbWUgPSAiIikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZm91bmQgPSB0ZW1wX25hbWUoKTsKKworICBpZiAoY2xzTmFtZS5zaXplKCkgPT0gMCkgeworICAgIGNsc05hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICB9CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBUaGlzIGlzIG5hc3R5LCBidXQgd2l0aG91dCBpdCB3ZSdsbCBicmVhayB0aGluZ3MgYnkgcHJlZml4aW5nIFRSZXN1bHQuCisgIHN0cmluZyBuYW1lID0gKChjYXBpdGFsaXplKGNsc05hbWUpID09ICJUUmVzdWx0IikgPyBjYXBpdGFsaXplKGNsc05hbWUpIDogcHJlZml4KGNsc05hbWUpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9ICIgPDwgbmFtZSA8PCAiIG5ldy4iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU3RydWN0QmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIiA8PCBkZXNjCisgICAgICA8PCAiIDo9IGlwcm90IHJlYWRGaWVsZEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiIGlmVHJ1ZTogWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIDo9IHRydWUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiICIKKyAgICAgICAgPDwgY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp3cml0ZV92YWwodF90eXBlKiB0LCBzdHJpbmcgZm5hbWUpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGVEb3VibGU6ICIgKyBmbmFtZSArICIgYXNGbG9hdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3dyaXRlcigodF9zdHJ1Y3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCB3cml0ZUkzMjogIiArIGZuYW1lOworICB9IGVsc2UgeworICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byB3cml0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVhZF92YWwodF90eXBlKiB0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZCIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3JlYWRlcigodF9tYXAqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfcmVhZGVyKCh0X3NldCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7CisgIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VxaWQ6IHNlbGYgbmV4dFNlcWlkKS4iCisgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKQorICAgICAgIDw8ICIpLiIgPDwgZW5kbDsKKworICAgIGZfIDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgZm5hbWUpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7CisKKyAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKK30KKworLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKworICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKKyAgICB0X2ZpZWxkKiBleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOworICB9CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKKyAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInNlbGYgdmFsaWRhdGVSZW1vdGVNZXNzYWdlOiBtc2cuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iCisgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaC4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJeIHJlcyI7CisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAiXCIiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiXCIiOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsCisgICAgIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICA8PCAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisKKyAgICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksIHNpZ25hdHVyZSk7CisgICAgZl8gPDwgZnVuY3Rpb25fdHlwZXNfY29tbWVudCgqZl9pdGVyKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmIHNlbmQiCisgICAgICAgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdF9jbG9zZV9tZXRob2QoZl8pOworCisgICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlIGkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlIGk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUgaTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBtYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzZXQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Ioc3QsICJTbWFsbHRhbGsiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zd2lmdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzE5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBTd2lmdCAzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIERlc2lnbmVkIGZyb20gdGhlIFN3aWZ0L0NvY29hIGNvZGUgZ2VuZXJhdG9yKHMpCisgKi8KK2NsYXNzIHRfc3dpZnRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3dpZnRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbG9nX3VuZXhwZWN0ZWRfID0gZmFsc2U7CisgICAgYXN5bmNfY2xpZW50c18gPSBmYWxzZTsKKyAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gZmFsc2U7CisgICAgbm9fc3RyaWN0XyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZ2VuX2NvY29hXyA9IGZhbHNlOworICAgIHByb21pc2Vfa2l0XyA9IGZhbHNlOworICAgIHNhZmVfZW51bXNfID0gZmFsc2U7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsb2dfdW5leHBlY3RlZCIpID09IDApIHsKKyAgICAgICAgbG9nX3VuZXhwZWN0ZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmNfY2xpZW50cyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfY2xpZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIG5vX3N0cmljdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvY29hIikgPT0gMCkgeworICAgICAgICBnZW5fY29jb2FfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2FmZV9lbnVtcyIpID09IDApIHsKKyAgICAgICAgc2FmZV9lbnVtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcm9taXNlX2tpdCIpID09IDApIHsKKyAgICAgICAgaWYgKGdlbl9jb2NvYV8gPT0gZmFsc2UpIHsKKyAgICAgICAgICB0aHJvdyAiUHJvbWlzZUtpdCBvbmx5IGF2YWlsYWJsZSB3aXRoIFN3aWZ0IDIueCwgdXNlIGBjb2NvYWAgb3B0aW9uIiArIGl0ZXItPmZpcnN0OworICAgICAgICB9CisgICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3dpZnQ6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN3aWZ0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisKKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3ByaXZhdGUpOworCisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgc3dpZnRfaW1wb3J0cygpOworICBzdHJpbmcgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsPWZhbHNlLCBib29sIGlzX2ZvcmNlZD1mYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisKKyAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKTsKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlLCBib29sIHF1YWxpZmllZD1mYWxzZSk7CisgIHN0cmluZyBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpOworICB2b2lkIHBvcHVsYXRlX3Jlc2VydmVkX3dvcmRzKCk7CisgIC8qKiBTd2lmdCAzIHNwZWNpZmljICovCisgIHN0cmluZyBlbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pOworICBzdHJpbmcgZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpOworICB2b2lkIGZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCBzdHJpbmcmIGRvYyk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY2FycnlvdmVyICovCisgIHN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLworICB2b2lkIGdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJzd2lmdCIpOworICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICB9Citwcml2YXRlOgorCisgIHZvaWQgYmxvY2tfb3Blbihvc3RyZWFtJiBvdXQpIHsKKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBibG9ja19jbG9zZShvc3RyZWFtJiBvdXQsIGJvb2wgZW5kX2xpbmU9dHJ1ZSkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChlbmRfbGluZSkgb3V0IDw8IGVuZGw7CisgIH0KKworICBib29sIGZpZWxkX2lzX29wdGlvbmFsKHRfZmllbGQqIHRmaWVsZCkgeworICAgIGJvb2wgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uZmluZCgic3dpZnQubnVsbGFibGUiKSAhPSB0ZmllbGQtPmFubm90YXRpb25zXy5lbmQoKSAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvcHQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZ2VuX2NvY29hXykgeyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgb25seSBpZiBpdHMgYWN0dWFsbHkgIm9wdGlvbmFsIgorICAgICAgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICB9CisgICAgcmV0dXJuIG9wdDsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9kZWNsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2ltcGxfOworCisgIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOworICBib29sIGFzeW5jX2NsaWVudHNfOworCisgIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKKyAgYm9vbCBub19zdHJpY3RfOworICBib29sIG5hbWVzcGFjZWRfOworICBib29sIHNhZmVfZW51bXNfOworICBzZXQ8c3RyaW5nPiBzd2lmdF9yZXNlcnZlZF93b3Jkc187CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY29tcGF0aWJpbGl0eSAqLworICBib29sIGdlbl9jb2NvYV87CisgIGJvb2wgcHJvbWlzZV9raXRfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgb3V0X2RpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZyBtb2R1bGVfcGF0aCA9IG91dF9kaXI7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKG5hbWVzcGFjZWRfICYmICFtb2R1bGUuZW1wdHkoKSkgeworICAgIG1vZHVsZV9wYXRoID0gbW9kdWxlX3BhdGggKyAiLyIgKyBtb2R1bGU7CisgICAgbmFtZSA9IG1vZHVsZTsKKyAgfQorICBNS0RJUihtb2R1bGVfcGF0aC5jX3N0cigpKTsKKworICBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworCisgIC8vIHdlIGhhdmUgYSAuc3dpZnQgZGVjbGFyYXRpb25zIGZpbGUuLi4KKyAgc3RyaW5nIGZfZGVjbF9uYW1lID0gbmFtZSArICIuc3dpZnQiOworICBzdHJpbmcgZl9kZWNsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2RlY2xfbmFtZTsKKyAgZl9kZWNsXy5vcGVuKGZfZGVjbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2RlY2xfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIC8vIC4uLmFuZCBhIC5zd2lmdCBpbXBsZW1lbnRhdGlvbiBleHRlbnNpb25zIGZpbGUKKyAgc3RyaW5nIGZfaW1wbF9uYW1lID0gbmFtZSArICIrRXh0cy5zd2lmdCI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBtb2R1bGVfcGF0aCArICIvIiArIGZfaW1wbF9uYW1lOworICBmX2ltcGxfLm9wZW4oZl9pbXBsX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IHN3aWZ0X2ltcG9ydHMoKSA8PCBzd2lmdF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpzd2lmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJGb3VuZGF0aW9uIik7CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBwcm9ncmFtX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvZ3JhbV9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgaW5jbHVkZXMgPDwgKCJpbXBvcnQgIiArIGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtX2luY2x1ZGVzW2ldKSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogUHJpbnRzIFRocmlmdCBydW50aW1lIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIFRocmlmdCBydW50aW1lCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6c3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSB7CisKKyAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXNfbGlzdDsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRocmlmdCIpOworCisgIGlmIChnZW5fY29jb2FfICYmIHByb21pc2Vfa2l0XykgeworICAgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJQcm9taXNlS2l0Iik7CisgIH0KKworICBvc3RyaW5nc3RyZWFtIGluY2x1ZGVzOworCisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgIGZvciAoaV9pdGVyPWluY2x1ZGVzX2xpc3QuYmVnaW4oKTsgaV9pdGVyIT1pbmNsdWRlc19saXN0LmVuZCgpOyArK2lfaXRlcikgeworICAgIGluY2x1ZGVzIDw8ICJpbXBvcnQgIiA8PCAqaV9pdGVyIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIHJldHVybiBpbmNsdWRlcy5zdHIoKTsKK30KKworLyoqCisgKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQorICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCisgIGZfZGVjbF8gPDwgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBTd2lmdAorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdHlwZWFsaWFzICIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpCisgICAgICAgICAgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsOworICBmX2RlY2xfIDw8IGVuZGw7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBTd2lmdCwgdGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcKKyAqIFN3aWZ0IHN5bnRheC4gIENvbmZvcm1zIHRvIFRFbnVtIHdoaWNoCisgKiBpbXBsZW1lbnRlcyByZWFkL3dyaXRlLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGlmIChnZW5fY29jb2FfKSB7CisgICAgZ2VuZXJhdGVfb2xkX2VudW0odGVudW0pOworICAgIHJldHVybjsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgOiBURW51bSI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGVudW1fY2FzZV9uYW1lKCgqY19pdGVyKSwgdHJ1ZSkgPDwgZW5kbDsKKyAgfQorCisgIC8vIHVua25vd24gYXNzb2NpYXRlZCB2YWx1ZSBjYXNlIGZvciBzYWZldHkgYW5kIHNpbWlsYXIgYmVoYXZpb3IgdG8gb3RoZXIgbGFuZ3VhZ2VzCisgIGlmIChzYWZlX2VudW1zXykgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgdW5rbm93bihJbnQzMikiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIFRTZXJpYWxpemFibGUgcmVhZChmcm9tOikKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgcmF3OiBJbnQzMiA9IHRyeSBwcm90by5yZWFkKCkiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImxldCBuZXcgPSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIocmF3VmFsdWU6IHJhdykiIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IHVud3JhcHBlZCA9IG5ldyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHVud3JhcHBlZCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLCIgPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIGVudW0gdmFsdWUgKFxcKHJhdykpIGZvciBcXCgiCisgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIi5zZWxmKVwiKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKyAgLy8gZW1wdHkgaW5pdCBmb3IgVFNlcmlhbGl6YWJsZQorICBmX2RlY2xfIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KCkiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInNlbGYgPSAuIiA8PCBlbnVtX2Nhc2VfbmFtZShjb25zdGFudHMuZnJvbnQoKSwgZmFsc2UpIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGVuZGw7CisKKyAgLy8gcmF3VmFsdWUgZ2V0dGVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2YXIgcmF3VmFsdWU6IEludDMyIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHNlbGYgeyIgPDwgZW5kbDsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIC4iIDw8IGVudW1fY2FzZV9uYW1lKCgqY19pdGVyKSwgdHJ1ZSkKKyAgICAgICAgICAgIDw8ICI6IHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgZW5kbDsKKyAgfQorICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIC51bmtub3duKGxldCB2YWx1ZSk6IHJldHVybiB2YWx1ZSIgPDwgZW5kbDsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIGNvbnZlbmllbmNlIHJhd1ZhbHVlIGluaXRhbGl6ZXIKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQ/KHJhd1ZhbHVlOiBJbnQzMikiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggcmF3VmFsdWUgeyIgPDwgZW5kbDs7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkKKyAgICAgICAgICAgIDw8ICI6IHNlbGYgPSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKyAgaWYgKCFzYWZlX2VudW1zXykgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHJldHVybiBuaWwiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogc2VsZiA9IC51bmtub3duKHJhd1ZhbHVlKSIgPDwgZW5kbDsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKworCisKKworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFRoaXMgaXMgZm9yIFN3aWZ0IDIueC9Db2NvYQorICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogSW50MzIiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgZW5kbDsKKyAgfQorCisgIGZfZGVjbF8gPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoKSB7IHNlbGYuaW5pdChyYXdWYWx1ZTogIiA8PCBjb25zdGFudHMuZnJvbnQoKS0+Z2V0X3ZhbHVlKCkgPDwgIikhIH0iIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJleHRlbnNpb24gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfaW1wbF8pOworCisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmF3ID0gSW50MzIoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvdG8ucmVhZEkzMigmcmF3KSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpISIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4oZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRyeSBwcm90by53cml0ZUkzMih2YWx1ZS5yYXdWYWx1ZSkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2UoZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgZW5kbDsKK30KKworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjplbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bV9jYXNlLT5nZXRfbmFtZSgpOworICAvLyBmb3JjZSB0byBsb3dlcmNhc2UgZm9yIFN3aWZ0IHN0eWxlLCBtYXliZSBlc2NhcGUgaWYgaXRzIGEga2V5d29yZAorICBzdGQ6OnRyYW5zZm9ybShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksIG5hbWUuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKyAgaWYgKGRlY2xhcmF0aW9uKSB7CisgICAgbmFtZSA9IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb25zdGFudCBlbnVtIHZhbHVlIGJ5IHRyYW5zZm9ybWluZyB0aGUgdmFsdWUgcG9ydGlvbiB0byBsb3dlcmNhc2UKKyAqIGZvciBTd2lmdCBzdHlsZS4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjplbnVtX2NvbnN0X25hbWUoc3RyaW5nIGVudW1faWRlbnRpZmllcikgeworICBzdHJpbmc6Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gZW51bV9pZGVudGlmaWVyLmJlZ2luKCk7IGl0IDwgZW51bV9pZGVudGlmaWVyLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCgqaXQpID09ICcuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHN0ZDo6dHJhbnNmb3JtKGl0LCBlbnVtX2lkZW50aWZpZXIuZW5kKCksIGl0LCA6OnRvbG93ZXIpOworICByZXR1cm4gZW51bV9pZGVudGlmaWVyOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBwdWJsaWMgY29uc3RhbnRzIGZvciBhbGwgVGhyaWZ0IGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gY29uc3RzIENvbnN0YW50cyB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKworICBvc3RyaW5nc3RyZWFtIGNvbnN0X2ludGVyZmFjZTsKKworICAvLyBQdWJsaWMgY29uc3RhbnRzIGZvciBiYXNlIHR5cGVzICYgc3RyaW5ncworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGNvbnN0X2ludGVyZmFjZSA8PCAicHVibGljIGxldCAiIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9ICI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0X2ludGVyZmFjZSwgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCisgIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOworCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIHN0cnVjdAorICogd2l0aCBwdWJsaWMgbWVtYmVycy4gT3B0aW9uYWwgdHlwZXMgYXJlIHVzZWQgZm9yIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8KKyAqIGFsbG93IHRoZW0gdG8gYmUgdGVzdGVkIGZvciBhdmFpbGFiaWxpdHkuIFNlcGFyYXRlIGluaXRzIGFyZSBpbmNsdWRlZCBmb3IKKyAqIHJlcXVpcmVkIHByb3BlcnRpZXMgJiBhbGwgcHJvcGVydGllcy4KKyAqCisgKiBHZW5lcmF0ZXMgZXh0ZW5zaW9ucyB0byBwcm92aWRlIGNvbmZvcm1hbmNlIHRvIFRTdHJ1Y3QsIFRTZXJpYWxpemFibGUsCisgKiBIYXNoYWJsZSAmIEVxdWF0YWJsZQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfZGVjbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgY29uZm9ybSB0byBFcnJvcgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2RlY2xfLCB0eGNlcHRpb24sIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgZmFsc2UsIGZhbHNlKTsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgc3RyaW5nJiBkb2MpIHsKKyAgaWYgKGRvYyAhPSAiIikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworCisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcHJldiA9IDA7CisgICAgd2hpbGUgKCgocG9zID0gZG9jLmZpbmQoIlxuIiwgcHJldikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICB8fCAoKHBvcyA9IGRvYy5maW5kKCJcciIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgfHwgKChwb3MgPSBkb2MuZmluZCgiXHJcbiIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpCisgICAgeworICAgICAgICBzdHJpbmdzLnB1c2hfYmFjayhkb2Muc3Vic3RyKHByZXYsIHBvcyAtIHByZXYpKTsKKyAgICAgICAgcHJldiA9IHBvcyArIDE7CisgICAgfQorCisgICAgLy8gVG8gZ2V0IHRoZSBsYXN0IHN1YnN0cmluZyAob3Igb25seSwgaWYgZGVsaW1pdGVyIGlzIG5vdCBmb3VuZCkKKyAgICBzdHJpbmdzLnB1c2hfYmFjayhkb2Muc3Vic3RyKHByZXYpKTsKKworICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBkX2l0ZXI7CisgICAgZm9yIChkX2l0ZXIgPSBzdHJpbmdzLmJlZ2luKCk7IGRfaXRlciAhPSBzdHJpbmdzLmVuZCgpOyArK2RfaXRlcikgeworICAgICAgaWYgKCgqZF9pdGVyKSAhPSAiIikgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vLyAiIDw8ICgqZF9pdGVyKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdC4gT25seSBwcm9wZXJ0aWVzIGFuZAorICogaW5pdCBtZXRob2RzIGFyZSBpbmNsdWRlZC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBkb2MgPSB0c3RydWN0LT5nZXRfZG9jKCk7CisgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisKKworICAvLyBwcm9wZXJ0aWVzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIC8vIHNwZWNpYWwsIHVuaW9ucworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBkb2MgPSAoKm1faXRlciktPmdldF9kb2MoKTsKKyAgICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIgorICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWw6ICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE5vcm1hbCBzdHJ1Y3RzCisKKyAgICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZpbmFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiA6IFN3aWZ0LkVycm9yIjsgLy8gRXJyb3Igc2VlbXMgdG8gYmUgYSBjb21tb24gZXhjZXB0aW9uIG5hbWUgaW4gdGhyaWZ0CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgLy8gVE9ETzogRGVmYXVsdHMKKworICAgICAgc3RyaW5nIGRvYyA9ICgqbV9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlciwgaXNfcHJpdmF0ZSkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmICghc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCkgeyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgZmFsc2UsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgICBpZiAoc3RydWN0X2hhc19vcHRpb25hbF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgdHJ1ZSwgaXNfcHJpdmF0ZSk7CisgICAgfQorICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBMZWdhY3kgU3dpZnQyL0NvY29hIGdlbmVyYXRvcgorICoKKyAqIEBwYXJhbSB0c3RydWN0CisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICovCisKKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZpc2liaWxpdHkgPDwgIiBmaW5hbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIiA6IEVycm9yVHlwZSI7CisgIH0KKworICBibG9ja19vcGVuKG91dCk7CisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyLCBpc19wcml2YXRlKSA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gaW5pdAorCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCkiOworICBibG9ja19vcGVuKG91dCk7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCBmYWxzZSwgaXNfcHJpdmF0ZSk7CisgIH0KKyAgaWYgKHN0cnVjdF9oYXNfb3B0aW9uYWxfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCB0cnVlLCBpc19wcml2YXRlKTsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGluaXQgZm9yIHByb3BlcnRpZXMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBhbGwgICAgIEdlbmVyYXRlIGluaXQgd2l0aCBhbGwgb3IganVzdCByZXF1aXJlZCBwcm9wZXJ0aWVzCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIGluaXRpYWxpemVyIHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGluaXQoIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3Q9dHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGlmIChhbGwgfHwgIWZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSk7CisgICAgfQorICAgICsrbV9pdGVyOworICB9CisgIG91dCA8PCAiKSI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGJvb2wgc2hvdWxkX3NldCA9IGFsbDsKKyAgICAgIHNob3VsZF9zZXQgPSBzaG91bGRfc2V0IHx8ICFmaWVsZF9pc19vcHRpb25hbCgoKm1faXRlcikpOworICAgICAgaWYgKHNob3VsZF9zZXQpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIgorICAgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiogbGVnYWN5IFN3aWZ0Mi9Db2NvYSAqLworICAgICAgaWYgKGFsbCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEIHx8ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIgorICAgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGhhc2hhYmxlIHByb3RvY29sIGltcGxtZW50YXRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogSGFzaGFibGUiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyIGhhc2hWYWx1ZSA6IEludCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBwcmltZSA9IDMxIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcmVzdWx0ID0gMSIgPDwgZW5kbDsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgc3RyaW5nIGFjY2Vzc29yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICI/LiIgOiAiLiI7CisgICAgICAgIHN0cmluZyBkZWZhdWx0b3IgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpID8gIiA/PyAwIiA6ICIiOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICgiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgYWNjZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgPDwgICJoYXNoVmFsdWUiIDw8IGRlZmF1bHRvciA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1faXRlcisrKSB7CisgICAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiByZXN1bHQgPSBwcmltZSAmKiB2YWwuaGFzaFZhbHVlIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXN1bHQiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAzMSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgZXF1YXRhYmxlIHByb3RvY29sIGltcGxlbWVudGF0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfZXF1YXRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgZnVuYyA9PShsaHM6ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHJoczogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4gQm9vbCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAobWVtYmVycy5zaXplKCkpIHsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihsaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIDw8IChnZW5fY29jb2FfID8gIiA/IiA6ICIgIikgPDwgIj09IHJocy4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikiOyAvLyBzd2lmdCAyID89PSBvcGVyYXRvciBub3QgaW4gMz8KKyAgICAgICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiAmJiI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0gZWxzZSB7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChsaHMsIHJocykgeyIgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBsdmFsKSwgLiIKKyAgICAgICAgICAgICAgICAgICAgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIobGV0IHJ2YWwpKTogcmV0dXJuIGx2YWwgPT0gcnZhbCIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiByZXR1cm4gZmFsc2UiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLiBQcm9kdWNlcyBleHRlbnNpb25zIHRoYXQKKyAqIGZ1bGZpbGwgdGhlIHJlcXVpc2l0ZSBwcm90b2NvbHMgdG8gY29tcGxldGUgdGhlIHZhbHVlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3Jlc3VsdAorICogICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKworICBpZiAoIWlzX3ByaXZhdGUgJiYgIWlzX3Jlc3VsdCAmJiAhZ2VuX2NvY29hXykgeyAgLy8gb2xkIGNvbXBpbGVyIGRpZG4ndCB1c2UgZGVidWdfZGVzY3JpcHRpb25zLCBPUiBpdCB3aXRoIGdlbl9jb2NvYV8gc28gdGhlIGZsYWcgZG9lc24ndCBtYXR0ZXIgdy8gY29jb2EKKyAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCwgaXNfcHJpdmF0ZSk7CisKKyAgb3V0IDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgVFN0cnVjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19yZXN1bHQKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgYSByZXN1bHQgdmFsdWUKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogVFN0cnVjdCI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIG91dCA8PCBlbmRsOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvKiogU3dpZnQgMywgbm8gd3JpdGVyIHdlIGp1c3Qgd3JpdGUgZmllbGQgSUQncyAqLworICAgIHN0cmluZyBhY2Nlc3MgPSAoaXNfcHJpdmF0ZSkgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisgICAgLy8gZ2VuZXJhdGUgZmllbGRJRCdzIGRpY3Rpb25hcnkKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzIDw8ICIgc3RhdGljIHZhciBmaWVsZElkczogW1N0cmluZzogSW50MzJdIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWyI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCB3cm90ZSA9IGZhbHNlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB3cm90ZSA9IHRydWU7CisgICAgICBvdXQgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICI7CisgICAgfQorICAgIGlmICghd3JvdGUpIHsKKyAgICAgIC8vIHBhZCBhIGNvbG9uCisgICAgICBvdXQgPDwgIjoiOworICAgIH0KKyAgICBvdXQgPDwgIl0iIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzIDw8ICIgc3RhdGljIHZhciBzdHJ1Y3ROYW1lOiBTdHJpbmcgeyByZXR1cm4gXCIiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIH0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiogTGVnYWN5IFN3aWZ0Mi9Db2NvYSAqLworCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworCisgICAgaWYgKGlzX3Jlc3VsdCkgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAidmFyIHJldDogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI/IjsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5zdG9wKTogICAgICAgICAgICBicmVhayBmaWVsZHMiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IjsKKyAgICBzdHJpbmcgcGFkZGluZyA9ICIiOworCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19tYXAoKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgcGFkZGluZyA8PCAicmV0ID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuIgorICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHZhbDogIiA8PCAidHJ5ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgPDwgIi5yZWFkKGZyb206IHByb3RvKSkiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKTogIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKSIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgcmV0ID0gcmV0IjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldCIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6IFwiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgdHlwZTogIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIikiOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJ1Y3QgZnJvbQorICogZnJvbSBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvKiogU3dpZnQgMyBjYXNlICovCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gImZpbGVwcml2YXRlIiA6ICJwdWJsaWMiOworCisgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbmFsLCAhb3B0aW9uYWwpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5zdG9wKTogICAgICAgICAgICBicmVhayBmaWVsZHMiIDw8IGVuZGw7CisKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiI7CisgICAgICBzdHJpbmcgcGFkZGluZyA9ICIiOworCisgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IHBhZGRpbmcgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ5ICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIucmVhZChmcm9tOiBwcm90bykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6ICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnZhbGlkYXRlVmFsdWUoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgeworICAgIC8qKiBMZWdhY3kgU3dpZjIvQ29jb2EgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25hbCwgIW9wdGlvbmFsKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBfX3Byb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuU1RPUCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJicmVhayBmaWVsZHMiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRyeSBfX3Byb3RvLnJlYWRWYWx1ZSgpIGFzICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnNraXBUeXBlKHVua25vd25UeXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICAgICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnZhbGlkYXRlVmFsdWUoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhIHN0cnVjdCB0bworICogYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkgT05MWSBGT1IgU1dJRlQyL0NPQ09BCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpOworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBfX3ZhbHVlLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFZhbHVlKCIKKyAgICAgICAgICAgICAgICA8PCAob3B0aW9uYWwgPyAiIiA6ICJfX3ZhbHVlLiIpIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJuYW1lOiBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiaWQ6ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cnVjdCBmcm9tCisgKiBmcm9tIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpICBPTkxZIEZPUiBTV0lGVCAyL0NPQ09BCisgKgorICogVGhpcyBpcyBzcGVjaWZpY2FsbHkgYSBmdW5jdGlvbiByZXN1bHQuIE9ubHkKKyAqIHRoZSBmaXJzdCBhdmFpbGFibGUgZmllbGQgaXMgd3JpdHRlbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWUoXCIiIDw8IG5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkICp0ZmllbGQgPSAqZl9pdGVyOworCisgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCByZXN1bHQgPSBfX3ZhbHVlLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRWYWx1ZShyZXN1bHQsICIKKyAgICAgICAgICAgICAgICA8PCAibmFtZTogXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImlkOiAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9wcmludGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIgorICAgICAgICAgICAgICA8PCAoZGVidWdfZGVzY3JpcHRpb25zXyA/ICJDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIiA6ICJDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSIpOworCisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAidmFyIGRlc2MgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIG91dCA8PCAiKFwiIiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiPVxcKFN0cmluZyhkZXNjcmliaW5nOiBzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSkiOworICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIuXCIiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIHNlbGYgeyIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Zl9pdGVyKyspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIobGV0IHZhbCk6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHZhbDogXFwodmFsKSlcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIj1cXChzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSI7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIpXCIiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGRlc2MiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIFN3aWZ0IHRoaXMgY29uc2lzdHMgb2YgYQorICogcHJvdG9jb2wgZGVmaW5pdGlvbiBhbmQgYSBjbGllbnQgKHdpdGggaXQncyBpbXBsZW1lbnRhdGlvbgorICogc2VwYXJhdGVkIGludG8gZXh0cyBmaWxlKS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnQoZl9kZWNsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luYyhmX2RlY2xfLCB0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIoZl9kZWNsXywgdHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIHFuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgdF9zdHJ1Y3QgcW5hbWVfdHMgPSB0X3N0cnVjdCh0cy0+Z2V0X3Byb2dyYW0oKSwgcW5hbWUpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBxbmFtZV90cy5hcHBlbmQoKm1faXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfaW1wbF8sICZxbmFtZV90cywgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICB9Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gY3JlYXRlIGEgcmVzdWx0IHN0cnVjdCB3aXRoIGEgc3VjY2VzcyBmaWVsZCBvZiB0aGUgcmV0dXJuIHR5cGUsCisgIC8vIGFuZCBhIGZpZWxkIGZvciBlYWNoIHR5cGUgb2YgZXhjZXB0aW9uIHRocm93bgorICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbikpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgdF9maWVsZCogc3VjY2VzcyA9IG5ldyB0X2ZpZWxkKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBzdWNjZXNzLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQoc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkICp4ID0gKmZfaXRlcjsKKyAgICB0X2ZpZWxkICpveCA9IG5ldyB0X2ZpZWxkKHgtPmdldF90eXBlKCksIHgtPmdldF9uYW1lKCksIHgtPmdldF9rZXkoKSk7CisgICAgb3gtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgcmVzdWx0LmFwcGVuZChveCk7CisgIH0KKworICAvLyBnZW5lcmF0ZSB0aGUgcmVzdWx0IHN0cnVjdAorICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3QoZl9pbXBsXywgJnJlc3VsdCwgdHJ1ZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCB0cnVlLCB0cnVlKTsKKworICBmb3IgKGZfaXRlciA9IHJlc3VsdC5nZXRfbWVtYmVycygpLmJlZ2luKCk7IGZfaXRlciAhPSByZXN1bHQuZ2V0X21lbWJlcnMoKS5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBkZWxldGUgKmZfaXRlcjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBzdHJpbmcgZG9jID0gdHNlcnZpY2UtPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgICBvdXQgPDwgIiA6ICIgPDwgcGFyZW50LT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGZ1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiICAvLyBleGNlcHRpb25zOiAiOworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGFzeW5jaHJvbm91cyBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIjsKKworICBibG9ja19vcGVuKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeyAgb3V0IDw8IGVuZGw7IH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG91dCwgKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIH0gLy8KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOy8vIDogIgorCisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgb3V0IDw8ICIgOiAiIDw8ICgocGFyZW50ID09IE5VTEwpID8gIlRDbGllbnQiIDogcGFyZW50LT5nZXRfbmFtZSgpICsgIkNsaWVudCIpOworICAgIG91dCA8PCAgIiAvKiAsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIGEKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX2luUHJvdG9jb2wgOiBUUHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fb3V0UHJvdG9jb2wgOiBUUHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5vdXRQcm90b2NvbDogVFByb3RvY29sKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIl9faW5Qcm90b2NvbCA9IGlub3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9fb3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpblByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gb3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJvcGVuIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiQXN5bmNDbGllbnQ8UHJvdG9jb2w6IFRQcm90b2NvbCwgRmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4iOy8vIDogIgorCisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgICBvdXQgPDwgIiA6ICIgPDwgKChwYXJlbnQgPT0gTlVMTCkgPyAiVCIgOiAgcGFyZW50LT5nZXRfbmFtZSgpKSArICJBc3luY0NsaWVudDxQcm90b2NvbCwgRmFjdG9yeT4iOworICAgIG91dCA8PCAgIiAvKiAsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY0NsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3Byb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fdHJhbnNwb3J0RmFjdG9yeSA6IFRBc3luY1RyYW5zcG9ydEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQocHJvdG9jb2xGYWN0b3J5OiBUUHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5KSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIl9fcHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX3RyYW5zcG9ydEZhY3RvcnkgPSB0cmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLAorICogdGhlIFRQcm9jZXNzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgc2VydmljZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJvcGVuIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciAvKiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludDMyLCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZhciBzZXJ2aWNlOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlcXVpcmVkIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCAvKiAiCisgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlYWxpYXMgUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSAiCisgICAgICAgIDw8ICJbU3RyaW5nOiAoSW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IHNlcnZpY2UgOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0KKworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJzZWxmLnNlcnZpY2UgPSBzZXJ2aWNlIiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgc2VuZCB0aGUgYXJndW1lbnRzCisgKiBmb3IgYSBzZXJ2aWNlIGZ1bmN0aW9uIHZpYSBhIHByb3RvY29sLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSAgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gbmVlZHNfcHJvdG9jb2wKKyAqICAgICAgICAgICAgICAgICAgV2V0aGVyIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHByb3RvY29sIG9yIGlmCisgKiAgICAgICAgICAgICAgICAgIHRoZSBwcm90b2NvbCBpcyB0byBiZSBhc3N1bWVkCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKworICBzdHJpbmcgZnVubmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2Jvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgc3RyaW5nIHByb3RvID0gbmVlZHNfcHJvdG9jb2wgPyAoZ2VuX2NvY29hXyA/ICJfX291dFByb3RvY29sIiA6ICJvbiBvdXRQcm90b2NvbCIpIDogIiI7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuYyAiIDw8IHNlbmRfZnVuY3Rpb24uZ2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIHByb3RvLCB0cnVlKQorICAgICAgICAgICAgICA8PCAiKSB0aHJvd3MiOworICBibG9ja19vcGVuKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLm9uZXdheSIgOiAiLmNhbGwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCI7CisKKyAgICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgdF9maWVsZCAqdGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgb3V0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGFyZ3Mud3JpdGUodG86IG91dFByb3RvY29sKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLk9ORVdBWSIgOiAiLkNBTEwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSAiIDw8IGFyZ3NuYW1lIDw8ICIud3JpdGVWYWx1ZShfX2FyZ3MsIHRvUHJvdG9jb2w6IF9fb3V0UHJvdG9jb2wpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHJlY3YgdGhlIHJlc3VsdCBmb3IgYQorICogc2VydmljZSBmdW5jdGlvbiB2aWEgYSBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogQHBhcmFtIG5lZWRzX3Byb3RvY29sCisgKiAgICAgICAgICAgICAgICAgIFdldGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYSBwcm90b2NvbCBvciBpZgorICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgaXMgdG8gYmUgYXNzdW1lZAorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jIHJlY3ZfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICAgIG91dCA8PCAib24gaW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisgICAgb3V0IDw8ICIpIHRocm93cyI7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8ICIgLT4gIiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICB9CisKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpICIgPDwgZW5kbDsKKworICAgIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpIHx8ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIl8gPSAiOworICAgIH0KKworICAgIHN0cmluZyByZXR1cm5fdHlwZV9uYW1lID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHN1Y2Nlc3MgPSByZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBcIiIKKyAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIl9faW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikgdGhyb3dzIjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgX19yZXN1bHQgPSAiOworICAgIH0KKyAgICBvdXQgPDwgInRyeSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woX19pblByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX2luUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBfX3N1Y2Nlc3MgPSBfX3Jlc3VsdC5zdWNjZXNzIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gX19yZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IE5TRXJyb3IoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5NaXNzaW5nUmVzdWx0LnJhd1ZhbHVlKSwiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiB0aGUgc2VuZCBmdW5jdGlvbiBmb3IgdGhlCisgKiBzZXJ2aWNlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICBvdXQgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuIHRoZSBzZW5kIGZ1bmN0aW9uIGZvciB0aGUKKyAqIHNlcnZpY2UgZnVuY3Rpb24uIFRoaXMgaXMgZm9yIGFzeW5jaHJvbm91cyBwcm90b2NvbHMuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKG9uOiBwcm90byI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoX19wcm90b2NvbCI7IC8vCisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIG91dCA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB2aWEgZXh0ZW5zaW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIGZhbHNlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaWYgKGdlbl9jb2NvYV8pIHsgb3V0IDw8IGVuZGw7IH0KKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fb3V0UHJvdG9jb2wudHJhbnNwb3J0KCkuZmx1c2goKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRyeSByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGFzeW5jaHJvbm91cyBjbGllbnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdmlhIGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IHRyYW5zcG9ydCAgID0gZmFjdG9yeS5uZXdUcmFuc3BvcnQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IHByb3RvID0gUHJvdG9jb2wob246IHRyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGJvb2wgcmV0X2lzX3ZvaWQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKTsKKyAgICBib29sIGlzX29uZXdheSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCk7CisKKyAgICBzdHJpbmcgZXJyb3JfY29tcGxldGlvbl9jYWxsID0gImNvbXBsZXRpb24oLmVycm9yKGVycm9yKSkiOworICAgIGluZGVudChvdXQpIDw8ICJ0cmFuc3BvcnQuZmx1c2giOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih0cmFucywgZXJyb3IpIGluIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBsZXQgZXJyb3IgPSBlcnJvciI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgaWYgKCFpc19vbmV3YXkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG8iOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCk7CisgICAgICBpZiAoIXJldF9pc192b2lkKSB7CisgICAgICAgIG91dCA8PCAibGV0IHJlc3VsdCA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihvbjogcHJvdG8pIiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKHJldF9pc192b2lkID8gImNvbXBsZXRpb24oLnN1Y2Nlc3MoVm9pZCgpKSkiIDogImNvbXBsZXRpb24oLnN1Y2Nlc3MocmVzdWx0KSkiKSA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCBsZXQgZXJyb3IgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVycm9yX2NvbXBsZXRpb25fY2FsbCA8PCBlbmRsOworCisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRpb24oLnN1Y2Nlc3MoVm9pZCgpKSkiIDw8IGVuZGw7CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jQ2xpZW50IjsKKyAgc3RyaW5nIHByb3RvY29sX25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luYyI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgcHJvdG9jb2xfbmFtZTsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBfX3RyYW5zcG9ydCA9IF9fdHJhbnNwb3J0RmFjdG9yeS5uZXdUcmFuc3BvcnQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fcHJvdG9jb2wgPSBfX3Byb3RvY29sRmFjdG9yeS5uZXdQcm90b2NvbE9uVHJhbnNwb3J0KF9fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOworCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCAic3VjY2VzcywgZmFpbHVyZTogZmFpbHVyZSkiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAibGV0IHJlc3VsdCA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdWNjZXNzKCI7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImZhaWx1cmUoZXJyb3IgYXMgTlNFcnJvcikiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIGZhaWx1cmU6IGZhaWx1cmUpIiA8PCBlbmRsOworICAgIH0KKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBQcm9taXNlIGZ1bmN0aW9uCisgICAgaWYgKHByb21pc2Vfa2l0XykgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IChfX3Byb21pc2UsIF9fZnVsZmlsbCwgX19yZWplY3QpID0gUHJvbWlzZTwiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI+LnBlbmRpbmdQcm9taXNlKCkiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fcHJvdG9jb2wgPSBfX3Byb3RvY29sRmFjdG9yeS5uZXdQcm90b2NvbE9uVHJhbnNwb3J0KF9fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOworCisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgInsgX19mdWxmaWxsKCkgfSwgZmFpbHVyZTogeyBfX3JlamVjdCgkMCkgfSkiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiZG8iOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgICAgaW5kZW50KG91dCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAidHJ5IHNlbGYucmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKF9fcHJvdG9jb2wpIiA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19mdWxmaWxsKCI7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX3JlamVjdChlcnJvcikiIDw8IGVuZGw7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgZmFpbHVyZTogeyBlcnJvciBpbiAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19yZWplY3QoZXJyb3IpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19wcm9taXNlIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgfQorCisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogSW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBhIGJsb2NrIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24gdGhhdAorICogaGFuZGxlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGF0IGZ1bmN0aW9uLiBUaGUgYmxvY2tzIGFyZSBzdG9yZWQgaW4KKyAqIGEgbWFwIGFuZCBsb29rZWQgdXAgdmlhIGZ1bmN0aW9uL21lc3NhZ2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6IFRQcm9jZXNzb3IiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGxldCBwcm9jZXNzb3JIYW5kbGVycyIgPDwgKGdlbl9jb2NvYV8gPyAiICIgOiAiIikgPDwgIjogUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvY2Vzc29ySGFuZGxlcnMgPSBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiA9ICpmX2l0ZXI7CisKKyAgICBzdHJpbmcgYXJnc190eXBlID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm9jZXNzb3JIYW5kbGVyc1tcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSB7IHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBoYW5kbGVyIGluIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkKGZyb206IGluUHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgYXJncyA9IHRyeSAiIDw8IGFyZ3NfdHlwZSA8PCAiLnJlYWRWYWx1ZUZyb21Qcm90b2NvbChpblByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICkgeworICAgICAgc3RyaW5nIHJlc3VsdF90eXBlID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcmVzdWx0ID0gIiA8PCByZXN1bHRfdHlwZSA8PCAiKCkiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJkbyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidHJ5IGhhbmRsZXIuIiA8PCAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworCisgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmICghZ2VuX2NvY29hXyB8fCBmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImFyZ3MuIiA8PCBmaWVsZE5hbWU7CisgICAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICAgIGZvciAoeF9pdGVyID0geGZpZWxkcy5iZWdpbigpOyB4X2l0ZXIgIT0geGZpZWxkcy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzICI7CisKKyAgICAgICAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgICAgICAgaWYgKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA9PSAiRXJyb3IiICYmIG5hbWVzcGFjZWRfICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgICAgICAgIG91dCA8PCBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbSkgPDwgIi4iOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworCisgICAgICAgICAgb3V0IDw8ICIgeyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIHsgdGhyb3cgZXJyb3IgfSIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHR5cGU6IC5yZXBseSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSByZXN1bHQud3JpdGUodG86IG91dFByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXJyb3IiIDw8IGVuZGw7CisgICAgICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgZXJyb3IiIDw8IGVuZGw7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdHlwZTogLlJFUExZLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5ICIgPDwgcmVzdWx0X3R5cGUgPDwgIi53cml0ZVZhbHVlKHJlc3VsdCwgdG9Qcm90b2NvbDogb3V0UHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBwcm9jZXNzb3JIYW5kbGVycyIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQsZmFsc2UpOworICBvdXQgPDwgIigpIiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmMgcHJvY2VzcyhvbiBpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3NPbklucHV0UHJvdG9jb2woaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgKG1lc3NhZ2VOYW1lLCBfLCBzZXF1ZW5jZUlEKSA9IHRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIGxldCBwcm9jZXNzb3JIYW5kbGVyID0gIiA8PCBuYW1lIDw8ICIucHJvY2Vzc29ySGFuZGxlcnNbbWVzc2FnZU5hbWVdIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBwcm9jZXNzb3JIYW5kbGVyKHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBzZXJ2aWNlKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgVEFwcGxpY2F0aW9uRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZTogbWVzc2FnZU5hbWUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBlcnJvcikiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wuc2tpcCh0eXBlOiAuc3RydWN0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IGV4ID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC51bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IG1lc3NhZ2VOYW1lKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZTogbWVzc2FnZU5hbWUsICIKKyAgICAgICAgPDwgInNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBleCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgTlNFcnJvciI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlRXhjZXB0aW9uRm9yTWVzc2FnZU5hbWUobWVzc2FnZU5hbWUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBlcnJvcikiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wuc2tpcFR5cGUoLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJleDogTlNFcnJvcigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluLCAiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5Vbmtub3duTWV0aG9kLnJhd1ZhbHVlKSwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ1c2VySW5mbzogW1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBtZXNzYWdlTmFtZV0pKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBibG9ja19jbG9zZShvdXQpOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIFN3aWZ0IG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KKyAqIEByZXR1cm4gU3dpZnQgdHlwZSBuYW1lLCBpLmUuIERpY3Rpb25hcnk8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsLCBib29sIGlzX2ZvcmNlZCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJlc3VsdCArPSBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUTWFwPCIgKyB0eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZTsKKyAgICByZXN1bHQgKz0gIlRTZXQ8IiArIHR5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgKz0gIlRMaXN0PCIgKyB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorICBlbHNlIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAobmFtZXNwYWNlZF8gJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgcmVzdWx0ICs9IGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtKSArICIuIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgcmVzdWx0ICs9ICI/IjsKKyAgfQorICBpZiAoaXNfZm9yY2VkKSB7CisgICAgcmVzdWx0ICs9ICIhIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgU3dpZnQgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAiVm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuIGdlbl9jb2NvYV8gPyAiVEJpbmFyeSIgOiAiRGF0YSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiSW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiSW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIkludDMyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJJbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiRG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFN3aWZ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgZnVsbCBjb25zdGFudCB2YWx1ZSAoYXMgd291bGQgYmUgc2VlbiBhZnRlciBhbiAnPScpCisgKgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCI7CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAoZ2VuX2NvY29hXyA/IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpIDogZW51bV9jb25zdF9uYW1lKHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKSk7IC8vIFN3aWZ0Mi9Db2NvYSBjb21wYXRpYmlsaXR5CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworCisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IE5VTEw7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICBpZiAodGZpZWxkLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIHZhbHVlID0gdl9pdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdGZpZWxkLT5nZXRfdHlwZSgpLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICghZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSkgeworICAgICAgICB0aHJvdyAiY29uc3RhbnQgZXJyb3I6IHJlcXVpcmVkIGZpZWxkICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gdmFsdWUiOworICAgICAgfQorCisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworCisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIjogIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJdIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworCisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgdl9pdGVyLT5maXJzdCk7CisKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJdIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgIlsiOworCisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworfQorCisvKioKKyAqIERlY2xhcmVzIGFuIFN3aWZ0IHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIHJlbmRlciA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICBpZiAoZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSkgeworICAgIHJlbmRlciA8PCAoZ2VuX2NvY29hXyA/ICIgIiA6ICIiKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUpOworICB9CisgIGVsc2UgeworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgcmVuZGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTd2lmdDIvQ29jb2EgYmFja3dhcmQgY29tcGF0LCBCYWQsIGRlZmF1bHQgaW5pdAorICAgICAgcmVuZGVyIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKSA8PCAiKCkiOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICBzdHJpbmcgcmVzdWx0ID0gImZ1bmMgIiArIChnZW5fY29jb2FfID8gZnVuY3Rpb25fbmFtZSh0ZnVuY3Rpb24pIDogdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkgKyAiKSB0aHJvd3MiOyAvLy8gYXJnc3JldmlldworCisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdCArPSAiIC0+ICIgKyB0eXBlX25hbWUodHR5cGUpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gZG9jc3RyaW5nCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgICAgLy8gR2VuZXJhdGUgZG9jc3RyaW5nIHdpdGggZm9sbG93aW5nIGZvcm1hdDoKKyAgICAvLyAvLy8gPERlc2NyaXB0aW9uPgorICAgIC8vIC8vLyA8ZW1wdHkgbGluZT4KKyAgICAvLyAvLy8gLSBQYXJhbWV0ZXJzOgorICAgIC8vIC8vLyAgIC0gPHBhcmFtZXRlcj46IDxwYXJhbWV0ZXIgZG9jc3RyaW5nPgorICAgIC8vIC8vLyAtIFJldHVybnM6IDxyZXR1cm4gdHlwZT4gKFRocmlmdCBoYXMgbm8gZG9jc3RyaW5nIG9uIHJldHVybiB2YWwpCisgICAgLy8gLy8vIC0gVGhyb3dzOiA8ZXhjZXB0aW9uIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJucworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vIC0gUmV0dXJuczogIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gVGhyb3dzCisgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFRocm93czogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9ICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gZG9jc3RyaW5nCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gICAtIGNhbGxiYWNrOiA8Y2FsbGJhY2sgdHlwZXM+CisKKyAgICAvLyBEZXNjcmlwdGlvbgorICAgIHN0cmluZyBkb2MgPSB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICAgIGluZGVudChvdXQpIDw8ICIvLy8iIDw8IGVuZGw7CisKKyAgICAvLyBQYXJhbWV0ZXJzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vIC0gUGFyYW1ldGVyczoiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vICAgLSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiOworICAgICAgICBzdHJpbmcgZG9jID0gKCpmX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICAgIGlmICghZG9jLmVtcHR5KCkgJiYgZG9jW2RvYy5sZW5ndGgoKS0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBkb2MuZXJhc2UoZG9jLmxlbmd0aCgpLTEpOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBkb2MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb21wbGV0aW9uCisgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gY29tcGxldGlvbjogVEFzeW5jUmVzdWx0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiPiB3cmFwcGluZyByZXR1cm4gYW5kIGZvbGxvd2luZyBFeGNlcHRpb25zOiAiOworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCp4X2l0ZXIgIT0geGNlcHRpb25zLmJhY2soKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2Nrcy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIHJlc3BvbnNlX3N0cmluZyA9ICIoVEFzeW5jUmVzdWx0PCI7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICh0dHlwZS0+aXNfdm9pZCgpKSA/ICJWb2lkIiA6IHR5cGVfbmFtZSh0dHlwZSk7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICI+KSAtPiBWb2lkIjsKKyAgICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkKKyAgICAgICAgICAgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIsICIgOiAiIikKKyAgICAgICAgICAgICsgImNvbXBsZXRpb246IEBlc2NhcGluZyAiICsgcmVzcG9uc2Vfc3RyaW5nICsgIikiOworICB9IGVsc2UgeworICAgIHN0cmluZyByZXNwb25zZV9wYXJhbSA9ICIoIiArICgodHR5cGUtPmlzX3ZvaWQoKSkgPyAiIiA6IHR5cGVfbmFtZSh0dHlwZSkpICsgIikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJzdWNjZXNzOiAiICsgcmVzcG9uc2VfcGFyYW0gKyAiLCAiCisgICAgICAgICAgICArICJmYWlsdXJlOiAoTlNFcnJvcikgLT4gVm9pZCkgdGhyb3dzIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcy4KKyAqIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gImZ1bmMgIiArIGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzICIKKyAgICAgICAgICsgIi0+IFByb21pc2U8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOworfQorCisvKioKKyAqIFJlbmRlcnMgYSB2ZXJib3NlIGZ1bmN0aW9uIG5hbWUgc3VpdGFibGUgZm9yIGEgU3dpZnQgbWV0aG9kLiAgT05MWSBGT1IgU3dpZnQyL0NvY29hIEJBQ0tXQVJEUyBDT01QQVRJQklMSVRZCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICBzdHJpbmcgZmlyc3RfYXJnID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmZyb250KCktPmdldF9uYW1lKCk7CisgICAgaWYgKG5hbWUuc2l6ZSgpIDwgZmlyc3RfYXJnLnNpemUoKSB8fAorICAgICAgICBsb3dlcmNhc2UobmFtZS5zdWJzdHIobmFtZS5zaXplKCktZmlyc3RfYXJnLnNpemUoKSkpICE9IGxvd2VyY2FzZShmaXJzdF9hcmcpKSB7CisgICAgICBuYW1lICs9ICJXaXRoIiArIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpWzBdLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIFN3aWZ0IG1ldGhvZCBhcmd1bWVudCBsaXN0CisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByb3RvY29sX25hbWUsIGJvb2wgaXNfaW50ZXJuYWwpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBib29sIGluY2x1ZGVfcHJvdG9jb2wgPSAhcHJvdG9jb2xfbmFtZS5lbXB0eSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaW5jbHVkZV9wcm90b2NvbCkgeworICAgIHJlc3VsdCArPSBwcm90b2NvbF9uYW1lICsgIjogVFByb3RvY29sIjsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoIWZpZWxkcy5lbXB0eSgpICYmIGlzX2ludGVybmFsICYmIGdlbl9jb2NvYV8pIHsKKyAgICAvLyBGb3JjZSBmaXJzdCBhcmd1bWVudCB0byBiZSBuYW1lZCwgU3dpZnQyL0NvY29hIGJhY2t3YXJkcyBjb21wYXQKKyAgICByZXN1bHQgKz0gZmllbGRzLmZyb250KCktPmdldF9uYW1lKCkgKyAiICI7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHRfZmllbGQqIGFyZyA9ICpmX2l0ZXI7CisKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIC8vIG9wdGlvbmFsIGFyZ3Mgbm90IHVzdWFsbHkgcGVybWl0dGVkIGZvciBzb21lIHJlYXNvbiwgZXZlbiB0aG91Z2ggZHluYW1pYyBsYW5ncyBoYW5kbGUgaXQKKyAgICAgIC8vIHVzZSBhbm5vdGF0aW9uICJzd2lmdC5udWxsYWJsZSIgdG8gYWNoaWV2ZQorICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbChhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpKTsKKyAgICB9CisKKyAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9Td2lmdC9Db25jZXB0dWFsL1N3aWZ0X1Byb2dyYW1taW5nX0xhbmd1YWdlL0xleGljYWxTdHJ1Y3R1cmUuaHRtbAorICoKKyAqLworCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19DT0xVTU5fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRklMRV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19GVU5DVElPTl9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19MSU5FX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJBbnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0ZWR0eXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXNzb2NpYXRpdml0eSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImJyZWFrIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY2FzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhdGNoIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY2xhc3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb250aW51ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNvbnZlbmllbmNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmYXVsdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGlkU2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZG8iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkeW5hbWljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZW51bSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImV4dGVuc2lvbiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbGx0aHJvdWdoIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaWxlcHJpdmF0ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZpbmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZm9yIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZnVuYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImdldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImd1YXJkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaWYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbXBvcnQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZGlyZWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5maXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5vdXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbnRlcm5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGF6eSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxlZnQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJtdXRhdGluZyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm5pbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm5vbmUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25tdXRhdGluZyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm9wZW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVyYXRvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm9wdGlvbmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3ZlcnJpZGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwb3N0Zml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJlY2VkZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlByb3RvY29sIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHVibGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVxdWlyZWQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldHVybiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJpZ2h0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2VsZiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdGF0aWMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdHJ1Y3QiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdXBlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInN3aXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRyeSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlR5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0eXBlYWxpYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ1bm93bmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidmFyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2VhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2hpbGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aWxsU2V0Iik7CisgIH0gZWxzZSB7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiU2VsZiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0ZWR0eXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkeW5hbWljVHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZnVuYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImd1YXJkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVyYXRvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByb3RvY29sIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdHJ1Y3QiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnVlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2hlcmUiKTsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6Om1heWJlX2VzY2FwZV9pZGVudGlmaWVyKGNvbnN0IHN0cmluZyYgaWRlbnRpZmllcikgeworICBpZiAoc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmZpbmQoaWRlbnRpZmllcikgIT0gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmVuZCgpKSB7CisgICAgcmV0dXJuICJgIiArIGlkZW50aWZpZXIgKyAiYCI7CisgIH0KKyAgcmV0dXJuIGlkZW50aWZpZXI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBTd2lmdCBUVHlwZSBlbnVtZXJhdGlvbi4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlLCBib29sIHF1YWxpZmllZCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBzdHJpbmcgcmVzdWx0ID0gcXVhbGlmaWVkID8gIlRUeXBlLiIgOiAiLiI7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImJvb2wiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTgiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImRvdWJsZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic3RydWN0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIm1hcCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJzZXQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImxpc3QiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJTVFJJTkciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJCT09MIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkJZVEUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkRPVUJMRSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiSTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU1RSVUNUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIk1BUCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJTRVQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIkxJU1QiOworICAgIH0KKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHN3aWZ0LAorICAgICJTd2lmdCAzLjAiLAorICAgICIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCisgICAgIiAgICBkZWJ1Z19kZXNjcmlwdGlvbnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uXG4iCisgICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iCisgICAgIiAgICBuYW1lc3BhY2VkOiAgICAgIEdlbmVyYXRlIHNvdXJjZSBpbiBNb2R1bGUgc2NvcGVkIG91dHB1dCBkaXJlY3RvcmllcyBmb3IgU3dpZnQgTmFtZXNwYWNpbmcuXG4iCisgICAgIiAgICBjb2NvYTogICAgICAgICAgIEdlbmVyYXRlIFN3aWZ0IDIueCBjb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgVGhyaWZ0L0NvY29hIGxpYnJhcnlcbiIKKyAgICAiICAgIHByb21pc2Vfa2l0OiAgICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIHByb21pc2VzIChvbmx5IHVzZSB3aXRoIGNvY29hIGZsYWcpXG4iCisgICAgIiAgICBzYWZlX2VudW1zOiAgICAgIEdlbmVyYXRlIGVudW0gdHlwZXMgd2l0aCBhbiB1bmtub3duIGNhc2UgdG8gaGFuZGxlIHVuc3BlY2lmaWVkIHZhbHVlcyByYXRoZXIgdGhhbiB0aHJvdyBhIHNlcmlhbGl6YXRpb24gZXJyb3JcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZWQxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0YWNrOwordXNpbmcgc3RkOjpzZXQ7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7CitzdGF0aWMgY29uc3Qgc3RyaW5nIHF1b3QgPSAiXCIiOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRlZmF1bHRfbnNfcHJlZml4ID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvbnMvIjsKKworLyoqCisgKiBUaGlzIGdlbmVyYXRvciBjcmVhdGVzIGFuIFhNTCBtb2RlbCBvZiB0aGUgcGFyc2VkIElETCB0cmVlLCBhbmQgaXMgZGVzaWduZWQKKyAqIHRvIG1ha2UgaXQgZWFzeSB0byB1c2UgdGhpcyBmaWxlIGFzIHRoZSBpbnB1dCBmb3Igb3RoZXIgdGVtcGxhdGUgZW5naW5lcywKKyAqIHN1Y2ggYXMgWFNMVC4gIFRvIHRoaXMgZW5kLCB0aGUgZ2VuZXJhdGVkIFhNTCBpcyBzbGlnaHRseSBtb3JlIHZlcmJvc2UgdGhhbgorICogeW91IG1pZ2h0IGV4cGVjdC4uLiBmb3IgZXhhbXBsZSwgcmVmZXJlbmNlcyB0byAiaWQiIHR5cGVzIChzdWNoIGFzIHN0cnVjdHMsCisgKiB1bmlvbnMsIGV0YykgYWx3YXlzIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIElETCBkb2N1bWVudCwgZXZlbiBpZiB0aGUgdHlwZQorICogaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcyB0aGUgcmVmZXJlbmNlLgorICovCitjbGFzcyB0X3htbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3htbF9nZW5lcmF0b3IoIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IHRydWU7CisgICAgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyA9IHRydWU7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19kZWZhdWx0X25zIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX2RlZmF1bHRfbnNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX25hbWVzcGFjZXMiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiB4bWw6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhtbCI7CisgIH0KKworICB2aXJ0dWFsIH50X3htbF9nZW5lcmF0b3IoKSB7fQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisKKyAgdm9pZCBpdGVyYXRlX3Byb2dyYW0odF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Fubm90YXRpb25zKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpOworCitwcml2YXRlOgorICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187CisgIGJvb2wgc2hvdWxkX3VzZV9kZWZhdWx0X25zXzsKKyAgYm9vbCBzaG91bGRfdXNlX25hbWVzcGFjZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94bWxfOworCisgIHN0ZDo6c2V0PHN0cmluZz4gcHJvZ3JhbXNfOworICBzdGQ6OnN0YWNrPHN0cmluZz4gZWxlbWVudHNfOworICBib29sIHRvcF9lbGVtZW50X2lzX2VtcHR5OworICBib29sIHRvcF9lbGVtZW50X2lzX29wZW47CisKKyAgc3RyaW5nIHRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X3N0YXJ0KGNvbnN0IHN0cmluZyBuYW1lKTsKKyAgdm9pZCBjbG9zZV90b3BfZWxlbWVudCgpOworICB2b2lkIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIHZvaWQgd3JpdGVfYXR0cmlidXRlKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCk7CisgIHN0cmluZyBlc2NhcGVfeG1sX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KTsKKworICB2b2lkIHdyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpOworCisgIHZvaWQgd3JpdGVfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9kb2ModF9kb2MqIHRkb2MpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfeG1sXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfZWxlbWVudF9udW1iZXIoc3RyaW5nIG5hbWUsIFQgbikgeworICAgIHdyaXRlX2VsZW1lbnRfc3RyaW5nKG5hbWUsIG51bWJlcl90b19zdHJpbmcobikpOworICB9CisKKyAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOworCisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyB4bWxfYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIjsKKyAgfQorfTsKKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBmX3htbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi54bWwiOworICBmX3htbF8ub3BlbihmX3htbF9uYW1lLmNfc3RyKCkpOworCisgIHRvcF9lbGVtZW50X2lzX29wZW4gPSBmYWxzZTsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6dGFyZ2V0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXA7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXI7CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoInhtbCIpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgidGFyZ2V0TmFtZXNwYWNlIikpICE9IG1hcC5lbmQoKSkgeworICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgbWFwID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbCIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgbWFwID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygiKiIpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgieG1sLnRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCIqIikpICE9IG1hcC5lbmQoKSkgeworICAgIHJldHVybiBkZWZhdWx0X25zX3ByZWZpeCArIGl0ZXItPnNlY29uZDsKKyAgfQorICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBwcm9ncmFtLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfeG1sX2NvbW1lbnQoc3RyaW5nIG1zZykgeworICBjbG9zZV90b3BfZWxlbWVudCgpOworICAvLyBUT0RPOiBpbmRlbnQgYW55IEVPTHMgdGhhdCBtYXkgb2NjdXIgd2l0aCBtc2cKKyAgLy8gVE9ETzogcHJvcGVyIG1zZyBlc2NhcGluZyBuZWVkZWQ/CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCEtLSAiIDw8IG1zZyA8PCAiIC0tPiIgIDw8IGVuZGw7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpjbG9zZV90b3BfZWxlbWVudCgpIHsKKyAgaWYoIHRvcF9lbGVtZW50X2lzX29wZW4pIHsKKyAgICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7CisgICAgaWYgKGVsZW1lbnRzXy5zaXplKCkgPiAwICYmIHRvcF9lbGVtZW50X2lzX2VtcHR5KSB7CisgICAgICBmX3htbF8gPDwgIj4iIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X3N0YXJ0KHN0cmluZyBuYW1lKSB7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfICYmICFzaG91bGRfdXNlX2RlZmF1bHRfbnNfKSB7CisgICAgbmFtZSA9ICJpZGw6IiArIG5hbWU7CisgIH0KKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8IiA8PCBuYW1lOworICBlbGVtZW50c18ucHVzaChuYW1lKTsKKyAgdG9wX2VsZW1lbnRfaXNfZW1wdHkgPSB0cnVlOworICB0b3BfZWxlbWVudF9pc19vcGVuID0gdHJ1ZTsKKyAgaW5kZW50X3VwKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X2VuZCgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKHRvcF9lbGVtZW50X2lzX2VtcHR5ICYmIHRvcF9lbGVtZW50X2lzX29wZW4pIHsKKyAgICBmX3htbF8gPDwgIiAvPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwvIiA8PCBlbGVtZW50c18udG9wKCkgPDwgIj4iIDw8IGVuZGw7CisgIH0KKyAgdG9wX2VsZW1lbnRfaXNfZW1wdHkgPSBmYWxzZTsKKyAgZWxlbWVudHNfLnBvcCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfYXR0cmlidXRlKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKKyAgZl94bWxfIDw8ICIgIiA8PCBrZXkgPDwgIj1cIiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiXCIiOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfaW50X2F0dHJpYnV0ZShzdHJpbmcga2V5LCBpbnQgdmFsKSB7CisgIHdyaXRlX2F0dHJpYnV0ZShrZXksIG51bWJlcl90b19zdHJpbmcodmFsKSk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X3N0cmluZyhzdHJpbmcgbmFtZSwgc3RyaW5nIHZhbCkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGZfeG1sXyA8PCBpbmRlbnQoKQorICAgIDw8ICI8IiA8PCBuYW1lIDw8ICI+IiA8PCBlc2NhcGVfeG1sX3N0cmluZyh2YWwpIDw8ICI8LyIgPDwgbmFtZSA8PCAiPiIKKyAgICA8PCBlbmRsOworfQorCitzdHJpbmcgdF94bWxfZ2VuZXJhdG9yOjplc2NhcGVfeG1sX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgeworICAgIHN3aXRjaCAoKml0ZXIpIHsKKyAgICBjYXNlICcmJzoKKyAgICAgIHNzIDw8ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICImcXVvdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXCcnOgorICAgICAgc3MgPDwgIiZhcG9zOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHNzIDw8ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgc3MgPDwgIiZndDsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8ICppdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl94bWxfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgiaWRsIik7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfKSB7CisgICAgaWYgKHNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnMiLCAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiKTsKKyAgICB9CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczppZGwiLCAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiKTsKKyAgfQorCisgIHdyaXRlX3htbF9jb21tZW50KCB4bWxfYXV0b2dlbl9jb21tZW50KCkpOworCisgIGl0ZXJhdGVfcHJvZ3JhbShwcm9ncmFtXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICBjbG9zZV9nZW5lcmF0b3IoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6aXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImRvY3VtZW50Iik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHByb2dyYW0tPmdldF9uYW1lKCkpOworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIGNvbnN0IHN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXRfbmFtZXNwYWNlKHByb2dyYW0pOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zOiIgKyBwcm9ncmFtLT5nZXRfbmFtZSgpLCB0YXJnZXROYW1lc3BhY2UpOworICB9CisgIHdyaXRlX2RvYyhwcm9ncmFtKTsKKworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7CisgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImluY2x1ZGUiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCAoKmluY19pdCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7CisgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJuYW1lc3BhY2UiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBuc19pdC0+Zmlyc3QpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidmFsdWUiLCBuc19pdC0+c2Vjb25kKTsKKyAgICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKG5zX2l0LT5maXJzdCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICAvLyBUT0RPOiBjYW4gY29uc3RhbnRzIGhhdmUgYW5ub3RhdGlvbnM/CisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7CisgIH0KKworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW0tPmdldF9vYmplY3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgfQorCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgeworICAgIHByb2dyYW1zXy5pbnNlcnQocHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBwcm9nX2l0OworICAgIGZvciAocHJvZ19pdCA9IHByb2dyYW1zLmJlZ2luKCk7IHByb2dfaXQgIT0gcHJvZ3JhbXMuZW5kKCk7ICsrcHJvZ19pdCkgeworICAgICAgaWYgKCFwcm9ncmFtc18uY291bnQoKCpwcm9nX2l0KS0+Z2V0X25hbWUoKSkpIHsKKyAgICAgICAgaXRlcmF0ZV9wcm9ncmFtKCpwcm9nX2l0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInR5cGVkZWYiKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHR5cGVkZWYtPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModHR5cGVkZWYpOworICB3cml0ZV90eXBlKHR0eXBlZGVmLT5nZXRfdHJ1ZV90eXBlKCkpOworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0dHlwZWRlZi0+YW5ub3RhdGlvbnNfKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgcmV0dXJuOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGNvbnN0IHN0cmluZyB0eXBlID0gZ2V0X3R5cGVfbmFtZSh0dHlwZSk7CisgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOworICBpZiAodHlwZSA9PSAiaWQiKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLW1vZHVsZSIsIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUtaWQiLCB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAibGlzdCIpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVsZW1UeXBlIik7CisgICAgd3JpdGVfdHlwZShldHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJzZXQiKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVsZW1UeXBlIik7CisgICAgd3JpdGVfdHlwZShldHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJtYXAiKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5VHlwZSIpOworICAgIHdyaXRlX3R5cGUoa3R5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgidmFsdWVUeXBlIik7CisgICAgd3JpdGVfdHlwZSh2dHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZG9jKHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmcgZG9jID0gdGRvYy0+Z2V0X2RvYygpOworICAgIC8vIGZvciBzb21lIHJlYXNvbiB0aGVyZSBhbHdheXMgc2VlbXMgdG8gYmUgYSB0cmFpbGluZyBuZXdsaW5lIG9uIGRvYworICAgIC8vIGNvbW1lbnRzOyBsb29wIGJlbG93IG5haXZlbHkgdHJpZXMgdG8gc3RyaXAgb2ZmIHRyYWlsaW5nIGNyL2xmCisgICAgaW50IG4gPSAwOworICAgIGZvciAoc3RyaW5nOjpyZXZlcnNlX2l0ZXJhdG9yIGkgPSBkb2MucmJlZ2luKCk7IGkgIT0gZG9jLnJlbmQoKTsgaSsrLG4rKykgeworICAgICAgaWYgKCppICE9ICdcbicgfHwgKmkgPT0gJ1xyJykgeworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICBkb2MuZXJhc2UoZG9jLmxlbmd0aCgpIC0gbik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHdyaXRlX2F0dHJpYnV0ZSgiZG9jIiwgZG9jKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYW5ub3RhdGlvbnMoCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9ucykgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBhbm5vdGF0aW9ucy5iZWdpbigpOyBpdGVyICE9IGFubm90YXRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJhbm5vdGF0aW9uIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJrZXkiLCBpdGVyLT5maXJzdCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ2YWx1ZSIsIGl0ZXItPnNlY29uZCk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7CisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImNvbnN0Iik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyhjb24pOworICB3cml0ZV90eXBlKGNvbi0+Z2V0X3R5cGUoKSk7CisgIHdyaXRlX2NvbnN0X3ZhbHVlKGNvbi0+Z2V0X3ZhbHVlKCkpOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKworICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgd3JpdGVfZWxlbWVudF9udW1iZXIoImludCIsIHZhbHVlLT5nZXRfaW50ZWdlcigpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICB3cml0ZV9lbGVtZW50X251bWJlcigiZG91YmxlIiwgdmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgd3JpdGVfZWxlbWVudF9zdHJpbmcoInN0cmluZyIsIHZhbHVlLT5nZXRfc3RyaW5nKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImxpc3QiKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGl0OworICAgIGZvciAobGl0ID0gbGlzdC5iZWdpbigpOyBsaXQgIT0gbGlzdC5lbmQoKTsgKytsaXQpIHsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudHJ5Iik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgfQorICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1hcCIpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtaXQ7CisgICAgZm9yIChtaXQgPSBtYXAuYmVnaW4oKTsgbWl0ICE9IG1hcC5lbmQoKTsgKyttaXQpIHsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudHJ5Iik7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJrZXkiKTsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInZhbHVlIik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICB9CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgaW5kZW50X3VwKCk7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8bnVsbCAvPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJyZWFrOworICB9CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudW0iKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModGVudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCp2YWxfaXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibWVtYmVyIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9pbnRfYXR0cmlidXRlKCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOworICAgIHdyaXRlX2RvYyh2YWwpOworICAgIGdlbmVyYXRlX2Fubm90YXRpb25zKHZhbC0+YW5ub3RhdGlvbnNfKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModGVudW0tPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RyaW5nIHRhZ25hbWUgPSAic3RydWN0IjsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICB0YWduYW1lID0gInVuaW9uIjsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgdGFnbmFtZSA9ICJleGNlcHRpb24iOworICB9CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCh0YWduYW1lKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyh0c3RydWN0KTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJmaWVsZCIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOworICB3cml0ZV9pbnRfYXR0cmlidXRlKCJmaWVsZC1pZCIsIGZpZWxkLT5nZXRfa2V5KCkpOworICB3cml0ZV9kb2MoZmllbGQpOworICBzdHJpbmcgcmVxdWlyZWRuZXNzOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHJlcXVpcmVkbmVzcyA9ICJyZXF1aXJlZCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKKyAgICByZXF1aXJlZG5lc3MgPSAib3B0aW9uYWwiOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJlcXVpcmVkbmVzcyA9ICIiOworICAgIGJyZWFrOworICB9CisgIGlmIChyZXF1aXJlZG5lc3MgIT0gIiIpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInJlcXVpcmVkIiwgcmVxdWlyZWRuZXNzKTsKKyAgfQorICB3cml0ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImRlZmF1bHQiKTsKKyAgICB3cml0ZV9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnMoZmllbGQtPmFubm90YXRpb25zXyk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJzZXJ2aWNlIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKKworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIHN0cmluZyBwcm9nX25zID0gdGFyZ2V0X25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgaWYgKCpwcm9nX25zLnJiZWdpbigpICE9ICcvJykgeworICAgICAgcHJvZ19ucy5wdXNoX2JhY2soJy8nKTsKKyAgICB9CisgICAgY29uc3Qgc3RyaW5nIHRucyA9IHByb2dfbnMgKyB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRucyk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczp0bnMiLCB0bnMpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgY29uc3QgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJwYXJlbnQtbW9kdWxlIiwgZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJwYXJlbnQtaWQiLCBleHRlbmRzLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIHdyaXRlX2RvYyh0c2VydmljZSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHNlcnZpY2UtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtZXRob2QiKTsKKworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0ZnVuYy0+Z2V0X25hbWUoKSk7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm9uZXdheSIsICJ0cnVlIik7CisgIH0KKworICB3cml0ZV9kb2ModGZ1bmMpOworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInJldHVybnMiKTsKKyAgd3JpdGVfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImFyZyIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInRocm93cyIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModGZ1bmMtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCitzdHJpbmcgdF94bWxfZ2VuZXJhdG9yOjpnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gImxpc3QiOworICB9CisgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInNldCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAibWFwIjsKKyAgfQorICBpZiAoKHR0eXBlLT5pc19lbnVtKCkgICAgKXx8CisgICAgICAodHR5cGUtPmlzX3N0cnVjdCgpICApfHwKKyAgICAgICh0dHlwZS0+aXNfdHlwZWRlZigpICl8fAorICAgICAgKHR0eXBlLT5pc194Y2VwdGlvbigpKSl7CisgICAgcmV0dXJuICJpZCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZXR5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIGlmICh0YmFzZXR5cGUtPmlzX2JpbmFyeSgpICkgeworICAgICAgcmV0dXJuICJiaW5hcnkiOworICAgIH0KKyAgICByZXR1cm4gdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKyAgcmV0dXJuICIodW5rbm93bikiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICB4bWwsCisgICJYTUwiLAorICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iCisgICIgICAgbm9fZGVmYXVsdF9uczogICBPbWl0IGRlZmF1bHQgeG1sbnMgYW5kIGFkZCBpZGw6IHByZWZpeCB0byBhbGwgZWxlbWVudHNcbiIKKyAgIiAgICBub19uYW1lc3BhY2VzOiAgIERvIG5vdCBhZGQgbmFtZXNwYWNlIGRlZmluaXRpb25zIHRvIHRoZSBYTUwgbW9kZWxcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4N2ZmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFhTRCBnZW5lcmF0b3IsIGNyZWF0ZXMgYW4gWFNEIGZvciB0aGUgYmFzZSB0eXBlcyBldGMuCisgKgorICovCitjbGFzcyB0X3hzZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3hzZF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHhzZDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4teHNkIjsKKyAgfQorCisgIHZpcnR1YWwgfnRfeHNkX2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsgKHZvaWQpdGVudW07IH0KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgdm9pZCBnZW5lcmF0ZV9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQgPSBmYWxzZSk7CisKKyAgc3RkOjpzdHJpbmcgbnMoc3RkOjpzdHJpbmcgaW4sIHN0ZDo6c3RyaW5nIG5zKSB7IHJldHVybiBucyArICI6IiArIGluOyB9CisKKyAgc3RkOjpzdHJpbmcgeHNkKHN0ZDo6c3RyaW5nIGluKSB7IHJldHVybiBucyhpbiwgInhzZCIpOyB9CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHhtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCI8IS0tXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIgLS0+XG4iOworICB9CisKKyAgLyoqCisgICAqIE91dHB1dCB4c2QvcGhwIGZpbGUKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94c2RfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcGhwXzsKKworICAvKioKKyAgICogT3V0cHV0IHN0cmluZyBzdHJlYW0KKyAgICovCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3hzZF90eXBlc187Cit9OworCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfcGhwX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3hzZC5waHAiOworICBmX3BocF8ub3BlbihmX3BocF9uYW1lLmNfc3RyKCkpOworCisgIGZfcGhwXyA8PCAiPD9waHAiIDw8IGVuZGwKKyAgICAgICAgIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfcGhwXyA8PCAiPz4iIDw8IGVuZGw7CisgIGZfcGhwXy5jbG9zZSgpOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNpbXBsZVR5cGUgbmFtZT1cIiIgPDwgdHR5cGVkZWYtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5pc19zdHJpbmdfZW51bSgpKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCI+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9ICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+Z2V0X3N0cmluZ19lbnVtX3ZhbHMoKTsKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT1cIiIgPDwgKCp2X2l0ZXIpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6cmVzdHJpY3Rpb24+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNpbXBsZVR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgYm9vbCB4c2RfYWxsID0gdHN0cnVjdC0+Z2V0X3hzZF9hbGwoKTsKKworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoeHNkX2FsbCkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmFsbD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KHNfeHNkX3R5cGVzXywKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9hdHRycygpLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX29wdGlvbmFsKCkgfHwgeHNkX2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9uaWxsYWJsZSgpKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGlmICh4c2RfYWxsKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmFsbD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5pbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQpIHsKKyAgc3RyaW5nIHNtaW5PY2N1cnMgPSAob3B0aW9uYWwgfHwgbGlzdF9lbGVtZW50KSA/ICIgbWluT2NjdXJzPVwiMFwiIiA6ICIiOworICBzdHJpbmcgc21heE9jY3VycyA9IGxpc3RfZWxlbWVudCA/ICIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIiIDogIiI7CisgIHN0cmluZyBzb3B0aW9uYWwgPSBzbWluT2NjdXJzICsgc21heE9jY3VyczsKKyAgc3RyaW5nIHNuaWxsYWJsZSA9IG5pbGxhYmxlID8gIiBuaWxsYWJsZT1cInRydWVcIiIgOiAiIjsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoYXR0cnMgPT0gTlVMTCAmJiB0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZSAvPiIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCI+IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgc3RyaW5nIHN1Ym5hbWU7CisgICAgICAgIHRfdHlwZSogc3VidHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaWYgKHN1YnR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHN1YnR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgc3VibmFtZSA9IG5hbWUgKyAiX2VsdCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3VibmFtZSA9IHR5cGVfbmFtZShzdWJ0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBmX3BocF8gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICJfeHNkX2VsdF8iIDw8IG5hbWUgPDwgIiddID0gJyIgPDwgc3VibmFtZQorICAgICAgICAgICAgICAgPDwgIic7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9lbGVtZW50KG91dCwgc3VibmFtZSwgc3VidHlwZSwgTlVMTCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCJsaXN0XCIgdHlwZT1cInhzZDpib29sZWFuXCIgLz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoYXR0cnMgIT0gTlVMTCkgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaWYgKGF0dHJzID09IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICA8PCAiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICIgLz4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXb3csIGFsbCB0aGlzIHdvcmsgZm9yIGEgU0lNUExFIFRZUEUgd2l0aCBhdHRyaWJ1dGVzPyE/IT8hCisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmV4dGVuc2lvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIj4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpleHRlbnNpb24+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3hzZF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi54c2QiOworICBmX3hzZF8ub3BlbihmX3hzZF9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBucyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJ4c2QiKTsKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4c2QiKTsKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgdXJpID0gYW5ub3QuZmluZCgidXJpIik7CisgIGlmICh1cmkgIT0gYW5ub3QuZW5kKCkpIHsKKyAgICBucyA9IHVyaS0+c2Vjb25kOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgbnMgPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBucyArICJcIiB4bWxucz1cIiIgKyBucyArICJcIiAiCisgICAgICAgICArICJlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIiI7CisgIH0KKworICAvLyBQcmludCB0aGUgWFNEIGhlYWRlcgorICBmX3hzZF8gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIiA8PCBucyA8PCAiPiIgPDwgZW5kbAorICAgICAgICAgPDwgeG1sX2F1dG9nZW5fY29tbWVudCgpCisgICAgICAgICA8PCBlbmRsOworCisgIC8vIFByaW50IG91dCB0aGUgdHlwZSBkZWZpbml0aW9ucworICBpbmRlbnQoZl94c2RfKSA8PCBzX3hzZF90eXBlc18uc3RyKCk7CisKKyAgLy8gS2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBleGNlcHRpb25zIHRoYXQgbWlnaHQgZ2V0IHRocm93bgorICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+IGFsbF94Y2VwdGlvbnM7CisKKyAgLy8gTGlzdCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgbWlnaHQgYWN0dWFsbHkgZ2V0CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBlbGVtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzcG9uc2UiOworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgZWxlbW5hbWUsIHJldHVybnR5cGUpOworICAgIGZfeHNkXyA8PCBlbmRsOworCisgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGFsbF94Y2VwdGlvbnNbKCp4X2l0ZXIpLT5nZXRfbmFtZSgpXSA9ICh0X3N0cnVjdCopKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPjo6aXRlcmF0b3IgYXhfaXRlcjsKKyAgZm9yIChheF9pdGVyID0gYWxsX3hjZXB0aW9ucy5iZWdpbigpOyBheF9pdGVyICE9IGFsbF94Y2VwdGlvbnMuZW5kKCk7ICsrYXhfaXRlcikgeworICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBheF9pdGVyLT5maXJzdCwgYXhfaXRlci0+c2Vjb25kKTsKKyAgfQorCisgIC8vIENsb3NlIHRoZSBYU0QgZG9jdW1lbnQKKyAgZl94c2RfIDw8IGVuZGwgPDwgIjwveHNkOnNjaGVtYT4iIDw8IGVuZGw7CisgIGZfeHNkXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4geHNkKGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4geHNkKCJpbnQiKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gImNvbnRhaW5lciI7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgWFNEIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEByZXR1cm4gRXhwbGljaXQgWFNEIHR5cGUsIGkuZS4geHNkOnN0cmluZworICovCitzdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJldHVybiAic3RyaW5nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJieXRlIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJzaG9ydCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJsb25nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkZWNpbWFsIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFhTRCBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoeHNkLCAiWFNEIiwgIiIpCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVG9TdHJpbmdUZXN0LmphdmEgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90aHJpZnQtdF9waHBfZ2VuZXJhdG9yLm8tYTYwYTM4ZTkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9Ub1N0cmluZ1Rlc3QuamF2YQpyZW5hbWUgdG8gY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxYzZlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0xPQkFMU19ICisjZGVmaW5lIFRfR0xPQkFMU19ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworLyoqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKHNsYXAgb24gdGhlIHdyaXN0KSB0aGF0IGFyZQorICogc2hhcmVkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBzaW1wbGUKKyAqIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIEJlZm9yZSBjYWxsaW5nCisgKiB5eXBhcnNlKCksIHRoZSBtYWluLmNjIHByb2dyYW0gd2lsbCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGVzZQorICogZ2xvYmFsIHZhcmlhYmxlcyBzdWNoIHRoYXQgdGhlIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBhbmQgcHV0cyBlbnRyaWVzCisgKiBpbnRvIHRoZSByaWdodCBjb250YWluZXJzLCBldGMuCisgKgorICovCisKKy8qKgorICogSG9vcmF5IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR5cGVzIQorICovCisKK2NsYXNzIHRfcHJvZ3JhbTsKK2NsYXNzIHRfc2NvcGU7CitjbGFzcyB0X3R5cGU7CisKKy8qKgorICogUGFyc2luZyBtb2RlLCB0d28gcGFzc2VzIHVwIGluIHRoaXMgZ2luIHJ1bW15IQorICovCisKK2VudW0gUEFSU0VfTU9ERSB7IElOQ0xVREVTID0gMSwgUFJPR1JBTSA9IDIgfTsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2V4dGVybiBpbnQgZ19zdHJpY3Q7CisKKy8qKgorICogVGhlIG1hc3RlciBwcm9ncmFtIHBhcnNlIHRyZWUuIFRoaXMgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlciBjb2RlCisgKiB0byBidWlsZCB1cCB0aGUgcHJvZ3JhbSBlbGVtZW50cy4KKyAqLworZXh0ZXJuIHRfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCisgKi8KK2V4dGVybiB0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bworICovCitleHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7CisKKy8qKgorICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCisgKi8KK2V4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCisgKi8KK2V4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKKworLyoqCisgKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCisgKi8KK2V4dGVybiBjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBjaGFyKiBnX2RvY3RleHQ7CisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKKworLyoqCisgKiBTdGF0dXMgb2YgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGNhbmRpZGF0ZQorICovCitlbnVtIFBST0dET0NURVhUX1NUQVRVUyB7CisgIElOVkFMSUQgPSAwLAorICBTVElMTF9DQU5ESURBVEUgPSAxLCAgIC8vIHRoZSB0ZXh0IG1heSBvciBtYXkgbm90IGJlIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgQUxSRUFEWV9QUk9DRVNTRUQgPSAyLCAvLyBkb2N0ZXh0IGhhcyBiZWVuIHVzZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgQUJTT0xVVEVMWV9TVVJFID0gMywgICAvLyB0aGlzIGlzIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgTk9fUFJPR1JBTV9ET0NURVhUID0gNCAvLyB0aGVyZSBpcyBubyBwcm9ncmFtIGRvY3RleHQKK307CisKKy8qKgorICogVGhlIHByb2dyYW0gbGV2ZWwgZG9jdGV4dC4gU3RvcmVkIHNlcGFyYXRlbHkgdG8gbWFrZSBwYXJzaW5nIGVhc2llci4KKyAqLworZXh0ZXJuIGNoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKK2V4dGVybiBpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vOworZXh0ZXJuIFBST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCisgKgorICogV2hlbiBhIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB1c2VyLXNwZWNpZmllZCBrZXksIHRocmlmdCBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ25zIGEgbmVnYXRpdmUgdmFsdWUuICBIb3dldmVyLCB0aGlzIGlzIGZyYWdpbGUgc2luY2UgY2hhbmdlcyB0byB0aGUKKyAqIGZpbGUgbWF5IHVuaW50ZW50aW9uYWxseSBjaGFuZ2UgdGhlIGtleSBudW1iZXJpbmcsIHJlc3VsdGluZyBpbiBhIG5ldworICogcHJvdG9jb2wgdGhhdCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCisgKgorICogV2hlbiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGlzIGVuYWJsZWQsIHVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIG5lZ2F0aXZlIGtleXMuICBUaGlzIHdheSB0aGV5IGNhbiB3cml0ZSBhIC50aHJpZnQgZmlsZSB3aXRoIGV4cGxpY2l0bHkKKyAqIHNwZWNpZmllZCBrZXlzIHRoYXQgaXMgc3RpbGwgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzCisgKiB0aGF0IGRpZCBub3Qgc3BlY2lmeSBrZXkgdmFsdWVzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqCisgKiBTb21lIGxhbmd1YWdlcyBkb24ndCBzdXBwb3J0IDY0LWJpdCBjb25zdGFudHMsIGJ1dCBtYW55IGRvLCBzbyB3ZSBjYW4KKyAqIHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3IgcHJvamVjdHMgdGhhdCBkb24ndCB1c2UgYW55IG5vbi02NC1iaXQtc2FmZQorICogbGFuZ3VhZ2VzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjFmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBMb2dnaW5nIGZ1bmN0aW9ucyBjb3BpZWQgZnJvbSBtYWluLmNjIHRvIGF2b2lkIGxpbmsgZXJyb3JzIGZvciBwbHVnaW5zCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisvLyBUT0RPOiBtYWtlIHBsdWdpbnMgYWNjZXB0IGxvZyBvcHRpb25zIGZyb20gbWFpbiBjb21waWxlcgoraW50IGdfZGVidWcgPSAwOworaW50IGdfd2FybiA9IDE7CitpbnQgZ192ZXJib3NlID0gMDsKKwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfZGVidWcgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIC8vIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICAvLyBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICAvLyBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworICBleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTE9HR0lOR19ICisjZGVmaW5lIFRfTE9HR0lOR19ICisKK2V4dGVybiBpbnQgZ19kZWJ1ZzsKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIGludCBnX3ZlcmJvc2U7CisKKy8qKgorICogUGFyc2UgZGVidWdnaW5nIG91dHB1dCwgdXNlZCB0byBwcmludCBoZWxwZnVsIGluZm8KKyAqLwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIFBhcnNlciB3YXJuaW5nCisgKi8KK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogUHJpbnQgdmVyYm9zZSBvdXRwdXQgbWVzc2FnZQorICovCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBGYWlsdXJlIQorICovCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCkBAIC0wLDAgKzEsMTMwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIHRocmlmdCAtIGEgbGlnaHR3ZWlnaHQgY3Jvc3MtbGFuZ3VhZ2UgcnBjL3NlcmlhbGl6YXRpb24gdG9vbAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBjb21waWxlciBlbmdpbmUgZm9yIFRocmlmdCwgd2hpY2ggaW52b2tlcyB0aGUKKyAqIHNjYW5uZXIvcGFyc2VyIHRvIGJ1aWxkIHRoZSB0aHJpZnQgb2JqZWN0IHRyZWUuIFRoZSBpbnRlcmZhY2UgZ2VuZXJhdGlvbgorICogY29kZSBmb3IgZWFjaCBsYW5ndWFnZSBsaXZlcyBpbiBhIGZpbGUgYnkgdGhlIGxhbmd1YWdlIG5hbWUgdW5kZXIgdGhlCisgKiBnZW5lcmF0ZS8gZm9sZGVyLCBhbmQgYWxsIHBhcnNlIHN0cnVjdHVyZXMgbGl2ZSBpbiBwYXJzZS8KKyAqCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+IC8qIGZvciBHZXRGdWxsUGF0aE5hbWUgKi8KKyNlbmRpZgorCisvLyBDYXJlZnVsOiBtdXN0IGluY2x1ZGUgZ2xvYmFscyBmaXJzdCBmb3IgZXh0ZXJuIGRlZmluaXRpb25zCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisjaWZkZWYgVEhSSUZUX0VOQUJMRV9QTFVHSU4KKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBHbG9iYWwgcHJvZ3JhbSB0cmVlCisgKi8KK3RfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIEdsb2JhbCBzY29wZQorICovCit0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFBhcmVudCBzY29wZSB0byBhbHNvIHBhcnNlIHR5cGVzCisgKi8KK3Rfc2NvcGUqIGdfcGFyZW50X3Njb3BlOworCisvKioKKyAqIFByZWZpeCBmb3IgcHV0dGluZyB0eXBlcyBpbiBwYXJlbnQgc2NvcGUKKyAqLworc3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKKworLyoqCisgKiBQYXJzaW5nIHBhc3MKKyAqLworUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7CisKKy8qKgorICogQ3VycmVudCBkaXJlY3Rvcnkgb2YgZmlsZSBiZWluZyBwYXJzZWQKKyAqLworc3RyaW5nIGdfY3VyZGlyOworCisvKioKKyAqIEN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQKKyAqLworc3RyaW5nIGdfY3VycGF0aDsKKworLyoqCisgKiBTZWFyY2ggcGF0aCBmb3IgaW5jbHVzaW9ucworICovCit2ZWN0b3I8c3RyaW5nPiBnX2luY2xfc2VhcmNocGF0aDsKKworLyoqCisgKiBHbG9iYWwgZGVidWcgc3RhdGUKKyAqLworaW50IGdfZGVidWcgPSAwOworCisvKioKKyAqIFN0cmljdG5lc3MgbGV2ZWwKKyAqLworaW50IGdfc3RyaWN0ID0gMTI3OworCisvKioKKyAqIFdhcm5pbmcgbGV2ZWwKKyAqLworaW50IGdfd2FybiA9IDE7CisKKy8qKgorICogVmVyYm9zZSBvdXRwdXQKKyAqLworaW50IGdfdmVyYm9zZSA9IDA7CisKKy8qKgorICogR2xvYmFsIHRpbWUgc3RyaW5nCisgKi8KK2NoYXIqIGdfdGltZV9zdHI7CisKKy8qKgorICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworY2hhciogZ19kb2N0ZXh0OworCisvKioKKyAqIFRoZSBGaXJzdCBkb2N0ZXh0IGNvbW1lbnQKKyAqLworY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IG5lZ2F0aXZlIGZpZWxkIGtleXMgYXJlIGFjY2VwdGVkLgorICovCitpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgorICovCitpbnQgZ19hbGxvd182NGJpdF9jb25zdHMgPSAwOworCisvKioKKyAqIEZsYWdzIHRvIGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uCisgKi8KK2Jvb2wgZ2VuX3JlY3Vyc2UgPSBmYWxzZTsKKworLyoqCisgKiBGbGFncyB0byBjb250cm9sIHRocmlmdCBhdWRpdAorICovCitib29sIGdfYXVkaXQgPSBmYWxzZTsKKworLyoqCisgKiBGbGFnIHRvIGNvbnRyb2wgcmV0dXJuIHN0YXR1cworICovCitib29sIGdfcmV0dXJuX2ZhaWx1cmUgPSBmYWxzZTsKK2Jvb2wgZ19hdWRpdF9mYXRhbCA9IHRydWU7Citib29sIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSBmYWxzZTsKKworLyoqCisgKiBXaW4zMiBkb2Vzbid0IGhhdmUgcmVhbHBhdGgsIHNvIHVzZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpbiB0aGF0IGNhc2UsCisgKiBvdGhlcndpc2UgdGhpcyBqdXN0IGNhbGxzIHRocm91Z2ggdG8gcmVhbHBhdGgKKyAqLworY2hhciogc2FmZXJlYWxwYXRoKGNvbnN0IGNoYXIqIHBhdGgsIGNoYXIqIHJlc29sdmVkX3BhdGgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgY2hhciBidWZbTUFYX1BBVEhdOworICBjaGFyKiBiYXNlbmFtZTsKKyAgRFdPUkQgbGVuID0gR2V0RnVsbFBhdGhOYW1lKHBhdGgsIE1BWF9QQVRILCBidWYsICZiYXNlbmFtZSk7CisgIGlmIChsZW4gPT0gMCB8fCBsZW4gPiBNQVhfUEFUSCAtIDEpIHsKKyAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgcGF0aCk7CisgIH0gZWxzZSB7CisgICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIGJ1Zik7CisgIH0KKworICAvLyBSZXBsYWNlIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzIHNvIHRoZQorICAvLyByZXN0IG9mIHRoZSBjb2RlIGJlaGF2ZXMgY29ycmVjdGx5LgorICBzaXplX3QgcmVzb2x2ZWRfbGVuID0gc3RybGVuKHJlc29sdmVkX3BhdGgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc29sdmVkX2xlbjsgaSsrKSB7CisgICAgaWYgKHJlc29sdmVkX3BhdGhbaV0gPT0gJ1xcJykgeworICAgICAgcmVzb2x2ZWRfcGF0aFtpXSA9ICcvJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc29sdmVkX3BhdGg7CisjZWxzZQorICByZXR1cm4gcmVhbHBhdGgocGF0aCwgcmVzb2x2ZWRfcGF0aCk7CisjZW5kaWYKK30KKworYm9vbCBjaGVja19pc19kaXJlY3RvcnkoY29uc3QgY2hhciogZGlyX25hbWUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgRFdPUkQgYXR0cmlidXRlcyA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNBKGRpcl9uYW1lKTsKKyAgaWYgKGF0dHJpYnV0ZXMgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiBHZXRMYXN0RXJyb3IoKSA9ICVsZFxuIiwKKyAgICAgICAgICAgIGRpcl9uYW1lLAorICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgZGlyX25hbWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgIHN0cnVjdCBzdGF0IHNiOworICBpZiAoc3RhdChkaXJfbmFtZSwgJnNiKSA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6ICVzXG4iLCBkaXJfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFTX0lTRElSKHNiLnN0X21vZGUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKKy8qKgorICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSB1c2VyLiBUaGlzIGlzIGNhbGxlZCB5eWVycm9yIGZvciBoaXN0b3JpY2FsCisgKiByZWFzb25zIChsZXggYW5kIHlhY2MgZXhwZWN0IHRoZSBlcnJvciByZXBvcnRpbmcgcm91dGluZSB0byBiZSBjYWxsZWQKKyAqIHRoaXMpLiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IGFueSBlcnJvcnMgdG8gdGhlIHVzZXIuCisgKiB5eWVycm9yIHRha2VzIHByaW50ZiBzdHlsZSBhcmd1bWVudHMuCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbRVJST1I6JXM6JWRdIChsYXN0IHRva2VuIHdhcyAnJXMnKVxuIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vLCB5eXRleHQpOworCisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworCisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSBkZWJ1ZyBtZXNzYWdlIGZyb20gdGhlIHBhcnNlci4KKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ19kZWJ1ZyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSB2ZXJib3NlIG91dHB1dCBtb2RlIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3ZlcmJvc2UgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCisvKioKKyAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIGZhaWx1cmUgbWVzc2FnZSBhbmQgZXhpdHMKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworICBleGl0KDEpOworfQorCisvKioKKyAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCisgKi8KK3N0cmluZyBwcm9ncmFtX25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKKyAgaWYgKHNsYXNoICE9IHN0cmluZzo6bnBvcykgeworICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKHNsYXNoICsgMSk7CisgIH0KKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90ID0gZmlsZW5hbWUucmZpbmQoIi4iKTsKKyAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBkb3QpOworICB9CisgIHJldHVybiBmaWxlbmFtZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCisgKi8KK3N0cmluZyBkaXJlY3RvcnlfbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOworICAvLyBObyBzbGFzaCwganVzdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgIGlmIChzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gIi4iOworICB9CisgIHJldHVybiBmaWxlbmFtZS5zdWJzdHIoMCwgc2xhc2gpOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIHBhdGggZm9yIHRoZSBnaXZlbiBmaWxlbmFtZQorICovCitzdHJpbmcgaW5jbHVkZV9maWxlKHN0cmluZyBmaWxlbmFtZSkgeworICAvLyBBYnNvbHV0ZSBwYXRoPyBKdXN0IHRyeSB0aGF0CisgIGlmIChmaWxlbmFtZVswXSA9PSAnLycpIHsKKyAgICAvLyBSZWFscGF0aCEKKyAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgeworICAgICAgcHdhcm5pbmcoMCwgIkNhbm5vdCBvcGVuIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyBTdGF0IHRoaXMgZmlsZQorICAgIHN0cnVjdCBzdGF0IGZpbmZvOworICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKKyAgICAgIHJldHVybiBycDsKKyAgICB9CisgIH0gZWxzZSB7IC8vIHJlbGF0aXZlIHBhdGgsIHN0YXJ0IHNlYXJjaGluZworICAgIC8vIG5ldyBzZWFyY2ggcGF0aCB3aXRoIGN1cnJlbnQgZGlyIGdsb2JhbAorICAgIHZlY3RvcjxzdHJpbmc+IHNwID0gZ19pbmNsX3NlYXJjaHBhdGg7CisgICAgc3AuaW5zZXJ0KHNwLmJlZ2luKCksIGdfY3VyZGlyKTsKKworICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBwYXRocworICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gc3AuYmVnaW4oKTsgaXQgIT0gc3AuZW5kKCk7IGl0KyspIHsKKyAgICAgIHN0cmluZyBzZmlsZW5hbWUgPSAqKGl0KSArICIvIiArIGZpbGVuYW1lOworCisgICAgICAvLyBSZWFscGF0aCEKKyAgICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgICAgaWYgKHNhZmVyZWFscGF0aChzZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFN0YXQgdGhpcyBmaWxlcworICAgICAgc3RydWN0IHN0YXQgZmluZm87CisgICAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBycDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBVaCBvaAorICBwd2FybmluZygwLCAiQ291bGQgbm90IGZpbmQgaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKKy8qKgorICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KKyAqIEFsc28gcHJpbnRzIGEgd2FybmluZyBpZiB3ZSBhcmUgZGlzY2FyZGluZyBpbmZvcm1hdGlvbi4KKyAqLwordm9pZCBjbGVhcl9kb2N0ZXh0KCkgeworICBpZiAoZ19kb2N0ZXh0ICE9IE5VTEwpIHsKKyAgICBwd2FybmluZygyLCAiVW5jYXB0dXJlZCBkb2N0ZXh0IGF0IG9uIGxpbmUgJWQuIiwgZ19kb2N0ZXh0X2xpbmVubyk7CisgIH0KKyAgZnJlZShnX2RvY3RleHQpOworICBnX2RvY3RleHQgPSBOVUxMOworfQorCisvKioKKyAqIFJlc2V0IHByb2dyYW0gZG9jdGV4dCBpbmZvcm1hdGlvbiBhZnRlciBwcm9jZXNzaW5nIGEgZmlsZQorICovCit2b2lkIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCkgeworICBpZiAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpIHsKKyAgICBmcmVlKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gTlVMTDsKKyAgfQorICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOworICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOworICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gSU5WQUxJRCIpOworfQorCisvKioKKyAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgorICovCit2b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCkgeworICBpZiAoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IFNUSUxMX0NBTkRJREFURSkpIHsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBQlNPTFVURUxZX1NVUkU7CisgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFCU09MVVRFTFlfU1VSRSIpOworICB9IGVsc2UgeworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IE5PX1BST0dSQU1fRE9DVEVYVDsKKyAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gTk9fUFJPR1JBTV9ET0NURVhUIik7CisgIH0KK30KKworLyoqCisgKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKKyAqCisgKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKKyAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgorICovCitjaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKKyAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgorICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKKyAgZG9jc3RyaW5nLmVyYXNlKHJlbW92ZShkb2NzdHJpbmcuYmVnaW4oKSwgZG9jc3RyaW5nLmVuZCgpLCAnXHInKSwgZG9jc3RyaW5nLmVuZCgpKTsKKworICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgorICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOworICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OworICB3aGlsZSAodHJ1ZSkgeworICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zICsgMTsKKyAgICBwb3MgPSBkb2NzdHJpbmcuZmluZCgnXG4nLCBsYXN0KTsKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gRmlyc3QgYml0IG9mIGNsZWFuaW5nLiAgSWYgdGhlIGxhc3QgbGluZSBpcyBvbmx5IHdoaXRlc3BhY2UsIGRyb3AgaXQuCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBub253aGl0ZSA9IGRvY3N0cmluZy5maW5kX2ZpcnN0X25vdF9vZigiIFx0IiwgbGFzdCk7CisgICAgICBpZiAobm9ud2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0LCBwb3MgLSBsYXN0KSk7CisgIH0KKworICAvLyBBIHZlcnkgcHJvZm91bmQgZG9jc3RyaW5nLgorICBpZiAobGluZXMuZW1wdHkoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gQ2xlYXIgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpcnN0IGxpbmUuCisgIHBvcyA9IGxpbmVzLmZyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICBsaW5lcy5mcm9udCgpLmVyYXNlKDAsIHBvcyk7CisKKyAgLy8gSWYgZXZlcnkgbm9uYmxhbmsgbGluZSBhZnRlciB0aGUgZmlyc3QgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzcGFjZXMvdGFicywKKyAgLy8gdGhlbiBhIHN0YXIsIHJlbW92ZSB0aGVtLgorICBib29sIGhhdmVfcHJlZml4ID0gdHJ1ZTsKKyAgYm9vbCBmb3VuZF9wcmVmaXggPSBmYWxzZTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcHJlZml4X2xlbiA9IDA7CisgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBsX2l0ZXI7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAoIWZvdW5kX3ByZWZpeCkgeworICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKKyAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOworICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KKyAgICAgICAgbF9pdGVyLT5jbGVhcigpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJyAmJiBwb3MgPT0gcHJlZml4X2xlbikgeworICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCisgICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgorICAgICAgbF9pdGVyLT5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCisgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KKyAgaWYgKGhhdmVfcHJlZml4KSB7CisgICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KKyAgICBwcmVmaXhfbGVuKys7CisgICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKKyAgICB9CisgIH0KKworICAvLyBOb3cgZGVsZXRlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUuCisgIHByZWZpeF9sZW4gPSBzdHJpbmc6Om5wb3M7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgKHByZWZpeF9sZW4gPT0gc3RyaW5nOjpucG9zIHx8IHBvcyA8IHByZWZpeF9sZW4pKSB7CisgICAgICBwcmVmaXhfbGVuID0gcG9zOworICAgIH0KKyAgfQorCisgIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCisgIGlmIChwcmVmaXhfbGVuICE9IHN0cmluZzo6bnBvcykgeworICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7CisgICAgfQorICB9CisKKyAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgorICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpIC0gMSkgeworICAgICAgbF9pdGVyLT5lcmFzZShwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSwgcmVtb3ZlIGl0LgorICAvLyBEb24ndCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZSBhIGxvdCBvZiBzdGVwcyBza2lwIHRoZSBmaXJzdCBsaW5lLgorICBpZiAobGluZXMuZnJvbnQoKS5lbXB0eSgpKSB7CisgICAgbGluZXMuZXJhc2UobGluZXMuYmVnaW4oKSk7CisgIH0KKworICAvLyBOb3cgcmVqb2luIHRoZSBsaW5lcyBhbmQgY29weSB0aGVtIGJhY2sgaW50byBkb2N0ZXh0LgorICBkb2NzdHJpbmcuY2xlYXIoKTsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgZG9jc3RyaW5nICs9ICpsX2l0ZXI7CisgICAgZG9jc3RyaW5nICs9ICdcbic7CisgIH0KKworICAvLyBhc3NlcnQoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSk7ICBtYXkgaGFwcGVuLCBzZWUgVEhSSUZULTE3NTUKKyAgaWYgKGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpIHsKKyAgICBzdHJjcHkoZG9jdGV4dCwgZG9jc3RyaW5nLmNfc3RyKCkpOworICB9IGVsc2UgeworICAgIGZyZWUoZG9jdGV4dCk7IC8vIHRvbyBzaG9ydAorICAgIGRvY3RleHQgPSBzdHJkdXAoZG9jc3RyaW5nLmNfc3RyKCkpOworICB9CisgIHJldHVybiBkb2N0ZXh0OworfQorCisvKiogU2V0IHRvIHRydWUgdG8gZGVidWcgZG9jc3RyaW5nIHBhcnNpbmcgKi8KK3N0YXRpYyBib29sIGR1bXBfZG9jcyA9IGZhbHNlOworCisvKioKKyAqIER1bXBzIGRvY3N0cmluZ3MgdG8gc3Rkb3V0CisgKiBPbmx5IHdvcmtzIGZvciB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYW5kIHRoZSB3aG9sZSBwcm9ncmFtIGRvYworICogKGkuZS4sIG5vdCBlbnVtIGNvbnN0YW50cywgc3RydWN0IGZpZWxkcywgb3IgZnVuY3Rpb25zLgorICovCit2b2lkIGR1bXBfZG9jc3RyaW5ncyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RyaW5nIHByb2dkb2MgPSBwcm9ncmFtLT5nZXRfZG9jKCk7CisgIGlmICghcHJvZ2RvYy5lbXB0eSgpKSB7CisgICAgcHJpbnRmKCJXaG9sZSBwcm9ncmFtIGRvYzpcbiVzXG4iLCBwcm9nZG9jLmNfc3RyKCkpOworICB9CisgIGNvbnN0IHZlY3Rvcjx0X3R5cGVkZWYqPiYgdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+Ojpjb25zdF9pdGVyYXRvciB0X2l0ZXI7CisgIGZvciAodF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RfaXRlcikgeworICAgIHRfdHlwZWRlZiogdGQgPSAqdF9pdGVyOworICAgIGlmICh0ZC0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInR5cGVkZWYgJXM6XG4lc1xuIiwgdGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdGQtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgdF9lbnVtKiBlbiA9ICplX2l0ZXI7CisgICAgaWYgKGVuLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigiZW51bSAlczpcbiVzXG4iLCBlbi0+Z2V0X25hbWUoKS5jX3N0cigpLCBlbi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9jb25zdCo+JiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB0X2NvbnN0KiBjbyA9ICpjX2l0ZXI7CisgICAgaWYgKGNvLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigiY29uc3QgJXM6XG4lc1xuIiwgY28tPmdldF9uYW1lKCkuY19zdHIoKSwgY28tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKKyAgICBpZiAoc3QtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJzdHJ1Y3QgJXM6XG4lc1xuIiwgc3QtPmdldF9uYW1lKCkuY19zdHIoKSwgc3QtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogeG4gPSAqeF9pdGVyOworICAgIGlmICh4bi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInhjZXB0aW9uICVzOlxuJXNcbiIsIHhuLT5nZXRfbmFtZSgpLmNfc3RyKCksIHhuLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgeworICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOworICAgIGlmIChzdi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInNlcnZpY2UgJXM6XG4lc1xuIiwgc3YtPmdldF9uYW1lKCkuY19zdHIoKSwgc3YtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgorICovCit2b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpIHsKKyAgaWYgKChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgJiYgKGxpc3RfZWxlbV90eXBlICE9IE5VTEwpICYmIGxpc3RfZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZSA9ICh0X2Jhc2VfdHlwZSopbGlzdF9lbGVtX3R5cGU7CisgICAgaWYgKHRiYXNlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CisgICAgICBwd2FybmluZygxLCAiQ29uc2lkZXIgdXNpbmcgdGhlIG1vcmUgZWZmaWNpZW50IFwiYmluYXJ5XCIgdHlwZSBpbnN0ZWFkIG9mIFwibGlzdDxieXRlPlwiLiIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgYm9vbCBnX2J5dGVfd2FybmluZ19lbWl0dGVkID0gZmFsc2U7CisKKy8qKgorICogRW1pdHMgYSBvbmUtdGltZSB3YXJuaW5nIG9uIGJ5dGUgdHlwZSwgcHJvbW90aW5nIHRoZSBuZXcgaTggdHlwZSBpbnN0ZWFkCisgKi8KK3ZvaWQgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpIHsKKyAgaWYgKCFnX2J5dGVfd2FybmluZ19lbWl0dGVkKSB7CisgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAiVGhlIFwiYnl0ZVwiIHR5cGUgaXMgYSBjb21wYXRpYmlsaXR5IGFsaWFzIGZvciBcImk4XCIuIFVzZSBcImk4XCIgdG8gZW1waGFzaXplIHRoZSAiCisgICAgICAgICAgICAgInNpZ25lZG5lc3Mgb2YgdGhpcyB0eXBlLlxuIik7CisgICAgZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgZGVwcmVjYXRpb24gbm90aWNlIGZvciBvbGQgTlMgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyAqIElmIG5ld19mb3JtIGlzIE5VTEwsIG9sZF9mb3JtIGlzIGFzc3VtZWQgdG8gYmUgYSBsYW5ndWFnZSBpZGVudGlmaWVyLCBzdWNoIGFzICJjcHAiCisgKiBJZiBuZXdfZm9ybSBpcyBub3QgTlVMTCwgYm90aCBhcmd1bWVudHMgYXJlIHVzZWQgZXhhY3RseSBhcyBnaXZlbgorICovCit2b2lkIGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKGNvbnN0IGNoYXIqIG9sZF9mb3JtLCBjb25zdCBjaGFyKiBuZXdfZm9ybSkgeworICBjb25zdCBjaGFyKiByZW1haW5kZXIgPSAiIjsKKyAgaWYoIG5ld19mb3JtID09IE5VTEwpIHsKKyAgICBuZXdfZm9ybSA9IG9sZF9mb3JtOworICAgIHJlbWFpbmRlciA9ICJfbmFtZXNwYWNlIjsKKyAgfQorICBmYWlsdXJlKCJVbnN1cHBvcnRlZCBkZWNsYXJhdGlvbiAnJXMlcycuIFVzZSAnbmFtZXNwYWNlICVzJyBpbnN0ZWFkLiIsIG9sZF9mb3JtLCByZW1haW5kZXIsIG5ld19mb3JtKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCisgKi8KK3ZvaWQgdmVyc2lvbigpIHsKKyAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOworfQorCisvKioKKyAqIERpc3BsYXkgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUuCisgKi8KK3ZvaWQgdXNhZ2UoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJVc2UgdGhyaWZ0IC1oZWxwIGZvciBhIGxpc3Qgb2Ygb3B0aW9uc1xuIik7CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogRGlwbGF5cyB0aGUgaGVscCBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZCBoZWxwKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dCBkaXIgICAgU2V0IHRoZSBvdXB1dCBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKG5vIGdlbi0qIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1JIGRpciAgICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW5vd2FybiAgICAgU3VwcHJlc3MgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIChCQUQhKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtc3RyaWN0ICAgICBTdHJpY3QgY29tcGlsZXIgd2FybmluZ3Mgb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZbZXJib3NlXSAgVmVyYm9zZSBtb2RlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1yW2VjdXJzZV0gIEFsc28gZ2VuZXJhdGUgaW5jbHVkZWQgZmlsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRlYnVnICAgICAgUGFyc2UgZGVidWcgdHJhY2UgdG8gc3Rkb3V0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIiAgLS1hbGxvdy1uZWcta2V5cyAgQWxsb3cgbmVnYXRpdmUgZmllbGQga2V5cyAoVXNlZCB0byAiCisgICAgICAgICAgInByZXNlcnZlIHByb3RvY29sXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tYWxsb3ctNjRiaXQtY29uc3RzICBEbyBub3QgcHJpbnQgd2FybmluZ3MgYWJvdXQgdXNpbmcgNjQtYml0IGNvbnN0YW50c1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTJbLGtleTM9dmFsM11dXS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zIHJlbGF0ZWQgdG8gYXVkaXQgb3BlcmF0aW9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAtLWF1ZGl0IE9sZEZpbGUgICBPbGQgVGhyaWZ0IGZpbGUgdG8gYmUgYXVkaXRlZCB3aXRoICdmaWxlJ1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSW9sZCBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3Igb2xkIHRocmlmdCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1JbmV3IGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiQXZhaWxhYmxlIGdlbmVyYXRvcnMgKGFuZCBvcHRpb25zKTpcbiIpOworCisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgZ2VuX21hcCA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOworICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBnZW5fbWFwLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuX21hcC5lbmQoKTsgKytpdGVyKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiICAlcyAoJXMpOlxuIiwKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfbG9uZ19uYW1lKCkuY19zdHIoKSk7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZXItPnNlY29uZC0+Z2V0X2RvY3VtZW50YXRpb24oKS5jX3N0cigpKTsKKyAgfQorICBleGl0KDEpOworfQorCisvKioKKyAqIFlvdSBrbm93LCB3aGVuIEkgc3RhcnRlZCB3b3JraW5nIG9uIFRocmlmdCBJIHJlYWxseSB0aG91Z2h0IGl0IHdhc24ndCBnb2luZworICogdG8gYmVjb21lIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYmVjYXVzZSBpdCB3YXMganVzdCBhIGdlbmVyYXRvciBhbmQgaXQKKyAqIHdvdWxkbid0IG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFuZCBhbGwgdGhhdCBqYXp6LiBCdXQgdGhlbiB3ZQorICogZGVjaWRlZCB0byBhZGQgY29uc3RhbnRzLCBhbmQgYWxsIG9mIGEgc3VkZGVuIHRoYXQgbWVhbnMgcnVudGltZSB0eXBlCisgKiB2YWxpZGF0aW9uIGFuZCBpbmZlcmVuY2UsIGV4Y2VwdCB0aGUgInJ1bnRpbWUiIGlzIHRoZSBjb2RlIGdlbmVyYXRvcgorICogcnVudGltZS4KKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF9yZWMoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNhbm5vdCBkZWNsYXJlIGEgdm9pZCBjb25zdDogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RyaW5nIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBib29sIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYnl0ZSI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMTYiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTMyIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGk2NCI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSCisgICAgICAgICAgJiYgdmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBkb3VibGUiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBlbnVtIjsKKyAgICB9CisKKyAgICAvLyBzZWUgaWYgdGhlcmUncyBhIGRvdCBpbiB0aGUgaWRlbnRpZmllcgorICAgIHN0ZDo6c3RyaW5nIG5hbWVfcG9ydGlvbiA9IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gKCh0X2VudW0qKXR5cGUpLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWVfcG9ydGlvbikgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgIiArIG5hbWUgKyAiIHdhcyBkZWNsYXJlZCBhcyB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiICsgdmFsdWUtPmdldF9pZGVudGlmaWVyKCkKKyAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfTUFQKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RydWN0L3hjZXB0aW9uIjsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7CisgICAgICB9CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIi4iICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBlX3R5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGVsZW0+IiwgZV90eXBlLCAqdl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcworICogSXQncyBlYXNpZXIgdG8gZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiByZXdyaXRpbmcgdGhlIHdob2xlIGdyYW1tYXIgZXRjLgorICovCit2b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpIHsKKyAgc3RyaW5nIG5hbWUoaWRlbnRpZmllcik7CisgIGlmIChuYW1lLmZpbmQoIi4iKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB5eWVycm9yKCJJZGVudGlmaWVyICVzIGNhbid0IGhhdmUgYSBkb3QuIiwgaWRlbnRpZmllcik7CisgICAgZXhpdCgxKTsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQorICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgeworICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOworfQorCisvKioKKyAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgorICovCit2b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgeworICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgorICovCitib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghdF9nZW5lcmF0b3I6OmdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTa2lwcyBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgKi8KK2Jvb2wgc2tpcF91dGY4X2JvbShGSUxFKiBmKSB7CisKKyAgLy8gcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHdvcmtzCisgIGlmIChmZ2V0YyhmKSA9PSAweEVGKSB7CisgICAgaWYgKGZnZXRjKGYpID09IDB4QkIpIHsKKyAgICAgIGlmIChmZ2V0YyhmKSA9PSAweEJGKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJld2luZChmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHByb2dyYW0KKyAqLwordm9pZCBwYXJzZSh0X3Byb2dyYW0qIHByb2dyYW0sIHRfcHJvZ3JhbSogcGFyZW50X3Byb2dyYW0pIHsKKyAgLy8gR2V0IHNjb3BlIGZpbGUgcGF0aAorICBzdHJpbmcgcGF0aCA9IHByb2dyYW0tPmdldF9wYXRoKCk7CisKKyAgLy8gU2V0IGN1cnJlbnQgZGlyIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCBpbiB0aGUgaW5jbHVkZV9maWxlIGZ1bmN0aW9uCisgIGdfY3VyZGlyID0gZGlyZWN0b3J5X25hbWUocGF0aCk7CisgIGdfY3VycGF0aCA9IHBhdGg7CisKKyAgLy8gT3BlbiB0aGUgZmlsZQorICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkgeworICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCisgICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSBuZXcgc2NvcGUgYW5kIHNjYW4gZm9yIGluY2x1ZGVzCisgIHB2ZXJib3NlKCJTY2FubmluZyAlcyBmb3IgaW5jbHVkZXNcbiIsIHBhdGguY19zdHIoKSk7CisgIGdfcGFyc2VfbW9kZSA9IElOQ0xVREVTOworICBnX3Byb2dyYW0gPSBwcm9ncmFtOworICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKKyAgdHJ5IHsKKyAgICB5eWxpbmVubyA9IDE7CisgICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7CisgICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIGluY2x1ZGUgcGFzcy4iKTsKKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyB4KSB7CisgICAgZmFpbHVyZSh4LmNfc3RyKCkpOworICB9CisgIGZjbG9zZSh5eWluKTsKKworICAvLyBSZWN1cnNpdmVseSBwYXJzZSBhbGwgdGhlIGluY2x1ZGUgcHJvZ3JhbXMKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraXRlcikgeworICAgIHBhcnNlKCppdGVyLCBwcm9ncmFtKTsKKyAgfQorCisgIC8vIHJlc2V0IHByb2dyYW0gZG9jdGV4dCBzdGF0dXMgYmVmb3JlIHBhcnNpbmcgYSBuZXcgZmlsZQorICByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpOworCisgIC8vIFBhcnNlIHRoZSBwcm9ncmFtIGZpbGUKKyAgZ19wYXJzZV9tb2RlID0gUFJPR1JBTTsKKyAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKKyAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7CisgIGdfcGFyZW50X3Njb3BlID0gKHBhcmVudF9wcm9ncmFtICE9IE5VTEwpID8gcGFyZW50X3Byb2dyYW0tPnNjb3BlKCkgOiBOVUxMOworICBnX3BhcmVudF9wcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIi4iOworICBnX2N1cnBhdGggPSBwYXRoOworCisgIC8vIE9wZW4gdGhlIGZpbGUKKyAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7CisgIGlmICh5eWluID09IDApIHsKKyAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOworICB9CisgIGlmIChza2lwX3V0ZjhfYm9tKHl5aW4pKQorICAgIHB2ZXJib3NlKCJTa2lwcGVkIFVURi04IEJPTSBhdCAlc1xuIiwgcGF0aC5jX3N0cigpKTsKKworICBwdmVyYm9zZSgiUGFyc2luZyAlcyBmb3IgdHlwZXNcbiIsIHBhdGguY19zdHIoKSk7CisgIHl5bGluZW5vID0gMTsKKyAgdHJ5IHsKKyAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKKyAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgdHlwZXMgcGFzcy4iKTsKKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyB4KSB7CisgICAgZmFpbHVyZSh4LmNfc3RyKCkpOworICB9CisgIGZjbG9zZSh5eWluKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBjb2RlCisgKi8KK3ZvaWQgZ2VuZXJhdGUodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgZ2VuZXJhdG9yX3N0cmluZ3MpIHsKKyAgLy8gT29vb2hoLCByZWN1cnNpdmUgY29kZSBnZW5lcmF0aW9uLCBob3QhIQorICBpZiAoZ2VuX3JlY3Vyc2UpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgLy8gUHJvcGFnYXRlIG91dHB1dCBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIHByb2dyYW1zCisgICAgICBpbmNsdWRlc1tpXS0+c2V0X291dF9wYXRoKHByb2dyYW0tPmdldF9vdXRfcGF0aCgpLCBwcm9ncmFtLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKTsKKworICAgICAgZ2VuZXJhdGUoaW5jbHVkZXNbaV0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb2RlIQorICB0cnkgeworICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKKworICAgIGlmIChkdW1wX2RvY3MpIHsKKyAgICAgIGR1bXBfZG9jc3RyaW5ncyhwcm9ncmFtKTsKKyAgICB9CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBnZW5lcmF0b3Jfc3RyaW5ncy5iZWdpbigpOyBpdGVyICE9IGdlbmVyYXRvcl9zdHJpbmdzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRfZ2VuZXJhdG9yKiBnZW5lcmF0b3IgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAqaXRlcik7CisKKyAgICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgeworI2lmZGVmIFRIUklGVF9FTkFCTEVfUExVR0lOCisgICAgICAgIHN3aXRjaCAocGx1Z2luX291dHB1dDo6ZGVsZWdhdGVUb1BsdWdpbihwcm9ncmFtLCAqaXRlcikpIHsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9OT1RfRk9VTkQ6CisgICAgICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX0ZBSUxVUkU6CisgICAgICAgICAgICBwd2FybmluZygxLCAiUGx1Z2luIGdlbmVyYXRvciBmb3IgXCIlc1wiIGZhaWxlZC5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9TVUNDRUVTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisjZW5kaWYKKyAgICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yKSB7CisgICAgICAgIGdlbmVyYXRvci0+dmFsaWRhdGVfaW5wdXQoKTsKKyAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7CisgICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgcykgeworICAgIGZhaWx1cmUoIkVycm9yOiAlc1xuIiwgcy5jX3N0cigpKTsKKyAgfSBjYXRjaCAoY29uc3QgY2hhciogZXhjKSB7CisgICAgZmFpbHVyZSgiRXJyb3I6ICVzXG4iLCBleGMpOworICB9Cit9CisKK3ZvaWQgYXVkaXQodF9wcm9ncmFtKiBuZXdfcHJvZ3JhbSwKKyAgICAgICAgICAgdF9wcm9ncmFtKiBvbGRfcHJvZ3JhbSwKKyAgICAgICAgICAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLAorICAgICAgICAgICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpIHsKKyAgdmVjdG9yPHN0cmluZz4gdGVtcF9pbmNsX3NlYXJjaHBhdGggPSBnX2luY2xfc2VhcmNocGF0aDsKKyAgaWYgKCFvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aC5lbXB0eSgpKSB7CisgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKKyAgfQorCisgIHBhcnNlKG9sZF9wcm9ncmFtLCBOVUxMKTsKKworICBnX2luY2xfc2VhcmNocGF0aCA9IHRlbXBfaW5jbF9zZWFyY2hwYXRoOworICBpZiAoIW5ld190aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKKyAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sobmV3X3RocmlmdF9pbmNsdWRlX3BhdGgpOworICB9CisKKyAgcGFyc2UobmV3X3Byb2dyYW0sIE5VTEwpOworCisgIGNvbXBhcmVfbmFtZXNwYWNlKG5ld19wcm9ncmFtLCBvbGRfcHJvZ3JhbSk7CisgIGNvbXBhcmVfc2VydmljZXMobmV3X3Byb2dyYW0tPmdldF9zZXJ2aWNlcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCkpOworICBjb21wYXJlX2VudW1zKG5ld19wcm9ncmFtLT5nZXRfZW51bXMoKSwgb2xkX3Byb2dyYW0tPmdldF9lbnVtcygpKTsKKyAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfc3RydWN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKSk7CisgIGNvbXBhcmVfc3RydWN0cyhuZXdfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgY29tcGFyZV9jb25zdHMobmV3X3Byb2dyYW0tPmdldF9jb25zdHMoKSwgb2xkX3Byb2dyYW0tPmdldF9jb25zdHMoKSk7Cit9CisKKy8qKgorICogUGFyc2UgaXQgdXAuLiB0aGVuIHNwaXQgaXQgYmFjayBvdXQsIGluIHByZXR0eSBtdWNoIGV2ZXJ5IGxhbmd1YWdlLiBBbHJpZ2h0CisgKiBub3QgdGhhdCBtYW55IGxhbmd1YWdlcywgYnV0IHRoZSBjb29sIG9uZXMgdGhhdCB3ZSBjYXJlIGFib3V0LgorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgaW50IGk7CisgIHN0ZDo6c3RyaW5nIG91dF9wYXRoOworICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlID0gZmFsc2U7CisKKyAgLy8gU2V0dXAgdGltZSBzdHJpbmcKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKKworICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKKyAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgdXNhZ2UoKTsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOworICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGg7CisgIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKKyAgc3RyaW5nIG9sZF9pbnB1dF9maWxlOworCisgIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCisgIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOworCisgIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQorICBmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworICAgIGNoYXIqIGFyZzsKKworICAgIGFyZyA9IHN0cnRvayhhcmd2W2ldLCAiICIpOworICAgIHdoaWxlIChhcmcgIT0gTlVMTCkgeworICAgICAgLy8gVHJlYXQgZG91YmxlIGRhc2hlcyBhcyBzaW5nbGUgZGFzaGVzCisgICAgICBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nKSB7CisgICAgICAgICsrYXJnOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKGFyZywgIi1oZWxwIikgPT0gMCkgeworICAgICAgICBoZWxwKCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKKyAgICAgICAgdmVyc2lvbigpOworICAgICAgICBleGl0KDApOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgeworICAgICAgICBnX2RlYnVnID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7CisgICAgICAgIGdfd2FybiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgeworICAgICAgICBnX3N0cmljdCA9IDI1NTsKKyAgICAgICAgZ193YXJuID0gMjsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwKSB7CisgICAgICAgIGdfdmVyYm9zZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItciIpID09IDAgfHwgc3RyY21wKGFyZywgIi1yZWN1cnNlIikgPT0gMCkgeworICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctbmVnLWtleXMiKSA9PSAwKSB7CisgICAgICAgIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LTY0Yml0LWNvbnN0cyIpID09IDApIHsKKyAgICAgICAgZ19hbGxvd182NGJpdF9jb25zdHMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWdlbiIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSSIpID09IDApIHsKKyAgICAgICAgLy8gQW4gYXJndW1lbnQgb2YgIi1JXCBhc2RmIiBpcyBpbnZhbGlkIGFuZCBoYXMgdW5rbm93biByZXN1bHRzCisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnlcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiLW8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSkgeworICAgICAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLW86IG1pc3Npbmcgb3V0cHV0IGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfcGF0aCA9IGFyZzsKKworI2lmZGVmIF9XSU4zMgorICAgICAgICAvLyBzdHJpcCBvdXQgdHJhaWxpbmcgXCBvbiBXaW5kb3dzCisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdCA9IG91dF9wYXRoLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgaWYgKG91dF9wYXRoW2xhc3RdID09ICdcXCcpIHsKKyAgICAgICAgICBvdXRfcGF0aC5lcmFzZShsYXN0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICghY2hlY2tfaXNfZGlyZWN0b3J5KG91dF9wYXRoLmNfc3RyKCkpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdCIpID09IDApIHsKKyAgICAgICAgZ19hdWRpdCA9IHRydWU7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIG9sZCB0aHJpZnQgZmlsZSBuYW1lIGZvciBhdWRpdCBvcGVyYXRpb25cbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBvbGRfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKKworICAgICAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICAgICAgaWYgKHNhZmVyZWFscGF0aChhcmcsIG9sZF90aHJpZnRfZmlsZV9ycCkgPT0gTlVMTCkgeworICAgICAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmcpOworICAgICAgICB9CisgICAgICAgIG9sZF9pbnB1dF9maWxlID0gc3RyaW5nKG9sZF90aHJpZnRfZmlsZV9ycCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYXVkaXQtbm9mYXRhbCIpID09IDApIHsKKyAgICAgICAgZ19hdWRpdF9mYXRhbCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUlvbGQiKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JbmV3IikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeSBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoID0gc3RyaW5nKGFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOworICAgICAgICB1c2FnZSgpOworICAgICAgfQorCisgICAgICAvLyBUb2tlbml6ZSBtb3JlCisgICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKKyAgICB9CisgIH0KKworICAvLyBkaXNwbGF5IGhlbHAKKyAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItaGVscCIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLWhlbHAiKSA9PSAwKSkgeworICAgIGhlbHAoKTsKKyAgfQorCisgIC8vIGlmIHlvdSdyZSBhc2tpbmcgZm9yIHZlcnNpb24sIHlvdSBoYXZlIGEgcmlnaHQgbm90IHRvIHBhc3MgYSBmaWxlCisgIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLXZlcnNpb24iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS12ZXJzaW9uIikgPT0gMCkpIHsKKyAgICB2ZXJzaW9uKCk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgZ2xvYmFsIHR5cGVzCisgIGluaXRHbG9iYWxzKCk7CisKKyAgaWYgKGdfYXVkaXQpIHsKKyAgICAvLyBBdWRpdCBvcGVyYXRpb24KKworICAgIGlmIChvbGRfaW5wdXRfZmlsZS5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lIG9mIG9sZCB0aHJpZnQgZmlsZSBmb3IgYXVkaXRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisKKyAgICBjaGFyIG5ld190aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2YgbmV3IHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIG5ld190aHJpZnRfZmlsZV9ycCkgPT0gTlVMTCkgeworICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOworICAgIH0KKyAgICBzdHJpbmcgbmV3X2lucHV0X2ZpbGUobmV3X3RocmlmdF9maWxlX3JwKTsKKworICAgIHRfcHJvZ3JhbSBuZXdfcHJvZ3JhbShuZXdfaW5wdXRfZmlsZSk7CisgICAgdF9wcm9ncmFtIG9sZF9wcm9ncmFtKG9sZF9pbnB1dF9maWxlKTsKKworICAgIGF1ZGl0KCZuZXdfcHJvZ3JhbSwgJm9sZF9wcm9ncmFtLCBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCwgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpOworCisgIH0gZWxzZSB7CisgICAgLy8gR2VuZXJhdGUgb3B0aW9ucworCisgICAgLy8gWW91IGdvdHRhIGdlbmVyYXRlIHNvbWV0aGluZyEKKyAgICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgbGFuZ3VhZ2Uocykgc3BlY2lmaWVkXG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorCisgICAgLy8gUmVhbC1wYXRoaWZ5IGl0CisgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWVcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBycCkgPT0gTlVMTCkgeworICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOworICAgIH0KKyAgICBzdHJpbmcgaW5wdXRfZmlsZShycCk7CisKKyAgICAvLyBJbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIHBhcnNlIHRyZWUKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOworICAgIGlmIChvdXRfcGF0aC5zaXplKCkpIHsKKyAgICAgIHByb2dyYW0tPnNldF9vdXRfcGF0aChvdXRfcGF0aCwgb3V0X3BhdGhfaXNfYWJzb2x1dGUpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGNwcCBpbmNsdWRlIHByZWZpeC4KKyAgICAvLyBpbmZlciB0aGlzIGZyb20gdGhlIGZpbGVuYW1lIHBhc3NlZCBpbgorICAgIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07CisgICAgc3RyaW5nIGluY2x1ZGVfcHJlZml4OworCisgICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKKyAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5wdXRfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOworICAgIH0KKworICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7CisKKyAgICAvLyBQYXJzZSBpdCEKKyAgICBwYXJzZShwcm9ncmFtLCBOVUxMKTsKKworICAgIC8vIFRoZSBjdXJyZW50IHBhdGggaXMgbm90IHJlYWxseSByZWxldmFudCB3aGVuIHdlIGFyZSBkb2luZyBnZW5lcmF0aW9uLgorICAgIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KKyAgICBnX2N1cnBhdGggPSAiZ2VuZXJhdGlvbiI7CisgICAgLy8gUmVzZXQgeXlsaW5lbm8gZm9yIHRoZSBoZWNrIG9mIGl0LiAgVXNlIDEgaW5zdGVhZCBvZiAwIGJlY2F1c2UKKyAgICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCisgICAgeXlsaW5lbm8gPSAxOworCisgICAgLy8gR2VuZXJhdGUgaXQhCisgICAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOworICAgIGRlbGV0ZSBwcm9ncmFtOworICB9CisKKyAgLy8gQ2xlYW4gdXAuIFdobyBhbSBJIGtpZGRpbmcuLi4gdGhpcyBwcm9ncmFtIHByb2JhYmx5IG9ycGhhbnMgaGVhcCBtZW1vcnkKKyAgLy8gYWxsIG92ZXIgdGhlIHBsYWNlLCBidXQgd2hvIGNhcmVzIGJlY2F1c2UgaXQgaXMgYWJvdXQgdG8gZXhpdCBhbmQgaXQgaXMKKyAgLy8gYWxsIHJlZmVyZW5jZWQgYW5kIHVzZWQgYnkgdGhpcyB3YWNreSBwYXJzZSB0cmVlIHVwIHVudGlsIG5vdyBhbnl3YXlzLgorICBjbGVhckdsb2JhbHMoKTsKKworICAvLyBGaW5pc2hlZAorICBpZiAoZ19yZXR1cm5fZmFpbHVyZSAmJiBnX2F1ZGl0X2ZhdGFsKSB7CisgICAgZXhpdCgyKTsKKyAgfQorICBpZiAoZ19nZW5lcmF0b3JfZmFpbHVyZSkgeworICAgIGV4aXQoMyk7CisgIH0KKyAgLy8gRmluaXNoZWQKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhYmIwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTUFJTl9ICisjZGVmaW5lIFRfTUFJTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworLyoqCisgKiBEZWZpbmVkIGluIHRoZSBmbGV4IGxpYnJhcnkKKyAqLworCitleHRlcm4gIkMiIHsgaW50IHl5bGV4KHZvaWQpOyB9CisKK2ludCB5eXBhcnNlKHZvaWQpOworCisvKioKKyAqIEV4cGVjdGVkIHRvIGJlIGRlZmluZWQgYnkgRmxleC9CaXNvbgorICovCit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcik7CisKKy8qKgorICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpOworCisvKioKKyAqIENoZWNrIGNvbnN0YW50IHR5cGVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KTsKKworLyoqCisgKiBDaGVjayBtZW1iZXJzIG9mIGEgdGhyb3dzIGJsb2NrCisgKi8KK2Jvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpOworCisvKioKKyAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCisgKi8KK3N0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQorICovCitzdGQ6OnN0cmluZyBkaXJlY3RvcnlfbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhbiBpbmNsdWRlIGZpbGUKKyAqLworc3RkOjpzdHJpbmcgaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgorICovCit2b2lkIGNsZWFyX2RvY3RleHQoKTsKKworLyoqCisgKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKKyAqLworY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KTsKKworLyoqCisgKiBXZSBhcmUgc3VyZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0IGNhbmRpZGF0ZSBpcyByZWFsbHkgdGhlIHByb2dyYW0gZG9jdGV4dC4KKyAqLwordm9pZCBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworCisvKioKKyAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSk7CisKKy8qKgorICogRW1pdHMgYSBvbmUtdGltZSB3YXJuaW5nIG9uIGJ5dGUgdHlwZSwgcHJvbW90aW5nIHRoZSBuZXcgaTggdHlwZSBpbnN0ZWFkCisgKi8KK3ZvaWQgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworCisvKioKKyAqIFByaW50cyBkZXByZWNhdGlvbiBub3RpY2UgZm9yIG9sZCBOUyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICogSWYgbmV3X2Zvcm0gaXMgTlVMTCwgb2xkX2Zvcm0gaXMgYXNzdW1lZCB0byBiZSBhIGxhbmd1YWdlIGlkZW50aWZpZXIsIHN1Y2ggYXMgImNwcCIKKyAqIElmIG5ld19mb3JtIGlzIG5vdCBOVUxMLCBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZCBleGFjdGx5IGFzIGdpdmVuCisgKi8KK3ZvaWQgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woY29uc3QgY2hhciogb2xkX2Zvcm0sIGNvbnN0IGNoYXIqIG5ld19mb3JtID0gTlVMTCk7CisKKy8qKgorICogRmxleCB1dGlsaXRpZXMKKyAqLworCitleHRlcm4gaW50IHl5bGluZW5vOworZXh0ZXJuIGNoYXIgeXl0ZXh0W107CitleHRlcm4gc3RkOjpGSUxFKiB5eWluOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNzYzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorCit0X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIHsKKyAgdF90eXBlKiB0eXBlID0gdGhpczsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKK2NvbnN0IHRfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgY29uc3QgeworICBjb25zdCB0X3R5cGUqIHR5cGUgPSB0aGlzOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzk4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9CQVNFX1RZUEVfSAorI2RlZmluZSBUX0JBU0VfVFlQRV9ICisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBIHRocmlmdCBiYXNlIHR5cGUsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBkZWZpbmVkIGVudW1lcmF0ZWQgdHlwZXMgaW5zaWRlCisgKiB0aGlzIGRlZmluaXRpb24uCisgKgorICovCitjbGFzcyB0X2Jhc2VfdHlwZSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICAvKioKKyAgICogRW51bWVyYXRpb24gb2YgdGhyaWZ0IGJhc2UgdHlwZXMKKyAgICovCisgIGVudW0gdF9iYXNlIHsKKyAgICBUWVBFX1ZPSUQsCisgICAgVFlQRV9TVFJJTkcsCisgICAgVFlQRV9CT09MLAorICAgIFRZUEVfSTgsCisgICAgVFlQRV9JMTYsCisgICAgVFlQRV9JMzIsCisgICAgVFlQRV9JNjQsCisgICAgVFlQRV9ET1VCTEUKKyAgfTsKKworICB0X2Jhc2VfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X2Jhc2UgYmFzZSkKKyAgICA6IHRfdHlwZShuYW1lKSwgYmFzZV8oYmFzZSksIHN0cmluZ19saXN0XyhmYWxzZSksIGJpbmFyeV8oZmFsc2UpLCBzdHJpbmdfZW51bV8oZmFsc2UpIHt9CisKKyAgdF9iYXNlIGdldF9iYXNlKCkgY29uc3QgeyByZXR1cm4gYmFzZV87IH0KKworICBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1ZPSUQ7IH0KKworICBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HOyB9CisKKyAgYm9vbCBpc19ib29sKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9CT09MOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nX2xpc3QoYm9vbCB2YWwpIHsgc3RyaW5nX2xpc3RfID0gdmFsOyB9CisKKyAgYm9vbCBpc19zdHJpbmdfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19saXN0XyAmJiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpOyB9CisKKyAgdm9pZCBzZXRfYmluYXJ5KGJvb2wgdmFsKSB7IGJpbmFyeV8gPSB2YWw7IH0KKworICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIGJpbmFyeV8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQorCisgIHZvaWQgc2V0X3N0cmluZ19lbnVtKGJvb2wgdmFsKSB7IHN0cmluZ19lbnVtXyA9IHZhbDsgfQorCisgIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV8gJiYgYmFzZV8gPT0gVFlQRV9TVFJJTkc7IH0KKworICB2b2lkIGFkZF9zdHJpbmdfZW51bV92YWwoc3RkOjpzdHJpbmcgdmFsKSB7IHN0cmluZ19lbnVtX3ZhbHNfLnB1c2hfYmFjayh2YWwpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfc3RyaW5nX2VudW1fdmFscygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19lbnVtX3ZhbHNfOyB9CisKKyAgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHRfYmFzZV9uYW1lKHRfYmFzZSB0YmFzZSkgeworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIFRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAidm9pZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0k4OgorICAgICAgcmV0dXJuICJpOCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKHVua25vd24pIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB0X2Jhc2UgYmFzZV87CisKKyAgYm9vbCBzdHJpbmdfbGlzdF87CisgIGJvb2wgYmluYXJ5XzsKKyAgYm9vbCBzdHJpbmdfZW51bV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdfZW51bV92YWxzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDhlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OU1RfSAorI2RlZmluZSBUX0NPTlNUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIgorCisvKioKKyAqIEEgY29uc3QgaXMgYSBjb25zdGFudCB2YWx1ZSBkZWZpbmVkIGFjcm9zcyBsYW5ndWFnZXMgdGhhdCBoYXMgYSB0eXBlIGFuZAorICogYSB2YWx1ZS4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBtaWdodCBub3QgbWF0Y2ggdGhlIHR5cGUKKyAqIG9mIHRoZSB2YWx1ZSBvYmplY3QsIHNpbmNlIHRoYXQgaXMgbm90IGRldGVybWluZWQgdW50aWwgYWZ0ZXIgcGFyc2luZyB0aGUKKyAqIHdob2xlIHRoaW5nIG91dC4KKyAqCisgKi8KK2NsYXNzIHRfY29uc3QgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2NvbnN0KHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpCisgICAgOiB0eXBlXyh0eXBlKSwgbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTExNGNmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05TVF9WQUxVRV9ICisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSosIFRvJik7Cit9CisKKy8qKgorICogQSBjb25zdCB2YWx1ZSBpcyBzb21ldGhpbmcgcGFyc2VkIHRoYXQgY291bGQgYmUgYSBtYXAsIHNldCwgbGlzdCwgc3RydWN0CisgKiBvciB3aGF0ZXZlci4KKyAqCisgKi8KK2NsYXNzIHRfY29uc3RfdmFsdWUgeworcHVibGljOgorICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgorICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCisgICAqLworICBzdHJ1Y3QgdmFsdWVfY29tcGFyZSB7CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkodF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIGxlZnQsIHRfY29uc3RfdmFsdWUgY29uc3QqIGNvbnN0JiByaWdodCkgY29uc3QgeworICAgICAgcmV0dXJuICpsZWZ0IDwgKnJpZ2h0OworICAgIH0KKyAgfTsKKworICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7IENWX0lOVEVHRVIsIENWX0RPVUJMRSwgQ1ZfU1RSSU5HLCBDVl9NQVAsIENWX0xJU1QsIENWX0lERU5USUZJRVIsIENWX1VOS05PV04gfTsKKworICB0X2NvbnN0X3ZhbHVlKCkgOiBpbnRWYWxfKDApLCBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikge30KKworICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSA6IGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9pbnRlZ2VyKHZhbCk7IH0KKworICB0X2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIHZhbCkgOiBpbnRWYWxfKDApLCBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikgeyBzZXRfc3RyaW5nKHZhbCk7IH0KKworICB2b2lkIHNldF9zdHJpbmcoc3RkOjpzdHJpbmcgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9TVFJJTkc7CisgICAgc3RyaW5nVmFsXyA9IHZhbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmdWYWxfOyB9CisKKyAgdm9pZCBzZXRfaW50ZWdlcihpbnQ2NF90IHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfSU5URUdFUjsKKyAgICBpbnRWYWxfID0gdmFsOworICB9CisKKyAgaW50NjRfdCBnZXRfaW50ZWdlcigpIGNvbnN0IHsKKyAgICBpZiAodmFsVHlwZV8gPT0gQ1ZfSURFTlRJRklFUikgeworICAgICAgaWYgKGVudW1fID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgImhhdmUgaWRlbnRpZmllciBcIiIgKyBnZXRfaWRlbnRpZmllcigpICsgIlwiLCBidXQgdW5zZXQgZW51bSBvbiBsaW5lISI7CisgICAgICB9CisgICAgICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90ID0gaWRlbnRpZmllci5yZmluZCgnLicpOworICAgICAgaWYgKGRvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5zdWJzdHIoZG90ICsgMSk7CisgICAgICB9CisgICAgICB0X2VudW1fdmFsdWUqIHZhbCA9IGVudW1fLT5nZXRfY29uc3RhbnRfYnlfbmFtZShpZGVudGlmaWVyKTsKKyAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAiVW5hYmxlIHRvIGZpbmQgZW51bSB2YWx1ZSBcIiIgKyBpZGVudGlmaWVyICsgIlwiIGluIGVudW0gXCIiICsgZW51bV8tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICsgIlwiIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2YWwtPmdldF92YWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW50VmFsXzsKKyAgICB9CisgIH0KKworICB2b2lkIHNldF9kb3VibGUoZG91YmxlIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfRE9VQkxFOworICAgIGRvdWJsZVZhbF8gPSB2YWw7CisgIH0KKworICBkb3VibGUgZ2V0X2RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIGRvdWJsZVZhbF87IH0KKworICB2b2lkIHNldF9tYXAoKSB7IHZhbFR5cGVfID0gQ1ZfTUFQOyB9CisKKyAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7IG1hcFZhbF9ba2V5XSA9IHZhbDsgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGdldF9tYXAoKSBjb25zdCB7IHJldHVybiBtYXBWYWxfOyB9CisKKyAgdm9pZCBzZXRfbGlzdCgpIHsgdmFsVHlwZV8gPSBDVl9MSVNUOyB9CisKKyAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbGlzdFZhbF8ucHVzaF9iYWNrKHZhbCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGdldF9saXN0KCkgY29uc3QgeyByZXR1cm4gbGlzdFZhbF87IH0KKworICB2b2lkIHNldF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfSURFTlRJRklFUjsKKyAgICBpZGVudGlmaWVyVmFsXyA9IHZhbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gaWRlbnRpZmllclZhbF87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl9uYW1lKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKKyAgICB9CisgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOworICAgIH0KKyAgICBzaXplX3QgczIgPSByZXQuZmluZCgnLicsIHMgKyAxKTsKKyAgICBpZiAoczIgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgdm9pZCBzZXRfZW51bSh0X2VudW0qIHRlbnVtKSB7IGVudW1fID0gdGVudW07IH0KKworICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7IGlmICh2YWxUeXBlXyA9PSBDVl9VTktOT1dOKSB7IHRocm93IHN0ZDo6c3RyaW5nKCJ1bmtub3duIHRfY29uc3RfdmFsdWUiKTsgfSByZXR1cm4gdmFsVHlwZV87IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IG1hcCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleSBhbmQgdGhlbiB2YWx1ZS4KKyAgICogVGhpcyBpcyB1c2VkIGZvciBtYXAgY29tcGFyaXNvbiBpbiBsZXhpY29ncmFwaGljIG9yZGVyLgorICAgKi8KKyAgc3RydWN0IG1hcF9lbnRyeV9jb21wYXJlIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IENvbnN0UGFpcjsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKShDb25zdFBhaXIgbGVmdCwgQ29uc3RQYWlyIHJpZ2h0KSBjb25zdCB7CisgICAgICBpZiAoKihsZWZ0LmZpcnN0KSA8ICoocmlnaHQuZmlyc3QpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCoocmlnaHQuZmlyc3QpIDwgKihsZWZ0LmZpcnN0KSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gKihsZWZ0LnNlY29uZCkgPCAqKHJpZ2h0LnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgYm9vbCBvcGVyYXRvciA8IChjb25zdCB0X2NvbnN0X3ZhbHVlJiB0aGF0KSBjb25zdCB7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDEgPSBnZXRfdHlwZSgpOworICAgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQyID0gdGhhdC5nZXRfdHlwZSgpOworICAgIGlmICh0MSAhPSB0MikKKyAgICAgIHJldHVybiB0MSA8IHQyOworICAgIHN3aXRjaCAodDEpIHsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICAgIHJldHVybiBpbnRWYWxfIDwgdGhhdC5pbnRWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgICByZXR1cm4gZG91YmxlVmFsXyA8IHRoYXQuZG91YmxlVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgICAgcmV0dXJuIHN0cmluZ1ZhbF8gPCB0aGF0LnN0cmluZ1ZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICByZXR1cm4gaWRlbnRpZmllclZhbF8gPCB0aGF0LmlkZW50aWZpZXJWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBtYXBWYWxfLmJlZ2luKCksIG1hcFZhbF8uZW5kKCksIHRoYXQubWFwVmFsXy5iZWdpbigpLCB0aGF0Lm1hcFZhbF8uZW5kKCksIG1hcF9lbnRyeV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgbGlzdFZhbF8uYmVnaW4oKSwgbGlzdFZhbF8uZW5kKCksIHRoYXQubGlzdFZhbF8uYmVnaW4oKSwgdGhhdC5saXN0VmFsXy5lbmQoKSwgdmFsdWVfY29tcGFyZSgpKTsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVua25vd24gdmFsdWUgdHlwZSI7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdmFsdWVfY29tcGFyZT4gbWFwVmFsXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RWYWxfOworICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxfOworICBpbnQ2NF90IGludFZhbF87CisgIGRvdWJsZSBkb3VibGVWYWxfOworICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyVmFsXzsKKyAgdF9lbnVtKiBlbnVtXzsKKworICB0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsVHlwZV87CisKKyAgLy8gdG8gcmVhZCBlbnVtXworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CisgIGZyaWVuZCB2b2lkIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoRnJvbSosIFRvJik7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGFiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlRBSU5FUl9ICisjZGVmaW5lIFRfQ09OVEFJTkVSX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworY2xhc3MgdF9jb250YWluZXIgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9jb250YWluZXIoKSA6IGNwcF9uYW1lXygpLCBoYXNfY3BwX25hbWVfKGZhbHNlKSB7fQorCisgIHZpcnR1YWwgfnRfY29udGFpbmVyKCkge30KKworICB2b2lkIHNldF9jcHBfbmFtZShzdGQ6OnN0cmluZyBjcHBfbmFtZSkgeworICAgIGNwcF9uYW1lXyA9IGNwcF9uYW1lOworICAgIGhhc19jcHBfbmFtZV8gPSB0cnVlOworICB9CisKKyAgYm9vbCBoYXNfY3BwX25hbWUoKSBjb25zdCB7IHJldHVybiBoYXNfY3BwX25hbWVfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gY3BwX25hbWVfOyB9CisKKyAgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGNwcF9uYW1lXzsKKyAgYm9vbCBoYXNfY3BwX25hbWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmNiOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9ET0NfSAorI2RlZmluZSBUX0RPQ19ICisKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisKKy8qKgorICogRG9jdW1lbnRhdGlvbiBzdHVicworICoKKyAqLworY2xhc3MgdF9kb2MgeworCitwdWJsaWM6CisgIHRfZG9jKCkgOiBoYXNfZG9jXyhmYWxzZSkge30KKyAgdmlydHVhbCB+dF9kb2MoKSB7fQorCisgIHZvaWQgc2V0X2RvYyhjb25zdCBzdGQ6OnN0cmluZyYgZG9jKSB7CisgICAgZG9jXyA9IGRvYzsKKyAgICBoYXNfZG9jXyA9IHRydWU7CisgICAgaWYgKChnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPT0gZ19kb2N0ZXh0X2xpbmVubykKKyAgICAgICAgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKKyAgICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBBTFJFQURZX1BST0NFU1NFRCIpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfZG9jKCkgY29uc3QgeyByZXR1cm4gZG9jXzsgfQorCisgIGJvb2wgaGFzX2RvYygpIHsgcmV0dXJuIGhhc19kb2NfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGRvY187CisgIGJvb2wgaGFzX2RvY187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMzc4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9FTlVNX0gKKyNkZWZpbmUgVF9FTlVNX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCisgKgorICovCitjbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9lbnVtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSkge30KKworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQorCisgIHZvaWQgYXBwZW5kKHRfZW51bV92YWx1ZSogY29uc3RhbnQpIHsgY29uc3RhbnRzXy5wdXNoX2JhY2soY29uc3RhbnQpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGdldF9jb25zdGFudHMoKSBjb25zdCB7IHJldHVybiBjb25zdGFudHNfOyB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgIHJldHVybiAqY19pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID09IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAqY19pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X21pbl92YWx1ZSgpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICB0X2VudW1fdmFsdWUqIG1pbl92YWx1ZTsKKyAgICBpZiAoZW51bV92YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIG1pbl92YWx1ZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBtaW5fdmFsdWVfdmFsdWU7CisgICAgICBtaW5fdmFsdWUgPSBlbnVtX3ZhbHVlcy5mcm9udCgpOworICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8IG1pbl92YWx1ZV92YWx1ZSkgeworICAgICAgICAgIG1pbl92YWx1ZSA9ICgqY19pdGVyKTsKKyAgICAgICAgICBtaW5fdmFsdWVfdmFsdWUgPSBtaW5fdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtaW5fdmFsdWU7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9tYXhfdmFsdWUoKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgdF9lbnVtX3ZhbHVlKiBtYXhfdmFsdWU7CisgICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICBtYXhfdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbWF4X3ZhbHVlX3ZhbHVlOworICAgICAgbWF4X3ZhbHVlID0gZW51bV92YWx1ZXMuYmFjaygpOworICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA+IG1heF92YWx1ZV92YWx1ZSkgeworICAgICAgICAgIG1heF92YWx1ZSA9ICgqY19pdGVyKTsKKyAgICAgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXhfdmFsdWU7CisgIH0KKworICBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50c187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiZjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0VOVU1fVkFMVUVfSAorI2RlZmluZSBUX0VOVU1fVkFMVUVfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBBIGNvbnN0YW50LiBUaGVzZSBhcmUgdXNlZCBpbnNpZGUgb2YgZW51bSBkZWZpbml0aW9ucy4gQ29uc3RhbnRzIGFyZSBqdXN0CisgKiBzeW1ib2wgaWRlbnRpZmllcnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGV4cGxpY2l0IHZhbHVlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlbS4KKyAqCisgKi8KK2NsYXNzIHRfZW51bV92YWx1ZSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIDogbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworICB+dF9lbnVtX3ZhbHVlKCkge30KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIGludCBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludCB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWYxZjgwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GSUVMRF9ICisjZGVmaW5lIFRfRklFTERfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycworY2xhc3MgdF9zdHJ1Y3Q7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKKyAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgorICoKKyAqLworY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oMCksCisgICAgICB2YWx1ZV8oTlVMTCksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oa2V5KSwKKyAgICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCisgICAgICB2YWx1ZV8oTlVMTCksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgfnRfZmllbGQoKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSB7IHJldHVybiB0eXBlXzsgfQorCisgIGNvbnN0IHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgaW50MzJfdCBnZXRfa2V5KCkgY29uc3QgeyByZXR1cm4ga2V5XzsgfQorCisgIGVudW0gZV9yZXEgeyBUX1JFUVVJUkVELCBUX09QVElPTkFMLCBUX09QVF9JTl9SRVFfT1VUIH07CisKKyAgdm9pZCBzZXRfcmVxKGVfcmVxIHJlcSkgeyByZXFfID0gcmVxOyB9CisKKyAgZV9yZXEgZ2V0X3JlcSgpIGNvbnN0IHsgcmV0dXJuIHJlcV87IH0KKworICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorCisgIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIGNvbnN0IHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIHZvaWQgc2V0X3hzZF9vcHRpb25hbChib29sIHhzZF9vcHRpb25hbCkgeyB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOyB9CisKKyAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgeyByZXR1cm4geHNkX29wdGlvbmFsXzsgfQorCisgIHZvaWQgc2V0X3hzZF9uaWxsYWJsZShib29sIHhzZF9uaWxsYWJsZSkgeyB4c2RfbmlsbGFibGVfID0geHNkX25pbGxhYmxlOyB9CisKKyAgYm9vbCBnZXRfeHNkX25pbGxhYmxlKCkgY29uc3QgeyByZXR1cm4geHNkX25pbGxhYmxlXzsgfQorCisgIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7IHhzZF9hdHRyc18gPSB4c2RfYXR0cnM7IH0KKworICB0X3N0cnVjdCogZ2V0X3hzZF9hdHRycygpIHsgcmV0dXJuIHhzZF9hdHRyc187IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgorICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCisgICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KKyAgICovCisgIHN0cnVjdCBrZXlfY29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QqIGNvbnN0JiBhLCB0X2ZpZWxkIGNvbnN0KiBjb25zdCYgYikgeworICAgICAgcmV0dXJuIGEtPmdldF9rZXkoKSA8IGItPmdldF9rZXkoKTsKKyAgICB9CisgIH07CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKKyAgYm9vbCBnZXRfcmVmZXJlbmNlKCkgeyByZXR1cm4gcmVmZXJlbmNlXzsgfQorCisgIHZvaWQgc2V0X3JlZmVyZW5jZShib29sIHJlZmVyZW5jZSkgeyByZWZlcmVuY2VfID0gcmVmZXJlbmNlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBpbnQzMl90IGtleV87CisgIGVfcmVxIHJlcV87CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKKworICBib29sIHhzZF9vcHRpb25hbF87CisgIGJvb2wgeHNkX25pbGxhYmxlXzsKKyAgdF9zdHJ1Y3QqIHhzZF9hdHRyc187CisgIGJvb2wgcmVmZXJlbmNlXzsKK307CisKKy8qKgorICogQSBzaW1wbGUgc3RydWN0IGZvciB0aGUgcGFyc2VyIHRvIHVzZSB0byBzdG9yZSBhIGZpZWxkIElELCBhbmQgd2hldGhlciBvcgorICogbm90IGl0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgb3IgYXV0b21hdGljYWxseSBjaG9zZW4uCisgKi8KK3N0cnVjdCB0X2ZpZWxkX2lkIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgYm9vbCBhdXRvX2Fzc2lnbmVkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkMjYwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GVU5DVElPTl9ICisjZGVmaW5lIFRfRlVOQ1RJT05fSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZ1bmN0aW9uLiBLZXkgcGFydHMgYXJlIHJldHVybiB0eXBlLCBmdW5jdGlvbiBuYW1lLAorICogb3B0aW9uYWwgbW9kaWZpZXJzLCBhbmQgYW4gYXJndW1lbnQgbGlzdCwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYSB0aHJpZnQKKyAqIHN0cnVjdC4KKyAqCisgKi8KK2NsYXNzIHRfZnVuY3Rpb24gOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9zdHJ1Y3QqIGFyZ2xpc3QsIGJvb2wgb25ld2F5ID0gZmFsc2UpCisgICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAgYXJnbGlzdF8oYXJnbGlzdCksCisgICAgICB4Y2VwdGlvbnNfKG5ldyB0X3N0cnVjdChOVUxMKSksCisgICAgICBvd25feGNlcHRpb25zXyh0cnVlKSwKKyAgICAgIG9uZXdheV8ob25ld2F5KSB7CisgICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgeworICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOworICAgIH0KKyAgfQorCisgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCisgICAgICAgICAgICAgdF9zdHJ1Y3QqIHhjZXB0aW9ucywKKyAgICAgICAgICAgICBib29sIG9uZXdheSA9IGZhbHNlKQorICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAorICAgICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAorICAgICAgb3duX3hjZXB0aW9uc18oZmFsc2UpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKKyAgICBpZiAob25ld2F5XyAmJiAheGNlcHRpb25zXy0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT25ld2F5IG1ldGhvZHMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4iKTsKKyAgICB9CisgICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgeworICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOworICAgIH0KKyAgfQorCisgIH50X2Z1bmN0aW9uKCkgeworICAgIGlmIChvd25feGNlcHRpb25zXykKKyAgICAgIGRlbGV0ZSB4Y2VwdGlvbnNfOworICB9CisKKyAgdF90eXBlKiBnZXRfcmV0dXJudHlwZSgpIGNvbnN0IHsgcmV0dXJuIHJldHVybnR5cGVfOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB0X3N0cnVjdCogZ2V0X2FyZ2xpc3QoKSBjb25zdCB7IHJldHVybiBhcmdsaXN0XzsgfQorCisgIHRfc3RydWN0KiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQorCisgIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgeyByZXR1cm4gb25ld2F5XzsgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcml2YXRlOgorICB0X3R5cGUqIHJldHVybnR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOworICB0X3N0cnVjdCogeGNlcHRpb25zXzsKKyAgYm9vbCBvd25feGNlcHRpb25zXzsKKyAgYm9vbCBvbmV3YXlfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjY4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9MSVNUX0gKKyNkZWZpbmUgVF9MSVNUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfbGlzdCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KKworICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9CisKKyAgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGVsZW1fdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2YwODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX01BUF9ICisjZGVmaW5lIFRfTUFQX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgbWFwIGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgdHdvIGRhdGEKKyAqIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9tYXAgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6IGtleV90eXBlXyhrZXlfdHlwZSksIHZhbF90eXBlXyh2YWxfdHlwZSkge30KKworICB0X3R5cGUqIGdldF9rZXlfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGtleV90eXBlXzsgfQorCisgIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgeyByZXR1cm4gdmFsX3R5cGVfOyB9CisKKyAgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSoga2V5X3R5cGVfOworICB0X3R5cGUqIHZhbF90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RkNDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BST0dSQU1fSAorI2RlZmluZSBUX1BST0dSQU1fSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEZvciBwcm9ncmFtX25hbWUoKQorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X21hcC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NldC5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgorLy8jaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogVG9wIGxldmVsIGNsYXNzIHJlcHJlc2VudGluZyBhbiBlbnRpcmUgdGhyaWZ0IHByb2dyYW0uIEEgcHJvZ3JhbSBjb25zaXN0cworICogZnVuZGFtZW50YWxseSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgVHlwZWRlZnMKKyAqICAgRW51bWVyYXRpb25zCisgKiAgIENvbnN0YW50cworICogICBTdHJ1Y3RzCisgKiAgIEV4Y2VwdGlvbnMKKyAqICAgU2VydmljZXMKKyAqCisgKiBUaGUgcHJvZ3JhbSBtb2R1bGUgYWxzbyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGJhc2UgdHlwZXMuCisgKgorICovCitjbGFzcyB0X3Byb2dyYW0gOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgbmFtZSkKKyAgICA6IHBhdGhfKHBhdGgpLCBuYW1lXyhuYW1lKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpLCBzY29wZV8obmV3IHRfc2NvcGUpIHt9CisKKyAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDogcGF0aF8ocGF0aCksIG91dF9wYXRoXygiLi8iKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7CisgICAgbmFtZV8gPSBwcm9ncmFtX25hbWUocGF0aCk7CisgICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKKyAgfQorCisgIH50X3Byb2dyYW0oKSB7CisgICAgaWYgKHNjb3BlXykgeworICAgICAgZGVsZXRlIHNjb3BlXzsKKyAgICAgIHNjb3BlXyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLy8gUGF0aCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3BhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorCisgIC8vIE91dHB1dCBwYXRoIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfb3V0X3BhdGgoKSBjb25zdCB7IHJldHVybiBvdXRfcGF0aF87IH0KKworICAvLyBDcmVhdGUgZ2VuLSogZGlyIGFjY2Vzc29yCisgIGJvb2wgaXNfb3V0X3BhdGhfYWJzb2x1dGUoKSBjb25zdCB7IHJldHVybiBvdXRfcGF0aF9pc19hYnNvbHV0ZV87IH0KKworICAvLyBOYW1lIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgLy8gTmFtZXNwYWNlCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbmFtZXNwYWNlXzsgfQorCisgIC8vIEluY2x1ZGUgcHJlZml4IGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfaW5jbHVkZV9wcmVmaXgoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlX3ByZWZpeF87IH0KKworICAvLyBBY2Nlc3NvcnMgZm9yIHByb2dyYW0gZWxlbWVudHMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4mIGdldF90eXBlZGVmcygpIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgZ2V0X2VudW1zKCkgY29uc3QgeyByZXR1cm4gZW51bXNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgZ2V0X2NvbnN0cygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X3N0cnVjdHMoKSBjb25zdCB7IHJldHVybiBzdHJ1Y3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfb2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIG9iamVjdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBnZXRfc2VydmljZXMoKSBjb25zdCB7IHJldHVybiBzZXJ2aWNlc187IH0KKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X25hbWVzcGFjZXMoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VzXzsgfQorCisgIC8vIFByb2dyYW0gZWxlbWVudHMKKyAgdm9pZCBhZGRfdHlwZWRlZih0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyB9CisgIHZvaWQgYWRkX2VudW0odF9lbnVtKiB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgfQorICB2b2lkIGFkZF9jb25zdCh0X2NvbnN0KiB0YykgeyBjb25zdHNfLnB1c2hfYmFjayh0Yyk7IH0KKyAgdm9pZCBhZGRfc3RydWN0KHRfc3RydWN0KiB0cykgeworICAgIG9iamVjdHNfLnB1c2hfYmFjayh0cyk7CisgICAgc3RydWN0c18ucHVzaF9iYWNrKHRzKTsKKyAgfQorICB2b2lkIGFkZF94Y2VwdGlvbih0X3N0cnVjdCogdHgpIHsKKyAgICBvYmplY3RzXy5wdXNoX2JhY2sodHgpOworICAgIHhjZXB0aW9uc18ucHVzaF9iYWNrKHR4KTsKKyAgfQorICB2b2lkIGFkZF9zZXJ2aWNlKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7IH0KKworICAvLyBQcm9ncmFtcyB0byBpbmNsdWRlCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9vdXRfcGF0aChzdGQ6OnN0cmluZyBvdXRfcGF0aCwgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSkgeworICAgIG91dF9wYXRoXyA9IG91dF9wYXRoOworICAgIG91dF9wYXRoX2lzX2Fic29sdXRlXyA9IG91dF9wYXRoX2lzX2Fic29sdXRlOworICAgIC8vIEVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBhIHRyYWlsaW5nICcvJyAob3IgJ1wnIGZvciB3aW5kb3dzIG1hY2hpbmVzKQorICAgIGNoYXIgYyA9IG91dF9wYXRoXy5hdChvdXRfcGF0aF8uc2l6ZSgpIC0gMSk7CisgICAgaWYgKCEoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSkgeworICAgICAgb3V0X3BhdGhfLnB1c2hfYmFjaygnLycpOworICAgIH0KKyAgfQorCisgIC8vIFR5cGVuYW1lIGNvbGxpc2lvbiBkZXRlY3Rpb24KKyAgLyoqCisgICAqIFNlYXJjaCBmb3IgdHlwZW5hbWUgY29sbGlzaW9ucworICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjZXJ0YWluIGNvbGxpc2lvbiB3YXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc191bmlxdWVfdHlwZW5hbWUodF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0aGlzLCB0KTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdCA9IGluY2x1ZGVzXy5iZWdpbigpOyBpdCAhPSBpbmNsdWRlc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIG9jY3VycmVuY2VzICs9IHByb2dyYW1fdHlwZW5hbWVfY291bnQoKml0LCB0KTsKKyAgICB9CisgICAgcmV0dXJuIDAgPT0gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGFsbCB0eXBlIGNvbGxlY3Rpb25zIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICBpbnQgcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0qIHByb2csIHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IDA7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT50eXBlZGVmc18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+ZW51bXNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPm9iamVjdHNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnNlcnZpY2VzXywgdCk7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIFNlYXJjaCBhIHR5cGUgY29sbGVjdGlvbiBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcworICAgKiBAcGFyYW0gcHJvZyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdHlwZV9jb2xsZWN0aW9uIHRoZSB0eXBlIGNvbGxlY3Rpb24gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0ICAgICAgICAgICAgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgaW50IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQodF9wcm9ncmFtKiBwcm9nLCBUIHR5cGVfY29sbGVjdGlvbiwgdF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gMDsKKyAgICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGl0ID0gdHlwZV9jb2xsZWN0aW9uLmJlZ2luKCk7IGl0ICE9IHR5cGVfY29sbGVjdGlvbi5lbmQoKTsgKytpdCkKKyAgICAgIGlmICh0ICE9ICppdCAmJiAwID09IHQtPmdldF9uYW1lKCkuY29tcGFyZSgoKml0KS0+Z2V0X25hbWUoKSkgJiYgaXNfY29tbW9uX25hbWVzcGFjZShwcm9nLCB0KSkKKyAgICAgICAgKytvY2N1cnJlbmNlczsKKyAgICByZXR1cm4gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaWRlbnRpY2FsIHR5cGVuYW1lcyB3aWxsIGNvbGxpZGUgYmFzZWQgb24gbmFtZXNwYWNlcy4KKyAgICoKKyAgICogQmVjYXVzZSB3ZSBkbyBub3Qga25vdyB3aGljaCBsYW5ndWFnZXMgdGhlIHVzZXIgd2lsbCBnZW5lcmF0ZSBjb2RlIGZvciwKKyAgICogY29sbGlzaW9ucyB3aXRoaW4gcHJvZ3JhbXMgKElETCBmaWxlcykgaGF2aW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgY2FuIGJlCisgICAqIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUuIE9ubHkgZ3VhcmFudGVlZCBjb2xsaXNpb25zIHJldHVybiB0cnVlIChjYXVzZSBhbiBlcnJvcikuCisgICAqIFBvc3NpYmxlIGNvbGxpc2lvbnMgaW52b2x2aW5nIGV4cGxpY2l0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgcHJvZHVjZSBhIHdhcm5pbmcuCisgICAqIE90aGVyIHBvc3NpYmxlIGNvbGxpc2lvbnMgZ28gdW5yZXBvcnRlZC4KKyAgICogQHBhcmFtIHByb2cgdGhlIHByb2dyYW0gY29udGFpbmluZyB0aGUgcHJlZXhpc3RpbmcgdHlwZW5hbWUKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgY29udGFpbmluZyB0aGUgdHlwZW5hbWUgbWF0Y2gKKyAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBhIGNvbGxpc2lvbiB3aXRoaW4gbmFtZXNwYWNlcyBpcyBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBib29sIGlzX2NvbW1vbl9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9nLCB0X3R5cGUqIHQpIHsKKyAgICAvLyBDYXNlIDE6IFR5cGVuYW1lcyBhcmUgaW4gdGhlIHNhbWUgcHJvZ3JhbSBbY29sbGlzaW9uXQorICAgIGlmIChwcm9nID09IHQtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIiwKKyAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYXNlIDI6IEJvdGggcHJvZ3JhbXMgaGF2ZSBpZGVudGljYWwgbmFtZXNwYWNlIHNjb3BlL25hbWUgZGVjbGFyYXRpb25zIFtjb2xsaXNpb25dCisgICAgYm9vbCBtYXRjaCA9IHRydWU7CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHByb2ctPm5hbWVzcGFjZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBwcm9nLT5uYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZSh0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZShwcm9nLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKDAgPT0gcHJvZy0+bmFtZXNwYWNlc18uc2l6ZSgpICYmIDAgPT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uc2l6ZSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyBhbmQgJXMiLAorICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoOworICB9CisKKyAgLy8gU2NvcGluZyBhbmQgbmFtZXNwYWNpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgbmFtZXNwYWNlXyA9IG5hbWU7IH0KKworICAvLyBTY29wZSBhY2Nlc3NvcgorICB0X3Njb3BlKiBzY29wZSgpIGNvbnN0IHsgcmV0dXJuIHNjb3BlXzsgfQorCisgIC8vIEluY2x1ZGVzCisKKyAgdm9pZCBhZGRfaW5jbHVkZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOworICB9CisKKyAgdm9pZCBhZGRfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBpbmNsdWRlX3NpdGUpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgpOworCisgICAgLy8gaW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc2l0ZSBhdCB3aGljaCBpdCB3YXMgaW5jbHVkZWQKKyAgICAvLyAobWludXMgdGhlIGZpbGVuYW1lKQorICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfc2l0ZS5yZmluZCgiLyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbmNsdWRlX3NpdGUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOworICAgIH0KKworICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7CisgICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9pbmNsdWRlX3ByZWZpeChzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeCkgeworICAgIGluY2x1ZGVfcHJlZml4XyA9IGluY2x1ZGVfcHJlZml4OworCisgICAgLy8gdGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIGRpcmVjdG9yeTsgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVjZXNzYXJ5CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSBpbmNsdWRlX3ByZWZpeF8uc2l6ZSgpOworICAgIGlmIChsZW4gPiAwICYmIGluY2x1ZGVfcHJlZml4X1tsZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4XyArPSAnLyc7CisgICAgfQorICB9CisKKyAgLy8gTGFuZ3VhZ2UgbmV1dHJhbCBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6OnN0cmluZyBuYW1lX3NwYWNlKSB7CisgICAgaWYgKGxhbmd1YWdlICE9ICIqIikgeworICAgICAgc2l6ZV90IHN1Yl9pbmRleCA9IGxhbmd1YWdlLmZpbmQoJy4nKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zdWJzdHIoMCwgc3ViX2luZGV4KTsKKyAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2U7CisKKyAgICAgIGlmIChiYXNlX2xhbmd1YWdlID09ICJzbWFsbHRhbGsiKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJOYW1lc3BhY2UgJ3NtYWxsdGFsaycgaXMgZGVwcmVjYXRlZC4gVXNlICdzdCcgaW5zdGVhZCIpOworICAgICAgICBiYXNlX2xhbmd1YWdlID0gInN0IjsKKyAgICAgIH0KKworICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBteV9jb3B5ID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisKKyAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0OworICAgICAgaXQgPSBteV9jb3B5LmZpbmQoYmFzZV9sYW5ndWFnZSk7CisKKyAgICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSAiTm8gZ2VuZXJhdG9yIG5hbWVkICciICsgYmFzZV9sYW5ndWFnZSArICInIGNvdWxkIGJlIGZvdW5kISI7CisgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3ViX2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZSA9IGxhbmd1YWdlLnN1YnN0cihzdWJfaW5kZXggKyAxKTsKKyAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9IGJhc2VfbGFuZ3VhZ2UgKyAiIGdlbmVyYXRvciBkb2VzIG5vdCBhY2NlcHQgJyIgKyBzdWJfbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhcyBzdWItbmFtZXNwYWNlISI7CisgICAgICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKGxhbmd1YWdlKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkKKyAgICAgICAgfHwgKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKCIqIikpICE9IG5hbWVzcGFjZXNfLmVuZCgpKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9hbGxfbmFtZXNwYWNlcygpeworICAgICByZXR1cm4gbmFtZXNwYWNlc187CisgIH0KKworICB2b2lkIHNldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpIHsKKyAgICBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXSA9IGFubm90YXRpb25zOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhzdGQ6OnN0cmluZyBsYW5ndWFnZSkgeworICAgIHJldHVybiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXTsKKyAgfQorCisgIC8vIExhbmd1YWdlIHNwZWNpZmljIG5hbWVzcGFjZSAvIHBhY2thZ2luZworCisgIHZvaWQgYWRkX2NwcF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSB7IHJldHVybiBjcHBfaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY19pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY19pbmNsdWRlcygpIHsgcmV0dXJuIGNfaW5jbHVkZXNfOyB9CisKK3ByaXZhdGU6CisgIC8vIEZpbGUgcGF0aAorICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICAvLyBOYW1lCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQorICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKKworICAvLyBOYW1lc3BhY2UKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKKworICAvLyBJbmNsdWRlZCBwcm9ncmFtcworICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55CisgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKKworICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQorICB0X3Njb3BlKiBzY29wZV87CisKKyAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgorICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187CisgIHN0ZDo6dmVjdG9yPHRfZW51bSo+IGVudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zXzsKKyAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIER5bmFtaWMgbmFtZXNwYWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG5hbWVzcGFjZXNfOworCisgIC8vIEFubm90YXRpb25zIGZvciBkeW5hbWljIG5hbWVzcGFjZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gPiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfOworCisgIC8vIEMrKyBleHRyYSBpbmNsdWRlcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY3BwX2luY2x1ZGVzXzsKKworICAvLyBDIGV4dHJhIGluY2x1ZGVzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjX2luY2x1ZGVzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NDT1BFX0gKKyNkZWZpbmUgVF9TQ09QRV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiwgVG8mKTsKK30KKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgYSB2YXJpYWJsZSBzY29wZSB1c2VkIGZvciBsb29raW5nIHVwIHByZWRlZmluZWQgdHlwZXMgYW5kCisgKiBzZXJ2aWNlcy4gVHlwaWNhbGx5LCBhIHNjb3BlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRfcHJvZ3JhbS4gU2NvcGVzIGFyZSBub3QKKyAqIHVzZWQgdG8gZGV0ZXJtaW5lIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJhdGhlciB0byByZXNvbHZlIGlkZW50aWZpZXJzIGF0CisgKiBwYXJzZSB0aW1lLgorICoKKyAqLworY2xhc3MgdF9zY29wZSB7CitwdWJsaWM6CisgIHRfc2NvcGUoKSB7fQorCisgIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7IHR5cGVzX1tuYW1lXSA9IHR5cGU7IH0KKworICB0X3R5cGUqIGdldF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHR5cGVzX1tuYW1lXTsgfQorCisgIHZvaWQgYWRkX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSwgdF9zZXJ2aWNlKiBzZXJ2aWNlKSB7IHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7IH0KKworICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHNlcnZpY2VzX1tuYW1lXTsgfQorCisgIHZvaWQgYWRkX2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3QqIGNvbnN0YW50KSB7CisgICAgaWYgKGNvbnN0YW50c18uZmluZChuYW1lKSAhPSBjb25zdGFudHNfLmVuZCgpKSB7CisgICAgICB0aHJvdyAiRW51bSAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkISI7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0YW50c19bbmFtZV0gPSBjb25zdGFudDsKKyAgICB9CisgIH0KKworICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gY29uc3RhbnRzX1tuYW1lXTsgfQorCisgIHZvaWQgcHJpbnQoKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IHR5cGVzXy5iZWdpbigpOyBpdGVyICE9IHR5cGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGYoIiVzID0+ICVzXG4iLCBpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOworICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7CisgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgICB0aHJvdyAiTm8gZmllbGQgbmFtZWQgXCIiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpCisgICAgICAgICAgICAgICsgIlwiIHdhcyBmb3VuZCBpbiBzdHJ1Y3Qgb2YgdHlwZSBcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiIjsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdF92YWwtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgICAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgodF9lbnVtKil0dHlwZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X2NvbnN0KiBjb25zdGFudCA9IGdldF9jb25zdGFudChjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkgeworICAgICAgICAgIHRocm93ICJObyBlbnVtIHZhbHVlIG9yIGNvbnN0YW50IGZvdW5kIG5hbWVkIFwiIiArIGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSArICJcIiEiOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSB0eXBlZGVmcyB0byB0aGUgdW5kZXJseWluZyB0eXBlCisgICAgICAgIHRfdHlwZSogY29uc3RfdHlwZSA9IGNvbnN0YW50LT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgICAgICAgaWYgKGNvbnN0X3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdF90eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfaW50ZWdlcihjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9zdHJpbmcoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9kb3VibGUoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfZG91YmxlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKKyAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9tYXAoKTsKKyAgICAgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbWFwKHZfaXRlci0+Zmlyc3QsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9saXN0KCk7CisgICAgICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9saXN0KCk7CisgICAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX2xpc3QoKnZfaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAvLyBlbnVtIGNvbnN0YW50IHdpdGggbm9uLWlkZW50aWZpZXIgdmFsdWUuIHNldCB0aGUgZW51bSBhbmQgZmluZCB0aGUKKyAgICAgIC8vIHZhbHVlJ3MgbmFtZS4KKyAgICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0dHlwZTsKKyAgICAgIHRfZW51bV92YWx1ZSogZW51bV92YWx1ZSA9IHRlbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhbHN0bTsKKyAgICAgICAgdmFsc3RtIDw8IGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgdGhyb3cgIkNvdWxkbid0IGZpbmQgYSBuYW1lZCB2YWx1ZSBpbiBlbnVtICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZm9yIHZhbHVlICIKKyAgICAgICAgICAgICsgdmFsc3RtLnN0cigpOworICAgICAgfQorICAgICAgY29uc3RfdmFsLT5zZXRfaWRlbnRpZmllcih0ZW51bS0+Z2V0X25hbWUoKSArICIuIiArIGVudW1fdmFsdWUtPmdldF9uYW1lKCkpOworICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSh0ZW51bSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8vIE1hcCBvZiBuYW1lcyB0byB0eXBlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj4gdHlwZXNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBjb25zdGFudHMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBjb25zdGFudHNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBzZXJ2aWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIHRvIGxpc3QgbWFwIGVudHJpZXMKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorICAgIGZyaWVuZCB2b2lkIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoRnJvbSosIFRvJik7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMDRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NFUlZJQ0VfSAorI2RlZmluZSBUX1NFUlZJQ0VfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBBIHNlcnZpY2UgY29uc2lzdHMgb2YgYSBzZXQgb2YgZnVuY3Rpb25zLgorICoKKyAqLworY2xhc3MgdF9zZXJ2aWNlIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfc2VydmljZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pLCBleHRlbmRzXyhOVUxMKSB7fQorCisgIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICB2b2lkIHNldF9leHRlbmRzKHRfc2VydmljZSogZXh0ZW5kcykgeyBleHRlbmRzXyA9IGV4dGVuZHM7IH0KKworICB2b2lkIGFkZF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBmdW5jKSB7CisgICAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGZ1bmN0aW9uc18uYmVnaW4oKTsgaXRlciAhPSBmdW5jdGlvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmIChmdW5jLT5nZXRfbmFtZSgpID09ICgqaXRlciktPmdldF9uYW1lKCkpIHsKKyAgICAgICAgdGhyb3cgIkZ1bmN0aW9uICIgKyBmdW5jLT5nZXRfbmFtZSgpICsgIiBpcyBhbHJlYWR5IGRlZmluZWQiOworICAgICAgfQorICAgIH0KKyAgICBmdW5jdGlvbnNfLnB1c2hfYmFjayhmdW5jKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgZ2V0X2Z1bmN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGZ1bmN0aW9uc187IH0KKworICB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgeyByZXR1cm4gZXh0ZW5kc187IH0KKworICBjb25zdCB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgY29uc3QgeyByZXR1cm4gZXh0ZW5kc187IH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9uc187CisgIHRfc2VydmljZSogZXh0ZW5kc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTNiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NFVF9ICisjZGVmaW5lIFRfU0VUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgc2V0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9zZXQgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X3NldCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KKworICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9CisKKyAgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogZWxlbV90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMmRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NUUlVDVF9ICisjZGVmaW5lIFRfU1RSVUNUX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworLy8gRm9yd2FyZCBkZWNsYXJlIHRoYXQgcHVwcHkKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBBIHN0cnVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBzZXQgb2YgbWVtYmVyIGZpZWxkcyB0aGF0IGhhcyBhIG5hbWUuIFN0cnVjdHMKKyAqIGFyZSBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfc3RydWN0IDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnNfdHlwZTsKKworICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0pCisgICAgOiB0X3R5cGUocHJvZ3JhbSksCisgICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAorICAgICAgaXNfdW5pb25fKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKKyAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQorCisgIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgbmFtZSksCisgICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAorICAgICAgaXNfdW5pb25fKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKKyAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQorCisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBuYW1lXyA9IG5hbWU7CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpOworICB9CisKKyAgdm9pZCBzZXRfeGNlcHRpb24oYm9vbCBpc194Y2VwdGlvbikgeyBpc194Y2VwdGlvbl8gPSBpc194Y2VwdGlvbjsgfQorCisgIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVyKHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpKSB7CisKKyAgICAgIC8vIDEpIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gMikgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBvcHRpb25hbCwgb3RoZXJ3aXNlIGJ1Z3MgbGlrZSBUSFJJRlQtMzY1MCB3YWl0IHRvIGhhcHBlbgorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICAvLyBubyB3YXJuaW5nIG9uIGRlZmF1bHQgcmVxdWlyZWRuZXNzLCBidXQgZG8gd2FybiBvbiBhbnl0aGluZyBlbHNlIHRoYXQgaXMgZXhwbGljaXRseSBhc2tlZCBmb3IKKyAgICAgICAgaWYoZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgICAiVW5pb24gJXMgZmllbGQgJXM6IHVuaW9uIG1lbWJlcnMgbXVzdCBiZSBvcHRpb25hbCwgaWdub3Jpbmcgc3BlY2lmaWVkIHJlcXVpcmVkbmVzcy5cbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZC0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIH0KKworICAgICAgLy8gdW5pb25zIG1heSBoYXZlIHVwIHRvIG9uZSBtZW1iZXIgZGVmYXVsdGVkLCBidXQgbm90IG1vcmUKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBpZiAoMSA8ICsrbWVtYmVyc193aXRoX3ZhbHVlKSB7CisgICAgICAgICAgdGhyb3cgIkVycm9yOiBGaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCkgKyAiIHByb3ZpZGVzIGFub3RoZXIgZGVmYXVsdCB2YWx1ZSBmb3IgdW5pb24gIgorICAgICAgICAgICAgICArIG5hbWVfOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCkgeworICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSAmJiAoIW1lbWJlcnNfdmFsaWRhdGVkKSkgeworICAgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKCptX2l0ZXIpOworICAgICAgfQorICAgICAgbWVtYmVyc192YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0X3VuaW9uKGJvb2wgaXNfdW5pb24pIHsKKyAgICBpc191bmlvbl8gPSBpc191bmlvbjsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7CisgIH0KKworICB2b2lkIHNldF94c2RfYWxsKGJvb2wgeHNkX2FsbCkgeyB4c2RfYWxsXyA9IHhzZF9hbGw7IH0KKworICBib29sIGdldF94c2RfYWxsKCkgY29uc3QgeyByZXR1cm4geHNkX2FsbF87IH0KKworICBib29sIGFwcGVuZCh0X2ZpZWxkKiBlbGVtKSB7CisgICAgdHlwZWRlZiBtZW1iZXJzX3R5cGU6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKKyAgICBzdGQ6OnBhaXI8aXRlcl90eXBlLCBpdGVyX3R5cGU+IGJvdW5kcyA9IHN0ZDo6ZXF1YWxfcmFuZ2UobWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOworICAgIGlmIChib3VuZHMuZmlyc3QgIT0gYm91bmRzLnNlY29uZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyByZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCBvZiBmaWVsZCBuYW1lcworICAgIGlmIChnZXRfZmllbGRfYnlfbmFtZShlbGVtLT5nZXRfbmFtZSgpKSAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWJlcnNfLnB1c2hfYmFjayhlbGVtKTsKKyAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5pbnNlcnQoYm91bmRzLnNlY29uZCwgZWxlbSk7CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKGVsZW0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfbWVtYmVycygpIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnNfOyB9CisKKyAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfc29ydGVkX21lbWJlcnMoKSB7IHJldHVybiBtZW1iZXJzX2luX2lkX29yZGVyXzsgfQorCisgIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gIWlzX3hjZXB0aW9uXzsgfQorCisgIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBpc194Y2VwdGlvbl87IH0KKworICBib29sIGlzX3VuaW9uKCkgY29uc3QgeyByZXR1cm4gaXNfdW5pb25fOyB9CisKKyAgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7CisgICAgICAgIHJldHVybiAqbV9pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvbnN0IHRfZmllbGQqIGdldF9maWVsZF9ieV9uYW1lKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIGNvbnN0IHsKKyAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9uYW1lKCkgPT0gZmllbGRfbmFtZSkgeworICAgICAgICByZXR1cm4gKm1faXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworcHJpdmF0ZToKKyAgbWVtYmVyc190eXBlIG1lbWJlcnNfOworICBtZW1iZXJzX3R5cGUgbWVtYmVyc19pbl9pZF9vcmRlcl87CisgIGJvb2wgaXNfeGNlcHRpb25fOworICBib29sIGlzX3VuaW9uXzsKKyAgYm9vbCBtZW1iZXJzX3ZhbGlkYXRlZDsKKyAgaW50IG1lbWJlcnNfd2l0aF92YWx1ZTsKKworICBib29sIHhzZF9hbGxfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmQxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfVFlQRV9ICisjZGVmaW5lIFRfVFlQRV9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBHZW5lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlCisgKiBwYXJzZXIgbW9kdWxlIHRvIGJ1aWxkIHVwIGEgdHJlZSBvZiBvYmplY3QgdGhhdCBhcmUgYWxsIGV4cGxpY2l0bHkgdHlwZWQuCisgKiBUaGUgZ2VuZXJpYyB0X3R5cGUgY2xhc3MgZXhwb3J0cyBhIHZhcmlldHkgb2YgdXNlZnVsIG1ldGhvZHMgdGhhdCBhcmUKKyAqIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJyYW5jaCBiYXNlZCB1cG9uIGRpZmZlcmVudCBoYW5kbGluZyBmb3IgdGhlCisgKiB2YXJpb3VzIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF90eXBlIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+dF90eXBlKCkge30KKworICB2aXJ0dWFsIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgbmFtZV8gPSBuYW1lOyB9CisKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHZpcnR1YWwgYm9vbCBpc192b2lkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpOworICBjb25zdCB0X3R5cGUqIGdldF90cnVlX3R5cGUoKSBjb25zdDsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCisgIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgeworICAgIGlmIChudW0gPCAxMCkgeworICAgICAgcmV0dXJuICcwJyArIG51bTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKKyAgICBzdGQ6OnN0cmluZyBydjsKKyAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7CisgICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3Byb3RlY3RlZDoKKyAgdF90eXBlKCkgOiBwcm9ncmFtXyhOVUxMKSB7IDsgfQorCisgIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogcHJvZ3JhbV8ocHJvZ3JhbSkgeyA7IH0KKworICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKHByb2dyYW0pLCBuYW1lXyhuYW1lKSB7IDsgfQorCisgIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKE5VTEwpLCBuYW1lXyhuYW1lKSB7IDsgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworLyoqCisgKiBQbGFjZWhvbGRlciBzdHJ1Y3QgZm9yIHJldHVybmluZyB0aGUga2V5IGFuZCB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uCisgKiBkdXJpbmcgcGFyc2luZy4KKyAqLworc3RydWN0IHRfYW5ub3RhdGlvbiB7CisgIHN0ZDo6c3RyaW5nIGtleTsKKyAgc3RkOjpzdHJpbmcgdmFsOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZmRiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKwordF90eXBlKiB0X3R5cGVkZWY6OmdldF90eXBlKCkgY29uc3QgeworICBpZiAodHlwZV8gPT0gTlVMTCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF9wcm9ncmFtKCktPnNjb3BlKCktPmdldF90eXBlKHN5bWJvbGljXyk7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJUeXBlIFwiJXNcIiBub3QgZGVmaW5lZFxuIiwgc3ltYm9saWNfLmNfc3RyKCkpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKyAgcmV0dXJuIHR5cGVfOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQzYTUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfVFlQRURFRl9ICisjZGVmaW5lIFRfVFlQRURFRl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQorICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQorICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCisgKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KKyAqCisgKi8KK2NsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3R5cGUqIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYykKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksIHR5cGVfKHR5cGUpLCBzeW1ib2xpY18oc3ltYm9saWMpLCBmb3J3YXJkXyhmYWxzZSkge30KKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgdHlwZSB0aGF0IGlzIGxhemlseQorICAgKiByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUsIGxpa2UgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIG9yCisgICAqIHJlY3Vyc2l2ZSB0eXBlcy4KKyAgICovCisgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYywgYm9vbCBmb3J3YXJkKQorICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwKKyAgICAgIHR5cGVfKE5VTEwpLAorICAgICAgc3ltYm9saWNfKHN5bWJvbGljKSwKKyAgICAgIGZvcndhcmRfKGZvcndhcmQpCisgIHt9CisKKyAgfnRfdHlwZWRlZigpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfc3ltYm9saWMoKSBjb25zdCB7IHJldHVybiBzeW1ib2xpY187IH0KKworICBib29sIGlzX2ZvcndhcmRfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRfOyB9CisKKyAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBzeW1ib2xpY187CisgIGJvb2wgZm9yd2FyZF87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBkZWZpbmUgZm9yIG1rZGlyLHNpbmNlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBpcyBkaWZmZXJlbnQgZm9yIHRoZSBub24tUE9TSVggTWluR1cKKyAqLworCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Vycm5vPgorCisvLyBpZ25vcmUgRUVYSVNULCB0aHJvdyBvbiBhbnkgb3RoZXIgZXJyb3IKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgTUtESVIoeCkgeyBpbnQgciA9IF9ta2Rpcih4KTsgaWYgKHIgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7IHRocm93IChzdGQ6OnN0cmluZyh4KSArICI6ICIpICsgc3RyZXJyb3IoZXJybm8pOyB9IH0KKyNlbHNlCisjZGVmaW5lIE1LRElSKHgpIHsgaW50IHIgPSBta2Rpcih4LCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQorI2VuZGlmCisKKyNpZmRlZiBQQVRIX01BWAorI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggUEFUSF9NQVgKKyNlbHNlCisjZGVmaW5lIFRIUklGVF9QQVRIX01BWCBNQVhfUEFUSAorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0Y2RiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK2lmIFdJVEhfUExVR0lOCitwbHVnaW5fZ2VuID0gcGx1Z2luX3R5cGVzLmggXAorICAgICAgICAgICAgIHBsdWdpbl90eXBlcy5jcHAgXAorICAgICAgICAgICAgIHBsdWdpbl9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgcGx1Z2luX2NvbnN0YW50cy5jcHAKKworQlVJTFRfU09VUkNFUyA9ICQocGx1Z2luX2dlbikKK2dlbi5zdGFtcDogcGx1Z2luLnRocmlmdCAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCUAkKFJNKSAtZiBnZW4udG1wCisJQHRvdWNoIGdlbi50bXAKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcCAtb3V0IC4gJDwKKwlAbXYgLWYgZ2VuLnRtcCAkQAorCiskKHBsdWdpbl9nZW4pOiBnZW4uc3RhbXAKKwlAaWYgdGVzdCAtZiAkQDsgdGhlbiA6OyBlbHNlIFwKKwkkKFJNKSAtZiBnZW4uc3RhbXA7IFwKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBnZW4uc3RhbXA7IFwKKwlmaQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB2ZXJzaW9uLmggd2luZG93cy92ZXJzaW9uLmggJChwbHVnaW5fZ2VuKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS9mb3JfZWFjaC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogY29udmVydF9mb3J3YXJkPGZyb21fdHlwZT4oY29uc3QgZnJvbV90eXBlJiBmcm9tKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgY29udmVydChjb25zdCBmcm9tX3R5cGUmIGZyb20sIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiB0bykKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9VTkFSWV9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogY29udmVydDxmcm9tX3R5cGU+KGNvbnN0IGZyb21fdHlwZSYgZnJvbSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTl9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9VTkFSWV9ERUNMKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9DT01QTEVURShmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSU0lPTl9ERUNMKGZyb21fdHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiB0byA9IGNvbnZlcnRfZm9yd2FyZChmcm9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnZlcnQoZnJvbSwgdG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTihmcm9tX3R5cGUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2b2lkKWZyb207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXcgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUoX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURShmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9ET0MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5fX2lzc2V0LmRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5zZXRfZG9jKGZyb20uZG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQVNTSUdOX0RPQygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLl9faXNzZXQuYW5ub3RhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPmFubm90YXRpb25zXyA9IGZyb20uYW5ub3RhdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8tPnNldF9uYW1lKGZyb20ubWV0YWRhdGEubmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20ubWV0YWRhdGEuX19pc3NldC5kb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+c2V0X2RvYyhmcm9tLm1ldGFkYXRhLmRvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20ubWV0YWRhdGEuX19pc3NldC5hbm5vdGF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+YW5ub3RhdGlvbnNfID0gZnJvbS5tZXRhZGF0YS5hbm5vdGF0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKzo6dF9wcm9ncmFtKiBnX3Byb2dyYW0gPSAwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUz4KK3N0cnVjdCBUeXBlQ2FjaGUgeworICBDKiBvcGVyYXRvcltdKGNvbnN0IGludDY0X3QmIGspIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBDKj46Oml0ZXJhdG9yIGl0ID0gY2FjaGUuZmluZChrKTsKKyAgICBpZiAoaXQgIT0gY2FjaGUuZW5kKCkpIHsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBTPjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gc291cmNlLT5maW5kKGspOworICAgICAgaWYgKGNpdCA9PSBzb3VyY2UtPmVuZCgpKSB7CisgICAgICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJUeXBlIG5vdCBmb3VuZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIChjYWNoZSlba10gPSBjb252ZXJ0X2ZvcndhcmQoY2l0LT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIHZvaWQgY29tcGlsZUFsbCgpIHsKKyAgICBib29zdDo6Zm9yX2VhY2goKnNvdXJjZSB8IGJvb3N0OjphZGFwdG9yczo6bWFwX2tleXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmVHlwZUNhY2hlOjpjb21waWxlLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgfQorCisgIHN0ZDo6bWFwPGludDY0X3QsIFM+IGNvbnN0KiBzb3VyY2U7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBzb3VyY2UgPSBudWxscHRyIDsKKyAgICBjYWNoZS5jbGVhcigpIDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6bWFwPGludDY0X3QsIEMqPiBjYWNoZTsKKworcHJpdmF0ZToKKyAgdm9pZCBjb21waWxlKGNvbnN0IGludDY0X3QmIGspIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBTPjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gc291cmNlLT5maW5kKGspOworICAgIGlmIChjaXQgPT0gc291cmNlLT5lbmQoKSkgeworICAgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgbm90IGZvdW5kICIpOworICAgIH0KKyAgICBjb252ZXJ0KGNpdC0+c2Vjb25kLCAoKnRoaXMpW2tdKTsKKyAgfQorfTsKK3N0ZDo6bWFwPGludDY0X3QsIDo6dF9wcm9ncmFtKj4gZ19wcm9ncmFtX2NhY2hlOworVHlwZUNhY2hlPCA6OnRfdHlwZSwgdF90eXBlPiBnX3R5cGVfY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF9jb25zdCwgdF9jb25zdD4gZ19jb25zdF9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X3NlcnZpY2UsIHRfc2VydmljZT4gZ19zZXJ2aWNlX2NhY2hlOworCit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpIHsKKyAgZ190eXBlX2NhY2hlLmNsZWFyKCk7CisgIGdfY29uc3RfY2FjaGUuY2xlYXIoKTsKKyAgZ19zZXJ2aWNlX2NhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgc2V0X2dsb2JhbF9jYWNoZShjb25zdCBUeXBlUmVnaXN0cnkmIGZyb20pIHsKKyAgZ190eXBlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnR5cGVzOworICBnX2NvbnN0X2NhY2hlLnNvdXJjZSA9ICZmcm9tLmNvbnN0YW50czsKKyAgZ19zZXJ2aWNlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnNlcnZpY2VzOworCisgIGdfdHlwZV9jYWNoZS5jb21waWxlQWxsKCk7CisgIGdfY29uc3RfY2FjaGUuY29tcGlsZUFsbCgpOworICBnX3NlcnZpY2VfY2FjaGUuY29tcGlsZUFsbCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIHJlc29sdmVfdHlwZShpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGdfdHlwZV9jYWNoZVtuYW1lXSk7Cit9CisKKzo6dF9jb25zdCogcmVzb2x2ZV9jb25zdChpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIGdfY29uc3RfY2FjaGVbbmFtZV07Cit9CisKKzo6dF9zZXJ2aWNlKiByZXNvbHZlX3NlcnZpY2UoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiBnX3NlcnZpY2VfY2FjaGVbbmFtZV07Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF9iYXNlX3R5cGUpIHsKKyNkZWZpbmUgVF9CQVNFVFlQRV9DQVNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2Jhc2U6OlRZUEVfIyN0eXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV8jI3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgIDo6dF9iYXNlX3R5cGU6OnRfYmFzZSB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOworICBib29sIGlzX2JpbmFyeSA9IGZhbHNlOworICBzd2l0Y2ggKGZyb20udmFsdWUpIHsKKyAgICBUX0JBU0VUWVBFX0NBU0UoVk9JRCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKFNUUklORyk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEJPT0wpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJOCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEkxNik7CisgICAgVF9CQVNFVFlQRV9DQVNFKEkzMik7CisgICAgVF9CQVNFVFlQRV9DQVNFKEk2NCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKERPVUJMRSk7CisgIGNhc2UgdF9iYXNlOjpUWVBFX0JJTkFSWToKKyAgICB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgaXNfYmluYXJ5ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICA6OnRfYmFzZV90eXBlKiB0byA9IG5ldyA6OnRfYmFzZV90eXBlKGZyb20ubWV0YWRhdGEubmFtZSwgdCk7CisgIHRvLT5zZXRfYmluYXJ5KGlzX2JpbmFyeSk7CisgIHJldHVybiB0bzsKKyN1bmRlZiBUX0JBU0VUWVBFX0NBU0UKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfYmFzZV90eXBlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3R5cGVkZWYpIHsKKyAgOjp0X3R5cGVkZWYqIHRvOworICBpZiAoZnJvbS5mb3J3YXJkKSB7CisgICAgdG8gPSBuZXcgOjp0X3R5cGVkZWYoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0sIGZyb20uc3ltYm9saWMsIHRydWUpOworICB9IGVsc2UgeworICAgIHRvID0gbmV3IDo6dF90eXBlZGVmKGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksIGZyb20uc3ltYm9saWMpOworICB9CisgIHJldHVybiB0bzsKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfdHlwZWRlZikgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW1fdmFsdWUsIGZyb20ubmFtZSwgZnJvbS52YWx1ZSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW0sIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RhbnRzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZW51bV92YWx1ZT4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfZW51bTo6YXBwZW5kLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2xpc3QsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20uZWxlbV90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc2V0LCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmVsZW1fdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X21hcCwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20ua2V5X3R5cGUpLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS52YWxfdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0X3ZhbHVlLCApIHsKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9DQVNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZyb20uX19pc3NldC50eXBlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG8tPnNldF8jI3R5cGUoZnJvbS50eXBlIyNfdmFsKQorCisgIGFzc2VydCh0byk7CisgIGlmIChmcm9tLl9faXNzZXQubWFwX3ZhbCkgeworICAgIHRvLT5zZXRfbWFwKCk7CisgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlLCB0X2NvbnN0X3ZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm1hcF92YWwuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGZyb20ubWFwX3ZhbC5lbmQoKTsgaXQrKykgeworICAgICAgdG8tPmFkZF9tYXAoY29udmVydChpdC0+Zmlyc3QpLCBjb252ZXJ0KGl0LT5zZWNvbmQpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZnJvbS5fX2lzc2V0Lmxpc3RfdmFsKSB7CisgICAgdG8tPnNldF9saXN0KCk7CisgICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20ubGlzdF92YWwgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZjb252ZXJ0PHRfY29uc3RfdmFsdWU+KSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfY29uc3RfdmFsdWU6OmFkZF9saXN0LCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIH0gZWxzZQorICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShzdHJpbmcpOworICBlbHNlIFRfQ09OU1RfVkFMVUVfQ0FTRShpbnRlZ2VyKTsKKyAgZWxzZSBUX0NPTlNUX1ZBTFVFX0NBU0UoZG91YmxlKTsKKyAgZWxzZSBpZiAoZnJvbS5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKSB7CisgICAgdG8tPnNldF9pZGVudGlmaWVyKGZyb20uY29uc3RfaWRlbnRpZmllcl92YWwuaWRlbnRpZmllcl92YWwpIDsKKyAgICB0by0+c2V0X2VudW0ocmVzb2x2ZV90eXBlPCA6OnRfZW51bT4oZnJvbS5jb25zdF9pZGVudGlmaWVyX3ZhbC5lbnVtX3ZhbCkpIDsKKyAgfQorCisjdW5kZWYgVF9DT05TVF9WQUxVRV9DQVNFCit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2ZpZWxkLCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLCBmcm9tLm5hbWUsIGZyb20ua2V5KSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKTsKKyAgdG8tPnNldF9yZWZlcmVuY2UoZnJvbS5yZWZlcmVuY2UpOworICB0by0+c2V0X3JlcShzdGF0aWNfY2FzdDwgOjp0X2ZpZWxkOjplX3JlcT4oZnJvbS5yZXEpKTsKKyAgaWYgKGZyb20uX19pc3NldC52YWx1ZSkgeworICAgIHRvLT5zZXRfdmFsdWUoY29udmVydChmcm9tLnZhbHVlKSk7CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc3RydWN0LCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIHRvLT5zZXRfdW5pb24oZnJvbS5pc191bmlvbik7CisgIHRvLT5zZXRfeGNlcHRpb24oZnJvbS5pc194Y2VwdGlvbik7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLm1lbWJlcnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9maWVsZD4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfc3RydWN0OjphcHBlbmQsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3QsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLAorICAgICAgICAgICAgICAgICAgZnJvbS5uYW1lLAorICAgICAgICAgICAgICAgICAgY29udmVydDx0X2NvbnN0X3ZhbHVlPihmcm9tLnZhbHVlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5yZXR1cm50eXBlKSwKKyAgICAgICAgICAgICAgICAgIGZyb20ubmFtZSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oZnJvbS5hcmdsaXN0KSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oZnJvbS54Y2VwdGlvbnMpLAorICAgICAgICAgICAgICAgICAgZnJvbS5pc19vbmV3YXkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zZXJ2aWNlLCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBhc3NlcnQoZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkKTsKKyAgYXNzZXJ0KGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworCisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmZ1bmN0aW9ucyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2Z1bmN0aW9uPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zZXJ2aWNlOjphZGRfZnVuY3Rpb24sIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKworICBpZiAoZnJvbS5fX2lzc2V0LmV4dGVuZHNfKQorICAgIHRvLT5zZXRfZXh0ZW5kcyhyZXNvbHZlX3NlcnZpY2UoZnJvbS5leHRlbmRzXykpOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfdHlwZSkgeworI2RlZmluZSBUX1RZUEVfQ0FTRV9GV19UKGNhc2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnJvbS5fX2lzc2V0LmNhc2UjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gY29udmVydF9mb3J3YXJkPHR5cGU+KGZyb20uY2FzZSMjX3ZhbCkKKyNkZWZpbmUgVF9UWVBFX0NBU0VfRlcoY2FzZSkgVF9UWVBFX0NBU0VfRldfVChjYXNlLCB0XyMjY2FzZSkKKworICBUX1RZUEVfQ0FTRV9GVyhiYXNlX3R5cGUpOworICBUX1RZUEVfQ0FTRV9GVyh0eXBlZGVmKTsKKyAgVF9UWVBFX0NBU0VfRlcoZW51bSk7CisgIFRfVFlQRV9DQVNFX0ZXKHN0cnVjdCk7CisgIFRfVFlQRV9DQVNFX0ZXX1QoeGNlcHRpb24sIHRfc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfRlcobGlzdCk7CisgIFRfVFlQRV9DQVNFX0ZXKHNldCk7CisgIFRfVFlQRV9DQVNFX0ZXKG1hcCk7CisgIFRfVFlQRV9DQVNFX0ZXKHNlcnZpY2UpOworICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiSW52YWxpZCBkYXRhOiBUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZS4iKTsKKyN1bmRlZiBUX1RZUEVfQ0FTRV9GV19UCisjdW5kZWYgVF9UWVBFX0NBU0VfRlcKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfdHlwZSkgeworI2RlZmluZSBUX1RZUEVfQ0FTRV9UKGNhc2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmIChmcm9tLl9faXNzZXQuY2FzZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29udmVydDx0eXBlLCA6OnR5cGU+KGZyb20uY2FzZSMjX3ZhbCwgcmVpbnRlcnByZXRfY2FzdDwgOjp0eXBlKj4odG8pKQorI2RlZmluZSBUX1RZUEVfQ0FTRShjYXNlKSBUX1RZUEVfQ0FTRV9UKGNhc2UsIHRfIyNjYXNlKQorCisgIGlmIChmYWxzZSkgeworICB9CisgIFRfVFlQRV9DQVNFKGJhc2VfdHlwZSk7CisgIFRfVFlQRV9DQVNFKHR5cGVkZWYpOworICBUX1RZUEVfQ0FTRShlbnVtKTsKKyAgVF9UWVBFX0NBU0Uoc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfVCh4Y2VwdGlvbiwgdF9zdHJ1Y3QpOworICBUX1RZUEVfQ0FTRShsaXN0KTsKKyAgVF9UWVBFX0NBU0Uoc2V0KTsKKyAgVF9UWVBFX0NBU0UobWFwKTsKKyAgVF9UWVBFX0NBU0Uoc2VydmljZSk7CisgIGVsc2UgeworICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJJbnZhbGlkIGRhdGE6IFR5cGUgdW5pb24gaGFzIG5vIHZhbHVlLiIpOworICB9CisjdW5kZWYgVF9UWVBFX0NBU0VfVAorI3VuZGVmIFRfVFlQRV9DQVNFCit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2NvcGUsICkgeworICBhc3NlcnQodG8pOworI2RlZmluZSBUX1NDT1BFX1JFU09MVkUodHlwZSwgbmFtZSwgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubmFtZSMjcy5iZWdpbigpOyBpdCAhPSBmcm9tLm5hbWUjI3MuZW5kKCk7ICAgXAorICAgICAgIGl0KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6dF8jI3R5cGUqIHQgPSByZXNvbHZlXyMjdHlwZSBhKCppdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLT5hZGRfIyNuYW1lKHQtPmdldF9uYW1lKCksIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgIFRfU0NPUEVfUkVTT0xWRSh0eXBlLCB0eXBlLCA8IDo6dF90eXBlPik7CisgIFRfU0NPUEVfUkVTT0xWRShjb25zdCwgY29uc3RhbnQsICk7CisgIFRfU0NPUEVfUkVTT0xWRShzZXJ2aWNlLCBzZXJ2aWNlLCApOworI3VuZGVmIFRfU0NPUEVfUkVTT0xWRQorfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfcHJvZ3JhbSkgeworICA6OnRfcHJvZ3JhbSogdG8gPSBuZXcgOjp0X3Byb2dyYW0oZnJvbS5wYXRoLCBmcm9tLm5hbWUpOworICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5pbmNsdWRlcy5iZWdpbigpOyBpdCAhPSBmcm9tLmluY2x1ZGVzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICB0by0+YWRkX2luY2x1ZGUoY29udmVydF9mb3J3YXJkKCppdCkpOworICB9CisgIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLnByb2dyYW1faWRdID0gdG87CisgIHJldHVybiB0bzsKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfcHJvZ3JhbSkgeworICBhc3NlcnQodG8pOworICBnX3Byb2dyYW0gPSB0bzsKKyAgY29udmVydDx0X3Njb3BlLCA6OnRfc2NvcGU+KGZyb20uc2NvcGUsIHRvLT5zY29wZSgpKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKKworICB0by0+c2V0X291dF9wYXRoKGZyb20ub3V0X3BhdGgsIGZyb20ub3V0X3BhdGhfaXNfYWJzb2x1dGUpOworCisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLnR5cGVkZWZzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV90eXBlPCA6OnRfdHlwZWRlZj4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX3R5cGVkZWYsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uZW51bXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3R5cGU8IDo6dF9lbnVtPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfZW51bSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ub2JqZWN0cy5iZWdpbigpOyBpdCAhPSBmcm9tLm9iamVjdHMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIDo6dF9zdHJ1Y3QqIHQyID0gcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0PigqaXQpOworICAgIGlmICh0Mi0+aXNfeGNlcHRpb24oKSkgeworICAgICAgdG8tPmFkZF94Y2VwdGlvbih0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRvLT5hZGRfc3RydWN0KHQyKTsKKyAgICB9CisgIH0KKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV9jb25zdCksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY29uc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uc2VydmljZXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3NlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX3NlcnZpY2UsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKworICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5pbmNsdWRlcy5iZWdpbigpOyBpdCAhPSBmcm9tLmluY2x1ZGVzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICBjb252ZXJ0KCppdCwgZ19wcm9ncmFtX2NhY2hlW2l0LT5wcm9ncmFtX2lkXSk7CisgIH0KKyAgc3RkOjpmb3JfZWFjaChmcm9tLmNfaW5jbHVkZXMuYmVnaW4oKSwgZnJvbS5jX2luY2x1ZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jX2luY2x1ZGUsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgc3RkOjpmb3JfZWFjaChmcm9tLmNwcF9pbmNsdWRlcy5iZWdpbigpLCBmcm9tLmNwcF9pbmNsdWRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY3BwX2luY2x1ZGUsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubmFtZXNwYWNlcy5iZWdpbigpOworICAgICAgIGl0ICE9IGZyb20ubmFtZXNwYWNlcy5lbmQoKTsgaXQrKykgeworICAgIHRvLT5zZXRfbmFtZXNwYWNlKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgIH0KKworICB0by0+c2V0X2luY2x1ZGVfcHJlZml4KGZyb20uaW5jbHVkZV9wcmVmaXgpOworICB0by0+c2V0X25hbWVzcGFjZShmcm9tLm5hbWVzcGFjZV8pOworfQorCitpbnQgR2VuZXJhdG9yUGx1Z2luOjpleGVjKGludCwgY2hhciogW10pIHsKKyNpZmRlZiBfV0lOMzIKKyAgX3NldG1vZGUoZmlsZW5vKHN0ZGluKSwgX09fQklOQVJZKTsKKyNlbmRpZgorICBzdGQ6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAorICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQoc3RkOjptYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhzdGRpbikpKSk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90byh0cmFuc3BvcnQpOworICBHZW5lcmF0b3JJbnB1dCBpbnB1dDsKKyAgdHJ5IHsKKyAgICBpbnB1dC5yZWFkKCZwcm90byk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlcnIpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIHdoaWxlIHJlY2VpdmluZyBwbHVnaW4gZGF0YTogIiA8PCBlcnIud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW5pdEdsb2JhbHMoKTsKKyAgOjp0X3Byb2dyYW0qIHAgPSBnX3Byb2dyYW0gPSBjb252ZXJ0X2ZvcndhcmQoaW5wdXQucHJvZ3JhbSk7CisgIHNldF9nbG9iYWxfY2FjaGUoaW5wdXQudHlwZV9yZWdpc3RyeSk7CisgIGNvbnZlcnQoaW5wdXQucHJvZ3JhbSwgcCk7CisKKyAgaW50IHJldCA9IGdlbmVyYXRlKHAsIGlucHV0LnBhcnNlZF9vcHRpb25zKTsKKyAgY2xlYXJHbG9iYWxzKCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgY29uc3RfdmFsdWVfY2FzZShjb25zdCB0X2NvbnN0X3ZhbHVlJiB2KSB7CisgIGlmICh2Ll9faXNzZXQubWFwX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA7CisgIGlmICh2Ll9faXNzZXQubGlzdF92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDsKKyAgaWYgKHYuX19pc3NldC5zdHJpbmdfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzsKKyAgaWYgKHYuX19pc3NldC5pbnRlZ2VyX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOworICBpZiAodi5fX2lzc2V0LmRvdWJsZV92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOworICBpZiAodi5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI7CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJVbmtub3duIGNvbnN0IHZhbHVlIHR5cGUiKTsKK30KKworYm9vbCB0X2NvbnN0X3ZhbHVlOjpvcGVyYXRvcjwoY29uc3QgdF9jb25zdF92YWx1ZSYgdGhhdCkgY29uc3QgeworICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MSA9IGNvbnN0X3ZhbHVlX2Nhc2UoKnRoaXMpOworICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MiA9IGNvbnN0X3ZhbHVlX2Nhc2UodGhhdCk7CisgIGlmICh0MSAhPSB0MikKKyAgICByZXR1cm4gdDEgPCB0MjsKKyAgc3dpdGNoICh0MSkgeworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICByZXR1cm4gaW50ZWdlcl92YWwgPCB0aGF0LmludGVnZXJfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIHJldHVybiBkb3VibGVfdmFsIDwgdGhhdC5kb3VibGVfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHJldHVybiBzdHJpbmdfdmFsIDwgdGhhdC5zdHJpbmdfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIGlmICh0aGF0Lm1hcF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChtYXBfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbWFwX3ZhbC5iZWdpbigpLT5maXJzdCA8IHRoYXQubWFwX3ZhbC5iZWdpbigpLT5maXJzdDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgaWYgKHRoYXQubGlzdF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChsaXN0X3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGxpc3RfdmFsLmZyb250KCkgPCB0aGF0Lmxpc3RfdmFsLmZyb250KCk7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIHJldHVybiBpbnRlZ2VyX3ZhbCA8IHRoYXQuaW50ZWdlcl92YWw7CisgIH0KKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlVua25vd24gY29uc3QgdmFsdWUgdHlwZSIpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1BMVUdJTl9ICisjZGVmaW5lIFRfUExVR0lOX1BMVUdJTl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvVGhyaWZ0LmgiCisKK2NsYXNzIHRfcHJvZ3JhbTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCitzdHJ1Y3QgVGhyaWZ0UGx1Z2luRXJyb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworICBUaHJpZnRQbHVnaW5FcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1zZykge30KK307CisKK2NsYXNzIEdlbmVyYXRvclBsdWdpbiB7CitwdWJsaWM6CisgIGludCBleGVjKGludCBhcmdjLCBjaGFyKiBhcmd2W10pOworICB2aXJ0dWFsIGludCBnZW5lcmF0ZSg6OnRfcHJvZ3JhbSosIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mKSA9IDA7Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5OGY5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBhczMgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgY3BwIGFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgY3NoYXJwIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBkIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBkZWxwaGkgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGVybCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgZ28gdGhyaWZ0CituYW1lc3BhY2UgaGF4ZSBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBocyBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgamF2YSBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBvY2FtbCBUaHJpZnQKK25hbWVzcGFjZSBwZXJsIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBwaHAgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIHB5IHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSByYiBUaHJpZnQKKwordHlwZWRlZiBpNjQgdF9wcm9ncmFtX2lkCit0eXBlZGVmIGk2NCB0X3R5cGVfaWQKK3R5cGVkZWYgaTY0IHRfY29uc3RfaWQKK3R5cGVkZWYgaTY0IHRfc2VydmljZV9pZAorCitlbnVtIHRfYmFzZSB7CisgICAgVFlQRV9WT0lECisgICAgVFlQRV9TVFJJTkcKKyAgICBUWVBFX0JPT0wKKyAgICBUWVBFX0k4CisgICAgVFlQRV9JMTYKKyAgICBUWVBFX0kzMgorICAgIFRZUEVfSTY0CisgICAgVFlQRV9ET1VCTEUKKyAgICBUWVBFX0JJTkFSWQorfQorCitzdHJ1Y3QgVHlwZU1ldGFkYXRhIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF9wcm9ncmFtX2lkIHByb2dyYW1faWQKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CisKK3N0cnVjdCB0X2Jhc2VfdHlwZSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCB0X2Jhc2UgdmFsdWUKK30KKworc3RydWN0IHRfbGlzdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGVsZW1fdHlwZQorfQorCitzdHJ1Y3QgdF9zZXQgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbGVtX3R5cGUKK30KKworc3RydWN0IHRfbWFwIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQga2V5X3R5cGUKKyAgNDogcmVxdWlyZWQgdF90eXBlX2lkIHZhbF90eXBlCit9CisKK3N0cnVjdCB0X3R5cGVkZWYgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgc3RyaW5nIHN5bWJvbGljCisgIDQ6IHJlcXVpcmVkIGJvb2wgZm9yd2FyZAorfQorCitzdHJ1Y3QgdF9lbnVtX3ZhbHVlIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgaTMyIHZhbHVlCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfZW51bSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZW51bV92YWx1ZT4gY29uc3RhbnRzCit9CisKK2VudW0gUmVxdWlyZWRuZXNzIHsKKyAgVF9SRVFVSVJFRCA9IDAKKyAgVF9PUFRJT05BTCA9IDEKKyAgVF9PUFRfSU5fUkVRX09VVCA9IDIKK30KKworc3RydWN0IHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZGVudGlmaWVyX3ZhbAorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgZW51bV92YWwKK30KKwordW5pb24gdF9jb25zdF92YWx1ZSB7CisgIDE6IG9wdGlvbmFsIG1hcDx0X2NvbnN0X3ZhbHVlLCB0X2NvbnN0X3ZhbHVlPiBtYXBfdmFsCisgIDI6IG9wdGlvbmFsIGxpc3Q8dF9jb25zdF92YWx1ZT4gbGlzdF92YWwKKyAgMzogb3B0aW9uYWwgc3RyaW5nIHN0cmluZ192YWwKKyAgNDogb3B0aW9uYWwgaTY0IGludGVnZXJfdmFsCisgIDU6IG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsCisgIDg6IG9wdGlvbmFsIHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSBjb25zdF9pZGVudGlmaWVyX3ZhbAorfQorCitzdHJ1Y3QgdF9jb25zdCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIHRfY29uc3RfdmFsdWUgdmFsdWUKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9maWVsZCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIGkzMiBrZXkKKyAgNDogcmVxdWlyZWQgUmVxdWlyZWRuZXNzIHJlcQorICA1OiBvcHRpb25hbCB0X2NvbnN0X3ZhbHVlIHZhbHVlCisgIDEwOiByZXF1aXJlZCBib29sIHJlZmVyZW5jZQorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X3N0cnVjdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZmllbGQ+IG1lbWJlcnMKKyAgMzogcmVxdWlyZWQgYm9vbCBpc191bmlvbgorICA0OiByZXF1aXJlZCBib29sIGlzX3hjZXB0aW9uCit9CitzdHJ1Y3QgdF9mdW5jdGlvbiB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCByZXR1cm50eXBlCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBhcmdsaXN0CisgIDQ6IHJlcXVpcmVkIHRfdHlwZV9pZCB4Y2VwdGlvbnMKKyAgNTogcmVxdWlyZWQgYm9vbCBpc19vbmV3YXkKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9zZXJ2aWNlIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9mdW5jdGlvbj4gZnVuY3Rpb25zCisgIDM6IG9wdGlvbmFsIHRfc2VydmljZV9pZCBleHRlbmRzXworfQordW5pb24gdF90eXBlIHsKKyAgMTogb3B0aW9uYWwgdF9iYXNlX3R5cGUgYmFzZV90eXBlX3ZhbAorICAyOiBvcHRpb25hbCB0X3R5cGVkZWYgdHlwZWRlZl92YWwKKyAgMzogb3B0aW9uYWwgdF9lbnVtIGVudW1fdmFsCisgIDQ6IG9wdGlvbmFsIHRfc3RydWN0IHN0cnVjdF92YWwKKyAgNTogb3B0aW9uYWwgdF9zdHJ1Y3QgeGNlcHRpb25fdmFsCisgIDY6IG9wdGlvbmFsIHRfbGlzdCBsaXN0X3ZhbAorICA3OiBvcHRpb25hbCB0X3NldCBzZXRfdmFsCisgIDg6IG9wdGlvbmFsIHRfbWFwIG1hcF92YWwKKyAgOTogb3B0aW9uYWwgdF9zZXJ2aWNlIHNlcnZpY2VfdmFsCit9CitzdHJ1Y3QgdF9zY29wZSB7CisgIDE6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiB0eXBlcworICAyOiByZXF1aXJlZCBsaXN0PHRfY29uc3RfaWQ+IGNvbnN0YW50cworICAzOiByZXF1aXJlZCBsaXN0PHRfc2VydmljZV9pZD4gc2VydmljZXMKK30KKworc3RydWN0IFR5cGVSZWdpc3RyeSB7CisgIDE6IHJlcXVpcmVkIG1hcDx0X3R5cGVfaWQsIHRfdHlwZT4gdHlwZXMKKyAgMjogcmVxdWlyZWQgbWFwPHRfY29uc3RfaWQsIHRfY29uc3Q+IGNvbnN0YW50cworICAzOiByZXF1aXJlZCBtYXA8dF9zZXJ2aWNlX2lkLCB0X3NlcnZpY2U+IHNlcnZpY2VzCit9CisKK3N0cnVjdCB0X3Byb2dyYW0geworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3Byb2dyYW1faWQgcHJvZ3JhbV9pZAorICAzOiByZXF1aXJlZCBzdHJpbmcgcGF0aAorICA0OiByZXF1aXJlZCBzdHJpbmcgbmFtZXNwYWNlXworICA1OiByZXF1aXJlZCBzdHJpbmcgb3V0X3BhdGgKKyAgNjogcmVxdWlyZWQgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZQorICA4OiByZXF1aXJlZCBsaXN0PHRfcHJvZ3JhbT4gaW5jbHVkZXMKKyAgOTogcmVxdWlyZWQgc3RyaW5nIGluY2x1ZGVfcHJlZml4CisgIDEwOiByZXF1aXJlZCB0X3Njb3BlIHNjb3BlCisKKyAgMTE6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiB0eXBlZGVmcworICAxMjogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IGVudW1zCisgIDEzOiByZXF1aXJlZCBsaXN0PHRfY29uc3RfaWQ+IGNvbnN0cworICAxNDogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IG9iamVjdHMKKyAgMTU6IHJlcXVpcmVkIGxpc3Q8dF9zZXJ2aWNlX2lkPiBzZXJ2aWNlcworCisgIDE2OiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IG5hbWVzcGFjZXMKKyAgMTc6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBjcHBfaW5jbHVkZXMKKyAgMTg6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBjX2luY2x1ZGVzCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorCitzdHJ1Y3QgR2VuZXJhdG9ySW5wdXQgeworICAxOiByZXF1aXJlZCB0X3Byb2dyYW0gcHJvZ3JhbQorICAyOiByZXF1aXJlZCBUeXBlUmVnaXN0cnkgdHlwZV9yZWdpc3RyeQorICAzOiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgVEhSSUZUX1BPUEVOKGNtZCkgX3BvcGVuKGNtZCwgIndiIikKKyNkZWZpbmUgVEhSSUZUX1BDTE9TRSBfcGNsb3NlCisjZWxzZQorI2RlZmluZSBUSFJJRlRfUE9QRU4oY21kKSBwb3BlbihjbWQsICJ3IikKKyNkZWZpbmUgVEhSSUZUX1BDTE9TRSBwY2xvc2UKKyNlbmRpZgorCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgiCisKKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL21hcC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL2NvcHkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS90cmFuc2Zvcm0uaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCIKKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgY29udmVydChGcm9tKiBmcm9tKSB7CisgIHR5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSB0bzsKKyAgY29udmVydChmcm9tLCB0byk7CisgIHJldHVybiB0bzsKK30KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OX04oZnJvbV90eXBlLCB0b190eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgY29udmVydDxmcm9tX3R5cGUsIHRvX3R5cGU+KGZyb21fdHlwZSAqIGZyb20sIHRvX3R5cGUgJiB0bykKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT04odHlwZSkgVEhSSUZUX0NPTlZFUlNJT05fTig6OnR5cGUsIHBsdWdpbjo6dHlwZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX04oZnJvbV9uYW1lLCB0b19uYW1lLCBwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKHByZWZpeChmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR04obmFtZSkgVEhSSUZUX0FTU0lHTl9OKGdldF8jI25hbWUoKSwgbmFtZSwgKQorI2RlZmluZSBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodHlwZSwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmIGZyb20tPmZyb21fbmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKGNvbnZlcnQoZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fT1BUKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20tPmhhc18jI25hbWUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUSFJJRlRfQVNTSUdOKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9MSVNUX04odHlwZSwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+ZnJvbV9uYW1lLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGZyb20tPmZyb21fbmFtZS5iZWdpbigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPmZyb21fbmFtZS5lbmQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by50b19uYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ8IDo6dHlwZT4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCkgY29udmVydChyZWludGVycHJldF9jYXN0PHRfdHlwZSo+KGZyb20pLCB0by5tZXRhZGF0YSkKKworLy8gYSBnZW5lcmF0b3Igb2Ygc2VxdWVudGlhbCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGFkZHJlc3NlcyAtLSBzbworLy8gdGhhdCB0aGUgVHlwZUNhY2hlIGJlbG93IGNhbiB1c2UgdGhvc2UgSURzIGluc3RlYWQgb2YKKy8vIGFkZHJlc3Nlcy4gVGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQncyB2YXJpb3VzCisvLyB0X3twcm9ncmFtLHR5cGUsZXRjfV9pZCB0eXBlcyB0byBiZSBkZW5zZSBjb25zZWN1dGl2ZWx5LW51bWJlcmVkCisvLyBpbnRlZ2VycywgaW5zdGVhZCBvZiBsYXJnZSByYW5kb20tc2VlbWluZyBpbnRlZ2Vycy4KKy8vCisvLyBGdXJ0aGVybW9yZSwgdGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQgdG8gYmUgZGV0ZXJtaW5pc3RpYyAobm8KKy8vIGFkZHJlc3Nlcywgc28gbm8gcHNldWRvLXJhbmRvbW5lc3MpIGFuZCB0aGF0IG1lYW5zIHJlcHJvZHVjaWJpbGl0eQorLy8gb2Ygb3V0cHV0LgorY29uc3QgaW50NjRfdCBPTkVfTUlMTElPTiA9IDEwMDAgKiAxMDAwOworY2xhc3MgaWRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgaWRfZ2VuZXJhdG9yKCkgOiBhZGRyMmlkXygpLCBuZXh0X2lkXyhPTkVfTUlMTElPTikge30KKworICB2b2lkIGNsZWFyKCkgeworICAgIGFkZHIyaWRfLmNsZWFyKCkgOworICAgIG5leHRfaWRfID0gT05FX01JTExJT04gOworICB9CisKKyAgaW50NjRfdCBnZW5zeW0oY29uc3QgaW50NjRfdCBhZGRyKSB7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+OjppdGVyYXRvciBpdCA9IGFkZHIyaWRfLmZpbmQoYWRkcik7CisgICAgaWYgKGl0ICE9IGFkZHIyaWRfLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZCA7CisgICAgaW50NjRfdCBpZCA9IG5leHRfaWRfKysgOworICAgIGFkZHIyaWRfLmluc2VydChzdGQ6Om1ha2VfcGFpcihhZGRyLCBpZCkpIDsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgc3RkOjptYXA8aW50NjRfdCwgaW50NjRfdD4gYWRkcjJpZF8gOworICBpbnQ2NF90IG5leHRfaWRfIDsKK30gOworCisvLyBUbyBhdm9pZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2Ygc2FtZSB0eXBlLCB0X3R5cGUsIHRfY29uc3QgYW5kIHRfc2VydmljZSBhcmUgc3RvcmVkIGluIG9uZSBwbGFjZQorLy8gYW5kIHJlZmVyZW5jZWQgYnkgSUQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBUeXBlQ2FjaGUgeworICB0eXBlZGVmIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHRvX3R5cGU7CisgIGlkX2dlbmVyYXRvciBpZGdlbiA7CisgIHN0ZDo6bWFwPGludDY0X3QsIHRvX3R5cGU+IGNhY2hlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMj4KKyAgaW50NjRfdCBzdG9yZShUMiogdCkgeworICAgIGludHB0cl90IGFkZHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pih0KTsKKyAgICBpZiAoIWFkZHIpIHJldHVybiAwTCA7CisKKyAgICBpbnQ2NF90IGlkID0gaWRnZW4uZ2Vuc3ltKGFkZHIpIDsKKyAgICBpZiAoY2FjaGUuZW5kKCkgIT0gY2FjaGUuZmluZChpZCkpIHJldHVybiBpZCA7CisKKyAgICAvLyBIQUNLOiBmYWtlIHJlc29sdmUgZm9yIHJlY3Vyc2l2ZSB0eXBlCisgICAgY2FjaGUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGlkLCB0b190eXBlKCkpKTsKKyAgICAvLyBvdmVyd3JpdGUgd2l0aCB0cnVlIHZhbHVlCisgICAgY2FjaGVbaWRdID0gY29udmVydCh0KTsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsgY2FjaGUuY2xlYXIoKSA7IGlkZ2VuLmNsZWFyKCk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50NjRfdCBzdG9yZV90eXBlKFQqIHQpOworCisjZGVmaW5lIFRfU1RPUkUodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGVDYWNoZTx0XyMjdHlwZT4gdHlwZSMjX2NhY2hlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBsdWdpbjo6dF8jI3R5cGUjI19pZCBzdG9yZV90eXBlPHRfIyN0eXBlPih0XyMjdHlwZSAqIHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHR5cGUjI19jYWNoZS5zdG9yZTx0XyMjdHlwZT4odCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1RfU1RPUkUodHlwZSkKK1RfU1RPUkUoY29uc3QpCitUX1NUT1JFKHNlcnZpY2UpCisjdW5kZWYgVF9TVE9SRQorLy8gdGhpcyBpZF9nZW5lcmF0b3IgaXMgZm9yIGdlbnN5bW0taW5nIHRfcHJvZ3JhbV9pZAoraWRfZ2VuZXJhdG9yIHByb2dyYW1fY2FjaGUgOworCisjZGVmaW5lIFRIUklGVF9BU1NJR05fSURfTih0LCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgZnJvbS0+ZnJvbV9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUoc3RvcmVfdHlwZTx0Pihmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9JRChuYW1lKSBUSFJJRlRfQVNTSUdOX0lEX04odF90eXBlLCBnZXRfIyNuYW1lKCksIG5hbWUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHQsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGZyb20tPmdldF8jI25hbWUjI3MoKS5iZWdpbigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPmdldF8jI25hbWUjI3MoKS5lbmQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by5uYW1lIyNzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICZzdG9yZV90eXBlPHQ+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworVEhSSUZUX0NPTlZFUlNJT05fTig6OnRfdHlwZSwgcGx1Z2luOjpUeXBlTWV0YWRhdGEpIHsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdD4oZnJvbS0+Z2V0X3Byb2dyYW0oKSkpOworICBUSFJJRlRfQVNTSUdOX04oYW5ub3RhdGlvbnNfLCBhbm5vdGF0aW9ucywgKTsKKyAgaWYgKGZyb20tPmhhc19kb2MoKSkgeworICAgIHRvLl9fc2V0X2RvYyhmcm9tLT5nZXRfZG9jKCkpOworICB9CisgIFRIUklGVF9BU1NJR04obmFtZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfdHlwZWRlZikgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR04oc3ltYm9saWMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfZm9yd2FyZF90eXBlZGVmKCksIGZvcndhcmQsICk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bV92YWx1ZSkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKHZhbHVlKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9lbnVtX3ZhbHVlLCBnZXRfY29uc3RhbnRzKCksIGNvbnN0YW50cyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3RfdmFsdWUpIHsKKyAgc3dpdGNoIChmcm9tLT5nZXRfdHlwZSgpKSB7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X2ludGVnZXIoKSwgaW50ZWdlcl92YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfZG91YmxlKCksIGRvdWJsZV92YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfc3RyaW5nKCksIHN0cmluZ192YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICBpZiAoZnJvbSkgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6dF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIGNpZHZhbCA7CisgICAgICBpZiAoZnJvbS0+ZW51bV8pCisJY2lkdmFsLl9fc2V0X2VudW1fdmFsKHN0b3JlX3R5cGU8dF90eXBlPihmcm9tLT5lbnVtXykpOworICAgICAgY2lkdmFsLl9fc2V0X2lkZW50aWZpZXJfdmFsKGZyb20tPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgdG8uX19zZXRfY29uc3RfaWRlbnRpZmllcl92YWwoY2lkdmFsKSA7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICB0by5fX2lzc2V0Lm1hcF92YWwgPSB0cnVlOworICAgIGlmIChmcm9tICYmICFmcm9tLT5nZXRfbWFwKCkuZW1wdHkoKSkgeworICAgICAgZm9yIChzdGQ6Om1hcDwgOjp0X2NvbnN0X3ZhbHVlKiwgOjp0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0CisgICAgICAgICAgID0gZnJvbS0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGZyb20tPmdldF9tYXAoKS5lbmQoKTsKKyAgICAgICAgICAgaXQrKykgeworICAgICAgICB0by5tYXBfdmFsLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb252ZXJ0KGl0LT5maXJzdCksIGNvbnZlcnQoaXQtPnNlY29uZCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICB0by5fX2lzc2V0Lmxpc3RfdmFsID0gdHJ1ZTsKKyAgICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2NvbnN0X3ZhbHVlLCBnZXRfbGlzdCgpLCBsaXN0X3ZhbCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiY29uc3QgdmFsdWUgaGFzIG5vIHZhbHVlIik7CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfY29uc3RfdmFsdWUsIGdldF92YWx1ZSgpLCB2YWx1ZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2ZpZWxkKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04oa2V5KTsKKyAgVEhSSUZUX0FTU0lHTl9OKGdldF9yZXEoKSwgcmVxLCAocGx1Z2luOjpSZXF1aXJlZG5lc3M6OnR5cGUpKTsKKyAgVEhSSUZUX0FTU0lHTihyZWZlcmVuY2UpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9jb25zdF92YWx1ZSwgZ2V0X3ZhbHVlKCksIHZhbHVlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc3RydWN0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9maWVsZCwgZ2V0X21lbWJlcnMoKSwgbWVtYmVycyk7CisgIFRIUklGVF9BU1NJR05fTihpc191bmlvbigpLCBpc191bmlvbiwgKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX3hjZXB0aW9uKCksIGlzX3hjZXB0aW9uLCApOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9mdW5jdGlvbikgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKHJldHVybnR5cGUpOworICBUSFJJRlRfQVNTSUdOX04oaXNfb25ld2F5KCksIGlzX29uZXdheSwgKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChhcmdsaXN0KTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh4Y2VwdGlvbnMpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2xpc3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoZWxlbV90eXBlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc2V0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGVsZW1fdHlwZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X21hcCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChrZXlfdHlwZSk7CisgIFRIUklGVF9BU1NJR05fSUQodmFsX3R5cGUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3NlcnZpY2UpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2Z1bmN0aW9uLCBnZXRfZnVuY3Rpb25zKCksIGZ1bmN0aW9ucyk7CisgIFRIUklGVF9BU1NJR05fSURfTih0X3NlcnZpY2UsIGdldF9leHRlbmRzKCksIGV4dGVuZHNfKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9iYXNlX3R5cGUpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS0+aXNfYmluYXJ5KCkpIHsKKyAgICB0by52YWx1ZSA9IHBsdWdpbjo6dF9iYXNlOjpUWVBFX0JJTkFSWTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZyb20tPmdldF9iYXNlKCkpIHsKKyNkZWZpbmUgVF9CQVNFVFlQRV9DQVNFKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV8jI25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by52YWx1ZSA9IHBsdWdpbjo6dF9iYXNlOjpUWVBFXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworICAgICAgVF9CQVNFVFlQRV9DQVNFKFZPSUQpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKFNUUklORyk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoQk9PTCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTgpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEkxNik7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTMyKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJNjQpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKERPVUJMRSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoIkJhc2UgdHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUiKTsKKyAgICAgIGJyZWFrOworI3VuZGVmIFRfQkFTRVRZUEVfQ0FTRQorICAgIH0KKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF90eXBlKSB7CisjZGVmaW5lIFRfQ09OVkVSVF9VTklPTl9OKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKGZyb20tPmlzXyMjbmFtZSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8uX19pc3NldC5uYW1lIyNfdmFsID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29udmVydChyZWludGVycHJldF9jYXN0PCA6OnR5cGUqPihmcm9tKSwgdG8ubmFtZSMjX3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgVF9DT05WRVJUX1VOSU9OKG5hbWUpIFRfQ09OVkVSVF9VTklPTl9OKG5hbWUsIHRfIyNuYW1lKQorICBpZiAoZmFsc2UpIHsKKyAgfQorICBUX0NPTlZFUlRfVU5JT04oYmFzZV90eXBlKQorICBUX0NPTlZFUlRfVU5JT04odHlwZWRlZikKKyAgVF9DT05WRVJUX1VOSU9OKGVudW0pCisgIFRfQ09OVkVSVF9VTklPTihzdHJ1Y3QpCisgIFRfQ09OVkVSVF9VTklPTl9OKHhjZXB0aW9uLCB0X3N0cnVjdCkKKyAgVF9DT05WRVJUX1VOSU9OKGxpc3QpCisgIFRfQ09OVkVSVF9VTklPTihzZXQpCisgIFRfQ09OVkVSVF9VTklPTihtYXApCisgIFRfQ09OVkVSVF9VTklPTihzZXJ2aWNlKQorICBlbHNlIHsKKyAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZSIpOworICB9CisjdW5kZWYgVF9DT05WRVJUX1VOSU9OX04KKyN1bmRlZiBUX0NPTlZFUlRfVU5JT04KK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zY29wZSkgeworI2RlZmluZSBUX1NDT1BFX0FTU0lHTihuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29zdDo6Y29weShmcm9tLT5uYW1lIyNzXyB8IGJvb3N0OjphZGFwdG9yczo6bWFwX3ZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnN0b3JlX3R5cGU8dHlwZT4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8ubmFtZSMjcykpCisgIFRfU0NPUEVfQVNTSUdOKHR5cGUsIHRfdHlwZSk7CisgIFRfU0NPUEVfQVNTSUdOKGNvbnN0YW50LCB0X2NvbnN0KTsKKyAgVF9TQ09QRV9BU1NJR04oc2VydmljZSwgdF9zZXJ2aWNlKTsKKyN1bmRlZiBUX1NDT1BFX0FTU0lHTgorfQorCit2b2lkIGdldF9nbG9iYWxfY2FjaGUocGx1Z2luOjpUeXBlUmVnaXN0cnkmIHJlZykgeworICByZWcudHlwZXMgPSB0eXBlX2NhY2hlLmNhY2hlOworICByZWcuY29uc3RhbnRzID0gY29uc3RfY2FjaGUuY2FjaGU7CisgIHJlZy5zZXJ2aWNlcyA9IHNlcnZpY2VfY2FjaGUuY2FjaGU7Cit9CisKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCkgeworICB0eXBlX2NhY2hlLmNsZWFyKCk7CisgIGNvbnN0X2NhY2hlLmNsZWFyKCk7CisgIHNlcnZpY2VfY2FjaGUuY2xlYXIoKTsKKyAgcHJvZ3JhbV9jYWNoZS5jbGVhcigpIDsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9wcm9ncmFtKSB7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X3Njb3BlLCBzY29wZSgpLCBzY29wZSk7CisgIFRIUklGVF9BU1NJR04ocGF0aCk7CisgIFRIUklGVF9BU1NJR04ob3V0X3BhdGgpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKGluY2x1ZGVfcHJlZml4KTsKKyAgVEhSSUZUX0FTU0lHTihjcHBfaW5jbHVkZXMpOworICBUSFJJRlRfQVNTSUdOKGNfaW5jbHVkZXMpOworICBUSFJJRlRfQVNTSUdOKG5hbWVzcGFjZXMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfb3V0X3BhdGhfYWJzb2x1dGUoKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGUsICk7CisgIFRIUklGVF9BU1NJR05fTihnZXRfbmFtZXNwYWNlKCksIG5hbWVzcGFjZV8sICk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIHR5cGVkZWYpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCBlbnVtKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgb2JqZWN0KTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfY29uc3QsIGNvbnN0KTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfc2VydmljZSwgc2VydmljZSk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfcHJvZ3JhbSwgZ2V0X2luY2x1ZGVzKCksIGluY2x1ZGVzKTsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8cGx1Z2luOjp0X3Byb2dyYW1faWQ+KGZyb20pKTsKK30KKworUGx1Z2luRGVsZWdhdGVSZXN1bHQgZGVsZWdhdGVUb1BsdWdpbih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHBhcnNlZF9vcHRpb25zOworICB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhvcHRpb25zLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMpOworICBzdGQ6OnN0cmluZyBjbWQgPSAidGhyaWZ0LWdlbi0iOworICBpZiAobGFuZ3VhZ2UuZmluZF9maXJzdF9ub3Rfb2YoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfLTAxMjM0NTY3ODkiKQorICAgICAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgbGFuZ3VhZ2UgbmFtZSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgfQorICBjbWQuYXBwZW5kKGxhbmd1YWdlKTsKKyAgRklMRSogZmQgPSBUSFJJRlRfUE9QRU4oY21kLmNfc3RyKCkpOworICBpZiAoZmQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBfc2V0bW9kZShmaWxlbm8oZmQpLCBfT19CSU5BUlkpOworI2VuZGlmCisgICAgc2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiB0cmFuc3BvcnQoCisgICAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0KG1ha2Vfc2hhcmVkPFRGRFRyYW5zcG9ydD4oZmlsZW5vKGZkKSkpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG8odHJhbnNwb3J0KTsKKworICAgIHBsdWdpbjo6R2VuZXJhdG9ySW5wdXQgaW5wdXQ7CisgICAgaW5wdXQuX19zZXRfcGFyc2VkX29wdGlvbnMocGFyc2VkX29wdGlvbnMpOworICAgIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworICAgIGNvbnZlcnQocHJvZ3JhbSwgaW5wdXQucHJvZ3JhbSk7CisgICAgZ2V0X2dsb2JhbF9jYWNoZShpbnB1dC50eXBlX3JlZ2lzdHJ5KTsKKyAgICB0cnkgeworICAgICAgaW5wdXQud3JpdGUoJnByb3RvKTsKKyAgICAgIHRyYW5zcG9ydC0+Zmx1c2goKTsKKyAgICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXJyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIHdoaWxlIHNlbmRpbmcgZGF0YSB0byBwbHVnaW46ICIgPDwgZXJyLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICBUSFJJRlRfUENMT1NFKGZkKTsKKyAgICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBiZSBwcmVwYXJlZCBmb3IgaGFuZyBvciBjcmFzaCBvZiBjaGlsZCBwcm9jZXNzCisgICAgaW50IHJldCA9IFRIUklGVF9QQ0xPU0UoZmQpOworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gUExVR0lOX1NVQ0NFRVNTOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OmNlcnIgPDwgInBsdWdpbiBwcm9jZXNzIHJldHVybmVkIG5vbiB6ZXJvIGV4aXQgY29kZTogIiA8PCByZXQgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICAgIH0KKyAgfQorICBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcmV0dXJuIFBMVUdJTl9OT1RfRk9VTkQ7Cit9Cit9CisKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjJkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9QTFVHSU5fT1VUUFVUX0gKKyNkZWZpbmUgVF9QTFVHSU5fUExVR0lOX09VVFBVVF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIHRfcHJvZ3JhbTsKKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCitlbnVtIFBsdWdpbkRlbGVnYXRlUmVzdWx0IHsKKyAgUExVR0lOX05PVF9GT1VORCwKKyAgUExVR0lOX0ZBSUxVUkUsCisgIFBMVUdJTl9TVUNDRUVTUywKK307CisKK1BsdWdpbkRlbGVnYXRlUmVzdWx0IGRlbGVnYXRlVG9QbHVnaW4odF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1RZUEVfVVRJTF9ICisjZGVmaW5lIFRfUExVR0lOX1RZUEVfVVRJTF9ICisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+CitzdHJ1Y3QgVG9UeXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIFRvVHlwZTxGcm9tPjo6dHlwZSogY29udmVydF9mb3J3YXJkKGNvbnN0IEZyb20mKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KGNvbnN0IEZyb20mLCBUbyopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIFRvVHlwZTxGcm9tPjo6dHlwZSogY29udmVydChjb25zdCBGcm9tJiBmcm9tKTsKKworY2xhc3MgVHlwZVJlZ2lzdHJ5Owordm9pZCBzZXRfZ2xvYmFsX2NhY2hlKGNvbnN0IFR5cGVSZWdpc3RyeSYpOwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KK30KK30KKworLy8gY29udmVyc2lvbiBmcm9tIHJhdyBjb21waWxlciB0eXBlcyB0byBwbHVnaW4gd2lyZSB0eXBlCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiBmcm9tLCBUbyYgdG8pOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSBjb252ZXJ0KEZyb20qIGZyb20pOworCit2b2lkIGdldF9nbG9iYWxfY2FjaGUoYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VHlwZVJlZ2lzdHJ5Jik7Cit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQorCisjZGVmaW5lIFRIUklGVF9UWVBFX01BUFBJTkcoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIFRZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBhcGFjaGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB0aHJpZnQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBwbHVnaW4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIFRZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBUb1R5cGU8IDo6VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiBUWVBFIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBUb1R5cGU8VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiA6OlRZUEUgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1RIUklGVF9UWVBFX01BUFBJTkcodF9iYXNlX3R5cGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29uc3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29uc3RfdmFsdWUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29udGFpbmVyKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2RvYykKK1RIUklGVF9UWVBFX01BUFBJTkcodF9lbnVtKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2VudW1fdmFsdWUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZmllbGQpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZnVuY3Rpb24pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfbGlzdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9tYXApCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfcHJvZ3JhbSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zY29wZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zZXJ2aWNlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3NldCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zdHJ1Y3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfdHlwZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF90eXBlZGVmKQorI3VuZGVmIFRIUklGVF9UWVBFX01BUFBJTkcKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3ODNiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaHJpZnQgc2Nhbm5lci4KKyAqCisgKiBUb2tlbml6ZXMgYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgorICovCisKKyV7CisKKy8qIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggc29tZSBvZiB0aGUgZmxhZ3MgaW4gTWFrZWZpbGUuYW0sIGJ1dCBpdCB3b3JrcworICogd2hlbiBwZW9wbGUgb3ZlcnJpZGUgQ1hYRkxBR1Mgd2l0aG91dCBiZWluZyBjYXJlZnVsLiBUaGUgcHJhZ21hcyBhcmUKKyAqIHRoZSAncmlnaHQnIHdheSB0byBkbyBpdCwgYnV0IGRvbid0IHdvcmsgb24gb2xkLWVub3VnaCBHQ0MgKGluIHBhcnRpY3VsYXIKKyAqIHRoZSBHQ0MgdGhhdCBzaGlwIG9uIE1hYyBPUyBYIDEwLjYuNSwgKmNvdW50ZXIqIHRvIHdoYXQgdGhlIEdOVSBkb2NzIHNheSkKKyAqCisgKiBXZSBzaG91bGQgcmV2ZXJ0IHRoZSBNYWtlZmlsZS5hbSBjaGFuZ2VzIG9uY2UgQXBwbGUgc2hpcHMgYSByZWFzb25hYmxlCisgKiBHQ0MuCisgKi8KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorCisvLyB3YXJuaW5nIEM0MTAyOiAnZmluZF9ydWxlJyA6IHVucmVmZXJlbmNlZCBsYWJlbAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMiApCisKKy8vIHdhcm5pbmcgQzQyNjc6ICdhcmd1bWVudCcgOiBjb252ZXJzaW9uIGZyb20gJ3NpemVfdCcgdG8gJ2ludCcsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI2NyApCisKKy8vIGF2b2lkIGlzYXR0eSByZWRlZmluaXRpb24KKyNkZWZpbmUgWVlfTkVWRVJfSU5URVJBQ1RJVkUgMQorCisjZGVmaW5lIFlZX05PX1VOSVNURF9IIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKworLyoqCisgKiBNdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHBhcnNlL3RfcHJvZ3JhbS5oLCBidXQgSSBjYW4ndCByZW1lbWJlciB3aHkgYW55bW9yZQorICogYmVjYXVzZSBJIHdyb3RlIHRoaXMgYSB3aGlsZSBhZ28uCisgKi8KKyNpZiBkZWZpbmVkKEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04pCisjaW5jbHVkZSAidGhyaWZ0L3RocmlmdHkuaCIKKyNlbHNlCisjaW5jbHVkZSAidGhyaWZ0L3RocmlmdHkuaGgiCisjZW5kaWYKKwordm9pZCBpbnRlZ2VyX292ZXJmbG93KGNoYXIqIHRleHQpIHsKKyAgeXllcnJvcigiVGhpcyBpbnRlZ2VyIGlzIHRvbyBiaWc6IFwiJXNcIlxuIiwgdGV4dCk7CisgIGV4aXQoMSk7Cit9CisKK3ZvaWQgdW5leHBlY3RlZF90b2tlbihjaGFyKiB0ZXh0KSB7CisgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gaW4gaW5wdXQ6IFwiJXNcIlxuIiwgdGV4dCk7CisgIGV4aXQoMSk7Cit9CisKKyV9CisKKy8qKgorICogUHJvdmlkZXMgdGhlIHl5bGluZW5vIGdsb2JhbCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3V0cHV0CisgKi8KKyVvcHRpb24gbGV4LWNvbXBhdAorCisvKioKKyAqIE91ciBpbnB1dHMgYXJlIGFsbCBzaW5nbGUgZmlsZXMsIHNvIG5vIG5lZWQgZm9yIHl5d3JhcAorICovCislb3B0aW9uIG5veXl3cmFwCisKKy8qKgorICogV2UgZG9uJ3QgdXNlIGl0LCBhbmQgaXQgZmlyZXMgdXAgd2FybmluZ3MgYXQgLVdhbGwKKyAqLworJW9wdGlvbiBub3VucHV0CisKKy8qKgorICogSGVscGVyIGRlZmluaXRpb25zLCBjb21tZW50cywgY29uc3RhbnRzLCBhbmQgd2hhdG5vdAorICovCisKK2ludGNvbnN0YW50ICAgKFsrLV0/WzAtOV0rKQoraGV4Y29uc3RhbnQgICAoWystXT8iMHgiWzAtOUEtRmEtZl0rKQorZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKK2lkZW50aWZpZXIgICAgKFthLXpBLVpfXShcLlthLXpBLVpfMC05XXxbYS16QS1aXzAtOV0pKikKK3doaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCitzaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCittdWx0aWNtX2JlZ2luICgiLyoiKQorZG9jdGV4dF9iZWdpbiAoIi8qKiIpCitjb21tZW50ICAgICAgICgiLy8iW15cbl0qKQordW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQorc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKK2xpdGVyYWxfYmVnaW4gKFsnXCJdKQorCislJQorCit7d2hpdGVzcGFjZX0gICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KK3tzaWxseWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQorCit7ZG9jdGV4dF9iZWdpbn0geworICBzdGQ6OnN0cmluZyBwYXJzZWQoIi8qKiIpOworICBpbnQgc3RhdGUgPSAwOyAgLy8gMCA9IG5vcm1hbCwgMSA9ICIqIiBzZWVuLCAiKi8iIHNlZW4KKyAgd2hpbGUoc3RhdGUgPCAyKQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHBhcnNlZC5wdXNoX2JhY2soY2gpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGRvYy1jb21tZW50IGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PSAxKSA/IDIgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHBkZWJ1ZygiZG9jdGV4dCA9IFwiJXNcIlxuIixwYXJzZWQuY19zdHIoKSk7CisKKyAvKiBUaGlzIGRvZXMgbm90IHNob3cgdXAgaW4gdGhlIHBhcnNlIHRyZWUuICovCisgLyogUmF0aGVyLCB0aGUgcGFyc2VyIHdpbGwgZ3JhYiBpdCBvdXQgb2YgdGhlIGdsb2JhbC4gKi8KKyAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgY2xlYXJfZG9jdGV4dCgpOworICAgIGdfZG9jdGV4dCA9IHN0cmR1cChwYXJzZWQuY19zdHIoKSArIDMpOworICAgIGFzc2VydChzdHJsZW4oZ19kb2N0ZXh0KSA+PSAyKTsKKyAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAyXSA9ICcgJzsKKyAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAxXSA9ICdcMCc7CisgICAgZ19kb2N0ZXh0ID0gY2xlYW5fdXBfZG9jdGV4dChnX2RvY3RleHQpOworICAgIGdfZG9jdGV4dF9saW5lbm8gPSB5eWxpbmVubzsKKyAgICBpZiggKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9PSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IElOVkFMSUQpKXsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9IHN0cmR1cChnX2RvY3RleHQpOworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gZ19kb2N0ZXh0X2xpbmVubzsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IFNUSUxMX0NBTkRJREFURTsKKyAgICAgIHBkZWJ1ZygiJXMiLCJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIFNUSUxMX0NBTkRJREFURSIpOworICAgIH0KKyAgfQorfQorCit7bXVsdGljbV9iZWdpbn0gIHsgLyogcGFyc2VkLCBidXQgdGhyb3duIGF3YXkgKi8KKyAgc3RkOjpzdHJpbmcgcGFyc2VkKCIvKiIpOworICBpbnQgc3RhdGUgPSAwOyAgLy8gMCA9IG5vcm1hbCwgMSA9ICIqIiBzZWVuLCAiKi8iIHNlZW4KKyAgd2hpbGUoc3RhdGUgPCAyKQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHBhcnNlZC5wdXNoX2JhY2soY2gpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PSAxKSA/IDIgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHBkZWJ1ZygibXVsdGlfY29tbSA9IFwiJXNcIlxuIixwYXJzZWQuY19zdHIoKSk7Cit9CisKK3tjb21tZW50fSAgICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQore3VuaXhjb21tZW50fSAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9CisKK3tzeW1ib2x9ICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQorIioiICAgICAgICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9CisKKyJmYWxzZSIgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0wOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQorInRydWUiICAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTE7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9CisKKyJuYW1lc3BhY2UiICAgICAgICAgIHsgcmV0dXJuIHRva19uYW1lc3BhY2U7ICAgICAgICAgICAgfQorImNwcF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY3BwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNwcF9pbmNsdWRlIiAgICAgICAgeyByZXR1cm4gdG9rX2NwcF9pbmNsdWRlOyAgICAgICAgICB9CisiY3BwX3R5cGUiICAgICAgICAgICB7IHJldHVybiB0b2tfY3BwX3R5cGU7ICAgICAgICAgICAgIH0KKyJqYXZhX3BhY2thZ2UiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImphdmFfcGFja2FnZSIsICJqYXZhIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNvY29hX3ByZWZpeCIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY29jb2FfcHJlZml4IiwgImNvY29hIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNzaGFycF9uYW1lc3BhY2UiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY3NoYXJwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImRlbHBoaV9uYW1lc3BhY2UiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiZGVscGhpIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInBocF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicGhwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInB5X21vZHVsZSIgICAgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicHlfbW9kdWxlIiwgInB5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInBlcmxfcGFja2FnZSIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicGVybF9wYWNrYWdlIiwgInBlcmwiKTsgLyogZG8gbm90aGluZyAqLyB9CisicnVieV9uYW1lc3BhY2UiICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJydWJ5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInNtYWxsdGFsa19jYXRlZ29yeSIgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgic21hbGx0YWxrX2NhdGVnb3J5IiwgInNtYWxsdGFsay5jYXRlZ29yeSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfcHJlZml4IiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19jYXRlZ29yeSIsICJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2FsbCIgICAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2FsbDsgICAgICAgICAgICAgIH0KKyJ4c2Rfb3B0aW9uYWwiICAgICAgIHsgcmV0dXJuIHRva194c2Rfb3B0aW9uYWw7ICAgICAgICAgfQorInhzZF9uaWxsYWJsZSIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9uaWxsYWJsZTsgICAgICAgICB9CisieHNkX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJ4c2QiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KKyJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQorInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9CisiYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KKyJieXRlIiAgICAgICAgICAgICAgIHsKKyAgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworICByZXR1cm4gdG9rX2k4OworfQorImk4IiAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k4OyAgICAgICAgICAgICAgICAgICB9CisiaTE2IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTE2OyAgICAgICAgICAgICAgICAgIH0KKyJpMzIiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMzI7ICAgICAgICAgICAgICAgICAgfQorImk2NCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k2NDsgICAgICAgICAgICAgICAgICB9CisiZG91YmxlIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfZG91YmxlOyAgICAgICAgICAgICAgIH0KKyJzdHJpbmciICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJpbmc7ICAgICAgICAgICAgICAgfQorImJpbmFyeSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2JpbmFyeTsgICAgICAgICAgICAgICB9Cisic2xpc3QiIHsKKyAgcHdhcm5pbmcoMCwgIlwic2xpc3RcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2xpc3Q7Cit9Cisic2VudW0iIHsKKyAgcHdhcm5pbmcoMCwgIlwic2VudW1cIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2VudW07Cit9CisibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KKyJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQorInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Cisib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KKyJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQorInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9CisidW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KKyJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQorImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9CisidGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KKyJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQorImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9CisiY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KKyJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQorIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9CisiYXN5bmMiIHsKKyAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7CisgIHJldHVybiB0b2tfb25ld2F5OworfQorIiYiICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlZmVyZW5jZTsgICAgICAgICAgICB9CisKK3tpbnRjb25zdGFudH0geworICBlcnJubyA9IDA7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCwgTlVMTCwgMTApOworICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOworICB9CisgIHJldHVybiB0b2tfaW50X2NvbnN0YW50OworfQorCit7aGV4Y29uc3RhbnR9IHsKKyAgZXJybm8gPSAwOworICBjaGFyIHNpZ24gPSB5eXRleHRbMF07CisgIGludCBzaGlmdCA9IHNpZ24gPT0gJzAnID8gMiA6IDM7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCtzaGlmdCwgTlVMTCwgMTYpOworICBpZiAoc2lnbiA9PSAnLScpIHsKKyAgICB5eWx2YWwuaWNvbnN0ID0gLXl5bHZhbC5pY29uc3Q7CisgIH0KKyAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKKyAgfQorICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKK30KKwore2lkZW50aWZpZXJ9IHsKKyAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7CisgIHJldHVybiB0b2tfaWRlbnRpZmllcjsKK30KKwore2R1YmNvbnN0YW50fSB7CisgLyogRGVsaWJlcmF0ZWx5IHBsYWNlZCBhZnRlciBpZGVudGlmaWVyLCBzaW5jZSAiZTEwIiBpcyBOT1QgYSBkb3VibGUgbGl0ZXJhbCAoVEhSSUZULTM0NzcpICovCisgIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7CisgIHJldHVybiB0b2tfZHViX2NvbnN0YW50OworfQorCit7bGl0ZXJhbF9iZWdpbn0geworICBjaGFyIG1hcmsgPSB5eXRleHRbMF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yKDs7KQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnXG4nOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgY2ggPSB5eWlucHV0KCk7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChjaCA9PSBtYXJrKSB7CisgICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKKyAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisuIHsKKyAgdW5leHBlY3RlZF90b2tlbih5eXRleHQpOworfQorCislJQorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiB2aW06IGZpbGV0eXBlPWxleAorKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzRhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5CkBAIC0wLDAgKzEsMTIwMSBAQAorJWNvZGUgcmVxdWlyZXMgeworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKK30KKyV7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHBhcnNlci4KKyAqCisgKiBUaGlzIHBhcnNlciBpcyB1c2VkIG9uIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmbmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorCisjaWZkZWYgX01TQ19WRVIKKy8vd2FybmluZyBDNDA2NTogc3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjUpCisjZW5kaWYKKworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGZpZWxkIGluZGljZXMgZXRjLgorICogd2hlbiBwYXJzaW5nIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LiBGaWVsZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbmVkIHN0YXJ0aW5nIGZyb20gLTEgYW5kIHdvcmtpbmcgdGhlaXIgd2F5IGRvd24uCisgKi8KK2ludCB5X2ZpZWxkX3ZhbCA9IC0xOworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGVudW0gdmFsdWVzLgorICogeV9lbnVtX3ZhbCBpcyB0aGUgbGFzdCB2YWx1ZSBhc3NpZ25lZDsgdGhlIG5leHQgYXV0by1hc3NpZ25lZCB2YWx1ZSB3aWxsIGJlCisgKiB5X2VudW1fdmFsKzEsIGFuZCB0aGVuIGl0IGNvbnRpbnVlcyB3b3JraW5nIHVwd2FyZHMuICBFeHBsaWNpdGx5IHNwZWNpZmllZAorICogZW51bSB2YWx1ZXMgcmVzZXQgeV9lbnVtX3ZhbCB0byB0aGF0IHZhbHVlLgorICovCitpbnQzMl90IHlfZW51bV92YWwgPSAtMTsKK2ludCBnX2FyZ2xpc3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7CisKKyV9CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgorICovCisldW5pb24geworICBjaGFyKiAgICAgICAgICBpZDsKKyAgaW50NjRfdCAgICAgICAgaWNvbnN0OworICBkb3VibGUgICAgICAgICBkY29uc3Q7CisgIGJvb2wgICAgICAgICAgIHRib29sOworICB0X2RvYyogICAgICAgICB0ZG9jOworICB0X3R5cGUqICAgICAgICB0dHlwZTsKKyAgdF9iYXNlX3R5cGUqICAgdGJhc2U7CisgIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOworICB0X2VudW0qICAgICAgICB0ZW51bTsKKyAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OworICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7CisgIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7CisgIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7CisgIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOworICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247CisgIHRfZmllbGQqICAgICAgIHRmaWVsZDsKKyAgY2hhciogICAgICAgICAgZHRleHQ7CisgIHRfZmllbGQ6OmVfcmVxIGVyZXE7CisgIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKKyAgdF9maWVsZF9pZCAgICAgdGZpZWxkaWQ7Cit9CisKKy8qKgorICogU3RyaW5ncyBpZGVudGlmaWVyCisgKi8KKyV0b2tlbjxpZD4gICAgIHRva19pZGVudGlmaWVyCisldG9rZW48aWQ+ICAgICB0b2tfbGl0ZXJhbAorJXRva2VuPGR0ZXh0PiAgdG9rX2RvY3RleHQKKworLyoqCisgKiBDb25zdGFudCB2YWx1ZXMKKyAqLworJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAorJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAorCisvKioKKyAqIEhlYWRlciBrZXl3b3JkcworICovCisldG9rZW4gdG9rX2luY2x1ZGUKKyV0b2tlbiB0b2tfbmFtZXNwYWNlCisldG9rZW4gdG9rX2NwcF9pbmNsdWRlCisldG9rZW4gdG9rX2NwcF90eXBlCisldG9rZW4gdG9rX3hzZF9hbGwKKyV0b2tlbiB0b2tfeHNkX29wdGlvbmFsCisldG9rZW4gdG9rX3hzZF9uaWxsYWJsZQorJXRva2VuIHRva194c2RfYXR0cnMKKworLyoqCisgKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfdm9pZAorJXRva2VuIHRva19ib29sCisldG9rZW4gdG9rX3N0cmluZworJXRva2VuIHRva19iaW5hcnkKKyV0b2tlbiB0b2tfc2xpc3QKKyV0b2tlbiB0b2tfc2VudW0KKyV0b2tlbiB0b2tfaTgKKyV0b2tlbiB0b2tfaTE2CisldG9rZW4gdG9rX2kzMgorJXRva2VuIHRva19pNjQKKyV0b2tlbiB0b2tfZG91YmxlCisKKy8qKgorICogQ29tcGxleCB0eXBlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfbWFwCisldG9rZW4gdG9rX2xpc3QKKyV0b2tlbiB0b2tfc2V0CisKKy8qKgorICogRnVuY3Rpb24gbW9kaWZpZXJzCisgKi8KKyV0b2tlbiB0b2tfb25ld2F5CisKKy8qKgorICogVGhyaWZ0IGxhbmd1YWdlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfdHlwZWRlZgorJXRva2VuIHRva19zdHJ1Y3QKKyV0b2tlbiB0b2tfeGNlcHRpb24KKyV0b2tlbiB0b2tfdGhyb3dzCisldG9rZW4gdG9rX2V4dGVuZHMKKyV0b2tlbiB0b2tfc2VydmljZQorJXRva2VuIHRva19lbnVtCisldG9rZW4gdG9rX2NvbnN0CisldG9rZW4gdG9rX3JlcXVpcmVkCisldG9rZW4gdG9rX29wdGlvbmFsCisldG9rZW4gdG9rX3VuaW9uCisldG9rZW4gdG9rX3JlZmVyZW5jZQorCisvKioKKyAqIEdyYW1tYXIgbm9kZXMKKyAqLworCisldHlwZTx0dHlwZT4gICAgIEJhc2VUeXBlCisldHlwZTx0dHlwZT4gICAgIFNpbXBsZUJhc2VUeXBlCisldHlwZTx0dHlwZT4gICAgIENvbnRhaW5lclR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQ29udGFpbmVyVHlwZQorJXR5cGU8dHR5cGU+ICAgICBNYXBUeXBlCisldHlwZTx0dHlwZT4gICAgIFNldFR5cGUKKyV0eXBlPHR0eXBlPiAgICAgTGlzdFR5cGUKKworJXR5cGU8dGRvYz4gICAgICBEZWZpbml0aW9uCisldHlwZTx0dHlwZT4gICAgIFR5cGVEZWZpbml0aW9uCisKKyV0eXBlPHR0eXBlZGVmPiAgVHlwZWRlZgorCisldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9ucworJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbkxpc3QKKyV0eXBlPHRhbm5vdD4gICAgVHlwZUFubm90YXRpb24KKyV0eXBlPGlkPiAgICAgICAgVHlwZUFubm90YXRpb25WYWx1ZQorCisldHlwZTx0ZmllbGQ+ICAgIEZpZWxkCisldHlwZTx0ZmllbGRpZD4gIEZpZWxkSWRlbnRpZmllcgorJXR5cGU8ZXJlcT4gICAgICBGaWVsZFJlcXVpcmVkbmVzcworJXR5cGU8dHR5cGU+ICAgICBGaWVsZFR5cGUKKyV0eXBlPHRjb25zdHY+ICAgRmllbGRWYWx1ZQorJXR5cGU8dHN0cnVjdD4gICBGaWVsZExpc3QKKyV0eXBlPHRib29sPiAgICAgRmllbGRSZWZlcmVuY2UKKworJXR5cGU8dGVudW0+ICAgICBFbnVtCisldHlwZTx0ZW51bT4gICAgIEVudW1EZWZMaXN0CisldHlwZTx0ZW51bXY+ICAgIEVudW1EZWYKKyV0eXBlPHRlbnVtdj4gICAgRW51bVZhbHVlCisKKyV0eXBlPHR0eXBlZGVmPiAgU2VudW0KKyV0eXBlPHRiYXNlPiAgICAgU2VudW1EZWZMaXN0CisldHlwZTxpZD4gICAgICAgIFNlbnVtRGVmCisKKyV0eXBlPHRjb25zdD4gICAgQ29uc3QKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RWYWx1ZQorJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3QKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Q29udGVudHMKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXAKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXBDb250ZW50cworCisldHlwZTxpY29uc3Q+ICAgIFN0cnVjdEhlYWQKKyV0eXBlPHRzdHJ1Y3Q+ICAgU3RydWN0CisldHlwZTx0c3RydWN0PiAgIFhjZXB0aW9uCisldHlwZTx0c2VydmljZT4gIFNlcnZpY2UKKworJXR5cGU8dGZ1bmN0aW9uPiBGdW5jdGlvbgorJXR5cGU8dHR5cGU+ICAgICBGdW5jdGlvblR5cGUKKyV0eXBlPHRzZXJ2aWNlPiAgRnVuY3Rpb25MaXN0CisKKyV0eXBlPHRzdHJ1Y3Q+ICAgVGhyb3dzCisldHlwZTx0c2VydmljZT4gIEV4dGVuZHMKKyV0eXBlPHRib29sPiAgICAgT25ld2F5CisldHlwZTx0Ym9vbD4gICAgIFhzZEFsbAorJXR5cGU8dGJvb2w+ICAgICBYc2RPcHRpb25hbAorJXR5cGU8dGJvb2w+ICAgICBYc2ROaWxsYWJsZQorJXR5cGU8dHN0cnVjdD4gICBYc2RBdHRyaWJ1dGVzCisldHlwZTxpZD4gICAgICAgIENwcFR5cGUKKworJXR5cGU8ZHRleHQ+ICAgICBDYXB0dXJlRG9jVGV4dAorCislJQorCisvKioKKyAqIFRocmlmdCBHcmFtbWFyIEltcGxlbWVudGF0aW9uLgorICoKKyAqIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgc291cmNlIGZpbGUgd29ya3MgaXRzIHdheSB0b3AgZG93biBmcm9tIHdoYXQgeW91CisgKiBtaWdodCBleHBlY3QgdG8gZmluZCBpbiBhIHR5cGljYWwgLnRocmlmdCBmaWxlLCBpLmUuIHR5cGUgZGVmaW5pdGlvbnMgYW5kCisgKiBuYW1lc3BhY2VzIHVwIHRvcCBmb2xsb3dlZCBieSBzZXJ2aWNlIGRlZmluaXRpb25zIHVzaW5nIHRob3NlIHR5cGVzLgorICovCisKK1Byb2dyYW06CisgIEhlYWRlckxpc3QgRGVmaW5pdGlvbkxpc3QKKyAgICB7CisgICAgICBwZGVidWcoIlByb2dyYW0gLT4gSGVhZGVycyBEZWZpbml0aW9uTGlzdCIpOworICAgICAgaWYoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzICE9IEFMUkVBRFlfUFJPQ0VTU0VEKSkKKyAgICAgIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7CisgICAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFMUkVBRFlfUFJPQ0VTU0VEOworICAgICAgfQorICAgICAgY2xlYXJfZG9jdGV4dCgpOworICAgIH0KKworQ2FwdHVyZURvY1RleHQ6CisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gZ19kb2N0ZXh0OworICAgICAgICBnX2RvY3RleHQgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KKworLyogVE9ETyhkcmVpc3MpOiBUcnkgdG8gRGVzdHJveURvY1RleHQgaW4gYWxsIHNvcnRzIG9yIHJhbmRvbSBwbGFjZXMuICovCitEZXN0cm95RG9jVGV4dDoKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgY2xlYXJfZG9jdGV4dCgpOworICAgICAgfQorICAgIH0KKworLyogV2UgaGF2ZSB0byBEZXN0cm95RG9jVGV4dCBoZXJlLCBvdGhlcndpc2UgaXQgY2F0Y2hlcyB0aGUgZG9jdGV4dAorICAgb24gdGhlIGZpcnN0IHJlYWwgZWxlbWVudC4gKi8KK0hlYWRlckxpc3Q6CisgIEhlYWRlckxpc3QgRGVzdHJveURvY1RleHQgSGVhZGVyCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+IEhlYWRlckxpc3QgSGVhZGVyIik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiAiKTsKKyAgICB9CisKK0hlYWRlcjoKKyAgSW5jbHVkZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IEluY2x1ZGUiKTsKKyAgICB9Cit8IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKKyAgICAgIH0KKyAgICAgIGlmICgkNCAhPSBOVUxMKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygkMiwgJDQtPmFubm90YXRpb25zXyk7CisgICAgICAgIGRlbGV0ZSAkNDsKKyAgICAgIH0KKyAgICB9Cit8IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiKiIsICQzKTsKKyAgICAgIH0KKyAgICB9Cit8IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9jcHBfaW5jbHVkZSgkMik7CisgICAgICB9CisgICAgfQorCitJbmNsdWRlOgorICB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSW5jbHVkZSAtPiB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZygkMikpOworICAgICAgICBpZiAoIXBhdGguZW1wdHkoKSkgeworICAgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2luY2x1ZGUocGF0aCwgc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworRGVmaW5pdGlvbkxpc3Q6CisgIERlZmluaXRpb25MaXN0IENhcHR1cmVEb2NUZXh0IERlZmluaXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+IERlZmluaXRpb25MaXN0IERlZmluaXRpb24iKTsKKyAgICAgIGlmICgkMiAhPSBOVUxMICYmICQzICE9IE5VTEwpIHsKKyAgICAgICAgJDMtPnNldF9kb2MoJDIpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+ICIpOworICAgIH0KKworRGVmaW5pdGlvbjoKKyAgQ29uc3QKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gQ29uc3QiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9jb25zdCgkMSk7CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgVHlwZURlZmluaXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gVHlwZURlZmluaXRpb24iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Njb3BlLT5hZGRfdHlwZSgkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfdHlwZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICB9CisgICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgeworICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgU2VydmljZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBTZXJ2aWNlIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19zY29wZS0+YWRkX3NlcnZpY2UoJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3NlcnZpY2UoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgfQorICAgICAgICBnX3Byb2dyYW0tPmFkZF9zZXJ2aWNlKCQxKTsKKyAgICAgICAgaWYgKCEgZ19wcm9ncmFtLT5pc191bmlxdWVfdHlwZW5hbWUoJDEpKSB7CisgICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsICQxLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorCitUeXBlRGVmaW5pdGlvbjoKKyAgVHlwZWRlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gVHlwZWRlZiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOworICAgICAgfQorICAgIH0KK3wgRW51bQorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gRW51bSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2VudW0oJDEpOworICAgICAgfQorICAgIH0KK3wgU2VudW0KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFNlbnVtIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7CisgICAgICB9CisgICAgfQorfCBTdHJ1Y3QKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFN0cnVjdCIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3N0cnVjdCgkMSk7CisgICAgICB9CisgICAgfQorfCBYY2VwdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gWGNlcHRpb24iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF94Y2VwdGlvbigkMSk7CisgICAgICB9CisgICAgfQorCitDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWw6CisgICcsJworICAgIHt9Cit8ICc7JworICAgIHt9Cit8CisgICAge30KKworVHlwZWRlZjoKKyAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWYgLT4gdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOworICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOworICAgICAgJCQgPSB0ZDsKKyAgICAgIGlmICgkNCAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNC0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDQ7CisgICAgICB9CisgICAgfQorCitFbnVtOgorICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bSAtPiB0b2tfZW51bSB0b2tfaWRlbnRpZmllciB7IEVudW1EZWZMaXN0IH0iKTsKKyAgICAgICQkID0gJDQ7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisKKyAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOworICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOworICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCitFbnVtRGVmTGlzdDoKKyAgRW51bURlZkxpc3QgRW51bURlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hcHBlbmQoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7CisgICAgICB5X2VudW1fdmFsID0gLTE7CisgICAgfQorCitFbnVtRGVmOgorICBDYXB0dXJlRG9jVGV4dCBFbnVtVmFsdWUgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZiAtPiBFbnVtVmFsdWUiKTsKKyAgICAgICQkID0gJDI7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisJICBpZiAoJDMgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDMtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQzOworICAgICAgfQorICAgIH0KKworRW51bVZhbHVlOgorICB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2ludF9jb25zdGFudCIpOworICAgICAgaWYgKCQzIDwgSU5UMzJfTUlOIHx8ICQzID4gSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgdXNlZCB0byBiZSBqdXN0IGEgd2FybmluZy4gIEhvd2V2ZXIsIHNpbmNlIHRocmlmdCBhbHdheXMKKyAgICAgICAgLy8gdHJlYXRzIGVudW1zIGFzIGkzMiB2YWx1ZXMsIEknbSBjaGFuZ2luZyBpdCB0byBhIGZhdGFsIGVycm9yLgorICAgICAgICAvLyBJIGRvdWJ0IHRoaXMgd2lsbCBhZmZlY3QgbWFueSBwZW9wbGUsIGJ1dCB1c2VycyB3aG8gcnVuIGludG8gdGhpcworICAgICAgICAvLyB3aWxsIGhhdmUgdG8gdXBkYXRlIHRoZWlyIHRocmlmdCBmaWxlcyB0byBtYW51YWxseSBzcGVjaWZ5IHRoZQorICAgICAgICAvLyB0cnVuY2F0ZWQgaTMyIHZhbHVlIHRoYXQgdGhyaWZ0IGhhcyBhbHdheXMgYmVlbiB1c2luZyBhbnl3YXkuCisgICAgICAgIGZhaWx1cmUoIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcyB3aWxsIGJlIHRydW5jYXRlZC4iLCAkMSk7CisgICAgICB9CisgICAgICB5X2VudW1fdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDMpOworICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQxLCB5X2VudW1fdmFsKTsKKyAgICB9CisgfAorICB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyIik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDEpOworICAgICAgaWYgKHlfZW51bV92YWwgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIGZhaWx1cmUoImVudW0gdmFsdWUgb3ZlcmZsb3cgYXQgZW51bSAlcyIsICQxKTsKKyAgICAgIH0KKyAgICAgICsreV9lbnVtX3ZhbDsKKyAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7CisgICAgfQorCitTZW51bToKKyAgdG9rX3NlbnVtIHRva19pZGVudGlmaWVyICd7JyBTZW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkNCwgJDIpOworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKyAgICB9CisKK1NlbnVtRGVmTGlzdDoKKyAgU2VudW1EZWZMaXN0IFNlbnVtRGVmCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gU2VudW1EZWZMaXN0IFNlbnVtRGVmIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9zdHJpbmdfZW51bV92YWwoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAgICAgJCQtPnNldF9zdHJpbmdfZW51bSh0cnVlKTsKKyAgICB9CisKK1NlbnVtRGVmOgorICB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmIC0+IHRva19saXRlcmFsIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQ29uc3Q6CisgIHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdCAtPiB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyID0gQ29uc3RWYWx1ZSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMyk7CisgICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDUsICQyKTsKKyAgICAgICAgJCQgPSBuZXcgdF9jb25zdCgkMiwgJDMsICQ1KTsKKyAgICAgICAgdmFsaWRhdGVfY29uc3RfdHlwZSgkJCk7CisKKyAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KCQzLCAkJCk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyAkMywgJCQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorCitDb25zdFZhbHVlOgorICB0b2tfaW50X2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pbnRfY29uc3RhbnQiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfaW50ZWdlcigkMSk7CisgICAgICBpZiAoIWdfYWxsb3dfNjRiaXRfY29uc3RzICYmICgkMSA8IElOVDMyX01JTiB8fCAkMSA+IElOVDMyX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCBjb25zdGFudCBcIiUiIFBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKKyAgICAgIH0KKyAgICB9Cit8IHRva19kdWJfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9kb3VibGUoJDEpOworICAgIH0KK3wgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOworICAgIH0KK3wgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7CisgICAgfQorfCBDb25zdExpc3QKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgQ29uc3RNYXAKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitDb25zdExpc3Q6CisgICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorCitDb25zdExpc3RDb250ZW50czoKKyAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9saXN0KCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9saXN0KCk7CisgICAgfQorCitDb25zdE1hcDoKKyAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9CisKK0NvbnN0TWFwQ29udGVudHM6CisgIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9tYXAoKTsKKyAgICB9CisKK1N0cnVjdEhlYWQ6CisgIHRva19zdHJ1Y3QKKyAgICB7CisgICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7CisgICAgfQorfCB0b2tfdW5pb24KKyAgICB7CisgICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKKyAgICB9CisKK1N0cnVjdDoKKyAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJDUtPnNldF94c2RfYWxsKCQzKTsKKyAgICAgICQ1LT5zZXRfdW5pb24oJDEgPT0gc3RydWN0X2lzX3VuaW9uKTsKKyAgICAgICQkID0gJDU7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ3LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNzsKKyAgICAgIH0KKyAgICB9CisKK1hzZEFsbDoKKyAgdG9rX3hzZF9hbGwKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2RPcHRpb25hbDoKKyAgdG9rX3hzZF9vcHRpb25hbAorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZE5pbGxhYmxlOgorICB0b2tfeHNkX25pbGxhYmxlCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkQXR0cmlidXRlczoKKyAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JworICAgIHsKKyAgICAgICQkID0gJDM7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1hjZXB0aW9uOgorICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJYY2VwdGlvbiAtPiB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQ0LT5zZXRfbmFtZSgkMik7CisgICAgICAkNC0+c2V0X3hjZXB0aW9uKHRydWUpOworICAgICAgJCQgPSAkNDsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisgICAgfQorCitTZXJ2aWNlOgorICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTZXJ2aWNlIC0+IHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIHsgRnVuY3Rpb25MaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJCA9ICQ2OworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgICQkLT5zZXRfZXh0ZW5kcygkMyk7CisgICAgICBpZiAoJDkgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDktPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ5OworICAgICAgfQorICAgIH0KKworRmxhZ0FyZ3M6CisgICAgeworICAgICAgIGdfYXJnbGlzdCA9IDE7CisgICAgfQorCitVbmZsYWdBcmdzOgorICAgIHsKKyAgICAgICBnX2FyZ2xpc3QgPSAwOworICAgIH0KKworRXh0ZW5kczoKKyAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgICQkID0gTlVMTDsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKKyAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKKyAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitGdW5jdGlvbkxpc3Q6CisgIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOworICAgIH0KKworRnVuY3Rpb246CisgIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDQpOworICAgICAgJDYtPnNldF9uYW1lKHN0ZDo6c3RyaW5nKCQ0KSArICJfYXJncyIpOworICAgICAgJCQgPSBuZXcgdF9mdW5jdGlvbigkMywgJDQsICQ2LCAkOCwgJDIpOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkOTsKKyAgICAgIH0KKyAgICB9CisKK09uZXdheToKKyAgdG9rX29uZXdheQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1Rocm93czoKKyAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJworICAgIHsKKyAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOworICAgICAgJCQgPSAkMzsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgeworICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitGaWVsZExpc3Q6CisgIEZpZWxkTGlzdCBGaWVsZAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7CisgICAgICAkJCA9ICQxOworICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7CisgICAgICAgIHl5ZXJyb3IoIlwiJWQ6ICVzXCIgLSBmaWVsZCBpZGVudGlmaWVyL25hbWUgaGFzIGFscmVhZHkgYmVlbiB1c2VkIiwgJDItPmdldF9rZXkoKSwgJDItPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+ICIpOworICAgICAgeV9maWVsZF92YWwgPSAtMTsKKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitGaWVsZDoKKyAgQ2FwdHVyZURvY1RleHQgRmllbGRJZGVudGlmaWVyIEZpZWxkUmVxdWlyZWRuZXNzIEZpZWxkVHlwZSBGaWVsZFJlZmVyZW5jZSB0b2tfaWRlbnRpZmllciBGaWVsZFZhbHVlIFhzZE9wdGlvbmFsIFhzZE5pbGxhYmxlIFhzZEF0dHJpYnV0ZXMgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygidG9rX2ludF9jb25zdGFudCA6IEZpZWxkIC0+IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOworICAgICAgaWYgKCQyLmF1dG9fYXNzaWduZWQpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIk5vIGZpZWxkIGtleSBzcGVjaWZpZWQgZm9yICVzLCByZXN1bHRpbmcgcHJvdG9jb2wgbWF5IGhhdmUgY29uZmxpY3RzIG9yIG5vdCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSFcbiIsICQ2KTsKKyAgICAgICAgaWYgKGdfc3RyaWN0ID49IDE5MikgeworICAgICAgICAgIHl5ZXJyb3IoIkltcGxpY2l0IGZpZWxkIGtleXMgYXJlIGRlcHJlY2F0ZWQgYW5kIG5vdCBhbGxvd2VkIHdpdGggLXN0cmljdCIpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCQ2KTsKKyAgICAgICQkID0gbmV3IHRfZmllbGQoJDQsICQ2LCAkMi52YWx1ZSk7CisgICAgICAkJC0+c2V0X3JlZmVyZW5jZSgkNSk7CisgICAgICAkJC0+c2V0X3JlcSgkMyk7CisgICAgICBpZiAoJDcgIT0gTlVMTCkgeworICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ3LCAkNCk7CisgICAgICAgIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKCQkLCAkNyk7CisgICAgICAgICQkLT5zZXRfdmFsdWUoJDcpOworICAgICAgfQorICAgICAgJCQtPnNldF94c2Rfb3B0aW9uYWwoJDgpOworICAgICAgJCQtPnNldF94c2RfbmlsbGFibGUoJDkpOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorICAgICAgaWYgKCQxMCAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQxMCk7CisgICAgICB9CisgICAgICBpZiAoJDExICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQxMS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDExOworICAgICAgfQorICAgIH0KKworRmllbGRJZGVudGlmaWVyOgorICB0b2tfaW50X2NvbnN0YW50ICc6JworICAgIHsKKyAgICAgIGlmICgkMSA8PSAwKSB7CisgICAgICAgIGlmIChnX2FsbG93X25lZ19maWVsZF9rZXlzKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGV4aXN0cyB0byBhbGxvdyB1c2VycyB0byBhZGQgZXhwbGljaXRseQorICAgICAgICAgICAqIHNwZWNpZmllZCBrZXkgdmFsdWVzIHRvIG9sZCAudGhyaWZ0IGZpbGVzIHdpdGhvdXQgYnJlYWtpbmcKKyAgICAgICAgICAgKiBwcm90b2NvbCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICgkMSAhPSB5X2ZpZWxkX3ZhbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHdhcm4gaWYgdGhlIHVzZXItc3BlY2lmaWVkIG5lZ2F0aXZlIHZhbHVlIGlzbid0IHdoYXQKKyAgICAgICAgICAgICAqIHRocmlmdCB3b3VsZCBoYXZlIGF1dG8tYXNzaWduZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSBmaWVsZCBrZXkgKCUiIFBSSWk2NCIpIGRpZmZlcnMgZnJvbSB3aGF0IHdvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICJhdXRvLWFzc2lnbmVkIGJ5IHRocmlmdCAoJWQpLlxuIiwgJDEsIHlfZmllbGRfdmFsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMZWF2ZSAkMSBhcy1pcywgYW5kIHVwZGF0ZSB5X2ZpZWxkX3ZhbCB0byBiZSBvbmUgbGVzcyB0aGFuICQxLgorICAgICAgICAgICAqIFRoZSBGaWVsZExpc3QgcGFyc2luZyB3aWxsIGNhdGNoIGFueSBkdXBsaWNhdGUga2V5IHZhbHVlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB5X2ZpZWxkX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxIC0gMSk7CisgICAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7CisgICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSB2YWx1ZSAoJWQpIG5vdCBhbGxvd2VkIGFzIGEgZmllbGQga2V5LlxuIiwKKyAgICAgICAgICAgICAgICAgICAkMSk7CisgICAgICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOworICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAkJC52YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxKTsKKyAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOworICAgICAgfQorICAgICAgaWYoIChTSFJUX01JTiA+ICQkLnZhbHVlKSB8fCAoJCQudmFsdWUgPiBTSFJUX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIkZpZWxkIGtleSAoJWQpIGV4Y2VlZHMgYWxsb3dlZCByYW5nZSAoJWQuLiVkKS5cbiIsCisgICAgICAgICAgICAgICAgICQkLnZhbHVlLCBTSFJUX01JTiwgU0hSVF9NQVgpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07CisgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKKyAgICAgIGlmKCAoU0hSVF9NSU4gPiAkJC52YWx1ZSkgfHwgKCQkLnZhbHVlID4gU0hSVF9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJGaWVsZCBrZXkgKCVkKSBleGNlZWRzIGFsbG93ZWQgcmFuZ2UgKCVkLi4lZCkuXG4iLAorICAgICAgICAgICAgICAgICAkJC52YWx1ZSwgU0hSVF9NSU4sIFNIUlRfTUFYKTsKKyAgICAgIH0KKyAgICB9CisKK0ZpZWxkUmVmZXJlbmNlOgorICB0b2tfcmVmZXJlbmNlCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgIHsKKyAgICAgJCQgPSBmYWxzZTsKKyAgIH0KKworRmllbGRSZXF1aXJlZG5lc3M6CisgIHRva19yZXF1aXJlZAorICAgIHsKKyAgICAgICQkID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICB9Cit8IHRva19vcHRpb25hbAorICAgIHsKKyAgICAgIGlmIChnX2FyZ2xpc3QpIHsKKyAgICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwgIm9wdGlvbmFsIGtleXdvcmQgaXMgaWdub3JlZCBpbiBhcmd1bWVudCBsaXN0cy5cbiIpOworICAgICAgICB9CisgICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworICAgIH0KKworRmllbGRWYWx1ZToKKyAgJz0nIENvbnN0VmFsdWUKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSAkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworRnVuY3Rpb25UeXBlOgorICBGaWVsZFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiBGaWVsZFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCB0b2tfdm9pZAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IHRva192b2lkIik7CisgICAgICAkJCA9IGdfdHlwZV92b2lkOworICAgIH0KKworRmllbGRUeXBlOgorICB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IHRva19pZGVudGlmaWVyIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7CisgICAgICAgIC8vIElnbm9yZSBpZGVudGlmaWVycyBpbiBpbmNsdWRlIG1vZGUKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTG9va3VwIHRoZSBpZGVudGlmaWVyIGluIHRoZSBjdXJyZW50IHNjb3BlCisgICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3R5cGUoJDEpOworICAgICAgICBpZiAoJCQgPT0gTlVMTCkgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogRWl0aGVyIHRoaXMgdHlwZSBpc24ndCB5ZXQgZGVjbGFyZWQsIG9yIGl0J3MgbmV2ZXIKKyAgICAgICAgICAgICBkZWNsYXJlZC4gIEVpdGhlciB3YXkgYWxsb3cgaXQgYW5kIHdlJ2xsIGZpZ3VyZSBpdCBvdXQKKyAgICAgICAgICAgICBkdXJpbmcgZ2VuZXJhdGlvbi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit8IEJhc2VUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQmFzZVR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBDb250YWluZXJUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQ29udGFpbmVyVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0Jhc2VUeXBlOiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoKnN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4oJDEpKTsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gJDE7CisgICAgICB9CisgICAgfQorCitTaW1wbGVCYXNlVHlwZToKKyAgdG9rX3N0cmluZworICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3N0cmluZyIpOworICAgICAgJCQgPSBnX3R5cGVfc3RyaW5nOworICAgIH0KK3wgdG9rX2JpbmFyeQorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2JpbmFyeSIpOworICAgICAgJCQgPSBnX3R5cGVfYmluYXJ5OworICAgIH0KK3wgdG9rX3NsaXN0CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc2xpc3QiKTsKKyAgICAgICQkID0gZ190eXBlX3NsaXN0OworICAgIH0KK3wgdG9rX2Jvb2wKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ib29sIik7CisgICAgICAkJCA9IGdfdHlwZV9ib29sOworICAgIH0KK3wgdG9rX2k4CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTgiKTsKKyAgICAgICQkID0gZ190eXBlX2k4OworICAgIH0KK3wgdG9rX2kxNgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kxNiIpOworICAgICAgJCQgPSBnX3R5cGVfaTE2OworICAgIH0KK3wgdG9rX2kzMgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kzMiIpOworICAgICAgJCQgPSBnX3R5cGVfaTMyOworICAgIH0KK3wgdG9rX2k2NAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k2NCIpOworICAgICAgJCQgPSBnX3R5cGVfaTY0OworICAgIH0KK3wgdG9rX2RvdWJsZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2RvdWJsZSIpOworICAgICAgJCQgPSBnX3R5cGVfZG91YmxlOworICAgIH0KKworQ29udGFpbmVyVHlwZTogU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnRhaW5lclR5cGUgLT4gU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICQkID0gJDE7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQyOworICAgICAgfQorICAgIH0KKworU2ltcGxlQ29udGFpbmVyVHlwZToKKyAgTWFwVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBNYXBUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgU2V0VHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBTZXRUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgTGlzdFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTGlzdFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitNYXBUeXBlOgorICB0b2tfbWFwIENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JworICAgIHsKKyAgICAgIHBkZWJ1ZygiTWFwVHlwZSAtPiB0b2tfbWFwIDxGaWVsZFR5cGUsIEZpZWxkVHlwZT4iKTsKKyAgICAgICQkID0gbmV3IHRfbWFwKCQ0LCAkNik7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOworICAgICAgfQorICAgIH0KKworU2V0VHlwZToKKyAgdG9rX3NldCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJz4nCisgICAgeworICAgICAgcGRlYnVnKCJTZXRUeXBlIC0+IHRva19zZXQ8RmllbGRUeXBlPiIpOworICAgICAgJCQgPSBuZXcgdF9zZXQoJDQpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgIH0KKyAgICB9CisKK0xpc3RUeXBlOgorICB0b2tfbGlzdCAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJMaXN0VHlwZSAtPiB0b2tfbGlzdDxGaWVsZFR5cGU+Iik7CisgICAgICBjaGVja19mb3JfbGlzdF9vZl9ieXRlcygkMyk7CisgICAgICAkJCA9IG5ldyB0X2xpc3QoJDMpOworICAgICAgaWYgKCQ1ICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDUpKTsKKyAgICAgIH0KKyAgICB9CisKK0NwcFR5cGU6CisgIHRva19jcHBfdHlwZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uczoKKyAgJygnIFR5cGVBbm5vdGF0aW9uTGlzdCAnKScKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9ucyAtPiAoIFR5cGVBbm5vdGF0aW9uTGlzdCApIik7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbkxpc3Q6CisgIFR5cGVBbm5vdGF0aW9uTGlzdCBUeXBlQW5ub3RhdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25MaXN0IC0+IFR5cGVBbm5vdGF0aW9uTGlzdCAsIFR5cGVBbm5vdGF0aW9uIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFubm90YXRpb25zX1skMi0+a2V5XSA9ICQyLT52YWw7CisgICAgICBkZWxldGUgJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIC8qIEp1c3QgdXNlIGEgZHVtbXkgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGFubm90YXRpb25zLiAqLworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uOgorICB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvblZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb24gLT4gVHlwZUFubm90YXRpb25WYWx1ZSIpOworICAgICAgJCQgPSBuZXcgdF9hbm5vdGF0aW9uOworICAgICAgJCQtPmtleSA9ICQxOworICAgICAgJCQtPnZhbCA9ICQyOworICAgIH0KKworVHlwZUFubm90YXRpb25WYWx1ZToKKyAgJz0nIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvblZhbHVlIC0+ID0gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiIpOworICAgICAgJCQgPSBzdHJkdXAoIjEiKTsKKyAgICB9CisKKyUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbgpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9WRVJTSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfVkVSU0lPTl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCisKKyNlbmRpZiAvLyBfVEhSSUZUX1ZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgorI2VuZGlmCisKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorCisjZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKKworI2lmbmRlZiBQUkl1NjQKKyNkZWZpbmUgUFJJdTY0ICJJNjR1IgorI2VuZGlmCisKKyNpZm5kZWYgUFJJaTY0CisjZGVmaW5lIFBSSWk2NCAiSTY0aSIKKyNlbmRpZgorLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KQorLy8gc3F1ZWxjaCBib29sIGNvbnZlcnNpb24gcGVyZm9ybWFuY2Ugd2FybmluZworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0ODAwKQorCisvLyBNU1ZDMTAgKDIwMTApIG9yIGxhdGVyIGhhcyBzdGRpbnQuaAorI2lmIF9NU0NfVkVSID49IDE2MDAKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKworLy8gTXVzdCBiZSB1c2luZyBWUzIwMTAgb3IgbGF0ZXIsIG9yIGJvb3N0LCBzbyB0aGF0IEM5OSB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjaW5jbHVkZSA8Ym9vc3QvY3N0ZGludC5ocHA+CisKK3R5cGVkZWYgYm9vc3Q6OmludDY0X3QgaW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ2NF90IHVpbnQ2NF90OwordHlwZWRlZiBib29zdDo6aW50MzJfdCBpbnQzMl90OwordHlwZWRlZiBib29zdDo6dWludDMyX3QgdWludDMyX3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQxNl90IGludDE2X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MTZfdCB1aW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDhfdCBpbnQ4X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50OF90IHVpbnQ4X3Q7CisjZW5kaWYKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyY2IyZi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRocmlmdCBzY2FubmVyLgotICoKLSAqIFRva2VuaXplcyBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCi0gKi8KLQotJXsKLQotLyogVGhpcyBpcyByZWR1bmRhbnQgd2l0aCBzb21lIG9mIHRoZSBmbGFncyBpbiBNYWtlZmlsZS5hbSwgYnV0IGl0IHdvcmtzCi0gKiB3aGVuIHBlb3BsZSBvdmVycmlkZSBDWFhGTEFHUyB3aXRob3V0IGJlaW5nIGNhcmVmdWwuIFRoZSBwcmFnbWFzIGFyZQotICogdGhlICdyaWdodCcgd2F5IHRvIGRvIGl0LCBidXQgZG9uJ3Qgd29yayBvbiBvbGQtZW5vdWdoIEdDQyAoaW4gcGFydGljdWxhcgotICogdGhlIEdDQyB0aGF0IHNoaXAgb24gTWFjIE9TIFggMTAuNi41LCAqY291bnRlciogdG8gd2hhdCB0aGUgR05VIGRvY3Mgc2F5KQotICoKLSAqIFdlIHNob3VsZCByZXZlcnQgdGhlIE1ha2VmaWxlLmFtIGNoYW5nZXMgb25jZSBBcHBsZSBzaGlwcyBhIHJlYXNvbmFibGUKLSAqIEdDQy4KLSAqLwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0KLS8qKgotICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKLSAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgotICovCi0jaW5jbHVkZSAidGhyaWZ0eS5oIgotCi12b2lkIHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKGNoYXIqIGtleXdvcmQpIHsKLSAgeXllcnJvcigiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkOiBcIiVzXCJcbiIsIGtleXdvcmQpOwotICBleGl0KDEpOwotfQotCi12b2lkIGludGVnZXJfb3ZlcmZsb3coY2hhciogdGV4dCkgewotICB5eWVycm9yKCJUaGlzIGludGVnZXIgaXMgdG9vIGJpZzogXCIlc1wiXG4iLCB0ZXh0KTsKLSAgZXhpdCgxKTsKLX0KLQotJX0KLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgeXlsaW5lbm8gZ2xvYmFsLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvdXRwdXQKLSAqLwotJW9wdGlvbiBsZXgtY29tcGF0Ci0KLS8qKgotICogT3VyIGlucHV0cyBhcmUgYWxsIHNpbmdsZSBmaWxlcywgc28gbm8gbmVlZCBmb3IgeXl3cmFwCi0gKi8KLSVvcHRpb24gbm95eXdyYXAKLQotLyoqCi0gKiBXZSBkb24ndCB1c2UgaXQsIGFuZCBpdCBmaXJlcyB1cCB3YXJuaW5ncyBhdCAtV2FsbAotICovCi0lb3B0aW9uIG5vdW5wdXQKLQotLyoqCi0gKiBIZWxwZXIgZGVmaW5pdGlvbnMsIGNvbW1lbnRzLCBjb25zdGFudHMsIGFuZCB3aGF0bm90Ci0gKi8KLQotaW50Y29uc3RhbnQgICAoWystXT9bMC05XSspCi1oZXhjb25zdGFudCAgICgiMHgiWzAtOUEtRmEtZl0rKQotZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKLWlkZW50aWZpZXIgICAgKFthLXpBLVpfXVtcLmEtekEtWl8wLTldKikKLXdoaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCi1zaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCi1tdWx0aWNvbW0gICAgICgiLyoiW14qXSIvIiooW14qL118W14qXSIvInwiKiJbXi9dKSoiKiIqIiovIikKLWRvY3RleHQgICAgICAgKCIvKioiKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1jb21tZW50ICAgICAgICgiLy8iW15cbl0qKQotdW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQotc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKLXN0X2lkZW50aWZpZXIgKFthLXpBLVotXVtcLmEtekEtWl8wLTktXSopCi1saXRlcmFsX2JlZ2luIChbJ1wiXSkKLQotJSUKLQote3doaXRlc3BhY2V9ICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17c2lsbHljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXttdWx0aWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote2NvbW1lbnR9ICAgICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17dW5peGNvbW1lbnR9ICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLQote3N5bWJvbH0gICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9Ci0KLSJuYW1lc3BhY2UiICAgICAgICAgIHsgcmV0dXJuIHRva19uYW1lc3BhY2U7ICAgICAgICAgICAgfQotImNwcF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX2NwcF9uYW1lc3BhY2U7ICAgICAgICB9Ci0iY3BwX2luY2x1ZGUiICAgICAgICB7IHJldHVybiB0b2tfY3BwX2luY2x1ZGU7ICAgICAgICAgIH0KLSJjcHBfdHlwZSIgICAgICAgICAgIHsgcmV0dXJuIHRva19jcHBfdHlwZTsgICAgICAgICAgICAgfQotImphdmFfcGFja2FnZSIgICAgICAgeyByZXR1cm4gdG9rX2phdmFfcGFja2FnZTsgICAgICAgICB9Ci0iY29jb2FfcHJlZml4IiAgICAgICB7IHJldHVybiB0b2tfY29jb2FfcHJlZml4OyAgICAgICAgIH0KLSJjc2hhcnBfbmFtZXNwYWNlIiAgIHsgcmV0dXJuIHRva19jc2hhcnBfbmFtZXNwYWNlOyAgICAgfQotInBocF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3BocF9uYW1lc3BhY2U7ICAgICAgICB9Ci0icHlfbW9kdWxlIiAgICAgICAgICB7IHJldHVybiB0b2tfcHlfbW9kdWxlOyAgICAgICAgICAgIH0KLSJwZXJsX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19wZXJsX3BhY2thZ2U7ICAgICAgICAgfQotInJ1YnlfbmFtZXNwYWNlIiAgICAgeyByZXR1cm4gdG9rX3J1YnlfbmFtZXNwYWNlOyAgICAgICB9Ci0ic21hbGx0YWxrX2NhdGVnb3J5IiB7IHJldHVybiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5OyAgIH0KLSJzbWFsbHRhbGtfcHJlZml4IiAgIHsgcmV0dXJuIHRva19zbWFsbHRhbGtfcHJlZml4OyAgICAgfQotInhzZF9hbGwiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hbGw7ICAgICAgICAgICAgICB9Ci0ieHNkX29wdGlvbmFsIiAgICAgICB7IHJldHVybiB0b2tfeHNkX29wdGlvbmFsOyAgICAgICAgIH0KLSJ4c2RfbmlsbGFibGUiICAgICAgIHsgcmV0dXJuIHRva194c2RfbmlsbGFibGU7ICAgICAgICAgfQotInhzZF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3hzZF9uYW1lc3BhY2U7ICAgICAgICB9Ci0ieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KLSJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQotInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9Ci0iYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KLSJieXRlIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ieXRlOyAgICAgICAgICAgICAgICAgfQotImkxNiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kxNjsgICAgICAgICAgICAgICAgICB9Ci0iaTMyIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTMyOyAgICAgICAgICAgICAgICAgIH0KLSJpNjQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pNjQ7ICAgICAgICAgICAgICAgICAgfQotImRvdWJsZSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2RvdWJsZTsgICAgICAgICAgICAgICB9Ci0ic3RyaW5nIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RyaW5nOyAgICAgICAgICAgICAgIH0KLSJiaW5hcnkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19iaW5hcnk7ICAgICAgICAgICAgICAgfQotInNsaXN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NsaXN0OyAgICAgICAgICAgICAgICB9Ci0ic2VudW0iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VudW07ICAgICAgICAgICAgICAgIH0KLSJtYXAiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19tYXA7ICAgICAgICAgICAgICAgICAgfQotImxpc3QiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2xpc3Q7ICAgICAgICAgICAgICAgICB9Ci0ic2V0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2V0OyAgICAgICAgICAgICAgICAgIH0KLSJvbmV3YXkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19vbmV3YXk7ICAgICAgICAgICAgICAgfQotInR5cGVkZWYiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3R5cGVkZWY7ICAgICAgICAgICAgICB9Ci0ic3RydWN0IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RydWN0OyAgICAgICAgICAgICAgIH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva191bmlvbjsgICAgICAgICAgICAgICAgfQotImV4Y2VwdGlvbiIgICAgICAgICAgeyByZXR1cm4gdG9rX3hjZXB0aW9uOyAgICAgICAgICAgICB9Ci0iZXh0ZW5kcyIgICAgICAgICAgICB7IHJldHVybiB0b2tfZXh0ZW5kczsgICAgICAgICAgICAgIH0KLSJ0aHJvd3MiICAgICAgICAgICAgIHsgcmV0dXJuIHRva190aHJvd3M7ICAgICAgICAgICAgICAgfQotInNlcnZpY2UiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NlcnZpY2U7ICAgICAgICAgICAgICB9Ci0iZW51bSIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfZW51bTsgICAgICAgICAgICAgICAgIH0KLSJjb25zdCIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19jb25zdDsgICAgICAgICAgICAgICAgfQotInJlcXVpcmVkIiAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlcXVpcmVkOyAgICAgICAgICAgICB9Ci0ib3B0aW9uYWwiICAgICAgICAgICB7IHJldHVybiB0b2tfb3B0aW9uYWw7ICAgICAgICAgICAgIH0KLSJhc3luYyIgewotICBwd2FybmluZygwLCAiXCJhc3luY1wiIGlzIGRlcHJlY2F0ZWQuICBJdCBpcyBjYWxsZWQgXCJvbmV3YXlcIiBub3cuXG4iKTsKLSAgcmV0dXJuIHRva19vbmV3YXk7Ci19Ci0KLQotIkJFR0lOIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iRU5EIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0NMQVNTX18iICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRElSX18iICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GSUxFX18iICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0ZVTkNUSU9OX18iICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTElORV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19NRVRIT0RfXyIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX05BTUVTUEFDRV9fIiAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFic3RyYWN0IiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYWxpYXMiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFyZ3MiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhc3NlcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJlZ2luIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYnJlYWsiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNhdGNoIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xhc3MiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjbG9uZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNvbnRpbnVlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVjbGFyZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWYiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlZmF1bHQiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWxldGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRvIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZHluYW1pYyIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbGlmIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2UiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzZWlmIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNpZiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZGVjbGFyZSIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3IiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGZvcmVhY2giICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRzd2l0Y2giICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZHdoaWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5zdXJlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGNlcHQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImV4ZWMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmFsc2UiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmaW5hbGx5IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZsb2F0IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZm9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmb3JlYWNoIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZ1bmN0aW9uIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ2xvYmFsIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJnb3RvIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlmIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wbGVtZW50cyIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbXBvcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImluIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5saW5lIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnN0YW5jZW9mIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImludGVyZmFjZSIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJsYW1iZGEiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm1vZHVsZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmF0aXZlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuZXciICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5leHQiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmlsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJub3QiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm9yIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icGFzcyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwdWJsaWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByaW50IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpdmF0ZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcm90ZWN0ZWQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInB1YmxpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmFpc2UiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZWRvIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlc2N1ZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0cnkiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZWdpc3RlciIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJldHVybiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic2VsZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzaXplb2YiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN0YXRpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3VwZXIiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzd2l0Y2giICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN5bmNocm9uaXplZCIgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aGlzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRocm93IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idHJhbnNpZW50IiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cnVlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyeSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5kZWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVubGVzcyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5zaWduZWQiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnRpbCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVzZSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmFyIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2aXJ0dWFsIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZvbGF0aWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aGlsZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndpdGgiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieG9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCi17aW50Y29uc3RhbnR9IHsKLSAgZXJybm8gPSAwOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2hleGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0KzIsIE5VTEwsIDE2KTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2R1YmNvbnN0YW50fSB7Ci0gIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfZHViX2NvbnN0YW50OwotfQotCi17aWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19pZGVudGlmaWVyOwotfQotCi17c3RfaWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19zdF9pZGVudGlmaWVyOwotfQotCi17bGl0ZXJhbF9iZWdpbn0gewotICBjaGFyIG1hcmsgPSB5eXRleHRbMF07Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yKDs7KQotICB7Ci0gICAgaW50IGNoID0geXlpbnB1dCgpOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgRU9GOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOwotICAgICAgICBleGl0KDEpOwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2ggPSB5eWlucHV0KCk7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChjaCA9PSBtYXJrKSB7Ci0gICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi17ZG9jdGV4dH0gewotIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KLSAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLwotICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHl5dGV4dCArIDMpOwotICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJ1wwJzsKLSAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7Ci0gICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOwotICB9Ci19Ci0KLQotLiB7Ci0gIC8qIENhdGNoLWFsbCB0byBsZXQgdXMgY2F0Y2ggIioiIGluIHRoZSBwYXJzZXIuICovCi0gIHJldHVybiAoaW50KSB5eXRleHRbMF07Ci19Ci0KLSUlCi0KLS8qIHZpbTogZmlsZXR5cGU9bGV4Ci0qLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE0OWNkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorKysgL2Rldi9udWxsCkBAIC0xLDExNDkgKzAsMCBAQAotJXsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgcGFyc2VyLgotICoKLSAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICoKLSAqLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0KLS8qKgotICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KLSAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgotICovCi1pbnQgeV9maWVsZF92YWwgPSAtMTsKLWludCBnX2FyZ2xpc3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7Ci0KLSV9Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgotICovCi0ldW5pb24gewotICBjaGFyKiAgICAgICAgICBpZDsKLSAgaW50NjRfdCAgICAgICAgaWNvbnN0OwotICBkb3VibGUgICAgICAgICBkY29uc3Q7Ci0gIGJvb2wgICAgICAgICAgIHRib29sOwotICB0X2RvYyogICAgICAgICB0ZG9jOwotICB0X3R5cGUqICAgICAgICB0dHlwZTsKLSAgdF9iYXNlX3R5cGUqICAgdGJhc2U7Ci0gIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOwotICB0X2VudW0qICAgICAgICB0ZW51bTsKLSAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OwotICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7Ci0gIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7Ci0gIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7Ci0gIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOwotICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247Ci0gIHRfZmllbGQqICAgICAgIHRmaWVsZDsKLSAgY2hhciogICAgICAgICAgZHRleHQ7Ci0gIHRfZmllbGQ6OmVfcmVxIGVyZXE7Ci0gIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKLX0KLQotLyoqCi0gKiBTdHJpbmdzIGlkZW50aWZpZXIKLSAqLwotJXRva2VuPGlkPiAgICAgdG9rX2lkZW50aWZpZXIKLSV0b2tlbjxpZD4gICAgIHRva19saXRlcmFsCi0ldG9rZW48ZHRleHQ+ICB0b2tfZG9jdGV4dAotJXRva2VuPGlkPiAgICAgdG9rX3N0X2lkZW50aWZpZXIKLQotLyoqCi0gKiBDb25zdGFudCB2YWx1ZXMKLSAqLwotJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAotJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAotCi0vKioKLSAqIEhlYWRlciBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX2luY2x1ZGUKLSV0b2tlbiB0b2tfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2NwcF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfY3BwX2luY2x1ZGUKLSV0b2tlbiB0b2tfY3BwX3R5cGUKLSV0b2tlbiB0b2tfcGhwX25hbWVzcGFjZQotJXRva2VuIHRva19weV9tb2R1bGUKLSV0b2tlbiB0b2tfcGVybF9wYWNrYWdlCi0ldG9rZW4gdG9rX2phdmFfcGFja2FnZQotJXRva2VuIHRva194c2RfYWxsCi0ldG9rZW4gdG9rX3hzZF9vcHRpb25hbAotJXRva2VuIHRva194c2RfbmlsbGFibGUKLSV0b2tlbiB0b2tfeHNkX25hbWVzcGFjZQotJXRva2VuIHRva194c2RfYXR0cnMKLSV0b2tlbiB0b2tfcnVieV9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5Ci0ldG9rZW4gdG9rX3NtYWxsdGFsa19wcmVmaXgKLSV0b2tlbiB0b2tfY29jb2FfcHJlZml4Ci0ldG9rZW4gdG9rX2NzaGFycF9uYW1lc3BhY2UKLQotLyoqCi0gKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfdm9pZAotJXRva2VuIHRva19ib29sCi0ldG9rZW4gdG9rX2J5dGUKLSV0b2tlbiB0b2tfc3RyaW5nCi0ldG9rZW4gdG9rX2JpbmFyeQotJXRva2VuIHRva19zbGlzdAotJXRva2VuIHRva19zZW51bQotJXRva2VuIHRva19pMTYKLSV0b2tlbiB0b2tfaTMyCi0ldG9rZW4gdG9rX2k2NAotJXRva2VuIHRva19kb3VibGUKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19tYXAKLSV0b2tlbiB0b2tfbGlzdAotJXRva2VuIHRva19zZXQKLQotLyoqCi0gKiBGdW5jdGlvbiBtb2RpZmllcnMKLSAqLwotJXRva2VuIHRva19vbmV3YXkKLQotLyoqCi0gKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKLSAqLwotJXRva2VuIHRva190eXBlZGVmCi0ldG9rZW4gdG9rX3N0cnVjdAotJXRva2VuIHRva194Y2VwdGlvbgotJXRva2VuIHRva190aHJvd3MKLSV0b2tlbiB0b2tfZXh0ZW5kcwotJXRva2VuIHRva19zZXJ2aWNlCi0ldG9rZW4gdG9rX2VudW0KLSV0b2tlbiB0b2tfY29uc3QKLSV0b2tlbiB0b2tfcmVxdWlyZWQKLSV0b2tlbiB0b2tfb3B0aW9uYWwKLSV0b2tlbiB0b2tfdW5pb24KLQotLyoqCi0gKiBHcmFtbWFyIG5vZGVzCi0gKi8KLQotJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCi0ldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCi0KLSV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgotJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgotCi0ldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKLQotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKLSV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0Ci0ldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCi0KLSV0eXBlPHRmaWVsZD4gICAgRmllbGQKLSV0eXBlPGljb25zdD4gICAgRmllbGRJZGVudGlmaWVyCi0ldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCi0ldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQotJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCi0ldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAotCi0ldHlwZTx0ZW51bT4gICAgIEVudW0KLSV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKLSV0eXBlPHRlbnVtdj4gICAgRW51bURlZgotCi0ldHlwZTx0dHlwZWRlZj4gIFNlbnVtCi0ldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAotJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgotCi0ldHlwZTx0Y29uc3Q+ICAgIENvbnN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKLQotJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCi0ldHlwZTx0c3RydWN0PiAgIFN0cnVjdAotJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgotJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCi0KLSV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KLSV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCi0ldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAotCi0ldHlwZTx0c3RydWN0PiAgIFRocm93cwotJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCi0ldHlwZTx0Ym9vbD4gICAgIE9uZXdheQotJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKLSV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKLSV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKLSV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcwotJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCi0KLSV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKLQotJSUKLQotLyoqCi0gKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQotICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAotICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KLSAqLwotCi1Qcm9ncmFtOgotICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKLSAgICAgIC8qCi0gICAgICBUT0RPKGRyZWlzcyk6IERlY2lkZSB3aGV0aGVyIGZ1bGwtcHJvZ3JhbSBkb2N0ZXh0IGlzIHdvcnRoIHRoZSB0cm91YmxlLgotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgICovCi0gICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgfQotCi1DYXB0dXJlRG9jVGV4dDoKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX2RvY3RleHQ7Ci0gICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KLURlc3Ryb3lEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0Ci0gICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLwotSGVhZGVyTGlzdDoKLSAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOwotICAgIH0KLQotSGVhZGVyOgotICBJbmNsdWRlCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOwotICAgIH0KLXwgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInY3BwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3BwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3BwIiwgJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BocF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBocCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBocCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncHlfbW9kdWxlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBweScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicHkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19wZXJsX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BlcmxfcGFja2FnZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcGVybCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BlcmxfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwZXJsIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3J1YnlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSByYicgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJyYiIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19jYXRlZ29yeSB0b2tfc3RfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX2NhdGVnb3J5JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHNtYWxsdGFsay5wcmVmaXgnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidqYXZhX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGphdmEnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImphdmEiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NvY29hX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY29jb2EnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNvY29hIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIneHNkX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgeHNkJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICB7Ci0gICAgIHB3YXJuaW5nKDEsICInY3NoYXJwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3NoYXJwJyBpbnN0ZWFkIik7Ci0gICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3NoYXJwIiwgJDIpOwotICAgICB9Ci0gICB9Ci0KLUluY2x1ZGU6Ci0gIHRva19pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJJbmNsdWRlIC0+IHRva19pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKLSAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLURlZmluaXRpb25MaXN0OgotICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7Ci0gICAgICAgICQzLT5zZXRfZG9jKCQyKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKLSAgICB9Ci0KLURlZmluaXRpb246Ci0gIENvbnN0Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFR5cGVEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNlcnZpY2UKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotVHlwZURlZmluaXRpb246Ci0gIFR5cGVkZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IEVudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFNlbnVtCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgU3RydWN0Ci0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOwotICAgICAgfQotICAgIH0KLXwgWGNlcHRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOwotICAgICAgfQotICAgIH0KLQotVHlwZWRlZjoKLSAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOwotICAgICAgJCQgPSB0ZDsKLSAgICB9Ci0KLUNvbW1hT3JTZW1pY29sb25PcHRpb25hbDoKLSAgJywnCi0gICAge30KLXwgJzsnCi0gICAge30KLXwKLSAgICB7fQotCi1FbnVtOgotICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtIC0+IHRva19lbnVtIHRva19pZGVudGlmaWVyIHsgRW51bURlZkxpc3QgfSIpOwotICAgICAgJCQgPSAkNDsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+cmVzb2x2ZV92YWx1ZXMoKTsKLSAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOwotICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOwotICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1FbnVtRGVmTGlzdDoKLSAgRW51bURlZkxpc3QgRW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hcHBlbmQoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOwotICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1FbnVtRGVmOgotICBDYXB0dXJlRG9jVGV4dCB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWYgLT4gdG9rX2lkZW50aWZpZXIgPSB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICBpZiAoJDQgPCAwKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJOZWdhdGl2ZSB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcy5cbiIsICQyKTsKLSAgICAgIH0KLSAgICAgIGlmICgkNCA+IElOVF9NQVgpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcy5cbiIsICQyKTsKLSAgICAgIH0KLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMiwgJDQpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgQ2FwdHVyZURvY1RleHQgdG9rX2lkZW50aWZpZXIgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgIH0KLQotU2VudW06Ci0gIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKLSAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQ0LCAkMik7Ci0gICAgfQotCi1TZW51bURlZkxpc3Q6Ci0gIFNlbnVtRGVmTGlzdCBTZW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7Ci0gICAgfQotCi1TZW51bURlZjoKLSAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0OgotICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7Ci0gICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7Ci0gICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOwotCi0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotQ29uc3RWYWx1ZToKLSAgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOwotICAgICAgaWYgKCQxIDwgSU5UMzJfTUlOIHx8ICQxID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIlBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19kdWJfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9kb3VibGUoJDEpOwotICAgIH0KLXwgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOwotICAgIH0KLXwgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7Ci0gICAgfQotfCBDb25zdExpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29uc3RNYXAKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1Db25zdExpc3Q6Ci0gICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdExpc3RDb250ZW50czoKLSAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9saXN0KCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9saXN0KCk7Ci0gICAgfQotCi1Db25zdE1hcDoKLSAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci0KLUNvbnN0TWFwQ29udGVudHM6Ci0gIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9tYXAoKTsKLSAgICB9Ci0KLVN0cnVjdEhlYWQ6Ci0gIHRva19zdHJ1Y3QKLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7Ci0gICAgfQotfCB0b2tfdW5pb24KLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKLSAgICB9Ci0KLVN0cnVjdDoKLSAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNS0+c2V0X3hzZF9hbGwoJDMpOwotICAgICAgJDUtPnNldF91bmlvbigkMSA9PSBzdHJ1Y3RfaXNfdW5pb24pOwotICAgICAgJCQgPSAkNTsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICBpZiAoJDcgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDctPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ3OwotICAgICAgfQotICAgIH0KLSAgICAKLVhzZEFsbDoKLSAgdG9rX3hzZF9hbGwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2RPcHRpb25hbDoKLSAgdG9rX3hzZF9vcHRpb25hbAotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZE5pbGxhYmxlOgotICB0b2tfeHNkX25pbGxhYmxlCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkQXR0cmlidXRlczoKLSAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JwotICAgIHsKLSAgICAgICQkID0gJDM7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVhjZXB0aW9uOgotICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIlhjZXB0aW9uIC0+IHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNC0+c2V0X25hbWUoJDIpOwotICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgfQotCi1TZXJ2aWNlOgotICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlcnZpY2UgLT4gdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgeyBGdW5jdGlvbkxpc3QgfSIpOwotICAgICAgJCQgPSAkNjsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOwotICAgIH0KLQotRmxhZ0FyZ3M6Ci0gICAgewotICAgICAgIGdfYXJnbGlzdCA9IDE7Ci0gICAgfQotCi1VbmZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAwOwotICAgIH0KLQotRXh0ZW5kczoKLSAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gTlVMTDsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1GdW5jdGlvbkxpc3Q6Ci0gIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOwotICAgIH0KLQotRnVuY3Rpb246Ci0gIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKLSAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICB9Ci0KLU9uZXdheToKLSAgdG9rX29uZXdheQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVRocm93czoKLSAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOwotICAgICAgJCQgPSAkMzsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgewotICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GaWVsZExpc3Q6Ci0gIEZpZWxkTGlzdCBGaWVsZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7Ci0gICAgICAgIHl5ZXJyb3IoIkZpZWxkIGlkZW50aWZpZXIgJWQgZm9yIFwiJXNcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiLCAkMi0+Z2V0X2tleSgpLCAkMi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gIik7Ci0gICAgICB5X2ZpZWxkX3ZhbCA9IC0xOwotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZpZWxkOgotICBDYXB0dXJlRG9jVGV4dCBGaWVsZElkZW50aWZpZXIgRmllbGRSZXF1aXJlZG5lc3MgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIEZpZWxkVmFsdWUgWHNkT3B0aW9uYWwgWHNkTmlsbGFibGUgWHNkQXR0cmlidXRlcyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJ0b2tfaW50X2NvbnN0YW50IDogRmllbGQgLT4gRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoJDIgPCAwKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNSk7Ci0gICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKLSAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNSwgJDIpOwotICAgICAgJCQtPnNldF9yZXEoJDMpOwotICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKLSAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNiwgJDQpOwotICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDYpOwotICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ2KTsKLSAgICAgIH0KLSAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ3KTsKLSAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ4KTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkOSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQ5KTsKLSAgICAgIH0KLSAgICAgIGlmICgkMTAgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDEwLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMTA7Ci0gICAgICB9Ci0gICAgfQotCi1GaWVsZElkZW50aWZpZXI6Ci0gIHRva19pbnRfY29uc3RhbnQgJzonCi0gICAgewotICAgICAgaWYgKCQxIDw9IDApIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIHZhbHVlICglZCkgbm90IGFsbG93ZWQgYXMgYSBmaWVsZCBrZXkuXG4iLCAkMSk7Ci0gICAgICAgICQxID0geV9maWVsZF92YWwtLTsKLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0geV9maWVsZF92YWwtLTsKLSAgICB9Ci0KLUZpZWxkUmVxdWlyZWRuZXNzOgotICB0b2tfcmVxdWlyZWQKLSAgICB7Ci0gICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgfQotfCB0b2tfb3B0aW9uYWwKLSAgICB7Ci0gICAgICBpZiAoZ19hcmdsaXN0KSB7Ci0gICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKLSAgICAgICAgfQotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICB9Ci0KLUZpZWxkVmFsdWU6Ci0gICc9JyBDb25zdFZhbHVlCi0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLUZ1bmN0aW9uVHlwZToKLSAgRmllbGRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgdG9rX3ZvaWQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOwotICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKLSAgICB9Ci0KLUZpZWxkVHlwZToKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgewotICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCi0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMSk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLXwgQmFzZVR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBCYXNlVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IENvbnRhaW5lclR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBDb250YWluZXJUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQmFzZVR5cGU6IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgqc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPigkMSkpOwotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSAkMTsKLSAgICAgIH0KLSAgICB9Ci0KLVNpbXBsZUJhc2VUeXBlOgotICB0b2tfc3RyaW5nCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc3RyaW5nIik7Ci0gICAgICAkJCA9IGdfdHlwZV9zdHJpbmc7Ci0gICAgfQotfCB0b2tfYmluYXJ5Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYmluYXJ5Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9iaW5hcnk7Ci0gICAgfQotfCB0b2tfc2xpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zbGlzdCIpOwotICAgICAgJCQgPSBnX3R5cGVfc2xpc3Q7Ci0gICAgfQotfCB0b2tfYm9vbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2Jvb2wiKTsKLSAgICAgICQkID0gZ190eXBlX2Jvb2w7Ci0gICAgfQotfCB0b2tfYnl0ZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2J5dGUiKTsKLSAgICAgICQkID0gZ190eXBlX2J5dGU7Ci0gICAgfQotfCB0b2tfaTE2Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTE2Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9pMTY7Ci0gICAgfQotfCB0b2tfaTMyCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTMyIik7Ci0gICAgICAkJCA9IGdfdHlwZV9pMzI7Ci0gICAgfQotfCB0b2tfaTY0Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTY0Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9pNjQ7Ci0gICAgfQotfCB0b2tfZG91YmxlCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfZG91YmxlIik7Ci0gICAgICAkJCA9IGdfdHlwZV9kb3VibGU7Ci0gICAgfQotCi1Db250YWluZXJUeXBlOiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29udGFpbmVyVHlwZSAtPiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDI7Ci0gICAgICB9Ci0gICAgfQotCi1TaW1wbGVDb250YWluZXJUeXBlOgotICBNYXBUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IE1hcFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBTZXRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IFNldFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBMaXN0VHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBMaXN0VHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLU1hcFR5cGU6Ci0gIHRva19tYXAgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCi0gICAgewotICAgICAgcGRlYnVnKCJNYXBUeXBlIC0+IHRva19tYXAgPEZpZWxkVHlwZSwgRmllbGRUeXBlPiIpOwotICAgICAgJCQgPSBuZXcgdF9tYXAoJDQsICQ2KTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICB9Ci0gICAgfQotCi1TZXRUeXBlOgotICB0b2tfc2V0IENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnPicKLSAgICB7Ci0gICAgICBwZGVidWcoIlNldFR5cGUgLT4gdG9rX3NldDxGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X3NldCgkNCk7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgfQotICAgIH0KLQotTGlzdFR5cGU6Ci0gIHRva19saXN0ICc8JyBGaWVsZFR5cGUgJz4nIENwcFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkxpc3RUeXBlIC0+IHRva19saXN0PEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfbGlzdCgkMyk7Ci0gICAgICBpZiAoJDUgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkNSkpOwotICAgICAgfQotICAgIH0KLQotQ3BwVHlwZToKLSAgdG9rX2NwcF90eXBlIHRva19saXRlcmFsCi0gICAgewotICAgICAgJCQgPSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotVHlwZUFubm90YXRpb25zOgotICAnKCcgVHlwZUFubm90YXRpb25MaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25zIC0+ICggVHlwZUFubm90YXRpb25MaXN0ICkiKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uTGlzdDoKLSAgVHlwZUFubm90YXRpb25MaXN0IFR5cGVBbm5vdGF0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbkxpc3QgLT4gVHlwZUFubm90YXRpb25MaXN0ICwgVHlwZUFubm90YXRpb24iKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YW5ub3RhdGlvbnNfWyQyLT5rZXldID0gJDItPnZhbDsKLSAgICAgIGRlbGV0ZSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgLyogSnVzdCB1c2UgYSBkdW1teSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYW5ub3RhdGlvbnMuICovCi0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotVHlwZUFubm90YXRpb246Ci0gIHRva19pZGVudGlmaWVyICc9JyB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKLSAgICAgICQkLT5rZXkgPSAkMTsKLSAgICAgICQkLT52YWwgPSAkMzsKLSAgICB9Ci0KLSUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWYyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitpZigke1dJVEhfUExVR0lOfSkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworICAgICMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworICAgIHNldChwbHVnaW50ZXN0X1NPVVJDRVMKKyAgICAgICAgcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYworICAgICkKKyAgICBhZGRfZXhlY3V0YWJsZShwbHVnaW50ZXN0ICR7cGx1Z2ludGVzdF9TT1VSQ0VTfSkKKyAgICBpZihXSVRIX1NIQVJFRF9MSUIgQU5EIE5PVCBNU1ZDKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMocGx1Z2ludGVzdAorICAgICAgICAgICAgdGhyaWZ0YworICAgICAgICAgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICAgICAgICkKKyAgICBlbHNlKCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBsdWdpbnRlc3QKKyAgICAgICAgICAgIHRocmlmdGNfc3RhdGljCisgICAgICAgICAgICB0aHJpZnRfc3RhdGljCisgICAgICAgICAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAgICAgKQorICAgIGVuZGlmKCkKKyAgICBhZGRfdGVzdChOQU1FIFBsdWdpblVuaXRUZXN0IENPTU1BTkQgcGx1Z2ludGVzdCkKKworICAgIHNldCh0aHJpZnQtZ2VuLW15Y3BwX1NPVVJDRVMKKyAgICAgICAgLi4vc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgICAgICAgcGx1Z2luL2NwcF9wbHVnaW4uY2MKKyAgICApCisgICAgYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWdlbi1teWNwcCAke3RocmlmdC1nZW4tbXljcHBfU09VUkNFU30pCisgICAgaWYoV0lUSF9TSEFSRURfTElCIEFORCBOT1QgTVNWQykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1nZW4tbXljcHAgdGhyaWZ0YykKKyAgICBlbHNlKCkKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1nZW4tbXljcHAgdGhyaWZ0Y19zdGF0aWMgdGhyaWZ0X3N0YXRpYykKKyAgICBlbmRpZigpCisKKyAgICBpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgICAgICAgIHNldChCVUlMRFRZUEUgIkRlYnVnIikKKyAgICBlbHNlKCkKKyAgICAgICAgIyBSZWxXaXRoRGViSW5mbyBnZW5lcmF0ZXMgYmluYXJpZXMgaW4gIlJlbGVhc2UiIGRpcmVjdG9yeSB0b28KKyAgICAgICAgc2V0KEJVSUxEVFlQRSAiUmVsZWFzZSIpCisgICAgZW5kaWYoKQorCisgICAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMKKyAgICAgICAgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIGdlbi1jcHAKKyAgICAgICAgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIGdlbi1teWNwcCkKKworICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHApCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLW15Y3BwKQorICAgIGFkZF90ZXN0KE5BTUUgUGx1Z2luSW50ZWdyYXRpb25UZXN0CisgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAgICAgIC1EVEhSSUZUX0NPTVBJTEVSPSR7VEhSSUZUX0NPTVBJTEVSfQorICAgICAgICAgICAgICAgICAtREJJTkRJUj0ke0NNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWX0KKyAgICAgICAgICAgICAgICAgLURCVUlMRFRZUEU9JHtCVUlMRFRZUEV9CisgICAgICAgICAgICAgICAgIC1EQ1VSRElSPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgICAgICAgICAgICAgICAtRFNSQ0RJUj0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NwcF9wbHVnaW5fdGVzdC5jbWFrZSkKK2VuZGlmKCkKKworZmlsZShHTE9CIEtFWVdPUkRfU0FNUExFUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2tleXdvcmQtc2FtcGxlcy8qLnRocmlmdCIpCitmb3JlYWNoKExBTkcgJHt0aHJpZnRfY29tcGlsZXJfTEFOR1N9KQorICAgIGZvcmVhY2goU0FNUExFICR7S0VZV09SRF9TQU1QTEVTfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChGSUxFTkFNRSAke1NBTVBMRX0gTkFNRV9XRSkKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSAiJHtMQU5HfV8ke0ZJTEVOQU1FfSIKKyAgICAgICAgICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuICR7TEFOR30gJHtTQU1QTEV9KQorICAgICAgICBzZXRfdGVzdHNfcHJvcGVydGllcygiJHtMQU5HfV8ke0ZJTEVOQU1FfSIgUFJPUEVSVElFUworICAgICAgICAgICAgUEFTU19SRUdVTEFSX0VYUFJFU1NJT04gIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZCIpCisgICAgZW5kZm9yZWFjaCgpCitlbmRmb3JlYWNoKCkKKworCitmaW5kX3BhY2thZ2UoUHl0aG9uSW50ZXJwIFJFUVVJUkVEKQorYWRkX3Rlc3QoTkFNRSBTdGFsZW5lc3NDaGVja1Rlc3QgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5ICR7VEhSSUZUX0NPTVBJTEVSfSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmYzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC9zcmMKK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCisKK2lmIFdJVEhfUExVR0lOCitjaGVja19QUk9HUkFNUyA9IHBsdWdpbnRlc3QKKworbm9pbnN0X1BST0dSQU1TID0gdGhyaWZ0LWdlbi1teWNwcAorCithbGwtbG9jYWw6IHRocmlmdC1nZW4tYmluY2F0CisKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL3NyYworCitwbHVnaW50ZXN0X1NPVVJDRVMgPSBwbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCitwbHVnaW50ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9saWJ0aHJpZnRjLmxhCisKK3RocmlmdF9nZW5fbXljcHBfU09VUkNFUyA9IHBsdWdpbi9jcHBfcGx1Z2luLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi90X2NwcF9nZW5lcmF0b3IuY2MKK3RocmlmdF9nZW5fbXljcHBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlCit0aHJpZnRfZ2VuX215Y3BwX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9saWJ0aHJpZnRjLmxhCisKK2NwcF9wbHVnaW5fdGVzdC5zaDogdGhyaWZ0LWdlbi1teWNwcAorCit0aHJpZnQtZ2VuLWJpbmNhdDoKKwljcCBiaW5jYXQuc2ggJEAKKwljaG1vZCA3NTUgJEAKKworcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoOiB0aHJpZnQtZ2VuLWJpbmNhdAorCitURVNUUyA9ICQoY2hlY2tfUFJPR1JBTVMpIGNwcF9wbHVnaW5fdGVzdC5zaCBwbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jcHAgZ2VuLW15Y3BwIGdlbi1iaW5jYXQgdGhyaWZ0LWdlbi1iaW5jYXQKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2Y5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworZXhlYyAvYmluL2NhdApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODRhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorY29uc3Qgc3RyaW5nIGZvbyA9ICJiYXIiCisKK3N0cnVjdCBhX3N0cnVjdCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogaTggYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgQVNlcnZpY2UgeworICBpMzIgYV9wcm9jZWR1cmUoMTogaTMyIGFyZykKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3N2FmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZSAiSW5jbHVkZWQudGhyaWZ0IgorCitjb25zdCBzdHJpbmcgcyA9ICJzdHJpbmciCisKK3N0cnVjdCBCU3RydWN0IHsKKyAgMTogSW5jbHVkZWQuYV9zdHJ1Y3Qgb25lX29mX2VhY2gKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzMwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMTFkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkKQEAgLTAsMCArMSwxNDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdFN0YWxlbmVzc0NoZWNrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIENVUlJFTlRfRElSX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgICAgVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IE5vbmUKKyAgICBTSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiU2luZ2xlLnRocmlmdCIpCisgICAgSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGluZy50aHJpZnQiKQorICAgIElOQ0xVREVEX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGVkLnRocmlmdCIpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhvdXRfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBmaXJzdF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHVzZWRfZmlsZS53cml0ZSgiXG4vKiBUaGlzIGlzIGEgY29tbWVudCAqL1xuIikKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiciIpCisgICAgICAgIHNlY29uZF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9jb250ZW50cywgc2Vjb25kX2NvbnRlbnRzKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9pbmNsdWRlZF9maWxlKHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkZWQudGhyaWZ0IikKKyAgICAgICAgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkaW5nLnRocmlmdCIpCisKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURFRF9USFJJRlRfRklMRV9QQVRILCB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCkKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURJTkdfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItcmVjdXJzZSIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFt0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGhdCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGVkX2NvbnN0YW50cy5jcHAiKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGluZ19jb25zdGFudHMuY3BwIikKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUgPSBvcGVuKHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZS53cml0ZSgiXG5jb25zdCBpMzIgYW5faW50ZWdlciA9IDQyXG4iKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAorICAgICAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSwgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RTdGFsZW5lc3NDaGVjaykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAjIFRoZSBwYXRoIG9mIFRocmlmdCBjb21waWxlciAgaXMgIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgdGVzdCBzY3JpcHQuCisgICAgIyBSZW1vdmUgaXQgdG8gbm90IGNvbmZ1c2UgdGhlIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsKKyAgICBUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IHN5cy5hcmd2Wy0xXQorICAgIGRlbCBzeXMuYXJndlstMV0KKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTgyODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UKQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDVVJESVJ9L2dlbi1jcHApCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLXIgLW91dCAke0NVUkRJUn0vZ2VuLWNwcCAtZ2VuIGNwcCAke1NSQ0RJUn0vLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCkKK2lmKEVYSVRDT0RFKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtBUkdWfVwiOiBcIiR7RVhJVENPREV9XCIiKQorZW5kaWYoKQoraWYoV0lOMzIpCisgICAgc2V0KEVOVntQQVRIfSAiJHtCSU5ESVJ9LyR7QlVJTERUWVBFfTske0JJTkRJUn07JEVOVntQQVRIfSIpCitlbHNlKCkKKyAgICBzZXQoRU5We1BBVEh9ICIke0JJTkRJUn06JEVOVntQQVRIfSIpCitlbmRpZigpCisKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDVVJESVJ9L2dlbi1teWNwcCkKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtciAtb3V0ICR7Q1VSRElSfS9nZW4tbXljcHAgLWdlbiBteWNwcCAke1NSQ0RJUn0vLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCBSRVNVTFRfVkFSSUFCTEUgRVhJVENPREUpCitpZihFWElUQ09ERSkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7RVhJVENPREV9XCIiKQorZW5kaWYoKQorCitmaW5kX3Byb2dyYW0oRElGRiBkaWZmKQoraWYoRElGRikKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtESUZGfSAtdXJOIGdlbi1jcHAgZ2VuLW15Y3BwIFJFU1VMVF9WQVJJQUJMRSBFWElUQ09ERSkKKyAgaWYoRVhJVENPREUpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7RVhJVENPREV9XCIiKQorICBlbmRpZigpCitlbHNlKCkKKyAgICBtZXNzYWdlKFdBUk5JTkcgImRpZmYgZXhlY3V0YWJsZSBpcyBub3QgYXZhaWxhYmxlLiBOb3QgdmFsaWRhdGluZyBwbHVnaW4tZ2VuZXJhdGVkIGNvZGUuIikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZGIyZTBhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoCkBAIC0wLDAgKzEsMjcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSBtYWtlLgorc2V0IC1lCitta2RpciAtcCBnZW4tY3BwIGdlbi1teWNwcAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1vdXQgZ2VuLWNwcCAtZ2VuIGNwcCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0CitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLW91dCBnZW4tbXljcHAgLWdlbiBteWNwcCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0CitkaWZmIC11ck4gZ2VuLWNwcCBnZW4tbXljcHAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlNGFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IGJvb2wgcmV0dXJuID0gMApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgzNGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwyIEBACitlbnVtIHJldHVybiB7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2FhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2VudW0gZW51bV9uYW1lIHsKKyAgcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRiMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitleGNlcHRpb24gcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjMzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7CisgIDE6IHJlcXVpcmVkIGk4IHJldHVybgorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc2VydmljZSByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3MzMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICBib29sIGZ1bmN0aW9uX25hbWUoMTogaTMyIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkZDk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc2VydmljZSBzZXJ2aWNlX25hbWUgeworICB2b2lkIHJldHVybigpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzg3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDUgQEAKK2V4Y2VwdGlvbiBleGNlcHRpb25fbmFtZSB7fQorCitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgZnVuY3Rpb25fbmFtZSgpIHRocm93cyAoIDE6IGV4Y2VwdGlvbl9uYW1lIHJldHVybikKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3N0cnVjdCByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzAwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IHN0cnVjdF9uYW1lIHsKKyAgMTogcmVxdWlyZWQgYm9vbCByZXR1cm4gPSAxCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTliYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit0eXBlZGVmIGJvb2wgcmV0dXJuCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4ZGYxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACit1bmlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE5ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAordW5pb24gdW5pb25fbmFtZSB7CisgIDE6IG9wdGlvbmFsIGJvb2wgcmV0dXJuPTEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGQ4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9pbmNsdWRlZC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvcGFyYW1ldGVyaXplZF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q7CisKK25hbWVzcGFjZSB0ZXN0X2RhdGEgeworI2RlZmluZSBUX1RFU1RfVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDE0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9ncmFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF92YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKSkKKyNkZWZpbmUgVF9ERUxFVEVfVEVTVERBVEEociwgZCwgZWxlbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0XyMjZWxlbSo+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gZWxlbSMjcy5yYmVnaW4oKTsgaXQgIT0gZWxlbSMjcy5yZW5kKCk7IGl0KyspIFwKKyAgICBkZWxldGUgKml0OworI2RlZmluZSBUX0RFQ0xfVEVTVERBVEEociwgZCwgZWxlbSkgc3RhdGljIHN0ZDo6dmVjdG9yPCA6OnRfIyNlbGVtKj4gZWxlbSMjczsKK0JPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9ERUNMX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisjdW5kZWYgVF9ERUNMX1RFU1REQVRBCisKK2Jvb2wgaGFzX2RhdGEgPSBmYWxzZTsKK3ZvaWQgY2xlYW51cCgpIHsKKyAgaWYgKGhhc19kYXRhKSB7CisgICAgaGFzX2RhdGEgPSBmYWxzZTsKKyAgICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfREVMRVRFX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisgIH0KK30KKwordm9pZCBpbml0X3Byb2dyYW1zKCkgeworICBwcm9ncmFtcy5wdXNoX2JhY2sobmV3IHRfcHJvZ3JhbSgicHJvZyBwYXRoIiwgInByb2dfbmFtZSIpKTsKK30KKwordm9pZCBpbml0X2Jhc2VfdHlwZXMoKSB7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMCIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTEiLCA6OnRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTIiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0JPT0wpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUzIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JOCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTQiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0kxNikpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTUiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0kzMikpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTYiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0k2NCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTciLCA6OnRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkpOworfQorCit2b2lkIGluaXRfY29uc3RfdmFsdWVzKCkgeworICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2NvbnN0X3ZhbHVlKDQyKSk7CisgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfY29uc3RfdmFsdWUoImZvbyIpKTsKKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfZG91YmxlKDMuMTQxNSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9pZGVudGlmaWVyKCJiYXIiKTsKKyAgICB4LT5zZXRfZW51bShlbnVtc1swXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9tYXAoKTsKKyAgICB4LT5hZGRfbWFwKGNvbnN0X3ZhbHVlc1swXSwgY29uc3RfdmFsdWVzWzFdKTsKKyAgICB4LT5hZGRfbWFwKGNvbnN0X3ZhbHVlc1sxXSwgY29uc3RfdmFsdWVzWzBdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2xpc3QoKTsKKyAgICB4LT5hZGRfbGlzdChjb25zdF92YWx1ZXNbMF0pOworICAgIHgtPmFkZF9saXN0KGNvbnN0X3ZhbHVlc1sxXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorfQorCit2b2lkIGluaXRfY29uc3RzKCkgeworICAvLyBiYXNlX3R5cGUvZW51bSBpbmRleGVzIGZvciB0aGlzIGFuZCBvdGhlciB0ZXN0cyBhcmUgYXJiaXRyYXJ5CisgIGNvbnN0cy5wdXNoX2JhY2sobmV3IHRfY29uc3QoYmFzZV90eXBlc1syXSwgImFhYSIsIGNvbnN0X3ZhbHVlc1swXSkpOworICBjb25zdHMuYmFjaygpLT5zZXRfZG9jKCJzb2VtIGRvYyIpOworICBjb25zdHMucHVzaF9iYWNrKG5ldyB0X2NvbnN0KGJhc2VfdHlwZXNbM10sICJiYmIiLCBjb25zdF92YWx1ZXNbMV0pKTsKK30KKwordm9pZCBpbml0X2VudW1fdmFsdWVzKCkgeworICBlbnVtX3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfZW51bV92YWx1ZSgiVkFMMSIsIDExKSk7CisgIGVudW1fdmFsdWVzLmJhY2soKS0+c2V0X2RvYygiZW51bSBkb2MgMSIpOworICBlbnVtX3ZhbHVlcy5iYWNrKCktPmFubm90YXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImFubm8xIiwgInZhbDEiKSk7CisKKyAgZW51bV92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2VudW1fdmFsdWUoIlZBTDIiLCAyMikpOworfQorCit2b2lkIGluaXRfZW51bXMoKSB7CisgIGVudW1zLnB1c2hfYmFjayhuZXcgdF9lbnVtKHByb2dyYW1zWzBdKSk7CisgIGVudW1zLmJhY2soKS0+c2V0X2RvYygiZW51bSBkb2MgMSIpOworICBlbnVtcy5iYWNrKCktPmFubm90YXRpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoImFubm8xIiwgInZhbDEiKSk7CisgIGVudW1zLmJhY2soKS0+c2V0X25hbWUoImZvb28iKTsKKyAgZW51bXMuYmFjaygpLT5hcHBlbmQoZW51bV92YWx1ZXNbMF0pOworICBlbnVtcy5iYWNrKCktPmFwcGVuZChlbnVtX3ZhbHVlc1sxXSk7Cit9CisKK3ZvaWQgaW5pdF9saXN0cygpIHsKKyAgbGlzdHMucHVzaF9iYWNrKG5ldyB0X2xpc3QoZW51bXNbMF0pKTsKKyAgbGlzdHMucHVzaF9iYWNrKG5ldyB0X2xpc3QoYmFzZV90eXBlc1s1XSkpOworICBsaXN0cy5iYWNrKCktPnNldF9jcHBfbmFtZSgibGlzdF9jcHBfbmFtZV8xIik7Cit9Cit2b2lkIGluaXRfc2V0cygpIHsKKyAgc2V0cy5wdXNoX2JhY2sobmV3IHRfc2V0KGJhc2VfdHlwZXNbNF0pKTsKKyAgc2V0cy5wdXNoX2JhY2sobmV3IHRfc2V0KGVudW1zWzBdKSk7CisgIHNldHMuYmFjaygpLT5zZXRfY3BwX25hbWUoInNldF9jcHBfbmFtZV8xIik7Cit9Cit2b2lkIGluaXRfbWFwcygpIHsKKyAgbWFwcy5wdXNoX2JhY2sobmV3IHRfbWFwKGJhc2VfdHlwZXNbNF0sIGJhc2VfdHlwZXNbMV0pKTsKKyAgbWFwcy5wdXNoX2JhY2sobmV3IHRfbWFwKGJhc2VfdHlwZXNbNV0sIGVudW1zWzBdKSk7CisgIG1hcHMuYmFjaygpLT5zZXRfY3BwX25hbWUoIm1hcF9jcHBfbmFtZV8xIik7Cit9CisKK3ZvaWQgaW5pdF90eXBlZGVmcygpIHsKKyAgdHlwZWRlZnMucHVzaF9iYWNrKG5ldyB0X3R5cGVkZWYocHJvZ3JhbXNbMF0sIGJhc2VfdHlwZXNbM10sICJWQUwxIikpOworfQordm9pZCBpbml0X2ZpZWxkcygpIHsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzFdLCAiZjEiKSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZWZlcmVuY2UoZmFsc2UpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbMl0sICJmMiIsIDkpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlZmVyZW5jZSh0cnVlKTsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzNdLCAiZjMiLCAxMSkpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVxKHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICBmaWVsZHMuYmFjaygpLT5zZXRfdmFsdWUoY29uc3RfdmFsdWVzWzBdKTsKK30KK3ZvaWQgaW5pdF9zdHJ1Y3RzKCkgeworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJzdHJ1Y3QxIikpOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1swXSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzFdKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAidW5pb24xIikpOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1swXSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzFdKTsKKyAgc3RydWN0cy5iYWNrKCktPnNldF91bmlvbih0cnVlKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAieGNlcHQxIikpOworICBzdHJ1Y3RzLmJhY2soKS0+c2V0X3hjZXB0aW9uKHRydWUpOworfQordm9pZCBpbml0X2Z1bmN0aW9ucygpIHsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAiZXJyczEiKSk7CisgIHRfc3RydWN0KiBlcnJvcnMgPSBzdHJ1Y3RzLmJhY2soKTsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAiYXJnczEiKSk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gc3RydWN0cy5iYWNrKCk7CisgIGZ1bmN0aW9ucy5wdXNoX2JhY2sobmV3IHRfZnVuY3Rpb24oYmFzZV90eXBlc1swXSwgImZ1bmMxIiwgZXJyb3JzLCBhcmdsaXN0LCBmYWxzZSkpOworICBmdW5jdGlvbnMucHVzaF9iYWNrKG5ldyB0X2Z1bmN0aW9uKGJhc2VfdHlwZXNbMF0sICJmdW5jMiIsIGVycm9ycywgYXJnbGlzdCwgdHJ1ZSkpOworfQordm9pZCBpbml0X3NlcnZpY2VzKCkgeworICBzZXJ2aWNlcy5wdXNoX2JhY2sobmV3IHRfc2VydmljZShwcm9ncmFtc1swXSkpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9kb2MoInNydjEgZG9jIik7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X25hbWUoInNydjEiKTsKKyAgc2VydmljZXMuYmFjaygpLT5hZGRfZnVuY3Rpb24oZnVuY3Rpb25zWzBdKTsKKyAgc2VydmljZXMuYmFjaygpLT5hZGRfZnVuY3Rpb24oZnVuY3Rpb25zWzFdKTsKKworICBzZXJ2aWNlcy5wdXNoX2JhY2sobmV3IHRfc2VydmljZShwcm9ncmFtc1swXSkpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9uYW1lKCJzcnYyIik7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X2V4dGVuZHMoc2VydmljZXNbMF0pOworfQorCitzdGQ6OnZlY3Rvcjx0X3R5cGUqPiB0eXBlczsKK3ZvaWQgaW5pdF90eXBlcygpIHsKKyNkZWZpbmUgVF9DT1BZX1RZUEVTKHR5cGUpIHN0ZDo6Y29weSh0eXBlIyNzLmJlZ2luKCksIHR5cGUjI3MuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0eXBlcykpCisgIFRfQ09QWV9UWVBFUyhiYXNlX3R5cGUpOworICBUX0NPUFlfVFlQRVMoZW51bSk7CisgIFRfQ09QWV9UWVBFUyh0eXBlZGVmKTsKKyAgVF9DT1BZX1RZUEVTKHN0cnVjdCk7CisgIFRfQ09QWV9UWVBFUyhsaXN0KTsKKyAgVF9DT1BZX1RZUEVTKHNldCk7CisgIFRfQ09QWV9UWVBFUyhtYXApOworLy8gVF9DT1BZX1RZUEVTKHNlcnZpY2UpOworI3VuZGVmIFRfQ09QWV9UWVBFUworfQorCit2b2lkIGluaXQoKSB7CisgIGlmICghaGFzX2RhdGEpIHsKKyAgICBoYXNfZGF0YSA9IHRydWU7CisjZGVmaW5lIFRfSU5JVF9URVNUREFUQShyLCBkLCBlbGVtKSBpbml0XyMjZWxlbSMjcygpOworICAgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9JTklUX1RFU1REQVRBLCBfLCBUX1RFU1RfVFlQRVMpCisgICAgaW5pdF90eXBlcygpOworI3VuZGVmIFRfSU5JVF9URVNUREFUQQorICB9Cit9Cit9CitzdHJ1Y3QgR2xvYmFsRml4dHVyZSB7CisgIH5HbG9iYWxGaXh0dXJlKCkgeyB0ZXN0X2RhdGE6OmNsZWFudXAoKTsgfQorfTsKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKQorI2VuZGlmCisKK3ZvaWQgbWlncmF0ZV9nbG9iYWxfY2FjaGUoKSB7CisgIHBsdWdpbjo6VHlwZVJlZ2lzdHJ5IHJlZzsKKyAgcGx1Z2luX291dHB1dDo6Z2V0X2dsb2JhbF9jYWNoZShyZWcpOworICBwbHVnaW46OnNldF9nbG9iYWxfY2FjaGUocmVnKTsKKyAgcGx1Z2luX291dHB1dDo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIHJvdW5kX3RyaXAoVCogdCkgeworICB0eXBlbmFtZSBwbHVnaW46OlRvVHlwZTxUPjo6dHlwZSBwOworICBwbHVnaW46OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworICBwbHVnaW5fb3V0cHV0OjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcGx1Z2luX291dHB1dDo6Y29udmVydCh0LCBwKTsKKyAgbWlncmF0ZV9nbG9iYWxfY2FjaGUoKTsKKyAgcmV0dXJuIHBsdWdpbjo6Y29udmVydChwKTsKK30KKwordm9pZCB0ZXN0X2Jhc2VfdHlwZSg6OnRfYmFzZV90eXBlKiBzdXQpIHsKKyAgcGx1Z2luOjp0X2Jhc2VfdHlwZSBwOworICBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KHN1dCwgcCk7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfYmFzZV90eXBlPiBzdXQyKHBsdWdpbjo6Y29udmVydChwKSk7CisKKyNkZWZpbmUgVEhSSUZUX0NIRUNLKHIsIGRhdGEsIGVsZW0pIEJPT1NUX1BQX0VYUEFORChCT09TVF9DSEVDS19FUVVBTChkYXRhIGVsZW0sIHN1dDItPmVsZW0pKTsKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3ZvaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nX2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iaW5hcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmdfZW51bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jhc2VfdHlwZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9jb25zdF92YWx1ZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X3R5cGUoKSwgc3V0Mi0+Z2V0X3R5cGUoKSk7CisgIHN3aXRjaCAoc3V0LT5nZXRfdHlwZSgpKSB7CisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfQ0FTRSh0eXBlLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6dHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfIyNuYW1lKCksIHN1dDItPmdldF8jI25hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfSU5URUdFUiwgaW50ZWdlcik7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0RPVUJMRSwgZG91YmxlKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfU1RSSU5HLCBzdHJpbmcpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9JREVOVElGSUVSLCBpZGVudGlmaWVyKTsKKyN1bmRlZiBUX0NPTlNUX1ZBTFVFX0NBU0UKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbWFwKCkuc2l6ZSgpLCBzdXQyLT5nZXRfbWFwKCkuc2l6ZSgpKTsKKyAgICB7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUsIHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZT4gc3V0X3ZhbHVlczsKKyAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQtPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBzdXQtPmdldF9tYXAoKS5lbmQoKTsgaXQrKykgeworICAgICAgICBzdXRfdmFsdWVzW2l0LT5maXJzdC0+Z2V0X3R5cGUoKV0gPSBpdC0+c2Vjb25kLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlLCB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGU+IHN1dDJfdmFsdWVzOworICAgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN1dDItPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBzdXQyLT5nZXRfbWFwKCkuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgc3V0Ml92YWx1ZXNbaXQtPmZpcnN0LT5nZXRfdHlwZSgpXSA9IGl0LT5zZWNvbmQtPmdldF90eXBlKCk7CisgICAgICB9CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdXRfdmFsdWVzLmJlZ2luKCktPmZpcnN0LCBzdXQyX3ZhbHVlcy5iZWdpbigpLT5maXJzdCk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChzdXRfdmFsdWVzLmJlZ2luKCktPnNlY29uZCwgc3V0Ml92YWx1ZXMuYmVnaW4oKS0+c2Vjb25kKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9saXN0KCkuc2l6ZSgpLCBzdXQyLT5nZXRfbGlzdCgpLnNpemUoKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbGlzdCgpLmZyb250KCktPmdldF90eXBlKCksIHN1dDItPmdldF9saXN0KCkuZnJvbnQoKS0+Z2V0X3R5cGUoKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgQk9PU1RfQVNTRVJUKGZhbHNlKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIHRlc3RfY29uc3QodF9jb25zdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfY29uc3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YWx1ZSgpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfZW51bV92YWx1ZSh0X2VudW1fdmFsdWUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2VudW1fdmFsdWU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDMsIChnZXRfbmFtZSgpLCBnZXRfdmFsdWUoKSwgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9lbnVtKHRfZW51bSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPCA6OnRfZW51bT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9taW5fdmFsdWUoKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21heF92YWx1ZSgpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY29uc3RhbnRfYnlfdmFsdWUoMTEpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY29uc3RhbnRfYnlfbmFtZSgiVkFMMSIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2xpc3QodF9saXN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9saXN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9lbGVtX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9Cit2b2lkIHRlc3Rfc2V0KHRfc2V0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zZXQ+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2VsZW1fdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KK3ZvaWQgdGVzdF9tYXAodF9tYXAqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X21hcD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfa2V5X3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFsX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9CisKK3ZvaWQgdGVzdF90eXBlZGVmKHRfdHlwZWRlZiogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfdHlwZWRlZj4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3ltYm9saWMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mb3J3YXJkX3R5cGVkZWYoKSkpKQorfQorCit2b2lkIHRlc3RfdHlwZSh0X3R5cGUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3R5cGU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3ZvaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iYXNlX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ib29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHlwZWRlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2VudW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJ1Y3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbnRhaW5lcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19tYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZXJ2aWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKK30KKwordm9pZCB0ZXN0X2ZpZWxkKHRfZmllbGQqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2ZpZWxkPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9yZXEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcmVmZXJlbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2tleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmdldF92YWx1ZSgpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF92YWx1ZSgpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X3ZhbHVlKCkpOworICB9CisgIGlmIChzdXQtPmdldF90eXBlKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X3R5cGUoKS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF90eXBlKCkpOworICB9Cit9Cit2b2lkIHRlc3Rfc3RydWN0KHRfc3RydWN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zdHJ1Y3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194Y2VwdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cnVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9mdW5jdGlvbj4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goCisgICAgICBUSFJJRlRfQ0hFQ0ssCisgICAgICBzdXQtPiwKKyAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSwgZ2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSwgaXNfb25ld2F5KCkpKSkKK30KK3ZvaWQgdGVzdF9zZXJ2aWNlKHRfc2VydmljZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc2VydmljZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMywgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSwgZ2V0X2Z1bmN0aW9ucygpLnNpemUoKSkpKQorICBpZiAoc3V0LT5nZXRfZXh0ZW5kcygpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfZXh0ZW5kcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcHJvZ3JhbSh0X3Byb2dyYW0qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3Byb2dyYW0+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywgc3V0LT4sIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMiwgKGdldF9kb2MoKSwgZ2V0X25hbWUoKSkpKQorfQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIHRlc3RfZGF0YTo6aW5pdCgpOworICB0ZXN0X3N1aXRlKiB0cyA9IEJPT1NUX1RFU1RfU1VJVEUoIlBsdWdpbkNvbnZlcnNpb25UZXN0Iik7CisKKyNkZWZpbmUgVF9URVNUX0NBU0UociwgZCwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHMtPmFkZChCT09TVF9QQVJBTV9URVNUX0NBU0UodGVzdF8jI3R5cGUsIHRlc3RfZGF0YTo6dHlwZSMjcy5iZWdpbigpLCB0ZXN0X2RhdGE6OnR5cGUjI3MuZW5kKCkpKTsKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX1RFU1RfQ0FTRSwgXywgVF9URVNUX1RZUEVTKQorICBUX1RFU1RfQ0FTRShfLCBfLCB0eXBlKQorI3VuZGVmIFRfVEVTVF9DQVNFCisgIHJldHVybiB0czsKK30KKworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hZGQoZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKSk7CisgIHJldHVybiB0cnVlOworfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsIGFyZ2MsIGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgcmV0dXJuIGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKworY2xhc3MgTXlDcHBHZW5lcmF0b3IgOiBwdWJsaWMgR2VuZXJhdG9yUGx1Z2luIHsKKyAgdmlydHVhbCBpbnQgZ2VuZXJhdGUoOjp0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zKSB7CisgICAgdF9nZW5lcmF0b3IqIGdlbiA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICJjcHAiLCBwYXJzZWRfb3B0aW9ucywgIiIpOworICAgIGdlbi0+Z2VuZXJhdGVfcHJvZ3JhbSgpOworICAgIGRlbGV0ZSBnZW47CisgICAgcmV0dXJuIDA7CisgIH0KK307Cit9Cit9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6TXlDcHBHZW5lcmF0b3IgcDsKKyAgcmV0dXJuIHAuZXhlYyhhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjdjOTNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBieSBtYWtlLgorIworIyBUaGlzIGZpbGUgcnVucyB0aGUgY29tcGlsZXIgdHdpY2UsIHVzaW5nIGEgcGx1Z2luIHRoYXQganVzdCBpbnZva2VzCisjIC9iaW4vY2F0LCBhbmQgY29tcGFyZXMgdGhlIG91dHB1dC4gIElmIEdlbmVyYXRvcklucHV0IGlzCisjIG5vbmRldGVybWluc2l0aWMsIHlvdSdkIGV4cGVjdCB0aGUgb3V0cHV0IHRvIGRpZmZlciBmcm9tIHJ1bi10by1ydW4uCisjIFNvIHRoaXMgdGVzdHMgdGhhdCBpbiBmYWN0LCB0aGUgb3V0cHV0IGlzIHN0YWJsZSBmcm9tIHJ1bi10by1ydW4uCitzZXQgLWUKK21rZGlyIC1wIGdlbi1iaW5jYXQKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtZ2VuIGJpbmNhdCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0ID4gZ2VuLWJpbmNhdC8xLnNlcgorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1nZW4gYmluY2F0IC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgPiBnZW4tYmluY2F0LzIuc2VyCitkaWZmIC0tYmluYXJ5IGdlbi1iaW5jYXQvMS5zZXIgZ2VuLWJpbmNhdC8yLnNlcgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjEwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKKworcHJvamVjdCh0aHJpZnRfY29tcGlsZXJfdGVzdHMpCisKK3NldChUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUgorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLgorKQorCisjIGRvbid0IGdlbmVyYXRlIFpFUk9fQ0hFQ0sKK3NldChDTUFLRV9TVVBQUkVTU19SRUdFTkVSQVRJT04gdHJ1ZSkKKworY29uZmlndXJlX2ZpbGUoJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfTElNSVRfTUFDUk9TKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoL0ZJInN0ZGludC5oIikKKyAgICBlbmRpZihIQVZFX1NURElOVF9IKQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoRkxFWCBSRVFVSVJFRCkKK2ZpbmRfcGFja2FnZShCSVNPTiBSRVFVSVJFRCkKKworIyBjcmVhdGUgZGlyZWN0b3J5IGZvciB0aHJpZnR5IGFuZCB0aHJpZnRsCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvKQorCisjIENyZWF0ZSBmbGV4IGFuZCBiaXNvbiBmaWxlcyBhbmQgYnVpbGQgdGhlIGxpYiBwYXJzZSBzdGF0aWMgbGlicmFyeQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnR5Lnl5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYykKK0ZMRVhfVEFSR0VUKHRocmlmdGwgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKK0FERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQorCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAorKQorCithZGRfbGlicmFyeShwYXJzZSBTVEFUSUMgJHtwYXJzZV9TT1VSQ0VTfSkKKworIyBUaHJpZnQgY29tcGlsZXIgdGVzdHMKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHMKKykKKworIyB5b3UgY2FuIGFkZCBzb21lIGZpbGVzIG1hbnVhbGx5IHRoZXJlIAorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUworICAgICMgdGVzdHMgZmlsZSB0byBhdm9pZCBtYWluIGluIGV2ZXJ5IHRlc3QgZmlsZQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0c19tYWluLmNjCispCisKKyMgc2V0IHZhcmlhYmxlIGZvciB0ZXN0cyBzb3VyY2VzIC0gd2lsbCBiZSBmaWxsZWQgbGF0ZXIKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFUworKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVMKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgIyB3ZSB1c2UgbG9nZ2luZyBpbnN0ZWFkIG9mIG1haW4gdG8gYXZvaWQgYnJlYWtpbmcgY29tcGlsbGF0aW9uICgyIG1haW4gdikKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworIyBUaGlzIG1hY3JvIGFkZHMgYW4gb3B0aW9uIFRIUklGVF9DT01QSUxFUl8ke05BTUV9CisjIHRoYXQgYWxsb3dzIGVuYWJsaW5nIG9yIGRpc2FibGluZyBjZXJ0YWluIGxhbmd1YWdlcworbWFjcm8oVEhSSUZUX0FERF9DT01QSUxFUiBuYW1lIGRlc2NyaXB0aW9uIGluaXRpYWwpCisgICAgc3RyaW5nKFRPVVBQRVIgIlRIUklGVF9DT01QSUxFUl8ke25hbWV9IiBlbmFibGVyKQorICAgIHNldChzcmMgIiR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgb3B0aW9uKCR7ZW5hYmxlcn0gJHtkZXNjcmlwdGlvbn0gJHtpbml0aWFsfSkKKyAgICBpZigke2VuYWJsZXJ9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfU09VUkNFUyAke3NyY30pCisgICAgICAgIGZpbGUoR0xPQiB0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFUworICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke25hbWV9LyouYyoiCisgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7bmFtZX0vKi50aHJpZnQiCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgVGhlIGZvbGxvd2luZyBjb21waWxlciB3aXRoIHVuaXQgdGVzdHMgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKK1RIUklGVF9BRERfQ09NUElMRVIoY19nbGliICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIHdpdGggR2xpYiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjcHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMrKyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihhczMgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEFjdGlvblNjcmlwdCAzIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY3NoYXJwICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGVybCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRXJsYW5nIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNvY29hICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgT2JqZWN0aXZlLUMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoc3dpZnQgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBTd2lmdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihvY2FtbCAgICJFbmFibGUgY29tcGlsZXIgZm9yIE9DYW1sIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUih4c2QgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhTRCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihodG1sICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhUTUwgRG9jdW1lbnRhdGlvbiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqcyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmFTY3JpcHQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoanNvbiAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKU09OIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmFtZSAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSBNRSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihnbyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdvIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGQgICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihndiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdyYXBoVml6IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHJzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVzdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT0ZGKQorCisjIFRocmlmdCBpcyBsb29raW5nIGZvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5CisjIHdlIGFsc28gYWRkIHRoZSBjdXJyZW50IGJpbmFyeSBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBmaWxlcworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jYXRjaCkKKworYWRkX2xpYnJhcnkodGhyaWZ0X2NvbXBpbGVyICR7dGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVN9KQorCisjbGluayBwYXJzZSBsaWIgdG8gdGhyaWZ0X2NvbXBpbGVyIGxpYgordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdF9jb21waWxlciBwYXJzZSkKKworIyBhZGQgdGVzdHMgZXhlY3V0YWJsZQorYWRkX2V4ZWN1dGFibGUodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzICR7dGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTfSAke3RocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTfSkKKworIyBpZiBnZW5lcmF0ZXMgZm9yIFZpc3VhbCBTdHVkaW8gc2V0IHRocmlmdF9jb21waWxlcl90ZXN0cyBhcyBkZWZhdWx0IHByb2plY3QKK2lmKE1TVkMpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVFkgVlNfU1RBUlRVUF9QUk9KRUNUIHRocmlmdF9jb21waWxlcl90ZXN0cykKK2VuZGlmKCkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUSUVTIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSBiaW4vKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHRocmlmdF9jb21waWxlcl90ZXN0cykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdF9jb21waWxlcl90ZXN0cyB0aHJpZnRfY29tcGlsZXIpCisKK2VuYWJsZV90ZXN0aW5nKCkKK2FkZF90ZXN0KE5BTUUgVGhyaWZ0VGVzdHMgQ09NTUFORCB0aHJpZnRfY29tcGlsZXJfdGVzdHMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQKQEAgLTAsMCArMSw4OCBAQAorIyBCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlCisKKzwhLS0gVE9DIC0tPgorCistIFtCdWlsZCBhbmQgcnVuIGNvbXBpbGVyIHRlc3RzIHVzaW5nIENNYWtlXSgjYnVpbGQtYW5kLXJ1bi1jb21waWxlci10ZXN0cy11c2luZy1jbWFrZSkKKyAgICAtIFtHZW5lcmFsIGluZm9ybWF0aW9uXSgjZ2VuZXJhbC1pbmZvcm1hdGlvbikKKyAgICAtIFtIb3cgdG8gYWRkIHlvdXIgdGVzdHNdKCNob3ctdG8tYWRkLXlvdXItdGVzdHMpCisgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBVbml4LWxpa2Ugc3lzdGVtc10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24tdW5peC1saWtlLXN5c3RlbXMpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcykKKyAgICAgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2VdKCNidWlsZC1hbmQtcnVuLXRlc3Qtd2l0aC1jbWFrZSkKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3NdKCNidWlsZC1hbmQtcnVuLXRlc3RzLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXM6XSgjcHJlcmVxdWlzaXRlcy0xKQorICAgICAgICAtIFtHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzXSgjZ2VuZXJhdGlvbi1vZi12cy1wcm9qZWN0LXdpdGgtY21ha2UtYnVpbGQtYW5kLXJ1bi1vbi13aW5kb3dzKQorCis8IS0tIC9UT0MgLS0+CisKKyMjIEdlbmVyYWwgaW5mb3JtYXRpb24gCisKK0FkZGVkIGdlbmVyaWMgd2F5IHRvIGNvdmVyIGNvZGUgYnkgdGVzdHMgZm9yIG1hbnkgbGFuZ3VhZ2VzICh5b3UganVzdCBuZWVkIHRvIG1ha2UgYSBjb3JyZWN0IGhlYWRlciBmaWxlIGZvciBnZW5lcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgLSBleGFtcGxlIGluICoqbmV0Y29yZSoqIGltcGxlbWVudGF0aW9uKQorCitBdCBjdXJyZW50IG1vbWVudCB0aGVzZSB0ZXN0cyB1c2UgZnJlZSBDYXRjaCBsaWJyYXJ5IChodHRwczovL2dpdGh1Yi5jb20vY2F0Y2hvcmcvQ2F0Y2gyL3RyZWUvQ2F0Y2gxLngpIGZvciBlYXN5IHRlc3QgY3JlYXRpb24gYW5kIHVzYWdlLgorRGVjaXNpb24gdG8gdXNlIGl0IHdhcyBiZWNhdXNlIG9mIHNpbXBsaWNpdHksIGVhc3kgdXNhZ2UsIG9uZSBoZWFkZXIgZmlsZSB0byB1c2UsIHN0YWJsZSBjb21tdW5pdHkgYW5kIGdyb3dpbmcgaW50ZXJlc3QgIChodHRwczovL2NwcC5saWJodW50LmNvbS9wcm9qZWN0L2dvb2dsZXRlc3QtZ29vZ2xlL3ZzL2NhdGNoP3JlbD1jbXAtY21wKQorCitBbHNvLCBtYXliZSwgbGF0ZXIgaXQgd2lsbCBiZSBtaWdyYXRlZCB0byBDYXRjaDIgKGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaCkgLSBkZXBlbmRzIG9uIG5lZWQgdG8gc3VwcG9ydCBsZWdhY3kgY29tcGlsZXJzIChjKys5OCkKKworIyMgSG93IHRvIGFkZCB5b3VyIHRlc3RzCisKKy0gT3BlbiAqKkNNYWtlTGlzdHMudHh0KioKKy0gU2V0ICoqT24qKiB0byBjYWxsIG9mICoqVEhSSUZUX0FERF9DT01QSUxFUioqIGZvciB5b3VyIGxhbmd1YWdlCisKK2BgYCBjbWFrZSAKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorYGBgCisKKy0gQ3JlYXRlIGZvbGRlciB3aXRoIG5hbWUgc3BlY2lmaWVkIGluIGxpc3Qgb2YgbGFuZ3VhZ2VzIGluICoqQ01ha2VMaXN0cy50eHQqKgorLSBDcmVhdGUgdGVzdHMgaW4gZm9sZGVyIGZvciB5b3VyIGxhbmd1YWdlICh3aXRoIGV4dGVuc2lvbnMgbGlrZSAqLmMqIC0gY2MsIGNwcCwgZXRjKQorICAtIERvbid0IGZvcmdldCB0byBhZGQgaW5jbHVkZSBvZiBjYXRjaC5ocHAgaW4geW91ciB0ZXN0IGZpbGUKKyAgYGBgIEMKKyAgI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyAgYGBgCisKKy0gSWYgeW91IG5lZWQgLSBhZGQgZmlsZXMgbWFudWFsbHkgdG8gKip0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMqKiBpbiAqKkNNYWtlTGlzdHMudHh0Kiogc2ltaWxhciB0byAKKworYGBgIGNtYWtlCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKK2BgYAorCistIFJ1biAqKmNtYWtlKiogd2l0aCBhcmd1bWVudHMgZm9yIHlvdXIgZW52aXJvbm1lbnQgYW5kIGNvbXBpbGVyIAorLSBFbmpveQorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zCisKKyMjIyBQcmVyZXF1aXNpdGVzOgorLSBJbnN0YWxsIENNYWtlIC0gPGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLz4KKy0gSW5zdGFsbCB3aW5mbGV4Ymlzb24gLSA8aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLz4KKworIyMjIEJ1aWxkIGFuZCBydW4gdGVzdCB3aXRoIENNYWtlCisKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLi4KK2NtYWtlIC0tYnVpbGQgLgorY3Rlc3QgLUMgRGVidWcgLVYKK2BgYAorCisjIyBCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFdpbmRvd3MKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorLSBJbnN0YWxsIFZTMjAxNyBDb21tdW5pdHkgRWRpdGlvbiAtIDxodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL3doYXRzbmV3Lz4gKGVuc3VyZSB0aGF0IHlvdSBpbnN0YWxsZWQgd29ya2xvYWQgIkRlc2t0b3AgRGV2ZWxvcG1lbnQgd2l0aCBDKysiIGZvciBWUzIwMTcpCisKKyMjIyBHZW5lcmF0aW9uIG9mIFZTIHByb2plY3Qgd2l0aCBDTWFrZSwgYnVpbGQgYW5kIHJ1biBvbiBXaW5kb3dzCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmUgaW4gY3VycmVudCBkaXJlY3RvcnkgKGVuc3VyZSB0aGF0IFZTIGluc3RhbGxlZCk6CisKK2BgYAorbWtkaXIgY21ha2UtdnMKK2NkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAKQEAgLTAsMCArMSwxMTUwOCBAQAorLyoKKyAqICBDYXRjaCB2MS45LjQKKyAqICBHZW5lcmF0ZWQ6IDIwMTctMDUtMTYgMTM6NTE6NTUuNTA2NTE5CisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgZmlsZSBoYXMgYmVlbiBtZXJnZWQgZnJvbSBtdWx0aXBsZSBoZWFkZXJzLiBQbGVhc2UgZG9uJ3QgZWRpdCBpdCBkaXJlY3RseQorICogIENvcHlyaWdodCAoYykgMjAxMiBUd28gQmx1ZSBDdWJlcyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAqICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworI2lmbmRlZiBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgcHJhZ21hIGNsYW5nIHN5c3RlbV9oZWFkZXIKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3N1cHByZXNzX3dhcm5pbmdzLmgKKworI2lmZGVmIF9fY2xhbmdfXworIyAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjICAgICAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDE2MSAxNjgyKQorIyAgIGVsc2UgLy8gX19JQ0MKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdnbG9iYWwtY29uc3RydWN0b3JzIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjOTktZXh0ZW5zaW9ucyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0IgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzk4LWNvbXBhdC1wZWRhbnRpYyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzd2l0Y2gtZW51bSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IgorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd2YXJpYWRpYy1tYWNyb3MiCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFyZW50aGVzZXMiCisKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfTUFJTikgfHwgZGVmaW5lZChDQVRDSF9DT05GSUdfUlVOTkVSKQorIyAgZGVmaW5lIENBVENIX0lNUEwKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorIyAgaWZuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU4KKyMgIGVuZGlmCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1PTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21waWxlcl9jYXBhYmlsaXRpZXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NUElMRVJfQ0FQQUJJTElUSUVTX0hQUF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNIDogc3RkOjppc19lbnVtIGlzIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRSA6IHN0ZDo6dHVwbGUgaXMgc3VwcG9ydGVkCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HIDogaXMgbG9uZyBsb25nIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSA6IGlzIHN0ZDo6c2h1ZmZsZSBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMgOiBhcmUgdHlwZV90cmFpdHMgYW5kIGVuYWJsZV9pZiBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ09VTlRFUiA6IGlzIHRoZSBfX0NPVU5URVJfXyBtYWNybyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggOiBpcyBXaW5kb3dzIFNFSCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyA6IGFyZSBQT1NJWCBzaWduYWxzIHN1cHBvcnRlZD8KKy8vICoqKioqKioqKioqKioqKioKKy8vIE5vdGUgdG8gbWFpbnRhaW5lcnM6IGlmIG5ldyB0b2dnbGVzIGFyZSBhZGRlZCBwbGVhc2UgZG9jdW1lbnQgdGhlbQorLy8gaW4gY29uZmlndXJhdGlvbi5tZCwgdG9vCisvLyAqKioqKioqKioqKioqKioqCisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0FUQ0hfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENBVENIX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworIyAgaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTRfT1JfR1JFQVRFUgorIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBfX2NsYW5nX18KKworIyAgaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2V4aXQtdGltZS1kZXN0cnVjdG9yc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKworIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcHVzaCIgKSBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdwYXJlbnRoZXNlc1wiIiApCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorIyAgIGVuZGlmCisKKyNlbmRpZiAvLyBfX2NsYW5nX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdlIGtub3cgc29tZSBlbnZpcm9ubWVudHMgbm90IHRvIHN1cHBvcnQgZnVsbCBQT1NJWCBzaWduYWxzCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fUU5YX18pCisKKyMgICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTCisjICAgZW5kaWYKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDeWd3aW4KKyNpZmRlZiBfX0NZR1dJTl9fCisKKy8vIFJlcXVpcmVkIGZvciBzb21lIHZlcnNpb25zIG9mIEN5Z3dpbiB0byBkZWNsYXJlIGdldHRpbWVvZmRheQorLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM2OTAxODAzL2dldHRpbWVvZmRheS1ub3QtZGVjbGFyZWQtaW4tdGhpcy1zY29wZS1jeWd3aW4KKyMgICBkZWZpbmUgX0JTRF9TT1VSQ0UKKworI2VuZGlmIC8vIF9fQ1lHV0lOX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJvcmxhbmQKKyNpZmRlZiBfX0JPUkxBTkRDX18KKworI2VuZGlmIC8vIF9fQk9STEFORENfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRURHCisjaWZkZWYgX19FREdfVkVSU0lPTl9fCisKKyNlbmRpZiAvLyBfX0VER19WRVJTSU9OX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERpZ2l0YWwgTWFycworI2lmZGVmIF9fRE1DX18KKworI2VuZGlmIC8vIF9fRE1DX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdDQworI2lmZGVmIF9fR05VQ19fCisKKyMgICBpZiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfV0lORE9XU19TRUgKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBVc2UgdmFyaWFkaWMgbWFjcm9zIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVtCisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID4gMTQwMCAmJiAhZGVmaW5lZCBfX0VER0VfXykgfHwgXAorICAgICggZGVmaW5lZCBfX1dBVkVfXyAmJiBfX1dBVkVfSEFTX1ZBUklBRElDUyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMyApIHx8IFwKKyAgICAoICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisKKyNlbmRpZgorCisvLyBVc2UgX19DT1VOVEVSX18gaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0CisjaWYgKCBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEzMDAgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fR05VQ19fICAmJiBfX0dOVUNfXyA+PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPj0gMyApCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIKKworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoQ0FUQ0hfQ1BQMTFfT1JfR1JFQVRFUikKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0KKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICBlbmRpZgorIyBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworLy8gTm93IHNldCB0aGUgYWN0dWFsIGRlZmluZXMgYmFzZWQgb24gdGhlIGFib3ZlICsgYW55dGhpbmcgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fVkFSSUFESUNfTUFDUk9TKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKy8vIFVzZSBvZiBfX0NPVU5URVJfXyBpcyBzdXBwcmVzc2VkIGlmIF9fSkVUQlJBSU5TX0lERV9fIGlzICNkZWZpbmVkIChtZWFuaW5nIHdlJ3JlIGJlaW5nIHBhcnNlZCBieSBhIEpldEJyYWlucyBJREUgZm9yCisvLyBhbmFseXRpY3MpIGJlY2F1c2UsIGF0IHRpbWUgb2Ygd3JpdGluZywgX19DT1VOVEVSX18gaXMgbm90IHByb3Blcmx5IGhhbmRsZWQgYnkgaXQuCisvLyBUaGlzIGRvZXMgbm90IGFmZmVjdCBjb21waWxhdGlvbgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoX19KRVRCUkFJTlNfSURFX18pCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DT1VOVEVSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNlbmRpZgorIyBpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyMgZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfV0lORE9XU19TRUgpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorI2VuZGlmCisvLyBUaGlzIGlzIHNldCBieSBkZWZhdWx0LCBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHVuaXggY29tcGlsZXJzIGFyZSBwb3NpeC1zaWduYWwtY29tcGF0aWJsZSBieSBkZWZhdWx0LgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUworIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworI2VuZGlmCisKKy8vIG5vZXhjZXB0IHN1cHBvcnQ6CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX05PRVhDRVBUKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBkZWZpbmUgQ0FUQ0hfTlVMTCBudWxscHRyCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDQVRDSF9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkgbmFtZSMjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKQorI2lmZGVmIENBVENIX0NPTkZJR19DT1VOVEVSCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0NPVU5URVJfXyApCisjZWxzZQorIyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19MSU5FX18gKQorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApICNleHByCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWSggZXhwciApIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWTIoIGV4cHIgKQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBDYXNlU2Vuc2l0aXZlIHsgZW51bSBDaG9pY2UgeworICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIE5vbkNvcHlhYmxlIHsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlICYmICkgICAgICAgICAgICAgICAgICA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKSA9IGRlbGV0ZTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSAmJiApICAgICA9IGRlbGV0ZTsKKyNlbHNlCisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSBjb25zdCYgaW5mbyApOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApOworI2VuZGlmCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIE5vbkNvcHlhYmxlKCkge30KKyAgICAgICAgdmlydHVhbCB+Tm9uQ29weWFibGUoKTsKKyAgICB9OworCisgICAgY2xhc3MgU2FmZUJvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiB2b2lkIChTYWZlQm9vbDo6KnR5cGUpKCkgY29uc3Q7CisKKyAgICAgICAgc3RhdGljIHR5cGUgbWFrZVNhZmUoIGJvb2wgdmFsdWUgKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAmU2FmZUJvb2w6OnRydWVWYWx1ZSA6IDA7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHRydWVWYWx1ZSgpIGNvbnN0IHt9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsKCBDb250YWluZXJUJiBjb250YWluZXIgKSB7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIENvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgKml0OworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ+CisgICAgaW5saW5lIHZvaWQgZGVsZXRlQWxsVmFsdWVzKCBBc3NvY2lhdGl2ZUNvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gY29udGFpbmVyLmVuZCgpOworICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICk7CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHN1ZmZpeCApOworICAgIGJvb2wgY29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgaW5maXggKTsKKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApOworICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICk7CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApOworICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICk7CisKKyAgICBzdHJ1Y3QgcGx1cmFsaXNlIHsKKyAgICAgICAgcGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICk7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBwbHVyYWxpc2UgY29uc3QmIHBsdXJhbGlzZXIgKTsKKworICAgICAgICBzdGQ6OnNpemVfdCBtX2NvdW50OworICAgICAgICBzdGQ6OnN0cmluZyBtX2xhYmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgU291cmNlTGluZUluZm8geworCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCk7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBTb3VyY2VMaW5lSW5mbyhTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIpICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8oIFNvdXJjZUxpbmVJbmZvICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKworICAgICAgICBjaGFyIGNvbnN0KiBmaWxlOworICAgICAgICBzdGQ6OnNpemVfdCBsaW5lOworICAgIH07CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKTsKKworICAgIC8vIFRoaXMgaXMganVzdCBoZXJlIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggbWFjcm8gY29uc3RhbnRzIGFuZCBib29sZWFuIGxpdGVyYWxzCisgICAgaW5saW5lIGJvb2wgaXNUcnVlKCBib29sIHZhbHVlICl7IHJldHVybiB2YWx1ZTsgfQorICAgIGlubGluZSBib29sIGFsd2F5c1RydWUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzRmFsc2UoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCB0aHJvd0xvZ2ljRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbG9jYXRpb25JbmZvICk7CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCk7CisKKyAgICAvLyBVc2UgdGhpcyBpbiB2YXJpYWRpYyBzdHJlYW1pbmcgbWFjcm9zIHRvIGFsbG93CisgICAgLy8gICAgPj4gK1N0cmVhbUVuZFN0b3AKKyAgICAvLyBhcyB3ZWxsIGFzCisgICAgLy8gICAgPj4gc3R1ZmYgK1N0cmVhbUVuZFN0b3AKKyAgICBzdHJ1Y3QgU3RyZWFtRW5kU3RvcCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wZXJhdG9yKygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFQgY29uc3QmIG9wZXJhdG9yICsgKCBUIGNvbnN0JiB2YWx1ZSwgU3RyZWFtRW5kU3RvcCApIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK30KKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyA6OkNhdGNoOjpTb3VyY2VMaW5lSW5mbyggX19GSUxFX18sIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggX19MSU5FX18gKSApCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0VSUk9SKCBtc2cgKSA6OkNhdGNoOjp0aHJvd0xvZ2ljRXJyb3IoIG1zZywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIH5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpIENBVENIX05PRVhDRVBUIHt9CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3doYXQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIG1fbGluZUluZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgQ0FUQ0hfTk9UX0lNUExFTUVOVEVEIHRocm93IENhdGNoOjpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY29udGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05URVhUX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfZ2VuZXJhdG9ycy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0dFTkVSQVRPUlNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElHZW5lcmF0b3JJbmZvIHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvckluZm8oKTsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElHZW5lcmF0b3JzRm9yVGVzdCB7CisgICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JzRm9yVGVzdCgpOworCisgICAgICAgIHZpcnR1YWwgSUdlbmVyYXRvckluZm8mIGdldEdlbmVyYXRvckluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc3RkOjpzaXplX3Qgc2l6ZSApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIG1vdmVOZXh0KCkgPSAwOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcHRyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUFRSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBpbnRydXNpdmUgcmVmZXJlbmNlIGNvdW50aW5nIHNtYXJ0IHBvaW50ZXIuCisgICAgLy8gVCBtdXN0IGltcGxlbWVudCBhZGRSZWYoKSBhbmQgcmVsZWFzZSgpIG1ldGhvZHMKKyAgICAvLyB0eXBpY2FsbHkgaW1wbGVtZW50aW5nIHRoZSBJU2hhcmVkIGludGVyZmFjZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUHRyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFB0cigpIDogbV9wKCBDQVRDSF9OVUxMICl7fQorICAgICAgICBQdHIoIFQqIHAgKSA6IG1fcCggcCApeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5hZGRSZWYoKTsKKyAgICAgICAgfQorICAgICAgICBQdHIoIFB0ciBjb25zdCYgb3RoZXIgKSA6IG1fcCggb3RoZXIubV9wICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIH5QdHIoKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1fcCA9IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHRyJiBvcGVyYXRvciA9ICggVCogcCApeworICAgICAgICAgICAgUHRyIHRlbXAoIHAgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBQdHIgY29uc3QmIG90aGVyICl7CisgICAgICAgICAgICBQdHIgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN3YXAoIFB0ciYgb3RoZXIgKSB7IHN0ZDo6c3dhcCggbV9wLCBvdGhlci5tX3AgKTsgfQorICAgICAgICBUKiBnZXQoKSBjb25zdHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbV9wOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBtX3A7IH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbV9wID09IENBVENIX05VTEw7IH0KKyAgICAgICAgb3BlcmF0b3IgU2FmZUJvb2w6OnR5cGUoKSBjb25zdCB7IHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIG1fcCAhPSBDQVRDSF9OVUxMICk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQqIG1fcDsKKyAgICB9OworCisgICAgc3RydWN0IElTaGFyZWQgOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHZpcnR1YWwgfklTaGFyZWQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBJU2hhcmVkPgorICAgIHN0cnVjdCBTaGFyZWRJbXBsIDogVCB7CisKKyAgICAgICAgU2hhcmVkSW1wbCgpIDogbV9yYyggMCApe30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgeworICAgICAgICAgICAgKyttX3JjOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIC0tbV9yYyA9PSAwICkKKyAgICAgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgdW5zaWduZWQgaW50IG1fcmM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgU3RyZWFtOworICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZTsKKyAgICBzdHJ1Y3QgSVJ1bm5lcjsKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0OworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElDb250ZXh0CisgICAgeworICAgICAgICB2aXJ0dWFsIH5JQ29udGV4dCgpOworCisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSU11dGFibGVDb250ZXh0IDogSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlQ29udGV4dCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSA9IDA7CisgICAgfTsKKworICAgIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpOworICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpOworICAgIFN0cmVhbSBjcmVhdGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJlYW1OYW1lICk7CisKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc190ZXN0Y2FzZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RFU1RDQVNFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjOworCisgICAgc3RydWN0IElUZXN0Q2FzZSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlICgpIGNvbnN0ID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZSgpOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUZXN0Q2FzZVJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK2NsYXNzIE1ldGhvZFRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisKK3B1YmxpYzoKKyAgICBNZXRob2RUZXN0Q2FzZSggdm9pZCAoQzo6Km1ldGhvZCkoKSApIDogbV9tZXRob2QoIG1ldGhvZCApIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICBDIG9iajsKKyAgICAgICAgKG9iai4qbV9tZXRob2QpKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZpcnR1YWwgfk1ldGhvZFRlc3RDYXNlKCkge30KKworICAgIHZvaWQgKEM6OiptX21ldGhvZCkoKTsKK307CisKK3R5cGVkZWYgdm9pZCgqVGVzdEZ1bmN0aW9uKSgpOworCitzdHJ1Y3QgTmFtZUFuZERlc2MgeworICAgIE5hbWVBbmREZXNjKCBjb25zdCBjaGFyKiBfbmFtZSA9ICIiLCBjb25zdCBjaGFyKiBfZGVzY3JpcHRpb249ICIiICkKKyAgICA6IG5hbWUoIF9uYW1lICksIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKQorICAgIHt9CisKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgKCAgIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKworc3RydWN0IEF1dG9SZWcgeworCisgICAgQXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgIEF1dG9SZWcKKyAgICAgICAgKCAgIHZvaWQgKEM6OiptZXRob2QpKCksCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc05hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIG5ldyBNZXRob2RUZXN0Q2FzZTxDPiggbWV0aG9kICksCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgICAgIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgfkF1dG9SZWcoKTsKKworcHJpdmF0ZToKKyAgICBBdXRvUmVnKCBBdXRvUmVnIGNvbnN0JiApOworICAgIHZvaWQgb3BlcmF0b3I9ICggQXV0b1JlZyBjb25zdCYgKTsKK307CisKK3ZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBUZXN0TmFtZSwgLi4uICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgX19WQV9BUkdTX18gKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCAuLi4gKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlF1YWxpZmllZE1ldGhvZCwgIiYiICNRdWFsaWZpZWRNZXRob2QsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdE5hbWUsIENsYXNzTmFtZSwgLi4uIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogQ2xhc3NOYW1leyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7IFwKKyAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgIENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkgKCAmVGVzdE5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3ROYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgQ2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApICk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworI2Vsc2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlRlc3ROYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgfVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggTmFtZSwgRGVzYyApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBOYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIFRlc3RDYXNlTmFtZSwgQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0Q2FzZU5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0Q2FzZU5hbWU6OnRlc3QsICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kRGVzYyggVGVzdE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICB2b2lkIFRlc3RDYXNlTmFtZTo6dGVzdCgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgQ2F0Y2g6OkF1dG9SZWcoIEZ1bmN0aW9uLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBOYW1lLCBEZXNjICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NhcHR1cmUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DQVBUVVJFX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX0JVSUxERVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X3R5cGUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX1RZUEVfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVzdWx0V2FzOjpPZlR5cGUgZW51bQorICAgIHN0cnVjdCBSZXN1bHRXYXMgeyBlbnVtIE9mVHlwZSB7CisgICAgICAgIFVua25vd24gPSAtMSwKKyAgICAgICAgT2sgPSAwLAorICAgICAgICBJbmZvID0gMSwKKyAgICAgICAgV2FybmluZyA9IDIsCisKKyAgICAgICAgRmFpbHVyZUJpdCA9IDB4MTAsCisKKyAgICAgICAgRXhwcmVzc2lvbkZhaWxlZCA9IEZhaWx1cmVCaXQgfCAxLAorICAgICAgICBFeHBsaWNpdEZhaWx1cmUgPSBGYWlsdXJlQml0IHwgMiwKKworICAgICAgICBFeGNlcHRpb24gPSAweDEwMCB8IEZhaWx1cmVCaXQsCisKKyAgICAgICAgVGhyZXdFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAxLAorICAgICAgICBEaWRudFRocm93RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMiwKKworICAgICAgICBGYXRhbEVycm9yQ29uZGl0aW9uID0gMHgyMDAgfCBGYWlsdXJlQml0CisKKyAgICB9OyB9OworCisgICAgaW5saW5lIGJvb2wgaXNPayggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAgICAgcmV0dXJuICggcmVzdWx0VHlwZSAmIFJlc3VsdFdhczo6RmFpbHVyZUJpdCApID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIGlzSnVzdEluZm8oIGludCBmbGFncyApIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzID09IFJlc3VsdFdhczo6SW5mbzsKKyAgICB9CisKKyAgICAvLyBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgZW51bQorICAgIHN0cnVjdCBSZXN1bHREaXNwb3NpdGlvbiB7IGVudW0gRmxhZ3MgeworICAgICAgICBOb3JtYWwgPSAweDAxLAorCisgICAgICAgIENvbnRpbnVlT25GYWlsdXJlID0gMHgwMiwgICAvLyBGYWlsdXJlcyBmYWlsIHRlc3QsIGJ1dCBleGVjdXRpb24gY29udGludWVzCisgICAgICAgIEZhbHNlVGVzdCA9IDB4MDQsICAgICAgICAgICAvLyBQcmVmaXggZXhwcmVzc2lvbiB3aXRoICEKKyAgICAgICAgU3VwcHJlc3NGYWlsID0gMHgwOCAgICAgICAgIC8vIEZhaWx1cmVzIGFyZSByZXBvcnRlZCBidXQgZG8gbm90IGZhaWwgdGhlIHRlc3QKKyAgICB9OyB9OworCisgICAgaW5saW5lIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBvcGVyYXRvciB8ICggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGxocywgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJocyApIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncz4oIHN0YXRpY19jYXN0PGludD4oIGxocyApIHwgc3RhdGljX2Nhc3Q8aW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBzaG91bGRDb250aW51ZU9uRmFpbHVyZSggaW50IGZsYWdzICkgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBpc0ZhbHNlVGVzdCggaW50IGZsYWdzICkgICAgICAgICAgICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QgKSAhPSAwOyB9CisgICAgaW5saW5lIGJvb2wgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsICkgIT0gMDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbjsKKworICAgIHN0cnVjdCBEZWNvbXBvc2VkRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgdmlydHVhbCB+RGVjb21wb3NlZEV4cHJlc3Npb24oKSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgPSAwOworCisgICAgICAgIC8vIE9ubHkgc2ltcGxlIGJpbmFyeSBjb21wYXJpc29ucyBjYW4gYmUgZGVjb21wb3NlZC4KKyAgICAgICAgLy8gSWYgbW9yZSBjb21wbGV4IGNoZWNrIGlzIHJlcXVpcmVkIHRoZW4gd3JhcCBzdWItZXhwcmVzc2lvbnMgaW4gcGFyZW50aGVzZXMuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgKiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgLyAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJSAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgJiYgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIHx8ICggVCBjb25zdCYgKTsKKworCXByaXZhdGU6CisJCURlY29tcG9zZWRFeHByZXNzaW9uJiBvcGVyYXRvciA9IChEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYpOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbworICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbygpIHt9CisgICAgICAgIEFzc2VydGlvbkluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBzdGQ6OnN0cmluZyBjYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbjsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblJlc3VsdERhdGEKKyAgICB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEoKSA6IGRlY29tcG9zZWRFeHByZXNzaW9uKCBDQVRDSF9OVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmVzdWx0VHlwZSggUmVzdWx0V2FzOjpVbmtub3duICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbmVnYXRlZCggZmFsc2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXJlbnRoZXNpemVkKCBmYWxzZSApIHt9CisKKyAgICAgICAgdm9pZCBuZWdhdGUoIGJvb2wgcGFyZW50aGVzaXplICkgeworICAgICAgICAgICAgbmVnYXRlZCA9ICFuZWdhdGVkOworICAgICAgICAgICAgcGFyZW50aGVzaXplZCA9IHBhcmVudGhlc2l6ZTsKKyAgICAgICAgICAgIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6T2sgKQorICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCByZXN1bHRUeXBlID09IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZCApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIGRlY29tcG9zZWRFeHByZXNzaW9uICE9IENBVENIX05VTEwgKSB7CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24tPnJlY29uc3RydWN0RXhwcmVzc2lvbiggcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICBpZiggcGFyZW50aGVzaXplZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnKCcgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uYXBwZW5kKCAxLCAnKScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG5lZ2F0ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmluc2VydCggMCwgMSwgJyEnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlY29tcG9zZWRFeHByZXNzaW9uID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIG11dGFibGUgRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QqIGRlY29tcG9zZWRFeHByZXNzaW9uOworICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlOworICAgICAgICBib29sIG5lZ2F0ZWQ7CisgICAgICAgIGJvb2wgcGFyZW50aGVzaXplZDsKKyAgICB9OworCisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEFzc2VydGlvblJlc3VsdCgpOworICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKTsKKyAgICAgICAgfkFzc2VydGlvblJlc3VsdCgpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25SZXN1bHQgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBib29sIGlzT2soKSBjb25zdDsKKyAgICAgICAgYm9vbCBzdWNjZWVkZWQoKSBjb25zdDsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgZ2V0UmVzdWx0VHlwZSgpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNNZXNzYWdlKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gZ2V0U291cmNlSW5mbygpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2luZm87CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgbV9yZXN1bHREYXRhOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgbmFtZXNwYWNlIEltcGwgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFsbE9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hBbnlPZjsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoTm90T2Y7CisKKyAgICAgICAgY2xhc3MgTWF0Y2hlclVudHlwZWRCYXNlIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIG1fY2FjaGVkVG9TdHJpbmcuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG1fY2FjaGVkVG9TdHJpbmcgPSBkZXNjcmliZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHZpcnR1YWwgfk1hdGNoZXJVbnR5cGVkQmFzZSgpOworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbV9jYWNoZWRUb1N0cmluZzsKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIE1hdGNoZXJVbnR5cGVkQmFzZSYgb3BlcmF0b3IgPSAoIE1hdGNoZXJVbnR5cGVkQmFzZSBjb25zdCYgKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZCB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE9iamVjdFQgY29uc3QmIGFyZyApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHRyVD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJNZXRob2Q8UHRyVCo+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggUHRyVCogYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUID0gT2JqZWN0VD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJCYXNlIDogTWF0Y2hlclVudHlwZWRCYXNlLCBNYXRjaGVyTWV0aG9kPE9iamVjdFQ+IHsKKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAhICgpIGNvbnN0OworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFsbE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBhbmQgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9tYXRjaGVyc1tpXS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQWxsT2Y8QXJnVD4mIG9wZXJhdG9yICYmICggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIG1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0Kj4gbV9tYXRjaGVyczsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQW55T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9tYXRjaGVyc1tpXS0+bWF0Y2goYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoIDQgKyBtX21hdGNoZXJzLnNpemUoKSozMiApOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIoICI7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiBvciAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbnlPZjxBcmdUPiYgb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaE5vdE9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICBNYXRjaE5vdE9mKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSA6IG1fdW5kZXJseWluZ01hdGNoZXIoIHVuZGVybHlpbmdNYXRjaGVyICkge30KKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtX3VuZGVybHlpbmdNYXRjaGVyLm1hdGNoKCBhcmcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdCAiICsgbV91bmRlcmx5aW5nTWF0Y2hlci50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG1fdW5kZXJseWluZ01hdGNoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4oKSAmJiAqdGhpcyAmJiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFueU9mPENvbXBhcmF0b3JUPigpIHx8ICp0aGlzIHx8IG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yICEgKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+KCAqdGhpcyApOworICAgICAgICB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisgICAgLy8gLSBkZXByZWNhdGVkOiBwcmVmZXIgfHwsICYmIGFuZCAhCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hOb3RPZjxUPiBOb3QoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoTm90T2Y8VD4oIHVuZGVybHlpbmdNYXRjaGVyICk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFsbE9mPFQ+IEFsbE9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbGxPZjxUPigpICYmIG0xICYmIG0yICYmIG0zOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMjsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbnlPZjxUPiBBbnlPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMyApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQW55T2Y8VD4oKSB8fCBtMSB8fCBtMiB8fCBtMzsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKK3VzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKK3VzaW5nIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUZXN0RmFpbHVyZUV4Y2VwdGlvbnt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgRXhwcmVzc2lvbkxoczsKKworICAgIHN0cnVjdCBDb3B5YWJsZVN0cmVhbSB7CisgICAgICAgIENvcHlhYmxlU3RyZWFtKCkge30KKyAgICAgICAgQ29weWFibGVTdHJlYW0oIENvcHlhYmxlU3RyZWFtIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICAgICAgQ29weWFibGVTdHJlYW0mIG9wZXJhdG9yPSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzLnN0cihzdGQ6OnN0cmluZygpKTsKKyAgICAgICAgICAgIG9zcyA8PCBvdGhlci5vc3Muc3RyKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICB9OworCisgICAgY2xhc3MgUmVzdWx0QnVpbGRlciA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CisgICAgcHVibGljOgorICAgICAgICBSZXN1bHRCdWlsZGVyKCAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnID0gIiIgKTsKKyAgICAgICAgflJlc3VsdEJ1aWxkZXIoKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiBvcGVyYXRvciA8PSAoIFQgY29uc3QmIG9wZXJhbmQgKTsKKyAgICAgICAgRXhwcmVzc2lvbkxoczxib29sPiBvcGVyYXRvciA8PSAoIGJvb2wgdmFsdWUgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBSZXN1bHRCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICk7CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIHNldFJlc3VsdFR5cGUoIGJvb2wgcmVzdWx0ICk7CisKKyAgICAgICAgdm9pZCBlbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCkgY29uc3Q7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCBidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdDsKKworICAgICAgICB2b2lkIHVzZUFjdGl2ZUV4Y2VwdGlvbiggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uID0gUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworICAgICAgICB2b2lkIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwcmVzc2lvbigpOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApOworICAgICAgICB2b2lkIGhhbmRsZVJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKTsKKyAgICAgICAgdm9pZCByZWFjdCgpOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdDsKKyAgICAgICAgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgICAgICB2b2lkIGNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApOworCisgICAgICAgIHZvaWQgc2V0RXhjZXB0aW9uR3VhcmQoKTsKKyAgICAgICAgdm9pZCB1bnNldEV4Y2VwdGlvbkd1YXJkKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1fYXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX2RhdGE7CisgICAgICAgIENvcHlhYmxlU3RyZWFtIG1fc3RyZWFtOworCisgICAgICAgIGJvb2wgbV9zaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG1fc2hvdWxkVGhyb3c7CisgICAgICAgIGJvb2wgbV9ndWFyZEV4Y2VwdGlvbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyBJbmNsdWRlIGFmdGVyIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmN5OgorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4cHJlc3Npb25fbGhzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhQUkVTU0lPTl9MSFNfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ldmFsdWF0ZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VWQUxVQVRFX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDM4OSkgLy8gJz09JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDMxMikgLy8gQ29udmVydGluZyBpbnQgdG8gVCogdXNpbmcgcmVpbnRlcnByZXRfY2FzdCAoaXNzdWUgb24geDY0IHBsYXRmb3JtKQorI2VuZGlmCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIEludGVybmFsIHsKKworICAgIGVudW0gT3BlcmF0b3IgeworICAgICAgICBJc0VxdWFsVG8sCisgICAgICAgIElzTm90RXF1YWxUbywKKyAgICAgICAgSXNMZXNzVGhhbiwKKyAgICAgICAgSXNHcmVhdGVyVGhhbiwKKyAgICAgICAgSXNMZXNzVGhhbk9yRXF1YWxUbywKKyAgICAgICAgSXNHcmVhdGVyVGhhbk9yRXF1YWxUbworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzICAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICIqZXJyb3IqIjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzRXF1YWxUbz4gICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj09IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTm90RXF1YWxUbz4gICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiE9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW4+ICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjwiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNHcmVhdGVyVGhhbj4gICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPiI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0xlc3NUaGFuT3JFcXVhbFRvPiAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI8PSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPnsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+PSI7IH0gfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIFQmIG9wQ2FzdChUIGNvbnN0JiB0KSB7IHJldHVybiBjb25zdF9jYXN0PFQmPih0KTsgfQorCisvLyBudWxscHRyX3Qgc3VwcG9ydCBiYXNlZCBvbiBwdWxsIHJlcXVlc3QgIzE1NCBmcm9tIEtvbnN0YW50aW4gQmF1bWFubgorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgaW5saW5lIHN0ZDo6bnVsbHB0cl90IG9wQ2FzdChzdGQ6Om51bGxwdHJfdCkgeyByZXR1cm4gbnVsbHB0cjsgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKKyAgICAvLyBTbyB0aGUgY29tcGFyZSBvdmVybG9hZHMgY2FuIGJlIG9wZXJhdG9yIGFnbm9zdGljIHdlIGNvbnZleSB0aGUgb3BlcmF0b3IgYXMgYSB0ZW1wbGF0ZQorICAgIC8vIGVudW0sIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lhbGlzZSBhbiBFdmFsdWF0b3IgZm9yIGRvaW5nIHRoZSBjb21wYXJpc29uLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgT3BlcmF0b3IgT3A+CisgICAgY2xhc3MgRXZhbHVhdG9ye307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocykgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPT0gIG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc05vdEVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSAhPSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDwgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW4+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPj0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTGVzc1RoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA8PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGFwcGx5RXZhbHVhdG9yKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQxLCBUMiwgT3A+OjpldmFsdWF0ZSggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cyB1cyB0byBzcGVjaWFsaXNlIGZvciBpbnRlZ2VyIHR5cGVzCisgICAgLy8gdG8gYXZvaWQgc2lnbmVkLyB1bnNpZ25lZCB3YXJuaW5ncworCisgICAgLy8gImJhc2UiIG92ZXJsb2FkCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBib29sIGNvbXBhcmUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gaW50CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBjaGFyIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIFggdG8gbG9uZworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGludCBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyBpbnQgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gaW50ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggaW50IGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgLy8gbG9uZyBsb25nIHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nIHRvIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgY2hhciByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBsb25nIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorICAgIC8vIHBvaW50ZXIgdG8gbnVsbHB0cl90ICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IG51bGxwdHIpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggc3RkOjpudWxscHRyX3QsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIG51bGxwdHIsIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIHN0ZDo6bnVsbHB0cl90ICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCBudWxscHRyICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBJbnRlcm5hbAorfSAvLyBlbmQgb2YgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9TVFJJTkdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfb2JqY19hcmMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0FSQ19IUFBfSU5DTFVERUQKKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpZmRlZiBfX2hhc19mZWF0dXJlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIF9faGFzX2ZlYXR1cmUob2JqY19hcmMpCisjZWxzZQorI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCAwCisjZW5kaWYKKwordm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApOworaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqIG9iaiApIHsKKyAgICBbb2JqIHJlbGVhc2VdOworfQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVECisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcKKyNlbHNlCitpbmxpbmUgdm9pZCBhcmNTYWZlUmVsZWFzZSggTlNPYmplY3QqICl7fQoraW5saW5lIGlkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKSB7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYXJjLXBlcmZvcm1TZWxlY3Rvci1sZWFrcyIKKyNlbmRpZgorICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICAgIHJldHVybiBuaWw7Cit9CisjZGVmaW5lIENBVENIX1VOU0FGRV9VTlJFVEFJTkVEIF9fdW5zYWZlX3VucmV0YWluZWQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORyBfX3N0cm9uZworI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjaW5jbHVkZSA8dHVwbGU+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworLy8gV2h5IHdlJ3JlIGhlcmUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICk7CisKKy8vIEJ1aWx0IGluIG92ZXJsb2FkcworCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzaWduZWQgY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKTsKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBsb25nIGxvbmcgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKTsKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApOworI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TT2JqZWN0KiBjb25zdCYgbnNPYmplY3QgKTsKKyNlbmRpZgorCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGV4dGVybiBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZzsKKworICNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU1RSRUFNX0lOU0VSVEFCTEVfQ0hFQ0spCisgICAgc3RydWN0IEJvcmdUeXBlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQm9yZ1R5cGUoIFQgY29uc3QmICk7CisgICAgfTsKKworICAgIHN0cnVjdCBUcnVlVHlwZSB7IGNoYXIgc2l6ZXJbMV07IH07CisgICAgc3RydWN0IEZhbHNlVHlwZSB7IGNoYXIgc2l6ZXJbMl07IH07CisKKyAgICBUcnVlVHlwZSYgdGVzdFN0cmVhbWFibGUoIHN0ZDo6b3N0cmVhbSYgKTsKKyAgICBGYWxzZVR5cGUgdGVzdFN0cmVhbWFibGUoIEZhbHNlVHlwZSApOworCisgICAgRmFsc2VUeXBlIG9wZXJhdG9yPDwoIHN0ZDo6b3N0cmVhbSBjb25zdCYsIEJvcmdUeXBlIGNvbnN0JiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSAmczsKKyAgICAgICAgc3RhdGljIFQgIGNvbnN0JnQ7CisgICAgICAgIGVudW0geyB2YWx1ZSA9IHNpemVvZiggdGVzdFN0cmVhbWFibGUocyA8PCB0KSApID09IHNpemVvZiggVHJ1ZVR5cGUgKSB9OworICAgIH07CisjZWxzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgSXNTdHJlYW1JbnNlcnRhYmxlIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU1MsIHR5cGVuYW1lIFRUPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KGludCkKKyAgICAgICAgLT4gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxTUyY+KCkgPDwgc3RkOjpkZWNsdmFsPFRUPigpLCBzdGQ6OnRydWVfdHlwZSgpICk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgYXV0byB0ZXN0KC4uLikgLT4gc3RkOjpmYWxzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGRlY2x0eXBlKHRlc3Q8c3RkOjpvc3RyZWFtLGNvbnN0IFQmPigwKSk6OnZhbHVlOworICAgIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBib29sIElzRW51bSA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUKKyAgICAgICAgICAgICA+CisgICAgc3RydWN0IEVudW1TdHJpbmdNYWtlcgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmICkgeyByZXR1cm4gdW5wcmludGFibGVTdHJpbmc7IH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyPFQsdHJ1ZT4KKyAgICB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OnRvU3RyaW5nKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPih2KQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9OworI2VuZGlmCisgICAgdGVtcGxhdGU8Ym9vbCBDPgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2UgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiB2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVudW1TdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdiApOworICAgICAgICB9CisjZWxzZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorI2VuZGlmCisgICAgfTsKKworICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXJCYXNlPHRydWU+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgX3ZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3Qgdm9pZCAqb2JqZWN0LCBzdGQ6OnNpemVfdCBzaXplICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3QgVCYgb2JqZWN0ICkgeworICAgICAgcmV0dXJuIHJhd01lbW9yeVRvU3RyaW5nKCAmb2JqZWN0LCBzaXplb2Yob2JqZWN0KSApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyIDoKKyAgICBEZXRhaWw6OlN0cmluZ01ha2VyQmFzZTxEZXRhaWw6OklzU3RyZWFtSW5zZXJ0YWJsZTxUPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN0cmluZ01ha2VyPFQqPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVSogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQz4KK3N0cnVjdCBTdHJpbmdNYWtlcjxSIEM6Oio+IHsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggUiBDOjoqIHAgKSB7CisgICAgICAgIGlmKCAhcCApCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpyYXdNZW1vcnlUb1N0cmluZyggcCApOworICAgIH0KK307CisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICk7Cit9CisKKy8vdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorLy9zdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp2ZWN0b3I8VCwgQWxsb2NhdG9yPiA+IHsKKy8vICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisvLyAgICAgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7CisvLyAgICB9CisvL307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnZlY3RvcjxULEFsbG9jYXRvcj4gY29uc3QmIHYgKSB7CisgICAgcmV0dXJuIERldGFpbDo6cmFuZ2VUb1N0cmluZyggdi5iZWdpbigpLCB2LmVuZCgpICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKworLy8gdG9TdHJpbmcgZm9yIHR1cGxlcworbmFtZXNwYWNlIFR1cGxlRGV0YWlsIHsKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4gPSAwLAorICAgICAgYm9vbCA9IChOIDwgc3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpCisgICAgICA+CisgIHN0cnVjdCBFbGVtZW50UHJpbnRlciB7CisgICAgICBzdGF0aWMgdm9pZCBwcmludCggY29uc3QgVHVwbGUmIHR1cGxlLCBzdGQ6Om9zdHJlYW0mIG9zICkKKyAgICAgIHsKKyAgICAgICAgICBvcyA8PCAoIE4gPyAiLCAiIDogIiAiICkKKyAgICAgICAgICAgICA8PCBDYXRjaDo6dG9TdHJpbmcoc3RkOjpnZXQ8Tj4odHVwbGUpKTsKKyAgICAgICAgICBFbGVtZW50UHJpbnRlcjxUdXBsZSxOKzE+OjpwcmludCh0dXBsZSxvcyk7CisgICAgICB9CisgIH07CisKKyAgdGVtcGxhdGU8CisgICAgICB0eXBlbmFtZSBUdXBsZSwKKyAgICAgIHN0ZDo6c2l6ZV90IE4KKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyPFR1cGxlLE4sZmFsc2U+IHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYsIHN0ZDo6b3N0cmVhbSYgKSB7fQorICB9OworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIC4uLlR5cGVzPgorc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6dHVwbGU8VHlwZXMuLi4+PiB7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggY29uc3Qgc3RkOjp0dXBsZTxUeXBlcy4uLj4mIHR1cGxlICkKKyAgICB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgJ3snOworICAgICAgICBUdXBsZURldGFpbDo6RWxlbWVudFByaW50ZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+OjpwcmludCggdHVwbGUsIG9zICk7CisgICAgICAgIG9zIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9OworI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0ZDo6c3RyaW5nIG1ha2VTdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICByZXR1cm4gU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHZhbHVlICk7CisgICAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIERldGFpbAorCisvLy8gXGJyaWVmIGNvbnZlcnRzIGFueSB0eXBlIHRvIGEgc3RyaW5nCisvLy8KKy8vLyBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBmb3J3YXJkcyBvbiB0byBvc3RyaW5nc3RyZWFtIC0gZXhjZXB0IHdoZW4gYW4KKy8vLyBvc3RyaW5nc3RyZWFtIG92ZXJsb2FkIGRvZXMgbm90IGV4aXN0IC0gaW4gd2hpY2ggY2FzZSBpdCBhdHRlbXB0cyB0byBkZXRlY3QKKy8vLyB0aGF0IGFuZCB3cml0ZXMgez99LgorLy8vIE92ZXJsb2FkIChub3Qgc3BlY2lhbGlzZSkgdGhpcyB0ZW1wbGF0ZSBmb3IgY3VzdG9tIHR5cHMgdGhhdCB5b3UgZG9uJ3Qgd2FudAorLy8vIHRvIHByb3ZpZGUgYW4gb3N0cmVhbSBvdmVybG9hZCBmb3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIFQgY29uc3QmIHZhbHVlICkgeworICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKK30KKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CisgICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZyggSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0ICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgInsgIjsKKyAgICAgICAgaWYoIGZpcnN0ICE9IGxhc3QgKSB7CisgICAgICAgICAgICBvc3MgPDwgQ2F0Y2g6OnRvU3RyaW5nKCAqZmlyc3QgKTsKKyAgICAgICAgICAgIGZvciggKytmaXJzdCA7IGZpcnN0ICE9IGxhc3QgOyArK2ZpcnN0ICkKKyAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIiA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICB9CisgICAgICAgIG9zcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb247CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uOworCisvLyBXcmFwcyB0aGUgTEhTIG9mIGFuIGV4cHJlc3Npb24gYW5kIG92ZXJsb2FkcyBjb21wYXJpc29uIG9wZXJhdG9ycworLy8gZm9yIGFsc28gY2FwdHVyaW5nIHRob3NlIGFuZCBSSFMgKGlmIGFueSkKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBFeHByZXNzaW9uTGhzIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBFeHByZXNzaW9uTGhzKCBSZXN1bHRCdWlsZGVyJiByYiwgVCBsaHMgKSA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV90cnV0aHkoZmFsc2UpIHt9CisKKyAgICBFeHByZXNzaW9uTGhzJiBvcGVyYXRvciA9ICggY29uc3QgRXhwcmVzc2lvbkxocyYgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA9PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgIT0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTGVzc1RoYW4+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzR3JlYXRlclRoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID4gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPD0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPj0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbk9yRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzRXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgPT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0VxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc05vdEVxdWFsVG8sIGJvb2w+IG9wZXJhdG9yICE9ICggYm9vbCByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNOb3RFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgeworICAgICAgICBtX3RydXRoeSA9IG1fbGhzID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggbV90cnV0aHkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fdHJ1dGh5ICk7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBSaHNUJj4gY2FwdHVyZUV4cHJlc3Npb24oIFJoc1QmIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPEludGVybmFsOjpPcGVyYXRvciBPcD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiBjYXB0dXJlRXhwcmVzc2lvbiggYm9vbCByaHMgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBib29sPiggbV9yYiwgbV9saHMsIHJocyApOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIFQgbV9saHM7CisgICAgYm9vbCBtX3RydXRoeTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1QsIEludGVybmFsOjpPcGVyYXRvciBPcCwgdHlwZW5hbWUgUmhzVD4KK2NsYXNzIEJpbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEJpbmFyeUV4cHJlc3Npb24oIFJlc3VsdEJ1aWxkZXImIHJiLCBMaHNUIGxocywgUmhzVCByaHMgKQorICAgICAgICA6IG1fcmIoIHJiICksIG1fbGhzKCBsaHMgKSwgbV9yaHMoIHJocyApIHt9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uJiBvcGVyYXRvciA9ICggQmluYXJ5RXhwcmVzc2lvbiYgKTsKKworICAgIHZvaWQgZW5kRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yYgorICAgICAgICAgICAgLnNldFJlc3VsdFR5cGUoIEludGVybmFsOjpjb21wYXJlPE9wPiggbV9saHMsIG1fcmhzICkgKQorICAgICAgICAgICAgLmVuZEV4cHJlc3Npb24oICp0aGlzICk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxocyA9IENhdGNoOjp0b1N0cmluZyggbV9saHMgKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX3JocyApOworICAgICAgICBjaGFyIGRlbGltID0gbGhzLnNpemUoKSArIHJocy5zaXplKCkgPCA0MCAmJgorICAgICAgICAgICAgICAgICAgICAgbGhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgICAgICAgICAgIHJocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zID8gJyAnIDogJ1xuJzsKKyAgICAgICAgZGVzdC5yZXNlcnZlKCA3ICsgbGhzLnNpemUoKSArIHJocy5zaXplKCkgKTsKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBzcGFjZXMgYXJvdW5kIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3Igb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBwYXJlbnRoZXNlcyAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgICAgICAgICAgICAvLyAxIGZvciBuZWdhdGlvbiAoY29uZGl0aW9uYWxseSBhZGRlZCBsYXRlcikKKyAgICAgICAgZGVzdCA9IGxoczsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSBJbnRlcm5hbDo6T3BlcmF0b3JUcmFpdHM8T3A+OjpnZXROYW1lKCk7CisgICAgICAgIGRlc3QgKz0gZGVsaW07CisgICAgICAgIGRlc3QgKz0gcmhzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBSZXN1bHRCdWlsZGVyJiBtX3JiOworICAgIExoc1QgbV9saHM7CisgICAgUmhzVCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorY2xhc3MgTWF0Y2hFeHByZXNzaW9uIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBNYXRjaEV4cHJlc3Npb24oIEFyZ1QgYXJnLCBNYXRjaGVyVCBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICkKKyAgICAgICAgOiBtX2FyZyggYXJnICksIG1fbWF0Y2hlciggbWF0Y2hlciApLCBtX21hdGNoZXJTdHJpbmcoIG1hdGNoZXJTdHJpbmcgKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1hdGNoZXJBc1N0cmluZyA9IG1fbWF0Y2hlci50b1N0cmluZygpOworICAgICAgICBkZXN0ID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2FyZyApOworICAgICAgICBkZXN0ICs9ICcgJzsKKyAgICAgICAgaWYoIG1hdGNoZXJBc1N0cmluZyA9PSBEZXRhaWw6OnVucHJpbnRhYmxlU3RyaW5nICkKKyAgICAgICAgICAgIGRlc3QgKz0gbV9tYXRjaGVyU3RyaW5nOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZXN0ICs9IG1hdGNoZXJBc1N0cmluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXJnVCBtX2FyZzsKKyAgICBNYXRjaGVyVCBtX21hdGNoZXI7CisgICAgY2hhciBjb25zdCogbV9tYXRjaGVyU3RyaW5nOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+KCAqdGhpcywgb3BlcmFuZCApOworICAgIH0KKworICAgIGlubGluZSBFeHByZXNzaW9uTGhzPGJvb2w+IFJlc3VsdEJ1aWxkZXI6Om9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25MaHM8Ym9vbD4oICp0aGlzLCB2YWx1ZSApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNoZXJUPgorICAgIGlubGluZSB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVNYXRjaCggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBjb25zdCYgbWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKSB7CisgICAgICAgIE1hdGNoRXhwcmVzc2lvbjxBcmdUIGNvbnN0JiwgTWF0Y2hlclQgY29uc3QmPiBleHByKCBhcmcsIG1hdGNoZXIsIG1hdGNoZXJTdHJpbmcgKTsKKyAgICAgICAgc2V0UmVzdWx0VHlwZSggbWF0Y2hlci5tYXRjaCggYXJnICkgKTsKKyAgICAgICAgZW5kRXhwcmVzc2lvbiggZXhwciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21lc3NhZ2UuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgTWVzc2FnZUluZm8geworICAgICAgICBNZXNzYWdlSW5mbyggICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtYWNyb05hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlOworICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICB1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA9PSBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UgPCBvdGhlci5zZXF1ZW5jZTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmFsQ291bnQ7CisgICAgfTsKKworICAgIHN0cnVjdCBNZXNzYWdlQnVpbGRlciB7CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgdHlwZSApCisgICAgICAgIDogbV9pbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCB0eXBlICkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBNZXNzYWdlQnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9zdHJlYW07CisgICAgfTsKKworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKTsKKyAgICAgICAgU2NvcGVkTWVzc2FnZSggU2NvcGVkTWVzc2FnZSBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgflNjb3BlZE1lc3NhZ2UoKTsKKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2NhcHR1cmUuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DQVBUVVJFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdDsKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm87CisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvOworICAgIHN0cnVjdCBNZXNzYWdlSW5mbzsKKyAgICBjbGFzcyBTY29wZWRNZXNzYWdlQnVpbGRlcjsKKyAgICBzdHJ1Y3QgQ291bnRzOworCisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlIHsKKworICAgICAgICB2aXJ0dWFsIH5JUmVzdWx0Q2FwdHVyZSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCggICAgU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVCVUdHRVJfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcGxhdGZvcm0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUExBVEZPUk1fSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChfX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX01BQworI2VsaWYgIGRlZmluZWQoX19JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fSVBIT05FCisjZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0xJTlVYCisjZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgaWYgIWRlZmluZWQoTk9NSU5NQVgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19OT01JTk1BWCkKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChXSU4zMl9MRUFOX0FORF9NRUFOKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lOMzJfTEVBTl9BTkRfTUVBTikKKyMgICAgZGVmaW5lIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKTsKKyAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICk7Cit9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGJhc2VkIG9uOgorICAgIC8vIGh0dHA6Ly9jb2NvYXdpdGhsb3ZlLmNvbS8yMDA4LzAzL2JyZWFrLWludG8tZGVidWdnZXIuaHRtbAorICAgICNpZiBkZWZpbmVkKF9fcHBjNjRfXykgfHwgZGVmaW5lZChfX3BwY19fKQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBcCisgICAgICAgICAgICAgICAgX19hc21fXygibGkgcjAsIDIwXG5zY1xubm9wXG5saSByMCwgMzdcbmxpIHI0LCAyXG5zY1xubm9wXG4iIFwKKyAgICAgICAgICAgICAgICA6IDogOiAibWVtb3J5IiwicjAiLCJyMyIsInI0IiApCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19hc21fXygiaW50ICQzXG4iIDogOiApCisgICAgI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgLy8gSWYgd2UgY2FuIHVzZSBpbmxpbmUgYXNzZW1ibGVyLCBkbyBpdCBiZWNhdXNlIHRoaXMgYWxsb3dzIHVzIHRvIGJyZWFrCisgICAgLy8gZGlyZWN0bHkgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBmYWlsaW5nIGNoZWNrIGluc3RlYWQgb2YgYnJlYWtpbmcgaW5zaWRlCisgICAgLy8gcmFpc2UoKSBjYWxsZWQgZnJvbSBpdCwgaS5lLiBvbmUgc3RhY2sgZnJhbWUgYmVsb3cuCisgICAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NCkpCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIGFzbSB2b2xhdGlsZSAoImludCAkMyIpCisgICAgI2Vsc2UgLy8gRmFsbCBiYWNrIHRvIHRoZSBnZW5lcmljIHdheS4KKyAgICAgICAgI2luY2x1ZGUgPHNpZ25hbC5oPgorCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIHJhaXNlKFNJR1RSQVApCisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fZGVidWdicmVhaygpCisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgX19zdGRjYWxsIERlYnVnQnJlYWsoKTsKKyAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBEZWJ1Z0JyZWFrKCkKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfVFJBUAorICAgICNkZWZpbmUgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpIGlmKCBDYXRjaDo6aXNEZWJ1Z2dlckFjdGl2ZSgpICkgeyBDQVRDSF9UUkFQKCk7IH0KKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgQ2F0Y2g6OmFsd2F5c1RydWUoKTsKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19ydW5uZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SVU5ORVJfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRlc3RDYXNlOworCisgICAgc3RydWN0IElSdW5uZXIgeworICAgICAgICB2aXJ0dWFsIH5JUnVubmVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhYm9ydGluZygpIGNvbnN0ID0gMDsKKyAgICB9OworfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2UgY2FuIHNwZWVkdXAgY29tcGlsYXRpb24gc2lnbmlmaWNhbnRseSBieSBicmVha2luZyBpbnRvIGRlYnVnZ2VyIGxvd2VyIGluCisvLyB0aGUgY2FsbHN0YWNrLCBiZWNhdXNlIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBleHBhbmQgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUgorLy8gbWFjcm8gaW4gZWFjaCBhc3NlcnRpb24KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIHJlc3VsdEJ1aWxkZXIgKSBcCisgICAgcmVzdWx0QnVpbGRlci5yZWFjdCgpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBbm90aGVyIHdheSB0byBzcGVlZC11cCBjb21waWxhdGlvbiBpcyB0byBvbWl0IGxvY2FsIHRyeS1jYXRjaCBmb3IgUkVRVUlSRSoKKy8vIG1hY3Jvcy4KKy8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGNhdXNlIGZhbHNlIG5lZ2F0aXZlLCBpZiB0aGUgdGVzdCBjb2RlIGNhdGNoZXMKKy8vIHRoZSBleGNlcHRpb24gYmVmb3JlIGl0IHByb3BhZ2F0ZXMgYmFjayB1cCB0byB0aGUgcnVubmVyLgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgKCBfX2NhdGNoUmVzdWx0IDw9IGV4cHIgKS5lbmRFeHByZXNzaW9uKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjppc1RydWUoIGZhbHNlICYmIHN0YXRpY19jYXN0PGJvb2w+KCAhIShleHByKSApICkgKSAvLyBleHByIGhlcmUgaXMgbmV2ZXIgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgYnV0IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBpdCBhIGxvb2sKKy8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnVuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKyNlbHNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIHdvcmtzIG91dCBpZiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gYmUgaW52b2tlZAorLy8gYW5kL29yIGFuIGV4Y2VwdGlvbiB0aHJvd24gYW5kIHRha2VzIGFwcHJvcHJpYXRlIGFjdGlvbi4KKy8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhcyBhIG1hY3JvIHNvIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaW4gdGhlIHVzZXIKKy8vIHNvdXJjZSBjb2RlIHJhdGhlciB0aGFuIGluIENhdGNoIGxpYnJhcnkgY29kZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICBpZiggcmVzdWx0QnVpbGRlci5zaG91bGREZWJ1Z0JyZWFrKCkgKSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCk7IFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworICAgIC8vIFRoZSBkb3VibGUgbmVnYXRpb24gc2lsZW5jZXMgTVNWQydzIEM0ODAwIHdhcm5pbmcsIHRoZSBzdGF0aWNfY2FzdCBmb3JjZXMgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uIGlmIHRoZSB0eXBlIGhhcyBvdmVybG9hZGVkICYmLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lGKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKTsgXAorICAgIGlmKCBDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0VMU0UoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoICFDYXRjaDo6Z2V0UmVzdWx0Q2FwdHVyZSgpLmdldExhc3RSZXN1bHQoKS0+c3VjY2VlZGVkKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIH0gXAorICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XUyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgbWF0Y2hlciwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uLCAjbWF0Y2hlciApOyBcCisgICAgICAgIGlmKCBfX2NhdGNoUmVzdWx0LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIG1hdGNoZXIgKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoIG1hY3JvTmFtZSwgZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByICIsICIgI2V4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCBleGNlcHRpb25UeXBlICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpPayApOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIC4uLiApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBfX1ZBX0FSR1NfXyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01TRyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIGxvZyApIFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAiIiwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdCA8PCBsb2cgKyA6OkNhdGNoOjpTdHJlYW1FbmRTdG9wKCk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggbWVzc2FnZVR5cGUgKTsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0lORk8oIG1hY3JvTmFtZSwgbG9nICkgXAorICAgIENhdGNoOjpTY29wZWRNZXNzYWdlIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBzY29wZWRNZXNzYWdlICkgPSBDYXRjaDo6TWVzc2FnZUJ1aWxkZXIoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpSZXN1bHRXYXM6OkluZm8gKSA8PCBsb2c7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVCggbWFjcm9OYW1lLCBtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiwgYXJnICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjYXJnICIsICIgI21hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlTWF0Y2goIGFyZywgbWF0Y2hlciwgI21hdGNoZXIgKTsgXAorICAgICAgICB9IGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc2VjdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb25faW5mby5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0lORk9fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG90YWxzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9UQUxTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb3VudHMgeworICAgICAgICBDb3VudHMoKSA6IHBhc3NlZCggMCApLCBmYWlsZWQoIDAgKSwgZmFpbGVkQnV0T2soIDAgKSB7fQorCisgICAgICAgIENvdW50cyBvcGVyYXRvciAtICggQ291bnRzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIENvdW50cyBkaWZmOworICAgICAgICAgICAgZGlmZi5wYXNzZWQgPSBwYXNzZWQgLSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBkaWZmLmZhaWxlZCA9IGZhaWxlZCAtIG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkQnV0T2sgPSBmYWlsZWRCdXRPayAtIG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKyAgICAgICAgQ291bnRzJiBvcGVyYXRvciArPSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBwYXNzZWQgKz0gb3RoZXIucGFzc2VkOworICAgICAgICAgICAgZmFpbGVkICs9IG90aGVyLmZhaWxlZDsKKyAgICAgICAgICAgIGZhaWxlZEJ1dE9rICs9IG90aGVyLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgdG90YWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcGFzc2VkICsgZmFpbGVkICsgZmFpbGVkQnV0T2s7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhbGxQYXNzZWQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDAgJiYgZmFpbGVkQnV0T2sgPT0gMDsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbE9rKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkOworICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZEJ1dE9rOworICAgIH07CisKKyAgICBzdHJ1Y3QgVG90YWxzIHsKKworICAgICAgICBUb3RhbHMgb3BlcmF0b3IgLSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZjsKKyAgICAgICAgICAgIGRpZmYuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnMgLSBvdGhlci5hc3NlcnRpb25zOworICAgICAgICAgICAgZGlmZi50ZXN0Q2FzZXMgPSB0ZXN0Q2FzZXMgLSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBkZWx0YSggVG90YWxzIGNvbnN0JiBwcmV2VG90YWxzICkgY29uc3QgeworICAgICAgICAgICAgVG90YWxzIGRpZmYgPSAqdGhpcyAtIHByZXZUb3RhbHM7CisgICAgICAgICAgICBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZCA+IDAgKQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkOworICAgICAgICAgICAgZWxzZSBpZiggZGlmZi5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLnBhc3NlZDsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzJiBvcGVyYXRvciArPSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBhc3NlcnRpb25zICs9IG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICB0ZXN0Q2FzZXMgKz0gb3RoZXIudGVzdENhc2VzOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgIENvdW50cyB0ZXN0Q2FzZXM7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTZWN0aW9uSW5mbyB7CisgICAgICAgIFNlY3Rpb25JbmZvCisgICAgICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiA9IHN0ZDo6c3RyaW5nKCkgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgfTsKKworICAgIHN0cnVjdCBTZWN0aW9uRW5kSW5mbyB7CisgICAgICAgIFNlY3Rpb25FbmRJbmZvKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLCBDb3VudHMgY29uc3QmIF9wcmV2QXNzZXJ0aW9ucywgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIDogc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLCBwcmV2QXNzZXJ0aW9ucyggX3ByZXZBc3NlcnRpb25zICksIGR1cmF0aW9uSW5TZWNvbmRzKCBfZHVyYXRpb25JblNlY29uZHMgKQorICAgICAgICB7fQorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgcHJldkFzc2VydGlvbnM7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbkluU2Vjb25kczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RpbWVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RJTUVSX0hfSU5DTFVERUQKKworI2lmZGVmIF9NU0NfVkVSCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVUludDY0OworfQorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdHlwZWRlZiB1aW50NjRfdCBVSW50NjQ7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBUaW1lciB7CisgICAgcHVibGljOgorICAgICAgICBUaW1lcigpIDogbV90aWNrcyggMCApIHt9CisgICAgICAgIHZvaWQgc3RhcnQoKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgaW50IGdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdDsKKyAgICAgICAgZG91YmxlIGdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBVSW50NjQgbV90aWNrczsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU2VjdGlvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICk7CisgICAgICAgIH5TZWN0aW9uKCk7CisKKyAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNlY3Rpb25JbmZvIG1faW5mbzsKKworICAgICAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgICAgIENvdW50cyBtX2Fzc2VydGlvbnM7CisgICAgICAgIGJvb2wgbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgICAgIFRpbWVyIG1fdGltZXI7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCAuLi4gKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIF9fVkFfQVJHU19fICkgKQorI2Vsc2UKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2MgKSBcCisgICAgICAgIGlmKCBDYXRjaDo6U2VjdGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1NlY3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIG5hbWUsIGRlc2MgKSApCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2dlbmVyYXRvcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9HRU5FUkFUT1JTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBJR2VuZXJhdG9yIHsKKyAgICB2aXJ0dWFsIH5JR2VuZXJhdG9yKCkge30KKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSAoKSBjb25zdCA9IDA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQmV0d2VlbkdlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKK3B1YmxpYzoKKyAgICBCZXR3ZWVuR2VuZXJhdG9yKCBUIGZyb20sIFQgdG8gKSA6IG1fZnJvbSggZnJvbSApLCBtX3RvKCB0byApe30KKworICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2Zyb20rc3RhdGljX2Nhc3Q8aW50PiggaW5kZXggKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIDErbV90by1tX2Zyb20gKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBUIG1fZnJvbTsKKyAgICBUIG1fdG87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVmFsdWVzR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIFZhbHVlc0dlbmVyYXRvcigpe30KKworICAgIHZvaWQgYWRkKCBUIHZhbHVlICkgeworICAgICAgICBtX3ZhbHVlcy5wdXNoX2JhY2soIHZhbHVlICk7CisgICAgfQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlcy5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFQ+IG1fdmFsdWVzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENvbXBvc2l0ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCkgOiBtX3RvdGFsU2l6ZSggMCApIHt9CisKKyAgICAvLyAqKiogTW92ZSBzZW1hbnRpY3MsIHNpbWlsYXIgdG8gYXV0b19wdHIgKioqCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkKKyAgICA6ICAgbV9maWxlSW5mbyggb3RoZXIubV9maWxlSW5mbyApLAorICAgICAgICBtX3RvdGFsU2l6ZSggMCApCisgICAgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgc2V0RmlsZUluZm8oIGNvbnN0IGNoYXIqIGZpbGVJbmZvICkgeworICAgICAgICBtX2ZpbGVJbmZvID0gZmlsZUluZm87CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB+Q29tcG9zaXRlR2VuZXJhdG9yKCkgeworICAgICAgICBkZWxldGVBbGwoIG1fY29tcG9zZWQgKTsKKyAgICB9CisKKyAgICBvcGVyYXRvciBUICgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IG92ZXJhbGxJbmRleCA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0R2VuZXJhdG9ySW5kZXgoIG1fZmlsZUluZm8sIG1fdG90YWxTaXplICk7CisKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29tcG9zZWQuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fY29tcG9zZWQuZW5kKCk7CisgICAgICAgIGZvciggc2l6ZV90IGluZGV4ID0gMDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgPSAqaXQ7CisgICAgICAgICAgICBpZiggb3ZlcmFsbEluZGV4ID49IGluZGV4ICYmIG92ZXJhbGxJbmRleCA8IGluZGV4ICsgZ2VuZXJhdG9yLT5zaXplKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3ItPmdldFZhbHVlKCBvdmVyYWxsSW5kZXgtaW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICB9CisgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCAiSW5kZXhlZCBwYXN0IGVuZCBvZiBnZW5lcmF0ZWQgcmFuZ2UiICk7CisgICAgICAgIHJldHVybiBUKCk7IC8vIFN1cHByZXNzIHNwdXJpb3VzICJub3QgYWxsIGNvbnRyb2wgcGF0aHMgcmV0dXJuIGEgdmFsdWUiIHdhcm5pbmcgaW4gVmlzdWFsIFN0dWRpbyAtIGlmIHlvdSBrbm93IGhvdyB0byBmaXggdGhpcyBwbGVhc2UgZG8gc28KKyAgICB9CisKKyAgICB2b2lkIGFkZCggY29uc3QgSUdlbmVyYXRvcjxUPiogZ2VuZXJhdG9yICkgeworICAgICAgICBtX3RvdGFsU2l6ZSArPSBnZW5lcmF0b3ItPnNpemUoKTsKKyAgICAgICAgbV9jb21wb3NlZC5wdXNoX2JhY2soIGdlbmVyYXRvciApOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApIHsKKyAgICAgICAgbW92ZSggb3RoZXIgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENvbXBvc2l0ZUdlbmVyYXRvciYgdGhlbiggVCB2YWx1ZSApIHsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWx1ZSApOworICAgICAgICBhZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcml2YXRlOgorCisgICAgdm9pZCBtb3ZlKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtX2NvbXBvc2VkLmluc2VydCggbV9jb21wb3NlZC5lbmQoKSwgb3RoZXIubV9jb21wb3NlZC5iZWdpbigpLCBvdGhlci5tX2NvbXBvc2VkLmVuZCgpICk7CisgICAgICAgIG1fdG90YWxTaXplICs9IG90aGVyLm1fdG90YWxTaXplOworICAgICAgICBvdGhlci5tX2NvbXBvc2VkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSUdlbmVyYXRvcjxUPio+IG1fY29tcG9zZWQ7CisgICAgc3RkOjpzdHJpbmcgbV9maWxlSW5mbzsKKyAgICBzaXplX3QgbV90b3RhbFNpemU7Cit9OworCituYW1lc3BhY2UgR2VuZXJhdG9ycworeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGJldHdlZW4oIFQgZnJvbSwgVCB0byApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCBuZXcgQmV0d2VlbkdlbmVyYXRvcjxUPiggZnJvbSwgdG8gKSApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiwgVCB2YWwzICl7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDMgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMsIFQgdmFsNCApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsNCApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIEdlbmVyYXRvcnMKKwordXNpbmcgbmFtZXNwYWNlIEdlbmVyYXRvcnM7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkgI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUiggbGluZSApIElOVEVSTkFMX0NBVENIX0xJTkVTVFIyKCBsaW5lICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApIGV4cHIuc2V0RmlsZUluZm8oIF9fRklMRV9fICIoIiBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBfX0xJTkVfXyApICIpIiApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX2V4Y2VwdGlvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRUdJU1RSWV9IVUJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnk7CisgICAgc3RydWN0IElSZXBvcnRlckZhY3Rvcnk7CisgICAgc3RydWN0IElUYWdBbGlhc1JlZ2lzdHJ5OworCisgICAgc3RydWN0IElSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklSZWdpc3RyeUh1YigpOworCisgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVSZWdpc3RyeUh1YigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgPSAwOworICAgIH07CisKKyAgICBJUmVnaXN0cnlIdWImIGdldFJlZ2lzdHJ5SHViKCk7CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgdm9pZCBjbGVhblVwKCk7CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcoKmV4Y2VwdGlvblRyYW5zbGF0ZUZ1bmN0aW9uKSgpOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Y29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqPiBFeGNlcHRpb25UcmFuc2xhdG9yczsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvciB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yKCk7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlKCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQsIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdEVuZCApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCk7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yIDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkKKyAgICAgICAgICAgIDogbV90cmFuc2xhdGVGdW5jdGlvbiggdHJhbnNsYXRlRnVuY3Rpb24gKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgqaXQpLT50cmFuc2xhdGUoIGl0KzEsIGl0RW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKCBUJiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHJhbnNsYXRlRnVuY3Rpb24oIGV4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCptX3RyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKTsKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVHJhbnNsYXRvcgorICAgICAgICAgICAgICAgICggbmV3IEV4Y2VwdGlvblRyYW5zbGF0b3I8VD4oIHRyYW5zbGF0ZUZ1bmN0aW9uICkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIHRyYW5zbGF0b3JOYW1lLCBzaWduYXR1cmUgKSBcCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKTsgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblJlZ2lzdHJhciApKCAmdHJhbnNsYXRvck5hbWUgKTsgfVwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTjIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25UcmFuc2xhdG9yICksIHNpZ25hdHVyZSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9hcHByb3guaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BUFBST1hfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjbGFzcyBBcHByb3ggeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQXBwcm94ICggZG91YmxlIHZhbHVlICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKSoxMDAgKSwKKyAgICAgICAgICAgIG1fbWFyZ2luKCAwLjAgKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIDEuMCApLAorICAgICAgICAgICAgbV92YWx1ZSggdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIEFwcHJveCggQXBwcm94IGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2Vwc2lsb24oIG90aGVyLm1fZXBzaWxvbiApLAorICAgICAgICAgICAgbV9tYXJnaW4oIG90aGVyLm1fbWFyZ2luICksCisgICAgICAgICAgICBtX3NjYWxlKCBvdGhlci5tX3NjYWxlICksCisgICAgICAgICAgICBtX3ZhbHVlKCBvdGhlci5tX3ZhbHVlICkKKyAgICAgICAge30KKworICAgICAgICBzdGF0aWMgQXBwcm94IGN1c3RvbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcHByb3goIDAgKTsKKyAgICAgICAgfQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIFQgdmFsdWUgKSB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSApOworICAgICAgICAgICAgYXBwcm94LmVwc2lsb24oIG1fZXBzaWxvbiApOworICAgICAgICAgICAgYXBwcm94Lm1hcmdpbiggbV9tYXJnaW4gKTsKKyAgICAgICAgICAgIGFwcHJveC5zY2FsZSggbV9zY2FsZSApOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCggVCB2YWx1ZSApOiBBcHByb3goc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkpCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBjb25zdCBUJiBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGF1dG8gbGhzX3YgPSBkb3VibGUobGhzKTsKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyhsaHNfdiAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKHN0ZDo6ZmFicyhsaHNfdiksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkpKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGl2ZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgY29uc3QgVCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPCByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gZG91YmxlKGxocykgPiByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiBkb3VibGUocmhzKSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBlcHNpbG9uKCBUIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBkb3VibGUobmV3RXBzaWxvbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIG1hcmdpbiggVCBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IGRvdWJsZShuZXdNYXJnaW4pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBzY2FsZSggVCBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBkb3VibGUobmV3U2NhbGUpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyNlbHNlCisKKyAgICAgICAgQXBwcm94IG9wZXJhdG9yKCkoIGRvdWJsZSB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHZhbHVlICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNoYXJkIEhhcnJpcyBmb3IgaGlzIGhlbHAgcmVmaW5pbmcgdGhpcyBmb3JtdWxhCisgICAgICAgICAgICBib29sIHJlbGF0aXZlT0sgPSBzdGQ6OmZhYnMoIGxocyAtIHJocy5tX3ZhbHVlICkgPCByaHMubV9lcHNpbG9uICogKHJocy5tX3NjYWxlICsgKHN0ZDo6bWF4KSggc3RkOjpmYWJzKGxocyksIHN0ZDo6ZmFicyhyaHMubV92YWx1ZSkgKSApOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzIC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fbWFyZ2luOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlIDwgcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocyA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlID4gcmhzIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIGVwc2lsb24oIGRvdWJsZSBuZXdFcHNpbG9uICkgeworICAgICAgICAgICAgbV9lcHNpbG9uID0gbmV3RXBzaWxvbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBkb3VibGUgbmV3TWFyZ2luICkgeworICAgICAgICAgICAgbV9tYXJnaW4gPSBuZXdNYXJnaW47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIHNjYWxlKCBkb3VibGUgbmV3U2NhbGUgKSB7CisgICAgICAgICAgICBtX3NjYWxlID0gbmV3U2NhbGU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiQXBwcm94KCAiIDw8IENhdGNoOjp0b1N0cmluZyggbV92YWx1ZSApIDw8ICIgKSI7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBkb3VibGUgbV9lcHNpbG9uOworICAgICAgICBkb3VibGUgbV9tYXJnaW47CisgICAgICAgIGRvdWJsZSBtX3NjYWxlOworICAgICAgICBkb3VibGUgbV92YWx1ZTsKKyAgICB9OworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmc8RGV0YWlsOjpBcHByb3g+KCBEZXRhaWw6OkFwcHJveCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX1NUUklOR19IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgc3RydWN0IENhc2VkU3RyaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIENhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0OworCisgICAgICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgU3RyaW5nTWF0Y2hlckJhc2UgOiBNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4geworICAgICAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgICAgIENhc2VkU3RyaW5nIG1fY29tcGFyYXRvcjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fb3BlcmF0aW9uOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBFbmRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIgRW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc192ZWN0b3IuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfVkVDVE9SX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgVmVjdG9yIHsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNFbGVtZW50TWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBUPiB7CisKKyAgICAgICAgICAgIENvbnRhaW5zRWxlbWVudE1hdGNoZXIoVCBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IpIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yKSAhPSB2LmVuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUIGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IENvbnRhaW5zTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgQ29udGFpbnNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBzZWUgbm90ZSBpbiBFcXVhbHNNYXRjaGVyCisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgPiB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb21wYXJhdG9yLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgbV9jb21wYXJhdG9yW2ldKSA9PSB2LmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbnRhaW5zOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgRXF1YWxzTWF0Y2hlciA6IE1hdGNoZXJCYXNlPHN0ZDo6dmVjdG9yPFQ+LCBzdGQ6OnZlY3RvcjxUPiA+IHsKKworICAgICAgICAgICAgRXF1YWxzTWF0Y2hlcihzdGQ6OnZlY3RvcjxUPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogVGhpcyBjdXJyZW50bHkgd29ya3MgaWYgYWxsIGVsZW1lbnRzIGNhbiBiZSBjb21wYXJlZCB1c2luZyAhPQorICAgICAgICAgICAgICAgIC8vIC0gYSBtb3JlIGdlbmVyYWwgYXBwcm9hY2ggd291bGQgYmUgdmlhIGEgY29tcGFyZSB0ZW1wbGF0ZSB0aGF0IGRlZmF1bHRzCisgICAgICAgICAgICAgICAgLy8gdG8gdXNpbmcgIT0uIGJ1dCBjb3VsZCBiZSBzcGVjaWFsaXNlZCBmb3IsIGUuZy4gc3RkOjp2ZWN0b3I8VD4gZXRjCisgICAgICAgICAgICAgICAgLy8gLSB0aGVuIGp1c3QgY2FsbCB0aGF0IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvci5zaXplKCkgIT0gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3JbaV0gIT0gdltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFcXVhbHM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIFZlY3RvcgorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiBDb250YWlucyggc3RkOjp2ZWN0b3I8VD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+IFZlY3RvckNvbnRhaW5zKCBUIGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpDb250YWluc0VsZW1lbnRNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkVxdWFsc01hdGNoZXI8VD4gRXF1YWxzKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbnRlcmZhY2VzX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBUYWdBbGlhcyB7CisgICAgICAgIFRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgX3RhZywgU291cmNlTGluZUluZm8gX2xpbmVJbmZvICkgOiB0YWcoIF90YWcgKSwgbGluZUluZm8oIF9saW5lSW5mbyApIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgeworICAgICAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9UQUdfQUxJQVMoIGFsaWFzLCBzcGVjICkgbmFtZXNwYWNleyBDYXRjaDo6UmVnaXN0cmFyRm9yVGFnQWxpYXNlcyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQXV0b1JlZ2lzdGVyVGFnQWxpYXMgKSggYWxpYXMsIHNwZWMsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PUFRJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBBbiBvcHRpb25hbCB0eXBlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBPcHRpb24geworICAgIHB1YmxpYzoKKyAgICAgICAgT3B0aW9uKCkgOiBudWxsYWJsZVZhbHVlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgT3B0aW9uKCBUIGNvbnN0JiBfdmFsdWUgKQorICAgICAgICA6IG51bGxhYmxlVmFsdWUoIG5ldyggc3RvcmFnZSApIFQoIF92YWx1ZSApICkKKyAgICAgICAge30KKyAgICAgICAgT3B0aW9uKCBPcHRpb24gY29uc3QmIF9vdGhlciApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggX290aGVyID8gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApIDogQ0FUQ0hfTlVMTCApCisgICAgICAgIHt9CisKKyAgICAgICAgfk9wdGlvbigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBPcHRpb24mIG9wZXJhdG9yPSAoIE9wdGlvbiBjb25zdCYgX290aGVyICkgeworICAgICAgICAgICAgaWYoICZfb3RoZXIgIT0gdGhpcyApIHsKKyAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICAgIGlmKCBfb3RoZXIgKQorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggKl9vdGhlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3IgPSAoIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIG51bGxhYmxlVmFsdWUgKQorICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUtPn5UKCk7CisgICAgICAgICAgICBudWxsYWJsZVZhbHVlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQgY29uc3QmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisgICAgICAgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlOyB9CisKKyAgICAgICAgVCB2YWx1ZU9yKCBUIGNvbnN0JiBkZWZhdWx0VmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbnVsbGFibGVWYWx1ZSA/ICpudWxsYWJsZVZhbHVlIDogZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzb21lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSAhPSBDQVRDSF9OVUxMOyB9CisgICAgICAgIGJvb2wgbm9uZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgISgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBTYWZlQm9vbDo6bWFrZVNhZmUoIHNvbWUoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUICpudWxsYWJsZVZhbHVlOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBjaGFyIHN0b3JhZ2Vbc2l6ZW9mKFQpXTsKKworICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGhlcmUgdG8gZm9yY2UgYWxpZ25tZW50IGZvciB0aGUgc3RvcmFnZQorICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkxOworICAgICAgICAgICAgdm9pZCAoKmR1bW15MikoKTsKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIGR1bW15MzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisgICAgICAgICAgICBsb25nIGxvbmcgZHVtbXk0OworI2VuZGlmCisgICAgICAgIH07CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JVGFnQWxpYXNSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIE9wdGlvbjxUYWdBbGlhcz4gZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCA9IDA7CisKKyAgICAgICAgc3RhdGljIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXQoKTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gVGhlc2UgZmlsZXMgYXJlIGluY2x1ZGVkIGhlcmUgc28gdGhlIHNpbmdsZV9pbmNsdWRlIHNjcmlwdCBkb2Vzbid0IHB1dCB0aGVtCisvLyBpbiB0aGUgY29uZGl0aW9uYWxseSBjb21waWxlZCBzZWN0aW9ucworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3Rlc3RfY2FzZV9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VJbmZvIHsKKyAgICAgICAgZW51bSBTcGVjaWFsUHJvcGVydGllc3sKKyAgICAgICAgICAgIE5vbmUgPSAwLAorICAgICAgICAgICAgSXNIaWRkZW4gPSAxIDw8IDEsCisgICAgICAgICAgICBTaG91bGRGYWlsID0gMSA8PCAyLAorICAgICAgICAgICAgTWF5RmFpbCA9IDEgPDwgMywKKyAgICAgICAgICAgIFRocm93cyA9IDEgPDwgNCwKKyAgICAgICAgICAgIE5vblBvcnRhYmxlID0gMSA8PCA1CisgICAgICAgIH07CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICk7CisKKyAgICAgICAgVGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApOworCisgICAgICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdDsKKyAgICAgICAgYm9vbCB0aHJvd3MoKSBjb25zdDsKKyAgICAgICAgYm9vbCBva1RvRmFpbCgpIGNvbnN0OworICAgICAgICBib29sIGV4cGVjdGVkVG9GYWlsKCkgY29uc3Q7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsY2FzZVRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3NBc1N0cmluZzsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFNwZWNpYWxQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlIDogcHVibGljIFRlc3RDYXNlSW5mbyB7CisgICAgcHVibGljOgorCisgICAgICAgIFRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgVGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgICAgIFRlc3RDYXNlIHdpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdDsKKworICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0OworCisgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKTsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgVGVzdENhc2UmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJVGVzdENhc2U+IHRlc3Q7CisgICAgfTsKKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisKKyNpZmRlZiBfX09CSkNfXworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX29iamMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9PQkpDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gTkIuIEFueSBnZW5lcmFsIGNhdGNoIGhlYWRlcnMgaW5jbHVkZWQgaGVyZSBtdXN0IGJlIGluY2x1ZGVkCisvLyBpbiBjYXRjaC5ocHAgZmlyc3QgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGluY2x1ZGVkIGJ5IHRoZSBzaW5nbGUKKy8vIGhlYWRlciBmb3Igbm9uIG9iai11c2FnZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIHByb3RvY29sIGlzIHJlYWxseSBvbmx5IGhlcmUgZm9yIChzZWxmKSBkb2N1bWVudGluZyBwdXJwb3Nlcywgc2luY2UKKy8vIGFsbCBpdHMgbWV0aG9kcyBhcmUgb3B0aW9uYWwuCitAcHJvdG9jb2wgT2NGaXh0dXJlCisKK0BvcHRpb25hbAorCistKHZvaWQpIHNldFVwOworLSh2b2lkKSB0ZWFyRG93bjsKKworQGVuZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgT2NNZXRob2QgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgT2NNZXRob2QoIENsYXNzIGNscywgU0VMIHNlbCApIDogbV9jbHMoIGNscyApLCBtX3NlbCggc2VsICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgaWQgb2JqID0gW1ttX2NscyBhbGxvY10gaW5pdF07CisKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIEBzZWxlY3RvcihzZXRVcCkgICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBtX3NlbCApOworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHRlYXJEb3duKSAgKTsKKworICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG9iaiApOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+T2NNZXRob2QoKSB7fQorCisgICAgICAgIENsYXNzIG1fY2xzOworICAgICAgICBTRUwgbV9zZWw7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSBEZXRhaWx7CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGdldEFubm90YXRpb24oICAgQ2xhc3MgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgYW5ub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0Q2FzZU5hbWUgKSB7CisgICAgICAgICAgICBOU1N0cmluZyogc2VsU3RyID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCJDYXRjaF8lc18lcyIsIGFubm90YXRpb25OYW1lLmNfc3RyKCksIHRlc3RDYXNlTmFtZS5jX3N0cigpXTsKKyAgICAgICAgICAgIFNFTCBzZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZyggc2VsU3RyICk7CisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggc2VsU3RyICk7CisgICAgICAgICAgICBpZCB2YWx1ZSA9IHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBjbHMsIHNlbCApOworICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICByZXR1cm4gWyhOU1N0cmluZyopdmFsdWUgVVRGOFN0cmluZ107CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHJlZ2lzdGVyVGVzdE1ldGhvZHMoKSB7CisgICAgICAgIHNpemVfdCBub1Rlc3RNZXRob2RzID0gMDsKKyAgICAgICAgaW50IG5vQ2xhc3NlcyA9IG9iamNfZ2V0Q2xhc3NMaXN0KCBDQVRDSF9OVUxMLCAwICk7CisKKyAgICAgICAgQ2xhc3MqIGNsYXNzZXMgPSAoQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgQ2xhc3MgKiltYWxsb2MoIHNpemVvZihDbGFzcykgKiBub0NsYXNzZXMpOworICAgICAgICBvYmpjX2dldENsYXNzTGlzdCggY2xhc3Nlcywgbm9DbGFzc2VzICk7CisKKyAgICAgICAgZm9yKCBpbnQgYyA9IDA7IGMgPCBub0NsYXNzZXM7IGMrKyApIHsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IGNsYXNzZXNbY107CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdV9pbnQgY291bnQ7CisgICAgICAgICAgICAgICAgTWV0aG9kKiBtZXRob2RzID0gY2xhc3NfY29weU1ldGhvZExpc3QoIGNscywgJmNvdW50ICk7CisgICAgICAgICAgICAgICAgZm9yKCB1X2ludCBtID0gMDsgbSA8IGNvdW50IDsgbSsrICkgeworICAgICAgICAgICAgICAgICAgICBTRUwgc2VsZWN0b3IgPSBtZXRob2RfZ2V0TmFtZShtZXRob2RzW21dKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IHNlbF9nZXROYW1lKHNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1ldGhvZE5hbWUsICJDYXRjaF9UZXN0Q2FzZV8iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0Q2FzZU5hbWUgPSBtZXRob2ROYW1lLnN1YnN0ciggMTUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIk5hbWUiLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIkRlc2NyaXB0aW9uIiwgdGVzdENhc2VOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSBjbGFzc19nZXROYW1lKCBjbHMgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0KCBtYWtlVGVzdENhc2UoIG5ldyBPY01ldGhvZCggY2xzLCBzZWxlY3RvciApLCBjbGFzc05hbWUsIG5hbWUuY19zdHIoKSwgZGVzYy5jX3N0cigpLCBTb3VyY2VMaW5lSW5mbygpICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vVGVzdE1ldGhvZHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBub1Rlc3RNZXRob2RzOworICAgIH0KKworICAgIG5hbWVzcGFjZSBNYXRjaGVycyB7CisgICAgICAgIG5hbWVzcGFjZSBJbXBsIHsKKyAgICAgICAgbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMgeworCisgICAgICAgICAgICBzdHJ1Y3QgU3RyaW5nSG9sZGVyIDogTWF0Y2hlckJhc2U8TlNTdHJpbmcqPnsKKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IG1fc3Vic3RyKCBbc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggU3RyaW5nSG9sZGVyIGNvbnN0JiBvdGhlciApIDogbV9zdWJzdHIoIFtvdGhlci5tX3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE5TU3RyaW5nKiBtX3N1YnN0cjsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBFcXVhbHMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIGlzRXF1YWxUb1N0cmluZzptX3N1YnN0cl07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlcXVhbHMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBDb250YWlucyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGFpbnMgc3RyaW5nOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBTdGFydHNXaXRoIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0cyB3aXRoOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdHJ1Y3QgRW5kc1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gPT0gW3N0ciBsZW5ndGhdIC0gW21fc3Vic3RyIGxlbmd0aF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlbmRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICB9IC8vIG5hbWVzcGFjZSBOU1N0cmluZ01hdGNoZXJzCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzCisgICAgICAgICAgICBFcXVhbHMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVxdWFscyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6Q29udGFpbnMKKyAgICAgICAgICAgIENvbnRhaW5zKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucyggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aAorICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6U3RhcnRzV2l0aCggc3Vic3RyICk7IH0KKworICAgICAgICBpbmxpbmUgSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RW5kc1dpdGgKKyAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aCggc3Vic3RyICk7IH0KKworICAgIH0gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCisKKyAgICB1c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgT0NfVEVTVF9DQVNFKCBuYW1lLCBkZXNjIClcCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX05hbWVfdGVzdCApIFwKK3tcCityZXR1cm4gQCBuYW1lOyBcCit9XAorKyhOU1N0cmluZyopIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9EZXNjcmlwdGlvbl90ZXN0ICkgXAoreyBcCityZXR1cm4gQCBkZXNjOyBcCit9IFwKKy0odm9pZCkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX1Rlc3RDYXNlX3Rlc3QgKQorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0lNUEwKKworLy8gIVRCRDogTW92ZSB0aGUgbGVhayBkZXRlY3RvciBjb2RlIGludG8gYSBzZXBhcmF0ZSBoZWFkZXIKKyNpZmRlZiBDQVRDSF9DT05GSUdfV0lORE9XU19DUlREQkcKKyNpbmNsdWRlIDxjcnRkYmcuaD4KK2NsYXNzIExlYWtEZXRlY3RvciB7CitwdWJsaWM6CisJTGVha0RldGVjdG9yKCkgeworCQlpbnQgZmxhZyA9IF9DcnRTZXREYmdGbGFnKF9DUlREQkdfUkVQT1JUX0ZMQUcpOworCQlmbGFnIHw9IF9DUlREQkdfTEVBS19DSEVDS19ERjsKKwkJZmxhZyB8PSBfQ1JUREJHX0FMTE9DX01FTV9ERjsKKwkJX0NydFNldERiZ0ZsYWcoZmxhZyk7CisJCV9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwgX0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOworCQlfQ3J0U2V0UmVwb3J0RmlsZShfQ1JUX1dBUk4sIF9DUlREQkdfRklMRV9TVERFUlIpOworCQkvLyBDaGFuZ2UgdGhpcyB0byBsZWFraW5nIGFsbG9jYXRpb24ncyBudW1iZXIgdG8gYnJlYWsgdGhlcmUKKwkJX0NydFNldEJyZWFrQWxsb2MoLTEpOworCX0KK307CisjZWxzZQorY2xhc3MgTGVha0RldGVjdG9yIHt9OworI2VuZGlmCisKK0xlYWtEZXRlY3RvciBsZWFrRGV0ZWN0b3I7CisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gQ29sbGVjdCBhbGwgdGhlIGltcGxlbWVudGF0aW9uIGZpbGVzIHRvZ2V0aGVyIGhlcmUKKy8vIFRoZXNlIGFyZSB0aGUgZXF1aXZhbGVudCBvZiB3aGF0IHdvdWxkIHVzdWFsbHkgYmUgY3BwIGZpbGVzCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd3ZWFrLXZ0YWJsZXMiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2NhdGNoX3Nlc3Npb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SVU5ORVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb21tYW5kbGluZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1BTkRMSU5FX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uZmlnLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09ORklHX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjX3BhcnNlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19QQVJTRVJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3Rfc3BlYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfU1BFQ19IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2lsZGNhcmRfcGF0dGVybi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1dJTERDQVJEX1BBVFRFUk5fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIGNsYXNzIFdpbGRjYXJkUGF0dGVybiB7CisgICAgICAgIGVudW0gV2lsZGNhcmRQb3NpdGlvbiB7CisgICAgICAgICAgICBOb1dpbGRjYXJkID0gMCwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRTdGFydCA9IDEsCisgICAgICAgICAgICBXaWxkY2FyZEF0RW5kID0gMiwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRCb3RoRW5kcyA9IFdpbGRjYXJkQXRTdGFydCB8IFdpbGRjYXJkQXRFbmQKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBXaWxkY2FyZFBhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXR0ZXJuLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwKKyAgICAgICAgICAgIG1fd2lsZGNhcmQoIE5vV2lsZGNhcmQgKSwKKyAgICAgICAgICAgIG1fcGF0dGVybiggYWRqdXN0Q2FzZSggcGF0dGVybiApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgIG1fd2lsZGNhcmQgPSBXaWxkY2FyZEF0U3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggZW5kc1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7CisgICAgICAgICAgICAgICAgbV9wYXR0ZXJuID0gbV9wYXR0ZXJuLnN1YnN0ciggMCwgbV9wYXR0ZXJuLnNpemUoKS0xICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IHN0YXRpY19jYXN0PFdpbGRjYXJkUG9zaXRpb24+KCBtX3dpbGRjYXJkIHwgV2lsZGNhcmRBdEVuZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfldpbGRjYXJkUGF0dGVybigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCggbV93aWxkY2FyZCApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vV2lsZGNhcmQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BhdHRlcm4gPT0gYWRqdXN0Q2FzZSggc3RyICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0U3RhcnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEVuZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRCb3RoRW5kczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnJlYWNoYWJsZS1jb2RlIgorI2VuZGlmCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5rbm93biBlbnVtIiApOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBhZGp1c3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vID8gdG9Mb3dlciggc3RyICkgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICBXaWxkY2FyZFBvc2l0aW9uIG1fd2lsZGNhcmQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fcGF0dGVybjsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjIHsKKyAgICAgICAgc3RydWN0IFBhdHRlcm4gOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgdmlydHVhbCB+UGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisgICAgICAgIGNsYXNzIE5hbWVQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKQorICAgICAgICAgICAgOiBtX3dpbGRjYXJkUGF0dGVybiggdG9Mb3dlciggbmFtZSApLCBDYXNlU2Vuc2l0aXZlOjpObyApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgdmlydHVhbCB+TmFtZVBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3dpbGRjYXJkUGF0dGVybi5tYXRjaGVzKCB0b0xvd2VyKCB0ZXN0Q2FzZS5uYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFdpbGRjYXJkUGF0dGVybiBtX3dpbGRjYXJkUGF0dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUYWdQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUYWdQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgOiBtX3RhZyggdG9Mb3dlciggdGFnICkgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+VGFnUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmxjYXNlVGFncy5maW5kKCBtX3RhZyApICE9IHRlc3RDYXNlLmxjYXNlVGFncy5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fdGFnOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEV4Y2x1ZGVkUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRXhjbHVkZWRQYXR0ZXJuKCBQdHI8UGF0dGVybj4gY29uc3QmIHVuZGVybHlpbmdQYXR0ZXJuICkgOiBtX3VuZGVybHlpbmdQYXR0ZXJuKCB1bmRlcmx5aW5nUGF0dGVybiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5FeGNsdWRlZFBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeyByZXR1cm4gIW1fdW5kZXJseWluZ1BhdHRlcm4tPm1hdGNoZXMoIHRlc3RDYXNlICk7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFB0cjxQYXR0ZXJuPiBtX3VuZGVybHlpbmdQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBGaWx0ZXIgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID4gbV9wYXR0ZXJuczsKKworICAgICAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIC8vIEFsbCBwYXR0ZXJucyBpbiBhIGZpbHRlciBtdXN0IG1hdGNoIGZvciB0aGUgZmlsdGVyIHRvIGJlIGEgbWF0Y2gKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFB0cjxQYXR0ZXJuPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcGF0dGVybnMuYmVnaW4oKSwgaXRFbmQgPSBtX3BhdHRlcm5zLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEoKml0KS0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc0ZpbHRlcnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIW1fZmlsdGVycy5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIEEgVGVzdFNwZWMgbWF0Y2hlcyBpZiBhbnkgZmlsdGVyIG1hdGNoZXMKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8RmlsdGVyPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2ZpbHRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX2ZpbHRlcnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggaXQtPm1hdGNoZXMoIHRlc3RDYXNlICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyPiBtX2ZpbHRlcnM7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFRlc3RTcGVjUGFyc2VyOworICAgIH07Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWNQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGV7IE5vbmUsIE5hbWUsIFF1b3RlZE5hbWUsIFRhZywgRXNjYXBlZE5hbWUgfTsKKyAgICAgICAgTW9kZSBtX21vZGU7CisgICAgICAgIGJvb2wgbV9leGNsdXNpb247CisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc3RhcnQsIG1fcG9zOworICAgICAgICBzdGQ6OnN0cmluZyBtX2FyZzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IG1fZXNjYXBlQ2hhcnM7CisgICAgICAgIFRlc3RTcGVjOjpGaWx0ZXIgbV9jdXJyZW50RmlsdGVyOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgICAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCogbV90YWdBbGlhc2VzOworCisgICAgcHVibGljOgorICAgICAgICBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIHRhZ0FsaWFzZXMgKSA6IG1fdGFnQWxpYXNlcyggJnRhZ0FsaWFzZXMgKSB7fQorCisgICAgICAgIFRlc3RTcGVjUGFyc2VyJiBwYXJzZSggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IE5vbmU7CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9zdGFydCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgbV9hcmcgPSBtX3RhZ0FsaWFzZXMtPmV4cGFuZEFsaWFzZXMoIGFyZyApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgZm9yKCBtX3BvcyA9IDA7IG1fcG9zIDwgbV9hcmcuc2l6ZSgpOyArK21fcG9zICkKKyAgICAgICAgICAgICAgICB2aXNpdENoYXIoIG1fYXJnW21fcG9zXSApOworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYygpIHsKKyAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgcmV0dXJuIG1fdGVzdFNwZWM7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHZpc2l0Q2hhciggY2hhciBjICkgeworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOb25lICkgeworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICcgJzogcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ34nOiBtX2V4Y2x1c2lvbiA9IHRydWU7IHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlICdbJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6IHJldHVybiBzdGFydE5ld01vZGUoIFF1b3RlZE5hbWUsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6IHJldHVybiBlc2NhcGUoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBzdGFydE5ld01vZGUoIE5hbWUsIG1fcG9zICk7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTmFtZSApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgICAgICAgICBhZGRGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnWycgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdWJTdHJpbmcoKSA9PSAiZXhjbHVkZToiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmV3TW9kZSggVGFnLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1xcJyApCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IEVzY2FwZWROYW1lICkKKyAgICAgICAgICAgICAgICBtX21vZGUgPSBOYW1lOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFF1b3RlZE5hbWUgJiYgYyA9PSAnIicgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgZWxzZSBpZiggbV9tb2RlID09IFRhZyAmJiBjID09ICddJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6VGFnUGF0dGVybj4oKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN0YXJ0TmV3TW9kZSggTW9kZSBtb2RlLCBzdGQ6OnNpemVfdCBzdGFydCApIHsKKyAgICAgICAgICAgIG1fbW9kZSA9IG1vZGU7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlc2NhcGUoKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKQorICAgICAgICAgICAgICAgIG1fc3RhcnQgPSBtX3BvczsKKyAgICAgICAgICAgIG1fbW9kZSA9IEVzY2FwZWROYW1lOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5wdXNoX2JhY2soIG1fcG9zICk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgc3ViU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9hcmcuc3Vic3RyKCBtX3N0YXJ0LCBtX3BvcyAtIG1fc3RhcnQgKTsgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZFBhdHRlcm4oKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b2tlbiA9IHN1YlN0cmluZygpOworICAgICAgICAgICAgZm9yKCBzaXplX3QgaSA9IDA7IGkgPCBtX2VzY2FwZUNoYXJzLnNpemUoKTsgKytpICkKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0ciggMCwgbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkgKSArIHRva2VuLnN1YnN0ciggbV9lc2NhcGVDaGFyc1tpXS1tX3N0YXJ0LWkrMSApOworICAgICAgICAgICAgbV9lc2NhcGVDaGFycy5jbGVhcigpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRva2VuLCAiZXhjbHVkZToiICkgKSB7CisgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCA4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIXRva2VuLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgUHRyPFRlc3RTcGVjOjpQYXR0ZXJuPiBwYXR0ZXJuID0gbmV3IFQoIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIG1fZXhjbHVzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuKCBwYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMucHVzaF9iYWNrKCBwYXR0ZXJuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZEZpbHRlcigpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjLm1fZmlsdGVycy5wdXNoX2JhY2soIG1fY3VycmVudEZpbHRlciApOworICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlciA9IFRlc3RTcGVjOjpGaWx0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgaW5saW5lIFRlc3RTcGVjIHBhcnNlVGVzdFNwZWMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcgKSB7CisgICAgICAgIHJldHVybiBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoIGFyZyApLnRlc3RTcGVjKCk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY29uZmlnLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfQ09ORklHX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFZlcmJvc2l0eSB7IGVudW0gTGV2ZWwgeworICAgICAgICBOb091dHB1dCA9IDAsCisgICAgICAgIFF1aWV0LAorICAgICAgICBOb3JtYWwKKyAgICB9OyB9OworCisgICAgc3RydWN0IFdhcm5BYm91dCB7IGVudW0gV2hhdCB7CisgICAgICAgIE5vdGhpbmcgPSAweDAwLAorICAgICAgICBOb0Fzc2VydGlvbnMgPSAweDAxCisgICAgfTsgfTsKKworICAgIHN0cnVjdCBTaG93RHVyYXRpb25zIHsgZW51bSBPck5vdCB7CisgICAgICAgIERlZmF1bHRGb3JSZXBvcnRlciwKKyAgICAgICAgQWx3YXlzLAorICAgICAgICBOZXZlcgorICAgIH07IH07CisgICAgc3RydWN0IFJ1blRlc3RzIHsgZW51bSBJbldoYXRPcmRlciB7CisgICAgICAgIEluRGVjbGFyYXRpb25PcmRlciwKKyAgICAgICAgSW5MZXhpY29ncmFwaGljYWxPcmRlciwKKyAgICAgICAgSW5SYW5kb21PcmRlcgorICAgIH07IH07CisgICAgc3RydWN0IFVzZUNvbG91ciB7IGVudW0gWWVzT3JObyB7CisgICAgICAgIEF1dG8sCisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSUNvbmZpZyA6IElTaGFyZWQgeworCisgICAgICAgIHZpcnR1YWwgfklDb25maWcoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNob3dJbnZpc2libGVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0ID0gMDsKKworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW0uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbWJ1Zi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1CVUZfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtQnVmQmFzZSA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdHJlYW1CdWZCYXNlKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCk7CisgICAgc3RkOjpvc3RyZWFtJiBjZXJyKCk7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbSB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRmlsZVN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9mc3RyZWFtIG1fb2ZzOworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBDb3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgQ291dFN0cmVhbSgpOworICAgICAgICB2aXJ0dWFsIH5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07CisKKyAgICBjbGFzcyBEZWJ1Z091dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIFN0cmVhbUJ1ZkJhc2UgKSBtX3N0cmVhbUJ1ZjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICBwdWJsaWM6CisgICAgICAgIERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisKKyAgICBwdWJsaWM6IC8vIElTdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggODAKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbmZpZ0RhdGEgeworCisgICAgICAgIENvbmZpZ0RhdGEoKQorICAgICAgICA6ICAgbGlzdFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0UmVwb3J0ZXJzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFRlc3ROYW1lc09ubHkoIGZhbHNlICksCisgICAgICAgICAgICBzaG93U3VjY2Vzc2Z1bFRlc3RzKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgICAgIG5vVGhyb3coIGZhbHNlICksCisgICAgICAgICAgICBzaG93SGVscCggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dJbnZpc2libGVzKCBmYWxzZSApLAorICAgICAgICAgICAgZmlsZW5hbWVzQXNUYWdzKCBmYWxzZSApLAorICAgICAgICAgICAgYWJvcnRBZnRlciggLTEgKSwKKyAgICAgICAgICAgIHJuZ1NlZWQoIDAgKSwKKyAgICAgICAgICAgIHZlcmJvc2l0eSggVmVyYm9zaXR5OjpOb3JtYWwgKSwKKyAgICAgICAgICAgIHdhcm5pbmdzKCBXYXJuQWJvdXQ6Ok5vdGhpbmcgKSwKKyAgICAgICAgICAgIHNob3dEdXJhdGlvbnMoIFNob3dEdXJhdGlvbnM6OkRlZmF1bHRGb3JSZXBvcnRlciApLAorICAgICAgICAgICAgcnVuT3JkZXIoIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXIgKSwKKyAgICAgICAgICAgIHVzZUNvbG91ciggVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAge30KKworICAgICAgICBib29sIGxpc3RUZXN0czsKKyAgICAgICAgYm9vbCBsaXN0VGFnczsKKyAgICAgICAgYm9vbCBsaXN0UmVwb3J0ZXJzOworICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5OworCisgICAgICAgIGJvb2wgc2hvd1N1Y2Nlc3NmdWxUZXN0czsKKyAgICAgICAgYm9vbCBzaG91bGREZWJ1Z0JyZWFrOworICAgICAgICBib29sIG5vVGhyb3c7CisgICAgICAgIGJvb2wgc2hvd0hlbHA7CisgICAgICAgIGJvb2wgc2hvd0ludmlzaWJsZXM7CisgICAgICAgIGJvb2wgZmlsZW5hbWVzQXNUYWdzOworCisgICAgICAgIGludCBhYm9ydEFmdGVyOworICAgICAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZDsKKworICAgICAgICBWZXJib3NpdHk6OkxldmVsIHZlcmJvc2l0eTsKKyAgICAgICAgV2FybkFib3V0OjpXaGF0IHdhcm5pbmdzOworICAgICAgICBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zOworICAgICAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXI7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZW5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlck5hbWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdGVzdHNPclRhZ3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWN0aW9uc1RvUnVuOworICAgIH07CisKKyAgICBjbGFzcyBDb25maWcgOiBwdWJsaWMgU2hhcmVkSW1wbDxJQ29uZmlnPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ29uZmlnKCBDb25maWcgY29uc3QmIG90aGVyICk7CisgICAgICAgIENvbmZpZyYgb3BlcmF0b3IgPSAoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGR1bW15KCk7CisgICAgcHVibGljOgorCisgICAgICAgIENvbmZpZygpCisgICAgICAgIHt9CisKKyAgICAgICAgQ29uZmlnKCBDb25maWdEYXRhIGNvbnN0JiBkYXRhICkKKyAgICAgICAgOiAgIG1fZGF0YSggZGF0YSApLAorICAgICAgICAgICAgbV9zdHJlYW0oIG9wZW5TdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhZGF0YS50ZXN0c09yVGFncy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFRlc3RTcGVjUGFyc2VyIHBhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGRhdGEudGVzdHNPclRhZ3Muc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UoIGRhdGEudGVzdHNPclRhZ3NbaV0gKTsKKyAgICAgICAgICAgICAgICBtX3Rlc3RTcGVjID0gcGFyc2VyLnRlc3RTcGVjKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5Db25maWcoKSB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2RhdGEub3V0cHV0RmlsZW5hbWUgOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3RzOyB9CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHkoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRlc3ROYW1lc09ubHk7IH0KKyAgICAgICAgYm9vbCBsaXN0VGFncygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGFnczsgfQorICAgICAgICBib29sIGxpc3RSZXBvcnRlcnMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFJlcG9ydGVyczsgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnByb2Nlc3NOYW1lOyB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRSZXBvcnRlck5hbWVzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnJlcG9ydGVyTmFtZXM7IH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNlY3Rpb25zVG9SdW47IH0KKworICAgICAgICB2aXJ0dWFsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fdGVzdFNwZWM7IH0KKworICAgICAgICBib29sIHNob3dIZWxwKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnNob3dIZWxwOyB9CisKKyAgICAgICAgLy8gSUNvbmZpZyBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuICFtX2RhdGEubm9UaHJvdzsgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgeyByZXR1cm4gbV9zdHJlYW0tPnN0cmVhbSgpOyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubmFtZS5lbXB0eSgpID8gbV9kYXRhLnByb2Nlc3NOYW1lIDogbV9kYXRhLm5hbWU7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0IENBVENIX09WRVJSSURFICAgIHsgcmV0dXJuIG1fZGF0YS5zaG93U3VjY2Vzc2Z1bFRlc3RzOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFICB7IHJldHVybiBtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0R1cmF0aW9uczsgfQorICAgICAgICB2aXJ0dWFsIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcigpIGNvbnN0IENBVENIX09WRVJSSURFICAgeyByZXR1cm4gbV9kYXRhLnJ1bk9yZGVyOyB9CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEucm5nU2VlZDsgfQorICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgeyByZXR1cm4gbV9kYXRhLnVzZUNvbG91cjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgICAgIHZpcnR1YWwgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuYWJvcnRBZnRlcjsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvd0ludmlzaWJsZXM7IH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgSVN0cmVhbSBjb25zdCogb3BlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3V0U3RyZWFtKCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWVbMF0gPT0gJyUnICkgeworICAgICAgICAgICAgICAgIGlmKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUgPT0gIiVkZWJ1ZyIgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlYnVnT3V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggIlVucmVjb2duaXNlZCBzdHJlYW06ICIgKyBtX2RhdGEub3V0cHV0RmlsZW5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVTdHJlYW0oIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICB9CisgICAgICAgIENvbmZpZ0RhdGEgbV9kYXRhOworCisgICAgICAgIENBVENIX0FVVE9fUFRSKCBJU3RyZWFtIGNvbnN0ICkgbV9zdHJlYW07CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jbGFyYS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DTEFSQV9IX0lOQ0xVREVECisKKy8vIFVzZSBDYXRjaCdzIHZhbHVlIGZvciBjb25zb2xlIHdpZHRoIChzdG9yZSBDbGFyYSdzIG9mZiB0byB0aGUgc2lkZSwgaWYgcHJlc2VudCkKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjdW5kZWYgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorI2RlZmluZSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisvLyBEZWNsYXJlIENsYXJhIGluc2lkZSB0aGUgQ2F0Y2ggbmFtZXNwYWNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSBuYW1lc3BhY2UgQ2F0Y2ggeworLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL2NsYXJhLmgKKworLy8gVmVyc2lvbiAwLjAuMi40CisKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmICFkZWZpbmVkKFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRSkKKworI2lmbmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyNlbHNlCisjZGVmaW5lIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UgfQorI2VuZGlmCisKKyNkZWZpbmUgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PUEVOX05BTUVTUEFDRSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gdGJjX3RleHRfZm9ybWF0LmggLS0tLS0tLS0tLS0KKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UpCisjaWZuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisjZGVmaW5lIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK25hbWVzcGFjZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSB7CisjZW5kaWYKKworbmFtZXNwYWNlIFRiYyB7CisKKyNpZmRlZiBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgICAgICBUZXh0QXR0cmlidXRlcygpCisgICAgICAgIDogICBpbml0aWFsSW5kZW50KCBzdGQ6OnN0cmluZzo6bnBvcyApLAorICAgICAgICAgICAgaW5kZW50KCAwICksCisgICAgICAgICAgICB3aWR0aCggY29uc29sZVdpZHRoLTEgKSwKKyAgICAgICAgICAgIHRhYkNoYXIoICdcdCcgKQorICAgICAgICB7fQorCisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbml0aWFsSW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgeyBpbml0aWFsSW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICB7IGluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRXaWR0aCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICAgeyB3aWR0aCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRUYWJDaGFyKCBjaGFyIF92YWx1ZSApICAgICAgICAgICAgICAgeyB0YWJDaGFyID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgICAgICBjaGFyIHRhYkNoYXI7ICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjaGFyIGlzIHNlZW4gdGhlIGluZGVudCBpcyBjaGFuZ2VkIHRvIGN1cnJlbnQgcG9zCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQ2hhcnMgPSAiIFsoey4sL3xcXC0iOworICAgICAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gX2F0dHIuaW5pdGlhbEluZGVudAorICAgICAgICAgICAgICAgIDogX2F0dHIuaW5kZW50OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVtYWluZGVyID0gX3N0cjsKKworICAgICAgICAgICAgd2hpbGUoICFyZW1haW5kZXIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgdGFiUG9zID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCByZW1haW5kZXIuc2l6ZSgpLCBfYXR0ci53aWR0aCAtIGluZGVudCApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IHJlbWFpbmRlci5maW5kX2ZpcnN0X29mKCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyA8PSB3aWR0aCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIF9hdHRyLnRhYkNoYXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiUG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLS07CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDAsIHRhYlBvcyApICsgcmVtYWluZGVyLnN1YnN0ciggdGFiUG9zKzEgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggd2lkdGggPT0gcmVtYWluZGVyLnNpemUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHJlbWFpbmRlclt3aWR0aF0gPT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA8PSAxIHx8IHJlbWFpbmRlci5zaXplKCkgIT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHJlbWFpbmRlci5maW5kX2xhc3Rfb2YoIHdyYXBwYWJsZUNoYXJzLCB3aWR0aCApOworICAgICAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIHBvcyA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgcG9zICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVtYWluZGVyWzBdID09ICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHdpZHRoLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmJhY2soKSArPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRhYlBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gdGFiUG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3BsaWNlTGluZSggc3RkOjpzaXplX3QgX2luZGVudCwgc3RkOjpzdHJpbmcmIF9yZW1haW5kZXIsIHN0ZDo6c2l6ZV90IF9wb3MgKSB7CisgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIHN0ZDo6c3RyaW5nKCBfaW5kZW50LCAnICcgKSArIF9yZW1haW5kZXIuc3Vic3RyKCAwLCBfcG9zICkgKTsKKyAgICAgICAgICAgIF9yZW1haW5kZXIgPSBfcmVtYWluZGVyLnN1YnN0ciggX3BvcyApOworICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyN1bmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisjZGVmaW5lIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyBEZXRlY3QgYSBudW1iZXIgb2YgY29tcGlsZXIgZmVhdHVyZXMgLSBtb3N0bHkgQysrMTEvMTQgY29uZm9ybWFuY2UgLSBieSBjb21waWxlcgorLy8gVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgZGVmaW5lZDoKKy8vCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUiA6IGlzIG51bGxwdHIgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUIDogaXMgbm9leGNlcHQgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTIDogVGhlIGRlbGV0ZSBhbmQgZGVmYXVsdCBrZXl3b3JkcyBmb3IgY29tcGlsZXIgZ2VuZXJhdGVkIG1ldGhvZHMKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERSA6IGlzIG92ZXJyaWRlIHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSIDogaXMgdW5pcXVlX3B0ciBzdXBwb3J0ZWQgKG90aGVyd2lzZSB1c2UgYXV0b19wdHIpCisKKy8vIENMQVJBX0NPTkZJR19DUFAxMV9PUl9HUkVBVEVSIDogSXMgQysrMTEgc3VwcG9ydGVkPworCisvLyBDTEFSQV9DT05GSUdfVkFSSUFESUNfTUFDUk9TIDogYXJlIHZhcmlhZGljIG1hY3JvcyBzdXBwb3J0ZWQ/CisKKy8vIEluIGdlbmVyYWwgZWFjaCBtYWNybyBoYXMgYSBfTk9fPGZlYXR1cmUgbmFtZT4gZm9ybQorLy8gKGUuZy4gQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpIHdoaWNoIGRpc2FibGVzIHRoZSBmZWF0dXJlLgorLy8gTWFueSBmZWF0dXJlcywgYXQgcG9pbnQgb2YgZGV0ZWN0aW9uLCBkZWZpbmUgYW4gX0lOVEVSTkFMXyBtYWNybywgc28gdGhleQorLy8gY2FuIGJlIGNvbWJpbmVkLCBlbi1tYXNzLCB3aXRoIHRoZSBfTk9fIGZvcm1zIGxhdGVyLgorCisvLyBBbGwgdGhlIEMrKzExIGZlYXR1cmVzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIENMQVJBX0NPTkZJR19OT19DUFAxMQorCisjaWZkZWYgX19jbGFuZ19fCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKy8vIC0gb3RoZXJ3aXNlIG1vcmUgcmVjZW50IHZlcnNpb25zIGRlZmluZSBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBhbmQgd2lsbCBnZXQgcGlja2VkIHVwIGJlbG93CisKKyNlbmRpZiAvLyBfX0dOVUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmlzdWFsIEMrKworI2lmZGVmIF9NU0NfVkVSCisKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjaWYgKF9NU0NfVkVSID49IDE5MDAgKSAvLyAoVkMrKyAxMyAoVlMyMDE1KSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQysrIGxhbmd1YWdlIGZlYXR1cmUgc3VwcG9ydAorCisvLyBjYXRjaCBhbGwgc3VwcG9ydCBmb3IgQysrMTEKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKyNkZWZpbmUgQ0xBUkFfQ1BQMTFfT1JfR1JFQVRFUgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKworI2lmbmRlZiBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfTk9FWENFUFQpCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIG5vZXhjZXB0CisjICBkZWZpbmUgQ0xBUkFfTk9FWENFUFRfSVMoeCkgbm9leGNlcHQoeCkKKyNlbHNlCisjZGVmaW5lIENMQVJBX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KQorI2VuZGlmCisKKy8vIG51bGxwdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZGVmaW5lIENMQVJBX05VTEwgbnVsbHB0cgorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTlVMTCBOVUxMCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2RlZmluZSBDTEFSQV9PVkVSUklERSBvdmVycmlkZQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfT1ZFUlJJREUKKyNlbmRpZgorCisvLyB1bmlxdWVfcHRyIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6dW5pcXVlX3B0cjxUPgorI2Vsc2UKKyMgICBkZWZpbmUgQ0xBUkFfQVVUT19QVFIoIFQgKSBzdGQ6OmF1dG9fcHRyPFQ+CisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgI2luY2x1ZGUgZnJvbSBjbGFyYV9jb21waWxlcnMuaCAtLS0tLS0tLS0tLQorLy8gLi4uLi4uLi4uLi4gYmFjayBpbiBjbGFyYS5oCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworI2VuZGlmCisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKK1NUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2VuZGlmCisKK25hbWVzcGFjZSBDbGFyYSB7CisKKyAgICBzdHJ1Y3QgVW5wb3NpdGlvbmFsVGFnIHt9OworCisgICAgZXh0ZXJuIFVucG9zaXRpb25hbFRhZyBfOworCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU4KKyAgICBVbnBvc2l0aW9uYWxUYWcgXzsKKyNlbmRpZgorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisKKyNpZmRlZiBDTEFSQV9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgICAgICB1c2luZyBuYW1lc3BhY2UgVGJjOworCisgICAgICAgIGlubGluZSBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ci5zdWJzdHIoIDAsIHByZWZpeC5zaXplKCkgKSA9PSBwcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWZ7IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3QmPnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUIGNvbnN0PnsgdHlwZWRlZiBUIHR5cGU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgc3RydWN0IElzQm9vbCAgICAgICB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7IH07CisgICAgICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBJc0Jvb2w8Ym9vbD4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIFQmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBfc291cmNlOworICAgICAgICAgICAgc3MgPj4gX2Rlc3Q7CisgICAgICAgICAgICBpZiggc3MuZmFpbCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbmFibGUgdG8gY29udmVydCAiICsgX3NvdXJjZSArICIgdG8gZGVzdGluYXRpb24gdHlwZSIgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIHN0ZDo6c3RyaW5nJiBfZGVzdCApIHsKKyAgICAgICAgICAgIF9kZXN0ID0gX3NvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0SW50byggc3RkOjpzdHJpbmcgY29uc3QmIF9zb3VyY2UsIGJvb2wmIF9kZXN0ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlTEMgPSBfc291cmNlOworICAgICAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHNvdXJjZUxDLmJlZ2luKCksIHNvdXJjZUxDLmVuZCgpLCBzb3VyY2VMQy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICAgICAgICAgIGlmKCBzb3VyY2VMQyA9PSAieSIgfHwgc291cmNlTEMgPT0gIjEiIHx8IHNvdXJjZUxDID09ICJ0cnVlIiB8fCBzb3VyY2VMQyA9PSAieWVzIiB8fCBzb3VyY2VMQyA9PSAib24iICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmKCBzb3VyY2VMQyA9PSAibiIgfHwgc291cmNlTEMgPT0gIjAiIHx8IHNvdXJjZUxDID09ICJmYWxzZSIgfHwgc291cmNlTEMgPT0gIm5vIiB8fCBzb3VyY2VMQyA9PSAib2ZmIiApCisgICAgICAgICAgICAgICAgX2Rlc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJFeHBlY3RlZCBhIGJvb2xlYW4gdmFsdWUgYnV0IGRpZCBub3QgcmVjb2duaXNlOlxuICAnIiArIF9zb3VyY2UgKyAiJyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgICAgIHN0cnVjdCBJQXJnRnVuY3Rpb24geworICAgICAgICAgICAgdmlydHVhbCB+SUFyZ0Z1bmN0aW9uKCkge30KKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbigpICAgICAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uIGNvbnN0JiApID0gZGVmYXVsdDsKKyNlbmRpZgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQ29uZmlnVCYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbiogY2xvbmUoKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgY2xhc3MgQm91bmRBcmdGdW5jdGlvbiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oKSA6IGZ1bmN0aW9uT2JqKCBDTEFSQV9OVUxMICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIElBcmdGdW5jdGlvbjxDb25maWdUPiogX2Z1bmN0aW9uT2JqICkgOiBmdW5jdGlvbk9iaiggX2Z1bmN0aW9uT2JqICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24oIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgOiBmdW5jdGlvbk9iaiggb3RoZXIuZnVuY3Rpb25PYmogPyBvdGhlci5mdW5jdGlvbk9iai0+Y2xvbmUoKSA6IENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiYgb3BlcmF0b3IgPSAoIEJvdW5kQXJnRnVuY3Rpb24gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogbmV3RnVuY3Rpb25PYmogPSBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgICAgICBkZWxldGUgZnVuY3Rpb25PYmo7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25PYmogPSBuZXdGdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB+Qm91bmRBcmdGdW5jdGlvbigpIHsgZGVsZXRlIGZ1bmN0aW9uT2JqOyB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iai0+c2V0KCBjb25maWcsIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25PYmotPnRha2VzQXJnKCk7IH0KKworICAgICAgICAgICAgYm9vbCBpc1NldCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25PYmogIT0gQ0xBUkFfTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIElBcmdGdW5jdGlvbjxDb25maWdUPiogZnVuY3Rpb25PYmo7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IE51bGxCaW5kZXIgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiwgc3RkOjpzdHJpbmcgY29uc3QmICkgY29uc3Qge30KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBOdWxsQmluZGVyKCAqdGhpcyApOyB9CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgc3RydWN0IEJvdW5kRGF0YU1lbWJlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kRGF0YU1lbWJlciggTSBDOjoqIF9tZW1iZXIgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCBwLiptZW1iZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmREYXRhTWVtYmVyKCAqdGhpcyApOyB9CisgICAgICAgICAgICBNIEM6OiogbWVtYmVyOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmRVbmFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlNZXRob2QoIHZvaWQgKEM6OipfbWVtYmVyKSggTSApICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJlbW92ZUNvbnN0UmVmPE0+Ojp0eXBlIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSggdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8TT46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeU1ldGhvZCggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoQzo6Km1lbWJlcikoIE0gKTsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kTnVsbGFyeU1ldGhvZCA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kTnVsbGFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgKHAuKm1lbWJlcikoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmROdWxsYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSgpOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZFVuYXJ5RnVuY3Rpb24oIHZvaWQgKCpfZnVuY3Rpb24pKCBDJiApICkgOiBmdW5jdGlvbiggX2Z1bmN0aW9uICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIG9iaiwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGJvb2wgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmogKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRVbmFyeUZ1bmN0aW9uKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkICgqZnVuY3Rpb24pKCBDJiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBCb3VuZEJpbmFyeUZ1bmN0aW9uIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRCaW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmLCBUICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8VD46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBvYmosIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPFQ+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kQmluYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmLCBUICk7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnc1RvVmVjdG9yKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKSApOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBhcmdjICk7ICsraSApCisgICAgICAgICAgICBhcmdzW2ldID0gYXJndltpXTsKKworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBjbGFzcyBQYXJzZXIgeworICAgICAgICBlbnVtIE1vZGUgeyBOb25lLCBNYXliZVNob3J0T3B0LCBTbGFzaE9wdCwgU2hvcnRPcHQsIExvbmdPcHQsIFBvc2l0aW9uYWwgfTsKKyAgICAgICAgTW9kZSBtb2RlOworICAgICAgICBzdGQ6OnNpemVfdCBmcm9tOworICAgICAgICBib29sIGluUXVvdGVzOworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgVG9rZW4geworICAgICAgICAgICAgZW51bSBUeXBlIHsgUG9zaXRpb25hbCwgU2hvcnRPcHQsIExvbmdPcHQgfTsKKyAgICAgICAgICAgIFRva2VuKCBUeXBlIF90eXBlLCBzdGQ6OnN0cmluZyBjb25zdCYgX2RhdGEgKSA6IHR5cGUoIF90eXBlICksIGRhdGEoIF9kYXRhICkge30KKyAgICAgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgICAgIH07CisKKyAgICAgICAgUGFyc2VyKCkgOiBtb2RlKCBOb25lICksIGZyb20oIDAgKSwgaW5RdW90ZXMoIGZhbHNlICl7fQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZG91YmxlRGFzaCA9ICItLSI7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCkgJiYgYXJnc1tpXSAhPSBkb3VibGVEYXNoOyArK2kgKQorICAgICAgICAgICAgICAgIHBhcnNlSW50b1Rva2VucyggYXJnc1tpXSwgdG9rZW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcGFyc2VJbnRvVG9rZW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBhcmcuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gYXJnW2ldOworICAgICAgICAgICAgICAgIGlmKCBjID09ICciJyApCisgICAgICAgICAgICAgICAgICAgIGluUXVvdGVzID0gIWluUXVvdGVzOworICAgICAgICAgICAgICAgIG1vZGUgPSBoYW5kbGVNb2RlKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGFyZy5zaXplKCksICdcMCcsIGFyZywgdG9rZW5zICk7CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNb2RlKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgc3dpdGNoKCBtb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9uZTogcmV0dXJuIGhhbmRsZU5vbmUoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIE1heWJlU2hvcnRPcHQ6IHJldHVybiBoYW5kbGVNYXliZVNob3J0T3B0KCBpLCBjICk7CisgICAgICAgICAgICAgICAgY2FzZSBTaG9ydE9wdDoKKyAgICAgICAgICAgICAgICBjYXNlIExvbmdPcHQ6CisgICAgICAgICAgICAgICAgY2FzZSBTbGFzaE9wdDogcmV0dXJuIGhhbmRsZU9wdCggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFBvc2l0aW9uYWw6IHJldHVybiBoYW5kbGVQb3NpdGlvbmFsKCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIG1vZGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU5vbmUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyApIHsKKyAgICAgICAgICAgICAgICBmcm9tID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogcmV0dXJuIE1heWJlU2hvcnRPcHQ7CisjaWZkZWYgQ0xBUkFfUExBVEZPUk1fV0lORE9XUworICAgICAgICAgICAgICAgIGNhc2UgJy8nOiBmcm9tID0gaSsxOyByZXR1cm4gU2xhc2hPcHQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBmcm9tID0gaTsgcmV0dXJuIFBvc2l0aW9uYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVNYXliZVNob3J0T3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IGZyb20gPSBpKzE7IHJldHVybiBMb25nT3B0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gU2hvcnRPcHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNb2RlIGhhbmRsZU9wdCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBzdGQ6OnN0cmluZyggIjo9XDAiLCAzICkuZmluZCggYyApID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3B0TmFtZSA9IGFyZy5zdWJzdHIoIGZyb20sIGktZnJvbSApOworICAgICAgICAgICAgaWYoIG1vZGUgPT0gU2hvcnRPcHQgKQorICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaiA9IDA7IGogPCBvcHROYW1lLnNpemUoKTsgKytqICkKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZS5zdWJzdHIoIGosIDEgKSApICk7CisgICAgICAgICAgICBlbHNlIGlmKCBtb2RlID09IFNsYXNoT3B0ICYmIG9wdE5hbWUuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6U2hvcnRPcHQsIG9wdE5hbWUgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6TG9uZ09wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZVBvc2l0aW9uYWwoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBpZiggaW5RdW90ZXMgfHwgc3RkOjpzdHJpbmcoICJcMCIsIDEgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlBvc2l0aW9uYWwsIGRhdGEgKSApOworICAgICAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBzdHJ1Y3QgQ29tbW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoKSB7fQorICAgICAgICBDb21tb25BcmdQcm9wZXJ0aWVzKCBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gY29uc3QmIF9ib3VuZEZpZWxkICkgOiBib3VuZEZpZWxkKCBfYm91bmRGaWVsZCApIHt9CisKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGJvdW5kRmllbGQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnN0cmluZyBkZXRhaWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBsYWNlaG9sZGVyOyAvLyBPbmx5IHZhbHVlIGlmIGJvdW5kRmllbGQgdGFrZXMgYW4gYXJnCisKKyAgICAgICAgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhcGxhY2Vob2xkZXIuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHZhbGlkYXRlKCkgY29uc3QgeworICAgICAgICAgICAgaWYoICFib3VuZEZpZWxkLmlzU2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbm90IGJvdW5kIiApOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgT3B0aW9uQXJnUHJvcGVydGllcyB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzaG9ydE5hbWVzOworICAgICAgICBzdGQ6OnN0cmluZyBsb25nTmFtZTsKKworICAgICAgICBib29sIGhhc1Nob3J0TmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIHNob3J0TmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQoIHNob3J0TmFtZXMuYmVnaW4oKSwgc2hvcnROYW1lcy5lbmQoKSwgc2hvcnROYW1lICkgIT0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICBib29sIGhhc0xvbmdOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xvbmdOYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9sb25nTmFtZSA9PSBsb25nTmFtZTsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RydWN0IFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMoKSA6IHBvc2l0aW9uKCAtMSApIHt9CisgICAgICAgIGludCBwb3NpdGlvbjsgLy8gLTEgbWVhbnMgbm9uLXBvc2l0aW9uYWwgKGZsb2F0aW5nKQorCisgICAgICAgIGJvb2wgaXNGaXhlZFBvc2l0aW9uYWwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gIT0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICBjbGFzcyBDb21tYW5kTGluZSB7CisKKyAgICAgICAgc3RydWN0IEFyZyA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4sIE9wdGlvbkFyZ1Byb3BlcnRpZXMsIFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgICAgIEFyZygpIHt9CisgICAgICAgICAgICBBcmcoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD4oIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICAgICAgdXNpbmcgQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPjo6cGxhY2Vob2xkZXI7IC8vICFUQkQKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGJnTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIWxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0tIiArIGxvbmdOYW1lOworICAgICAgICAgICAgICAgIGlmKCAhc2hvcnROYW1lcy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIiArIHNob3J0TmFtZXNbMF07CisgICAgICAgICAgICAgICAgcmV0dXJuICJwb3NpdGlvbmFsIGFyZ3MiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29tbWFuZHMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2hvcnROYW1lcy5iZWdpbigpLCBpdEVuZCA9IHNob3J0TmFtZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItIiA8PCAqaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmaXJzdCApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICItLSIgPDwgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhcGxhY2Vob2xkZXIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiIDwiIDw8IHBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHR5cGVkZWYgQ0xBUkFfQVVUT19QVFIoIEFyZyApIEFyZ0F1dG9QdHI7CisKKyAgICAgICAgZnJpZW5kIHZvaWQgYWRkT3B0TmFtZSggQXJnJiBhcmcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG9wdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0tIiApICkgeworICAgICAgICAgICAgICAgIGlmKCAhYXJnLmxvbmdOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgbG9uZyBvcHQgbWF5IGJlIHNwZWNpZmllZC4gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXJnLmxvbmdOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICInIGFscmVhZHkgc3BlY2lmaWVkLCBub3cgYXR0ZW1wdGluZyB0byBhZGQgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0TmFtZSArICInIiApOworICAgICAgICAgICAgICAgIGFyZy5sb25nTmFtZSA9IG9wdE5hbWUuc3Vic3RyKCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBEZXRhaWw6OnN0YXJ0c1dpdGgoIG9wdE5hbWUsICItIiApICkKKyAgICAgICAgICAgICAgICBhcmcuc2hvcnROYW1lcy5wdXNoX2JhY2soIG9wdE5hbWUuc3Vic3RyKCAxICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAib3B0aW9uIG11c3QgYmVnaW4gd2l0aCAtIG9yIC0tLiBPcHRpb24gd2FzOiAnIiArIG9wdE5hbWUgKyAiJyIgKTsKKyAgICAgICAgfQorICAgICAgICBmcmllbmQgdm9pZCBzZXRQb3NpdGlvbmFsQXJnKCBBcmcmIGFyZywgaW50IHBvc2l0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJnLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXJnQnVpbGRlciggQXJnKiBhcmcgKSA6IG1fYXJnKCBhcmcgKSB7fQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbm9uLWJvb2xlYW4gZGF0YSBtZW1iZXIgKHJlcXVpcmVzIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIE0gQzo6KiBmaWVsZCwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBCaW5kIGEgYm9vbGVhbiBkYXRhIG1lbWJlciAobm8gcGxhY2Vob2xkZXIgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCBib29sIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8Qyxib29sPiggZmllbGQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIG5vbi1ib29sZWFuIGFyZ3VtZW50IChyZXF1aXJlcyBhIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBNICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0YWtpbmcgYSBzaW5nbGUsIGJvb2xlYW4gYXJndW1lbnQgKG5vIHBsYWNlaG9sZGVyIHN0cmluZyByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogdW5hcnlNZXRob2QpKCBib29sICkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsYm9vbD4oIHVuYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgKHdpbGwgYmUgY2FsbGVkIGlmIG9wdCBpcyBwcmVzZW50KQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiBudWxsYXJ5TWV0aG9kKSgpICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmROdWxsYXJ5TWV0aG9kPEM+KCBudWxsYXJ5TWV0aG9kICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiB1bmFyeUZ1bmN0aW9uKSggQyYgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlGdW5jdGlvbjxDPiggdW5hcnlGdW5jdGlvbiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgZnJlZSBmdW5jdGlvbiB0YWtpbmcgYSBzaW5nbGUgYXJndW1lbnQgLSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24gKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoKiBiaW5hcnlGdW5jdGlvbikoIEMmLCBUICksIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kQmluYXJ5RnVuY3Rpb248QywgVD4oIGJpbmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFyZ0J1aWxkZXImIGRlc2NyaWJlKCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXJnQnVpbGRlciYgZGV0YWlsKCBzdGQ6OnN0cmluZyBjb25zdCYgZGV0YWlsICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5kZXRhaWwgPSBkZXRhaWw7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIEFyZyogbV9hcmc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgT3B0QnVpbGRlciA6IHB1YmxpYyBBcmdCdWlsZGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgT3B0QnVpbGRlciggQXJnKiBhcmcgKSA6IEFyZ0J1aWxkZXIoIGFyZyApIHt9CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBPcHRCdWlsZGVyJiBvdGhlciApIDogQXJnQnVpbGRlciggb3RoZXIgKSB7fQorCisgICAgICAgICAgICBPcHRCdWlsZGVyJiBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgICAgICBhZGRPcHROYW1lKCAqQXJnQnVpbGRlcjo6bV9hcmcsIG9wdE5hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29tbWFuZExpbmUoKQorICAgICAgICA6ICAgbV9ib3VuZFByb2Nlc3NOYW1lKCBuZXcgRGV0YWlsOjpOdWxsQmluZGVyPENvbmZpZ1Q+KCkgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCAwICksCisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgQ29tbWFuZExpbmUoIENvbW1hbmRMaW5lIGNvbnN0JiBvdGhlciApCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG90aGVyLm1fYm91bmRQcm9jZXNzTmFtZSApLAorICAgICAgICAgICAgbV9vcHRpb25zICggb3RoZXIubV9vcHRpb25zICksCisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzKCBvdGhlci5tX3Bvc2l0aW9uYWxBcmdzICksCisgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiggb3RoZXIubV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2Vucyggb3RoZXIubV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG90aGVyLm1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoICpvdGhlci5tX2Zsb2F0aW5nQXJnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbW1hbmRMaW5lJiBzZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBib29sIHNob3VsZFRocm93ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyA9IHNob3VsZFRocm93OworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgT3B0QnVpbGRlciBvcGVyYXRvcltdKCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApIHsKKyAgICAgICAgICAgIG1fb3B0aW9ucy5wdXNoX2JhY2soIEFyZygpICk7CisgICAgICAgICAgICBhZGRPcHROYW1lKCBtX29wdGlvbnMuYmFjaygpLCBvcHROYW1lICk7CisgICAgICAgICAgICBPcHRCdWlsZGVyIGJ1aWxkZXIoICZtX29wdGlvbnMuYmFjaygpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEFyZ0J1aWxkZXIgb3BlcmF0b3JbXSggaW50IHBvc2l0aW9uICkgeworICAgICAgICAgICAgbV9wb3NpdGlvbmFsQXJncy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBwb3NpdGlvbiwgQXJnKCkgKSApOworICAgICAgICAgICAgaWYoIHBvc2l0aW9uID4gbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gKQorICAgICAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICBzZXRQb3NpdGlvbmFsQXJnKCBtX3Bvc2l0aW9uYWxBcmdzW3Bvc2l0aW9uXSwgcG9zaXRpb24gKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggJm1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludm9rZSB0aGlzIHdpdGggdGhlIF8gaW5zdGFuY2UKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBVbnBvc2l0aW9uYWxUYWcgKSB7CisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk9ubHkgb25lIHVucG9zaXRpb25hbCBhcmd1bWVudCBjYW4gYmUgYWRkZWQiICk7CisgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLnJlc2V0KCBuZXcgQXJnKCkgKTsKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIgYnVpbGRlciggbV9mbG9hdGluZ0FyZy5nZXQoKSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggTSBDOjoqIGZpZWxkICkgeworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsTT4oIGZpZWxkICk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgdm9pZCBiaW5kUHJvY2Vzc05hbWUoIHZvaWQgKEM6OipfdW5hcnlNZXRob2QpKCBNICkgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsTT4oIF91bmFyeU1ldGhvZCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBvcHRVc2FnZSggc3RkOjpvc3RyZWFtJiBvcywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCwgc3RkOjpzaXplX3Qgd2lkdGggPSBEZXRhaWw6OmNvbnNvbGVXaWR0aCApIGNvbnN0IHsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0QmVnaW4gPSBtX29wdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCksIGl0OworICAgICAgICAgICAgc3RkOjpzaXplX3QgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IChzdGQ6Om1heCkoIG1heFdpZHRoLCBpdC0+Y29tbWFuZHMoKS5zaXplKCkgKTsKKworICAgICAgICAgICAgZm9yKCBpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIERldGFpbDo6VGV4dCB1c2FnZSggaXQtPmNvbW1hbmRzKCksIERldGFpbDo6VGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIG1heFdpZHRoK2luZGVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIGluZGVudCApICk7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IGRlc2MoIGl0LT5kZXNjcmlwdGlvbiwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggd2lkdGggLSBtYXhXaWR0aCAtIDMgKSApOworCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IChzdGQ6Om1heCkoIHVzYWdlLnNpemUoKSwgZGVzYy5zaXplKCkgKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZUNvbCA9IGkgPCB1c2FnZS5zaXplKCkgPyB1c2FnZVtpXSA6ICIiOworICAgICAgICAgICAgICAgICAgICBvcyA8PCB1c2FnZUNvbDsKKworICAgICAgICAgICAgICAgICAgICBpZiggaSA8IGRlc2Muc2l6ZSgpICYmICFkZXNjW2ldLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3MgIDw8IHN0ZDo6c3RyaW5nKCBpbmRlbnQgKyAyICsgbWF4V2lkdGggLSB1c2FnZUNvbC5zaXplKCksICcgJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGVzY1tpXTsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgb3B0VXNhZ2UoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3B0VXNhZ2UoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYXJnU3lub3BzaXMoIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8PSBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsgKytpICkgeworICAgICAgICAgICAgICAgIGlmKCBpID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQsIEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3NpdGlvbmFsQXJncy5maW5kKCBpICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgaXQtPnNlY29uZC5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBtX2Zsb2F0aW5nQXJnLT5wbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm9uIGNvbnNlY3V0aXZlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdpdGggbm8gZmxvYXRpbmcgYXJncyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQgTm8gaW5kaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXJncworICAgICAgICAgICAgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uID4gMSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgIjsKKyAgICAgICAgICAgICAgICBvcyA8PCAiWzwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IC4uLl0iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ1N5bm9wc2lzKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvc3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgb3MgPDwgInVzYWdlOlxuICAiIDw8IHByb2NOYW1lIDw8ICIgIjsKKyAgICAgICAgICAgIGFyZ1N5bm9wc2lzKCBvcyApOworICAgICAgICAgICAgaWYoICFtX29wdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBvcyA8PCAiIFtvcHRpb25zXVxuXG53aGVyZSBvcHRpb25zIGFyZTogXG4iOworICAgICAgICAgICAgICAgIG9wdFVzYWdlKCBvcywgMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZSggc3RkOjpzdHJpbmcgY29uc3QmIHByb2NOYW1lICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIHVzYWdlKCBvc3MsIHByb2NOYW1lICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgQ29uZmlnVCBwYXJzZSggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzICkgY29uc3QgeworICAgICAgICAgICAgQ29uZmlnVCBjb25maWc7CisgICAgICAgICAgICBwYXJzZUludG8oIGFyZ3MsIGNvbmZpZyApOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBhcnNlSW50byggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcm9jZXNzTmFtZSA9IGFyZ3MuZW1wdHkoKSA/IHN0ZDo6c3RyaW5nKCkgOiBhcmdzWzBdOworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdFNsYXNoID0gcHJvY2Vzc05hbWUuZmluZF9sYXN0X29mKCAiL1xcIiApOworICAgICAgICAgICAgaWYoIGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZS5zdWJzdHIoIGxhc3RTbGFzaCsxICk7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUuc2V0KCBjb25maWcsIHByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB0b2tlbnM7CisgICAgICAgICAgICBQYXJzZXIgcGFyc2VyOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlSW50b1Rva2VucyggYXJncywgdG9rZW5zICk7CisgICAgICAgICAgICByZXR1cm4gcG9wdWxhdGUoIHRva2VucywgY29uZmlnICk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZSggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VucyA9IHBvcHVsYXRlT3B0aW9ucyggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHVudXNlZFRva2VucyA9IHBvcHVsYXRlRml4ZWRBcmdzKCB1bnVzZWRUb2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVPcHRpb25zKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgQXJnIGNvbnN0JiBhcmcgPSAqaXQ7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6U2hvcnRPcHQgJiYgYXJnLmhhc1Nob3J0TmFtZSggdG9rZW4uZGF0YSApICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6TG9uZ09wdCAmJiBhcmcuaGFzTG9uZ05hbWUoIHRva2VuLmRhdGEgKSApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhcmcudGFrZXNBcmcoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gdG9rZW5zLnNpemUoKS0xIHx8IHRva2Vuc1tpKzFdLnR5cGUgIT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCAiRXhwZWN0ZWQgYXJndW1lbnQgdG8gb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW5zWysraV0uZGF0YSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmJvdW5kRmllbGQuc2V0KCBjb25maWcsICJ0cnVlIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIGV4LndoYXQoKSApICsgIlxuLSB3aGlsZSBwYXJzaW5nOiAoIiArIGFyZy5jb21tYW5kcygpICsgIikiICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsIHx8ICFtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXJyb3JzLmVtcHR5KCkgJiYgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJ1bnJlY29nbmlzZWQgb3B0aW9uOiAiICsgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhZXJyb3JzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlcnJvcnMuYmVnaW4oKSwgaXRFbmQgPSBlcnJvcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBlcnJvcnMuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIlxuIjsKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGaXhlZEFyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IDE7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIHBvc2l0aW9uICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IG1fcG9zaXRpb25hbEFyZ3MuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlRmxvYXRpbmdBcmdzKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLT5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiggbV9vcHRpb25zLmVtcHR5KCkgJiYgbV9wb3NpdGlvbmFsQXJncy5lbXB0eSgpICYmICFtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gb3B0aW9ucyBvciBhcmd1bWVudHMgc3BlY2lmaWVkIiApOworCisgICAgICAgICAgICBmb3IoIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yICBpdCA9IG1fb3B0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICBpdC0+dmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IG1fYm91bmRQcm9jZXNzTmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXJnPiBtX29wdGlvbnM7CisgICAgICAgIHN0ZDo6bWFwPGludCwgQXJnPiBtX3Bvc2l0aW9uYWxBcmdzOworICAgICAgICBBcmdBdXRvUHRyIG1fZmxvYXRpbmdBcmc7CisgICAgICAgIGludCBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbjsKKyAgICAgICAgYm9vbCBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENsYXJhCisKK1NUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyBSZXN0b3JlIENsYXJhJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGgsIGlmIHByZXNlbnQKKyNpZmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8Y3RpbWU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyRmlyc3QoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsgY29uZmlnLmFib3J0QWZ0ZXIgPSAxOyB9CisgICAgaW5saW5lIHZvaWQgYWJvcnRBZnRlclgoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IHggKSB7CisgICAgICAgIGlmKCB4IDwgMSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJWYWx1ZSBhZnRlciAteCBvciAtLWFib3J0QWZ0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIgKTsKKyAgICAgICAgY29uZmlnLmFib3J0QWZ0ZXIgPSB4OworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRUZXN0T3JUYWdzKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGVzdFNwZWMgKSB7IGNvbmZpZy50ZXN0c09yVGFncy5wdXNoX2JhY2soIF90ZXN0U3BlYyApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkU2VjdGlvblRvUnVuKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSApIHsgY29uZmlnLnNlY3Rpb25zVG9SdW4ucHVzaF9iYWNrKCBzZWN0aW9uTmFtZSApOyB9CisgICAgaW5saW5lIHZvaWQgYWRkUmVwb3J0ZXJOYW1lKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmVwb3J0ZXJOYW1lICkgeyBjb25maWcucmVwb3J0ZXJOYW1lcy5wdXNoX2JhY2soIF9yZXBvcnRlck5hbWUgKTsgfQorCisgICAgaW5saW5lIHZvaWQgYWRkV2FybmluZyggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3dhcm5pbmcgKSB7CisgICAgICAgIGlmKCBfd2FybmluZyA9PSAiTm9Bc3NlcnRpb25zIiApCisgICAgICAgICAgICBjb25maWcud2FybmluZ3MgPSBzdGF0aWNfY2FzdDxXYXJuQWJvdXQ6OldoYXQ+KCBjb25maWcud2FybmluZ3MgfCBXYXJuQWJvdXQ6Ok5vQXNzZXJ0aW9ucyApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgd2FybmluZzogJyIgKyBfd2FybmluZyArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0T3JkZXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIG9yZGVyICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggImRlY2xhcmVkIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOworICAgICAgICBlbHNlIGlmKCBzdGFydHNXaXRoKCAibGV4aWNhbCIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJyYW5kb20iLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJVbnJlY29nbmlzZWQgb3JkZXJpbmc6ICciICsgb3JkZXIgKyAnXCcnICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFJuZ1NlZWQoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlZWQgKSB7CisgICAgICAgIGlmKCBzZWVkID09ICJ0aW1lIiApIHsKKyAgICAgICAgICAgIGNvbmZpZy5ybmdTZWVkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Piggc3RkOjp0aW1lKDApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IHNlZWQ7CisgICAgICAgICAgICBzcyA+PiBjb25maWcucm5nU2VlZDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkFyZ3VtZW50IHRvIC0tcm5nLXNlZWQgc2hvdWxkIGJlIHRoZSB3b3JkICd0aW1lJyBvciBhIG51bWJlciIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRWZXJib3NpdHkoIENvbmZpZ0RhdGEmIGNvbmZpZywgaW50IGxldmVsICkgeworICAgICAgICAvLyAhVEJEOiBhY2NlcHQgc3RyaW5ncz8KKyAgICAgICAgY29uZmlnLnZlcmJvc2l0eSA9IHN0YXRpY19jYXN0PFZlcmJvc2l0eTo6TGV2ZWw+KCBsZXZlbCApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRTaG93RHVyYXRpb25zKCBDb25maWdEYXRhJiBjb25maWcsIGJvb2wgX3Nob3dEdXJhdGlvbnMgKSB7CisgICAgICAgIGNvbmZpZy5zaG93RHVyYXRpb25zID0gX3Nob3dEdXJhdGlvbnMKKyAgICAgICAgICAgID8gU2hvd0R1cmF0aW9uczo6QWx3YXlzCisgICAgICAgICAgICA6IFNob3dEdXJhdGlvbnM6Ok5ldmVyOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRVc2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgeworICAgICAgICBzdGQ6OnN0cmluZyBtb2RlID0gdG9Mb3dlciggdmFsdWUgKTsKKworICAgICAgICBpZiggbW9kZSA9PSAieWVzIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gIm5vIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpObzsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAiYXV0byIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiY29sb3VyIG1vZGUgbXVzdCBiZSBvbmUgb2Y6IGF1dG8sIHllcyBvciBubyIgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZm9yY2VDb2xvdXIoIENvbmZpZ0RhdGEmIGNvbmZpZyApIHsKKyAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6WWVzOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBsb2FkVGVzdE5hbWVzRnJvbUZpbGUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9maWxlbmFtZSApIHsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBmKCBfZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggIWYuaXNfb3BlbigpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5hYmxlIHRvIGxvYWQgaW5wdXQgZmlsZTogIiArIF9maWxlbmFtZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlKCBzdGQ6OmdldGxpbmUoIGYsIGxpbmUgKSApIHsKKyAgICAgICAgICAgIGxpbmUgPSB0cmltKGxpbmUpOworICAgICAgICAgICAgaWYoICFsaW5lLmVtcHR5KCkgJiYgIXN0YXJ0c1dpdGgoIGxpbmUsICcjJyApICkgeworICAgICAgICAgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggbGluZSwgJyInICkgKQorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJyInICsgbGluZSArICciJzsKKyAgICAgICAgICAgICAgICBhZGRUZXN0T3JUYWdzKCBjb25maWcsIGxpbmUgKyAnLCcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgeworCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBDbGFyYTsKKyAgICAgICAgQ29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY2xpOworCisgICAgICAgIGNsaS5iaW5kUHJvY2Vzc05hbWUoICZDb25maWdEYXRhOjpwcm9jZXNzTmFtZSApOworCisgICAgICAgIGNsaVsiLT8iXVsiLWgiXVsiLS1oZWxwIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImRpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24iICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd0hlbHAgKTsKKworICAgICAgICBjbGlbIi1sIl1bIi0tbGlzdC10ZXN0cyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUZXN0cyApOworCisgICAgICAgIGNsaVsiLXQiXVsiLS1saXN0LXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGFncyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGFncyApOworCisgICAgICAgIGNsaVsiLXMiXVsiLS1zdWNjZXNzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImluY2x1ZGUgc3VjY2Vzc2Z1bCB0ZXN0cyBpbiBvdXRwdXQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd1N1Y2Nlc3NmdWxUZXN0cyApOworCisgICAgICAgIGNsaVsiLWIiXVsiLS1icmVhayJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJicmVhayBpbnRvIGRlYnVnZ2VyIG9uIGZhaWx1cmUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvdWxkRGVidWdCcmVhayApOworCisgICAgICAgIGNsaVsiLWUiXVsiLS1ub3Rocm93Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNraXAgZXhjZXB0aW9uIHRlc3RzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5vVGhyb3cgKTsKKworICAgICAgICBjbGlbIi1pIl1bIi0taW52aXNpYmxlcyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IGludmlzaWJsZXMgKHRhYnMsIG5ld2xpbmVzKSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SW52aXNpYmxlcyApOworCisgICAgICAgIGNsaVsiLW8iXVsiLS1vdXQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAib3V0cHV0IGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om91dHB1dEZpbGVuYW1lLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItciJdWyItLXJlcG9ydGVyIl0KKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibmFtZVs6ZmlsZW5hbWVdIiApCisgICAgICAgICAgICAuZGVzY3JpYmUoICJyZXBvcnRlciB0byB1c2UgKGRlZmF1bHRzIHRvIGNvbnNvbGUpIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFJlcG9ydGVyTmFtZSwgIm5hbWUiICk7CisKKyAgICAgICAgY2xpWyItbiJdWyItLW5hbWUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic3VpdGUgbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpuYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1hIl1bIi0tYWJvcnQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYXQgZmlyc3QgZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyRmlyc3QgKTsKKworICAgICAgICBjbGlbIi14Il1bIi0tYWJvcnR4Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFib3J0IGFmdGVyIHggZmFpbHVyZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWJvcnRBZnRlclgsICJuby4gZmFpbHVyZXMiICk7CisKKyAgICAgICAgY2xpWyItdyJdWyItLXdhcm4iXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZW5hYmxlIHdhcm5pbmdzIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFdhcm5pbmcsICJ3YXJuaW5nIG5hbWUiICk7CisKKy8vIC0gbmVlZHMgdXBkYXRpbmcgaWYgcmVpbnN0YXRlZAorLy8gICAgICAgIGNsaS5pbnRvKCAmc2V0VmVyYm9zaXR5ICkKKy8vICAgICAgICAgICAgLmRlc2NyaWJlKCAibGV2ZWwgb2YgdmVyYm9zaXR5ICgwPW5vIG91dHB1dCkiICkKKy8vICAgICAgICAgICAgLnNob3J0T3B0KCAidiIpCisvLyAgICAgICAgICAgIC5sb25nT3B0KCAidmVyYm9zaXR5IiApCisvLyAgICAgICAgICAgIC5wbGFjZWhvbGRlciggImxldmVsIiApOworCisgICAgICAgIGNsaVtfXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAid2hpY2ggdGVzdCBvciB0ZXN0cyB0byB1c2UiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkVGVzdE9yVGFncywgInRlc3QgbmFtZSwgcGF0dGVybiBvciB0YWdzIiApOworCisgICAgICAgIGNsaVsiLWQiXVsiLS1kdXJhdGlvbnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdyB0ZXN0IGR1cmF0aW9ucyIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRTaG93RHVyYXRpb25zLCAieWVzfG5vIiApOworCisgICAgICAgIGNsaVsiLWYiXVsiLS1pbnB1dC1maWxlIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxvYWQgdGVzdCBuYW1lcyB0byBydW4gZnJvbSBhIGZpbGUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmbG9hZFRlc3ROYW1lc0Zyb21GaWxlLCAiZmlsZW5hbWUiICk7CisKKyAgICAgICAgY2xpWyItIyJdWyItLWZpbGVuYW1lcy1hcy10YWdzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFkZHMgYSB0YWcgZm9yIHRoZSBmaWxlbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpmaWxlbmFtZXNBc1RhZ3MgKTsKKworICAgICAgICBjbGlbIi1jIl1bIi0tc2VjdGlvbiJdCisgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCAic3BlY2lmeSBzZWN0aW9uIHRvIHJ1biIgKQorICAgICAgICAgICAgICAgIC5iaW5kKCAmYWRkU2VjdGlvblRvUnVuLCAic2VjdGlvbiBuYW1lIiApOworCisgICAgICAgIC8vIExlc3MgY29tbW9uIGNvbW1hbmRzIHdoaWNoIGRvbid0IGhhdmUgYSBzaG9ydCBmb3JtCisgICAgICAgIGNsaVsiLS1saXN0LXRlc3QtbmFtZXMtb25seSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIG5hbWVzIG9ubHkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3ROYW1lc09ubHkgKTsKKworICAgICAgICBjbGlbIi0tbGlzdC1yZXBvcnRlcnMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwgcmVwb3J0ZXJzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RSZXBvcnRlcnMgKTsKKworICAgICAgICBjbGlbIi0tb3JkZXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAidGVzdCBjYXNlIG9yZGVyIChkZWZhdWx0cyB0byBkZWNsKSIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRPcmRlciwgImRlY2x8bGV4fHJhbmQiICk7CisKKyAgICAgICAgY2xpWyItLXJuZy1zZWVkIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNldCBhIHNwZWNpZmljIHNlZWQgZm9yIHJhbmRvbSBudW1iZXJzIiApCisgICAgICAgICAgICAuYmluZCggJnNldFJuZ1NlZWQsICIndGltZSd8bnVtYmVyIiApOworCisgICAgICAgIGNsaVsiLS1mb3JjZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZm9yY2UgY29sb3VyaXNlZCBvdXRwdXQgKGRlcHJlY2F0ZWQpIiApCisgICAgICAgICAgICAuYmluZCggJmZvcmNlQ29sb3VyICk7CisKKyAgICAgICAgY2xpWyItLXVzZS1jb2xvdXIiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdWxkIG91dHB1dCBiZSBjb2xvdXJpc2VkIiApCisgICAgICAgICAgICAuYmluZCggJnNldFVzZUNvbG91ciwgInllc3xubyIgKTsKKworICAgICAgICByZXR1cm4gY2xpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9saXN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTElTVF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RleHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVYVF9IX0lOQ0xVREVECisKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKworI2RlZmluZSBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL2V4dGVybmFsL3RiY190ZXh0X2Zvcm1hdC5oCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZm5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyMgaWZkZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyMgIGlmbmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjICAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBzdGQ6OnNpemVfdCBpbml0aWFsSW5kZW50OyAgLy8gaW5kZW50IG9mIGZpcnN0IGxpbmUsIG9yIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3QgaW5kZW50OyAgICAgICAgIC8vIGluZGVudCBvZiBzdWJzZXF1ZW50IGxpbmVzLCBvciBhbGwgaWYgaW5pdGlhbEluZGVudCBpcyBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoOyAgICAgICAgICAvLyBtYXhpbXVtIHdpZHRoIG9mIHRleHQsIGluY2x1ZGluZyBpbmRlbnQuIExvbmdlciB0ZXh0IHdpbGwgd3JhcAorICAgIH07CisKKyAgICBjbGFzcyBUZXh0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyLCBUZXh0QXR0cmlidXRlcyBjb25zdCYgX2F0dHIgPSBUZXh0QXR0cmlidXRlcygpICkKKyAgICAgICAgOiBhdHRyKCBfYXR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUJlZm9yZUNoYXJzID0gIlsoezxcdCI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVBZnRlckNoYXJzID0gIl0pfT4tLC4vfFxcIjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzID0gIiBcblxyIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGVudCA9IF9hdHRyLmluaXRpYWxJbmRlbnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgICAgICAgICA/IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbml0aWFsSW5kZW50LCAnICcgKQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaXRlcmF0b3IgaXQgPSBfc3RyLmJlZ2luKCk7CisgICAgICAgICAgICBjb25zdCBpdGVyYXRvciBzdHJFbmQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICB3aGlsZSggaXQgIT0gc3RyRW5kICkgeworCisgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA+PSAxMDAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soICIuLi4gbWVzc2FnZSB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBzaXplIiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoID0gKHN0ZDo6bWluKSggc3RhdGljX2Nhc3Q8c2l6ZV90Piggc3RyRW5kLWl0ICksIF9hdHRyLndpZHRoLXN0YXRpY19jYXN0PHNpemVfdD4oIGluZGVudC5zaXplKCkgKSApOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0RW5kID0gaXQrd2lkdGg7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXh0ID0gX3N0ci5lbmQoKTsKKworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0TmV3TGluZSA9IHN0ZDo6ZmluZCggaXQsIGl0RW5kLCAnXG4nICk7CisgICAgICAgICAgICAgICAgaWYoIGl0TmV3TGluZSAhPSBpdEVuZCApCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gaXROZXdMaW5lOworCisgICAgICAgICAgICAgICAgaWYoIGl0RW5kICE9IHN0ckVuZCAgKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRXcmFwUG9pbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgZmluZEl0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3cmFwcGFibGVBZnRlckNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBmaW5kSXQgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaW5kSXQgPiBpdCAmJiB3cmFwcGFibGVCZWZvcmVDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQrMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmluZEl0ID09IGl0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggIWZvdW5kV3JhcFBvaW50ICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmb3VuZFdyYXBQb2ludCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGdvb2Qgd3JhcCBjaGFyLCBzbyB3ZSdsbCBicmVhayBtaWQgd29yZCBhbmQgYWRkIGEgaHlwaGVuCisgICAgICAgICAgICAgICAgICAgICAgICAtLWl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiLSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXRFbmQgPiBpdCAmJiB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycy5maW5kKCAqKGl0RW5kLTEpICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCBpbmRlbnQgKyBzdGQ6OnN0cmluZyggaXQsIGl0RW5kICkgKyBzdWZmaXggKTsKKworICAgICAgICAgICAgICAgIGlmKCBpbmRlbnQuc2l6ZSgpICE9IF9hdHRyLmluZGVudCApCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbmRlbnQsICcgJyApOworICAgICAgICAgICAgICAgIGl0ID0gaXROZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmVnaW4oKTsgfQorICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBsaW5lcy5lbmQoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJhY2soKTsgfQorICAgICAgICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbGluZXMuc2l6ZSgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRvcltdKCBzdGQ6OnNpemVfdCBfaW5kZXggKSBjb25zdCB7IHJldHVybiBsaW5lc1tfaW5kZXhdOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAqdGhpczsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIFRleHQgY29uc3QmIF90ZXh0ICkgeworICAgICAgICAgICAgZm9yKCBUZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF90ZXh0LmJlZ2luKCksIGl0RW5kID0gX3RleHQuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0ICE9IF90ZXh0LmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICBUZXh0QXR0cmlidXRlcyBhdHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFRiYworCisjaWZkZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK30gLy8gZW5kIG91dGVyIG5hbWVzcGFjZQorI2VuZGlmCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjdW5kZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB1c2luZyBUYmM6OlRleHQ7CisgICAgdXNpbmcgVGJjOjpUZXh0QXR0cmlidXRlczsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnNvbGVfY29sb3VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29sb3VyIHsKKyAgICAgICAgZW51bSBDb2RlIHsKKyAgICAgICAgICAgIE5vbmUgPSAwLAorCisgICAgICAgICAgICBXaGl0ZSwKKyAgICAgICAgICAgIFJlZCwKKyAgICAgICAgICAgIEdyZWVuLAorICAgICAgICAgICAgQmx1ZSwKKyAgICAgICAgICAgIEN5YW4sCisgICAgICAgICAgICBZZWxsb3csCisgICAgICAgICAgICBHcmV5LAorCisgICAgICAgICAgICBCcmlnaHQgPSAweDEwLAorCisgICAgICAgICAgICBCcmlnaHRSZWQgPSBCcmlnaHQgfCBSZWQsCisgICAgICAgICAgICBCcmlnaHRHcmVlbiA9IEJyaWdodCB8IEdyZWVuLAorICAgICAgICAgICAgTGlnaHRHcmV5ID0gQnJpZ2h0IHwgR3JleSwKKyAgICAgICAgICAgIEJyaWdodFdoaXRlID0gQnJpZ2h0IHwgV2hpdGUsCisKKyAgICAgICAgICAgIC8vIEJ5IGludGVudGlvbgorICAgICAgICAgICAgRmlsZU5hbWUgPSBMaWdodEdyZXksCisgICAgICAgICAgICBXYXJuaW5nID0gWWVsbG93LAorICAgICAgICAgICAgUmVzdWx0RXJyb3IgPSBCcmlnaHRSZWQsCisgICAgICAgICAgICBSZXN1bHRTdWNjZXNzID0gQnJpZ2h0R3JlZW4sCisgICAgICAgICAgICBSZXN1bHRFeHBlY3RlZEZhaWx1cmUgPSBXYXJuaW5nLAorCisgICAgICAgICAgICBFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFN1Y2Nlc3MgPSBHcmVlbiwKKworICAgICAgICAgICAgT3JpZ2luYWxFeHByZXNzaW9uID0gQ3lhbiwKKyAgICAgICAgICAgIFJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gWWVsbG93LAorCisgICAgICAgICAgICBTZWNvbmRhcnlUZXh0ID0gTGlnaHRHcmV5LAorICAgICAgICAgICAgSGVhZGVycyA9IFdoaXRlCisgICAgICAgIH07CisKKyAgICAgICAgLy8gVXNlIGNvbnN0cnVjdGVkIG9iamVjdCBmb3IgUkFJSSBndWFyZAorICAgICAgICBDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKTsKKyAgICAgICAgQ29sb3VyKCBDb2xvdXIgY29uc3QmIG90aGVyICk7CisgICAgICAgIH5Db2xvdXIoKTsKKworICAgICAgICAvLyBVc2Ugc3RhdGljIG1ldGhvZCBmb3Igb25lLXNob3QgY2hhbmdlcworICAgICAgICBzdGF0aWMgdm9pZCB1c2UoIENvZGUgX2NvbG91ckNvZGUgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9tb3ZlZDsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBDb2xvdXIgY29uc3QmICkgeyByZXR1cm4gb3M7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlcG9ydGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUkVQT1JURVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJDb25maWcgeworICAgICAgICBleHBsaWNpdCBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZyApCisgICAgICAgIDogICBtX3N0cmVhbSggJl9mdWxsQ29uZmlnLT5zdHJlYW0oKSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBSZXBvcnRlckNvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfZnVsbENvbmZpZywgc3RkOjpvc3RyZWFtJiBfc3RyZWFtICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX3N0cmVhbSApLCBtX2Z1bGxDb25maWcoIF9mdWxsQ29uZmlnICkge30KKworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ICAgIHsgcmV0dXJuICptX3N0cmVhbTsgfQorICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gZnVsbENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbENvbmZpZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBtX3N0cmVhbTsKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fZnVsbENvbmZpZzsKKyAgICB9OworCisgICAgc3RydWN0IFJlcG9ydGVyUHJlZmVyZW5jZXMgeworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzKCkKKyAgICAgICAgOiBzaG91bGRSZWRpcmVjdFN0ZE91dCggZmFsc2UgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgc2hvdWxkUmVkaXJlY3RTdGRPdXQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IExhenlTdGF0IDogT3B0aW9uPFQ+IHsKKyAgICAgICAgTGF6eVN0YXQoKSA6IHVzZWQoIGZhbHNlICkge30KKyAgICAgICAgTGF6eVN0YXQmIG9wZXJhdG9yPSggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgT3B0aW9uPFQ+OjpvcGVyYXRvcj0oIF92YWx1ZSApOworICAgICAgICAgICAgdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBPcHRpb248VD46OnJlc2V0KCk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB1c2VkOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1bkluZm8geworICAgICAgICBUZXN0UnVuSW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgOiBuYW1lKCBfbmFtZSApIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgfTsKKyAgICBzdHJ1Y3QgR3JvdXBJbmZvIHsKKyAgICAgICAgR3JvdXBJbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3Vwc0NvdW50ICkKKyAgICAgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgICAgICBncm91cEluZGV4KCBfZ3JvdXBJbmRleCApLAorICAgICAgICAgICAgZ3JvdXBzQ291bnRzKCBfZ3JvdXBzQ291bnQgKQorICAgICAgICB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXg7CisgICAgICAgIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50czsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvblN0YXRzIHsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgX2Fzc2VydGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBjb25zdCYgX2luZm9NZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscyApCisgICAgICAgIDogICBhc3NlcnRpb25SZXN1bHQoIF9hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgIGluZm9NZXNzYWdlcyggX2luZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblJlc3VsdC5oYXNNZXNzYWdlKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gQ29weSBtZXNzYWdlIGludG8gbWVzc2FnZXMgbGlzdC4KKyAgICAgICAgICAgICAgICAvLyAhVEJEIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkb25lIGVhcmxpZXIsIHNvbWV3aGVyZQorICAgICAgICAgICAgICAgIE1lc3NhZ2VCdWlsZGVyIGJ1aWxkZXIoIGFzc2VydGlvblJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCksIGFzc2VydGlvblJlc3VsdC5nZXRTb3VyY2VJbmZvKCksIGFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyIDw8IGFzc2VydGlvblJlc3VsdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisKKyAgICAgICAgICAgICAgICBpbmZvTWVzc2FnZXMucHVzaF9iYWNrKCBidWlsZGVyLm1faW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkFzc2VydGlvblN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGluZm9NZXNzYWdlczsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25TdGF0cyB7CisgICAgICAgIFNlY3Rpb25TdGF0cyggICBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzIGNvbnN0JiBfYXNzZXJ0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZHVyYXRpb25JblNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIDogICBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksCisgICAgICAgICAgICBhc3NlcnRpb25zKCBfYXNzZXJ0aW9ucyApLAorICAgICAgICAgICAgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApLAorICAgICAgICAgICAgbWlzc2luZ0Fzc2VydGlvbnMoIF9taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25TdGF0cygpOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdENhc2VTdGF0cyB7CisgICAgICAgIFRlc3RDYXNlU3RhdHMoICBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogdGVzdEluZm8oIF90ZXN0SW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBzdGRPdXQoIF9zdGRPdXQgKSwKKyAgICAgICAgICAgIHN0ZEVyciggX3N0ZEVyciApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RDYXNlU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZEVycjsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RHcm91cFN0YXRzIHsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApCisgICAgICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBmYWxzZSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RHcm91cFN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgR3JvdXBJbmZvIGdyb3VwSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RSdW5TdGF0cyB7CisgICAgICAgIFRlc3RSdW5TdGF0cyggICBUZXN0UnVuSW5mbyBjb25zdCYgX3J1bkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogICBydW5JbmZvKCBfcnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfdG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdFJ1blN0YXRzKCk7CisKKyMgIGlmbmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmIF9vdGhlciApCisgICAgICAgIDogICBydW5JbmZvKCBfb3RoZXIucnVuSW5mbyApLAorICAgICAgICAgICAgdG90YWxzKCBfb3RoZXIudG90YWxzICksCisgICAgICAgICAgICBhYm9ydGluZyggX290aGVyLmFib3J0aW5nICkKKyAgICAgICAge30KKyMgIGVsc2UKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdFJ1blN0YXRzJiBvcGVyYXRvciA9ICggVGVzdFJ1blN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgVGVzdFJ1bkluZm8gcnVuSW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgYm9vbCBhYm9ydGluZzsKKyAgICB9OworCisgICAgY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnM7CisKKyAgICBzdHJ1Y3QgSVN0cmVhbWluZ1JlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklTdHJlYW1pbmdSZXBvcnRlcigpOworCisgICAgICAgIC8vIEltcGxlbWVudGluZyBjbGFzcyBtdXN0IGFsc28gcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBtZXRob2Q6CisgICAgICAgIC8vIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgPSAwOworCisgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIE11bHRpcGxlUmVwb3J0ZXJzKiB0cnlBc011bHRpKCkgeyByZXR1cm4gQ0FUQ0hfTlVMTDsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeSA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJGYWN0b3J5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeSB7CisgICAgICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiA+IEZhY3RvcnlNYXA7CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gTGlzdGVuZXJzOworCisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlclJlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBGYWN0b3J5TWFwIGNvbnN0JiBnZXRGYWN0b3JpZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZFJlcG9ydGVyKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgZXhpc3RpbmdSZXBvcnRlciwgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGFkZGl0aW9uYWxSZXBvcnRlciApOworCit9CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0cyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJNYXRjaGluZyB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBbGwgYXZhaWxhYmxlIHRlc3QgY2FzZXM6XG4iOworICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBUZXh0QXR0cmlidXRlcyBuYW1lQXR0ciwgdGFnc0F0dHI7CisgICAgICAgIG5hbWVBdHRyLnNldEluaXRpYWxJbmRlbnQoIDIgKS5zZXRJbmRlbnQoIDQgKTsKKyAgICAgICAgdGFnc0F0dHIuc2V0SW5kZW50KCA2ICk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgbWF0Y2hlZFRlc3RzKys7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXIgPSB0ZXN0Q2FzZUluZm8uaXNIaWRkZW4oKQorICAgICAgICAgICAgICAgID8gQ29sb3VyOjpTZWNvbmRhcnlUZXh0CisgICAgICAgICAgICAgICAgOiBDb2xvdXI6Ok5vbmU7CisgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby5uYW1lLCBuYW1lQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VJbmZvLnRhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBUZXh0KCB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nLCB0YWdzQXR0ciApIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJ0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCBtYXRjaGVkVGVzdHMsICJtYXRjaGluZyB0ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdHM7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUZXN0c05hbWVzT25seSggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCAhY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICBzdGQ6OnNpemVfdCBtYXRjaGVkVGVzdHMgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRlc3RDYXNlSW5mby5uYW1lLCAnIycgKSApCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICciJyA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCAnIicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXN0Q2FzZUluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVGFnSW5mbyB7CisgICAgICAgIFRhZ0luZm8oKSA6IGNvdW50ICggMCApIHt9CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlbGxpbmcgKSB7CisgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgc3BlbGxpbmdzLmluc2VydCggc3BlbGxpbmcgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhbGwoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvdXQ7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzcGVsbGluZ3MuYmVnaW4oKSwgaXRFbmQgPSBzcGVsbGluZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIG91dCArPSAiWyIgKyAqaXQgKyAiXSI7CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzcGVsbGluZ3M7CisgICAgICAgIHN0ZDo6c2l6ZV90IGNvdW50OworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRhZ3MoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlRhZ3MgZm9yIG1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGFnczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPiB0YWdDb3VudHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yICB0YWdJdCA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS50YWdzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0l0RW5kID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRhZ0l0ICE9IHRhZ0l0RW5kOworICAgICAgICAgICAgICAgICAgICArK3RhZ0l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ05hbWUgPSAqdGFnSXQ7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWdOYW1lID0gdG9Mb3dlciggdGFnTmFtZSApOworICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6aXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5maW5kKCBsY2FzZVRhZ05hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiggY291bnRJdCA9PSB0YWdDb3VudHMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICBjb3VudEl0ID0gdGFnQ291bnRzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGxjYXNlVGFnTmFtZSwgVGFnSW5mbygpICkgKS5maXJzdDsKKyAgICAgICAgICAgICAgICBjb3VudEl0LT5zZWNvbmQuYWRkKCB0YWdOYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPjo6Y29uc3RfaXRlcmF0b3IgY291bnRJdCA9IHRhZ0NvdW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRJdEVuZCA9IHRhZ0NvdW50cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb3VudEl0ICE9IGNvdW50SXRFbmQ7CisgICAgICAgICAgICAgICAgKytjb3VudEl0ICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiICAiIDw8IHN0ZDo6c2V0dygyKSA8PCBjb3VudEl0LT5zZWNvbmQuY291bnQgPDwgIiAgIjsKKyAgICAgICAgICAgIFRleHQgd3JhcHBlciggY291bnRJdC0+c2Vjb25kLmFsbCgpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIG9zcy5zdHIoKS5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMTAgKSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBvc3Muc3RyKCkgPDwgd3JhcHBlciA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgcGx1cmFsaXNlKCB0YWdDb3VudHMuc2l6ZSgpLCAidGFnIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gdGFnQ291bnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFJlcG9ydGVycyggQ29uZmlnIGNvbnN0JiAvKmNvbmZpZyovICkgeworICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBdmFpbGFibGUgcmVwb3J0ZXJzOlxuIjsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6OkZhY3RvcnlNYXAgY29uc3QmIGZhY3RvcmllcyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IGZhY3Rvcmllcy5iZWdpbigpLCBpdEVuZCA9IGZhY3Rvcmllcy5lbmQoKSwgaXQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1heE5hbWVMZW4gPSAwOworICAgICAgICBmb3IoaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICBtYXhOYW1lTGVuID0gKHN0ZDo6bWF4KSggbWF4TmFtZUxlbiwgaXQtPmZpcnN0LnNpemUoKSApOworCisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBpdC0+c2Vjb25kLT5nZXREZXNjcmlwdGlvbigpLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggNyttYXhOYW1lTGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAtIG1heE5hbWVMZW4tOCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICIgICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPmZpcnN0CisgICAgICAgICAgICAgICAgICAgIDw8ICc6JworICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyggbWF4TmFtZUxlbiAtIGl0LT5maXJzdC5zaXplKCkgKyAyLCAnICcgKQorICAgICAgICAgICAgICAgICAgICA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3QoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZENvdW50OworICAgICAgICBpZiggY29uZmlnLmxpc3RUZXN0cygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0cyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3ROYW1lc09ubHkoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGVzdHNOYW1lc09ubHkoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RUYWdzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRhZ3MoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RSZXBvcnRlcnMoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0UmVwb3J0ZXJzKCBjb25maWcgKTsKKyAgICAgICAgcmV0dXJuIGxpc3RlZENvdW50OworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9ydW5fY29udGV4dC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3RyYWNrZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfVFJBQ0tFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisKKyAgICBzdHJ1Y3QgTmFtZUFuZExvY2F0aW9uIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbG9jYXRpb247CisKKyAgICAgICAgTmFtZUFuZExvY2F0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbG9jYXRpb24gKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGxvY2F0aW9uKCBfbG9jYXRpb24gKQorICAgICAgICB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgSVRyYWNrZXIgOiBTaGFyZWRJbXBsPD4geworICAgICAgICB2aXJ0dWFsIH5JVHJhY2tlcigpOworCisgICAgICAgIC8vIHN0YXRpYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24oKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gZHluYW1pYyBxdWVyaWVzCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIG9yIGZhaWxlZAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSBjb25zdCA9IDA7IC8vIFN0YXJ0ZWQgYnV0IG5vdCBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgPSAwOworCisgICAgICAgIC8vIGFjdGlvbnMKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGUKKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFB0cjxJVHJhY2tlcj4gY29uc3QmIGNoaWxkICkgPSAwOworICAgICAgICB2aXJ0dWFsIElUcmFja2VyKiBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgPSAwOworCisgICAgICAgIC8vIERlYnVnLyBjaGVja2luZworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyAgVHJhY2tlckNvbnRleHQgeworCisgICAgICAgIGVudW0gUnVuU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIENvbXBsZXRlZEN5Y2xlCisgICAgICAgIH07CisKKyAgICAgICAgUHRyPElUcmFja2VyPiBtX3Jvb3RUcmFja2VyOworICAgICAgICBJVHJhY2tlciogbV9jdXJyZW50VHJhY2tlcjsKKyAgICAgICAgUnVuU3RhdGUgbV9ydW5TdGF0ZTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQmIGluc3RhbmNlKCkgeworICAgICAgICAgICAgc3RhdGljIFRyYWNrZXJDb250ZXh0IHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrZXJDb250ZXh0KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFRyYWNrZXIoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fcnVuU3RhdGUoIE5vdFN0YXJ0ZWQgKQorICAgICAgICB7fQorCisgICAgICAgIElUcmFja2VyJiBzdGFydFJ1bigpOworCisgICAgICAgIHZvaWQgZW5kUnVuKCkgeworICAgICAgICAgICAgbV9yb290VHJhY2tlci5yZXNldCgpOworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RhcnRDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBtX3Jvb3RUcmFja2VyLmdldCgpOworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNvbXBsZXRlQ3ljbGUoKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKworICAgICAgICBib29sIGNvbXBsZXRlZEN5Y2xlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkQ3ljbGU7CisgICAgICAgIH0KKyAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyKCkgeworICAgICAgICAgICAgcmV0dXJuICptX2N1cnJlbnRUcmFja2VyOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0Q3VycmVudFRyYWNrZXIoIElUcmFja2VyKiB0cmFja2VyICkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IHRyYWNrZXI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgVHJhY2tlckJhc2UgOiBwdWJsaWMgSVRyYWNrZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZW51bSBDeWNsZVN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVjdXRpbmcsCisgICAgICAgICAgICBFeGVjdXRpbmdDaGlsZHJlbiwKKyAgICAgICAgICAgIE5lZWRzQW5vdGhlclJ1biwKKyAgICAgICAgICAgIENvbXBsZXRlZFN1Y2Nlc3NmdWxseSwKKyAgICAgICAgICAgIEZhaWxlZAorICAgICAgICB9OworICAgICAgICBjbGFzcyBUcmFja2VySGFzTmFtZSB7CisgICAgICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRyYWNrZXJIYXNOYW1lKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIDogbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yICgpKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiB0cmFja2VyICkgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5uYW1lID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgJiYKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZUFuZExvY2F0aW9uKCkubG9jYXRpb24gPT0gbV9uYW1lQW5kTG9jYXRpb24ubG9jYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElUcmFja2VyPiA+IENoaWxkcmVuOworICAgICAgICBOYW1lQW5kTG9jYXRpb24gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIFRyYWNrZXJDb250ZXh0JiBtX2N0eDsKKyAgICAgICAgSVRyYWNrZXIqIG1fcGFyZW50OworICAgICAgICBDaGlsZHJlbiBtX2NoaWxkcmVuOworICAgICAgICBDeWNsZVN0YXRlIG1fcnVuU3RhdGU7CisgICAgcHVibGljOgorICAgICAgICBUcmFja2VyQmFzZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICA6ICAgbV9uYW1lQW5kTG9jYXRpb24oIG5hbWVBbmRMb2NhdGlvbiApLAorICAgICAgICAgICAgbV9jdHgoIGN0eCApLAorICAgICAgICAgICAgbV9wYXJlbnQoIHBhcmVudCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRyYWNrZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSB8fCBtX3J1blN0YXRlID09IEZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlICE9IE5vdFN0YXJ0ZWQgJiYgIWlzQ29tcGxldGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gIW1fY2hpbGRyZW4uZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLnB1c2hfYmFjayggY2hpbGQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDaGlsZHJlbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdGQ6OmZpbmRfaWYoIG1fY2hpbGRyZW4uYmVnaW4oKSwgbV9jaGlsZHJlbi5lbmQoKSwgVHJhY2tlckhhc05hbWUoIG5hbWVBbmRMb2NhdGlvbiApICk7CisgICAgICAgICAgICByZXR1cm4oIGl0ICE9IG1fY2hpbGRyZW4uZW5kKCkgKQorICAgICAgICAgICAgICAgID8gaXQtPmdldCgpCisgICAgICAgICAgICAgICAgOiBDQVRDSF9OVUxMOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXImIHBhcmVudCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsgLy8gU2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbCBleGNlcHQgZm9yIHJvb3QKKyAgICAgICAgICAgIHJldHVybiAqbV9wYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIG1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gKSB7CisgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZ0NoaWxkcmVuOworICAgICAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB2b2lkIG9wZW4oKSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICAgICAgbW92ZVRvVGhpcygpOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIC8vIENsb3NlIGFueSBzdGlsbCBvcGVuIGNoaWxkcmVuIChlLmcuIGdlbmVyYXRvcnMpCisgICAgICAgICAgICB3aGlsZSggJm1fY3R4LmN1cnJlbnRUcmFja2VyKCkgIT0gdGhpcyApCisgICAgICAgICAgICAgICAgbV9jdHguY3VycmVudFRyYWNrZXIoKS5jbG9zZSgpOworCisgICAgICAgICAgICBzd2l0Y2goIG1fcnVuU3RhdGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3RTdGFydGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OgorICAgICAgICAgICAgICAgIGNhc2UgRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiSWxsb2dpY2FsIHN0YXRlIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBOZWVkc0Fub3RoZXJSdW46CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOzsKKworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nOgorICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4ZWN1dGluZ0NoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICBpZiggbV9jaGlsZHJlbi5lbXB0eSgpIHx8IG1fY2hpbGRyZW4uYmFjaygpLT5pc0NvbXBsZXRlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5leHBlY3RlZCBzdGF0ZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBmYWlsKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEZhaWxlZDsKKyAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCk7CisgICAgICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKKyAgICAgICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgbWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gTmVlZHNBbm90aGVyUnVuOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBtb3ZlVG9QYXJlbnQoKSB7CisgICAgICAgICAgICBhc3NlcnQoIG1fcGFyZW50ICk7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggbV9wYXJlbnQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIG1vdmVUb1RoaXMoKSB7CisgICAgICAgICAgICBtX2N0eC5zZXRDdXJyZW50VHJhY2tlciggdGhpcyApOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFNlY3Rpb25UcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fZmlsdGVyczsKKyAgICBwdWJsaWM6CisgICAgICAgIFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwYXJlbnQgKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoICFwYXJlbnQtPmlzU2VjdGlvblRyYWNrZXIoKSApCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9ICZwYXJlbnQtPnBhcmVudCgpOworCisgICAgICAgICAgICAgICAgU2VjdGlvblRyYWNrZXImIHBhcmVudFNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCAqcGFyZW50ICk7CisgICAgICAgICAgICAgICAgYWRkTmV4dEZpbHRlcnMoIHBhcmVudFNlY3Rpb24ubV9maWx0ZXJzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblRyYWNrZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgU2VjdGlvblRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgeworICAgICAgICAgICAgU2VjdGlvblRyYWNrZXIqIHNlY3Rpb24gPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXIqPiggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gbmV3IFNlY3Rpb25UcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHNlY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhY3R4LmNvbXBsZXRlZEN5Y2xlKCkgKQorICAgICAgICAgICAgICAgIHNlY3Rpb24tPnRyeU9wZW4oKTsKKyAgICAgICAgICAgIHJldHVybiAqc2VjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdHJ5T3BlbigpIHsKKyAgICAgICAgICAgIGlmKCAhaXNDb21wbGV0ZSgpICYmIChtX2ZpbHRlcnMuZW1wdHkoKSB8fCBtX2ZpbHRlcnNbMF0uZW1wdHkoKSB8fCAgbV9maWx0ZXJzWzBdID09IG1fbmFtZUFuZExvY2F0aW9uLm5hbWUgKSApCisgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRJbml0aWFsRmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICAgICAgaWYoICFmaWx0ZXJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFJvb3QgLSBzaG91bGQgbmV2ZXIgYmUgY29uc3VsdGVkCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLnB1c2hfYmFjaygiIik7IC8vIFRlc3QgQ2FzZSAtIG5vdCBhIHNlY3Rpb24gZmlsdGVyCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCBmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZE5leHRGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggZmlsdGVycy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksICsrZmlsdGVycy5iZWdpbigpLCBmaWx0ZXJzLmVuZCgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgSW5kZXhUcmFja2VyIDogcHVibGljIFRyYWNrZXJCYXNlIHsKKyAgICAgICAgaW50IG1fc2l6ZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgcHVibGljOgorICAgICAgICBJbmRleFRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50LCBpbnQgc2l6ZSApCisgICAgICAgIDogICBUcmFja2VyQmFzZSggbmFtZUFuZExvY2F0aW9uLCBjdHgsIHBhcmVudCApLAorICAgICAgICAgICAgbV9zaXplKCBzaXplICksCisgICAgICAgICAgICBtX2luZGV4KCAtMSApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgfkluZGV4VHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICBzdGF0aWMgSW5kZXhUcmFja2VyJiBhY3F1aXJlKCBUcmFja2VyQ29udGV4dCYgY3R4LCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgaW50IHNpemUgKSB7CisgICAgICAgICAgICBJbmRleFRyYWNrZXIqIHRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKKyAgICAgICAgICAgIGlmKCBJVHJhY2tlciogY2hpbGRUcmFja2VyID0gY3VycmVudFRyYWNrZXIuZmluZENoaWxkKCBuYW1lQW5kTG9jYXRpb24gKSApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc0luZGV4VHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IHN0YXRpY19jYXN0PEluZGV4VHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNrZXIgPSBuZXcgSW5kZXhUcmFja2VyKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgJmN1cnJlbnRUcmFja2VyLCBzaXplICk7CisgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrZXIuYWRkQ2hpbGQoIHRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSAmJiAhdHJhY2tlci0+aXNDb21wbGV0ZSgpICkgeworICAgICAgICAgICAgICAgIGlmKCB0cmFja2VyLT5tX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICYmIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gTmVlZHNBbm90aGVyUnVuICkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyLT5vcGVuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAqdHJhY2tlcjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgICAgICB2b2lkIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgbV9pbmRleCsrOworICAgICAgICAgICAgbV9jaGlsZHJlbi5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgVHJhY2tlckJhc2U6OmNsb3NlKCk7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHkgJiYgbV9pbmRleCA8IG1fc2l6ZS0xICkKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBJVHJhY2tlciYgVHJhY2tlckNvbnRleHQ6OnN0YXJ0UnVuKCkgeworICAgICAgICBtX3Jvb3RUcmFja2VyID0gbmV3IFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24oICJ7cm9vdH0iLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApLCAqdGhpcywgQ0FUQ0hfTlVMTCApOworICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgcmV0dXJuICptX3Jvb3RUcmFja2VyOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZworCit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlRyYWNrZXJDb250ZXh0OwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6U2VjdGlvblRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpJbmRleFRyYWNrZXI7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK0NBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9mYXRhbF9jb25kaXRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9GQVRBTF9DT05ESVRJT05fSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gUmVwb3J0IHRoZSBlcnJvciBjb25kaXRpb24KKyAgICBpbmxpbmUgdm9pZCByZXBvcnRGYXRhbCggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgIElDb250ZXh0JiBjb250ZXh0ID0gQ2F0Y2g6OmdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlID0gY29udGV4dC5nZXRSZXN1bHRDYXB0dXJlKCk7CisgICAgICAgIHJlc3VsdENhcHR1cmUtPmhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIG1lc3NhZ2UgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiBkZWZpbmVkICggQ0FUQ0hfUExBVEZPUk1fV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfd2luZG93c19oX3Byb3h5LmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lORE9XU19IX1BST1hZX0hfSU5DTFVERUQKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIGRlZmluZSBOT01JTk1BWAorI2VuZGlmCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKyNpZmRlZiBfX0FGWERMTAorI2luY2x1ZGUgPEFmeFdpbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVmIENBVENIX0RFRklORVNfTk9NSU5NQVgKKyMgIHVuZGVmIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisKKyMgIGlmICFkZWZpbmVkICggQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIICkKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggaXMgZGVmaW5lZAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeyBEV09SRCBpZDsgY29uc3QgY2hhciogbmFtZTsgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgLy8gVGhlcmUgaXMgbm8gMS0xIG1hcHBpbmcgYmV0d2VlbiBzaWduYWxzIGFuZCB3aW5kb3dzIGV4Y2VwdGlvbnMuCisgICAgLy8gV2luZG93cyBjYW4gZWFzaWx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gU08gYW5kIFNpZ1NlZ1YsCisgICAgLy8gYnV0IFNpZ0ludCwgU2lnVGVybSwgZXRjIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICB7IEVYQ0VQVElPTl9JTExFR0FMX0lOU1RSVUNUSU9OLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVywgIlNJR1NFR1YgLSBTdGFjayBvdmVyZmxvdyIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPLCAiRGl2aWRlIGJ5IHplcm8gZXJyb3IiIH0sCisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBMT05HIENBTExCQUNLIGhhbmRsZVZlY3RvcmVkRXhjZXB0aW9uKFBFWENFUFRJT05fUE9JTlRFUlMgRXhjZXB0aW9uSW5mbykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykgLyBzaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChFeGNlcHRpb25JbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGUgPT0gc2lnbmFsRGVmc1tpXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbChzaWduYWxEZWZzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGl0cyBub3QgYW4gZXhjZXB0aW9uIHdlIGNhcmUgYWJvdXQsIHBhc3MgaXQgYWxvbmcuCisgICAgICAgICAgICAvLyBUaGlzIHN0b3BzIHVzIGZyb20gZWF0aW5nIGRlYnVnZ2VyIGJyZWFrcyBldGMuCisgICAgICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIDMyayBzZWVtcyBlbm91Z2ggZm9yIENhdGNoIHRvIGhhbmRsZSBzdGFjayBvdmVyZmxvdywKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgdmFsdWUgd2FzIGZvdW5kIGV4cGVyaW1lbnRhbGx5LCBzbyB0aGVyZSBpcyBubyBzdHJvbmcgZ3VhcmFudGVlCisgICAgICAgICAgICBndWFyYW50ZWVTaXplID0gMzIgKiAxMDI0OworICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBhcyBmaXJzdCBoYW5kbGVyIGluIGN1cnJlbnQgY2hhaW4KKyAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24pOworICAgICAgICAgICAgLy8gUGFzcyBpbiBndWFyYW50ZWUgc2l6ZSB0byBiZSBmaWxsZWQKKyAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYgKGlzU2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBoYW5kbGVyIGFuZCByZXN0b3JlIHRoZSBvbGQgZ3VhcmFudGVlCisgICAgICAgICAgICAgICAgUmVtb3ZlVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUpOworICAgICAgICAgICAgICAgIFNldFRocmVhZFN0YWNrR3VhcmFudGVlKCZndWFyYW50ZWVTaXplKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgICAgICBpc1NldCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgYm9vbCBpc1NldDsKKyAgICAgICAgc3RhdGljIFVMT05HIGd1YXJhbnRlZVNpemU7CisgICAgICAgIHN0YXRpYyBQVk9JRCBleGNlcHRpb25IYW5kbGVySGFuZGxlOworICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBVTE9ORyBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Omd1YXJhbnRlZVNpemUgPSAwOworICAgIFBWT0lEIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6ZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAorCisjZWxzZSAvLyBOb3QgV2luZG93cyAtIGFzc3VtZWQgdG8gYmUgUE9TSVggY29tcGF0aWJsZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjICBpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKyAgICAgICAgdm9pZCByZXNldCgpIHt9CisgICAgfTsKK30KKworIyAgZWxzZSAvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyBpcyBkZWZpbmVkCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIH07CisgICAgZXh0ZXJuIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdOworICAgIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0geworICAgICAgICAgICAgeyBTSUdJTlQsICAiU0lHSU5UIC0gVGVybWluYWwgaW50ZXJydXB0IHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHSUxMLCAgIlNJR0lMTCAtIElsbGVnYWwgaW5zdHJ1Y3Rpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdGUEUsICAiU0lHRlBFIC0gRmxvYXRpbmcgcG9pbnQgZXJyb3Igc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdTRUdWLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdURVJNLCAiU0lHVEVSTSAtIFRlcm1pbmF0aW9uIHJlcXVlc3Qgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdBQlJULCAiU0lHQUJSVCAtIEFib3J0IChhYm5vcm1hbCB0ZXJtaW5hdGlvbikgc2lnbmFsIiB9CisgICAgfTsKKworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworCisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBvbGRTaWdBY3Rpb25zIFtzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXTsKKyAgICAgICAgc3RhdGljIHN0YWNrX3Qgb2xkU2lnU3RhY2s7CisgICAgICAgIHN0YXRpYyBjaGFyIGFsdFN0YWNrTWVtW1NJR1NUS1NaXTsKKworICAgICAgICBzdGF0aWMgdm9pZCBoYW5kbGVTaWduYWwoIGludCBzaWcgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gIjx1bmtub3duIHNpZ25hbD4iOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU2lnbmFsRGVmcyAmZGVmID0gc2lnbmFsRGVmc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnID09IGRlZi5pZCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGVmLm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICByZXBvcnRGYXRhbChuYW1lKTsKKyAgICAgICAgICAgIHJhaXNlKCBzaWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIGlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YWNrX3Qgc2lnU3RhY2s7CisgICAgICAgICAgICBzaWdTdGFjay5zc19zcCA9IGFsdFN0YWNrTWVtOworICAgICAgICAgICAgc2lnU3RhY2suc3Nfc2l6ZSA9IFNJR1NUS1NaOworICAgICAgICAgICAgc2lnU3RhY2suc3NfZmxhZ3MgPSAwOworICAgICAgICAgICAgc2lnYWx0c3RhY2soJnNpZ1N0YWNrLCAmb2xkU2lnU3RhY2spOworICAgICAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBzYSA9IHsgMCB9OworCisgICAgICAgICAgICBzYS5zYV9oYW5kbGVyID0gaGFuZGxlU2lnbmFsOworICAgICAgICAgICAgc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLOworICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIHNpZ2FjdGlvbihzaWduYWxEZWZzW2ldLmlkLCAmc2EsICZvbGRTaWdBY3Rpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIGlzU2V0ICkgeworICAgICAgICAgICAgICAgIC8vIFNldCBzaWduYWxzIGJhY2sgdG8gcHJldmlvdXMgdmFsdWVzIC0tIGhvcGVmdWxseSBub2JvZHkgb3Zlcndyb3RlIHRoZW0gaW4gdGhlIG1lYW50aW1lCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZvbGRTaWdBY3Rpb25zW2ldLCBDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBvbGQgc3RhY2sKKyAgICAgICAgICAgICAgICBzaWdhbHRzdGFjaygmb2xkU2lnU3RhY2ssIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgYm9vbCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmlzU2V0ID0gZmFsc2U7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Om9sZFNpZ0FjdGlvbnNbc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKV0gPSB7fTsKKyAgICBzdGFja190IEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnU3RhY2sgPSB7fTsKKyAgICBjaGFyIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6YWx0U3RhY2tNZW1bU0lHU1RLU1pdID0ge307CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyMgIGVuZGlmIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTCisKKyNlbmRpZiAvLyBub3QgV2luZG93cworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFN0cmVhbVJlZGlyZWN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RyZWFtUmVkaXJlY3QoIHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBzdGQ6OnN0cmluZyYgdGFyZ2V0U3RyaW5nICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCBzdHJlYW0gKSwKKyAgICAgICAgICAgIG1fcHJldkJ1Ziggc3RyZWFtLnJkYnVmKCkgKSwKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nKCB0YXJnZXRTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0ucmRidWYoIG1fb3NzLnJkYnVmKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIH5TdHJlYW1SZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIG1fdGFyZ2V0U3RyaW5nICs9IG1fb3NzLnN0cigpOworICAgICAgICAgICAgbV9zdHJlYW0ucmRidWYoIG1fcHJldkJ1ZiApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fc3RyZWFtOworICAgICAgICBzdGQ6OnN0cmVhbWJ1ZiogbV9wcmV2QnVmOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9vc3M7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBtX3RhcmdldFN0cmluZzsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBSdW5Db250ZXh0IDogcHVibGljIElSZXN1bHRDYXB0dXJlLCBwdWJsaWMgSVJ1bm5lciB7CisKKyAgICAgICAgUnVuQ29udGV4dCggUnVuQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvciA9KCBSdW5Db250ZXh0IGNvbnN0JiApOworCisgICAgcHVibGljOgorCisgICAgICAgIGV4cGxpY2l0IFJ1bkNvbnRleHQoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2NvbmZpZywgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIHJlcG9ydGVyICkKKyAgICAgICAgOiAgIG1fcnVuSW5mbyggX2NvbmZpZy0+bmFtZSgpICksCisgICAgICAgICAgICBtX2NvbnRleHQoIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpICksCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlKCBDQVRDSF9OVUxMICksCisgICAgICAgICAgICBtX2NvbmZpZyggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9yZXBvcnRlciggcmVwb3J0ZXIgKSwKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCAoIHRydWUgKQorICAgICAgICB7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UnVubmVyKCB0aGlzICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0Q29uZmlnKCBtX2NvbmZpZyApOworICAgICAgICAgICAgbV9jb250ZXh0LnNldFJlc3VsdENhcHR1cmUoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5TdGFydGluZyggbV9ydW5JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5SdW5Db250ZXh0KCkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGFib3J0aW5nKCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8oIHRlc3RTcGVjLCBncm91cEluZGV4LCBncm91cHNDb3VudCApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB0ZXN0R3JvdXBFbmRlZCggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzaXplX3QgZ3JvdXBJbmRleCwgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnQgKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICksIHRvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMgcnVuVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlICkgeworICAgICAgICAgICAgVG90YWxzIHByZXZUb3RhbHMgPSBtX3RvdGFsczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENvdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ2VycjsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlU3RhcnRpbmcoIHRlc3RJbmZvICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSAmdGVzdENhc2U7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBJVHJhY2tlciYgcm9vdFRyYWNrZXIgPSBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0UnVuKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCByb290VHJhY2tlci5pc1NlY3Rpb25UcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlciY+KCByb290VHJhY2tlciApLmFkZEluaXRpYWxGaWx0ZXJzKCBtX2NvbmZpZy0+Z2V0U2VjdGlvbnNUb1J1bigpICk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0Q3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSAmU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIG1fdHJhY2tlckNvbnRleHQsIFRlc3RDYXNlVHJhY2tpbmc6Ok5hbWVBbmRMb2NhdGlvbiggdGVzdEluZm8ubmFtZSwgdGVzdEluZm8ubGluZUluZm8gKSApOworICAgICAgICAgICAgICAgICAgICBydW5DdXJyZW50VGVzdCggcmVkaXJlY3RlZENvdXQsIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCAhbV90ZXN0Q2FzZVRyYWNrZXItPmlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgJiYgIWFib3J0aW5nKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICFUQkQ6IGRlcHJlY2F0ZWQgLSB0aGlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgaW5kZXhlZCB0cmFja2VycworICAgICAgICAgICAgd2hpbGUoIGdldEN1cnJlbnRDb250ZXh0KCkuYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpICYmICFhYm9ydGluZygpICk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFscyA9IG1fdG90YWxzLmRlbHRhKCBwcmV2VG90YWxzICk7CisgICAgICAgICAgICBpZiggdGVzdEluZm8uZXhwZWN0ZWRUb0ZhaWwoKSAmJiBkZWx0YVRvdGFscy50ZXN0Q2FzZXMucGFzc2VkID4gMCApIHsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQtLTsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMgKz0gZGVsdGFUb3RhbHMudGVzdENhc2VzOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRpbmcoKSApICk7CisKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIgPSBDQVRDSF9OVUxMOworCisgICAgICAgICAgICByZXR1cm4gZGVsdGFUb3RhbHM7CisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwcml2YXRlOiAvLyBJUmVzdWx0Q2FwdHVyZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMucGFzc2VkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vIHVzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAod2hldGhlciBtZXNzYWdlcyBzaG91bGQgYmUgY2xlYXJlZCksIGJlY2F1c2UgbWVzc2FnZXMgd2VyZSBtYWRlIHNjb3BlZAorICAgICAgICAgICAgLy8gYW5kIHNob3VsZCBiZSBsZXQgdG8gY2xlYXIgdGhlbXNlbHZlcyBvdXQuCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihtX3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyhyZXN1bHQsIG1fbWVzc2FnZXMsIG1fdG90YWxzKSkpOworCisgICAgICAgICAgICAvLyBSZXNldCB3b3JraW5nIHN0YXRlCisgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggc3RkOjpzdHJpbmcoKSwgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywgIntVbmtub3duIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIHJlcG9ydGVkIGxpbmV9IiAsIG1fbGFzdEFzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICAgICAgICAgIG1fbGFzdFJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBzZWN0aW9uU3RhcnRlZCAoCisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJhY2tlciYgc2VjdGlvblRyYWNrZXIgPSBTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICBpZiggIXNlY3Rpb25UcmFja2VyLmlzT3BlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnB1c2hfYmFjayggJnNlY3Rpb25UcmFja2VyICk7CisKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8gPSBzZWN0aW9uSW5mby5saW5lSW5mbzsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworCisgICAgICAgICAgICBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIENvdW50cyYgYXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25zLnRvdGFsKCkgIT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+d2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYoIG1fdHJhY2tlckNvbnRleHQuY3VycmVudFRyYWNrZXIoKS5oYXNDaGlsZHJlbigpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBlbmRJbmZvLnByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggIW1fYWN0aXZlU2VjdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzKCBlbmRJbmZvLnNlY3Rpb25JbmZvLCBhc3NlcnRpb25zLCBlbmRJbmZvLmR1cmF0aW9uSW5TZWNvbmRzLCBtaXNzaW5nQXNzZXJ0aW9ucyApICk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgeworICAgICAgICAgICAgaWYoIG1fdW5maW5pc2hlZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5mYWlsKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmNsb3NlKCk7CisgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7CisKKyAgICAgICAgICAgIG1fdW5maW5pc2hlZFNlY3Rpb25zLnB1c2hfYmFjayggZW5kSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMucHVzaF9iYWNrKCBtZXNzYWdlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmVyYXNlKCBzdGQ6OnJlbW92ZSggbV9tZXNzYWdlcy5iZWdpbigpLCBtX21lc3NhZ2VzLmVuZCgpLCBtZXNzYWdlICksIG1fbWVzc2FnZXMuZW5kKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fYWN0aXZlVGVzdENhc2UKKyAgICAgICAgICAgICAgICA/IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpLm5hbWUKKyAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAmbV9sYXN0UmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKSB7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIC8vIERvbid0IHJlYnVpbGQgdGhlIHJlc3VsdCAtLSB0aGUgc3RyaW5naWZpY2F0aW9uIGl0c2VsZiBjYW4gY2F1c2UgbW9yZSBmYXRhbCBlcnJvcnMKKyAgICAgICAgICAgIC8vIEluc3RlYWQsIGZha2UgYSByZXN1bHQgZGF0YS4KKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgdGVtcFJlc3VsdDsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjsKKyAgICAgICAgICAgIHRlbXBSZXN1bHQubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0KG1fbGFzdEFzc2VydGlvbkluZm8sIHRlbXBSZXN1bHQpOworCisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQocmVzdWx0KTsKKworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisKKyAgICAgICAgICAgIC8vIFJlY3JlYXRlIHNlY3Rpb24gZm9yIHRlc3QgY2FzZSAoYXMgd2Ugd2lsbCBsb3NlIHRoZSBvbmUgdGhhdCB3YXMgaW4gc2NvcGUpCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHRlc3RDYXNlSW5mby5uYW1lLCB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb24gKTsKKworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggdGVzdENhc2VTZWN0aW9uU3RhdHMgKTsKKworICAgICAgICAgICAgVGVzdENhc2VJbmZvIHRlc3RJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisKKyAgICAgICAgICAgIFRvdGFscyBkZWx0YVRvdGFsczsKKyAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPSAxOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyggICB0ZXN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICkgKTsKKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZygpLCBtX3RvdGFscywgMSwgMSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMoIG1fcnVuSW5mbywgbV90b3RhbHMsIGZhbHNlICkgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICAvLyAhVEJEIFdlIG5lZWQgdG8gZG8gdGhpcyBhbm90aGVyIHdheSEKKyAgICAgICAgYm9vbCBhYm9ydGluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIG1fY29uZmlnLT5hYm9ydEFmdGVyKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICB2b2lkIHJ1bkN1cnJlbnRUZXN0KCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ2VyciApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvblN0YXJ0aW5nKCB0ZXN0Q2FzZVNlY3Rpb24gKTsKKyAgICAgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkb3VibGUgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IEFzc2VydGlvbkluZm8oICJURVNUX0NBU0UiLCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHN0ZDo6c3RyaW5nKCksIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgVGltZXIgdGltZXI7CisgICAgICAgICAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiggbV9yZXBvcnRlci0+Z2V0UHJlZmVyZW5jZXMoKS5zaG91bGRSZWRpcmVjdFN0ZE91dCApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVkaXJlY3QgY291dFJlZGlyKCBDYXRjaDo6Y291dCgpLCByZWRpcmVjdGVkQ291dCApOworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjZXJyUmVkaXIoIENhdGNoOjpjZXJyKCksIHJlZGlyZWN0ZWRDZXJyICk7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMganVzdCBtZWFucyB0aGUgdGVzdCB3YXMgYWJvcnRlZCBkdWUgdG8gZmFpbHVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgLy8gVW5kZXIgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSwgdW5leHBlY3RlZCBleGNlcHRpb25zIHVuZGVyIFJFUVVJUkUgYXNzZXJ0aW9ucworICAgICAgICAgICAgICAgIC8vIGFyZSByZXBvcnRlZCB3aXRob3V0IHRyYW5zbGF0aW9uIGF0IHRoZSBwb2ludCBvZiBvcmlnaW4uCisgICAgICAgICAgICAgICAgaWYgKG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKS51c2VBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlci0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworICAgICAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigpOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnMgLSBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIGFzc2VydGlvbnMgKTsKKworICAgICAgICAgICAgaWYoIHRlc3RDYXNlSW5mby5va1RvRmFpbCgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3dhcCggYXNzZXJ0aW9ucy5mYWlsZWRCdXRPaywgYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZCAtPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKz0gYXNzZXJ0aW9ucy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHRlc3RDYXNlU2VjdGlvblN0YXRzKCB0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIGR1cmF0aW9uLCBtaXNzaW5nQXNzZXJ0aW9ucyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpIHsKKyAgICAgICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlciBmYXRhbENvbmRpdGlvbkhhbmRsZXI7IC8vIEhhbmRsZSBzaWduYWxzCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlLT5pbnZva2UoKTsKKyAgICAgICAgICAgIGZhdGFsQ29uZGl0aW9uSGFuZGxlci5yZXNldCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIFJlc3VsdEJ1aWxkZXIgbWFrZVVuZXhwZWN0ZWRSZXN1bHRCdWlsZGVyKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdEJ1aWxkZXIoICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5tYWNyb05hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBJZiBzZWN0aW9ucyBlbmRlZCBwcmVtYXR1cmVseSBkdWUgdG8gYW4gZXhjZXB0aW9uIHdlIHN0b3JlZCB0aGVpcgorICAgICAgICAgICAgLy8gaW5mb3MgaGVyZSBzbyB3ZSBjYW4gdGVhciB0aGVtIGRvd24gb3V0c2lkZSB0aGUgdW53aW5kIHByb2Nlc3MuCisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX3VuZmluaXNoZWRTZWN0aW9ucy5yZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBzZWN0aW9uRW5kZWQoICppdCApOworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RSdW5JbmZvIG1fcnVuSW5mbzsKKyAgICAgICAgSU11dGFibGVDb250ZXh0JiBtX2NvbnRleHQ7CisgICAgICAgIFRlc3RDYXNlIGNvbnN0KiBtX2FjdGl2ZVRlc3RDYXNlOworICAgICAgICBJVHJhY2tlciogbV90ZXN0Q2FzZVRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRTZWN0aW9uVHJhY2tlcjsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IG1fbGFzdFJlc3VsdDsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIFRvdGFscyBtX3RvdGFsczsKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gbV9yZXBvcnRlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1fbWVzc2FnZXM7CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9sYXN0QXNzZXJ0aW9uSW5mbzsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+IG1fdW5maW5pc2hlZFNlY3Rpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxJVHJhY2tlcio+IG1fYWN0aXZlU2VjdGlvbnM7CisgICAgICAgIFRyYWNrZXJDb250ZXh0IG1fdHJhY2tlckNvbnRleHQ7CisgICAgICAgIGJvb2wgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkOworICAgIH07CisKKyAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgaWYoIElSZXN1bHRDYXB0dXJlKiBjYXB0dXJlID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCkgKQorICAgICAgICAgICAgcmV0dXJuICpjYXB0dXJlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiTm8gcmVzdWx0IGNhcHR1cmUgaW5zdGFuY2UiICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3ZlcnNpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBWZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgICAgc3RydWN0IFZlcnNpb24geworICAgICAgICBWZXJzaW9uKCAgICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApOworCisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtYWpvclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBtaW5vclZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBwYXRjaE51bWJlcjsKKworICAgICAgICAvLyBidWlsZE51bWJlciBpcyBvbmx5IHVzZWQgaWYgYnJhbmNoTmFtZSBpcyBub3QgbnVsbAorICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgYnJhbmNoTmFtZTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IGJ1aWxkTnVtYmVyOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFZlcnNpb24gY29uc3QmICk7CisgICAgfTsKKworICAgIGlubGluZSBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKCk7Cit9CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNyZWF0ZVJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwb3J0ZXJOYW1lLCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlciA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmNyZWF0ZSggcmVwb3J0ZXJOYW1lLCBjb25maWcuZ2V0KCkgKTsKKyAgICAgICAgaWYoICFyZXBvcnRlciApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIk5vIHJlcG9ydGVyIHJlZ2lzdGVyZWQgd2l0aCBuYW1lOiAnIiA8PCByZXBvcnRlck5hbWUgPDwgIiciOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICB9CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtYWtlUmVwb3J0ZXIoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXBvcnRlcnMgPSBjb25maWctPmdldFJlcG9ydGVyTmFtZXMoKTsKKyAgICAgICAgaWYoIHJlcG9ydGVycy5lbXB0eSgpICkKKyAgICAgICAgICAgIHJlcG9ydGVycy5wdXNoX2JhY2soICJjb25zb2xlIiApOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSByZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlciA9IGFkZFJlcG9ydGVyKCByZXBvcnRlciwgY3JlYXRlUmVwb3J0ZXIoICppdCwgY29uZmlnICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRMaXN0ZW5lcnMoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlcnMgKSB7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpMaXN0ZW5lcnMgbGlzdGVuZXJzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgIGZvciggSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0ZW5lcnMuYmVnaW4oKSwgaXRFbmQgPSBsaXN0ZW5lcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICByZXBvcnRlcnMgPSBhZGRSZXBvcnRlcihyZXBvcnRlcnMsICgqaXQpLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApICk7CisgICAgICAgIHJldHVybiByZXBvcnRlcnM7CisgICAgfQorCisgICAgVG90YWxzIHJ1blRlc3RzKCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBpY29uZmlnID0gY29uZmlnLmdldCgpOworCisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gbWFrZVJlcG9ydGVyKCBjb25maWcgKTsKKyAgICAgICAgcmVwb3J0ZXIgPSBhZGRMaXN0ZW5lcnMoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgUnVuQ29udGV4dCBjb250ZXh0KCBpY29uZmlnLCByZXBvcnRlciApOworCisgICAgICAgIFRvdGFscyB0b3RhbHM7CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBTdGFydGluZyggY29uZmlnLT5uYW1lKCksIDEsIDEgKTsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy0+dGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICF0ZXN0U3BlYy5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICJ+Wy5dIiApLnRlc3RTcGVjKCk7IC8vIEFsbCBub3QgaGlkZGVuIHRlc3RzCisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBhbGxUZXN0Q2FzZXMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoICppY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFsbFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IGFsbFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgaWYoICFjb250ZXh0LmFib3J0aW5nKCkgJiYgbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCAqaWNvbmZpZyApICkKKyAgICAgICAgICAgICAgICB0b3RhbHMgKz0gY29udGV4dC5ydW5UZXN0KCAqaXQgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXBvcnRlci0+c2tpcFRlc3QoICppdCApOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC50ZXN0R3JvdXBFbmRlZCggaWNvbmZpZy0+bmFtZSgpLCB0b3RhbHMsIDEsIDEgKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsczsKKyAgICB9CisKKyAgICB2b2lkIGFwcGx5RmlsZW5hbWVzQXNUYWdzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdHMgPSBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApOworICAgICAgICBmb3Ioc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0ZXN0cy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlJiB0ZXN0ID0gY29uc3RfY2FzdDxUZXN0Q2FzZSY+KCB0ZXN0c1tpXSApOworICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3MgPSB0ZXN0LnRhZ3M7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gdGVzdC5saW5lSW5mby5maWxlOworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0U2xhc2ggPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICJcXC8iICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0RG90ID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCAiLiIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0RG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0ciggMCwgbGFzdERvdCApOworCisgICAgICAgICAgICB0YWdzLmluc2VydCggIiMiICsgZmlsZW5hbWUgKTsKKyAgICAgICAgICAgIHNldFRhZ3MoIHRlc3QsIHRhZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIFNlc3Npb24gOiBOb25Db3B5YWJsZSB7CisgICAgICAgIHN0YXRpYyBib29sIGFscmVhZHlJbnN0YW50aWF0ZWQ7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RydWN0IE9uVW51c2VkT3B0aW9ucyB7IGVudW0gRG9XaGF0IHsgSWdub3JlLCBGYWlsIH07IH07CisKKyAgICAgICAgU2Vzc2lvbigpCisgICAgICAgIDogbV9jbGkoIG1ha2VDb21tYW5kTGluZVBhcnNlcigpICkgeworICAgICAgICAgICAgaWYoIGFscmVhZHlJbnN0YW50aWF0ZWQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk9ubHkgb25lIGluc3RhbmNlIG9mIENhdGNoOjpTZXNzaW9uIGNhbiBldmVyIGJlIHVzZWQiOworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBtc2cgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFscmVhZHlJbnN0YW50aWF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIH5TZXNzaW9uKCkgeworICAgICAgICAgICAgQ2F0Y2g6OmNsZWFuVXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2hvd0hlbHAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jZXNzTmFtZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIlxuQ2F0Y2ggdiIgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiXG4iOworCisgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkZvciBtb3JlIGRldGFpbCB1c2FnZSBwbGVhc2Ugc2VlIHRoZSBwcm9qZWN0IGRvY3NcbiIgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW50IGFwcGx5Q29tbWFuZExpbmUoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiwgT25VbnVzZWRPcHRpb25zOjpEb1doYXQgdW51c2VkT3B0aW9uQmVoYXZpb3VyID0gT25VbnVzZWRPcHRpb25zOjpGYWlsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2NsaS5zZXRUaHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPT0gT25VbnVzZWRPcHRpb25zOjpGYWlsICk7CisgICAgICAgICAgICAgICAgbV91bnVzZWRUb2tlbnMgPSBtX2NsaS5wYXJzZUludG8oIENsYXJhOjphcmdzVG9WZWN0b3IoIGFyZ2MsIGFyZ3YgKSwgbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgICAgIHNob3dIZWxwKCBtX2NvbmZpZ0RhdGEucHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpSZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuRXJyb3IocykgaW4gaW5wdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBUZXh0KCBleC53aGF0KCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcblxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9jbGkudXNhZ2UoIENhdGNoOjpjb3V0KCksIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNlQ29uZmlnRGF0YSggQ29uZmlnRGF0YSBjb25zdCYgX2NvbmZpZ0RhdGEgKSB7CisgICAgICAgICAgICBtX2NvbmZpZ0RhdGEgPSBfY29uZmlnRGF0YTsKKyAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcnVuKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gYXBwbHlDb21tYW5kTGluZSggYXJnYywgYXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKworICAgICNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKFVOSUNPREUpCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCB3Y2hhcl90IGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgY2hhciAqKnV0ZjhBcmd2ID0gbmV3IGNoYXIgKlsgYXJnYyBdOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaW50IGJ1ZlNpemUgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgTlVMTCwgMCwgTlVMTCwgTlVMTCApOworCisgICAgICAgICAgICAgICAgdXRmOEFyZ3ZbIGkgXSA9IG5ldyBjaGFyWyBidWZTaXplIF07CisKKyAgICAgICAgICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKCBDUF9VVEY4LCAwLCBhcmd2W2ldLCAtMSwgdXRmOEFyZ3ZbaV0sIGJ1ZlNpemUsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCB1dGY4QXJndiApOworICAgICAgICAgICAgaWYoIHJldHVybkNvZGUgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSA9IHJ1bigpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndlsgaSBdOworCisgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3Y7CisKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICAgICAgaW50IHJ1bigpIHsKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWcoKTsgLy8gRm9yY2UgY29uZmlnIHRvIGJlIGNvbnN0cnVjdGVkCisKKyAgICAgICAgICAgICAgICBzZWVkUm5nKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuZmlsZW5hbWVzQXNUYWdzICkKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGxpc3QgcmVxdWVzdAorICAgICAgICAgICAgICAgIGlmKCBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZCA9IGxpc3QoIGNvbmZpZygpICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggKmxpc3RlZCApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oIHJ1blRlc3RzKCBtX2NvbmZpZyApLmFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgZXgud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IGNvbnN0JiBjbGkoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jbGk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IGNvbnN0JiB1bnVzZWRUb2tlbnMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSYgY29uZmlnRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZ0RhdGE7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnJiBjb25maWcoKSB7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnICkKKyAgICAgICAgICAgICAgICBtX2NvbmZpZyA9IG5ldyBDb25maWcoIG1fY29uZmlnRGF0YSApOworICAgICAgICAgICAgcmV0dXJuICptX2NvbmZpZzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtX2NsaTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2xhcmE6OlBhcnNlcjo6VG9rZW4+IG1fdW51c2VkVG9rZW5zOworICAgICAgICBDb25maWdEYXRhIG1fY29uZmlnRGF0YTsKKyAgICAgICAgUHRyPENvbmZpZz4gbV9jb25maWc7CisgICAgfTsKKworICAgIGJvb2wgU2Vzc2lvbjo6YWxyZWFkeUluc3RhbnRpYXRlZCA9IGZhbHNlOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZ2lzdHJ5X2h1Yi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFR0lTVFJZX0hVQl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9yZWdpc3RyeV9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX1JFR0lTVFJZX0lNUExfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFJhbmRvbU51bWJlckdlbmVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgcmVzdWx0X3R5cGU7CisKKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSggcmVzdWx0X3R5cGUgbiApIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cmFuZCgpICUgbjsgfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtaW4oKSB7IHJldHVybiAwOyB9CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gMTAwMDAwMDsgfQorICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBtYXgoKTsgfQorI2VuZGlmCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+CisgICAgICAgIHN0YXRpYyB2b2lkIHNodWZmbGUoIFYmIHZlY3RvciApIHsKKyAgICAgICAgICAgIFJhbmRvbU51bWJlckdlbmVyYXRvciBybmc7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUKKyAgICAgICAgICAgIHN0ZDo6c2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjpyYW5kb21fc2h1ZmZsZSggdmVjdG9yLmJlZ2luKCksIHZlY3Rvci5lbmQoKSwgcm5nICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRUZXN0cyggSUNvbmZpZyBjb25zdCYgY29uZmlnLCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHVuc29ydGVkVGVzdENhc2VzICkgeworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0ZWQgPSB1bnNvcnRlZFRlc3RDYXNlczsKKworICAgICAgICBzd2l0Y2goIGNvbmZpZy5ydW5PcmRlcigpICkgeworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjoKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQoIHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWVkUm5nKCBjb25maWcgKTsKKyAgICAgICAgICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yOjpzaHVmZmxlKCBzb3J0ZWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI6CisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbiBkZWNsYXJhdGlvbiBvcmRlcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzb3J0ZWQ7CisgICAgfQorICAgIGJvb2wgbWF0Y2hUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gdGVzdFNwZWMubWF0Y2hlcyggdGVzdENhc2UgKSAmJiAoIGNvbmZpZy5hbGxvd1Rocm93cygpIHx8ICF0ZXN0Q2FzZS50aHJvd3MoKSApOworICAgIH0KKworICAgIHZvaWQgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGZ1bmN0aW9ucyApIHsKKyAgICAgICAgc3RkOjpzZXQ8VGVzdENhc2U+IHNlZW5GdW5jdGlvbnM7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5iZWdpbigpLCBpdEVuZCA9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxzdGQ6OnNldDxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yLCBib29sPiBwcmV2ID0gc2VlbkZ1bmN0aW9ucy5pbnNlcnQoICppdCApOworICAgICAgICAgICAgaWYoICFwcmV2LnNlY29uZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisKKyAgICAgICAgICAgICAgICBzcyAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogVEVTVF9DQVNFKCBcIiIgPDwgaXQtPm5hbWUgPDwgIlwiICkgYWxyZWFkeSBkZWZpbmVkLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIgPDwgcHJldi5maXJzdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgICAgICA8PCAiXHRSZWRlZmluZWQgYXQgIiA8PCBpdC0+Z2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gPDwgc3RkOjplbmRsOworCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyZWQ7CisgICAgICAgIGZpbHRlcmVkLnJlc2VydmUoIHRlc3RDYXNlcy5zaXplKCkgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gdGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgaWYoIG1hdGNoVGVzdCggKml0LCB0ZXN0U3BlYywgY29uZmlnICkgKQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLnB1c2hfYmFjayggKml0ICk7CisgICAgICAgIHJldHVybiBmaWx0ZXJlZDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGVzdENhc2VSZWdpc3RyeSgpLmdldEFsbFRlc3RzU29ydGVkKCBjb25maWcgKTsKKyAgICB9CisKKyAgICBjbGFzcyBUZXN0UmVnaXN0cnkgOiBwdWJsaWMgSVRlc3RDYXNlUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGVzdFJlZ2lzdHJ5KCkKKyAgICAgICAgOiAgIG1fY3VycmVudFNvcnRPcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgbV91bm5hbWVkQ291bnQoIDAgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCkubmFtZTsKKyAgICAgICAgICAgIGlmKCBuYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgIkFub255bW91cyB0ZXN0IGNhc2UgIiA8PCArK21fdW5uYW1lZENvdW50OworICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RlclRlc3QoIHRlc3RDYXNlLndpdGhOYW1lKCBvc3Muc3RyKCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9mdW5jdGlvbnMucHVzaF9iYWNrKCB0ZXN0Q2FzZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZnVuY3Rpb25zOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgaWYoIG1fc29ydGVkRnVuY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggbV9mdW5jdGlvbnMgKTsKKworICAgICAgICAgICAgaWYoICBtX2N1cnJlbnRTb3J0T3JkZXIgIT0gY29uZmlnLnJ1bk9yZGVyKCkgfHwgbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX3NvcnRlZEZ1bmN0aW9ucyA9IHNvcnRUZXN0cyggY29uZmlnLCBtX2Z1bmN0aW9ucyApOworICAgICAgICAgICAgICAgIG1fY3VycmVudFNvcnRPcmRlciA9IGNvbmZpZy5ydW5PcmRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1fc29ydGVkRnVuY3Rpb25zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9mdW5jdGlvbnM7CisgICAgICAgIG11dGFibGUgUnVuVGVzdHM6OkluV2hhdE9yZGVyIG1fY3VycmVudFNvcnRPcmRlcjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIHNpemVfdCBtX3VubmFtZWRDb3VudDsKKyAgICAgICAgc3RkOjppb3NfYmFzZTo6SW5pdCBtX29zdHJlYW1Jbml0OyAvLyBGb3JjZXMgY291dC8gY2VyciB0byBiZSBpbml0aWFsaXNlZAorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIEZyZWVGdW5jdGlvblRlc3RDYXNlIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisgICAgcHVibGljOgorCisgICAgICAgIEZyZWVGdW5jdGlvblRlc3RDYXNlKCBUZXN0RnVuY3Rpb24gZnVuICkgOiBtX2Z1biggZnVuICkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlKCkgY29uc3QgeworICAgICAgICAgICAgbV9mdW4oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+RnJlZUZ1bmN0aW9uVGVzdENhc2UoKTsKKworICAgICAgICBUZXN0RnVuY3Rpb24gbV9mdW47CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lOworICAgICAgICBpZiggc3RhcnRzV2l0aCggY2xhc3NOYW1lLCAnJicgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIgKTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBlbnVsdGltYXRlQ29sb25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiLCBsYXN0Q29sb25zLTEgKTsKKyAgICAgICAgICAgIGlmKCBwZW51bHRpbWF0ZUNvbG9ucyA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcGVudWx0aW1hdGVDb2xvbnMgPSAxOworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0ciggcGVudWx0aW1hdGVDb2xvbnMsIGxhc3RDb2xvbnMtcGVudWx0aW1hdGVDb2xvbnMgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGVzdAorICAgICAgICAgICAgKCBtYWtlVGVzdENhc2UKKyAgICAgICAgICAgICAgICAoICAgdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RDbGFzc05hbWUoIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICksCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmREZXNjLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyApICk7CisgICAgfQorICAgIHZvaWQgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UoIG5ldyBGcmVlRnVuY3Rpb25UZXN0Q2FzZSggZnVuY3Rpb24gKSwgIiIsIG5hbWVBbmREZXNjLCBsaW5lSW5mbyApOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQXV0b1JlZzo6QXV0b1JlZworICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICkgeworICAgICAgICByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24oIGZ1bmN0aW9uLCBsaW5lSW5mbywgbmFtZUFuZERlc2MgKTsKKyAgICB9CisKKyAgICBBdXRvUmVnOjp+QXV0b1JlZygpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cnkgOiBwdWJsaWMgSVJlcG9ydGVyUmVnaXN0cnkgeworCisgICAgcHVibGljOgorCisgICAgICAgIHZpcnR1YWwgflJlcG9ydGVyUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gIG1fZmFjdG9yaWVzLmZpbmQoIG5hbWUgKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2ZhY3Rvcmllcy5lbmQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIENBVENIX05VTEw7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIHsKKyAgICAgICAgICAgIG1fZmFjdG9yaWVzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIG5hbWUsIGZhY3RvcnkgKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9saXN0ZW5lcnMucHVzaF9iYWNrKCBmYWN0b3J5ICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX2ZhY3RvcmllczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbGlzdGVuZXJzOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBGYWN0b3J5TWFwIG1fZmFjdG9yaWVzOworICAgICAgICBMaXN0ZW5lcnMgbV9saXN0ZW5lcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V4Y2VwdGlvbl90cmFuc2xhdG9yX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVhDRVBUSU9OX1RSQU5TTEFUT1JfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX09CSkNfXworI2ltcG9ydCAiRm91bmRhdGlvbi9Gb3VuZGF0aW9uLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSA6IHB1YmxpYyBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5FeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fdHJhbnNsYXRvcnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgeworICAgICAgICAgICAgbV90cmFuc2xhdG9ycy5wdXNoX2JhY2soIHRyYW5zbGF0b3IgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgdHJ5IHsKKyNpZmRlZiBfX09CSkNfXworICAgICAgICAgICAgICAgIC8vIEluIE9iamVjdGl2ZS1DIHRyeSBvYmplY3RpdmUtYyBleGNlcHRpb25zIGZpcnN0CisgICAgICAgICAgICAgICAgQHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggW2V4Y2VwdGlvbiBkZXNjcmlwdGlvbl0gKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggVGVzdEZhaWx1cmVFeGNlcHRpb24mICkgeworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXgud2hhdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6c3RyaW5nJiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBjb25zdCBjaGFyKiBtc2cgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBleGNlcHRpb24iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV90cmFuc2xhdG9ycy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdG9yc1swXS0+dHJhbnNsYXRlKCBtX3RyYW5zbGF0b3JzLmJlZ2luKCkrMSwgbV90cmFuc2xhdG9ycy5lbmQoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IG1fdHJhbnNsYXRvcnM7CisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGFnQWxpYXNSZWdpc3RyeSA6IHB1YmxpYyBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5UYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3Q7CisgICAgICAgIHZvaWQgYWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPiBtX3JlZ2lzdHJ5OworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBjbGFzcyBSZWdpc3RyeUh1YiA6IHB1YmxpYyBJUmVnaXN0cnlIdWIsIHB1YmxpYyBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKKworICAgICAgICAgICAgUmVnaXN0cnlIdWIoIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFJlZ2lzdHJ5SHViIGNvbnN0JiApOworCisgICAgICAgIHB1YmxpYzogLy8gSVJlZ2lzdHJ5SHViCisgICAgICAgICAgICBSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnkoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwdWJsaWM6IC8vIElNdXRhYmxlUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fcmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKCBmYWN0b3J5ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVJlZ2lzdHJ5LnJlZ2lzdGVyVGVzdCggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyVHJhbnNsYXRvciggdHJhbnNsYXRvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fdGFnQWxpYXNSZWdpc3RyeS5hZGQoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIFRlc3RSZWdpc3RyeSBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICBSZXBvcnRlclJlZ2lzdHJ5IG1fcmVwb3J0ZXJSZWdpc3RyeTsKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICAgICAgICAgIFRhZ0FsaWFzUmVnaXN0cnkgbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICB9OworCisgICAgICAgIC8vIFNpbmdsZSwgZ2xvYmFsLCBpbnN0YW5jZQorICAgICAgICBpbmxpbmUgUmVnaXN0cnlIdWIqJiBnZXRUaGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgICAgIHN0YXRpYyBSZWdpc3RyeUh1YiogdGhlUmVnaXN0cnlIdWIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgaWYoICF0aGVSZWdpc3RyeUh1YiApCisgICAgICAgICAgICAgICAgdGhlUmVnaXN0cnlIdWIgPSBuZXcgUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGVSZWdpc3RyeUh1YjsKKyAgICAgICAgfQorICAgIH0KKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgSU11dGFibGVSZWdpc3RyeUh1YiYgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICByZXR1cm4gKmdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgfQorICAgIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgZGVsZXRlIGdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIGdldFRoZVJlZ2lzdHJ5SHViKCkgPSBDQVRDSF9OVUxMOworICAgICAgICBjbGVhblVwQ29udGV4dCgpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpLnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9ub3RpbXBsZW1lbnRlZF9leGNlcHRpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9OT1RJTVBMRU1FTlRFRF9FWENFUFRJT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb246Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKQorICAgIDogICBtX2xpbmVJbmZvKCBsaW5lSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxpbmVJbmZvIDw8ICI6IGZ1bmN0aW9uICI7CisgICAgICAgIG9zcyA8PCAibm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgbV93aGF0ID0gb3NzLnN0cigpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgQ0FUQ0hfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gbV93aGF0LmNfc3RyKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnRleHRfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBXcml0ZXJGLCBzaXplX3QgYnVmZmVyU2l6ZT0yNTY+CisgICAgY2xhc3MgU3RyZWFtQnVmSW1wbCA6IHB1YmxpYyBTdHJlYW1CdWZCYXNlIHsKKyAgICAgICAgY2hhciBkYXRhW2J1ZmZlclNpemVdOworICAgICAgICBXcml0ZXJGIG1fd3JpdGVyOworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1CdWZJbXBsKCkgeworICAgICAgICAgICAgc2V0cCggZGF0YSwgZGF0YSArIHNpemVvZihkYXRhKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbUJ1ZkltcGwoKSBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgICAgICBzeW5jKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludCBvdmVyZmxvdyggaW50IGMgKSB7CisgICAgICAgICAgICBzeW5jKCk7CisKKyAgICAgICAgICAgIGlmKCBjICE9IEVPRiApIHsKKyAgICAgICAgICAgICAgICBpZiggcGJhc2UoKSA9PSBlcHB0cigpICkKKyAgICAgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCAxLCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICkgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwdXRjKCBzdGF0aWNfY2FzdDxjaGFyPiggYyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzeW5jKCkgeworICAgICAgICAgICAgaWYoIHBiYXNlKCkgIT0gcHB0cigpICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyKCBzdGQ6OnN0cmluZyggcGJhc2UoKSwgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc6OnNpemVfdHlwZT4oIHBwdHIoKSAtIHBiYXNlKCkgKSApICk7CisgICAgICAgICAgICAgICAgc2V0cCggcGJhc2UoKSwgZXBwdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKSB7CisgICAgICAgIG1fb2ZzLm9wZW4oIGZpbGVuYW1lLmNfc3RyKCkgKTsKKyAgICAgICAgaWYoIG1fb2ZzLmZhaWwoKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIlVuYWJsZSB0byBvcGVuIGZpbGU6ICciIDw8IGZpbGVuYW1lIDw8ICdcJyc7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIEZpbGVTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZzOworICAgIH0KKworICAgIHN0cnVjdCBPdXRwdXREZWJ1Z1dyaXRlciB7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKCBzdGQ6OnN0cmluZyBjb25zdCZzdHIgKSB7CisgICAgICAgICAgICB3cml0ZVRvRGVidWdDb25zb2xlKCBzdHIgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBEZWJ1Z091dFN0cmVhbTo6RGVidWdPdXRTdHJlYW0oKQorICAgIDogICBtX3N0cmVhbUJ1ZiggbmV3IFN0cmVhbUJ1ZkltcGw8T3V0cHV0RGVidWdXcml0ZXI+KCkgKSwKKyAgICAgICAgbV9vcyggbV9zdHJlYW1CdWYuZ2V0KCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIERlYnVnT3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworICAgIC8vIFN0b3JlIHRoZSBzdHJlYW1idWYgZnJvbSBjb3V0IHVwLWZyb250IGJlY2F1c2UKKyAgICAvLyBjb3V0IG1heSBnZXQgcmVkaXJlY3RlZCB3aGVuIHJ1bm5pbmcgdGVzdHMKKyAgICBDb3V0U3RyZWFtOjpDb3V0U3RyZWFtKCkKKyAgICA6ICAgbV9vcyggQ2F0Y2g6OmNvdXQoKS5yZGJ1ZigpICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBDb3V0U3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29zOworICAgIH0KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfTk9TVERPVVQgLy8gSWYgeW91ICNkZWZpbmUgdGhpcyB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zCisgICAgc3RkOjpvc3RyZWFtJiBjb3V0KCkgeworICAgICAgICByZXR1cm4gc3RkOjpjb3V0OworICAgIH0KKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNlcnI7CisgICAgfQorI2VuZGlmCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBDb250ZXh0IDogcHVibGljIElNdXRhYmxlQ29udGV4dCB7CisKKyAgICAgICAgQ29udGV4dCgpIDogbV9jb25maWcoIENBVENIX05VTEwgKSwgbV9ydW5uZXIoIENBVENIX05VTEwgKSwgbV9yZXN1bHRDYXB0dXJlKCBDQVRDSF9OVUxMICkge30KKyAgICAgICAgQ29udGV4dCggQ29udGV4dCBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIENvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7CisgICAgICAgICAgICBkZWxldGVBbGxWYWx1ZXMoIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBJQ29udGV4dAorICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1bm5lcjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRHZW5lcmF0b3JJbmRleCggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzaXplX3QgdG90YWxTaXplICkgeworICAgICAgICAgICAgcmV0dXJuIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpCisgICAgICAgICAgICAuZ2V0R2VuZXJhdG9ySW5mbyggZmlsZUluZm8sIHRvdGFsU2l6ZSApCisgICAgICAgICAgICAuZ2V0Q3VycmVudEluZGV4KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGdlbmVyYXRvcnMgPSBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9ycyAmJiBnZW5lcmF0b3JzLT5tb3ZlTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBQdHI8SUNvbmZpZyBjb25zdD4gZ2V0Q29uZmlnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElNdXRhYmxlQ29udGV4dAorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVzdWx0Q2FwdHVyZSggSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgKSB7CisgICAgICAgICAgICBtX3Jlc3VsdENhcHR1cmUgPSByZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSdW5uZXIoIElSdW5uZXIqIHJ1bm5lciApIHsKKyAgICAgICAgICAgIG1fcnVubmVyID0gcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgeworICAgICAgICAgICAgbV9jb25maWcgPSBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5maW5kKCB0ZXN0TmFtZSApOworICAgICAgICAgICAgcmV0dXJuIGl0ICE9IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuZW5kKCkKKyAgICAgICAgICAgICAgICA/IGl0LT5zZWNvbmQKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QmIGdldEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIGlmKCAhZ2VuZXJhdG9ycyApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0TmFtZSA9IGdldFJlc3VsdENhcHR1cmUoKS0+Z2V0Q3VycmVudFRlc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9ycyA9IGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCB0ZXN0TmFtZSwgZ2VuZXJhdG9ycyApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKmdlbmVyYXRvcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgSVJ1bm5lciogbV9ydW5uZXI7CisgICAgICAgIElSZXN1bHRDYXB0dXJlKiBtX3Jlc3VsdENhcHR1cmU7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9yc0ZvclRlc3QqPiBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lOworICAgIH07CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBDb250ZXh0KiBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorICAgIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgeworICAgICAgICBpZiggIWN1cnJlbnRDb250ZXh0ICkKKyAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gbmV3IENvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuICpjdXJyZW50Q29udGV4dDsKKyAgICB9CisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhblVwQ29udGV4dCgpIHsKKyAgICAgICAgZGVsZXRlIGN1cnJlbnRDb250ZXh0OworICAgICAgICBjdXJyZW50Q29udGV4dCA9IENBVENIX05VTEw7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXJfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlNPTEVfQ09MT1VSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9lcnJub19ndWFyZC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VSUk5PX0dVQVJEX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Vycm5vPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXJybm9HdWFyZCB7CisgICAgcHVibGljOgorICAgICAgICBFcnJub0d1YXJkKCk6bV9vbGRFcnJubyhlcnJubyl7fQorICAgICAgICB+RXJybm9HdWFyZCgpIHsgZXJybm8gPSBtX29sZEVycm5vOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1fb2xkRXJybm87CisgICAgfTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgc3RydWN0IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklDb2xvdXJJbXBsKCkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTm9Db2xvdXJJbXBsIDogSUNvbG91ckltcGwgeworICAgICAgICAgICAgdm9pZCB1c2UoIENvbG91cjo6Q29kZSApIHt9CisKKyAgICAgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIE5vQ29sb3VySW1wbCBzX2luc3RhbmNlOworICAgICAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIH0gLy8gYW5vbiBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9OT05FICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApICYmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKQorIyAgIGlmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSQorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKCBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIHsKKworICAgIGNsYXNzIFdpbjMyQ29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBXaW4zMkNvbG91ckltcGwoKSA6IHN0ZG91dEhhbmRsZSggR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPIGNzYmlJbmZvOworICAgICAgICAgICAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oIHN0ZG91dEhhbmRsZSwgJmNzYmlJbmZvICk7CisgICAgICAgICAgICBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBCQUNLR1JPVU5EX0dSRUVOIHwgQkFDS0dST1VORF9SRUQgfCBCQUNLR1JPVU5EX0JMVUUgfCBCQUNLR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyA9IGNzYmlJbmZvLndBdHRyaWJ1dGVzICYgfiggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIDAgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0VGV4dEF0dHJpYnV0ZSggV09SRCBfdGV4dEF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKCBzdGRvdXRIYW5kbGUsIF90ZXh0QXR0cmlidXRlIHwgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICB9CisgICAgICAgIEhBTkRMRSBzdGRvdXRIYW5kbGU7CisgICAgICAgIFdPUkQgb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlczsKKyAgICAgICAgV09SRCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzOworICAgIH07CisKKyAgICBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIFdpbjMyQ29sb3VySW1wbCBzX2luc3RhbmNlOworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAhaXNEZWJ1Z2dlckFjdGl2ZSgpCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gJnNfaW5zdGFuY2UKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgLy8gdXNlIFBPU0lYLyBBTlNJIGNvbnNvbGUgdGVybWluYWwgY29kZXMKKyAgICAvLyBUaGFua3MgdG8gQWRhbSBTdHJ6ZWxlY2tpIGZvciBvcmlnaW5hbCBjb250cmlidXRpb24KKyAgICAvLyAoaHR0cDovL2dpdGh1Yi5jb20vbmFub2FudCkKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gvcHVsbC8xMzEKKyAgICBjbGFzcyBQb3NpeENvbG91ckltcGwgOiBwdWJsaWMgSUNvbG91ckltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZToKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzBtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzRtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldENvbG91ciggIlswOzMzbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzBtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszN20iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMW0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszN20iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm90IGEgY29sb3VyIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgUG9zaXhDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICByZXR1cm4gJnNfaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgc2V0Q29sb3VyKCBjb25zdCBjaGFyKiBfZXNjYXBlQ29kZSApIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJ1wwMzMnIDw8IF9lc2NhcGVDb2RlOworICAgICAgICB9CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0gKCFpc0RlYnVnZ2VyQWN0aXZlKCkgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pICkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyBQb3NpeENvbG91ckltcGw6Omluc3RhbmNlKCkKKyAgICAgICAgICAgIDogTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOworICAgIH0KKworfSAvLyBlbmQgYW5vbiBuYW1lc3BhY2UKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZWxzZSAgLy8gbm90IFdpbmRvd3Mgb3IgQU5TSSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RhdGljIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeyByZXR1cm4gTm9Db2xvdXJJbXBsOjppbnN0YW5jZSgpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZW5kaWYgLy8gV2luZG93cy8gQU5TSS8gTm9uZQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQ29sb3VyOjpDb2xvdXIoIENvZGUgX2NvbG91ckNvZGUgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyB1c2UoIF9jb2xvdXJDb2RlICk7IH0KKyAgICBDb2xvdXI6OkNvbG91ciggQ29sb3VyIGNvbnN0JiBfb3RoZXIgKSA6IG1fbW92ZWQoIGZhbHNlICkgeyBjb25zdF9jYXN0PENvbG91ciY+KCBfb3RoZXIgKS5tX21vdmVkID0gdHJ1ZTsgfQorICAgIENvbG91cjo6fkNvbG91cigpeyBpZiggIW1fbW92ZWQgKSB1c2UoIE5vbmUgKTsgfQorCisgICAgdm9pZCBDb2xvdXI6OnVzZSggQ29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbXBsID0gcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpOworICAgICAgICBpbXBsLT51c2UoIF9jb2xvdXJDb2RlICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2dlbmVyYXRvcnNfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IEdlbmVyYXRvckluZm8gOiBJR2VuZXJhdG9ySW5mbyB7CisKKyAgICAgICAgR2VuZXJhdG9ySW5mbyggc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgICAgIDogICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1fY3VycmVudEluZGV4KCAwICkKKyAgICAgICAge30KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgaWYoICsrbV9jdXJyZW50SW5kZXggPT0gbV9zaXplICkgeworICAgICAgICAgICAgICAgIG1fY3VycmVudEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGdldEN1cnJlbnRJbmRleCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2N1cnJlbnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fc2l6ZTsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9jdXJyZW50SW5kZXg7CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgR2VuZXJhdG9yc0ZvclRlc3QgOiBwdWJsaWMgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgfkdlbmVyYXRvcnNGb3JUZXN0KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsKCBtX2dlbmVyYXRvcnNJbk9yZGVyICk7CisgICAgICAgIH0KKworICAgICAgICBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgeworICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzQnlOYW1lLmZpbmQoIGZpbGVJbmZvICk7CisgICAgICAgICAgICBpZiggaXQgPT0gbV9nZW5lcmF0b3JzQnlOYW1lLmVuZCgpICkgeworICAgICAgICAgICAgICAgIElHZW5lcmF0b3JJbmZvKiBpbmZvID0gbmV3IEdlbmVyYXRvckluZm8oIHNpemUgKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeU5hbWUuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggZmlsZUluZm8sIGluZm8gKSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0luT3JkZXIucHVzaF9iYWNrKCBpbmZvICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICppbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICppdC0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9nZW5lcmF0b3JzSW5PcmRlci5iZWdpbigpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmVuZCgpOworICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoICgqaXQpLT5tb3ZlTmV4dCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0J5TmFtZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPiBtX2dlbmVyYXRvcnNJbk9yZGVyOworICAgIH07CisKKyAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGNyZWF0ZUdlbmVyYXRvcnNGb3JUZXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVNTRVJUSU9OUkVTVUxUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgQXNzZXJ0aW9uSW5mbzo6QXNzZXJ0aW9uSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBfcmVzdWx0RGlzcG9zaXRpb24gKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBjYXB0dXJlZEV4cHJlc3Npb24oIF9jYXB0dXJlZEV4cHJlc3Npb24gKSwKKyAgICAgICAgcmVzdWx0RGlzcG9zaXRpb24oIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6QXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fcmVzdWx0RGF0YSggZGF0YSApCisgICAge30KKworICAgIEFzc2VydGlvblJlc3VsdDo6fkFzc2VydGlvblJlc3VsdCgpIHt9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2VzcworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpzdWNjZWVkZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgd2FzIGEgc3VjY2Vzcywgb3IgZmFpbHVyZSBpcyBzdXBwcmVzc2VkCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OmlzT2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDYXRjaDo6aXNPayggbV9yZXN1bHREYXRhLnJlc3VsdFR5cGUgKSB8fCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgIH0KKworICAgIFJlc3VsdFdhczo6T2ZUeXBlIEFzc2VydGlvblJlc3VsdDo6Z2V0UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24uZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzTWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX3Jlc3VsdERhdGEubWVzc2FnZS5lbXB0eSgpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgaWYoIGlzRmFsc2VUZXN0KCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApCisgICAgICAgICAgICByZXR1cm4gJyEnICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwcmVzc2lvbkluTWFjcm8oKSBjb25zdCB7CisgICAgICAgIGlmKCBtX2luZm8ubWFjcm9OYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lICsgIiggIiArIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24gKyAiICkiOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBoYXNFeHByZXNzaW9uKCkgJiYgZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgIT0gZ2V0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5tZXNzYWdlOworICAgIH0KKyAgICBTb3VyY2VMaW5lSW5mbyBBc3NlcnRpb25SZXN1bHQ6OmdldFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubGluZUluZm87CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRUZXN0TWFjcm9OYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmZvLm1hY3JvTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvblJlc3VsdDo6ZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEuZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yZXN1bHREYXRhLnJlY29uc3RydWN0RXhwcmVzc2lvbigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfaW5mby5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9JTkZPX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcGFyc2VTcGVjaWFsVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgeworICAgICAgICBpZiggc3RhcnRzV2l0aCggdGFnLCAnLicgKSB8fAorICAgICAgICAgICAgdGFnID09ICJoaWRlIiB8fAorICAgICAgICAgICAgdGFnID09ICIhaGlkZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW47CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXRocm93cyIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6VGhyb3dzOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFzaG91bGRmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpTaG91bGRGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFtYXlmYWlsIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpNYXlGYWlsOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFub25wb3J0YWJsZSIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uUG9ydGFibGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok5vbmU7CisgICAgfQorICAgIGlubGluZSBib29sIGlzUmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIHJldHVybiBwYXJzZVNwZWNpYWxUYWcoIHRhZyApID09IFRlc3RDYXNlSW5mbzo6Tm9uZSAmJiB0YWcuc2l6ZSgpID4gMCAmJiAhc3RkOjppc2FsbnVtKCB0YWdbMF0gKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkgeworICAgICAgICBpZiggaXNSZXNlcnZlZFRhZyggdGFnICkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBDb2xvdXIoQ29sb3VyOjpSZWQpCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWUgWyIgPDwgdGFnIDw8ICJdIG5vdCBhbGxvd2VkLlxuIgorICAgICAgICAgICAgICAgPDwgIlRhZyBuYW1lcyBzdGFydGluZyB3aXRoIG5vbiBhbHBoYS1udW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlc2VydmVkXG4iCisgICAgICAgICAgICAgICA8PCBDb2xvdXIoQ29sb3VyOjpGaWxlTmFtZSkKKyAgICAgICAgICAgICAgIDw8IF9saW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHNzLnN0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0Q2FzZSogX3Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NPclRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApCisgICAgeworICAgICAgICBib29sIGlzSGlkZGVuKCBzdGFydHNXaXRoKCBfbmFtZSwgIi4vIiApICk7IC8vIExlZ2FjeSBzdXBwb3J0CisKKyAgICAgICAgLy8gUGFyc2Ugb3V0IHRhZ3MKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHRhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2MsIHRhZzsKKyAgICAgICAgYm9vbCBpblRhZyA9IGZhbHNlOworICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgX2Rlc2NPclRhZ3Muc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBfZGVzY09yVGFnc1tpXTsKKyAgICAgICAgICAgIGlmKCAhaW5UYWcgKSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzYyArPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJ10nICkgeworICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzIHByb3AgPSBwYXJzZVNwZWNpYWxUYWcoIHRhZyApOworICAgICAgICAgICAgICAgICAgICBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86OklzSGlkZGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCB0YWcsIF9saW5lSW5mbyApOworCisgICAgICAgICAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFnICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoIGlzSGlkZGVuICkgeworICAgICAgICAgICAgdGFncy5pbnNlcnQoICJoaWRlIiApOworICAgICAgICAgICAgdGFncy5pbnNlcnQoICIuIiApOworICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGluZm8oIF9uYW1lLCBfY2xhc3NOYW1lLCBkZXNjLCB0YWdzLCBfbGluZUluZm8gKTsKKyAgICAgICAgcmV0dXJuIFRlc3RDYXNlKCBfdGVzdENhc2UsIGluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIHRhZ3MgKQorICAgIHsKKyAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3MgPSB0YWdzOworICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmNsZWFyKCk7CisKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFncy5iZWdpbigpLCBpdEVuZCA9IHRhZ3MuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgb3NzIDw8ICdbJyA8PCAqaXQgPDwgJ10nOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWcgPSB0b0xvd2VyKCAqaXQgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzID0gc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcz4oIHRlc3RDYXNlSW5mby5wcm9wZXJ0aWVzIHwgcGFyc2VTcGVjaWFsVGFnKCBsY2FzZVRhZyApICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ubGNhc2VUYWdzLmluc2VydCggbGNhc2VUYWcgKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0Q2FzZUluZm8udGFnc0FzU3RyaW5nID0gb3NzLnN0cigpOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgY2xhc3NOYW1lKCBfY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBOb25lICkKKyAgICB7CisgICAgICAgIHNldFRhZ3MoICp0aGlzLCBfdGFncyApOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbzo6VGVzdENhc2VJbmZvKCBUZXN0Q2FzZUluZm8gY29uc3QmIG90aGVyICkKKyAgICA6ICAgbmFtZSggb3RoZXIubmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIG90aGVyLmNsYXNzTmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggb3RoZXIuZGVzY3JpcHRpb24gKSwKKyAgICAgICAgdGFncyggb3RoZXIudGFncyApLAorICAgICAgICBsY2FzZVRhZ3MoIG90aGVyLmxjYXNlVGFncyApLAorICAgICAgICB0YWdzQXNTdHJpbmcoIG90aGVyLnRhZ3NBc1N0cmluZyApLAorICAgICAgICBsaW5lSW5mbyggb3RoZXIubGluZUluZm8gKSwKKyAgICAgICAgcHJvcGVydGllcyggb3RoZXIucHJvcGVydGllcyApCisgICAge30KKworICAgIGJvb2wgVGVzdENhc2VJbmZvOjppc0hpZGRlbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIElzSGlkZGVuICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OnRocm93cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIFRocm93cyApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjpva1RvRmFpbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIChTaG91bGRGYWlsIHwgTWF5RmFpbCApICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmV4cGVjdGVkVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgKSApICE9IDA7CisgICAgfQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNlKCBJVGVzdENhc2UqIHRlc3RDYXNlLCBUZXN0Q2FzZUluZm8gY29uc3QmIGluZm8gKSA6IFRlc3RDYXNlSW5mbyggaW5mbyApLCB0ZXN0KCB0ZXN0Q2FzZSApIHt9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApCisgICAgOiAgIFRlc3RDYXNlSW5mbyggb3RoZXIgKSwKKyAgICAgICAgdGVzdCggb3RoZXIudGVzdCApCisgICAge30KKworICAgIFRlc3RDYXNlIFRlc3RDYXNlOjp3aXRoTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9uZXdOYW1lICkgY29uc3QgeworICAgICAgICBUZXN0Q2FzZSBvdGhlciggKnRoaXMgKTsKKyAgICAgICAgb3RoZXIubmFtZSA9IF9uZXdOYW1lOworICAgICAgICByZXR1cm4gb3RoZXI7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6c3dhcCggVGVzdENhc2UmIG90aGVyICkgeworICAgICAgICB0ZXN0LnN3YXAoIG90aGVyLnRlc3QgKTsKKyAgICAgICAgbmFtZS5zd2FwKCBvdGhlci5uYW1lICk7CisgICAgICAgIGNsYXNzTmFtZS5zd2FwKCBvdGhlci5jbGFzc05hbWUgKTsKKyAgICAgICAgZGVzY3JpcHRpb24uc3dhcCggb3RoZXIuZGVzY3JpcHRpb24gKTsKKyAgICAgICAgdGFncy5zd2FwKCBvdGhlci50YWdzICk7CisgICAgICAgIGxjYXNlVGFncy5zd2FwKCBvdGhlci5sY2FzZVRhZ3MgKTsKKyAgICAgICAgdGFnc0FzU3RyaW5nLnN3YXAoIG90aGVyLnRhZ3NBc1N0cmluZyApOworICAgICAgICBzdGQ6OnN3YXAoIFRlc3RDYXNlSW5mbzo6cHJvcGVydGllcywgc3RhdGljX2Nhc3Q8VGVzdENhc2VJbmZvJj4oIG90aGVyICkucHJvcGVydGllcyApOworICAgICAgICBzdGQ6OnN3YXAoIGxpbmVJbmZvLCBvdGhlci5saW5lSW5mbyApOworICAgIH0KKworICAgIHZvaWQgVGVzdENhc2U6Omludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgdGVzdC0+aW52b2tlKCk7CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiAgdGVzdC5nZXQoKSA9PSBvdGhlci50ZXN0LmdldCgpICYmCisgICAgICAgICAgICAgICAgbmFtZSA9PSBvdGhlci5uYW1lICYmCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbmFtZSA8IG90aGVyLm5hbWU7CisgICAgfQorICAgIFRlc3RDYXNlJiBUZXN0Q2FzZTo6b3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgVGVzdENhc2UgdGVtcCggb3RoZXIgKTsKKyAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBUZXN0Q2FzZTo6Z2V0VGVzdENhc2VJbmZvKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdmVyc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1ZFUlNJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBWZXJzaW9uOjpWZXJzaW9uCisgICAgICAgICggICB1bnNpZ25lZCBpbnQgX21ham9yVmVyc2lvbiwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBfYnJhbmNoTmFtZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnVpbGROdW1iZXIgKQorICAgIDogICBtYWpvclZlcnNpb24oIF9tYWpvclZlcnNpb24gKSwKKyAgICAgICAgbWlub3JWZXJzaW9uKCBfbWlub3JWZXJzaW9uICksCisgICAgICAgIHBhdGNoTnVtYmVyKCBfcGF0Y2hOdW1iZXIgKSwKKyAgICAgICAgYnJhbmNoTmFtZSggX2JyYW5jaE5hbWUgKSwKKyAgICAgICAgYnVpbGROdW1iZXIoIF9idWlsZE51bWJlciApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICkgeworICAgICAgICBvcyAgPDwgdmVyc2lvbi5tYWpvclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLm1pbm9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ucGF0Y2hOdW1iZXI7CisgICAgICAgIC8vIGJyYW5jaE5hbWUgaXMgbmV2ZXIgbnVsbCAtPiAwdGggY2hhciBpcyBcMCBpZiBpdCBpcyBlbXB0eQorICAgICAgICBpZiAodmVyc2lvbi5icmFuY2hOYW1lWzBdKSB7CisgICAgICAgICAgICBvcyA8PCAnLScgPDwgdmVyc2lvbi5icmFuY2hOYW1lCisgICAgICAgICAgICAgICA8PCAnLicgPDwgdmVyc2lvbi5idWlsZE51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKSB7CisgICAgICAgIHN0YXRpYyBWZXJzaW9uIHZlcnNpb24oIDEsIDksIDQsICIiLCAwICk7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01FU1NBR0VfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBNZXNzYWdlSW5mbzo6TWVzc2FnZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICkKKyAgICA6ICAgbWFjcm9OYW1lKCBfbWFjcm9OYW1lICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgdHlwZSggX3R5cGUgKSwKKyAgICAgICAgc2VxdWVuY2UoICsrZ2xvYmFsQ291bnQgKQorICAgIHt9CisKKyAgICAvLyBUaGlzIG1heSBuZWVkIHByb3RlY3RpbmcgaWYgdGhyZWFkaW5nIHN1cHBvcnQgaXMgYWRkZWQKKyAgICB1bnNpZ25lZCBpbnQgTWVzc2FnZUluZm86Omdsb2JhbENvdW50ID0gMDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkKKyAgICA6IG1faW5mbyggYnVpbGRlci5tX2luZm8gKQorICAgIHsKKyAgICAgICAgbV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucHVzaFNjb3BlZE1lc3NhZ2UoIG1faW5mbyApOworICAgIH0KKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApCisgICAgOiBtX2luZm8oIG90aGVyLm1faW5mbyApCisgICAge30KKworICAgIFNjb3BlZE1lc3NhZ2U6On5TY29wZWRNZXNzYWdlKCkgeworICAgICAgICBpZiAoICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpICl7CisgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkucG9wU2NvcGVkTWVzc2FnZShtX2luZm8pOworICAgICAgICB9CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTEVHQUNZX1JFUE9SVEVSX0FEQVBURVJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9sZWdhY3lfcmVwb3J0ZXJfYWRhcHRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIC8vIERlcHJlY2F0ZWQKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZG91dCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0aW5nKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdGluZyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydEdyb3VwKCBzdGQ6OnN0cmluZyBjb25zdCYgZ3JvdXBOYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kR3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUsIFRvdGFscyBjb25zdCYgdG90YWxzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRUZXN0Q2FzZSggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvLCBUb3RhbHMgY29uc3QmIHRvdGFscywgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZE91dCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0ZEVyciApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0U2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgZGVzY3JpcHRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIENvdW50cyBjb25zdCYgYXNzZXJ0aW9ucyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIE5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5UZXN0Q2FzZSggc3RkOjpzdHJpbmcgY29uc3QmIHRlc3ROYW1lICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgQWJvcnRlZCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKSA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIExlZ2FjeVJlcG9ydGVyQWRhcHRlciA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApOworICAgICAgICB2aXJ0dWFsIH5MZWdhY3lSZXBvcnRlckFkYXB0ZXIoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFB0cjxJUmVwb3J0ZXI+IG1fbGVnYWN5UmVwb3J0ZXI7CisgICAgfTsKK30KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIFB0cjxJUmVwb3J0ZXI+IGNvbnN0JiBsZWdhY3lSZXBvcnRlciApCisgICAgOiAgIG1fbGVnYWN5UmVwb3J0ZXIoIGxlZ2FjeVJlcG9ydGVyICkKKyAgICB7fQorICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6fkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpIHt9CisKKyAgICBSZXBvcnRlclByZWZlcmVuY2VzIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6Z2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgIHByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gbV9sZWdhY3lSZXBvcnRlci0+c2hvdWxkUmVkaXJlY3RTdGRvdXQoKTsKKyAgICAgICAgcmV0dXJuIHByZWZzOworICAgIH0KKworICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSB7fQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRUZXN0aW5nKCk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0R3JvdXAoIGdyb3VwSW5mby5uYW1lICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RDYXNlKCB0ZXN0SW5mbyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0U2VjdGlvbiggc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHsKKyAgICAgICAgLy8gTm90IG9uIGxlZ2FjeSBpbnRlcmZhY2UKKyAgICB9CisKKyAgICBib29sIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpPayApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzdWx0QnVpbGRlciByYiggaXQtPm1hY3JvTmFtZS5jX3N0cigpLCBpdC0+bGluZUluZm8sICIiLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgICAgICAgICAgICAgIHJiIDw8IGl0LT5tZXNzYWdlOworICAgICAgICAgICAgICAgICAgICByYi5zZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6OkluZm8gKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IHJiLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggcmVzdWx0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlJlc3VsdCggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIHsKKyAgICAgICAgaWYoIHNlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5Ob0Fzc2VydGlvbnNJblNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lICk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFNlY3Rpb24oIHNlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdENhc2UKKyAgICAgICAgICAgICggICB0ZXN0Q2FzZVN0YXRzLnRlc3RJbmZvLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMudG90YWxzLAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkT3V0LAorICAgICAgICAgICAgICAgIHRlc3RDYXNlU3RhdHMuc3RkRXJyICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgeworICAgICAgICBpZiggdGVzdEdyb3VwU3RhdHMuYWJvcnRpbmcgKQorICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+QWJvcnRlZCgpOworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRHcm91cCggdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUsIHRlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kVGVzdGluZyggdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6c2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSB7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaHBwCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKysxMS1sb25nLWxvbmciCisjZW5kaWYKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworI2Vsc2UKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICBzdGF0aWMgVUludDY0IGh6PTAsIGh6bz0wOworICAgICAgICAgICAgaWYgKCFoeikgeworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHogKSApOworICAgICAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJmh6byApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVSW50NjQgdDsKKyAgICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJnQgKSApOworICAgICAgICAgICAgcmV0dXJuICgodC1oem8pKjEwMDAwMDApL2h6OworICAgICAgICB9CisjZWxzZQorICAgICAgICBVSW50NjQgZ2V0Q3VycmVudFRpY2tzKCkgeworICAgICAgICAgICAgdGltZXZhbCB0OworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0LENBVENIX05VTEwpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFVJbnQ2ND4oIHQudHZfc2VjICkgKiAxMDAwMDAwdWxsICsgc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl91c2VjICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgVGltZXI6OnN0YXJ0KCkgeworICAgICAgICBtX3RpY2tzID0gZ2V0Q3VycmVudFRpY2tzKCk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBUaW1lcjo6Z2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0Q3VycmVudFRpY2tzKCkgLSBtX3RpY2tzKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMCk7CisgICAgfQorICAgIGRvdWJsZSBUaW1lcjo6Z2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAwMDAwMC4wOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tbW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHByZWZpeC5iZWdpbigpLCBwcmVmaXguZW5kKCksIHMuYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzWzBdID09IHByZWZpeDsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwoc3VmZml4LnJiZWdpbigpLCBzdWZmaXgucmVuZCgpLCBzLnJiZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICkgeworICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzW3Muc2l6ZSgpLTFdID09IHN1ZmZpeDsKKyAgICB9CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuZmluZCggaW5maXggKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICB9CisgICAgY2hhciB0b0xvd2VyQ2goY2hhciBjKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBjICkgKTsKKyAgICB9CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgdG9Mb3dlckNoICk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYyA9IHM7CisgICAgICAgIHRvTG93ZXJJblBsYWNlKCBsYyApOworICAgICAgICByZXR1cm4gbGM7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0KiB3aGl0ZXNwYWNlQ2hhcnMgPSAiXG5cclx0ICI7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHN0ci5maW5kX2xhc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKworICAgICAgICByZXR1cm4gc3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBzdHIuc3Vic3RyKCBzdGFydCwgMStlbmQtc3RhcnQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKSB7CisgICAgICAgIGJvb2wgcmVwbGFjZWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzaXplX3QgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcyApOworICAgICAgICB3aGlsZSggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoIDAsIGkgKSArIHdpdGhUaGlzICsgc3RyLnN1YnN0ciggaStyZXBsYWNlVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGlmKCBpIDwgc3RyLnNpemUoKS13aXRoVGhpcy5zaXplKCkgKQorICAgICAgICAgICAgICAgIGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMsIGkrd2l0aFRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBsYWNlZDsKKyAgICB9CisKKyAgICBwbHVyYWxpc2U6OnBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApCisgICAgOiAgIG1fY291bnQoIGNvdW50ICksCisgICAgICAgIG1fbGFiZWwoIGxhYmVsICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApIHsKKyAgICAgICAgb3MgPDwgcGx1cmFsaXNlci5tX2NvdW50IDw8ICcgJyA8PCBwbHVyYWxpc2VyLm1fbGFiZWw7CisgICAgICAgIGlmKCBwbHVyYWxpc2VyLm1fY291bnQgIT0gMSApCisgICAgICAgICAgICBvcyA8PCAncyc7CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBTb3VyY2VMaW5lSW5mbzo6U291cmNlTGluZUluZm8oKSA6IGZpbGUoIiIpLCBsaW5lKCAwICl7fQorICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICkKKyAgICA6ICAgZmlsZSggX2ZpbGUgKSwKKyAgICAgICAgbGluZSggX2xpbmUgKQorICAgIHt9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6ZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBmaWxlWzBdID09ICdcMCc7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbGluZSA9PSBvdGhlci5saW5lICYmIChmaWxlID09IG90aGVyLmZpbGUgfHwgc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPT0gMCk7CisgICAgfQorICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lIDwgb3RoZXIubGluZSB8fCAoIGxpbmUgPT0gb3RoZXIubGluZSAmJiAoc3RkOjpzdHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPCAwKSk7CisgICAgfQorCisgICAgdm9pZCBzZWVkUm5nKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIGlmKCBjb25maWcucm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgc3RkOjpzcmFuZCggY29uZmlnLnJuZ1NlZWQoKSApOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnJuZ1NlZWQoKTsKKyAgICB9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKSB7CisjaWZuZGVmIF9fR05VR19fCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnKCcgPDwgaW5mby5saW5lIDw8ICcpJzsKKyNlbHNlCisgICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnOicgPDwgaW5mby5saW5lOworI2VuZGlmCisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCBsb2NhdGlvbkluZm8gPDwgIjogSW50ZXJuYWwgQ2F0Y2ggZXJyb3I6ICciIDw8IG1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgaWYoIGFsd2F5c1RydWUoKSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zZWN0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFNlY3Rpb25JbmZvOjpTZWN0aW9uSW5mbworICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKQorICAgIHt9CisKKyAgICBTZWN0aW9uOjpTZWN0aW9uKCBTZWN0aW9uSW5mbyBjb25zdCYgaW5mbyApCisgICAgOiAgIG1faW5mbyggaW5mbyApLAorICAgICAgICBtX3NlY3Rpb25JbmNsdWRlZCggZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25TdGFydGVkKCBtX2luZm8sIG1fYXNzZXJ0aW9ucyApICkKKyAgICB7CisgICAgICAgIG1fdGltZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBTZWN0aW9uOjp+U2VjdGlvbigpIHsKKyAgICAgICAgaWYoIG1fc2VjdGlvbkluY2x1ZGVkICkgeworICAgICAgICAgICAgU2VjdGlvbkVuZEluZm8gZW5kSW5mbyggbV9pbmZvLCBtX2Fzc2VydGlvbnMsIG1fdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKSApOworICAgICAgICAgICAgaWYoIHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWRFYXJseSggZW5kSW5mbyApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uRW5kZWQoIGVuZEluZm8gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdAorICAgIFNlY3Rpb246Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZGVidWdnZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgI2luY2x1ZGUgPGFzc2VydC5oPgorICAgICNpbmNsdWRlIDxzdGRib29sLmg+CisgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgZm9sbG93aW5nIHRlY2huaWNhbCBub3RlOgorICAgICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy8jcWEvcWEyMDA0L3FhMTM2MS5odG1sCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYmVpbmcgZGVidWdnZWQgKGVpdGhlcgorICAgICAgICAvLyBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciBvciBoYXMgYSBkZWJ1Z2dlciBhdHRhY2hlZCBwb3N0IGZhY3RvKS4KKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7CisKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbWliWzRdOworICAgICAgICAgICAgc3RydWN0IGtpbmZvX3Byb2MgICBpbmZvOworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmbGFncyBzbyB0aGF0LCBpZiBzeXNjdGwgZmFpbHMgZm9yIHNvbWUgYml6YXJyZQorICAgICAgICAgICAgLy8gcmVhc29uLCB3ZSBnZXQgYSBwcmVkaWN0YWJsZSByZXN1bHQuCisKKyAgICAgICAgICAgIGluZm8ua3BfcHJvYy5wX2ZsYWcgPSAwOworCisgICAgICAgICAgICAvLyBJbml0aWFsaXplIG1pYiwgd2hpY2ggdGVsbHMgc3lzY3RsIHRoZSBpbmZvIHdlIHdhbnQsIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gd2UncmUgbG9va2luZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIElELgorCisgICAgICAgICAgICBtaWJbMF0gPSBDVExfS0VSTjsKKyAgICAgICAgICAgIG1pYlsxXSA9IEtFUk5fUFJPQzsKKyAgICAgICAgICAgIG1pYlsyXSA9IEtFUk5fUFJPQ19QSUQ7CisgICAgICAgICAgICBtaWJbM10gPSBnZXRwaWQoKTsKKworICAgICAgICAgICAgLy8gQ2FsbCBzeXNjdGwuCisKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgICAgICAgICBpZiggc3lzY3RsKG1pYiwgc2l6ZW9mKG1pYikgLyBzaXplb2YoKm1pYiksICZpbmZvLCAmc2l6ZSwgQ0FUQ0hfTlVMTCwgMCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8ICJcbioqIENhbGwgdG8gc3lzY3RsIGZhaWxlZCAtIHVuYWJsZSB0byBkZXRlcm1pbmUgaWYgZGVidWdnZXIgaXMgYWN0aXZlICoqXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlJ3JlIGJlaW5nIGRlYnVnZ2VkIGlmIHRoZSBQX1RSQUNFRCBmbGFnIGlzIHNldC4KKworICAgICAgICAgICAgcmV0dXJuICggKGluZm8ua3BfcHJvYy5wX2ZsYWcgJiBQX1RSQUNFRCkgIT0gMCApOworICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAjaW5jbHVkZSA8ZnN0cmVhbT4KKyAgICAjaW5jbHVkZSA8c3RyaW5nPgorCisgICAgbmFtZXNwYWNlIENhdGNoeworICAgICAgICAvLyBUaGUgc3RhbmRhcmQgUE9TSVggd2F5IG9mIGRldGVjdGluZyBhIGRlYnVnZ2VyIGlzIHRvIGF0dGVtcHQgdG8KKyAgICAgICAgLy8gcHRyYWNlKCkgdGhlIHByb2Nlc3MsIGJ1dCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgZnJvbSBhIGNoaWxkIGFuZCBub3QKKyAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGl0c2VsZiB0byBzdGlsbCBhbGxvdyBhdHRhY2hpbmcgdG8gdGhpcyBwcm9jZXNzIGxhdGVyCisgICAgICAgIC8vIGlmIHdhbnRlZCwgc28gaXMgcmF0aGVyIGhlYXZ5LiBVbmRlciBMaW51eCB3ZSBoYXZlIHRoZSBQSUQgb2YgdGhlCisgICAgICAgIC8vICJkZWJ1Z2dlciIgKHdoaWNoIGRvZXNuJ3QgbmVlZCB0byBiZSBnZGIsIG9mIGNvdXJzZSwgaXQgY291bGQgYWxzbworICAgICAgICAvLyBiZSBzdHJhY2UsIGZvciBleGFtcGxlKSBpbiAvcHJvYy8kUElEL3N0YXR1cywgc28ganVzdCBnZXQgaXQgZnJvbQorICAgICAgICAvLyB0aGVyZSBpbnN0ZWFkLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKyAgICAgICAgICAgIC8vIExpYnN0ZGMrKyBoYXMgYSBidWcsIHdoZXJlIHN0ZDo6aWZzdHJlYW0gc2V0cyBlcnJubyB0byAwCisgICAgICAgICAgICAvLyBUaGlzIHdheSBvdXIgdXNlcnMgY2FuIHByb3Blcmx5IGFzc2VydCBvdmVyIGVycm5vIHZhbHVlcworICAgICAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gaW4oIi9wcm9jL3NlbGYvc3RhdHVzIik7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c3RyaW5nIGxpbmU7IHN0ZDo6Z2V0bGluZShpbiwgbGluZSk7ICkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgUFJFRklYX0xFTiA9IDExOworICAgICAgICAgICAgICAgIGlmKCBsaW5lLmNvbXBhcmUoMCwgUFJFRklYX0xFTiwgIlRyYWNlclBpZDpcdCIpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHRyYWNlZCBpZiB0aGUgUElEIGlzIG5vdCAwIGFuZCBubyBvdGhlciBQSUQgc3RhcnRzCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggMCBkaWdpdCwgc28gaXQncyBlbm91Z2ggdG8gY2hlY2sgZm9yIGp1c3QgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGgoKSA+IFBSRUZJWF9MRU4gJiYgbGluZVtQUkVGSVhfTEVOXSAhPSAnMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgaW5saW5lIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgOjpPdXRwdXREZWJ1Z1N0cmluZ0EoIHRleHQuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICB2b2lkIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgLy8gIVRCRDogTmVlZCBhIHZlcnNpb24gZm9yIE1hYy8gWENvZGUgYW5kIG90aGVyIElERXMKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdG9zdHJpbmcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB1bnByaW50YWJsZVN0cmluZyA9ICJ7P30iOworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgY29uc3QgaW50IGhleFRocmVzaG9sZCA9IDI1NTsKKworICAgICAgICBzdHJ1Y3QgRW5kaWFubmVzcyB7CisgICAgICAgICAgICBlbnVtIEFyY2ggeyBCaWcsIExpdHRsZSB9OworCisgICAgICAgICAgICBzdGF0aWMgQXJjaCB3aGljaCgpIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBfeworICAgICAgICAgICAgICAgICAgICBpbnQgYXNJbnQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYXNDaGFyW3NpemVvZiAoaW50KV07CisgICAgICAgICAgICAgICAgfSB1OworCisgICAgICAgICAgICAgICAgdS5hc0ludCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuICggdS5hc0NoYXJbc2l6ZW9mKGludCktMV0gPT0gMSApID8gQmlnIDogTGl0dGxlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKQorICAgIHsKKyAgICAgICAgLy8gUmV2ZXJzZSBvcmRlciBmb3IgbGl0dGxlIGVuZGlhbiBhcmNoaXRlY3R1cmVzCisgICAgICAgIGludCBpID0gMCwgZW5kID0gc3RhdGljX2Nhc3Q8aW50Piggc2l6ZSApLCBpbmMgPSAxOworICAgICAgICBpZiggRW5kaWFubmVzczo6d2hpY2goKSA9PSBFbmRpYW5uZXNzOjpMaXR0bGUgKSB7CisgICAgICAgICAgICBpID0gZW5kLTE7CisgICAgICAgICAgICBlbmQgPSBpbmMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ5dGVzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciBjb25zdCAqPihvYmplY3QpOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICIweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXg7CisgICAgICAgIGZvciggOyBpICE9IGVuZDsgaSArPSBpbmMgKQorICAgICAgICAgICAgIG9zIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYnl0ZXNbaV0pOworICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgc3RkOjpzdHJpbmcgcyA9IHZhbHVlOworICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG93SW52aXNpYmxlcygpICkgeworICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgcy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnM7CisgICAgICAgICAgICBzd2l0Y2goIHNbaV0gKSB7CisgICAgICAgICAgICBjYXNlICdcbic6IHN1YnMgPSAiXFxuIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcdCc6IHN1YnMgPSAiXFx0IjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhc3Vicy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHMgPSBzLnN1YnN0ciggMCwgaSApICsgc3VicyArIHMuc3Vic3RyKCBpKzEgKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICciJyArIHMgKyAnIic7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp3c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgcy5yZXNlcnZlKCB2YWx1ZS5zaXplKCkgKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWUuc2l6ZSgpOyArK2kgKQorICAgICAgICBzICs9IHZhbHVlW2ldIDw9IDB4ZmYgPyBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWVbaV0gKSA6ICc/JzsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6c3RyaW5nKCB2YWx1ZSApICkgOiBzdGQ6OnN0cmluZyggIntudWxsIHN0cmluZ30iICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gdmFsdWUgPyBDYXRjaDo6dG9TdHJpbmcoIHN0ZDo6d3N0cmluZyh2YWx1ZSkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHdjaGFyX3QqIGNvbnN0IHZhbHVlICkKK3sKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGludCB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGludCB2YWx1ZSApIHsKKyAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggdmFsdWUgKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgZnBUb1N0cmluZyggVCB2YWx1ZSwgaW50IHByZWNpc2lvbiApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lzaW9uICkKKyAgICAgICAgPDwgc3RkOjpmaXhlZAorICAgICAgICA8PCB2YWx1ZTsKKyAgICBzdGQ6OnN0cmluZyBkID0gb3NzLnN0cigpOworICAgIHN0ZDo6c2l6ZV90IGkgPSBkLmZpbmRfbGFzdF9ub3Rfb2YoICcwJyApOworICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGkgIT0gZC5zaXplKCktMSApIHsKKyAgICAgICAgaWYoIGRbaV0gPT0gJy4nICkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZCA9IGQuc3Vic3RyKCAwLCBpKzEgKTsKKyAgICB9CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBkb3VibGUgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCAxMCApOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGZsb2F0IHZhbHVlICkgeworICAgIHJldHVybiBmcFRvU3RyaW5nKCB2YWx1ZSwgNSApICsgJ2YnOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggYm9vbCB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApIHsKKyAgICBpZiAoIHZhbHVlID09ICdccicgKQorICAgICAgICByZXR1cm4gIidcXHInIjsKKyAgICBpZiAoIHZhbHVlID09ICdcZicgKQorICAgICAgICByZXR1cm4gIidcXGYnIjsKKyAgICBpZiAoIHZhbHVlID09ICdcbicgKQorICAgICAgICByZXR1cm4gIidcXG4nIjsKKyAgICBpZiAoIHZhbHVlID09ICdcdCcgKQorICAgICAgICByZXR1cm4gIidcXHQnIjsKKyAgICBpZiAoICdcMCcgPD0gdmFsdWUgJiYgdmFsdWUgPCAnICcgKQorICAgICAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHZhbHVlICkgKTsKKyAgICBjaGFyIGNoc3RyW10gPSAiJyAnIjsKKyAgICBjaHN0clsxXSA9IHZhbHVlOworICAgIHJldHVybiBjaHN0cjsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICkgeworICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlICkgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6Om51bGxwdHJfdCApIHsKKyAgICByZXR1cm4gIm51bGxwdHIiOworfQorI2VuZGlmCisKKyNpZmRlZiBfX09CSkNfXworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyBjb25zdCAqIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgKiBDQVRDSF9BUkNfU1RST05HIGNvbnN0JiBuc3N0cmluZyApIHsKKyAgICAgICAgaWYoICFuc3N0cmluZyApCisgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIHJldHVybiAiQCIgKyB0b1N0cmluZyhbbnNzdHJpbmcgVVRGOFN0cmluZ10pOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCBbbnNPYmplY3QgZGVzY3JpcHRpb25dICk7CisgICAgfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVzdWx0X2J1aWxkZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggc3RkOjpzdHJpbmcgY29uc3QmIGNhcHR1cmVkRXhwcmVzc2lvbiwgc3RkOjpzdHJpbmcgY29uc3QmIHNlY29uZEFyZyApIHsKKyAgICAgICAgcmV0dXJuIHNlY29uZEFyZy5lbXB0eSgpIHx8IHNlY29uZEFyZyA9PSAiXCJcIiIKKyAgICAgICAgICAgID8gY2FwdHVyZWRFeHByZXNzaW9uCisgICAgICAgICAgICA6IGNhcHR1cmVkRXhwcmVzc2lvbiArICIsICIgKyBzZWNvbmRBcmc7CisgICAgfQorICAgIFJlc3VsdEJ1aWxkZXI6OlJlc3VsdEJ1aWxkZXIoICAgY2hhciBjb25zdCogbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogc2Vjb25kQXJnICkKKyAgICA6ICAgbV9hc3NlcnRpb25JbmZvKCBtYWNyb05hbWUsIGxpbmVJbmZvLCBjYXB0dXJlZEV4cHJlc3Npb25XaXRoU2Vjb25kQXJndW1lbnQoIGNhcHR1cmVkRXhwcmVzc2lvbiwgc2Vjb25kQXJnICksIHJlc3VsdERpc3Bvc2l0aW9uICksCisgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayggZmFsc2UgKSwKKyAgICAgICAgbV9zaG91bGRUaHJvdyggZmFsc2UgKSwKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiggZmFsc2UgKQorICAgIHt9CisKKyAgICBSZXN1bHRCdWlsZGVyOjp+UmVzdWx0QnVpbGRlcigpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmICggbV9ndWFyZEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtLm9zcyA8PCAiRXhjZXB0aW9uIHRyYW5zbGF0aW9uIHdhcyBkaXNhYmxlZCBieSBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFIjsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UmVzdWx0Q2FwdHVyZSgpLT5leGNlcHRpb25FYXJseVJlcG9ydGVkKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIFJlc3VsdEJ1aWxkZXImIFJlc3VsdEJ1aWxkZXI6OnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKSB7CisgICAgICAgIG1fZGF0YS5yZXN1bHRUeXBlID0gcmVzdWx0ID8gUmVzdWx0V2FzOjpPayA6IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6ZW5kRXhwcmVzc2lvbiggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCggZXhwciApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gKSB7CisgICAgICAgIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiA9IHJlc3VsdERpc3Bvc2l0aW9uOworICAgICAgICBtX3N0cmVhbS5vc3MgPDwgQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICBzZXRSZXN1bHRUeXBlKCByZXN1bHRUeXBlICk7CisgICAgICAgIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBleHBlY3RlZE1lc3NhZ2UgKSB7CisgICAgICAgIGlmKCBleHBlY3RlZE1lc3NhZ2UuZW1wdHkoKSApCisgICAgICAgICAgICBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaEFsbE9mPHN0ZDo6c3RyaW5nPigpICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkVxdWFscyggZXhwZWN0ZWRNZXNzYWdlICkgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiBjb25zdCYgbWF0Y2hlciApIHsKKworICAgICAgICBhc3NlcnQoICFpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworICAgICAgICBkYXRhLnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6Ok9rOworICAgICAgICBkYXRhLnJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gbV9hc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKworICAgICAgICBzdGQ6OnN0cmluZyBhY3R1YWxNZXNzYWdlID0gQ2F0Y2g6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICBpZiggIW1hdGNoZXIubWF0Y2goIGFjdHVhbE1lc3NhZ2UgKSApIHsKKyAgICAgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBhY3R1YWxNZXNzYWdlOworICAgICAgICB9CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cHJlc3Npb24oKSB7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBidWlsZCgpOworICAgICAgICBoYW5kbGVSZXN1bHQoIHJlc3VsdCApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6aGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApCisgICAgeworICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYXNzZXJ0aW9uRW5kZWQoIHJlc3VsdCApOworCisgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5zaG91bGREZWJ1Z0JyZWFrKCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkRGVidWdCcmVhayA9IHRydWU7CisgICAgICAgICAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSdW5uZXIoKS0+YWJvcnRpbmcoKSB8fCAobV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICYgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCkgKQorICAgICAgICAgICAgICAgIG1fc2hvdWxkVGhyb3cgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpyZWFjdCgpIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisgICAgICAgIGlmIChtX3Nob3VsZERlYnVnQnJlYWspIHsKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIC8vIFRvIGluc3BlY3QgdGhlIHN0YXRlIGR1cmluZyB0ZXN0LCB5b3UgbmVlZCB0byBnbyBvbmUgbGV2ZWwgdXAgdGhlIGNhbGxzdGFjaworICAgICAgICAgICAgLy8gVG8gZ28gYmFjayB0byB0aGUgdGVzdCBhbmQgY2hhbmdlIGV4ZWN1dGlvbiwganVtcCBvdmVyIHRoZSB0aHJvdyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmKCBtX3Nob3VsZFRocm93ICkKKyAgICAgICAgICAgIHRocm93IENhdGNoOjpUZXN0RmFpbHVyZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6c2hvdWxkRGVidWdCcmVhaygpIGNvbnN0IHsgcmV0dXJuIG1fc2hvdWxkRGVidWdCcmVhazsgfQorICAgIGJvb2wgUmVzdWx0QnVpbGRlcjo6YWxsb3dUaHJvd3MoKSBjb25zdCB7IHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5hbGxvd1Rocm93cygpOyB9CisKKyAgICBBc3NlcnRpb25SZXN1bHQgUmVzdWx0QnVpbGRlcjo6YnVpbGQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKCAqdGhpcyApOworICAgIH0KKworICAgIC8vIENBVkVBVDogVGhlIHJldHVybmVkIEFzc2VydGlvblJlc3VsdCBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCBleHByLAorICAgIC8vICAgICAgICAgYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sIHdoaWNoIGluIHR1cm4gaG9sZHMgcmVmZXJlbmNlcyB0bworICAgIC8vICAgICAgICAgb3BlcmFuZHMsIHBvc3NpYmx5IHRlbXBvcmFyeSBhcyB3ZWxsLgorICAgIC8vICAgICAgICAgSXQgc2hvdWxkIGltbWVkaWF0ZWx5IGJlIHBhc3NlZCB0byBoYW5kbGVSZXN1bHQ7IGlmIHRoZSBleHByZXNzaW9uCisgICAgLy8gICAgICAgICBuZWVkcyB0byBiZSByZXBvcnRlZCwgaXRzIHN0cmluZyBleHBhbnNpb24gbXVzdCBiZSBjb21wb3NlZCBiZWZvcmUKKyAgICAvLyAgICAgICAgIHRoZSB0ZW1wb3JhcmllcyBhcmUgZGVzdHJveWVkLgorICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBtX2RhdGEucmVzdWx0VHlwZSAhPSBSZXN1bHRXYXM6OlVua25vd24gKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhID0gbV9kYXRhOworCisgICAgICAgIC8vIEZsaXAgYm9vbCByZXN1bHRzIGlmIEZhbHNlVGVzdCBmbGFnIGlzIHNldAorICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkgeworICAgICAgICAgICAgZGF0YS5uZWdhdGUoIGV4cHIuaXNCaW5hcnlFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEubWVzc2FnZSA9IG1fc3RyZWFtLm9zcy5zdHIoKTsKKyAgICAgICAgZGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9ICZleHByOyAvLyBmb3IgbGF6eSByZWNvbnN0cnVjdGlvbgorICAgICAgICByZXR1cm4gQXNzZXJ0aW9uUmVzdWx0KCBtX2Fzc2VydGlvbkluZm8sIGRhdGEgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCB7CisgICAgICAgIGRlc3QgPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6c2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSB0cnVlOworICAgIH0KKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnVuc2V0RXhjZXB0aW9uR3VhcmQoKSB7CisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVGFnQWxpYXNSZWdpc3RyeTo6flRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgT3B0aW9uPFRhZ0FsaWFzPiBUYWdBbGlhc1JlZ2lzdHJ5OjpmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5maW5kKCBhbGlhcyApOworICAgICAgICBpZiggaXQgIT0gbV9yZWdpc3RyeS5lbmQoKSApCisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE9wdGlvbjxUYWdBbGlhcz4oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBUYWdBbGlhc1JlZ2lzdHJ5OjpleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgeworICAgICAgICBzdGQ6OnN0cmluZyBleHBhbmRlZFRlc3RTcGVjID0gdW5leHBhbmRlZFRlc3RTcGVjOworICAgICAgICBmb3IoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZWdpc3RyeS5iZWdpbigpLCBpdEVuZCA9IG1fcmVnaXN0cnkuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBvcyA9IGV4cGFuZGVkVGVzdFNwZWMuZmluZCggaXQtPmZpcnN0ICk7CisgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMgPSAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIDAsIHBvcyApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQudGFnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkVGVzdFNwZWMuc3Vic3RyKCBwb3MgKyBpdC0+Zmlyc3Quc2l6ZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cGFuZGVkVGVzdFNwZWM7CisgICAgfQorCisgICAgdm9pZCBUYWdBbGlhc1JlZ2lzdHJ5OjphZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIGlmKCAhc3RhcnRzV2l0aCggYWxpYXMsICJbQCIgKSB8fCAhZW5kc1dpdGgoIGFsaWFzLCAnXScgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgaXMgbm90IG9mIHRoZSBmb3JtIFtAYWxpYXMgbmFtZV0uXG4iCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OkZpbGVOYW1lICkKKyAgICAgICAgICAgICAgICA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKS5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICFtX3JlZ2lzdHJ5Lmluc2VydCggc3RkOjptYWtlX3BhaXIoIGFsaWFzLCBUYWdBbGlhcyggdGFnLCBsaW5lSW5mbyApICkgKS5zZWNvbmQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogdGFnIGFsaWFzLCBcIiIgPDwgYWxpYXMgPDwgIlwiIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIKKyAgICAgICAgICAgICAgICA8PCAiXHRGaXJzdCBzZWVuIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgZmluZChhbGlhcyktPmxpbmVJbmZvIDw8ICdcbicKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkgPDwgIlx0UmVkZWZpbmVkIGF0ICIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUpIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElUYWdBbGlhc1JlZ2lzdHJ5Ojp+SVRhZ0FsaWFzUmVnaXN0cnkoKSB7fQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICB9CisKKyAgICBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzKCBjaGFyIGNvbnN0KiBhbGlhcywgY2hhciBjb25zdCogdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGFnQWxpYXMoIGFsaWFzLCB0YWcsIGxpbmVJbmZvICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21hdGNoZXJzX3N0cmluZy5ocHAKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBDYXNlZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV9zdHIoIGFkanVzdFN0cmluZyggc3RyICkgKQorICAgICAgICB7fQorICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6YWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAgICAgICAgICAgICAgICAgPyB0b0xvd2VyKCBzdHIgKQorICAgICAgICAgICAgICAgICAgIDogc3RyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjpjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/ICIgKGNhc2UgaW5zZW5zaXRpdmUpIgorICAgICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlOjpTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKQorICAgICAgICA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApLAorICAgICAgICAgIG1fb3BlcmF0aW9uKCBvcGVyYXRpb24gKSB7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBTdHJpbmdNYXRjaGVyQmFzZTo6ZGVzY3JpYmUoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uLnJlc2VydmUoNSArIG1fb3BlcmF0aW9uLnNpemUoKSArIG1fY29tcGFyYXRvci5tX3N0ci5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKS5zaXplKCkpOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9vcGVyYXRpb247CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiOiBcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgRXF1YWxzTWF0Y2hlcjo6RXF1YWxzTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZXF1YWxzIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFcXVhbHNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSA9PSBtX2NvbXBhcmF0b3IubV9zdHI7CisgICAgICAgIH0KKworICAgICAgICBDb250YWluc01hdGNoZXI6OkNvbnRhaW5zTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiY29udGFpbnMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIENvbnRhaW5zTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXJ0c1dpdGhNYXRjaGVyOjpTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAic3RhcnRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIFN0YXJ0c1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBFbmRzV2l0aE1hdGNoZXI6OkVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKSA6IFN0cmluZ01hdGNoZXJCYXNlKCAiZW5kcyB3aXRoIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBFbmRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZworCisgICAgU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfbXVsdGkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9NVUxUSV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworY2xhc3MgTXVsdGlwbGVSZXBvcnRlcnMgOiBwdWJsaWMgU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+ID4gUmVwb3J0ZXJzOworICAgIFJlcG9ydGVycyBtX3JlcG9ydGVyczsKKworcHVibGljOgorICAgIHZvaWQgYWRkKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKSB7CisgICAgICAgIG1fcmVwb3J0ZXJzLnB1c2hfYmFjayggcmVwb3J0ZXIgKTsKKyAgICB9CisKK3B1YmxpYzogLy8gSVN0cmVhbWluZ1JlcG9ydGVyCisKKyAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiBtX3JlcG9ydGVyc1swXS0+Z2V0UHJlZmVyZW5jZXMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3BlYyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0UnVuU3RhcnRpbmcoIHRlc3RSdW5JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgYXNzZXJ0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5hc3NlcnRpb25TdGFydGluZyggYXNzZXJ0aW9uSW5mbyApOworICAgIH0KKworICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6CisgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGJvb2wgY2xlYXJCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIGNsZWFyQnVmZmVyIHw9ICgqaXQpLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgcmV0dXJuIGNsZWFyQnVmZmVyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNraXBUZXN0KCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworfTsKKworUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICkgeworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlc3VsdGluZ1JlcG9ydGVyOworCisgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKSB7CisgICAgICAgIE11bHRpcGxlUmVwb3J0ZXJzKiBtdWx0aSA9IGV4aXN0aW5nUmVwb3J0ZXItPnRyeUFzTXVsdGkoKTsKKyAgICAgICAgaWYoICFtdWx0aSApIHsKKyAgICAgICAgICAgIG11bHRpID0gbmV3IE11bHRpcGxlUmVwb3J0ZXJzOworICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiggbXVsdGkgKTsKKyAgICAgICAgICAgIGlmKCBleGlzdGluZ1JlcG9ydGVyICkKKyAgICAgICAgICAgICAgICBtdWx0aS0+YWRkKCBleGlzdGluZ1JlcG9ydGVyICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBleGlzdGluZ1JlcG9ydGVyOworICAgICAgICBtdWx0aS0+YWRkKCBhZGRpdGlvbmFsUmVwb3J0ZXIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGFkZGl0aW9uYWxSZXBvcnRlcjsKKworICAgIHJldHVybiByZXN1bHRpbmdSZXBvcnRlcjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfeG1sLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfWE1MX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVwb3J0ZXJfYmFzZXMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9CQVNFU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIC8vIEJlY2F1c2UgZm9ybWF0dGluZyB1c2luZyBjKysgc3RyZWFtcyBpcyBzdGF0ZWZ1bCwgZHJvcCBkb3duIHRvIEMgaXMgcmVxdWlyZWQKKyAgICAgICAgLy8gQWx0ZXJuYXRpdmVseSB3ZSBjb3VsZCB1c2Ugc3RyaW5nc3RyZWFtLCBidXQgaXRzIHBlcmZvcm1hbmNlIGlzLi4uIG5vdCBnb29kLgorICAgICAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWREdXJhdGlvbiggZG91YmxlIGR1cmF0aW9uICkgeworICAgICAgICAgICAgLy8gTWF4IGV4cG9uZW50ICsgMSBpcyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHdob2xlIHBhcnQKKyAgICAgICAgICAgIC8vICsgMSBmb3IgZGVjaW1hbCBwb2ludAorICAgICAgICAgICAgLy8gKyAzIGZvciB0aGUgMyBkZWNpbWFsIHBsYWNlcworICAgICAgICAgICAgLy8gKyAxIGZvciBudWxsIHRlcm1pbmF0b3IKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhEb3VibGVTaXplID0gREJMX01BWF8xMF9FWFAgKyAxICsgMSArIDMgKyAxOworICAgICAgICAgICAgY2hhciBidWZmZXJbbWF4RG91YmxlU2l6ZV07CisKKyAgICAgICAgICAgIC8vIFNhdmUgcHJldmlvdXMgZXJybm8sIHRvIHByZXZlbnQgc3ByaW50ZiBmcm9tIG92ZXJ3cml0aW5nIGl0CisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzcHJpbnRmX3MoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbHNlCisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RydWN0IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSA6IFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisKKyAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiBfdGVzdFJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8gPSBfdGVzdFJ1bkluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvID0gX2dyb3VwSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIF90ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8gPSBfdGVzdEluZm87CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIC8qIF9zZWN0aW9uU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiAvKiBfdGVzdENhc2VTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiAvKiBfdGVzdEdyb3VwU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiAvKiBfdGVzdFJ1blN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby5yZXNldCgpOworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIC8vIEl0IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworCisgICAgICAgIExhenlTdGF0PFRlc3RSdW5JbmZvPiBjdXJyZW50VGVzdFJ1bkluZm87CisgICAgICAgIExhenlTdGF0PEdyb3VwSW5mbz4gY3VycmVudEdyb3VwSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8VGVzdENhc2VJbmZvPiBjdXJyZW50VGVzdENhc2VJbmZvOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPiBtX3NlY3Rpb25TdGFjazsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3JlcG9ydGVyUHJlZnM7CisgICAgfTsKKworICAgIHN0cnVjdCBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hpbGROb2RlVD4KKyAgICAgICAgc3RydWN0IE5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgTm9kZSggVCBjb25zdCYgX3ZhbHVlICkgOiB2YWx1ZSggX3ZhbHVlICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfk5vZGUoKSB7fQorCisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxDaGlsZE5vZGVUPiA+IENoaWxkTm9kZXM7CisgICAgICAgICAgICBUIHZhbHVlOworICAgICAgICAgICAgQ2hpbGROb2RlcyBjaGlsZHJlbjsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFNlY3Rpb25Ob2RlIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlY3Rpb25Ob2RlKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zdGF0cyApIDogc3RhdHMoIF9zdGF0cyApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uTm9kZSgpOworCisgICAgICAgICAgICBib29sIG9wZXJhdG9yID09ICggU2VjdGlvbk5vZGUgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBvdGhlci5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggKm90aGVyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBzdGF0czsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IENoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBBc3NlcnRpb25zOworICAgICAgICAgICAgQ2hpbGRTZWN0aW9ucyBjaGlsZFNlY3Rpb25zOworICAgICAgICAgICAgQXNzZXJ0aW9ucyBhc3NlcnRpb25zOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCeVNlY3Rpb25JbmZvIHsKKyAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIgKSB7fQorICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggQnlTZWN0aW9uSW5mbyBjb25zdCYgb3RoZXIgKSA6IG1fb3RoZXIoIG90aGVyLm1fb3RoZXIgKSB7fQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcigpICggUHRyPFNlY3Rpb25Ob2RlPiBjb25zdCYgbm9kZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS0+c3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gbV9vdGhlci5saW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBCeVNlY3Rpb25JbmZvIGNvbnN0JiApOworICAgICAgICAgICAgU2VjdGlvbkluZm8gY29uc3QmIG1fb3RoZXI7CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RDYXNlU3RhdHMsIFNlY3Rpb25Ob2RlPiBUZXN0Q2FzZU5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0R3JvdXBTdGF0cywgVGVzdENhc2VOb2RlPiBUZXN0R3JvdXBOb2RlOworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdFJ1blN0YXRzLCBUZXN0R3JvdXBOb2RlPiBUZXN0UnVuTm9kZTsKKworICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBtX2NvbmZpZyggX2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKKyAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJlYW0oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIH5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJQcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyBpbmNvbXBsZXRlU3RhdHMoIHNlY3Rpb25JbmZvLCBDb3VudHMoKSwgMCwgZmFsc2UgKTsKKyAgICAgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbm9kZTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCAhbV9yb290U2VjdGlvbiApCisgICAgICAgICAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24gPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgIG5vZGUgPSBtX3Jvb3RTZWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUmIHBhcmVudE5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlOjpDaGlsZFNlY3Rpb25zOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmluZF9pZiggICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIHNlY3Rpb25JbmZvICkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpICkgeworICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IFNlY3Rpb25Ob2RlKCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAqaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24gPSBub2RlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgc2VjdGlvbk5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5wdXNoX2JhY2soIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgICAgICAvLyBBc3NlcnRpb25SZXN1bHQgaG9sZHMgYSBwb2ludGVyIHRvIGEgdGVtcG9yYXJ5IERlY29tcG9zZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgLy8gd2hpY2ggZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgY2FsbHMgdG8gYnVpbGQgdGhlIGV4cHJlc3Npb24gc3RyaW5nLgorICAgICAgICAgICAgLy8gT3VyIHNlY3Rpb24gc3RhY2sgY29weSBvZiB0aGUgYXNzZXJ0aW9uUmVzdWx0IHdpbGwgbGlrZWx5IG91dGxpdmUgdGhlCisgICAgICAgICAgICAvLyB0ZW1wb3JhcnksIHNvIGl0IG11c3QgYmUgZXhwYW5kZWQgb3IgZGlzY2FyZGVkIG5vdyB0byBhdm9pZCBjYWxsaW5nCisgICAgICAgICAgICAvLyBhIGRlc3Ryb3llZCBvYmplY3QgbGF0ZXIuCisgICAgICAgICAgICBwcmVwYXJlRXhwYW5kZWRFeHByZXNzaW9uKCBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJhY2soKS5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUmIG5vZGUgPSAqbV9zZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICAgICAgbm9kZS5zdGF0cyA9IHNlY3Rpb25TdGF0czsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdENhc2VOb2RlPiBub2RlID0gbmV3IFRlc3RDYXNlTm9kZSggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgYXNzZXJ0KCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPT0gMCApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4ucHVzaF9iYWNrKCBtX3Jvb3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX3Rlc3RDYXNlcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIG1fcm9vdFNlY3Rpb24ucmVzZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0KCBtX2RlZXBlc3RTZWN0aW9uICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRPdXQgPSB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZEVyciA9IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RHcm91cE5vZGU+IG5vZGUgPSBuZXcgVGVzdEdyb3VwTm9kZSggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAoIG1fdGVzdENhc2VzICk7CisgICAgICAgICAgICBtX3Rlc3RHcm91cHMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdFJ1bk5vZGU+IG5vZGUgPSBuZXcgVGVzdFJ1bk5vZGUoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0R3JvdXBzICk7CisgICAgICAgICAgICBtX3Rlc3RSdW5zLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIEFzc2VydGlvblJlc3VsdCYgcmVzdWx0ICkgY29uc3QgeworICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgIHN0ZDo6dmVjdG9yPEFzc2VydGlvblN0YXRzPiBtX2Fzc2VydGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiA+IG1fc2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0Q2FzZU5vZGU+ID4gbV90ZXN0Q2FzZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0R3JvdXBOb2RlPiA+IG1fdGVzdEdyb3VwczsKKworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdFJ1bk5vZGU+ID4gbV90ZXN0UnVuczsKKworICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG1fcm9vdFNlY3Rpb247CisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9kZWVwZXN0U2VjdGlvbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxjaGFyIEM+CisgICAgY2hhciBjb25zdCogZ2V0TGluZU9mQ2hhcnMoKSB7CisgICAgICAgIHN0YXRpYyBjaGFyIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEhdID0gezB9OworICAgICAgICBpZiggISpsaW5lICkgeworICAgICAgICAgICAgc3RkOjptZW1zZXQoIGxpbmUsIEMsIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKTsKKyAgICAgICAgICAgIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMV0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHN0cnVjdCBUZXN0RXZlbnRMaXN0ZW5lckJhc2UgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBUZXN0RXZlbnRMaXN0ZW5lckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF9yZXBvcnRlcl9yZWdpc3RyYXJzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfUkVHSVNUUkFSU19IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBJUmVwb3J0ZXJGYWN0b3J5IHsKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lSZXBvcnRlckFkYXB0ZXIoIG5ldyBUKCBjb25maWcgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIG5ldyBSZXBvcnRlckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIFJlcG9ydGVyRmFjdG9yeSA6IHB1YmxpYyBTaGFyZWRJbXBsPElSZXBvcnRlckZhY3Rvcnk+IHsKKworICAgICAgICAgICAgLy8gKioqIFBsZWFzZSBOb3RlICoqKjoKKyAgICAgICAgICAgIC8vIC0gSWYgeW91IGVuZCB1cCBoZXJlIGxvb2tpbmcgYXQgYSBjb21waWxlciBlcnJvciBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIHJlZ2lzdGVyCisgICAgICAgICAgICAvLyB5b3VyIGN1c3RvbSByZXBvcnRlciBjbGFzcyBiZSBhd2FyZSB0aGF0IHRoZSBuYXRpdmUgcmVwb3J0ZXIgaW50ZXJmYWNlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAvLyB0byBJU3RyZWFtaW5nUmVwb3J0ZXIuIFRoZSAibGVnYWN5IiBpbnRlcmZhY2UsIElSZXBvcnRlciwgaXMgc3RpbGwgc3VwcG9ydGVkIHZpYQorICAgICAgICAgICAgLy8gYW4gYWRhcHRlci4gSnVzdCB1c2UgUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBhZGFwdGVyLgorICAgICAgICAgICAgLy8gSG93ZXZlciBwbGVhc2UgY29uc2lkZXIgdXBkYXRpbmcgdG8gdGhlIG5ldyBpbnRlcmZhY2UgYXMgdGhlIG9sZCBvbmUgaXMgbm93CisgICAgICAgICAgICAvLyBkZXByZWNhdGVkIGFuZCB3aWxsIHByb2JhYmx5IGJlIHJlbW92ZWQgcXVpdGUgc29vbiEKKyAgICAgICAgICAgIC8vIFBsZWFzZSBjb250YWN0IG1lIHZpYSBnaXRodWIgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBhdCBhbGwgYWJvdXQgdGhpcy4KKyAgICAgICAgICAgIC8vIEluIGZhY3QsIGlkZWFsbHksIHBsZWFzZSBjb250YWN0IG1lIGFueXdheSB0byBsZXQgbWUga25vdyB5b3UndmUgaGl0IHRoaXMgLSBhcyBJIGhhdmUKKyAgICAgICAgICAgIC8vIG5vIGlkZWEgd2hvIGlzIGFjdHVhbGx5IHVzaW5nIGN1c3RvbSByZXBvcnRlcnMgYXQgYWxsIChwb3NzaWJseSBuby1vbmUhKS4KKyAgICAgICAgICAgIC8vIFRoZSBuZXcgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIG1pbmltaXNlIGV4cG9zdXJlIHRvIGludGVyZmFjZSBjaGFuZ2VzIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgUmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMaXN0ZW5lclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgTGlzdGVuZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVCggY29uZmlnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIExpc3RlbmVyUmVnaXN0cmFyKCkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJMaXN0ZW5lciggbmV3IExpc3RlbmVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkxlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyPHJlcG9ydGVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNyZXBvcnRlclR5cGUoIG5hbWUgKTsgfQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKy8vIERlcHJlY2F0ZWQgLSB1c2UgdGhlIGZvcm0gd2l0aG91dCBJTlRFUk5BTF8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIoIGxpc3RlbmVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9CisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9pbnRlcm5hbC9jYXRjaF94bWx3cml0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9YTUxXUklURVJfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFhtbEVuY29kZSB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIEZvcldoYXQgeyBGb3JUZXh0Tm9kZXMsIEZvckF0dHJpYnV0ZXMgfTsKKworICAgICAgICBYbWxFbmNvZGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIEZvcldoYXQgZm9yV2hhdCA9IEZvclRleHROb2RlcyApCisgICAgICAgIDogICBtX3N0ciggc3RyICksCisgICAgICAgICAgICBtX2ZvcldoYXQoIGZvcldoYXQgKQorICAgICAgICB7fQorCisgICAgICAgIHZvaWQgZW5jb2RlVG8oIHN0ZDo6b3N0cmVhbSYgb3MgKSBjb25zdCB7CisKKyAgICAgICAgICAgIC8vIEFwb3N0cm9waGUgZXNjYXBpbmcgbm90IG5lY2Vzc2FyeSBpZiB3ZSBhbHdheXMgdXNlICIgdG8gd3JpdGUgYXR0cmlidXRlcworICAgICAgICAgICAgLy8gKHNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgpCisKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX3N0ci5zaXplKCk7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gbV9zdHJbaV07CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzogICBvcyA8PCAiJmx0OyI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzogICBvcyA8PCAiJmFtcDsiOyBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNzeW50YXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID4gMiAmJiBtX3N0cltpLTFdID09ICddJyAmJiBtX3N0cltpLTJdID09ICddJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZndDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbV9mb3JXaGF0ID09IEZvckF0dHJpYnV0ZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICImcXVvdDsiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGNvbnRyb2wgY2hhcnMgLSBiYXNlZCBvbiBjb250cmlidXRpb24gYnkgQGVzcGVuYWxiIGluIFBSICM0NjUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSBAbXJwaSBQUiAjNTg4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggYyA+PSAwICYmIGMgPCAnXHgwOScgKSB8fCAoIGMgPiAnXHgwRCcgJiYgYyA8ICdceDIwJykgfHwgYz09J1x4N0YnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNDEwNy93aHktYXJlLWNvbnRyb2wtY2hhcmFjdGVycy1pbGxlZ2FsLWluLXhtbC0xLTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXFx4IiA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KCBjICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFhtbEVuY29kZSBjb25zdCYgeG1sRW5jb2RlICkgeworICAgICAgICAgICAgeG1sRW5jb2RlLmVuY29kZVRvKCBvcyApOworICAgICAgICAgICAgcmV0dXJuIG9zOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtX3N0cjsKKyAgICAgICAgRm9yV2hhdCBtX2ZvcldoYXQ7CisgICAgfTsKKworICAgIGNsYXNzIFhtbFdyaXRlciB7CisgICAgcHVibGljOgorCisgICAgICAgIGNsYXNzIFNjb3BlZEVsZW1lbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBYbWxXcml0ZXIqIHdyaXRlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIHdyaXRlciApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50KCBTY29wZWRFbGVtZW50IGNvbnN0JiBvdGhlciApCisgICAgICAgICAgICA6ICAgbV93cml0ZXIoIG90aGVyLm1fd3JpdGVyICl7CisgICAgICAgICAgICAgICAgb3RoZXIubV93cml0ZXIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB+U2NvcGVkRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBpZiggbV93cml0ZXIgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlci0+ZW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlVGV4dCggdGV4dCwgaW5kZW50ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXItPndyaXRlQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIG11dGFibGUgWG1sV3JpdGVyKiBtX3dyaXRlcjsKKyAgICAgICAgfTsKKworICAgICAgICBYbWxXcml0ZXIoKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIENhdGNoOjpjb3V0KCkgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIoIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgICA6ICAgbV90YWdJc09wZW4oIGZhbHNlICksCisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fb3MoIG9zICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgflhtbFdyaXRlcigpIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbV90YWdzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIGVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgc3RhcnRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICc8JyA8PCBuYW1lOworICAgICAgICAgICAgbV90YWdzLnB1c2hfYmFjayggbmFtZSApOworICAgICAgICAgICAgbV9pbmRlbnQgKz0gIiAgIjsKKyAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkRWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBTY29wZWRFbGVtZW50IHNjb3BlZCggdGhpcyApOworICAgICAgICAgICAgc3RhcnRFbGVtZW50KCBuYW1lICk7CisgICAgICAgICAgICByZXR1cm4gc2NvcGVkOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBlbmRFbGVtZW50KCkgeworICAgICAgICAgICAgbmV3bGluZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICBtX2luZGVudCA9IG1faW5kZW50LnN1YnN0ciggMCwgbV9pbmRlbnQuc2l6ZSgpLTIgKTsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICIvPiI7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwvIiA8PCBtX3RhZ3MuYmFjaygpIDw8ICI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgbV90YWdzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgc3RkOjpzdHJpbmcgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIGlmKCAhbmFtZS5lbXB0eSgpICYmICFhdHRyaWJ1dGUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCBYbWxFbmNvZGUoIGF0dHJpYnV0ZSwgWG1sRW5jb2RlOjpGb3JBdHRyaWJ1dGVzICkgPDwgJyInOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIGJvb2wgYXR0cmlidXRlICkgeworICAgICAgICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCAoIGF0dHJpYnV0ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBhdHRyaWJ1dGU7CisgICAgICAgICAgICByZXR1cm4gd3JpdGVBdHRyaWJ1dGUoIG5hbWUsIG9zcy5zdHIoKSApOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBib29sIGluZGVudCA9IHRydWUgKSB7CisgICAgICAgICAgICBpZiggIXRleHQuZW1wdHkoKSApeworICAgICAgICAgICAgICAgIGJvb2wgdGFnV2FzT3BlbiA9IG1fdGFnSXNPcGVuOworICAgICAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgICAgIGlmKCB0YWdXYXNPcGVuICYmIGluZGVudCApCisgICAgICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQ7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBYbWxFbmNvZGUoIHRleHQgKTsKKyAgICAgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQ29tbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgIjwhLS0iIDw8IHRleHQgPDwgIi0tPiI7CisgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU3R5bGVzaGVldFJlZiggc3RkOjpzdHJpbmcgY29uc3QmIHVybCApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cIiIgPDwgdXJsIDw8ICJcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUJsYW5rTGluZSgpIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCAnXG4nOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBlbnN1cmVUYWdDbG9zZWQoKSB7CisgICAgICAgICAgICBpZiggbV90YWdJc09wZW4gKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCAiPiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFhtbFdyaXRlciggWG1sV3JpdGVyIGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggWG1sV3JpdGVyIGNvbnN0JiApOworCisgICAgICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgICAgIG1fb3MgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbmV3bGluZUlmTmVjZXNzYXJ5KCkgeworICAgICAgICAgICAgaWYoIG1fbmVlZHNOZXdsaW5lICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIG1fdGFnSXNPcGVuOworICAgICAgICBib29sIG1fbmVlZHNOZXdsaW5lOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV90YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBtX2luZGVudDsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX29zOworICAgIH07CisKK30KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZWVuYWJsZV93YXJuaW5ncy5oCisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFRU5BQkxFX1dBUk5JTkdTX0hfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybworIyAgICAgICAgcHJhZ21hIHdhcm5pbmcocG9wKQorIyAgICBlbHNlCisjICAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBYbWxSZXBvcnRlciA6IHB1YmxpYyBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgWG1sUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV94bWwoX2NvbmZpZy5zdHJlYW0oKSksCisgICAgICAgICAgICBtX3NlY3Rpb25EZXB0aCggMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5YbWxSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgYW4gWE1MIGRvY3VtZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3R5bGVzaGVldFJlZigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNvdXJjZUluZm8oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBzb3VyY2VJbmZvICkgeworICAgICAgICAgICAgbV94bWwKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmaWxlbmFtZSIsIHNvdXJjZUluZm8uZmlsZSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibGluZSIsIHNvdXJjZUluZm8ubGluZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIFN0cmVhbWluZ1JlcG9ydGVyQmFzZQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggcyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHRlc3RJbmZvICk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZXNoZWV0UmVmID0gZ2V0U3R5bGVzaGVldFJlZigpOworICAgICAgICAgICAgaWYoICFzdHlsZXNoZWV0UmVmLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLndyaXRlU3R5bGVzaGVldFJlZiggc3R5bGVzaGVldFJlZiApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiQ2F0Y2giICk7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5uYW1lKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbV9jb25maWctPm5hbWUoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiR3JvdXAiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZVN0YXJ0aW5nKHRlc3RJbmZvKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlRlc3RDYXNlIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHRlc3RJbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZGVzY3JpcHRpb24iLCB0ZXN0SW5mby5kZXNjcmlwdGlvbiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidGFncyIsIHRlc3RJbmZvLnRhZ3NBc1N0cmluZyApOworCisgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHRlc3RJbmZvLmxpbmVJbmZvICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIG1fdGVzdENhc2VUaW1lci5zdGFydCgpOworICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25EZXB0aCsrID4gMCApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJTZWN0aW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCB0cmltKCBzZWN0aW9uSW5mby5uYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHNlY3Rpb25JbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCBzZWN0aW9uSW5mby5saW5lSW5mbyApOworICAgICAgICAgICAgICAgIG1feG1sLmVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworCisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgaWYoIGluY2x1ZGVSZXN1bHRzICkgeworICAgICAgICAgICAgICAgIC8vIFByaW50IGFueSBpbmZvIG1lc3NhZ2VzIGluIDxJbmZvPiB0YWdzLgorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IGFzc2VydGlvblN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGl0LT50eXBlID09IFJlc3VsdFdhczo6V2FybmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJXYXJuaW5nIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIGl0LT5tZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgICAgICBpZiggIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhwcmVzc2lvbiIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgcmVzdWx0LnN1Y2NlZWRlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk9yaWdpbmFsIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiRXhwYW5kZWQiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFuZC4uLiBQcmludCBhIHJlc3VsdCBhcHBsaWNhYmxlIHRvIGVhY2ggcmVzdWx0IHR5cGUuCisgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeGNlcHRpb24iICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmF0YWxFcnJvckNvbmRpdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiSW5mbyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FybmluZyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmFpbHVyZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApCisgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIHNlY3Rpb25TdGF0cyApOworICAgICAgICAgICAgaWYoIC0tbV9zZWN0aW9uRGVwdGggPiAwICkgeworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0gbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5wYXNzZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdCIgKTsKKyAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgdGVzdENhc2VTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5hbGxPaygpICk7CisKKyAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJkdXJhdGlvbkluU2Vjb25kcyIsIG1fdGVzdENhc2VUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZE91dCIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRFcnIiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApLCBmYWxzZSApOworCisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lciBtX3Rlc3RDYXNlVGltZXI7CisgICAgICAgIFhtbFdyaXRlciBtX3htbDsKKyAgICAgICAgaW50IG1fc2VjdGlvbkRlcHRoOworICAgIH07CisKKyAgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJ4bWwiLCBYbWxSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2p1bml0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfSlVOSVRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUaW1lc3RhbXAoKSB7CisgICAgICAgICAgICAvLyBCZXdhcmUsIHRoaXMgaXMgbm90IHJlZW50cmFudCBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWVzCisgICAgICAgICAgICAvLyBBbHNvLCBVVEMgb25seSwgYWdhaW4gYmVjYXVzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICgleiBpcyBDKysxMSkKKyAgICAgICAgICAgIHRpbWVfdCByYXd0aW1lOworICAgICAgICAgICAgc3RkOjp0aW1lKCZyYXd0aW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCB0aW1lU3RhbXBTaXplID0gc2l6ZW9mKCIyMDE3LTAxLTE2VDE3OjA2OjQ1WiIpOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6dG0gdGltZUluZm8gPSB7fTsKKyAgICAgICAgICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJnJhd3RpbWUpOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6dG0qIHRpbWVJbmZvOworICAgICAgICAgICAgdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmcmF3dGltZSk7CisjZW5kaWYKKworICAgICAgICAgICAgY2hhciB0aW1lU3RhbXBbdGltZVN0YW1wU2l6ZV07CisgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgZm10ID0gIiVZLSVtLSVkVCVIOiVNOiVTWiI7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgJnRpbWVJbmZvKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCB0aW1lSW5mbyk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0aW1lU3RhbXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGFzcyBKdW5pdFJlcG9ydGVyIDogcHVibGljIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgSnVuaXRSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgeG1sKCBfY29uZmlnLnN0cmVhbSgpICksCisgICAgICAgICAgICBtX29rVG9GYWlsKCBmYWxzZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5KdW5pdFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBpbiBhbiBYTUwgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSBBbnQncyBqdW5pdHJlcG9ydCB0YXJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiAvKnNwZWMqLyApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuU3RhcnRpbmcoIHJ1bkluZm8gKTsKKyAgICAgICAgICAgIHhtbC5zdGFydEVsZW1lbnQoICJ0ZXN0c3VpdGVzIiApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN1aXRlVGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIHN0ZE91dEZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZS5zdHIoIiIpOworICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMgPSAwOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9va1RvRmFpbCA9IHRlc3RDYXNlSW5mby5va1RvRmFpbCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiAmJiAhbV9va1RvRmFpbCApCisgICAgICAgICAgICAgICAgdW5leHBlY3RlZEV4Y2VwdGlvbnMrKzsKKyAgICAgICAgICAgIHJldHVybiBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjphc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUgPDwgdGVzdENhc2VTdGF0cy5zdGRPdXQ7CisgICAgICAgICAgICBzdGRFcnJGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgZG91YmxlIHN1aXRlVGltZSA9IHN1aXRlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgd3JpdGVHcm91cCggKm1fdGVzdEdyb3Vwcy5iYWNrKCksIHN1aXRlVGltZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICB4bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUdyb3VwKCBUZXN0R3JvdXBOb2RlIGNvbnN0JiBncm91cE5vZGUsIGRvdWJsZSBzdWl0ZVRpbWUgKSB7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdHN1aXRlIiApOworICAgICAgICAgICAgVGVzdEdyb3VwU3RhdHMgY29uc3QmIHN0YXRzID0gZ3JvdXBOb2RlLnZhbHVlOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHN0YXRzLmdyb3VwSW5mby5uYW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJlcnJvcnMiLCB1bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQtdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRlc3RzIiwgc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiaG9zdG5hbWUiLCAidGJkIiApOyAvLyAhVEJECisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpOZXZlciApCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsICIiICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIHN1aXRlVGltZSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZXN0YW1wIiwgZ2V0Q3VycmVudFRpbWVzdGFtcCgpICk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRlc3QgY2FzZXMKKyAgICAgICAgICAgIGZvciggVGVzdEdyb3VwTm9kZTo6Q2hpbGROb2Rlczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBncm91cE5vZGUuY2hpbGRyZW4uYmVnaW4oKSwgaXRFbmQgPSBncm91cE5vZGUuY2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZVRlc3RDYXNlKCAqKml0ICk7CisKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZE91dEZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzdGRFcnJGb3JTdWl0ZS5zdHIoKSApLCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVRlc3RDYXNlKCBUZXN0Q2FzZU5vZGUgY29uc3QmIHRlc3RDYXNlTm9kZSApIHsKKyAgICAgICAgICAgIFRlc3RDYXNlU3RhdHMgY29uc3QmIHN0YXRzID0gdGVzdENhc2VOb2RlLnZhbHVlOworCisgICAgICAgICAgICAvLyBBbGwgdGVzdCBjYXNlcyBoYXZlIGV4YWN0bHkgb25lIHNlY3Rpb24gLSB3aGljaCByZXByZXNlbnRzIHRoZQorICAgICAgICAgICAgLy8gdGVzdCBjYXNlIGl0c2VsZi4gVGhhdCBzZWN0aW9uIG1heSBoYXZlIDAtbiBuZXN0ZWQgc2VjdGlvbnMKKyAgICAgICAgICAgIGFzc2VydCggdGVzdENhc2VOb2RlLmNoaWxkcmVuLnNpemUoKSA9PSAxICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgcm9vdFNlY3Rpb24gPSAqdGVzdENhc2VOb2RlLmNoaWxkcmVuLmZyb250KCk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZSA9IHN0YXRzLnRlc3RJbmZvLmNsYXNzTmFtZTsKKworICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCByb290U2VjdGlvbi5jaGlsZFNlY3Rpb25zLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCAiIiwgcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTZWN0aW9uKCAgc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcm9vdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRyaW0oIHNlY3Rpb25Ob2RlLnN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIGlmKCAhcm9vdE5hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbmFtZSA9IHJvb3ROYW1lICsgJy8nICsgbmFtZTsKKworICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkT3V0LmVtcHR5KCkgfHwKKyAgICAgICAgICAgICAgICAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RjYXNlIiApOworICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiY2xhc3NuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgInJvb3QiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIENhdGNoOjp0b1N0cmluZyggc2VjdGlvbk5vZGUuc3RhdHMuZHVyYXRpb25JblNlY29uZHMgKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVBc3NlcnRpb25zKCBzZWN0aW9uTm9kZSApOworCisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLW91dCIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZE91dCApLCBmYWxzZSApOworICAgICAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzZWN0aW9uTm9kZS5zdGRFcnIgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IHNlY3Rpb25Ob2RlLmNoaWxkU2VjdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIG5hbWUsICIiLCAqKml0ICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIGNsYXNzTmFtZSwgbmFtZSwgKippdCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbnMoIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSApIHsKKyAgICAgICAgICAgIGZvciggU2VjdGlvbk5vZGU6OkFzc2VydGlvbnM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5iZWdpbigpLCBpdEVuZCA9IHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbiggKml0ICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbiggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzICkgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBzdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisgICAgICAgICAgICBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZWxlbWVudE5hbWU7CisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgc2VlIHRoZXNlIGhlcmU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJpbnRlcm5hbEVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoIGVsZW1lbnROYW1lICk7CisKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJtZXNzYWdlIiwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgaWYoICFyZXN1bHQuZ2V0TWVzc2FnZSgpLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBvc3MgPDwgcmVzdWx0LmdldE1lc3NhZ2UoKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCBpdC0+bWVzc2FnZSA8PCAnXG4nOworCisgICAgICAgICAgICAgICAgb3NzIDw8ICJhdCAiIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgeG1sLndyaXRlVGV4dCggb3NzLnN0cigpLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyIHhtbDsKKyAgICAgICAgVGltZXIgc3VpdGVUaW1lcjsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ZE91dEZvclN1aXRlOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkRXJyRm9yU3VpdGU7CisgICAgICAgIHVuc2lnbmVkIGludCB1bmV4cGVjdGVkRXhjZXB0aW9uczsKKyAgICAgICAgYm9vbCBtX29rVG9GYWlsOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImp1bml0IiwgSnVuaXRSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbnNvbGUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT05TT0xFX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNzdGRpbz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb25zb2xlUmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworICAgICAgICBDb25zb2xlUmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApLAorICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkKCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29uc29sZVJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgYXMgcGxhaW4gbGluZXMgb2YgdGV4dCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3QgY2FzZXMgbWF0Y2hlZCAnIiA8PCBzcGVjIDw8ICdcJycgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBpbmNsdWRlUmVzdWx0cyA9IG1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSB8fCAhcmVzdWx0LmlzT2soKTsKKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgbGF6eVByaW50KCk7CisKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIgcHJpbnRlciggc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIGluY2x1ZGVSZXN1bHRzICk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCk7CisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25TdGFydGluZyggX3NlY3Rpb25JbmZvICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIF9zZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMgKSB7CisgICAgICAgICAgICAgICAgbGF6eVByaW50KCk7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gc2VjdGlvbiI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiB0ZXN0IGNhc2UiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCAiJ1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBfc2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIF90ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiBfdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggY3VycmVudEdyb3VwSW5mby51c2VkICkgeworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeURpdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlN1bW1hcnkgZm9yIGdyb3VwICciIDw8IF90ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSA8PCAiJzpcbiI7CisgICAgICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0R3JvdXBTdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCBfdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBwcmludFRvdGFsc0RpdmlkZXIoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIGNsYXNzIEFzc2VydGlvblByaW50ZXIgeworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0gKCBBc3NlcnRpb25QcmludGVyIGNvbnN0JiApOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfc3RhdHMsIGJvb2wgX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIDogICBzdHJlYW0oIF9zdHJlYW0gKSwKKyAgICAgICAgICAgICAgICBzdGF0cyggX3N0YXRzICksCisgICAgICAgICAgICAgICAgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgICAgICAgICAgY29sb3VyKCBDb2xvdXI6Ok5vbmUgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlKCByZXN1bHQuZ2V0TWVzc2FnZSgpICksCisgICAgICAgICAgICAgICAgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKSwKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyggX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiUEFTU0VEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoIHJlc3VsdC5oYXNNZXNzYWdlKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIC0gYnV0IHdhcyBvayI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoICI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiYmVjYXVzZSBubyBleGNlcHRpb24gd2FzIHRocm93biB3aGVyZSBvbmUgd2FzIGV4cGVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJpbmZvIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3YXJuaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImV4cGxpY2l0bHkgd2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIioqIGludGVybmFsIGVycm9yICoqIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYoIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzT3JGYWlsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBwYXNzT3JGYWlsIDw8ICI6XG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpPcmlnaW5hbEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCAiICAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cHJlc3Npb25Jbk1hY3JvKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIndpdGggZXhwYW5zaW9uOlxuIjsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlY29uc3RydWN0ZWRFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCksIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIW1lc3NhZ2VMYWJlbC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IG1lc3NhZ2VMYWJlbCA8PCAnOicgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5iZWdpbigpLCBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFzc2VydGlvbiBpcyBhIHdhcm5pbmcgaWdub3JlIGFueSBJTkZPIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmludEluZm9NZXNzYWdlcyB8fCBpdC0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIGl0LT5tZXNzYWdlLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgIjogIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXNzT3JGYWlsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZUxhYmVsOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBsYXp5UHJpbnQoKSB7CisKKyAgICAgICAgICAgIGlmKCAhY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludFJ1bkluZm8oKTsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby51c2VkICkKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnRHcm91cEluZm8oKTsKKworICAgICAgICAgICAgaWYoICFtX2hlYWRlclByaW50ZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKTsKKyAgICAgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50UnVuSW5mbygpIHsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgJ1xuJyA8PCBnZXRMaW5lT2ZDaGFyczwnfic+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6U2Vjb25kYXJ5VGV4dCApOworICAgICAgICAgICAgc3RyZWFtICA8PCBjdXJyZW50VGVzdFJ1bkluZm8tPm5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBhIENhdGNoIHYiICA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICIgaG9zdCBhcHBsaWNhdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlJ1biB3aXRoIC0/IGZvciBvcHRpb25zXG5cbiI7CisKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDAgKQorICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiUmFuZG9tbmVzcyBzZWVkZWQgdG86ICIgPDwgbV9jb25maWctPnJuZ1NlZWQoKSA8PCAiXG5cbiI7CisKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby51c2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGxhenlQcmludEdyb3VwSW5mbygpIHsKKyAgICAgICAgICAgIGlmKCAhY3VycmVudEdyb3VwSW5mby0+bmFtZS5lbXB0eSgpICYmIGN1cnJlbnRHcm91cEluZm8tPmdyb3Vwc0NvdW50cyA+IDEgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRDbG9zZWRIZWFkZXIoICJHcm91cDogIiArIGN1cnJlbnRHcm91cEluZm8tPm5hbWUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnVzZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBwcmludE9wZW5IZWFkZXIoIGN1cnJlbnRUZXN0Q2FzZUluZm8tPm5hbWUgKTsKKworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkhlYWRlcnMgKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25JbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtX3NlY3Rpb25TdGFjay5iZWdpbigpKzEsIC8vIFNraXAgZmlyc3Qgc2VjdGlvbiAodGVzdCBjYXNlKQorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fc2VjdGlvblN0YWNrLmVuZCgpOworICAgICAgICAgICAgICAgIGZvciggOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBpdC0+bmFtZSwgMiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbyA9IG1fc2VjdGlvblN0YWNrLmJhY2soKS5saW5lSW5mbzsKKworICAgICAgICAgICAgaWYoICFsaW5lSW5mby5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRDbG9zZWRIZWFkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIHsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggX25hbWUgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLic+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50T3BlbkhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgc3RyZWFtICA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworICAgICAgICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKCBfbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgc3RyaW5nIGhhcyBhIDogaW4gZmlyc3QgbGluZSB3aWxsIHNldCBpbmRlbnQgdG8gZm9sbG93IGl0IG9uCisgICAgICAgIC8vIHN1YnNlcXVlbnQgbGluZXMKKyAgICAgICAgdm9pZCBwcmludEhlYWRlclN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcsIHN0ZDo6c2l6ZV90IGluZGVudCA9IDAgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpID0gX3N0cmluZy5maW5kKCAiOiAiICk7CisgICAgICAgICAgICBpZiggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgaSs9MjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCBfc3RyaW5nLCBUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50K2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIGluZGVudCApICkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBTdW1tYXJ5Q29sdW1uIHsKKworICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiggc3RkOjpzdHJpbmcgY29uc3QmIF9sYWJlbCwgQ29sb3VyOjpDb2RlIF9jb2xvdXIgKQorICAgICAgICAgICAgOiAgIGxhYmVsKCBfbGFiZWwgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIF9jb2xvdXIgKQorICAgICAgICAgICAge30KKyAgICAgICAgICAgIFN1bW1hcnlDb2x1bW4gYWRkUm93KCBzdGQ6OnNpemVfdCBjb3VudCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCBjb3VudDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByb3cgPSBvc3Muc3RyKCk7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcm93cy5iZWdpbigpOyBpdCAhPSByb3dzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA8IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgKml0ID0gJyAnICsgKml0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaXQtPnNpemUoKSA+IHJvdy5zaXplKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gJyAnICsgcm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3dzLnB1c2hfYmFjayggcm93ICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsYWJlbDsKKyAgICAgICAgICAgIENvbG91cjo6Q29kZSBjb2xvdXI7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcm93czsKKworICAgICAgICB9OworCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8ICJObyB0ZXN0cyByYW5cbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCAmJiB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApIDw8ICJBbGwgdGVzdHMgcGFzc2VkIjsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiApIDw8ICcpJworICAgICAgICAgICAgICAgICAgICAgICAgPDwgJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29sdW1uczsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggIiIsIENvbG91cjo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggInBhc3NlZCIsIENvbG91cjo6U3VjY2VzcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJmYWlsZWQiLCBDb2xvdXI6OlJlc3VsdEVycm9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCBhcyBleHBlY3RlZCIsIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApICk7CisKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlSb3coICJ0ZXN0IGNhc2VzIiwgY29sdW1ucywgMCApOworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggImFzc2VydGlvbnMiLCBjb2x1bW5zLCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlSb3coIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCwgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29uc3QmIGNvbHMsIHN0ZDo6c2l6ZV90IHJvdyApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29scy5iZWdpbigpOyBpdCAhPSBjb2xzLmVuZCgpOyArK2l0ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gaXQtPnJvd3Nbcm93XTsKKyAgICAgICAgICAgICAgICBpZiggaXQtPmxhYmVsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBsYWJlbCA8PCAiOiAiOworICAgICAgICAgICAgICAgICAgICBpZiggdmFsdWUgIT0gIjAiICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIi0gbm9uZSAtIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggdmFsdWUgIT0gIjAiICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggQ29sb3VyOjpMaWdodEdyZXkgKSA8PCAiIHwgIjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCBDb2xvdXIoIGl0LT5jb2xvdXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICcgJyA8PCBpdC0+bGFiZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QgbWFrZVJhdGlvKCBzdGQ6OnNpemVfdCBudW1iZXIsIHN0ZDo6c2l6ZV90IHRvdGFsICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcmF0aW8gPSB0b3RhbCA+IDAgPyBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAqIG51bWJlci8gdG90YWwgOiAwOworICAgICAgICAgICAgcmV0dXJuICggcmF0aW8gPT0gMCAmJiBudW1iZXIgPiAwICkgPyAxIDogcmF0aW87CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90JiBmaW5kTWF4KCBzdGQ6OnNpemVfdCYgaSwgc3RkOjpzaXplX3QmIGosIHN0ZDo6c2l6ZV90JiBrICkgeworICAgICAgICAgICAgaWYoIGkgPiBqICYmIGkgPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGogPiBrICkKKyAgICAgICAgICAgICAgICByZXR1cm4gajsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHNEaXZpZGVyKCBUb3RhbHMgY29uc3QmIHRvdGFscyApIHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPiAwICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZFJhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2tSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPaywgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcGFzc2VkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICkrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSggZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICkKKyAgICAgICAgICAgICAgICAgICAgZmluZE1heCggZmFpbGVkUmF0aW8sIGZhaWxlZEJ1dE9rUmF0aW8sIHBhc3NlZFJhdGlvICktLTsKKworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6RXJyb3IgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0RXhwZWN0ZWRGYWlsdXJlICkgPDwgc3RkOjpzdHJpbmcoIGZhaWxlZEJ1dE9rUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLmFsbFBhc3NlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6U3VjY2VzcyApIDw8IHN0ZDo6c3RyaW5nKCBwYXNzZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCBzdGQ6OnN0cmluZyggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSwgJz0nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeURpdmlkZXIoKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbV9oZWFkZXJQcmludGVkOworICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbnNvbGUiLCBDb25zb2xlUmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9jb21wYWN0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQ09NUEFDVF9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb21wYWN0UmVwb3J0ZXIgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UgeworCisgICAgICAgIENvbXBhY3RSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggX2NvbmZpZyApCisgICAgICAgIHt9CisKKyAgICAgICAgdmlydHVhbCB+Q29tcGFjdFJlcG9ydGVyKCk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBvbiBhIHNpbmdsZSBsaW5lLCBzdWl0YWJsZSBmb3IgSURFcyI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7CisgICAgICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIHByZWZzOworICAgICAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBwcmVmczsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlJ3JlIG5vdCBwcmludGluZyB0aG9zZQorICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgJiYgcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgcHJpbnRJbmZvTWVzc2FnZXMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmIChtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cykgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIF90ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiBzdHJlYW0oIF9zdHJlYW0gKQorICAgICAgICAgICAgLCBzdGF0cyggX3N0YXRzICkKKyAgICAgICAgICAgICwgcmVzdWx0KCBfc3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICkKKyAgICAgICAgICAgICwgbWVzc2FnZXMoIF9zdGF0cy5pbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgLCBpdE1lc3NhZ2UoIF9zdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSApCisgICAgICAgICAgICAsIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKworICAgICAgICAgICAgICAgIGl0TWVzc2FnZSA9IG1lc3NhZ2VzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpSZXN1bHRTdWNjZXNzLCBwYXNzZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIGZhaWxlZFN0cmluZygpICsgc3RkOjpzdHJpbmcoICIgLSBidXQgd2FzIG9rIiApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAidW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZmF0YWwgZXJyb3IgY29uZGl0aW9uIHdpdGggbWVzc2FnZToiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGVjdGVkIGV4Y2VwdGlvbiwgZ290IG5vbmUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpOb25lLCAiaW5mbyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJ3YXJuaW5nIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJleHBsaWNpdGx5IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpOb25lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsICIqKiBpbnRlcm5hbCBlcnJvciAqKiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLy8gQ29sb3VyOjpMaWdodEdyZXkKKworICAgICAgICAgICAgc3RhdGljIENvbG91cjo6Q29kZSBkaW1Db2xvdXIoKSB7IHJldHVybiBDb2xvdXI6OkZpbGVOYW1lOyB9CisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWlsZWRTdHJpbmcoKSB7IHJldHVybiAiRkFJTEVEIjsgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBhc3NlZFN0cmluZygpIHsgcmV0dXJuICJQQVNTRUQiOyB9CisjZWxzZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJmYWlsZWQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gInBhc3NlZCI7IH0KKyNlbmRpZgorCisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAnOic7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkNvZGUgY29sb3VyLCBzdGQ6OnN0cmluZyBjb25zdCYgcGFzc09yRmFpbCApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcGFzc09yRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJzonOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludElzc3VlKCBzdGQ6OnN0cmluZyBjb25zdCYgaXNzdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBpc3N1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludEV4cHJlc3Npb25XYXMoKSB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOyc7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBleHByZXNzaW9uIHdhczoiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHBhbmRlZEV4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGZvcjogIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludE1lc3NhZ2UoKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgIT0gbWVzc2FnZXMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICArK2l0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpDb2RlIGNvbG91ciA9IGRpbUNvbG91cigpICkgeworICAgICAgICAgICAgICAgIGlmICggaXRNZXNzYWdlID09IG1lc3NhZ2VzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gdXNpbmcgbWVzc2FnZXMuZW5kKCkgZGlyZWN0bHkgeWllbGRzIGNvbXBpbGF0aW9uIGVycm9yOgorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBOID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBzdGQ6OmRpc3RhbmNlKCBpdE1lc3NhZ2UsIGl0RW5kICkgKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgd2l0aCAiIDw8IHBsdXJhbGlzZSggTiwgIm1lc3NhZ2UiICkgPDwgJzonOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcig7IGl0TWVzc2FnZSAhPSBpdEVuZDsgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0TWVzc2FnZS0+dHlwZSAhPSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBpdE1lc3NhZ2UtPm1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKytpdE1lc3NhZ2UgIT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGFuZCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICAgICAgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbWVzc2FnZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0TWVzc2FnZTsKKyAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXM7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ29sb3VyLCBtZXNzYWdlIHZhcmlhbnRzOgorICAgICAgICAvLyAtIHdoaXRlOiBObyB0ZXN0cyByYW4uCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcywgZmFpbGVkIFtib3RoL2FsbF0gTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIHdoaXRlOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMgKG5vIGFzc2VydGlvbnMpLgorICAgICAgICAvLyAtICAgcmVkOiBGYWlsZWQgTiB0ZXN0cyBjYXNlcywgZmFpbGVkIE0gYXNzZXJ0aW9ucy4KKyAgICAgICAgLy8gLSBncmVlbjogUGFzc2VkIFtib3RoL2FsbF0gTiB0ZXN0cyBjYXNlcyB3aXRoIE0gYXNzZXJ0aW9ucy4KKworICAgICAgICBzdGQ6OnN0cmluZyBib3RoT3JBbGwoIHN0ZDo6c2l6ZV90IGNvdW50ICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ID09IDEgPyBzdGQ6OnN0cmluZygpIDogY291bnQgPT0gMiA/ICJib3RoICIgOiAiYWxsICIgOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggY29uc3QgVG90YWxzJiB0b3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0cyByYW4uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID09IHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcXVhbGlmeV9hc3NlcnRpb25zX2ZhaWxlZCA9CisgICAgICAgICAgICAgICAgICAgIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhPckFsbCggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgOiBzdGQ6OnN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSwgInRlc3QgY2FzZSIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAobm8gYXNzZXJ0aW9ucykuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIiAgKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgIiA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIgICkgPDwKKyAgICAgICAgICAgICAgICAgICAgIiB3aXRoICIgIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggImNvbXBhY3QiLCBDb21wYWN0UmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICAvLyBUaGVzZSBhcmUgYWxsIGhlcmUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbm90IGhhdmluZyBhbnkgb3V0IG9mIGxpbmUKKyAgICAvLyB2aXJ0dWFsIG1ldGhvZHMKKyAgICBOb25Db3B5YWJsZTo6fk5vbkNvcHlhYmxlKCkge30KKyAgICBJU2hhcmVkOjp+SVNoYXJlZCgpIHt9CisgICAgSVN0cmVhbTo6fklTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIEZpbGVTdHJlYW06On5GaWxlU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBDb3V0U3RyZWFtOjp+Q291dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRGVidWdPdXRTdHJlYW06On5EZWJ1Z091dFN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgU3RyZWFtQnVmQmFzZTo6flN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIElDb250ZXh0Ojp+SUNvbnRleHQoKSB7fQorICAgIElSZXN1bHRDYXB0dXJlOjp+SVJlc3VsdENhcHR1cmUoKSB7fQorICAgIElUZXN0Q2FzZTo6fklUZXN0Q2FzZSgpIHt9CisgICAgSVRlc3RDYXNlUmVnaXN0cnk6On5JVGVzdENhc2VSZWdpc3RyeSgpIHt9CisgICAgSVJlZ2lzdHJ5SHViOjp+SVJlZ2lzdHJ5SHViKCkge30KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViOjp+SU11dGFibGVSZWdpc3RyeUh1YigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3I6On5JRXhjZXB0aW9uVHJhbnNsYXRvcigpIHt9CisgICAgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTo6fklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSB7fQorICAgIElSZXBvcnRlcjo6fklSZXBvcnRlcigpIHt9CisgICAgSVJlcG9ydGVyRmFjdG9yeTo6fklSZXBvcnRlckZhY3RvcnkoKSB7fQorICAgIElSZXBvcnRlclJlZ2lzdHJ5Ojp+SVJlcG9ydGVyUmVnaXN0cnkoKSB7fQorICAgIElTdHJlYW1pbmdSZXBvcnRlcjo6fklTdHJlYW1pbmdSZXBvcnRlcigpIHt9CisgICAgQXNzZXJ0aW9uU3RhdHM6On5Bc3NlcnRpb25TdGF0cygpIHt9CisgICAgU2VjdGlvblN0YXRzOjp+U2VjdGlvblN0YXRzKCkge30KKyAgICBUZXN0Q2FzZVN0YXRzOjp+VGVzdENhc2VTdGF0cygpIHt9CisgICAgVGVzdEdyb3VwU3RhdHM6On5UZXN0R3JvdXBTdGF0cygpIHt9CisgICAgVGVzdFJ1blN0YXRzOjp+VGVzdFJ1blN0YXRzKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjpTZWN0aW9uTm9kZTo6flNlY3Rpb25Ob2RlKCkge30KKyAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp+Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSgpIHt9CisKKyAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6On5TdHJlYW1pbmdSZXBvcnRlckJhc2UoKSB7fQorICAgIENvbnNvbGVSZXBvcnRlcjo6fkNvbnNvbGVSZXBvcnRlcigpIHt9CisgICAgQ29tcGFjdFJlcG9ydGVyOjp+Q29tcGFjdFJlcG9ydGVyKCkge30KKyAgICBJUnVubmVyOjp+SVJ1bm5lcigpIHt9CisgICAgSU11dGFibGVDb250ZXh0Ojp+SU11dGFibGVDb250ZXh0KCkge30KKyAgICBJQ29uZmlnOjp+SUNvbmZpZygpIHt9CisgICAgWG1sUmVwb3J0ZXI6On5YbWxSZXBvcnRlcigpIHt9CisgICAgSnVuaXRSZXBvcnRlcjo6fkp1bml0UmVwb3J0ZXIoKSB7fQorICAgIFRlc3RSZWdpc3RyeTo6flRlc3RSZWdpc3RyeSgpIHt9CisgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2U6On5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpIHt9CisgICAgSUdlbmVyYXRvckluZm86On5JR2VuZXJhdG9ySW5mbygpIHt9CisgICAgSUdlbmVyYXRvcnNGb3JUZXN0Ojp+SUdlbmVyYXRvcnNGb3JUZXN0KCkge30KKyAgICBXaWxkY2FyZFBhdHRlcm46On5XaWxkY2FyZFBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpQYXR0ZXJuOjp+UGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6Ok5hbWVQYXR0ZXJuOjp+TmFtZVBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpUYWdQYXR0ZXJuOjp+VGFnUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybjo6fkV4Y2x1ZGVkUGF0dGVybigpIHt9CisgICAgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJVbnR5cGVkQmFzZTo6fk1hdGNoZXJVbnR5cGVkQmFzZSgpIHt9CisKKyAgICB2b2lkIENvbmZpZzo6ZHVtbXkoKSB7fQorCisgICAgbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcgeworICAgICAgICBJVHJhY2tlcjo6fklUcmFja2VyKCkge30KKyAgICAgICAgVHJhY2tlckJhc2U6On5UcmFja2VyQmFzZSgpIHt9CisgICAgICAgIFNlY3Rpb25UcmFja2VyOjp+U2VjdGlvblRyYWNrZXIoKSB7fQorICAgICAgICBJbmRleFRyYWNrZXI6On5JbmRleFRyYWNrZXIoKSB7fQorICAgIH0KK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX01BSU4KKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9kZWZhdWx0X21haW4uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUZBVUxUX01BSU5fSFBQX0lOQ0xVREVECisKKyNpZm5kZWYgX19PQkpDX18KKworI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKERPX05PVF9VU0VfV01BSU4pCisvLyBTdGFuZGFyZCBDL0MrKyBXaW4zMiBVbmljb2RlIHdtYWluIGVudHJ5IHBvaW50CitleHRlcm4gIkMiIGludCB3bWFpbiAoaW50IGFyZ2MsIHdjaGFyX3QgKiBhcmd2W10sIHdjaGFyX3QgKiBbXSkgeworI2Vsc2UKKy8vIFN0YW5kYXJkIEMvQysrIG1haW4gZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkgeworI2VuZGlmCisKKwlpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIGFyZ3YgKTsKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZWxzZSAvLyBfX09CSkNfXworCisvLyBPYmplY3RpdmUtQyBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKSB7CisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisjZW5kaWYKKworICAgIENhdGNoOjpyZWdpc3RlclRlc3RNZXRob2RzKCk7CisgICAgaW50IHJlc3VsdCA9IENhdGNoOjpTZXNzaW9uKCkucnVuKCBhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAorICAgIFtwb29sIGRyYWluXTsKKyNlbmRpZgorCisgICAgcmV0dXJuICggcmVzdWx0IDwgMHhmZiA/IHJlc3VsdCA6IDB4ZmYgKTsKK30KKworI2VuZGlmIC8vIF9fT0JKQ19fCisKKyNlbmRpZgorCisjaWZkZWYgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgIHVuZGVmIENMQVJBX0NPTkZJR19NQUlOCisjZW5kaWYKKworLy8vLy8vCisKKy8vIElmIHRoaXMgY29uZmlnIGlkZW50aWZpZXIgaXMgZGVmaW5lZCB0aGVuIGFsbCBDQVRDSCBtYWNyb3MgYXJlIHByZWZpeGVkIHdpdGggQ0FUQ0hfCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XUyggZXhwciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9JRiggZXhwciApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0FUQ0hfQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0VMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0FUQ0hfQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XUyggZXhwciApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9DSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCAiIiwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX0NIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNBVENIX0NIRUNLX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9XQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9XQVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0NBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisjZGVmaW5lIENBVENIX1NDT1BFRF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIC4uLiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBmdW5jdGlvbiwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQ0FUQ0hfQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIENBVENIX0dFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggLi4uICkgQ0FUQ0hfVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9HSVZFTiggZGVzYyApICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9XSEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfV0hFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9USEVOKCBkZXNjICkgICAgIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBDQVRDSF9BTkRfVEhFTiggZGVzYyApIENBVENIX1NFQ1RJT04oIHN0ZDo6c3RyaW5nKCAiICBBbmQ6ICIpICsgZGVzYywgIiIgKQorCisvLyBJZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoZSBDQVRDSF8gcHJlZml4IGlzIG5vdCByZXF1aXJlZAorI2Vsc2UKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorCisjZWxzZQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciAgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIlJFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNlbmRpZgorCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIlJFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJSRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIlJFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBJTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIFdBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIldBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBTQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIklORk8iLCBtc2cgKQorI2RlZmluZSBDQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBURVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU1VDQ0VFRCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBURVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIFNFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgRkFJTCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1zZyApCisgICAgI2RlZmluZSBGQUlMX0NIRUNLKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorICAgICNkZWZpbmUgU1VDQ0VFRCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2VuZGlmCisjZGVmaW5lIEFOT05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoICIiLCAiIiApCisKKyNkZWZpbmUgUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorI2RlZmluZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKworI2RlZmluZSBHRU5FUkFURSggZXhwcikgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKQorCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKQorCisvLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgU0NFTkFSSU8oIC4uLiApIFRFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFNDRU5BUklPKCBuYW1lLCB0YWdzICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCB0YWdzICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZW5kaWYKKyNkZWZpbmUgR0lWRU4oIGRlc2MgKSAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgR2l2ZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBXSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9XSEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIkFuZCB3aGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgVEhFTiggZGVzYyApICAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgIFRoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBBTkRfVEhFTiggZGVzYyApIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgIEFuZDogIikgKyBkZXNjLCAiIiApCisKK3VzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGM4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKQEAgLTAsMCArMSwzMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworVEVTVF9DQVNFKCAidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgZW51bSIsICJbZnVuY3Rpb25hbF0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHByb2dyYW0pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfZW51bSogdGVzdF9lbnVtID0gcGFpci5zZWNvbmQ7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gdGVzdF9lbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2VudW0ob3V0LCB0ZXN0X2VudW0pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSB0ZXN0X2VudW07CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgdm9pZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzdHJpbmcgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGJvb2wgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzYnl0ZSAoaTgpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k4X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNob3J0IChpMTYpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBpbnRlZ2VyIChpMzIpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBsb25nIChpNjQpIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k2NF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBkb3VibGUgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMxNzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwyMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSAidF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCIKKworY29uc3Qgc3RyaW5nIFRlc3REYXRhR2VuZXJhdG9yOjpERUZBVUxUX0ZJTEVfSEVBREVSID0gIi8qKiIgIlxuIgorICAgICAgICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgpIiAiXG4iCisgICAgICAgICAgICAiICoiICJcbiIKKyAgICAgICAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiAiXG4iCisgICAgICAgICAgICAiICogIEBnZW5lcmF0ZWQiICJcbiIKKyAgICAgICAgICAgICIgKi8iOworCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSkKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIi8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICJwdWJsaWMgZW51bSBUZXN0TmFtZVxuIgorICAgICAgICAie1xuIgorICAgICAgICAiICBOb25lID0gMCxcbiIKKyAgICAgICAgIiAgRmlyc3QgPSAxLFxuIgorICAgICAgICAiICBTZWNvbmQgPSAyLFxuIgorICAgICAgICAifVxuIjsKKworICAgIHRfZW51bSogZW51bV8gPSBuZXcgdF9lbnVtKHByb2dyYW0pOworICAgIGVudW1fLT5zZXRfbmFtZSgiVGVzdE5hbWUiKTsKKyAgICBlbnVtXy0+c2V0X2RvYygiVGVzdERvYyIpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiTm9uZSIsIDApKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIkZpcnN0IiwgMSkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiU2Vjb25kIiwgMikpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+KGV4cGVjdGVkX3Jlc3VsdCwgZW51bV8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfc3RyaW5nKCJWb2lkVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAidm9pZCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArIAorICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc3RyaW5nIEBzdHJpbmcgPSBcIlN0cmluZ1ZhbHVlXCI7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlN0cmluZ1ZhbHVlIik7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInN0cmluZyIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgYm9vbCBAYm9vbCA9IHRydWU7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMSk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImJvb2wiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzYnl0ZSBAc2J5dGUgPSAxMjc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiSTgiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JOCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxMjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzYnl0ZSIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMTZfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzaG9ydCBAc2hvcnQgPSAzMjc2NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMzI3NjcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzaG9ydCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBpbnQgQGludCA9IDIxNDc0ODM2NDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDIxNDc0ODM2NDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJpbnQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgbG9uZyBAbG9uZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDkyMjMzNzIwMzY4NTQ3NzU4MDcpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJsb25nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGRvdWJsZSBAZG91YmxlID0gOS4yMjMzN2UrMTg7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9kb3VibGUoOTIyMzM3MjAzNjg1NDc3NTgwNy4xKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiZG91YmxlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKworY2xhc3MgVGVzdERhdGFHZW5lcmF0b3IKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RyaW5nIERFRkFVTFRfRklMRV9IRUFERVI7CisKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gZ2V0X3Rlc3RfZW51bV9kYXRhKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2k4X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pMzJfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7Cit9OwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2JlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKQEAgLTAsMCArMSwyMDkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSB3aXRob3V0IG9wdGlvbiB3Y2Ygc2hvdWxkIHJldHVybiB2YWxpZCBuYW1lc3BhY2VzIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgInVuaW9uIiwgInVuaW9uIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzID0gInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyBlbmRsOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSA9PSBleHBlY3RlZF9uYW1lc3BhY2VzKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGggb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICBzdHJpbmcgZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkUoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXNfd2NmKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY29udGFpbnMgbGF0ZXN0IEMjIGtleXdvcmRzIHRvIG5vcm1hbGl6ZSB3aXRoIEAiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisgICAgdmVjdG9yPHN0cmluZz4gY3VycmVudF9rZXl3b3JkcyA9IHsKKyAgICAgICAgeyAiYWJzdHJhY3QiIH0sCisgICAgICAgIHsgImFzIiB9LAorICAgICAgICB7ICJiYXNlIiB9LAorICAgICAgICB7ICJib29sIiB9LAorICAgICAgICB7ICJicmVhayIgfSwKKyAgICAgICAgeyAiYnl0ZSIgfSwKKyAgICAgICAgeyAiY2FzZSIgfSwKKyAgICAgICAgeyAiY2F0Y2giIH0sCisgICAgICAgIHsgImNoYXIiIH0sCisgICAgICAgIHsgImNoZWNrZWQiIH0sCisgICAgICAgIHsgImNsYXNzIiB9LAorICAgICAgICB7ICJjb25zdCIgfSwKKyAgICAgICAgeyAiY29udGludWUiIH0sCisgICAgICAgIHsgImRlY2ltYWwiIH0sCisgICAgICAgIHsgImRlZmF1bHQiIH0sCisgICAgICAgIHsgImRlbGVnYXRlIiB9LAorICAgICAgICB7ICJkbyIgfSwKKyAgICAgICAgeyAiZG91YmxlIiB9LAorICAgICAgICB7ICJlbHNlIiB9LAorICAgICAgICB7ICJlbnVtIiB9LAorICAgICAgICB7ICJldmVudCIgfSwKKyAgICAgICAgeyAiZXhwbGljaXQiIH0sCisgICAgICAgIHsgImV4dGVybiIgfSwKKyAgICAgICAgeyAiZmFsc2UiIH0sCisgICAgICAgIHsgImZpbmFsbHkiIH0sCisgICAgICAgIHsgImZpeGVkIiB9LAorICAgICAgICB7ICJmbG9hdCIgfSwKKyAgICAgICAgeyAiZm9yIiB9LAorICAgICAgICB7ICJmb3JlYWNoIiB9LAorICAgICAgICB7ICJnb3RvIiB9LAorICAgICAgICB7ICJpZiIgfSwKKyAgICAgICAgeyAiaW1wbGljaXQiIH0sCisgICAgICAgIHsgImluIiB9LAorICAgICAgICB7ICJpbnQiIH0sCisgICAgICAgIHsgImludGVyZmFjZSIgfSwKKyAgICAgICAgeyAiaW50ZXJuYWwiIH0sCisgICAgICAgIHsgImlzIiB9LAorICAgICAgICB7ICJsb2NrIiB9LAorICAgICAgICB7ICJsb25nIiB9LAorICAgICAgICB7ICJuYW1lc3BhY2UiIH0sCisgICAgICAgIHsgIm5ldyIgfSwKKyAgICAgICAgeyAibnVsbCIgfSwKKyAgICAgICAgeyAib2JqZWN0IiB9LAorICAgICAgICB7ICJvcGVyYXRvciIgfSwKKyAgICAgICAgeyAib3V0IiB9LAorICAgICAgICB7ICJvdmVycmlkZSIgfSwKKyAgICAgICAgeyAicGFyYW1zIiB9LAorICAgICAgICB7ICJwcml2YXRlIiB9LAorICAgICAgICB7ICJwcm90ZWN0ZWQiIH0sCisgICAgICAgIHsgInB1YmxpYyIgfSwKKyAgICAgICAgeyAicmVhZG9ubHkiIH0sCisgICAgICAgIHsgInJlZiIgfSwKKyAgICAgICAgeyAicmV0dXJuIiB9LAorICAgICAgICB7ICJzYnl0ZSIgfSwKKyAgICAgICAgeyAic2VhbGVkIiB9LAorICAgICAgICB7ICJzaG9ydCIgfSwKKyAgICAgICAgeyAic2l6ZW9mIiB9LAorICAgICAgICB7ICJzdGFja2FsbG9jIiB9LAorICAgICAgICB7ICJzdGF0aWMiIH0sCisgICAgICAgIHsgInN0cmluZyIgfSwKKyAgICAgICAgeyAic3RydWN0IiB9LAorICAgICAgICB7ICJzd2l0Y2giIH0sCisgICAgICAgIHsgInRoaXMiIH0sCisgICAgICAgIHsgInRocm93IiB9LAorICAgICAgICB7ICJ0cnVlIiB9LAorICAgICAgICB7ICJ0cnkiIH0sCisgICAgICAgIHsgInR5cGVvZiIgfSwKKyAgICAgICAgeyAidWludCIgfSwKKyAgICAgICAgeyAidWxvbmciIH0sCisgICAgICAgIHsgInVuY2hlY2tlZCIgfSwKKyAgICAgICAgeyAidW5zYWZlIiB9LAorICAgICAgICB7ICJ1c2hvcnQiIH0sCisgICAgICAgIHsgInVzaW5nIiB9LAorICAgICAgICB7ICJ2b2lkIiB9LAorICAgICAgICB7ICJ2b2xhdGlsZSIgfSwKKyAgICAgICAgeyAid2hpbGUiIH0sCisgICAgICAgIC8vIENvbnRleHR1YWwgS2V5d29yZHMKKyAgICAgICAgeyAiYWRkIiB9LAorICAgICAgICB7ICJhbGlhcyIgfSwKKyAgICAgICAgeyAiYXNjZW5kaW5nIiB9LAorICAgICAgICB7ICJhc3luYyIgfSwKKyAgICAgICAgeyAiYXdhaXQiIH0sCisgICAgICAgIHsgImRlc2NlbmRpbmciIH0sCisgICAgICAgIHsgImR5bmFtaWMiIH0sCisgICAgICAgIHsgImZyb20iIH0sCisgICAgICAgIHsgImdldCIgfSwKKyAgICAgICAgeyAiZ2xvYmFsIiB9LAorICAgICAgICB7ICJncm91cCIgfSwKKyAgICAgICAgeyAiaW50byIgfSwKKyAgICAgICAgeyAiam9pbiIgfSwKKyAgICAgICAgeyAibGV0IiB9LAorICAgICAgICB7ICJvcmRlcmJ5IiB9LAorICAgICAgICB7ICJwYXJ0aWFsIiB9LAorICAgICAgICB7ICJyZW1vdmUiIH0sCisgICAgICAgIHsgInNlbGVjdCIgfSwKKyAgICAgICAgeyAic2V0IiB9LAorICAgICAgICB7ICJ2YWx1ZSIgfSwKKyAgICAgICAgeyAidmFyIiB9LAorICAgICAgICB7ICJ3aGVuIiB9LAorICAgICAgICB7ICJ3aGVyZSIgfSwKKyAgICAgICAgeyAieWllbGQiIH0KKyAgICB9OworCisgICAgc3RyaW5nIG1pc3NlZF9rZXl3b3JkcyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworICAgIG1hcDxzdHJpbmcsIGludD4gZ2VuZXJhdG9yc19rZXl3b3JkcyA9IGdlbi0+Z2V0X2tleXdvcmRzX2xpc3QoKTsKKworICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gY3VycmVudF9rZXl3b3Jkcy5iZWdpbigpOyBpdCAhPSBjdXJyZW50X2tleXdvcmRzLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgICAgaWYgKGdlbmVyYXRvcnNfa2V5d29yZHMuZmluZCgqaXQpID09IGdlbmVyYXRvcnNfa2V5d29yZHMuZW5kKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pc3NlZF9rZXl3b3JkcyA9IG1pc3NlZF9rZXl3b3JkcyArICppdCArICIsIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJFUVVJUkUobWlzc2VkX2tleXdvcmRzID09ICIiKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE3NzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYwpAQCAtMCwwICsxLDc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCB0aHJvdyBlcnJvciB3aXRoIHVua25vd24gb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIiApCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgImtleXMiLCAia2V5cyIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX1RIUk9XUyhnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZykpOwkKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07CQorfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGNyZWF0ZSB2YWxpZCBpbnN0YW5jZSB3aXRoIHZhbGlkIG9wdGlvbnMiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0sIHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIn0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBudWxscHRyOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CisgICAgUkVRVUlSRShnZW4gIT0gbnVsbHB0cik7CisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5pc19udWxsYWJsZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19oYXNoY29kZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc19zZXJpYWxpemVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfdW5pb25fZW5hYmxlZCgpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgcGFzcyBpbml0IHN1Y2Nlc2Z1bGx5IiwgIltpbml0aWFsaXphdGlvbl0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9LHsgIm51bGxhYmxlIiwgIm51bGxhYmxlIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+aW5pdF9nZW5lcmF0b3IoKSk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQwOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MKQEAgLTAsMCArMSwxOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2RlZmluZSBDQVRDSF9DT05GSUdfTUFJTgorI2luY2x1ZGUgImNhdGNoL2NhdGNoLmhwcCIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcwZWM5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKZGlmZiAtLWdpdCBhL2NvbXBvc2VyLmpzb24gYi9jb21wb3Nlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2E2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb3Nlci5qc29uCkBAIC0wLDAgKzEsMzkgQEAKK3sKKyAgICAibmFtZSI6ICJhcGFjaGUvdGhyaWZ0IiwKKyAgICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKKyAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgICAidHlwZSI6ICJsaWJyYXJ5IiwKKyAgICAia2V5d29yZHMiOiBbIlJQQyJdLAorICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAgICJyZWFkbWUiOiAiUkVBRE1FLm1kIiwKKyAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgICAgICAgfQorICAgIF0sCisgICAgInN1cHBvcnQiOiB7CisgICAgICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgorICAgIH0sCisgICAgInJlcXVpcmUiOiB7CisgICAgICAgICJwaHAiOiAiXjUuNSB8fCBeNy4wIgorICAgIH0sCisgICAgInJlcXVpcmUtZGV2IjogeworICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIn40LjguMzYiLAorICAgICAgICAic3F1aXpsYWJzL3BocF9jb2Rlc25pZmZlciI6ICIzLioiCisgICAgfSwKKyAgICAiYXV0b2xvYWQiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGhyaWZ0XFwiOiAibGliL3BocC9saWIvIn0KKyAgICB9LAorICAgICJhdXRvbG9hZC1kZXYiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGVzdFxcVGhyaWZ0XFwiOiAibGliL3BocC90ZXN0LyJ9CisgICAgfSwKKyAgICAibWluaW11bS1zdGFiaWxpdHkiOiAic3RhYmxlIiwKKyAgICAiZXh0cmEiOiB7CisgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CisgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjAueC1kZXYiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmNmFlODg2Li4yMTc0NjI5Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTE4LDEyICsxOCwxNCBAQAogIwogCiBBQ19QUkVSRVEoMi42NSkKK0FDX0NPTkZJR19NQUNST19ESVIoWy4vYWNsb2NhbF0pCiAKLUFDX0lOSVQoW3RocmlmdF0sIFswLjYuMV0pCitBQ19JTklUKFt0aHJpZnRdLCBbMS4wLjBdKQogCiBBQ19DT05GSUdfQVVYX0RJUihbLl0pCiAKLUFNX0lOSVRfQVVUT01BS0UoWzEuOSB0YXItdXN0YXJdKQorQU1fSU5JVF9BVVRPTUFLRShbMS4xMyBzdWJkaXItb2JqZWN0cyB0YXItdXN0YXJdKQorUEtHX1BST0dfUEtHX0NPTkZJRwogCiBBQ19BUkdfVkFSKFtQWV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFB5dGhvbiBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgUHl0aG9uIGJlY2F1c2UKQEAgLTMyLDEwICszNCwxMCBAQAogQVNfSUYoW3Rlc3QgIngkUFlfUFJFRklYIiA9IHhdLCBbUFlfUFJFRklYPSIvdXNyIl0pCiAKIEFDX0FSR19WQVIoW0pBVkFfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyB0aGUgSmF2YSBsaWIgamFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBKYXZhIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEgaGFzIGRpZmZlcmVudCBjb25ldm50aW9ucy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCi1BU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgPSB4XSwgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQorQVNfSUYoW3Rlc3QgIngkSkFWQV9QUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRKQVZBX1BSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbdGVzdCAieCRQUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRQUkVGSVgvdXNyL2xvY2FsL2xpYiJdLAorICAgICAgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQogCiBBQ19BUkdfVkFSKFtSVUJZX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgUnVieSBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBSdWJ5IGJlY2F1c2UKQEAgLTU1LDkgKzU3LDE2IEBACiAgICAgICAgICAgIERlZmF1bHQgPSAiL2V0Yy9waHAuZCJdKQogQVNfSUYoW3Rlc3QgIngkUEhQX0NPTkZJR19QUkVGSVgiID0geF0sIFtQSFBfQ09ORklHX1BSRUZJWD0iL2V0Yy9waHAuZCJdKQogCitBQ19BUkdfVkFSKFtJTlNUQUxMRElSU10sIFtXaGVuIGluc3RhbGxpbmcgUGVybCBtb2R1bGVzLCBzcGVjaWZpZXMgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzZXRzIG9mIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY2hvb3NlOiBwZXJsLCBzaXRlIG9yIHZlbmRvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPSAidmVuZG9yIl0pCitBU19JRihbdGVzdCAieCRJTlNUQUxMRElSUyIgPSB4XSwgW0lOU1RBTExESVJTPSJ2ZW5kb3IiXSkKKwogQUNfQVJHX1ZBUihbUEVSTF9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFBlcmwgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgUGVybCBiZWNhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJsIGhhcyBkaWZmZXJlbnQgY29udmVudGlvbnMuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCwgd2hlbiBJTlNUQUxMRElSUyBzZXQgdG8gc2l0ZSBvciB2ZW5kb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCiBBU19JRihbdGVzdCAieCRQRVJMX1BSRUZJWCIgPSB4XSwgW1BFUkxfUFJFRklYPSIvdXNyL2xvY2FsIl0pCiAKQEAgLTY3LDM5ICs3NiwxMjYgQEAKIAogQUNfU1VCU1QoQ0FCQUxfQ09ORklHVVJFX0ZMQUdTKQogCitBQ19BUkdfVkFSKFtEX0lNUE9SVF9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIEQgbW9kdWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJTkNMVURFRElSL2QyXV0pCitBU19JRihbdGVzdCAieCREX0lNUE9SVF9QUkVGSVgiID0geF0sIFtEX0lNUE9SVF9QUkVGSVg9IiR7aW5jbHVkZWRpcn0vZDIiXSkKKworQUNfQVJHX1ZBUihbRE1EX0xJQkVWRU5UX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBsaWJldmVudCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQorQUNfQVJHX1ZBUihbRE1EX09QRU5TU0xfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIE9wZW5TU0wgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKKworQUNfQVJHX1ZBUihbVEhSSUZUXSwgW1BhdGggdG8gdGhlIHRocmlmdCB0b29sIChuZWVkZWQgZm9yIGNyb3NzLWNvbXBpbGF0aW9uKS5dKQorQVNfSUYoW3Rlc3QgIngkVEhSSUZUIiA9IHhdLCBbVEhSSUZUPWBwd2RgL2NvbXBpbGVyL2NwcC90aHJpZnRdKQorCiBBQ19QUk9HX0NDCiBBQ19QUk9HX0NQUAogQUNfUFJPR19DWFgKIEFDX1BST0dfSU5TVEFMTAogQUNfUFJPR19MSUJUT09MCiBBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0JJU09OKDIuNSkKIEFDX1BST0dfWUFDQwogQUNfUFJPR19MRVgKIEFNX1BST0dfTEVYCiBBQ19QUk9HX0xOX1MKIEFDX1BST0dfTUtESVJfUAorQUNfUFJPR19BV0sKK0FDX1BST0dfUkFOTElCCiAKIEFDX0xBTkcoW0MrK10pCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSwgW21hbmRhdG9yeV0pCisKK0FNX0VYVFJBX1JFQ1VSU0lWRV9UQVJHRVRTKFtzdHlsZV0pCitBQ19TVUJTVChDUFBTVFlMRV9DTUQsICdmaW5kIC4gLXR5cGUgZiBcKCAtaW5hbWUgIiouaCIgLW9yIC1pbmFtZSAiKi5jcHAiIC1vciAtaW5hbWUgIiouY2MiIC1vciAtaW5hbWUgIioudGNjIiBcKSAtcHJpbnRmICJSZWZvcm1hdHRpbmc6ICVoLyVmXG4iIC1leGVjIGNsYW5nLWZvcm1hdCAtaSB7fSBcOycpCisjICcKKyMgVGhlIGFib3ZlIGNvbW1lbnQgaXMgdG8gZml4IGVkaXRvciBzeW50YXggaGlnaGxpZ2h0aW5nCisKK0FDX0FSR19FTkFCTEUoW2xpYnNdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlic10sIFtidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXV0pLAorICBbXSwgZW5hYmxlX2xpYnM9eWVzCispCitoYXZlX2xpYnM9eWVzCitpZiB0ZXN0ICIkZW5hYmxlX2xpYnMiID0gIm5vIjsgdGhlbgorICBoYXZlX2xpYnM9Im5vIgorICB3aXRoX2NwcD0ibm8iCisgIHdpdGhfY19nbGliPSJubyIKKyAgd2l0aF9jbD0ibm8iCisgIHdpdGhfamF2YT0ibm8iCisgIHdpdGhfY3NoYXJwPSJubyIKKyAgd2l0aF9weXRob249Im5vIgorICB3aXRoX3B5Mz0ibm8iCisgIHdpdGhfcnVieT0ibm8iCisgIHdpdGhfaGFza2VsbD0ibm8iCisgIHdpdGhfaGF4ZT0ibm8iCisgIHdpdGhfZG90bmV0Y29yZT0ibm8iCisgIHdpdGhfcGVybD0ibm8iCisgIHdpdGhfcGhwPSJubyIKKyAgd2l0aF9waHBfZXh0ZW5zaW9uPSJubyIKKyAgd2l0aF9kYXJ0PSJubyIKKyAgd2l0aF9lcmxhbmc9Im5vIgorICB3aXRoX2dvPSJubyIKKyAgd2l0aF9kPSJubyIKKyAgd2l0aF9ub2RlanM9Im5vIgorICB3aXRoX25vZGV0cz0ibm8iCisgIHdpdGhfbHVhPSJubyIKKyAgd2l0aF9ycz0ibm8iCisgIHdpdGhfc3dpZnQ9Im5vIgorZmkKIAogQVhfVEhSSUZUX0xJQihjcHAsIFtDKytdLCB5ZXMpCiBoYXZlX2NwcD1ubwogaWYgdGVzdCAiJHdpdGhfY3BwIiA9ICJ5ZXMiOyAgdGhlbgotICBBWF9CT09TVF9CQVNFKFsxLjMzLjFdKQotICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgPT0gInh5ZXMiIDsgdGhlbgorICBBWF9CT09TVF9CQVNFKFsxLjUzLjBdKQorICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgPSAieHllcyIgOyB0aGVuCisgICAgQUNfU1VCU1QoW0JPT1NUX0xJQl9ESVJdLCBbJChlY2hvICIkQk9PU1RfTERGTEFHUyIgfCBzZWQgLWUgJ3MvXlwtTC8vJyldKQorICAgIEFDX1NVQlNUKFtCT09TVF9DSFJPTk9fTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF9jaHJvbm8uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfRklMRVNZU1RFTV9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X2ZpbGVzeXN0ZW0uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfU1lTVEVNX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3Rfc3lzdGVtLmEiKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX1RFU1RfTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEiKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX1RIUkVBRF9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X3RocmVhZC5hIildKQogICAgIGhhdmVfY3BwPSJ5ZXMiCiAgIGZpCiAKLSAgQVhfTElCX0VWRU5UKFsxLjBdKQorICBBWF9MSUJfRVZFTlQoWzIuMF0pCiAgIGhhdmVfbGliZXZlbnQ9JHN1Y2Nlc3MKIAogICBBWF9MSUJfWkxJQihbMS4yLjNdKQogICBoYXZlX3psaWI9JHN1Y2Nlc3MKKworICBBWF9USFJJRlRfTElCKHF0NCwgW1F0XSwgeWVzKQorICBoYXZlX3F0PW5vCisgIGlmIHRlc3QgIiR3aXRoX3F0NCIgPSAieWVzIjsgIHRoZW4KKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbUVRdLCBbUXRDb3JlID49IDQuMywgUXROZXR3b3JrID49IDQuM10sIGhhdmVfcXQ9eWVzLCBoYXZlX3F0PW5vKQorICBmaQorICBpZiB0ZXN0ICIkaGF2ZV9xdCIgPSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1FUX01PQ10sIFttb2MtcXQ0IG1vY10sICJmYWlsIikKKyAgICBpZiB0ZXN0ICIkUVRfTU9DIiA9ICJmYWlsIjsgdGhlbgorICAgICAgaGF2ZV9xdD1ubworICAgIGZpCisgIGZpCisKKyAgQVhfVEhSSUZUX0xJQihxdDUsIFtRdDVdLCB5ZXMpCisgIGhhdmVfcXQ1PW5vCisgIHF0X3JlZHVjZV9yZWxvYz0iIgorICBpZiB0ZXN0ICIkd2l0aF9xdDUiID0gInllcyI7ICB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1FUNV0sIFtRdDVDb3JlID49IDUuMCwgUXQ1TmV0d29yayA+PSA1LjBdLAorICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3F0NT15ZXM7cXRfcmVkdWNlX3JlbG9jPWAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXF0X2NvbmZpZyBRdDVDb3JlIHwgZ3JlcCAicmVkdWNlX3JlbG9jYXRpb25zImBdLAorICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3F0NT1ub10pCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3F0NSIgPSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1FUNV9NT0NdLCBbbW9jLXF0NSBtb2NdLCAiZmFpbCIpCisgICAgaWYgdGVzdCAiJFFUNV9NT0MiID0gImZhaWwiOyB0aGVuCisgICAgICBoYXZlX3F0NT1ubworICAgIGZpCisgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoW1dJVEhfQ1BQXSwgW3Rlc3QgIiRoYXZlX2NwcCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfTElCRVZFTlRdLCBbdGVzdCAiJGhhdmVfbGliZXZlbnQiID0gInllcyJdKQogQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1pMSUJdLCBbdGVzdCAiJGhhdmVfemxpYiIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfUVRdLCBbdGVzdCAiJGhhdmVfcXQiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1FUNV0sIFt0ZXN0ICIkaGF2ZV9xdDUiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW1FUNV9SRURVQ0VfUkVMT0NBVElPTlNdLCBbdGVzdCAieCRxdF9yZWR1Y2VfcmVsb2MiICE9ICJ4Il0pCiAKLUFYX1RIUklGVF9MSUIoY19nbGliLCBbQyAoR0xpYildLCBubykKK0FYX1RIUklGVF9MSUIoY19nbGliLCBbQyAoR0xpYildLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9jX2dsaWIiID0gInllcyI7IHRoZW4KICAgUEtHX0NIRUNLX01PRFVMRVMoW0dMSUJdLCBbZ2xpYi0yLjAgPj0gMi4wXSwgaGF2ZV9nbGliMj15ZXMsIGhhdmVfZ2xpYjI9bm8pCiAgIFBLR19DSEVDS19NT0RVTEVTKFtHT0JKRUNUXSwgW2dvYmplY3QtMi4wID49IDIuMF0sIGhhdmVfZ29iamVjdDI9eWVzLCBoYXZlX2dvYmplY3QyPW5vKQpAQCAtMTA5LDggKzIwNSwyMSBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfQ19HTElCLCBbdGVzdCAiJGhhdmVfZ2xpYjIiID0gInllcyIgLWEgIiRoYXZlX2dvYmplY3QyIiA9ICJ5ZXMiXSkKIAorZWNobyAiT3BlblNTTCBjaGVjayIKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiAtbyAiJGhhdmVfY19nbGliIiA9ICJ5ZXMiOyAgdGhlbgorICBlY2hvICJIYXZlIGNwcCBvciBjIHNvIHdlIGNoZWNrIGZvciBPcGVuU1NMIgorICBBWF9DSEVDS19PUEVOU1NMKCkKK2ZpCisKIEFYX1RIUklGVF9MSUIoY3NoYXJwLCBbQyNdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9jc2hhcnAiID0gInllcyI7ICB0aGVuCisgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMi4xMS4wLCBtb25vXzJfMTE9eWVzLCBtb25vXzJfMTE9bm8pCisgIGlmIHRlc3QgIiRtb25vXzJfMTEiID09ICJ5ZXMiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HKFtNQ1NdLCBbbWNzXSkKKyAgICBpZiB0ZXN0ICJ4JE1DUyIgIT0gIngiOyB0aGVuCisgICAgICBtb25vX21jcz0ieWVzIgorICAgIGZpCisgIGZpCiAgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMi4wLjAsIG5ldF8zXzU9eWVzLCBuZXRfM181PW5vKQogICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDEuMi40LCBoYXZlX21vbm89eWVzLCBoYXZlX21vbm89bm8pCiAgIGlmIHRlc3QgIiRoYXZlX21vbm8iID0gInllcyIgOyB0aGVuCkBAIC0xMTksMjMgKzIyOCwxNyBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfTU9OTywgW3Rlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChORVRfMl8wLCBbdGVzdCAiJG5ldF8zXzUiID0gIm5vIl0pCitBTV9DT05ESVRJT05BTChNT05PX01DUywgW3Rlc3QgIiRtb25vX21jcyIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIoamF2YSwgW0phdmFdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9qYXZhIiA9ICJ5ZXMiOyAgdGhlbgogICBBWF9KQVZBQ19BTkRfSkFWQQogICBBQ19QQVRIX1BST0coW0FOVF0sIFthbnRdKQotICBBWF9DSEVDS19KQVZBX0NMQVNTKG9yZy5zbGY0ai5Mb2dnZXIpCi0gIGhhdmVfc2xmNGo9IiRzdWNjZXNzIgotICBBWF9DSEVDS19KQVZBX0NMQVNTKG9yZy5zbGY0ai5pbXBsLlNpbXBsZUxvZ2dlcikKLSAgaGF2ZV9zbGY0al9zaW1wbGU9IiRzdWNjZXNzIgotICBBWF9DSEVDS19KQVZBX0NMQVNTKG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyKQotICBoYXZlX2hhc2hjb2RlPSIkc3VjY2VzcyIKLSAgaWYgdGVzdCAieCRoYXZlX3NsZjRqX3NpbXBsZSIgPSAieHllcyIgJiYgdGVzdCAieCRoYXZlX3NsZjRqIiA9ICJ4eWVzIiAmJiB0ZXN0ICJ4JGhhdmVfaGFzaGNvZGUiID0gInh5ZXMiIDsgdGhlbgotICAgIEFOVF9GTEFHUz0iJEFOVF9GTEFHUyAtRG5vaXZ5PSIKLSAgZmkKKyAgQVhfQ0hFQ0tfQU5UX1ZFUlNJT04oJEFOVCwgMS43KQogICBBQ19TVUJTVChDTEFTU1BBVEgpCiAgIEFDX1NVQlNUKEFOVF9GTEFHUykKLSAgaWYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgorICBBQ19TVUJTVChHUkFETEVfT1BUUykKKyAgaWYgdGVzdCAieCRKQVZBIiAhPSAieCIgJiYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkQU5UIiAhPSAieCIgOyB0aGVuCiAgICAgaGF2ZV9qYXZhPSJ5ZXMiCiAgIGZpCiBmaQpAQCAtMTQ1LDI4ICsyNDgsOTAgQEAKIGlmIHRlc3QgIiR3aXRoX2VybGFuZyIgPSAieWVzIjsgIHRoZW4KICAgQUNfRVJMQU5HX1BBVEhfRVJMCiAgIEFDX0VSTEFOR19QQVRIX0VSTEMKKyAgQUNfUEFUSF9QUk9HKFtSRUJBUl0sIFtyZWJhcl0pCiAgIGlmIHRlc3QgLW4gIiRFUkxDIiA7IHRoZW4KICAgICBBQ19FUkxBTkdfU1VCU1RfTElCX0RJUgogICAgICMgSW5zdGFsbCBpbnRvIHRoZSBkZXRlY3RlZCBFcmxhbmcgZGlyZWN0b3J5IGluc3RlYWQgb2YgJGxpYmRpci9lcmxhbmcvbGliCiAgICAgRVJMQU5HX0lOU1RBTExfTElCX0RJUj0iJEVSTEFOR19MSUJfRElSIgogICAgIEFDX0VSTEFOR19TVUJTVF9JTlNUQUxMX0xJQl9TVUJESVIoQUNfUEFDS0FHRV9OQU1FLCBBQ19QQUNLQUdFX1ZFUlNJT04pCiAgIGZpCi0gIGlmIHRlc3QgLW4gIiRFUkwiIC1hIC1uICIkRVJMQyIgOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRFUkwiIC1hIC1uICIkRVJMQyIgJiYgdGVzdCAieCRSRUJBUiIgIT0gIngiIDsgdGhlbgogICAgIGhhdmVfZXJsYW5nPSJ5ZXMiCisKKyAgICAjIG90cF9yZWxlYXNlIGlzIHNpbXBseSBhIG51bWJlciAobGlrZSAiMTciKSBmb3IgT1RQMTcrIHdoaWxlICJSMTYuLi4iIGZvciBPVFAxNiBvciBsZXNzLgorICAgICMgT1RQIHZlcnNpb24gaXMgY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgcnVubmluZyB0ZXN0cy4KKyAgICBpZiAkRVJMIC1ldmFsICdlcmxhbmc6ZGlzcGxheShlcmxhbmc6c3lzdGVtX2luZm8ob3RwX3JlbGVhc2UpKSxoYWx0KCkuJyAtbm9zaGVsbCB8IGdyZXAgIl5cIlIiID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGVybGFuZ19vdHAxNl9vcl9sZXNzPSJ5ZXMiCisgICAgZmkKICAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX0VSTEFORywgW3Rlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChFUkxBTkdfT1RQMTYsIFt0ZXN0ICIkZXJsYW5nX290cDE2X29yX2xlc3MiID0gInllcyJdKQogCitBWF9USFJJRlRfTElCKG5vZGVqcywgW05vZGVqc10sIHllcykKK2hhdmVfbm9kZWpzPW5vCitpZiB0ZXN0ICIkd2l0aF9ub2RlanMiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HUyhbTk9ERUpTXSwgW25vZGVqcyBub2RlXSkKKyAgQUNfUEFUSF9QUk9HKFtOUE1dLCBbbnBtXSkKKyAgaWYgdGVzdCAieCROT0RFSlMiICE9ICJ4IiAtYSAieCROUE0iICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfbm9kZWpzPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9OT0RFSlMsIFt0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9OUE0sIFt0ZXN0ICJ4JE5QTSIgIT0gIngiXSkKKworQVhfVEhSSUZUX0xJQihub2RldHMsIFtOb2RldHNdLCB5ZXMpCitoYXZlX25vZGV0cz1ubworaWYgdGVzdCAiJHdpdGhfbm9kZXRzIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPR1MoW05PREVUU10sIFtub2RldHMgbm9kZV0pCisgIEFDX1BBVEhfUFJPRyhbTlBNXSwgW25wbV0pCisgIGlmIHRlc3QgIngkTk9ERVRTIiAhPSAieCIgLWEgIngkTlBNIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX25vZGV0cz0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfTk9ERVRTLCBbdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCisKK0FYX1RIUklGVF9MSUIobHVhLCBbTHVhXSwgeWVzKQoraGF2ZV9sdWE9bm8KK2lmIHRlc3QgIiR3aXRoX2x1YSIgPSAieWVzIjsgdGhlbgorICBBWF9QUk9HX0xVQSg1LjIsLCBoYXZlX2x1YT0ieWVzIiwgaGF2ZV9sdWE9Im5vIikKKyAgaWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiOyB0aGVuCisgICAgQVhfTFVBX0hFQURFUlMoLCBoYXZlX2x1YT0ibm8iKQorICAgIEFYX0xVQV9MSUJTKCwgaGF2ZV9sdWE9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0xVQSwgW3Rlc3QgIiRoYXZlX2x1YSIgPSAieWVzIl0pCisKKyMgRmluZCBweXRob24gcmVnYXJkbGVzcyBvZiB3aXRoX3B5dGhvbiB2YWx1ZSwgYmVjYXVzZSBpdCdzIG5lZWRlZCBieSBtYWtlIGNyb3NzCitBTV9QQVRIX1BZVEhPTigyLjYsLCA6KQogQVhfVEhSSUZUX0xJQihweXRob24sIFtQeXRob25dLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9weXRob24iID0gInllcyI7ICB0aGVuCi0gIEFNX1BBVEhfUFlUSE9OKDIuNCwsIDopCi0gIGlmIHRlc3QgIngkUFlUSE9OIiAhPSAieCIgJiYgdGVzdCAieCRQWVRIT04iICE9ICJ4OiIgOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCiAgICAgaGF2ZV9weXRob249InllcyIKICAgZmkKKyAgQUNfUEFUSF9QUk9HKFtUUklBTF0sIFt0cmlhbF0pCisgIGlmIHRlc3QgLW4gIiRUUklBTCI7IHRoZW4KKyAgICBoYXZlX3RyaWFsPSJ5ZXMiCisgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9UV0lTVEVEX1RFU1QsIFt0ZXN0ICIkaGF2ZV90cmlhbCIgPSAieWVzIl0pCiAKLUFDX1BBVEhfUFJPRyhbVFJJQUxdLCBbdHJpYWxdKQorIyBGaW5kICJweXRob24zIiBleGVjdXRhYmxlLgorIyBJdCdzIGRpc3RybyBzcGVjaWZpYyBhbmQgZmFyIGZyb20gaWRlYWwgYnV0IG5lZWRlZCB0byBjcm9zcyB0ZXN0IHB5Mi0zIGF0IG9uY2UuCisjIFRPRE86IGZpbmQgInB5dGhvbjIiIGlmIGl0J3MgMy54CitoYXZlX3B5Mz0ibm8iCitBWF9USFJJRlRfTElCKHB5MywgW1B5M10sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5MyIgPSAieWVzIjsgdGhlbgorICBpZiAkUFlUSE9OIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtcSAiUHl0aG9uIDIiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUFlUSE9OM10sIFtweXRob24zIHB5dGhvbjMuNyBweXRob24zNyBweXRob24zLjYgcHl0aG9uMzYgcHl0aG9uMy41IHB5dGhvbjM1IHB5dGhvbjMuNCBweXRob24zNF0pCisgICAgaWYgdGVzdCAtbiAiJFBZVEhPTjMiOyB0aGVuCisgICAgICBoYXZlX3B5Mz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWTMsIFt0ZXN0ICIkaGF2ZV9weTMiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHBlcmwsIFtQZXJsXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGVybCIgPSAieWVzIjsgdGhlbgpAQCAtMTc0LDkgKzMzOSwxMyBAQAogICBpZiB0ZXN0IC1uICIkUEVSTCIgOyB0aGVuCiAgICAgQUNfUFJPR19QRVJMX01PRFVMRVMoW0JpdDo6VmVjdG9yXSwgc3VjY2Vzcz0ieWVzIiwgc3VjY2Vzcz0ibm8iKQogICAgIGhhdmVfcGVybF9iaXRfdmVjdG9yPSIkc3VjY2VzcyIKKyAgICBBQ19QUk9HX1BFUkxfTU9EVUxFUyhbQ2xhc3M6OkFjY2Vzc29yXSwgc3VjY2Vzcz0ieWVzIiwgc3VjY2Vzcz0ibm8iKQorICAgIGhhdmVfcGVybF9jbGFzc19hY2Nlc3Nvcj0iJHN1Y2Nlc3MiCiAgIGZpCiAgIGlmIHRlc3QgLW4gIiRQRVJMIiAtYSAiJGhhdmVfcGVybF9iaXRfdmVjdG9yIiA9ICJ5ZXMiIDsgdGhlbgotICAgIGhhdmVfcGVybD0ieWVzIgorICAgIGlmIHRlc3QgLW4gIiRQRVJMIiAtYSAiJGhhdmVfcGVybF9jbGFzc19hY2Nlc3NvciIgPSAieWVzIiA7IHRoZW4KKyAgICAgIGhhdmVfcGVybD0ieWVzIgorICAgIGZpCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9QRVJMLCBbdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIl0pCkBAIC0xOTIsMjUgKzM2MSwzNyBAQAogCiBBWF9USFJJRlRfTElCKHBocF9leHRlbnNpb24sIFtQSFBfRVhURU5TSU9OXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGhwX2V4dGVuc2lvbiIgPSAieWVzIjsgdGhlbgotICBBQ19QQVRIX1BST0coW1BIUF9DT05GSUddLCBbcGhwLWNvbmZpZ10pCi0gIGlmIHRlc3QgLW4gIiRQSFBfQ09ORklHIiA7IHRoZW4KLSAgICBBQ19DT05GSUdfU1VCRElSUyhbbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbF0pCi0gICAgaGF2ZV9waHBfZXh0ZW5zaW9uPSJ5ZXMiCisgIGlmIHRlc3QgLWYgImxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPRyhbUEhQX0NPTkZJR10sIFtwaHAtY29uZmlnXSkKKyAgICBpZiB0ZXN0IC1uICIkUEhQX0NPTkZJRyIgOyB0aGVuCisgICAgICBBQ19DT05GSUdfU1VCRElSUyhbbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbF0pCisgICAgICBoYXZlX3BocF9leHRlbnNpb249InllcyIKKyAgICBmaQogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUEhQX0VYVEVOU0lPTiwgW3Rlc3QgIiRoYXZlX3BocF9leHRlbnNpb24iID0gInllcyJdKQogCitBWF9USFJJRlRfTElCKGRhcnQsIFtEQVJUXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZGFydCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW0RBUlRdLCBbZGFydF0pCisgIEFDX1BBVEhfUFJPRyhbREFSVFBVQl0sIFtwdWJdKQorICBpZiB0ZXN0ICJ4JERBUlQiICE9ICJ4IiAtYSAieCREQVJUUFVCIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2RhcnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RBUlQsIFt0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiXSkKKwogQVhfVEhSSUZUX0xJQihydWJ5LCBbUnVieV0sIHllcykKIGhhdmVfcnVieT1ubwogaWYgdGVzdCAiJHdpdGhfcnVieSIgPSAieWVzIjsgdGhlbgogICBBQ19QQVRIX1BST0coW1JVQlldLCBbcnVieV0pCi0gIEFDX1BBVEhfUFJPRyhbUlNQRUNdLCBbc3BlY10pCi0gIGlmIHRlc3QgIngkUlVCWSIgIT0gIngiIDsgdGhlbgorICBBQ19QQVRIX1BST0coW0JVTkRMRVJdLCBbYnVuZGxlXSkKKyAgaWYgdGVzdCAieCRSVUJZIiAhPSAieCIgLWEgIngkQlVORExFUiIgIT0gIngiOyB0aGVuCiAgICAgaGF2ZV9ydWJ5PSJ5ZXMiCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9SVUJZLCBbdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIl0pCi1BTV9DT05ESVRJT05BTChIQVZFX1JTUEVDLCBbdGVzdCAieCRSU1BFQyIgIT0gIngiXSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfQlVORExFUiwgW3Rlc3QgIngkQlVORExFUiIgIT0gIngiXSkKIAogQVhfVEhSSUZUX0xJQihoYXNrZWxsLCBbSGFza2VsbF0sIHllcykKIGhhdmVfaGFza2VsbD1ubwpAQCAtMjMwLDYgKzQxMSwyMzcgQEAKIEFDX1NVQlNUKFJVTkhBU0tFTEwpCiBBTV9DT05ESVRJT05BTChXSVRIX0hBU0tFTEwsIFt0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiXSkKIAorQVhfVEhSSUZUX0xJQihnbywgW0dvXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZ28iID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbR09dLCBbZ29dKQorICBpZiBbWyAteCAiJEdPIiBdXSA7IHRoZW4KKyAgICBBU19JRihbdGVzdCAtbiAiJEdPIl0sWworICAgICAgYXhfZ29fdmVyc2lvbj0iMS40IgorICAgICAgYXhfZ28xN192ZXJzaW9uPSIxLjciCisKKyAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIEdvIHZlcnNpb25dKQorICAgICAgZ29sYW5nX3ZlcnNpb249YCRHTyB2ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL1woZ28gXClcKHZlcnNpb24gXClcKGdvXClcKEA8OkAwLTlAOj5ALkA8OkAwLTlAOj5ALkA8OkAwLTlAOj5AXClcKEA8OkBcKkA6PkAqXCkuKi9cNC8nYAorICAgICAgQUNfTVNHX1JFU1VMVCgkZ29sYW5nX3ZlcnNpb24pCisgICAgICBBQ19TVUJTVChbZ29sYW5nX3ZlcnNpb25dLFskZ29sYW5nX3ZlcnNpb25dKQorICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskYXhfZ29fdmVyc2lvbl0sW2xlXSxbJGdvbGFuZ192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfZ289InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBoYXZlX2dvPSJubyIKKyAgICAgIF0pCisgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRnb2xhbmdfdmVyc2lvbl0sW2x0XSxbJGF4X2dvMTdfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBnb192ZXJzaW9uX2x0XzE3PSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgZ29fdmVyc2lvbl9sdF8xNz0ibm8iCisgICAgICBdKQorICAgIF0sWworICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5kIEdvIF0pCisgICAgICBoYXZlX2dvPSJubyIKKyAgICBdKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfR08sIFt0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbR09WRVJTSU9OX0xUXzE3XSwgW3Rlc3QgIiRnb192ZXJzaW9uX2x0XzE3IiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihzd2lmdCwgW1N3aWZ0XSwgeWVzKQoraGF2ZV9zd2lmdD0ibm8iCitpZiB0ZXN0ICIkd2l0aF9zd2lmdCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW1NXSUZUXSwgW3N3aWZ0XSkKKyAgaWYgdGVzdCAieCRTV0lGVCIgIT0gIngiIC1hICJ4JFNXSUZUIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX3N3aWZ0PSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoW1dJVEhfU1dJRlRdLCBbdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHJzLCBbUnVzdF0sIHllcykKK2hhdmVfcnM9Im5vIgoraWYgdGVzdCAiJHdpdGhfcnMiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbQ0FSR09dLCBbY2FyZ29dKQorICBBQ19QQVRIX1BST0coW1JVU1RDXSwgW3J1c3RjXSkKKyAgaWYgW1sgLXggIiRDQVJHTyIgXV0gJiYgW1sgLXggIiRSVVNUQyIgXV07IHRoZW4KKyAgICAgIG1pbl9ydXN0Y192ZXJzaW9uPSIxLjEzIgorCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBydXN0YyB2ZXJzaW9uXSkKKyAgICAgIHJ1c3RjX3ZlcnNpb249YCRSVVNUQyAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChydXN0YyBcKVwoWzAtOV1cKVwuXChbMC05XVswLTldKlwpXC5cKFswLTldWzAtOV0qXCkuKi9cMi5cMy8nYAorICAgICAgQUNfTVNHX1JFU1VMVCgkcnVzdGNfdmVyc2lvbikKKyAgICAgIEFDX1NVQlNUKFtydXN0Y192ZXJzaW9uXSxbJHJ1c3RjX3ZlcnNpb25dKQorCisgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRtaW5fcnVzdGNfdmVyc2lvbl0sW2xlXSxbJHJ1c3RjX3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfcnM9Im5vIgorICAgICAgXSkKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1JTLCBbdGVzdCAiJGhhdmVfcnMiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGNsLCBbQ29tbW9uIExpc3BdLCB5ZXMpCitoYXZlX2NsPSJubyIKK2lmIHRlc3QgIiR3aXRoX2NsIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW1NCQ0xdLCBbc2JjbF0pCisgIGlmIHRlc3QgIngkU0JDTCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9jbD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfQ0wsIFt0ZXN0ICIkaGF2ZV9jbCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoaGF4ZSwgW0hheGVdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9oYXhlIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0hBWEVdLCBbaGF4ZV0pCisgIGlmIFtbIC14ICIkSEFYRSIgXV0gOyB0aGVuCisgICAgQVhfUFJPR19IQVhFX1ZFUlNJT04oIFszLjEuM10sIGhhdmVfaGF4ZT0ieWVzIiwgaGF2ZV9oYXhlPSJubyIpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9IQVhFLCBbdGVzdCAiJGhhdmVfaGF4ZSIgPSAieWVzIl0pCisKKworQVhfVEhSSUZUX0xJQihkb3RuZXRjb3JlLCBbLk5FVCBDb3JlXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZG90bmV0Y29yZSIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSwgW2RvdG5ldF0pCisgIGlmIFtbIC14ICIkRE9UTkVUQ09SRSIgXV0gOyB0aGVuCisgICAgQVhfUFJPR19ET1RORVRDT1JFX1ZFUlNJT04oIFsyLjAuMF0sIGhhdmVfZG90bmV0Y29yZT0ieWVzIiwgaGF2ZV9kb3RuZXRjb3JlPSJubyIpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9ET1RORVRDT1JFLCBbdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIl0pCisKKworQVhfVEhSSUZUX0xJQihkLCBbRF0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2QiID0gInllcyI7ICB0aGVuCisgIEFYX0RNRAorICBBQ19TVUJTVChETUQpCisgIGlmIHRlc3QgIngkRE1EIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2Q9InllcyIKKyAgZmkKK2ZpCisKKyMgRGV0ZXJtaW5lIGFjdHVhbCBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgRCBsaWJyYXJ5IGZvciB1c2UgaW4gdGhlIGNvbW1hbmQgbGluZQorIyB3aGVuIGNvbXBpbGluZyB0ZXN0cy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgLWw8bGliPiBzeW50YXggZG9lc24ndCB3b3JrCisjIHdpdGggT1BUTElOSyAoV2luZG93cykuCitsaWJfcHJlZml4PWxpYgorbGliX3N1ZmZpeD1hCitjYXNlICIkaG9zdF9vcyIgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgIGxpYl9wcmVmaXg9IiIKKyAgICBsaWJfc3VmZml4PWxpYgorICAgIDs7Citlc2FjCitEX0xJQl9OQU1FPSIke2xpYl9wcmVmaXh9dGhyaWZ0ZC4ke2xpYl9zdWZmaXh9IgorQUNfU1VCU1QoRF9MSUJfTkFNRSkKK0RfRVZFTlRfTElCX05BTUU9IiR7bGliX3ByZWZpeH10aHJpZnRkLWV2ZW50LiR7bGliX3N1ZmZpeH0iCitBQ19TVUJTVChEX0VWRU5UX0xJQl9OQU1FKQorRF9TU0xfTElCX05BTUU9IiR7bGliX3ByZWZpeH10aHJpZnRkLXNzbC4ke2xpYl9zdWZmaXh9IgorQUNfU1VCU1QoRF9TU0xfTElCX05BTUUpCisKK2lmIHRlc3QgIiRoYXZlX2QiID0gInllcyI7IHRoZW4KKyAgQVhfQ0hFQ0tfRF9NT0RVTEUoZGVpbW9zLmV2ZW50Mi5ldmVudCkKKyAgaGF2ZV9kZWltb3NfZXZlbnQyPSRzdWNjZXNzCisKKyAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJubyIKKyAgaWYgdGVzdCAiJGhhdmVfZGVpbW9zX2V2ZW50MiIgPSAieWVzIjsgdGhlbgorICAgIGlmIHRlc3QgIngkRE1EX0xJQkVWRU5UX0ZMQUdTIiA9ICJ4IjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGRtZF9vcHRsaW5rIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIEFDX01TR19XQVJOKFtEIGxpYmV2ZW50IGludGVyZmFjZSBmb3VuZCwgYnV0IGNhbm5vdCBhdXRvLWRldGVjdCBcCitsaW5rZXIgZmxhZ3MgZm9yIE9QVExJTksuIFBsZWFzZSBzZXQgRE1EX0xJQkVWRU5UX0ZMQUdTIG1hbnVhbGx5Ll0pCisgICAgICBlbHNlCisgICAgICAgIEFYX0xJQl9FVkVOVChbMi4wXSkKKyAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID0gInllcyI7IHRoZW4KKyAgICAgICAgICBETURfTElCRVZFTlRfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRMSUJFVkVOVF9MREZMQUdTICRMSUJFVkVOVF9MSUJTIiB8IFwKKyAgICAgICAgICAgIHNlZCAtZSAncy9eICovL2c7cy8gKiQvL2c7cy9eXCguXCkvLUxcMS9nO3MvICAqLyAtTC9nJykKKyAgICAgICAgICB3aXRoX2RfZXZlbnRfdGVzdHM9InllcyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFDX01TR19XQVJOKFtEIGxpYmV2ZW50IGludGVyZmFjZSBwcmVzZW50LCBidXQgbGliZXZlbnQgbGlicmFyeSBub3QgZm91bmQuXSkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJ5ZXMiCisgICAgZmkKKyAgZmkKKworICBBWF9DSEVDS19EX01PRFVMRShkZWltb3Mub3BlbnNzbC5zc2wpCisgIGhhdmVfZGVpbW9zX29wZW5zc2w9JHN1Y2Nlc3MKKworICB3aXRoX2Rfc3NsX3Rlc3RzPSJubyIKKyAgaWYgdGVzdCAiJGhhdmVfZGVpbW9zX29wZW5zc2wiID0gInllcyI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JERNRF9PUEVOU1NMX0ZMQUdTIiA9ICJ4IjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGRtZF9vcHRsaW5rIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIEFDX01TR19XQVJOKFtEIE9wZW5TU0wgaW50ZXJmYWNlIGZvdW5kLCBidXQgY2Fubm90IGF1dG8tZGV0ZWN0IFwKK2xpbmtlciBmbGFncyBmb3IgT1BUTElOSy4gUGxlYXNlIHNldCBETURfT1BFTlNTTF9GTEFHUyBtYW51YWxseS5dKQorICAgICAgZWxzZQorICAgICAgICBBWF9DSEVDS19PUEVOU1NMKFt3aXRoX2Rfc3NsX3Rlc3RzPSJ5ZXMiXSkKKyAgICAgICAgaWYgdGVzdCAiJHdpdGhfZF9zc2xfdGVzdHMiID0gInllcyI7IHRoZW4KKyAgICAgICAgICBETURfT1BFTlNTTF9GTEFHUz0kKGVjaG8gIi1mdXNlLWxkPWdvbGQgJE9QRU5TU0xfTERGTEFHUyAkT1BFTlNTTF9MSUJTIiB8IFwKKyAgICAgICAgICAgIHNlZCAtZSAncy9eICovL2c7cy8gKiQvL2c7cy9eXCguXCkvLUxcMS9nO3MvICAqLyAtTC9nJykKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFDX01TR19XQVJOKFtEIE9wZW5TU0wgaW50ZXJmYWNlIHByZXNlbnQsIGJ1dCBPcGVuU1NMIGxpYnJhcnkgbm90IGZvdW5kLl0pCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIHdpdGhfZF9zc2xfdGVzdHM9InllcyIKKyAgICBmaQorICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoV0lUSF9ELCBbdGVzdCAiJGhhdmVfZCIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChETURfT1BUTElOSywgW3Rlc3QgIiRkbWRfb3B0bGluayIgPSAieWVzIl0pCitBQ19TVUJTVChETURfT0ZfRElSU0VQLCAiJGRtZF9vZl9kaXJzZXAiKQorQU1fQ09ORElUSU9OQUwoSEFWRV9ERUlNT1NfRVZFTlQyLCBbdGVzdCAiJGhhdmVfZGVpbW9zX2V2ZW50MiIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChXSVRIX0RfRVZFTlRfVEVTVFMsIFt0ZXN0ICIkd2l0aF9kX2V2ZW50X3Rlc3RzIiA9ICJ5ZXMiXSkKK0FDX1NVQlNUKERNRF9MSUJFVkVOVF9GTEFHUykKK0FNX0NPTkRJVElPTkFMKEhBVkVfREVJTU9TX09QRU5TU0wsIFt0ZXN0ICIkaGF2ZV9kZWltb3Nfb3BlbnNzbCIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChXSVRIX0RfU1NMX1RFU1RTLCBbdGVzdCAiJHdpdGhfZF9zc2xfdGVzdHMiID0gInllcyJdKQorQUNfU1VCU1QoRE1EX09QRU5TU0xfRkxBR1MpCisKK0FDX0FSR19FTkFCTEUoW3Rlc3RzXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlc3RzXSwgW2J1aWxkIHRlc3RzIFtkZWZhdWx0PXllc11dKSwKKyAgW10sIGVuYWJsZV90ZXN0cz15ZXMKKykKK2hhdmVfdGVzdHM9eWVzCitpZiB0ZXN0ICIkZW5hYmxlX3Rlc3RzIiA9ICJubyI7IHRoZW4KKyAgaGF2ZV90ZXN0cz0ibm8iCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9URVNUUywgW3Rlc3QgIiRoYXZlX3Rlc3RzIiA9ICJ5ZXMiXSkKKworQUNfQVJHX0VOQUJMRShbcGx1Z2luXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXBsdWdpbl0sIFtidWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydCBbZGVmYXVsdD1ub11dKSwKKyAgW10sIGVuYWJsZV9wbHVnaW49bm8KKykKK2hhdmVfcGx1Z2luPXllcworaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJubyIgOyB0aGVuCisgIGhhdmVfcGx1Z2luPSJubyIKK2ZpCitpZiB0ZXN0ICIkZW5hYmxlX3BsdWdpbiIgPSAibm8iOyB0aGVuCisgIGhhdmVfcGx1Z2luPSJubyIKK2ZpCitBQ19DT05GSUdfTElOS1MoW2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi90X2NwcF9nZW5lcmF0b3IuY2M6Y29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUExVR0lOLCBbdGVzdCAiJGhhdmVfcGx1Z2luIiA9ICJ5ZXMiXSkKKworQUNfQVJHX0VOQUJMRShbdHV0b3JpYWxdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdHV0b3JpYWxdLCBbYnVpbGQgdHV0b3JpYWwgW2RlZmF1bHQ9eWVzXV0pLAorICBbXSwgZW5hYmxlX3R1dG9yaWFsPXllcworKQoraGF2ZV90dXRvcmlhbD15ZXMKK2lmIHRlc3QgIiRlbmFibGVfdHV0b3JpYWwiID0gIm5vIjsgdGhlbgorICBoYXZlX3R1dG9yaWFsPSJubyIKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1RVVE9SSUFMLCBbdGVzdCAiJGhhdmVfdHV0b3JpYWwiID0gInllcyJdKQorCitBTV9DT05ESVRJT05BTChNSU5HVywgZmFsc2UpCitjYXNlICIke2hvc3Rfb3N9IiBpbgorKm1pbmd3KikKKyAgbWluZ3czMl9zdXBwb3J0PSJ5ZXMiCisgIEFDX0NIRUNLX0hFQURFUih3aW5kb3dzLmgpCisgIEFNX0NPTkRJVElPTkFMKE1JTkdXLCB0cnVlKQorICA7OworKikKKyAgQUNfSVNDX1BPU0lYCisgIDs7Citlc2FjCisKIEFDX0NfQ09OU1QKIEFDX0NfSU5MSU5FCiBBQ19DX1ZPTEFUSUxFCkBAIC0yMzcsNiArNjQ5LDggQEAKIEFDX0hFQURFUl9TVERCT09MCiBBQ19IRUFERVJfU1REQwogQUNfSEVBREVSX1RJTUUKK0FDX0hFQURFUl9TWVNfV0FJVAorQUNfVFlQRV9TSUdOQUwKIEFDX0NIRUNLX0hFQURFUlMoW2FycGEvaW5ldC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9wYXJhbS5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW2ZjbnRsLmhdKQpAQCAtMjQ1LDEzICs2NTksMjQgQEAKIEFDX0NIRUNLX0hFQURFUlMoW25ldGRiLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbmV0aW5ldC9pbi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3B0aHJlYWQuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzaWduYWwuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzdGRkZWYuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzdGRsaWIuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvaW9jdGwuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzeXMvc29ja2V0LmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3RpbWUuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvdW4uaF0pCitBQ19DSEVDS19IRUFERVJTKFtwb2xsLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3BvbGwuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvcmVzb3VyY2UuaF0pCiBBQ19DSEVDS19IRUFERVJTKFt1bmlzdGQuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtsaWJpbnRsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbWFsbG9jLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbb3BlbnNzbC9zc2wuaF0pCitBQ19DSEVDS19IRUFERVJTKFtvcGVuc3NsL3JhbmQuaF0pCitBQ19DSEVDS19IRUFERVJTKFtvcGVuc3NsL3g1MDl2My5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3NjaGVkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbd2NoYXIuaF0pCiAKIEFDX0NIRUNLX0xJQihwdGhyZWFkLCBwdGhyZWFkX2NyZWF0ZSkKIGRubCBOT1RFKGRyZWlzcyk6IEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gZmluZCBhbnkgcmVhbGx5IHNvbGlkIGRvY3MKQEAgLTI3NCw3ICs2OTksNyBAQAogQUNfVFlQRV9VSU5UMzJfVAogQUNfVFlQRV9VSU5UNjRfVAogQUNfVFlQRV9VSU5UOF9UCi1BQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSwgW10sIFtleGl0IDFdKQorQUNfQ0hFQ0tfVFlQRVMoW3B0cmRpZmZfdF0sIFtdLCBbZWNobyAicHRyZGlmZl90IG5vdCBmb3VuZCBvciBnKysgbm90IGluc3RhbGxlZCAtIGNhbm5vdCBjb250aW51ZSIgJiYgZXhpdCAxXSkKIAogQUNfU1RSVUNUX1RNCiAKQEAgLTMwMiwxMiArNzI3LDE0IEBACiBBQ19DSEVDS19GVU5DUyhbYnplcm9dKQogQUNfQ0hFQ0tfRlVOQ1MoW2Z0cnVuY2F0ZV0pCiBBQ19DSEVDS19GVU5DUyhbZ2V0aG9zdGJ5bmFtZV0pCitBQ19DSEVDS19GVU5DUyhbZ2V0aG9zdGJ5bmFtZV9yXSkKIEFDX0NIRUNLX0ZVTkNTKFtnZXR0aW1lb2ZkYXldKQogQUNfQ0hFQ0tfRlVOQ1MoW21lbW1vdmVdKQogQUNfQ0hFQ0tfRlVOQ1MoW21lbXNldF0pCiBBQ19DSEVDS19GVU5DUyhbbWtkaXJdKQogQUNfQ0hFQ0tfRlVOQ1MoW3JlYWxwYXRoXSkKIEFDX0NIRUNLX0ZVTkNTKFtzZWxlY3RdKQorQUNfQ0hFQ0tfRlVOQ1MoW3NldGxvY2FsZV0pCiBBQ19DSEVDS19GVU5DUyhbc29ja2V0XSkKIEFDX0NIRUNLX0ZVTkNTKFtzdHJjaHJdKQogQUNfQ0hFQ0tfRlVOQ1MoW3N0cmR1cF0pCkBAIC0zMjAsNiArNzQ3LDggQEAKIEFDX0NIRUNLX0ZVTkNTKFtjbG9ja19nZXR0aW1lXSkKIEFDX0NIRUNLX0ZVTkNTKFtzY2hlZF9nZXRfcHJpb3JpdHlfbWluXSkKIEFDX0NIRUNLX0ZVTkNTKFtzY2hlZF9nZXRfcHJpb3JpdHlfbWF4XSkKK0FDX0NIRUNLX0ZVTkNTKFtpbmV0X250b2FdKQorQUNfQ0hFQ0tfRlVOQ1MoW3Bvd10pCiAKIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gIm5vIiA7IHRoZW4KICAgQVhfU0lHTkVEX1JJR0hUX1NISUZUCkBAIC0zMzMsNDMgKzc2Miw2IEBACiAgIEFDX0ZVTkNfRVJST1JfQVRfTElORQogZmkKIAotQVhfVEhSSUZUX0dFTihjcHAsIFtDKytdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jcHBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY3BwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oY19nbGliLCBbQyAoR0xpYildLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jX2dsaWJdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY19nbGliIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oamF2YSwgW0phdmFdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9qYXZhXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2phdmEiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihhczMsIFtBUzNdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9hczNdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fYXMzIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oY3NoYXJwLCBbQyNdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jc2hhcnBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY3NoYXJwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocHksIFtQeXRob25dLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9weV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9weSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHJiLCBbUnVieV0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3JiXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3JiIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocGVybCwgW1BlcmxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9wZXJsXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3BlcmwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihwaHAsIFtQSFBdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9waHBdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fcGhwIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oZXJsLCBbRXJsYW5nXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fZXJsXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2VybCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGNvY29hLCBbQ29jb2FdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9jb2NvYV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9jb2NvYSIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHN0LCBbU21hbGx0YWxrXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fc3RdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fc3QiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihvY2FtbCwgW09DYW1sXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fb2NhbWxdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fb2NhbWwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihocywgW0hhc2tlbGxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9oc10sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9ocyIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHhzZCwgW1hTRF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3hzZF0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl94c2QiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihodG1sLCBbSFRNTF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2h0bWxdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5faHRtbCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGpzLCBbSmF2YVNjcmlwdF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2pzXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2pzIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oamF2YW1lLCBbSmF2YU1FXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5famF2YW1lXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2phdmFtZSIgPSAieWVzIl0pCi0KICMgLS0tIENvdmVyYWdlIGhvb2tzIC0tLQogCiBBQ19BUkdfRU5BQkxFKGNvdmVyYWdlLApAQCAtMzk0LDk3ICs3ODYsMzE1IEBACiBBQ19TVUJTVChHQ09WX0xERkxBR1MpCiAKIEFDX0NPTkZJR19IRUFERVJTKGNvbmZpZy5oOmNvbmZpZy5oaW4pCitBQ19DT05GSUdfSEVBREVSUyhsaWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmg6Y29uZmlnLmhpbikKK0FDX0NPTkZJR19IRUFERVJTKGxpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQorIyBncnVhcmQgYWdhaW5zdCBwcmUgZGVmaW5lZCBjb25maWcuaAorQUhfVE9QKFsKKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKK10pCitBSF9CT1RUT00oWworI2VuZGlmCitdKQorCiAKIEFDX0NPTkZJR19GSUxFUyhbCiAgIE1ha2VmaWxlCiAgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZQotICBjb21waWxlci9jcHAvdmVyc2lvbi5oCisgIGNvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlCisgIGNvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaAogICBsaWIvTWFrZWZpbGUKKyAgbGliL2NsL01ha2VmaWxlCiAgIGxpYi9jcHAvTWFrZWZpbGUKICAgbGliL2NwcC90ZXN0L01ha2VmaWxlCiAgIGxpYi9jcHAvdGhyaWZ0LW5iLnBjCiAgIGxpYi9jcHAvdGhyaWZ0LXoucGMKKyAgbGliL2NwcC90aHJpZnQtcXQucGMKKyAgbGliL2NwcC90aHJpZnQtcXQ1LnBjCiAgIGxpYi9jcHAvdGhyaWZ0LnBjCiAgIGxpYi9jX2dsaWIvTWFrZWZpbGUKICAgbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCiAgIGxpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZQogICBsaWIvY3NoYXJwL01ha2VmaWxlCisgIGxpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUKKyAgbGliL2QvTWFrZWZpbGUKKyAgbGliL2QvdGVzdC9NYWtlZmlsZQogICBsaWIvZXJsL01ha2VmaWxlCi0gIGxpYi9lcmwvc3JjL01ha2VmaWxlCisgIGxpYi9nby9NYWtlZmlsZQorICBsaWIvZ28vdGVzdC9NYWtlZmlsZQorICBsaWIvaGF4ZS90ZXN0L01ha2VmaWxlCiAgIGxpYi9ocy9NYWtlZmlsZQogICBsaWIvamF2YS9NYWtlZmlsZQorICBsaWIvanMvTWFrZWZpbGUKKyAgbGliL2pzL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2pzb24vTWFrZWZpbGUKKyAgbGliL2pzb24vdGVzdC9NYWtlZmlsZQorICBsaWIvbmV0Y29yZS9NYWtlZmlsZQorICBsaWIvbm9kZWpzL01ha2VmaWxlCisgIGxpYi9ub2RldHMvTWFrZWZpbGUKICAgbGliL3BlcmwvTWFrZWZpbGUKICAgbGliL3BlcmwvdGVzdC9NYWtlZmlsZQogICBsaWIvcGhwL01ha2VmaWxlCisgIGxpYi9waHAvdGVzdC9NYWtlZmlsZQorICBsaWIvZGFydC9NYWtlZmlsZQogICBsaWIvcHkvTWFrZWZpbGUKICAgbGliL3JiL01ha2VmaWxlCisgIGxpYi9ycy9NYWtlZmlsZQorICBsaWIvcnMvdGVzdC9NYWtlZmlsZQorICBsaWIvbHVhL01ha2VmaWxlCisgIGxpYi9zd2lmdC9NYWtlZmlsZQorICBsaWIveG1sL01ha2VmaWxlCisgIGxpYi94bWwvdGVzdC9NYWtlZmlsZQogICB0ZXN0L01ha2VmaWxlCisgIHRlc3QvZmVhdHVyZXMvTWFrZWZpbGUKKyAgdGVzdC9jX2dsaWIvTWFrZWZpbGUKKyAgdGVzdC9jbC9NYWtlZmlsZQorICB0ZXN0L2NwcC9NYWtlZmlsZQorICB0ZXN0L2NzaGFycC9NYWtlZmlsZQorICB0ZXN0L2VybC9NYWtlZmlsZQorICB0ZXN0L2dvL01ha2VmaWxlCisgIHRlc3QvaGF4ZS9NYWtlZmlsZQogICB0ZXN0L2hzL01ha2VmaWxlCisgIHRlc3QvbHVhL01ha2VmaWxlCisgIHRlc3QvbmV0Y29yZS9NYWtlZmlsZQorICB0ZXN0L3BocC9NYWtlZmlsZQorICB0ZXN0L2RhcnQvTWFrZWZpbGUKKyAgdGVzdC9wZXJsL01ha2VmaWxlCiAgIHRlc3QvcHkvTWFrZWZpbGUKICAgdGVzdC9weS50d2lzdGVkL01ha2VmaWxlCisgIHRlc3QvcHkudG9ybmFkby9NYWtlZmlsZQogICB0ZXN0L3JiL01ha2VmaWxlCisgIHRlc3QvcnMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvTWFrZWZpbGUKKyAgdHV0b3JpYWwvY19nbGliL01ha2VmaWxlCisgIHR1dG9yaWFsL2NsL01ha2VmaWxlCisgIHR1dG9yaWFsL2NwcC9NYWtlZmlsZQorICB0dXRvcmlhbC9kL01ha2VmaWxlCisgIHR1dG9yaWFsL2dvL01ha2VmaWxlCisgIHR1dG9yaWFsL2hheGUvTWFrZWZpbGUKKyAgdHV0b3JpYWwvaHMvTWFrZWZpbGUKKyAgdHV0b3JpYWwvamF2YS9NYWtlZmlsZQorICB0dXRvcmlhbC9qcy9NYWtlZmlsZQorICB0dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlCisgIHR1dG9yaWFsL25vZGVqcy9NYWtlZmlsZQorICB0dXRvcmlhbC9kYXJ0L01ha2VmaWxlCisgIHR1dG9yaWFsL3B5L01ha2VmaWxlCisgIHR1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZQorICB0dXRvcmlhbC9yYi9NYWtlZmlsZQorICB0dXRvcmlhbC9ycy9NYWtlZmlsZQogXSkKIAoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DUFA9ImNwcCIgOyBlbHNlIE1BWUJFX0NQUD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ1BQXSkKK2lmIHRlc3QgIiRoYXZlX2NfZ2xpYiIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ19HTElCPSJjX2dsaWIiIDsgZWxzZSBNQVlCRV9DX0dMSUI9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NfR0xJQl0pCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIC1hICIkaGF2ZV9kZWltb3NfZXZlbnQyIiA9ICJ5ZXMiIC1hICIkaGF2ZV9kZWltb3Nfb3BlbnNzbCIgPSAieWVzIjsgdGhlbiBNQVlCRV9EPSJkIiA7IGVsc2UgTUFZQkVfRD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRF0pCitpZiB0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9KQVZBPSJqYXZhIiA7IGVsc2UgTUFZQkVfSkFWQT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfSkFWQV0pCitpZiB0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyIgOyB0aGVuIE1BWUJFX0NTSEFSUD0iY3NoYXJwIiA7IGVsc2UgTUFZQkVfQ1NIQVJQPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DU0hBUlBdKQoraWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QWVRIT049InB5IiA7IGVsc2UgTUFZQkVfUFlUSE9OPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QWVRIT05dKQoraWYgdGVzdCAiJGhhdmVfcHkzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QWTM9InB5MyIgOyBlbHNlIE1BWUJFX1BZMz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUFkzXSkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuIE1BWUJFX1JVQlk9InJiIiA7IGVsc2UgTUFZQkVfUlVCWT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUlVCWV0pCitpZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9IQVNLRUxMPSJocyIgOyBlbHNlIE1BWUJFX0hBU0tFTEw9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0hBU0tFTExdKQoraWYgdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUEVSTD0icGVybCIgOyBlbHNlIE1BWUJFX1BFUkw9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BFUkxdKQoraWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QSFA9InBocCIgOyBlbHNlIE1BWUJFX1BIUD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUEhQXSkKK2lmIHRlc3QgIiRoYXZlX2RhcnQiID0gInllcyIgOyB0aGVuIE1BWUJFX0RBUlQ9ImRhcnQiIDsgZWxzZSBNQVlCRV9EQVJUPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9EQVJUXSkKK2lmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9HTz0iZ28iIDsgZWxzZSBNQVlCRV9HTz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfR09dKQoraWYgdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9OT0RFSlM9Im5vZGVqcyIgOyBlbHNlIE1BWUJFX05PREVKUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTk9ERUpTXSkKK2lmIHRlc3QgIiRoYXZlX25vZGV0cyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTk9ERVRTPSJub2RldHMiIDsgZWxzZSBNQVlCRV9OT0RFVFM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX05PREVUU10pCitpZiB0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyIgOyB0aGVuIE1BWUJFX0VSTEFORz0iZXJsIiA7IGVsc2UgTUFZQkVfRVJMQU5HPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9FUkxBTkddKQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9MVUE9Imx1YSIgOyBlbHNlIE1BWUJFX0xVQT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTFVBXSkKK2lmIHRlc3QgIiRoYXZlX3JzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9SUz0icnMiIDsgZWxzZSBNQVlCRV9SUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUlNdKQoraWYgdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyIgOyB0aGVuIE1BWUJFX1NXSUZUPSJzd2lmdCIgOyBlbHNlIE1BWUJFX1NXSUZUPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9TV0lGVF0pCitpZiB0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9ET1RORVRDT1JFPSJuZXRjb3JlIiA7IGVsc2UgTUFZQkVfRE9UTkVUQ09SRT0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRE9UTkVUQ09SRV0pCitpZiB0ZXN0ICIkaGF2ZV9jbCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ0w9ImNsIiA7IGVsc2UgTUFZQkVfQ0w9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NMXSkKKwogQUNfT1VUUFVUCiAKIAogZWNobwogZWNobyAiJFBBQ0tBR0UgJFZFUlNJT04iCiBlY2hvCi1lY2hvICJCdWlsZGluZyBjb2RlIGdlbmVyYXRvcnMgLi4uLi4gOiR0aHJpZnRfZ2VuZXJhdG9ycyIKLWVjaG8KLWVjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKIGVjaG8gIkJ1aWxkaW5nIEMgKEdMaWIpIExpYnJhcnkgLi4uLiA6ICRoYXZlX2NfZ2xpYiIKLWVjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCi1lY2hvICJCdWlsZGluZyBDIyBMaWJyYXJ5IC4uLi4uLi4uLi4gOiAkaGF2ZV9jc2hhcnAiCi1lY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCi1lY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgorZWNobyAiQnVpbGRpbmcgQyMgKE1vbm8pIExpYnJhcnkgLi4uIDogJGhhdmVfY3NoYXJwIgorZWNobyAiQnVpbGRpbmcgQysrIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfY3BwIgorZWNobyAiQnVpbGRpbmcgQ29tbW9uIExpc3AgTGlicmFyeS4uIDogJGhhdmVfY2wiCitlY2hvICJCdWlsZGluZyBEIExpYnJhcnkgLi4uLi4uLi4uLi4gOiAkaGF2ZV9kIgorZWNobyAiQnVpbGRpbmcgRGFydCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfZGFydCIKK2VjaG8gIkJ1aWxkaW5nIGRvdG5ldGNvcmUgTGlicmFyeSAuLiA6ICRoYXZlX2RvdG5ldGNvcmUiCitlY2hvICJCdWlsZGluZyBFcmxhbmcgTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9lcmxhbmciCitlY2hvICJCdWlsZGluZyBHbyBMaWJyYXJ5IC4uLi4uLi4uLi4gOiAkaGF2ZV9nbyIKIGVjaG8gIkJ1aWxkaW5nIEhhc2tlbGwgTGlicmFyeSAuLi4uLiA6ICRoYXZlX2hhc2tlbGwiCitlY2hvICJCdWlsZGluZyBIYXhlIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9oYXhlIgorZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKK2VjaG8gIkJ1aWxkaW5nIEx1YSBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2x1YSIKK2VjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKIGVjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCiBlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCi1lY2hvICJCdWlsZGluZyBFcmxhbmcgTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9lcmxhbmciCi1pZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiQnVpbGRpbmcgVFpsaWJUcmFuc3BvcnQgLi4uLi4uIDogJGhhdmVfemxpYiIKLSAgZWNobyAiQnVpbGRpbmcgVE5vbmJsb2NraW5nU2VydmVyIC4uIDogJGhhdmVfbGliZXZlbnQiCi1maQotaWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJVc2luZyBqYXZhYyAuLi4uLi4uLi4uLi4uLi4uLi4gOiAkSkFWQUMiCi0gIGVjaG8gIlVzaW5nIGphdmEgLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBIgotICBlY2hvICJVc2luZyBhbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkQU5UIgotZmkKK2VjaG8gIkJ1aWxkaW5nIFBsdWdpbiBTdXBwb3J0IC4uLi4uLiA6ICRoYXZlX3BsdWdpbiIKK2VjaG8gIkJ1aWxkaW5nIFB5dGhvbiBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX3B5dGhvbiIKK2VjaG8gIkJ1aWxkaW5nIFB5MyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3B5MyIKK2VjaG8gIkJ1aWxkaW5nIFJ1YnkgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3J1YnkiCitlY2hvICJCdWlsZGluZyBSdXN0IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ycyIKK2VjaG8gIkJ1aWxkaW5nIFN3aWZ0IExpYnJhcnkgLi4uLi4uLiA6ICRoYXZlX3N3aWZ0IgorCiBpZiB0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiVXNpbmcgLk5FVCAzLjUgLi4uLi4uLi4uLi4uLi4uIDogJG5ldF8zXzUiCisgIGVjaG8gIkMjIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyAuTkVUIDMuNSAuLi4uLi4uLi4uLi4gOiAkbmV0XzNfNSIKKyAgZWNobyAiICAgVXNpbmcgbW9ubyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkTUNTIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJVc2luZyBQeXRob24gLi4uLi4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OIgorICBlY2hvICJDKysgTGlicmFyeToiCisgIGVjaG8gIiAgIEMrKyBjb21waWxlciAuLi4uLi4uLi4uLi4uLiA6ICRDWFgiCisgIGVjaG8gIiAgIEJ1aWxkIFRabGliVHJhbnNwb3J0IC4uLi4uLiA6ICRoYXZlX3psaWIiCisgIGVjaG8gIiAgIEJ1aWxkIFROb25ibG9ja2luZ1NlcnZlciAuLiA6ICRoYXZlX2xpYmV2ZW50IgorICBlY2hvICIgICBCdWlsZCBUUVRjcFNlcnZlciAoUXQ0KSAuLi4gOiAkaGF2ZV9xdCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NSkgLi4uIDogJGhhdmVfcXQ1IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgdmVyc2lvbiAuLi4uLi4gOiAkKCRDWFggLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCisgIGVjaG8gIkNvbW1vbiBMaXNwIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDb21tb24gTGlzcCAuLi4uLi4uLi4gOiAkU0JDTCIKKyAgZWNobyAiICAgVXNpbmcgQ29tbW9uIExpc3AgdmVyc2lvbiAuIDogJCgkU0JDTCAtLXZlcnNpb24pIgogZmkKLWlmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgotICBlY2hvICJVc2luZyByc3BlYyAuLi4uLi4uLi4uLi4uLi4uLi4gOiAkUlNQRUMiCisgIGVjaG8gIkQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEQgQ29tcGlsZXIgLi4uLi4uLi4uLiA6ICRETUQiCisgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgbGliZXZlbnQgdGVzdHMgLiA6ICR3aXRoX2RfZXZlbnRfdGVzdHMiCisgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgU1NMIHRlc3RzIC4uLi4uLiA6ICR3aXRoX2Rfc3NsX3Rlc3RzIgorICBlY2hvICIgICBVc2luZyBEIHZlcnNpb24gLi4uLi4uLi4uLi4gOiAkKCRETUQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2RhcnQiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCi0gIGVjaG8gIlVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKKyAgZWNobyAiRGFydCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgRGFydCAuLi4uLi4uLi4uLi4uLi4uIDogJERBUlQiCisgIGVjaG8gIiAgIFVzaW5nIFB1YiAuLi4uLi4uLi4uLi4uLi4uLiA6ICREQVJUUFVCIgorICBlY2hvICIgICBVc2luZyBEYXJ0IHZlcnNpb24gLi4uLi4uLi4gOiAkKCREQVJUIC0tdmVyc2lvbiAyPiYxKSIKIGZpCi1pZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJVc2luZyBQZXJsIC4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkUEVSTCIKKyAgZWNobyAiLk5FVCBDb3JlIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyAuTkVUIENvcmUgLi4uLi4uLi4uLi4gOiAkRE9UTkVUQ09SRSIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIHZlcnNpb24gLi4uIDogJERPVE5FVENPUkVfVkVSU0lPTiIKIGZpCiBpZiB0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiVXNpbmcgZXJsYyAuLi4uLi4uLi4uLi4uLi4uLi4uIDogJEVSTEMiCisgIGVjaG8gIkVybGFuZyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyAuLi4uLi4uLi4uLi4uLi4uIDogJEVSTEMiCisgIGVjaG8gIiAgIFVzaW5nIHJlYmFyIC4uLi4uLi4uLi4uLi4uLiA6ICRSRUJBUiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkRVJMIC1ldmFsICdlcmxhbmc6ZGlzcGxheShlcmxhbmc6c3lzdGVtX2luZm8ob3RwX3JlbGVhc2UpKSwgaGFsdCgpLicgLW5vc2hlbGwgfCB0ciAtZCAnXCInKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJHbyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgR28uLi4uLi4uLi4uLi4uLi4uLi4uIDogJEdPIgorICBlY2hvICIgICBVc2luZyBHbyB2ZXJzaW9uLi4uLi4uLi4uLi4gOiAkKCRHTyB2ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgdmVyc2lvbiAuLi4uLiA6ICQoJFJVTkhBU0tFTEwgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhheGUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgLi4uLi4uLi4uLi4uLi4uLiA6ICRIQVhFIgorICBlY2hvICIgICBVc2luZyBIYXhlIHZlcnNpb24gLi4uLi4uLi4gOiAkSEFYRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZ3JhZGxldyAuLi4uLi4uLi4uLi4uIDogbGliL2phdmEvZ3JhZGxldyIKKyAgZWNobyAiICAgVXNpbmcgamF2YSAuLi4uLi4uLi4uLi4uLi4uIDogJEpBVkEiCisgIGVjaG8gIiAgIFVzaW5nIGphdmFjIC4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBQyIKKyAgZWNobyAiICAgVXNpbmcgR3JhZGxlIHZlcnNpb24gLi4uLi4uIDogJChsaWIvamF2YS9ncmFkbGV3IC0tdmVyc2lvbiAtLXF1aWV0IHwgZ3JlcCBHcmFkbGUgMj4mMSkiCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEpBVkEgLXZlcnNpb24gMj4mMSB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkx1YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgTHVhIC4uLi4uLi4uLi4uLi4uLi4uIDogJExVQSIKKyAgZWNobyAiICAgVXNpbmcgTHVhIHZlcnNpb24uLi4uLi4uLi4uIDogJCgkTFVBIC12KSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiTm9kZUpTIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgLi4uLi4uLi4uLi4uLi4gOiAkTk9ERUpTIgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgdmVyc2lvbi4uLi4uLi4gOiAkKCROT0RFSlMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBlcmwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgorICBlY2hvICIgICBVc2luZyBQZXJsIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRQRVJMIC12IHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUEhQIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKKyAgZWNobyAiICAgVXNpbmcgcGhwIHZlcnNpb24gLi4uLi4uLi4uIDogJCgkUEhQIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQeXRob24gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiB2ZXJzaW9uIC4uLi4uLiA6ICQoJFBZVEhPTiAtLXZlcnNpb24gMj4mMSkiCisgIGlmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uMyAuLi4uLi4uLi4uLi4uIDogJFBZVEhPTjMiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgdmVyc2lvbiAuLi4uLiA6ICQoJFBZVEhPTjMgLS12ZXJzaW9uKSIKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyI7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgdHJpYWwgLi4uLi4uLi4uLi4uLi4uIDogJFRSSUFMIgorICBmaQorZmkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVieSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUnVieSAuLi4uLi4uLi4uLi4uLi4uIDogJFJVQlkiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJFJVQlkgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJSdXN0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYXJnby4uLi4uLi4uLi4uLi4uLi4gOiAkQ0FSR08iCisgIGVjaG8gIiAgIFVzaW5nIHJ1c3RjLi4uLi4uLi4uLi4uLi4uLiA6ICRSVVNUQyIKKyAgZWNobyAiICAgVXNpbmcgUnVzdCB2ZXJzaW9uLi4uLi4uLi4uIDogJCgkUlVTVEMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJTd2lmdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgLi4uLi4uLi4uLi4uLi4uIDogJFNXSUZUIgorICBlY2hvICIgICBVc2luZyBTd2lmdCB2ZXJzaW9uIC4uLi4uLi4gOiAkKCRTV0lGVCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCiBlY2hvCiBlY2hvICJJZiBzb21ldGhpbmcgaXMgbWlzc2luZyB0aGF0IHlvdSB0aGluayBzaG91bGQgYmUgcHJlc2VudCwiCiBlY2hvICJwbGVhc2Ugc2tpbSB0aGUgb3V0cHV0IG9mIGNvbmZpZ3VyZSB0byBmaW5kIHRoZSBtaXNzaW5nIgogZWNobyAiY29tcG9uZW50LiAgRGV0YWlscyBhcmUgcHJlc2VudCBpbiBjb25maWcubG9nLiIKK2VjaG8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZyBiL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA4YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9BcHAuY29uZmlnCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgCisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbiBuYW1lPSJyZWJ1cyIgdHlwZT0iUmVidXMuQ29uZmlndXJhdGlvbi5SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uLCBSZWJ1cyIvPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxyZWJ1cyBpbnB1dFF1ZXVlPSJNeVJlc3BvbnNlcyIgZXJyb3JRdWV1ZT0iTXlFcnJvcnMiIHdvcmtlcnM9IjEiPgorICAgIDxlbmRwb2ludHM+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVxdWVzdENhbGwsIFJlYnVzU2FtcGxlIiBlbmRwb2ludD0iTWF0aFJlcXVlc3RzIi8+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVzcG9uc2VDYWxsLCBSZWJ1c1NhbXBsZSIgZW5kcG9pbnQ9Ik1hdGhSZXNwb25zZXMiLz4KKyAgICA8L2VuZHBvaW50cz4KKyAgPC9yZWJ1cz4KKworICA8c3RhcnR1cD48c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC4wIi8+PC9zdGFydHVwPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcyBiL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNjNjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsODEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBSZWJ1c1NhbXBsZS5DbGllbnQ7Cit1c2luZyBSZWJ1c1NhbXBsZS5TZXJ2ZXI7CisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBTdGFydFJlcXVlc3RTZXJ2ZXIoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2xpZW50IFJlYnVzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHZhciBhZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChhZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xKCJhbXFwOi8vIiArIHNlcnZlciwgIk1hdGhSZXF1ZXN0cyIsICJNYXRoUmVxdWVzdEVycm9ycyIpKQorICAgICAgICAgICAgICAgIC5NZXNzYWdlT3duZXJzaGlwKG8gPT4gby5Gcm9tUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbigpKQorICAgICAgICAgICAgICAgIC5DcmVhdGVCdXMoKS5TdGFydCgpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBhbGwgcmVsZXZhbnQgbWVzc2FnZSBoYW5kbGVycyAKKyAgICAgICAgICAgIGFkYXB0ZXIuUmVnaXN0ZXIodHlwZW9mKE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIgU3RhcnRSZXNwb25zZVNlcnZlcihzdHJpbmcgc2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGllbnQgUmVidXMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgdmFyIGFkYXB0ZXIgPSBuZXcgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIoKTsKKyAgICAgICAgICAgIENvbmZpZ3VyZS5XaXRoKGFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXEoImFtcXA6Ly8iICsgc2VydmVyLCAiTWF0aFJlc3BvbnNlcyIsICJNYXRoUmVzcG9uc2VFcnJvcnMiKSkKKyAgICAgICAgICAgICAgICAuTWVzc2FnZU93bmVyc2hpcChvID0+IG8uRnJvbVJlYnVzQ29uZmlndXJhdGlvblNlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAuQ3JlYXRlQnVzKCkuU3RhcnQoKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHJlbGV2YW50IG1lc3NhZ2UgaGFuZGxlcnMgCisgICAgICAgICAgICBhZGFwdGVyLlJlZ2lzdGVyKHR5cGVvZihNYXRoUmVzcG9uc2VDYWxsSGFuZGxlcikpOworICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzZXJ2ZXIgPSAibG9jYWxob3N0IjsKKworICAgICAgICAgICAgLy8gc3RhcnQgYWxsIHNlcnZlcnMKKyAgICAgICAgICAgIHZhciByZXEgPSBTdGFydFJlcXVlc3RTZXJ2ZXIoc2VydmVyKTsKKyAgICAgICAgICAgIHZhciByc3AgPSBTdGFydFJlc3BvbnNlU2VydmVyKHNlcnZlcik7CisKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXF1ZXN0Q2xpZW50KHNlcnZlcik7CisgICAgICAgICAgICBjbGllbnQuRG9UaGVNYXRoKHJhbmRvbS5OZXh0KCksIHJhbmRvbS5OZXh0KCkpOworCisgICAgICAgICAgICAvLyBub3cgd2hhdD8KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIkhpdCA8RU5URVI+IHRvIHN0b3AgLi4uICIpOworICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3NmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzOCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCitbYXNzZW1ibHk6IEd1aWQoIjBhZjEwOTg0LTQwZDMtNDUzZC1iMWU1LTQyMTUyOWU4YzdlMiIpXQorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1JFQURNRS5tZCBiL2NvbnRyaWIvUmVidXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjljNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1JFQURNRS5tZApAQCAtMCwwICsxLDIxIEBACitTYW1wbGUgY29kZSBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIFRocmlmdCB3aXRoIFJlYnVzLgorCitSZWJ1cyBpcyBhIC5ORVQgc2VydmljZSBidXMsIHNpbWlsYXIgdG8gTlNlcnZpY2VCdXMsIGJ1dCBtb3JlIGxpZ2h0d2VpZ2h0LiAKK0l0IGloYXMgYmVlbiBtYWlubHkgd3JpdHRlbiBieSBNb2dlbnMgSGVsbGVyIEdyYWJlIGFuZCBpcyBjdXJyZW50bHkgaG9zdGVkIAorb24gR2l0SHViIChodHRwczovL2dpdGh1Yi5jb20vcmVidXMtb3JnL1JlYnVzKQorCitBcyB3aXRoIGFsbCBTZXJ2aWNlQnVzIG9yIE1RIHNjZW5hcmlvcywgZHVlIHRvIHRoZSBoaWdobHkgYXN5bmNocm9ub3VzIAorb3BlcmF0aW9ucyBpdCBpcyByZWNvbW1lbmRlZCB0byBkbyBhbGwgY2FsbHMgYXMgIm9uZXdheSB2b2lkIiBjYWxscy4KKworVGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRvbmUgdmlhIEFwcC5Db25maWcsIHZpYSBjb2RlIG9yIGV2ZW4gbWl4ZWQgZnJvbSAKK2JvdGggbG9jYXRpb25zLiBSZWZlciB0byB0aGUgUmVidXMgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiBGb3IgCit0aGlzIGV4YW1wbGUsIHNpbmNlIHdlIGFyZSBlZmZlY3RpdmVseSBpbXBsZW1lbnRpbmcgdHdvIHF1ZXVlIGxpc3RlbmVycyBpbiAKK29ubHkgb25lIHNpbmdsZSBwcm9jZXNzLCB3ZSBkbyBjb25maWd1cmF0aW9uIG9mIGluY29taW5nIGFuZCBlcnJvciBxdWV1ZXMgCitpbiB0aGUgY29kZS4KKworSWYgeW91IHdhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBub24tTkVUIGxhbmd1YWdlcywgeW91IG1heSBuZWVkIGEgY3VzdG9taXplZCAKK3NlcmlhbGl6ZXIgYXMgd2VsbCwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgUmVidXMnIGRlZmF1bHQgd2lyZSBmb3JtYXQuIFBsZWFzZSAKK3JlZmVyIHRvIHRoZSBSZWJ1cyBkb2NzIG9uIGhvdyB0byBkbyB0aGF0IChpdCdzIG5vdCB0aGF0IGhhcmQsIHJlYWxseSkuCisKK0FkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOgorLSBSYWJiaXRNUSAuTkVUIGNsaWVudCAoc2VlIG51Z2V0KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2ogYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU4YTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2oKQEAgLTAsMCArMSwxMDIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPnsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlJlYnVzU2FtcGxlPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+UmVidXNTYW1wbGU8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJhYmJpdE1RLkNsaWVudCI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XHJhYmJpdG1xLWRvdG5ldC1jbGllbnQtMy4yLjEtZG90bmV0LTMuMFxiaW5cUmFiYml0TVEuQ2xpZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSZWJ1cyI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XFJlYnVzLW1hc3RlclxkZXBsb3lcTkVUNDBcUmVidXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJlYnVzLlJhYmJpdE1RIj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlwuLlwuLlxUb29sYm94XFNlcnZpY2VCdXNcM3JkcGFydHlcUmVidXMtbWFzdGVyXGRlcGxveVxORVQ0MFxSZWJ1cy5SYWJiaXRNUS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbXBsXEJvdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcU2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJBcHAuY29uZmlnIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cCAvPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OWViNjNjLWQ3NGMtNDdlOC1hZTQ4LWEyZmM5NDUzOGU5ZH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+Y2QgJChQcm9qZWN0RGlyKQoraWYgbm90IGV4aXN0IGdlbi1jc2hhcnBcKi5jcyAgIHRocmlmdCAgLWdlbiBjc2hhcnAgc2FtcGxlLnRocmlmdAorPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4gYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRlZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4KQEAgLTAsMCArMSwyOCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTMKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMi4wLjMwMTEwLjAKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlJlYnVzU2FtcGxlIiwgIlJlYnVzU2FtcGxlLmNzcHJvaiIsICJ7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTY3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL0JvdGguY3MKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIC8vIGdlbmVyaWMgZGF0YSBjb250YWluZXIgZm9yIHNlcmlhbGl6ZWQgVGhyaWZ0IGNhbGxzCisgICAgcHVibGljIGNsYXNzIEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbAorICAgIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSByYXdCeXRlczsKKyAgICB9CisKKyAgICAvLyBzcGVjaWZpYyBjb250YWluZXJzIChvbmUgcGVyIFRocmlmdCBzZXJ2aWNlKSB0byBsZXZlcmFnZSBSZWJ1cycgaGFuZGxlciByb3V0aW5nCisgICAgcHVibGljIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKyAgICBwdWJsaWMgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9DbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwODA0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTU3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBSZWJ1czsKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5NZXNzYWdlczsKK3VzaW5nIFJlYnVzLlJhYmJpdE1ROwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCisvKgorICogVGhlIGNsaWVudCBlbWl0cyBjYWxscyB0byBCYXNpY01hdGhTZXJ2ZXJzCisgKiAKKyAqIFRoZSBjbGllbnQgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UuIAorICogSWYgdGhlIHNlcnZlciBoYXMgcHJvY2Vzc2VkIG91ciByZXF1ZXN0LCB3ZSBnZXQgdGhlIHJlc3VsdHMgYmFjayB0aHJvdWdoIHRoaXMgc2VydmljZQorICovCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5DbGllbnQKK3sKKworICAgIC8vIGhhbmRsZXIgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFJlYnVzCisgICAgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlc3BvbnNlQ2FsbD4KKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEhhbmRsZShNYXRoUmVzcG9uc2VDYWxsIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRocmlmdCBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKG1lc3NhZ2UucmF3Qnl0ZXMpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBwcm9jZXNzb3IgYW5kIGxldCBoaW0gaGFuZGxlIHRoZSBjYWxsCisgICAgICAgICAgICB2YXIgaG5kbCA9IG5ldyBNYXRoUmVzcG9uc2VzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoQ2xpZW50LlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0gICAgICAKKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyByZXNwb25zZXMgd2l0aCBjYWxjdWxhdGlvbiByZXN1bHRzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlc0hhbmRsZXIgOiBCYXNpY01hdGhDbGllbnQuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEZvdXJSZXN1bHRzKGludCBhZGRlZCwgaW50IG11bHRpcGxpZWQsIGludCBzdWJ0cmFjdGVkLCBpbnQgZGl2aWRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZGVkID0gezB9IiwgYWRkZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11bHRpcGxpZWQ9IHswfSIsIG11bHRpcGxpZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInN1YnRyYWN0ZWQgPSB7MH0iLCBzdWJ0cmFjdGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkaXZpZGVkID0gezB9IiwgZGl2aWRlZCk7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZVJlc3VsdHMoaW50IGFkZGVkLCBpbnQgbXVsdGlwbGllZCwgaW50IHN1YnRyYWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGRlZCA9IHswfSIsIGFkZGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdWx0aXBsaWVkPSB7MH0iLCBtdWx0aXBsaWVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdWJ0cmFjdGVkID0gezB9Iiwgc3VidHJhY3RlZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRElWLzAgZXJyb3IgZHVyaW5nIGRpdmlzaW9uIik7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsYXRlbmN5ID0gRGF0ZVRpbWUuTm93LlRpY2tzIC0gdmFsdWU7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUGluZyB0b29rIHswfSBtcyIsIG5ldyBEYXRlVGltZShsYXRlbmN5KS5NaWxsaXNlY29uZCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBQaW5nQW5kRG9Bbm90aGVyQ2FsY3VsYXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVxdWVzdENsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBjbGllbnQuUGluZyhEYXRlVGltZS5Ob3cuVGlja3MpOworICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChyYW5kb20uTmV4dCgpLCByYW5kb20uTmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVxdWVzdHMKKyAgICBpbnRlcm5hbCBjbGFzcyBNYXRoUmVxdWVzdENsaWVudCA6IEJhc2ljTWF0aFNlcnZlci5JZmFjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBNUUFkYXB0ZXI7CisKKworICAgICAgICBwdWJsaWMgTWF0aFJlcXVlc3RDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aFNlcnZlci5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aFNlcnZlci5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiggYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVxdWVzdENhbGwoKSB7IHJhd0J5dGVzID0gc3RtLlRvQXJyYXkoKSB9OworICAgICAgICAgICAgTVFBZGFwdGVyLkJ1cy5TZW5kKG1zZyk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuUGluZyh2YWx1ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgRG9UaGVNYXRoKCBpbnQgYXJnMSwgaW50IGFyZzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChhcmcxLCBhcmcyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcwpAQCAtMCwwICsxLDE0MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgUmVidXM7Cit1c2luZyBSZWJ1cy5Db25maWd1cmF0aW9uOwordXNpbmcgUmVidXMuTWVzc2FnZXM7Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworLyoKKyAqIFRoZSBzZXJ2ZXIgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoU2VydmVyIHNlcnZpY2UgLgorICogQWxsIHJlc3VsdHMgYXJlIHNlbnQgYmFjayB0byB0aGUgY2xpZW50IHZpYSB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UKKyAqLworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5TZXJ2ZXIKK3sKKyAgICAvLyBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBSZWJ1cworICAgIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlcXVlc3RDYWxsPgorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgSGFuZGxlKE1hdGhSZXF1ZXN0Q2FsbCBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShtZXNzYWdlLnJhd0J5dGVzKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcHJvY2Vzc29yIGFuZCBsZXQgaGltIGhhbmRsZSB0aGUgY2FsbAorICAgICAgICAgICAgdmFyIGhuZGwgPSBuZXcgTWF0aFJlcXVlc3RzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoU2VydmVyLlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyBjYWxjdWxhdGlvbiByZXF1ZXN0cworICAgIGludGVybmFsIGNsYXNzIE1hdGhSZXF1ZXN0c0hhbmRsZXIgOiBCYXNpY01hdGhTZXJ2ZXIuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVzcG9uc2VDbGllbnQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEb1RoZU1hdGgoaW50IGFyZzEsIGludCBhcmcyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXNwb25zZUNsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBpZiggYXJnMiAhPSAwKQorICAgICAgICAgICAgICAgIGNsaWVudC5Gb3VyUmVzdWx0cyggYXJnMSthcmcyLCBhcmcxKmFyZzIsIGFyZzEtYXJnMiwgYXJnMS9hcmcyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKCBhcmcxK2FyZzIsIGFyZzEqYXJnMiwgYXJnMS1hcmcyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVzcG9uc2VzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlQ2xpZW50IDogQmFzaWNNYXRoQ2xpZW50LklmYWNlCisgICAgeworICAgICAgICBwcml2YXRlIEJ1aWx0aW5Db250YWluZXJBZGFwdGVyIE1RQWRhcHRlcjsKKworCisgICAgICAgIHB1YmxpYyBNYXRoUmVzcG9uc2VDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aENsaWVudC5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aENsaWVudC5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVzcG9uc2VDYWxsKCkgeyByYXdCeXRlcyA9IHN0bS5Ub0FycmF5KCkgfTsKKyAgICAgICAgICAgIE1RQWRhcHRlci5CdXMuU2VuZChtc2cpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBGb3VyUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCwgaW50IGRpdmlkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkZvdXJSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkLCBkaXZpZGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQgYi9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvc2FtcGxlLnRocmlmdApAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3NlcnZpY2UgQmFzaWNNYXRoU2VydmVyIHsKKyAgICBvbmV3YXkgdm9pZCBEb1RoZU1hdGgoIDE6IGkzMiBhcmcxLCAgMjogaTMyIGFyZzIpCisgICAgb25ld2F5IHZvaWQgUGluZygxOiBpNjQgdmFsdWUpCit9CisKK3NlcnZpY2UgQmFzaWNNYXRoQ2xpZW50IHsKKyAgICBvbmV3YXkgdm9pZCBUaHJlZVJlc3VsdHMoIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkKTsKKyAgICBvbmV3YXkgdm9pZCBGb3VyUmVzdWx0cyggIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkLCA0IDogaTMyIGRpdmlkZWQpOworICAgIG9uZXdheSB2b2lkIFBvbmcoMTogaTY0IHZhbHVlKQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9TdG9tcC9SRUFETUUubWQgYi9jb250cmliL1N0b21wL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTVmMjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9TdG9tcC9SRUFETUUubWQKQEAgLTAsMCArMSwxOCBAQAorU2FtcGxlIGNvZGUgZm9yIFNUT01QLWJhc2VkIFRocmlmdCBjbGllbnRzIGFuZC9vciBzZXJ2ZXJzLgorCitBbHRob3VnaCB0aGUgc2FtcGxlIFRocmlmdCBTVE9NUCBUcmFuc3BvcnQgaXMgd3JpdHRlbiBpbiAKK0RlbHBoaS9QYXNjYWwsIGl0IGNhbiBlYXNpbHkgc2VydmUgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgCitzaW1pbGFyIGltcGxlbWVudGF0aW9ucyBpbiBvdGhlciBsYW5ndWFnZXMuCisKK1NUT01QIGlzIGEgcHJvdG9jb2wgd2lkZWx5IHN1cHBvcnRlZCBieSBtYW55IG1lc3NhZ2luZyBzeXN0ZW1zLAorc3VjaCBhcyBBcGFjaGUgQWN0aXZlTVEsIFJhYmJpdE1RIGFuZCBtYW55IG90aGVycy4gSW4gcGFydGljdWxhciwKK2l0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggU2VydmljZS1CdXMgcHJvZHVjdHMgbGlrZSBSZWJ1cworb3IgTlNlcnZpY2VCdXMsIHdoZW4gcnVubmluZyBhZ2FpbnN0IGEgU1RPTVAtY2FwYWJsZSBNUSBzeXN0ZW0uCisKK0EgcHJlcmVxdWlzaXRlIGZvciB0aGlzIHNhbXBsZSBpcyB0aGUgRGVscGhpIFNUT01QIEFkYXB0ZXIgd3JpdHRlbgorYnkgRGFuaWVsZSBUZXRpIChodHRwOi8vd3d3LmRhbmllbGV0ZXRpLml0L3N0b21wLWNsaWVudCksIGN1cnJlbnRseQoraG9zdGVkIGF0IEdvb2dsZSBDb2RlIChodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZGVscGhpc3RvbXBjbGllbnQpLgorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgU1RPTVAgYWRhcHRlciBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IAorYmluYXJ5IGRhdGEuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHRoaXMgaGFzIGJlZW4gZml4ZWQsIG90aGVyd2lzZSAKK3lvdSBoYXZlIHRvIHVzZSB0aGUgSlNPTiBwcm90b2NvbCAob3IgdG8gZml4IGl0IG9uIHlvdXIgb3duKS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvU3RvbXAvVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUC5wYXMgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCkBAIC0wLDAgKzEsMjAwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcyxXaW5kb3dzLCBTeXNVdGlscywKKyAgVGhyaWZ0LAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5TdHJlYW0sCisgIFN0b21wQ2xpZW50LAorICBTdG9tcFR5cGVzOworCit0eXBlCisgIFRTdG9tcFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkRhdGEgICAgIDogVFN0cmluZ1N0cmVhbTsKKyAgICBGU2VydmVyICAgOiBzdHJpbmc7CisgICAgRk91dFF1ZXVlIDogc3RyaW5nOworICAgIEZTdG9tcENsaSA6IElTdG9tcENsaWVudDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTZXJ2ZXIgIDogc3RyaW5nOworICAgIEZJblF1ZXVlIDogc3RyaW5nOworICAgIEZDbGllbnQgIDogSVN0b21wQ2xpZW50OworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFJblF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKK2NvbnN0CisgIFFVRVVFX1BSRUZJWCAgICA9ICcvcXVldWUvJzsKKyAgVE9QSUNfUFJFRklYICAgID0gJy90b3BpYy8nOworICBFWENIQU5HRV9QUkVGSVggPSAnL2V4Y2hhbmdlLyc7CisKKworaW1wbGVtZW50YXRpb24KKworCisKK2NvbnN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKK3ZhciBhZGFwdGVyIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZEYXRhICAgICA6PSBUU3RyaW5nU3RyZWFtLkNyZWF0ZTsKKyAgRlNlcnZlciAgIDo9IGFTZXJ2ZXJBbmRQb3J0OworICBGT3V0UXVldWUgOj0gYU91dFF1ZXVlOworCisgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBGRGF0YSwgRkFMU0UpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIGFkYXB0ZXIpOyAgLy8gb3V0cHV0IG9ubHkKK2VuZDsKKworCitkZXN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIGluaGVyaXRlZCBEZXN0cm95OworICBGcmVlQW5kTmlsKCBGRGF0YSk7CisgIEZTdG9tcENsaSA6PSBuaWw7CitlbmQ7CisKKworZnVuY3Rpb24gVFN0b21wVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZTdG9tcENsaSA8PiBuaWwpOworZW5kOworCisKK2Z1bmN0aW9uIFRTdG9tcFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQUxTRTsgIC8vIG91dHB1dCBvbmx5CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIEZTdG9tcENsaSA8PiBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgJ2FscmVhZHkgb3BlbicpCisgIGVsc2UgRlN0b21wQ2xpIDo9IFN0b21wVXRpbHMuTmV3U3RvbXAoIEZTZXJ2ZXIpOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlN0b21wQ2xpIDo9IG5pbDsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGU3RvbXBDbGkgPSBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnbm90IG9wZW4nKTsKKworICBGU3RvbXBDbGkuU2VuZCggRk91dFF1ZXVlLCBGRGF0YS5EYXRhU3RyaW5nKTsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworLy8tLS0gVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYUluUXVldWUgOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZlciAgOj0gYVNlcnZlckFuZFBvcnQ7CisgIEZJblF1ZXVlIDo9IGFJblF1ZXVlOworZW5kOworCisKK2Rlc3RydWN0b3IgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2U7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkxpc3RlbjsKK2JlZ2luCisgIEZDbGllbnQgOj0gU3RvbXBVdGlscy5OZXdTdG9tcChGU2VydmVyKTsKKyAgRkNsaWVudC5TdWJzY3JpYmUoIEZJblF1ZXVlKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGlmIEZDbGllbnQgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGQ2xpZW50LlVuc3Vic2NyaWJlKCBGSW5RdWV1ZSk7CisgICAgRkNsaWVudCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhciBmcmFtZSAgIDogSVN0b21wRnJhbWU7CisgICAgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CisgICAgc3RyZWFtICA6IFRTdHJpbmdTdHJlYW07CitiZWdpbgorICBpZiBGQ2xpZW50ID0gbmlsCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vdCBjb25uZWN0ZWQuJyk7CisKKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICB0cnkKKyAgICBmcmFtZSA6PSBGQ2xpZW50LlJlY2VpdmUoTUFYSU5UKTsKKyAgICBpZiBmcmFtZSA9IG5pbCB0aGVuIEV4aXQobmlsKTsKKworICAgIHN0cmVhbSAgOj0gVFN0cmluZ1N0cmVhbS5DcmVhdGUoIGZyYW1lLkdldEJvZHkpOworICAgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdHJlYW0sIFRSVUUpOworICAgIHJlc3VsdCAgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdGVyLCBuaWwpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvVmFncmFudGZpbGUgYi9jb250cmliL1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsMTMzIEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJGJ1aWxkX2FuZF90ZXN0ID0gPDxTQ1JJUFQKK2VjaG8gIlByb3Zpc2lvbmluZyBzeXN0ZW0gdG8gY29tcGlsZSBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0LiIKKworIyBDcmVhdGUgc3dhcCBzcGFjZQorc3VkbyBmYWxsb2NhdGUgLWwgMkcgL3N3YXBmaWxlCitzdWRvIGNobW9kIDYwMCAvc3dhcGZpbGUKK3N1ZG8gbWtzd2FwIC9zd2FwZmlsZQorc3VkbyBzd2Fwb24gL3N3YXBmaWxlCitzdWRvIHN3YXBvbiAtcworCisjIFVwZGF0ZSB0aGUgc3lzdGVtCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZGF0ZSAtcXEgLXkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgdXBncmFkZSAtcXEgLXkKKworIyBJbnN0YWxsIERlcGVuZGVuY2llcworIyAtLS0KKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBtYWtlIGxpYnF0NC1kZXYgZ2l0IGRlYmhlbHBlcgorCisjIEMrKyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1maWxlc3lzdGVtLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiAKKworIyBKYXZhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCisKKyMgUHl0aG9uIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXNpeCBweXRob24zLXNpeAorCisjIFJ1YnkgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcnVieSBydWJ5LWRldgorc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBQZXJsIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsCisKKyMgUGhwIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHBocDUgcGhwNS1kZXYgcGhwNS1jbGkgcGhwLXBlYXIgcmUyYworCisjIEdsaWJDIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmdsaWIyLjAtZGV2CisKKyMgRXJsYW5nIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IGVybGFuZy10b29scworCisjIEdPIGRlcGVuZGVuY2llcworZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCitzdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbworCisjIEhhc2tlbGwgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZ2hjIGNhYmFsLWluc3RhbGwgbGliZ2hjLWJpbmFyeS1kZXYgbGliZ2hjLW5ldHdvcmstZGV2IGxpYmdoYy1odHRwLWRldiBsaWJnaGMtaGFzaGFibGUtZGV2IGxpYmdoYy11bm9yZGVyZWQtY29udGFpbmVycy1kZXYgbGliZ2hjLXZlY3Rvci1kZXYKK3N1ZG8gY2FiYWwgdXBkYXRlCisKKyMgTHVhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2CisKKyMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBub2RlanMtbGVnYWN5IG5wbQorCisjIENTaGFycAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIG1vbm8teGJ1aWxkIG1vbm8tY29tcGxldGUgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1pbmd3MzIgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbnNpcworCisjIEQgZGVwZW5kZW5jaWVzCitzdWRvIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QKK3N1ZG8gYXB0LWdldCB1cGRhdGUgJiYgc3VkbyBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZyAmJiBzdWRvIGFwdC1nZXQgdXBkYXRlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgeGRnLXV0aWxzIGRtZC1iaW4KKworIyBDdXN0b21pemUgdGhlIHN5c3RlbQorIyAtLS0KKyMgRGVmYXVsdCBqYXZhIHRvIGxhdGVzdCAxLjggdmVyc2lvbgordXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS44LjAtb3Blbmpkay1hbWQ2NCAKKworIyBQSFBVbml0IHBhY2thZ2UgYnJva2VuIGluIHVidW50dS4gc2VlIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3BocHVuaXQvK2J1Zy83MDE1NDQKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIHBlYXIKK3N1ZG8gcGVhciBjaGFubmVsLWRpc2NvdmVyIHBlYXIucGhwdW5pdC5kZQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgcGVhci5zeW1mb255LmNvbQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgY29tcG9uZW50cy5lei5ubworc3VkbyBwZWFyIHVwZGF0ZS1jaGFubmVscworc3VkbyBwZWFyIHVwZ3JhZGUtYWxsCitzdWRvIHBlYXIgaW5zdGFsbCAtLWFsbGRlcHMgcGhwdW5pdC9QSFBVbml0CisKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uZWQKKworIyBTdGFydCB0aGUgc291cmNlIGJ1aWxkCisjIC0tLQorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCBidWlsZC4uLiIKK2NkIC90aHJpZnQKK3NoIGJvb3RzdHJhcC5zaAorc2ggY29uZmlndXJlCittYWtlCittYWtlIGNoZWNrCitlY2hvICJGaW5pc2hlZCBidWlsZGluZyBBcGFjaGUgVGhyaWZ0LiIKKworU0NSSVBUCisKK1ZhZ3JhbnQuY29uZmlndXJlKCIyIikgZG8gfGNvbmZpZ3wKKyAgIyBVYnVudHUgMTQuMDQgTFRTIChUcnVzdHkgVGFocikKKyAgY29uZmlnLnZtLmJveCA9ICJ0cnVzdHk2NCIKKyAgY29uZmlnLnZtLmJveF91cmwgPSAiaHR0cHM6Ly9jbG91ZC1pbWFnZXMudWJ1bnR1LmNvbS92YWdyYW50L3RydXN0eS9jdXJyZW50L3RydXN0eS1zZXJ2ZXItY2xvdWRpbWctYW1kNjQtdmFncmFudC1kaXNrMS5ib3giCisKKyAgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uLyIsICIvdGhyaWZ0IgorCisgIGNvbmZpZy52bS5wcm92aWRlciA6dmlydHVhbGJveCBkbyB8dmJveHwKKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1ydGN1c2V1dGMiLCAib24iXQorICBlbmQKKworICAjIFJ1biB0aGUgYnVpbGQgc2NyaXB0IHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6aW5saW5lID0+ICRidWlsZF9hbmRfdGVzdAorZW5kCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5IGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQppbmRleCA4YjdjM2UzLi40ZWE0YTliIDEwMDc1NQotLS0gYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5CisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKQEAgLTcsMTYgKzcsMTcgQEAKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKIGZyb20gYWdnciBpbXBvcnQgQWdncgogCisKIGNsYXNzIEFnZ3JIYW5kbGVyKEFnZ3IuSWZhY2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi52YWx1ZXMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQogCi0gIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6Ci0gICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZCh2YWx1ZSkKIAotICBkZWYgZ2V0VmFsdWVzKHNlbGYsICk6Ci0gICAgdGltZS5zbGVlcCgxKQotICAgIHJldHVybiBzZWxmLnZhbHVlcworICAgIGRlZiBnZXRWYWx1ZXMoc2VsZiwgKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMKIAogcHJvY2Vzc29yID0gQWdnci5Qcm9jZXNzb3IoQWdnckhhbmRsZXIoKSkKIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc3luYy10ZXN0L3Rlc3Qtc2VydmVyLmNwcCBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LXNlcnZlci5jcHAKaW5kZXggYTU1YzM0OC4uYjMwNGUxYiAxMDA2NDQKLS0tIGEvY29udHJpYi9hc3luYy10ZXN0L3Rlc3Qtc2VydmVyLmNwcAorKysgYi9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1zZXJ2ZXIuY3BwCkBAIC0xLDggKzEsOCBAQAogI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgInByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgotI2luY2x1ZGUgImFzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAiYXN5bmMvVEV2aHR0cFNlcnZlci5oIgotI2luY2x1ZGUgImFzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CiAjaW5jbHVkZSAiQWdnci5oIgogCiB1c2luZyBzdGQ6OnRyMTo6YmluZDsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY3JlYXRlLWRlYmlhbi1wYWNrYWdlcy5zaCBiL2NvbnRyaWIvY3JlYXRlLWRlYmlhbi1wYWNrYWdlcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5MDZmMS4uMDAwMDAwMAotLS0gYS9jb250cmliL2NyZWF0ZS1kZWJpYW4tcGFja2FnZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLXNldCAtZQotCi1sbiAtcyBjb250cmliL2RlYmlhbiBkZWJpYW4KLQotZHBrZy1idWlsZHBhY2thZ2UgLXJmYWtlcm9vdCAtdGMKLQotIyByZXN1bHRzCi1scyAuLi8qLmRlYiAuLi8qLmRzYyAuLi8qLnRhci5neiAuLi8qLmNoYW5nZXMKLQotIyBjbGVhbnVwCi1ybSBkZWJpYW4KLQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nIGIvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDhmYzgxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL2NoYW5nZWxvZworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLXRocmlmdCAoMC42LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogdXBkYXRlIHZlcnNpb24gZmllbGQKLSAgKiBhZGRlZCBkZWJpYW4gZm9sZGVyIHRvIHRocmlmdC9jb250cmliCi0gICogY2hhbmdlZCBhIGZldyBkZXRhaWxzIGluIGNvbnRyb2wgZmlsZQotICAqIHVwZGF0ZSBjb3B5cmlnaHQgZmlsZQotCi0gLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDE0IERlYyAyMDEwIDEyOjEyOjMzIC0wODAwCi0KLXRocmlmdCAoMC41LjArbm11Mikgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogTm9uLW1haW50YWluZXIgdXBsb2FkLgotICAqIE1lcmdlZCBUSFJJRlQtNzFfdjkucGF0Y2ggdG8gc2tpcCAuL2Jvb3RzdHJhcC5zaCBpZiBub3QgZXhpc3RzLgotICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvYXR0YWNobWVudC8xMjQ2NTM2MC9USFJJRlQtNzFfdjkucGF0Y2gKLQotIC0tIFlhbWFzaGl0YSBZdXUgPHlhbWFzaGl0YUBnZWlzaGF0b2t5by5jb20+ICBUdWUsIDA3IERlYyAyMDEwIDE1OjAwOjU1ICswOTAwCi0KLXRocmlmdCAoMC41LjArbm11MSkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogTm9uLW1haW50YWluZXIgdXBsb2FkLgotICAqIEltcG9ydGVkIHBhY2thZ2UgaW5mb3JtYXRpb24gZm9yIHBocDUtdGhyaWZ0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbXBsZWdlby90aHJpZnQuCi0KLSAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAwMTowMDoxNyArMDkwMAotCi10aHJpZnQgKDAuNS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93Ci0KLSAgKiB1cGRhdGUgdG8gMC41LjAKLQotIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgRnJpLCAwOCBPY3QgMjAxMCAxMToyMzo1MyArMDIwMAotCi10aHJpZnQgKDAuNC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93Ci0KLSAgKiB1cGRhdGUgdG8gMC40LjAKLQotIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBidWZmZXJvdmVyZmxvdy5jaD4gIFN1biwgMjIgQXVnIDIwMTAgMjE6MjY6MDAgKzAxMDAKLQotdGhyaWZ0ICgwLjIwMDguMTIuMzB+OC4wNCkgaGFyZHk7IHVyZ2VuY3k9bG93Ci0KLSAgKiBJbml0aWFsIHJlbGVhc2UuCi0KLSAtLSBFc3RldmUgRmVybmFuZGV6IDxlc3RldmVAZmx1aWRpbmZvLmNvbT4gIFRodSwgMTUgSmFuIDIwMDkgMTE6MzQ6MjQgKzAxMDAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2NvbXBhdCBiL2NvbnRyaWIvZGViaWFuL2NvbXBhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkNmZmOC4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9jb21wYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi01CmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jb250cm9sIGIvY29udHJpYi9kZWJpYW4vY29udHJvbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzMmMwOC4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9jb250cm9sCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLVNvdXJjZTogdGhyaWZ0Ci1TZWN0aW9uOiBkZXZlbAotUHJpb3JpdHk6IGV4dHJhCi1CdWlsZC1EZXBlbmRzOiBkZWJoZWxwZXIgKD49IDUpLCBidWlsZC1lc3NlbnRpYWwsIG1vbm8tZ21jcywgcHl0aG9uLWRldiwgYW50LAotICAgIGxpYm1vbm8tZGV2LCBlcmxhbmctYmFzZSwgcnVieTEuOC1kZXYsIGF1dG9jb25mLCBweXRob24tc3VwcG9ydCwgYXV0b21ha2UsCi0gICAgcGtnLWNvbmZpZywgbGlidG9vbCwgYmlzb24sIGZsZXgsIGxpYmJvb3N0LWRldiB8IGxpYmJvb3N0MS40MC1kZXYsIHB5dGhvbi1hbGwsIHB5dGhvbi1hbGwtZGV2LAotICAgIHB5dGhvbi1hbGwtZGJnLCBydWJ5LCBvcGVuamRrLTYtamRrIHwgamF2YS1zZGssIGxpYmNvbW1vbnMtbGFuZy1qYXZhLAotICAgIGxpYmJvb3N0LXRlc3QtZGV2IHwgbGliYm9vc3QtdGVzdDEuNDAtZGV2LCBsaWJldmVudC1kZXYsIHBlcmwgKD49IDUuOC4wLTcpLAotICAgIHBocDUsIHBocDUtZGV2Ci1NYWludGFpbmVyOiBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLUhvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvCi1WY3MtU3ZuOiBodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQKLVZjcy1Ccm93c2VyOiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL3RocmlmdAotU3RhbmRhcmRzLVZlcnNpb246IDMuNy4yCi1YUy1QeXRob24tVmVyc2lvbjogPj0gMi40Ci0KLVBhY2thZ2U6IHRocmlmdC1jb21waWxlcgotQXJjaGl0ZWN0dXJlOiBhbnkKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KLURlc2NyaXB0aW9uOiBDb21waWxlciBmb3IgVGhyaWZ0IGRlZmluaXRpb24gZmlsZXMKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIgdGhhdCBpcyB1c2VkIGZvciB0cmFuc2xhdGluZyBmcm9tCi0gLnRocmlmdCBmaWxlcyAoY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMpIHRvIHRoZSBsYW5ndWFnZSBiaW5kaW5nIGZvciB0aGUKLSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLgotCi1QYWNrYWdlOiBweXRob24tdGhyaWZ0Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogcHl0aG9uCi1EZXBlbmRzOiAke3B5dGhvbjpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotUmVjb21tZW5kczogcHl0aG9uLXR3aXN0ZWQtY29yZQotUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQotRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCi0gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQotIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KLQotUGFja2FnZTogcHl0aG9uLXRocmlmdC1kYmcKLUFyY2hpdGVjdHVyZTogYW55Ci1TZWN0aW9uOiBweXRob24KLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24tYWxsLWRiZwotUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQotRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQotIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKLSBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwotIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KLSBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCi0gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCi0gZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKLSB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KLQotUGFja2FnZTogbGlidGhyaWZ0LXJ1YnkKLUFyY2hpdGVjdHVyZTogYW55Ci1TZWN0aW9uOiBsaWJzCi1EZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBydWJ5MS44ICg+PSAxLjgpLCBydWJ5MS44ICg8PCAxLjkpCi1EZXNjcmlwdGlvbjogUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFJ1YnkKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtamF2YQotQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IGphdmEtZ2NqLWNvbXBhdCB8IGphdmExLXJ1bnRpbWUgfCBqYXZhMi1ydW50aW1lLCAke21pc2M6RGVwZW5kc30KLVJlY29tbWVuZHM6IGxpYmNvbW1vbnMtbGFuZy1qYXZhCi1EZXNjcmlwdGlvbjogSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEphdmEKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtY2lsCi1BcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogY2xpLWNvbW1vbiwgbGlibW9uby1jb3JsaWIxLjAtY2lsICg+PSAxLjApLCBsaWJtb25vLXN5c3RlbTEuMC1jaWwgKD49IDEuMCksICR7bWlzYzpEZXBlbmRzfQotRGVzY3JpcHRpb246IENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gQyMKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtZXJsYW5nCi1BcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogZXJsYW5nLW5veCwgJHttaXNjOkRlcGVuZHN9Ci1EZXNjcmlwdGlvbjogRXJsYW5nIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBFcmxhbmcgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0Ci0gdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBFcmxhbmcKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtcGVybAotQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IHBlcmwKLURlcGVuZHM6IHBlcmwgKD49IDUuOC4wLTcpLCAke21pc2M6RGVwZW5kc30KLURlc2NyaXB0aW9uOiBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUGVybAotIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKLSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCi0KLVBhY2thZ2U6IGxpYnRocmlmdDAKLUFyY2hpdGVjdHVyZTogYW55Ci1EZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci1EZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJpZXMgbmVlZGVkIGZvciBDKysgYXBwbGljYXRpb25zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtZGV2Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogbGliZGV2ZWwKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAKLURlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgKGRldmVsb3BtZW50IGhlYWRlcnMpCi0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGV2ZWxvcG1lbnQgbGlicmFyaWVzIHJlcXVpcmVkIGZvciB3cml0aW5nIEMrKwotIGFwcGxpY2F0aW9ucy4KLQotUGFja2FnZTogcGhwNS10aHJpZnQKLUFyY2hpdGVjdHVyZTogYW55Ci1TZWN0aW9uOiBwaHAKLURlcGVuZHM6ICR7cGhwOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci1Qcm92aWRlczogJHtwaHA6UHJvdmlkZXN9Ci1EZXNjcmlwdGlvbjogUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQSFAgYmluZGluZ3MgZm9yIFRocmlmdC4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2NvcHlyaWdodCBiL2NvbnRyaWIvZGViaWFuL2NvcHlyaWdodApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NDZiNC4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotVGhpcyBwYWNrYWdlIHdhcyBkZWJpYW5pemVkIGJ5IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPi4KLQotCi1UaGlzIHBhY2thZ2UgYW5kIHRoZSBEZWJpYW4gcGFja2FnaW5nIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwKLXNlZSBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvQXBhY2hlLTIuMCcuCi0KLVRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb25zIHdhcyBjb3BpZWQgZnJvbSBBcGFjaGUgVGhyaWZ0IExJQ0VOU0UgZmlsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNPRlRXQVJFIERJU1RSSUJVVEVEIFdJVEggVEhSSUZUOgotCi1UaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKLXNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlCi1jb2RlIGZvciB0aGUgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBvcnRpb25zIG9mIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKLQotICBsaWIvZXJsL3NyYy9NYWtlZmlsZS5hbQotCi1QbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZm9sbG93aW5nIGZpbGVzIGNvbnRhaW4gc29tZSBwb3J0aW9ucyBvZiBjb2RlIGNvbnRyaWJ1dGVkIHVuZGVyCi10aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UgKHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCksIGFuZCByZWxpY2Vuc2VkCi11bmRlciB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlOgotCi0gIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwotICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAotICBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaAotICBjb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5Ci0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagotICBsaWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCi0gIGxpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagotICBsaWIvcmIvbGliL3RocmlmdC5yYgotICBsaWIvc3QvUkVBRE1FCi0gIGxpYi9zdC90aHJpZnQuc3QKLSAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKLSAgdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLSAgdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6Ci0KLSMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+Ci0jCi0jICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0Ci0jICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCi0jICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvbWQ1LltjaF0gY29tcG9uZW50czoKLQotLyoKLSAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZvciB0aGUgbGliL3JiL3NldHVwLnJiOiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raSwKLWxpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlIGFuZCBsaWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUgY29tcG9uZW50czoKLSAgICAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwNyAgTWFya3VzIE1vdHRsCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDIuMQotKHNlZSBkb2MvbGdwbC0yLjEudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UpCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9kZWJpYW4gYi9jb250cmliL2RlYmlhbi9kZWJpYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDBjMmEyNWMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vZGViaWFuCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY29udHJpYi9kZWJpYW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9kb2NzIGIvY29udHJpYi9kZWJpYW4vZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiZDgyNC4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1ORVdTCi1SRUFETUUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbCBiL2NvbnRyaWIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhYThjZC4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi11c3IvbGliL2xpYnRocmlmdCouc28uKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vcnVsZXMgYi9jb250cmliL2RlYmlhbi9ydWxlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdjOGU5YS4uMDAwMDAwMAotLS0gYS9jb250cmliL2RlYmlhbi9ydWxlcworKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0jIS91c3IvYmluL21ha2UgLWYKLSMgLSotIG1ha2VmaWxlIC0qLQotIyBTYW1wbGUgZGViaWFuL3J1bGVzIHRoYXQgdXNlcyBkZWJoZWxwZXIuCi0jCi0jIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEpvZXkgSGVzcyBhbmQgQ3JhaWcgU21hbGwuCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBkaC1tYWtlIGludG8gYQotIyBkaC1tYWtlIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCi0jIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IENyYWlnIFNtYWxsIGluIHZlcnNpb24gMC4zNyBvZiBkaC1tYWtlLgotIwotIyBNb2RpZmllZCB0byBtYWtlIGEgdGVtcGxhdGUgZmlsZSBmb3IgYSBtdWx0aS1iaW5hcnkgcGFja2FnZSB3aXRoIHNlcGFyYXRlZAotIyBidWlsZC1hcmNoIGFuZCBidWlsZC1pbmRlcCB0YXJnZXRzICBieSBCaWxsIEFsbG9tYmVydCAyMDAxCi0KLSMgVW5jb21tZW50IHRoaXMgdG8gdHVybiBvbiB2ZXJib3NlIG1vZGUuCi0jZXhwb3J0IERIX1ZFUkJPU0U9MQotCi0jIFRoaXMgaGFzIHRvIGJlIGV4cG9ydGVkIHRvIG1ha2Ugc29tZSBtYWdpYyBiZWxvdyB3b3JrLgotZXhwb3J0IERIX09QVElPTlMKLQotUFlWRVJTIDo9ICQoc2hlbGwgcHl2ZXJzaW9ucyAtcikKLQotY29uZmlndXJlOiBjb25maWd1cmUtc3RhbXAKLWNvbmZpZ3VyZS1zdGFtcDoKLQlkaF90ZXN0ZGlyCi0JIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UuCi0JaWYgWyAtZiBib290c3RyYXAuc2ggXTsgdGhlbiAkKENVUkRJUikvYm9vdHN0cmFwLnNoOyBmaQotCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgotCi0JdG91Y2ggY29uZmlndXJlLXN0YW1wCi0KLQotI0FyY2hpdGVjdHVyZQotYnVpbGQ6IGJ1aWxkLWFyY2ggYnVpbGQtaW5kZXAKLQkjIFRlc3RzIGRpc2FibGVkCi0JIyAkKE1BS0UpIC1DIHRlc3QgY2hlY2sKLQotYnVpbGQtYXJjaDogYnVpbGQtYXJjaC1zdGFtcAotYnVpbGQtYXJjaC1zdGFtcDogY29uZmlndXJlLXN0YW1wCi0KLQkjIENvbXBpbGUgY29tcGlsZXIKLQkkKE1BS0UpIC1DICQoQ1VSRElSKS9jb21waWxlci9jcHAKLQotCSMgQ29tcGlsZSBDKysgbGlicmFyeQotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jcHAKLQotCSMgUHl0aG9uIGxpYnJhcnkKLQljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKLSAgICBmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyAgXAotICAgICAgICAkJHB5IHNldHVwLnB5IGJ1aWxkOyBcCi0gICAgICAgICQkcHktZGJnIHNldHVwLnB5IGJ1aWxkOyBcCi0gICAgZG9uZQotCi0JIyBSdWJ5IGxpYnJhcnkKLQljZCAkKENVUkRJUikvbGliL3JiCSYmIFwKLQkJcnVieSBzZXR1cC5yYiBjb25maWcgLS1pbnN0YWxsZGlycz1zdGQgJiYgXAotCQlydWJ5IHNldHVwLnJiIHNldHVwCi0KLQkjIFBIUAotCWNkICQoQ1VSRElSKS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sICYmIFwKLQkJcGhwaXplICYmIFwKLQkJLi9jb25maWd1cmUgJiYgbWFrZQotCi0JdG91Y2ggJEAKLQotYnVpbGQtaW5kZXA6IGJ1aWxkLWluZGVwLXN0YW1wCi1idWlsZC1pbmRlcC1zdGFtcDogY29uZmlndXJlLXN0YW1wCi0KLQkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNvbXBpbGUgdGhlIGluZGVwIHBhcnQgb2YgdGhlIHBhY2thZ2UuCi0JIyQoTUFLRSkgZG9jCi0KLQkjIEphdmEKLQljZCAkKENVUkRJUikvbGliL2phdmEgJiYgXAotCQlhbnQKLQotCSMgRXJsYW5nCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2VybAotCi0JIyBDIwotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jc2hhcnAKLQotCSMgUGVybAotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9wZXJsIElOU1RBTExESVJTPXZlbmRvcgotCi0JdG91Y2ggJEAKLQotY2xlYW46Ci0JZGhfdGVzdGRpcgotCWRoX3Rlc3Ryb290Ci0Jcm0gLWYgYnVpbGQtYXJjaC1zdGFtcCBidWlsZC1pbmRlcC1zdGFtcCBjb25maWd1cmUtc3RhbXAKLQotCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlIGJ1aWxkIHByb2Nlc3MuCi0JLSQoTUFLRSkgY2xlYW4KLQotCWRoX2NsZWFuCi0KLWluc3RhbGw6IGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoCi1pbnN0YWxsLWluZGVwOgotCWRoX3Rlc3RkaXIKLQlkaF90ZXN0cm9vdAotCWRoX2NsZWFuIC1rIC1pCi0JZGhfaW5zdGFsbGRpcnMgLWkKLQotCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCi0JIyBkZWJpYW4vPHBhY2thZ2U+LWRvYy4KLQkjSU5TVEFMTERPQyMKLQotICAgICMgSmF2YQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvICYmIFwKLQljcCAkKENVUkRJUikvbGliL2phdmEvbGlidGhyaWZ0LmphciBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCi0KLQkjIEVybGFuZwotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWVybGFuZy91c3IvbGliL2VybGFuZy9saWIvdGhyaWZ0LyAmJiBcCi0JY3AgLXIgJChDVVJESVIpL2xpYi9lcmwvZWJpbiBcCi0JCSQoQ1VSRElSKS9saWIvZXJsL2luY2x1ZGUgXAotCQkkKENVUkRJUikvbGliL2VybC9zcmMgXAotCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1lcmxhbmcvdXNyL2xpYi9lcmxhbmcvbGliL3RocmlmdC8KLQotCSMgQyMKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1jaWwvdXNyL2xpYi9jbGkvdGhyaWZ0LyAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9jc2hhcnAvVGhyaWZ0LmRsbCBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvVGhyaWZ0LmRsbAotCi0JIyBQZXJsCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyCi0KLQlkaF9pbnN0YWxsIC1pCi0KLWluc3RhbGwtYXJjaDoKLQlkaF90ZXN0ZGlyCi0JZGhfdGVzdHJvb3QKLQlkaF9jbGVhbiAtayAtcwotCWRoX2luc3RhbGxkaXJzIC1zCi0KLQkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGluc3RhbGwgdGhlIGFyY2ggcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCi0JIyBkZWJpYW4vdG1wLgotCSMkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90aHJpZnQgaW5zdGFsbAotCi0JI2NvbXBpbGVyCi0JbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2JpbiAmJiBcCi0JY3AgJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgXAotCQkkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3IvYmluL3RocmlmdCAmJiBcCi0Jcm1kaXIgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL3NiaW4KLQotCSNweXRob24KLQljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKLQlmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyBcCi0JCSQkcHkgc2V0dXAucHkgaW5zdGFsbCAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdDsgXAotCQkkJHB5LWRiZyBzZXR1cC5weSBpbnN0YWxsIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZzsgXAotCWRvbmUKLQotCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weWMiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgotCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCi0JZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKLQlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7Ci0KLQkjcnVieQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXJ1YnkgJiYgXAotCWNkICQoQ1VSRElSKS9saWIvcmIgJiYgXAotCQlydWJ5IHNldHVwLnJiIGluc3RhbGwgLS1wcmVmaXg9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcnVieQotCi0JIyBQSFAKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3BocDUtdGhyaWZ0Ci0JY2QgJChDVVJESVIpL2xpYi9waHAgJiYgXAotCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdCBpbnN0YWxsCi0KLQkjY3BwCi0JbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90bXA7IFwKLQljZCAkKENVUkRJUikvbGliL2NwcCAmJiBcCi0JCW1ha2UgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCi0KLQlkaF9pbnN0YWxsIC0tc291cmNlZGlyPWRlYmlhbi90bXAgLXMKLQotCi0jIE11c3Qgbm90IGRlcGVuZCBvbiBhbnl0aGluZy4gVGhpcyBpcyB0byBiZSBjYWxsZWQgYnkKLSMgYmluYXJ5LWFyY2gvYmluYXJ5LWluZGVwCi0jIGluIGFub3RoZXIgJ21ha2UnIHRocmVhZC4KLWJpbmFyeS1jb21tb246Ci0JZGhfdGVzdGRpcgotCWRoX3Rlc3Ryb290Ci0JZGhfaW5zdGFsbGNoYW5nZWxvZ3MKLQlkaF9pbnN0YWxsZG9jcwotCWRoX2luc3RhbGxleGFtcGxlcwotCWRoX2luc3RhbGxtYW4KLQlkaF9saW5rCi0JZGhfc3RyaXAgLU5weXRob24tdGhyaWZ0LWRiZyAtTnRocmlmdC1jb21waWxlciAtTmxpYnRocmlmdDAgLU5saWJ0aHJpZnQtcnVieSAtLWRiZz1weXRob24tdGhyaWZ0LWRiZwotCWRoX3N0cmlwIC1OcHl0aG9uLXRocmlmdC1kYmcKLQlkaF9jb21wcmVzcwotCWRoX2ZpeHBlcm1zCi0JZGhfcHlzdXBwb3J0Ci0JZGhfbWFrZXNobGlicwotCWRoX2luc3RhbGxkZWIKLQlkaF9wZXJsCi0JZGhfc2hsaWJkZXBzCi0JZGhfZ2VuY29udHJvbAotCWRoX21kNXN1bXMKLQlkaF9idWlsZGRlYgotIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRhbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCi1iaW5hcnktaW5kZXA6IGJ1aWxkLWluZGVwIGluc3RhbGwtaW5kZXAKLQkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1pIGJpbmFyeS1jb21tb24KLQotIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kYW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgotYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCi0JZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQocGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+IGRlYmlhbi9zdWJzdHZhcnMKLQkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1zIGJpbmFyeS1jb21tb24KLQotYmluYXJ5OiBiaW5hcnktYXJjaCBiaW5hcnktaW5kZXAKLS5QSE9OWTogYnVpbGQgY2xlYW4gYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoIGJpbmFyeSBpbnN0YWxsIGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vc3Vic3R2YXJzIGIvY29udHJpYi9kZWJpYW4vc3Vic3R2YXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRmNTcyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL3N1YnN0dmFycworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBocDpEZXBlbmRzPXBocGFwaS0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0gYi9jb250cmliL2ZiMzAzL01ha2VmaWxlLmFtCmluZGV4IGRlN2ZiYjYuLmU3NzNlNTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0KKysrIGIvY29udHJpYi9mYjMwMy9NYWtlZmlsZS5hbQpAQCAtMjEsMTEgKzIxLDI2IEBACiAKIEBQUk9EVUNUX01LQAogCi1TVUJESVJTID0gLiBjcHAgcHkKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfQ1BQCitTVUJESVJTICs9IGNwcAorZW5kaWYKKworaWYgV0lUSF9KQVZBCitTVUJESVJTICs9IGphdmEKK2VuZGlmCisKK2lmIFdJVEhfUEhQCitTVUJESVJTICs9IHBocAorZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK1NVQkRJUlMgKz0gcHkKK2VuZGlmCiAKIEJVSUxUX1NPVVJDRVMgPQogCi0KIGNsZWFuLWxvY2FsOiBjbGVhbi1jb21tb24KIAogQEdMT0JBTF9GT09URVJfTUtACmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1JFQURNRSBiL2NvbnRyaWIvZmIzMDMvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2ZiMzAzL1JFQURNRQpyZW5hbWUgdG8gY29udHJpYi9mYjMwMy9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKaW5kZXggZTA3ZWFhOC4uMWZjNjYxMiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzZXJ2ZXIvVENsaWVudEluZm8uaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RDbGllbnRJbmZvLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKQEAgLTE1NCw5ICsxNTQsOCBAQAogICAgIH0KIAogICAgIHRpbWVzcGVjIHN0YXJ0OwotICAgIGRvdWJsZSBzZWNzID0gMC4wOwogICAgIGluZm8tPmdldFRpbWUoJnN0YXJ0KTsKLSAgICBzZWNzID0gKGRvdWJsZSkobm93LnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKyAobm93LnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSowLjAwMDAwMDAwMTsKKyAgICBkb3VibGUgc2VjcyA9IChkb3VibGUpKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpICsgKG5vdy50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykqMC4wMDAwMDAwMDE7CiAKICAgICBjaGFyIGJ1ZlsyNTZdOwogICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVkICVzICVzICUuM2YgJWxsdSIsIGksIGFkZHJTdHIsIGNhbGxTdHIsIHNlY3MsCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmggYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmgKaW5kZXggOWIyZDI4NC4uNjY2OGMxOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oCisrKyBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uaApAQCAtMjIsOSArMjIsOSBAQAogCiAvLyBmb3IgaW5ldF9udG9wIC0tCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAgIC8qKgogICAgKiBSZXR1cm4gYXMgc3RyaW5nIHRoZSB0aHJpZnQgY2FsbCBlaXRoZXIgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBvcgotICAgKiBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZCBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuIGZvciBhZGRpdG9uYWwKKyAgICogbW9zdCByZWNlbnRseSBwcm9jZXNzZWQgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiBmb3IgYWRkaXRpb25hbAogICAgKiBjYWxscy4gIFJldHVybnMgTlVMTCBpZiBhIGNhbGwgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgcHJvY2Vzc2luZwogICAgKiBoYXMgZW5kZWQuCiAgICAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNCBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjOTE4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKQEAgLTAsMCArMSwxMzQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSxbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgQysrMTEKKyMgICBzdGFuZGFyZDsgaWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYRkxBR1MgdG8gZW5hYmxlIHN1cHBvcnQuCisjCisjICAgVGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KKyMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgorIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKKyMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgorIworIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCAnbWFuZGF0b3J5JyBvciBpZiBsZWZ0IHVuc3BlY2lmaWVkLAorIyAgIGluZGljYXRlcyB0aGF0IGJhc2VsaW5lIEMrKzExIHN1cHBvcnQgaXMgcmVxdWlyZWQgYW5kIHRoYXQgdGhlIG1hY3JvCisjICAgc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdCBzdXBwb3J0IGlzIGZvdW5kLiAgSWYgc3BlY2lmaWVkCisjICAgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzIHJlZ2FyZGxlc3MsIGFmdGVyIGRlZmluaW5nCisjICAgSEFWRV9DWFgxMSBpZiBhbmQgb25seSBpZiBhIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAzCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0sIFsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNoZWNrCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOworICAgIH07CisKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGJvb2w+PiByaWdodF9hbmdsZV9icmFja2V0czsKKworICAgIGludCBhOworICAgIGRlY2x0eXBlKGEpIGI7CisKKyAgICB0eXBlZGVmIGNoZWNrPGludD4gY2hlY2tfdHlwZTsKKyAgICBjaGVja190eXBlIGM7CisgICAgY2hlY2tfdHlwZSYmIGNyID0gc3RhdGljX2Nhc3Q8Y2hlY2tfdHlwZSYmPihjKTsKKworICAgIGF1dG8gZCA9IGE7CitdKQorCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW2RubAorICBtNF9pZihbJDFdLCBbXSwgW10sCisgICAgICAgIFskMV0sIFtleHRdLCBbXSwKKyAgICAgICAgWyQxXSwgW25vZXh0XSwgW10sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBhcmd1bWVudCBgJDEnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSlkbmwKKyAgbTRfaWYoWyQyXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQyXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQyXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPWZhbHNlXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSlkbmwKKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICBhY19zdWNjZXNzPW5vCisgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyBieSBkZWZhdWx0LAorICBheF9jdl9jeHhfY29tcGlsZV9jeHgxMSwKKyAgW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKKyAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9eWVzXSwKKyAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9bm9dKV0pCisgIGlmIHRlc3QgeCRheF9jdl9jeHhfY29tcGlsZV9jeHgxMSA9IHh5ZXM7IHRoZW4KKyAgICBhY19zdWNjZXNzPXllcworICBmaQorCisgIG00X2lmKFskMV0sIFtub2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWdudSsrMTE7IGRvCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisKKyAgbTRfaWYoWyQxXSwgW2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWMrKzExOyBkbworICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKyAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCisgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorICBBQ19MQU5HX1BPUChbQysrXSkKKyAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkID0geHRydWU7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKzExIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCisgICAgZmkKKyAgZWxzZQorICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgICBIQVZFX0NYWDExPTAKKyAgICAgIEFDX01TR19OT1RJQ0UoW05vIGNvbXBpbGVyIHdpdGggQysrMTEgc3VwcG9ydCB3YXMgZm91bmRdKQorICAgIGVsc2UKKyAgICAgIEhBVkVfQ1hYMTE9MQorICAgICAgQUNfREVGSU5FKEhBVkVfQ1hYMTEsMSwKKyAgICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKysxMSBzeW50YXhdKQorICAgIGZpCisKKyAgICBBQ19TVUJTVChIQVZFX0NYWDExKQorICBmaQorXSkKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWI0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKQEAgLTAsMCArMSwxMjEgQEAKK2RubCBAc3lub3BzaXMgQVhfSkFWQUNfQU5EX0pBVkEKK2RubCBAc3lub3BzaXMgQVhfQ0hFQ0tfSkFWQV9DTEFTUyhDTEFTU05BTUUpCitkbmwKK2RubCBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBKREssIGFuZCAob3B0aW9uYWxseSkgc3BlY2lmaWMgY2xhc3Nlcy4KK2RubAorZG5sIElmICJKQVZBIiBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCwgdGhhdCB3aWxsIGJlIHRoZSBvbmx5CitkbmwgamF2YSBjb21tYW5kIHRlc3RlZC4gIE90aGVyd2lzZSwgYSBoYXJkLWNvZGVkIGxpc3Qgd2lsbCBiZSB1c2VkLgorZG5sIFNpbWlsYXJseSBmb3IgIkpBVkFDIi4KK2RubAorZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRlc3RpbmcgZm9yIGEgcGFydGljdWxhcgorZG5sIEphdmEgdmVyc2lvbiwgdGVzdGluZyBmb3Igb25seSBvbmUgb2YgImphdmEiIGFuZCAiamF2YWMiLCBvcgorZG5sIGNvbXBpbGluZyBvciBydW5uaW5nIHVzZXItcHJvdmlkZWQgSmF2YSBjb2RlLgorZG5sCitkbmwgQWZ0ZXIgQVhfSkFWQUNfQU5EX0pBVkEgcnVucywgdGhlIHNoZWxsIHZhcmlhYmxlcyAic3VjY2VzcyIgYW5kCitkbmwgImF4X2phdmFjX2FuZF9qYXZhIiBhcmUgc2V0IHRvICJ5ZXMiIG9yICJubyIsIGFuZCAiSkFWQUMiIGFuZAorZG5sICJKQVZBIiBhcmUgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kcy4KK2RubAorZG5sIEFYX0NIRUNLX0pBVkFfQ0xBU1MgbXVzdCBiZSBydW4gYWZ0ZXIgQVhfSkFWQUNfQU5EX0pBVkEuCitkbmwgSXQgdGVzdHMgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNsYXNzIGJhc2VkIG9uIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUuCitkbmwgSXQgc2V0cyB0aGUgc2hlbGwgdmFyaWFibGUgInN1Y2Nlc3MiIHRvICJ5ZXMiIG9yICJubyIuCitkbmwKK2RubCBAY2F0ZWdvcnkgSmF2YQorZG5sIEB2ZXJzaW9uIDIwMDktMDItMDkKK2RubCBAbGljZW5zZSBBbGxQZXJtaXNzaXZlCitkbmwKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUmVpc3MKK2RubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworCitBQ19ERUZVTihbQVhfSkFWQUNfQU5EX0pBVkFdLAorICAgICAgICAgWworCisgICAgICAgICAgZG5sIEhhcmQtY29kZWQgZGVmYXVsdCBjb21tYW5kcyB0byB0ZXN0LgorICAgICAgICAgIEpBVkFDX1BST0dTPSJqYXZhYyxqaWtlcyxnY2ogLUMiCisgICAgICAgICAgSkFWQV9QUk9HUz0iamF2YSxrYWZmZSIKKworICAgICAgICAgIGRubCBBbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlLgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRKQVZBQyIgOyB0aGVuCisgICAgICAgICAgICBKQVZBQ19QUk9HUz0iJEpBVkFDIgorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAtbiAiJEpBVkEiIDsgdGhlbgorICAgICAgICAgICAgSkFWQV9QUk9HUz0iJEpBVkEiCisgICAgICAgICAgZmkKKworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgamF2YWMgYW5kIGphdmEpCisKKyAgICAgICAgICBlY2hvICJwdWJsaWMgY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzQDw6QEA6PkApIHsgfSB9IiA+IGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YQorICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBvSUZTPSIkSUZTIgorCisgICAgICAgICAgSUZTPSIsIgorICAgICAgICAgIGZvciBKQVZBQyBpbiAkSkFWQUNfUFJPR1MgOyBkbworICAgICAgICAgICAgSUZTPSIkb0lGUyIKKworICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgICAgaWYgJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisKKyAgICAgICAgICAgICAgSUZTPSIsIgorICAgICAgICAgICAgICBmb3IgSkFWQSBpbiAkSkFWQV9QUk9HUyA7IGRvCisgICAgICAgICAgICAgICAgSUZTPSIkb0lGUyIKKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkSkFWQSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgICAgICBpZiAkSkFWQSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgICAgICAgICBicmVhayAyCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICBkb25lCisKKyAgICAgICAgICBybSAtZiBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5jbGFzcworCisgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiICE9ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIEpBVkFDPSIiCisgICAgICAgICAgICBKQVZBPSIiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZmkKKworICAgICAgICAgIGF4X2phdmFjX2FuZF9qYXZhPSIkc3VjY2VzcyIKKworICAgICAgICAgIF0pCisKKworQUNfREVGVU4oW0FYX0NIRUNLX0pBVkFfQ0xBU1NdLAorICAgICAgICAgWworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgSmF2YSBjbGFzcyBbJDFdKQorCisgICAgICAgICAgZWNobyAiaW1wb3J0ICQxOyBwdWJsaWMgY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSB7IHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzQDw6QEA6PkApIHsgfSB9IiA+IGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YQorCisgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgIGlmICRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICBzdWNjZXNzPXllcworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBzdWNjZXNzPW5vCisgICAgICAgICAgZmkKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmNsYXNzCisgICAgICAgICAgXSkKKworCitBQ19ERUZVTihbQVhfQ0hFQ0tfQU5UX1ZFUlNJT05dLAorICAgICAgICAgWworICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgYW50IHZlcnNpb24gPiAkMikKKyAgICAgICAgICBBTlRfVkFMSUQ9YGV4cHIgJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIFw+PSAkMmAKKyAgICAgICAgICBpZiB0ZXN0ICJ4JEFOVF9WQUxJRCIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIEFOVD0iIgorICAgICAgICAgIGZpCisgICAgICAgICAgXSkKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNCBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwZTNjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQKQEAgLTAsMCArMSwyOCBAQAorZG5sIEBzeW5vcHNpcyBBWF9USFJJRlRfR0VOKFNIT1JUX0xBTkdVQUdFLCBMT05HX0xBTkdVQUdFLCBERUZBVUxUKQorZG5sIEBzeW5vcHNpcyBBWF9USFJJRlRfTElCKFNIT1JUX0xBTkdVQUdFLCBMT05HX0xBTkdVQUdFLCBERUZBVUxUKQorZG5sCitkbmwgQWxsb3cgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGdlbmVyYXRvciB0byBiZSBkaXNhYmxlZC4KK2RubCBBbGxvdyBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgbGlicmFyeSB0byBiZSBkaXNhYmxlZC4KK2RubAorZG5sIFRoZXNlIG1hY3JvcyBoYXZlIHBvb3IgZXJyb3IgaGFuZGxpbmcgYW5kIGFyZSBwb29ybHkgZG9jdW1lbnRlZC4KK2RubCBUaGV5IGFyZSBpbnRlbmRlZCBvbmx5IGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFRocmlmdCBjb21waWxlci4KK2RubAorZG5sIEB2ZXJzaW9uIDIwMDgtMDItMjAKK2RubCBAbGljZW5zZSBBbGxQZXJtaXNzaXZlCitkbmwKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUmVpc3MKK2RubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworQUNfREVGVU4oW0FYX1RIUklGVF9MSUJdLAorICAgICAgICAgWworICAgICAgICAgIEFDX0FSR19XSVRIKCQxLAorICAgICAgICAgICAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtJDFdLCBbYnVpbGQgdGhlICQyIGxpYnJhcnkgQDw6QGRlZmF1bHQ9JDNAOj5AXSksCisgICAgICAgICAgICAgICAgICAgICAgW3dpdGhfJDE9IiR3aXRodmFsIl0sCisgICAgICAgICAgICAgICAgICAgICAgW3dpdGhfJDE9JDNdCisgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgIGhhdmVfJDE9bm8KKyAgICAgICAgICBkbmwgV2hhdCB3ZSBkbyBoZXJlIGlzIGdvaW5nIHRvIHZhcnkgZnJvbSBsaWJyYXJ5IHRvIGxpYnJhcnksCisgICAgICAgICAgZG5sIHNvIHdlIGNhbid0IHJlYWxseSBnZW5lcmFsaXplICh5ZXQhKS4KKyAgICAgICAgIF0pCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2NvbmZpZ3VyZS5hYyBiL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjCmluZGV4IDY3Y2MxMTAuLjczYjM1YmEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjCisrKyBiL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjCkBAIC03MSwxMyArNzEsNTcgQEAKICMgRXhhbXBsZTogc2V0cyAkKHRocmlmdF9ob21lKSB2YXJpYWJsZSB3aXRoIGRlZmF1bHQgcGF0aCBzZXQgdG8gL3Vzci9sb2NhbC4KIEZCX1dJVEhfUEFUSChbdGhyaWZ0X2hvbWVdLCBbdGhyaWZ0cGF0aF0sIFsvdXNyL2xvY2FsXSkKIAotIyBSZXF1aXJlIGJvb3N0IDEuMzMuMSBvciBsYXRlcgotQVhfQk9PU1RfQkFTRShbMS4zMy4xXSkKK0FYX0NYWF9DT01QSUxFX1NURENYWF8xMShbbm9leHRdKQorQVhfVEhSSUZUX0xJQihjcHAsIFtDKytdLCB5ZXMpCitoYXZlX2NwcD1ubworaWYgdGVzdCAiJHdpdGhfY3BwIiA9ICJ5ZXMiOyB0aGVuCisgICMgUmVxdWlyZSBib29zdCAxLjQwLjAgb3IgbGF0ZXIKKyAgQVhfQk9PU1RfQkFTRShbMS40MC4wXSkKKyAgaWYgdGVzdCAieCRzdWNjZWVkZWQiID0gInh5ZXMiOyB0aGVuCisgICAgaGF2ZV9jcHA9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9DUFBdLCBbdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihqYXZhLCBbSmF2YV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2phdmEiID0gInllcyI7IHRoZW4KKyAgQVhfSkFWQUNfQU5EX0pBVkEKKyAgQUNfUEFUSF9QUk9HKFtBTlRdLCBbYW50XSkKKyAgQVhfQ0hFQ0tfQU5UX1ZFUlNJT04oJEFOVCwgMS43KQorICBBQ19TVUJTVChDTEFTU1BBVEgpCisgIEFDX1NVQlNUKEFOVF9GTEFHUykKKyAgaWYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgorICAgIGhhdmVfamF2YT0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfSkFWQSwgW3Rlc3QgIiRoYXZlX2phdmEiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHBocCwgW1BIUF0sIHllcykKK2lmIHRlc3QgIiR3aXRoX3BocCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW1BIUF0sIFtwaHBdKQorICBpZiB0ZXN0ICJ4JFBIUCIgIT0gIngiICYmIHRlc3QgIngkUEhQIiAhPSAieDoiIDsgdGhlbgorICAgIGhhdmVfcGhwPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QSFAsIFt0ZXN0ICIkaGF2ZV9waHAiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHB5dGhvbiwgW1B5dGhvbl0sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5dGhvbiIgPSAieWVzIjsgdGhlbgorICBBTV9QQVRIX1BZVEhPTigyLjQsLCA6KQorICBpZiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIngiICYmIHRlc3QgIngkUFlUSE9OIiAhPSAieDoiIDsgdGhlbgorICAgIGhhdmVfcHl0aG9uPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyJdKQogCiAjIEdlbmVyYXRlcyBNYWtlZmlsZSBmcm9tIE1ha2VmaWxlLmFtLiBNb2RpZnkgd2hlbiBuZXcgc3ViZGlycyBhcmUgYWRkZWQuCiAjIENoYW5nZSBNYWtlZmlsZS5hbSBhbHNvIHRvIGFkZCBzdWJkaXJlY3RseS4KIEFDX0NPTkZJR19GSUxFUyhNYWtlZmlsZSBjcHAvTWFrZWZpbGUgcHkvTWFrZWZpbGUpCiAKKyMgQ2hlY2sgZm9yIGhlYWRlcnMKK0FDX0NIRUNLX0hFQURFUlMoW2ludHR5cGVzLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbbmV0aW5ldC9pbi5oXSkKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBETyBOT1QgVE9VQ0guCiAKQEAgLTg4LDYgKzEzMiwxMSBAQAogIyMjIyMjIyMjIEZJTklTSCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogZWNobyAiRVhURVJOQUxfUEFUSCAkRVhURVJOQUxfUEFUSCIKK2VjaG8KK2VjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKK2VjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCitlY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCitlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCiAKIAogIwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcCBiL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAKaW5kZXggODAwMzM0MC4uM2M1Njk3NSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwCkBAIC05OCw3ICs5OCw3IEBACiAgIC8vIHdhbnQgb3VyIHJlYWQvd3JpdGUgc3RydWN0dXJlIHRvIGdvIG92ZXIgdGhlIHdpcmUKICAgY291bnRlcnNfLmFjcXVpcmVSZWFkKCk7CiAgIGZvcihSZWFkV3JpdGVDb3VudGVyTWFwOjppdGVyYXRvciBpdCA9IGNvdW50ZXJzXy5iZWdpbigpOwotICAgICAgaXQgIT0gY291bnRlcnNfLmVuZCgpOyBpdCsrKQorICAgICAgaXQgIT0gY291bnRlcnNfLmVuZCgpOyArK2l0KQogICB7CiAgICAgX3JldHVybltpdC0+Zmlyc3RdID0gaXQtPnNlY29uZC52YWx1ZTsKICAgfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmggYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAppbmRleCBmZDE2OWU2Li5kYWE1MjQ2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaApAQCAtMjIsOCArMjIsOSBAQAogCiAjaW5jbHVkZSAiRmFjZWJvb2tTZXJ2aWNlLmgiCiAKLSNpbmNsdWRlICJzZXJ2ZXIvVFNlcnZlci5oIgotI2luY2x1ZGUgImNvbmN1cnJlbmN5L011dGV4LmgiCisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwCmluZGV4IGMyMGEwNjguLjdhNjFiMjEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgIkZhY2Vib29rQmFzZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VUcmFja2VyLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgZmFjZWJvb2s6OmZiMzAzOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAgIHVpbnQ2NF90IGNvdW50OwogICBmb3IgKGl0ZXIgPSBjaGVja3BvaW50U2VydmljZUR1cmF0aW9uXy5iZWdpbigpOwogICAgICAgIGl0ZXIgIT0gY2hlY2twb2ludFNlcnZpY2VEdXJhdGlvbl8uZW5kKCk7Ci0gICAgICAgaXRlcisrKSB7CisgICAgICAgKytpdGVyKSB7CiAgICAgY291bnQgPSBpdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgaGFuZGxlcl8tPnNldENvdW50ZXIoc3RyaW5nKCJjaGVja3BvaW50X2NvdW50XyIpICsgaXRlci0+Zmlyc3QsIGNvdW50KTsKICAgICBpZiAoY291bnQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaCBiL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmgKaW5kZXggOTMwNDM4Ni4uOWEzZWRkOCAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5oCkBAIC0xMDAsNyArMTAwLDcgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogCiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IGIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKaW5kZXggNjZjODMxNS4uODliZDZlYiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKKysrIGIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKQEAgLTI0LDYgKzI0LDcgQEAKIG5hbWVzcGFjZSBqYXZhIGNvbS5mYWNlYm9vay5mYjMwMwogbmFtZXNwYWNlIGNwcCBmYWNlYm9vay5mYjMwMwogbmFtZXNwYWNlIHBlcmwgRmFjZWJvb2suRkIzMDMKK25hbWVzcGFjZSBuZXRjb3JlIEZhY2Vib29rLkZCMzAzLlRlc3QKIAogLyoqCiAgKiBDb21tb24gc3RhdHVzIHJlcG9ydGluZyBtZWNoYW5pc20gYWNyb3NzIGFsbCBzZXJ2aWNlcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCmluZGV4IDYyNjk5YTQuLjdhMWI4ZjEgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKKysrIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbApAQCAtNyw5ICs3LDkgQEAKICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAorCiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCisKICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTI2LDIwICsyNiwyMCBAQAogICA8cHJvcGVydHkgbmFtZT0iaW50ZXJmYWNlLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vaWYiLz4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+IAorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2NvbXBpbGVyIiB2YWx1ZT0iJHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdCIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CiAKICAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgogCiAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CiAKICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KICAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KICAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1TTkFQU0hPVCIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJmYjMwMy5maW5hbC5uYW1lIiB2YWx1ZT0iJHtmYjMwMy5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5saWJ0aHJpZnQiIHZhbHVlPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlidGhyaWZ0LSR7dmVyc2lvbn0uamFyIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIHZhbHVlPSIke2Jhc2VkaXJ9L2dlbi1qYXZhIi8+CkBAIC03NCw4ICs3NCwxMiBAQAogICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7ZmIzMDMuZmluYWwubmFtZX0uamFyIi8+CiAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ib24iPgogICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmxpYnRocmlmdH0iLz4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5yb290fS9saWIvamF2YS9idWlsZC9saWIiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CiAgICAgICAgIDwvZmlsZXNldD4KICAgICAgIDwvY2xhc3NwYXRoPgpAQCAtMTAwLDcgKzEwNCw3IEBACiAgICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQiIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgogICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KICAgPC90YXJnZXQ+CiAKQEAgLTEyMCwyMSArMTI0LDIxIEBACiAgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgogCiAgICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iIAotICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iIAorICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKKyAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgogICAgICAgYXJ0aWZhY3RJZD0iJHtmYjMwMy5hcnRpZmFjdGlkfSIKLSAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iIAorICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKICAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgogICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKICAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKLSAgICAgIHBhY2thZ2luZz0icG9tIgorICAgICAgcGFja2FnaW5nPSJqYXIiCiAgICAgPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KICAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0L3RydW5rLyIgCi0gICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0L3RydW5rLyIKLSAgICAgIHVybD0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3RocmlmdCIKKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCiAgICAgLz4KICAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+CiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgpAQCAtMTUzLDYgKzE1Nyw4IEBACiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgogICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+CiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZW5zZyIgbmFtZT0iSmVucyBHZXllciIvPgorICAgICAgPGRldmVsb3BlciBpZD0iY2FybCIgbmFtZT0iQ2FybCBZZWtzaWdpYW4iLz4KIAogICAgICAgPCEtLSBUaHJpZnQgZGVwZW5kZW5jaWVzIGxpc3QgLS0+CiAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLnRocmlmdCIgYXJ0aWZhY3RJZD0ibGlidGhyaWZ0IiB2ZXJzaW9uPSIke3ZlcnNpb259Ii8+CkBAIC0xNjksMTIgKzE3NSwxMyBAQAogICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgogICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NpZmllciIgZGVmYXVsdD0iIi8+CiAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdpbmciIGRlZmF1bHQ9ImphciIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tIiBkZWZhdWx0PSIiLz4KICAgICA8c2VxdWVudGlhbD4KICAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSI+CiAgICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuMTpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgogICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+CiAgICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT0ke2ZiMzAzLnBvbS54bWx9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KICAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KICAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KICAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+CkBAIC0xODYsNyArMTkzLDcgQEAKICAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixkaXN0Ij4KICAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2VzIGFuZCB0aGVuIHNlbmQgcmVsZWFzZSB0byBhcGFjaGUgbWF2ZW4gcmVwbyAtLT4KICAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaC0tPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7ZmIzMDMucG9tLnhtbH0iIHBhY2thZ2luZz0icG9tIiBjbGFzc2lmaWVyPSIiLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2ZiMzAzLmphci5maWxlfSIgcGFja2FnaW5nPSJqYXIiIGNsYXNzaWZpZXI9IiIvPgorICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7ZmIzMDMucG9tLnhtbH0iIHBhY2thZ2luZz0icG9tIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtmYjMwMy5wb20ueG1sfSIvPgorICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7ZmIzMDMuamFyLmZpbGV9IiBwYWNrYWdpbmc9ImphciIgY2xhc3NpZmllcj0iIiBwb209IiR7ZmIzMDMucG9tLnhtbH0iLz4KICAgPC90YXJnZXQ+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvc3JjL0ZhY2Vib29rQmFzZS5qYXZhIGIvY29udHJpYi9mYjMwMy9qYXZhL3NyYy9GYWNlYm9va0Jhc2UuamF2YQppbmRleCBmODRlOThiLi5mOGYyNmEzIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2phdmEvc3JjL0ZhY2Vib29rQmFzZS5qYXZhCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9zcmMvRmFjZWJvb2tCYXNlLmphdmEKQEAgLTY0LDYgKzY0LDE3IEBACiAgICAgcmV0dXJuIHZhbDsKICAgfQogCisgIHB1YmxpYyBsb25nIGluY3JlbWVudENvdW50ZXIoU3RyaW5nIGtleSwgbG9uZyBpbmNyZW1lbnQpIHsKKyAgICBsb25nIHZhbCA9IGdldENvdW50ZXIoa2V5KSArIGluY3JlbWVudDsKKyAgICBjb3VudGVyc18ucHV0KGtleSwgdmFsKTsKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgcHVibGljIGxvbmcgc2V0Q291bnRlcihTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisgICAgY291bnRlcnNfLnB1dChrZXksIHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKwogICBwdWJsaWMgQWJzdHJhY3RNYXA8U3RyaW5nLExvbmc+IGdldENvdW50ZXJzKCkgewogICAgIHJldHVybiBjb3VudGVyc187CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5IGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKaW5kZXggNjg1ZmYyMC4uMDdkYjEwYyAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKQEAgLTI0LDU5ICsyNCw2MCBAQAogaW1wb3J0IHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQKIGZyb20gdHR5cGVzIGltcG9ydCBmYl9zdGF0dXMKIAorCiBjbGFzcyBGYWNlYm9va0Jhc2UoRmFjZWJvb2tTZXJ2aWNlLklmYWNlKToKIAotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCi0gICAgc2VsZi5jb3VudGVycyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIHNlbGYuY291bnRlcnMgPSB7fQogCi0gIGRlZiBnZXROYW1lKHNlbGYsICk6Ci0gICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBnZXROYW1lKHNlbGYsICk6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKIAotICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgotICAgIHJldHVybiAnJworICAgIGRlZiBnZXRWZXJzaW9uKHNlbGYsICk6CisgICAgICAgIHJldHVybiAnJwogCi0gIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKLSAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCisgICAgZGVmIGdldFN0YXR1cyhzZWxmLCApOgorICAgICAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCiAKLSAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmNvdW50ZXJzCisgICAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb3VudGVycwogCi0gIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCisgICAgZGVmIHJlc2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCiAKLSAgZGVmIGdldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKLSAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KLSAgICByZXR1cm4gMAorICAgIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIGlmIHNlbGYuY291bnRlcnMuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnNba2V5XQorICAgICAgICByZXR1cm4gMAogCi0gIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCisgICAgZGVmIGluY3JlbWVudENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCiAKLSAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKLSAgICBwYXNzCisgICAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXRPcHRpb24oc2VsZiwga2V5KToKLSAgICByZXR1cm4gIiIKKyAgICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiAiIgogCi0gIGRlZiBnZXRPcHRpb25zKHNlbGYpOgotICAgIHJldHVybiB7fQorICAgIGRlZiBnZXRPcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4ge30KIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGFsaXZlU2luY2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuYWxpdmUKKyAgICBkZWYgYWxpdmVTaW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWxpdmUKIAotICBkZWYgZ2V0Q3B1UHJvZmlsZShzZWxmLCBkdXJhdGlvbik6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0TGltaXRlZFJlZmxlY3Rpb24oc2VsZik6Ci0gICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCisgICAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gdGhyaWZ0LnJlZmxlY3Rpb24ubGltaXRlZC5TZXJ2aWNlKCkKIAotICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHNodXRkb3duKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQppbmRleCA0ZjhjZTk5Li41YzhmNDA5IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIS91c3IvYmluL2VudiBweXRob24gCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMTksNyArMTksOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgb3MKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcwogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKgpAQCAtMzEsMTEgKzMzLDEyIEBACiBmcm9tIGZiMzAzIGltcG9ydCAqCiBmcm9tIGZiMzAzLnR0eXBlcyBpbXBvcnQgKgogCisKIGRlZiBzZXJ2aWNlX2N0cmwoCi0gICAgICAgICAgICAgICAgIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgIHRyYW5zX2ZhY3RvcnkgPSBOb25lLAotICAgICAgICAgICAgICAgICBwcm90X2ZhY3RvcnkgPSBOb25lKToKKyAgICAgICAgY29tbWFuZCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgdHJhbnNfZmFjdG9yeT1Ob25lLAorICAgICAgICBwcm90X2ZhY3Rvcnk9Tm9uZSk6CiAgICAgIiIiCiAgICAgc2VydmljZV9jdHJsIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0byBleGVjdXRlIHN0YW5kYXJkIGZiMzAzIGZ1bmN0aW9ucwogCkBAIC01NSw2NiArNTgsNTkgQEAKICAgICAgICAgICAgIG1zZyA9IGZiX3N0YXR1c19zdHJpbmcoc3RhdHVzKQogICAgICAgICAgICAgaWYgKGxlbihzdGF0dXNfZGV0YWlscykpOgogICAgICAgICAgICAgICAgIG1zZyArPSAiIC0gJXMiICUgc3RhdHVzX2RldGFpbHMKLSAgICAgICAgICAgIHByaW50IG1zZwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IGZiX3N0YXR1cy5BTElWRSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHByaW50KG1zZykKKyAgICAgICAgICAgIHJldHVybiAyIGlmIHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUgZWxzZSAzCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIKKyAgICAgICAgICAgIHByaW50KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBzY2FsYXIgY29tbWFuZHMKLSAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsImFsaXZlIiwibmFtZSJdOgorICAgIGlmIGNvbW1hbmQgaW4gWyJ2ZXJzaW9uIiwgImFsaXZlIiwgIm5hbWUiXToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQotICAgICAgICAgICAgcHJpbnQgcmVzdWx0CisgICAgICAgICAgICByZXN1bHQgPSBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIHByaW50KHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gZ2V0ICIsY29tbWFuZAorICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byBnZXQgIiwgY29tbWFuZCkKICAgICAgICAgICAgIHJldHVybiAzCiAKICAgICAjIGNvdW50ZXJzCiAgICAgaWYgY29tbWFuZCBpbiBbImNvdW50ZXJzIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgY291bnRlcnMgPSBmYjMwM193cmFwcGVyKCdjb3VudGVycycsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKICAgICAgICAgICAgIGZvciBjb3VudGVyIGluIGNvdW50ZXJzOgotICAgICAgICAgICAgICAgIHByaW50ICIlczogJWQiICUgKGNvdW50ZXIsIGNvdW50ZXJzW2NvdW50ZXJdKQorICAgICAgICAgICAgICAgIHByaW50KCIlczogJWQiICUgKGNvdW50ZXIuZW5jb2RlKCd1dGYtOCcpLCBjb3VudGVyc1tjb3VudGVyXSkpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCBjb3VudGVycyIKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0IGNvdW50ZXJzIikKICAgICAgICAgICAgIHJldHVybiAzCiAKLQogICAgICMgT25seSByb290IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzCiAgICAgaWYgb3MuZ2V0dWlkKCkgPT0gMDoKICAgICAgICAgIyBhc3luYyBjb21tYW5kcwotICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdIDoKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZAorICAgICAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gdGVsbCB0aGUgc2VydmljZSB0byAiLCBjb21tYW5kKQogICAgICAgICAgICAgICAgIHJldHVybiAzCiAgICAgZWxzZToKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXToKLSAgICAgICAgICAgIHByaW50ICJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgICAgICBwcmludCgicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iKQogICAgICAgICAgICAgcmV0dXJuIDQKIAotICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGU6IgotICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCJuYW1lIiwidmVyc2lvbiIsImFsaXZlIiwic3RhdHVzIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2VycyB3aXRoIHJvb3QgcHJpdmlsZWdlczoiCi0gICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKKyAgICBwcmludCgiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJjb3VudGVycyIsICJuYW1lIiwgInZlcnNpb24iLCAiYWxpdmUiLCAic3RhdHVzIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IikKKyAgICBmb3IgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisKKyAgICByZXR1cm4gMAogCiAKLQotICAgIHJldHVybiAwOwotCi0KLWRlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnkgPSBOb25lLCBwcm90X2ZhY3RvcnkgPSBOb25lKToKK2RlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgIHNvY2sgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIHBvcnQpCiAKICAgICAjIHVzZSBpbnB1dCB0cmFuc3BvcnQgZmFjdG9yeSBpZiBwcm92aWRlZApAQCAtMTc5LDExICsxNzUsMTEgQEAKIAogICAgICMgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotICAgIGNvbW1hbmRzPVsic3RvcCIsImNvdW50ZXJzIiwic3RhdHVzIiwicmVsb2FkIiwidmVyc2lvbiIsIm5hbWUiLCJhbGl2ZSJdCisgICAgY29tbWFuZHMgPSBbInN0b3AiLCAiY291bnRlcnMiLCAic3RhdHVzIiwgInJlbG9hZCIsICJ2ZXJzaW9uIiwgIm5hbWUiLCAiYWxpdmUiXQogCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgIi0tY29tbWFuZCIsIGRlc3Q9ImNvbW1hbmQiLCBoZWxwPSJleGVjdXRlIHRoaXMgQVBJIiwKICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPWNvbW1hbmRzLCBkZWZhdWx0PSJzdGF0dXMiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCItcCIsIi0tcG9ydCIsZGVzdD0icG9ydCIsaGVscD0idGhlIHNlcnZpY2UncyBwb3J0IiwKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wb3J0IiwgZGVzdD0icG9ydCIsIGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD05MDgyKQogCiAgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKaW5kZXggYTI5Zjk2NC4uZDI3YzI5NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQorKysgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CkBAIC0xLDMgKzEsNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtNyw3ICs5LDcgQEAKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTE3LDExICsxOSwzMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2ltcG9ydCBzeXMKK3RyeToKKyAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2V4Y2VwdDoKKyAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uLCBDb21tYW5kCiAKLXNldHVwKG5hbWU9J2ZiMzAzJywKLSAgICAgIHZlcnNpb249JzEuMCcsCi0gICAgICBwYWNrYWdlcz1bJ2ZiMzAzJywgJ2ZiMzAzX3NjcmlwdHMnXSwKK3NldHVwKG5hbWU9J3RocmlmdF9mYjMwMycsCisgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICBkZXNjcmlwdGlvbj0nUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBGQjMwMycsCisgICAgICBhdXRob3I9WydBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnXSwKKyAgICAgIGF1dGhvcl9lbWFpbD1bJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddLAorICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAnZmIzMDMnLAorICAgICAgICAgICdmYjMwM19zY3JpcHRzJywKKyAgICAgIF0sCisgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnLAorICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICBdLAogICAgICAgKQotCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaCBiL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaAppbmRleCA5ZThlMDU0Li43ZWQ1ZDQ3IDEwMDc1NQotLS0gYS9jb250cmliL21pbmd3LWNyb3NzLWNvbXBpbGUuc2gKKysrIGIvY29udHJpYi9taW5ndy1jcm9zcy1jb21waWxlLnNoCkBAIC0yLDI1ICsyLDE4IEBACiBzZXQgLWUKIAogLi9jb25maWd1cmUgXAotICAtLXdpdGhvdXQtY3BwIFwKLSAgLS13aXRob3V0LWphdmEgXAotICAtLXdpdGhvdXQtY3NoYXJwIFwKLSAgLS13aXRob3V0LXB5dGhvbiBcCi0gIC0td2l0aG91dC1ydWJ5IFwKLSAgLS13aXRob3V0LXBlcmwgXAotICAtLXdpdGhvdXQtcGhwIFwKLSAgLS13aXRob3V0LWVybGFuZyBcCisgIC0tZGlzYWJsZS1saWJzIFwKICAgLS1idWlsZD1pNjg2LXBjLWxpbnV4LWdudSBcCiAgIC0taG9zdD1pNTg2LW1pbmd3MzJtc3ZjIFwKLSAgQ1BQRkxBR1M9Jy1ETUlOR1cnCisgIENDPWk1ODYtbWluZ3czMm1zdmMtZ2NjIENYWD1pNTg2LW1pbmd3MzJtc3ZjLWcrKwogCiBtYWtlCiAKICMgQ2hlY2sgdHdvIGxvY2F0aW9ucyB0byBiZSBjb21wYXRpYmxlIHdpdGggbGlidG9vbCAxLjUuMjYgb3IgMi4yLjZiLgotaWYgdGVzdCAtZiBjb21waWxlci9jcHAvLmxpYnMvdGhyaWZ0LmV4ZQotICB0aGVuIGNwIGNvbXBpbGVyL2NwcC8ubGlicy90aHJpZnQuZXhlIC4vdGhyaWZ0LmV4ZQotICBlbHNlIGNwIGNvbXBpbGVyL2NwcC90aHJpZnQuZXhlIC4vdGhyaWZ0LmV4ZQoraWYgdGVzdCAtZiBjb21waWxlci9jcHAvLmxpYnMvdGhyaWZ0LmV4ZSA7IHRoZW4KKyAgaTU4Ni1taW5ndzMybXN2Yy1zdHJpcCBjb21waWxlci9jcHAvLmxpYnMvdGhyaWZ0LmV4ZSAtbyAuL3RocmlmdC5leGUKK2Vsc2UgCisgIGk1ODYtbWluZ3czMm1zdmMtc3RyaXAgY29tcGlsZXIvY3BwL3RocmlmdC5leGUgLW8gLi90aHJpZnQuZXhlCiBmaQotaTU4Ni1taW5ndzMybXN2Yy1zdHJpcCAuL3RocmlmdC5leGUKLWVjaG8KK2VjaG8gIkZpbmlzaGVkIGNvbXBpbGluZyB3aXRoIHJlc3VsdGluZyBleGUiCiBscyAtbCAuL3RocmlmdC5leGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5IGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKaW5kZXggNTJkMjIxMS4uMGJlNWYyOSAxMDA3NTUKLS0tIGEvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKKysrIGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKQEAgLTQyLDEwICs0MiwxMiBAQAogICAgICAgICBzZWxmLmFkZHJlc3MgPSBhZGRyZXNzCiAgICAgICAgIHNlbGYuc291cmNlRmlsZSA9IE5vbmUKICAgICAgICAgc2VsZi5zb3VyY2VMaW5lID0gTm9uZQotICAgICAgICBzZWxmLmZ1bnRpb24gPSBOb25lCisgICAgICAgIHNlbGYuZnVuY3Rpb24gPSBOb25lCiAKIAogZ19hZGRyc19ieV9maWxlbmFtZSA9IHt9CisKKwogZGVmIGdldF9hZGRyZXNzKGZpbGVuYW1lLCBhZGRyZXNzKToKICAgICAiIiIKICAgICBSZXRyaWV2ZSBhbiBBZGRyZXNzSW5mbyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZpbGUgYW5kIGFkZHJlc3MuCkBAIC0xMDMsMTIgKzEwNSwxMiBAQAogICAgICAgICBpZHggPSBmaWxlX2FuZF9saW5lLnJmaW5kKCc6JykKICAgICAgICAgaWYgaWR4IDwgMDoKICAgICAgICAgICAgIG1zZyA9ICdleHBlY3RlZCBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIGFkZHIybGluZTsgZ290ICVyJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgKGZpbGVfYW5kX2xpbmUsKQorICAgICAgICAgICAgICAgIChmaWxlX2FuZF9saW5lLCkKICAgICAgICAgICAgIG1zZyArPSAnXG5maWxlPSVyLCBhZGRyZXNzPSVyJyAlIChmaWxlbmFtZSwgYWRkcmVzcy5hZGRyZXNzKQogICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKG1zZykKIAogICAgICAgICBhZGRyZXNzLnNvdXJjZUZpbGUgPSBmaWxlX2FuZF9saW5lWzppZHhdCi0gICAgICAgIGFkZHJlc3Muc291cmNlTGluZSA9IGZpbGVfYW5kX2xpbmVbaWR4KzE6XQorICAgICAgICBhZGRyZXNzLnNvdXJjZUxpbmUgPSBmaWxlX2FuZF9saW5lW2lkeCArIDE6XQogCiAgICAgKHJlbWFpbmluZ19vdXQsIGNtZF9lcnIpID0gcHJvYy5jb21tdW5pY2F0ZSgpCiAgICAgcmV0Y29kZSA9IHByb2Mud2FpdCgpCkBAIC0xODAsNyArMTgyLDcgQEAKIAogICAgIHZpcnRfY2FsbF9yZWdleCA9IHJlLmNvbXBpbGUocideXHMqVF9WSVJUVUFMX0NBTEw6IChcZCspIGNhbGxzIG9uICguKik6JCcpCiAgICAgZ2VuX3Byb3RfcmVnZXggPSByZS5jb21waWxlKAotICAgICAgICAgICAgcideXHMqVF9HRU5FUklDX1BST1RPQ09MOiAoXGQrKSBjYWxscyB0byAoLiopIHdpdGggYSAoLiopOiQnKQorICAgICAgICByJ15ccypUX0dFTkVSSUNfUFJPVE9DT0w6IChcZCspIGNhbGxzIHRvICguKikgd2l0aCBhICguKik6JCcpCiAgICAgYnRfcmVnZXggPSByZS5jb21waWxlKHInXlxzKiMoXGQrKVxzKiguKikgXFsoMHhbMC05QS1aYS16XSspXF0kJykKIAogICAgICMgUGFyc2UgYWxsIG9mIHRoZSBpbnB1dCwgYW5kIHN0b3JlIGl0IGFzIEVudHJ5IG9iamVjdHMKQEAgLTIwOSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgICMgIl9aIiB0byB0aGUgdHlwZSBuYW1lIHRvIG1ha2UgaXQgbG9vayBsaWtlIGFuIGV4dGVybmFsIG5hbWUuCiAgICAgICAgICAgICAgICAgdHlwZV9uYW1lID0gJ19aJyArIHR5cGVfbmFtZQogICAgICAgICAgICAgaGVhZGVyID0gJ1RfVklSVFVBTF9DQUxMOiAlZCBjYWxscyBvbiAiJXMiJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lKQorICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZSkKICAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKICAgICAgICAgICAgIGN1cnJlbnRfZW50cnkgPSBFbnRyeShoZWFkZXIpCkBAIC0yMjQsNyArMjI2LDcgQEAKICAgICAgICAgICAgICAgICB0eXBlX25hbWUxID0gJ19aJyArIHR5cGVfbmFtZTEKICAgICAgICAgICAgICAgICB0eXBlX25hbWUyID0gJ19aJyArIHR5cGVfbmFtZTIKICAgICAgICAgICAgIGhlYWRlciA9ICdUX0dFTkVSSUNfUFJPVE9DT0w6ICVkIGNhbGxzIHRvICIlcyIgd2l0aCBhICIlcyInICUgXAotICAgICAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUxLCB0eXBlX25hbWUyKQorICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZTEsIHR5cGVfbmFtZTIpCiAgICAgICAgICAgICBpZiBjdXJyZW50X2VudHJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIGVudHJpZXMuYXBwZW5kKGN1cnJlbnRfZW50cnkpCiAgICAgICAgICAgICBjdXJyZW50X2VudHJ5ID0gRW50cnkoaGVhZGVyKQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY2YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxwcm9qZWN0IAorICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiAKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRocmlmdDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+dGhyaWZ0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KKyAgPG5hbWU+dGhyaWZ0LW1hdmVuLXBsdWdpbjwvbmFtZT4KKyAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTQuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgPHRocmlmdEV4ZWN1dGFibGU+JHt0aHJpZnQuY29tcGlsZXJ9PC90aHJpZnRFeGVjdXRhYmxlPgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuMTE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjE0LjAuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4wLjE0PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEwLjE5PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKyAgPHByb3BlcnRpZXM+CisgICAgPHRocmlmdC5yb290PiR7YmFzZWRpcn0vLi4vLi48L3RocmlmdC5yb290PgorICAgIDx0aHJpZnQuY29tcGlsZXI+JHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdDwvdGhyaWZ0LmNvbXBpbGVyPgorICAgIDx0aHJpZnQudGVzdC5ob21lPiR7dGhyaWZ0LnJvb3R9L3Rlc3Q8L3RocmlmdC50ZXN0LmhvbWU+CisgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5YmU5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmlvLlJhd0lucHV0U3RyZWFtRmFjYWRlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzLm5ld0hhc2hTZXQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLmxpc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHMuY2xlYW5EaXJlY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHMuY29weVN0cmVhbVRvRmlsZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5nZXRGaWxlczsKKworLyoqCisgKiBBYnN0cmFjdCBNb2pvIGltcGxlbWVudGF0aW9uLgorICogPHAvPgorICogVGhpcyBjbGFzcyBpcyBleHRlbmRlZCBieSB7QGxpbmsgb3JnLmFwYWNoZS50aHJpZnQubWF2ZW4uVGhyaWZ0Q29tcGlsZU1vam99IGFuZAorICoge0BsaW5rIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuLlRocmlmdFRlc3RDb21waWxlTW9qb30gaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yCisgKiBjb21waWxpbmcgdGhlIG1haW4gb3IgdGVzdCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUaHJpZnRNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJJRlRfRklMRV9TVUZGSVggPSAiLnRocmlmdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTkNMVURFUyA9ICIqKi8qIiArIFRIUklGVF9GSUxFX1NVRkZJWDsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IE1hdmVuIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdH0iCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgdXNlZCB0byBhZGQgcmVzb3VyY2VzIHRvIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQGNvbXBvbmVudAorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBNYXZlblByb2plY3RIZWxwZXIgcHJvamVjdEhlbHBlcjsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIHtAY29kZSB0aHJpZnR9IGV4ZWN1dGFibGUuIEJ5IGRlZmF1bHQgaXQgd2lsbCBzZWFyY2ggdGhlIHtAY29kZSAkUEFUSH0uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aHJpZnRFeGVjdXRhYmxlOworCisgICAgLyoqCisgICAgICogVGhpcyBzdHJpbmcgaXMgcGFzc2VkIHRvIHRoZSB7QGNvZGUgLS1nZW59IG9wdGlvbiBvZiB0aGUge0Bjb2RlIHRocmlmdH0gcGFyYW1ldGVyLiBCeSBkZWZhdWx0CisgICAgICogaXQgd2lsbCBnZW5lcmF0ZSBKYXZhIG91dHB1dC4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIG9wdGlvbiBpcyB0byBiZSBhYmxlIHRvIGFkZCBvcHRpb25zCisgICAgICogdG8gdGhlIEphdmEgZ2VuZXJhdG9yIC0gaWYgeW91IGdlbmVyYXRlIHNvbWV0aGluZyBlbHNlLCB5b3UncmUgb24geW91ciBvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImphdmEiCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgRmlsZVtdIGFkZGl0aW9uYWxUaHJpZnRQYXRoRWxlbWVudHMgPSBuZXcgRmlsZVtde307CisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB7QGNvZGUgdGhyaWZ0fSBjYW5ub3QgYWNjZXNzIGphcnMsIHRocmlmdCBmaWxlcyBpbiBkZXBlbmRlbmNpZXMgYXJlIGV4dHJhY3RlZCB0byB0aGlzIGxvY2F0aW9uCisgICAgICogYW5kIGRlbGV0ZWQgb24gZXhpdC4gVGhpcyBkaXJlY3RvcnkgaXMgYWx3YXlzIGNsZWFuZWQgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGhyaWZ0LWRlcGVuZGVuY2llcyIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIGxvY2FsIG1hdmVuIHtAY29kZSByZXBvc2l0b3J5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtsb2NhbFJlcG9zaXRvcnl9IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OworCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgdG8ge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlIGhhc2hpbmcgb2YgZGVwZW5kZW50IGphciBwYXRocy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBwbHVnaW4gZXhwYW5kcyBqYXJzIG9uIHRoZSBjbGFzc3BhdGggbG9va2luZyBmb3IgZW1iZWRkZWQgLnRocmlmdCBmaWxlcy4KKyAgICAgKiBOb3JtYWxseSB0aGVzZSBwYXRocyBhcmUgaGFzaGVkIChNRDUpIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGxvbmcgZmlsZSBuYW1lcyBvbiB3aW5kb3dzLgorICAgICAqIEhvd2V2ZXIgaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8ge0Bjb2RlIGZhbHNlfSBsb25nZXIgcGF0aHMgd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRoczsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGluY2x1ZGVzID0gSW1tdXRhYmxlU2V0Lm9mKERFRkFVTFRfSU5DTFVERVMpOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gZXhjbHVkZXMgPSBJbW11dGFibGVTZXQub2YoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc3RhbGVNaWxsaXMgPSAwOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1N0YWxlbmVzcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIG1vam8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUGFyYW1ldGVycygpOworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFNvdXJjZVJvb3QgPSBnZXRUaHJpZnRTb3VyY2VSb290KCk7CisgICAgICAgIGlmICh0aHJpZnRTb3VyY2VSb290LmV4aXN0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRGaWxlcyA9IGZpbmRUaHJpZnRGaWxlc0luRGlyZWN0b3J5KHRocmlmdFNvdXJjZVJvb3QpOworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IG91dHB1dEZpbGVzID0gZmluZEdlbmVyYXRlZEZpbGVzSW5EaXJlY3RvcnkoZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOworCisgICAgICAgICAgICAgICAgaWYgKHRocmlmdEZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJObyB0aHJpZnQgZmlsZXMgdG8gY29tcGlsZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrU3RhbGVuZXNzICYmICgobGFzdE1vZGlmaWVkKHRocmlmdEZpbGVzKSArIHN0YWxlTWlsbGlzKSA8IGxhc3RNb2RpZmllZChvdXRwdXRGaWxlcykpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIlNraXBwaW5nIGNvbXBpbGF0aW9uIGJlY2F1c2UgdGFyZ2V0IGRpcmVjdG9yeSBuZXdlciB0aGFuIHNvdXJjZXMuIik7CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaEZpbGVzKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IGRlcml2ZWRUaHJpZnRQYXRoRWxlbWVudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VUaHJpZnRQYXRoRnJvbUphcnModGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgZ2V0RGVwZW5kZW5jeUFydGlmYWN0RmlsZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeS5ta2RpcnMoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBRdWljayBmaXggdG8gZml4IGlzc3VlcyB3aXRoIHR3byBtdm4gaW5zdGFsbHMgaW4gYSByb3cgKGllIG5vIGNsZWFuKQorICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbkRpcmVjdG9yeShvdXRwdXREaXJlY3RvcnkpOworCisgICAgICAgICAgICAgICAgICAgIFRocmlmdCB0aHJpZnQgPSBuZXcgVGhyaWZ0LkJ1aWxkZXIodGhyaWZ0RXhlY3V0YWJsZSwgb3V0cHV0RGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudCh0aHJpZnRTb3VyY2VSb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudHMoZGVyaXZlZFRocmlmdFBhdGhFbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGhyaWZ0UGF0aEVsZW1lbnRzKGFzTGlzdChhZGRpdGlvbmFsVGhyaWZ0UGF0aEVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGhyaWZ0RmlsZXModGhyaWZ0RmlsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleGl0U3RhdHVzID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXRTdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoInRocmlmdCBmYWlsZWQgb3V0cHV0OiAiICsgdGhyaWZ0LmdldE91dHB1dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmVycm9yKCJ0aHJpZnQgZmFpbGVkIGVycm9yOiAiICsgdGhyaWZ0LmdldEVycm9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyaWZ0IGRpZCBub3QgZXhpdCBjbGVhbmx5LiBSZXZpZXcgb3V0cHV0IGZvciBtb3JlIGluZm9ybWF0aW9uLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF0dGFjaEZpbGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJBbiBJTyBlcnJvciBvY2N1cnJlZCIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oInRocmlmdCBmYWlsZWQgdG8gZXhlY3V0ZSBiZWNhdXNlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29tbWFuZExpbmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbnZva2luZyB0aHJpZnQuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKGZvcm1hdCgiJXMgZG9lcyBub3QgZXhpc3QuIFJldmlldyB0aGUgY29uZmlndXJhdGlvbiBvciBjb25zaWRlciBkaXNhYmxpbmcgdGhlIHBsdWdpbi4iLAorICAgICAgICAgICAgICAgICAgICB0aHJpZnRTb3VyY2VSb290KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gZmluZEdlbmVyYXRlZEZpbGVzSW5EaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkaXJlY3RvcnkgPT0gbnVsbCB8fCAhZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0Lm9mKCk7CisKKyAgICAgICAgTGlzdDxGaWxlPiBqYXZhRmlsZXNJbkRpcmVjdG9yeSA9IGdldEZpbGVzKGRpcmVjdG9yeSwgIioqLyouamF2YSIsIG51bGwpOworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihqYXZhRmlsZXNJbkRpcmVjdG9yeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZChJbW11dGFibGVTZXQ8RmlsZT4gZmlsZXMpIHsKKyAgICAgICAgbG9uZyByZXN1bHQgPSAwOworICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgICAgICBpZiAoZmlsZS5sYXN0TW9kaWZpZWQoKSA+IHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycygpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHByb2plY3QsICJwcm9qZWN0Iik7CisgICAgICAgIGNoZWNrTm90TnVsbChwcm9qZWN0SGVscGVyLCAicHJvamVjdEhlbHBlciIpOworICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0RXhlY3V0YWJsZSwgInRocmlmdEV4ZWN1dGFibGUiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGdlbmVyYXRvciwgImdlbmVyYXRvciIpOworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFNvdXJjZVJvb3QgPSBnZXRUaHJpZnRTb3VyY2VSb290KCk7CisgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRTb3VyY2VSb290KTsKKyAgICAgICAgY2hlY2tBcmd1bWVudCghdGhyaWZ0U291cmNlUm9vdC5pc0ZpbGUoKSwgInRocmlmdFNvdXJjZVJvb3QgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5Iik7CisgICAgICAgIGNoZWNrU3RhdGUoIXRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuaXNGaWxlKCksICJ0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CisgICAgICAgIGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisgICAgICAgIGNoZWNrTm90TnVsbChvdXRwdXREaXJlY3RvcnkpOworICAgICAgICBjaGVja1N0YXRlKCFvdXRwdXREaXJlY3RvcnkuaXNGaWxlKCksICJ0aGUgb3V0cHV0RGlyZWN0b3J5IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0VGhyaWZ0U291cmNlUm9vdCgpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXR0YWNoRmlsZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBGaWxlfSBmb3IgZWFjaCBkZXBlbmRlbmN5IGFydGlmYWN0LgorICAgICAqCisgICAgICogQHJldHVybiBBIHNldCBvZiBhbGwgZGVwZW5kZW5jeSBhcnRpZmFjdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbW11dGFibGVTZXQ8RmlsZT4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0RmlsZXMoKSB7CisgICAgICAgIFNldDxGaWxlPiBkZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcyA9IG5ld0hhc2hTZXQoKTsKKyAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKSkgeworICAgICAgICAgICAgZGVwZW5kZW5jeUFydGlmYWN0RmlsZXMuYWRkKGFydGlmYWN0LmdldEZpbGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoZGVwZW5kZW5jeUFydGlmYWN0RmlsZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gbWFrZVRocmlmdFBhdGhGcm9tSmFycyhGaWxlIHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIEl0ZXJhYmxlPEZpbGU+IGNsYXNzcGF0aEVsZW1lbnRGaWxlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTm90TnVsbChjbGFzc3BhdGhFbGVtZW50RmlsZXMsICJjbGFzc3BhdGhFbGVtZW50RmlsZXMiKTsKKyAgICAgICAgLy8gY2xlYW4gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gZW5zdXJlIHRoYXQgc3RhbGUgZmlsZXMgYXJlbid0IHVzZWQKKyAgICAgICAgaWYgKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGNsZWFuRGlyZWN0b3J5KHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbmV3SGFzaFNldCgpOworCisgICAgICAgIGZvciAoRmlsZSBjbGFzc3BhdGhFbGVtZW50RmlsZSA6IGNsYXNzcGF0aEVsZW1lbnRGaWxlcykgeworICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIHVuZGVyIElBTSwgd2UgcmVjZWl2ZSBwb21zIGFzIGRlcGVuZGVudCBmaWxlcworICAgICAgICAgICAgLy8gSSBhbSBleGNsdWRpbmcgLnhtbCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgLmphciBhcyB0aGVyZSBtYXkgYmUgb3RoZXIgZXh0ZW5zaW9ucyBpbiB1c2UgKHNhciwgaGFyLCB6aXApCisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoRWxlbWVudEZpbGUuaXNGaWxlKCkgJiYgY2xhc3NwYXRoRWxlbWVudEZpbGUuY2FuUmVhZCgpICYmCisgICAgICAgICAgICAgICAgICAgICFjbGFzc3BhdGhFbGVtZW50RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSkgeworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBqYXIgZmlsZS4gdGhlIGNvbnN0cnVjdG9yIHZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBKYXJGaWxlIGNsYXNzcGF0aEphcjsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhKYXIgPSBuZXcgSmFyRmlsZShjbGFzc3BhdGhFbGVtZW50RmlsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FzIG5vdCBhIHJlYWRhYmxlIGFydGlmYWN0IiwgY2xhc3NwYXRoRWxlbWVudEZpbGUpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBDb3B5IGVhY2ggLnRocmlmdCBmaWxlIGZvdW5kIGluIHRoZSBKQVIgaW50byBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHByZXNlcnZpbmcgdGhlCisgICAgICAgICAgICAgICAgICogZGlyZWN0b3J5IHBhdGggaXQgaGFkIHJlbGF0aXZlIHRvIGl0cyBjb250YWluaW5nIEpBUi4gQWRkIHRoZSByZXN1bHRpbmcgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgKiAodW5pcXVlIGZvciBlYWNoIEpBUiBwcm9jZXNzZWQpIHRvIHRoZSBzZXQgb2YgdGhyaWZ0IGluY2x1ZGUgZGlyZWN0b3JpZXMgdG8gdXNlIHdoZW4KKyAgICAgICAgICAgICAgICAgKiBjb21waWxpbmcuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZm9yIChKYXJFbnRyeSBqYXJFbnRyeSA6IGxpc3QoY2xhc3NwYXRoSmFyLmVudHJpZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphckVudHJ5TmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGphckVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aChUSFJJRlRfRklMRV9TVUZGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJ1bmNhdGVkSmFyUGF0aCA9IHRydW5jYXRlUGF0aChjbGFzc3BhdGhKYXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0Um9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIHRydW5jYXRlZEphclBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB1bmNvbXByZXNzZWRDb3B5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodGhyaWZ0Um9vdERpcmVjdG9yeSwgamFyRW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZENvcHkuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weVN0cmVhbVRvRmlsZShuZXcgUmF3SW5wdXRTdHJlYW1GYWNhZGUoY2xhc3NwYXRoSmFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSkpLCB1bmNvbXByZXNzZWRDb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZCh0aHJpZnRSb290RGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc3BhdGhFbGVtZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZVtdIHRocmlmdEZpbGVzID0gY2xhc3NwYXRoRWxlbWVudEZpbGUubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoVEhSSUZUX0ZJTEVfU1VGRklYKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgaWYgKHRocmlmdEZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyaWZ0RGlyZWN0b3JpZXMuYWRkKGNsYXNzcGF0aEVsZW1lbnRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnREaXJlY3Rvcmllcyk7CisgICAgfQorCisgICAgSW1tdXRhYmxlU2V0PEZpbGU+IGZpbmRUaHJpZnRGaWxlc0luRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja05vdE51bGwoZGlyZWN0b3J5KTsKKyAgICAgICAgY2hlY2tBcmd1bWVudChkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSwgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGRpcmVjdG9yeSk7CisgICAgICAgIExpc3Q8RmlsZT4gdGhyaWZ0RmlsZXNJbkRpcmVjdG9yeSA9IGdldEZpbGVzKGRpcmVjdG9yeSwgCisgICAgICAgIAkJSm9pbmVyLm9uKCIsIikuam9pbihpbmNsdWRlcyksCisgICAgICAgIAkJSm9pbmVyLm9uKCIsIikuam9pbihleGNsdWRlcykpOworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlc0luRGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVuY2F0ZXMgdGhlIHBhdGggb2YgamFyIGZpbGVzIHNvIHRoYXQgdGhleSBhcmUgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyUGF0aCB0aGUgZnVsbCBwYXRoIG9mIGEgamFyIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgdHJ1bmNhdGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkgb3Igcm9vdCBvZiB0aGUgZHJpdmUuCisgICAgICovCisgICAgU3RyaW5nIHRydW5jYXRlUGF0aChmaW5hbCBTdHJpbmcgamFyUGF0aCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworCisgICAgICAgIGlmIChoYXNoRGVwZW5kZW50UGF0aHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvSGV4U3RyaW5nKE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpLmRpZ2VzdChqYXJQYXRoLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBleHBhbmQgZGVwZW5kZW50IGphciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnkuZ2V0QmFzZWRpcigpLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgaWYgKCFyZXBvc2l0b3J5LmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJlcG9zaXRvcnkgKz0gIi8iOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBqYXJQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgaW50IHJlcG9zaXRvcnlJbmRleCA9IHBhdGguaW5kZXhPZihyZXBvc2l0b3J5KTsKKyAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHJlcG9zaXRvcnlJbmRleCArIHJlcG9zaXRvcnkubGVuZ3RoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQnkgbm93IHRoZSBwYXRoIHNob3VsZCBiZSBnb29kLCBidXQgZG8gYSBmaW5hbCBjaGVjayB0byBmaXggd2luZG93cyBtYWNoaW5lcy4KKyAgICAgICAgaW50IGNvbG9uSW5kZXggPSBwYXRoLmluZGV4T2YoJzonKTsKKyAgICAgICAgaWYgKGNvbG9uSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIC8vIDIgPSA6XCBpbiBDOlwKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0NIQVJTID0gIjAxMjM0NTY3ODlhYmNkZWYiLnRvQ2hhckFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hleFN0cmluZyhieXRlW10gYnl0ZUFycmF5KSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgaGV4U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoMiAqIGJ5dGVBcnJheS5sZW5ndGgpOworICAgICAgICBmb3IgKGZpbmFsIGJ5dGUgYiA6IGJ5dGVBcnJheSkgeworICAgICAgICAgICAgaGV4U3RyaW5nLmFwcGVuZChIRVhfQ0hBUlNbKGIgJiAweEYwKSA+PiA0XSkuYXBwZW5kKEhFWF9DSEFSU1tiICYgMHgwRl0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZXhTdHJpbmcudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnQuamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWE5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnQuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZGxpbmU7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0cy5uZXdMaW5rZWRMaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMubmV3SGFzaFNldDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW52b2thYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHtAY29kZSB0aHJpZnR9CisgKiBjb21waWxlci4gVGhlIGFjdHVhbCBleGVjdXRhYmxlIGlzIGludm9rZWQgdXNpbmcgdGhlIHBsZXh1cworICoge0BsaW5rIENvbW1hbmRsaW5lfS4KKyAqIDxwLz4KKyAqIFRoaXMgY2xhc3MgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgZ2VuZXJhdGluZyBqYXZhIHNvdXJjZSBmaWxlcy4KKyAqLworZmluYWwgY2xhc3MgVGhyaWZ0IHsKKworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgR0VORVJBVEVEX0pBVkEgPSAiZ2VuLWphdmEiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhlY3V0YWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBnZW5lcmF0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0UGF0aEVsZW1lbnRzOworICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdEZpbGVzOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZExpbmVVdGlscy5TdHJpbmdTdHJlYW1Db25zdW1lciBvdXRwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyIGVycm9yOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY3V0YWJsZSAgICAgICAgICBUaGUgcGF0aCB0byB0aGUge0Bjb2RlIHRocmlmdH0gZXhlY3V0YWJsZS4KKyAgICAgKiBAcGFyYW0gZ2VuZXJhdG9yICAgICAgICAgICBUaGUgdmFsdWUgZm9yIHRoZSB7QGNvZGUgLS1nZW59IG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gdGhyaWZ0UGF0aCAgICAgICAgICBUaGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBpbXBvcnRzLgorICAgICAqIEBwYXJhbSB0aHJpZnRGaWxlcyAgICAgICAgIFRoZSB0aHJpZnQgc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCisgICAgICogQHBhcmFtIGphdmFPdXRwdXREaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBqYXZhIHNvdXJjZSBmaWxlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgVGhyaWZ0KFN0cmluZyBleGVjdXRhYmxlLCBTdHJpbmcgZ2VuZXJhdG9yLCBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0UGF0aCwKKyAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0RmlsZXMsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeSkgeworICAgICAgICB0aGlzLmV4ZWN1dGFibGUgPSBjaGVja05vdE51bGwoZXhlY3V0YWJsZSwgImV4ZWN1dGFibGUiKTsKKyAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBjaGVja05vdE51bGwoZ2VuZXJhdG9yLCAiZ2VuZXJhdG9yIik7CisgICAgICAgIHRoaXMudGhyaWZ0UGF0aEVsZW1lbnRzID0gY2hlY2tOb3ROdWxsKHRocmlmdFBhdGgsICJ0aHJpZnRQYXRoIik7CisgICAgICAgIHRoaXMudGhyaWZ0RmlsZXMgPSBjaGVja05vdE51bGwodGhyaWZ0RmlsZXMsICJ0aHJpZnRGaWxlcyIpOworICAgICAgICB0aGlzLmphdmFPdXRwdXREaXJlY3RvcnkgPSBjaGVja05vdE51bGwoamF2YU91dHB1dERpcmVjdG9yeSwgImphdmFPdXRwdXREaXJlY3RvcnkiKTsKKyAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyKCk7CisgICAgICAgIHRoaXMub3V0cHV0ID0gbmV3IENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHRoZSB7QGNvZGUgdGhyaWZ0fSBjb21waWxlciB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQgYXQKKyAgICAgKiBjb25zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBleGl0IHN0YXR1cyBvZiB7QGNvZGUgdGhyaWZ0fS4KKyAgICAgKiBAdGhyb3dzIENvbW1hbmRMaW5lRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBjb21waWxlKCkgdGhyb3dzIENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKEZpbGUgdGhyaWZ0RmlsZSA6IHRocmlmdEZpbGVzKSB7CisgICAgICAgICAgICBDb21tYW5kbGluZSBjbCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICAgICAgY2wuc2V0RXhlY3V0YWJsZShleGVjdXRhYmxlKTsKKyAgICAgICAgICAgIGNsLmFkZEFyZ3VtZW50cyhidWlsZFRocmlmdENvbW1hbmQodGhyaWZ0RmlsZSkudG9BcnJheShuZXcgU3RyaW5nW117fSkpOworICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IENvbW1hbmRMaW5lVXRpbHMuZXhlY3V0ZUNvbW1hbmRMaW5lKGNsLCBudWxsLCBvdXRwdXQsIGVycm9yKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSAwIGhlcmUuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBiZWVuIG1hZGUgdmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5LgorICAgICAqCisgICAgICogQHBhcmFtIHRocmlmdEZpbGUKKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBleGVjdXRhYmxlIGZvbGxvd2VkIGJ5IGFueSBhcmd1bWVudHMuCisgICAgICovCisgICAgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGJ1aWxkVGhyaWZ0Q29tbWFuZChmaW5hbCBGaWxlIHRocmlmdEZpbGUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNvbW1hbmQgPSBuZXdMaW5rZWRMaXN0KCk7CisgICAgICAgIC8vIGFkZCB0aGUgZXhlY3V0YWJsZQorICAgICAgICBmb3IgKEZpbGUgdGhyaWZ0UGF0aEVsZW1lbnQgOiB0aHJpZnRQYXRoRWxlbWVudHMpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKCItSSIpOworICAgICAgICAgICAgY29tbWFuZC5hZGQodGhyaWZ0UGF0aEVsZW1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZC5hZGQoIi1vdXQiKTsKKyAgICAgICAgY29tbWFuZC5hZGQoamF2YU91dHB1dERpcmVjdG9yeS50b1N0cmluZygpKTsKKyAgICAgICAgY29tbWFuZC5hZGQoIi0tZ2VuIik7CisgICAgICAgIGNvbW1hbmQuYWRkKGdlbmVyYXRvcik7CisgICAgICAgIGNvbW1hbmQuYWRkKHRocmlmdEZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZihjb21tYW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dC5nZXRPdXRwdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7CisgICAgICAgIHJldHVybiBlcnJvci5nZXRPdXRwdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGJ1aWxkcyB7QGxpbmsgVGhyaWZ0fSBpbnN0YW5jZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBleGVjdXRhYmxlOworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBTZXQ8RmlsZT4gdGhyaWZ0UGF0aEVsZW1lbnRzOworICAgICAgICBwcml2YXRlIFNldDxGaWxlPiB0aHJpZnRGaWxlczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWxkZXIuIFRoZSB0d28gcGFyYW1ldGVycyBhcmUgcHJlc2VudCBhcyB0aGV5IGFyZQorICAgICAgICAgKiByZXF1aXJlZCBmb3IgYWxsIHtAbGluayBUaHJpZnR9IGluc3RhbmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4ZWN1dGFibGUgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIHtAY29kZSB0aHJpZnR9IGV4ZWN1dGFibGUuCisgICAgICAgICAqIEBwYXJhbSBqYXZhT3V0cHV0RGlyZWN0b3J5IFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIElmIGVpdGhlciBvZiB0aGUgYXJndW1lbnRzIGFyZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSB7QGNvZGUgamF2YU91dHB1dERpcmVjdG9yeX0gaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgZGlyZWN0b3J5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGV4ZWN1dGFibGUsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeSkgeworICAgICAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gY2hlY2tOb3ROdWxsKGV4ZWN1dGFibGUsICJleGVjdXRhYmxlIik7CisgICAgICAgICAgICB0aGlzLmphdmFPdXRwdXREaXJlY3RvcnkgPSBjaGVja05vdE51bGwoamF2YU91dHB1dERpcmVjdG9yeSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KGphdmFPdXRwdXREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICB0aGlzLnRocmlmdEZpbGVzID0gbmV3SGFzaFNldCgpOworICAgICAgICAgICAgdGhpcy50aHJpZnRQYXRoRWxlbWVudHMgPSBuZXdIYXNoU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIHRocmlmdCBmaWxlIHRvIGJlIGNvbXBpbGVkLiBUaHJpZnQgZmlsZXMgbXVzdCBiZSBvbiB0aGUgdGhyaWZ0cGF0aAorICAgICAgICAgKiBhbmQgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIGlmIGEgdGhyaWZ0IGZpbGUgaXMgYWRkZWQgd2l0aG91dCBmaXJzdCBhZGRpbmcgYQorICAgICAgICAgKiBwYXJlbnQgZGlyZWN0b3J5IHRvIHRoZSB0aHJpZnRwYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGhyaWZ0RmlsZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBhIHRocmlmdCBmaWxlIGlzIGFkZGVkIHdpdGhvdXQgZmlyc3QKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaW5nIGEgcGFyZW50IGRpcmVjdG9yeSB0byB0aGUgdGhyaWZ0cGF0aC4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgSWYge0Bjb2RlIHRocmlmdEZpbGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdEZpbGUoRmlsZSB0aHJpZnRGaWxlKSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KHRocmlmdEZpbGUuaXNGaWxlKCkpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudCh0aHJpZnRGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnRocmlmdCIpKTsKKyAgICAgICAgICAgIGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoKHRocmlmdEZpbGUpOworICAgICAgICAgICAgdGhyaWZ0RmlsZXMuYWRkKHRocmlmdEZpbGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0aGUgb3B0aW9uIHN0cmluZyBmb3IgdGhlIFRocmlmdCBleGVjdXRhYmxlJ3Mge0Bjb2RlIC0tZ2VufSBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBnZW5lcmF0b3IKKyAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlcgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIHtAY29kZSBnZW5lcmF0b3J9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEdlbmVyYXRvcihTdHJpbmcgZ2VuZXJhdG9yKSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGgoRmlsZSB0aHJpZnRGaWxlKSB7CisgICAgICAgICAgICBhc3NlcnQgdGhyaWZ0RmlsZS5pc0ZpbGUoKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGhIZWxwZXIodGhyaWZ0RmlsZS5nZXRQYXJlbnRGaWxlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aEhlbHBlcihGaWxlIGRpcmVjdG9yeSkgeworICAgICAgICAgICAgYXNzZXJ0IGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpOworICAgICAgICAgICAgaWYgKHRocmlmdFBhdGhFbGVtZW50cy5jb250YWlucyhkaXJlY3RvcnkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgcGFyZW50RGlyZWN0b3J5ID0gZGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHBhcmVudERpcmVjdG9yeSA9PSBudWxsKSA/IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoSGVscGVyKHBhcmVudERpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSAjYWRkVGhyaWZ0RmlsZShGaWxlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0RmlsZXMoSXRlcmFibGU8RmlsZT4gdGhyaWZ0RmlsZXMpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSB0aHJpZnRGaWxlIDogdGhyaWZ0RmlsZXMpIHsKKyAgICAgICAgICAgICAgICBhZGRUaHJpZnRGaWxlKHRocmlmdEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0aGUge0Bjb2RlIHRocmlmdFBhdGhFbGVtZW50fSB0byB0aGUgdGhyaWZ0UGF0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRocmlmdFBhdGhFbGVtZW50IEEgZGlyZWN0b3J5IHRvIGJlIHNlYXJjaGVkIGZvciBpbXBvcnRlZCB0aHJpZnQgbWVzc2FnZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGRlZmluaXRpb25zLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICBJZiB7QGNvZGUgdGhyaWZ0UGF0aEVsZW1lbnR9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYge0Bjb2RlIHRocmlmdFBhdGhFbGVtZW50fSBpcyBub3QgYQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRUaHJpZnRQYXRoRWxlbWVudChGaWxlIHRocmlmdFBhdGhFbGVtZW50KSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0UGF0aEVsZW1lbnQpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudCh0aHJpZnRQYXRoRWxlbWVudC5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIHRocmlmdFBhdGhFbGVtZW50cy5hZGQodGhyaWZ0UGF0aEVsZW1lbnQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSAjYWRkVGhyaWZ0UGF0aEVsZW1lbnQoRmlsZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdFBhdGhFbGVtZW50cyhJdGVyYWJsZTxGaWxlPiB0aHJpZnRQYXRoRWxlbWVudHMpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSB0aHJpZnRQYXRoRWxlbWVudCA6IHRocmlmdFBhdGhFbGVtZW50cykgeworICAgICAgICAgICAgICAgIGFkZFRocmlmdFBhdGhFbGVtZW50KHRocmlmdFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gQSBjb25maWd1cmVkIHtAbGluayBUaHJpZnR9IGluc3RhbmNlLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBubyB0aHJpZnQgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRocmlmdCBidWlsZCgpIHsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoIXRocmlmdEZpbGVzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRocmlmdChleGVjdXRhYmxlLCBnZW5lcmF0b3IsIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0UGF0aEVsZW1lbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRGaWxlcyksIGphdmFPdXRwdXREaXJlY3RvcnkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0Q29tcGlsZU1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdENvbXBpbGVNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNzU3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdENvbXBpbGVNb2pvLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCisvKioKKyAqIFRoaXMgbW9qbyBleGVjdXRlcyB0aGUge0Bjb2RlIHRocmlmdH0gY29tcGlsZXIgZm9yIGdlbmVyYXRpbmcgamF2YSBzb3VyY2VzCisgKiBmcm9tIHRocmlmdCBkZWZpbml0aW9ucy4gSXQgYWxzbyBzZWFyY2hlcyBkZXBlbmRlbmN5IGFydGlmYWN0cyBmb3IKKyAqIHRocmlmdCBmaWxlcyBhbmQgaW5jbHVkZXMgdGhlbSBpbiB0aGUgdGhyaWZ0UGF0aCBzbyB0aGF0IHRoZXkgY2FuIGJlCisgKiByZWZlcmVuY2VkLiBGaW5hbGx5LCBpdCBhZGRzIHRoZSB0aHJpZnQgZmlsZXMgdG8gdGhlIHByb2plY3QgYXMgcmVzb3VyY2VzIHNvCisgKiB0aGF0IHRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBhcnRpZmFjdC4KKyAqCisgKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcworICogQGdvYWwgY29tcGlsZQorICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhyaWZ0Q29tcGlsZU1vam8gZXh0ZW5kcyBBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBzb3VyY2VzIHRvIGJlIGNvbXBpbGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2Jhc2VkaXJ9L3NyYy9tYWluL3RocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGhyaWZ0U291cmNlUm9vdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB7QGNvZGUgLmphdmF9IHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdD4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpIHsKKyAgICAgICAgTGlzdDxBcnRpZmFjdD4gY29tcGlsZUFydGlmYWN0cyA9IHByb2plY3QuZ2V0Q29tcGlsZUFydGlmYWN0cygpOworICAgICAgICByZXR1cm4gY29tcGlsZUFydGlmYWN0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGhyaWZ0U291cmNlUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHRocmlmdFNvdXJjZVJvb3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoRmlsZXMoKSB7CisgICAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3Qob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgcHJvamVjdEhlbHBlci5hZGRSZXNvdXJjZShwcm9qZWN0LCB0aHJpZnRTb3VyY2VSb290LmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAJCUltbXV0YWJsZUxpc3Qub2YoIioqLyoudGhyaWZ0IiksIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxZDk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworCisvKioKKyAqIEBwaGFzZSBnZW5lcmF0ZS10ZXN0LXNvdXJjZXMKKyAqIEBnb2FsIHRlc3RDb21waWxlCisgKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiB0ZXN0CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUaHJpZnRUZXN0Q29tcGlsZU1vam8gZXh0ZW5kcyBBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBzb3VyY2VzIHRvIGJlIGNvbXBpbGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2Jhc2VkaXJ9L3NyYy90ZXN0L3RocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGhyaWZ0VGVzdFNvdXJjZVJvb3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUge0Bjb2RlIC5qYXZhfSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMvdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hGaWxlcygpIHsKKyAgICAgICAgcHJvamVjdC5hZGRUZXN0Q29tcGlsZVNvdXJjZVJvb3Qob3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgcHJvamVjdEhlbHBlci5hZGRUZXN0UmVzb3VyY2UocHJvamVjdCwgdGhyaWZ0VGVzdFNvdXJjZVJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgIAkJSW1tdXRhYmxlTGlzdC5vZigiKiovKi50aHJpZnQiKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKSB7CisgICAgICAgIC8vIFRPRE8oZ2FrKTogbWF2ZW4tcHJvamVjdCBuZWVkcyBnZW5lcmljcworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgTGlzdDxBcnRpZmFjdD4gdGVzdEFydGlmYWN0cyA9IHByb2plY3QuZ2V0VGVzdEFydGlmYWN0cygpOworICAgICAgICByZXR1cm4gdGVzdEFydGlmYWN0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGhyaWZ0U291cmNlUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHRocmlmdFRlc3RTb3VyY2VSb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWwgbWF2ZW4gQXJ0aWZhY3RSZXBvc2l0b3J5LiBFeHBvc2VkIG9ubHkgdG8gYWxsb3cgdGVzdGluZyBvdXRzaWRlIG9mIE1hdmVuIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbFJlcG9zaXRvcnkgbG9jYWwgQXJ0aWZhY3RSZXBvc2l0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNYXZlblJlcG9zaXRvcnkoZmluYWwgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSkgeworICAgICAgICB0aGlzLmxvY2FsUmVwb3NpdG9yeSA9IGxvY2FsUmVwb3NpdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9wdGlvbiB0byBoYXNoIGRlcGVuZGVudCBKQVIgcGF0aHMuIEV4cG9zZWQgb25seSB0byBhbGxvdyB0ZXN0aW5nIG91dHNpZGUgb2YgTWF2ZW4gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGhhc2hEZXBlbmRlbnRQYXRocyB3aGV0aGVyIG9yIG5vdCB0byBoYXNoIHBhdGhzIHRvIGRlcGVuZGVudCBKQVJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzaERlcGVuZGVudFBhdGhzKGZpbmFsIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzKSB7CisgICAgICAgIHRoaXMuaGFzaERlcGVuZGVudFBhdGhzID0gaGFzaERlcGVuZGVudFBhdGhzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE3NjcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0RXF1YWxzOworCisKK3B1YmxpYyBjbGFzcyBUZXN0QWJzdHJhY3RUaHJpZnRNb2pvIHsKKworICAgIHByaXZhdGUgVGhyaWZ0VGVzdENvbXBpbGVNb2pvIG1vam87CisgICAgcHJpdmF0ZSBGaWxlIHRlc3RSb290RGlyOworICAgIHByaXZhdGUgQXJ0aWZhY3RSZXBvc2l0b3J5IG1hdmVuUmVwb3NpdG9yeTsKKworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgICAgICAgdGVzdFJvb3REaXIgPSBuZXcgRmlsZSh0bXBEaXIsICJ0aHJpZnQtdGVzdCIpOworCisgICAgICAgIC8vIHRoZSB0cnVuY2F0ZVBhdGggbWV0aG9kIGFzc3VtZXMgYSBtYXZlbiByZXBvc2l0b3J5LCBidXQgaXQgb25seSBjYXJlcyBhYm91dCB0aGUgYmFzZSBkaXIKKyAgICAgICAgbWF2ZW5SZXBvc2l0b3J5ID0gTW9ja2l0by5tb2NrKEFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcyk7CisgICAgICAgIE1vY2tpdG8ud2hlbihtYXZlblJlcG9zaXRvcnkuZ2V0QmFzZWRpcigpKS50aGVuUmV0dXJuKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIiKTsKKworICAgICAgICBtb2pvID0gbmV3IFRocmlmdFRlc3RDb21waWxlTW9qbygpOworICAgICAgICBtb2pvLnNldExvY2FsTWF2ZW5SZXBvc2l0b3J5KG1hdmVuUmVwb3NpdG9yeSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZVRocmlmdFBhdGhGcm9tSmFycygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBGaWxlIHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkgPSB0ZXN0Um9vdERpcjsKKworICAgICAgICAvLyBUaGUgU2hhcmVkSWRsLmphciBmaWxlIGNvbnRhaW5zIHRoZSBzYW1lIGlkbC9zaGFyZWQudGhyaWZ0IGFuZCBpZGwvdHV0b3JpYWwudGhyaWZ0IGhpZXJhcmNoeQorICAgICAgICAvLyB1c2VkIGJ5IG90aGVyIHRlc3RzLiBJdCdzIHVzZWQgaGVyZSB0byByZXByZXNlbnQgYSBkZXBlbmRlbmN5IG9mIHRoZSBwcm9qZWN0IG1hdmVuIGlzIGJ1aWxkaW5nLAorICAgICAgICAvLyBvbmUgdGhhdCBpcyBjb250cmlidXRpbmcgLnRocmlmdCBJREwgZmlsZXMgYXMgd2VsbCBhcyBhbnkgb3RoZXIgYXJ0aWZhY3RzLgorICAgICAgICBmaW5hbCBJdGVyYWJsZTxGaWxlPiBjbGFzc3BhdGhFbGVtZW50RmlsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9kZXBlbmRlbmN5LWphci10ZXN0L1NoYXJlZElkbC5qYXIiKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIFNldDxGaWxlPiB0aHJpZnREaXJlY3RvcmllcyA9IG1vam8ubWFrZVRocmlmdFBhdGhGcm9tSmFycyh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCBjbGFzc3BhdGhFbGVtZW50RmlsZXMpOworCisgICAgICAgIC8vIFRoZSByZXN1bHRzIHNob3VsZCBiZSBhIHBhdGggdG8gYSBkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgdGhlIEpBUiBpdHNlbGYgKGFzc3VtaW5nIG5vIHBhdGggaGFzaGluZywKKyAgICAgICAgLy8gYnV0IHNlZSBiZWxvdyBmb3IgYSBzZXBhcmF0ZSB0ZXN0IG9mIHRoYXQpIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiBhIGhpZXJhcmNoeSBjb250YWluaW5nIHRocmlmdAorICAgICAgICAvLyBmaWxlcywgc3VpdGFibGUgZm9yIHByb3ZpZGluZyB0byB0aGUgdGhyaWZ0IGNvbXBpbGVyIGFzIGFuIGluY2x1ZGUgZGlyZWN0b3J5LiBJbiB0aGlzIGNhc2UsIHRoYXQKKyAgICAgICAgLy8gbWVhbnMgaXQgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgImlkbCIgaGllcmFyY2h5IHJhdGhlciB0aGFuIHRvIHRoZSBpZGwgZGlyZWN0b3J5CisgICAgICAgIC8vIGl0c2VsZi4KKyAgICAgICAgZmluYWwgU2V0PEZpbGU+IGV4cGVjdGVkID0gU2V0cy5uZXdIYXNoU2V0KAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAic3JjL3Rlc3QvcmVzb3VyY2VzL2RlcGVuZGVuY3ktamFyLXRlc3QvU2hhcmVkSWRsLmphciIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYWtlVGhyaWZ0UGF0aEZyb21KYXJzIHNob3VsZCByZXR1cm4gdGhyaWZ0IElETCBiYXNlIHBhdGggZnJvbSB3aXRoaW4gSkFSIiwgZXhwZWN0ZWQsIHRocmlmdERpcmVjdG9yaWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnVuY2F0ZVBhdGgoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLy8gSkFSIHBhdGggaXMgdW5yZWxhdGVkIHRvIG1hdmVuIHJlcG8sIGFuZCBzaG91bGQgYmUgdW5jaGFuZ2VkCisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisKKyAgICAgICAgLy8gSkFSIHBhdGggaXMgd2l0aGluIG1hdmVuIHJlcG8sIGFuZCBzaG91bGQgYmUgbWFkZSByZWxhdGl2ZSB0byB0aGUgcmVwbworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisKKyAgICAgICAgLy8gSkFSIHBhdGggY29udGFpbnMgZm9yd2FyZCBzbGFzaGVzIHRoYXQgc2hvdWxkIGJlIG5vcm1hbGl6ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCJcXHBhdGhcXHRvXFxzb21lamFyLmphciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnVuY2F0ZVBhdGhXaXRoRGVwZW5kZW50UGF0aEhhc2hpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgbW9qby5zZXRIYXNoRGVwZW5kZW50UGF0aHModHJ1ZSk7CisKKyAgICAgICAgLy8gaGFzaERlcGVuZGVudFBhdGhzIHNldCB0byB0cnVlLCB0aGUgSkFSIHBhdGggaXMgaW1tZWRpYXRlbHkgaGFzaGVkIChNRDUpIGFuZCBjb252ZXJ0ZWQgdG8gYSBoZXggc3RyaW5nCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxYzg1OTUwOTg3YjIzNDkzNDYyY2YzYzI2MWQ5NTEwYSIsIG1vam8udHJ1bmNhdGVQYXRoKCIvcGF0aC90by9zb21lamFyLmphciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzOWZjMmI0YzM0Y2I2Y2IwZGEzOGJlZDVkOGI1ZmM2NyIsIG1vam8udHJ1bmNhdGVQYXRoKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIvcGF0aC90by9zb21lamFyLmphciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyNWI2OTI0ZjViMGUxOTQ4NmQwZmY4ODQ0OGU5OTlkNSIsIG1vam8udHJ1bmNhdGVQYXRoKCJcXHBhdGhcXHRvXFxzb21lamFyLmphciIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc4OTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRMaW5lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIFRlc3RUaHJpZnQgeworCisgICAgcHJpdmF0ZSBGaWxlIHRlc3RSb290RGlyOworICAgIHByaXZhdGUgRmlsZSBpZGxEaXI7CisgICAgcHJpdmF0ZSBGaWxlIGdlbkphdmFEaXI7CisgICAgcHJpdmF0ZSBUaHJpZnQuQnVpbGRlciBidWlsZGVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgICAgICAgdGVzdFJvb3REaXIgPSBuZXcgRmlsZSh0bXBEaXIsICJ0aHJpZnQtdGVzdCIpOworCisgICAgICAgIGlmICh0ZXN0Um9vdERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsZWFuRGlyZWN0b3J5KHRlc3RSb290RGlyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGVzdDogIiArIHRlc3RSb290RGlyLmdldFBhdGgoKSwgdGVzdFJvb3REaXIubWtkaXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZURpciA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGZpbmQgdGVzdCByZXNvdXJjZXMiLCB0ZXN0Um9vdERpci5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIHRocmlmdEV4ZWN1dGFibGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRocmlmdEV4ZWN1dGFibGUiLCAidGhyaWZ0Iik7CisgICAgICAgIGlmICghKG5ldyBGaWxlKHRocmlmdEV4ZWN1dGFibGUpLmV4aXN0cygpKSkgeworICAgICAgICAgICAgdGhyaWZ0RXhlY3V0YWJsZSA9ICJ0aHJpZnQiOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyaWZ0IGNvbXBpbGVyOiAiICsgdGhyaWZ0RXhlY3V0YWJsZSk7CisKKyAgICAgICAgaWRsRGlyID0gbmV3IEZpbGUodGVzdFJlc291cmNlRGlyLCAiaWRsIik7CisgICAgICAgIGdlbkphdmFEaXIgPSBuZXcgRmlsZSh0ZXN0Um9vdERpciwgVGhyaWZ0LkdFTkVSQVRFRF9KQVZBKTsKKyAgICAgICAgYnVpbGRlciA9IG5ldyBUaHJpZnQuQnVpbGRlcih0aHJpZnRFeGVjdXRhYmxlLCB0ZXN0Um9vdERpcik7CisgICAgICAgIGJ1aWxkZXIKKyAgICAgICAgICAgIC5zZXRHZW5lcmF0b3IoImphdmEiKQorICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50KGlkbERpcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0Q29tcGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmlmdENvbXBpbGVXaXRoR2VuZXJhdG9yT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkZXIuc2V0R2VuZXJhdG9yKCJqYXZhOnByaXZhdGUtbWVtYmVycyIpOworICAgICAgICBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVGhyaWZ0Q29tcGlsZSgpIHRocm93cyBDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSA9IG5ldyBGaWxlKGlkbERpciwgInNoYXJlZC50aHJpZnQiKTsKKworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisKKyAgICAgICAgZmluYWwgVGhyaWZ0IHRocmlmdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIG5vdCBmb3VuZDogc2hhcmVkLnRocmlmdCIsIHRocmlmdEZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHNob3VsZCBub3QgZXhpc3QiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKworICAgICAgICAvLyBleGVjdXRlIHRoZSBjb21waWxlCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0KTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHdhcyBub3QgcmVtb3ZlZCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZW5lcmF0ZWQgamF2YSBjb2RlIGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzaGFyZWQvU2hhcmVkU2VydmljZS5qYXZhIikuZXhpc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmlmdE11bHRpcGxlRmlsZUNvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSBzaGFyZWRUaHJpZnQgPSBuZXcgRmlsZShpZGxEaXIsICJzaGFyZWQudGhyaWZ0Iik7CisgICAgICAgIGZpbmFsIEZpbGUgdHV0b3JpYWxUaHJpZnQgPSBuZXcgRmlsZShpZGxEaXIsICJ0dXRvcmlhbC50aHJpZnQiKTsKKworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUoc2hhcmVkVGhyaWZ0KTsKKyAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHR1dG9yaWFsVGhyaWZ0KTsKKworICAgICAgICBmaW5hbCBUaHJpZnQgdGhyaWZ0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgbm90IGZvdW5kOiBzaGFyZWQudGhyaWZ0Iiwgc2hhcmVkVGhyaWZ0LmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSBzaG91bGQgbm90IGV4aXN0IiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tcGlsZQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSB3YXMgbm90IHJlbW92ZWQiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2VuZXJhdGVkIGphdmEgY29kZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAic2hhcmVkL1NoYXJlZFNlcnZpY2UuamF2YSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2VuZXJhdGVkIGphdmEgY29kZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAidHV0b3JpYWwvSW52YWxpZE9wZXJhdGlvbi5qYXZhIikuZXhpc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZENvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRGaWxlID0gbmV3IEZpbGUodGVzdFJvb3REaXIsICJtaXNzaW5nLnRocmlmdCIpOworICAgICAgICBidWlsZGVyLmFkZFRocmlmdFBhdGhFbGVtZW50KHRlc3RSb290RGlyKTsKKworICAgICAgICAvLyBIYWNraW5nIGFyb3VuZCBjaGVja3MgaW4gYWRkVGhyaWZ0IGZpbGUuCisgICAgICAgIGFzc2VydFRydWUodGhyaWZ0RmlsZS5jcmVhdGVOZXdGaWxlKCkpOworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisgICAgICAgIGFzc2VydFRydWUodGhyaWZ0RmlsZS5kZWxldGUoKSk7CisKKyAgICAgICAgZmluYWwgVGhyaWZ0IHRocmlmdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCF0aHJpZnRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSBzaG91bGQgbm90IGV4aXN0IiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tcGlsZQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUluUGF0aFByZUNvbmRpdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdEZpbGUgPSBuZXcgRmlsZSh0ZXN0Um9vdERpciwgIm1pc3NpbmcudGhyaWZ0Iik7CisKKyAgICAgICAgLy8gSGFja2luZyBhcm91bmQgY2hlY2tzIGluIGFkZFRocmlmdCBmaWxlLgorICAgICAgICBhc3NlcnRUcnVlKHRocmlmdEZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodGVzdFJvb3REaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeSh0ZXN0Um9vdERpcik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZGVsZXRlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRlc3Q6ICIgKyB0ZXN0Um9vdERpci5nZXRQYXRoKCksIHRlc3RSb290RGlyLmRlbGV0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3NoYXJlZC50aHJpZnQgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC9zaGFyZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NWU3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC9zaGFyZWQudGhyaWZ0CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaGlzIFRocmlmdCBmaWxlIGNhbiBiZSBpbmNsdWRlZCBieSBvdGhlciBUaHJpZnQgZmlsZXMgdGhhdCB3YW50IHRvIHNoYXJlCisgKiB0aGVzZSBkZWZpbml0aW9ucy4KKyAqLworCituYW1lc3BhY2UgY3BwIHNoYXJlZAorbmFtZXNwYWNlIGphdmEgc2hhcmVkCituYW1lc3BhY2UgcGVybCBzaGFyZWQKKworc3RydWN0IFNoYXJlZFN0cnVjdCB7CisgIDE6IGkzMiBrZXkKKyAgMjogc3RyaW5nIHZhbHVlCit9CisKK3NlcnZpY2UgU2hhcmVkU2VydmljZSB7CisgIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoMTogaTMyIGtleSkKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3R1dG9yaWFsLnRocmlmdCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3R1dG9yaWFsLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmU0MzNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvdHV0b3JpYWwudGhyaWZ0CkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyMgVGhyaWZ0IFR1dG9yaWFsCisjIE1hcmsgU2xlZSAobWNzbGVlQGZhY2Vib29rLmNvbSkKKyMKKyMgVGhpcyBmaWxlIGFpbXMgdG8gdGVhY2ggeW91IGhvdyB0byB1c2UgVGhyaWZ0LCBpbiBhIC50aHJpZnQgZmlsZS4gTmVhdG8uIFRoZQorIyBmaXJzdCB0aGluZyB0byBub3RpY2UgaXMgdGhhdCAudGhyaWZ0IGZpbGVzIHN1cHBvcnQgc3RhbmRhcmQgc2hlbGwgY29tbWVudHMuCisjIFRoaXMgbGV0cyB5b3UgbWFrZSB5b3VyIHRocmlmdCBmaWxlIGV4ZWN1dGFibGUgYW5kIGluY2x1ZGUgeW91ciBUaHJpZnQgYnVpbGQKKyMgc3RlcCBvbiB0aGUgdG9wIGxpbmUuIEFuZCB5b3UgY2FuIHBsYWNlIGNvbW1lbnRzIGxpa2UgdGhpcyBhbnl3aGVyZSB5b3UgbGlrZS4KKyMKKyMgQmVmb3JlIHJ1bm5pbmcgdGhpcyBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgaW5zdGFsbGVkIHRoZSB0aHJpZnQgY29tcGlsZXIKKyMgaW50byAvdXNyL2xvY2FsL2Jpbi4KKworLyoqCisgKiBUaGUgZmlyc3QgdGhpbmcgdG8ga25vdyBhYm91dCBhcmUgdHlwZXMuIFRoZSBhdmFpbGFibGUgdHlwZXMgaW4gVGhyaWZ0IGFyZToKKyAqCisgKiAgYm9vbCAgICAgICAgQm9vbGVhbiwgb25lIGJ5dGUKKyAqICBieXRlICAgICAgICBTaWduZWQgYnl0ZQorICogIGkxNiAgICAgICAgIFNpZ25lZCAxNi1iaXQgaW50ZWdlcgorICogIGkzMiAgICAgICAgIFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogIGk2NCAgICAgICAgIFNpZ25lZCA2NC1iaXQgaW50ZWdlcgorICogIGRvdWJsZSAgICAgIDY0LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorICogIHN0cmluZyAgICAgIFN0cmluZworICogIGJpbmFyeSAgICAgIEJsb2IgKGJ5dGUgYXJyYXkpCisgKiAgbWFwPHQxLHQyPiAgTWFwIGZyb20gb25lIHR5cGUgdG8gYW5vdGhlcgorICogIGxpc3Q8dDE+ICAgIE9yZGVyZWQgbGlzdCBvZiBvbmUgdHlwZQorICogIHNldDx0MT4gICAgIFNldCBvZiB1bmlxdWUgZWxlbWVudHMgb2Ygb25lIHR5cGUKKyAqCisgKiBEaWQgeW91IGFsc28gbm90aWNlIHRoYXQgVGhyaWZ0IHN1cHBvcnRzIEMgc3R5bGUgY29tbWVudHM/CisgKi8KKworLy8gSnVzdCBpbiBjYXNlIHlvdSB3ZXJlIHdvbmRlcmluZy4uLiB5ZXMuIFdlIHN1cHBvcnQgc2ltcGxlIEMgY29tbWVudHMgdG9vLgorCisvKioKKyAqIFRocmlmdCBmaWxlcyBjYW4gcmVmZXJlbmNlIG90aGVyIFRocmlmdCBmaWxlcyB0byBpbmNsdWRlIGNvbW1vbiBzdHJ1Y3QKKyAqIGFuZCBzZXJ2aWNlIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgZm91bmQgdXNpbmcgdGhlIGN1cnJlbnQgcGF0aCwgb3IgYnkKKyAqIHNlYXJjaGluZyByZWxhdGl2ZSB0byBhbnkgcGF0aHMgc3BlY2lmaWVkIHdpdGggdGhlIC1JIGNvbXBpbGVyIGZsYWcuCisgKgorICogSW5jbHVkZWQgb2JqZWN0cyBhcmUgYWNjZXNzZWQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIC50aHJpZnQgZmlsZSBhcyBhCisgKiBwcmVmaXguIGkuZS4gc2hhcmVkLlNoYXJlZE9iamVjdAorICovCitpbmNsdWRlICJzaGFyZWQudGhyaWZ0IgorCisvKioKKyAqIFRocmlmdCBmaWxlcyBjYW4gbmFtZXNwYWNlLCBwYWNrYWdlLCBvciBwcmVmaXggdGhlaXIgb3V0cHV0IGluIHZhcmlvdXMKKyAqIHRhcmdldCBsYW5ndWFnZXMuCisgKi8KK25hbWVzcGFjZSBjcHAgdHV0b3JpYWwKK25hbWVzcGFjZSBqYXZhIHR1dG9yaWFsCituYW1lc3BhY2UgcGhwIHR1dG9yaWFsCituYW1lc3BhY2UgcGVybCB0dXRvcmlhbAorbmFtZXNwYWNlIHNtYWxsdGFsay5jYXRlZ29yeSBUaHJpZnQuVHV0b3JpYWwKKworLyoqCisgKiBUaHJpZnQgbGV0cyB5b3UgZG8gdHlwZWRlZnMgdG8gZ2V0IHByZXR0eSBuYW1lcyBmb3IgeW91ciB0eXBlcy4gU3RhbmRhcmQKKyAqIEMgc3R5bGUgaGVyZS4KKyAqLwordHlwZWRlZiBpMzIgTXlJbnRlZ2VyCisKKy8qKgorICogVGhyaWZ0IGFsc28gbGV0cyB5b3UgZGVmaW5lIGNvbnN0YW50cyBmb3IgdXNlIGFjcm9zcyBsYW5ndWFnZXMuIENvbXBsZXgKKyAqIHR5cGVzIGFuZCBzdHJ1Y3RzIGFyZSBzcGVjaWZpZWQgdXNpbmcgSlNPTiBub3RhdGlvbi4KKyAqLworY29uc3QgaTMyIElOVDMyQ09OU1RBTlQgPSA5ODUzCitjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gTUFQQ09OU1RBTlQgPSB7J2hlbGxvJzond29ybGQnLCAnZ29vZG5pZ2h0JzonbW9vbid9CisKKy8qKgorICogWW91IGNhbiBkZWZpbmUgZW51bXMsIHdoaWNoIGFyZSBqdXN0IDMyIGJpdCBpbnRlZ2Vycy4gVmFsdWVzIGFyZSBvcHRpb25hbAorICogYW5kIHN0YXJ0IGF0IDEgaWYgbm90IHN1cHBsaWVkLCBDIHN0eWxlIGFnYWluLgorICovCitlbnVtIE9wZXJhdGlvbiB7CisgIEFERCA9IDEsCisgIFNVQlRSQUNUID0gMiwKKyAgTVVMVElQTFkgPSAzLAorICBESVZJREUgPSA0Cit9CisKKy8qKgorICogU3RydWN0cyBhcmUgdGhlIGJhc2ljIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBjb21wcmlzZWQgb2YgZmllbGRzCisgKiB3aGljaCBlYWNoIGhhdmUgYW4gaW50ZWdlciBpZGVudGlmaWVyLCBhIHR5cGUsIGEgc3ltYm9saWMgbmFtZSwgYW5kIGFuCisgKiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgIm9wdGlvbmFsIiwgd2hpY2ggZW5zdXJlcyB0aGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkCisgKiBpbiB0aGUgc2VyaWFsaXplZCBvdXRwdXQgaWYgdGhleSBhcmVuJ3Qgc2V0LiAgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgc29tZQorICogbWFudWFsIG1hbmFnZW1lbnQgaW4gc29tZSBsYW5ndWFnZXMuCisgKi8KK3N0cnVjdCBXb3JrIHsKKyAgMTogaTMyIG51bTEgPSAwLAorICAyOiBpMzIgbnVtMiwKKyAgMzogT3BlcmF0aW9uIG9wLAorICA0OiBvcHRpb25hbCBzdHJpbmcgY29tbWVudCwKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBhbHNvIGJlIGV4Y2VwdGlvbnMsIGlmIHRoZXkgYXJlIG5hc3R5LgorICovCitleGNlcHRpb24gSW52YWxpZE9wZXJhdGlvbiB7CisgIDE6IGkzMiB3aGF0LAorICAyOiBzdHJpbmcgd2h5Cit9CisKKy8qKgorICogQWhoLCBub3cgb250byB0aGUgY29vbCBwYXJ0LCBkZWZpbmluZyBhIHNlcnZpY2UuIFNlcnZpY2VzIGp1c3QgbmVlZCBhIG5hbWUKKyAqIGFuZCBjYW4gb3B0aW9uYWxseSBpbmhlcml0IGZyb20gYW5vdGhlciBzZXJ2aWNlIHVzaW5nIHRoZSBleHRlbmRzIGtleXdvcmQuCisgKi8KK3NlcnZpY2UgQ2FsY3VsYXRvciBleHRlbmRzIHNoYXJlZC5TaGFyZWRTZXJ2aWNlIHsKKworICAvKioKKyAgICogQSBtZXRob2QgZGVmaW5pdGlvbiBsb29rcyBsaWtlIEMgY29kZS4gSXQgaGFzIGEgcmV0dXJuIHR5cGUsIGFyZ3VtZW50cywKKyAgICogYW5kIG9wdGlvbmFsbHkgYSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCBpdCBtYXkgdGhyb3cuIE5vdGUgdGhhdCBhcmd1bWVudAorICAgKiBsaXN0cyBhbmQgZXhjZXB0aW9uIGxpc3RzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGV4YWN0IHNhbWUgc3ludGF4IGFzCisgICAqIGZpZWxkIGxpc3RzIGluIHN0cnVjdCBvciBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICAqLworCisgICB2b2lkIHBpbmcoKSwKKworICAgaTMyIGFkZCgxOmkzMiBudW0xLCAyOmkzMiBudW0yKSwKKworICAgaTMyIGNhbGN1bGF0ZSgxOmkzMiBsb2dpZCwgMjpXb3JrIHcpIHRocm93cyAoMTpJbnZhbGlkT3BlcmF0aW9uIG91Y2gpLAorCisgICAvKioKKyAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIG9uZXdheSBtb2RpZmllci4gVGhhdCBtZWFucyB0aGUgY2xpZW50IG9ubHkgbWFrZXMKKyAgICAqIGEgcmVxdWVzdCBhbmQgZG9lcyBub3QgbGlzdGVuIGZvciBhbnkgcmVzcG9uc2UgYXQgYWxsLiBPbmV3YXkgbWV0aG9kcworICAgICogbXVzdCBiZSB2b2lkLgorICAgICovCisgICBvbmV3YXkgdm9pZCB6aXAoKQorCit9CisKKy8qKgorICogVGhhdCBqdXN0IGFib3V0IGNvdmVycyB0aGUgYmFzaWNzLiBUYWtlIGEgbG9vayBpbiB0aGUgdGVzdC8gZm9sZGVyIGZvciBtb3JlCisgKiBkZXRhaWxlZCBleGFtcGxlcy4gQWZ0ZXIgeW91IHJ1biB0aGlzIGZpbGUsIHlvdXIgZ2VuZXJhdGVkIGNvZGUgc2hvd3MgdXAKKyAqIGluIGZvbGRlcnMgd2l0aCBuYW1lcyBnZW4tPGxhbmd1YWdlPi4gVGhlIGdlbmVyYXRlZCBjb2RlIGlzbid0IHRvbyBzY2FyeQorICogdG8gbG9vayBhdC4gSXQgZXZlbiBoYXMgcHJldHR5IGluZGVudGF0aW9uLgorICovCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC5lbCBiL2NvbnRyaWIvdGhyaWZ0LmVsCmluZGV4IGNkM2UwZTguLjk0MWE5OWYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LmVsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LmVsCkBAIC0xLDQgKzEsNyBAQAotOzsKKzs7OyB0aHJpZnQuZWwgLS0tIE1ham9yIG1vZGUgZm9yIEFwYWNoZSBUaHJpZnQgZmlsZXMKKworOzsgS2V5d29yZHM6IGZpbGVzCisKIDs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIDs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiA7OyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTcsOSArMjAsMTYgQEAKIDs7IHVuZGVyIHRoZSBMaWNlbnNlLgogOzsKIAorOzs7IENvbW1lbnRhcnk6CisKKzs7CisKKzs7OyBDb2RlOgorCiAocmVxdWlyZSAnZm9udC1sb2NrKQogCiAoZGVmdmFyIHRocmlmdC1tb2RlLWhvb2sgbmlsKQorOzs7IyMjYXV0b2xvYWQKIChhZGQtdG8tbGlzdCAnYXV0by1tb2RlLWFsaXN0ICcoIlxcLnRocmlmdFxcJyIgLiB0aHJpZnQtbW9kZSkpCiAKIChkZWZ2YXIgdGhyaWZ0LWluZGVudC1sZXZlbCAyCkBAIC0yOCwxMyArMzgsMTIgQEAKIDs7IHN5bnRheCBjb2xvcmluZwogKGRlZmNvbnN0IHRocmlmdC1mb250LWxvY2sta2V5d29yZHMKICAgKGxpc3QKLSAgICcoIiMuKiQiIC4gZm9udC1sb2NrLWNvbW1lbnQtZmFjZSkgIDs7IHBlcmwgc3R5bGUgY29tbWVudHMKICAgICcoIlxcPFxcKGluY2x1ZGVcXHxzdHJ1Y3RcXHxleGNlcHRpb25cXHx0eXBlZGVmXFx8Y29uc3RcXHxlbnVtXFx8c2VydmljZVxcfGV4dGVuZHNcXHx2b2lkXFx8b25ld2F5XFx8dGhyb3dzXFx8b3B0aW9uYWxcXHxyZXF1aXJlZFxcKVxcPiIgLiBmb250LWxvY2sta2V5d29yZC1mYWNlKSAgOzsga2V5d29yZHMKICAgICcoIlxcPFxcKGJvb2xcXHxieXRlXFx8aTE2XFx8aTMyXFx8aTY0XFx8ZG91YmxlXFx8c3RyaW5nXFx8YmluYXJ5XFx8bWFwXFx8bGlzdFxcfHNldFxcKVxcPiIgLiBmb250LWxvY2stdHlwZS1mYWNlKSAgOzsgYnVpbHQtaW4gdHlwZXMKICAgICcoIlxcPFxcKFswLTldK1xcKVxcPiIgLiBmb250LWxvY2stdmFyaWFibGUtbmFtZS1mYWNlKSAgIDs7IG9yZGluYWxzCiAgICAnKCJcXDxcXChcXHcrXFwpXFxzLSooIiAoMSBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkgIDs7IGZ1bmN0aW9ucwogICAgKQotICAiVGhyaWZ0IEtleXdvcmRzIikKKyAgIlRocmlmdCBLZXl3b3Jkcy4iKQogCiA7OyBpbmRlbnRhdGlvbgogKGRlZnVuIHRocmlmdC1pbmRlbnQtbGluZSAoKQpAQCAtMTAyLDE4ICsxMTEsMjAgQEAKICAgICAgICAgICAoaW5kZW50LWxpbmUtdG8gY3VyLWluZGVudCkKICAgICAgICAgKGluZGVudC1saW5lLXRvIDApKSkpKQogCi07OyBDL0MrKyBjb21tZW50czsgYWxzbyBhbGxvd2luZyB1bmRlcnNjb3JlIGluIHdvcmRzCis7OyBDL0MrKy0gYW5kIHNoLXN0eWxlIGNvbW1lbnRzOyBhbHNvIGFsbG93aW5nIHVuZGVyc2NvcmUgaW4gd29yZHMKIChkZWZ2YXIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlCiAgIChsZXQgKCh0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUgKG1ha2Utc3ludGF4LXRhYmxlKSkpCiAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP18gInciIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKLSAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/LyAiLiAxNDU2IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCi0gICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyogIi4gMjMiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKLSAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XG4gIj4gYiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQorICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8jICI8IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpIDsgc2gtc3R5bGUgY29tbWVudHMKKyAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/LyAiLiAxMjQiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkgOyBjL2MrKy1zdHlsZSBjb21tZW50cworICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8qICIuIDIzYiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQorICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cbiAiPiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQogICAgIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKICAgIlN5bnRheCB0YWJsZSBmb3IgdGhyaWZ0LW1vZGUiKQogCis7OzsjIyNhdXRvbG9hZAogKGRlZnVuIHRocmlmdC1tb2RlICgpCi0gICJNb2RlIGZvciBlZGl0aW5nIFRocmlmdCBmaWxlcyIKKyAgIk1vZGUgZm9yIGVkaXRpbmcgVGhyaWZ0IGZpbGVzLiIKICAgKGludGVyYWN0aXZlKQogICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQogICAoc2V0LXN5bnRheC10YWJsZSB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCkBAIC0xMjMsNCArMTM0LDcgQEAKICAgKHJ1bi1ob29rcyAndGhyaWZ0LW1vZGUtaG9vaykKICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnaW5kZW50LWxpbmUtZnVuY3Rpb24pICd0aHJpZnQtaW5kZW50LWxpbmUpCiAgICkKLShwcm92aWRlICd0aHJpZnQtbW9kZSkKKworKHByb3ZpZGUgJ3RocmlmdCkKKzs7OyB0aHJpZnQuZWwgZW5kcyBoZXJlCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnNwZWMgYi9jb250cmliL3RocmlmdC5zcGVjCmluZGV4IGVjZWU2MzEuLmJlNTI2ZTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LnNwZWMKKysrIGIvY29udHJpYi90aHJpZnQuc3BlYwpAQCAtMTcsMzggKzE3LDM5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIFRPRE8oZHJlaXNzKTogSGF2ZSBhIFB5dGhvbiBidWlsZCB3aXRoIGFuZCB3aXRob3V0IHRoZSBleHRlbnNpb24uCislZGVmaW5lIHdpdGhvdXRfamF2YSAxCislZGVmaW5lIHdpdGhvdXRfcHl0aG9uIDEKKyVkZWZpbmUgd2l0aG91dF90ZXN0cyAxCisKICV7IT9weXRob25fc2l0ZWxpYjogJWRlZmluZSBweXRob25fc2l0ZWxpYiAlKCV7X19weXRob259IC1jICJmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliOyBwcmludCBnZXRfcHl0aG9uX2xpYigpIil9CiAleyE/cHl0aG9uX3NpdGVhcmNoOiAlZGVmaW5lIHB5dGhvbl9zaXRlYXJjaCAlKCV7X19weXRob259IC1jICJmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliOyBwcmludCBnZXRfcHl0aG9uX2xpYigxKSIpfQotIyBUT0RPKGRyZWlzcyk6IFdoZXJlIGlzIHRoaXMgc3VwcG9zZWQgdG8gZ28/Ci0leyE/dGhyaWZ0X2VybGFuZ19yb290OiAlZGVmaW5lIHRocmlmdF9lcmxhbmdfcm9vdCAvb3B0L3RocmlmdC1lcmx9CiAKIE5hbWU6ICAgICAgICAgICB0aHJpZnQKIExpY2Vuc2U6ICAgICAgICBBcGFjaGUgTGljZW5zZSB2Mi4wCiBHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQKIFN1bW1hcnk6ICAgICAgICBSUEMgYW5kIHNlcmlhbGl6YXRpb24gZnJhbWV3b3JrCi1WZXJzaW9uOiAgICAgICAgMjAwODA1Mjlzdm4KLUVwb2NoOiAgICAgICAgICAxCi1SZWxlYXNlOiAgICAgICAgMQotVVJMOiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQKLVBhY2thZ2VyOiAgICAgICBEYXZpZCBSZWlzcyA8ZHJlaXNzQGZhY2Vib29rLmNvbT4KK1ZlcnNpb246ICAgICAgICAxLjAuMAorUmVsZWFzZTogICAgICAgIDAKK1VSTDogICAgICAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK1BhY2thZ2VyOiAgICAgICBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgogU291cmNlMDogICAgICAgICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuZ3oKIAogQnVpbGRSZXF1aXJlczogIGdjYyA+PSAzLjQuNgogQnVpbGRSZXF1aXJlczogIGdjYy1jKysKIAotIyBUT0RPKGRyZWlzcyk6IENhbiB0aGVzZSBiZSBtb3ZlZCBpbnRvIHRoZSBpbmRpdmlkdWFsIHBhY2thZ2VzPwotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KIEJ1aWxkUmVxdWlyZXM6ICBqYXZhLWRldmVsID49IDA6MS41LjAKIEJ1aWxkUmVxdWlyZXM6ICBhbnQgPj0gMDoxLjYuNQogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9weXRob246IDF9CislaWYgMCV7IT93aXRob3V0X3B5dGhvbjoxfQogQnVpbGRSZXF1aXJlczogIHB5dGhvbi1kZXZlbAogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci1CdWlsZFJlcXVpcmVzOiAgZXJsYW5nCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KKyVkZWZpbmUgZ2VtX25hbWUgJXtuYW1lfQorQnVpbGRSZXF1aXJlczogIHJ1YnktZGV2ZWwKK0J1aWxkUmVxdWlyZXM6ICBydWJ5Z2Vtcy1kZXZlbAogJWVuZGlmCiAKIEJ1aWxkUm9vdDogICAgICAle190bXBwYXRofS8le25hbWV9LSV7dmVyc2lvbn0tJXtyZWxlYXNlfS1yb290LSUoJXtfX2lkX3V9IC1uKQpAQCAtNzUsNiArNzYsNyBAQAogJWZpbGVzIGxpYi1jcHAKICVkZWZhdHRyKC0scm9vdCxyb290KQogJXtfbGliZGlyfS9saWJ0aHJpZnQqLnNvLioKKyV7X2xpYmRpcn0vbGlidGhyaWZ0Ki5zbwogCiAKICVwYWNrYWdlIGxpYi1jcHAtZGV2ZWwKQEAgLTgyLDEwICs4NCwxMCBAQAogR3JvdXA6ICAgICBMaWJyYXJpZXMKIFJlcXVpcmVzOiAgJXtuYW1lfSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfQogUmVxdWlyZXM6ICBib29zdC1kZXZlbAotJWlmICV7IT93aXRob3V0X2xpYmV2ZW50OiAxfQorJWlmIDAleyE/d2l0aG91dF9saWJldmVudDoxfQogUmVxdWlyZXM6ICBsaWJldmVudC1kZXZlbCA+PSAxLjIKICVlbmRpZgotJWlmICV7IT93aXRob3V0X3psaWI6IDF9CislaWYgMCV7IT93aXRob3V0X3psaWI6MX0KIFJlcXVpcmVzOiAgemxpYi1kZXZlbAogJWVuZGlmCiAKQEAgLTk2LDExICs5OCwxMCBAQAogJWRlZmF0dHIoLSxyb290LHJvb3QpCiAle19pbmNsdWRlZGlyfS90aHJpZnQvCiAle19saWJkaXJ9L2xpYnRocmlmdCouKmEKLSV7X2xpYmRpcn0vbGlidGhyaWZ0Ki5zbwogJXtfbGliZGlyfS9wa2djb25maWcvdGhyaWZ0Ki5wYwogCiAKLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiAlcGFja2FnZSBsaWItamF2YQogU3VtbWFyeTogICBUaHJpZnQgSmF2YSBsaWJyYXJ5CiBHcm91cDogICAgIExpYnJhcmllcwpAQCAtMTE1LDcgKzExNiw3IEBACiAlZW5kaWYKIAogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KICVwYWNrYWdlIGxpYi1weXRob24KIFN1bW1hcnk6IFRocmlmdCBQeXRob24gbGlicmFyeQogR3JvdXA6ICAgTGlicmFyaWVzCkBAIC0xMjksMTggKzEzMCwzMiBAQAogJWVuZGlmCiAKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLSVwYWNrYWdlIGxpYi1lcmxhbmcKLVN1bW1hcnk6ICBUaHJpZnQgUHl0aG9uIGxpYnJhcnkKLUdyb3VwOiAgICBMaWJyYXJpZXMKLVJlcXVpcmVzOiBlcmxhbmcKKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorJXBhY2thZ2UgLW4gcnVieWdlbS0le2dlbV9uYW1lfQorU3VtbWFyeTogVGhyaWZ0IFJ1YnkgbGlicmFyeQorR3JvdXA6ICAgTGlicmFyaWVzCitPYnNvbGV0ZXM6ICV7bmFtZX0tbGliLXJ1YnkKIAotJWRlc2NyaXB0aW9uIGxpYi1lcmxhbmcKLUVybGFuZyBsaWJyYXJpZXMgZm9yIFRocmlmdC4KKyVkZXNjcmlwdGlvbiAtbiBydWJ5Z2VtLSV7Z2VtX25hbWV9CitSdWJ5IGxpYnJhcmllcyBmb3IgVGhyaWZ0LgogCi0lZmlsZXMgbGliLWVybGFuZworJWZpbGVzIC1uIHJ1YnlnZW0tJXtnZW1fbmFtZX0KICVkZWZhdHRyKC0scm9vdCxyb290KQotJXt0aHJpZnRfZXJsYW5nX3Jvb3R9Cisle2dlbV9kaXJ9LyoKKyVlbmRpZgorCisKKyVpZiAwJXshP3dpdGhvdXRfcGhwOjF9CislcGFja2FnZSBsaWItcGhwCitTdW1tYXJ5OiBUaHJpZnQgUEhQIGxpYnJhcnkKK0dyb3VwOiAgIExpYnJhcmllcworCislZGVzY3JpcHRpb24gbGliLXBocAorUEhQIGxpYnJhcmllcyBmb3IgVGhyaWZ0LgorCislZmlsZXMgbGliLXBocAorJWRlZmF0dHIoLSxyb290LHJvb3QpCisvdXNyL2xpYi9waHAvKgogJWVuZGlmCiAKIApAQCAtMTQ4LDU5ICsxNjMsODkgQEAKICVzZXR1cCAtcQogCiAlYnVpbGQKLSMgVE9ETyhkcmVpc3MpOiBJbXBsZW1lbnQgYSBzaW5nbGUgLS13aXRob3V0LWJ1aWxkLWtsdWRnZXMuCitbWyAtZSBNYWtlZmlsZS5pbiBdXSB8fCAuL2Jvb3RzdHJhcC5zaAorZXhwb3J0IEdFTV9IT01FPSR7UFdEfS8uZ2VtLWhvbWUKK2V4cG9ydCBSVUJZTElCPSR7UFdEfS9saWIvcmIvbGliCiAlY29uZmlndXJlIFwKICAgJXs/d2l0aG91dF9saWJldmVudDogLS13aXRob3V0LWxpYmV2ZW50IH0gXAogICAlez93aXRob3V0X3psaWI6ICAgICAtLXdpdGhvdXQtemxpYiAgICAgfSBcCi0gIC0td2l0aG91dC1qYXZhIFwKKyAgJXs/d2l0aG91dF90ZXN0czogICAgLS13aXRob3V0LXRlc3RzICAgIH0gXAorICAlez93aXRob3V0X2phdmE6ICAgICAtLXdpdGhvdXQtamF2YSAgICAgfSBcCisgICV7P3dpdGhvdXRfcHl0aG9uOiAgIC0td2l0aG91dC1weXRob24gICB9IFwKKyAgJXs/d2l0aG91dF9ydWJ5OiAgICAgLS13aXRob3V0LXJ1YnkgICAgIH0gXAorICAlez93aXRob3V0X3BocDogICAgICAtLXdpdGhvdXQtcGhwICAgICAgfSBcCisgICV7IT93aXRob3V0X3BocDogICAgIFBIUF9QUkVGSVg9JHtSUE1fQlVJTERfUk9PVH0vdXNyL2xpYi9waHAgfSBcCiAgIC0td2l0aG91dC1jc2hhcnAgXAotICAtLXdpdGhvdXQtcHkgXAogICAtLXdpdGhvdXQtZXJsYW5nIFwKIAotbWFrZQorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CitldmFsICQoZ3JlcCAiXldJVEhfUlVCWV9UUlVFIiBjb25maWcubG9nKQoraWYgW1sgIiR7V0lUSF9SVUJZX1RSVUV9IiAhPSAiIiBdXTsgdGhlbgorICBzZXQgK3gKKyAgZWNobyAiIgorICBlY2hvICJjb25maWd1cmUgZGV0ZXJtaW5lZCB0aGF0IHJ1YnkgcmVxdWlyZW1lbnRzIGFyZSBtaXNzaW5nIChidW5kbGVyIGdlbT8pLCBlaXRoZXIgaW5zdGFsbCBtaXNzaW5nIGNvbXBvbmVudHMiID4mMgorICBlY2hvICJvciBkaXNhYmxlIHRoZSBydWJ5IHN1Yi1wYWNrYWdlcyBhcyBmb2xsb3dzOiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIgICAgIHJwbWJ1aWxkIC1EJyV3aXRob3V0X3J1YnkgMScgLi4uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIiCisgIGV4aXQgMQorZmkKKyVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfamF2YTogMX0KK21ha2UgJXs/X3NtcF9tZmxhZ3N9CisKKyVpZiAwJXshP3dpdGhvdXRfamF2YToxfQogY2QgbGliL2phdmEKICVhbnQKIGNkIC4uLy4uCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiBjZCBsaWIvcHkKIENGTEFHUz0iJXtvcHRmbGFnc30iICV7X19weXRob259IHNldHVwLnB5IGJ1aWxkCiBjZCAuLi8uLgogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci1jZCBsaWIvZXJsCi1tYWtlCi1jZCAuLi8uLgorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CislZ2VtX2luc3RhbGwgLW4gbGliL3JiL3RocmlmdCouZ2VtCiAlZW5kaWYKIAogJWluc3RhbGwKK2V4cG9ydCBHRU1fSE9NRT0ke1BXRH0vLmdlbS1ob21lCitleHBvcnQgUlVCWUxJQj0ke1BXRH0vbGliL3JiL2xpYgogJW1ha2VpbnN0YWxsCitsbiAtcyBsaWJ0aHJpZnQtJXt2ZXJzaW9ufS5zbyAke1JQTV9CVUlMRF9ST09UfSV7X2xpYmRpcn0vbGlidGhyaWZ0LnNvLjAKK2xuIC1zIGxpYnRocmlmdG5iLSV7dmVyc2lvbn0uc28gJHtSUE1fQlVJTERfUk9PVH0le19saWJkaXJ9L2xpYnRocmlmdG5iLnNvLjAKK2xuIC1zIGxpYnRocmlmdHotJXt2ZXJzaW9ufS5zbyAke1JQTV9CVUlMRF9ST09UfSV7X2xpYmRpcn0vbGlidGhyaWZ0ei5zby4wCiAKLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiBta2RpciAtcCAkUlBNX0JVSUxEX1JPT1Qle19qYXZhZGlyfQotY3AgLXAgbGliL2phdmEvKi5qYXIgJFJQTV9CVUlMRF9ST09UJXtfamF2YWRpcn0KK2NwIC1wIGxpYi9qYXZhL2J1aWxkLyouamFyICRSUE1fQlVJTERfUk9PVCV7X2phdmFkaXJ9CiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiBjZCBsaWIvcHkKICV7X19weXRob259IHNldHVwLnB5IGluc3RhbGwgLU8xIC0tc2tpcC1idWlsZCAtLXJvb3QgJFJQTV9CVUlMRF9ST09UCiBjZCAuLi8uLgogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci1ta2RpciAtcCAke1JQTV9CVUlMRF9ST09UfSV7dGhyaWZ0X2VybGFuZ19yb290fQotY3AgLXIgbGliL2VybC9lYmluICR7UlBNX0JVSUxEX1JPT1R9JXt0aHJpZnRfZXJsYW5nX3Jvb3R9CislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KK21rZGlyIC1wICV7YnVpbGRyb290fSV7Z2VtX2Rpcn0KK2NwIC1hIC4vJXtnZW1fZGlyfS8qICV7YnVpbGRyb290fSV7Z2VtX2Rpcn0vCiAlZW5kaWYKIAotCiAlY2xlYW4KIHJtIC1yZiAke1JQTV9CVUlMRF9ST09UfQogCiAKKyVwb3N0Cit1bWFzayAwMDcKKy9zYmluL2xkY29uZmlnID4gL2Rldi9udWxsIDI+JjEKKworCislcG9zdHVuCit1bWFzayAwMDcKKy9zYmluL2xkY29uZmlnID4gL2Rldi9udWxsIDI+JjEKKwogJWNoYW5nZWxvZwotKiBXZWQgTWF5IDI4IDIwMDggRGF2aWQgUmVpc3MgPGRyZWlzc0BmYWNlYm9vay5jb20+IC0gMjAwODA1Mjlzdm4KLS0gSW5pdGlhbCBidWlsZCwgYmFzZWQgb24gdGhlIHdvcmsgb2YgS2V2aW4gU21pdGggYW5kIEJlbiBNYXVyZXIuCisqIFdlZCBPY3QgMTAgMjAxMiBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IAorLSBUaHJpZnQgMC45LjAgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnZpbSBiL2NvbnRyaWIvdGhyaWZ0LnZpbQppbmRleCA3OWNlNTQ3Li42MjMxOTU1IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC52aW0KKysrIGIvY29udHJpYi90aHJpZnQudmltCkBAIC01MSw4ICs1MSw4IEBACiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIG5hbWVzcGFjZQogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCB4c2RfYWxsIHhzZF9vcHRpb25hbCB4c2RfbmlsbGFibGUgeHNkX2F0dHJzCiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIGluY2x1ZGUgY3BwX2luY2x1ZGUgY3BwX3R5cGUgY29uc3Qgb3B0aW9uYWwgcmVxdWlyZWQKLXN5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKLXN5biBrZXl3b3JkIHRocmlmdFN0cnVjdHVyZSBtYXAgbGlzdCBzZXQgc3RydWN0IHR5cGVkZWYgZXhjZXB0aW9uIGVudW0gdGhyb3dzCitzeW4ga2V5d29yZCB0aHJpZnRCYXNpY1R5cGVzIHZvaWQgYm9vbCBieXRlIGk4IGkxNiBpMzIgaTY0IGRvdWJsZSBzdHJpbmcgYmluYXJ5CitzeW4ga2V5d29yZCB0aHJpZnRTdHJ1Y3R1cmUgbWFwIGxpc3Qgc2V0IHN0cnVjdCB0eXBlZGVmIGV4Y2VwdGlvbiBlbnVtIHRocm93cyB1bmlvbgogCiAiIFNwZWNpYWwKIHN5biBtYXRjaCB0aHJpZnRTcGVjaWFsICJcZFwrOiIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0X2R1bXAuY3BwIGIvY29udHJpYi90aHJpZnRfZHVtcC5jcHAKaW5kZXggMGRkZmNlYy4uNTljOGFjOCAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnRfZHVtcC5jcHAKKysrIGIvY29udHJpYi90aHJpZnRfZHVtcC5jcHAKQEAgLTIwLDExICsyMCwxMSBAQAogI2luY2x1ZGUgPGNzdGRsaWI+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2xUYXAuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvTWFrZWZpbGUgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllMDNiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1IEBACitUSFJJRlRfRElSID0uLi8uLgorSU5DU19ESVJTICA9LUkke1RIUklGVF9ESVJ9L2xpYi9jcHAvc3JjIC1JLgorVEhSSUZUX0xJQiA9JHtUSFJJRlRfRElSfS9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hCitCT09TVF9MSUIgID0KK0NQUF9ERUZTICAgPQorQ1BQX09QVFMgICA9LVdhbGwgLU8yCisKK0dFTl9TUkMgICAgPSBnZW4tY3BwL1NhbXBsZVNlcnZpY2UuY3BwICBcCisgICAgICAgICAgICAgZ2VuLWNwcC9TYW1wbGVfdHlwZXMuY3BwICAgXAorICAgICAgICAgICAgIGdlbi1jcHAvU2FtcGxlQ2FsbGJhY2suY3BwIFwKKyAgICAgICAgICAgICBnZW4tY3BwL1NhbXBsZV9jb25zdGFudHMuY3BwCitHRU5fSU5DICAgID0gLUlnZW4tY3BwCisKK2RlZmF1bHQ6IHNlcnZlciBjbGllbnQKKy5QSE9OWTogc2VydmVyIGNsaWVudAorCitzZXJ2ZXI6CisJZysrICR7Q1BQX09QVFN9ICR7Q1BQX0RFRlN9IC1vIHNlcnZlci9zZXJ2ZXIgJHtHRU5fSU5DfSAke0lOQ1NfRElSU30gc2VydmVyL3NlcnZlci5jcHAgJHtHRU5fU1JDfSAke1RIUklGVF9MSUJ9ICR7Qk9PU1RfTElCfQorCitjbGllbnQ6CisJZysrICR7Q1BQX09QVFN9ICR7Q1BQX0RFRlN9IC1vIGNsaWVudC9jbGllbnQgJHtHRU5fSU5DfSAke0lOQ1NfRElSU30gY2xpZW50L2NsaWVudC5jcHAgJHtHRU5fU1JDfSAke1RIUklGVF9MSUJ9ICR7Qk9PU1RfTElCfQorCitjbGVhbjoKKwkkKFJNKSAtciBjbGllbnQvY2xpZW50IHNlcnZlci9zZXJ2ZXIKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1JFQURNRS5tZCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkZmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9SRUFETUUubWQKQEAgLTAsMCArMSw2MSBAQAorVGhyaWZ0IHRyYW5zcG9ydCBzYW1wbGUgcHJvamVjdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGNyb3NzLXBsYXRmb3JtIHByb2plY3QgaGFzIGJlZW4gYnVpbHQgd2l0aCBXaW5kb3dzIFZpc3VhbCBTdHVkaW8gMTAgYW5kIAorT1NYIDEwLjcuMSdzIGcrKy4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IHNvY2tldCBhbmQgcGlwZSB0cmFuc3BvcnRzIAordGhyb3VnaCBjb21tYW5kLWxpbmUgc3dpdGNoZXMuCisKK1dpbmRvd3Mgc3VwcG9ydHMgYm90aCBuYW1lZCAmIGFub255bW91cyBwaXBlczsgKk5JWCBnZXRzIG9ubHkgbmFtZWQgCisncGlwZXMnIGF0IHRoaXMgdGltZS4KKworV2luZG93cy1vbmx5IGF0IHRoaXMgdGltZToKK1RoZSBjbGllbnQgJiBzZXJ2ZXIgYXJlIGRvdWJsZS1lbmRlZC4gQm90aCBzaWRlcyBydW4gYSBzZXJ2ZXIgYW5kIGNsaWVudCB0byAKK2VuYWJsZSBmdWxsIGR1cGxleCBiaWRpcmVjdGlvbmFsIGV2ZW50IHNpZ25hbGluZy4gVGhleSBhcmUgc2ltcGxlIGNvbW1hbmQgCitsaW5lIGFwcHMuIFRoZSBzZXJ2ZXIgcnVucyB1bnRpbCBpdCdzIGFib3J0ZWQgKEN0bC1DKS4gVGhlIGNsaWVudCBjb25uZWN0cyB0bwordGhlIHNlcnZlciwgaW5mb3JtcyB0aGUgc2VydmVyIG9mIGl0cyBsaXN0ZW5pbmcgcGlwZS9wb3J0LCBydW5zIHNvbWUgbW9yZSBSUENzIAorYW5kIGV4aXRzLiBUaGUgc2VydmVyIGFsc28gbWFrZXMgUlBDIGNhbGxzIHRvIHRoZSBjbGllbnQgdG8gZGVtb25zdHJhdGUgCitiaWRpcmVjdGlvbmFsIG9wZXJhdGlvbi4KKworUHJlcXVpc2l0ZXM6CitCb29zdCAtLSB0ZXN0ZWQgd2l0aCBCb29zdCAxLjQ3LCBvdGhlciB2ZXJzaW9ucyBtYXkgd29yay4KK2xpYnRocmlmdCBsaWJyYXJ5IC0tIGJ1aWxkIHRoZSBsaWJyYXJ5IHVuZGVyICJ0aHJpZnQvbGliL2NwcC8iCit0aHJpZnQgSURMIGNvbXBpbGVyIC0tIGRvd25sb2FkIGZyb20gaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2Rvd25sb2FkLyAKKyAgIG9yIGJ1aWxkIGZyb20gInRocmlmdC9jb21waWxlci9jcHAiLiAgVGhlIElETCBjb21waWxlciB2ZXJzaW9uIHNob3VsZAorICAgbWF0Y2ggdGhlIHRocmlmdCBzb3VyY2UgZGlzdHJpYnV0aW9uJ3MgdmVyc2lvbi4gRm9yIGluc3RhbmNlLCB0aHJpZnQtMC45LjAKKyAgIGhhcyBhIGRpZmZlcmVudCBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYW4gdGhyaWZ0LTAuOC4wIGFuZCB0aGUgZ2VuZXJhdGVkCisgICBmaWxlcyBhcmUgbm90IGNvbXBhdGlibGUuCisKK05vdGU6IEJ1bGRpbmcgdGhlIHRocmlmdCBJREwgY29tcGlsZXIgYW5kIGxpYnJhcnkgYXJlIGJleW9uZCB0aGUgc2NvcGUKK29mIHRoaXMgYXJ0aWNsZS4gUGxlYXNlIHJlZmVyIHRvIHRoZSBUaHJpZnQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgcmVzcGVjdGl2ZQorZGlyZWN0b3JpZXMgYW5kIG9ubGluZS4KKworCitNaWNyb3NvZnQgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8gMTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvcHkgdGhlIElETCBjb21waWxlciAndGhyaWZ0LmV4ZScgdG8gdGhpcyBwcm9qZWN0IGZvbGRlciBvciB0byBhIGxvY2F0aW9uIGluIHRoZSBwYXRoLgorUnVuIHRocmlmdG1lLmJhdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIHNvdXJjZSBmcm9tIHRoZSB0aHJpZnQgZmlsZXMuCisKK09wZW4gdHJhbnNwb3J0LXNhbXBsZS5zbG4gYW5kLi4uCitBZGFwdCB0aGUgQm9vc3QgcGF0aHMgZm9yIHRoZSBjbGllbnQgYW5kIHNlcnZlciBwcm9qZWN0cy4gUmlnaHQtY2xpY2sgb24gZWFjaCBwcm9qZWN0LCBzZWxlY3QKK1Byb3BlcnRpZXMsIHRoZW46CitDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgLT4gQy9DKysgLT4gR2VuZXJhbCAtPiBBZGRpdGlvbmFsIEluY2x1ZGUgRGlyZWN0b3JpZXMKK0NvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBMaW5rZXIgLT4gR2VuZXJhbCAtPiBBZGRpdGlvbmFsIEluY2x1ZGUgRGlyZWN0b3JpZXMKKworVGhlIHN0b2NrIHBhdGggYXNzdW1lcyB0aGF0IEJvb3N0IGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHRocmlmdCByZXBvIHJvb3QuCisKK1J1biB0aGUgZm9sbG93aW5nIGluIHNlcGFyYXRlIGNvbW1hbmQgcHJvbXB0cyBmcm9tIHRoZSBSZWxlYXNlIG9yIERlYnVnIAorYnVpbGQgZm9sZGVyOgorIHNlcnZlci5leGUgLW5wIHRlc3QKKyBjbGllbnQuZXhlIC1ucCB0ZXN0CisKKworKk5JWCBmbGF2b3JzCistLS0tLS0tLS0tLS0KK0J1aWxkIHRoZSB0aHJpZnQgY3BwIGxpYnJhcnkuCitCdWlsZCB0aGUgSURMIGNvbXBpbGVyIGFuZCBjb3B5IGl0IHRvIHRoaXMgcHJvamVjdCBmb2xkZXIuCitSdW4gdGhyaWZ0bWUuc2ggdG8gZ2VuZXJhdGUgdGhlIGludGVyZmFjZSBzb3VyY2UgZnJvbSB0aGUgdGhyaWZ0IGZpbGVzLgorUnVuICdtYWtlJworCitSdW4gdGhlIGZvbGxvd2luZyBpbiBzZXBhcmF0ZSBzaGVsbHM6Cisgc2VydmVyL3NlcnZlciAtbnAgL3RtcC90ZXN0CisgY2xpZW50L2NsaWVudCAtbnAgL3RtcC90ZXN0CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvU2FtcGxlLnRocmlmdCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9TYW1wbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDBlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvU2FtcGxlLnRocmlmdApAQCAtMCwwICsxLDM5IEBACisvKgorIHRyYW5zcG9ydC1zYW1wbGUgdGhyaWZ0IElETCBmaWxlIC4KKyBFeGVjdXRlIHRocmlmdG1lLmJhdCB1bmRlciBXaW5kb3dzIHRvIGdlbmVyYXRlIHRoZSBjcHAgc3R1YnMgZnJvbSB0aGlzIElETC4KKyAqLworCisvLyBTZWUgdGhyaWZ0L3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCBhbmQgc2hhcmVkLnRocmlmdCBmb3IgbW9yZSBleHRlbnNpdmUgZXhhbXBsZXMuCisKKworbmFtZXNwYWNlIGNwcCBTYW1wbGUKK25hbWVzcGFjZSBqYXZhIFNhbXBsZQorbmFtZXNwYWNlIHBlcmwgU2FtcGxlCisKKy8vVGhpcyBzdHJ1Y3QgaXMgbm90IHVzZWQgaW4gdGhlIHNhbXBsZS4gU2hvd24gaGVyZSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzIG9ubHkuCisvLworc3RydWN0IFNhbXBsZVN0cnVjdAoreworICAxOiBpMzIga2V5CisgIDI6IHN0cmluZyB2YWx1ZQorfQorCisKKy8vQSBzZXJ2aWNlIGNvbnRhaW5zIHRoZSBSUEMocykuCisvLworc2VydmljZSBTYW1wbGVTZXJ2aWNlCit7CisgIHN0cmluZyBIZWxsb1RoZXJlKDE6c3RyaW5nIEhlbGxvU3RyaW5nKSwKKyAgdm9pZCBTZXJ2ZXJEb1NvbWV0aGluZygpLAorCisgIC8vQ2xpZW50IGNhbGxzIHRoaXMgdG8gdGVsbCBzZXJ2ZXIgd2hpY2ggcG9ydCB0byBjb25uZWN0IGJhY2sgb24uCisgIHZvaWQgQ2xpZW50U2lkZUxpc3RlblBvcnQoMTppMTYgUG9ydCksCisgIC8vTmFtZWQgcGlwZSB2ZXJzaW9uCisgIHZvaWQgQ2xpZW50U2lkZVBpcGVOYW1lKDE6c3RyaW5nIG5hbWUpLAorfQorCisvL1NhbXBsZSBSUEMgb24gdGhlICdjbGllbnQnIHNpZGUgdGhhdCB0aGUgbWFzdGVyIHNlcnZlciBjYW4gY2FsbC4KK3NlcnZpY2UgU2FtcGxlQ2FsbGJhY2sKK3sKKyAgdm9pZCBwaW5nY2xpZW50KCksCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWJmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBUaHJpZnRDb21tb24uY3BwIDogQ29tbW9uIGZ1bmN0aW9ucyBmb3Igc2FtcGxlIFRocmlmdCBjbGllbnQgYW5kIHNlcnZlcgorLy8KKworI2luY2x1ZGUgIlRocmlmdENvbW1vbi5oIgorCituYW1lc3BhY2UgdGhyaWZ0Y29tbW9uCit7CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9MYXVuY2ggY2hpbGQgcHJvY2VzcyBhbmQgcGFzcyBSL1cgYW5vbnltb3VzIHBpcGUgaGFuZGxlcyBvbiBjbWQgbGluZS4KKwkvL1RoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBhbmQgZG9lcyBub3QgaW5jbHVkZSBlbGV2YXRpb24gb3Igb3RoZXIgCisJLy9hZHZhbmNlZCBmZWF0dXJlcy4KKwkvLworCWJvb2wgTGF1bmNoQW5vblBpcGVDaGlsZChzdGQ6OnN0cmluZyBhcHAsIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKwl7CisjaWZkZWYgX1dJTjMyCisJCVBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisJCVNUQVJUVVBJTkZPQSBzaTsKKwkJR2V0U3RhcnR1cEluZm9BKCZzaSk7ICAvL3NldCBzdGFydHVwaW5mbyBmb3IgdGhlIHNwYXduZWQgcHJvY2VzcworCQljaGFyIGhhbmRsZXNbTUFYX1BBVEhdOyAgLy9TdG9yZXMgcGlwZSBoYW5kbGVzIGNvbnZlcnRlZCB0byB0ZXh0CisKKwkJc3ByaW50ZihoYW5kbGVzLCAiJXMgJWQgJWQiLCBhcHAuY19zdHIoKSwKKwkJCShpbnQpYm9vc3Q6OnNoYXJlZF9keW5hbWljX2Nhc3Q8VFBpcGVTZXJ2ZXI+KHRyYW5zcG9ydCktPmdldENsaWVudFJkUGlwZUhhbmRsZSgpLAorCQkJKGludClib29zdDo6c2hhcmVkX2R5bmFtaWNfY2FzdDxUUGlwZVNlcnZlcj4odHJhbnNwb3J0KS0+Z2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpKTsKKworCQkvL3NwYXduIHRoZSBjaGlsZCBwcm9jZXNzCisJCWlmICghQ3JlYXRlUHJvY2Vzc0EoTlVMTCwgaGFuZGxlcywgTlVMTCxOVUxMLFRSVUUsMCxOVUxMLE5VTEwsJnNpLCZwaSkpCisJCXsKKwkJCUdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZVByb2Nlc3MgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQ2xvc2VIYW5kbGUocGkuaFRocmVhZCk7CisJCUNsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKKyNlbmRpZgorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2ZDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaApAQCAtMCwwICsxLDIwNSBAQAorLy8gVGhyaWZ0Q29tbW9uLmggOiBDb21tb24gaW5jbHVkZXMsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlcyAKKy8vIGZvciBzYW1wbGUgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyCisvLworLy8gQWRkIHRoZSBmb2xsb3dpbmcgcGF0aHMgdG8gdGhlIFByb2plY3QncyBwcm9wZXJ0aWVzOgorLy8KKy8vIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBDL0MrKyAtPiBHZW5lcmFsLT4gQWRkaXRpb25hbCBJbmNsdWRlIERpcmVjdG9yaWVzIC0tCisvLyAuLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vYm9vc3Q7Li4vLi4vLi4vLi4vYm9vc3QvYm9vc3QvdHIxOworLy8KKy8vIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBMaW5rZXIgLT4gR2VuZXJhbCAtPiBBZGRpdGlvbmFsIExpYnJhcnkgRGlyZWN0b3JpZXMgLS0KKy8vIC4uLy4uLy4uL2xpYi9jcHAvJChDb25maWd1cmF0aW9uKTsuLi8uLi8uLi8uLi9Cb29zdC9saWIKKy8vCisvLyBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgLT4gTGlua2VyIC0+IElucHV0IC0+IEFkZGl0aW9uYWwgRGVwZW5kZW5jaWVzIC0tCisvLyBsaWJ0aHJpZnQubGliCisvLworLy8gLi4uIGFkanVzdCByZWxhdGl2ZSBwYXRocyBhcyBuZWNlc3NhcnkuCisvLworCisjaWZkZWYgX1dJTjMyIC8vdGhyaWZ0IGlzIGNyYXNoaW5nIHdoZW4gdXNpbmcgYm9vc3QgdGhyZWFkcyBvbiBNYWMgT1NYCisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvLyBSZXF1aXJlZCBJbmNsdWRlcworLy8nc2VydmVyJyBzaWRlICNpbmNsdWRlcworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKy8vJ2NsaWVudCcgc2lkZSAjaW5jbHVkZXMKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gUmVxdWlyZWQgTmFtZXNwYWNlcworLy8nc2VydmVyJyBzaWRlIG5hbWVzcGFjZXMKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKy8vY29tbW9uIG5hbWVzcGFjZXMKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKy8vdXNpbmcgbmFtZXNwYWNlIGJvb3N0OyAvL3VzaW5nIG5zIGJvb3N0IGNhbiBpbnRyb2R1Y2UgdHlwZSBjb25mbGljdHMKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK25hbWVzcGFjZSB0aHJpZnRjb21tb24KK3sKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLworCS8vU3RhcnQgdGhlIHRocmlmdCAnc2VydmVyJyAoYm90aCBzZXJ2ZXIgJiBjbGllbnQgc2lkZSBydW4gb25lIGZvciBiaWRpciBldmVudCBzaWduYWxpbmcpCisJLy8gKioqIFRoaXMgZnVuY3Rpb24gdGVtcGxhdGUgd2lsbCBibG9jayAqKioKKwkvLworCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhuZGxyLCAKKwkJICAgICAgICAgICAgICAgICAgaW50IE51bVRocmVhZHMsIAorCQkJCQkJICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisJCQkJCQkgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+ICZzZXJ2ZXIpCisJeworI2lmZGVmIF9XSU4zMgorCQlpZiAoIWhuZGxyLmdldCgpKQorCQkJdGhyb3cgc3RkOjpleGNlcHRpb24oIlJ1blRocmlmdFNlcnZlcigpIGludmFsaWQgaGFuZGxlciIpOworCQlpZiAoIXRyYW5zcG9ydC5nZXQoKSkKKwkJCXRocm93IHN0ZDo6ZXhjZXB0aW9uKCJSdW5UaHJpZnRTZXJ2ZXIoKSBpbnZhbGlkIHRyYW5zcG9ydCIpOworI2Vsc2UKKwkJaWYgKCAhaG5kbHIuZ2V0KCkgfHwgIXRyYW5zcG9ydC5nZXQoKSApCisJCQl0aHJvdyBzdGQ6OmV4Y2VwdGlvbigpOworI2VuZGlmCisKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBoYW5kbGVyKGhuZGxyKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBNeVByb2Nlc3NvcihoYW5kbGVyKSk7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0ZmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcGZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKwkJaWYoTnVtVGhyZWFkcyA8PSAxKQorCQl7CS8vU2luZ2xlLXRocmVhZGVkIHNlcnZlcgorCQkJc2VydmVyLnJlc2V0KG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpKTsKKwkJfQorCQllbHNlCisJCXsJLy9NdWx0aS10aHJlYWRlZCBzZXJ2ZXIKKwkJCWJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKE51bVRocmVhZHMpOworCQkJYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworCQkJdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKwkJCXRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisJCQlzZXJ2ZXIucmVzZXQobmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnksIHRocmVhZE1hbmFnZXIpKTsKKwkJfQorCisJCXByaW50ZigiU3RhcnRpbmcgdGhlICdzZXJ2ZXInLi4uXG4iKTsKKwkJc2VydmVyLT5zZXJ2ZSgpOworCQlwcmludGYoImRvbmUuXG4iKTsKKwl9CisKKwkvLyBUaHJpZnQgc2VydmVyIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgcGlwZSBuYW1lLgorCS8vIEEgaGFuZGxlciBtdXN0IGJlIHBhc3NlZCBpbiB0byB0aGlzIHZlcnNpb24uCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaG5kbHIsIGludCBOdW1UaHJlYWRzLCBzdGQ6OnN0cmluZyBwaXBlbmFtZSwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gJnN2cikKKwl7CisjaWZuZGVmIF9XSU4zMiAgLy9NYWMsICpuaXgKKwkJdW5saW5rKHBpcGVuYW1lLmNfc3RyKCkpOworI2VuZGlmCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFBpcGVTZXJ2ZXIocGlwZW5hbWUsIDEwMjQsIE51bVRocmVhZHMpKTsgLy9OYW1lZCBwaXBlCisJCVJ1blRocmlmdFNlcnZlcjxNeUhhbmRsZXIsIE15UHJvY2Vzc29yPihobmRsciwgTnVtVGhyZWFkcywgdHJhbnNwb3J0LCBzdnIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwaXBlIG5hbWUuCisJLy8gVGhpcyB2ZXJzaW9uIGluc3RhbnRpYXRlcyBpdHMgb3duIGhhbmRsZXIuCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGludCBOdW1UaHJlYWRzLCBzdGQ6OnN0cmluZyBwaXBlbmFtZSkKKwl7CisJCWJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaGFuZGxlcihuZXcgTXlIYW5kbGVyKCkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CisKKwkJUnVuVGhyaWZ0U2VydmVyPE15SGFuZGxlciwgTXlQcm9jZXNzb3I+KGhhbmRsZXIsIE51bVRocmVhZHMsIHBpcGVuYW1lLCBzZXJ2ZXIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBzb2NrZXQgcG9ydCBudW1iZXIuCisJLy8gQSBoYW5kbGVyIG11c3QgYmUgcGFzc2VkIGluIHRvIHRoaXMgdmVyc2lvbi4KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBobmRsciwgaW50IE51bVRocmVhZHMsIGludCBQb3J0KQorCXsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KFBvcnQpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaG5kbHIsIE51bVRocmVhZHMsIHRyYW5zcG9ydCwgc2VydmVyKTsKKwl9CisKKwkvLyBUaHJpZnQgc2VydmVyIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgc29ja2V0IHBvcnQgbnVtYmVyLgorCS8vIFRoaXMgdmVyc2lvbiBpbnN0YW50aWF0ZXMgaXRzIG93biBoYW5kbGVyLgorCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChpbnQgTnVtVGhyZWFkcywgaW50IFBvcnQpCisJeworCQlib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhhbmRsZXIobmV3IE15SGFuZGxlcigpKTsKKworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaGFuZGxlciwgTnVtVGhyZWFkcywgUG9ydCk7CisJfQorCisJLy8KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBobmRsciwgaW50IE51bVRocmVhZHMsIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKwl7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKwkJUnVuVGhyaWZ0U2VydmVyPE15SGFuZGxlciwgTXlQcm9jZXNzb3I+KGhuZGxyLCBOdW1UaHJlYWRzLCB0cmFuc3BvcnQsIHNlcnZlcik7CisJfQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9Db25uZWN0IHRvIHRocmlmdCAnc2VydmVyJyAtIFNvY2tldCB2ZXJzaW9uCisJLy8oYm90aCBzZXJ2ZXIgJiBjbGllbnQgc2lkZSBydW4gb25lIGZvciBiaWRpciBldmVudCBzaWduYWxpbmcpCisJLy8KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlDbGllbnQsIGNsYXNzIE15VHJhbnNwb3J0PgorCXZvaWQgQ29ubmVjdFRvU2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUNsaWVudD4gJmNsaWVudCwgYm9vc3Q6OnNoYXJlZF9wdHI8TXlUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsIGludCBQb3J0KQorCXsKKwkJLy9DbGllbnQgc2lkZSBjb25uZWN0aW9uIHVzaW5nIHNvY2tldHMgdHJhbnNwb3J0LgorCQlib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIFBvcnQpKTsKKwkJdHJhbnNwb3J0LnJlc2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKworCQljbGllbnQucmVzZXQobmV3IE15Q2xpZW50KHByb3RvY29sKSk7CisJfQorCisJLy9Db25uZWN0IHRvIHRocmlmdCAnc2VydmVyJyAtIE5hbWVkIFBpcGUgdmVyc2lvbgorCXRlbXBsYXRlIDxjbGFzcyBNeUNsaWVudCwgY2xhc3MgTXlUcmFuc3BvcnQ+CisJdm9pZCBDb25uZWN0VG9TZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15Q2xpZW50PiAmY2xpZW50LCBib29zdDo6c2hhcmVkX3B0cjxNeVRyYW5zcG9ydD4gJnRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgcGlwZW5hbWUpCisJeworCQkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdXNpbmcgTmFtZWQgUGlwZSB0cmFuc3BvcnQuCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHBpcGUobmV3IFRQaXBlKHBpcGVuYW1lKSk7CisJCXRyYW5zcG9ydC5yZXNldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHBpcGUpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworCisJCWNsaWVudC5yZXNldChuZXcgTXlDbGllbnQocHJvdG9jb2wpKTsKKwl9CisKKwkvL0Nvbm5lY3QgdG8gdGhyaWZ0ICdzZXJ2ZXInIC0gQW5vbnltb3VzIFBpcGUgdmVyc2lvbgorCS8vQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHVuZGVyIFdpbmRvd3MKKyNpZmRlZiBfV0lOMzIKKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlDbGllbnQsIGNsYXNzIE15VHJhbnNwb3J0PgorCXZvaWQgQ29ubmVjdFRvU2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUNsaWVudD4gJmNsaWVudCwgYm9vc3Q6OnNoYXJlZF9wdHI8TXlUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsIEhBTkRMRSBSZFBpcGUsIEhBTkRMRSBXcnRQaXBlKQorCXsKKwkJLy9DbGllbnQgc2lkZSBjb25uZWN0aW9uIHVzaW5nIHNvY2tldHMgdHJhbnNwb3J0LgorI2lmZGVmIF9XSU4zMgorCQlib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwaXBlKG5ldyBUUGlwZSgoaW50KVJkUGlwZSwgKGludClXcnRQaXBlKSk7CisJCXRyYW5zcG9ydC5yZXNldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHBpcGUpKTsKKyNlbHNlCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IikpOworCQl0cmFuc3BvcnQucmVzZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyNlbmRpZgorCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisKKwkJY2xpZW50LnJlc2V0KG5ldyBNeUNsaWVudChwcm90b2NvbCkpOworCX0KKyNlbmRpZgorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy9MYXVuY2ggY2hpbGQgcHJvY2VzcyBhbmQgcGFzcyBSL1cgYW5vbnltb3VzIHBpcGUgaGFuZGxlcyBvbiBjbWQgbGluZS4KKwkvL0N1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB1bmRlciBXaW5kb3dzCisjaWZkZWYgX1dJTjMyCisJYm9vbCBMYXVuY2hBbm9uUGlwZUNoaWxkKHN0ZDo6c3RyaW5nIGFwcCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9SZWFkTWUudHh0IGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDlhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L1JlYWRNZS50eHQKQEAgLTAsMCArMSw0MCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ09OU09MRSBBUFBMSUNBVElPTiA6IGNsaWVudCBQcm9qZWN0IE92ZXJ2aWV3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXBwV2l6YXJkIGhhcyBjcmVhdGVkIHRoaXMgY2xpZW50IGFwcGxpY2F0aW9uIGZvciB5b3UuCisKK1RoaXMgZmlsZSBjb250YWlucyBhIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugd2lsbCBmaW5kIGluIGVhY2ggb2YgdGhlIGZpbGVzIHRoYXQKK21ha2UgdXAgeW91ciBjbGllbnQgYXBwbGljYXRpb24uCisKKworY2xpZW50LnZjeHByb2oKKyAgICBUaGlzIGlzIHRoZSBtYWluIHByb2plY3QgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLgorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFZpc3VhbCBDKysgdGhhdCBnZW5lcmF0ZWQgdGhlIGZpbGUsIGFuZAorICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF0Zm9ybXMsIGNvbmZpZ3VyYXRpb25zLCBhbmQgcHJvamVjdCBmZWF0dXJlcyBzZWxlY3RlZCB3aXRoIHRoZQorICAgIEFwcGxpY2F0aW9uIFdpemFyZC4KKworY2xpZW50LnZjeHByb2ouZmlsdGVycworICAgIFRoaXMgaXMgdGhlIGZpbHRlcnMgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLiAKKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZmlsZXMgaW4geW91ciBwcm9qZWN0IAorICAgIGFuZCB0aGUgZmlsdGVycy4gVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIGluIHRoZSBJREUgdG8gc2hvdyBncm91cGluZyBvZiBmaWxlcyB3aXRoCisgICAgc2ltaWxhciBleHRlbnNpb25zIHVuZGVyIGEgc3BlY2lmaWMgbm9kZSAoZm9yIGUuZy4gIi5jcHAiIGZpbGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIlNvdXJjZSBGaWxlcyIgZmlsdGVyKS4KKworY2xpZW50LmNwcAorICAgIFRoaXMgaXMgdGhlIG1haW4gYXBwbGljYXRpb24gc291cmNlIGZpbGUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBzdGFuZGFyZCBmaWxlczoKKworU3RkQWZ4LmgsIFN0ZEFmeC5jcHAKKyAgICBUaGVzZSBmaWxlcyBhcmUgdXNlZCB0byBidWlsZCBhIHByZWNvbXBpbGVkIGhlYWRlciAoUENIKSBmaWxlCisgICAgbmFtZWQgY2xpZW50LnBjaCBhbmQgYSBwcmVjb21waWxlZCB0eXBlcyBmaWxlIG5hbWVkIFN0ZEFmeC5vYmouCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBub3RlczoKKworQXBwV2l6YXJkIHVzZXMgIlRPRE86IiBjb21tZW50cyB0byBpbmRpY2F0ZSBwYXJ0cyBvZiB0aGUgc291cmNlIGNvZGUgeW91CitzaG91bGQgYWRkIHRvIG9yIGN1c3RvbWl6ZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZiZWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvLyBjbGllbnQtPmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY29uc29sZSBhcHBsaWNhdGlvbi4KKy8vCisvLyBzYW1wbGUgY2xpZW50IGNvbW1hbmQgbGluZSBhcHAgdXNpbmcgVGhyaWZ0IElQQy4KKy8vIFF1aWNrIG4gRGlydHkgZXhhbXBsZSwgbWF5IG5vdCBoYXZlIHZlcnkgcm9idXN0IGVycm9yIGhhbmRsaW5nCisvLyBmb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eS4KKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSAic3RkYWZ4LmgiCisjZWxzZQorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy9JbmNsdWRlIHRoaXMgYmVmb3JlIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZXMKKyNpbmNsdWRlICJUaHJpZnRDb21tb24uaCIKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvL1RhaWxvciB0aGVzZSB0byB5b3VyIGdlbmVyYXRlZCBmaWxlcworI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlU2VydmljZS5oIgorI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlQ2FsbGJhY2suaCIKKwordXNpbmcgbmFtZXNwYWNlIFNhbXBsZTsgLy9kZWNsYXJlZCBpbiAudGhyaWZ0IGZpbGUKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK3ZvaWQgQ2xpZW50TGlzdGVuZXJUaHJlYWRQcm9jKCk7Citib29sIGJTb2NrZXQgPSBmYWxzZTsKK2Jvb2wgYkFub25QaXBlID0gZmFsc2U7CitpbnQgc3J2UG9ydDsKK3N0ZDo6c3RyaW5nIHBpcGVuYW1lOworc3RkOjpzdHJpbmcgcGlwZW5hbWVfY2xpZW50OworI2lmZGVmIF9XSU4zMgorIEhBTkRMRSBoQ29uc29sZTsKKyNlbmRpZgorCisvL0N1c3RvbWl6ZWQgdmVyc2lvbiBvZiBwcmludGYgdGhhdCBjaGFuZ2VzIHRoZSB0ZXh0IGNvbG9yCisvL1RoaXMgZGVwZW5kcyBvbiBoQ29uc29sZSBnbG9iYWwgYmVpbmcgaW5pdGlhbGl6ZWQKK3ZvaWQgaGxwcmludGYoY29uc3QgY2hhciogX0Zvcm1hdCwgLi4uKQoreworI2lmZGVmIF9XSU4zMgorCVNldENvbnNvbGVUZXh0QXR0cmlidXRlKGhDb25zb2xlLCAweEUpOworI2VuZGlmCisJdmFfbGlzdCBhcDsKKwlpbnQgcjsKKwl2YV9zdGFydCAoYXAsIF9Gb3JtYXQpOworCXIgPSB2cHJpbnRmIChfRm9ybWF0LCBhcCk7CisJdmFfZW5kIChhcCk7CisjaWZkZWYgX1dJTjMyCisJU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaENvbnNvbGUsIDcpOworI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsaWVudC1zaWRlIFJQQyBpbXBsZW1lbnRhdGlvbnM6IENhbGxlZCBieSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQgZm9yIAorLy8gYmlkaXJlY3Rpb25hbCBldmVudGluZy4KKy8vCitjbGFzcyBTYW1wbGVDYWxsYmFja0hhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyBTYW1wbGVDYWxsYmFja0lmIHsKKyBwdWJsaWM6CisgIFNhbXBsZUNhbGxiYWNrSGFuZGxlcigpIHsKKyAgICAvLyBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUKKyAgfQorCisgIHZvaWQgcGluZ2NsaWVudCgpCisgIHsKKyAgICBobHByaW50ZigiPDw8UGluZyByZWNlaXZlZCBmcm9tIHNlcnZlciAoc2VydmVyLXRvLWNsaWVudCBldmVudCkuXG4iKTsKKyAgfQorCit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyNpZmRlZiBfV0lOMzIKK2ludCBfdG1haW4oaW50IGFyZ2MsIF9UQ0hBUiogYXJndltdKQorI2Vsc2UKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyNlbmRpZgoreworCS8vUHJvY2VzcyBjbWQgbGluZSBhcmdzIHRvIGRldGVybWluZSBuYW1lZCB2cyBhbm9uIHBpcGVzLgorCWJvb2wgdXNhZ2UgPSBmYWxzZTsKKyNpZmRlZiBfV0lOMzIKKwlIQU5ETEUgUmVhZFBpcGUsIFdyaXRlUGlwZTsKKwloQ29uc29sZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisjZW5kaWYKKworCS8vUHJvY2VzcyBjb21tYW5kIGxpbmUgcGFyYW1zCisJaWYoYXJnYyA+IDEpCisJeworCQlpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1zcCIpKSA9PSAwKQorCQl7CS8vU29ja2V0IFBvcnQgc3BlY2lmaWVkCisJCQlzcnZQb3J0ID0gX3RzdG9pKGFyZ3ZbMl0pOworCQkJYlNvY2tldCA9IHRydWU7CisJCX0KKwkJZWxzZSBpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1ucCIpKSA9PSAwKQorCQl7CS8vTmFtZWQgUGlwZSBzcGVjaWZpZWQKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyB3cGlwZShhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVuYW1lLnJlc2l6ZSh3cGlwZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvcHkod3BpcGUuYmVnaW4oKSwgd3BpcGUuZW5kKCksIHBpcGVuYW1lLmJlZ2luKCkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVuYW1lID0gYXJndlsyXTsKKyNlbmRpZgorCQkJcGlwZW5hbWVfY2xpZW50ID0gcGlwZW5hbWUgKyAiX2NsaWVudCI7CisJCX0KKwkJZWxzZSBpZihhcmdjID09IDMpCisJCXsJLy9Bbm9ueW1vdXMgUGlwZSBzcGVjaWZpZWQKKyNpZmRlZiBfV0lOMzIKKwkJCVJlYWRQaXBlICA9IChIQU5ETEUpX3RzdG9pKGFyZ3ZbMV0pOworCQkJV3JpdGVQaXBlID0gKEhBTkRMRSlfdHN0b2koYXJndlsyXSk7CisJCQliQW5vblBpcGUgPSB0cnVlOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQW5vbnltb3VzIHBpcGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQgdW5kZXIgKk5JWFxuIik7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCQl1c2FnZSA9IHRydWU7CisJfQorCWVsc2UKKwkJdXNhZ2UgPSB0cnVlOworCisJaWYodXNhZ2UpCisJeworCQlobHByaW50ZigiVGhyaWZ0IHNhbXBsZSBjbGllbnQgdXNhZ2U6XG5cbiIpOworCQlobHByaW50ZigiU29ja2V0IFBvcnQgdG8gY29ubmVjdCB0bzogLXNwIDxwb3J0Iz5cbiIpOworCQlobHByaW50ZigiTmFtZWQgUGlwZSB0byBjb25uZWN0IHRvOiAgLW5wIDxwaXBlbmFtZT4gKGUuZy4gYWZmcGlwZSlcbiIpOworCQlobHByaW50ZigiQW5vbnltb3VzIFBpcGUgKG11c3QgYmUgbGF1bmNoZWQgYnkgYW5vbiBwaXBlIGNyZWF0b3IpOlxuIik7CisJCWhscHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhZCBIYW5kbGU+IDxXcml0ZSBIYW5kbGU+XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLy9DbGllbnQgc2lkZSBjb25uZWN0aW9uIHRvIHNlcnZlci4KKwlib29zdDo6c2hhcmVkX3B0cjxTYW1wbGVTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7IC8vQ2xpZW50IGNsYXNzIGZyb20gVGhyaWZ0LWdlbmVyYXRlZCBjb2RlLgorCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKworCWlmKGJTb2NrZXQpCisJewkvL1NvY2tldCB0cmFuc3BvcnQKKyNpZmRlZiBfV0lOMzIKKwkJVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisJCWhscHJpbnRmKCJVc2luZyBzb2NrZXQgdHJhbnNwb3J0IHBvcnQgJWRcbiIsIHNydlBvcnQpOworCQl0aHJpZnRjb21tb246OkNvbm5lY3RUb1NlcnZlcjxTYW1wbGVTZXJ2aWNlQ2xpZW50LCBUVHJhbnNwb3J0PihjbGllbnQsIHRyYW5zcG9ydCwgc3J2UG9ydCk7CisJfQorCWVsc2UgaWYoIWJBbm9uUGlwZSkKKwl7CisJCWhscHJpbnRmKCJVc2luZyBOYW1lZCBQaXBlICVzXG4iLCBwaXBlbmFtZS5jX3N0cigpKTsKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlU2VydmljZUNsaWVudCwgVFRyYW5zcG9ydD4oY2xpZW50LCB0cmFuc3BvcnQsIHBpcGVuYW1lKTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBfV0lOMzIKKwkJaGxwcmludGYoIlVzaW5nIEFub255bW91cyBQaXBlIHRyYW5zcG9ydFxuIik7CisJCXRocmlmdGNvbW1vbjo6Q29ubmVjdFRvU2VydmVyPFNhbXBsZVNlcnZpY2VDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudCwgdHJhbnNwb3J0LCBSZWFkUGlwZSwgV3JpdGVQaXBlKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIF9XSU4zMgorCS8vU3RhcnQgYSB0aHJlYWQgdG8gcmVjZWl2ZSBpbmJvdW5kIGNvbm5lY3Rpb24gZnJvbSBzZXJ2ZXIgZm9yIDItd2F5IGV2ZW50IHNpZ25hbGluZy4KKwlib29zdDo6dGhyZWFkIENsaWVudExpc3RlbmVyVGhyZWFkKENsaWVudExpc3RlbmVyVGhyZWFkUHJvYyk7CisjZW5kaWYKKworCXRyeSB7CisJCXRyYW5zcG9ydC0+b3BlbigpOworCisJCS8vTm90aWZ5IHNlcnZlciB3aGF0IHRvIGNvbm5lY3QgYmFjayBvbi4KKwkJaWYoYlNvY2tldCkKKwkJCWNsaWVudC0+Q2xpZW50U2lkZUxpc3RlblBvcnQoc3J2UG9ydCArIDEpOyAvL1NvY2tldAorCQllbHNlIGlmKCFiQW5vblBpcGUpCisJCQljbGllbnQtPkNsaWVudFNpZGVQaXBlTmFtZShwaXBlbmFtZV9jbGllbnQpOyAvL05hbWVkIFBpcGUKKworCQkvL1J1biBzb21lIG1vcmUgUlBDcworCQlzdGQ6OnN0cmluZyBoZWxsb3N0ciA9ICJIZWxsbyBob3cgYXJlIHlvdT8iOworCQlzdGQ6OnN0cmluZyByZXR1cm5zdHI7CisJCWNsaWVudC0+SGVsbG9UaGVyZShyZXR1cm5zdHIsIGhlbGxvc3RyKTsKKwkJaGxwcmludGYoIlxuPj4+U2VudDogJXNcbiIsIGhlbGxvc3RyLmNfc3RyKCkpOworCQlobHByaW50ZigiPDw8UmVjZWl2ZWQ6ICVzXG4iLCByZXR1cm5zdHIuY19zdHIoKSk7CisKKwkJaGxwcmludGYoIlxuPj4+Q2FsbGluZyBTZXJ2ZXJEb1NvbWV0aGluZygpIHdoaWNoIGRlbGF5cyBmb3IgNSBzZWNvbmRzLlxuIik7CisJCWNsaWVudC0+U2VydmVyRG9Tb21ldGhpbmcoKTsKKwkJaGxwcmludGYoIj4+PlNlcnZlckRvU29tZXRoaW5nKCkgZG9uZS5cblxuIik7CisKKwkJdHJhbnNwb3J0LT5jbG9zZSgpOworCX0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7CisJCWhscHJpbnRmKCJFUlJPUjogJXNcbiIsIHR4LndoYXQoKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLy9UaHJlYWQgUm91dGluZQordm9pZCBDbGllbnRMaXN0ZW5lclRocmVhZFByb2MoKQoreworCWlmKGJTb2NrZXQpCisJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZUNhbGxiYWNrSGFuZGxlciwgU2FtcGxlQ2FsbGJhY2tQcm9jZXNzb3I+KDEsIHNydlBvcnQgKyAxKTsKKwllbHNlIGlmKCFiQW5vblBpcGUpCisJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZUNhbGxiYWNrSGFuZGxlciwgU2FtcGxlQ2FsbGJhY2tQcm9jZXNzb3I+KDEsIHBpcGVuYW1lX2NsaWVudCk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzljMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvagpAQCAtMCwwICsxLDEwNSBAQAorPzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+ezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT5jbGllbnQ8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vYm9vc3Q7Li4vLi4vLi4vLi4vYm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vYm9vc3Q7Li4vLi4vLi4vLi4vYm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cVGhyaWZ0Q29tbW9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJjbGllbnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3RkYWZ4LmNwcCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvai5maWx0ZXJzIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzdiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw2NiBAQAorPzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdjttZmNyaWJib24tbXM8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcZ2VuLWNwcCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MTI2NWIzZGMtOTFkZS00MTZmLWFiYTYtN2I3NTBkZTQyMjFlfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzdGRhZnguaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzdGRhZnguY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJjbGllbnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFRocmlmdENvbW1vbi5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3N0ZGFmeC5jcHAgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3N0ZGFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMTUxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmNwcApAQCAtMCwwICsxLDggQEAKKy8vIHN0ZGFmeC5jcHAgOiBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIGp1c3QgdGhlIHN0YW5kYXJkIGluY2x1ZGVzCisvLyBjbGllbnQucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKKy8vIHN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgorCisjaW5jbHVkZSAic3RkYWZ4LmgiCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIHlvdSBuZWVkIGluIFNUREFGWC5ICisvLyBhbmQgbm90IGluIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwNWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmgKQEAgLTAsMCArMSwxNSBAQAorLy8gc3RkYWZ4LmggOiBpbmNsdWRlIGZpbGUgZm9yIHN0YW5kYXJkIHN5c3RlbSBpbmNsdWRlIGZpbGVzLAorLy8gb3IgcHJvamVjdCBzcGVjaWZpYyBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIHVzZWQgZnJlcXVlbnRseSwgYnV0CisvLyBhcmUgY2hhbmdlZCBpbmZyZXF1ZW50bHkKKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidGFyZ2V0dmVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKKworCisvLyBUT0RPOiByZWZlcmVuY2UgYWRkaXRpb25hbCBoZWFkZXJzIHlvdXIgcHJvZ3JhbSByZXF1aXJlcyBoZXJlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3RhcmdldHZlci5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC90YXJnZXR2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MwMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC90YXJnZXR2ZXIuaApAQCAtMCwwICsxLDggQEAKKyNwcmFnbWEgb25jZQorCisvLyBJbmNsdWRpbmcgU0RLRERLVmVyLmggZGVmaW5lcyB0aGUgaGlnaGVzdCBhdmFpbGFibGUgV2luZG93cyBwbGF0Zm9ybS4KKworLy8gSWYgeW91IHdpc2ggdG8gYnVpbGQgeW91ciBhcHBsaWNhdGlvbiBmb3IgYSBwcmV2aW91cyBXaW5kb3dzIHBsYXRmb3JtLCBpbmNsdWRlIFdpblNES1Zlci5oIGFuZAorLy8gc2V0IHRoZSBfV0lOMzJfV0lOTlQgbWFjcm8gdG8gdGhlIHBsYXRmb3JtIHlvdSB3aXNoIHRvIHN1cHBvcnQgYmVmb3JlIGluY2x1ZGluZyBTREtEREtWZXIuaC4KKworI2luY2x1ZGUgPFNES0RES1Zlci5oPgpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NvbmZpZy5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGQ3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY29uZmlnLmgKQEAgLTAsMCArMSwyNCBAQAorLy9NaXNzaW5nIGRlZmluaXRpb25zIGZvciAqTklYIHN5c3RlbXMuIFRoaXMgc2FtcGxlIHByb2plY3QKKy8vd2FzIGluaXRpYWxseSBjcmVhdGVkIG9uIFdpbmRvd3MuCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBURVhUKHN0cikgc3RyCisKK2lubGluZSBpbnQgU2xlZXAoaW50IG1zKQoreworCXJldHVybiBzbGVlcChtcy8xMDAwKTsgLy9zbGVlcCgpIHBhcmFtIGlzIGluIHNlY29uZHMKK30KKworaW5saW5lIGludCBfdGNzY21wKGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIpCit7CisJcmV0dXJuIHN0cmNtcChzdHIxLCBzdHIyKTsKK30KKworaW5saW5lIGludCBfdHN0b2koY29uc3QgY2hhciogc3RyKQoreworCXJldHVybiBhdG9pKHN0cik7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvUmVhZE1lLnR4dCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MwZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9SZWFkTWUudHh0CkBAIC0wLDAgKzEsNDAgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIENPTlNPTEUgQVBQTElDQVRJT04gOiBzZXJ2ZXIgUHJvamVjdCBPdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FwcFdpemFyZCBoYXMgY3JlYXRlZCB0aGlzIHNlcnZlciBhcHBsaWNhdGlvbiBmb3IgeW91LgorCitUaGlzIGZpbGUgY29udGFpbnMgYSBzdW1tYXJ5IG9mIHdoYXQgeW91IHdpbGwgZmluZCBpbiBlYWNoIG9mIHRoZSBmaWxlcyB0aGF0CittYWtlIHVwIHlvdXIgc2VydmVyIGFwcGxpY2F0aW9uLgorCisKK3NlcnZlci52Y3hwcm9qCisgICAgVGhpcyBpcyB0aGUgbWFpbiBwcm9qZWN0IGZpbGUgZm9yIFZDKysgcHJvamVjdHMgZ2VuZXJhdGVkIHVzaW5nIGFuIEFwcGxpY2F0aW9uIFdpemFyZC4KKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZiBWaXN1YWwgQysrIHRoYXQgZ2VuZXJhdGVkIHRoZSBmaWxlLCBhbmQKKyAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxhdGZvcm1zLCBjb25maWd1cmF0aW9ucywgYW5kIHByb2plY3QgZmVhdHVyZXMgc2VsZWN0ZWQgd2l0aCB0aGUKKyAgICBBcHBsaWNhdGlvbiBXaXphcmQuCisKK3NlcnZlci52Y3hwcm9qLmZpbHRlcnMKKyAgICBUaGlzIGlzIHRoZSBmaWx0ZXJzIGZpbGUgZm9yIFZDKysgcHJvamVjdHMgZ2VuZXJhdGVkIHVzaW5nIGFuIEFwcGxpY2F0aW9uIFdpemFyZC4gCisgICAgSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGZpbGVzIGluIHlvdXIgcHJvamVjdCAKKyAgICBhbmQgdGhlIGZpbHRlcnMuIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCBpbiB0aGUgSURFIHRvIHNob3cgZ3JvdXBpbmcgb2YgZmlsZXMgd2l0aAorICAgIHNpbWlsYXIgZXh0ZW5zaW9ucyB1bmRlciBhIHNwZWNpZmljIG5vZGUgKGZvciBlLmcuICIuY3BwIiBmaWxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICJTb3VyY2UgRmlsZXMiIGZpbHRlcikuCisKK3NlcnZlci5jcHAKKyAgICBUaGlzIGlzIHRoZSBtYWluIGFwcGxpY2F0aW9uIHNvdXJjZSBmaWxlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworT3RoZXIgc3RhbmRhcmQgZmlsZXM6CisKK1N0ZEFmeC5oLCBTdGRBZnguY3BwCisgICAgVGhlc2UgZmlsZXMgYXJlIHVzZWQgdG8gYnVpbGQgYSBwcmVjb21waWxlZCBoZWFkZXIgKFBDSCkgZmlsZQorICAgIG5hbWVkIHNlcnZlci5wY2ggYW5kIGEgcHJlY29tcGlsZWQgdHlwZXMgZmlsZSBuYW1lZCBTdGRBZngub2JqLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworT3RoZXIgbm90ZXM6CisKK0FwcFdpemFyZCB1c2VzICJUT0RPOiIgY29tbWVudHMgdG8gaW5kaWNhdGUgcGFydHMgb2YgdGhlIHNvdXJjZSBjb2RlIHlvdQorc2hvdWxkIGFkZCB0byBvciBjdXN0b21pemUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci5jcHAgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhODM2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLmNwcApAQCAtMCwwICsxLDE2OCBAQAorLy8gc2VydmVyLmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY29uc29sZSBhcHBsaWNhdGlvbi4KKy8vCisvLyBzYW1wbGUgc2VydmVyIGNvbW1hbmQgbGluZSBhcHAgdXNpbmcgVGhyaWZ0IElQQy4KKy8vCisvLyBUaGlzIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgZnVsbCBkdXBsZXggUlBDLiBUaGF0IGlzLCBlYWNoCisvLyBzaWRlIHJ1bnMgYm90aCBhIGNsaWVudCBhbmQgc2VydmVyIHRvIGVuYWJsZSBiaWRpcmVjdGlvbmFsIGV2ZW50IAorLy8gc2lnbmFsaW5nLgorLy8KKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSAic3RkYWZ4LmgiCisjZWxzZQorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vSW5jbHVkZSB0aGlzIGJlZm9yZSB0aGUgZ2VuZXJhdGVkIGluY2x1ZGVzCisjaW5jbHVkZSAiVGhyaWZ0Q29tbW9uLmgiCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy9UYWlsb3IgdGhlc2UgdG8geW91ciBnZW5lcmF0ZWQgZmlsZXMKKyNpbmNsdWRlICIuLi9nZW4tY3BwL1NhbXBsZVNlcnZpY2UuaCIKKyNpbmNsdWRlICIuLi9nZW4tY3BwL1NhbXBsZUNhbGxiYWNrLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBTYW1wbGU7IC8vZGVjbGFyZWQgaW4gLnRocmlmdCBmaWxlCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitpbnQxNl90IENsaWVudFBvcnRfOworc3RkOjpzdHJpbmcgQ2xpZW50UGlwZU5hbWVfOwordm9pZCBTMkNUaHJlYWRQcm9jKCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJQQyBpbXBsZW1lbnRhdGlvbnMKKy8vCitjbGFzcyBTYW1wbGVTZXJ2aWNlSGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFNhbXBsZVNlcnZpY2VJZiB7CisgcHVibGljOgorICBTYW1wbGVTZXJ2aWNlSGFuZGxlcigpIHsKKyAgICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZQorICB9CisKKyAgdm9pZCBIZWxsb1RoZXJlKHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgSGVsbG9TdHJpbmcpIHsKKyAgICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZQorICAgIHByaW50ZigiPDw8SGVsbG9UaGVyZSgpIHJlY2VpdmVkIHN0cmluZzogJXNcbiIsIEhlbGxvU3RyaW5nLmNfc3RyKCkpOworCV9yZXR1cm4gPSAiR29vZCB0aGFuayB5b3UuIjsKKyAgfQorCisgIHZvaWQgU2VydmVyRG9Tb21ldGhpbmcoKSB7CisgICAgLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUKKyAgICBwcmludGYoIlNlcnZlckRvU29tZXRoaW5nKCk6IFNpbXVsYXRpbmcgd29yayBmb3IgNSBzZWNvbmRzXG4iKTsKKyAgICBTbGVlcCg1MDAwKTsKKyAgICBwcmludGYoIlNlcnZlckRvU29tZXRoaW5nKCk6IERvbmVcbiIpOworICB9CisKKyAgdm9pZCBDbGllbnRTaWRlTGlzdGVuUG9ydChjb25zdCBpbnQxNl90IENsaWVudExpc3RlblBvcnQpCisgIHsKKwlDbGllbnRQb3J0XyA9IENsaWVudExpc3RlblBvcnQ7CisJQ2xpZW50UGlwZU5hbWVfID0gIiI7CisjaWZkZWYgX1dJTjMyCisJcHJpbnRmKCI+Pj5Db25uZWN0aW5nIHRvIGNsaWVudCBvbiBwb3J0ICVkXG4iLCBDbGllbnRQb3J0Xyk7CisJYm9vc3Q6OnRocmVhZCBDb25uZWN0MkNsaWVudFRocmVhZChTMkNUaHJlYWRQcm9jKTsKKyNlbmRpZgorICB9CisKKyAgdm9pZCBDbGllbnRTaWRlUGlwZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIENsaWVudFBpcGVOYW1lKQorICB7CisJQ2xpZW50UGlwZU5hbWVfID0gQ2xpZW50UGlwZU5hbWU7CisJQ2xpZW50UG9ydF8gPSAwOworI2lmZGVmIF9XSU4zMgorCXByaW50ZigiPj4+Q29ubmVjdGluZyB0byBjbGllbnQgcGlwZSAlc1xuIiwgQ2xpZW50UGlwZU5hbWVfLmNfc3RyKCkpOworCWJvb3N0Ojp0aHJlYWQgQ29ubmVjdDJDbGllbnRUaHJlYWQoUzJDVGhyZWFkUHJvYyk7CisjZW5kaWYKKyAgfQorfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9XSU4zMgoraW50IF90bWFpbihpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10pCisjZWxzZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJaW50IHBvcnQ7CisJc3RkOjpzdHJpbmcgcGlwZW5hbWU7IC8vZS5nLiAiYWZmcGlwZSIKKworCWJvb2wgdXNhZ2UgPSBmYWxzZTsKKworCS8vUHJvY2VzcyBjb21tYW5kIGxpbmUgcGFyYW1zCisJaWYoYXJnYyA+IDEpCisJeworCQlpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1zcCIpKSA9PSAwKQorCQl7CS8vU29ja2V0IFBvcnQgc3BlY2lmaWVkCisJCQlwb3J0ID0gX3RzdG9pKGFyZ3ZbMl0pOworI2lmZGVmIF9XSU4zMgorCQkJVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisJCQkvLyBTdGFydCB0aGUgdGhyaWZ0IHNlcnZlciB3aGljaCBpcyBhIGJsb2NraW5nIGNhbGwuCisJCQl0aHJpZnRjb21tb246OlJ1blRocmlmdFNlcnZlcjxTYW1wbGVTZXJ2aWNlSGFuZGxlciwgU2FtcGxlU2VydmljZVByb2Nlc3Nvcj4oMTAsIHBvcnQpOworCQl9CisJCWVsc2UgaWYoX3Rjc2NtcChhcmd2WzFdLCBURVhUKCItbnAiKSkgPT0gMCkKKwkJewkvL05hbWVkIFBpcGUgc3BlY2lmaWVkCisjaWZkZWYgX1dJTjMyCisJCQlzdGQ6OndzdHJpbmcgd3BpcGUoYXJndlsyXSk7CisJCQlwaXBlbmFtZS5yZXNpemUod3BpcGUubGVuZ3RoKCkpOworCQkJc3RkOjpjb3B5KHdwaXBlLmJlZ2luKCksIHdwaXBlLmVuZCgpLCBwaXBlbmFtZS5iZWdpbigpKTsKKyNlbHNlCisJCQlwaXBlbmFtZSA9IGFyZ3ZbMl07CisjZW5kaWYKKwkJCXByaW50ZigiVXNpbmcgTmFtZWQgUGlwZSAlc1xuIiwgcGlwZW5hbWUuY19zdHIoKSk7CisKKwkJCS8vVGhyaWZ0IG92ZXIgTmFtZWQgUGlwZS4KKwkJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZVNlcnZpY2VIYW5kbGVyLCBTYW1wbGVTZXJ2aWNlUHJvY2Vzc29yPigxMCwgcGlwZW5hbWUpOworCQl9CisJCWVsc2UgaWYoX3Rjc2NtcChhcmd2WzFdLCBURVhUKCItYXAiKSkgPT0gMCkKKwkJewkvL0Fub255bW91cyBQaXBlIHNwZWNpZmllZAorCQkJLy9UaGlzIGlzIG1vcmUgaW52b2x2ZWQgYmVjYXVzZSB0aGUgY2hpbGQgbmVlZHMgdG8gYmUgbGF1bmNoZWQgCisJCQkvL2FmdGVyIHRoZSB0cmFuc3BvcnQgaXMgY3JlYXRlZCBidXQgYmVmb3JlIHRoZSBibG9ja2luZyBzZXJ2ZXIgCisJCQkvL2NhbGwuCisjaWZkZWYgX1dJTjMyCisJCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRQaXBlU2VydmVyKCkpOyAvL0Fub255bW91cyBwaXBlCisJCQl0aHJpZnRjb21tb246OkxhdW5jaEFub25QaXBlQ2hpbGQoIi5cXGNsaWVudC5leGUiLCB0cmFuc3BvcnQpOworCQkJYm9vc3Q6OnNoYXJlZF9wdHI8U2FtcGxlU2VydmljZUhhbmRsZXI+IGhhbmRsZXIobmV3IFNhbXBsZVNlcnZpY2VIYW5kbGVyKCkpOworCQkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlU2VydmljZUhhbmRsZXIsIFNhbXBsZVNlcnZpY2VQcm9jZXNzb3I+KGhhbmRsZXIsIDEwLCB0cmFuc3BvcnQpOworI2Vsc2UKKwkJCXByaW50ZigiQW5vbnltb3VzIHBpcGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQgdW5kZXIgKk5JWFxuIik7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCQl1c2FnZSA9IHRydWU7CisJfQorCWVsc2UKKwkJdXNhZ2UgPSB0cnVlOworCisJaWYodXNhZ2UpCisJeworCQlwcmludGYoIlRocmlmdCBzYW1wbGUgc2VydmVyIHVzYWdlOlxuXG4iKTsKKwkJcHJpbnRmKCJTb2NrZXQgUG9ydCA6ICAgLXNwIDxwb3J0Iz5cbiIpOworCQlwcmludGYoIk5hbWVkIFBpcGUgOiAgICAtbnAgPHBpcGVuYW1lPiAoZS5nLiBhZmZwaXBlKVxuIik7CisJCXByaW50ZigiQW5vbnltb3VzIFBpcGU6IC1hcFxuIik7CisJfQorCXJldHVybiAwOworfQorCisKKy8vVGhyZWFkIFJvdXRpbmUgdGhhdCBjb25uZWN0cyB0byB0aGUgJ2NsaWVudCcuCit2b2lkIFMyQ1RocmVhZFByb2MoKQoreworCS8vTWFzdGVyIHNlcnZlcidzIGNvbm5lY3Rpb24gdG8gY2xpZW50LXNpZGUncyBzZXJ2ZXIuCisJYm9vc3Q6OnNoYXJlZF9wdHI8U2FtcGxlQ2FsbGJhY2tDbGllbnQ+IGNsaWVudHNydjsgLy9DbGllbnQgY2xhc3MgZnJvbSBUaHJpZnQtZ2VuZXJhdGVkIGNvZGUuCisJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCWlmKENsaWVudFBvcnRfICE9IDApCisJCXRocmlmdGNvbW1vbjo6Q29ubmVjdFRvU2VydmVyPFNhbXBsZUNhbGxiYWNrQ2xpZW50LCBUVHJhbnNwb3J0PihjbGllbnRzcnYsIHRyYW5zcG9ydCwgQ2xpZW50UG9ydF8pOworCWlmKCFDbGllbnRQaXBlTmFtZV8uZW1wdHkoKSkKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudHNydiwgdHJhbnNwb3J0LCBDbGllbnRQaXBlTmFtZV8pOworCisJdHJ5IHsKKwkJdHJhbnNwb3J0LT5vcGVuKCk7CisKKwkJY2xpZW50c3J2LT5waW5nY2xpZW50KCk7CisJCVNsZWVwKDE1MDApOworCQljbGllbnRzcnYtPnBpbmdjbGllbnQoKTsKKwkJU2xlZXAoMTUwMCk7CisJCWNsaWVudHNydi0+cGluZ2NsaWVudCgpOworCisJCXRyYW5zcG9ydC0+Y2xvc2UoKTsKKwl9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgeworCQlwcmludGYoIkVSUk9SOiAlc1xuIiwgdHgud2hhdCgpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2ogYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzliMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci52Y3hwcm9qCkBAIC0wLDAgKzEsMTA2IEBACis/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPnNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9Cb29zdC87Li4vLi4vLi4vLi4vQm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLi87Li4vLi4vLi4vbGliL2NwcC9zcmM7Li4vLi4vLi4vLi4vQm9vc3QvOy4uLy4uLy4uLy4uL0Jvb3N0L2Jvb3N0L3RyMTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPi4uLy4uLy4uL2xpYi9jcHAvJChDb25maWd1cmF0aW9uKTsuLi8uLi8uLi8uLi9Cb29zdC9saWI7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmxpYnRocmlmdC5saWI7d3MyXzMyLmxpYjtrZXJuZWwzMi5saWI7dXNlcjMyLmxpYjtnZGkzMi5saWI7d2luc3Bvb2wubGliO2NvbWRsZzMyLmxpYjthZHZhcGkzMi5saWI7c2hlbGwzMi5saWI7b2xlMzIubGliO29sZWF1dDMyLmxpYjt1dWlkLmxpYjtvZGJjMzIubGliO29kYmNjcDMyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9IlJlYWRNZS50eHQiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzdGRhZnguaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InRhcmdldHZlci5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFRocmlmdENvbW1vbi5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InN0ZGFmeC5jcHAiPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5DcmVhdGU8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2ouZmlsdGVycyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI2ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsNjYgQEAKKz88P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzt4c2Q8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPnJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXY7bWZjcmliYm9uLW1zPC9FeHRlbnNpb25zPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzXGdlbi1jcHAiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2RhYjY2ZGI4LWJjNDUtNDUxOC1hYWQyLTdhNzU2OTYyMjZlM308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9IlJlYWRNZS50eHQiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3RkYWZ4LmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InRhcmdldHZlci5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3RkYWZ4LmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxUaHJpZnRDb21tb24uY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zdGRhZnguY3BwIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zdGRhZnguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWZmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5jcHAKQEAgLTAsMCArMSw4IEBACisvLyBzdGRhZnguY3BwIDogc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBqdXN0IHRoZSBzdGFuZGFyZCBpbmNsdWRlcworLy8gc2VydmVyLnBjaCB3aWxsIGJlIHRoZSBwcmUtY29tcGlsZWQgaGVhZGVyCisvLyBzdGRhZngub2JqIHdpbGwgY29udGFpbiB0aGUgcHJlLWNvbXBpbGVkIHR5cGUgaW5mb3JtYXRpb24KKworI2luY2x1ZGUgInN0ZGFmeC5oIgorCisvLyBUT0RPOiByZWZlcmVuY2UgYW55IGFkZGl0aW9uYWwgaGVhZGVycyB5b3UgbmVlZCBpbiBTVERBRlguSAorLy8gYW5kIG5vdCBpbiB0aGlzIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDVhODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIHN0ZGFmeC5oIDogaW5jbHVkZSBmaWxlIGZvciBzdGFuZGFyZCBzeXN0ZW0gaW5jbHVkZSBmaWxlcywKKy8vIG9yIHByb2plY3Qgc3BlY2lmaWMgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSB1c2VkIGZyZXF1ZW50bHksIGJ1dAorLy8gYXJlIGNoYW5nZWQgaW5mcmVxdWVudGx5CisvLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInRhcmdldHZlci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorCisKKworLy8gVE9ETzogcmVmZXJlbmNlIGFkZGl0aW9uYWwgaGVhZGVycyB5b3VyIHByb2dyYW0gcmVxdWlyZXMgaGVyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci90YXJnZXR2ZXIuaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvdGFyZ2V0dmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjMDA4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvdGFyZ2V0dmVyLmgKQEAgLTAsMCArMSw4IEBACisjcHJhZ21hIG9uY2UKKworLy8gSW5jbHVkaW5nIFNES0RES1Zlci5oIGRlZmluZXMgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIFdpbmRvd3MgcGxhdGZvcm0uCisKKy8vIElmIHlvdSB3aXNoIHRvIGJ1aWxkIHlvdXIgYXBwbGljYXRpb24gZm9yIGEgcHJldmlvdXMgV2luZG93cyBwbGF0Zm9ybSwgaW5jbHVkZSBXaW5TREtWZXIuaCBhbmQKKy8vIHNldCB0aGUgX1dJTjMyX1dJTk5UIG1hY3JvIHRvIHRoZSBwbGF0Zm9ybSB5b3Ugd2lzaCB0byBzdXBwb3J0IGJlZm9yZSBpbmNsdWRpbmcgU0RLRERLVmVyLmguCisKKyNpbmNsdWRlIDxTREtEREtWZXIuaD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5iYXQgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdGhyaWZ0bWUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWVmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdGhyaWZ0bWUuYmF0CkBAIC0wLDAgKzEgQEAKK3RocmlmdC5leGUgLS1nZW4gY3BwIFNhbXBsZS50aHJpZnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5zaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE4ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLnNoCkBAIC0wLDAgKzEsMjQgQEAKKyMhL2Jpbi9iYXNoCisKK1RIUklGVF9DT01QSUxFUj0uL3RocmlmdAorT1VUUFVUX0ZPTERFUj0kUFdECisKK2lmIFsgISAtZSAiJHtUSFJJRlRfQ09NUElMRVJ9IiBdCit0aGVuCisgICBUSFJJRlRfQ09NUElMRVI9dGhyaWZ0CisgICBjb21tYW5kIC12ICAke1RIUklGVF9DT01QSUxFUn0gPi9kZXYvbnVsbCAyPiYxCisgICBpZiBbICQ/IC1lcSAxIF07IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgIGVjaG8gInRocmlmdCBjb21waWxlciBub3QgZm91bmQuIgorICAgICAgZWNobworICAgICAgZXhpdAorICAgZmkKK2ZpCisKKyR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgU2FtcGxlLnRocmlmdAorCitlY2hvCitlY2hvICJGaWxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkIGluIGdlbi1jcHAuIgorCitleGl0CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90cmFuc3BvcnQtc2FtcGxlLnNsbiBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90cmFuc3BvcnQtc2FtcGxlLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZhMWVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RyYW5zcG9ydC1zYW1wbGUuc2xuCkBAIC0wLDAgKzEsMjYgQEAKKz8KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJzZXJ2ZXIiLCAic2VydmVyXHNlcnZlci52Y3hwcm9qIiwgIns3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJjbGllbnQiLCAiY2xpZW50XGNsaWVudC52Y3hwcm9qIiwgIns4NUZCRkI1NC01MzBCLTQ5OEYtOUYzOC00NEJBMjA0RkFFNkF9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezcyRkNBRjI5LTUwNkQtNDE2NC05RkE2LUY1NEM1QzI4RTc5RH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXs4NUZCRkI1NC01MzBCLTQ5OEYtOUYzOC00NEJBMjA0RkFFNkF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTgzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKQEAgLTAsMCArMSw2MSBAQAorQXBhY2hlIFRocmlmdCBDZW50b3MgNi41IFZhZ3JhbnQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBkaXJlY3RvcnkgaXMgdGhlIFZhZ3JhbnQgcHJvamVjdCBkaXJlY3RvcnkgZm9yIEFwYWNoZSBUaHJpZnQgcnVubmluZyBvbiBDZW50b3MgNi41LiBUaGUgVmFncmFudGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgY29uZmlndXJlcyBhIFZhZ3JhbnQgcHJvdmlzaW9uZWQgVk0gbGF1bmNoZWQgdW5kZXIgVmlydHVhbEJveC4gVG8gdXNlIHRoaXMgcHJvamVjdCB5b3UgbXVzdCBoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgVmlydHVhbEJveCBhbmQgVmFncmFudCBpbnN0YWxsZWQgKGluIHRoYXQgb3JkZXIpLiBUbyBydW4gdGhlIFZNLCBvcGVuIGEgc2hlbGwsIGNsb25lIEFwYWNoZSBUaHJpZnQsIGNoYW5nZSB0byB0aGlzIGRpcmVjdG9yeSBhbmQgZW50ZXIgdGhlIFZhZ3JhbnQgdXAgY29tbWFuZC4KKworICAgJCBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKKyAgICQgY2QgdGhyaWZ0L2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41CisgICAkIHZhZ3JhbnQgdXAKKworVGhpcyB3aWxsIGRvd25sb2FkIGFuZCBsYXVuY2ggdGhlIGJhc2UgYm94IFZNIHVuZGVyIFZpcnR1YWxCb3ggYW5kIHJ1biB0aGUgQXBhY2hlIFRocmlmdCBwcm92aXNpb25pbmcgc2NyaXB0LiBUaGlzIHdpbGwgdGFrZSB1cCB0byBhbiBob3VyIGRlcGVuZGluZyBvbiB5b3VyIGhhcmR3YXJlIGFuZCBuZXR3b3JrLiBPbmNlIGNvbXBsZXRlIHlvdSBjYW4gbG9naW4gdG8gdGhlIGJveCB3aXRoIFZhZ3JhbnQgc3NoLiBUaGUgdGhyaWZ0IHNvdXJjZSB0cmVlIGZyb20geW91ciBob3N0IG9zIGlzIG1vdW50ZWQgYXQgL3RocmlmdC4KKworICAgJCB2YWdyYW50IHNzaAorICAgW3ZhZ3JhbnRAdGhyaWZ0IH5dJCBjZCAvdGhyaWZ0CisgICBbdmFncmFudEB0aHJpZnQgdGhyaWZ0XSQgY29tcGlsZXIvY3BwL3RocmlmdCAtLXZlcnNpb24KKyAgIFRocmlmdCB2ZXJzaW9uIDx2ZXJzaW9uPgorCitUaGUgcHJvdmlzaW9uaW5nIHNjcmlwdCAoaW5zaWRlIHRoZSBWYWdyYW50ZmlsZSkgcnVucyAuL2Jvb3RzdHJhcC5zaCwgLi9jb25maWd1cmUsIG1ha2UgYW5kIG1ha2UgY2hlY2ssIGJ1dCBkb2VzIG5vdCBpbnN0YWxsIHRocmlmdC4gVG8gaW5zdGFsbCB0aHJpZnQgcnVuICJtYWtlIGluc3RhbGwiLgorCitUaGUgVmFncmFudCBiYXNlIGJveCB1c2VkIGhlcmUgaXMgYSBtaW5pbWFsIENlbnRvcyA2LjUgVmlydHVhbEJveCB3aXRoIDJHQiBSQU0gYW5kIDIgQ1BVcy4gRm9yIG1vcmUgVmFncmFudCBpbmZvcm1hdGlvbjogaHR0cHM6Ly93d3cudmFncmFudHVwLmNvbS4gQSBzdW1tYXJ5IG9mIHRoZSBiYXNlIGJveCBwcmVwYXJhdGlvbiBmb2xsb3dzOgorCityb290IHBhc3N3b3JkOiB2YWdyYW50CisKKyNDcmVhdGUgdGhlIHZhZ3JhbnQgdXNlciBhbmQgZ2l2ZSBpdCBzdWRvIHBlcm1pc3Npb24KK2FkZHVzZXIgdmFncmFudAorcGFzc3dkIHZhZ3JhbnQKK3Zpc3VkbyAgOiAgdmFncmFudCBBTEw9KEFMTCkgTk9QQVNTV0Q6IEFMTAorICAgICAgICAgICAjRGVmYXVsdHMgcmVxdWlyZXR0eQorCisjU2h1dCBkb3duIHRoZSBmaXJld2FsbCBhbmQgZGlzYWJsZSBpdAorc2VydmljZSBpcHRhYmxlcyBzdG9wCitjaGtjb25maWcgaXB0YWJsZXMgb2ZmCisKKyNTZXR1cCB0aGUgdmFncmFudCBzc2ggcHVibGljIGtleSB0byBhbGxvdyB2YWdyYW50IHRvIHNzaAorbWtkaXIgL2hvbWUvdmFncmFudC8uc3NoCitjaG1vZCA3MDAgL2hvbWUvdmFncmFudC8uc3NoCitjZCAvaG9tZS92YWdyYW50Ly5zc2gKK3dnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAnaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9taXRjaGVsbGgvdmFncmFudC9tYXN0ZXIva2V5cy92YWdyYW50LnB1YicgLU8gYXV0aG9yaXplZF9rZXlzCitjaG1vZCA2MDAgL2hvbWUvdmFncmFudC8uc3NoL2F1dGhvcml6ZWRfa2V5cworY2hvd24gLVIgdmFncmFudCAvaG9tZS92YWdyYW50Ly5zc2gKKworI0luc3RhbGwgRVBFTCAoRXh0cmEgUGFja2FnZXMgZm9yIEVudGVycHJpc2UgTGludXgpIGJ1dCBwcm90ZWN0IHRoZSBiYXNlCisjcmVwb3NpdG9yaWVzIHNvIHRoYXQgRVBFTCBkb2VzIG5vdCBtYXNrIGJhc2UgcGFja2FnZXMKK3l1bSAteSBpbnN0YWxsIHl1bS1wbHVnaW4tcHJvdGVjdGJhc2UKK3JwbSAtVXZoIGh0dHA6Ly9kb3dubG9hZC5mZWRvcmFwcm9qZWN0Lm9yZy9wdWIvZXBlbC82L2kzODYvZXBlbC1yZWxlYXNlLTYtOC5ub2FyY2gucnBtCisKKyNJbnN0YWxsIHBlcmwsIGR5bmFtaWMga2VybmVsIG1vZHVsZXMsIGRldiB0b29scyBhbmQga2VybmVsIGhlYWRlcnMgdG8gc3VwcG9ydAorI1ZpcnR1YWwgYm94IGFkZGl0aW9ucworeXVtIC15IGluc3RhbGwgcGVybAoreXVtIC15IC0tZW5hYmxlcmVwbyBlcGVsIGluc3RhbGwgZGttcworeXVtIC15IGdyb3VwaW5zdGFsbCAiRGV2ZWxvcG1lbnQgVG9vbHMiCit5dW0gLXkgaW5zdGFsbCBrZXJuZWwtZGV2ZWwKKworI1VwZGF0ZSBldmVyeXRoaW5nIGFuZCByZWJvb3QKK3l1bSB1cGRhdGUKK3JlYm9vdAorCisjSW5zdGFsbCB0aGUgVmlydHVhbEJveCBHdWVzdCBhZGRpdGlvbnMgKHVzaW5nIFZpcnR1YWxCb3ggaXNvKQorbW91bnQgL2Rldi9jZHJvbSAvbW50CisvbW50L1ZCb3hMaW51eEFkZGl0aW9ucy5ydW4KK3Vtb3VudCAvbW50CisKK1NlZSB0aGUgVmFncmFudGZpbGUgZm9yIGZ1cnRoZXIgZGV0YWlscwpkaWZmIC0tZ2l0IGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEyMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKQEAgLTAsMCArMSwyNzQgQEAKKyMgLSotIG1vZGU6IHJ1YnkgLSotCisjIHZpOiBzZXQgZnQ9cnVieSA6CisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFQQUNIRSBUSFJJRlQgUFJPVklTSU9OSU5HIFNDUklQVAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGJhc2UgQ2VudG9zIDYuNQorIyBWYWdyYW50IGJveCBmb3IgQXBhY2hlIFRocmlmdCBjb21waWxlciBhbmQgbGliIGJ1aWxkcy4KKyMgVGhlIGJhc2UgYm94IGlzIENlbnRvcyA2LjUgd2l0aCBubyBhZGRpdGlvbmFsIHBhY2thZ2VzCisjIGV4Y2VwdCB0aG9zZSByZXF1aXJlZCB0byBzdXBwb3J0IFZpcnR1YWxCb3ggR3Vlc3QgdG9vbHM6CisjIHBlcmwsIGRrbXMsIGtlcm5lbC1kZXZlbCBhbmQgdGhlICJEZXZlbG9wbWVudCBUb29scyIgZ3JvdXAuCisjIFRoZSBlcGVsIHJlcG8gd2FzIGFsc28gYWRkZWQgYWxvbmcgd2l0aCB0aGUKKyMgeXVtLXBsdWdpbi1wcm90ZWN0YmFzZSBwYWNrYWdlIHRvIHByZWZlciBiYXNlIHJlcG8gcGFja2FnZXMuCisjIFRoZSBzY3JpcHQgYmVsb3cgcHJvdmlzaW9ucyBBTEwgbGFuZ3VhZ2VzLiBUaGlzIHdpbGwgdGFrZQorIyB0aW1lLiBZb3UgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBidWlsZCB0aW1lIGJ5IGNvbW1lbnRpbmcKKyMgb3V0IHRoZSBMSUIgcHJvdmlzaW9uaW5nIGZvciB1bmVlZGVkIGxhbmd1YWdlIGxpYnJhcmllcy4KKyMgRXhwZWN0IGZ1bGwgcHJvdmlzaW9uaW5nIHRvIHRha2UgMzAgbWludXRlcyBvbiBhIGZhc3QKKyMgbWFjaGluZSB3aXRoIGFuIGV4Y2VsbGVudCBJbnRlcm5ldCBjb25uZWN0aW9uIChhbmQgYW5vdGhlcgorIyAxNSBtaW51dGVzIGZvciB0aGUgYnVpbGQpLgorIworIyBNYWNoaW5lIGFjY291bnRzOgorIyAtIFVzZXI6IHZhZ3JhbnQvdmFncmFudAorIyAtIEFkbWluOiByb290L3ZhZ3JhbnQKKyMgVmFncmFudCBwdWJsaWMgc3NoIGtleSBhbHNvIGluc3RhbGxlZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJGJ1aWxkX2FuZF90ZXN0ID0gPDxTQ1JJUFQKK2VjaG8gIlByb3Zpc2lvbmluZyBzeXN0ZW0gdG8gY29tcGlsZSBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0LiIKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uX2JlZ2luCisKKyMgQXBhY2hlIFRocmlmdCBjb21waWxlciBkZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI2luc3RhbGwgYW4gdXBkYXRlZCBhdXRvY29uZgord2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9jb25mL2F1dG9jb25mLTIuNjkudGFyLmd6Cit0YXIgeHZmIGF1dG9jb25mLTIuNjkudGFyLmd6CitjZCBhdXRvY29uZi0yLjY5CisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCittYWtlCitzdWRvIG1ha2UgaW5zdGFsbAorY2QgLi4KKworI2luc3RhbGwgYW4gdXBkYXRlZCBhdXRvbWFrZQord2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9tYWtlL2F1dG9tYWtlLTEuMTQudGFyLmd6Cit0YXIgeHZmIGF1dG9tYWtlLTEuMTQudGFyLmd6CitjZCBhdXRvbWFrZS0xLjE0CisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCittYWtlCitzdWRvIG1ha2UgaW5zdGFsbAorY2QgLi4KKworI2luc3RhbGwgYW4gdXBkYXRlZCBiaXNvbgord2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2Jpc29uL2Jpc29uLTIuNS4xLnRhci5negordGFyIHh2ZiBiaXNvbi0yLjUuMS50YXIuZ3oKK2NkIGJpc29uLTIuNS4xCisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCittYWtlCitzdWRvIG1ha2UgaW5zdGFsbAorY2QgLi4KKworIyBDKys5OCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSAteSBpbnN0YWxsIGxpYmV2ZW50LWRldmVsIHpsaWItZGV2ZWwgb3BlbnNzbC1kZXZlbAorCisjSW5zdGFsbCBhbiB1cGRhdGVkIEJvb3N0IGxpYnJhcnkKK3dnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjU1LjAvYm9vc3RfMV81NV8wLnRhci5negordGFyIHh2ZiBib29zdF8xXzU1XzAudGFyLmd6CitjZCBib29zdF8xXzU1XzAKKy4vYm9vdHN0cmFwLnNoCitzdWRvIC4vYjIgaW5zdGFsbAorCisjIEphdmEgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBhbnQganVuaXQgYW50LW5vZGVwcyBhbnQtanVuaXQgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCisKKyMgUHl0aG9uIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcHl0aG9uLWRldmVsIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi10d2lzdGVkCisKKyMgUnVieSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IHJ1YnkgcnVieS1kZXZlbCBydWJ5Z2Vtcworc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBOb2RlLmpzIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbm9kZWpzIG5vZGVqcy1kZXZlbCBucG0KKworIyBQZXJsIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcGVybC1CaXQtVmVjdG9yIHBlcmwtQ2xhc3MtQWNjZXNzb3IgcGVybC1FeHRVdGlscy1NYWtlTWFrZXIgcGVybC1UZXN0LVNpbXBsZQorCisjIFBIUCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IHBocCBwaHAtZGV2ZWwgcGhwLXBlYXIgcmUyYworCisjIEdMaWJDIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKKworIyBFcmxhbmcgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBlcmxhbmcta2VybmVsIGVybGFuZy1lcnRzIGVybGFuZy1zdGRsaWIgZXJsYW5nLWV1bml0IGVybGFuZy1yZWJhcgorCisjIEx1YSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGx1YS1kZXZlbAorCisjIEdvIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgZ29sYW5nIGdvbGFuZy1wa2ctbGludXgtYW1kNjQKKworIyBDIyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IG1vbm8tY29yZSBtb25vLWRldmVsIG1vbm8td2ViLWRldmVsIG1vbm8tZXh0cmFzIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG1pbmd3MzItbnNpcworCisjIEhhc2tlbGwgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIword2dldCBodHRwOi8vc2hlcmtpbi5qdXN0aHViLm9yZy9lbDYvUlBNUy94ODZfNjQvanVzdGh1Yi1yZWxlYXNlLTIuMC00LjAuZWw2Lng4Nl82NC5ycG0KK3N1ZG8gcnBtIC1pdmgganVzdGh1Yi1yZWxlYXNlLTIuMC00LjAuZWw2Lng4Nl82NC5ycG0KK3N1ZG8geXVtIC15IGluc3RhbGwgaGFza2VsbAorc3VkbyBjYWJhbCB1cGRhdGUKK3N1ZG8gY2FiYWwgaW5zdGFsbCBjYWJhbC1pbnN0YWxsCisKKyMgQnVpbGQgYW5kIFRlc3QgQXBhY2hlIFRocmlmdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZGF0ZSA+IC9ldGMvdmFncmFudC5wcm92aXNpb25fZW5kCitlY2hvICJTdGFydGluZyBBcGFjaGUgVGhyaWZ0IGJ1aWxkLi4uIgorY2QgL3RocmlmdAorc2ggYm9vdHN0cmFwLnNoCisKKyMgQXQgdGhlIHRpbWUgb2YgdGhpcyBmaWxlJ3MgY3JlYXRpb24gUnVieSwgUHl0aG9uLCBHbyBhbmQgTHVhIGZhaWwKKyMgdGhlaXIgdW5pdCB0ZXN0cyBpbiB0aGlzIGVudmlyb25tZW50LiBUbyBidWlsZCBhbmQgdGVzdCBhbnkgb2YgdGhlc2UKKyMgbGlicmFyaWVzIHVuY29tbWVudCB0aGUgYXBwcm9wcmlhdGUgLS13aXRob3V0IHN3aXRjaGVzIGJlbG93LgorCitzaCBjb25maWd1cmUgLS13aXRob3V0LXJ1YnkgLS13aXRob3V0LWdvIC0td2l0aG91dC1sdWEgLS13aXRob3V0LXB5dGhvbgorbWFrZQorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCB0ZXN0cy4uLiIKK21ha2UgY2hlY2sKK2VjaG8gIkZpbmlzaGVkIGJ1aWxkaW5nIGFuZCB0ZXN0aW5nIEFwYWNoZSBUaHJpZnQuIgorZWNobyAnVXNlICJtYWtlIGluc3RhbGwiIHRvIGluc3RhbGwgdGhlIGNvbXBpbGVyIGFuZCBsaWJyYXJpZXMuJworZGF0ZSA+IC9ldGMvdmFncmFudC5tYWtlX2VuZAorCitTQ1JJUFQKKworVmFncmFudC5jb25maWd1cmUoIjIiKSBkbyB8Y29uZmlnfAorICAjIEV2ZXJ5IFZhZ3JhbnQgdmlydHVhbCBlbnZpcm9ubWVudCByZXF1aXJlcyBhIGJveCB0byBidWlsZCBvZmYgb2YuCisgICMjIyMjIENlbnRvcyA2LjUgbWluaW1hbCBzeXN0ZW0gd2l0aCBWaXJ0dWFsQm94IEd1ZXN0IEFkZGl0aW9ucworICAjIyMjIyBCb3ggbWFpbnRhaW5lZCBieSByYUBhcGFjaGUub3JnLCBzZWUgUkVBRE1FLm1kIGZvciBib3ggY29uZmlnCisgIGNvbmZpZy52bS5ib3ggPSAiUmFuZHlBYmVybmV0aHkvdGhyaWZ0LWNlbnRvcy02LjUtNjQiCisKKyAgIyBEaXNhYmxlIGF1dG9tYXRpYyBib3ggdXBkYXRlIGNoZWNraW5nLiBJZiB5b3UgZGlzYWJsZSB0aGlzLCB0aGVuCisgICMgYm94ZXMgd2lsbCBvbmx5IGJlIGNoZWNrZWQgZm9yIHVwZGF0ZXMgd2hlbiB0aGUgdXNlciBydW5zCisgICMgYHZhZ3JhbnQgYm94IG91dGRhdGVkYC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuCisgICMjIyMjIFRoaXMgYm94IHdpbGwgbmV2ZXIgY2hhbmdlCisgIGNvbmZpZy52bS5ib3hfY2hlY2tfdXBkYXRlID0gZmFsc2UKKworICAjIENyZWF0ZSBhIGZvcndhcmRlZCBwb3J0IG1hcHBpbmcgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byBhIHNwZWNpZmljIHBvcnQKKyAgIyB3aXRoaW4gdGhlIG1hY2hpbmUgZnJvbSBhIHBvcnQgb24gdGhlIGhvc3QgbWFjaGluZS4gSW4gdGhlIGV4YW1wbGUgYmVsb3csCisgICMgYWNjZXNzaW5nICJsb2NhbGhvc3Q6ODA4MCIgd2lsbCBhY2Nlc3MgcG9ydCA4MCBvbiB0aGUgZ3Vlc3QgbWFjaGluZS4KKyAgIyBjb25maWcudm0ubmV0d29yayAiZm9yd2FyZGVkX3BvcnQiLCBndWVzdDogODAsIGhvc3Q6IDgwODAKKworICAjIENyZWF0ZSBhIHByaXZhdGUgbmV0d29yaywgd2hpY2ggYWxsb3dzIGhvc3Qtb25seSBhY2Nlc3MgdG8gdGhlIG1hY2hpbmUKKyAgIyB1c2luZyBhIHNwZWNpZmljIElQLgorICAjIGNvbmZpZy52bS5uZXR3b3JrICJwcml2YXRlX25ldHdvcmsiLCBpcDogIjE5Mi4xNjguMzMuMTAiCisKKyAgIyBDcmVhdGUgYSBwdWJsaWMgbmV0d29yaywgd2hpY2ggZ2VuZXJhbGx5IG1hdGNoZWQgdG8gYnJpZGdlZCBuZXR3b3JrLgorICAjIEJyaWRnZWQgbmV0d29ya3MgbWFrZSB0aGUgbWFjaGluZSBhcHBlYXIgYXMgYW5vdGhlciBwaHlzaWNhbCBkZXZpY2Ugb24KKyAgIyB5b3VyIG5ldHdvcmsuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgInB1YmxpY19uZXR3b3JrIgorCisgICMgSWYgdHJ1ZSwgdGhlbiBhbnkgU1NIIGNvbm5lY3Rpb25zIG1hZGUgd2lsbCBlbmFibGUgYWdlbnQgZm9yd2FyZGluZy4KKyAgIyBEZWZhdWx0IHZhbHVlOiBmYWxzZQorICAjIGNvbmZpZy5zc2guZm9yd2FyZF9hZ2VudCA9IHRydWUKKworICAjIFNoYXJlIGFuIGFkZGl0aW9uYWwgZm9sZGVyIHRvIHRoZSBndWVzdCBWTS4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzCisgICMgdGhlIHBhdGggb24gdGhlIGhvc3QgdG8gdGhlIGFjdHVhbCBmb2xkZXIuIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMKKyAgIyB0aGUgcGF0aCBvbiB0aGUgZ3Vlc3QgdG8gbW91bnQgdGhlIGZvbGRlci4gQW5kIHRoZSBvcHRpb25hbCB0aGlyZAorICAjIGFyZ3VtZW50IGlzIGEgc2V0IG9mIG5vbi1yZXF1aXJlZCBvcHRpb25zLgorICAjIGNvbmZpZy52bS5zeW5jZWRfZm9sZGVyICIuLi9kYXRhIiwgIi92YWdyYW50X2RhdGEiCisgICMjIyMjIEJ5IGNvbnZlbnRpb24gdGhlIHRocmlmdCBzb3VyY2UgdHJlZSBpcyBtYXBwZWQgdG8gL3RocmlmdAorICBjb25maWcudm0uc3luY2VkX2ZvbGRlciAiLi4vLi4vLi4vIiwgIi90aHJpZnQiCisKKyAgIyBQcm92aWRlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIHNvIHlvdSBjYW4gZmluZS10dW5lIHZhcmlvdXMKKyAgIyBiYWNraW5nIHByb3ZpZGVycyBmb3IgVmFncmFudC4gVGhlc2UgZXhwb3NlIHByb3ZpZGVyLXNwZWNpZmljIG9wdGlvbnMuCisgICMjIyMjIFRoZSBtYWNoaW5lIG5lZWRzIDIgQ1BVcyBhbmQgMkdCIFJBTSBmb3IgcmVhc29uYWJsZSBwZXJmb3JtYW5jZQorICBjb25maWcudm0ucHJvdmlkZXIgInZpcnR1YWxib3giIGRvIHx2YnwKKyAgICB2Yi5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tbWVtb3J5IiwgIjIwNDgiXQorICAgIHZiLmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1jcHVzIiwgIjIiXQorICBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBDRkVuZ2luZS4gQ0ZFbmdpbmUgQ29tbXVuaXR5IHBhY2thZ2VzIGFyZQorICAjIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkLiBGb3IgZXhhbXBsZSwgY29uZmlndXJlIHRoZSBob3N0IGFzIGEKKyAgIyBwb2xpY3kgc2VydmVyIGFuZCBvcHRpb25hbGx5IGEgcG9saWN5IGZpbGUgdG8gcnVuOgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2ZlbmdpbmUiIGRvIHxjZnwKKyAgIyAgIGNmLmFtX3BvbGljeV9odWIgPSB0cnVlCisgICMgICAjIGNmLnJ1bl9maWxlID0gIm1vdGQuY2YiCisgICMgZW5kCisgICMKKyAgIyBZb3UgY2FuIGFsc28gY29uZmlndXJlIGFuZCBib290c3RyYXAgYSBjbGllbnQgdG8gYW4gZXhpc3RpbmcKKyAgIyBwb2xpY3kgc2VydmVyOgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2ZlbmdpbmUiIGRvIHxjZnwKKyAgIyAgIGNmLnBvbGljeV9zZXJ2ZXJfYWRkcmVzcyA9ICIxMC4wLjIuMTUiCisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggUHVwcGV0IHN0YW5kIGFsb25lLiAgUHVwcGV0IG1hbmlmZXN0cworICAjIGFyZSBjb250YWluZWQgaW4gYSBkaXJlY3RvcnkgcGF0aCByZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlLgorICAjIFlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBtYW5pZmVzdHMgZGlyZWN0b3J5IGFuZCBhIG1hbmlmZXN0IGluCisgICMgdGhlIGZpbGUgZGVmYXVsdC5wcCBpbiB0aGUgbWFuaWZlc3RzX3BhdGggZGlyZWN0b3J5LgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAicHVwcGV0IiBkbyB8cHVwcGV0fAorICAjICAgcHVwcGV0Lm1hbmlmZXN0c19wYXRoID0gIm1hbmlmZXN0cyIKKyAgIyAgIHB1cHBldC5tYW5pZmVzdF9maWxlICA9ICJkZWZhdWx0LnBwIgorICAjIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIGNoZWYgc29sbywgc3BlY2lmeWluZyBhIGNvb2tib29rcyBwYXRoLCByb2xlcworICAjIHBhdGgsIGFuZCBkYXRhX2JhZ3MgcGF0aCAoYWxsIHJlbGF0aXZlIHRvIHRoaXMgVmFncmFudGZpbGUpLCBhbmQgYWRkaW5nCisgICMgc29tZSByZWNpcGVzIGFuZC9vciByb2xlcy4KKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gImNoZWZfc29sbyIgZG8gfGNoZWZ8CisgICMgICBjaGVmLmNvb2tib29rc19wYXRoID0gIi4uL215LXJlY2lwZXMvY29va2Jvb2tzIgorICAjICAgY2hlZi5yb2xlc19wYXRoID0gIi4uL215LXJlY2lwZXMvcm9sZXMiCisgICMgICBjaGVmLmRhdGFfYmFnc19wYXRoID0gIi4uL215LXJlY2lwZXMvZGF0YV9iYWdzIgorICAjICAgY2hlZi5hZGRfcmVjaXBlICJteXNxbCIKKyAgIyAgIGNoZWYuYWRkX3JvbGUgIndlYiIKKyAgIworICAjICAgIyBZb3UgbWF5IGFsc28gc3BlY2lmeSBjdXN0b20gSlNPTiBhdHRyaWJ1dGVzOgorICAjICAgY2hlZi5qc29uID0geyBteXNxbF9wYXNzd29yZDogImZvbyIgfQorICAjIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIGNoZWYgc2VydmVyLCBzcGVjaWZ5aW5nIHRoZSBjaGVmIHNlcnZlciBVUkwsCisgICMgYW5kIHRoZSBwYXRoIHRvIHRoZSB2YWxpZGF0aW9uIGtleSAocmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZSkuCisgICMKKyAgIyBUaGUgT3BzY29kZSBQbGF0Zm9ybSB1c2VzIEhUVFBTLiBTdWJzdGl0dXRlIHlvdXIgb3JnYW5pemF0aW9uIGZvcgorICAjIE9SR05BTUUgaW4gdGhlIFVSTCBhbmQgdmFsaWRhdGlvbiBrZXkuCisgICMKKyAgIyBJZiB5b3UgaGF2ZSB5b3VyIG93biBDaGVmIFNlcnZlciwgdXNlIHRoZSBhcHByb3ByaWF0ZSBVUkwsIHdoaWNoIG1heSBiZQorICAjIEhUVFAgaW5zdGVhZCBvZiBIVFRQUyBkZXBlbmRpbmcgb24geW91ciBjb25maWd1cmF0aW9uLiBBbHNvIGNoYW5nZSB0aGUKKyAgIyB2YWxpZGF0aW9uIGtleSB0byB2YWxpZGF0aW9uLnBlbS4KKyAgIworICAjIGNvbmZpZy52bS5wcm92aXNpb24gImNoZWZfY2xpZW50IiBkbyB8Y2hlZnwKKyAgIyAgIGNoZWYuY2hlZl9zZXJ2ZXJfdXJsID0gImh0dHBzOi8vYXBpLm9wc2NvZGUuY29tL29yZ2FuaXphdGlvbnMvT1JHTkFNRSIKKyAgIyAgIGNoZWYudmFsaWRhdGlvbl9rZXlfcGF0aCA9ICJPUkdOQU1FLXZhbGlkYXRvci5wZW0iCisgICMgZW5kCisgICMKKyAgIyBJZiB5b3UncmUgdXNpbmcgdGhlIE9wc2NvZGUgcGxhdGZvcm0sIHlvdXIgdmFsaWRhdG9yIGNsaWVudCBpcworICAjIE9SR05BTUUtdmFsaWRhdG9yLCByZXBsYWNpbmcgT1JHTkFNRSB3aXRoIHlvdXIgb3JnYW5pemF0aW9uIG5hbWUuCisgICMKKyAgIyBJZiB5b3UgaGF2ZSB5b3VyIG93biBDaGVmIFNlcnZlciwgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBjbGllbnQgbmFtZSBpcworICAjIGNoZWYtdmFsaWRhdG9yLCB1bmxlc3MgeW91IGNoYW5nZWQgdGhlIGNvbmZpZ3VyYXRpb24uCisgICMKKyAgIyAgIGNoZWYudmFsaWRhdGlvbl9jbGllbnRfbmFtZSA9ICJPUkdOQU1FLXZhbGlkYXRvciIKKworICAjIyMjIyBSdW4gdGhlIEFwYWNoZSBUaHJpZnQgcHJvdmlzaW9uaW5nIHNjcmlwdCAoZGVjbGFyZWQgYWJvdmUpCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6aW5saW5lID0+ICRidWlsZF9hbmRfdGVzdAorZW5kCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9NYWtlZmlsZSBiL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCmluZGV4IGExZDcxNTYuLmVlMzk4ZTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCkBAIC0xLDYgKzEsNCBAQAogVEhSSUZUID0gdGhyaWZ0Ci1DWFhGTEFHUyA9IGBwa2ctY29uZmlnIC0tY2ZsYWdzIGxpYnptcSB0aHJpZnRgCi1MRExJQlMgPSBgcGtnLWNvbmZpZyAtLWxpYnMgbGliem1xIHRocmlmdGAKIAogQ1hYRkxBR1MgKz0gLWczIC1PMAogCkBAIC0xNiwxNSArMTQsMTkgQEAKIGFsbDogJChQWUxJQlMpICQoUFJPR1MpCiAKIHRlc3QtY2xpZW50OiB0ZXN0LWNsaWVudC5vIFRabXFDbGllbnQubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0CiB0ZXN0LXNlcnZlcjogdGVzdC1zZXJ2ZXIubyBUWm1xU2VydmVyLm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAogdGVzdC1zZW5kZXI6IHRlc3Qtc2VuZGVyLm8gVFptcUNsaWVudC5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKIHRlc3QtcmVjZWl2ZXI6IHRlc3QtcmVjZWl2ZXIubyBUWm1xU2VydmVyLm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAogCiB0ZXN0LWNsaWVudC5vIHRlc3Qtc2VydmVyLm8gdGVzdC1zZW5kZXIubyB0ZXN0LXJlY2VpdmVyLm86ICQoR0VOU1JDUykKIAogc3RvcmFnZS9fX2luaXRfXy5weTogc3RvcmFnZS50aHJpZnQKIAkkKFJNKSAkKGRpciAkQCkKLQkkKFRIUklGVCkgLS1nZW4gcHk6bmV3c3R5bGUgJDwKKwkkKFRIUklGVCkgLS1nZW4gcHkgJDwKIAltdiBnZW4tcHkvJChkaXIgJEApIC4KIAogJChHRU5TUkNTKTogc3RvcmFnZS50aHJpZnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1JFQURNRSBiL2NvbnRyaWIvemVyb21xL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi96ZXJvbXEvUkVBRE1FCnJlbmFtZSB0byBjb250cmliL3plcm9tcS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuY3BwIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAKaW5kZXggMTMzMjA0ZS4uNTYyNzhmMyAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotdWludDMyX3QgVFptcUNsaWVudDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewordWludDMyX3QgVFptcUNsaWVudDo6cmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIGlmIChyYnVmXy5hdmFpbGFibGVfcmVhZCgpID09IDApIHsKICAgICAodm9pZClzb2NrXy5yZWN2KCZtc2dfKTsKICAgICByYnVmXy5yZXNldEJ1ZmZlcigodWludDhfdCopbXNnXy5kYXRhKCksIG1zZ18uc2l6ZSgpKTsKQEAgLTMwLDExICszMCwxMSBAQAogICByZXR1cm4gcmJ1Zl8ucmVhZChidWYsIGxlbik7CiB9CiAKLXZvaWQgVFptcUNsaWVudDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKK3ZvaWQgVFptcUNsaWVudDo6d3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICByZXR1cm4gd2J1Zl8ud3JpdGUoYnVmLCBsZW4pOwogfQogCi12b2lkIFRabXFDbGllbnQ6OndyaXRlRW5kKCkgewordWludDMyX3QgVFptcUNsaWVudDo6d3JpdGVFbmQoKSB7CiAgIHVpbnQ4X3QqIGJ1ZjsKICAgdWludDMyX3Qgc2l6ZTsKICAgd2J1Zl8uZ2V0QnVmZmVyKCZidWYsICZzaXplKTsKQEAgLTQyLDYgKzQyLDcgQEAKICAgc3RkOjptZW1jcHkobXNnLmRhdGEoKSwgYnVmLCBzaXplKTsKICAgKHZvaWQpc29ja18uc2VuZChtc2cpOwogICB3YnVmXy5yZXNldEJ1ZmZlcih0cnVlKTsKKyAgcmV0dXJuIHNpemU7CiB9CiAKIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmggYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmgKaW5kZXggOTU0NDUwMy4uZGYxNmUwMyAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaApAQCAtMjEsNyArMjEsNyBAQAogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UWk1RQ0xJRU5UX0hfIDEKIAogI2luY2x1ZGUgPHptcS5ocHA+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCkBAIC00NSwxNSArNDUsMTUgQEAKICAgICB9CiAgIH0KIAotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB2b2lkIHdyaXRlRW5kKCk7CisgIHVpbnQzMl90IHdyaXRlRW5kKCk7CiAKICBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6c3RyaW5nIGVuZHBvaW50XzsKICAgem1xOjpzb2NrZXRfdCBzb2NrXzsKKyAgc3RkOjpzdHJpbmcgZW5kcG9pbnRfOwogICBUTWVtb3J5QnVmZmVyIHdidWZfOwogICBUTWVtb3J5QnVmZmVyIHJidWZfOwogICB6bXE6Om1lc3NhZ2VfdCBtc2dfOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weSBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKaW5kZXggZDU2MDY5Ny4uMWJkNjBhMSAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weQorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CkBAIC0yMCw0NCArMjAsNDUgQEAKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQKIAorCiBjbGFzcyBUWm1xQ2xpZW50KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICBkZWYgX19pbml0X18oc2VsZiwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKLSAgICBzZWxmLl9zb2NrID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCi0gICAgc2VsZi5fZW5kcG9pbnQgPSBlbmRwb2ludAotICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKKyAgICAgICAgc2VsZi5fc29jayA9IGN0eC5zb2NrZXQoc29ja190eXBlKQorICAgICAgICBzZWxmLl9lbmRwb2ludCA9IGVuZHBvaW50CisgICAgICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgc2VsZi5fc29jay5jb25uZWN0KHNlbGYuX2VuZHBvaW50KQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLl9zb2NrLmNvbm5lY3Qoc2VsZi5fZW5kcG9pbnQpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6Ci0gICAgcmV0ID0gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKLSAgICBzZWxmLl9yZWFkX21lc3NhZ2UoKQotICAgIHJldHVybiBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0ID0gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYuX3JlYWRfbWVzc2FnZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKIAotICBkZWYgX3JlYWRfbWVzc2FnZShzZWxmKToKLSAgICBtc2cgPSBzZWxmLl9zb2NrLnJlY3YoKQotICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhtc2cpCisgICAgZGVmIF9yZWFkX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3NvY2sucmVjdigpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhtc2cpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBtc2cgPSBzZWxmLl93YnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX3NvY2suc2VuZChtc2cpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl93YnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fc29jay5zZW5kKG1zZykKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9yYnVmCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmCiAKLSAgIyBOT1RFOiBUaGlzIHdpbGwgcHJvYmFibHkgbm90IGFjdHVhbGx5IHdvcmsuCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKLSAgICAgIHNlbGYucmVhZF9tZXNzYWdlKCkKLSAgICAgIHByZWZpeCArPSBzZWxmLl9yYnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8ocHJlZml4KQotICAgIHJldHVybiBzZWxmLl9yYnVmCisgICAgIyBOT1RFOiBUaGlzIHdpbGwgcHJvYmFibHkgbm90IGFjdHVhbGx5IHdvcmsuCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYucmVhZF9tZXNzYWdlKCkKKyAgICAgICAgICAgIHByZWZpeCArPSBzZWxmLl9yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKaW5kZXggYzYxNDJkNy4uODg2NjBhMyAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKQEAgLTE4LDE2ICsxOCwxNSBAQAogICovCiAKICNpbmNsdWRlICJUWm1xU2VydmVyLmgiCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CiAKLQogYm9vbCBUWm1xU2VydmVyOjpzZXJ2ZU9uZShpbnQgcmVjdl9mbGFncykgewogICB6bXE6Om1lc3NhZ2VfdCBtc2c7CiAgIGJvb2wgcmVjZWl2ZWQgPSBzb2NrXy5yZWN2KCZtc2csIHJlY3ZfZmxhZ3MpOwpAQCAtNDAsOCArMzksOSBAQAogICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkpOwogICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2woCiAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIpOwogCi0gIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKIAogICBpZiAoem1xX3R5cGVfID09IFpNUV9SRVApIHsKICAgICB1aW50OF90KiBidWY7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmggYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKaW5kZXggMTYwM2VhYy4uZWNkMTNiNCAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaApAQCAtMjAsMTcgKzIwLDE5IEBACiAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RaTVFTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXyAxCiAKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8em1xLmhwcD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewogCiBjbGFzcyBUWm1xU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewogIHB1YmxpYzoKICAgVFptcVNlcnZlcigKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCiAgICAgICB6bXE6OmNvbnRleHRfdCYgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyYgZW5kcG9pbnQsIGludCB0eXBlKQogICAgIDogVFNlcnZlcihwcm9jZXNzb3IpCisgICAgLCBwcm9jZXNzb3JfKHByb2Nlc3NvcikKICAgICAsIHptcV90eXBlXyh0eXBlKQogICAgICwgc29ja18oY3R4LCB0eXBlKQogICB7CkBAIC01NSw2ICs1Nyw3IEBACiAgIH0KIAogIHByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwogICBpbnQgem1xX3R5cGVfOwogICB6bXE6OnNvY2tldF90IHNvY2tfOwogfTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CmluZGV4IGM4M2NjOGQuLjE1YzE1NDMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weQpAQCAtMjEsNTggKzIxLDU5IEBACiBpbXBvcnQgdGhyaWZ0LnNlcnZlci5UU2VydmVyCiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0CiAKKwogY2xhc3MgVFptcVNlcnZlcih0aHJpZnQuc2VydmVyLlRTZXJ2ZXIuVFNlcnZlcik6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6Ci0gICAgdGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lKQotICAgIHNlbGYuem1xX3R5cGUgPSBzb2NrX3R5cGUKLSAgICBzZWxmLnNvY2tldCA9IGN0eC5zb2NrZXQoc29ja190eXBlKQotICAgIHNlbGYuc29ja2V0LmJpbmQoZW5kcG9pbnQpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKKyAgICAgICAgdGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lKQorICAgICAgICBzZWxmLnptcV90eXBlID0gc29ja190eXBlCisgICAgICAgIHNlbGYuc29ja2V0ID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCisgICAgICAgIHNlbGYuc29ja2V0LmJpbmQoZW5kcG9pbnQpCiAKLSAgZGVmIHNlcnZlT25lKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuc29ja2V0LnJlY3YoKQotICAgIGl0cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZykKLSAgICBvdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICBkZWYgc2VydmVPbmUoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuc29ja2V0LnJlY3YoKQorICAgICAgICBpdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cpCisgICAgICAgIG90cmFucyA9IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKKyAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICB0cnk6Ci0gICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQotICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQorICAgICAgICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCiAKLSAgICBpZiBzZWxmLnptcV90eXBlID09IHptcS5SRVA6Ci0gICAgICBtc2cgPSBvdHJhbnMuZ2V0dmFsdWUoKQotICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCisgICAgICAgIGlmIHNlbGYuem1xX3R5cGUgPT0gem1xLlJFUDoKKyAgICAgICAgICAgIG1zZyA9IG90cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKG1zZykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuc2VydmVPbmUoKQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuc2VydmVPbmUoKQogCiAKIGNsYXNzIFRabXFNdWx0aVNlcnZlcihvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJzID0gW10KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVycyA9IFtdCiAKLSAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQgPSAtMSk6Ci0gICAgc2VsZi5fc2VydmVBY3RpdmUoc2VsZi5fc2V0dXBQb2xsKCksIHRpbWVvdXQpCisgICAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQ9LTEpOgorICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShzZWxmLl9zZXR1cFBvbGwoKSwgdGltZW91dCkKIAotICBkZWYgc2VydmVGb3JldmVyKHNlbGYpOgotICAgIHBvbGxfaW5mbyA9IHNlbGYuX3NldHVwUG9sbCgpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHBvbGxfaW5mbywgLTEpCisgICAgZGVmIHNlcnZlRm9yZXZlcihzZWxmKToKKyAgICAgICAgcG9sbF9pbmZvID0gc2VsZi5fc2V0dXBQb2xsKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlQWN0aXZlKHBvbGxfaW5mbywgLTEpCiAKLSAgZGVmIF9zZXR1cFBvbGwoc2VsZik6Ci0gICAgc2VydmVyX21hcCA9IHt9Ci0gICAgcG9sbGVyID0gem1xLlBvbGxlcigpCi0gICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcnM6Ci0gICAgICBzZXJ2ZXJfbWFwW3NlcnZlci5zb2NrZXRdID0gc2VydmVyCi0gICAgICBwb2xsZXIucmVnaXN0ZXIoc2VydmVyLnNvY2tldCwgem1xLlBPTExJTikKLSAgICByZXR1cm4gKHNlcnZlcl9tYXAsIHBvbGxlcikKKyAgICBkZWYgX3NldHVwUG9sbChzZWxmKToKKyAgICAgICAgc2VydmVyX21hcCA9IHt9CisgICAgICAgIHBvbGxlciA9IHptcS5Qb2xsZXIoKQorICAgICAgICBmb3Igc2VydmVyIGluIHNlbGYuc2VydmVyczoKKyAgICAgICAgICAgIHNlcnZlcl9tYXBbc2VydmVyLnNvY2tldF0gPSBzZXJ2ZXIKKyAgICAgICAgICAgIHBvbGxlci5yZWdpc3RlcihzZXJ2ZXIuc29ja2V0LCB6bXEuUE9MTElOKQorICAgICAgICByZXR1cm4gKHNlcnZlcl9tYXAsIHBvbGxlcikKIAotICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6Ci0gICAgKHNlcnZlcl9tYXAsIHBvbGxlcikgPSBwb2xsX2luZm8KLSAgICByZWFkeSA9IGRpY3QocG9sbGVyLnBvbGwoKSkKLSAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKLSAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCi0gICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKKyAgICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6CisgICAgICAgIChzZXJ2ZXJfbWFwLCBwb2xsZXIpID0gcG9sbF9pbmZvCisgICAgICAgIHJlYWR5ID0gZGljdChwb2xsZXIucG9sbCgpKQorICAgICAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKKyAgICAgICAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MgYi9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyY2Q0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhc3NlbWJseSBpcyBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy4KKy8vIENoYW5nZSB0aGVtIHRvIHRoZSB2YWx1ZXMgc3BlY2lmaWMgdG8geW91ciBwcm9qZWN0LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlptcVNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJabXEgRXhhbXBsZXMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFRoZSBhc3NlbWJseSB2ZXJzaW9uIGhhcyB0aGUgZm9ybWF0ICJ7TWFqb3J9LntNaW5vcn0ue0J1aWxkfS57UmV2aXNpb259Ii4KKy8vIFRoZSBmb3JtICJ7TWFqb3J9LntNaW5vcn0uKiIgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgYnVpbGQgYW5kIHJldmlzaW9uLAorLy8gYW5kICJ7TWFqb3J9LntNaW5vcn0ue0J1aWxkfS4qIiB3aWxsIHVwZGF0ZSBqdXN0IHRoZSByZXZpc2lvbi4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCisKKy8vIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaWduaW5nIGtleSBmb3IgdGhlIGFzc2VtYmx5LAorLy8gaWYgZGVzaXJlZC4gU2VlIHRoZSBNb25vIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2lnbmluZy4KKworLy9bYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KKy8vW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIiIpXQorCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvTWFpbi5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9NYWluLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmNmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvTWFpbi5jcwpAQCAtMCwwICsxLDYwIEBACit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgWk1ROwordXNpbmcgWm1xU2VydmVyOwordXNpbmcgWm1xQ2xpZW50OworCituYW1lc3BhY2UgWm1xU2VydmVyCit7CisJY2xhc3MgTWFpbkNsYXNzCisJeworCQlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbiAoc3RyaW5nW10gYXJncykKKwkJeworCQkJbmV3IFRocmVhZChTZXJ2ZXIuc2VydmUpLlN0YXJ0KCk7CisJCQlDbGllbnQud29yaygpOworCQl9CisJCQorCQlzdGF0aWMgY2xhc3MgU2VydmVyeworCQkJcHVibGljIHN0YXRpYyB2b2lkIHNlcnZlKCl7CisJCQkJU3RvcmFnZUhhbmRsZXIgcz1uZXcgU3RvcmFnZUhhbmRsZXIoKTsKKwkJCQlTdG9yYWdlLlByb2Nlc3NvciBwPW5ldyBTdG9yYWdlLlByb2Nlc3NvcihzKTsKKwkJCQkKKwkJCQlaTVEuQ29udGV4dCBjPW5ldyBaTVEuQ29udGV4dCgpOworCQkJCQorCQkJCVRabXFTZXJ2ZXIgdHpzPW5ldyBUWm1xU2VydmVyKHAsYywidGNwOi8vMTI3LjAuMC4xOjkwOTAiLFpNUS5Tb2NrZXRUeXBlLlBBSVIpOworCQkJCXR6cy5TZXJ2ZSgpOworCQkJfQorCQkJCisJCQljbGFzcyBTdG9yYWdlSGFuZGxlcjpTdG9yYWdlLklmYWNleworCQkJCWludCB2YWw9MDsKKwkJCQkKKwkJCQlwdWJsaWMgdm9pZCBpbmNyKGludCBhbW91bnQpeworCQkJCQl2YWwrPWFtb3VudDsKKwkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoImluY3IoezB9KSIsYW1vdW50KTsKKwkJCQl9CisJCQkJCisJCQkJcHVibGljIGludCBnZXQoKXsKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCQl9IAorCQkJfQorCQl9CisJCQorCQlzdGF0aWMgY2xhc3MgQ2xpZW50eworCQkJcHVibGljIHN0YXRpYyB2b2lkIHdvcmsoKQorCQkJeworCQkJCUNvbnRleHQgY3R4PW5ldyBDb250ZXh0KCk7CisJCQkJVFptcUNsaWVudCB0emM9bmV3IFRabXFDbGllbnQoY3R4LCJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCIsU29ja2V0VHlwZS5QQUlSKTsKKwkJCQlUQmluYXJ5UHJvdG9jb2wgcD1uZXcgVEJpbmFyeVByb3RvY29sKHR6Yyk7CisJCQkJCisJCQkJU3RvcmFnZS5DbGllbnQgY2xpZW50PW5ldyBTdG9yYWdlLkNsaWVudChwKTsKKwkJCQl0emMuT3BlbigpOworCQkJCQorCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGNsaWVudC5AZ2V0KCkpOworCQkJCWNsaWVudC5pbmNyKDEpOworCQkJCWNsaWVudC5pbmNyKDQxKTsKKwkJCQlDb25zb2xlLldyaXRlTGluZShjbGllbnQuQGdldCgpKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYjUxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzCkBAIC0wLDAgKzEsNzggQEAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFpNUTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBabXFDbGllbnQKK3sKKwlwdWJsaWMgY2xhc3MgVFptcUNsaWVudCA6IFRUcmFuc3BvcnQKKwl7CisJCVNvY2tldCBfc29jazsKKwkJU3RyaW5nIF9lbmRwb2ludDsKKwkJTWVtb3J5U3RyZWFtIF93YnVmID0gbmV3IE1lbW9yeVN0cmVhbSAoKTsKKwkJTWVtb3J5U3RyZWFtIF9yYnVmID0gbmV3IE1lbW9yeVN0cmVhbSAoKTsKKworCQl2b2lkIGRlYnVnIChzdHJpbmcgbXNnKQorCQl7CisJCQkvL1VuY29tbWVudCB0byBlbmFibGUgZGVidWcKKy8vCQkJQ29uc29sZS5Xcml0ZUxpbmUgKG1zZyk7CisJCX0KKworCQlwdWJsaWMgVFptcUNsaWVudCAoQ29udGV4dCBjdHgsIFN0cmluZyBlbmRwb2ludCwgU29ja2V0VHlwZSBzb2NrVHlwZSkKKwkJeworCQkJX3NvY2sgPSBjdHguU29ja2V0IChzb2NrVHlwZSk7CisJCQlfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4gKCkKKwkJeworCQkJX3NvY2suQ29ubmVjdCAoX2VuZHBvaW50KTsKKwkJfQorCQkKKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UgKCkKKwkJeworCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuIHsKKwkJCWdldCB7CisJCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOworCQkJfQorCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkIChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorCQl7CisJCQlkZWJ1ZyAoIkNsaWVudF9SZWFkIik7CisJCQlpZiAob2ZmICE9IDAgfHwgbGVuICE9IGJ1Zi5MZW5ndGgpCisJCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOworCisJCQlpZiAoX3JidWYuTGVuZ3RoID09IDApIHsKKwkJCQkvL0ZpbGwgdGhlIEJ1ZmZlciB3aXRoIHRoZSBjb21wbGV0ZSBaTVEgTWVzc2FnZSB3aGljaCBuZWVkcyB0byBiZSg/ISkgdGhlIGNvbXBsZXRlIFRocmlmdCByZXNwb25zZQorCQkJCWRlYnVnICgiQ2xpZW50X1JlYWQgRmlsbGluZyBidWZmZXIuLiIpOworCQkJCWJ5dGVbXSB0bXBCdWYgPSBfc29jay5SZWN2ICgpOworCQkJCWRlYnVnIChzdHJpbmcuRm9ybWF0KCJDbGllbnRfUmVhZCBmaWxsZWQgd2l0aCB7MH1iIix0bXBCdWYuTGVuZ3RoKSk7CisJCQkJX3JidWYuV3JpdGUgKHRtcEJ1ZiwgMCwgdG1wQnVmLkxlbmd0aCk7CisJCQkJX3JidWYuUG9zaXRpb24gPSAwOwkvL0ZvciByZWFkaW5nCisJCQl9CisJCQlpbnQgcmV0ID0gX3JidWYuUmVhZCAoYnVmLCAwLCBsZW4pOworCQkJaWYgKF9yYnVmLkxlbmd0aCA9PSBfcmJ1Zi5Qb3NpdGlvbikJLy9GaW5pc2hlZCByZWFkaW5nCisJCQkJX3JidWYuU2V0TGVuZ3RoICgwKTsKKwkJCWRlYnVnIChzdHJpbmcuRm9ybWF0ICgiQ2xpZW50X1JlYWQgcmV0dXJuIHswfWIsIHJlbWFpbmluZyAgezF9YiIsIHJldCwgX3JidWYuTGVuZ3RoIC0gX3JidWYuUG9zaXRpb24pKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSAoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKwkJeworCQkJZGVidWcgKCJDbGllbnRfV3JpdGUiKTsKKwkJCV93YnVmLldyaXRlIChidWYsIG9mZiwgbGVuKTsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoICgpCisJCXsKKwkJCWRlYnVnICgiQ2xpZW50X0ZsdXNoIik7CisJCQlfc29jay5TZW5kIChfd2J1Zi5HZXRCdWZmZXIgKCkpOworCQkJX3didWYgPSBuZXcgTWVtb3J5U3RyZWFtICgpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcVNlcnZlci5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWM2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcVNlcnZlci5jcwpAQCAtMCwwICsxLDU2IEBACit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFpNUTsKK3VzaW5nIFN5c3RlbS5JTzsKKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBabXFTZXJ2ZXIKK3sKKwlwdWJsaWMgY2xhc3MgVFptcVNlcnZlcgorCXsKKwkJU29ja2V0IF9zb2NrZXQgOworCQlUUHJvY2Vzc29yIF9wcm9jZXNzb3I7CisJCQorCQl2b2lkIGRlYnVnIChzdHJpbmcgbXNnKQorCQl7CisJCQkvL1VuY29tbWVudCB0byBlbmFibGUgZGVidWcKKy8vCQkJQ29uc29sZS5Xcml0ZUxpbmUgKG1zZyk7CisJCX0KKworCQlwdWJsaWMgVFptcVNlcnZlciAoVFByb2Nlc3NvciBwcm9jZXNzb3IsIENvbnRleHQgY3R4LCBTdHJpbmcgZW5kcG9pbnQsIFNvY2tldFR5cGUgc29ja1R5cGUpCisJCXsKKwkJCW5ldyBUU2ltcGxlU2VydmVyIChwcm9jZXNzb3IsbnVsbCk7CisJCQlfc29ja2V0ID0gY3R4LlNvY2tldCAoc29ja1R5cGUpOworCQkJX3NvY2tldC5CaW5kIChlbmRwb2ludCk7CisJCQlfcHJvY2Vzc29yID0gcHJvY2Vzc29yOworCQl9CisKKwkJcHVibGljIHZvaWQgU2VydmVPbmUgKCkKKwkJeworCQkJZGVidWcgKCJTZXJ2ZXJfU2VydmVPbmUiKTsKKwkJCUJ5dGVbXSBtc2cgPSBfc29ja2V0LlJlY3YgKCk7CisJCQlNZW1vcnlTdHJlYW0gaXN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0gKG1zZyk7CisJCQlNZW1vcnlTdHJlYW0gb3N0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0gKCk7CisJCQlUUHJvdG9jb2wgdFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCAobmV3IFRTdHJlYW1UcmFuc3BvcnQgKGlzdHJlYW0sIG9zdHJlYW0pKTsKKwkJCV9wcm9jZXNzb3IuUHJvY2VzcyAodFByb3RvY29sLCB0UHJvdG9jb2wpOworCisJCQlpZiAob3N0cmVhbS5MZW5ndGggIT0gMCkgeworCQkJCWJ5dGVbXSBuZXdCdWYgPSBuZXcgYnl0ZVtvc3RyZWFtLkxlbmd0aF07CisJCQkJQXJyYXkuQ29weSAob3N0cmVhbS5HZXRCdWZmZXIgKCksIG5ld0J1Ziwgb3N0cmVhbS5MZW5ndGgpOworCQkJCWRlYnVnIChzdHJpbmcuRm9ybWF0ICgiU2VydmVyX1NlcnZlT25lIHNlbmRpbmcgezB9YiIsIG9zdHJlYW0uTGVuZ3RoKSk7CisJCQkJX3NvY2tldC5TZW5kIChuZXdCdWYpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgU2VydmUgKCkKKwkJeworCQkJd2hpbGUgKHRydWUpCisJCQkJU2VydmVPbmUgKCk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODBhZDFkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCkBAIC0wLDAgKzEsOTEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj54ODY8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5abXFTZXJ2ZXI8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRaTVE8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPEV4dGVybmFsY29uc29sZT50cnVlPC9FeHRlcm5hbGNvbnNvbGU+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8eDg2JyAiPgorICAgIDxEZWJ1Z1R5cGU+bm9uZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2U8L091dHB1dFBhdGg+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPEV4dGVybmFsY29uc29sZT50cnVlPC9FeHRlcm5hbGNvbnNvbGU+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iY2xyem1xLCBWZXJzaW9uPTIuMS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPXg4NiI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+LlxjbHJ6bXEuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcVGhyaWZ0LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1haW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRabXFTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFptcUNsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFN0b3JhZ2UuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5zbG4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmFmNTdiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuCkBAIC0wLDAgKzEsNDIgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFpNUSIsICJUaHJpZnRaTVEuY3Nwcm9qIiwgInsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfE1peGVkIFBsYXRmb3JtcyA9IERlYnVnfE1peGVkIFBsYXRmb3JtcworCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zID0gUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXx4ODYKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCmluZGV4IDY0ZTIwZjYuLjE1OWMyNTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKQEAgLTEsMTIgKzEsMTIgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KIAogI2luY2x1ZGUgInptcS5ocHAiCiAjaW5jbHVkZSAiVFptcUNsaWVudC5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFptcUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwogCkBAIC0xNyw3ICsxNyw3IEBACiAgIGlmIChhcmdjID4gMSkgewogICAgIGluY3IgPSBhdG9pKGFyZ3ZbMV0pOwogICAgIGlmIChpbmNyKSB7Ci0gICAgICBzb2NrdHlwZSA9IFpNUV9ET1dOU1RSRUFNOworICAgICAgc29ja3R5cGUgPSBaTVFfUFVTSDsKICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIjsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKaW5kZXggMTg4NmQ5Yy4uZDUxMjE2ZSAxMDA3NTUKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKQEAgLTksMjggKzksMjggQEAKIAogCiBkZWYgbWFpbihhcmdzKToKLSAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCi0gIHNvY2t0eXBlID0gem1xLlJFUQotICBpbmNyID0gMAotICBpZiBsZW4oYXJncykgPiAxOgotICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCIKKyAgICBzb2NrdHlwZSA9IHptcS5SRVEKKyAgICBpbmNyID0gMAorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKKyAgICAgICAgaWYgaW5jcjoKKyAgICAgICAgICAgIHNvY2t0eXBlID0gem1xLlBVU0gKKyAgICAgICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgorCisgICAgY3R4ID0gem1xLkNvbnRleHQoKQorICAgIHRyYW5zcG9ydCA9IFRabXFDbGllbnQuVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkKKyAgICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQorICAgIGNsaWVudCA9IHN0b3JhZ2UuU3RvcmFnZS5DbGllbnQocHJvdG9jb2wpCisgICAgdHJhbnNwb3J0Lm9wZW4oKQorCiAgICAgaWYgaW5jcjoKLSAgICAgIHNvY2t0eXBlID0gem1xLkRPV05TVFJFQU0KLSAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgotCi0gIGN0eCA9IHptcS5Db250ZXh0KCkKLSAgdHJhbnNwb3J0ID0gVFptcUNsaWVudC5UWm1xQ2xpZW50KGN0eCwgZW5kcG9pbnQsIHNvY2t0eXBlKQotICBwcm90b2NvbCA9IHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNwb3J0KQotICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQotICB0cmFuc3BvcnQub3BlbigpCi0KLSAgaWYgaW5jcjoKLSAgICBjbGllbnQuaW5jcihpbmNyKQotICAgIHRpbWUuc2xlZXAoMC4wNSkKLSAgZWxzZToKLSAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQotICAgIHByaW50IHZhbHVlCisgICAgICAgIGNsaWVudC5pbmNyKGluY3IpCisgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICBlbHNlOgorICAgICAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQorICAgICAgICBwcmludCh2YWx1ZSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKHN5cy5hcmd2KQorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCmluZGV4IDhmZTY5ZGEuLmQ0NjViZmYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcAppbmRleCBjYTA1NzA5Li41YzA4NmExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCkBAIC0xLDEyICsxLDEyIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAKICNpbmNsdWRlICJ6bXEuaHBwIgogI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCmluZGV4IGM2MjRiMGQuLmU2ZjFiMjAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKQEAgLTIsNyArMiw3IEBACiAjaW5jbHVkZSAiVFptcVNlcnZlci5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcU11bHRpU2VydmVyOwpAQCAtMzMsNyArMzMsNyBAQAogCiAgIHptcTo6Y29udGV4dF90IGN0eCgxKTsKICAgVFptcVNlcnZlciByZXFyZXBfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgWk1RX1JFUCk7Ci0gIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9VUFNUUkVBTSk7CisgIFRabXFTZXJ2ZXIgb25ld2F5X3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIFpNUV9QVUxMKTsKICAgVFptcU11bHRpU2VydmVyIG11bHRpc2VydmVyOwogICBtdWx0aXNlcnZlci5zZXJ2ZXJzKCkucHVzaF9iYWNrKCZyZXFyZXBfc2VydmVyKTsKICAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmb25ld2F5X3NlcnZlcik7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CmluZGV4IDU3NjdiNzEuLmQ4OWIzN2IgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CkBAIC02LDI4ICs2LDI4IEBACiAKIAogY2xhc3MgU3RvcmFnZUhhbmRsZXIoc3RvcmFnZS5TdG9yYWdlLklmYWNlKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYudmFsdWUgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gMAogCi0gIGRlZiBpbmNyKHNlbGYsIGFtb3VudCk6Ci0gICAgc2VsZi52YWx1ZSArPSBhbW91bnQKKyAgICBkZWYgaW5jcihzZWxmLCBhbW91bnQpOgorICAgICAgICBzZWxmLnZhbHVlICs9IGFtb3VudAogCi0gIGRlZiBnZXQoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQogCiAKIGRlZiBtYWluKCk6Ci0gIGhhbmRsZXIgPSBTdG9yYWdlSGFuZGxlcigpCi0gIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKIAotICBjdHggPSB6bXEuQ29udGV4dCgpCi0gIHJlcXJlcF9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCB6bXEuUkVQKQotICBvbmV3YXlfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgem1xLlVQU1RSRUFNKQotICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQocmVxcmVwX3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKLSAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCkKKyAgICBjdHggPSB6bXEuQ29udGV4dCgpCisgICAgcmVxcmVwX3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIHptcS5SRVApCisgICAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5QVUxMKQorICAgIG11bHRpc2VydmVyID0gVFptcVNlcnZlci5UWm1xTXVsdGlTZXJ2ZXIoKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQob25ld2F5X3NlcnZlcikKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZUZvcmV2ZXIoKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIG1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZGViaWFuL1JFQURNRS5tZCBiL2RlYmlhbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViZmVlYQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9SRUFETUUubWQKQEAgLTAsMCArMSw0MSBAQAorIyMgU29tZSB0aXBzIG9uIERlYmlhbiBQYWNrYWdpbmcKKworLSBEZWJpYW4gTmV3IE1haW50YWluZXJzJyBHdWlkZSBbaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy9kZWJpYW4tcG9saWN5L10KKy0gRGViaWFuIFBvbGljeSBNYW51YWwgW2h0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvbWFudWFscy9tYWludC1ndWlkZS9dCistIE1hY2hpbmUtcmVhZGFibGUgZGViaWFuL2NvcHlyaWdodCBmaWxlIFtodHRwOi8vZGVwLmRlYmlhbi5uZXQvZGVwcy9kZXA1L10KKy0gRGViU3JjIDMuMCBndWlkZWxpbmVzIFtodHRwczovL3dpa2kuZGViaWFuLm9yZy9Qcm9qZWN0cy9EZWJTcmMzLjBdCisKKworIyMgQnVpbGQgdXNpbmcgZHBrZy1idWlsZHBhY2thZ2U6CisKK2BgYGJhc2gKKyQgZHBrZy1idWlsZHBhY2thZ2UgLWQgLXRjCisgIC1kICAgIyBkbyBub3QgY2hlY2sgYnVpbGQgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuCisgIC10YyAgIyBjbGVhbiBzb3VyY2UgdHJlZSB3aGVuIGZpbmlzaGVkLgorYGBgCisKKworIyMgVXBkYXRlIGNoYW5nZWxvZzoKKworYGBgYmFzaAorJCBkYXRlIC1SCitgYGAKKworT25lIGNhbiBhbHNvIGluc3RhbGwgYGRldnNjcmlwdHNgIHBhY2thZ2UgYW5kIHJ1bjoKKworYGBgYmFzaAorJCBkY2ggLWkKK2BgYAorCisKKyMjIENoZWNrIHBhY2thZ2VzOgorCitgYGBiYXNoCiskIGRwa2cgLWMgKi5kZWIKKyQgbGludGlhbiAqLmRlYgorYGBgCisKKworIyMgVE9ETworCitNYWtlIGl0IHBlcmZlY3QhCmRpZmYgLS1naXQgYS9kZWJpYW4vY2hhbmdlbG9nIGIvZGViaWFuL2NoYW5nZWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI1ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NoYW5nZWxvZwpAQCAtMCwwICsxLDgzIEBACit0aHJpZnQgKDAuMTIuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTIuMAorCisgLS0gQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+ICBXZWQsIDI4IERlYyAyMDE4IDEyOjAwOjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMS4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDA3IERlYyAyMDE3IDIwOjA3OjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMC4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDAzIEphbiAyMDE3IDE2OjUyOjAwIC0wNTAwCisKK3RocmlmdCAoMC45LjMpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjkuMworCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAxMSBPY3QgMjAxNSAxNzoyMjowMCAtMDUwMAorCit0aHJpZnQgKDAuOS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC45LjAKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMTAgT2N0IDIwMTIgMTI6MDA6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjcuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuNy4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBUdWUsIDEwIEF1ZyAyMDExIDE3OjAxOjUzIC0wNTAwCisKK3RocmlmdCAoMC43LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdworICAqIGFkZGVkIGdsaWIKKyAgKiBmaXggbG9jYXRpb24gb2YgbGlidGhyaWZ0LmphcgorCisgLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDEyIEFwciAyMDExIDIxOjQxOjE4ICswMjAwCisKK3RocmlmdCAoMC42LjAtZGV2MSkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHZlcnNpb24gZmllbGQKKyAgKiBhZGRlZCBkZWJpYW4gZm9sZGVyIHRvIHRocmlmdC9jb250cmliCisgICogY2hhbmdlZCBhIGZldyBkZXRhaWxzIGluIGNvbnRyb2wgZmlsZQorICAqIHVwZGF0ZSBjb3B5cmlnaHQgZmlsZQorCisgLS0gUm9nZXIgTWVpZXIgPHJvZ2VyQGFwYWNoZS5vcmc+ICBUdWUsIDE0IERlYyAyMDEwIDEyOjEyOjMzIC0wODAwCisKK3RocmlmdCAoMC41LjArbm11Mikgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTm9uLW1haW50YWluZXIgdXBsb2FkLgorICAqIE1lcmdlZCBUSFJJRlQtNzFfdjkucGF0Y2ggdG8gc2tpcCAuL2Jvb3RzdHJhcC5zaCBpZiBub3QgZXhpc3RzLgorICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvYXR0YWNobWVudC8xMjQ2NTM2MC9USFJJRlQtNzFfdjkucGF0Y2gKKworIC0tIFlhbWFzaGl0YSBZdXUgPHlhbWFzaGl0YUBnZWlzaGF0b2t5by5jb20+ICBUdWUsIDA3IERlYyAyMDEwIDE1OjAwOjU1ICswOTAwCisKK3RocmlmdCAoMC41LjArbm11MSkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTm9uLW1haW50YWluZXIgdXBsb2FkLgorICAqIEltcG9ydGVkIHBhY2thZ2UgaW5mb3JtYXRpb24gZm9yIHBocDUtdGhyaWZ0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbXBsZWdlby90aHJpZnQuCisKKyAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAwMTowMDoxNyArMDkwMAorCit0aHJpZnQgKDAuNS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC41LjAKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgRnJpLCAwOCBPY3QgMjAxMCAxMToyMzo1MyArMDIwMAorCit0aHJpZnQgKDAuNC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC40LjAKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBidWZmZXJvdmVyZmxvdy5jaD4gIFN1biwgMjIgQXVnIDIwMTAgMjE6MjY6MDAgKzAxMDAKKwordGhyaWZ0ICgwLjIwMDguMTIuMzB+OC4wNCkgaGFyZHk7IHVyZ2VuY3k9bG93CisKKyAgKiBJbml0aWFsIHJlbGVhc2UuCisKKyAtLSBFc3RldmUgRmVybmFuZGV6IDxlc3RldmVAZmx1aWRpbmZvLmNvbT4gIFRodSwgMTUgSmFuIDIwMDkgMTE6MzQ6MjQgKzAxMDAKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb21wYXQgYi9kZWJpYW4vY29tcGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjM1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29tcGF0CkBAIC0wLDAgKzEgQEAKKzkKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb250cm9sIGIvZGViaWFuL2NvbnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxOGEzNwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb250cm9sCkBAIC0wLDAgKzEsMjAyIEBACitTb3VyY2U6IHRocmlmdAorU2VjdGlvbjogZGV2ZWwKK1ByaW9yaXR5OiBleHRyYQorQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA5KSwgYnVpbGQtZXNzZW50aWFsLCBtb25vLW1jcywgcHl0aG9uLWRldiwgYW50LAorICAgIG1vbm8tZGV2ZWwsICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsLCBlcmxhbmctYmFzZSwgcnVieS1kZXYgfCBydWJ5MS45LjEtZGV2LCBydWJ5LWJ1bmRsZXIgLGF1dG9jb25mLCBhdXRvbWFrZSwKKyAgICBwa2ctY29uZmlnLCBsaWJ0b29sLCBiaXNvbiwgZmxleCwgbGliYm9vc3QtZGV2IHwgbGliYm9vc3QxLjUzLWRldiB8IGxpYmJvb3N0MS42My1hbGwtZGV2LAorICAgIHB5dGhvbi1hbGwsIHB5dGhvbi1zZXR1cHRvb2xzLCBweXRob24tYWxsLWRldiwgcHl0aG9uLWFsbC1kYmcsCisgICAgcHl0aG9uMy1hbGwsIHB5dGhvbjMtc2V0dXB0b29scywgcHl0aG9uMy1hbGwtZGV2LCBweXRob24zLWFsbC1kYmcsCisgICAgb3Blbmpkay03LWpkayB8IG9wZW5qZGstOC1qZGsgfCBkZWZhdWx0LWpkaywKKyAgICBsaWJib29zdC10ZXN0LWRldiB8IGxpYmJvb3N0LXRlc3QxLjUzLWRldiB8IGxpYmJvb3N0LXRlc3QxLjYzLWRldiwgbGliZXZlbnQtZGV2LCBsaWJzc2wtZGV2LCBwZXJsICg+PSA1LjguMC03KSwKKyAgICBwaHAgKD49IDUpLCBwaHAtZGV2ICg+PSA1KSwgbGliZ2xpYjIuMC1kZXYsIHF0Y2hvb3NlciwgcXRiYXNlNS1kZXYtdG9vbHMKK01haW50YWluZXI6IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8KK1Zjcy1HaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAorVmNzLUJyb3dzZXI6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0CitTdGFuZGFyZHMtVmVyc2lvbjogMy45LjcKK1gtUHl0aG9uLVZlcnNpb246ID49IDIuNgorWC1QeXRob24zLVZlcnNpb246ID49IDMuMworCitQYWNrYWdlOiB0aHJpZnQtY29tcGlsZXIKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogQ29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFRocmlmdCBjb21waWxlciB0aGF0IGlzIHVzZWQgZm9yIHRyYW5zbGF0aW5nCisgZnJvbSAudGhyaWZ0IGZpbGVzIChjb250YWluaW5nIHRoZSBkZWZpbml0aW9ucykgdG8gdGhlIGxhbmd1YWdlIGJpbmRpbmcKKyBmb3IgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMuCisKK1BhY2thZ2U6IHB5dGhvbi10aHJpZnQKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBweXRob24KK0RlcGVuZHM6ICR7cHl0aG9uOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tc2l4CitSZWNvbW1lbmRzOiBweXRob24tdHdpc3RlZC13ZWIsIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lLCBweXRob24taXBhZGRyZXNzCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKFB5dGhvbiAyKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQeXRob24KKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorIC4KKyBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIGxpYnJhcnkgZm9yIFB5dGhvbiAyLgorCitQYWNrYWdlOiBweXRob24tdGhyaWZ0LWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uLWFsbC1kYmcKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoZGVidWcgdmVyc2lvbikKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scy4KKyBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIKKyBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdworIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBweXRob24zLXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHB5dGhvbgorRGVwZW5kczogJHtweXRob24zOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24zLXNpeAorUmVjb21tZW5kczogcHl0aG9uMy10d2lzdGVkLXdlYgorUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMykKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKyAuCisgVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBsaWJyYXJ5IGZvciBQeXRob24gMy4KKworUGFja2FnZTogcHl0aG9uMy10aHJpZnQtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbjMtdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uMy1hbGwtZGJnCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCisgWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCisgZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKKyB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogcnVieS10aHJpZnQKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBsaWJzCitEZXBlbmRzOiBydWJ5IHwgcnVieS1pbnRlcnByZXRlciwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorUHJvdmlkZXM6IGxpYnRocmlmdC1ydWJ5CitSZXBsYWNlczogbGlidGhyaWZ0LXJ1YnkKK0JyZWFrczogbGlidGhyaWZ0LXJ1YnkKK0Rlc2NyaXB0aW9uOiBSdWJ5IGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFJ1YnkKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtamF2YQorQXJjaGl0ZWN0dXJlOiBhbGwKK1NlY3Rpb246IGphdmEKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IEphdmEgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBKYXZhIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gSmF2YQorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1jaWwKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBjbGktbW9ubworRGVwZW5kczogY2xpLWNvbW1vbiwgbGlibW9uby1jb3JsaWI0LjAtY2lsICg+PSAyLjEwKSB8IGxpYm1vbm8tY29ybGliNC41LWNpbCAoPj0zLjIpLCBsaWJtb25vLXN5c3RlbTQuMC1jaWwgKD49IDIuMTApLAorICAgIGxpYm1vbm8tc3lzdGVtLXdlYjQuMC1jaWwgKD49IDIuMTApLCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBDTEkgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBDTEkgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBDIworIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1wZXJsCitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogcGVybAorRGVwZW5kczogcGVybCAoPj0gNS44LjAtNyksICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IFBlcmwgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUGVybAorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdDAKK0FyY2hpdGVjdHVyZTogYW55CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIG5lZWRlZCBmb3IgQysrIGFwcGxpY2F0aW9ucworIHVzaW5nIFRocmlmdC4KKworUGFja2FnZTogbGlidGhyaWZ0MC1kYmcKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBkZWJ1ZworRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgbGlidGhyaWZ0MCAoPSAke2JpbmFyeTpWZXJzaW9ufSkKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgZGVidWcgc3ltYm9scworIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWJ1ZyBzeW1ib2xzIGZvciB0aGUgVGhyaWZ0IEMrKyBydW50aW1lIGxpYnJhcmllcy4KKworUGFja2FnZTogbGlidGhyaWZ0LWRldgorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGxpYmRldmVsCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KSwgbGliZ2xpYjIuMC1kZXYKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgKGRldmVsb3BtZW50IGhlYWRlcnMpCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRldmVsb3BtZW50IGxpYnJhcmllcyByZXF1aXJlZCBmb3Igd3JpdGluZyBDKysKKyBhcHBsaWNhdGlvbnMgdXNpbmcgVGhyaWZ0LgorCitQYWNrYWdlOiBwaHA1LXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHBocAorRGVwZW5kczogJHtwaHA6RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK1Byb3ZpZGVzOiAke3BocDpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQSFAgYmluZGluZ3MgZm9yIFRocmlmdAorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQSFAgYmluZGluZ3MgZm9yIFRocmlmdC4KZGlmZiAtLWdpdCBhL2RlYmlhbi9jb3B5cmlnaHQgYi9kZWJpYW4vY29weXJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDY0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29weXJpZ2h0CkBAIC0wLDAgKzEsMTI5IEBACitUaGlzIHBhY2thZ2Ugd2FzIGRlYmlhbml6ZWQgYnkgVGhyaWZ0IERldmVsb3BlcidzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+LgorCisKK1RoaXMgcGFja2FnZSBhbmQgdGhlIERlYmlhbiBwYWNrYWdpbmcgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLAorc2VlIGAvdXNyL3NoYXJlL2NvbW1vbi1saWNlbnNlcy9BcGFjaGUtMi4wJy4KKworVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB3YXMgY29waWVkIGZyb20gQXBhY2hlIFRocmlmdCBMSUNFTlNFIGZpbGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKKworVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCitzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQorY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KKworUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGZvbGxvd2luZyBmaWxlcyBjb250YWluIHNvbWUgcG9ydGlvbnMgb2YgY29kZSBjb250cmlidXRlZCB1bmRlcgordGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlIChzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQpLCBhbmQgcmVsaWNlbnNlZAordW5kZXIgdGhlIEFwYWNoZSAyLjAgTGljZW5zZToKKworICBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0KKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL21haW4uY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorICBjb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcworICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcworICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcworICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKKyAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKKyAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgorICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcworICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisgIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKKyAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKKyAgbGliL3JiL2xpYi90aHJpZnQucmIKKyAgbGliL3N0L1JFQURNRQorICBsaWIvc3QvdGhyaWZ0LnN0CisgIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisgIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisgIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgorCisjICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAorIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAorIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL21kNS5bY2hdIGNvbXBvbmVudHM6CisKKy8qCisgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTC4gUGV0ZXIgRGV1dHNjaAorICBnaG9zdEBhbGFkZGluLmNvbQorCisgKi8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCitsaWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6CisgICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAorCitMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKKyhzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZGlycyBiL2RlYmlhbi9kaXJzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi9kaXJzCnJlbmFtZSB0byBkZWJpYW4vZGlycwpkaWZmIC0tZ2l0IGEvZGViaWFuL2RvY3MgYi9kZWJpYW4vZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDNiZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2RvY3MKQEAgLTAsMCArMSBAQAorUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwKcmVuYW1lIHRvIGRlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwKZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCkBAIC0wLDAgKzEsNSBAQAordXNyL2xpYi9saWJ0aHJpZnQuc28qCit1c3IvbGliL2xpYnRocmlmdC0qLnNvKgordXNyL2xpYi9saWJ0aHJpZnRuYiouc28qCit1c3IvbGliL2xpYnRocmlmdHF0Ki5zbyoKK3Vzci9saWIvbGlidGhyaWZ0eiouc28qCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9waHA1LXRocmlmdC5kaXJzIGIvZGViaWFuL3BocDUtdGhyaWZ0LmRpcnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnRyaWIvZGViaWFuL3BocDUtdGhyaWZ0LmRpcnMKcmVuYW1lIHRvIGRlYmlhbi9waHA1LXRocmlmdC5kaXJzCmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWI0MzZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMCwwICsxLDIyOCBAQAorIyEvdXNyL2Jpbi9tYWtlIC1mCisjIC0qLSBtYWtlZmlsZSAtKi0KKyMgU2FtcGxlIGRlYmlhbi9ydWxlcyB0aGF0IHVzZXMgZGViaGVscGVyLgorIworIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBKb2V5IEhlc3MgYW5kIENyYWlnIFNtYWxsLgorIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgZGgtbWFrZSBpbnRvIGEKKyMgZGgtbWFrZSBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorIyBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSBDcmFpZyBTbWFsbCBpbiB2ZXJzaW9uIDAuMzcgb2YgZGgtbWFrZS4KKyMKKyMgTW9kaWZpZWQgdG8gbWFrZSBhIHRlbXBsYXRlIGZpbGUgZm9yIGEgbXVsdGktYmluYXJ5IHBhY2thZ2Ugd2l0aCBzZXBhcmF0ZWQKKyMgYnVpbGQtYXJjaCBhbmQgYnVpbGQtaW5kZXAgdGFyZ2V0cyAgYnkgQmlsbCBBbGxvbWJlcnQgMjAwMQorCisjIFVuY29tbWVudCB0aGlzIHRvIHR1cm4gb24gdmVyYm9zZSBtb2RlLgorI2V4cG9ydCBESF9WRVJCT1NFPTEKKworIyBUaGlzIGhhcyB0byBiZSBleHBvcnRlZCB0byBtYWtlIHNvbWUgbWFnaWMgYmVsb3cgd29yay4KK2V4cG9ydCBESF9PUFRJT05TCisKK1BZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCisKK2V4cG9ydCBDUFBGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1BQRkxBR1MpCitleHBvcnQgQ0ZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDRkxBR1MpCitleHBvcnQgQ1hYRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENYWEZMQUdTKQorZXhwb3J0IExERkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IExERkxBR1MpCisKK2NvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCitjb25maWd1cmUtc3RhbXA6CisJZGhfdGVzdGRpcgorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UuCisJaWYgWyAtZiBib290c3RyYXAuc2ggXTsgdGhlbiAkKENVUkRJUikvYm9vdHN0cmFwLnNoOyBmaQorCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLWVuYWJsZS1wbHVnaW49bm8KKworCXRvdWNoIGNvbmZpZ3VyZS1zdGFtcAorCisKKyNBcmNoaXRlY3R1cmUKK2J1aWxkOiBidWlsZC1hcmNoIGJ1aWxkLWluZGVwCisJIyBUZXN0cyBkaXNhYmxlZAorCSMgJChNQUtFKSAtQyB0ZXN0IGNoZWNrCisKK2J1aWxkLWFyY2g6IGJ1aWxkLWFyY2gtc3RhbXAKKyQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0IGJ1aWxkLWFyY2gtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorCisJIyBDb21waWxlIGNvbXBpbGVyCisJJChNQUtFKSAtQyAkKENVUkRJUikvY29tcGlsZXIvY3BwCisKKwkjIENvbXBpbGUgQysrIGxpYnJhcnkKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY3BwCisKKwkjIENvbXBpbGUgQyAoZ2xpYikgbGlicmFyeQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jX2dsaWIKKworCSMgUHl0aG9uIGxpYnJhcnkKKwljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKKyAgICBmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyAgXAorICAgICAgICAkJHB5IHNldHVwLnB5IGJ1aWxkOyBcCisgICAgICAgICQkcHktZGJnIHNldHVwLnB5IGJ1aWxkOyBcCisgICAgZG9uZQorCisJIyBQSFAKKwljZCAkKENVUkRJUikvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCAmJiBcCisJCXBocGl6ZSAmJiBcCisJCS4vY29uZmlndXJlICYmICQoTUFLRSkKKworCXRvdWNoICRACisKK2J1aWxkLWluZGVwOiBidWlsZC1pbmRlcC1zdGFtcAorYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcCAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdAorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb21waWxlIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorCSMkKE1BS0UpIGRvYworCisJIyBKYXZhCisJY2QgJChDVVJESVIpL2xpYi9qYXZhICYmIFwKKwkJLi9ncmFkbGV3IC0tbm8tZGFlbW9uIC1QcmVsZWFzZT10cnVlIGphcgorCisJIyBDIworCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jc2hhcnAKKworCSMgUnVieQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9yYgorCisJIyBQZXJsCisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgSU5TVEFMTERJUlM9dmVuZG9yCisKKwl0b3VjaCAkQAorCitjbGVhbjoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlybSAtZiBidWlsZC1hcmNoLXN0YW1wIGJ1aWxkLWluZGVwLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAorCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBweXRob24gc2V0dXAucHkgY2xlYW4gLS1hbGwKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlIGJ1aWxkIHByb2Nlc3MuCisJLSQoTUFLRSkgY2xlYW4KKworCSQoQ1VSRElSKS9jbGVhbnVwLnNoCisKKwlkaF9jbGVhbgorCitpbnN0YWxsOiBpbnN0YWxsLWluZGVwIGluc3RhbGwtYXJjaAoraW5zdGFsbC1pbmRlcDoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9wcmVwIC1pCisJZGhfaW5zdGFsbGRpcnMgLWkKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCisJIyBkZWJpYW4vPHBhY2thZ2U+LWRvYy4KKwkjSU5TVEFMTERPQyMKKworCSMgSmF2YQorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvICYmIFwKKwljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQqLmphciBcCisJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCisKKwkjIFJ1YnkKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMSAmJiBcCisJY3AgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0LnJiIFwKKwkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEKKwljcCAtciAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQgXAorCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMQorCisJIyBDIworCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvICYmIFwKKwljcCAkKENVUkRJUikvbGliL2NzaGFycC9UaHJpZnQuZGxsIFwKKwkJJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtY2lsL3Vzci9saWIvY2xpL3RocmlmdC9UaHJpZnQuZGxsCisKKwkjIFBlcmwKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcGVybCBpbnN0YWxsIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybAorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJbXYgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliL3Blcmw1ICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL3NoYXJlCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwvbGliCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbG9jYWwKKworCWRoX2luc3RhbGwgLWkKKworaW5zdGFsbC1hcmNoOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2NsZWFuIC1rIC1zCisJZGhfaW5zdGFsbGRpcnMgLXMKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gaW5zdGFsbCB0aGUgYXJjaCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KKwkjIGRlYmlhbi90bXAuCisJIyQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RocmlmdCBpbnN0YWxsCisKKwkjIENvbXBpbGVyCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2JpbiAmJiBcCisJY3AgJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgXAorCQkkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3IvYmluL3RocmlmdCAmJiBcCisJcm1kaXIgJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL3NiaW4KKworCSMgUHl0aG9uCisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBcCisJcHl0aG9uMiBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0ICYmIFwKKwlweXRob24yLWRiZyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAmJiBcCisJcHl0aG9uMyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAmJiBcCisJcHl0aG9uMy1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnCisKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0IC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIioucHkiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5lZ2ctaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdCAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtZGVwdGggLXR5cGUgZCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworCSMgUEhQCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdAorCWNkICQoQ1VSRElSKS9saWIvcGhwICYmIFwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vcGhwNS10aHJpZnQgaW5zdGFsbAorCisJIyBDKysgYW5kIEMgKGdsaWIpCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi90bXA7IFwKKwljZCAkKENVUkRJUikvbGliL2NwcCAmJiBcCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCisJY2QgJChDVVJESVIpL2xpYi9jX2dsaWIgJiYgXAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCisJZGhfaW5zdGFsbCAtLXNvdXJjZWRpcj1kZWJpYW4vdG1wIC1zCisKKworIyBNdXN0IG5vdCBkZXBlbmQgb24gYW55dGhpbmcuIFRoaXMgaXMgdG8gYmUgY2FsbGVkIGJ5CisjIGJpbmFyeS1hcmNoL2JpbmFyeS1pbmRlcAorIyBpbiBhbm90aGVyICdtYWtlJyB0aHJlYWQuCitiaW5hcnktY29tbW9uOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX2luc3RhbGxjaGFuZ2Vsb2dzCisJZGhfaW5zdGFsbGRvY3MKKwlkaF9pbnN0YWxsZXhhbXBsZXMKKwlkaF9pbnN0YWxsbWFuCisJZGhfbGluaworCWRoX3N0cmlwIC1wbGlidGhyaWZ0MCAtLWRiZy1wYWNrYWdlPWxpYnRocmlmdDAtZGJnCisJZGhfc3RyaXAgLXBweXRob24tdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcHB5dGhvbjMtdGhyaWZ0IC0tZGJnLXBhY2thZ2U9cHl0aG9uMy10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXB0aHJpZnQtY29tcGlsZXIKKwlkaF9jb21wcmVzcworCWRoX2ZpeHBlcm1zCisJZGhfbWFrZXNobGlicworCWRoX2luc3RhbGxkZWIKKwlkaF9wZXJsCisJZGhfc2hsaWJkZXBzCisJZGhfZ2VuY29udHJvbAorCWRoX21kNXN1bXMKKwlkaF9idWlsZGRlYgorIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCitiaW5hcnktaW5kZXA6IGJ1aWxkLWluZGVwIGluc3RhbGwtaW5kZXAKKwkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1pIGJpbmFyeS1jb21tb24KKworIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgorYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCisJZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQoc2hlbGwgcGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+ICQoQ1VSRElSKS9kZWJpYW4vc3Vic3R2YXJzCisJJChNQUtFKSAtZiBkZWJpYW4vcnVsZXMgREhfT1BUSU9OUz0tcyBiaW5hcnktY29tbW9uCisKK2JpbmFyeTogYmluYXJ5LWFyY2ggYmluYXJ5LWluZGVwCisuUEhPTlk6IGJ1aWxkIGNsZWFuIGJpbmFyeS1pbmRlcCBiaW5hcnktYXJjaCBiaW5hcnkgaW5zdGFsbCBpbnN0YWxsLWluZGVwIGluc3RhbGwtYXJjaCBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2RlYmlhbi9zdWJzdHZhcnMgYi9kZWJpYW4vc3Vic3R2YXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDFmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vc3Vic3R2YXJzCkBAIC0wLDAgKzEgQEAKK3BocDpEZXBlbmRzPXBocGFwaS0yMDEyMTIxMgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vdGhyaWZ0LWRvYy5kb2NzIGIvZGViaWFuL3RocmlmdC1kb2MuZG9jcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi9kZWJpYW4vdGhyaWZ0LWRvYy5kb2NzCnJlbmFtZSB0byBkZWJpYW4vdGhyaWZ0LWRvYy5kb2NzCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwgYi9kZWJpYW4vdGhyaWZ0LWRvYy5pbnN0YWxsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwKcmVuYW1lIHRvIGRlYmlhbi90aHJpZnQtZG9jLmluc3RhbGwKZGlmZiAtLWdpdCBhL2RvYXAucmRmIGIvZG9hcC5yZGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2I3NmZhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYXAucmRmCkBAIC0wLDAgKzEsMTUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiPz4KKzxyZGY6UkRGIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9ucy9kb2FwIyIgCisgICAgICAgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIAorICAgICAgICAgeG1sbnM6YXNmZXh0PSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9ucy9hc2ZleHQjIgorICAgICAgICAgeG1sbnM6Zm9hZj0iaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8iPgorPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgIAorICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgPFByb2plY3QgcmRmOmFib3V0PSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciPgorICAgIDxjcmVhdGVkPjIwMTItMDQtMTQ8L2NyZWF0ZWQ+CisgICAgPGxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9kb2FwL2xpY2Vuc2VzL2FzbDIwIiAvPgorICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgPGhvbWVwYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAvPgorICAgIDxhc2ZleHQ6cG1jIHJkZjpyZXNvdXJjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAvPgorICAgIDxzaG9ydGRlc2M+QXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQsIGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gQysrLCBKYXZhLCBQeXRob24sIFBIUCwgUnVieSwgRXJsYW5nLCBQZXJsLCBIYXNrZWxsLCBDIywgQ29jb2EsIEphdmFTY3JpcHQsIE5vZGUuanMsIFNtYWxsdGFsaywgT0NhbWwgYW5kIERlbHBoaSBhbmQgb3RoZXIgbGFuZ3VhZ2VzLiA8L3Nob3J0ZGVzYz4KKyAgICA8ZGVzY3JpcHRpb24+QXBhY2hlIFRocmlmdCBhbGxvd3MgeW91IHRvIGRlZmluZSBkYXRhIHR5cGVzIGFuZCBzZXJ2aWNlIGludGVyZmFjZXMgaW4gYSBzaW1wbGUgZGVmaW5pdGlvbiBmaWxlLiBUYWtpbmcgdGhhdCBmaWxlIGFzIGlucHV0LCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVzIGNvZGUgdG8gYmUgdXNlZCB0byBlYXNpbHkgYnVpbGQgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMgdGhhdCBjb21tdW5pY2F0ZSBzZWFtbGVzc2x5IGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEluc3RlYWQgb2Ygd3JpdGluZyBhIGxvYWQgb2YgYm9pbGVycGxhdGUgY29kZSB0byBzZXJpYWxpemUgYW5kIHRyYW5zcG9ydCB5b3VyIG9iamVjdHMgYW5kIGludm9rZSByZW1vdGUgbWV0aG9kcywgeW91IGNhbiBnZXQgcmlnaHQgZG93biB0byBidXNpbmVzcy4gPC9kZXNjcmlwdGlvbj4KKyAgICA8YnVnLWRhdGFiYXNlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiIC8+CisgICAgPG1haWxpbmctbGlzdCByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nLyIgLz4KKyAgICA8ZG93bmxvYWQtcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb3dubG9hZC8iIC8+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkFjdGlvblNjcmlwdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DIzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkMrKzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkNvY29hPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkRhcnQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EZWxwaGk8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5Fcmxhbmc8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5HbzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkhhc2tlbGw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5IYXhlPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmFTY3JpcHQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5ub2RlLmpzPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+T0NhbWw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QZXJsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UEhQPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UHl0aG9uPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UnVzdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlNtYWxsVGFsazwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvaHR0cCIgLz4KKyAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9saWJyYXJ5IiAvPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L25ldHdvcmstY2xpZW50IiAvPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L25ldHdvcmstc2VydmVyIiAvPgorICAgIDxyZWxlYXNlIHJkZjpwYXJzZVR5cGU9IkNvbGxlY3Rpb24iPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTgtMTItMjg8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjEyLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTctMTEtMzA8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjExLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTctMDMtMDE8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjEwLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTUtMDktMjU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMzwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNC0xMS0wNTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOS4yPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEzLTA4LTIyPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjE8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTItMTAtMTU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMS0xMS0yOTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDExLTA4LTEzPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC43LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTEtMDQtMjU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjYuMTwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMS0wMi0wODwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMC0xMC0wNzwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMC0wOC0yMzwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMC0wOC0wNDwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMy4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0IChpbmN1YmF0aW5nKTwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAwOS0xMi0xMTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICA8L3JlbGVhc2U+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8R2l0UmVwb3NpdG9yeT4KKyAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0Ii8+CisgICAgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIvPgorICAgICAgPC9HaXRSZXBvc2l0b3J5PgorICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8bWFpbnRhaW5lcj4KKyAgICAgIDxmb2FmOlBlcnNvbj4KKyAgICAgICAgPGZvYWY6bmFtZT5BcGFjaGUgVGhyaWZ0IFBNQzwvZm9hZjpuYW1lPgorICAgICAgICAgIDxmb2FmOm1ib3ggcmRmOnJlc291cmNlPSJtYWlsdG86ZGV2QHRocmlmdC5hcGFjaGUub3JnIi8+CisgICAgICA8L2ZvYWY6UGVyc29uPgorICAgIDwvbWFpbnRhaW5lcj4KKyAgPC9Qcm9qZWN0PgorPC9yZGY6UkRGPgpkaWZmIC0tZ2l0IGEvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQgYi9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgxMDBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0OCBAQAorIyBUaHJpZnQgQ29kaW5nIFN0YW5kYXJkcworCisgICBBbnkgZm9vbCBjYW4gd3JpdGUgY29kZSB0aGF0IGEgY29tcHV0ZXIgY2FuIHVuZGVyc3RhbmQuCisgICBHb29kIHByb2dyYW1tZXJzIHdyaXRlIGNvZGUgdGhhdCBodW1hbnMgY2FuIHVuZGVyc3RhbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gTWFydGluIEZvd2xlciwgMTk5OQorCitUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIG1ha2UgZXZlcnlvbmUncyBsaWZlIGVhc2llci4KKworSXQncyBlYXNpZXIgd2hlbiB5b3UgcmVhZCBnb29kLCB3ZWxsIGZvcm1hdHRlZCwgd2l0aCBjbGVhcmx5IGRlZmluZWQgcHVycG9zZSwgY29kZS4KK0J1dCB0aGUgb25seSB3YXkgdG8gcmVhZCBjbGVhbiBjb2RlIGlzIHRvIHdyaXRlIHN1Y2guCisKK1RoaXMgZG9jdW1lbnQgY2FuIGhlbHAgYWNoaWV2ZSB0aGF0LCBidXQga2VlcCBpbiBtaW5kIHRoYXQKK3Rob3NlIGFyZSBub3Qgc2lsdmVyLWJ1bGxldCwgZml4LWFsbC1hdC1vbmNlIHJ1bGVzLiBKdXN0IHRoaW5rIGFib3V0IHJlYWRhYmlsaXR5IHdoaWxlIHdyaXRpbmcgY29kZS4KK1dyaXRlIGNvZGUgbGlrZSB5b3Ugd291bGQgaGF2ZSB0byByZWFkIGl0IGluIHRlbiB5ZWFycyBmcm9tIG5vdy4KKworIyMgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzCisKK1RocmlmdCBoYXMgc29tZSBoaXN0b3J5LiBOb3QgYWxsIGV4aXN0aW5nIGNvZGUgZm9sbG93cyB0aG9zZSBydWxlcy4KK0J1dCB3ZSB3YW50IHRvIGltcHJvdmUgb3ZlciB0aW1lLgorV2hlbiBtYWtpbmcgc21hbGwgY2hhbmdlIC8gYnVnZml4IC0gbGlrZSBzaW5nbGUgbGluZSBmaXggLSBkbyAqbm90KiByZWZhY3RvciB3aG9sZSBmdW5jdGlvbi4KK1RoYXQgZGlzdHVyYnMgY29kZSByZXBvc2l0b3J5IGhpc3RvcnkuCitXaGVuZXZlciBhZGRpbmcgc29tZXRoaW5nIG5ldyBhbmQgLyBvciBtYWtpbmcgYmlnZ2VyIHJlZmFjdG9yaW5nCisgLSBmb2xsb3cgdGhvc2UgcnVsZXMgYXMgc3RyaWN0bHkgYXMgeW91IGNhbi4KKworV2hlbiBpbiBkb3VidCAtIGNvbnRhY3Qgb3RoZXIgZGV2ZWxvcGVycyAodXNpbmcgZGV2QCBtYWlsaW5nIGxpc3Qgb3IgSVJDKS4KK0NvZGUgcmV2aWV3IGlzIHRoZSBiZXN0IHdheSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorCisjIyMgQmFzaWNzCisgKiBVc2Ugc3BhY2VzIG5vdCB0YWJzCisgKiBVc2Ugb25seSBBU0NJSSBjaGFyYWN0ZXJzIGluIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcworICogQ29tbWl0IHRvIHJlcG9zaXRvcnkgdXNpbmcgVW5peC1zdHlsZSBsaW5lIGVuZGluZ3MgKExGKQorICAgICBPbiBXaW5kb3dzOgorICAgICAgIGdpdCBjb25maWcgY29yZS5hdXRvY3JsZiB0cnVlCisgKiBNYXhpbXVtIGxpbmUgd2lkdGggLSAxMDAgY2hhcmFjdGVycworICogSWYgbm90IHNwZWNpZmllZCBvdGhlcndpc2UgaW4gbGFuZ3VhZ2Ugc3BlY2lmaWMgc3RhbmRhcmQgLSB1c2UgMiBzcGFjZXMgYXMgaW5kZW50L3RhYgorCisjIyMgQ29tbWVudHMKKyAqIEVhY2ggZmlsZSBoYXMgdG8gc3RhcnQgd2l0aCBjb21tZW50IGNvbnRhaW5pbmcgW0FwYWNoZSBMaWNlbnNlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApCisgKiBQdWJsaWMgQVBJIG9mIGxpYnJhcnkgc2hvdWxkIGJlIGRvY3VtZW50ZWQsIHByZWZlcmFibHkgdXNpbmcgZm9ybWF0IG5hdGl2ZSBmb3IgbGFuZ3VhZ2Ugc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIHRvb2xzIChKYXZhZG9jLCBEb3h5Z2VuIGV0Yy4pCisgKiBPdGhlciBjb21tZW50cyBhcmUgZGlzY291cmFnZWQgLSBjb21tZW50cyBhcmUgbGllcy4gV2hlbiBvbmUgaGFzIHRvIG1ha2UgY29tbWVudCBpdCBtZWFucyBvbmUgZmFpbGVkIHRvIHdyaXRlIHJlYWRhYmxlIGNvZGUuIEluc3RlYWQgb2YgIkkgc2hvdWxkIHdyaXRlIGEgY29tbWVudCBoZXJlIiB0aGluayAiSSBzaG91bGQgY2xlYW4gaXQgdXAiCisgKiBEbyBub3QgbGVhdmUgIlRPRE8vRklYTUUiIGNvbW1lbnRzIC0gZmlsZSBbSmlyYV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgaXNzdWUgaW5zdGVhZAorCisjIyMgTmFtaW5nCisgRmluZGluZyBwcm9wZXIgbmFtZXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCBtb3N0IGRpZmZpY3VsdCB0YXNrIGluIHNvZnR3YXJlIGRldmVsb3BtZW50LgorCisjIyBMYW5ndWFnZSBTcGVjaWZpYyBDb2RpbmcgU3RhbmRhcmRzCisKK0ZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWUgYGxpYi9MQU5HL2NvZGluZ19zdGFuZGFyZHMubWRgCmRpZmYgLS1naXQgYS9kb2MvY29tbWl0dGVycy5tZCBiL2RvYy9jb21taXR0ZXJzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGQ3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29tbWl0dGVycy5tZApAQCAtMCwwICsxLDU0IEBACisjIyBQcm9jZXNzIHVzZWQgYnkgY29tbWl0dGVycyB0byByZXZpZXcgYW5kIHN1Ym1pdCBwYXRjaGVzCisKKzEuIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGFuIGlzc3VlIGZvciB0aGUgcGF0Y2gocykgeW91IGFyZSBhYm91dCB0byBjb21taXQgaW4gb3VyIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpCisKKzEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCisKKyAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IHRocmlmdAorCisxLiBBcHBseSB0aGUgcGF0Y2gKKworICAqIGN1cmwgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhLy4uLiB8Z2l0IGFwcGx5IC0taWdub3JlLXNwYWNlLWNoYW5nZQorCisgIG9yCisKKyAgKiBjdXJsIGh0dHBzOi8vZ2l0aHViLmNvbS88R2l0SHViIFVzZXI+L3RocmlmdC9jb21taXQvPENvbW1pdCBJRD4ucGF0Y2ggfGdpdCBhcHBseSAtLWlnbm9yZS1zcGFjZS1jaGFuZ2UKKworCisxLiBJbnNwZWN0IHRoZSBhcHBsaWVkIHBhdGNoIHRvIGVuc3VyZSB0aGF0IGFsbCBbTGVnYWwgYXNwZWN0cyBvbiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMgKFBhdGNoZXMpXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCNjb250cmlidXRpb25zKSBhcmUgbWV0CisKKzEuIFJ1biB0aGUgbmVjZXNzYXJ5IHVuaXQgdGVzdHMgYW5kIGNyb3NzIGxhbmd1YWdlIHRlc3QgY2FzZXMgdG8gdmVyaWZ5IHRoZSBwYXRjaAorCisxLiBDb21taXQgdGhlIHBhdGNoCisKKyAgICAgICAgZ2l0IC0tY29uZmlnIHVzZXIubmFtZSAiWW91ciBOYW1lIgorICAgICAgICBnaXQgLS1jb25maWcgdXNlci5lbWFpbCAiWW91ckFwYWNoZUlEQGFwYWNoZS5vcmciCisgICAgICAgIGdpdCBhZGQgLUEKKyAgICAgICAgZ2l0IGNvbW1pdAorCisxLiBUaGUgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQ6CisKKyAgICAgICBUSFJJRlQtIyMjOjxKaXJhIGRlc2NyaXB0aW9uPgorICAgICAgIENsaWVudDogPGNvbXBvbmVudD4KKyAgICAgICBQYXRjaDogPE5hbWUgb2YgcGVyc29uIGNvbnRyaWJ1dGluZyB0aGUgcGF0Y2g+CisKKyAgICAgICBEZXNjcmlwdGlvbiBvZiB3aGF0IHdhcyBmaXhlZCBvciBhZGRyZXNzZWQuCisKKyAgICAgICA8JQorICAgICAgICAgICBpZiB0aGlzIGlzIGEgZ2l0aHViIHB1bGwgcmVxdWVzdCB0aGVuIGFkZCBiZWxvdyBjb21tZW50CisgICAgICAgICAgICB0byBhdXRvbWF0aWNhbHkgY2xvc2UgR2l0SHViIHJlcXVlc3QuCisgICAgICAgJT4KKyAgICAgICBUaGlzIGNsb3NlcyAjWFgKKworCisxLiBEb3VibGUgY2hlY2sgdGhlIHBhdGNoIGNvbW1pdHRlZCBhbmQgdGhhdCBub3RoaW5nIHdhcyBtaXNzZWQgdGhlbiBwdXNoIHRoZSBwYXRjaAorCisgICAgICAgZ2l0IHN0YXR1cworICAgICAgIGdpdCBzaG93IEhFQUQKKyAgICAgICBnaXQgcHVzaCBvcmlnaW4gbWFzdGVyCisKKworMS4gUmVzb2x2ZSB0aGUgamlyYSBpc3N1ZSBhbmQgc2V0IHRoZSBmb2xsb3dpbmcgZm9yIHRoZSBjaGFuZ2Vsb2cKKworICAqIENvbXBvbmVudCB0aGUgcGF0Y2ggaXMgZm9yCisgICogZml4VmVyc2lvbiB0byB0aGUgY3VycmVudCB2ZXJzaW9uIG9uIG1hc3RlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jZ3JuLnBuZyBiL2RvYy9pbWFnZXMvY2dybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwOTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY2dybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jcmVkLnBuZyBiL2RvYy9pbWFnZXMvY3JlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2YTVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9jeWVsLnBuZyBiL2RvYy9pbWFnZXMvY3llbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZGZjNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3llbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZyBiL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhY2NmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvUkVBRE1FLm1kIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjMxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9SRUFETUUubWQKQEAgLTAsMCArMSw0MyBAQAorCisjIyBCYXNpYyByZXF1aXJlbWVudHMKKyogQSByZWxhdGl2ZWx5IFBPU0lYLWNvbXBsaWFudCAqTklYIHN5c3RlbQorICAgICogQ3lnd2luIG9yIE1pbkdXIGNhbiBiZSB1c2VkIG9uIFdpbmRvd3MgKGJ1dCB0aGVyZSBhcmUgYmV0dGVyIG9wdGlvbnMsIHNlZSBiZWxvdykKKyogZysrIDQuMgorKiBib29zdCAxLjUzLjAKKyogUnVudGltZSBsaWJyYXJpZXMgZm9yIGxleCBhbmQgeWFjYyBtaWdodCBiZSBuZWVkZWQgZm9yIHRoZSBjb21waWxlci4KKworIyMgUmVxdWlyZW1lbnRzIGZvciBidWlsZGluZyBmcm9tIHNvdXJjZQorKiBHTlUgYnVpbGQgdG9vbHM6IAorICAgICogYXV0b2NvbmYgMi42NQorICAgICogYXV0b21ha2UgMS4xMworICAgICogbGlidG9vbCAxLjUuMjQKKyogcGtnLWNvbmZpZyBhdXRvY29uZiBtYWNyb3MgKHBrZy5tNCkKKyogbGV4IGFuZCB5YWNjIChkZXZlbG9wZWQgcHJpbWFyaWx5IHdpdGggZmxleCBhbmQgYmlzb24pCisqIGxpYnNzbC1kZXYKKworIyMgUmVxdWlyZW1lbnRzIGZvciBidWlsZGluZyB0aGUgY29tcGlsZXIgZnJvbSBzb3VyY2Ugb24gV2luZG93cworKiBWaXN1YWwgU3R1ZGlvIEMrKworKiBGbGV4IGFuZCBCaXNvbiAoZS5nLiB0aGUgV2luRmxleEJpc29uIHBhY2thZ2UpCisKKyMjIExhbmd1YWdlIHJlcXVpcmVtZW50cworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgeW91IGNob29zZSB0byBidWlsZCB0aGUgbGlicmFyaWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKKworKiBDKysKKyAgICAqIEJvb3N0IDEuNTMuMAorICAgICogbGliZXZlbnQgKG9wdGlvbmFsLCB0byBidWlsZCB0aGUgbm9uYmxvY2tpbmcgc2VydmVyKQorICAgICogemxpYiAob3B0aW9uYWwpCisqIEphdmEKKyAgICAqIEphdmEgMS44CisgICAgKiBBcGFjaGUgQW50CisqIEMjOiBNb25vIDEuMi40IChhbmQgcGtnLWNvbmZpZyB0byBkZXRlY3QgaXQpIG9yIFZpc3VhbCBTdHVkaW8gMjAwNSsKKyogUHl0aG9uIDIuNiAoaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCisqIFBIUCA1LjAgKG9wdGlvbmFsbHkgaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCisqIFJ1YnkgMS44CisgICAgKiBidW5kbGVyIGdlbQorKiBFcmxhbmcgUjEyIChSMTEgd29ya3MgYnV0IG5vdCByZWNvbW1lbmRlZCkKKyogUGVybCA1CisgICAgKiBCaXQ6OlZlY3RvcgorICAgICogQ2xhc3M6OkFjY2Vzc29yCisqIEhheGUgMy4xLjMKKyogR28gMS40CisqIERlbHBoaSAyMDEwCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9jZW50b3MubWQgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MzJjMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApAQCAtMCwwICsxLDc1IEBACisjIEJ1aWxkaW5nIEFwYWNoZSBUaHJpZnQgb24gQ2VudE9TIDYuNQorCitTdGFydGluZyB3aXRoIGEgbWluaW1hbCBpbnN0YWxsYXRpb24sIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHJlcXVpcmVkIHRvIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQ2VudG9zIDYuNS4gVGhpcyBleGFtcGxlIGJ1aWxkcyBmcm9tIHNvdXJjZSwgdXNpbmcgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgbWFzdGVyIGJyYW5jaC4gVGhlc2UgaW5zdHJ1Y3Rpb25zIHNob3VsZCBhbHNvIHdvcmsgd2l0aCBBcGFjaGUgVGhyaWZ0IHJlbGVhc2VzIGJlZ2lubmluZyB3aXRoIDAuOS4yLgorCisjIyBVcGRhdGUgdGhlIFN5c3RlbQorCisJc3VkbyB5dW0gLXkgdXBkYXRlCisKKyMjIEluc3RhbGwgdGhlIFBsYXRmb3JtIERldmVsb3BtZW50IFRvb2xzCisKKwlzdWRvIHl1bSAteSBncm91cGluc3RhbGwgIkRldmVsb3BtZW50IFRvb2xzIgorCisjIyBVcGdyYWRlIGF1dG9jb25mL2F1dG9tYWtlL2Jpc29uCisKKwlzdWRvIHl1bSBpbnN0YWxsIC15IHdnZXQKKworIyMjIFVwZ3JhZGUgYXV0b2NvbmYKKworCXdnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvY29uZi9hdXRvY29uZi0yLjY5LnRhci5negorCXRhciB4dmYgYXV0b2NvbmYtMi42OS50YXIuZ3oKKwljZCBhdXRvY29uZi0yLjY5CisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCWNkIC4uCisKKyMjIyBVcGdyYWRlIGF1dG9tYWtlCisKKwl3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b21ha2UvYXV0b21ha2UtMS4xNC50YXIuZ3oKKwl0YXIgeHZmIGF1dG9tYWtlLTEuMTQudGFyLmd6CisJY2QgYXV0b21ha2UtMS4xNAorCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKwljZCAuLgorCisjIyMgVXBncmFkZSBiaXNvbgorCisJd2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2Jpc29uL2Jpc29uLTIuNS4xLnRhci5negorCXRhciB4dmYgYmlzb24tMi41LjEudGFyLmd6CisJY2QgYmlzb24tMi41LjEKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisJY2QgLi4KKworIyMgQWRkIE9wdGlvbmFsIEMrKyBMYW5ndWFnZSBMaWJyYXJ5IERlcGVuZGVuY2llcworCitBbGwgbGFuZ3VhZ2VzIHJlcXVpcmUgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIGFuZCBhdCB0aGlzIHBvaW50IGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIG1ha2UgdGhlIElETCBDb21waWxlciBpcyBpbnN0YWxsZWQgKGlmIHlvdSBvbmx5IG5lZWQgdGhlIGNvbXBpbGVyIHlvdSBjYW4gc2tpcCB0byB0aGUgQnVpbGQgc3RlcCkuIAorCitJZiB5b3Ugd2lsbCBiZSBkZXZlbG9waW5nIEFwYWNoZSBUaHJpZnQgY2xpZW50cy9zZXJ2ZXJzIGluIEMrKyB5b3Ugd2lsbCBhbHNvIG5lZWQgYWRkaXRpb25hbCBwYWNrYWdlcyB0byBzdXBwb3J0IHRoZSBDKysgc2hhcmVkIGxpYnJhcnkgYnVpbGQuCisKKyMjIyBJbnN0YWxsIEMrKyBMaWIgRGVwZW5kZW5jaWVzCisKKwlzdWRvIHl1bSAteSBpbnN0YWxsIGxpYmV2ZW50LWRldmVsIHpsaWItZGV2ZWwgb3BlbnNzbC1kZXZlbAorCisjIyMgVXBncmFkZSBCb29zdCA+PSAxLjUzCisKKwl3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS41My4wL2Jvb3N0XzFfNTNfMC50YXIuZ3oKKwl0YXIgeHZmIGJvb3N0XzFfNTNfMC50YXIuZ3oKKwljZCBib29zdF8xXzUzXzAKKwkuL2Jvb3RzdHJhcC5zaAorCXN1ZG8gLi9iMiBpbnN0YWxsCisKKyMjIEJ1aWxkIGFuZCBJbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IElETCBDb21waWxlcgorCisJZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAorCWNkIHRocmlmdAorCS4vYm9vdHN0cmFwLnNoCisJLi9jb25maWd1cmUgLS13aXRoLWx1YT1ubworCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCitUaGlzIHdpbGwgYnVpbGQgdGhlIGNvbXBpbGVyICh0aHJpZnQvY29tcGlsZXIvY3BwL3RocmlmdCAtLXZlcnNpb24pIGFuZCBhbnkgbGFuZ3VhZ2UgbGlicmFyaWVzIHN1cHBvcnRlZC4gVGhlIG1ha2UgaW5zdGFsbCBzdGVwIGluc3RhbGxzIHRoZSBjb21waWxlciBvbiB0aGUgcGF0aDogL3Vzci9sb2NhbC9iaW4vdGhyaWZ0CitZb3UgY2FuIHVzZSB0aGUgLi9jb25maWd1cmUgLS1lbmFibGUtbGlicz1ubyBzd2l0Y2ggdG8gYnVpbGQgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIG9ubHkgd2l0aG91dCBsaWIgYnVpbGRzLiBUbyBydW4gdGVzdHMgdXNlICJtYWtlIGNoZWNrIi4KZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2RlYmlhbi5tZCBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY2OTZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCkBAIC0wLDAgKzEsNjIgQEAKKyMjIERlYmlhbi9VYnVudHUgaW5zdGFsbAorVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgaW5zdGFsbCB0b29scyBhbmQgbGlicmFyaWVzIHJlcXVpcmVkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBDKysgbGlicmFyaWVzIG9uIGEgRGViaWFuL1VidW50dSBMaW51eCBiYXNlZCBzeXN0ZW0uCisKKwlzdWRvIGFwdC1nZXQgaW5zdGFsbCBhdXRvbWFrZSBiaXNvbiBmbGV4IGcrKyBnaXQgbGliYm9vc3QtYWxsLWRldiBsaWJldmVudC1kZXYgbGlic3NsLWRldiBsaWJ0b29sIG1ha2UgcGtnLWNvbmZpZworCitEZWJpYW4gNy9VYnVudHUgMTIgdXNlcnMgbmVlZCB0byBtYW51YWxseSBpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBhdXRvbWFrZSBhbmQgKGZvciBDKysgbGlicmFyeSBhbmQgdGVzdCBzdXBwb3J0KSBib29zdDoKKworICAgIHdnZXQgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbi9wb29sL21haW4vYS9hdXRvbWFrZS0xLjE1L2F1dG9tYWtlXzEuMTUtM19hbGwuZGViCisgICAgc3VkbyBkcGtnIC1pIGF1dG9tYWtlXzEuMTUtM19hbGwuZGViCisKKyAgICB3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS42MC4wL2Jvb3N0XzFfNjBfMC50YXIuZ3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyIHh2ZiBib29zdF8xXzYwXzAudGFyLmd6CisgICAgY2QgYm9vc3RfMV82MF8wCisgICAgLi9ib290c3RyYXAuc2gKKyAgICBzdWRvIC4vYjIgaW5zdGFsbAorCisjIyBPcHRpb25hbCBwYWNrYWdlcworCitJZiB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBmb3Igb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIGFkZGl0aW9uYWwgcGFja2FnZXMuIFRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIHJlcXVpcmUgdGhlIHNwZWNpZmllZCBhZGRpdGlvbmFsIHBhY2thZ2VzOgorCisgKiBKYXZhCisJKiBwYWNrYWdlczogYW50ICAKKwkqIFlvdSB3aWxsIGFsc28gbmVlZCBKYXZhIEpESyB2MS44IG9yIGhpZ2hlci4gVHlwZSAqKmphdmFjKiogdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFja2FnZXMsIHBpY2sgdGhlIG9uZSB5b3UgcHJlZmVyIGFuZCAqKmFwdC1nZXQgaW5zdGFsbCoqIGl0IChlLmcuIGRlZmF1bHQtamRrKS4KKyAqIFJ1YnkKKwkqIHJ1YnktZnVsbCBydWJ5LWRldiBydWJ5LXJzcGVjIHJha2UgcnVieWdlbXMgYnVuZGxlcgorICogUHl0aG9uCisJKiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnCisgKiBQZXJsCisJKiBsaWJiaXQtdmVjdG9yLXBlcmwgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybAorICogUGhwLCBpbnN0YWxsCisJKiBwaHA1LWRldiBwaHA1LWNsaSBwaHB1bml0CisgKiBDX2dsaWIKKwkqIGxpYmdsaWIyLjAtZGV2CisgKiBFcmxhbmcKKwkqIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IHJlYmFyCisgKiBDc2hhcnAKKwkqIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgbnVuaXQgbnVuaXQtY29uc29sZQorICogSGFza2VsbAorCSogZ2hjIGNhYmFsLWluc3RhbGwgbGliZ2hjLWJpbmFyeS1kZXYgbGliZ2hjLW5ldHdvcmstZGV2IGxpYmdoYy1odHRwLWRldgorICogVGhyaWZ0IENvbXBpbGVyIGZvciBXaW5kb3dzCisJKiBtaW5ndy13NjQgbWluZ3ctdzY0LXg4Ni02NC1kZXYgbnNpcworICogUnVzdAorCSogcnVzdGMgY2FyZ28KKyAqIEhheGUKKwkqIGhheGUKKyAqIEx1YQorICAgICogbHVhNS4zIGxpYmx1YTUuMy1kZXYKKyAqIE5vZGVKcworICAgICogbm9kZWpzIG5wbQorICogZG90bmV0Y29yZQorICAgICogaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9uZXQvbGVhcm4vZ2V0LXN0YXJ0ZWQvbGludXh1YnVudHUKKyAqIGQtbGFuZworICAgICogY3VybCAtZnNTIGh0dHBzOi8vZGxhbmcub3JnL2luc3RhbGwuc2ggfCBiYXNoIC1zIGRtZAorICogZGFydCAmIHB1YgorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2luc3RhbGwvbGludXgKKyAgICAqIGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy90b29scy9wdWIvaW5zdGFsbGluZworCQorCisjIyBBZGRpdGlvbmFsIHJlYWRpbmcKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVpcmVtZW50cyBzZWU6IFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgVGhyaWZ0IHNlZTogW0J1aWxkaW5nIGZyb20gc291cmNlXSgvZG9jcy9CdWlsZGluZ0Zyb21Tb3VyY2UpCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9vc194Lm1kIGIvZG9jL2luc3RhbGwvb3NfeC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk5ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvb3NfeC5tZApAQCAtMCwwICsxLDI3IEBACisjIyBPUyBYIFNldHVwCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgaW5zdGFsbCBhbGwgdGhlIHJlcXVpcmVkIHRvb2xzIGFuZCBsaWJyYXJpZXMgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgb24gYSBPUyBYIGJhc2VkIHN5c3RlbS4gCisKKyMjIyBJbnN0YWxsIEJvb3N0CitEb3dubG9hZCB0aGUgYm9vc3QgbGlicmFyeSBmcm9tIFtib29zdC5vcmddKGh0dHA6Ly93d3cuYm9vc3Qub3JnKSB1bnRhciBjb21waWxlIHdpdGgKKworCS4vYm9vdHN0cmFwLnNoCisJc3VkbyAuL2IyIHRocmVhZGluZz1tdWx0aSBhZGRyZXNzLW1vZGVsPTY0IHZhcmlhbnQ9cmVsZWFzZSBzdGFnZSBpbnN0YWxsCisKKyMjIyBJbnN0YWxsIGxpYmV2ZW50CitEb3dubG9hZCBbbGliZXZlbnRdKGh0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQpLCB1bnRhciBhbmQgY29tcGlsZSB3aXRoCisKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL2xvY2FsIAorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCisjIyMgQnVpbGRpbmcgQXBhY2hlIFRocmlmdAorRG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFtBcGFjaGUgVGhyaWZ0XSgvZG93bmxvYWQpLCB1bnRhciBhbmQgY29tcGlsZSB3aXRoCisKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL2xvY2FsLyAtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbCAtLXdpdGgtbGliZXZlbnQ9L3Vzci9sb2NhbAorCisjIyBBZGRpdGlvbmFsIHJlYWRpbmcKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVpcmVtZW50cyBzZWU6IFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgVGhyaWZ0IHNlZTogW0J1aWxkaW5nIGZyb20gc291cmNlXSgvZG9jcy9CdWlsZGluZ0Zyb21Tb3VyY2UpCisKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQgYi9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTg5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCkBAIC0wLDAgKzEsMTg2IEBACisjIyBXaW5kb3dzIFNldHVwCisKK1RoZSBUaHJpZnQgZW52aXJvbm1lbnQgY29uc2lzdHMgb2YgdHdvIG1haW4gcGFydHM6IFRoZSBUaHJpZnQgY29tcGlsZXIgRVhFIGFuZCB0aGUgbGFuZ3VhZ2UtZGVwZW5kZW50IGxpYnJhcmllcy4gTW9zdCBvZiB0aGVzZSBsaWJyYXJpZXMgd2lsbCByZXF1aXJlIHNvbWUga2luZCBvZiBidWlsZCBhbmQvb3IgaW5zdGFsbGF0aW9uLiBCdXQgcmVnYXJkaW5nIHRoZSBUaHJpZnQgY29tcGlsZXIgdXRpbGl0eSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IGFsdGVybmF0aXZlcy4gCisKK1RoZSBmaXJzdCBvbmUgb2YgdGhlc2UgYWx0ZXJuYXRpdmVzIGlzIHRvIGRvd25sb2FkIHRoZSAqKnByZS1idWlsdCBUaHJpZnQgQ29tcGlsZXIgRVhFKiogYW5kIG9ubHkgYnVpbGQgdGhlIGxpYnJhcmllcyBuZWVkZWQgZnJvbSBzb3VyY2UsIGZvbGxvd2luZyBvbmUgb2YgdGhlICJTZXR1cCBmcm9tIHNvdXJjZSIgbWV0aG9kcyBvdXRsaW5lZCBiZWxvdy4KKworVGhlIG90aGVyIHR3byBvcHRpb25zIGFyZSB0byBidWlsZCB0aGUgVGhyaWZ0IGNvbXBpbGVyIGZyb20gc291cmNlLiBUaGUgbW9zdCByZWNvbW1lbmRlZCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIGJ5IG1lYW5zIG9mIHRoZSAqKlZpc3VhbCBTdHVkaW8gQysrIGJ1aWxkIHByb2plY3QqKi4gQWx0ZXJuYXRpdmVseSwgdGhlIFRocmlmdCBjb21waWxlciBjYW4gYWxzbyBiZSBidWlsdCB2aWEgKipDeWd3aW4qKiBvciAqKk1pbkdXKiogYnVpbGQgZW52aXJvbm1lbnRzLCBob3dldmVyIHRoaXMgbWV0aG9kIGlzIG5vdCBvbmx5IGxlc3MgY29tZm9ydGFibGUsIGJ1dCBtb3JlIHRpbWUtY29uc3VtaW5nIGFuZCByZXF1aXJlcyBtdWNoIG1vcmUgbWFudWFsIGVmZm9ydC4gCisKKworIyMgUHJlYnVpbHQgVGhyaWZ0IGNvbXBpbGVyCisKK1RoZSB3aW5kb3dzIFRocmlmdCBjb21waWxlciBpcyBhdmFpbGFibGUgYXMgYSBwcmVidWlsdCBleGUgYXZhaWxhYmxlIFtoZXJlXSgvZG93bmxvYWQpLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gaW5zdGFsbGF0aW9uIHRvb2wsIHJhdGhlciB0aGlzIEVYRSBmaWxlICppcyogYWxyZWFkeSB0aGUgVGhyaWZ0IGNvbXBpbGVyIHV0aWxpdHkuIERvd25sb2FkIHRoZSBmaWxlIGFuZCBwdXQgaXQgaW50byBzb21lIHN1aXRhYmxlIGxvY2F0aW9uIG9mIHlvdXIgY2hvaWNlLgorCitOb3cgcGljayBvbmUgb2YgdGhlICJCdWlsZCBhbmQgaW5zdGFsbCB0YXJnZXQgbGlicmFyaWVzIiBiZWxvdyB0byBjb250aW51ZS4KKworIAorIyMgU2V0dXAgZnJvbSBzb3VyY2UgdmlhIFZpc3VhbCBTdHVkaW8gQysrIChyZWNvbW1lbmRlZCkKKworIyMjIFJlcXVpcmVtZW50cworCitUaHJpZnQncyBjb21waWxlciBpcyB3cml0dGVuIGluIEMrKyBhbmQgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUsIGJ1dCB0aGVyZSBhcmUgc29tZSBzeXN0ZW0gcmVxdWlyZW1lbnRzLiBUaHJpZnQncyBydW50aW1lIGxpYnJhcmllcyBhcmUgd3JpdHRlbiBpbiB2YXJpb3VzIGxhbmd1YWdlcywgd2hpY2ggYXJlIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGludGVyZmFjZS4KKworICogVmlzdWFsIFN0dWRpbyBDKyssIGFueSByZWNlbnQgdmVyc2lvbiBzaG91bGQgZG8KKyAqIEZsZXggYW5kIEJpc29uLCBlLmcuIHRoZSBXaW5GbGV4Qmlzb24gcGFja2FnZQorICogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGhlIGNvbXBpbGVyCisgCitBZnRlciBhbGwgcmVxdWlyZW1lbnRzIGFyZSBpbiBwbGFjZSwgdXNlIHRoZSBgY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2pgIGJ1aWxkIHByb2plY3QgdG8gYnVpbGQgdGhlIFRocmlmdCBjb21waWxlci4gQ29weSB0aGUgcmVzdWx0aW5nIEVYRSBmaWxlIHRvIGEgbG9jYXRpb24gb2YgeW91ciBjaG9pY2UuIAorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcworCitBIGZldyBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxpYnJhcmllcyBhbHNvIGRvIHByb3ZpZGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzLCBzdWNoIGFzIEMrKyBhbmQgQyMuIFRoZXNlIGFyZSBsb2NhdGVkIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXJzLiAKKworTW9zdCBvZiB0aGUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBidWlsdCBhbmQgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzIGJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzLiBUeXBpY2FsIGV4YW1wbGVzIGFyZSBKYXZhLCBSdWJ5LCBEZWxwaGksIG9yIFBIUC4gTG9vayBmb3IgdGhlIGBSRUFETUUubWRgIGZpbGUgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCBlYWNoIGxhbmd1YWdlJ3MgbGlicmFyeSBwYWNrYWdlLgorIAorCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgQ3lnd2luCisKKyMjIyBSZXF1aXJlbWVudHMKKworVGhyaWZ0J3MgY29tcGlsZXIgaXMgd3JpdHRlbiBpbiBDKysgYW5kIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlLCBidXQgdGhlcmUgYXJlIHNvbWUgc3lzdGVtIHJlcXVpcmVtZW50cy4gVGhyaWZ0J3MgcnVudGltZSBsaWJyYXJpZXMgYXJlIHdyaXR0ZW4gaW4gdmFyaW91cyBsYW5ndWFnZXMsIHdoaWNoIGFyZSBhbHNvIHJlcXVpcmVkIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSBpbnRlcmZhY2UuCisKKyAqIEN5Z3dpbiBvciBNaW5HVyAKKyAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworIyMjIEluc3RhbGxpbmcgZnJvbSBzb3VyY2UKKworSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHRoZSBmaXJzdCB0aW1lIG91dCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnksIHlvdSB3aWxsIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UgZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKwkuL2Jvb3RzdHJhcC5zaAorCitPbmNlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBhcmUgZ2VuZXJhdGVkLCB0aHJpZnQgY2FuIGJlIGNvbmZpZ3VyZWQuIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgorCisJZXhwb3J0IENYWEZMQUdTPSItRCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUD1QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSIKKwkuL2NvbmZpZ3VyZQorCitTZXR0aW5nIHRoZSBDWFhGTEFHUyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIHdvcmtzIGFyb3VuZCBjb21waWxlIGVycm9ycyB3aXRoIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QIGJlaW5nIHVuZGVjbGFyZWQsIGJ5IHJlcGxhY2luZyBpdCB3aXRoIHRoZSBuZXdlciwgcG9ydGFibGUgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUuIChUZXN0ZWQgb24gY3lnd2luIDIwMTAwMzIwLCBUaHJpZnQgcjc2MDE4NCwgbGF0ZXN0IHB0aHJlYWQuKQorCisqKk9wdGlvbmFsOioqIFlvdSAqKm1heSBub3QqKiBiZSBhYmxlIHRvIG1ha2UgZnJvbSB0aGUgcm9vdCAgVGhyaWZ0IGRpcmVjdG9yeSBkdWUgdG8gZXJyb3JzIChzZWUgYmVsb3cgdG8gcmVzb2x2ZSkuIFRvIG1ha2UgdGhlIGNvbXBpbGVyIG9ubHksIGNoYW5nZSB0byB0aGUgY29tcGlsZXIgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIG1ha2U6CisKKwljZCBjb21waWxlci9jcHAKKworTm93IG1ha2UgdGhlIHRocmlmdCBjb21waWxlciAoJiBydW50aW1lIGxpYnJhcmllcyBpZiBtYWtlIGlzIHJ1biBmcm9tIHRoZSB0aHJpZnQgcm9vdCBkaXJlY3RvcnkpOgorCisJbWFrZQorCW1ha2UgaW5zdGFsbAorCisjIyMgQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcworCitTb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzIGJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzLiBUeXBpY2FsIGV4YW1wbGVzIGFyZSBKYXZhLCBSdWJ5LCBvciBQSFAuIExvb2sgZm9yIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgYGxpYi88bGFuZ3VhZ2U+L2AgZm9sZGVyIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGluc3RhbGxhdGlvbiBvZiBlYWNoIGxhbmd1YWdlIGxpYnJhcnkgcGFja2FnZS4KKworIyMjIFBvc3NpYmxlIGlzc3VlcyB3aXRoIEN5Z3dpbiBpbnN0YWxsCisKK1NlZSBhbHNvIFBvc3NpYmxlIGlzc3VlcyB3aXRoIE1pbkdXIGluc3RhbGwuCisKKyMjIyMgU3ludGF4IGVycm9yIGluIC4vY29uZmlndXJlCisKK1RoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJzIGZvciBzb21lIHVzZXJzIHdoZW4gcnVubmluZyAuL2NvbmZpZ3VyZToKKworCS4vY29uZmlndXJlOiBsaW5lIDIxMTgzOiBzeW50YXggZXJyb3IgbmVhciB1bmV4cGVjdGVkIHRva2VuIGBNT05PLCcKKwkuL2NvbmZpZ3VyZTogbGluZSAyMTE4MzogYCAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAxLjIuNiwgaGF2ZV9tb25vPXllcywgaGF2ZV9tb25vPW5vKScKKworVG8gcmVzb2x2ZSB0aGlzLCB5b3UnbGwgbmVlZCB0byBmaW5kIHlvdXIgcGtnLm00IChpbnN0YWxsZWQgYnkgdGhlIHBrZy1jb25maWcgcGFja2FnZSkgZmlsZSBhbmQgY29weSBpdCB0byB0aGUgdGhyaWZ0L2FjbG9jYWwgZGlyZWN0b3J5LiAgRnJvbSB0aGUgdG9wLWxldmVsIHRocmlmdCBkaXJlY3RvcnksIHlvdSBjYW4gY29weSB0aGUgZmlsZSBieSBydW5uaW5nCisKKwljcCAvdXNyL3NoYXJlL2FjbG9jYWwvcGtnLm00IGFjbG9jYWwKKworRmluYWxseSwgcmUtcnVuIC4vYm9vdHN0cmFwLnNoIGFuZCAuL2NvbmZpZ3VyZS4gIChOb3RlIHRoYXQgcGtnLm00IGlzIGNyZWF0ZWQgYnkgdGhlIHBrZy1jb25maWcgdG9vbC4gIElmIHlvdXIgL3Vzci9zaGFyZS9hY2xvY2FsIGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGhlIHBrZy5tNCBmaWxlLCB5b3UgbWF5IG5vdCBoYXZlIHBrZy1jb25maWcgaW5zdGFsbGVkLikKKworIyMjIyBJbnN0YWxsaW5nIHBlcmwgcnVudGltZSBsaWJyYXJpZXMKKworU29tZXRpbWVzLCB0aGVyZSB3aWxsIGJlIGFuIGVycm9yIGR1cmluZyB0aGUgaW5zdGFsbCBvZiB0aGUgcGVybCBsaWJyYXJpZXMgd2l0aCBjaG1vZC4KKworQSB3b3JrYXJvdW5kIGlzIHRvIGF2b2lkIGluc3RhbGxpbmcgdGhlIHBlcmwgbGlicmFyaWVzIGlmIHRoZXkgYXJlIG5vdCBuZWVkZWQuCisKK0lmIHlvdSBkb24ndCBuZWVkIHBlcmwsIHJ1biBjb25maWd1cmUgd2l0aCAtLXdpdGhvdXQtcGVybC4KKworSWYgeW91IG5lZWQgcGVybCwgYW5kIGFyZSBoYXBweSB0byBtYW51YWxseSBpbnN0YWxsIGl0LCByZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aHJpZnQvbGliL3BlcmwvTWFrZWZpbGUgd2l0aCB0aGUgZm9sbG93aW5nLCBhZnRlciBidWlsZGluZyB0aHJpZnQ6CisJCisJVE9ETworCisjIyMjIExpbmtpbmcgdG8gaW5zdGFsbGVkIEMrKyBydW50aW1lIGxpYnJhcmllcworCitTb21ldGltZXMsIHRoZSBpbnN0YWxsZWQgbGlidGhyaWZ0LmEgd2lsbCBub3QgbGluayB1c2luZyBnKyssIHdpdGggbGlua2VyIGVycm9ycyBhYm91dCBtaXNzaW5nIHZ0YWJsZXMgYW5kIGV4Y2VwdGlvbnMgZm9yIFRocmlmdCBjbGFzc2VzLgorCitBIHdvcmthcm91bmQgaXMgdG8gbGluayB0aGUgY29tcGlsZWQgb2JqZWN0IGZpbGVzIGRpcmVjdGx5IGZyb20geW91ciBUaHJpZnQgYnVpbGQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pc3NpbmcgY2xhc3Nlcy4KKworVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gYSBNYWtlZmlsZSB1c2luZyB0aGUgZm9sbG93aW5nIGxpbmVzOgorCisJVEhSSUZUX089PHBhdGggdG8+L3RocmlmdC9saWIvY3BwCisJTFRIUklGVD0kKFRIUklGVF9PKS9UaHJpZnQubyAkKFRIUklGVF9PKS9UU29ja2V0Lm8gJChUSFJJRlRfTykvVEJpbmFyeVByb3RvY29sLm8gJChUSFJJRlRfTykvVEJ1ZmZlclRyYW5zcG9ydHMubworCitUaGVuIGxpbmtpbmcgdXNpbmcgJChMVEhSSUZUKSBpbnN0ZWFkIG9mIC1sdGhyaWZ0LgorCisJVE9ETyAtIGRpYWdub3NlIGlzc3VlIGZ1cnRoZXIKKworIyMjIyBDKysgcnVudGltZSBzZWdmYXVsdCB3aXRoIGN5Z3dpbiAxLjcuNS0xLCBnKystNC4zLjQsIGZvcmsoKSBhbmQgdGhyb3cKKworSWYgeW91ciB0aHJpZnQgQysrIHByb2dyYW1zIHNlZ2ZhdWx0IG9uIHRocm93IGFmdGVyIGZvcmsoKWluZywgY29tcGlsZSB0aGVtIHdpdGggZysrLTMuCisKK1RoZSBpc3N1ZSBhbmQgcGF0Y2ggYXJlIGRlc2NyaWJlZCBvbiB0aGUgQ3lnd2luIG1haWxpbmcgbGlzdCBhdCBodHRwOi8vY3lnd2luLmNvbS9tbC9jeWd3aW4vMjAxMC0wNS9tc2cwMDIwMy5odG1sCisKK1RoaXMgaXNzdWUgc2hvdWxkIGJlIGZpeGVkIGluIEN5Z3dpbiB2ZXJzaW9ucyBhZnRlciAxLjcuNS0xLCBvciBnKysgNC41LjAuCisKKyMjIFNldHVwIGZyb20gc291cmNlIHZpYSBNaW5HVworCisjIyMgUmVxdWlyZW1lbnRzCisKK1RvIGNvbXBpbGUgdGhlIFRocmlmdCBnZW5lcmF0b3IgJiBydW50aW1lIGxpYnJhcmllcyAodW50ZXN0ZWQpIHdpdGhvdXQgdGhlIGN5Z3dpbi5kbGwgZGVwZW5kZW5jeSB5b3UgbmVlZCB0byBpbnN0YWxsIE1pbkdXICh3d3cubWluZ3cub3JnKS4gCisKKyAqIE1pbkdXIAorICogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitJbiBhZGRpdGlvbiB5b3UgbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBlbnRyeSB0byB5b3VyIHdpbmRvd3MgUEFUSCB2YXJpYWJsZS4KKworCUM6XE1JTkdXXEJJTgorCQorTmV4dCwgb3BlbiBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0gYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gdGhyaWZ0X0NYWEZMQUdTCisKKwktRE1JTkdXIC1tbm8tY3lnd2luIC1sZmwKKwkKK1J1biBib290c3RyYXAuc2g6CisKKwkuL2Jvb3RzdHJhcC5zaAorCitNYWtlIHN1cmUgeW91IGhhdmUgamF2YSBpbiB5b3VyICRQQVRIIHZhcmlhYmxlLCBpZiBub3QgZG8oYWRqdXN0IHBhdGggaWYgbmVjZXNzYXJ5KToKKworCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS44LjBfMTkxL2JpbiIKKworUnVuIGNvbmZpZ3VyZSAtIHVzaW5nIENYWEZMQUdTIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggYW4gb2xkIHB0aHJlYWRzIGRlZmluZSAodW50ZXN0ZWQgb24gTWluR1cgLSB3b3JrcyBvbiBDeWd3aW4pOgorCisJZXhwb3J0IENYWEZMQUdTPSItRCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUD1QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSIKKwkuL2NvbmZpZ3VyZQorCisnJ09wdGlvbmFsOicnIFRvIG1ha2UgdGhlIGNvbXBpbGVyIG9ubHksIGNoYW5nZSB0byB0aGUgY29tcGlsZXIgIGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyBtYWtlOgorCisJY2QgY29tcGlsZXIvY3BwCisJCitSdW4gbWFrZToKKworCW1pbmd3MzItbWFrZS5leGUKKworIyMjIFBvc3NpYmxlIGlzc3VlcyB3aXRoIE1pbkdXIGluc3RhbGwKKworU2VlIGFsc28gUG9zc2libGUgaXNzdWVzIHdpdGggQ3lnd2luIGluc3RhbGwsIGluY2x1ZGluZyB0aGUgZGlzY3Vzc2lvbiBhYm91dCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUC4KKworIyMjIyB5eXdyYXAgaXMgbm90IGZvdW5kCisKK01ha2Ugc3VyZSB5b3UgYWRkIC1sZmwgaW4geW91ciBjeHhmbGFncyBpbiBNYWtlZmlsZSwgYWxzbyB0cnkgYWRkaW5nIC1MYzovY3lnd2luL2xpYnMKKworIyMjIyBib29zdCBpcyBub3QgZm91bmQKKworVHJ5IGFuZCBjaGFuZ2UgdGhlIGluY2x1ZGUgZGlyIHRvIHVzZSB0aGUgd2luZG93cyBwYXRoIGZyb20gYyBsaWtlIHRoaXM6IEVkaXQgY29tcGlsZXIvY3BwL01ha2VmaWxlLCBsb29rIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgQk9PU1RfQ1BQRkxBR1MsIGNoYW5nZSB0aGF0IGxpbmUgZm9yCisKKwlCT09TVF9DUFBGTEFHUyA9IC1JYzovY3lnd2luL3Vzci9pbmNsdWRlL2Jvb3N0LTFfNTNfMAorCQorIyMjIyByZWFscGF0aCBpcyBub3QgZm91bmQKKworYWRkIC1ETUlOR1cgLW1uby1jeWd3aW4gdG8gdGhlIENYWERFRlMgdmFyaWFibGUgaW4gTWFrZWZpbGUKKworIyMgQWRkaXRpb25hbCByZWFkaW5nCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXF1aXJlbWVudHMgc2VlOiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIFRocmlmdCBzZWU6IFtCdWlsZGluZyBmcm9tIHNvdXJjZV0oL2RvY3MvQnVpbGRpbmdGcm9tU291cmNlKQorCmRpZmYgLS1naXQgYS9kb2MvbGdwbC0yLjEudHh0IGIvZG9jL2xpY2Vuc2VzL2xncGwtMi4xLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL2xncGwtMi4xLnR4dApyZW5hbWUgdG8gZG9jL2xpY2Vuc2VzL2xncGwtMi4xLnR4dApkaWZmIC0tZ2l0IGEvZG9jL290cC1iYXNlLWxpY2Vuc2UudHh0IGIvZG9jL2xpY2Vuc2VzL290cC1iYXNlLWxpY2Vuc2UudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQKcmVuYW1lIHRvIGRvYy9saWNlbnNlcy9vdHAtYmFzZS1saWNlbnNlLnR4dApkaWZmIC0tZ2l0IGEvZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgYi9kb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMWE3ZC4uMDAwMDAwMAotLS0gYS9kb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLVRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCi1Db3B5cmlnaHQgKGMpIDIwMDYtIEZhY2Vib29rLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgotb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKLXRoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAotZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUKLVNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCi1kbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKLQotVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKLXRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi1tdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKLWFsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKLXdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQotYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCi1TSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCi1GT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLUFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBiL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlYzdhZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQKQEAgLTAsMCArMSw4MiBAQAorPGxpbmsgaHJlZj0iaHR0cDovL2tldmluYnVya2UuYml0YnVja2V0Lm9yZy9tYXJrZG93bmNzcy9tYXJrZG93bi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+PC9saW5rPgorCitIZWFkZXIgZm9ybWF0IGZvciB0aGUgVEhlYWRlci5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgICAgSEVBREVSIE1BR0lDICAgICAgICAgIHwgICAgICAgICAgICBGTEFHUyAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgU0VRVUVOQ0UgTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgMHwgICAgIEhlYWRlciBTaXplKC8zMikgICAgICAgIHwgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGlzIG9mIHZhcmlhYmxlIHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc3RhcnRzIGF0IG9mZnNldCAxNCkKKworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICBQUk9UT0NPTCBJRCAgKHZhcmludCkgIHwgICBOVU0gVFJBTlNGT1JNUyAodmFyaW50KSAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICBUUkFOU0ZPUk0gMCBJRCAodmFyaW50KSAgIHwgICAgICAgIFRSQU5TRk9STSAwIERBVEEgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgSU5GTyAwIElEICh2YXJpbnQpICAgICAgfCAgICAgICBJTkZPIDAgIERBVEEgLi4uCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKK1RoZSBgTEVOR1RIYCBmaWVsZCBpcyAzMiBiaXRzLCBhbmQgY291bnRzIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlCitwYWNrZXQsIE5PVCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZC4gIFRoZSBoZWFkZXIgc2l6ZSBmaWVsZCBpcyAxNgorYml0cywgYW5kIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlciByZW1haW5pbmcgTk9UIGluY2x1ZGluZyB0aGUKK2BIRUFERVIgTUFHSUNgLCBgRkxBR1NgLCBgU0VRVUVOQ0UgTlVNQkVSYCBhbmQgaGVhZGVyIHNpemUgZmllbGRzLiAgVGhlCitIZWFkZXIgc2l6ZSBmaWVsZCBpcyBpbiBieXRlcy80LgorCitUaGUgdHJhbnNmb3JtIElEJ3MgYXJlIHZhcmludHMuICBUaGUgZGF0YSBmb3IgZWFjaCB0cmFuc2Zvcm0gaXMKK2RlZmluZWQgYnkgdGhlIHRyYW5zZm9ybSBJRCBpbiB0aGUgY29kZSAtIG5vIHNpemUgaXMgZ2l2ZW4gaW4gdGhlCitoZWFkZXIuICBJZiBhIHRyYW5zZm9ybSBJRCBpcyBzcGVjaWZpZWQgZnJvbSBhIGNsaWVudCBhbmQgdGhlIHNlcnZlcgorZG9lc24ndCBrbm93IGFib3V0IHRoZSB0cmFuc2Zvcm0gSUQsIGFuIGVycm9yIE1VU1QgYmUgcmV0dXJuZWQgYXMgd2UKK2Rvbid0IGtub3cgaG93IHRvIHRyYW5zZm9ybSB0aGUgZGF0YS4KKworQ29udmVyc2VseSwgZGF0YSBpbiB0aGUgaW5mbyBoZWFkZXJzIGlzIGlnbm9yYWJsZS4gIFRoaXMgc2hvdWxkIG9ubHkKK2JlIHRoaW5ncyBsaWtlIHRpbWVzdGFtcHMsIGRlYnVnaW5nIHRyYWNpbmcsIGV0Yy4gIFVzaW5nIHRoZSBoZWFkZXIKK3NpemUgeW91IHNob3VsZCBiZSBhYmxlIHRvIHNraXAgdGhpcyBkYXRhIGFuZCByZWFkIHRoZSBwYXlsb2FkIHNhZmVseQoraWYgeW91IGRvbid0IGtub3cgdGhlIGluZm8gSUQuCisKK0luZm8ncyBzaG91bGQgYmUgb2xkZXN0IHN1cHBvcnRlZCB0byBuZXdlc3Qgc3VwcG9ydGVkIG9yZGVyLCBzbyB0aGF0CitpZiB3ZSByZWFkIGFuIGluZm8gSUQgd2UgZG9uJ3Qgc3VwcG9ydCwgbm9uZSBvZiB0aGUgcmVtYWluaW5nIGluZm8KK0lEJ3Mgd2lsbCBiZSBzdXBwb3J0ZWQgZWl0aGVyLCBhbmQgd2UgY2FuIHNhZmVseSBza2lwIHRvIHRoZSBwYXlsb2FkLgorCitJbmZvIElEJ3MgYW5kIHRyYW5zZm9ybSBJRCdzIHNob3VsZCBzaGFyZSB0aGUgc2FtZSBJRCBzcGFjZS4KKworIyMjIFBBRERJTkc6CisKK0hlYWRlciB3aWxsIGJlIHBhZGRlZCBvdXQgdG8gbmV4dCA0LWJ5dGUgYm91bmRhcnkgd2l0aCBgMHgwMGAuCisKK01heCBmcmFtZSBzaXplIGlzIGAweDNGRkZGRkZGYCwgd2hpY2ggaXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGBIVFRQX01BR0lDYC4KK1RoaXMgYWxsb3dzIHVzIHRvIGRpc3Rpbmd1c2ggYmV0d2VlbiBkaWZmZXJlbnQgKG9sZGVyKSB0cmFuc3BvcnRzLgorCisjIyMgVHJhbnNmb3JtIElEczoKKworICAgIFpMSUJfVFJBTlNGT1JNIDB4MDEgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHpsaWIgdG8gKGRlKWNvbXByZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorCisgICAgSE1BQ19UUkFOU0ZPUk0gMHgwMiAtIFZhcmlhYmxlIGFtb3VudCBvZiBtYWMgZGF0YS4gIE9uZSBieXRlIHRvIHNwZWNpZnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS4gTWFjIGRhdGEgaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICAgIFNOQVBQWV9UUkFOU0ZPUk0gIDB4MDMgIC0gTm8gZGF0YSBmb3IgdGhpcy4gIFVzZSBzbmFwcHkgdG8gKGRlKWNvbXByZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgorCisKKyMjI0luZm8gSURzOgorCisgICAgSU5GT19LRVlWQUxVRSAweDAxIC0gdmFyaW50MzIgbnVtYmVyIG9mIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgIC0ga2V5L3ZhbHVlIHBhaXJzIG9mIHZhcnN0cmluZ3MgKHZhcmludDE2IGxlbmd0aCBwbHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgbm8tdHJhaWxpbmctbnVsbCBzdHJpbmcpLgorCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvaWRsLm1kIGIvZG9jL3NwZWNzL2lkbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIyZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL2lkbC5tZApAQCAtMCwwICsxLDI3MiBAQAorIyMgVGhyaWZ0IGludGVyZmFjZSBkZXNjcmlwdGlvbiBsYW5ndWFnZQorVGhlIFRocmlmdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSAoSURMKSBhbGxvd3MgZm9yIHRoZSBkZWZpbml0aW9uIG9mIFtUaHJpZnQgVHlwZXNdKC9kb2NzL3R5cGVzKS4gQSBUaHJpZnQgSURMIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBUaHJpZnQgY29kZSBnZW5lcmF0b3IgdG8gcHJvZHVjZSBjb2RlIGZvciB0aGUgdmFyaW91cyB0YXJnZXQgbGFuZ3VhZ2VzIHRvIHN1cHBvcnQgdGhlIGRlZmluZWQgc3RydWN0cyBhbmQgc2VydmljZXMgaW4gdGhlIElETCBmaWxlLgorCisjIyBEZXNjcmlwdGlvbgorCisqVW5kZXIgY29uc3RydWN0aW9uKgorCitIZXJlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIFRocmlmdCBJREwuCisKKyMjIERvY3VtZW50CisKK0V2ZXJ5IFRocmlmdCBkb2N1bWVudCBjb250YWlucyAwIG9yIG1vcmUgaGVhZGVycyBmb2xsb3dlZCBieSAwIG9yIG1vcmUgZGVmaW5pdGlvbnMuCisKKyAgICBbMV0gIERvY3VtZW50ICAgICAgICA6Oj0gIEhlYWRlciogRGVmaW5pdGlvbioKKworIyMgSGVhZGVyCisKK0EgaGVhZGVyIGlzIGVpdGhlciBhIFRocmlmdCBpbmNsdWRlLCBhIEMrKyBpbmNsdWRlLCBvciBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KKworICAgIFsyXSAgSGVhZGVyICAgICAgICAgIDo6PSAgSW5jbHVkZSB8IENwcEluY2x1ZGUgfCBOYW1lc3BhY2UKKworIyMjIFRocmlmdCBJbmNsdWRlCisKK0FuIGluY2x1ZGUgbWFrZXMgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW5vdGhlciBmaWxlIHZpc2libGUgKHdpdGggYSBwcmVmaXgpIGFuZCBhZGRzIGNvcnJlc3BvbmRpbmcgaW5jbHVkZSBzdGF0ZW1lbnRzIGludG8gdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciB0aGlzIFRocmlmdCBkb2N1bWVudC4KKworICAgIFszXSAgSW5jbHVkZSAgICAgICAgIDo6PSAgJ2luY2x1ZGUnIExpdGVyYWwKKworIyMjIEMrKyBJbmNsdWRlCisKK0EgQysrIGluY2x1ZGUgYWRkcyBhIGN1c3RvbSBDKysgaW5jbHVkZSB0byB0aGUgb3V0cHV0IG9mIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgZm9yIHRoaXMgVGhyaWZ0IGRvY3VtZW50LiAKKworICAgIFs0XSAgQ3BwSW5jbHVkZSAgICAgIDo6PSAgJ2NwcF9pbmNsdWRlJyBMaXRlcmFsCisKKyMjIyBOYW1lc3BhY2UKKworQSBuYW1lc3BhY2UgZGVjbGFyZXMgd2hpY2ggbmFtZXNwYWNlcy9wYWNrYWdlL21vZHVsZS9ldGMuIHRoZSB0eXBlIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSB3aWxsIGJlIGRlY2xhcmVkIGluIGZvciB0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gVGhlIG5hbWVzcGFjZSBzY29wZSBpbmRpY2F0ZXMgd2hpY2ggbGFuZ3VhZ2UgdGhlIG5hbWVzcGFjZSBhcHBsaWVzIHRvOyBhIHNjb3BlIG9mICcqJyBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZXNwYWNlIGFwcGxpZXMgdG8gYWxsIHRhcmdldCBsYW5ndWFnZXMuCisKKyAgICBbNV0gIE5hbWVzcGFjZSAgICAgICA6Oj0gICggJ25hbWVzcGFjZScgKCBOYW1lc3BhY2VTY29wZSBJZGVudGlmaWVyICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdzbWFsbHRhbGsuY2F0ZWdvcnknIFNUSWRlbnRpZmllciApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAnc21hbGx0YWxrLnByZWZpeCcgSWRlbnRpZmllciApICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAncGhwX25hbWVzcGFjZScgTGl0ZXJhbCApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3hzZF9uYW1lc3BhY2UnIExpdGVyYWwgKQorCisgICAgWzZdICBOYW1lc3BhY2VTY29wZSAgOjo9ICAnKicgfCAnY3BwJyB8ICdqYXZhJyB8ICdweScgfCAncGVybCcgfCAncmInIHwgJ2NvY29hJyB8ICdjc2hhcnAnCisKK04uQi46IFNtYWxsdGFsayBoYXMgdHdvIGRpc3RpbmN0IHR5cGVzIG9mIG5hbWVzcGFjZSBjb21tYW5kczoKKworLSBzbWFsbHRhbGsucHJlZml4OiBQcmVwZW5kZWQgdG8gZ2VuZXJhdGVkIGNsYXNzbmFtZXMuCisgIC0gU21hbGx0YWxrIGRvZXMgbm90IGhhdmUgbmFtZXNwYWNlcyBmb3IgY2xhc3Nlcywgc28gcHJlZml4ZXMKKyAgICBhcmUgdXNlZCB0byBhdm9pZCBjbGFzcy1uYW1lIGNvbGxpc2lvbnMuCisgICAgT2Z0ZW4sIHRoZSBwcmVmaXggaXMgdGhlIGF1dGhvcidzIGluaXRpYWxzLCBsaWtlICJLQiIgb3IgIkpXUyIsCisgICAgb3IgYW4gYWJicmV2aWF0aW9uIG9mIHRoZSBwYWNrYWdlIG5hbWUsIGxpa2UgIk1DIiBmb3IgIk1vbnRpY2VsbG8iLgorLSBzbWFsbHRhbGsuY2F0ZWdvcnk6IERldGVybWluZXMgdGhlIGNhdGVnb3J5IGZvciBnZW5lcmF0ZWQgY2xhc3Nlcy4KKyAgQW55IGRvdHMgaW4gdGhlIGlkZW50aWZpZXIgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGh5cGhlbnMgd2hlbiBnZW5lcmF0aW5nCisgIHRoZSBjYXRlZ29yeSBuYW1lLgorICBJZiBub3QgcHJvdmlkZWQsIGRlZmF1bHRzIHRvICJHZW5lcmF0ZWQtIiArIHRoZSBwcm9ncmFtIG5hbWUuCisgIE1ldGhvZHMgd2lsbCBub3QgYmUgY2F0ZWdvcml6ZWQgYmV5b25kICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIuCisgIC0gU21hbGx0YWxrIGFsbG93cyBmaWxpbmcgYm90aCBjbGFzc2VzIGFuZCBtZXRob2RzIHdpdGhpbiBjbGFzc2VzIGludG8gbmFtZWQKKyAgICBncm91cHMuIFRoZXNlIG5hbWVkIGdyb3VwcyBvZiBtZXRob2RzIGFyZSBjYWxsZWQgY2F0ZWdvcmllcy4KKworTi5CLjogVGhlIGBwaHBfbmFtZXNwYWNlYCBkaXJlY3RpdmUgd2lsbCBiZSBkZXByZWNhdGVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBpbiBmYXZvciBvZiB0aGUgc2NvcGVkIHN5bnRheCwgYnV0IHRoZSBzY29wZWQgc3ludGF4IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBQSFAuCisKK04uQi46IFRoZSBgeHNkX25hbWVzcGFjZWAgZGlyZWN0aXZlIGhhcyBzb21lIHB1cnBvc2UgaW50ZXJuYWwgdG8gRmFjZWJvb2sgYnV0IHNlcnZlcyBubyBwdXJwb3NlIGluIFRocmlmdCBpdHNlbGYuIFVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQKKworIyMgRGVmaW5pdGlvbgorCisgICAgWzddICBEZWZpbml0aW9uICAgICAgOjo9ICBDb25zdCB8IFR5cGVkZWYgfCBFbnVtIHwgU2VudW0gfCBTdHJ1Y3QgfCBVbmlvbiB8IEV4Y2VwdGlvbiB8IFNlcnZpY2UKKworIyMjIENvbnN0CisKKyAgICBbOF0gIENvbnN0ICAgICAgICAgICA6Oj0gICdjb25zdCcgRmllbGRUeXBlIElkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8KKworIyMjIFR5cGVkZWYKKworQSB0eXBlZGVmIGNyZWF0ZXMgYW4gYWx0ZXJuYXRlIG5hbWUgZm9yIGEgdHlwZS4KKworICAgIFs5XSAgVHlwZWRlZiAgICAgICAgIDo6PSAgJ3R5cGVkZWYnIERlZmluaXRpb25UeXBlIElkZW50aWZpZXIKKworIyMjIEVudW0KKworQW4gZW51bSBjcmVhdGVzIGFuIGVudW1lcmF0ZWQgdHlwZSwgd2l0aCBuYW1lZCB2YWx1ZXMuIElmIG5vIGNvbnN0YW50IHZhbHVlIGlzIHN1cHBsaWVkLCB0aGUgdmFsdWUgaXMgZWl0aGVyIDAgZm9yIHRoZSBmaXJzdCBlbGVtZW50LCBvciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmVjZWRpbmcgdmFsdWUgZm9yIGFueSBzdWJzZXF1ZW50IGVsZW1lbnQuIEFueSBjb25zdGFudCB2YWx1ZSB0aGF0IGlzIHN1cHBsaWVkIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgorCisgICAgWzEwXSBFbnVtICAgICAgICAgICAgOjo9ICAnZW51bScgSWRlbnRpZmllciAneycgKElkZW50aWZpZXIgKCc9JyBJbnRDb25zdGFudCk/IExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIyBTZW51bQorCitTZW51bSAoYW5kIFNsaXN0KSBhcmUgbm93IGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBib3RoIGJlIHJlcGxhY2VkIHdpdGggU3RyaW5nLgorCisgICAgWzExXSBTZW51bSAgICAgICAgICAgOjo9ICAnc2VudW0nIElkZW50aWZpZXIgJ3snIChMaXRlcmFsIExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIyBTdHJ1Y3QKKworU3RydWN0cyBhcmUgdGhlIGZ1bmRhbWVudGFsIGNvbXBvc2l0aW9uYWwgdHlwZSBpbiBUaHJpZnQuIFRoZSBuYW1lIG9mIGVhY2ggZmllbGQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzdHJ1Y3QuCisKKyAgICBbMTJdIFN0cnVjdCAgICAgICAgICA6Oj0gICdzdHJ1Y3QnIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JworCitOLkIuOiBUaGUgYHhzZF9hbGxgIGtleXdvcmQgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyMgVW5pb24KKworVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBjb25zaWRlcmVkIG9wdGlvbmFsIChzZWUgcmVxdWlyZWRuZXNzKS4KKworICAgIFsxM10gVW5pb24gICAgICAgICAgOjo9ICAndW5pb24nIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JworCitOLkIuOiBUaGUgYHhzZF9hbGxgIGtleXdvcmQgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyMgRXhjZXB0aW9uCisKK0V4Y2VwdGlvbnMgYXJlIHNpbWlsYXIgdG8gc3RydWN0cyBleGNlcHQgdGhhdCB0aGV5IGFyZSBpbnRlbmRlZCB0byBpbnRlZ3JhdGUgd2l0aCB0aGUgbmF0aXZlIGV4Y2VwdGlvbiBoYW5kbGluZyBtZWNoYW5pc21zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiBUaGUgbmFtZSBvZiBlYWNoIGZpZWxkIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZXhjZXB0aW9uLgorCisgICAgWzE0XSBFeGNlcHRpb24gICAgICAgOjo9ICAnZXhjZXB0aW9uJyBJZGVudGlmaWVyICd7JyBGaWVsZCogJ30nCisKKyMjIyBTZXJ2aWNlCisKK0Egc2VydmljZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBhIHNldCBvZiBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGEgVGhyaWZ0IHNlcnZlci4gVGhlIGludGVyZmFjZSBpcyBzaW1wbHkgYSBsaXN0IG9mIGZ1bmN0aW9ucy4gQSBzZXJ2aWNlIGNhbiBleHRlbmQgYW5vdGhlciBzZXJ2aWNlLCB3aGljaCBzaW1wbHkgbWVhbnMgdGhhdCBpdCBwcm92aWRlcyB0aGUgZnVuY3Rpb25zIG9mIHRoZSBleHRlbmRlZCBzZXJ2aWNlIGluIGFkZGl0aW9uIHRvIGl0cyBvd24uCisKKyAgICBbMTVdIFNlcnZpY2UgICAgICAgICA6Oj0gICdzZXJ2aWNlJyBJZGVudGlmaWVyICggJ2V4dGVuZHMnIElkZW50aWZpZXIgKT8gJ3snIEZ1bmN0aW9uKiAnfScKKworIyMgRmllbGQKKworICAgIFsxNl0gRmllbGQgICAgICAgICAgIDo6PSAgRmllbGRJRD8gRmllbGRSZXE/IEZpZWxkVHlwZSBJZGVudGlmaWVyICgnPSBDb25zdFZhbHVlKT8gWHNkRmllbGRPcHRpb25zIExpc3RTZXBhcmF0b3I/CisKKyMjIyBGaWVsZCBJRAorCisgICAgWzE3XSBGaWVsZElEICAgICAgICAgOjo9ICBJbnRDb25zdGFudCAnOicKKworIyMjIEZpZWxkIFJlcXVpcmVkbmVzcworCitUaGVyZSBhcmUgdHdvIGV4cGxpY2l0IHJlcXVpcmVkbmVzcyB2YWx1ZXMsIGFuZCBhIHRoaXJkIG9uZSB0aGF0IGlzIGFwcGxpZWQgaW1wbGljaXR5IGlmIG5laXRoZXIgICpyZXF1aXJlZCogbm9yICpvcHRpb25hbCogYXJlIGdpdmVuOiAqZGVmYXVsdCogcmVxdWlyZWRuZXNzLgorCisgICAgWzE4XSBGaWVsZFJlcSAgICAgICAgOjo9ICAncmVxdWlyZWQnIHwgJ29wdGlvbmFsJyAKKworVGhlIGdlbmVyYWwgcnVsZXMgZm9yIHJlcXVpcmVkbmVzcyBhcmUgYXMgZm9sbG93czoKKworIyMjIyByZXF1aXJlZAorCistIFdyaXRlOiBSZXF1aXJlZCBmaWVsZHMgYXJlIGFsd2F5cyB3cml0dGVuIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgc2V0LgorLSBSZWFkOiBSZXF1aXJlZCBmaWVsZHMgYXJlIGFsd2F5cyByZWFkIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkIGluIHRoZSBpbnB1dCBzdHJlYW0uCistIERlZmF1bHRzIHZhbHVlczogYXJlIGFsd2F5cyB3cml0dGVuCisKK0lmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyBkdXJpbmcgcmVhZCwgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBpcyB0byBpbmRpY2F0ZSBhbiB1bnN1Y2Nlc3NmdWwgcmVhZCBvcGVyYXRpb24gdG8gdGhlIGNhbGxlciwgZS5nLiBieSB0aHJvd2luZyBhbiBleGNlcHRpb24gb3IgcmV0dXJuaW5nIGFuIGVycm9yLiAKKworQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW91ciwgcmVxdWlyZWQgZmllbGRzIGRyYXN0aWNhbGx5IGxpbWl0IHRoZSBvcHRpb25zIHdpdGggcmVnYXJkIHRvIHNvZnQgdmVyc2lvbmluZy4gQmVjYXVzZSB0aGV5IG11c3QgYmUgcHJlc2VudCBvbiByZWFkLCB0aGUgZmllbGRzIGNhbm5vdCBiZSBkZXByZWNhdGVkLiBJZiBhIHJlcXVpcmVkIGZpZWxkIHdvdWxkIGJlIHJlbW92ZWQgKG9yIGNoYW5nZWQgdG8gb3B0aW9uYWwpLCB0aGUgZGF0YSBhcmUgbm8gbG9uZ2VyIGNvbXBhdGlibGUgYmV0d2VlbiB2ZXJzaW9ucy4KKwkKKyMjIyMgb3B0aW9uYWwKKworLSBXcml0ZTogT3B0aW9uYWwgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4gd2hlbiB0aGV5IGFyZSBzZXQKKy0gUmVhZDogT3B0aW9uYWwgZmllbGRzIG1heSwgb3IgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uIAorLSBEZWZhdWx0IHZhbHVlczogYXJlIHdyaXR0ZW4gd2hlbiB0aGUgaXNzZXQgZmxhZyBpcyBzZXQKKworTW9zdCBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgdXNlIHRoZSByZWNvbW1lbmRlZCBwcmF0aWNlIG9mIHNvLWNhbGxlZCAiaXNzZXQiIGZsYWdzIHRvIGluZGljYXRlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG9wdGlvbmFsIGZpZWxkIGlzIHNldCBvciBub3QuIE9ubHkgZmllbGRzIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgd3JpdHRlbiwgYW5kIGNvbnZlcnNlbHkgdGhlIGZsYWcgaXMgb25seSBzZXQgd2hlbiBhIGZpZWxkIHZhbHVlIGhhcyBiZWVuIHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAKKwkKKyMjIyMgZGVmYXVsdCByZXF1aXJlZG5lc3MgKGltcGxpY2l0KQorCistIFdyaXRlOiBJbiB0aGVvcnksIHRoZSBmaWVsZHMgYXJlIGFsd2F5cyB3cml0dGVuLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zIHRvIHRoYXQgcnVsZSwgc2VlIGJlbG93LgorLSBSZWFkOiBMaWtlIG9wdGlvbmFsLCB0aGUgZmllbGQgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBtYXkgbm90IGJlIHdyaXR0ZW4gKHNlZSBuZXh0IHNlY3Rpb24pCisKK0RlZmF1bHQgcmVxdWlyZWRuZXNzIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gVGhlIGRlc2lyZWQgYmVoYXZpb3VyIGlzIGEgbWl4IG9mIG9wdGlvbmFsIGFuZCByZXF1aXJlZCwgaGVuY2UgdGhlIGludGVybmFsIG5hbWUgIm9wdC1pbiwgcmVxLW91dCIuIEFsdGhvdWdoIGluIHRoZW9yeSB0aGVzZSBmaWVsZHMgYXJlIHN1cHBvc2VkIHRvIGJlIHdyaXR0ZW4gKCJyZXEtb3V0IiksIGluIHJlYWxpdHkgdW5zZXQgZmllbGRzIGFyZSBub3QgYWx3YXlzIHdyaXR0ZW4uIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSwgd2hlbiB0aGUgZmllbGQgY29udGFpbnMgYSA8bnVsbD4gdmFsdWUsIHdoaWNoIGJ5IGRlZmluaXRpb24gY2Fubm90IGJlIHRyYW5zcG9ydGVkIHRocm91Z2ggdGhyaWZ0LiBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIGJ5IG5vdCB3cml0aW5nIHRoYXQgZmllbGQgYXQgYWxsLCBhbmQgdGhhdCdzIHdoYXQgbW9zdCBsYW5ndWFnZXMgZG8uCisJCisjIyMjIFNlbWFudGljcyBvZiBEZWZhdWx0IFZhbHVlcworCitUaGVyZSBhcmUgb25nb2luZyBkaXNjdXNzaW9ucyBhYm91dCB0aGF0IHRvcGljLCBzZWUgSklSQSBmb3IgZGV0YWlscy4gTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgdHJlYXQgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHZlcnkgc2FtZSB3YXksIGJ1dCB0aGUgY3VycmVudCBzdGF0dXMgcXVvIGlzIG1vcmUgb3IgbGVzcyB0aGF0IGRlZmF1bHQgZmllbGRzIGFyZSB0eXBpY2FsbHkgc2V0IGF0IGluaXRpYWxpemF0aW9uIHRpbWUuIFRoZXJlZm9yZSwgYSB2YWx1ZSB0aGF0IGVxdWFscyB0aGUgZGVmYXVsdCBtYXkgbm90IGJlIHdyaXR0ZW4sIGJlY2F1c2UgdGhlIHJlYWQgZW5kIHdpbGwgc2V0IHRoZSB2YWx1ZSBpbXBsaWNpdGx5LiBPbiB0aGUgb3RoZXIgaGFuZCwgYW4gaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byB3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBhbnl3YXlzLCBhcyB0aGVyZSBpcyBubyBoYXJkIHJlc3RyaWN0aW9uIHRoYXQgcHJldmVudHMgdGhpcy4gCisKK1RoZSBtYWpvciBwb2ludCB0byBrZWVwIGluIG1pbmQgaGVyZSBpcyB0aGUgZmFjdCwgdGhhdCBhbnkgdW53cml0dGVuIGRlZmF1bHQgdmFsdWUgaW1wbGljaXRseSBiZWNvbWVzIHBhcnQgb2YgdGhlIGludGVyZmFjZSB2ZXJzaW9uLiBJZiB0aGF0IGRlZmF1bHQgaXMgY2hhbmdlZCwgdGhlIGludGVyZmFjZSBjaGFuZ2VzLiBJZiwgaW4gY29udHJhc3QsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0IGRhdGEsIHRoZSBkZWZhdWx0IGluIHRoZSBJREwgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSB3aXRob3V0IGFmZmVjdGluZyBzZXJpYWxpemVkIGRhdGEuCisKKyMjIyBYU0QgT3B0aW9ucworCitOLkIuOiBUaGVzZSBoYXZlICBzb21lIGludGVybmFsIHB1cnBvc2UgYXQgRmFjZWJvb2sgYnV0IHNlcnZlIG5vIGN1cnJlbnQgcHVycG9zZSBpbiBUaHJpZnQuIFVzZSBvZiB0aGVzZSBvcHRpb25zIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLgorCisgICAgWzE5XSBYc2RGaWVsZE9wdGlvbnMgOjo9ICAneHNkX29wdGlvbmFsJz8gJ3hzZF9uaWxsYWJsZSc/IFhzZEF0dHJzPworCisgICAgWzIwXSBYc2RBdHRycyAgICAgICAgOjo9ICAneHNkX2F0dHJzJyAneycgRmllbGQqICd9JworCisjIyBGdW5jdGlvbnMKKworICAgIFsyMV0gRnVuY3Rpb24gICAgICAgIDo6PSAgJ29uZXdheSc/IEZ1bmN0aW9uVHlwZSBJZGVudGlmaWVyICcoJyBGaWVsZCogJyknIFRocm93cz8gTGlzdFNlcGFyYXRvcj8KKworICAgIFsyMl0gRnVuY3Rpb25UeXBlICAgIDo6PSAgRmllbGRUeXBlIHwgJ3ZvaWQnCisKKyAgICBbMjNdIFRocm93cyAgICAgICAgICA6Oj0gICd0aHJvd3MnICcoJyBGaWVsZCogJyknCisKKyMjIFR5cGVzCisKKyAgICBbMjRdIEZpZWxkVHlwZSAgICAgICA6Oj0gIElkZW50aWZpZXIgfCBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKKworICAgIFsyNV0gRGVmaW5pdGlvblR5cGUgIDo6PSAgQmFzZVR5cGUgfCBDb250YWluZXJUeXBlCisKKyAgICBbMjZdIEJhc2VUeXBlICAgICAgICA6Oj0gICdib29sJyB8ICdieXRlJyB8ICdpOCcgfCAnaTE2JyB8ICdpMzInIHwgJ2k2NCcgfCAnZG91YmxlJyB8ICdzdHJpbmcnIHwgJ2JpbmFyeScgfCAnc2xpc3QnCisKKyAgICBbMjddIENvbnRhaW5lclR5cGUgICA6Oj0gIE1hcFR5cGUgfCBTZXRUeXBlIHwgTGlzdFR5cGUKKworICAgIFsyOF0gTWFwVHlwZSAgICAgICAgIDo6PSAgJ21hcCcgQ3BwVHlwZT8gJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JworCisgICAgWzI5XSBTZXRUeXBlICAgICAgICAgOjo9ICAnc2V0JyBDcHBUeXBlPyAnPCcgRmllbGRUeXBlICc+JworCisgICAgWzMwXSBMaXN0VHlwZSAgICAgICAgOjo9ICAnbGlzdCcgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZT8KKworICAgIFszMV0gQ3BwVHlwZSAgICAgICAgIDo6PSAgJ2NwcF90eXBlJyBMaXRlcmFsCisKKyMjIENvbnN0YW50IFZhbHVlcworCisgICAgWzMyXSBDb25zdFZhbHVlICAgICAgOjo9ICBJbnRDb25zdGFudCB8IERvdWJsZUNvbnN0YW50IHwgTGl0ZXJhbCB8IElkZW50aWZpZXIgfCBDb25zdExpc3QgfCBDb25zdE1hcAorCisgICAgWzMzXSBJbnRDb25zdGFudCAgICAgOjo9ICAoJysnIHwgJy0nKT8gRGlnaXQrCisKKyAgICBbMzRdIERvdWJsZUNvbnN0YW50ICA6Oj0gICgnKycgfCAnLScpPyBEaWdpdCogKCcuJyBEaWdpdCspPyAoICgnRScgfCAnZScpIEludENvbnN0YW50ICk/CisKKyAgICBbMzVdIENvbnN0TGlzdCAgICAgICA6Oj0gICdbJyAoQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPykqICddJworCisgICAgWzM2XSBDb25zdE1hcCAgICAgICAgOjo9ICAneycgKENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMgQmFzaWMgRGVmaW5pdGlvbnMKKworIyMjIExpdGVyYWwKKworICAgIFszN10gTGl0ZXJhbCAgICAgICAgIDo6PSAgKCciJyBbXiJdKiAnIicpIHwgKCInIiBbXiddKiAiJyIpCisKKyMjIyBJZGVudGlmaWVyCisKKyAgICBbMzhdIElkZW50aWZpZXIgICAgICA6Oj0gICggTGV0dGVyIHwgJ18nICkgKCBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICdfJyApKgorCisgICAgWzM5XSBTVElkZW50aWZpZXIgICAgOjo9ICAoIExldHRlciB8ICdfJyApICggTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnXycgfCAnLScgKSoKKworIyMjIExpc3QgU2VwYXJhdG9yCisKKyAgICBbNDBdIExpc3RTZXBhcmF0b3IgICA6Oj0gICcsJyB8ICc7JworCisjIyMgTGV0dGVycyBhbmQgRGlnaXRzCisKKyAgICBbNDFdIExldHRlciAgICAgICAgICA6Oj0gIFsnQSctJ1onXSB8IFsnYSctJ3onXQorCisgICAgWzQyXSBEaWdpdCAgICAgICAgICAgOjo9ICBbJzAnLSc5J10KKworIyMgRXhhbXBsZXMKKworSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBUaHJpZnQgZGVmaW5pdGlvbnMsIHVzaW5nIHRoZSBUaHJpZnQgSURMOgorCisgKiBbVGhyaWZ0VGVzdC50aHJpZnRdW10gdXNlZCBieSB0aGUgVGhyaWZ0IFRlc3RGcmFtZXdvcmsKKyAqIFRocmlmdCBbdHV0b3JpYWxdW10KKyAqIEZhY2Vib29rJ3MgW2ZiMzAzLnRocmlmdF1bXQorICogW0FwYWNoZSBDYXNzYW5kcmEnc11bXSBUaHJpZnQgSURMOiBbY2Fzc2FuZHJhLnRocmlmdF1bXQorICogW0V2ZXJub3RlIEFQSV1bXQorCisgW1RocmlmdFRlc3QudGhyaWZ0XTogIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcGFjaGUvdGhyaWZ0L21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgW3R1dG9yaWFsXTogICAgICAgICAgIC90dXRvcmlhbC8KKyBbZmIzMDMudGhyaWZ0XTogICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwYWNoZS90aHJpZnQvbWFzdGVyL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CisgW0FwYWNoZSBDYXNzYW5kcmEnc106IGh0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy8KKyBbY2Fzc2FuZHJhLnRocmlmdF06ICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9jYXNzYW5kcmEvdHJ1bmsvaW50ZXJmYWNlL2Nhc3NhbmRyYS50aHJpZnQ/dmlldz1jbworIFtFdmVybm90ZSBBUEldOiAgICAgICBodHRwOi8vd3d3LmV2ZXJub3RlLmNvbS9hYm91dC9kZXZlbG9wZXIvYXBpLworCisjIyBUbyBEby9RdWVzdGlvbnMKKworSW5pdGlhbGl6YXRpb24gb2YgQmFzZSBUeXBlcyBmb3IgYWxsIExhbmd1YWdlcz8KKworICogRG8gYWxsIExhbmd1YWdlcyBpbml0aWFsaXplIHRoZW0gdG8gMCwgYm9vbD1mYWxzZSBhbmQgc3RyaW5nPSIiPyBvciBudWxsLCB1bmRlZmluZWQ/CisKK1doeSBkb2VzIHBvc2l0aW9uIG9mIGBDcHBUeXBlYCB2YXJ5IGJldHdlZW4gYFNldFR5cGVgIGFuZCBgTGlzdFR5cGVgPworCisgKiBzdGQ6OnNldCBkb2VzIHNvcnQgdGhlIGVsZW1lbnRzIGF1dG9tYXRpY2FsbHksIHRoYXQncyB0aGUgZGVzaWduLiBzZWUgW1RocmlmdCBUeXBlc10oL2RvY3MvdHlwZXMpIG9yIHRoZSBbQysrIHN0ZDpzZXQgcmVmZXJlbmNlXVtdIGZvciBmdXJ0aGVyIGRldGFpbHMKKyAqIFRoZSBxdWVzdGlvbiBpcywgaG93IG90aGVyIGxhbmd1YWdlcyBhcmUgZG9pbmcgdGhhdD8gV2hhdCBhYm91dCBjdXN0b20gb2JqZWN0cywgZG8gdGhleSBoYXZlIGEgQ29tcGFyZSBmdW5jdGlvbiB0aGUgc2V0IHRoZSBvcmRlciBjb3JyZWN0bHk/CisKKyBbQysrIHN0ZDpzZXQgcmVmZXJlbmNlXTogaHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9zdGwvc2V0LworCitXaHkgY2FuJ3QgYERlZmluaXRpb25UeXBlYCBiZSB0aGUgc2FtZSBhcyBgRmllbGRUeXBlYCAoaS5lLiBpbmNsdWRlIGBJZGVudGlmaWVyYCk/CisKK0V4YW1pbmUgdGhlIGBzbWFsbHRhbGsucHJlZml4YCBhbmQgYHNtYWxsdGFsay5jYXRlZ29yeWAgc3RhdHVzIChlc3AgYHNtYWxsdGFsay5jYXRlZ29yeWAsIHdoaWNoIHRha2VzIGBTVElkZW50aWZpZXJgIGFzIGl0cyBhcmd1bWVudCkuLi4KKworV2hhdCB0byBkbyBhYm91dCBgTGlzdFNlcGFyYXRvcmA/IERvIHdlIHJlYWxseSB3YW50IHRvIGJlIGFzIGxheCBhcyB3ZSBjdXJyZW50bHkgYXJlPworCitTaG91bGQgYEZpZWxkKmAgcmVhbGx5IGJlIGBGaWVsZCtgIGluIGBTdHJ1Y3RgLCBgRW51bWAsIGV0Yy4/CisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MjY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kCkBAIC0wLDAgKzEsMjU0IEBACitUaHJpZnQgQmluYXJ5IHByb3RvY29sIGVuY29kaW5nIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIHdpcmUgZW5jb2RpbmcgZm9yIFJQQyB1c2luZyB0aGUgb2xkZXIgVGhyaWZ0ICpiaW5hcnkgcHJvdG9jb2wqLgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xIGFuZAorMC45LjMpLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogQmluYXJ5IHByb3RvY29sCisgICogQmFzZSB0eXBlcworICAqIE1lc3NhZ2UKKyAgKiBTdHJ1Y3QKKyAgKiBMaXN0IGFuZCBTZXQKKyAgKiBNYXAKKyogQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCisjIEJpbmFyeSBwcm90b2NvbAorCisjIyBCYXNlIHR5cGVzCisKKyMjIyBJbnRlZ2VyIGVuY29kaW5nCisKK0luIHRoZSBfYmluYXJ5IHByb3RvY29sXyBpbnRlZ2VycyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGJpZyBlbmRpYW4gYnl0ZSBvcmRlciwgYWthIG5ldHdvcmsKK29yZGVyKS4gQW4gYGludDhgIG5lZWRzIDEgYnl0ZSwgYW4gYGludDE2YCAyLCBhbiBgaW50MzJgIDQgYW5kIGFuIGBpbnQ2NGAgbmVlZHMgOCBieXRlcy4KKworVGhlIENQUCB2ZXJzaW9uIGhhcyB0aGUgb3B0aW9uIHRvIHVzZSB0aGUgYmluYXJ5IHByb3RvY29sIHdpdGggbGl0dGxlIGVuZGlhbiBvcmRlci4gTGl0dGxlIGVuZGlhbiBnaXZlcyBhIHNtYWxsIGJ1dAorbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBib29zdCBiZWNhdXNlIGNvbnRlbXBvcmFyeSBDUFVzIHVzZSBsaXR0bGUgZW5kaWFuIHdoZW4gc3RvcmluZyBpbnRlZ2VycyB0byBSQU0uCisKKyMjIyBFbnVtIGVuY29kaW5nCisKK1RoZSBnZW5lcmF0ZWQgY29kZSBlbmNvZGVzIGBFbnVtYHMgYnkgdGFraW5nIHRoZSBvcmRpbmFsIHZhbHVlIGFuZCB0aGVuIGVuY29kaW5nIHRoYXQgYXMgYW4gaW50MzIuCisKKyMjIyBCaW5hcnkgZW5jb2RpbmcKKworQmluYXJ5IGlzIHNlbnQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wsIGJpbmFyeSBkYXRhLCA0KyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IGJ5dGUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IGJ5dGVzICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGJ5dGUgbGVuZ3RoYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIGFycmF5LCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyIChtdXN0IGJlID49IDApLgorKiBgYnl0ZXNgIGFyZSB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUgYXJyYXkuCisKKyMjIyBTdHJpbmcgZW5jb2RpbmcKKworKlN0cmluZypzIGFyZSBmaXJzdCBlbmNvZGVkIHRvIFVURi04LCBhbmQgdGhlbiBzZW5kIGFzIGJpbmFyeS4KKworIyMjIERvdWJsZSBlbmNvZGluZworCitWYWx1ZXMgb2YgdHlwZSBgZG91YmxlYCBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDY0IGFjY29yZGluZyB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdAorbGF5b3V0LiBNb3N0IHJ1bi10aW1lcyBwcm92aWRlIGEgbGlicmFyeSB0byBtYWtlIHRoaXMgY29udmVyc2lvbi4gQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFzIHRoZSBjb21wYWN0IHByb3RvY29sIHRoZW4KK2VuY29kZSB0aGUgaW50NjQgaW4gOCBieXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyLgorCisjIyMgQm9vbGVhbiBlbmNvZGluZworCitWYWx1ZXMgb2YgYGJvb2xgIHR5cGUgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ4LiBUcnVlIGlzIGNvbnZlcnRlZCB0byBgMWAsIGZhbHNlIHRvIGAwYC4KKworIyMgTWVzc2FnZQorCitBIGBNZXNzYWdlYCBjYW4gYmUgZW5jb2RlZCBpbiB0d28gZGlmZmVyZW50IHdheXM6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIE1lc3NhZ2UsIHN0cmljdCBlbmNvZGluZywgMTIrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wxdnZ2dnZ2dnx2dnZ2dnZ2dnx1bnVzZWQgIHwwMDAwMG1tbXwgbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8IHNlcSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB2dnZ2dnZ2dnZ2dnZ2dnZgIGlzIHRoZSB2ZXJzaW9uLCBhbiB1bnNpZ25lZCAxNSBiaXQgbnVtYmVyIGZpeGVkIHRvIGAxYCAoaW4gYmluYXJ5OiBgMDAwIDAwMDAgMDAwMCAwMDAxYCkuCisgIFRoZSBsZWFkaW5nIGJpdCBpcyBgMWAuCisqIGB1bnVzZWRgIGlzIGFuIGlnbm9yZWQgYnl0ZS4KKyogYG1tbWAgaXMgdGhlIG1lc3NhZ2UgdHlwZSwgYW4gdW5zaWduZWQgMyBiaXQgaW50ZWdlci4gVGhlIDUgbGVhZGluZyBiaXRzIG11c3QgYmUgYDBgIGFzIHNvbWUgY2xpZW50cyAoY2hlY2tlZCBmb3IKKyAgamF2YSBpbiAwLjkuMSkgdGFrZSB0aGUgd2hvbGUgYnl0ZS4KKyogYG5hbWUgbGVuZ3RoYCBpcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIgKG11c3QgYmUgPj0gMCkuCisqIGBuYW1lYCBpcyB0aGUgbWV0aG9kIG5hbWUsIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisqIGBzZXEgaWRgIGlzIHRoZSBzZXF1ZW5jZSBpZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlci4KKworVGhlIHNlY29uZCwgb2xkZXIgZW5jb2RpbmcgKGFrYSBub24tc3RyaWN0KSBpczoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgTWVzc2FnZSwgb2xkIGVuY29kaW5nLCA5KyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8IG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfDAwMDAwbW1tfCBzZXEgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK2BgYAorCitXaGVyZSBgbmFtZSBsZW5ndGhgLCBgbmFtZWAsIGBtbW1gLCBgc2VxIGlkYCBhcmUgYXMgYWJvdmUuCisKK0JlY2F1c2UgYG5hbWUgbGVuZ3RoYCBtdXN0IGJlIHBvc2l0aXZlICh0aGVyZWZvcmUgdGhlIGZpcnN0IGJpdCBpcyBhbHdheXMgYDBgKSwgdGhlIGZpcnN0IGJpdCBhbGxvd3MgdGhlIHJlY2VpdmVyIHRvIHNlZQord2hldGhlciB0aGUgc3RyaWN0IGZvcm1hdCBvciB0aGUgb2xkIGZvcm1hdCBpcyB1c2VkLiBUaGVyZWZvcmUgYSBzZXJ2ZXIgYW5kIGNsaWVudCB1c2luZyB0aGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIHRoZQorYmluYXJ5IHByb3RvY29sIGNhbiB0cmFuc3BhcmVudGx5IHRhbGsgd2l0aCBlYWNoIG90aGVyLiBIb3dldmVyLCB3aGVuIHN0cmljdCBtb2RlIGlzIGVuZm9yY2VkLCB0aGUgb2xkIGZvcm1hdCBpcworcmVqZWN0ZWQuCisKK01lc3NhZ2UgdHlwZXMgYXJlIGVuY29kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworKiBfQ2FsbF86IDEKKyogX1JlcGx5XzogMgorKiBfRXhjZXB0aW9uXzogMworKiBfT25ld2F5XzogNAorCisjIyBTdHJ1Y3QKKworQSAqU3RydWN0KiBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBmaWVsZHMsIGZvbGxvd2VkIGJ5IGEgc3RvcCBmaWVsZC4gRWFjaCBmaWVsZCBzdGFydHMgd2l0aCBhIGZpZWxkIGhlYWRlciBhbmQKK2lzIGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHN1bW1hcml6ZWQgYnkgdGhlIGZvbGxvd2luZyBCTkY6CisKK2BgYAorc3RydWN0ICAgICAgICA6Oj0gKCBmaWVsZC1oZWFkZXIgZmllbGQtdmFsdWUgKSogc3RvcC1maWVsZAorZmllbGQtaGVhZGVyICA6Oj0gZmllbGQtdHlwZSBmaWVsZC1pZAorYGBgCisKK0JlY2F1c2UgZWFjaCBmaWVsZCBoZWFkZXIgY29udGFpbnMgdGhlIGZpZWxkLWlkIChhcyBkZWZpbmVkIGJ5IHRoZSBUaHJpZnQgSURMIGZpbGUpLCB0aGUgZmllbGRzIGNhbiBiZSBlbmNvZGVkIGluIGFueQorb3JkZXIuIFRocmlmdCdzIHR5cGUgc3lzdGVtIGlzIG5vdCBleHRlbnNpYmxlOyB5b3UgY2FuIG9ubHkgZW5jb2RlIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIHN0cnVjdHMuIFRoZXJlZm9yZSBpcyBhbHNvCitwb3NzaWJsZSB0byBoYW5kbGUgdW5rbm93biBmaWVsZHMgd2hpbGUgZGVjb2Rpbmc7IHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZC4gV2hpbGUgZGVjb2RpbmcgdGhlIGZpZWxkIHR5cGUgY2FuIGJlIHVzZWQgdG8KK2RldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBmaWVsZCB2YWx1ZS4KKworTm90ZSB0aGF0IHRoZSBmaWVsZCBuYW1lIGlzIG5vdCBlbmNvZGVkIHNvIGZpZWxkIHJlbmFtZXMgaW4gdGhlIElETCBkbyBub3QgYWZmZWN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZWZhdWx0IEphdmEgaW1wbGVtZW50YXRpb24gKEFwYWNoZSBUaHJpZnQgMC45LjEpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCB0cmllcyB0byBkZWNvZGUgYSBmaWVsZCB0aGF0IGhhcworYW5vdGhlciBmaWVsZC10eXBlIHRoZW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KK090aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KKworQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgorCitBbiAqRXhjZXB0aW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3QuCisKKyMjIyBTdHJ1Y3QgZW5jb2RpbmcKKworSW4gdGhlIGJpbmFyeSBwcm90b2NvbCBmaWVsZCBoZWFkZXJzIGFuZCB0aGUgc3RvcCBmaWVsZCBhcmUgZW5jb2RlZCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBmaWVsZCBoZWFkZXIgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3x0dHR0dHR0dHwgZmllbGQgaWQgICAgICAgIHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitCaW5hcnkgcHJvdG9jb2wgc3RvcCBmaWVsZDoKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdHR0dHR0dHRgIHRoZSBmaWVsZC10eXBlLCBhIHNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorKiBgZmllbGQgaWRgIHRoZSBmaWVsZC1pZCwgYSBzaWduZWQgMTYgYml0IGludGVnZXIgaW4gYmlnIGVuZGlhbiBvcmRlci4KKyogYGZpZWxkLXZhbHVlYCB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4KKworVGhlIGZvbGxvd2luZyBmaWVsZC10eXBlcyBhcmUgdXNlZDoKKworKiBgQk9PTGAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDRgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA2YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgOGAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDEwYAorKiBgU1RSSU5HYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxM2AKKyogYFNFVGAsIGVuY29kZWQgYXMgYDE0YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDE1YAorCisjIyBMaXN0IGFuZCBTZXQKKworTGlzdCBhbmQgc2V0cyBhcmUgZW5jb2RlZCB0aGUgc2FtZTogYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZQorZW5jb2RlZCBlbGVtZW50cy4KKworYGBgCitCaW5hcnkgcHJvdG9jb2wgbGlzdCAoNSsgYnl0ZXMpIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8dHR0dHR0dHR8IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdHR0dHR0dHRgIGlzIHRoZSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGVuY29kZWQgYXMgYW4gaW50MzIsIHBvc2l0aXZlIHZhbHVlcyBvbmx5CisqIGBlbGVtZW50c2AgdGhlIGVsZW1lbnQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmaWVsZC10eXBlcy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IHNlY3Rpb24gYWJvdmUuCisKK1RoZSBtYXhpbXVtIGxpc3Qvc2V0IHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIyBNYXAKKworTWFwcyBhcmUgZW5jb2RlZCB3aXRoIGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUsIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGtleXMgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLAorZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZWxlbWVudHMuIFRoZSBlbmNvZGluZyBmb2xsb3dzIHRoaXMgQk5GOgorCitgYGAKK21hcCAgOjo9ICBrZXktZWxlbWVudC10eXBlIHZhbHVlLWVsZW1lbnQtdHlwZSBzaXplICgga2V5IHZhbHVlICkqCitgYGAKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgbWFwICg2KyBieXRlcykgYW5kIGtleSB2YWx1ZSBwYWlyczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8a2tra2tra2t8dnZ2dnZ2dnZ8IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleSB2YWx1ZSBwYWlycyAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBga2tra2tra2tgIGlzIHRoZSBrZXkgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHZ2dnZ2dnZ2YCBpcyB0aGUgdmFsdWUgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHNpemVgIGlzIHRoZSBzaXplIG9mIHRoZSBtYXAsIGVuY29kZWQgYXMgYW4gaW50MzIsIHBvc2l0aXZlIHZhbHVlcyBvbmx5CisqIGBrZXkgdmFsdWUgcGFpcnNgIGFyZSB0aGUgZW5jb2RlZCBrZXlzIGFuZCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZpZWxkLXR5cGVzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgc2VjdGlvbiBhYm92ZS4KKworVGhlIG1heGltdW0gbWFwIHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworVGhlIGZvbGxvd2luZyBCTkYgbm90YXRpb24gaXMgdXNlZDoKKworKiBhIHBsdXMgYCtgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAxIG9yIG1vcmUgdGltZXMKKyogYSBzdGFyIGAqYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgb3B0aW9uYWwgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMCBvciBtb3JlIHRpbWVzCisqIGEgcGlwZSBgfGAgYmV0d2VlbiBpdGVtcyByZXByZXNlbnRzIGNob2ljZSwgdGhlIGZpcnN0IG1hdGNoaW5nIGl0ZW0gaXMgc2VsZWN0ZWQKKyogcGFyZW50aGVzaXMgYChgIGFuZCBgKWAgYXJlIHVzZWQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGl0ZW1zCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZApAQCAtMCwwICsxLDI5NCBAQAorVGhyaWZ0IENvbXBhY3QgcHJvdG9jb2wgZW5jb2RpbmcgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIHdpcmUgZW5jb2RpbmcgZm9yIFJQQyB1c2luZyB0aGUgVGhyaWZ0ICpjb21wYWN0IHByb3RvY29sKi4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSkgYW5kCitbVEhSSUZULTExMCBBIG1vcmUgY29tcGFjdCBmb3JtYXRdKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTExMCkuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsCitzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogQ29tcGFjdCBwcm90b2NvbAorICAqIEJhc2UgdHlwZXMKKyAgKiBNZXNzYWdlCisgICogU3RydWN0CisgICogTGlzdCBhbmQgU2V0CisgICogTWFwCisqIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworIyBDb21wYWN0IHByb3RvY29sCisKKyMjIEJhc2UgdHlwZXMKKworIyMjIEludGVnZXIgZW5jb2RpbmcKKworVGhlIF9jb21wYWN0IHByb3RvY29sXyB1c2VzIG11bHRpcGxlIGVuY29kaW5ncyBmb3IgaW50czogdGhlIF96aWd6YWcgaW50XywgYW5kIHRoZSBfdmFyIGludF8uCisKK1ZhbHVlcyBvZiB0eXBlIGBpbnQzMmAgYW5kIGBpbnQ2NGAgYXJlIGZpcnN0IHRyYW5zZm9ybWVkIHRvIGEgKnppZ3phZyBpbnQqLiBBIHppZ3phZyBpbnQgZm9sZHMgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlCitudW1iZXJzIGludG8gdGhlIHBvc2l0aXZlIG51bWJlciBzcGFjZS4gV2hlbiB3ZSByZWFkIDAsIDEsIDIsIDMsIDQgb3IgNSBmcm9tIHRoZSB3aXJlLCB0aGlzIGlzIHRyYW5zbGF0ZWQgdG8gMCwgLTEsIDEsCistMiBvciAyIHJlc3BlY3RpdmVseS4gSGVyZSBhcmUgdGhlIChTY2FsYSkgZm9ybXVsYXMgdG8gY29udmVydCBmcm9tIGludDMyL2ludDY0IHRvIGEgemlnemFnIGludCBhbmQgYmFjazoKKworYGBgc2NhbGEKK2RlZiBpbnRUb1ppZ1phZyhuOiBJbnQpOiBJbnQgPSAobiA8PCAxKSBeIChuID4+IDMxKQorZGVmIHppZ3phZ1RvSW50KG46IEludCk6IEludCA9IChuID4+PiAxKSBeIC0gKG4gJiAxKQorZGVmIGxvbmdUb1ppZ1phZyhuOiBMb25nKTogTG9uZyA9IChuIDw8IDEpIF4gKG4gPj4gNjMpCitkZWYgemlnemFnVG9Mb25nKG46IExvbmcpOiBMb25nID0gKG4gPj4+IDEpIF4gLSAobiAmIDEpCitgYGAKKworVGhlIHppZ3phZyBpbnQgaXMgdGhlbiBlbmNvZGVkIGFzIGEgKnZhciBpbnQqLiBWYXIgaW50cyB0YWtlIDEgdG8gNSBieXRlcyAoaW50MzIpIG9yIDEgdG8gMTAgYnl0ZXMgKGludDY0KS4gVGhlIG1vc3QKK3NpZ25pZmljYW50IGJpdCBvZiBlYWNoIGJ5dGUgaW5kaWNhdGVzIGlmIG1vcmUgYnl0ZXMgZm9sbG93LiBUaGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIGZyb20gZWFjaAorYnl0ZSBmb3JtIHRoZSBudW1iZXIsIHdoZXJlIHRoZSBmaXJzdCBieXRlIGhhcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIChzbyB0aGV5IGFyZSBpbiBiaWcgZW5kaWFuIG9yIG5ldHdvcmsgb3JkZXIpLgorCitWYXIgaW50cyBhcmUgc29tZXRpbWVzIHVzZWQgZGlyZWN0bHkgaW5zaWRlIHRoZSBjb21wYWN0IHByb3RvY29sIHRvIHJlcHJlc2VudCBwb3NpdGl2ZSBudW1iZXJzLgorCitUbyBlbmNvZGUgYW4gYGludDE2YCBhcyB6aWd6YWcgaW50LCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gYGludDMyYCBhbmQgdGhlbiBlbmNvZGVkIGFzIHN1Y2guIFRoZSB0eXBlIGBpbnQ4YCBzaW1wbHkKK3VzZXMgYSBzaW5nbGUgYnl0ZSBhcyBpbiB0aGUgYmluYXJ5IHByb3RvY29sLgorCisjIyMgRW51bSBlbmNvZGluZworCitUaGUgZ2VuZXJhdGVkIGNvZGUgZW5jb2RlcyBgRW51bWBzIGJ5IHRha2luZyB0aGUgb3JkaW5hbCB2YWx1ZSBhbmQgdGhlbiBlbmNvZGluZyB0aGF0IGFzIGFuIGludDMyLgorCisjIyMgQmluYXJ5IGVuY29kaW5nCisKK0JpbmFyeSBpcyBzZW50IGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sLCBiaW5hcnkgZGF0YSwgMSsgYnl0ZXM6CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgYnl0ZSBsZW5ndGggICAgICAgICB8IGJ5dGVzICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGJ5dGUgbGVuZ3RoYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIGFycmF5LCB1c2luZyB2YXIgaW50IGVuY29kaW5nIChtdXN0IGJlID49IDApLgorKiBgYnl0ZXNgIGFyZSB0aGUgYnl0ZXMgb2YgdGhlIGJ5dGUgYXJyYXkuCisKKyMjIyBTdHJpbmcgZW5jb2RpbmcKKworKlN0cmluZypzIGFyZSBmaXJzdCBlbmNvZGVkIHRvIFVURi04LCBhbmQgdGhlbiBzZW5kIGFzIGJpbmFyeS4KKworIyMjIERvdWJsZSBlbmNvZGluZworCitWYWx1ZXMgb2YgdHlwZSBgZG91YmxlYCBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDY0IGFjY29yZGluZyB0byB0aGUgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgImRvdWJsZSBmb3JtYXQiIGJpdAorbGF5b3V0LiBNb3N0IHJ1bi10aW1lcyBwcm92aWRlIGEgbGlicmFyeSB0byBtYWtlIHRoaXMgY29udmVyc2lvbi4gQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFzIHRoZSBjb21wYWN0IHByb3RvY29sIHRoZW4KK2VuY29kZSB0aGUgaW50NjQgaW4gOCBieXRlcyBpbiBiaWcgZW5kaWFuIG9yZGVyLgorCisjIyMgQm9vbGVhbiBlbmNvZGluZworCitCb29sZWFucyBhcmUgZW5jb2RlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBhIGZpZWxkIHZhbHVlIChpbiBhIHN0cnVjdCkgb3IgYW4gZWxlbWVudCB2YWx1ZSAoaW4gYSBzZXQsCitsaXN0IG9yIG1hcCkuIEZpZWxkIHZhbHVlcyBhcmUgZW5jb2RlZCBkaXJlY3RseSBpbiB0aGUgZmllbGQgaGVhZGVyLiBFbGVtZW50IHZhbHVlcyBvZiB0eXBlIGBib29sYCBhcmUgc2VudCBhcyBhbiBpbnQ4OwordHJ1ZSBhcyBgMWAgYW5kIGZhbHNlIGFzIGAwYC4KKworIyMgTWVzc2FnZQorCitBIGBNZXNzYWdlYCBvbiB0aGUgd2lyZSBsb29rcyBhcyBmb2xsb3dzOgorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgTWVzc2FnZSAoNCsgYnl0ZXMpOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHBwcHBwcHBwfG1tbXZ2dnZ2fCBzZXEgaWQgICAgICAgICAgICAgIHwgbmFtZSBsZW5ndGggICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBwcHBwcHBwcGAgaXMgdGhlIHByb3RvY29sIGlkLCBmaXhlZCB0byBgMTAwMCAwMDEwYCwgMHg4Mi4KKyogYG1tbWAgaXMgdGhlIG1lc3NhZ2UgdHlwZSwgYW4gdW5zaWduZWQgMyBiaXQgaW50ZWdlci4KKyogYHZ2dnZ2YCBpcyB0aGUgdmVyc2lvbiwgYW4gdW5zaWduZWQgNSBiaXQgaW50ZWdlciwgZml4ZWQgdG8gYDAwMDAxYC4KKyogYHNlcSBpZGAgaXMgdGhlIHNlcXVlbmNlIGlkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIGEgdmFyIGludC4KKyogYG5hbWUgbGVuZ3RoYCBpcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgYSB2YXIgaW50IChtdXN0IGJlID49IDApLgorKiBgbmFtZWAgaXMgdGhlIG1ldGhvZCBuYW1lIHRvIGludm9rZSwgYSBVVEYtOCBlbmNvZGVkIHN0cmluZy4KKworTWVzc2FnZSB0eXBlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisqIF9DYWxsXzogMQorKiBfUmVwbHlfOiAyCisqIF9FeGNlcHRpb25fOiAzCisqIF9PbmV3YXlfOiA0CisKKyMjIyBTdHJ1Y3QKKworQSAqU3RydWN0KiBpcyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSBmaWVsZHMsIGZvbGxvd2VkIGJ5IGEgc3RvcCBmaWVsZC4gRWFjaCBmaWVsZCBzdGFydHMgd2l0aCBhIGZpZWxkIGhlYWRlciBhbmQKK2lzIGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHN1bW1hcml6ZWQgYnkgdGhlIGZvbGxvd2luZyBCTkY6CisKK2BgYAorc3RydWN0ICAgICAgICA6Oj0gKCBmaWVsZC1oZWFkZXIgZmllbGQtdmFsdWUgKSogc3RvcC1maWVsZAorZmllbGQtaGVhZGVyICA6Oj0gZmllbGQtdHlwZSBmaWVsZC1pZAorYGBgCisKK0JlY2F1c2UgZWFjaCBmaWVsZCBoZWFkZXIgY29udGFpbnMgdGhlIGZpZWxkLWlkIChhcyBkZWZpbmVkIGJ5IHRoZSBUaHJpZnQgSURMIGZpbGUpLCB0aGUgZmllbGRzIGNhbiBiZSBlbmNvZGVkIGluIGFueQorb3JkZXIuIFRocmlmdCdzIHR5cGUgc3lzdGVtIGlzIG5vdCBleHRlbnNpYmxlOyB5b3UgY2FuIG9ubHkgZW5jb2RlIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIHN0cnVjdHMuIFRoZXJlZm9yZSBpcyBhbHNvCitwb3NzaWJsZSB0byBoYW5kbGUgdW5rbm93biBmaWVsZHMgd2hpbGUgZGVjb2Rpbmc7IHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZC4gV2hpbGUgZGVjb2RpbmcgdGhlIGZpZWxkIHR5cGUgY2FuIGJlIHVzZWQgdG8KK2RldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBmaWVsZCB2YWx1ZS4KKworTm90ZSB0aGF0IHRoZSBmaWVsZCBuYW1lIGlzIG5vdCBlbmNvZGVkIHNvIGZpZWxkIHJlbmFtZXMgaW4gdGhlIElETCBkbyBub3QgYWZmZWN0IGZvcndhcmQgYW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK1RoZSBkZWZhdWx0IEphdmEgaW1wbGVtZW50YXRpb24gKEFwYWNoZSBUaHJpZnQgMC45LjEpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBpdCB0cmllcyB0byBkZWNvZGUgYSBmaWVsZCB0aGF0IGhhcworYW5vdGhlciBmaWVsZC10eXBlIHRoYW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KK090aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KKworQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgorCitBbiAqRXhjZXB0aW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3QuCisKKyMjIyBTdHJ1Y3QgZW5jb2RpbmcKKworYGBgCitDb21wYWN0IHByb3RvY29sIGZpZWxkIGhlYWRlciAoc2hvcnQgZm9ybSkgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xkZGRkdHR0dHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIGZpZWxkIGhlYWRlciAoMSB0byAzIGJ5dGVzLCBsb25nIGZvcm0pIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfDAwMDB0dHR0fCBmaWVsZCBpZCAgICAgICAgICAgIHwgZmllbGQgdmFsdWUgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBzdG9wIGZpZWxkOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBkZGRkYCBpcyB0aGUgZmllbGQgaWQgZGVsdGEsIGFuIHVuc2lnbmVkIDQgYml0cyBpbnRlZ2VyLCBzdHJpY3RseSBwb3NpdGl2ZS4KKyogYHR0dHRgIGlzIGZpZWxkLXR5cGUgaWQsIGFuIHVuc2lnbmVkIDQgYml0IGludGVnZXIuCisqIGBmaWVsZCBpZGAgdGhlIGZpZWxkIGlkLCBhIHNpZ25lZCAxNiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIHppZ3phZyBpbnQuCisqIGBmaWVsZC12YWx1ZWAgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuCisKK1RoZSBmaWVsZCBpZCBkZWx0YSBjYW4gYmUgY29tcHV0ZWQgYnkgYGN1cnJlbnQtZmllbGQtaWQgLSBwcmV2aW91cy1maWVsZC1pZGAsIG9yIGp1c3QgYGN1cnJlbnQtZmllbGQtaWRgIGlmIHRoaXMgaXMgdGhlCitmaXJzdCBvZiB0aGUgc3RydWN0LiBUaGUgc2hvcnQgZm9ybSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBmaWVsZCBpZCBkZWx0YSBpcyBpbiB0aGUgcmFuZ2UgMSAtIDE1IChpbmNsdXNpdmUpLgorCitUaGUgZm9sbG93aW5nIGZpZWxkLXR5cGVzIGNhbiBiZSBlbmNvZGVkOgorCisqIGBCT09MRUFOX1RSVUVgLCBlbmNvZGVkIGFzIGAxYAorKiBgQk9PTEVBTl9GQUxTRWAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYEkxNmAsIGVuY29kZWQgYXMgYDRgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA1YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgNmAKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDdgCisqIGBCSU5BUllgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDhgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgOWAKKyogYFNFVGAsIGVuY29kZWQgYXMgYDEwYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBib3RoIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisKK05vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGFyZSAyIHNwZWNpZmljIGZpZWxkIHR5cGVzIGZvciB0aGUgYm9vbGVhbiB2YWx1ZXMsIHRoZSBlbmNvZGluZyBvZiBhIGJvb2xlYW4gZmllbGQgdmFsdWUgaGFzIG5vCitsZW5ndGggKDAgYnl0ZXMpLgorCisjIyBMaXN0IGFuZCBTZXQKKworTGlzdCBhbmQgc2V0cyBhcmUgZW5jb2RlZCB0aGUgc2FtZTogYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkIGJ5IHRoZQorZW5jb2RlZCBlbGVtZW50cy4KKworYGBgCitDb21wYWN0IHByb3RvY29sIGxpc3QgaGVhZGVyICgxIGJ5dGUsIHNob3J0IGZvcm0pIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8c3Nzc3R0dHR8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBsaXN0IGhlYWRlciAoMisgYnl0ZXMsIGxvbmcgZm9ybSkgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8MTExMXR0dHR8IHNpemUgICAgICAgICAgICAgICAgfCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBzc3NzYCBpcyB0aGUgc2l6ZSwgNCBiaXQgdW5zaWduZWQgaW50LCB2YWx1ZXMgYDBgIC0gYDE0YAorKiBgdHR0dGAgaXMgdGhlIGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYHNpemVgIGlzIHRoZSBzaXplLCBhIHZhciBpbnQgKGludDMyKSwgcG9zaXRpdmUgdmFsdWVzIGAxNWAgb3IgaGlnaGVyCisqIGBlbGVtZW50c2AgYXJlIHRoZSBlbmNvZGVkIGVsZW1lbnRzCisKK1RoZSBzaG9ydCBmb3JtIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGxlbmd0aCBpcyBpbiB0aGUgcmFuZ2UgMCAtIDE0IChpbmNsdXNpdmUpLgorCitUaGUgZm9sbG93aW5nIGVsZW1lbnQtdHlwZXMgYXJlIHVzZWQgKG5vdGUgdGhhdCB0aGVzZSBhcmUgX2RpZmZlcmVudF8gZnJvbSB0aGUgZmllbGQtdHlwZXMpOgorCisqIGBCT09MYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgNGAKKyogYEkxNmAsIGVuY29kZWQgYXMgYDZgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA4YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgMTBgCisqIGBTVFJJTkdgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3Igc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDEzYAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTRgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgMTVgCisKKworVGhlIG1heGltdW0gbGlzdC9zZXQgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMjIE1hcAorCitNYXBzIGFyZSBlbmNvZGVkIHdpdGggYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSwgdGhlIHR5cGUgb2YgdGhlIGtleXMgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZAorYnkgdGhlIGVuY29kZWQgZWxlbWVudHMuIFRoZSBlbmNvZGluZyBmb2xsb3dzIHRoaXMgQk5GOgorCitgYGAKK21hcCAgICAgICAgICAgOjo9IGVtcHR5LW1hcCB8IG5vbi1lbXB0eS1tYXAKK2VtcHR5LW1hcCAgICAgOjo9IGAwYAorbm9uLWVtcHR5LW1hcCA6Oj0gc2l6ZSBrZXktZWxlbWVudC10eXBlIHZhbHVlLWVsZW1lbnQtdHlwZSAoa2V5IHZhbHVlKSsKK2BgYAorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgbWFwIGhlYWRlciAoMSBieXRlLCBlbXB0eSBtYXApOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIG1hcCBoZWFkZXIgKDIrIGJ5dGVzLCBub24gZW1wdHkgbWFwKSBhbmQga2V5IHZhbHVlIHBhaXJzOgorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IHNpemUgICAgICAgICAgICAgICAgfGtra2t2dnZ2fCBrZXkgdmFsdWUgcGFpcnMgICAgIHwKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgYSB2YXIgaW50IChpbnQzMiksIHN0cmljdGx5IHBvc2l0aXZlIHZhbHVlcworKiBga2tra2AgaXMgdGhlIGtleSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGB2dnZ2YCBpcyB0aGUgdmFsdWUgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBga2V5IHZhbHVlIHBhaXJzYCBhcmUgdGhlIGVuY29kZWQga2V5cyBhbmQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgbGlzdHMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlICdMaXN0IGFuZCBzZXQnIHNlY3Rpb24uCisKK1RoZSBtYXhpbXVtIG1hcCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKK1RoZSBmb2xsb3dpbmcgQk5GIG5vdGF0aW9uIGlzIHVzZWQ6CisKKyogYSBwbHVzIGArYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMSBvciBtb3JlIHRpbWVzCisqIGEgc3RhciBgKmAgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIG9wdGlvbmFsIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDAgb3IgbW9yZSB0aW1lcworKiBhIHBpcGUgYHxgIGJldHdlZW4gaXRlbXMgcmVwcmVzZW50cyBjaG9pY2UsIHRoZSBmaXJzdCBtYXRjaGluZyBpdGVtIGlzIHNlbGVjdGVkCisqIHBhcmVudGhlc2lzIGAoYCBhbmQgYClgIGFyZSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSBpdGVtcwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWE2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKQEAgLTAsMCArMSwxMDEgQEAKK1RocmlmdCBQcm90b2NvbCBTdHJ1Y3R1cmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xhc3QgTW9kaWZpZWQ6IDIwMDctSnVuLTI5CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFRocmlmdCBwcm90b2NvbAord2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZy4gVGh1cywgdGhlIG9yZGVyIG9mIGVsZW1lbnRzCitjb3VsZCBpbiBzb21lIGNhc2VzIGJlIHJlYXJyYW5nZWQgZGVwZW5kaW5nIHVwb24gdGhlIFRQcm90b2NvbAoraW1wbGVtZW50YXRpb24sIGJ1dCB0aGlzIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgbWluaW11bSByZXF1aXJlZAorc3RydWN0dXJlLiBUaGVyZSBhcmUgc29tZSAiZHVtYiIgdGVybWluYWxzIGxpa2UgU1RSSU5HIGFuZCBJTlQKK3RoYXQgdGFrZSB0aGUgcGxhY2Ugb2YgYW4gYWN0dWFsIGVuY29kaW5nIHNwZWNpZmljYXRpb24uCisKK1RoZXkga2V5IHBvaW50IHRvIG5vdGljZSBpcyB0aGF0IEFMTCBtZXNzYWdlcyBhcmUganVzdCBvbmUgd3JhcHBlZAorYDxzdHJ1Y3Q+YC4gRGVwZW5kaW5nIHVwb24gdGhlIG1lc3NhZ2UgdHlwZSwgdGhlIGA8c3RydWN0PmAgY2FuIGJlCitpbnRlcnByZXRlZCBhcyB0aGUgYXJndW1lbnQgbGlzdCB0byBhIGZ1bmN0aW9uLCB0aGUgcmV0dXJuIHZhbHVlCitvZiBhIGZ1bmN0aW9uLCBvciBhbiBleGNlcHRpb24uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2BgYAorICAgICAgIDxtZXNzYWdlPiA6Oj0gPG1lc3NhZ2UtYmVnaW4+IDxzdHJ1Y3Q+IDxtZXNzYWdlLWVuZD4KKworIDxtZXNzYWdlLWJlZ2luPiA6Oj0gPG1ldGhvZC1uYW1lPiA8bWVzc2FnZS10eXBlPiA8bWVzc2FnZS1zZXFpZD4KKworICAgPG1ldGhvZC1uYW1lPiA6Oj0gU1RSSU5HCisKKyAgPG1lc3NhZ2UtdHlwZT4gOjo9IFRfQ0FMTCB8IFRfUkVQTFkgfCBUX0VYQ0VQVElPTiB8IFRfT05FV0FZCisKKyA8bWVzc2FnZS1zZXFpZD4gOjo9IEkzMgorCisgICAgICAgIDxzdHJ1Y3Q+IDo6PSA8c3RydWN0LWJlZ2luPiA8ZmllbGQ+KiA8ZmllbGQtc3RvcD4gPHN0cnVjdC1lbmQ+CisKKyAgPHN0cnVjdC1iZWdpbj4gOjo9IDxzdHJ1Y3QtbmFtZT4KKworICAgPHN0cnVjdC1uYW1lPiA6Oj0gU1RSSU5HCisKKyAgICA8ZmllbGQtc3RvcD4gOjo9IFRfU1RPUAorCisgICAgICAgICA8ZmllbGQ+IDo6PSA8ZmllbGQtYmVnaW4+IDxmaWVsZC1kYXRhPiA8ZmllbGQtZW5kPgorCisgICA8ZmllbGQtYmVnaW4+IDo6PSA8ZmllbGQtbmFtZT4gPGZpZWxkLXR5cGU+IDxmaWVsZC1pZD4KKworICAgIDxmaWVsZC1uYW1lPiA6Oj0gU1RSSU5HCisKKyAgICA8ZmllbGQtdHlwZT4gOjo9IFRfQk9PTCB8IFRfQllURSB8IFRfSTggfCBUX0kxNiB8IFRfSTMyIHwgVF9JNjQgfCBUX0RPVUJMRQorICAgICAgICAgICAgICAgICAgICAgfCBUX1NUUklORyB8IFRfQklOQVJZIHwgVF9TVFJVQ1QgfCBUX01BUCB8IFRfU0VUIHwgVF9MSVNUCisKKyAgICAgIDxmaWVsZC1pZD4gOjo9IEkxNgorCisgICAgPGZpZWxkLWRhdGE+IDo6PSBJOCB8IEkxNiB8IEkzMiB8IEk2NCB8IERPVUJMRSB8IFNUUklORyB8IEJJTkFSWQorICAgICAgICAgICAgICAgICAgICAgPHN0cnVjdD4gfCA8bWFwPiB8IDxsaXN0PiB8IDxzZXQ+CisKKyAgICAgICAgICAgPG1hcD4gOjo9IDxtYXAtYmVnaW4+IDxmaWVsZC1kYXR1bT4qIDxtYXAtZW5kPgorCisgICAgIDxtYXAtYmVnaW4+IDo6PSA8bWFwLWtleS10eXBlPiA8bWFwLXZhbHVlLXR5cGU+IDxtYXAtc2l6ZT4KKworICA8bWFwLWtleS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKzxtYXAtdmFsdWUtdHlwZT4gOjo9IDxmaWVsZC10eXBlPgorCisgICAgICA8bWFwLXNpemU+IDo6PSBJMzIKKworICAgICAgICAgIDxsaXN0PiA6Oj0gPGxpc3QtYmVnaW4+IDxmaWVsZC1kYXRhPiogPGxpc3QtZW5kPgorCisgICAgPGxpc3QtYmVnaW4+IDo6PSA8bGlzdC1lbGVtLXR5cGU+IDxsaXN0LXNpemU+CisKKzxsaXN0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgorCisgICAgIDxsaXN0LXNpemU+IDo6PSBJMzIKKworICAgICAgICAgICA8c2V0PiA6Oj0gPHNldC1iZWdpbj4gPGZpZWxkLWRhdGE+KiA8c2V0LWVuZD4KKworICAgICA8c2V0LWJlZ2luPiA6Oj0gPHNldC1lbGVtLXR5cGU+IDxzZXQtc2l6ZT4KKworIDxzZXQtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKyAgICAgIDxzZXQtc2l6ZT4gOjo9IEkzMgorYGBgCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZCBiL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZApAQCAtMCwwICsxLDE3OCBAQAorVGhyaWZ0IFJlbW90ZSBQcm9jZWR1cmUgQ2FsbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgaGlnaCBsZXZlbCBtZXNzYWdlIGV4Y2hhbmdlIGJldHdlZW4gdGhlIFRocmlmdCBSUEMgY2xpZW50IGFuZCBzZXJ2ZXIuCitTZWUgW3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWRdIGFuZCBbdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWRdIGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGUgZXhjaGFuZ2VzIGFyZSBlbmNvZGVkIG9uCit0aGUgd2lyZS4KKworSW4gYWRkaXRpb24sIHRoaXMgZG9jdW1lbnQgY29tcGFyZXMgdGhlIGJpbmFyeSBwcm90b2NvbCB3aXRoIHRoZSBjb21wYWN0IHByb3RvY29sLiBGaW5hbGx5IGl0IGRlc2NyaWJlcyB0aGUgZnJhbWVkIHZzLgordW5mcmFtZWQgdHJhbnNwb3J0LgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xIGFuZAorMC45LjMpLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lLgorCitGb3IgYmFja2dyb3VuZCBvbiBUaHJpZnQgc2VlIHRoZSBbVGhyaWZ0IHdoaXRlcGFwZXIgKHBkZildKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc3RhdGljL2ZpbGVzL3RocmlmdC0yMDA3MDQwMS5wZGYpLgorCisjIENvbnRlbnRzCisKKyogVGhyaWZ0IE1lc3NhZ2UgZXhjaGFuZ2UgZm9yIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbAorICAqIE1lc3NhZ2UKKyAgKiBSZXF1ZXN0IHN0cnVjdAorICAqIFJlc3BvbnNlIHN0cnVjdAorKiBQcm90b2NvbCBjb25zaWRlcmF0aW9ucworICAqIENvbXBhcmluZyBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2wKKyAgKiBDb21wYXRpYmlsaXR5CisgICogRnJhbWVkIHZzIHVuZnJhbWVkIHRyYW5zcG9ydAorCisjIFRocmlmdCBSZW1vdGUgUHJvY2VkdXJlIENhbGwgTWVzc2FnZSBleGNoYW5nZQorCitCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYW5kIHRoZSBjb21wYWN0IHByb3RvY29sIGFzc3VtZSBhIHRyYW5zcG9ydCBsYXllciB0aGF0IGV4cG9zZXMgYSBiaS1kaXJlY3Rpb25hbCBieXRlIHN0cmVhbSwKK2ZvciBleGFtcGxlIGEgVENQIHNvY2tldC4gQm90aCB1c2UgdGhlIGZvbGxvd2luZyBleGNoYW5nZToKKworMS4gQ2xpZW50IHNlbmRzIGEgYE1lc3NhZ2VgICh0eXBlIGBDYWxsYCBvciBgT25ld2F5YCkuIFRoZSBUTWVzc2FnZSBjb250YWlucyBzb21lIG1ldGFkYXRhIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICB0byBpbnZva2UuCisyLiBDbGllbnQgc2VuZHMgbWV0aG9kIGFyZ3VtZW50cyAoYSBzdHJ1Y3QgZGVmaW5lZCBieSB0aGUgZ2VuZXJhdGUgY29kZSkuCiszLiBTZXJ2ZXIgc2VuZHMgYSBgTWVzc2FnZWAgKHR5cGUgYFJlcGx5YCBvciBgRXhjZXB0aW9uYCkgdG8gc3RhcnQgdGhlIHJlc3BvbnNlLgorNC4gU2VydmVyIHNlbmRzIGEgc3RydWN0IGNvbnRhaW5pbmcgdGhlIG1ldGhvZCByZXN1bHQgb3IgZXhjZXB0aW9uLgorCitUaGUgcGF0dGVybiBpcyBhIHNpbXBsZSBoYWxmIGR1cGxleCBwcm90b2NvbCB3aGVyZSB0aGUgcGFydGllcyBhbHRlcm5hdGUgaW4gc2VuZGluZyBhIGBNZXNzYWdlYCBmb2xsb3dlZCBieSBhIHN0cnVjdC4KK1doYXQgdGhlc2UgYXJlIGlzIGRlc2NyaWJlZCBiZWxvdy4KKworQWx0aG91Z2ggdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQgSmF2YSBjbGllbnRzIGRvIG5vdCBzdXBwb3J0IHBpcGVsaW5pbmcgKHNlbmRpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aG91dCB3YWl0aW5nCitmb3IgYW4gcmVzcG9uc2UpLCB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdCBKYXZhIHNlcnZlcnMgZG8gc3VwcG9ydCBpdC4KKworIyMgTWVzc2FnZQorCitBICpNZXNzYWdlKiBjb250YWluczoKKworKiBfTmFtZV8sIGEgc3RyaW5nIChjYW4gYmUgZW1wdHkpLgorKiBfTWVzc2FnZSB0eXBlXywgYSBtZXNzYWdlIHR5cGVzLCBvbmUgb2YgYENhbGxgLCBgUmVwbHlgLCBgRXhjZXB0aW9uYCBhbmQgYE9uZXdheWAuCisqIF9TZXF1ZW5jZSBpZF8sIGEgc2lnbmVkIGludDMyIGludGVnZXIuCisKK1RoZSAqc2VxdWVuY2UgaWQqIGlzIGEgc2ltcGxlIG1lc3NhZ2UgaWQgYXNzaWduZWQgYnkgdGhlIGNsaWVudC4gVGhlIHNlcnZlciB3aWxsIHVzZSB0aGUgc2FtZSBzZXF1ZW5jZSBpZCBpbiB0aGUKK21lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNlLiBUaGUgY2xpZW50IHVzZXMgdGhpcyBudW1iZXIgdG8gZGV0ZWN0IG91dCBvZiBvcmRlciByZXNwb25zZXMuIEVhY2ggY2xpZW50IGhhcyBhbiBpbnQzMiBmaWVsZAord2hpY2ggaXMgaW5jcmVhc2VkIGZvciBlYWNoIG1lc3NhZ2UuIFRoZSBzZXF1ZW5jZSBpZCBzaW1wbHkgd3JhcHMgYXJvdW5kIHdoZW4gaXQgb3ZlcmZsb3dzLgorCitUaGUgKm5hbWUqIGluZGljYXRlcyB0aGUgc2VydmljZSBtZXRob2QgbmFtZSB0byBpbnZva2UuIFRoZSBzZXJ2ZXIgY29waWVzIHRoZSBuYW1lIGluIHRoZSByZXNwb25zZSBtZXNzYWdlLgorCitXaGVuIHRoZSAqbXVsdGlwbGV4ZWQgcHJvdG9jb2wqIGlzIHVzZWQsIHRoZSBuYW1lIGNvbnRhaW5zIHRoZSBzZXJ2aWNlIG5hbWUsIGEgY29sb24gYDpgIGFuZCB0aGUgbWV0aG9kIG5hbWUuIFRoZQorbXVsdGlwbGV4ZWQgcHJvdG9jb2wgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBwcm90b2NvbHMuCisKK1RoZSAqbWVzc2FnZSB0eXBlKiBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIG1lc3NhZ2UgaXMgc2VudC4gQ2xpZW50cyBzZW5kIHJlcXVlc3RzIHdpdGggVE1lc3NhZ2VzIG9mIHR5cGUgYENhbGxgIG9yCitgT25ld2F5YCAoc3RlcCAxIGluIHRoZSBwcm90b2NvbCBleGNoYW5nZSkuIFNlcnZlcnMgc2VuZCByZXNwb25zZXMgd2l0aCBtZXNzYWdlcyBvZiB0eXBlIGBFeGNlcHRpb25gIG9yIGBSZXBseWAgKHN0ZXAKKzMpLgorCitUeXBlIGBSZXBseWAgaXMgdXNlZCB3aGVuIHRoZSBzZXJ2aWNlIG1ldGhvZCBjb21wbGV0ZXMgbm9ybWFsbHkuIFRoYXQgaXMsIGl0IHJldHVybnMgYSB2YWx1ZSBvciBpdCB0aHJvd3Mgb25lIG9mIHRoZQorZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMIGZpbGUuCisKK1R5cGUgYEV4Y2VwdGlvbmAgaXMgdXNlZCBmb3Igb3RoZXIgZXhjZXB0aW9ucy4gVGhhdCBpczogd2hlbiB0aGUgc2VydmljZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIG5vdCBkZWNsYXJlZAoraW4gdGhlIFRocmlmdCBJREwgZmlsZSwgb3Igc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBUaHJpZnQgc3RhY2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi4gRm9yIGV4YW1wbGUgd2hlbiB0aGUgc2VydmVyIGNvdWxkCitub3QgZW5jb2RlIG9yIGRlY29kZSBhIG1lc3NhZ2Ugb3Igc3RydWN0LgorCitJbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiAoMC45LjMpIHRoZXJlIGlzIGRpZmZlcmVudCBiZWhhdmlvciBmb3IgdGhlIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgc2VydmVyLiBJbiB0aGUgYXN5bmMKK3NlcnZlciBhbGwgZXhjZXB0aW9ucyBhcmUgc2VuZCBhcyBhIGBUQXBwbGljYXRpb25FeGNlcHRpb25gIChzZWUgJ1Jlc3BvbnNlIHN0cnVjdCcgYmVsb3cpLiBJbiB0aGUgc3luY2hyb25vdXMgSmF2YQoraW1wbGVtZW50YXRpb24gb25seSAodW5kZWNsYXJlZCkgZXhjZXB0aW9ucyB0aGF0IGV4dGVuZCBgVEV4Y2VwdGlvbmAgYXJlIHNlbmQgYXMgYSBgVEFwcGxpY2F0aW9uRXhjZXB0aW9uYC4gVW5jaGVja2VkCitleGNlcHRpb25zIGxlYWQgdG8gYW4gaW1tZWRpYXRlIGNsb3NlIG9mIHRoZSBjb25uZWN0aW9uLgorCitUeXBlIGBPbmV3YXlgIGlzIG9ubHkgdXNlZCBzdGFydGluZyBmcm9tIEFwYWNoZSBUaHJpZnQgMC45LjMuIEVhcmxpZXIgdmVyc2lvbnMgZG8gX25vdF8gc2VuZCBUTWVzc2FnZXMgb2YgdHlwZSBgT25ld2F5YCwKK2V2ZW4gZm9yIHNlcnZpY2UgbWV0aG9kcyBkZWZpbmVkIHdpdGggdGhlIGBvbmV3YXlgIG1vZGlmaWVyLgorCitXaGVuIGNsaWVudCBzZW5kcyBhIHJlcXVlc3Qgd2l0aCB0eXBlIGBPbmV3YXlgLCB0aGUgc2VydmVyIG11c3QgX25vdF8gc2VuZCBhIHJlc3BvbnNlIChzdGVwcyAzIGFuZCA0IGFyZSBza2lwcGVkKS4gTm90ZQordGhhdCB0aGUgVGhyaWZ0IElETCBlbmZvcmNlcyBhIHJldHVybiB0eXBlIG9mIGB2b2lkYCBhbmQgZG9lcyBub3QgYWxsb3cgZXhjZXB0aW9ucyBmb3Igb25ld2F5IHNlcnZpY2VzLgorCisjIyBSZXF1ZXN0IHN0cnVjdAorCitUaGUgc3RydWN0IHRoYXQgZm9sbG93cyB0aGUgbWVzc2FnZSBvZiB0eXBlIGBDYWxsYCBvciBgT25ld2F5YCBjb250YWlucyB0aGUgYXJndW1lbnRzIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4gVGhlCithcmd1bWVudCBpZHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgaWRzLiBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IGlzIHRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2l0aCBgX2FyZ3NgIGFwcGVuZGVkLgorRm9yIG1ldGhvZHMgd2l0aG91dCBhcmd1bWVudHMgYW4gc3RydWN0IGlzIHNlbnQgd2l0aG91dCBmaWVsZHMuCisKKyMjIFJlc3BvbnNlIHN0cnVjdAorCitUaGUgc3RydWN0IHRoYXQgZm9sbG93cyB0aGUgbWVzc2FnZSBvZiB0eXBlIGBSZXBseWAgYXJlIHN0cnVjdHMgaW4gd2hpY2ggZXhhY3RseSAxIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIGlzIGVuY29kZWQ6CisKKyogQSBmaWVsZCB3aXRoIG5hbWUgYHN1Y2Nlc3NgIGFuZCBpZCBgMGAsIHVzZWQgaW4gY2FzZSB0aGUgbWV0aG9kIGNvbXBsZXRlZCBub3JtYWxseS4KKyogQW4gZXhjZXB0aW9uIGZpZWxkLCBuYW1lIGFuZCBpZCBhcmUgYXMgZGVmaW5lZCBpbiB0aGUgYHRocm93c2AgY2xhdXNlIGluIHRoZSBUaHJpZnQgSURMJ3Mgc2VydmljZSBtZXRob2QgZGVmaW5pdGlvbi4KKworV2hlbiB0aGUgbWVzc2FnZSBpcyBvZiB0eXBlIGBFeGNlcHRpb25gIHRoZSBzdHJ1Y3QgaXMgZW5jb2RlZCBhcyBpZiBpdCB3YXMgZGVjbGFyZWQgYnkgdGhlIGZvbGxvd2luZyBJREw6CisKK2BgYAorZXhjZXB0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgIDE6IHN0cmluZyBtZXNzYWdlLAorICAyOiBpMzIgdHlwZQorfQorYGBgCisKK1RoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uICgwLjkuMyk6CisKKyogX3Vua25vd25fOiAwLCB1c2VkIGluIGNhc2UgdGhlIHR5cGUgZnJvbSB0aGUgcGVlciBpcyB1bmtub3duLgorKiBfdW5rbm93biBtZXRob2RfOiAxLCB1c2VkIGluIGNhc2UgdGhlIG1ldGhvZCByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBpcyB1bmtub3duIGJ5IHRoZSBzZXJ2ZXIuCisqIF9pbnZhbGlkIG1lc3NhZ2UgdHlwZV86IDIsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX3dyb25nIG1ldGhvZCBuYW1lXzogMywgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfYmFkIHNlcXVlbmNlIGlkXzogNCwgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjbGllbnQgdG8gaW5kaWNhdGUgYSB3cm9uZyBzZXF1ZW5jZSBpZCBpbiB0aGUgcmVzcG9uc2UuCisqIF9taXNzaW5nIHJlc3VsdF86IDUsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY2xpZW50IHRvIGluZGljYXRlIGEgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZmllbGQgKHJlc3VsdCBub3IgZXhjZXB0aW9uKS4KKyogX2ludGVybmFsIGVycm9yXzogNiwgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCBmaWxlLiAKKyogX3Byb3RvY29sIGVycm9yXzogNywgdXNlZCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyBkZWNvZGluZy4gRm9yIGV4YW1wbGUgd2hlbiBhIGxpc3QgaXMgdG9vIGxvbmcgb3IgYSByZXF1aXJlZAorIGZpZWxkIGlzIG1pc3NpbmcuIAorKiBfaW52YWxpZCB0cmFuc2Zvcm1fOiA4LCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF9pbnZhbGlkIHByb3RvY29sXzogOSwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfdW5zdXBwb3J0ZWQgY2xpZW50IHR5cGVfOiAxMCwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorCisjIFByb3RvY29sIGNvbnNpZGVyYXRpb25zCisKKyMjIENvbXBhcmluZyBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2wKKworVGhlIGJpbmFyeSBwcm90b2NvbCBpcyBmYWlybHkgc2ltcGxlIGFuZCB0aGVyZWZvcmUgZWFzeSB0byBwcm9jZXNzLiBUaGUgY29tcGFjdCBwcm90b2NvbCBuZWVkcyBsZXNzIGJ5dGVzIHRvIHNlbmQgdGhlCitzYW1lIGRhdGEgYXQgdGhlIGNvc3Qgb2YgYWRkaXRpb25hbCBwcm9jZXNzaW5nLiBBcyBiYW5kd2lkdGggaXMgdXN1YWxseSB0aGUgYm90dGxlbmVjaywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgaXMgYWxtb3N0CithbHdheXMgc2xpZ2h0bHkgZmFzdGVyLgorCisjIyBDb21wYXRpYmlsaXR5CisKK0Egc2VydmVyIGNvdWxkIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYSBjbGllbnQgdGFsa3MgdGhlIGJpbmFyeSBwcm90b2NvbCBvciB0aGUgY29tcGFjdCBwcm90b2NvbCBieQoraW52ZXN0aWdhdGluZyB0aGUgZmlyc3QgYnl0ZS4gSWYgdGhlIHZhbHVlIGlzIGAxMDAwIDAwMDFgIG9yIGAwMDAwIDAwMDBgIChhc3N1bWluZyBhIG5hbWUgc2hvcnRlciB0aGVuIMKxMTYgTUIpIGl0IGlzIHRoZQorYmluYXJ5IHByb3RvY29sLiBXaGVuIHRoZSB2YWx1ZSBpcyBgMTAwMCAwMDEwYCBpdCBpcyB0YWxraW5nIHRoZSBjb21wYWN0IHByb3RvY29sLgorCisjIyBGcmFtZWQgdnMuIHVuZnJhbWVkIHRyYW5zcG9ydAorCitUaGUgZmlyc3QgdGhyaWZ0IGJpbmFyeSB3aXJlIGZvcm1hdCB3YXMgdW5mcmFtZWQuIFRoaXMgbWVhbnMgdGhhdCBpbmZvcm1hdGlvbiBpcyBzZW50IG91dCBpbiBhIHNpbmdsZSBzdHJlYW0gb2YgYnl0ZXMuCitXaXRoIHVuZnJhbWVkIHRyYW5zcG9ydCB0aGUgKGdlbmVyYXRlZCkgcHJvY2Vzc29ycyB3aWxsIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgc29ja2V0ICh0aG91Z2ggQXBhY2hlIFRocmlmdCBkb2VzIHRyeSB0bworZ3JhYiBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIHNvY2tldCBpbiBhIGJ1ZmZlciB3aGVuIGl0IGNhbikuCisKK0xhdGVyLCBUaHJpZnQgaW50cm9kdWNlZCB0aGUgZnJhbWVkIHRyYW5zcG9ydC4KKworV2l0aCBmcmFtZWQgdHJhbnNwb3J0IHRoZSBmdWxsIHJlcXVlc3QgYW5kIHJlc3BvbnNlICh0aGUgVE1lc3NhZ2UgYW5kIHRoZSBmb2xsb3dpbmcgc3RydWN0KSBhcmUgZmlyc3Qgd3JpdHRlbiB0byBhCitidWZmZXIuIFRoZW4gd2hlbiB0aGUgc3RydWN0IGlzIGNvbXBsZXRlICh0cmFuc3BvcnQgbWV0aG9kIGBmbHVzaGAgaXMgaGlqYWNrZWQgZm9yIHRoaXMpLCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMKK3dyaXR0ZW4gdG8gdGhlIHNvY2tldCBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIGJ1ZmZlcmVkIGJ5dGVzLiBUaGUgY29tYmluYXRpb24gaXMgY2FsbGVkIGEgX2ZyYW1lXy4gT24gdGhlIHJlY2VpdmVyIHNpZGUKK3RoZSBjb21wbGV0ZSBmcmFtZSBpcyBmaXJzdCByZWFkIGluIGEgYnVmZmVyIGJlZm9yZSB0aGUgbWVzc2FnZSBpcyBwYXNzZWQgdG8gYSBwcm9jZXNzb3IuCisKK1RoZSBsZW5ndGggcHJlZml4IGlzIGEgNCBieXRlIHNpZ25lZCBpbnQsIHNlbmQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIuCitUaGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZTogYDBgIDw9IGxlbmd0aCA8PSBgMTYzODQwMDBgICgxNk0pLgorCitGcmFtZWQgdHJhbnNwb3J0IHdhcyBpbnRyb2R1Y2VkIHRvIGVhc2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIHByb2Nlc3NvcnMuIEFuIGFzeW5jIHByb2Nlc3NvciBpcyBvbmx5IGludm9rZWQgd2hlbgorYWxsIGRhdGEgaXMgcmVjZWl2ZWQuIFVuZm9ydHVuYXRlbHksIGZyYW1lZCB0cmFuc3BvcnQgaXMgbm90IGlkZWFsIGZvciBsYXJnZSBtZXNzYWdlcyBhcyB0aGUgZW50aXJlIGZyYW1lIHN0YXlzIGluCittZW1vcnkgdW50aWwgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkLiBJbiBhZGRpdGlvbiwgdGhlIGphdmEgaW1wbGVtZW50YXRpb24gbWVyZ2VzIHRoZSBpbmNvbWluZyBkYXRhIHRvIGEgc2luZ2xlLAorZ3Jvd2luZyBieXRlIGFycmF5LiBFdmVyeSB0aW1lIHRoZSBieXRlIGFycmF5IGlzIGZ1bGwgaXQgbmVlZHMgdG8gYmUgY29waWVkIHRvIGEgbmV3IGxhcmdlciBieXRlIGFycmF5LgorCitGcmFtZWQgYW5kIHVuZnJhbWVkIHRyYW5zcG9ydHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4KZGlmZiAtLWdpdCBhL2RvYy90aHJpZnQtc2FzbC1zcGVjLnR4dCBiL2RvYy9zcGVjcy90aHJpZnQtc2FzbC1zcGVjLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL3RocmlmdC1zYXNsLXNwZWMudHh0CnJlbmFtZSB0byBkb2Mvc3BlY3MvdGhyaWZ0LXNhc2wtc3BlYy50eHQKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQudGV4IGIvZG9jL3NwZWNzL3RocmlmdC50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNmZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQudGV4CkBAIC0wLDAgKzEsMTA1NyBAQAorJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislCislICAgICAgICAgICAgICAgVGhyaWZ0IHdoaXRlcGFwZXIKKyUKKyUgTmFtZTogICAgICAgICB0aHJpZnQudGV4CislCislIEF1dGhvcnM6ICAgICAgTWFyayBTbGVlIChtY3NsZWVAZmFjZWJvb2suY29tKQorJQorJSBDcmVhdGVkOiAgICAgIDA1IE1hcmNoIDIwMDcKKyUKKyUgWW91IHdpbGwgbmVlZCBhIGNvcHkgb2Ygc2lncGxhbmNvbmYuY2xzIHRvIGZvcm1hdCB0aGlzIGRvY3VtZW50LgorJSBJdCBpcyBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuc2lncGxhbi5vcmcvYXV0aG9ySW5mb3JtYXRpb24uaHRtPi4KKyUKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1xkb2N1bWVudGNsYXNzW25vY29weXJpZ2h0c3BhY2UsYmxvY2tzdHlsZV17c2lncGxhbmNvbmZ9CisKK1x1c2VwYWNrYWdle2Ftc3N5bWJ9CitcdXNlcGFja2FnZXthbXNmb250c30KK1x1c2VwYWNrYWdle2Ftc21hdGh9CitcdXNlcGFja2FnZXt1cmx9CisKK1xiZWdpbntkb2N1bWVudH0KKworJSBcY29uZmVyZW5jZWluZm97V1hZWiAnMDV9e2RhdGUsIENpdHkufQorJSBcY29weXJpZ2h0eWVhcnsyMDA3fQorJSBcY29weXJpZ2h0ZGF0YXtbdG8gYmUgc3VwcGxpZWRdfQorCislIFx0aXRsZWJhbm5lcntiYW5uZXIgYWJvdmUgcGFwZXIgdGl0bGV9ICAgICAgICAlIFRoZXNlIGFyZSBpZ25vcmVkIHVubGVzcworJSBccHJlcHJpbnRmb290ZXJ7c2hvcnQgZGVzY3JpcHRpb24gb2YgcGFwZXJ9ICAgJSAncHJlcHJpbnQnIG9wdGlvbiBzcGVjaWZpZWQuCisKK1x0aXRsZXtUaHJpZnQ6IFNjYWxhYmxlIENyb3NzLUxhbmd1YWdlIFNlcnZpY2VzIEltcGxlbWVudGF0aW9ufQorXHN1YnRpdGxle30KKworXGF1dGhvcmluZm97TWFyayBTbGVlLCBBZGl0eWEgQWdhcndhbCBhbmQgTWFyYyBLd2lhdGtvd3NraX0KKyAgICAgICAgICAge0ZhY2Vib29rLCAxNTYgVW5pdmVyc2l0eSBBdmUsIFBhbG8gQWx0bywgQ0F9CisgICAgICAgICAgIHtce21jc2xlZSxhZGl0eWEsbWFyY1x9QGZhY2Vib29rLmNvbX0KKworXG1ha2V0aXRsZQorCitcYmVnaW57YWJzdHJhY3R9CitUaHJpZnQgaXMgYSBzb2Z0d2FyZSBsaWJyYXJ5IGFuZCBzZXQgb2YgY29kZS1nZW5lcmF0aW9uIHRvb2xzIGRldmVsb3BlZCBhdAorRmFjZWJvb2sgdG8gZXhwZWRpdGUgZGV2ZWxvcG1lbnQgYW5kIGltcGxlbWVudGF0aW9uIG9mIGVmZmljaWVudCBhbmQgc2NhbGFibGUKK2JhY2tlbmQgc2VydmljZXMuIEl0cyBwcmltYXJ5IGdvYWwgaXMgdG8gZW5hYmxlIGVmZmljaWVudCBhbmQgcmVsaWFibGUKK2NvbW11bmljYXRpb24gYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyBieSBhYnN0cmFjdGluZyB0aGUgcG9ydGlvbnMgb2YgZWFjaAorbGFuZ3VhZ2UgdGhhdCB0ZW5kIHRvIHJlcXVpcmUgdGhlIG1vc3QgY3VzdG9taXphdGlvbiBpbnRvIGEgY29tbW9uIGxpYnJhcnkKK3RoYXQgaXMgaW1wbGVtZW50ZWQgaW4gZWFjaCBsYW5ndWFnZS4gU3BlY2lmaWNhbGx5LCBUaHJpZnQgYWxsb3dzIGRldmVsb3BlcnMgdG8KK2RlZmluZSBkYXRhdHlwZXMgYW5kIHNlcnZpY2UgaW50ZXJmYWNlcyBpbiBhIHNpbmdsZSBsYW5ndWFnZS1uZXV0cmFsIGZpbGUKK2FuZCBnZW5lcmF0ZSBhbGwgdGhlIG5lY2Vzc2FyeSBjb2RlIHRvIGJ1aWxkIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorCitUaGlzIHBhcGVyIGRldGFpbHMgdGhlIG1vdGl2YXRpb25zIGFuZCBkZXNpZ24gY2hvaWNlcyB3ZSBtYWRlIGluIFRocmlmdCwgYXMKK3dlbGwgYXMgc29tZSBvZiB0aGUgbW9yZSBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJdCBpcyBub3QKK2ludGVuZGVkIHRvIGJlIHRha2VuIGFzIHJlc2VhcmNoLCBidXQgcmF0aGVyIGl0IGlzIGFuIGV4cG9zaXRpb24gb24gd2hhdCB3ZSBkaWQKK2FuZCB3aHkuCitcZW5ke2Fic3RyYWN0fQorCislIFxjYXRlZ29yeXtELjMuM317UHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzfXtMYW5ndWFnZSBjb25zdHJ1Y3RzIGFuZCBmZWF0dXJlc30KKworJVx0ZXJtcworJUxhbmd1YWdlcywgc2VyaWFsaXphdGlvbiwgcmVtb3RlIHByb2NlZHVyZSBjYWxsCisKKyVca2V5d29yZHMKKyVEYXRhIGRlc2NyaXB0aW9uIGxhbmd1YWdlLCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSwgcmVtb3RlIHByb2NlZHVyZSBjYWxsCisKK1xzZWN0aW9ue0ludHJvZHVjdGlvbn0KK0FzIEZhY2Vib29rJ3MgdHJhZmZpYyBhbmQgbmV0d29yayBzdHJ1Y3R1cmUgaGF2ZSBzY2FsZWQsIHRoZSByZXNvdXJjZQorZGVtYW5kcyBvZiBtYW55IG9wZXJhdGlvbnMgb24gdGhlIHNpdGUgKGkuZS4gc2VhcmNoLAorYWQgc2VsZWN0aW9uIGFuZCBkZWxpdmVyeSwgZXZlbnQgbG9nZ2luZykgaGF2ZSBwcmVzZW50ZWQgdGVjaG5pY2FsIHJlcXVpcmVtZW50cworZHJhc3RpY2FsbHkgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIExBTVAgZnJhbWV3b3JrLiBJbiBvdXIgaW1wbGVtZW50YXRpb24gb2YKK3RoZXNlIHNlcnZpY2VzLCB2YXJpb3VzIHByb2dyYW1taW5nIGxhbmd1YWdlcyBoYXZlIGJlZW4gc2VsZWN0ZWQgdG8KK29wdGltaXplIGZvciB0aGUgcmlnaHQgY29tYmluYXRpb24gb2YgcGVyZm9ybWFuY2UsIGVhc2UgYW5kIHNwZWVkIG9mCitkZXZlbG9wbWVudCwgYXZhaWxhYmlsaXR5IG9mIGV4aXN0aW5nIGxpYnJhcmllcywgZXRjLiBCeSBhbmQgbGFyZ2UsCitGYWNlYm9vaydzIGVuZ2luZWVyaW5nIGN1bHR1cmUgaGFzIHRlbmRlZCB0b3dhcmRzIGNob29zaW5nIHRoZSBiZXN0Cit0b29scyBhbmQgaW1wbGVtZW50YXRpb25zIGF2YWlsYWJsZSBvdmVyIHN0YW5kYXJkaXppbmcgb24gYW55IG9uZQorcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYW5kIGJlZ3J1ZGdpbmdseSBhY2NlcHRpbmcgaXRzIGluaGVyZW50IGxpbWl0YXRpb25zLgorCitHaXZlbiB0aGlzIGRlc2lnbiBjaG9pY2UsIHdlIHdlcmUgcHJlc2VudGVkIHdpdGggdGhlIGNoYWxsZW5nZSBvZiBidWlsZGluZworYSB0cmFuc3BhcmVudCwgaGlnaC1wZXJmb3JtYW5jZSBicmlkZ2UgYWNyb3NzIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorV2UgZm91bmQgdGhhdCBtb3N0IGF2YWlsYWJsZSBzb2x1dGlvbnMgd2VyZSBlaXRoZXIgdG9vIGxpbWl0ZWQsIGRpZCBub3Qgb2ZmZXIKK3N1ZmZpY2llbnQgZGF0YXR5cGUgZnJlZWRvbSwgb3Igc3VmZmVyZWQgZnJvbSBzdWJwYXIgcGVyZm9ybWFuY2UuCitcZm9vdG5vdGV7U2VlIEFwcGVuZGl4IEEgZm9yIGEgZGlzY3Vzc2lvbiBvZiBhbHRlcm5hdGl2ZSBzeXN0ZW1zLn0KKworVGhlIHNvbHV0aW9uIHRoYXQgd2UgaGF2ZSBpbXBsZW1lbnRlZCBjb21iaW5lcyBhIGxhbmd1YWdlLW5ldXRyYWwgc29mdHdhcmUKK3N0YWNrIGltcGxlbWVudGVkIGFjcm9zcyBudW1lcm91cyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYW5kIGFuIGFzc29jaWF0ZWQgY29kZQorZ2VuZXJhdGlvbiBlbmdpbmUgdGhhdCB0cmFuc2Zvcm1zIGEgc2ltcGxlIGludGVyZmFjZSBhbmQgZGF0YSBkZWZpbml0aW9uCitsYW5ndWFnZSBpbnRvIGNsaWVudCBhbmQgc2VydmVyIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBsaWJyYXJpZXMuCitDaG9vc2luZyBzdGF0aWMgY29kZSBnZW5lcmF0aW9uIG92ZXIgYSBkeW5hbWljIHN5c3RlbSBhbGxvd3MgdXMgdG8gY3JlYXRlCit2YWxpZGF0ZWQgY29kZSB0aGF0IGNhbiBiZSBydW4gd2l0aG91dCB0aGUgbmVlZCBmb3IKK2FueSBhZHZhbmNlZCBpbnRyb3NwZWN0aXZlIHJ1bi10aW1lIHR5cGUgY2hlY2tpbmcuIEl0IGlzIGFsc28gZGVzaWduZWQgdG8KK2JlIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSBmb3IgdGhlIGRldmVsb3Blciwgd2hvIGNhbiB0eXBpY2FsbHkgZGVmaW5lIGFsbAordGhlIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMgYW5kIGludGVyZmFjZXMgZm9yIGEgY29tcGxleCBzZXJ2aWNlIGluIGEgc2luZ2xlCitzaG9ydCBmaWxlLgorCitTdXJwcmlzZWQgdGhhdCBhIHJvYnVzdCBvcGVuIHNvbHV0aW9uIHRvIHRoZXNlIHJlbGF0aXZlbHkgY29tbW9uIHByb2JsZW1zCitkaWQgbm90IHlldCBleGlzdCwgd2UgY29tbWl0dGVkIGVhcmx5IG9uIHRvIG1ha2luZyB0aGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uCitvcGVuIHNvdXJjZS4KKworSW4gZXZhbHVhdGluZyB0aGUgY2hhbGxlbmdlcyBvZiBjcm9zcy1sYW5ndWFnZSBpbnRlcmFjdGlvbiBpbiBhIG5ldHdvcmtlZAorZW52aXJvbm1lbnQsIHNvbWUga2V5IGNvbXBvbmVudHMgd2VyZSBpZGVudGlmaWVkOgorCitcdGV4dGl0e1R5cGVzLn0gQSBjb21tb24gdHlwZSBzeXN0ZW0gbXVzdCBleGlzdCBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzCit3aXRob3V0IHJlcXVpcmluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgdXNlIGN1c3RvbSBUaHJpZnQgZGF0YXR5cGVzCitvciB3cml0ZSB0aGVpciBvd24gc2VyaWFsaXphdGlvbiBjb2RlLiBUaGF0IGlzLAorYSBDKysgcHJvZ3JhbW1lciBzaG91bGQgYmUgYWJsZSB0byB0cmFuc3BhcmVudGx5IGV4Y2hhbmdlIGEgc3Ryb25nbHkgdHlwZWQKK1NUTCBtYXAgZm9yIGEgZHluYW1pYyBQeXRob24gZGljdGlvbmFyeS4gTmVpdGhlcgorcHJvZ3JhbW1lciBzaG91bGQgYmUgZm9yY2VkIHRvIHdyaXRlIGFueSBjb2RlIGJlbG93IHRoZSBhcHBsaWNhdGlvbiBsYXllcgordG8gYWNoaWV2ZSB0aGlzLiBTZWN0aW9uIDIgZGV0YWlscyB0aGUgVGhyaWZ0IHR5cGUgc3lzdGVtLgorCitcdGV4dGl0e1RyYW5zcG9ydC59IEVhY2ggbGFuZ3VhZ2UgbXVzdCBoYXZlIGEgY29tbW9uIGludGVyZmFjZSB0bworYmlkaXJlY3Rpb25hbCByYXcgZGF0YSB0cmFuc3BvcnQuIFRoZSBzcGVjaWZpY3Mgb2YgaG93IGEgZ2l2ZW4KK3RyYW5zcG9ydCBpcyBpbXBsZW1lbnRlZCBzaG91bGQgbm90IG1hdHRlciB0byB0aGUgc2VydmljZSBkZXZlbG9wZXIuCitUaGUgc2FtZSBhcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBiZSBhYmxlIHRvIHJ1biBhZ2FpbnN0IFRDUCBzdHJlYW0gc29ja2V0cywKK3JhdyBkYXRhIGluIG1lbW9yeSwgb3IgZmlsZXMgb24gZGlzay4gU2VjdGlvbiAzIGRldGFpbHMgdGhlIFRocmlmdCBUcmFuc3BvcnQKK2xheWVyLgorCitcdGV4dGl0e1Byb3RvY29sLn0gRGF0YXR5cGVzIG11c3QgaGF2ZSBzb21lIHdheSBvZiB1c2luZyB0aGUgVHJhbnNwb3J0CitsYXllciB0byBlbmNvZGUgYW5kIGRlY29kZSB0aGVtc2VsdmVzLiBBZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCitkZXZlbG9wZXIgbmVlZCBub3QgYmUgY29uY2VybmVkIGJ5IHRoaXMgbGF5ZXIuIFdoZXRoZXIgdGhlIHNlcnZpY2UgdXNlcworYW4gWE1MIG9yIGJpbmFyeSBwcm90b2NvbCBpcyBpbW1hdGVyaWFsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb2RlLgorQWxsIHRoYXQgbWF0dGVycyBpcyB0aGF0IHRoZSBkYXRhIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGluIGEgY29uc2lzdGVudCwKK2RldGVybWluaXN0aWMgbWF0dGVyLiBTZWN0aW9uIDQgZGV0YWlscyB0aGUgVGhyaWZ0IFByb3RvY29sIGxheWVyLgorCitcdGV4dGl0e1ZlcnNpb25pbmcufSBGb3Igcm9idXN0IHNlcnZpY2VzLCB0aGUgaW52b2x2ZWQgZGF0YXR5cGVzIG11c3QKK3Byb3ZpZGUgYSBtZWNoYW5pc20gZm9yIHZlcnNpb25pbmcgdGhlbXNlbHZlcy4gU3BlY2lmaWNhbGx5LAoraXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGFkZCBvciByZW1vdmUgZmllbGRzIGluIGFuIG9iamVjdCBvciBhbHRlciB0aGUKK2FyZ3VtZW50IGxpc3Qgb2YgYSBmdW5jdGlvbiB3aXRob3V0IGFueSBpbnRlcnJ1cHRpb24gaW4gc2VydmljZSAob3IsCit3b3JzZSB5ZXQsIG5hc3R5IHNlZ21lbnRhdGlvbiBmYXVsdHMpLiBTZWN0aW9uIDUgZGV0YWlscyBUaHJpZnQncyB2ZXJzaW9uaW5nCitzeXN0ZW0uCisKK1x0ZXh0aXR7UHJvY2Vzc29ycy59IEZpbmFsbHksIHdlIGdlbmVyYXRlIGNvZGUgY2FwYWJsZSBvZiBwcm9jZXNzaW5nIGRhdGEKK3N0cmVhbXMgdG8gYWNjb21wbGlzaCByZW1vdGUgcHJvY2VkdXJlIGNhbGxzLiBTZWN0aW9uIDYgZGV0YWlscyB0aGUgZ2VuZXJhdGVkCitjb2RlIGFuZCBUUHJvY2Vzc29yIHBhcmFkaWdtLgorCitTZWN0aW9uIDcgZGlzY3Vzc2VzIGltcGxlbWVudGF0aW9uIGRldGFpbHMsIGFuZCBTZWN0aW9uIDggZGVzY3JpYmVzCitvdXIgY29uY2x1c2lvbnMuCisKK1xzZWN0aW9ue1R5cGVzfQorCitUaGUgZ29hbCBvZiB0aGUgVGhyaWZ0IHR5cGUgc3lzdGVtIGlzIHRvIGVuYWJsZSBwcm9ncmFtbWVycyB0byBkZXZlbG9wIHVzaW5nCitjb21wbGV0ZWx5IG5hdGl2ZWx5IGRlZmluZWQgdHlwZXMsIG5vIG1hdHRlciB3aGF0IHByb2dyYW1taW5nIGxhbmd1YWdlIHRoZXkKK3VzZS4gQnkgZGVzaWduLCB0aGUgVGhyaWZ0IHR5cGUgc3lzdGVtIGRvZXMgbm90IGludHJvZHVjZSBhbnkgc3BlY2lhbCBkeW5hbWljCit0eXBlcyBvciB3cmFwcGVyIG9iamVjdHMuIEl0IGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSBkZXZlbG9wZXIgd3JpdGUKK2FueSBjb2RlIGZvciBvYmplY3Qgc2VyaWFsaXphdGlvbiBvciB0cmFuc3BvcnQuIFRoZSBUaHJpZnQgSURMIChJbnRlcmZhY2UKK0RlZmluaXRpb24gTGFuZ3VhZ2UpIGZpbGUgaXMKK2xvZ2ljYWxseSBhIHdheSBmb3IgZGV2ZWxvcGVycyB0byBhbm5vdGF0ZSB0aGVpciBkYXRhIHN0cnVjdHVyZXMgd2l0aCB0aGUKK21pbmltYWwgYW1vdW50IG9mIGV4dHJhIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byB0ZWxsIGEgY29kZSBnZW5lcmF0b3IKK2hvdyB0byBzYWZlbHkgdHJhbnNwb3J0IHRoZSBvYmplY3RzIGFjcm9zcyBsYW5ndWFnZXMuCisKK1xzdWJzZWN0aW9ue0Jhc2UgVHlwZXN9CisKK1RoZSB0eXBlIHN5c3RlbSByZXN0cyB1cG9uIGEgZmV3IGJhc2UgdHlwZXMuIEluIGNvbnNpZGVyaW5nIHdoaWNoIHR5cGVzIHRvCitzdXBwb3J0LCB3ZSBhaW1lZCBmb3IgY2xhcml0eSBhbmQgc2ltcGxpY2l0eSBvdmVyIGFidW5kYW5jZSwgZm9jdXNpbmcKK29uIHRoZSBrZXkgdHlwZXMgYXZhaWxhYmxlIGluIGFsbCBwcm9ncmFtbWluZyBsYW5ndWFnZXMsIG9taXR0aW5nIGFueQorbmljaGUgdHlwZXMgYXZhaWxhYmxlIG9ubHkgaW4gc3BlY2lmaWMgbGFuZ3VhZ2VzLgorCitUaGUgYmFzZSB0eXBlcyBzdXBwb3J0ZWQgYnkgVGhyaWZ0IGFyZToKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHRleHR0dHtib29sfSBBIGJvb2xlYW4gdmFsdWUsIHRydWUgb3IgZmFsc2UKK1xpdGVtIFx0ZXh0dHR7Ynl0ZX0gQSBzaWduZWQgYnl0ZQorXGl0ZW0gXHRleHR0dHtpMTZ9IEEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyCitcaXRlbSBcdGV4dHR0e2kzMn0gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIKK1xpdGVtIFx0ZXh0dHR7aTY0fSBBIDY0LWJpdCBzaWduZWQgaW50ZWdlcgorXGl0ZW0gXHRleHR0dHtkb3VibGV9IEEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcgorXGl0ZW0gXHRleHR0dHtzdHJpbmd9IEFuIGVuY29kaW5nLWFnbm9zdGljIHRleHQgb3IgYmluYXJ5IHN0cmluZworXGl0ZW0gXHRleHR0dHtiaW5hcnl9IEEgYnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbiBmb3IgYmxvYnMKK1xlbmR7aXRlbWl6ZX0KKworT2YgcGFydGljdWxhciBub3RlIGlzIHRoZSBhYnNlbmNlIG9mIHVuc2lnbmVkIGludGVnZXIgdHlwZXMuIEJlY2F1c2UgdGhlc2UKK3R5cGVzIGhhdmUgbm8gZGlyZWN0IHRyYW5zbGF0aW9uIHRvIG5hdGl2ZSBwcmltaXRpdmUgdHlwZXMgaW4gbWFueSBsYW5ndWFnZXMsCit0aGUgYWR2YW50YWdlcyB0aGV5IGFmZm9yZCBhcmUgbG9zdC4gRnVydGhlciwgdGhlcmUgaXMgbm8gd2F5IHRvIHByZXZlbnQgdGhlCithcHBsaWNhdGlvbiBkZXZlbG9wZXIgaW4gYSBsYW5ndWFnZSBsaWtlIFB5dGhvbiBmcm9tIGFzc2lnbmluZyBhIG5lZ2F0aXZlIHZhbHVlCit0byBhbiBpbnRlZ2VyIHZhcmlhYmxlLCBsZWFkaW5nIHRvIHVucHJlZGljdGFibGUgYmVoYXZpb3IuIEZyb20gYSBkZXNpZ24KK3N0YW5kcG9pbnQsIHdlIG9ic2VydmVkIHRoYXQgdW5zaWduZWQgaW50ZWdlcnMgd2VyZSB2ZXJ5IHJhcmVseSwgaWYgZXZlciwgdXNlZAorZm9yIGFyaXRobWV0aWMgcHVycG9zZXMsIGJ1dCBpbiBwcmFjdGljZSB3ZXJlIG11Y2ggbW9yZSBvZnRlbiB1c2VkIGFzIGtleXMgb3IKK2lkZW50aWZpZXJzLiBJbiB0aGlzIGNhc2UsIHRoZSBzaWduIGlzIGlycmVsZXZhbnQuIFNpZ25lZCBpbnRlZ2VycyBzZXJ2ZSB0aGlzCitzYW1lIHB1cnBvc2UgYW5kIGNhbiBiZSBzYWZlbHkgY2FzdCB0byB0aGVpciB1bnNpZ25lZCBjb3VudGVycGFydHMgKG1vc3QKK2NvbW1vbmx5IGluIEMrKykgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KKworXHN1YnNlY3Rpb257U3RydWN0c30KKworQSBUaHJpZnQgc3RydWN0IGRlZmluZXMgYSBjb21tb24gb2JqZWN0IHRvIGJlIHVzZWQgYWNyb3NzIGxhbmd1YWdlcy4gQSBzdHJ1Y3QKK2lzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gYSBjbGFzcyBpbiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcy4gQSBzdHJ1Y3QgaGFzIGEgc2V0IG9mIHN0cm9uZ2x5IHR5cGVkIGZpZWxkcywgZWFjaCB3aXRoIGEgdW5pcXVlCituYW1lIGlkZW50aWZpZXIuIFRoZSBiYXNpYyBzeW50YXggZm9yIGRlZmluaW5nIGEgVGhyaWZ0IHN0cnVjdCBsb29rcyB2ZXJ5CitzaW1pbGFyIHRvIGEgQyBzdHJ1Y3QgZGVmaW5pdGlvbi4gRmllbGRzIG1heSBiZSBhbm5vdGF0ZWQgd2l0aCBhbiBpbnRlZ2VyIGZpZWxkCitpZGVudGlmaWVyICh1bmlxdWUgdG8gdGhlIHNjb3BlIG9mIHRoYXQgc3RydWN0KSBhbmQgb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZXMuCitGaWVsZCBpZGVudGlmaWVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWYgb21pdHRlZCwgdGhvdWdoIHRoZXkgYXJlCitzdHJvbmdseSBlbmNvdXJhZ2VkIGZvciB2ZXJzaW9uaW5nIHJlYXNvbnMgZGlzY3Vzc2VkIGxhdGVyLgorCitcc3Vic2VjdGlvbntDb250YWluZXJzfQorCitUaHJpZnQgY29udGFpbmVycyBhcmUgc3Ryb25nbHkgdHlwZWQgY29udGFpbmVycyB0aGF0IG1hcCB0byB0aGUgbW9zdCBjb21tb25seQordXNlZCBjb250YWluZXJzIGluIGNvbW1vbiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIFRoZXkgYXJlIGFubm90YXRlZCB1c2luZwordGhlIEMrKyB0ZW1wbGF0ZSAob3IgSmF2YSBHZW5lcmljcykgc3R5bGUuIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBhdmFpbGFibGU6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx0ZXh0dHR7bGlzdDx0eXBlPn0gQW4gb3JkZXJlZCBsaXN0IG9mIGVsZW1lbnRzLiBUcmFuc2xhdGVzIGRpcmVjdGx5IGludG8KK2FuIFNUTCBcdGV4dHR0e3ZlY3Rvcn0sIEphdmEgXHRleHR0dHtBcnJheUxpc3R9LCBvciBuYXRpdmUgYXJyYXkgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcy4gTWF5Citjb250YWluIGR1cGxpY2F0ZXMuCitcaXRlbSBcdGV4dHR0e3NldDx0eXBlPn0gQW4gdW5vcmRlcmVkIHNldCBvZiB1bmlxdWUgZWxlbWVudHMuIFRyYW5zbGF0ZXMgaW50bworYW4gU1RMIFx0ZXh0dHR7c2V0fSwgSmF2YSBcdGV4dHR0e0hhc2hTZXR9LCBcdGV4dHR0e3NldH0gaW4gUHl0aG9uLCBvciBuYXRpdmUKK2RpY3Rpb25hcnkgaW4gUEhQL1J1YnkuCitcaXRlbSBcdGV4dHR0e21hcDx0eXBlMSx0eXBlMj59IEEgbWFwIG9mIHN0cmljdGx5IHVuaXF1ZSBrZXlzIHRvIHZhbHVlcworVHJhbnNsYXRlcyBpbnRvIGFuIFNUTCBcdGV4dHR0e21hcH0sIEphdmEgXHRleHR0dHtIYXNoTWFwfSwgUEhQIGFzc29jaWF0aXZlCithcnJheSwgb3IgUHl0aG9uL1J1YnkgZGljdGlvbmFyeS4KK1xlbmR7aXRlbWl6ZX0KKworV2hpbGUgZGVmYXVsdHMgYXJlIHByb3ZpZGVkLCB0aGUgdHlwZSBtYXBwaW5ncyBhcmUgbm90IGV4cGxpY2l0bHkgZml4ZWQuIEN1c3RvbQorY29kZSBnZW5lcmF0b3IgZGlyZWN0aXZlcyBoYXZlIGJlZW4gYWRkZWQgdG8gc3Vic3RpdHV0ZSBjdXN0b20gdHlwZXMgaW4KK2Rlc3RpbmF0aW9uIGxhbmd1YWdlcyAoaS5lLgorXHRleHR0dHtoYXNoXF9tYXB9IG9yIEdvb2dsZSdzIHNwYXJzZSBoYXNoIG1hcCBjYW4gYmUgdXNlZCBpbiBDKyspLiBUaGUKK29ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgY3VzdG9tIHR5cGVzIHN1cHBvcnQgYWxsIHRoZSBuZWNlc3NhcnkgaXRlcmF0aW9uCitwcmltaXRpdmVzLiBDb250YWluZXIgZWxlbWVudHMgbWF5IGJlIG9mIGFueSB2YWxpZCBUaHJpZnQgdHlwZSwgaW5jbHVkaW5nIG90aGVyCitjb250YWluZXJzIG9yIHN0cnVjdHMuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3N0cnVjdCBFeGFtcGxlIHsKKyAgMTppMzIgbnVtYmVyPTEwLAorICAyOmk2NCBiaWdOdW1iZXIsCisgIDM6ZG91YmxlIGRlY2ltYWxzLAorICA0OnN0cmluZyBuYW1lPSJ0aHJpZnR5IgorfVxlbmR7dmVyYmF0aW19CisKK0luIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIGVhY2ggZGVmaW5pdGlvbiBnZW5lcmF0ZXMgYSB0eXBlIHdpdGggdHdvIG1ldGhvZHMsCitcdGV4dHR0e3JlYWR9IGFuZCBcdGV4dHR0e3dyaXRlfSwgd2hpY2ggcGVyZm9ybSBzZXJpYWxpemF0aW9uIGFuZCB0cmFuc3BvcnQKK29mIHRoZSBvYmplY3RzIHVzaW5nIGEgVGhyaWZ0IFRQcm90b2NvbCBvYmplY3QuCisKK1xzdWJzZWN0aW9ue0V4Y2VwdGlvbnN9CisKK0V4Y2VwdGlvbnMgYXJlIHN5bnRhY3RpY2FsbHkgYW5kIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHN0cnVjdHMgZXhjZXB0Cit0aGF0IHRoZXkgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBcdGV4dHR0e2V4Y2VwdGlvbn0ga2V5d29yZCBpbnN0ZWFkIG9mIHRoZQorXHRleHR0dHtzdHJ1Y3R9IGtleXdvcmQuCisKK1RoZSBnZW5lcmF0ZWQgb2JqZWN0cyBpbmhlcml0IGZyb20gYW4gZXhjZXB0aW9uIGJhc2UgY2xhc3MgYXMgYXBwcm9wcmlhdGUKK2luIGVhY2ggdGFyZ2V0IHByb2dyYW1taW5nIGxhbmd1YWdlLCBpbiBvcmRlciB0byBzZWFtbGVzc2x5CitpbnRlZ3JhdGUgd2l0aCBuYXRpdmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGFueSBnaXZlbgorbGFuZ3VhZ2UuIEFnYWluLCB0aGUgZGVzaWduIGVtcGhhc2lzIGlzIG9uIG1ha2luZyB0aGUgY29kZSBmYW1pbGlhciB0byB0aGUKK2FwcGxpY2F0aW9uIGRldmVsb3Blci4KKworXHN1YnNlY3Rpb257U2VydmljZXN9CisKK1NlcnZpY2VzIGFyZSBkZWZpbmVkIHVzaW5nIFRocmlmdCB0eXBlcy4gRGVmaW5pdGlvbiBvZiBhIHNlcnZpY2UgaXMKK3NlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGRlZmluaW5nIGFuIGludGVyZmFjZSAob3IgYSBwdXJlIHZpcnR1YWwgYWJzdHJhY3QKK2NsYXNzKSBpbiBvYmplY3Qgb3JpZW50ZWQKK3Byb2dyYW1taW5nLiBUaGUgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlcyBmdWxseSBmdW5jdGlvbmFsIGNsaWVudCBhbmQKK3NlcnZlciBzdHVicyB0aGF0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlLiBTZXJ2aWNlcyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgorCitcYmVnaW57dmVyYmF0aW19CitzZXJ2aWNlIDxuYW1lPiB7CisgIDxyZXR1cm50eXBlPiA8bmFtZT4oPGFyZ3VtZW50cz4pCisgICAgW3Rocm93cyAoPGV4Y2VwdGlvbnM+KV0KKyAgLi4uCit9XGVuZHt2ZXJiYXRpbX0KKworQW4gZXhhbXBsZToKKworXGJlZ2lue3ZlcmJhdGltfQorc2VydmljZSBTdHJpbmdDYWNoZSB7CisgIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAorICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCisgIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKK30KK1xlbmR7dmVyYmF0aW19CisKK05vdGUgdGhhdCBcdGV4dHR0e3ZvaWR9IGlzIGEgdmFsaWQgdHlwZSBmb3IgYSBmdW5jdGlvbiByZXR1cm4sIGluIGFkZGl0aW9uIHRvCithbGwgb3RoZXIgZGVmaW5lZCBUaHJpZnQgdHlwZXMuIEFkZGl0aW9uYWxseSwgYW4gXHRleHR0dHthc3luY30gbW9kaWZpZXIKK2tleXdvcmQgbWF5IGJlIGFkZGVkIHRvIGEgXHRleHR0dHt2b2lkfSBmdW5jdGlvbiwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgZG9lcworbm90IHdhaXQgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBOb3RlIHRoYXQgYSBwdXJlIFx0ZXh0dHR7dm9pZH0KK2Z1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlCitvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBvbiB0aGUgc2VydmVyIHNpZGUuIFdpdGggXHRleHR0dHthc3luY30gbWV0aG9kIGNhbGxzCit0aGUgY2xpZW50IHdpbGwgb25seSBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGF0IHRoZQordHJhbnNwb3J0IGxheWVyLiAoSW4gbWFueSB0cmFuc3BvcnQgc2NlbmFyaW9zIHRoaXMgaXMgaW5oZXJlbnRseSB1bnJlbGlhYmxlCitkdWUgdG8gdGhlIEJ5emFudGluZSBHZW5lcmFscycgUHJvYmxlbS4gVGhlcmVmb3JlLCBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzCitzaG91bGQgdGFrZSBjYXJlIG9ubHkgdG8gdXNlIHRoZSBhc3luYyBvcHRpbWl6YXRpb24gaW4gY2FzZXMgd2hlcmUgZHJvcHBlZAorbWV0aG9kIGNhbGxzIGFyZSBhY2NlcHRhYmxlIG9yIHRoZSB0cmFuc3BvcnQgaXMga25vd24gdG8gYmUgcmVsaWFibGUuKQorCitBbHNvIG9mIG5vdGUgaXMgdGhlIGZhY3QgdGhhdCBhcmd1bWVudCBsaXN0cyBhbmQgZXhjZXB0aW9uIGxpc3RzIGZvciBmdW5jdGlvbnMKK2FyZSBpbXBsZW1lbnRlZCBhcyBUaHJpZnQgc3RydWN0cy4gQWxsIHRocmVlIGNvbnN0cnVjdHMgYXJlIGlkZW50aWNhbCBpbiBib3RoCitub3RhdGlvbiBhbmQgYmVoYXZpb3IuCisKK1xzZWN0aW9ue1RyYW5zcG9ydH0KKworVGhlIHRyYW5zcG9ydCBsYXllciBpcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmYWNpbGl0YXRlIGRhdGEgdHJhbnNmZXIuCisKK1xzdWJzZWN0aW9ue0ludGVyZmFjZX0KKworQSBrZXkgZGVzaWduIGNob2ljZSBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0IHdhcyB0byBkZWNvdXBsZSB0aGUKK3RyYW5zcG9ydCBsYXllciBmcm9tIHRoZSBjb2RlIGdlbmVyYXRpb24gbGF5ZXIuIFRob3VnaCBUaHJpZnQgaXMgdHlwaWNhbGx5Cit1c2VkIG9uIHRvcCBvZiB0aGUgVENQL0lQIHN0YWNrIHdpdGggc3RyZWFtaW5nIHNvY2tldHMgYXMgdGhlIGJhc2UgbGF5ZXIgb2YKK2NvbW11bmljYXRpb24sIHRoZXJlIHdhcyBubyBjb21wZWxsaW5nIHJlYXNvbiB0byBidWlsZCB0aGF0IGNvbnN0cmFpbnQgaW50bwordGhlIHN5c3RlbS4gVGhlIHBlcmZvcm1hbmNlIHRyYWRlb2ZmIGluY3VycmVkIGJ5IGFuIGFic3RyYWN0ZWQgSS9PIGxheWVyCisocm91Z2hseSBvbmUgdmlydHVhbCBtZXRob2QgbG9va3VwIC8gZnVuY3Rpb24gY2FsbCBwZXIgb3BlcmF0aW9uKSB3YXMKK2ltbWF0ZXJpYWwgY29tcGFyZWQgdG8gdGhlIGNvc3Qgb2YgYWN0dWFsIEkvTyBvcGVyYXRpb25zICh0eXBpY2FsbHkgaW52b2tpbmcKK3N5c3RlbSBjYWxscykuCisKK0Z1bmRhbWVudGFsbHksIGdlbmVyYXRlZCBUaHJpZnQgY29kZSBvbmx5IG5lZWRzIHRvIGtub3cgaG93IHRvIHJlYWQgYW5kCit3cml0ZSBkYXRhLiBUaGUgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBvZiB0aGUgZGF0YSBhcmUgaXJyZWxldmFudDsgaXQgbWF5IGJlIGEKK3NvY2tldCwgYSBzZWdtZW50IG9mIHNoYXJlZCBtZW1vcnksIG9yIGEgZmlsZSBvbiB0aGUgbG9jYWwgZGlzay4gVGhlIFRocmlmdAordHJhbnNwb3J0IGludGVyZmFjZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHRleHR0dHtvcGVufSBPcGVucyB0aGUgdHJhbnNwb3J0CitcaXRlbSBcdGV4dHR0e2Nsb3NlfSBDbG9zZXMgdGhlIHRyYW5zcG9ydAorXGl0ZW0gXHRleHR0dHtpc09wZW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorXGl0ZW0gXHRleHR0dHtyZWFkfSBSZWFkcyBmcm9tIHRoZSB0cmFuc3BvcnQKK1xpdGVtIFx0ZXh0dHR7d3JpdGV9IFdyaXRlcyB0byB0aGUgdHJhbnNwb3J0CitcaXRlbSBcdGV4dHR0e2ZsdXNofSBGb3JjZXMgYW55IHBlbmRpbmcgd3JpdGVzCitcZW5ke2l0ZW1pemV9CisKK1RoZXJlIGFyZSBhIGZldyBhZGRpdGlvbmFsIG1ldGhvZHMgbm90IGRvY3VtZW50ZWQgaGVyZSB3aGljaCBhcmUgdXNlZCB0byBhaWQKK2luIGJhdGNoaW5nIHJlYWRzIGFuZCBvcHRpb25hbGx5IHNpZ25hbGluZyB0aGUgY29tcGxldGlvbiBvZiBhIHJlYWQgb3IKK3dyaXRlIG9wZXJhdGlvbiBmcm9tIHRoZSBnZW5lcmF0ZWQgY29kZS4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlCitcdGV4dHR0e1RUcmFuc3BvcnR9IGludGVyZmFjZSwgdGhlcmUgaXMgYVxcCitcdGV4dHR0e1RTZXJ2ZXJUcmFuc3BvcnR9IGludGVyZmFjZQordXNlZCB0byBhY2NlcHQgb3IgY3JlYXRlIHByaW1pdGl2ZSB0cmFuc3BvcnQgb2JqZWN0cy4gSXRzIGludGVyZmFjZSBpcyBhcworZm9sbG93czoKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdGV4dHR0e29wZW59IE9wZW5zIHRoZSB0cmFuc3BvcnQKK1xpdGVtIFx0ZXh0dHR7bGlzdGVufSBCZWdpbnMgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucworXGl0ZW0gXHRleHR0dHthY2NlcHR9IFJldHVybnMgYSBuZXcgY2xpZW50IHRyYW5zcG9ydAorXGl0ZW0gXHRleHR0dHtjbG9zZX0gQ2xvc2VzIHRoZSB0cmFuc3BvcnQKK1xlbmR7aXRlbWl6ZX0KKworXHN1YnNlY3Rpb257SW1wbGVtZW50YXRpb259CisKK1RoZSB0cmFuc3BvcnQgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIGZvciBzaW1wbGUgaW1wbGVtZW50YXRpb24gaW4gYW55Citwcm9ncmFtbWluZyBsYW5ndWFnZS4gTmV3IHRyYW5zcG9ydCBtZWNoYW5pc21zIGNhbiBiZSBlYXNpbHkgZGVmaW5lZCBhcyBuZWVkZWQKK2J5IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuCisKK1xzdWJzdWJzZWN0aW9ue1RTb2NrZXR9CisKK1RoZSBcdGV4dHR0e1RTb2NrZXR9IGNsYXNzIGlzIGltcGxlbWVudGVkIGFjcm9zcyBhbGwgdGFyZ2V0IGxhbmd1YWdlcy4gSXQKK3Byb3ZpZGVzIGEgY29tbW9uLCBzaW1wbGUgaW50ZXJmYWNlIHRvIGEgVENQL0lQIHN0cmVhbSBzb2NrZXQuCisKK1xzdWJzdWJzZWN0aW9ue1RGaWxlVHJhbnNwb3J0fQorCitUaGUgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gaXMgYW4gYWJzdHJhY3Rpb24gb2YgYW4gb24tZGlzayBmaWxlIHRvIGEgZGF0YQorc3RyZWFtLiBJdCBjYW4gYmUgdXNlZCB0byB3cml0ZSBvdXQgYSBzZXQgb2YgaW5jb21pbmcgVGhyaWZ0IHJlcXVlc3RzIHRvIGEgZmlsZQorb24gZGlzay4gVGhlIG9uLWRpc2sgZGF0YSBjYW4gdGhlbiBiZSByZXBsYXllZCBmcm9tIHRoZSBsb2csIGVpdGhlciBmb3IKK3Bvc3QtcHJvY2Vzc2luZyBvciBmb3IgcmVwcm9kdWN0aW9uIGFuZC9vciBzaW11bGF0aW9uIG9mIHBhc3QgZXZlbnRzLgorCitcc3Vic3Vic2VjdGlvbntVdGlsaXRpZXN9CisKK1RoZSBUcmFuc3BvcnQgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgZWFzeSBleHRlbnNpb24gdXNpbmcgY29tbW9uCitPT1AgdGVjaG5pcXVlcywgc3VjaCBhcyBjb21wb3NpdGlvbi4gU29tZSBzaW1wbGUgdXRpbGl0aWVzIGluY2x1ZGUgdGhlCitcdGV4dHR0e1RCdWZmZXJlZFRyYW5zcG9ydH0sIHdoaWNoIGJ1ZmZlcnMgdGhlIHdyaXRlcyBhbmQgcmVhZHMgb24gYW4KK3VuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGUgXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fSwgd2hpY2ggdHJhbnNtaXRzIGRhdGEgd2l0aCBmcmFtZQorc2l6ZSBoZWFkZXJzIGZvciBjaHVua2luZyBvcHRpbWl6YXRpb24gb3Igbm9uYmxvY2tpbmcgb3BlcmF0aW9uLCBhbmQgdGhlCitcdGV4dHR0e1RNZW1vcnlCdWZmZXJ9LCB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGluZyBkaXJlY3RseSBmcm9tIHRoZSBoZWFwCitvciBzdGFjayBtZW1vcnkgb3duZWQgYnkgdGhlIHByb2Nlc3MuCisKK1xzZWN0aW9ue1Byb3RvY29sfQorCitBIHNlY29uZCBtYWpvciBhYnN0cmFjdGlvbiBpbiBUaHJpZnQgaXMgdGhlIHNlcGFyYXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgZnJvbQordHJhbnNwb3J0IHJlcHJlc2VudGF0aW9uLiBUaHJpZnQgZW5mb3JjZXMgYSBjZXJ0YWluIG1lc3NhZ2luZyBzdHJ1Y3R1cmUgd2hlbgordHJhbnNwb3J0aW5nIGRhdGEsIGJ1dCBpdCBpcyBhZ25vc3RpYyB0byB0aGUgcHJvdG9jb2wgZW5jb2RpbmcgaW4gdXNlLiBUaGF0IGlzLAoraXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgZGF0YSBpcyBlbmNvZGVkIGFzIFhNTCwgaHVtYW4tcmVhZGFibGUgQVNDSUksIG9yIGEKK2RlbnNlIGJpbmFyeSBmb3JtYXQgYXMgbG9uZyBhcyB0aGUgZGF0YSBzdXBwb3J0cyBhIGZpeGVkIHNldCBvZiBvcGVyYXRpb25zCit0aGF0IGFsbG93IGl0IHRvIGJlIGRldGVybWluaXN0aWNhbGx5IHJlYWQgYW5kIHdyaXR0ZW4gYnkgZ2VuZXJhdGVkIGNvZGUuCisKK1xzdWJzZWN0aW9ue0ludGVyZmFjZX0KKworVGhlIFRocmlmdCBQcm90b2NvbCBpbnRlcmZhY2UgaXMgdmVyeSBzdHJhaWdodGZvcndhcmQuIEl0IGZ1bmRhbWVudGFsbHkKK3N1cHBvcnRzIHR3byB0aGluZ3M6IDEpIGJpZGlyZWN0aW9uYWwgc2VxdWVuY2VkIG1lc3NhZ2luZywgYW5kCisyKSBlbmNvZGluZyBvZiBiYXNlIHR5cGVzLCBjb250YWluZXJzLCBhbmQgc3RydWN0cy4KKworXGJlZ2lue3ZlcmJhdGltfQord3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxKQord3JpdGVNZXNzYWdlRW5kKCkKK3dyaXRlU3RydWN0QmVnaW4obmFtZSkKK3dyaXRlU3RydWN0RW5kKCkKK3dyaXRlRmllbGRCZWdpbihuYW1lLCB0eXBlLCBpZCkKK3dyaXRlRmllbGRFbmQoKQord3JpdGVGaWVsZFN0b3AoKQord3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCit3cml0ZU1hcEVuZCgpCit3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKK3dyaXRlTGlzdEVuZCgpCit3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQord3JpdGVTZXRFbmQoKQord3JpdGVCb29sKGJvb2wpCit3cml0ZUJ5dGUoYnl0ZSkKK3dyaXRlSTE2KGkxNikKK3dyaXRlSTMyKGkzMikKK3dyaXRlSTY0KGk2NCkKK3dyaXRlRG91YmxlKGRvdWJsZSkKK3dyaXRlU3RyaW5nKHN0cmluZykKKworbmFtZSwgdHlwZSwgc2VxID0gcmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkTWVzc2FnZUVuZCgpCituYW1lID0gICAgICAgICAgICByZWFkU3RydWN0QmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdEVuZCgpCituYW1lLCB0eXBlLCBpZCA9ICByZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkRmllbGRFbmQoKQoraywgdiwgc2l6ZSA9ICAgICAgcmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgICAgICAgIHJlYWRNYXBFbmQoKQorZXR5cGUsIHNpemUgPSAgICAgcmVhZExpc3RCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkTGlzdEVuZCgpCitldHlwZSwgc2l6ZSA9ICAgICByZWFkU2V0QmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZFNldEVuZCgpCitib29sID0gICAgICAgICAgICByZWFkQm9vbCgpCitieXRlID0gICAgICAgICAgICByZWFkQnl0ZSgpCitpMTYgPSAgICAgICAgICAgICByZWFkSTE2KCkKK2kzMiA9ICAgICAgICAgICAgIHJlYWRJMzIoKQoraTY0ID0gICAgICAgICAgICAgcmVhZEk2NCgpCitkb3VibGUgPSAgICAgICAgICByZWFkRG91YmxlKCkKK3N0cmluZyA9ICAgICAgICAgIHJlYWRTdHJpbmcoKQorXGVuZHt2ZXJiYXRpbX0KKworTm90ZSB0aGF0IGV2ZXJ5IFx0ZXh0dHR7d3JpdGV9IGZ1bmN0aW9uIGhhcyBleGFjdGx5IG9uZSBcdGV4dHR0e3JlYWR9IGNvdW50ZXJwYXJ0LCB3aXRoCit0aGUgZXhjZXB0aW9uIG9mIFx0ZXh0dHR7d3JpdGVGaWVsZFN0b3AoKX0uIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhvZAordGhhdCBzaWduYWxzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuIFRoZSBwcm9jZWR1cmUgZm9yIHJlYWRpbmcgYSBzdHJ1Y3QgaXMgdG8KK1x0ZXh0dHR7cmVhZEZpZWxkQmVnaW4oKX0gdW50aWwgdGhlIHN0b3AgZmllbGQgaXMgZW5jb3VudGVyZWQsIGFuZCB0aGVuIHRvCitcdGV4dHR0e3JlYWRTdHJ1Y3RFbmQoKX0uICBUaGUKK2dlbmVyYXRlZCBjb2RlIHJlbGllcyB1cG9uIHRoaXMgY2FsbCBzZXF1ZW5jZSB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIHdyaXR0ZW4gYnkKK2EgcHJvdG9jb2wgZW5jb2RlciBjYW4gYmUgcmVhZCBieSBhIG1hdGNoaW5nIHByb3RvY29sIGRlY29kZXIuIEZ1cnRoZXIgbm90ZQordGhhdCB0aGlzIHNldCBvZiBmdW5jdGlvbnMgaXMgYnkgZGVzaWduIG1vcmUgcm9idXN0IHRoYW4gbmVjZXNzYXJ5LgorRm9yIGV4YW1wbGUsIFx0ZXh0dHR7d3JpdGVTdHJ1Y3RFbmQoKX0gaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYXMgdGhlIGVuZCBvZgorYSBzdHJ1Y3QgbWF5IGJlIGltcGxpZWQgYnkgdGhlIHN0b3AgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgZm9yCit2ZXJib3NlIHByb3RvY29scyBpbiB3aGljaCBpdCBpcyBjbGVhbmVyIHRvIHNlcGFyYXRlIHRoZXNlIGNhbGxzIChlLmcuIGEgY2xvc2luZworXHRleHR0dHs8L3N0cnVjdD59IHRhZyBpbiBYTUwpLgorCitcc3Vic2VjdGlvbntTdHJ1Y3R1cmV9CisKK1RocmlmdCBzdHJ1Y3R1cmVzIGFyZSBkZXNpZ25lZCB0byBzdXBwb3J0IGVuY29kaW5nIGludG8gYSBzdHJlYW1pbmcKK3Byb3RvY29sLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG5ldmVyIG5lZWQgdG8gZnJhbWUgb3IgY29tcHV0ZSB0aGUKK2VudGlyZSBkYXRhIGxlbmd0aCBvZiBhIHN0cnVjdHVyZSBwcmlvciB0byBlbmNvZGluZyBpdC4gVGhpcyBpcyBjcml0aWNhbCB0bworcGVyZm9ybWFuY2UgaW4gbWFueSBzY2VuYXJpb3MuIENvbnNpZGVyIGEgbG9uZyBsaXN0IG9mIHJlbGF0aXZlbHkgbGFyZ2UKK3N0cmluZ3MuIElmIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgcmVxdWlyZWQgcmVhZGluZyBvciB3cml0aW5nIGEgbGlzdCB0byBiZSBhbgorYXRvbWljIG9wZXJhdGlvbiwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBwZXJmb3JtIGEgbGluZWFyIHBhc3Mgb3ZlciB0aGUKK2VudGlyZSBsaXN0IGJlZm9yZSBlbmNvZGluZyBhbnkgZGF0YS4gSG93ZXZlciwgaWYgdGhlIGxpc3QgY2FuIGJlIHdyaXR0ZW4KK2FzIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQsIHRoZSBjb3JyZXNwb25kaW5nIHJlYWQgbWF5IGJlZ2luIGluIHBhcmFsbGVsLAordGhlb3JldGljYWxseSBvZmZlcmluZyBhbiBlbmQtdG8tZW5kIHNwZWVkdXAgb2YgJChrTiAtIEMpJCwgd2hlcmUgJE4kIGlzIHRoZSBzaXplCitvZiB0aGUgbGlzdCwgJGskIHRoZSBjb3N0IGZhY3RvciBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgYSBzaW5nbGUKK2VsZW1lbnQsIGFuZCAkQyQgaXMgZml4ZWQgb2Zmc2V0IGZvciB0aGUgZGVsYXkgYmV0d2VlbiBkYXRhIGJlaW5nIHdyaXR0ZW4KK2FuZCBiZWNvbWluZyBhdmFpbGFibGUgdG8gcmVhZC4KKworU2ltaWxhcmx5LCBzdHJ1Y3RzIGRvIG5vdCBlbmNvZGUgdGhlaXIgZGF0YSBsZW5ndGhzIGEgcHJpb3JpLiBJbnN0ZWFkLCB0aGV5IGFyZQorZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGZpZWxkcywgd2l0aCBlYWNoIGZpZWxkIGhhdmluZyBhIHR5cGUgc3BlY2lmaWVyIGFuZCBhCit1bmlxdWUgZmllbGQgaWRlbnRpZmllci4gTm90ZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgdHlwZSBzcGVjaWZpZXJzIGFsbG93cwordGhlIHByb3RvY29sIHRvIGJlIHNhZmVseSBwYXJzZWQgYW5kIGRlY29kZWQgd2l0aG91dCBhbnkgZ2VuZXJhdGVkIGNvZGUKK29yIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgSURMIGZpbGUuIFN0cnVjdHMgYXJlIHRlcm1pbmF0ZWQgYnkgYSBmaWVsZCBoZWFkZXIKK3dpdGggYSBzcGVjaWFsIFx0ZXh0dHR7U1RPUH0gdHlwZS4gQmVjYXVzZSBhbGwgdGhlIGJhc2ljIHR5cGVzIGNhbiBiZSByZWFkCitkZXRlcm1pbmlzdGljYWxseSwgYWxsIHN0cnVjdHMgKGV2ZW4gdGhvc2UgY29udGFpbmluZyBvdGhlciBzdHJ1Y3RzKSBjYW4gYmUKK3JlYWQgZGV0ZXJtaW5pc3RpY2FsbHkuIFRoZSBUaHJpZnQgcHJvdG9jb2wgaXMgc2VsZi1kZWxpbWl0aW5nIHdpdGhvdXQgYW55CitmcmFtaW5nIGFuZCByZWdhcmRsZXNzIG9mIHRoZSBlbmNvZGluZyBmb3JtYXQuCisKK0luIHNpdHVhdGlvbnMgd2hlcmUgc3RyZWFtaW5nIGlzIHVubmVjZXNzYXJ5IG9yIGZyYW1pbmcgaXMgYWR2YW50YWdlb3VzLCBpdAorY2FuIGJlIHZlcnkgc2ltcGx5IGFkZGVkIGludG8gdGhlIHRyYW5zcG9ydCBsYXllciwgdXNpbmcgdGhlCitcdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9IGFic3RyYWN0aW9uLgorCitcc3Vic2VjdGlvbntJbXBsZW1lbnRhdGlvbn0KKworRmFjZWJvb2sgaGFzIGltcGxlbWVudGVkIGFuZCBkZXBsb3llZCBhIHNwYWNlLWVmZmljaWVudCBiaW5hcnkgcHJvdG9jb2wgd2hpY2gKK2lzIHVzZWQgYnkgbW9zdCBiYWNrZW5kIHNlcnZpY2VzLiBFc3NlbnRpYWxseSwgaXQgd3JpdGVzIGFsbCBkYXRhCitpbiBhIGZsYXQgYmluYXJ5IGZvcm1hdC4gSW50ZWdlciB0eXBlcyBhcmUgY29udmVydGVkIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciwKK3N0cmluZ3MgYXJlIHByZXBlbmRlZCB3aXRoIHRoZWlyIGJ5dGUgbGVuZ3RoLCBhbmQgYWxsIG1lc3NhZ2UgYW5kIGZpZWxkIGhlYWRlcnMKK2FyZSB3cml0dGVuIHVzaW5nIHRoZSBwcmltaXRpdmUgaW50ZWdlciBzZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMuIFN0cmluZyBuYW1lcworZm9yIGZpZWxkcyBhcmUgb21pdHRlZCAtIHdoZW4gdXNpbmcgZ2VuZXJhdGVkIGNvZGUsIGZpZWxkIGlkZW50aWZpZXJzIGFyZQorc3VmZmljaWVudC4KKworV2UgZGVjaWRlZCBhZ2FpbnN0IHNvbWUgZXh0cmVtZSBzdG9yYWdlIG9wdGltaXphdGlvbnMgKGkuZS4gcGFja2luZworc21hbGwgaW50ZWdlcnMgaW50byBBU0NJSSBvciB1c2luZyBhIDctYml0IGNvbnRpbnVhdGlvbiBmb3JtYXQpIGZvciB0aGUgc2FrZQorb2Ygc2ltcGxpY2l0eSBhbmQgY2xhcml0eSBpbiB0aGUgY29kZS4gVGhlc2UgYWx0ZXJhdGlvbnMgY2FuIGVhc2lseSBiZSBtYWRlCitpZiBhbmQgd2hlbiB3ZSBlbmNvdW50ZXIgYSBwZXJmb3JtYW5jZS1jcml0aWNhbCB1c2UgY2FzZSB0aGF0IGRlbWFuZHMgdGhlbS4KKworXHNlY3Rpb257VmVyc2lvbmluZ30KKworVGhyaWZ0IGlzIHJvYnVzdCBpbiB0aGUgZmFjZSBvZiB2ZXJzaW9uaW5nIGFuZCBkYXRhIGRlZmluaXRpb24gY2hhbmdlcy4gVGhpcworaXMgY3JpdGljYWwgdG8gZW5hYmxlIHN0YWdlZCByb2xsb3V0cyBvZiBjaGFuZ2VzIHRvIGRlcGxveWVkIHNlcnZpY2VzLiBUaGUKK3N5c3RlbSBtdXN0IGJlIGFibGUgdG8gc3VwcG9ydCByZWFkaW5nIG9mIG9sZCBkYXRhIGZyb20gbG9nIGZpbGVzLCBhcyB3ZWxsIGFzCityZXF1ZXN0cyBmcm9tIG91dC1vZi1kYXRlIGNsaWVudHMgdG8gbmV3IHNlcnZlcnMsIGFuZCB2aWNlIHZlcnNhLgorCitcc3Vic2VjdGlvbntGaWVsZCBJZGVudGlmaWVyc30KKworVmVyc2lvbmluZyBpbiBUaHJpZnQgaXMgaW1wbGVtZW50ZWQgdmlhIGZpZWxkIGlkZW50aWZpZXJzLiBUaGUgZmllbGQgaGVhZGVyCitmb3IgZXZlcnkgbWVtYmVyIG9mIGEgc3RydWN0IGluIFRocmlmdCBpcyBlbmNvZGVkIHdpdGggYSB1bmlxdWUgZmllbGQKK2lkZW50aWZpZXIuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGlzIGZpZWxkIGlkZW50aWZpZXIgYW5kIGl0cyB0eXBlIHNwZWNpZmllcgoraXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgZmllbGQuIFRoZSBUaHJpZnQgZGVmaW5pdGlvbiBsYW5ndWFnZQorc3VwcG9ydHMgYXV0b21hdGljIGFzc2lnbm1lbnQgb2YgZmllbGQgaWRlbnRpZmllcnMsIGJ1dCBpdCBpcyBnb29kCitwcm9ncmFtbWluZyBwcmFjdGljZSB0byBhbHdheXMgZXhwbGljaXRseSBzcGVjaWZ5IGZpZWxkIGlkZW50aWZpZXJzLgorSWRlbnRpZmllcnMgYXJlIHNwZWNpZmllZCBhcyBmb2xsb3dzOgorCitcYmVnaW57dmVyYmF0aW19CitzdHJ1Y3QgRXhhbXBsZSB7CisgIDE6aTMyIG51bWJlcj0xMCwKKyAgMjppNjQgYmlnTnVtYmVyLAorICAzOmRvdWJsZSBkZWNpbWFscywKKyAgNDpzdHJpbmcgbmFtZT0idGhyaWZ0eSIKK31cZW5ke3ZlcmJhdGltfQorCitUbyBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBtYW51YWxseSBhbmQgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZGVudGlmaWVycywKK2ZpZWxkcyB3aXRoIGlkZW50aWZpZXJzIG9taXR0ZWQgYXJlIGFzc2lnbmVkIGlkZW50aWZpZXJzCitkZWNyZW1lbnRpbmcgZnJvbSAtMSwgYW5kIHRoZSBsYW5ndWFnZSBvbmx5IHN1cHBvcnRzIHRoZSBtYW51YWwgYXNzaWdubWVudCBvZgorcG9zaXRpdmUgaWRlbnRpZmllcnMuCisKK1doZW4gZGF0YSBpcyBiZWluZyBkZXNlcmlhbGl6ZWQsIHRoZSBnZW5lcmF0ZWQgY29kZSBjYW4gdXNlIHRoZXNlIGlkZW50aWZpZXJzCit0byBwcm9wZXJseSBpZGVudGlmeSB0aGUgZmllbGQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGFsaWducyB3aXRoIGEgZmllbGQgaW4KK2l0cyBkZWZpbml0aW9uIGZpbGUuIElmIGEgZmllbGQgaWRlbnRpZmllciBpcyBub3QgcmVjb2duaXplZCwgdGhlIGdlbmVyYXRlZAorY29kZSBjYW4gdXNlIHRoZSB0eXBlIHNwZWNpZmllciB0byBza2lwIHRoZSB1bmtub3duIGZpZWxkIHdpdGhvdXQgYW55IGVycm9yLgorQWdhaW4sIHRoaXMgaXMgcG9zc2libGUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYWxsIGRhdGF0eXBlcyBhcmUgc2VsZgorZGVsaW1pdGluZy4KKworRmllbGQgaWRlbnRpZmllcnMgY2FuIChhbmQgc2hvdWxkKSBhbHNvIGJlIHNwZWNpZmllZCBpbiBmdW5jdGlvbiBhcmd1bWVudAorbGlzdHMuIEluIGZhY3QsIGFyZ3VtZW50IGxpc3RzIGFyZSBub3Qgb25seSByZXByZXNlbnRlZCBhcyBzdHJ1Y3RzIG9uIHRoZQorYmFja2VuZCwgYnV0IGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGNvZGUgaW4gdGhlIGNvbXBpbGVyIGZyb250ZW5kLiBUaGlzCithbGxvd3MgZm9yIHZlcnNpb24tc2FmZSBtb2RpZmljYXRpb24gb2YgbWV0aG9kIHBhcmFtZXRlcnMKKworXGJlZ2lue3ZlcmJhdGltfQorc2VydmljZSBTdHJpbmdDYWNoZSB7CisgIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAorICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCisgIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKK30KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBzeW50YXggZm9yIHNwZWNpZnlpbmcgZmllbGQgaWRlbnRpZmllcnMgd2FzIGNob3NlbiB0byBlY2hvIHRoZWlyIHN0cnVjdHVyZS4KK1N0cnVjdHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBkaWN0aW9uYXJ5IHdoZXJlIHRoZSBpZGVudGlmaWVycyBhcmUga2V5cywgYW5kCit0aGUgdmFsdWVzIGFyZSBzdHJvbmdseS10eXBlZCBuYW1lZCBmaWVsZHMuCisKK0ZpZWxkIGlkZW50aWZpZXJzIGludGVybmFsbHkgdXNlIHRoZSBcdGV4dHR0e2kxNn0gVGhyaWZ0IHR5cGUuIE5vdGUsIGhvd2V2ZXIsCit0aGF0IHRoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb24gbWF5IGVuY29kZSBpZGVudGlmaWVycyBpbiBhbnkgZm9ybWF0LgorCitcc3Vic2VjdGlvbntJc3NldH0KKworV2hlbiBhbiB1bmV4cGVjdGVkIGZpZWxkIGlzIGVuY291bnRlcmVkLCBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgYW5kCitkaXNjYXJkZWQuIFdoZW4gYW4gZXhwZWN0ZWQgZmllbGQgaXMgbm90IGZvdW5kLCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IHRvCitzaWduYWwgdG8gdGhlIGRldmVsb3BlciB0aGF0IGl0IHdhcyBub3QgcHJlc2VudC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KK2lubmVyIFx0ZXh0dHR7aXNzZXR9IHN0cnVjdHVyZSBpbnNpZGUgdGhlIGRlZmluZWQgb2JqZWN0cy4gKElzc2V0IGZ1bmN0aW9uYWxpdHkKK2lzIGltcGxpY2l0IHdpdGggYSBcdGV4dHR0e251bGx9IHZhbHVlIGluIFBIUCwgXHRleHR0dHtOb25lfSBpbiBQeXRob24KK2FuZCBcdGV4dHR0e25pbH0gaW4gUnVieS4pIEVzc2VudGlhbGx5LAordGhlIGlubmVyIFx0ZXh0dHR7aXNzZXR9IG9iamVjdCBvZiBlYWNoIFRocmlmdCBzdHJ1Y3QgY29udGFpbnMgYSBib29sZWFuIHZhbHVlCitmb3IgZWFjaCBmaWVsZCB3aGljaCBkZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoYXQgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUKK3N0cnVjdC4gV2hlbiBhIHJlYWRlciByZWNlaXZlcyBhIHN0cnVjdCwgaXQgc2hvdWxkIGNoZWNrIGZvciBhIGZpZWxkIGJlaW5nIHNldAorYmVmb3JlIG9wZXJhdGluZyBkaXJlY3RseSBvbiBpdC4KKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgRXhhbXBsZSB7CisgcHVibGljOgorICBFeGFtcGxlKCkgOgorICAgIG51bWJlcigxMCksCisgICAgYmlnTnVtYmVyKDApLAorICAgIGRlY2ltYWxzKDApLAorICAgIG5hbWUoInRocmlmdHkiKSB7fQorCisgIGludDMyX3QgbnVtYmVyOworICBpbnQ2NF90IGJpZ051bWJlcjsKKyAgZG91YmxlIGRlY2ltYWxzOworICBzdGQ6OnN0cmluZyBuYW1lOworCisgIHN0cnVjdCBfX2lzc2V0IHsKKyAgICBfX2lzc2V0KCkgOgorICAgICAgbnVtYmVyKGZhbHNlKSwKKyAgICAgIGJpZ051bWJlcihmYWxzZSksCisgICAgICBkZWNpbWFscyhmYWxzZSksCisgICAgICBuYW1lKGZhbHNlKSB7fQorICAgIGJvb2wgbnVtYmVyOworICAgIGJvb2wgYmlnTnVtYmVyOworICAgIGJvb2wgZGVjaW1hbHM7CisgICAgYm9vbCBuYW1lOworICB9IF9faXNzZXQ7CisuLi4KK30KK1xlbmR7dmVyYmF0aW19CisKK1xzdWJzZWN0aW9ue0Nhc2UgQW5hbHlzaXN9CisKK1RoZXJlIGFyZSBmb3VyIGNhc2VzIGluIHdoaWNoIHZlcnNpb24gbWlzbWF0Y2hlcyBtYXkgb2NjdXIuCisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSBcdGV4dGl0e0FkZGVkIGZpZWxkLCBvbGQgY2xpZW50LCBuZXcgc2VydmVyLn0gSW4gdGhpcyBjYXNlLCB0aGUgb2xkCitjbGllbnQgZG9lcyBub3Qgc2VuZCB0aGUgbmV3IGZpZWxkLiBUaGUgbmV3IHNlcnZlciByZWNvZ25pemVzIHRoYXQgdGhlIGZpZWxkCitpcyBub3Qgc2V0LCBhbmQgaW1wbGVtZW50cyBkZWZhdWx0IGJlaGF2aW9yIGZvciBvdXQtb2YtZGF0ZSByZXF1ZXN0cy4KK1xpdGVtIFx0ZXh0aXR7UmVtb3ZlZCBmaWVsZCwgb2xkIGNsaWVudCwgbmV3IHNlcnZlci59IEluIHRoaXMgY2FzZSwgdGhlIG9sZAorY2xpZW50IHNlbmRzIHRoZSByZW1vdmVkIGZpZWxkLiBUaGUgbmV3IHNlcnZlciBzaW1wbHkgaWdub3JlcyBpdC4KK1xpdGVtIFx0ZXh0aXR7QWRkZWQgZmllbGQsIG5ldyBjbGllbnQsIG9sZCBzZXJ2ZXIufSBUaGUgbmV3IGNsaWVudCBzZW5kcyBhCitmaWVsZCB0aGF0IHRoZSBvbGQgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZS4gVGhlIG9sZCBzZXJ2ZXIgc2ltcGx5IGlnbm9yZXMKK2l0IGFuZCBwcm9jZXNzZXMgYXMgbm9ybWFsLgorXGl0ZW0gXHRleHRpdHtSZW1vdmVkIGZpZWxkLCBuZXcgY2xpZW50LCBvbGQgc2VydmVyLn0gVGhpcyBpcyB0aGUgbW9zdAorZGFuZ2Vyb3VzIGNhc2UsIGFzIHRoZSBvbGQgc2VydmVyIGlzIHVubGlrZWx5IHRvIGhhdmUgc3VpdGFibGUgZGVmYXVsdAorYmVoYXZpb3IgaW1wbGVtZW50ZWQgZm9yIHRoZSBtaXNzaW5nIGZpZWxkLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGluIHRoaXMKK3NpdHVhdGlvbiB0aGUgbmV3IHNlcnZlciBiZSByb2xsZWQgb3V0IHByaW9yIHRvIHRoZSBuZXcgY2xpZW50cy4KK1xlbmR7ZW51bWVyYXRlfQorCitcc3Vic2VjdGlvbntQcm90b2NvbC9UcmFuc3BvcnQgVmVyc2lvbmluZ30KK1RoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb25zIGFyZSBhbHNvIGRlc2lnbmVkIHRvIGdpdmUgcHJvdG9jb2wKK2ltcGxlbWVudGF0aW9ucyB0aGUgZnJlZWRvbSB0byB2ZXJzaW9uIHRoZW1zZWx2ZXMgaW4gd2hhdGV2ZXIgbWFubmVyIHRoZXkKK3NlZSBmaXQuIFNwZWNpZmljYWxseSwgYW55IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gc2VuZCB3aGF0ZXZlcgoraXQgbGlrZXMgaW4gdGhlIFx0ZXh0dHR7d3JpdGVNZXNzYWdlQmVnaW4oKX0gY2FsbC4gSXQgaXMgZW50aXJlbHkgdXAgdG8gdGhlCitpbXBsZW1lbnRvciBob3cgdG8gaGFuZGxlIHZlcnNpb25pbmcgYXQgdGhlIHByb3RvY29sIGxldmVsLiBUaGUga2V5IHBvaW50IGlzCit0aGF0IHByb3RvY29sIGVuY29kaW5nIGNoYW5nZXMgYXJlIHNhZmVseSBpc29sYXRlZCBmcm9tIGludGVyZmFjZSBkZWZpbml0aW9uCit2ZXJzaW9uIGNoYW5nZXMuCisKK05vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBpcyB0cnVlIG9mIHRoZSBcdGV4dHR0e1RUcmFuc3BvcnR9IGludGVyZmFjZS4gRm9yCitleGFtcGxlLCBpZiB3ZSB3aXNoZWQgdG8gYWRkIHNvbWUgbmV3IGNoZWNrc3VtbWluZyBvciBlcnJvciBkZXRlY3Rpb24gdG8gdGhlCitcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSwgd2UgY291bGQgc2ltcGx5IGFkZCBhIHZlcnNpb24gaGVhZGVyIGludG8gdGhlCitkYXRhIGl0IHdyaXRlcyB0byB0aGUgZmlsZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgd291bGQgc3RpbGwgYWNjZXB0IG9sZAorbG9nIGZpbGVzIHdpdGhvdXQgdGhlIGdpdmVuIGhlYWRlci4KKworXHNlY3Rpb257UlBDIEltcGxlbWVudGF0aW9ufQorCitcc3Vic2VjdGlvbntUUHJvY2Vzc29yfQorCitUaGUgbGFzdCBjb3JlIGludGVyZmFjZSBpbiB0aGUgVGhyaWZ0IGRlc2lnbiBpcyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSwKK3BlcmhhcHMgdGhlIG1vc3Qgc2ltcGxlIG9mIHRoZSBjb25zdHJ1Y3RzLiBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ludGVyZmFjZSBUUHJvY2Vzc29yIHsKKyAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkKKyAgICB0aHJvd3MgVEV4Y2VwdGlvbgorfQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGtleSBkZXNpZ24gaWRlYSBoZXJlIGlzIHRoYXQgdGhlIGNvbXBsZXggc3lzdGVtcyB3ZSBidWlsZCBjYW4gZnVuZGFtZW50YWxseQorYmUgYnJva2VuIGRvd24gaW50byBhZ2VudHMgb3Igc2VydmljZXMgdGhhdCBvcGVyYXRlIG9uIGlucHV0cyBhbmQgb3V0cHV0cy4gSW4KK21vc3QgY2FzZXMsIHRoZXJlIGlzIGFjdHVhbGx5IGp1c3Qgb25lIGlucHV0IGFuZCBvdXRwdXQgKGFuIFJQQyBjbGllbnQpIHRoYXQKK25lZWRzIGhhbmRsaW5nLgorCitcc3Vic2VjdGlvbntHZW5lcmF0ZWQgQ29kZX0KKworV2hlbiBhIHNlcnZpY2UgaXMgZGVmaW5lZCwgd2UgZ2VuZXJhdGUgYQorXHRleHR0dHtUUHJvY2Vzc29yfSBpbnN0YW5jZSBjYXBhYmxlIG9mIGhhbmRsaW5nIFJQQyByZXF1ZXN0cyB0byB0aGF0IHNlcnZpY2UsCit1c2luZyBhIGZldyBoZWxwZXJzLiBUaGUgZnVuZGFtZW50YWwgc3RydWN0dXJlIChpbGx1c3RyYXRlZCBpbiBwc2V1ZG8tQysrKSBpcworYXMgZm9sbG93czoKKworXGJlZ2lue3ZlcmJhdGltfQorU2VydmljZS50aHJpZnQKKyA9PiBTZXJ2aWNlLmNwcAorICAgICBpbnRlcmZhY2UgU2VydmljZUlmCisgICAgIGNsYXNzIFNlcnZpY2VDbGllbnQgOiB2aXJ0dWFsIFNlcnZpY2VJZgorICAgICAgIFRQcm90b2NvbCBpbgorICAgICAgIFRQcm90b2NvbCBvdXQKKyAgICAgY2xhc3MgU2VydmljZVByb2Nlc3NvciA6IFRQcm9jZXNzb3IKKyAgICAgICBTZXJ2aWNlSWYgaGFuZGxlcgorCitTZXJ2aWNlSGFuZGxlci5jcHAKKyBjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IHZpcnR1YWwgU2VydmljZUlmCisKK1RTZXJ2ZXIuY3BwCisgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdGZhY3RvcnksCisgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHBmYWN0b3J5KQorIHNlcnZlKCkKK1xlbmR7dmVyYmF0aW19CisKK0Zyb20gdGhlIFRocmlmdCBkZWZpbml0aW9uIGZpbGUsIHdlIGdlbmVyYXRlIHRoZSB2aXJ0dWFsIHNlcnZpY2UgaW50ZXJmYWNlLgorQSBjbGllbnQgY2xhc3MgaXMgZ2VuZXJhdGVkLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgYW5kCit1c2VzIHR3byBcdGV4dHR0e1RQcm90b2NvbH0gaW5zdGFuY2VzIHRvIHBlcmZvcm0gdGhlIEkvTyBvcGVyYXRpb25zLiBUaGUKK2dlbmVyYXRlZCBwcm9jZXNzb3IgaW1wbGVtZW50cyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBpbnRlcmZhY2UuIFRoZSBnZW5lcmF0ZWQKK2NvZGUgaGFzIGFsbCB0aGUgbG9naWMgdG8gaGFuZGxlIFJQQyBpbnZvY2F0aW9ucyB2aWEgdGhlIFx0ZXh0dHR7cHJvY2VzcygpfQorY2FsbCwgYW5kIHRha2VzIGFzIGEgcGFyYW1ldGVyIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGludGVyZmFjZSwgYXMKK2ltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuCisKK1RoZSB1c2VyIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgaW4gc2VwYXJhdGUsCitub24tZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLgorCitcc3Vic2VjdGlvbntUU2VydmVyfQorCitGaW5hbGx5LCB0aGUgVGhyaWZ0IGNvcmUgbGlicmFyaWVzIHByb3ZpZGUgYSBcdGV4dHR0e1RTZXJ2ZXJ9IGFic3RyYWN0aW9uLgorVGhlIFx0ZXh0dHR7VFNlcnZlcn0gb2JqZWN0IGdlbmVyYWxseSB3b3JrcyBhcyBmb2xsb3dzLgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFVzZSB0aGUgXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSB0byBnZXQgYSBcdGV4dHR0e1RUcmFuc3BvcnR9CitcaXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFRyYW5zcG9ydEZhY3Rvcnl9IHRvIG9wdGlvbmFsbHkgY29udmVydCB0aGUgcHJpbWl0aXZlCit0cmFuc3BvcnQgaW50byBhIHN1aXRhYmxlIGFwcGxpY2F0aW9uIHRyYW5zcG9ydCAodHlwaWNhbGx5IHRoZQorXHRleHR0dHtUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5fSBpcyB1c2VkIGhlcmUpCitcaXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFByb3RvY29sRmFjdG9yeX0gdG8gY3JlYXRlIGFuIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wKK2ZvciB0aGUgXHRleHR0dHtUVHJhbnNwb3J0fQorXGl0ZW0gSW52b2tlIHRoZSBcdGV4dHR0e3Byb2Nlc3MoKX0gbWV0aG9kIG9mIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdAorXGVuZHtpdGVtaXplfQorCitUaGUgbGF5ZXJzIGFyZSBhcHByb3ByaWF0ZWx5IHNlcGFyYXRlZCBzdWNoIHRoYXQgdGhlIHNlcnZlciBjb2RlIG5lZWRzIHRvIGtub3cKK25vdGhpbmcgYWJvdXQgYW55IG9mIHRoZSB0cmFuc3BvcnRzLCBlbmNvZGluZ3MsIG9yIGFwcGxpY2F0aW9ucyBpbiBwbGF5LiBUaGUKK3NlcnZlciBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGFyb3VuZCBjb25uZWN0aW9uIGhhbmRsaW5nLCB0aHJlYWRpbmcsIGV0Yy4KK3doaWxlIHRoZSBwcm9jZXNzb3IgZGVhbHMgd2l0aCBSUEMuIFRoZSBvbmx5IGNvZGUgd3JpdHRlbiBieSB0aGUgYXBwbGljYXRpb24KK2RldmVsb3BlciBsaXZlcyBpbiB0aGUgZGVmaW5pdGlvbmFsIFRocmlmdCBmaWxlIGFuZCB0aGUgaW50ZXJmYWNlCitpbXBsZW1lbnRhdGlvbi4KKworRmFjZWJvb2sgaGFzIGRlcGxveWVkIG11bHRpcGxlIFx0ZXh0dHR7VFNlcnZlcn0gaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmcKK3RoZSBzaW5nbGUtdGhyZWFkZWQgXHRleHR0dHtUU2ltcGxlU2VydmVyfSwgdGhyZWFkLXBlci1jb25uZWN0aW9uCitcdGV4dHR0e1RUaHJlYWRlZFNlcnZlcn0sIGFuZCB0aHJlYWQtcG9vbGluZyBcdGV4dHR0e1RUaHJlYWRQb29sU2VydmVyfS4KKworVGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW50ZXJmYWNlIGlzIHZlcnkgZ2VuZXJhbCBieSBkZXNpZ24uIFRoZXJlIGlzIG5vCityZXF1aXJlbWVudCB0aGF0IGEgXHRleHR0dHtUU2VydmVyfSB0YWtlIGEgZ2VuZXJhdGVkIFx0ZXh0dHR7VFByb2Nlc3Nvcn0KK29iamVjdC4gVGhyaWZ0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGVhc2lseSB3cml0ZSBhbnkgdHlwZSBvZgorc2VydmVyIHRoYXQgb3BlcmF0ZXMgb24gXHRleHR0dHtUUHJvdG9jb2x9IG9iamVjdHMgKGZvciBpbnN0YW5jZSwgYSBzZXJ2ZXIKK2NvdWxkIHNpbXBseSBzdHJlYW0gYSBjZXJ0YWluIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgYW55IGFjdHVhbCBSUEMgbWV0aG9kCitpbnZvY2F0aW9uKS4KKworXHNlY3Rpb257SW1wbGVtZW50YXRpb24gRGV0YWlsc30KK1xzdWJzZWN0aW9ue1RhcmdldCBMYW5ndWFnZXN9CitUaHJpZnQgY3VycmVudGx5IHN1cHBvcnRzIGZpdmUgdGFyZ2V0IGxhbmd1YWdlczogQysrLCBKYXZhLCBQeXRob24sIFJ1YnksIGFuZAorUEhQLiBBdCBGYWNlYm9vaywgd2UgaGF2ZSBkZXBsb3llZCBzZXJ2ZXJzIHByZWRvbWluYW50bHkgaW4gQysrLCBKYXZhLCBhbmQKK1B5dGhvbi4gVGhyaWZ0IHNlcnZpY2VzIGltcGxlbWVudGVkIGluIFBIUCBoYXZlIGFsc28gYmVlbiBlbWJlZGRlZCBpbnRvIHRoZQorQXBhY2hlIHdlYiBzZXJ2ZXIsIHByb3ZpZGluZyB0cmFuc3BhcmVudCBiYWNrZW5kIGFjY2VzcyB0byBtYW55IG9mIG91cgorZnJvbnRlbmQgY29uc3RydWN0cyB1c2luZyBhIFx0ZXh0dHR7VEh0dHBDbGllbnR9IGltcGxlbWVudGF0aW9uIG9mIHRoZQorXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UuCisKK1Rob3VnaCBUaHJpZnQgd2FzIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gYmUgbXVjaCBtb3JlIGVmZmljaWVudCBhbmQgcm9idXN0Cit0aGFuIHR5cGljYWwgd2ViIHRlY2hub2xvZ2llcywgYXMgd2Ugd2VyZSBkZXNpZ25pbmcgb3VyIFhNTC1iYXNlZCBSRVNUIHdlYgorc2VydmljZXMgQVBJIHdlIG5vdGljZWQgdGhhdCBUaHJpZnQgY291bGQgYmUgZWFzaWx5IHVzZWQgdG8gZGVmaW5lIG91cgorc2VydmljZSBpbnRlcmZhY2UuIFRob3VnaCB3ZSBkbyBub3QgY3VycmVudGx5IGVtcGxveSBTT0FQIGVudmVsb3BlcyAoaW4gdGhlCithdXRob3JzJyBvcGluaW9ucyB0aGVyZSBpcyBhbHJlYWR5IGZhciB0b28gbXVjaCByZXBldGl0aXZlIGVudGVycHJpc2UgSmF2YQorc29mdHdhcmUgdG8gZG8gdGhhdCBzb3J0IG9mIHRoaW5nKSwgd2Ugd2VyZSBhYmxlIHRvIHF1aWNrbHkgZXh0ZW5kIFRocmlmdCB0bworZ2VuZXJhdGUgWE1MIFNjaGVtYSBEZWZpbml0aW9uIGZpbGVzIGZvciBvdXIgc2VydmljZSwgYXMgd2VsbCBhcyBhIGZyYW1ld29yaworZm9yIHZlcnNpb25pbmcgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBvdXIgd2ViIHNlcnZpY2UuIFRob3VnaCBwdWJsaWMKK3dlYiBzZXJ2aWNlcyBhcmUgYWRtaXR0ZWRseSB0YW5nZW50aWFsIHRvIFRocmlmdCdzIGNvcmUgdXNlIGNhc2UgYW5kIGRlc2lnbiwKK1RocmlmdCBmYWNpbGl0YXRlZCByYXBpZCBpdGVyYXRpb24gYW5kIGFmZm9yZHMgdXMgdGhlIGFiaWxpdHkgdG8gcXVpY2tseQorbWlncmF0ZSBvdXIgZW50aXJlIFhNTC1iYXNlZCB3ZWIgc2VydmljZSBvbnRvIGEgaGlnaGVyIHBlcmZvcm1hbmNlIHN5c3RlbQorc2hvdWxkIHRoZSBuZWVkIGFyaXNlLgorCitcc3Vic2VjdGlvbntHZW5lcmF0ZWQgU3RydWN0c30KK1dlIG1hZGUgYSBjb25zY2lvdXMgZGVjaXNpb24gdG8gbWFrZSBvdXIgZ2VuZXJhdGVkIHN0cnVjdHMgYXMgdHJhbnNwYXJlbnQgYXMKK3Bvc3NpYmxlLiBBbGwgZmllbGRzIGFyZSBwdWJsaWNseSBhY2Nlc3NpYmxlOyB0aGVyZSBhcmUgbm8gXHRleHR0dHtzZXQoKX0gYW5kCitcdGV4dHR0e2dldCgpfSBtZXRob2RzLiBTaW1pbGFybHksIHVzZSBvZiB0aGUgXHRleHR0dHtpc3NldH0gb2JqZWN0IGlzIG5vdAorZW5mb3JjZWQuIFdlIGRvIG5vdCBpbmNsdWRlIGFueSBcdGV4dHR0e0ZpZWxkTm90U2V0RXhjZXB0aW9ufSBjb25zdHJ1Y3QuCitEZXZlbG9wZXJzIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlc2UgZmllbGRzIHRvIHdyaXRlIG1vcmUgcm9idXN0IGNvZGUsIGJ1dAordGhlIHN5c3RlbSBpcyByb2J1c3QgdG8gdGhlIGRldmVsb3BlciBpZ25vcmluZyB0aGUgXHRleHR0dHtpc3NldH0gY29uc3RydWN0CitlbnRpcmVseSBhbmQgd2lsbCBwcm92aWRlIHN1aXRhYmxlIGRlZmF1bHQgYmVoYXZpb3IgaW4gYWxsIGNhc2VzLgorCitUaGlzIGNob2ljZSB3YXMgbW90aXZhdGVkIGJ5IHRoZSBkZXNpcmUgdG8gZWFzZSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudC4gT3VyIHN0YXRlZAorZ29hbCBpcyBub3QgdG8gbWFrZSBkZXZlbG9wZXJzIGxlYXJuIGEgcmljaCBuZXcgbGlicmFyeSBpbiB0aGVpciBsYW5ndWFnZSBvZgorY2hvaWNlLCBidXQgcmF0aGVyIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgY29uc3RydWN0cwordGhhdCBhcmUgbW9zdCBmYW1pbGlhciBpbiBlYWNoIGxhbmd1YWdlLgorCitXZSBhbHNvIG1hZGUgdGhlIFx0ZXh0dHR7cmVhZCgpfSBhbmQgXHRleHR0dHt3cml0ZSgpfSBtZXRob2RzIG9mIHRoZSBnZW5lcmF0ZWQKK29iamVjdHMgcHVibGljIHNvIHRoYXQgdGhlIG9iamVjdHMgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dAorb2YgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRocmlmdCBpcyBhIHVzZWZ1bCB0b29sIHNpbXBseSBmb3IgZ2VuZXJhdGluZworb2JqZWN0cyB0aGF0IGFyZSBlYXNpbHkgc2VyaWFsaXphYmxlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisKK1xzdWJzZWN0aW9ue1JQQyBNZXRob2QgSWRlbnRpZmljYXRpb259CitNZXRob2QgY2FsbHMgaW4gUlBDIGFyZSBpbXBsZW1lbnRlZCBieSBzZW5kaW5nIHRoZSBtZXRob2QgbmFtZSBhcyBhIHN0cmluZy4gT25lCitpc3N1ZSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBsb25nZXIgbWV0aG9kIG5hbWVzIHJlcXVpcmUgbW9yZSBiYW5kd2lkdGguCitXZSBleHBlcmltZW50ZWQgd2l0aCB1c2luZyBmaXhlZC1zaXplIGhhc2hlcyB0byBpZGVudGlmeSBtZXRob2RzLCBidXQgaW4gdGhlCitlbmQgY29uY2x1ZGVkIHRoYXQgdGhlIHNhdmluZ3Mgd2VyZSBub3Qgd29ydGggdGhlIGhlYWRhY2hlcyBpbmN1cnJlZC4gUmVsaWFibHkKK2RlYWxpbmcgd2l0aCBjb25mbGljdHMgYWNyb3NzIHZlcnNpb25zIG9mIGFuIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGUgaXMKK2ltcG9zc2libGUgd2l0aG91dCBhIG1ldGEtc3RvcmFnZSBzeXN0ZW0gKGkuZS4gdG8gZ2VuZXJhdGUgbm9uLWNvbmZsaWN0aW5nCitoYXNoZXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYSBmaWxlLCB3ZSB3b3VsZCBoYXZlIHRvIGtub3cgYWJvdXQgYWxsCitjb25mbGljdHMgdGhhdCBldmVyIGV4aXN0ZWQgaW4gYW55IHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZpbGUpLgorCitXZSB3YW50ZWQgdG8gYXZvaWQgdG9vIG1hbnkgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvbXBhcmlzb25zIHVwb24KK21ldGhvZCBpbnZvY2F0aW9uLiBUbyBkZWFsIHdpdGggdGhpcywgd2UgZ2VuZXJhdGUgbWFwcyBmcm9tIHN0cmluZ3MgdG8gZnVuY3Rpb24KK3BvaW50ZXJzLCBzbyB0aGF0IGludm9jYXRpb24gaXMgZWZmZWN0aXZlbHkgYWNjb21wbGlzaGVkIHZpYSBhIGNvbnN0YW50LXRpbWUKK2hhc2ggbG9va3VwIGluIHRoZSBjb21tb24gY2FzZS4gVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY291cGxlIGludGVyZXN0aW5nCitjb2RlIGNvbnN0cnVjdHMuIEJlY2F1c2UgSmF2YSBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzLCBwcm9jZXNzCitmdW5jdGlvbnMgYXJlIGFsbCBwcml2YXRlIG1lbWJlciBjbGFzc2VzIGltcGxlbWVudGluZyBhIGNvbW1vbiBpbnRlcmZhY2UuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3ByaXZhdGUgY2xhc3MgcGluZyBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7CisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3Byb3QpCisgICAgdGhyb3dzIFRFeGNlcHRpb24KKyAgeyAuLi59Cit9CisKK0hhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPQorICBuZXcgSGFzaE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPigpOworXGVuZHt2ZXJiYXRpbX0KKworSW4gQysrLCB3ZSB1c2UgYSByZWxhdGl2ZWx5IGVzb3RlcmljIGxhbmd1YWdlIGNvbnN0cnVjdDogbWVtYmVyIGZ1bmN0aW9uCitwb2ludGVycy4KKworXGJlZ2lue3ZlcmJhdGltfQorc3RkOjptYXA8c3RkOjpzdHJpbmcsCisgIHZvaWQgKEV4YW1wbGVTZXJ2aWNlUHJvY2Vzc29yOjoqKShpbnQzMl90LAorICBmYWNlYm9vazo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwKKyAgZmFjZWJvb2s6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCopPgorIHByb2Nlc3NNYXBfOworXGVuZHt2ZXJiYXRpbX0KKworVXNpbmcgdGhlc2UgdGVjaG5pcXVlcywgdGhlIGNvc3Qgb2Ygc3RyaW5nIHByb2Nlc3NpbmcgaXMgbWluaW1pemVkLCBhbmQgd2UKK3JlYXAgdGhlIGJlbmVmaXQgb2YgYmVpbmcgYWJsZSB0byBlYXNpbHkgZGVidWcgY29ycnVwdCBvciBtaXN1bmRlcnN0b29kIGRhdGEgYnkKK2luc3BlY3RpbmcgaXQgZm9yIGtub3duIHN0cmluZyBtZXRob2QgbmFtZXMuCisKK1xzdWJzZWN0aW9ue1NlcnZlcnMgYW5kIE11bHRpdGhyZWFkaW5nfQorVGhyaWZ0IHNlcnZpY2VzIHJlcXVpcmUgYmFzaWMgbXVsdGl0aHJlYWRpbmcgdG8gaGFuZGxlIHNpbXVsdGFuZW91cworcmVxdWVzdHMgZnJvbSBtdWx0aXBsZSBjbGllbnRzLiBGb3IgdGhlIFB5dGhvbiBhbmQgSmF2YSBpbXBsZW1lbnRhdGlvbnMgb2YKK1RocmlmdCBzZXJ2ZXIgbG9naWMsIHRoZSBzdGFuZGFyZCB0aHJlYWRpbmcgbGlicmFyaWVzIGRpc3RyaWJ1dGVkIHdpdGggdGhlCitsYW5ndWFnZXMgcHJvdmlkZSBhZGVxdWF0ZSBzdXBwb3J0LiBGb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgbm8gc3RhbmRhcmQgbXVsdGl0aHJlYWQgcnVudGltZQorbGlicmFyeSBleGlzdHMuIFNwZWNpZmljYWxseSwgcm9idXN0LCBsaWdodHdlaWdodCwgYW5kIHBvcnRhYmxlCit0aHJlYWQgbWFuYWdlciBhbmQgdGltZXIgY2xhc3MgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBleGlzdC4gV2UgaW52ZXN0aWdhdGVkCitleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMsIG5hbWVseSBcdGV4dHR0e2Jvb3N0Ojp0aHJlYWR9LAorXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0sIFx0ZXh0dHR7QUNFXF9UaHJlYWRcX01hbmFnZXJ9IGFuZAorXHRleHR0dHtBQ0VcX1RpbWVyfS4KKworV2hpbGUgXHRleHR0dHtib29zdDo6dGhyZWFkc31cY2l0ZXtib29zdC50aHJlYWRzfSAgcHJvdmlkZXMgY2xlYW4sCitsaWdodHdlaWdodCBhbmQgcm9idXN0IGltcGxlbWVudGF0aW9ucyBvZiBtdWx0aS10aHJlYWQgcHJpbWl0aXZlcyAobXV0ZXhlcywKK2NvbmRpdGlvbnMsIHRocmVhZHMpIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB0aHJlYWQgbWFuYWdlciBvciB0aW1lcgoraW1wbGVtZW50YXRpb24uCisKK1x0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9XGNpdGV7Ym9vc3QudGhyZWFkcG9vbH0gYWxzbyBsb29rZWQgcHJvbWlzaW5nIGJ1dAord2FzIG5vdCBmYXIgZW5vdWdoIGFsb25nIGZvciBvdXIgcHVycG9zZXMuIFdlIHdhbnRlZCB0byBsaW1pdCB0aGUgZGVwZW5kZW5jeSBvbgordGhpcmQtcGFydHkgbGlicmFyaWVzIGFzIG11Y2ggYXMgcG9zc2libGUuIEJlY2F1c2VcXAorXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0gaXMKK25vdCBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSBhbmQgcmVxdWlyZXMgcnVudGltZSBsaWJyYXJpZXMgYW5kIGJlY2F1c2UgaXQgaXMKK25vdCB5ZXQgcGFydCBvZiB0aGUgb2ZmaWNpYWwgQm9vc3QgZGlzdHJpYnV0aW9uIHdlIGZlbHQgaXQgd2FzIG5vdCByZWFkeSBmb3IKK3VzZSBpbiBUaHJpZnQuIEFzIFx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9IGV2b2x2ZXMgYW5kIGVzcGVjaWFsbHkgaWYgaXQgaXMKK2FkZGVkIHRvIHRoZSBCb29zdCBkaXN0cmlidXRpb24gd2UgbWF5IHJlY29uc2lkZXIgb3VyIGRlY2lzaW9uIHRvIG5vdCB1c2UgaXQuCisKK0FDRSBoYXMgYm90aCBhIHRocmVhZCBtYW5hZ2VyIGFuZCB0aW1lciBjbGFzcyBpbiBhZGRpdGlvbiB0byBtdWx0aS10aHJlYWQKK3ByaW1pdGl2ZXMuIFRoZSBiaWdnZXN0IHByb2JsZW0gd2l0aCBBQ0UgaXMgdGhhdCBpdCBpcyBBQ0UuIFVubGlrZSBCb29zdCwgQUNFCitBUEkgcXVhbGl0eSBpcyBwb29yLiBFdmVyeXRoaW5nIGluIEFDRSBoYXMgbGFyZ2UgbnVtYmVycyBvZiBkZXBlbmRlbmNpZXMgb24KK2V2ZXJ5dGhpbmcgZWxzZSBpbiBBQ0UgLSB0aHVzIGZvcmNpbmcgZGV2ZWxvcGVycyB0byB0aHJvdyBvdXQgc3RhbmRhcmQKK2NsYXNzZXMsIHN1Y2ggYXMgU1RMIGNvbGxlY3Rpb25zLCBpbiBmYXZvciBvZiBBQ0UncyBob21lYnJld2VkIGltcGxlbWVudGF0aW9ucy4gSW4KK2FkZGl0aW9uLCB1bmxpa2UgQm9vc3QsIEFDRSBpbXBsZW1lbnRhdGlvbnMgZGVtb25zdHJhdGUgbGl0dGxlIHVuZGVyc3RhbmRpbmcKK29mIHRoZSBwb3dlciBhbmQgcGl0ZmFsbHMgb2YgQysrIHByb2dyYW1taW5nIGFuZCB0YWtlIG5vIGFkdmFudGFnZSBvZiBtb2Rlcm4KK3RlbXBsYXRpbmcgdGVjaG5pcXVlcyB0byBlbnN1cmUgY29tcGlsZSB0aW1lIHNhZmV0eSBhbmQgcmVhc29uYWJsZSBjb21waWxlcgorZXJyb3IgbWVzc2FnZXMuIEZvciBhbGwgdGhlc2UgcmVhc29ucywgQUNFIHdhcyByZWplY3RlZC4gSW5zdGVhZCwgd2UgY2hvc2UKK3RvIGltcGxlbWVudCBvdXIgb3duIGxpYnJhcnksIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorCitcc3Vic2VjdGlvbntUaHJlYWQgUHJpbWl0aXZlc30KKworVGhlIFRocmlmdCB0aHJlYWQgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgbmFtZXNwYWNlXFwKK1x0ZXh0dHR7ZmFjZWJvb2s6OnRocmlmdDo6Y29uY3VycmVuY3l9IGFuZCBoYXZlIHRocmVlIGNvbXBvbmVudHM6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHByaW1pdGl2ZXMKK1xpdGVtIHRocmVhZCBwb29sIG1hbmFnZXIKK1xpdGVtIHRpbWVyIG1hbmFnZXIKK1xlbmR7aXRlbWl6ZX0KKworQXMgbWVudGlvbmVkIGFib3ZlLCB3ZSB3ZXJlIGhlc2l0YW50IHRvIGludHJvZHVjZSBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKK29uIFRocmlmdC4gV2UgZGVjaWRlZCB0byB1c2UgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGJlY2F1c2UgaXQgaXMgc28KK3VzZWZ1bCBmb3IgbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbiwgaXQgcmVxdWlyZXMgbm8gbGluay10aW1lIG9yCitydW50aW1lIGxpYnJhcmllcyAoaS5lLiBpdCBpcyBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSkgYW5kIGl0IGlzIGR1ZQordG8gYmVjb21lIHBhcnQgb2YgdGhlIEMrKzB4IHN0YW5kYXJkLgorCitXZSBpbXBsZW1lbnQgc3RhbmRhcmQgXHRleHR0dHtNdXRleH0gYW5kIFx0ZXh0dHR7Q29uZGl0aW9ufSBjbGFzc2VzLCBhbmQgYQorIFx0ZXh0dHR7TW9uaXRvcn0gY2xhc3MuIFRoZSBsYXR0ZXIgaXMgc2ltcGx5IGEgY29tYmluYXRpb24gb2YgYSBtdXRleCBhbmQKK2NvbmRpdGlvbiB2YXJpYWJsZSBhbmQgaXMgYW5hbG9nb3VzIHRvIHRoZSBcdGV4dHR0e01vbml0b3J9IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGZvcgordGhlIEphdmEgXHRleHR0dHtPYmplY3R9IGNsYXNzLiBUaGlzIGlzIGFsc28gc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgYmFycmllci4gV2UKK3Byb3ZpZGUgYSBcdGV4dHR0e1N5bmNocm9uaXplZH0gZ3VhcmQgY2xhc3MgdG8gYWxsb3cgSmF2YS1saWtlIHN5bmNocm9uaXplZCBibG9ja3MuCitUaGlzIGlzIGp1c3QgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyLCBidXQsIGxpa2UgaXRzIEphdmEgY291bnRlcnBhcnQsIGNsZWFybHkKK2RlbGltaXRzIGNyaXRpY2FsIHNlY3Rpb25zIG9mIGNvZGUuIFVubGlrZSBpdHMgSmF2YSBjb3VudGVycGFydCwgd2Ugc3RpbGwKK2hhdmUgdGhlIGFiaWxpdHkgdG8gcHJvZ3JhbW1hdGljYWxseSBsb2NrLCB1bmxvY2ssIGJsb2NrLCBhbmQgc2lnbmFsIG1vbml0b3JzLgorCitcYmVnaW57dmVyYmF0aW19Cit2b2lkIHJ1bigpIHsKKyB7U3luY2hyb25pemVkIHMobWFuYWdlci0+bW9uaXRvcik7CisgIGlmIChtYW5hZ2VyLT5zdGF0ZSA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7CisgICAgbWFuYWdlci0+c3RhdGUgPSBUaW1lck1hbmFnZXI6OlNUQVJURUQ7CisgICAgbWFuYWdlci0+bW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgfQorIH0KK30KK1xlbmR7dmVyYmF0aW19CisKK1dlIGFnYWluIGJvcnJvd2VkIGZyb20gSmF2YSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIHRocmVhZCBhbmQgYSBydW5uYWJsZQorY2xhc3MuIEEgXHRleHR0dHtUaHJlYWR9IGlzIHRoZSBhY3R1YWwgc2NoZWR1bGFibGUgb2JqZWN0LiBUaGUKK1x0ZXh0dHR7UnVubmFibGV9IGlzIHRoZSBsb2dpYyB0byBleGVjdXRlIHdpdGhpbiB0aGUgdGhyZWFkLgorVGhlIFx0ZXh0dHR7VGhyZWFkfSBpbXBsZW1lbnRhdGlvbiBkZWFscyB3aXRoIGFsbCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkCitjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gaXNzdWVzLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gaW1wbGVtZW50YXRpb24gZGVhbHMKK3dpdGggdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHBlci10aHJlYWQgbG9naWMuIFRoZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2gKK2lzIHRoYXQgZGV2ZWxvcGVycyBjYW4gZWFzaWx5IHN1YmNsYXNzIHRoZSBSdW5uYWJsZSBjbGFzcyB3aXRob3V0IHB1bGxpbmcgaW4KK3BsYXRmb3JtLXNwZWNpZmljIHN1cGVyLWNsYXNzZXMuCisKK1xzdWJzZWN0aW9ue1RocmVhZCwgUnVubmFibGUsIGFuZCBzaGFyZWRcX3B0cn0KK1dlIHVzZSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdGhyb3VnaG91dCB0aGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBhbmQKK1x0ZXh0dHR7VGltZXJNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbnMgdG8gZ3VhcmFudGVlIGNsZWFudXAgb2YgZGVhZCBvYmplY3RzIHRoYXQgY2FuCitiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiBGb3IgXHRleHR0dHtUaHJlYWR9IGNsYXNzIGltcGxlbWVudGF0aW9ucywKK1x0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB1c2FnZSByZXF1aXJlcyBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBtYWtlIHN1cmUKK1x0ZXh0dHR7VGhyZWFkfSBvYmplY3RzIGFyZSBuZWl0aGVyIGxlYWtlZCBub3IgZGVyZWZlcmVuY2VkIHByZW1hdHVyZWx5IHdoaWxlCitjcmVhdGluZyBhbmQgc2h1dHRpbmcgZG93biB0aHJlYWRzLgorCitUaHJlYWQgY3JlYXRpb24gcmVxdWlyZXMgY2FsbGluZyBpbnRvIGEgQyBsaWJyYXJ5LiAoSW4gb3VyIGNhc2UgdGhlIFBPU0lYCit0aHJlYWQgbGlicmFyeSwgXHRleHR0dHtsaWJwdGhyZWFkfSwgYnV0IHRoZSBzYW1lIHdvdWxkIGJlIHRydWUgZm9yIFdJTjMyIHRocmVhZHMpLgorVHlwaWNhbGx5LCB0aGUgT1MgbWFrZXMgZmV3LCBpZiBhbnksIGd1YXJhbnRlZXMgYWJvdXQgd2hlbiBcdGV4dHR0e1RocmVhZE1haW59LCBhIEMgdGhyZWFkJ3MgZW50cnktcG9pbnQgZnVuY3Rpb24sIHdpbGwgYmUgY2FsbGVkLiBUaGVyZWZvcmUsIGl0IGlzCitwb3NzaWJsZSB0aGF0IG91ciB0aHJlYWQgY3JlYXRlIGNhbGwsCitcdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZCgpfSBjb3VsZCByZXR1cm4gdG8gdGhlIGNhbGxlcgord2VsbCBiZWZvcmUgdGhhdCB0aW1lLiBUbyBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBpcyBub3QKK3ByZW1hdHVyZWx5IGNsZWFuZWQgdXAgaWYgdGhlIGNhbGxlciBnaXZlcyB1cCBpdHMgcmVmZXJlbmNlIHByaW9yIHRvIHRoZQorXHRleHR0dHtUaHJlYWRNYWlufSBjYWxsLCB0aGUgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBtYWtlcyBhIHdlYWsgcmVmZXJlbmNlIHRvCitpdHNlbGYgaW4gaXRzIFx0ZXh0dHR7c3RhcnR9IG1ldGhvZC4KKworV2l0aCB0aGUgd2VhayByZWZlcmVuY2UgaW4gaGFuZCB0aGUgXHRleHR0dHtUaHJlYWRNYWlufSBmdW5jdGlvbiBjYW4gYXR0ZW1wdCB0byBnZXQKK2Egc3Ryb25nIHJlZmVyZW5jZSBiZWZvcmUgZW50ZXJpbmcgdGhlIFx0ZXh0dHR7UnVubmFibGU6OnJ1bn0gbWV0aG9kIG9mIHRoZQorXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IGJvdW5kIHRvIHRoZSBcdGV4dHR0e1RocmVhZH0uIElmIG5vIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQordGhyZWFkIGFyZSBvYnRhaW5lZCBiZXR3ZWVuIGV4aXRpbmcgXHRleHR0dHtUaHJlYWQ6OnN0YXJ0fSBhbmQgZW50ZXJpbmcgXHRleHR0dHtUaHJlYWRNYWlufSwgdGhlIHdlYWsgcmVmZXJlbmNlIHJldHVybnMgXHRleHR0dHtudWxsfSBhbmQgdGhlIGZ1bmN0aW9uCitleGl0cyBpbW1lZGlhdGVseS4KKworVGhlIG5lZWQgZm9yIHRoZSBcdGV4dHR0e1RocmVhZH0gdG8gbWFrZSBhIHdlYWsgcmVmZXJlbmNlIHRvIGl0c2VsZiBoYXMgYQorc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBBUEkuIFNpbmNlIHJlZmVyZW5jZXMgYXJlIG1hbmFnZWQgdGhyb3VnaCB0aGUKK1x0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB0ZW1wbGF0ZXMsIHRoZSBcdGV4dHR0e1RocmVhZH0gb2JqZWN0IG11c3QgaGF2ZSBhIHJlZmVyZW5jZQordG8gaXRzZWxmIHdyYXBwZWQgYnkgdGhlIHNhbWUgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGVudmVsb3BlIHRoYXQgaXMgcmV0dXJuZWQKK3RvIHRoZSBjYWxsZXIuIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSB1c2Ugb2YgdGhlIGZhY3RvcnkgcGF0dGVybi4KK1x0ZXh0dHR7VGhyZWFkRmFjdG9yeX0gY3JlYXRlcyB0aGUgcmF3IFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgYW5kIGEKK1x0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB3cmFwcGVyLCBhbmQgY2FsbHMgYSBwcml2YXRlIGhlbHBlciBtZXRob2Qgb2YgdGhlIGNsYXNzCitpbXBsZW1lbnRpbmcgdGhlIFx0ZXh0dHR7VGhyZWFkfSBpbnRlcmZhY2UgKGluIHRoaXMgY2FzZSwgXHRleHR0dHtQb3NpeFRocmVhZDo6d2Vha1JlZn0pCisgdG8gYWxsb3cgaXQgdG8gbWFrZSBhZGQgd2VhayByZWZlcmVuY2UgdG8gaXRzZWxmIHRocm91Z2ggdGhlCisgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGVudmVsb3BlLgorCitcdGV4dHR0e1RocmVhZH0gYW5kIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMgcmVmZXJlbmNlIGVhY2ggb3RoZXIuIEEgXHRleHR0dHtSdW5uYWJsZX0KK29iamVjdCBtYXkgbmVlZCB0byBrbm93IGFib3V0IHRoZSB0aHJlYWQgaW4gd2hpY2ggaXQgaXMgZXhlY3V0aW5nLCBhbmQgYSBUaHJlYWQsIG9idmlvdXNseSwKK25lZWRzIHRvIGtub3cgd2hhdCBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgaXQgaXMgaG9zdGluZy4gVGhpcyBpbnRlcmRlcGVuZGVuY3kgaXMKK2Z1cnRoZXIgY29tcGxpY2F0ZWQgYmVjYXVzZSB0aGUgbGlmZWN5Y2xlIG9mIGVhY2ggb2JqZWN0IGlzIGluZGVwZW5kZW50IG9mIHRoZQorb3RoZXIuIEFuIGFwcGxpY2F0aW9uIG1heSBjcmVhdGUgYSBzZXQgb2YgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IHRvIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQgdGhyZWFkcywgb3IgaXQgbWF5IGNyZWF0ZSBhbmQgZm9yZ2V0IGEgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0CitvbmNlIGEgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHN0YXJ0ZWQgZm9yIGl0LgorCitUaGUgXHRleHR0dHtUaHJlYWR9IGNsYXNzIHRha2VzIGEgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHJlZmVyZW5jZSB0byB0aGUgaG9zdGVkCitcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgaW4gaXRzIGNvbnN0cnVjdG9yLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gY2xhc3MgaGFzIGFuCitleHBsaWNpdCBcdGV4dHR0e3RocmVhZH0gbWV0aG9kIHRvIGFsbG93IGV4cGxpY2l0IGJpbmRpbmcgb2YgdGhlIGhvc3RlZCB0aHJlYWQuCitcdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZH0gYmluZHMgdGhlIG9iamVjdHMgdG8gZWFjaCBvdGhlci4KKworXHN1YnNlY3Rpb257VGhyZWFkTWFuYWdlcn0KKworXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBjcmVhdGVzIGEgcG9vbCBvZiB3b3JrZXIgdGhyZWFkcyBhbmQKK2FsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2NoZWR1bGUgdGFza3MgZm9yIGV4ZWN1dGlvbiBhcyBmcmVlIHdvcmtlciB0aHJlYWRzCitiZWNvbWUgYXZhaWxhYmxlLiBUaGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBkb2VzIG5vdCBpbXBsZW1lbnQgZHluYW1pYwordGhyZWFkIHBvb2wgcmVzaXppbmcsIGJ1dCBwcm92aWRlcyBwcmltaXRpdmVzIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBhZGQKK2FuZCByZW1vdmUgdGhyZWFkcyBiYXNlZCBvbiBsb2FkLiBUaGlzIGFwcHJvYWNoIHdhcyBjaG9zZW4gYmVjYXVzZQoraW1wbGVtZW50aW5nIGxvYWQgbWV0cmljcyBhbmQgdGhyZWFkIHBvb2wgc2l6ZSBpcyB2ZXJ5IGFwcGxpY2F0aW9uCitzcGVjaWZpYy4gRm9yIGV4YW1wbGUgc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdhbnQgdG8gYWRqdXN0IHBvb2wgc2l6ZSBiYXNlZAorb24gcnVubmluZy1hdmVyYWdlIG9mIHdvcmsgYXJyaXZhbCByYXRlcyB0aGF0IGFyZSBtZWFzdXJlZCB2aWEgcG9sbGVkCitzYW1wbGVzLiBPdGhlcnMgbWF5IHNpbXBseSB3aXNoIHRvIHJlYWN0IGltbWVkaWF0ZWx5IHRvIHdvcmstcXVldWUKK2RlcHRoIGhpZ2ggYW5kIGxvdyB3YXRlciBtYXJrcy4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGNyZWF0ZSBhIGNvbXBsZXgKK0FQSSBhYnN0cmFjdCBlbm91Z2ggdG8gY2FwdHVyZSB0aGVzZSBkaWZmZXJlbnQgYXBwcm9hY2hlcywgd2UKK3NpbXBseSBsZWF2ZSBpdCB1cCB0byB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBhbmQgcHJvdmlkZSB0aGUKK3ByaW1pdGl2ZXMgdG8gZW5hY3QgdGhlIGRlc2lyZWQgcG9saWN5IGFuZCBzYW1wbGUgY3VycmVudCBzdGF0dXMuCisKK1xzdWJzZWN0aW9ue1RpbWVyTWFuYWdlcn0KKworXHRleHR0dHtUaW1lck1hbmFnZXJ9IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2NoZWR1bGUKKyBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3RzIGZvciBleGVjdXRpb24gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLiBJdHMgc3BlY2lmaWMgdGFzaworaXMgdG8gYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzYW1wbGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBsb2FkIGF0IHJlZ3VsYXIKK2ludGVydmFscyBhbmQgbWFrZSBjaGFuZ2VzIHRvIHRoZSB0aHJlYWQgcG9vbCBzaXplIGJhc2VkIG9uIGFwcGxpY2F0aW9uIHBvbGljeS4KK09mIGNvdXJzZSwgaXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYW55IG51bWJlciBvZiB0aW1lciBvciBhbGFybSBldmVudHMuCisKK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFx0ZXh0dHR7VGltZXJNYW5hZ2VyfSB1c2VzIGEgc2luZ2xlIHRocmVhZCB0bworZXhlY3V0ZSBleHBpcmVkIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMuIFRodXMsIGlmIGEgdGltZXIgb3BlcmF0aW9uIG5lZWRzIHRvCitkbyBhIGxhcmdlIGFtb3VudCBvZiB3b3JrIGFuZCBlc3BlY2lhbGx5IGlmIGl0IG5lZWRzIHRvIGRvIGJsb2NraW5nIEkvTywKK3RoYXQgc2hvdWxkIGJlIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisKK1xzdWJzZWN0aW9ue05vbmJsb2NraW5nIE9wZXJhdGlvbn0KK1Rob3VnaCB0aGUgVGhyaWZ0IHRyYW5zcG9ydCBpbnRlcmZhY2VzIG1hcCBtb3JlIGRpcmVjdGx5IHRvIGEgYmxvY2tpbmcgSS9PCittb2RlbCwgd2UgaGF2ZSBpbXBsZW1lbnRlZCBhIGhpZ2ggcGVyZm9ybWFuY2UgXHRleHR0dHtUTm9uQmxvY2tpbmdTZXJ2ZXJ9CitpbiBDKysgYmFzZWQgb24gXHRleHR0dHtsaWJldmVudH0gYW5kIHRoZSBcdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9LiBXZQoraW1wbGVtZW50ZWQgdGhpcyBieSBtb3ZpbmcgYWxsIEkvTyBpbnRvIG9uZSB0aWdodCBldmVudCBsb29wIHVzaW5nIGEKK3N0YXRlIG1hY2hpbmUuIEVzc2VudGlhbGx5LCB0aGUgZXZlbnQgbG9vcCByZWFkcyBmcmFtZWQgcmVxdWVzdHMgaW50bworXHRleHR0dHtUTWVtb3J5QnVmZmVyfSBvYmplY3RzLiBPbmNlIGVudGlyZSByZXF1ZXN0cyBhcmUgcmVhZHksIHRoZXkgYXJlCitkaXNwYXRjaGVkIHRvIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdCB3aGljaCBjYW4gcmVhZCBkaXJlY3RseSBmcm9tCit0aGUgZGF0YSBpbiBtZW1vcnkuCisKK1xzdWJzZWN0aW9ue0NvbXBpbGVyfQorVGhlIFRocmlmdCBjb21waWxlciBpcyBpbXBsZW1lbnRlZCBpbiBDKysgdXNpbmcgc3RhbmRhcmQgXHRleHR0dHtsZXh9L1x0ZXh0dHR7eWFjY30KK2xleGluZyBhbmQgcGFyc2luZy4gVGhvdWdoIGl0IGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB3aXRoIGZld2VyCitsaW5lcyBvZiBjb2RlIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGkuZS4gUHl0aG9uIExleC1ZYWNjIChQTFkpIG9yIFx0ZXh0dHR7b2NhbWx5YWNjfSksIHVzaW5nIEMrKworZm9yY2VzIGV4cGxpY2l0IGRlZmluaXRpb24gb2YgdGhlIGxhbmd1YWdlIGNvbnN0cnVjdHMuIFN0cm9uZ2x5IHR5cGluZyB0aGUKK3BhcnNlIHRyZWUgZWxlbWVudHMgKGRlYmF0YWJseSkgbWFrZXMgdGhlIGNvZGUgbW9yZSBhcHByb2FjaGFibGUgZm9yIG5ldworZGV2ZWxvcGVycy4KKworQ29kZSBnZW5lcmF0aW9uIGlzIGRvbmUgdXNpbmcgdHdvIHBhc3Nlcy4gVGhlIGZpcnN0IHBhc3MgbG9va3Mgb25seSBmb3IKK2luY2x1ZGUgZmlsZXMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuIFR5cGUgZGVmaW5pdGlvbnMgYXJlIG5vdCBjaGVja2VkIGR1cmluZwordGhpcyBwaGFzZSwgc2luY2UgdGhleSBtYXkgZGVwZW5kIHVwb24gaW5jbHVkZSBmaWxlcy4gQWxsIGluY2x1ZGVkIGZpbGVzCithcmUgc2VxdWVudGlhbGx5IHNjYW5uZWQgaW4gYSBmaXJzdCBwYXNzLiBPbmNlIHRoZSBpbmNsdWRlIHRyZWUgaGFzIGJlZW4KK3Jlc29sdmVkLCBhIHNlY29uZCBwYXNzIG92ZXIgYWxsIGZpbGVzIGlzIHRha2VuIHRoYXQgaW5zZXJ0cyB0eXBlIGRlZmluaXRpb25zCitpbnRvIHRoZSBwYXJzZSB0cmVlIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gYW55IHVuZGVmaW5lZCB0eXBlcy4gVGhlIHByb2dyYW0gaXMKK3RoZW4gZ2VuZXJhdGVkIGFnYWluc3QgdGhlIHBhcnNlIHRyZWUuCisKK0R1ZSB0byBpbmhlcmVudCBjb21wbGV4aXRpZXMgYW5kIHBvdGVudGlhbCBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLAord2UgZXhwbGljaXRseSBkaXNhbGxvdyBmb3J3YXJkIGRlY2xhcmF0aW9uLiBUd28gVGhyaWZ0IHN0cnVjdHMgY2Fubm90CitlYWNoIGNvbnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIG90aGVyLiAoU2luY2Ugd2UgZG8gbm90IGFsbG93IFx0ZXh0dHR7bnVsbH0KK3N0cnVjdCBpbnN0YW5jZXMgaW4gdGhlIGdlbmVyYXRlZCBDKysgY29kZSwgdGhpcyB3b3VsZCBhY3R1YWxseSBiZSBpbXBvc3NpYmxlLikKKworXHN1YnNlY3Rpb257VEZpbGVUcmFuc3BvcnR9CitUaGUgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gbG9ncyBUaHJpZnQgcmVxdWVzdHMvc3RydWN0cyBieQorZnJhbWluZyBpbmNvbWluZyBkYXRhIHdpdGggaXRzIGxlbmd0aCBhbmQgd3JpdGluZyBpdCBvdXQgdG8gZGlzay4KK1VzaW5nIGEgZnJhbWVkIG9uLWRpc2sgZm9ybWF0IGFsbG93cyBmb3IgYmV0dGVyIGVycm9yIGNoZWNraW5nIGFuZAoraGVscHMgd2l0aCB0aGUgcHJvY2Vzc2luZyBvZiBhIGZpbml0ZSBudW1iZXIgb2YgZGlzY3JldGUgZXZlbnRzLiBUaGVcXAorXHRleHR0dHtURmlsZVdyaXRlclRyYW5zcG9ydH0gdXNlcyBhIHN5c3RlbSBvZiBzd2FwcGluZyBpbi1tZW1vcnkgYnVmZmVycwordG8gZW5zdXJlIGdvb2QgcGVyZm9ybWFuY2Ugd2hpbGUgbG9nZ2luZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEuCitBIFRocmlmdCBsb2cgZmlsZSBpcyBzcGxpdCB1cCBpbnRvIGNodW5rcyBvZiBhIHNwZWNpZmllZCBzaXplOyBsb2dnZWQgbWVzc2FnZXMKK2FyZSBub3QgYWxsb3dlZCB0byBjcm9zcyBjaHVuayBib3VuZGFyaWVzLiBBIG1lc3NhZ2UgdGhhdCB3b3VsZCBjcm9zcyBhIGNodW5rCitib3VuZGFyeSB3aWxsIGNhdXNlIHBhZGRpbmcgdG8gYmUgYWRkZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsgYW5kIHRoZQorZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSBhcmUgYWxpZ25lZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGNodW5rLgorUGFydGl0aW9uaW5nIHRoZSBmaWxlIGludG8gY2h1bmtzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlYWQgYW5kIGludGVycHJldCBkYXRhCitmcm9tIGEgcGFydGljdWxhciBwb2ludCBpbiB0aGUgZmlsZS4KKworXHNlY3Rpb257RmFjZWJvb2sgVGhyaWZ0IFNlcnZpY2VzfQorVGhyaWZ0IGhhcyBiZWVuIGVtcGxveWVkIGluIGEgbGFyZ2UgbnVtYmVyIG9mIGFwcGxpY2F0aW9ucyBhdCBGYWNlYm9vaywgaW5jbHVkaW5nCitzZWFyY2gsIGxvZ2dpbmcsIG1vYmlsZSwgYWRzIGFuZCB0aGUgZGV2ZWxvcGVyIHBsYXRmb3JtLiBUd28gc3BlY2lmaWMgdXNhZ2VzIGFyZSBkaXNjdXNzZWQgYmVsb3cuCisKK1xzdWJzZWN0aW9ue1NlYXJjaH0KK1RocmlmdCBpcyB1c2VkIGFzIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHRoZSBGYWNlYm9vayBTZWFyY2ggc2VydmljZS4KK1RoZSBtdWx0aS1sYW5ndWFnZSBjb2RlIGdlbmVyYXRpb24gaXMgd2VsbCBzdWl0ZWQgZm9yIHNlYXJjaCBiZWNhdXNlIGl0IGFsbG93cyBmb3IgYXBwbGljYXRpb24KK2RldmVsb3BtZW50IGluIGFuIGVmZmljaWVudCBzZXJ2ZXIgc2lkZSBsYW5ndWFnZSAoQysrKSBhbmQgYWxsb3dzIHRoZSBGYWNlYm9vayBQSFAtYmFzZWQgd2ViIGFwcGxpY2F0aW9uCit0byBtYWtlIGNhbGxzIHRvIHRoZSBzZWFyY2ggc2VydmljZSB1c2luZyBUaHJpZnQgUEhQIGxpYnJhcmllcy4gVGhlcmUgaXMgYWxzbyBhIGxhcmdlCit2YXJpZXR5IG9mIHNlYXJjaCBzdGF0cywgZGVwbG95bWVudCBhbmQgdGVzdGluZyBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgYnVpbHQgb24gdG9wCitvZiBnZW5lcmF0ZWQgUHl0aG9uIGNvZGUuIEFkZGl0aW9uYWxseSwgdGhlIFRocmlmdCBsb2cgZmlsZSBmb3JtYXQgaXMKK3VzZWQgYXMgYSByZWRvIGxvZyBmb3IgcHJvdmlkaW5nIHJlYWwtdGltZSBzZWFyY2ggaW5kZXggdXBkYXRlcy4gVGhyaWZ0IGhhcyBhbGxvd2VkIHRoZQorc2VhcmNoIHRlYW0gdG8gbGV2ZXJhZ2UgZWFjaCBsYW5ndWFnZSBmb3IgaXRzIHN0cmVuZ3RocyBhbmQgdG8gZGV2ZWxvcCBjb2RlIGF0IGEgcmFwaWQgcGFjZS4KKworXHN1YnNlY3Rpb257TG9nZ2luZ30KK1RoZSBUaHJpZnQgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGZvciBzdHJ1Y3R1cmVkIGxvZ2dpbmcuIEVhY2gKK3NlcnZpY2UgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbG9uZyB3aXRoIGl0cyBwYXJhbWV0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlCithIHN0cnVjdHVyZWQgbG9nIGVudHJ5IGlkZW50aWZpZWQgYnkgdGhlIGZ1bmN0aW9uIG5hbWUuIFRoaXMgbG9nIGNhbiB0aGVuIGJlIHVzZWQgZm9yCithIHZhcmlldHkgb2YgcHVycG9zZXMsIGluY2x1ZGluZyBpbmxpbmUgYW5kIG9mZmxpbmUgcHJvY2Vzc2luZywgc3RhdHMgYWdncmVnYXRpb24gYW5kIGFzIGEgcmVkbyBsb2cuCisKK1xzZWN0aW9ue0NvbmNsdXNpb25zfQorVGhyaWZ0IGhhcyBlbmFibGVkIEZhY2Vib29rIHRvIGJ1aWxkIHNjYWxhYmxlIGJhY2tlbmQKK3NlcnZpY2VzIGVmZmljaWVudGx5IGJ5IGVuYWJsaW5nIGVuZ2luZWVycyB0byBkaXZpZGUgYW5kIGNvbnF1ZXIuIEFwcGxpY2F0aW9uCitkZXZlbG9wZXJzIGNhbiBmb2N1cyBvbiBhcHBsaWNhdGlvbiBjb2RlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlCitzb2NrZXRzIGxheWVyLiBXZSBhdm9pZCBkdXBsaWNhdGVkIHdvcmsgYnkgd3JpdGluZyBidWZmZXJpbmcgYW5kIEkvTyBsb2dpYworaW4gb25lIHBsYWNlLCByYXRoZXIgdGhhbiBpbnRlcnNwZXJzaW5nIGl0IGluIGVhY2ggYXBwbGljYXRpb24uCisKK1RocmlmdCBoYXMgYmVlbiBlbXBsb3llZCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgYXQgRmFjZWJvb2ssCitpbmNsdWRpbmcgc2VhcmNoLCBsb2dnaW5nLCBtb2JpbGUsIGFkcywgYW5kIHRoZSBkZXZlbG9wZXIgcGxhdGZvcm0uIFdlIGhhdmUKK2ZvdW5kIHRoYXQgdGhlIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGNvc3QgaW5jdXJyZWQgYnkgYW4gZXh0cmEgbGF5ZXIgb2YKK3NvZnR3YXJlIGFic3RyYWN0aW9uIGlzIGZhciBlY2xpcHNlZCBieSB0aGUgZ2FpbnMgaW4gZGV2ZWxvcGVyIGVmZmljaWVuY3kgYW5kCitzeXN0ZW1zIHJlbGlhYmlsaXR5LgorCitcYXBwZW5kaXgKKworXHNlY3Rpb257U2ltaWxhciBTeXN0ZW1zfQorVGhlIGZvbGxvd2luZyBhcmUgc29mdHdhcmUgc3lzdGVtcyBzaW1pbGFyIHRvIFRocmlmdC4gRWFjaCBpcyAodmVyeSEpIGJyaWVmbHkKK2Rlc2NyaWJlZDoKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdGV4dGl0e1NPQVAufSBYTUwtYmFzZWQuIERlc2lnbmVkIGZvciB3ZWIgc2VydmljZXMgdmlhIEhUVFAsIGV4Y2Vzc2l2ZQorWE1MIHBhcnNpbmcgb3ZlcmhlYWQuCitcaXRlbSBcdGV4dGl0e0NPUkJBLn0gUmVsYXRpdmVseSBjb21wcmVoZW5zaXZlLCBkZWJhdGFibHkgb3ZlcmRlc2lnbmVkIGFuZAoraGVhdnl3ZWlnaHQuIENvbXBhcmFibHkgY3VtYmVyc29tZSBzb2Z0d2FyZSBpbnN0YWxsYXRpb24uCitcaXRlbSBcdGV4dGl0e0NPTS59IEVtYnJhY2VkIG1haW5seSBpbiBXaW5kb3dzIGNsaWVudCBzb2Z0d2FyZS4gTm90IGFuIGVudGlyZWx5CitvcGVuIHNvbHV0aW9uLgorXGl0ZW0gXHRleHRpdHtQaWxsYXIufSBMaWdodHdlaWdodCBhbmQgaGlnaC1wZXJmb3JtYW5jZSwgYnV0IG1pc3NpbmcgdmVyc2lvbmluZworYW5kIGFic3RyYWN0aW9uLgorXGl0ZW0gXHRleHRpdHtQcm90b2NvbCBCdWZmZXJzLn0gQ2xvc2VkLXNvdXJjZSwgb3duZWQgYnkgR29vZ2xlLiBEZXNjcmliZWQgaW4KK1Nhd3phbGwgcGFwZXIuCitcZW5ke2l0ZW1pemV9CisKK1xhY2tzCisKK01hbnkgdGhhbmtzIGZvciBmZWVkYmFjayBvbiBUaHJpZnQgKGFuZCBleHRyZW1lIHRyaWFsIGJ5IGZpcmUpIGFyZSBkdWUgdG8KK01hcnRpbiBTbWl0aCwgS2FybCBWb3NrdWlsIGFuZCBZaXNoYW4gV29uZy4KKworVGhyaWZ0IGlzIGEgc3VjY2Vzc29yIHRvIFBpbGxhciwgYSBzaW1pbGFyIHN5c3RlbSBkZXZlbG9wZWQKK2J5IEFkYW0gRCdBbmdlbG8sIGZpcnN0IHdoaWxlIGF0IENhbHRlY2ggYW5kIGNvbnRpbnVlZCBsYXRlciBhdCBGYWNlYm9vay4KK1RocmlmdCBzaW1wbHkgd291bGQgbm90IGhhdmUgaGFwcGVuZWQgd2l0aG91dCBBZGFtJ3MgaW5zaWdodHMuCisKK1xiZWdpbnt0aGViaWJsaW9ncmFwaHl9e30KKworXGJpYml0ZW17Ym9vc3QudGhyZWFkc30KK0tlbXBmLCBXaWxsaWFtLAorYGBCb29zdC5UaHJlYWRzJycsCitcdXJse2h0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9odG1sL3RocmVhZHMuaHRtbH0KKworXGJpYml0ZW17Ym9vc3QudGhyZWFkcG9vbH0KK0hlbmtlbCwgUGhpbGlwcCwKK2BgdGhyZWFkcG9vbCcnLAorXHVybHtodHRwOi8vdGhyZWFkcG9vbC5zb3VyY2Vmb3JnZS5uZXR9CisKK1xlbmR7dGhlYmlibGlvZ3JhcGh5fQorCitcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvZG9jL3RocmlmdC5ibmYgYi9kb2MvdGhyaWZ0LmJuZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkODNmNi4uMDAwMDAwMAotLS0gYS9kb2MvdGhyaWZ0LmJuZgorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLVRocmlmdCBQcm90b2NvbCBTdHJ1Y3R1cmUKLQotTGFzdCBNb2RpZmllZDogMjAwNy1KdW4tMjkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFRocmlmdCBwcm90b2NvbAotd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZy4gVGh1cywgdGhlIG9yZGVyIG9mIGVsZW1lbnRzCi1jb3VsZCBpbiBzb21lIGNhc2VzIGJlIHJlYXJyYW5nZWQgZGVwZW5kaW5nIHVwb24gdGhlIFRQcm90b2NvbAotaW1wbGVtZW50YXRpb24sIGJ1dCB0aGlzIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgbWluaW11bSByZXF1aXJlZAotc3RydWN0dXJlLiBUaGVyZSBhcmUgc29tZSAiZHVtYiIgdGVybWluYWxzIGxpa2UgU1RSSU5HIGFuZCBJTlQKLXRoYXQgdGFrZSB0aGUgcGxhY2Ugb2YgYW4gYWN0dWFsIGVuY29kaW5nIHNwZWNpZmljYXRpb24uCi0KLVRoZXkga2V5IHBvaW50IHRvIG5vdGljZSBpcyB0aGF0IEFMTCBtZXNzYWdlcyBhcmUganVzdCBvbmUgd3JhcHBlZAotPHN0cnVjdD4uIERlcGVuZGluZyB1cG9uIHRoZSBtZXNzYWdlIHR5cGUsIHRoZSA8c3RydWN0PiBjYW4gYmUKLWludGVycHJldGVkIGFzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGEgZnVuY3Rpb24sIHRoZSByZXR1cm4gdmFsdWUKLW9mIGEgZnVuY3Rpb24sIG9yIGFuIGV4Y2VwdGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgIDxtZXNzYWdlPiA6Oj0gPG1lc3NhZ2UtYmVnaW4+IDxzdHJ1Y3Q+IDxtZXNzYWdlLWVuZD4KLQotIDxtZXNzYWdlLWJlZ2luPiA6Oj0gPG1ldGhvZC1uYW1lPiA8bWVzc2FnZS10eXBlPiA8bWVzc2FnZS1zZXFpZD4KLQotICAgPG1ldGhvZC1uYW1lPiA6Oj0gU1RSSU5HCi0KLSAgPG1lc3NhZ2UtdHlwZT4gOjo9IFRfQ0FMTCB8IFRfUkVQTFkgfCBUX0VYQ0VQVElPTgotCi0gPG1lc3NhZ2Utc2VxaWQ+IDo6PSBJMzIKLQotICAgICAgICA8c3RydWN0PiA6Oj0gPHN0cnVjdC1iZWdpbj4gPGZpZWxkPiogPGZpZWxkLXN0b3A+IDxzdHJ1Y3QtZW5kPgotCi0gIDxzdHJ1Y3QtYmVnaW4+IDo6PSA8c3RydWN0LW5hbWU+Ci0KLSAgIDxzdHJ1Y3QtbmFtZT4gOjo9IFNUUklORwotCi0gICAgPGZpZWxkLXN0b3A+IDo6PSBUX1NUT1AKLQotICAgICAgICAgPGZpZWxkPiA6Oj0gPGZpZWxkLWJlZ2luPiA8ZmllbGQtZGF0YT4gPGZpZWxkLWVuZD4KLQotICAgPGZpZWxkLWJlZ2luPiA6Oj0gPGZpZWxkLW5hbWU+IDxmaWVsZC10eXBlPiA8ZmllbGQtaWQ+Ci0KLSAgICA8ZmllbGQtbmFtZT4gOjo9IFNUUklORwotCi0gICAgPGZpZWxkLXR5cGU+IDo6PSBUX0JPT0wgfCBUX0JZVEUgfCBUX0k4IHwgVF9JMTYgfCBUX0kzMiB8IFRfSTY0IHwgVF9ET1VCTEUKLSAgICAgICAgICAgICAgICAgICAgIHwgVF9TVFJJTkcgfCBUX0JJTkFSWSB8IFRfU1RSVUNUIHwgVF9NQVAgfCBUX1NFVCB8IFRfTElTVAotCi0gICAgICA8ZmllbGQtaWQ+IDo6PSBJMTYKLQotICAgIDxmaWVsZC1kYXRhPiA6Oj0gSTggfCBJMTYgfCBJMzIgfCBJNjQgfCBET1VCTEUgfCBTVFJJTkcgfCBCSU5BUlkKLSAgICAgICAgICAgICAgICAgICAgIDxzdHJ1Y3Q+IHwgPG1hcD4gfCA8bGlzdD4gfCA8c2V0PgotCi0gICAgICAgICAgIDxtYXA+IDo6PSA8bWFwLWJlZ2luPiA8ZmllbGQtZGF0dW0+KiA8bWFwLWVuZD4KLQotICAgICA8bWFwLWJlZ2luPiA6Oj0gPG1hcC1rZXktdHlwZT4gPG1hcC12YWx1ZS10eXBlPiA8bWFwLXNpemU+Ci0KLSAgPG1hcC1rZXktdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi08bWFwLXZhbHVlLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICAgPG1hcC1zaXplPiA6Oj0gSTMyCi0KLSAgICAgICAgICA8bGlzdD4gOjo9IDxsaXN0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxsaXN0LWVuZD4KLQotICAgIDxsaXN0LWJlZ2luPiA6Oj0gPGxpc3QtZWxlbS10eXBlPiA8bGlzdC1zaXplPgotCi08bGlzdC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICA8bGlzdC1zaXplPiA6Oj0gSTMyCi0KLSAgICAgICAgICAgPHNldD4gOjo9IDxzZXQtYmVnaW4+IDxmaWVsZC1kYXRhPiogPHNldC1lbmQ+Ci0KLSAgICAgPHNldC1iZWdpbj4gOjo9IDxzZXQtZWxlbS10eXBlPiA8c2V0LXNpemU+Ci0KLSA8c2V0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi0gICAgICA8c2V0LXNpemU+IDo6PSBJMzIKZGlmZiAtLWdpdCBhL2RvYy90aHJpZnQudGV4IGIvZG9jL3RocmlmdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGI3MzcuLjAwMDAwMDAKLS0tIGEvZG9jL3RocmlmdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU3ICswLDAgQEAKLSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJQotJSAgICAgICAgICAgICAgIFRocmlmdCB3aGl0ZXBhcGVyCi0lCi0lIE5hbWU6ICAgICAgICAgdGhyaWZ0LnRleAotJQotJSBBdXRob3JzOiAgICAgIE1hcmsgU2xlZSAobWNzbGVlQGZhY2Vib29rLmNvbSkKLSUKLSUgQ3JlYXRlZDogICAgICAwNSBNYXJjaCAyMDA3Ci0lCi0lIFlvdSB3aWxsIG5lZWQgYSBjb3B5IG9mIHNpZ3BsYW5jb25mLmNscyB0byBmb3JtYXQgdGhpcyBkb2N1bWVudC4KLSUgSXQgaXMgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpZ3BsYW4ub3JnL2F1dGhvckluZm9ybWF0aW9uLmh0bT4uCi0lCi0lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1cZG9jdW1lbnRjbGFzc1tub2NvcHlyaWdodHNwYWNlLGJsb2Nrc3R5bGVde3NpZ3BsYW5jb25mfQotCi1cdXNlcGFja2FnZXthbXNzeW1ifQotXHVzZXBhY2thZ2V7YW1zZm9udHN9Ci1cdXNlcGFja2FnZXthbXNtYXRofQotXHVzZXBhY2thZ2V7dXJsfQotCi1cYmVnaW57ZG9jdW1lbnR9Ci0KLSUgXGNvbmZlcmVuY2VpbmZve1dYWVogJzA1fXtkYXRlLCBDaXR5Ln0KLSUgXGNvcHlyaWdodHllYXJ7MjAwN30KLSUgXGNvcHlyaWdodGRhdGF7W3RvIGJlIHN1cHBsaWVkXX0KLQotJSBcdGl0bGViYW5uZXJ7YmFubmVyIGFib3ZlIHBhcGVyIHRpdGxlfSAgICAgICAgJSBUaGVzZSBhcmUgaWdub3JlZCB1bmxlc3MKLSUgXHByZXByaW50Zm9vdGVye3Nob3J0IGRlc2NyaXB0aW9uIG9mIHBhcGVyfSAgICUgJ3ByZXByaW50JyBvcHRpb24gc3BlY2lmaWVkLgotCi1cdGl0bGV7VGhyaWZ0OiBTY2FsYWJsZSBDcm9zcy1MYW5ndWFnZSBTZXJ2aWNlcyBJbXBsZW1lbnRhdGlvbn0KLVxzdWJ0aXRsZXt9Ci0KLVxhdXRob3JpbmZve01hcmsgU2xlZSwgQWRpdHlhIEFnYXJ3YWwgYW5kIE1hcmMgS3dpYXRrb3dza2l9Ci0gICAgICAgICAgIHtGYWNlYm9vaywgMTU2IFVuaXZlcnNpdHkgQXZlLCBQYWxvIEFsdG8sIENBfQotICAgICAgICAgICB7XHttY3NsZWUsYWRpdHlhLG1hcmNcfUBmYWNlYm9vay5jb219Ci0KLVxtYWtldGl0bGUKLQotXGJlZ2lue2Fic3RyYWN0fQotVGhyaWZ0IGlzIGEgc29mdHdhcmUgbGlicmFyeSBhbmQgc2V0IG9mIGNvZGUtZ2VuZXJhdGlvbiB0b29scyBkZXZlbG9wZWQgYXQKLUZhY2Vib29rIHRvIGV4cGVkaXRlIGRldmVsb3BtZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBlZmZpY2llbnQgYW5kIHNjYWxhYmxlCi1iYWNrZW5kIHNlcnZpY2VzLiBJdHMgcHJpbWFyeSBnb2FsIGlzIHRvIGVuYWJsZSBlZmZpY2llbnQgYW5kIHJlbGlhYmxlCi1jb21tdW5pY2F0aW9uIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYnkgYWJzdHJhY3RpbmcgdGhlIHBvcnRpb25zIG9mIGVhY2gKLWxhbmd1YWdlIHRoYXQgdGVuZCB0byByZXF1aXJlIHRoZSBtb3N0IGN1c3RvbWl6YXRpb24gaW50byBhIGNvbW1vbiBsaWJyYXJ5Ci10aGF0IGlzIGltcGxlbWVudGVkIGluIGVhY2ggbGFuZ3VhZ2UuIFNwZWNpZmljYWxseSwgVGhyaWZ0IGFsbG93cyBkZXZlbG9wZXJzIHRvCi1kZWZpbmUgZGF0YXR5cGVzIGFuZCBzZXJ2aWNlIGludGVyZmFjZXMgaW4gYSBzaW5nbGUgbGFuZ3VhZ2UtbmV1dHJhbCBmaWxlCi1hbmQgZ2VuZXJhdGUgYWxsIHRoZSBuZWNlc3NhcnkgY29kZSB0byBidWlsZCBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KLQotVGhpcyBwYXBlciBkZXRhaWxzIHRoZSBtb3RpdmF0aW9ucyBhbmQgZGVzaWduIGNob2ljZXMgd2UgbWFkZSBpbiBUaHJpZnQsIGFzCi13ZWxsIGFzIHNvbWUgb2YgdGhlIG1vcmUgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gSXQgaXMgbm90Ci1pbnRlbmRlZCB0byBiZSB0YWtlbiBhcyByZXNlYXJjaCwgYnV0IHJhdGhlciBpdCBpcyBhbiBleHBvc2l0aW9uIG9uIHdoYXQgd2UgZGlkCi1hbmQgd2h5LgotXGVuZHthYnN0cmFjdH0KLQotJSBcY2F0ZWdvcnl7RC4zLjN9e1Byb2dyYW1taW5nIExhbmd1YWdlc317TGFuZ3VhZ2UgY29uc3RydWN0cyBhbmQgZmVhdHVyZXN9Ci0KLSVcdGVybXMKLSVMYW5ndWFnZXMsIHNlcmlhbGl6YXRpb24sIHJlbW90ZSBwcm9jZWR1cmUgY2FsbAotCi0lXGtleXdvcmRzCi0lRGF0YSBkZXNjcmlwdGlvbiBsYW5ndWFnZSwgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UsIHJlbW90ZSBwcm9jZWR1cmUgY2FsbAotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb259Ci1BcyBGYWNlYm9vaydzIHRyYWZmaWMgYW5kIG5ldHdvcmsgc3RydWN0dXJlIGhhdmUgc2NhbGVkLCB0aGUgcmVzb3VyY2UKLWRlbWFuZHMgb2YgbWFueSBvcGVyYXRpb25zIG9uIHRoZSBzaXRlIChpLmUuIHNlYXJjaCwKLWFkIHNlbGVjdGlvbiBhbmQgZGVsaXZlcnksIGV2ZW50IGxvZ2dpbmcpIGhhdmUgcHJlc2VudGVkIHRlY2huaWNhbCByZXF1aXJlbWVudHMKLWRyYXN0aWNhbGx5IG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBMQU1QIGZyYW1ld29yay4gSW4gb3VyIGltcGxlbWVudGF0aW9uIG9mCi10aGVzZSBzZXJ2aWNlcywgdmFyaW91cyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvCi1vcHRpbWl6ZSBmb3IgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIHBlcmZvcm1hbmNlLCBlYXNlIGFuZCBzcGVlZCBvZgotZGV2ZWxvcG1lbnQsIGF2YWlsYWJpbGl0eSBvZiBleGlzdGluZyBsaWJyYXJpZXMsIGV0Yy4gQnkgYW5kIGxhcmdlLAotRmFjZWJvb2sncyBlbmdpbmVlcmluZyBjdWx0dXJlIGhhcyB0ZW5kZWQgdG93YXJkcyBjaG9vc2luZyB0aGUgYmVzdAotdG9vbHMgYW5kIGltcGxlbWVudGF0aW9ucyBhdmFpbGFibGUgb3ZlciBzdGFuZGFyZGl6aW5nIG9uIGFueSBvbmUKLXByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBiZWdydWRnaW5nbHkgYWNjZXB0aW5nIGl0cyBpbmhlcmVudCBsaW1pdGF0aW9ucy4KLQotR2l2ZW4gdGhpcyBkZXNpZ24gY2hvaWNlLCB3ZSB3ZXJlIHByZXNlbnRlZCB3aXRoIHRoZSBjaGFsbGVuZ2Ugb2YgYnVpbGRpbmcKLWEgdHJhbnNwYXJlbnQsIGhpZ2gtcGVyZm9ybWFuY2UgYnJpZGdlIGFjcm9zcyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KLVdlIGZvdW5kIHRoYXQgbW9zdCBhdmFpbGFibGUgc29sdXRpb25zIHdlcmUgZWl0aGVyIHRvbyBsaW1pdGVkLCBkaWQgbm90IG9mZmVyCi1zdWZmaWNpZW50IGRhdGF0eXBlIGZyZWVkb20sIG9yIHN1ZmZlcmVkIGZyb20gc3VicGFyIHBlcmZvcm1hbmNlLgotXGZvb3Rub3Rle1NlZSBBcHBlbmRpeCBBIGZvciBhIGRpc2N1c3Npb24gb2YgYWx0ZXJuYXRpdmUgc3lzdGVtcy59Ci0KLVRoZSBzb2x1dGlvbiB0aGF0IHdlIGhhdmUgaW1wbGVtZW50ZWQgY29tYmluZXMgYSBsYW5ndWFnZS1uZXV0cmFsIHNvZnR3YXJlCi1zdGFjayBpbXBsZW1lbnRlZCBhY3Jvc3MgbnVtZXJvdXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBhbiBhc3NvY2lhdGVkIGNvZGUKLWdlbmVyYXRpb24gZW5naW5lIHRoYXQgdHJhbnNmb3JtcyBhIHNpbXBsZSBpbnRlcmZhY2UgYW5kIGRhdGEgZGVmaW5pdGlvbgotbGFuZ3VhZ2UgaW50byBjbGllbnQgYW5kIHNlcnZlciByZW1vdGUgcHJvY2VkdXJlIGNhbGwgbGlicmFyaWVzLgotQ2hvb3Npbmcgc3RhdGljIGNvZGUgZ2VuZXJhdGlvbiBvdmVyIGEgZHluYW1pYyBzeXN0ZW0gYWxsb3dzIHVzIHRvIGNyZWF0ZQotdmFsaWRhdGVkIGNvZGUgdGhhdCBjYW4gYmUgcnVuIHdpdGhvdXQgdGhlIG5lZWQgZm9yCi1hbnkgYWR2YW5jZWQgaW50cm9zcGVjdGl2ZSBydW4tdGltZSB0eXBlIGNoZWNraW5nLiBJdCBpcyBhbHNvIGRlc2lnbmVkIHRvCi1iZSBhcyBzaW1wbGUgYXMgcG9zc2libGUgZm9yIHRoZSBkZXZlbG9wZXIsIHdobyBjYW4gdHlwaWNhbGx5IGRlZmluZSBhbGwKLXRoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBpbnRlcmZhY2VzIGZvciBhIGNvbXBsZXggc2VydmljZSBpbiBhIHNpbmdsZQotc2hvcnQgZmlsZS4KLQotU3VycHJpc2VkIHRoYXQgYSByb2J1c3Qgb3BlbiBzb2x1dGlvbiB0byB0aGVzZSByZWxhdGl2ZWx5IGNvbW1vbiBwcm9ibGVtcwotZGlkIG5vdCB5ZXQgZXhpc3QsIHdlIGNvbW1pdHRlZCBlYXJseSBvbiB0byBtYWtpbmcgdGhlIFRocmlmdCBpbXBsZW1lbnRhdGlvbgotb3BlbiBzb3VyY2UuCi0KLUluIGV2YWx1YXRpbmcgdGhlIGNoYWxsZW5nZXMgb2YgY3Jvc3MtbGFuZ3VhZ2UgaW50ZXJhY3Rpb24gaW4gYSBuZXR3b3JrZWQKLWVudmlyb25tZW50LCBzb21lIGtleSBjb21wb25lbnRzIHdlcmUgaWRlbnRpZmllZDoKLQotXHRleHRpdHtUeXBlcy59IEEgY29tbW9uIHR5cGUgc3lzdGVtIG11c3QgZXhpc3QgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcwotd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHVzZSBjdXN0b20gVGhyaWZ0IGRhdGF0eXBlcwotb3Igd3JpdGUgdGhlaXIgb3duIHNlcmlhbGl6YXRpb24gY29kZS4gVGhhdCBpcywKLWEgQysrIHByb2dyYW1tZXIgc2hvdWxkIGJlIGFibGUgdG8gdHJhbnNwYXJlbnRseSBleGNoYW5nZSBhIHN0cm9uZ2x5IHR5cGVkCi1TVEwgbWFwIGZvciBhIGR5bmFtaWMgUHl0aG9uIGRpY3Rpb25hcnkuIE5laXRoZXIKLXByb2dyYW1tZXIgc2hvdWxkIGJlIGZvcmNlZCB0byB3cml0ZSBhbnkgY29kZSBiZWxvdyB0aGUgYXBwbGljYXRpb24gbGF5ZXIKLXRvIGFjaGlldmUgdGhpcy4gU2VjdGlvbiAyIGRldGFpbHMgdGhlIFRocmlmdCB0eXBlIHN5c3RlbS4KLQotXHRleHRpdHtUcmFuc3BvcnQufSBFYWNoIGxhbmd1YWdlIG11c3QgaGF2ZSBhIGNvbW1vbiBpbnRlcmZhY2UgdG8KLWJpZGlyZWN0aW9uYWwgcmF3IGRhdGEgdHJhbnNwb3J0LiBUaGUgc3BlY2lmaWNzIG9mIGhvdyBhIGdpdmVuCi10cmFuc3BvcnQgaXMgaW1wbGVtZW50ZWQgc2hvdWxkIG5vdCBtYXR0ZXIgdG8gdGhlIHNlcnZpY2UgZGV2ZWxvcGVyLgotVGhlIHNhbWUgYXBwbGljYXRpb24gY29kZSBzaG91bGQgYmUgYWJsZSB0byBydW4gYWdhaW5zdCBUQ1Agc3RyZWFtIHNvY2tldHMsCi1yYXcgZGF0YSBpbiBtZW1vcnksIG9yIGZpbGVzIG9uIGRpc2suIFNlY3Rpb24gMyBkZXRhaWxzIHRoZSBUaHJpZnQgVHJhbnNwb3J0Ci1sYXllci4KLQotXHRleHRpdHtQcm90b2NvbC59IERhdGF0eXBlcyBtdXN0IGhhdmUgc29tZSB3YXkgb2YgdXNpbmcgdGhlIFRyYW5zcG9ydAotbGF5ZXIgdG8gZW5jb2RlIGFuZCBkZWNvZGUgdGhlbXNlbHZlcy4gQWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotZGV2ZWxvcGVyIG5lZWQgbm90IGJlIGNvbmNlcm5lZCBieSB0aGlzIGxheWVyLiBXaGV0aGVyIHRoZSBzZXJ2aWNlIHVzZXMKLWFuIFhNTCBvciBiaW5hcnkgcHJvdG9jb2wgaXMgaW1tYXRlcmlhbCB0byB0aGUgYXBwbGljYXRpb24gY29kZS4KLUFsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCB0aGUgZGF0YSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBpbiBhIGNvbnNpc3RlbnQsCi1kZXRlcm1pbmlzdGljIG1hdHRlci4gU2VjdGlvbiA0IGRldGFpbHMgdGhlIFRocmlmdCBQcm90b2NvbCBsYXllci4KLQotXHRleHRpdHtWZXJzaW9uaW5nLn0gRm9yIHJvYnVzdCBzZXJ2aWNlcywgdGhlIGludm9sdmVkIGRhdGF0eXBlcyBtdXN0Ci1wcm92aWRlIGEgbWVjaGFuaXNtIGZvciB2ZXJzaW9uaW5nIHRoZW1zZWx2ZXMuIFNwZWNpZmljYWxseSwKLWl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhZGQgb3IgcmVtb3ZlIGZpZWxkcyBpbiBhbiBvYmplY3Qgb3IgYWx0ZXIgdGhlCi1hcmd1bWVudCBsaXN0IG9mIGEgZnVuY3Rpb24gd2l0aG91dCBhbnkgaW50ZXJydXB0aW9uIGluIHNlcnZpY2UgKG9yLAotd29yc2UgeWV0LCBuYXN0eSBzZWdtZW50YXRpb24gZmF1bHRzKS4gU2VjdGlvbiA1IGRldGFpbHMgVGhyaWZ0J3MgdmVyc2lvbmluZwotc3lzdGVtLgotCi1cdGV4dGl0e1Byb2Nlc3NvcnMufSBGaW5hbGx5LCB3ZSBnZW5lcmF0ZSBjb2RlIGNhcGFibGUgb2YgcHJvY2Vzc2luZyBkYXRhCi1zdHJlYW1zIHRvIGFjY29tcGxpc2ggcmVtb3RlIHByb2NlZHVyZSBjYWxscy4gU2VjdGlvbiA2IGRldGFpbHMgdGhlIGdlbmVyYXRlZAotY29kZSBhbmQgVFByb2Nlc3NvciBwYXJhZGlnbS4KLQotU2VjdGlvbiA3IGRpc2N1c3NlcyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBhbmQgU2VjdGlvbiA4IGRlc2NyaWJlcwotb3VyIGNvbmNsdXNpb25zLgotCi1cc2VjdGlvbntUeXBlc30KLQotVGhlIGdvYWwgb2YgdGhlIFRocmlmdCB0eXBlIHN5c3RlbSBpcyB0byBlbmFibGUgcHJvZ3JhbW1lcnMgdG8gZGV2ZWxvcCB1c2luZwotY29tcGxldGVseSBuYXRpdmVseSBkZWZpbmVkIHR5cGVzLCBubyBtYXR0ZXIgd2hhdCBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGV5Ci11c2UuIEJ5IGRlc2lnbiwgdGhlIFRocmlmdCB0eXBlIHN5c3RlbSBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHNwZWNpYWwgZHluYW1pYwotdHlwZXMgb3Igd3JhcHBlciBvYmplY3RzLiBJdCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0aGUgZGV2ZWxvcGVyIHdyaXRlCi1hbnkgY29kZSBmb3Igb2JqZWN0IHNlcmlhbGl6YXRpb24gb3IgdHJhbnNwb3J0LiBUaGUgVGhyaWZ0IElETCAoSW50ZXJmYWNlCi1EZWZpbml0aW9uIExhbmd1YWdlKSBmaWxlIGlzCi1sb2dpY2FsbHkgYSB3YXkgZm9yIGRldmVsb3BlcnMgdG8gYW5ub3RhdGUgdGhlaXIgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdGhlCi1taW5pbWFsIGFtb3VudCBvZiBleHRyYSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gdGVsbCBhIGNvZGUgZ2VuZXJhdG9yCi1ob3cgdG8gc2FmZWx5IHRyYW5zcG9ydCB0aGUgb2JqZWN0cyBhY3Jvc3MgbGFuZ3VhZ2VzLgotCi1cc3Vic2VjdGlvbntCYXNlIFR5cGVzfQotCi1UaGUgdHlwZSBzeXN0ZW0gcmVzdHMgdXBvbiBhIGZldyBiYXNlIHR5cGVzLiBJbiBjb25zaWRlcmluZyB3aGljaCB0eXBlcyB0bwotc3VwcG9ydCwgd2UgYWltZWQgZm9yIGNsYXJpdHkgYW5kIHNpbXBsaWNpdHkgb3ZlciBhYnVuZGFuY2UsIGZvY3VzaW5nCi1vbiB0aGUga2V5IHR5cGVzIGF2YWlsYWJsZSBpbiBhbGwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBvbW1pdHRpbmcgYW55Ci1uaWNoZSB0eXBlcyBhdmFpbGFibGUgb25seSBpbiBzcGVjaWZpYyBsYW5ndWFnZXMuCi0KLVRoZSBiYXNlIHR5cGVzIHN1cHBvcnRlZCBieSBUaHJpZnQgYXJlOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcdGV4dHR0e2Jvb2x9IEEgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBvciBmYWxzZQotXGl0ZW0gXHRleHR0dHtieXRlfSBBIHNpZ25lZCBieXRlCi1caXRlbSBcdGV4dHR0e2kxNn0gQSAxNi1iaXQgc2lnbmVkIGludGVnZXIKLVxpdGVtIFx0ZXh0dHR7aTMyfSBBIDMyLWJpdCBzaWduZWQgaW50ZWdlcgotXGl0ZW0gXHRleHR0dHtpNjR9IEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCi1caXRlbSBcdGV4dHR0e2RvdWJsZX0gQSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi1caXRlbSBcdGV4dHR0e3N0cmluZ30gQW4gZW5jb2RpbmctYWdub3N0aWMgdGV4dCBvciBiaW5hcnkgc3RyaW5nCi1caXRlbSBcdGV4dHR0e2JpbmFyeX0gQSBieXRlIGFycmF5IHJlcHJlc2VudGF0aW9uIGZvciBibG9icwotXGVuZHtpdGVtaXplfQotCi1PZiBwYXJ0aWN1bGFyIG5vdGUgaXMgdGhlIGFic2VuY2Ugb2YgdW5zaWduZWQgaW50ZWdlciB0eXBlcy4gQmVjYXVzZSB0aGVzZQotdHlwZXMgaGF2ZSBubyBkaXJlY3QgdHJhbnNsYXRpb24gdG8gbmF0aXZlIHByaW1pdGl2ZSB0eXBlcyBpbiBtYW55IGxhbmd1YWdlcywKLXRoZSBhZHZhbnRhZ2VzIHRoZXkgYWZmb3JkIGFyZSBsb3N0LiBGdXJ0aGVyLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJldmVudCB0aGUKLWFwcGxpY2F0aW9uIGRldmVsb3BlciBpbiBhIGxhbmd1YWdlIGxpa2UgUHl0aG9uIGZyb20gYXNzaWduaW5nIGEgbmVnYXRpdmUgdmFsdWUKLXRvIGFuIGludGVnZXIgdmFyaWFibGUsIGxlYWRpbmcgdG8gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4gRnJvbSBhIGRlc2lnbgotc3RhbmRwb2ludCwgd2Ugb2JzZXJ2ZWQgdGhhdCB1bnNpZ25lZCBpbnRlZ2VycyB3ZXJlIHZlcnkgcmFyZWx5LCBpZiBldmVyLCB1c2VkCi1mb3IgYXJpdGhtZXRpYyBwdXJwb3NlcywgYnV0IGluIHByYWN0aWNlIHdlcmUgbXVjaCBtb3JlIG9mdGVuIHVzZWQgYXMga2V5cyBvcgotaWRlbnRpZmllcnMuIEluIHRoaXMgY2FzZSwgdGhlIHNpZ24gaXMgaXJyZWxldmFudC4gU2lnbmVkIGludGVnZXJzIHNlcnZlIHRoaXMKLXNhbWUgcHVycG9zZSBhbmQgY2FuIGJlIHNhZmVseSBjYXN0IHRvIHRoZWlyIHVuc2lnbmVkIGNvdW50ZXJwYXJ0cyAobW9zdAotY29tbW9ubHkgaW4gQysrKSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1cc3Vic2VjdGlvbntTdHJ1Y3RzfQotCi1BIFRocmlmdCBzdHJ1Y3QgZGVmaW5lcyBhIGNvbW1vbiBvYmplY3QgdG8gYmUgdXNlZCBhY3Jvc3MgbGFuZ3VhZ2VzLiBBIHN0cnVjdAotaXMgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBhIGNsYXNzIGluIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZwotbGFuZ3VhZ2VzLiBBIHN0cnVjdCBoYXMgYSBzZXQgb2Ygc3Ryb25nbHkgdHlwZWQgZmllbGRzLCBlYWNoIHdpdGggYSB1bmlxdWUKLW5hbWUgaWRlbnRpZmllci4gVGhlIGJhc2ljIHN5bnRheCBmb3IgZGVmaW5pbmcgYSBUaHJpZnQgc3RydWN0IGxvb2tzIHZlcnkKLXNpbWlsYXIgdG8gYSBDIHN0cnVjdCBkZWZpbml0aW9uLiBGaWVsZHMgbWF5IGJlIGFubm90YXRlZCB3aXRoIGFuIGludGVnZXIgZmllbGQKLWlkZW50aWZpZXIgKHVuaXF1ZSB0byB0aGUgc2NvcGUgb2YgdGhhdCBzdHJ1Y3QpIGFuZCBvcHRpb25hbCBkZWZhdWx0IHZhbHVlcy4KLUZpZWxkIGlkZW50aWZpZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZiBvbWl0dGVkLCB0aG91Z2ggdGhleSBhcmUKLXN0cm9uZ2x5IGVuY291cmFnZWQgZm9yIHZlcnNpb25pbmcgcmVhc29ucyBkaXNjdXNzZWQgbGF0ZXIuCi0KLVxzdWJzZWN0aW9ue0NvbnRhaW5lcnN9Ci0KLVRocmlmdCBjb250YWluZXJzIGFyZSBzdHJvbmdseSB0eXBlZCBjb250YWluZXJzIHRoYXQgbWFwIHRvIHRoZSBtb3N0IGNvbW1vbmx5Ci11c2VkIGNvbnRhaW5lcnMgaW4gY29tbW9uIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gVGhleSBhcmUgYW5ub3RhdGVkIHVzaW5nCi10aGUgQysrIHRlbXBsYXRlIChvciBKYXZhIEdlbmVyaWNzKSBzdHlsZS4gVGhlcmUgYXJlIHRocmVlIHR5cGVzIGF2YWlsYWJsZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHRleHR0dHtsaXN0PHR5cGU+fSBBbiBvcmRlcmVkIGxpc3Qgb2YgZWxlbWVudHMuIFRyYW5zbGF0ZXMgZGlyZWN0bHkgaW50bwotYW4gU1RMIFx0ZXh0dHR7dmVjdG9yfSwgSmF2YSBcdGV4dHR0e0FycmF5TGlzdH0sIG9yIG5hdGl2ZSBhcnJheSBpbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiBNYXkKLWNvbnRhaW4gZHVwbGljYXRlcy4KLVxpdGVtIFx0ZXh0dHR7c2V0PHR5cGU+fSBBbiB1bm9yZGVyZWQgc2V0IG9mIHVuaXF1ZSBlbGVtZW50cy4gVHJhbnNsYXRlcyBpbnRvCi1hbiBTVEwgXHRleHR0dHtzZXR9LCBKYXZhIFx0ZXh0dHR7SGFzaFNldH0sIFx0ZXh0dHR7c2V0fSBpbiBQeXRob24sIG9yIG5hdGl2ZQotZGljdGlvbmFyeSBpbiBQSFAvUnVieS4KLVxpdGVtIFx0ZXh0dHR7bWFwPHR5cGUxLHR5cGUyPn0gQSBtYXAgb2Ygc3RyaWN0bHkgdW5pcXVlIGtleXMgdG8gdmFsdWVzCi1UcmFuc2xhdGVzIGludG8gYW4gU1RMIFx0ZXh0dHR7bWFwfSwgSmF2YSBcdGV4dHR0e0hhc2hNYXB9LCBQSFAgYXNzb2NpYXRpdmUKLWFycmF5LCBvciBQeXRob24vUnVieSBkaWN0aW9uYXJ5LgotXGVuZHtpdGVtaXplfQotCi1XaGlsZSBkZWZhdWx0cyBhcmUgcHJvdmlkZWQsIHRoZSB0eXBlIG1hcHBpbmdzIGFyZSBub3QgZXhwbGljaXRseSBmaXhlZC4gQ3VzdG9tCi1jb2RlIGdlbmVyYXRvciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBhZGRlZCB0byBzdWJzdGl0dXRlIGN1c3RvbSB0eXBlcyBpbgotZGVzdGluYXRpb24gbGFuZ3VhZ2VzIChpLmUuCi1cdGV4dHR0e2hhc2hcX21hcH0gb3IgR29vZ2xlJ3Mgc3BhcnNlIGhhc2ggbWFwIGNhbiBiZSB1c2VkIGluIEMrKykuIFRoZQotb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSBjdXN0b20gdHlwZXMgc3VwcG9ydCBhbGwgdGhlIG5lY2Vzc2FyeSBpdGVyYXRpb24KLXByaW1pdGl2ZXMuIENvbnRhaW5lciBlbGVtZW50cyBtYXkgYmUgb2YgYW55IHZhbGlkIFRocmlmdCB0eXBlLCBpbmNsdWRpbmcgb3RoZXIKLWNvbnRhaW5lcnMgb3Igc3RydWN0cy4KLQotXGJlZ2lue3ZlcmJhdGltfQotc3RydWN0IEV4YW1wbGUgewotICAxOmkzMiBudW1iZXI9MTAsCi0gIDI6aTY0IGJpZ051bWJlciwKLSAgMzpkb3VibGUgZGVjaW1hbHMsCi0gIDQ6c3RyaW5nIG5hbWU9InRocmlmdHkiCi19XGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhlIHRhcmdldCBsYW5ndWFnZSwgZWFjaCBkZWZpbml0aW9uIGdlbmVyYXRlcyBhIHR5cGUgd2l0aCB0d28gbWV0aG9kcywKLVx0ZXh0dHR7cmVhZH0gYW5kIFx0ZXh0dHR7d3JpdGV9LCB3aGljaCBwZXJmb3JtIHNlcmlhbGl6YXRpb24gYW5kIHRyYW5zcG9ydAotb2YgdGhlIG9iamVjdHMgdXNpbmcgYSBUaHJpZnQgVFByb3RvY29sIG9iamVjdC4KLQotXHN1YnNlY3Rpb257RXhjZXB0aW9uc30KLQotRXhjZXB0aW9ucyBhcmUgc3ludGFjdGljYWxseSBhbmQgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gc3RydWN0cyBleGNlcHQKLXRoYXQgdGhleSBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIFx0ZXh0dHR7ZXhjZXB0aW9ufSBrZXl3b3JkIGluc3RlYWQgb2YgdGhlCi1cdGV4dHR0e3N0cnVjdH0ga2V5d29yZC4KLQotVGhlIGdlbmVyYXRlZCBvYmplY3RzIGluaGVyaXQgZnJvbSBhbiBleGNlcHRpb24gYmFzZSBjbGFzcyBhcyBhcHByb3ByaWF0ZQotaW4gZWFjaCB0YXJnZXQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGluIG9yZGVyIHRvIHNlYW1sZXNzbHkKLWludGVncmF0ZSB3aXRoIG5hdGl2ZSBleGNlcHRpb24gaGFuZGxpbmcgaW4gYW55IGdpdmVuCi1sYW5ndWFnZS4gQWdhaW4sIHRoZSBkZXNpZ24gZW1waGFzaXMgaXMgb24gbWFraW5nIHRoZSBjb2RlIGZhbWlsaWFyIHRvIHRoZQotYXBwbGljYXRpb24gZGV2ZWxvcGVyLgotCi1cc3Vic2VjdGlvbntTZXJ2aWNlc30KLQotU2VydmljZXMgYXJlIGRlZmluZWQgdXNpbmcgVGhyaWZ0IHR5cGVzLiBEZWZpbml0aW9uIG9mIGEgc2VydmljZSBpcwotc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gZGVmaW5pbmcgYW4gaW50ZXJmYWNlIChvciBhIHB1cmUgdmlydHVhbCBhYnN0cmFjdAotY2xhc3MpIGluIG9iamVjdCBvcmllbnRlZAotcHJvZ3JhbW1pbmcuIFRoZSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIGZ1bGx5IGZ1bmN0aW9uYWwgY2xpZW50IGFuZAotc2VydmVyIHN0dWJzIHRoYXQgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UuIFNlcnZpY2VzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNlcnZpY2UgPG5hbWU+IHsKLSAgPHJldHVybnR5cGU+IDxuYW1lPig8YXJndW1lbnRzPikKLSAgICBbdGhyb3dzICg8ZXhjZXB0aW9ucz4pXQotICAuLi4KLX1cZW5ke3ZlcmJhdGltfQotCi1BbiBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXJ2aWNlIFN0cmluZ0NhY2hlIHsKLSAgdm9pZCBzZXQoMTppMzIga2V5LCAyOnN0cmluZyB2YWx1ZSksCi0gIHN0cmluZyBnZXQoMTppMzIga2V5KSB0aHJvd3MgKDE6S2V5Tm90Rm91bmQga25mKSwKLSAgdm9pZCBkZWxldGUoMTppMzIga2V5KQotfQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IFx0ZXh0dHR7dm9pZH0gaXMgYSB2YWxpZCB0eXBlIGZvciBhIGZ1bmN0aW9uIHJldHVybiwgaW4gYWRkaXRpb24gdG8KLWFsbCBvdGhlciBkZWZpbmVkIFRocmlmdCB0eXBlcy4gQWRkaXRpb25hbGx5LCBhbiBcdGV4dHR0e2FzeW5jfSBtb2RpZmllcgota2V5d29yZCBtYXkgYmUgYWRkZWQgdG8gYSBcdGV4dHR0e3ZvaWR9IGZ1bmN0aW9uLCB3aGljaCB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdCBkb2VzCi1ub3Qgd2FpdCBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIE5vdGUgdGhhdCBhIHB1cmUgXHRleHR0dHt2b2lkfQotZnVuY3Rpb24gd2lsbCByZXR1cm4gYSByZXNwb25zZSB0byB0aGUgY2xpZW50IHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUKLW9wZXJhdGlvbiBoYXMgY29tcGxldGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS4gV2l0aCBcdGV4dHR0e2FzeW5jfSBtZXRob2QgY2FsbHMKLXRoZSBjbGllbnQgd2lsbCBvbmx5IGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmVxdWVzdCBzdWNjZWVkZWQgYXQgdGhlCi10cmFuc3BvcnQgbGF5ZXIuIChJbiBtYW55IHRyYW5zcG9ydCBzY2VuYXJpb3MgdGhpcyBpcyBpbmhlcmVudGx5IHVucmVsaWFibGUKLWR1ZSB0byB0aGUgQnl6YW50aW5lIEdlbmVyYWxzJyBQcm9ibGVtLiBUaGVyZWZvcmUsIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMKLXNob3VsZCB0YWtlIGNhcmUgb25seSB0byB1c2UgdGhlIGFzeW5jIG9wdGltaXphdGlvbiBpbiBjYXNlcyB3aGVyZSBkcm9wcGVkCi1tZXRob2QgY2FsbHMgYXJlIGFjY2VwdGFibGUgb3IgdGhlIHRyYW5zcG9ydCBpcyBrbm93biB0byBiZSByZWxpYWJsZS4pCi0KLUFsc28gb2Ygbm90ZSBpcyB0aGUgZmFjdCB0aGF0IGFyZ3VtZW50IGxpc3RzIGFuZCBleGNlcHRpb24gbGlzdHMgZm9yIGZ1bmN0aW9ucwotYXJlIGltcGxlbWVudGVkIGFzIFRocmlmdCBzdHJ1Y3RzLiBBbGwgdGhyZWUgY29uc3RydWN0cyBhcmUgaWRlbnRpY2FsIGluIGJvdGgKLW5vdGF0aW9uIGFuZCBiZWhhdmlvci4KLQotXHNlY3Rpb257VHJhbnNwb3J0fQotCi1UaGUgdHJhbnNwb3J0IGxheWVyIGlzIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIHRvIGZhY2lsaXRhdGUgZGF0YSB0cmFuc2Zlci4KLQotXHN1YnNlY3Rpb257SW50ZXJmYWNlfQotCi1BIGtleSBkZXNpZ24gY2hvaWNlIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQgd2FzIHRvIGRlY291cGxlIHRoZQotdHJhbnNwb3J0IGxheWVyIGZyb20gdGhlIGNvZGUgZ2VuZXJhdGlvbiBsYXllci4gVGhvdWdoIFRocmlmdCBpcyB0eXBpY2FsbHkKLXVzZWQgb24gdG9wIG9mIHRoZSBUQ1AvSVAgc3RhY2sgd2l0aCBzdHJlYW1pbmcgc29ja2V0cyBhcyB0aGUgYmFzZSBsYXllciBvZgotY29tbXVuaWNhdGlvbiwgdGhlcmUgd2FzIG5vIGNvbXBlbGxpbmcgcmVhc29uIHRvIGJ1aWxkIHRoYXQgY29uc3RyYWludCBpbnRvCi10aGUgc3lzdGVtLiBUaGUgcGVyZm9ybWFuY2UgdHJhZGVvZmYgaW5jdXJyZWQgYnkgYW4gYWJzdHJhY3RlZCBJL08gbGF5ZXIKLShyb3VnaGx5IG9uZSB2aXJ0dWFsIG1ldGhvZCBsb29rdXAgLyBmdW5jdGlvbiBjYWxsIHBlciBvcGVyYXRpb24pIHdhcwotaW1tYXRlcmlhbCBjb21wYXJlZCB0byB0aGUgY29zdCBvZiBhY3R1YWwgSS9PIG9wZXJhdGlvbnMgKHR5cGljYWxseSBpbnZva2luZwotc3lzdGVtIGNhbGxzKS4KLQotRnVuZGFtZW50YWxseSwgZ2VuZXJhdGVkIFRocmlmdCBjb2RlIG9ubHkgbmVlZHMgdG8ga25vdyBob3cgdG8gcmVhZCBhbmQKLXdyaXRlIGRhdGEuIFRoZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIG9mIHRoZSBkYXRhIGFyZSBpcnJlbGV2YW50OyBpdCBtYXkgYmUgYQotc29ja2V0LCBhIHNlZ21lbnQgb2Ygc2hhcmVkIG1lbW9yeSwgb3IgYSBmaWxlIG9uIHRoZSBsb2NhbCBkaXNrLiBUaGUgVGhyaWZ0Ci10cmFuc3BvcnQgaW50ZXJmYWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcdGV4dHR0e29wZW59IE9wZW5zIHRoZSB0cmFucHNvcnQKLVxpdGVtIFx0ZXh0dHR7Y2xvc2V9IENsb3NlcyB0aGUgdHJhbnBvcnQKLVxpdGVtIFx0ZXh0dHR7aXNPcGVufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KLVxpdGVtIFx0ZXh0dHR7cmVhZH0gUmVhZHMgZnJvbSB0aGUgdHJhbnNwb3J0Ci1caXRlbSBcdGV4dHR0e3dyaXRlfSBXcml0ZXMgdG8gdGhlIHRyYW5zcG9ydAotXGl0ZW0gXHRleHR0dHtmbHVzaH0gRm9yY2VzIGFueSBwZW5kaW5nIHdyaXRlcwotXGVuZHtpdGVtaXplfQotCi1UaGVyZSBhcmUgYSBmZXcgYWRkaXRpb25hbCBtZXRob2RzIG5vdCBkb2N1bWVudGVkIGhlcmUgd2hpY2ggYXJlIHVzZWQgdG8gYWlkCi1pbiBiYXRjaGluZyByZWFkcyBhbmQgb3B0aW9uYWxseSBzaWduYWxpbmcgdGhlIGNvbXBsZXRpb24gb2YgYSByZWFkIG9yCi13cml0ZSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZQotXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UsIHRoZXJlIGlzIGFcXAotXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSBpbnRlcmZhY2UKLXVzZWQgdG8gYWNjZXB0IG9yIGNyZWF0ZSBwcmltaXRpdmUgdHJhbnNwb3J0IG9iamVjdHMuIEl0cyBpbnRlcmZhY2UgaXMgYXMKLWZvbGxvd3M6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHRleHR0dHtvcGVufSBPcGVucyB0aGUgdHJhbnNwb3J0Ci1caXRlbSBcdGV4dHR0e2xpc3Rlbn0gQmVnaW5zIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMKLVxpdGVtIFx0ZXh0dHR7YWNjZXB0fSBSZXR1cm5zIGEgbmV3IGNsaWVudCB0cmFuc3BvcnQKLVxpdGVtIFx0ZXh0dHR7Y2xvc2V9IENsb3NlcyB0aGUgdHJhbnNwb3J0Ci1cZW5ke2l0ZW1pemV9Ci0KLVxzdWJzZWN0aW9ue0ltcGxlbWVudGF0aW9ufQotCi1UaGUgdHJhbnNwb3J0IGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb3Igc2ltcGxlIGltcGxlbWVudGF0aW9uIGluIGFueQotcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIE5ldyB0cmFuc3BvcnQgbWVjaGFuaXNtcyBjYW4gYmUgZWFzaWx5IGRlZmluZWQgYXMgbmVlZGVkCi1ieSBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzLgotCi1cc3Vic3Vic2VjdGlvbntUU29ja2V0fQotCi1UaGUgXHRleHR0dHtUU29ja2V0fSBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhY3Jvc3MgYWxsIHRhcmdldCBsYW5ndWFnZXMuIEl0Ci1wcm92aWRlcyBhIGNvbW1vbiwgc2ltcGxlIGludGVyZmFjZSB0byBhIFRDUC9JUCBzdHJlYW0gc29ja2V0LgotCi1cc3Vic3Vic2VjdGlvbntURmlsZVRyYW5zcG9ydH0KLQotVGhlIFx0ZXh0dHR7VEZpbGVUcmFuc3BvcnR9IGlzIGFuIGFic3RyYWN0aW9uIG9mIGFuIG9uLWRpc2sgZmlsZSB0byBhIGRhdGEKLXN0cmVhbS4gSXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgb3V0IGEgc2V0IG9mIGluY29taW5nIFRocmlmdCByZXF1ZXN0cyB0byBhIGZpbGUKLW9uIGRpc2suIFRoZSBvbi1kaXNrIGRhdGEgY2FuIHRoZW4gYmUgcmVwbGF5ZWQgZnJvbSB0aGUgbG9nLCBlaXRoZXIgZm9yCi1wb3N0LXByb2Nlc3Npbmcgb3IgZm9yIHJlcHJvZHVjdGlvbiBhbmQvb3Igc2ltdWxhdGlvbiBvZiBwYXN0IGV2ZW50cy4KLQotXHN1YnN1YnNlY3Rpb257VXRpbGl0aWVzfQotCi1UaGUgVHJhbnNwb3J0IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGVhc3kgZXh0ZW5zaW9uIHVzaW5nIGNvbW1vbgotT09QIHRlY2huaXF1ZXMsIHN1Y2ggYXMgY29tcG9zaXRpb24uIFNvbWUgc2ltcGxlIHV0aWxpdGVzIGluY2x1ZGUgdGhlCi1cdGV4dHR0e1RCdWZmZXJlZFRyYW5zcG9ydH0sIHdoaWNoIGJ1ZmZlcnMgdGhlIHdyaXRlcyBhbmQgcmVhZHMgb24gYW4KLXVuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGUgXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fSwgd2hpY2ggdHJhbnNtaXRzIGRhdGEgd2l0aCBmcmFtZQotc2l6ZSBoZWFkZXJzIGZvciBjaHVua2luZyBvcHRpbWl6YXRpb24gb3Igbm9uYmxvY2tpbmcgb3BlcmF0aW9uLCBhbmQgdGhlCi1cdGV4dHR0e1RNZW1vcnlCdWZmZXJ9LCB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGluZyBkaXJlY3RseSBmcm9tIHRoZSBoZWFwCi1vciBzdGFjayBtZW1vcnkgb3duZWQgYnkgdGhlIHByb2Nlc3MuCi0KLVxzZWN0aW9ue1Byb3RvY29sfQotCi1BIHNlY29uZCBtYWpvciBhYnN0cmFjdGlvbiBpbiBUaHJpZnQgaXMgdGhlIHNlcGFyYXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgZnJvbQotdHJhbnNwb3J0IHJlcHJlc2VudGF0aW9uLiBUaHJpZnQgZW5mb3JjZXMgYSBjZXJ0YWluIG1lc3NhZ2luZyBzdHJ1Y3R1cmUgd2hlbgotdHJhbnNwb3J0aW5nIGRhdGEsIGJ1dCBpdCBpcyBhZ25vc3RpYyB0byB0aGUgcHJvdG9jb2wgZW5jb2RpbmcgaW4gdXNlLiBUaGF0IGlzLAotaXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgZGF0YSBpcyBlbmNvZGVkIGFzIFhNTCwgaHVtYW4tcmVhZGFibGUgQVNDSUksIG9yIGEKLWRlbnNlIGJpbmFyeSBmb3JtYXQgYXMgbG9uZyBhcyB0aGUgZGF0YSBzdXBwb3J0cyBhIGZpeGVkIHNldCBvZiBvcGVyYXRpb25zCi10aGF0IGFsbG93IGl0IHRvIGJlIGRldGVybWluaXN0aWNhbGx5IHJlYWQgYW5kIHdyaXR0ZW4gYnkgZ2VuZXJhdGVkIGNvZGUuCi0KLVxzdWJzZWN0aW9ue0ludGVyZmFjZX0KLQotVGhlIFRocmlmdCBQcm90b2NvbCBpbnRlcmZhY2UgaXMgdmVyeSBzdHJhaWdodGZvcndhcmQuIEl0IGZ1bmRhbWVudGFsbHkKLXN1cHBvcnRzIHR3byB0aGluZ3M6IDEpIGJpZGlyZWN0aW9uYWwgc2VxdWVuY2VkIG1lc3NhZ2luZywgYW5kCi0yKSBlbmNvZGluZyBvZiBiYXNlIHR5cGVzLCBjb250YWluZXJzLCBhbmQgc3RydWN0cy4KLQotXGJlZ2lue3ZlcmJhdGltfQotd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxKQotd3JpdGVNZXNzYWdlRW5kKCkKLXdyaXRlU3RydWN0QmVnaW4obmFtZSkKLXdyaXRlU3RydWN0RW5kKCkKLXdyaXRlRmllbGRCZWdpbihuYW1lLCB0eXBlLCBpZCkKLXdyaXRlRmllbGRFbmQoKQotd3JpdGVGaWVsZFN0b3AoKQotd3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCi13cml0ZU1hcEVuZCgpCi13cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKLXdyaXRlTGlzdEVuZCgpCi13cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQotd3JpdGVTZXRFbmQoKQotd3JpdGVCb29sKGJvb2wpCi13cml0ZUJ5dGUoYnl0ZSkKLXdyaXRlSTE2KGkxNikKLXdyaXRlSTMyKGkzMikKLXdyaXRlSTY0KGk2NCkKLXdyaXRlRG91YmxlKGRvdWJsZSkKLXdyaXRlU3RyaW5nKHN0cmluZykKLQotbmFtZSwgdHlwZSwgc2VxID0gcmVhZE1lc3NhZ2VCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkTWVzc2FnZUVuZCgpCi1uYW1lID0gICAgICAgICAgICByZWFkU3RydWN0QmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdEVuZCgpCi1uYW1lLCB0eXBlLCBpZCA9ICByZWFkRmllbGRCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkRmllbGRFbmQoKQotaywgdiwgc2l6ZSA9ICAgICAgcmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICAgICAgICAgIHJlYWRNYXBFbmQoKQotZXR5cGUsIHNpemUgPSAgICAgcmVhZExpc3RCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkTGlzdEVuZCgpCi1ldHlwZSwgc2l6ZSA9ICAgICByZWFkU2V0QmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZFNldEVuZCgpCi1ib29sID0gICAgICAgICAgICByZWFkQm9vbCgpCi1ieXRlID0gICAgICAgICAgICByZWFkQnl0ZSgpCi1pMTYgPSAgICAgICAgICAgICByZWFkSTE2KCkKLWkzMiA9ICAgICAgICAgICAgIHJlYWRJMzIoKQotaTY0ID0gICAgICAgICAgICAgcmVhZEk2NCgpCi1kb3VibGUgPSAgICAgICAgICByZWFkRG91YmxlKCkKLXN0cmluZyA9ICAgICAgICAgIHJlYWRTdHJpbmcoKQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGV2ZXJ5IFx0ZXh0dHR7d3JpdGV9IGZ1bmN0aW9uIGhhcyBleGFjdGx5IG9uZSBcdGV4dHR0e3JlYWR9IGNvdW50ZXJwYXJ0LCB3aXRoCi10aGUgZXhjZXB0aW9uIG9mIFx0ZXh0dHR7d3JpdGVGaWVsZFN0b3AoKX0uIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhvZAotdGhhdCBzaWduYWxzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuIFRoZSBwcm9jZWR1cmUgZm9yIHJlYWRpbmcgYSBzdHJ1Y3QgaXMgdG8KLVx0ZXh0dHR7cmVhZEZpZWxkQmVnaW4oKX0gdW50aWwgdGhlIHN0b3AgZmllbGQgaXMgZW5jb3VudGVyZWQsIGFuZCB0aGVuIHRvCi1cdGV4dHR0e3JlYWRTdHJ1Y3RFbmQoKX0uICBUaGUKLWdlbmVyYXRlZCBjb2RlIHJlbGllcyB1cG9uIHRoaXMgY2FsbCBzZXF1ZW5jZSB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIHdyaXR0ZW4gYnkKLWEgcHJvdG9jb2wgZW5jb2RlciBjYW4gYmUgcmVhZCBieSBhIG1hdGNoaW5nIHByb3RvY29sIGRlY29kZXIuIEZ1cnRoZXIgbm90ZQotdGhhdCB0aGlzIHNldCBvZiBmdW5jdGlvbnMgaXMgYnkgZGVzaWduIG1vcmUgcm9idXN0IHRoYW4gbmVjZXNzYXJ5LgotRm9yIGV4YW1wbGUsIFx0ZXh0dHR7d3JpdGVTdHJ1Y3RFbmQoKX0gaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYXMgdGhlIGVuZCBvZgotYSBzdHJ1Y3QgbWF5IGJlIGltcGxpZWQgYnkgdGhlIHN0b3AgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgZm9yCi12ZXJib3NlIHByb3RvY29scyBpbiB3aGljaCBpdCBpcyBjbGVhbmVyIHRvIHNlcGFyYXRlIHRoZXNlIGNhbGxzIChlLmcuIGEgY2xvc2luZwotXHRleHR0dHs8L3N0cnVjdD59IHRhZyBpbiBYTUwpLgotCi1cc3Vic2VjdGlvbntTdHJ1Y3R1cmV9Ci0KLVRocmlmdCBzdHJ1Y3R1cmVzIGFyZSBkZXNpZ25lZCB0byBzdXBwb3J0IGVuY29kaW5nIGludG8gYSBzdHJlYW1pbmcKLXByb3RvY29sLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG5ldmVyIG5lZWQgdG8gZnJhbWUgb3IgY29tcHV0ZSB0aGUKLWVudGlyZSBkYXRhIGxlbmd0aCBvZiBhIHN0cnVjdHVyZSBwcmlvciB0byBlbmNvZGluZyBpdC4gVGhpcyBpcyBjcml0aWNhbCB0bwotcGVyZm9ybWFuY2UgaW4gbWFueSBzY2VuYXJpb3MuIENvbnNpZGVyIGEgbG9uZyBsaXN0IG9mIHJlbGF0aXZlbHkgbGFyZ2UKLXN0cmluZ3MuIElmIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgcmVxdWlyZWQgcmVhZGluZyBvciB3cml0aW5nIGEgbGlzdCB0byBiZSBhbgotYXRvbWljIG9wZXJhdGlvbiwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBwZXJmb3JtIGEgbGluZWFyIHBhc3Mgb3ZlciB0aGUKLWVudGlyZSBsaXN0IGJlZm9yZSBlbmNvZGluZyBhbnkgZGF0YS4gSG93ZXZlciwgaWYgdGhlIGxpc3QgY2FuIGJlIHdyaXR0ZW4KLWFzIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQsIHRoZSBjb3JyZXNwb25kaW5nIHJlYWQgbWF5IGJlZ2luIGluIHBhcmFsbGVsLAotdGhlb3JldGljYWxseSBvZmZlcmluZyBhbiBlbmQtdG8tZW5kIHNwZWVkdXAgb2YgJChrTiAtIEMpJCwgd2hlcmUgJE4kIGlzIHRoZSBzaXplCi1vZiB0aGUgbGlzdCwgJGskIHRoZSBjb3N0IGZhY3RvciBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgYSBzaW5nbGUKLWVsZW1lbnQsIGFuZCAkQyQgaXMgZml4ZWQgb2Zmc2V0IGZvciB0aGUgZGVsYXkgYmV0d2VlbiBkYXRhIGJlaW5nIHdyaXR0ZW4KLWFuZCBiZWNvbWluZyBhdmFpbGFibGUgdG8gcmVhZC4KLQotU2ltaWxhcmx5LCBzdHJ1Y3RzIGRvIG5vdCBlbmNvZGUgdGhlaXIgZGF0YSBsZW5ndGhzIGEgcHJpb3JpLiBJbnN0ZWFkLCB0aGV5IGFyZQotZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGZpZWxkcywgd2l0aCBlYWNoIGZpZWxkIGhhdmluZyBhIHR5cGUgc3BlY2lmaWVyIGFuZCBhCi11bmlxdWUgZmllbGQgaWRlbnRpZmllci4gTm90ZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgdHlwZSBzcGVjaWZpZXJzIGFsbG93cwotdGhlIHByb3RvY29sIHRvIGJlIHNhZmVseSBwYXJzZWQgYW5kIGRlY29kZWQgd2l0aG91dCBhbnkgZ2VuZXJhdGVkIGNvZGUKLW9yIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgSURMIGZpbGUuIFN0cnVjdHMgYXJlIHRlcm1pbmF0ZWQgYnkgYSBmaWVsZCBoZWFkZXIKLXdpdGggYSBzcGVjaWFsIFx0ZXh0dHR7U1RPUH0gdHlwZS4gQmVjYXVzZSBhbGwgdGhlIGJhc2ljIHR5cGVzIGNhbiBiZSByZWFkCi1kZXRlcm1pbmlzdGljYWxseSwgYWxsIHN0cnVjdHMgKGV2ZW4gdGhvc2UgY29udGFpbmluZyBvdGhlciBzdHJ1Y3RzKSBjYW4gYmUKLXJlYWQgZGV0ZXJtaW5pc3RpY2FsbHkuIFRoZSBUaHJpZnQgcHJvdG9jb2wgaXMgc2VsZi1kZWxpbWl0aW5nIHdpdGhvdXQgYW55Ci1mcmFtaW5nIGFuZCByZWdhcmRsZXNzIG9mIHRoZSBlbmNvZGluZyBmb3JtYXQuCi0KLUluIHNpdHVhdGlvbnMgd2hlcmUgc3RyZWFtaW5nIGlzIHVubmVjZXNzYXJ5IG9yIGZyYW1pbmcgaXMgYWR2YW50YWdlb3VzLCBpdAotY2FuIGJlIHZlcnkgc2ltcGx5IGFkZGVkIGludG8gdGhlIHRyYW5zcG9ydCBsYXllciwgdXNpbmcgdGhlCi1cdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9IGFic3RyYWN0aW9uLgotCi1cc3Vic2VjdGlvbntJbXBsZW1lbnRhdGlvbn0KLQotRmFjZWJvb2sgaGFzIGltcGxlbWVudGVkIGFuZCBkZXBsb3llZCBhIHNwYWNlLWVmZmljaWVudCBiaW5hcnkgcHJvdG9jb2wgd2hpY2gKLWlzIHVzZWQgYnkgbW9zdCBiYWNrZW5kIHNlcnZpY2VzLiBFc3NlbnRpYWxseSwgaXQgd3JpdGVzIGFsbCBkYXRhCi1pbiBhIGZsYXQgYmluYXJ5IGZvcm1hdC4gSW50ZWdlciB0eXBlcyBhcmUgY29udmVydGVkIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciwKLXN0cmluZ3MgYXJlIHByZXBlbmRlZCB3aXRoIHRoZWlyIGJ5dGUgbGVuZ3RoLCBhbmQgYWxsIG1lc3NhZ2UgYW5kIGZpZWxkIGhlYWRlcnMKLWFyZSB3cml0dGVuIHVzaW5nIHRoZSBwcmltaXRpdmUgaW50ZWdlciBzZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMuIFN0cmluZyBuYW1lcwotZm9yIGZpZWxkcyBhcmUgb21pdHRlZCAtIHdoZW4gdXNpbmcgZ2VuZXJhdGVkIGNvZGUsIGZpZWxkIGlkZW50aWZpZXJzIGFyZQotc3VmZmljaWVudC4KLQotV2UgZGVjaWRlZCBhZ2FpbnN0IHNvbWUgZXh0cmVtZSBzdG9yYWdlIG9wdGltaXphdGlvbnMgKGkuZS4gcGFja2luZwotc21hbGwgaW50ZWdlcnMgaW50byBBU0NJSSBvciB1c2luZyBhIDctYml0IGNvbnRpbnVhdGlvbiBmb3JtYXQpIGZvciB0aGUgc2FrZQotb2Ygc2ltcGxpY2l0eSBhbmQgY2xhcml0eSBpbiB0aGUgY29kZS4gVGhlc2UgYWx0ZXJhdGlvbnMgY2FuIGVhc2lseSBiZSBtYWRlCi1pZiBhbmQgd2hlbiB3ZSBlbmNvdW50ZXIgYSBwZXJmb3JtYW5jZS1jcml0aWNhbCB1c2UgY2FzZSB0aGF0IGRlbWFuZHMgdGhlbS4KLQotXHNlY3Rpb257VmVyc2lvbmluZ30KLQotVGhyaWZ0IGlzIHJvYnVzdCBpbiB0aGUgZmFjZSBvZiB2ZXJzaW9uaW5nIGFuZCBkYXRhIGRlZmluaXRpb24gY2hhbmdlcy4gVGhpcwotaXMgY3JpdGljYWwgdG8gZW5hYmxlIHN0YWdlZCByb2xsb3V0cyBvZiBjaGFuZ2VzIHRvIGRlcGxveWVkIHNlcnZpY2VzLiBUaGUKLXN5c3RlbSBtdXN0IGJlIGFibGUgdG8gc3VwcG9ydCByZWFkaW5nIG9mIG9sZCBkYXRhIGZyb20gbG9nIGZpbGVzLCBhcyB3ZWxsIGFzCi1yZXF1ZXN0cyBmcm9tIG91dC1vZi1kYXRlIGNsaWVudHMgdG8gbmV3IHNlcnZlcnMsIGFuZCB2aWNlIHZlcnNhLgotCi1cc3Vic2VjdGlvbntGaWVsZCBJZGVudGlmaWVyc30KLQotVmVyc2lvbmluZyBpbiBUaHJpZnQgaXMgaW1wbGVtZW50ZWQgdmlhIGZpZWxkIGlkZW50aWZpZXJzLiBUaGUgZmllbGQgaGVhZGVyCi1mb3IgZXZlcnkgbWVtYmVyIG9mIGEgc3RydWN0IGluIFRocmlmdCBpcyBlbmNvZGVkIHdpdGggYSB1bmlxdWUgZmllbGQKLWlkZW50aWZpZXIuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGlzIGZpZWxkIGlkZW50aWZpZXIgYW5kIGl0cyB0eXBlIHNwZWNpZmllcgotaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgZmllbGQuIFRoZSBUaHJpZnQgZGVmaW5pdGlvbiBsYW5ndWFnZQotc3VwcG9ydHMgYXV0b21hdGljIGFzc2lnbm1lbnQgb2YgZmllbGQgaWRlbnRpZmllcnMsIGJ1dCBpdCBpcyBnb29kCi1wcm9ncmFtbWluZyBwcmFjdGljZSB0byBhbHdheXMgZXhwbGljaXRseSBzcGVjaWZ5IGZpZWxkIGlkZW50aWZpZXJzLgotSWRlbnRpZmllcnMgYXJlIHNwZWNpZmllZCBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdHJ1Y3QgRXhhbXBsZSB7Ci0gIDE6aTMyIG51bWJlcj0xMCwKLSAgMjppNjQgYmlnTnVtYmVyLAotICAzOmRvdWJsZSBkZWNpbWFscywKLSAgNDpzdHJpbmcgbmFtZT0idGhyaWZ0eSIKLX1cZW5ke3ZlcmJhdGltfQotCi1UbyBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBtYW51YWxseSBhbmQgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZGVudGlmaWVycywKLWZpZWxkcyB3aXRoIGlkZW50aWZpZXJzIG9taXR0ZWQgYXJlIGFzc2lnbmVkIGlkZW50aWZpZXJzCi1kZWNyZW1lbnRpbmcgZnJvbSAtMSwgYW5kIHRoZSBsYW5ndWFnZSBvbmx5IHN1cHBvcnRzIHRoZSBtYW51YWwgYXNzaWdubWVudCBvZgotcG9zaXRpdmUgaWRlbnRpZmllcnMuCi0KLVdoZW4gZGF0YSBpcyBiZWluZyBkZXNlcmlhbGl6ZWQsIHRoZSBnZW5lcmF0ZWQgY29kZSBjYW4gdXNlIHRoZXNlIGlkZW50aWZpZXJzCi10byBwcm9wZXJseSBpZGVudGlmeSB0aGUgZmllbGQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGFsaWducyB3aXRoIGEgZmllbGQgaW4KLWl0cyBkZWZpbml0aW9uIGZpbGUuIElmIGEgZmllbGQgaWRlbnRpZmllciBpcyBub3QgcmVjb2duaXplZCwgdGhlIGdlbmVyYXRlZAotY29kZSBjYW4gdXNlIHRoZSB0eXBlIHNwZWNpZmllciB0byBza2lwIHRoZSB1bmtub3duIGZpZWxkIHdpdGhvdXQgYW55IGVycm9yLgotQWdhaW4sIHRoaXMgaXMgcG9zc2libGUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYWxsIGRhdGF0eXBlcyBhcmUgc2VsZgotZGVsaW1pdGluZy4KLQotRmllbGQgaWRlbnRpZmllcnMgY2FuIChhbmQgc2hvdWxkKSBhbHNvIGJlIHNwZWNpZmllZCBpbiBmdW5jdGlvbiBhcmd1bWVudAotbGlzdHMuIEluIGZhY3QsIGFyZ3VtZW50IGxpc3RzIGFyZSBub3Qgb25seSByZXByZXNlbnRlZCBhcyBzdHJ1Y3RzIG9uIHRoZQotYmFja2VuZCwgYnV0IGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGNvZGUgaW4gdGhlIGNvbXBpbGVyIGZyb250ZW5kLiBUaGlzCi1hbGxvd3MgZm9yIHZlcnNpb24tc2FmZSBtb2RpZmljYXRpb24gb2YgbWV0aG9kIHBhcmFtZXRlcnMKLQotXGJlZ2lue3ZlcmJhdGltfQotc2VydmljZSBTdHJpbmdDYWNoZSB7Ci0gIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAotICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCi0gIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzeW50YXggZm9yIHNwZWNpZnlpbmcgZmllbGQgaWRlbnRpZmllcnMgd2FzIGNob3NlbiB0byBlY2hvIHRoZWlyIHN0cnVjdHVyZS4KLVN0cnVjdHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBkaWN0aW9uYXJ5IHdoZXJlIHRoZSBpZGVudGlmaWVycyBhcmUga2V5cywgYW5kCi10aGUgdmFsdWVzIGFyZSBzdHJvbmdseS10eXBlZCBuYW1lZCBmaWVsZHMuCi0KLUZpZWxkIGlkZW50aWZpZXJzIGludGVybmFsbHkgdXNlIHRoZSBcdGV4dHR0e2kxNn0gVGhyaWZ0IHR5cGUuIE5vdGUsIGhvd2V2ZXIsCi10aGF0IHRoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb24gbWF5IGVuY29kZSBpZGVudGlmaWVycyBpbiBhbnkgZm9ybWF0LgotCi1cc3Vic2VjdGlvbntJc3NldH0KLQotV2hlbiBhbiB1bmV4cGVjdGVkIGZpZWxkIGlzIGVuY291bnRlcmVkLCBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgYW5kCi1kaXNjYXJkZWQuIFdoZW4gYW4gZXhwZWN0ZWQgZmllbGQgaXMgbm90IGZvdW5kLCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IHRvCi1zaWduYWwgdG8gdGhlIGRldmVsb3BlciB0aGF0IGl0IHdhcyBub3QgcHJlc2VudC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KLWlubmVyIFx0ZXh0dHR7aXNzZXR9IHN0cnVjdHVyZSBpbnNpZGUgdGhlIGRlZmluZWQgb2JqZWN0cy4gKElzc2V0IGZ1bmN0aW9uYWxpdHkKLWlzIGltcGxpY2l0IHdpdGggYSBcdGV4dHR0e251bGx9IHZhbHVlIGluIFBIUCwgXHRleHR0dHtOb25lfSBpbiBQeXRob24KLWFuZCBcdGV4dHR0e25pbH0gaW4gUnVieS4pIEVzc2VudGlhbGx5LAotdGhlIGlubmVyIFx0ZXh0dHR7aXNzZXR9IG9iamVjdCBvZiBlYWNoIFRocmlmdCBzdHJ1Y3QgY29udGFpbnMgYSBib29sZWFuIHZhbHVlCi1mb3IgZWFjaCBmaWVsZCB3aGljaCBkZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoYXQgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUKLXN0cnVjdC4gV2hlbiBhIHJlYWRlciByZWNlaXZlcyBhIHN0cnVjdCwgaXQgc2hvdWxkIGNoZWNrIGZvciBhIGZpZWxkIGJlaW5nIHNldAotYmVmb3JlIG9wZXJhdGluZyBkaXJlY3RseSBvbiBpdC4KLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRXhhbXBsZSB7Ci0gcHVibGljOgotICBFeGFtcGxlKCkgOgotICAgIG51bWJlcigxMCksCi0gICAgYmlnTnVtYmVyKDApLAotICAgIGRlY2ltYWxzKDApLAotICAgIG5hbWUoInRocmlmdHkiKSB7fQotCi0gIGludDMyX3QgbnVtYmVyOwotICBpbnQ2NF90IGJpZ051bWJlcjsKLSAgZG91YmxlIGRlY2ltYWxzOwotICBzdGQ6OnN0cmluZyBuYW1lOwotCi0gIHN0cnVjdCBfX2lzc2V0IHsKLSAgICBfX2lzc2V0KCkgOgotICAgICAgbnVtYmVyKGZhbHNlKSwKLSAgICAgIGJpZ051bWJlcihmYWxzZSksCi0gICAgICBkZWNpbWFscyhmYWxzZSksCi0gICAgICBuYW1lKGZhbHNlKSB7fQotICAgIGJvb2wgbnVtYmVyOwotICAgIGJvb2wgYmlnTnVtYmVyOwotICAgIGJvb2wgZGVjaW1hbHM7Ci0gICAgYm9vbCBuYW1lOwotICB9IF9faXNzZXQ7Ci0uLi4KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue0Nhc2UgQW5hbHlzaXN9Ci0KLVRoZXJlIGFyZSBmb3VyIGNhc2VzIGluIHdoaWNoIHZlcnNpb24gbWlzbWF0Y2hlcyBtYXkgb2NjdXIuCi0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSBcdGV4dGl0e0FkZGVkIGZpZWxkLCBvbGQgY2xpZW50LCBuZXcgc2VydmVyLn0gSW4gdGhpcyBjYXNlLCB0aGUgb2xkCi1jbGllbnQgZG9lcyBub3Qgc2VuZCB0aGUgbmV3IGZpZWxkLiBUaGUgbmV3IHNlcnZlciByZWNvZ25pemVzIHRoYXQgdGhlIGZpZWxkCi1pcyBub3Qgc2V0LCBhbmQgaW1wbGVtZW50cyBkZWZhdWx0IGJlaGF2aW9yIGZvciBvdXQtb2YtZGF0ZSByZXF1ZXN0cy4KLVxpdGVtIFx0ZXh0aXR7UmVtb3ZlZCBmaWVsZCwgb2xkIGNsaWVudCwgbmV3IHNlcnZlci59IEluIHRoaXMgY2FzZSwgdGhlIG9sZAotY2xpZW50IHNlbmRzIHRoZSByZW1vdmVkIGZpZWxkLiBUaGUgbmV3IHNlcnZlciBzaW1wbHkgaWdub3JlcyBpdC4KLVxpdGVtIFx0ZXh0aXR7QWRkZWQgZmllbGQsIG5ldyBjbGllbnQsIG9sZCBzZXJ2ZXIufSBUaGUgbmV3IGNsaWVudCBzZW5kcyBhCi1maWVsZCB0aGF0IHRoZSBvbGQgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZS4gVGhlIG9sZCBzZXJ2ZXIgc2ltcGx5IGlnbm9yZXMKLWl0IGFuZCBwcm9jZXNzZXMgYXMgbm9ybWFsLgotXGl0ZW0gXHRleHRpdHtSZW1vdmVkIGZpZWxkLCBuZXcgY2xpZW50LCBvbGQgc2VydmVyLn0gVGhpcyBpcyB0aGUgbW9zdAotZGFuZ2Vyb3VzIGNhc2UsIGFzIHRoZSBvbGQgc2VydmVyIGlzIHVubGlrZWx5IHRvIGhhdmUgc3VpdGFibGUgZGVmYXVsdAotYmVoYXZpb3IgaW1wbGVtZW50ZWQgZm9yIHRoZSBtaXNzaW5nIGZpZWxkLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGluIHRoaXMKLXNpdHVhdGlvbiB0aGUgbmV3IHNlcnZlciBiZSByb2xsZWQgb3V0IHByaW9yIHRvIHRoZSBuZXcgY2xpZW50cy4KLVxlbmR7ZW51bWVyYXRlfQotCi1cc3Vic2VjdGlvbntQcm90b2NvbC9UcmFuc3BvcnQgVmVyc2lvbmluZ30KLVRoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb25zIGFyZSBhbHNvIGRlc2lnbmVkIHRvIGdpdmUgcHJvdG9jb2wKLWltcGxlbWVudGF0aW9ucyB0aGUgZnJlZWRvbSB0byB2ZXJzaW9uIHRoZW1zZWx2ZXMgaW4gd2hhdGV2ZXIgbWFubmVyIHRoZXkKLXNlZSBmaXQuIFNwZWNpZmljYWxseSwgYW55IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gc2VuZCB3aGF0ZXZlcgotaXQgbGlrZXMgaW4gdGhlIFx0ZXh0dHR7d3JpdGVNZXNzYWdlQmVnaW4oKX0gY2FsbC4gSXQgaXMgZW50aXJlbHkgdXAgdG8gdGhlCi1pbXBsZW1lbnRvciBob3cgdG8gaGFuZGxlIHZlcnNpb25pbmcgYXQgdGhlIHByb3RvY29sIGxldmVsLiBUaGUga2V5IHBvaW50IGlzCi10aGF0IHByb3RvY29sIGVuY29kaW5nIGNoYW5nZXMgYXJlIHNhZmVseSBpc29sYXRlZCBmcm9tIGludGVyZmFjZSBkZWZpbml0aW9uCi12ZXJzaW9uIGNoYW5nZXMuCi0KLU5vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBpcyB0cnVlIG9mIHRoZSBcdGV4dHR0e1RUcmFuc3BvcnR9IGludGVyZmFjZS4gRm9yCi1leGFtcGxlLCBpZiB3ZSB3aXNoZWQgdG8gYWRkIHNvbWUgbmV3IGNoZWNrc3VtbWluZyBvciBlcnJvciBkZXRlY3Rpb24gdG8gdGhlCi1cdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSwgd2UgY291bGQgc2ltcGx5IGFkZCBhIHZlcnNpb24gaGVhZGVyIGludG8gdGhlCi1kYXRhIGl0IHdyaXRlcyB0byB0aGUgZmlsZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgd291bGQgc3RpbGwgYWNjZXB0IG9sZAotbG9nIGZpbGVzIHdpdGhvdXQgdGhlIGdpdmVuIGhlYWRlci4KLQotXHNlY3Rpb257UlBDIEltcGxlbWVudGF0aW9ufQotCi1cc3Vic2VjdGlvbntUUHJvY2Vzc29yfQotCi1UaGUgbGFzdCBjb3JlIGludGVyZmFjZSBpbiB0aGUgVGhyaWZ0IGRlc2lnbiBpcyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSwKLXBlcmhhcHMgdGhlIG1vc3Qgc2ltcGxlIG9mIHRoZSBjb25zdHJ1Y3RzLiBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWludGVyZmFjZSBUUHJvY2Vzc29yIHsKLSAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkKLSAgICB0aHJvd3MgVEV4Y2VwdGlvbgotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGtleSBkZXNpZ24gaWRlYSBoZXJlIGlzIHRoYXQgdGhlIGNvbXBsZXggc3lzdGVtcyB3ZSBidWlsZCBjYW4gZnVuZGFtZW50YWxseQotYmUgYnJva2VuIGRvd24gaW50byBhZ2VudHMgb3Igc2VydmljZXMgdGhhdCBvcGVyYXRlIG9uIGlucHV0cyBhbmQgb3V0cHV0cy4gSW4KLW1vc3QgY2FzZXMsIHRoZXJlIGlzIGFjdHVhbGx5IGp1c3Qgb25lIGlucHV0IGFuZCBvdXRwdXQgKGFuIFJQQyBjbGllbnQpIHRoYXQKLW5lZWRzIGhhbmRsaW5nLgotCi1cc3Vic2VjdGlvbntHZW5lcmF0ZWQgQ29kZX0KLQotV2hlbiBhIHNlcnZpY2UgaXMgZGVmaW5lZCwgd2UgZ2VuZXJhdGUgYQotXHRleHR0dHtUUHJvY2Vzc29yfSBpbnN0YW5jZSBjYXBhYmxlIG9mIGhhbmRsaW5nIFJQQyByZXF1ZXN0cyB0byB0aGF0IHNlcnZpY2UsCi11c2luZyBhIGZldyBoZWxwZXJzLiBUaGUgZnVuZGFtZW50YWwgc3RydWN0dXJlIChpbGx1c3RyYXRlZCBpbiBwc2V1ZG8tQysrKSBpcwotYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotU2VydmljZS50aHJpZnQKLSA9PiBTZXJ2aWNlLmNwcAotICAgICBpbnRlcmZhY2UgU2VydmljZUlmCi0gICAgIGNsYXNzIFNlcnZpY2VDbGllbnQgOiB2aXJ0dWFsIFNlcnZpY2VJZgotICAgICAgIFRQcm90b2NvbCBpbgotICAgICAgIFRQcm90b2NvbCBvdXQKLSAgICAgY2xhc3MgU2VydmljZVByb2Nlc3NvciA6IFRQcm9jZXNzb3IKLSAgICAgICBTZXJ2aWNlSWYgaGFuZGxlcgotCi1TZXJ2aWNlSGFuZGxlci5jcHAKLSBjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IHZpcnR1YWwgU2VydmljZUlmCi0KLVRTZXJ2ZXIuY3BwCi0gVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0LAotICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdGZhY3RvcnksCi0gICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHBmYWN0b3J5KQotIHNlcnZlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUZyb20gdGhlIFRocmlmdCBkZWZpbml0aW9uIGZpbGUsIHdlIGdlbmVyYXRlIHRoZSB2aXJ0dWFsIHNlcnZpY2UgaW50ZXJmYWNlLgotQSBjbGllbnQgY2xhc3MgaXMgZ2VuZXJhdGVkLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgYW5kCi11c2VzIHR3byBcdGV4dHR0e1RQcm90b2NvbH0gaW5zdGFuY2VzIHRvIHBlcmZvcm0gdGhlIEkvTyBvcGVyYXRpb25zLiBUaGUKLWdlbmVyYXRlZCBwcm9jZXNzb3IgaW1wbGVtZW50cyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBpbnRlcmZhY2UuIFRoZSBnZW5lcmF0ZWQKLWNvZGUgaGFzIGFsbCB0aGUgbG9naWMgdG8gaGFuZGxlIFJQQyBpbnZvY2F0aW9ucyB2aWEgdGhlIFx0ZXh0dHR7cHJvY2VzcygpfQotY2FsbCwgYW5kIHRha2VzIGFzIGEgcGFyYW1ldGVyIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGludGVyZmFjZSwgYXMKLWltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuCi0KLVRoZSB1c2VyIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgaW4gc2VwYXJhdGUsCi1ub24tZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLgotCi1cc3Vic2VjdGlvbntUU2VydmVyfQotCi1GaW5hbGx5LCB0aGUgVGhyaWZ0IGNvcmUgbGlicmFyaWVzIHByb3ZpZGUgYSBcdGV4dHR0e1RTZXJ2ZXJ9IGFic3RyYWN0aW9uLgotVGhlIFx0ZXh0dHR7VFNlcnZlcn0gb2JqZWN0IGdlbmVyYWxseSB3b3JrcyBhcyBmb2xsb3dzLgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFVzZSB0aGUgXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSB0byBnZXQgYSBcdGV4dHR0e1RUcmFuc3BvcnR9Ci1caXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFRyYW5zcG9ydEZhY3Rvcnl9IHRvIG9wdGlvbmFsbHkgY29udmVydCB0aGUgcHJpbWl0aXZlCi10cmFuc3BvcnQgaW50byBhIHN1aXRhYmxlIGFwcGxpY2F0aW9uIHRyYW5zcG9ydCAodHlwaWNhbGx5IHRoZQotXHRleHR0dHtUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5fSBpcyB1c2VkIGhlcmUpCi1caXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFByb3RvY29sRmFjdG9yeX0gdG8gY3JlYXRlIGFuIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wKLWZvciB0aGUgXHRleHR0dHtUVHJhbnNwb3J0fQotXGl0ZW0gSW52b2tlIHRoZSBcdGV4dHR0e3Byb2Nlc3MoKX0gbWV0aG9kIG9mIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdAotXGVuZHtpdGVtaXplfQotCi1UaGUgbGF5ZXJzIGFyZSBhcHByb3ByaWF0ZWx5IHNlcGFyYXRlZCBzdWNoIHRoYXQgdGhlIHNlcnZlciBjb2RlIG5lZWRzIHRvIGtub3cKLW5vdGhpbmcgYWJvdXQgYW55IG9mIHRoZSB0cmFuc3BvcnRzLCBlbmNvZGluZ3MsIG9yIGFwcGxpY2F0aW9ucyBpbiBwbGF5LiBUaGUKLXNlcnZlciBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGFyb3VuZCBjb25uZWN0aW9uIGhhbmRsaW5nLCB0aHJlYWRpbmcsIGV0Yy4KLXdoaWxlIHRoZSBwcm9jZXNzb3IgZGVhbHMgd2l0aCBSUEMuIFRoZSBvbmx5IGNvZGUgd3JpdHRlbiBieSB0aGUgYXBwbGljYXRpb24KLWRldmVsb3BlciBsaXZlcyBpbiB0aGUgZGVmaW5pdGlvbmFsIFRocmlmdCBmaWxlIGFuZCB0aGUgaW50ZXJmYWNlCi1pbXBsZW1lbnRhdGlvbi4KLQotRmFjZWJvb2sgaGFzIGRlcGxveWVkIG11bHRpcGxlIFx0ZXh0dHR7VFNlcnZlcn0gaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmcKLXRoZSBzaW5nbGUtdGhyZWFkZWQgXHRleHR0dHtUU2ltcGxlU2VydmVyfSwgdGhyZWFkLXBlci1jb25uZWN0aW9uCi1cdGV4dHR0e1RUaHJlYWRlZFNlcnZlcn0sIGFuZCB0aHJlYWQtcG9vbGluZyBcdGV4dHR0e1RUaHJlYWRQb29sU2VydmVyfS4KLQotVGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW50ZXJmYWNlIGlzIHZlcnkgZ2VuZXJhbCBieSBkZXNpZ24uIFRoZXJlIGlzIG5vCi1yZXF1aXJlbWVudCB0aGF0IGEgXHRleHR0dHtUU2VydmVyfSB0YWtlIGEgZ2VuZXJhdGVkIFx0ZXh0dHR7VFByb2Nlc3Nvcn0KLW9iamVjdC4gVGhyaWZ0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGVhc2lseSB3cml0ZSBhbnkgdHlwZSBvZgotc2VydmVyIHRoYXQgb3BlcmF0ZXMgb24gXHRleHR0dHtUUHJvdG9jb2x9IG9iamVjdHMgKGZvciBpbnN0YW5jZSwgYSBzZXJ2ZXIKLWNvdWxkIHNpbXBseSBzdHJlYW0gYSBjZXJ0YWluIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgYW55IGFjdHVhbCBSUEMgbWV0aG9kCi1pbnZvY2F0aW9uKS4KLQotXHNlY3Rpb257SW1wbGVtZW50YXRpb24gRGV0YWlsc30KLVxzdWJzZWN0aW9ue1RhcmdldCBMYW5ndWFnZXN9Ci1UaHJpZnQgY3VycmVudGx5IHN1cHBvcnRzIGZpdmUgdGFyZ2V0IGxhbmd1YWdlczogQysrLCBKYXZhLCBQeXRob24sIFJ1YnksIGFuZAotUEhQLiBBdCBGYWNlYm9vaywgd2UgaGF2ZSBkZXBsb3llZCBzZXJ2ZXJzIHByZWRvbWluYW50bHkgaW4gQysrLCBKYXZhLCBhbmQKLVB5dGhvbi4gVGhyaWZ0IHNlcnZpY2VzIGltcGxlbWVudGVkIGluIFBIUCBoYXZlIGFsc28gYmVlbiBlbWJlZGRlZCBpbnRvIHRoZQotQXBhY2hlIHdlYiBzZXJ2ZXIsIHByb3ZpZGluZyB0cmFuc3BhcmVudCBiYWNrZW5kIGFjY2VzcyB0byBtYW55IG9mIG91cgotZnJvbnRlbmQgY29uc3RydWN0cyB1c2luZyBhIFx0ZXh0dHR7VEh0dHBDbGllbnR9IGltcGxlbWVudGF0aW9uIG9mIHRoZQotXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UuCi0KLVRob3VnaCBUaHJpZnQgd2FzIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gYmUgbXVjaCBtb3JlIGVmZmljaWVudCBhbmQgcm9idXN0Ci10aGFuIHR5cGljYWwgd2ViIHRlY2hub2xvZ2llcywgYXMgd2Ugd2VyZSBkZXNpZ25pbmcgb3VyIFhNTC1iYXNlZCBSRVNUIHdlYgotc2VydmljZXMgQVBJIHdlIG5vdGljZWQgdGhhdCBUaHJpZnQgY291bGQgYmUgZWFzaWx5IHVzZWQgdG8gZGVmaW5lIG91cgotc2VydmljZSBpbnRlcmZhY2UuIFRob3VnaCB3ZSBkbyBub3QgY3VycmVudGx5IGVtcGxveSBTT0FQIGVudmVsb3BlcyAoaW4gdGhlCi1hdXRob3JzJyBvcGluaW9ucyB0aGVyZSBpcyBhbHJlYWR5IGZhciB0b28gbXVjaCByZXBldGl0aXZlIGVudGVycHJpc2UgSmF2YQotc29mdHdhcmUgdG8gZG8gdGhhdCBzb3J0IG9mIHRoaW5nKSwgd2Ugd2VyZSBhYmxlIHRvIHF1aWNrbHkgZXh0ZW5kIFRocmlmdCB0bwotZ2VuZXJhdGUgWE1MIFNjaGVtYSBEZWZpbml0aW9uIGZpbGVzIGZvciBvdXIgc2VydmljZSwgYXMgd2VsbCBhcyBhIGZyYW1ld29yawotZm9yIHZlcnNpb25pbmcgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBvdXIgd2ViIHNlcnZpY2UuIFRob3VnaCBwdWJsaWMKLXdlYiBzZXJ2aWNlcyBhcmUgYWRtaXR0ZWRseSB0YW5nZW50aWFsIHRvIFRocmlmdCdzIGNvcmUgdXNlIGNhc2UgYW5kIGRlc2lnbiwKLVRocmlmdCBmYWNpbGl0YXRlZCByYXBpZCBpdGVyYXRpb24gYW5kIGFmZm9yZHMgdXMgdGhlIGFiaWxpdHkgdG8gcXVpY2tseQotbWlncmF0ZSBvdXIgZW50aXJlIFhNTC1iYXNlZCB3ZWIgc2VydmljZSBvbnRvIGEgaGlnaGVyIHBlcmZvcm1hbmNlIHN5c3RlbQotc2hvdWxkIHRoZSBuZWVkIGFyaXNlLgotCi1cc3Vic2VjdGlvbntHZW5lcmF0ZWQgU3RydWN0c30KLVdlIG1hZGUgYSBjb25zY2lvdXMgZGVjaXNpb24gdG8gbWFrZSBvdXIgZ2VuZXJhdGVkIHN0cnVjdHMgYXMgdHJhbnNwYXJlbnQgYXMKLXBvc3NpYmxlLiBBbGwgZmllbGRzIGFyZSBwdWJsaWNseSBhY2Nlc3NpYmxlOyB0aGVyZSBhcmUgbm8gXHRleHR0dHtzZXQoKX0gYW5kCi1cdGV4dHR0e2dldCgpfSBtZXRob2RzLiBTaW1pbGFybHksIHVzZSBvZiB0aGUgXHRleHR0dHtpc3NldH0gb2JqZWN0IGlzIG5vdAotZW5mb3JjZWQuIFdlIGRvIG5vdCBpbmNsdWRlIGFueSBcdGV4dHR0e0ZpZWxkTm90U2V0RXhjZXB0aW9ufSBjb25zdHJ1Y3QuCi1EZXZlbG9wZXJzIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlc2UgZmllbGRzIHRvIHdyaXRlIG1vcmUgcm9idXN0IGNvZGUsIGJ1dAotdGhlIHN5c3RlbSBpcyByb2J1c3QgdG8gdGhlIGRldmVsb3BlciBpZ25vcmluZyB0aGUgXHRleHR0dHtpc3NldH0gY29uc3RydWN0Ci1lbnRpcmVseSBhbmQgd2lsbCBwcm92aWRlIHN1aXRhYmxlIGRlZmF1bHQgYmVoYXZpb3IgaW4gYWxsIGNhc2VzLgotCi1UaGlzIGNob2ljZSB3YXMgbW90aXZhdGVkIGJ5IHRoZSBkZXNpcmUgdG8gZWFzZSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudC4gT3VyIHN0YXRlZAotZ29hbCBpcyBub3QgdG8gbWFrZSBkZXZlbG9wZXJzIGxlYXJuIGEgcmljaCBuZXcgbGlicmFyeSBpbiB0aGVpciBsYW5ndWFnZSBvZgotY2hvaWNlLCBidXQgcmF0aGVyIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgY29uc3RydWN0cwotdGhhdCBhcmUgbW9zdCBmYW1pbGlhciBpbiBlYWNoIGxhbmd1YWdlLgotCi1XZSBhbHNvIG1hZGUgdGhlIFx0ZXh0dHR7cmVhZCgpfSBhbmQgXHRleHR0dHt3cml0ZSgpfSBtZXRob2RzIG9mIHRoZSBnZW5lcmF0ZWQKLW9iamVjdHMgcHVibGljIHNvIHRoYXQgdGhlIG9iamVjdHMgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dAotb2YgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRocmlmdCBpcyBhIHVzZWZ1bCB0b29sIHNpbXBseSBmb3IgZ2VuZXJhdGluZwotb2JqZWN0cyB0aGF0IGFyZSBlYXNpbHkgc2VyaWFsaXphYmxlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCi0KLVxzdWJzZWN0aW9ue1JQQyBNZXRob2QgSWRlbnRpZmljYXRpb259Ci1NZXRob2QgY2FsbHMgaW4gUlBDIGFyZSBpbXBsZW1lbnRlZCBieSBzZW5kaW5nIHRoZSBtZXRob2QgbmFtZSBhcyBhIHN0cmluZy4gT25lCi1pc3N1ZSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBsb25nZXIgbWV0aG9kIG5hbWVzIHJlcXVpcmUgbW9yZSBiYW5kd2lkdGguCi1XZSBleHBlcmltZW50ZWQgd2l0aCB1c2luZyBmaXhlZC1zaXplIGhhc2hlcyB0byBpZGVudGlmeSBtZXRob2RzLCBidXQgaW4gdGhlCi1lbmQgY29uY2x1ZGVkIHRoYXQgdGhlIHNhdmluZ3Mgd2VyZSBub3Qgd29ydGggdGhlIGhlYWRhY2hlcyBpbmN1cnJlZC4gUmVsaWFibHkKLWRlYWxpbmcgd2l0aCBjb25mbGljdHMgYWNyb3NzIHZlcnNpb25zIG9mIGFuIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGUgaXMKLWltcG9zc2libGUgd2l0aG91dCBhIG1ldGEtc3RvcmFnZSBzeXN0ZW0gKGkuZS4gdG8gZ2VuZXJhdGUgbm9uLWNvbmZsaWN0aW5nCi1oYXNoZXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYSBmaWxlLCB3ZSB3b3VsZCBoYXZlIHRvIGtub3cgYWJvdXQgYWxsCi1jb25mbGljdHMgdGhhdCBldmVyIGV4aXN0ZWQgaW4gYW55IHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZpbGUpLgotCi1XZSB3YW50ZWQgdG8gYXZvaWQgdG9vIG1hbnkgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvbXBhcmlzb25zIHVwb24KLW1ldGhvZCBpbnZvY2F0aW9uLiBUbyBkZWFsIHdpdGggdGhpcywgd2UgZ2VuZXJhdGUgbWFwcyBmcm9tIHN0cmluZ3MgdG8gZnVuY3Rpb24KLXBvaW50ZXJzLCBzbyB0aGF0IGludm9jYXRpb24gaXMgZWZmZWN0aXZlbHkgYWNjb21wbGlzaGVkIHZpYSBhIGNvbnN0YW50LXRpbWUKLWhhc2ggbG9va3VwIGluIHRoZSBjb21tb24gY2FzZS4gVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY291cGxlIGludGVyZXN0aW5nCi1jb2RlIGNvbnN0cnVjdHMuIEJlY2F1c2UgSmF2YSBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzLCBwcm9jZXNzCi1mdW5jdGlvbnMgYXJlIGFsbCBwcml2YXRlIG1lbWJlciBjbGFzc2VzIGltcGxlbWVudGluZyBhIGNvbW1vbiBpbnRlcmZhY2UuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByaXZhdGUgY2xhc3MgcGluZyBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7Ci0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3Byb3QpCi0gICAgdGhyb3dzIFRFeGNlcHRpb24KLSAgeyAuLi59Ci19Ci0KLUhhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPQotICBuZXcgSGFzaE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPigpOwotXGVuZHt2ZXJiYXRpbX0KLQotSW4gQysrLCB3ZSB1c2UgYSByZWxhdGl2ZWx5IGVzb3RlcmljIGxhbmd1YWdlIGNvbnN0cnVjdDogbWVtYmVyIGZ1bmN0aW9uCi1wb2ludGVycy4KLQotXGJlZ2lue3ZlcmJhdGltfQotc3RkOjptYXA8c3RkOjpzdHJpbmcsCi0gIHZvaWQgKEV4YW1wbGVTZXJ2aWNlUHJvY2Vzc29yOjoqKShpbnQzMl90LAotICBmYWNlYm9vazo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwKLSAgZmFjZWJvb2s6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCopPgotIHByb2Nlc3NNYXBfOwotXGVuZHt2ZXJiYXRpbX0KLQotVXNpbmcgdGhlc2UgdGVjaG5pcXVlcywgdGhlIGNvc3Qgb2Ygc3RyaW5nIHByb2Nlc3NpbmcgaXMgbWluaW1pemVkLCBhbmQgd2UKLXJlYXAgdGhlIGJlbmVmaXQgb2YgYmVpbmcgYWJsZSB0byBlYXNpbHkgZGVidWcgY29ycnVwdCBvciBtaXN1bmRlcnN0b29kIGRhdGEgYnkKLWluc3BlY3RpbmcgaXQgZm9yIGtub3duIHN0cmluZyBtZXRob2QgbmFtZXMuCi0KLVxzdWJzZWN0aW9ue1NlcnZlcnMgYW5kIE11bHRpdGhyZWFkaW5nfQotVGhyaWZ0IHNlcnZpY2VzIHJlcXVpcmUgYmFzaWMgbXVsdGl0aHJlYWRpbmcgdG8gaGFuZGxlIHNpbXVsdGFuZW91cwotcmVxdWVzdHMgZnJvbSBtdWx0aXBsZSBjbGllbnRzLiBGb3IgdGhlIFB5dGhvbiBhbmQgSmF2YSBpbXBsZW1lbnRhdGlvbnMgb2YKLVRocmlmdCBzZXJ2ZXIgbG9naWMsIHRoZSBzdGFuZGFyZCB0aHJlYWRpbmcgbGlicmFyaWVzIGRpc3RyaWJ1dGVkIHdpdGggdGhlCi1sYW5ndWFnZXMgcHJvdmlkZSBhZGVxdWF0ZSBzdXBwb3J0LiBGb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgbm8gc3RhbmRhcmQgbXVsdGl0aHJlYWQgcnVudGltZQotbGlicmFyeSBleGlzdHMuIFNwZWNpZmljYWxseSwgcm9idXN0LCBsaWdodHdlaWdodCwgYW5kIHBvcnRhYmxlCi10aHJlYWQgbWFuYWdlciBhbmQgdGltZXIgY2xhc3MgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBleGlzdC4gV2UgaW52ZXN0aWdhdGVkCi1leGlzdGluZyBpbXBsZW1lbnRhdGlvbnMsIG5hbWVseSBcdGV4dHR0e2Jvb3N0Ojp0aHJlYWR9LAotXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0sIFx0ZXh0dHR7QUNFXF9UaHJlYWRcX01hbmFnZXJ9IGFuZAotXHRleHR0dHtBQ0VcX1RpbWVyfS4KLQotV2hpbGUgXHRleHR0dHtib29zdDo6dGhyZWFkc31cY2l0ZXtib29zdC50aHJlYWRzfSAgcHJvdmlkZXMgY2xlYW4sCi1saWdodHdlaWdodCBhbmQgcm9idXN0IGltcGxlbWVudGF0aW9ucyBvZiBtdWx0aS10aHJlYWQgcHJpbWl0aXZlcyAobXV0ZXhlcywKLWNvbmRpdGlvbnMsIHRocmVhZHMpIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB0aHJlYWQgbWFuYWdlciBvciB0aW1lcgotaW1wbGVtZW50YXRpb24uCi0KLVx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9XGNpdGV7Ym9vc3QudGhyZWFkcG9vbH0gYWxzbyBsb29rZWQgcHJvbWlzaW5nIGJ1dAotd2FzIG5vdCBmYXIgZW5vdWdoIGFsb25nIGZvciBvdXIgcHVycG9zZXMuIFdlIHdhbnRlZCB0byBsaW1pdCB0aGUgZGVwZW5kZW5jeSBvbgotdGhpcmQtcGFydHkgbGlicmFyaWVzIGFzIG11Y2ggYXMgcG9zc2libGUuIEJlY2F1c2VcXAotXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0gaXMKLW5vdCBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSBhbmQgcmVxdWlyZXMgcnVudGltZSBsaWJyYXJpZXMgYW5kIGJlY2F1c2UgaXQgaXMKLW5vdCB5ZXQgcGFydCBvZiB0aGUgb2ZmaWNpYWwgQm9vc3QgZGlzdHJpYnV0aW9uIHdlIGZlbHQgaXQgd2FzIG5vdCByZWFkeSBmb3IKLXVzZSBpbiBUaHJpZnQuIEFzIFx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9IGV2b2x2ZXMgYW5kIGVzcGVjaWFsbHkgaWYgaXQgaXMKLWFkZGVkIHRvIHRoZSBCb29zdCBkaXN0cmlidXRpb24gd2UgbWF5IHJlY29uc2lkZXIgb3VyIGRlY2lzaW9uIHRvIG5vdCB1c2UgaXQuCi0KLUFDRSBoYXMgYm90aCBhIHRocmVhZCBtYW5hZ2VyIGFuZCB0aW1lciBjbGFzcyBpbiBhZGRpdGlvbiB0byBtdWx0aS10aHJlYWQKLXByaW1pdGl2ZXMuIFRoZSBiaWdnZXN0IHByb2JsZW0gd2l0aCBBQ0UgaXMgdGhhdCBpdCBpcyBBQ0UuIFVubGlrZSBCb29zdCwgQUNFCi1BUEkgcXVhbGl0eSBpcyBwb29yLiBFdmVyeXRoaW5nIGluIEFDRSBoYXMgbGFyZ2UgbnVtYmVycyBvZiBkZXBlbmRlbmNpZXMgb24KLWV2ZXJ5dGhpbmcgZWxzZSBpbiBBQ0UgLSB0aHVzIGZvcmNpbmcgZGV2ZWxvcGVycyB0byB0aHJvdyBvdXQgc3RhbmRhcmQKLWNsYXNzZXMsIHN1Y2ggYXMgU1RMIGNvbGxlY3Rpb25zLCBpbiBmYXZvciBvZiBBQ0UncyBob21lYnJld2VkIGltcGxlbWVudGF0aW9ucy4gSW4KLWFkZGl0aW9uLCB1bmxpa2UgQm9vc3QsIEFDRSBpbXBsZW1lbnRhdGlvbnMgZGVtb25zdHJhdGUgbGl0dGxlIHVuZGVyc3RhbmRpbmcKLW9mIHRoZSBwb3dlciBhbmQgcGl0ZmFsbHMgb2YgQysrIHByb2dyYW1taW5nIGFuZCB0YWtlIG5vIGFkdmFudGFnZSBvZiBtb2Rlcm4KLXRlbXBsYXRpbmcgdGVjaG5pcXVlcyB0byBlbnN1cmUgY29tcGlsZSB0aW1lIHNhZmV0eSBhbmQgcmVhc29uYWJsZSBjb21waWxlcgotZXJyb3IgbWVzc2FnZXMuIEZvciBhbGwgdGhlc2UgcmVhc29ucywgQUNFIHdhcyByZWplY3RlZC4gSW5zdGVhZCwgd2UgY2hvc2UKLXRvIGltcGxlbWVudCBvdXIgb3duIGxpYnJhcnksIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgotCi1cc3Vic2VjdGlvbntUaHJlYWQgUHJpbWl0aXZlc30KLQotVGhlIFRocmlmdCB0aHJlYWQgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgbmFtZXNwYWNlXFwKLVx0ZXh0dHR7ZmFjZWJvb2s6OnRocmlmdDo6Y29uY3VycmVuY3l9IGFuZCBoYXZlIHRocmVlIGNvbXBvbmVudHM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHByaW1pdGl2ZXMKLVxpdGVtIHRocmVhZCBwb29sIG1hbmFnZXIKLVxpdGVtIHRpbWVyIG1hbmFnZXIKLVxlbmR7aXRlbWl6ZX0KLQotQXMgbWVudGlvbmVkIGFib3ZlLCB3ZSB3ZXJlIGhlc2l0YW50IHRvIGludHJvZHVjZSBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKLW9uIFRocmlmdC4gV2UgZGVjaWRlZCB0byB1c2UgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGJlY2F1c2UgaXQgaXMgc28KLXVzZWZ1bCBmb3IgbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbiwgaXQgcmVxdWlyZXMgbm8gbGluay10aW1lIG9yCi1ydW50aW1lIGxpYnJhcmllcyAoaS5lLiBpdCBpcyBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSkgYW5kIGl0IGlzIGR1ZQotdG8gYmVjb21lIHBhcnQgb2YgdGhlIEMrKzB4IHN0YW5kYXJkLgotCi1XZSBpbXBsZW1lbnQgc3RhbmRhcmQgXHRleHR0dHtNdXRleH0gYW5kIFx0ZXh0dHR7Q29uZGl0aW9ufSBjbGFzc2VzLCBhbmQgYQotIFx0ZXh0dHR7TW9uaXRvcn0gY2xhc3MuIFRoZSBsYXR0ZXIgaXMgc2ltcGx5IGEgY29tYmluYXRpb24gb2YgYSBtdXRleCBhbmQKLWNvbmRpdGlvbiB2YXJpYWJsZSBhbmQgaXMgYW5hbG9nb3VzIHRvIHRoZSBcdGV4dHR0e01vbml0b3J9IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGZvcgotdGhlIEphdmEgXHRleHR0dHtPYmplY3R9IGNsYXNzLiBUaGlzIGlzIGFsc28gc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgYmFycmllci4gV2UKLXByb3ZpZGUgYSBcdGV4dHR0e1N5bmNocm9uaXplZH0gZ3VhcmQgY2xhc3MgdG8gYWxsb3cgSmF2YS1saWtlIHN5bmNocm9uaXplZCBibG9ja3MuCi1UaGlzIGlzIGp1c3QgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyLCBidXQsIGxpa2UgaXRzIEphdmEgY291bnRlcnBhcnQsIGNsZWFybHkKLWRlbGltaXRzIGNyaXRpY2FsIHNlY3Rpb25zIG9mIGNvZGUuIFVubGlrZSBpdHMgSmF2YSBjb3VudGVycGFydCwgd2Ugc3RpbGwKLWhhdmUgdGhlIGFiaWxpdHkgdG8gcHJvZ3JhbW1hdGljYWxseSBsb2NrLCB1bmxvY2ssIGJsb2NrLCBhbmQgc2lnbmFsIG1vbml0b3JzLgotCi1cYmVnaW57dmVyYmF0aW19Ci12b2lkIHJ1bigpIHsKLSB7U3luY2hyb25pemVkIHMobWFuYWdlci0+bW9uaXRvcik7Ci0gIGlmIChtYW5hZ2VyLT5zdGF0ZSA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7Ci0gICAgbWFuYWdlci0+c3RhdGUgPSBUaW1lck1hbmFnZXI6OlNUQVJURUQ7Ci0gICAgbWFuYWdlci0+bW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgfQotIH0KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVdlIGFnYWluIGJvcnJvd2VkIGZyb20gSmF2YSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIHRocmVhZCBhbmQgYSBydW5uYWJsZQotY2xhc3MuIEEgXHRleHR0dHtUaHJlYWR9IGlzIHRoZSBhY3R1YWwgc2NoZWR1bGFibGUgb2JqZWN0LiBUaGUKLVx0ZXh0dHR7UnVubmFibGV9IGlzIHRoZSBsb2dpYyB0byBleGVjdXRlIHdpdGhpbiB0aGUgdGhyZWFkLgotVGhlIFx0ZXh0dHR7VGhyZWFkfSBpbXBsZW1lbnRhdGlvbiBkZWFscyB3aXRoIGFsbCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkCi1jcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gaXNzdWVzLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gaW1wbGVtZW50YXRpb24gZGVhbHMKLXdpdGggdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHBlci10aHJlYWQgbG9naWMuIFRoZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2gKLWlzIHRoYXQgZGV2ZWxvcGVycyBjYW4gZWFzaWx5IHN1YmNsYXNzIHRoZSBSdW5uYWJsZSBjbGFzcyB3aXRob3V0IHB1bGxpbmcgaW4KLXBsYXRmb3JtLXNwZWNpZmljIHN1cGVyLWNsYXNzZXMuCi0KLVxzdWJzZWN0aW9ue1RocmVhZCwgUnVubmFibGUsIGFuZCBzaGFyZWRcX3B0cn0KLVdlIHVzZSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdGhyb3VnaG91dCB0aGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBhbmQKLVx0ZXh0dHR7VGltZXJNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbnMgdG8gZ3VhcmFudGVlIGNsZWFudXAgb2YgZGVhZCBvYmplY3RzIHRoYXQgY2FuCi1iZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiBGb3IgXHRleHR0dHtUaHJlYWR9IGNsYXNzIGltcGxlbWVudGF0aW9ucywKLVx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB1c2FnZSByZXF1aXJlcyBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBtYWtlIHN1cmUKLVx0ZXh0dHR7VGhyZWFkfSBvYmplY3RzIGFyZSBuZWl0aGVyIGxlYWtlZCBub3IgZGVyZWZlcmVuY2VkIHByZW1hdHVyZWx5IHdoaWxlCi1jcmVhdGluZyBhbmQgc2h1dHRpbmcgZG93biB0aHJlYWRzLgotCi1UaHJlYWQgY3JlYXRpb24gcmVxdWlyZXMgY2FsbGluZyBpbnRvIGEgQyBsaWJyYXJ5LiAoSW4gb3VyIGNhc2UgdGhlIFBPU0lYCi10aHJlYWQgbGlicmFyeSwgXHRleHR0dHtsaWJwdGhyZWFkfSwgYnV0IHRoZSBzYW1lIHdvdWxkIGJlIHRydWUgZm9yIFdJTjMyIHRocmVhZHMpLgotVHlwaWNhbGx5LCB0aGUgT1MgbWFrZXMgZmV3LCBpZiBhbnksIGd1YXJhbnRlZXMgYWJvdXQgd2hlbiBcdGV4dHR0e1RocmVhZE1haW59LCBhIEMgdGhyZWFkJ3MgZW50cnktcG9pbnQgZnVuY3Rpb24sIHdpbGwgYmUgY2FsbGVkLiBUaGVyZWZvcmUsIGl0IGlzCi1wb3NzaWJsZSB0aGF0IG91ciB0aHJlYWQgY3JlYXRlIGNhbGwsCi1cdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZCgpfSBjb3VsZCByZXR1cm4gdG8gdGhlIGNhbGxlcgotd2VsbCBiZWZvcmUgdGhhdCB0aW1lLiBUbyBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBpcyBub3QKLXByZW1hdHVyZWx5IGNsZWFuZWQgdXAgaWYgdGhlIGNhbGxlciBnaXZlcyB1cCBpdHMgcmVmZXJlbmNlIHByaW9yIHRvIHRoZQotXHRleHR0dHtUaHJlYWRNYWlufSBjYWxsLCB0aGUgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBtYWtlcyBhIHdlYWsgcmVmZXJlbmVuY2UgdG8KLWl0c2VsZiBpbiBpdHMgXHRleHR0dHtzdGFydH0gbWV0aG9kLgotCi1XaXRoIHRoZSB3ZWFrIHJlZmVyZW5jZSBpbiBoYW5kIHRoZSBcdGV4dHR0e1RocmVhZE1haW59IGZ1bmN0aW9uIGNhbiBhdHRlbXB0IHRvIGdldAotYSBzdHJvbmcgcmVmZXJlbmNlIGJlZm9yZSBlbnRlcmluZyB0aGUgXHRleHR0dHtSdW5uYWJsZTo6cnVufSBtZXRob2Qgb2YgdGhlCi1cdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgYm91bmQgdG8gdGhlIFx0ZXh0dHR7VGhyZWFkfS4gSWYgbm8gc3Ryb25nIHJlZmVyZW5jZXMgdG8gdGhlCi10aHJlYWQgYXJlIG9idGFpbmVkIGJldHdlZW4gZXhpdGluZyBcdGV4dHR0e1RocmVhZDo6c3RhcnR9IGFuZCBlbnRlcmluZyBcdGV4dHR0e1RocmVhZE1haW59LCB0aGUgd2VhayByZWZlcmVuY2UgcmV0dXJucyBcdGV4dHR0e251bGx9IGFuZCB0aGUgZnVuY3Rpb24KLWV4aXRzIGltbWVkaWF0ZWx5LgotCi1UaGUgbmVlZCBmb3IgdGhlIFx0ZXh0dHR7VGhyZWFkfSB0byBtYWtlIGEgd2VhayByZWZlcmVuY2UgdG8gaXRzZWxmIGhhcyBhCi1zaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIEFQSS4gU2luY2UgcmVmZXJlbmNlcyBhcmUgbWFuYWdlZCB0aHJvdWdoIHRoZQotXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHRlbXBsYXRlcywgdGhlIFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgbXVzdCBoYXZlIGEgcmVmZXJlbmNlCi10byBpdHNlbGYgd3JhcHBlZCBieSB0aGUgc2FtZSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gZW52ZWxvcGUgdGhhdCBpcyByZXR1cm5lZAotdG8gdGhlIGNhbGxlci4gVGhpcyBuZWNlc3NpdGF0ZWQgdGhlIHVzZSBvZiB0aGUgZmFjdG9yeSBwYXR0ZXJuLgotXHRleHR0dHtUaHJlYWRGYWN0b3J5fSBjcmVhdGVzIHRoZSByYXcgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBhbmQgYQotXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHdyYXBwZXIsIGFuZCBjYWxscyBhIHByaXZhdGUgaGVscGVyIG1ldGhvZCBvZiB0aGUgY2xhc3MKLWltcGxlbWVudGluZyB0aGUgXHRleHR0dHtUaHJlYWR9IGludGVyZmFjZSAoaW4gdGhpcyBjYXNlLCBcdGV4dHR0e1Bvc2l4VGhyZWFkOjp3ZWFrUmVmfSkKLSB0byBhbGxvdyBpdCB0byBtYWtlIGFkZCB3ZWFrIHJlZmVyZW5jZSB0byBpdHNlbGYgdGhyb3VnaCB0aGUKLSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gZW52ZWxvcGUuCi0KLVx0ZXh0dHR7VGhyZWFkfSBhbmQgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0cyByZWZlcmVuY2UgZWFjaCBvdGhlci4gQSBcdGV4dHR0e1J1bm5hYmxlfQotb2JqZWN0IG1heSBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIHRocmVhZCBpbiB3aGljaCBpdCBpcyBleGVjdXRpbmcsIGFuZCBhIFRocmVhZCwgb2J2aW91c2x5LAotbmVlZHMgdG8ga25vdyB3aGF0IFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdCBpdCBpcyBob3N0aW5nLiBUaGlzIGludGVyZGVwZW5kZW5jeSBpcwotZnVydGhlciBjb21wbGljYXRlZCBiZWNhdXNlIHRoZSBsaWZlY3ljbGUgb2YgZWFjaCBvYmplY3QgaXMgaW5kZXBlbmRlbnQgb2YgdGhlCi1vdGhlci4gQW4gYXBwbGljYXRpb24gbWF5IGNyZWF0ZSBhIHNldCBvZiBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgdG8gYmUgcmV1c2VkIGluIGRpZmZlcmVudCB0aHJlYWRzLCBvciBpdCBtYXkgY3JlYXRlIGFuZCBmb3JnZXQgYSBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QKLW9uY2UgYSB0aHJlYWQgaGFzIGJlZW4gY3JlYXRlZCBhbmQgc3RhcnRlZCBmb3IgaXQuCi0KLVRoZSBcdGV4dHR0e1RocmVhZH0gY2xhc3MgdGFrZXMgYSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gcmVmZXJlbmNlIHRvIHRoZSBob3N0ZWQKLVx0ZXh0dHR7UnVubmFibGV9IG9iamVjdCBpbiBpdHMgY29uc3RydWN0b3IsIHdoaWxlIHRoZSBcdGV4dHR0e1J1bm5hYmxlfSBjbGFzcyBoYXMgYW4KLWV4cGxpY2l0IFx0ZXh0dHR7dGhyZWFkfSBtZXRob2QgdG8gYWxsb3cgZXhwbGljaXQgYmluZGluZyBvZiB0aGUgaG9zdGVkIHRocmVhZC4KLVx0ZXh0dHR7VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkfSBiaW5kcyB0aGUgb2JqZWN0cyB0byBlYWNoIG90aGVyLgotCi1cc3Vic2VjdGlvbntUaHJlYWRNYW5hZ2VyfQotCi1cdGV4dHR0e1RocmVhZE1hbmFnZXJ9IGNyZWF0ZXMgYSBwb29sIG9mIHdvcmtlciB0aHJlYWRzIGFuZAotYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzY2hlZHVsZSB0YXNrcyBmb3IgZXhlY3V0aW9uIGFzIGZyZWUgd29ya2VyIHRocmVhZHMKLWJlY29tZSBhdmFpbGFibGUuIFRoZSBcdGV4dHR0e1RocmVhZE1hbmFnZXJ9IGRvZXMgbm90IGltcGxlbWVudCBkeW5hbWljCi10aHJlYWQgcG9vbCByZXNpemluZywgYnV0IHByb3ZpZGVzIHByaW1pdGl2ZXMgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGFkZAotYW5kIHJlbW92ZSB0aHJlYWRzIGJhc2VkIG9uIGxvYWQuIFRoaXMgYXBwcm9hY2ggd2FzIGNob3NlbiBiZWNhdXNlCi1pbXBsZW1lbnRpbmcgbG9hZCBtZXRyaWNzIGFuZCB0aHJlYWQgcG9vbCBzaXplIGlzIHZlcnkgYXBwbGljYXRpb24KLXNwZWNpZmljLiBGb3IgZXhhbXBsZSBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2FudCB0byBhZGp1c3QgcG9vbCBzaXplIGJhc2VkCi1vbiBydW5uaW5nLWF2ZXJhZ2Ugb2Ygd29yayBhcnJpdmFsIHJhdGVzIHRoYXQgYXJlIG1lYXN1cmVkIHZpYSBwb2xsZWQKLXNhbXBsZXMuIE90aGVycyBtYXkgc2ltcGx5IHdpc2ggdG8gcmVhY3QgaW1tZWRpYXRlbHkgdG8gd29yay1xdWV1ZQotZGVwdGggaGlnaCBhbmQgbG93IHdhdGVyIG1hcmtzLiBSYXRoZXIgdGhhbiB0cnlpbmcgdG8gY3JlYXRlIGEgY29tcGxleAotQVBJIGFic3RyYWN0IGVub3VnaCB0byBjYXB0dXJlIHRoZXNlIGRpZmZlcmVudCBhcHByb2FjaGVzLCB3ZQotc2ltcGx5IGxlYXZlIGl0IHVwIHRvIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGFuZCBwcm92aWRlIHRoZQotcHJpbWl0aXZlcyB0byBlbmFjdCB0aGUgZGVzaXJlZCBwb2xpY3kgYW5kIHNhbXBsZSBjdXJyZW50IHN0YXR1cy4KLQotXHN1YnNlY3Rpb257VGltZXJNYW5hZ2VyfQotCi1cdGV4dHR0e1RpbWVyTWFuYWdlcn0gYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzY2hlZHVsZQotIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMgZm9yIGV4ZWN1dGlvbiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuIEl0cyBzcGVjaWZpYyB0YXNrCi1pcyB0byBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHNhbXBsZSBcdGV4dHR0e1RocmVhZE1hbmFnZXJ9IGxvYWQgYXQgcmVndWxhcgotaW50ZXJ2YWxzIGFuZCBtYWtlIGNoYW5nZXMgdG8gdGhlIHRocmVhZCBwb29sIHNpemUgYmFzZWQgb24gYXBwbGljYXRpb24gcG9saWN5LgotT2YgY291cnNlLCBpdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhbnkgbnVtYmVyIG9mIHRpbWVyIG9yIGFsYXJtIGV2ZW50cy4KLQotVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgXHRleHR0dHtUaW1lck1hbmFnZXJ9IHVzZXMgYSBzaW5nbGUgdGhyZWFkIHRvCi1leGVjdXRlIGV4cGlyZWQgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0cy4gVGh1cywgaWYgYSB0aW1lciBvcGVyYXRpb24gbmVlZHMgdG8KLWRvIGEgbGFyZ2UgYW1vdW50IG9mIHdvcmsgYW5kIGVzcGVjaWFsbHkgaWYgaXQgbmVlZHMgdG8gZG8gYmxvY2tpbmcgSS9PLAotdGhhdCBzaG91bGQgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHRocmVhZC4KLQotXHN1YnNlY3Rpb257Tm9uYmxvY2tpbmcgT3BlcmF0aW9ufQotVGhvdWdoIHRoZSBUaHJpZnQgdHJhbnNwb3J0IGludGVyZmFjZXMgbWFwIG1vcmUgZGlyZWN0bHkgdG8gYSBibG9ja2luZyBJL08KLW1vZGVsLCB3ZSBoYXZlIGltcGxlbWVudGVkIGEgaGlnaCBwZXJmb3JtYW5jZSBcdGV4dHR0e1ROb25CbG9ja2luZ1NlcnZlcn0KLWluIEMrKyBiYXNlZCBvbiBcdGV4dHR0e2xpYmV2ZW50fSBhbmQgdGhlIFx0ZXh0dHR7VEZyYW1lZFRyYW5zcG9ydH0uIFdlCi1pbXBsZW1lbnRlZCB0aGlzIGJ5IG1vdmluZyBhbGwgSS9PIGludG8gb25lIHRpZ2h0IGV2ZW50IGxvb3AgdXNpbmcgYQotc3RhdGUgbWFjaGluZS4gRXNzZW50aWFsbHksIHRoZSBldmVudCBsb29wIHJlYWRzIGZyYW1lZCByZXF1ZXN0cyBpbnRvCi1cdGV4dHR0e1RNZW1vcnlCdWZmZXJ9IG9iamVjdHMuIE9uY2UgZW50aXJlIHJlcXVlc3RzIGFyZSByZWFkeSwgdGhleSBhcmUKLWRpc3BhdGNoZWQgdG8gdGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gb2JqZWN0IHdoaWNoIGNhbiByZWFkIGRpcmVjdGx5IGZyb20KLXRoZSBkYXRhIGluIG1lbW9yeS4KLQotXHN1YnNlY3Rpb257Q29tcGlsZXJ9Ci1UaGUgVGhyaWZ0IGNvbXBpbGVyIGlzIGltcGxlbWVudGVkIGluIEMrKyB1c2luZyBzdGFuZGFyZCBcdGV4dHR0e2xleH0vXHRleHR0dHt5YWNjfQotbGV4aW5nIGFuZCBwYXJzaW5nLiBUaG91Z2ggaXQgY291bGQgaGF2ZSBiZWVuIGltcGxlbWVudGVkIHdpdGggZmV3ZXIKLWxpbmVzIG9mIGNvZGUgaW4gYW5vdGhlciBsYW5ndWFnZSAoaS5lLiBQeXRob24gTGV4LVlhY2MgKFBMWSkgb3IgXHRleHR0dHtvY2FtbHlhY2N9KSwgdXNpbmcgQysrCi1mb3JjZXMgZXhwbGljaXQgZGVmaW5pdGlvbiBvZiB0aGUgbGFuZ3VhZ2UgY29uc3RydWN0cy4gU3Ryb25nbHkgdHlwaW5nIHRoZQotcGFyc2UgdHJlZSBlbGVtZW50cyAoZGViYXRhYmx5KSBtYWtlcyB0aGUgY29kZSBtb3JlIGFwcHJvYWNoYWJsZSBmb3IgbmV3Ci1kZXZlbG9wZXJzLgotCi1Db2RlIGdlbmVyYXRpb24gaXMgZG9uZSB1c2luZyB0d28gcGFzc2VzLiBUaGUgZmlyc3QgcGFzcyBsb29rcyBvbmx5IGZvcgotaW5jbHVkZSBmaWxlcyBhbmQgdHlwZSBkZWZpbml0aW9ucy4gVHlwZSBkZWZpbml0aW9ucyBhcmUgbm90IGNoZWNrZWQgZHVyaW5nCi10aGlzIHBoYXNlLCBzaW5jZSB0aGV5IG1heSBkZXBlbmQgdXBvbiBpbmNsdWRlIGZpbGVzLiBBbGwgaW5jbHVkZWQgZmlsZXMKLWFyZSBzZXF1ZW50aWFsbHkgc2Nhbm5lZCBpbiBhIGZpcnN0IHBhc3MuIE9uY2UgdGhlIGluY2x1ZGUgdHJlZSBoYXMgYmVlbgotcmVzb2x2ZWQsIGEgc2Vjb25kIHBhc3Mgb3ZlciBhbGwgZmlsZXMgaXMgdGFrZW4gdGhhdCBpbnNlcnRzIHR5cGUgZGVmaW5pdGlvbnMKLWludG8gdGhlIHBhcnNlIHRyZWUgYW5kIHJhaXNlcyBhbiBlcnJvciBvbiBhbnkgdW5kZWZpbmVkIHR5cGVzLiBUaGUgcHJvZ3JhbSBpcwotdGhlbiBnZW5lcmF0ZWQgYWdhaW5zdCB0aGUgcGFyc2UgdHJlZS4KLQotRHVlIHRvIGluaGVyZW50IGNvbXBsZXhpdGllcyBhbmQgcG90ZW50aWFsIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMsCi13ZSBleHBsaWNpdGx5IGRpc2FsbG93IGZvcndhcmQgZGVjbGFyYXRpb24uIFR3byBUaHJpZnQgc3RydWN0cyBjYW5ub3QKLWVhY2ggY29udGFpbiBhbiBpbnN0YW5jZSBvZiB0aGUgb3RoZXIuIChTaW5jZSB3ZSBkbyBub3QgYWxsb3cgXHRleHR0dHtudWxsfQotc3RydWN0IGluc3RhbmNlcyBpbiB0aGUgZ2VuZXJhdGVkIEMrKyBjb2RlLCB0aGlzIHdvdWxkIGFjdHVhbGx5IGJlIGltcG9zc2libGUuKQotCi1cc3Vic2VjdGlvbntURmlsZVRyYW5zcG9ydH0KLVRoZSBcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSBsb2dzIFRocmlmdCByZXF1ZXN0cy9zdHJ1Y3RzIGJ5Ci1mcmFtaW5nIGluY29taW5nIGRhdGEgd2l0aCBpdHMgbGVuZ3RoIGFuZCB3cml0aW5nIGl0IG91dCB0byBkaXNrLgotVXNpbmcgYSBmcmFtZWQgb24tZGlzayBmb3JtYXQgYWxsb3dzIGZvciBiZXR0ZXIgZXJyb3IgY2hlY2tpbmcgYW5kCi1oZWxwcyB3aXRoIHRoZSBwcm9jZXNzaW5nIG9mIGEgZmluaXRlIG51bWJlciBvZiBkaXNjcmV0ZSBldmVudHMuIFRoZVxcCi1cdGV4dHR0e1RGaWxlV3JpdGVyVHJhbnNwb3J0fSB1c2VzIGEgc3lzdGVtIG9mIHN3YXBwaW5nIGluLW1lbW9yeSBidWZmZXJzCi10byBlbnN1cmUgZ29vZCBwZXJmb3JtYW5jZSB3aGlsZSBsb2dnaW5nIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4KLUEgVGhyaWZ0IGxvZyBmaWxlIGlzIHNwbGl0IHVwIGludG8gY2h1bmtzIG9mIGEgc3BlY2lmaWVkIHNpemU7IGxvZ2dlZCBtZXNzYWdlcwotYXJlIG5vdCBhbGxvd2VkIHRvIGNyb3NzIGNodW5rIGJvdW5kYXJpZXMuIEEgbWVzc2FnZSB0aGF0IHdvdWxkIGNyb3NzIGEgY2h1bmsKLWJvdW5kYXJ5IHdpbGwgY2F1c2UgcGFkZGluZyB0byBiZSBhZGRlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjaHVuayBhbmQgdGhlCi1maXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlIGFyZSBhbGlnbmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgY2h1bmsuCi1QYXJ0aXRpb25pbmcgdGhlIGZpbGUgaW50byBjaHVua3MgbWFrZXMgaXQgcG9zc2libGUgdG8gcmVhZCBhbmQgaW50ZXJwcmV0IGRhdGEKLWZyb20gYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBmaWxlLgotCi1cc2VjdGlvbntGYWNlYm9vayBUaHJpZnQgU2VydmljZXN9Ci1UaHJpZnQgaGFzIGJlZW4gZW1wbG95ZWQgaW4gYSBsYXJnZSBudW1iZXIgb2YgYXBwbGljYXRpb25zIGF0IEZhY2Vib29rLCBpbmNsdWRpbmcKLXNlYXJjaCwgbG9nZ2luZywgbW9iaWxlLCBhZHMgYW5kIHRoZSBkZXZlbG9wZXIgcGxhdGZvcm0uIFR3byBzcGVjaWZpYyB1c2FnZXMgYXJlIGRpc2N1c3NlZCBiZWxvdy4KLQotXHN1YnNlY3Rpb257U2VhcmNofQotVGhyaWZ0IGlzIHVzZWQgYXMgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBsYXllciBmb3IgdGhlIEZhY2Vib29rIFNlYXJjaCBzZXJ2aWNlLgotVGhlIG11bHRpLWxhbmd1YWdlIGNvZGUgZ2VuZXJhdGlvbiBpcyB3ZWxsIHN1aXRlZCBmb3Igc2VhcmNoIGJlY2F1c2UgaXQgYWxsb3dzIGZvciBhcHBsaWNhdGlvbgotZGV2ZWxvcG1lbnQgaW4gYW4gZWZmaWNpZW50IHNlcnZlciBzaWRlIGxhbmd1YWdlIChDKyspIGFuZCBhbGxvd3MgdGhlIEZhY2Vib29rIFBIUC1iYXNlZCB3ZWIgYXBwbGljYXRpb24KLXRvIG1ha2UgY2FsbHMgdG8gdGhlIHNlYXJjaCBzZXJ2aWNlIHVzaW5nIFRocmlmdCBQSFAgbGlicmFyaWVzLiBUaGVyZSBpcyBhbHNvIGEgbGFyZ2UKLXZhcmlldHkgb2Ygc2VhcmNoIHN0YXRzLCBkZXBsb3ltZW50IGFuZCB0ZXN0aW5nIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBidWlsdCBvbiB0b3AKLW9mIGdlbmVyYXRlZCBQeXRob24gY29kZS4gQWRkaXRpb25hbGx5LCB0aGUgVGhyaWZ0IGxvZyBmaWxlIGZvcm1hdCBpcwotdXNlZCBhcyBhIHJlZG8gbG9nIGZvciBwcm92aWRpbmcgcmVhbC10aW1lIHNlYXJjaCBpbmRleCB1cGRhdGVzLiBUaHJpZnQgaGFzIGFsbG93ZWQgdGhlCi1zZWFyY2ggdGVhbSB0byBsZXZlcmFnZSBlYWNoIGxhbmd1YWdlIGZvciBpdHMgc3RyZW5ndGhzIGFuZCB0byBkZXZlbG9wIGNvZGUgYXQgYSByYXBpZCBwYWNlLgotCi1cc3Vic2VjdGlvbntMb2dnaW5nfQotVGhlIFRocmlmdCBcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgZm9yIHN0cnVjdHVyZWQgbG9nZ2luZy4gRWFjaAotc2VydmljZSBmdW5jdGlvbiBkZWZpbml0aW9uIGFsb25nIHdpdGggaXRzIHBhcmFtZXRlcnMgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUKLWEgc3RydWN0dXJlZCBsb2cgZW50cnkgaWRlbnRpZmllZCBieSB0aGUgZnVuY3Rpb24gbmFtZS4gVGhpcyBsb2cgY2FuIHRoZW4gYmUgdXNlZCBmb3IKLWEgdmFyaWV0eSBvZiBwdXJwb3NlcywgaW5jbHVkaW5nIGlubGluZSBhbmQgb2ZmbGluZSBwcm9jZXNzaW5nLCBzdGF0cyBhZ2dyZWdhdGlvbiBhbmQgYXMgYSByZWRvIGxvZy4KLQotXHNlY3Rpb257Q29uY2x1c2lvbnN9Ci1UaHJpZnQgaGFzIGVuYWJsZWQgRmFjZWJvb2sgdG8gYnVpbGQgc2NhbGFibGUgYmFja2VuZAotc2VydmljZXMgZWZmaWNpZW50bHkgYnkgZW5hYmxpbmcgZW5naW5lZXJzIHRvIGRpdmlkZSBhbmQgY29ucXVlci4gQXBwbGljYXRpb24KLWRldmVsb3BlcnMgY2FuIGZvY3VzIG9uIGFwcGxpY2F0aW9uIGNvZGUgd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUKLXNvY2tldHMgbGF5ZXIuIFdlIGF2b2lkIGR1cGxpY2F0ZWQgd29yayBieSB3cml0aW5nIGJ1ZmZlcmluZyBhbmQgSS9PIGxvZ2ljCi1pbiBvbmUgcGxhY2UsIHJhdGhlciB0aGFuIGludGVyc3BlcnNpbmcgaXQgaW4gZWFjaCBhcHBsaWNhdGlvbi4KLQotVGhyaWZ0IGhhcyBiZWVuIGVtcGxveWVkIGluIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucyBhdCBGYWNlYm9vaywKLWluY2x1ZGluZyBzZWFyY2gsIGxvZ2dpbmcsIG1vYmlsZSwgYWRzLCBhbmQgdGhlIGRldmVsb3BlciBwbGF0Zm9ybS4gV2UgaGF2ZQotZm91bmQgdGhhdCB0aGUgbWFyZ2luYWwgcGVyZm9ybWFuY2UgY29zdCBpbmN1cnJlZCBieSBhbiBleHRyYSBsYXllciBvZgotc29mdHdhcmUgYWJzdHJhY3Rpb24gaXMgZmFyIGVjbGlwc2VkIGJ5IHRoZSBnYWlucyBpbiBkZXZlbG9wZXIgZWZmaWNpZW5jeSBhbmQKLXN5c3RlbXMgcmVsaWFiaWxpdHkuCi0KLVxhcHBlbmRpeAotCi1cc2VjdGlvbntTaW1pbGFyIFN5c3RlbXN9Ci1UaGUgZm9sbG93aW5nIGFyZSBzb2Z0d2FyZSBzeXN0ZW1zIHNpbWlsYXIgdG8gVGhyaWZ0LiBFYWNoIGlzICh2ZXJ5ISkgYnJpZWZseQotZGVzY3JpYmVkOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFx0ZXh0aXR7U09BUC59IFhNTC1iYXNlZC4gRGVzaWduZWQgZm9yIHdlYiBzZXJ2aWNlcyB2aWEgSFRUUCwgZXhjZXNzaXZlCi1YTUwgcGFyc2luZyBvdmVyaGVhZC4KLVxpdGVtIFx0ZXh0aXR7Q09SQkEufSBSZWxhdGl2ZWx5IGNvbXByZWhlbnNpdmUsIGRlYmF0YWJseSBvdmVyZGVzaWduZWQgYW5kCi1oZWF2eXdlaWdodC4gQ29tcGFyYWJseSBjdW1iZXJzb21lIHNvZnR3YXJlIGluc3RhbGxhdGlvbi4KLVxpdGVtIFx0ZXh0aXR7Q09NLn0gRW1icmFjZWQgbWFpbmx5IGluIFdpbmRvd3MgY2xpZW50IHNvZnRhcmUuIE5vdCBhbiBlbnRpcmVseQotb3BlbiBzb2x1dGlvbi4KLVxpdGVtIFx0ZXh0aXR7UGlsbGFyLn0gTGlnaHR3ZWlnaHQgYW5kIGhpZ2gtcGVyZm9ybWFuY2UsIGJ1dCBtaXNzaW5nIHZlcnNpb25pbmcKLWFuZCBhYnN0cmFjdGlvbi4KLVxpdGVtIFx0ZXh0aXR7UHJvdG9jb2wgQnVmZmVycy59IENsb3NlZC1zb3VyY2UsIG93bmVkIGJ5IEdvb2dsZS4gRGVzY3JpYmVkIGluCi1TYXd6YWxsIHBhcGVyLgotXGVuZHtpdGVtaXplfQotCi1cYWNrcwotCi1NYW55IHRoYW5rcyBmb3IgZmVlZGJhY2sgb24gVGhyaWZ0IChhbmQgZXh0cmVtZSB0cmlhbCBieSBmaXJlKSBhcmUgZHVlIHRvCi1NYXJ0aW4gU21pdGgsIEthcmwgVm9za3VpbCBhbmQgWWlzaGFuIFdvbmcuCi0KLVRocmlmdCBpcyBhIHN1Y2Nlc3NvciB0byBQaWxsYXIsIGEgc2ltaWxhciBzeXN0ZW0gZGV2ZWxvcGVkCi1ieSBBZGFtIEQnQW5nZWxvLCBmaXJzdCB3aGlsZSBhdCBDYWx0ZWNoIGFuZCBjb250aW51ZWQgbGF0ZXIgYXQgRmFjZWJvb2suCi1UaHJpZnQgc2ltcGx5IHdvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIHdpdGhvdXQgQWRhbSdzIGluc2lnaHRzLgotCi1cYmVnaW57dGhlYmlibGlvZ3JhcGh5fXt9Ci0KLVxiaWJpdGVte2Jvb3N0LnRocmVhZHN9Ci1LZW1wZiwgV2lsbGlhbSwKLWBgQm9vc3QuVGhyZWFkcycnLAotXHVybHtodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvaHRtbC90aHJlYWRzLmh0bWx9Ci0KLVxiaWJpdGVte2Jvb3N0LnRocmVhZHBvb2x9Ci1IZW5rZWwsIFBoaWxpcHAsCi1gYHRocmVhZHBvb2wnJywKLVx1cmx7aHR0cDovL3RocmVhZHBvb2wuc291cmNlZm9yZ2UubmV0fQotCi1cZW5ke3RoZWJpYmxpb2dyYXBoeX0KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL2R1Yi5qc29uIGIvZHViLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NmFmYwotLS0gL2Rldi9udWxsCisrKyBiL2R1Yi5qc29uCkBAIC0wLDAgKzEsMjggQEAKK3sKKyAgIm5hbWUiOiAiYXBhY2hlLXRocmlmdCIsCisgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IEQgbGlicmFyeSIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iCisgIF0sCisgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAibGliZXZlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICJ+PjIuMC4yIgorICAgIH0sCisgICAgIm9wZW5zc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICI+PTEuMS42IgorICAgIH0KKyAgfSwKKyAgInN5c3RlbURlcGVuZGVuY2llcyI6ICJPbiBzeXN0ZW1zIHdpdGggbmF0aXZlIG9wZW5zc2wgMS4wLnggdXNlIGR1YiBwYWNrYWdlIG9wZW5zc2x+PjEuMSwgb24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMS54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4yLjAiLAorICAidGFyZ2V0VHlwZSI6ICJsaWJyYXJ5IiwKKyAgInNvdXJjZVBhdGhzIjogWworICAgICJsaWIvZC9zcmMiIAorICBdLAorICAiaW1wb3J0UGF0aHMiOiBbCisgICAgImxpYi9kL3NyYyIKKyAgXSwKKyAgImV4Y2x1ZGVkU291cmNlRmlsZXMiOiBbCisgICAgImxpYi9kL3NyYy90aHJpZnQvaW5kZXguZCIKKyAgXQorfQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCmluZGV4IDlkYmMxYzEuLmI2Y2UyMGUgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9CitTVUJESVJTID0ganNvbiB4bWwKK1BSRUNST1NTX1RBUkdFVCA9CiAKIGlmIFdJVEhfQ1BQCisjIGNwcCBkaXIgaXMgcGlja2VkIGRpcmVjdGx5IGJ5IHBsdWdpbiBidWlsZAoraWYgIVdJVEhfUExVR0lOCiBTVUJESVJTICs9IGNwcAogZW5kaWYKK2VuZGlmCiAKIGlmIFdJVEhfQ19HTElCCiBTVUJESVJTICs9IGNfZ2xpYgpAQCAtMzMsNiArMzcsMTAgQEAKIAogaWYgV0lUSF9KQVZBCiBTVUJESVJTICs9IGphdmEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1qYXZhCisjIEphdmFTY3JpcHQgdW5pdCB0ZXN0IGRlcGVuZHMgb24gamF2YQorIyBzbyB0ZXN0IG9ubHkgaWYgamF2YSwgYW50ICYgY28gaXMgYXZhaWxhYmxlCitTVUJESVJTICs9IGpzCiBlbmRpZgogCiBpZiBXSVRIX1BZVEhPTgpAQCAtNTksMTEgKzY3LDYwIEBACiBTVUJESVJTICs9IHBocAogZW5kaWYKIAoraWYgV0lUSF9EQVJUCitTVUJESVJTICs9IGRhcnQKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCitpZiBXSVRIX0dPCitTVUJESVJTICs9IGdvCitlbmRpZgorCitpZiBXSVRIX0QKK1NVQkRJUlMgKz0gZAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWQKK2VuZGlmCisKK2lmIFdJVEhfTk9ERUpTCitTVUJESVJTICs9IG5vZGVqcworUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLW5vZGVqcworU1VCRElSUyArPSBub2RldHMKK2VuZGlmCisKK2lmIFdJVEhfTFVBCitTVUJESVJTICs9IGx1YQorZW5kaWYKKworaWYgV0lUSF9SUworU1VCRElSUyArPSBycworZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorZW5kaWYKKworaWYgV0lUSF9TV0lGVAorU1VCRElSUyArPSBzd2lmdAorZW5kaWYKKwogIyBBbGwgb2YgdGhlIGxpYnMgdGhhdCBkb24ndCB1c2UgQXV0b21ha2UgbmVlZCB0byBnbyBpbiBoZXJlCiAjIHNvIHRoZXkgd2lsbCBlbmQgdXAgaW4gb3VyIHJlbGVhc2UgdGFyYmFsbHMuCiBFWFRSQV9ESVNUID0gXAotICBjb2NvYSBcCi0gIG9jYW1sIFwKLSAganMgXAotICBhczMgXAotICBzdAorCWFzMyBcCisJY29jb2EgXAorCWQgXAorCWRhcnQgXAorCWRlbHBoaSBcCisJaGF4ZSBcCisJamF2YW1lIFwKKwlqcyBcCisJb2NhbWwgXAorCXN0IFwKKwl0cworCitwcmVjcm9zcy0lOgorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiAkKFBSRUNST1NTX1RBUkdFVCkKZGlmZiAtLWdpdCBhL2xpYi9hczMvYnVpbGQucHJvcGVydGllcyBiL2xpYi9hczMvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvYXMzL2J1aWxkLnhtbCBiL2xpYi9hczMvYnVpbGQueG1sCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMWI3YTU0NC4uYjBjNGM4NQotLS0gYS9saWIvYXMzL2J1aWxkLnhtbAorKysgYi9saWIvYXMzL2J1aWxkLnhtbApAQCAtOCw3ICs4LDcgQEAKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0xNiw1MSArMTYsMTY3IEBACiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9ImxpYnRocmlmdCIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiI+CisgLS0+Cis8cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQtYXMzIiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIgorICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KIAotICA8ZGVzY3JpcHRpb24+VGhyaWZ0IEJ1aWxkIEZpbGU8L2Rlc2NyaXB0aW9uPgorICA8cHJvcGVydHkgbmFtZT0iYXMzLmFydGlmYWN0aWQiIHZhbHVlPSIke2FudC5wcm9qZWN0Lm5hbWV9Ii8+CiAKLSAgPHRhc2tkZWYgcmVzb3VyY2U9ImZsZXhUYXNrcy50YXNrcyIgY2xhc3NwYXRoPSIke0ZMRVhfSE9NRX0vYW50L2xpYi9mbGV4VGFza3MuamFyIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCi0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZCIgLz4KKyAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9ncmFkbGUucHJvcGVydGllcyIgLz4KIAotICA8dGFyZ2V0IG5hbWU9ImNoZWNrRmxleEhvbWUiIHVubGVzcz0iRkxFWF9IT01FIj4KLSAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIHByb3BlcnR5IEZMRVhfSE9NRSB3aXRoIHRoZSBwYXRoIHRvIHlvdXIgZmxleCBTREssIGVnLiBhbnQgLURGTEVYX0hPTUU9Ii9BcHBsaWNhdGlvbnMvQWRvYmUgRmxleCBCdWlsZGVyIDMvc2Rrcy8zLjIuMCInLz4KKyAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgorICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgorICA8L2NvbmRpdGlvbj4KKyAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1TTkFQU0hPVCIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJhczMuZmluYWwubmFtZSIgdmFsdWU9IiR7YXMzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KKworICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYXMzLnN3Yy5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7YXMzLmZpbmFsLm5hbWV9LnN3YyIvPgorICA8cHJvcGVydHkgbmFtZT0iYXMzLnBvbS54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHthczMuZmluYWwubmFtZX0ucG9tIi8+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJzZXR1cC5pbml0LGZsZXguaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJjaGVja0ZsZXhIb21lIj4KKyAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KKyAgICA8dHN0YW1wLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CiAKLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICA8dGFyZ2V0IG5hbWU9ImZsZXguY2hlY2siIHVubGVzcz0iRkxFWF9IT01FIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIEZMRVhfSE9NRSBwcm9wZXJ0eSBwb2ludGluZyB0byB5b3VyIGZsZXggU0RLLCBlZy4gYW50IC1ERkxFWF9IT01FPSIvQXBwbGljYXRpb25zL0Fkb2JlIEZsZXggQnVpbGRlciAzL3Nka3MvMy4yLjAiJy8+CisgIDwvdGFyZ2V0PgogCi0gICAgPCEtLSBjb21wYyB0YWtlcyBhIGxpc3Qgb2YgY2xhc3NlcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBlZy4gInBrZy5DbGFzcyBwa2cuQ2xhc3MyIgotICAgICAgICAgVG8gZ2VuZXJhdGUgdGhpcywgd2UgaGF2ZSB0byBjcmVhdGUgYW4gYW50IHBhdGgsIHRoZW4gY29udmVydCBpdCB1c2luZwotICAgICAgICAgcGF0aGNvbnZlcnQsIHJlbW92aW5nIHRoZSBwcmVmaXggd2l0aCBhIG1hcCBhbmQgcmVtb3ZpbmcgdGhlIC5hcyBzdWZmaXggdXNpbmcKLSAgICAgICAgIGEgbWFwcGVyLiAgRnJvbSBodHRwOi8vc25pcHBldHMuZHpvbmUuY29tL3Bvc3RzL3Nob3cvMzYyNy4KLSAgICAtLT4KLSAgICA8cGF0aCBpZD0iY2xhc3Nlc1JhdyI+CisgIDx0YXJnZXQgbmFtZT0iZmxleC5pbml0IiBkZXBlbmRzPSJmbGV4LmNoZWNrIiB1bmxlc3M9ImZsZXguZmluaXNoZWQiPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmxleC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8cGF0aCBpZD0iYXMuc3JjLmZpbGVzIj4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9LyI+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmFzIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouYXMiLz4KICAgICAgIDwvZmlsZXNldD4KICAgICA8L3BhdGg+Ci0gICAgPHBhdGhjb252ZXJ0IAotICAgICAgcHJvcGVydHk9ImNsYXNzZXNDbGVhbiIgCi0gICAgICBwYXRoc2VwPSIgIiAKLSAgICAgIGRpcnNlcD0iLiIgCi0gICAgICByZWZpZD0iY2xhc3Nlc1JhdyI+CisgICAgPHBhdGhjb252ZXJ0CisgICAgICBwcm9wZXJ0eT0iYXMuc3JjLmNsYXNzZXMiCisgICAgICBwYXRoc2VwPSIgIgorICAgICAgZGlyc2VwPSIuIgorICAgICAgcmVmaWQ9ImFzLnNyYy5maWxlcyIKKyAgICA+CiAgICAgICA8bWFwIGZyb209IiR7c3JjfS8iIHRvPSIiLz4KICAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5hcyIgdG89IioiLz4KICAgICA8L3BhdGhjb252ZXJ0PgogCi0gICAgPGNvbXBjIG91dHB1dD0iJHtidWlsZH0vbGlidGhyaWZ0LnN3YyIgaW5jbHVkZS1jbGFzc2VzPSIke2NsYXNzZXNDbGVhbn0iPgorICAgIDxjb21wYyBvdXRwdXQ9IiR7YXMzLnN3Yy5maWxlfSIgaW5jbHVkZS1jbGFzc2VzPSIke2FzLnNyYy5jbGFzc2VzfSI+CiAgICAgICA8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3NyY30iLz4KICAgICA8L2NvbXBjPgotCiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgICAgPGVjaG8gbWVzc2FnZT0iJHttdm4uYW50LnRhc2suamFyfSIvPgorICAgIDwhLS0gRG93bmxvYWQgbXZuIGFudCB0YXNrcywgZG93bmxvYWQgZGVwZW5kZW5jaWVzLCBhbmQgc2V0dXAgcG9tIGZpbGUgLS0+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KKworICAgIDwhLS0gcmVtb3RlIHJlcG9zaXRvcmllcyB1c2VkIHRvIGRvd25sb2FkIGRlcGVuZGVuY2llcyBmcm9tIC0tPgorICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJjZW50cmFsIiB1cmw9IiR7bXZuLnJlcG99Ii8+CisgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgorCisgICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKKyAgICAgIGFydGlmYWN0SWQ9IiR7YXMzLmFydGlmYWN0aWR9IgorICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKKyAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKKyAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKKyAgICAgIHBhY2thZ2luZz0ic3djIgorICAgID4KKyAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CisgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CisgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCisgICAgICAvPgorICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJkcmVpc3MiIG5hbWU9IkRhdmlkIFJlaXNzIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJhZGl0eWEiIG5hbWU9IkFkaXR5YSBBZ2Fyd2FsIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJtYXJjayIgbmFtZT0iTWFyYyBLd2lhdGtvd3NraSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iandhbmciIG5hbWU9IkphbWVzIFdhbmciLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImNwaXJvIiBuYW1lPSJDaHJpcyBQaXJvIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJibWF1cmVyIiBuYW1lPSJCZW4gTWF1cmVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJrY2xhcmsiIG5hbWU9IktldmluIENsYXJrIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqYWtlIiBuYW1lPSJKYWtlIEx1Y2lhbmkiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImJyeWFuZHV4YnVyeSIgbmFtZT0iQnJ5YW4gRHV4YnVyeSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iZXN0ZXZlIiBuYW1lPSJFc3RldmUgRmVybmFuZGV6Ii8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJ0b2RkIiBuYW1lPSJUb2RkIExpcGNvbiIvPgorICAgICAgPGRldmVsb3BlciBpZD0iZ2VlY2hvcmFtYSIgbmFtZT0iQW5kcmV3IE1jR2VhY2hpZSIvPgorICAgICAgPGRldmVsb3BlciBpZD0ibW9saW5hcm8iIG5hbWU9IkFudGhvbnkgTW9saW5hcm8iLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9InJvZ2VyIiBuYW1lPSJSb2dlciBNZWllciIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamZhcnJlbGwiIG5hbWU9Ikpha2UgRmFycmVsbCIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamVuc2ciIG5hbWU9IkplbnMgR2V5ZXIiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImNhcmwiIG5hbWU9IkNhcmwgWWVrc2lnaWFuIi8+CisgICAgPC9hcnRpZmFjdDpwb20+CisKKyAgICA8IS0tIEdlbmVyYXRlIHRoZSBwb20gZmlsZSAtLT4KKyAgICA8YXJ0aWZhY3Q6d3JpdGVwb20gcG9tUmVmSWQ9InBvbSIgZmlsZT0iJHthczMucG9tLnhtbH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJzaWduQW5kRGVwbG95Ij4KKyAgICA8IS0tIFNpZ24gYW5kIGRlcGxveSBqYXJzIHRvIGFwYWNoZSByZXBvIC0tPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NpZmllciIgZGVmYXVsdD0iIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdpbmciIGRlZmF1bHQ9ImphciIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tIiBkZWZhdWx0PSIiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSI+CisgICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuMTpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1QZ3BnIi8+CisgICAgICA8L2FydGlmYWN0Om12bj4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixjb21waWxlLG12bi5pbml0Ij4KKyAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2VzIGFuZCB0aGVuIHNlbmQgcmVsZWFzZSB0byBhcGFjaGUgbWF2ZW4gcmVwbyAtLT4KKyAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaCAtLT4KKyAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5wb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgorICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7YXMzLnN3Yy5maWxlfSIgcGFja2FnaW5nPSJzd2MiIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgorICA8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXJyb3IuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcwppbmRleCAwMzlkOWI5Li4zNDQ4ZmNlIDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcwpAQCAtNDAsMTEgKzQwLDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBXUk9OR19NRVRIT0RfTkFNRTppbnQgPSAzOwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgQkFEX1NFUVVFTkNFX0lEOmludCA9IDQ7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBNSVNTSU5HX1JFU1VMVDppbnQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5URVJOQUxfRVJST1I6aW50ID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IFBST1RPQ09MX0VSUk9SOmludCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBJTlZBTElEX1RSQU5TRk9STTppbnQgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5WQUxJRF9QUk9UT0NPTDppbnQgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6aW50ID0gMTA7CiAKICAgICBwdWJsaWMgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXJyb3IodHlwZTppbnQgPSBVTktOT1dOLCBtZXNzYWdlOlN0cmluZyA9ICIiKSB7CiAgICAgICBzdXBlcihtZXNzYWdlLCB0eXBlKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTpUQXBwbGljYXRpb25FcnJvciB7CiAgICAgICB2YXIgZmllbGQ6VEZpZWxkOwogICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMKaW5kZXggNDQxMjQ3OS4uYjJmZjlkOCAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5hcwpAQCAtMzgsOSArMzgsNiBAQAogICAgIHByb3RlY3RlZCB2YXIgc3RyaWN0UmVhZF86Qm9vbGVhbiA9IGZhbHNlOwogICAgIHByb3RlY3RlZCB2YXIgc3RyaWN0V3JpdGVfOkJvb2xlYW4gPSB0cnVlOwogICAgIAotICAgIHByb3RlY3RlZCB2YXIgcmVhZExlbmd0aF86aW50OwotICAgIHByb3RlY3RlZCB2YXIgY2hlY2tSZWFkTGVuZ3RoXzpCb29sZWFuID0gZmFsc2U7Ci0KICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCkBAIC0yOTgsNyArMjk1LDYgQEAKICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKTpCeXRlQXJyYXkgewogICAgICAgICB2YXIgc2l6ZTppbnQgPSByZWFkSTMyKCk7Ci0gICAgICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKICAgICAgICAgdmFyIGJ1ZjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CiAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBidWY7CkBAIC0zMDcsMjUgKzMwMywxMCBAQAogICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEFsbChsZW46aW50KTp2b2lkIHsKICAgICAgIHJlc2V0KGJ5dGVzKTsKICAgICAgIAotICAgICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVzLCAwLCBsZW4pOwogICAgICAgICAKICAgICAgICAgYnl0ZXMucG9zaXRpb24gPSAwOwogICAgICAgfQotICAKLSAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZExlbmd0aChyZWFkTGVuZ3RoOmludCk6dm9pZCB7Ci0gICAgICByZWFkTGVuZ3RoXyA9IHJlYWRMZW5ndGg7Ci0gICAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgICB9Ci0gIAotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1JlYWRMZW5ndGgobGVuZ3RoOmludCk6dm9pZCB7Ci0gICAgICAgIGlmIChjaGVja1JlYWRMZW5ndGhfKSB7Ci0gICAgICAgICAgICByZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0gICAgICAgICAgICBpZiAocmVhZExlbmd0aF8gPCAwKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBURXJyb3IoIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlc2V0KGFycjpCeXRlQXJyYXkpOnZvaWQgewogICAgICAgYXJyLmxlbmd0aCA9IDA7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCmluZGV4IGM1Nzg4ZGIuLjlmZmY3MzAgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBTSVpFX0xJTUlUOmludCA9IDM7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBCQURfVkVSU0lPTjppbnQgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgTk9UX0lNUExFTUVOVEVEOmludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBERVBUSF9MSU1JVDppbnQgPSA2OwogICAKICAgICBwdWJsaWMgZnVuY3Rpb24gVFByb3RvY29sRXJyb3IoZXJyb3I6aW50ID0gVU5LTk9XTiwgbWVzc2FnZTpTdHJpbmcgPSAiIikgewogICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMKaW5kZXggMzM3NDk4Ni4uODYzYzU5YiAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKICAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIgKyAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iICsgIlVzZXItQWdlbnQ6IEJhdHRsZU5ldFxyXG4iICsgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcbiIgKyAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iICsgIkFjY2VwdDogKi8qXHJcblxyXG4iKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIgKyAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iICsgIlVzZXItQWdlbnQ6IFRocmlmdC9BUzNcclxuIiArICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4iICsgImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiArICJBY2NlcHQ6ICovKlxyXG5cclxuIik7CiAgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuYXMKaW5kZXggYTYzZTMxNC4uNDM1ZjkxMSAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5hcwpAQCAtMjcsNiArMjcsNyBAQAogICBpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CiAgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdDsKICAgaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworICBpbXBvcnQgZmxhc2guc3lzdGVtLkNhcGFiaWxpdGllczsKICAgaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTsKICAgCiAgIC8qKgpAQCAtMzgsMTQgKzM5LDE5IEBACiAgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdF86VVJMUmVxdWVzdCA9IG51bGw7CiAgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdEJ1ZmZlcl86Qnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheSgpOwogICAgIHByaXZhdGUgdmFyIHJlc3BvbnNlQnVmZmVyXzpCeXRlQXJyYXkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHRyYWNlQnVmZmVyc186Qm9vbGVhbiA9IENhcGFiaWxpdGllcy5pc0RlYnVnZ2VyOworCiAgICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpOkJ5dGVBcnJheSB7CiAgICAgICByZXR1cm4gcmVxdWVzdEJ1ZmZlcl87CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBmdW5jdGlvbiBUSHR0cENsaWVudChyZXF1ZXN0OlVSTFJlcXVlc3QpOnZvaWQgeworICAgIHB1YmxpYyBmdW5jdGlvbiBUSHR0cENsaWVudChyZXF1ZXN0OlVSTFJlcXVlc3QsIHRyYWNlQnVmZmVyczpCb29sZWFuPXRydWUpOnZvaWQgewogICAgICAgcmVxdWVzdC5jb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CiAgICAgICByZXF1ZXN0XyA9IHJlcXVlc3Q7CisgICAgICBpZih0cmFjZUJ1ZmZlcnMgPT0gZmFsc2UpIHsKKyAgICAgICAgdHJhY2VCdWZmZXJzXyA9IHRyYWNlQnVmZmVyczsKKyAgICAgIH0KICAgICB9CiAgICAgCiAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKTp2b2lkIHsKQEAgLTY0LDkgKzcwLDE2IEBACiAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8ucmVhZEJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKHRyYWNlQnVmZmVyc18pIHsKKyAgICAgICAgICAgICAgZHVtcEJ1ZmZlcihidWYsICJSRUFEIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbGVuOwogICAgICAgICAgIH0KICAgICAgICAgICBjYXRjaCAoZTpFT0ZFcnJvcikgeworICAgICAgICAgICAgaWYgKHRyYWNlQnVmZmVyc18pIHsKKyAgICAgICAgICAgICAgZHVtcEJ1ZmZlcihyZXF1ZXN0QnVmZmVyXywgIkZBSUxFRC1SRVNQT05TRS1SRVFVRVNUIik7CisgICAgICAgICAgICAgIGR1bXBCdWZmZXIocmVzcG9uc2VCdWZmZXJfLCAiRkFJTEVELVJFU1BPTlNFIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5VTktOT1dOLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKQEAgLTgxLDYgKzk0LDkgQEAKICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgIGxvYWRlci5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTVBMRVRFLCBmdW5jdGlvbihldmVudDpFdmVudCk6dm9pZCB7CiAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBVUkxMb2FkZXIoZXZlbnQudGFyZ2V0KS5kYXRhOworICAgICAgICAgaWYgKHRyYWNlQnVmZmVyc18pIHsKKyAgICAgICAgICAgZHVtcEJ1ZmZlcihyZXNwb25zZUJ1ZmZlcl8sICJSRVNQT05TRV9CVUZGRVIiKTsKKyAgICAgICAgIH0KICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbnVsbDsKICAgICAgICAgfSk7CkBAIC05OSw1ICsxMTUsMjAgQEAKICAgICAgIHJlcXVlc3RfLmRhdGEgPSByZXF1ZXN0QnVmZmVyXzsKICAgICAgIGxvYWRlci5sb2FkKHJlcXVlc3RfKTsKICAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGR1bXBCdWZmZXIoYnVmOkJ5dGVBcnJheSwgcHJlZml4OlN0cmluZyk6U3RyaW5nIHsKKyAgICAgIHZhciBkZWJ1Z1N0cmluZyA6IFN0cmluZyA9IHByZWZpeCArICIgQlVGRkVSICI7CisgICAgICBpZiAoYnVmICE9IG51bGwpIHsKKyAgICAgICAgZGVidWdTdHJpbmcgKz0gImxlbmd0aDogIiArIGJ1Zi5sZW5ndGggKyAiLCAiOworICAgICAgICBmb3IgKHZhciBpIDogaW50ID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGRlYnVnU3RyaW5nICs9ICJbIiArIGJ1ZltpXS50b1N0cmluZygxNikgKyAiXSI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnU3RyaW5nID0gIm51bGwiOworICAgICAgfQorICAgICAgdHJhY2UoZGVidWdTdHJpbmcpOworICAgICAgcmV0dXJuIGRlYnVnU3RyaW5nOworICAgIH0KKwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGQ3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKgkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Cit7CisKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuSU9FcnJvckV2ZW50OworICBpbXBvcnQgZmxhc2guZXZlbnRzLlByb2dyZXNzRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuU2VjdXJpdHlFcnJvckV2ZW50OworICBpbXBvcnQgZmxhc2guZXJyb3JzLkVPRkVycm9yOworICBpbXBvcnQgZmxhc2guZXJyb3JzLklPRXJyb3I7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyOworICBpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdDsKKyAgaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworICBpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFJbnB1dDsKKyAgaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhT3V0cHV0OworICBpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5OworICBpbXBvcnQgZmxhc2gubmV0LlNvY2tldDsKKworCisgIC8qKgorICAgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgKiBUaHJpZnQgU29ja2V0IFNlcnZlciBiYXNlZCBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworCisgIHB1YmxpYyBjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAorICB7CisgICAgcHJpdmF0ZSB2YXIgc29ja2V0OlNvY2tldCA9IG51bGw7CisKKyAgICBwcml2YXRlIHZhciBob3N0OlN0cmluZzsKKworICAgIHByaXZhdGUgdmFyIHBvcnQ6aW50OworCisgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlcjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CisKKyAgICBwcml2YXRlIHZhciBpbnB1dDpJRGF0YUlucHV0OworCisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0OklEYXRhT3V0cHV0OworCisgICAgcHJpdmF0ZSB2YXIgaW9DYWxsYmFjazpGdW5jdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIHZhciBldmVudERpc3BhdGNoZXI6RXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIFRTb2NrZXQoaG9zdDpTdHJpbmcsIHBvcnQ6aW50KTp2b2lkCisgICAgeworICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaW5wdXQgPSBudWxsOworICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOworICAgICAgc29ja2V0LmNsb3NlKCkKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcGVlaygpOkJvb2xlYW4KKyAgICB7CisgICAgICBpZihzb2NrZXQuY29ubmVjdGVkKQorICAgICAgeworICAgICAgICB0cmFjZSgiQnl0ZXMgcmVtYWluZWQ6IiArIHNvY2tldC5ieXRlc0F2YWlsYWJsZSk7CisgICAgICAgIHJldHVybiBzb2NrZXQuYnl0ZXNBdmFpbGFibGU+MDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWY6Qnl0ZUFycmF5LCBvZmY6aW50LCBsZW46aW50KTppbnQKKyAgICB7CisgICAgICB2YXIgbjE6aW50ID0gMCwgbjI6aW50ID0gMCwgbjM6aW50ID0gMCwgbjQ6aW50ID0gMCwgY2lkeDppbnQgPSAyOworICAgICAgdmFyIGNodW5rU2l6ZTpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CisKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICBpbnB1dC5yZWFkQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgICB9CisgICAgICBjYXRjaCAoZTpFT0ZFcnJvcikKKyAgICAgIHsKKyAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOklPRXJyb3IpCisgICAgICB7CisgICAgICAgIHRyYWNlKGUpOworICAgICAgICBpZihpc09wZW4oKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLlVOS05PV04sICJJTyBlcnJvciB3aGlsZSByZWFkaW5nOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuTk9UX09QRU4sICJTb2NrZXQgc2VlbSBub3QgdG8gYmUgb3BlbmVkOiAiICsgZSk7CisgICAgCX0KKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOkVycm9yKQorICAgICAgeworICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIkJhZCBJTyBlcnJvcjogIiArIGUpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZjpCeXRlQXJyYXksIG9mZjppbnQsIGxlbjppbnQpOnZvaWQKKyAgICB7CisgICAgICBvYnVmZmVyLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpTdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uLCB1c2VDYXB0dXJlOkJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6aW50ID0gMCwgdXNlV2Vha1JlZmVyZW5jZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6U3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiwgdXNlQ2FwdHVyZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLnNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuQ09OTkVDVCwgc29ja2V0Q29ubmVjdGVkKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SLCBzb2NrZXRFcnJvcik7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFNlY3VyaXR5RXJyb3JFdmVudC5TRUNVUklUWV9FUlJPUiwgc29ja2V0U2VjdXJpdHlFcnJvcik7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFByb2dyZXNzRXZlbnQuU09DS0VUX0RBVEEsIHNvY2tldERhdGFIYW5kbGVyKTsKKyAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldENvbm5lY3RlZChldmVudDpFdmVudCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMub3V0cHV0ID0gdGhpcy5zb2NrZXQ7CisgICAgICB0aGlzLmlucHV0ID0gdGhpcy5zb2NrZXQ7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RXJyb3IoZXZlbnQ6SU9FcnJvckV2ZW50KTp2b2lkCisgICAgeworICAgICAgdHJhY2UoIkVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgIGlmIChpb0NhbGxiYWNrID09IG51bGwpCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIklPRXJyb3I6ICIgKyBldmVudC50ZXh0KSk7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0U2VjdXJpdHlFcnJvcihldmVudDpTZWN1cml0eUVycm9yRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICB0cmFjZSgiU2VjdXJpdHkgRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldERhdGFIYW5kbGVyKGV2ZW50OlByb2dyZXNzRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICBpZiAoaW9DYWxsYmFjayAhPSBudWxsKQorICAgICAgeworICAgICAgICBpb0NhbGxiYWNrKG51bGwpOworICAgICAgfQorICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgdGhpcy5vdXRwdXQud3JpdGVCeXRlcyh0aGlzLm9idWZmZXIpOworICAgICAgdGhpcy5zb2NrZXQuZmx1c2goKTsKKyAgICAgIHRoaXMub2J1ZmZlci5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKTpCb29sZWFuCisgICAgeworICAgICAgcmV0dXJuICh0aGlzLnNvY2tldCA9PSBudWxsID8gZmFsc2UgOiB0aGlzLnNvY2tldC5jb25uZWN0ZWQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0M2E2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgRmluZCByZXF1aXJlZCBwYWNrYWdlcworZmluZF9wYWNrYWdlKEdMSUIgUkVRVUlSRUQgQ09NUE9ORU5UUyBnb2JqZWN0KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0dMSUJfSU5DTFVERV9ESVJTfSkKKworaW5jbHVkZV9kaXJlY3RvcmllcyhzcmMpCisKKyMgU1lTTElCUyBjb250YWlucyBsaWJyYXJpZXMgdGhhdCBuZWVkIHRvIGJlIGxpbmtlZCB0byBhbGwgbGliIHRhcmdldHMKK3NldChTWVNMSUJTICR7R0xJQl9MSUJSQVJJRVN9ICR7R0xJQl9HT0JKRUNUX0xJQlJBUklFU30pCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQyBnbGliIGxpYnJhcnkKK3NldCh0aHJpZnRfY19nbGliX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYworICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworKQorCisjIElmIE9wZW5TU0wgaXMgbm90IGZvdW5kIGp1c3QgaWdub3JlIHRoZSBPcGVuU1NMIHN0dWZmCitmaW5kX3BhY2thZ2UoT3BlblNTTCkKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICBsaXN0KCBBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKwkgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKKyAgICApCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgIiR7T1BFTlNTTF9MSUJSQVJJRVN9IikKK2VuZGlmKCkKKworCisjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgQUREX0xJQlJBUllfVEhSSUZUIGFuZCBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdF9jX2dsaWIgJHt0aHJpZnRfY19nbGliX1NPVVJDRVN9KQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRfY19nbGliICR7U1lTTElCU30pCisKKyMgSW5zdGFsbCB0aGUgaGVhZGVycworaW5zdGFsbChESVJFQ1RPUlkgInNyYy90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisjIENvcHkgY29uZmlnLmggZmlsZQoraW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQklOQVJZX0RJUn0vdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNWI2NjgxOC4uNDliNWIyMwotLS0gYS9saWIvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTE2LDcgKzE2LDcgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQorQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogU1VCRElSUyA9IC4gdGVzdAogCiBwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCkBAIC0yNCw2OCArMjQsOTMgQEAKIGxpYl9MVExJQlJBUklFUyA9IGxpYnRocmlmdF9jX2dsaWIubGEKIHBrZ2NvbmZpZ19EQVRBID0gdGhyaWZ0X2NfZ2xpYi5wYwogCi1jb21tb25fY2ZsYWdzID0gLWcgLVdhbGwgLVcgLVdlcnJvciAtSXNyYyAkKEdMSUJfQ0ZMQUdTKQotY29tbW9uX2xkZmxhZ3MgPSAtZyAtV2FsbCAtVyAkKEdMSUJfTERGTEFHUykgQEdDT1ZfTERGTEFHU0AKLQotIyB0aGlzIHJlbW92ZXMgb3B0aW1pemF0aW9ucyBhbmQgYWRkcyBjb3ZlcmFnZSBmbGFncwotQ0ZMQUdTID0gQEdDT1ZfQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSAtSXNyYyAtSSBzcmMvdGhyaWZ0L2NfZ2xpYgorQU1fQ0ZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKIAogIyBEZWZpbmUgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1vZHVsZQogCi1saWJ0aHJpZnRfY19nbGliX2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdF9zdHJ1Y3QuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKK2xpYnRocmlmdF9jX2dsaWJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvY19nbGliL3RocmlmdC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKIAotbGlidGhyaWZ0X2NfZ2xpYl9sYV9DRkxBR1MgPSAkKGNvbW1vbl9jZmxhZ3MpCitsaWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpCitsaWJ0aHJpZnRfY19nbGliX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykgCiAKLWluY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQKK2luY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQvY19nbGliCiBpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9jb25maWcuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0X3N0cnVjdC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oCiAKIGluY2x1ZGVfcHJvdG9jb2xkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm90b2NvbAotaW5jbHVkZV9wcm90b2NvbF9IRUFERVJTID0gc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCitpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiBpbmNsdWRlX3RyYW5zcG9ydGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3RyYW5zcG9ydAotaW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IHNyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaAoraW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKIAogaW5jbHVkZV9zZXJ2ZXJkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9zZXJ2ZXIKLWluY2x1ZGVfc2VydmVyX0hFQURFUlMgPSBzcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oCitpbmNsdWRlX3NlcnZlcl9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKIAogaW5jbHVkZV9wcm9jZXNzb3JkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm9jZXNzb3IKLWluY2x1ZGVfcHJvY2Vzc29yX0hFQURFUlMgPSBzcmMvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaAoraW5jbHVkZV9wcm9jZXNzb3JfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKIAogCiBFWFRSQV9ESVNUID0gXAotICAgICAgICAgICAgIFJFQURNRSBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICAgICAgICAgICAgIFJFQURNRS5tZCBcCisgICAgICAgICAgICAgdGVzdC9nbGliLnN1cHByZXNzIFwKICAgICAgICAgICAgICB0aHJpZnRfY19nbGliLnBjLmluCiAKIENMRUFORklMRVMgPSBcCmRpZmYgLS1naXQgYS9saWIvY19nbGliL1JFQURNRSBiL2xpYi9jX2dsaWIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDcwZDA4Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotVGhyaWZ0IEMgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBDCi09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBUaHJpZnQgQyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuICBGb2xsb3cgdGhlIGluc3RydWN0aW9ucwotaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIE1ha2VmaWxlcy4KLQotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KLQotR0xpYgotaHR0cDovL3d3dy5ndGsub3JnLwotCmRpZmYgLS1naXQgYS9saWIvY19nbGliL1JFQURNRS5tZCBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODRmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL1JFQURNRS5tZApAQCAtMCwwICsxLDQ5IEBACitUaHJpZnQgQyBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIEMKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBDIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCitpbiB0aGUgdG9wLWxldmVsIFJFQURNRSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGVzLgorCitEZXBlbmRlbmNpZXMKKz09PT09PT09PT09PQorCitHTGliCitodHRwOi8vd3d3Lmd0ay5vcmcvCisKK0JyZWFraW5nIENoYW5nZXMKKz09PT09PT09PT09PT09PT0KKworMC4xMi4wCistLS0tLS0KKworVGhlIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyB3aGVuIGdlbmVyYXRpbmcgdGhlIG5hbWUgb2YgdHlwZXMsCitmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyBoYXMgYmVlbiBpbXByb3ZlZC4gVGhpcyBtZWFucyBjb2RlIHdyaXR0ZW4gdG8gdXNlCitjbGFzc2VzIGdlbmVyYXRlZCBieSBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCB0bworcmVmbGVjdCB0aGUgcHJvcGVyIGNvbnZlbnRpb24gZm9yIGNsYXNzIG5hbWVzLCB3aGljaCBpcworCistIEEgbG93ZXJjYXNlLCBbc25ha2UtY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU25ha2VfY2FzZSkKKyAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzJyBuYW1lc3BhY2UsIGZvbGxvd2VkIGJ5CistIEFuIHVuZGVyc2NvcmUgYW5kCistIEEgbG93ZXJjYXNlLCBzbmFrZS1jYXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcycgbmFtZS4KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGIzYTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNSBAQAorIyMgQyBHbGliIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbR05PTUUgQyBDb2RpbmcgU3R5bGVdKGh0dHBzOi8vaGVscC5nbm9tZS5vcmcvdXNlcnMvcHJvZ3JhbW1pbmctZ3VpZGVsaW5lcy9zdGFibGUvYy1jb2Rpbmctc3R5bGUuaHRtbC5lbikKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTlmNDU0Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJwcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIgotCi1HX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFByb2Nlc3NvciwgdGhyaWZ0X3Byb2Nlc3NvciwgR19UWVBFX09CSkVDVCkKLQotZ2Jvb2xlYW4KLXRocmlmdF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCkKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChwcm9jZXNzb3IpLT5wcm9jZXNzIChwcm9jZXNzb3IsIGluLCBvdXQpOwotfQotCi0vKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0UHJvY2Vzc29yICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3Byb2Nlc3Nvcl9jbGFzc19pbml0IChUaHJpZnRQcm9jZXNzb3JDbGFzcyAqY2xzKQotewotICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KLSAgY2xzLT5wcm9jZXNzID0gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3Byb2Nlc3Nvcl9pbml0IChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb2Nlc3Nvcik7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwZTMxYi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPQ0VTU09SX0gKLSNkZWZpbmUgX1RIUklGVF9QUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfcHJvY2Vzc29yLmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm9jZXNzb3JzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1BST0NFU1NPUiAodGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUikpCi0jZGVmaW5lIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpKQotI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3JDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFByb2Nlc3Nvcm9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFByb2Nlc3NvcgotewotICBHT2JqZWN0IHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yIFRocmlmdFByb2Nlc3NvcjsKLQotLyohCi0gKiBUaHJpZnQgUHJvY2Vzc29yIGNsYXNzCi0gKi8KLXN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICAvKiB2dGFibGUgKi8KLSAgZ2Jvb2xlYW4gKCpwcm9jZXNzKSAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvckNsYXNzIFRocmlmdFByb2Nlc3NvckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST0NFU1NPUiAqLwotR1R5cGUgdGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIQotICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0KTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlMjhlOC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCIKLQotR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbCwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCi0KLXN0YXRpYyBndWludDY0Ci10aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGdkb3VibGUgdikKLXsKLSAgdW5pb24gewotICAgIGdkb3VibGUgZnJvbTsKLSAgICBndWludDY0IHRvOwotICB9IHU7Ci0gIHUuZnJvbSA9IHY7Ci0gIHJldHVybiB1LnRvOwotfQotCi1zdGF0aWMgZ2RvdWJsZQotdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChndWludDY0IHYpCi17Ci0gIHVuaW9uIHsKLSAgICBndWludDY0IGZyb207Ci0gICAgZ2RvdWJsZSB0bzsKLSAgfSB1OwotICB1LmZyb20gPSB2OwotICByZXR1cm4gdS50bzsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgdmVyc2lvbiA9IChUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKLSAgICAgICAgICAgICAgICAgICB8ICgoZ2ludDMyKSBtZXNzYWdlX3R5cGUpOwotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBmaWVsZF9pZCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgKGdpbnQzMikgc2l6ZSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOyAKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ3VpbnQ4IHRtcCA9IHZhbHVlID8gMSA6IDA7Ci0gIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHRtcCwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgIAotICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpCi0gIHsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MTYgbmV0ID0gZ19odG9ucyAodmFsdWUpOwotICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgMiwgZXJyb3IpKQotICB7Ci0gICAgcmV0dXJuIDI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ2ludDMyIG5ldCA9IGdfaHRvbmwgKHZhbHVlKTsKLSAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDQsIGVycm9yKSkKLSAgewotICAgIHJldHVybiA0OwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQ2NCBuZXQgPSBHVUlOVDY0X1RPX0JFICh2YWx1ZSk7Ci0gIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCA4LCBlcnJvcikpCi0gIHsKLSAgICByZXR1cm4gODsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ3VpbnQ2NCBiaXRzID0gR1VJTlQ2NF9GUk9NX0JFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7Ci0gIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKQotICB7Ci0gICAgcmV0dXJuIDg7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGd1aW50MzIgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOwotICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLwotICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgbGVuLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAobGVuID4gMCkKLSAgewotICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB4ZmVyICs9IGxlbjsKLSAgfQotCi0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQzMiBzejsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzeiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0KLSAgaWYgKHN6IDwgMCkKLSAgewotICAgIC8qIGNoZWNrIGZvciB2ZXJzaW9uICovCi0gICAgZ3VpbnQzMiB2ZXJzaW9uID0gc3ogJiBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSzsKLSAgICBpZiAodmVyc2lvbiAhPSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKLSAgICB7Ci0gICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZlcnNpb24gJWQsIGdvdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEsIHZlcnNpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgICptZXNzYWdlX3R5cGUgPSAoVGhyaWZ0TWVzc2FnZVR5cGUpIChzeiAmIDB4MDAwMDAwZmYpOwotCi0gICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotCi0gICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB4ZmVyICs9IHJldDsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICAqbmFtZSA9IE5VTEw7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQ4IHR5cGU7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnR5cGUsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICAqZmllbGRfdHlwZSA9IChUaHJpZnRUeXBlKSB0eXBlOwotICBpZiAoKmZpZWxkX3R5cGUgPT0gVF9TVE9QKQotICB7Ci0gICAgKmZpZWxkX2lkID0gMDsKLSAgICByZXR1cm4geGZlcjsKLSAgfQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLSAgZ2ludDggaywgdjsKLSAgZ2ludDMyIHNpemVpOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgKmtleV90eXBlID0gKFRocmlmdFR5cGUpIGs7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnYsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICAqdmFsdWVfdHlwZSA9IChUaHJpZnRUeXBlKSB2OwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnNpemVpLCBlcnJvcikpIDwwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmIChzaXplaSA8IDApCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCi0gICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHNpemVpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAqc2l6ZSA9IChndWludDMyKSBzaXplaTsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQ4IGU7Ci0gIGdpbnQzMiBzaXplaTsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmZSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gICplbGVtZW50X3R5cGUgPSAoVGhyaWZ0VHlwZSkgZTsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzaXplaSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0KLSAgaWYgKHNpemVpIDwgMCkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKLSAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgc2l6ZWkpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gICpzaXplID0gKGd1aW50MzIpIHNpemVpOwotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYlsxXTsKLQotICBpZiAoKHJldCA9IAotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gICp2YWx1ZSA9ICooZ2ludDggKikgYiAhPSAwOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzFdOwotCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICAqdmFsdWUgPSAqKGdpbnQ4ICopIGI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYlsyXTsKLQotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgKnZhbHVlID0gKihnaW50MTYgKikgYjsKLSAgKnZhbHVlID0gZ19udG9ocyAoKnZhbHVlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzRdOwotCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCA0LCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICAqdmFsdWUgPSAqKGdpbnQzMiAqKSBiOwotICAqdmFsdWUgPSBnX250b2hsICgqdmFsdWUpOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGdpbnQzMiByZXQ7Ci0gIGdwb2ludGVyIGJbOF07Ci0KLSAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDgsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gICp2YWx1ZSA9ICooZ2ludDY0ICopIGI7Ci0gICp2YWx1ZSA9IEdVSU5UNjRfRlJPTV9CRSAoKnZhbHVlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYls4XTsKLQotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgOCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgZ3VpbnQ2NCBiaXRzID0gKihndWludDY0ICopIGI7Ci0gIGJpdHMgPSBHVUlOVDY0X0ZST01fQkUgKGJpdHMpOwotICAqdmFsdWUgPSB0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGJpdHMpOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBndWludDMyIGxlbjsKLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotICBnaW50MzIgcmVhZF9sZW4gPSAwOwotCi0gIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmIChyZWFkX2xlbiA+IDApCi0gIHsKLSAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nICovCi0gICAgbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuICsgMTsgLy8gc3BhY2UgZm9yIG51bGwgdGVybWluYXRvcgotICAgICpzdHIgPSBnX25ldzAgKGdjaGFyLCBsZW4pOwotICAgIGlmICgocmV0ID0KLSAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKQotICAgIHsKLSAgICAgIGdfZnJlZSAoKnN0cik7Ci0gICAgICAqc3RyID0gTlVMTDsKLSAgICAgIGxlbiA9IDA7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotICB9IGVsc2UgewotICAgICpzdHIgPSBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotICBnaW50MzIgcmVhZF9sZW4gPSAwOwotIAotICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLwotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAocmVhZF9sZW4gPiAwKQotICB7Ci0gICAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyIGZvciBiaW5hcnkgZGF0YSAqLwotICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47Ci0gICAgKmJ1ZiA9IGdfbmV3IChndWNoYXIsICpsZW4pOwotICAgIGlmICgocmV0ID0KLSAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApCi0gICAgewotICAgICAgZ19mcmVlICgqYnVmKTsKLSAgICAgICpidWYgPSBOVUxMOwotICAgICAgKmxlbiA9IDA7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotICB9IGVsc2UgewotICAgICpidWYgPSBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sICpwcm90b2NvbCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLX0KLQotLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MgKmtsYXNzKQotewotICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKLQotICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47Ci0gIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOwotICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOwotICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOwotICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOwotICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7Ci0gIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47Ci0gIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKLSAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOwotICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKLSAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKLSAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kOwotICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2w7Ci0gIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKLSAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNjsKLSAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMjsKLSAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NDsKLSAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKLSAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKLSAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOwotICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKLSAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKLSAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOwotICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKLSAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47Ci0gIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQ7Ci0gIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47Ci0gIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKLSAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47Ci0gIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9lbmQ7Ci0gIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2w7Ci0gIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGU7Ci0gIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2OwotICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMjsKLSAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQ7Ci0gIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlOwotICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZzsKLSAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGNlZDkuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0gKLSNkZWZpbmUgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuaAotICogIFxicmllZiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQotICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbCkpCi0jZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzKSkKLQotLyogdmVyc2lvbiBudW1iZXJzICovCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xIDB4ODAwMTAwMDAKLSNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OX01BU0sgMHhmZmZmMDAwMAotCi0vKiEKLSAqIFRocmlmdCBCaW5hcnkgUHJvdG9jb2wgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2wKLXsKLSAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbCBUaHJpZnRCaW5hcnlQcm90b2NvbDsKLQotLyohCi0gKiBUaHJpZnQgQmluYXJ5IFByb3RvY29sIGNsYXNzLgotICovCi1zdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MKLXsKLSAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKi8KLUdUeXBlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5ZjUyMi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaCIKLQotR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnksIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkKLQotVGhyaWZ0UHJvdG9jb2wgKgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKLQotICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKTsKLQotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNscykKLXsKLSAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKnByb3RvY29sX2ZhY3RvcnlfY2xhc3MgPSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyAoY2xzKTsKLQotICBwcm90b2NvbF9mYWN0b3J5X2NsYXNzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3ZmNjMi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0gKLSNkZWZpbmUgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQotCi1zdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeQotewotICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotCi1zdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzCi17Ci0gIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkgKi8KLUdUeXBlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTEwMzEuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLwotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRVJST1JfRE9NQUlOICJ0aHJpZnQtcHJvdG9jb2wtZXJyb3ItcXVhcmsiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRQcm90b2NvbFByb3BlcnRpZXMKLXsKLSAgUFJPUF8wLAotICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQKLX07Ci0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvdG9jb2wsIHRocmlmdF9wcm90b2NvbCwgR19UWVBFX09CSkVDVCkKLQotdm9pZAotdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7Ci0KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6Ci0gICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBwcm90b2NvbC0+dHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQKLXRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLQotICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7Ci0KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6Ci0gICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2JlZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9jb2wsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBzZXFpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9ib29sIChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTE2IChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2kzMiAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pNjQgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2RvdWJsZSAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RyaW5nIChwcm90b2NvbCwgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMiAKLXRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7IAotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9saXN0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc2V0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYm9vbCAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2J5dGUgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2kxNiAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pMzIgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTY0IChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9kb3VibGUgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cmluZyAocHJvdG9jb2wsIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgc3dpdGNoICh0eXBlKQotICB7Ci0gICAgY2FzZSBUX0JPT0w6Ci0gICAgICB7Ci0gICAgICAgIGdib29sZWFuIGJvb2x2OwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsICZib29sdiwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9CWVRFOgotICAgICAgewotICAgICAgICBnaW50OCBieXRldjsKLSAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZXYsIGVycm9yKTsKLSAgICAgIH0KLQotICAgIGNhc2UgVF9JMTY6Ci0gICAgICB7Ci0gICAgICAgIGdpbnQxNiBpMTY7Ci0gICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmaTE2LCBlcnJvcik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX0kzMjoKLSAgICAgIHsKLSAgICAgICAgZ2ludDMyIGkzMjsKLSAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZpMzIsIGVycm9yKTsKLSAgICAgIH0KLSAgICBjYXNlIFRfSTY0OgotICAgICAgewotICAgICAgICBnaW50NjQgaTY0OwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJmk2NCwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9ET1VCTEU6Ci0gICAgICB7Ci0gICAgICAgIGdkb3VibGUgZHViOwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwgJmR1YiwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9TVFJJTkc6Ci0gICAgICB7Ci0gICAgICAgIGdwb2ludGVyIGRhdGE7Ci0gICAgICAgIGd1aW50MzIgbGVuOwotICAgICAgICBnaW50MzIgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmRhdGEsICZsZW4sIGVycm9yKTsKLSAgICAgICAgZ19mcmVlIChkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KLSAgICBjYXNlIFRfU1RSVUNUOgotICAgICAgewotICAgICAgICBndWludDMyIHJlc3VsdCA9IDA7Ci0gICAgICAgIGdjaGFyICpuYW1lOwotICAgICAgICBnaW50MTYgZmlkOwotICAgICAgICBUaHJpZnRUeXBlIGZ0eXBlOwotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKTsKLQotICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcik7Ci0gICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKTsKLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVF9NQVA6Ci0gICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKLSAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7Ci0gICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKLSAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRfTElTVDoKLSAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOwotICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKLSAgICAgICAgZ3VpbnQzMiBpLCBzaXplOwotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0vKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCBwcm90b2NvbHMgKi8KLUdRdWFyawotdGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4pOwotfQotCi0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sKQotewotICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbENsYXNzICpjbHMpCi17Ci0gIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7Ci0KLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVCwKLSAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IiwgIlRocmlmdCBUcmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0KLSAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47Ci0gIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7Ci0gIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKLSAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47Ci0gIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKLSAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7Ci0gIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKLSAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7Ci0gIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOwotICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOwotICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47Ci0gIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kOwotICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbDsKLSAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGU7Ci0gIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNjsKLSAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyOwotICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pNjQ7Ci0gIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKLSAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOwotICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7Ci0gIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7Ci0gIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47Ci0gIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKLSAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47Ci0gIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7Ci0gIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47Ci0gIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKLSAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOwotICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOwotICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQ7Ci0gIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbDsKLSAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlOwotICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2OwotICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyOwotICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0OwotICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlOwotICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nOwotICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5OwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlYWVkOS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ICi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbC5oCi0gKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLgotICovCi0KLS8qKgotICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wgc3VwcG9ydHMuCi0gKiBUYWtlIHNwZWNpYWwgbm90ZSBvZiB0aGUgVF9FTkQgdHlwZSB3aGljaCBpcyB1c2VkIHNwZWNpZmljYWxseSB0byBtYXJrCi0gKiB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZmllbGRzLgotICovCi10eXBlZGVmIGVudW0gewotICBUX1NUT1AgICA9IDAsCi0gIFRfVk9JRCAgID0gMSwKLSAgVF9CT09MICAgPSAyLAotICBUX0JZVEUgICA9IDMsCi0gIFRfSTA4ICAgID0gMywKLSAgVF9JMTYgICAgPSA2LAotICBUX0kzMiAgICA9IDgsCi0gIFRfVTY0ICAgID0gOSwKLSAgVF9JNjQgICAgPSAxMCwKLSAgVF9ET1VCTEUgPSA0LAotICBUX1NUUklORyA9IDExLAotICBUX1VURjcgICA9IDExLAotICBUX1NUUlVDVCA9IDEyLAotICBUX01BUCAgICA9IDEzLAotICBUX1NFVCAgICA9IDE0LAotICBUX0xJU1QgICA9IDE1LAotICBUX1VURjggICA9IDE2LAotICBUX1VURjE2ICA9IDE3Ci19IFRocmlmdFR5cGU7Ci0KLS8qKgotICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAotICogc3VwcG9ydHMuCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFRfQ0FMTCAgICAgID0gMSwKLSAgVF9SRVBMWSAgICAgPSAyLAotICBUX0VYQ0VQVElPTiA9IDMsCi0gIFRfT05FV0FZICAgID0gNAotfSBUaHJpZnRNZXNzYWdlVHlwZTsKLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0wgKHRocmlmdF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpKQotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkpCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgb2JqZWN0Ci0gKi8KLXN0cnVjdCBfVGhyaWZ0UHJvdG9jb2wKLXsKLSAgR09iamVjdCBwYXJlbnQ7Ci0KLSAgLyogcHJvdGVjdGVkICovCi0gIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbCBUaHJpZnRQcm90b2NvbDsKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRQcm90b2NvbENsYXNzCi17Ci0gIEdPYmplY3RDbGFzcyBwYXJlbnQ7Ci0KLSAgZ2ludDMyICgqd3JpdGVfbWVzc2FnZV9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfbWVzc2FnZV9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfc3RydWN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9zdHJ1Y3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2ZpZWxkX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2ZpZWxkX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9maWVsZF9zdG9wKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX21hcF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfbWFwX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9saXN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfbGlzdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfc2V0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX3NldF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfYm9vbCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2J5dGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9pMTYpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9pMzIpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9pNjQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9kb3VibGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfc3RyaW5nKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2JpbmFyeSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotCi0gIGdpbnQzMiAoKnJlYWRfbWVzc2FnZV9iZWdpbikgKFRocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX21lc3NhZ2VfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfc3RydWN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX3N0cnVjdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9maWVsZF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwgZ2ludDE2ICpmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9maWVsZF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9tYXBfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX21hcF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9saXN0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9saXN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX3NldF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9zZXRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfYm9vbCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfYnl0ZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfaTE2KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfaTMyKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfaTY0KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfZG91YmxlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnZG91YmxlICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfc3RyaW5nKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2JpbmFyeSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsZW4sIEdFcnJvciAqKmVycm9yKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xDbGFzcyBUaHJpZnRQcm90b2NvbENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MICovCi1HVHlwZSB0aHJpZnRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9za2lwIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi0vKiBkZWZpbmUgZXJyb3IgdHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfVU5LTk9XTiwKLSAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKLSAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCi0gIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAotICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCi0gIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9OT1RfSU1QTEVNRU5URUQKLX0gVGhyaWZ0UHJvdG9jb2xFcnJvcjsKLQotLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLwotR1F1YXJrIHRocmlmdF9wcm90b2NvbF9lcnJvcl9xdWFyayAodm9pZCk7Ci0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9FUlJPUiAodGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICgpKQotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczYjMzYy4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCIKLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbEZhY3RvcnksIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQotCi1UaHJpZnRQcm90b2NvbCAqCi10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChmYWN0b3J5KS0+Z2V0X3Byb3RvY29sIChmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQotewotICBjbHMtPmdldF9wcm90b2NvbCA9IHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFlYjFiLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCi0gKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnMuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5KSkKLSNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKSkKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgRmFjdG9yeSBvYmplY3QKLSAqLwotc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnkKLXsKLSAgR09iamVjdCBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeSBUaHJpZnRQcm90b2NvbEZhY3Rvcnk7Ci0KLS8qIQotICogVGhyaWZ0IFByb3RvY29sIEZhY3RvcnkgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIFRocmlmdFByb3RvY29sICooKmdldF9wcm90b2NvbCkgKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZICovCi1HVHlwZSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KLVRocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LCBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2VydmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTk1NzYuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJ0aHJpZnRfc2VydmVyLmgiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRTZXJ2ZXJQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCi0gIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCi0gIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWQotfTsKLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXIsIHRocmlmdF9zZXJ2ZXIsIEdfVFlQRV9PQkpFQ1QpCi0KLXZvaWQKLXRocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIgKG9iamVjdCk7Ci0KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5wcm9jZXNzb3IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZAotdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKLQotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6Ci0gICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKLSAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkCi10aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKLXsKLSAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKHNlcnZlciktPnNlcnZlIChzZXJ2ZXIpOwotfQotCi12b2lkCi10aHJpZnRfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c3RvcCAoc2VydmVyKTsKLX0KLQotLyogaW5zdGFuY2UgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdCBTZXJ2ZXIgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX2luaXQgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBzZXJ2ZXItPnByb2Nlc3NvciA9IE5VTEw7Ci0gIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7Ci0gIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBOVUxMOwotICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IE5VTEw7Ci0gIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7Ci0gIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOwotfQotCi0vKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0U2VydmVyCi0gKiBUT0RPOiBpbXBsZW1lbnQgU2VydmVyRXZlbnRIYW5kbGVyIGFzIGEgR0Nsb3N1cmUKLSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zZXJ2ZXJfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyQ2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc2V0X3Byb3BlcnR5OwotCi0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInByb2Nlc3NvciIsICJQcm9jZXNzb3IiLCAiVGhyaWZ0IFByb2Nlc3NvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JULAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNlcnZlcl90cmFuc3BvcnQiLCAiU2VydmVyIFRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBUcmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIklucHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIElucHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIE91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICJJbnB1dCBQcm90b2NvbCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIElucHV0IFByb3RvY29sIEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIk91dHB1dCBQcm90b2NvbCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIE91dHB1dCBQcm90b2NvbCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKLQotICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KLSAgY2xzLT5zZXJ2ZSA9IHRocmlmdF9zZXJ2ZXJfc2VydmU7Ci0gIGNscy0+c3RvcCA9IHRocmlmdF9zZXJ2ZXJfc3RvcDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2VydmVyLmggYi9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTExM2Y4Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfSAotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAicHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3NlcnZlci5oCi0gKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgc2VydmVycy4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVIgKHRocmlmdF9zZXJ2ZXJfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlcikpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlckNsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyQ2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdCBTZXJ2ZXIgb2JqZWN0Ci0gKi8KLXN0cnVjdCBfVGhyaWZ0U2VydmVyCi17Ci0gIEdPYmplY3QgcGFyZW50OwotCi0gIC8qIHByb3RlY3RlZCAqLwotICBUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvcjsKLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OwotICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICppbnB1dF90cmFuc3BvcnRfZmFjdG9yeTsKLSAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqb3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5OwotICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmlucHV0X3Byb3RvY29sX2ZhY3Rvcnk7Ci0gIFRocmlmdFByb3RvY29sRmFjdG9yeSAqb3V0cHV0X3Byb3RvY29sX2ZhY3Rvcnk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlciBUaHJpZnRTZXJ2ZXI7Ci0KLS8qIQotICogVGhyaWZ0IFNlcnZlciBjbGFzcwotICovCi1zdHJ1Y3QgX1RocmlmdFNlcnZlckNsYXNzCi17Ci0gIEdPYmplY3RDbGFzcyBwYXJlbnQ7Ci0KLSAgLyogdnRhYmxlICovCi0gIHZvaWQgKCpzZXJ2ZSkgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKLSAgdm9pZCAoKnN0b3ApIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlckNsYXNzIFRocmlmdFNlcnZlckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NFUlZFUiAqLwotR1R5cGUgdGhyaWZ0X3NlcnZlcl9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIQotICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyQ2xhc3MKLSAqLwotdm9pZCB0aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7Ci0KLS8qIQotICogU3RvcCBoYW5kbGluZyByZXF1ZXN0cy4KLSAqLwotdm9pZCB0aHJpZnRfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfU0VSVkVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzMDY3YS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaCIKLQotR19ERUZJTkVfVFlQRShUaHJpZnRTaW1wbGVTZXJ2ZXIsIHRocmlmdF9zaW1wbGVfc2VydmVyLCBUSFJJRlRfVFlQRV9TRVJWRVIpCi0KLXZvaWQKLXRocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKLXsKLSAgZ19yZXR1cm5faWZfZmFpbCAoVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpOwotCi0gIFRocmlmdFRyYW5zcG9ydCAqdCA9IE5VTEw7Ci0gIFRocmlmdFRyYW5zcG9ydCAqaW5wdXRfdHJhbnNwb3J0ID0gTlVMTCwgKm91dHB1dF90cmFuc3BvcnQgPSBOVUxMOwotICBUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wgPSBOVUxMLCAqb3V0cHV0X3Byb3RvY29sID0gTlVMTDsKLSAgVGhyaWZ0U2ltcGxlU2VydmVyICp0c3MgPSBUSFJJRlRfU0lNUExFX1NFUlZFUihzZXJ2ZXIpOwotCi0gIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KQotICAgICAgLT5saXN0ZW4gKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwgTlVMTCk7Ci0KLSAgdHNzLT5ydW5uaW5nID0gVFJVRTsKLSAgd2hpbGUgKHRzcy0+cnVubmluZyA9PSBUUlVFKQotICB7Ci0gICAgdCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBOVUxMKTsKLSAgICBpbnB1dF90cmFuc3BvcnQgPQotICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KQotICAgICAgICAgICAgLT5nZXRfdHJhbnNwb3J0IChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5LCB0KTsKLSAgICBvdXRwdXRfdHJhbnNwb3J0ID0gCi0gICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KQotICAgICAgICAgICAgLT5nZXRfdHJhbnNwb3J0IChzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSwgdCk7Ci0gICAgaW5wdXRfcHJvdG9jb2wgPQotICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSkKLSAgICAgICAgICAgIC0+Z2V0X3Byb3RvY29sIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnksIHQpOwotICAgIG91dHB1dF9wcm90b2NvbCA9Ci0gICAgICAgIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSkKLSAgICAgICAgICAgIC0+Z2V0X3Byb3RvY29sIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5LCB0KTsKLQotICAgIHdoaWxlIChUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyAoc2VydmVyLT5wcm9jZXNzb3IpCi0gICAgICAgICAgICAgICAtPnByb2Nlc3MgKHNlcnZlci0+cHJvY2Vzc29yLCBpbnB1dF9wcm90b2NvbCwgb3V0cHV0X3Byb3RvY29sKSkKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdHJhbnNwb3J0IHBlZWsgKCkKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBoYW5kbGUgZXhjZXB0aW9ucwotICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChpbnB1dF90cmFuc3BvcnQpLT5jbG9zZSAoaW5wdXRfdHJhbnNwb3J0LCBOVUxMKTsKLSAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAob3V0cHV0X3RyYW5zcG9ydCktPmNsb3NlIChvdXRwdXRfdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICB9IAotCi0gIC8vIGF0dGVtcHQgdG8gc2h1dGRvd24KLSAgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQpCi0gICAgICAtPmNsb3NlIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIE5VTEwpOyAKLX0KLQotdm9pZAotdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCi17Ci0gIGdfcmV0dXJuX2lmX2ZhaWwgKFRIUklGVF9JU19TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpKTsKLSAgKFRIUklGVF9TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpKS0+cnVubmluZyA9IEZBTFNFOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfaW5pdCAoVGhyaWZ0U2ltcGxlU2VydmVyICp0c3MpCi17Ci0gIHRzcy0+cnVubmluZyA9IEZBTFNFOwotCi0gIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUih0c3MpOwotCi0gIGlmIChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID09IE5VTEwpCi0gIHsKLSAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0KLSAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgTlVMTCk7Ci0gIH0KLSAgaWYgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID09IE5VTEwpCi0gIHsKLSAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9Ci0gICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIE5VTEwpOwotICB9Ci0gIGlmIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9Ci0gICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIE5VTEwpOwotICB9Ci0gIGlmIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID09IE5VTEwpCi0gIHsKLSAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0KLSAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgTlVMTCk7Ci0gIH0KLX0KLQotLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2ltcGxlX3NlcnZlcl9jbGFzc19pbml0IChUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcyAqY2xhc3MpCi17Ci0gIFRocmlmdFNlcnZlckNsYXNzICpjbHMgPSBUSFJJRlRfU0VSVkVSX0NMQVNTKGNsYXNzKTsKLQotICBjbHMtPnNlcnZlID0gdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmU7Ci0gIGNscy0+c3RvcCA9IHRocmlmdF9zaW1wbGVfc2VydmVyX3N0b3A7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU1MDBjLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0lNUExFX1NFUlZFUl9ICi0jZGVmaW5lIF9USFJJRlRfU0lNUExFX1NFUlZFUl9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAic2VydmVyL3RocmlmdF9zZXJ2ZXIuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaAotICogIFxicmllZiBBIHNpbXBsZSBUaHJpZnQgc2VydmVyLCBzaW5nbGUtdGhyZWFkZWQuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiAodGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSKSkKLSNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYykgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfU0lNUExFX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUikpCi0jZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MpKQotCi0vKioKLSAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGluc3RhbmNlLgotICovCi1zdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlcgotewotICBUaHJpZnRTZXJ2ZXIgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLSAgdm9sYXRpbGUgZ2Jvb2xlYW4gcnVubmluZzsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyIFRocmlmdFNpbXBsZVNlcnZlcjsKLQotLyoqCi0gKiBUaHJpZnQgU2ltcGxlIFNlcnZlciBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcwotewotICBUaHJpZnRTZXJ2ZXJDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIgKi8KLUdUeXBlIHRocmlmdF9zaW1wbGVfc2VydmVyX2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfU0lNUExFX1NFUlZFUl9IICovCi0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmU1YzMuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLQotLyoqCi0gKiBHSGFzaFRhYmxlIGNhbGxiYWNrIHRvIGFkZCBrZXlzIHRvIGEgR0xpc3QuCi0gKi8KLXZvaWQKLXRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh2YWx1ZSk7Ci0gIEdMaXN0ICoqbGlzdCA9IChHTGlzdCAqKikgdXNlcl9kYXRhOwotICAqbGlzdCA9IGdfbGlzdF9hcHBlbmQgKCpsaXN0LCBrZXkpOwotfQotCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM2YTJmLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfSAotI2RlZmluZSBfVEhSSUZUX0gKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Z2xpYi5oPgotCi0vKiB0aGlzIG1hY3JvIGlzIGNhbGxlZCB0byBzYXRpc2Z5IC1XYWxsIGhhcmRjb3JlIGNvbXBpbGF0aW9uICovCi0jaWZuZGVmIFRIUklGVF9VTlVTRURfVkFSCi0jIGRlZmluZSBUSFJJRlRfVU5VU0VEX1ZBUih4KSAoKHZvaWQpIHgpCi0jZW5kaWYKLQotdm9pZCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cyAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0gKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Q2MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCitnYm9vbGVhbgordGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2NoYXIgKmZuYW1lOworICBUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgZ2ludDMyIHNlcWlkOworICBUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqZGlzcGF0Y2hfcHJvY2Vzc29yID0KKyAgICBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SIChwcm9jZXNzb3IpOworCisgIC8qIFJlYWQgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlLCB3aGljaCB3ZSBleHBlY3QgdG8gYmUgYSBtZXRob2QgY2FsbCAqLworICBpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPCAwKSB7CisgICAgZ193YXJuaW5nICgiZXJyb3IgcmVhZGluZyBzdGFydCBvZiBtZXNzYWdlOiAlcyIsCisgICAgICAgICAgICAgICAoZXJyb3IgIT0gTlVMTCkgPyAoKmVycm9yKS0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZWxzZSBpZiAobXR5cGUgIT0gVF9DQUxMICYmIG10eXBlICE9IFRfT05FV0FZKSB7CisgICAgZ193YXJuaW5nICgicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRGlzcGF0Y2ggdGhlIG1ldGhvZCBjYWxsICovCisgIHJldHVybiBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0dFVF9DTEFTUyAoZGlzcGF0Y2hfcHJvY2Vzc29yKQorICAgIC0+ZGlzcGF0Y2hfY2FsbCAoZGlzcGF0Y2hfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgaW4sCisgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcmVhbF9kaXNwYXRjaF9jYWxsIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOworICBnY2hhciAqbWVzc2FnZTsKKyAgZ2ludDMyIHJlc3VsdDsKKyAgZ2Jvb2xlYW4gZGlzcGF0Y2hfcmVzdWx0ID0gRkFMU0U7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworCisgIC8qIEJ5IGRlZmF1bHQsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZQorICAgICBtZXRob2QgbmFtZSBpcyBub3QgcmVjb2duaXplZC4gKi8KKworICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisgICAgICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ19vYmplY3RfZ2V0IChpbiwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIGlmIChyZXN1bHQgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0VYQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgbWVzc2FnZSA9IGdfc3RyY29uY2F0ICgiSW52YWxpZCBtZXRob2QgbmFtZTogJyIsIGZuYW1lLCAiJyIsIE5VTEwpOworICBnX2ZyZWUgKGZuYW1lKTsKKyAgeGNlcHRpb24gPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELAorICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfZnJlZSAobWVzc2FnZSk7CisgIHJlc3VsdCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgIGlmICgocmVzdWx0IDwgMCkgfHwKKyAgICAgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfb2JqZWN0X2dldCAob3V0LCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgIGRpc3BhdGNoX3Jlc3VsdCA9CisgICAgKCh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkgJiYKKyAgICAgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpID49IDApKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzICpwcm9jZXNzb3JfY2xhc3MgPQorICAgIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MgKGtsYXNzKTsKKworICAvKiBJbXBsZW1lbnQgVGhyaWZ0UHJvY2Vzc29yJ3MgcHJvY2VzcyBtZXRob2QgKi8KKyAgcHJvY2Vzc29yX2NsYXNzLT5wcm9jZXNzID0gdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9wcm9jZXNzOworCisgIC8qIFByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudCBmb3IgZGlzcGF0Y2hfY2FsbCwgd2hpY2ggcmV0dXJucyBhbiBleGNlcHRpb24KKyAgICAgdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZSBtZXRob2QgbmFtZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KKyAga2xhc3MtPmRpc3BhdGNoX2NhbGwgPSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3JlYWxfZGlzcGF0Y2hfY2FsbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZiODVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9ICisjZGVmaW5lIF9USFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaAorICogIFxicmllZiBQYXJzZXMgYSBtZXRob2QtY2FsbCBtZXNzYWdlIGhlYWRlciBhbmQgaW52b2tlcyBhIGZ1bmN0aW9uCisgKiAgICAgICAgIHRvIGRpc3BhdGNoIHRoZSBjYWxsIGJ5IGZ1bmN0aW9uIG5hbWUuCisgKgorICogVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgaXMgYW4gYWJzdHJhY3QgaGVscGVyIGNsYXNzIHRoYXQgcGFyc2VzIHRoZQorICogaGVhZGVyIG9mIGEgbWV0aG9kLWNhbGwgbWVzc2FnZSBhbmQgaW52b2tlcyBhIG1lbWJlciBmdW5jdGlvbiwKKyAqIGRpc3BhdGNoX2NhbGwsIHdpdGggdGhlIG1ldGhvZCdzIG5hbWUuCisgKgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBkaXNwYXRjaF9jYWxsIHRvIGRpc3BhdGNoIHRoZSBtZXRob2QgY2FsbAorICogdG8gdGhlIGltcGxlbWVudGluZyBmdW5jdGlvbi4KKyAqLworCisvKiBUeXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IgKHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IsIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0RJU1BBVENIX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiwgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IsIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MpKQorCisvKiEKKyAqIFRocmlmdCBEaXNwYXRjaCBQcm9jZXNzb3Igb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yIHBhcmVudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3I7CisKKy8qIQorICogVGhyaWZ0IERpc3BhdGNoIFByb2Nlc3NvciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgcGFyZW50OworCisgIC8qIHB1YmxpYyAqLworICBnYm9vbGVhbiAoKnByb2Nlc3MpIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdib29sZWFuICgqZGlzcGF0Y2hfY2FsbCkgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzczsKKworLyogVXNlZCBieSBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IgKi8KK0dUeXBlIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIFByb2Nlc3NlcyBhIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTBmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciwgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvciwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORF0gPSB7IE5VTEwsIH07CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIGdfaGFzaF90YWJsZV9yZXBsYWNlKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLAorCQkgICAgICAgZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpLAorCQkgICAgICAgZ19vYmplY3RfcmVmIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpKTsKKworICAvKiBNYWtlIGZpcnN0IHJlZ2lzdGVyZWQgYmVjb21lIGRlZmF1bHQgKi8KKyAgaWYoIXNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorCQkJCQkgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIGdib29sZWFuIHRva2VuX2Vycm9yID0gRkFMU0U7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIFRocmlmdFByb2Nlc3NvciAqbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIGNoYXIgKnRva2VuPU5VTEw7CisgIGludCB0b2tlbl9pbmRleD0wOworICBjaGFyICpzdGF0ZT1OVUxMOworICBnY2hhciAqZm5hbWU9TlVMTDsKKyAgZ2ludDMyIHNlcWlkLCByZXN1bHQ7CisKKyAgLyogRklYTUUgSXQgc2VlbXMgdGhhdCBwcmV2aW91cyBwcm9jZXNzb3IgaXMgbm90IG1hbmFnaW5nIGVycm9yIGNvcnJlY3RseSAqLworICBpZigqZXJyb3IhPU5VTEwpIHsKKyAgICAgIGdfZGVidWcgKCJ0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yOiBsYXN0IGVycm9yIG5vdCByZW1vdmVkOiAlcyIsCisgICAgICAJCSAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIH0KKworCisgIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MoaW4pLT5yZWFkX21lc3NhZ2VfYmVnaW4oaW4sICZmbmFtZSwgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCBlcnJvcik7CisKKyAgaWYoIShtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisJCSAgICJtZXNzYWdlIHR5cGUgaW52YWxpZCBmb3IgdGhpcyBwcm9jZXNzb3IiKTsKKyAgfWVsc2V7CisgICAgICAvKiBTcGxpdCBieSB0aGUgdG9rZW4gKi8KKyAgICAgIGZvciAodG9rZW4gPSBzdHJ0b2tfcihmbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgdG9rZW5faW5kZXg9MDsKKwkgIHRva2VuICE9IE5VTEwgJiYgIXRva2VuX2Vycm9yOworCSAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICAgICAgdG9rZW5faW5kZXgrKykKKwl7CisJICBzd2l0Y2godG9rZW5faW5kZXgpeworCSAgICBjYXNlIDA6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCB0b2tlbik7CisJICAgICAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkJICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCB0b2tlbiwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisJCQkgICAidGhlIG1lc3NhZ2UgaGFzIG1vcmUgdG9rZW5zIHRoYW4gZXhwZWN0ZWQhIik7CisJICAgICAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICBicmVhazsKKwkgIH0KKwl9CisgICAgICAvKiBTZXQgZGVmYXVsdCAqLworICAgICAgaWYoIXN0b3JlZF9tZXNzYWdlX3Byb3RvY29sICYmCisJICAhbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICYmCisJICB0b2tlbl9pbmRleD09MSAmJiBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKwkgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJCSAgICJzZXJ2aWNlICVzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwcm9jZXNzb3IiLAorCQkJICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICB9ZWxzZXsKKwkgICAgICAvKiBTZXQgdGhlIG1lc3NhZ2UgbmFtZSB0byB0aGUgb3JpZ2luYWwgbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCBmbmFtZSwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgIH0KKworICAgICAgfQorCisgICAgICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCAmJiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IhPU5VTEwpeworCSAgcmV0dmFsID0gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciktPnByb2Nlc3MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciwgKFRocmlmdFByb3RvY29sICopIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBvdXQsIGVycm9yKSA7CisgICAgICB9ZWxzZXsKKwkgIGlmKCFlcnJvcikKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCSAgICAgICAic2VydmljZSAlcyBpcyBub3QgbXVsdGlwbGV4ZWQgaW4gdGhpcyBwcm9jZXNzb3IiLAorCQkgICAgICAgZm5hbWUpOworICAgICAgfQorCisKKyAgfQorCisgIGlmKCFyZXR2YWwpeworICAgICAgLyogQnkgZGVmYXVsdCwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlCisgICAgICAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisgICAgICAvKiBDb3BpZWQgZnJvbSBkaXNwYWNoIHByb2Nlc3NvciAqLworCisgICAgICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKGluLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKyAgICAgIGlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0LAorCQkJCQkgICAgICAgZm5hbWUsCisJCQkJCSAgICAgICBUX0VYQ0VQVElPTiwKKwkJCQkJICAgICAgIHNlcWlkLAorCQkJCQkgICAgICAgZXJyb3IpIDwgMCl7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKworICAgICAgeGNlcHRpb24gPQorCSAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisJCQkidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisJCQkibWVzc2FnZSIsICgqZXJyb3IpLT5tZXNzYWdlLAorCQkJTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisJCQkJICAgIG91dCwKKwkJCQkgICAgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgIGlmICgocmVzdWx0IDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChvdXQsICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHZhbCA9CisJICAoKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSAmJgorCSAgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgfWVsc2V7CisgICAgICAvKiBUaGUgcHJvdG9jb2wgbm93IGhhcyBhIGNvcHkgd2UgY2FuIGZyZWUgaXQgKi8KKyAgICAgIGdfZnJlZShmbmFtZSk7CisKKyAgfQorCisgIC8qCisgIEZJWE1FIFRoaXMgbWFrZXMgZXZlcnl0aGluZyBmYWlsLCBJIGRvbid0IGtub3cgd2h5LgorICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCl7CisJICAvLyBBZnRlciBpdHMgdXNlIHdlIG11c3QgZnJlZSBpdAorCSAgZ19vYmplY3RfdW5yZWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wpOworICB9CisgICovCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KK0dRdWFyawordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmplY3QpOworCisgIC8qIEZyZWUgb3VyIG11bHRpcGxleGVkIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyk7CisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gTlVMTDsKKworICBpZihzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIGdfZnJlZShzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWU9TlVMTDsKKyAgfQorCisgIC8qIENoYWluIHVwIHRvIHBhcmVudCAqLworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBPdmVycmlkZSAqLworICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGNscyktPnByb2Nlc3MgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbDsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgLyogT2JqZWN0IG1ldGhvZHMgKi8KKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemU7CisKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPnJlZ2lzdGVyX3Byb2Nlc3NvciA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGw7CisKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlZmF1bHQiLAorICAgICAgICAgICJEZWZhdWx0IHNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIHdoZXJlIG5vIG11bHRpcGxleGVkIGNsaWVudCB1c2VkIiwKKyAgICAgICAgICAiU2V0IHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKGdvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllcyk7CisKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYpCit7CisKKyAgLyogQ3JlYXRlIG91ciBtdWx0aXBsZXhlZCBzZXJ2aWNlcyBoYXNoIHRhYmxlICovCisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsICgKKyAgICAgIGdfc3RyX2hhc2gsCisgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgIGdfZnJlZSwKKyAgICAgIGdfb2JqZWN0X3VucmVmKTsKKyAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IE5VTEw7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKHByb2Nlc3NvciktPnJlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIGVycm9yKTsKK30KKworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNjYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICoKKyAqICBDcmVhdGVkIG9uOiAxNCBzZXB0LiAyMDE3CisgKiAgICAgIEF1dGhvcjogZ2FndWlsYXIKKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIFRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgZm9yIGNfZ2xpYi4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOICJ0aHJpZnQtbXVsdGlwbGV4ZWQtcHJvY2Vzc29yLWVycm9yLXF1YXJrIgorCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqIGRlZmF1bHRfcHJvY2Vzc29yX25hbWU7CisgIEdIYXNoVGFibGUgKm11bHRpcGxleGVkX3NlcnZpY2VzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiByZWdpc3Rlcl9wcm9jZXNzb3IpIChUaHJpZnRQcm9jZXNzb3IgKnNlbGYsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBSZWdpc3RlcnMgYSBwcm9jZXNzb3IgaW4gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciB1bmRlciBpdHMgbmFtZS4gSXQKKyAqIHdpbGwgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2Vzc29yIHNvIHJlZmNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQuCisgKiBJdCB3aWxsIGFsc28gYmUgZGVjcmVtZW50ZWQgb24gb2JqZWN0IGRlc3RydWN0aW9uLgorICoKKyAqIFRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciBiZWNvbWVzIGRlZmF1bHQuIEJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGgKKyAqICJkZWZhdWx0IiBwcm9wZXJ0eS4KKyAqCisgKiBJdCByZXR1cm5zIGEgY29tcGxpYW50IGVycm9yIGlmIGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkLgorICoKKyAqIEBwYXJhbSBwcm9jZXNzb3IgUG9pbnRlciB0byB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yLgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lIE5hbWUgb2YgdGhlIHByb2Nlc3NvciB5b3Ugd2FudCB0byByZWdpc3RlcgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3NvciBQb2ludGVyIHRvIGltcGxlbWVudGVkIHByb2Nlc3NvciB5b3Ugd2FudCBtdWx0aXBsZXguCisgKiBAcGFyYW0gZXJyb3IgRXJyb3Igb2JqZWN0IHdoZXJlIHdlIHNob3VsZCBzdG9yZSBlcnJvcnMuCisgKgorICogQHNlZSBodHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2xpYi9zdGFibGUvZ2xpYi1FcnJvci1SZXBvcnRpbmcuaHRtbCNnLXNldC1lcnJvcgorICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFTkQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9DTE9TRQorfSBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckVycm9yOworCisKK0dRdWFyayB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAoKSkKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDJjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvY2Vzc29yLCB0aHJpZnRfcHJvY2Vzc29yLCBHX1RZUEVfT0JKRUNUKQorCitnYm9vbGVhbgordGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuCisgICAgVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKHByb2Nlc3NvciktPnByb2Nlc3MgKHByb2Nlc3NvciwgaW4sIG91dCwgZXJyb3IpOworfQorCisvKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0UHJvY2Vzc29yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb2Nlc3Nvcl9jbGFzc19pbml0IChUaHJpZnRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KKyAgY2xzLT5wcm9jZXNzID0gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb2Nlc3Nvcl9pbml0IChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb2Nlc3Nvcik7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyZDJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfSAorI2RlZmluZSBfVEhSSUZUX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvY2Vzc29ycy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9DRVNTT1IgKHRocmlmdF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvcikpCisjZGVmaW5lIFRIUklGVF9JU19QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MpKQorCisvKiEKKyAqIFRocmlmdCBQcm9jZXNzb3JvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRQcm9jZXNzb3IKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvciBUaHJpZnRQcm9jZXNzb3I7CisKKy8qIQorICogVGhyaWZ0IFByb2Nlc3NvciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvckNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqcHJvY2VzcykgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKTsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgVGhyaWZ0UHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRQcm9jZXNzb3JDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZDAxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCkBAIC0wLDAgKzEsOTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sLCB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworc3RhdGljIGd1aW50NjQKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoZ2RvdWJsZSB2KQoreworICB1bmlvbiB7CisgICAgZ2RvdWJsZSBmcm9tOworICAgIGd1aW50NjQgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK3N0YXRpYyBnZG91YmxlCit0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGd1aW50NjQgdikKK3sKKyAgdW5pb24geworICAgIGd1aW50NjQgZnJvbTsKKyAgICBnZG91YmxlIHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHZlcnNpb24gPSAoVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEpCisgICAgICAgICAgICAgICAgICAgfCAoKGdpbnQzMikgbWVzc2FnZV90eXBlKTsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCB2ZXJzaW9uLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIHNlcWlkLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIFRfU1RPUCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIChnaW50MzIpIHNpemUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50OCB0bXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHRtcCA9IHZhbHVlID8gMSA6IDA7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHRtcCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgIAorICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQxNiBuZXQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIG5ldCA9IGdfaHRvbnMgKHZhbHVlKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDIsIGVycm9yKSkKKyAgeworICAgIHJldHVybiAyOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIG5ldDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbmV0ID0gZ19odG9ubCAodmFsdWUpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgNCwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50NjQgbmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBuZXQgPSBHVUlOVDY0X1RPX0JFICh2YWx1ZSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCA4LCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gODsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDY0IGJpdHM7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGJpdHMgPSBHVUlOVDY0X0ZST01fQkUgKHRocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAodmFsdWUpKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZiaXRzLCA4LCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gODsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDMyIGxlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOworICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBsZW4sIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChsZW4gPiAwKQorICB7CisgICAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCBsZW4sIGVycm9yKSA9PSBGQUxTRSkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gbGVuOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50MzIgc3o7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnN6LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc3ogPCAwKQorICB7CisgICAgLyogY2hlY2sgZm9yIHZlcnNpb24gKi8KKyAgICBndWludDMyIHZlcnNpb24gPSBzeiAmIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xKQorICAgIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdmVyc2lvbiAlZCwgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSwgdmVyc2lvbik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgKm1lc3NhZ2VfdHlwZSA9IChUaHJpZnRNZXNzYWdlVHlwZSkgKHN6ICYgMHgwMDAwMDBmZik7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsIHNlcWlkLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgICpuYW1lID0gTlVMTDsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDggdHlwZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKmZpZWxkX3R5cGUgPSAoVGhyaWZ0VHlwZSkgdHlwZTsKKyAgaWYgKCpmaWVsZF90eXBlID09IFRfU1RPUCkKKyAgeworICAgICpmaWVsZF9pZCA9IDA7CisgICAgcmV0dXJuIHhmZXI7CisgIH0KKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCBmaWVsZF9pZCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDggaywgdjsKKyAgZ2ludDMyIHNpemVpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmaywgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICprZXlfdHlwZSA9IChUaHJpZnRUeXBlKSBrOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKnZhbHVlX3R5cGUgPSAoVGhyaWZ0VHlwZSkgdjsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzaXplaSwgZXJyb3IpKSA8MCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZWkgPCAwKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBzaXplaSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKnNpemUgPSAoZ3VpbnQzMikgc2l6ZWk7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQ4IGU7CisgIGdpbnQzMiBzaXplaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICAqZWxlbWVudF90eXBlID0gKFRocmlmdFR5cGUpIGU7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc2l6ZWksIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplaSA8IDApCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHNpemVpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAqc2l6ZSA9IChndWludDMyKSBzaXplaTsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLCBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IAorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiICE9IDA7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSAqKGdpbnQ4ICopIGI7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzJdOworICAgIGdpbnQxNiBpbnQxNjsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDIsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IGdfbnRvaHMgKGIuaW50MTYpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVs0XTsKKyAgICBnaW50MzIgaW50MzI7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA0LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSBnX250b2hsIChiLmludDMyKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbOF07CisgICAgZ2ludDY0IGludDY0OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gR1VJTlQ2NF9GUk9NX0JFIChiLmludDY0KTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzhdOworICAgIGd1aW50NjQgdWludDY0OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChHVUlOVDY0X0ZST01fQkUgKGIudWludDY0KSk7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDMyIGxlbjsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50MzIgcmVhZF9sZW4gPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAocmVhZF9sZW4gPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyAqLworICBsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW4gKyAxOyAvKiBzcGFjZSBmb3IgbnVsbCB0ZXJtaW5hdG9yICovCisgICpzdHIgPSBnX25ldzAgKGdjaGFyLCBsZW4pOworICBpZiAocmVhZF9sZW4gPiAwKSB7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICBnX2ZyZWUgKCpzdHIpOworICAgICAgKnN0ciA9IE5VTEw7CisgICAgICBsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqKnN0ciA9IDA7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50MzIgcmVhZF9sZW4gPSAwOworIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHJlYWRfbGVuID4gMCkKKyAgeworICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBnX25ldyAoZ3VjaGFyLCAqbGVuKTsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgZ19mcmVlICgqYnVmKTsKKyAgICAgICpidWYgPSBOVUxMOworICAgICAgKmxlbiA9IDA7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47CisgICAgKmJ1ZiA9IE5VTEw7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnByb3RvY29sKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7CisgIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47CisgIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKKyAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOworICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbDsKKyAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyOworICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOworICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7CisgIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47CisgIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKKyAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzMGJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCisgKiAgXGJyaWVmIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQorCisvKiB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEgMHg4MDAxMDAwMAorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSyAweGZmZmYwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbCBUaHJpZnRCaW5hcnlQcm90b2NvbDsKKworLyohCisgKiBUaHJpZnQgQmluYXJ5IFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IEJpbmFyeSBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0ZTlhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQoreworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqcHJvdG9jb2xfZmFjdG9yeV9jbGFzcyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChjbHMpOworCisgIHByb3RvY29sX2ZhY3RvcnlfY2xhc3MtPmdldF9wcm90b2NvbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRjMDczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5IFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeTsKKworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzczsKKworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlNDc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorCisvKgorICogKl90b196aWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CisgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KKyAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgorICovCisjaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisjZW5kaWYKKyNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorIyBlcnJvciAidGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wgb25seSB3b3JrcyBpZiBzaWduZWQgcmlnaHQgc2hpZnQgaXMgYXJpdGhtZXRpYyIKKyNlbmRpZgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0Q29tcGFjdFByb3RvY29sUHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sLCB0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCitzdGF0aWMgY29uc3QgZ2ludDggUFJPVE9DT0xfSUQgPSAoZ2ludDgpMHg4MnU7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9OID0gMTsKK3N0YXRpYyBjb25zdCBnaW50OCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvKiAwMDAxIDExMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX01BU0sgPSAoZ2ludDgpMHhlMHU7ICAvKiAxMTEwIDAwMDAgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX0JJVFMgPSAweDA3OyAgICAgICAgICAvKiAwMDAwIDAxMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50MzIgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIFR5cGVzIHsKKyAgQ1RfU1RPUCAgICAgICAgICAgPSAweDAwLAorICBDVF9CT09MRUFOX1RSVUUgICA9IDB4MDEsCisgIENUX0JPT0xFQU5fRkFMU0UgID0gMHgwMiwKKyAgQ1RfQllURSAgICAgICAgICAgPSAweDAzLAorICBDVF9JMTYgICAgICAgICAgICA9IDB4MDQsCisgIENUX0kzMiAgICAgICAgICAgID0gMHgwNSwKKyAgQ1RfSTY0ICAgICAgICAgICAgPSAweDA2LAorICBDVF9ET1VCTEUgICAgICAgICA9IDB4MDcsCisgIENUX0JJTkFSWSAgICAgICAgID0gMHgwOCwKKyAgQ1RfTElTVCAgICAgICAgICAgPSAweDA5LAorICBDVF9TRVQgICAgICAgICAgICA9IDB4MEEsCisgIENUX01BUCAgICAgICAgICAgID0gMHgwQiwKKyAgQ1RfU1RSVUNUICAgICAgICAgPSAweDBDCit9OworCitzdGF0aWMgY29uc3QgZ2ludDggVFR5cGVUb0NUeXBlWzE2XSA9IHsKKyAgQ1RfU1RPUCwgLyogVF9TVE9QICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9CT09MRUFOX1RSVUUsIC8qIFRfQk9PTCAqLworICBDVF9CWVRFLCAvKiBUX0JZVEUgKi8KKyAgQ1RfRE9VQkxFLCAvKiBUX0RPVUJMRSAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTE2LCAvKiBUX0kxNiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTMyLCAvKiBUX0kzMiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTY0LCAvKiBUX0k2NCAqLworICBDVF9CSU5BUlksIC8qIFRfU1RSSU5HICovCisgIENUX1NUUlVDVCwgLyogVF9TVFJVQ1QgKi8KKyAgQ1RfTUFQLCAvKiBUX01BUCAqLworICBDVF9TRVQsIC8qIFRfU0VUICovCisgIENUX0xJU1QsIC8qIFRfTElTVCAqLworfTsKKworc3RhdGljIGd1aW50NjQKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoY29uc3QgZ2RvdWJsZSB2KQoreworICB1bmlvbiB7CisgICAgZ2RvdWJsZSBmcm9tOworICAgIGd1aW50NjQgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK3N0YXRpYyBnZG91YmxlCit0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGNvbnN0IGd1aW50NjQgdikKK3sKKyAgdW5pb24geworICAgIGd1aW50NjQgZnJvbTsKKyAgICBnZG91YmxlIHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50NjQKK2k2NF90b196aWd6YWcgKGNvbnN0IGdpbnQ2NCBsKQoreworICByZXR1cm4gKCgoZ3VpbnQ2NClsKSA8PCAxKSBeIChsID4+IDYzKTsKK30KKworLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50MzIKK2kzMl90b196aWd6YWcgKGNvbnN0IGdpbnQzMiBuKQoreworICByZXR1cm4gKCgoZ3VpbnQzMiluKSA8PCAxKSBeIChuID4+IDMxKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBnaW50MzIKK3ppZ3phZ190b19pMzIgKGd1aW50MzIgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50MzIpICgtKGdpbnQzMikgKG4gJiAxKSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK3N0YXRpYyBnaW50NjQKK3ppZ3phZ190b19pNjQgKGd1aW50NjQgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50NjQpICgtKGdpbnQ2NCkgKG4gJiAxKSk7Cit9CisKK1RocmlmdFR5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4IHR5cGUsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVF9TVE9QOgorICAgICAgcmV0dXJuIFRfU1RPUDsKKyAgICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBDVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVF9CT09MOworICAgIGNhc2UgQ1RfQllURToKKyAgICAgIHJldHVybiBUX0JZVEU7CisgICAgY2FzZSBDVF9JMTY6CisgICAgICByZXR1cm4gVF9JMTY7CisgICAgY2FzZSBDVF9JMzI6CisgICAgICByZXR1cm4gVF9JMzI7CisgICAgY2FzZSBDVF9JNjQ6CisgICAgICByZXR1cm4gVF9JNjQ7CisgICAgY2FzZSBDVF9ET1VCTEU6CisgICAgICByZXR1cm4gVF9ET1VCTEU7CisgICAgY2FzZSBDVF9CSU5BUlk6CisgICAgICByZXR1cm4gVF9TVFJJTkc7CisgICAgY2FzZSBDVF9MSVNUOgorICAgICAgcmV0dXJuIFRfTElTVDsKKyAgICBjYXNlIENUX1NFVDoKKyAgICAgIHJldHVybiBUX1NFVDsKKyAgICBjYXNlIENUX01BUDoKKyAgICAgIHJldHVybiBUX01BUDsKKyAgICBjYXNlIENUX1NUUlVDVDoKKyAgICAgIHJldHVybiBUX1NUUlVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzVdOworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQzMiBtOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgeGZlciA9IDA7CisgIG0gPSBuOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChtICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQ2NCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzEwXTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50NjQgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGTCkgPT0gMCkgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpbTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCkoKG0gJiAweDdGKSB8IDB4ODApOworICAgICAgbSA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCktPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCB4ZmVyLCBlcnJvcikpIHsKKyAgICByZXR1cm4geGZlcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgKmk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbCAqdHA7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IHZhbDsKKyAgZ2ludCBzaGlmdDsKKyAgZ3VpbnQ4IGJ5dGU7CisKKyAgdHAgPSBUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgeGZlciA9IDA7CisgIHZhbCA9IDA7CisgIHNoaWZ0ID0gMDsKKyAgYnl0ZSA9IDA7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRwLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpICZieXRlLCAxLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICArK3hmZXI7CisgICAgdmFsIHw9IChndWludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICppNjQgPSAoZ2ludDY0KSB2YWw7CisgICAgICByZXR1cm4geGZlcjsKKyAgICB9CisgICAgaWYgKEdfVU5MSUtFTFkgKHhmZXIgPT0gMTApKSB7IC8qIDcgKiA5IDwgNjQgPCA3ICogMTAgKi8KKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcyIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50NjQgdmFsOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKHByb3RvY29sLCAmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICppMzIgPSAoZ2ludDMyKXZhbDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ2ludDggdHlwZV90b193cml0ZTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgLyogaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LiAqLworICB0eXBlX3RvX3dyaXRlCisgICAgPSAodHlwZV9vdmVycmlkZSA9PSAtMSA/IFRUeXBlVG9DVHlwZVtmaWVsZF90eXBlXSA6IHR5cGVfb3ZlcnJpZGUpOworCisgIC8qIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZCAqLworICBpZiAoZmllbGRfaWQgPiBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQKKyAgICAgICYmIGZpZWxkX2lkIC0gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkIDw9IDE1KSB7CisgICAgLyogd3JpdGUgdGhlbSB0b2dldGhlciAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKChmaWVsZF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgdHlwZV90b193cml0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgLyogd3JpdGUgdGhlbSBzZXBhcmF0ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fd3JpdGUsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA9IGZpZWxkX2lkOworICByZXR1cm4geGZlcjsKK30KKworLyoqCisgKiBNZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChzaXplIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVtlbGVtX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgweGYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKgorICogcHVibGljIG1ldGhvZHMKKyAqLworCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDggdmVyc2lvbjsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB2ZXJzaW9uID0gKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykKKyAgICAgICAgICAgIHwgKCgoZ2ludDMyKSBtZXNzYWdlX3R5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFBST1RPQ09MX0lELCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyKSBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHEsIEdJTlRfVE9fUE9JTlRFUiAoKGdpbnQpIGNwLT5fbGFzdF9maWVsZF9pZCkpOworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAwOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIGlmIChmaWVsZF90eXBlID09IFRfQk9PTCkgeworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gbmFtZTsKKyAgICBjcC0+X2Jvb2xfZmllbGRfdHlwZSA9IGZpZWxkX3R5cGU7CisgICAgY3AtPl9ib29sX2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKFRUeXBlVG9DVHlwZVtrZXlfdHlwZV0gPDwgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW3ZhbHVlX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9jb2xsZWN0aW9uX2JlZ2luIChjcCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5fYm9vbF9maWVsZF9uYW1lICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICh2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgY3AtPl9ib29sX2ZpZWxkX25hbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8qIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUgPyBDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENUX0JPT0xFQU5fRkFMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90b196aWd6YWcgKChnaW50MzIpIHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQ2NCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50NjQgYml0czsKKworICBnX2Fzc2VydCAoc2l6ZW9mIChnZG91YmxlKSA9PSBzaXplb2YgKGd1aW50NjQpKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGJpdHMgPSBHVUlOVDY0X1RPX0xFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBzaXplX3QgbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOworICBpZiAobGVuID4gR19NQVhJTlQzMikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgInN0cmluZyBzaXplIChndWVzczogJWx1KSBpcyB0b28gbGFyZ2UiLCAodW5zaWduZWQgbG9uZykgbGVuKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGd1aW50MzIpIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAobGVuID4gMCkgeworICAgIC8qIGNoZWNraW5nIGxlbiArIHhmZXIgPiB1aW50X21heCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcmZsb3cgd2hpbGUKKyAgICAgKiBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLiB0cmFuc2Zvcm1pbmcgdG8gbGVuID4gdWludF9tYXggLSB4ZmVyLgorICAgICAqLworICAgIGlmIChsZW4gPiAoZ3VpbnQzMikgKEdfTUFYSU5UMzIgLSB4ZmVyKSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgInNpemUgJWQgKyAlZCBpcyB0b28gbGFyZ2UiLCBsZW4sIHhmZXIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSBsZW47CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBwcm90b2NvbF9pZCwgdmVyc2lvbl9hbmRfdHlwZSwgdmVyc2lvbjsKKworICB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChwcm90b2NvbF9pZCAhPSBQUk9UT0NPTF9JRCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgcHJvdG9jb2wgaWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmVyc2lvbl9hbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICB2ZXJzaW9uID0gKGdpbnQ4KSh2ZXJzaW9uX2FuZF90eXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgImJhZCB2ZXJzaW9uIGFuZC9vciB0eXBlIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKm1lc3NhZ2VfdHlwZQorICAgID0gKFRocmlmdE1lc3NhZ2VUeXBlKSgodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsIHNlcWlkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgKm5hbWUgPSBOVUxMOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IChnaW50MTYpIEdQT0lOVEVSX1RPX0lOVCAoZ19xdWV1ZV9wb3BfdGFpbCAocSkpOworCisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDE2IG1vZGlmaWVyOworICBnaW50OCBieXRlOworICBnaW50OCB0eXBlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdHlwZSA9IChieXRlICYgMHgwZik7CisKKyAgLyogaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLiAqLworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAqZmllbGRfdHlwZSA9IFRfU1RPUDsKKyAgICAqZmllbGRfaWQgPSAwOworICAgIHJldHVybiB4ZmVyOworICB9CisKKyAgLyogbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4KKyAgICogaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICAgKi8KKyAgbW9kaWZpZXIgPSAoZ2ludDE2KSgoKGd1aW50OClieXRlICYgMHhmMCkgPj4gNCk7CisgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgLyogbm90IGEgZGVsdGEsIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLiAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICpmaWVsZF9pZCA9IChnaW50MTYpKGNwLT5fbGFzdF9maWVsZF9pZCArIG1vZGlmaWVyKTsKKyAgfQorICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsIHR5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICpmaWVsZF90eXBlID0gcmV0OworCisgIC8qIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlICovCisgIGlmICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSB8fCB0eXBlID09IENUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICAvKiBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4gKi8KKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gVFJVRTsKKyAgICBjcC0+X2Jvb2xfdmFsdWUgPQorICAgICAgKHR5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorCisgIC8qIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLiAqLworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAqZmllbGRfaWQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IGt2X3R5cGU7CisgIGdpbnQzMiBtc2l6ZTsKKworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAga3ZfdHlwZSA9IDA7CisgIG1zaXplID0gMDsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJm1zaXplLCBlcnJvcikpIDwwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIC8qIHN0aWxsIHJlYWQgdGhlIGt2IGJ5dGUgaWYgbmVnYXRpdmUgc2l6ZSAqLworICBpZiAobXNpemUgIT0gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrdl90eXBlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChjcC0+Y29udGFpbmVyX2xpbWl0ID4gMCAmJiBtc2l6ZSA+IGNwLT5jb250YWluZXJfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIG1zaXplLCBjcC0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAobXNpemUgPiAwKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqa2V5X3R5cGUgPSByZXQ7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnZhbHVlX3R5cGUgPSByZXQ7CisgICAgKnNpemUgPSAoZ3VpbnQzMikgbXNpemU7CisgIH0gZWxzZSBpZiAobXNpemUgPT0gMCkgeworICAgICprZXlfdHlwZSA9IDA7CisgICAgKnZhbHVlX3R5cGUgPSAwOworICAgICpzaXplID0gMDsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIG1zaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHNpemVfYW5kX3R5cGU7CisgIGdpbnQzMiBsc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBzaXplX2FuZF90eXBlID0gMDsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmc2l6ZV9hbmRfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgbHNpemUgPSAoKGd1aW50OClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKGxzaXplID09IDE1KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJmxzaXplLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChsc2l6ZSA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIGxzaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbHNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBsc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KShzaXplX2FuZF90eXBlICYgMHgwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZWxlbWVudF90eXBlID0gcmV0OworICAqc2l6ZSA9IChndWludDMyKSBsc2l6ZTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHZhbDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoY3AtPl9oYXNfYm9vbF92YWx1ZSA9PSBUUlVFKSB7CisgICAgKnZhbHVlID0gY3AtPl9ib29sX3ZhbHVlOworICAgIGNwLT5faGFzX2Jvb2xfdmFsdWUgPSBGQUxTRTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgICp2YWx1ZSA9ICh2YWwgPT0gQ1RfQk9PTEVBTl9UUlVFKTsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gKGdpbnQxNikgemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTMyICgoZ3VpbnQzMikgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQ2NCB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQ2NCAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IHppZ3phZ190b19pNjQgKChndWludDY0KSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbiB7CisgICAgZ3VpbnQ2NCBiaXRzOworICAgIGd1aW50OCBiWzhdOworICB9IHU7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmIsIDgsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHUuYml0cyA9IEdVSU5UNjRfRlJPTV9MRSAodS5iaXRzKTsKKyAgKnZhbHVlID0gdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlICh1LmJpdHMpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIHJlYWRfbGVuICsgMSk7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpzdHIpOworICAgICAgKnN0ciA9IE5VTEw7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICoqc3RyID0gMDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBnX25ldyAoZ3VjaGFyLCAqbGVuKTsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICAgIGdfZnJlZSAoKmJ1Zik7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgICpsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICB9IGVsc2UgaWYgKHJlYWRfbGVuID09IDApIHsKKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBOVUxMOworCisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGMgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICB0Yy0+c3RyaW5nX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGMtPmNvbnRhaW5lcl9saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnNlbGYpCit7CisgIGdfcXVldWVfaW5pdCAoJihzZWxmLT5fbGFzdF9maWVsZCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaAorICogIFxicmllZiBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wgVGhyaWZ0Q29tcGFjdFByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBDb21wYWN0IFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7CisKKyAgLyogcHJpdmF0ZSAqLworCisgIC8qKgorICAgKiAoV3JpdGluZykgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUKKyAgICogc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICovCisgIGNvbnN0IGdjaGFyKiBfYm9vbF9maWVsZF9uYW1lOworICBUaHJpZnRUeXBlIF9ib29sX2ZpZWxkX3R5cGU7CisgIGdpbnQxNiBfYm9vbF9maWVsZF9pZDsKKworICAvKioKKyAgICogKFJlYWRpbmcpIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZQorICAgKiB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZF9ib29sIGNhbiB1c2UgaXQuCisgICAqLworICBnYm9vbGVhbiBfaGFzX2Jvb2xfdmFsdWU7CisgIGdib29sZWFuIF9ib29sX3ZhbHVlOworCisgIC8qKgorICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgKi8KKworICBHUXVldWUgX2xhc3RfZmllbGQ7CisgIGdpbnQxNiBfbGFzdF9maWVsZF9pZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyNWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlQcm9wZXJ0aWVzCit7CisgICAgUFJPUF8wLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChmYWN0b3J5KTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0IiwgdGNmLT5zdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgdGNmLT5jb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yyk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQ6CisgICAgICB0Y2YtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGNmLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJjb250YWluZXJfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIGNvbnRhaW5lciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBjb250YWluZXIgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVCwgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY5NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgXAorICAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlksIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2ludDMyIHN0cmluZ19saW1pdDsKKyAgZ2ludDMyIGNvbnRhaW5lcl9saW1pdDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzOworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnY2hhciAqc2VydmljZV9uYW1lID0gTlVMTDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgKm11bHRpcGxleENsYXNzID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0dFVF9DTEFTUyhzZWxmKTsKKworICBpZiggKG1lc3NhZ2VfdHlwZSA9PSBUX0NBTEwgfHwgbWVzc2FnZV90eXBlID09IFRfT05FV0FZKSAmJiBzZWxmLT5zZXJ2aWNlX25hbWUgIT0gTlVMTCkgeworICAgIHNlcnZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZigiJXMlcyVzIiwgc2VsZi0+c2VydmljZV9uYW1lLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsIG5hbWUpOworICB9ZWxzZXsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgfQorCisgIC8qIHJlbGF5IHRvIHRoZSBwcm90b2NvbF9kZWNvcmF0b3IgKi8KKyAgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luKHByb3RvY29sLCBzZXJ2aWNlX25hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxaWQsIGVycm9yKTsKKworICBnX2ZyZWUoc2VydmljZV9uYW1lKTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIHNlbGYtPnNlcnZpY2VfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+c2VydmljZV9uYW1lID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgaWYgKHNlbGYtPnNlcnZpY2VfbmFtZSkgeworICAgIGdfZnJlZShzZWxmLT5zZXJ2aWNlX25hbWUpOworICAgIHNlbGYtPnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgYXMgd2l0aCBkaXNwb3NlKCksIGZpbmFsaXplKCkKKyAgICogaXMgZ3VhcmFudGVlZCB0byBleGlzdCBvbiB0aGUgcGFyZW50J3MgY2xhc3MgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShnb2JqZWN0KTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworCisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2ZpbmFsaXplOworCisgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2aWNlLW5hbWUiLAorICAgICAgICAgICJTZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byIsCisgICAgICAgICAgIlNldCB0aGUgc2VydmljZSBuYW1lIiwKKyAgICAgICAgICBOVUxMLAorICAgICAgICAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORCwKKyAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllcyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUwOGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCAodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MpKQorCisvKiBjb25zdGFudCAqLworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IgIjoiCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2w7CisKKworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqc2VydmljZV9uYW1lOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcyBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkIFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTZhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4gInRocmlmdC1wcm90b2NvbC1lcnJvci1xdWFyayIKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFByb3RvY29sUHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVAorfTsKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbCwgdGhyaWZ0X3Byb3RvY29sLCBHX1RZUEVfT0JKRUNUKQorCit2b2lkCit0aHJpZnRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHByb3RvY29sLT50cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworCisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIHByb3RvY29sLT50cmFuc3BvcnQgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2JlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9jb2wsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9ib29sIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTE2IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2kzMiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pNjQgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RyaW5nIChwcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9maWVsZF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tYXBfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9saXN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc2V0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYm9vbCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2J5dGUgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2kxNiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pMzIgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTY0IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9kb3VibGUgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cmluZyAocHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9iaW5hcnkgKHByb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfc2tpcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlIHR5cGUsIEdFcnJvciAqKmVycm9yKQoreworICBzd2l0Y2ggKHR5cGUpCisgIHsKKyAgICBjYXNlIFRfQk9PTDoKKyAgICAgIHsKKyAgICAgICAgZ2Jvb2xlYW4gYm9vbHY7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwgJmJvb2x2LCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0JZVEU6CisgICAgICB7CisgICAgICAgIGdpbnQ4IGJ5dGV2OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZieXRldiwgZXJyb3IpOworICAgICAgfQorCisgICAgY2FzZSBUX0kxNjoKKyAgICAgIHsKKyAgICAgICAgZ2ludDE2IGkxNjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZpMTYsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfSTMyOgorICAgICAgeworICAgICAgICBnaW50MzIgaTMyOworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJmkzMiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9JNjQ6CisgICAgICB7CisgICAgICAgIGdpbnQ2NCBpNjQ7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmaTY0LCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0RPVUJMRToKKyAgICAgIHsKKyAgICAgICAgZ2RvdWJsZSBkdWI7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLCAmZHViLCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIHsKKyAgICAgICAgZ3BvaW50ZXIgZGF0YTsKKyAgICAgICAgZ3VpbnQzMiBsZW47CisgICAgICAgIGdpbnQzMiByZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiwgZXJyb3IpOworICAgICAgICBnX2ZyZWUgKGRhdGEpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIGNhc2UgVF9TVFJVQ1Q6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnY2hhciAqbmFtZTsKKyAgICAgICAgZ2ludDE2IGZpZDsKKyAgICAgICAgVGhyaWZ0VHlwZSBmdHlwZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcik7CisKKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZCwgZXJyb3IpOworICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7ICAKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKTsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgVF9TRVQ6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgVF9NQVA6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgVGhyaWZ0VHlwZSBrZXlfdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmZWxlbV90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwga2V5X3R5cGUsIGVycm9yKTsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNlIFRfTElTVDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOworICAgICAgICBndWludDMyIGksIHNpemU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHByb3RvY29scyAqLworR1F1YXJrCit0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX1BST1RPQ09MX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9pbml0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT50cmFuc3BvcnQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFByb3RvY29sICpzZWxmID0gVEhSSUZUX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+dHJhbnNwb3J0KTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sQ2xhc3MgKmNscykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kaXNwb3NlOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgIlRyYW5zcG9ydCIsICJUaHJpZnQgVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworICBjbHMtPndyaXRlX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wOworICBjbHMtPndyaXRlX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZDsKKyAgY2xzLT53cml0ZV9ib29sID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTY7CisgIGNscy0+d3JpdGVfaTMyID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9kb3VibGU7CisgIGNscy0+d3JpdGVfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisgIGNscy0+cmVhZF9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQ7CisgIGNscy0+cmVhZF9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luOworICBjbHMtPnJlYWRfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZmU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sLmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLyoqCisgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbCBzdXBwb3J0cy4KKyAqIFRha2Ugc3BlY2lhbCBub3RlIG9mIHRoZSBUX0VORCB0eXBlIHdoaWNoIGlzIHVzZWQgc3BlY2lmaWNhbGx5IHRvIG1hcmsKKyAqIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBmaWVsZHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFRfU1RPUCAgID0gMCwKKyAgVF9WT0lEICAgPSAxLAorICBUX0JPT0wgICA9IDIsCisgIFRfQllURSAgID0gMywKKyAgVF9JMDggICAgPSAzLAorICBUX0kxNiAgICA9IDYsCisgIFRfSTMyICAgID0gOCwKKyAgVF9VNjQgICAgPSA5LAorICBUX0k2NCAgICA9IDEwLAorICBUX0RPVUJMRSA9IDQsCisgIFRfU1RSSU5HID0gMTEsCisgIFRfVVRGNyAgID0gMTEsCisgIFRfU1RSVUNUID0gMTIsCisgIFRfTUFQICAgID0gMTMsCisgIFRfU0VUICAgID0gMTQsCisgIFRfTElTVCAgID0gMTUsCisgIFRfVVRGOCAgID0gMTYsCisgIFRfVVRGMTYgID0gMTcKK30gVGhyaWZ0VHlwZTsKKworLyoqCisgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIG1lc3NhZ2UgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sCisgKiBzdXBwb3J0cy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgVF9DQUxMICAgICAgPSAxLAorICBUX1JFUExZICAgICA9IDIsCisgIFRfRVhDRVBUSU9OID0gMywKKyAgVF9PTkVXQVkgICAgPSA0Cit9IFRocmlmdE1lc3NhZ2VUeXBlOworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTCAodGhyaWZ0X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2wgVGhyaWZ0UHJvdG9jb2w7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sCit7CisgIEdPYmplY3QgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbENsYXNzIFRocmlmdFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIGdpbnQzMiAoKndyaXRlX21lc3NhZ2VfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX21lc3NhZ2VfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3N0cnVjdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc3RydWN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9maWVsZF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9maWVsZF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZmllbGRfc3RvcCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9tYXBfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX21hcF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbGlzdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2xpc3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3NldF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zZXRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2Jvb2wpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdib29sZWFuIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9ieXRlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfaTE2KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfaTMyKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfaTY0KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZG91YmxlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnZG91YmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3N0cmluZykgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9iaW5hcnkpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworICBnaW50MzIgKCpyZWFkX21lc3NhZ2VfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sLCBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9tZXNzYWdlX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3N0cnVjdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zdHJ1Y3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfZmllbGRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfZmllbGRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbWFwX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9tYXBfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbGlzdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbGlzdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zZXRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc2V0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2Jvb2wpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2J5dGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2kxNikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2kzMikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2k2NCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2RvdWJsZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2RvdWJsZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3N0cmluZykgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9iaW5hcnkpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9za2lwIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiBkZWZpbmUgZXJyb3IgdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9OT1RfSU1QTEVNRU5URUQsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ERVBUSF9MSU1JVAorfSBUaHJpZnRQcm90b2NvbEVycm9yOworCisvKiBkZWZpbmUgYW4gZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCitHUXVhcmsgdGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0VSUk9SICh0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKCkpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmOTQyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCkBAIC0wLDAgKzEsNjIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFByb3RvY29sRGVjb3JhdG9yLCB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MID0gMSwKKyAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5ECit9OworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkRdID0geyBOVUxMLCB9OworCisKKworCisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKnByb3RvID0gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+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+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCisgKiAgXGJyaWVmIE11bHRpcGxleGVkIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiAodGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvciBUaHJpZnRQcm90b2NvbERlY29yYXRvcjsKKworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworCisgIFRocmlmdFByb3RvY29sICpjb25jcmV0ZV9wcm90b2NvbDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIERlY29yYXRvciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgcGFyZW50OworCit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmNDA4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbEZhY3RvcnksIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChmYWN0b3J5KS0+Z2V0X3Byb3RvY29sIChmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQoreworICBjbHMtPmdldF9wcm90b2NvbCA9IHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE0NmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeSBUaHJpZnRQcm90b2NvbEZhY3Rvcnk7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIEZhY3Rvcnkgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBGYWN0b3J5IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICBUaHJpZnRQcm90b2NvbCAqKCpnZXRfcHJvdG9jb2wpIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmg+CisKKworZW51bQoreworICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUUgPSAxLAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEUsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lELAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlQsIC8qIFRPRE8gdWdseSBoYWNrICovCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wsIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisJCQkJCSAgIGdjaGFyICoqbmFtZSwKKwkJCQkJICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKwkJCQkJICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQgPSAwOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICAvKiBXZSByZXR1cm4gdGhlIHN0b3JlZCB2YWx1ZXMgb24gY29uc3RydWN0aW9uICovCisgICpuYW1lID0gc2VsZi0+bmFtZTsKKyAgKm1lc3NhZ2VfdHlwZSA9IHNlbGYtPm10eXBlOworICAqc2VxaWQgPSBzZWxmLT5zZXFpZDsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKwkJCQkJICAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorCQkJCQkgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisJCQkJCSAgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRToKKyAgICAgIHNlbGYtPm5hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFOgorICAgICAgc2VsZi0+bXR5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSUQ6CisgICAgICBzZWxmLT5zZXFpZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKwkJCQkJICAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKwkJCQkJICAgICBHVmFsdWUgICAgICp2YWx1ZSwKKwkJCQkJICAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChvYmplY3QpOworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqZGVjb3JhdG9yID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ9TlVMTDsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIC8qIEZJWE1FIFNpbmNlIHdlIGRvbid0IG92ZXJyaWRlIHByb3BlcnRpZXMgaW4gdGhlIGRlY29yYXRvciBhcyBpdCBzaG91bGQKKyAgICAgICAgIHdlIGp1c3Qgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBrbm93IGFyZSB1c2VkICovCisgICAgICBnX29iamVjdF9nZXQoZGVjb3JhdG9yLT5jb25jcmV0ZV9wcm90b2NvbCxwc3BlYy0+bmFtZSwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9pbml0IChUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+bmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgaWYgKHNlbGYtPm5hbWUpIHsKKyAgICAgIGdfZnJlZShzZWxmLT5uYW1lKTsKKyAgICAgIHNlbGYtPm5hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibmFtZSIsCisJCQkgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorCQkJICAgIlNldCB0aGUgc2VydmljZSBuYW1lIiwKKwkJCSAgIE5VTEwsCisJCQkgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwKKwkJCSJNZXNzYWdlIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJIlNldCB0aGUgbWVzc2FnZSB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCVRfQ0FMTCwgVF9PTkVXQVksCisJCQlUX0NBTEwsCisJCQkoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRF0gPQorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcWlkIiwKKwkJCSJTZXF1ZW5jZSBpZCB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCSJTZXQgdGhlIFNlcXVlbmNlIGlkIGluIHRoZSB3aXJlIiwKKwkJCTAsIEdfTUFYSU5ULAorCQkJMCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICAvKiBUT0RPIFVnbHkgaGFjaywgaW4gdGhlb3J5IHdlIG11c3Qgb3ZlcnJpZGUgYWxsIHByb3BlcnRpZXMgZnJvbSB1bmRlcmxheWluZworICAgICBwcm90b2NvbCAqLworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUXSA9CisgICAgICBnX3BhcmFtX3NwZWNfcG9pbnRlciAoInRyYW5zcG9ydCIsCisJCQkiVHJhbnNwb3J0IG9uIHRoZSB1bmRlcmxheWluZyBpbXBsZW1lbnRhdGlvbiIsCisJCQkiVHJhbnNwb3J0IG9mIGRlY29yYXRlZCBwcm90b2NvbCIsCisJCQlHX1BBUkFNX1JFQURBQkxFKTsKKworCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQsCisJCQkJICAgICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgU3RvcmVkTWVzc2FnZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIHByZS1zdG9yZWQgbWVzc2FnZSBoZWFkZXIKKyAqICBvbiBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZSBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKKworCisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqbmFtZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7CisgIGdpbnQzMiBzZXFpZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgU3RvcmVkTWVzc2FnZSBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y5MTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgInRocmlmdF9zZXJ2ZXIuaCIKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNlcnZlclByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLAorICBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAorICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAorICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWSwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZCit9OworCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFNlcnZlciwgdGhyaWZ0X3NlcnZlciwgR19UWVBFX09CSkVDVCkKKwordm9pZAordGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPnByb2Nlc3Nvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfc2VydmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUjoKKyAgICAgIHNlcnZlci0+cHJvY2Vzc29yID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgorICAgICAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c2VydmUgKHNlcnZlciwgZXJyb3IpOworfQorCit2b2lkCit0aHJpZnRfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKQoreworICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c3RvcCAoc2VydmVyKTsKK30KKworLyogaW5zdGFuY2UgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdCBTZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2luaXQgKFRocmlmdFNlcnZlciAqc2VydmVyKQoreworICBzZXJ2ZXItPnByb2Nlc3NvciA9IE5VTEw7CisgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBOVUxMOworICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IE5VTEw7CisgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7CisgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTZXJ2ZXIgKnNlbGYgPSBUSFJJRlRfU0VSVkVSIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+c2VydmVyX3RyYW5zcG9ydCk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5wcm9jZXNzb3IpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NlcnZlcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKgorICogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFNlcnZlcgorICogVE9ETzogaW1wbGVtZW50IFNlcnZlckV2ZW50SGFuZGxlciBhcyBhIEdDbG9zdXJlCisgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2NsYXNzX2luaXQgKFRocmlmdFNlcnZlckNsYXNzICpjbHMpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9zZXJ2ZXJfZGlzcG9zZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJwcm9jZXNzb3IiLCAiUHJvY2Vzc29yIiwgIlRocmlmdCBQcm9jZXNzb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzZXJ2ZXJfdHJhbnNwb3J0IiwgIlNlcnZlciBUcmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJpbnB1dF90cmFuc3BvcnRfZmFjdG9yeSIsICJJbnB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBJbnB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJvdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAiSW5wdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBJbnB1dCBQcm90b2NvbCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSIsICJPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisKKyAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCisgIGNscy0+c2VydmUgPSB0aHJpZnRfc2VydmVyX3NlcnZlOworICBjbHMtPnN0b3AgPSB0aHJpZnRfc2VydmVyX3N0b3A7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZWRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfSAorI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2VydmVyLmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXJzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUiAodGhyaWZ0X3NlcnZlcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUikpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXIgVGhyaWZ0U2VydmVyOworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXIgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyCit7CisgIEdPYmplY3QgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvcjsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICppbnB1dF90cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqb3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5OworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmlucHV0X3Byb3RvY29sX2ZhY3Rvcnk7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqb3V0cHV0X3Byb3RvY29sX2ZhY3Rvcnk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyQ2xhc3MgVGhyaWZ0U2VydmVyQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFNlcnZlciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlckNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqc2VydmUpIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpOworICB2b2lkICgqc3RvcCkgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSICovCitHVHlwZSB0aHJpZnRfc2VydmVyX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFN0b3AgaGFuZGxpbmcgcmVxdWVzdHMuCisgKi8KK3ZvaWQgdGhyaWZ0X3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NFUlZFUl9IICovCisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTk2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFNpbXBsZVNlcnZlciwgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIsIFRIUklGVF9UWVBFX1NFUlZFUikKKworZ2Jvb2xlYW4KK3RocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqaW5wdXRfdHJhbnNwb3J0ID0gTlVMTCwgKm91dHB1dF90cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wgPSBOVUxMLCAqb3V0cHV0X3Byb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U2ltcGxlU2VydmVyICp0c3MgPSBUSFJJRlRfU0lNUExFX1NFUlZFUihzZXJ2ZXIpOworICBHRXJyb3IgKnByb2Nlc3NfZXJyb3IgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU0lNUExFX1NFUlZFUiAoc2VydmVyKSwgRkFMU0UpOworCisgIGlmICh0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwgZXJyb3IpKSB7CisgICAgdHNzLT5ydW5uaW5nID0gVFJVRTsKKyAgICB3aGlsZSAodHNzLT5ydW5uaW5nID09IFRSVUUpCisgICAgeworICAgICAgdCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgaWYgKHQgIT0gTlVMTCAmJiB0c3MtPnJ1bm5pbmcpIHsKKyAgICAgICAgaW5wdXRfdHJhbnNwb3J0ID0KKyAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3RyYW5zcG9ydCAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSwgdCk7CisgICAgICAgIG91dHB1dF90cmFuc3BvcnQgPQorICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3RyYW5zcG9ydCAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnksIHQpOworICAgICAgICBpbnB1dF9wcm90b2NvbCA9CisgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkpCisgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwgaW5wdXRfdHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0X3Byb3RvY29sID0KKyAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpCisgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnksIG91dHB1dF90cmFuc3BvcnQpOworCisgICAgICAgIHdoaWxlIChUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyAoc2VydmVyLT5wcm9jZXNzb3IpCisgICAgICAgICAgICAgICAtPnByb2Nlc3MgKHNlcnZlci0+cHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc19lcnJvcikgJiYKKyAgICAgICAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcGVlayAoaW5wdXRfdHJhbnNwb3J0LCAmcHJvY2Vzc19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9jZXNzX2Vycm9yICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZTogJXMiLCBwcm9jZXNzX2Vycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2NsZWFyX2Vycm9yICgmcHJvY2Vzc19lcnJvcik7CisKKyAgICAgICAgICAvKiBOb3RlIHdlIGRvIG5vdCBwcm9wYWdhdGUgcHJvY2Vzc2luZyBlcnJvcnMgdG8gdGhlIGNhbGxlciBhcyB0aGV5CisgICAgICAgICAgICogbm9ybWFsbHkgYXJlIHRyYW5zaWVudCBhbmQgbm90IGZhdGFsIHRvIHRoZSBzZXJ2ZXIgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIFRPRE86IGhhbmRsZSBleGNlcHRpb25zICovCisgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChpbnB1dF90cmFuc3BvcnQpLT5jbG9zZSAoaW5wdXRfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAob3V0cHV0X3RyYW5zcG9ydCktPmNsb3NlIChvdXRwdXRfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhdHRlbXB0IHRvIHNodXRkb3duICovCisgICAgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQpCisgICAgICAtPmNsb3NlIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIE5VTEwpOworICB9CisKKyAgLyogU2luY2UgdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gcnVuIGZvcmV2ZXIsIGl0IGNhbiBvbmx5IGV2ZXIgcmV0dXJuIG9uCisgICAqIGVycm9yICovCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFRIUklGVF9JU19TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpKTsKKyAgKFRIUklGVF9TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpKS0+cnVubmluZyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfaW5pdCAoVGhyaWZ0U2ltcGxlU2VydmVyICp0c3MpCit7CisgIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUih0c3MpOworCisgIHRzcy0+cnVubmluZyA9IEZBTFNFOworCisgIGlmIChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0KKyAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgTlVMTCk7CisgIH0KKyAgaWYgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIE5VTEwpOworICB9CisgIGlmIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPT0gTlVMTCkKKyAgeworICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIE5VTEwpOworICB9CisgIGlmIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0KKyAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgTlVMTCk7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2ltcGxlX3NlcnZlcl9jbGFzc19pbml0IChUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcyAqY2xhc3MpCit7CisgIFRocmlmdFNlcnZlckNsYXNzICpjbHMgPSBUSFJJRlRfU0VSVkVSX0NMQVNTKGNsYXNzKTsKKworICBjbHMtPnNlcnZlID0gdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmU7CisgIGNscy0+c3RvcCA9IHRocmlmdF9zaW1wbGVfc2VydmVyX3N0b3A7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI1MzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKKyNkZWZpbmUgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zaW1wbGVfc2VydmVyLmgKKyAqICBcYnJpZWYgQSBzaW1wbGUgVGhyaWZ0IHNlcnZlciwgc2luZ2xlLXRocmVhZGVkLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIgKHRocmlmdF9zaW1wbGVfc2VydmVyX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsIFRocmlmdFNpbXBsZVNlcnZlcikpCisjZGVmaW5lIFRIUklGVF9JU19TSU1QTEVfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUikpCisjZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlciBUaHJpZnRTaW1wbGVTZXJ2ZXI7CisKKy8qKgorICogVGhyaWZ0IFNpbXBsZSBTZXJ2ZXIgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyCit7CisgIFRocmlmdFNlcnZlciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICB2b2xhdGlsZSBnYm9vbGVhbiBydW5uaW5nOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzOworCisvKioKKyAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzCit7CisgIFRocmlmdFNlcnZlckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiAqLworR1R5cGUgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TSU1QTEVfU0VSVkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlODY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisKKy8qKgorICogR0hhc2hUYWJsZSBjYWxsYmFjayB0byBhZGQga2V5cyB0byBhIEdMaXN0LgorICovCit2b2lkCit0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cyAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqKmxpc3QgPSAoR0xpc3QgKiopIHVzZXJfZGF0YTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAodmFsdWUpOworCisgICpsaXN0ID0gZ19saXN0X2FwcGVuZCAoKmxpc3QsIGtleSk7Cit9Cit2b2lkIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKQoreworICBpZiAoaGFzaF90YWJsZSkKKyAgeworICAgIGdfaGFzaF90YWJsZV9kZXN0cm95KGhhc2hfdGFibGUpOworICB9Cit9CisKK2d1aW50IHRocmlmdF9ib29sZWFuX2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnYm9vbGVhbiogcCA9IHY7CisgIHJldHVybiBwICYmICpwID8gMSA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfYm9vbGVhbl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgaWYgKGEgPT0gYikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYSB8fCAhYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCBnYm9vbGVhbiogcGEgPSBhOworICBjb25zdCBnYm9vbGVhbiogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KKworZ3VpbnQgdGhyaWZ0X2ludDhfaGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdpbnQ4KiBwID0gdjsKKyAgcmV0dXJuIHAgPyAqcCA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfaW50OF9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgaWYgKGEgPT0gYikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYSB8fCAhYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCBnaW50OCogcGEgPSBhOworICBjb25zdCBnaW50OCogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KKworZ3VpbnQgdGhyaWZ0X2ludDE2X2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnaW50MTYqIHAgPSB2OworICByZXR1cm4gcCA/ICpwIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9pbnQxNl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgaWYgKGEgPT0gYikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYSB8fCAhYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCBnaW50MTYqIHBhID0gYTsKKyAgY29uc3QgZ2ludDE2KiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCit2b2lkCit0aHJpZnRfc3RyaW5nX2ZyZWUgKGdwb2ludGVyIHN0cikKK3sKKwlHQnl0ZUFycmF5KiBwdHIgPSBzdHI7CisJZ19ieXRlX2FycmF5X3VucmVmKHB0cik7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE2NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9ICisjZGVmaW5lIF9USFJJRlRfSAorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliLmg+CisKKy8qIHRoaXMgbWFjcm8gaXMgY2FsbGVkIHRvIHNhdGlzZnkgLVdhbGwgaGFyZGNvcmUgY29tcGlsYXRpb24gKi8KKyNpZm5kZWYgVEhSSUZUX1VOVVNFRF9WQVIKKyMgZGVmaW5lIFRIUklGVF9VTlVTRURfVkFSKHgpICgodm9pZCkgeCkKKyNlbmRpZgorCit2b2lkIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpOworCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfYm9vbGVhbl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworZ3VpbnQgdGhyaWZ0X2ludDE2X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQxNl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK3ZvaWQgdGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpOworCisjZW5kaWYgLyogI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRSwKKyAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0UKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24sIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24sIFRIUklGVF9UWVBFX1NUUlVDVCkKKworZ2ludDMyCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdjaGFyICpuYW1lOworICBUaHJpZnRUeXBlIGZ0eXBlOworICBnaW50MTYgZmlkOworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGhpcyA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkKKyAgeworICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisKKyAgd2hpbGUgKDEpCisgIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisKKyAgICAvKiBicmVhayBpZiB3ZSBnZXQgYSBTVE9QIGZpZWxkICovCisgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKKyAgICB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZCkKKyAgICB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChmdHlwZSA9PSBUX1NUUklORykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnRoaXMtPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICAgIHRoaXMtPl9faXNzZXRfbWVzc2FnZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGZ0eXBlID09IFRfSTMyKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdGhpcy0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgICAgdGhpcy0+X19pc3NldF90eXBlID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICAgIHJldHVybiAtMTsKKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRoaXMgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1NUUklORywgMSwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgdGhpcy0+bWVzc2FnZSwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0kzMiwgMiwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdGhpcy0+dHlwZSwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCisKKy8qIEdFcnJvciBkb21haW4gKi8KKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9ET01BSU4gInRocmlmdC1hcHBsaWNhdGlvbi1leGNlcHRpb24tZXJyb3ItcXVhcmsiCisKK0dRdWFyawordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0RPTUFJTik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0YWUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9UWVBFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGFlLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCB0YWUtPm1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRhZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEU6CisgICAgICB0YWUtPnR5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIHRhZS0+X19pc3NldF90eXBlID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0U6CisgICAgICBpZiAodGFlLT5tZXNzYWdlICE9IE5VTEwpCisgICAgICAgIGdfZnJlZSAodGFlLT5tZXNzYWdlKTsKKworICAgICAgdGFlLT5tZXNzYWdlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICB0YWUtPl9faXNzZXRfbWVzc2FnZSA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2luaXQgKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICpvYmplY3QpCit7CisgIG9iamVjdC0+dHlwZSA9IDA7CisgIG9iamVjdC0+X19pc3NldF90eXBlID0gRkFMU0U7CisgIG9iamVjdC0+bWVzc2FnZSA9IE5VTEw7CisgIG9iamVjdC0+X19pc3NldF9tZXNzYWdlID0gRkFMU0U7Cit9CisKK3ZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRhZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgaWYgKHRhZS0+X19pc3NldF9tZXNzYWdlKSB7CisJCWdfZnJlZSh0YWUtPm1lc3NhZ2UpOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fY2xhc3NfaW5pdCAoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcyAqY2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGNsYXNzKTsKKyAgVGhyaWZ0U3RydWN0Q2xhc3MgKmNscyA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xhc3MpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscy0+cmVhZCA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fcmVhZDsKKyAgY2xzLT53cml0ZSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fd3JpdGU7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiwgb25lIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIGRlZmluZWQgYnkgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtZXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gbWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXhjZXB0aW9uIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9jY3VycmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2Y3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSAorI2RlZmluZSBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgInRocmlmdF9zdHJ1Y3QuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCisgKiAgXGJyaWVmIEMgSW1wbGVtZW50YXRpb24gb2YgYSBUQXBwbGljYXRpb25FeGNlcHRpb24uCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OICh0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikpCisjZGVmaW5lIFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT04ob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04pKQorI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04pKQorI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uOworCitzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uCit7CisgIFRocmlmdFN0cnVjdCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnaW50MzIgdHlwZTsKKyAgZ2Jvb2xlYW4gX19pc3NldF90eXBlOworICBnY2hhciAqbWVzc2FnZTsKKyAgZ2Jvb2xlYW4gX19pc3NldF9tZXNzYWdlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzczsKKworc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzCit7CisgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKHZvaWQpOworCisvKiBnZXJyb3IgY29kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfQkFEX1NFUVVFTkNFX0lELAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX01JU1NJTkdfUkVTVUxULAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVEVSTkFMX0VSUk9SLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1BST1RPQ09MX0VSUk9SLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfVFJBTlNGT1JNLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfUFJPVE9DT0wsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUsCisKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OCit9IFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uRXJyb3I7CisKKy8qIGRlZmluZSBlcnJvciBkb21haW4gZm9yIEdFcnJvciAqLworR1F1YXJrIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SICh0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICgpKQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRmMmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U3RydWN0LCB0aHJpZnRfc3RydWN0LCBHX1RZUEVfT0JKRUNUKQorCitnaW50MzIKK3RocmlmdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RSVUNUIChvYmplY3QpLCAtMSk7CisgIHJldHVybiBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyAob2JqZWN0KS0+cmVhZCAob2JqZWN0LCBwcm90b2NvbCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVFJVQ1QgKG9iamVjdCksIC0xKTsKKyAgcmV0dXJuIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTIChvYmplY3QpLT53cml0ZSAob2JqZWN0LCBwcm90b2NvbCwgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0cnVjdF9jbGFzc19pbml0IChUaHJpZnRTdHJ1Y3RDbGFzcyAqY2xzKQoreworICBjbHMtPnJlYWQgPSB0aHJpZnRfc3RydWN0X3JlYWQ7CisgIGNscy0+d3JpdGUgPSB0aHJpZnRfc3RydWN0X3dyaXRlOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0cnVjdF9pbml0IChUaHJpZnRTdHJ1Y3QgKnN0cnVjdHVyZSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHN0cnVjdHVyZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2ZjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1NUUlVDVF9ICisjZGVmaW5lIFRIUklGVF9TVFJVQ1RfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBUSFJJRlRfVFlQRV9TVFJVQ1QgKHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TVFJVQ1Qob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdCkpCisjZGVmaW5lIFRIUklGVF9TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKKyNkZWZpbmUgVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0IFRocmlmdFN0cnVjdDsKKworLyogc3RydWN0ICovCitzdHJ1Y3QgX1RocmlmdFN0cnVjdAoreworICBHT2JqZWN0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MgVGhyaWZ0U3RydWN0Q2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiBwdWJsaWMgKi8KKyAgZ2ludDMyICgqcmVhZCkgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlKSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Cit9OworCitHVHlwZSB0aHJpZnRfc3RydWN0X2dldF90eXBlICh2b2lkKTsKKworZ2ludDMyIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiM2U5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKKyAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCwgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuICh0LT5yX2J1Zi0+bGVuID4gMCkgfHwgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPm9wZW4gKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5jbG9zZSAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIHRoZSBhY3R1YWwgcmVhZCBpcyAic2xvdyIgYmVjYXVzZSBpdCBjYWxscyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgKi8KK2dpbnQzMgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQzMiB3YW50ID0gbGVuOworICBndWludDMyIGdvdCA9IDA7CisgIGd1Y2hhciAqdG1wZGF0YSA9IGdfYWxsb2NhIChsZW4pOworICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOworCisgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKKworICAvKiBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLiAqLworICBpZiAoaGF2ZSA+IDApCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOworICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKKyAgfQorCisgIC8qIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudCB0byByZWFkLCB0aGVuIGp1c3QKKyAgICogcmVhZCBpdCBkaXJlY3RseS4gIG90aGVyd2lzZSwgZmlsbCB0aGUgYnVmZmVyIGFuZCB0aGVuIGdpdmUgb3V0CisgICAqIGVub3VnaCB0byBzYXRpc2Z5IHRoZSByZWFkLiAqLworICBpZiAodC0+cl9idWZfc2l6ZSA8IHdhbnQpCisgIHsKKyAgICBpZiAoKHJldCA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBnb3QgKz0gcmV0OworCisgICAgLyogY29weSB0aGUgZGF0YSBzdGFydGluZyBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmICovCisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopYnVmICsgaGF2ZSwgdG1wZGF0YSwgZ290KTsKKyAgICByZXR1cm4gZ290ICsgaGF2ZTsgCisgIH0gZWxzZSB7CisgICAgZ3VpbnQzMiBnaXZlOworCisgICAgaWYgKChyZXQgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+cmVhZCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZ290ICs9IHJldDsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPnJfYnVmLCB0bXBkYXRhLCBnb3QpOworICAgIAorICAgIC8qIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzICovCisgICAgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47CisKKworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGxlbiAtIHdhbnQsIHQtPnJfYnVmLT5kYXRhLCBnaXZlKTsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBnaXZlKTsKKyAgICB3YW50IC09IGdpdmU7CisKKyAgICByZXR1cm4gKGxlbiAtIHdhbnQpOworICB9Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKKyAgICogYSBtZW1jcHkgKi8KKyAgaWYgKGxlbiA8PSB0LT5yX2J1Zi0+bGVuKQorICB7CisgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLT5kYXRhLCBsZW4pOworICAgIGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBsZW4pOworICAgIHJldHVybiBsZW47CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiBoYXZlX2J5dGVzID0gdC0+d19idWYtPmxlbjsKKyAgZ3VpbnQzMiBzcGFjZSA9IHQtPndfYnVmX3NpemUgLSB0LT53X2J1Zi0+bGVuOworCisgIC8qIHdlIG5lZWQgdHdvIHN5c2NhbGxzIGJlY2F1c2UgdGhlIGJ1ZmZlcmVkIGRhdGEgcGx1cyB0aGUgYnVmZmVyIGl0c2VsZgorICAgKiBpcyB0b28gYmlnLiAqLworICBpZiAoKGhhdmVfYnl0ZXMgKyBsZW4gPj0gMip0LT53X2J1Zl9zaXplKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkKKyAgeworICAgIGlmIChoYXZlX2J5dGVzID4gMCkKKyAgICB7CisgICAgICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIGhhdmVfYnl0ZXMpOworICAgIH0KKyAgICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGxlbiwgZXJyb3IpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisKKyAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBzcGFjZSk7CisgIGlmICghVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKKyAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgKGd1aW50OCAqKWJ1ZiArIHNwYWNlLCBsZW4tc3BhY2UpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYnVmZmVyIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBiZWluZyByZWFkICovCisgIGlmICh0LT53X2J1Zi0+bGVuICsgbGVuIDw9IHQtPndfYnVmX3NpemUpCisgIHsKKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIHJldHVybiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIGlmICh0LT53X2J1ZiAhPSBOVUxMICYmIHQtPndfYnVmLT5sZW4gPiAwKQorICB7CisgICAgLyogd3JpdGUgdGhlIGJ1ZmZlciBhbmQgdGhlbiBlbXB0eSBpdCAqLworICAgIGlmICghVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7CisgIH0KKyAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmZsdXNoICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gTlVMTDsKKyAgdHJhbnNwb3J0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIHRyYW5zcG9ydC0+d19idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBpZiAodHJhbnNwb3J0LT5yX2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+cl9idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+cl9idWYgPSBOVUxMOworCisgIGlmICh0cmFuc3BvcnQtPndfYnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT53X2J1ZiwgVFJVRSk7CisgIH0KKyAgdHJhbnNwb3J0LT53X2J1ZiA9IE5VTEw7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPnJfYnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6CisgICAgICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT53X2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAidHJhbnNwb3J0IChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgdHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzN2Y0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaAorICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBidWZmZXJlZCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzCisgKiAgICAgICAgIHRoZSBUaHJpZnRUcmFuc3BvcnQgY2xhc3MuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQ7CisKKy8qIQorICogVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworCisgIC8qIHByaXZhdGUgKi8KKyAgR0J5dGVBcnJheSAqcl9idWY7CisgIEdCeXRlQXJyYXkgKndfYnVmOworICBndWludDMyIHJfYnVmX3NpemU7CisgIGd1aW50MzIgd19idWZfc2l6ZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA1MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKQorCisvKiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQuICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqYmFzZV9jbGFzcyA9CisgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisKKyAgYmFzZV9jbGFzcy0+Z2V0X3RyYW5zcG9ydCA9CisgICAga2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNmNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oCisgKiAgXGJyaWVmIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSAgICAgICAgICBcCisgICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qIFRocmlmdCBCdWZmZXJlZC1UcmFuc3BvcnQgRmFjdG9yeSBpbnN0YW5jZSAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3M7CisKKy8qIFRocmlmdCBCdWZmZXJlZC1UcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBUaHJpZnRUcmFuc3BvcnQgKigqZ2V0X3RyYW5zcG9ydCkgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWJmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0RkRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZECit9OworCitHX0RFRklORV9UWVBFIChUaHJpZnRGRFRyYW5zcG9ydCwgdGhyaWZ0X2ZkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIHQtPmZkID49IDAgJiYgISAoZmNudGwgKHQtPmZkLCBGX0dFVEZMKSA9PSAtMSAmJiBlcnJubyA9PSBFQkFERik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisjaWYgR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkKKyAgcmV0dXJuIGdfY2xvc2UgKHQtPmZkLCBlcnJvcik7CisjZWxzZQorICBpZiAoY2xvc2UgKHQtPmZkKSA9PSAwKSB7CisgICAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRSwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBzc2l6ZV90IG47CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIG4gPSByZWFkICh0LT5mZCwgKGd1aW50OCAqKSBidWYsIGxlbik7CisgIGlmIChuID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gbjsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIGd1aW50OCAqX2J1ZjsKKyAgZ3VpbnQzMiBfbGVuOworICBzc2l6ZV90IG47CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIF9idWYgPSAoZ3VpbnQ4ICopIGJ1ZjsKKyAgX2xlbiA9IGxlbjsKKyAgd2hpbGUgKF9sZW4gPiAwKSB7CisgICAgbiA9IHdyaXRlICh0LT5mZCwgX2J1ZiwgX2xlbik7CisgICAgaWYgKG4gPT0gLTEpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIGZyb20gZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgX2J1ZiArPSBuOworICAgICAgX2xlbiAtPSBuOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgaWYgKGZzeW5jICh0LT5mZCkgPT0gLTEpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmbHVzaCBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRGRFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPmZkID0gLTE7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdC0+ZmQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZEOgorICAgICAgdC0+ZmQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImZkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGRlc2NyaXB0b3IgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgZmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NSU4sIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9GRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIENsYXNzIGZvciBUaHJpZnQgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydHMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUICh0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19GRF9UUkFOU1BPUlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GRF9UUkFOU1BPUlRfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0IFRocmlmdEZEVHJhbnNwb3J0OworCitzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQgZmQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcyBUaHJpZnRGRFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfRkRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDgyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKKyAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRGcmFtZWRUcmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmlzX29wZW4gKHQtPnRyYW5zcG9ydCk7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gKHQtPnJfYnVmLT5sZW4gPiAwKSB8fCB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+b3BlbiAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmNsb3NlICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogcmVhZHMgYSBmcmFtZSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBidWZmZXIgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2ZyYW1lIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiBzejsKKyAgZ2ludDMyIGJ5dGVzOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICAvKiByZWFkIHRoZSBzaXplICovCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN6KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpID09IHNpemVvZiAoc3opKQorICB7CisgICAgZ3VjaGFyICp0bXBkYXRhOworCisgICAgc3ogPSBudG9obCAoc3opOworCisgICAgLyogY3JlYXRlIGEgYnVmZmVyIHRvIGhvbGQgdGhlIGRhdGEgYW5kIHJlYWQgdGhhdCBtdWNoIGRhdGEgKi8KKyAgICB0bXBkYXRhID0gZ19hbGxvY2EgKHN6KTsKKyAgICBieXRlcyA9IHRocmlmdF90cmFuc3BvcnRfcmVhZCAodC0+dHJhbnNwb3J0LCB0bXBkYXRhLCBzeiwgZXJyb3IpOworCisgICAgaWYgKGJ5dGVzID4gMCAmJiAoZXJyb3IgPT0gTlVMTCB8fCAqZXJyb3IgPT0gTlVMTCkpCisgICAgeworICAgICAgLyogYWRkIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgIGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPnJfYnVmLCB0bXBkYXRhLCBieXRlcyk7CisKKyAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogdGhlIGFjdHVhbCByZWFkIGlzICJzbG93IiBiZWNhdXNlIGl0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCAqLworZ2ludDMyCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgd2FudCA9IGxlbjsKKyAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKKyAgZ2ludDMyIHJlc3VsdCA9IC0xOworCisgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKKworICAvKiBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLCBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0ICovCisgIGlmIChoYXZlID4gMCkKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1ZiwgdC0+cl9idWYtPmxlbik7CisgICAgd2FudCAtPSB0LT5yX2J1Zi0+bGVuOworICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIHQtPnJfYnVmLT5sZW4pOworICB9CisKKyAgLyogcmVhZCBhIGZyYW1lIG9mIGlucHV0IGFuZCBidWZmZXIgaXQgKi8KKyAgaWYgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKHRyYW5zcG9ydCwgZXJyb3IpID09IFRSVUUpCisgIHsKKyAgICAvKiBoYW5kIG92ZXIgd2hhdCB3ZSBoYXZlIHVwIHRvIHdoYXQgdGhlIGNhbGxlciB3YW50cyAqLworICAgIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47CisKKyAgICAvKiBjb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciAqLworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGxlbiAtIHdhbnQsIHQtPnJfYnVmLT5kYXRhLCBnaXZlKTsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBnaXZlKTsKKyAgICB3YW50IC09IGdpdmU7CisKKyAgICByZXN1bHQgPSBsZW4gLSB3YW50OworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKKyAgICogYSBtZW1jcHkgZnJvbSB0aGUgYnVmZmVyICovCisgIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKKyAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIGFwcGVuZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVyIGFuZCB3ZSdyZSBkb25lICovCisgIGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYnVmZmVyIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBiZWluZyByZWFkICovCisgIGlmICh0LT53X2J1Zi0+bGVuICsgbGVuIDw9IHQtPndfYnVmX3NpemUpCisgIHsKKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBnaW50MzIgc3pfaGJvLCBzel9uYm87CisgIGd1Y2hhciAqdG1wZGF0YTsKKworICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGluIGhvc3QgYW5kIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworICBzel9oYm8gPSB0LT53X2J1Zi0+bGVuICsgc2l6ZW9mKHN6X25ibyk7CisgIHN6X25ibyA9IChnaW50MzIpIGh0b25sICgoZ3VpbnQzMikgdC0+d19idWYtPmxlbik7CisKKyAgLyogY29weSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgYW5kIHRoZW4gdGhlIGZyYW1lIGl0c2VsZiAqLworICB0bXBkYXRhID0gZ19hbGxvY2EgKHN6X2hibyk7CisgIG1lbWNweSAodG1wZGF0YSwgKGd1aW50OCAqKSAmc3pfbmJvLCBzaXplb2YgKHN6X25ibykpOworCisgIGlmICh0LT53X2J1Zi0+bGVuID4gMCkKKyAgeworICAgIG1lbWNweSAodG1wZGF0YSArIHNpemVvZiAoc3pfbmJvKSwgdC0+d19idWYtPmRhdGEsIHQtPndfYnVmLT5sZW4pOworICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOworICB9CisgICAgCisgIC8qIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQgKi8KKyAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwgc3pfaGJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IE5VTEw7CisgIHRyYW5zcG9ydC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB0cmFuc3BvcnQtPndfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+cl9idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPnJfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPnJfYnVmID0gTlVMTDsKKworICBpZiAodHJhbnNwb3J0LT53X2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+d19idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+d19idWYgPSBOVUxMOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5yX2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPndfYnVmX3NpemUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT5yX2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT53X2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgInRyYW5zcG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IHRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicl9idWZfc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMDEyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaAorICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBmcmFtZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcworICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydCBUaHJpZnRGcmFtZWRUcmFuc3BvcnQ7CisKKy8qIQorICogVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKworICAvKiBwcml2YXRlICovCisgIEdCeXRlQXJyYXkgKnJfYnVmOworICBHQnl0ZUFycmF5ICp3X2J1ZjsKKyAgZ3VpbnQzMiByX2J1Zl9zaXplOworICBndWludDMyIHdfYnVmX3NpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhmZTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpCisKKy8qIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQuICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworCisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmJhc2VfY2xhc3MgPQorICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworCisgIGJhc2VfY2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIGtsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQ7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlOTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKKyAqICBcYnJpZWYgV3JhcHMgYSB0cmFuc3BvcnQgd2l0aCBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkgICAgXAorICAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qIFRocmlmdCBGcmFtZWQtVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KK3N0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzOworCisvKiBUaHJpZnQgRnJhbWVkLVRyYW5zcG9ydCBGYWN0b3J5IGNsYXNzICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBUaHJpZnRUcmFuc3BvcnQgKigqZ2V0X3RyYW5zcG9ydCkgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTgxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdE1lbW9yeUJ1ZmZlclByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUgorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRNZW1vcnlCdWZmZXIsIHRocmlmdF9tZW1vcnlfYnVmZmVyLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiBnaXZlID0gbGVuOyAKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIGlmIHRoZSByZXF1ZXN0ZWQgYnl0ZXMgYXJlIG1vcmUgdGhhbiB3aGF0IHdlIGhhdmUgYXZhaWxhYmxlLAorICAgKiBqdXN0IGdpdmUgYWxsIHRoYXQgd2UgaGF2ZSB0aGUgYnVmZmVyICovCisgIGlmICh0LT5idWYtPmxlbiA8IGxlbikKKyAgeworICAgIGdpdmUgPSB0LT5idWYtPmxlbjsKKyAgfQorCisgIG1lbWNweSAoYnVmLCB0LT5idWYtPmRhdGEsIGdpdmUpOworICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5idWYsIDAsIGdpdmUpOworCisgIHJldHVybiBnaXZlOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSICh0cmFuc3BvcnQpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgLyogcmV0dXJuIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhY2UuICovCisgIGlmIChsZW4gPiB0LT5idWZfc2l6ZSAtIHQtPmJ1Zi0+bGVuKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gd3JpdGUgJWQgYnl0ZXMgdG8gYnVmZmVyIG9mIGxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICAgIGxlbiwgdC0+YnVmX3NpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICB0LT5idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5idWYsIGJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyBjbGFzcyBiZWZvcmUgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyICp0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodCk7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBpZiAodC0+b3duZXIgJiYgdC0+YnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfdW5yZWYgKHQtPmJ1Zik7CisgIH0KKyAgdC0+YnVmID0gTlVMTDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0LT5idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSOgorICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIChncG9pbnRlcikgKHQtPmJ1ZikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHQtPm93bmVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKKyAgICAgIHQtPmJ1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIHQtPmJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSOgorICAgICAgdC0+b3duZXIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyBjbGFzcyBhZnRlciBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGFyZSBzZXQgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jb25zdHJ1Y3RlZCAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBpZiAodC0+YnVmID09IE5VTEwpIHsKKyAgICB0LT5idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmplY3QpOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzc19pbml0IChUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZC93cml0ZSBidWZmZXIgc2l6ZSBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhVSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYVUlOVDMyLCAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJidWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBidWZmZXIgKEdCeXRlQXJyYXkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBpbnRlcm5hbCBidWZmZXIgKEdCeXRlQXJyYXkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJvd25lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGJ1ZmZlciBtZW1vcnkgbWFuYWdlbWVudCBwb2xpY3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgd2hldGhlciBpbnRlcm5hbCBidWZmZXIgc2hvdWxkIGJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB1bnJlZmVyZW5jZWQgd2hlbiB0aHJpZnRfbWVtb3J5X2J1ZmZlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgZmluYWxpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+Y29uc3RydWN0ZWQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jb25zdHJ1Y3RlZDsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbjsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX01FTU9SWV9CVUZGRVJfSAorI2RlZmluZSBfVEhSSUZUX01FTU9SWV9CVUZGRVJfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9tZW1vcnlfYnVmZmVyLmgKKyAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgbWVtb3J5IGJ1ZmZlciB0cmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiAodGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01FTU9SWV9CVUZGRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSKSkKKyNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01FTU9SWV9CVUZGRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIpCisjZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyIFRocmlmdE1lbW9yeUJ1ZmZlcjsKKworLyohCisgKiBUaHJpZnRNZW1vcnlCdWZmZXIgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyCit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBHQnl0ZUFycmF5ICpidWY7CisgIGd1aW50MzIgYnVmX3NpemU7CisgIGdib29sZWFuIG93bmVyOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlckNsYXNzIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzOworCisvKiEKKyAqIFRocmlmdE1lbW9yeUJ1ZmZlciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIgKi8KK0dUeXBlIHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBjbGFuZy1mb3JtYXQgb2ZmICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA6OldTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PICgqX2Vycm5vKCkpCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiBXU0FFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gV1NBRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUIFdTQUVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FUElQRSBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX0VYQ0xVU0lWRUFERFJVU0UKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgSU5WQUxJRF9TT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiB0aHJpZnRfc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCB0aHJpZnRfZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyAxCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgMAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIDEKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIHRocmlmdF9nZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2Vzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgX2Nsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gX29wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIF9jaHNpemVfcworIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBfY29tbWl0CisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAorIyAgaWZkZWYgX1dJTjMyX1dDRQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiguLi4pIHRocmlmdF93c3RyMnN0cihnYWlfc3RyZXJyb3JXKF9fVkFfQVJHU19fKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yQQorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHB0cmRpZmZfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBfc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHRocmlmdF9zbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHRocmlmdF91c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGhyaWZ0X3RpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgdGhyaWZ0X2N0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCB0aHJpZnRfcG9sbAorIyAgaWYgV0lOVkVSIDw9IDB4MDUwMiAvKiBYUCwgU2VydmVyMjAwMyAqLworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgdGhyaWZ0X3BvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgMHgwMzAwCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCAweDAwMTAKKyMgIGVsc2UgLyogVmlzdGEsIFdpbjcuLi4gKi8KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBlbmRpZiAvKiBXSU5WRVIgKi8KKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyNlbHNlIC8qIG5vdCBfV0lOMzIgKi8KKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgICAgICAgRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCAgRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiAgICBFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgICBFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOICAgICAgRUFHQUlOCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFICAgICAgIEVQSVBFCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX1JFVVNFQUREUgorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCBmY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIE9fTk9OQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCBGX0dFVEZMCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgRl9TRVRGTAorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgZnRydW5jYXRlCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIGZzeW5jCisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIGxzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIHdyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgcmVhZAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIHN0YXQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvcgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgc3NpemVfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB1c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiBjdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgcG9sbAorIyAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNIVVRfUkRXUgorI2VuZGlmCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTg5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTZXJ2ZXJTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULAorICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0cKK307CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOICJ0aHJpZnQtc2VydmVyLXNvY2tldC1lcnJvci1xdWFyayIKKworR19ERUZJTkVfVFlQRShUaHJpZnRTZXJ2ZXJTb2NrZXQsIHRocmlmdF9zZXJ2ZXJfc29ja2V0LCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl9zb2NrZXRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGludCBlbmFibGVkID0gMTsgLyogZm9yIHNldHNvY2tvcHQoKSAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICAvKiBjcmVhdGUgYSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKKyAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBwaW4uc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnModHNvY2tldC0+cG9ydCk7CisKKyAgLyogY3JlYXRlIGEgc29ja2V0ICovCisgIGlmICgodHNvY2tldC0+c2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCAtICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNldHNvY2tvcHQodHNvY2tldC0+c2QsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJmVuYWJsZWQsCisgICAgICAgICAgICAgICAgIHNpemVvZihlbmFibGVkKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TRVRTT0NLT1BULAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHNldCBTT19SRVVTRUFERFIgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogYmluZCB0byB0aGUgc29ja2V0ICovCisgIGlmIChiaW5kKHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0JJTkQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYmluZCB0byBwb3J0ICVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChsaXN0ZW4odHNvY2tldC0+c2QsIHRzb2NrZXQtPmJhY2tsb2cpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfTElTVEVOLAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGxpc3RlbiB0byBwb3J0ICVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X3NlcnZlcl9zb2NrZXRfYWNjZXB0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGludCBzZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgZ3VpbnQgYWRkcmxlbiA9IDA7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyZXNzOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IE5VTEw7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKChzZCA9IGFjY2VwdCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgJmFkZHJsZW4pKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbiAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7CisgIHNvY2tldC0+c2QgPSBzZDsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVChzb2NrZXQpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2UgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKGNsb3NlICh0c29ja2V0LT5zZCkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRSwKKyAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHRzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gKi8KK0dRdWFyawordGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyhUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9ET01BSU4pOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCkKK3sKKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKG9iamVjdCk7CisKKyAgaWYgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKQorICB7CisgICAgY2xvc2UgKHNvY2tldC0+c2QpOworICB9CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0c6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5iYWNrbG9nKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JUOgorICAgICAgc29ja2V0LT5wb3J0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0c6CisgICAgICBzb2NrZXQtPmJhY2tsb2cgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyAqY2xzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqdHN0YyA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCB0byBsaXN0ZW4gdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYmFja2xvZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tsb2cgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGFjY2VwdCBiYWNrbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNCwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2ZpbmFsaXplOworCisgIHRzdGMtPmxpc3RlbiA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2xpc3RlbjsKKyAgdHN0Yy0+YWNjZXB0ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfYWNjZXB0OworICB0c3RjLT5jbG9zZSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2Nsb3NlOworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA0OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3NvY2tldC5oCisgKiAgXGJyaWVmIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0LiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQgKHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQgVGhyaWZ0U2VydmVyU29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXJTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Cit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBndWludCBwb3J0OworICBnc2hvcnQgYmFja2xvZzsKKyAgaW50IHNkOworICBndWludDggKmJ1ZjsKKyAgZ3VpbnQzMiBidWZfc2l6ZTsKKyAgZ3VpbnQzMiBidWZfbGVuOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldENsYXNzIFRocmlmdFNlcnZlclNvY2tldENsYXNzOworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXJTb2NrZXQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TT0NLRVQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0JJTkQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBULAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRQorfSBUaHJpZnRTZXJ2ZXJTb2NrZXRFcnJvcjsKKworLyogZGVmaW5lIGEgZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCitHUXVhcmsgdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiAodGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKCkpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1ZDEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQsIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LCBHX1RZUEVfT0JKRUNUKQorCisvKiBiYXNlIGluaXRpYWxpemVyIGZvciB0aGUgc2VydmVyIHRyYW5zcG9ydCBpbnRlcmZhY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqYykKK3sKKyAgYy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuOworICBjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQ7CisgIGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xvc2U7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9pbml0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+bGlzdGVuICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmFjY2VwdCAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE5MTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUICh0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0IFRocmlmdFNlcnZlclRyYW5zcG9ydDsKKworc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFRyYW5zcG9ydCBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqbGlzdGVuKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmFjY2VwdCkgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogTGlzdGVuIGZvciBuZXcgY29ubmVjdGlvbnMuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQWNjZXB0IGEgY29ubmVjdGlvbi4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCisgKi8KK1RocmlmdFRyYW5zcG9ydCAqdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0CisgICAgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDBmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U29ja2V0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRSwKKyAgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U29ja2V0LCB0aHJpZnRfc29ja2V0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICByZXR1cm4gc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gRkFMU0U7CisgIGd1aW50OCBidWY7CisgIGludCByOworICBpbnQgZXJybm9fY29weTsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSkKKyAgeworICAgIHIgPSByZWN2IChzb2NrZXQtPnNkLCAmYnVmLCAxLCBNU0dfUEVFSyk7CisgICAgaWYgKHIgPT0gLTEpCisgICAgeworICAgICAgZXJybm9fY29weSA9IGVycm5vOworCisgICAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCisgICAgICAvKiBGcmVlQlNEIHJldHVybnMgLTEgYW5kIEVDT05OUkVTRVQgaWYgdGhlIHNvY2tldCB3YXMgY2xvc2VkIGJ5IHRoZSBvdGhlcgorICAgICAgICAgc2lkZSAqLworICAgICAgaWYgKGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCkKKyAgICAgIHsKKyAgICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBlcnJvcik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAjZW5kaWYKKworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBwZWVrIGF0IHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm9fY29weSkpOworCisgICAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCisgICAgICB9CisgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAociA+IDApCisgICAgeworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBpbnQgZXJyOworI2lmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIHN0cnVjdCBob3N0ZW50IGhlOworICBjaGFyIGJ1ZlsxMDI0XTsKKyNlbmRpZgorCisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0c29ja2V0LT5zZCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQsIEZBTFNFKTsKKworICAvKiBsb29rdXAgdGhlIGRlc3RpbmF0aW9uIGhvc3QgKi8KKyNpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yICh0c29ja2V0LT5ob3N0bmFtZSwgJmhlLCBidWYsIDEwMjQsICZocCwgJmVycikgIT0gMCB8fCBocCA9PSBOVUxMKQorI2Vsc2UKKyAgaWYgKChocCA9IGdldGhvc3RieW5hbWUgKHRzb2NrZXQtPmhvc3RuYW1lKSkgPT0gTlVMTCAmJiAoZXJyID0gaF9lcnJubykpCisjZW5kaWYKKyAgeworICAgIC8qIGhvc3QgbG9va3VwIGZhaWxlZCwgYmFpbCBvdXQgd2l0aCBhbiBlcnJvciAqLworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAorICAgICAgICAgICAgICAgICAiaG9zdCBsb29rdXAgZmFpbGVkIGZvciAlczolZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsCisgICAgICAgICAgICAgICAgIGhzdHJlcnJvciAoZXJyKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLworICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKKyAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBwaW4uc2luX2FkZHIuc19hZGRyID0gKChzdHJ1Y3QgaW5fYWRkciAqKSAoaHAtPmhfYWRkcl9saXN0WzBdKSktPnNfYWRkcjsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMgKHRzb2NrZXQtPnBvcnQpOworCisgIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCisgIGlmICgodHNvY2tldC0+c2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJXM6JWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCisgIGlmIChjb25uZWN0ICh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCisgIHsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UodHNvY2tldCwgTlVMTCk7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb25uZWN0IHRvIGhvc3QgJXM6JWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9zb2NrZXRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBnaW50IHJldCA9IDA7CisgIGd1aW50IGdvdCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIHdoaWxlIChnb3QgPCBsZW4pCisgIHsKKyAgICByZXQgPSByZWN2IChzb2NrZXQtPnNkLCAoZ3VpbnQ4ICopYnVmICsgZ290LCBsZW4tZ290LCAwKTsKKyAgICBpZiAocmV0IDw9IDApCisgICAgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKKyAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgLSAlcyIsIGxlbiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZ290ICs9IHJldDsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCwgRkFMU0UpOworCisgIHdoaWxlIChzZW50IDwgbGVuKQorICB7CisgICAgcmV0ID0gc2VuZCAoc29ja2V0LT5zZCwgKGd1aW50OCAqKWJ1ZiArIHNlbnQsIGxlbiAtIHNlbnQsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZW5kICVkIGJ5dGVzIC0gJXMiLCBsZW4sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHNlbnQgKz0gcmV0OworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2gKKyAqIGZsdXNoIHBlbmRpbmcgZGF0YS4gIHNpbmNlIHdlIGFyZSBub3QgYnVmZmVyZWQsIHRoaXMgaXMgYSBuby1vcCAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfaW5pdCAoVGhyaWZ0U29ja2V0ICpzb2NrZXQpCit7CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKKworICBpZiAoc29ja2V0LT5ob3N0bmFtZSAhPSBOVUxMKQorICB7CisgICAgZ19mcmVlIChzb2NrZXQtPmhvc3RuYW1lKTsKKyAgfQorICBzb2NrZXQtPmhvc3RuYW1lID0gTlVMTDsKKworICBpZiAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpCisgIHsKKyAgICBjbG9zZSAoc29ja2V0LT5zZCk7CisgIH0KKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb2NrZXQtPmhvc3RuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6CisgICAgICBpZiAoc29ja2V0LT5ob3N0bmFtZSkgeworICAgICAgICBnX2ZyZWUoc29ja2V0LT5ob3N0bmFtZSk7CisgICAgICB9CisgICAgICBzb2NrZXQtPmhvc3RuYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6CisgICAgICBzb2NrZXQtPnBvcnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNvY2tldENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19zdHJpbmcgKCJob3N0bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgaG9zdG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbGhvc3QiLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCBvZiB0aGUgcmVtb3RlIGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNXUsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NvY2tldF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NvY2tldF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfc29ja2V0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9zb2NrZXRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9zb2NrZXRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9zb2NrZXRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9zb2NrZXRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfc29ja2V0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9zb2NrZXRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X3NvY2tldF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZmNjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU09DS0VUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zb2NrZXQuaAorICogIFxicmllZiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcyB0aGUKKyAqICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NPQ0tFVCAodGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU09DS0VULCBUaHJpZnRTb2NrZXRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTb2NrZXQgVGhyaWZ0U29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U29ja2V0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqaG9zdG5hbWU7CisgIGd1aW50IHBvcnQ7CisgIGludCBzZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcyBUaHJpZnRTb2NrZXRDbGFzczsKKworLyohCisgKiBUaHJpZnQgU29ja2V0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc29ja2V0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTU1NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYwpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgorCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorI2RlZmluZSBNVVRFWF9UWVBFICAgICAgICAgICAgSEFORExFCisjZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICAoeCkgPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCkKKyNkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KSAgICAgIENsb3NlSGFuZGxlKHgpCisjZGVmaW5lIE1VVEVYX0xPQ0soeCkgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCh4KSwgSU5GSU5JVEUpCisjZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICBSZWxlYXNlTXV0ZXgoeCkKKyNlbHNlCisjZGVmaW5lIE1VVEVYX1RZUEUgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QKKyNkZWZpbmUgTVVURVhfU0VUVVAoeCkgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmKHgpLCBOVUxMKQorI2RlZmluZSBNVVRFWF9DTEVBTlVQKHgpICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCYoeCkpCisjZGVmaW5lIE1VVEVYX0xPQ0soeCkgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJih4KSkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKHgpICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoeCkpCisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEIDB4MTAwMDAwMDBMCisKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNTTFNvY2tldFByb3BlcnRpZXMKK3sKKyAgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUID0gMywKKyAgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVECit9OworCisvKiBUbyBob2xkIGEgZ2xvYmFsIHN0YXRlIG1hbmFnZW1lbnQgb2Ygb3BlbnNzbCBmb3IgYWxsIGluc3RhbmNlcyAqLworc3RhdGljIGdib29sZWFuIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQ9RkFMU0U7CisvKiBUaGlzIGFycmF5IHdpbGwgc3RvcmUgYWxsIG9mIHRoZSBtdXRleGVzIGF2YWlsYWJsZSB0byBPcGVuU1NMLiAqLworc3RhdGljIE1VVEVYX1RZUEUgKnRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWY9TlVMTDsKKworCisvKioKKyAqIE9wZW5TU0wgdW5pcSBpZCBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuICAgIHRocmVhZCBpZAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfaWRfZnVuY3Rpb24odm9pZCkKK3sKKyNpZiBkZWZpbmVkKFdJTjMyKQorICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CisjZWxzZQorICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYoKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBpZiAobW9kZSAmIENSWVBUT19MT0NLKQorICAgIE1VVEVYX0xPQ0sodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltuXSk7CisgIGVsc2UKKyAgICBNVVRFWF9VTkxPQ0sodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltuXSk7Cit9CisKK3N0YXRpYyBpbnQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9zZXR1cCh2b2lkKQoreworICBpbnQgaTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmID0gbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihNVVRFWF9UWVBFKSk7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChpID0gMDsgIGkgPCBDUllQVE9fbnVtX2xvY2tzKCAgKTsgIGkrKykKKyAgICBNVVRFWF9TRVRVUCh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW2ldKTsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfaWRfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2xvY2tpbmdfY2FsbGJhY2spOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX2NsZWFudXAodm9pZCkKK3sKKyAgaW50IGk7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZikKKyAgICByZXR1cm4gMDsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBmb3IgKGkgPSAwOyAgaSA8IENSWVBUT19udW1fbG9ja3MoICApOyAgaSsrKQorICAgIE1VVEVYX0NMRUFOVVAodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltpXSk7CisgIGZyZWUodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1Zik7CisgIHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYgPSBOVUxMOworICByZXR1cm4gMTsKK30KKworLyoKK3N0YXRpYyB2b2lkKiB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jcmVhdGVfY2FsbGJhY2soY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgZ19wcmludCgiV2Ugc2hvdWxkIGNyZWF0ZSBhIGxvY2tcbiIpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY2FsbGJhY2soaW50IG1vZGUsIHZvaWQqIGxvY2ssIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGlmIChsb2NrICE9IE5VTEwpIHsKKyAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICBnX3ByaW50ZigiV2Ugc2hvdWxkIGxvY2sgdGhyZWFkICVkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZ19wcmludGYoIldlIHNob3VsZCB1bmxvY2sgdGhyZWFkICVkXG4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfZGVzdHJveV9jYWxsYmFjayh2b2lkKiBsb2NrLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBnX3ByaW50ZigiV2UgbXVzdCBkZXN0cm95IHRoZSBsb2NrXG4iKTsKK30KKyAqLworCisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U1NMU29ja2V0LCB0aHJpZnRfc3NsX3NvY2tldCwgVEhSSUZUX1RZUEVfU09DS0VUKQorCisKKworLyoqCisgKiBXaGVuIHRoZXJlJ3MgYSB0aHJlYWQgY29udGV4dCBhdHRhY2hlZCwgd2UgcGFzcyB0aGUgU1NMIHNvY2tldCBjb250ZXh0IHNvIGl0CisgKiBjYW4gY2hlY2sgaWYgdGhlIGVycm9yIGlzIG91dHNpZGUgU1NMLCBvbiBJL08gZm9yIGV4YW1wbGUKKyAqIEBwYXJhbSBzb2NrZXQKKyAqIEBwYXJhbSBlcnJvcl9tc2cKKyAqIEBwYXJhbSB0aHJpZnRfZXJyb3Jfbm8KKyAqIEBwYXJhbSBzc2xfZXJyb3IKKyAqIEBwYXJhbSBlcnJvcgorICovCitzdGF0aWMKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCwgY29uc3QgZ3VjaGFyICplcnJvcl9tc2csIGd1aW50IHRocmlmdF9lcnJvcl9ubywgaW50IHNzbF9lcnJvciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKyAgY2hhciBidWZmZXJbMTAyNF07CisgIGludCBidWZmZXJfc2l6ZT0xMDI0OworICBnYm9vbGVhbiBmaXJzdF9lcnJvciA9IFRSVUU7CisgIGludCBzc2xfZXJyb3JfdHlwZSA9IFNTTF9nZXRfZXJyb3Ioc29ja2V0LT5zc2wsIHNzbF9lcnJvcik7CisgIGlmKHNzbF9lcnJvcl90eXBlPjApeworICAgICAgc3dpdGNoKHNzbF9lcnJvcl90eXBlKXsKKwljYXNlIFNTTF9FUlJPUl9TU0w6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIlNTTCAlczogIiwgZXJyb3JfbXNnKTsKKwkgIHdoaWxlICgoZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCAmJiBidWZmZXJfc2l6ZT4xKSB7CisJICAgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JfY29kZSk7CisJICAgICAgaWYocmVhc29uIT1OVUxMKXsKKwkJICBpZighZmlyc3RfZXJyb3IpIHsKKwkJICAgICAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiXG5cdCIpOworCQkgICAgICBmaXJzdF9lcnJvcj1GQUxTRTsKKwkJICB9CisJCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYKCVzKSAtPiAlcyIsIGVycm9yX2NvZGUsIHJlYXNvbiwgU1NMX3N0YXRlX3N0cmluZyhzb2NrZXQtPnNzbCkpOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiVzOiAiLCBlcnJvcl9tc2cpOworCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYIC0+ICVzIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiVzOiAiLCBlcnJvcl9tc2cpOworCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYIC0+ICVzIiwgc3NsX2Vycm9yX3R5cGUsICJFcnJvciB3aGlsZSByZWFkaW5nIGZyb20gdW5kZXJsYXlpbmcgbGF5ZXIiKTsKKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiVzOiAiLCBlcnJvcl9tc2cpOworCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYIC0+ICVzIiwgc3NsX2Vycm9yX3R5cGUsICJFcnJvciB3aGlsZSB3cml0dGluZyB0byB1bmRlcmxheWluZyBsYXllciIpOworCSAgYnJlYWs7CisKKyAgICAgIH0KKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgdGhyaWZ0X2Vycm9yX25vLCAiJXMiLCBidWZmZXIpOworICB9Cit9CisKKy8qKgorICogRm9yIGdsb2JhbCBTU0wgZXJyb3JzCisgKiBAcGFyYW0gZXJyb3JfbXNnCisgKiBAcGFyYW0gdGhyaWZ0X2Vycm9yX25vCisgKiBAcGFyYW0gZXJyb3IKKyAqLworc3RhdGljCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2dldF9lcnJvcihjb25zdCBndWNoYXIgKmVycm9yX21zZywgZ3VpbnQgdGhyaWZ0X2Vycm9yX25vLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworICB3aGlsZSAoKGVycm9yX2NvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yX2NvZGUpOworICAgICAgaWYgKHJlYXNvbiA9PSBOVUxMKSB7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICB0aHJpZnRfZXJyb3Jfbm8sCisJCSAgICAgICAiU1NMIGVycm9yICVsWDogJXMiLCBlcnJvcl9jb2RlLCBlcnJvcl9tc2cpOworICAgICAgfWVsc2V7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICB0aHJpZnRfZXJyb3Jfbm8sCisJCSAgICAgICAiU1NMIGVycm9yICVsWCAlczogJXMiLCBlcnJvcl9jb2RlLHJlYXNvbiwgZXJyb3JfbXNnKTsKKyAgICAgIH0KKyAgfQorfQorCisKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRocmlmdF9zb2NrZXRfaXNfb3Blbih0cmFuc3BvcnQpOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGlmICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIGludCByYzsKKyAgICAgIGdjaGFyIGJ5dGU7CisgICAgICByYyA9IFNTTF9wZWVrKHNzbF9zb2NrZXQtPnNzbCwgJmJ5dGUsIDEpOworICAgICAgaWYgKHJjIDwgMCkgeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiQ2hlY2sgc29ja2V0IGRhdGEiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgcmMsIGVycm9yKTsKKyAgICAgIH0KKyAgICAgIGlmIChyYyA9PSAwKSB7CisJICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIH0KKyAgICAgIHJldHZhbCA9IChyYyA+IDApOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGlmICghdGhyaWZ0X3NvY2tldF9vcGVuKHRyYW5zcG9ydCwgZXJyb3IpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIVRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyh0cmFuc3BvcnQpLT5oYW5kbGVfaGFuZHNoYWtlKHRyYW5zcG9ydCwgZXJyb3IpKSB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCh0cmFuc3BvcnQpOworICBpZihzc2xfc29ja2V0IT1OVUxMICYmIHNzbF9zb2NrZXQtPnNzbCkgeworICAgICAgaW50IHJjID0gU1NMX3NodXRkb3duKHNzbF9zb2NrZXQtPnNzbCk7CisvKiAgICAgIGlmIChyYyA8IDApIHsKKwkgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMOworICAgICAgfSovCisgICAgICBTU0xfZnJlZShzc2xfc29ja2V0LT5zc2wpOworICAgICAgc3NsX3NvY2tldC0+c3NsID0gTlVMTDsKKyAgICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyAgcmV0dXJuIHRocmlmdF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9zc2xfc29ja2V0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisJCQlndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50IG1heFJlY3ZSZXRyaWVzXyA9IDEwOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQgYnl0ZXMgPSAwOworICBndWludCByZXRyaWVzID0gMDsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgZm9yIChyZXRyaWVzPTA7IHJldHJpZXMgPCBtYXhSZWN2UmV0cmllc187IHJldHJpZXMrKykgeworICAgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfc29ja2V0LT5zc2wsIGJ1ZiwgbGVuKTsKKyAgICAgIGlmIChieXRlcyA+PSAwKQorCWJyZWFrOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF9zb2NrZXQtPnNzbCwgYnl0ZXMpID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7CisJICBpZiAoRVJSX2dldF9lcnJvcigpID09IDAgJiYgZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIpIHsKKwkgICAgICBjb250aW51ZTsKKwkgIH0KKyAgICAgIH1lbHNleworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiUmVjZWl2ZSBlcnJvciIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCBieXRlcywgZXJyb3IpOworCisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKwkJCSBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBnaW50IHJldCA9IDA7CisgIGd1aW50IHNlbnQgPSAwOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICB3aGlsZSAoc2VudCA8IGxlbikKKyAgICB7CisgICAgICByZXQgPSBTU0xfd3JpdGUgKHNzbF9zb2NrZXQtPnNzbCwgKGd1aW50OCAqKWJ1ZiArIHNlbnQsIGxlbiAtIHNlbnQpOworICAgICAgaWYgKHJldCA8IDApCisJeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiU2VuZCBlcnJvciIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCByZXQsIGVycm9yKTsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisgICAgICBzZW50ICs9IHJldDsKKyAgICB9CisKKyAgcmV0dXJuIHNlbnQ9PWxlbjsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2gKKyAqIGZsdXNoIHBlbmRpbmcgZGF0YS4gIHNpbmNlIHdlIGFyZSBub3QgYnVmZmVyZWQsIHRoaXMgaXMgYSBuby1vcCAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBnaW50IHJldCA9IDA7CisgIGd1aW50IHNlbnQgPSAwOworCisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIEJJTyogYmlvID0gU1NMX2dldF93YmlvKHNzbF9zb2NrZXQtPnNzbCk7CisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisJCSAgICJmYWlsZWQgdG8gZmx1c2gsIHdiaW8gcmV0dXJuZWQgbnVsbCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChCSU9fZmx1c2goYmlvKSAhPSAxKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKwkJICAgImZhaWxlZCB0byBmbHVzaCBpdCByZXR1cm5lZCBlcnJvciIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9oYW5kbGVfaGFuZHNoYWtlKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCksIEZBTFNFKTsKKworICBpZihUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1Moc3NsX3NvY2tldCktPmNyZWF0ZV9zc2xfY29udGV4dCh0cmFuc3BvcnQsIGVycm9yKSl7CisgICAgICAvKkNvbnRleHQgY3JlYXRlZCovCisgICAgICBTU0xfc2V0X2ZkKHNzbF9zb2NrZXQtPnNzbCwgc29ja2V0LT5zZCk7CisgICAgICBpbnQgcmM7CisgICAgICBpZihzc2xfc29ja2V0LT5zZXJ2ZXIpeworCSAgcmMgPSBTU0xfYWNjZXB0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICB9ZWxzZXsKKwkgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIH0KKyAgICAgIGlmIChyYyA8PSAwKSB7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJFcnJvciB3aGlsZSBjb25uZWN0L2JpbmQiLCBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DT05ORUNUX0JJTkQsIHJjLCBlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH1lbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiB0aHJpZnRfc3NsX3NvY2tldF9hdXRob3JpemUodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9jcmVhdGVfc3NsX2NvbnRleHQoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZihzb2NrZXQtPmN0eCE9TlVMTCl7CisgICAgICBpZihzb2NrZXQtPnNzbCE9TlVMTCkgeworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICAgIHNvY2tldC0+c3NsID0gU1NMX25ldyhzb2NrZXQtPmN0eCk7CisgICAgICBpZiAoc29ja2V0LT5zc2wgPT0gTlVMTCkgeworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfVFJBTlNQT1JULAorCQkgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgZGVmYXVsdCBTU0wgY29udGV4dCIpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICBjaGFyIGVycm9yX2J1ZmZlclsyNTVdOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpIHsKKyAgICAgIGdfZXJyb3IoIk9wZW5TU0wgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCByYyA9IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9zb2NrZXQtPmN0eCwgZmlsZV9uYW1lLCBOVUxMKTsKKyAgaWYgKHJjICE9IDEpIHsgLyp2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0Ki8KKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihFUlJfZ2V0X2Vycm9yKCksIGVycm9yX2J1ZmZlciwgMjU0KTsKKyAgICAgIGdfd2FybmluZygiTG9hZCBvZiBjZXJ0aWZpY2F0ZXMgZmFpbGVkOiAlcyEiLCBlcnJvcl9idWZmZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciBjaGFpbl9jZXJ0c1tdKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgLyogTG9hZCBjaGFpbiBvZiBjZXJ0cyovCisgIFg1MDkgKmNhY2VydD1OVUxMOworICBCSU8gKm1lbSA9IEJJT19uZXdfbWVtX2J1ZihjaGFpbl9jZXJ0cyxzdHJsZW4oY2hhaW5fY2VydHMpKTsKKyAgWDUwOV9TVE9SRSAqY2VydF9zdG9yZSA9IFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoc3NsX3NvY2tldC0+Y3R4KTsKKworICBpZihjZXJ0X3N0b3JlIT1OVUxMKXsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICB3aGlsZSAoKGNhY2VydCA9IFBFTV9yZWFkX2Jpb19YNTA5KG1lbSwgTlVMTCwgMCwgTlVMTCkpIT1OVUxMKSB7CisJICBpZihjYWNlcnQpIHsKKwkgICAgICBYNTA5X1NUT1JFX2FkZF9jZXJ0KGNlcnRfc3RvcmUsIGNhY2VydCk7CisJICAgICAgWDUwOV9mcmVlKGNhY2VydCk7CisJICAgICAgY2FjZXJ0PU5VTEw7CisJICB9IC8qIEZyZWUgaW1tZWRpYXRlbHkgKi8KKwkgIGluZGV4Kys7CisgICAgICB9CisgICAgICByZXR2YWw9VFJVRTsKKyAgfQorICBCSU9fZnJlZShtZW0pOworICByZXR1cm4gcmV0dmFsOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfYXV0aG9yaXplKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNTTFNvY2tldENsYXNzICpjbHMgPSBUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1Moc3NsX3NvY2tldCk7CisgIGdib29sZWFuIGF1dGhvcml6YXRpb25fcmVzdWx0ID0gRkFMU0U7CisKKyAgaWYoY2xzIT1OVUxMICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCl7CisgICAgICBpbnQgcmMgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIGlmIChyYyAhPSBYNTA5X1ZfT0spIHsgLyogdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdCAqLworCSAgaWYgKHJjID09IFg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUICYmIHNzbF9zb2NrZXQtPmFsbG93X3NlbGZzaWduZWQpIHsKKwkgICAgICBnX2RlYnVnKCJUaGUgY2VydGlmaWNhdGUgaXMgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBhbmQgY29uZmlndXJhdGlvbiBhbGxvd3MgaXQiKTsKKwkgIH0gZWxzZSB7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVELAorCQkJICAgIlRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpLCByYyk7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgfQorICAgICAgfQorCisgICAgICBYNTA5KiBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBpZiAoY2VydCA9PSBOVUxMKSB7CisJICBpZiAoU1NMX2dldF92ZXJpZnlfbW9kZShzc2xfc29ja2V0LT5zc2wpICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRCwKKwkJCSAgICJObyBjZXJ0aWZpY2F0ZSBwcmVzZW50LiBBcmUgeW91IGNvbm5lY3RpbmcgU1NMIHNlcnZlcj8iKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICB9CisJICBnX2RlYnVnKCJObyBjZXJ0aWZpY2F0ZSByZXF1aXJlZCIpOworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICAgIC8qIGNlcnRpZmljYXRlIGlzIHByZXNlbnQsIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYWNjZXNzIG1hbmFnZXIgd2UgYXJlIGRvbmUgKi8KKyAgICAgIGlmIChjbHMtPmF1dGhvcml6ZV9wZWVyID09IE5VTEwpIHsKKwkgIFg1MDlfZnJlZShjZXJ0KTsKKwkgIGdfZGVidWcoIkNlcnRpZmljYXRlIHByZXNlbnRlZCBidXQgd2UncmUgbm90IGNoZWNraW5nIGl0Iik7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisJICAvKiBib3RoIGNlcnRpZmljYXRlIGFuZCBhY2Nlc3MgbWFuYWdlciBhcmUgcHJlc2VudCAqLworCSAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisJICBzb2NrbGVuX3Qgc2FMZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworCSAgaWYgKGdldHBlZXJuYW1lKHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgJnNhTGVuZ3RoKSAhPSAwKSB7CisJICAgICAgc2Euc3NfZmFtaWx5ID0gQUZfVU5TUEVDOworCSAgfQorCSAgYXV0aG9yaXphdGlvbl9yZXN1bHQgPSBjbHMtPmF1dGhvcml6ZV9wZWVyKHRyYW5zcG9ydCwgY2VydCwgJnNhLCBlcnJvcik7CisgICAgICB9CisgICAgICBpZihjZXJ0ICE9IE5VTEwpIHsKKwkgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBhdXRob3JpemF0aW9uX3Jlc3VsdDsKK30KKworCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0IChUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCkKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIHNvY2tldC0+c3NsID0gTlVMTDsKKyAgc29ja2V0LT5jdHggPSB0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoU1NMVExTLCAmZXJyb3IpOworICBpZihzb2NrZXQtPmN0eCA9PSBOVUxMKSB7CisgICAgICBnX2luZm8oIlRoZSBTU0wgY29udGV4dCB3YXMgbm90IGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQgd2l0aCBwcm90b2NvbCAlZCIsIFNTTFRMUyk7CisgICAgICBpZihlcnJvciE9TlVMTCl7CisJICBnX2luZm8oIlJlcG9ydGVkIHJlYXNvbiAlcyIsIGVycm9yLT5tZXNzYWdlKTsKKwkgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgfQorICB9CisgIHNvY2tldC0+c2VydmVyID0gRkFMU0U7CisgIHNvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCA9IEZBTFNFOworCit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIGlmKHNvY2tldCE9TlVMTCl7CisgICAgICBnX2RlYnVnKCJJbnN0YW5jZSAlcCBkZXN0cm95ZWQiLCAodm9pZCAqKXNvY2tldCk7CisgICAgICBpZihzb2NrZXQtPnNzbCAhPSBOVUxMKQorCXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlKFRIUklGVF9UUkFOU1BPUlQob2JqZWN0KSwgJmVycm9yKTsKKwkgIHNvY2tldC0+c3NsPU5VTEw7CisJfQorCisgICAgICBpZihzb2NrZXQtPmN0eCE9TlVMTCl7CisJICBnX2RlYnVnKCJGcmVlaW5nIHRoZSBjb250ZXh0IGZvciB0aGUgaW5zdGFuY2UiKTsKKwkgIFNTTF9DVFhfZnJlZShzb2NrZXQtPmN0eCk7CisJICBzb2NrZXQtPmN0eD1OVUxMOworICAgICAgfQorICB9CisKKyAgaWYgKEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3NsX3NvY2tldF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkKKyAgICAoKkdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3NsX3NvY2tldF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisJCQkJR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUOgorICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIHNvY2tldC0+Y3R4KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKwkJCQljb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQ6CisgICAgICBpZihzb2NrZXQtPmN0eCE9TlVMTCl7CisJICBnX2RlYnVnKCJGcmVlaW5nIHRoZSBjb250ZXh0IHNpbmNlIHdlIGFyZSBzZXR0aW5nIGEgbmV3IG9uZSIpOworCSAgU1NMX0NUWF9mcmVlKHNvY2tldC0+Y3R4KTsKKyAgICAgIH0KKyAgICAgIHNvY2tldC0+Y3R4ID0gZ192YWx1ZV9nZXRfcG9pbnRlcih2YWx1ZSk7IC8qIFdlIGNvcHkgdGhlIGNvbnRleHQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQ6CisgICAgICBzb2NrZXQtPmFsbG93X3NlbGZzaWduZWQgPSBnX3ZhbHVlX2dldF9ib29sZWFuKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX3dhcm5pbmcoIlRyeWluZyB0byBzZXQgcHJvcGVydHkgJWkgdGhhdCBkb2Vzbid0IGV4aXN0cyEiLCBwcm9wZXJ0eV9pZCk7CisgICAgICAvKiAgICB0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5X2lkLCB2YWx1ZSwgcHNwZWMpOyAqLworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKHZvaWQpCit7CisgIGlmKHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpeworICAgICAgcmV0dXJuOworICB9CisgIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQ9VFJVRTsKKyAgU1NMX2xpYnJhcnlfaW5pdCgpOworICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgIEVSUl9sb2FkX0JJT19zdHJpbmdzKCk7CisKKyAgLyogU2V0dXAgbG9ja2luZyAqLworICBnX2RlYnVnKCJXZSBzZXR1cCAlZCB0aHJlYWRzIGxvY2tzIiwgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9zZXR1cCgpKTsKKworICAvKiBkeW5hbWljIGxvY2tpbmcKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jcmVhdGVfY2FsbGJhY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jYWxsYmFjayk7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2Rlc3Ryb3lfY2FsbGJhY2spOworICAgKi8KK30KKworCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2wodm9pZCkKK3sKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKSB7CisgICAgICByZXR1cm47CisgIH0KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCA9IEZBTFNFOworCisgIGdfZGVidWcoIldlIGNsZWFyZWQgJWQgdGhyZWFkcyBsb2NrcyIsIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfY2xlYW51cCgpKTsKKyAgLyogTm90IHN1cHBvcnRlZAorICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhOVUxMKTsKKyAgICovCisgIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgRVZQX2NsZWFudXAoKTsKKyAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKK30KKworCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTU0xTb2NrZXRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIGdfZGVidWcoIkluaXRpYWxpemF0aW9uIG9mIFRocmlmdFNTTFNvY2tldENsYXNzIik7CisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc3NsX3NvY2tldF9zZXRfcHJvcGVydHk7CisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfcG9pbnRlciAoInNzbF9jb250ZXh0IiwKKwkJCQkgICAgICJTU0xDb250ZXh0IiwKKwkJCQkgICAgICJTZXQgdGhlIFNTTCBjb250ZXh0IGZvciBoYW5kc2hha2Ugd2l0aCB0aGUgcmVtb3RlIGhvc3QiLAorCQkJCSAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQsCisJCQkJICAgcGFyYW1fc3BlYyk7CisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNzbF9hY2NlcHRfc2VsZnNpZ25lZCIsCisJCQkJICAgICAiQWNjZXB0IFNlbGYgU2lnbmVkIiwKKwkJCQkgICAgICJXaGV0aGVyIG9yIG5vdCBhY2NlcHQgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUiLAorCQkJCSAgICAgRkFMU0UsCisJCQkJICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRCwKKwkJCQkgICBwYXJhbV9zcGVjKTsKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPmhhbmRsZV9oYW5kc2hha2UgPSB0aHJpZnRfc3NsX3NvY2tldF9oYW5kbGVfaGFuZHNoYWtlOworICBjbHMtPmNyZWF0ZV9zc2xfY29udGV4dCA9IHRocmlmdF9zc2xfc29ja2V0X2NyZWF0ZV9zc2xfY29udGV4dDsKKworICAvKiBPdmVycmlkZSAqLworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfc3NsX3NvY2tldF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfc3NsX3NvY2tldF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9zc2xfc29ja2V0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9zc2xfc29ja2V0X2ZsdXNoOworfQorCisKKy8qCisgKiBQdWJsaWMgQVBJCisgKi8KK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ldyhUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRocmlmdFNTTFNvY2tldCA9IE5VTEw7CisgIFNTTF9DVFggKnNzbF9jb250ZXh0ID0gTlVMTDsKKyAgLyogQ3JlYXRlIHRoZSBjb250ZXh0ICovCisgIGlmKChzc2xfY29udGV4dD10aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoc3NsX3Byb3RvY29sLCBlcnJvcikpPT1OVUxMKXsKKyAgICAgIGdfd2FybmluZygiV2UgY2Fubm90IGluaXRpYWxpemUgY29udGV4dCBmb3IgcHJvdG9jb2wgJWQiLCBzc2xfcHJvdG9jb2wpOworICAgICAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKKyAgfQorCisgIC8qIEZJWE1FIGlmIHRoZSBwcm90b2NvbCBpcyBkaWZmZXJlbnQ/ICovCisgIHRocmlmdFNTTFNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgInNzbF9jb250ZXh0Iiwgc3NsX2NvbnRleHQsIE5VTEwpOworICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworfQorCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgZ2NoYXIgKmhvc3RuYW1lLCBndWludCBwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0aHJpZnRTU0xTb2NrZXQgPSBOVUxMOworICBTU0xfQ1RYICpzc2xfY29udGV4dCA9IE5VTEw7CisgIC8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworICBpZigoc3NsX2NvbnRleHQ9dGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKHNzbF9wcm90b2NvbCwgZXJyb3IpKT09TlVMTCl7CisgICAgICAvKiBGSVhNRSBEbyBlcnJvciBjb250cm9sICovCisgICAgICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworICB9CisgIC8qIEZJWE1FIGlmIHRoZSBwcm90b2NvbCBpcyBkaWZmZXJlbnQ/ICovCisgIHRocmlmdFNTTFNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgInNzbF9jb250ZXh0Iiwgc3NsX2NvbnRleHQsICJob3N0bmFtZSIsIGhvc3RuYW1lLCAicG9ydCIsIHBvcnQsIE5VTEwpOworICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworfQorCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLIGNhbGxiYWNrKQoreworICBUaHJpZnRTU0xTb2NrZXRDbGFzcyAqc3NsU29ja2V0Q2xhc3MgPSBUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1MgKHNzbF9zb2NrZXQpOworICBpZihzc2xTb2NrZXRDbGFzcyl7CisgICAgICBzc2xTb2NrZXRDbGFzcy0+YXV0aG9yaXplX3BlZXIgPSBjYWxsYmFjazsKKyAgfQorfQorCisKK1NTTF9DVFgqCit0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgU1NMX0NUWCogY29udGV4dCA9IE5VTEw7CisgIHN3aXRjaChzc2xfcHJvdG9jb2wpeworICAgIGNhc2UgU1NMVExTOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisgICAgICBicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisgICAgY2FzZSBTU0x2MzoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhTU0x2M19tZXRob2QoKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgVExTdjFfMDoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV9tZXRob2QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRMU3YxXzE6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfMV9tZXRob2QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRMU3YxXzI6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfMl9tZXRob2QoKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwKKwkJICAgIlRoZSBTU0wgcHJvdG9jb2wgaXMgdW5rbm93biBmb3IgJWQiLCBzc2xfcHJvdG9jb2wpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChjb250ZXh0ID09IE5VTEwpIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2dldF9lcnJvcigiTm8gY2lwaGVyIG92ZXJsYXkiLCBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwgZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgU1NMX0NUWF9zZXRfbW9kZShjb250ZXh0LCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKworICAvKiBEaXNhYmxlIGhvcnJpYmx5IGluc2VjdXJlIFNTTHYyIGFuZCBTU0x2MyBwcm90b2NvbHMgYnV0IGFsbG93IGEgaGFuZHNoYWtlCisgICAgIHdpdGggb2xkZXIgY2xpZW50cyBzbyB0aGV5IGdldCBhIGdyYWNlZnVsIGRlbmlhbC4gKi8KKyAgaWYgKHNzbF9wcm90b2NvbCA9PSBTU0xUTFMpIHsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29udGV4dCwgU1NMX09QX05PX1NTTHYyKTsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29udGV4dCwgU1NMX09QX05PX1NTTHYzKTsgICAvKiBUSFJJRlQtMzE2NCAqLworICB9CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTQ2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TU0xfU09DS0VUX0gKKyNkZWZpbmUgX1RIUklGVF9TU0xfU09DS0VUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc3NsX3NvY2tldC5oCisgKiAgXGJyaWVmIFNTTCBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcyB0aGUKKyAqICAgICAgICAgVGhyaWZ0U29ja2V0IGNsYXNzLiBCYXNlZCBvbiBwbGFpbiBvcGVuc3NsLgorICogICAgICAgICBJbiB0aGUgZnV0dXJlIHdlIHNob3VsZCB0YWtlIGEgbG9vayB0byBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDE2CisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCAodGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NTTF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NTTF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldENsYXNzKSkKKworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfVFJBTlNQT1JUPTcsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NPTk5FQ1RfQklORCwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQKK30gVGhyaWZ0U1NMU29ja2V0RXJyb3I7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldCBUaHJpZnRTU0xTb2NrZXQ7CisKKy8qIQorICogVGhyaWZ0IFNTTCBTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Cit7CisgIFRocmlmdFNvY2tldCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBTU0wgKnNzbDsKKyAgU1NMX0NUWCogY3R4OworICBnYm9vbGVhbiBzZXJ2ZXI7CisgIGdib29sZWFuIGFsbG93X3NlbGZzaWduZWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Q2xhc3MgVGhyaWZ0U1NMU29ja2V0Q2xhc3M7Cit0eXBlZGVmIGdib29sZWFuICgqIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSykgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBUaHJpZnQgU29ja2V0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldENsYXNzCit7CisgIFRocmlmdFNvY2tldENsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiBoYW5kbGVfaGFuZHNoYWtlKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqIGNyZWF0ZV9zc2xfY29udGV4dCkgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKiBhdXRob3JpemVfcGVlcikgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKTsKKworICAvKiBQYWRkaW5nIHRvIGFsbG93IGFkZGluZyB1cCB0byAxMiBuZXcgdmlydHVhbCBmdW5jdGlvbnMgd2l0aG91dAorICAgKiBicmVha2luZyBBQkkuICovCisgIGdwb2ludGVyIHBhZGRpbmdbMTJdOworfTsKKworZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgeworICBTU0xUTFMgID0gMCwgIC8qIFN1cHBvcnRzIFNTTHYyIGFuZCBTU0x2MyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlcyBhdCBUTFN2MV8wIG9yIGxhdGVyLiAqLworLypTU0x2MiAgID0gMSwgICBIT1JSSUJMWSBJTlNFQ1VSRSEgKi8KKyAgU1NMdjMgICA9IDIsICAvKiBTdXBwb3J0cyBTU0x2MyBvbmx5IC0gYWxzbyBob3JyaWJseSBpbnNlY3VyZSEgKi8KKyAgVExTdjFfMCA9IDMsICAvKiBTdXBwb3J0cyBUTFN2MV8wIG9yIGxhdGVyLiAqLworICBUTFN2MV8xID0gNCwgIC8qIFN1cHBvcnRzIFRMU3YxXzEgb3IgbGF0ZXIuICovCisgIFRMU3YxXzIgPSA1LCAgLyogU3VwcG9ydHMgVExTdjFfMiBvciBsYXRlci4gKi8KKyAgTEFURVNUICA9IFRMU3YxXzIKK307Cit0eXBlZGVmIGVudW0gX1RocmlmdFNTTFNvY2tldFByb3RvY29sIFRocmlmdFNTTFNvY2tldFByb3RvY29sOworCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyAqLworU1NMX0NUWCoKK3RocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NTTF9TT0NLRVQgKi8KK0dUeXBlIHRocmlmdF9zc2xfc29ja2V0X2dldF90eXBlICh2b2lkKTsKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBTZXQgYSBwaW5uaW5nIG1hbmFnZXIgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuCisgKgorICogVGhlIHBpbm5pbmcgbWFuYWdlciB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZSBTU0wgaGFuZHNoYWtlIHRvIGNoZWNrIGNlcnRpZmljYXRlCisgKiBhbmQgcGlubmluZyBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBzc2xfc29ja2V0IFNTTCBTb2NrZXQgdG8gb3BlcmF0ZSBvbi4KKyAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgdGFrZSB0aGUgY29udHJvbCB3aGlsZSB2YWxpZGF0aW5nIHBpbm5pbmcKKyAqCisgKi8KK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0sgY2FsbGJhY2spOworCisvKiBUaGlzIGlzIHRoZSBTU0wgQVBJICovCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTU0wgY29udGV4dCB3aXRoIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQKKyAqIGFuZCBhc3NpZ24gdGhpcyBuZXcgY29udGV4dCB0byB0aGUgY3JlYXRlZCBUaHJpZnRTU0xTb2NrZXQgd2l0aCBzcGVjaWZpZWQgaG9zdDpwb3J0LgorICogQHBhcmFtIHNzbF9wcm90b2NvbAorICogQHBhcmFtIGhvc3RuYW1lCisgKiBAcGFyYW0gcG9ydAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuCisgKi8KK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBnY2hhciAqaG9zdG5hbWUsIGd1aW50IHBvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbnRleHQgd2l0aCB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkCisgKiBhbmQgYXNzaWduIHRoaXMgbmV3IGNvbnRleHQgdG8gdGhlIGNyZWF0ZWQgVGhyaWZ0U1NMU29ja2V0LgorICogQHBhcmFtIHNzbF9wcm90b2NvbAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuCisgKi8KK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ldyhUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworLyoqCisgKiBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBhIFBFTSBmaWxlLgorICogQHBhcmFtIHNzbF9zb2NrZXQgVGhlIHNzbCBzb2NrZXQKKyAqIEBwYXJhbSBmaWxlX25hbWUgVGhlIGZpbGUgbmFtZSBvZiB0aGUgUEVNIGNlcnRpZmljYXRlIGNoYWluCisgKiBAcmV0dXJuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyICpmaWxlX25hbWUpOworCisvKioKKyAqIExvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIG1lbW9yeQorICogQHBhcmFtIHNzbF9zb2NrZXQgdGhlIHNzbCBzb2NrZXQKKyAqIEBwYXJhbSBjaGFpbl9jZXJ0cyB0aGUgYnVmZmVyIHRvIGxvYWQgUEVNIGZyb20KKyAqIEByZXR1cm4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciBjaGFpbl9jZXJ0c1tdKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgc3NsIHNvY2tldCBpcyBvcGVuIGFuZCByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlCisgKiBAcGFyYW0gdHJhbnNwb3J0CisgKiBAcmV0dXJuIHRydWUgaWYgb3BlbgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCisKKy8qKgorICogT3BlbiBjb25uZWN0aW9uIGlmIHJlcXVpcmVkIGFuZCBzZXQgdGhlIHNvY2tldCB0byBiZSByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlCisgKiBAcGFyYW0gdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVyYXRpb24gd2FzIGNvcnJlY3QKKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKiBJdCB3aWxsIGluaXRpYWxpemUgT3BlblNTTCBmdW5jdGlvbi4gVGhpcyBpbml0aWFsaXphdGlvbiB3aWxsIGJlIGRvbmUgYXBwCisgKiB3aWRlLiBTbyBpZiB5b3Ugd2FudCB0byBpbml0aWFsaXplIGl0IGJ5IHlvdXJzZWxmIHlvdSBzaG91bGQgbm90IGNhbGwgaXQuCisgKiBCdXQgaXQgbWVhbnMgeW91IG11c3QgaGFuZGxlIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24gYW5kIGhhbmRsZSBsb2NraW5nLgorICoKKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UuCisgKgorICoKKyAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKHZvaWQpOworLyoqCisgKiBAYnJpZWYgRmluYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogSXQgY2xlYXJzIGFsbCByZXNvdXJjZXMgaW5pdGlhbGl6ZWQgaW4gaW5pdGlhbGl6ZSBmdW5jdGlvbi4KKyAqCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFueXRoaW5nIGVsc2UuCisgKgorICoKKyAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDI2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOICJ0aHJpZnQtdHJhbnNwb3J0LWVycm9yLXF1YXJrIgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFRyYW5zcG9ydCwgdGhyaWZ0X3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKKworZ2Jvb2xlYW4gCit0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmlzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5wZWVrICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPm9wZW4gKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2VuZCAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlX2VuZCAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmZsdXNoICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnJlYWRfYWxsICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKKy8qIGJ5IGRlZmF1bHQsIHBlZWsgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiAqLworc3RhdGljIGdib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIGdpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGM7CisgIGd1aW50MzIgaGF2ZTsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDggKmJ5dGVzOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGhhdmUgPSAwOworICByZXQgPSAwOworICBieXRlcyA9IChnaW50OCopIGJ1ZjsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGlmICgocmV0ID0gdHRjLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgKGJ5dGVzICsgaGF2ZSksIGxlbiAtIGhhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBoYXZlICs9IHJldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCB0cmFuc3BvcnRzICovCitHUXVhcmsKK3RocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9ET01BSU4pOworfQorCisvKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0VHJhbnNwb3J0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KKyAgY2xzLT5pc19vcGVuID0gdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuOworICBjbHMtPm9wZW4gPSB0aHJpZnRfdHJhbnNwb3J0X29wZW47CisgIGNscy0+Y2xvc2UgPSB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlOworICBjbHMtPnJlYWQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWQ7CisgIGNscy0+cmVhZF9lbmQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kOworICBjbHMtPndyaXRlID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZTsKKyAgY2xzLT53cml0ZV9lbmQgPSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKKyAgY2xzLT5mbHVzaCA9IHRocmlmdF90cmFuc3BvcnRfZmx1c2g7CisKKyAgLyogcHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwZWVrIGFuZCByZWFkX2FsbCBtZXRob2RzICovCisgIGNscy0+cGVlayA9IHRocmlmdF90cmFuc3BvcnRfcmVhbF9wZWVrOworICBjbHMtPnJlYWRfYWxsID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9pbml0IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiYjZmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgdHJhbnNwb3J0cy4KKyAqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyBpcyB1c2VkIGluc3RlYWQgb2YgYW4gaW50ZXJmYWNlIGJlY2F1c2U6CisgKiAgLSBpbnRlcmZhY2VzIGNhbid0IHNlZW0gdG8gYmUgdXNlZCBhcyBwcm9wZXJ0aWVzLiAgVGhyaWZ0UHJvdG9jb2wgaGFzCisgKiAgICBhIFRocmlmdFRyYW5zcG9ydCBhcyBhbiBvYmplY3QgcHJvcGVydHkuCisgKiAgLSBpZiBhIG1ldGhvZCBuZWVkcyB0byBiZSBhZGRlZCB0aGF0IGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UsIGEgY2xhc3MKKyAqICAgIGlzIG5lY2Vzc2FyeS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKHRocmlmdF90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0IFRocmlmdFRyYW5zcG9ydDsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydENsYXNzIFRocmlmdFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKmlzX29wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIGdib29sZWFuICgqcGVlaykgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqb3BlbikgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqcmVhZF9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKndyaXRlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKndyaXRlX2VuZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqZmx1c2gpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2FsbCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworCisvKiEKKyAqIENoZWNrcyBpZiB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuZWQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKy8qIQorICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbAorICogb3Blbi4gQnkgZGVmYXVsdCB0aGlzIGlzIHRydWUgd2hlbmV2ZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBidXQKKyAqIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWRkIGxvZ2ljIHRvIHRlc3QgZm9yIHRoaXMgY29uZGl0aW9uIHdoZXJlIHBvc3NpYmxlCisgKiAoaS5lLiBvbiBhIHNvY2tldCkuCisgKgorICogVGhpcyBpcyB1c2VkIGJ5IGEgc2VydmVyIHRvIGNoZWNrIGlmIGl0IHNob3VsZCBsaXN0ZW4gZm9yIGFub3RoZXIgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGJ1ZmZlciBidWYuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2ludDMyIHRocmlmdF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2FsbGVkIHdoZW4gcmVhZCBpcyBjb21wbGV0ZWQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBXcml0ZXMgZGF0YSBmcm9tIGEgYnVmZmVyIHRvIHRoZSB0cmFuc3BvcnQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGVkLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIHRvIGJlIHdyaXR0ZW4uICBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCisgKiB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFJlYWQgbGVuIGJ5dGVzIG9mIGRhdGEgaW50byB0aGUgYnVmZmVyIGJ1Zi4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnaW50MzIgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0hPU1QsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NPTk5FQ1QsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFCit9IFRocmlmdFRyYW5zcG9ydEVycm9yOworCisvKiBkZWZpbmUgYW4gZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCitHUXVhcmsgdGhyaWZ0X3RyYW5zcG9ydF9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRVJST1IgKHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKCkpCisKKy8qIGRlZmluZSBtYWNybyBmb3IgaW52YWxpZCBzb2NrZXQgKi8KKyNkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwMjVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSwgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQorCisvKiBidWlsZHMgYSB0cmFuc3BvcnQgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQuICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKyAgcmV0dXJuIHRyYW5zcG9ydDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmNscykKK3sKKyAgY2xzLT5nZXRfdHJhbnNwb3J0ID0gdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNkYTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCisgKiAgXGJyaWVmIEJhc2UgY2xhc3MgZm9yIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yaWVzLiAgVXNlZCBieSBUaHJpZnQgU2VydmVycworICogICAgICAgICB0byBvYnRhaW4gYSBjbGllbnQgdHJhbnNwb3J0IGZyb20gYW4gZXhpc3RpbmcgdHJhbnNwb3J0LiAgVGhlIGRlZmF1bHQKKyAqICAgICAgICAgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsb25lcyB0aGUgcHJvdmlkZWQgdHJhbnNwb3J0LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZICh0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5IFRocmlmdFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yeSBpbnN0YW5jZSAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3M7CisKKy8qIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK1RocmlmdFRyYW5zcG9ydCAqdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWJlZTNjLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24sIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24sIFRIUklGVF9UWVBFX1NUUlVDVCkKLQotZ2ludDMyCi10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdjaGFyICpuYW1lOwotICBUaHJpZnRUeXBlIGZ0eXBlOwotICBnaW50MTYgZmlkOwotICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGhpcyA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7Ci0KLSAgLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkKLSAgewotICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOwotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7Ci0KLSAgd2hpbGUgKDEpCi0gIHsKLSAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcikpIDwgMCkKLSAgICB7Ci0gICAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgeGZlciArPSByZXQ7Ci0gICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7Ci0KLSAgICAvKiBicmVhayBpZiB3ZSBnZXQgYSBTVE9QIGZpZWxkICovCi0gICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGZpZCkKLSAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmIChmdHlwZSA9PSBUX1NUUklORykKLSAgICAgICAgewotICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnRoaXMtPm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICAgIHRoaXMtPl9faXNzZXRfbWVzc2FnZSA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB4ZmVyICs9IHJldDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZ0eXBlID09IFRfSTMyKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdGhpcy0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgeGZlciArPSByZXQ7Ci0gICAgICAgICAgdGhpcy0+X19pc3NldF90eXBlID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKLSAgICAgIHJldHVybiAtMTsKLSAgICB4ZmVyICs9IHJldDsKLSAgfQotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgeGZlciArPSByZXQ7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRoaXMgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAibWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1NUUklORywgMSwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgdGhpcy0+bWVzc2FnZSwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0kzMiwgMiwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdGhpcy0+dHlwZSwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotCi0gIHJldHVybiB4ZmVyOwotfQotCi0KLS8qIEdFcnJvciBkb21haW4gKi8KLSNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9ET01BSU4gInRocmlmdC1hcHBsaWNhdGlvbi1leGNlcHRpb24tZXJyb3ItcXVhcmsiCi0KLUdRdWFyawotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAodm9pZCkKLXsKLSAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0RPTUFJTik7Ci19Ci0KLXZvaWQKLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25faW5pdCAoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKm9iamVjdCkKLXsKLSAgb2JqZWN0LT50eXBlID0gMDsKLSAgb2JqZWN0LT5fX2lzc2V0X3R5cGUgPSBGQUxTRTsKLSAgb2JqZWN0LT5tZXNzYWdlID0gTlVMTDsKLSAgb2JqZWN0LT5fX2lzc2V0X21lc3NhZ2UgPSBGQUxTRTsKLX0KLQotdm9pZAotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9jbGFzc19pbml0IChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzICpjbGFzcykKLXsKLSAgVGhyaWZ0U3RydWN0Q2xhc3MgKmNscyA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xhc3MpOwotICBjbHMtPnJlYWQgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQ7Ci0gIGNscy0+d3JpdGUgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3dyaXRlOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjljMjliLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9ICi0jZGVmaW5lIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0jaW5jbHVkZSAidGhyaWZ0X3N0cnVjdC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKLSAqICBcYnJpZWYgQyBJbXBsZW1lbnRhdGlvbiBvZiBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04gKHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04ob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikpCi0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT05fQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikpCi0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MpKQotCi1zdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uCi17Ci0gIFRocmlmdFN0cnVjdCBwYXJlbnQ7Ci0KLSAgLyogcHVibGljICovCi0gIGdpbnQzMiB0eXBlOwotICBnYm9vbGVhbiBfX2lzc2V0X3R5cGU7Ci0gIGdjaGFyICptZXNzYWdlOwotICBnYm9vbGVhbiBfX2lzc2V0X21lc3NhZ2U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotCi1zdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MKLXsKLSAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3M7Ci0KLUdUeXBlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiBnZXJyb3IgY29kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfQkFEX1NFUVVFTkNFX0lELAotICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX01JU1NJTkdfUkVTVUxUCi19IFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uRXJyb3I7Ci0KLS8qIGRlZmluZSBlcnJvciBkb21haW4gZm9yIEdFcnJvciAqLwotR1F1YXJrIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SICh0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICgpKQotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X3N0cnVjdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0X3N0cnVjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA5MjhhLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdF9zdHJ1Y3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRocmlmdF9zdHJ1Y3QuaCIKLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTdHJ1Y3QsIHRocmlmdF9zdHJ1Y3QsIEdfVFlQRV9PQkpFQ1QpCi0KLWdpbnQzMgotdGhyaWZ0X3N0cnVjdF9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVFJVQ1QgKG9iamVjdCksIC0xKTsKLSAgcmV0dXJuIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTIChvYmplY3QpLT5yZWFkIChvYmplY3QsIHByb3RvY29sLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUUlVDVCAob2JqZWN0KSwgLTEpOwotICByZXR1cm4gVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1MgKG9iamVjdCktPndyaXRlIChvYmplY3QsIHByb3RvY29sLCBlcnJvcik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfc3RydWN0X2NsYXNzX2luaXQgKFRocmlmdFN0cnVjdENsYXNzICpjbHMpCi17Ci0gIGNscy0+cmVhZCA9IHRocmlmdF9zdHJ1Y3RfcmVhZDsKLSAgY2xzLT53cml0ZSA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGU7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfc3RydWN0X2luaXQgKFRocmlmdFN0cnVjdCAqc3RydWN0dXJlKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoc3RydWN0dXJlKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdF9zdHJ1Y3QuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdF9zdHJ1Y3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmOTk4NC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnRfc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVEhSSUZUX1NUUlVDVF9ICi0jZGVmaW5lIFRIUklGVF9TVFJVQ1RfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLSNkZWZpbmUgVEhSSUZUX1RZUEVfU1RSVUNUICh0aHJpZnRfc3RydWN0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNULCBUaHJpZnRTdHJ1Y3QpKQotI2RlZmluZSBUSFJJRlRfU1RSVUNUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCkpCi0jZGVmaW5lIFRIUklGVF9JU19TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCkpCi0jZGVmaW5lIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdENsYXNzKSkKLQotLyogc3RydWN0ICovCi1zdHJ1Y3QgX1RocmlmdFN0cnVjdAotewotICBHT2JqZWN0IHBhcmVudDsKLQotICAvKiBwcml2YXRlICovCi19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0cnVjdCBUaHJpZnRTdHJ1Y3Q7Ci0KLXN0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICAvKiBwdWJsaWMgKi8KLSAgZ2ludDMyICgqcmVhZCkgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlKSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0cnVjdENsYXNzIFRocmlmdFN0cnVjdENsYXNzOwotCi1HVHlwZSB0aHJpZnRfc3RydWN0X2dldF90eXBlICh2b2lkKTsKLQotZ2ludDMyIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjMTRiMS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaCIKLQotLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KLWVudW0gX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0UHJvcGVydGllcwotewotICBQUk9QXzAsCi0gIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAotICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUKLX07Ci0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+aXNfb3BlbiAodC0+dHJhbnNwb3J0KTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPm9wZW4gKHQtPnRyYW5zcG9ydCwgZXJyb3IpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5jbG9zZSAodC0+dHJhbnNwb3J0LCBlcnJvcik7Ci19Ci0KLS8qIHRoZSBhY3R1YWwgcmVhZCBpcyAic2xvdyIgYmVjYXVzZSBpdCBjYWxscyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgKi8KLWdpbnQzMgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIGd1aW50MzIgd2FudCA9IGxlbjsKLSAgZ3VpbnQzMiBnb3QgPSAwOwotICBndWNoYXIgdG1wZGF0YVt0LT5yX2J1Zl9zaXplXTsKLSAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKLQotICAvLyB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkCi0gIGFzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOwotCi0gIC8vIGZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlIGluIG91ciBidWZmZXIuCi0gIGlmIChoYXZlID4gMCkKLSAgewotICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1ZiwgdC0+cl9idWYtPmxlbik7Ci0gICAgd2FudCAtPSB0LT5yX2J1Zi0+bGVuOwotICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIHQtPnJfYnVmLT5sZW4pOwotICB9Ci0KLSAgLy8gaWYgdGhlIGJ1ZmZlciBpcyBzdGlsbCBzbWFsbGVyIHRoYW4gd2hhdCB3ZSB3YW50IHRvIHJlYWQsIHRoZW4ganVzdAotICAvLyByZWFkIGl0IGRpcmVjdGx5LiAgb3RoZXJ3aXNlLCBmaWxsIHRoZSBidWZmZXIgYW5kIHRoZW4gZ2l2ZSBvdXQKLSAgLy8gZW5vdWdoIHRvIHNhdGlzZnkgdGhlIHJlYWQuCi0gIGlmICh0LT5yX2J1Zl9zaXplIDwgd2FudCkKLSAgewotICAgIGdvdCArPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+cmVhZCAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgICAvLyBjb3B5IHRoZSBkYXRhIHN0YXJ0aW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYKLSAgICBtZW1jcHkgKGJ1ZiArIGhhdmUsIHRtcGRhdGEsIGdvdCk7Ci0gICAgcmV0dXJuIGdvdCArIGhhdmU7IAotICB9IGVsc2UgewotICAgIGdvdCArPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+cmVhZCAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnJfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgZ290KTsKLSAgICAKLSAgICAvLyBoYW5kIG92ZXIgd2hhdCB3ZSBoYXZlIHVwIHRvIHdoYXQgdGhlIGNhbGxlciB3YW50cwotICAgIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47Ci0KLQotICAgIG1lbWNweSAoYnVmICsgbGVuIC0gd2FudCwgdC0+cl9idWYtPmRhdGEsIGdpdmUpOwotICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOwotICAgIHdhbnQgLT0gZ2l2ZTsKLQotICAgIHJldHVybiAobGVuIC0gd2FudCk7Ci0gIH0KLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvKiBpZiB3ZSBoYXZlIGVub3VnaCBidWZmZXIgZGF0YSB0byBmdWxmaWxsIHRoZSByZWFkLCBqdXN0IHVzZQotICAgKiBhIG1lbWNweSAqLwotICBpZiAobGVuIDw9IHQtPnJfYnVmLT5sZW4pCi0gIHsKLSAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYtPmRhdGEsIGxlbik7Ci0gICAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGxlbik7Ci0gICAgcmV0dXJuIGxlbjsKLSAgfQotCi0gIHJldHVybiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKLSAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICBndWludDMyIGhhdmVfYnl0ZXMgPSB0LT53X2J1Zi0+bGVuOwotICBndWludDMyIHNwYWNlID0gdC0+d19idWZfc2l6ZSAtIHQtPndfYnVmLT5sZW47Ci0KLSAgLy8gd2UgbmVlZCB0d28gc3lzY2FsbHMgYmVjYXVzZSB0aGUgYnVmZmVyZWQgZGF0YSBwbHVzIHRoZSBidWZmZXIgaXRzZWxmCi0gIC8vIGlzIHRvbyBiaWcuCi0gIGlmICgoaGF2ZV9ieXRlcyArIGxlbiA+PSAyKnQtPndfYnVmLT5sZW4pIHx8IChoYXZlX2J5dGVzID09IDApKQotICB7Ci0gICAgaWYgKGhhdmVfYnl0ZXMgPiAwKQotICAgIHsKLSAgICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotICAgIH0KLSAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgbGVuLCBlcnJvcik7Ci0gICAgaWYgKHQtPndfYnVmLT5sZW4gPiAwKQotICAgIHsKLSAgICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotICB9Ci0KLSAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBzcGFjZSk7Ci0gIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotCi0gIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOwotICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYrc3BhY2UsIGxlbi1zcGFjZSk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0KLSAgLyogdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBidWZmZXIgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJlaW5nIHJlYWQgKi8KLSAgaWYgKHQtPndfYnVmLT5sZW4gKyBsZW4gPD0gdC0+d19idWZfc2l6ZSkKLSAgewotICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1ZiwgbGVuKTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCi0gKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCi1nYm9vbGVhbgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKHQtPndfYnVmICE9IE5VTEwgJiYgdC0+d19idWYtPmxlbiA+IDApCi0gIHsKLSAgICAvLyB3cml0ZSB0aGUgYnVmZmVyIGFuZCB0aGVuIGVtcHR5IGl0Ci0gICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7Ci0gIH0KLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmZsdXNoICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gTlVMTDsKLSAgdHJhbnNwb3J0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Ci0gIHRyYW5zcG9ydC0+d19idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOwotfQotCi0vKiBkZXN0cnVjdG9yICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBpZiAodHJhbnNwb3J0LT5yX2J1ZiAhPSBOVUxMKQotICB7Ci0gICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+cl9idWYsIFRSVUUpOwotICB9Ci0gIHRyYW5zcG9ydC0+cl9idWYgPSBOVUxMOwotCi0gIGlmICh0cmFuc3BvcnQtPndfYnVmICE9IE5VTEwpCi0gIHsKLSAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT53X2J1ZiwgVFJVRSk7Ci0gIH0KLSAgdHJhbnNwb3J0LT53X2J1ZiA9IE5VTEw7Ci19Ci0KLS8qIHByb3BlcnR5IGFjY2Vzc29yICovCi12b2lkCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5yX2J1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgotICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+d19idWZfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBwcm9wZXJ0eSBtdXRhdG9yICovCi12b2lkCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKLSAgICAgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgotICAgICAgdHJhbnNwb3J0LT5yX2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPndfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0gIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOwotCi0gIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgInRyYW5zcG9ydCAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IHRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJyX2J1Zl9zaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotCi0gIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9maW5hbGl6ZTsKLSAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuOwotICB0dGMtPm9wZW4gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW47Ci0gIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlOwotICB0dGMtPnJlYWQgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQ7Ci0gIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfZW5kOwotICB0dGMtPndyaXRlID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZTsKLSAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKLSAgdHRjLT5mbHVzaCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2g7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhNTE4My4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0gKLSNkZWZpbmUgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfSAotCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKLSAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgYnVmZmVyZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcwotICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQpKQotI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKQotI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcm90ZWN0ZWQgKi8KLSAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0KLSAgLyogcHJpdmF0ZSAqLwotICBHQnl0ZUFycmF5ICpyX2J1ZjsKLSAgR0J5dGVBcnJheSAqd19idWY7Ci0gIGd1aW50MzIgcl9idWZfc2l6ZTsKLSAgZ3VpbnQzMiB3X2J1Zl9zaXplOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydDsKLQotLyohCi0gKiBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzCi17Ci0gIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAqLwotR1R5cGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkZDQ0Ni4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oIgotCi0vKiBvYmplY3QgcHJvcGVydGllcyAqLwotZW51bSBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0UHJvcGVydGllcwotewotICBQUk9QXzAsCi0gIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JULAotICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCi0gIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUKLX07Ci0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0LCB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+b3BlbiAodC0+dHJhbnNwb3J0LCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmNsb3NlICh0LT50cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogcmVhZHMgYSBmcmFtZSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBidWZmZXIgKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2ZyYW1lIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ2ludDMyIHN6LCBieXRlczsKLQotICAvKiByZWFkIHRoZSBzaXplICovCi0gIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMiAqKSAmc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN6KSwgZXJyb3IpOwotICBzeiA9IG50b2hsIChzeik7Ci0KLSAgLyogY3JlYXRlIGEgYnVmZmVyIHRvIGhvbGQgdGhlIGRhdGEgYW5kIHJlYWQgdGhhdCBtdWNoIGRhdGEgKi8KLSAgZ3VjaGFyIHRtcGRhdGFbc3pdOwotICBieXRlcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6IC0gc2l6ZW9mIChzeiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICAvKiBhZGQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciAqLwotICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgYnl0ZXMpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiB0aGUgYWN0dWFsIHJlYWQgaXMgInNsb3ciIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0ICovCi1naW50MzIKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ3VpbnQzMiB3YW50ID0gbGVuOwotICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOwotCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7Ci0KLSAgLy8gZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdAotICBpZiAoaGF2ZSA+IDApCi0gIHsKLSAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOwotICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKLSAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKLSAgfQotCi0gIC8vIHJlYWQgYSBmcmFtZSBvZiBpbnB1dCBhbmQgYnVmZmVyIGl0Ci0gIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKHRyYW5zcG9ydCwgZXJyb3IpOwotCi0gIC8vIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzCi0gIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47Ci0KLSAgLy8gY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIKLSAgbWVtY3B5IChidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7Ci0gIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOwotICB3YW50IC09IGdpdmU7Ci0KLSAgcmV0dXJuIChsZW4gLSB3YW50KTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0KLSAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKLSAgICogYSBtZW1jcHkgZnJvbSB0aGUgYnVmZmVyICovCi0gIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKLSAgewotICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKLSAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKLSAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvLyBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgd2UncmUgZG9uZQotICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLwotICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQotICB7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotICAgIHJldHVybiBUUlVFOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ2ludDMyIHN6X2hibywgc3pfbmJvOwotCi0gIC8vIGdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gaG9zdCBhbmQgbmV0d29yayBieXRlIG9yZGVyCi0gIHN6X2hibyA9IHQtPndfYnVmLT5sZW4gKyBzaXplb2Yoc3pfbmJvKTsKLSAgc3pfbmJvID0gKGdpbnQzMikgaHRvbmwgKChndWludDMyKSBzel9oYm8pOwotCi0gIC8vIGNvcHkgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHRoZSBmcmFtZSBpdHNlbGYKLSAgZ3VjaGFyIHRtcGRhdGFbc3pfaGJvXTsKLSAgbWVtY3B5ICh0bXBkYXRhLCAoZ3VpbnQ4ICopICZzel9uYm8sIHNpemVvZiAoc3pfbmJvKSk7Ci0KLSAgaWYgKHQtPndfYnVmLT5sZW4gPiAwKQotICB7Ci0gICAgbWVtY3B5ICh0bXBkYXRhICsgc2l6ZW9mIChzel9uYm8pLCB0LT53X2J1Zi0+ZGF0YSwgdC0+d19idWYtPmxlbik7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7Ci0gIH0KLSAgICAKLSAgLy8gd3JpdGUgdGhlIGJ1ZmZlciBhbmQgdGhlbiBlbXB0eSBpdAotICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLCBzel9oYm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotCi0gIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5mbHVzaCAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gTlVMTDsKLSAgdHJhbnNwb3J0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Ci0gIHRyYW5zcG9ydC0+d19idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOwotfQotCi0vKiBkZXN0cnVjdG9yICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBpZiAodHJhbnNwb3J0LT5yX2J1ZiAhPSBOVUxMKQotICB7Ci0gICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+cl9idWYsIFRSVUUpOwotICB9Ci0gIHRyYW5zcG9ydC0+cl9idWYgPSBOVUxMOwotCi0gIGlmICh0cmFuc3BvcnQtPndfYnVmICE9IE5VTEwpCi0gIHsKLSAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT53X2J1ZiwgVFJVRSk7Ci0gIH0KLSAgdHJhbnNwb3J0LT53X2J1ZiA9IE5VTEw7Ci19Ci0KLS8qIHByb3BlcnR5IGFjY2Vzc29yICovCi12b2lkCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5yX2J1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPndfYnVmX3NpemUpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogcHJvcGVydHkgbXV0YXRvciAqLwotdm9pZAotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKLSAgICAgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzICpjbHMpCi17Ci0gIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwotICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKLQotICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCi0gIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgInRyYW5zcG9ydCAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IHRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicl9idWZfc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQgYnVmZmVyIHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotCi0gIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmluYWxpemU7Ci0gIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW47Ci0gIHR0Yy0+b3BlbiA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW47Ci0gIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZTsKLSAgdHRjLT5yZWFkID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZDsKLSAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZW5kOwotICB0dGMtPndyaXRlID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGU7Ci0gIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kOwotICB0dGMtPmZsdXNoID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2g7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTE0ZTM1Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9ICi0jZGVmaW5lIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxnbGliLmg+Ci0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKLSAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgZnJhbWVkIHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMKLSAqICAgICAgICAgdGhlIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnQpKQotI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQpKQotI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCkKLSNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IGluc3RhbmNlLgotICovCi1zdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydAotewotICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OwotCi0gIC8qIHByb3RlY3RlZCAqLwotICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKLQotICAvKiBwcml2YXRlICovCi0gIEdCeXRlQXJyYXkgKnJfYnVmOwotICBHQnl0ZUFycmF5ICp3X2J1ZjsKLSAgZ3VpbnQzMiByX2J1Zl9zaXplOwotICBndWludDMyIHdfYnVmX3NpemU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydCBUaHJpZnRGcmFtZWRUcmFuc3BvcnQ7Ci0KLS8qIQotICogVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IGNsYXNzLgotICovCi1zdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzCi17Ci0gIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCAqLwotR1R5cGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjcxN2QuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCIKLQotLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KLWVudW0gX1RocmlmdE1lbW9yeUJ1ZmZlclByb3BlcnRpZXMKLXsKLSAgUFJPUF8wLAotICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAotfTsKLQotR19ERUZJTkVfVFlQRShUaHJpZnRNZW1vcnlCdWZmZXIsIHRocmlmdF9tZW1vcnlfYnVmZmVyLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCi0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLwotZ2ludDMyCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAodHJhbnNwb3J0KTsKLSAgZ3VpbnQzMiBnaXZlID0gbGVuOyAKLQotICAvKiBpZiB0aGUgcmVxdWVzdGVkIGJ5dGVzIGFyZSBtb3JlIHRoYW4gd2hhdCB3ZSBoYXZlIGF2YWlsYWJsZSwKLSAgICoganVzdCBnaXZlIGFsbCB0aGF0IHdlIGhhdmUgdGhlIGJ1ZmZlciAqLwotICBpZiAodC0+YnVmLT5sZW4gPCBsZW4pCi0gIHsKLSAgICBnaXZlID0gdC0+YnVmLT5sZW47Ci0gIH0KLQotICBtZW1jcHkgKGJ1ZiwgdC0+YnVmLT5kYXRhLCBnaXZlKTsKLSAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+YnVmLCAwLCBnaXZlKTsKLQotICByZXR1cm4gZ2l2ZTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCi0gKiBjYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotCi0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSICh0cmFuc3BvcnQpOwotCi0gIC8qIHJldHVybiBhbiBleGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlLiAqLwotICBpZiAobGVuID4gdC0+YnVmX3NpemUgLSB0LT5idWYtPmxlbikKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAotICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHdyaXRlICVkIGJ5dGVzIHRvIGJ1ZmZlciBvZiBsZW5ndGggJWQiLAotICAgICAgICAgICAgICAgICBsZW4sIHQtPmJ1Zl9zaXplKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0gZWxzZSB7Ci0gICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+YnVmLCBidWYsIGxlbik7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQpCi17Ci0gIHRyYW5zcG9ydC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKLX0KLQotLyogZGVzdHJ1Y3RvciAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9tZW1vcnlfYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCi17Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7Ci0KLSAgaWYgKHRyYW5zcG9ydC0+YnVmICE9IE5VTEwpCi0gIHsKLSAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT5idWYsIFRSVUUpOwotICB9Ci0gIHRyYW5zcG9ydC0+YnVmID0gTlVMTDsKLX0KLQotLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KLXZvaWQKLXRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPmJ1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+YnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzc19pbml0IChUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJidWZfc2l6ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Ci0KLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZTsKLSAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbjsKLSAgdHRjLT5vcGVuID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbjsKLSAgdHRjLT5jbG9zZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlOwotICB0dGMtPnJlYWQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkOwotICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9lbmQ7Ci0gIHR0Yy0+d3JpdGUgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZTsKLSAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZV9lbmQ7Ci0gIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9mbHVzaDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDc5MjkuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9NRU1PUllfQlVGRkVSX0gKLSNkZWZpbmUgX1RIUklGVF9NRU1PUllfQlVGRkVSX0gKLQotI2luY2x1ZGUgPGdsaWIuaD4KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X21lbW9yeV9idWZmZXIuaAotICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBtZW1vcnkgYnVmZmVyIHRyYW5zcG9ydC4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXIpKQotI2RlZmluZSBUSFJJRlRfSVNfTUVNT1JZX0JVRkZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIpKQotI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfTUVNT1JZX0JVRkZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUikKLSNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0TWVtb3J5QnVmZmVyIGluc3RhbmNlLgotICovCi1zdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlcgotewotICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLSAgR0J5dGVBcnJheSAqYnVmOwotICBndWludDMyIGJ1Zl9zaXplOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXIgVGhyaWZ0TWVtb3J5QnVmZmVyOwotCi0vKiEKLSAqIFRocmlmdE1lbW9yeUJ1ZmZlciBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcwotewotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlckNsYXNzIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIgKi8KLUdUeXBlIHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJjMDFjLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCIKLQotLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KLWVudW0gX1RocmlmdFNlcnZlclNvY2tldFByb3BlcnRpZXMKLXsKLSAgUFJPUF8wLAotICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCi0gIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRwotfTsKLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLwotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9ET01BSU4gInRocmlmdC1zZXJ2ZXItc29ja2V0LWVycm9yLXF1YXJrIgotCi0vKiBmb3IgZXJyb3JzIGNvbWluZyBmcm9tIHNvY2tldCgpIGFuZCBjb25uZWN0KCkgKi8KLWV4dGVybiBpbnQgZXJybm87Ci0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0U2VydmVyU29ja2V0LCB0aHJpZnRfc2VydmVyX3NvY2tldCwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkKLQotZ2Jvb2xlYW4KLXRocmlmdF9zZXJ2ZXJfc29ja2V0X2xpc3RlbiAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBpbnQgZW5hYmxlZCA9IDE7IC8qIGZvciBzZXRzb2Nrb3B0KCkgKi8KLSAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgLyogY3JlYXRlIGEgYWRkcmVzcyBzdHJ1Y3R1cmUgKi8KLSAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7Ci0gIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgcGluLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci0gIHBpbi5zaW5fcG9ydCA9IGh0b25zKHRzb2NrZXQtPnBvcnQpOwotCi0gIC8qIGNyZWF0ZSBhIHNvY2tldCAqLwotICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU09DS0VULAotICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yIChlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGlmIChzZXRzb2Nrb3B0KHRzb2NrZXQtPnNkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZlbmFibGVkLAotICAgICAgICAgICAgICAgICBzaXplb2YoZW5hYmxlZCkpID09IC0xKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU0VUU09DS09QVCwKLSAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSIC0gJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIGJpbmQgdG8gdGhlIHNvY2tldCAqLwotICBpZiAoYmluZCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9CSU5ELAotICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGJpbmQgdG8gcG9ydCAlZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBpZiAobGlzdGVuKHRzb2NrZXQtPnNkLCB0c29ja2V0LT5iYWNrbG9nKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsaXN0ZW4gdG8gcG9ydCAlZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotVGhyaWZ0VHJhbnNwb3J0ICoKLXRocmlmdF9zZXJ2ZXJfc29ja2V0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBpbnQgc2QgPSAwOwotICBndWludCBhZGRybGVuID0gMDsKLSAgc3RydWN0IHNvY2thZGRyX2luIGFkZHJlc3M7Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gTlVMTDsKLQotICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAodHJhbnNwb3J0KTsKLQotICBpZiAoKHNkID0gYWNjZXB0KHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyZXNzLCAmYWRkcmxlbikpID09IC0xKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBULAotICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGFjY2VwdCBjb25uZWN0aW9uIC0gJXMiLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKLSAgc29ja2V0LT5zZCA9IHNkOwotCi0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUKHNvY2tldCk7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfc2VydmVyX3NvY2tldF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAodHJhbnNwb3J0KTsKLQotICBpZiAoY2xvc2UgKHRzb2NrZXQtPnNkKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0NMT1NFLAotICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgdHNvY2tldC0+c2QgPSAwOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gKi8KLUdRdWFyawotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpCi17Ci0gIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyhUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9ET01BSU4pOwotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX3NvY2tldF9pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCkKLXsKLSAgc29ja2V0LT5zZCA9IDA7Ci19Ci0KLS8qIGRlc3RydWN0b3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQotewotICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOwotCi0gIGlmIChzb2NrZXQtPnNkICE9IDApCi0gIHsKLSAgICBjbG9zZSAoc29ja2V0LT5zZCk7Ci0gIH0KLSAgc29ja2V0LT5zZCA9IDA7Ci19Ci0KLS8qIHByb3BlcnR5IGFjY2Vzc29yICovCi12b2lkCi10aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPnBvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0c6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5iYWNrbG9nKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9zZXJ2ZXJfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JUOgotICAgICAgc29ja2V0LT5wb3J0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0c6Ci0gICAgICBzb2NrZXQtPmJhY2tsb2cgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X3NldF9wcm9wZXJ0eTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCB0byBsaXN0ZW4gdG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJhY2tsb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrbG9nIChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBhY2NlcHQgYmFja2xvZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWF4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzQsIC8qIG1heCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsIC8qIGRlZmF1bHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9maW5hbGl6ZTsKLQotICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqdHN0YyA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwotICB0c3RjLT5saXN0ZW4gPSB0aHJpZnRfc2VydmVyX3NvY2tldF9saXN0ZW47Ci0gIHRzdGMtPmFjY2VwdCA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2FjY2VwdDsKLSAgdHN0Yy0+Y2xvc2UgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9jbG9zZTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNjAxNy4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9TT0NLRVRfSAotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9TT0NLRVRfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9zZXJ2ZXJfc29ja2V0LmgKLSAqICBcYnJpZWYgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnQuICBJbXBsZW1lbnRzIHRoZQotICogICAgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgY2xhc3MuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCAodGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgVGhyaWZ0U2VydmVyU29ja2V0KSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgU2VydmVyU29ja2V0IGluc3RhbmNlLgotICovCi1zdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldAotewotICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLSAgZ3Nob3J0IHBvcnQ7Ci0gIGdzaG9ydCBiYWNrbG9nOwotICBpbnQgc2Q7Ci0gIGd1aW50OCAqYnVmOwotICBndWludDMyIGJ1Zl9zaXplOwotICBndWludDMyIGJ1Zl9sZW47Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldCBUaHJpZnRTZXJ2ZXJTb2NrZXQ7Ci0KLS8qIQotICogVGhyaWZ0IFNlcnZlclNvY2tldCBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcwotewotICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldENsYXNzIFRocmlmdFNlcnZlclNvY2tldENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQgKi8KLUdUeXBlIHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF90eXBlICh2b2lkKTsKLQotLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NPQ0tFVCwKLSAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU0VUU09DS09QVCwKLSAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQklORCwKLSAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfTElTVEVOLAotICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0NMT1NFCi19IFRocmlmdFNlcnZlclNvY2tldEVycm9yOwotCi0vKiBkZWZpbmUgYSBlcnJvciBkb21haW4gZm9yIEdFcnJvciB0byB1c2UgKi8KLUdRdWFyayB0aHJpZnRfc2VydmVyX3NvY2tldF9lcnJvcl9xdWFyayAodm9pZCk7Ci0jZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SICh0aHJpZnRfc2VydmVyX3NvY2tldF9lcnJvcl9xdWFyayAoKSkKLQotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NlOGUwLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidGhyaWZ0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQsIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LCBHX1RZUEVfT0JKRUNUKQotCi0vKiBiYXNlIGluaXRpYWxpemVyIGZvciB0aGUgc2VydmVyIHRyYW5zcG9ydCBpbnRlcmZhY2UgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqYykKLXsKLSAgYy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuOwotICBjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQ7Ci0gIGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xvc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9pbml0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+bGlzdGVuICh0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1UaHJpZnRUcmFuc3BvcnQgKgotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmFjY2VwdCAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk0MzI1Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9ICi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCi0gKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAodGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0KSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzKSkKLQotc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnQKLXsKLSAgR09iamVjdCBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQ7Ci0KLS8qIQotICogVGhyaWZ0IFRyYW5zcG9ydCBjbGFzcwotICovCi1zdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCi17Ci0gIEdPYmplY3RDbGFzcyBwYXJlbnQ7Ci0KLSAgLyogdnRhYmxlICovCi0gIGdib29sZWFuICgqbGlzdGVuKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLSAgVGhyaWZ0VHJhbnNwb3J0ICooKmFjY2VwdCkgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUICovCi1HVHlwZSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIQotICogTGlzdGVuIGZvciBuZXcgY29ubmVjdGlvbnMuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotICovCi1nYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIQotICogQWNjZXB0IGEgY29ubmVjdGlvbi4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCi0gKi8KLVRocmlmdFRyYW5zcG9ydCAqdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0Ci0gICAgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIQotICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCi0gKi8KLWdib29sZWFuIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzFiYzYuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ0aHJpZnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRTb2NrZXRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FLAotICBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVAotfTsKLQotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCi1HX0RFRklORV9UWVBFKFRocmlmdFNvY2tldCwgdGhyaWZ0X3NvY2tldCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIHNvY2tldC0+c2QgIT0gMDsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKLSAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKLQotICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAodHNvY2tldC0+c2QgPT0gMCwgRkFMU0UpOwotCi0gIC8qIGxvb2t1cCB0aGUgZGVzdGluYXRpb24gaG9zdCAqLwotICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZSAodHNvY2tldC0+aG9zdG5hbWUpKSA9PSBOVUxMKQotICB7Ci0gICAgLyogaG9zdCBsb29rdXAgZmFpbGVkLCBiYWlsIG91dCB3aXRoIGFuIGVycm9yICovCi0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0hPU1QsCi0gICAgICAgICAgICAgICAgICJob3N0IGxvb2t1cCBmYWlsZWQgZm9yICVzOiVkIC0gJXMiLAotICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwKLSAgICAgICAgICAgICAgICAgaHN0cmVycm9yIChoX2Vycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLwotICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKLSAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBwaW4uc2luX2FkZHIuc19hZGRyID0gKChzdHJ1Y3QgaW5fYWRkciAqKSAoaHAtPmhfYWRkcikpLT5zX2FkZHI7Ci0gIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsgCi0KLSAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KLSAgaWYgKCh0c29ja2V0LT5zZCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCBmb3IgaG9zdCAlczolZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsCi0gICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KLSAgaWYgKGNvbm5lY3QgKHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAotICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gaG9zdCAlczolZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHNvY2tldC0+c2QgPSAwOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdpbnQgcmV0ID0gMDsKLSAgZ3VpbnQgZ290ID0gMDsKLQotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgd2hpbGUgKGdvdCA8IGxlbikKLSAgewotICAgIHJldCA9IHJlY3YgKHNvY2tldC0+c2QsIGJ1ZiwgbGVuLCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICB7Ci0gICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAotICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBnb3QgKz0gcmV0OwotICB9Ci0KLSAgcmV0dXJuIGdvdDsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCi0gKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdpbnQgcmV0ID0gMDsKLSAgZ3VpbnQgc2VudCA9IDA7Ci0KLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSAwLCBGQUxTRSk7Ci0KLSAgd2hpbGUgKHNlbnQgPCBsZW4pCi0gIHsKLSAgICByZXQgPSBzZW5kIChzb2NrZXQtPnNkLCBidWYgKyBzZW50LCBsZW4gLSBzZW50LCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICB7Ci0gICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAotICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2VuZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzZW50ICs9IHJldDsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCi0gKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCi0gKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc29ja2V0X2luaXQgKFRocmlmdFNvY2tldCAqc29ja2V0KQotewotICBzb2NrZXQtPnNkID0gMDsKLX0KLQotLyogZGVzdHJ1Y3RvciAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKLXsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOwotCi0gIGlmIChzb2NrZXQtPmhvc3RuYW1lICE9IE5VTEwpCi0gIHsKLSAgICBnX2ZyZWUgKHNvY2tldC0+aG9zdG5hbWUpOwotICB9Ci0gIHNvY2tldC0+aG9zdG5hbWUgPSBOVUxMOwotCi0gIGlmIChzb2NrZXQtPnNkICE9IDApCi0gIHsKLSAgICBjbG9zZSAoc29ja2V0LT5zZCk7Ci0gIH0KLSAgc29ja2V0LT5zZCA9IDA7Ci19Ci0KLS8qIHByb3BlcnR5IGFjY2Vzc29yICovCi12b2lkCi10aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKLSAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNvY2tldC0+aG9zdG5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPnBvcnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogcHJvcGVydHkgbXV0YXRvciAqLwotdm9pZAotdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6Ci0gICAgICBzb2NrZXQtPmhvc3RuYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6Ci0gICAgICBzb2NrZXQtPnBvcnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNvY2tldENsYXNzICpjbHMpCi17Ci0gIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwotICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKLQotICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCi0gIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zb2NrZXRfZ2V0X3Byb3BlcnR5OwotICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3N0cmluZyAoImhvc3RuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBob3N0bmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsaG9zdCIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInBvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzQsIC8qIG1heCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NvY2tldF9maW5hbGl6ZTsKLSAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NvY2tldF9pc19vcGVuOwotICB0dGMtPm9wZW4gPSB0aHJpZnRfc29ja2V0X29wZW47Ci0gIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc29ja2V0X2Nsb3NlOwotICB0dGMtPnJlYWQgPSB0aHJpZnRfc29ja2V0X3JlYWQ7Ci0gIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfc29ja2V0X3JlYWRfZW5kOwotICB0dGMtPndyaXRlID0gdGhyaWZ0X3NvY2tldF93cml0ZTsKLSAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc29ja2V0X3dyaXRlX2VuZDsKLSAgdHRjLT5mbHVzaCA9IHRocmlmdF9zb2NrZXRfZmx1c2g7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkZDM1Ny4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU09DS0VUX0gKLSNkZWZpbmUgX1RIUklGVF9TT0NLRVRfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9zb2NrZXQuaAotICogIFxicmllZiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcyB0aGUKLSAqICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1NPQ0tFVCAodGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0KSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCkpCi0jZGVmaW5lIFRIUklGVF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQotI2RlZmluZSBUSFJJRlRfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU09DS0VULCBUaHJpZnRTb2NrZXRDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFNvY2tldCBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRTb2NrZXQKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcml2YXRlICovCi0gIGdjaGFyICpob3N0bmFtZTsKLSAgZ3Nob3J0IHBvcnQ7Ci0gIGludCBzZDsKLSAgZ3VpbnQ4ICpidWY7Ci0gIGd1aW50MzIgYnVmX3NpemU7Ci0gIGd1aW50MzIgYnVmX2xlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U29ja2V0IFRocmlmdFNvY2tldDsKLQotLyohCi0gKiBUaHJpZnQgU29ja2V0IGNsYXNzLgotICovCi1zdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzCi17Ci0gIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U29ja2V0Q2xhc3MgVGhyaWZ0U29ja2V0Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU09DS0VUICovCi1HVHlwZSB0aHJpZnRfc29ja2V0X2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3Nzg3ZC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0KLS8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9ET01BSU4gInRocmlmdC10cmFuc3BvcnQtZXJyb3ItcXVhcmsiCi0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0VHJhbnNwb3J0LCB0aHJpZnRfdHJhbnNwb3J0LCBHX1RZUEVfT0JKRUNUKQotCi1nYm9vbGVhbiAKLXRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPm9wZW4gKHRyYW5zcG9ydCwgZXJyb3IpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkICh0cmFuc3BvcnQsIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2VuZCAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlICh0cmFuc3BvcnQsIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlX2VuZCAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmZsdXNoICh0cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLwotR1F1YXJrCi10aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOKTsKLX0KLQotLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFRyYW5zcG9ydCAqLwotc3RhdGljIHZvaWQKLXRocmlmdF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmNscykKLXsKLSAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCi0gIGNscy0+aXNfb3BlbiA9IHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbjsKLSAgY2xzLT5vcGVuID0gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuOwotICBjbHMtPmNsb3NlID0gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZTsKLSAgY2xzLT5yZWFkID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkOwotICBjbHMtPnJlYWRfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZDsKLSAgY2xzLT53cml0ZSA9IHRocmlmdF90cmFuc3BvcnRfd3JpdGU7Ci0gIGNscy0+d3JpdGVfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQ7Ci0gIGNscy0+Zmx1c2ggPSB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3RyYW5zcG9ydF9pbml0IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5NzQ3My4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9ICi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnQuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMuCi0gKgotICogQW4gYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCBpbnN0ZWFkIG9mIGFuIGludGVyZmFjZSBiZWNhdXNlOgotICogIC0gaW50ZXJmYWNlcyBjYW4ndCBzZWVtIHRvIGJlIHVzZWQgYXMgcHJvcGVydGllcy4gIFRocmlmdFByb3RvY29sIGhhcwotICogICAgYSBUaHJpZnRUcmFuc3BvcnQgYXMgYW4gb2JqZWN0IHByb3BlcnR5LgotICogIC0gaWYgYSBtZXRob2QgbmVlZHMgdG8gYmUgYWRkZWQgdGhhdCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlLCBhIGNsYXNzCi0gKiAgICBpcyBuZWNlc3NhcnkuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICh0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnQpKQotI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkpCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgb2JqZWN0Ci0gKi8KLXN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnQgVGhyaWZ0VHJhbnNwb3J0OwotCi0vKiEKLSAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICBnYm9vbGVhbiAoKmlzX29wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci0gIGdib29sZWFuICgqb3BlbikgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqcmVhZF9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKndyaXRlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKndyaXRlX2VuZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqZmx1c2gpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcyBUaHJpZnRUcmFuc3BvcnRDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKi8KLUdUeXBlIHRocmlmdF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCi0KLS8qIQotICogQ2hlY2tzIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW5lZC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1nYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotLyohCi0gKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLQotLyohCi0gKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBidWZmZXIgYnVmLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdpbnQzMiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIQotICogV3JpdGVzIGRhdGEgZnJvbSBhIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1nYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiAgVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAotICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLQotLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAotICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAotICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCi0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRQotfSBUaHJpZnRUcmFuc3BvcnRFcnJvcjsKLQotLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLwotR1F1YXJrIHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SICh0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICgpKQotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMWYyLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCIKLQotR19ERUZJTkVfVFlQRShUaHJpZnRUcmFuc3BvcnRGYWN0b3J5LCB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnksIEdfVFlQRV9PQkpFQ1QpCi0KLS8qIGJ1aWxkcyBhIHRyYW5zcG9ydCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydC4gKi8KLVRocmlmdFRyYW5zcG9ydCAqCi10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOwotICByZXR1cm4gdHJhbnNwb3J0OwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqY2xzKQotewotICBjbHMtPmdldF90cmFuc3BvcnQgPSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydDsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9pbml0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDE5OGIuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSAotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCi0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCi0gKiAgXGJyaWVmIEJhc2UgY2xhc3MgZm9yIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yaWVzLiAgVXNlZCBieSBUaHJpZnQgU2VydmVycwotICogICAgICAgICB0byBvYnRhaW4gYSBjbGllbnQgdHJhbnNwb3J0IGZyb20gYW4gZXhpc3RpbmcgdHJhbnNwb3J0LiAgVGhlIGRlZmF1bHQKLSAqICAgICAgICAgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsb25lcyB0aGUgcHJvdmlkZWQgdHJhbnNwb3J0LgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZICh0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5KSkKLSNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKSkKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCi0KLS8qIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yeSBpbnN0YW5jZSAqLwotc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5IFRocmlmdFRyYW5zcG9ydEZhY3Rvcnk7Ci0KLS8qIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLwotc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICAvKiB2dGFibGUgKi8KLSAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSAqLwotR1R5cGUgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKLQotLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLwotVGhyaWZ0VHJhbnNwb3J0ICp0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworc2V0KFRFU1RfUFJFRklYICJjX2dsaWIiKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0Jvb3N0X0lOQ0xVREVfRElSU30pCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBhbmQgZ2VuLWNfZ2xpYiBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQyB0ZXN0IGxpYnJhcnkKK3NldCh0ZXN0Z2VuY19TT1VSQ0VTCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKKykKKworYWRkX2xpYnJhcnkodGVzdGdlbmMgU1RBVElDICR7dGVzdGdlbmNfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGdlbmMgdGhyaWZ0X2NfZ2xpYikKKworCithZGRfZXhlY3V0YWJsZSh0ZXN0c2VyaWFsaXphdGlvbiB0ZXN0c2VyaWFsaXphdGlvbi5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RzZXJpYWxpemF0aW9uIHRlc3RnZW5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RzZXJpYWxpemF0aW9uIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RzZXJpYWxpemF0aW9uIENPTU1BTkQgdGVzdHNlcmlhbGl6YXRpb24pCisKK2FkZF9leGVjdXRhYmxlKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIENPTU1BTkQgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0dHJhbnNwb3J0c29ja2V0IHRlc3R0cmFuc3BvcnRzb2NrZXQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0dHJhbnNwb3J0c29ja2V0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3R0cmFuc3BvcnRzb2NrZXQgQ09NTUFORCB0ZXN0dHJhbnNwb3J0c29ja2V0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0YmluYXJ5cHJvdG9jb2wgdGVzdGJpbmFyeXByb3RvY29sLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGJpbmFyeXByb3RvY29sIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RiaW5hcnlwcm90b2NvbCBDT01NQU5EIHRlc3RiaW5hcnlwcm90b2NvbCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGNvbXBhY3Rwcm90b2NvbCB0ZXN0Y29tcGFjdHByb3RvY29sLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGNvbXBhY3Rwcm90b2NvbCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0Y29tcGFjdHByb3RvY29sIENPTU1BTkQgdGVzdGNvbXBhY3Rwcm90b2NvbCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IHRlc3RidWZmZXJlZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RmcmFtZWR0cmFuc3BvcnQgdGVzdGZyYW1lZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RmcmFtZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGZyYW1lZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RmcmFtZWR0cmFuc3BvcnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RmZHRyYW5zcG9ydCB0ZXN0ZmR0cmFuc3BvcnQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0ZmR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGZkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGZkdHJhbnNwb3J0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0bWVtb3J5YnVmZmVyIHRlc3RtZW1vcnlidWZmZXIuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0bWVtb3J5YnVmZmVyIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RtZW1vcnlidWZmZXIgQ09NTUFORCB0ZXN0bWVtb3J5YnVmZmVyKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0c2ltcGxlc2VydmVyIHRlc3RzaW1wbGVzZXJ2ZXIuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0c2ltcGxlc2VydmVyIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RzaW1wbGVzZXJ2ZXIgQ09NTUFORCB0ZXN0c2ltcGxlc2VydmVyKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0ZGVidWdwcm90byB0ZXN0ZGVidWdwcm90by5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RkZWJ1Z3Byb3RvIHRlc3RnZW5jKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZGVidWdwcm90byBDT01NQU5EIHRlc3RkZWJ1Z3Byb3RvKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0b3B0aW9uYWxyZXF1aXJlZCB0ZXN0b3B0aW9uYWxyZXF1aXJlZC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RvcHRpb25hbHJlcXVpcmVkIHRlc3RnZW5jKQorYWRkX3Rlc3QoTkFNRSB0ZXN0b3B0aW9uYWxyZXF1aXJlZCBDT01NQU5EIHRlc3RvcHRpb25hbHJlcXVpcmVkKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jX2dsaWIiKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdCB0ZXN0dGhyaWZ0dGVzdC5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3QgdGVzdGdlbmMpCithZGRfdGVzdChOQU1FIHRlc3R0aHJpZnR0ZXN0IENPTU1BTkQgdGVzdHRocmlmdHRlc3QpCisKKworaWYoQlVJTERfQ1BQKQorCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworICAgICMgQ3JlYXRlIHRoZSB0aHJpZnQgQysrIHRlc3QgbGlicmFyeQorICAgIHNldCh0ZXN0Z2VuY19jcHBfU09VUkNFUworICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmgKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgKQorCisgICAgYWRkX2xpYnJhcnkodGVzdGdlbmNfY3BwIFNUQVRJQyAke3Rlc3RnZW5jX2NwcF9TT1VSQ0VTfSkKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGdlbmNfY3BwIHRocmlmdCkKKworICAgICNIQUNLOiB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgaW5jbHVkZXMgVGhyaWZ0VGVzdC5oIHdpdGhvdXQgZ2VuLSovIHByZWZpeGVzCisgICAgIyBzbyB3ZSBpbmNsdWRlIGl0IGhlcmUKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY19nbGliIikKKworICAgIGFkZF9leGVjdXRhYmxlKHRlc3R0aHJpZnR0ZXN0Y2xpZW50IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3RjbGllbnQgdGVzdGdlbmMgdGVzdGdlbmNfY3BwICR7WkxJQl9MSUJSQVJJRVN9KQorICAgIGFkZF90ZXN0KE5BTUUgdGVzdHRocmlmdHRlc3RjbGllbnQgQ09NTUFORCB0ZXN0dGhyaWZ0dGVzdGNsaWVudCkKKworZW5kaWYoQlVJTERfQ1BQKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKykKKworIyBUT0RPOiBBZGQgbWVtb3J5IGNoZWNrcyB1c2luZyBjdGVzdF9tZW1jaGVjayBvciBzaW1pbGFyCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvQ29udGFpbmVyVGVzdC50aHJpZnQgYi9saWIvY19nbGliL3Rlc3QvQ29udGFpbmVyVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyYTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9Db250YWluZXJUZXN0LnRocmlmdApAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgVFRlc3QKKwordHlwZWRlZiBsaXN0PHN0cmluZz4gU3RyaW5nTGlzdAordHlwZWRlZiBsaXN0PFN0cmluZ0xpc3Q+IExpc3RTdHJpbmdMaXN0CisKK3N0cnVjdCBDb250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMgeworICAxOiBsaXN0PHN0cmluZz4gU3RyaW5nTGlzdCA9IFsgIkFwYWNoZSIsICJUaHJpZnQiIF07Cit9CisKK3NlcnZpY2UgQ29udGFpbmVyU2VydmljZSB7CisgIHZvaWQgcmVjZWl2ZVN0cmluZ0xpc3QoMTogbGlzdDxzdHJpbmc+IHN0cmluZ0xpc3QpOworICBsaXN0PHN0cmluZz4gcmV0dXJuU3RyaW5nTGlzdCgpOworCisgIGxpc3Q8bGlzdDxzdHJpbmc+PiByZXR1cm5MaXN0U3RyaW5nTGlzdCgpOworICBMaXN0U3RyaW5nTGlzdCByZXR1cm5UeXBlZGVmZExpc3RTdHJpbmdMaXN0KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3ZjJmM2UzLi41ZTlkMmVhCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE2LDIwICsxNiw0MyBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cwogCiBTVUJESVJTID0KIAotQU1fQ1BQRkxBR1MgPSAtZyAtV2FsbCAtSS4uL3NyYyAkKEdMSUJfQ0ZMQUdTKQotQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgQEdDT1ZfTERGTEFHU0AKK0JVSUxUX1NPVVJDRVMgPSBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCiAKLUNGTEFHUyA9IEBHQ09WX0NGTEFHU0AKLUNYWEZMQUdTID0gLWcKK0FNX0NQUEZMQUdTID0gLUkuLi9zcmMgLUkuL2dlbi1jX2dsaWIKK0FNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgXAorCUBHQ09WX0NGTEFHU0AKK0FNX0NYWEZMQUdTID0gJChBTV9DRkxBR1MpCitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAkKE9QRU5TU0xfTElCUykgQEdDT1ZfTERGTEFHU0AKIAogY2hlY2tfUFJPR1JBTVMgPSBcCisgIHRlc3RzZXJpYWxpemF0aW9uIFwKKyAgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIFwKKyAgdGVzdGNvbnRhaW5lcnRlc3QgXAogICB0ZXN0dHJhbnNwb3J0c29ja2V0IFwKKyAgdGVzdHRyYW5zcG9ydHNzbHNvY2tldCBcCiAgIHRlc3RiaW5hcnlwcm90b2NvbCBcCisgIHRlc3Rjb21wYWN0cHJvdG9jb2wgXAogICB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgXAogICB0ZXN0ZnJhbWVkdHJhbnNwb3J0IFwKKyAgdGVzdGZkdHJhbnNwb3J0IFwKICAgdGVzdG1lbW9yeWJ1ZmZlciBcCiAgIHRlc3RzdHJ1Y3QgXAogICB0ZXN0c2ltcGxlc2VydmVyIFwKQEAgLTM4LDcxICs2MSwxMjkgQEAKICAgdGVzdHRocmlmdHRlc3QKIAogaWYgV0lUSF9DUFAKKyAgQlVJTFRfU09VUkNFUyArPSBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCiAgIGNoZWNrX1BST0dSQU1TICs9IHRlc3R0aHJpZnR0ZXN0Y2xpZW50CiBlbmRpZgogCit0ZXN0c2VyaWFsaXphdGlvbl9TT1VSQ0VTID0gdGVzdHNlcmlhbGl6YXRpb24uYwordGVzdHNlcmlhbGl6YXRpb25fTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICBsaWJ0ZXN0Z2VuYy5sYQorCit0ZXN0YXBwbGljYXRpb25leGNlcHRpb25fU09VUkNFUyA9IHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCit0ZXN0YXBwbGljYXRpb25leGNlcHRpb25fTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3N0cnVjdC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KKwordGVzdGNvbnRhaW5lcnRlc3RfU09VUkNFUyA9IHRlc3Rjb250YWluZXJ0ZXN0LmMKK3Rlc3Rjb250YWluZXJ0ZXN0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3N0cnVjdC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvY2Vzc29yLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlci5vIFwKKwkgIGxpYnRlc3RnZW5jLmxhCisKIHRlc3R0cmFuc3BvcnRzb2NrZXRfU09VUkNFUyA9IHRlc3R0cmFuc3BvcnRzb2NrZXQuYwogdGVzdHRyYW5zcG9ydHNvY2tldF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCisKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfU09VUkNFUyA9IHRlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwordGVzdHRyYW5zcG9ydHNzbHNvY2tldF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKIAogdGVzdGJpbmFyeXByb3RvY29sX1NPVVJDRVMgPSB0ZXN0YmluYXJ5cHJvdG9jb2wuYwogdGVzdGJpbmFyeXByb3RvY29sX0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0Y29tcGFjdHByb3RvY29sX1NPVVJDRVMgPSB0ZXN0Y29tcGFjdHByb3RvY29sLmMKK3Rlc3Rjb21wYWN0cHJvdG9jb2xfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KIAogdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwogdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0X0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubwogCiB0ZXN0ZnJhbWVkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKIHRlc3RmcmFtZWR0cmFuc3BvcnRfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKK3Rlc3RmZHRyYW5zcG9ydF9TT1VSQ0VTID0gdGVzdGZkdHJhbnNwb3J0LmMKK3Rlc3RmZHRyYW5zcG9ydF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mZF90cmFuc3BvcnQubwogCiB0ZXN0bWVtb3J5YnVmZmVyX1NPVVJDRVMgPSB0ZXN0bWVtb3J5YnVmZmVyLmMKIHRlc3RtZW1vcnlidWZmZXJfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KIAogdGVzdHN0cnVjdF9TT1VSQ0VTID0gdGVzdHN0cnVjdC5jCiB0ZXN0c3RydWN0X0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCiAKIHRlc3RzaW1wbGVzZXJ2ZXJfU09VUkNFUyA9IHRlc3RzaW1wbGVzZXJ2ZXIuYwogdGVzdHNpbXBsZXNlcnZlcl9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvY2Vzc29yLm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sLm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyLm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvY2Vzc29yLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlci5vCiAKIHRlc3RkZWJ1Z3Byb3RvX1NPVVJDRVMgPSB0ZXN0ZGVidWdwcm90by5jCiB0ZXN0ZGVidWdwcm90b19MREFERCA9IGxpYnRlc3RnZW5jLmxhCiAKIHRlc3RvcHRpb25hbHJlcXVpcmVkX1NPVVJDRVMgPSB0ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCiB0ZXN0b3B0aW9uYWxyZXF1aXJlZF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKICAgICBsaWJ0ZXN0Z2VuYy5sYQogCiB0ZXN0dGhyaWZ0dGVzdF9TT1VSQ0VTID0gdGVzdHRocmlmdHRlc3QuYwotdGVzdHRocmlmdHRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYQordGVzdHRocmlmdHRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuYy5sYSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLm8KK3Rlc3R0aHJpZnR0ZXN0X0NGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS90ZXN0L2NfZ2xpYi9zcmMgLUkuL2dlbi1jX2dsaWIgJChHTElCX0NGTEFHUykKIAogdGVzdHRocmlmdHRlc3RjbGllbnRfU09VUkNFUyA9IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcAogdGVzdHRocmlmdHRlc3RjbGllbnRfQ1BQRkxBR1MgPSAtSS4uLy4uL2NwcC9zcmMgJChCT09TVF9DUFBGTEFHUykgLUkuL2dlbi1jcHAgLUkuLi9zcmMgLUkuL2dlbi1jX2dsaWIgJChHTElCX0NGTEFHUykKQEAgLTExNiw3ICsxOTcsMTAgQEAKIGVuZGlmCiAKIG5vZGlzdF9saWJ0ZXN0Z2VuY19sYV9TT1VSQ0VTID0gXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgXApAQCAtMTI0LDkgKzIwOCwxMyBAQAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oIFwKQEAgLTEzNCw5ICsyMjIsMTEgQEAKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAogbGlidGVzdGdlbmNfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorbGlidGVzdGdlbmNfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtV25vLXVudXNlZC1mdW5jdGlvbgogCiBub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAogICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIFwKQEAgLTE0NywxOCArMjM3LDIyIEBACiAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCiBsaWJ0ZXN0Z2VuY3BwX2xhX0NQUEZMQUdTID0gLUkuLi8uLi9jcHAvc3JjICQoQk9PU1RfQ1BQRkxBR1MpIC1JLi9nZW4tY3BwCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYyBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2Lmg6IC4uLy4uLy4uL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oOiBDb250YWluZXJUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oOiAuLi8uLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QtLmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oIDogLi4vLi4vLi4vdGVzdC9FbnVtVGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAogCi1nZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5oOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CisKK2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogVEVTVFMgPSBcCkBAIC0yMTQsNyArMzA4LDcgQEAKIAkgICAgJHskPF9WQUxHUklORF9MRUFLX09QVFN9ICAuLyQ8CiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jX2dsaWIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jX2dsaWIvKiBnZW4tY3BwLyoKIAogQ0xFQU5GSUxFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqLmJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMjMsMyArMzE3LDggQEAKICAgICAqLmdjbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKi5nY2RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICouZ2NvdgorCitFWFRSQV9ESVNUID0gXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICBDb250YWluZXJUZXN0LnRocmlmdAorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllMzllMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5pdGlhbGl6ZSAodm9pZCkKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0gTlVMTDsKKyAgZ2ludDMyIHR5cGUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVEVSTkFMX0VSUk9SOworICBnY2hhciAqbWVzc2FnZSA9ICJFeGNlcHRpb24gbWVzc2FnZSI7CisgIGdpbnQzMiByZXRyaWV2ZWRfdHlwZSA9IDA7CisgIGdjaGFyICpyZXRyaWV2ZWRfbWVzc2FnZSA9IE5VTEw7CisKKyAgLyogQSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBoYXMgInR5cGUiIGFuZCAibWVzc2FnZSIgcHJvcGVydGllcyB0aGF0IGNhbgorICAgICBiZSBpbml0aWFsaXplZCBhdCBvYmplY3QgY3JlYXRpb24gKi8KKyAgeGNlcHRpb24gPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHhjZXB0aW9uICE9IE5VTEwpOworCisgIC8qIEEgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24ncyBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyaWV2ZWQgKi8KKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZyZXRyaWV2ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSIsICZyZXRyaWV2ZWRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAocmV0cmlldmVkX3R5cGUgPT0gdHlwZSk7CisgIGdfYXNzZXJ0IChyZXRyaWV2ZWRfbWVzc2FnZSAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21wc3RyIChyZXRyaWV2ZWRfbWVzc2FnZSwgPT0sIG1lc3NhZ2UpOworCisgIGdfZnJlZSAocmV0cmlldmVkX21lc3NhZ2UpOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wcm9wZXJ0aWVzX3Rlc3QgKHZvaWQpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CisgIGdpbnQzMiByZXRyaWV2ZWRfdHlwZTsKKworICB4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsKKworI2RlZmluZSBURVNUX1RZUEVfVkFMVUUoX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0cmlldmVkX3R5cGUgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJ0eXBlIiwgX3R5cGUsIE5VTEwpOyAgICAgICAgICAgICAgICAgXAorICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAidHlwZSIsICZyZXRyaWV2ZWRfdHlwZSwgTlVMTCk7ICAgICAgIFwKKyAgZ19hc3NlcnRfY21waW50IChyZXRyaWV2ZWRfdHlwZSwgPT0sIF90eXBlKTsKKworICAvKiBUaGUgInR5cGUiIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gYW55IHZhbGlkIFRocmlmdCBleGNlcHRpb24gdHlwZSAqLworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTik7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9CQURfU0VRVUVOQ0VfSUQpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTUlTU0lOR19SRVNVTFQpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5URVJOQUxfRVJST1IpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfUFJPVE9DT0xfRVJST1IpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9UUkFOU0ZPUk0pOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9QUk9UT0NPTCk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSk7CisKKy8qICJnX3Rlc3RfZXhwZWN0X21lc3NhZ2UiIGlzIHJlcXVpcmVkIGZvciB0aGUgcHJvcGVydHkgcmFuZ2UgdGVzdHMgYmVsb3cgYnV0IGlzCisgICBub3QgcHJlc2VudCBpbiBHTGliIGJlZm9yZSB2ZXJzaW9uIDIuMzQgKi8KKyNpZiAoR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNCwgMCkpCisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sCisgICAgICAgICAgICAgICAgInR5cGUiLCBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogVGhlICJ0eXBlIiBwcm9wZXJ0eSBjYW5ub3QgYmUgc2V0IHRvIGEgdmFsdWUgdG9vIGxvdyAobGVzcyB0aGFuIHplcm8pICovCisgIGdfdGVzdF9leHBlY3RfbWVzc2FnZSAoIkdMaWItR09iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR19MT0dfTEVWRUxfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUqb3V0IG9mIHJhbmdlKnR5cGUqIik7CisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJ0eXBlIiwgLTEsIE5VTEwpOworICBnX3Rlc3RfYXNzZXJ0X2V4cGVjdGVkX21lc3NhZ2VzICgpOworCisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJ0eXBlIiwgJnJldHJpZXZlZF90eXBlLCBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXRyaWV2ZWRfdHlwZSwgIT0sIC0xKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXRyaWV2ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICA9PSwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04pOworCisgIC8qIFRoZSAidHlwZSIgcHJvcGVydHkgY2Fubm90IGJlIHNldCB0byBhIHZhbHVlIHRvbyBoaWdoIChncmVhdGVyIHRoYW4gdGhlCisgICAgIGhpZ2hlc3QgZGVmaW5lZCBleGNlcHRpb24tdHlwZSB2YWx1ZSkgKi8KKyAgZ190ZXN0X2V4cGVjdF9tZXNzYWdlICgiR0xpYi1HT2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHX0xPR19MRVZFTF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSpvdXQgb2YgcmFuZ2UqdHlwZSoiKTsKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgInR5cGUiLCBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX04sIE5VTEwpOworICBnX3Rlc3RfYXNzZXJ0X2V4cGVjdGVkX21lc3NhZ2VzICgpOworCisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJ0eXBlIiwgJnJldHJpZXZlZF90eXBlLCBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXRyaWV2ZWRfdHlwZSwgIT0sIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTik7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgPT0sCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOKTsKKyNlbmRpZgorCisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3Byb3BlcnRpZXNfbWVzc2FnZSAodm9pZCkKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0gTlVMTDsKKyAgZ2NoYXIgKm1lc3NhZ2UgPSAiRXhjZXB0aW9uIG1lc3NhZ2UiOworICBnY2hhciAqcmV0cmlldmVkX21lc3NhZ2U7CisKKyAgeGNlcHRpb24gPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7CisKKyAgLyogVGhlICJtZXNzYWdlIiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgIm1lc3NhZ2UiLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgIm1lc3NhZ2UiLCAmcmV0cmlldmVkX21lc3NhZ2UsIE5VTEwpOworICBnX2Fzc2VydCAocmV0cmlldmVkX21lc3NhZ2UgPT0gTlVMTCk7CisKKyAgLyogVGhlICJtZXNzYWdlIiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIGEgdmFsaWQgc3RyaW5nICovCisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJtZXNzYWdlIiwgbWVzc2FnZSwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJtZXNzYWdlIiwgJnJldHJpZXZlZF9tZXNzYWdlLCBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChzdHJjbXAgKHJldHJpZXZlZF9tZXNzYWdlLCBtZXNzYWdlKSwgPT0sIDApOworCisgIGdfZnJlZSAocmV0cmlldmVkX21lc3NhZ2UpOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YXBwbGljYXRpb25leGNlcHRpb24vQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL0luaXRpYWxpemUiLAorICAgIHRlc3RfaW5pdGlhbGl6ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YXBwbGljYXRpb25leGNlcHRpb24vUHJvcGVydGllcy90ZXN0IiwKKyAgICB0ZXN0X3Byb3BlcnRpZXNfdGVzdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YXBwbGljYXRpb25leGNlcHRpb24vUHJvcGVydGllcy9tZXNzYWdlIiwKKyAgICB0ZXN0X3Byb3BlcnRpZXNfbWVzc2FnZSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzNDg0NmM2Li4xNGY0ZmIwCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKQEAgLTE3LDIyICsxNywzMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKKyAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQorICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCisjaWZkZWYgX19HTElCQ19fCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKwogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaW5jbHVkZSAicHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CiAKICNkZWZpbmUgVEVTVF9CT09MIFRSVUUKICNkZWZpbmUgVEVTVF9CWVRFIDEyMwogI2RlZmluZSBURVNUX0kxNiAxMjM0NQogI2RlZmluZSBURVNUX0kzMiAxMjM0NTY3ODkwCi0jZGVmaW5lIFRFU1RfSTY0IDEyMzQ1Njc4OTAxMjM0NUxMCisjZGVmaW5lIFRFU1RfSTY0IEdfR0lOVDY0X0NPTlNUQU5UICgxMjM0NTY3ODkwMTIzNDUpCiAjZGVmaW5lIFRFU1RfRE9VQkxFIDEyMzQ1Njc4OTAuMTIzCiAjZGVmaW5lIFRFU1RfU1RSSU5HICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgMTIzNDU2Nzg5MCFAIyQlXiYqKCkiCiAjZGVmaW5lIFRFU1RfUE9SVCA1MTE5OQpAQCAtNDEsMTQgKzUwLDE0IEBACiBzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIHN0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIGdpbnQzMgotbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCitteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQogewogICBpZiAodHJhbnNwb3J0X3JlYWRfY291bnQgIT0gdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQKICAgICAgICYmIHRyYW5zcG9ydF9yZWFkX2Vycm9yID09IDApCiAgIHsKICAgICB0cmFuc3BvcnRfcmVhZF9jb3VudCsrOwotICAgIHJldHVybiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwogICB9CiAgIHJldHVybiAtMTsKIH0KQEAgLTY5LDE0ICs3OCwxNSBAQAogICByZXR1cm4gRkFMU0U7CiB9CiAKLSNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZAorI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKICNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSBteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlCi0jaW5jbHVkZSAiLi4vc3JjL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyIKLSN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMiCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAogI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfd3JpdGUKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCk7CiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KTsKIAogc3RhdGljIHZvaWQKIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCkBAIC04NSw3ICs5NSw3IEBACiAKICAgLyogY3JlYXRlIGFuIG9iamVjdCBhbmQgdGhlbiBkZXN0cm95IGl0ICovCiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC05OSwxMSArMTA5LDExIEBACiAgIC8qIGNyZWF0ZSBhIFRocmlmdFRyYW5zcG9ydCAqLwogICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsKLSAgYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLwogICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwotICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAgIC8qIGZldGNoIHRoZSBwcm9wZXJ0aWVzICovCiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAodGVtcCk7CkBAIC0xMjgsNyArMTM4LDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTE0NCw0NyArMTU0LDQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCiAgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlIGVycm9ycyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTE5Miw4ICsyMDMsOCBAQAogICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtMjEwLDcgKzIyMSw3IEBACiAKICAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC0yMjYsMzMgKzIzNywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAogICAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVRyYW5zcG9ydCAqLwogICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKICAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOwotICAgIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogCiAgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC0yNjAsMTIgKzI3MSwxMiBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlX2ZpZWxkX3N0b3AgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CiAKICAgICAvKiB3cml0ZSBhIG1hcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKQEAgLTI3NiwyMSArMjg3LDIxIEBACiAKICAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICAvKiB0ZXN0IDNyZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTMwMCw5ICszMTEsOSBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEwLCBOVUxMKTsKIAogICAgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbGlzdCAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CkBAIC0zMTMsMjcgKzMyNCwyNyBAQAogCiAgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3Igb24gYSBsaXN0ICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogaW52YWxpZCB2ZXJzaW9uICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xLCBOVUxMKSA+IDApOwogCiAgICAgLyogc3ogPiAwIGZvciBhIG1lc3NhZ2UgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKSA+IDApOwogCiAgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDB4ODAwMTAwMDAsIE5VTEwpOwpAQCAtMzQ4LDI2ICszNTksMjYgQEAKICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICJ0ZXN0IiwgTlVMTCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPiAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTM3NSw4ICszODYsOTUgQEAKICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKICAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICpmdCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgY29uc3QgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKworICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgICAgZ19hc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGZ0KTsKKworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIGJpbmFyeSBwcm90b2NvbCAqLworICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGZ0KTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRiKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKQEAgLTM5NSw2ICs0OTMsNyBAQAogICBnaW50NjQgdmFsdWVfNjQgPSAwOwogICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKICAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKICAgZ3VpbnQzMiBsZW4gPSAwOwogICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CkBAIC00MDQsNjEgKzUwMyw2OCBAQAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CiAKLSAgYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7Ci0gIGFzc2VydCAodmFsdWVfYnl0ZSA9IFRFU1RfQllURSk7Ci0gIGFzc2VydCAodmFsdWVfMTYgPSBURVNUX0kxNik7Ci0gIGFzc2VydCAodmFsdWVfMzIgPSBURVNUX0kzMik7Ci0gIGFzc2VydCAodmFsdWVfNjQgPSBURVNUX0k2NCk7Ci0gIGFzc2VydCAodmFsdWVfZG91YmxlID0gVEVTVF9ET1VCTEUpOwotICBhc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7Ci0gIGFzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKIAogICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKICAgZ19mcmVlIChiaW5hcnkpOwogCi0gIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LCAmbGVuLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV8xNiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIApAQCAtNDk2LDcgKzYwMiw3IEBACiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwpAQCAtNTExLDcgKzYxNyw3IEBACiAKICAgLyogdGVzdCBmaXJzdCByZWFkIGVycm9yIG9uIGEgZmllbGQgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKQEAgLTUyMiw3ICs2MjgsNyBAQAogICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTM4LDcgKzY0NCw3IEBACiAgIC8qIHRlc3QgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTQ2LDcgKzY1Miw3IEBACiAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTU1NCw3ICs2NjAsNyBAQAogICAvKiB0ZXN0IDNyZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01NjcsNyArNjczLDcgQEAKICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOwogCiAgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKIApAQCAtNTc3LDcgKzY4Myw3IEBACiAKICAgLyogdGVzdCByZWFkIGZhaWx1cmUgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC01OTksMjMgKzcwNSwyMyBAQAogCiAgIC8qIGJyb2tlbiByZWFkICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKICAgLyogaW52YWxpZCBwcm90b2NvbCB2ZXJzaW9uICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKIAogICAvKiBzeiA+IDAgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKIAogICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CkBAIC02MjMsNyArNzI5LDcgQEAKICAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNjMxLDE5ICs3MzcsMTkgQEAKICAgLyogYnJva2VuIDNyZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsgLyogcmVhZF9zdHJpbmcgZG9lcyB0d28gcmVhZHMgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKIAotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLwogICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZlcnNpb24sIE5VTEwpOwpAQCAtNjUzLDIwICs3NTksMTAxIEBACiAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLCBOVUxMKTsKIAogICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKLSAgLy8gVE9ETzogaW52ZXN0aWdhdGUgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIC8qIFRPRE86IGludmVzdGlnYXRlIGdfb2JqZWN0X3VucmVmICh0YnApOyAqLworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YnAgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvSW5pdGlhbGl6ZSIsIHRlc3RfaW5pdGlhbGl6ZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGZiNDljOGYuLmQwMTgwNmQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwpAQCAtMTcsMjIgKzE3LDIxIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgogCiAjZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9CiAKLSNpbmNsdWRlICIuLi9zcmMvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyIKLQotc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKLXN0YXRpYyBjb25zdCBzaG9ydCBURVNUX1BPUlQgPSA2NDQ0NDsKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIgogCiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKTsKIAogLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBzdGF0aWMgdm9pZApAQCAtNDQsMTAgKzQzLDEwIEBACiAKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAob2JqZWN0KSwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKKwkJInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKKwkJIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC01NywzNSArNTYsNTIgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKIAotICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAorICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCS8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKIAotICAvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCi0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CiAKLSAgLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKwkvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gIGdfZXJyb3JfZnJlZSAoZXJyKTsKLSAgZXJyID0gTlVMTDsKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZApAQCAtOTksNjAgKzExNSw4MSBAQAogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMSBieXRlIGF0IGEgdGltZSAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCS8qIHdyaXRlIDEgYnl0ZSBhdCBhIHRpbWUgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKIAotICAgIC8qIG92ZXJmbG93IHRoZSBidWZmZXIgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMiwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogb3ZlcmZsb3cgdGhlIGJ1ZmZlciAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAyLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEgYnl0ZSBhbmQgZmx1c2ggKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwkvKiB3cml0ZSAxIGJ5dGUgYW5kIGZsdXNoICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyIHdpdGggMiBzeXN0ZW0gY2FsbHMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDMsIE5VTEwpOworCS8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgd2l0aCAyIHN5c3RlbSBjYWxscyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMywgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKICAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNjUsMjEgKzIwMiwyMSBAQAogICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOwogCiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogCiAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCiAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisJCQkgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKLSAgYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCi0gIGFzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgLyogcmVhZCAxIGJ5dGUgKi8KICAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKQEAgLTE5NCwxNSArMjMxLDk0IEBACiAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAorc3RhdGljIHZvaWQKK3Rlc3Rfd3JpdGVfZmFpbCh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgaW50IHBvcnQgPSA1MTE5ODsKKyAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCisKKyAgLyogU0lHUElQRSB3aGVuIHNlbmQgdG8gZGlzY29ubmVjdGVkIHNvY2tldCAqLworICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgICAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKworICAgICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkJICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCisgICAgICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCisJCQkgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgICAgIC8qIGp1c3QgY2xvc2Ugc29ja2V0ICovCisgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKworCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworCS8qIHJlY29nbml6ZSBkaXNjb25uZWN0aW9uICovCisJc2xlZXAoMSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOworCisJLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKKworCS8qIHdyaXRlIDEgYW5kIGZsdXNoICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CisKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0L1dyaXRlRmFpbCIsIHRlc3Rfd3JpdGVfZmFpbCk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNWFkNDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwpAQCAtMCwwICsxLDEyOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKKyAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQorICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgXAorICAgICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworI2lmZGVmIF9fR0xJQkNfXworI2RlZmluZSBfX05PX1NUUklOR19JTkxJTkVTIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisKKyNkZWZpbmUgVEVTVF9CT09MIFRSVUUKKyNkZWZpbmUgVEVTVF9CWVRFIDEyMworI2RlZmluZSBURVNUX0kxNiAxMjM0NQorI2RlZmluZSBURVNUX0kzMiAxMjM0NTY3ODkwCisjZGVmaW5lIFRFU1RfSTY0IDEyMzQ1Njc4OTAxMjM0NQorI2RlZmluZSBURVNUX05JMTYgKC0xMjM0NSkKKyNkZWZpbmUgVEVTVF9OSTMyICgtMTIzNDU2Nzg5MCkKKyNkZWZpbmUgVEVTVF9OSTY0ICgtMTIzNDU2Nzg5MDEyMzQ1KQorI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMworI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgorI2RlZmluZSBURVNUX1BPUlQgNTExOTkKKworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKK2dpbnQzMgorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CisgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKK2dib29sZWFuCitteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBpZiAodHJhbnNwb3J0X3dyaXRlX2NvdW50ICE9IHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID09IDApCisgIHsKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSBteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyIKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpOworCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGFuIG9iamVjdCBhbmQgdGhlbiBkZXN0cm95IGl0ICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplICh2b2lkKQoreworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U29ja2V0ICp0ZW1wID0gTlVMTDsKKworICAvKiBjcmVhdGUgYSBUaHJpZnRUcmFuc3BvcnQgKi8KKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLworICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAvKiBmZXRjaCB0aGUgcHJvcGVydGllcyAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChwcm90b2NvbCksICJ0cmFuc3BvcnQiLCAmdGVtcCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0ZW1wKTsKKworICAvKiBjbGVhbiB1cCBtZW1vcnkgKi8KKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvcnMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGRlbHRhcyAqLworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLCAxLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywgTlVMTCkgPT0gMSk7CisKKyAgICAvKiB0ZXN0IGZpZWxkcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIHN0cnVjdHMgKi8KKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBib29scyAqLworCisgICAgLyogZGVsdGFzICovCisgICAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKworICAgIC8qIG5vIGRlbHRhcyAqLworICAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCB3cml0ZV9maWVsZF9zdG9wICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBOVUxMKSA+IDApOworCisgICAgLyogd3JpdGUgYSBtYXAgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gbWFwLS0tbm90aGluZyB0byBkbyBvbiBvdXIgc2lkZSAqLworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAtMTAsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgc21hbGwgbGlzdC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgYmlnIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGJpZyBsaXN0ICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHhmMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIGxpc3Qgc2l6ZSAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ZjAsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgLTEwLCBOVUxMKTsKKworICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBzbWFsbCBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogaW52YWxpZCBwcm90b2NvbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKworICAgIC8qIGludmFsaWQgdmVyc2lvbiAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAwLCBOVUxMKSA+IDApOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAxLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAidGVzdCIsIE5VTEwpOworCisgICAgLyogYnJva2VuIDJuZCByZWFkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiAzcmQgcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiA0dGggcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID4gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqZnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBjb25zdCBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCisgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOworCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgY29tcGFjdCBwcm90b2NvbCAqLworICAgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoZnQpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAodGMpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwLAorICAgIHppZ3phZ19wMTYgPSAwLCB6aWd6YWdfcDMyID0gMCwgemlnemFnX3A2NCA9IDAsCisgICAgemlnemFnX24xNiA9IDAsIHppZ3phZ19uMzIgPSAwLCB6aWd6YWdfbjY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlX24xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV9uMzIgPSAwOworICBnaW50NjQgdmFsdWVfbjY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9uMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBwYXJ0aWFsIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Yyk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdjaGFyICpzdHJ1Y3RfbmFtZSA9IE5VTEw7CisgIGdjaGFyICpmaWVsZF9uYW1lID0gTlVMTDsKKyAgZ2NoYXIgKm1lc3NhZ2VfbmFtZSA9IE5VTEw7CisgIFRocmlmdFR5cGUgZWxlbWVudF90eXBlLCBrZXlfdHlwZSwgdmFsdWVfdHlwZSwgZmllbGRfdHlwZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdpbnQ4IHZhbHVlID0gMDsKKyAgZ2ludDE2IGZpZWxkX2lkID0gMDsKKyAgZ3VpbnQzMiBzaXplID0gMDsKKyAgZ2ludDMyIHNlcWlkID0gMDsKKyAgZ2ludDggdmVyc2lvbl9hbmRfdHlwZSA9IDA7CisgIGdpbnQ4IHByb3RvY29sX2lkID0gMDsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKworICAvKiB0ZXN0IHN0cnVjdCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmc3RydWN0X25hbWUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KKworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDEpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE2KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNSk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMzApOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gNDYpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDQ3KTsKKyAgZmllbGRfaWQgPSAwOworCisgIC8qIHRlc3QgZmllbGQgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNik7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X25hbWUsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfbmFtZSwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTgpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE5KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTgpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDI1KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gYm9vbHMgKi8KKworICAvKiBkZWx0YXMgKi8KKyAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisKKyAgLyogbm8gZGVsdGFzICovCisgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisKKyAgLyogdGVzdCBmaXJzdCByZWFkIGVycm9yIG9uIGEgZmllbGQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBmaWVsZCBzdG9wICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKworICAvKiB0ZXN0IG1hcCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKworICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3Qgc21hbGwgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IGJpZyBsaXN0IDFzdCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgYmlnIGxpc3QgMm5kIHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiB0ZXN0IHNtYWxsIGxpc3QgMXN0IHdyaXRlIGZhaWx1cmUtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAvKiB0ZXN0IGJpZyBsaXN0IDFzdCB3cml0ZSBmYWlsdXJlLS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgLyogdGVzdCBiaWcgbGlzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIGJyb2tlbiByZWFkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogaW52YWxpZCBwcm90b2NvbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogaW52YWxpZCB2ZXJzaW9uICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKworICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CisKKyAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIGJyb2tlbiAzcmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gNHRoIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAzOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIE5VTEwpOworCisgIC8qIGhhbmRsZSAzcmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsIE5VTEwpOworCisgIC8qIGhhbmRsZSA0dGggd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyICh0YywgJnNlcWlkLCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjcCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDAsCisgICAgemlnemFnX3AxNiA9IDAsIHppZ3phZ19wMzIgPSAwLCB6aWd6YWdfcDY0ID0gMCwKKyAgICB6aWd6YWdfbjE2ID0gMCwgemlnemFnX24zMiA9IDAsIHppZ3phZ19uNjQgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnaW50MTYgdmFsdWVfbjE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlX24zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV9uNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjcCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjcCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV9uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV9uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AxNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMTYgPT0gVEVTVF9OSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24zMiA9PSBURVNUX05JMzIpOworICBnX2Fzc2VydCAodmFsdWVfbjY0ID09IFRFU1RfTkk2NCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDE2ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3AzMiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wNjQgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjE2ID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX24zMiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uNjQgPT0gMyk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Y3ApOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL0luaXRpYWxpemUiLCB0ZXN0X2luaXRpYWxpemUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVQcmltaXRpdmVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVDb21wbGV4VHlwZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfY29tcGxleF90eXBlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL1JlYWRBbmRXcml0ZU1hbnlGcmFtZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmM1MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaCIKKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNkZWZpbmUgVEVTVF9TRVJWRVJfSE9TVE5BTUUgImxvY2FsaG9zdCIKKyNkZWZpbmUgVEVTVF9TRVJWRVJfUE9SVCAgICAgOTA5MAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhlIENvbnRhaW5lclNlcnZpY2UgaGFuZGxlciB3ZSdsbCB1c2UgZm9yIHRlc3RpbmcgKi8KKworR19CRUdJTl9ERUNMUworCitHVHlwZSB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIFwKKyAgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlcikpCisjZGVmaW5lIFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorI2RlZmluZSBJU19URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgSVNfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcykpCisKK3N0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyIHsKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciBwYXJlbnRfaW5zdGFuY2U7CisKKyAgLyogcHJpdmF0ZSAqLworICBHUHRyQXJyYXkgKnN0cmluZ19saXN0OworfTsKK3R5cGVkZWYgc3RydWN0IF9UZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyOworCitzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudF9jbGFzczsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3M7CisKK0dfRU5EX0RFQ0xTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0dfREVGSU5FX1RZUEUgKFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlciwKKyAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIpCisKKy8qIEEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvcGllcyBvZiBzdHJpbmdzIHRvIGEgc3RyaW5nIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9zdHJpbmdfdG9fcHRyX2FycmF5IChncG9pbnRlciBlbGVtZW50LCBncG9pbnRlciBwdHJfYXJyYXkpCit7CisgIGdfcHRyX2FycmF5X2FkZCAoKEdQdHJBcnJheSAqKXB0cl9hcnJheSwgZ19zdHJkdXAgKChnY2hhciAqKWVsZW1lbnQpKTsKK30KKworLyogQWNjZXB0IGEgc3RyaW5nIGxpc3QgZnJvbSB0aGUgY2xpZW50IGFuZCBhcHBlbmQgaXRzIGNvbnRlbnRzIHRvIG91ciBpbnRlcm5hbAorICAgbGlzdCAqLworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmVjZWl2ZV9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdQdHJBcnJheSAqc3RyaW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChpZmFjZSk7CisKKyAgLyogQXBwZW5kIHRoZSBjbGllbnQncyBzdHJpbmdzIHRvIG91ciBvd24gaW50ZXJuYWwgc3RyaW5nIGxpc3QgKi8KKyAgZ19wdHJfYXJyYXlfZm9yZWFjaCAoKEdQdHJBcnJheSAqKXN0cmluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9zdHJpbmdfdG9fcHRyX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJpbmdfbGlzdCk7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogUmV0dXJuIHRoZSBjb250ZW50cyBvZiBvdXIgaW50ZXJuYWwgc3RyaW5nIGxpc3QgdG8gdGhlIGNsaWVudCAqLworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUHRyQXJyYXkgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworCisgIC8qIFJldHVybiAoY29waWVzIG9mKSB0aGUgc3RyaW5ncyBjb250YWluZWQgaW4gb3VyIGxpc3QgKi8KKyAgZ19wdHJfYXJyYXlfZm9yZWFjaCAoc2VsZi0+c3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9zdHJpbmdfdG9fcHRyX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAqX3JldHVybik7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1B0ckFycmF5ICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworICBHUHRyQXJyYXkgKm5lc3RlZF9saXN0OworCisgIC8qIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBvdXIgbGlzdCBvZiBzdHJpbmdzICovCisgIG5lc3RlZF9saXN0CisgICAgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAobmVzdGVkX2xpc3QsIHNlbGYtPnN0cmluZ19saXN0KTsKKyAgZ19wdHJfYXJyYXlfcmVmIChzZWxmLT5zdHJpbmdfbGlzdCk7CisKKyAgZ19wdHJfYXJyYXlfYWRkICgqX3JldHVybiwgbmVzdGVkX2xpc3QpOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0TGlzdFN0cmluZ0xpc3QgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChpZmFjZSk7CisgIFRUZXN0U3RyaW5nTGlzdCAqbmVzdGVkX2xpc3Q7CisKKyAgLyogUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIG91ciBsaXN0IG9mIHN0cmluZ3MgKi8KKyAgbmVzdGVkX2xpc3QKKyAgICA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KWdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChuZXN0ZWRfbGlzdCwgc2VsZi0+c3RyaW5nX2xpc3QpOworICBnX3B0cl9hcnJheV9yZWYgKHNlbGYtPnN0cmluZ19saXN0KTsKKworICBnX3B0cl9hcnJheV9hZGQgKCpfcmV0dXJuLCBuZXN0ZWRfbGlzdCk7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSB7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAob2JqZWN0KTsKKworICAvKiBEZXN0cm95IG91ciBpbnRlcm5hbCBjb250YWluZXJzICovCisgIGdfcHRyX2FycmF5X3VucmVmIChzZWxmLT5zdHJpbmdfbGlzdCk7CisgIHNlbGYtPnN0cmluZ19saXN0ID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAodGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3BhcmVudF9jbGFzcyktPgorICAgIGZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2luaXQgKFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgLyogQ3JlYXRlIG91ciBpbnRlcm5hbCBjb250YWluZXJzICovCisgIHNlbGYtPnN0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX2ZyZWUpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2NsYXNzX2luaXQgKFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzICpwYXJlbnRfY2xhc3MgPQorICAgIFRfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZmluYWxpemU7CisKKyAgcGFyZW50X2NsYXNzLT5yZWNlaXZlX3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmVjZWl2ZV9zdHJpbmdfbGlzdDsKKyAgcGFyZW50X2NsYXNzLT5yZXR1cm5fc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fc3RyaW5nX2xpc3Q7CisgIHBhcmVudF9jbGFzcy0+cmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdDsKKyAgcGFyZW50X2NsYXNzLT5yZXR1cm5fdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCA9CisgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBPdXIgdGVzdCBzZXJ2ZXIsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIHdlIGNhbiBhY2Nlc3MgaXQgd2l0aGluIGEgc2lnbmFsCisgICBoYW5kbGVyICovCitUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IE5VTEw7CisKKy8qIEEgc2lnbmFsIGhhbmRsZXIgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyAodGhlIHRlc3Qgc3VpdGUpIGhhcworICAgZXhpdGVkIHNvIHdlIGtub3cgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIgYW5kIHRlcm1pbmF0ZSBvdXJzZWx2ZXMgKi8KK3N0YXRpYyB2b2lkCitzaWdjaGxkX2hhbmRsZXIgKGludCBzaWduYWxfbnVtYmVyKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2lnbmFsX251bWJlcik7CisKKyAgLyogVGhlIGNoaWxkIHByb2Nlc3MgKHRoZSB0ZXN0cykgaGFzIGV4aXRlZCBvciBiZWVuIHRlcm1pbmF0ZWQ7IHNodXQgZG93biB0aGUKKyAgICAgc2VydmVyIGdyYWNlZnVsbHkgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIHRocmlmdF9zZXJ2ZXJfc3RvcCAoc2VydmVyKTsKK30KKworLyogQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhIHRlc3QgY2FzZSBhZ2FpbnN0IGEgbmV3bHkgY29uc3RydWN0ZWQKKyAgIHNlcnZpY2UgY2xpZW50ICovCitzdGF0aWMgdm9pZAorZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50ICh2b2lkICgqdGVzdF9jYXNlKShUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiopKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbDsKKworICBUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50OworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIC8qIENyZWF0ZSBhIGNsaWVudCB3aXRoIHdoaWNoIHRvIGFjY2VzcyB0aGUgc2VydmVyICovCisgIHNvY2tldCAgICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsIFRFU1RfU0VSVkVSX0hPU1ROQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIFRFU1RfU0VSVkVSX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHByb3RvY29sICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisKKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBFeGVjdXRlIHRoZSB0ZXN0IGFnYWluc3QgdGhpcyBjbGllbnQgKi8KKyAgKCp0ZXN0X2Nhc2UpKGNsaWVudCwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKworICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcnNfd2l0aF9kZWZhdWx0X3ZhbHVlcyAodm9pZCkKK3sKKyAgVFRlc3RDb250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMgKmRlZmF1bHRfdmFsdWVzOworICBHUHRyQXJyYXkgKnN0cmluZ19saXN0OworCisgIC8qIEZldGNoIGEgbmV3IENvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyBzdHJ1Y3QgYW5kIGl0cyBTdHJpbmdMaXN0IG1lbWJlciAqLworICBkZWZhdWx0X3ZhbHVlcyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQ09OVEFJTkVSU19XSVRIX0RFRkFVTFRfVkFMVUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoZGVmYXVsdF92YWx1ZXMsCisgICAgICAgICAgICAgICAgIlN0cmluZ0xpc3QiLCAmc3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsaXN0IGhhcyBiZWVuIHBvcHVsYXRlZCB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlcyAqLworICBnX2Fzc2VydF9jbXBpbnQgKHN0cmluZ19saXN0LT5sZW4sID09LCAyKTsKKyAgZ19hc3NlcnRfY21wc3RyICgoKGdjaGFyICoqKXN0cmluZ19saXN0LT5wZGF0YSlbMF0sID09LCAiQXBhY2hlIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoKChnY2hhciAqKilzdHJpbmdfbGlzdC0+cGRhdGEpWzFdLCA9PSwgIlRocmlmdCIpOworCisgIGdfcHRyX2FycmF5X3VucmVmIChzdHJpbmdfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChkZWZhdWx0X3ZhbHVlcyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0X2lubmVyIChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdjaGFyICp0ZXN0X2RhdGFbXSA9IHsgIm9uZSIsICJ0d28iLCAidGhyZWUiIH07CisKKyAgR1B0ckFycmF5ICpvdXRnb2luZ19zdHJpbmdfbGlzdDsKKyAgR1B0ckFycmF5ICppbmNvbWluZ19zdHJpbmdfbGlzdDsKKyAgZ3VpbnQgaW5kZXg7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworCisgIC8qIFByZXBhcmUgb3VyIHRlc3QgZGF0YSAob3VyIHN0cmluZyBsaXN0IHRvIHNlbmQpICovCisgIG91dGdvaW5nX3N0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3ICgpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAzOyBpbmRleCArPSAxKQorICAgIGdfcHRyX2FycmF5X2FkZCAob3V0Z29pbmdfc3RyaW5nX2xpc3QsICZ0ZXN0X2RhdGFbaW5kZXhdKTsKKworICAvKiBTZW5kIG91ciBkYXRhIHRvIHRoZSBzZXJ2ZXIgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHNhbWUgZGF0YSBiYWNrIG9uCisgICAgIHJldHJpZXZlICovCisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmVjZWl2ZV9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nX3N0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgaW5jb21pbmdfc3RyaW5nX2xpc3QgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmV0dXJuX3N0cmluZ19saXN0IChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5jb21pbmdfc3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgdHdvIGxpc3RzIGFyZSBlcXVpdmFsZW50ICovCisgIGdfYXNzZXJ0X2NtcGludCAoaW5jb21pbmdfc3RyaW5nX2xpc3QtPmxlbiwgPT0sIG91dGdvaW5nX3N0cmluZ19saXN0LT5sZW4pOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpbmNvbWluZ19zdHJpbmdfbGlzdC0+bGVuOyBpbmRleCArPSAxKQorICAgIGdfYXNzZXJ0X2NtcHN0ciAoKChnY2hhciAqKilpbmNvbWluZ19zdHJpbmdfbGlzdC0+cGRhdGEpW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgID09LAorICAgICAgICAgICAgICAgICAgICAgKChnY2hhciAqKilvdXRnb2luZ19zdHJpbmdfbGlzdC0+cGRhdGEpW2luZGV4XSk7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGluY29taW5nX3N0cmluZ19saXN0KTsKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKG91dGdvaW5nX3N0cmluZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3QgKHZvaWQpCit7CisgICAgZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50ICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0X2lubmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdF9pbm5lciAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIEdQdHJBcnJheSAqaW5jb21pbmdfbGlzdDsKKyAgR1B0ckFycmF5ICpuZXN0ZWRfbGlzdDsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisKKyAgLyogUmVjZWl2ZSBhIGxpc3Qgb2Ygc3RyaW5nIGxpc3RzIGZyb20gdGhlIHNlcnZlciAqLworICBpbmNvbWluZ19saXN0ID0KKyAgICBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY29taW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsaXN0IGFuZCBpdHMgY29udGVudHMgYXJlIHZhbGlkICovCisgIGdfYXNzZXJ0X2NtcGludCAoaW5jb21pbmdfbGlzdC0+bGVuLCA+LCAwKTsKKworICBuZXN0ZWRfbGlzdCA9IChHUHRyQXJyYXkgKilnX3B0cl9hcnJheV9pbmRleCAoaW5jb21pbmdfbGlzdCwgMCk7CisgIGdfYXNzZXJ0IChuZXN0ZWRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChuZXN0ZWRfbGlzdC0+bGVuLCA+PSwgMCk7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGluY29taW5nX2xpc3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9saXN0X3N0cmluZ19saXN0ICh2b2lkKQoreworICBleGVjdXRlX3dpdGhfc2VydmljZV9jbGllbnQgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdF9pbm5lcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICpjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUVGVzdExpc3RTdHJpbmdMaXN0ICppbmNvbWluZ19saXN0OworICBUVGVzdFN0cmluZ0xpc3QgKm5lc3RlZF9saXN0OworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKworICAvKiBSZWNlaXZlIGEgbGlzdCBvZiBzdHJpbmcgbGlzdHMgZnJvbSB0aGUgc2VydmVyICovCisgIGluY29taW5nX2xpc3QgPQorICAgIGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KWdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19hc3NlcnQKKyAgICAodF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2NsaWVudF9yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5jb21pbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpICYmCisgICAgICplcnJvciA9PSBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIGxpc3QgYW5kIGl0cyBjb250ZW50cyBhcmUgdmFsaWQgKi8KKyAgZ19hc3NlcnRfY21waW50IChpbmNvbWluZ19saXN0LT5sZW4sID4sIDApOworCisgIG5lc3RlZF9saXN0ID0gKFRUZXN0U3RyaW5nTGlzdCAqKWdfcHRyX2FycmF5X2luZGV4IChpbmNvbWluZ19saXN0LCAwKTsKKyAgZ19hc3NlcnQgKG5lc3RlZF9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKG5lc3RlZF9saXN0LT5sZW4sID49LCAwKTsKKworICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworICBnX3B0cl9hcnJheV91bnJlZiAoaW5jb21pbmdfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3QgKHZvaWQpCit7CisgIGV4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudAorICAgICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgcGlkX3QgcGlkOworICBpbnQgc3RhdHVzOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICAvKiBGb3JrIHRvIHJ1biBvdXIgdGVzdCBzdWl0ZSBpbiBhIGNoaWxkIHByb2Nlc3MgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnRfY21waW50IChwaWQsID49LCAwKTsKKworICBpZiAocGlkID09IDApIHsgICAgLyogVGhlIGNoaWxkIHByb2Nlc3MgKi8KKyAgICAvKiBXYWl0IGEgbW9tZW50IGZvciB0aGUgc2VydmVyIHRvIGZpbmlzaCBzdGFydGluZyAqLworICAgIHNsZWVwICgxKTsKKworICAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1N0cnVjdHMvQ29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzIiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcnNfd2l0aF9kZWZhdWx0X3ZhbHVlcyk7CisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UvU3RyaW5nTGlzdCIsCisgICAgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdCk7CisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UvTGlzdFN0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdCk7CisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UvVHlwZWRlZmRMaXN0U3RyaW5nTGlzdCIsCisgICAgICAgdGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0KTsKKworICAgIC8qIFJ1biB0aGUgdGVzdHMgYW5kIG1ha2UgdGhlIHJlc3VsdCBhdmFpbGFibGUgdG8gb3VyIHBhcmVudCBwcm9jZXNzICovCisgICAgX2V4aXQgKGdfdGVzdF9ydW4gKCkpOworICB9CisgIGVsc2UgeworICAgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKmhhbmRsZXI7CisgICAgVFRlc3RDb250YWluZXJTZXJ2aWNlUHJvY2Vzc29yICpwcm9jZXNzb3I7CisKKyAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7CisgICAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqdHJhbnNwb3J0X2ZhY3Rvcnk7CisgICAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpwcm90b2NvbF9mYWN0b3J5OworCisgICAgc3RydWN0IHNpZ2FjdGlvbiBzaWdjaGxkX2FjdGlvbjsKKworICAgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICAgIGludCBleGl0X3N0YXR1cyA9IDE7CisKKyAgICAvKiBUcmFwIHRoZSBldmVudCBvZiB0aGUgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGluZyBzbyB3ZSBrbm93IHRvIHN0b3AgdGhlCisgICAgICAgc2VydmVyIGFuZCBleGl0ICovCisgICAgbWVtc2V0ICgmc2lnY2hsZF9hY3Rpb24sIDAsIHNpemVvZiAoc2lnY2hsZF9hY3Rpb24pKTsKKyAgICBzaWdjaGxkX2FjdGlvbi5zYV9oYW5kbGVyID0gc2lnY2hsZF9oYW5kbGVyOworICAgIHNpZ2NobGRfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOworICAgIHNpZ2FjdGlvbiAoU0lHQ0hMRCwgJnNpZ2NobGRfYWN0aW9uLCBOVUxMKTsKKworICAgIC8qIENyZWF0ZSBvdXIgdGVzdCBzZXJ2ZXIgKi8KKyAgICBoYW5kbGVyID0gZ19vYmplY3RfbmV3IChUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBwcm9jZXNzb3IgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0NPTlRBSU5FUl9TRVJWSUNFX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1NFUlZFUl9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBzZXJ2ZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl90cmFuc3BvcnQiLCAgICAgICAgIHNlcnZlcl90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSIsICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAvKiBTdGFydCB0aGUgc2VydmVyICovCisgICAgdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoc2VydmVyLCAmZXJyb3IpOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBzZXJ2ZXIgc3RvcHBlZCBvbmx5IGJlY2F1c2UgaXQgd2FzIGludGVycnVwdGVkIChieSB0aGUKKyAgICAgICBjaGlsZCBwcm9jZXNzIHRlcm1pbmF0aW5nKSAqLworICAgIGdfYXNzZXJ0KCFlcnJvciB8fCBnX2Vycm9yX21hdGNoZXMoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCkpOworCisgICAgLyogRnJlZSBvdXIgcmVzb3VyY2VzICovCisgICAgZ19jbGVhcl9vYmplY3QgKCZzZXJ2ZXIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZ0cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnByb2Nlc3Nvcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZoYW5kbGVyKTsKKworICAgIC8qIFdhaXQgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGNvbXBsZXRlIGFuZCByZXR1cm4gaXRzIGV4aXQgc3RhdHVzICovCisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgaWYgKFdJRkVYSVRFRCAoc3RhdHVzKSkKKyAgICAgIGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMgKHN0YXR1cyk7CisKKyAgICByZXR1cm4gZXhpdF9zdGF0dXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKaW5kZXggZjA2NTRmMS4uMTA5YTQ4YiAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKQEAgLTE4LDc1ICsxOCw5MjQgQEAKICAqLwogCiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CiAKICNpZm5kZWYgTV9QSQogI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NQogI2VuZGlmCiAKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorCiAjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIgogCiBzdGF0aWMgdm9pZAotdGVzdF9kZWJ1Z19wcm90byh2b2lkKQordGVzdF9zdHJ1Y3RzX2RvdWJsZXNfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQogewotICBUVGVzdE9uZU9mRWFjaCAqb29lID0gTlVMTDsKLSAgVFRlc3ROZXN0aW5nICpuID0gTlVMTDsKLSAgVFRlc3RIb2x5TW9sZXkgKmhtID0gTlVMTDsKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKIAotICBvb2UgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKLSAgb29lLT5pbV90cnVlID0gVFJVRTsKLSAgb29lLT5pbV9mYWxzZSA9IEZBTFNFOwotICBvb2UtPmFfYml0ZSA9IDB4ZDY7Ci0gIG9vZS0+aW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS0+aW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS0+aW50ZWdlcjY0ID0gKGd1aW50NjQpIDYwMDAgKiAxMDAwICogMTAwMDsKLSAgb29lLT5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLT5zb21lX2NoYXJhY3RlcnMgPSAiRGVidWcgVEhJUyEiOwotICBvb2UtPnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKKyAgLyogQSBEb3VibGVzIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0RPVUJMRVMsIE5VTEwpOwogCi0gIG4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX05FU1RJTkcsIE5VTEwpOwotICBuLT5teV9vb2UgPSBvb2U7Ci0gIG4tPm15X29vZS0+aW50ZWdlcjE2ID0gMTY7Ci0gIG4tPm15X29vZS0+aW50ZWdlcjMyID0gMzI7Ci0gIG4tPm15X29vZS0+aW50ZWdlcjY0ID0gNjQ7Ci0gIG4tPm15X29vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IChzcXJ0KDUuMCkgKyAxKSAvIDI7Ci0gIG4tPm15X29vZS0+c29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLT5teV9vb2UtPnpvbWdfdW5pY29kZSA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCI7Ci0gIG4tPm15X2JvbmstPnR5cGUgPSAzMTMzNzsKLSAgbi0+bXlfYm9uay0+bWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19ET1VCTEVTIChvYmplY3QpKTsKIAotICBobSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7Ci0gIGdfcHRyX2FycmF5X2FkZCAoaG0tPmJpZywgb29lKTsKLSAgZ19wdHJfYXJyYXlfYWRkIChobS0+YmlnLCBuLT5teV9vb2UpOwotICAoKFRUZXN0T25lT2ZFYWNoICopIGdfcHRyX2FycmF5X2luZGV4IChobS0+YmlnLCAwKSktPmFfYml0ZSA9IDB4MjI7Ci0gICgoVFRlc3RPbmVPZkVhY2ggKikgZ19wdHJfYXJyYXlfaW5kZXggKGhtLT5iaWcsIDEpKS0+YV9iaXRlID0gMHgzMzsKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KIAotICBnX2hhc2hfdGFibGVfaW5zZXJ0IChobS0+Y29udGFpbiwgInJhbmRvbSBzdHJpbmciLCAicmFuZG9tIHN0cmluZyIpOworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19kb3VibGVzX2luaXRpYWxpemUgKHZvaWQpCit7CisgIFRUZXN0RG91YmxlcyAqZG91YmxlcyA9IE5VTEw7CisgIGdkb3VibGUgbmFuOworICBnZG91YmxlIGluZjsKKyAgZ2RvdWJsZSBuZWdpbmY7CisgIGdkb3VibGUgcmVwZWF0aW5nOworICBnZG91YmxlIGJpZzsKKyAgZ2RvdWJsZSB0aW55OworICBnZG91YmxlIHplcm87CisgIGdkb3VibGUgbmVnemVybzsKIAorICAvKiBOb3RlIHRoZXJlIHNlZW1zIHRvIGJlIG5vIHdheSB0byBnZXQgbm90LWEtbnVtYmVyICgiTkFOIikgdmFsdWVzIHBhc3QKKyAgICAgR09iamVjdCdzIHJhbmdlLWNoZWNraW5nLCBzbyB0aGF0IHBvcnRpb24gb2YgdGhlIHRlc3QgaGFzIGJlZW4gY29tbWVudGVkCisgICAgIG91dCBiZWxvdy4gKi8KKworICAvKiBBIERvdWJsZXMgc3RydWN0dXJlJ3MgbWVtYmVycyBhcmUgYXZhaWxhYmxlIGFzIEdPYmplY3QgcHJvcGVydGllcworICAgICB0aGF0IGNhbiBiZSBpbml0aWFsaXplZCBhdCBjb25zdHJ1Y3Rpb24uLi4gKi8KKyAgZG91YmxlcyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfRE9VQkxFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIm5hbiIsICAgICAgMCAqIElORklOSVRZLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5mIiwgICAgICAgICAgSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdpbmYiLCAgICAgIC1JTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGluZyIsICAgICAxLjAgLyAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYmlnIiwgICAgICAgR19NQVhET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW55IiwgICAgICAgICAgMTBFLTEwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInplcm8iLCAgICAgICAgICAxLjAgKiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnemVybyIsICAgICAgLTEuMCAqIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChkb3VibGVzICE9IE5VTEwpOworCisgIC8qIC4uLmFuZCBsYXRlciByZXRyaWV2ZWQgKi8KKyAgZ19vYmplY3RfZ2V0IChkb3VibGVzLAorICAgICAgICAgICAgICAgICJuYW4iLCAgICAgICAmbmFuLAorICAgICAgICAgICAgICAgICJpbmYiLCAgICAgICAmaW5mLAorICAgICAgICAgICAgICAgICJuZWdpbmYiLCAgICAmbmVnaW5mLAorICAgICAgICAgICAgICAgICJyZXBlYXRpbmciLCAmcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICJiaWciLCAgICAgICAmYmlnLAorICAgICAgICAgICAgICAgICJ0aW55IiwgICAgICAmdGlueSwKKyAgICAgICAgICAgICAgICAiemVybyIsICAgICAgJnplcm8sCisgICAgICAgICAgICAgICAgIm5lZ3plcm8iLCAgICZuZWd6ZXJvLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIGdfYXNzZXJ0X2NtcGludCAoaXNuYW4gKG5hbiksICAgICE9LCAgMCk7ICovCisgIGdfYXNzZXJ0X2NtcGludCAoaXNpbmYgKGluZiksICAgID09LCAgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoaXNpbmYgKG5lZ2luZiksID09LCAtMSk7CisKKyAgZ19hc3NlcnRfY21wZmxvYXQgKHJlcGVhdGluZywgPT0sICAgICAxLjAgLyAzKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKGJpZywgICAgICAgPT0sIEdfTUFYRE9VQkxFKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKHRpbnksICAgICAgPT0sICAgICAxMEUtMTAxKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKHplcm8sICAgICAgPT0sICAgICAxLjAgKiAwKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKG5lZ3plcm8sICAgPT0sICAgIC0xLjAgKiAwKTsKKworICBnX29iamVjdF91bnJlZiAoZG91Ymxlcyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgT25lT2ZFYWNoIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX09ORV9PRl9FQUNIIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2luaXRpYWxpemVfZGVmYXVsdF92YWx1ZXMgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaCA9IE5VTEw7CisgIGdpbnQgICBhX2JpdGU7CisgIGdpbnQgICBpbnRlZ2VyMTY7CisgIGdpbnQ2NCBpbnRlZ2VyNjQ7CisgIEdBcnJheSAqYnl0ZV9saXN0OworICBHQXJyYXkgKmkxNl9saXN0OworICBHQXJyYXkgKmk2NF9saXN0OworCisgIC8qIEEgT25lT2ZFYWNoIHN0cnVjdHVyZSBjcmVhdGVkIHdpdGggbm8gZXhwbGljaXQgcHJvcGVydHkgdmFsdWVzCisgICAgIHdpbGwgaG9sZCB0aGUgZGVmYXVsdCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSAudGhyaWZ0IGZpbGUgKi8KKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAmaW50ZWdlcjY0LAorICAgICAgICAgICAgICAgICJieXRlX2xpc3QiLCAmYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAmaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICZpNjRfbGlzdCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGFfYml0ZSwgICAgPT0sIDB4N2YpOworICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXIxNiwgPT0sIDB4N2ZmZik7CisgIGdfYXNzZXJ0X2NtcGludCAoaW50ZWdlcjY0LCA9PSwgR19HSU5UNjRfQ09OU1RBTlQgKDEwMDAwMDAwMDAwKSk7CisKKyAgZ19hc3NlcnQgKGJ5dGVfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChieXRlX2xpc3QtPmxlbiwgPT0sIDMpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGJ5dGVfbGlzdCwgZ2ludDgsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoYnl0ZV9saXN0LCBnaW50OCwgMSksID09LCAyKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChieXRlX2xpc3QsIGdpbnQ4LCAyKSwgPT0sIDMpOworCisgIGdfYXNzZXJ0IChpMTZfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChpMTZfbGlzdC0+bGVuLCA9PSwgMyk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTE2X2xpc3QsIGdpbnQxNiwgMCksID09LCAxKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpMTZfbGlzdCwgZ2ludDE2LCAxKSwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGkxNl9saXN0LCBnaW50MTYsIDIpLCA9PSwgMyk7CisKKyAgZ19hc3NlcnQgKGk2NF9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGk2NF9saXN0LT5sZW4sID09LCAzKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpNjRfbGlzdCwgZ2ludDY0LCAwKSwgPT0sIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGk2NF9saXN0LCBnaW50NjQsIDEpLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTY0X2xpc3QsIGdpbnQ2NCwgMiksID09LCAzKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoYnl0ZV9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX3NwZWNpZmllZF92YWx1ZXMgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBnaW50OCBpbml0aWFsX2J5dGVfbGlzdFs1XSA9IHsgMTMsIDIxLCAzNCwgNTUsIDg5IH07CisgIHN0YXRpYyBjb25zdCBnaW50MTYgaW5pdGlhbF9pMTZfbGlzdFs1XSA9IHsgNDE4MSwgNjc2NSwgMTA5NDYsIDE3NzExLCAyODY1NyB9OworICBzdGF0aWMgY29uc3QgZ2ludDY0IGluaXRpYWxfaTY0X2xpc3RbNV0gPQorICAgIHsKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgxMTAwMDg3Nzc4MzY2MTAxOTMxKSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgxNzc5OTc5NDE2MDA0NzE0MTg5KSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgyODgwMDY3MTk0MzcwODE2MTIwKSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICg0NjYwMDQ2NjEwMzc1NTMwMzA5KSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICg3NTQwMTEzODA0NzQ2MzQ2NDI5KQorICAgIH07CisgIHN0YXRpYyBjb25zdCBndWludDggaW5pdGlhbF9iYXNlNjRbOF0gPQorICAgIHsKKyAgICAgIDB4NTYsIDB4NDcsIDB4NjgsIDB4NzksIDB4NjEsIDB4NTcsIDB4NWEsIDB4MzAKKyAgICB9OworCisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgZ2Jvb2xlYW4gaW1fdHJ1ZTsKKyAgZ2Jvb2xlYW4gaW1fZmFsc2U7CisgIGdpbnQgYV9iaXRlOworICBnaW50IGludGVnZXIxNjsKKyAgZ2ludCBpbnRlZ2VyMzI7CisgIGdpbnQ2NCBpbnRlZ2VyNjQ7CisgIGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uOworICBnY2hhciAqc29tZV9jaGFyYWN0ZXJzOworICBnY2hhciAqem9tZ191bmljb2RlOworICBnYm9vbGVhbiB3aGF0X3dobzsKKyAgR0J5dGVBcnJheSAqYmFzZTY0OworICBHQXJyYXkgKmJ5dGVfbGlzdDsKKyAgR0FycmF5ICppMTZfbGlzdDsKKyAgR0FycmF5ICppNjRfbGlzdDsKKworICBiYXNlNjQgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2J5dGVfYXJyYXlfYXBwZW5kIChiYXNlNjQsIGluaXRpYWxfYmFzZTY0LCA4KTsKKworICBieXRlX2xpc3QgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGdpbnQ4KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGJ5dGVfbGlzdCwgaW5pdGlhbF9ieXRlX2xpc3QsIDUpOworCisgIGkxNl9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50MTYpKTsKKyAgZ19hcnJheV9hcHBlbmRfdmFscyAoaTE2X2xpc3QsIGluaXRpYWxfaTE2X2xpc3QsIDUpOworCisgIGk2NF9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50NjQpKTsKKyAgZ19hcnJheV9hcHBlbmRfdmFscyAoaTY0X2xpc3QsIGluaXRpYWxfaTY0X2xpc3QsIDUpOworCisgIC8qIEFsbCBvZiBPbmVPZkVhY2gncyBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgYXQgY29uc3RydWN0aW9uLi4uICovCisgIG9uZV9vZl9lYWNoID0KKyAgICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgImltX3RydWUiLCAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAgICAgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgMHg3ZTU3LAorICAgICAgICAgICAgICAgICAgImludGVnZXIzMiIsICAgICAgICAweGRlYWRiZWVmLAorICAgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSwKKyAgICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgTV9QSSwKKyAgICAgICAgICAgICAgICAgICJzb21lX2NoYXJhY3RlcnMiLCAgIkRlYnVnIFRISVMhIiwKKyAgICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgIlx4ZDdcblxhXHQiLAorICAgICAgICAgICAgICAgICAgIndoYXRfd2hvIiwgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgImJhc2U2NCIsICAgICAgICAgICBiYXNlNjQsCisgICAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgICAgICAgIGJ5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTY0X2xpc3QiLCAgICAgICAgIGk2NF9saXN0LAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGk2NF9saXN0ID0gTlVMTDsKKyAgZ19hcnJheV91bnJlZiAoaTE2X2xpc3QpOworICBpMTZfbGlzdCA9IE5VTEw7CisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGJ5dGVfbGlzdCA9IE5VTEw7CisgIGdfYnl0ZV9hcnJheV91bnJlZiAoYmFzZTY0KTsKKyAgYmFzZTY0ID0gTlVMTDsKKworICAvKiAuLi5hbmQgbGF0ZXIgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsCisgICAgICAgICAgICAgICAgImltX3RydWUiLCAgICAgICAgICAmaW1fdHJ1ZSwKKyAgICAgICAgICAgICAgICAiaW1fZmFsc2UiLCAgICAgICAgICZpbV9mYWxzZSwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICAgICAgICAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgJmludGVnZXIzMiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgICAgICAgICZpbnRlZ2VyNjQsCisgICAgICAgICAgICAgICAgImRvdWJsZV9wcmVjaXNpb24iLCAmZG91YmxlX3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICZzb21lX2NoYXJhY3RlcnMsCisgICAgICAgICAgICAgICAgInpvbWdfdW5pY29kZSIsICAgICAmem9tZ191bmljb2RlLAorICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgJndoYXRfd2hvLAorICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgJmJhc2U2NCwKKyAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgICAgICAgICZieXRlX2xpc3QsCisgICAgICAgICAgICAgICAgImkxNl9saXN0IiwgICAgICAgICAmaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICAmaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGltX3RydWUgID09IFRSVUUpOworICBnX2Fzc2VydCAoaW1fZmFsc2UgPT0gRkFMU0UpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg3ZTU3KTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMzIsID09LCAoZ2ludDMyKTB4ZGVhZGJlZWYpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgweGZhMTVlZmFjYWRlMTViYWQpKTsKKworICBnX2Fzc2VydF9jbXBmbG9hdCAoZG91YmxlX3ByZWNpc2lvbiwgPT0sIE1fUEkpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoc29tZV9jaGFyYWN0ZXJzLCA9PSwgIkRlYnVnIFRISVMhIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoem9tZ191bmljb2RlLCAgICA9PSwgIlx4ZDdcblxhXHQiKTsKKworICBnX2Fzc2VydCAod2hhdF93aG8gPT0gVFJVRSk7CisKKyAgZ19hc3NlcnRfY21waW50IChiYXNlNjQtPmxlbiwgPT0sIDgpOworICBnX2Fzc2VydF9jbXBpbnQgKG1lbWNtcCAoYmFzZTY0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9iYXNlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogc2l6ZW9mIChndWludDgpKSwgPT0sIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoYnl0ZV9saXN0LT5sZW4sID09LCA1KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGJ5dGVfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAqIHNpemVvZiAoZ2ludDgpKSwgID09LCAwKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGkxNl9saXN0LT5sZW4sID09LCA1KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGkxNl9saXN0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pMTZfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBzaXplb2YgKGdpbnQxNikpLCA9PSwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChpNjRfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChpNjRfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICogc2l6ZW9mIChnaW50NjQpKSwgPT0sIDApOworCisgIGdfYXJyYXlfdW5yZWYgKGk2NF9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoaTE2X2xpc3QpOworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJhc2U2NCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2J5dGVfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmJ5dGVfbGlzdCA9IE5VTEw7CisKKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICAvKiBPbmVPZkVhY2gncyAiYnl0ZV9saXN0IiBtZW1iZXIgaXMgYSBsaXN0IHRoYXQgaG9sZHMgZWlnaHQtYml0LXdpZGUgaW50ZWdlcgorICAgICB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImJ5dGVfbGlzdCIsICZieXRlX2xpc3QsIE5VTEwpOworCisgIGdfYXNzZXJ0IChieXRlX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChieXRlX2xpc3QpLCA9PSwgc2l6ZW9mIChnaW50OCkpOworCisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pMTZfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmkxNl9saXN0ID0gTlVMTDsKKworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsIE5VTEwpOworCisgIC8qIE9uZU9mRWFjaCdzICJpMTZfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIHNpeHRlZW4tYml0LXdpZGUgaW50ZWdlcgorICAgICB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImkxNl9saXN0IiwgJmkxNl9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoaTE2X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChpMTZfbGlzdCksID09LCBzaXplb2YgKGdpbnQxNikpOworCisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2k2NF9saXN0ICh2b2lkKQoreworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2g7CisgIEdBcnJheSAqaTY0X2xpc3QgPSBOVUxMOworCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgLyogT25lT2ZFYWNoJ3MgImk2NF9saXN0IiBtZW1iZXIgaXMgYSBsaXN0IHRoYXQgaG9sZHMgc2l4dHktZm91ci1iaXQtd2lkZQorICAgICBpbnRlZ2VyIHZhbHVlcyAqLworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLCAiaTY0X2xpc3QiLCAmaTY0X2xpc3QsIE5VTEwpOworCisgIGdfYXNzZXJ0IChpNjRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2dldF9lbGVtZW50X3NpemUgKGk2NF9saXN0KSwgPT0sIHNpemVvZiAoZ2ludDY0KSk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgTmVzdGluZyBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX05FU1RJTkcgKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X2JvbmsgKHZvaWQpCit7CisgIFRUZXN0TmVzdGluZyAqbmVzdGluZzsKICAgVFRlc3RCb25rICpib25rID0gTlVMTDsKLSAgYm9uayA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQk9OSywgTlVMTCk7Ci0gIEdQdHJBcnJheSAqYm9ua3MgPSBnX3B0cl9hcnJheV9uZXcgKCk7Ci0gIGdfcHRyX2FycmF5X2FkZCAoYm9ua3MsIGJvbmspOwotICBnX2hhc2hfdGFibGVfaW5zZXJ0IChobS0+Ym9ua3MsICJub3RoaW5nIiwgYm9ua3MpOworICBnaW50IHR5cGU7CisgIGdjaGFyICptZXNzYWdlOwogCi0gIGdfcHRyX2FycmF5X2ZyZWUgKGJvbmtzLCBUUlVFKTsKKyAgbmVzdGluZyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgLyogTmVzdGluZydzICJteV9ib25rIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldywgZGVmYXVsdCBCb25rIG9iamVjdAorICAgICBkdXJpbmcgY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfQk9OSyAoYm9uaykpOworCisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMCk7CisgIGdfYXNzZXJ0IChtZXNzYWdlID09IE5VTEwpOworCiAgIGdfb2JqZWN0X3VucmVmIChib25rKTsKLSAgZ19vYmplY3RfdW5yZWYgKG9vZSk7Ci0gIGdfb2JqZWN0X3VucmVmIChuKTsKLSAgZ19vYmplY3RfdW5yZWYgKGhtKTsKKyAgYm9uayA9IE5VTEw7CiAKLSAgcmV0dXJuIDA7CisgIC8qIEl0IGNhbiBiZSByZXBsYWNlZC4uLiAqLworICBib25rID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CT05LLAorICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAiUmVwbGFjZW1lbnQgQm9uayIsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9zZXQgKG5lc3RpbmcsICJteV9ib25rIiwgYm9uaywgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChib25rKTsKKyAgYm9uayA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfYm9uayIsICZib25rLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9uayAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19CT05LIChib25rKSk7CisKKyAgZ19vYmplY3RfZ2V0IChib25rLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgJnR5cGUsCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKHR5cGUsID09LCAxMDApOworICBnX2Fzc2VydF9jbXBzdHIgKG1lc3NhZ2UsID09LCAiUmVwbGFjZW1lbnQgQm9uayIpOworCisgIGdfZnJlZSAobWVzc2FnZSk7CisgIGdfb2JqZWN0X3VucmVmIChib25rKTsKKyAgYm9uayA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIG51bGwgKi8KKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfYm9uayIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9ib25rIiwgJmJvbmssIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChuZXN0aW5nKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19uZXN0aW5nX3Byb3BlcnRpZXNfbXlfb29lICh2b2lkKQoreworICBUVGVzdE5lc3RpbmcgKm5lc3Rpbmc7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaCA9IE5VTEw7CisgIGdpbnQgYV9iaXRlOworICBnaW50IGludGVnZXIxNjsKKworICBuZXN0aW5nID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKKworICAvKiBOZXN0aW5nJ3MgIm15X29vZSIgbWVtYmVyIGlzIGluaXRpYWxpemVkIHdpdGggYSBuZXcsIGRlZmF1bHQgT25lT2ZFYWNoCisgICAgIG9iamVjdCBkdXJpbmcgY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X29vZSIsICZvbmVfb2ZfZWFjaCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9uZV9vZl9lYWNoICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX09ORV9PRl9FQUNIIChvbmVfb2ZfZWFjaCkpOworCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICZpbnRlZ2VyMTYsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waGV4IChhX2JpdGUsICAgID09LCAweDdmKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMTYsID09LCAweDdmZmYpOworCisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7CisgIG9uZV9vZl9lYWNoID0gTlVMTDsKKworICAvKiBJdCBjYW4gYmUgcmVwbGFjZWQuLi4gKi8KKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgIDB4NTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgMHg1MDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X29vZSIsIG9uZV9vZl9lYWNoLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKKyAgb25lX29mX2VhY2ggPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X29vZSIsICZvbmVfb2ZfZWFjaCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9uZV9vZl9lYWNoICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX09ORV9PRl9FQUNIIChvbmVfb2ZfZWFjaCkpOworCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICZpbnRlZ2VyMTYsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waGV4IChhX2JpdGUsICAgID09LCAweDUwKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMTYsID09LCAweDUwNTApOworCisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7CisgIG9uZV9vZl9lYWNoID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gbnVsbCAqLworICBnX29iamVjdF9zZXQgKG5lc3RpbmcsICJteV9vb2UiLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfb29lIiwgJm9uZV9vZl9lYWNoLCBOVUxMKTsKKworICBnX2Fzc2VydCAob25lX29mX2VhY2ggPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG5lc3RpbmcpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgSG9seU1vbGV5IHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfSE9MWV9NT0xFWSAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYmlnICh2b2lkKQoreworICBUVGVzdEhvbHlNb2xleSAqaG9seV9tb2xleTsKKyAgR1B0ckFycmF5ICpiaWcgPSBOVUxMOworICBnaW50IGFfYml0ZSA9IDA7CisgIGdpbnQgaW50ZWdlcjE2ID0gMDsKKworICBob2x5X21vbGV5ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9IT0xZX01PTEVZLCBOVUxMKTsKKworICAvKiBBIEhvbHlNb2xleSdzICJiaWciIG1lbWJlciBpcyBpcyBpbml0aWFsaXplZCBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJpZyAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChiaWctPmxlbiwgPT0sIDApOworCisgIC8qIEl0IGNhbiBiZSBtb2RpZmllZC4uLiAqLworICBnX3B0cl9hcnJheV9hZGQgKGJpZywKKyAgICAgICAgICAgICAgICAgICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgIDB4NTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgMHg1MDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworCisgIGdfcHRyX2FycmF5X3VucmVmIChiaWcpOworICBiaWcgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYmlnLT5sZW4sID09LCAxKTsKKyAgZ19vYmplY3RfZ2V0IChnX3B0cl9hcnJheV9pbmRleCAoYmlnLCAwKSwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4NTA1MCk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgLyogLi4ucmVwbGFjZWQuLi4gKi8KKyAgYmlnID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX29iamVjdF91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAoYmlnLAorICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgMHg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAweDE1NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisKKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYmlnIiwgYmlnLCBOVUxMKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJiaWciLCAmYmlnLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJpZy0+bGVuLCA9PSwgMSk7CisgIGdfb2JqZWN0X2dldCAoZ19wdHJfYXJyYXlfaW5kZXggKGJpZywgMCksCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICZpbnRlZ2VyMTYsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waGV4IChhX2JpdGUsICAgID09LCAweDY0KTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMTYsID09LCAweDE1NDEpOworCisgIGdfcHRyX2FycmF5X3VucmVmIChiaWcpOworICBiaWcgPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImJpZyIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJiaWciLCAmYmlnLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYmlnID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChob2x5X21vbGV5KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfY29udGFpbiAodm9pZCkKK3sKKyAgc3RhdGljIGdjaGFyICpzdHJpbmdzWzJdID0geyAiQXBhY2hlIiwgIlRocmlmdCIgfTsKKworICBUVGVzdEhvbHlNb2xleSAqaG9seV9tb2xleTsKKyAgR0hhc2hUYWJsZSAqY29udGFpbiA9IE5VTEw7CisgIEdQdHJBcnJheSAqc3RyaW5nX2xpc3Q7CisgIEdMaXN0ICprZXlfbGlzdDsKKworICBob2x5X21vbGV5ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9IT0xZX01PTEVZLCBOVUxMKTsKKworICAvKiBBIEhvbHlNb2xleSdzICJjb250YWluIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgb24gY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCAmY29udGFpbiwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGNvbnRhaW4gIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGNvbnRhaW4pLCA9PSwgMCk7CisKKyAgLyogSXQgY2FuIGJlIG1vZGlmaWVkLi4uICovCisgIHN0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3ICgpOworICBnX3B0cl9hcnJheV9hZGQgKHN0cmluZ19saXN0LCBzdHJpbmdzWzBdKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChzdHJpbmdfbGlzdCwgc3RyaW5nc1sxXSk7CisKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29udGFpbiwgc3RyaW5nX2xpc3QsIE5VTEwpOworICBzdHJpbmdfbGlzdCA9IE5VTEw7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChjb250YWluKTsKKyAgY29udGFpbiA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChjb250YWluKSwgPT0sIDEpOworCisgIGtleV9saXN0ID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChjb250YWluKTsKKyAgc3RyaW5nX2xpc3QgPSBnX2xpc3RfbnRoX2RhdGEgKGtleV9saXN0LCAwKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKHN0cmluZ19saXN0LT5sZW4sID09LCAyKTsKKyAgZ19hc3NlcnRfY21wc3RyIChnX3B0cl9hcnJheV9pbmRleCAoc3RyaW5nX2xpc3QsIDApLCA9PSwgIkFwYWNoZSIpOworICBnX2Fzc2VydF9jbXBzdHIgKGdfcHRyX2FycmF5X2luZGV4IChzdHJpbmdfbGlzdCwgMSksID09LCAiVGhyaWZ0Iik7CisKKyAgZ19saXN0X2ZyZWUgKGtleV9saXN0KTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChjb250YWluKTsKKyAgY29udGFpbiA9IE5VTEw7CisKKyAgLyogLi4ucmVwbGFjZWQuLi4gKi8KKyAgY29udGFpbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19kaXJlY3RfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgY29udGFpbiwgTlVMTCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCAmY29udGFpbiwgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoY29udGFpbiksID09LCAwKTsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCAmY29udGFpbiwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGNvbnRhaW4gPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGhvbHlfbW9sZXkpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19ib25rcyAodm9pZCkKK3sKKyAgVFRlc3RIb2x5TW9sZXkgKmhvbHlfbW9sZXk7CisgIEdIYXNoVGFibGUgKmJvbmtzID0gTlVMTDsKKyAgR1B0ckFycmF5ICpib25rX2xpc3QgPSBOVUxMOworICBUVGVzdEJvbmsgKmJvbmsgPSBOVUxMOworICBnaW50IHR5cGU7CisgIGdjaGFyICptZXNzYWdlOworICBHTGlzdCAqa2V5X2xpc3Q7CisKKyAgaG9seV9tb2xleSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgLyogQSBIb2x5TW9sZXkncyAiYm9ua3MiIG1lbWJlciBpcyBpbml0aWFsaXplZCBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rcyAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoYm9ua3MpLCA9PSwgMCk7CisKKyAgLyogSXQgY2FuIGJlIG1vZGlmaWVkLi4uICovCisgIGJvbmsgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JPTkssCisgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICJTYW1wbGUgQm9uayIsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBib25rX2xpc3QgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKGdfb2JqZWN0X3VucmVmKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChib25rX2xpc3QsIGJvbmspOworICBib25rID0gTlVMTDsKKworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChib25rcywgZ19zdHJkdXAgKCJTYW1wbGUgQm9ua3MiKSwgYm9ua19saXN0KTsKKyAgYm9ua19saXN0ID0gTlVMTDsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKGJvbmtzKTsKKyAgYm9ua3MgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJvbmtzIiwgJmJvbmtzLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChib25rcyksID09LCAxKTsKKworICBrZXlfbGlzdCA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoYm9ua3MpOworICBib25rX2xpc3QgPSBnX2hhc2hfdGFibGVfbG9va3VwIChib25rcywgZ19saXN0X250aF9kYXRhIChrZXlfbGlzdCwgMCkpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYm9ua19saXN0LT5sZW4sID09LCAxKTsKKworICBib25rID0gKGdfcHRyX2FycmF5X2luZGV4IChib25rX2xpc3QsIDApKTsKKyAgZ19vYmplY3RfZ2V0IChib25rLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgJnR5cGUsCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKHR5cGUsID09LCAxMDApOworICBnX2Fzc2VydF9jbXBzdHIgKG1lc3NhZ2UsID09LCAiU2FtcGxlIEJvbmsiKTsKKworICBib25rID0gTlVMTDsKKyAgZ19mcmVlIChtZXNzYWdlKTsKKyAgZ19saXN0X2ZyZWUgKGtleV9saXN0KTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICAvKiAuLi5yZXBsYWNlZC4uLiAqLworICBib25rcyA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19zdHJfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfc3RyX2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZik7CisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImJvbmtzIiwgYm9ua3MsIE5VTEwpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGJvbmtzKTsKKyAgYm9ua3MgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJvbmtzIiwgJmJvbmtzLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChib25rcyksID09LCAwKTsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKGJvbmtzKTsKKyAgYm9ua3MgPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImJvbmtzIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJvbmtzIiwgJmJvbmtzLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9ua3MgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGhvbHlfbW9sZXkpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2VtcHR5ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBHUGFyYW1TcGVjICoqcHJvcGVydGllczsKKyAgZ3VpbnQgcHJvcGVydHlfY291bnQ7CisKKyAgLyogQW4gRW1wdHkgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfRU1QVFksIE5VTEwpOworCisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRU1QVFkgKG9iamVjdCkpOworCisgIC8qIEFuIEVtcHR5IHN0cnVjdHVyZSBoYXMgbm8gbWVtYmVycyBhbmQgdGh1cyBubyBwcm9wZXJ0aWVzICovCisgIHByb3BlcnRpZXMgPSBnX29iamVjdF9jbGFzc19saXN0X3Byb3BlcnRpZXMgKEdfT0JKRUNUX0dFVF9DTEFTUyAob2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X2NvdW50KTsKKyAgZ19hc3NlcnRfY21waW50IChwcm9wZXJ0eV9jb3VudCwgPT0sIDApOworICBnX2ZyZWUgKHByb3BlcnRpZXMpOworCisgIC8qIEFuIEVtcHR5IHN0cnVjdHVyZSBjYW4gYmUgZGVzdHJveWVkICAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c193cmFwcGVyX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIFdyYXBwZXIgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfRU1QVFksIE5VTEwpOworCisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRU1QVFkgKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX3dyYXBwZXJfcHJvcGVydGllc19mb28gKHZvaWQpIHsKKyAgVFRlc3RXcmFwcGVyICp3cmFwcGVyOworICBUVGVzdEVtcHR5ICpmb287CisKKyAgd3JhcHBlciA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfV1JBUFBFUiwgTlVMTCk7CisKKyAgLyogQSBXcmFwcGVyIHN0cnVjdHVyZSBoYXMgb25lIG1lbWJlciwgImZvbyIsIHdoaWNoIGlzIGFuIEVtcHR5CisgICAgIHN0cnVjdHVyZSBpbml0aWFsaXplZCBkdXJpbmcgY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAod3JhcHBlciwgImZvbyIsICZmb28sIE5VTEwpOworCisgIGdfYXNzZXJ0IChmb28gIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRU1QVFkgKGZvbykpOworCisgIGdfb2JqZWN0X3VucmVmIChmb28pOworICBmb28gPSBOVUxMOworCisgIC8qIEEgV3JhcHBlcidzIGZvbyBwcm9wZXJ0eSBjYW4gYmUgcmVwbGFjZWQuLi4gKi8KKyAgZm9vID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9FTVBUWSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAod3JhcHBlciwgImZvbyIsIGZvbywgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGZvbyk7CisgIGZvbyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0ICh3cmFwcGVyLCAiZm9vIiwgJmZvbywgTlVMTCk7CisgIGdfYXNzZXJ0IChmb28gIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRU1QVFkgKGZvbykpOworCisgIGdfb2JqZWN0X3VucmVmIChmb28pOworICBmb28gPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAod3JhcHBlciwgImZvbyIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKHdyYXBwZXIsICJmb28iLCAmZm9vLCBOVUxMKTsKKworICBnX2Fzc2VydCAoZm9vID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh3cmFwcGVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2VydmljZXNfaW5oZXJpdGVkICh2b2lkKQoreworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2w7CisgIFRUZXN0SW5oZXJpdGVkQ2xpZW50ICppbmhlcml0ZWRfY2xpZW50OworICBHT2JqZWN0ICppbnB1dF9wcm90b2NvbCwgKm91dHB1dF9wcm90b2NvbDsKKworICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBOVUxMKTsKKyAgaW5oZXJpdGVkX2NsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQgaW5oZXJpdHMgZnJvbSBUVGVzdFNydkNsaWVudCAqLworICBnX2Fzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1NSVl9DTElFTlQpKTsKKworICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCBpbXBsZW1lbnRzIFRUZXN0U3J2Q2xpZW50J3MgaW50ZXJmYWNlICovCisgIGdfYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfU1JWX0lGKSk7CisKKyAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQncyBpbmhlcml0ZWQgcHJvcGVydGllcyBjYW4gYmUgc2V0IGFuZCByZXRyaWV2ZWQgKi8KKyAgZ19vYmplY3Rfc2V0IChpbmhlcml0ZWRfY2xpZW50LAorICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsIHByb3RvY29sLAorICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX29iamVjdF9nZXQgKGluaGVyaXRlZF9jbGllbnQsCisgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgJmlucHV0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCAmb3V0cHV0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChpbnB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOworICBnX2Fzc2VydCAob3V0cHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG91dHB1dF9wcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmIChpbnB1dF9wcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmIChpbmhlcml0ZWRfY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKIH0KIAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0gIGdfdHlwZV9pbml0KCk7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAotICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90byIsIHRlc3RfZGVidWdfcHJvdG8pOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvRG91Ymxlcy9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2RvdWJsZXNfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0RvdWJsZXMvSW5pdGlhbGl6ZSIsCisgICAgIHRlc3Rfc3RydWN0c19kb3VibGVzX2luaXRpYWxpemUpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL0luaXRpYWxpemUvRGVmYXVsdFZhbHVlcyIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX2RlZmF1bHRfdmFsdWVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Jbml0aWFsaXplL1NwZWNpZmllZFZhbHVlcyIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX3NwZWNpZmllZF92YWx1ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL1Byb3BlcnRpZXMvYnl0ZV9saXN0IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfYnl0ZV9saXN0KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Qcm9wZXJ0aWVzL2kxNl9saXN0IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfaTE2X2xpc3QpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL1Byb3BlcnRpZXMvaTY0X2xpc3QiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pNjRfbGlzdCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL05lc3RpbmcvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c19uZXN0aW5nX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9OZXN0aW5nL1Byb3BlcnRpZXMvbXlfYm9uayIsCisgICAgIHRlc3Rfc3RydWN0c19uZXN0aW5nX3Byb3BlcnRpZXNfbXlfYm9uayk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9OZXN0aW5nL1Byb3BlcnRpZXMvbXlfb29lIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9vb2UpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Ib2x5TW9sZXkvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Ib2x5TW9sZXkvUHJvcGVydGllcy9iaWciLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JpZyk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Ib2x5TW9sZXkvUHJvcGVydGllcy9jb250YWluIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19jb250YWluKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9Qcm9wZXJ0aWVzL2JvbmtzIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19ib25rcyk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0VtcHR5IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2VtcHR5KTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvV3JhcHBlci9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX3dyYXBwZXJfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL1dyYXBwZXIvUHJvcGVydGllcy9mb28iLAorICAgICB0ZXN0X3N0cnVjdHNfd3JhcHBlcl9wcm9wZXJ0aWVzX2Zvbyk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TZXJ2aWNlcy9Jbmhlcml0ZWQiLAorICAgICB0ZXN0X3NlcnZpY2VzX2luaGVyaXRlZCk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYTg5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzEyXSA9ICJhYmNkZTAxMjM0ISI7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0OworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgImZkIiwgLTEsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqa2xhc3M7CisgIEdFcnJvciAqZXJyb3I7CisgIGdpbnQgZmQ7CisgIGdjaGFyICpmaWxlbmFtZTsKKworICBlcnJvciA9IE5VTEw7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmZCA9IGdfZmlsZV9vcGVuX3RtcCAoTlVMTCwgJmZpbGVuYW1lLCAmZXJyb3IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIC8qIG9wZW4gaXMgbm8tb3AgKi8KKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICAvKiBhbHJlYWR5IGNsb3NlZCAqLworICBnX2Fzc2VydCAoY2xvc2UgKGZkKSAhPSAwKTsKKyAgZ19hc3NlcnQgKGVycm5vID09IEVCQURGKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICBnX3JlbW92ZSAoZmlsZW5hbWUpOworICBnX2ZyZWUgKGZpbGVuYW1lKTsKKworICAvKiB0ZXN0IGJhZCBmZCAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUgKHZvaWQpCit7CisgIGdjaGFyIG91dF9idWZbOF07CisgIGdjaGFyICpiOworICBnaW50IHdhbnQsIGdvdDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICprbGFzczsKKyAgR0Vycm9yICplcnJvcjsKKyAgZ2ludCBmZDsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIGVycm9yID0gTlVMTDsKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICAvKiB3cml0ZSAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+d3JpdGUgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBURVNUX0RBVEEsIDExLCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5mbHVzaCAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgLyogcmVhZCAqLworICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCBTX0lSVVNSIHwgU19JV1VTUik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgbWVtc2V0KG91dF9idWYsIDAsIDgpOworICBiID0gb3V0X2J1ZjsKKyAgd2FudCA9IDc7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBLCA3KSA9PSAwKTsKKworICBtZW1zZXQob3V0X2J1ZiwgMCwgOCk7CisgIGIgPSBvdXRfYnVmOworICB3YW50ID0gNDsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0ga2xhc3MtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChvdXRfYnVmLCBURVNUX0RBVEEgKyA3LCA0KSA9PSAwKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICAvKiBjbGVhbiB1cCAqLworCisgIGdfcmVtb3ZlIChmaWxlbmFtZSk7CisgIGdfZnJlZSAoZmlsZW5hbWUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDMyNjliZjUuLjAwOGU2MWUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCkBAIC0xNywyMiArMTcsMjAgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KIAotI2luY2x1ZGUgIi4uL3NyYy90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyIKLQotc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKLXN0YXRpYyBjb25zdCBzaG9ydCBURVNUX1BPUlQgPSA2NDQ0NDsKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyIKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKQEAgLTQ0LDEwICs0MiwxMCBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChvYmplY3QpLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTU3LDM1ICs1NSw1MyBAQAogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogCi0gIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsgCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCS8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKIAotICAvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCi0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOwogCi0gIC8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCS8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gIGdfZXJyb3JfZnJlZSAoZXJyKTsKLSAgZXJyID0gTlVMTDsKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTk5LDQ5ICsxMTUsMTU2IEBACiAgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLwogCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAoIHBpZCA+PSAwICk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAogICBpZiAoIHBpZCA9PSAwICkKLSAgewotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIHdyaXRlIDEwIGJ5dGVzICovCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCisvKiB0ZXN0IHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBwZWVyIGhhcyB1bmV4cGVjdGVkbHkKKyAgIGNsb3NlZCB0aGUgY29ubmVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hZnRlcl9wZWVyX2Nsb3NlKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgICAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQgPSBOVUxMOworCisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCSAgICAgICAicG9ydCIsIHBvcnQsCisJCQkJICAgICAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CisKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycik7CisgICAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworCisgICAgICAvKiB3cmFwIHRoZSBjbGllbnQgdHJhbnNwb3J0IGluIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICovCisgICAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3CisJICAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkgICAidHJhbnNwb3J0IiwgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyX3RyYW5zcG9ydCwgJmVyciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnRfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICAvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2xpZW50IGNvbm5lY3RzICovCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCBOVUxMKTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworCisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCVRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisJVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworCWd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworCisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisJCQkJImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCAgICAgcG9ydCwKKwkJCQlOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCAwLAorCQkJCSAgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisJLyogYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgY2xvc2VkCisgICAgICAgdGhlIGNvbm5lY3Rpb24gZmFpbHMgZ3JhY2VmdWxseSB3aXRob3V0IGdlbmVyYXRpbmcgYSBjcml0aWNhbAorICAgICAgIHdhcm5pbmcgb3Igc2VnbWVudGF0aW9uIGZhdWx0ICovCisJdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0cmFuc3BvcnQsIGJ1ZiwgMTAsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgIT0gTlVMTCk7CisKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgJmVycik7CisJZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKworCXRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgJmVycik7CisJZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCWdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworCWdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE1MCwyNSArMjczLDI1IEBACiAgIGludCBieXRlcyA9IDA7CiAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOwotICBndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKyAgZ3VjaGFyIGJ1ZlsxMl07IC8qIGEgYnVmZmVyICovCiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAKICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisJCQkgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDYsIE5VTEwpOwogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA1LCBOVUxMKTsKQEAgLTE4NSwxMiArMzA4LDE2IEBACiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9SZWFkQWZ0ZXJQZWVyQ2xvc2UiLCB0ZXN0X3JlYWRfYWZ0ZXJfcGVlcl9jbG9zZSk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDY1OTAxYmYuLjlmYjY4YjkKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCkBAIC0xNyw3OSArMTcsMjA3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KIAotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAotI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQorc3RhdGljIGNvbnN0IGdjaGFyIFRFU1RfREFUQVsxMV0gPSAiYWJjZGVmZ2hpaiI7CiAKLSNpbmNsdWRlICIuLi9zcmMvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMiCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMiCiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKLXRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKIHsKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKLSAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmX3NpemUiLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi10ZXN0X29wZW5fYW5kX2Nsb3NlKHZvaWQpCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9sYXJnZSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwICogMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9leHRlcm5hbCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR0J5dGVBcnJheSAqYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWYiLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfdW5vd25lZCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR1ZhbHVlIHZhbCA9IEdfVkFMVUVfSU5JVDsKKyAgR0J5dGVBcnJheSAqYnVmOworCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3duZXIiLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9QT0lOVEVSKTsKKyAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChvYmplY3QsICJidWYiLCAmdmFsKTsKKyAgYnVmID0gKEdCeXRlQXJyYXkqKSBnX3ZhbHVlX2dldF9wb2ludGVyICgmdmFsKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJ1Zik7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCiB7CiAgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CiAKICAgLyogY3JlYXRlIGEgVGhyaWZ0TWVtb3J5QnVmZmVyICovCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisgIC8qIG5vLW9wcyAqLworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKwogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyB2b2lkCi10ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCit0ZXN0X3JlYWRfYW5kX3dyaXRlICh2b2lkKQogewogICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOwotICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsKLSAgZ3VjaGFyIHJlYWRbMTBdOworICBnaW50IGdvdCwgd2FudDsKKyAgZ2NoYXIgcmVhZFsxMF07CisgIGdjaGFyICpiOwogICBHRXJyb3IgKmVycm9yID0gTlVMTDsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYnVmLAorICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICZlcnJvcikgPT0gRkFMU0UpOwotICBhc3NlcnQgKGVycm9yICE9IE5VTEwpOworICBnX2Fzc2VydCAoZXJyb3IgIT0gTlVMTCk7CiAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICBlcnJvciA9IE5VTEw7CiAgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAxNSwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGJ1ZiwgMTAsICZlcnJvcikgPT0gVFJVRSk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWQsIDEwLCAmZXJyb3IpID4gMCk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIG1lbXNldChyZWFkLCAwLCAxMCk7CisgIGIgPSByZWFkOworICB3YW50ID0gMTA7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKHJlYWQsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgZ290LCB3YW50LCBpOworICBnY2hhciByZWFkWzEwXTsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBtZW1zZXQocmVhZCwgMCwgMTApOworICAgIGIgPSByZWFkOworICAgIHdhbnQgPSAxMDsKKyAgICB3aGlsZSAod2FudCA+IDApIHsKKyAgICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgYiArPSBnb3Q7CisgICAgICB3YW50IC09IGdvdDsKKyAgICB9CisgICAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9leHRlcm5hbCAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWYiLCBidWYsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBnX2Fzc2VydCAobWVtY21wIChidWYtPmRhdGEsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotICBnX3R5cGVfaW5pdCgpOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveUxhcmdlIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95VW5saW1pdGVkIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lFeHRlcm5hbCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2V4dGVybmFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveVVub3duZWQiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV91bm93bmVkKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVVbmxpbWl0ZWQiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVFeHRlcm5hbCIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfZXh0ZXJuYWwpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDcxNjVkOTMuLjYzNmMzNmQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKQEAgLTE3LDEzICsxNywxMiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWIuaD4KIAotI2luY2x1ZGUgInRocmlmdF9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJwcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgogI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCIKIAogI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyIKQEAgLTU1LDggKzU0LDEwIEBACiAgIG8tPmltX2ludCA9IDEwOwogICBvLT5pbV9zdHIgPSBnX3N0cmR1cCAoInRlc3QiKTsKICAgby0+aW1fYmlnID0gZ19wdHJfYXJyYXlfbmV3ICgpOwotICBnX3B0cl9hcnJheV9mcmVlIChvLT5pbV9iaWcsIEZBTFNFKTsKKyAgZ19wdHJfYXJyYXlfZnJlZSAoby0+aW1fYmlnLCBUUlVFKTsKKyAgby0+aW1fYmlnID0gTlVMTDsKICAgZ19mcmVlIChvLT5pbV9zdHIpOworICBvLT5pbV9zdHIgPSBOVUxMOwogICBnX29iamVjdF91bnJlZiAobyk7CiB9CiAKQEAgLTcyLDIwICs3MywyMCBAQAogICBzMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0lNUExFLCBOVUxMKTsKICAgczMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NJTVBMRSwgTlVMTCk7CiAKLSAgLy8gd3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcworICAvKiB3cml0ZS10by1yZWFkIHdpdGggb3B0aW9uYWwgZmllbGRzICovCiAgIHMxLT5pbV9vcHRpb25hbCA9IDEwOwotICBhc3NlcnQgKHMxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOwotICBhc3NlcnQgKHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsgIAorICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7ICAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoczEpLCBUSFJJRlRfU1RSVUNUIChzMiksIE5VTEwsIE5VTEwpOwotICBhc3NlcnQgKHMyLT5fX2lzc2V0X2ltX2RlZmF1bHQgPSBUUlVFKTsKLSAgYXNzZXJ0IChzMi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAoczItPmltX29wdGlvbmFsID09IDApOworICBnX2Fzc2VydCAoczItPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHMyLT5pbV9vcHRpb25hbCA9PSAwKTsKIAogICBzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9IFRSVUU7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczMpLCBOVUxMLCBOVUxMKTsKLSAgYXNzZXJ0IChzMy0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOwotICBhc3NlcnQgKHMzLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOwotICBhc3NlcnQgKHMzLT5pbV9vcHRpb25hbCA9PSAxMCk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAoczMtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+aW1fb3B0aW9uYWwgPT0gMTApOwogCiAgIGdfb2JqZWN0X3VucmVmIChzMSk7CiAgIGdfb2JqZWN0X3VucmVmIChzMik7CkBAIC0xMDcsMTAgKzEwOCwxMCBAQAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MiksIFRIUklGVF9TVFJVQ1QgKHQxKSwgTlVMTCwgTlVMTCk7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQxKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOwotICBhc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOwotICBhc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IHQyLT5pbV9vcHRpb25hbCk7Ci0gIGFzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gMCk7CisgIGdfYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOworICBnX2Fzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gdDItPmltX29wdGlvbmFsKTsKKyAgZ19hc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IDApOwogCiAgIGdfb2JqZWN0X3VucmVmICh0MSk7CiAgIGdfb2JqZWN0X3VucmVmICh0Mik7CkBAIC0xMzEsNyArMTMyLDcgQEAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDEpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsIE5VTEwpOwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MyksIFRIUklGVF9TVFJVQ1QgKHQxKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKIAogICBnX29iamVjdF91bnJlZiAodDEpOwogICBnX29iamVjdF91bnJlZiAodDMpOwpAQCAtMTcyLDIzICsxNzMsNDYgQEAKICAgdDIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTIsIE5VTEwpOwogICB0MyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVFJJQ0tZMywgTlVMTCk7CiAKLSAgLy8gdGhyb3dzIHByb3RvY29sIGV4Y2VwdGlvbgorICAvKiB0aHJvd3MgcHJvdG9jb2wgZXhjZXB0aW9uICovCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQyKSwgVEhSSUZUX1NUUlVDVCAodDMpLCBOVUxMLCAmcmVhZF9lcnJvcik7Ci0gIGFzc2VydCAocmVhZF9lcnJvciAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHJlYWRfZXJyb3IgIT0gTlVMTCk7CiAgIGdfZXJyb3JfZnJlZSAocmVhZF9lcnJvcik7CiAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDMpLCBUSFJJRlRfU1RSVUNUICh0MiksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwpOworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwpOwogCiAgIGdfb2JqZWN0X3VucmVmICh0Mik7CiAgIGdfb2JqZWN0X3VucmVmICh0Myk7CiB9CiAKK3N0YXRpYyB2b2lkCit0ZXN0X25vbl9zZXRfYmluYXJ5ICh2b2lkKQoreworICBUVGVzdEJpbmFyaWVzICpiMSA9IE5VTEw7CisgIFRUZXN0QmluYXJpZXMgKmIyID0gTlVMTDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgYjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JJTkFSSUVTLCBOVUxMKTsKKyAgYjIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JJTkFSSUVTLCBOVUxMKTsKKworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChiMSksIFRIUklGVF9TVFJVQ1QgKGIyKSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoYjIpLCBUSFJJRlRfU1RSVUNUIChiMSksIE5VTEwsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIC8qIE9LLiBObyBzZWdmYXVsdCAqLworCisgIGdfb2JqZWN0X3VucmVmIChiMSk7CisgIGdfb2JqZWN0X3VucmVmIChiMik7Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvT2xkU2Nob29sIiwgdGVzdF9vbGRfc2Nob29sMSk7CkBAIC0xOTcsNiArMjIxLDcgQEAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTIiLCB0ZXN0X3RyaWNreTIpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5MyIsIHRlc3RfdHJpY2t5Myk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3k0IiwgdGVzdF90cmlja3k0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL0JpbmFyeSIsIHRlc3Rfbm9uX3NldF9iaW5hcnkpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q0MTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMKQEAgLTAsMCArMSw5NSBAQAorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIgorCitzdGF0aWMgdm9pZCBlbnVtX2NvbnN0YW50c19yZWFkX3dyaXRlKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMTAyNCwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdCogc3JjID0gVF9URVNUX0VOVU1fVEVTVDsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdCogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0VOVU1fVEVTVF9TVFJVQ1QsIE5VTEwpOworICBUVGVzdEVudW1UZXN0U3RydWN0Q2xhc3MqIGNscyA9IFRfVEVTVF9FTlVNX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RydWN0X2NvbnN0YW50c19yZWFkX3dyaXRlKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgNDA5NiwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0KiBzcmMgPSBUX1RFU1RfQ09NUEFDVF9URVNUOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9DT01QQUNUX1BST1RPX1RFU1RfU1RSVUNULCBOVUxMKTsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0Q2xhc3MqIGNscyA9IFRfVEVTVF9DT01QQUNUX1BST1RPX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RydWN0X3JlYWRfd3JpdGVfbGVuZ3RoX3Nob3VsZF9lcXVhbCgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDIwNDgsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0Qm9uayogc3JjID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOworICBUVGVzdEJvbmsqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9CT05LLCBOVUxMKTsKKyAgVFRlc3RCb25rQ2xhc3MqIGNscyA9IFRfVEVTVF9CT05LX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHNyYyk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorICBnX3Rlc3RfaW5pdCgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL1N0cnVjdFJlYWRXcml0ZUxlbmd0aFNob3VsZEVxdWFsIiwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdF9yZWFkX3dyaXRlX2xlbmd0aF9zaG91bGRfZXF1YWwpOworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9TdHJ1Y3RDb25zdGFudHMiLCBzdHJ1Y3RfY29uc3RhbnRzX3JlYWRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9FbnVtQ29uc3RhbnRzIiwgZW51bV9jb25zdGFudHNfcmVhZF93cml0ZSk7CisgIHJldHVybiBnX3Rlc3RfcnVuKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDI4MmE2ZTguLjNjNmYyZTgKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCkBAIC0xNywyMCArMTcsMTkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2luY2x1ZGUgInRocmlmdC5oIgotI2luY2x1ZGUgInByb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAogI2RlZmluZSBURVNUX1BPUlQgNTExOTkKIAotI2luY2x1ZGUgInNlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmM+CiAKIC8qIGNyZWF0ZSBhIHJ1ZGltZW50YXJ5IHByb2Nlc3NvciAqLwogI2RlZmluZSBURVNUX1BST0NFU1NPUl9UWVBFICh0ZXN0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKQEAgLTUxLDggKzUwLDEzIEBACiAKIGdib29sZWFuCiB0ZXN0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKQogeworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvY2Vzc29yKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGluKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG91dCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC04NCwxMSArODgsMTIgQEAKIAogICAvKiBydW4gdGhlIHNlcnZlciBpbiBhIGNoaWxkIHByb2Nlc3MgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7Ci0gICAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKFRIUklGVF9TRVJWRVIgKHNzKSktPnNlcnZlIChUSFJJRlRfU0VSVkVSIChzcykpOworICAgIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTIChUSFJJRlRfU0VSVkVSIChzcykpLT5zZXJ2ZSAoVEhSSUZUX1NFUlZFUiAoc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgZXhpdCAoMCk7CiAgIH0gZWxzZSB7CiAgICAgc2xlZXAgKDUpOwpAQCAtOTcsMTUgKzEwMiwxOCBAQAogICAgIGdfb2JqZWN0X3VucmVmIChzcyk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzcyk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHApOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSBTSUdJTlQpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gU0lHSU5UKTsKICAgfQogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RzaW1wbGVzZXJ2ZXIvU2ltcGxlU2VydmVyIiwgdGVzdF9zZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlYzU0M2JlLi5kMTIwY2JjCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwpAQCAtMTcsMTAgKzE3LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgogCi0jaW5jbHVkZSAiLi4vc3JjL3RocmlmdF9zdHJ1Y3QuYyIKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMiCiAKIC8qIHRlc3RzIHRvIGVuc3VyZSB3ZSBjYW4gZXh0ZW5kIGEgVGhyaWZ0U3RydWN0ICovCiAKQEAgLTUxLDYgKzUwLDEwIEBACiB0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTU4LDYgKzYxLDEwIEBACiB0aHJpZnRfdGVzdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogeworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICByZXR1cm4gMDsKIH0KIApAQCAtODEsNyArODgsNyBAQAogICBUaHJpZnRUZXN0U3RydWN0ICp0ID0gTlVMTDsKIAogICB0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCwgTlVMTCk7Ci0gIGFzc2VydCAoIFRIUklGVF9JU19TVFJVQ1QgKHQpKTsKKyAgZ19hc3NlcnQgKCBUSFJJRlRfSVNfU1RSVUNUICh0KSk7CiAgIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwogICB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CiAgIHRocmlmdF90ZXN0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CkBAIC05Miw3ICs5OSwxMCBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0c3RydWN0L0luaXRpYWxpemVPYmplY3QiLCB0ZXN0X2luaXRpYWxpemVfb2JqZWN0KTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiMTRiNjA2Li4yM2E5MzRkCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCkBAIC0xLDE0ICsxLDE3IEBACi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KIAotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCisjaW5jbHVkZSAidF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAidGhyaWZ0X3Rlc3RfaGFuZGxlci5oIgogCiBzdGF0aWMgY29uc3QgY2hhciBURVNUX0FERFJFU1NbXSA9ICJsb2NhbGhvc3QiOwogc3RhdGljIGNvbnN0IGludCBURVNUX1BPUlQgPSA2NDQ0NDsKIAogc3RhdGljIHZvaWQKLXRlc3RfdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpCit0ZXN0X3RocmlmdF9zZXJ2ZXIgKHZvaWQpCiB7CiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIFRFU1RfUE9SVCwgTlVMTCk7CkBAIC0xNiwxMyArMTksOTQgQEAKICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCitzdGF0aWMgdm9pZAorc2V0X2luZGljYXRvciAoZ3BvaW50ZXIgZGF0YSwgR09iamVjdCAqd2hlcmVfdGhlX29iamVjdF93YXMpIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVIod2hlcmVfdGhlX29iamVjdF93YXMpOworCisgICooZ2Jvb2xlYW4gKikgZGF0YSA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3RocmlmdF9oYW5kbGVyICh2b2lkKQoreworICBHRXJyb3IgKmVycm9yOworICBHSGFzaFRhYmxlICpfcmV0dXJuOworICBUVGVzdEluc2FuaXR5ICphcmd1bWVudDsKKyAgZ2Jvb2xlYW4gaW5kaWNhdG9yOworCisgIFRUZXN0WHRydWN0ICAqeHRydWN0LCAgKnh0cnVjdDI7CisgIFRUZXN0TnVtYmVyeiBudW1iZXJ6OworICBUVGVzdE51bWJlcnogbnVtYmVyejI7CisgIFRUZXN0VXNlcklkIHVzZXJfaWQsICp1c2VyX2lkX3B0ciwgKnVzZXJfaWRfcHRyMjsKKyAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CisgIEdQdHJBcnJheSAqeHRydWN0czsKKworICBlcnJvciA9IE5VTEw7CisgIGluZGljYXRvciA9IEZBTFNFOworCisgIHVzZXJfbWFwID0gTlVMTDsKKyAgeHRydWN0cyA9IE5VTEw7CisKKyAgYXJndW1lbnQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIG51bWJlcnogPSBUX1RFU1RfTlVNQkVSWl9GSVZFOworICBudW1iZXJ6MiA9IFRfVEVTVF9OVU1CRVJaX0VJR0hUOworICB1c2VyX2lkX3B0ciA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgKnVzZXJfaWRfcHRyID0gNTsKKyAgdXNlcl9pZF9wdHIyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAqdXNlcl9pZF9wdHIyID0gODsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6LCB1c2VyX2lkX3B0cik7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyejIsIHVzZXJfaWRfcHRyMik7CisgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworCisgIHh0cnVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiSGVsbG8yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgMkxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB4dHJ1Y3QyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiR29vZGJ5ZTQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICA0TEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdDIpOworICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdCk7CisgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKworICBfcmV0dXJuID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludDY0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50NjRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KWdfaGFzaF90YWJsZV91bnJlZik7CisKKyAgZ19vYmplY3Rfd2Vha19yZWYgKEdfT0JKRUNUIChhcmd1bWVudCksIHNldF9pbmRpY2F0b3IsIChncG9pbnRlcikgJmluZGljYXRvcik7CisKKyAgZ19hc3NlcnQgKHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pbnNhbml0eSAoTlVMTCwgJl9yZXR1cm4sIGFyZ3VtZW50LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKF9yZXR1cm4pOworICBnX2Fzc2VydCAoISBpbmRpY2F0b3IpOworCisgIGdfb2JqZWN0X3VucmVmIChhcmd1bWVudCk7CisgIGdfYXNzZXJ0IChpbmRpY2F0b3IpOworfQorCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0aHJpZnQvU2VydmVyIiwgdGVzdF90aHJpZnRfc2VydmVyKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0aHJpZnQvSGFuZGxlciIsIHRlc3RfdGhyaWZ0X2hhbmRsZXIpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAxNTM4OWE1Li4xOTEwYzhhCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApAQCAtMTcsMzEgKzE3LDQyIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgKi8KKy8qIHRlc3QgYSBDIGNsaWVudCB3aXRoIGEgQysrIHNlcnZlciAgKHRoYXQgbWFrZXMgc2Vuc2UuLi4pICovCiAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3RfdHlwZXMuaCIKIAogI2luY2x1ZGUgPGlvc3RyZWFtPgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CiAKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6Zml4ZWQ7Cit1c2luZyBzdGQ6Om1ha2VfcGFpcjsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCiAjZGVmaW5lIFRFU1RfUE9SVCA5OTgwCiAKIC8vIEV4dHJhIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgVGhyaWZ0VGVzdF90eXBlcyB0byB3b3JrCkBAIC01OSwxMDIgKzcwLDEzMCBAQAogICBUZXN0SGFuZGxlcigpIHt9CiAKICAgdm9pZCB0ZXN0Vm9pZCgpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFZvaWQoKVxuIik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Vm9pZCgpIiA8PCBlbmRsOwogICB9CiAKICAgdm9pZCB0ZXN0U3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nKFwiIiA8PCB0aGluZyA8PCAiXCIpIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKKyAgYm9vbCB0ZXN0Qm9vbChjb25zdCBib29sIHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Qm9vbCgiIDw8ICh0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsKKyAgfQogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RCeXRlKCVkKVxuIiwgKGludCl0aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Qnl0ZSgiIDw8IChpbnQpdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAgIGludDMyX3QgdGVzdEkzMihjb25zdCBpbnQzMl90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RJMzIoJWQpXG4iLCB0aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0STMyKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgaW50NjRfdCB0ZXN0STY0KGNvbnN0IGludDY0X3QgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEk2NCglbGxkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEk2NCgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCiAgIGRvdWJsZSB0ZXN0RG91YmxlKGNvbnN0IGRvdWJsZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RG91YmxlKCVsZilcbiIsIHRoaW5nKTsKKyAgICBjb3V0LnByZWNpc2lvbig2KTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3REb3VibGUoIiA8PCBmaXhlZCA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAorICB2b2lkIHRlc3RCaW5hcnkoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCaW5hcnkoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKwogICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICVsbGR9KVxuIiwgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFN0cnVjdCh7XCIiIDw8IHRoaW5nLnN0cmluZ190aGluZyA8PCAiXCIsICIgPDwgKGludCl0aGluZy5ieXRlX3RoaW5nIDw8ICIsICIgPDwgdGhpbmcuaTMyX3RoaW5nIDw8ICIsICIgPDwgdGhpbmcuaTY0X3RoaW5nIDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIHZvaWQgdGVzdE5lc3QoWHRydWN0MiYgb3V0LCBjb25zdCBYdHJ1Y3QyJiBuZXN0KSB7CiAgICAgY29uc3QgWHRydWN0ICZ0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOwotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJWxsZH0sICVkfSlcbiIsIChpbnQpbmVzdC5ieXRlX3RoaW5nLCB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZywgbmVzdC5pMzJfdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE5lc3QoeyIgPDwgKGludCluZXN0LmJ5dGVfdGhpbmcgPDwgIiwge1wiIiA8PCB0aGluZy5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpdGhpbmcuYnl0ZV90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmkzMl90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmk2NF90aGluZyA8PCAifSwgIiA8PCBuZXN0LmkzMl90aGluZyA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gbmVzdDsKICAgfQogCiAgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4gJm91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+ICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TWFwKHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNYXAoeyI7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKKyAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZvdXQsIGNvbnN0IG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZ0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFN0cmluZ01hcCh7IjsKKyAgICBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbV9pdGVyICE9IHRoaW5nLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJcIiIgPDwgbV9pdGVyLT5maXJzdCA8PCAiXCIgPT4gXCIiIDw8IG1faXRlci0+c2Vjb25kIDw8ICJcIiI7CisgICAgfQorICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOworICAgIG91dCA9IHRoaW5nOworICB9CisKKwogICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFNldCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U2V0KHsiOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gdGhpbmcuYmVnaW4oKTsgc19pdGVyICE9IHRoaW5nLmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqc19pdGVyKTsKKyAgICAgIGNvdXQgPDwgKnNfaXRlcjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KVxuIik7CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RMaXN0KHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RMaXN0KHsiOwogICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobF9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbF9pdGVyICE9IHRoaW5nLmVuZCgpOyArK2xfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgICAgY291dCA8PCAqbF9pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RW51bSglZClcbiIsIHRoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RFbnVtKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgVXNlcklkIHRlc3RUeXBlZGVmKGNvbnN0IFVzZXJJZCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZiglbGxkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFR5cGVkZWYoIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7ICB9CiAKICAgdm9pZCB0ZXN0TWFwTWFwKG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCxpbnQzMl90PiA+ICZtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNYXBNYXAoIiA8PCBoZWxsbyA8PCAiKSIgPDwgZW5kbDsKIAogICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IHBvczsKICAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBuZWc7CkBAIC0xNjksNyArMjA4LDkgQEAKICAgfQogCiAgIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+ICZpbnNhbmUsIGNvbnN0IEluc2FuaXR5ICZhcmd1bWVudCkgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0SW5zYW5pdHkoKVxuIik7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJndW1lbnQpOworCisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0SW5zYW5pdHkoKSIgPDwgZW5kbDsKIAogICAgIFh0cnVjdCBoZWxsbzsKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKQEAgLTIwMiw0MyArMjQzLDQ2IEBACiAgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMSwgZmlyc3RfbWFwKSk7CiAgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMiwgc2Vjb25kX21hcCkpOwogCi0gICAgcHJpbnRmKCJyZXR1cm4iKTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICJyZXR1cm4gPSB7IjsKICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOwogICAgIGZvciAoaV9pdGVyID0gaW5zYW5lLmJlZ2luKCk7IGlfaXRlciAhPSBpbnNhbmUuZW5kKCk7ICsraV9pdGVyKSB7Ci0gICAgICBwcmludGYoIiVsbGQgPT4geyIsIGlfaXRlci0+Zmlyc3QpOworICAgICAgY291dCA8PCBpX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CiAgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwogICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwogICAgICAgICAgICArK2kyX2l0ZXIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOworICAgICAgICBjb3V0IDw8IGkyX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgY291dCA8PCAieyI7CiAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICVsbGQsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CisgICAgICAgICAgY291dCA8PCB1bS0+Zmlyc3QgPDwgIiA9PiAiIDw8IHVtLT5zZWNvbmQgPDwgIiwgIjsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICBjb3V0IDw8ICJ9LCAiOwogCiAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7Ci0gICAgICAgIHByaW50ZigieyIpOworICAgICAgICBjb3V0IDw8ICJ7IjsKICAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgewotICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlbGxkfSwgIiwgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpeC0+Ynl0ZV90aGluZywgeC0+aTMyX3RoaW5nLCB4LT5pNjRfdGhpbmcpOworICAgICAgICAgIGNvdXQgPDwgIntcIiIgPDwgeC0+c3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXgtPmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB4LT5pMzJfdGhpbmcgPDwgIiwgIiA8PCB4LT5pNjRfdGhpbmcgPDwgIn0sICI7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJ9Iik7CisgICAgICAgIGNvdXQgPDwgIn0iOwogCi0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSwgIjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOwogCiAKICAgfQogCiAgIHZvaWQgdGVzdE11bHRpKFh0cnVjdCAmaGVsbG8sIGNvbnN0IGludDhfdCBhcmcwLCBjb25zdCBpbnQzMl90IGFyZzEsIGNvbnN0IGludDY0X3QgYXJnMiwgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+ICAmYXJnMywgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TXVsdGkoKVxuIik7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnMyk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNCk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoYXJnNSk7CisKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNdWx0aSgpIiA8PCBlbmRsOwogCiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CkBAIC0yNDksNyArMjkzLDcgQEAKICAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCiAgICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQogICB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RXhjZXB0aW9uKCIgPDwgYXJnIDw8ICIpIiA8PCBlbmRsOwogICAgIGlmIChhcmcuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwogICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOwpAQCAtMjY3LDcgKzMxMSw3IEBACiAKICAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgewogCi0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGlFeGNlcHRpb24oIiA8PCBhcmcwIDw8ICIsICIgPDwgYXJnMSA8PCAiKSIgPDwgZW5kbDsKIAogICAgIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTI4NiwyMCArMzMwLDIyIEBACiAgIH0KIAogICB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IFNsZWVwaW5nLi4uIiA8PCBlbmRsOwogICAgIHNsZWVwKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICAgIGNvdXQgPDwgInRlc3RPbmV3YXkoIiA8PCBzbGVlcEZvciA8PCAiKTogZG9uZSBzbGVlcGluZyEiIDw8IGVuZGw7CiAgIH0KIH07CiAKIC8vIEMgQ0xJRU5UCiBleHRlcm4gIkMiIHsKIAorI3VuZGVmIFRIUklGVF9TT0NLRVQgLyogZnJvbSBsaWIvY3BwICovCisKICNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKICNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIgotI2luY2x1ZGUgInByb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KIAogc3RhdGljIHZvaWQKIHRlc3RfdGhyaWZ0X2NsaWVudCAodm9pZCkKQEAgLTMxMiw3ICszNTgsNyBAQAogICBnY2hhciAqc3RyaW5nID0gTlVMTDsKICAgZ2ludDggYnl0ZSA9IDA7CiAgIGdpbnQxNiBpMTYgPSAwOwotICBnaW50MzIgaTMyID0gMCwgYW5vdGhlcl9pMzIgPSA1Njc4OTsgCisgIGdpbnQzMiBpMzIgPSAwLCBhbm90aGVyX2kzMiA9IDU2Nzg5OwogICBnaW50NjQgaTY0ID0gMDsKICAgZG91YmxlIGRibCA9IDAuMDsKICAgVFRlc3RYdHJ1Y3QgKnh0cnVjdF9pbiwgKnh0cnVjdF9vdXQ7CkBAIC0zMjEsNyArMzY3LDcgQEAKICAgR0hhc2hUYWJsZSAqc2V0X2luID0gTlVMTCwgKnNldF9vdXQgPSBOVUxMOwogICBHQXJyYXkgKmxpc3RfaW4gPSBOVUxMLCAqbGlzdF9vdXQgPSBOVUxMOwogICBUVGVzdE51bWJlcnogZW51bV9pbiwgZW51bV9vdXQ7Ci0gIFRUZXN0VXNlcklkIHVzZXJfaWRfaW4sIHVzZXJfaWRfb3V0OyAKKyAgVFRlc3RVc2VySWQgdXNlcl9pZF9pbiwgdXNlcl9pZF9vdXQ7CiAgIEdIYXNoVGFibGUgKmluc2FuaXR5X2luID0gTlVMTDsKICAgVFRlc3RYdHJ1Y3QgKnh0cnVjdDEsICp4dHJ1Y3QyOwogICBUVGVzdEluc2FuaXR5ICppbnNhbml0eV9vdXQgPSBOVUxMOwpAQCAtMzMwLDExICszNzYsMTMgQEAKICAgVFRlc3RYY2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOwogICBUVGVzdFhjZXB0aW9uMiAqeGNlcHRpb24yID0gTlVMTDsKIAorI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIC8vIGluaXRpYWxpemUgZ29iamVjdAogICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgogCiAgIC8vIGNyZWF0ZSBhIEMgY2xpZW50Ci0gIHRzb2NrZXQgPSAoVGhyaWZ0U29ja2V0ICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAKKyAgdHNvY2tldCA9IChUaHJpZnRTb2NrZXQgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIFRFU1RfUE9SVCwgTlVMTCk7CiAgIHByb3RvY29sID0gKFRocmlmdEJpbmFyeVByb3RvY29sICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLApAQCAtMzc5LDIzICs0MjcsMjUgQEAKICAgeHRydWN0X291dC0+X19pc3NldF9pNjRfdGhpbmcgPSBUUlVFOwogICB4dHJ1Y3Rfb3V0LT5zdHJpbmdfdGhpbmcgPSBnX3N0cmR1cCAoImFiYzEyMyIpOwogICB4dHJ1Y3Rfb3V0LT5fX2lzc2V0X3N0cmluZ190aGluZyA9IFRSVUU7CisgIHh0cnVjdF9pbiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfc3RydWN0IChpZmFjZSwgJnh0cnVjdF9pbiwgeHRydWN0X291dCwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAogICB4dHJ1Y3QyX291dCA9IChUVGVzdFh0cnVjdDIgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLCBOVUxMKTsKICAgeHRydWN0Ml9vdXQtPmJ5dGVfdGhpbmcgPSAxOwogICB4dHJ1Y3QyX291dC0+X19pc3NldF9ieXRlX3RoaW5nID0gVFJVRTsKKyAgaWYgKHh0cnVjdDJfb3V0LT5zdHJ1Y3RfdGhpbmcgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZih4dHJ1Y3QyX291dC0+c3RydWN0X3RoaW5nKTsKICAgeHRydWN0Ml9vdXQtPnN0cnVjdF90aGluZyA9IHh0cnVjdF9vdXQ7CiAgIHh0cnVjdDJfb3V0LT5fX2lzc2V0X3N0cnVjdF90aGluZyA9IFRSVUU7CiAgIHh0cnVjdDJfb3V0LT5pMzJfdGhpbmcgPSAxMjM7CiAgIHh0cnVjdDJfb3V0LT5fX2lzc2V0X2kzMl90aGluZyA9IFRSVUU7CisgIHh0cnVjdDJfaW4gPSAoVFRlc3RYdHJ1Y3QyICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgTlVMTCk7CiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X25lc3QgKGlmYWNlLCAmeHRydWN0Ml9pbiwgeHRydWN0Ml9vdXQsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDJfb3V0KTsKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDJfaW4pOwotICBnX2ZyZWUgKHh0cnVjdF9vdXQtPnN0cmluZ190aGluZyk7Ci0gIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3Rfb3V0KTsKICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CiAKICAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwpAQCAtNDA1LDYgKzQ1NSwxNyBAQAogICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX291dCk7CiAgIGdfaGFzaF90YWJsZV9kZXN0cm95IChtYXBfaW4pOwogCisgIG1hcF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGdfc3RyZHVwICgiYSIpLCBnX3N0cmR1cCAoIjEyMyIpKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCJhIGIiKSwgZ19zdHJkdXAgKCJ3aXRoIHNwYWNlcyAiKSk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGdfc3RyZHVwICgic2FtZSIpLCBnX3N0cmR1cCAoInNhbWUiKSk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGdfc3RyZHVwICgiMCIpLCBnX3N0cmR1cCAoIm51bWVyaWMga2V5IikpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9zdHJpbmdfbWFwIChpZmFjZSwgJm1hcF9pbiwgbWFwX291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKG1hcF9vdXQpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX2luKTsKKwogICBzZXRfb3V0ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CiAgIHNldF9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwogICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZXRfb3V0LCAmaTMyLCAmaTMyKTsKQEAgLTQ0MSw3ICs1MDIsNyBAQAogICAvLyBpbnNhbml0eQogICBpbnNhbml0eV9vdXQgPSAoVFRlc3RJbnNhbml0eSAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKICAgaW5zYW5pdHlfb3V0LT51c2VyTWFwID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7Ci0gIGdfaGFzaF90YWJsZV9pbnNlcnQgKGluc2FuaXR5X291dC0+dXNlck1hcCwgJmVudW1fb3V0LCAmdXNlcl9pZF9vdXQpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChpbnNhbml0eV9vdXQtPnVzZXJNYXAsIEdJTlRfVE9fUE9JTlRFUiAoZW51bV9vdXQpLCAmdXNlcl9pZF9vdXQpOwogCiAgIHh0cnVjdDEgPSAoVFRlc3RYdHJ1Y3QgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOwogICB4dHJ1Y3QxLT5ieXRlX3RoaW5nID0gMTsKQEAgLTQ2Miw3ICs1MjMsNiBAQAogICB4dHJ1Y3QyLT5zdHJpbmdfdGhpbmcgPSBnX3N0cmR1cCAoImFiYzEyMyIpOwogICB4dHJ1Y3QyLT5fX2lzc2V0X3N0cmluZ190aGluZyA9IFRSVUU7CiAKLSAgaW5zYW5pdHlfb3V0LT54dHJ1Y3RzID0gZ19wdHJfYXJyYXlfbmV3ICgpOwogICBpbnNhbml0eV9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwogICBnX3B0cl9hcnJheV9hZGQgKGluc2FuaXR5X291dC0+eHRydWN0cywgeHRydWN0MSk7CiAgIGdfcHRyX2FycmF5X2FkZCAoaW5zYW5pdHlfb3V0LT54dHJ1Y3RzLCB4dHJ1Y3QyKTsKQEAgLTQ3MCw1MiArNTMwLDYwIEBACiAKICAgZ19oYXNoX3RhYmxlX3VucmVmIChpbnNhbml0eV9pbik7CiAgIGdfcHRyX2FycmF5X2ZyZWUgKGluc2FuaXR5X291dC0+eHRydWN0cywgVFJVRSk7Ci0gIGdfZnJlZSAoeHRydWN0MS0+c3RyaW5nX3RoaW5nKTsKLSAgZ19mcmVlICh4dHJ1Y3QyLT5zdHJpbmdfdGhpbmcpOwotICBnX29iamVjdF91bnJlZiAoeHRydWN0MSk7Ci0gIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyKTsKIAogICBtdWx0aV9tYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CiAgIHN0cmluZyA9IGdfc3RyZHVwICgiYWJjMTIzIik7CiAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG11bHRpX21hcF9vdXQsICZpMTYsIHN0cmluZyk7CisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGkgKGlmYWNlLCAmbXVsdGlfaW4sIGJ5dGUsIGkzMiwgaTY0LCBtdWx0aV9tYXBfb3V0LCBlbnVtX291dCwgdXNlcl9pZF9vdXQsICZlcnJvcikgPT0gVFJVRSk7CiAgIGFzc2VydCAobXVsdGlfaW4tPmkzMl90aGluZyA9PSBpMzIpOwogICBhc3NlcnQgKG11bHRpX2luLT5pNjRfdGhpbmcgPT0gaTY0KTsKICAgZ19vYmplY3RfdW5yZWYgKG11bHRpX2luKTsKICAgZ19oYXNoX3RhYmxlX3VucmVmIChtdWx0aV9tYXBfb3V0KTsKLSAgZ19mcmVlIChzdHJpbmcpOyAKKyAgZ19mcmVlIChzdHJpbmcpOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2V4Y2VwdGlvbiAoaWZhY2UsICJYY2VwdGlvbiIsICZ4Y2VwdGlvbiwgJmVycm9yKSA9PSBGQUxTRSk7CiAgIGFzc2VydCAoeGNlcHRpb24tPmVycm9yQ29kZSA9PSAxMDAxKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgIGVycm9yID0gTlVMTDsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgeGNlcHRpb24gPSBOVUxMOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2V4Y2VwdGlvbiAoaWZhY2UsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICZ4Y2VwdGlvbiwgJmVycm9yKSA9PSBGQUxTRSk7CiAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICBlcnJvciA9IE5VTEw7Ci0gIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gIHhjZXB0aW9uID0gTlVMTDsKKyAgYXNzZXJ0ICh4Y2VwdGlvbiA9PSBOVUxMKTsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9leGNlcHRpb24gKGlmYWNlLCAiVGVzdCIsICZ4Y2VwdGlvbiwgJmVycm9yKSA9PSBUUlVFKTsKICAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAorICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCAiWGNlcHRpb24iLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOwogICBhc3NlcnQgKHhjZXB0aW9uLT5lcnJvckNvZGUgPT0gMTAwMSk7CisgIGFzc2VydCAoeGNlcHRpb24yID09IE5VTEwpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgZXJyb3IgPSBOVUxMOwogICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICBnX29iamVjdF91bnJlZiAobXVsdGlfaW4pOwogICB4Y2VwdGlvbiA9IE5VTEw7Ci0gIHhjZXB0aW9uMiA9IE5VTEw7CisgIG11bHRpX2luID0gTlVMTDsKIAorICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCAiWGNlcHRpb24yIiwgTlVMTCwgJnhjZXB0aW9uLCAmeGNlcHRpb24yLCAmZXJyb3IpID09IEZBTFNFKTsKICAgYXNzZXJ0ICh4Y2VwdGlvbjItPmVycm9yQ29kZSA9PSAyMDAyKTsKKyAgYXNzZXJ0ICh4Y2VwdGlvbiA9PSBOVUxMKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgIGVycm9yID0gTlVMTDsKICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uMik7CisgIGdfb2JqZWN0X3VucmVmIChtdWx0aV9pbik7CiAgIHhjZXB0aW9uMiA9IE5VTEw7CisgIG11bHRpX2luID0gTlVMTDsKIAorICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChpZmFjZSwgJm11bHRpX2luLCBOVUxMICwgTlVMTCwgJnhjZXB0aW9uLCAmeGNlcHRpb24yLCAmZXJyb3IpID09IFRSVUUpOwogICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX29iamVjdF91bnJlZihtdWx0aV9pbik7CisgIG11bHRpX2luID0gTlVMTDsKIAogICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9vbmV3YXkgKGlmYWNlLCAxLCAmZXJyb3IpID09IFRSVUUpOwogICBhc3NlcnQgKGVycm9yID09IE5VTEwpOwpAQCAtNTM2LDExICs2MDQsMTMgQEAKIHN0YXRpYyB2b2lkCiBiYWlsb3V0IChpbnQgc2lnbnVtKQogeworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChzaWdudW0pOworCiAgIGV4aXQgKDEpOwogfQogCiBpbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK21haW4gKHZvaWQpCiB7CiAgIGludCBzdGF0dXM7CiAgIGludCBwaWQgPSBmb3JrICgpOwpAQCAtNTQ4LDExICs2MTgsMTEgQEAKIAogICBpZiAocGlkID09IDApIC8qIGNoaWxkICovCiAgIHsKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgICBzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUaHJpZnRUZXN0UHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7Ci0gICAgc2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJpZnRUZXN0UHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChURVNUX1BPUlQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CiAgICAgVFNpbXBsZVNlcnZlciBzaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwogICAgIHNpZ25hbCAoU0lHQUxSTSwgYmFpbG91dCk7CiAgICAgYWxhcm0gKDYwKTsKQEAgLTU2MSw3ICs2MzEsNyBAQAogICAgIHNsZWVwICgxKTsKICAgICB0ZXN0X3RocmlmdF9jbGllbnQgKCk7CiAgICAga2lsbCAocGlkLCBTSUdJTlQpOwotICAgIHdhaXQgKCZzdGF0dXMpID09IHBpZDsKKyAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CiAgIH0KIAogICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjc5ZGE4Ni4uODljNjFiOQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKQEAgLTE3LDEyICsxNywxMyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2luY2x1ZGUgInRyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KIApAQCAtMzIsOSArMzMsOSBAQAogbXlfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCiB7CiAgIGlmIChzb2NrZXRfZXJyb3IgPT0gMCkKLSAgewotICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKQEAgLTQzLDkgKzQ0LDkgQEAKIG15X3JlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCiB7CiAgIGlmIChyZWN2X2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNTQsMjUgKzU1LDIyIEBACiBteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogICBpZiAoc2VuZF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgc29ja2V0IG15X3NvY2tldAogI2RlZmluZSByZWN2IG15X3JlY3YKICNkZWZpbmUgc2VuZCBteV9zZW5kCi0jaW5jbHVkZSAiLi4vc3JjL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMiCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyIKICN1bmRlZiBzb2NrZXQKICN1bmRlZiByZWN2CiAjdW5kZWYgc2VuZAogCi1zdGF0aWMgY29uc3QgY2hhciBURVNUX0FERFJFU1NbXSA9ICJsb2NhbGhvc3QiOwotc3RhdGljIGNvbnN0IHNob3J0IFRFU1RfUE9SVCA9IDY0NDQ0OwotCiBzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOwotCitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKTsKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCkBAIC04Miw3ICs4MCw3IEBACiAKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsIE5VTEwpOwogICBnX2ZyZWUgKGhvc3RuYW1lKTsKIApAQCAtOTUsODUgKzkzLDIyMyBAQAogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgcGlkX3QgcGlkOworICBpbnQgc3RhdHVzOwogCi0gIC8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsgCi0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICB0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOwotICB0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAotICAvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KLSAgdHNvY2tldC0+c2QgPSAtMTsKLSAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LCAxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gIGdfZXJyb3JfZnJlZSAoZXJyKTsKLSAgZXJyID0gTlVMTDsKKwkvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJdGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKIAotICAvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLCBOVUxMKTsKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIHNvY2tldF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgc29ja2V0X2Vycm9yID0gMDsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7CisJLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisJdHNvY2tldC0+c2QgPSAtMTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCS8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCisJLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlzb2NrZXRfZXJyb3IgPSAxOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCXNvY2tldF9lcnJvciA9IDA7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiB0ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCiB7Ci0gIGludCBzdGF0dXM7Ci0gIHBpZF90IHBpZDsKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBwaWRfdCBwaWQ7CiAgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CiAgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLwogCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAoIHBpZCA+PSAwICk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAogICBpZiAoIHBpZCA9PSAwICkKLSAgewotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7Ci0gICAgdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwl0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgZmFpbCAqLwotICAgIHNlbmRfZXJyb3IgPSAxOwotICAgIHRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICBzZW5kX2Vycm9yID0gMDsKKwkvKiB3cml0ZSBmYWlsICovCisJc2VuZF9lcnJvciA9IDE7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXNlbmRfZXJyb3IgPSAwOwogCi0gICAgdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwl0aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKKy8qIHRlc3QgVGhyaWZ0U29ja2V0J3MgcGVlaygpIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgdm9pZAordGVzdF9wZWVrKHZvaWQpCit7CisgIGdpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIGd1aW50IHBvcnQgPSA1MTE5OTsKKyAgZ2NoYXIgZGF0YSA9ICdBJzsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnRfdHJhbnNwb3J0OworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisJCQkJICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJICAgInBvcnQiLCAgICAgcG9ydCwKKwkJCQkgICBOVUxMKTsKKworICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBGQUxTRSB3aGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworCisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJICAgICAgICJwb3J0IiwgcG9ydCwKKwkJCQkgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgICAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3CisJICAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCSAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICAid19idWZfc2l6ZSIsIHNpemVvZiBkYXRhLAorCSAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudF90cmFuc3BvcnQgIT0gTlVMTCk7CisKKyAgICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoY2xpZW50X3RyYW5zcG9ydCwKKwkJCQkJJmRhdGEsCisJCQkJCXNpemVvZiBkYXRhLAorCQkJCQkmZXJyb3IpID09IFRSVUUpOworCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworCisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisKKyAgICAgIGV4aXQgKDApOworICAgIH0KKyAgZWxzZSB7CisgICAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworICAgICAgc2xlZXAgKDEpOworCisgICAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CisKKyAgICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIFRSVUUgd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYW5kIHRoZXJlIGlzCisgICAgICAgZGF0YSBhdmFpbGFibGUgdG8gYmUgcmVhZCAqLworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICAgICAgLyogcmVhZCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc2VydmVyICovCisgICAgICBnX2Fzc2VydF9jbXBpbnQgKHRocmlmdF90cmFuc3BvcnRfcmVhZCAoY2xpZW50X3RyYW5zcG9ydCwKKwkJCQkJICAgICAgJmRhdGEsCisJCQkJCSAgICAgIHNpemVvZiBkYXRhLAorCQkJCQkgICAgICAmZXJyb3IpLCA9PSwgc2l6ZW9mIGRhdGEpOworCisgICAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBGQUxTRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBidXQgdGhlcmUgaXMKKyAgICAgICBubyAobW9yZSkgZGF0YSBhdmFpbGFibGUgdG8gYmUgcmVhZCAqLworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKworICAgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKIHN0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworCitzdGF0aWMgdm9pZAogdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQogewogICBpbnQgYnl0ZXMgPSAwOwpAQCAtMTgzLDE3ICszMTksMTcgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgLyogZmFpbGVkIHJlYWQgKi8KICAgcmVjdl9lcnJvciA9IDE7CkBAIC0yMDksMTIgKzM0NSwxNiBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNvY2tldC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvUGVlayIsIHRlc3RfcGVlayk7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI2NDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMjAwMTEyTCAvKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzU0MTk4NS9zdG9yYWdlLXNpemUtb2YtYWRkcmluZm8taXNudC1rbm93biAqLworCisKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworLyogI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfSAqLworI2RlZmluZSBURVNUX0RBVEEgeyAiR0VUIC8gSFRUUC8xLjFcblxuIiB9CisKKworLyogc3Vic3RpdHV0ZWQgZnVuY3Rpb25zIHRvIHRlc3QgZmFpbHVyZXMgb2Ygc3lzdGVtIGFuZCBsaWJyYXJ5IGNhbGxzICovCitzdGF0aWMgaW50IHNvY2tldF9lcnJvciA9IDA7CitpbnQKK215X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICBpZiAoc29ja2V0X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVjdl9lcnJvciA9IDA7Citzc2l6ZV90CitteV9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAocmVjdl9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9lcnJvciA9IDA7Citzc2l6ZV90CitteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAoc2VuZF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgc29ja2V0IG15X3NvY2tldAorI2RlZmluZSByZWN2IG15X3JlY3YKKyNkZWZpbmUgc2VuZCBteV9zZW5kCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMiCisjdW5kZWYgc29ja2V0CisjdW5kZWYgcmVjdgorI3VuZGVmIHNlbmQKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKKworLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCitzdGF0aWMgdm9pZAordGVzdF9zc2xfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKKyAgZ19mcmVlIChob3N0bmFtZSk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfY3JlYXRlX2FuZF9zZXRfcHJvcGVydGllcyh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKyAgU1NMX0NUWCogc3NsX2N0eD0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IHRocmlmdF9zc2xfc29ja2V0X25ldyhTU0xUTFMsICZlcnJvcik7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCAic3NsX2NvbnRleHQiLCAmc3NsX2N0eCwgTlVMTCk7CisgIGdfYXNzZXJ0IChzc2xfY3R4IT1OVUxMKTsKKworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9vcGVuX2FuZF9jbG9zZV9ub25fc3NsX3NlcnZlcih2b2lkKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xTb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgbm9uX3NzbF9wb3J0ID0gNTExOTg7CisgIGNoYXIgZXJyb3Jtc2dbMjU1XTsKKworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICAvKiBUaGlzIGlzIGEgbm9uIFNTTCBzZXJ2ZXIgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChub25fc3NsX3BvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCS8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIG5vbl9zc2xfcG9ydCwgJmVycm9yKTsKKworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCWdfYXNzZXJ0X2NtcHN0cihlcnJvci0+bWVzc2FnZSwgPT0gLCJFcnJvciB3aGlsZSBjb25uZWN0L2JpbmQ6IDY4IC0+IENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworCWdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCXRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCVRIUklGVF9TT0NLRVQodFNTTFNvY2tldCktPnNkID0gLTE7CisJdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCisJLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KKwl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QuYnJva2VuIiwgbm9uX3NzbF9wb3J0LCAmZXJyb3IpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCXNucHJpbnRmKGVycm9ybXNnLCAyNTUsICJob3N0IGxvb2t1cCBmYWlsZWQgZm9yIGxvY2FsaG9zdC5icm9rZW46JWQgLSBVbmtub3duIGhvc3QiLCBub25fc3NsX3BvcnQpOworCWdfYXNzZXJ0X2NtcHN0cihlcnJvci0+bWVzc2FnZSwgPT0sIGVycm9ybXNnKTsKKwlnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKwllcnJvciA9IE5VTEw7CisKKwkJLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KKwkvKgorCQl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBwb3J0LCAmZXJyb3IpOworCQl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwkJc29ja2V0X2Vycm9yID0gMTsKKwkJYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCQlzb2NrZXRfZXJyb3IgPSAwOworCQlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisJCWdfZXJyb3JfZnJlZSAoZXJyb3IpOworCSAqLworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX3dyaXRlX2ludmFsaWRfc29ja2V0KHZvaWQpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTFNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBjaGFyIGJ1ZmZlcltdID0gInRoaXMgbXVzdCBub3QgYnJlYWsiOworCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworICB0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCA1MTE4OCsxLCAmZXJyb3IpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworICAvKiBGSVhNRSBUaGlzIG11c3QgYmUgdGVzdGVkIGJ1dCBzaW5jZSB0aGUgYXNzZXJ0aW9uIGluc2lkZSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSBicmVha3MgdGhlIHRlc3QgdW5pdAorICAgaXQncyBkaXNhYmxlZC4gVGhleSBpZGVhIGlzIHRvIGRpc2FibGUgdHJhcC9jb3JlZHVtcCBkdXJpbmcgdGhpcyB0ZXN0CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF93cml0ZSh0cmFuc3BvcnQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZlcnJvcikgPT0gRkFMU0UpOworICBnX21lc3NhZ2UgKCJ3cml0ZV9mYWlsZWRfd2l0aF9lcnJvcjogJXMiLAorCSAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIk5vIik7CisgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICovCisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKyAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisgIFRIUklGVF9TT0NLRVQodFNTTFNvY2tldCktPnNkID0gLTE7CisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7Cit9CisKKworCisvKioKKyAqIFByaW50IHRoZSBjb21tb24gbmFtZSBvZiBjZXJ0aWZpY2F0ZQorICovCit1bnNpZ25lZCBjaGFyICogZ2V0X2NuX25hbWUoWDUwOV9OQU1FKiBjb25zdCBuYW1lKQoreworICBpbnQgaWR4ID0gLTE7CisgIHVuc2lnbmVkIGNoYXIgKnV0ZjggPSBOVUxMOworCisgIGRvCisgICAgeworICAgICAgaWYoIW5hbWUpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgaWR4ID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIC0xKTsKKyAgICAgIGlmKCEoaWR4ID4gLTEpKSAgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBYNTA5X05BTUVfRU5UUlkqIGVudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBpZHgpOworICAgICAgaWYoIWVudHJ5KSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIEFTTjFfU1RSSU5HKiBkYXRhID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKKyAgICAgIGlmKCFkYXRhKSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBkYXRhKTsKKyAgICAgIGlmKCF1dGY4IHx8ICEobGVuZ3RoID4gMCkpICBicmVhazsgLyogZmFpbGVkICovCisKKyAgICB9IHdoaWxlICgwKTsKKyAgcmV0dXJuIHV0Zjg7Cit9CisKKy8qCisgKiBIYW5kbGUgSVBWNCBhbmQgSVBWNiBhZGRyCisgKi8KK3ZvaWQgKmdldF9pbl9hZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCisgICAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKXNhKS0+c2luX2FkZHIpOworICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNhKS0+c2luNl9hZGRyKTsKK30KKworaW50IHZlcmlmeV9pcChjaGFyICogaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKQoreworICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJfaW5mbywqcDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBpbnQgcmVzOworICBpbnQgcmV0dmFsID0gMDsKKworCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZiAoc3RydWN0IGFkZHJpbmZvKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgLyogdXNlIEFGX0lORVQ2IHRvIGZvcmNlIElQdjYgKi8KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworCisgIGlmICggKHJlcyA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMLCAmaGludHMsICZhZGRyX2luZm8pICkgIT0gMCkKKyAgICB7CisgICAgICAvKiBnZXQgdGhlIGhvc3QgaW5mbyAqLworICAgICAgZ19lcnJvcigiQ2Fubm90IGdldCB0aGUgaG9zdCBhZGRyZXNzIik7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuICovCisgIGNoYXIgZG5zaG9zdFtJTkVUNl9BRERSU1RSTEVOXTsgLyogYmlnZ2VyIGFkZHIgc3VwcG9ydGVkIElQVjYgKi8KKyAgY2hhciBzb2NrZXRfaXBbSU5FVDZfQUREUlNUUkxFTl07CisgIGlmKGluZXRfbnRvcChhZGRyLT5zc19mYW1pbHksIGdldF9pbl9hZGRyKGFkZHIpLCBzb2NrZXRfaXAsIElORVQ2X0FERFJTVFJMRU4pPT1zb2NrZXRfaXApeworICAgICAgZ19kZWJ1ZygiV2UgYXJlIGNvbm5lY3RlZCB0byBob3N0ICVzIGNoZWNraW5nIGFnYWluc3QgY2VydGlmaWNhdGUuLi4iLCBzb2NrZXRfaXApOworICAgICAgaW50IHNpemVpcCA9IHNvY2tldF9pcCE9TlVMTCA/IHN0cmxlbihzb2NrZXRfaXApIDogMDsKKyAgICAgIGZvcihwID0gYWRkcl9pbmZvOyBwICE9IE5VTEw7IHAgPSBwLT5haV9uZXh0KSB7CisJICBpZihpbmV0X250b3AocC0+YWlfZmFtaWx5LCBnZXRfaW5fYWRkcigoc3RydWN0IHNvY2thZGRyICopcC0+YWlfYWRkciksIGRuc2hvc3QsIElORVQ2X0FERFJTVFJMRU4pPT1kbnNob3N0KXsKKwkgICAgICBpZihkbnNob3N0IT1OVUxMKXsKKwkJICBnX2luZm8oIkROUyBhZGRyZXNzIFslaSAtPiAlc10iLCBwLT5haV9hZGRyLCBkbnNob3N0KTsKKwkJICBpZighc3RybmNtcChkbnNob3N0LCBzb2NrZXRfaXAsIHNpemVpcCkpeworCQkgICAgICByZXR2YWw9MTsKKwkJICAgICAgYnJlYWs7IC8qIGlmIHdlIGdldCBoZXJlLCB3ZSBtdXN0IGhhdmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSAqLworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisgIH0KKworICBpZihhZGRyX2luZm8pCisgICAgZnJlZWFkZHJpbmZvKGFkZHJfaW5mbyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfZnJvbV9maWxlKGNoYXIgKmJ1ZmZlciwgbG9uZyBzaXplLCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGNoYXIgY2g7CisgIGxvbmcgaW5kZXg9MDsKKyAgRklMRSAqZnA7CisKKyAgZnAgPSBmb3BlbihmaWxlX25hbWUsInIiKTsgLyogcmVhZCBtb2RlICovCisKKyAgaWYoIGZwID09IE5VTEwgKQorICAgIHsKKyAgICAgIHBlcnJvcigiRXJyb3Igd2hpbGUgb3BlbmluZyB0aGUgZmlsZS5cbiIpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICBwcmludGYoIlRoZSBjb250ZW50cyBvZiAlcyBmaWxlIGFyZSA6XG4iLCBmaWxlX25hbWUpOworCisgIHdoaWxlKGluZGV4PHNpemUgJiYgKCBjaCA9IGZnZXRjKGZwKSApICE9IEVPRiApeworICAgICAgYnVmZmVyW2luZGV4KytdID0gY2g7CisgIH0KKworICBmY2xvc2UoZnApOworfQorCisjZGVmaW5lIElTU1VFUl9DTl9QSU5OSU5HICJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iCisjZGVmaW5lIFNVQkpFQ1RfQ05fUElOTklORyAibG9jYWxob3N0IgorI2RlZmluZSBDRVJUX1NFUklBTF9OVU1CRVIgIjEiCisKK2dib29sZWFuIHZlcmlmeV9jZXJ0aWZpY2F0ZV9zbihYNTA5ICpjZXJ0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXJpYWxfbnVtYmVyKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKworICBBU04xX0lOVEVHRVIgKnNlcmlhbCA9IFg1MDlfZ2V0X3NlcmlhbE51bWJlcihjZXJ0KTsKKworICBCSUdOVU0gKmJuID0gQVNOMV9JTlRFR0VSX3RvX0JOKHNlcmlhbCwgTlVMTCk7CisgIGlmICghYm4pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGNvbnZlcnQgQVNOMUlOVEVHRVIgdG8gQk5cbiIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBjaGFyICp0bXAgPSBCTl9ibjJkZWMoYm4pOworICBpZiAoIXRtcCkgeworICAgICAgZ193YXJuaW5nKHN0ZGVyciwgInVuYWJsZSB0byBjb252ZXJ0IEJOIHRvIGRlY2ltYWwgc3RyaW5nLlxuIik7CisgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgLyoKKyAgICBpZiAoc3RybGVuKHRtcCkgPj0gbGVuKSB7CisgICAgICBnX3dhcm4oc3RkZXJyLCAiYnVmZmVyIGxlbmd0aCBzaG9ydGVyIHRoYW4gc2VyaWFsIG51bWJlclxuIik7CisgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgIE9QRU5TU0xfZnJlZSh0bXApOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICovCisgIGlmKCFzdHJuY21wKHNlcmlhbF9udW1iZXIsIHRtcCwgc3RybGVuKHNlcmlhbF9udW1iZXIpKSl7CisgICAgICByZXR2YWw9VFJVRTsKKyAgfWVsc2V7CisgICAgICBnX3dhcm5pbmcoIlNlcmlhbCBudW1iZXIgaXMgbm90IHZhbGlkIik7CisgIH0KKworICBCTl9mcmVlKGJuKTsKKyAgT1BFTlNTTF9mcmVlKHRtcCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2dib29sZWFuIG15X2FjY2Vzc19tYW5hZ2VyKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbFNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGdfaW5mbygiUHJvY2Vzc2luZyBhY2Nlc3MgdG8gdGhlIHNlcnZlciIpOworICBYNTA5X05BTUUqIGluYW1lID0gY2VydCA/IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpIDogTlVMTDsKKyAgWDUwOV9OQU1FKiBzbmFtZSA9IGNlcnQgPyBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCkgOiBOVUxMOworCisgIC8qIElzc3VlciBpcyB0aGUgYXV0aG9yaXR5IHdlIHRydXN0IHRoYXQgd2FycmFudHMgbm90aGluZyB1c2VmdWwgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIGlzc3VlciA9IGdldF9jbl9uYW1lKGluYW1lKTsKKyAgaWYoaXNzdWVyKXsKKyAgICAgIGdib29sZWFuIHZhbGlkID0gVFJVRTsKKyAgICAgIGdfaW5mbygiSXNzdWVyIChjbikgJXMiLCBpc3N1ZXIpOworCisgICAgICAvKiBJc3N1ZXIgcGlubmluZyAqLworICAgICAgaWYoc3RybmNtcChJU1NVRVJfQ05fUElOTklORywgaXNzdWVyLCBzdHJsZW4oSVNTVUVSX0NOX1BJTk5JTkcpKSl7CisJICBnX3dhcm5pbmcoIlRoZSBJc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoaXNzdWVyKTsKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisgIH0KKworCisgIC8qIFN1YmplY3QgaXMgd2hvIHRoZSBjZXJ0aWZpY2F0ZSBpcyBpc3N1ZWQgdG8gYnkgdGhlIGF1dGhvcml0eSAgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN1YmplY3QgPSBnZXRfY25fbmFtZShzbmFtZSk7CisgIGlmKHN1YmplY3QpeworICAgICAgZ19pbmZvKCJTdWJqZWN0IChjbikgJXMiLCBzdWJqZWN0KTsKKyAgICAgIGdib29sZWFuIHZhbGlkID0gVFJVRTsKKworICAgICAgLyogU3ViamVjdCBwaW5uaW5nICovCisgICAgICBpZihzdHJuY21wKFNVQkpFQ1RfQ05fUElOTklORywgc3ViamVjdCwgc3RybGVuKFNVQkpFQ1RfQ05fUElOTklORykpKXsKKwkgIGdfd2FybmluZygiVGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisKKyAgICAgIC8qIEhvc3QgcGlubmluZyAgICAgICAqLworICAgICAgaWYodmVyaWZ5X2lwKHN1YmplY3QsIGFkZHIpKXsKKwkgIGdfaW5mbygiVmVyaWZpZWQgc3ViamVjdCIpOworICAgICAgfWVsc2V7CisJICBnX2luZm8oIkNhbm5vdCB2ZXJpZnkgc3ViamVjdCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoc3ViamVjdCk7CisKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisgIH0KKworICBpZighdmVyaWZ5X2NlcnRpZmljYXRlX3NuKGNlcnQsIENFUlRfU0VSSUFMX05VTUJFUikpeworICAgICAgcmV0dXJuIEZBTFNFOworICB9ZWxzZXsKKyAgICAgIGdfaW5mbygiVmVyaWZpZWQgc2VyaWFsIG51bWJlciIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK30KKworCisKKworI2lmZGVmIEJVSUxEX1NFUlZFUgorc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2F1dGhvcml6YXRpb25fbWFuYWdlcih2b2lkKQoreworICBpbnQgc3RhdHVzPTA7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMc29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAvKiAgaW50IHBvcnQgPSA1MTE5OTsgKi8KKyAgaW50IHBvcnQgPSA0NDM7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKworICBndWNoYXIgYnVmWzE3XSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworLyoKKyAgcGlkID0gZm9yayAoKTsKKyAgICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkqLworICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworICBzbGVlcCAoMSk7CisKKyAgLyogVGVzdCBhZ2FpbnN0IGxldmVsMiBvd25jbG91ZCBjZXJ0aWZpY2F0ZSAqLworICB0U1NMc29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBwb3J0LCAmZXJyb3IpOworICB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcih0U1NMc29ja2V0LCBteV9hY2Nlc3NfbWFuYWdlcik7ICAgICAgICAgICAvKiBJbnN0YWxsIHBpbm5pbmcgbWFuYWdlciAqLworICAvKiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUodFNTTHNvY2tldCwgIi4vb3duY2xvdWQubGV2ZWwyY3JtLnBlbSIpOyAqLworICB1bnNpZ25lZCBjaGFyIGNlcnRfYnVmZmVyWzY1NTM0XTsKKyAgcmVhZF9mcm9tX2ZpbGUoY2VydF9idWZmZXIsIDY1NTM0LCAiLi4vLi4va2V5cy9jbGllbnQucGVtIik7CisgIGlmKCF0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcih0U1NMc29ja2V0LCBjZXJ0X2J1ZmZlcikpeworICAgICAgZ193YXJuaW5nKCJDZXJ0aWZpY2F0ZXMgY2Fubm90IGJlIGxvYWRlZCEiKTsKKyAgfQorCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xzb2NrZXQpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTcsIE5VTEwpOworCisgIC8qIHdyaXRlIGZhaWwgKi8KKyAgc2VuZF9lcnJvciA9IDE7CisgIC8qCisgICAgICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworICAgICBzZW5kX2Vycm9yID0gMDsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgKi8KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0U1NMc29ja2V0KTsKKworICAvKiAgICBnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOyAqLworICBnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgIC8qICB9ICovCit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQoreworICBpbnQgYnl0ZXMgPSAwOworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCisgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgLyogcmVhZCAxMCBieXRlcyAqLworICBieXRlcyA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7CisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisKKyAgLyogZmFpbGVkIHJlYWQgKi8KKyAgcmVjdl9lcnJvciA9IDE7CisgIHRocmlmdF9zc2xfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKyAgcmVjdl9lcnJvciA9IDA7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJldHZhbDsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3Rfc3NsX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L0NyZWF0ZUFuZFNldFByb3BlcnRpZXMiLCB0ZXN0X3NzbF9jcmVhdGVfYW5kX3NldF9wcm9wZXJ0aWVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvT3BlbkFuZENsb3NlTm9uU1NMU2VydmVyIiwgdGVzdF9zc2xfb3Blbl9hbmRfY2xvc2Vfbm9uX3NzbF9zZXJ2ZXIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9PcGVuQW5kV3JpdGVJbnZhbGlkU29ja2V0IiwgdGVzdF9zc2xfd3JpdGVfaW52YWxpZF9zb2NrZXQpOworCisKKworCisgIHJldHZhbCA9IGdfdGVzdF9ydW4gKCk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYy5pbiBiL2xpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYy5pbgppbmRleCAzYTQxMzdkLi41NjhjN2EyIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4KKysrIGIvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjLmluCkBAIC0yNiw1ICsyNiw1IEBACiBEZXNjcmlwdGlvbjogVGhyaWZ0IEMgQVBJCiBWZXJzaW9uOiBAVkVSU0lPTkAKIFJlcXVpcmVzOiBnbGliLTIuMCBnb2JqZWN0LTIuMAotTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnRjCi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0X2NfZ2xpYgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jbC9NYWtlZmlsZS5hbSBiL2xpYi9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCithbGwtbG9jYWw6CisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK3J1bi10ZXN0czogdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisKK2NoZWNrLWxvY2FsOiBydW4tdGVzdHMKKwkuL3J1bi10ZXN0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBydW4tdGVzdHMgcXVpY2tsaXNwLmxpc3AgYmFja3BvcnQtdXBkYXRlLnppcAorCSQoUk0pIC1yZiBsaWIgZXh0ZXJuYWxzIHF1aWNrbGlzcAorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJUkVBRE1FUyBcCisJbG9hZC1sb2NhbGx5Lmxpc3AgXAorCXRlc3QgXAorCWVuc3VyZS1leHRlcm5hbHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUUubWQgYi9saWIvY2wvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmVhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjUzIEBACitUaHJpZnQgQ29tbW9uIExpc3AgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKworVXNpbmcgVGhyaWZ0IHdpdGggQ29tbW9uIExpc3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFRocmlmdCBpcyBhIHByb3RvY29sIGFuZCBsaWJyYXJ5IGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBjb21tdW5pY2F0aW9uIGJldHdlZW4gY29vcGVyYXRpbmcKKyBwcm9jZXNzZXMuIFRoZSBjb21tdW5pY2F0aW9uIHRha2VzIHRoZSBmb3JtIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLCBvZiB3aGljaCB0aGUgZm9ybXMKKyBhcmUgc3BlY2lmaWVkIGluIGFkdmFuY2UgdGhyb3VmaCBhIHNoYXJlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gQSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlIGlzIHRyYW5zbGF0ZWQKKyBpbnRvIExpc3Agc291cmNlIGZpbGVzLCB3aGljaCBjb21wcmlzZSBzZXZlcmFsIGRlZmluaXRpb25zOgorCisgICogVGhyZWUgcGFja2FnZXMsIG9uZSBmb3IgdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb3BlcmF0b3JzLCBhbmQgb25lIGVhY2ggZm9yIHJlcXVlc3QgYW5kCisgIHJlc3BvbnNlIG9wZXJhdG9ycy4KKyAgKiBWYXJpb3VzIHR5cGUgZGVmaW5pdGlvbnMgYXMgaW1wbGVtZW50YXRpb25zIGZvciBUaHJpZnQgdHlwZWRlZiBhbmQgZW51bSBkZWZpbml0aW9ucy4KKyAgKiBERUYtU1RSVUNUIGFuZCBERUYtRVhDRVBUSU9OIGZvcm1zIGZvciBUaHJpZnQgc3RydWN0IGFuZCBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICogREVGLVNFUlZJQ0UgZm9ybXMgZm9yIHRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb25zLgorCisgRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZXhwYW5kcyBpbiBhIGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGVhY2ggYG9wYAorIGluIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24sIHR3byBmdW5jdGlvbnMgYXJlIGRlZmluZWQKKworICAqIGBvcGAtcmVxdWVzdCBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBjbGllbnQuIEl0IGFjY2VwdHMgYW4gYWRkaXRpb25hbCBpbml0aWFsIGBwcm90b2NvbGAgYXJndW1lbnQsCisgICAgdG8gYWN0IGFzIHRoZSBjbGllbnQgcHJveHkgZm9yIHRoZSBvcGVyYXRpb24gYW5kIG1lZGlhdGUgdGhlIGludGVyYWN0aW9uIHdpdGggYSByZW1vdGUgcHJvY2VzcworICAgIHRocm91Z2ggYSBUaHJpZnQtZW5jb2RlZCB0cmFuc3BvcnQgc3RyZWFtLgorICAqIGBvcGAtcmVzcG9uc2UgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgc2VydmVyLiBJdCBhY2NlcHRzIGEgc2luZ2xlIGBwcm90b2NvbGAgYXJndW1lbnQuIEEgc2VydmVyCisgICAgdXNlcyBpdCB0byBkZWNvZGUgdGhlIHJlcXVlc3QgbWVzc2FnZSwgaW52b2tlIHRoZSBiYXNlIGBvcGAgZnVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSBhcmd1bWVudHMsCisgICAgZW5jb2RlIGFuZCBzZW5kIHRoZSB0aGUgcmVzdWx0IGFzIGEgcmVzcG9uc2UsIGFuZCBoYW5kbGVzIGV4Y2VwdGlvbnMuCisKKyBUaGUgY2xpZW50IGludGVyZmFjZSBpcyBvbmUgb3BlcmF0b3IKKworICAqIGB3aXRoLWNsaWVudCAodmFyaWFibGUgbG9jYXRpb24pIC4gYm9keWAgOiBjcmVhdGVzIGEgY29ubmVjdGlvbiBpbiBhIGR5bmFtaWMgY29udGV4dCBhbmQgY2xvc2VzIGl0CisgICAgdXBvbiBleGl0LiBUaGUgdmFyaWFibGUgaXMgYm91bmQgdG8gYSBjbGllbnQgcHJveHkgc3RyZWFtL3Byb3RvY29sIGluc3RhbmNlLCB3aGljaCB3cmFwcyB0aGUKKyAgICBiYXNlIGkvbyBzdHJlYW0gLSBzb2NrZXQsIGZpbGUsIGV0Yywgd2l0aCBhbiBvcGVyYXRvcnMgd2hpY2ggaW1wbGVtZW50IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAgICBhbmQgdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisKKyBUaGUgc2VydmVyIGludGVyZmFjZSBjb21iaW5lcyBzZXJ2ZXIgYW5kIHNlcnZpY2Ugb2JqZWN0cworCisgICogYHNlcnZlIChsb2NhdGlvbiBzZXJ2aWNlKWAgOiBhY2NlcHRzIGNvbm5lY3Rpb25zIG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQgYW5kIHJlc3BvbmRzIHRvCisgICAgcmVxdWVzdHMgb2YgdGhlIHNlcnZpY2UncyBvcGVyYXRpb25zLgorCisKK0J1aWxkaW5nIAorLS0tLS0tLS0KKworVGhlIFRocmlmdCBDb21tb24gTGlzcCBsaWJyYXJ5IGlzIHBhY2thZ2VkIGFzIHRoZSBBU0RGW1sxXV0gc3lzdGVtIGB0aHJpZnRgLgorSXQgZGVwZW5kcyBvbiB0aGUgc3lzdGVtcworCisqIHB1cmlbWzJdXSA6IGZvciB0aGUgdGhyaWZ0IHVyaSBjbGFzcworKiBjbG9zZXItbW9wW1szXV0gOiBmb3IgY2xhc3MgbWV0YWRhdGEKKyogdHJpdmlhbC11dGYtOFtbNF1dIDogZm9yIHN0cmluZyBjb2RlY3MKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKKworVGhlIGRlcGVuZGVuY2llcyBhcmUgYnVuZGxlZCBmb3IgbG9jYWwgYnVpbGRzIG9mIHRlc3RzIGFuZCB0dXRvcmlhbCBiaW5hcmllcyAtIAoraXQgaXMgcG9zc2libGUgdG8gdXNlIHRob3NlIGJ1bmRsZXMgdG8gbG9hZCB0aGUgbGlicmFyeSwgdG9vLgorCitJbiBvcmRlciB0byBidWlsZCBpdCwgcmVnaXN0ZXIgdGhvc2Ugc3lzdGVtcyB3aXRoIEFTREYgYW5kIGV2YWx1YXRlOgorCisgICAgKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKKworVGhpcyB3aWxsIGNvbXBpbGUgYW5kIGxvYWQgdGhlIExpc3AgY29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzLCB0aGUKK3RyYW5zcG9ydCBhbmQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIGNsaWVudCBhbmQgc2VydmVyIGludGVyZmFjZQorZnVuY3Rpb25zLiBJbiBvcmRlciB0byB1c2UgVGhyaWZ0IGluIGFuIGFwcGxpY2F0aW9uLCBvbmUgbXVzdCBhbHNvIGF1dGhvciBhbmQvb3IKK2xvYWQgdGhlIGludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbW90ZSBzZXJ2aWNlLltbOV1dIElmIG9uZSBpcyBpbXBsZW1lbnRpbmcgYSBzZXJ2aWNlLAorb25lIG11c3QgYWxzbyBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbnMgdG8gd2hpY2ggVGhyaWZ0IGlzIHRvIGFjdCBhcyB0aGUgcHJveHkKK2ludGVyZmFjZS4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGZvbGxvd3MgdGhlIFRocmlmdCB0dXRvcmlhbCB0byBpbGx1c3RyYXRlIGhvdwordG8gcGVyZm9ybSB0aGUgc3RlcHMKKworICAqIGltcGxlbWVudCB0aGUgc2VydmljZQorICAqIHRyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorICAqIGxvYWQgdGhlIExpc3Agc2VydmljZSBpbnRlcmZhY2VzCisgICogcnVuIGEgc2VydmVyIGZvciB0aGUgc2VydmljZQorICAqIHVzZSBhIGNsaWVudCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UgcmVtb3RlbHkKKworTm90ZSB0aGF0LCBpZiBvbmUgaXMgdG8gaW1wbGVtZW50IGEgbmV3IHNlcnZpY2UsIG9uZSB3aWxsIGFsc28gbmVlZCB0byBhdXRob3IgdGhlCitJREwgZmlsZXMsIGFzIHRoZXJlIGlzIG5vIGZhY2lsaXR5IHRvIGdlbmVyYXRlIHRoZW0gZnJvbSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisKKworSW1wbGVtZW50IHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHR1dG9yaWFsIGNvbXByaXNlcyBzZXJ2ZXJhbCBmdW5jdGlvbnM6IGBhZGRgLCBgcGluZ2AsIGB6aXBgLCBhbmQgYGNhbGN1bGF0ZWAuCitFYWNoIHRyYW5zbGF0ZWQgSURMIGZpbGUgZ2VuZXJhdGVzIHRocmVlIHBhY2thZ2VzIGZvciBldmVyeSBzZXJ2aWNlLiBJbiB0aGUgY2FzZSBvZgordGhlIHR1dG9yaWFsIGZpbGUsIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmU6CisKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItcmVzcG9uc2UKKyAgCitUaGlzIGlzIHRvIHNlcGFyYXRlIHRoZSByZXF1ZXN0IChnZW5lcmF0ZWQpLCByZXNwb25zZSAoZ2VuZXJhdGVkKSBhbmQgaW1wbGVtZW50YXRpb24KKyhtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcHJvZ3JhbW1lcikgZnVuY3Rpb25zIGZvciBkZWZpbmVkIFRocmlmdCBtZXRob2RzLgorCitJdCBpcyBzdWdnZXN0ZWQgdG8gd29yayBpbiB0aGUgYHR1dG9yaWFsLWltcGxlbWVudGF0aW9uYCBwYWNrYWdlIHdoaWxlIGltcGxlbWVudGluZwordGhlIHNlcnZpY2VzIC0gaXQgaW1wb3J0cyB0aGUgYGNvbW1vbi1saXNwYCBwYWNrYWdlLCB3aGlsZSB0aGUgc2VydmljZS1zcGVjaWZpYyBvbmVzCitkb24ndCAodG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gVGhyaWZ0IG1ldGhvZCBuYW1lcyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gYGNvbW1vbi1saXNwYCkuCisKKyAgICA7OyBkZWZpbmUgdGhlIGJhc2Ugb3BlcmF0aW9ucworICAgIAorICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBhZGQgfkEgYW5kIH5BLiIgbnVtMSBudW0yKQorICAgICAgKCsgbnVtMSBudW0yKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgICAgICAocHJpbnQgOnBpbmcpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAgICAgKHByaW50IDp6aXApKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgdGFzaykKKyAgICAgIChjYWxjdWxhdGUtb3AgKHdvcmstb3AgdGFzaykgKHdvcmstbnVtMSB0YXNrKSAod29yay1udW0yIHRhc2spKSkKKyAgICAKKyAgICAoZGVmZ2VuZXJpYyBjYWxjdWxhdGUtb3AgKG9wIGFyZzEgYXJnMikKKyAgICAgICg6bWV0aG9kIDphcm91bmQgKG9wIGFyZzEgYXJnMikKKyAgICAgICAgKGxldCAoKHJlc3VsdCAoY2FsbC1uZXh0LW1ldGhvZCkpKQorICAgICAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBjYWxjdWxhdGU6IH5kIG9uICB+QSBhbmQgfkEgPSB+ZC4iIG9wIGFyZzEgYXJnMiByZXN1bHQpCisgICAgICAgICAgcmVzdWx0KSkKKyAgICAKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uYWRkKSkgYXJnMSBhcmcyKQorICAgICAgICAoKyBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5zdWJ0cmFjdCkpIGFyZzEgYXJnMikKKyAgICAgICAgKC0gYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24ubXVsdGlwbHkpKSBhcmcxIGFyZzIpCisgICAgICAgICgqIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmRpdmlkZSkpIGFyZzEgYXJnMikKKyAgICAgICAgKC8gYXJnMSBhcmcyKSkpCisgICAgCisgICAgKGRlZnVuIHppcCAoKSAocHJpbnQgJ3ppcCkpCisKKworVHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSURMIGZpbGVzIGVtcGxveSB0aGUgZmlsZSBleHRlbnNpb24gYHRocmlmdGAuIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIHR3byBmaWxlcyB0byB0cmFuc2xhdGUKKyAgKiBgdHV0b3JpYWwudGhyaWZ0YAorICAqIGBzaGFyZWQudGhyaWZ0YAorQXMgdGhlIGZvcm1lciBpbmNsdWRlcyB0aGUgbGF0dGVyLCBvbmUgdXNlcyBpdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlczoKKworICAgICRUSFJJRlQvYmluL3RocmlmdCAtciAtLWdlbiBjbCAkVEhSSUZUL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorICAgIAorYC1yYCBzdGFuZHMgZm9yIHJlY3Vyc2lvbiwgd2hpbGUgYC0tZ2VuYCBsZXRzIG9uZSBjaG9vc2UgdGhlIGxhbmd1YWdlIHRvIHRyYW5zbGF0ZSB0by4KKworCitMb2FkIHRoZSBMaXNwIHRyYW5zbGF0ZWQgc2VydmljZSBpbnRlcmZhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0cmFuc2xhdG9yIGdlbmVyYXRlcyB0aHJlZSBmaWxlcyBmb3IgZWFjaCBJREwgZmlsZS4gRm9yIGV4YW1wbGUgYHR1dG9yaWFsLXR5cGVzLmxpc3BgLAorYHR1dG9yaWFsLXZhcnMubGlzcGAgYW5kIGFuIGAuYXNkYCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCB0aGVtIGJvdGggYW5kIHB1bGwgaW4KK290aGVyIGluY2x1ZGVzIChsaWtlIGBzaGFyZWRgIHdpdGhpbiB0aGUgdHV0b3JpYWwpIGFzIGRlcGVuZGVuY2llcy4KKworCitSdW4gYSBTZXJ2ZXIgZm9yIHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhY3R1YWwgc2VydmljZSBuYW1lLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGBkZWYtc2VydmljZWAgZm9ybSBpbiBgdHV0b3JpYWwubGlzcGAsIGlzIGBjYWxjdWxhdG9yYC4gCitFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBkZWZpbmVzIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBhbmQgYmluZHMgaXQgdG8gYQorc2VydmljZSBpbnN0YW5jZSB3aGNoIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucy4KKworSW4gb3JkZXIgdG8gc3RhcnQgYSBzZXJ2aWNlLCBzcGVjaWZ5IGEgbG9jYXRpb24gYW5kIHRoZSBzZXJ2aWNlIGluc3RhbmNlLiAKKworICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbCkKKyAgICAoc2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiIGNhbGN1bGF0b3IpCisKKworVXNlIGEgQ2xpZW50IHRvIEFjY2VzcyB0aGUgU2VydmljZSBSZW1vdGVseQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tpbiBzb21lIG90aGVyIHByb2Nlc3NdIHJ1biB0aGUgY2xpZW50CisKKyAgICAoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworICAgIChtYWNyb2xldCAoKHNob3cgKGZvcm0pCisgICAgICAgICAgICAgICAgIGAoZm9ybWF0ICp0cmFjZS1vdXRwdXQqICJ+JX5zID0+fnsgfnN+fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyxmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtdWx0aXBsZS12YWx1ZS1saXN0IChpZ25vcmUtZXJyb3JzICxmb3JtKSkpKSkKKyAgICAgICh3aXRoLWNsaWVudCAocHJvdG9jb2wgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3RvY29sKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgMikpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDQpKQorICAgIAorICAgICAgICAobGV0ICgodGFzayAobWFrZS1pbnN0YW5jZSAndHV0b3JpYWw6d29yaworICAgICAgICAgICAgICAgICAgICAgIDpvcCBvcGVyYXRpb24uc3VidHJhY3QgOm51bTEgMTUgOm51bTIgMTApKSkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkKKyAgICAgICAgCisgICAgICAgICAgKHNldGYgKHR1dG9yaWFsOndvcmstb3AgdGFzaykgb3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTEgdGFzaykgMQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTIgdGFzaykgMCkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkpCisgICAgICAgIAorICAgICAgICAoc2hvdyAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdG9jb2wgMSkpCisgICAgCisgICAgICAgIChzaG93ICh6aXAgcHJvdG9jb2wpKSkpCisKK0lzc3VlcworLS0tLS0tCisKKyMjIyBvcHRpb25hbCBmaWVsZHMgCisgV2hlcmUgdGhlIElETCBkZWNsYXJlcyBhIGZpZWxkIG9wdGlvbnMsIHRoZSBkZWYtc3RydWN0IGZvcm0gaW5jbHVkZXMgbm8KKyBpbml0Zm9ybSBmb3IgdGhlIHNsb3QgYW5kIHRoZSBlbmNvZGluZyBvcGVyYXRvciBza2lwcyBhbiB1bmJvdW5kIHNsb3QuIFRoaXMgbGVhdmUgc29tZSBhbWJpZ3VpdHkKKyB3aXRoIGJvb2wgZmllbGRzLgorCisjIyMgaW5zdGFudGlhdGlvbiBwcm90b2NvbCA6Cisgc3RydWN0IGNsYXNzZXMgYXJlIHN0YW5kYXJkIGNsYXNzZXMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzIGFyZQorIHdoYXRldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmVzY3JpYmVzLiBkZWNvZGVycyBhcHBseSBtYWtlLXN0cnVjdCB0byBhbiBpbml0YXJncyBsaXN0LgorIHBhcnRpY3VsYXJseSBhdCB0aGUgc2VydmljZSBlbmQsIHRoZXJlIGFyZSBhZHZhbnRhZ2VzIHRvIHJlc291cmNpbmcgc3RydWN0cyBhbmQgZGVjb2RpbmcKKyB3aXRoIGRpcmVjdCBzaWRlLWVmZmVjdHMgb24gc2xvdC12YWx1ZXMKKworIyMjIG1hcHM6CisgTWFwcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGhhc2ggdGFibGVzLiBBcyBkYXRhIHRocm91Z2ggdGhlIGNhbGwvcmVwbHkgaW50ZXJmYWNlIGlzIGFsbCBzdGF0aWNhbGx5CisgdHlwZWQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBvYmplY3RzIHRvIHRoZW1zZWx2ZXMgaW5kaWNhdGUgdGhlIGNvZGluZyBmb3JtLiBBc3NvY2lhdGlvbiBsaXN0cworIHdvdWxkIGJlIHN1ZmZpY2llbnQuIEFzIHRoZSBrZXkgdHlwZSBpcyBhcmJpdHJhcnksIHByb3BlcnR5IGxpc3RzIG9mZmVyIG5vIGFkZGl0aW9uYWwgY29udmVuaWVuY2U6CisgYXMgYGdldGZgIG9wZXJhdGVzIHdpdGggYGVxYCBhIG5ldyBhY2Nlc3MgaW50ZXJmYWNlIHdvdWxkIGJlIG5lY2Vzc2FyeSBhbmQgdGhleSB3b3VsZCBub3QgYmUKKyBhdmFpbGFibGUgZm9yIGZ1bmN0aW9uIGFwcGxpY2F0aW9uLgorCisKKyBbMV06IHd3dy5jb21tb24tbGlzcC5uZXQvYXNkZgorIFsyXTogaHR0cDovL2dpdGh1Yi5jb20vbGlzcC9jb20uYjkucHVyaS5wcGNyZQorIFszXTogd3d3LmNvbW1vbi1saXNwLm5ldC9jbG9zZXItbW9wCisgWzRdOiB0cml2aWFsLXV0Zi04CisgWzVdOiBodHRwczovL2dpdGh1Yi5jb20vdXNvY2tldC91c29ja2V0CisgWzZdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9pZWVlLWZsb2F0cworIFs3XTogaHR0cHM6Ly9naXRodWIuY29tL3RyaXZpYWwtZ3JheS1zdHJlYW1zL3RyaXZpYWwtZ3JheS1zdHJlYW1zCisgWzhdOiBodHRwczovL2dpdGxhYi5jb21tb24tbGlzcC5uZXQvYWxleGFuZHJpYS9hbGV4YW5kcmlhCisgWzldOiBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRHZW5lcmF0aW9uCisKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcCBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc0NGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCkBAIC0wLDAgKzEsNjQgQEAKKyhpbi1wYWNrYWdlIDpjbC11c2VyKQorCisjKyhvciBjY2wgc2JjbCkgL2RldmVsb3BtZW50L3NvdXJjZS9saWJyYXJ5LworKGxvYWQgImJ1aWxkLWluaXQubGlzcCIpCisKKzs7OyAhIGZpcnN0LCBzZWxlY3QgdGhlIGFwaSB2ZXJzaW9uIGluIHRoZSBjYXNzYW5kcmEgc3lzdGVtIGRlZmluaXRpb24KKzs7OyBhcyBvbmx5IG9uZSBzaG91bGQgYmUgbG9hZGVkIGF0IGEgdGltZS4KKyhhc2RmOmxvYWQtc3lzdGVtIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGluLXBhY2thZ2UgOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoZGVmcGFyYW1ldGVyICpjLWxvY2F0aW9uKgorICA7OyByZW1vdGUKKyAgOzsgI3UidGhyaWZ0Oi8vZWMyLTE3NC0xMjktNjYtMTQ4LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tOjkxNjAiCisgIDs7IGxvY2FsCisgICN1InRocmlmdDovLzEyNy4wLjAuMTo5MTYwIgorICAiQSBjYXNzYW5kcmEgc2VydmljZSBsb2NhdGlvbiAtIGVpdGhlciB0aGUgbG9jYWwgb25lIG9yIGEgcmVtb3RlIHNlcnZpY2UgCisgLSBhbHdheXMgYSAndGhyaWZ0JyB1cmkuIikKKworKGRlZnBhcmFtZXRlciAqYyogKHRocmlmdDpjbGllbnQgKmMtbG9jYXRpb24qKSkKKworCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCis7OyA9PiAoIktleXNwYWNlMSIgInN5c3RlbSIpCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lICpjKikKKzs7ID0+IlRlc3QgQ2x1c3RlciIKKworKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uICpjKikKKzs7ID0+ICIyLjEuMCIKKworKGxvb3AgZm9yIHNwYWNlIGluIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKyAgICAgIGNvbGxlY3QgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgKmMqIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpCisKKworKGNsb3NlICpjKikKKworKGRlZnVuIGRlc2NyaWJlLWNhc3NhbmRyYSAobG9jYXRpb24gJm9wdGlvbmFsIChzdHJlYW0gKnN0YW5kYXJkLW91dHB1dCopKQorICAiUHJpbnQgdGhlIGZpcnN0LW9yZGVyIHN0b3JlIG1ldGFkYXRhIGZvciBhIGNhc3NhbmRyYSBMT0NBVElPTi4iCisKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAoY2Fzc2FuZHJhIGxvY2F0aW9uKQorICAgIChsZXQqICgoa2V5c3BhY2UtbmFtZXMgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGNsdXN0ZXIgKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKHZlcnNpb24gKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChrZXlzcGFjZS1kZXNjcmlwdGlvbnMgKGxvb3AgZm9yIHNwYWNlIGluIGtleXNwYWNlLW5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlIGNhc3NhbmRyYSBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpKSkpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjb25uZWN0aW9uIHRvIDogfmEiIGNhc3NhbmRyYSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JnZlcnNpb24gOiB+YSIgdmVyc2lvbikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNsdXN0ZXIgOiB+YSIgY2x1c3RlcikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmtleXNwYWNlc357fnt+JX4lc3BhY2U6IH5hfkB7fiUgIH57fmEgOn5Ae34yMHR+Ond+Xn4lfn1+fX59fn1+fSIga2V5c3BhY2UtZGVzY3JpcHRpb25zKSkpKQorCis7OzsgKGRlc2NyaWJlLWNhc3NhbmRyYSAqYy1sb2NhdGlvbiopCmRpZmYgLS1naXQgYS9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLWUKKworaWYgW1sgISAtZSBxdWlja2xpc3AubGlzcCBdXTsgdGhlbiBjdXJsIC1PIGh0dHBzOi8vYmV0YS5xdWlja2xpc3Aub3JnL3F1aWNrbGlzcC5saXNwOyBmaQorc2JjbCAtLWxvYWQgcXVpY2tsaXNwLmxpc3AgXAorICAgICAtLWV2YWwgIihpZ25vcmUtZXJyb3JzIChxdWlja2xpc3AtcXVpY2tzdGFydDppbnN0YWxsIDpwYXRoIFwicXVpY2tsaXNwL1wiKSkiIFwKKyAgICAgLS1ldmFsICIobG9hZCBcInF1aWNrbGlzcC9zZXR1cC5saXNwXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aWNrbGlzcDpidW5kbGUtc3lzdGVtcyAnKCM6cHVyaSAjOnVzb2NrZXQgIzpjbG9zZXItbW9wICM6dHJpdmlhbC11dGYtOCAjOmllZWUtZmxvYXRzICM6dHJpdmlhbC1ncmF5LXN0cmVhbXMgIzphbGV4YW5kcmlhICM6Ym9yZGVhdXgtdGhyZWFkcyAjOmNsLXBwY3JlICM6Zmlhc2NvICM6bmV0LmRpZGllcnZlcm5hLmNsb24pIDp0byBcImV4dGVybmFscy9cIikiIFwKKyAgICAgLS1ldmFsICIocXVpdCkiIFwKKyAgICAgLS1uby11c2VyaW5pdAoraWYgW1sgISAtZSBiYWNrcG9ydC11cGRhdGUuemlwIF1dOyB0aGVuCisgICAgY3VybCAtTyAtTCBodHRwczovL2dpdGh1Yi5jb20vVHVydGxlV2FyZVBML2RlLnNldGYudGhyaWZ0L2FyY2hpdmUvYmFja3BvcnQtdXBkYXRlLnppcDsKK2ZpCitta2RpciAtcCBsaWIKK3VuemlwIC11IGJhY2twb3J0LXVwZGF0ZS56aXAgLWQgbGliCmRpZmYgLS1naXQgYS9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgaGVyZSBmb3Igd2hlbiB3ZSB3YW50IHRvIGJ1aWxkIHRoZSBzZWxmLXRlc3QgYW5kIGNyb3NzLXRlc3QKKzs7OzsgYmluYXJpZXMuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcCBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhNThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCkBAIC0wLDAgKzEsMzEgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCB0aGUgYmluYXJ5IHRoYXQgcnVucyBhbGwgc2VsZi10ZXN0cy4gVGhlCis7Ozs7IGJpbmFyeSBpcyB0aGVuIG1lYW50IHRvIGJlIGhvb2tlZCB1cCB0byBUaHJpZnQncyBgbWFrZSBjaGVja2AgZmFjaWxpdHksCis7Ozs7IGJ1dCBjYW4gZWFzaWx5IGJlIHJ1biBvbiBpdHMgb3duIGFzIHdlbGwuCisKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9saWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3Rlc3QvdGhyaWZ0LXRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10ZXN0KQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgKGxldCAoKHJlc3VsdCAoaWYgKGZpYXNjbzpydW4tdGVzdHMgJ3RocmlmdC10ZXN0KSAwIC0xKSkpCisgICAgKGNsb246ZXhpdCByZXN1bHQpKSkKKworKGNsb246ZHVtcCAicnVuLXRlc3RzIiBtYWluKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL1JFQURNRSBiL2xpYi9jb2NvYS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jb2NvYS9SRUFETUUKcmVuYW1lIHRvIGxpYi9jb2NvYS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NvY29hL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTg4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbjsKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRBcHBsaWNhdGlvbkVycm9yKSB7CisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93biAgICAgICAgICAgICAgICA9IDAsCisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZCAgICAgICAgICA9IDEsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlICAgICA9IDIsCisgIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lICAgICAgICA9IDMsCisgIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZCAgICAgICAgICA9IDQsCisgIFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdCAgICAgICAgICA9IDUsCisgIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvciAgICAgICAgICA9IDYsCisgIFRBcHBsaWNhdGlvbkVycm9yUHJvdG9jb2xFcnJvciAgICAgICAgICA9IDcsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFRyYW5zZm9ybSAgICAgICA9IDgsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sICAgICAgICA9IDksCisgIFRBcHBsaWNhdGlvbkVycm9yVW5zdXBwb3J0ZWRDbGllbnRUeXBlICA9IDEwLAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTmFtZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXk7CitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OworCisKK0BpbnRlcmZhY2UgTlNFcnJvciAoVEFwcGxpY2F0aW9uRXJyb3IpCisKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZWFkb25seSwgY29weSkgTlNTdHJpbmcgKnJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIHJlYWQ6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKKy0oQk9PTCkgd3JpdGU6KGlkPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IubQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorI2ltcG9ydCAiVFByb3RvY29sVXRpbC5oIgorCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbiA9IEAiVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck5hbWVLZXkgPSBAIm5hbWUiOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5ID0gQCJyZWFzb24iOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5ID0gQCJtZXRob2QiOworCisKK0BpbXBsZW1lbnRhdGlvbiBOU0Vycm9yIChUQXBwbGljYXRpb25FcnJvcikKKworLShOU1N0cmluZyAqKSByZWFzb24KK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXldOworfQorCistKE5TU3RyaW5nICopIG5hbWUKK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5XTsKK30KKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbgoreworICBOU1N0cmluZyAqbmFtZTsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kOgorICAgIG5hbWUgPSBAIlVua25vd24gTWV0aG9kIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlOgorICAgIG5hbWUgPSBAIkludmFsaWQgTWVzc2FnZSBUeXBlIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lOgorICAgIG5hbWUgPSBAIldyb25nIE1ldGhvZCBOYW1lIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZDoKKyAgICBuYW1lID0gQCJCYWQgU2VxdWVuY2UgSUQiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JNaXNzaW5nUmVzdWx0OgorICAgIG5hbWUgPSBAIk1pc3NpbmcgUmVzdWx0IjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvcjoKKyAgICBuYW1lID0gQCJJbnRlcm5hbCBFcnJvciI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvclByb3RvY29sRXJyb3I6CisgICAgbmFtZSA9IEAiUHJvdG9jb2wgRXJyb3IiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkVHJhbnNmb3JtOgorICAgIG5hbWUgPSBAIkludmFsaWQgVHJhbnNmb3JtIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sOgorICAgIG5hbWUgPSBAIkludmFsaWQgUHJvdG9jb2wiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbnN1cHBvcnRlZENsaWVudFR5cGU6CisgICAgbmFtZSA9IEAiVW5zdXBwb3J0ZWQgQ2xpZW50IFR5cGUiOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgbmFtZSA9IEAiVW5rbm93biI7CisgICAgYnJlYWs7CisgIH0KKworICBOU0RpY3Rpb25hcnkgKnVzZXJJbmZvOworICBpZiAocmVhc29uKSB7CisgICAgdXNlckluZm8gPSBAe1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleTpuYW1lLAorICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FcnJvclJlYXNvbktleTpyZWFzb259OworICB9CisgIGVsc2UgeworICAgIHVzZXJJbmZvID0gQHtUQXBwbGljYXRpb25FcnJvck5hbWVLZXk6bmFtZX07CisgIH0KKworICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRBcHBsaWNhdGlvbkVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOnVzZXJJbmZvXTsKK30KKworCisrKGluc3RhbmNldHlwZSkgcmVhZDooaWQ8VFByb3RvY29sPilwcm90b2NvbAoreworICBOU1N0cmluZyAqcmVhc29uID0gbmlsOworICBTSW50MzIgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bjsKKyAgU0ludDMyIGZpZWxkVHlwZTsKKyAgU0ludDMyIGZpZWxkSUQ7CisKKyAgTlNFcnJvciAqZXJyb3I7CisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjomZXJyb3JdKSB7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiZmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6JmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6JmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgIGNhc2UgMToKKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVFJJTkcpIHsKKyAgICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cmluZzomcmVhc29uIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZUkzMikgeworICAgICAgICBpZiAoIVtwcm90b2NvbCByZWFkSTMyOiZ0eXBlIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkRW5kOiZlcnJvcl0pIHsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6JmVycm9yXSkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHJldHVybiBbTlNFcnJvciBlcnJvcldpdGhUeXBlOnR5cGUgcmVhc29uOnJlYXNvbl07Cit9CisKKworLShCT09MKSB3cml0ZTooaWQ8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOkAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoc2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBuaWwpIHsKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpAIm1lc3NhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoxIGVycm9yOmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJpbmc6c2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOkAidHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVJMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl0pCisgIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUkzMjooU0ludDMyKXNlbGYuY29kZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRTdG9wOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlU3RydWN0RW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE2NDFkLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotCi1lbnVtIHsKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV04gPSAwLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgPSAxLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUUgPSAzLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lEID0gNCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUID0gNQotfTsKLQotLy8gRklYTUUKLUBpbnRlcmZhY2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci0gIGludCBtVHlwZTsKLX0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIHJlYWQ6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7Ci0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIG1lc3NhZ2U7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY4NzUzLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUQXBwbGljYXRpb25FeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKLQotQGltcGxlbWVudGF0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgotCi0tIChpZCkgaW5pdFdpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIG1UeXBlID0gdHlwZTsKLQotICBOU1N0cmluZyAqIG5hbWU7Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRDoKLSAgICBuYW1lID0gQCJVbmtub3duIG1ldGhvZCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgIG5hbWUgPSBAIkludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgbmFtZSA9IEAiV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgbmFtZSA9IEAiQmFkIHNlcXVlbmNlIElEIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQ6Ci0gICAgbmFtZSA9IEAiTWlzc2luZyByZXN1bHQiOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG5hbWUgPSBAIlVua25vd24iOwotICAgIGJyZWFrOwotICB9Ci0KLSAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gdXNlckluZm86IG5pbF07Ci0gIHJldHVybiBzZWxmOwotfQotCi0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi17Ci0gIE5TU3RyaW5nICogcmVhc29uID0gbmlsOwotICBpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOOwotICBpbnQgZmllbGRUeXBlOwotICBpbnQgZmllbGRJRDsKLQotICBbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMCi0gICAgICAgICAgICAgIHR5cGU6ICZmaWVsZFR5cGUKLSAgICAgICAgICAgICAgZmllbGRJRDogJmZpZWxkSURdOwotICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaCAoZmllbGRJRCkgewotICAgIGNhc2UgMToKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RSSU5HKSB7Ci0gICAgICAgIHJlYXNvbiA9IFtwcm90b2NvbCByZWFkU3RyaW5nXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9JMzIpIHsKLSAgICAgICAgdHlwZSA9IFtwcm90b2NvbCByZWFkSTMyXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFtwcm90b2NvbCByZWFkRmllbGRFbmRdOwotICB9Ci0gIFtwcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLQotICByZXR1cm4gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogdHlwZSByZWFzb246IHJlYXNvbl07Ci19Ci0KLQotLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLXsKLSAgW3Byb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQCJUQXBwbGljYXRpb25FeGNlcHRpb24iXTsKLQotICBpZiAoW3NlbGYgcmVhc29uXSAhPSBuaWwpIHsKLSAgICBbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEAibWVzc2FnZSIKLSAgICAgICAgICAgICAgICAgdHlwZTogVFR5cGVfU1RSSU5HCi0gICAgICAgICAgICAgICAgIGZpZWxkSUQ6IDFdOwotICAgIFtwcm90b2NvbCB3cml0ZVN0cmluZzogW3NlbGYgcmVhc29uXV07Ci0gICAgW3Byb3RvY29sIHdyaXRlRmllbGRFbmRdOwotICB9Ci0KLSAgW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAInR5cGUiCi0gICAgICAgICAgICAgICB0eXBlOiBUVHlwZV9JMzIKLSAgICAgICAgICAgICAgIGZpZWxkSUQ6IDJdOwotICBbcHJvdG9jb2wgd3JpdGVJMzI6IG1UeXBlXTsKLSAgW3Byb3RvY29sIHdyaXRlRmllbGRFbmRdOwotCi0gIFtwcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07Ci0gIFtwcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07Ci19Ci0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW1tbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFR5cGU6IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb25dIGF1dG9yZWxlYXNlXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzNhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKK0BpbnRlcmZhY2UgVEJhc2VDbGllbnQgOiBOU09iamVjdAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDljYWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5tCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEJhc2VDbGllbnQuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKKworQGludGVyZmFjZSBUQmFzZUNsaWVudCAoKQorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUQmFzZUNsaWVudAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4paW5Qcm90b2NvbAoreworICBOU0Vycm9yICp0aHJpZnRFcnJvcjsKKworICBTSW50MzIgbXNnVHlwZSA9IDA7CisgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmlsIHR5cGU6Jm1zZ1R5cGUgc2VxdWVuY2VJRDpOVUxMIGVycm9yOiZ0aHJpZnRFcnJvcl0pIHsKKyAgICByZXR1cm4gdGhyaWZ0RXJyb3I7CisgIH0KKworICBpZiAobXNnVHlwZSA9PSBUTWVzc2FnZVR5cGVFWENFUFRJT04pIHsKKworICAgIHRocmlmdEVycm9yID0gW05TRXJyb3IgcmVhZDppblByb3RvY29sXTsKKworICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOk5VTExdOworCisgICAgcmV0dXJuIHRocmlmdEVycm9yOworICB9CisKKyAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTM2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgc3RydWN0IFRCaW5hcnkgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuU1RSSU5HIH0KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBOU0RhdGEKKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IE5TRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGNvbnRlbnRzT2ZGaWxlIGZpbGU6IFN0cmluZywgb3B0aW9uczogTlNEYXRhUmVhZGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSB0cnkgTlNEYXRhKGNvbnRlbnRzT2ZGaWxlOiBmaWxlLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgaW5pdChjb250ZW50c09mVVJMIFVSTDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVJlYWRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgc2VsZi5zdG9yYWdlID0gdHJ5IE5TRGF0YShjb250ZW50c09mVVJMOiBVUkwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PyhiYXNlNjRFbmNvZGVkRGF0YSBiYXNlNjREYXRhOiBOU0RhdGEsIG9wdGlvbnM6IE5TRGF0YUJhc2U2NERlY29kaW5nT3B0aW9ucyA9IFtdKSB7CisgICAgZ3VhcmQgbGV0IHN0b3JhZ2UgPSBOU0RhdGEoYmFzZTY0RW5jb2RlZERhdGE6IGJhc2U2NERhdGEsIG9wdGlvbnM6IG9wdGlvbnMpIGVsc2UgeworICAgICAgcmV0dXJuIG5pbAorICAgIH0KKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGRhdGE6IE5TRGF0YSkgeworICAgIHNlbGYuc3RvcmFnZSA9IGRhdGEKKyAgfQorICAKKyAgcHVibGljIHZhciBsZW5ndGggOiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmxlbmd0aAorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaGFzaFZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgYnl0ZXMgOiBVbnNhZmVQb2ludGVyPFZvaWQ+IHsKKyAgICByZXR1cm4gc3RvcmFnZS5ieXRlcworICB9CisgIAorICBwdWJsaWMgZnVuYyBnZXRCeXRlcyhidWZmZXI6IFVuc2FmZU11dGFibGVQb2ludGVyPFZvaWQ+LCBsZW5ndGg6IEludCkgeworICAgIHN0b3JhZ2UuZ2V0Qnl0ZXMoYnVmZmVyLCBsZW5ndGg6IGxlbmd0aCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZ2V0Qnl0ZXMoYnVmZmVyOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxWb2lkPiwgcmFuZ2U6IFJhbmdlPEludD4pIHsKKyAgICBzdG9yYWdlLmdldEJ5dGVzKGJ1ZmZlciwgcmFuZ2U6IE5TUmFuZ2UocmFuZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJCaW5hcnlXaXRoUmFuZ2UocmFuZ2U6IFJhbmdlPEludD4pIC0+IFRCaW5hcnkgeworICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IHN0b3JhZ2Uuc3ViZGF0YVdpdGhSYW5nZShOU1JhbmdlKHJhbmdlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVG9GaWxlKHBhdGg6IFN0cmluZywgb3B0aW9uczogTlNEYXRhV3JpdGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICB0cnkgc3RvcmFnZS53cml0ZVRvRmlsZShwYXRoLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVRvVVJMKHVybDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVdyaXRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgdHJ5IHN0b3JhZ2Uud3JpdGVUb1VSTCh1cmwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJhbmdlT2ZEYXRhKGRhdGFUb0ZpbmQgZGF0YTogTlNEYXRhLCBvcHRpb25zOiBOU0RhdGFTZWFyY2hPcHRpb25zLCByYW5nZTogUmFuZ2U8SW50PikgLT4gUmFuZ2U8SW50Pj8geworICAgIHJldHVybiBzdG9yYWdlLnJhbmdlT2ZEYXRhKGRhdGEsIG9wdGlvbnM6IG9wdGlvbnMsIHJhbmdlOiBOU1JhbmdlKHJhbmdlKSkudG9SYW5nZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGVudW1lcmF0ZUJ5dGVSYW5nZXNVc2luZ0Jsb2NrKGJsb2NrOiAoVW5zYWZlUG9pbnRlcjxWb2lkPiwgUmFuZ2U8SW50PiwgaW5vdXQgQm9vbCkgLT4gVm9pZCkgeworICAgIHN0b3JhZ2UuZW51bWVyYXRlQnl0ZVJhbmdlc1VzaW5nQmxvY2sgeyBieXRlcywgcmFuZ2UsIHN0b3AgaW4KKyAgICAgIHZhciBzdG9wVG1wID0gQm9vbChzdG9wLm1lbW9yeSkKKyAgICAgIGJsb2NrKGJ5dGVzLCByYW5nZS50b1JhbmdlKCkhLCAmc3RvcFRtcCkKKyAgICAgIHN0b3AubWVtb3J5ID0gT2JqQ0Jvb2woc3RvcFRtcCkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRCaW5hcnkgeworICAgIHZhciBkYXRhIDogTlNEYXRhPworICAgIHRyeSBwcm90by5yZWFkQmluYXJ5KCZkYXRhKQorICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IGRhdGEhKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVEJpbmFyeSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJpbmFyeSh2YWx1ZS5zdG9yYWdlKQorICB9CisgIAorfQorCitleHRlbnNpb24gVEJpbmFyeSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRCaW5hcnksIHJoczogVEJpbmFyeSkgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URW51bS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyYTUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBURW51bSA6IFRTZXJpYWxpemFibGUgeworICAKK30KKworcHVibGljIGV4dGVuc2lvbiBURW51bSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuSTMyIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFcnJvci5oIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI3MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK2V4dGVybiBOU1N0cmluZyAqVEVycm9yRG9tYWluOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3ZjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitOU1N0cmluZyAqVEVycm9yRG9tYWluID0gQCJURXJyb3JEb21haW4iOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZjRmYS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLUBpbnRlcmZhY2UgVEV4Y2VwdGlvbiA6IE5TRXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODQxOTkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiBAInVua25vd24iIGVycm9yOiBuaWxdOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gZXJyb3I6IG5pbF07Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUKLSAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB1c2VySW5mb107Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KLXsKLSAgTlNNdXRhYmxlU3RyaW5nICogcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBbc2VsZiBuYW1lXV07Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OiBAIjogJUAiLCBbc2VsZiByZWFzb25dXTsKLSAgaWYgKFtzZWxmIHVzZXJJbmZvXSAhPSBuaWwpIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDogQCJcbiAgdXNlckluZm8gPSAlQCIsIFtzZWxmIHVzZXJJbmZvXV07Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVExpc3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0CkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IE11dGFibGVDb2xsZWN0aW9uVHlwZSwgSGFzaGFibGUsIEFycmF5TGl0ZXJhbENvbnZlcnRpYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuTElTVCB9CisgIAorICB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKHN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBhcHBlbmQobmV3RWxlbWVudDogRWxlbWVudCkgeworICAgIHNlbGYuc3RvcmFnZS5hcHBlbmQobmV3RWxlbWVudCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgYXBwZW5kQ29udGVudHNPZjxDIDogQ29sbGVjdGlvblR5cGUgd2hlcmUgQy5HZW5lcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50PihuZXdzdG9yYWdlOiBDKSB7CisgICAgc2VsZi5zdG9yYWdlLmFwcGVuZENvbnRlbnRzT2YobmV3c3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KG5ld0VsZW1lbnQ6IEVsZW1lbnQsIGF0SW5kZXggaW5kZXg6IEludCkgeworICAgIHNlbGYuc3RvcmFnZS5pbnNlcnQobmV3RWxlbWVudCwgYXRJbmRleDogaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydENvbnRlbnRzT2Y8QyA6IENvbGxlY3Rpb25UeXBlIHdoZXJlIEMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4obmV3RWxlbWVudHM6IEMsIGF0IGluZGV4OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuaW5zZXJ0Q29udGVudHNPZihuZXdFbGVtZW50cywgYXQ6IGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IHRydWUpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBJbmRleCkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVGaXJzdChuOiBJbnQgPSAwKSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUZpcnN0KG4pCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUxhc3QoKSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc2VsZi5zdG9yYWdlLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVSYW5nZShzdWJSYW5nZTogUmFuZ2U8SW5kZXg+KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZVJhbmdlKHN1YlJhbmdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXNlcnZlQ2FwYWNpdHkobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVzZXJ2ZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBUUHJvdG9jb2xFeHRlbmRlZEVycm9yLlVuZXhwZWN0ZWRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUTGlzdCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciBlbGVtZW50IGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGVWYWx1ZShlbGVtZW50LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZlNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UTWFwLnN3aWZ0CkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUsIFZhbHVlIDogVFNlcmlhbGl6YWJsZT4gOiBDb2xsZWN0aW9uVHlwZSwgRGljdGlvbmFyeUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLk1BUCB9CisKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBEaWN0aW9uYXJ5PEtleSwgVmFsdWU+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKworICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICAKKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKworICBwdWJsaWMgdmFyIGtleXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIEtleT4geworICAgIHJldHVybiBzdG9yYWdlLmtleXMKKyAgfQorICAKKyAgcHVibGljIHZhciB2YWx1ZXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIFZhbHVlPiB7CisgICAgcmV0dXJuIHN0b3JhZ2UudmFsdWVzCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoZGljdGlvbmFyeUxpdGVyYWwgZWxlbWVudHM6IChLZXksIFZhbHVlKS4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIGVsZW1lbnRzIHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgaW5pdChtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKG1pbmltdW1DYXBhY2l0eTogbWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KGtleTogS2V5KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4Rm9yS2V5KGtleSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUodmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogRGljdGlvbmFyeUluZGV4PEtleSwgVmFsdWU+KSAtPiAoS2V5LCBWYWx1ZSkgeworICAgIHJldHVybiByZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVWYWx1ZUZvcktleShrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZUZvcktleShrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUFsbChrZWVwQ2FwYWNpdHkga2VlcENhcGFjaXR5OiBCb29sID0gZmFsc2UpIHsKKyAgICBzdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKyAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZE1hcEJlZ2luKCkKKyAgICBpZiBrZXlUeXBlICE9IEtleS50aHJpZnRUeXBlIHx8IHZhbHVlVHlwZSAhPSBWYWx1ZS50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IFRQcm90b2NvbEV4dGVuZGVkRXJyb3IuVW5leHBlY3RlZFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIG1hcCA9IFRNYXAoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBrZXkgPSB0cnkgS2V5LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRNYXAsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKEtleS50aHJpZnRUeXBlLCB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlVmFsdWUoa2V5LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICAgIHRyeSBWYWx1ZS53cml0ZVZhbHVlKHZhbHVlLCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorICAKK30KKworCitleHRlbnNpb24gVE1hcCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCmluZGV4IDk4MGJlOTQuLjIwYzcyZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCkBAIC0yMCwxMCArMjAsMTYgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKIAogQHByb3RvY29sIFRQcm9jZXNzb3IgPE5TT2JqZWN0PgogCi0tIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7CistKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KWluUHJvdG9jb2wKKyAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCmluZGV4IDI5ZDEyYjMuLjg1MDIwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKQEAgLTIwLDggKzIwLDE0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm9jZXNzb3IuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCiBAcHJvdG9jb2wgVFByb2Nlc3NvckZhY3RvcnkgPE5TT2JqZWN0PgogCi0tIChpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiAoaWQ8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQpIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPworICAgIHZhciB0eXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzZXF1ZW5jZUlEIDogSW50MzIgPSAtMQorICAgIAorICAgIHRyeSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSwgdHlwZTogJnR5cGUsIHNlcXVlbmNlSUQ6ICZzZXF1ZW5jZUlEKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmchLCBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IHR5cGUpISwgSW50KHNlcXVlbmNlSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWU6IFN0cmluZywgdHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgc2VxdWVuY2VJRDogSW50MzIoc2VxdWVuY2VJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nPykgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/ID0gbmlsCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWUoJm5hbWUpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmc/LCBUVHlwZSwgSW50KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8gPSBuaWwKKyAgICB2YXIgdHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgZmllbGRJRCA6IEludDMyID0gLTEKKyAgICAKKyAgICB0cnkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lLCB0eXBlOiAmdHlwZSwgZmllbGRJRDogJmZpZWxkSUQpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8sIFRUeXBlKHJhd1ZhbHVlOiB0eXBlKSEsIEludChmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgZmllbGRJRDogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBJbnQzMihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGtleVR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHZhbHVlVHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlKCZrZXlUeXBlLCB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGtleVR5cGUpISwgVFR5cGUocmF3VmFsdWU6IHZhbHVlVHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGUoa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKGtleVR5cGUucmF3VmFsdWUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICB2YXIgZWxlbWVudFR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGUoJmVsZW1lbnRUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBlbGVtZW50VHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGVsZW1lbnRUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZSgmZWxlbWVudFR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGVsZW1lbnRUeXBlKSEsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPih2YWx1ZTogVCwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBpZCkKKyAgICB0cnkgd3JpdGVWYWx1ZSh2YWx1ZSkKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPigpIHRocm93cyAtPiBUIHsKKyAgICByZXR1cm4gdHJ5IFQucmVhZFZhbHVlRnJvbVByb3RvY29sKHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4odmFsdWU6IFQpIHRocm93cyB7CisgICAgdHJ5IFQud3JpdGVWYWx1ZSh2YWx1ZSwgdG9Qcm90b2NvbDogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgCisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgCisgICAgaWYgdHlwZSA9PSAuRVhDRVBUSU9OIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICAKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIAorICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuVW5rbm93bi5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk6IG5hbWVdKQorICAgIH0KKyAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBFcnJvclR5cGUgeworICAgIAorICAgIHZhciByZWFzb24gOiBTdHJpbmc/CisgICAgdmFyIHR5cGUgPSBUQXBwbGljYXRpb25FcnJvci5Vbmtub3duCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgCisgICAgZmllbGRzOiB3aGlsZSAodHJ1ZSkgeworICAgICAgCisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLlNUT1ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgICAgCisgICAgICBjYXNlICgxLCAuU1RSSU5HKToKKyAgICAgICAgcmVhc29uID0gdHJ5IHJlYWRWYWx1ZSgpIGFzIFN0cmluZworICAgICAgICAKKyAgICAgIGNhc2UgKDIsIC5JMzIpOgorICAgICAgICBsZXQgdHlwZVZhbCA9IHRyeSByZWFkVmFsdWUoKSBhcyBJbnQzMgorICAgICAgICBpZiBsZXQgdG1wID0gVEFwcGxpY2F0aW9uRXJyb3IocmF3VmFsdWU6IHR5cGVWYWwpIHsKKyAgICAgICAgICB0eXBlID0gdG1wCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgc2tpcFR5cGUodW5rbm93blR5cGUpCisgICAgICB9CisgICAgICAKKyAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgIH0KKyAgICAKKyAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgCisgICAgcmV0dXJuIE5TRXJyb3IodHlwZTp0eXBlLCByZWFzb246cmVhc29uID8/ICIiKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50LCBleDogTlNFcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiAuRVhDRVBUSU9OLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZShzZWxmKQorICAgIHRyeSB3cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBza2lwVHlwZSh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICB0cnkgVFByb3RvY29sVXRpbC5za2lwVHlwZSh0eXBlLnJhd1ZhbHVlLCBvblByb3RvY29sOiBzZWxmKQorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RTZXJpYWxpemFibGUuc3dpZnQKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFNlcmlhbGl6YWJsZSA6IEhhc2hhYmxlIHsKKyAgCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorICAKKyAgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTZWxmCisgIAorICBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBTZWxmLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworICAKK30KKworCisKK2luZml4IG9wZXJhdG9yID89PSB7fQorCitwdWJsaWMgZnVuYyA/PT08VDogVFNlcmlhbGl6YWJsZT4obGhzOiBUPywgcmhzOiBUPykgLT4gQm9vbCB7CisgIGlmIGxldCBsID0gbGhzLCByID0gcmhzIHsKKyAgICByZXR1cm4gbCA9PSByCisgIH0KKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworcHVibGljIGZ1bmMgPz09PFQ6IFRTZXJpYWxpemFibGU+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQk9PTAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgdmFyIHZhbHVlIDogT2JqQ0Jvb2wgPSBmYWxzZQorICAgIHRyeSBwcm90by5yZWFkQm9vbCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlLmJvb2xWYWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogQm9vbCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJvb2wodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ4IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQllURQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50OCB7CisgICAgdmFyIHZhbHVlID0gVUludDgoKQorICAgIHRyeSBwcm90by5yZWFkQnl0ZSgmdmFsdWUpCisgICAgcmV0dXJuIEludDgodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ4LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlQnl0ZShVSW50OCh2YWx1ZSkpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQxNiA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkxNgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciB2YWx1ZSA9IEludDE2KCkKKyAgICB0cnkgcHJvdG8ucmVhZEkxNigmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQxNiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUkxNih2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkzMgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiBJbnQodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIoSW50MzIodmFsdWUpKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMzIKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50MzIsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ2NCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkk2NAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHZhciB2YWx1ZSA9IEludDY0KCkKKyAgICB0cnkgcHJvdG8ucmVhZEk2NCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ2NCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUk2NCh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIERvdWJsZSA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkRPVUJMRQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgdmFsdWUgPSBEb3VibGUoKQorICAgIHRyeSBwcm90by5yZWFkRG91YmxlKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IERvdWJsZSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZURvdWJsZSh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLlNUUklORworICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICB2YXIgdmFsdWUgOiBOU1N0cmluZz8KKyAgICB0cnkgcHJvdG8ucmVhZFN0cmluZygmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlIGFzISBTdHJpbmcKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFN0cmluZywgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cmluZyh2YWx1ZSkKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTgzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUU2V0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IENvbGxlY3Rpb25UeXBlLCBBcnJheUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLlNFVCB9CisgIAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIAorICBwdWJsaWMgaW5pdDxTIDogU2VxdWVuY2VUeXBlIHdoZXJlIFMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4oXyBzZXF1ZW5jZTogUykgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKSAgICAKKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChtZW1iZXI6IEVsZW1lbnQpIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbnNlcnQobWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmUoZWxlbWVudDogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShlbGVtZW50KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBTZXRJbmRleDxFbGVtZW50PikgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFNldEluZGV4PEVsZW1lbnQ+KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24ob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UudW5pb24ob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbnRlcnNlY3Qob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuaW50ZXJzZWN0KG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZXhjbHVzaXZlT3Iob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuZXhjbHVzaXZlT3Iob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJ0cmFjdChvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS5zdWJ0cmFjdChvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGludGVyc2VjdEluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmludGVyc2VjdEluUGxhY2Uob3RoZXIpCisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBleGNsdXNpdmVPckluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmV4Y2x1c2l2ZU9ySW5QbGFjZShvdGhlcikKKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHN1YnRyYWN0SW5QbGFjZShvdGhlcjogVFNldCkgeworICAgIHN0b3JhZ2Uuc3VidHJhY3RJblBsYWNlKG90aGVyKQorICB9ICAKKworICBwdWJsaWMgZnVuYyBpc1N1YnNldE9mKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc1N1YnNldE9mKG90aGVyKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNEaXNqb2ludFdpdGgob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzRGlzam9pbnRXaXRoKG90aGVyKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpc1N1cGVyc2V0T2Yob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzU3VwZXJzZXRPZihvdGhlcikKKyAgfQorCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVFNldCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZFNldEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogZWxlbWVudFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUU2V0LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGUoRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlVmFsdWUoZWxlbWVudCwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBUU2V0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVFNldDxFbGVtZW50PiwgcmhzOiBUU2V0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKaW5kZXggZDNlNTVjNC4uYzc1ZmFkMSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaApAQCAtMjAsOCArMjAsOSBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvY2Vzc29yRmFjdG9yeS5oIgogCi1AaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PiB7Ci0gIGlkPFRQcm9jZXNzb3I+IG1TaGFyZWRQcm9jZXNzb3I7Ci19CisKK0BpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgOiBOU09iamVjdCA8VFByb2Nlc3NvckZhY3Rvcnk+CisKKy0oaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOihpZDxUUHJvY2Vzc29yPilzaGFyZWRQcm9jZXNzb3I7CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubSBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQppbmRleCBiMzhlNzNhLi4zZDU1ZjQ3IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KKysrIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCkBAIC0yMSwzMSArMjEsMjkgQEAKICNpbXBvcnQgIlRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgiCiAKIAorQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm9jZXNzb3I+IHNoYXJlZFByb2Nlc3NvcjsKKworQGVuZAorCisKIEBpbXBsZW1lbnRhdGlvbiBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeQogCiAKLS0gKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjogKGlkPFRQcm9jZXNzb3I+KSBzaGFyZWRQcm9jZXNzb3IKKy0oaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOihpZDxUUHJvY2Vzc29yPilzaGFyZWRQcm9jZXNzb3IKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKCFzZWxmKSB7Ci0gICAgcmV0dXJuIG5pbDsKKyAgaWYgKHNlbGYpIHsKKyAgICBfc2hhcmVkUHJvY2Vzc29yID0gc2hhcmVkUHJvY2Vzc29yOwogICB9Ci0gIAotICBtU2hhcmVkUHJvY2Vzc29yID0gW3NoYXJlZFByb2Nlc3NvciByZXRhaW5dOworCiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKHZvaWQpIGRlYWxsb2MKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CiB7Ci0gIFttU2hhcmVkUHJvY2Vzc29yIHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLQotLSAoaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDogKGlkPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIFtbbVNoYXJlZFByb2Nlc3NvciByZXRhaW5dIGF1dG9yZWxlYXNlXTsKKyAgcmV0dXJuIF9zaGFyZWRQcm9jZXNzb3I7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWE3MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU3RydWN0LnN3aWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworfQorCisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuU1RSVUNUIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RocmlmdC5oIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE4MjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgVGhyaWZ0VmVyc2lvbiBAIjEuMC4wIgpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzVkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK0Bwcm90b2NvbCBUQmFzZSA8TlNPYmplY3Q+CisKKy8qKgorICogRGUtc2VyaWFsaXplIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAorICoKKyAqIEBwYXJhbSBpblByb3RvY29sIHByb3RvY29sIHVzZWQgZm9yIHJlYWRpbmcKKyAqLworLShCT09MKSByZWFkOihpZCA8VFByb3RvY29sPilpblByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisvKioKKyAqIFNlcmlhbGl6ZSBvYmplY3QgdG8gdGhlIGdpdmVuIHByb3RvY29sCisgKgorICogQHBhcmFtIG91dFByb3RvY29sIG91dHB1dCBwcm90b2NvbCB1c2VkIGZvciB3cml0aW5nCisgKi8KKy0oQk9PTCkgd3JpdGU6KGlkIDxUUHJvdG9jb2w+KW91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisKKy8qKgorICogVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzCisgKi8KKy0oQk9PTCkgdmFsaWRhdGU6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3I7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IDUyY2YyNjYuLmJiOTBmYWQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMjEsMzEgKzIxLDI5IEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4gewotICBpZCA8VFRyYW5zcG9ydD4gbVRyYW5zcG9ydDsKLSAgQk9PTCBtU3RyaWN0UmVhZDsKLSAgQk9PTCBtU3RyaWN0V3JpdGU7Ci0gIGludDMyX3QgbU1lc3NhZ2VTaXplTGltaXQ7Ci19CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPgogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGU7CitAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBVSW50MzIgbWVzc2FnZVNpemVMaW1pdDsKIAotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdDsKLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQ7CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlOwogCiBAZW5kOwogCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PiB7Ci19CitAaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4KIAotKyAoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OworKyhUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CiAKLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KaW5kZXggYjI3MjcxNi4uMWY5ZTU3YSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCkBAIC0xOCwxNyArMTgsMjAgQEAKICAqLwogCiAjaW1wb3J0ICJUQmluYXJ5UHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotCi1pbnQzMl90IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci1pbnQzMl90IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgogCiAKLXN0YXRpYyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICogZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CitzdGF0aWMgU0ludDMyIFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CitzdGF0aWMgU0ludDMyIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisKKworc3RhdGljIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKmdTaGFyZWRGYWN0b3J5ID0gbmlsOworCiAKIEBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5CiAKLSsgKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeSB7CisrKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQorewogICBpZiAoZ1NoYXJlZEZhY3RvcnkgPT0gbmlsKSB7CiAgICAgZ1NoYXJlZEZhY3RvcnkgPSBbW1RCaW5hcnlQcm90b2NvbEZhY3RvcnkgYWxsb2NdIGluaXRdOwogICB9CkBAIC0zNiwzNTggKzM5LDU1MyBAQAogICByZXR1cm4gZ1NoYXJlZEZhY3Rvcnk7CiB9CiAKLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQgewotICByZXR1cm4gW1tUQmluYXJ5UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OiB0cmFuc3BvcnRdOworLShOU1N0cmluZyAqKSBwcm90b2NvbE5hbWUKK3sKKyAgcmV0dXJuIEAiYmluYXJ5IjsKK30KKworLShUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAoreworICByZXR1cm4gW1tUQmluYXJ5UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OnRyYW5zcG9ydF07CiB9CiAKIEBlbmQKIAogCitAaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkIDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgQk9PTCBzdHJpY3RSZWFkOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBCT09MIHN0cmljdFdyaXRlOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50TWVzc2FnZU5hbWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50RmllbGROYW1lOworCitAZW5kCisKIAogQGltcGxlbWVudGF0aW9uIFRCaW5hcnlQcm90b2NvbAogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAorLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0PilhVHJhbnNwb3J0CiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFRyYW5zcG9ydDogdHJhbnNwb3J0IHN0cmljdFJlYWQ6IE5PIHN0cmljdFdyaXRlOiBOT107CisgIHJldHVybiBbc2VsZiBpbml0V2l0aFRyYW5zcG9ydDphVHJhbnNwb3J0IHN0cmljdFJlYWQ6Tk8gc3RyaWN0V3JpdGU6WUVTXTsKIH0KIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgc3RyaWN0UmVhZDogKEJPT0wpIHN0cmljdFJlYWQKLSAgICAgICAgICAgICBzdHJpY3RXcml0ZTogKEJPT0wpIHN0cmljdFdyaXRlCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAorICAgICAgICAgICAgIHN0cmljdFJlYWQ6KEJPT0wpc3RyaWN0UmVhZAorICAgICAgICAgICAgc3RyaWN0V3JpdGU6KEJPT0wpc3RyaWN0V3JpdGUKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgbVRyYW5zcG9ydCA9IFt0cmFuc3BvcnQgcmV0YWluXTsKLSAgbVN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOwotICBtU3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIF9zdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKKyAgICBfc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tIChpbnQzMl90KSBtZXNzYWdlU2l6ZUxpbWl0CistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0CiB7Ci0gIHJldHVybiBtTWVzc2FnZVNpemVMaW1pdDsKKyAgcmV0dXJuIF90cmFuc3BvcnQ7CiB9CiAKLQotLSAodm9pZCkgc2V0TWVzc2FnZVNpemVMaW1pdDogKGludDMyX3QpIHNpemVMaW1pdAorLShOU1N0cmluZyAqKSByZWFkU3RyaW5nQm9keTooaW50KXNpemUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3IKIHsKLSAgbU1lc3NhZ2VTaXplTGltaXQgPSBzaXplTGltaXQ7Ci19Ci0KLQotLSAodm9pZCkgZGVhbGxvYwotewotICBbbVRyYW5zcG9ydCByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci17Ci0gIHJldHVybiBtVHJhbnNwb3J0OwotfQotCi0KLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmdCb2R5OiAoaW50KSBzaXplCi17Ci0gIGNoYXIgKiBidWZmZXIgPSBtYWxsb2Moc2l6ZSsxKTsKLSAgaWYgKCFidWZmZXIpIHsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gJXMsIHNpemU6ICVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJFVFRZX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXV07OworICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6c2l6ZV07CisgIGlmICghZGF0YSkgeworICAgIFBST1RPQ09MX0VSUk9SKG5pbCwgVW5rbm93biwgQCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMiLCBzaXplKTsKICAgfQotICBbbVRyYW5zcG9ydCByZWFkQWxsOiAodWludDhfdCAqKSBidWZmZXIgb2Zmc2V0OiAwIGxlbmd0aDogc2l6ZV07Ci0gIGJ1ZmZlcltzaXplXSA9IDA7Ci0gIE5TU3RyaW5nICogcmVzdWx0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOiBidWZmZXJdOwotICBmcmVlKGJ1ZmZlcik7Ci0gIHJldHVybiByZXN1bHQ7CisKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmRhdGEubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihuaWwsIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhIGVuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKIH0KIAogCi0tICh2b2lkKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBzZXF1ZW5jZUlECistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKil0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIgKilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQzMl90IHNpemUgPSBbc2VsZiByZWFkSTMyXTsKKyAgU0ludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgOworCiAgIGlmIChzaXplIDwgMCkgewogICAgIGludCB2ZXJzaW9uID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKLSAgICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQCJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIl07CisgICAgICBQUk9UT0NPTF9FUlJPUihOTywgQmFkVmVyc2lvbiwgQCJCYWQgbWVzc2FnZSB2ZXJzaW9uIik7CiAgICAgfQogICAgIGlmICh0eXBlICE9IE5VTEwpIHsKLSAgICAgICp0eXBlID0gdmVyc2lvbiAmIDB4MDBGRjsKKyAgICAgICp0eXBlID0gc2l6ZSAmIDB4MDBGRjsKICAgICB9Ci0gICAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZSA9IFtzZWxmIHJlYWRTdHJpbmddOworICAgIE5TU3RyaW5nICptZXNzYWdlTmFtZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRTdHJpbmc6Jm1lc3NhZ2VOYW1lIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAobmFtZSAhPSBuaWwpIHsKKyAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7CisgICAgfQorICB9CisgIGVsc2UgeworCisgICAgaWYgKF9zdHJpY3RSZWFkKSB7CisgICAgICBQUk9UT0NPTF9FUlJPUihOTywgSW52YWxpZERhdGEsIEAiTWlzc2luZyBtZXNzYWdlIHZlcnNpb24sIG9sZCBjbGllbnQ/Iik7CisgICAgfQorCisgICAgaWYgKF9tZXNzYWdlU2l6ZUxpbWl0ID4gMCAmJiBzaXplID4gX21lc3NhZ2VTaXplTGltaXQpIHsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBTaXplTGltaXQsIEAiTWVzc2FnZSBleGNlZWVkcyBzaXplIGxpbWl0IG9mICVkIiwgKGludClzaXplKTsKKyAgICB9CisKKyAgICBOU1N0cmluZyAqbWVzc2FnZU5hbWUgPSBbc2VsZiByZWFkU3RyaW5nQm9keTpzaXplIGVycm9yOmVycm9yXTsKKyAgICBpZiAoIW1lc3NhZ2VOYW1lKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCiAgICAgaWYgKG5hbWUgIT0gTlVMTCkgewogICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKICAgICB9Ci0gICAgaW50IHNlcUlEID0gW3NlbGYgcmVhZEkzMl07Ci0gICAgaWYgKHNlcXVlbmNlSUQgIT0gTlVMTCkgewotICAgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKKworICAgIFVJbnQ4IG1lc3NhZ2VUeXBlOworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6Jm1lc3NhZ2VUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAobVN0cmljdFJlYWQpIHsKLSAgICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQCJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iXTsKLSAgICB9Ci0gICAgaWYgKFtzZWxmIG1lc3NhZ2VTaXplTGltaXRdID4gMCAmJiBzaXplID4gW3NlbGYgbWVzc2FnZVNpemVMaW1pdF0pIHsKLSAgICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJNZXNzYWdlIHRvbyBiaWcuICBTaXplIGxpbWl0IGlzOiAlZCBNZXNzYWdlIHNpemUgaXM6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VTaXplTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTsKLSAgICB9Ci0gICAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZSA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OiBzaXplXTsKLSAgICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOwotICAgIH0KLSAgICBpbnQgbWVzc2FnZVR5cGUgPSBbc2VsZiByZWFkQnl0ZV07CisKICAgICBpZiAodHlwZSAhPSBOVUxMKSB7CiAgICAgICAqdHlwZSA9IG1lc3NhZ2VUeXBlOwogICAgIH0KLSAgICBpbnQgc2VxSUQgPSBbc2VsZiByZWFkSTMyXTsKLSAgICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7Ci0gICAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOwotICAgIH0KICAgfQorCisgIFNJbnQzMiBzZXFJRDsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzZXFJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKHNlcXVlbmNlSUQgIT0gTlVMTCkgeworICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNZXNzYWdlRW5kIHt9Ci0KLQotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgKm5hbWUgPSBuaWw7Ci0gIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkU3RydWN0RW5kIHt9Ci0KLQotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElECistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpZiAobmFtZSAhPSBOVUxMKSB7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMiAqKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAobmFtZSAhPSBuaWwpIHsKICAgICAqbmFtZSA9IG5pbDsKICAgfQotICBpbnQgZnQgPSBbc2VsZiByZWFkQnl0ZV07CisKKyAgVUludDggZnQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmZ0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQogICBpZiAoZmllbGRUeXBlICE9IE5VTEwpIHsKICAgICAqZmllbGRUeXBlID0gZnQ7CiAgIH0KLSAgaWYgKGZ0ICE9IFRUeXBlX1NUT1ApIHsKLSAgICBpbnQgZmlkID0gW3NlbGYgcmVhZEkxNl07CisgIGlmIChmdCAhPSBUVHlwZVNUT1ApIHsKKyAgICBTSW50MTYgZmlkOworICAgIGlmICghW3NlbGYgcmVhZEkxNjomZmlkIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgICBpZiAoZmllbGRJRCAhPSBOVUxMKSB7CiAgICAgICAqZmllbGRJRCA9IGZpZDsKICAgICB9CiAgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSByZWFkRmllbGRFbmQge30KLQotCi0tIChpbnQzMl90KSByZWFkSTMyCistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBpMzJyZFs0XTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogaTMycmQgb2Zmc2V0OiAwIGxlbmd0aDogNF07Ci0gIHJldHVybgorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIE5TU3RyaW5nICpzdHJpbmcgPSBbc2VsZiByZWFkU3RyaW5nQm9keTpzaXplIGVycm9yOmVycm9yXTsKKyAgaWYgKCFzdHJpbmcpIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICAqdmFsdWUgPSBzdHJpbmc7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ5dGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmJ5dGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgKnZhbHVlID0gYnl0ZSA9PSAxOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZlsxXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9IGJ1ZmZbMF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzJdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MiBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KKyAgICAoKFNJbnQxNikoYnVmZlswXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAoKFNJbnQxNikoYnVmZlsxXSAmIDB4ZmYpKTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGkzMnJkWzRdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6aTMycmQgb2Zmc2V0OjAgbGVuZ3RoOjQgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9CiAgICAgKChpMzJyZFswXSAmIDB4ZmYpIDw8IDI0KSB8CiAgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8CiAgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8CiAgICAgKChpMzJyZFszXSAmIDB4ZmYpKTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmcKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIHJldHVybiBbc2VsZiByZWFkU3RyaW5nQm9keTogc2l6ZV07CisgIFVJbnQ4IGJ1ZmZbOF07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQorICAgICgoU0ludDY0KShidWZmWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlsxXSAmIDB4ZmYpIDw8IDQ4KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICgoU0ludDY0KShidWZmWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls0XSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICgoU0ludDY0KShidWZmWzZdICYgMHhmZikgPDwgIDgpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls3XSAmIDB4ZmYpKTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKEJPT0wpIHJlYWRCb29sCi17Ci0gIHJldHVybiBbc2VsZiByZWFkQnl0ZV0gPT0gMTsKLX0KLQotLSAodWludDhfdCkgcmVhZEJ5dGUKLXsKLSAgdWludDhfdCBteUJ5dGU7Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICZteUJ5dGUgb2Zmc2V0OiAwIGxlbmd0aDogMV07Ci0gIHJldHVybiBteUJ5dGU7Ci19Ci0KLS0gKHNob3J0KSByZWFkSTE2Ci17Ci0gIHVpbnQ4X3QgYnVmZlsyXTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKLSAgcmV0dXJuIChzaG9ydCkKLSAgICAoKChidWZmWzBdICYgMHhmZikgPDwgOCkgfAotICAgICAoKGJ1ZmZbMV0gJiAweGZmKSkpOwotICByZXR1cm4gMDsKLX0KLQotLSAoaW50NjRfdCkgcmVhZEk2NDsKLXsKLSAgdWludDhfdCBpNjRyZFs4XTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogaTY0cmQgb2Zmc2V0OiAwIGxlbmd0aDogOF07Ci0gIHJldHVybgotICAgICgoaW50NjRfdCkoaTY0cmRbMF0gJiAweGZmKSA8PCA1NikgfAotICAgICgoaW50NjRfdCkoaTY0cmRbMV0gJiAweGZmKSA8PCA0OCkgfAotICAgICgoaW50NjRfdCkoaTY0cmRbMl0gJiAweGZmKSA8PCA0MCkgfAotICAgICgoaW50NjRfdCkoaTY0cmRbM10gJiAweGZmKSA8PCAzMikgfAotICAgICgoaW50NjRfdCkoaTY0cmRbNF0gJiAweGZmKSA8PCAyNCkgfAotICAgICgoaW50NjRfdCkoaTY0cmRbNV0gJiAweGZmKSA8PCAxNikgfAotICAgICgoaW50NjRfdCkoaTY0cmRbNl0gJiAweGZmKSA8PCAgOCkgfAotICAgICgoaW50NjRfdCkoaTY0cmRbN10gJiAweGZmKSk7Ci19Ci0KLS0gKGRvdWJsZSkgcmVhZERvdWJsZTsKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7CiAgIC8vIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbnRvIHRyb3VibGUgb24gUG93ZXJQQz8KLSAgaW50NjRfdCBpZWVlNzU0ID0gW3NlbGYgcmVhZEk2NF07Ci0gIHJldHVybiAqKChkb3VibGUgKikgJmllZWU3NTQpOworICByZXR1cm4gW3NlbGYgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCiAKLS0gKE5TRGF0YSAqKSByZWFkQmluYXJ5CistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOwotICB1aW50OF90ICogYnVmZiA9IG1hbGxvYyhzaXplKTsKLSAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uCi0gICAgICAgICAgICAgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiT3V0IG9mIG1lbW9yeS4gIFVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyB0cnlpbmcgdG8gcmVhZCBiaW5hcnkgZGF0YS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTsKKyAgU0ludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CiAgIH0KLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiBzaXplXTsKLSAgcmV0dXJuIFtOU0RhdGEgZGF0YVdpdGhCeXRlc05vQ29weTogYnVmZiBsZW5ndGg6IHNpemVdOworCisgIE5TTXV0YWJsZURhdGEgKmRhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKyAgaWYgKCFkYXRhKSB7CisgICAgUFJPVE9DT0xfRVJST1IoTk8sIFVua25vd24sIEAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwgKGludClzaXplKTsKKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpkYXRhLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0gZGF0YTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihTSW50MzIgKilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBrdCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHZ0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICBVSW50OCBrdDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZToma3QgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdnQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnZ0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnMgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKGtleVR5cGUgIT0gTlVMTCkgewogICAgICprZXlUeXBlID0ga3Q7CiAgIH0KKwogICBpZiAodmFsdWVUeXBlICE9IE5VTEwpIHsKICAgICAqdmFsdWVUeXBlID0gdnQ7CiAgIH0KKwogICBpZiAoc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnNpemUgPSBzOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgcmVhZE1hcEVuZCB7fQogCi0KLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBldCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggZXQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmV0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnMgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKGVsZW1lbnRUeXBlICE9IE5VTEwpIHsKICAgICAqZWxlbWVudFR5cGUgPSBldDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRTZXRFbmQge30KLQotCi0tICh2b2lkKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBldCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggZXQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmV0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnMgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKGVsZW1lbnRUeXBlICE9IE5VTEwpIHsKICAgICAqZWxlbWVudFR5cGUgPSBldDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRMaXN0RW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWUKKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiAmdmFsdWUgb2Zmc2V0OiAwIGxlbmd0aDogMV07CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlECisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpZiAobVN0cmljdFdyaXRlKSB7CisgIGlmIChfc3RyaWN0V3JpdGUpIHsKKwogICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZVR5cGU7Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHZlcnNpb25dOwotICAgIFtzZWxmIHdyaXRlU3RyaW5nOiBuYW1lXTsKLSAgICBbc2VsZiB3cml0ZUkzMjogc2VxdWVuY2VJRF07Ci0gIH0gZWxzZSB7Ci0gICAgW3NlbGYgd3JpdGVTdHJpbmc6IG5hbWVdOwotICAgIFtzZWxmIHdyaXRlQnl0ZTogbWVzc2FnZVR5cGVdOwotICAgIFtzZWxmIHdyaXRlSTMyOiBzZXF1ZW5jZUlEXTsKKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6dmVyc2lvbiBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlU3RyaW5nOm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgfQorICBlbHNlIHsKKworICAgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTptZXNzYWdlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWU7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECistKEJPT0wpIHdyaXRlTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBmaWVsZFR5cGVdOwotICBbc2VsZiB3cml0ZUkxNjogZmllbGRJRF07CisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuaWw7CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZQorLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgYnVmZls0XTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmZpZWxkVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtzZWxmIHdyaXRlSTE2OmZpZWxkSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZToodmFsdWUgPyAxIDogMCkgZXJyb3I6ZXJyb3JdOworfQorCisKKy0oQk9PTCkgd3JpdGVCeXRlOihVSW50OCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTomdmFsdWUgb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlSTE2OihzaG9ydCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZlsyXTsKKyAgYnVmZlswXSA9IDB4ZmYgJiAodmFsdWUgPj4gOCk7CisgIGJ1ZmZbMV0gPSAweGZmICYgdmFsdWU7CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDoyIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbNF07CiAgIGJ1ZmZbMF0gPSAweEZGICYgKHZhbHVlID4+IDI0KTsKICAgYnVmZlsxXSA9IDB4RkYgJiAodmFsdWUgPj4gMTYpOwogICBidWZmWzJdID0gMHhGRiAmICh2YWx1ZSA+PiA4KTsKICAgYnVmZlszXSA9IDB4RkYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogNF07Ci19CiAKLS0gKHZvaWQpIHdyaXRlSTE2OiAoc2hvcnQpIHZhbHVlCi17Ci0gIHVpbnQ4X3QgYnVmZlsyXTsKLSAgYnVmZlswXSA9IDB4ZmYgJiAodmFsdWUgPj4gOCk7Ci0gIGJ1ZmZbMV0gPSAweGZmICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDJdOworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjQgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVJNjQ6KFNJbnQ2NCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBidWZmWzhdOworICBVSW50OCBidWZmWzhdOwogICBidWZmWzBdID0gMHhGRiAmICh2YWx1ZSA+PiA1Nik7CiAgIGJ1ZmZbMV0gPSAweEZGICYgKHZhbHVlID4+IDQ4KTsKICAgYnVmZlsyXSA9IDB4RkYgJiAodmFsdWUgPj4gNDApOwpAQCAtMzk2LDgyICs1OTQsMTQ3IEBACiAgIGJ1ZmZbNV0gPSAweEZGICYgKHZhbHVlID4+IDE2KTsKICAgYnVmZls2XSA9IDB4RkYgJiAodmFsdWUgPj4gOCk7CiAgIGJ1ZmZbN10gPSAweEZGICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDhdOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZQorCistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIC8vIHNwaXQgb3V0IElFRUUgNzU0IGJpdHMgLSBGSVhNRSAtIHdpbGwgdGhpcyBnZXQgdXMgaW4gdHJvdWJsZSBvbgotICAvLyBQb3dlclBDPwotICBbc2VsZiB3cml0ZUk2NDogKigoaW50NjRfdCAqKSAmdmFsdWUpXTsKKyAgLy8gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGluIHRyb3VibGUgb24gUG93ZXJQQz8KKyAgaWYgKCFbc2VsZiB3cml0ZUk2NDoqKFNJbnQ2NCAqKSZ2YWx1ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlU3RyaW5nOiAoTlNTdHJpbmcgKikgdmFsdWUKKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7CiAgIGlmICh2YWx1ZSAhPSBuaWwpIHsKLSAgICBjb25zdCBjaGFyICogdXRmOEJ5dGVzID0gW3ZhbHVlIFVURjhTdHJpbmddOwotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4odXRmOEJ5dGVzKTsKLSAgICBbc2VsZiB3cml0ZUkzMjogbGVuZ3RoXTsKLSAgICBbbVRyYW5zcG9ydCB3cml0ZTogKHVpbnQ4X3QgKikgdXRmOEJ5dGVzIG9mZnNldDogMCBsZW5ndGg6IGxlbmd0aF07Ci0gIH0gZWxzZSB7CisKKyAgICBjb25zdCBjaGFyICp1dGY4Qnl0ZXMgPSBbdmFsdWUgVVRGOFN0cmluZ107CisKKyAgICBTSW50MzIgbGVuZ3RoID0gKFNJbnQzMilzdHJsZW4odXRmOEJ5dGVzKTsKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOihVSW50OCAqKXV0ZjhCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6KGludClsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgfQorICBlbHNlIHsKKwogICAgIC8vIGluc3RlYWQgb2YgY3Jhc2hpbmcgd2hlbiB3ZSBnZXQgbnVsbCwgbGV0J3Mgd3JpdGUgb3V0IGEgemVybwogICAgIC8vIGxlbmd0aCBzdHJpbmcKLSAgICBbc2VsZiB3cml0ZUkzMjogMF07CisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjowIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUkzMjogW2RhdGEgbGVuZ3RoXV07Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBbZGF0YSBieXRlc10gb2Zmc2V0OiAwIGxlbmd0aDogW2RhdGEgbGVuZ3RoXV07Ci19CisgIGlmICghW3NlbGYgd3JpdGVJMzI6KFNJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KIAotLSAodm9pZCkgd3JpdGVGaWVsZFN0b3AKLXsKLSAgW3NlbGYgd3JpdGVCeXRlOiBUVHlwZV9TVE9QXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpkYXRhLmJ5dGVzIG9mZnNldDowIGxlbmd0aDooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUZpZWxkRW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAoaW50KSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQpIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGtleVR5cGVdOwotICBbc2VsZiB3cml0ZUJ5dGU6IHZhbHVlVHlwZV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6VFR5cGVTVE9QIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWFwRW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBlbGVtZW50VHlwZV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVTZXRFbmQge30KIAotCi0tICh2b2lkKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplCistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGVsZW1lbnRUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTprZXlUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTp2YWx1ZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6KGludClzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQge30KIAotCi0tICh2b2lkKSB3cml0ZUJvb2w6IChCT09MKSB2YWx1ZQorLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiAodmFsdWUgPyAxIDogMCldOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmVsZW1lbnRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTplbGVtZW50VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmFjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFByb3RvY29sRmFjdG9yeS5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVENvbXBhY3RQcm90b2NvbCA6IE5TT2JqZWN0IDxUUHJvdG9jb2w+CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OworCitAZW5kCisKK0BpbnRlcmZhY2UgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4KKworKyhUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OworCistKFRDb21wYWN0UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwZWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tCkBAIC0wLDAgKzEsOTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRDb21wYWN0UHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRQcm90b2NvbEVycm9yLmgiCisKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1BST1RPQ09MX0lEID0gMHg4MjsKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1ZFUlNJT04gPSAxOworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVkVSU0lPTl9NQVNLID0gMHgxRjsgLy8gMDAwMSAxMTExCitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9UWVBFX01BU0sgPSAweEUwOyAvLyAxMTEwIDAwMDAKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1RZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQorc3RhdGljIGNvbnN0IGludCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworZW51bSB7CisgIFRDVHlwZV9TVE9QID0gMHgwMCwKKyAgVENUeXBlX0JPT0xFQU5fVFJVRSA9IDB4MDEsCisgIFRDVHlwZV9CT09MRUFOX0ZBTFNFID0gMHgwMiwKKyAgVENUeXBlX0JZVEUgPSAweDAzLAorICBUQ1R5cGVfSTE2ID0gMHgwNCwKKyAgVENUeXBlX0kzMiA9IDB4MDUsCisgIFRDVHlwZV9JNjQgPSAweDA2LAorICBUQ1R5cGVfRE9VQkxFID0gMHgwNywKKyAgVENUeXBlX0JJTkFSWSA9IDB4MDgsCisgIFRDVHlwZV9MSVNUID0gMHgwOSwKKyAgVENUeXBlX1NFVCA9IDB4MEEsCisgIFRDVHlwZV9NQVAgPSAweDBCLAorICBUQ1R5cGVfU1RSVUNUID0gMHgwQywKK307CisKK0BpbXBsZW1lbnRhdGlvbiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeQorCisrKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkKK3sKKyAgc3RhdGljIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICpnU2hhcmVkRmFjdG9yeSA9IG5pbDsKKyAgaWYgKGdTaGFyZWRGYWN0b3J5ID09IG5pbCkgeworICAgIGdTaGFyZWRGYWN0b3J5ID0gW1tUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBhbGxvY10gaW5pdF07CisgIH0KKworICByZXR1cm4gZ1NoYXJlZEZhY3Rvcnk7Cit9CisKKy0oTlNTdHJpbmcgKikgcHJvdG9jb2xOYW1lCit7CisgIHJldHVybiBAImNvbXBhY3QiOworfQorCistKFRDb21wYWN0UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAoreworICByZXR1cm4gW1tUQ29tcGFjdFByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDp0cmFuc3BvcnRdOworfQorCitAZW5kCisKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQgPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVBcnJheSAqbGFzdEZpZWxkOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBzaG9ydCBsYXN0RmllbGRJZDsKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqYm9vbEZpZWxkTmFtZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNOdW1iZXIgKmJvb2xGaWVsZFR5cGU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTnVtYmVyICpib29sRmllbGRJZDsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNOdW1iZXIgKmJvb2xlYW5WYWx1ZTsKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqY3VycmVudE1lc3NhZ2VOYW1lOworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRDb21wYWN0UHJvdG9jb2wKKworLShpZCkgaW5pdAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworCisgIGlmIChzZWxmICE9IG5pbCkgeworICAgIF9sYXN0RmllbGQgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKKyAgfQorCisgIHJldHVybiBzZWxmOworfQorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KWFUcmFuc3BvcnQKK3sKKyAgc2VsZiA9IFtzZWxmIGluaXRdOworCisgIGlmIChzZWxmICE9IG5pbCkgeworICAgIF90cmFuc3BvcnQgPSBhVHJhbnNwb3J0OworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIF90cmFuc3BvcnQ7Cit9CisKKy0oQk9PTCkgd3JpdGVCeXRlRGlyZWN0OihVSW50OCluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOihVSW50OCAqKSZuIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVWYXJpbnQzMjooVUludDMyKW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGkzMmJ1Zls1XSA9IHswfTsKKyAgVUludDMyIGlkeCA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgaTMyYnVmW2lkeCsrXSA9IChVSW50OCluOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaTMyYnVmW2lkeCsrXSA9IChVSW50OCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmkzMmJ1ZiBvZmZzZXQ6MCBsZW5ndGg6aWR4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OkNPTVBBQ1RfUFJPVE9DT0xfSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OihVSW50OCkoKENPTVBBQ1RfVkVSU0lPTiAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKFVJbnQzMiltZXNzYWdlVHlwZSkgPDwgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCkgJiBDT01QQUNUX1RZUEVfTUFTSykpIGVycm9yOmVycm9yXSkKKyAgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilzZXF1ZW5jZUlEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlU3RyaW5nOm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWU7CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19sYXN0RmllbGQgYWRkT2JqZWN0OkAoX2xhc3RGaWVsZElkKV07CisgIF9sYXN0RmllbGRJZCA9IDA7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9sYXN0RmllbGRJZCA9IFtfbGFzdEZpZWxkLmxhc3RPYmplY3Qgc2hvcnRWYWx1ZV07CisgIFtfbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoZmllbGRUeXBlID09IFRUeXBlQk9PTCkgeworICAgIF9ib29sRmllbGROYW1lID0gW25hbWUgY29weV07CisgICAgX2Jvb2xGaWVsZFR5cGUgPSBAKGZpZWxkVHlwZSk7CisgICAgX2Jvb2xGaWVsZElkID0gQChmaWVsZElEKTsKKyAgICByZXR1cm4gWUVTOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBbc2VsZiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6MHhGRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKKyAgfQorfQorCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6KFVJbnQ4KXR5cGVPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTpmaWVsZFR5cGVdIDogdHlwZU92ZXJyaWRlOworCisgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICBpZiAoZmllbGRJRCA+IF9sYXN0RmllbGRJZCAmJiBmaWVsZElEIC0gX2xhc3RGaWVsZElkIDw9IDE1KSB7CisgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OihmaWVsZElEIC0gX2xhc3RGaWVsZElkKSA8PCA0IHwgdHlwZVRvV3JpdGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDp0eXBlVG9Xcml0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCFbc2VsZiB3cml0ZUkxNjpmaWVsZElEIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIF9sYXN0RmllbGRJZCA9IGZpZWxkSUQ7CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDpUQ1R5cGVfU1RPUCBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChzaXplID09IDApIHsKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDowIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDpbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmtleVR5cGVdIDw8IDQgfCBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOnZhbHVlVHlwZV0gZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpYiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgQk9PTCByZXN1bHQ7CisgIGlmIChfYm9vbEZpZWxkSWQgIT0gbmlsICYmIF9ib29sRmllbGROYW1lICE9IG5pbCAmJiBfYm9vbEZpZWxkVHlwZSAhPSBuaWwpIHsKKyAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICByZXN1bHQgPSBbc2VsZiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOl9ib29sRmllbGROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpfYm9vbEZpZWxkVHlwZS5pbnRWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6X2Jvb2xGaWVsZElkLmludFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTpiID8gVENUeXBlX0JPT0xFQU5fVFJVRSA6IFRDVHlwZV9CT09MRUFOX0ZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07CisgICAgX2Jvb2xGaWVsZElkID0gbmlsOworICAgIF9ib29sRmllbGROYW1lID0gbmlsOworICAgIF9ib29sRmllbGRUeXBlID0gbmlsOworICB9CisgIGVsc2UgeworICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgIHJlc3VsdCA9IFtzZWxmIHdyaXRlQnl0ZURpcmVjdDpiID8gVENUeXBlX0JPT0xFQU5fVFJVRSA6IFRDVHlwZV9CT09MRUFOX0ZBTFNFIGVycm9yOmVycm9yXTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTE2OihTSW50MTYpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDMyOltzZWxmIGkzMlRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlVmFyaW50MzI6W3NlbGYgaTMyVG9aaWdaYWc6dmFsdWVdIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVWYXJpbnQ2NDpbc2VsZiBpNjRUb1ppZ1phZzp2YWx1ZV0gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIC8vIFNhZmUgYml0LWNhc3RpbmcgZG91YmxlLT51aW50NjQKKworICBVSW50NjQgYml0cyA9IDA7CisgIG1lbWNweSgmYml0cywgJnZhbHVlLCA4KTsKKworICBiaXRzID0gT1NTd2FwSG9zdFRvTGl0dGxlSW50NjQoYml0cyk7CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTooVUludDggKikmYml0cyBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJpbmFyeTpbdmFsdWUgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6ZGF0YS5ieXRlcyBvZmZzZXQ6MCBsZW5ndGg6KFVJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbDsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggY3R5cGVFbGVtZW50ID0gW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTplbGVtZW50VHlwZV07CisKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDpzaXplIDw8IDQgfCBjdHlwZUVsZW1lbnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OjB4ZjAgfCBjdHlwZUVsZW1lbnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVWYXJpbnQ2NDooVUludDY0KW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHZhcmludDY0b3V0WzEwXSA9IHswfTsKKyAgaW50IGlkeCA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChVSW50OCluOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKFVJbnQ4KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6dmFyaW50NjRvdXQgb2Zmc2V0OjAgbGVuZ3RoOmlkeCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSBpMzJUb1ppZ1phZzooU0ludDMyKW4KK3sKKyAgLyoKKyAgICAgWmlnWmFnIGVuY29kaW5nIG1hcHMgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIHNvIHRoYXQKKyAgICAgbnVtYmVycyB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgKGZvciBpbnN0YW5jZSwgLTEpIGhhdmUKKyAgICAgYSBzbWFsbCB2YXJpbnQgZW5jb2RlZCB2YWx1ZSB0b28uIEl0IGRvZXMgdGhpcyBpbiBhIHdheSB0aGF0CisgICAgICJ6aWctemFncyIgYmFjayBhbmQgZm9ydGggdGhyb3VnaCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGludGVnZXJzLAorICAgICBzbyB0aGF0IC0xIGlzIGVuY29kZWQgYXMgMSwgMSBpcyBlbmNvZGVkIGFzIDIsIC0yIGlzIGVuY29kZWQgYXMgMywgYW5kIHNvCisgICAgICAgICBvbgorICAgKi8KKyAgcmV0dXJuIChVSW50MzIpKG4gPDwgMSkgXiAoVUludDMyKShuID4+IDMxKTsKK30KKworLShVSW50NjQpIGk2NFRvWmlnWmFnOihTSW50NjQpbgoreworICByZXR1cm4gKFVJbnQ2NCkobiA8PCAxKSBeIChVSW50NjQpKG4gPj4gNjMpOworfQorCistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopcHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMiAqKXBzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBwcm90b2NvbElkOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZwcm90b2NvbElkIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBAKFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNtYXRjaGVkUHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JFeHBlY3RlZElkS2V5OiBAKENPTVBBQ1RfUFJPVE9DT0xfSUQpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZlcnNpb25BbmRUeXBlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZ2ZXJzaW9uQW5kVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2ZXJzaW9uID0gdmVyc2lvbkFuZFR5cGUgJiBDT01QQUNUX1ZFUlNJT05fTUFTSzsKKyAgaWYgKHZlcnNpb24gIT0gQ09NUEFDVF9WRVJTSU9OKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvckJhZFZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RQcm90b2NvbEVycm9yRXhwZWN0ZWRWZXJzaW9uS2V5OiBAKENPTVBBQ1RfVkVSU0lPTil9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaW50IHR5cGUgPSAodmVyc2lvbkFuZFR5cGUgPj4gQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCkgJiBDT01QQUNUX1RZUEVfQklUUzsKKyAgVUludDMyIHNlcXVlbmNlSUQ7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZzZXF1ZW5jZUlEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBOU1N0cmluZyAqbmFtZTsKKyAgaWYgKCFbc2VsZiByZWFkU3RyaW5nOiZuYW1lIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwdHlwZSAhPSBOVUxMKSB7CisgICAgKnB0eXBlID0gdHlwZTsKKyAgfQorICBpZiAocHNlcXVlbmNlSUQgIT0gTlVMTCkgeworICAgICpwc2VxdWVuY2VJRCA9IHNlcXVlbmNlSUQ7CisgIH0KKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBuYW1lOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfbGFzdEZpZWxkIGFkZE9iamVjdDpAKF9sYXN0RmllbGRJZCldOworICBfbGFzdEZpZWxkSWQgPSAwOworCisgIGlmIChwbmFtZSAhPSBOVUxMKSB7CisgICAgKnBuYW1lID0gQCIiOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBfbGFzdEZpZWxkSWQgPSBbX2xhc3RGaWVsZC5sYXN0T2JqZWN0IHNob3J0VmFsdWVdOworICBbX2xhc3RGaWVsZCByZW1vdmVMYXN0T2JqZWN0XTsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopcGZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMiAqKXBmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnl0ZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB0eXBlID0gYnl0ZSAmIDB4MGY7CisKKyAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICBpZiAodHlwZSA9PSBUQ1R5cGVfU1RPUCkgeworICAgIGlmIChwbmFtZSAhPSBOVUxMKSB7CisgICAgICAqcG5hbWUgPSBAIiI7CisgICAgfQorICAgIGlmIChwZmllbGRUeXBlICE9IE5VTEwpIHsKKyAgICAgICpwZmllbGRUeXBlID0gVFR5cGVTVE9QOworICAgIH0KKyAgICBpZiAocGZpZWxkSUQgIT0gTlVMTCkgeworICAgICAgKnBmaWVsZElEID0gMDsKKyAgICB9CisgICAgcmV0dXJuIFlFUzsKKyAgfQorCisgIHNob3J0IGZpZWxkSWQgPSAwOworCisgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgc2hvcnQgbW9kaWZpZXIgPSAoYnl0ZSAmIDB4ZjApID4+IDQ7CisgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgorICAgIGlmICghW3NlbGYgcmVhZEkxNjomZmllbGRJZCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKyAgICBmaWVsZElkID0gX2xhc3RGaWVsZElkICsgbW9kaWZpZXI7CisgIH0KKworICBVSW50OCBmaWVsZFR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JmZpZWxkVHlwZSBmb3JDb21wYWN0VHlwZTp0eXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwbmFtZSAhPSBOVUxMKSB7CisgICAgKnBuYW1lID0gQCIiOworICB9CisgIGlmIChwZmllbGRUeXBlICE9IE5VTEwpIHsKKyAgICAqcGZpZWxkVHlwZSA9IGZpZWxkVHlwZTsKKyAgfQorICBpZiAocGZpZWxkSUQgIT0gTlVMTCkgeworICAgICpwZmllbGRJRCA9IGZpZWxkSWQ7CisgIH0KKworICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICBpZiAodHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9UUlVFIHx8CisgICAgICB0eXBlID09IFRDVHlwZV9CT09MRUFOX0ZBTFNFKQorICB7CisgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgX2Jvb2xlYW5WYWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRoQm9vbDp0eXBlID09IFRDVHlwZV9CT09MRUFOX1RSVUVdOworICB9CisKKyAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgIF9sYXN0RmllbGRJZCA9IGZpZWxkSWQ7CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihTSW50MzIgKilwa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKilwdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGtleUFuZFZhbHVlVHlwZSA9IDA7CisgIFVJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKHNpemUgIT0gMCkgeworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmtleUFuZFZhbHVlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBVSW50OCBrZXlUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZrZXlUeXBlIGZvckNvbXBhY3RUeXBlOmtleUFuZFZhbHVlVHlwZSA+PiA0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZhbHVlVHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomdmFsdWVUeXBlIGZvckNvbXBhY3RUeXBlOmtleUFuZFZhbHVlVHlwZSAmIDB4ZiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocGtleVR5cGUgIT0gTlVMTCkgeworICAgICpwa2V5VHlwZSA9IGtleVR5cGU7CisgIH0KKyAgaWYgKHB2YWx1ZVR5cGUgIT0gTlVMTCkgeworICAgICpwdmFsdWVUeXBlID0gdmFsdWVUeXBlOworICB9CisgIGlmIChwc2l6ZSAhPSBOVUxMKSB7CisgICAgKnBzaXplID0gc2l6ZTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKilwZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilwc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHNpemVBbmRUeXBlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZzaXplQW5kVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50MzIgc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGY7CisgIGlmIChzaXplID09IDE1KSB7CisgICAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgVUludDggZWxlbWVudFR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JmVsZW1lbnRUeXBlIGZvckNvbXBhY3RUeXBlOnNpemVBbmRUeXBlICYgMHgwZiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAocGVsZW1lbnRUeXBlICE9IE5VTEwpIHsKKyAgICAqcGVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgIH0KKyAgaWYgKHBzaXplICE9IE5VTEwpIHsKKyAgICAqcHNpemUgPSBzaXplOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopcGVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilwc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTpwZWxlbWVudFR5cGUgc2l6ZTpwc2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKF9ib29sZWFuVmFsdWUgIT0gbmlsKSB7CisKKyAgICBCT09MIHJlc3VsdCA9IF9ib29sZWFuVmFsdWUuYm9vbFZhbHVlOworICAgIF9ib29sZWFuVmFsdWUgPSBuaWw7CisKKyAgICAqdmFsdWUgPSByZXN1bHQ7CisgIH0KKyAgZWxzZSB7CisKKyAgICBVSW50OCByZXN1bHQ7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTomcmVzdWx0IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgICp2YWx1ZSA9IHJlc3VsdCA9PSBUQ1R5cGVfQk9PTEVBTl9UUlVFOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOnZhbHVlIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkSTE2OihTSW50MTYgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IChTSW50MTYpW3NlbGYgemlnWmFnVG9pMzI6dl07CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgdjsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gW3NlbGYgemlnWmFnVG9pMzI6dl07CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50NjQgdjsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50NjQ6JnYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gW3NlbGYgemlnWmFnVG9pNjQ6dl07CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50NjQgYml0czsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOihVSW50OCAqKSZiaXRzIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICBiaXRzID0gT1NTd2FwTGl0dGxlVG9Ib3N0SW50NjQoYml0cyk7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgbWVtY3B5KHZhbHVlLCAmYml0cywgc2l6ZW9mKGJpdHMpKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgbGVuZ3RoOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjombGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIE5TU3RyaW5nICpyZXN1bHQ7CisKKyAgaWYgKGxlbmd0aCAhPSAwKSB7CisKKyAgICBOU0RhdGEgKmRhdGE7CisgICAgaWYgKCFbc2VsZiByZWFkQmluYXJ5T2ZMZW5ndGg6bGVuZ3RoIGRhdGE6JmRhdGEgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgcmVzdWx0ID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOworICB9CisgIGVsc2UgeworICAgIHJlc3VsdCA9IEAiIjsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGxlbmd0aDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6Jmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gW3NlbGYgcmVhZEJpbmFyeU9mTGVuZ3RoOmxlbmd0aCBkYXRhOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQmluYXJ5T2ZMZW5ndGg6KFVJbnQzMilsZW5ndGggZGF0YTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgTlNEYXRhICpyZXN1bHQ7CisKKyAgaWYgKGxlbmd0aCAhPSAwKSB7CisKKyAgICBOU011dGFibGVEYXRhICpidWYgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpsZW5ndGhdOworICAgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWYubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICAgIH0KKworICAgIHJlc3VsdCA9IGJ1ZjsKKyAgfQorICBlbHNlIHsKKworICAgIHJlc3VsdCA9IFtOU0RhdGEgZGF0YV07CisKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFZhcmludDMyOihVSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIHJlc3VsdCA9IDA7CisgIGludCBzaGlmdCA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIFVJbnQ4IGJ5dGU7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICByZXN1bHQgfD0gKFVJbnQzMikoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2hpZnQgKz0gNzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZFZhcmludDY0OihVSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaW50IHNoaWZ0ID0gMDsKKyAgVUludDY0IHJlc3VsdCA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIFVJbnQ4IGJ5dGU7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICByZXN1bHQgfD0gKFVJbnQ2NCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2hpZnQgKz0gNzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oU0ludDMyKSB6aWdaYWdUb2kzMjooVUludDMyKW4KK3sKKyAgcmV0dXJuIChTSW50MzIpKG4gPj4gMSkgXiAoLShTSW50MzIpKG4gJiAxKSk7Cit9CisKKy0oU0ludDY0KSB6aWdaYWdUb2k2NDooVUludDY0KW4KK3sKKyAgcmV0dXJuIChTSW50NjQpKG4gPj4gMSkgXiAoLShTSW50NjQpKG4gJiAxKSk7Cit9CisKKy0oQk9PTCkgdHR5cGU6KFVJbnQ4ICopdHR5cGUgZm9yQ29tcGFjdFR5cGU6KFVJbnQ4KWN0eXBlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBzd2l0Y2ggKGN0eXBlICYgMHgwZikgeworICBjYXNlIFRDVHlwZV9TVE9QOgorICAgICp0dHlwZSA9IFRUeXBlU1RPUDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JPT0xFQU5fRkFMU0U6CisgIGNhc2UgVENUeXBlX0JPT0xFQU5fVFJVRToKKyAgICAqdHR5cGUgPSBUVHlwZUJPT0w7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9CWVRFOgorICAgICp0dHlwZSA9IFRUeXBlQllURTsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0kxNjoKKyAgICAqdHR5cGUgPSBUVHlwZUkxNjsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0kzMjoKKyAgICAqdHR5cGUgPSBUVHlwZUkzMjsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0k2NDoKKyAgICAqdHR5cGUgPSBUVHlwZUk2NDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0RPVUJMRToKKyAgICAqdHR5cGUgPSBUVHlwZURPVUJMRTsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JJTkFSWToKKyAgICAqdHR5cGUgPSBUVHlwZVNUUklORzsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0xJU1Q6CisgICAgKnR0eXBlID0gVFR5cGVMSVNUOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfU0VUOgorICAgICp0dHlwZSA9IFRUeXBlU0VUOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfTUFQOgorICAgICp0dHlwZSA9IFRUeXBlTUFQOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfU1RSVUNUOgorICAgICp0dHlwZSA9IFRUeXBlU1RSVUNUOworICAgIHJldHVybiBZRVM7CisKKyAgZGVmYXVsdDoKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFByb3RvY29sRXJyb3JUeXBlS2V5OiBAKChVSW50OCkoY3R5cGUgJiAweDBGKSl9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POworICB9Cit9CisKKy0oVUludDgpIGNvbXBhY3RUeXBlRm9yVFR5cGU6KFVJbnQ4KXR0eXBlCit7CisgIHN0YXRpYyBVSW50OCB0dHlwZVRvQ29tcGFjdFR5cGVbXSA9IHsKKyAgICBbVFR5cGVTVE9QXSA9IFRDVHlwZV9TVE9QLAorICAgIFtUVHlwZUJPT0xdID0gVENUeXBlX0JPT0xFQU5fRkFMU0UsCisgICAgW1RUeXBlQllURV0gPSBUQ1R5cGVfQllURSwKKyAgICBbVFR5cGVET1VCTEVdID0gVENUeXBlX0RPVUJMRSwKKyAgICBbVFR5cGVJMTZdID0gVENUeXBlX0kxNiwKKyAgICBbVFR5cGVJMzJdID0gVENUeXBlX0kzMiwKKyAgICBbVFR5cGVJNjRdID0gVENUeXBlX0k2NCwKKyAgICBbVFR5cGVTVFJJTkddID0gVENUeXBlX0JJTkFSWSwKKyAgICBbVFR5cGVTVFJVQ1RdID0gVENUeXBlX1NUUlVDVCwKKyAgICBbVFR5cGVNQVBdID0gVENUeXBlX01BUCwKKyAgICBbVFR5cGVTRVRdID0gVENUeXBlX1NFVCwKKyAgICBbVFR5cGVMSVNUXSA9IFRDVHlwZV9MSVNUCisgIH07CisKKyAgcmV0dXJuIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNlMzYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIlRQcm90b2NvbERlY29yYXRvci5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK2V4dGVybiBOU1N0cmluZyAqVE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3I7CisKKworQGludGVyZmFjZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbAorICAgICAgICAgICBzZXJ2aWNlTmFtZTooTlNTdHJpbmcgKiluYW1lOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzhjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0KQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIgorCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKworTlNTdHJpbmcgKlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yID0gQCI6IjsKKworCitAaW50ZXJmYWNlIFRNdWx0aXBsZXhlZFByb3RvY29sICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnNlcnZpY2VOYW1lOworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRNdWx0aXBsZXhlZFByb3RvY29sCisKKy0oaWQpIGluaXRXaXRoUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sCisgICAgICAgICAgIHNlcnZpY2VOYW1lOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0V2l0aFByb3RvY29sOnByb3RvY29sXTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfc2VydmljZU5hbWUgPSBuYW1lOworICB9CisgIHJldHVybiBzZWxmOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgc3dpdGNoIChtZXNzYWdlVHlwZSkgeworICBjYXNlIFRNZXNzYWdlVHlwZUNBTEw6CisgIGNhc2UgVE1lc3NhZ2VUeXBlT05FV0FZOiB7CisgICAgTlNNdXRhYmxlU3RyaW5nICpzZXJ2aWNlRnVuY3Rpb24gPSBbW05TTXV0YWJsZVN0cmluZyBhbGxvY10gaW5pdFdpdGhTdHJpbmc6X3NlcnZpY2VOYW1lXTsKKyAgICBbc2VydmljZUZ1bmN0aW9uIGFwcGVuZFN0cmluZzpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvcl07CisgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6bmFtZV07CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOnNlcnZpY2VGdW5jdGlvbiB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl07CisgIH0KKyAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gW3N1cGVyIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6bmFtZSB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl07CisgIH0KK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKaW5kZXggMjgxMjM5ZC4uODQxMDU5ZiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCkBAIC0yMiwxMjcgKzIyLDE0MyBAQAogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCiAKLWVudW0gewotICBUTWVzc2FnZVR5cGVfQ0FMTCA9IDEsCi0gIFRNZXNzYWdlVHlwZV9SRVBMWSA9IDIsCi0gIFRNZXNzYWdlVHlwZV9FWENFUFRJT04gPSAzLAotICBUTWVzc2FnZVR5cGVfT05FV0FZID0gNAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVE1lc3NhZ2VUeXBlKSB7CisgIFRNZXNzYWdlVHlwZUNBTEwgPSAxLAorICBUTWVzc2FnZVR5cGVSRVBMWSA9IDIsCisgIFRNZXNzYWdlVHlwZUVYQ0VQVElPTiA9IDMsCisgIFRNZXNzYWdlVHlwZU9ORVdBWSA9IDQKIH07CiAKLWVudW0gewotICBUVHlwZV9TVE9QICAgPSAwLAotICBUVHlwZV9WT0lEICAgPSAxLAotICBUVHlwZV9CT09MICAgPSAyLAotICBUVHlwZV9CWVRFICAgPSAzLAotICBUVHlwZV9ET1VCTEUgPSA0LAotICBUVHlwZV9JMTYgICAgPSA2LAotICBUVHlwZV9JMzIgICAgPSA4LAotICBUVHlwZV9JNjQgICAgPSAxMCwKLSAgVFR5cGVfU1RSSU5HID0gMTEsCi0gIFRUeXBlX1NUUlVDVCA9IDEyLAotICBUVHlwZV9NQVAgICAgPSAxMywKLSAgVFR5cGVfU0VUICAgID0gMTQsCi0gIFRUeXBlX0xJU1QgICA9IDE1Cit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFR5cGUpIHsKKyAgVFR5cGVTVE9QICAgPSAwLAorICBUVHlwZVZPSUQgICA9IDEsCisgIFRUeXBlQk9PTCAgID0gMiwKKyAgVFR5cGVCWVRFICAgPSAzLAorICBUVHlwZURPVUJMRSA9IDQsCisgIFRUeXBlSTE2ICAgID0gNiwKKyAgVFR5cGVJMzIgICAgPSA4LAorICBUVHlwZUk2NCAgICA9IDEwLAorICBUVHlwZVNUUklORyA9IDExLAorICBUVHlwZVNUUlVDVCA9IDEyLAorICBUVHlwZU1BUCAgICA9IDEzLAorICBUVHlwZVNFVCAgICA9IDE0LAorICBUVHlwZUxJU1QgICA9IDE1CiB9OwogCiAKIEBwcm90b2NvbCBUUHJvdG9jb2wgPE5TT2JqZWN0PgogCi0tIChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CiAKLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQ7Ci0tICh2b2lkKSByZWFkTWVzc2FnZUVuZDsKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX251bGxhYmxlIF9fYXV0b3JlbGVhc2luZyAqX19udWxsYWJsZSluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihudWxsYWJsZSBTSW50MzIgKil0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihudWxsYWJsZSBTSW50MzIgKilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWU7Ci0tICh2b2lkKSByZWFkU3RydWN0RW5kOworLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19udWxsYWJsZSBfX2F1dG9yZWxlYXNpbmcgKl9fbnVsbGFibGUpbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZFN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQgKikgZmllbGRJRDsKLS0gKHZvaWQpIHJlYWRGaWVsZEVuZDsKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19udWxsYWJsZSBfX2F1dG9yZWxlYXNpbmcgKl9fbnVsbGFibGUpbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KG51bGxhYmxlIFNJbnQzMiAqKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZzsKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fbm9ubnVsbCBfX2F1dG9yZWxlYXNpbmcgKl9fbm9ubnVsbCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAotLSAoQk9PTCkgcmVhZEJvb2w7CistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh1bnNpZ25lZCBjaGFyKSByZWFkQnl0ZTsKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChzaG9ydCkgcmVhZEkxNjsKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChpbnQzMl90KSByZWFkSTMyOworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGludDY0X3QpIHJlYWRJNjQ7CistKEJPT0wpIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoZG91YmxlKSByZWFkRG91YmxlOworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKE5TRGF0YSAqKSByZWFkQmluYXJ5OworLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fbm9ubnVsbCBfX2F1dG9yZWxlYXNpbmcgKl9fbm9ubnVsbCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAotLSAodm9pZCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogKGludCAqKSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50ICopIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZE1hcEVuZDsKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZToobnVsbGFibGUgU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihudWxsYWJsZSBTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemU7Ci0tICh2b2lkKSByZWFkU2V0RW5kOworLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZToobnVsbGFibGUgU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCi0tICh2b2lkKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZExpc3RFbmQ7CistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZToobnVsbGFibGUgU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQ7Ci0tICh2b2lkKSB3cml0ZU1lc3NhZ2VFbmQ7CistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHdyaXRlTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWU7Ci0tICh2b2lkKSB3cml0ZVN0cnVjdEVuZDsKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCkgZmllbGRJRDsKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUkzMjogKGludDMyX3QpIHZhbHVlOworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJNjQ6IChpbnQ2NF90KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJNjQ6KFNJbnQ2NCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTE2OiAoc2hvcnQpIHZhbHVlOworLShCT09MKSB3cml0ZUkxNjooc2hvcnQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVCeXRlOihVSW50OCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlU3RyaW5nOiAoTlNTdHJpbmcgKikgdmFsdWU7CistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlOworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCb29sOiAoQk9PTCkgdmFsdWU7CistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQmluYXJ5OiAoTlNEYXRhICopIGRhdGE7CistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVGaWVsZFN0b3A7CistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVGaWVsZEVuZDsKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKLS0gKHZvaWQpIHdyaXRlTWFwRW5kOworLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCi0tICh2b2lkKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKLS0gKHZvaWQpIHdyaXRlU2V0RW5kOworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCi0tICh2b2lkKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplOworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlTGlzdEVuZDsKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCiBAZW5kCiAKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjliNmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRQcm90b2NvbERlY29yYXRvciA6IE5TT2JqZWN0IDxUUHJvdG9jb2w+CisKKy0oaWQpIGluaXRXaXRoUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4ZjkwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0KQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sRGVjb3JhdG9yLmgiCisKKworQGludGVyZmFjZSBUUHJvdG9jb2xEZWNvcmF0b3IgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvdG9jb2w+IGNvbmNyZXRlUHJvdG9jb2w7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFByb3RvY29sRGVjb3JhdG9yCisKKy0oaWQpIGluaXRXaXRoUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2NvbmNyZXRlUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHRyYW5zcG9ydF07Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDpzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlRW5kOmVycm9yXTsKK30KKworLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMiAqKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRGaWVsZEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTdHJpbmc6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRCeXRlOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkSTE2OihTSW50MTYgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkSTE2OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkSTMyOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkSTY0OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRG91YmxlOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRCaW5hcnk6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNYXBFbmQ6ZXJyb3JdOworfQorCisKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU2V0RW5kOmVycm9yXTsKK30KKworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTGlzdEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6bWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWVzc2FnZUVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOm5hbWUgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVN0cnVjdEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUkzMjp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJNjQ6KFNJbnQ2NCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUk2NDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJMTY6KFNJbnQxNil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUkxNjp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCeXRlOihVSW50OCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJ5dGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RyaW5nOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRG91YmxlOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCb29sOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJpbmFyeTpkYXRhIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6a2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTp2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVNldEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0RW5kOmVycm9yXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGJjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRG9tYWluOworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFByb3RvY29sRXJyb3IpIHsKKyAgVFByb3RvY29sRXJyb3JVbmtub3duICAgICAgICAgICAgICAgICAgID0gMCwKKyAgVFByb3RvY29sRXJyb3JJbnZhbGlkRGF0YSAgICAgICAgICAgICAgID0gMSwKKyAgVFByb3RvY29sRXJyb3JOZWdhdGl2ZVNpemUgICAgICAgICAgICAgID0gMiwKKyAgVFByb3RvY29sRXJyb3JTaXplTGltaXQgICAgICAgICAgICAgICAgID0gMywKKyAgVFByb3RvY29sRXJyb3JCYWRWZXJzaW9uICAgICAgICAgICAgICAgID0gNCwKKyAgVFByb3RvY29sRXJyb3JOb3RJbXBsZW1lbnRlZCAgICAgICAgICAgID0gNSwKKyAgVFByb3RvY29sRXJyb3JEZXB0aExpbWl0ICAgICAgICAgICAgICAgID0gNiwKK307CisKKwordHlwZWRlZiBOU19FTlVNKGludCwgVFByb3RvY29sRXh0ZW5kZWRFcnJvcikgeworICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzc2luZ1JlcXVpcmVkRmllbGQgID0gMTAwMSwKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvclVuZXhwZWN0ZWRUeXBlICAgICAgICA9IDEwMDIsCisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNtYXRjaGVkUHJvdG9jb2wgICAgPSAxMDAzLAorfTsKKworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRWZXJzaW9uS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclR5cGVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTGluZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleTsKKworCisjZGVmaW5lIFBST1RPQ09MX0VSUk9SKHJldCwgZXJyLCAuLi4pIFwKKyAgaWYgKGVycm9yKSB7ICBcCisgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3IgIyMgZXJyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtOU0xvY2FsaXplZERlc2NyaXB0aW9uS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpfX1ZBX0FSR1NfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUZpbGUiOiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19GSUxFX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VMaW5lIjogQChfX0xJTkVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUZ1bmN0aW9uIjogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fUFJFVFRZX0ZVTkNUSU9OX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJNZXNzYWdlIjogc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgPyBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA6IEAiIn1dOyBcCisgIH0gXAorICByZXR1cm4gcmV0CisKKyNkZWZpbmUgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKHJldCwgZXJyb3JQdHIsIC4uLikgXAorICBpZiAoZXJyb3JQdHIpIHsgXAorICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yVW5rbm93biBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTogW1tOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0Ol9fVkFfQVJHU19fXSBzdHJpbmdCeUFwcGVuZGluZ0Zvcm1hdDpAIjogJUAiLCBbKCplcnJvclB0cikgbG9jYWxpemVkRGVzY3JpcHRpb25dXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fRklMRV9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlTGluZUtleTogQChfX0xJTkVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fUFJFVFRZX0ZVTkNUSU9OX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleTogc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgPyBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA6IEAiIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TVW5kZXJseWluZ0Vycm9yS2V5OiAqZXJyb3JQdHJ9XTsgXAorICB9IFwKKyAgcmV0dXJuIHJldApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzY3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0KQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgorCisKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckRvbWFpbiA9IEAiVFByb3RvY29sRXJyb3JEb21haW4iOworCitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5ID0gQCJleHRlbmRlZEVycm9yIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleSA9IEAiZmllbGQiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleSA9IEAiZXhwZWN0ZWRJZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXkgPSBAImV4cGVjdGVkVmVyc2lvbiI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JUeXBlS2V5ID0gQCJ0eXBlIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXkgPSBAInNvdXJjZUxpbmUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleSA9IEAic291cmNlRmlsZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXkgPSBAInNvdXJjZU1ldGhvZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleSA9IEAibWVzc2FnZU5hbWUiOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzU0ZmMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNDg3YS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUUHJvdG9jb2xFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbgotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAppbmRleCBmMjAwYTZkLi5hMDIyYTdmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaApAQCAtMjEsOSArMjEsMTYgQEAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCiAKIEBwcm90b2NvbCBUUHJvdG9jb2xGYWN0b3J5IDxOU09iamVjdD4KIAotLSAoaWQgPFRQcm90b2NvbD4pIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIG5vbmF0b21pYykgTlNTdHJpbmcgKnByb3RvY29sTmFtZTsKKworLShpZDxUUHJvdG9jb2w+KSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKaW5kZXggYzJkMjUyMS4uODI1MTBjZiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKQEAgLTIwLDEwICsyMCwxNCBAQAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVFByb3RvY29sVXRpbCA6IE5TT2JqZWN0IHsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLX0KIAotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKK0BpbnRlcmZhY2UgVFByb3RvY29sVXRpbCA6IE5TT2JqZWN0CisKKysoQk9PTCkgc2tpcFR5cGU6KGludCl0eXBlIG9uUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOwogCiBAZW5kOworCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KaW5kZXggMTNkNzA5NS4uYzBkNjVhYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KQEAgLTIxLDg0ICsyMSwxNTEgQEAKIAogQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbFV0aWwKIAotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAorKyhCT09MKSBza2lwVHlwZTooaW50KXR5cGUgb25Qcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3IKIHsKICAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgVFR5cGVfQk9PTDoKLSAgICBbcHJvdG9jb2wgcmVhZEJvb2xdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0JZVEU6Ci0gICAgW3Byb3RvY29sIHJlYWRCeXRlXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JMTY6Ci0gICAgW3Byb3RvY29sIHJlYWRJMTZdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0kzMjoKLSAgICBbcHJvdG9jb2wgcmVhZEkzMl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTY0OgotICAgIFtwcm90b2NvbCByZWFkSTY0XTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9ET1VCTEU6Ci0gICAgW3Byb3RvY29sIHJlYWREb3VibGVdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX1NUUklORzoKLSAgICBbcHJvdG9jb2wgcmVhZFN0cmluZ107Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfU1RSVUNUOgotICAgIFtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMXTsKKyAgY2FzZSBUVHlwZUJPT0w6IHsKKyAgICBCT09MIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkQm9vbDomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlQllURTogeworICAgIFVJbnQ4IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkQnl0ZTomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTE2OiB7CisgICAgU0ludDE2IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTE2OiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJMzI6IHsKKyAgICBTSW50MzIgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJMzI6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUk2NDogeworICAgIFNJbnQ2NCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEk2NDomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlRE9VQkxFOiB7CisgICAgZG91YmxlIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkRG91YmxlOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTVFJJTkc6IHsKKyAgICBOU1N0cmluZyAqdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJpbmc6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNUUlVDVDogeworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCBmaWVsZFR5cGU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiBuaWwgdHlwZTogJmZpZWxkVHlwZSBmaWVsZElEOiBuaWxdOwotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVE9QKSB7CisgICAgICBTSW50MzIgZmllbGRUeXBlOworICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOm5pbCB0eXBlOiZmaWVsZFR5cGUgZmllbGRJRDpuaWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVE9QKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBbcHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsKKyAgICAgIGlmICghW3NlbGYgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEVuZDplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQogICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfTUFQOgotICB7Ci0gICAgaW50IGtleVR5cGU7Ci0gICAgaW50IHZhbHVlVHlwZTsKLSAgICBpbnQgc2l6ZTsKLSAgICBbcHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogJmtleVR5cGUgdmFsdWVUeXBlOiAmdmFsdWVUeXBlIHNpemU6ICZzaXplXTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlTUFQOiB7CisgICAgU0ludDMyIGtleVR5cGU7CisgICAgU0ludDMyIHZhbHVlVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiZrZXlUeXBlIHZhbHVlVHlwZTomdmFsdWVUeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBrZXlUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiB2YWx1ZVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZE1hcEVuZF07Ci0gIH0KLSAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX1NFVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogJmVsZW1UeXBlIHNpemU6ICZzaXplXTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZWxlbVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTprZXlUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKICAgICAgIH0KLSAgICAgIFtwcm90b2NvbCByZWFkU2V0RW5kXTsKLSAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX0xJU1Q6Ci0gICAgewotICAgICAgaW50IGVsZW1UeXBlOwotICAgICAgaW50IHNpemU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAmZWxlbVR5cGUgc2l6ZTogJnNpemVdOwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBlbGVtVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOnZhbHVlVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CiAgICAgICB9Ci0gICAgICBbcHJvdG9jb2wgcmVhZExpc3RFbmRdOwogICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZE1hcEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNFVDogeworICAgIFNJbnQzMiBlbGVtVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTomZWxlbVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTplbGVtVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRTZXRFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVMSVNUOiB7CisgICAgU0ludDMyIGVsZW1UeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTomZWxlbVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTplbGVtVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRMaXN0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCmluZGV4IGM4ZmY5ZjAuLjk1YjBkM2MgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaAorKysgYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKQEAgLTI3LDIzICsyNywyNSBAQAogI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgogI2VuZGlmCiAKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbjsKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleTsKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleTsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKIAotQGludGVyZmFjZSBUU29ja2V0U2VydmVyIDogTlNPYmplY3QgewotICBOU0ZpbGVIYW5kbGUgKiBtU29ja2V0RmlsZUhhbmRsZTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1JbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1PdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4gbVByb2Nlc3NvckZhY3Rvcnk7Ci19CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQ7CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXk7CiAKLS0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKLSAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQotICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7CisKK0BpbnRlcmZhY2UgVFNvY2tldFNlcnZlciA6IE5TT2JqZWN0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aFBvcnQ6KGludClwb3J0CisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OihpZCA8VFByb3RvY29sRmFjdG9yeT4pcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OihpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KXByb2Nlc3NvckZhY3Rvcnk7CisKKy0gKGluc3RhbmNldHlwZSkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAorICAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubSBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQppbmRleCA1ZjdmYTNjLi4wOWI2MDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCkBAIC0yMSwzNSArMjEsOTIgQEAKICNpbXBvcnQgIlRTb2NrZXRTZXJ2ZXIuaCIKICNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKICNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKICNpbXBvcnQgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CiAKIAorTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQgPSBAIlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQiOworTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXkgPSBAIlRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3IiOworTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXkgPSBAIlRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnQiOwogCi1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbiA9IEAiVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24iOwotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXkgPSBAIlRTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yIjsKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5ID0gQCJUU29ja2VyU2VydmVyX1RyYW5zcG9ydCI7CisKK0BpbnRlcmZhY2UgVFNvY2tldFNlcnZlciAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm9jZXNzb3JGYWN0b3J5PiBwcm9jZXNzb3JGYWN0b3J5OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU0ZpbGVIYW5kbGUgKnNvY2tldEZpbGVIYW5kbGU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGRpc3BhdGNoX3F1ZXVlX3QgcHJvY2Vzc2luZ1F1ZXVlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqZG9tYWluU29ja2V0UGF0aDsKKworQGVuZAogCiAKIEBpbXBsZW1lbnRhdGlvbiBUU29ja2V0U2VydmVyCiAKLS0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKLSAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQotICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7CistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhTb2NrZXQ6KENGU29ja2V0UmVmKXNvY2tldAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeTooaWQgPFRQcm90b2NvbEZhY3Rvcnk+KXByb3RvY29sRmFjdG9yeQorICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeTooaWQgPFRQcm9jZXNzb3JGYWN0b3J5Pilwcm9jZXNzb3JGYWN0b3J5OwogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwogCi0gIG1JbnB1dFByb3RvY29sRmFjdG9yeSA9IFtwcm90b2NvbEZhY3RvcnkgcmV0YWluXTsKLSAgbU91dHB1dFByb3RvY29sRmFjdG9yeSA9IFtwcm90b2NvbEZhY3RvcnkgcmV0YWluXTsKLSAgbVByb2Nlc3NvckZhY3RvcnkgPSBbcHJvY2Vzc29yRmFjdG9yeSByZXRhaW5dOworICBfaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7CisgIF9vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7CisgIF9wcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeTsKKworICBkaXNwYXRjaF9xdWV1ZV9hdHRyX3QgcHJvY2Vzc2luZ1F1ZXVlQXR0ciA9CisgICAgZGlzcGF0Y2hfcXVldWVfYXR0cl9tYWtlX3dpdGhfcW9zX2NsYXNzKERJU1BBVENIX1FVRVVFX0NPTkNVUlJFTlQsIFFPU19DTEFTU19CQUNLR1JPVU5ELCAwKTsKKworICBfcHJvY2Vzc2luZ1F1ZXVlID0gZGlzcGF0Y2hfcXVldWVfY3JlYXRlKCJUU29ja2V0U2VydmVyLnByb2Nlc3NpbmciLCBwcm9jZXNzaW5nUXVldWVBdHRyKTsKIAogICAvLyBjcmVhdGUgYSBzb2NrZXQuCi0gIGludCBmZCA9IC0xOworICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworCisgIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKKyAgX3NvY2tldEZpbGVIYW5kbGUgPSBbW05TRmlsZUhhbmRsZSBhbGxvY10gaW5pdFdpdGhGaWxlRGVzY3JpcHRvcjpmZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT25EZWFsbG9jOllFU107CisKKyAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0CisgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOworICBDRlJlbGVhc2Uoc29ja2V0KTsKKworICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBhY2NlcHRlZCBpbmNvbWluZyBjb25uZWN0aW9ucworICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIGFkZE9ic2VydmVyOnNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjpAc2VsZWN0b3IoY29ubmVjdGlvbkFjY2VwdGVkOikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpOU0ZpbGVIYW5kbGVDb25uZWN0aW9uQWNjZXB0ZWROb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDpfc29ja2V0RmlsZUhhbmRsZV07CisKKyAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCisgIFtfc29ja2V0RmlsZUhhbmRsZSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoUG9ydDogKGludCkgcG9ydAorICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5CisgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeQoreworICBDRlNvY2tldFJlZiBzb2NrZXQgPSBbW3NlbGYgY2xhc3NdIGNyZWF0ZVNvY2tldFdpdGhQb3J0OnBvcnRdOworICBpZiAoc29ja2V0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgaWYgKHNlbGYgPSBbc2VsZiBpbml0V2l0aFNvY2tldDpzb2NrZXQgcHJvdG9jb2xGYWN0b3J5OnByb3RvY29sRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OnByb2Nlc3NvckZhY3RvcnldKSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgJWQiLCBwb3J0KTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworCisrKENGU29ja2V0UmVmKSBjcmVhdGVTb2NrZXRXaXRoUG9ydDooaW50KXBvcnQKK3sKICAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAwLCBOVUxMLCBOVUxMKTsKICAgaWYgKHNvY2tldCkgewogICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29ja2V0LCBDRlNvY2tldEdldFNvY2tldEZsYWdzKHNvY2tldCkgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpOwotICAgIGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKyAgICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOwogICAgIGludCB5ZXMgPSAxOwogICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7CiAKQEAgLTYwLDEwMSArMTE3LDEyMyBAQAogICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwogICAgIE5TRGF0YSAqYWRkcmVzcyA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlczomYWRkciBsZW5ndGg6c2l6ZW9mKGFkZHIpXTsKLSAgICBpZiAoQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2tldCwgKENGRGF0YVJlZilhZGRyZXNzKSAhPSBrQ0ZTb2NrZXRTdWNjZXNzKSB7CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgewogICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CiAgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKLSAgICAgIE5TTG9nKEAiKioqIENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiBuaWw7CisgICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBOU0xvZyhAIioqKiBObyBzZXJ2ZXIgc29ja2V0Iik7CisKKyAgICByZXR1cm4gc29ja2V0OworICB9CisgIGVsc2UgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy0gKGlkKSBpbml0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCisgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5Cit7CisgIF9kb21haW5Tb2NrZXRQYXRoID0gcGF0aDsKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVTb2NrZXRXaXRoUGF0aDpwYXRoXTsKKyAgaWYgKHNvY2tldCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIG5pbDsKICAgfQotICAKLSAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAotICBtU29ja2V0RmlsZUhhbmRsZSA9IFtbTlNGaWxlSGFuZGxlIGFsbG9jXSBpbml0V2l0aEZpbGVEZXNjcmlwdG9yOiBmZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT25EZWFsbG9jOiBZRVNdOwotICAKLSAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0Ci0gIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwotICBDRlJlbGVhc2Uoc29ja2V0KTsKLSAgCi0gICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBAc2VsZWN0b3IoY29ubmVjdGlvbkFjY2VwdGVkOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogTlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkTm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG1Tb2NrZXRGaWxlSGFuZGxlXTsKLSAgCi0gIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgotICBbbVNvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Ci0gIAotICBOU0xvZyhAIkxpc3RlbmluZyBvbiBUQ1AgcG9ydCAlZCIsIHBvcnQpOwotICAKKworICBpZiAoc2VsZiA9IFtzZWxmIGluaXRXaXRoU29ja2V0OnNvY2tldCBwcm90b2NvbEZhY3Rvcnk6cHJvdG9jb2xGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk6cHJvY2Vzc29yRmFjdG9yeV0pIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBwYXRoICVAIiwgcGF0aCk7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAodm9pZCkgZGVhbGxvYyB7Ci0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcmVtb3ZlT2JqZWN0OiBzZWxmXTsKLSAgW21JbnB1dFByb3RvY29sRmFjdG9yeSByZWxlYXNlXTsKLSAgW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV07Ci0gIFttUHJvY2Vzc29yRmFjdG9yeSByZWxlYXNlXTsKLSAgW21Tb2NrZXRGaWxlSGFuZGxlIHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLQotLSAodm9pZCkgY29ubmVjdGlvbkFjY2VwdGVkOiAoTlNOb3RpZmljYXRpb24gKikgYU5vdGlmaWNhdGlvbgorKyAoQ0ZTb2NrZXRSZWYpIGNyZWF0ZVNvY2tldFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAogewotICBOU0ZpbGVIYW5kbGUgKiBzb2NrZXQgPSBbW2FOb3RpZmljYXRpb24gdXNlckluZm9dIG9iamVjdEZvcktleTogTlNGaWxlSGFuZGxlTm90aWZpY2F0aW9uRmlsZUhhbmRsZUl0ZW1dOworICBDRlNvY2tldFJlZiBzb2NrZXQgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9MT0NBTCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVAsIDAsIE5VTEwsIE5VTEwpOworICBpZiAoc29ja2V0KSB7CisgICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrZXQsICBDRlNvY2tldEdldFNvY2tldEZsYWdzKHNvY2tldCkgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpOworICAgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisgICAgaW50IHllcyA9IDE7CisgICAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAodm9pZCAqKSZ5ZXMsIHNpemVvZih5ZXMpKTsKIAotICAvLyBub3cgdGhhdCB3ZSBoYXZlIGEgY2xpZW50IGNvbm5lY3RlZCwgc3BpbiBvZmYgYSB0aHJlYWQgdG8gaGFuZGxlIGFjdGl2aXR5Ci0gIFtOU1RocmVhZCBkZXRhY2hOZXdUaHJlYWRTZWxlY3RvcjogQHNlbGVjdG9yKGhhbmRsZUNsaWVudENvbm5lY3Rpb246KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9UYXJnZXQ6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoT2JqZWN0OiBzb2NrZXRdOworICAgIHNpemVfdCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aCArIDE7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisgICAgaWYgKG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aD4gc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKSB7CisgICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IFVuYWJsZSB0byBjcmVhdGUgc29ja2V0IGF0IHBhdGggJUAuIFBhdGggaXMgdG9vIGxvbmcuIiwgcGF0aCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgW1thTm90aWZpY2F0aW9uIG9iamVjdF0gYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07CisgICAgYWRkci5zdW5fZmFtaWx5ID0gQUZfTE9DQUw7CisgICAgbWVtY3B5KGFkZHIuc3VuX3BhdGgsIHBhdGguVVRGOFN0cmluZywgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoKTsKKyAgICBhZGRyLnN1bl9sZW4gPSBTVU5fTEVOKCZhZGRyKTsKKworICAgIE5TRGF0YSAqYWRkcmVzcyA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlczomYWRkciBsZW5ndGg6c2l6ZW9mKGFkZHIpXTsKKyAgICBpZiAoQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2tldCwgKF9fYnJpZGdlIENGRGF0YVJlZilhZGRyZXNzKSAhPSBrQ0ZTb2NrZXRTdWNjZXNzKSB7CisgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKKyAgICAgIENGUmVsZWFzZShzb2NrZXQpOworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc29ja2V0OworICB9IGVsc2UgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpOworICAgIHJldHVybiBOVUxMOworICB9CiB9CiAKLQotLSAodm9pZCkgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjogKE5TRmlsZUhhbmRsZSAqKSBjbGllbnRTb2NrZXQKKy0odm9pZCkgZGVhbGxvYwogewotICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgCi0gIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKiB0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTogY2xpZW50U29ja2V0XTsKLSAgaWQ8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gW21Qcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZvclRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgCi0gIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbW21JbnB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiB0cmFuc3BvcnRdIGF1dG9yZWxlYXNlXTsKLSAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07CisgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcmVtb3ZlT2JzZXJ2ZXI6c2VsZl07CiAKLSAgQHRyeSB7Ci0gICAgQk9PTCByZXN1bHQgPSBOTzsKLSAgICBkbyB7Ci0gICAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIG15UG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotICAgICAgcmVzdWx0ID0gW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOiBpblByb3RvY29sIG91dHB1dFByb3RvY29sOiBvdXRQcm90b2NvbF07Ci0gICAgICBbbXlQb29sIHJlbGVhc2VdOwotICAgIH0gd2hpbGUgKHJlc3VsdCk7CisgIGlmIChfZG9tYWluU29ja2V0UGF0aCAhPSBuaWwpIHsKKyAgICB1bmxpbmsoX2RvbWFpblNvY2tldFBhdGguVVRGOFN0cmluZyk7CiAgIH0KLSAgQGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICogdGUpIHsKLSAgICAvL05TTG9nKEAiQ2F1Z2h0IHRyYW5zcG9ydCBleGNlcHRpb24sIGFiYW5kb25pbmcgY2xpZW50IGNvbm5lY3Rpb246ICVAIiwgdGUpOwotICB9Ci0KLSAgTlNOb3RpZmljYXRpb24gKiBuID0gW05TTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbldpdGhOYW1lOiBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdXTsKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6IEBzZWxlY3Rvcihwb3N0Tm90aWZpY2F0aW9uOikgd2l0aE9iamVjdDogbiB3YWl0VW50aWxEb25lOiBZRVNdOwotICAKLSAgW3Bvb2wgcmVsZWFzZV07CiB9CiAKIAorLSh2b2lkKSBjb25uZWN0aW9uQWNjZXB0ZWQ6KE5TTm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9uCit7CisgIE5TRmlsZUhhbmRsZSAqc29ja2V0ID0gW25vdGlmaWNhdGlvbi51c2VySW5mbyBvYmplY3RGb3JLZXk6TlNGaWxlSGFuZGxlTm90aWZpY2F0aW9uRmlsZUhhbmRsZUl0ZW1dOworCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgcmVxdWVzdCBvbiBxdWV1ZQorICBkaXNwYXRjaF9hc3luYyhfcHJvY2Vzc2luZ1F1ZXVlLCBeeworCisgICAgW3NlbGYgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjpzb2NrZXRdOworCisgIH0pOworCisgIC8vIENvbnRpbnVlIGFjY2VwdGluZyBjb25uZWN0aW9ucworICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Cit9CisKKworLSh2b2lkKSBoYW5kbGVDbGllbnRDb25uZWN0aW9uOihOU0ZpbGVIYW5kbGUgKiljbGllbnRTb2NrZXQKK3sKKyAgQGF1dG9yZWxlYXNlcG9vbCB7CisKKyAgICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTpjbGllbnRTb2NrZXRdOworICAgIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFtfcHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKworICAgIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbX2lucHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKyAgICBpZCA8VFByb3RvY29sPiBvdXRQcm90b2NvbCA9IFtfb3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKworICAgIE5TRXJyb3IgKmVycm9yOworICAgIGlmICghW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOmluUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w6b3V0UHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgLy8gSGFuZGxlIGVycm9yCisgICAgICBOU0xvZyhAIkVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDogJUAiLCBlcnJvcik7CisgICAgfQorCisgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsKKworICAgICAgW05TTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHRDZW50ZXIgcG9zdE5vdGlmaWNhdGlvbk5hbWU6VFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXk6IHRyYW5zcG9ydH1dOworICAgIH0pOworCisgIH0KK30KIAogQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI0ZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydDsKKworCitAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSA8TlNPYmplY3Q+CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0OworCitAZW5kCisKKwordHlwZWRlZiB2b2lkICheVEFzeW5jQ29tcGxldGlvbkJsb2NrKSgpOwordHlwZWRlZiB2b2lkICheVEFzeW5jRmFpbHVyZUJsb2NrKShOU0Vycm9yICogX19ub25udWxsKTsKKworCitAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0IDxUVHJhbnNwb3J0PgorCistKHZvaWQpIGZsdXNoV2l0aENvbXBsZXRpb246KFRBc3luY0NvbXBsZXRpb25CbG9jayljb21wbGV0ZWQgZmFpbHVyZTooVEFzeW5jRmFpbHVyZUJsb2NrKWZhaWx1cmU7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2OGFjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVEZyYW1lZFRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjY1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEZyYW1lZFRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKyNkZWZpbmUgSEVBREVSX1NJWkUgNAorI2RlZmluZSBJTklUX0ZSQU1FX1NJWkUgMTAyNAorCisKK0BpbnRlcmZhY2UgVEZyYW1lZFRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqd3JpdGVCdWZmZXI7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKnJlYWRCdWZmZXI7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVhZE9mZnNldDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBURnJhbWVkVHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAoreworICBpZiAoKHNlbGYgPSBbc2VsZiBpbml0XSkpIHsKKyAgICBfdHJhbnNwb3J0ID0gYVRyYW5zcG9ydDsKKyAgICBfcmVhZEJ1ZmZlciA9IG5pbDsKKyAgICBfcmVhZE9mZnNldCA9IDA7CisgICAgX3dyaXRlQnVmZmVyID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6SEVBREVSX1NJWkVdOworICB9CisgIHJldHVybiBzZWxmOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICoqKWVycm9yCit7CisgIGludCBsZW4gPSAoaW50KVtfd3JpdGVCdWZmZXIgbGVuZ3RoXTsKKyAgaW50IGRhdGFfbGVuID0gbGVuIC0gSEVBREVSX1NJWkU7CisgIGlmIChkYXRhX2xlbiA8IDApIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggaTMycmRbSEVBREVSX1NJWkVdOworICBpMzJyZFswXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbiA+PiAyNCkpOworICBpMzJyZFsxXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbiA+PiAxNikpOworICBpMzJyZFsyXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbiA+PiA4KSk7CisgIGkzMnJkWzNdID0gKFVJbnQ4KSgweGZmICYgKGRhdGFfbGVuKSk7CisKKyAgLy8gc2hvdWxkIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSB3cml0ZUJ1ZmZlciBpbnN0ZWFkPyBCZXR0ZXIgZm9yIHRocmVhZGVkCisgIC8vICBvcGVyYXRpb25zIQorICBbX3dyaXRlQnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgSEVBREVSX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhCeXRlczppMzJyZCBsZW5ndGg6SEVBREVSX1NJWkVdOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6X3dyaXRlQnVmZmVyLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6bGVuIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgZmx1c2g6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgX3dyaXRlQnVmZmVyLmxlbmd0aCA9IEhFQURFUl9TSVpFOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSAwOworICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CisKKyAgICBOU1VJbnRlZ2VyIGF2YWlsID0gX3JlYWRCdWZmZXIubGVuZ3RoIC0gX3JlYWRPZmZzZXQ7CisgICAgaWYgKGF2YWlsID09IDApIHsKKyAgICAgIGlmICghW3NlbGYgcmVhZEZyYW1lOmVycm9yXSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGF2YWlsID0gX3JlYWRCdWZmZXIubGVuZ3RoOworICAgIH0KKworICAgIE5TUmFuZ2UgcmFuZ2U7CisgICAgcmFuZ2UubG9jYXRpb24gPSBfcmVhZE9mZnNldDsKKyAgICByYW5nZS5sZW5ndGggPSBNSU4obGVuZ3RoIC0gZ290LCBhdmFpbCk7CisKKyAgICBbX3JlYWRCdWZmZXIgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCtnb3QgcmFuZ2U6cmFuZ2VdOworICAgIF9yZWFkT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKyAgICBnb3QgKz0gcmFuZ2UubGVuZ3RoOworICB9CisKKyAgcmV0dXJuIGdvdDsKK30KKworLShCT09MKSByZWFkRnJhbWU6KE5TRXJyb3IgKiopZXJyb3IKK3sKKyAgVUludDggaTMycmRbSEVBREVSX1NJWkVdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6aTMycmQgb2Zmc2V0OjAgbGVuZ3RoOkhFQURFUl9TSVpFIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzaXplID0KKyAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKKyAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIGlmIChfcmVhZEJ1ZmZlciA9PSBuaWwpIHsKKworICAgIF9yZWFkQnVmZmVyID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6c2l6ZV07CisKKyAgfQorICBlbHNlIHsKKworICAgIFNJbnQzMiBsZW4gPSAoU0ludDMyKV9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICBpZiAobGVuID49IHNpemUpIHsKKworICAgICAgX3JlYWRCdWZmZXIubGVuZ3RoID0gc2l6ZTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgLy8gaW5jcmVhc2UgbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgICAgICBbX3JlYWRCdWZmZXIgaW5jcmVhc2VMZW5ndGhCeTpzaXplLWxlbl07CisKKyAgICB9CisKKyAgfQorCisgIC8vIGNvcHkgaW50byBpbnRlcm5hbCBtZW1vcnkgYnVmZmVyCisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpfcmVhZEJ1ZmZlci5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNTc4NDAuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0ICJUVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVEhUVFBDbGllbnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU1VSTCAqIG1VUkw7Ci0gIE5TTXV0YWJsZVVSTFJlcXVlc3QgKiBtUmVxdWVzdDsKLSAgTlNNdXRhYmxlRGF0YSAqIG1SZXF1ZXN0RGF0YTsKLSAgTlNEYXRhICogbVJlc3BvbnNlRGF0YTsKLSAgaW50IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIE5TU3RyaW5nICogbVVzZXJBZ2VudDsKLSAgaW50IG1UaW1lb3V0OwotfQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMOwotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi0gICAgICAgICB1c2VyQWdlbnQ6IChOU1N0cmluZyAqKSB1c2VyQWdlbnQKLSAgICAgICAgICAgdGltZW91dDogKGludCkgdGltZW91dDsKLQotLSAodm9pZCkgc2V0VVJMOiAoTlNVUkwgKikgYVVSTDsKLQotQGVuZAotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhYTg1OS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEhUVFBDbGllbnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRIVFRQQ2xpZW50Ci0KLQotLSAodm9pZCkgc2V0dXBSZXF1ZXN0Ci17Ci0gIGlmIChtUmVxdWVzdCAhPSBuaWwpIHsKLSAgICBbbVJlcXVlc3QgcmVsZWFzZV07Ci0gIH0KLQotICAvLyBzZXQgdXAgb3VyIHJlcXVlc3Qgb2JqZWN0IHRoYXQgd2UnbGwgdXNlIGZvciBlYWNoIHJlcXVlc3QKLSAgbVJlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOiBtVVJMXTsKLSAgW21SZXF1ZXN0IHNldEhUVFBNZXRob2Q6IEAiUE9TVCJdOwotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IEAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDogQCJDb250ZW50LVR5cGUiXTsKLSAgW21SZXF1ZXN0IHNldFZhbHVlOiBAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiQWNjZXB0Il07Ci0KLSAgTlNTdHJpbmcgKiB1c2VyQWdlbnQgPSBtVXNlckFnZW50OwotICBpZiAoIXVzZXJBZ2VudCkgewotICAgIHVzZXJBZ2VudCA9IEAiQ29jb2EvVEhUVFBDbGllbnQiOwotICB9Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogdXNlckFnZW50IGZvckhUVFBIZWFkZXJGaWVsZDogQCJVc2VyLUFnZW50Il07Ci0KLSAgW21SZXF1ZXN0IHNldENhY2hlUG9saWN5OiBOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YV07Ci0gIGlmIChtVGltZW91dCkgewotICAgIFttUmVxdWVzdCBzZXRUaW1lb3V0SW50ZXJ2YWw6IG1UaW1lb3V0XTsKLSAgfQotfQotCi0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLXsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVVJMOiBhVVJMCi0gICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogbmlsCi0gICAgICAgICAgICAgICAgICAgdGltZW91dDogMF07Ci19Ci0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQKLXsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKCFzZWxmKSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotCi0gIG1UaW1lb3V0ID0gdGltZW91dDsKLSAgaWYgKHVzZXJBZ2VudCkgewotICAgIG1Vc2VyQWdlbnQgPSBbdXNlckFnZW50IHJldGFpbl07Ci0gIH0KLSAgbVVSTCA9IFthVVJMIHJldGFpbl07Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLQotICAvLyBjcmVhdGUgb3VyIHJlcXVlc3QgZGF0YSBidWZmZXIKLSAgbVJlcXVlc3REYXRhID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAxMDI0XTsKLQotICByZXR1cm4gc2VsZjsKLX0KLQotCi0tICh2b2lkKSBzZXRVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIFthVVJMIHJldGFpbl07Ci0gIFttVVJMIHJlbGVhc2VdOwotICBtVVJMID0gYVVSTDsKLQotICBbc2VsZiBzZXR1cFJlcXVlc3RdOwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW21VUkwgcmVsZWFzZV07Ci0gIFttVXNlckFnZW50IHJlbGVhc2VdOwotICBbbVJlcXVlc3QgcmVsZWFzZV07Ci0gIFttUmVxdWVzdERhdGEgcmVsZWFzZV07Ci0gIFttUmVzcG9uc2VEYXRhIHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLQotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KLXsKLSAgTlNSYW5nZSByOwotICByLmxvY2F0aW9uID0gbVJlc3BvbnNlRGF0YU9mZnNldDsKLSAgci5sZW5ndGggPSBsZW47Ci0KLSAgW21SZXNwb25zZURhdGEgZ2V0Qnl0ZXM6IGJ1ZitvZmYgcmFuZ2U6IHJdOwotICBtUmVzcG9uc2VEYXRhT2Zmc2V0ICs9IGxlbjsKLQotICByZXR1cm4gbGVuOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCi17Ci0gIFttUmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6IGRhdGErb2Zmc2V0IGxlbmd0aDogbGVuZ3RoXTsKLX0KLQotCi0tICh2b2lkKSBmbHVzaAotewotICBbbVJlcXVlc3Qgc2V0SFRUUEJvZHk6IG1SZXF1ZXN0RGF0YV07IC8vIG5vdCBzdXJlIGlmIGl0IGNvcGllcyB0aGUgZGF0YQotCi0gIC8vIG1ha2UgdGhlIEhUVFAgcmVxdWVzdAotICBOU1VSTFJlc3BvbnNlICogcmVzcG9uc2U7Ci0gIE5TRXJyb3IgKiBlcnJvcjsKLSAgTlNEYXRhICogcmVzcG9uc2VEYXRhID0KLSAgICBbTlNVUkxDb25uZWN0aW9uIHNlbmRTeW5jaHJvbm91c1JlcXVlc3Q6IG1SZXF1ZXN0IHJldHVybmluZ1Jlc3BvbnNlOiAmcmVzcG9uc2UgZXJyb3I6ICZlcnJvcl07Ci0KLSAgW21SZXF1ZXN0RGF0YSBzZXRMZW5ndGg6IDBdOwotCi0gIGlmIChyZXNwb25zZURhdGEgPT0gbmlsKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQCJDb3VsZCBub3QgbWFrZSBIVFRQIHJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcl07Ci0gIH0KLSAgaWYgKCFbcmVzcG9uc2UgaXNLaW5kT2ZDbGFzczogW05TSFRUUFVSTFJlc3BvbnNlIGNsYXNzXV0pIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIlVuZXhwZWN0ZWQgTlNVUkxSZXNwb25zZSB0eXBlOiAlQCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNTdHJpbmdGcm9tQ2xhc3MoW3Jlc3BvbnNlIGNsYXNzXSldXTsKLSAgfQotCi0gIE5TSFRUUFVSTFJlc3BvbnNlICogaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopIHJlc3BvbnNlOwotICBpZiAoW2h0dHBSZXNwb25zZSBzdGF0dXNDb2RlXSAhPSAyMDApIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIkJhZCByZXNwb25zZSBmcm9tIEhUVFAgc2VydmVyOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXNwb25zZSBzdGF0dXNDb2RlXV1dOwotICB9Ci0KLSAgLy8gcGhldyEKLSAgW21SZXNwb25zZURhdGEgcmVsZWFzZV07Ci0gIG1SZXNwb25zZURhdGEgPSBbcmVzcG9uc2VEYXRhIHJldGFpbl07Ci0gIG1SZXNwb25zZURhdGFPZmZzZXQgPSAwOwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNDk5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUQXN5bmNUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCit0eXBlZGVmIE5TRXJyb3IgKl9fbnVsbGFibGUgKF5USFRUUFNlc3Npb25UcmFuc3BvcnRSZXNwb25zZVZhbGlkYXRlQmxvY2spIChOU0hUVFBVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRGF0YSAqcmVzcG9uc2VEYXRhKTsKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgOiBOU09iamVjdDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PgorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRSZXNwb25zZVZhbGlkYXRlQmxvY2sgcmVzcG9uc2VWYWxpZGF0ZTsKKworKyh2b2lkKSBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb246KE5TVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24gKiljb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoUHJvdG9jb2xOYW1lOihOU1N0cmluZyAqKXByb3RvY29sTmFtZTsKKworLShpZCkgaW5pdFdpdGhTZXNzaW9uOihOU1VSTFNlc3Npb24gKilzZXNzaW9uCisgICAgICAgICAgICAgICAgICBVUkw6KE5TVVJMICopYVVSTDsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgVEhUVFBTZXNzaW9uVHJhbnNwb3J0IDogTlNPYmplY3QgPFRBc3luY1RyYW5zcG9ydD4KKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBiN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEhUVFBTZXNzaW9uVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKCkKKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkxTZXNzaW9uICpzZXNzaW9uOworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkwgKnVybDsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgVEhUVFBTZXNzaW9uVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKmZhY3Rvcnk7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZXF1ZXN0RGF0YTsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TRGF0YSAqcmVzcG9uc2VEYXRhOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZXNwb25zZURhdGFPZmZzZXQ7CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5OworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkKKworKyh2b2lkKSBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb246KE5TVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24gKiljb25maWcgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWUKK3sKKyAgTlNTdHJpbmcgKnRocmlmdENvbnRlbnRUeXBlID0gQCJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgIGlmIChwcm90b2NvbE5hbWUubGVuZ3RoKSB7CisgICAgdGhyaWZ0Q29udGVudFR5cGUgPSBbdGhyaWZ0Q29udGVudFR5cGUgc3RyaW5nQnlBcHBlbmRpbmdGb3JtYXQ6QCI7IHA9JUAiLCBwcm90b2NvbE5hbWVdOworICB9CisKKyAgY29uZmlnLnJlcXVlc3RDYWNoZVBvbGljeSA9IE5TVVJMUmVxdWVzdFJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhOworICBjb25maWcuSFRUUFNob3VsZFVzZVBpcGVsaW5pbmcgPSBZRVM7CisgIGNvbmZpZy5IVFRQU2hvdWxkU2V0Q29va2llcyA9IE5POworICBjb25maWcuVVJMQ2FjaGUgPSBuaWw7CisgIGNvbmZpZy5IVFRQQWRkaXRpb25hbEhlYWRlcnMgPSBAe0AiQ29udGVudC1UeXBlIjp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJBY2NlcHQiOnRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlVzZXItQWdlbnQiOkAiVGhyaWZ0L0NvY29hIChTZXNzaW9uKSJ9OworfQorCisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbiBVUkw6KE5TVVJMICopdXJsCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX3Nlc3Npb24gPSBzZXNzaW9uOworICAgIF91cmwgPSB1cmw7CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZDxUQXN5bmNUcmFuc3BvcnQ+KSBuZXdUcmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVEhUVFBTZXNzaW9uVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZhY3Rvcnk6c2VsZl07Cit9CisKKy0oTlNVUkxTZXNzaW9uRGF0YVRhc2sgKikgdGFza1dpdGhSZXF1ZXN0OihOU1VSTFJlcXVlc3QgKilyZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCAoXikoTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgTlNVUkxTZXNzaW9uRGF0YVRhc2sgKm5ld1Rhc2sgPSBbX3Nlc3Npb24gZGF0YVRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOmNvbXBsZXRpb25IYW5kbGVyXTsKKyAgaWYgKCFuZXdUYXNrKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTpAIkZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvbiBkYXRhIHRhc2sifV07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gbmV3VGFzazsKK30KKworLShOU0Vycm9yICopIHZhbGlkYXRlUmVzcG9uc2U6KE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2UgZGF0YTooTlNEYXRhICopZGF0YQoreworICBpZiAoX3Jlc3BvbnNlVmFsaWRhdGUpIHsKKyAgICByZXR1cm4gX3Jlc3BvbnNlVmFsaWRhdGUocmVzcG9uc2UsIGRhdGEpOworICB9CisgIHJldHVybiBuaWw7Cit9CisKK0BlbmQKKworCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnQKKworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoRmFjdG9yeTooVEhUVFBTZXNzaW9uVHJhbnNwb3J0RmFjdG9yeSAqKWZhY3RvcnkKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVzcG9uc2VEYXRhLmxlbmd0aCAtIF9yZXNwb25zZURhdGFPZmZzZXQ7CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19yZXNwb25zZURhdGEgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9yZXNwb25zZURhdGFPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghX3JlcXVlc3REYXRhKSB7CisgICAgX3JlcXVlc3REYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhDYXBhY2l0eToyNTZdOworICB9CisKKyAgW19yZXF1ZXN0RGF0YSBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKHZvaWQpIGZsdXNoV2l0aENvbXBsZXRpb246KFRBc3luY0NvbXBsZXRpb25CbG9jayljb21wbGV0ZWQgZmFpbHVyZTooVEFzeW5jRmFpbHVyZUJsb2NrKWZhaWx1cmUKK3sKKyAgTlNFcnJvciAqZXJyb3I7CisKKyAgTlNNdXRhYmxlVVJMUmVxdWVzdCAqcmVxdWVzdCA9IFtbTlNNdXRhYmxlVVJMUmVxdWVzdCBhbGxvY10gaW5pdFdpdGhVUkw6X2ZhY3RvcnkudXJsXTsKKyAgcmVxdWVzdC5IVFRQTWV0aG9kID0gQCJQT1NUIjsKKyAgcmVxdWVzdC5IVFRQQm9keSA9IF9yZXF1ZXN0RGF0YTsKKworICBfcmVxdWVzdERhdGEgPSBuaWw7CisKKyAgTlNVUkxTZXNzaW9uRGF0YVRhc2sgKnRhc2sgPSBbX2ZhY3RvcnkgdGFza1dpdGhSZXF1ZXN0OnJlcXVlc3QgY29tcGxldGlvbkhhbmRsZXI6XihOU0RhdGEgKmRhdGEsIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0Vycm9yICplcnJvcikgeworCisgICAgLy8gQ2hlY2sgcmVzcG9uc2UgdHlwZQorICAgIGlmICghZXJyb3IgJiYgIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworCisgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk6IEAoVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRSZXNwb25zZSl9XTsKKworICAgIH0KKworICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlCisgICAgTlNIVFRQVVJMUmVzcG9uc2UgKmh0dHBSZXNwb25zZSA9IChpZClyZXNwb25zZTsKKyAgICBpZiAoIWVycm9yICYmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCkgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInN0YXR1c0NvZGUiOkAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpfV07CisgICAgfQorCisgICAgLy8gQWxsb3cgZmFjdG9yeSB0byBjaGVjaworICAgIGlmICghZXJyb3IpIHsKKyAgICAgIGVycm9yID0gW19mYWN0b3J5IHZhbGlkYXRlUmVzcG9uc2U6aHR0cFJlc3BvbnNlIGRhdGE6ZGF0YV07CisgICAgfQorCisgICAgX3Jlc3BvbnNlRGF0YU9mZnNldCA9IDA7CisKKyAgICBpZiAoZXJyb3IpIHsKKworICAgICAgX3Jlc3BvbnNlRGF0YSA9IG5pbDsKKworICAgICAgZmFpbHVyZShlcnJvcik7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIGlmIChkYXRhID09IG5pbCkgeworICAgICAgICBkYXRhID0gW05TRGF0YSBkYXRhXTsKKyAgICAgIH0KKworICAgICAgX3Jlc3BvbnNlRGF0YSA9IGRhdGE7CisKKyAgICAgIGNvbXBsZXRlZChzZWxmKTsKKyAgICB9CisKKyAgfSBlcnJvcjomZXJyb3JdOworCisgIGlmICghdGFzaykgeworICAgIGZhaWx1cmUoZXJyb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIFt0YXNrIHJlc3VtZV07Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGRpc3BhdGNoX3NlbWFwaG9yZV90IGNvbXBsZXRlZCA9IGRpc3BhdGNoX3NlbWFwaG9yZV9jcmVhdGUoMCk7CisKKyAgX19ibG9jayBCT09MIHJlc3VsdDsKKyAgX19ibG9jayBOU0Vycm9yICppbnRlcm5hbEVycm9yOworCisgIFtzZWxmIGZsdXNoV2l0aENvbXBsZXRpb246XihpZCA8IFRBc3luY1RyYW5zcG9ydCA+IHRyYW5zcG9ydCkgeworCisgICAgcmVzdWx0ID0gWUVTOworCisgICAgZGlzcGF0Y2hfc2VtYXBob3JlX3NpZ25hbChjb21wbGV0ZWQpOworCisgIH0gZmFpbHVyZTpeKE5TRXJyb3IgKmVycm9yKSB7CisKKyAgICBpbnRlcm5hbEVycm9yID0gZXJyb3I7CisKKyAgICByZXN1bHQgPSBOTzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9XTsKKworICBkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdChjb21wbGV0ZWQsIERJU1BBVENIX1RJTUVfRk9SRVZFUik7CisKKyAgaWYgKGVycm9yKSB7CisgICAgKmVycm9yID0gaW50ZXJuYWxFcnJvcjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzVkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUSFRUUFRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgorCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMOworCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMCisgICAgICAgIHVzZXJBZ2VudDoobnVsbGFibGUgTlNTdHJpbmcgKil1c2VyQWdlbnQKKyAgICAgICAgICB0aW1lb3V0OihpbnQpdGltZW91dDsKKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNDZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEhUVFBUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkwgKnVybDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3Q7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZXF1ZXN0RGF0YTsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TRGF0YSAqcmVzcG9uc2VEYXRhOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZXNwb25zZURhdGFPZmZzZXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqdXNlckFnZW50OworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNUaW1lSW50ZXJ2YWwgdGltZW91dDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFRyYW5zcG9ydAorCistKHZvaWQpIHNldHVwUmVxdWVzdAoreworICAvLyBzZXQgdXAgb3VyIHJlcXVlc3Qgb2JqZWN0IHRoYXQgd2UnbGwgdXNlIGZvciBlYWNoIHJlcXVlc3QKKyAgX3JlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl91cmxdOworICBbX3JlcXVlc3Qgc2V0SFRUUE1ldGhvZDpAIlBPU1QiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkNvbnRlbnQtVHlwZSJdOworICBbX3JlcXVlc3Qgc2V0VmFsdWU6QCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOkAiQWNjZXB0Il07CisKKyAgTlNTdHJpbmcgKnVzZXJBZ2VudCA9IF91c2VyQWdlbnQ7CisgIGlmICghdXNlckFnZW50KSB7CisgICAgdXNlckFnZW50ID0gQCJUaHJpZnQvQ29jb2EiOworICB9CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTp1c2VyQWdlbnQgZm9ySFRUUEhlYWRlckZpZWxkOkAiVXNlci1BZ2VudCJdOworCisgIFtfcmVxdWVzdCBzZXRDYWNoZVBvbGljeTpOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YV07CisgIGlmIChfdGltZW91dCkgeworICAgIFtfcmVxdWVzdCBzZXRUaW1lb3V0SW50ZXJ2YWw6X3RpbWVvdXRdOworICB9Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAoreworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhVUkw6YVVSTAorICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6bmlsCisgICAgICAgICAgICAgICAgICAgdGltZW91dDowXTsKK30KKworCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMCisgICAgICAgIHVzZXJBZ2VudDooTlNTdHJpbmcgKilhVXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KWFUaW1lb3V0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmICghc2VsZikgeworICAgIHJldHVybiBuaWw7CisgIH0KKworICBfdGltZW91dCA9IGFUaW1lb3V0OworICBfdXNlckFnZW50ID0gYVVzZXJBZ2VudDsKKyAgX3VybCA9IGFVUkw7CisKKyAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKKworICAvLyBjcmVhdGUgb3VyIHJlcXVlc3QgZGF0YSBidWZmZXIKKyAgX3JlcXVlc3REYXRhID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OjEwMjRdOworCisgIHJldHVybiBzZWxmOworfQorCistKHZvaWQpIHNldFVSTDooTlNVUkwgKilhVVJMCit7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVzcG9uc2VEYXRhLmxlbmd0aCAtIF9yZXNwb25zZURhdGFPZmZzZXQ7CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19yZXNwb25zZURhdGEgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9yZXNwb25zZURhdGFPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19yZXF1ZXN0IHNldEhUVFBCb2R5Ol9yZXF1ZXN0RGF0YV07CisKKyAgX3Jlc3BvbnNlRGF0YU9mZnNldCA9IDA7CisKKyAgLy8gbWFrZSB0aGUgSFRUUCByZXF1ZXN0CisgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlOworICBfcmVzcG9uc2VEYXRhID0gW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0Ol9yZXF1ZXN0IHJldHVybmluZ1Jlc3BvbnNlOiZyZXNwb25zZSBlcnJvcjplcnJvcl07CisgIGlmICghX3Jlc3BvbnNlRGF0YSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgc2V0TGVuZ3RoOjBdOworCisgIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6TlNIVFRQVVJMUmVzcG9uc2UuY2xhc3NdKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoTlNIVFRQVVJMUmVzcG9uc2UgKilyZXNwb25zZTsKKyAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7CisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIFRIdHRwVHJhbnNwb3J0RXJyb3IgY29kZTsKKyAgICAgIGlmIChodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSA0MDEpIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JBdXRoZW50aWNhdGlvbjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRTdGF0dXM7CisgICAgICB9CisKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk6IEAoY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInN0YXR1c0NvZGUiOkAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaAppbmRleCBmYTRkMzcxLi42MjQ5ZDMyIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCkBAIC0yMCwxMCArMjAsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotCU5TTXV0YWJsZURhdGEgKm1CdWZmZXI7Ci0JTlNVSW50ZWdlciBtT2Zmc2V0OwotfQotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOwotLSAoTlNEYXRhICopZ2V0QnVmZmVyOworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShOU0RhdGEgKikgYnVmZmVyOworCistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGE7CisKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGE7CisKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQppbmRleCA4NjkwMTBhLi5lYzE5Y2M4IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCkBAIC0xOCw1NCArMTgsMTA0IEBACiAgKi8KIAogI2ltcG9ydCAiVE1lbW9yeUJ1ZmZlci5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKIAogI2RlZmluZSBHQVJCQUdFX0JVRkZFUl9TSVpFIDQwOTYgLy8gNEtpQgogCisKK0BpbnRlcmZhY2UgVE1lbW9yeUJ1ZmZlciAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgVUludDMyIGJ1ZmZlck9mZnNldDsKKworQGVuZAorCisKIEBpbXBsZW1lbnRhdGlvbiBUTWVtb3J5QnVmZmVyCi0tIChpZClpbml0IHsKLQlpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgewotCQltQnVmZmVyID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0XTsKLQkJbU9mZnNldCA9IDA7Ci0JfQotCXJldHVybiBzZWxmOworCistKGlkKSBpbml0Cit7CisgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKKyAgICBfYnVmZmVyID0gW05TTXV0YWJsZURhdGEgbmV3XTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhIHsKLQlpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgewotCQltQnVmZmVyID0gW2RhdGEgbXV0YWJsZUNvcHldOwotCQltT2Zmc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIHNlbGY7CistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gW2RhdGEgbXV0YWJsZUNvcHldOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tIChpbnQpcmVhZEFsbDoodWludDhfdCAqKWJ1ZiBvZmZzZXQ6KGludClvZmYgbGVuZ3RoOihpbnQpbGVuIHsKLQlpZiAoW21CdWZmZXIgbGVuZ3RoXSAtIG1PZmZzZXQgPCBsZW4pIHsKLQkJQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246QCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiXTsKLQl9Ci0JW21CdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKG1PZmZzZXQsIGxlbildOwotCW1PZmZzZXQgKz0gbGVuOwotCWlmIChtT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKLQkJW21CdWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBtT2Zmc2V0KSB3aXRoQnl0ZXM6TlVMTCBsZW5ndGg6MF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gbGVuOworLShpZCkgaW5pdFdpdGhEYXRhTm9Db3B5OihOU011dGFibGVEYXRhICopZGF0YQoreworICBpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgeworICAgIF9idWZmZXIgPSBkYXRhOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tICh2b2lkKXdyaXRlOihjb25zdCB1aW50OF90ICopZGF0YSBvZmZzZXQ6KHVuc2lnbmVkIGludClvZmZzZXQgbGVuZ3RoOih1bnNpZ25lZCBpbnQpbGVuZ3RoIHsKLQlbbUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpZmx1c2ggewotCS8vIG5vb3AKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBhdmFpbCA9IChVSW50MzIpX2J1ZmZlci5sZW5ndGggLSBfYnVmZmVyT2Zmc2V0OworICBpZiAoYXZhaWwgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfYnVmZmVyT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19idWZmZXIgZ2V0Qnl0ZXM6b3V0QnVmZmVyICsgb3V0QnVmZmVyT2Zmc2V0IHJhbmdlOnJhbmdlXTsKKyAgX2J1ZmZlck9mZnNldCArPSByYW5nZS5sZW5ndGg7CisKKyAgaWYgKF9idWZmZXJPZmZzZXQgPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgeworICAgIFtfYnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgX2J1ZmZlck9mZnNldCkgd2l0aEJ5dGVzOk5VTEwgbGVuZ3RoOjBdOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisKKyAgcmV0dXJuIChVSW50MzIpcmFuZ2UubGVuZ3RoOwogfQogCi0tIChOU0RhdGEgKilnZXRCdWZmZXIgewotCXJldHVybiBbW21CdWZmZXIgY29weV0gYXV0b3JlbGVhc2VdOworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilpbkJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilpbkJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfYnVmZmVyIGFwcGVuZEJ5dGVzOmluQnVmZmVyICsgaW5CdWZmZXJPZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZClkZWFsbG9jIHsKLQlbbUJ1ZmZlciByZWxlYXNlXTsKLQlbc3VwZXIgZGVhbGxvY107CistKE5TRGF0YSAqKSBidWZmZXIKK3sKKyAgcmV0dXJuIF9idWZmZXI7CiB9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaAppbmRleCBiYTJhMjA5Li5kYjZlZGYzIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCkBAIC0yMSwxNSArMjEsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU0ZpbGVIYW5kbGUgKiBtSW5wdXRGaWxlSGFuZGxlOwotICBOU0ZpbGVIYW5kbGUgKiBtT3V0cHV0RmlsZUhhbmRsZTsKLX0KK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLS0gKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgZmlsZUhhbmRsZTsKIAotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGU7CitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilmaWxlSGFuZGxlOworCistKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopaW5wdXRGaWxlSGFuZGxlCisgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopb3V0cHV0RmlsZUhhbmRsZTsKIAogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KaW5kZXggYjIxODIxOC4uYzkwN2Y4NyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQpAQCAtMTksNzMgKzE5LDEwMCBAQAogCiAKICNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqaW5wdXRGaWxlSGFuZGxlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU0ZpbGVIYW5kbGUgKm91dHB1dEZpbGVIYW5kbGU7CisKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVE5TRmlsZUhhbmRsZVRyYW5zcG9ydAogCi0tIChpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGZpbGVIYW5kbGUKKy0oaWQpIGluaXRXaXRoRmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopZmlsZUhhbmRsZQogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOmZpbGVIYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOmZpbGVIYW5kbGVdOwogfQogCiAKLS0gKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBpbnB1dEZpbGVIYW5kbGUKLSAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBvdXRwdXRGaWxlSGFuZGxlCistKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopYUlucHV0RmlsZUhhbmRsZQorICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWFPdXRwdXRGaWxlSGFuZGxlCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0KLSAgbUlucHV0RmlsZUhhbmRsZSA9IFtpbnB1dEZpbGVIYW5kbGUgcmV0YWluXTsKLSAgbU91dHB1dEZpbGVIYW5kbGUgPSBbb3V0cHV0RmlsZUhhbmRsZSByZXRhaW5dOwotCisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0RmlsZUhhbmRsZSA9IGFJbnB1dEZpbGVIYW5kbGU7CisgICAgX291dHB1dEZpbGVIYW5kbGUgPSBhT3V0cHV0RmlsZUhhbmRsZTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAogCi0tICh2b2lkKSBkZWFsbG9jIHsKLSAgW21JbnB1dEZpbGVIYW5kbGUgcmVsZWFzZV07Ci0gIFttT3V0cHV0RmlsZUhhbmRsZSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOworLShCT09MKSByZWFkQWxsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbikgeworCisgICAgTlNEYXRhICpkID0gW19pbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAoZC5sZW5ndGggPT0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBbZCBnZXRCeXRlczpidWYrZ290IGxlbmd0aDpkLmxlbmd0aF07CisgICAgZ290ICs9IGQubGVuZ3RoOworICB9CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBtYXhMZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOworICBVSW50MzIgZ290ID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbikgewotICAgIE5TRGF0YSAqIGQgPSBbbUlucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOiBsZW4tZ290XTsKLSAgICBpZiAoW2QgbGVuZ3RoXSA9PSAwKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ2Fubm90IHJlYWQuIE5vIG1vcmUgZGF0YS4iXTsKKworICAgIE5TRGF0YSAqZCA9IFtfaW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKGQubGVuZ3RoID09IDApIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBbZCBnZXRCeXRlczogYnVmK2dvdF07Ci0gICAgZ290ICs9IFtkIGxlbmd0aF07CisKKyAgICBbZCBnZXRCeXRlczpidWYrZ290IGxlbmd0aDpkLmxlbmd0aF07CisgICAgZ290ICs9IGQubGVuZ3RoOwogICB9CiAgIHJldHVybiBnb3Q7CiB9CiAKIAotLSAodm9pZCkgd3JpdGU6ICh1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAodW5zaWduZWQgaW50KSBvZmZzZXQgbGVuZ3RoOiAodW5zaWduZWQgaW50KSBsZW5ndGgKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBOU0RhdGEgKiBkYXRhT2JqZWN0ID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoQnl0ZXNOb0NvcHk6IGRhdGErb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVXaGVuRG9uZTogTk9dOworICB2b2lkICpwb3MgPSAodm9pZCAqKWRhdGEgKyBvZmZzZXQ7CiAKICAgQHRyeSB7Ci0gICAgW21PdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTogZGF0YU9iamVjdF07Ci0gIH0gQGNhdGNoIChOU0V4Y2VwdGlvbiAqIGUpIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIiVzOiBVbmFibGUgdG8gd3JpdGUgZGF0YTogJUAiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBlXV07CisgICAgW19vdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTpbTlNEYXRhIGRhdGFXaXRoQnl0ZXNOb0NvcHk6cG9zIGxlbmd0aDpsZW5ndGggZnJlZVdoZW5Eb25lOk5PXV07CisgIH0KKyAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgIH0KKyAgICByZXR1cm4gTk87CiAgIH0KIAotICBbZGF0YU9iamVjdCByZWxlYXNlXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSBmbHVzaAorLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLQorICByZXR1cm4gWUVTOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oCmluZGV4IGQ3YmU0MGIuLjU0YzQ4ODQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oCkBAIC0yMCwxOSArMjAsMjQgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFROU1N0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PiB7Ci0gIE5TSW5wdXRTdHJlYW0gKiBtSW5wdXQ7Ci0gIE5TT3V0cHV0U3RyZWFtICogbU91dHB1dDsKLX0KK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dAotICAgICAgICAgICAgICBvdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQ7CiAKLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dDsKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CiAKLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TSW5wdXRTdHJlYW0gKmlucHV0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNPdXRwdXRTdHJlYW0gKm91dHB1dDsKKworLShpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbToobnVsbGFibGUgTlNJbnB1dFN0cmVhbSAqKWlucHV0CisgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOihudWxsYWJsZSBOU091dHB1dFN0cmVhbSAqKW91dHB1dDsKKworLShpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTooTlNJbnB1dFN0cmVhbSAqKWlucHV0OworCistKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQ7CisKKy0odm9pZCkgY2xvc2U7CiAKIEBlbmQKIAogCi0KK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQppbmRleCAxZDRjZmVlLi4xOGM0MWQzIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQpAQCAtMTgsNzIgKzE4LDEzNiBAQAogICovCiAKICNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUTlNTdHJlYW1UcmFuc3BvcnQgKCkKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVE5TU3RyZWFtVHJhbnNwb3J0CiAKLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dAotICAgICAgICAgICAgICBvdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dAorICAgICAgICAgICAgIG91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQKIHsKLSAgW3N1cGVyIGluaXRdOwotICBtSW5wdXQgPSBbaW5wdXQgcmV0YWluXTsKLSAgbU91dHB1dCA9IFtvdXRwdXQgcmV0YWluXTsKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfaW5wdXQgPSBpbnB1dDsKKyAgICBfb3V0cHV0ID0gb3V0cHV0OworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dAogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXQgb3V0cHV0U3RyZWFtOiBuaWxdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dCBvdXRwdXRTdHJlYW06bmlsXTsKIH0KIAotLSAoaWQpIGluaXRXaXRoT3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IG5pbCBvdXRwdXRTdHJlYW06IG91dHB1dF07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOm5pbCBvdXRwdXRTdHJlYW06b3V0cHV0XTsKIH0KIAotLSAodm9pZCkgZGVhbGxvYworLSh2b2lkKSBkZWFsbG9jCiB7Ci0gIFttSW5wdXQgcmVsZWFzZV07Ci0gIFttT3V0cHV0IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107CisgIFtzZWxmIGNsb3NlXTsKIH0KIAotCi0tIChpbnQpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChpbnQpIG9mZiBsZW5ndGg6IChpbnQpIGxlbgorLShCT09MKSByZWFkQWxsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZ290ID0gMDsKLSAgaW50IHJldCA9IDA7CisgIFVJbnQzMiBnb3QgPSAwOwogICB3aGlsZSAoZ290IDwgbGVuKSB7Ci0gICAgcmV0ID0gW21JbnB1dCByZWFkOiBidWYrb2ZmK2dvdCBtYXhMZW5ndGg6IGxlbi1nb3RdOwotICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIl07CisKKyAgICBVSW50MzIgcmVhZCA9IChVSW50MzIpW19pbnB1dCByZWFkOmJ1ZitvZmYrZ290IG1heExlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAocmVhZCA8PSAwKSB7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yTm90T3BlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKICAgICB9Ci0gICAgZ290ICs9IHJldDsKKworICAgIGdvdCArPSByZWFkOwogICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbikgeworCisgICAgVUludDMyIHJlYWQgPSAoVUludDMyKVtfaW5wdXQgcmVhZDpidWYrb2ZmK2dvdCBtYXhMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKHJlYWQgPD0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ290ICs9IHJlYWQ7CisgIH0KKwogICByZXR1cm4gZ290OwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAodWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7Ci0gIGludCByZXN1bHQgPSAwOworICBVSW50MzIgZ290ID0gMDsKKyAgTlNJbnRlZ2VyIHRvdGFsID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgewotICAgIHJlc3VsdCA9IFttT3V0cHV0IHdyaXRlOiBkYXRhK29mZnNldCtnb3QgbWF4TGVuZ3RoOiBsZW5ndGgtZ290XTsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFcnJvciB3cml0aW5nIHRvIHRyYW5zcG9ydCBvdXRwdXQgc3RyZWFtLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBbbU91dHB1dCBzdHJlYW1FcnJvcl1dOwotICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVuZCBvZiBvdXRwdXQgc3RyZWFtLiJdOworCisgICAgdG90YWwgPSBbX291dHB1dCB3cml0ZTpkYXRhK29mZnNldCtnb3QgbWF4TGVuZ3RoOmxlbmd0aC1nb3RdOworICAgIGlmICh0b3RhbCA9PSAtMSkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICAgIGdvdCArPSByZXN1bHQ7CisgICAgZWxzZSBpZiAodG90YWwgPT0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBnb3QgKz0gdG90YWw7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSBmbHVzaAorLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgLy8gbm8gZmx1c2ggZm9yIHlvdSEKKyAgcmV0dXJuIFlFUzsKK30KKworLSh2b2lkKSBjbG9zZQoreworICBOU0lucHV0U3RyZWFtICppbnB1dCA9IHNlbGYuaW5wdXQ7CisgIGlmIChpbnB1dCkgeworICAgIC8vIENsb3NlIGFuZCByZXNldCBpbnB1dHN0cmVhbQorICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRlJlYWRTdHJlYW1SZWYpKGlucHV0KSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIFtpbnB1dCBzZXREZWxlZ2F0ZTpuaWxdOworICAgIFtpbnB1dCBjbG9zZV07CisgICAgW2lucHV0IHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIGlucHV0ID0gbmlsOworICB9CisKKyAgTlNPdXRwdXRTdHJlYW0gKm91dHB1dCA9IHNlbGYub3V0cHV0OworICBpZiAob3V0cHV0KSB7CisgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IG91dHB1dHN0cmVhbQorICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoX19icmlkZ2UgQ0ZXcml0ZVN0cmVhbVJlZikob3V0cHV0KSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIFtvdXRwdXQgc2V0RGVsZWdhdGU6bmlsXTsKKyAgICBbb3V0cHV0IGNsb3NlXTsKKyAgICBbb3V0cHV0IHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIG91dHB1dCA9IG5pbDsKKyAgfQogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNmM0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0IDogVE5TU3RyZWFtVHJhbnNwb3J0IDxOU1N0cmVhbURlbGVnYXRlPgorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworLShCT09MKSBpc09wZW47CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEyMTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUU1NMU29ja2V0VHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCIKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2Vsc2UKKyNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KKyNlbmRpZgorCitAaW50ZXJmYWNlIFRTU0xTb2NrZXRUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc3NsSG9zdG5hbWU7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIGludCBzZDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0VHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoSG9zdG5hbWU6KE5TU3RyaW5nICopaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgIHBvcnQ6KGludClwb3J0CisgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yCit7CisgIF9zc2xIb3N0bmFtZSA9IGhvc3RuYW1lOworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworCisKKyAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKworCisKKyAgICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShbaG9zdG5hbWUgVVRGOFN0cmluZ10pKSA9PSBOVUxMKSB7CisgICAgICBOU0xvZyhAImZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lICVAIiwgaG9zdG5hbWUpOworICAgICAgaGVycm9yKCJyZXNvbHYiKTsKKyAgICAgIGlmIChpID09IDkpIHsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JIb3N0YW5hbWVSZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgIH0KKyAgICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDowLjJdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIG1lbXNldCgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgbWVtY3B5KCZwaW4uc2luX2FkZHIsIGhwLT5oX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworICBwaW4uc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICBpZiAoKF9zZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkgeworICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yU29ja2V0Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCisgIGlmIChjb25uZWN0KF9zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkgeworICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBjb25lbmN0IHRvIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yQ29ubmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBfc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworCisgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXRTdHJlYW07CisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW07CisKKyAgaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTb2NrZXRTZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSk7CisKKyAgICBOU0RpY3Rpb25hcnkgKnNldHRpbmdzID0gQHsoX19icmlkZ2UgTlNTdHJpbmcgKilrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluOiBAWUVTfTsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChDRlJlYWRTdHJlYW1SZWYpcmVhZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlR5cGVSZWYpc2V0dGluZ3MpOworCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KChDRldyaXRlU3RyZWFtUmVmKXdyaXRlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIGlucHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOworICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbaW5wdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW2lucHV0U3RyZWFtIG9wZW5dOworCisgICAgb3V0cHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07CisgICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtvdXRwdXRTdHJlYW0gb3Blbl07CisKKyAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7CisgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKKyAgfQorCisgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBkZWFsbG9jCit7CisgIFtzZWxmIGNsb3NlXTsKK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBOU1N0cmVhbURlbGVnYXRlCisKKy0odm9pZCkgc3RyZWFtOihOU1N0cmVhbSAqKWFTdHJlYW0KKyAgIGhhbmRsZUV2ZW50OihOU1N0cmVhbUV2ZW50KWV2ZW50Q29kZQoreworICBzd2l0Y2ggKGV2ZW50Q29kZSkgeworICBjYXNlIE5TU3RyZWFtRXZlbnROb25lOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudE9wZW5Db21wbGV0ZWQ6CisgICAgYnJlYWs7CisKKyAgY2FzZSBOU1N0cmVhbUV2ZW50SGFzU3BhY2VBdmFpbGFibGU6IHsKKworICAgIEJPT0wgcHJvY2VlZCA9IE5POworICAgIFNlY1RydXN0UmVzdWx0VHlwZSB0cnVzdFJlc3VsdCA9IGtTZWNUcnVzdFJlc3VsdEludmFsaWQ7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgbmV3UG9saWNpZXMgPSBOVUxMOworCisgICAgZG8geworCisgICAgICBTZWNUcnVzdFJlZiB0cnVzdCA9IChfX2JyaWRnZSBTZWNUcnVzdFJlZilbYVN0cmVhbSBwcm9wZXJ0eUZvcktleTooTlNTdHJpbmcgKilrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFBlZXJUcnVzdF07CisKKyAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgU2VjUG9saWN5UmVmIHBvbGljeSA9IFNlY1BvbGljeUNyZWF0ZVNTTChOTywgKF9fYnJpZGdlIENGU3RyaW5nUmVmKShfc3NsSG9zdG5hbWUpKTsKKyAgICAgIGlmICghcG9saWN5KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBDRkFycmF5UmVmIHBvbGljaWVzOworICAgICAgaWYgKFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCAmcG9saWNpZXMpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBwb2xpY2llcyk7CisgICAgICBDRkFycmF5QXBwZW5kVmFsdWUobmV3UG9saWNpZXMsIHBvbGljeSk7CisKKyAgICAgIENGUmVsZWFzZShwb2xpY2llcyk7CisgICAgICBDRlJlbGVhc2UocG9saWN5KTsKKworICAgICAgLy8gVXBkYXRlIHRydXN0IHBvbGljaWVzCisgICAgICBpZiAoU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEV2YWx1YXRlIHRoZSB0cnVzdCBjaGFpbgorICAgICAgaWYgKFNlY1RydXN0RXZhbHVhdGUodHJ1c3QsICZ0cnVzdFJlc3VsdCkgIT0gZXJyU2VjU3VjY2VzcykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0cnVzdFJlc3VsdCkgeworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRQcm9jZWVkOgorICAgICAgICAvLyBOU0xvZyhAIlRydXN0ZWQgYnkgVVNFUiIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IE9TIik7CisgICAgICAgIHByb2NlZWQgPSBZRVM7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICBwcm9jZWVkID0gcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QsIHRydXN0UmVzdWx0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RGVueToKKyAgICAgICAgLy8gTlNMb2coQCJEZW55Iik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdEZhdGFsVHJ1c3RGYWlsdXJlOgorICAgICAgICAvLyBOU0xvZyhAIkZhdGFsVHJ1c3RGYWlsdXJlIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdE90aGVyRXJyb3I6CisgICAgICAgIC8vIE5TTG9nKEAiT3RoZXJFcnJvciIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOgorICAgICAgICAvLyBOU0xvZyhAIkludmFsaWQiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIE5TTG9nKEAiRGVmYXVsdCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0KKyAgICB3aGlsZSAoTk8pOworCisgICAgaWYgKCFwcm9jZWVkKSB7CisgICAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gUmVzdWx0OiAldSIsIHRydXN0UmVzdWx0KTsKKyAgICAgIFthU3RyZWFtIGNsb3NlXTsKKyAgICB9CisKKyAgICBpZiAobmV3UG9saWNpZXMpIHsKKyAgICAgIENGUmVsZWFzZShuZXdQb2xpY2llcyk7CisgICAgfQorCisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBOU1N0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZDogeworICAgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogRXJyb3Igb2NjdXJyZWQgb3BlbmluZyBzdHJlYW06ICVAIiwgW2FTdHJlYW0gc3RyZWFtRXJyb3JdKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTlNTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgIGJyZWFrOworICB9Cit9CisKK0JPT0wgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoU2VjVHJ1c3RSZWYgbXlUcnVzdCwgU2VjVHJ1c3RSZXN1bHRUeXBlIGxhc3RUcnVzdFJlc3VsdCkKK3sKKyAgQ0ZBYnNvbHV0ZVRpbWUgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpOworICBDRkFic29sdXRlVGltZSBjdXJyZW50VGltZSA9IENGQWJzb2x1dGVUaW1lR2V0Q3VycmVudCgpOworCisgIENGQWJzb2x1dGVUaW1lIHRpbWVJbmNyZW1lbnQgPSAzMTUzNjAwMDsKKyAgQ0ZBYnNvbHV0ZVRpbWUgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gdGltZUluY3JlbWVudDsKKworICBpZiAodHJ1c3RUaW1lIC0gbmV3VGltZSkgeworCisgICAgQ0ZEYXRlUmVmIG5ld0RhdGUgPSBDRkRhdGVDcmVhdGUoTlVMTCwgbmV3VGltZSk7CisgICAgU2VjVHJ1c3RTZXRWZXJpZnlEYXRlKG15VHJ1c3QsIG5ld0RhdGUpOworICAgIENGUmVsZWFzZShuZXdEYXRlKTsKKworICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKG15VHJ1c3QsICZsYXN0VHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgfQorCisgIGlmIChsYXN0VHJ1c3RSZXN1bHQgPT0ga1NlY1RydXN0UmVzdWx0UHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0ga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQpIHsKKyAgICByZXR1cm4gWUVTOworICB9CisKKyAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gcmVjb3ZlciBjZXJ0aWZpY2F0ZSB0cnVzdCBmYWlsdXJlIik7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgaXNPcGVuCit7CisgIGlmIChfc2QgPiAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3ZjM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW47CisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcikgeworICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JIb3N0YW5hbWVSZXNvbHV0aW9uICA9IC0xMDAwMCwKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yU29ja2V0Q3JlYXRlICAgICAgICAgPSAtMTAwMDEsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QgICAgICAgICAgICAgID0gLTEwMDAyLAorfTsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmOTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiA9IEAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhOTU3ZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVFNvY2tldENsaWVudCA6IFROU1N0cmVhbVRyYW5zcG9ydCB7Ci19Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0OwotCi1AZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDRhZjkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2ltcG9ydCAiVFNvY2tldENsaWVudC5oIgotCi0jaWYgIVRBUkdFVF9PU19JUEhPTkUKLSNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KLSNlbHNlCi0jaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+Ci0jZW5kaWYKLQotQGltcGxlbWVudGF0aW9uIFRTb2NrZXRDbGllbnQKLQotLSAoaWQpIGluaXRXaXRoSG9zdG5hbWU6IChOU1N0cmluZyAqKSBob3N0bmFtZQotICAgICAgICAgICAgICAgICAgIHBvcnQ6IChpbnQpIHBvcnQKLXsKLQlOU0lucHV0U3RyZWFtICogaW5wdXRTdHJlYW0gPSBOVUxMOwotCU5TT3V0cHV0U3RyZWFtICogb3V0cHV0U3RyZWFtID0gTlVMTDsKLQlDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7Ci0JQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7Ci0JQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoQ0ZTdHJpbmdSZWYpaG9zdG5hbWUsIHBvcnQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOwotCWlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7Ci0JCUNGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLQkJQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0JCQotCQlpbnB1dFN0cmVhbSA9IChOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKLQkJW2lucHV0U3RyZWFtIHJldGFpbl07Ci0JCVtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKLQkJW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbaW5wdXRTdHJlYW0gb3Blbl07Ci0JCQotCQlvdXRwdXRTdHJlYW0gPSAoTlNPdXRwdXRTdHJlYW0gKil3cml0ZVN0cmVhbTsKLQkJW291dHB1dFN0cmVhbSByZXRhaW5dOwotCQlbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotCQlbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbb3V0cHV0U3RyZWFtIG9wZW5dOwotCX0KLQkKLQlzZWxmID0gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06IGlucHV0U3RyZWFtIG91dHB1dFN0cmVhbTogb3V0cHV0U3RyZWFtXTsKLQkKLQlyZXR1cm4gc2VsZjsKLX0KLQotCi1AZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiOTFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUU29ja2V0VHJhbnNwb3J0IDogVE5TU3RyZWFtVHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoSG9zdG5hbWU6KE5TU3RyaW5nICopaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgIHBvcnQ6KGludClwb3J0OworCistKGlkKSBpbml0V2l0aFBhdGg6KE5TU3RyaW5nICopcGF0aDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNThhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbXBvcnQgIlRTb2NrZXRUcmFuc3BvcnQuaCIKKworI2lmICFUQVJHRVRfT1NfSVBIT05FCisjaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+CisjZWxzZQorI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCitAaW50ZXJmYWNlIFRTb2NrZXRUcmFuc3BvcnQgKCkgPE5TU3RyZWFtRGVsZWdhdGU+CitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRTb2NrZXRUcmFuc3BvcnQKKworLSAoaWQpIGluaXRXaXRoUmVhZFN0cmVhbTogKENGUmVhZFN0cmVhbVJlZikgcmVhZFN0cmVhbSB3cml0ZVN0cmVhbTogKENGV3JpdGVTdHJlYW1SZWYpIHdyaXRlU3RyZWFtCit7CisgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtID0gbmlsOworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtID0gbmlsOworCisgIGlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisKKyAgICBpbnB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKKyAgICBbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOk5TUnVuTG9vcC5jdXJyZW50UnVuTG9vcCBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbaW5wdXRTdHJlYW0gb3Blbl07CisKKyAgICBvdXRwdXRTdHJlYW0gPSAoX19icmlkZ2UgTlNPdXRwdXRTdHJlYW0gKil3cml0ZVN0cmVhbTsKKyAgICBbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOworICAgIFtvdXRwdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6TlNSdW5Mb29wLmN1cnJlbnRSdW5Mb29wIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtvdXRwdXRTdHJlYW0gb3Blbl07CisgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAocmVhZFN0cmVhbSkgeworICAgICAgQ0ZSZWxlYXNlKHJlYWRTdHJlYW0pOworICAgIH0KKworICAgIGlmICh3cml0ZVN0cmVhbSkgeworICAgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOmlucHV0U3RyZWFtIG91dHB1dFN0cmVhbTpvdXRwdXRTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCisgICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydAoreworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsIChfX2JyaWRnZSBDRlN0cmluZ1JlZilob3N0bmFtZSwgcG9ydCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7CisgIHJldHVybiBbc2VsZiBpbml0V2l0aFJlYWRTdHJlYW06cmVhZFN0cmVhbSB3cml0ZVN0cmVhbTp3cml0ZVN0cmVhbV07Cit9CisKKy0gKGlkKSBpbml0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCit7CisgIENGU29ja2V0TmF0aXZlSGFuZGxlIHNvY2tmZCA9IHNvY2tldChBRl9MT0NBTCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICBpbnQgeWVzID0gMTsKKyAgaWYgKHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZih5ZXMpKSA8IDApCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byBzZXQgUkVVU0VBRERSIHByb3BlcnR5IG9mIHNvY2tldC4iKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgTlNEYXRhICpzZXJ2ZXJBZGRyZXNzID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVBZGRyZXNzV2l0aFBhdGg6cGF0aF07CisKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzb2NrZmQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworICBpZiAoIXJlYWRTdHJlYW0gfHwgIXdyaXRlU3RyZWFtKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gY3JlYXRlIHJlYWQvd3JpdGUgc3RyZWFtIHBhaXIgZm9yIHNvY2tldC4iKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgaWYgKGNvbm5lY3Qoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyICopc2VydmVyQWRkcmVzcy5ieXRlcywgKHNvY2tsZW5fdCkgc2VydmVyQWRkcmVzcy5sZW5ndGgpIDwgMCkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogQ29ubmVjdCBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIHJldHVybiBbc2VsZiBpbml0V2l0aFJlYWRTdHJlYW06cmVhZFN0cmVhbSB3cml0ZVN0cmVhbTp3cml0ZVN0cmVhbV07Cit9CisKKysgKE5TRGF0YSAqKSBjcmVhdGVBZGRyZXNzV2l0aFBhdGg6IChOU1N0cmluZyAqKXBhdGgKK3sKKyAgc3RydWN0IHNvY2thZGRyX3VuIHNlcnZhZGRyOworCisgIHNpemVfdCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aCArIDE7CisgIGlmIChudWxsVGVybWluYXRlZFBhdGhMZW5ndGg+IHNpemVvZihzZXJ2YWRkci5zdW5fcGF0aCkpIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byBjcmVhdGUgc29ja2V0IGF0IHBhdGggJUAuIFBhdGggaXMgdG9vIGxvbmcuIiwgcGF0aCk7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGJ6ZXJvKCZzZXJ2YWRkcixzaXplb2Yoc2VydmFkZHIpKTsKKyAgc2VydmFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICBtZW1jcHkoc2VydmFkZHIuc3VuX3BhdGgsIHBhdGguVVRGOFN0cmluZywgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoKTsKKyAgc2VydmFkZHIuc3VuX2xlbiA9IFNVTl9MRU4oJnNlcnZhZGRyKTsKKworICByZXR1cm4gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZzZXJ2YWRkciBsZW5ndGg6c2l6ZW9mKHNlcnZhZGRyKV07Cit9CisKKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCmluZGV4IDYxZWJiZDIuLjU1OGNmNjAgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKQEAgLTE3LDIwICsxNywzMiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCiBAcHJvdG9jb2wgVFRyYW5zcG9ydCA8TlNPYmplY3Q+CiAKLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSByZWFkCi0gICAqCi0gICAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgaW50bwotICAgKiBAcGFyYW0gb2ZmIEluZGV4IGluIGJ1ZmZlciB0byBzdGFydCBzdG9yaW5nIGJ5dGVzIGF0Ci0gICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBsZW4KLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKLSAgICovCi0tIChpbnQpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChpbnQpIG9mZiBsZW5ndGg6IChpbnQpIGxlbjsKKy8qKgorICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIHJlYWQKKyAqCisgKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGludG8KKyAqIEBwYXJhbSBvZmYgSW5kZXggaW4gYnVmZmVyIHRvIHN0YXJ0IHN0b3JpbmcgYnl0ZXMgYXQKKyAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHJldHVybiBZRVMgaWYgc3VjY2VlZGVkLCBOTyBpZiBmYWlsZWQKKyAqIEB0aHJvd3MgVFRyYW5zcG9ydEVycm9yIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAqLworLShCT09MKSByZWFkQWxsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAodW5zaWduZWQgaW50KSBvZmZzZXQgbGVuZ3RoOiAodW5zaWduZWQgaW50KSBsZW5ndGg7CistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgZmx1c2g7CistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzlmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRG9tYWluOworCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUVHJhbnNwb3J0RXJyb3IpIHsKKyAgVFRyYW5zcG9ydEVycm9yVW5rbm93biAgICAgICAgPSAwLAorICBUVHJhbnNwb3J0RXJyb3JOb3RPcGVuICAgICAgICA9IDEsCisgIFRUcmFuc3BvcnRFcnJvckFscmVhZHlPcGVuICAgID0gMiwKKyAgVFRyYW5zcG9ydEVycm9yVGltZWRPdXQgICAgICAgPSAzLAorICBUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUgICAgICA9IDQsCit9OworCisKK2V4dGVybiBOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRXh0ZW5kZWRFcnJvcktleTsKK2V4dGVybiBOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OworCisKK3R5cGVkZWYgTlNfRU5VTShpbnQsIFRIdHRwVHJhbnNwb3J0RXJyb3IpIHsKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRSZXNwb25zZSAgPSAxMDAxLAorICBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFN0YXR1cyAgICA9IDEwMDIsCisgIFRIdHRwVHJhbnNwb3J0RXJyb3JBdXRoZW50aWNhdGlvbiAgID0gMTAwMywKK307CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubQpAQCAtMCwwICsxLDI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JEb21haW4gPSBAIlRUcmFuc3BvcnRFcnJvckRvbWFpbiI7CisKKworTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckV4dGVuZGVkRXJyb3JLZXkgPSBAImV4dGVuZGVkRXJyb3IiOworTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleSA9IEAiaHR0cEVycm9yIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0OWZlMi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGludGVyZmFjZSBUVHJhbnNwb3J0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci19Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjcxNDkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3IKLXsKLSAgTlNEaWN0aW9uYXJ5ICogdXNlckluZm8gPSBuaWw7Ci0gIGlmIChlcnJvciAhPSBuaWwpIHsKLSAgICB1c2VySW5mbyA9IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6IGVycm9yIGZvcktleTogQCJlcnJvciJdOwotICB9Ci0KLSAgcmV0dXJuIFtzdXBlciBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogdXNlckluZm9dOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoUmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIHJldHVybiBbc2VsZiBleGNlcHRpb25XaXRoUmVhc29uOiByZWFzb24gZXJyb3I6IG5pbF07Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvM3JkcGFydHkucHJvcHMgYi9saWIvY3BwLzNyZHBhcnR5LnByb3BzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGQ0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwLzNyZHBhcnR5LnByb3BzCkBAIC0wLDAgKzEsMjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIj4KKyAgICA8Qk9PU1RfUk9PVD4kKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzA8L0JPT1NUX1JPT1Q+CisgICAgPE9QRU5TU0xfUk9PVF9ESVI+JChUSElSRF9QQVJUWSlcb3BlbnNzbFxPcGVuU1NMLVdpbjMyPC9PUEVOU1NMX1JPT1RfRElSPgorICAgIDxMSUJFVkVOVF9ST09UPiQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50LTIuMC4yMS1zdGFibGU8L0xJQkVWRU5UX1JPT1Q+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgLz4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgLz4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJCT09TVF9ST09UIj4KKyAgICAgIDxWYWx1ZT4kKEJPT1NUX1JPT1QpPC9WYWx1ZT4KKyAgICAgIDxFbnZpcm9ubWVudFZhcmlhYmxlPnRydWU8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgPC9CdWlsZE1hY3JvPgorICAgIDxCdWlsZE1hY3JvIEluY2x1ZGU9Ik9QRU5TU0xfUk9PVF9ESVIiPgorICAgICAgPFZhbHVlPiQoT1BFTlNTTF9ST09UX0RJUik8L1ZhbHVlPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGU+dHJ1ZTwvRW52aXJvbm1lbnRWYXJpYWJsZT4KKyAgICA8L0J1aWxkTWFjcm8+CisgICAgPEJ1aWxkTWFjcm8gSW5jbHVkZT0iTElCRVZFTlRfUk9PVCI+CisgICAgICA8VmFsdWU+JChMSUJFVkVOVF9ST09UKTwvVmFsdWU+CisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZT50cnVlPC9FbnZpcm9ubWVudFZhcmlhYmxlPgorICAgIDwvQnVpbGRNYWNybz4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWVhODJjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoc3JjKQorCisjIFNZU0xJQlMgY29udGFpbnMgbGlicmFyaWVzIHRoYXQgbmVlZCB0byBiZSBsaW5rZWQgdG8gYWxsIGxpYiB0YXJnZXRzCitzZXQoU1lTTElCUyAiIikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgbGlicmFyeQorc2V0KCB0aHJpZnRjcHBfU09VUkNFUworICAgc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCisgICBzcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKKyAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAorICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcAorICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcAorICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAorKQorCisjIFRoZXNlIGZpbGVzIGRvbid0IHdvcmsgb24gV2luZG93cyBDRSBhcyB0aGVyZSBpcyBubyBwaXBlIHN1cHBvcnQKKyMgVE9ETzogVGhlc2UgZmlsZXMgd29uJ3Qgd29yayB3aXRoIFVOSUNPREUgc3VwcG9ydCBvbiB3aW5kb3dzLiBJZiBmaXhlZCB0aGlzIGNhbiBiZSByZS1hZGRlZC4KK2lmIChOT1QgV0lOQ0UpCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKKyAgICApCitlbmRpZigpCisKKworaWYgKFdJTjMyKQorICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKKyAgICAgICAgc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKKyAgICApCisgICAgaWYoTk9UIFdJTkNFKQorICAgICAgICAjIFRoaXMgZmlsZSB1c2VzIHBpcGVzIHNvIGl0IGN1cnJlbnRseSB3b24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAKKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2Vsc2UoKQorICAgICMgVGhlc2UgZmlsZXMgZXZhbHVhdGUgdG8gbm90aGluZyBvbiBXaW5kb3dzLCBzbyBvbWl0IHRoZW0gZnJvbSB0aGUKKyAgICAjIFdpbmRvd3MgYnVpbGQKKyAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCisgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCisgICAgKQorZW5kaWYoKQorCisjIElmIE9wZW5TU0wgaXMgbm90IGZvdW5kIGp1c3QgaWdub3JlIHRoZSBPcGVuU1NMIHN0dWZmCitmaW5kX3BhY2thZ2UoT3BlblNTTCkKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICBsaXN0KCBBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCisgICAgKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKKyAgICBsaXN0KEFQUEVORCBTWVNMSUJTICIke09QRU5TU0xfTElCUkFSSUVTfSIpCitlbmRpZigpCisKKyMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQoraWYoVU5JWCBBTkQgTk9UIFdJVEhfU1REVEhSRUFEUykKKyAgICBpZihBTkRST0lEKQorICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXB0aHJlYWQiKQorICAgIGVsc2UoKQorICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCisgICAgZW5kaWYoKQorICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorICAgICkKK2Vsc2UoKQorICAgIGlmKFVOSVgpCisgICAgICAgIGlmKEFORFJPSUQpCisgICAgICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXB0aHJlYWQiKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgcHRocmVhZCkKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwCisgICAgKQorZW5kaWYoKQorCisjIFRocmlmdCBub24gYmxvY2tpbmcgc2VydmVyCitzZXQoIHRocmlmdGNwcG5iX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCisgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKKykKKworIyBUaHJpZnQgemxpYiBzZXJ2ZXIKK3NldCggdGhyaWZ0Y3Bwel9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKyAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcAorKQorCisjIFRocmlmdCBRdDQgc2VydmVyCitzZXQoIHRocmlmdGNwcHF0X1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKKykKKworIyBDb250YWlucyB0aGUgdGhyaWZ0IHNwZWNpZmljIEFERF9MSUJSQVJZX1RIUklGVCBhbmQgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVAoraW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK0FERF9MSUJSQVJZX1RIUklGVCh0aHJpZnQgJHt0aHJpZnRjcHBfU09VUkNFU30gJHt0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTfSkKK2lmKFdJTjMyKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30gd3MyXzMyKQorZWxzZSgpCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnQgJHtTWVNMSUJTfSkKK2VuZGlmKCkKKworaWYoV0lUSF9MSUJFVkVOVCkKKyAgICBmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmb3JtIHVwc3RyZWFtCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdG5iICR7dGhyaWZ0Y3BwbmJfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRuYiAke1NZU0xJQlN9ICR7TElCRVZFTlRfTElCUkFSSUVTfSkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0bmIgdGhyaWZ0KQorZW5kaWYoKQorCitpZihXSVRIX1pMSUIpCisgICAgZmluZF9wYWNrYWdlKFpMSUIgUkVRVUlSRUQpCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtaTElCX0lOQ0xVREVfRElSU30pCisKKyAgICBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0eiAke3RocmlmdGNwcHpfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnR6ICR7U1lTTElCU30gJHtaTElCX0xJQlJBUklFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdHogdGhyaWZ0KQorZW5kaWYoKQorCitpZihXSVRIX1FUNCkKKyAgICBzZXQoQ01BS0VfQVVUT01PQyBPTikKKyAgICBmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEIENPTVBPTkVOVFMgUXRDb3JlIFF0TmV0d29yaykKKyAgICBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0cXQgJHt0aHJpZnRjcHBxdF9TT1VSQ0VTfSkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdHF0ICR7U1lTTElCU30gUXQ0OjpRdENvcmUgUXQ0OjpRdE5ldHdvcmspCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdHF0IHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDUpCisgICAgIyBRdDUgaGFzIGl0cyBvd24gZGlyZWN0b3J5IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggUXQ0IGNhdXNlZCBieSBDTUFLRV9BVVRPTU9DCisgICAgYWRkX3N1YmRpcmVjdG9yeShzcmMvdGhyaWZ0L3F0KQorZW5kaWYoKQorCitpZihNU1ZDKQorICAgIGFkZF9kZWZpbml0aW9ucygiLURVTklDT0RFIC1EX1VOSUNPREUiKQorZW5kaWYoKQorCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0xJTUlUX01BQ1JPUyIpCisKKyMgSW5zdGFsbCB0aGUgaGVhZGVycworaW5zdGFsbChESVJFQ1RPUlkgInNyYy90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIgUEFUVEVSTiAiKi50Y2MiKQorIyBDb3B5IGNvbmZpZy5oIGZpbGUKK2luc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0JJTkFSWV9ESVJ9L3RocmlmdCIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iCisgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIikKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvY3BwL01ha2VmaWxlLmFtIGIvbGliL2NwcC9NYWtlZmlsZS5hbQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDQwMmEyOTQuLjg1YmI5YWIKLS0tIGEvbGliL2NwcC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3BwL01ha2VmaWxlLmFtCkBAIC0xNywxMiArMTcsMzAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVNVQkRJUlMgPSAuIHRlc3QKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCittb2NfJS5jcHA6ICUuaAorCSQoUVRfTU9DKSAkKFFUX0NGTEFHUykgJDwgLW8gJEAKKworbW9jX18lLmNwcDogJS5oCisJJChRVDVfTU9DKSAkKFFUNV9DRkxBR1MpICQ8IC1vICRACisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKKyMgVGhpcyBmaWxlIGlzIG5lZWRlZCBieSBjb21waWxlciB3aXRoIHBsdWdpbiwgd2hpbGUgdGVzdC9NYWtlZmlsZS5hbSBuZWVkcyBjb21waWxlcgorIyBTbyB0ZXN0IGRpcmVjdG9yeSBpcyBkaXJlY3RseSBwaWNrZWQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLmFtIGZvciBwbHVnaW4gYnVpbGQKK2lmICFXSVRIX1BMVUdJTgorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorZW5kaWYKIAogcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwogCiBsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnQubGEKIHBrZ2NvbmZpZ19EQVRBID0gdGhyaWZ0LnBjCitsaWJ0aHJpZnRfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikKK2xpYnRocmlmdF9sYV9MSUJBREQgPSAkKEJPT1NUX0xERkxBR1MpICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykKIAogIyMgV2Ugb25seSBidWlsZCB0aGUgZXh0cmEgbGlicmFyaWVzIGlmIHdlIGhhdmUgdGhlIGRlcGVuZGVuY2llcywKICMjIGJ1dCB3ZSBpbnN0YWxsIGFsbCBvZiB0aGUgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHkuCkBAIC0zNCwxNDYgKzUyLDIzMSBAQAogbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHoubGEKIHBrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC16LnBjCiBlbmRpZgoraWYgQU1YX0hBVkVfUVQKK2xpYl9MVExJQlJBUklFUyArPSBsaWJ0aHJpZnRxdC5sYQorcGtnY29uZmlnX0RBVEEgKz0gdGhyaWZ0LXF0LnBjCitlbmRpZgoraWYgQU1YX0hBVkVfUVQ1CitsaWJfTFRMSUJSQVJJRVMgKz0gbGlidGhyaWZ0cXQ1LmxhCitwa2djb25maWdfREFUQSArPSB0aHJpZnQtcXQ1LnBjCitlbmRpZgogCi1BTV9DWFhGTEFHUyA9IC1XYWxsCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJChzcmNkaXIpL3NyYworQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIC1JJChzcmNkaXIpL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKLWxpYnRocmlmdF9sYV9TT1VSQ0VTID0gc3JjL1RocmlmdC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcCBcCi0JCQkJCQkJCQkJCSBzcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCitsaWJ0aHJpZnRfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVE91dHB1dC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCiAKLWxpYnRocmlmdG5iX2xhX1NPVVJDRVMgPSBzcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKK2xpYnRocmlmdF9sYV9TT1VSQ0VTICs9IHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCiAKLWxpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCitsaWJ0aHJpZnRuYl9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKIAorbGlidGhyaWZ0el9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorCisKK2xpYnRocmlmdHF0X2xhX01PQyA9IHNyYy90aHJpZnQvcXQvbW9jX1RRVGNwU2VydmVyLmNwcAorbm9kaXN0X2xpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSAkKGxpYnRocmlmdHF0X2xhX01PQykKK2xpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAorQ0xFQU5GSUxFUyA9ICQobGlidGhyaWZ0cXRfbGFfTU9DKQorCitsaWJ0aHJpZnRxdDVfbGFfTU9DID0gc3JjL3RocmlmdC9xdC9tb2NfX1RRVGNwU2VydmVyLmNwcAorbm9kaXN0X2xpYnRocmlmdHF0NV9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQorbGlidGhyaWZ0cXQ1X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKK0NMRUFORklMRVMgKz0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQogCiAjIEZsYWdzIGZvciB0aGUgdmFyaW91cyBsaWJyYXJpZXMKIGxpYnRocmlmdG5iX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1BQRkxBR1MgID0gJChBTV9DUFBGTEFHUykgJChaTElCX0NQUEZMQUdTKQorbGlidGhyaWZ0cXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFFUX0NGTEFHUykKK2xpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUVQ1X0NGTEFHUykKK2lmIFFUNV9SRURVQ0VfUkVMT0NBVElPTlMKK2xpYnRocmlmdHF0NV9sYV9DUFBGTEFHUyArPSAtZlBJQworZW5kaWYKIGxpYnRocmlmdG5iX2xhX0NYWEZMQUdTID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdHF0X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCitsaWJ0aHJpZnRxdDVfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdG5iX2xhX0xERkxBR1MgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpCitsaWJ0aHJpZnR6X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFpMSUJfTElCUykKK2xpYnRocmlmdHF0X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFFUX0xJQlMpCitsaWJ0aHJpZnRxdDVfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVQ1X0xJQlMpCiAKIGluY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQKIGluY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvVGhyaWZ0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UUmVmbGVjdGlvbkxvY2FsLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RMb2dnaW5nLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UaHJpZnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RMb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFRvU3RyaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEJhc2UuaAogCiBpbmNsdWRlX2NvbmN1cnJlbmN5ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvY29uY3VycmVuY3kKIGluY2x1ZGVfY29uY3VycmVuY3lfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9NdXRleC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvTW9uaXRvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaHJlYWQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1V0aWwuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCiBpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UUHJvdG9jb2wuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaAogCiBpbmNsdWRlX3RyYW5zcG9ydGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3RyYW5zcG9ydAogaW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTb2NrZXQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCiAKIGluY2x1ZGVfc2VydmVyZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvc2VydmVyCiBpbmNsdWRlX3NlcnZlcl9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKIAogaW5jbHVkZV9wcm9jZXNzb3JkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm9jZXNzb3IKIGluY2x1ZGVfcHJvY2Vzc29yX0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKIAogaW5jbHVkZV9hc3luY2RpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL2FzeW5jCiBpbmNsdWRlX2FzeW5jX0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgIHNyYy9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggXAotICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmggXAotICAgICAgICAgICAgICAgICAgICAgc3JjL2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvYXN5bmMvU2ltcGxlQ2FsbGJhY2suaAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCiAKK2luY2x1ZGVfcXRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9xdAoraW5jbHVkZV9xdF9IRUFERVJTID0gXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCiAKLW5vaW5zdF9QUk9HUkFNUyA9IGNvbmN1cnJlbmN5X3Rlc3QKLQotY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTID0gc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZEZhY3RvcnlUZXN0cy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZE1hbmFnZXJUZXN0cy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmgKLQotY29uY3VycmVuY3lfdGVzdF9MREFERCA9IGxpYnRocmlmdC5sYQorV0lORE9XU19ESVNUID0gXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvd2luZG93cyBcCisgICAgICAgICAgICAgdGhyaWZ0LnNsbiBcCisgICAgICAgICAgICAgbGlidGhyaWZ0LnZjeHByb2ogXAorICAgICAgICAgICAgIGxpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMgXAorICAgICAgICAgICAgIGxpYnRocmlmdG5iLnZjeHByb2ogXAorICAgICAgICAgICAgIGxpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycyBcCisgICAgICAgICAgICAgM3JkcGFydHkucHJvcHMKIAogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICBSRUFETUUgXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKyAgICAgICAgICAgICBSRUFETUUubWQgXAogICAgICAgICAgICAgIHRocmlmdC1uYi5wYy5pbiBcCiAgICAgICAgICAgICAgdGhyaWZ0LnBjLmluIFwKLSAgICAgICAgICAgICB0aHJpZnQtei5wYy5pbgorICAgICAgICAgICAgIHRocmlmdC16LnBjLmluIFwKKyAgICAgICAgICAgICB0aHJpZnQtcXQucGMuaW4gXAorICAgICAgICAgICAgIHRocmlmdC1xdDUucGMuaW4gXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgICQoV0lORE9XU19ESVNUKQorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvUkVBRE1FIGIvbGliL2NwcC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmQwMTcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1UaHJpZnQgQysrIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggQysrCi09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIFRocmlmdCBDKysgbGlicmFyaWVzIGFyZSBidWlsdCB1c2luZyB0aGUgR05VIHRvb2xzLiBGb2xsb3cgdGhlIGluc3RydWN0aW9ucwotaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUsIG9yIHJ1biBib290c3RyYXAuc2ggaW4gdGhpcyBmb2xkZXIgdG8gZ2VuZXJhdGUgdGhlCi1NYWtlZmlsZXMuCi0KLUluIGNhc2UgeW91IGRvIG5vdCB3YW50IHRvIG9wZW4gYW5vdGhlciBSRUFETUUgZmlsZSwgZG8gdGhpczoKLSAgLi9ib290c3RyYXAuc2gKLSAgLi9jb25maWd1cmUgKC0td2l0aC1ib29zdD0vdXNyL2xvY2FsKQotICBtYWtlCi0gIHN1ZG8gbWFrZSBpbnN0YWxsCi0KLVRocmlmdCBpcyBkaXZpZGVkIGludG8gdHdvIGxpYnJhcmllcy4KLQotbGlidGhyaWZ0Ci0gIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKLSAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgotCi1saWJ0aHJpZnRuYgotICBUaGlzIGxpYnJhcnkgY29udGFpbnMgdGhlIFRocmlmdCBub25ibG9ja2luZyBzZXJ2ZXIsIHdoaWNoIHVzZXMgbGliZXZlbnQuCi0gIFRvIGxpbmsgdGhpcyBsaWJyYXJ5IHlvdSB3aWxsIGFsc28gbmVlZCB0byBsaW5rIGxpYmV2ZW50LgotCi1MaW5raW5nIEFnYWluc3QgVGhyaWZ0Ci09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFmdGVyIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBUaHJpZnQgdGhlIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHRvCi0vdXNyL2xvY2FsL2xpYiBieSBkZWZhdWx0LiBNYWtlIHN1cmUgdGhpcyBpcyBpbiB5b3VyIExEUEFUSC4KLQotT24gTGludXgsIHRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0IC91c3IvbG9jYWwvbGliIGlzIGluCi15b3VyIC9ldGMvbGQuc28uY29uZiBhbmQgdGhlbiBydW4gL3NiaW4vbGRjb25maWcuCi0KLURlcGVuZGluZyB1cG9uIHdoZXRoZXIgeW91IGFyZSBsaW5raW5nIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHkgYW5kIGhvdwoteW91ciBidWlsZCBlbnZpcm9ubWVudCBpdCBzZXQgdXAsIHlvdSBtYXkgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwKLWxpYnJhcmllcyB3aGVuIGxpbmtpbmcgYWdhaW5zdCB0aHJpZnQsIHN1Y2ggYXMgbGlicnQgYW5kL29yIGxpYnB0aHJlYWQuIElmCi15b3UgYXJlIHVzaW5nIGxpYnRocmlmdG5iIHlvdSB3aWxsIGFsc28gbmVlZCBsaWJldmVudC4KLQotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KLQotYm9vc3Qgc2hhcmVkIHBvaW50ZXJzCi1odHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3NtYXJ0X3B0ci9zbWFydF9wdHIuaHRtCi0KLWxpYmV2ZW50IChmb3IgbGlidGhyaWZ0bmIgb25seSkKLWh0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQvCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRS5tZCBiL2xpYi9jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3NDRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDI5NiBAQAorVGhyaWZ0IEMrKyBTb2Z0d2FyZSBMaWJyYXJ5CisKKyMgTGljZW5zZQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBDKysKKworVGhlIFRocmlmdCBDKysgbGlicmFyaWVzIGFyZSBidWlsdCB1c2luZyB0aGUgR05VIHRvb2xzLiBGb2xsb3cgdGhlIGluc3RydWN0aW9ucworaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUubWQKKworSW4gY2FzZSB5b3UgZG8gbm90IHdhbnQgdG8gb3BlbiBhbm90aGVyIFJFQURNRS5tZCBmaWxlLCBkbyB0aGlzIHRocmlmdCBzcmM6CisKKyAgICAuL2Jvb3RzdHJhcC5zaAorICAgIC4vY29uZmlndXJlICgtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbCkKKyAgICBtYWtlCisgICAgc3VkbyBtYWtlIGluc3RhbGwKKworVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgorCisqIGxpYnRocmlmdCAtIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKKyAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgorCisqIGxpYnRocmlmdG5iIC0gVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgorICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KKworIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAorCitBZnRlciB5b3UgYnVpbGQgYW5kIGluc3RhbGwgVGhyaWZ0IHRoZSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB0bworL3Vzci9sb2NhbC9saWIgYnkgZGVmYXVsdC4gTWFrZSBzdXJlIHRoaXMgaXMgaW4geW91ciBMRFBBVEguCisKK09uIExpbnV4LCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBlbnN1cmUgdGhhdCAvdXNyL2xvY2FsL2xpYiBpcyBpbgoreW91ciAvZXRjL2xkLnNvLmNvbmYgYW5kIHRoZW4gcnVuIC9zYmluL2xkY29uZmlnLgorCitEZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHlvdSBhcmUgbGlua2luZyBkeW5hbWljYWxseSBvciBzdGF0aWNhbGx5IGFuZCBob3cKK3lvdXIgYnVpbGQgZW52aXJvbm1lbnQgaXQgc2V0IHVwLCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsCitsaWJyYXJpZXMgd2hlbiBsaW5raW5nIGFnYWluc3QgdGhyaWZ0LCBzdWNoIGFzIGxpYnJ0IGFuZC9vciBsaWJwdGhyZWFkLiBJZgoreW91IGFyZSB1c2luZyBsaWJ0aHJpZnRuYiB5b3Ugd2lsbCBhbHNvIG5lZWQgbGliZXZlbnQuCisKKyMjIERlcGVuZGVuY2llcworCitJZiB5b3VyIEMrKyBlbnZpcm9ubWVudCBpbXBsZW1lbnRzIEMrKzExIG9yIGxhdGVyLCB0aHJpZnQgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZQorc3RkOjpzaGFyZWRfcHRyLiAgT3RoZXJ3aXNlIHlvdSB3aWxsIG5lZWQgdGhlIGJvb3N0IGxpYnJhcnkgdG8gcHJvdmlkZSBhIHNoYXJlZF9wdHIKK2ltcGxlbWVudGF0aW9uIGZvciBDKysgZW52aXJvbm1lbnRzIHByZS1DKysxMS4gIElmIHlvdSBhcmUgbGlua2luZyBhZ2FpbnN0IGNvZGUKK3RoYXQgZXhwZWN0cyB0byBiZSB1c2luZyBib29zdDo6c2hhcmVkX3B0ciwgeW91IGNhbiBkZWZpbmUgdGhlIHByZXByb2Nlc3NvcgordmFyaWFibGUgRk9SQ0VfQk9PU1RfU01BUlRfUFRSIGZvciB5b3VyIGJ1aWxkIG9mIHRocmlmdCB0byBtYWtlIGl0IHVzZSBib29zdCBpbnN0ZWFkCitvZiBzdGQgZm9yIGEgbnVtYmVyIG9mIG1lbW9yeSByZWxhdGVkIGNsYXNzZXMuICBTZWUgdGhyaWZ0L3N0ZGN4eC5oIGZvciBtb3JlLgorCitsaWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCitodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LworCisjIFVzaW5nIFRocmlmdCB3aXRoIEMrKyBvbiBXaW5kb3dzCisKK0JvdGggdGhlIGF1dG9jb25mIGFuZCBjbWFrZSBidWlsZCBzeXN0ZW1zIGFyZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IG1hbnkKK3N5c3RlbSBjb25maWd1cmF0aW9ucyB3aXRob3V0IHRoZSBuZWVkIHRvIHNwZWNpZnkgbGlicmFyeSBsb2NhdGlvbnMsIGhvd2V2ZXIgaWYKK3lvdSBydW4gaW50byBwcm9ibGVtcyBvciB3YW50IHRvIHJlZGlyZWN0IHRocmlmdCB0byBidWlsZCBhbmQgbGluayBhZ2FpbnN0IHlvdXIKK293biBwcm92aWRlZCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXM6CisKK0JPT1NUX1JPT1QgOiBGb3IgYm9vc3QsIGUuZy4gRDpcYm9vc3RfMV81NV8wCitPUEVOU1NMX1JPT1RfRElSIDogRm9yIE9wZW5TU0wsIGUuZy4gRDpcT3BlblNTTC1XaW4zMgorCitvbmx5IHJlcXVpcmVkIGJ5IGxpYnRocmlmdG5iOgorCitMSUJFVkVOVF9ST09UX0RJUiA6IEZvciBMaWJldmVudCBlLmcuIEQ6XGxpYmV2ZW50LTIuMC4yMS1zdGFibGUKKworU2VlIC8zcmRwYXJ0eS51c2VyIGZvciBtb3JlIGRldGFpbHMuCisKK1RoZSBzYW1lIGxpbmtpbmcgZ3VpZGVsaW5lcyBkZXNjcmliZWQgYWJvdmUgZm9yIGxpYnRocmlmdG5iIGFwcGx5IHRvIHdpbmRvd3MgYXMgd2VsbC4KKworIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAorCitZb3UgbmVlZCB0byBsaW5rIHlvdXIgcHJvamVjdCB0aGF0IHVzZXMgdGhyaWZ0IGFnYWluc3QgYWxsIHRoZSB0aHJpZnQKK2RlcGVuZGVuY2llczsgaW4gdGhlIGNhc2Ugb2YgbGlidGhyaWZ0LCBib29zdCBhbmQgZm9yCitsaWJ0aHJpZnRuYiwgbGliZXZlbnQuCisKK0luIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgeW91IG11c3QgYWxzbyBzZXQgSEFWRV9DT05GSUdfSCBhcyBmb3JjZSBpbmNsdWRlCit0aGUgY29uZmlnIGhlYWRlcjogIndpbmRvd3MvY29uZmcuaCIKKworIyMgRGVwZW5kZW5jaWVzCisKK1RoZSBzYW1lIGRlcGVuZGVuY2llcyBmb3Igc2hhcmVkX3B0ciBhcyBkZXNjcmliZWQgYWJvdmUgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgorCitib29zdCB0aHJlYWQKK2h0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvZG9jL2h0bWwvdGhyZWFkLmh0bWwKKworbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQoraHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KKworIyMgTm90ZXMgb24gYm9vc3QgdGhyZWFkIChzdGF0aWMgdnMgc2hhcmVkKToKKworQnkgZGVmYXVsdCBsaWIvY3BwL3dpbmRvd3MvZm9yY2VfaW5jLmggZGVmaW5lczoKKworICAgICNkZWZpbmUgQk9PU1RfQUxMX05PX0xJQiAxCisgICAgI2RlZmluZSBCT09TVF9USFJFQURfTk9fTElCIDEKKworVGhpcyBoYXMgZm9yIGVmZmVjdCB0byBoYXZlIHRoZSBob3N0IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCBUaHJpZnQKK3RvIGhhdmUgdG8gbGluayB3aXRoIGJvb3N0IHRocmVhZCBhcyBhIHN0YXRpYyBsaWJyYXJ5LgorCitJZiB5b3Ugd2FudGVkIGluc3RlYWQgdG8gbGluayB3aXRoIGJvb3N0IHRocmVhZCBhcyBhIHNoYXJlZCBsaWJyYXJ5LAoreW91J2xsIG5lZWQgdG8gdW5jb21tZW50IHRob3NlIHR3byBsaW5lcywgYW5kIHJlY29tcGlsZS4KKworIyMgV2luZG93cyB2ZXJzaW9uIGNvbXBhdGliaWxpdHkKKworVGhlIFRocmlmdCBsaWJyYXJ5IHRhcmdldHMgV2luZG93cyBYUCBmb3IgYnJvYWRlc3QgY29tcGF0YmlsaXR5LiBBIG5vdGFibGUKK2RpZmZlcmVuY2UgaXMgaW4gdGhlIFdpbmRvd3Mtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvY2tldCBwb2xsCitmdW5jdGlvbi4gVG8gdGFyZ2V0IFZpc3RhLCBXaW43IG9yIG90aGVyIHZlcnNpb25zLCBjb21tZW50IG91dCB0aGUgbGluZQorCisgICAgI2RlZmluZSBUQVJHRVRfV0lOX1hQLgorCisjIyBOYW1lZCBQaXBlcworCitOYW1lZCBQaXBlIHRyYW5zcG9ydCBoYXMgYmVlbiBhZGRlZCBpbiB0aGUgVFBpcGUgYW5kIFRQaXBlU2VydmVyIGNsYXNzZXMuIFRoaXMKK2lzIGN1cnJlbnRseSBXaW5kb3dzLW9ubHkuIE5hbWVkIHBpcGUgdHJhbnNwb3J0IGZvciAqTklYIGhhcyBub3QgYmVlbgoraW1wbGVtZW50ZWQuIERvbWFpbiBzb2NrZXRzIGFyZSBhIGJldHRlciBjaG9pY2UgZm9yIGxvY2FsIElQQyB1bmRlciBub24tV2luZG93cworT1Mncy4gKk5JWCBuYW1lZCBwaXBlcyBvbmx5IHN1cHBvcnQgMToxIGNsaWVudC1zZXJ2ZXIgY29ubmVjdGlvbi4KKworIyBUaHJpZnQvU1NMCisKKyMjIFNjb3BlCisKK1RoaXMgU1NMIG9ubHkgc3VwcG9ydHMgYmxvY2tpbmcgbW9kZSBzb2NrZXQgSS9PLiBJdCBjYW4gb25seSBiZSB1c2VkIHdpdGgKK1RTaW1wbGVTZXJ2ZXIsIFRUaHJlYWRlZFNlcnZlciwgYW5kIFRUaHJlYWRQb29sU2VydmVyLgorCisjIyBJbXBsZW1lbnRhdGlvbgorCitUaGVyZSdyZSB0d28gbWFpbiBjbGFzc2VzIFRTU0xTb2NrZXRGYWN0b3J5IGFuZCBUU1NMU29ja2V0LiBJbnN0YW5jZXMgb2YKK1RTU0xTb2NrZXQgYXJlIGFsd2F5cyBjcmVhdGVkIGZyb20gVFNTTFNvY2tldEZhY3RvcnkuCisKK1Bvc2l4U1NMVGhyZWFkRmFjdG9yeSBjcmVhdGVzIFBvc2l4U1NMVGhyZWFkLiBUaGUgb25seSBkaWZmZXJlbmNlIGZyb20gdGhlCitQdGhyZWFkVGhyZWFkIHR5cGUgaXMgdGhhdCBpdCBjbGVhbnVwcyBPcGVuU1NMIGVycm9yIHF1ZXVlIHVwb24gZXhpdGluZwordGhlIHRocmVhZC4gSWRlYWxseSwgT3BlblNTTCBBUElzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIFBvc2l4U1NMVGhyZWFkLgorCisjIyBIb3cgdG8gdXNlIFNTTCBBUElzCisKK1RoaXMgaXMgZm9yIGRlbW8uIEluIHJlYWwgY29kZSwgdHlwaWNhbGx5IG9ubHkgb25lIFRTU0xTb2NrZXRGYWN0b3J5CitpbnN0YW5jZSBpcyBuZWVkZWQuCisKKyAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBnZXRTU0xTb2NrZXRGYWN0b3J5KCkgeworICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeShuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgICAvLyBjbGllbnQ6IGxvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMKKyAgICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCJteS10cnVzdGVkLWNhLWNlcnRpZmljYXRlcy5wZW0iKTsKKyAgICAgIC8vIGNsaWVudDogb3B0aW9uYWxseSBzZXQgeW91ciBvd24gYWNjZXNzIG1hbmFnZXIsIG90aGVyd2lzZSwKKyAgICAgIC8vICAgICAgICAgdGhlIGRlZmF1bHQgY2xpZW50IGFjY2VzcyBtYW5hZ2VyIHdpbGwgYmUgbG9hZGVkLgorCisgICAgICBmYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoIm15LWNlcnRpZmljYXRlLXNpZ25lZC1ieS1jYS5wZW0iKTsKKyAgICAgIGZhY3RvcnktPmxvYWRQcml2YXRlS2V5KCJteS1wcml2YXRlLWtleS5wZW0iKTsKKyAgICAgIC8vIHNlcnZlcjogb3B0aW9uYWxseSBzZXR1cCBhY2Nlc3MgbWFuYWdlcgorICAgICAgLy8gc2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NNYW5hZ2VyKG5ldyBNeUFjY2Vzc01hbmFnZXIpOworICAgICAgLy8gZmFjdG9yeS0+YWNjZXNzKGFjY2Vzc01hbmFnZXIpOworICAgICAgLi4uCisgICAgfQorCisKK2NsaWVudCBjb2RlIHNhbXBsZQorCisgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSA9IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKKyAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCA9IGZhY3RvcnkuY3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOworICAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAuLi4KKworCitzZXJ2ZXIgY29kZSBzYW1wbGUKKworICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkgPSBnZXRTU0xTb2NrZXRGYWN0b3J5KCk7CisgICAgc2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgZmFjdG9yeSkpOworICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpKTsKKyAgICAuLi4KKworIyMgQWNjZXNzTWFuYWdlcgorCitBY2Nlc3NNYW5hZ2VyIGRlZmluZXMgYSBjYWxsYmFjayBpbnRlcmZhY2UuIEl0IGhhcyB0aHJlZSBjYWxsYmFjayBtZXRob2RzOgorCisoYSkgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKTsKKworKGIpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdHJpbmcmIGhvc3QsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBzaXplKTsKKworKGMpIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpOworCitBZnRlciBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcywgYWRkaXRpb25hbCBjaGVja3MgYXJlIGNvbmR1Y3RlZC4gQXBwbGljYXRpb24KK2lzIGdpdmVuIHRoZSBjaGFuY2UgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGNvbnRpbnVlIHRoZSBjb252ZXJzYXRpb24KK3dpdGggdGhlIHJlbW90ZS4gQXBwbGljYXRpb24gaXMgcXVlcmllZCB0aHJvdWdoIHRoZSBhYm92ZSB0aHJlZSAidmVyaWZ5IgorbWV0aG9kLiBUaGV5IGFyZSBjYWxsZWQgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCisKK0RlY2lzaW9ucyBjYW4gYmUgb25lIG9mIEFMTE9XLCBERU5ZLCBhbmQgU0tJUC4gQUxMT1cgYW5kIERFTlkgbWVhbnMgdGhlCitjb252ZXJzYXRpb24gc2hvdWxkIGJlIGNvbnRpbnVlZCBvciBkaXNjb25uZWN0ZWQsIHJlc3BlY3RpdmVseS4gQUxMT1cgYW5kCitERU5ZIGRlY2lzaW9uIHN0b3BzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gU0tJUCBtZWFucyB0aGVyZSdzIG5vIGRlY2lzaW9uCitiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5wdXQsIGNvbnRpbnVlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KKworRmlyc3QsIChhKSBpcyBjYWxsZWQgd2l0aCB0aGUgcmVtb3RlIElQLiBJdCBpcyBjYWxsZWQgb25jZSBhdCB0aGUgYmVnaW5uaW5nLgorInNhIiBpcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHBlZXIuCisKK1RoZW4sIHRoZSBjZXJ0aWZpY2F0ZSBvZiByZW1vdGUgcGVlciBpcyBsb2FkZWQuIFN1YmplY3RBbHROYW1lIGV4dGVuc2lvbnMKK2FyZSBleHRyYWN0ZWQgYW5kIHNlbnQgdG8gYXBwbGljYXRpb24gZm9yIHZlcmlmaWNhdGlvbi4gV2hlbiBhIEROUworc3ViamVjdEFsdE5hbWUgZmllbGQgaXMgZXh0cmFjdGVkLCAoYikgaXMgY2FsbGVkLiBXaGVuIGFuIElQIHN1YmplY3RBbHROYW1lCitmaWVsZCBpcyBleHRyYWN0ZWQsIChjKSBpcyBjYWxsZWQuCisKK1RoZSAiaG9zdCIgaW4gKGIpIGlzIHRoZSB2YWx1ZSBmcm9tIFRTb2NrZXQ6OmdldEhvc3QoKSBpZiB0aGlzIGlzIGEgY2xpZW50CitzaWRlIHNvY2tldCwgb3IgVFNvY2tldDo6Z2V0UGVlckhvc3QoKSBpZiB0aGlzIGlzIGEgc2VydmVyIHNpZGUgc29ja2V0LiBUaGUKK3JlYXNvbiBpcyBjbGllbnQgc2lkZSBzb2NrZXQgaW5pdGlhdGVzIHRoZSBjb25uZWN0aW9uLiBUU29ja2V0OjpnZXRIb3N0KCkKK2lzIHRoZSByZW1vdGUgaG9zdCBuYW1lLiBPbiBzZXJ2ZXIgc2lkZSwgdGhlIHJlbW90ZSBob3N0IG5hbWUgaXMgdW5rbm93bgordW5sZXNzIGl0J3MgcmV0cmlldmVkIHRocm91Z2ggVFNvY2tldDo6Z2V0UGVlckhvc3QoKS4gRWl0aGVyIHdheSwgImhvc3QiCitzaG91bGQgYmUgdGhlIHJlbW90ZSBob3N0IG5hbWUuIEtlZXAgaW4gbWluZCwgaWYgVFNvY2tldDo6Z2V0UGVlckhvc3QoKQorZmFpbGVkLCBpdCB3b3VsZCByZXR1cm4gdGhlIHJlbW90ZSBob3N0IG5hbWUgaW4gbnVtZXJpYyBmb3JtYXQuCisKK0lmIGFsbCBzdWJqZWN0QWx0TmFtZSBleHRlbnNpb25zIHdlcmUgInNraXBwZWQiLCB0aGUgY29tbW9uIG5hbWUgZmllbGQgd291bGQKK2JlIGNoZWNrZWQuIEl0IGlzIHNlbnQgdG8gYXBwbGljYXRpb24gdGhyb3VnaCAoYyksIHdoZXJlICJzYSIgaXMgdGhlIHJlbW90ZQorSVAgYWRkcmVzcy4gImRhdGEiIGlzIHRoZSBJUCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHN1YmplY3RBbHROYW1lIElQCitleHRlbnNpb24sIGFuZCAic2l6ZSIgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0ZW5zaW9uIGRhdGEuCisKK0lmIGFueSBvZiB0aGUgYWJvdmUgInZlcmlmeSIgbWV0aG9kcyByZXR1cm5lZCBhIGRlY2lzaW9uIEFMTE9XIG9yIERFTlksIHRoZQordmVyaWZpY2F0aW9uIHByb2Nlc3Mgd291bGQgYmUgc3RvcHBlZC4KKworSWYgYW55IG9mIHRoZSBhYm92ZSAidmVyaWZ5IiBtZXRob2RzIHJldHVybmVkIFNLSVAsIHRoYXQgZGVjaXNpb24gd291bGQgYmUKK2lnbm9yZWQgYW5kIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyB3b3VsZCBtb3ZlIG9uIHRpbGwgdGhlIGxhc3QgaXRlbSBpcworZXhhbWluZWQuIEF0IHRoYXQgcG9pbnQsIGlmIHRoZXJlJ3Mgc3RpbGwgbm8gZGVjaXNpb24sIHRoZSBjb25uZWN0aW9uIGlzCit0ZXJtaW5hdGVkLgorCitUaHJlYWQgc2FmZXR5LCBhbiBhY2Nlc3MgbWFuYWdlciBzaG91bGQgbm90IHN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGlmIGl0J3MKK3RvIGJlIHVzZWQgYnkgbWFueSBTU0wgc29ja2V0cy4KKworIyMgU0lHUElQRSBzaWduYWwKKworQXBwbGljYXRpb25zIHJ1bm5pbmcgT3BlblNTTCBvdmVyIG5ldHdvcmsgY29ubmVjdGlvbnMgbWF5IGNyYXNoIGlmIFNJR1BJUEUKK2lzIG5vdCBpZ25vcmVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGV5IHJlY2VpdmUgYSBjb25uZWN0aW9uIHJlc2V0IGJ5IHJlbW90ZQorcGVlciBleGNlcHRpb24sIHdoaWNoIHNvbWVob3cgdHJpZ2dlcnMgYSBTSUdQSVBFIHNpZ25hbC4gSWYgbm90IGhhbmRsZWQsCit0aGlzIHNpZ25hbCB3b3VsZCBraWxsIHRoZSBhcHBsaWNhdGlvbi4KKworIyMgSG93IHRvIHJ1biB0ZXN0IGNsaWVudC9zZXJ2ZXIgaW4gU1NMIG1vZGUKKworVGhlIHNlcnZlciBhbmQgY2xpZW50IGV4cGVjdHMgdGhlIGZvbGxvd2luZ3MgZnJvbSB0aGUgZGlyZWN0b3J5IC90ZXN0LworCistIGtleXMvc2VydmVyLmNydAorLSBrZXlzL3NlcnZlci5rZXkKKy0ga2V5cy9DQS5wZW0KKworVGhlIGZpbGUgbmFtZXMgYXJlIGhhcmQgY29kZWQgaW4gdGhlIHNvdXJjZSBjb2RlLiBZb3UgbmVlZCB0byBjcmVhdGUgdGhlc2UKK2NlcnRpZmljYXRlcyBiZWZvcmUgeW91IGNhbiBydW4gdGhlIHRlc3QgY29kZSBpbiBTU0wgbW9kZS4gTWFrZSBzdXJlIGF0IGxlYXN0CitvbmUgb2YgdGhlIGZvbGxvd2luZ3MgaXMgaW5jbHVkZWQgaW4gImtleXMvc2VydmVyLmNydCIsCisKKy0gc3ViamVjdEFsdE5hbWUsIEROUyBsb2NhbGhvc3QKKy0gc3ViamVjdEFsdE5hbWUsIElQICAxMjcuMC4wLjEKKy0gY29tbW9uIG5hbWUsICAgIGxvY2FsaG9zdAorCitSdW4gd2l0aGluIC90ZXN0LyBmb2xkZXIsCisKKyAgICAgICAgIC4vY3BwL1Rlc3RTZXJ2ZXIgLS1zc2wgJgorICAgICAgICAgLi9jcHAvVGVzdENsaWVudCAtLXNzbAorCitJZiAiLWggPGhvc3Q+IiBpcyB1c2VkIHRvIHJ1biBjbGllbnQsIHRoZSBhYm92ZSAibG9jYWxob3N0IiBpbiB0aGUgYWJvdmUKK2tleXMvc2VydmVyLmNydCBoYXMgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGF0IGhvc3QgbmFtZS4KKworIyMgVFNTTFNvY2tldEZhY3Rvcnk6OnJhbmRvbWl6ZSgpCisKK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIE9wZW5TU0xTb2NrZXRGYWN0b3J5OjpyYW5kb21pemUoKSBzaW1wbHkgY2FsbHMKK09wZW5TU0wncyBSQU5EX3BvbGwoKSB3aGVuIE9wZW5TU0wgbGlicmFyeSBpcyBmaXJzdCBpbml0aWFsaXplZC4KKworVGhlIFBSTkcgc2VlZCBpcyBrZXkgdG8gdGhlIGFwcGxpY2F0aW9uIHNlY3VyaXR5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUKK292ZXJyaWRkZW4gaWYgaXQncyBub3Qgc3Ryb25nIGVub3VnaCBmb3IgeW91LgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMS4wCisKK09sZGVyIHZlcnNpb25zIG9mIHRocmlmdCBkZXBlbmRlZCBvbiB0aGUgPGJvb3N0L3NtYXJ0X3B0ci5ocHA+IGNsYXNzZXMgd2hpY2gKK3dlcmUgdXNlZCBpbiB0aHJpZnQgaGVhZGVycyB0byBkZWZpbmUgaW50ZXJmYWNlcy4gIFRocmlmdCBub3cgZGV0ZWN0cyBDKysxMQorYXQgYnVpbGQgdGltZSBhbmQgd2lsbCBwcmVmZXIgdG8gdXNlIDxtZW1vcnk+IGNsYXNzZXMgZnJvbSBDKysxMSBpbnN0ZWFkLgorWW91IGNhbiBmb3JjZSB0aGUgbGlicmFyeSB0byBidWlsZCB3aXRoIGJvb3N0IG1lbW9yeSBjbGFzc2VzIGJ5IGRlZmluaW5nIHRoZQorcHJlcHJvY2Vzc29yIG1hY3JvIGBGT1JDRV9CT09TVF9TTUFSVF9QVFJgLiAgKFRIUklGVC0yMjIxKQorCitJbiB0aGUgcHRocmVhZCBtdXRleCBpbXBsZW1lbnRhdGlvbiwgdGhlIGNvbnRlbnRpb24gcHJvZmlsaW5nIGNvZGUgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQgaW4gYWxsIGJ1aWxkcy4gIFRoaXMgY2hhbmdlZCB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiAgKFRIUklGVC00MTUxKQorCitJbiBvbGRlciByZWxlYXNlcywgaWYgYSBUU1NMU29ja2V0RmFjdG9yeSdzIGxpZmV0aW1lIHdhcyBub3QgYXQgbGVhc3QgYXMgbG9uZworYXMgdGhlIFRTU0xTb2NrZXRzIGl0IGNyZWF0ZWQsIHdlIHNpbGVudGx5IHJldmVydGVkIG9wZW5zc2wgdG8gdW5zYWZlIG11bHRpdGhyZWFkIGJlaGF2aW9yCithbmQgc28gdGhlIHJlc3VsdHMgd2VyZSB1bmRlZmluZWQuICBDaGFuZ2VzIHdlcmUgbWFkZSBpbiAwLjExLjAgdGhhdCBjYXVzZSBlaXRoZXIgYW4KK2Fzc2VydGlvbiBvciBhIGNvcmUgaW5zdGVhZCBvZiB1bmRlZmluZWQgYmVoYXZpb3IuICBUaGUgbGlmZXRpbWUgb2YgYSBUU1NMU29ja2V0RmFjdG9yeQorKm11c3QqIGJlIGxvbmdlciB0aGFuIGFueSBUU1NMU29ja2V0IHRoYXQgaXQgY3JlYXRlcywgb3RoZXJ3aXNlIG9wZW5zc2wgd2lsbCBiZSBjbGVhbmVkCit1cCB0b28gZWFybHkuICBJZiB0aGUgc3RhdGljIGJvb2xlYW4gaXMgc2V0IHRvIGRpc2FibGUgb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQKK2NsZWFudXAgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24sIHRoaXMgcmVxdWlyZW1lbnQgaXMgbm90IG5lZWRlZC4KKyhUSFJJRlQtNDE2NCkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMThjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0IEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworICogc2VlIC5jbGFuZy1mb3JtYXQgaW4gcm9vdCBkaXIgZm9yIHNldHRpbmdzIG9mIGFjY2VwdGVkIGZvcm1hdAorICogY2xhbmctZm9ybWF0ICgzLjUgb3IgbmV3ZXIpIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FseSByZWZvcm1hdCBjb2RlICgnbWFrZSBzdHlsZScgY29tbWFuZCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDk3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCkBAIC0wLDAgKzEsMzY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnLW10fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWctbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZS1tdHxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlLW10fHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TW9uaXRvci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TXV0ZXguY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGhyZWFkTWFuYWdlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGltZXJNYW5hZ2VyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxVdGlsLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUQ29ubmVjdGVkQ2xpZW50LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlckZyYW1ld29yay5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBUcmFuc3BvcnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZVNlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTU0xTb2NrZXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRXaW5zb2NrU2luZ2xldG9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5jcHAiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcRXhjZXB0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFBsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcVE11bHRpcGxleGVkUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUVmlydHVhbFByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUaHJpZnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURmlsZVRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGVTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTaW1wbGVGaWxlVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU1NMU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0VXRpbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRWaXJ0dWFsVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcR2V0VGltZU9mRGF5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3BlcmF0b3JzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTb2NrZXRQYWlyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVFdpbnNvY2tTaW5nbGV0b24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC50Y2MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPntERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+dGhyaWZ0PC9Sb290TmFtZXNwYWNlPgorICAgIDxQcm9qZWN0TmFtZT5saWJ0aHJpZnQ8L1Byb2plY3ROYW1lPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0LnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY0Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMjgzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFRocmVhZE1hbmFnZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGltZXJNYW5hZ2VyLmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFV0aWwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGaWxlVHJhbnNwb3J0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFRyYW5zcG9ydC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU1NMU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmNwcCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU29ja2V0UGFpci5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TW9uaXRvci5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdE11dGV4LmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGUuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZVNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUaHJpZnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVFByb2Nlc3Nvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUYXJnZXRWZXJzaW9uLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEV4Y2VwdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRWaXJ0dWFsVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcR2V0VGltZU9mRGF5LmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUVmlydHVhbFByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmgiPgorICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNTTFNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0VXRpbHMuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPcGVyYXRvcnMuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmgiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxQbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJwcm90b2NvbCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDdjZWQxOWItYjcyYS00MTA1LTlmZmItNmQyYmNmNjQ0OTdlfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZTlmNjE0MDQtMTE0OC00MTAzLWJkNmYtZTU4NjlkMzdmYTc5fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IndpbmRvd3MiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezI4MTQwMDJhLTNjNjgtNDI3ZS1iMGViLTMzYWNkMmY0MDZhZX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJjb25jdXJyZW5jeSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YWRkZDQ3MDctZGJhYS00ZDBjLWJlZjYtZmZmOGJlN2I0OTVhfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InNlcnZlciI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZjU1YThlOWItNjk1OS00ODdmLWEzOTYtYzMxYjRkNmM2MWQ2fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9ImFzeW5jIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntkNTI2ODg1Yi0xYjNlLTRlZTMtODAyNy1lNjk0ZmU5OGFkNjN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0icHJvY2Vzc29yIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns4ZjQyOGRhOC01YTgzLTQ0ZmItOTU3OC1kZTkzNWZiNDE1ZTF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93c1x0cjEiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2VlYTEwNDA2LTMzODAtNGYyZC05MzY1LWMyNmZhMjg3NWRhZX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLnRjYyI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1x0cjFcZnVuY3Rpb25hbCI+CisgICAgICA8RmlsdGVyPndpbmRvd3NcdHIxPC9GaWx0ZXI+CisgICAgPC9Ob25lPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTZmZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCkBAIC0wLDAgKzEsMjk4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnLW10fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHx4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWctbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZS1tdHxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlLW10fHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlLW10PC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBDbGllbnRDaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRhcmdldFZlcnNpb24uaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+e0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT5saWJ0aHJpZnRuYjwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnRuYi5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzAzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDc1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic2VydmVyIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntiZjQ0OWQ5Mi00YmU4LTRmNmYtYTAxMC1jNTM2ZjU3YzZmMTN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iYXN5bmMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezAyOTRkMGE2LWNlNDYtNGJlOC1hNjU5LTgyNmQ2ZTk4YWU0MX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ3aW5kb3dzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2MGZjOWU1ZS0wODY2LTRhYmEtODY2Mi00MzliYjRhNDYxZDN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0idHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsyM2ZlMmZkZS1hN2M5LTQzZWMtYTQwOS03ZjUzZGY1ZWVlNjR9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRhcmdldFZlcnNpb24uaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMzhmYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8VEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdWludDMyX3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpyZWFkKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgewotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7Ci0gIGludDE2X3QgZmlkOwotCi0gIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICB4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3dpdGNoIChmaWQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORykgewotICAgICAgICB4ZmVyICs9IGlwcm90LT5yZWFkU3RyaW5nKG1lc3NhZ2VfKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIpIHsKLSAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICB4ZmVyICs9IGlwcm90LT5yZWFkSTMyKHR5cGUpOwotICAgICAgICB0eXBlXyA9IChUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlKXR5cGU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICB4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsKLSAgfQotCi0gIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6d3JpdGUoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCJtZXNzYWdlIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORywgMSk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RyaW5nKG1lc3NhZ2VfKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oInR5cGUiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyLCAyKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVJMzIodHlwZV8pOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7Ci0gIHJldHVybiB4ZmVyOwotfQotCi19fSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyNWM1Mi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8gMQotCi0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi1uYW1lc3BhY2UgcHJvdG9jb2wgewotICBjbGFzcyBUUHJvdG9jb2w7Ci19Ci0KLWNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IHB1YmxpYyBURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgotICAgKi8KLSAgZW51bSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHsKLSAgICBVTktOT1dOID0gMCwKLSAgICBVTktOT1dOX01FVEhPRCA9IDEsCi0gICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAotICAgIFdST05HX01FVEhPRF9OQU1FID0gMywKLSAgICBCQURfU0VRVUVOQ0VfSUQgPSA0LAotICAgIE1JU1NJTkdfUkVTVUxUID0gNQotICB9OwotCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIDoKLSAgICBURXhjZXB0aW9uKCksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlKSA6Ci0gICAgVEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8odHlwZSkge30KLQotICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCi0gICAqIHRoYXQgaGFzIG9jY3VycmVkLgotICAgKgotICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKLSAgICovCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKLSAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gYXBwbGljYXRpb24gZXhjZXB0aW9uIjsKLSAgICAgICAgY2FzZSBVTktOT1dOX01FVEhPRCAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIG1ldGhvZCI7Ci0gICAgICAgIGNhc2UgSU5WQUxJRF9NRVNTQUdFX1RZUEUgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCBtZXNzYWdlIHR5cGUiOwotICAgICAgICBjYXNlIFdST05HX01FVEhPRF9OQU1FICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFdyb25nIG1ldGhvZCBuYW1lIjsKLSAgICAgICAgY2FzZSBCQURfU0VRVUVOQ0VfSUQgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBCYWQgc2VxdWVuY2UgaWRlbnRpZmllciI7Ci0gICAgICAgIGNhc2UgTUlTU0lOR19SRVNVTFQgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogTWlzc2luZyByZXN1bHQiOwotICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7Ci0gICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKLSAgICB9Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsKLSAgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogRXJyb3IgY29kZQotICAgKi8KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlXzsKLQotfTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RMb2dnaW5nLmggYi9saWIvY3BwL3NyYy9UTG9nZ2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRlOGZjLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RMb2dnaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVExPR0dJTkdfSF8KLSNkZWZpbmUgX1RIUklGVF9UTE9HR0lOR19IXyAxCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotLyoqCi0gKiBDb250YWlucyB1dGlsaXR5IG1hY3JvcyBmb3IgZGVidWdnaW5nIGFuZCBsb2dnaW5nLgotICoKLSAqLwotCi0jaWZuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERJTlRfSAotI2luY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0KLS8qKgotICogVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID0gMDogYWxsIGRlYnVnZ2luZyB0dXJuZWQgb2ZmLCBkZWJ1ZyBtYWNyb3MgdW5kZWZpbmVkCi0gKiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPSAxOiBhbGwgZGVidWdnaW5nIHR1cm5lZCBvbgotICovCi0jZGVmaW5lIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCAwCi0KLQotLyoqCi0gKiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID0gMDogYWxsIGxvZ2dpbmcgdHVybmVkIG9mZiwgbG9nZ2luZyBtYWNyb3MgdW5kZWZpbmVkCi0gKiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID0gMTogYWxsIGxvZ2dpbmcgdHVybmVkIG9uCi0gKi8KLSNkZWZpbmUgVF9HTE9CQUxfTE9HR0lOR19MRVZFTCAgIDEKLQotCi0vKioKLSAqIFN0YW5kYXJkIHdyYXBwZXIgYXJvdW5kIGZwcmludGYgd2hhdCB3aWxsIHByZWZpeCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lCi0gKiBudW1iZXIgdG8gdGhlIGxpbmUuIFVzZXMgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIHRvIGNvbnRyb2wgd2hldGhlciBpdCBpcwotICogdHVybmVkIG9uIG9yIG9mZi4KLSAqCi0gKiBAcGFyYW0gZm9ybWF0X3N0cmluZwotICovCi0jaWYgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMAotICAjZGVmaW5lIFRfREVCVUcoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZWxzZQotICAjZGVmaW5lIFRfREVCVUcoZm9ybWF0X3N0cmluZywuLi4pCi0jZW5kaWYKLQotCi0vKioKLSAqIGFuYWxhZ291cyB0byBUX0RFQlVHIGJ1dCBhbHNvIHByaW50cyB0aGUgdGltZQotICoKLSAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCi0gKi8KLSNpZiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwCi0gICNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSBbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLSNlbHNlCi0gICNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsLi4uKQotI2VuZGlmCi0KLQotLyoqCi0gKiBhbmFsYWdvdXMgdG8gVF9ERUJVRyBidXQgdXNlcyBpbnB1dCBsZXZlbCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHN0cmluZwotICogc2hvdWxkIGJlIGxvZ2dlZC4KLSAqCi0gKiBAcGFyYW0gaW50ICAgICBsZXZlbDogc3BlY2lmaWVkIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBmb3JtYXQgc3RyaW5nCi0gKi8KLSNkZWZpbmUgVF9ERUJVR19MKGxldmVsLCBmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoKGxldmVsKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIyNfX1ZBX0FSR1NfXyk7IFwKLSAgfQotCi0KLS8qKgotICogRXhwbGljaXQgZXJyb3IgbG9nZ2luZy4gUHJpbnRzIHRpbWUsIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKLSAqCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwotICovCi0jZGVmaW5lIFRfRVJST1IoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSBFUlJPUjogIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLQotLyoqCi0gKiBBbmFsYWdvdXMgdG8gVF9FUlJPUiwgYWRkaXRpb25hbGx5IGFib3J0aW5nIHRoZSBwcm9jZXNzLgotICogV0FSTklORzogbWFjcm8gY2FsbHMgYWJvcnQoKSwgZW5kaW5nIHByb2dyYW0gZXhlY3V0aW9uCi0gKgotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKLSAqLwotI2RlZmluZSBUX0VSUk9SX0FCT1JUKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gRVJST1I6IEdvaW5nIHRvIGFib3J0ICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7IFwKLSAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLS8qKgotICogTG9nIGlucHV0IG1lc3NhZ2UKLSAqCi0gKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwotICovCi0jaWYgVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIlslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBkYmd0aW1lLCMjX19WQV9BUkdTX18pOyAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLSNlbHNlCi0gICNkZWZpbmUgVF9MT0dfT1BFUihmb3JtYXRfc3RyaW5nLC4uLikKLSNlbmRpZgotCi0KLS8qKgotICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDAgb3IgdW5zZXQ6IG5vcm1hbCBvcGVyYXRpb24sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBjYWxsIGRlYnVnIG1lc3NhZ2VzIGRpc2FibGVkCi0gKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMTogICAgICAgICAgbG9nIGEgZGVidWcgbWVzc2FnZXMgd2hlbmV2ZXIgYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdm9pZGFibGUgdmlydHVhbCBjYWxsIGlzIG1hZGUKLSAqIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPSAyOiAgICAgICAgICByZWNvcmQgZGV0YWlsZWQgaW5mbyB0aGF0IGNhbiBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZWQgYnkgY2FsbGluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX3ByaW50X2luZm8oKQotICovCi0jaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA+IDEKLSAgI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfdmlydHVhbF9jYWxsKHR5cGVpZCgqdGhpcykpCi0gICNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCEoc3BlY2lmaWNfcHJvdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCggICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0eXBlaWQoKnRlbXBsYXRlX2NsYXNzKSwgdHlwZWlkKCpnZW5lcmljX3Byb3QpKTsgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUgKDApCi0jZWxpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID09IDEKLSAgI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIHZpcnR1YWwgY2FsbFxuIiwgX19GSUxFX18sIF9fTElORV9fKQotICAjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KSBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICghKHNwZWNpZmljX3Byb3QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgIlslcywlZF0gZmFpbGVkIHRvIGNhc3QgdG8gc3BlY2lmaWMgcHJvdG9jb2wgdHlwZVxuIiwgICAgIFwKLSAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSAoMCkKLSNlbHNlCi0gICNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKQotICAjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KQotI2VuZGlmCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVExPR0dJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL1RQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0ZjNiOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFBST0NFU1NPUl9IXwotI2RlZmluZSBfVEhSSUZUX1RQUk9DRVNTT1JfSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLS8qKgotICogVmlydHVhbCBpbnRlcmZhY2UgY2xhc3MgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBwcm9jZXNzb3IuIFRvCi0gKiB1c2UgdGhpcyB5b3Ugc2hvdWxkIHN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FyZQotICogYWJvdXQuIFlvdXIgc3ViY2xhc3MgY2FuIGFsc28gc3RvcmUgbG9jYWwgZGF0YSB0aGF0IHlvdSBtYXkgY2FyZSBhYm91dCwKLSAqIHN1Y2ggYXMgYWRkaXRpb25hbCAiYXJndW1lbnRzIiB0byB0aGVzZSBtZXRob2RzIChzdG9yZWQgaW4gdGhlIG9iamVjdAotICogaW5zdGFuY2UncyBzdGF0ZSkuCi0gKi8KLWNsYXNzIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgewotIHB1YmxpYzoKLQotICB2aXJ0dWFsIH5UUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KLQotICAvKioKLSAgICogQ2FsbGVkIGJlZm9yZSBjYWxsaW5nIG90aGVyIGNhbGxiYWNrIG1ldGhvZHMuCi0gICAqIEV4cGVjdGVkIHRvIHJldHVybiBzb21lIHNvcnQgb2YgY29udGV4dCBvYmplY3QuCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgcGFzc2VkIHRvIGFsbCBvdGhlciBjYWxsYmFja3MKLSAgICogZm9yIHRoYXQgZnVuY3Rpb24gaW52b2NhdGlvbi4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbl9uYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gICAgKHZvaWQpIHNlcnZlckNvbnRleHQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvKioKLSAgICogRXhwZWN0ZWQgdG8gZnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgY29udGV4dC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBmcmVlQ29udGV4dCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBiZXR3ZWVuIHJlYWRpbmcgYXJndW1lbnRzIGFuZCBjYWxsaW5nIHRoZSBoYW5kbGVyLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICAgICh2b2lkKSBieXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBhZnRlciB3cml0aW5nIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gICAgKHZvaWQpIGJ5dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGFuIGFzeW5jIGZ1bmN0aW9uIGNhbGwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhc3luY0NvbXBsZXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KLX07Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZnJlZSBlYWNoIGNvbnRleHQuCi0gKi8KLWNsYXNzIFRQcm9jZXNzb3JDb250ZXh0RnJlZXIgewotIHB1YmxpYzoKLSAgVFByb2Nlc3NvckNvbnRleHRGcmVlcihUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyLCB2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXRob2QpIDoKLSAgICBoYW5kbGVyXyhoYW5kbGVyKSwgY29udGV4dF8oY29udGV4dCksIG1ldGhvZF8obWV0aG9kKSB7fQotICB+VFByb2Nlc3NvckNvbnRleHRGcmVlcigpIHsgaWYgKGhhbmRsZXJfICE9IE5VTEwpIGhhbmRsZXJfLT5mcmVlQ29udGV4dChjb250ZXh0XywgbWV0aG9kXyk7IH0KLSAgdm9pZCB1bnJlZ2lzdGVyKCkgeyBoYW5kbGVyXyA9IE5VTEw7IH0KLSBwcml2YXRlOgotICBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckV2ZW50SGFuZGxlciogaGFuZGxlcl87Ci0gIHZvaWQqIGNvbnRleHRfOwotICBjb25zdCBjaGFyKiBtZXRob2RfOwotfTsKLQotLyoqCi0gKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHRoYXQgYWN0cyB1cG9uIHR3byBzdHJlYW1zIG9mIGRhdGEsIG9uZQotICogYW4gaW5wdXQgYW5kIHRoZSBvdGhlciBhbiBvdXRwdXQuIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgb2JqZWN0IGlzIGxvb3NlLAotICogdGhvdWdoIHRoZSB0eXBpY2FsIGNhc2UgaXMgZm9yIHNvbWUgc29ydCBvZiBzZXJ2ZXIgdGhhdCBlaXRoZXIgZ2VuZXJhdGVzCi0gKiByZXNwb25zZXMgdG8gYW4gaW5wdXQgc3RyZWFtIG9yIGZvcndhcmRzIGRhdGEgZnJvbSBvbmUgcGlwZSBvbnRvIGFub3RoZXIuCi0gKgotICovCi1jbGFzcyBUUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRQcm9jZXNzb3IoKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSA9IDA7Ci0KLSAgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbywKLSAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7Ci0gICAgcmV0dXJuIHByb2Nlc3MoaW8sIGlvLCBjb25uZWN0aW9uQ29udGV4dCk7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGV2ZW50SGFuZGxlcl87Ci0gIH0KLQotICB2b2lkIHNldEV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKLSAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRQcm9jZXNzb3IoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci19OwotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RSZWZsZWN0aW9uTG9jYWwuaCBiL2xpYi9jcHAvc3JjL1RSZWZsZWN0aW9uTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzZTQ3NS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UUmVmbGVjdGlvbkxvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkVGTEVDVElPTkxPQ0FMX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXyAxCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbC5oPgotCi0vKioKLSAqIExvY2FsIFJlZmxlY3Rpb24gaXMgYSBibGFua2V0IHRlcm0gcmVmZXJyaW5nIHRvIHRoZSB0aGUgc3RydWN0dXJlCi0gKiBhbmQgZ2VuZXJhdGlvbiBvZiB0aGlzIHBhcnRpY3VsYXIgcmVwcmVzZW50YXRpb24gb2YgVGhyaWZ0IHR5cGVzLgotICogKEl0IGlzIGNhbGxlZCBsb2NhbCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5IFRocmlmdCkuCi0gKgotICovCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHJlZmxlY3Rpb24geyBuYW1lc3BhY2UgbG9jYWwgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlOwotCi0vLyBXZSBpbmNsdWRlIHRoaXMgbWFueSBieXRlcyBvZiB0aGUgc3RydWN0dXJlJ3MgZmluZ2VycHJpbnQgd2hlbiBzZXJpYWxpemluZwotLy8gYSB0b3AtbGV2ZWwgc3RydWN0dXJlLiAgTG9uZyBlbm91Z2ggdG8gbWFrZSBjb2xsaXNpb25zIHVubGlrZWx5LCBzaG9ydAotLy8gZW5vdWdoIHRvIG5vdCBzaWduaWZpY2FudGx5IGFmZmVjdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkLgotY29uc3QgaW50IEZQX1BSRUZJWF9MRU4gPSA0OwotCi1zdHJ1Y3QgRmllbGRNZXRhIHsKLSAgaW50MTZfdCB0YWc7Ci0gIGJvb2wgaXNfb3B0aW9uYWw7Ci19OwotCi1zdHJ1Y3QgVHlwZVNwZWMgewotICBUVHlwZSB0dHlwZTsKLSAgdWludDhfdCAgICBmcF9wcmVmaXhbRlBfUFJFRklYX0xFTl07Ci0KLSAgLy8gVXNlIGFuIGFub255bW91cyB1bmlvbiBoZXJlIHNvIHdlIGNhbiBmaXQgdHdvIFR5cGVTcGVjcyBpbiBvbmUgY2FjaGUgbGluZS4KLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICAvLyBVc2UgcGFyYWxsZWwgYXJyYXlzIGhlcmUgZm9yIGRlbnNlciBwYWNraW5nIChvZiB0aGUgYXJyYXlzKS4KLSAgICAgIEZpZWxkTWV0YSogbWV0YXM7Ci0gICAgICBUeXBlU3BlYyoqIHNwZWNzOwotICAgIH0gdHN0cnVjdDsKLSAgICBzdHJ1Y3QgewotICAgICAgVHlwZVNwZWMgKnN1YnR5cGUxOwotICAgICAgVHlwZVNwZWMgKnN1YnR5cGUyOwotICAgIH0gdGNvbnRhaW5lcjsKLSAgfTsKLQotICAvLyBTdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdW5pb25zIGlzbid0IHJlYWxseSBwb3NzaWJsZSwKLSAgLy8gc28gdGFrZSB0aGUgcGx1bmdlIGFuZCB1c2UgY29uc3RydWN0b3JzLgotICAvLyBIb3BlZnVsbHkgdGhleSdsbCBiZSBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lLgotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlKSA6IHR0eXBlKHR0eXBlKSB7Ci0gICAgc3RkOjptZW1zZXQoZnBfcHJlZml4LCAwLCBGUF9QUkVGSVhfTEVOKTsKLSAgfQotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlLAotICAgICAgICAgICBjb25zdCB1aW50OF90KiBmaW5nZXJwcmludCwKLSAgICAgICAgICAgRmllbGRNZXRhKiBtZXRhcywKLSAgICAgICAgICAgVHlwZVNwZWMqKiBzcGVjcykgOgotICAgIHR0eXBlKHR0eXBlKQotICB7Ci0gICAgc3RkOjptZW1jcHkoZnBfcHJlZml4LCBmaW5nZXJwcmludCwgRlBfUFJFRklYX0xFTik7Ci0gICAgdHN0cnVjdC5tZXRhcyA9IG1ldGFzOwotICAgIHRzdHJ1Y3Quc3BlY3MgPSBzcGVjczsKLSAgfQotCi0gIFR5cGVTcGVjKFRUeXBlIHR0eXBlLCBUeXBlU3BlYyogc3VidHlwZTEsIFR5cGVTcGVjKiBzdWJ0eXBlMikgOgotICAgIHR0eXBlKHR0eXBlKQotICB7Ci0gICAgc3RkOjptZW1zZXQoZnBfcHJlZml4LCAwLCBGUF9QUkVGSVhfTEVOKTsKLSAgICB0Y29udGFpbmVyLnN1YnR5cGUxID0gc3VidHlwZTE7Ci0gICAgdGNvbnRhaW5lci5zdWJ0eXBlMiA9IHN1YnR5cGUyOwotICB9Ci0KLX07Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVGhyaWZ0LmNwcCBiL2xpYi9jcHAvc3JjL1RocmlmdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDk0N2YuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVGhyaWZ0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotVE91dHB1dCBHbG9iYWxPdXRwdXQ7Ci0KLXZvaWQgVE91dHB1dDo6cHJpbnRmKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikgewotICAvLyBUcnkgdG8gcmVkdWNlIGhlYXAgdXNhZ2UsIGV2ZW4gaWYgcHJpbnRmIGlzIGNhbGxlZCByYXJlbHkuCi0gIHN0YXRpYyBjb25zdCBpbnQgU1RBQ0tfQlVGX1NJWkUgPSAyNTY7Ci0gIGNoYXIgc3RhY2tfYnVmW1NUQUNLX0JVRl9TSVpFXTsKLSAgdmFfbGlzdCBhcDsKLQotICB2YV9zdGFydChhcCwgbWVzc2FnZSk7Ci0gIGludCBuZWVkID0gdnNucHJpbnRmKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIG1lc3NhZ2UsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLQotICBpZiAobmVlZCA8IFNUQUNLX0JVRl9TSVpFKSB7Ci0gICAgZl8oc3RhY2tfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjaGFyICpoZWFwX2J1ZiA9IChjaGFyKiltYWxsb2MoKG5lZWQrMSkgKiBzaXplb2YoY2hhcikpOwotICBpZiAoaGVhcF9idWYgPT0gTlVMTCkgewotICAgIC8vIE1hbGxvYyBmYWlsZWQuICBXZSBtaWdodCBhcyB3ZWxsIHByaW50IHRoZSBzdGFjayBidWZmZXIuCi0gICAgZl8oc3RhY2tfYnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2YV9zdGFydChhcCwgbWVzc2FnZSk7Ci0gIGludCBydmFsID0gdnNucHJpbnRmKGhlYXBfYnVmLCBuZWVkKzEsIG1lc3NhZ2UsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgLy8gVE9ETyhzaGlnaW4pOiBpbmZvcm0gdXNlcgotICBpZiAocnZhbCAhPSAtMSkgewotICAgIGZfKGhlYXBfYnVmKTsKLSAgfQotICBmcmVlKGhlYXBfYnVmKTsKLX0KLQotdm9pZCBUT3V0cHV0OjpwZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKLSAgc3RkOjpzdHJpbmcgb3V0ID0gbWVzc2FnZSArIHN0cmVycm9yX3MoZXJybm9fY29weSk7Ci0gIGZfKG91dC5jX3N0cigpKTsKLX0KLQotc3RkOjpzdHJpbmcgVE91dHB1dDo6c3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSkgewotI2lmbmRlZiBIQVZFX1NUUkVSUk9SX1IKLSAgcmV0dXJuICJlcnJubyA9ICIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKLSNlbHNlICAvLyBIQVZFX1NUUkVSUk9SX1IKLQotICBjaGFyIGJfZXJyYnVmWzEwMjRdID0geyAnXDAnIH07Ci0jaWZkZWYgU1RSRVJST1JfUl9DSEFSX1AKLSAgY2hhciAqYl9lcnJvciA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOwotI2Vsc2UKLSAgY2hhciAqYl9lcnJvciA9IGJfZXJyYnVmOwotICBpbnQgcnYgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKLSAgaWYgKHJ2ID09IC0xKSB7Ci0gICAgLy8gc3RyZXJyb3JfciBmYWlsZWQuICBvbWd3dGZiYnEuCi0gICAgcmV0dXJuICJYU0ktY29tcGxpYW50IHN0cmVycm9yX3IoKSBmYWlsZWQgd2l0aCBlcnJubyA9ICIgKwotICAgICAgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oZXJybm9fY29weSk7Ci0gIH0KLSNlbmRpZgotICAvLyBDYW4gYW55b25lIHByb3ZlIHRoYXQgZXhwbGljaXQgY2FzdCBpcyBwcm9iYWJseSBub3QgbmVjZXNzYXJ5Ci0gIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGJlZm9yZQotICAvLyBiX2Vycm9yIGJlY29tZXMgaW52YWxpZD8KLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJfZXJyb3IpOwotCi0jZW5kaWYgIC8vIEhBVkVfU1RSRVJST1JfUgotfQotCi19fSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVGhyaWZ0LmggYi9saWIvY3BwL3NyYy9UaHJpZnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2Y2YzOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UaHJpZnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KLSNkZWZpbmUgX1RIUklGVF9USFJJRlRfSF8gMQotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotI2luY2x1ZGUgPHR5cGVpbmZvPgotCi0jaW5jbHVkZSAiVExvZ2dpbmcuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi1jbGFzcyBURW51bUl0ZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFRFbnVtSXRlcmF0b3IoaW50IG4sCi0gICAgICAgICAgICAgICAgaW50KiBlbnVtcywKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogbmFtZXMpIDoKLSAgICAgIGlpXygwKSwgbl8obiksIGVudW1zXyhlbnVtcyksIG5hbWVzXyhuYW1lcykgewotICB9Ci0KLSAgaW50IG9wZXJhdG9yICsrKCkgewotICAgIHJldHVybiArK2lpXzsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3IgIT0oY29uc3QgVEVudW1JdGVyYXRvciYgZW5kKSB7Ci0gICAgYXNzZXJ0KGVuZC5uXyA9PSAtMSk7Ci0gICAgcmV0dXJuIChpaV8gIT0gbl8pOwotICB9Ci0KLSAgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+IG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW51bXNfW2lpX10sIG5hbWVzX1tpaV9dKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgaW50IGlpXzsKLSAgY29uc3QgaW50IG5fOwotICBpbnQqIGVudW1zXzsKLSAgY29uc3QgY2hhcioqIG5hbWVzXzsKLX07Ci0KLWNsYXNzIFRPdXRwdXQgewotIHB1YmxpYzoKLSAgVE91dHB1dCgpIDogZl8oJmVycm9yVGltZVdyYXBwZXIpIHt9Ci0KLSAgaW5saW5lIHZvaWQgc2V0T3V0cHV0RnVuY3Rpb24odm9pZCAoKmZ1bmN0aW9uKShjb25zdCBjaGFyICopKXsKLSAgICBmXyA9IGZ1bmN0aW9uOwotICB9Ci0KLSAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBjaGFyICptZXNzYWdlKXsKLSAgICBmXyhtZXNzYWdlKTsKLSAgfQotCi0gIC8vIEl0IGlzIGltcG9ydGFudCB0byBoYXZlIGEgY29uc3QgY2hhciogb3ZlcmxvYWQgaGVyZSBpbnN0ZWFkIG9mCi0gIC8vIGp1c3QgdGhlIHN0cmluZyB2ZXJzaW9uLCBvdGhlcndpc2UgZXJybm8gY291bGQgYmUgY29ycnVwdGVkCi0gIC8vIGlmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSBhbGxvY2F0aW5nIG1lbW9yeSB3aGVuIGNvbnN0cnVjdGluZwotICAvLyB0aGUgc3RyaW5nLgotICB2b2lkIHBlcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBpbnQgZXJybm9fY29weSk7Ci0gIGlubGluZSB2b2lkIHBlcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKLSAgICBwZXJyb3IobWVzc2FnZS5jX3N0cigpLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIHZvaWQgcHJpbnRmKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7Ci0KLSAgaW5saW5lIHN0YXRpYyB2b2lkIGVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKSB7Ci0gICAgdGltZV90IG5vdzsKLSAgICBjaGFyIGRiZ3RpbWVbMjZdOwotICAgIHRpbWUoJm5vdyk7Ci0gICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsKLSAgICBkYmd0aW1lWzI0XSA9IDA7Ci0gICAgZnByaW50ZihzdGRlcnIsICJUaHJpZnQ6ICVzICVzXG4iLCBkYmd0aW1lLCBtc2cpOwotICB9Ci0KLSAgLyoqIEp1c3QgbGlrZSBzdHJlcnJvcl9yIGJ1dCByZXR1cm5zIGEgQysrIHN0cmluZyBvYmplY3QuICovCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgKCpmXykoY29uc3QgY2hhciAqKTsKLX07Ci0KLWV4dGVybiBUT3V0cHV0IEdsb2JhbE91dHB1dDsKLQotY2xhc3MgVEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBURXhjZXB0aW9uKCk6Ci0gICAgbWVzc2FnZV8oKSB7fQotCi0gIFRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBtZXNzYWdlXyhtZXNzYWdlKSB7fQotCi0gIHZpcnR1YWwgflRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiAiRGVmYXVsdCBURXhjZXB0aW9uLiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKLQotfTsKLQotCi0vLyBGb3J3YXJkIGRlY2xhcmUgdGhpcyBzdHJ1Y3R1cmUgdXNlZCBieSBURGVuc2VQcm90b2NvbAotbmFtZXNwYWNlIHJlZmxlY3Rpb24geyBuYW1lc3BhY2UgbG9jYWwgewotc3RydWN0IFR5cGVTcGVjOwotfX0KLQotY2xhc3MgVERlbGF5ZWRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIEU+IHN0YXRpYyBURGVsYXllZEV4Y2VwdGlvbiogZGVsYXlFeGNlcHRpb24oY29uc3QgRSYgZSk7Ci0gIHZpcnR1YWwgdm9pZCB0aHJvd19pdCgpID0gMDsKLSAgdmlydHVhbCB+VERlbGF5ZWRFeGNlcHRpb24oKSB7fTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBFPiBjbGFzcyBURXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBURGVsYXllZEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBURXhjZXB0aW9uV3JhcHBlcihjb25zdCBFJiBlKSA6IGVfKGUpIHt9Ci0gIHZpcnR1YWwgdm9pZCB0aHJvd19pdCgpIHsKLSAgICBFIHRlbXAoZV8pOwotICAgIGRlbGV0ZSB0aGlzOwotICAgIHRocm93IHRlbXA7Ci0gIH0KLSBwcml2YXRlOgotICBFIGVfOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIEU+Ci1URGVsYXllZEV4Y2VwdGlvbiogVERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpIHsKLSAgcmV0dXJuIG5ldyBURXhjZXB0aW9uV3JhcHBlcjxFPihlKTsKLX0KLQotI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCi12b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBpbmZvKTsKLXZvaWQgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0ZW1wbGF0ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHByb3RfdHlwZSk7Ci12b2lkIHByb2ZpbGVfcHJpbnRfaW5mbyhGSUxFICpmKTsKLXZvaWQgcHJvZmlsZV9wcmludF9pbmZvKCk7Ci12b2lkIHByb2ZpbGVfd3JpdGVfcHByb2YoRklMRSogZ2VuX2NhbGxzX2YsIEZJTEUqIHZpcnR1YWxfY2FsbHNfZik7Ci0jZW5kaWYKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1ZpcnR1YWxQcm9maWxpbmcuY3BwIGIvbGliL2NwcC9zcmMvVmlydHVhbFByb2ZpbGluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDIzYWYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVmlydHVhbFByb2ZpbGluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLS8vIERvIG5vdGhpbmcgaWYgdmlydHVhbCBjYWxsIHByb2ZpbGluZyBpcyBub3QgZW5hYmxlZAotI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCi0KLS8vIFRPRE86IFRoaXMgY29kZSBvbmx5IHdvcmtzIHdpdGggZysrIChzaW5jZSB3ZSByZWx5IG9uIHRoZSBmYWN0Ci0vLyB0aGF0IGFsbCBzdGQ6OnR5cGVfaW5mbyBpbnN0YW5jZXMgcmVmZXJyaW5nIHRvIGEgcGFydGljdWxhciB0eXBlCi0vLyBhbHdheXMgcmV0dXJuIHRoZSBleGFjdCBzYW1lIHBvaW50ZXIgdmFsdWUgZnJvbSBuYW1lKCkuKQotI2lmbmRlZiBfX0dOVUdfXwotI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBnY2MiCi0jZW5kaWYgLy8gIV9fR05VR19fCi0KLS8vIFRPRE86IFdlIGFsc28gcmVxdWlyZSBnbGliYyBmb3IgdGhlIGJhY2t0cmFjZSgpIGFuZCBiYWNrdHJhY2Vfc3ltYm9scygpCi0vLyBmdW5jdGlvbnMuCi0jaWZuZGVmIF9fR0xJQkNfXwotI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IHJlcXVpcmVzIGdsaWJjIgotI2VuZGlmIC8vICFfX0dMSUJDX18KLQotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTXV0ZXguaD4KLQotI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KLSNpbmNsdWRlIDxleGVjaW5mby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdXNpbmcgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwotdXNpbmcgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9TVEFDS19ERVBUSCA9IDE1OwotCi0vKioKLSAqIEEgc3RhY2sgdHJhY2UKLSAqLwotY2xhc3MgQmFja3RyYWNlIHsKLSBwdWJsaWM6Ci0gIEJhY2t0cmFjZShpbnQgc2tpcCA9IDApOwotICBCYWNrdHJhY2UoQmFja3RyYWNlIGNvbnN0ICZidCk7Ci0KLSAgdm9pZCBvcGVyYXRvcj0oQmFja3RyYWNlIGNvbnN0ICZidCkgewotICAgIG51bUNhbGxlcnNfID0gYnQubnVtQ2FsbGVyc187Ci0gICAgaWYgKG51bUNhbGxlcnNfID49IDApIHsKLSAgICAgIG1lbWNweShjYWxsZXJzXywgYnQuY2FsbGVyc18sIG51bUNhbGxlcnNfICogc2l6ZW9mKHZvaWQqKSk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KEJhY2t0cmFjZSBjb25zdCAmYnQpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNtcChidCkgPT0gMCk7Ci0gIH0KLQotICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKLSAgICBpbnRwdHJfdCByZXQgPSAwOwotICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ2FsbGVyc187ICsrbikgewotICAgICAgcmV0IF49IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNhbGxlcnNfW25dKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KTsKLSAgfQotCi0gIGludCBjbXAoQmFja3RyYWNlIGNvbnN0JiBidCkgY29uc3QgewotICAgIGludCBkZXB0aF9kaWZmID0gKG51bUNhbGxlcnNfIC0gYnQubnVtQ2FsbGVyc18pOwotICAgIGlmIChkZXB0aF9kaWZmICE9IDApIHsKLSAgICAgIHJldHVybiBkZXB0aF9kaWZmOwotICAgIH0KLQotICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ2FsbGVyc187ICsrbikgewotICAgICAgaW50IGRpZmYgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihjYWxsZXJzX1tuXSkgLQotICAgICAgICByZWludGVycHJldF9jYXN0PGludHB0cl90PihidC5jYWxsZXJzX1tuXSk7Ci0gICAgICBpZiAoZGlmZiAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBkaWZmOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBwcmludChGSUxFICpmLCBpbnQgaW5kZW50PTAsIGludCBzdGFydD0wKSBjb25zdCB7Ci0gICAgY2hhciAqKnN0cmluZ3MgPSBiYWNrdHJhY2Vfc3ltYm9scyhjYWxsZXJzXywgbnVtQ2FsbGVyc18pOwotICAgIGlmIChzdHJpbmdzKSB7Ci0gICAgICBzdGFydCArPSBza2lwXzsKLSAgICAgIGlmIChzdGFydCA8IDApIHsKLSAgICAgICAgc3RhcnQgPSAwOwotICAgICAgfQotICAgICAgZm9yIChpbnQgbiA9IHN0YXJ0OyBuIDwgbnVtQ2FsbGVyc187ICsrbikgewotICAgICAgICBmcHJpbnRmKGYsICIlKnMjJS0yZCAlc1xuIiwgaW5kZW50LCAiIiwgbiwgc3RyaW5nc1tuXSk7Ci0gICAgICB9Ci0gICAgICBmcmVlKHN0cmluZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKGYsICIlKnM8ZmFpbGVkIHRvIGRldGVybWluZSBzeW1ib2xzPlxuIiwgaW5kZW50LCAiIik7Ci0gICAgfQotICB9Ci0KLSAgaW50IGdldERlcHRoKCkgY29uc3QgewotICAgIHJldHVybiBudW1DYWxsZXJzXyAtIHNraXBfOwotICB9Ci0KLSAgdm9pZCAqZ2V0RnJhbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgaW50IGFkanVzdGVkX2luZGV4ID0gaW5kZXggKyBza2lwXzsKLSAgICBpZiAoYWRqdXN0ZWRfaW5kZXggPCAwIHx8IGFkanVzdGVkX2luZGV4ID49IG51bUNhbGxlcnNfKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGNhbGxlcnNfW2FkanVzdGVkX2luZGV4XTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCAqY2FsbGVyc19bTUFYX1NUQUNLX0RFUFRIXTsKLSAgaW50IG51bUNhbGxlcnNfOwotICBpbnQgc2tpcF87Ci19OwotCi0vLyBEZWZpbmUgdGhlIGNvbnN0cnVjdG9ycyBub24taW5saW5lLCBzbyB0aGV5IGNvbnNpc3RlbnRseSBhZGQgYSBzaW5nbGUKLS8vIGZyYW1lIHRvIHRoZSBzdGFjayB0cmFjZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9wdGltaXphdGlvbiBpcyBlbmFibGVkCi1CYWNrdHJhY2U6OkJhY2t0cmFjZShpbnQgc2tpcCkKLSAgOiBza2lwXyhza2lwICsgMSkgLy8gaWdub3JlIHRoZSBjb25zdHJ1Y3RvciBpdHNlbGYKLXsKLSAgbnVtQ2FsbGVyc18gPSBiYWNrdHJhY2UoY2FsbGVyc18sIE1BWF9TVEFDS19ERVBUSCk7Ci0gIGlmIChza2lwXyA+IG51bUNhbGxlcnNfKSB7Ci0gICAgc2tpcF8gPSBudW1DYWxsZXJzXzsKLSAgfQotfQotCi1CYWNrdHJhY2U6OkJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QgJmJ0KQotICA6IG51bUNhbGxlcnNfKGJ0Lm51bUNhbGxlcnNfKQotICAsIHNraXBfKGJ0LnNraXBfKSB7Ci0gIGlmIChudW1DYWxsZXJzXyA+PSAwKSB7Ci0gICAgbWVtY3B5KGNhbGxlcnNfLCBidC5jYWxsZXJzXywgbnVtQ2FsbGVyc18gKiBzaXplb2Yodm9pZCopKTsKLSAgfQotfQotCi0vKioKLSAqIEEgYmFja3RyYWNlLCBwbHVzIG9uZSBvciB0d28gdHlwZSBuYW1lcwotICovCi1jbGFzcyBLZXkgewotIHB1YmxpYzoKLSAgY2xhc3MgSGFzaCB7Ci0gICBwdWJsaWM6Ci0gICAgc2l6ZV90IG9wZXJhdG9yKCkoS2V5IGNvbnN0JiBrKSBjb25zdCB7Ci0gICAgICByZXR1cm4gay5oYXNoKCk7Ci0gICAgfQotICB9OwotCi0gIEtleShjb25zdCBCYWNrdHJhY2UqIGJ0LCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvKQotICAgIDogYmFja3RyYWNlXyhidCkKLSAgICAsIHR5cGVOYW1lMV8odHlwZV9pbmZvLm5hbWUoKSkKLSAgICAsIHR5cGVOYW1lMl8oTlVMTCkgewotICB9Ci0KLSAgS2V5KGNvbnN0IEJhY2t0cmFjZSogYnQsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8xLAotICAgICAgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzIpCi0gICAgOiBiYWNrdHJhY2VfKGJ0KQotICAgICwgdHlwZU5hbWUxXyh0eXBlX2luZm8xLm5hbWUoKSkKLSAgICAsIHR5cGVOYW1lMl8odHlwZV9pbmZvMi5uYW1lKCkpIHsKLSAgfQotCi0gIEtleShjb25zdCBLZXkmIGspCi0gICAgOiBiYWNrdHJhY2VfKGsuYmFja3RyYWNlXykKLSAgICAsIHR5cGVOYW1lMV8oay50eXBlTmFtZTFfKQotICAgICwgdHlwZU5hbWUyXyhrLnR5cGVOYW1lMl8pIHsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEtleSYgaykgewotICAgIGJhY2t0cmFjZV8gPSBrLmJhY2t0cmFjZV87Ci0gICAgdHlwZU5hbWUxXyA9IGsudHlwZU5hbWUxXzsKLSAgICB0eXBlTmFtZTJfID0gay50eXBlTmFtZTJfOwotICB9Ci0KLSAgY29uc3QgQmFja3RyYWNlKiBnZXRCYWNrdHJhY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhY2t0cmFjZV87Ci0gIH0KLQotICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZU5hbWUxXzsKLSAgfQotCi0gIGNvbnN0IGNoYXIqIGdldFR5cGVOYW1lMigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZU5hbWUyXzsKLSAgfQotCi0gIHZvaWQgbWFrZVBlcnNpc3RlbnQoKSB7Ci0gICAgLy8gQ29weSB0aGUgQmFja3RyYWNlIG9iamVjdAotICAgIGJhY2t0cmFjZV8gPSBuZXcgQmFja3RyYWNlKCpiYWNrdHJhY2VfKTsKLQotICAgIC8vIE5PVEU6IFdlIGRvbid0IGNvcHkgdGhlIHR5cGUgbmFtZS4KLSAgICAvLyBUaGUgR05VIGxpYnN0ZGMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlX2luZm86Om5hbWUoKSByZXR1cm5zIGEgdmFsdWUKLSAgICAvLyB0aGF0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvZ3JhbS4gIChBbHRob3VnaCB0aGUgQysrCi0gICAgLy8gc3RhbmRhcmQgZG9lc24ndCBndWFyYW50ZWUgdGhpcyB3aWxsIGJlIHRydWUgb24gYWxsIGltcGxlbWVudGF0aW9ucy4pCi0gIH0KLQotICAvKioKLSAgICogQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRlZCBieSBtYWtlUGVyc2lzdGVudCgpCi0gICAqCi0gICAqIFNob3VsZCBvbmx5IGJlIGludm9rZWQgaWYgbWFrZVBlcnNpc3RlbnQoKSBoYXMgcHJldmlvdXNseSBiZWVuIGNhbGxlZC4KLSAgICogVGhlIEtleSBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgYWZ0ZXIgY2xlYW51cCgpIGlzIGNhbGxlZC4KLSAgICovCi0gIHZvaWQgY2xlYW51cCgpIHsKLSAgICBkZWxldGUgYmFja3RyYWNlXzsKLSAgICBiYWNrdHJhY2VfID0gTlVMTDsKLSAgfQotCi0gIGludCBjbXAoY29uc3QgS2V5JiBrKSBjb25zdCB7Ci0gICAgaW50IHJldCA9IGJhY2t0cmFjZV8tPmNtcCgqay5iYWNrdHJhY2VfKTsKLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy8gTk9URTogV2UgY29tcGFyZSBqdXN0IHRoZSBuYW1lIHBvaW50ZXJzLgotICAgIC8vIFdpdGggR05VIGxpYnN0ZGMrKywgZXZlcnkgdHlwZV9pbmZvIG9iamVjdCBmb3IgdGhlIHNhbWUgdHlwZSBwb2ludHMgdG8KLSAgICAvLyBleGFjdGx5IHRoZSBzYW1lIG5hbWUgc3RyaW5nLiAgKEFsdGhvdWdoIHRoaXMgaXNuJ3QgZ3VhcmFudGVlZCBieSB0aGUKLSAgICAvLyBDKysgc3RhbmRhcmQuKQotICAgIHJldCA9IGsudHlwZU5hbWUxXyAtIHR5cGVOYW1lMV87Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gay50eXBlTmFtZTJfIC0gdHlwZU5hbWUyXzsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmIGspIGNvbnN0IHsKLSAgICByZXR1cm4gY21wKGspID09IDA7Ci0gIH0KLQotICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKLSAgICAvLyBOT1RFOiBBcyBhYm92ZSwgd2UganVzdCB1c2UgdGhlIG5hbWUgcG9pbnRlciB2YWx1ZS4KLSAgICAvLyBXb3JrcyB3aXRoIEdOVSBsaWJzdGRjKyssIGJ1dCBub3QgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IG9uIGFsbAotICAgIC8vIGltcGxlbWVudGF0aW9ucy4KLSAgICByZXR1cm4gYmFja3RyYWNlXy0+aGFzaCgpIF4KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTFfKSBeCi0gICAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4odHlwZU5hbWUyXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IEJhY2t0cmFjZSogYmFja3RyYWNlXzsKLSAgY29uc3QgY2hhciogdHlwZU5hbWUxXzsKLSAgY29uc3QgY2hhciogdHlwZU5hbWUyXzsKLX07Ci0KLS8qKgotICogQSBmdW5jdG9yIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBvZiB0d28gQmFja3RyYWNlTWFwIGVudHJpZXMKLSAqIGhhcyBhIGhpZ2hlciBjb3VudC4KLSAqLwotY2xhc3MgQ291bnRHcmVhdGVyIHsKLSBwdWJsaWM6Ci0gIGJvb2wgb3BlcmF0b3IoKShzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MSwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gYnQyKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJ0MS5zZWNvbmQgPiBidDIuc2Vjb25kOwotICB9Ci19OwotCi10eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tYXA8S2V5LCBzaXplX3QsIEtleTo6SGFzaD4gQmFja3RyYWNlTWFwOwotCi0vKioKLSAqIEEgbWFwIGRlc2NyaWJpbmcgaG93IG1hbnkgdGltZXMgVF9WSVJUVUFMX0NBTEwoKSBoYXMgYmVlbiBpbnZva2VkLgotICovCi1CYWNrdHJhY2VNYXAgdmlydHVhbF9jYWxsczsKLU11dGV4IHZpcnR1YWxfY2FsbHNfbXV0ZXg7Ci0KLS8qKgotICogQSBtYXAgZGVzY3JpYmluZyBob3cgbWFueSB0aW1lcyBUX0dFTkVSSUNfUFJPVE9DT0woKSBoYXMgYmVlbiBpbnZva2VkLgotICovCi1CYWNrdHJhY2VNYXAgZ2VuZXJpY19jYWxsczsKLU11dGV4IGdlbmVyaWNfY2FsbHNfbXV0ZXg7Ci0KLQotdm9pZCBfcmVjb3JkX2JhY2t0cmFjZShCYWNrdHJhY2VNYXAqIG1hcCwgY29uc3QgTXV0ZXgmIG11dGV4LCBLZXkgKmspIHsKLSAgR3VhcmQgZ3VhcmQobXV0ZXgpOwotCi0gIEJhY2t0cmFjZU1hcDo6aXRlcmF0b3IgaXQgPSBtYXAtPmZpbmQoKmspOwotICBpZiAoaXQgPT0gbWFwLT5lbmQoKSkgewotICAgIGstPm1ha2VQZXJzaXN0ZW50KCk7Ci0gICAgbWFwLT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmssIDEpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBpbmNyZW1lbnQgdGhlIGNvdW50Ci0gICAgLy8gTk9URTogd2UgY291bGQgYXNzZXJ0IGlmIGl0LT5zZWNvbmQgaXMgMCBhZnRlcndhcmRzLCBzaW5jZSB0aGF0IHdvdWxkCi0gICAgLy8gbWVhbiB3ZSd2ZSB3cmFwcGVkLgotICAgICsrKGl0LT5zZWNvbmQpOwotICB9Ci19Ci0KLS8qKgotICogUmVjb3JkIGFuIHVubmVjZXNzYXJ5IHZpcnR1YWwgZnVuY3Rpb24gY2FsbC4KLSAqCi0gKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBUX1ZJUlRVQUxfQ0FMTCgpIG1hY3JvLgotICovCi12b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlKSB7Ci0gIGludCBjb25zdCBza2lwID0gMTsgLy8gaWdub3JlIHRoaXMgZnJhbWUKLSAgQmFja3RyYWNlIGJ0KHNraXApOwotICBLZXkgaygmYnQsIHR5cGUpOwotICBfcmVjb3JkX2JhY2t0cmFjZSgmdmlydHVhbF9jYWxscywgdmlydHVhbF9jYWxsc19tdXRleCwgJmspOwotfQotCi0vKioKLSAqIFJlY29yZCBhIGNhbGwgdG8gYSB0ZW1wbGF0ZSBwcm9jZXNzb3Igd2l0aCBhIHByb3RvY29sIHRoYXQgaXMgbm90IHRoZSBvbmUKLSAqIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgotICoKLSAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIFRfR0VORVJJQ19QUk9UT0NPTCgpIG1hY3JvLgotICovCi12b2lkIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGVtcGxhdGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBwcm90X3R5cGUpIHsKLSAgaW50IGNvbnN0IHNraXAgPSAxOyAvLyBpZ25vcmUgdGhpcyBmcmFtZQotICBCYWNrdHJhY2UgYnQoc2tpcCk7Ci0gIEtleSBrKCZidCwgdGVtcGxhdGVfdHlwZSwgcHJvdF90eXBlKTsKLSAgX3JlY29yZF9iYWNrdHJhY2UoJmdlbmVyaWNfY2FsbHMsIGdlbmVyaWNfY2FsbHNfbXV0ZXgsICZrKTsKLX0KLQotLyoqCi0gKiBQcmludCB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAqLwotdm9pZCBwcm9maWxlX3ByaW50X2luZm8oRklMRSogZikgewotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+ID4gQmFja3RyYWNlVmVjdG9yOwotCi0gIENvdW50R3JlYXRlciBpc19ncmVhdGVyOwotCi0gIC8vIEdyYWIgYm90aCBsb2NrcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcmludCBvcGVyYXRpb24sCi0gIC8vIHRvIGVuc3VyZSB0aGUgb3V0cHV0IGlzIGEgY29uc2lzdGVudCBzbmFwc2hvdCBvZiBhIHNpbmdsZSBwb2ludCBpbiB0aW1lCi0gIEd1YXJkIGdlbmVyaWNfY2FsbHNfZ3VhcmQoZ2VuZXJpY19jYWxsc19tdXRleCk7Ci0gIEd1YXJkIHZpcnR1YWxfY2FsbHNfZ3VhcmQodmlydHVhbF9jYWxsc19tdXRleCk7Ci0KLSAgLy8gcHJpbnQgdGhlIGluZm8gZnJvbSBnZW5lcmljX2NhbGxzLCBzb3J0ZWQgYnkgZnJlcXVlbmN5Ci0gIC8vCi0gIC8vIFdlIHByaW50IHRoZSBnZW5lcmljX2NhbGxzIGluZm8gYWhlYWQgb2YgdmlydHVhbF9jYWxscywgc2luY2UgaXQgaXMgbW9yZQotICAvLyB1c2VmdWwgaW4gc29tZSBjYXNlcy4gIEFsbCBUX0dFTkVSSUNfUFJPVE9DT0wgY2FsbHMgY2FuIGJlIGVsaW1pbmF0ZWQKLSAgLy8gZnJvbSBtb3N0IHByb2dyYW1zLiAgTm90IGFsbCBUX1ZJUlRVQUxfQ0FMTHMgd2lsbCBiZSBlbGltaW5hdGVkIGJ5Ci0gIC8vIGNvbnZlcnRpbmcgdG8gdGVtcGxhdGVzLgotICBCYWNrdHJhY2VWZWN0b3IgZ3Bfc29ydGVkKGdlbmVyaWNfY2FsbHMuYmVnaW4oKSwgZ2VuZXJpY19jYWxscy5lbmQoKSk7Ci0gIHN0ZDo6c29ydChncF9zb3J0ZWQuYmVnaW4oKSwgZ3Bfc29ydGVkLmVuZCgpLCBpc19ncmVhdGVyKTsKLQotICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBncF9zb3J0ZWQuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBncF9zb3J0ZWQuZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIEtleSBjb25zdCAma2V5ID0gaXQtPmZpcnN0OwotICAgIHNpemVfdCBjb25zdCBjb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgZnByaW50ZihmLCAiVF9HRU5FUklDX1BST1RPQ09MOiAlenUgY2FsbHMgdG8gJXMgd2l0aCBhICVzOlxuIiwKLSAgICAgICAgICAgIGNvdW50LCBrZXkuZ2V0VHlwZU5hbWUoKSwga2V5LmdldFR5cGVOYW1lMigpKTsKLSAgICBrZXkuZ2V0QmFja3RyYWNlKCktPnByaW50KGYsIDIpOwotICAgIGZwcmludGYoZiwgIlxuIik7Ci0gIH0KLQotICAvLyBwcmludCB0aGUgaW5mbyBmcm9tIHZpcnR1YWxfY2FsbHMsIHNvcnRlZCBieSBmcmVxdWVuY3kKLSAgQmFja3RyYWNlVmVjdG9yIHZjX3NvcnRlZCh2aXJ0dWFsX2NhbGxzLmJlZ2luKCksIHZpcnR1YWxfY2FsbHMuZW5kKCkpOwotICBzdGQ6OnNvcnQodmNfc29ydGVkLmJlZ2luKCksIHZjX3NvcnRlZC5lbmQoKSwgaXNfZ3JlYXRlcik7Ci0KLSAgZm9yIChCYWNrdHJhY2VWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdmNfc29ydGVkLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gdmNfc29ydGVkLmVuZCgpOwotICAgICAgICsraXQpIHsKLSAgICBLZXkgY29uc3QgJmtleSA9IGl0LT5maXJzdDsKLSAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOwotICAgIGZwcmludGYoZiwgIlRfVklSVFVBTF9DQUxMOiAlenUgY2FsbHMgb24gJXM6XG4iLCBjb3VudCwga2V5LmdldFR5cGVOYW1lKCkpOwotICAgIGtleS5nZXRCYWNrdHJhY2UoKS0+cHJpbnQoZiwgMik7Ci0gICAgZnByaW50ZihmLCAiXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIFByaW50IHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gc3Rkb3V0LgotICovCi12b2lkIHByb2ZpbGVfcHJpbnRfaW5mbygpIHsKLSAgcHJvZmlsZV9wcmludF9pbmZvKHN0ZG91dCk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBCYWNrdHJhY2VNYXAgYXMgR29vZ2xlIENQVSBwcm9maWxlciBiaW5hcnkgZGF0YS4KLSAqLwotc3RhdGljIHZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKEZJTEUqIGYsIEJhY2t0cmFjZU1hcCBjb25zdCYgbWFwKSB7Ci0gIC8vIFdyaXRlIHRoZSBoZWFkZXIKLSAgdWludHB0cl90IGhlYWRlcls1XSA9IHsgMCwgMywgMCwgMCwgMCB9OwotICBmd3JpdGUoJmhlYWRlciwgc2l6ZW9mKGhlYWRlciksIDEsIGYpOwotCi0gIC8vIFdyaXRlIHRoZSBwcm9maWxlIHJlY29yZHMKLSAgZm9yIChCYWNrdHJhY2VNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwLmJlZ2luKCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgewotICAgIHVpbnRwdHJfdCBjb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgZndyaXRlKCZjb3VudCwgc2l6ZW9mKGNvdW50KSwgMSwgZik7Ci0KLSAgICBCYWNrdHJhY2UgY29uc3QqIGJ0ID0gaXQtPmZpcnN0LmdldEJhY2t0cmFjZSgpOwotICAgIHVpbnRwdHJfdCBudW1fcGNzID0gYnQtPmdldERlcHRoKCk7Ci0gICAgZndyaXRlKCZudW1fcGNzLCBzaXplb2YobnVtX3BjcyksIDEsIGYpOwotCi0gICAgZm9yICh1aW50cHRyX3QgbiA9IDA7IG4gPCBudW1fcGNzOyArK24pIHsKLSAgICAgIHZvaWQqIHBjID0gYnQtPmdldEZyYW1lKG4pOwotICAgICAgZndyaXRlKCZwYywgc2l6ZW9mKHBjKSwgMSwgZik7Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHRyYWlsZXIKLSAgdWludHB0cl90IHRyYWlsZXJbM10gPSB7IDAsIDEsIDAgfTsKLSAgZndyaXRlKCZ0cmFpbGVyLCBzaXplb2YodHJhaWxlciksIDEsIGYpOwotCi0gIC8vIFdyaXRlIC9wcm9jL3NlbGYvbWFwcwotICAvLyBUT0RPKHNpbXBraW5zKTogVGhpcyBvbmx5IHdvcmtzIG9uIGxpbnV4Ci0gIEZJTEUgKnByb2NfbWFwcyA9IGZvcGVuKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOwotICBpZiAocHJvY19tYXBzKSB7Ci0gICAgdWludDhfdCBidWZbNDA5Nl07Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHNpemVfdCBieXRlc19yZWFkID0gZnJlYWQoYnVmLCAxLCBzaXplb2YoYnVmKSwgcHJvY19tYXBzKTsKLSAgICAgIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBmd3JpdGUoYnVmLCAxLCBieXRlc19yZWFkLCBmKTsKLSAgICB9Ci0gICAgZmNsb3NlKHByb2NfbWFwcyk7Ci0gIH0KLX0KLQotLyoqCi0gKiBXcml0ZSB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGFzIHBwcm9mIGZpbGVzLgotICoKLSAqIFRoaXMgd3JpdGVzIHRoZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgR29vZ2xlIENQVSBwcm9maWxlciBiaW5hcnkgZGF0YQotICogZm9ybWF0LCBzbyBpdCBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBwcHJvZi4gIE5vdGUgdGhhdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIHByb3RvY29sL3RyYW5zcG9ydCBkYXRhIHR5cGVzIGNhbm5vdCBiZSBzdG9yZWQgaW4gdGhpcyBmaWxlIGZvcm1hdC4KLSAqCi0gKiBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1wZXJmdG9vbHMvIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQHBhcmFtIGdlbl9jYWxsc19mICAgICBUaGUgaW5mb3JtYXRpb24gYWJvdXQgY2FsbHMgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKCkgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS4KLSAqIEBwYXJhbSB2aXJ0dWFsX2NhbGxzX2YgVGhlIGluZm9ybWF0aW9uIGFib3V0IGNhbGxzIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfdmlydHVhbF9jYWxsKCkgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KLSAqLwotdm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mKEZJTEUqIGdlbl9jYWxsc19mLCBGSUxFKiB2aXJ0dWFsX2NhbGxzX2YpIHsKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKLQotICBDb3VudEdyZWF0ZXIgaXNfZ3JlYXRlcjsKLQotICAvLyBHcmFiIGJvdGggbG9ja3MgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJpbnQgb3BlcmF0aW9uLAotICAvLyB0byBlbnN1cmUgdGhlIG91dHB1dCBpcyBhIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgYSBzaW5nbGUgcG9pbnQgaW4gdGltZQotICBHdWFyZCBnZW5lcmljX2NhbGxzX2d1YXJkKGdlbmVyaWNfY2FsbHNfbXV0ZXgpOwotICBHdWFyZCB2aXJ0dWFsX2NhbGxzX2d1YXJkKHZpcnR1YWxfY2FsbHNfbXV0ZXgpOwotCi0gIC8vIHdyaXRlIHRoZSBpbmZvIGZyb20gZ2VuZXJpY19jYWxscwotICBwcm9maWxlX3dyaXRlX3Bwcm9mX2ZpbGUoZ2VuX2NhbGxzX2YsIGdlbmVyaWNfY2FsbHMpOwotCi0gIC8vIHdyaXRlIHRoZSBpbmZvIGZyb20gdmlydHVhbF9jYWxscwotICBwcm9maWxlX3dyaXRlX3Bwcm9mX2ZpbGUodmlydHVhbF9jYWxsc19mLCB2aXJ0dWFsX2NhbGxzKTsKLX0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vIFRfR0xPQkFMX1BST0ZJTEVfVklSVFVBTCA+IDAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1NpbXBsZUNhbGxiYWNrLmggYi9saWIvY3BwL3NyYy9hc3luYy9TaW1wbGVDYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE4MzI4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2FzeW5jL1NpbXBsZUNhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jaWZuZGVmIF9USFJJRlRfQVNZTkNfU0lNUExFQ0FMTEJBQ0tfSF8KLSNkZWZpbmUgX1RIUklGVF9BU1lOQ19TSU1QTEVDQUxMQkFDS19IXyAxCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotLyoqCi0gKiBBIHRlbXBsYXRlIGNsYXNzIGZvciBmb3JtaW5nIHNpbXBsZSBtZXRob2QgY2FsbGJhY2tzIHdpdGggZWl0aGVyIGFuIGVtcHR5Ci0gKiBhcmd1bWVudCBsaXN0IG9yIG9uZSBhcmd1bWVudCBvZiBrbm93biB0eXBlLgotICoKLSAqIEZvciBtb3JlIGVmZmljaWVuY3kgd2hlcmUgdHIxOjpmdW5jdGlvbiBpcyBvdmVya2lsbC4KLSAqLwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDLCAgICAgICAgICAgICAgLy8vPCBjbGFzcyB3aG9zZSBtZXRob2Qgd2Ugd2lzaCB0byB3cmFwCi0gICAgICAgICB0eXBlbmFtZSBBID0gdm9pZCwgICAgICAgLy8vPCB0eXBlIG9mIGFyZ3VtZW50Ci0gICAgICAgICB0eXBlbmFtZSBSID0gdm9pZD4gICAgICAgLy8vPCB0eXBlIG9mIHJldHVybiB2YWx1ZQotY2xhc3MgU2ltcGxlQ2FsbGJhY2sgewotICB0eXBlZGVmIFIgKEM6OipjZnB0cl90KShBKTsgICAgIC8vLzwgcG9pbnRlci10by1tZW1iZXItZnVuY3Rpb24gdHlwZQotICBjZnB0cl90IGZwdHJfOyAgICAgICAgICAgICAgICAgIC8vLzwgdGhlIGVtYmVkZGVkIGZ1bmN0aW9uIHBvaW50ZXIKLSAgQyogb2JqXzsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG9iamVjdCB3aG9zZSBmdW5jdGlvbiB3ZSdyZSB3cmFwcGluZwotIHB1YmxpYzoKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBlbXB0eSBjYWxsYmFjayBvYmplY3QuCi0gICAqLwotICBTaW1wbGVDYWxsYmFjaygpIDoKLSAgICBmcHRyXyhOVUxMKSwgb2JqXyhOVUxMKSB7fQotICAvKioKLSAgICogQ29uc3RydWN0IGNhbGxiYWNrIHdyYXBwZXIgZm9yIG1lbWJlciBmdW5jdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGZwdHIgcG9pbnRlci10by1tZW1iZXItZnVuY3Rpb24KLSAgICogQHBhcmFtICJ0aGlzIiBmb3Igb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBjYWxsYmFjawotICAgKi8KLSAgU2ltcGxlQ2FsbGJhY2soY2ZwdHJfdCBmcHRyLCBjb25zdCBDKiBvYmopIDoKLSAgICBmcHRyXyhmcHRyKSwgb2JqXyhjb25zdF9jYXN0PEMqPihvYmopKQotICB7fQotCi0gIC8qKgotICAgKiBNYWtlIGEgY2FsbCB0byB0aGUgbWVtYmVyIGZ1bmN0aW9uIHdlJ3ZlIHdyYXBwZWQuCi0gICAqCi0gICAqIEBwYXJhbSBpIGFyZ3VtZW50IGZvciB0aGUgd3JhcHBlZCBtZW1iZXIgZnVuY3Rpb24KLSAgICogQHJldHVybiB2YWx1ZSBmcm9tIHRoYXQgZnVuY3Rpb24KLSAgICovCi0gIFIgb3BlcmF0b3IoKShBIGkpIGNvbnN0IHsKLSAgICAob2JqXy0+KmZwdHJfKShpKTsKLSAgfQotCi0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9ial8gIT0gTlVMTCAmJiBmcHRyXyAhPSBOVUxMOwotICB9Ci0KLSAgflNpbXBsZUNhbGxiYWNrKCkge30KLX07Ci0KLS8qKgotICogU3BlY2lhbGl6YXRpb24gb2YgU2ltcGxlQ2FsbGJhY2sgZm9yIGVtcHR5IGFyZ3VtZW50IGxpc3QuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIEMsICAgICAgICAgICAgICAvLy88IGNsYXNzIHdob3NlIG1ldGhvZCB3ZSB3aXNoIHRvIHdyYXAKLSAgICAgICAgIHR5cGVuYW1lIFI+ICAgICAgICAgICAgICAvLy88IHR5cGUgb2YgcmV0dXJuIHZhbHVlCi1jbGFzcyBTaW1wbGVDYWxsYmFjazxDLCB2b2lkLCBSPiB7Ci0gIHR5cGVkZWYgUiAoQzo6KmNmcHRyX3QpKCk7ICAgICAgLy8vPCBwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiB0eXBlCi0gIGNmcHRyX3QgZnB0cl87ICAgICAgICAgICAgICAgICAgLy8vPCB0aGUgZW1iZWRkZWQgZnVuY3Rpb24gcG9pbnRlcgotICBDKiBvYmpfOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgb2JqZWN0IHdob3NlIGZ1bmN0aW9uIHdlJ3JlIHdyYXBwaW5nCi0gcHVibGljOgotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIGVtcHR5IGNhbGxiYWNrIG9iamVjdC4KLSAgICovCi0gIFNpbXBsZUNhbGxiYWNrKCkgOgotICAgIGZwdHJfKE5VTEwpLCBvYmpfKE5VTEwpIHt9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBjYWxsYmFjayB3cmFwcGVyIGZvciBtZW1iZXIgZnVuY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBmcHRyIHBvaW50ZXItdG8tbWVtYmVyLWZ1bmN0aW9uCi0gICAqIEBwYXJhbSBvYmogInRoaXMiIGZvciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGNhbGxiYWNrCi0gICAqLwotICBTaW1wbGVDYWxsYmFjayhjZnB0cl90IGZwdHIsIGNvbnN0IEMqIG9iaikgOgotICAgIGZwdHJfKGZwdHIpLCBvYmpfKGNvbnN0X2Nhc3Q8Qyo+KG9iaikpCi0gIHt9Ci0KLSAgLyoqCi0gICAqIE1ha2UgYSBjYWxsIHRvIHRoZSBtZW1iZXIgZnVuY3Rpb24gd2UndmUgd3JhcHBlZC4KLSAgICoKLSAgICogQHJldHVybiB2YWx1ZSBmcm9tIHRoYXQgZnVuY3Rpb24KLSAgICovCi0gIFIgb3BlcmF0b3IoKSgpIGNvbnN0IHsKLSAgICAob2JqXy0+KmZwdHJfKSgpOwotICB9Ci0KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gb2JqXyAhPSBOVUxMICYmIGZwdHJfICE9IE5VTEw7Ci0gIH0KLQotICB+U2ltcGxlQ2FsbGJhY2soKSB7fQotfTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8qICFfVEhSSUZUX0FTWU5DX1NJTVBMRUNBTExCQUNLX0hfICovCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE1MDNlLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KLSNkZWZpbmUgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXyAxCi0KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgInRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLWNsYXNzIFRBc3luY0J1ZmZlclByb2Nlc3NvciB7Ci0gcHVibGljOgotICAvLyBQcm9jZXNzIGRhdGEgaW4gImluIiwgcHV0dGluZyB0aGUgcmVzdWx0IGluICJvdXQiLgotICAvLyBDYWxsIF9yZXR1cm4odHJ1ZSkgd2hlbiBkb25lLCBvciBfcmV0dXJuKGZhbHNlKSB0bwotICAvLyBmb3JjZWZ1bGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIChpZiBhcHBsaWNhYmxlKS4KLSAgLy8gImluIiBhbmQgIm91dCIgc2hvdWxkIGJlIFRNZW1vcnlCdWZmZXIgb3Igc2ltaWxhciwKLSAgLy8gbm90IGEgd3JhcHBlciBhcm91bmQgYSBzb2NrZXQuCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmMDJmZS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFzeW5jL1RBc3luY0NoYW5uZWwuaD4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotCi1ib29sIFRBc3luY0NoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKCk+IHNlbmRfZG9uZSA9Ci0gICAgc3RkOjp0cjE6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOwotCi0gIHJldHVybiBzZW5kTWVzc2FnZShzZW5kX2RvbmUsIHNlbmRCdWYpOwotfQotCi19fX0gIC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWNkNDE5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY0NoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KLSNkZWZpbmUgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfIDEKLQotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLWNsYXNzIFRNZW1vcnlCdWZmZXI7Ci19fX0KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLQotY2xhc3MgVEFzeW5jVHJhbnNwb3J0OwotCi1jbGFzcyBUQXN5bmNDaGFubmVsIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZENhbGxiYWNrOwotCi0gIHZpcnR1YWwgflRBc3luY0NoYW5uZWwoKSB7fQotCi0gIC8vIGlzIHRoZSBjaGFubmVsIGluIGEgZ29vZCBzdGF0ZT8KLSAgdmlydHVhbCBib29sIGdvb2QoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBlcnJvcigpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIHRpbWVkT3V0KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBTZW5kIGEgbWVzc2FnZSBvdmVyIHRoZSBjaGFubmVsLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlIGlmZiB0aGUgY29iIGhhcyBiZWVuIG9yIHdpbGwgYmUgY2FsbGVkLCBlbHNlIGZhbHNlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKLQotICAvKioKLSAgICogUmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgY2hhbm5lbC4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSBpZmYgdGhlIGNvYiBoYXMgYmVlbiBvciB3aWxsIGJlIGNhbGxlZCwgZWxzZSBmYWxzZQotICAgKi8KLSAgdmlydHVhbCBib29sIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIGNoYW5uZWwgYW5kIHJlY2VpdmUgYSByZXNwb25zZS4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSBpZmYgdGhlIGNvYiBoYXMgYmVlbiBvciB3aWxsIGJlIGNhbGxlZCwgZWxzZSBmYWxzZQotICAgKi8KLSAgdmlydHVhbCBib29sIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjU0MjguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KLSNkZWZpbmUgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8gMQotCi0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLS8qKgotICogQXN5bmMgdmVyc2lvbiBvZiBhIFRQcm9jZXNzb3IuICBJdCBpcyBub3QgZXhwZWN0ZWQgdG8gY29tcGxldGUgYnkgdGhlIHRpbWUKLSAqIHRoZSBjYWxsIHRvIHByb2Nlc3MgcmV0dXJucy4gIEluc3RlYWQsIGl0IGNhbGxzIGEgY29iIHRvIHNpZ25hbCBjb21wbGV0aW9uLgotICovCi0KLWNsYXNzIFRFdmVudFNlcnZlcjsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotCi1jbGFzcyBUQXN5bmNQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yKCkge30KLQotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7Ci0KLSAgdm9pZCBwcm9jZXNzKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8pIHsKLSAgICByZXR1cm4gcHJvY2VzcyhfcmV0dXJuLCBpbywgaW8pOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBldmVudEhhbmRsZXJfOwotICB9Ci0KLSAgdm9pZCBzZXRFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7Ci0gICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKLSAgfQotCi0gIGNvbnN0IFRFdmVudFNlcnZlciogZ2V0QXN5bmNTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIGFzeW5jU2VydmVyXzsKLSAgfQotIHByb3RlY3RlZDoKLSAgVEFzeW5jUHJvY2Vzc29yKCkge30KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwotICBjb25zdCBURXZlbnRTZXJ2ZXIqIGFzeW5jU2VydmVyXzsKLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgVEV2ZW50U2VydmVyOwotICB2b2lkIHNldEFzeW5jU2VydmVyKGNvbnN0IFRFdmVudFNlcnZlciogc2VydmVyKSB7Ci0gICAgYXN5bmNTZXJ2ZXJfID0gc2VydmVyOwotICB9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLS8vIFhYWCBJJ20gbGF6eSBmb3Igbm93Ci1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb2Nlc3NvcjsKLX19Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTg2ZTAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCIKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotCi12b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKAotICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IG9idWYpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKLSAgcmV0dXJuIHVuZGVybHlpbmdfLT5wcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmJpbmQoCi0gICAgICAgICZUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoLAotICAgICAgICBfcmV0dXJuLAotICAgICAgICBvcHJvdCwKLSAgICAgICAgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgaXByb3QsIG9wcm90KTsKLX0KLQotLyogc3RhdGljICovIHZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCgKLSAgICBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QsCi0gICAgYm9vbCBoZWFsdGh5KSB7Ci0gICh2b2lkKSBvcHJvdDsKLSAgLy8gVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gdG8gaG9sZCBhIHJlZmVyZW5jZSB0byBvcHJvdC4KLSAgcmV0dXJuIF9yZXR1cm4oaGVhbHRoeSk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM3MThiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UTkFNRV9NRV9IXwotI2RlZmluZSBfVEhSSUZUX1ROQU1FX01FX0hfIDEKLQotI2luY2x1ZGUgIlRBc3luY1Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgIlRBc3luY0J1ZmZlclByb2Nlc3Nvci5oIgotI2luY2x1ZGUgInByb3RvY29sL1RQcm90b2NvbC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLWNsYXNzIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yIDogcHVibGljIFRBc3luY0J1ZmZlclByb2Nlc3NvciB7Ci0gcHVibGljOgotICBUQXN5bmNQcm90b2NvbFByb2Nlc3NvcigKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZywKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3QpCi0gICAgOiB1bmRlcmx5aW5nXyh1bmRlcmx5aW5nKQotICAgICwgcGZhY3RfKHBmYWN0KQotICB7fQotCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgZmluaXNoKAotICAgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKLSAgICAgIGJvb2wgaGVhbHRoeSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVE5BTUVfTUVfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NzZhMS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVEV2aHR0cENsaWVudENoYW5uZWwuaCIKLSNpbmNsdWRlIDxldmh0dHAuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotCi0KLVRFdmh0dHBDbGllbnRDaGFubmVsOjpURXZodHRwQ2xpZW50Q2hhbm5lbCgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAotICAgIGludCBwb3J0LAotICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYikKLSAgOiBob3N0Xyhob3N0KQotICAsIHBhdGhfKHBhdGgpCi0gICwgcmVjdkJ1Zl8oTlVMTCkKLSAgLCBjb25uXyhOVUxMKQotewotICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX25ldyhhZGRyZXNzLCBwb3J0KTsKLSAgaWYgKGNvbm5fID09IE5VTEwpIHsKLSAgICBhYm9ydCgpOyAvLyBYWFgKLSAgfQotICBldmh0dHBfY29ubmVjdGlvbl9zZXRfYmFzZShjb25uXywgZWIpOwotfQotCi0KLVRFdmh0dHBDbGllbnRDaGFubmVsOjp+VEV2aHR0cENsaWVudENoYW5uZWwoKSB7Ci0gIGlmIChjb25uXyAhPSBOVUxMKSB7Ci0gICAgZXZodHRwX2Nvbm5lY3Rpb25fZnJlZShjb25uXyk7Ci0gIH0KLX0KLQotCi1ib29sIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoCi0gICAgY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKLSAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIGNvYl8gPSBjb2I7Ci0gIHJlY3ZCdWZfID0gcmVjdkJ1ZjsKLQotICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSA9IGV2aHR0cF9yZXF1ZXN0X25ldyhyZXNwb25zZSwgdGhpcyk7Ci0gIGlmIChyZXEgPT0gTlVMTCkgewotICAgIGFib3J0KCk7IC8vIFhYWAotICB9Ci0KLSAgaW50IHJ2OwotCi0gIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkhvc3QiLCBob3N0Xy5jX3N0cigpKTsKLSAgaWYgKHJ2ICE9IDApIHsKLSAgICBhYm9ydCgpOyAvLyBYWFgKLSAgfQotCi0gIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICBpZiAocnYgIT0gMCkgewotICAgIGFib3J0KCk7IC8vIFhYWAotICB9Ci0KLSAgdWludDhfdCogb2J1ZjsKLSAgdWludDMyX3Qgc3o7Ci0gIHNlbmRCdWYtPmdldEJ1ZmZlcigmb2J1ZiwgJnN6KTsKLSAgcnYgPSBldmJ1ZmZlcl9hZGQocmVxLT5vdXRwdXRfYnVmZmVyLCBvYnVmLCBzeik7Ci0gIGlmIChydiAhPSAwKSB7Ci0gICAgYWJvcnQoKTsgLy8gWFhYCi0gIH0KLQotICBydiA9IGV2aHR0cF9tYWtlX3JlcXVlc3QoY29ubl8sIHJlcSwgRVZIVFRQX1JFUV9QT1NULCBwYXRoXy5jX3N0cigpKTsKLSAgaWYgKHJ2ICE9IDApIHsKLSAgICBhYm9ydCgpOyAvLyBYWFgKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLWJvb2wgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRNZXNzYWdlKAotICAgIGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSB7Ci0gIGFib3J0KCk7IC8vIFhYWAotfQotCi0KLWJvb2wgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlKAotICAgIGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSB7Ci0gIGFib3J0KCk7IC8vIFhYWAotfQotCi0KLXZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OmZpbmlzaChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgewotICBpZiAocmVxID09IE5VTEwpIHsKLSAgICByZXR1cm4gY29iXygpOwotICB9IGVsc2UgaWYgKHJlcS0+cmVzcG9uc2VfY29kZSAhPSAyMDApIHsKLSAgICByZXR1cm4gY29iXygpOwotICB9Ci0gIHJlY3ZCdWZfLT5yZXNldEJ1ZmZlcigKLSAgICAgIEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLAotICAgICAgRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSk7Ci0gIHJldHVybiBjb2JfKCk7Ci19Ci0KLQotLyogc3RhdGljICovIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpIHsKLSAgVEV2aHR0cENsaWVudENoYW5uZWwqIHNlbGYgPSAoVEV2aHR0cENsaWVudENoYW5uZWwqKWFyZzsKLSAgc2VsZi0+ZmluaXNoKHJlcSk7Ci19Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmM0YjMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8KLSNkZWZpbmUgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlICJUQXN5bmNDaGFubmVsLmgiCi0KLXN0cnVjdCBldmVudF9iYXNlOwotc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uOwotc3RydWN0IGV2aHR0cF9yZXF1ZXN0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotY2xhc3MgVE1lbW9yeUJ1ZmZlcjsKLX19fQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLWNsYXNzIFRFdmh0dHBDbGllbnRDaGFubmVsIDogcHVibGljIFRBc3luY0NoYW5uZWwgewotIHB1YmxpYzoKLSAgdXNpbmcgVEFzeW5jQ2hhbm5lbDo6Vm9pZENhbGxiYWNrOwotCi0gIFRFdmh0dHBDbGllbnRDaGFubmVsKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYik7Ci0gIH5URXZodHRwQ2xpZW50Q2hhbm5lbCgpOwotCi0gIHZpcnR1YWwgYm9vbCBzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKTsKLQotICB2aXJ0dWFsIGJvb2wgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOwotICB2aXJ0dWFsIGJvb2wgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOwotCi0gIHZvaWQgZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKLQotICAvL1hYWAotICB2aXJ0dWFsIGJvb2wgZ29vZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCBib29sIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIHRpbWVkT3V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIHJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpOwotCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotICBzdGQ6OnN0cmluZyBwYXRoXzsKLSAgVm9pZENhbGxiYWNrIGNvYl87Ci0gIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWZfOwotICBzdHJ1Y3QgZXZodHRwX2Nvbm5lY3Rpb24qIGNvbm5fOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5NzU5Ny4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJURXZodHRwU2VydmVyLmgiCi0jaW5jbHVkZSAiVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCi0jaW5jbHVkZSA8ZXZodHRwLmg+Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKLQotCi1zdHJ1Y3QgVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQgewotICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaWJ1ZjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb2J1ZjsKLQotICBSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7Ci19OwotCi0KLVRFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpCi0gIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpCi0gICwgZWJfKE5VTEwpCi0gICwgZWhfKE5VTEwpCi17fQotCi0KLVRFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KQotICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKQotICAsIGViXyhOVUxMKQotICAsIGVoXyhOVUxMKQotewotICAvLyBDcmVhdGUgZXZlbnRfYmFzZSBhbmQgZXZodHRwLgotICBlYl8gPSBldmVudF9iYXNlX25ldygpOwotICBpZiAoZWJfID09IE5VTEwpIHsKLSAgICBhYm9ydCgpOyAgLy8gWFhYCi0gIH0KLSAgZWhfID0gZXZodHRwX25ldyhlYl8pOwotICBpZiAoZWhfID09IE5VTEwpIHsKLSAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKLSAgICBhYm9ydCgpOyAgLy8gWFhYCi0gIH0KLQotICAvLyBCaW5kIHRvIHBvcnQuCi0gIGludCByZXQgPSBldmh0dHBfYmluZF9zb2NrZXQoZWhfLCBOVUxMLCBwb3J0KTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBldmh0dHBfZnJlZShlaF8pOwotICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOwotICB9Ci0KLSAgLy8gUmVnaXN0ZXIgYSBoYW5kbGVyLiAgSWYgeW91IHVzZSB0aGUgb3RoZXIgY29uc3RydWN0b3IsCi0gIC8vIHlvdSB3aWxsIHdhbnQgdG8gZG8gdGhpcyB5b3Vyc2VsZi4KLSAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHVucmVnaXN0ZXIgYmVmb3JlIGRlc3RvcnlpbmcgdGhpcyBURXZodHRwU2VydmVyLgotICBldmh0dHBfc2V0X2NiKGVoXywgIi8iLCByZXF1ZXN0LCAodm9pZCopdGhpcyk7Ci19Ci0KLQotVEV2aHR0cFNlcnZlcjo6flRFdmh0dHBTZXJ2ZXIoKSB7Ci0gIGlmIChlaF8gIT0gTlVMTCkgewotICAgIGV2aHR0cF9mcmVlKGVoXyk7Ci0gIH0KLSAgaWYgKGViXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7Ci0gIH0KLX0KLQotCi1pbnQgVEV2aHR0cFNlcnZlcjo6c2VydmUoKSB7Ci0gIGlmIChlYl8gPT0gTlVMTCkgewotICAgIGFib3J0KCk7ICAvLyBYWFgKLSAgfQotICByZXR1cm4gZXZlbnRfYmFzZV9kaXNwYXRjaChlYl8pOwotfQotCi0KLVRFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0OjpSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgOiByZXEocmVxKQotICAsIGlidWYobmV3IFRNZW1vcnlCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksIEVWQlVGRkVSX0xFTkdUSChyZXEtPmlucHV0X2J1ZmZlcikpKQotICAsIG9idWYobmV3IFRNZW1vcnlCdWZmZXIoKSkKLXt9Ci0KLQotdm9pZCBURXZodHRwU2VydmVyOjpyZXF1ZXN0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBzZWxmKSB7Ci0gIHN0YXRpY19jYXN0PFRFdmh0dHBTZXJ2ZXIqPihzZWxmKS0+cHJvY2VzcyhyZXEpOwotfQotCi0KLXZvaWQgVEV2aHR0cFNlcnZlcjo6cHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgewotICBSZXF1ZXN0Q29udGV4dCogY3R4ID0gbmV3IFJlcXVlc3RDb250ZXh0KHJlcSk7Ci0gIHJldHVybiBwcm9jZXNzb3JfLT5wcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmJpbmQoCi0gICAgICAgICZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKLSAgICAgICAgdGhpcywKLSAgICAgICAgY3R4LAotICAgICAgICBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSksCi0gICAgICBjdHgtPmlidWYsCi0gICAgICBjdHgtPm9idWYpOwotfQotCi0KLXZvaWQgVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKSB7Ci0gIHN0ZDo6YXV0b19wdHI8UmVxdWVzdENvbnRleHQ+IHB0cihjdHgpOwotCi0gIGludCBjb2RlID0gMjAwOwotICBjb25zdCBjaGFyKiByZWFzb24gPSAiT0siOwotCi0gIGludCBydiA9IGV2aHR0cF9hZGRfaGVhZGVyKGN0eC0+cmVxLT5vdXRwdXRfaGVhZGVycywgIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICBpZiAocnYgIT0gMCkgewotICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KLSAgfQotCi0gIHN0cnVjdCBldmJ1ZmZlciogYnVmID0gZXZidWZmZXJfbmV3KCk7Ci0gIGlmIChidWYgPT0gTlVMTCkgewotICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBvYnVmOwotICAgIHVpbnQzMl90IHN6OwotICAgIGN0eC0+b2J1Zi0+Z2V0QnVmZmVyKCZvYnVmLCAmc3opOwotICAgIGludCByZXQgPSBldmJ1ZmZlcl9hZGQoYnVmLCBvYnVmLCBzeik7Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAvLyBUT0RPOiBMb2cgYW4gZXJyb3IuCi0gICAgfQotICB9Ci0KLSAgZXZodHRwX3NlbmRfcmVwbHkoY3R4LT5yZXEsIGNvZGUsIHJlYXNvbiwgYnVmKTsKLSAgaWYgKGJ1ZiAhPSBOVUxMKSB7Ci0gICAgZXZidWZmZXJfZnJlZShidWYpOwotICB9Ci19Ci0KLQotc3RydWN0IGV2ZW50X2Jhc2UqIFRFdmh0dHBTZXJ2ZXI6OmdldEV2ZW50QmFzZSgpIHsKLSAgcmV0dXJuIGViXzsKLX0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy9hc3luYy9URXZodHRwU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzZmZmIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvYXN5bmMvVEV2aHR0cFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotc3RydWN0IGV2ZW50X2Jhc2U7Ci1zdHJ1Y3QgZXZodHRwOwotc3RydWN0IGV2aHR0cF9yZXF1ZXN0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7Ci0KLWNsYXNzIFRBc3luY0J1ZmZlclByb2Nlc3NvcjsKLQotY2xhc3MgVEV2aHR0cFNlcnZlciB7Ci0gcHVibGljOgotICAvKioKLSAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciBmb3IgdXNlIHdpdGggYW4gZXh0ZXJuYWwgZXZodHRwIGluc3RhbmNlLgotICAgKiBNdXN0IGJlIG1hbnVhbGx5IGluc3RhbGxlZCB3aXRoIGV2aHR0cF9zZXRfY2IsIHVzaW5nCi0gICAqIFRFdmh0dHBTZXJ2ZXI6OnJlcXVlc3QgYXMgdGhlIGNhbGxiYWNrIGFuZCB0aGUKLSAgICogYWRkcmVzcyBvZiB0aGUgc2VydmVyIGFzIHRoZSBleHRyYSBhcmcuCi0gICAqIERvIG5vdCBjYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIuCi0gICAqLwotICBURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciB3aXRoIGFuIGVtYmVkZGVkIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cCwKLSAgICogbGlzdGVuaW5nIG9uIHBvcnQgYW5kIHJlc3BvbmRpbmcgb24gdGhlIGVuZHBvaW50ICIvIi4KLSAgICogQ2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyIHRvIHNlcnZlIGZvcmV2ZXIuCi0gICAqLwotICBURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCk7Ci0KLSAgflRFdmh0dHBTZXJ2ZXIoKTsKLQotICBzdGF0aWMgdm9pZCByZXF1ZXN0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBzZWxmKTsKLSAgaW50IHNlcnZlKCk7Ci0KLSAgc3RydWN0IGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IFJlcXVlc3RDb250ZXh0OwotCi0gIHZvaWQgcHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7Ci0gIHZvaWQgY29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIHN0cnVjdCBldmVudF9iYXNlKiBlYl87Ci0gIHN0cnVjdCBldmh0dHAqIGVoXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NjYyOS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXyAxCi0KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotY2xhc3MgTm9TdWNoVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKLQotY2xhc3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307Ci0KLWNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKLQotY2xhc3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OwotCi1jbGFzcyBUaW1lZE91dEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci1wdWJsaWM6Ci0gIFRpbWVkT3V0RXhjZXB0aW9uKCk6VEV4Y2VwdGlvbigiVGltZWRPdXRFeGNlcHRpb24iKXt9OwotICBUaW1lZE91dEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSApIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Ci19OwotCi1jbGFzcyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLXB1YmxpYzoKLSAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpOlRFeGNlcHRpb24oIlRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24iKXt9OwotICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlICkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KLX07Ci0KLWNsYXNzIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLXB1YmxpYzoKLSAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpIHt9Ci0KLSAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgICAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Y2QzZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQotCi0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+Ci0jaW5jbHVkZSAidGhyaWZ0L2xpYi9jcHAvY29uY3VycmVuY3kvVGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBDb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIFJ1bm5hYmxlIHRoYXQgd2lsbCBleGVjdXRlIGFyYml0cmFyeSBjYWxsYmFja3MuCi0gKiBJbnRlcmZhY2VzIGFyZSBwcm92aWRlZCB0byBhY2NlcHQgYm90aCBhIGdlbmVyaWMgJ3ZvaWQodm9pZCknIGNhbGxiYWNrLCBhbmQKLSAqIGEgJ3ZvaWQqICh2b2lkKiknIHB0aHJlYWRfY3JlYXRlLXN0eWxlIGNhbGxiYWNrLgotICoKLSAqIEV4YW1wbGUgdXNlOgotICogIHZvaWQqIG15X3RocmVhZF9tYWluKHZvaWQqIGFyZyk7Ci0gKiAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiBmYWN0b3J5ID0gLi4uOwotICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIG15X3RocmVhZF9tYWluIG9uY2U6Ci0gKiAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9Ci0gKiAgICBmYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4oCi0gKiAgICAgIG5ldyBGdW5jdGlvblJ1bm5lcihteV90aHJlYWRfbWFpbiwgc29tZV9hcmd1bWVudCkpKTsKLSAqICB0aHJlYWQtPnN0YXJ0KCk7Ci0gKgotICogIGJvb2wgQTo6Zm9vKCk7Ci0gKiAgQSogYSA9IG5ldyBBKCk7Ci0gKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgYS5mb28oKSBldmVyeSAxMDAgbWlsbGlzZWNvbmRzOgotICogIGZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPigKLSAqICAgIG5ldyBGdW5jdGlvblJ1bm5lcihzdGQ6OnRyMTo6YmluZCgmQTo6Zm9vLCBhKSwgMTAwKSkpLT5zdGFydCgpOwotICoKLSAqLwotCi1jbGFzcyBGdW5jdGlvblJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gcHVibGljOgotICAvLyBUaGlzIGlzIHRoZSB0eXBlIG9mIGNhbGxiYWNrICdwdGhyZWFkX2NyZWF0ZSgpJyBleHBlY3RzLgotICB0eXBlZGVmIHZvaWQqICgqUHRocmVhZEZ1bmNQdHIpKHZvaWQgKmFyZyk7Ci0gIC8vIFRoaXMgYSBmdWxseS1nZW5lcmljIHZvaWQodm9pZCkgY2FsbGJhY2sgZm9yIGN1c3RvbSBiaW5kaW5ncy4KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkRnVuYzsKLQotICB0eXBlZGVmIHN0ZDo6dHIxOjpmdW5jdGlvbjxib29sKCk+IEJvb2xGdW5jOwotCi0gIC8qKgotICAgKiBHaXZlbiBhICdwdGhyZWFkX2NyZWF0ZScgc3R5bGUgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbAotICAgKiBleGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjay4gIE5vdGUgdGhhdCB0aGUgJ3ZvaWQqJyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KLSAgICovCi0gIEZ1bmN0aW9uUnVubmVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykKLSAgIDogZnVuY18oc3RkOjp0cjE6OmJpbmQoZnVuYywgYXJnKSksIHJlcEZ1bmNfKDApCi0gIHsgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGdlbmVyaWMgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlIGl0LgotICAgKi8KLSAgRnVuY3Rpb25SdW5uZXIoY29uc3QgVm9pZEZ1bmMmIGNvYikKLSAgIDogZnVuY18oY29iKSwgcmVwRnVuY18oMCkKLSAgeyB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgYm9vbCBmb28oLi4uKSB0eXBlIGNhbGxiYWNrLCBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUKLSAgICogdGhlIGNhbGxiYWNrIHJlcGVhdGVkbHkgd2l0aCAnaW50ZXJ2YWxNcycgbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlIGNhbGxzLAotICAgKiB1bnRpbCBpdCByZXR1cm5zIGZhbHNlLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBpbnRlcnZhbCBiZXR3ZWVuIGNhbGxzIHdpbGwKLSAgICogYmUgaW50ZXJ2YWxNcyBwbHVzIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBjYWxsYmFjay4KLSAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IEJvb2xGdW5jJiBjb2IsIGludCBpbnRlcnZhbE1zKQotICAgOiBmdW5jXygwKSwgcmVwRnVuY18oY29iKSwgaW50ZXJ2YWxNc18oaW50ZXJ2YWxNcykKLSAgeyB9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgaWYgKHJlcEZ1bmNfKSB7Ci0gICAgICB3aGlsZShyZXBGdW5jXygpKSB7Ci0gICAgICAgIHVzbGVlcChpbnRlcnZhbE1zXyoxMDAwKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZnVuY18oKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFZvaWRGdW5jIGZ1bmNfOwotICBCb29sRnVuYyByZXBGdW5jXzsKLSAgaW50IGludGVydmFsTXNfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQzZWY3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLQotLyoqCi0gKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBQT1NJWCBwdGhyZWFkIGxpYnJhcnkKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNb25pdG9yOjpJbXBsIHsKLQotIHB1YmxpYzoKLQotICBJbXBsKCkKLSAgICAgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksCi0gICAgICAgbXV0ZXhfKE5VTEwpLAotICAgICAgIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKLSAgICBpbml0KG93bmVkTXV0ZXhfLmdldCgpKTsKLSAgfQotCi0gIEltcGwoTXV0ZXgqIG11dGV4KQotICAgICA6IG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0gICAgaW5pdChtdXRleCk7Ci0gIH0KLQotICBJbXBsKE1vbml0b3IqIG1vbml0b3IpCi0gICAgIDogbXV0ZXhfKE5VTEwpLAotICAgICAgIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsKLSAgICBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOwotICB9Ci0KLSAgfkltcGwoKSB7IGNsZWFudXAoKTsgfQotCi0gIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KLSAgdm9pZCBsb2NrKCkgeyBtdXRleCgpLmxvY2soKTsgfQotICB2b2lkIHVubG9jaygpIHsgbXV0ZXgoKS51bmxvY2soKTsgfQotCi0gIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLSAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAotICAgIGFzc2VydCh0aW1lb3V0ID49IDBMTCk7Ci0gICAgaWYgKHRpbWVvdXQgPT0gMExMKSB7Ci0gICAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF93YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwpOwotICAgICAgYXNzZXJ0KGlyZXQgPT0gMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOwotICAgICAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgICAgVXRpbDo6dG9UaW1lc3BlYyhhYnN0aW1lLCBub3cgKyB0aW1lb3V0KTsKLSAgICAgIGludCByZXN1bHQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZwdGhyZWFkX2NvbmRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFic3RpbWUpOwotICAgICAgaWYgKHJlc3VsdCA9PSBFVElNRURPVVQpIHsKLSAgICAgICAgLy8gcHRocmVhZF9jb25kX3RpbWVkd2FpdCBoYXMgYmVlbiBvYnNlcnZlZCB0byByZXR1cm4gZWFybHkgb24KLSAgICAgICAgLy8gdmFyaW91cyBwbGF0Zm9ybXMsIHNvIGNvbW1lbnQgb3V0IHRoaXMgYXNzZXJ0LgotICAgICAgICAvL2Fzc2VydChVdGlsOjpjdXJyZW50VGltZSgpID49IChub3cgKyB0aW1lb3V0KSk7Ci0gICAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBub3RpZnkoKSB7Ci0gICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKLSAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9zaWduYWwoJnB0aHJlYWRfY29uZF8pOwotICAgIGFzc2VydChpcmV0ID09IDApOwotICB9Ci0KLSAgdm9pZCBub3RpZnlBbGwoKSB7Ci0gICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKLSAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnB0aHJlYWRfY29uZF8pOwotICAgIGFzc2VydChpcmV0ID09IDApOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKLSAgICBtdXRleF8gPSBtdXRleDsKLQotICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmcHRocmVhZF9jb25kXywgTlVMTCkgPT0gMCkgewotICAgICAgY29uZEluaXRpYWxpemVkXyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFjb25kSW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBjbGVhbnVwKCk7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgY2xlYW51cCgpIHsKLSAgICBpZiAoY29uZEluaXRpYWxpemVkXykgewotICAgICAgY29uZEluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcHRocmVhZF9jb25kXyk7Ci0gICAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICBzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKLSAgTXV0ZXgqIG11dGV4XzsKLQotICBtdXRhYmxlIHB0aHJlYWRfY29uZF90IHB0aHJlYWRfY29uZF87Ci0gIG11dGFibGUgYm9vbCBjb25kSW5pdGlhbGl6ZWRfOwotfTsKLQotTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkge30KLU1vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkge30KLU1vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkge30KLQotTW9uaXRvcjo6fk1vbml0b3IoKSB7IGRlbGV0ZSBpbXBsXzsgfQotCi1NdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bXV0ZXgoKTsgfQotCi12b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7IGltcGxfLT5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQotCi12b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7IGltcGxfLT53YWl0KHRpbWVvdXQpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgeyBpbXBsXy0+bm90aWZ5KCk7IH0KLQotdm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7IGltcGxfLT5ub3RpZnlBbGwoKTsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTExOWQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8gMQotCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiTXV0ZXguaCIKLQotI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBBIG1vbml0b3IgaXMgYSBjb21iaW5hdGlvbiBtdXRleCBhbmQgY29uZGl0aW9uLWV2ZW50LiAgV2FpdGluZyBhbmQKLSAqIG5vdGlmeWluZyBjb25kaXRpb24gZXZlbnRzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBvd24gdGhlIG11dGV4LiAgTXV0ZXgKLSAqIGxvY2sgYW5kIHVubG9jayBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgaW5kZXBlbmRlbnRseSBvZiBjb25kaXRpb24KLSAqIGV2ZW50cy4gIFRoaXMgaXMgbW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuT2JqZWN0IG11bHRpLXRocmVhZAotICogb3BlcmF0aW9ucy4KLSAqCi0gKiBOb3RlIHRoZSBNb25pdG9yIGNhbiBjcmVhdGUgYSBuZXcsIGludGVybmFsIG11dGV4OyBhbHRlcm5hdGl2ZWx5LCBhCi0gKiBzZXBhcmF0ZSBNdXRleCBjYW4gYmUgcGFzc2VkIGluIGFuZCB0aGUgTW9uaXRvciB3aWxsIHJlLXVzZSBpdCB3aXRob3V0Ci0gKiB0YWtpbmcgb3duZXJzaGlwLiAgSXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotICogTXV0ZXggaXMgbm90IGRlYWxsb2NhdGVkIGJlZm9yZSB0aGUgTW9uaXRvci4KLSAqCi0gKiBOb3RlIHRoYXQgYWxsIG1ldGhvZHMgYXJlIGNvbnN0LiAgTW9uaXRvcnMgaW1wbGVtZW50IGxvZ2ljYWwgY29uc3RuZXNzLCBub3QKLSAqIGJpdCBjb25zdG5lc3MuICBUaGlzIGFsbG93cyBjb25zdCBtZXRob2RzIHRvIGNhbGwgbW9uaXRvciBtZXRob2RzIHdpdGhvdXQKLSAqIG5lZWRpbmcgdG8gY2FzdCBhd2F5IGNvbnN0bmVzcyBvciBjaGFuZ2UgdG8gbm9uLWNvbnN0IHNpZ25hdHVyZXMuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTW9uaXRvciA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gcHVibGljOgotICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRleCwgYW5kIHRha2VzIG93bmVyc2hpcCBvZiBpdC4gKi8KLSAgTW9uaXRvcigpOwotCi0gIC8qKiBVc2VzIHRoZSBwcm92aWRlZCBtdXRleCB3aXRob3V0IHRha2luZyBvd25lcnNoaXAuICovCi0gIGV4cGxpY2l0IE1vbml0b3IoTXV0ZXgqIG11dGV4KTsKLQotICAvKiogVXNlcyB0aGUgbXV0ZXggaW5zaWRlIHRoZSBwcm92aWRlZCBNb25pdG9yIHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcC4gKi8KLSAgZXhwbGljaXQgTW9uaXRvcihNb25pdG9yKiBtb25pdG9yKTsKLQotICAvKiogRGVhbGxvY2F0ZXMgdGhlIG11dGV4IG9ubHkgaWYgd2Ugb3duIGl0LiAqLwotICB2aXJ0dWFsIH5Nb25pdG9yKCk7Ci0KLSAgTXV0ZXgmIG11dGV4KCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0PTBMTCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIG5vdGlmeSgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBub3RpZnlBbGwoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0KLSAgY2xhc3MgSW1wbDsKLQotICBJbXBsKiBpbXBsXzsKLX07Ci0KLWNsYXNzIFN5bmNocm9uaXplZCB7Ci0gcHVibGljOgotIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yKiBtb25pdG9yKSA6IGcobW9uaXRvci0+bXV0ZXgoKSkgeyB9Ci0gU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3ImIG1vbml0b3IpIDogZyhtb25pdG9yLm11dGV4KCkpIHsgfQotCi0gcHJpdmF0ZToKLSAgR3VhcmQgZzsKLX07Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1MjQ1Mi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTXV0ZXguaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0KLXN0YXRpYyBzaWdfYXRvbWljX3QgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gMDsKLXN0YXRpYyBNdXRleFdhaXRDYWxsYmFjayBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gMDsKLQotdm9sYXRpbGUgc3RhdGljIHNpZ19hdG9taWNfdCBtdXRleFByb2ZpbGluZ0NvdW50ZXIgPSAwOwotCi12b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gcHJvZmlsaW5nU2FtcGxlUmF0ZTsKLSAgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IGNhbGxiYWNrOwotfQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpIFwKLSAgICBpbnQ2NF90IF9sb2NrX3N0YXJ0VGltZSA9IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCk7Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBpZiAoX2xvY2tfc3RhcnRUaW1lID4gMCkgeyBcCi0gICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsgXAotICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBlbmRUaW1lIC0gX2xvY2tfc3RhcnRUaW1lKTsgXAotICAgIH0gXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBwcm9maWxlVGltZV8gPSBfbG9ja19zdGFydFRpbWU7IFwKLSAgICBpZiAocHJvZmlsZVRpbWVfID4gMCkgeyBcCi0gICAgICBwcm9maWxlVGltZV8gPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKSAtIHByb2ZpbGVUaW1lXzsgXAotICAgIH0gXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkgXAotICBpbnQ2NF90IF90ZW1wX3Byb2ZpbGVUaW1lID0gcHJvZmlsZVRpbWVfOyBcCi0gIHByb2ZpbGVUaW1lXyA9IDA7Ci0KLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpIFwKLSAgZG8geyBcCi0gICAgaWYgKF90ZW1wX3Byb2ZpbGVUaW1lID4gMCkgeyBcCi0gICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIF90ZW1wX3Byb2ZpbGVUaW1lKTsgXAotICAgIH0gXAotICB9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIGludDY0X3QgbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKSB7Ci0gIGlmIChtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgJiYgbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykgewotICAgIC8vIFRoaXMgYmxvY2sgaXMgdW5zeW5jaHJvbml6ZWQsIGJ1dCBzaG91bGQgcHJvZHVjZSBhIHJlYXNvbmFibGUgc2FtcGxpbmcKLSAgICAvLyByYXRlIG9uIG1vc3QgYXJjaGl0ZWN0dXJlcy4gIFRoZSBtYWluIHJhY2UgY29uZGl0aW9ucyBhcmUgdGhlIGdhcAotICAgIC8vIGJldHdlZW4gdGhlIGRlY3JlbWVudCBhbmQgdGhlIHRlc3QsIHRoZSBub24tYXRvbWljaXR5IG9mIGRlY3JlbWVudCwgYW5kCi0gICAgLy8gcG90ZW50aWFsIGNhY2hpbmcgb2YgZGlmZmVyZW50IHZhbHVlcyBhdCBkaWZmZXJlbnQgQ1BVcy4KLSAgICAvLwotICAgIC8vIC0gaWYgdHdvIGRlY3JlbWVudHMgcmFjZSwgdGhlIGxpa2VsaWVzdCByZXN1bHQgaXMgdGhhdCB0aGUgY291bnRlcgotICAgIC8vICAgICAgZGVjcmVtZW50cyBzbG93bHkgKHBlcmhhcHMgbXVjaCBtb3JlIHNsb3dseSkgdGhhbiBpbnRlbmRlZC4KLSAgICAvLwotICAgIC8vIC0gbWFueSB0aHJlYWRzIGNvdWxkIHBvdGVudGlhbGx5IGRlY3JlbWVudCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBjb3VudGVyCi0gICAgLy8gICAgICB0byBpdHMgbGFyZ2UgdmFsdWUsIGNhdXNpbmcgZWFjaCBhZGRpdGlvbmFsIGluY29taW5nIHRocmVhZCB0bwotICAgIC8vICAgICAgcHJvZmlsZSBldmVyeSBjYWxsLiAgVGhpcyBzaXR1YXRpb24gaXMgdW5saWtlbHkgdG8gcGVyc2lzdCBmb3IgbG9uZwotICAgIC8vICAgICAgYXMgdGhlIGNyaXRpY2FsIGdhcCBpcyBxdWl0ZSBzaG9ydCwgYnV0IHByb2ZpbGluZyBjb3VsZCBiZSBidXJzdHkuCi0gICAgc2lnX2F0b21pY190IGxvY2FsVmFsdWUgPSAtLW11dGV4UHJvZmlsaW5nQ291bnRlcjsKLSAgICBpZiAobG9jYWxWYWx1ZSA8PSAwKSB7Ci0gICAgICBtdXRleFByb2ZpbGluZ0NvdW50ZXIgPSBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGU7Ci0gICAgICByZXR1cm4gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCi0jZW5kaWYgLy8gVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggbXV0ZXgKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNdXRleDo6aW1wbCB7Ci0gcHVibGljOgotICBpbXBsKEluaXRpYWxpemVyIGluaXQpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICAgIHByb2ZpbGVUaW1lXyA9IDA7Ci0jZW5kaWYKLSAgICBpbml0KCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgfQotCi0gIH5pbXBsKCkgewotICAgIGlmIChpbml0aWFsaXplZF8pIHsKLSAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pOwotICAgICAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvY2soKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKLSAgfQotCi0gIGJvb2wgdHJ5bG9jaygpIGNvbnN0IHsgcmV0dXJuICgwID09IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsgfQotCi0gIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdCB7Ci0jaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAyMDAxMTJMCi0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0KLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgVXRpbDo6dG9UaW1lc3BlYyh0cywgbWlsbGlzZWNvbmRzKTsKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgLy8gSWYgcHRocmVhZF9tdXRleF90aW1lZGxvY2sgaXNuJ3Qgc3VwcG9ydGVkLCB0aGUgc2FmZXN0IHRoaW5nIHRvIGRvCi0gICAgLy8gaXMganVzdCBkbyBhIG5vbmJsb2NraW5nIHRyeWxvY2suCi0gICAgcmV0dXJuIHRyeWxvY2soKTsKLSNlbmRpZgotICB9Ci0KLSAgdm9pZCB1bmxvY2soKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pOwotICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKLSAgfQotCi0gIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSAmcHRocmVhZF9tdXRleF87IH0KLQotIHByaXZhdGU6Ci0gIG11dGFibGUgcHRocmVhZF9tdXRleF90IHB0aHJlYWRfbXV0ZXhfOwotICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKLSNlbmRpZgotfTsKLQotTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKGluaXQpKSB7fQotCi12b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0VW5kZXJseWluZ0ltcGwoKTsgfQotCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Ci0KLWJvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dHJ5bG9jaygpOyB9Ci0KLWJvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dGltZWRsb2NrKG1zKTsgfQotCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQotCi12b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBwdGhyZWFkX211dGV4X3QqIHB0aHJlYWRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90Kilhcmc7Ci0gIGludCByZXQgPSBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci19Ci0KLSNpZiBkZWZpbmVkKFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCi1zdGF0aWMgdm9pZCBpbml0X3dpdGhfa2luZChwdGhyZWFkX211dGV4X3QqIG11dGV4LCBpbnQga2luZCkgewotICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgLy8gQXBwYXJlbnRseSwgdGhpcyBjYW4gZmFpbC4gIFNob3VsZCB3ZSByZWFsbHkgYmUgYWJvcnRpbmc/Ci0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCi12b2lkIE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLSAgLy8gRnJvbSBteXNxbCBzb3VyY2U6IG15c3lzL215X3Rocl9pbml0LmMKLSAgLy8gU2V0IG11dGV4IHR5cGUgdG8gImZhc3QiIGEuay5hICJhZGFwdGl2ZSIKLSAgLy8KLSAgLy8gSW4gdGhpcyBjYXNlIHRoZSB0aHJlYWQgbWF5IHN0ZWFsIHRoZSBtdXRleCBmcm9tIHNvbWUgb3RoZXIgdGhyZWFkCi0gIC8vIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIHNhbWUgbXV0ZXguIFRoaXMgd2lsbCBzYXZlIHVzIHNvbWUKLSAgLy8gY29udGV4dCBzd2l0Y2hlcyBidXQgbWF5IGNhdXNlIGEgdGhyZWFkIHRvICdzdGFydmUgZm9yZXZlcicgd2hpbGUKLSAgLy8gd2FpdGluZyBmb3IgdGhlIG11dGV4IChub3QgbGlrZWx5IGlmIHRoZSBjb2RlIHdpdGhpbiB0aGUgbXV0ZXggaXMKLSAgLy8gc2hvcnQpLgotICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfQURBUFRJVkVfTlApOwotfQotI2VuZGlmCi0KLSNpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAotdm9pZCBNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKLX0KLSNlbmRpZgotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUmVhZFdyaXRlTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggcncgbG9jawotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFJlYWRXcml0ZU11dGV4OjppbXBsIHsKLXB1YmxpYzoKLSAgaW1wbCgpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotICAgIHByb2ZpbGVUaW1lXyA9IDA7Ci0jZW5kaWYKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfaW5pdCgmcndfbG9ja18sIE5VTEwpOwotICAgIGFzc2VydChyZXQgPT0gMCk7Ci0gICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgfQotCi0gIH5pbXBsKCkgewotICAgIGlmKGluaXRpYWxpemVkXykgewotICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfZGVzdHJveSgmcndfbG9ja18pOwotICAgICAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pOwotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAgLy8gbm90IGV4Y2x1c2l2ZSwgc28gdXNlIG5vdC1sb2NrZWQgcGF0aAotICB9Ci0KLSAgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZyd19sb2NrXyk7Ci0gICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKLSAgfQotCi0gIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdCB7IHJldHVybiBwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKTsgfQotCi0gIGJvb2wgYXR0ZW1wdFdyaXRlKCkgY29uc3QgeyByZXR1cm4gcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXyk7IH0KLQotICB2b2lkIHJlbGVhc2UoKSBjb25zdCB7Ci0gICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja191bmxvY2soJnJ3X2xvY2tfKTsKLSAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgbXV0YWJsZSBwdGhyZWFkX3J3bG9ja190IHJ3X2xvY2tfOwotICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKLSNlbmRpZgotfTsKLQotUmVhZFdyaXRlTXV0ZXg6OlJlYWRXcml0ZU11dGV4KCkgOiBpbXBsXyhuZXcgUmVhZFdyaXRlTXV0ZXg6OmltcGwoKSkge30KLQotdm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7IGltcGxfLT5hY3F1aXJlUmVhZCgpOyB9Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsgaW1wbF8tPmFjcXVpcmVXcml0ZSgpOyB9Ci0KLWJvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRSZWFkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmF0dGVtcHRSZWFkKCk7IH0KLQotYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFdyaXRlKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmF0dGVtcHRXcml0ZSgpOyB9Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7IGltcGxfLT5yZWxlYXNlKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNWM2Yi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8gMQotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLQotLyoqCi0gKiBEZXRlcm1pbmVzIGlmIHRoZSBUaHJpZnQgTXV0ZXggYW5kIFJlYWRXcml0ZU11dGV4IGNsYXNzZXMgd2lsbCBhdHRlbXB0IHRvCi0gKiBwcm9maWxlIHRoZWlyIGJsb2NraW5nIGFjcXVpcmUgbWV0aG9kcy4gSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gbm9uLXplcm8sCi0gKiBUaHJpZnQgd2lsbCBhdHRlbXB0IHRvIGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSBldmVyeSBwcm9maWxpbmdTYW1wbGVSYXRlCi0gKiB0aW1lcy4gIEhvd2V2ZXIsIGFzIHRoZSBzYW1wbGluZyBpcyBub3Qgc3luY2hyb25pemVkIHRoZSByYXRlIGlzIG5vdAotICogZ3VyYW5hdGVlZCwgYW5kIGNvdWxkIGJlIHN1YmplY3QgdG8gYmlnIGJ1cnN0cyBhbmQgc3dpbmdzLiAgUGxlYXNlIGVuc3VyZQotICogeW91ciBzYW1wbGluZyBjYWxsYmFjayBpcyBhcyBwZXJmb3JtYW50IGFzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMuCi0gKgotICogVGhlIGNhbGxiYWNrIHdpbGwgZ2V0IGNhbGxlZCB3aXRoIHRoZSB3YWl0IHRpbWUgdGFrZW4gdG8gbG9jayB0aGUgbXV0ZXggaW4KLSAqIHVzZWMgYW5kIGEgKHZvaWQqKSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIE11dGV4IChvciBSZWFkV3JpdGVNdXRleCkKLSAqIGJlaW5nIGxvY2tlZC4KLSAqCi0gKiBUaGUgZW5hYmxlTXV0ZXhQcm9maWxpbmcoKSBmdW5jdGlvbiBpcyB1bnN5bmNocm9uaXplZDsgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiB3aGlsZSBwcm9maWxpbmcgaXMgYWxyZWFkeSBlbmFibGVkIG1heSByZXN1bHQgaW4gcmFjZSBjb25kaXRpb25zLiAgT24KLSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgYSBwb2ludGVyIGFzc2lnbm1lbnQgaXMgYXRvbWljLCB0aGlzIGlzIHNhZmUgYnV0IHRoZXJlCi0gKiBpcyBubyBndWFyYW50ZWUgdGhyZWFkcyB3aWxsIGFncmVlIG9uIGEgc2luZ2xlIGNhbGxiYWNrIHdpdGhpbiBhbnkKLSAqIHBhcnRpY3VsYXIgdGltZSBwZXJpb2QuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKk11dGV4V2FpdENhbGxiYWNrKShjb25zdCB2b2lkKiBpZCwgaW50NjRfdCB3YWl0VGltZU1pY3Jvcyk7Ci12b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spOwotCi0jZW5kaWYKLQotLyoqCi0gKiBBIHNpbXBsZSBtdXRleCBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE11dGV4IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCAoKkluaXRpYWxpemVyKSh2b2lkKik7Ci0KLSAgTXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCA9IERFRkFVTFRfSU5JVElBTElaRVIpOwotICB2aXJ0dWFsIH5NdXRleCgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCB0cnlsb2NrKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7Ci0KLSAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdDsKLQotICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKLSAgc3RhdGljIHZvaWQgQURBUFRJVkVfSU5JVElBTElaRVIodm9pZCopOwotICBzdGF0aWMgdm9pZCBSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCopOwotCi0gcHJpdmF0ZToKLQotICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKLX07Ci0KLWNsYXNzIFJlYWRXcml0ZU11dGV4IHsKLXB1YmxpYzoKLSAgUmVhZFdyaXRlTXV0ZXgoKTsKLSAgdmlydHVhbCB+UmVhZFdyaXRlTXV0ZXgoKSB7fQotCi0gIC8vIHRoZXNlIGdldCB0aGUgbG9jayBhbmQgYmxvY2sgdW50aWwgaXQgaXMgZG9uZSBzdWNjZXNzZnVsbHkKLSAgdmlydHVhbCB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdDsKLQotICAvLyB0aGVzZSBhdHRlbXB0IHRvIGdldCB0aGUgbG9jaywgcmV0dXJuaW5nIGZhbHNlIGltbWVkaWF0ZWx5IGlmIHRoZXkgZmFpbAotICB2aXJ0dWFsIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0OwotCi0gIC8vIHRoaXMgcmVsZWFzZXMgYm90aCByZWFkIGFuZCB3cml0ZSBsb2NrcwotICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0OwotCi1wcml2YXRlOgotCi0gIGNsYXNzIGltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwotfTsKLQotY2xhc3MgR3VhcmQgewotIHB1YmxpYzoKLSAgR3VhcmQoY29uc3QgTXV0ZXgmIHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQgPSAwKSA6IG11dGV4XygmdmFsdWUpIHsKLSAgICBpZiAodGltZW91dCA9PSAwKSB7Ci0gICAgICB2YWx1ZS5sb2NrKCk7Ci0gICAgfSBlbHNlIGlmICh0aW1lb3V0IDwgMCkgewotICAgICAgaWYgKCF2YWx1ZS50cnlsb2NrKCkpIHsKLSAgICAgICAgbXV0ZXhfID0gTlVMTDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCF2YWx1ZS50aW1lZGxvY2sodGltZW91dCkpIHsKLSAgICAgICAgbXV0ZXhfID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgfkd1YXJkKCkgewotICAgIGlmIChtdXRleF8pIHsKLSAgICAgIG11dGV4Xy0+dW5sb2NrKCk7Ci0gICAgfQotICB9Ci0KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKG11dGV4XyAhPSBOVUxMKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgTXV0ZXgqIG11dGV4XzsKLX07Ci0KLS8vIENhbiBiZSB1c2VkIGFzIHNlY29uZCBhcmd1bWVudCB0byBSV0d1YXJkIHRvIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlCi0vLyBhcyB0byB3aGV0aGVyIHdlJ3JlIGRvaW5nIGFjcXVpcmVSZWFkKCkgb3IgYWNxdWlyZVdyaXRlKCkuCi1lbnVtIFJXR3VhcmRUeXBlIHsKLSAgUldfUkVBRCA9IDAsCi0gIFJXX1dSSVRFID0gMQotfTsKLQotCi1jbGFzcyBSV0d1YXJkIHsKLSAgcHVibGljOgotICAgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBib29sIHdyaXRlID0gZmFsc2UpCi0gICAgICAgICA6IHJ3X211dGV4Xyh2YWx1ZSkgewotICAgICAgaWYgKHdyaXRlKSB7Ci0gICAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOwotICAgICAgfQotICAgIH0KLQotICAgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBSV0d1YXJkVHlwZSB0eXBlKQotICAgICAgICAgOiByd19tdXRleF8odmFsdWUpIHsKLSAgICAgIGlmICh0eXBlID09IFJXX1dSSVRFKSB7Ci0gICAgICAgIHJ3X211dGV4Xy5hY3F1aXJlV3JpdGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgICB+UldHdWFyZCgpIHsKLSAgICAgIHJ3X211dGV4Xy5yZWxlYXNlKCk7Ci0gICAgfQotICBwcml2YXRlOgotICAgIGNvbnN0IFJlYWRXcml0ZU11dGV4JiByd19tdXRleF87Ci19OwotCi0KLS8vIEEgbGl0dGxlIGhhY2sgdG8gcHJldmVudCBzb21lb25lIGZyb20gdHJ5aW5nIHRvIGRvICJHdWFyZChtKTsiCi0vLyBTdWNoIGEgdXNlIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdGVtcG9yYXJ5IEd1YXJkIG9iamVjdCBpcwotLy8gZGVzdG9yeWVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIHJlbGVhc2luZyB0aGUgbG9jay4KLS8vIFNvcnJ5IGZvciBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGJ1dCBJIHRoaW5rIGl0J3Mgd29ydGggaXQuCi0jZGVmaW5lIEd1YXJkKG0pIGluY29ycmVjdF91c2Vfb2ZfR3VhcmQobSkKLSNkZWZpbmUgUldHdWFyZChtKSBpbmNvcnJlY3RfdXNlX29mX1JXR3VhcmQobSkKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIyODhjLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUG9zaXhUaHJlYWRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0KLSNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAotIyAgaW5jbHVkZSA8Z29vZ2xlL3Byb2ZpbGVyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8Ym9vc3Qvd2Vha19wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OndlYWtfcHRyOwotCi0vKioKLSAqIFRoZSBQT1NJWCB0aHJlYWQgY2xhc3MuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgUHRocmVhZFRocmVhZDogcHVibGljIFRocmVhZCB7Ci0gcHVibGljOgotCi0gIGVudW0gU1RBVEUgewotICAgIHVuaW5pdGlhbGl6ZWQsCi0gICAgc3RhcnRpbmcsCi0gICAgc3RhcnRlZCwKLSAgICBzdG9wcGluZywKLSAgICBzdG9wcGVkCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IGludCBNQiA9IDEwMjQgKiAxMDI0OwotCi0gIHN0YXRpYyB2b2lkKiB0aHJlYWRNYWluKHZvaWQqIGFyZyk7Ci0KLSBwcml2YXRlOgotICBwdGhyZWFkX3QgcHRocmVhZF87Ci0gIFNUQVRFIHN0YXRlXzsKLSAgaW50IHBvbGljeV87Ci0gIGludCBwcmlvcml0eV87Ci0gIGludCBzdGFja1NpemVfOwotICB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLSBwdWJsaWM6Ci0KLSAgUHRocmVhZFRocmVhZChpbnQgcG9saWN5LCBpbnQgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQsIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6Ci0gICAgcHRocmVhZF8oMCksCi0gICAgc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLAotICAgIHBvbGljeV8ocG9saWN5KSwKLSAgICBwcmlvcml0eV8ocHJpb3JpdHkpLAotICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSwKLSAgICBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKLQotICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOwotICB9Ci0KLSAgflB0aHJlYWRUaHJlYWQoKSB7Ci0gICAgLyogTm90aGluZyByZWZlcmVuY2VzIHRoaXMgdGhyZWFkLCBpZiBpcyBpcyBub3QgZGV0YWNoZWQsIGRvIGEgam9pbgotICAgICAgIG5vdywgb3RoZXJ3aXNlIHRoZSB0aHJlYWQtaWQgYW5kLCBwb3NzaWJseSwgb3RoZXIgcmVzb3VyY2VzIHdpbGwKLSAgICAgICBiZSBsZWFrZWQuICovCi0gICAgaWYoIWRldGFjaGVkXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCguLi4pIHsKLSAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7Ci0gICAgaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cikgIT0gMCkgewotICAgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX2luaXQgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgaWYocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoZWRfID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSkgIT0gMCkgewotICAgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8vIFNldCB0aHJlYWQgc3RhY2sgc2l6ZQotICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgTUIgKiBzdGFja1NpemVfKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhyZWFkIHBvbGljeQotICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnRocmVhZF9hdHRyLCBwb2xpY3lfKSAhPSAwKSB7Ci0gICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGZhaWxlZCIpOwotICAgIH0KLQotICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZF9wYXJhbTsKLSAgICBzY2hlZF9wYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5XzsKLQotICAgIC8vIFNldCB0aHJlYWQgcHJpb3JpdHkKLSAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnRocmVhZF9hdHRyLCAmc2NoZWRfcGFyYW0pICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgcmVmZXJlbmNlCi0gICAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiogc2VsZlJlZiA9IG5ldyBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KCk7Ci0gICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7Ci0KLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKLQotICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmcHRocmVhZF8sICZ0aHJlYWRfYXR0ciwgdGhyZWFkTWFpbiwgKHZvaWQqKXNlbGZSZWYpICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQiKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHZvaWQqIGlnbm9yZTsKLSAgICAgIC8qIFhYWAotICAgICAgICAgSWYgam9pbiBmYWlscyBpdCBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIGZhY3QKLSAgICAgICAgIHRoYXQgdGhlIGxhc3QgcmVmZXJlbmNlIHdhcyB0aGUgdGhyZWFkIGl0c2VsZiBhbmQgY2Fubm90Ci0gICAgICAgICBqb2luLiAgVGhpcyByZXN1bHRzIGluIGxlYWtlZCB0aHJlYWRzIGFuZCB3aWxsIGV2ZW50dWFsbHkKLSAgICAgICAgIGNhdXNlIHRoZSBwcm9jZXNzIHRvIHJ1biBvdXQgb2YgdGhyZWFkIHJlc291cmNlcy4KLSAgICAgICAgIFdlJ3JlIGJleW9uZCB0aGUgcG9pbnQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgTm90IGNsZWFyIGhvdwotICAgICAgICAgYmVzdCB0byBoYW5kbGUgdGhpcy4gKi8KLSAgICAgIGRldGFjaGVkXyA9IHB0aHJlYWRfam9pbihwdGhyZWFkXywgJmlnbm9yZSkgPT0gMDsKLSAgICB9Ci0gIH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7Ci0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF87Ci0gIH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQotCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KLQotICB2b2lkIHdlYWtSZWYoc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmKSB7Ci0gICAgYXNzZXJ0KHNlbGYuZ2V0KCkgPT0gdGhpcyk7Ci0gICAgc2VsZl8gPSB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKLSAgfQotfTsKLQotdm9pZCogUHRocmVhZFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKLSAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAotICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7Ci0jZW5kaWYKLQotICB0aHJlYWQtPnN0YXRlXyA9IHN0YXJ0aW5nOwotICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOwotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBlZCkgewotICAgIHRocmVhZC0+c3RhdGVfID0gc3RvcHBpbmc7Ci0gIH0KLQotICByZXR1cm4gKHZvaWQqKTA7Ci19Ci0KLS8qKgotICogUE9TSVggVGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KLSAqLwotY2xhc3MgUG9zaXhUaHJlYWRGYWN0b3J5OjpJbXBsIHsKLQotIHByaXZhdGU6Ci0gIFBPTElDWSBwb2xpY3lfOwotICBQUklPUklUWSBwcmlvcml0eV87Ci0gIGludCBzdGFja1NpemVfOwotICBib29sIGRldGFjaGVkXzsKLQotICAvKioKLSAgICogQ29udmVydHMgZ2VuZXJpYyBwb3NpeCB0aHJlYWQgc2NoZWR1bGUgcG9saWN5IGVudW1zIGludG8gcHRocmVhZAotICAgKiBBUEkgdmFsdWVzLgotICAgKi8KLSAgc3RhdGljIGludCB0b1B0aHJlYWRQb2xpY3koUE9MSUNZIHBvbGljeSkgewotICAgIHN3aXRjaCAocG9saWN5KSB7Ci0gICAgY2FzZSBPVEhFUjoKLSAgICAgIHJldHVybiBTQ0hFRF9PVEhFUjsKLSAgICBjYXNlIEZJRk86Ci0gICAgICByZXR1cm4gU0NIRURfRklGTzsKLSAgICBjYXNlIFJPVU5EX1JPQklOOgotICAgICAgcmV0dXJuIFNDSEVEX1JSOwotICAgIH0KLSAgICByZXR1cm4gU0NIRURfT1RIRVI7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgcmVsYXRpdmUgdGhyZWFkIHByaW9yaXRpZXMgdG8gYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gcG9zaXgKLSAgICogdGhyZWFkIHNjaGVkdWxlciBwb2xpY3kKLSAgICoKLSAgICogIFRoZSBpZGVhIGlzIHNpbXBseSB0byBkaXZpZGUgdXAgdGhlIHByaW9yaXR5IHJhbmdlIGZvciB0aGUgZ2l2ZW4gcG9saWN5Ci0gICAqIGludG8gdGhlIGNvcnJlcHNvbmRpbmcgcmVsYXRpdmUgcHJpb3JpdHkgbGV2ZWwgKGxvd2VzdC4uaGlnaGVzdCkgYW5kCi0gICAqIHRoZW4gcHJvLXJhdGUgYWNjb3JkaW5nbHkuCi0gICAqLwotICBzdGF0aWMgaW50IHRvUHRocmVhZFByaW9yaXR5KFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5KSB7Ci0gICAgaW50IHB0aHJlYWRfcG9saWN5ID0gdG9QdGhyZWFkUG9saWN5KHBvbGljeSk7Ci0gICAgaW50IG1pbl9wcmlvcml0eSA9IDA7Ci0gICAgaW50IG1heF9wcmlvcml0eSA9IDA7Ci0jaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOCi0gICAgbWluX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwdGhyZWFkX3BvbGljeSk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVgKLSAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHB0aHJlYWRfcG9saWN5KTsKLSNlbmRpZgotICAgIGludCBxdWFudGEgPSAoSElHSEVTVCAtIExPV0VTVCkgKyAxOwotICAgIGZsb2F0IHN0ZXBzcGVycXVhbnRhID0gKG1heF9wcmlvcml0eSAtIG1pbl9wcmlvcml0eSkgLyBxdWFudGE7Ci0KLSAgICBpZiAocHJpb3JpdHkgPD0gSElHSEVTVCkgewotICAgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogcHJpb3JpdHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgZm9yIHByaW9yaXR5IGluY3JlbWVudHMuCi0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogTk9STUFMKTsKLSAgICB9Ci0gIH0KLQotIHB1YmxpYzoKLQotICBJbXBsKFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkKSA6Ci0gICAgcG9saWN5Xyhwb2xpY3kpLAotICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCi0gICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkge30KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBQT1NJWCB0aHJlYWQgdG8gcnVuIHRoZSBydW5uYWJsZSBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIHJ1bm5hYmxlIEEgcnVubmFibGUgb2JqZWN0Ci0gICAqLwotICBzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gICAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiByZXN1bHQgPSBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KG5ldyBQdGhyZWFkVGhyZWFkKHRvUHRocmVhZFBvbGljeShwb2xpY3lfKSwgdG9QdGhyZWFkUHJpb3JpdHkocG9saWN5XywgcHJpb3JpdHlfKSwgc3RhY2tTaXplXywgZGV0YWNoZWRfLCBydW5uYWJsZSkpOwotICAgIHJlc3VsdC0+d2Vha1JlZihyZXN1bHQpOwotICAgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgaW50IGdldFN0YWNrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrU2l6ZV87IH0KLQotICB2b2lkIHNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsgc3RhY2tTaXplXyA9IHZhbHVlOyB9Ci0KLSAgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBwcmlvcml0eV87IH0KLQotICAvKioKLSAgICogU2V0cyBwcmlvcml0eS4KLSAgICoKLSAgICogIFhYWAotICAgKiAgTmVlZCB0byBoYW5kbGUgaW5jcmVtZW50YWwgcHJpb3JpdGllcyBwcm9wZXJseS4KLSAgICovCi0gIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgdmFsdWUpIHsgcHJpb3JpdHlfID0gdmFsdWU7IH0KLQotICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KLQotICB2b2lkIHNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgZGV0YWNoZWRfID0gdmFsdWU7IH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgewotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpOwotICB9Ci0KLX07Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkKSA6Ci0gIGltcGxfKG5ldyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwocG9saWN5LCBwcmlvcml0eSwgc3RhY2tTaXplLCBkZXRhY2hlZCkpIHt9Ci0KLXNoYXJlZF9wdHI8VGhyZWFkPiBQb3NpeFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7IH0KLQotaW50IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFN0YWNrU2l6ZSgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7IGltcGxfLT5zZXRTdGFja1NpemUodmFsdWUpOyB9Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5nZXRQcmlvcml0eSgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIHZhbHVlKSB7IGltcGxfLT5zZXRQcmlvcml0eSh2YWx1ZSk7IH0KLQotYm9vbCBQb3NpeFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGltcGxfLT5zZXREZXRhY2hlZCh2YWx1ZSk7IH0KLQotVGhyZWFkOjppZF90IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZDgzYTMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfIDEKLQotI2luY2x1ZGUgIlRocmVhZC5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBBIHRocmVhZCBmYWN0b3J5IHRvIGNyZWF0ZSBwb3NpeCB0aHJlYWRzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgUG9zaXhUaHJlYWRGYWN0b3J5IDogcHVibGljIFRocmVhZEZhY3RvcnkgewotCi0gcHVibGljOgotCi0gIC8qKgotICAgKiBQT1NJWCBUaHJlYWQgc2NoZWR1bGVyIHBvbGljaWVzCi0gICAqLwotICBlbnVtIFBPTElDWSB7Ci0gICAgT1RIRVIsCi0gICAgRklGTywKLSAgICBST1VORF9ST0JJTgotICB9OwotCi0gIC8qKgotICAgKiBQT1NJWCBUaHJlYWQgc2NoZWR1bGVyIHJlbGF0aXZlIHByaW9yaXRpZXMsCi0gICAqCi0gICAqIEFic29sdXRlIHByaW9yaXR5IGlzIGRldGVybWluZWQgYnkgc2NoZWR1bGVyIHBvbGljeSBhbmQgT1MuIFRoaXMKLSAgICogZW51bWVyYXRpb24gc3BlY2lmaWVzIHJlbGF0aXZlIHByaW9yaXRpZXMgc3VjaCB0aGF0IG9uZSBjYW4gc3BlY2lmeSBhCi0gICAqIHByaW9yaXR5IHdpdGhpbmcgYSBnaXZpbmcgc2NoZWR1bGVyIHBvbGljeSB3aXRob3V0IGtub3dpbmcgdGhlIGFic29sdXRlCi0gICAqIHZhbHVlIG9mIHRoZSBwcmlvcml0eS4KLSAgICovCi0gIGVudW0gUFJJT1JJVFkgewotICAgIExPV0VTVCA9IDAsCi0gICAgTE9XRVIgPSAxLAotICAgIExPVyA9IDIsCi0gICAgTk9STUFMID0gMywKLSAgICBISUdIID0gNCwKLSAgICBISUdIRVIgPSA1LAotICAgIEhJR0hFU1QgPSA2LAotICAgIElOQ1JFTUVOVCA9IDcsCi0gICAgREVDUkVNRU5UID0gOAotICB9OwotCi0gIC8qKgotICAgKiBQb3NpeCB0aHJlYWQgKHB0aHJlYWQpIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCi0gICAqCi0gICAqIFRocmVhZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBvbGljeSwgcHJpb3JpdHksIHN0YWNrLXNpemUgYW5kIGRldGFjaGFibGUtbW9kZQotICAgKiBkZXRhY2hlZCBtZWFucyB0aGUgdGhyZWFkIGlzIGZyZWUtcnVubmluZyBhbmQgd2lsbCByZWxlYXNlIGFsbCBzeXN0ZW0gcmVzb3VyY2VzIHRoZQotICAgKiB3aGVuIGl0IGNvbXBsZXRlcy4gIEEgZGV0YWNoYWJsZSB0aHJlYWQgaXMgbm90IGpvaW5hYmxlLiAgVGhlIGpvaW4gbWV0aG9kCi0gICAqIG9mIGEgZGV0YWNoYWJsZSB0aHJlYWQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBubyBlcnJvci4KLSAgICoKLSAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCi0gICAqLwotCi0gIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5PVJPVU5EX1JPQklOLCBQUklPUklUWSBwcmlvcml0eT1OT1JNQUwsIGludCBzdGFja1NpemU9MSwgYm9vbCBkZXRhY2hlZD10cnVlKTsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7Ci0KLSAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgY3JlYXRlZCB0aHJlYWRzCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHNpemUgaW4gbWVnYWJ5dGVzCi0gICAqLwotICB2aXJ0dWFsIGludCBnZXRTdGFja1NpemUoKSBjb25zdDsKLQotICAvKioKLSAgICogU2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIHNpemUgaW4gbWVnYWJ5dGVzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIEdldHMgcHJpb3JpdHkgcmVsYXRpdmUgdG8gY3VycmVudCBwb2xpY3kKLSAgICovCi0gIHZpcnR1YWwgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdDsKLQotICAvKioKLSAgICogU2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldFByaW9yaXR5KFBSSU9SSVRZIHByaW9yaXR5KTsKLQotICAvKioKLSAgICogU2V0cyBkZXRhY2hlZCBtb2RlIG9mIHRocmVhZHMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKTsKLQotICAvKioKLSAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBpc0RldGFjaGVkKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBJbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZC5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjgyYWQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfIDEKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi1jbGFzcyBUaHJlYWQ7Ci0KLS8qKgotICogTWluaW1hbCBydW5uYWJsZSBjbGFzcy4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlJ1bm5hYmxlLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFJ1bm5hYmxlIHsKLQotIHB1YmxpYzoKLSAgdmlydHVhbCB+UnVubmFibGUoKSB7fTsKLSAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgdGhyZWFkIG9iamVjdCB0aGF0IGlzIGhvc3RpbmcgdGhpcyBydW5uYWJsZSBvYmplY3QgIC0gY2FuIHJldHVybgotICAgKiBhbiBlbXB0eSBib29zdDo6c2hhcmVkIHBvaW50ZXIgaWYgbm8gcmVmZXJlbmNlcyByZW1haW4gb24gdGhldCB0aHJlYWQgIG9iamVjdAotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF8ubG9jaygpOyB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHRocmVhZCB0aGF0IGlzIGV4ZWN1dGluZyB0aGlzIG9iamVjdC4gIFRoaXMgaXMgb25seSBtZWFudCBmb3IKLSAgICogdXNlIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiBUaHJlYWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgdGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdmFsdWUpIHsgdGhyZWFkXyA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6d2Vha19wdHI8VGhyZWFkPiB0aHJlYWRfOwotfTsKLQotLyoqCi0gKiBNaW5pbWFsIHRocmVhZCBjbGFzcy4gUmV0dXJuZWQgYnkgdGhyZWFkIGZhY3RvcnkgYm91bmQgdG8gYSBSdW5uYWJsZSBvYmplY3QKLSAqIGFuZCByZWFkeSB0byBzdGFydCBleGVjdXRpb24uICBNb3JlIG9yIGxlc3MgYW5hbG9nb3VzIHRvIGphdmEubGFuZy5UaHJlYWQKLSAqIChtaW51cyBhbGwgdGhlIHRocmVhZCBncm91cCwgcHJpb3JpdHksIG1vZGUgYW5kIG90aGVyIGJhZ2dhZ2UsIHNpbmNlIHRoYXQKLSAqIGlzIGRpZmZpY3VsdCB0byBhYnN0cmFjdCBhY3Jvc3MgcGxhdGZvcm1zIGFuZCBpcyBsZWZ0IGZvciBwbGF0Zm9ybS1zcGVjaWZpYwotICogVGhyZWFkRmFjdG9yeSBpbXBsZW10YXRpb25zIHRvIGRlYWwgd2l0aAotICoKLSAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5KQotICovCi1jbGFzcyBUaHJlYWQgewotCi0gcHVibGljOgotCi0gIHR5cGVkZWYgdWludDY0X3QgaWRfdDsKLQotICB2aXJ0dWFsIH5UaHJlYWQoKSB7fTsKLQotICAvKioKLSAgICogU3RhcnRzIHRoZSB0aHJlYWQuIERvZXMgcGxhdGZvcm0gc3BlY2lmaWMgdGhyZWFkIGNyZWF0aW9uIGFuZAotICAgKiBjb25maWd1cmF0aW9uIHRoZW4gaW52b2tlcyB0aGUgcnVuIG1ldGhvZCBvZiB0aGUgUnVubmFibGUgb2JqZWN0IGJvdW5kCi0gICAqIHRvIHRoaXMgdGhyZWFkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOwotCi0gIC8qKgotICAgKiBKb2luIHRoaXMgdGhyZWFkLiBDdXJyZW50IHRocmVhZCBibG9ja3MgdW50aWwgdGhpcyB0YXJnZXQgdGhyZWFkCi0gICAqIGNvbXBsZXRlcy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBqb2luKCkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0aHJlYWQncyBwbGF0Zm9ybS1zcGVjaWZpYyBJRAotICAgKi8KLSAgdmlydHVhbCBpZF90IGdldElkKCkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBydW5uYWJsZSBvYmplY3QgdGhpcyB0aHJlYWQgaXMgaG9zdGluZwotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBfcnVubmFibGU7IH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIHJ1bm5hYmxlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBfcnVubmFibGUgPSB2YWx1ZTsgfQotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IF9ydW5uYWJsZTsKLQotfTsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSBwbGF0Zm9ybS1zcGVjaWZpYyB0aHJlYWQgb2JqZWN0IGFuZCBiaW5kIHRoZW0gdG8gUnVubmFibGUKLSAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCi0gKi8KLWNsYXNzIFRocmVhZEZhY3RvcnkgewotCi0gcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRGYWN0b3J5KCkge30KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKLQotICAvKiogR2V0cyB0aGUgY3VycmVudCB0aHJlYWQgaWQgb3IgdW5rbm93bl90aHJlYWRfaWQgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHRocmlmdCB0aHJlYWQgKi8KLQotICBzdGF0aWMgY29uc3QgVGhyZWFkOjppZF90IHVua25vd25fdGhyZWFkX2lkOwotCi0gIHZpcnR1YWwgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjI2OTAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVGhyZWFkTWFuYWdlci5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHNldD4KLQotI2lmIGRlZmluZWQoREVCVUcpCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jZW5kaWYgLy9kZWZpbmVkKERFQlVHKQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwotCi0vKioKLSAqIFRocmVhZE1hbmFnZXIgY2xhc3MKLSAqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBwb29sIG9mIHRocmVhZHMuIEl0IHVzZXMgYSBUaHJlYWRGYWN0b3J5IHRvIGNyZWF0ZQotICogdGhyZWFkcy4gIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgotICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAotICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGwgOiBwdWJsaWMgVGhyZWFkTWFuYWdlciAgewotCi0gcHVibGljOgotICBJbXBsKCkgOgotICAgIHdvcmtlckNvdW50XygwKSwKLSAgICB3b3JrZXJNYXhDb3VudF8oMCksCi0gICAgaWRsZUNvdW50XygwKSwKLSAgICBwZW5kaW5nVGFza0NvdW50TWF4XygwKSwKLSAgICBleHBpcmVkQ291bnRfKDApLAotICAgIHN0YXRlXyhUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKLSAgICBtb25pdG9yXygmbXV0ZXhfKSwKLSAgICBtYXhNb25pdG9yXygmbXV0ZXhfKSB7fQotCi0gIH5JbXBsKCkgeyBzdG9wKCk7IH0KLQotICB2b2lkIHN0YXJ0KCk7Ci0KLSAgdm9pZCBzdG9wKCkgeyBzdG9wSW1wbChmYWxzZSk7IH0KLQotICB2b2lkIGpvaW4oKSB7IHN0b3BJbXBsKHRydWUpOyB9Ci0KLSAgVGhyZWFkTWFuYWdlcjo6U1RBVEUgc3RhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRlXzsKLSAgfQotCi0gIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwotICB9Ci0KLSAgdm9pZCB0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgdGhyZWFkRmFjdG9yeV8gPSB2YWx1ZTsKLSAgfQotCi0gIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSk7Ci0KLSAgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKTsKLQotICBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlQ291bnRfOwotICB9Ci0KLSAgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gd29ya2VyQ291bnRfOwotICB9Ci0KLSAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiB0YXNrc18uc2l6ZSgpOwotICB9Ci0KLSAgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gdGFza3NfLnNpemUoKSArIHdvcmtlckNvdW50XyAtIGlkbGVDb3VudF87Ci0gIH0KLQotICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcmV0dXJuIHBlbmRpbmdUYXNrQ291bnRNYXhfOwotICB9Ci0KLSAgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHNpemVfdCByZXN1bHQgPSBleHBpcmVkQ291bnRfOwotICAgIGV4cGlyZWRDb3VudF8gPSAwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICB2b2lkIHBlbmRpbmdUYXNrQ291bnRNYXgoY29uc3Qgc2l6ZV90IHZhbHVlKSB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfID0gdmFsdWU7Ci0gIH0KLQotICBib29sIGNhblNsZWVwKCk7Ci0KLSAgdm9pZCBhZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsIGludDY0X3QgdGltZW91dCwgaW50NjRfdCBleHBpcmF0aW9uKTsKLQotICB2b2lkIHJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpOwotCi0gIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCk7Ci0KLSAgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjayk7Ci0KLXByaXZhdGU6Ci0gIHZvaWQgc3RvcEltcGwoYm9vbCBqb2luKTsKLQotICBzaXplX3Qgd29ya2VyQ291bnRfOwotICBzaXplX3Qgd29ya2VyTWF4Q291bnRfOwotICBzaXplX3QgaWRsZUNvdW50XzsKLSAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOwotICBzaXplX3QgZXhwaXJlZENvdW50XzsKLSAgRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2tfOwotCi0gIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlXzsKLSAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKLQotCi0gIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrOwotICBzdGQ6OnF1ZXVlPHNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrc187Ci0gIE11dGV4IG11dGV4XzsKLSAgTW9uaXRvciBtb25pdG9yXzsKLSAgTW9uaXRvciBtYXhNb25pdG9yXzsKLSAgTW9uaXRvciB3b3JrZXJNb25pdG9yXzsKLQotICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwotICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB3b3JrZXJzXzsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gZGVhZFdvcmtlcnNfOwotICBzdGQ6Om1hcDxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+IGlkTWFwXzsKLX07Ci0KLWNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewotCi0gcHVibGljOgotICBlbnVtIFNUQVRFIHsKLSAgICBXQUlUSU5HLAotICAgIEVYRUNVVElORywKLSAgICBDQU5DRUxMRUQsCi0gICAgQ09NUExFVEUKLSAgfTsKLQotICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlLCBpbnQ2NF90IGV4cGlyYXRpb249MExMKSAgOgotICAgIHJ1bm5hYmxlXyhydW5uYWJsZSksCi0gICAgc3RhdGVfKFdBSVRJTkcpLAotICAgIGV4cGlyZVRpbWVfKGV4cGlyYXRpb24gIT0gMExMID8gVXRpbDo6Y3VycmVudFRpbWUoKSArIGV4cGlyYXRpb24gOiAwTEwpIHt9Ci0KLSAgflRhc2soKSB7fQotCi0gIHZvaWQgcnVuKCkgewotICAgIGlmIChzdGF0ZV8gPT0gRVhFQ1VUSU5HKSB7Ci0gICAgICBydW5uYWJsZV8tPnJ1bigpOwotICAgICAgc3RhdGVfID0gQ09NUExFVEU7Ci0gICAgfQotICB9Ci0KLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZ2V0UnVubmFibGUoKSB7Ci0gICAgcmV0dXJuIHJ1bm5hYmxlXzsKLSAgfQotCi0gIGludDY0X3QgZ2V0RXhwaXJlVGltZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZXhwaXJlVGltZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKLSAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjsKLSAgU1RBVEUgc3RhdGVfOwotICBpbnQ2NF90IGV4cGlyZVRpbWVfOwotfTsKLQotY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOiBwdWJsaWMgUnVubmFibGUgewotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OwotCi0gcHVibGljOgotICBXb3JrZXIoVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcikgOgotICAgIG1hbmFnZXJfKG1hbmFnZXIpLAotICAgIHN0YXRlXyhVTklOSVRJQUxJWkVEKSwKLSAgICBpZGxlXyhmYWxzZSkge30KLQotICB+V29ya2VyKCkge30KLQotIHByaXZhdGU6Ci0gIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuCi0gICAgICAobWFuYWdlcl8tPndvcmtlckNvdW50XyA8PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB8fAotICAgICAgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gSk9JTklORyAmJiAhbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKTsKLSAgfQotCi0gcHVibGljOgotICAvKioKLSAgICogV29ya2VyIGVudHJ5IHBvaW50Ci0gICAqCi0gICAqIEFzIGxvbmcgYXMgd29ya2VyIHRocmVhZCBpcyBydW5uaW5nLCBwdWxsIHRhc2tzIG9mZiB0aGUgdGFzayBxdWV1ZSBhbmQKLSAgICogZXhlY3V0ZS4KLSAgICovCi0gIHZvaWQgcnVuKCkgewotICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7Ci0gICAgYm9vbCBub3RpZnlNYW5hZ2VyID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgd29ya2VyIHNlbWFwaG9yZSBhbmQgbm90aWZ5IG1hbmFnZXIgaWYgd29ya2VyIGNvdW50IHJlYWNoZWQKLSAgICAgKiBkZXNpcmVkIG1heAotICAgICAqCi0gICAgICogTm90ZTogV2UgaGF2ZSB0byByZWxlYXNlIHRoZSBtb25pdG9yIGFuZCBhY3F1aXJlIHRoZSB3b3JrZXJNb25pdG9yCi0gICAgICogc2luY2UgdGhhdCBpcyB3aGF0IHRoZSBtYW5hZ2VyIGJsb2NrcyBvbiBmb3Igd29ya2VyIGFkZC9yZW1vdmUKLSAgICAgKi8KLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwotICAgICAgYWN0aXZlID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA8IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87Ci0gICAgICBpZiAoYWN0aXZlKSB7Ci0gICAgICAgIG1hbmFnZXJfLT53b3JrZXJDb3VudF8rKzsKLSAgICAgICAgbm90aWZ5TWFuYWdlciA9IG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobm90aWZ5TWFuYWdlcikgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPndvcmtlck1vbml0b3JfKTsKLSAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoYWN0aXZlKSB7Ci0gICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2s7Ci0KLSAgICAgIC8qKgotICAgICAgICogV2hpbGUgaG9sZGluZyBtYW5hZ2VyIG1vbml0b3IgYmxvY2sgZm9yIG5vbi1lbXB0eSB0YXNrIHF1ZXVlIChBbHNvCi0gICAgICAgKiBjaGVjayB0aGF0IHRoZSB0aHJlYWQgaGFzbid0IGJlZW4gcmVxdWVzdGVkIHRvIHN0b3ApLiBPbmNlIHRoZSBxdWV1ZQotICAgICAgICogaXMgbm9uLWVtcHR5LCBkZXF1ZXVlIGEgdGFzaywgcmVsZWFzZSBtb25pdG9yLCBhbmQgZXhlY3V0ZS4gSWYgdGhlCi0gICAgICAgKiB3b3JrZXIgbWF4IGNvdW50IGhhcyBiZWVuIGRlY3JlbWVudGVkIHN1Y2ggdGhhdCB3ZSBleGNlZWQgaXQsIG1hcmsKLSAgICAgICAqIG91cnNlbGYgaW5hY3RpdmUsIGRlY3JlbWVudCB0aGUgd29ya2VyIGNvdW50IGFuZCBub3RpZnkgdGhlIG1hbmFnZXIKLSAgICAgICAqICh0ZWNobmljYWxseSB3ZSdyZSBub3RpZnlpbmcgdGhlIG5leHQgYmxvY2tlZCB0aHJlYWQgYnV0IGV2ZW50dWFsbHkKLSAgICAgICAqIHRoZSBtYW5hZ2VyIHdpbGwgc2VlIGl0LgotICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEd1YXJkIGcobWFuYWdlcl8tPm11dGV4Xyk7Ci0gICAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7Ci0KLSAgICAgICAgd2hpbGUgKGFjdGl2ZSAmJiBtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50XysrOwotICAgICAgICAgIGlkbGVfID0gdHJ1ZTsKLSAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCgpOwotICAgICAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7Ci0gICAgICAgICAgaWRsZV8gPSBmYWxzZTsKLSAgICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50Xy0tOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdGl2ZSkgewotICAgICAgICAgIG1hbmFnZXJfLT5yZW1vdmVFeHBpcmVkVGFza3MoKTsKLQotICAgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICB0YXNrID0gbWFuYWdlcl8tPnRhc2tzXy5mcm9udCgpOwotICAgICAgICAgICAgbWFuYWdlcl8tPnRhc2tzXy5wb3AoKTsKLSAgICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6V0FJVElORykgewotICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgYSBwZW5kaW5nIHRhc2sgbWF4IGFuZCB3ZSBqdXN0IGRyb3BwZWQgYmVsb3cgaXQsIHdha2V1cCBhbnkKLSAgICAgICAgICAgICAgIHRocmVhZCB0aGF0IG1pZ2h0IGJlIGJsb2NrZWQgb24gYWRkLiAqLwotICAgICAgICAgICAgaWYgKG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAhPSAwICYmCi0gICAgICAgICAgICAgICAgbWFuYWdlcl8tPnRhc2tzXy5zaXplKCkgPD0gbWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfIC0gMSkgewotICAgICAgICAgICAgICBtYW5hZ2VyXy0+bWF4TW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlkbGVfID0gdHJ1ZTsKLSAgICAgICAgICBtYW5hZ2VyXy0+d29ya2VyQ291bnRfLS07Ci0gICAgICAgICAgbm90aWZ5TWFuYWdlciA9IChtYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YXNrICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkcpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgdGFzay0+cnVuKCk7Ci0gICAgICAgICAgfSBjYXRjaCguLi4pIHsKLSAgICAgICAgICAgIC8vIFhYWCBuZWVkIHRvIGxvZyB0aGlzCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPndvcmtlck1vbml0b3JfKTsKLSAgICAgIG1hbmFnZXJfLT5kZWFkV29ya2Vyc18uaW5zZXJ0KHRoaXMtPnRocmVhZCgpKTsKLSAgICAgIGlmIChub3RpZnlNYW5hZ2VyKSB7Ci0gICAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBwcml2YXRlOgotICAgIFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXJfOwotICAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsOwotICAgIFNUQVRFIHN0YXRlXzsKLSAgICBib29sIGlkbGVfOwotfTsKLQotCi0gIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyKHNpemVfdCB2YWx1ZSkgewotICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBuZXdUaHJlYWRzOwotICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOwotICAgIG5ld1RocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQod29ya2VyKSk7Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHdvcmtlck1heENvdW50XyArPSB2YWx1ZTsKLSAgICB3b3JrZXJzXy5pbnNlcnQobmV3VGhyZWFkcy5iZWdpbigpLCBuZXdUaHJlYWRzLmVuZCgpKTsKLSAgfQotCi0gIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gbmV3VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBuZXdUaHJlYWRzLmVuZCgpOyBpeCsrKSB7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+IHdvcmtlciA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PFRocmVhZE1hbmFnZXI6OldvcmtlciwgUnVubmFibGU+KCgqaXgpLT5ydW5uYWJsZSgpKTsKLSAgICB3b3JrZXItPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6Oldvcmtlcjo6U1RBUlRJTkc7Ci0gICAgKCppeCktPnN0YXJ0KCk7Ci0gICAgaWRNYXBfLmluc2VydChzdGQ6OnBhaXI8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPigoKml4KS0+Z2V0SWQoKSwgKml4KSk7Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMod29ya2VyTW9uaXRvcl8pOwotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKSB7Ci0KLSAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKLSAgICAgIGlmICh0aHJlYWRGYWN0b3J5XyA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRDsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLQotICAgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wSW1wbChib29sIGpvaW4pIHsKLSAgYm9vbCBkb1N0b3AgPSBmYWxzZTsKLSAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HICYmCi0gICAgICAgIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpKT0lOSU5HICYmCi0gICAgICAgIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7Ci0gICAgICBkb1N0b3AgPSB0cnVlOwotICAgICAgc3RhdGVfID0gam9pbiA/IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcgOiBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORzsKLSAgICB9Ci0gIH0KLQotICBpZiAoZG9TdG9wKSB7Ci0gICAgcmVtb3ZlV29ya2VyKHdvcmtlckNvdW50Xyk7Ci0gIH0KLQotICAvLyBYWFgKLSAgLy8gc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgaGVyZSBmb3IgdHJhbnNpdGlvbiB0byBTVE9QUEVEIHNpbmNlIHdlJ3JlIG5vCi0gIC8vIHVzaW5nIHNoYXJlZF9wdHJzCi0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEOwotICB9Ci0KLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKSB7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHJlbW92ZWRUaHJlYWRzOwotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgewotICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgd29ya2VyTWF4Q291bnRfIC09IHZhbHVlOwotCi0gICAgaWYgKGlkbGVDb3VudF8gPCB2YWx1ZSkgewotICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGlkbGVDb3VudF87IGl4KyspIHsKLSAgICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0KLSAgICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgewotICAgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLQotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gZGVhZFdvcmtlcnNfLmJlZ2luKCk7IGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsgaXgrKykgewotICAgICAgd29ya2Vyc18uZXJhc2UoKml4KTsKLSAgICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7Ci0gICAgfQotCi0gICAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Ci0gIH0KLX0KLQotICBib29sIFRocmVhZE1hbmFnZXI6OkltcGw6OmNhblNsZWVwKCkgewotICAgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKLSAgICByZXR1cm4gaWRNYXBfLmZpbmQoaWQpID09IGlkTWFwXy5lbmQoKTsKLSAgfQotCi0gIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJhdGlvbikgewotICAgIEd1YXJkIGcobXV0ZXhfLCB0aW1lb3V0KTsKLQotICAgIGlmICghZykgewotICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHJlbW92ZUV4cGlyZWRUYXNrcygpOwotICAgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7Ci0gICAgICBpZiAoY2FuU2xlZXAoKSAmJiB0aW1lb3V0ID49IDApIHsKLSAgICAgICAgd2hpbGUgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiB0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSB7Ci0gICAgICAgICAgLy8gVGhpcyBpcyB0aHJlYWQgc2FmZSBiZWNhdXNlIHRoZSBtdXRleCBpcyBzaGFyZWQgYmV0d2VlbiBtb25pdG9ycy4KLSAgICAgICAgICBtYXhNb25pdG9yXy53YWl0KHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGFza3NfLnB1c2goc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKLQotICAgIC8vIElmIGlkbGUgdGhyZWFkIGlzIGF2YWlsYWJsZSBub3RpZnkgaXQsIG90aGVyd2lzZSBhbGwgd29ya2VyIHRocmVhZHMgYXJlCi0gICAgLy8gcnVubmluZyBhbmQgd2lsbCBnZXQgYXJvdW5kIHRvIHRoaXMgdGFzayBpbiB0aW1lLgotICAgIGlmIChpZGxlQ291bnRfID4gMCkgewotICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgfQotICB9Ci0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgKHZvaWQpIHRhc2s7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gIH0KLX0KLQotYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nKCkgewotICBHdWFyZCBnKG11dGV4Xyk7Ci0gIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgewotICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICB9Ci0KLSAgaWYgKHRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigpOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7Ci0gIHRhc2tzXy5wb3AoKTsKLSAgCi0gIHJldHVybiB0YXNrLT5nZXRSdW5uYWJsZSgpOwotfQotCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZUV4cGlyZWRUYXNrcygpIHsKLSAgaW50NjRfdCBub3cgPSAwTEw7IC8vIHdlIHdvbid0IGFzayBmb3IgdGhlIHRpbWUgdW50aWxlIHdlIG5lZWQgaXQKLQotICAvLyBub3RlIHRoYXQgdGhpcyBsb29wIGJyZWFrcyBhdCB0aGUgZmlyc3Qgbm9uLWV4cGlyaW5nIHRhc2sKLSAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOwotICAgIGlmICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPT0gMExMKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKG5vdyA9PSAwTEwpIHsKLSAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgfQotICAgIGlmICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPiBub3cpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoZXhwaXJlQ2FsbGJhY2tfKSB7Ci0gICAgICBleHBpcmVDYWxsYmFja18odGFzay0+Z2V0UnVubmFibGUoKSk7Ci0gICAgfQotICAgIHRhc2tzXy5wb3AoKTsKLSAgICBleHBpcmVkQ291bnRfKys7Ci0gIH0KLX0KLQotCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKSB7Ci0gIGV4cGlyZUNhbGxiYWNrXyA9IGV4cGlyZUNhbGxiYWNrOwotfQotCi1jbGFzcyBTaW1wbGVUaHJlYWRNYW5hZ2VyIDogcHVibGljIFRocmVhZE1hbmFnZXI6OkltcGwgewotCi0gcHVibGljOgotICBTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCB3b3JrZXJDb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKSA6Ci0gICAgd29ya2VyQ291bnRfKHdvcmtlckNvdW50KSwKLSAgICBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSwKLSAgICBmaXJzdFRpbWVfKHRydWUpIHsKLSAgfQotCi0gIHZvaWQgc3RhcnQoKSB7Ci0gICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cGVuZGluZ1Rhc2tDb3VudE1heChwZW5kaW5nVGFza0NvdW50TWF4Xyk7Ci0gICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKTsKLSAgICBhZGRXb3JrZXIod29ya2VyQ291bnRfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc2l6ZV90IHdvcmtlckNvdW50XzsKLSAgY29uc3Qgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOwotICBib29sIGZpcnN0VGltZV87Ci0gIE1vbml0b3IgbW9uaXRvcl87Ci19OwotCi0KLXNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gVGhyZWFkTWFuYWdlcjo6bmV3VGhyZWFkTWFuYWdlcigpIHsKLSAgcmV0dXJuIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4obmV3IFRocmVhZE1hbmFnZXI6OkltcGwoKSk7Ci19Ci0KLXNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KSB7Ci0gIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBTaW1wbGVUaHJlYWRNYW5hZ2VyKGNvdW50LCBwZW5kaW5nVGFza0NvdW50TWF4KSk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdiMGVmLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXyAxCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJUaHJlYWQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIFRocmVhZCBQb29sIE1hbmFnZXIgYW5kIHJlbGF0ZWQgY2xhc3NlcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRocmVhZE1hbmFnZXI7Ci0KLS8qKgotICogVGhyZWFkTWFuYWdlciBjbGFzcwotICoKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIHBvb2wgb2YgdGhyZWFkcy4gSXQgdXNlcyBhIFRocmVhZEZhY3RvcnkgdG8gY3JlYXRlCi0gKiB0aHJlYWRzLiBJdCBuZXZlciBhY3R1YWxseSBjcmVhdGVzIG9yIGRlc3Ryb3lzIHdvcmtlciB0aHJlYWRzLCByYXRoZXIKLSAqIEl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKLSAqIHRhc2sgYmFja2xvZywgYW5kIGF2ZXJhZ2Ugd2FpdCBhbmQgc2VydmljZSB0aW1lcyBhbmQgaW5mb3JtcyB0aGUgUG9vbFBvbGljeQotICogb2JqZWN0IGJvdW5kIHRvIGluc3RhbmNlcyBvZiB0aGlzIG1hbmFnZXIgb2YgaW50ZXJlc3RpbmcgdHJhbnNpdGlvbnMuIEl0IGlzCi0gKiB0aGVuIHVwIHRoZSBQb29sUG9saWN5IG9iamVjdCB0byBkZWNpZGUgaWYgdGhlIHRocmVhZCBwb29sIHNpemUgbmVlZHMgdG8gYmUKLSAqIGFkanVzdGVkIGFuZCBjYWxsIHRoaXMgb2JqZWN0IGFkZFdvcmtlciBhbmQgcmVtb3ZlV29ya2VyIG1ldGhvZHMgdG8gbWFrZQotICogY2hhbmdlcy4KLSAqCi0gKiBUaGlzIGRlc2lnbiBhbGxvd3MgZGlmZmVyZW50IHBvbGljeSBpbXBsZW1lbnRhdGlvbnMgdG8gdXNlZCB0aGlzIGNvZGUgdG8KLSAqIGhhbmRsZSBiYXNpYyB3b3JrZXIgdGhyZWFkIG1hbmFnZW1lbnQgYW5kIHdvcmtlciB0YXNrIGV4ZWN1dGlvbiBhbmQgZm9jdXMgb24KLSAqIHBvbGljeSBpc3N1ZXMuIFRoZSBzaW1wbGVzdCBwb2xpY3ksIFN0YXRpY1BvbGljeSwgZG9lcyBub3RoaW5nIG90aGVyIHRoYW4KLSAqIGNyZWF0ZSBhIGZpeGVkIG51bWJlciBvZiB0aHJlYWRzLgotICovCi1jbGFzcyBUaHJlYWRNYW5hZ2VyIHsKLQotIHByb3RlY3RlZDoKLSAgVGhyZWFkTWFuYWdlcigpIHt9Ci0KLSBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s7Ci0gIHR5cGVkZWYgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KT4gRXhwaXJlQ2FsbGJhY2s7Ci0KLSAgdmlydHVhbCB+VGhyZWFkTWFuYWdlcigpIHt9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgdGhyZWFkIG1hbmFnZXIuIFZlcmlmaWVzIGFsbCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBwcm9wZXJseQotICAgKiBpbml0aWFsaXplZCwgdGhlbiBhbGxvY2F0ZXMgbmVjZXNzYXJ5IHJlc291cmNlcyB0byBiZWdpbiBvcGVyYXRpb24KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKLQotICAvKioKLSAgICogU3RvcHMgdGhlIHRocmVhZCBtYW5hZ2VyLiBBYm9ydHMgYWxsIHJlbWFpbmluZyB1bnByb2Nlc3NlZCB0YXNrLCBzaHV0cwotICAgKiBkb3duIGFsbCBjcmVhdGVkIHdvcmtlciB0aHJlYWRzLCBhbmQgcmVhbGVhc2VzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgotICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBjb21wbGV0ZSwgdGh1cyBpdCBjYW4KLSAgICogcG90ZW50aWFsbHkgYmxvY2sgZm9yZXZlciBpZiBhIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZyBhIHRhc2sgdGhhdAotICAgKiB3b24ndCB0ZXJtaW5hdGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RvcCgpID0gMDsKLQotICAvKioKLSAgICogSm9pbnMgdGhlIHRocmVhZCBtYW5hZ2VyLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHN0b3AsIGV4Y2VwdCB0aGF0IGl0IHdpbGwKLSAgICogYmxvY2sgdW50aWwgYWxsIHRoZSB3b3JrZXJzIGhhdmUgZmluaXNoZWQgdGhlaXIgd29yay4gQXQgdGhhdCBwb2ludAotICAgKiB0aGUgVGhyZWFkTWFuYWdlciB3aWxsIHRyYW5zaXRpb24gaW50byB0aGUgU1RPUFBFRCBzdGF0ZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBqb2luKCkgPSAwOwotCi0gIGVudW0gU1RBVEUgewotICAgIFVOSU5JVElBTElaRUQsCi0gICAgU1RBUlRJTkcsCi0gICAgU1RBUlRFRCwKLSAgICBKT0lOSU5HLAotICAgIFNUT1BQSU5HLAotICAgIFNUT1BQRUQKLSAgfTsKLQotICB2aXJ0dWFsIFNUQVRFIHN0YXRlKCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlPTEpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZT0xKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGlkbGUgd29ya2VyIHRocmVhZHMKLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IGlkbGVXb3JrZXJDb3VudCgpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgdG90YWwgd29ya2VyIHRocmVhZHMKLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBwZW5kaW5nIHRhc2tzCi0gICAqLwotICB2aXJ0dWFsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50KCkgY29uc3QgID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgcGVuZGluZyBhbmQgZXhlY3V0aW5nIHRhc2tzCi0gICAqLwotICB2aXJ0dWFsIHNpemVfdCB0b3RhbFRhc2tDb3VudCgpIGNvbnN0ID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgbWF4aW11bSBwZW5kaW5nIHRhc2sgY291bnQuICAwIGluZGljYXRlcyBubyBtYXhpbXVtCi0gICAqLwotICB2aXJ0dWFsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGFza3Mgd2hpY2ggaGF2ZSBiZWVuIGV4cGlyZWQgd2l0aG91dCBiZWluZyBydW4uCi0gICAqLwotICB2aXJ0dWFsIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgPSAwOwotCi0gIC8qKgotICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCi0gICAqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGluIG5vdCB6ZXJvIGFuZCBwZW5kaW5nVGFza0NvdW50KCkKLSAgICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsdCB0byBwZW5kaW5nVGFza0NvdW50TWF4KCkuICBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gdGhlCi0gICAqIGNvbnRleHQgb2YgYSBUaHJlYWRNYW5hZ2VyIHdvcmtlciB0aHJlYWQgaXQgd2lsbCB0aHJvdyBhCi0gICAqIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgIFRoZSB0YXNrIHRvIHF1ZXVlIGZvciBleGVjdXRpb24KLSAgICoKLSAgICogQHBhcmFtIHRpbWVvdXQgVGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcyB0byBhZGQgYSB0YXNrIHdoZW4gYSBwZW5kaW5nLXRhc2stY291bnQKLSAgICogaXMgc3BlY2lmaWVkLiBTcGVjaWZpYyBjYXNlczoKLSAgICogdGltZW91dCA9IDAgIDogV2FpdCBmb3JldmVyIHRvIHF1ZXVlIHRhc2suCi0gICAqIHRpbWVvdXQgPSAtMSA6IFJldHVybiBpbW1lZGlhdGVseSBpZiBwZW5kaW5nIHRhc2sgY291bnQgZXhjZWVkcyBzcGVjaWZpZWQgbWF4Ci0gICAqIEBwYXJhbSBleHBpcmF0aW9uIHdoZW4gbm9uemVybywgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhlIHRhc2sgaXMgdmFsaWQKLSAgICogdG8gYmUgcnVuOyBpZiBleGNlZWRlZCwgdGhlIHRhc2sgd2lsbCBiZSBkcm9wcGVkIG9mZiB0aGUgcXVldWUgYW5kIG5vdCBydW4uCi0gICAqCi0gICAqIEB0aHJvd3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiBQZW5kaW5nIHRhc2sgY291bnQgZXhjZWVkcyBtYXggcGVuZGluZyB0YXNrIGNvdW50Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPnRhc2ssCi0gICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0PTBMTCwKLSAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb249MExMKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCByZW1vdmUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spID0gMDsKLQotICAvKioKLSAgICogUmVtb3ZlIHRoZSBuZXh0IHBlbmRpbmcgdGFzayB3aGljaCB3b3VsZCBiZSBydW4uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHRhc2sgcmVtb3ZlZC4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCkgPSAwOwotCi0gIC8qKgotICAgKiBSZW1vdmUgdGFza3MgZnJvbSBmcm9udCBvZiB0YXNrIHF1ZXVlIHRoYXQgaGF2ZSBleHBpcmVkLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpID0gMDsKLQotICAvKioKLSAgICogU2V0IGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB0YXNrIGlzIGV4cGlyZWQgYW5kIG5vdCBydW4uCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcmVDYWxsYmFjayBhIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBmb3IKLSAgICogdGhlIGV4cGlyZWQgdGFzay4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgPSAwOwotCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdUaHJlYWRNYW5hZ2VyKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzaW1wbGUgdGhyZWFkIG1hbmFnZXIgdGhlIHVzZXMgY291bnQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBoYXMKLSAgICogYSBwZW5kaW5nVGFza0NvdW50TWF4IG1heGltdW0gcGVuZGluZyB0YXNrcy4gVGhlIGRlZmF1bHQsIDAsIHNwZWNpZmllZCBubyBsaW1pdAotICAgKiBvbiBwZW5kaW5nIHRhc2tzCi0gICAqLwotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQ9NCwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXg9MCk7Ci0KLSAgY2xhc3MgVGFzazsKLQotICBjbGFzcyBXb3JrZXI7Ci0KLSAgY2xhc3MgSW1wbDsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhY2QwYS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRpbWVyTWFuYWdlci5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIlV0aWwuaCIKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLQotLyoqCi0gKiBUaW1lck1hbmFnZXIgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaW1lck1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewotCi0gcHVibGljOgotICBlbnVtIFNUQVRFIHsKLSAgICBXQUlUSU5HLAotICAgIEVYRUNVVElORywKLSAgICBDQU5DRUxMRUQsCi0gICAgQ09NUExFVEUKLSAgfTsKLQotICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6Ci0gICAgcnVubmFibGVfKHJ1bm5hYmxlKSwKLSAgICBzdGF0ZV8oV0FJVElORykge30KLQotICB+VGFzaygpIHsKLSAgfQotCi0gIHZvaWQgcnVuKCkgewotICAgIGlmIChzdGF0ZV8gPT0gRVhFQ1VUSU5HKSB7Ci0gICAgICBydW5uYWJsZV8tPnJ1bigpOwotICAgICAgc3RhdGVfID0gQ09NUExFVEU7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87Ci0gIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7Ci0gIFNUQVRFIHN0YXRlXzsKLX07Ci0KLWNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjogcHVibGljIFJ1bm5hYmxlIHsKLQotIHB1YmxpYzoKLSAgRGlzcGF0Y2hlcihUaW1lck1hbmFnZXIqIG1hbmFnZXIpIDoKLSAgICBtYW5hZ2VyXyhtYW5hZ2VyKSB7fQotCi0gIH5EaXNwYXRjaGVyKCkge30KLQotICAvKioKLSAgICogRGlzcGF0Y2hlciBlbnRyeSBwb2ludAotICAgKgotICAgKiBBcyBsb25nIGFzIGRpc3BhdGNoZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHRhc2tNYXBfCi0gICAqIGFuZCBleGVjdXRlLgotICAgKi8KLSAgdm9pZCBydW4oKSB7Ci0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpIHsKLSAgICAgICAgbWFuYWdlcl8tPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRDsKLSAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGRvIHsKLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+IGV4cGlyZWRUYXNrczsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgICAgdGFza19pdGVyYXRvciBleHBpcmVkVGFza0VuZDsKLSAgICAgICAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgICAgICB3aGlsZSAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQgJiYKLSAgICAgICAgICAgICAgIChleHBpcmVkVGFza0VuZCA9IG1hbmFnZXJfLT50YXNrTWFwXy51cHBlcl9ib3VuZChub3cpKSA9PSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSkgewotICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTDsKLSAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrTWFwXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aW1lb3V0ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCktPmZpcnN0IC0gbm93OwotICAgICAgICAgIH0KLSAgICAgICAgICBhc3NlcnQoKHRpbWVvdXQgIT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA+IDApIHx8ICh0aW1lb3V0ID09IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPT0gMCkpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKLSAgICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiAmZSkge30KLSAgICAgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgICAgICAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrRW5kOyBpeCsrKSB7Ci0gICAgICAgICAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gdGFzayA9IGl4LT5zZWNvbmQ7Ci0gICAgICAgICAgICBleHBpcmVkVGFza3MuaW5zZXJ0KHRhc2spOwotICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+dGFza0NvdW50Xy0tOwotICAgICAgICAgIH0KLSAgICAgICAgICBtYW5hZ2VyXy0+dGFza01hcF8uZXJhc2UobWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCksIGV4cGlyZWRUYXNrRW5kKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGFzaz4gPjo6aXRlcmF0b3IgaXggPSAgZXhwaXJlZFRhc2tzLmJlZ2luKCk7IGl4ICE9IGV4cGlyZWRUYXNrcy5lbmQoKTsgaXgrKykgewotICAgICAgICAoKml4KS0+cnVuKCk7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7Ci0KLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOwotICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVE9QUElORykgewotICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVE9QUEVEOwotICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVGltZXJNYW5hZ2VyKiBtYW5hZ2VyXzsKLSAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjsKLX07Ci0KLVRpbWVyTWFuYWdlcjo6VGltZXJNYW5hZ2VyKCkgOgotICB0YXNrQ291bnRfKDApLAotICBzdGF0ZV8oVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKLSAgZGlzcGF0Y2hlcl8oc2hhcmVkX3B0cjxEaXNwYXRjaGVyPihuZXcgRGlzcGF0Y2hlcih0aGlzKSkpIHsKLX0KLQotCi1UaW1lck1hbmFnZXI6On5UaW1lck1hbmFnZXIoKSB7Ci0KLSAgLy8gSWYgd2UgaGF2ZW4ndCBiZWVuIGV4cGxpY2l0bHkgc3RvcHBlZCwgZG8gc28gbm93LiAgV2UgZG9uJ3QgbmVlZCB0byBncmFiCi0gIC8vIHRoZSBtb25pdG9yIGhlcmUsIHNpbmNlIHN0b3AgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHJlZW50cmFuY3kuCi0KLSAgaWYgKHN0YXRlXyAhPSBTVE9QUEVEKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHN0b3AoKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgdGhyb3c7Ci0gICAgICAvLyB1aG9oCi0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjpzdGFydCgpIHsKLSAgYm9vbCBkb1N0YXJ0ID0gZmFsc2U7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHRocmVhZEZhY3RvcnlfID09IE5VTEwpIHsKLSAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBpZiAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgc3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVEFSVElORzsKLSAgICAgIGRvU3RhcnQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChkb1N0YXJ0KSB7Ci0gICAgZGlzcGF0Y2hlclRocmVhZF8gPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKGRpc3BhdGNoZXJfKTsKLSAgICBkaXNwYXRjaGVyVGhyZWFkXy0+c3RhcnQoKTsKLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgd2hpbGUgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7Ci0gICAgICBtb25pdG9yXy53YWl0KCk7Ci0gICAgfQotICAgIGFzc2VydChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORyk7Ci0gIH0KLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OnN0b3AoKSB7Ci0gIGJvb2wgZG9TdG9wID0gZmFsc2U7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKLSAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RPUFBFRDsKLSAgICB9IGVsc2UgaWYgKHN0YXRlXyAhPSBTVE9QUElORyAmJiAgc3RhdGVfICE9IFNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBTVE9QUElORzsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLSAgICB3aGlsZSAoc3RhdGVfICE9IFNUT1BQRUQpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZG9TdG9wKSB7Ci0gICAgLy8gQ2xlYW4gdXAgYW55IG91dHN0YW5kaW5nIHRhc2tzCi0gICAgdGFza01hcF8uY2xlYXIoKTsKLQotICAgIC8vIFJlbW92ZSBkaXNwYXRjaGVyJ3MgcmVmZXJlbmNlIHRvIHVzLgotICAgIGRpc3BhdGNoZXJfLT5tYW5hZ2VyXyA9IE5VTEw7Ci0gIH0KLX0KLQotc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3RvcnkoKSBjb25zdCB7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwotfQotCi12b2lkIFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+ICB2YWx1ZSkgewotICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7Ci19Ci0KLXNpemVfdCBUaW1lck1hbmFnZXI6OnRhc2tDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRhc2tDb3VudF87Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KSB7Ci0gIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgdGltZW91dCArPSBub3c7Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewotICAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHRhc2sgbWFwIGlzIGVtcHR5LCB3ZSB3aWxsIGtpY2sgdGhlIGRpc3BhdGNoZXIgZm9yIHN1cmUuIE90aGVyd2lzZSwgd2Uga2ljayBoaW0KLSAgICAvLyBpZiB0aGUgZXhwaXJhdGlvbiB0aW1lIGlzIHNob3J0ZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZS4gTmVlZCB0byB0ZXN0IGJlZm9yZSB3ZSBpbnNlcnQsCi0gICAgLy8gYmVjYXVzZSB0aGUgbmV3IHRhc2sgbWlnaHQgaW5zZXJ0IGF0IHRoZSBmcm9udC4KLSAgICBib29sIG5vdGlmeVJlcXVpcmVkID0gKHRhc2tDb3VudF8gPT0gMCkgPyB0cnVlIDogdGltZW91dCA8IHRhc2tNYXBfLmJlZ2luKCktPmZpcnN0OwotCi0gICAgdGFza0NvdW50XysrOwotICAgIHRhc2tNYXBfLmluc2VydChzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHNoYXJlZF9wdHI8VGFzaz4obmV3IFRhc2sodGFzaykpKSk7Ci0KLSAgICAvLyBJZiB0aGUgdGFzayBtYXAgd2FzIGVtcHR5LCBvciBpZiB3ZSBoYXZlIGFuIGV4cGlyYXRpb24gdGhhdCBpcyBlYXJsaWVyCi0gICAgLy8gdGhhbiBhbnkgcHJldmlvdXNseSBzZWVuLCBraWNrIHRoZSBkaXNwYXRjaGVyIHNvIGl0IGNhbiB1cGRhdGUgaXRzCi0gICAgLy8gdGltZW91dAotICAgIGlmIChub3RpZnlSZXF1aXJlZCkgewotICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB2YWx1ZSkgewotCi0gIGludDY0X3QgZXhwaXJhdGlvbjsKLSAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOwotCi0gIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICBpZiAoZXhwaXJhdGlvbiA8IG5vdykgewotICAgIHRocm93ICBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgfQotCi0gIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKLX0KLQotCi12b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgKHZvaWQpIHRhc2s7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgfQotfQotCi1UaW1lck1hbmFnZXI6OlNUQVRFIFRpbWVyTWFuYWdlcjo6c3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV87IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTA1ZGRiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXyAxCi0KLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJNb25pdG9yLmgiCi0jaW5jbHVkZSAiVGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVGltZXIgTWFuYWdlcgotICoKLSAqIFRoaXMgY2xhc3MgZGlzcGF0Y2hlcyB0aW1lciB0YXNrcyB3aGVuIHRoZXkgZmFsbCBkdWUuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGltZXJNYW5hZ2VyIHsKLQotIHB1YmxpYzoKLQotICBUaW1lck1hbmFnZXIoKTsKLQotICB2aXJ0dWFsIH5UaW1lck1hbmFnZXIoKTsKLQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE1pc3NpbmcgdGhyZWFkIGZhY3RvcnkgYXR0cmlidXRlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKLQotICAvKioKLSAgICogU3RvcHMgdGhlIHRpbWVyIG1hbmFnZXIgc2VydmljZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0b3AoKTsKLQotICB2aXJ0dWFsIHNpemVfdCB0YXNrQ291bnQoKSBjb25zdCA7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQotICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgZXhlY3V0aW5nIHRhc2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQotICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB0aW1lb3V0KTsKLQotICAvKioKLSAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawotICAgKgotICAgKiBAdGhyb3dzIE5vU3VjaFRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgZG9lc24ndCBleGlzdC4gSXQgd2FzIGVpdGhlcgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFscmVhZHkgb3IgdGhpcyBjYWxsIHdhcyBtYWRlIGZvciBhCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoaXMgdGltZXIKLSAgICoKLSAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKLQotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OwotCi0gIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotICBjbGFzcyBUYXNrOwotICBmcmllbmQgY2xhc3MgVGFzazsKLSAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOwotICBzaXplX3QgdGFza0NvdW50XzsKLSAgTW9uaXRvciBtb25pdG9yXzsKLSAgU1RBVEUgc3RhdGVfOwotICBjbGFzcyBEaXNwYXRjaGVyOwotICBmcmllbmQgY2xhc3MgRGlzcGF0Y2hlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87Ci0gIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID46Oml0ZXJhdG9yIHRhc2tfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPHRhc2tfaXRlcmF0b3IsIHRhc2tfaXRlcmF0b3I+IHRhc2tfcmFuZ2U7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9VdGlsLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjIzNDQ5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYgLy8gZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotaW50NjRfdCBVdGlsOjpjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgaW50NjRfdCByZXN1bHQ7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLSAgc3RydWN0IHRpbWVzcGVjIG5vdzsKLSAgaW50IHJldCA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpOwotICBhc3NlcnQocmV0ID09IDApOwotICB0b1RpY2tzKHJlc3VsdCwgbm93LCB0aWNrc1BlclNlYyk7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQotICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gIGludCByZXQgPSBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0gIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKLSNlbHNlCi0jZXJyb3IgIk5vIGhpZ2gtcHJlY2lzaW9uIGNsb2NrIGlzIGF2YWlsYWJsZS4iCi0jZW5kaWYgLy8gZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJkMjVlLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXyAxCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcwotICoKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYmFzaWMgdXRpbGl0eSBtZXRob2RzIGZvciBjb252ZXJ0aW5nIHRpbWUgZm9ybWF0cywKLSAqIGFuZCBvdGhlciBjb21tb24gcGxhdGZvcm0tZGVwZW5kZW50IGNvbmN1cnJlbmN5IG9wZXJhdGlvbnMuCi0gKiBJdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIEFQSSBoZWFkZXJzIGZvciBvdGhlciBjb25jdXJyZW5jeSBsaWJyYXJ5Ci0gKiBoZWFkZXJzLCBzaW5jZSBpdCB3aWxsLCBieSBkZWZpbml0aW9uLCBwdWxsIGluIGFsbCBzb3J0cyBvZiBob3JyaWQKLSAqIHBsYXRmb3JtIGRlcGVuZGVudCBzdHVmZi4gIFJhdGhlciBpdCBzaG91bGQgYmUgaW5sdWRlZCBkaXJlY3RseSBpbgotICogY29uY3VycmVuY3kgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBzb3VyY2UuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVXRpbCB7Ci0KLSAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX1MgPSAxMDAwMDAwMDAwTEw7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9TID0gMTAwMDAwMExMOwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBNU19QRVJfUyA9IDEwMDBMTDsKLQotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfTVMgPSBOU19QRVJfUyAvIE1TX1BFUl9TOwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfVVMgPSBOU19QRVJfUyAvIFVTX1BFUl9TOwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBVU19QRVJfTVMgPSBVU19QRVJfUyAvIE1TX1BFUl9TOwotCi0gcHVibGljOgotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBtaWxsaXNlY29uZCB0aW1lc3RhbXAgaW50byBhIHRpbWVzcGVjIHN0cnVjdAotICAgKgotICAgKiBAcGFyYW0gc3RydWN0IHRpbWVzcGVjJiByZXN1bHQKLSAgICogQHBhcmFtIHRpbWUgb3IgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b1RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlIC8gTVNfUEVSX1M7IC8vIG1zIHRvIHMKLSAgICByZXN1bHQudHZfbnNlYyA9ICh2YWx1ZSAlIE1TX1BFUl9TKSAqIE5TX1BFUl9NUzsgLy8gbXMgdG8gbnMKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHRvVGltZXZhbChzdHJ1Y3QgdGltZXZhbCYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlIC8gTVNfUEVSX1M7IC8vIG1zIHRvIHMKLSAgICByZXN1bHQudHZfdXNlYyA9ICh2YWx1ZSAlIE1TX1BFUl9TKSAqIFVTX1BFUl9NUzsgLy8gbXMgdG8gdXMKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LCBpbnQ2NF90IHNlY3MsIGludDY0X3Qgb2xkVGlja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvbGRUaWNrc1BlclNlYywgaW50NjRfdCBuZXdUaWNrc1BlclNlYykgewotICAgIHJlc3VsdCA9IHNlY3MgKiBuZXdUaWNrc1BlclNlYzsKLSAgICByZXN1bHQgKz0gb2xkVGlja3MgKiBuZXdUaWNrc1BlclNlYyAvIG9sZFRpY2tzUGVyU2VjOwotCi0gICAgaW50NjRfdCBvbGRQZXJOZXcgPSBvbGRUaWNrc1BlclNlYyAvIG5ld1RpY2tzUGVyU2VjOwotICAgIGlmIChvbGRQZXJOZXcgJiYgKChvbGRUaWNrcyAlIG9sZFBlck5ldykgPj0gKG9sZFBlck5ldyAvIDIpKSkgewotICAgICAgKytyZXN1bHQ7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfbnNlYywgTlNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWVzcGVjIHRvIG1pbGxpc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIG1pbGxpc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWVzcGVjIHRvIG1pY3Jvc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWNyb3NlY29uZHMKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRvVXNlYyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIGEgbnVtYmVyIG9mIGFyYml0cmFyeS1zaXplIHRpY2tzIGZyb20gZXBvY2gKLSAgICovCi0gIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYyk7Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IHRpbWUgYXMgbWlsbGlzZWNvbmRzIGZyb20gZXBvY2gKLSAgICovCi0gIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhNU19QRVJfUyk7IH0KLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWNyb3MgZnJvbSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWVVc2VjKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhVU19QRVJfUyk7IH0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1Rlc3RzLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODBiYjg4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJUaHJlYWRGYWN0b3J5VGVzdHMuaCIKLSNpbmNsdWRlICJUaW1lck1hbmFnZXJUZXN0cy5oIgotI2luY2x1ZGUgIlRocmVhZE1hbmFnZXJUZXN0cy5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLQotICBzdGQ6OnN0cmluZyBhcmc7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICBhcmdzKGFyZ2MgLSAxID4gMSA/IGFyZ2MgLSAxIDogMSk7Ci0KLSAgYXJnc1swXSA9ICJhbGwiOwotCi0gIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7Ci0gICAgYXJnc1tpeCAtIDFdID0gc3RkOjpzdHJpbmcoYXJndltpeF0pOwotICB9Ci0KLSAgYm9vbCBydW5BbGwgPSBhcmdzWzBdLmNvbXBhcmUoImFsbCIpID09IDA7Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1mYWN0b3J5IikgPT0gMCkgewotCi0gICAgVGhyZWFkRmFjdG9yeVRlc3RzIHRocmVhZEZhY3RvcnlUZXN0czsKLQotICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgc2l6ZV90IGNvdW50ID0gIDEwMDA7Ci0gICAgc2l6ZV90IGZsb29kTG9vcHMgPSAgMTsKLSAgICBzaXplX3QgZmxvb2RDb3VudCA9ICAxMDAwMDA7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGNvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKGNvdW50KSk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgdGVzdCIgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5zeW5jaFN0YXJ0VGVzdCgpKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMubW9uaXRvclRpbWVvdXRUZXN0KCkpOwotICB9Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlV0aWwgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFV0aWwgbWluaW11bSB0aW1lIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRNaW5pbXVtIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwIDw8ICJtcyIgPDwgc3RkOjplbmRsOwotCi0gICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB0aW1lMDEgPSB0aW1lMDA7Ci0gICAgc2l6ZV90IGNvdW50ID0gMDsKLQotICAgIHdoaWxlICh0aW1lMDEgPCB0aW1lMDAgKyAxMCkgewotICAgICAgY291bnQrKzsKLSAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgfQotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRzY2FsbCBwZXIgbXM6ICIgPDwgY291bnQgLyAodGltZTAxIC0gdGltZTAwKSA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotCi0gIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aW1lci1tYW5hZ2VyIikgPT0gMCkgewotCi0gICAgc3RkOjpjb3V0IDw8ICJUaW1lck1hbmFnZXIgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDAiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIFRpbWVyTWFuYWdlclRlc3RzIHRpbWVyTWFuYWdlclRlc3RzOwotCi0gICAgYXNzZXJ0KHRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKTsKLSAgfQotCi0gIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlciIpID09IDApIHsKLQotICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgewotCi0gICAgICBzaXplX3Qgd29ya2VyQ291bnQgPSAxMDA7Ci0KLSAgICAgIHNpemVfdCB0YXNrQ291bnQgPSAxMDAwMDA7Ci0KLSAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7Ci0KLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpOwotCi0gICAgfQotICB9Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1tYW5hZ2VyLWJlbmNobWFyayIpID09IDApIHsKLQotICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciBiZW5jaG1hcmsgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHsKLQotICAgICAgc2l6ZV90IG1pbldvcmtlckNvdW50ID0gMjsKLQotICAgICAgc2l6ZV90IG1heFdvcmtlckNvdW50ID0gNTEyOwotCi0gICAgICBzaXplX3QgdGFza3NQZXJXb3JrZXIgPSAxMDAwOwotCi0gICAgICBpbnQ2NF90IGRlbGF5ID0gMTBMTDsKLQotICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPCBtYXhXb3JrZXJDb3VudDsgd29ya2VyQ291bnQqPSAyKSB7Ci0KLSAgICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IHdvcmtlckNvdW50ICogdGFza3NQZXJXb3JrZXI7Ci0KLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudCA8PCAiIHRhc2sgY291bnQ6ICIgPDwgdGFza0NvdW50IDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOwotCi0gICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7Ci0KLSAgICAgICAgdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkRmFjdG9yeVRlc3RzLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZEZhY3RvcnlUZXN0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRjODlkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaHJlYWRGYWN0b3J5VGVzdHMgewotCi1wdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIFRhc2soKSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdEhlbGxvIFdvcmxkIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9OwotCi0gIC8qKgotICAgKiBIZWxsbyB3b3JsZCB0ZXN0Ci0gICAqLwotICBib29sIGhlbGxvV29ybGRUZXN0KCkgewotCi0gICAgUG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIHNoYXJlZF9wdHI8VGFzaz4gdGFzayA9IHNoYXJlZF9wdHI8VGFzaz4obmV3IFRocmVhZEZhY3RvcnlUZXN0czo6VGFzaygpKTsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgIHRocmVhZC0+c3RhcnQoKTsKLQotICAgIHRocmVhZC0+am9pbigpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRTdWNjZXNzISIgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhcCBOIHRocmVhZHMKLSAgICovCi0gIGNsYXNzIFJlYXBOVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotICAgcHVibGljOgotCi0gICAgUmVhcE5UYXNrKE1vbml0b3ImIG1vbml0b3IsIGludCYgYWN0aXZlQ291bnQpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX2NvdW50KGFjdGl2ZUNvdW50KSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgIF9jb3VudC0tOwotCi0gICAgICAvL3N0ZDo6Y291dCA8PCAiXHRcdFx0dGhyZWFkIGNvdW50OiAiIDw8IF9jb3VudCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIGlmIChfY291bnQgPT0gMCkgewotICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLQotICAgIGludCYgX2NvdW50OwotICB9OwotCi0gIGJvb2wgcmVhcE5UaHJlYWRzKGludCBsb29wPTEsIGludCBjb3VudD0xMCkgewotCi0gICAgUG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSAgUG9zaXhUaHJlYWRGYWN0b3J5KCk7Ci0KLSAgICBNb25pdG9yKiBtb25pdG9yID0gbmV3IE1vbml0b3IoKTsKLQotICAgIGZvcihpbnQgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKLQotICAgICAgaW50KiBhY3RpdmVDb3VudCAgPSBuZXcgaW50KGNvdW50KTsKLQotICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gdGhyZWFkczsKLQotICAgICAgaW50IHRpeDsKLQotICAgICAgZm9yICh0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICB0aHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCAqYWN0aXZlQ291bnQpKSkpOwotICAgICAgICB9IGNhdGNoKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4ICogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0aXggPSAwOwotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gdGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gdGhyZWFkcy5lbmQoKTsgdGl4KyssICsrdGhyZWFkKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7Ci0gICAgICAgIH0gY2F0Y2goU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXggKiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoKm1vbml0b3IpOwotICAgICAgICB3aGlsZSAoKmFjdGl2ZUNvdW50ID4gMCkgewotICAgICAgICAgIG1vbml0b3ItPndhaXQoMTAwMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXggKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIFN5bmNoU3RhcnRUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gICBwdWJsaWM6Ci0KLSAgICBlbnVtIFNUQVRFIHsKLSAgICAgIFVOSU5JVElBTElaRUQsCi0gICAgICBTVEFSVElORywKLSAgICAgIFNUQVJURUQsCi0gICAgICBTVE9QUElORywKLSAgICAgIFNUT1BQRUQKLSAgICB9OwotCi0gICAgU3luY2hTdGFydFRhc2soTW9uaXRvciYgbW9uaXRvciwgdm9sYXRpbGUgIFNUQVRFJiBzdGF0ZSkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfc3RhdGUoc3RhdGUpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICBpZiAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgewotICAgICAgICAgIF9zdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEOwotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZSAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7Ci0gICAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkcpIHsKLSAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRDsKLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICB2b2xhdGlsZSAgU1RBVEUmIF9zdGF0ZTsKLSAgfTsKLQotICBib29sIHN5bmNoU3RhcnRUZXN0KCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgU3luY2hTdGFydFRhc2s6OlNUQVRFIHN0YXRlID0gU3luY2hTdGFydFRhc2s6OlVOSU5JVElBTElaRUQ7Ci0KLSAgICBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4obmV3IFN5bmNoU3RhcnRUYXNrKG1vbml0b3IsIHN0YXRlKSk7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9ICBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRCkgewotCi0gICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORzsKLQotICAgICAgdGhyZWFkLT5zdGFydCgpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgewotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3NlcnQoc3RhdGUgIT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKTsKLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICB0cnkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgxMDApOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgfQotCi0gICAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQpIHsKLQotICAgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORzsKLQotICAgICAgICBtb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotCi0gICAgICB3aGlsZSAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7Ci0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRCk7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiogU2VlIGhvdyBhY2N1cmF0ZSBtb25pdG9yIHRpbWVvdXQgaXMuICovCi0KLSAgYm9vbCBtb25pdG9yVGltZW91dFRlc3Qoc2l6ZV90IGNvdW50PTEwMDAsIGludDY0X3QgdGltZW91dD0xMCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgaW50NjRfdCBzdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7Ci0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZG91YmxlIGVycm9yID0gKChlbmRUaW1lIC0gc3RhcnRUaW1lKSAtIChjb3VudCAqIHRpbWVvdXQpKSAvIChkb3VibGUpKGNvdW50ICogdGltZW91dCk7Ci0KLSAgICBpZiAoZXJyb3IgPCAwLjApICB7Ci0KLSAgICAgIGVycm9yICo9IDEuMDsKLSAgICB9Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBlcnJvciA8IFRocmVhZEZhY3RvcnlUZXN0czo6RVJST1I7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIGV4cGVjdGVkIHRpbWU6ICIgPDwgY291bnQgKiB0aW1lb3V0IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICI8PCBlbmRUaW1lIC0gc3RhcnRUaW1lIDw8ICJtcyBlcnJvciU6ICIgPDwgZXJyb3IgKiAxMDAuMCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotCi0KLSAgY2xhc3MgRmxvb2RUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLSAgcHVibGljOgotCi0gICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCkgOl9pZChpZCkge30KLSAgICB+Rmxvb2RUYXNrKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcnVuKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOwotICAgICAgfQotCi0gICAgICB1c2xlZXAoMSk7Ci0gICAgfQotICAgIGNvbnN0IHNpemVfdCBfaWQ7Ci0gIH07Ci0KLSAgdm9pZCBmb28oUG9zaXhUaHJlYWRGYWN0b3J5ICp0ZikgewotICAgICh2b2lkKSB0ZjsKLSAgfQotCi0gIGJvb2wgZmxvb2ROVGVzdChzaXplX3QgbG9vcD0xLCBzaXplX3QgY291bnQ9MTAwMDAwKSB7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgIGZvcihzaXplX3QgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKLQotICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLSAgICAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQodHJ1ZSk7Ci0KLSAgICAgICAgZm9yKHNpemVfdCB0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKLQotICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHNoYXJlZF9wdHI8Rmxvb2RUYXNrPiB0YXNrKG5ldyBGbG9vZFRhc2sobGl4ICogY291bnQgKyB0aXggKSk7Ci0KLSAgICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgICAgICAgICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgICAgICAgICB1c2xlZXAoMSk7Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7Ci0KLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotfTsKLQotY29uc3QgZG91YmxlIFRocmVhZEZhY3RvcnlUZXN0czo6RVJST1IgPSAuMjA7Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZE1hbmFnZXJUZXN0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmI1YzNlLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkTWFuYWdlclRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaHJlYWRNYW5hZ2VyVGVzdHMgewotCi1wdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9jb3VudChjb3VudCksCi0gICAgICBfdGltZW91dCh0aW1lb3V0KSwKLSAgICAgIF9kb25lKGZhbHNlKSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0KLSAgICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9zbGVlcCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBfc2xlZXAud2FpdChfdGltZW91dCk7Ci0gICAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICA7Ci0gICAgICAgIH1jYXRjaCguLi4pIHsKLSAgICAgICAgICBhc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICBfZG9uZSA9IHRydWU7Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiVGhyZWFkICIgPDwgX2NvdW50IDw8ICIgY29tcGxldGVkICIgPDwgc3RkOjplbmRsOwotCi0gICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCi0gICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICBzaXplX3QmIF9jb3VudDsKLSAgICBpbnQ2NF90IF90aW1lb3V0OwotICAgIGludDY0X3QgX3N0YXJ0VGltZTsKLSAgICBpbnQ2NF90IF9lbmRUaW1lOwotICAgIGJvb2wgX2RvbmU7Ci0gICAgTW9uaXRvciBfc2xlZXA7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIERpc3BhdGNoIGNvdW50IHRhc2tzLCBlYWNoIG9mIHdoaWNoIGJsb2NrcyBmb3IgdGltZW91dCBtaWxsaXNlY29uZHMgdGhlbgotICAgKiBjb21wbGV0ZXMuIFZlcmlmeSB0aGF0IGFsbCB0YXNrcyBjb21wbGV0ZWQgYW5kIHRoYXQgdGhyZWFkIG1hbmFnZXIgY2xlYW5zCi0gICAqIHVwIHByb3Blcmx5IG9uIGRlbGV0ZS4KLSAgICovCi0gIGJvb2wgbG9hZFRlc3Qoc2l6ZV90IGNvdW50PTEwMCwgaW50NjRfdCB0aW1lb3V0PTEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQ9NCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gY291bnQ7Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwotCi0gICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLQotICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0KLSAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPiB0YXNrczsKLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgewotCi0gICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2sobW9uaXRvciwgYWN0aXZlQ291bnQsIHRpbWVvdXQpKSk7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOyBpeCAhPSB0YXNrcy5lbmQoKTsgaXgrKykgewotCi0gICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICB3aGlsZShhY3RpdmVDb3VudCA+IDApIHsKLQotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBpbnQ2NF90IGxhc3RUaW1lID0gMDsKLQotICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7Ci0gICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotICAgIGludDY0X3QgbWF4VGltZSA9IDA7Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7IGl4ICE9IHRhc2tzLmVuZCgpOyBpeCsrKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrID0gKml4OwotCi0gICAgICBpbnQ2NF90IGRlbHRhID0gdGFzay0+X2VuZFRpbWUgLSB0YXNrLT5fc3RhcnRUaW1lOwotCi0gICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKLQotICAgICAgaWYgKHRhc2stPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKLSAgICAgICAgZmlyc3RUaW1lID0gdGFzay0+X3N0YXJ0VGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHRhc2stPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKLSAgICAgICAgbGFzdFRpbWUgPSB0YXNrLT5fZW5kVGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgewotICAgICAgICBtaW5UaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKLSAgICAgICAgbWF4VGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBhdmVyYWdlVGltZSs9IGRlbHRhOwotICAgIH0KLQotICAgIGF2ZXJhZ2VUaW1lIC89IGNvdW50OwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmaXJzdCBzdGFydDogIiA8PCBmaXJzdFRpbWUgPDwgIm1zIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lIDw8ICJtcyBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBkb3VibGUgZXhwZWN0ZWRUaW1lID0gKChjb3VudCArICh3b3JrZXJDb3VudCAtIDEpKSAvIHdvcmtlckNvdW50KSAqIHRpbWVvdXQ7Ci0KLSAgICBkb3VibGUgZXJyb3IgPSAoKHRpbWUwMSAtIHRpbWUwMCkgLSBleHBlY3RlZFRpbWUpIC8gZXhwZWN0ZWRUaW1lOwotCi0gICAgaWYgKGVycm9yIDwgMCkgewotICAgICAgZXJyb3IqPSAtMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgRVJST1I7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIGV4cGVjdGVkIHRpbWU6ICIgPDwgZXhwZWN0ZWRUaW1lIDw8ICJtcyBlbGFwc2VkIHRpbWU6ICI8PCB0aW1lMDEgLSB0aW1lMDAgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiBzdWNjZXNzOwotICB9Ci0KLSAgY2xhc3MgQmxvY2tUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIEJsb2NrVGFzayhNb25pdG9yJiBtb25pdG9yLCBNb25pdG9yJiBibW9uaXRvciwgc2l6ZV90JiBjb3VudCkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfYm1vbml0b3IoYm1vbml0b3IpLAotICAgICAgX2NvdW50KGNvdW50KSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9ibW9uaXRvcik7Ci0KLSAgICAgICAgX2Jtb25pdG9yLndhaXQoKTsKLQotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgICBfY291bnQtLTsKLQotICAgICAgICBpZiAoX2NvdW50ID09IDApIHsKLQotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgTW9uaXRvciYgX2Jtb25pdG9yOwotICAgIHNpemVfdCYgX2NvdW50OwotICB9OwotCi0gIC8qKgotICAgKiBCbG9jayB0ZXN0LiAgQ3JlYXRlIHBlbmRpbmdUYXNrQ291bnRNYXggdGFza3MuICBWZXJpZnkgdGhhdCB3ZSBibG9jayBhZGRpbmcgdGhlCi0gICAqIHBlbmRpbmdUYXNrQ291bnRNYXggKyAxdGggdGFzay4gIFZlcmlmeSB0aGF0IHdlIHVuYmxvY2sgd2hlbiBhIHRhc2sgY29tcGxldGVzICovCi0KLSAgYm9vbCBibG9ja1Rlc3QoaW50NjRfdCB0aW1lb3V0PTEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQ9MikgewotICAgICh2b2lkKSB0aW1lb3V0OwotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgdHJ5IHsKLQotICAgICAgTW9uaXRvciBibW9uaXRvcjsKLSAgICAgIE1vbml0b3IgbW9uaXRvcjsKLQotICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrTWF4Q291bnQgPSB3b3JrZXJDb3VudDsKLQotICAgICAgc2l6ZV90IGFjdGl2ZUNvdW50c1tdID0ge3dvcmtlckNvdW50LCBwZW5kaW5nVGFza01heENvdW50LCAxfTsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7Ci0KLSAgICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0KLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7Ci0KLSAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgewotCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzBdKSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgewotCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzFdKSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+IGV4dHJhVGFzayhuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOwotCi0gICAgICB0cnkgewotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJTaG91bGQgaGF2ZSB0aW1lZCBvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICAvLyBFeHBlY3RlZCByZXN1bHQKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgLTEpOwotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1Y2Nlc3MgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzBdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICB0cnkgewotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJhZGQgdGltZWQgb3V0IHVuZXhwZWN0ZWRseSIgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7Ci0KLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgImFkZCBlbmNvdW50ZXJlZCB0b28gbWFueSBwZW5kaW5nIGV4ZXBjdGlvbnMiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdha2UgdXAgdGFza3MgdGhhdCB3ZXJlIHBlbmRpbmcgYmVmb3JlIGFuZCB3YWl0IGZvciB0aGVtIHRvIGNvbXBsZXRlCi0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gV2FrZSB1cCB0aGUgZXh0cmEgdGFzayBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZighKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSAwKSkpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0KLQotICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiYgZSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gfQotfTsKLQotY29uc3QgZG91YmxlIFRocmVhZE1hbmFnZXJUZXN0czo6RVJST1IgPSAuMjA7Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3Q7Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGltZXJNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGltZXJNYW5hZ2VyVGVzdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MDc0Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7Ci0KLSBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotICAgcHVibGljOgotCi0gICAgVGFzayhNb25pdG9yJiBtb25pdG9yLCBpbnQ2NF90IHRpbWVvdXQpIDoKLSAgICAgIF90aW1lb3V0KHRpbWVvdXQpLAotICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX3N1Y2Nlc3MoZmFsc2UpLAotICAgICAgX2RvbmUoZmFsc2UpIHt9Ci0KLSAgICB+VGFzaygpIHsgc3RkOjpjZXJyIDw8IHRoaXMgPDwgc3RkOjplbmRsOyB9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLQotICAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICAvLyBGaWd1cmUgb3V0IGVycm9yIHBlcmNlbnRhZ2UKLQotICAgICAgaW50NjRfdCBkZWx0YSA9IF9lbmRUaW1lIC0gX3N0YXJ0VGltZTsKLQotCi0gICAgICBkZWx0YSA9IGRlbHRhID4gX3RpbWVvdXQgPyAgZGVsdGEgLSBfdGltZW91dCA6IF90aW1lb3V0IC0gZGVsdGE7Ci0KLSAgICAgIGZsb2F0IGVycm9yID0gZGVsdGEgLyBfdGltZW91dDsKLQotICAgICAgaWYoZXJyb3IgPCBFUlJPUikgewotICAgICAgICBfc3VjY2VzcyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIF9kb25lID0gdHJ1ZTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRUaW1lck1hbmFnZXJUZXN0czo6VGFza1siIDw8IHRoaXMgPDwgIl0gZG9uZSIgPDwgc3RkOjplbmRsOyAvL2RlYnVnCi0KLSAgICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3QgX3RpbWVvdXQ7Ci0gICAgaW50NjRfdCBfc3RhcnRUaW1lOwotICAgIGludDY0X3QgX2VuZFRpbWU7Ci0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgYm9vbCBfc3VjY2VzczsKLSAgICBib29sIF9kb25lOwotICB9OwotCi0gIC8qKgotICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MgYW5kIHdhaXRzIGZvciB0aGUgZmlyc3QgdG8gZXhwaXJlIHdpdGhpbiAxMCUKLSAgICogb2YgdGhlIGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyCi0gICAqIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUKLSAgICogbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgotICAgKi8KLSAgYm9vbCB0ZXN0MDAoaW50NjRfdCB0aW1lb3V0PTEwMDBMTCkgewotCi0gICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzayA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7Ci0KLSAgICB7Ci0KLSAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7Ci0KLSAgICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpKTsKLQotICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7Ci0KLSAgICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOwotCi0gICAgICAvLyBEb24ndCBjcmVhdGUgdGFzayB5ZXQsIGJlY2F1c2UgaXRzIGNvbnN0cnVjdG9yIHNldHMgdGhlIGV4cGVjdGVkIGNvbXBsZXRpb24gdGltZSwgYW5kIHdlCi0gICAgICAvLyBuZWVkIHRvIGRlbGF5IGJldHdlZW4gaW5zZXJ0aW5nIHRoZSB0d28gdGFza3MgaW50byB0aGUgcnVuIHF1ZXVlLgotICAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzazsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgICAgdGltZXJNYW5hZ2VyLmFkZChvcnBoYW5UYXNrLCAxMCAqIHRpbWVvdXQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgLy8gV2FpdCBmb3IgMSBzZWNvbmQgaW4gb3JkZXIgdG8gZ2l2ZSB0aW1lck1hbmFnZXIgYSBjaGFuY2UgdG8gc3RhcnQgc2xlZXBpbmcgaW4gcmVzcG9uc2UKLSAgICAgICAgICAvLyB0byBhZGRpbmcgb3JwaGFuVGFzay4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBhZGRpbmcgdGhlIHNlY29uZCB0YXNrCi0gICAgICAgICAgLy8ga2lja3MgdGhlIGRpc3BhdGNoZXIgb3V0IG9mIHRoZSBjdXJyZW50IHdhaXQgYW5kIHN0YXJ0cyB0aGUgbmV3IDEgc2Vjb25kIHdhaXQuCi0gICAgICAgICAgX21vbml0b3Iud2FpdCAoMTAwMCk7Ci0gICAgICAgICAgYXNzZXJ0ICgwID09ICJFUlJPUjogVGhpcyB3YWl0IHNob3VsZCB0aW1lIG91dC4gVGltZXJNYW5hZ2VyIGRpc3BhdGNoZXIgbWF5IGhhdmUgYSBwcm9ibGVtLiIpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiAmZXgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2sucmVzZXQgKG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOwotCi0gICAgICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGltZW91dCk7Ci0KLSAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgfQotCi0gICAgICBhc3NlcnQodGFzay0+X2RvbmUpOwotCi0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAodGFzay0+X3N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgLy8gdGltZXJNYW5hZ2VyLnN0b3AoKTsgVGhpcyBpcyB3aGVyZSBpdCBoYXBwZW5zIHZpYSBkZXN0cnVjdG9yCi0KLSAgICBhc3NlcnQoIW9ycGhhblRhc2stPl9kb25lKTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgZnJpZW5kIGNsYXNzIFRlc3RUYXNrOwotCi0gIE1vbml0b3IgX21vbml0b3I7Ci19OwotCi1jb25zdCBkb3VibGUgVGltZXJNYW5hZ2VyVGVzdHM6OkVSUk9SID0gLjIwOwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWI2NzIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBlZWtQcm9jZXNzb3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgewotCi1QZWVrUHJvY2Vzc29yOjpQZWVrUHJvY2Vzc29yKCkgewotICBtZW1vcnlCdWZmZXJfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICB0YXJnZXRUcmFuc3BvcnRfID0gbWVtb3J5QnVmZmVyXzsKLX0KLVBlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkge30KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewotICBhY3R1YWxQcm9jZXNzb3JfID0gYWN0dWFsUHJvY2Vzc29yOwotICBwaXBlZFByb3RvY29sXyA9IHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wodGFyZ2V0VHJhbnNwb3J0Xyk7Ci0gIHRyYW5zcG9ydEZhY3RvcnlfID0gdHJhbnNwb3J0RmFjdG9yeTsKLSAgdHJhbnNwb3J0RmFjdG9yeV8tPmluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQodGFyZ2V0VHJhbnNwb3J0Xyk7Ci19Ci0KLWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7Ci0gIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7Ci0gIHRhcmdldFRyYW5zcG9ydF8gPSB0YXJnZXRUcmFuc3BvcnQ7Ci0gIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7Ci0gIH0gZWxzZSBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pLT5nZXRUYXJnZXRUcmFuc3BvcnQoKSk7Ci0gIH0KLQotICBpZiAoIW1lbW9yeUJ1ZmZlcl8pIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IG11c3QgYmUgYSBUTWVtb3J5QnVmZmVyIG9yIGEgVFBpcGVkVHJhbnNwb3J0IHdpdGggVE1lbW9yeUJ1ZmZlciIpOwotICB9Ci19Ci0KLWJvb2wgUGVla1Byb2Nlc3Nvcjo6cHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7Ci0KLSAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gIFRNZXNzYWdlVHlwZSBtdHlwZTsKLSAgaW50MzJfdCBzZXFpZDsKLSAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7Ci0KLSAgaWYgKG10eXBlICE9IFRfQ0FMTCkgewotICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7Ci0gIH0KLQotICAvLyBQZWVrIGF0IHRoZSBuYW1lCi0gIHBlZWtOYW1lKGZuYW1lKTsKLQotICBUVHlwZSBmdHlwZTsKLSAgaW50MTZfdCBmaWQ7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaW4tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBQZWVrIGF0IHRoZSB2YXJpYWJsZQotICAgIHBlZWsoaW4sIGZ0eXBlLCBmaWQpOwotICAgIGluLT5yZWFkRmllbGRFbmQoKTsKLSAgfQotICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7Ci0KLSAgLy8KLSAgLy8gQWxsIHRoZSBkYXRhIGlzIG5vdyBpbiBtZW1vcnlCdWZmZXJfIGFuZCByZWFkeSB0byBiZSBwcm9jZXNzZWQKLSAgLy8KLQotICAvLyBMZXQncyBmaXJzdCB0YWtlIGEgcGVlayBhdCB0aGUgZnVsbCBkYXRhIGluIG1lbW9yeQotICB1aW50OF90KiBidWZmZXI7Ci0gIHVpbnQzMl90IHNpemU7Ci0gIG1lbW9yeUJ1ZmZlcl8tPmdldEJ1ZmZlcigmYnVmZmVyLCAmc2l6ZSk7Ci0gIHBlZWtCdWZmZXIoYnVmZmVyLCBzaXplKTsKLQotICAvLyBEb25lIHBlZWtpbmcgYXQgdmFyaWFibGVzCi0gIHBlZWtFbmQoKTsKLQotICBib29sIHJldCA9IGFjdHVhbFByb2Nlc3Nvcl8tPnByb2Nlc3MocGlwZWRQcm90b2NvbF8sIG91dCwgY29ubmVjdGlvbkNvbnRleHQpOwotICBtZW1vcnlCdWZmZXJfLT5yZXNldEJ1ZmZlcigpOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSkgewotICAodm9pZCkgZm5hbWU7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpIHsKLSAgKHZvaWQpIGJ1ZmZlcjsKLSAgKHZvaWQpIHNpemU7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVlayhib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlIGZ0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZmlkKSB7Ci0gICh2b2lkKSBmaWQ7Ci0gIGluLT5za2lwKGZ0eXBlKTsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrRW5kKCkge30KLQotfX19CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MDNmNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBFRUtQUk9DRVNTT1JfSAotI2RlZmluZSBQRUVLUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7Ci0KLS8qCi0gKiBDbGFzcyBmb3IgcGVla2luZyBhdCB0aGUgcmF3IGRhdGEgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzb3IKLSAqIGFuZCBnaXZlcyB0aGUgZGVyaXZlZCBjbGFzcyBhIGNoYW5jZSB0byBjaGFuZ2UgYmVoYXZpb3IgYWNjb3JkaW5nbHkKLSAqCi0gKi8KLWNsYXNzIFBlZWtQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewotCi0gcHVibGljOgotICBQZWVrUHJvY2Vzc29yKCk7Ci0gIHZpcnR1YWwgflBlZWtQcm9jZXNzb3IoKTsKLQotICAvLyBJbnB1dCBoZXJlOiBhY3R1YWxQcm9jZXNzb3IgIC0gdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yCi0gIC8vICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSAgLSB0aGUgcHJvdG9jb2wgZmFjdG9yeSB1c2VkIHRvIHdyYXAgdGhlIG1lbW9yeSBidWZmZXIKLSAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKLSAgdm9pZCBpbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKLQotICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpOwotCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpOwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KLSAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKLSAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpOwotICB2aXJ0dWFsIHZvaWQgcGVla0VuZCgpOwotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXBlZFByb3RvY29sXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG1lbW9yeUJ1ZmZlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydF87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDBjNmIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNUQVRTUFJPQ0VTU09SX0gKLSNkZWZpbmUgU1RBVFNQUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7Ci0KLS8qCi0gKiBDbGFzcyBmb3Iga2VlcGluZyB0cmFjayBvZiBmdW5jdGlvbiBjYWxsIHN0YXRpc3RpY3MgYW5kIHByaW50aW5nIHRoZW0gaWYgZGVzaXJlZAotICoKLSAqLwotY2xhc3MgU3RhdHNQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewotcHVibGljOgotICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkKLSAgICA6IHByaW50XyhwcmludCksCi0gICAgICBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkKLSAge30KLSAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKSB7fTsKLQotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7Ci0KLSAgICBwaXByb3RfID0gcGlwcm90OwotCi0gICAgc3RkOjpzdHJpbmcgZm5hbWU7Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7Ci0gICAgaW50MzJfdCBzZXFpZDsKLQotICAgIHBpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7Ci0gICAgaWYgKG10eXBlICE9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMKSB7Ci0gICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgIHByaW50ZigiVW5rbm93biBtZXNzYWdlIHR5cGVcbiIpOwotICAgICAgfQotICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7Ci0gICAgfQotICAgIGlmIChwcmludF8pIHsKLSAgICAgIHByaW50ZigiJXMgKCIsIGZuYW1lLmNfc3RyKCkpOwotICAgIH0KLSAgICBpZiAoZnJlcXVlbmN5XykgewotICAgICAgaWYgKGZyZXF1ZW5jeV9tYXBfLmZpbmQoZm5hbWUpICE9IGZyZXF1ZW5jeV9tYXBfLmVuZCgpKSB7Ci0gICAgICAgIGZyZXF1ZW5jeV9tYXBfW2ZuYW1lXSsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJlcXVlbmN5X21hcF9bZm5hbWVdID0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOwotICAgIGludDE2X3QgZmlkOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOwotICAgICAgaWYgKHByaW50XykgewotICAgICAgICBwcmludGYoIiwgIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByaW50XykgewotICAgICAgcHJpbnRmKCJcYlxiKVxuIik7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+JiBnZXRfZnJlcXVlbmN5X21hcCgpIHsKLSAgICByZXR1cm4gZnJlcXVlbmN5X21hcF87Ci0gIH0KLQotcHJvdGVjdGVkOgotICB2b2lkIHByaW50QW5kUGFzc1RvQnVmZmVyKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUpIHsKLSAgICBzd2l0Y2ggKGZ0eXBlKSB7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MOgotICAgICAgICB7Ci0gICAgICAgICAgYm9vbCBib29sdjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkQm9vbChib29sdik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGJvb2x2KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFOgotICAgICAgICB7Ci0gICAgICAgICAgaW50OF90IGJ5dGV2OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRCeXRlKGJ5dGV2KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgYnl0ZXYpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNjoKLSAgICAgICAgewotICAgICAgICAgIGludDE2X3QgaTE2OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRJMTYoaTE2KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgaTE2KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzI6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQzMl90IGkzMjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkSTMyKGkzMik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGkzMik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0OgotICAgICAgICB7Ci0gICAgICAgICAgaW50NjRfdCBpNjQ7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEk2NChpNjQpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWxkIiwgaTY0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEU6Ci0gICAgICAgIHsKLSAgICAgICAgICBkb3VibGUgZHViOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWREb3VibGUoZHViKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVmIiwgZHViKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkc6Ci0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBzdHI7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFN0cmluZyhzdHIpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJXMiLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUOgotICAgICAgICB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgICBpbnQxNl90IGZpZDsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIjwiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOwotICAgICAgICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEVuZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYj4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVA6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGtleVR5cGU7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSB2YWxUeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigieyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihrZXlUeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCI9PiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIodmFsVHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkTWFwRW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYn0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFNldEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGJ9Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVDoKLSAgICAgICAgewotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7Ci0gICAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZExpc3RFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxiXSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4gZnJlcXVlbmN5X21hcF87Ci0KLSAgYm9vbCBwcmludF87Ci0gIGJvb2wgZnJlcXVlbmN5XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDgxYzQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRCYXNlNjRVdGlscy5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmtCYXNlNjRFbmNvZGVUYWJsZSA9IChjb25zdCB1aW50OF90ICopCi0gICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKLQotdm9pZCAgYmFzZTY0X2VuY29kZShjb25zdCB1aW50OF90ICppbiwgdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYpIHsKLSAgYnVmWzBdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA+PiAyKSAmIDB4M0ZdOwotICBpZiAobGVuID09IDMpIHsKLSAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSArIChpblsxXSA+PiA0KSkgJiAweDNmXTsKLSAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblsxXSA8PCAyKSArIChpblsyXSA+PiA2KSkgJiAweDNmXTsKLSAgICBidWZbM10gPSBrQmFzZTY0RW5jb2RlVGFibGVbaW5bMl0gJiAweDNmXTsKLSAgfSBlbHNlIGlmIChsZW4gPT0gMikgewotICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzBdIDw8IDQpICsgKGluWzFdID4+IDQpKSAmIDB4M2ZdOwotICAgIGJ1ZlsyXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMV0gPDwgMikgJiAweDNmXTsKLSAgfSBlbHNlICB7IC8vIGxlbiA9PSAxCi0gICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA8PCA0KSAmIDB4M2ZdOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtCYXNlNjREZWNvZGVUYWJsZVsyNTZdID17Ci0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCi0gIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKLSAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAotICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotfTsKLQotdm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGJ1ZlswXSA9IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzBdXSA8PCAyKSB8Ci0gICAgICAgICAgIChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA+PiA0KTsKLSAgaWYgKGxlbiA+IDIpIHsKLSAgICBidWZbMV0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dIDw8IDQpICYgMHhmMCkgfAotICAgICAgICAgICAgICAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPj4gMik7Ci0gICAgaWYgKGxlbiA+IDMpIHsKLSAgICAgIGJ1ZlsyXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPDwgNikgJiAweGMwKSB8Ci0gICAgICAgICAgICAgICAgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbM11dKTsKLSAgICB9Ci0gIH0KLX0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVmNzMzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLy8gaW4gbXVzdCBiZSBhdCBsZWFzdCBsZW4gYnl0ZXMKLS8vIGxlbiBtdXN0IGJlIDEsIDIsIG9yIDMKLS8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIG1heSBub3Qgb3ZlcmxhcCBpbgotLy8gdGhlIGRhdGEgaXMgbm90IHBhZGRlZCB3aXRoICc9JzsgdGhlIGNhbGxlciBjYW4gZG8gdGhpcyBpZiBkZXNpcmVkCi12b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCAqaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmKTsKLQotLy8gYnVmIG11c3QgYmUgYSBidWZmZXIgb2YgYXQgbGVhc3QgNCBieXRlcyBhbmQgY29udGFpbiBiYXNlNjQgZW5jb2RlZCB2YWx1ZXMKLS8vIGJ1ZiB3aWxsIGJlIGNoYW5nZWQgdG8gY29udGFpbiBvdXRwdXQgYnl0ZXMKLS8vIGxlbiBpcyBudW1iZXIgb2YgYnl0ZXMgdG8gY29uc3VtZSBmcm9tIGlucHV0IChtdXN0IGJlIDIsIDMsIG9yIDQpCi0vLyBubyAnPScgcGFkZGluZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGlucHV0Ci12b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pOwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI4ODM0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUUHJvdG9jb2wuaCIKLSNpbmNsdWRlICJUVmlydHVhbFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbCBmb3IgdGhyaWZ0LiBXcml0ZXMgYWxsIGRhdGEgaW4gYSB2ZXJ5IGJhc2ljCi0gKiBiaW5hcnkgZm9ybWF0LCBlc3NlbnRpYWxseSBqdXN0IHNwaXR0aW5nIG91dCB0aGUgcmF3IGJ5dGVzLgotICoKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1jbGFzcyBUQmluYXJ5UHJvdG9jb2xUCi0gIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPiB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApICBpcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbC4KLQotIHB1YmxpYzoKLSAgVEJpbmFyeVByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykgOgotICAgIFRWaXJ0dWFsUHJvdG9jb2w8IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCkge30KLQotICBUQmluYXJ5UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAotICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAotICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCi0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKLSAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAotICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApIHt9Ci0KLSAgflRCaW5hcnlQcm90b2NvbFQoKSB7Ci0gICAgaWYgKHN0cmluZ19idWZfICE9IE5VTEwpIHsKLSAgICAgIHN0ZDo6ZnJlZShzdHJpbmdfYnVmXyk7Ci0gICAgICBzdHJpbmdfYnVmX3NpemVfID0gMDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgewotICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOwotICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIGlubGluZSB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKLQotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotCi0gIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkTWFwRW5kKCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0gIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDwgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPiA+OjpyZWFkQm9vbDsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOwotCi0gIGlubGluZSB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKLQotICBpbmxpbmUgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IHJlYWRTdHJpbmdCb2R5KHN0ZDo6c3RyaW5nJiBzdHIsIGludDMyX3Qgc3opOwotCi0gIFRyYW5zcG9ydF8qIHRyYW5zXzsKLQotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLQotICAvLyBFbmZvcmNlIHByZXNlbmNlIG9mIHZlcnNpb24gaWRlbnRpZmllcgotICBib29sIHN0cmljdF9yZWFkXzsKLSAgYm9vbCBzdHJpY3Rfd3JpdGVfOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICB1aW50OF90KiBzdHJpbmdfYnVmXzsKLSAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOwotCi19OwotCi10eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sOwotCi0vKioKLSAqIENvbnN0cnVjdHMgYmluYXJ5IHByb3RvY29sIGhhbmRsZXJzCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCgpIDoKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpIHt9Ci0KLSAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCi0gICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSkge30KLQotICB2aXJ0dWFsIH5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCgpIHt9Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKLSAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKLSAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0KLSAgICAgIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7Ci0gICAgVFByb3RvY29sKiBwcm90OwotICAgIGlmIChzcGVjaWZpY190cmFucykgewotICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+KHNwZWNpZmljX3RyYW5zLCBzdHJpbmdfbGltaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sIHN0cmljdF9yZWFkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sIHN0cmljdF93cml0ZV8pOwotICAgIH0KLQotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLSAgYm9vbCBzdHJpY3RfcmVhZF87Ci0gIGJvb2wgc3RyaWN0X3dyaXRlXzsKLQotfTsKLQotdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNpbmNsdWRlICJUQmluYXJ5UHJvdG9jb2wudGNjIgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYyBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOTMzNDguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfIDEKLQotI2luY2x1ZGUgIlRCaW5hcnlQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKLSAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7Ci0gICAgdWludDMyX3Qgd3NpemUgPSAwOwotICAgIHdzaXplICs9IHdyaXRlSTMyKHZlcnNpb24pOwotICAgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOwotICAgIHdzaXplICs9IHdyaXRlSTMyKHNlcWlkKTsKLSAgICByZXR1cm4gd3NpemU7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDMyX3Qgd3NpemUgPSAwOwotICAgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOwotICAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KW1lc3NhZ2VUeXBlKTsKLSAgICB3c2l6ZSArPSB3cml0ZUkzMihzZXFpZCk7Ci0gICAgcmV0dXJuIHdzaXplOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0RW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWZpZWxkVHlwZSk7Ci0gIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybgotICAgIHdyaXRlQnl0ZSgoaW50OF90KVRfU1RPUCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3Qpa2V5VHlwZSk7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KXZhbFR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCkgZWxlbVR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTGlzdEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVNldEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgdWludDhfdCB0bXAgPSAgdmFsdWUgPyAxIDogMDsKLSAgdGhpcy0+dHJhbnNfLT53cml0ZSgmdG1wLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZieXRlLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClodG9ucyhpMTYpOwotICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubChpMzIpOwotICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCA0KTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwoaTY0KTsKLSAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgOCk7Ci0gIHJldHVybiA4OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7Ci0KLSAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKLSAgYml0cyA9IGh0b25sbChiaXRzKTsKLSAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOwotICByZXR1cm4gODsKLX0KLQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc2l6ZSA9IHN0ci5zaXplKCk7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOwotICBpZiAoc2l6ZSA+IDApIHsKLSAgICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzaXplKTsKLSAgfQotICByZXR1cm4gcmVzdWx0ICsgc2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyhzdHIpOwotfQotCi0vKioKLSAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gKi8KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICBpbnQzMl90IHN6OwotICByZXN1bHQgKz0gcmVhZEkzMihzeik7Ci0KLSAgaWYgKHN6IDwgMCkgewotICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gbnVtYmVyCi0gICAgaW50MzJfdCB2ZXJzaW9uID0gc3ogJiBWRVJTSU9OX01BU0s7Ci0gICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGlkZW50aWZpZXIiKTsKLSAgICB9Ci0gICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzeiAmIDB4MDAwMDAwZmYpOwotICAgIHJlc3VsdCArPSByZWFkU3RyaW5nKG5hbWUpOwotICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAodGhpcy0+c3RyaWN0X3JlYWRfKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAotICAgICAgaW50OF90IHR5cGU7Ci0gICAgICByZXN1bHQgKz0gcmVhZFN0cmluZ0JvZHkobmFtZSwgc3opOwotICAgICAgcmVzdWx0ICs9IHJlYWRCeXRlKHR5cGUpOwotICAgICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXR5cGU7Ci0gICAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICBuYW1lID0gIiI7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDhfdCB0eXBlOwotICByZXN1bHQgKz0gcmVhZEJ5dGUodHlwZSk7Ci0gIGZpZWxkVHlwZSA9IChUVHlwZSl0eXBlOwotICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgewotICAgIGZpZWxkSWQgPSAwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcmVzdWx0ICs9IHJlYWRJMTYoZmllbGRJZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEZpZWxkRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IGssIHY7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZShrKTsKLSAga2V5VHlwZSA9IChUVHlwZSlrOwotICByZXN1bHQgKz0gcmVhZEJ5dGUodik7Ci0gIHZhbFR5cGUgPSAoVFR5cGUpdjsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBpbnQ4X3QgZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKGUpOwotICBlbGVtVHlwZSA9IChUVHlwZSllOwotICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmICh0aGlzLT5jb250YWluZXJfbGltaXRfICYmIHNpemVpID4gdGhpcy0+Y29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZExpc3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IGU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKLSAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTZXRFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gIHVpbnQ4X3QgYlsxXTsKLSAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKGIsIDEpOwotICB2YWx1ZSA9ICooaW50OF90KiliICE9IDA7Ci0gIHJldHVybiAxOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICB1aW50OF90IGJbMV07Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKLSAgYnl0ZSA9ICooaW50OF90KiliOwotICByZXR1cm4gMTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICB1aW50OF90IGJbMl07Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAyKTsKLSAgaTE2ID0gKihpbnQxNl90KiliOwotICBpMTYgPSAoaW50MTZfdCludG9ocyhpMTYpOwotICByZXR1cm4gMjsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICB1aW50OF90IGJbNF07Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCA0KTsKLSAgaTMyID0gKihpbnQzMl90KiliOwotICBpMzIgPSAoaW50MzJfdCludG9obChpMzIpOwotICByZXR1cm4gNDsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTY0KGludDY0X3QmIGk2NCkgewotICB1aW50OF90IGJbOF07Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCA4KTsKLSAgaTY0ID0gKihpbnQ2NF90KiliOwotICBpNjQgPSAoaW50NjRfdCludG9obGwoaTY0KTsKLSAgcmV0dXJuIDg7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKLQotICB1aW50NjRfdCBiaXRzOwotICB1aW50OF90IGJbOF07Ci0gIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCA4KTsKLSAgYml0cyA9ICoodWludDY0X3QqKWI7Ci0gIGJpdHMgPSBudG9obGwoYml0cyk7Ci0gIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KGJpdHMpOwotICByZXR1cm4gODsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0OwotICBpbnQzMl90IHNpemU7Ci0gIHJlc3VsdCA9IHJlYWRJMzIoc2l6ZSk7Ci0gIHJldHVybiByZXN1bHQgKyByZWFkU3RyaW5nQm9keShzdHIsIHNpemUpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cmluZyhzdHIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmdCb2R5KHN0ZDo6c3RyaW5nJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLQotICAvLyBDYXRjaCBlcnJvciBjYXNlcwotICBpZiAoc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfQotICBpZiAodGhpcy0+c3RyaW5nX2xpbWl0XyA+IDAgJiYgc2l6ZSA+IHRoaXMtPnN0cmluZ19saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotCi0gIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCi0gIGlmIChzaXplID09IDApIHsKLSAgICBzdHIgPSAiIjsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gVHJ5IHRvIGJvcnJvdyBmaXJzdAotICBjb25zdCB1aW50OF90KiBib3Jyb3dfYnVmOwotICB1aW50MzJfdCBnb3QgPSBzaXplOwotICBpZiAoKGJvcnJvd19idWYgPSB0aGlzLT50cmFuc18tPmJvcnJvdyhOVUxMLCAmZ290KSkpIHsKLSAgICBzdHIuYXNzaWduKChjb25zdCBjaGFyKilib3Jyb3dfYnVmLCBzaXplKTsKLSAgICB0aGlzLT50cmFuc18tPmNvbnN1bWUoc2l6ZSk7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICAvLyBVc2UgdGhlIGhlYXAgaGVyZSB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IGZvciB2LiBsYXJnZSBzdHJpbmdzCi0gIGlmIChzaXplID4gdGhpcy0+c3RyaW5nX2J1Zl9zaXplXyB8fCB0aGlzLT5zdHJpbmdfYnVmXyA9PSBOVUxMKSB7Ci0gICAgdm9pZCogbmV3X3N0cmluZ19idWYgPSBzdGQ6OnJlYWxsb2ModGhpcy0+c3RyaW5nX2J1Zl8sICh1aW50MzJfdClzaXplKTsKLSAgICBpZiAobmV3X3N0cmluZ19idWYgPT0gTlVMTCkgewotICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICB9Ci0gICAgdGhpcy0+c3RyaW5nX2J1Zl8gPSAodWludDhfdCopbmV3X3N0cmluZ19idWY7Ci0gICAgdGhpcy0+c3RyaW5nX2J1Zl9zaXplXyA9IHNpemU7Ci0gIH0KLSAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoaXMtPnN0cmluZ19idWZfLCBzaXplKTsKLSAgc3RyID0gc3RkOjpzdHJpbmcoKGNoYXIqKXRoaXMtPnN0cmluZ19idWZfLCBzaXplKTsKLSAgcmV0dXJuICh1aW50MzJfdClzaXplOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX1RDQ18KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkMWYwOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFZpcnR1YWxQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiBDKysgSW1wbGVtZW50YXRpb24gb2YgdGhlIENvbXBhY3QgUHJvdG9jb2wgYXMgZGVzY3JpYmVkIGluIFRIUklGVC0xMTAKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1jbGFzcyBUQ29tcGFjdFByb3RvY29sVAotICA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+IHsKLQotIHByb3RlY3RlZDoKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgUFJPVE9DT0xfSUQgPSAoaW50OF90KTB4ODI7Ci0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFZFUlNJT05fTiA9IDE7Ci0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFZFUlNJT05fTUFTSyA9IDB4MWY7IC8vIDAwMDEgMTExMQotICBzdGF0aWMgY29uc3QgaW50OF90ICBUWVBFX01BU0sgPSAoaW50OF90KTB4RTA7IC8vIDExMTAgMDAwMAotICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7Ci0KLSAgVHJhbnNwb3J0XyogdHJhbnNfOwotCi0gIC8qKgotICAgKiAoV3JpdGluZykgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUKLSAgICogc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KLSAgICovCi0gIHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciogbmFtZTsKLSAgICBUVHlwZSBmaWVsZFR5cGU7Ci0gICAgaW50MTZfdCBmaWVsZElkOwotICB9IGJvb2xlYW5GaWVsZF87Ci0KLSAgLyoqCi0gICAqIChSZWFkaW5nKSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUKLSAgICogdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCi0gICAqLwotICBzdHJ1Y3QgewotICAgIGJvb2wgaGFzQm9vbFZhbHVlOwotICAgIGJvb2wgYm9vbFZhbHVlOwotICB9IGJvb2xWYWx1ZV87Ci0KLSAgLyoqCi0gICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCi0gICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCi0gICAqLwotCi0gIHN0ZDo6c3RhY2s8aW50MTZfdD4gbGFzdEZpZWxkXzsKLSAgaW50MTZfdCBsYXN0RmllbGRJZF87Ci0KLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKSA6Ci0gICAgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBsYXN0RmllbGRJZF8oMCksCi0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkgewotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7Ci0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKLSAgfQotCi0gIFRDb21wYWN0UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKLSAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAotICAgIGxhc3RGaWVsZElkXygwKSwKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgewotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7Ci0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKLSAgfQotCi0gIH5UQ29tcGFjdFByb3RvY29sVCgpIHsKLSAgICBmcmVlKHN0cmluZ19idWZfKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFdyaXRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKLQotICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKLQotICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKioKLSAgKiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmVkCi0gICogb3V0cHV0IG9yIHB1cnBvc2UKLSAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHdyaXRlTWFwRW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgeyByZXR1cm4gMDsgfQotCi0gcHJvdGVjdGVkOgotICBpbnQzMl90IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgdHlwZU92ZXJyaWRlKTsKLSAgdWludDMyX3Qgd3JpdGVDb2xsZWN0aW9uQmVnaW4oaW50OF90IGVsZW1UeXBlLCBpbnQzMl90IHNpemUpOwotICB1aW50MzJfdCB3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pOwotICB1aW50MzJfdCB3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pOwotICB1aW50NjRfdCBpNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpOwotICB1aW50MzJfdCBpMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pOwotICBpbmxpbmUgaW50OF90IGdldENvbXBhY3RUeXBlKGludDhfdCB0dHlwZSk7Ci0KLSBwdWJsaWM6Ci0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+OjpyZWFkQm9vbDsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKgotICAgKlRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUKLSAgICogZW5jb2RpbmcuCi0gICAqLwotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsgcmV0dXJuIDA7IH0KLQotIHByb3RlY3RlZDoKLSAgdWludDMyX3QgcmVhZFZhcmludDMyKGludDMyX3QmIGkzMik7Ci0gIHVpbnQzMl90IHJlYWRWYXJpbnQ2NChpbnQ2NF90JiBpNjQpOwotICBpbnQzMl90IHppZ3phZ1RvSTMyKHVpbnQzMl90IG4pOwotICBpbnQ2NF90IHppZ3phZ1RvSTY0KHVpbnQ2NF90IG4pOwotICBUVHlwZSBnZXRUVHlwZShpbnQ4X3QgdHlwZSk7Ci0KLSAgLy8gQnVmZmVyIGZvciByZWFkaW5nIHN0cmluZ3MsIHNhdmUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvdG9jb2wgdG8KLSAgLy8gYXZvaWQgbWVtb3J5IGNodXJuIGFsbG9jYXRpbmcgbWVtb3J5IG9uIGV2ZXJ5IHN0cmluZyByZWFkCi0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgdWludDhfdCogc3RyaW5nX2J1Zl87Ci0gIGludDMyX3Qgc3RyaW5nX2J1Zl9zaXplXzsKLSAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOwotfTsKLQotdHlwZWRlZiBUQ29tcGFjdFByb3RvY29sVDxUVHJhbnNwb3J0PiBUQ29tcGFjdFByb3RvY29sOwotCi0vKioKLSAqIENvbnN0cnVjdHMgY29tcGFjdCBwcm90b2NvbCBoYW5kbGVycwotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCgpIDoKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkge30KLQotICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0KSA6Ci0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSB7fQotCi0gIHZpcnR1YWwgflRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCgpIHt9Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0KLSAgICAgIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7Ci0gICAgVFByb3RvY29sKiBwcm90OwotICAgIGlmIChzcGVjaWZpY190cmFucykgewotICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0Xyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOwotCi19OwotCi10eXBlZGVmIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jaW5jbHVkZSAiVENvbXBhY3RQcm90b2NvbC50Y2MiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViNzg0Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYworKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfIDEKLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotLyoKLSAqIFRDb21wYWN0UHJvdG9jb2w6OmkqVG9aaWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0Ci0gKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KLSAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgotICogSWYgYW55b25lIGVuY291bnRlcnMgdGhpcyBlcnJvciwgd2UgY2FuIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBiZXN0Ci0gKiB3YXkgdG8gaW1wbGVtZW50IGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb24gdGhlaXIgcGxhdGZvcm0uCi0gKi8KLSNpZiAhZGVmaW5lZChTSUdORURfUklHSFRfU0hJRlRfSVMpIHx8ICFkZWZpbmVkKEFSSVRITUVUSUNfUklHSFRfU0hJRlQpCi0jIGVycm9yICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKLSNlbmRpZgotI2lmIFNJR05FRF9SSUdIVF9TSElGVF9JUyAhPSBBUklUSE1FVElDX1JJR0hUX1NISUZUCi0jIGVycm9yICJUQ29tcGFjdFByb3RvY29sIGN1cnJlbnRseSBvbmx5IHdvcmtzIGlmIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCi0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotbmFtZXNwYWNlIGRldGFpbCB7IG5hbWVzcGFjZSBjb21wYWN0IHsKLQotZW51bSBUeXBlcyB7Ci0gIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKLSAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAotICBDVF9CT09MRUFOX0ZBTFNFICA9IDB4MDIsCi0gIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKLSAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAotICBDVF9JMzIgICAgICAgICAgICA9IDB4MDUsCi0gIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKLSAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAotICBDVF9CSU5BUlkgICAgICAgICA9IDB4MDgsCi0gIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKLSAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAotICBDVF9NQVAgICAgICAgICAgICA9IDB4MEIsCi0gIENUX1NUUlVDVCAgICAgICAgID0gMHgwQwotfTsKLQotY29uc3QgaW50OF90IFRUeXBlVG9DVHlwZVsxNl0gPSB7Ci0gIENUX1NUT1AsIC8vIFRfU1RPUAotICAwLCAvLyB1bnVzZWQKLSAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKLSAgQ1RfQllURSwgLy8gVF9CWVRFCi0gIENUX0RPVUJMRSwgLy8gVF9ET1VCTEUKLSAgMCwgLy8gdW51c2VkCi0gIENUX0kxNiwgLy8gVF9JMTYKLSAgMCwgLy8gdW51c2VkCi0gIENUX0kzMiwgLy8gVF9JMzIKLSAgMCwgLy8gdW51c2VkCi0gIENUX0k2NCwgLy8gVF9JNjQKLSAgQ1RfQklOQVJZLCAvLyBUX1NUUklORwotICBDVF9TVFJVQ1QsIC8vIFRfU1RSVUNUCi0gIENUX01BUCwgLy8gVF9NQVAKLSAgQ1RfU0VULCAvLyBUX1NFVAotICBDVF9MSVNULCAvLyBUX0xJU1QKLX07Ci0KLX19IC8vIGVuZCBkZXRhaWw6OmNvbXBhY3QgbmFtZXNwYWNlCi0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNZXNzYWdlQmVnaW4oCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoUFJPVE9DT0xfSUQpOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykgfCAoKChpbnQzMl90KW1lc3NhZ2VUeXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOwotICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNlcWlkKTsKLSAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCi0gKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCi0gKiBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgaWYgKGZpZWxkVHlwZSA9PSBUX0JPT0wpIHsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOwotICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gZmllbGRUeXBlOwotICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCA9IGZpZWxkSWQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCwgLTEpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiB3cml0ZUJ5dGUoVF9TVE9QKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKLSAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAotICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICAodm9pZCkgbmFtZTsKLSAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7Ci0gIGxhc3RGaWVsZElkXyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCi0gKiB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKLSAqIG9mIHRoZSBmaWVsZCBzdGFjay4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8udG9wKCk7Ci0gIGxhc3RGaWVsZF8ucG9wKCk7Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIFdyaXRlIGEgTGlzdCBoZWFkZXIuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgcmV0dXJuIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHNldCBoZWFkZXIuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKLSAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIGlmIChzaXplID09IDApIHsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzaXplKTsKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKHZhbFR5cGUpKTsKLSAgfQotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCi0gKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQotICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgotICogT3RoZXJ3aXNlLCB3cml0ZSBhIHNpbmdsZSBieXRlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0KLSAgaWYgKGJvb2xlYW5GaWVsZF8ubmFtZSAhPSBOVUxMKSB7Ci0gICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0Ci0gICAgd3NpemUgKz0gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA/IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpOwotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUodmFsdWUgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRSk7Ci0gIH0KLSAgcmV0dXJuIHdzaXplOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJ5dGUsIDEpOwotICByZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpMTYgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMTYpKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMzIpKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVWYXJpbnQ2NChpNjRUb1ppZ3phZyhpNjQpKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOwotCi0gIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7Ci0gIGJpdHMgPSBodG9sZWxsKGJpdHMpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7Ci0gIHJldHVybiA4OwotfQotCi0vKioKLSAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWVkaW5nLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiB3cml0ZUJpbmFyeShzdHIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHNzaXplID0gc3RyLnNpemUoKTsKLSAgdWludDMyX3Qgd3NpemUgPSB3cml0ZVZhcmludDMyKHNzaXplKSArIHNzaXplOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLy8KLS8vIEludGVybmFsIFdyaXRpbmcgbWV0aG9kcwotLy8KLQotLyoqCi0gKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQotICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKLSAqIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1pbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCgKLSAgICBjb25zdCBjaGFyKiBuYW1lLAotICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCi0gICAgaW50OF90IHR5cGVPdmVycmlkZSkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KLSAgaW50OF90IHR5cGVUb1dyaXRlID0gKHR5cGVPdmVycmlkZSA9PSAtMSA/IGdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOwotCi0gIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAotICBpZiAoZmllbGRJZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZElkIC0gbGFzdEZpZWxkSWRfIDw9IDE1KSB7Ci0gICAgLy8gd3JpdGUgdGhlbSB0b2dldGhlcgotICAgIHdzaXplICs9IHdyaXRlQnl0ZSgoZmllbGRJZCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKLSAgfSBlbHNlIHsKLSAgICAvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCi0gICAgd3NpemUgKz0gd3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKLSAgICB3c2l6ZSArPSB3cml0ZUkxNihmaWVsZElkKTsKLSAgfQotCi0gIGxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLyoqCi0gKiBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCi0gKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQ29sbGVjdGlvbkJlZ2luKGludDhfdCBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICBpZiAoc2l6ZSA8PSAxNCkgewotICAgIHdzaXplICs9IHdyaXRlQnl0ZShzaXplIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOwotICB9IGVsc2UgewotICAgIHdzaXplICs9IHdyaXRlQnl0ZSgweGYwIHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKLSAgICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNpemUpOwotICB9Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pIHsKLSAgdWludDhfdCBidWZbNV07Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOwotICAgICAgbiA+Pj0gNzsKLSAgICB9Ci0gIH0KLSAgdHJhbnNfLT53cml0ZShidWYsIHdzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pIHsKLSAgdWludDhfdCBidWZbMTBdOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKLSAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICBuID4+PSA3OwotICAgIH0KLSAgfQotICB0cmFuc18tPndyaXRlKGJ1Ziwgd3NpemUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpIHsKLSAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpOwotfQotCi0vKioKLSAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pIHsKLSAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOwotfQotCi0vKioKLSAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGRldGFpbDo6Y29tcGFjdDo6VHlwZXMgdmFsdWUKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1pbnQ4X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmdldENvbXBhY3RUeXBlKGludDhfdCB0dHlwZSkgewotICByZXR1cm4gZGV0YWlsOjpjb21wYWN0OjpUVHlwZVRvQ1R5cGVbdHR5cGVdOwotfQotCi0vLwotLy8gUmVhZGluZyBNZXRob2RzCi0vLwotCi0vKioKLSAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1lc3NhZ2VCZWdpbigKLSAgICBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgaW50OF90IHByb3RvY29sSWQ7Ci0gIGludDhfdCB2ZXJzaW9uQW5kVHlwZTsKLSAgaW50OF90IHZlcnNpb247Ci0KLSAgcnNpemUgKz0gcmVhZEJ5dGUocHJvdG9jb2xJZCk7Ci0gIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciIpOwotICB9Ci0KLSAgcnNpemUgKz0gcmVhZEJ5dGUodmVyc2lvbkFuZFR5cGUpOwotICB2ZXJzaW9uID0gKGludDhfdCkodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOwotICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OX04pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCB2ZXJzaW9uIik7Ci0gIH0KLQotICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiAweDAzKTsKLSAgcnNpemUgKz0gcmVhZFZhcmludDMyKHNlcWlkKTsKLSAgcnNpemUgKz0gcmVhZFN0cmluZyhuYW1lKTsKLQotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCi0gKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb24gdGhlIGZpZWxkIHN0YWNrLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgbmFtZSA9ICIiOwotICBsYXN0RmllbGRfLnB1c2gobGFzdEZpZWxkSWRfKTsKLSAgbGFzdEZpZWxkSWRfID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKLSAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RydWN0RW5kKCkgewotICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnRvcCgpOwotICBsYXN0RmllbGRfLnBvcCgpOwotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCByc2l6ZSA9IDA7Ci0gIGludDhfdCBieXRlOwotICBpbnQ4X3QgdHlwZTsKLQotICByc2l6ZSArPSByZWFkQnl0ZShieXRlKTsKLSAgdHlwZSA9IChieXRlICYgMHgwZik7Ci0KLSAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgotICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKLSAgICBmaWVsZFR5cGUgPSBUX1NUT1A7Ci0gICAgZmllbGRJZCA9IDA7Ci0gICAgcmV0dXJuIHJzaXplOwotICB9Ci0KLSAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgotICBpbnQxNl90IG1vZGlmaWVyID0gKGludDE2X3QpKCgodWludDhfdClieXRlICYgMHhmMCkgPj4gNCk7Ci0gIGlmIChtb2RpZmllciA9PSAwKSB7Ci0gICAgLy8gbm90IGEgZGVsdGEsIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgotICAgIHJzaXplICs9IHJlYWRJMTYoZmllbGRJZCk7Ci0gIH0gZWxzZSB7Ci0gICAgZmllbGRJZCA9IChpbnQxNl90KShsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7Ci0gIH0KLSAgZmllbGRUeXBlID0gZ2V0VFR5cGUodHlwZSk7Ci0KLSAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKLSAgaWYgKHR5cGUgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUgfHwKLSAgICAgIHR5cGUgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKSB7Ci0gICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCi0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOwotICAgIGJvb2xWYWx1ZV8uYm9vbFZhbHVlID0KLSAgICAgICh0eXBlID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKLSAgfQotCi0gIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgotICBsYXN0RmllbGRJZF8gPSBmaWVsZElkOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQotICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKLSAqICJjb3JyZWN0IiB0eXBlcy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICBpbnQ4X3Qga3ZUeXBlID0gMDsKLSAgaW50MzJfdCBtc2l6ZSA9IDA7Ci0KLSAgcnNpemUgKz0gcmVhZFZhcmludDMyKG1zaXplKTsKLSAgaWYgKG1zaXplICE9IDApCi0gICAgcnNpemUgKz0gcmVhZEJ5dGUoa3ZUeXBlKTsKLQotICBpZiAobXNpemUgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBtc2l6ZSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotCi0gIGtleVR5cGUgPSBnZXRUVHlwZSgoaW50OF90KSgodWludDhfdClrdlR5cGUgPj4gNCkpOwotICB2YWxUeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoKHVpbnQ4X3Qpa3ZUeXBlICYgMHhmKSk7Ci0gIHNpemUgPSAodWludDMyX3QpbXNpemU7Ci0KLSAgcmV0dXJuIHJzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCi0gKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gKiB0cnVlIHNpemUuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IHNpemVfYW5kX3R5cGU7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgaW50MzJfdCBsc2l6ZTsKLQotICByc2l6ZSArPSByZWFkQnl0ZShzaXplX2FuZF90eXBlKTsKLQotICBsc2l6ZSA9ICgodWludDhfdClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKLSAgaWYgKGxzaXplID09IDE1KSB7Ci0gICAgcnNpemUgKz0gcmVhZFZhcmludDMyKGxzaXplKTsKLSAgfQotCi0gIGlmIChsc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIGxzaXplID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0KLSAgZWxlbVR5cGUgPSBnZXRUVHlwZSgoaW50OF90KShzaXplX2FuZF90eXBlICYgMHgwZikpOwotICBzaXplID0gKHVpbnQzMl90KWxzaXplOwotCi0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCi0gKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgotICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICogdHJ1ZSBzaXplLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICByZXR1cm4gcmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci19Ci0KLS8qKgotICogUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAotICogYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBkdXJpbmcgcmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKLSAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgcmVhZCBhIGJ5dGUuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gIGlmIChib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9PSB0cnVlKSB7Ci0gICAgdmFsdWUgPSBib29sVmFsdWVfLmJvb2xWYWx1ZTsKLSAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOwotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIGludDhfdCB2YWw7Ci0gICAgcmVhZEJ5dGUodmFsKTsKLSAgICB2YWx1ZSA9ICh2YWwgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUpOwotICAgIHJldHVybiAxOwotICB9Ci19Ci0KLS8qKgotICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgdWludDhfdCBiWzFdOwotICB0cmFuc18tPnJlYWRBbGwoYiwgMSk7Ci0gIGJ5dGUgPSAqKGludDhfdCopYjsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHZhbHVlKTsKLSAgaTE2ID0gKGludDE2X3QpemlnemFnVG9JMzIodmFsdWUpOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHZhbHVlKTsKLSAgaTMyID0gemlnemFnVG9JMzIodmFsdWUpOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDY0KHZhbHVlKTsKLSAgaTY0ID0gemlnemFnVG9JNjQodmFsdWUpOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgcmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7Ci0KLSAgdWludDY0X3QgYml0czsKLSAgdWludDhfdCBiWzhdOwotICB0cmFuc18tPnJlYWRBbGwoYiwgOCk7Ci0gIGJpdHMgPSAqKHVpbnQ2NF90KiliOwotICBiaXRzID0gbGV0b2hsbChiaXRzKTsKLSAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4oYml0cyk7Ci0gIHJldHVybiA4OwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHJlYWRCaW5hcnkoc3RyKTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICBpbnQzMl90IHJzaXplID0gMDsKLSAgaW50MzJfdCBzaXplOwotCi0gIHJzaXplICs9IHJlYWRWYXJpbnQzMihzaXplKTsKLSAgLy8gQ2F0Y2ggZW1wdHkgc3RyaW5nIGNhc2UKLSAgaWYgKHNpemUgPT0gMCkgewotICAgIHN0ciA9ICIiOwotICAgIHJldHVybiByc2l6ZTsKLSAgfQotCi0gIC8vIENhdGNoIGVycm9yIGNhc2VzCi0gIGlmIChzaXplIDwgMCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9Ci0gIGlmIChzdHJpbmdfbGltaXRfID4gMCAmJiBzaXplID4gc3RyaW5nX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0KLSAgLy8gVXNlIHRoZSBoZWFwIGhlcmUgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyBmb3Igdi4gbGFyZ2Ugc3RyaW5ncwotICBpZiAoc2l6ZSA+IHN0cmluZ19idWZfc2l6ZV8gfHwgc3RyaW5nX2J1Zl8gPT0gTlVMTCkgewotICAgIHZvaWQqIG5ld19zdHJpbmdfYnVmID0gc3RkOjpyZWFsbG9jKHN0cmluZ19idWZfLCAodWludDMyX3Qpc2l6ZSk7Ci0gICAgaWYgKG5ld19zdHJpbmdfYnVmID09IE5VTEwpIHsKLSAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgfQotICAgIHN0cmluZ19idWZfID0gKHVpbnQ4X3QqKW5ld19zdHJpbmdfYnVmOwotICAgIHN0cmluZ19idWZfc2l6ZV8gPSBzaXplOwotICB9Ci0gIHRyYW5zXy0+cmVhZEFsbChzdHJpbmdfYnVmXywgc2l6ZSk7Ci0gIHN0ci5hc3NpZ24oKGNoYXIqKXN0cmluZ19idWZfLCBzaXplKTsKLQotICByZXR1cm4gcnNpemUgKyAodWludDMyX3Qpc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKLSAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFZhcmludDMyKGludDMyX3QmIGkzMikgewotICBpbnQ2NF90IHZhbDsKLSAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50NjQodmFsKTsKLSAgaTMyID0gKGludDMyX3QpdmFsOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFZhcmludDY0KGludDY0X3QmIGk2NCkgewotICB1aW50MzJfdCByc2l6ZSA9IDA7Ci0gIHVpbnQ2NF90IHZhbCA9IDA7Ci0gIGludCBzaGlmdCA9IDA7Ci0gIHVpbnQ4X3QgYnVmWzEwXTsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCi0gIHVpbnQzMl90IGJ1Zl9zaXplID0gc2l6ZW9mKGJ1Zik7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkID0gdHJhbnNfLT5ib3Jyb3coYnVmLCAmYnVmX3NpemUpOwotCi0gIC8vIEZhc3QgcGF0aC4KLSAgaWYgKGJvcnJvd2VkICE9IE5VTEwpIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgdWludDhfdCBieXRlID0gYm9ycm93ZWRbcnNpemVdOwotICAgICAgcnNpemUrKzsKLSAgICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKLSAgICAgICAgaTY0ID0gdmFsOwotICAgICAgICB0cmFuc18tPmNvbnN1bWUocnNpemUpOwotICAgICAgICByZXR1cm4gcnNpemU7Ci0gICAgICB9Ci0gICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2guCi0gICAgICBpZiAoVU5MSUtFTFkocnNpemUgPT0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBTbG93IHBhdGguCi0gIGVsc2UgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGU7Ci0gICAgICByc2l6ZSArPSB0cmFuc18tPnJlYWRBbGwoJmJ5dGUsIDEpOwotICAgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OwotICAgICAgc2hpZnQgKz0gNzsKLSAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgewotICAgICAgICBpNjQgPSB2YWw7Ci0gICAgICAgIHJldHVybiByc2l6ZTsKLSAgICAgIH0KLSAgICAgIC8vIE1pZ2h0IGFzIHdlbGwgY2hlY2sgZm9yIGludmFsaWQgZGF0YSBvbiB0aGUgc2xvdyBwYXRoIHRvby4KLSAgICAgIGlmIChVTkxJS0VMWShyc2l6ZSA+PSBzaXplb2YoYnVmKSkpIHsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci1pbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp6aWd6YWdUb0kzMih1aW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOwotfQotCi0vKioKLSAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLWludDY0X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnppZ3phZ1RvSTY0KHVpbnQ2NF90IG4pIHsKLSAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotVFR5cGUgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmdldFRUeXBlKGludDhfdCB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVF9TVE9QOgotICAgICAgcmV0dXJuIFRfU1RPUDsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRToKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFOgotICAgICAgcmV0dXJuIFRfQk9PTDsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQllURToKLSAgICAgIHJldHVybiBUX0JZVEU7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0kxNjoKLSAgICAgIHJldHVybiBUX0kxNjsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfSTMyOgotICAgICAgcmV0dXJuIFRfSTMyOwotICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9JNjQ6Ci0gICAgICByZXR1cm4gVF9JNjQ7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0RPVUJMRToKLSAgICAgIHJldHVybiBUX0RPVUJMRTsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfQklOQVJZOgotICAgICAgcmV0dXJuIFRfU1RSSU5HOwotICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9MSVNUOgotICAgICAgcmV0dXJuIFRfTElTVDsKLSAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfU0VUOgotICAgICAgcmV0dXJuIFRfU0VUOwotICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9NQVA6Ci0gICAgICByZXR1cm4gVF9NQVA7Ci0gICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX1NUUlVDVDoKLSAgICAgIHJldHVybiBUX1NUUlVDVDsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICIgKyB0eXBlKTsKLSAgfQotICByZXR1cm4gVF9TVE9QOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfVENDXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGUxNzViLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJURGVidWdQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotCi1zdGF0aWMgc3RyaW5nIGJ5dGVfdG9faGV4KGNvbnN0IHVpbnQ4X3QgYnl0ZSkgewotICBjaGFyIGJ1ZlszXTsKLSAgaW50IHJldCA9IHN0ZDo6c3ByaW50ZihidWYsICIlMDJ4IiwgKGludClieXRlKTsKLSAgYXNzZXJ0KHJldCA9PSAyKTsKLSAgYXNzZXJ0KGJ1ZlsyXSA9PSAnXDAnKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLXN0cmluZyBURGVidWdQcm90b2NvbDo6ZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVF9TVE9QICAgOiByZXR1cm4gInN0b3AiICAgOwotICAgIGNhc2UgVF9WT0lEICAgOiByZXR1cm4gInZvaWQiICAgOwotICAgIGNhc2UgVF9CT09MICAgOiByZXR1cm4gImJvb2wiICAgOwotICAgIGNhc2UgVF9CWVRFICAgOiByZXR1cm4gImJ5dGUiICAgOwotICAgIGNhc2UgVF9JMTYgICAgOiByZXR1cm4gImkxNiIgICAgOwotICAgIGNhc2UgVF9JMzIgICAgOiByZXR1cm4gImkzMiIgICAgOwotICAgIGNhc2UgVF9VNjQgICAgOiByZXR1cm4gInU2NCIgICAgOwotICAgIGNhc2UgVF9JNjQgICAgOiByZXR1cm4gImk2NCIgICAgOwotICAgIGNhc2UgVF9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSIgOwotICAgIGNhc2UgVF9TVFJJTkcgOiByZXR1cm4gInN0cmluZyIgOwotICAgIGNhc2UgVF9TVFJVQ1QgOiByZXR1cm4gInN0cnVjdCIgOwotICAgIGNhc2UgVF9NQVAgICAgOiByZXR1cm4gIm1hcCIgICAgOwotICAgIGNhc2UgVF9TRVQgICAgOiByZXR1cm4gInNldCIgICAgOwotICAgIGNhc2UgVF9MSVNUICAgOiByZXR1cm4gImxpc3QiICAgOwotICAgIGNhc2UgVF9VVEY4ICAgOiByZXR1cm4gInV0ZjgiICAgOwotICAgIGNhc2UgVF9VVEYxNiAgOiByZXR1cm4gInV0ZjE2IiAgOwotICAgIGRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KLQotdm9pZCBURGVidWdQcm90b2NvbDo6aW5kZW50VXAoKSB7Ci0gIGluZGVudF9zdHJfICs9IHN0cmluZyhpbmRlbnRfaW5jLCAnICcpOwotfQotCi12b2lkIFREZWJ1Z1Byb3RvY29sOjppbmRlbnREb3duKCkgewotICBpZiAoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPCAoc3RyaW5nOjpzaXplX3R5cGUpaW5kZW50X2luYykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gIH0KLSAgaW5kZW50X3N0cl8uZXJhc2UoaW5kZW50X3N0cl8ubGVuZ3RoKCkgLSBpbmRlbnRfaW5jKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlUGxhaW4oY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3RyLmxlbmd0aCgpKTsKLSAgcmV0dXJuIHN0ci5sZW5ndGgoKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSW5kZW50ZWQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopaW5kZW50X3N0cl8uZGF0YSgpLCBpbmRlbnRfc3RyXy5sZW5ndGgoKSk7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHN0ci5sZW5ndGgoKSk7Ci0gIHJldHVybiBpbmRlbnRfc3RyXy5sZW5ndGgoKSArIHN0ci5sZW5ndGgoKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OnN0YXJ0SXRlbSgpIHsKLSAgdWludDMyX3Qgc2l6ZTsKLQotICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKLSAgICBjYXNlIFVOSU5JVDoKLSAgICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KLSAgICAgIC8vdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgIC8vcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBTRVQ6Ci0gICAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7Ci0gICAgY2FzZSBNQVBfS0VZOgotICAgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOwotICAgIGNhc2UgTUFQX1ZBTFVFOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIiAtPiAiKTsKLSAgICBjYXNlIExJU1Q6Ci0gICAgICBzaXplID0gd3JpdGVJbmRlbnRlZCgKLSAgICAgICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4obGlzdF9pZHhfLmJhY2soKSkgKyAiXSA9ICIpOwotICAgICAgbGlzdF9pZHhfLmJhY2soKSsrOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkludmFsaWQgZW51bSB2YWx1ZS4iKTsKLSAgfQotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6ZW5kSXRlbSgpIHsKLSAgLy91aW50MzJfdCBzaXplOwotCi0gIHN3aXRjaCAod3JpdGVfc3RhdGVfLmJhY2soKSkgewotICAgIGNhc2UgVU5JTklUOgotICAgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgotICAgICAgLy90aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgLy9yZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBTVFJVQ1Q6Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgY2FzZSBTRVQ6Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgY2FzZSBNQVBfS0VZOgotICAgICAgd3JpdGVfc3RhdGVfLmJhY2soKSA9IE1BUF9WQUxVRTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgTUFQX1ZBTFVFOgotICAgICAgd3JpdGVfc3RhdGVfLmJhY2soKSA9IE1BUF9LRVk7Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgY2FzZSBMSVNUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7Ci0gIH0KLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSXRlbShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHN0YXJ0SXRlbSgpOwotICBzaXplICs9IHdyaXRlUGxhaW4oc3RyKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgKHZvaWQpIHNlcWlkOwotICBzdHJpbmcgbXR5cGU7Ci0gIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKLSAgICBjYXNlIFRfQ0FMTCAgICAgIDogbXR5cGUgPSAiY2FsbCIgICA7IGJyZWFrOwotICAgIGNhc2UgVF9SRVBMWSAgICAgOiBtdHlwZSA9ICJyZXBseSIgIDsgYnJlYWs7Ci0gICAgY2FzZSBUX0VYQ0VQVElPTiA6IG10eXBlID0gImV4biIgICAgOyBicmVhazsKLSAgICBjYXNlIFRfT05FV0FZICAgIDogbXR5cGUgPSAib25ld2F5IiA7IGJyZWFrOwotICB9Ci0KLSAgdWludDMyX3Qgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoIigiICsgbXR5cGUgKyAiKSAiICsgbmFtZSArICIoIik7Ci0gIGluZGVudFVwKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgewotICBpbmRlbnREb3duKCk7Ci0gIHJldHVybiB3cml0ZUluZGVudGVkKCIpXG4iKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSBzdGFydEl0ZW0oKTsKLSAgc2l6ZSArPSB3cml0ZVBsYWluKHN0cmluZyhuYW1lKSArICIge1xuIik7Ci0gIGluZGVudFVwKCk7Ci0gIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soU1RSVUNUKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOwotICBzaXplICs9IGVuZEl0ZW0oKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgLy8gc3ByaW50ZihpZF9zdHIsICIlMDJkIiwgZmllbGRJZCk7Ci0gIHN0cmluZyBpZF9zdHIgPSBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZmllbGRJZCk7Ci0gIGlmIChpZF9zdHIubGVuZ3RoKCkgPT0gMSkgaWRfc3RyID0gJzAnICsgaWRfc3RyOwotCi0gIHJldHVybiB3cml0ZUluZGVudGVkKAotICAgICAgaWRfc3RyICsgIjogIiArCi0gICAgICBuYW1lICsgIiAoIiArCi0gICAgICBmaWVsZFR5cGVOYW1lKGZpZWxkVHlwZSkgKyAiKSA9ICIpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKLSAgYXNzZXJ0KHdyaXRlX3N0YXRlXy5iYWNrKCkgPT0gU1RSVUNUKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKLSAgcmV0dXJuIDA7Ci0gICAgLy93cml0ZUluZGVudGVkKCIqKipTVE9QKioqXG4iKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgbWFwcz8KLSAgdWludDMyX3QgYnNpemUgPSAwOwotICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKLSAgYnNpemUgKz0gd3JpdGVQbGFpbigKLSAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKLSAgaW5kZW50VXAoKTsKLSAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhNQVBfS0VZKTsKLSAgcmV0dXJuIGJzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IGFycmF5cy4KLSAgdWludDMyX3QgYnNpemUgPSAwOwotICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKLSAgYnNpemUgKz0gd3JpdGVQbGFpbigKLSAgICAgICJsaXN0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7Ci0gIGluZGVudFVwKCk7Ci0gIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTElTVCk7Ci0gIGxpc3RfaWR4Xy5wdXNoX2JhY2soMCk7Ci0gIHJldHVybiBic2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKLSAgbGlzdF9pZHhfLnBvcF9iYWNrKCk7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBzZXRzLgotICB1aW50MzJfdCBic2l6ZSA9IDA7Ci0gIGJzaXplICs9IHN0YXJ0SXRlbSgpOwotICBic2l6ZSArPSB3cml0ZVBsYWluKAotICAgICAgInNldDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOwotICBpbmRlbnRVcCgpOwotICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNFVCk7Ci0gIHJldHVybiBic2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgewotICBpbmRlbnREb3duKCk7Ci0gIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOwotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0odmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICByZXR1cm4gd3JpdGVJdGVtKCIweCIgKyBieXRlX3RvX2hleChieXRlKSk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMTYpKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGkzMikpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTY0KSk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGR1YikpOwotfQotCi0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHN0cikgewotICAvLyBYWFggUmF3L1VURi04PwotCi0gIHN0cmluZyB0b19zaG93ID0gc3RyOwotICBpZiAodG9fc2hvdy5sZW5ndGgoKSA+IChzdHJpbmc6OnNpemVfdHlwZSlzdHJpbmdfbGltaXRfKSB7Ci0gICAgdG9fc2hvdyA9IHN0ci5zdWJzdHIoMCwgc3RyaW5nX3ByZWZpeF9zaXplXyk7Ci0gICAgdG9fc2hvdyArPSAiWy4uLl0oIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzdHIubGVuZ3RoKCkpICsgIikiOwotICB9Ci0KLSAgc3RyaW5nIG91dHB1dCA9ICJcIiI7Ci0KLSAgZm9yIChzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdG9fc2hvdy5iZWdpbigpOyBpdCAhPSB0b19zaG93LmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKCppdCA9PSAnXFwnKSB7Ci0gICAgICBvdXRwdXQgKz0gIlxcXFwiOwotICAgIH0gZWxzZSBpZiAoKml0ID09ICciJykgewotICAgICAgb3V0cHV0ICs9ICJcXFwiIjsKLSAgICB9IGVsc2UgaWYgKHN0ZDo6aXNwcmludCgqaXQpKSB7Ci0gICAgICBvdXRwdXQgKz0gKml0OwotICAgIH0gZWxzZSB7Ci0gICAgICBzd2l0Y2ggKCppdCkgewotICAgICAgICBjYXNlICdcYSc6IG91dHB1dCArPSAiXFxhIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xiJzogb3V0cHV0ICs9ICJcXGIiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXGYnOiBvdXRwdXQgKz0gIlxcZiI7IGJyZWFrOwotICAgICAgICBjYXNlICdcbic6IG91dHB1dCArPSAiXFxuIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzogb3V0cHV0ICs9ICJcXHIiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnOiBvdXRwdXQgKz0gIlxcdCI7IGJyZWFrOwotICAgICAgICBjYXNlICdcdic6IG91dHB1dCArPSAiXFx2IjsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgb3V0cHV0ICs9ICJcXHgiOwotICAgICAgICAgIG91dHB1dCArPSBieXRlX3RvX2hleCgqaXQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIG91dHB1dCArPSAnXCInOwotICByZXR1cm4gd3JpdGVJdGVtKG91dHB1dCk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdHJpbmcmIHN0cikgewotICAvLyBYWFggSGV4PwotICByZXR1cm4gVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nKHN0cik7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjc4NzdjLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUVmlydHVhbFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKgotCi0hISEgRVhQRVJJTUVOVEFMIENPREUgISEhCi0KLVRoaXMgcHJvdG9jb2wgaXMgdmVyeSBtdWNoIGEgd29yayBpbiBwcm9ncmVzcy4KLUl0IGRvZXNuJ3QgaGFuZGxlIG1hbnkgY2FzZXMgcHJvcGVybHkuCi1JdCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBtYW55IGNhc2VzLgotSXQgcHJvYmFibHkgc2VnZmF1bHRzIGluIG1hbnkgY2FzZXMuCi1CdWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0cyBhcmUgd2VsY29tZS4KLUNvbXBsYWludHMgYXJlIG5vdC4gOlIKLQotKi8KLQotCi0vKioKLSAqIFByb3RvY29sIHRoYXQgcHJpbnRzIHRoZSBwYXlsb2FkIGluIGEgbmljZSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCi0gKiBSZWFkaW5nIGZyb20gdGhpcyBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkLgotICoKLSAqLwotY2xhc3MgVERlYnVnUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4gewotIHByaXZhdGU6Ci0gIGVudW0gd3JpdGVfc3RhdGVfdAotICB7IFVOSU5JVAotICAsIFNUUlVDVAotICAsIExJU1QKLSAgLCBTRVQKLSAgLCBNQVBfS0VZCi0gICwgTUFQX1ZBTFVFCi0gIH07Ci0KLSBwdWJsaWM6Ci0gIFREZWJ1Z1Byb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKQotICAgIDogVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4odHJhbnMpCi0gICAgLCB0cmFuc18odHJhbnMuZ2V0KCkpCi0gICAgLCBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKQotICAgICwgc3RyaW5nX3ByZWZpeF9zaXplXyhERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSkKLSAgewotICAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soVU5JTklUKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX0xJTUlUID0gMjU2OwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSA9IDE2OwotCi0gIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7Ci0gICAgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsKLSAgfQotCi0gIHZvaWQgc2V0U3RyaW5nUHJlZml4U2l6ZShpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZSkgewotICAgIHN0cmluZ19wcmVmaXhfc2l6ZV8gPSBzdHJpbmdfcHJlZml4X3NpemU7Ci0gIH0KLQotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLQotIHByaXZhdGU6Ci0gIHZvaWQgaW5kZW50VXAoKTsKLSAgdm9pZCBpbmRlbnREb3duKCk7Ci0gIHVpbnQzMl90IHdyaXRlUGxhaW4oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0gIHVpbnQzMl90IHdyaXRlSW5kZW50ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0gIHVpbnQzMl90IHN0YXJ0SXRlbSgpOwotICB1aW50MzJfdCBlbmRJdGVtKCk7Ci0gIHVpbnQzMl90IHdyaXRlSXRlbShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKTsKLQotICBUVHJhbnNwb3J0KiB0cmFuc187Ci0KLSAgaW50MzJfdCBzdHJpbmdfbGltaXRfOwotICBpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZV87Ci0KLSAgc3RkOjpzdHJpbmcgaW5kZW50X3N0cl87Ci0gIHN0YXRpYyBjb25zdCBpbnQgaW5kZW50X2luYyA9IDI7Ci0KLSAgc3RkOjp2ZWN0b3I8d3JpdGVfc3RhdGVfdD4gd3JpdGVfc3RhdGVfOwotICBzdGQ6OnZlY3RvcjxpbnQ+IGxpc3RfaWR4XzsKLX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBkZWJ1ZyBwcm90b2NvbCBoYW5kbGVycwotICovCi1jbGFzcyBURGVidWdQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKLSAgfQotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLQotLy8gVE9ETyhkcmVpc3MpOiBNb3ZlIChwYXJ0IG9mKSBUaHJpZnREZWJ1Z1N0cmluZyBpbnRvIGEgLmNwcCBmaWxlIGFuZCByZW1vdmUgdGhpcy4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+Ci1zdGQ6OnN0cmluZyBUaHJpZnREZWJ1Z1N0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKLSAgVERlYnVnUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOwotCi0gIHRzLndyaXRlKCZwcm90b2NvbCk7Ci0KLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBzaXplOwotICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOwotfQotCi0vLyBUT0RPKGRyZWlzcyk6IFRoaXMgaXMgYmFkbHkgYnJva2VuLiAgRG9uJ3QgdXNlIGl0IHVubGVzcyB5b3UgYXJlIG1lLgotI2lmIDAKLXRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdD4KLXN0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4mIHZlYykgewotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7Ci0gIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKLQotICAvLyBJIGFtIGdyb3NzIQotICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKCJTb21lUmFuZG9tVmVjdG9yIik7Ci0KLSAgLy8gVE9ETzogRml4IHRoaXMgd2l0aCBhIHRyYWl0LgotICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbigoVFR5cGUpOTksIHZlYy5zaXplKCkpOwotICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxPYmplY3Q+Ojpjb25zdF9pdGVyYXRvciBpdDsKLSAgZm9yIChpdCA9IHZlYy5iZWdpbigpOyBpdCAhPSB2ZWMuZW5kKCk7ICsraXQpIHsKLSAgICBpdC0+d3JpdGUoJnByb3RvY29sKTsKLSAgfQotICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKLQotICB1aW50OF90KiBidWY7Ci0gIHVpbnQzMl90IHNpemU7Ci0gIGJ1ZmZlci0+Z2V0QnVmZmVyKCZidWYsICZzaXplKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsICh1bnNpZ25lZCBpbnQpc2l6ZSk7Ci19Ci0jZW5kaWYgLy8gMAotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8KLQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTVlMjguLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLQotSU1QTEVNRU5UQVRJT04gREVUQUlMUwotCi1URGVuc2VQcm90b2NvbCB3YXMgZGVzaWduZWQgdG8gaGF2ZSBhIHNtYWxsZXIgc2VyaWFsaXplZCBmb3JtIHRoYW4KLVRCaW5hcnlQcm90b2NvbC4gIFRoaXMgaXMgYWNjb21wbGlzaGVkIHVzaW5nIHR3byB0ZWNobmlxdWVzLiAgVGhlIGZpcnN0IGlzCi12YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZy4gIFdlIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWUgdGhhdCB0aGUgU3RhbmRhcmQKLU1JREkgRmlsZSBmb3JtYXQgdXNlcyBmb3IgInZhcmlhYmxlLWxlbmd0aCBxdWFudGl0aWVzIgotKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFyaWFibGUtbGVuZ3RoX3F1YW50aXR5KS4KLUFsbCBpbnRlZ2VycyAoaW5jbHVkaW5nIGkxNiwgYnV0IG5vdCBieXRlKSBhcmUgZmlyc3QgY2FzdCB0byB1aW50NjRfdCwKLXRoZW4gd3JpdHRlbiBvdXQgYXMgdmFyaWFibGUtbGVuZ3RoIHF1YW50aXRpZXMuICBUaGlzIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZQotZWZmZWN0IHRoYXQgYWxsIG5lZ2F0aXZlIG51bWJlcnMgcmVxdWlyZSAxMCBieXRlcywgYnV0IG5lZ2F0aXZlIG51bWJlcnMgdGVuZAotdG8gYmUgZmFyIGxlc3MgY29tbW9uIHRoYW4gcG9zaXRpdmUgb25lcy4KLQotVGhlIHNlY29uZCB0ZWNobmlxdWUgZWxpbWluYXRpbmcgdGhlIGZpZWxkIGlkcyB1c2VkIGJ5IFRCaW5hcnlQcm90b2NvbC4gIFRoaXMKLWRlY2lzaW9uIHJlcXVpcmVkIHN1cHBvcnQgZnJvbSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBhbHNvIHNhY3JpZmljZXMgc29tZSBvZgotdGhlIGJhY2t3YXJkIGFuZCBmb3J3YXJkIGNvbXBhdGliaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sLgotCi1XZSBjb25zaWRlcmVkIGltcGxlbWVudGluZyB0aGlzIHRlY2huaXF1ZSBieSBnZW5lcmF0aW5nIHNlcGFyYXRlIHJlYWRlcnMgYW5kCi13cml0ZXJzIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wgKHRoaXMgaXMgaG93IFBpbGxhciwgVGhyaWZ0J3MgcHJlZGVjZXNzb3IsCi13b3JrZWQpLCBidXQgdGhpcyBpZGVhIGhhZCBhIGZldyBwcm9ibGVtczoKLS0gT3VyIGFic3RyYWN0aW9ucyBnbyBvdXQgdGhlIHdpbmRvdy4KLS0gV2Ugd291bGQgaGF2ZSB0byBtYWludGFpbiBhIHNlY29uZCBjb2RlIGdlbmVyYXRvci4KLS0gUHJlc2VydmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVzIHdvdWxkIGJlIGEKLSAgbmlnaHRtYXJlLgotCi1UaGVyZWZvcmUsIHdlIGNob3NlIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN0b3JlZCB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZSBkYXRhIG5laXRoZXIgaW4gdGhlIGRhdGEgaXRzZWxmIChsaWtlIFRCaW5hcnlQcm90b2NvbCkgbm9yIGluIHRoZQotc2VyaWFsaXphdGlvbiBjb2RlIChsaWtlIFBpbGxhciksIGJ1dCBpbnN0ZWFkIGluIGEgc2VwYXJhdGUgZGF0YSBzdHJ1Y3R1cmUsCi1jYWxsZWQgYSBUeXBlU3BlYy4gIFR5cGVTcGVjcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKLShzcGVjaWZpY2FsbHkgaW4gdGhlIHRfY3BwX2dlbmVyYXRvciksIGFuZCB0aGVpciBzdHJ1Y3R1cmUgc2hvdWxkIGJlCi1kb2N1bWVudGVkIHRoZXJlIChUT0RPKGRyZWlzcyk6IHMvc2hvdWxkIGJlL2lzLykuCi0KLVdlIG1haW50YWluIGEgc3RhY2sgb2YgVHlwZVNwZWNzIHdpdGhpbiB0aGUgcHJvdG9jb2wgc28gaXQga25vd3Mgd2hlcmUgdGhlCi1nZW5lcmF0ZWQgY29kZSBpcyBpbiB0aGUgcmVhZGluZy93cml0aW5nIHByb2Nlc3MuICBGb3IgZXhhbXBsZSwgaWYgd2UgYXJlCi13cml0aW5nIGFuIGkzMiBjb250YWluZWQgaW4gYSBzdHJ1Y3QgYmFyLCBjb250YWluZWQgaW4gYSBzdHJ1Y3QgZm9vLCB0aGVuIHRoZQotc3RhY2sgd291bGQgbG9vayBsaWtlOiBUT1AgLCBpMzIgLCBzdHJ1Y3QgYmFyICwgc3RydWN0IGZvbyAsIEJPVFRPTS4KLVRoZSBmb2xsb3dpbmcgaW52YXJpYW50OiB3aGVuZXZlciB3ZSBhcmUgYWJvdXQgdG8gcmVhZC93cml0ZSBhbiBvYmplY3QKLShzdHJ1Y3RCZWdpbiwgY29udGFpbmVyQmVnaW4sIG9yIGEgc2NhbGFyKSwgdGhlIFR5cGVTcGVjIG9uIHRoZSB0b3Agb2YgdGhlCi1zdGFjayBtdXN0IG1hdGNoIHRoZSB0eXBlIGJlaW5nIHJlYWQvd3JpdHRlbi4gIFRoZSBtYWluIHJlYXNvbnMgdGhhdCB0aGlzCi1pbnZhcmlhbnQgbXVzdCBiZSBtYWludGFpbmVkIGlzIHRoYXQgaWYgd2UgZXZlciBzdGFydCByZWFkaW5nIGEgc3RydWN0dXJlLCB3ZQotbXVzdCBoYXZlIGl0cyBleGFjdCBUeXBlU3BlYyBpbiBvcmRlciB0byBwYXNzIHRoZSByaWdodCB0YWdzIHRvIHRoZQotZGVzZXJpYWxpemVyLgotCi1XZSB1c2UgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGZvciBtYWludGFpbmluZyB0aGlzIGludmFyaWFudDoKLQotLSBGb3Igc3RydWN0dXJlcywgd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIG9mIGluZGV4ZXMsIG9uZSBmb3IgZWFjaCBzdHJ1Y3R1cmUKLSAgb24gdGhlIFR5cGVTcGVjIHN0YWNrLiAgVGhlc2UgYXJlIGluZGV4ZXMgaW50byB0aGUgbGlzdCBvZiBmaWVsZHMgaW4gdGhlCi0gIHN0cnVjdHVyZSdzIFR5cGVTcGVjLiAgV2hlbiB3ZSB7cmVhZCx3cml0ZX1GaWVsZEJlZ2luLCB3ZSBwdXNoIG9uIHRoZQotICBUeXBlU3BlYyBmb3IgdGhlIGZpZWxkLgotLSBXaGVuIHdlIGJlZ2luIHdyaXRpbmcgYSBsaXN0IG9yIHNldCwgd2UgcHVzaCBvbiB0aGUgVHlwZVNwZWMgZm9yIHRoZQotICBlbGVtZW50IHR5cGUuCi0tIEZvciBtYXBzLCB3ZSBoYXZlIGEgc2VwYXJhdGUgc3RhY2sgb2YgYm9vbGVhbnMsIG9uZSBmb3IgZWFjaCBtYXAgb24gdGhlCi0gIFR5cGVTcGVjIHN0YWNrLiAgVGhlIGJvb2xlYW4gaXMgdHJ1ZSBpZiB3ZSBhcmUgd3JpdGluZyB0aGUga2V5IGZvciB0aGF0Ci0gIG1hcCwgYW5kIGZhbHNlIGlmIHdlIGFyZSB3cml0aW5nIHRoZSB2YWx1ZS4gIE1hcHMgYXJlIHRoZSB0cmlja2llc3QgY2FzZQotICBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjYWxsIGFueSBwcm90b2NvbCBtZXRob2QgYmV0d2VlbgotICB0aGUga2V5IGFuZCB0aGUgdmFsdWUuICBBcyBhIHJlc3VsdCwgd2UgcG90ZW50aWFsbHkgaGF2ZSB0byBzd2l0Y2gKLSAgYmV0d2VlbiBtYXAga2V5IHN0YXRlIGFuZCBtYXAgdmFsdWUgc3RhdGUgYWZ0ZXIgcmVhZGluZy93cml0aW5nIGFueSBvYmplY3QuCi0tIFRoaXMgam9iIGlzIGhhbmRsZWQgYnkgdGhlIHN0YXRlVHJhbnNpdGlvbiBtZXRob2QuICBJdCBpcyBjYWxsZWQgYWZ0ZXIKLSAgcmVhZGluZy93cml0aW5nIGV2ZXJ5IG9iamVjdC4gIEl0IHBvcHMgdGhlIGN1cnJlbnQgVHlwZVNwZWMgb2ZmIHRoZSBzdGFjaywKLSAgdGhlbiBvcHRpb25hbGx5IHB1c2hlcyBhIG5ldyBvbmUgb24sIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBuZXh0IFR5cGVTcGVjIGlzLgotICBJZiBpdCBpcyBhIHN0cnVjdCwgdGhlIGpvYiBpcyBsZWZ0IHRvIHRoZSBuZXh0IHdyaXRlRmllbGRCZWdpbi4gIElmIGl0IGlzIGEKLSAgc2V0IG9yIGxpc3QsIHRoZSBqdXN0LXBvcHBlZCB0eXBlc3BlYyBpcyBwdXNoZWQgYmFjayBvbi4gIElmIGl0IGlzIGEgbWFwLAotICB0aGUgdG9wIG9mIHRoZSBrZXkvdmFsdWUgc3RhY2sgaXMgdG9nZ2xlZCwgYW5kIHRoZSBhcHByb3ByaWF0ZSBUeXBlU3BlYwotICBpcyBwdXNoZWQuCi0KLU9wdGlvbmFsIGZpZWxkcyBhcmUgYSBsaXR0bGUgdHJpY2t5IGFsc28uICBXZSB3cml0ZSBhIHplcm8gYnl0ZSBpZiB0aGV5IGFyZQotYWJzZW50IGFuZCBwcmVmaXggdGhlbSB3aXRoIGFuIDB4MDEgYnl0ZSBpZiB0aGV5IGFyZSBwcmVzZW50Ci0qLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJURGVuc2VQcm90b2NvbC5oIgotI2luY2x1ZGUgIlRSZWZsZWN0aW9uTG9jYWwuaCIKLQotLy8gTGVhdmluZyB0aGlzIG9uIGZvciBub3cuICBEaXNhYmxpbmcgaXQgd2lsbCB0dXJuIG9mZiBhc3NlcnRzLCB3aGljaCBzaG91bGQKLS8vIGdpdmUgYSBwZXJmb3JtYW5jZSBib29zdC4gIFdoZW4gd2UgaGF2ZSAqcmVhbGx5KiB0aG9yb3VnaCB0ZXN0IGNhc2VzLAotLy8gd2Ugc2hvdWxkIGRyb3AgdGhpcy4KLSNkZWZpbmUgREVCVUdfVERFTlNFUFJPVE9DT0wKLQotLy8gTk9URTogQXNzZXJ0aW9ucyBzaG91bGQgKm9ubHkqIGJlIHVzZWQgdG8gZGV0ZWN0IGJ1Z3MgaW4gY29kZSwKLS8vICAgICAgIGVpdGhlciBpbiBURGVuc2VQcm90b2NvbCBpdHNlbGYsIG9yIGluIGNvZGUgdXNpbmcgaXQuCi0vLyAgICAgICAoRm9yIGV4YW1wbGUsIHVzaW5nIHRoZSB3cm9uZyBUeXBlU3BlYy4pCi0vLyAgICAgICBJbnZhbGlkIGRhdGEgc2hvdWxkIE5FVkVSIGNhdXNlIGFuIGFzc2VydGlvbiBmYWlsdXJlLAotLy8gICAgICAgbm8gbWF0dGVyIGhvdyBncm9zc2x5IGNvcnJ1cHRlZCwgbm9yIGhvdyBpbmdlbmlvdXNseSBjcmFmdGVkLgotI2lmZGVmIERFQlVHX1RERU5TRVBST1RPQ09MCi0jdW5kZWYgTkRFQlVHCi0jZWxzZQotI2RlZmluZSBOREVCVUcKLSNlbmRpZgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCi0jZWxzZQotI2RlZmluZSBVTkxJS0VMWSh2YWwpICh2YWwpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi1jb25zdCBpbnQgVERlbnNlUHJvdG9jb2w6OkZQX1BSRUZJWF9MRU4gPQotICBhcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OkZQX1BSRUZJWF9MRU47Ci0KLS8vIFRvcCBUeXBlU3BlYy4gIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgZW5jb2RlZC4KLSNkZWZpbmUgVFRTICAodHNfc3RhY2tfLmJhY2soKSkgIC8vIHR5cGUgPSBUeXBlU3BlYyoKLS8vIEluRGVYLiAgSW5kZXggaW50byBUVFMgb2YgdGhlIGN1cnJlbnQvbmV4dCBmaWVsZCB0byBlbmNvZGUuCi0jZGVmaW5lIElEWCAoaWR4X3N0YWNrXy5iYWNrKCkpICAvLyB0eXBlID0gaW50Ci0vLyBGaWVsZCBUeXBlU3BlYy4gIFR5cGVTcGVjIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBGVFMgKFRUUy0+dHN0cnVjdC5zcGVjc1tJRFhdKSAgLy8gdHlwZSA9IFR5cGVTcGVjKgotLy8gRmllbGQgTWVUYS4gIE1ldGFkYXRhIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBGTVQgKFRUUy0+dHN0cnVjdC5tZXRhc1tJRFhdKSAgLy8gdHlwZSA9IEZpZWxkTWV0YQotLy8gU3ViVHlwZSAxLzIuICBUeXBlU3BlYyBvZiB0aGUgZmlyc3Qvc2Vjb25kIHN1YnR5cGUgb2YgdGhpcyBjb250YWluZXIuCi0jZGVmaW5lIFNUMSAoVFRTLT50Y29udGFpbmVyLnN1YnR5cGUxKQotI2RlZmluZSBTVDIgKFRUUy0+dGNvbnRhaW5lci5zdWJ0eXBlMikKLQotCi0vKioKLSAqIENoZWNrcyB0aGF0IEBjIHR0eXBlIGlzIGluZGVlZCB0aGUgdHR5cGUgdGhhdCB3ZSBzaG91bGQgYmUgd3JpdGluZywKLSAqIGFjY29yZGluZyB0byBvdXIgdHlwZXNwZWMuICBBYm9ydHMgaWYgdGhlIHRlc3QgZmFpbHMgYW5kIGRlYnVnZ2luZyBpbiBvbi4KLSAqLwotaW5saW5lIHZvaWQgVERlbnNlUHJvdG9jb2w6OmNoZWNrVFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpIHsKLSAgYXNzZXJ0KCF0c19zdGFja18uZW1wdHkoKSk7Ci0gIGFzc2VydChUVFMtPnR0eXBlID09IHR0eXBlKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBzdXJlIHRoYXQgdGhlIFR5cGVTcGVjIHN0YWNrIGlzIGNvcnJlY3QgZm9yIHRoZSBuZXh0IG9iamVjdC4KLSAqIFNlZSB0b3Atb2YtZmlsZSBjb21tZW50cy4KLSAqLwotaW5saW5lIHZvaWQgVERlbnNlUHJvdG9jb2w6OnN0YXRlVHJhbnNpdGlvbigpIHsKLSAgVHlwZVNwZWMqIG9sZF90dHMgPSB0c19zdGFja18uYmFjaygpOwotICB0c19zdGFja18ucG9wX2JhY2soKTsKLQotICAvLyBJZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHRvcC1sZXZlbCB3cml0ZSwgd2Ugc2hvdWxkIGhhdmUganVzdCBwb3BwZWQKLSAgLy8gdGhlIFR5cGVTcGVjIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gIGlmICh0c19zdGFja18uZW1wdHkoKSkgewotICAgIGFzc2VydChvbGRfdHRzID0gdHlwZV9zcGVjXyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChUVFMtPnR0eXBlKSB7Ci0KLSAgICBjYXNlIFRfU1RSVUNUOgotICAgICAgYXNzZXJ0KG9sZF90dHMgPT0gRlRTKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xJU1Q6Ci0gICAgY2FzZSBUX1NFVDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IFNUMSk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKG9sZF90dHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTUFQOgotICAgICAgYXNzZXJ0KG9sZF90dHMgPT0gKG1rdl9zdGFja18uYmFjaygpID8gU1QxIDogU1QyKSk7Ci0gICAgICBta3Zfc3RhY2tfLmJhY2soKSA9ICFta3Zfc3RhY2tfLmJhY2soKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sobWt2X3N0YWNrXy5iYWNrKCkgPyBTVDEgOiBTVDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KCEiSW52YWxpZCBUVHlwZSBpbiBzdGF0ZVRyYW5zaXRpb24uIik7Ci0gICAgICBicmVhazsKLQotICB9Ci19Ci0KLQotLyoKLSAqIFZhcmlhYmxlLWxlbmd0aCBxdWFudGl0eSBmdW5jdGlvbnMuCi0gKi8KLQotaW5saW5lIHVpbnQzMl90IFREZW5zZVByb3RvY29sOjp2bHFSZWFkKHVpbnQ2NF90JiB2bHEpIHsKLSAgdWludDMyX3QgdXNlZCA9IDA7Ci0gIHVpbnQ2NF90IHZhbCA9IDA7Ci0gIHVpbnQ4X3QgYnVmWzEwXTsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCi0gIHVpbnQzMl90IGJ1Zl9zaXplID0gc2l6ZW9mKGJ1Zik7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkID0gdHJhbnNfLT5ib3Jyb3coYnVmLCAmYnVmX3NpemUpOwotCi0gIC8vIEZhc3QgcGF0aC4gIFRPRE8oZHJlaXNzKTogTWFrZSBpdCBmYXN0ZXIuCi0gIGlmIChib3Jyb3dlZCAhPSBOVUxMKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJvcnJvd2VkW3VzZWRdOwotICAgICAgdXNlZCsrOwotICAgICAgdmFsID0gKHZhbCA8PCA3KSB8IChieXRlICYgMHg3Zik7Ci0gICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKLSAgICAgICAgdmxxID0gdmFsOwotICAgICAgICB0cmFuc18tPmNvbnN1bWUodXNlZCk7Ci0gICAgICAgIHJldHVybiB1c2VkOwotICAgICAgfQotICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgaW52YWxpZCBkYXRhIHNvIHdlIGRvbid0IGNyYXNoLgotICAgICAgaWYgKFVOTElLRUxZKHVzZWQgPT0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFNsb3cgcGF0aC4KLSAgZWxzZSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZTsKLSAgICAgIHVzZWQgKz0gdHJhbnNfLT5yZWFkQWxsKCZieXRlLCAxKTsKLSAgICAgIHZhbCA9ICh2YWwgPDwgNykgfCAoYnl0ZSAmIDB4N2YpOwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIHZscSA9IHZhbDsKLSAgICAgICAgcmV0dXJuIHVzZWQ7Ci0gICAgICB9Ci0gICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCi0gICAgICBpZiAoVU5MSUtFTFkodXNlZCA+PSBzaXplb2YoYnVmKSkpIHsKLSAgICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6dmxxV3JpdGUodWludDY0X3QgdmxxKSB7Ci0gIHVpbnQ4X3QgYnVmWzEwXTsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCi0gIGludDMyX3QgcG9zID0gc2l6ZW9mKGJ1ZikgLSAxOwotCi0gIC8vIFdyaXRlIHRoZSB0aGluZyBmcm9tIGJhY2sgdG8gZnJvbnQuCi0gIGJ1Zltwb3NdID0gdmxxICYgMHg3ZjsKLSAgdmxxID4+PSA3OwotICBwb3MtLTsKLQotICB3aGlsZSAodmxxID4gMCkgewotICAgIGFzc2VydChwb3MgPj0gMCk7Ci0gICAgYnVmW3Bvc10gPSAodmxxIHwgMHg4MCk7Ci0gICAgdmxxID4+PSA3OwotICAgIHBvcy0tOwotICB9Ci0KLSAgLy8gQmFjayB1cCBvbmUgc3RlcCBiZWZvcmUgd3JpdGluZy4KLSAgcG9zKys7Ci0KLSAgdHJhbnNfLT53cml0ZShidWYrcG9zLCBzaXplb2YoYnVmKSAtIHBvcyk7Ci0gIHJldHVybiBzaXplb2YoYnVmKSAtIHBvczsKLX0KLQotCi0KLS8qCi0gKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAqLwotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2wgZG9lc24ndCB3b3JrIHdpdGggbWVzc2FnZXMgKHlldCkuIik7Ci0KLSAgaW50MzJfdCB2ZXJzaW9uID0gKFZFUlNJT05fMikgfCAoKGludDMyX3QpbWVzc2FnZVR5cGUpOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHN1YldyaXRlSTMyKHZlcnNpb24pOwotICB3c2l6ZSArPSBzdWJXcml0ZVN0cmluZyhuYW1lKTsKLSAgd3NpemUgKz0gc3ViV3JpdGVJMzIoc2VxaWQpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICAvLyBUaGUgVHlwZVNwZWMgc3RhY2sgc2hvdWxkIGJlIGVtcHR5IGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCByZWFkL3dyaXRlLgotICAvLyBJZiBpdCBpcywgd2UgcHVzaCB0aGUgVHlwZVNwZWMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAgaWYgKHRzX3N0YWNrXy5lbXB0eSgpKSB7Ci0gICAgYXNzZXJ0KHN0YW5kYWxvbmVfKTsKLQotICAgIGlmICh0eXBlX3NwZWNfID09IE5VTEwpIHsKLSAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sOiBObyB0eXBlIHNwZWNpZmllZC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KHR5cGVfc3BlY18tPnR0eXBlID09IFRfU1RSVUNUKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sodHlwZV9zcGVjXyk7Ci0gICAgICAvLyBXcml0ZSBvdXQgYSBwcmVmaXggb2YgdGhlIHN0cnVjdHVyZSBmaW5nZXJwcmludC4KLSAgICAgIHRyYW5zXy0+d3JpdGUodHlwZV9zcGVjXy0+ZnBfcHJlZml4LCBGUF9QUkVGSVhfTEVOKTsKLSAgICAgIHhmZXIgKz0gRlBfUFJFRklYX0xFTjsKLSAgICB9Ci0gIH0KLQotICAvLyBXZSBuZWVkIGEgbmV3IGZpZWxkIGluZGV4IGZvciB0aGlzIHN0cnVjdHVyZS4KLSAgaWR4X3N0YWNrXy5wdXNoX2JhY2soMCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIGlkeF9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICAvLyBTa2lwIG92ZXIgb3B0aW9uYWwgZmllbGRzLgotICB3aGlsZSAoRk1ULnRhZyAhPSBmaWVsZElkKSB7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBPbGQgbWV0YSBoZXJlLgotICAgIGFzc2VydChGVFMtPnR0eXBlICE9IFRfU1RPUCk7Ci0gICAgYXNzZXJ0KEZNVC5pc19vcHRpb25hbCk7Ci0gICAgLy8gV3JpdGUgYSB6ZXJvIGJ5dGUgc28gdGhlIHJlYWRlciBjYW4gc2tpcCBpdC4KLSAgICB4ZmVyICs9IHN1YldyaXRlQm9vbChmYWxzZSk7Ci0gICAgLy8gQW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgZmllbGQuCi0gICAgSURYKys7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IGdpdmUgYSBiZXR0ZXIgZXhjZXB0aW9uLgotICBhc3NlcnQoRlRTLT50dHlwZSA9PSBmaWVsZFR5cGUpOwotCi0gIGlmIChGTVQuaXNfb3B0aW9uYWwpIHsKLSAgICBzdWJXcml0ZUJvb2wodHJ1ZSk7Ci0gICAgeGZlciArPSAxOwotICB9Ci0KLSAgLy8gd3JpdGVGaWVsZFN0b3Agc2hhcmVzIGFsbCBsb3Qgb2YgbG9naWMgdXAgdG8gdGhpcyBwb2ludC4KLSAgLy8gSW5zdGVhZCBvZiByZXBsaWNhdGluZyBpdCBhbGwsIHdlIGp1c3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoYXQgb25lCi0gIC8vIGFuZCB1c2UgYSBncm9zcyBzcGVjaWFsIGNhc2UgaGVyZS4KLSAgaWYgKFVOTElLRUxZKEZUUy0+dHR5cGUgIT0gVF9TVE9QKSkgewotICAgIC8vIEZvciBub3JtYWwgZmllbGRzLCBwdXNoIHRoZSBUeXBlU3BlYyB0aGF0IHdlJ3JlIGFib3V0IHRvIHVzZS4KLSAgICB0c19zdGFja18ucHVzaF9iYWNrKEZUUyk7Ci0gIH0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgewotICAvLyBKdXN0IG1vdmUgb24gdG8gdGhlIG5leHQgZmllbGQuCi0gIElEWCsrOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4gVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbigiIiwgVF9TVE9QLCAwKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9NQVApOwotCi0gIGFzc2VydChrZXlUeXBlID09IFNUMS0+dHR5cGUpOwotICBhc3NlcnQodmFsVHlwZSA9PSBTVDItPnR0eXBlKTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIG1rdl9zdGFja18ucHVzaF9iYWNrKHRydWUpOwotCi0gIHJldHVybiBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICAvLyBQb3Agb2ZmIHRoZSB2YWx1ZSB0eXBlLCBhcyB3ZWxsIGFzIG91ciBlbnRyeSBpbiB0aGUgbWFwIGtleS92YWx1ZSBzdGFjay4KLSAgLy8gc3RhdGVUcmFuc2l0aW9uIHRha2VzIGNhcmUgb2YgcG9wcGluZyBvZmYgb3VyIFR5cGVTcGVjLgotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgbWt2X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9MSVNUKTsKLQotICBhc3NlcnQoZWxlbVR5cGUgPT0gU1QxLT50dHlwZSk7Ci0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgcmV0dXJuIHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgewotICAvLyBQb3Agb2ZmIHRoZSBlbGVtZW50IHR5cGUuICBzdGF0ZVRyYW5zaXRpb24gdGFrZXMgY2FyZSBvZiBwb3BwaW5nIG9mZiBvdXJzLgotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX1NFVCk7Ci0KLSAgYXNzZXJ0KGVsZW1UeXBlID09IFNUMS0+dHR5cGUpOwotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIHJldHVybiBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgewotICAvLyBQb3Agb2ZmIHRoZSBlbGVtZW50IHR5cGUuICBzdGF0ZVRyYW5zaXRpb24gdGFrZXMgY2FyZSBvZiBwb3BwaW5nIG9mZiBvdXJzLgotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgY2hlY2tUVHlwZShUX0JPT0wpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCb29sKHZhbHVlKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICBjaGVja1RUeXBlKFRfQllURSk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZUJ5dGUoYnl0ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICBjaGVja1RUeXBlKFRfSTE2KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiB2bHFXcml0ZShpMTYpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgY2hlY2tUVHlwZShUX0kzMik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gdmxxV3JpdGUoaTMyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gIGNoZWNrVFR5cGUoVF9JNjQpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHZscVdyaXRlKGk2NCk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIGNoZWNrVFR5cGUoVF9ET1VCTEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVEb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgY2hlY2tUVHlwZShUX1NUUklORyk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gc3ViV3JpdGVTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjp3cml0ZVN0cmluZyhzdHIpOwotfQotCi1pbmxpbmUgdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YldyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIHJldHVybiB2bHFXcml0ZShpMzIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6c3ViV3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICB1aW50MzJfdCBzaXplID0gc3RyLnNpemUoKTsKLSAgdWludDMyX3QgeGZlciA9IHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotICBpZiAoc2l6ZSA+IDApIHsKLSAgICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzaXplKTsKLSAgfQotICByZXR1cm4geGZlciArIHNpemU7Ci19Ci0KLQotCi0vKgotICogUmVhZGluZyBmdW5jdGlvbnMKLSAqCi0gKiBUaGVzZSBoYXZlIGEgbG90IG9mIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSB3cml0aW5nIGZ1bmN0aW9ucywgc28gaWYKLSAqIHNvbWV0aGluZyBpcyBjb25mdXNpbmcsIGxvb2sgZm9yIGNvbW1lbnRzIGluIHRoZSBjb3JyZXNwb25kaW5nIHdyaXRlci4KLSAqLwotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbCBkb2Vzbid0IHdvcmsgd2l0aCBtZXNzYWdlcyAoeWV0KS4iKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzejsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHN6KTsKLQotICBpZiAoc3ogPCAwKSB7Ci0gICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIKLSAgICBpbnQzMl90IHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKLSAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzIpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaWRlbnRpZmllciIpOwotICAgIH0KLSAgICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKHN6ICYgMHgwMDAwMDBmZik7Ci0gICAgeGZlciArPSBzdWJSZWFkU3RyaW5nKG5hbWUpOwotICAgIHhmZXIgKz0gc3ViUmVhZEkzMihzZXFpZCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJObyB2ZXJzaW9uIGlkZW50aWZpZXIuLi4gb2xkIHByb3RvY29sIGNsaWVudCBpbiBzdHJpY3QgbW9kZT8iKTsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdHJpbmcmIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIGlmICh0c19zdGFja18uZW1wdHkoKSkgewotICAgIGFzc2VydChzdGFuZGFsb25lXyk7Ci0KLSAgICBpZiAodHlwZV9zcGVjXyA9PSBOVUxMKSB7Ci0gICAgICByZXNldFN0YXRlKCk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbDogTm8gdHlwZSBzcGVjaWZpZWQuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFzc2VydCh0eXBlX3NwZWNfLT50dHlwZSA9PSBUX1NUUlVDVCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKHR5cGVfc3BlY18pOwotCi0gICAgICAvLyBDaGVjayB0aGUgZmluZ2VycHJpbnQgcHJlZml4LgotICAgICAgdWludDhfdCBidWZbRlBfUFJFRklYX0xFTl07Ci0gICAgICB4ZmVyICs9IHRyYW5zXy0+cmVhZChidWYsIEZQX1BSRUZJWF9MRU4pOwotICAgICAgaWYgKHN0ZDo6bWVtY21wKGJ1ZiwgdHlwZV9zcGVjXy0+ZnBfcHJlZml4LCBGUF9QUkVGSVhfTEVOKSAhPSAwKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgIkZpbmdlcnByaW50IGluIGRhdGEgZG9lcyBub3QgbWF0Y2ggdHlwZV9zcGVjLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFdlIG5lZWQgYSBuZXcgZmllbGQgaW5kZXggZm9yIHRoaXMgc3RydWN0dXJlLgotICBpZHhfc3RhY2tfLnB1c2hfYmFjaygwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgewotICBpZHhfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIEZvciBvcHRpb25hbCBmaWVsZHMsIGNoZWNrIHRvIHNlZSBpZiB0aGV5IGFyZSB0aGVyZS4KLSAgd2hpbGUgKEZNVC5pc19vcHRpb25hbCkgewotICAgIGJvb2wgaXNfcHJlc2VudDsKLSAgICB4ZmVyICs9IHN1YlJlYWRCb29sKGlzX3ByZXNlbnQpOwotICAgIGlmIChpc19wcmVzZW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgSURYKys7Ci0gIH0KLQotICAvLyBPbmNlIHdlIGhpdCBhIG1hbmRhdG9yeSBmaWVsZCwgb3IgYW4gb3B0aW9uYWwgZmllbGQgdGhhdCBpcyBwcmVzZW50LAotICAvLyB3ZSBrbm93IHRoYXQgRk1UIGFuZCBGVFMgcG9pbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGZpZWxkLgotCi0gIGZpZWxkSWQgICA9IEZNVC50YWc7Ci0gIGZpZWxkVHlwZSA9IEZUUy0+dHR5cGU7Ci0KLSAgLy8gTm9ybWFsbHksIHdlIHB1c2ggdGhlIFR5cGVTcGVjIHRoYXQgd2UgYXJlIGFib3V0IHRvIHJlYWQsCi0gIC8vIGJ1dCBubyByZWFkaW5nIGlzIGRvbmUgZm9yIFRfU1RPUC4KLSAgaWYgKEZUUy0+dHR5cGUgIT0gVF9TVE9QKSB7Ci0gICAgdHNfc3RhY2tfLnB1c2hfYmFjayhGVFMpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgewotICBJRFgrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTUFQKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGtleVR5cGUgPSBTVDEtPnR0eXBlOwotICB2YWxUeXBlID0gU1QyLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIG1rdl9zdGFja18ucHVzaF9iYWNrKHRydWUpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIG1rdl9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTElTVCk7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLSAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKLQotICBlbGVtVHlwZSA9IFNUMS0+dHR5cGU7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfU0VUKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGVsZW1UeXBlID0gU1QxLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU2V0RW5kKCkgewotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgY2hlY2tUVHlwZShUX0JPT0wpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZEJvb2wodmFsdWUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CWVRFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCeXRlKGJ5dGUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgY2hlY2tUVHlwZShUX0kxNik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDE2X01BWCB8fCB2YWwgPCBJTlQxNl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkxNiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTE2ID0gKGludDE2X3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICBjaGVja1RUeXBlKFRfSTMyKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMzJfTUFYIHx8IHZhbCA8IElOVDMyX01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMzIgPSAoaW50MzJfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIGNoZWNrVFR5cGUoVF9JNjQpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQ2NF9NQVggfHwgdmFsIDwgSU5UNjRfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGk2NCA9IChpbnQ2NF90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBjaGVja1RUeXBlKFRfRE9VQkxFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWREb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICBjaGVja1RUeXBlKFRfU1RSSU5HKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBzdWJSZWFkU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjpyZWFkU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJSZWFkSTMyKGludDMyX3QmIGkzMikgewotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTMyID0gKGludDMyX3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJSZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3QgeGZlcjsKLSAgaW50MzJfdCBzaXplOwotICB4ZmVyID0gc3ViUmVhZEkzMihzaXplKTsKLSAgcmV0dXJuIHhmZXIgKyByZWFkU3RyaW5nQm9keShzdHIsIHNpemUpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4ZWQ4OS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERU5TRVBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFTlNFUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVEJpbmFyeVByb3RvY29sLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiAhISFXQVJOSU5HISEhCi0gKiBUaGlzIGNsYXNzIGlzIHN0aWxsIGhpZ2hseSBleHBlcmltZW50YWwuICBJbmNvbXBhdGlibGUgY2hhbmdlcwotICogV0lMTCBiZSBtYWRlIHRvIGl0IHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBJVCBZRVQgdW5sZXNzCi0gKiB5b3UgYXJlIGNvb3JkaW5hdGluZyB5b3VyIHRlc3Rpbmcgd2l0aCB0aGUgYXV0aG9yLgotICoKLSAqIFRoZSBkZW5zZSBwcm90b2NvbCBpcyBkZXNpZ25lZCB0byB1c2UgYXMgbGl0dGxlIHNwYWNlIGFzIHBvc3NpYmxlLgotICoKLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZGVuc2UgcHJvdG9jb2wgaW5zdGFuY2VzLiAgU3RhbmRhbG9uZSBpbnN0YW5jZXMKLSAqIGFyZSBub3QgdXNlZCBmb3IgUlBDIGFuZCBqdXN0IGVuY29kZWQgYW5kIGRlY29kZSBzdHJ1Y3R1cmVzIG9mCi0gKiBhIHByZWRldGVybWluZWQgdHlwZS4gIE5vbi1zdGFuZGFsb25lIGluc3RhbmNlcyBhcmUgdXNlZCBmb3IgUlBDLgotICogQ3VycmVudGx5LCBvbmx5IHN0YW5kYWxvbmUgaW5zdGFuY2VzIGV4aXN0LgotICoKLSAqIFRvIHVzZSBhIHN0YW5kYWxvbmUgZGVuc2UgcHJvdG9jb2wgb2JqZWN0LCB5b3UgbXVzdCBzZXQgdGhlIHR5cGVfc3BlYwotICogcHJvcGVydHkgKGVpdGhlciBpbiB0aGUgY29uc3RydWN0b3IsIG9yIHdpdGggc2V0VHlwZVNwZWMpIHRvIHRoZSBsb2NhbAotICogcmVmbGVjdGlvbiBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlcyB5b3Ugd2lsbCB3cml0ZSB0byAob3IgcmVhZCBmcm9tKSB0aGUKLSAqIHByb3RvY29sIGluc3RhbmNlLgotICoKLSAqIEJFU1QgUFJBQ1RJQ0VTOgotICogLSBOZXZlciB1c2Ugb3B0aW9uYWwgZm9yIHByaW1pdGl2ZXMgb3IgY29udGFpbmVycy4KLSAqIC0gT25seSB1c2Ugb3B0aW9uYWwgZm9yIHN0cnVjdHVyZXMgaWYgdGhleSBhcmUgdmVyeSBiaWcgYW5kIHZlcnkgcmFyZWx5IHNldC4KLSAqIC0gQWxsIGludGVnZXJzIGFyZSB2YXJpYWJsZS1sZW5ndGgsIHNvIHlvdSBjYW4gdXNlIGk2NCB3aXRob3V0IGJsb2F0aW5nLgotICogLSBORVZFUiBFVkVSIGNoYW5nZSB0aGUgc3RydWN0IGRlZmluaXRpb25zIElOIEFOWSBXQVkgd2l0aG91dCBlaXRoZXIKLSAqICAgY2hhbmdpbmcgeW91ciBjYWNoZSBrZXlzIG9yIHRhbGtpbmcgdG8gZHJlaXNzLgotICoKLSAqIFRPRE8oZHJlaXNzKTogTmV3IGNsYXNzIHdyaXRlIHdpdGggb2xkIG1ldGEuCi0gKgotICogV2Ugb3ZlcnJpZGUgYWxsIG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMuCi0gKiBXZSBpbmhlcml0IHNvIHRoYXQgd2UgY2FuIGNhbiBleHBsaWNpdGx5IGNhbGwgVEJQcydzIHByaW1pdGl2ZS13cml0aW5nCi0gKiBtZXRob2RzIHdpdGhpbiBvdXIgdmVyc2lvbnMuCi0gKgotICovCi1jbGFzcyBURGVuc2VQcm90b2NvbAotICA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0gIC8vIFZFUlNJT05fMSAoMHg4MDAxMDAwMCkgIGlzIHRha2VuIGJ5IFRCaW5hcnlQcm90b2NvbC4KLSAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl8yID0gMHg4MDAyMDAwMDsKLQotIHB1YmxpYzoKLSAgdHlwZWRlZiBhcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjIFR5cGVTcGVjOwotICBzdGF0aWMgY29uc3QgaW50IEZQX1BSRUZJWF9MRU47Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0cmFuICAgICAgIFRoZSB0cmFuc3BvcnQgdG8gdXNlLgotICAgKiBAcGFyYW0gdHlwZV9zcGVjICBUaGUgVHlwZVNwZWMgb2YgdGhlIHN0cnVjdHVyZXMgdXNpbmcgdGhpcyBwcm90b2NvbC4KLSAgICovCi0gIFREZW5zZVByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zLAotICAgICAgICAgICAgICAgICBUeXBlU3BlYyogdHlwZV9zcGVjID0gTlVMTCkgOgotICAgIFRWaXJ0dWFsUHJvdG9jb2w8VERlbnNlUHJvdG9jb2wsIFRCaW5hcnlQcm90b2NvbD4odHJhbnMpLAotICAgIHR5cGVfc3BlY18odHlwZV9zcGVjKSwKLSAgICBzdGFuZGFsb25lXyh0cnVlKQotICB7fQotCi0gIHZvaWQgc2V0VHlwZVNwZWMoVHlwZVNwZWMqIHR5cGVfc3BlYykgewotICAgIHR5cGVfc3BlY18gPSB0eXBlX3NwZWM7Ci0gIH0KLSAgVHlwZVNwZWMqIGdldFR5cGVTcGVjKCkgewotICAgIHJldHVybiB0eXBlX3NwZWNfOwotICB9Ci0KLQotICAvKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAgICovCi0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLQotICAvKgotICAgKiBIZWxwZXIgd3JpdGluZyBmdW5jdGlvbnMgKGRvbid0IGRvIHN0YXRlIHRyYW5zaXRpb25zKS4KLSAgICovCi0gIGlubGluZSB1aW50MzJfdCBzdWJXcml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHN1YldyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHN1YldyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCb29sKHZhbHVlKTsKLSAgfQotCi0KLSAgLyoKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTWFwRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkU2V0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOwotICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+Ci0gIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VERlbnNlUHJvdG9jb2wsIFRCaW5hcnlQcm90b2NvbD46OnJlYWRCb29sOwotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOwotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qCi0gICAqIEhlbHBlciByZWFkaW5nIGZ1bmN0aW9ucyAoZG9uJ3QgZG8gc3RhdGUgdHJhbnNpdGlvbnMpLgotICAgKi8KLSAgaW5saW5lIHVpbnQzMl90IHN1YlJlYWRJMzIoaW50MzJfdCYgaTMyKTsKLQotICBpbmxpbmUgdWludDMyX3Qgc3ViUmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCBzdWJSZWFkQm9vbChib29sJiB2YWx1ZSkgewotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCb29sKHZhbHVlKTsKLSAgfQotCi0KLSBwcml2YXRlOgotCi0gIC8vIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucywgZG9jdW1lbnRlZCBpbiB0aGUgLmNwcC4KLSAgaW5saW5lIHZvaWQgY2hlY2tUVHlwZShjb25zdCBUVHlwZSB0dHlwZSk7Ci0gIGlubGluZSB2b2lkIHN0YXRlVHJhbnNpdGlvbigpOwotCi0gIC8vIFJlYWQgYW5kIHdyaXRlIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2Vycy4KLSAgLy8gVXNlcyB0aGUgc2FtZSB0ZWNobmlxdWUgYXMgdGhlIE1JREkgZmlsZSBmb3JtYXQuCi0gIGlubGluZSB1aW50MzJfdCB2bHFSZWFkKHVpbnQ2NF90JiB2bHEpOwotICBpbmxpbmUgdWludDMyX3QgdmxxV3JpdGUodWludDY0X3QgdmxxKTsKLQotICAvLyBDYWxsZWQgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB0byBtYWtlIHRoZSBvYmplY3QgcmV1c2FibGUuCi0gIHZvaWQgcmVzZXRTdGF0ZSgpIHsKLSAgICB0c19zdGFja18uY2xlYXIoKTsKLSAgICBpZHhfc3RhY2tfLmNsZWFyKCk7Ci0gICAgbWt2X3N0YWNrXy5jbGVhcigpOwotICB9Ci0KLSAgLy8gVHlwZVNwZWMgb2YgdGhlIHRvcC1sZXZlbCBzdHJ1Y3R1cmUgdG8gd3JpdGUsCi0gIC8vIGZvciBzdGFuZGFsb25lIHByb3RvY29sIG9iamVjdHMuCi0gIFR5cGVTcGVjKiB0eXBlX3NwZWNfOwotCi0gIHN0ZDo6dmVjdG9yPFR5cGVTcGVjKj4gdHNfc3RhY2tfOyAgIC8vIFR5cGVTcGVjIHN0YWNrLgotICBzdGQ6OnZlY3RvcjxpbnQ+ICAgICAgIGlkeF9zdGFja187ICAvLyBJbkRlWCBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8Ym9vbD4gICAgICBta3Zfc3RhY2tfOyAgLy8gTWFwIEtleS9WbHVlIHN0YWNrLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnVlID0ga2V5LCBGYWxzZSA9IHZhbHVlLgotCi0gIC8vIFRydWUgaWZmIHRoaXMgaXMgYSBzdGFuZGFsb25lIGluc3RhbmNlIChubyBSUEMpLgotICBib29sIHN0YW5kYWxvbmVfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERU5TRVBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDM4ZGY0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUSlNPTlByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlICJUQmFzZTY0VXRpbHMuaCIKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotCi11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0KLS8vIFN0YXRpYyBkYXRhCi0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0U3RhcnQgPSAneyc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk9iamVjdEVuZCA9ICd9JzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQXJyYXlTdGFydCA9ICdbJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQXJyYXlFbmQgPSAnXSc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk5ld2xpbmUgPSAnXG4nOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05QYWlyU2VwYXJhdG9yID0gJzonOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05FbGVtU2VwYXJhdG9yID0gJywnOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05CYWNrc2xhc2ggPSAnXFwnOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIic7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlplcm9DaGFyID0gJzAnOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05Fc2NhcGVDaGFyID0gJ3UnOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0pTT05Fc2NhcGVQcmVmaXgoIlxcdTAwIik7Ci0KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrVGhyaWZ0VmVyc2lvbjEgPSAxOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdE5hbigiTmFOIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdEluZmluaXR5KCJJbmZpbml0eSIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KCItSW5maW5pdHkiKTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUJvb2woInRmIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lQnl0ZSgiaTgiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJMTYoImkxNiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUkzMigiaTMyIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTY0KCJpNjQiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVEb3VibGUoImRibCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVN0cnVjdCgicmVjIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU3RyaW5nKCJzdHIiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVNYXAoIm1hcCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUxpc3QoImxzdCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVNldCgic2V0Iik7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VHlwZU5hbWVGb3JUeXBlSUQoVFR5cGUgdHlwZUlEKSB7Ci0gIHN3aXRjaCAodHlwZUlEKSB7Ci0gIGNhc2UgVF9CT09MOgotICAgIHJldHVybiBrVHlwZU5hbWVCb29sOwotICBjYXNlIFRfQllURToKLSAgICByZXR1cm4ga1R5cGVOYW1lQnl0ZTsKLSAgY2FzZSBUX0kxNjoKLSAgICByZXR1cm4ga1R5cGVOYW1lSTE2OwotICBjYXNlIFRfSTMyOgotICAgIHJldHVybiBrVHlwZU5hbWVJMzI7Ci0gIGNhc2UgVF9JNjQ6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUk2NDsKLSAgY2FzZSBUX0RPVUJMRToKLSAgICByZXR1cm4ga1R5cGVOYW1lRG91YmxlOwotICBjYXNlIFRfU1RSSU5HOgotICAgIHJldHVybiBrVHlwZU5hbWVTdHJpbmc7Ci0gIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZVN0cnVjdDsKLSAgY2FzZSBUX01BUDoKLSAgICByZXR1cm4ga1R5cGVOYW1lTWFwOwotICBjYXNlIFRfU0VUOgotICAgIHJldHVybiBrVHlwZU5hbWVTZXQ7Ci0gIGNhc2UgVF9MSVNUOgotICAgIHJldHVybiBrVHlwZU5hbWVMaXN0OwotICBkZWZhdWx0OgotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7Ci0gIH0KLX0KLQotc3RhdGljIFRUeXBlIGdldFR5cGVJREZvclR5cGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gIFRUeXBlIHJlc3VsdCA9IFRfU1RPUDsgLy8gU2VudGluZWwgdmFsdWUKLSAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxKSB7Ci0gICAgc3dpdGNoIChuYW1lWzBdKSB7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICByZXN1bHQgPSBUX0RPVUJMRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgc3dpdGNoIChuYW1lWzFdKSB7Ci0gICAgICBjYXNlICc4JzoKLSAgICAgICAgcmVzdWx0ID0gVF9CWVRFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzEnOgotICAgICAgICByZXN1bHQgPSBUX0kxNjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICczJzoKLSAgICAgICAgcmVzdWx0ID0gVF9JMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnNic6Ci0gICAgICAgIHJlc3VsdCA9IFRfSTY0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2wnOgotICAgICAgcmVzdWx0ID0gVF9MSVNUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICByZXN1bHQgPSBUX01BUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgcmVzdWx0ID0gVF9TVFJVQ1Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICAgIGlmIChuYW1lWzFdID09ICd0JykgewotICAgICAgICByZXN1bHQgPSBUX1NUUklORzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7Ci0gICAgICAgIHJlc3VsdCA9IFRfU0VUOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndCc6Ci0gICAgICByZXN1bHQgPSBUX0JPT0w7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHJlc3VsdCA9PSBUX1NUT1ApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLy8gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGhhbmRsaW5nIGZvciB0aGUgZmlyc3QgMHgzMCBjaGFyYWN0ZXJzCi0vLyAgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgotLy8gIDEgOiBqdXN0IG91dHB1dCBpbmRleAotLy8gPG90aGVyPiA6IGVzY2FwZSB1c2luZyAiXDxvdGhlcj4iIG5vdGF0aW9uCi1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkNoYXJUYWJsZVsweDMwXSA9IHsKLS8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsJ2InLCd0JywnbicsICAwLCdmJywncicsICAwLCAgMCwgLy8gMAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8vIDEKLSAgICAxLCAgMSwnIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAvLyAyCi19OwotCi0KLS8vIFRoaXMgc3RyaW5nJ3MgY2hhcmFjdGVycyBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVsZW1lbnRzIGluIGtFc2NhcGVDaGFyVmFscy4KLS8vIEkgZG9uJ3QgaGF2ZSAnLycgb24gdGhpcyBsaXN0IGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgb24gd3d3Lmpzb24ub3JnIC0tCi0vLyBpdCBpcyBub3QgaW4gdGhlIFJGQwotY29uc3Qgc3RhdGljIHN0ZDo6c3RyaW5nIGtFc2NhcGVDaGFycygiXCJcXGJmbnJ0Iik7Ci0KLS8vIFRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgotLy8ga0VzY2FwZUNoYXJzCi1jb25zdCBzdGF0aWMgdWludDhfdCBrRXNjYXBlQ2hhclZhbHNbN10gPSB7Ci0gICciJywgJ1xcJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKLX07Ci0KLQotLy8gU3RhdGljIGhlbHBlciBmdW5jdGlvbnMKLQotLy8gUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFuc3BvcnQgdHJhbnMgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIHRoZQotLy8gZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgotLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgaXQgaXMgbm90Lgotc3RhdGljIHVpbnQzMl90IHJlYWRTeW50YXhDaGFyKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2gpIHsKLSAgdWludDhfdCBjaDIgPSByZWFkZXIucmVhZCgpOwotICBpZiAoY2gyICE9IGNoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gsIDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnOyBnb3QgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gyLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcJy4iKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8gUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgaGV4IGNoYXJhY3RlciBjaC4KLS8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IFswLTlhLWZdLgotc3RhdGljIHVpbnQ4X3QgaGV4VmFsKHVpbnQ4X3QgY2gpIHsKLSAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7Ci0gICAgcmV0dXJuIGNoIC0gJzAnOwotICB9Ci0gIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7Ci0gICAgcmV0dXJuIGNoIC0gJ2EnICsgMTA7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgXCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaCwgMSkgKyAiXCcuIik7Ci0gIH0KLX0KLQotLy8gUmV0dXJuIHRoZSBoZXggY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgaW50ZWdlciB2YWwuIFRoZSB2YWx1ZSBpcyBtYXNrZWQKLS8vIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCByYW5nZS4KLXN0YXRpYyB1aW50OF90IGhleENoYXIodWludDhfdCB2YWwpIHsKLSAgdmFsICY9IDB4MEY7Ci0gIGlmICh2YWwgPCAxMCkgewotICAgIHJldHVybiB2YWwgKyAnMCc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuIHZhbCAtIDEwICsgJ2EnOwotICB9Ci19Ci0KLS8vIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCi1zdGF0aWMgYm9vbCBpc0pTT05OdW1lcmljKHVpbnQ4X3QgY2gpIHsKLSAgc3dpdGNoIChjaCkgewotICBjYXNlICcrJzoKLSAgY2FzZSAnLSc6Ci0gIGNhc2UgJy4nOgotICBjYXNlICcwJzoKLSAgY2FzZSAnMSc6Ci0gIGNhc2UgJzInOgotICBjYXNlICczJzoKLSAgY2FzZSAnNCc6Ci0gIGNhc2UgJzUnOgotICBjYXNlICc2JzoKLSAgY2FzZSAnNyc6Ci0gIGNhc2UgJzgnOgotICBjYXNlICc5JzoKLSAgY2FzZSAnRSc6Ci0gIGNhc2UgJ2UnOgotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKioKLSAqIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSlNPTiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0Ci0gKiBpbXBsZW1lbnRhdGlvbnMKLSAqLwotY2xhc3MgVEpTT05Db250ZXh0IHsKLQotIHB1YmxpYzoKLQotICBUSlNPTkNvbnRleHQoKSB7fTsKLQotICB2aXJ0dWFsIH5USlNPTkNvbnRleHQoKSB7fTsKLQotICAvKioKLSAgICogV3JpdGUgY29udGV4dCBkYXRhIHRvIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCAmdHJhbnMpIHsKLSAgICAodm9pZCkgdHJhbnM7Ci0gICAgcmV0dXJuIDA7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgKHZvaWQpIHJlYWRlcjsKLSAgICByZXR1cm4gMDsKLSAgfTsKLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVycyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgc3RyaW5ncyBpbiB0aGlzIGNvbnRleHQuCi0gICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGZhbHNlLgotICAgKi8KLSAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX07Ci0KLS8vIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCi1jbGFzcyBKU09OUGFpckNvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKLQotcHVibGljOgotCi0gIEpTT05QYWlyQ29udGV4dCgpIDoKLSAgICBmaXJzdF8odHJ1ZSksCi0gICAgY29sb25fKHRydWUpIHsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7Ci0gICAgaWYgKGZpcnN0XykgewotICAgICAgZmlyc3RfID0gZmFsc2U7Ci0gICAgICBjb2xvbl8gPSB0cnVlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJhbnMud3JpdGUoY29sb25fID8gJmtKU09OUGFpclNlcGFyYXRvciA6ICZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOwotICAgICAgY29sb25fID0gIWNvbG9uXzsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyICZyZWFkZXIpIHsKLSAgICBpZiAoZmlyc3RfKSB7Ci0gICAgICBmaXJzdF8gPSBmYWxzZTsKLSAgICAgIGNvbG9uXyA9IHRydWU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB1aW50OF90IGNoID0gKGNvbG9uXyA/IGtKU09OUGFpclNlcGFyYXRvciA6IGtKU09ORWxlbVNlcGFyYXRvcik7Ci0gICAgICBjb2xvbl8gPSAhY29sb25fOwotICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwgY2gpOwotICAgIH0KLSAgfQotCi0gIC8vIE51bWJlcnMgbXVzdCBiZSB0dXJuZWQgaW50byBzdHJpbmdzIGlmIHRoZXkgYXJlIHRoZSBrZXkgcGFydCBvZiBhIHBhaXIKLSAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsKLSAgICByZXR1cm4gY29sb25fOwotICB9Ci0KLSAgcHJpdmF0ZToKLQotICAgIGJvb2wgZmlyc3RfOwotICAgIGJvb2wgY29sb25fOwotfTsKLQotLy8gQ29udGV4dCBjbGFzcyBmb3IgbGlzdHMKLWNsYXNzIEpTT05MaXN0Q29udGV4dCA6IHB1YmxpYyBUSlNPTkNvbnRleHQgewotCi1wdWJsaWM6Ci0KLSAgSlNPTkxpc3RDb250ZXh0KCkgOgotICAgIGZpcnN0Xyh0cnVlKSB7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0ICZ0cmFucykgewotICAgIGlmIChmaXJzdF8pIHsKLSAgICAgIGZpcnN0XyA9IGZhbHNlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJhbnMud3JpdGUoJmtKU09ORWxlbVNlcGFyYXRvciwgMSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgaWYgKGZpcnN0XykgewotICAgICAgZmlyc3RfID0gZmFsc2U7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBrSlNPTkVsZW1TZXBhcmF0b3IpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGU6Ci0gICAgYm9vbCBmaXJzdF87Ci19OwotCi0KLVRKU09OUHJvdG9jb2w6OlRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6Ci0gIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4ocHRyYW5zKSwKLSAgdHJhbnNfKHB0cmFucy5nZXQoKSksCi0gIGNvbnRleHRfKG5ldyBUSlNPTkNvbnRleHQoKSksCi0gIHJlYWRlcl8oKnB0cmFucykgewotfQotCi1USlNPTlByb3RvY29sOjp+VEpTT05Qcm90b2NvbCgpIHt9Ci0KLXZvaWQgVEpTT05Qcm90b2NvbDo6cHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7Ci0gIGNvbnRleHRzXy5wdXNoKGNvbnRleHRfKTsKLSAgY29udGV4dF8gPSBjOwotfQotCi12b2lkIFRKU09OUHJvdG9jb2w6OnBvcENvbnRleHQoKSB7Ci0gIGNvbnRleHRfID0gY29udGV4dHNfLnRvcCgpOwotICBjb250ZXh0c18ucG9wKCk7Ci19Ci0KLS8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgYSBKU09OIGVzY2FwZSBzZXF1ZW5jZSAoIlx1MDB4eCIpCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgY2gpIHsKLSAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCAqKWtKU09ORXNjYXBlUHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgICAgICAga0pTT05Fc2NhcGVQcmVmaXgubGVuZ3RoKCkpOwotICB1aW50OF90IG91dENoID0gaGV4Q2hhcihjaCA+PiA0KTsKLSAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwotICBvdXRDaCA9IGhleENoYXIoY2gpOwotICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7Ci0gIHJldHVybiA2OwotfQotCi0vLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIHBhcnQgb2YgYSBKU09OIHN0cmluZywgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpIHsKLSAgaWYgKGNoID49IDB4MzApIHsKLSAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsgLy8gT25seSBzcGVjaWFsIGNoYXJhY3RlciA+PSAweDMwIGlzICdcJwotICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwotICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIHVpbnQ4X3Qgb3V0Q2ggPSBrSlNPTkNoYXJUYWJsZVtjaF07Ci0gICAgLy8gQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKU09OIGVzY2FwZWQKLSAgICBpZiAob3V0Q2ggPT0gMSkgewotICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKG91dENoID4gMSkgewotICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwotICAgICAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcmV0dXJuIHdyaXRlSlNPTkVzY2FwZUNoYXIoY2gpOwotICAgIH0KLSAgfQotfQotCi0vLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgc3RyIGFzIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nCi0vLyBjaGFyYWN0ZXJzIGFzIGFwcHJvcHJpYXRlLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcwotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdGVyKHN0ci5iZWdpbigpKTsKLSAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGVuZChzdHIuZW5kKCkpOwotICB3aGlsZSAoaXRlciAhPSBlbmQpIHsKLSAgICByZXN1bHQgKz0gd3JpdGVKU09OQ2hhcigqaXRlcisrKTsKLSAgfQotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBhcyBKU09OIHN0cmluZywgYmFzZTY0LWVuY29kaW5nCi0vLyB0aGUgc3RyaW5nJ3MgY29udGVudHMsIGFuZCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcwotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHVpbnQ4X3QgYls0XTsKLSAgY29uc3QgdWludDhfdCAqYnl0ZXMgPSAoY29uc3QgdWludDhfdCAqKXN0ci5jX3N0cigpOwotICB1aW50MzJfdCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIHdoaWxlIChsZW4gPj0gMykgewotICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQotICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIDMsIGIpOwotICAgIHRyYW5zXy0+d3JpdGUoYiwgNCk7Ci0gICAgcmVzdWx0ICs9IDQ7Ci0gICAgYnl0ZXMgKz0gMzsKLSAgICBsZW4gLT0zOwotICB9Ci0gIGlmIChsZW4pIHsgLy8gSGFuZGxlIHJlbWFpbmRlcgotICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIGxlbiwgYik7Ci0gICAgdHJhbnNfLT53cml0ZShiLCBsZW4gKyAxKTsKLSAgICByZXN1bHQgKz0gbGVuICsgMTsKLSAgfQotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpTT04gbnVtYmVyLCBvciBhIHN0cmluZwotLy8gaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7Ci0gIGJvb2wgZXNjYXBlTnVtID0gY29udGV4dF8tPmVzY2FwZU51bSgpOwotICBpZiAoZXNjYXBlTnVtKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICAgIHJlc3VsdCArPSAxOwotICB9Ci0gIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QgKil2YWwuY19zdHIoKSwgdmFsLmxlbmd0aCgpKTsKLSAgcmVzdWx0ICs9IHZhbC5sZW5ndGgoKTsKLSAgaWYgKGVzY2FwZU51bSkgewotICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgICByZXN1bHQgKz0gMTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBDb252ZXJ0IHRoZSBnaXZlbiBkb3VibGUgdG8gYSBKU09OIHN0cmluZywgd2hpY2ggaXMgZWl0aGVyIHRoZSBudW1iZXIsCi0vLyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7Ci0KLSAgLy8gTm9ybWFsaXplIG91dHB1dCBvZiBib29zdDo6bGV4aWNhbF9jYXN0IGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCi0gIGJvb2wgc3BlY2lhbCA9IGZhbHNlOwotICBzd2l0Y2ggKHZhbFswXSkgewotICBjYXNlICdOJzoKLSAgY2FzZSAnbic6Ci0gICAgdmFsID0ga1RocmlmdE5hbjsKLSAgICBzcGVjaWFsID0gdHJ1ZTsKLSAgICBicmVhazsKLSAgY2FzZSAnSSc6Ci0gIGNhc2UgJ2knOgotICAgIHZhbCA9IGtUaHJpZnRJbmZpbml0eTsKLSAgICBzcGVjaWFsID0gdHJ1ZTsKLSAgICBicmVhazsKLSAgY2FzZSAnLSc6Ci0gICAgaWYgKCh2YWxbMV0gPT0gJ0knKSB8fCAodmFsWzFdID09ICdpJykpIHsKLSAgICAgIHZhbCA9IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OwotICAgICAgc3BlY2lhbCA9IHRydWU7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgYm9vbCBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKLSAgaWYgKGVzY2FwZU51bSkgewotICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgICByZXN1bHQgKz0gMTsKLSAgfQotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopdmFsLmNfc3RyKCksIHZhbC5sZW5ndGgoKSk7Ci0gIHJlc3VsdCArPSB2YWwubGVuZ3RoKCk7Ci0gIGlmIChlc2NhcGVOdW0pIHsKLSAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gICAgcmVzdWx0ICs9IDE7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OT2JqZWN0U3RhcnQoKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RTdGFydCwgMSk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7Ci0gIHJldHVybiByZXN1bHQgKyAxOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RFbmQoKSB7Ci0gIHBvcENvbnRleHQoKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RFbmQsIDEpOwotICByZXR1cm4gMTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOwotICByZXR1cm4gcmVzdWx0ICsgMTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlFbmQoKSB7Ci0gIHBvcENvbnRleHQoKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheUVuZCwgMSk7Ci0gIHJldHVybiAxOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihrVGhyaWZ0VmVyc2lvbjEpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKG5hbWUpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlVHlwZSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OSW50ZWdlcihmaWVsZElkKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGRUeXBlKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGtleVR5cGUpKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRCh2YWxUeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwotICByZXN1bHQgKz0gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKSArIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZWxlbVR5cGUpKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKHZhbHVlKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjdWFzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMKLSAgLy8gaW50OF90IGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCi0gIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKChpbnQxNl90KWJ5dGUpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpMTYpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpMzIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcihpNjQpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIHJldHVybiB3cml0ZUpTT05Eb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gd3JpdGVKU09OU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkJhc2U2NChzdHIpOwotfQotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotLy8gUmVhZHMgMSBieXRlIGFuZCB2ZXJpZmllcyB0aGF0IGl0IG1hdGNoZXMgY2guCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCkgewotICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyXywgY2gpOwotfQotCi0vLyBEZWNvZGVzIHRoZSBmb3VyIGhleCBwYXJ0cyBvZiBhIEpTT04gZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVyIGFuZCByZXR1cm5zCi0vLyB0aGUgY2hhcmFjdGVyIHZpYSBvdXQuIFRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBtdXN0IGJlICIwMCIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCAqb3V0KSB7Ci0gIHVpbnQ4X3QgYlsyXTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOwotICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05aZXJvQ2hhcik7Ci0gIGJbMF0gPSByZWFkZXJfLnJlYWQoKTsKLSAgYlsxXSA9IHJlYWRlcl8ucmVhZCgpOwotICAqb3V0ID0gKGhleFZhbChiWzBdKSA8PCA0KSArIGhleFZhbChiWzFdKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8vIERlY29kZXMgYSBKU09OIHN0cmluZywgaW5jbHVkaW5nIHVuZXNjYXBpbmcsIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgdmlhIHN0cgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCBza2lwQ29udGV4dCkgewotICB1aW50MzJfdCByZXN1bHQgPSAoc2tpcENvbnRleHQgPyAwIDogY29udGV4dF8tPnJlYWQocmVhZGVyXykpOwotICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKLSAgdWludDhfdCBjaDsKLSAgc3RyLmNsZWFyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKLSAgICArK3Jlc3VsdDsKLSAgICBpZiAoY2ggPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsKLSAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7Ci0gICAgICArK3Jlc3VsdDsKLSAgICAgIGlmIChjaCA9PSBrSlNPTkVzY2FwZUNoYXIpIHsKLSAgICAgICAgcmVzdWx0ICs9IHJlYWRKU09ORXNjYXBlQ2hhcigmY2gpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7Ci0gICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKChjb25zdCBjaGFyICopJmNoLCAxKSAgKyAiJy4iKTsKLSAgICAgICAgfQotICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOwotICAgICAgfQotICAgIH0KLSAgICBzdHIgKz0gY2g7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBibG9jayBvZiBiYXNlNjQgY2hhcmFjdGVycywgZGVjb2RpbmcgaXQsIGFuZCByZXR1cm5zIHZpYSBzdHIKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgc3RkOjpzdHJpbmcgdG1wOwotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN0cmluZyh0bXApOwotICB1aW50OF90ICpiID0gKHVpbnQ4X3QgKil0bXAuY19zdHIoKTsKLSAgdWludDMyX3QgbGVuID0gdG1wLmxlbmd0aCgpOwotICBzdHIuY2xlYXIoKTsKLSAgd2hpbGUgKGxlbiA+PSA0KSB7Ci0gICAgYmFzZTY0X2RlY29kZShiLCA0KTsKLSAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyICopYiwgMyk7Ci0gICAgYiArPSA0OwotICAgIGxlbiAtPSA0OwotICB9Ci0gIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAotICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCi0gIGlmIChsZW4gPiAxKSB7Ci0gICAgYmFzZTY0X2RlY29kZShiLCBsZW4pOwotICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIgKiliLCBsZW4gLSAxKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKLS8vIGEgdmFsaWQgSlNPTiBudW1lcmljIGNoYXJhY3Rlci4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgc3RyLmNsZWFyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgdWludDhfdCBjaCA9IHJlYWRlcl8ucGVlaygpOwotICAgIGlmICghaXNKU09OTnVtZXJpYyhjaCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZWFkZXJfLnJlYWQoKTsKLSAgICBzdHIgKz0gY2g7Ci0gICAgKytyZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAotLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQotdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSAmbnVtKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwotICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgc3RyOwotICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKLSAgdHJ5IHsKLSAgICBudW0gPSBib29zdDo6bGV4aWNhbF9jYXN0PE51bWJlclR5cGU+KHN0cik7Ci0gIH0KLSAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKLSAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOwotICB9Ci0gIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhIEpTT04gbnVtYmVyIG9yIHN0cmluZyBhbmQgaW50ZXJwcmV0cyBpdCBhcyBhIGRvdWJsZS4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORG91YmxlKGRvdWJsZSAmbnVtKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwotICBzdGQ6OnN0cmluZyBzdHI7Ci0gIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBrSlNPTlN0cmluZ0RlbGltaXRlcikgewotICAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhzdHIsIHRydWUpOwotICAgIC8vIENoZWNrIGZvciBOYU4sIEluZmluaXR5IGFuZCAtSW5maW5pdHkKLSAgICBpZiAoc3RyID09IGtUaHJpZnROYW4pIHsKLSAgICAgIG51bSA9IEhVR0VfVkFML0hVR0VfVkFMOyAvLyBnZW5lcmF0ZXMgTmFOCi0gICAgfQotICAgIGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0SW5maW5pdHkpIHsKLSAgICAgIG51bSA9IEhVR0VfVkFMOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIgPT0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkpIHsKLSAgICAgIG51bSA9IC1IVUdFX1ZBTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoIWNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdHIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCi0gICAgICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwotICAgIH0KLSAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKLSAgICB0cnkgewotICAgICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxkb3VibGU+KHN0cik7Ci0gICAgfQotICAgIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RFbmQoKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdEVuZCk7Ci0gIHBvcENvbnRleHQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheVN0YXJ0KCkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5U3RhcnQpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkFycmF5RW5kKCkgewotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheUVuZCk7Ci0gIHBvcENvbnRleHQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgaWYgKHRtcFZhbCAhPSBrVGhyaWZ0VmVyc2lvbjEpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwotICB9Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhuYW1lKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpdG1wVmFsOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIHNlcWlkID0gdG1wVmFsOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICByZXR1cm4gcmVhZEpTT05PYmplY3RTdGFydCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAodm9pZCkgbmFtZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgLy8gQ2hlY2sgaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLSAgdWludDhfdCBjaCA9IHJlYWRlcl8ucGVlaygpOwotICBpZiAoY2ggPT0ga0pTT05PYmplY3RFbmQpIHsKLSAgICBmaWVsZFR5cGUgPSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUDsKLSAgfQotICBlbHNlIHsKLSAgICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICAgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gICAgZmllbGRJZCA9IHRtcFZhbDsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOwotICAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICAgIGZpZWxkVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gIHN0ZDo6c3RyaW5nIHRtcFN0cjsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICBrZXlUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7Ci0gIHZhbFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIHNpemUgPSB0bXBWYWw7Ci0gIHJlc3VsdCArPSByZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpICsgcmVhZEpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgdWludDY0X3QgdG1wVmFsID0gMDsKLSAgc3RkOjpzdHJpbmcgdG1wU3RyOwotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7Ci0gIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzaXplID0gdG1wVmFsOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTGlzdEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICBzdGQ6OnN0cmluZyB0bXBTdHI7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIHNpemUgPSB0bXBWYWw7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gIHJldHVybiByZWFkSlNPTkludGVnZXIodmFsdWUpOwotfQotCi0vLyByZWFkQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBwcm9wZXJseSBiZWN1YXNlIGJvb3N0OjpsZXhpY2FsIGNhc3Qgc2VlcyBpbnQ4X3QKLS8vIGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgaW50MTZfdCB0bXAgPSAoaW50MTZfdCkgYnl0ZTsKLSAgdWludDMyX3QgcmVzdWx0ID0gIHJlYWRKU09OSW50ZWdlcih0bXApOwotICBhc3NlcnQodG1wIDwgMjU2KTsKLSAgYnl0ZSA9IChpbnQ4X3QpdG1wOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGkxNik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIHJldHVybiByZWFkSlNPTkludGVnZXIoaTMyKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpNjQpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIHJldHVybiByZWFkSlNPTkRvdWJsZShkdWIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcgJnN0cikgewotICByZXR1cm4gcmVhZEpTT05CYXNlNjQoc3RyKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmU1NGRhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlICJUVmlydHVhbFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxzdGFjaz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9uCi1jbGFzcyBUSlNPTkNvbnRleHQ7Ci0KLS8qKgotICogSlNPTiBwcm90b2NvbCBmb3IgVGhyaWZ0LgotICoKLSAqIEltcGxlbWVudHMgYSBwcm90b2NvbCB3aGljaCB1c2VzIEpTT04gYXMgdGhlIHdpcmUtZm9ybWF0LgotICoKLSAqIFRocmlmdCB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZGVzY3JpYmVkIGJlbG93OgotICoKLSAqIDEuIEV2ZXJ5IFRocmlmdCBpbnRlZ2VyIHR5cGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG51bWJlci4KLSAqCi0gKiAyLiBUaHJpZnQgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBudW1iZXJzLiBTb21lIHNwZWNpYWwgdmFsdWVzIGFyZQotICogICAgcmVwcmVzZW50ZWQgYXMgc3RyaW5nczoKLSAqICAgIGEuICJOYU4iIGZvciBub3QtYS1udW1iZXIgdmFsdWVzCi0gKiAgICBiLiAiSW5maW5pdHkiIGZvciBwb3N0aXZlIGluZmluaXR5Ci0gKiAgICBjLiAiLUluZmluaXR5IiBmb3IgbmVnYXRpdmUgaW5maW5pdHkKLSAqCi0gKiAzLiBUaHJpZnQgc3RyaW5nIHZhbHVlcyBhcmUgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MsIHdpdGggYXBwcm9wcmlhdGUKLSAqICAgIGVzY2FwaW5nLgotICoKLSAqIDQuIFRocmlmdCBiaW5hcnkgdmFsdWVzIGFyZSBlbmNvZGVkIGludG8gQmFzZTY0IGFuZCBlbWl0dGVkIGFzIEpTT04gc3RyaW5ncy4KLSAqICAgIFRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIGlzIHdyaXR0ZW4gc3VjaCB0aGF0IGl0IHdpbGwgcHJvcGVybHkgc2tpcCBpZgotICogICAgY2FsbGVkIG9uIGEgVGhyaWZ0IHN0cmluZyAoYWx0aG91Z2ggaXQgd2lsbCBkZWNvZGUgZ2FyYmFnZSBkYXRhKS4KLSAqCi0gKiA1LiBUaHJpZnQgc3RydWN0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBvYmplY3RzLCB3aXRoIHRoZSBmaWVsZCBJRCBhcyB0aGUKLSAqICAgIGtleSwgYW5kIHRoZSBmaWVsZCB2YWx1ZSByZXByZXNlbnRlZCBhcyBhIEpTT04gb2JqZWN0IHdpdGggYSBzaW5nbGUKLSAqICAgIGtleS12YWx1ZSBwYWlyLiBUaGUga2V5IGlzIGEgc2hvcnQgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoYXQgdHlwZSwKLSAqICAgIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZS4gVGhlIHZhbGlkIHR5cGUgaWRlbnRpZmllcnMgYXJlOiAidGYiIGZvciBib29sLAotICogICAgImk4IiBmb3IgYnl0ZSwgImkxNiIgZm9yIDE2LWJpdCBpbnRlZ2VyLCAiaTMyIiBmb3IgMzItYml0IGludGVnZXIsICJpNjQiCi0gKiAgICBmb3IgNjQtYml0IGludGVnZXIsICJkYmwiIGZvciBkb3VibGUtcHJlY2lzaW9uIGxvYXRpbmcgcG9pbnQsICJzdHIiIGZvcgotICogICAgc3RyaW5nIChpbmNsdWRpbmcgYmluYXJ5KSwgInJlYyIgZm9yIHN0cnVjdCAoInJlY29yZHMiKSwgIm1hcCIgZm9yIG1hcCwKLSAqICAgICJsc3QiIGZvciBsaXN0LCAic2V0IiBmb3Igc2V0LgotICoKLSAqIDYuIFRocmlmdCBsaXN0cyBhbmQgc2V0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0Ci0gKiAgICBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIFRocmlmdAotICogICAgZWxlbWVudCB0eXBlIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIGNvdW50IG9mCi0gKiAgICB0aGUgVGhyaWZ0IGVsZW1lbnRzLiBUaGUgVGhyaWZ0IGVsZW1lbnRzIHRoZW4gZm9sbG93LgotICoKLSAqIDcuIFRocmlmdCBtYXBzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIGFycmF5cywgd2l0aCB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzCi0gKiAgICBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXJzIGZvciB0aGUgVGhyaWZ0IGtleSB0eXBlCi0gKiAgICBhbmQgdmFsdWUgdHlwZSwgZm9sbG93ZWQgYnkgdGhlIGNvdW50IG9mIHRoZSBUaHJpZnQgcGFpcnMsIGZvbGxvd2VkIGJ5IGEKLSAqICAgIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleS12YWx1ZSBwYWlycy4gTm90ZSB0aGF0IEpTT04ga2V5cyBjYW4gb25seQotICogICAgYmUgc3RyaW5ncywgd2hpY2ggbWVhbnMgdGhhdCB0aGUga2V5IHR5cGUgb2YgdGhlIFRocmlmdCBtYXAgc2hvdWxkIGJlCi0gKiAgICByZXN0cmljdGVkIHRvIG51bWVyaWMgb3Igc3RyaW5nIHR5cGVzIC0tIGluIHRoZSBjYXNlIG9mIG51bWVyaWNzLCB0aGV5Ci0gKiAgICBhcmUgc2VyaWFsaXplZCBhcyBzdHJpbmdzLgotICoKLSAqIDguIFRocmlmdCBtZXNzYWdlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIHByb3RvY29sCi0gKiAgICB2ZXJzaW9uICMsIHRoZSBtZXNzYWdlIG5hbWUsIHRoZSBtZXNzYWdlIHR5cGUsIGFuZCB0aGUgc2VxdWVuY2UgSUQgYXMKLSAqICAgIHRoZSBmaXJzdCA0IGVsZW1lbnRzLgotICoKLSAqIE1vcmUgZGlzY3Vzc2lvbiBvZiB0aGUgZG91YmxlIGhhbmRsaW5nIGlzIHByb2JhYmx5IHdhcnJhbnRlZC4gVGhlIGFpbSBvZgotICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0aGUgYmVoYXZpb3IKLSAqIG9mIEphdmEncyBEb3VibGUudG9TdHJpbmcoKSwgd2hpY2ggaGFzIG5vIHByZWNpc2lvbiBsb3NzLiAgSW1wbGVtZW50b3JzIGluCi0gKiBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIHN0cml2ZSB0byBhY2hpZXZlIHRoYXQgd2hlcmUgcG9zc2libGUuIEkgaGF2ZSBub3QKLSAqIHlldCB2ZXJpZmllZCB3aGV0aGVyIGJvb3N0OmxleGljYWxfY2FzdCwgd2hpY2ggaXMgZG9pbmcgdGhhdCB3b3JrIGZvciBtZSBpbgotICogQysrLCBsb3NlcyBhbnkgcHJlY2lzaW9uLCBidXQgSSBhbSBsZWF2aW5nIHRoaXMgYXMgYSBmdXR1cmUgaW1wcm92ZW1lbnQuIEkKLSAqIG1heSB0cnkgdG8gcHJvdmlkZSBhIEMgY29tcG9uZW50IGZvciB0aGlzLCBzbyB0aGF0IG90aGVyIGxhbmd1YWdlcyBjb3VsZAotICogYmluZCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZvciBtYXhpbXVtIGNvbnNpc3RlbmN5LgotICoKLSAqIE5vdGUgZnVydGhlciB0aGF0IEphdmFTY3JpcHQgaXRzZWxmIGlzIG5vdCBjYXBhYmxlIG9mIHJlcHJlc2VudGluZwotICogZmxvYXRpbmcgcG9pbnQgaW5maW5pdGllcyAtLSBwcmVzdW1hYmx5IHdoZW4gd2UgaGF2ZSBhIEphdmFTY3JpcHQgVGhyaWZ0Ci0gKiBjbGllbnQsIHRoaXMgd291bGQgbWVhbiB0aGF0IGluZmluaXRpZXMgZ2V0IGNvbnZlcnRlZCB0byBub3QtYS1udW1iZXIgaW4KLSAqIHRyYW5zbWlzc2lvbi4gSSBkb24ndCBrbm93IG9mIGFueSB3b3JrLWFyb3VuZCBmb3IgdGhpcyBpc3N1ZS4KLSAqCi0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPiB7Ci0gcHVibGljOgotCi0gIFRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKLQotICB+VEpTT05Qcm90b2NvbCgpOwotCi0gcHJpdmF0ZToKLQotICB2b2lkIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7Ci0KLSAgdm9pZCBwb3BDb250ZXh0KCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cik7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci0gIHVpbnQzMl90IHdyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RTdGFydCgpIDsKLQotICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09OQXJyYXlFbmQoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgKm91dCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKLQotICB1aW50MzJfdCByZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB1aW50MzJfdCByZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLSAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUgJm51bSk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlICZudW0pOwotCi0gIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTk9iamVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQXJyYXlTdGFydCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQXJyYXlFbmQoKTsKLQotIHB1YmxpYzoKLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpOwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0KLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+OjpyZWFkQm9vbDsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICBjbGFzcyBMb29rYWhlYWRSZWFkZXIgewotCi0gICBwdWJsaWM6Ci0KLSAgICBMb29rYWhlYWRSZWFkZXIoVFRyYW5zcG9ydCAmdHJhbnMpIDoKLSAgICAgIHRyYW5zXygmdHJhbnMpLAotICAgICAgaGFzRGF0YV8oZmFsc2UpIHsKLSAgICB9Ci0KLSAgICB1aW50OF90IHJlYWQoKSB7Ci0gICAgICBpZiAoaGFzRGF0YV8pIHsKLSAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBkYXRhXzsKLSAgICB9Ci0KLSAgICB1aW50OF90IHBlZWsoKSB7Ci0gICAgICBpZiAoIWhhc0RhdGFfKSB7Ci0gICAgICAgIHRyYW5zXy0+cmVhZEFsbCgmZGF0YV8sIDEpOwotICAgICAgfQotICAgICAgaGFzRGF0YV8gPSB0cnVlOwotICAgICAgcmV0dXJuIGRhdGFfOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBUVHJhbnNwb3J0ICp0cmFuc187Ci0gICAgYm9vbCBoYXNEYXRhXzsKLSAgICB1aW50OF90IGRhdGFfOwotICB9OwotCi0gcHJpdmF0ZToKLSAgVFRyYW5zcG9ydCogdHJhbnNfOwotCi0gIHN0ZDo6c3RhY2s8Ym9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiA+IGNvbnRleHRzXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjb250ZXh0XzsKLSAgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl87Ci19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbCBvYmplY3RzIGdpdmVuIHRyYW5zcG9ydHMuCi0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKLSAgfQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0KLS8vIFRPRE8oZHJlaXNzKTogTW92ZSBwYXJ0IG9mIFRocmlmdEpTT05TdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVGhyaWZ0U3RydWN0PgotICBzdGQ6OnN0cmluZyBUaHJpZnRKU09OU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwotICBUSlNPTlByb3RvY29sIHByb3RvY29sKHRyYW5zKTsKLQotICB0cy53cml0ZSgmcHJvdG9jb2wpOwotCi0gIHVpbnQ4X3QqIGJ1ZjsKLSAgdWludDMyX3Qgc2l6ZTsKLSAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKLX0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTIyYzcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotCi0vLyBVc2UgdGhpcyB0byBnZXQgYXJvdW5kIHN0cmljdCBhbGlhc2luZyBydWxlcy4KLS8vIEZvciBleGFtcGxlLCB1aW50NjRfdCBpID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihyZXR1cm5zX2RvdWJsZSgpKTsKLS8vIFRoZSBtb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gaXMgdG8ganVzdCBjYXN0IGEgcG9pbnRlciwKLS8vIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yay4KLS8vIEZvciBhIHByZXR0eSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbSwgc2VlCi0vLyBodHRwOi8vd3d3LmNlbGxwZXJmb3JtYW5jZS5jb20vbWlrZV9hY3Rvbi8yMDA2LzA2LyAoLi4uKQotLy8gdW5kZXJzdGFuZGluZ19zdHJpY3RfYWxpYXNpbmcuaHRtbAotdGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgotc3RhdGljIGlubGluZSBUbyBiaXR3aXNlX2Nhc3QoRnJvbSBmcm9tKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpOwotCi0gIC8vIEJBRCEhISAgVGhlc2UgYXJlIGFsbCBicm9rZW4gd2l0aCAtTzIuCi0gIC8vcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRvKj4oJmZyb20pOyAgLy8gQkFEISEhCi0gIC8vcmV0dXJuICpzdGF0aWNfY2FzdDxUbyo+KHN0YXRpY19jYXN0PHZvaWQqPigmZnJvbSkpOyAgLy8gQkFEISEhCi0gIC8vcmV0dXJuICooVG8qKSh2b2lkKikmZnJvbTsgIC8vIEJBRCEhIQotCi0gIC8vIFN1cGVyIGNsZWFuIGFuZCBwYXJpdGFsbHkgYmxlc3NlZCBieSBzZWN0aW9uIDMuOSBvZiB0aGUgc3RhbmRhcmQuCi0gIC8vdW5zaWduZWQgY2hhciBjW3NpemVvZihmcm9tKV07Ci0gIC8vbWVtY3B5KGMsICZmcm9tLCBzaXplb2YoZnJvbSkpOwotICAvL1RvIHRvOwotICAvL21lbWNweSgmdG8sIGMsIHNpemVvZihjKSk7Ci0gIC8vcmV0dXJuIHRvOwotCi0gIC8vIFNsaWdodGx5IG1vcmUgcXVlc3Rpb25hYmxlLgotICAvLyBTYW1lIGNvZGUgZW1pdHRlZCBieSBHQ0MuCi0gIC8vVG8gdG87Ci0gIC8vbWVtY3B5KCZ0bywgJmZyb20sIHNpemVvZihmcm9tKSk7Ci0gIC8vcmV0dXJuIHRvOwotCi0gIC8vIFRlY2huaWNhbGx5IHVuZGVmaW5lZCwgYnV0IGFsbW9zdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsCi0gIC8vIGFuZCB0aGUgbW9zdCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24uCi0gIHVuaW9uIHsKLSAgICBGcm9tIGY7Ci0gICAgVG8gdDsKLSAgfSB1OwotICB1LmYgPSBmcm9tOwotICByZXR1cm4gdS50OwotfQotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKLQotI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0hfCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KLSMgZWxzZQotIyAgaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQk9PU1RfQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBCT09TVF9MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJPT1NUX0JJR19FTkRJQU4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotIyAgZGVmaW5lIG50b2hsbChuKSAobikKLSMgIGRlZmluZSBodG9ubGwobikgKG4pCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBodG9sZWxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgbGV0b2hsbChuKSBic3dhcF82NChuKQotIyBlbHNlIC8qIEdOVUMgJiBHTElCQyAqLwotIyAgZGVmaW5lIGJzd2FwXzY0KG4pIFwKLSAgICAgICggKCgobikgJiAweGZmMDAwMDAwMDAwMDAwMDB1bGwpID4+IDU2KSBcCi0gICAgICB8ICgoKG4pICYgMHgwMGZmMDAwMDAwMDAwMDAwdWxsKSA+PiA0MCkgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMGZmMDAwMDAwMDAwMHVsbCkgPj4gMjQpIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMGZmMDAwMDAwMDB1bGwpID4+IDgpICBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMGZmMDAwMDAwdWxsKSA8PCA4KSAgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMGZmMDAwMHVsbCkgPDwgMjQpIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDAwMGZmMDB1bGwpIDw8IDQwKSBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDAwMGZmdWxsKSA8PCA1NikgKQotIyAgZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jIGVuZGlmIC8qIEdOVUMgJiBHTElCQyAqLwotI2VsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotIyAgZGVmaW5lIGh0b2xlbGwobikgKG4pCi0jICBkZWZpbmUgbGV0b2hsbChuKSAobikKLSMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCi0jICBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyAgZGVmaW5lIG50b2hsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGh0b25sbChuKSBic3dhcF82NChuKQotIyBlbHNlIC8qIEdOVUMgJiBHTElCQyAqLwotIyAgZGVmaW5lIG50b2hsbChuKSAoICgoKHVpbnQ2NF90KW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSApCi0jICBkZWZpbmUgaHRvbmxsKG4pICggKCgodWludDY0X3QpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vKioKLSAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sIHN1cHBvcnRzLgotICogVGFrZSBzcGVjaWFsIG5vdGUgb2YgdGhlIFRfRU5EIHR5cGUgd2hpY2ggaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gbWFyawotICogdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KLSAqLwotZW51bSBUVHlwZSB7Ci0gIFRfU1RPUCAgICAgICA9IDAsCi0gIFRfVk9JRCAgICAgICA9IDEsCi0gIFRfQk9PTCAgICAgICA9IDIsCi0gIFRfQllURSAgICAgICA9IDMsCi0gIFRfSTA4ICAgICAgICA9IDMsCi0gIFRfSTE2ICAgICAgICA9IDYsCi0gIFRfSTMyICAgICAgICA9IDgsCi0gIFRfVTY0ICAgICAgICA9IDksCi0gIFRfSTY0ICAgICAgICA9IDEwLAotICBUX0RPVUJMRSAgICAgPSA0LAotICBUX1NUUklORyAgICAgPSAxMSwKLSAgVF9VVEY3ICAgICAgID0gMTEsCi0gIFRfU1RSVUNUICAgICA9IDEyLAotICBUX01BUCAgICAgICAgPSAxMywKLSAgVF9TRVQgICAgICAgID0gMTQsCi0gIFRfTElTVCAgICAgICA9IDE1LAotICBUX1VURjggICAgICAgPSAxNiwKLSAgVF9VVEYxNiAgICAgID0gMTcKLX07Ci0KLS8qKgotICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAotICogc3VwcG9ydHMuCi0gKi8KLWVudW0gVE1lc3NhZ2VUeXBlIHsKLSAgVF9DQUxMICAgICAgID0gMSwKLSAgVF9SRVBMWSAgICAgID0gMiwKLSAgVF9FWENFUFRJT04gID0gMywKLSAgVF9PTkVXQVkgICAgID0gNAotfTsKLQotCi0vKioKLSAqIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIFRQcm90b2NvbDo6c2tpcCgpLgotICoKLSAqIFRlbXBsYXRpemVkIHRvIGF2b2lkIGhhdmluZyB0byBtYWtlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbHMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+Ci11aW50MzJfdCBza2lwKFByb3RvY29sXyYgcHJvdCwgVFR5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBUX0JPT0w6Ci0gICAgewotICAgICAgYm9vbCBib29sdjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRCb29sKGJvb2x2KTsKLSAgICB9Ci0gIGNhc2UgVF9CWVRFOgotICAgIHsKLSAgICAgIGludDhfdCBieXRldjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRCeXRlKGJ5dGV2KTsKLSAgICB9Ci0gIGNhc2UgVF9JMTY6Ci0gICAgewotICAgICAgaW50MTZfdCBpMTY7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkSTE2KGkxNik7Ci0gICAgfQotICBjYXNlIFRfSTMyOgotICAgIHsKLSAgICAgIGludDMyX3QgaTMyOwotICAgICAgcmV0dXJuIHByb3QucmVhZEkzMihpMzIpOwotICAgIH0KLSAgY2FzZSBUX0k2NDoKLSAgICB7Ci0gICAgICBpbnQ2NF90IGk2NDsKLSAgICAgIHJldHVybiBwcm90LnJlYWRJNjQoaTY0KTsKLSAgICB9Ci0gIGNhc2UgVF9ET1VCTEU6Ci0gICAgewotICAgICAgZG91YmxlIGR1YjsKLSAgICAgIHJldHVybiBwcm90LnJlYWREb3VibGUoZHViKTsKLSAgICB9Ci0gIGNhc2UgVF9TVFJJTkc6Ci0gICAgewotICAgICAgc3RkOjpzdHJpbmcgc3RyOwotICAgICAgcmV0dXJuIHByb3QucmVhZEJpbmFyeShzdHIpOwotICAgIH0KLSAgY2FzZSBUX1NUUlVDVDoKLSAgICB7Ci0gICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgIGludDE2X3QgZmlkOwotICAgICAgVFR5cGUgZnR5cGU7Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICByZXN1bHQgKz0gcHJvdC5yZWFkRmllbGRCZWdpbihuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGZ0eXBlKTsKLSAgICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkRW5kKCk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgY2FzZSBUX01BUDoKLSAgICB7Ci0gICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgVFR5cGUga2V5VHlwZTsKLSAgICAgIFRUeXBlIHZhbFR5cGU7Ci0gICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBrZXlUeXBlKTsKLSAgICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgdmFsVHlwZSk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwRW5kKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgY2FzZSBUX1NFVDoKLSAgICB7Ci0gICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgVFR5cGUgZWxlbVR5cGU7Ci0gICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZFNldEVuZCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIGNhc2UgVF9MSVNUOgotICAgIHsKLSAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICBUVHlwZSBlbGVtVHlwZTsKLSAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZExpc3RFbmQoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBjYXNlIFRfU1RPUDogY2FzZSBUX1ZPSUQ6IGNhc2UgVF9VNjQ6IGNhc2UgVF9VVEY4OiBjYXNlIFRfVVRGMTY6Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGEgdGhyaWZ0IHByb3RvY29sIGRyaXZlci4gVGhlc2UgYXJlIGFsbCB0aGUgbWV0aG9kcyB0aGF0Ci0gKiBhIHByb3RvY29sIG11c3QgaW1wbGVtZW50LiBFc3NlbnRpYWxseSwgdGhlcmUgbXVzdCBiZSBzb21lIHdheSBvZiByZWFkaW5nCi0gKiBhbmQgd3JpdGluZyBhbGwgdGhlIGJhc2UgdHlwZXMsIHBsdXMgYSBtZWNoYW5pc20gZm9yIHdyaXRpbmcgb3V0IHN0cnVjdHMKLSAqIHdpdGggaW5kZXhlZCBmaWVsZHMuCi0gKgotICogVFByb3RvY29sIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGVuY29kaW5nIGNvbnRleHRzLAotICogYXMgdGhleSBtYXkgbmVlZCB0byBtYWludGFpbiBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHByb3RvY29scyAoaS5lLiBYTUwpLgotICogTm90ZSB0aGF0IGlzIGlzIGFjY2VwdGFibGUgZm9yIHRoZSBUUHJvdG9jb2wgbW9kdWxlIHRvIGRvIGl0cyBvd24gaW50ZXJuYWwKLSAqIGJ1ZmZlcmVkIHJlYWRzL3dyaXRlcyB0byB0aGUgdW5kZXJseWluZyBUVHJhbnNwb3J0IHdoZXJlIGFwcHJvcHJpYXRlIChpLmUuCi0gKiB3aGVuIHBhcnNpbmcgYW4gaW5wdXQgWE1MIHN0cmVhbSwgcmVhZGluZyBzaG91bGQgYmUgYmF0Y2hlZCByYXRoZXIgdGhhbgotICogbG9va2luZyBhaGVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGZvciBhIGNsb3NlIHRhZykuCi0gKgotICovCi1jbGFzcyBUUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VFByb3RvY29sKCkge30KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgPSAwOwotCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTE2X3ZpcnQoY29uc3QgaW50MTZfdCBpMTYpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJpbmFyeV92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKLQotICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVNZXNzYWdlQmVnaW5fdmlydChuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlTWVzc2FnZUVuZF92aXJ0KCk7Ci0gIH0KLQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlU3RydWN0QmVnaW5fdmlydChuYW1lKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlU3RydWN0RW5kX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luX3ZpcnQobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVGaWVsZEVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUZpZWxkU3RvcF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVNYXBCZWdpbl92aXJ0KGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVNYXBFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUxpc3RCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUxpc3RFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlU2V0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZVNldEVuZF92aXJ0KCk7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlQm9vbF92aXJ0KHZhbHVlKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlQnl0ZV92aXJ0KGJ5dGUpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZUkxNl92aXJ0KGkxNik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlSTMyX3ZpcnQoaTMyKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVJNjRfdmlydChpNjQpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHdyaXRlRG91YmxlX3ZpcnQoZHViKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiB3cml0ZVN0cmluZ192aXJ0KHN0cik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gd3JpdGVCaW5hcnlfdmlydChzdHIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTY0X3ZpcnQoaW50NjRfdCYgaTY0KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgPSAwOwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRNZXNzYWdlQmVnaW5fdmlydChuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZE1lc3NhZ2VFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZFN0cnVjdEJlZ2luX3ZpcnQobmFtZSk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRTdHJ1Y3RFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkRmllbGRCZWdpbl92aXJ0KG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZEZpZWxkRW5kX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZE1hcEJlZ2luX3ZpcnQoa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWFwRW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRNYXBFbmRfdmlydCgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZExpc3RCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRMaXN0RW5kX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZFNldEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkU2V0RW5kX3ZpcnQoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZEJvb2xfdmlydCh2YWx1ZSk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkQnl0ZV92aXJ0KGJ5dGUpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkSTE2X3ZpcnQoaTE2KTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZEkzMl92aXJ0KGkzMik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCkgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWRJNjRfdmlydChpNjQpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIHJlYWREb3VibGVfdmlydChkdWIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZFN0cmluZ192aXJ0KHN0cik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkQmluYXJ5X3ZpcnQoc3RyKTsKLSAgfQotCi0gIC8qCi0gICAqIHN0ZDo6dmVjdG9yIGlzIHNwZWNpYWxpemVkIGZvciBib29sLCBhbmQgaXRzIGVsZW1lbnRzIGFyZSBpbmRpdmlkdWFsIGJpdHMKLSAgICogcmF0aGVyIHRoYW4gYm9vbHMuICAgV2UgbmVlZCB0byBkZWZpbmUgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiByZWFkQm9vbCgpCi0gICAqIHRvIHdvcmsgd2l0aCBzdGQ6OnZlY3Rvcjxib29sPi4KLSAgICovCi0gIHVpbnQzMl90IHJlYWRCb29sKHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkQm9vbF92aXJ0KHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEuCi0gICAqLwotICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiBza2lwX3ZpcnQodHlwZSk7Ci0gIH0KLSAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSkgewotICAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqdGhpcywgdHlwZSk7Ci0gIH0KLQotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiBwdHJhbnNfOwotICB9Ci0KLSAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHR3byBjYWxscywgdGhleSBhcmUgZm9yIGJhY2t3YXJkcwotICAvLyBjb21wYXRpYmlsaXR5Ci0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gcHRyYW5zXzsKLSAgfQotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0T3V0cHV0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiBwdHJhbnNfOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpOgotICAgIHB0cmFuc18ocHRyYW5zKSB7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOwotCi0gcHJpdmF0ZToKLSAgVFByb3RvY29sKCkge30KLX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sIG9iamVjdHMgZ2l2ZW4gdHJhbnNwb3J0cy4KLSAqLwotY2xhc3MgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBUUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5UUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKLX07Ci0KLS8qKgotICogRHVtbXkgcHJvdG9jb2wgY2xhc3MuCi0gKgotICogVGhpcyBjbGFzcyBkb2VzIG5vdGhpbmcsIGFuZCBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgotICogSXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBnZW5lcmF0b3IgY29kZS4KLSAqLwotY2xhc3MgVER1bW15UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzZDNjOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLS8qKgotICogQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBwcm90b2NvbCBlcnJvcnMgdGhhdCBtYXkKLSAqIG9jY3VyIGluIHZhcmlvdXMgcHJvdG9jb2wgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYwotICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKLSAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiBwcm90b2NvbHMsIGkuZS4KLSAqIHBpcGVzIGV0Yy4KLSAqCi0gKi8KLWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotCi0gIC8qKgotICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KLSAgICovCi0gIGVudW0gVFByb3RvY29sRXhjZXB0aW9uVHlwZQotICB7IFVOS05PV04gPSAwCi0gICwgSU5WQUxJRF9EQVRBID0gMQotICAsIE5FR0FUSVZFX1NJWkUgPSAyCi0gICwgU0laRV9MSU1JVCA9IDMKLSAgLCBCQURfVkVSU0lPTiA9IDQKLSAgLCBOT1RfSU1QTEVNRU5URUQgPSA1Ci0gIH07Ci0KLSAgVFByb3RvY29sRXhjZXB0aW9uKCkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIFRQcm90b2NvbEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIHZpcnR1YWwgflRQcm90b2NvbEV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKLSAgICogdGhhdCBoYXMgb2NjdXJyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gRXJyb3IgY29kZQotICAgKi8KLSAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICAgIGNhc2UgVU5LTk9XTiAgICAgICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IFVua25vd24gcHJvdG9jb2wgZXhjZXB0aW9uIjsKLSAgICAgICAgY2FzZSBJTlZBTElEX0RBVEEgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCBkYXRhIjsKLSAgICAgICAgY2FzZSBORUdBVElWRV9TSVpFICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTmVnYXRpdmUgc2l6ZSI7Ci0gICAgICAgIGNhc2UgU0laRV9MSU1JVCAgICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEV4Y2VlZGVkIHNpemUgbGltaXQiOwotICAgICAgICBjYXNlIEJBRF9WRVJTSU9OICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIHZlcnNpb24iOwotICAgICAgICBjYXNlIE5PVF9JTVBMRU1FTlRFRCA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOb3QgaW1wbGVtZW50ZWQiOwotICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIEVycm9yIGNvZGUKLSAgICovCi0gIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZV87Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NzJiZmYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKLQotI2luY2x1ZGUgPHByb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwotCi0vKioKLSAqIFB1dHMgYSB3aXJldGFwIG9uIGEgcHJvdG9jb2wgb2JqZWN0LiAgQW55IHJlYWRzIHRvIHRoaXMgY2xhc3MgYXJlIHBhc3NlZAotICogdGhyb3VnaCB0byBhbiBlbmNsb3NlZCBwcm90b2NvbCBvYmplY3QsIGJ1dCBhbHNvIG1pcnJvcmVkIGFzIHdyaXRlIHRvIGEKLSAqIHNlY29uZCBwcm90b2NvbCBvYmplY3QuCi0gKgotICovCi1jbGFzcyBUUHJvdG9jb2xUYXAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+IHsKLSBwdWJsaWM6Ci0gICBUUHJvdG9jb2xUYXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rKQotICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPihzb3VyY2UtPmdldFRyYW5zcG9ydCgpKQotICAgICAsIHNvdXJjZV8oc291cmNlKQotICAgICAsIHNpbmtfKHNpbmspCi0gIHt9Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7Ci0gICAgc2lua18tPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgIHNpbmtfLT53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICBzaW5rXy0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgc2lua18tPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7Ci0gICAgaWYgKGZpZWxkVHlwZSA9PSBUX1NUT1ApIHsKLSAgICAgIHNpbmtfLT53cml0ZUZpZWxkU3RvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzaW5rXy0+d3JpdGVGaWVsZEJlZ2luKG5hbWUuY19zdHIoKSwgZmllbGRUeXBlLCBmaWVsZElkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRmllbGRFbmQoKTsKLSAgICBzaW5rXy0+d3JpdGVGaWVsZEVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICBzaW5rXy0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwRW5kKCk7Ci0gICAgc2lua18tPndyaXRlTWFwRW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICBzaW5rXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEVuZCgpOwotICAgIHNpbmtfLT53cml0ZUxpc3RFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICBzaW5rXy0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLQotICB1aW50MzJfdCByZWFkU2V0RW5kKCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFNldEVuZCgpOwotICAgIHNpbmtfLT53cml0ZVNldEVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQm9vbCh2YWx1ZSk7Ci0gICAgc2lua18tPndyaXRlQm9vbCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD46OnJlYWRCb29sOwotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJ5dGUoYnl0ZSk7Ci0gICAgc2lua18tPndyaXRlQnl0ZShieXRlKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEkxNihpMTYpOwotICAgIHNpbmtfLT53cml0ZUkxNihpMTYpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTMyKGkzMik7Ci0gICAgc2lua18tPndyaXRlSTMyKGkzMik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJNjQoaTY0KTsKLSAgICBzaW5rXy0+d3JpdGVJNjQoaTY0KTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRG91YmxlKGR1Yik7Ci0gICAgc2lua18tPndyaXRlRG91YmxlKGR1Yik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RyaW5nKHN0cik7Ci0gICAgc2lua18tPndyaXRlU3RyaW5nKHN0cik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQmluYXJ5KHN0cik7Ci0gICAgc2lua18tPndyaXRlQmluYXJ5KHN0cik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2lua187Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ZjUxOS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RWSVJUVUFMUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBUUHJvdG9jb2wgbWV0aG9kcy4KLSAqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBub24tdmlydHVhbCBUUHJvdG9jb2wKLSAqIG1ldGhvZHMuICBJdCBleGlzdHMgcHJpbWFyaWx5IHNvIFRWaXJ0dWFsUHJvdG9jb2wgY2FuIGRlcml2ZSBmcm9tIGl0LiAgSXQKLSAqIHByZXZlbnRzIFRWaXJ0dWFsUHJvdG9jb2wgbWV0aG9kcyBmcm9tIGNhdXNpbmcgaW5maW5pdGUgcmVjdXJzaW9uIGlmIHRoZQotICogbm9uLXZpcnR1YWwgbWV0aG9kcyBhcmUgbm90IG92ZXJyaWRkZW4gYnkgdGhlIFRWaXJ0dWFsUHJvdG9jb2wgc3ViY2xhc3MuCi0gKgotICogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuICBVc2UgVFZpcnR1YWxQcm90b2NvbAotICogaW5zdGVhZC4KLSAqLwotY2xhc3MgVFByb3RvY29sRGVmYXVsdHMgOiBwdWJsaWMgVFByb3RvY29sIHsKLSBwdWJsaWM6Ci0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICAgICh2b2lkKSBuYW1lOwotICAgICh2b2lkKSBtZXNzYWdlVHlwZTsKLSAgICAodm9pZCkgc2VxaWQ7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgICh2b2lkKSBuYW1lOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgKHZvaWQpIGZpZWxkVHlwZTsKLSAgICAodm9pZCkgZmllbGRJZDsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgKHZvaWQpIGtleVR5cGU7Ci0gICAgKHZvaWQpIHZhbFR5cGU7Ci0gICAgKHZvaWQpIHNpemU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkTWFwRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgKHZvaWQpIGVsZW1UeXBlOwotICAgICh2b2lkKSBzaXplOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewotICAgICh2b2lkKSBlbGVtVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSkgewotICAgICh2b2lkKSB2YWx1ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCb29sKHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKLSAgICAodm9pZCkgdmFsdWU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgICAodm9pZCkgYnl0ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gICAgKHZvaWQpIGkxNjsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gICAgKHZvaWQpIGkzMjsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gICAgKHZvaWQpIGk2NDsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgICAodm9pZCkgZHViOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgKHZvaWQpIHN0cjsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICAgICh2b2lkKSBzdHI7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgKHZvaWQpIG1lc3NhZ2VUeXBlOwotICAgICh2b2lkKSBzZXFpZDsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgKHZvaWQpIGZpZWxkVHlwZTsKLSAgICAodm9pZCkgZmllbGRJZDsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICAodm9pZCkga2V5VHlwZTsKLSAgICAodm9pZCkgdmFsVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTWFwRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICAodm9pZCkgZWxlbVR5cGU7Ci0gICAgKHZvaWQpIHNpemU7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgKHZvaWQpIGVsZW1UeXBlOwotICAgICh2b2lkKSBzaXplOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgICh2b2lkKSB2YWx1ZTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAgICh2b2lkKSBieXRlOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgICAodm9pZCkgaTE2OwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgICAodm9pZCkgaTMyOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgICAodm9pZCkgaTY0OwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICAgICh2b2lkKSBkdWI7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgKHZvaWQpIHN0cjsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICAodm9pZCkgc3RyOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBUUHJvdG9jb2xEZWZhdWx0cyhib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCi0gICAgOiBUUHJvdG9jb2wocHRyYW5zKQotICB7fQotfTsKLQotLyoqCi0gKiBDb25jcmV0ZSBUUHJvdG9jb2wgY2xhc3NlcyBzaG91bGQgaW5oZXJpdCBmcm9tIFRWaXJ0dWFsUHJvdG9jb2wKLSAqIHNvIHRoZXkgZG9uJ3QgaGF2ZSB0byBtYW51YWxseSBvdmVycmlkZSB2aXJ0dWFsIG1ldGhvZHMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8sIGNsYXNzIFN1cGVyXz1UUHJvdG9jb2xEZWZhdWx0cz4KLWNsYXNzIFRWaXJ0dWFsUHJvdG9jb2wgOiBwdWJsaWMgU3VwZXJfIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlRW5kKCk7Ci0gIH0KLQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RydWN0QmVnaW4obmFtZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRTdG9wKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNYXBFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUxpc3RFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0RW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQm9vbCh2YWx1ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUJ5dGUoYnl0ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTE2X3ZpcnQoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTE2KGkxNik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTMyKGkzMik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTY0KGk2NCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVEb3VibGUoZHViKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cmluZyhzdHIpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJpbmFyeV92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQmluYXJ5KHN0cik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWVzc2FnZUVuZCgpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RydWN0RW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkRW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU2V0RW5kKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQm9vbCh2YWx1ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQnl0ZShieXRlKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEkxNl92aXJ0KGludDE2X3QmIGkxNikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEkxNihpMTYpOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTMyKGkzMik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJNjQoaTY0KTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRG91YmxlKGR1Yik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RyaW5nKHN0cik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQmluYXJ5KHN0cik7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5za2lwKHR5cGUpOwotICB9Ci0KLSAgLyoKLSAgICogUHJvdmlkZSBhIGRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBub24tdmlydHVhbCByZWFkCi0gICAqIG1ldGhvZHMuCi0gICAqCi0gICAqIE5vdGU6IHN1YmNsYXNzZXMgdGhhdCB1c2UgVFZpcnR1YWxQcm90b2NvbCB0byBkZXJpdmUgZnJvbSBhbm90aGVyIHByb3RvY29sCi0gICAqIGltcGxlbWVudGF0aW9uIChpLmUuLCBub3QgVFByb3RvY29sRGVmYXVsdHMpIHNob3VsZCBiZXdhcmUgdGhhdCB0aGlzIG1heQotICAgKiBvdmVycmlkZSBhbnkgbm9uLWRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQKLSAgICogdHJhbnNwb3J0IGNsYXNzLiAgVGhleSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IHJlZGVmaW5lIHNraXAoKSB0byBjYWxsIHRoZQotICAgKiBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KLSAgICovCi0gIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgewotICAgIFByb3RvY29sXyogY29uc3QgcHJvdCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpOwotICAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqcHJvdCwgdHlwZSk7Ci0gIH0KLQotICAvKgotICAgKiBQcm92aWRlIGEgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciB1c2Ugd2l0aAotICAgKiBzdGQ6OnZlY3Rvcjxib29sPiwgdGhhdCBiZWhhdmVzIHRoZSBzYW1lIGFzIHJlYWRpbmcgaW50byBhIG5vcm1hbCBib29sLgotICAgKgotICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIGlmIGRlc2lyZWQsIGJ1dCB0aGVyZSBub3JtYWxseSBzaG91bGRuJ3QKLSAgICogYmUgYSBuZWVkIHRvLgotICAgKi8KLSAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgewotICAgIGJvb2wgYiA9IGZhbHNlOwotICAgIHVpbnQzMl90IHJldCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQm9vbChiKTsKLSAgICB2YWx1ZSA9IGI7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICB1c2luZyBTdXBlcl86OnJlYWRCb29sOyAvLyBzbyB3ZSBkb24ndCBoaWRlIHJlYWRCb29sKGJvb2wmKQotCi0gcHJvdGVjdGVkOgotICBUVmlydHVhbFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKLSAgICA6IFN1cGVyXyhwdHJhbnMpCi0gIHt9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWFlMjM1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlROb25ibG9ja2luZ1NlcnZlci5oIgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpZm5kZWYgQUZfTE9DQUwKLSNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLWNsYXNzIFRDb25uZWN0aW9uOjpUYXNrOiBwdWJsaWMgUnVubmFibGUgewotIHB1YmxpYzoKLSAgVGFzayhib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKLSAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikgOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBpbnB1dF8oaW5wdXQpLAotICAgIG91dHB1dF8ob3V0cHV0KSwKLSAgICBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSwKLSAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfKGNvbm5lY3Rpb25fLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSksCi0gICAgY29ubmVjdGlvbkNvbnRleHRfKGNvbm5lY3Rpb25fLT5nZXRDb25uZWN0aW9uQ29udGV4dCgpKSB7fQotCi0gIHZvaWQgcnVuKCkgewotICAgIHRyeSB7Ci0gICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGNvbm5lY3Rpb25fLT5nZXRUU29ja2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8sIGNvbm5lY3Rpb25Db250ZXh0XykgfHwKLSAgICAgICAgICAgICFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgY2VyciA8PCAiVE5vbmJsb2NraW5nU2VydmVyIGNsaWVudCBkaWVkOiAiIDw8IHR0eC53aGF0KCkgPDwgZW5kbDsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB4KSB7Ci0gICAgICBjZXJyIDw8ICJUTm9uYmxvY2tpbmdTZXJ2ZXIgZXhjZXB0aW9uOiAiIDw8IHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgfSBjYXRjaCAoYmFkX2FsbG9jJikgewotICAgICAgY2VyciA8PCAiVE5vbmJsb2NraW5nU2VydmVyIGNhdWdodCBiYWRfYWxsb2MgZXhjZXB0aW9uLiI7Ci0gICAgICBleGl0KC0xKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGNlcnIgPDwgIlROb25ibG9ja2luZ1NlcnZlciB1bmNhdWdodCBleGNlcHRpb24uIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpZ25hbCBjb21wbGV0aW9uIGJhY2sgdG8gdGhlIGxpYmV2ZW50IHRocmVhZCB2aWEgYSBwaXBlCi0gICAgaWYgKCFjb25uZWN0aW9uXy0+bm90aWZ5U2VydmVyKCkpIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6VGFzazo6cnVuOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKLSAgICB9Ci0gIH0KLQotICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25fOwotICB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwotICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87Ci0gIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKLX07Ci0KLXZvaWQgVENvbm5lY3Rpb246OmluaXQoaW50IHNvY2tldCwgc2hvcnQgZXZlbnRGbGFncywgVE5vbmJsb2NraW5nU2VydmVyKiBzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGFkZHJMZW4pIHsKLSAgdFNvY2tldF8tPnNldFNvY2tldEZEKHNvY2tldCk7Ci0gIHRTb2NrZXRfLT5zZXRDYWNoZWRBZGRyZXNzKGFkZHIsIGFkZHJMZW4pOwotCi0gIHNlcnZlcl8gPSBzOwotICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKLSAgZXZlbnRGbGFnc18gPSAwOwotCi0gIHJlYWRCdWZmZXJQb3NfID0gMDsKLSAgcmVhZFdhbnRfID0gMDsKLQotICB3cml0ZUJ1ZmZlcl8gPSBOVUxMOwotICB3cml0ZUJ1ZmZlclNpemVfID0gMDsKLSAgd3JpdGVCdWZmZXJQb3NfID0gMDsKLSAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOwotCi0gIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWX0ZSQU1JTkc7Ci0gIGFwcFN0YXRlXyA9IEFQUF9JTklUOwotICBjYWxsc0ZvclJlc2l6ZV8gPSAwOwotCi0gIC8vIFNldCBmbGFncywgd2hpY2ggYWxzbyByZWdpc3RlcnMgdGhlIGV2ZW50Ci0gIHNldEZsYWdzKGV2ZW50RmxhZ3MpOwotCi0gIC8vIGdldCBpbnB1dC90cmFuc3BvcnRzCi0gIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8gPSBzLT5nZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7Ci0gIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0gcy0+Z2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7Ci0KLSAgLy8gQ3JlYXRlIHByb3RvY29sCi0gIGlucHV0UHJvdG9jb2xfID0gcy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7Ci0gIG91dHB1dFByb3RvY29sXyA9IHMtPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7Ci0KLSAgLy8gU2V0IHVwIGZvciBhbnkgc2VydmVyIGV2ZW50IGhhbmRsZXIKLSAgc2VydmVyRXZlbnRIYW5kbGVyXyA9IHNlcnZlcl8tPmdldEV2ZW50SGFuZGxlcigpOwotICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgY29ubmVjdGlvbkNvbnRleHRfID0gc2VydmVyRXZlbnRIYW5kbGVyXy0+Y3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKLSAgfSBlbHNlIHsKLSAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBOVUxMOwotICB9Ci19Ci0KLXZvaWQgVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKSB7Ci0gIGludCBnb3Q9MCwgbGVmdD0wLCBzZW50PTA7Ci0gIHVpbnQzMl90IGZldGNoID0gMDsKLQotICBzd2l0Y2ggKHNvY2tldFN0YXRlXykgewotICBjYXNlIFNPQ0tFVF9SRUNWX0ZSQU1JTkc6Ci0gICAgdW5pb24gewotICAgICAgdWludDhfdCBidWZbc2l6ZW9mKHVpbnQzMl90KV07Ci0gICAgICBpbnQzMl90IHNpemU7Ci0gICAgfSBmcmFtaW5nOwotCi0gICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZWNlaXZlZCBzb21lIGJ5dGVzIHdlIGtlcHQgdGhlbSBoZXJlCi0gICAgZnJhbWluZy5zaXplID0gcmVhZFdhbnRfOwotICAgIC8vIGRldGVybWluZSBzaXplIG9mIHRoaXMgZnJhbWUKLSAgICB0cnkgewotICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKLSAgICAgIGZldGNoID0gdFNvY2tldF8tPnJlYWQoJmZyYW1pbmcuYnVmW3JlYWRCdWZmZXJQb3NfXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qoc2l6ZW9mKGZyYW1pbmcuc2l6ZSkgLSByZWFkQnVmZmVyUG9zXykpOwotICAgICAgaWYgKGZldGNoID09IDApIHsKLSAgICAgICAgLy8gV2hlbmV2ZXIgd2UgZ2V0IGhlcmUgaXQgbWVhbnMgYSByZW1vdGUgZGlzY29ubmVjdAotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICByZWFkQnVmZmVyUG9zXyArPSBmZXRjaDsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOwotICAgICAgY2xvc2UoKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZWFkQnVmZmVyUG9zXyA8IHNpemVvZihmcmFtaW5nLnNpemUpKSB7Ci0gICAgICAvLyBtb3JlIG5lZWRlZCBiZWZvcmUgZnJhbWUgc2l6ZSBpcyBrbm93biAtLSBzYXZlIHdoYXQgd2UgaGF2ZSBzbyBmYXIKLSAgICAgIHJlYWRXYW50XyA9IGZyYW1pbmcuc2l6ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZWFkV2FudF8gPSBudG9obChmcmFtaW5nLnNpemUpOwotICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHJlYWRXYW50XykgPD0gMCkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246d29ya1NvY2tldCgpIE5lZ2F0aXZlIGZyYW1lIHNpemUgJWQsIHJlbW90ZSBzaWRlIG5vdCB1c2luZyBURnJhbWVkVHJhbnNwb3J0PyIsIHN0YXRpY19jYXN0PGludD4ocmVhZFdhbnRfKSk7Ci0gICAgICBjbG9zZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBzaXplIGtub3duOyBub3cgZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZQotICAgIHRyYW5zaXRpb24oKTsKLSAgICByZXR1cm47Ci0KLSAgY2FzZSBTT0NLRVRfUkVDVjoKLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBiZSBpbiB0aGlzIHN0YXRlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEKLSAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPCByZWFkV2FudF8pOwotCi0gICAgdHJ5IHsKLSAgICAgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0Ci0gICAgICBmZXRjaCA9IHJlYWRXYW50XyAtIHJlYWRCdWZmZXJQb3NfOwotICAgICAgZ290ID0gdFNvY2tldF8tPnJlYWQocmVhZEJ1ZmZlcl8gKyByZWFkQnVmZmVyUG9zXywgZmV0Y2gpOwotICAgIH0KLSAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKLSAgICAgIGNsb3NlKCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChnb3QgPiAwKSB7Ci0gICAgICAvLyBNb3ZlIGFsb25nIGluIHRoZSBidWZmZXIKLSAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGdvdDsKLQotICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWQgbm90IG92ZXJkbyBpdAotICAgICAgYXNzZXJ0KHJlYWRCdWZmZXJQb3NfIDw9IHJlYWRXYW50Xyk7Ci0KLSAgICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcsIG1vdmUgb250byB0aGUgbmV4dCBzdGF0ZQotICAgICAgaWYgKHJlYWRCdWZmZXJQb3NfID09IHJlYWRXYW50XykgewotICAgICAgICB0cmFuc2l0aW9uKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gV2hlbmV2ZXIgd2UgZ2V0IGRvd24gaGVyZSBpdCBtZWFucyBhIHJlbW90ZSBkaXNjb25uZWN0Ci0gICAgY2xvc2UoKTsKLQotICAgIHJldHVybjsKLQotICBjYXNlIFNPQ0tFVF9TRU5EOgotICAgIC8vIFNob3VsZCBuZXZlciBoYXZlIHBvc2l0aW9uIHBhc3Qgc2l6ZQotICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJTaXplXyk7Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIHRvIHNlbmQsIHRoZW4gbGV0IHVzIG1vdmUgb24KLSAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiV0FSTklORzogU2VuZCBzdGF0ZSB3aXRoIG5vIGRhdGEgdG8gc2VuZFxuIik7Ci0gICAgICB0cmFuc2l0aW9uKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGxlZnQgPSB3cml0ZUJ1ZmZlclNpemVfIC0gd3JpdGVCdWZmZXJQb3NfOwotICAgICAgc2VudCA9IHRTb2NrZXRfLT53cml0ZV9wYXJ0aWFsKHdyaXRlQnVmZmVyXyArIHdyaXRlQnVmZmVyUG9zXywgbGVmdCk7Ci0gICAgfQotICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMgIiwgdGUud2hhdCgpKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd3JpdGVCdWZmZXJQb3NfICs9IHNlbnQ7Ci0KLSAgICAvLyBEaWQgd2Ugb3ZlcmRvIGl0PwotICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJTaXplXyk7Ci0KLSAgICAvLyBXZSBhcmUgZG9uZSEKLSAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKLSAgICAgIHRyYW5zaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0KLSAgZGVmYXVsdDoKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJVbmV4cGVjdGVkIFNvY2tldCBTdGF0ZSAlZCIsIHNvY2tldFN0YXRlXyk7Ci0gICAgYXNzZXJ0KDApOwotICB9Ci19Ci0KLS8qKgotICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bwotICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCi0gKiB0bywgb3IgZmluaXNoZWQgcmVjZWl2aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkIHRvLgotICovCi12b2lkIFRDb25uZWN0aW9uOjp0cmFuc2l0aW9uKCkgewotICAvLyBTd2l0Y2ggdXBvbiB0aGUgc3RhdGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGluIGFuZCBtb3ZlIHRvIGEgbmV3IHN0YXRlCi0gIHN3aXRjaCAoYXBwU3RhdGVfKSB7Ci0KLSAgY2FzZSBBUFBfUkVBRF9SRVFVRVNUOgotICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcgdGhlIHJlcXVlc3QsIHBhY2thZ2UgdGhlIHJlYWQgYnVmZmVyIGludG8gdHJhbnNwb3J0Ci0gICAgLy8gYW5kIGdldCBiYWNrIHNvbWUgZGF0YSBmcm9tIHRoZSBkaXNwYXRjaCBmdW5jdGlvbgotICAgIGlucHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJQb3NfKTsKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOwotICAgIC8vIFByZXBlbmQgZm91ciBieXRlcyBvZiBibGFuayBzcGFjZSB0byB0aGUgYnVmZmVyIHNvIHdlIGNhbgotICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgotICAgIG91dHB1dFRyYW5zcG9ydF8tPmdldFdyaXRlUHRyKDQpOwotICAgIG91dHB1dFRyYW5zcG9ydF8tPndyb3RlQnl0ZXMoNCk7Ci0KLSAgICBzZXJ2ZXJfLT5pbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0KLSAgICBpZiAoc2VydmVyXy0+aXNUaHJlYWRQb29sUHJvY2Vzc2luZygpKSB7Ci0gICAgICAvLyBXZSBhcmUgc2V0dGluZyB1cCBhIFRhc2sgdG8gZG8gdGhpcyB3b3JrIGFuZCB3ZSB3aWxsIHdhaXQgb24gaXQKLQotICAgICAgLy8gQ3JlYXRlIHRhc2sgYW5kIGRpc3BhdGNoIHRvIHRoZSB0aHJlYWQgbWFuYWdlcgotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPQotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4obmV3IFRhc2soc2VydmVyXy0+Z2V0UHJvY2Vzc29yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKLSAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBub3cgd2FpdGluZyBvbiB0aGUgdGFzayB0byBmaW5pc2gKLSAgICAgIGFwcFN0YXRlXyA9IEFQUF9XQUlUX1RBU0s7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBzZXJ2ZXJfLT5hZGRUYXNrKHRhc2spOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gJiBpc2UpIHsKLSAgICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgotICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKLSAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgIC8vIFNldCB0aGlzIGNvbm5lY3Rpb24gaWRsZSBzbyB0aGF0IGxpYmV2ZW50IGRvZXNuJ3QgcHJvY2VzcyBtb3JlCi0gICAgICAvLyBkYXRhIG9uIGl0IHdoaWxlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWRtYW5hZ2VyIHRvCi0gICAgICAvLyBmaW5pc2ggdGhpcyB0YXNrCi0gICAgICBzZXRJZGxlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIEludm9rZSB0aGUgcHJvY2Vzc29yCi0gICAgICAgIHNlcnZlcl8tPmdldFByb2Nlc3NvcigpLT5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIE5VTEwpOwotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmdHR4KSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRUcmFuc3BvcnRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgdHR4LndoYXQoKSk7Ci0gICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmeCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJURXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHgud2hhdCgpKTsKLSAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU2VydmVyOjpwcm9jZXNzKCkgdW5rbm93biBleGNlcHRpb24iKTsKLSAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotICAgICAgICBjbG9zZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSwgdGhlIGNhbGwgdG8gcHJvY2VzcyBoYXMgd3JpdHRlbiBpbnRvCi0gICAgLy8gdGhlIHdyaXRlQnVmZmVyXwotCi0gIGNhc2UgQVBQX1dBSVRfVEFTSzoKLSAgICAvLyBXZSBoYXZlIG5vdyBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgdGFzayBhbmQgdGhlIHJlc3VsdCBoYXMgYmVlbiB3cml0dGVuCi0gICAgLy8gaW50byB0aGUgb3V0cHV0VHJhbnNwb3J0Xywgc28gd2UgZ3JhYiBpdHMgY29udGVudHMgYW5kIHBsYWNlIHRoZW0gaW50bwotICAgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8gZm9yIGFjdHVhbCB3cml0aW5nIGJ5IHRoZSBsaWJldmVudCB0aHJlYWQKLQotICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0QnVmZmVyKCZ3cml0ZUJ1ZmZlcl8sICZ3cml0ZUJ1ZmZlclNpemVfKTsKLQotICAgIC8vIElmIHRoZSBmdW5jdGlvbiBjYWxsIGdlbmVyYXRlZCByZXR1cm4gZGF0YSwgdGhlbiBtb3ZlIGludG8gdGhlIHNlbmQKLSAgICAvLyBzdGF0ZSBhbmQgZ2V0IGdvaW5nCi0gICAgLy8gNCBieXRlcyB3ZXJlIHJlc2VydmVkIGZvciBmcmFtZSBzaXplCi0gICAgaWYgKHdyaXRlQnVmZmVyU2l6ZV8gPiA0KSB7Ci0KLSAgICAgIC8vIE1vdmUgaW50byB3cml0ZSBzdGF0ZQotICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKLSAgICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9TRU5EOwotCi0gICAgICAvLyBQdXQgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgd3JpdGUgYnVmZmVyCi0gICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IChpbnQzMl90KWh0b25sKHdyaXRlQnVmZmVyU2l6ZV8gLSA0KTsKLSAgICAgIG1lbWNweSh3cml0ZUJ1ZmZlcl8sICZmcmFtZVNpemUsIDQpOwotCi0gICAgICAvLyBTb2NrZXQgaW50byB3cml0ZSBtb2RlCi0gICAgICBhcHBTdGF0ZV8gPSBBUFBfU0VORF9SRVNVTFQ7Ci0gICAgICBzZXRXcml0ZSgpOwotCi0gICAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IGltbWVkaWF0ZWx5Ci0gICAgICAvLyB3b3JrU29ja2V0KCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXF1ZXN0IHdhcyBvbmV3YXkgYW5kIHdlIHNob3VsZCBmYWxsIHRocm91Z2gKLSAgICAvLyByaWdodCBiYWNrIGludG8gdGhlIHJlYWQgZnJhbWUgaGVhZGVyIHN0YXRlCi0gICAgZ290byBMQUJFTF9BUFBfSU5JVDsKLQotICBjYXNlIEFQUF9TRU5EX1JFU1VMVDoKLSAgICAvLyBpdCdzIG5vdyBzYWZlIHRvIHBlcmZvcm0gYnVmZmVyIHNpemUgaG91c2VrZWVwaW5nLgotICAgIGlmICh3cml0ZUJ1ZmZlclNpemVfID4gbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8pIHsKLSAgICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gd3JpdGVCdWZmZXJTaXplXzsKLSAgICB9Ci0gICAgaWYgKHNlcnZlcl8tPmdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpID4gMAotICAgICAgICAmJiArK2NhbGxzRm9yUmVzaXplXyA+PSBzZXJ2ZXJfLT5nZXRSZXNpemVCdWZmZXJFdmVyeU4oKSkgewotICAgICAgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2VydmVyXy0+Z2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyXy0+Z2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoKSk7Ci0gICAgICBjYWxsc0ZvclJlc2l6ZV8gPSAwOwotICAgIH0KLQotICAgIC8vIE4uQi46IFdlIGFsc28gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSBpbnRvIHRoZSBJTklUIHN0YXRlIQotCi0gIExBQkVMX0FQUF9JTklUOgotICBjYXNlIEFQUF9JTklUOgotCi0gICAgLy8gQ2xlYXIgd3JpdGUgYnVmZmVyIHZhcmlhYmxlcwotICAgIHdyaXRlQnVmZmVyXyA9IE5VTEw7Ci0gICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKLSAgICB3cml0ZUJ1ZmZlclNpemVfID0gMDsKLQotICAgIC8vIEludG8gcmVhZDQgc3RhdGUgd2UgZ28KLSAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVl9GUkFNSU5HOwotICAgIGFwcFN0YXRlXyA9IEFQUF9SRUFEX0ZSQU1FX1NJWkU7Ci0KLSAgICByZWFkQnVmZmVyUG9zXyA9IDA7Ci0KLSAgICAvLyBSZWdpc3RlciByZWFkIGV2ZW50Ci0gICAgc2V0UmVhZCgpOwotCi0gICAgLy8gVHJ5IHRvIHdvcmsgdGhlIHNvY2tldCByaWdodCBhd2F5Ci0gICAgLy8gd29ya1NvY2tldCgpOwotCi0gICAgcmV0dXJuOwotCi0gIGNhc2UgQVBQX1JFQURfRlJBTUVfU0laRToKLSAgICAvLyBXZSBqdXN0IHJlYWQgdGhlIHJlcXVlc3QgbGVuZ3RoCi0gICAgLy8gRG91YmxlIHRoZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoCi0gICAgaWYgKHJlYWRXYW50XyA+IHJlYWRCdWZmZXJTaXplXykgewotICAgICAgaWYgKHJlYWRCdWZmZXJTaXplXyA9PSAwKSB7Ci0gICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDE7Ci0gICAgICB9Ci0gICAgICB1aW50MzJfdCBuZXdTaXplID0gcmVhZEJ1ZmZlclNpemVfOwotICAgICAgd2hpbGUgKHJlYWRXYW50XyA+IG5ld1NpemUpIHsKLSAgICAgICAgbmV3U2l6ZSAqPSAyOwotICAgICAgfQotCi0gICAgICB1aW50OF90KiBuZXdCdWZmZXIgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJlYWRCdWZmZXJfLCBuZXdTaXplKTsKLSAgICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAvLyBub3RoaW5nIGVsc2UgdG8gYmUgZG9uZS4uLgotICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgICAgfQotICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXdCdWZmZXI7Ci0gICAgICByZWFkQnVmZmVyU2l6ZV8gPSBuZXdTaXplOwotICAgIH0KLQotICAgIHJlYWRCdWZmZXJQb3NfPSAwOwotCi0gICAgLy8gTW92ZSBpbnRvIHJlYWQgcmVxdWVzdCBzdGF0ZQotICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWOwotICAgIGFwcFN0YXRlXyA9IEFQUF9SRUFEX1JFUVVFU1Q7Ci0KLSAgICAvLyBXb3JrIHRoZSBzb2NrZXQgcmlnaHQgYXdheQotICAgIC8vIHdvcmtTb2NrZXQoKTsKLQotICAgIHJldHVybjsKLQotICBjYXNlIEFQUF9DTE9TRV9DT05ORUNUSU9OOgotICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICBjbG9zZSgpOwotICAgIHJldHVybjsKLQotICBkZWZhdWx0OgotICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgQXBwbGljYXRpb24gU3RhdGUgJWQiLCBhcHBTdGF0ZV8pOwotICAgIGFzc2VydCgwKTsKLSAgfQotfQotCi12b2lkIFRDb25uZWN0aW9uOjpzZXRGbGFncyhzaG9ydCBldmVudEZsYWdzKSB7Ci0gIC8vIENhdGNoIHRoZSBkbyBub3RoaW5nIGNhc2UKLSAgaWYgKGV2ZW50RmxhZ3NfID09IGV2ZW50RmxhZ3MpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBEZWxldGUgYSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50Ci0gIGlmIChldmVudEZsYWdzXyAhPSAwKSB7Ci0gICAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MgZXZlbnRfZGVsIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gVXBkYXRlIGluIG1lbW9yeSBzdHJ1Y3R1cmUKLSAgZXZlbnRGbGFnc18gPSBldmVudEZsYWdzOwotCi0gIC8vIERvIG5vdCBjYWxsIGV2ZW50X3NldCBpZiB0aGVyZSBhcmUgbm8gZmxhZ3MKLSAgaWYgKCFldmVudEZsYWdzXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8qCi0gICAqIGV2ZW50X3NldDoKLSAgICoKLSAgICogUHJlcGFyZXMgdGhlIGV2ZW50IHN0cnVjdHVyZSAmZXZlbnQgdG8gYmUgdXNlZCBpbiBmdXR1cmUgY2FsbHMgdG8KLSAgICogZXZlbnRfYWRkKCkgYW5kIGV2ZW50X2RlbCgpLiAgVGhlIGV2ZW50IHdpbGwgYmUgcHJlcGFyZWQgdG8gY2FsbCB0aGUKLSAgICogZXZlbnRIYW5kbGVyIHVzaW5nIHRoZSAnc29jaycgZmlsZSBkZXNjcmlwdG9yIHRvIG1vbml0b3IgZXZlbnRzLgotICAgKgotICAgKiBUaGUgZXZlbnRzIGNhbiBiZSBlaXRoZXIgRVZfUkVBRCwgRVZfV1JJVEUsIG9yIGJvdGgsIGluZGljYXRpbmcKLSAgICogdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gcmVhZCBvciB3cml0ZSBmcm9tIHRoZSBmaWxlIHJlc3BlY3RpdmVseSB3aXRob3V0Ci0gICAqIGJsb2NraW5nLgotICAgKgotICAgKiBUaGUgZXZlbnRIYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHRyaWdnZXJlZAotICAgKiB0aGUgZXZlbnQgYW5kIHRoZSB0eXBlIG9mIGV2ZW50IHdoaWNoIHdpbGwgYmUgb25lIG9mOiBFVl9USU1FT1VULAotICAgKiBFVl9TSUdOQUwsIEVWX1JFQUQsIEVWX1dSSVRFLgotICAgKgotICAgKiBUaGUgYWRkaXRpb25hbCBmbGFnIEVWX1BFUlNJU1QgbWFrZXMgYW4gZXZlbnRfYWRkKCkgcGVyc2lzdGVudCB1bnRpbAotICAgKiBldmVudF9kZWwoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAqCi0gICAqIE9uY2UgaW5pdGlhbGl6ZWQsIHRoZSAmZXZlbnQgc3RydWN0IGNhbiBiZSB1c2VkIHJlcGVhdGVkbHkgd2l0aAotICAgKiBldmVudF9hZGQoKSBhbmQgZXZlbnRfZGVsKCkgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVpbml0aWFsaXplZCB1bmxlc3MKLSAgICogdGhlIGV2ZW50SGFuZGxlciBhbmQvb3IgdGhlIGFyZ3VtZW50IHRvIGl0IGFyZSB0byBiZSBjaGFuZ2VkLiAgSG93ZXZlciwKLSAgICogd2hlbiBhbiBldiBzdHJ1Y3R1cmUgaGFzIGJlZW4gYWRkZWQgdG8gbGliZXZlbnQgdXNpbmcgZXZlbnRfYWRkKCkgdGhlCi0gICAqIHN0cnVjdHVyZSBtdXN0IHBlcnNpc3QgdW50aWwgdGhlIGV2ZW50IG9jY3VycyAoYXNzdW1pbmcgRVZfUEVSU0lTVAotICAgKiBpcyBub3Qgc2V0KSBvciBpcyByZW1vdmVkIHVzaW5nIGV2ZW50X2RlbCgpLiAgWW91IG1heSBub3QgcmV1c2UgdGhlIHNhbWUKLSAgICogZXYgc3RydWN0dXJlIGZvciBtdWx0aXBsZSBtb25pdG9yZWQgZGVzY3JpcHRvcnM7IGVhY2ggZGVzY3JpcHRvciBuZWVkcwotICAgKiBpdHMgb3duIGV2LgotICAgKi8KLSAgZXZlbnRfc2V0KCZldmVudF8sIHRTb2NrZXRfLT5nZXRTb2NrZXRGRCgpLCBldmVudEZsYWdzXywKLSAgICAgICAgICAgIFRDb25uZWN0aW9uOjpldmVudEhhbmRsZXIsIHRoaXMpOwotICBldmVudF9iYXNlX3NldChzZXJ2ZXJfLT5nZXRFdmVudEJhc2UoKSwgJmV2ZW50Xyk7Ci0KLSAgLy8gQWRkIHRoZSBldmVudAotICBpZiAoZXZlbnRfYWRkKCZldmVudF8sIDApID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKTogY291bGQgbm90IGV2ZW50X2FkZCIpOwotICB9Ci19Ci0KLS8qKgotICogQ2xvc2VzIGEgY29ubmVjdGlvbgotICovCi12b2lkIFRDb25uZWN0aW9uOjpjbG9zZSgpIHsKLSAgLy8gRGVsZXRlIHRoZSByZWdpc3RlcmVkIGxpYmV2ZW50Ci0gIGlmIChldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6Y2xvc2UoKSBldmVudF9kZWwiLCBlcnJubyk7Ci0gIH0KLQotICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIHNvY2tldAotICB0U29ja2V0Xy0+Y2xvc2UoKTsKLQotICAvLyBjbG9zZSBhbnkgZmFjdG9yeSBwcm9kdWNlZCB0cmFuc3BvcnRzCi0gIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfLT5jbG9zZSgpOwotCi0gIC8vIEdpdmUgdGhpcyBvYmplY3QgYmFjayB0byB0aGUgc2VydmVyIHRoYXQgb3ducyBpdAotICBzZXJ2ZXJfLT5yZXR1cm5Db25uZWN0aW9uKHRoaXMpOwotfQotCi12b2lkIFRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdyaXRlTGltaXQpIHsKLSAgaWYgKHJlYWRMaW1pdCA+IDAgJiYgcmVhZEJ1ZmZlclNpemVfID4gcmVhZExpbWl0KSB7Ci0gICAgZnJlZShyZWFkQnVmZmVyXyk7Ci0gICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOwotICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7Ci0gIH0KLQotICBpZiAod3JpdGVMaW1pdCA+IDAgJiYgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPiB3cml0ZUxpbWl0KSB7Ci0gICAgLy8ganVzdCBzdGFydCBvdmVyCi0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoc2VydmVyXy0+Z2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpKTsKLSAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7Ci0gIH0KLX0KLQotVE5vbmJsb2NraW5nU2VydmVyOjp+VE5vbmJsb2NraW5nU2VydmVyKCkgewotICAvLyBUT0RPOiBXZSBjdXJyZW50bHkgbGVhayBhbnkgYWN0aXZlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gIC8vIFNpbmNlIHdlJ3JlIHNodXR0aW5nIGRvd24gYW5kIGRlc3Ryb3lpbmcgdGhlIGV2ZW50X2Jhc2UsIHRoZSBUQ29ubmVjdGlvbgotICAvLyBvYmplY3RzIHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbnkgYWRkaXRpb25hbCBjYWxsYmFja3MuICAoQW5kIGV2ZW4gaWYgdGhleQotICAvLyBkaWQsIGl0IHdvdWxkIGJlIGJhZCwgc2luY2UgdGhleSBrZWVwIGEgcG9pbnRlciBhcm91bmQgdG8gdGhlIHNlcnZlciwKLSAgLy8gd2hpY2ggaXMgYmVpbmcgZGVzdHJveWVkLikKLQotICAvLyBDbGVhbiB1cCB1bnVzZWQgVENvbm5lY3Rpb24gb2JqZWN0cyBpbiBjb25uZWN0aW9uU3RhY2tfCi0gIHdoaWxlICghY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7Ci0gICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOwotICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7Ci0gICAgZGVsZXRlIGNvbm5lY3Rpb247Ci0gIH0KLQotICBpZiAoZXZlbnRCYXNlXykgewotICAgIGV2ZW50X2Jhc2VfZnJlZShldmVudEJhc2VfKTsKLSAgfQotCi0gIGlmIChzZXJ2ZXJTb2NrZXRfID49IDApIHsKLSAgICBjbG9zZShzZXJ2ZXJTb2NrZXRfKTsKLSAgfQotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBlaXRoZXIgYnkgcmV1c2luZyBhbiBvYmplY3Qgb2ZmIHRoZSBzdGFjayBvcgotICogYnkgYWxsb2NhdGluZyBhIG5ldyBvbmUgZW50aXJlbHkKLSAqLwotVENvbm5lY3Rpb24qIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQ29ubmVjdGlvbihpbnQgc29ja2V0LCBzaG9ydCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKSB7Ci0gIC8vIENoZWNrIHRoZSBzdGFjawotICBpZiAoY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIG5ldyBUQ29ubmVjdGlvbihzb2NrZXQsIGZsYWdzLCB0aGlzLCBhZGRyLCBhZGRyTGVuKTsKLSAgfSBlbHNlIHsKLSAgICBUQ29ubmVjdGlvbiogcmVzdWx0ID0gY29ubmVjdGlvblN0YWNrXy50b3AoKTsKLSAgICBjb25uZWN0aW9uU3RhY2tfLnBvcCgpOwotICAgIHJlc3VsdC0+aW5pdChzb2NrZXQsIGZsYWdzLCB0aGlzLCBhZGRyLCBhZGRyTGVuKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gdGhlIHN0YWNrCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSB7Ci0gIGlmIChjb25uZWN0aW9uU3RhY2tMaW1pdF8gJiYKLSAgICAgIChjb25uZWN0aW9uU3RhY2tfLnNpemUoKSA+PSBjb25uZWN0aW9uU3RhY2tMaW1pdF8pKSB7Ci0gICAgZGVsZXRlIGNvbm5lY3Rpb247Ci0gIH0gZWxzZSB7Ci0gICAgY29ubmVjdGlvbi0+Y2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoaWRsZVJlYWRCdWZmZXJMaW1pdF8sIGlkbGVXcml0ZUJ1ZmZlckxpbWl0Xyk7Ci0gICAgY29ubmVjdGlvblN0YWNrXy5wdXNoKGNvbm5lY3Rpb24pOwotICB9Ci19Ci0KLS8qKgotICogU2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZyBjbGllbnQKLSAqIGNvbm5lY3Rpb25zIG9uIGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cyB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpoYW5kbGVFdmVudChpbnQgZmQsIHNob3J0IHdoaWNoKSB7Ci0gICh2b2lkKSB3aGljaDsKLSAgLy8gTWFrZSBzdXJlIHRoYXQgbGliZXZlbnQgZGlkbid0IG1lc3MgdXAgdGhlIHNvY2tldCBoYW5kbGVzCi0gIGFzc2VydChmZCA9PSBzZXJ2ZXJTb2NrZXRfKTsKLQotICAvLyBTZXJ2ZXIgc29ja2V0IGFjY2VwdGVkIGEgbmV3IGNvbm5lY3Rpb24KLSAgc29ja2xlbl90IGFkZHJMZW47Ci0gIHNvY2thZGRyX3N0b3JhZ2UgYWRkclN0b3JhZ2U7Ci0gIHNvY2thZGRyKiBhZGRycCA9IChzb2NrYWRkciopJmFkZHJTdG9yYWdlOwotICBhZGRyTGVuID0gc2l6ZW9mKGFkZHJTdG9yYWdlKTsKLQotICAvLyBHb2luZyB0byBhY2NlcHQgYSBuZXcgY2xpZW50IHNvY2tldAotICBpbnQgY2xpZW50U29ja2V0OwotCi0gIC8vIEFjY2VwdCBhcyBtYW55IG5ldyBjbGllbnRzIGFzIHBvc3NpYmxlLCBldmVuIHRob3VnaCBsaWJldmVudCBzaWduYWxlZCBvbmx5Ci0gIC8vIG9uZSwgdGhpcyBoZWxwcyB1cyB0byBhdm9pZCBoYXZpbmcgdG8gZ28gYmFjayBpbnRvIHRoZSBsaWJldmVudCBlbmdpbmUgc28KLSAgLy8gbWFueSB0aW1lcwotICB3aGlsZSAoKGNsaWVudFNvY2tldCA9IDo6YWNjZXB0KGZkLCBhZGRycCwgJmFkZHJMZW4pKSAhPSAtMSkgewotICAgIC8vIElmIHdlJ3JlIG92ZXJsb2FkZWQsIHRha2UgYWN0aW9uIGhlcmUKLSAgICBpZiAob3ZlcmxvYWRBY3Rpb25fICE9IFRfT1ZFUkxPQURfTk9fQUNUSU9OICYmIHNlcnZlck92ZXJsb2FkZWQoKSkgewotICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKLSAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8rKzsKLSAgICAgIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQpIHsKLSAgICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFKSB7Ci0gICAgICAgIGlmICghZHJhaW5QZW5kaW5nVGFzaygpKSB7Ci0gICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRpc2NhcmQsIHNvIHdlIGRyb3AgY29ubmVjdGlvbiBpbnN0ZWFkLgotICAgICAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaWYgKChmbGFncyA9IGZjbnRsKGNsaWVudFNvY2tldCwgRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgICBmY250bChjbGllbnRTb2NrZXQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPCAwKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBPX05PTkJMT0NLIChmY250bCkgIiwgZXJybm8pOwotICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSBuZXcgVENvbm5lY3Rpb24gZm9yIHRoaXMgY2xpZW50IHNvY2tldC4KLSAgICBUQ29ubmVjdGlvbiogY2xpZW50Q29ubmVjdGlvbiA9Ci0gICAgICBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCwgRVZfUkVBRCB8IEVWX1BFUlNJU1QsIGFkZHJwLCBhZGRyTGVuKTsKLQotICAgIC8vIEZhaWwgZmFzdCBpZiB3ZSBjb3VsZCBub3QgY3JlYXRlIGEgVENvbm5lY3Rpb24gb2JqZWN0Ci0gICAgaWYgKGNsaWVudENvbm5lY3Rpb24gPT0gTlVMTCkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBmYWlsZWQgVENvbm5lY3Rpb24gZmFjdG9yeSIpOwotICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBQdXQgdGhpcyBjbGllbnQgY29ubmVjdGlvbiBpbnRvIHRoZSBwcm9wZXIgc3RhdGUKLSAgICBjbGllbnRDb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7Ci0KLSAgICAvLyBhZGRyTGVuIGlzIHdyaXR0ZW4gYnkgdGhlIGFjY2VwdCgpIGNhbGwsIHNvIG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgdGhlIG5leHQgY2FsbC4KLSAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHJTdG9yYWdlKTsKLSAgfQotCi0gIC8vIERvbmUgbG9vcGluZyBhY2NlcHQsIG5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgZXJyb3IgaXMgZHVlIHRvCi0gIC8vIGJsb2NraW5nLiBBbnkgb3RoZXIgZXJyb3IgaXMgYSBwcm9ibGVtCi0gIGlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0spIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IGFjY2VwdCgpICIsIGVycm5vKTsKLSAgfQotfQotCi0vKioKLSAqIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6Omxpc3RlblNvY2tldCgpIHsKLSAgaW50IHM7Ci0gIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7Ci0gIGludCBlcnJvcjsKLQotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNiIpICsgMV07Ci0gIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7Ci0gIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0gIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7Ci0gIHNwcmludGYocG9ydCwgIiVkIiwgcG9ydF8pOwotCi0gIC8vIFdpbGRjYXJkIGFkZHJlc3MKLSAgZXJyb3IgPSBnZXRhZGRyaW5mbyhOVUxMLCBwb3J0LCAmaGludHMsICZyZXMwKTsKLSAgaWYgKGVycm9yKSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9ICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgZ2V0YWRkcmluZm8gIiArIHN0cmluZyhnYWlfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCi0gIC8vIGludG8gaXB2NiBzcGFjZS4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gIHMgPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwotICBpZiAocyA9PSAtMSkgewotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgc29ja2V0KCkgLTEiKTsKLSAgfQotCi0gICNpZmRlZiBJUFY2X1Y2T05MWQotICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBpbnQgemVybyA9IDA7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQocywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJnplcm8sIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkiKTsKLSAgICB9Ci0gIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0KLSAgaW50IG9uZSA9IDE7Ci0KLSAgLy8gU2V0IHJldXNlYWRkciB0byBhdm9pZCAyTVNMIGRlbGF5IG9uIHNlcnZlciByZXN0YXJ0Ci0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb25lLCBzaXplb2Yob25lKSk7Ci0KLSAgaWYgKGJpbmQocywgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pID09IC0xKSB7Ci0gICAgY2xvc2Uocyk7Ci0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBiaW5kIik7Ci0gIH0KLQotICAvLyBEb25lIHdpdGggdGhlIGFkZHIgaW5mbwotICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0KLSAgLy8gU2V0IHVwIHRoaXMgZmlsZSBkZXNjcmlwdG9yIGZvciBsaXN0ZW5pbmcKLSAgbGlzdGVuU29ja2V0KHMpOwotfQotCi0vKioKLSAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgbGlzdGVuU29ja2V0KCkgYW5kIHNldHMgdmFyaW91cyBvcHRpb25zIG9uIGl0Ci0gKiB0byBwcmVwYXJlIGZvciB1c2UgaW4gdGhlIHNlcnZlci4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6Omxpc3RlblNvY2tldChpbnQgcykgewotICAvLyBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nIG1vZGUKLSAgaW50IGZsYWdzOwotICBpZiAoKGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgZmNudGwocywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA8IDApIHsKLSAgICBjbG9zZShzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgT19OT05CTE9DSyIpOwotICB9Ci0KLSAgaW50IG9uZSA9IDE7Ci0gIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKLQotICAvLyBLZWVwYWxpdmUgdG8gZW5zdXJlIGZ1bGwgcmVzdWx0IGZsdXNoaW5nCi0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmb25lLCBzaXplb2Yob25lKSk7Ci0KLSAgLy8gVHVybiBsaW5nZXIgb2ZmIHRvIGF2b2lkIGh1bmcgc29ja2V0cwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgJmxpbmcsIHNpemVvZihsaW5nKSk7Ci0KLSAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjawotICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKLSAgI2lmbmRlZiBUQ1BfTk9QVVNICi0gIHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmb25lLCBzaXplb2Yob25lKSk7Ci0gICNlbmRpZgotCi0gICNpZmRlZiBUQ1BfTE9XX01JTl9SVE8KLSAgaWYgKFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpKSB7Ci0gICAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX0xPV19NSU5fUlRPLCAmb25lLCBzaXplb2Yob25lKSk7Ci0gIH0KLSAgI2VuZGlmCi0KLSAgaWYgKGxpc3RlbihzLCBMSVNURU5fQkFDS0xPRykgPT0gLTEpIHsKLSAgICBjbG9zZShzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgbGlzdGVuIik7Ci0gIH0KLQotICAvLyBDb29sLCB0aGlzIHNvY2tldCBpcyBnb29kIHRvIGdvLCBzZXQgaXQgYXMgdGhlIHNlcnZlclNvY2tldF8KLSAgc2VydmVyU29ja2V0XyA9IHM7Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgewotICBpZiAocGlwZShub3RpZmljYXRpb25QaXBlRkRzXykgIT0gMCkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSAiLCBlcnJubyk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJjYW4ndCBjcmVhdGUgbm90aWZpY2F0aW9uIHBpcGUiKTsKLSAgfQotICBpbnQgZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgPSBmY250bChub3RpZmljYXRpb25QaXBlRkRzX1swXSwgRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgZmNudGwobm90aWZpY2F0aW9uUGlwZUZEc19bMF0sIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPCAwKSB7Ci0gICAgY2xvc2Uobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pOwotICAgIGNsb3NlKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSBPX05PTkJMT0NLIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZWdpc3RlciB0aGUgY29yZSBsaWJldmVudCBldmVudHMgb250byB0aGUgcHJvcGVyIGJhc2UuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZWdpc3RlckV2ZW50cyhldmVudF9iYXNlKiBiYXNlKSB7Ci0gIGFzc2VydChzZXJ2ZXJTb2NrZXRfICE9IC0xKTsKLSAgYXNzZXJ0KCFldmVudEJhc2VfKTsKLSAgZXZlbnRCYXNlXyA9IGJhc2U7Ci0KLSAgLy8gUHJpbnQgc29tZSBsaWJldmVudCBzdGF0cwotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJsaWJldmVudCAlcyBtZXRob2QgJXMiLAotICAgICAgICAgIGV2ZW50X2dldF92ZXJzaW9uKCksCi0gICAgICAgICAgZXZlbnRfZ2V0X21ldGhvZCgpKTsKLQotICAvLyBSZWdpc3RlciB0aGUgc2VydmVyIGV2ZW50Ci0gIGV2ZW50X3NldCgmc2VydmVyRXZlbnRfLAotICAgICAgICAgICAgc2VydmVyU29ja2V0XywKLSAgICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNULAotICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyOjpldmVudEhhbmRsZXIsCi0gICAgICAgICAgICB0aGlzKTsKLSAgZXZlbnRfYmFzZV9zZXQoZXZlbnRCYXNlXywgJnNlcnZlckV2ZW50Xyk7Ci0KLSAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgotICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZzZXJ2ZXJFdmVudF8sIDApKSB7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiBjb3VsdCBub3QgZXZlbnRfYWRkIik7Ci0gIH0KLSAgaWYgKHRocmVhZFBvb2xQcm9jZXNzaW5nXykgewotICAgIC8vIENyZWF0ZSBhbiBldmVudCB0byBiZSBub3RpZmllZCB3aGVuIGEgdGFzayBmaW5pc2hlcwotICAgIGV2ZW50X3NldCgmbm90aWZpY2F0aW9uRXZlbnRfLAotICAgICAgICAgICAgICBnZXROb3RpZmljYXRpb25SZWN2RkQoKSwKLSAgICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QsCi0gICAgICAgICAgICAgIFRDb25uZWN0aW9uOjp0YXNrSGFuZGxlciwKLSAgICAgICAgICAgICAgdGhpcyk7Ci0KLSAgICAvLyBBdHRhY2ggdG8gdGhlIGJhc2UKLSAgICBldmVudF9iYXNlX3NldChldmVudEJhc2VfLCAmbm90aWZpY2F0aW9uRXZlbnRfKTsKLQotICAgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKLSAgICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZub3RpZmljYXRpb25FdmVudF8sIDApKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6IG5vdGlmaWNhdGlvbiBldmVudF9hZGQgZmFpbCIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7Ci0gIHRocmVhZE1hbmFnZXJfID0gdGhyZWFkTWFuYWdlcjsKLSAgaWYgKHRocmVhZE1hbmFnZXIgIT0gTlVMTCkgewotICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKHN0ZDo6dHIxOjpiaW5kKCZUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlLCB0aGlzLCBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSkpOwotICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCAgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZXJPdmVybG9hZGVkKCkgewotICBzaXplX3QgYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1UQ29ubmVjdGlvbnNfIC0gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7Ci0gIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IG1heEFjdGl2ZVByb2Nlc3NvcnNfIHx8Ci0gICAgICBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgewotICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdCBub24tYmxvY2tpbmcgc2VydmVyIG92ZXJsb2FkIGNvbmRpdGlvbiIpOwotICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAob3ZlcmxvYWRlZF8gJiYKLSAgICAgICAgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykgJiYKLSAgICAgICAgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ0aHJpZnQgbm9uLWJsb2NraW5nIHNlcnZlciBvdmVybG9hZCBlbmRlZDsgJXUgZHJvcHBlZCAoJWxsdSB0b3RhbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyk7Ci0gICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7Ci0gICAgICBvdmVybG9hZGVkXyA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBvdmVybG9hZGVkXzsKLX0KLQotYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmRyYWluUGVuZGluZ1Rhc2soKSB7Ci0gIGlmICh0aHJlYWRNYW5hZ2VyXykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7Ci0gICAgaWYgKHRhc2spIHsKLSAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKLSAgICAgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpCi0gICAgICAgICAgICAgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKLSAgICAgIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9Ci0gICAgc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKLSAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkKLQkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKLSAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwotfQotCi0vKioKLSAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZAotICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgewotICAvLyBJbml0IHNvY2tldAotICBsaXN0ZW5Tb2NrZXQoKTsKLQotICBpZiAodGhyZWFkUG9vbFByb2Nlc3NpbmdfKSB7Ci0gICAgLy8gSW5pdCB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIHBpcGUKLSAgICBjcmVhdGVOb3RpZmljYXRpb25QaXBlKCk7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIGxpYmV2ZW50IGNvcmUKLSAgcmVnaXN0ZXJFdmVudHMoc3RhdGljX2Nhc3Q8ZXZlbnRfYmFzZSo+KGV2ZW50X2luaXQoKSkpOwotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7Ci0gIH0KLQotICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgotICBldmVudF9iYXNlX2xvb3AoZXZlbnRCYXNlXywgMCk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmggYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTJmMTAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGV2ZW50Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGNsYXNzCi1jbGFzcyBUQ29ubmVjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIHNlcnZlciBpbiBDKysgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgdGhhdCBvcGVyYXRlcyBhCi0gKiBzaW5nbGUgSU8gdGhyZWFkLiBJdCBhc3N1bWVzIHRoYXQgYWxsIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcmFtZWQgd2l0aCBhCi0gKiA0IGJ5dGUgbGVuZ3RoIGluZGljYXRvciBhbmQgd3JpdGVzIG91dCByZXNwb25zZXMgdXNpbmcgdGhlIHNhbWUgZnJhbWluZy4KLSAqCi0gKiBJdCBkb2VzIG5vdCB1c2UgdGhlIFRTZXJ2ZXJUcmFuc3BvcnQgZnJhbWV3b3JrLCBidXQgcmF0aGVyIGhhcyBzb2NrZXQKLSAqIG9wZXJhdGlvbnMgaGFyZGNvZGVkIGZvciB1c2Ugd2l0aCBzZWxlY3QuCi0gKgotICovCi0KLQotLy8vIE92ZXJsb2FkIGNvbmRpdGlvbiBhY3Rpb25zLgotZW51bSBUT3ZlcmxvYWRBY3Rpb24gewotICBUX09WRVJMT0FEX05PX0FDVElPTiwgICAgICAgIC8vLzwgRG9uJ3QgaGFuZGxlIG92ZXJsb2FkICovCi0gIFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBULCAgLy8vPCBEcm9wIG5ldyBjb25uZWN0aW9ucyBpbW1lZGlhdGVseSAqLwotICBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUgIC8vLzwgRHJvcCBzb21lIHRhc2tzIGZyb20gaGVhZCBvZiB0YXNrIHF1ZXVlICovCi19OwotCi1jbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Ci0gcHJpdmF0ZToKLSAgLy8vIExpc3RlbiBiYWNrbG9nCi0gIHN0YXRpYyBjb25zdCBpbnQgTElTVEVOX0JBQ0tMT0cgPSAxMDI0OwotCi0gIC8vLyBEZWZhdWx0IGxpbWl0IG9uIHNpemUgb2YgaWRsZSBjb25uZWN0aW9uIHBvb2wKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBDT05ORUNUSU9OX1NUQUNLX0xJTUlUID0gMTAyNDsKLQotICAvLy8gRGVmYXVsdCBsaW1pdCBvbiB0b3RhbCBudW1iZXIgb2YgY29ubmVjdGVkIHNvY2tldHMKLSAgc3RhdGljIGNvbnN0IGludCBNQVhfQ09OTkVDVElPTlMgPSBJTlRfTUFYOwotCi0gIC8vLyBEZWZhdWx0IGxpbWl0IG9uIGNvbm5lY3Rpb25zIGluIGhhbmRsZXIvdGFzayBwcm9jZXNzaW5nCi0gIHN0YXRpYyBjb25zdCBpbnQgTUFYX0FDVElWRV9QUk9DRVNTT1JTID0gSU5UX01BWDsKLQotICAvLy8gRGVmYXVsdCBzaXplIG9mIHdyaXRlIGJ1ZmZlcgotICBzdGF0aWMgY29uc3QgaW50IFdSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkUgPSAxMDI0OwotCi0gIC8vLyBNYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgY29ubmVjdGlvbiAoMCA9IHVubGltaXRlZCkKLSAgc3RhdGljIGNvbnN0IGludCBJRExFX1JFQURfQlVGRkVSX0xJTUlUID0gMTAyNDsKLQotICAvLy8gTWF4aW11bSBzaXplIG9mIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBjb25uZWN0aW9uICgwID0gdW5saW1pdGVkKQotICBzdGF0aWMgY29uc3QgaW50IElETEVfV1JJVEVfQlVGRkVSX0xJTUlUID0gMTAyNDsKLQotICAvLy8gIyBvZiBjYWxscyBiZWZvcmUgcmVzaXppbmcgb3ZlcnNpemVkIGJ1ZmZlcnMgKDAgPSBjaGVjayBvbmx5IG9uIGNsb3NlKQotICBzdGF0aWMgY29uc3QgaW50IFJFU0laRV9CVUZGRVJfRVZFUllfTiA9IDUxMjsKLQotICAvLy8gU2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKLSAgaW50IHNlcnZlclNvY2tldF87Ci0KLSAgLy8vIFBvcnQgc2VydmVyIHJ1bnMgb24KLSAgaW50IHBvcnRfOwotCi0gIC8vLyBGb3IgcHJvY2Vzc2luZyB2aWEgdGhyZWFkIHBvb2wsIG1heSBiZSBOVUxMCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwotCi0gIC8vLyBJcyB0aHJlYWQgcG9vbCBwcm9jZXNzaW5nPwotICBib29sIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKLQotICAvLy8gVGhlIGV2ZW50IGJhc2UgZm9yIGxpYmV2ZW50Ci0gIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87Ci0KLSAgLy8vIEV2ZW50IHN0cnVjdCwgdXNlZCB3aXRoIGV2ZW50QmFzZV8gZm9yIGNvbm5lY3Rpb24gZXZlbnRzCi0gIHN0cnVjdCBldmVudCBzZXJ2ZXJFdmVudF87Ci0KLSAgLy8vIEV2ZW50IHN0cnVjdCwgdXNlZCB3aXRoIGV2ZW50QmFzZV8gZm9yIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24KLSAgc3RydWN0IGV2ZW50IG5vdGlmaWNhdGlvbkV2ZW50XzsKLQotICAvLy8gTnVtYmVyIG9mIFRDb25uZWN0aW9uIG9iamVjdCB3ZSd2ZSBjcmVhdGVkCi0gIHNpemVfdCBudW1UQ29ubmVjdGlvbnNfOwotCi0gIC8vLyBOdW1iZXIgb2YgQ29ubmVjdGlvbnMgcHJvY2Vzc2luZyBvciB3YWl0aW5nIHRvIHByb2Nlc3MKLSAgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnNfOwotCi0gIC8vLyBMaW1pdCBmb3IgaG93IG1hbnkgVENvbm5lY3Rpb24gb2JqZWN0cyB0byBjYWNoZQotICBzaXplX3QgY29ubmVjdGlvblN0YWNrTGltaXRfOwotCi0gIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCi0gIHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzXzsKLQotICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zCi0gIHNpemVfdCBtYXhDb25uZWN0aW9uc187Ci0KLSAgLy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBhbiB1bnBlcmZvcm1lZCB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgotICBpbnQ2NF90IHRhc2tFeHBpcmVUaW1lXzsKLQotICAvKioKLSAgICogSHlzdGVyZXNpcyBmb3Igb3ZlcmxvYWQgc3RhdGUuICBUaGlzIGlzIHRoZSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmxvYWQKLSAgICogdmFsdWUgdGhhdCBuZWVkcyB0byBiZSByZWFjaGVkIGJlZm9yZSB0aGUgb3ZlcmxvYWQgc3RhdGUgaXMgY2xlYXJlZDsKLSAgICogbXVzdCBiZSA8PSAxLjAuCi0gICAqLwotICBkb3VibGUgb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKLQotICAvLy8gQWN0aW9uIHRvIHRha2Ugd2hlbiB3ZSdyZSBvdmVybG9hZGVkLgotICBUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb25fOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyIGlzIGluaXRpYWxpemVkIChhbmQgd2hlbiBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gaXMgY2hlY2tlZAotICAgKiBhbmQgZm91bmQgdG8gYmUgZXhjZWVkZWQsIHJlaW5pdGlhbGl6ZWQpIHRvIHRoaXMgc2l6ZS4KLSAgICovCi0gIHNpemVfdCB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXzsKLQotICAvKioKLSAgICogTWF4IHJlYWQgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgVENvbm5lY3Rpb24uICBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKLSAgICogVENvbm5lY3Rpb24gaW50byBjb25uZWN0aW9uU3RhY2tfIG9yIG9uIGV2ZXJ5IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gY2FsbHMsCi0gICAqIHdlIHdpbGwgZnJlZSB0aGUgYnVmZmVyIChzdWNoIHRoYXQgaXQgd2lsbCBiZSByZWluaXRpYWxpemVkIGJ5IHRoZSBuZXh0Ci0gICAqIHJlY2VpdmVkIGZyYW1lKSBpZiBpdCBoYXMgZXhjZWVkZWQgdGhpcyBsaW1pdC4gIDAgZGlzYWJsZXMgdGhpcyBjaGVjay4KLSAgICovCi0gIHNpemVfdCBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLQotICAvKioKLSAgICogTWF4IHdyaXRlIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIGNvbm5lY3Rpb24uICBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKLSAgICogVENvbm5lY3Rpb24gaW50byBjb25uZWN0aW9uU3RhY2tfIG9yIG9uIGV2ZXJ5IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gY2FsbHMsCi0gICAqIHdlIGluc3VyZSB0aGF0IGl0cyB3cml0ZSBidWZmZXIgaXMgPD0gdG8gdGhpcyBzaXplOyBvdGhlcndpc2Ugd2UKLSAgICogcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZSBvZiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyBieXRlcyB0byBpbnN1cmUgdGhhdAotICAgKiBpZGxlIGNvbm5lY3Rpb25zIGRvbid0IGhvZyBtZW1vcnkuIDAgZGlzYWJsZXMgdGhpcyBjaGVjay4KLSAgICovCi0gIHNpemVfdCBpZGxlV3JpdGVCdWZmZXJMaW1pdF87Ci0KLSAgLyoqCi0gICAqIEV2ZXJ5IE4gY2FsbHMgd2UgY2hlY2sgdGhlIGJ1ZmZlciBzaXplIGxpbWl0cyBvbiBhIGNvbm5lY3RlZCBUQ29ubmVjdGlvbi4KLSAgICogMCBkaXNhYmxlcyAoaS5lLiB0aGUgY2hlY2tzIGFyZSBvbmx5IGRvbmUgd2hlbiBhIGNvbm5lY3Rpb24gY2xvc2VzKS4KLSAgICovCi0gIGludDMyX3QgcmVzaXplQnVmZmVyRXZlcnlOXzsKLQotICAvLy8gU2V0IGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gYW4gb3ZlcmxvYWRlZCBzdGF0ZS4KLSAgYm9vbCBvdmVybG9hZGVkXzsKLQotICAvLy8gQ291bnQgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBzaW5jZSBvdmVybG9hZCBzdGFydGVkCi0gIHVpbnQzMl90IG5Db25uZWN0aW9uc0Ryb3BwZWRfOwotCi0gIC8vLyBDb3VudCBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIG9uIG92ZXJsb2FkIHNpbmNlIHNlcnZlciBzdGFydGVkCi0gIHVpbnQ2NF90IG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF87Ci0KLSAgLy8vIEZpbGUgZGVzY3JpcHRvcnMgZm9yIHBpcGUgdXNlZCBmb3IgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KLSAgaW50IG5vdGlmaWNhdGlvblBpcGVGRHNfWzJdOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGEgc3RhY2sgb2YgYWxsIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnV0IHRoYXQKLSAgICogYXJlIE5PVCBjdXJyZW50bHkgaW4gdXNlLiBXaGVuIHdlIGNsb3NlIGEgY29ubmVjdGlvbiwgd2UgcGxhY2UgaXQgb24gdGhpcwotICAgKiBzdGFjayBzbyB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIHJldXNlZCBsYXRlciwgcmF0aGVyIHRoYW4gZnJlZWluZyB0aGUKLSAgICogbWVtb3J5IGFuZCByZWFsbG9jYXRpbmcgYSBuZXcgb2JqZWN0IGxhdGVyLgotICAgKi8KLSAgc3RkOjpzdGFjazxUQ29ubmVjdGlvbio+IGNvbm5lY3Rpb25TdGFja187Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHNlcnZlciBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBXZSBhY2NlcHQgYWxsIHdhaXRpbmcKLSAgICogY2xpZW50IGNvbm5lY3Rpb25zIG9uIGxpc3RlbiBzb2NrZXQgZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzCi0gICAqIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KLSAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBsaXN0ZW4gc29ja2V0LgotICAgKiBAcGFyYW0gd2hpY2ggdGhlIGV2ZW50IGZsYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIuCi0gICAqLwotICB2b2lkIGhhbmRsZUV2ZW50KGludCBmZCwgc2hvcnQgd2hpY2gpOwotCi0gcHVibGljOgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvciksCi0gICAgc2VydmVyU29ja2V0XygtMSksCi0gICAgcG9ydF8ocG9ydCksCi0gICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfKGZhbHNlKSwKLSAgICBldmVudEJhc2VfKE5VTEwpLAotICAgIG51bVRDb25uZWN0aW9uc18oMCksCi0gICAgbnVtQWN0aXZlUHJvY2Vzc29yc18oMCksCi0gICAgY29ubmVjdGlvblN0YWNrTGltaXRfKENPTk5FQ1RJT05fU1RBQ0tfTElNSVQpLAotICAgIG1heEFjdGl2ZVByb2Nlc3NvcnNfKE1BWF9BQ1RJVkVfUFJPQ0VTU09SUyksCi0gICAgbWF4Q29ubmVjdGlvbnNfKE1BWF9DT05ORUNUSU9OUyksCi0gICAgdGFza0V4cGlyZVRpbWVfKDApLAotICAgIG92ZXJsb2FkSHlzdGVyZXNpc18oMC44KSwKLSAgICBvdmVybG9hZEFjdGlvbl8oVF9PVkVSTE9BRF9OT19BQ1RJT04pLAotICAgIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfKFdSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkUpLAotICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfKElETEVfUkVBRF9CVUZGRVJfTElNSVQpLAotICAgIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyhJRExFX1dSSVRFX0JVRkZFUl9MSU1JVCksCi0gICAgcmVzaXplQnVmZmVyRXZlcnlOXyhSRVNJWkVfQlVGRkVSX0VWRVJZX04pLAotICAgIG92ZXJsb2FkZWRfKGZhbHNlKSwKLSAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXygwKSwKLSAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKDApIHt9Ci0KLSAgVE5vbmJsb2NraW5nU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvciksCi0gICAgc2VydmVyU29ja2V0XygtMSksCi0gICAgcG9ydF8ocG9ydCksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgZXZlbnRCYXNlXyhOVUxMKSwKLSAgICBudW1UQ29ubmVjdGlvbnNfKDApLAotICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfKDApLAotICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyhDT05ORUNUSU9OX1NUQUNLX0xJTUlUKSwKLSAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyhNQVhfQUNUSVZFX1BST0NFU1NPUlMpLAotICAgIG1heENvbm5lY3Rpb25zXyhNQVhfQ09OTkVDVElPTlMpLAotICAgIHRhc2tFeHBpcmVUaW1lXygwKSwKLSAgICBvdmVybG9hZEh5c3RlcmVzaXNfKDAuOCksCi0gICAgb3ZlcmxvYWRBY3Rpb25fKFRfT1ZFUkxPQURfTk9fQUNUSU9OKSwKLSAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyhXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFKSwKLSAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0XyhJRExFX1JFQURfQlVGRkVSX0xJTUlUKSwKLSAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdF8oSURMRV9XUklURV9CVUZGRVJfTElNSVQpLAotICAgIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8oUkVTSVpFX0JVRkZFUl9FVkVSWV9OKSwKLSAgICBvdmVybG9hZGVkXyhmYWxzZSksCi0gICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8oMCksCi0gICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXygwKSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKLSAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwotICB9Ci0KLSAgVE5vbmJsb2NraW5nU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJTb2NrZXRfKC0xKSwKLSAgICBwb3J0Xyhwb3J0KSwKLSAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgICBldmVudEJhc2VfKE5VTEwpLAotICAgIG51bVRDb25uZWN0aW9uc18oMCksCi0gICAgbnVtQWN0aXZlUHJvY2Vzc29yc18oMCksCi0gICAgY29ubmVjdGlvblN0YWNrTGltaXRfKENPTk5FQ1RJT05fU1RBQ0tfTElNSVQpLAotICAgIG1heEFjdGl2ZVByb2Nlc3NvcnNfKE1BWF9BQ1RJVkVfUFJPQ0VTU09SUyksCi0gICAgbWF4Q29ubmVjdGlvbnNfKE1BWF9DT05ORUNUSU9OUyksCi0gICAgdGFza0V4cGlyZVRpbWVfKDApLAotICAgIG92ZXJsb2FkSHlzdGVyZXNpc18oMC44KSwKLSAgICBvdmVybG9hZEFjdGlvbl8oVF9PVkVSTE9BRF9OT19BQ1RJT04pLAotICAgIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfKFdSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkUpLAotICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfKElETEVfUkVBRF9CVUZGRVJfTElNSVQpLAotICAgIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyhJRExFX1dSSVRFX0JVRkZFUl9MSU1JVCksCi0gICAgcmVzaXplQnVmZmVyRXZlcnlOXyhSRVNJWkVfQlVGRkVSX0VWRVJZX04pLAotICAgIG92ZXJsb2FkZWRfKGZhbHNlKSwKLSAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXygwKSwKLSAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKDApIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGlucHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkob3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwotICB9Ci0KLSAgflROb25ibG9ja2luZ1NlcnZlcigpOwotCi0gIHZvaWQgc2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgewotICAgIHJldHVybiB0aHJlYWRNYW5hZ2VyXzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVudXNlZCBUQ29ubmVjdGlvbiB3ZSB3aWxsIGhvbGQgaW4gcmVzZXJ2ZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY3VycmVudCBsaW1pdCBvbiBUQ29ubmVjdGlvbiBwb29sIHNpemUuCi0gICAqLwotICBzaXplX3QgZ2V0Q29ubmVjdGlvblN0YWNrTGltaXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25TdGFja0xpbWl0XzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVudXNlZCBUQ29ubmVjdGlvbiB3ZSB3aWxsIGhvbGQgaW4gcmVzZXJ2ZS4KLSAgICoKLSAgICogQHBhcmFtIHN6IHRoZSBuZXcgbGltaXQgZm9yIFRDb25uZWN0aW9uIHBvb2wgc2l6ZS4KLSAgICovCi0gIHZvaWQgc2V0Q29ubmVjdGlvblN0YWNrTGltaXQoc2l6ZV90IHN6KSB7Ci0gICAgY29ubmVjdGlvblN0YWNrTGltaXRfID0gc3o7Ci0gIH0KLQotICBib29sIGlzVGhyZWFkUG9vbFByb2Nlc3NpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKLSAgfQotCi0gIHZvaWQgYWRkVGFzayhib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAgIHRocmVhZE1hbmFnZXJfLT5hZGQodGFzaywgMExMLCB0YXNrRXhwaXJlVGltZV8pOwotICB9Ci0KLSAgZXZlbnRfYmFzZSogZ2V0RXZlbnRCYXNlKCkgY29uc3QgewotICAgIHJldHVybiBldmVudEJhc2VfOwotICB9Ci0KLSAgLy8vIEluY3JlbWVudCBvdXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KLSAgdm9pZCBpbmNyZW1lbnROdW1Db25uZWN0aW9ucygpIHsKLSAgICArK251bVRDb25uZWN0aW9uc187Ci0gIH0KLQotICAvLy8gRGVjcmVtZW50IG91ciBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBzb2NrZXRzLgotICB2b2lkIGRlY3JlbWVudE51bUNvbm5lY3Rpb25zKCkgewotICAgIC0tbnVtVENvbm5lY3Rpb25zXzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIHNvY2tldHMgY3VycmVudGx5IGNvbm5lY3RlZCB0by4KLSAgICoKLSAgICogQHJldHVybiBjb3VudCBvZiBjb25uZWN0ZWQgc29ja2V0cy4KLSAgICovCi0gIHNpemVfdCBnZXROdW1Db25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtVENvbm5lY3Rpb25zXzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIGNvbm5lY3Rpb24gb2JqZWN0cyBhbGxvY2F0ZWQgYnV0IG5vdCBpbiB1c2UuCi0gICAqCi0gICAqIEByZXR1cm4gY291bnQgb2YgaWRsZSBjb25uZWN0aW9uIG9iamVjdHMuCi0gICAqLwotICBzaXplX3QgZ2V0TnVtSWRsZUNvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBjb25uZWN0aW9uU3RhY2tfLnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gY291bnQgb2YgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KLSAgICogVGhpcyBpcyBkZWZpbmVkIGFzIGEgY29ubmVjdGlvbiB3aGVyZSBhbGwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBhbmQKLSAgICogZWl0aGVyIGFzc2lnbmVkIGEgdGFzayAod2hlbiB0aHJlYWRpbmcpIG9yIHBhc3NlZCB0byBhIGhhbmRsZXIgKHdoZW4KLSAgICogbm90IHRocmVhZGluZyksIGFuZCB3aGVyZSB0aGUgaGFuZGxlciBoYXMgbm90IHlldCByZXR1cm5lZC4KLSAgICoKLSAgICogQHJldHVybiAjIG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgotICAgKi8KLSAgc2l6ZV90IGdldE51bUFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bUFjdGl2ZVByb2Nlc3NvcnNfOwotICB9Ci0KLSAgLy8vIEluY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCi0gIHZvaWQgaW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKLSAgICArK251bUFjdGl2ZVByb2Nlc3NvcnNfOwotICB9Ci0KLSAgLy8vIERlY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCi0gIHZvaWQgZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKLSAgICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiAwKSB7Ci0gICAgICAtLW51bUFjdGl2ZVByb2Nlc3NvcnNfOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGJlZm9yZSBvdmVybG9hZC4KLSAgICoKLSAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCi0gICAqLwotICBzaXplX3QgZ2V0TWF4Q29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1heENvbm5lY3Rpb25zXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGJlZm9yZSBvdmVybG9hZC4KLSAgICoKLSAgICogQHBhcmFtIG1heENvbm5lY3Rpb25zIG5ldyBzZXR0aW5nIGZvciBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMuCi0gICAqLwotICB2b2lkIHNldE1heENvbm5lY3Rpb25zKHNpemVfdCBtYXhDb25uZWN0aW9ucykgewotICAgIG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KLSAgICoKLSAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCi0gICAqLwotICBzaXplX3QgZ2V0TWF4QWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF4QWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgd2FpdGluZyBpbiBoYW5kbGVyL3Rhc2sgYmVmb3JlIG92ZXJsb2FkLgotICAgKgotICAgKiBAcGFyYW0gbWF4QWN0aXZlUHJvY2Vzc29ycyBuZXcgc2V0dGluZyBmb3IgbWF4aW11bSAjIG9mIGFjdGl2ZSBwcm9jZXNzZXMuCi0gICAqLwotICB2b2lkIHNldE1heEFjdGl2ZVByb2Nlc3NvcnMoc2l6ZV90IG1heEFjdGl2ZVByb2Nlc3NvcnMpIHsKLSAgICBtYXhBY3RpdmVQcm9jZXNzb3JzXyA9IG1heEFjdGl2ZVByb2Nlc3NvcnM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KLSAgICoKLSAgICogQHJldHVybiBoeXN0ZXJlc2lzIGZyYWN0aW9uCi0gICAqLwotICBkb3VibGUgZ2V0T3ZlcmxvYWRIeXN0ZXJlc2lzKCkgY29uc3QgewotICAgIHJldHVybiBvdmVybG9hZEh5c3RlcmVzaXNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBmcmFjdGlvbiBvZiBtYXhpbXVtIGxpbWl0cyBiZWZvcmUgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCi0gICAqIEEgZ29vZCB2YWx1ZSB3b3VsZCBwcm9iYWJseSBiZSBiZXR3ZWVuIDAuNSBhbmQgMC45LgotICAgKgotICAgKiBAcGFyYW0gaHlzdGVyZXNpc0ZyYWN0aW9uIGZyYWN0aW9uIDw9IDEuMC4KLSAgICovCi0gIHZvaWQgc2V0T3ZlcmxvYWRIeXN0ZXJlc2lzKGRvdWJsZSBoeXN0ZXJlc2lzRnJhY3Rpb24pIHsKLSAgICBpZiAoaHlzdGVyZXNpc0ZyYWN0aW9uIDw9IDEuMCAmJiBoeXN0ZXJlc2lzRnJhY3Rpb24gPiAwLjApIHsKLSAgICAgIG92ZXJsb2FkSHlzdGVyZXNpc18gPSBoeXN0ZXJlc2lzRnJhY3Rpb247Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYWN0aW9uIHRoZSBzZXJ2ZXIgd2lsbCB0YWtlIG9uIG92ZXJsb2FkLgotICAgKgotICAgKiBAcmV0dXJuIGEgVE92ZXJsb2FkQWN0aW9uIGVudW0gdmFsdWUgZm9yIHRoZSBjdXJyZW50bHkgc2V0IGFjdGlvbi4KLSAgICovCi0gIFRPdmVybG9hZEFjdGlvbiBnZXRPdmVybG9hZEFjdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gb3ZlcmxvYWRBY3Rpb25fOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgYWN0aW9uIHRoZSBzZXJ2ZXIgaXMgdG8gdGFrZSBvbiBvdmVybG9hZC4KLSAgICoKLSAgICogQHBhcmFtIG92ZXJsb2FkQWN0aW9uIGEgVE92ZXJsb2FkQWN0aW9uIGVudW0gdmFsdWUgZm9yIHRoZSBhY3Rpb24uCi0gICAqLwotICB2b2lkIHNldE92ZXJsb2FkQWN0aW9uKFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbikgewotICAgIG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgotICAgKgotICAgKiBAcmV0dXJuIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgaW50NjRfdCBnZXRUYXNrRXhwaXJlVGltZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGFza0V4cGlyZVRpbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgotICAgKgotICAgKiBAcGFyYW0gdGFza0V4cGlyZVRpbWUgYSA2NC1iaXQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICB2b2lkIHNldFRhc2tFeHBpcmVUaW1lKGludDY0X3QgdGFza0V4cGlyZVRpbWUpIHsKLSAgICB0YXNrRXhwaXJlVGltZV8gPSB0YXNrRXhwaXJlVGltZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KLSAgICogVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIG1heGltdW1zIGZvciBvcGVuIGNvbm5lY3Rpb25zIGFuZCBjb25uZWN0aW9ucwotICAgKiBjdXJyZW50bHkgaW4gcHJvY2Vzc2luZywgYW5kIHNldHMgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlmIHRoZXkgYXJlCi0gICAqIGV4Y2VlZGVkLiAgVGhlIG92ZXJsb2FkIHdpbGwgcGVyc2lzdCB1bnRpbCBib3RoIHZhbHVlcyBhcmUgYmVsb3cgdGhlCi0gICAqIGN1cnJlbnQgaHlzdGVyZXNpcyBmcmFjdGlvbiBvZiB0aGVpciBtYXhpbXVtcy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBleGlzdHMsIGZhbHNlIGlmIG5vdC4KLSAgICovCi0gIGJvb2wgc2VydmVyT3ZlcmxvYWRlZCgpOwotCi0gIC8qKiBQb3AgYW5kIGRpc2NhcmQgbmV4dCB0YXNrIG9uIHRocmVhZHBvb2wgd2FpdCBxdWV1ZS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIGEgdGFzayB3YXMgZGlzY2FyZGVkLCBmYWxzZSBpZiB0aGUgd2FpdCBxdWV1ZSB3YXMgZW1wdHkuCi0gICAqLwotICBib29sIGRyYWluUGVuZGluZ1Rhc2soKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBzdGFydGluZyBzaXplIG9mIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICMgYnl0ZXMgd2UgaW5pdGlhbGl6ZSBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlciB0by4KLSAgICovCi0gIHNpemVfdCBnZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkgY29uc3QgewotICAgIHJldHVybiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHN0YXJ0aW5nIHNpemUgb2YgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzaXplICMgYnl0ZXMgd2UgaW5pdGlhbGl6ZSBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlciB0by4KLSAgICovCi0gIHZvaWQgc2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZShzaXplX3Qgc2l6ZSkgewotICAgIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfID0gc2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKgotICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgZGVhbGxvYyBpZGxlIGJ1ZmZlci4KLSAgICovCi0gIHNpemVfdCBnZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLSAgfQotCi0gIC8qKgotICAgKiBbTk9URTogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSBnZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkuXQotICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgotICAgKgotICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgZGVhbGxvYyBpZGxlIGJ1ZmZlci4KLSAgICovCi0gIHNpemVfdCBnZXRJZGxlQnVmZmVyTWVtTGltaXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCi0gICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKLSAgICogYWxsb2NhdGVkIHRvIGl0cyByZWFkIGJ1ZmZlciwgd2UgZnJlZSBpdCBhbmQgYWxsb3cgaXQgdG8gYmUgcmVpbml0aWFsaXplZAotICAgKiBvbiB0aGUgbmV4dCByZWNlaXZlZCBmcmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gY2hlY2tlZC4KLSAgICovCi0gIHZvaWQgc2V0SWRsZVJlYWRCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsKLSAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IGxpbWl0OwotICB9Ci0KLSAgLyoqCi0gICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIHNldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCi0gICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCi0gICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKLSAgICogYWxsb2NhdGVkIHRvIGl0cyByZWFkIGJ1ZmZlciwgd2UgZnJlZSBpdCBhbmQgYWxsb3cgaXQgdG8gYmUgcmVpbml0aWFsaXplZAotICAgKiBvbiB0aGUgbmV4dCByZWNlaXZlZCBmcmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gY2hlY2tlZC4KLSAgICovCi0gIHZvaWQgc2V0SWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCBsaW1pdCkgewotICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7Ci0gIH0KLQotICAKLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gICAqCi0gICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCByZWFsbG9jYXRlIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgotICAgKi8KLSAgc2l6ZV90IGdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlV3JpdGVCdWZmZXJMaW1pdF87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCi0gICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKLSAgICogYWxsb2NhdGVkIHRvIGl0cyB3cml0ZSBidWZmZXIsIHdlIGRlc3Ryb3kgYW5kIGNvbnN0cnVjdCB0aGF0IGJ1ZmZlciB3aXRoCi0gICAqIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzLgotICAgKgotICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBpZGxlLgotICAgKi8KLSAgdm9pZCBzZXRJZGxlV3JpdGVCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsKLSAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gPSBsaW1pdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgIyBvZiBjYWxscyBtYWRlIGJldHdlZW4gYnVmZmVyIHNpemUgY2hlY2tzLiAgMCBtZWFucyBkaXNhYmxlZC4KLSAgICoKLSAgICogQHJldHVybiAjIG9mIGNhbGxzIGJldHdlZW4gYnVmZmVyIHNpemUgY2hlY2tzLgotICAgKi8KLSAgaW50MzJfdCBnZXRSZXNpemVCdWZmZXJFdmVyeU4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl87Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgYnVmZmVyIHNpemVzIGV2ZXJ5ICJjb3VudCIgY2FsbHMuICBUaGlzIGFsbG93cyBidWZmZXIgbGltaXRzCi0gICAqIHRvIGJlIGVuZm9yY2VkIGZvciBwZXJzaXN0YW50IGNvbm5lY3Rpb25zIHdpdGggYSBjb250cm9sbGFibGUgZGVncmVlCi0gICAqIG9mIG92ZXJoZWFkLiAwIGRpc2FibGVzIGNoZWNrcyBleGNlcHQgYXQgY29ubmVjdGlvbiBjbG9zZS4KLSAgICoKLSAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgY2FsbHMgYmV0d2VlbiBjaGVja3MsIG9yIDAgdG8gZGlzYWJsZQotICAgKi8KLSAgdm9pZCBzZXRSZXNpemVCdWZmZXJFdmVyeU4oaW50MzJfdCBjb3VudCkgewotICAgIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gPSBjb3VudDsKLSAgfQotCi0KLQotICAvKioKLSAgICogUmV0dXJuIGFuIGluaXRpYWxpemVkIGNvbm5lY3Rpb24gb2JqZWN0LiAgQ3JlYXRlcyBvciByZWNvdmVycyBmcm9tCi0gICAqIHBvb2wgYSBUQ29ubmVjdGlvbiBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgc29ja2V0IEZECi0gICAqIGFuZCBmbGFncy4KLSAgICoKLSAgICogQHBhcmFtIHNvY2tldCBGRCBvZiBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbi4KLSAgICogQHBhcmFtIGZsYWdzIGluaXRpYWwgbGliX2V2ZW50IGZsYWdzIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBhZGRyIHRoZSBzb2NrYWRkciBvZiB0aGUgY2xpZW50Ci0gICAqIEBwYXJhbSBhZGRyTGVuIHRoZSBsZW5ndGggb2YgYWRkcgotICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgVENvbm5lY3Rpb24gb2JqZWN0LgotICAgKi8KLSAgVENvbm5lY3Rpb24qIGNyZWF0ZUNvbm5lY3Rpb24oaW50IHNvY2tldCwgc2hvcnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbik7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBjb25uZWN0aW9uIHRvIHBvb2wgb3IgZGVsZXRpb24uICBJZiB0aGUgY29ubmVjdGlvbiBwb29sCi0gICAqIChhIHN0YWNrKSBpc24ndCBmdWxsLCBwbGFjZSB0aGUgY29ubmVjdGlvbiBvYmplY3Qgb24gaXQsIG90aGVyd2lzZQotICAgKiBqdXN0IGRlbGV0ZSBpdC4KLSAgICoKLSAgICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIFRDb25lY3Rpb24gYmVpbmcgcmV0dXJuZWQuCi0gICAqLwotICB2b2lkIHJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pOwotCi0gIC8qKgotICAgKiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSB0aHJlYWRtYW5hZ2VyIGNhbGxzIHdoZW4gYSB0YXNrIHJlYWNoZXMKLSAgICogaXRzIGV4cGlyYXRpb24gdGltZS4gIEl0IGlzIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUgZXhwaXJlZCBjb25uZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gdGFzayB0aGUgcnVubmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBpcmVkIHRhc2suCi0gICAqLwotICB2b2lkIGV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKLQotICAvKioKLSAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBsaXN0ZW5lciBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCi0gICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBzZXJ2ZXItPmhhbmRsZUV2ZW50KCkuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KLSAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgotICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFROb25ibG9ja2luZ1NlcnZlcidzICJ0aGlzIi4KLSAgICovCi0gIHN0YXRpYyB2b2lkIGV2ZW50SGFuZGxlcihpbnQgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KSB7Ci0gICAgKChUTm9uYmxvY2tpbmdTZXJ2ZXIqKXYpLT5oYW5kbGVFdmVudChmZCwgd2hpY2gpOwotICB9Ci0KLSAgLy8vIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KLSAgdm9pZCBsaXN0ZW5Tb2NrZXQoKTsKLQotICAvKioKLSAgICogVGFrZXMgYSBzb2NrZXQgY3JlYXRlZCBieSBsaXN0ZW5Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzIG9wdGlvbnMgb24gaXQKLSAgICogdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmZCBkZXNjcmlwdG9yIG9mIHNvY2tldCB0byBiZSBpbml0aWFsaXplZC8KLSAgICovCi0gIHZvaWQgbGlzdGVuU29ja2V0KGludCBmZCk7Ci0KLSAgLy8vIENyZWF0ZSB0aGUgcGlwZSB1c2VkIHRvIG5vdGlmeSBJL08gcHJvY2VzcyBvZiB0YXNrIGNvbXBsZXRpb24uCi0gIHZvaWQgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOwotCi0gIC8qKgotICAgKiBHZXQgbm90aWZpY2F0aW9uIHBpcGUgc2VuZCBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcmV0dXJuIHdyaXRlIGZkIGZvciBwaXBlLgotICAgKi8KLSAgaW50IGdldE5vdGlmaWNhdGlvblNlbmRGRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMV07Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG5vdGlmaWNhdGlvbiBwaXBlIHJlY2VpdmUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHJldHVybiByZWFkIGZkIG9mIHBpcGUuCi0gICAqLwotICBpbnQgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCkgY29uc3QgewotICAgIHJldHVybiBub3RpZmljYXRpb25QaXBlRkRzX1swXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgY29yZSBsaWJldmVudCBldmVudHMgb250byB0aGUgcHJvcGVyIGJhc2UuCi0gICAqCi0gICAqIEBwYXJhbSBiYXNlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IGJhc2UgdG8gYmUgaW5pdGlhbGl6ZWQuCi0gICAqLwotICB2b2lkIHJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIGJhc2UpOwotCi0gIC8qKgotICAgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKLSAgICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KLSAgICovCi0gIHZvaWQgc2VydmUoKTsKLX07Ci0KLS8vLyBUaHJlZSBzdGF0ZXMgZm9yIHNvY2tldHM6IHJlY3YgZnJhbWUgc2l6ZSwgcmVjdiBkYXRhLCBhbmQgc2VuZCBtb2RlCi1lbnVtIFRTb2NrZXRTdGF0ZSB7Ci0gIFNPQ0tFVF9SRUNWX0ZSQU1JTkcsCi0gIFNPQ0tFVF9SRUNWLAotICBTT0NLRVRfU0VORAotfTsKLQotLyoqCi0gKiBGaXZlIHN0YXRlcyBmb3IgdGhlIG5vbmJsb2NraW5nIHNlcnZyOgotICogIDEpIGluaXRpYWxpemUKLSAqICAyKSByZWFkIDQgYnl0ZSBmcmFtZSBzaXplCi0gKiAgMykgcmVhZCBmcmFtZSBvZiBkYXRhCi0gKiAgNCkgc2VuZCBiYWNrIGRhdGEgKGlmIGFueSkKLSAqICA1KSBmb3JjZSBpbW1lZGlhdGUgY29ubmVjdGlvbiBjbG9zZQotICovCi1lbnVtIFRBcHBTdGF0ZSB7Ci0gIEFQUF9JTklULAotICBBUFBfUkVBRF9GUkFNRV9TSVpFLAotICBBUFBfUkVBRF9SRVFVRVNULAotICBBUFBfV0FJVF9UQVNLLAotICBBUFBfU0VORF9SRVNVTFQsCi0gIEFQUF9DTE9TRV9DT05ORUNUSU9OCi19OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRoYXQgaXMgaGFuZGxlZCB2aWEgbGliZXZlbnQuIFRoaXMgY29ubmVjdGlvbgotICogZXNzZW50aWFsbHkgZW5jYXBzdWxhdGVzIGEgc29ja2V0IHRoYXQgaGFzIHNvbWUgYXNzb2NpYXRlZCBsaWJldmVudCBzdGF0ZS4KLSAqLwotY2xhc3MgVENvbm5lY3Rpb24gewotIHByaXZhdGU6Ci0KLSAgLy8vIFNlcnZlciBoYW5kbGUKLSAgVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXJfOwotCi0gIC8vLyBPYmplY3Qgd3JhcHBpbmcgbmV0d29yayBzb2NrZXQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gdFNvY2tldF87Ci0KLSAgLy8vIExpYmV2ZW50IG9iamVjdAotICBzdHJ1Y3QgZXZlbnQgZXZlbnRfOwotCi0gIC8vLyBMaWJldmVudCBmbGFncwotICBzaG9ydCBldmVudEZsYWdzXzsKLQotICAvLy8gU29ja2V0IG1vZGUKLSAgVFNvY2tldFN0YXRlIHNvY2tldFN0YXRlXzsKLQotICAvLy8gQXBwbGljYXRpb24gc3RhdGUKLSAgVEFwcFN0YXRlIGFwcFN0YXRlXzsKLQotICAvLy8gSG93IG11Y2ggZGF0YSBuZWVkZWQgdG8gcmVhZAotICB1aW50MzJfdCByZWFkV2FudF87Ci0KLSAgLy8vIFdoZXJlIGluIHRoZSByZWFkIGJ1ZmZlciBhcmUgd2UKLSAgdWludDMyX3QgcmVhZEJ1ZmZlclBvc187Ci0KLSAgLy8vIFJlYWQgYnVmZmVyCi0gIHVpbnQ4X3QqIHJlYWRCdWZmZXJfOwotCi0gIC8vLyBSZWFkIGJ1ZmZlciBzaXplCi0gIHVpbnQzMl90IHJlYWRCdWZmZXJTaXplXzsKLQotICAvLy8gV3JpdGUgYnVmZmVyCi0gIHVpbnQ4X3QqIHdyaXRlQnVmZmVyXzsKLQotICAvLy8gV3JpdGUgYnVmZmVyIHNpemUKLSAgdWludDMyX3Qgd3JpdGVCdWZmZXJTaXplXzsKLQotICAvLy8gSG93IGZhciB0aHJvdWdoIHdyaXRpbmcgYXJlIHdlPwotICB1aW50MzJfdCB3cml0ZUJ1ZmZlclBvc187Ci0KLSAgLy8vIExhcmdlc3Qgc2l6ZSBvZiB3cml0ZSBidWZmZXIgc2VlbiBzaW5jZSBidWZmZXIgd2FzIGNvbnN0cnVjdGVkCi0gIHNpemVfdCBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXzsKLQotICAvLy8gQ291bnQgb2YgdGhlIG51bWJlciBvZiBjYWxscyBmb3IgdXNlIHdpdGggZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkuCi0gIGludDMyX3QgY2FsbHNGb3JSZXNpemVfOwotCi0gIC8vLyBUYXNrIGhhbmRsZQotICBpbnQgdGFza0hhbmRsZV87Ci0KLSAgLy8vIFRhc2sgZXZlbnQKLSAgc3RydWN0IGV2ZW50IHRhc2tFdmVudF87Ci0KLSAgLy8vIFRyYW5zcG9ydCB0byByZWFkIGZyb20KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnRfOwotCi0gIC8vLyBUcmFuc3BvcnQgdGhhdCBwcm9jZXNzb3Igd3JpdGVzIHRvCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG91dHB1dFRyYW5zcG9ydF87Ci0KLSAgLy8vIGV4dHJhIHRyYW5zcG9ydCBnZW5lcmF0ZWQgYnkgdHJhbnNwb3J0IGZhY3RvcnkgKGUuZy4gQnVmZmVyZWRSb3V0ZXJUcmFuc3BvcnQpCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGZhY3RvcnlJbnB1dFRyYW5zcG9ydF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfOwotCi0gIC8vLyBQcm90b2NvbCBkZWNvZGVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87Ci0KLSAgLy8vIFByb3RvY29sIGVuY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87Ci0KLSAgLy8vIFNlcnZlciBldmVudCBoYW5kbGVyLCBpZiBhbnkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKLQotICAvLy8gVGhyaWZ0IGNhbGwgY29udGV4dCwgaWYgYW55Ci0gIHZvaWQgKmNvbm5lY3Rpb25Db250ZXh0XzsKLQotICAvLy8gR28gaW50byByZWFkIG1vZGUKLSAgdm9pZCBzZXRSZWFkKCkgewotICAgIHNldEZsYWdzKEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsKLSAgfQotCi0gIC8vLyBHbyBpbnRvIHdyaXRlIG1vZGUKLSAgdm9pZCBzZXRXcml0ZSgpIHsKLSAgICBzZXRGbGFncyhFVl9XUklURSB8IEVWX1BFUlNJU1QpOwotICB9Ci0KLSAgLy8vIFNldCBzb2NrZXQgaWRsZQotICB2b2lkIHNldElkbGUoKSB7Ci0gICAgc2V0RmxhZ3MoMCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGV2ZW50IGZsYWdzIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBldmVudEZsYWdzIGZsYWdzIHdlIHBhc3MgdG8gbGliZXZlbnQgZm9yIHRoZSBjb25uZWN0aW9uLgotICAgKi8KLSAgdm9pZCBzZXRGbGFncyhzaG9ydCBldmVudEZsYWdzKTsKLQotICAvKioKLSAgICogTGliZXZlbnQgaGFuZGxlciBjYWxsZWQgKHZpYSBvdXIgc3RhdGljIHdyYXBwZXIpIHdoZW4gdGhlIGNvbm5lY3Rpb24KLSAgICogc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgUmF0aGVyIHRoYW4gdXNlIHRoZSBmbGFncyBsaWJldmVudCBwYXNzZWQsCi0gICAqIHdlIHVzZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIHJlYWQgb3IKLSAgICogd3JpdGUgdGhlIHNvY2tldC4KLSAgICovCi0gIHZvaWQgd29ya1NvY2tldCgpOwotCi0gIC8vLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24gYW5kIGZyZWUgb3IgcmVzZXQgaXRzIHJlc291cmNlcy4KLSAgdm9pZCBjbG9zZSgpOwotCi0gcHVibGljOgotCi0gIGNsYXNzIFRhc2s7Ci0KLSAgLy8vIENvbnN0cnVjdG9yCi0gIFRDb25uZWN0aW9uKGludCBzb2NrZXQsIHNob3J0IGV2ZW50RmxhZ3MsIFROb25ibG9ja2luZ1NlcnZlciAqcywKLSAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBhZGRyTGVuKSB7Ci0gICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOwotICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7Ci0KLSAgICAvLyBBbGxvY2F0ZSBpbnB1dCBhbmQgb3V0cHV0IHRyYW5wc29ydHMKLSAgICAvLyB0aGVzZSBvbmx5IG5lZWQgdG8gYmUgYWxsb2NhdGVkIG9uY2UgcGVyIFRDb25uZWN0aW9uICh0aGV5IGRvbid0IG5lZWQgdG8gYmUKLSAgICAvLyByZWFsbG9jYXRlZCBvbiBpbml0KCkgY2FsbCkKLSAgICBpbnB1dFRyYW5zcG9ydF8gPSBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPihuZXcgVE1lbW9yeUJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclNpemVfKSk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0XyA9IGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+KG5ldyBUTWVtb3J5QnVmZmVyKHMtPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpOwotICAgIHRTb2NrZXRfLnJlc2V0KG5ldyBUU29ja2V0KCkpOwotCi0gICAgaW5pdChzb2NrZXQsIGV2ZW50RmxhZ3MsIHMsIGFkZHIsIGFkZHJMZW4pOwotICAgIHNlcnZlcl8tPmluY3JlbWVudE51bUNvbm5lY3Rpb25zKCk7Ci0gIH0KLQotICB+VENvbm5lY3Rpb24oKSB7Ci0gICAgc3RkOjpmcmVlKHJlYWRCdWZmZXJfKTsKLSAgICBzZXJ2ZXJfLT5kZWNyZW1lbnROdW1Db25uZWN0aW9ucygpOwotICB9Ci0KLSAvKioKLSAgICogQ2hlY2sgYnVmZmVycyBhZ2FpbnN0IGFueSBzaXplIGxpbWl0cyBhbmQgc2hyaW5rIGl0IGlmIGV4Y2VlZGVkLgotICAgKgotICAgKiBAcGFyYW0gcmVhZExpbWl0IHdlIHJlZHVjZSByZWFkIGJ1ZmZlciBzaXplIHRvIHRoaXMgKGlmIG5vbnplcm8pLgotICAgKiBAcGFyYW0gd3JpdGVMaW1pdCBpZiBub256ZXJvIGFuZCB3cml0ZSBidWZmZXIgaXMgbGFyZ2VyLCByZXBsYWNlIGl0LgotICAgKi8KLSAgdm9pZCBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCk7Ci0KLSAgLy8vIEluaXRpYWxpemUKLSAgdm9pZCBpbml0KGludCBzb2NrZXQsIHNob3J0IGV2ZW50RmxhZ3MsIFROb25ibG9ja2luZ1NlcnZlciAqcywKLSAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbik7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KLSAgICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCi0gICAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCi0gICAqLwotICB2b2lkIHRyYW5zaXRpb24oKTsKLQotICAvKioKLSAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBjb25uZWN0aW9uIGV2ZW50cy4gIFByb3ZpZGVzIGEgY2FsbGJhY2sKLSAgICogdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB3aGljaCBpbnZva2VzIGNvbm5lY3Rpb25fLT53b3JrU29ja2V0KCkuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KLSAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgotICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFRDb25uZWN0aW9uJ3MgInRoaXMiLgotICAgKi8KLSAgc3RhdGljIHZvaWQgZXZlbnRIYW5kbGVyKGludCBmZCwgc2hvcnQgLyogd2hpY2ggKi8sIHZvaWQqIHYpIHsKLSAgICBhc3NlcnQoZmQgPT0gKChUQ29ubmVjdGlvbiopdiktPmdldFRTb2NrZXQoKS0+Z2V0U29ja2V0RkQoKSk7Ci0gICAgKChUQ29ubmVjdGlvbiopdiktPndvcmtTb2NrZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIHNpZ25hbGluZyB0YXNrIGNvbXBsZXRpb24uICBQcm92aWRlcyBhCi0gICAqIGNhbGxiYWNrIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgdGhhdCB3aWxsIHJlYWQgYSBjb25uZWN0aW9uCi0gICAqIG9iamVjdCdzIGFkZHJlc3MgZnJvbSBhIHBpcGUgYW5kIGNhbGwgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpIGZvcgotICAgKiB0aGF0IG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cmVkIG9uLgotICAgKi8KLSAgc3RhdGljIHZvaWQgdGFza0hhbmRsZXIoaW50IGZkLCBzaG9ydCAvKiB3aGljaCAqLywgdm9pZCogLyogdiAqLykgewotICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uOwotICAgIHNzaXplX3QgbkJ5dGVzOwotICAgIHdoaWxlICgobkJ5dGVzID0gcmVhZChmZCwgKHZvaWQqKSZjb25uZWN0aW9uLCBzaXplb2YoVENvbm5lY3Rpb24qKSkpCi0gICAgICAgID09IHNpemVvZihUQ29ubmVjdGlvbiopKSB7Ci0gICAgICBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7Ci0gICAgfQotICAgIGlmIChuQnl0ZXMgPiAwKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUQ29ubmVjdGlvbjo6dGFza0hhbmRsZXIgdW5leHBlY3RlZCBwYXJ0aWFsIHJlYWQiKTsKLSAgICB9Ci0gICAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTikgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnRhc2tIYW5kbGVyIHJlYWQgZmFpbGVkLCByZXNvdXJjZSBsZWFrIiwgZXJybm8pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBOb3RpZmljYXRpb24gdG8gc2VydmVyIHRoYXQgcHJvY2Vzc2luZyBoYXMgZW5kZWQgb24gdGhpcyByZXF1ZXN0LgotICAgKiBDYW4gYmUgY2FsbGVkIGVpdGhlciB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGVkIG9yIHdoZW4gYSB3YWl0aW5nCi0gICAqIHRhc2sgaGFzIGJlZW4gcHJlZW1wdGl2ZWx5IHRlcm1pbmF0ZWQgKG9uIG92ZXJsb2FkKS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHVuYWJsZSB0byBub3RpZnkgKGNoZWNrIGVycm5vKS4KLSAgICovCi0gIGJvb2wgbm90aWZ5U2VydmVyKCkgewotICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gdGhpczsKLSAgICBpZiAod3JpdGUoc2VydmVyXy0+Z2V0Tm90aWZpY2F0aW9uU2VuZEZEKCksIChjb25zdCB2b2lkKikmY29ubmVjdGlvbiwKLSAgICAgICAgICAgICBzaXplb2YoVENvbm5lY3Rpb24qKSkgIT0gc2l6ZW9mKFRDb25uZWN0aW9uKikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vLyBGb3JjZSBjb25uZWN0aW9uIHNodXRkb3duIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0gIHZvaWQgZm9yY2VDbG9zZSgpIHsKLSAgICBhcHBTdGF0ZV8gPSBBUFBfQ0xPU0VfQ09OTkVDVElPTjsKLSAgICBpZiAoIW5vdGlmeVNlcnZlcigpKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUQ29ubmVjdGlvbjo6Zm9yY2VDbG9zZTogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7Ci0gICAgfQotICB9Ci0KLSAgLy8vIHJldHVybiB0aGUgc2VydmVyIHRoaXMgY29ubmVjdGlvbiB3YXMgaW5pdGlhbGl6ZWQgZm9yLgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIGdldFNlcnZlcigpIHsKLSAgICByZXR1cm4gc2VydmVyXzsKLSAgfQotCi0gIC8vLyBnZXQgc3RhdGUgb2YgY29ubmVjdGlvbi4KLSAgVEFwcFN0YXRlIGdldFN0YXRlKCkgewotICAgIHJldHVybiBhcHBTdGF0ZV87Ci0gIH0KLQotICAvLy8gcmV0dXJuIHRoZSBUU29ja2V0IHRyYW5zcG9ydCB3cmFwcGluZyB0aGlzIG5ldHdvcmsgY29ubmVjdGlvbgotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBnZXRUU29ja2V0KCkgY29uc3QgewotICAgIHJldHVybiB0U29ja2V0XzsKLSAgfQotCi0gIC8vLyByZXR1cm4gdGhlIHNlcnZlciBldmVudCBoYW5kbGVyIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87Ci0gIH0KLQotICAvLy8gcmV0dXJuIHRoZSBUaHJpZnQgY29ubmVjdGlvbiBjb250ZXh0IGlmIGFueQotICB2b2lkKiBnZXRDb25uZWN0aW9uQ29udGV4dCgpIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbkNvbnRleHRfOwotICB9Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2OTJhYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi1pbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2Zkcz0oMTw8MjQpKSAgewotICBzdHJ1Y3QgcmxpbWl0IGZkbWF4cmw7Ci0KLSAgZm9yKGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkczsKLSAgICAgIG1heF9mZHMgJiYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmZmRtYXhybCkgPCAwKTsKLSAgICAgIGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkcykgewotICAgIG1heF9mZHMgLz0gMjsKLSAgfQotCi0gIHJldHVybiAgZmRtYXhybC5ybGltX2N1cjsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmggYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRkZmVhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKLQotLyoqCi0gKiBWaXJ0dWFsIGludGVyZmFjZSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlciBjb3JlLiBUbwotICogdXNlIHRoaXMgeW91IHNob3VsZCBzdWJjbGFzcyBpdCBhbmQgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IGNhcmUKLSAqIGFib3V0LiBZb3VyIHN1YmNsYXNzIGNhbiBhbHNvIHN0b3JlIGxvY2FsIGRhdGEgdGhhdCB5b3UgbWF5IGNhcmUgYWJvdXQsCi0gKiBzdWNoIGFzIGFkZGl0aW9uYWwgImFyZ3VtZW50cyIgdG8gdGhlc2UgbWV0aG9kcyAoc3RvcmVkIGluIHRoZSBvYmplY3QKLSAqIGluc3RhbmNlJ3Mgc3RhdGUpLgotICovCi1jbGFzcyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0KLSAgdmlydHVhbCB+VFNlcnZlckV2ZW50SGFuZGxlcigpIHt9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7fQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKLSAgICAodm9pZClpbnB1dDsKLSAgICAodm9pZClvdXRwdXQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlcgotICAgKiBjb250ZXh0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+b3V0cHV0KSB7Ci0gICAgKHZvaWQpc2VydmVyQ29udGV4dDsKLSAgICAodm9pZClpbnB1dDsKLSAgICAodm9pZClvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKLSAgICAodm9pZClzZXJ2ZXJDb250ZXh0OwotICAgICh2b2lkKXRyYW5zcG9ydDsKLX0KLQotIHByb3RlY3RlZDoKLQotICAvKioKLSAgICogUHJldmVudCBkaXJlY3QgaW5zdGFudGlhdGlvbi4KLSAgICovCi0gIFRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQotCi19OwotCi0vKioKLSAqIFRocmlmdCBzZXJ2ZXIuCi0gKgotICovCi1jbGFzcyBUU2VydmVyIDogcHVibGljIGNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7Ci0gcHVibGljOgotCi0gIHZpcnR1YWwgflRTZXJ2ZXIoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9Ci0KLSAgLy8gQWxsb3dzIHJ1bm5pbmcgdGhlIHNlcnZlciBhcyBhIFJ1bm5hYmxlIHRocmVhZAotICB2aXJ0dWFsIHZvaWQgcnVuKCkgewotICAgIHNlcnZlKCk7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3Nvcl87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgewotICAgIHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsKLSAgICByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIFRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKToKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvcikgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICB9Ci0KLSAgVFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0KToKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgfQotCi0gIFRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkpOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCi0gICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KLQotICBUU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCi0gICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLAotICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpLAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCi0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9Ci0KLQotICAvLyBDbGFzcyB2YXJpYWJsZXMKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwotCi1wdWJsaWM6Ci0gIHZvaWQgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICB9Ci0KLSAgdm9pZCBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSB7Ci0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICB9Ci0KLSAgdm9pZCBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICB9Ci0KLSAgdm9pZCBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgfQotCi0gIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewotICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7Ci0gIH0KLQotfTsKLQotLyoqCi0gKiBIZWxwZXIgZnVuY3Rpb24gdG8gaW5jcmVhc2UgdGhlIG1heCBmaWxlIGRlc2NyaXB0b3JzIGxpbWl0Ci0gKiBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbi4KLSAqIEJ5IGRlZmF1bHQsIHRyaWVzIHRvIGluY3JlYXNlIGl0IHRvIGFzIG11Y2ggYXMgMl4yNC4KLSAqLwotIGludCBpbmNyZWFzZV9tYXhfZmRzKGludCBtYXhfZmRzPSgxPDwyNCkpOwotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmZDY3Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi0vKioKLSAqIEEgc2ltcGxlIHNpbmdsZS10aHJlYWRlZCBhcHBsaWNhdGlvbiBzZXJ2ZXIuIFBlcmZlY3QgZm9yIHVuaXQgdGVzdHMhCi0gKgotICovCi12b2lkIFRTaW1wbGVTZXJ2ZXI6OnNlcnZlKCkgewotCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKLQotICB0cnkgewotICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCi0gICAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXI6OnJ1bigpIGxpc3RlbigpOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCi0gIHdoaWxlICghc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0gICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJUcmFuc3BvcnQgZGllZCBvbiBhY2NlcHQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlNvbWUga2luZCBvZiBhY2NlcHQgZXhjZXB0aW9uOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlNvbWUga2luZCBvZiBhY2NlcHQgZXhjZXB0aW9uOiAiKSArIHM7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQgPSBOVUxMOwotICAgIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyXy0+Y3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICAgICAgICBldmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgY2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNvbm5lY3Rpb25Db250ZXh0KSB8fAotICAgICAgICAgICAgLy8gUGVlayBhaGVhZCwgaXMgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZD8KLSAgICAgICAgICAgICFpbnB1dFByb3RvY29sLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXIgZXhjZXB0aW9uOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRTaW1wbGVTZXJ2ZXIgdW5jYXVnaHQgZXhjZXB0aW9uLiIpOwotICAgIH0KLSAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgICBldmVudEhhbmRsZXJfLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNpbXBsZSBpbnB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2ltcGxlU2ltcGxlIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBjbGllbnQtPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2ltcGxlU2ltcGxlIGNsaWVudCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgc3RvcF8gPSBmYWxzZTsKLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTEyMGUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSAic2VydmVyL1RTZXJ2ZXIuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgc2ltcGxlIHNlcnZlci4gSXQgaXMgc2luZ2xlLXRocmVhZGVkIGFuZCBydW5zIGEKLSAqIGNvbnRpbnVvdXMgbG9vcCBvZiBhY2NlcHRpbmcgYSBzaW5nbGUgY29ubmVjdGlvbiwgcHJvY2Vzc2luZyByZXF1ZXN0cyBvbgotICogdGhhdCBjb25uZWN0aW9uIHVudGlsIGl0IGNsb3NlcywgYW5kIHRoZW4gcmVwZWF0aW5nLiBJdCBpcyBhIGdvb2QgZXhhbXBsZQotICogb2YgaG93IHRvIGV4dGVuZCB0aGUgVFNlcnZlciBpbnRlcmZhY2UuCi0gKgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewotIHB1YmxpYzoKLSAgVFNpbXBsZVNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gICAgc3RvcF8oZmFsc2UpIHt9Ci0KLSAgVFNpbXBsZVNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKLSAgICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gICAgc3RvcF8oZmFsc2UpIHt9Ci0KLSAgflRTaW1wbGVTZXJ2ZXIoKSB7fQotCi0gIHZvaWQgc2VydmUoKTsKLQotICB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgc3RvcF87Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDBiODM1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9UaHJlYWQuaCIKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotCi1jbGFzcyBUVGhyZWFkUG9vbFNlcnZlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLXB1YmxpYzoKLQotICBUYXNrKFRUaHJlYWRQb29sU2VydmVyICZzZXJ2ZXIsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgICBzZXJ2ZXJfKHNlcnZlciksCi0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIHRyYW5zcG9ydF8odHJhbnNwb3J0KSB7Ci0gIH0KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQgPSBOVUxMOwotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXItPmNyZWF0ZUNvbnRleHQoaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgdHJhbnNwb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgICAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIC8vIFRoaXMgaXMgcmVhc29uYWJseSBleHBlY3RlZCwgY2xpZW50IGRpZG4ndCBzZW5kIGEgZnVsbCByZXF1ZXN0IHNvIGp1c3QKLSAgICAgIC8vIGlnbm9yZSBoaW0KLSAgICAgIC8vIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIGNsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAvLyBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIGV4Y2VwdGlvbjogIikgKyB4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24gJngpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyLCBzdGQ6OmV4Y2VwdGlvbjogIikgKyB4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRUaHJlYWRQb29sU2VydmVyLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgICAgIlRUaHJlYWRQb29sU2VydmVyOjpUYXNrOjpydW4oKSIpOwotICAgIH0KLQotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgZXZlbnRIYW5kbGVyLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgb3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciBvdXRwdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLQotICB9Ci0KLSBwcml2YXRlOgotICBUU2VydmVyJiBzZXJ2ZXJfOwotICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Ci19OwotCi1UVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIDoKLSAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gIHN0b3BfKGZhbHNlKSwgdGltZW91dF8oMCkge30KLQotVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSA6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gIHN0b3BfKGZhbHNlKSwgdGltZW91dF8oMCkge30KLQotCi1UVGhyZWFkUG9vbFNlcnZlcjo6flRUaHJlYWRQb29sU2VydmVyKCkge30KLQotdm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2VydmUoKSB7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKLQotICB0cnkgewotICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCi0gICAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyOjpydW4oKSBsaXN0ZW4oKTogIikgKyB0dHgud2hhdCgpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAotICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKLSAgfQotCi0gIHdoaWxlICghc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgY2xpZW50LnJlc2V0KCk7Ci0gICAgICBpbnB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBpbnB1dFByb3RvY29sLnJlc2V0KCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbC5yZXNldCgpOwotCi0gICAgICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKLSAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAvLyBNYWtlIElPIHRyYW5zcG9ydHMKLSAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgICAgIC8vIEFkZCB0byB0aHJlYWRtYW5hZ2VyIHBvb2wKLSAgICAgIHRocmVhZE1hbmFnZXJfLT5hZGQoc2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcjo6VGFzaz4obmV3IFRUaHJlYWRQb29sU2VydmVyOjpUYXNrKCp0aGlzLCBwcm9jZXNzb3JfLCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KSksIHRpbWVvdXRfKTsKLQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmICghc3RvcF8gfHwgdHR4LmdldFR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgewotICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogQ2F1Z2h0IFRFeGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9ICJUVGhyZWFkUG9vbFNlcnZlcjogVW5rbm93biBleGNlcHRpb246ICIgKyBzOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHN0b3BwZWQgbWFudWFsbHksIGpvaW4gdGhlIGV4aXN0aW5nIHRocmVhZHMKLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyXy0+am9pbigpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogRXhjZXB0aW9uIHNodXR0aW5nIGRvd246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgc3RvcF8gPSBmYWxzZTsKLSAgfQotCi19Ci0KLWludDY0X3QgVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRpbWVvdXQoKSBjb25zdCB7Ci0gIHJldHVybiB0aW1lb3V0XzsKLX0KLQotdm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2V0VGltZW91dChpbnQ2NF90IHZhbHVlKSB7Ci0gIHRpbWVvdXRfID0gdmFsdWU7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjdlOTA2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotCi1jbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s7Ci0KLSAgVFRocmVhZFBvb2xTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOwotCi0gIFRUaHJlYWRQb29sU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7Ci0KLSAgdmlydHVhbCB+VFRocmVhZFBvb2xTZXJ2ZXIoKTsKLQotICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKLQotICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZW91dCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpOwotCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkgewotICAgIHN0b3BfID0gdHJ1ZTsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwotCi0gIHZvbGF0aWxlIGJvb2wgc3RvcF87Ci0KLSAgdm9sYXRpbGUgaW50NjRfdCB0aW1lb3V0XzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzE4Y2EuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi1jbGFzcyBUVGhyZWFkZWRTZXJ2ZXI6OlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLXB1YmxpYzoKLQotICBUYXNrKFRUaHJlYWRlZFNlcnZlciYgc2VydmVyLAotICAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gICAgc2VydmVyXyhzZXJ2ZXIpLAotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBpbnB1dF8oaW5wdXQpLAotICAgIG91dHB1dF8ob3V0cHV0KSwKLSAgICB0cmFuc3BvcnRfKHRyYW5zcG9ydCkgewotICB9Ci0KLSAgflRhc2soKSB7fQotCi0gIHZvaWQgcnVuKCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlciA9Ci0gICAgICBzZXJ2ZXJfLmdldEV2ZW50SGFuZGxlcigpOwotICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0ID0gTlVMTDsKLSAgICBpZiAoZXZlbnRIYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyLT5jcmVhdGVDb250ZXh0KGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICAgIGV2ZW50SGFuZGxlci0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIHRyYW5zcG9ydF8pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8sIGNvbm5lY3Rpb25Db250ZXh0KSB8fAotICAgICAgICAgICAgIWlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPnBlZWsoKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgeCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGV4Y2VwdGlvbjogIikgKyB4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRUaHJlYWRlZFNlcnZlciB1bmNhdWdodCBleGNlcHRpb24uIik7Ci0gICAgfQotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgZXZlbnRIYW5kbGVyLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBmcm9tIHBhcmVudCBib29ra2VlcGluZwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHNlcnZlcl8udGFza3NNb25pdG9yXyk7Ci0gICAgICBzZXJ2ZXJfLnRhc2tzXy5lcmFzZSh0aGlzKTsKLSAgICAgIGlmIChzZXJ2ZXJfLnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgIHNlcnZlcl8udGFza3NNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfOwotICBmcmllbmQgY2xhc3MgVFRocmVhZGVkU2VydmVyOwotCi0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLX07Ci0KLQotVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSk6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gIHN0b3BfKGZhbHNlKSB7Ci0gIHRocmVhZEZhY3RvcnlfID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci19Ci0KLVRUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSk6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpLAotICBzdG9wXyhmYWxzZSkgewotfQotCi1UVGhyZWFkZWRTZXJ2ZXI6On5UVGhyZWFkZWRTZXJ2ZXIoKSB7fQotCi12b2lkIFRUaHJlYWRlZFNlcnZlcjo6c2VydmUoKSB7Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIHRyeSB7Ci0gICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOjpydW4oKSBsaXN0ZW4oKTogIikgK3R0eC53aGF0KCk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQucmVzZXQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKLSAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7Ci0KLSAgICAgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgIC8vIE1ha2UgSU8gdHJhbnNwb3J0cwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgVFRocmVhZGVkU2VydmVyOjpUYXNrKiB0YXNrID0gbmV3IFRUaHJlYWRlZFNlcnZlcjo6VGFzaygqdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCk7Ci0KLSAgICAgIC8vIENyZWF0ZSBhIHRhc2sKLSAgICAgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlID0KLSAgICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4odGFzayk7Ci0KLSAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCBmb3IgdGhpcyB0YXNrCi0gICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0KLSAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQocnVubmFibGUpKTsKLQotICAgICAgLy8gSW5zZXJ0IHRocmVhZCBpbnRvIHRoZSBzZXQgb2YgdGhyZWFkcwotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyh0YXNrc01vbml0b3JfKTsKLSAgICAgICAgdGFza3NfLmluc2VydCh0YXNrKTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RhcnQgdGhlIHRocmVhZCEKLSAgICAgIHRocmVhZC0+c3RhcnQoKTsKLQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmICghc3RvcF8gfHwgdHR4LmdldFR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgewotICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IFRTZXJ2ZXJUcmFuc3BvcnQgZGllZCBvbiBhY2NlcHQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBDYXVnaHQgVEV4Y2VwdGlvbjogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gIlRUaHJlYWRlZFNlcnZlcjogVW5rbm93biBleGNlcHRpb246ICIgKyBzOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHN0b3BwZWQgbWFudWFsbHksIG1ha2Ugc3VyZSB0byBjbG9zZSBzZXJ2ZXIgdHJhbnNwb3J0Ci0gIGlmIChzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IEV4Y2VwdGlvbiBzaHV0dGluZyBkb3duOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyh0YXNrc01vbml0b3JfKTsKLSAgICAgIHdoaWxlICghdGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgdGFza3NNb25pdG9yXy53YWl0KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogRXhjZXB0aW9uIGpvaW5pbmcgd29ya2VyczogIikgKyB0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdG9wXyA9IGZhbHNlOwotICB9Ci0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwODExYS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwotCi1jbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Ci0KLSBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s7Ci0KLSAgVFRocmVhZGVkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KTsKLQotICBUVGhyZWFkZWRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KTsKLQotICB2aXJ0dWFsIH5UVGhyZWFkZWRTZXJ2ZXIoKTsKLQotICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKLQotICB2b2lkIHN0b3AoKSB7Ci0gICAgc3RvcF8gPSB0cnVlOwotICAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotICB2b2xhdGlsZSBib29sIHN0b3BfOwotCi0gIE1vbml0b3IgdGFza3NNb25pdG9yXzsKLSAgc3RkOjpzZXQ8VGFzayo+IHRhc2tzXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTQ2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcApAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1aW50MzJfdCBUQXBwbGljYXRpb25FeGNlcHRpb246OnJlYWQoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7CisgIHVpbnQzMl90IHhmZXIgPSAwOworICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKKyAgaW50MTZfdCBmaWQ7CisKKyAgeGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEJlZ2luKGZuYW1lKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIHhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKKyAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGZpZCkgeworICAgIGNhc2UgMToKKyAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HKSB7CisgICAgICAgIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJpbmcobWVzc2FnZV8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMikgeworICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgIHhmZXIgKz0gaXByb3QtPnJlYWRJMzIodHlwZSk7CisgICAgICAgIHR5cGVfID0gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUpdHlwZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEVuZCgpOworICB9CisKKyAgeGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEVuZCgpOworICByZXR1cm4geGZlcjsKK30KKwordWludDMyX3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjp3cml0ZShhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsKKyAgdWludDMyX3QgeGZlciA9IDA7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIm1lc3NhZ2UiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HLCAxKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJpbmcobWVzc2FnZV8pOworICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigidHlwZSIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIsIDIpOworICB4ZmVyICs9IG9wcm90LT53cml0ZUkzMih0eXBlXyk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKyAgcmV0dXJuIHhmZXI7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2MThmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEFQUExJQ0FUSU9ORVhDRVBUSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfVEFQUExJQ0FUSU9ORVhDRVBUSU9OX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworbmFtZXNwYWNlIHByb3RvY29sIHsKK2NsYXNzIFRQcm90b2NvbDsKK30KKworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogcHVibGljIFRFeGNlcHRpb24geworcHVibGljOgorICAvKioKKyAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCisgICAqLworICBlbnVtIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgeworICAgIFVOS05PV04gPSAwLAorICAgIFVOS05PV05fTUVUSE9EID0gMSwKKyAgICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIsCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzLAorICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQsCisgICAgTUlTU0lOR19SRVNVTFQgPSA1LAorICAgIElOVEVSTkFMX0VSUk9SID0gNiwKKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcsCisgICAgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4LAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5LAorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKKyAgfTsKKworICBUQXBwbGljYXRpb25FeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oKSwgdHlwZV8oVU5LTk9XTikge30KKworICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlKSA6IFRFeGNlcHRpb24oKSwgdHlwZV8odHlwZSkge30KKworICBUQXBwbGljYXRpb25FeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8oVU5LTk9XTikge30KKworICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CisKKyAgdmlydHVhbCB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICAvKioKKyAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKKyAgICogdGhhdCBoYXMgb2NjdXJyZWQuCisgICAqCisgICAqIEByZXR1cm4gRXJyb3IgY29kZQorICAgKi8KKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICAgIHN3aXRjaCAodHlwZV8pIHsKKyAgICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gYXBwbGljYXRpb24gZXhjZXB0aW9uIjsKKyAgICAgIGNhc2UgVU5LTk9XTl9NRVRIT0Q6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIG1ldGhvZCI7CisgICAgICBjYXNlIElOVkFMSURfTUVTU0FHRV9UWVBFOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCBtZXNzYWdlIHR5cGUiOworICAgICAgY2FzZSBXUk9OR19NRVRIT0RfTkFNRToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFdyb25nIG1ldGhvZCBuYW1lIjsKKyAgICAgIGNhc2UgQkFEX1NFUVVFTkNFX0lEOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogQmFkIHNlcXVlbmNlIGlkZW50aWZpZXIiOworICAgICAgY2FzZSBNSVNTSU5HX1JFU1VMVDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IE1pc3NpbmcgcmVzdWx0IjsKKyAgICAgIGNhc2UgSU5URVJOQUxfRVJST1I6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnRlcm5hbCBlcnJvciI7CisgICAgICBjYXNlIFBST1RPQ09MX0VSUk9SOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogUHJvdG9jb2wgZXJyb3IiOworICAgICAgY2FzZSBJTlZBTElEX1RSQU5TRk9STToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgdHJhbnNmb3JtIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9QUk9UT0NPTDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgcHJvdG9jb2wiOworICAgICAgY2FzZSBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVuc3VwcG9ydGVkIGNsaWVudCB0eXBlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgICAgfQorICB9CisKKyAgdWludDMyX3QgcmVhZChwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7CisgIHVpbnQzMl90IHdyaXRlKHByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdDsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogRXJyb3IgY29kZQorICAgKi8KKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlXzsKK307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFQUExJQ0FUSU9ORVhDRVBUSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEJhc2UuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzRiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVEJhc2UuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQkFTRV9IXworI2RlZmluZSBfVEhSSUZUX1RCQVNFX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK2NsYXNzIFRCYXNlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VEJhc2UoKXt9OworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQocHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZShwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgPSAwOworfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDM0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworLyoqCisgKiBURGlzcGF0Y2hQcm9jZXNzb3IgaXMgYSBoZWxwZXIgY2xhc3MgdG8gcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyIHRoZW4gY2FsbAorICogYW5vdGhlciBmdW5jdGlvbiB0byBkaXNwYXRjaCBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqCisgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGRpc3BhdGNoQ2FsbCgpIHRvIGRpc3BhdGNoIG9uIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgorY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVCA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOworCisgICAgLy8gVHJ5IHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgdGVtcGxhdGUgcHJvdG9jb2wgdHlwZQorICAgIFByb3RvY29sXyogc3BlY2lmaWNJbiA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpblJhdyk7CisgICAgUHJvdG9jb2xfKiBzcGVjaWZpY091dCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvdXRSYXcpOworICAgIGlmIChzcGVjaWZpY0luICYmIHNwZWNpZmljT3V0KSB7CisgICAgICByZXR1cm4gcHJvY2Vzc0Zhc3Qoc3BlY2lmaWNJbiwgc3BlY2lmaWNPdXQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgc2xvdyBwYXRoCisgICAgVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIGluUmF3LCBzcGVjaWZpY0luKTsKKyAgICBUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3V0UmF3LCBzcGVjaWZpY091dCk7CisKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW5SYXctPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY2FsbCwgbG9nIGFuIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugc28KKyAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAvLworICAgIC8vIChUaGUgb2xkIGdlbmVyYXRlZCBwcm9jZXNzb3IgY29kZSB1c2VkIHRvIHRyeSB0byBza2lwIGEgVF9TVFJVQ1QgYW5kCisgICAgLy8gY29udGludWUuICBIb3dldmVyLCB0aGF0IHNlZW1zIHVuc2FmZS4pCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsKGluUmF3LCBvdXRSYXcsIGZuYW1lLCBzZXFpZCwgY29ubmVjdGlvbkNvbnRleHQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBwcm9jZXNzRmFzdChQcm90b2NvbF8qIGluLCBQcm90b2NvbF8qIG91dCwgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGxUZW1wbGF0ZWQoaW4sIG91dCwgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KKworICAvKioKKyAgICogZGlzcGF0Y2hDYWxsKCkgbWV0aG9kcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKKyAgICovCisgIHZpcnR1YWwgYm9vbCBkaXNwYXRjaENhbGwoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbENvbnRleHQpID0gMDsKKworICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbENvbnRleHQpID0gMDsKK307CisKKy8qKgorICogTm9uLXRlbXBsYXRpemVkIHZlcnNpb24gb2YgVERpc3BhdGNoUHJvY2Vzc29yLCB0aGF0IGRvZXNuJ3QgYm90aGVyIHRyeWluZyB0bworICogcGVyZm9ybSBhIGR5bmFtaWNfY2FzdC4KKyAqLworY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yIDogcHVibGljIFRQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZGlzcGF0Y2hDYWxsKGluLmdldCgpLCBvdXQuZ2V0KCksIGZuYW1lLCBzZXFpZCwgY29ubmVjdGlvbkNvbnRleHQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsQ29udGV4dCkgPSAwOworfTsKKworLy8gU3BlY2lhbGl6ZSBURGlzcGF0Y2hQcm9jZXNzb3JUIGZvciBUUHJvdG9jb2wgYW5kIFREdW1teVByb3RvY29sIGp1c3QgdG8gdXNlCisvLyB0aGUgZ2VuZXJpYyBURGlzcGF0Y2hQcm9jZXNzb3IuCit0ZW1wbGF0ZSA8PgorY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VER1bW15UHJvdG9jb2w+IDogcHVibGljIFREaXNwYXRjaFByb2Nlc3NvciB7fTsKK3RlbXBsYXRlIDw+CitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpUUHJvdG9jb2w+IDogcHVibGljIFREaXNwYXRjaFByb2Nlc3NvciB7fTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIF9USFJJRlRfVERJU1BBVENIUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVExvZ2dpbmcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UTG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZmYwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVExvZ2dpbmcuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVExPR0dJTkdfSF8KKyNkZWZpbmUgX1RIUklGVF9UTE9HR0lOR19IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisvKioKKyAqIENvbnRhaW5zIHV0aWxpdHkgbWFjcm9zIGZvciBkZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcuCisgKgorICovCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworLyoqCisgKiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPSAwOiBhbGwgZGVidWdnaW5nIHR1cm5lZCBvZmYsIGRlYnVnIG1hY3JvcyB1bmRlZmluZWQKKyAqIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA9IDE6IGFsbCBkZWJ1Z2dpbmcgdHVybmVkIG9uCisgKi8KKyNkZWZpbmUgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIDAKKworLyoqCisgKiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID0gMDogYWxsIGxvZ2dpbmcgdHVybmVkIG9mZiwgbG9nZ2luZyBtYWNyb3MgdW5kZWZpbmVkCisgKiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID0gMTogYWxsIGxvZ2dpbmcgdHVybmVkIG9uCisgKi8KKyNkZWZpbmUgVF9HTE9CQUxfTE9HR0lOR19MRVZFTCAxCisKKy8qKgorICogU3RhbmRhcmQgd3JhcHBlciBhcm91bmQgZnByaW50ZiB3aGF0IHdpbGwgcHJlZml4IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKKyAqIG51bWJlciB0byB0aGUgbGluZS4gVXNlcyBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgdG8gY29udHJvbCB3aGV0aGVyIGl0IGlzCisgKiB0dXJuZWQgb24gb3Igb2ZmLgorICoKKyAqIEBwYXJhbSBmb3JtYXRfc3RyaW5nCisgKi8KKyNpZiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwCisjZGVmaW5lIFRfREVCVUcoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIFRfREVCVUcoZm9ybWF0X3N0cmluZywgLi4uKQorI2VuZGlmCisKKy8qKgorICogYW5hbG9nb3VzIHRvIFRfREVCVUcgYnV0IGFsc28gcHJpbnRzIHRoZSB0aW1lCisgKgorICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqLworI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKKyNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIlslcywlZF0gWyVzXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZGJndGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsIC4uLikKKyNlbmRpZgorCisvKioKKyAqIGFuYWxvZ291cyB0byBUX0RFQlVHIGJ1dCB1c2VzIGlucHV0IGxldmVsIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nCisgKiBzaG91bGQgYmUgbG9nZ2VkLgorICoKKyAqIEBwYXJhbSBpbnQgICAgIGxldmVsOiBzcGVjaWZpZWQgZGVidWcgbGV2ZWwKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IGZvcm1hdCBzdHJpbmcKKyAqLworI2RlZmluZSBUX0RFQlVHX0wobGV2ZWwsIGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKGxldmVsKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgXAorICB9CisKKy8qKgorICogRXhwbGljaXQgZXJyb3IgbG9nZ2luZy4gUHJpbnRzIHRpbWUsIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKKyAqCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZworICovCisjZGVmaW5lIFRfRVJST1IoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiWyVzLCVkXSBbJXNdIEVSUk9SOiAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkYmd0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyoqCisgKiBBbmFsb2dvdXMgdG8gVF9FUlJPUiwgYWRkaXRpb25hbGx5IGFib3J0aW5nIHRoZSBwcm9jZXNzLgorICogV0FSTklORzogbWFjcm8gY2FsbHMgYWJvcnQoKSwgZW5kaW5nIHByb2dyYW0gZXhlY3V0aW9uCisgKgorICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKKyAqLworI2RlZmluZSBUX0VSUk9SX0FCT1JUKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZGJndGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qKgorICogTG9nIGlucHV0IG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZworICovCisjaWYgVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA+IDAKKyNkZWZpbmUgVF9MT0dfT1BFUihmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIGRiZ3RpbWUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgVF9MT0dfT1BFUihmb3JtYXRfc3RyaW5nLCAuLi4pCisjZW5kaWYKKworLyoqCisgKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMCBvciB1bnNldDogbm9ybWFsIG9wZXJhdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGNhbGwgZGVidWcgbWVzc2FnZXMgZGlzYWJsZWQKKyAqIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPSAxOiAgICAgICAgICBsb2cgYSBkZWJ1ZyBtZXNzYWdlcyB3aGVuZXZlciBhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkYWJsZSB2aXJ0dWFsIGNhbGwgaXMgbWFkZQorICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDI6ICAgICAgICAgIHJlY29yZCBkZXRhaWxlZCBpbmZvIHRoYXQgY2FuIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlZCBieSBjYWxsaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfcHJpbnRfaW5mbygpCisgKi8KKyNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQorI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfdmlydHVhbF9jYWxsKHR5cGVpZCgqdGhpcykpCisjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoc3BlY2lmaWNfcHJvdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2wodHlwZWlkKCp0ZW1wbGF0ZV9jbGFzcyksIHR5cGVpZCgqZ2VuZXJpY19wcm90KSk7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID09IDEKKyNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKSBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gdmlydHVhbCBjYWxsXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoc3BlY2lmaWNfcHJvdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gZmFpbGVkIHRvIGNhc3QgdG8gc3BlY2lmaWMgcHJvdG9jb2wgdHlwZVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpCisjZGVmaW5lIFRfR0VORVJJQ19QUk9UT0NPTCh0ZW1wbGF0ZV9jbGFzcywgZ2VuZXJpY19wcm90LCBzcGVjaWZpY19wcm90KQorI2VuZGlmCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVExPR0dJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNhOWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitUT3V0cHV0IEdsb2JhbE91dHB1dDsKKwordm9pZCBUT3V0cHV0OjpwcmludGYoY29uc3QgY2hhciogbWVzc2FnZSwgLi4uKSB7CisjaWZuZGVmIFRIUklGVF9TUVVFTENIX0NPTlNPTEVfT1VUUFVUCisgIC8vIFRyeSB0byByZWR1Y2UgaGVhcCB1c2FnZSwgZXZlbiBpZiBwcmludGYgaXMgY2FsbGVkIHJhcmVseS4KKyAgc3RhdGljIGNvbnN0IGludCBTVEFDS19CVUZfU0laRSA9IDI1NjsKKyAgY2hhciBzdGFja19idWZbU1RBQ0tfQlVGX1NJWkVdOworICB2YV9saXN0IGFwOworCisjaWZkZWYgX01TQ19WRVIKKyAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICBpbnQgbmVlZCA9IF92c2NwcmludGYobWVzc2FnZSwgYXApOworICB2YV9lbmQoYXApOworCisgIGlmIChuZWVkIDwgU1RBQ0tfQlVGX1NJWkUpIHsKKyAgICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgICAgdnNucHJpbnRmX3Moc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgX1RSVU5DQVRFLCBtZXNzYWdlLCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICBmXyhzdGFja19idWYpOworICAgIHJldHVybjsKKyAgfQorI2Vsc2UKKyAgdmFfc3RhcnQoYXAsIG1lc3NhZ2UpOworICBpbnQgbmVlZCA9IHZzbnByaW50ZihzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgeworICAgIGZfKHN0YWNrX2J1Zik7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKworICBjaGFyKiBoZWFwX2J1ZiA9IChjaGFyKiltYWxsb2MoKG5lZWQgKyAxKSAqIHNpemVvZihjaGFyKSk7CisgIGlmIChoZWFwX2J1ZiA9PSBOVUxMKSB7CisjaWZkZWYgX01TQ19WRVIKKyAgICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgICAgdnNucHJpbnRmX3Moc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgX1RSVU5DQVRFLCBtZXNzYWdlLCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyNlbmRpZgorICAgIC8vIE1hbGxvYyBmYWlsZWQuICBXZSBtaWdodCBhcyB3ZWxsIHByaW50IHRoZSBzdGFjayBidWZmZXIuCisgICAgZl8oc3RhY2tfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKworICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBydmFsID0gdnNucHJpbnRmKGhlYXBfYnVmLCBuZWVkICsgMSwgbWVzc2FnZSwgYXApOworICB2YV9lbmQoYXApOworICAvLyBUT0RPKHNoaWdpbik6IGluZm9ybSB1c2VyCisgIGlmIChydmFsICE9IC0xKSB7CisgICAgZl8oaGVhcF9idWYpOworICB9CisgIGZyZWUoaGVhcF9idWYpOworI2VuZGlmCit9CisKK3ZvaWQgVE91dHB1dDo6ZXJyb3JUaW1lV3JhcHBlcihjb25zdCBjaGFyKiBtc2cpIHsKKyNpZm5kZWYgVEhSSUZUX1NRVUVMQ0hfQ09OU09MRV9PVVRQVVQKKyAgdGltZV90IG5vdzsKKyAgY2hhciBkYmd0aW1lWzI2XTsKKyAgdGltZSgmbm93KTsKKyAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7CisgIGRiZ3RpbWVbMjRdID0gMDsKKyAgZnByaW50ZihzdGRlcnIsICJUaHJpZnQ6ICVzICVzXG4iLCBkYmd0aW1lLCBtc2cpOworI2VuZGlmCit9CisKK3ZvaWQgVE91dHB1dDo6cGVycm9yKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7CisgIHN0ZDo6c3RyaW5nIG91dCA9IG1lc3NhZ2UgKyBzdGQ6OnN0cmluZygiOiAiKSArIHN0cmVycm9yX3MoZXJybm9fY29weSk7CisgIGZfKG91dC5jX3N0cigpKTsKK30KKworc3RkOjpzdHJpbmcgVE91dHB1dDo6c3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSkgeworI2lmbmRlZiBIQVZFX1NUUkVSUk9SX1IKKyAgcmV0dXJuICJlcnJubyA9ICIgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisjZWxzZSAvLyBIQVZFX1NUUkVSUk9SX1IKKworICBjaGFyIGJfZXJyYnVmWzEwMjRdID0geydcMCd9OworI2lmZGVmIFNUUkVSUk9SX1JfQ0hBUl9QCisgIGNoYXIqIGJfZXJyb3IgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKKyNlbHNlCisgIGNoYXIqIGJfZXJyb3IgPSBiX2VycmJ1ZjsKKyAgaW50IHJ2ID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7CisgIGlmIChydiA9PSAtMSkgeworICAgIC8vIHN0cmVycm9yX3IgZmFpbGVkLiAgb21nd3RmYmJxLgorICAgIHJldHVybiAiWFNJLWNvbXBsaWFudCBzdHJlcnJvcl9yKCkgZmFpbGVkIHdpdGggZXJybm8gPSAiCisgICAgICAgICAgICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworICB9CisjZW5kaWYKKyAgLy8gQ2FuIGFueW9uZSBwcm92ZSB0aGF0IGV4cGxpY2l0IGNhc3QgaXMgcHJvYmFibHkgbm90IG5lY2Vzc2FyeQorICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5nIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBiZWZvcmUKKyAgLy8gYl9lcnJvciBiZWNvbWVzIGludmFsaWQ/CisgIHJldHVybiBzdGQ6OnN0cmluZyhiX2Vycm9yKTsKKworI2VuZGlmIC8vIEhBVkVfU1RSRVJST1JfUgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3NWY3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfT1VUUFVUX0hfCisjZGVmaW5lIF9USFJJRlRfT1VUUFVUX0hfIDEKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVE91dHB1dCB7CitwdWJsaWM6CisgIFRPdXRwdXQoKSA6IGZfKCZlcnJvclRpbWVXcmFwcGVyKSB7fQorCisgIGlubGluZSB2b2lkIHNldE91dHB1dEZ1bmN0aW9uKHZvaWQgKCpmdW5jdGlvbikoY29uc3QgY2hhciopKSB7IGZfID0gZnVuY3Rpb247IH0KKworICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsgZl8obWVzc2FnZSk7IH0KKworICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBhIGNvbnN0IGNoYXIqIG92ZXJsb2FkIGhlcmUgaW5zdGVhZCBvZgorICAvLyBqdXN0IHRoZSBzdHJpbmcgdmVyc2lvbiwgb3RoZXJ3aXNlIGVycm5vIGNvdWxkIGJlIGNvcnJ1cHRlZAorICAvLyBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gYWxsb2NhdGluZyBtZW1vcnkgd2hlbiBjb25zdHJ1Y3RpbmcKKyAgLy8gdGhlIHN0cmluZy4KKyAgdm9pZCBwZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpOworICBpbmxpbmUgdm9pZCBwZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7CisgICAgcGVycm9yKG1lc3NhZ2UuY19zdHIoKSwgZXJybm9fY29weSk7CisgIH0KKworICB2b2lkIHByaW50Zihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pOworCisgIHN0YXRpYyB2b2lkIGVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKTsKKworICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHN0cmVycm9yX3MoaW50IGVycm5vX2NvcHkpOworCitwcml2YXRlOgorICB2b2lkICgqZl8pKGNvbnN0IGNoYXIqKTsKK307CisKK2V4dGVybiBUT3V0cHV0IEdsb2JhbE91dHB1dDsKK30KK30gLy8gbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvL19USFJJRlRfT1VUUFVUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ2NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFBST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX1RQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworLyoqCisgKiBWaXJ0dWFsIGludGVyZmFjZSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHByb2Nlc3Nvci4gVG8KKyAqIHVzZSB0aGlzIHlvdSBzaG91bGQgc3ViY2xhc3MgaXQgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHlvdSBjYXJlCisgKiBhYm91dC4gWW91ciBzdWJjbGFzcyBjYW4gYWxzbyBzdG9yZSBsb2NhbCBkYXRhIHRoYXQgeW91IG1heSBjYXJlIGFib3V0LAorICogc3VjaCBhcyBhZGRpdGlvbmFsICJhcmd1bWVudHMiIHRvIHRoZXNlIG1ldGhvZHMgKHN0b3JlZCBpbiB0aGUgb2JqZWN0CisgKiBpbnN0YW5jZSdzIHN0YXRlKS4KKyAqLworY2xhc3MgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSB7fQorCisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIGNhbGxpbmcgb3RoZXIgY2FsbGJhY2sgbWV0aG9kcy4KKyAgICogRXhwZWN0ZWQgdG8gcmV0dXJuIHNvbWUgc29ydCBvZiBjb250ZXh0IG9iamVjdC4KKyAgICogVGhlIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgdG8gYWxsIG90aGVyIGNhbGxiYWNrcworICAgKiBmb3IgdGhhdCBmdW5jdGlvbiBpbnZvY2F0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKKyAgICAodm9pZClmbl9uYW1lOworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKioKKyAgICogRXhwZWN0ZWQgdG8gZnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgY29udGV4dC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBmcmVlQ29udGV4dCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHJlYWRpbmcgYXJndW1lbnRzLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHByZVJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJldHdlZW4gcmVhZGluZyBhcmd1bWVudHMgYW5kIGNhbGxpbmcgdGhlIGhhbmRsZXIuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcG9zdFJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICAgICh2b2lkKWJ5dGVzOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZXR3ZWVuIGNhbGxpbmcgdGhlIGhhbmRsZXIgYW5kIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBhZnRlciB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICAgICh2b2lkKWJ5dGVzOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGFuIGFzeW5jIGZ1bmN0aW9uIGNhbGwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBhc3luY0NvbXBsZXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQgaGFuZGxlckVycm9yKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICB9CisKK3Byb3RlY3RlZDoKKyAgVFByb2Nlc3NvckV2ZW50SGFuZGxlcigpIHt9Cit9OworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIHRvIGZyZWUgZWFjaCBjb250ZXh0LgorICovCitjbGFzcyBUUHJvY2Vzc29yQ29udGV4dEZyZWVyIHsKK3B1YmxpYzoKKyAgVFByb2Nlc3NvckNvbnRleHRGcmVlcihUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyLCB2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXRob2QpCisgICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwgY29udGV4dF8oY29udGV4dCksIG1ldGhvZF8obWV0aG9kKSB7fQorICB+VFByb2Nlc3NvckNvbnRleHRGcmVlcigpIHsKKyAgICBpZiAoaGFuZGxlcl8gIT0gTlVMTCkKKyAgICAgIGhhbmRsZXJfLT5mcmVlQ29udGV4dChjb250ZXh0XywgbWV0aG9kXyk7CisgIH0KKyAgdm9pZCB1bnJlZ2lzdGVyKCkgeyBoYW5kbGVyXyA9IE5VTEw7IH0KKworcHJpdmF0ZToKKyAgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXJfOworICB2b2lkKiBjb250ZXh0XzsKKyAgY29uc3QgY2hhciogbWV0aG9kXzsKK307CisKKy8qKgorICogQSBwcm9jZXNzb3IgaXMgYSBnZW5lcmljIG9iamVjdCB0aGF0IGFjdHMgdXBvbiB0d28gc3RyZWFtcyBvZiBkYXRhLCBvbmUKKyAqIGFuIGlucHV0IGFuZCB0aGUgb3RoZXIgYW4gb3V0cHV0LiBUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIG9iamVjdCBpcyBsb29zZSwKKyAqIHRob3VnaCB0aGUgdHlwaWNhbCBjYXNlIGlzIGZvciBzb21lIHNvcnQgb2Ygc2VydmVyIHRoYXQgZWl0aGVyIGdlbmVyYXRlcworICogcmVzcG9uc2VzIHRvIGFuIGlucHV0IHN0cmVhbSBvciBmb3J3YXJkcyBkYXRhIGZyb20gb25lIHBpcGUgb250byBhbm90aGVyLgorICoKKyAqLworY2xhc3MgVFByb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRQcm9jZXNzb3IoKSB7fQorCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpID0gMDsKKworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbywgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICByZXR1cm4gcHJvY2VzcyhpbywgaW8sIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisKKyAgdm9pZCBzZXRFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisgIH0KKworcHJvdGVjdGVkOgorICBUUHJvY2Vzc29yKCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKK307CisKKy8qKgorICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBhbGxvdyBzdGQ6OnNoYXJlZF9wdHIgdG8gYmUgdXNlZCB3aXRoIGhhbmRsZXIKKyAqIHBvaW50ZXJzIHJldHVybmVkIGJ5IHRoZSBnZW5lcmF0ZWQgaGFuZGxlciBmYWN0b3JpZXMuCisgKgorICogVGhlIGhhbmRsZXIgZmFjdG9yeSBjbGFzc2VzIGdlbmVyYXRlZCBieSB0aGUgdGhyaWZ0IGNvbXBpbGVyIHJldHVybiByYXcKKyAqIHBvaW50ZXJzLCBhbmQgZmFjdG9yeS0+cmVsZWFzZUhhbmRsZXIoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kbGVyIGlzCisgKiBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIEEgUmVsZWFzZUhhbmRsZXIgb2JqZWN0IGNhbiBiZSBpbnN0YW50aWF0ZWQgYW5kIHBhc3NlZCBhcyB0aGUgc2Vjb25kCisgKiBwYXJhbWV0ZXIgdG8gYSBzaGFyZWRfcHRyLCBzbyB0aGF0IGZhY3RvcnktPnJlbGVhc2VIYW5kbGVyKCkgd2lsbCBiZSBjYWxsZWQKKyAqIHdoZW4gdGhlIG9iamVjdCBpcyBubyBsb25nZXIgbmVlZGVkLCBpbnN0ZWFkIG9mIGRlbGV0aW5nIHRoZSBwb2ludGVyLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlckZhY3RvcnlfPgorY2xhc3MgUmVsZWFzZUhhbmRsZXIgeworcHVibGljOgorICBSZWxlYXNlSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiYgaGFuZGxlckZhY3RvcnkpCisgICAgOiBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xzo6SGFuZGxlciogaGFuZGxlcikgeworICAgIGlmIChoYW5kbGVyKSB7CisgICAgICBoYW5kbGVyRmFjdG9yeV8tPnJlbGVhc2VIYW5kbGVyKGhhbmRsZXIpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiBoYW5kbGVyRmFjdG9yeV87Cit9OworCitzdHJ1Y3QgVENvbm5lY3Rpb25JbmZvIHsKKyAgLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzCisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKKyAgLy8gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uCisgIC8vIFRoaXMgaXMgdGhlIHRyYW5zcG9ydCB0aGF0IHdhcyByZXR1cm5lZCBieSBUU2VydmVyVHJhbnNwb3J0OjphY2NlcHQoKSwKKyAgLy8gYW5kIGl0IG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgdHJhbnNwb3J0IHBvaW50ZWQgdG8gYnkgdGhlIGlucHV0IGFuZAorICAvLyBvdXRwdXQgcHJvdG9jb2xzLgorICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7Cit9OworCitjbGFzcyBUUHJvY2Vzc29yRmFjdG9yeSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRQcm9jZXNzb3JGYWN0b3J5KCkge30KKworICAvKioKKyAgICogR2V0IHRoZSBUUHJvY2Vzc29yIHRvIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGlzIGFsd2F5cyBpbnZva2VkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcworICAgKiBhY2NlcHRlZCBvbi4gIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhpcyBjYWxsIGRvZXMgbm90IG5lZWQgdG8gYmUKKyAgICogdGhyZWFkIHNhZmUsIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGludm9rZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOworfTsKKworY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBwdWJsaWMgVFByb2Nlc3NvckZhY3RvcnkgeworcHVibGljOgorICBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJikgeyByZXR1cm4gcHJvY2Vzc29yXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKK307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzgwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RPU1RSSU5HX0hfCisjZGVmaW5lIF9USFJJRlRfVE9TVFJJTkdfSF8gMQorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBUJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCisvLyBUT0RPOiByZXBsYWNlIHRoZSBjb21wdXRhdGlvbnMgYmVsb3cgd2l0aCBzdGQ6Om51bWVyaWNfbGltaXRzOjptYXhfZGlnaXRzMTAgb25jZSBDKysxMQorLy8gaXMgZW5hYmxlZC4KK2lubGluZSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgZmxvYXQmIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8ucHJlY2lzaW9uKHN0YXRpY19jYXN0PHN0ZDo6c3RyZWFtc2l6ZT4oc3RkOjpjZWlsKHN0YXRpY19jYXN0PGRvdWJsZT4oc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBkb3VibGUmIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8ucHJlY2lzaW9uKHN0YXRpY19jYXN0PHN0ZDo6c3RyZWFtc2l6ZT4oc3RkOjpjZWlsKHN0YXRpY19jYXN0PGRvdWJsZT4oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgbG9uZyBkb3VibGUmIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8ucHJlY2lzaW9uKHN0YXRpY19jYXN0PHN0ZDo6c3RyZWFtc2l6ZT4oc3RkOjpjZWlsKHN0YXRpY19jYXN0PGRvdWJsZT4oc3RkOjpudW1lcmljX2xpbWl0czxsb25nIGRvdWJsZT46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjptYXA8SywgVj4mIG0pOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6OnNldDxUPiYgcyk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB0KTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgdHlwZW5hbWUgc3RkOjpwYWlyPEssIFY+JiB2KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8IHRvX3N0cmluZyh2LmZpcnN0KSA8PCAiOiAiIDw8IHRvX3N0cmluZyh2LnNlY29uZCk7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBUJiBiZWcsIGNvbnN0IFQmIGVuZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgZm9yIChUIGl0ID0gYmVnOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICBpZiAoaXQgIT0gYmVnKQorICAgICAgbyA8PCAiLCAiOworICAgIG8gPDwgdG9fc3RyaW5nKCppdCk7CisgIH0KKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8ICJbIiA8PCB0b19zdHJpbmcodC5iZWdpbigpLCB0LmVuZCgpKSA8PCAiXSI7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6Om1hcDxLLCBWPiYgbSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCAieyIgPDwgdG9fc3RyaW5nKG0uYmVnaW4oKSwgbS5lbmQoKSkgPDwgIn0iOworICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjpzZXQ8VD4mIHMpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgInsiIDw8IHRvX3N0cmluZyhzLmJlZ2luKCksIHMuZW5kKCkpIDw8ICJ9IjsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyBfVEhSSUZUX1RPU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyMjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0hfCisjZGVmaW5lIF9USFJJRlRfVEhSSUZUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RPdXRwdXQuaD4KKworI2RlZmluZSBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHgpICgodm9pZCkoeCkpCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK2NsYXNzIFRFbnVtSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIqPiA+IHsKK3B1YmxpYzoKKyAgVEVudW1JdGVyYXRvcihpbnQgbiwgaW50KiBlbnVtcywgY29uc3QgY2hhcioqIG5hbWVzKQorICAgIDogaWlfKDApLCBuXyhuKSwgZW51bXNfKGVudW1zKSwgbmFtZXNfKG5hbWVzKSB7fQorCisgIGludCBvcGVyYXRvcisrKCkgeyByZXR1cm4gKytpaV87IH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgVEVudW1JdGVyYXRvciYgZW5kKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShlbmQpOworICAgIGFzc2VydChlbmQubl8gPT0gLTEpOworICAgIHJldHVybiAoaWlfICE9IG5fKTsKKyAgfQorCisgIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIqPiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihlbnVtc19baWlfXSwgbmFtZXNfW2lpX10pOyB9CisKK3ByaXZhdGU6CisgIGludCBpaV87CisgIGNvbnN0IGludCBuXzsKKyAgaW50KiBlbnVtc187CisgIGNvbnN0IGNoYXIqKiBuYW1lc187Cit9OworCitjbGFzcyBURXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVEV4Y2VwdGlvbigpIDogbWVzc2FnZV8oKSB7fQorCisgIFRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogbWVzc2FnZV8obWVzc2FnZSkge30KKworICB2aXJ0dWFsIH5URXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiAiRGVmYXVsdCBURXhjZXB0aW9uLiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOworfTsKKworY2xhc3MgVERlbGF5ZWRFeGNlcHRpb24geworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgRT4KKyAgc3RhdGljIFREZWxheWVkRXhjZXB0aW9uKiBkZWxheUV4Y2VwdGlvbihjb25zdCBFJiBlKTsKKyAgdmlydHVhbCB2b2lkIHRocm93X2l0KCkgPSAwOworICB2aXJ0dWFsIH5URGVsYXllZEV4Y2VwdGlvbigpe307Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRT4KK2NsYXNzIFRFeGNlcHRpb25XcmFwcGVyIDogcHVibGljIFREZWxheWVkRXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVEV4Y2VwdGlvbldyYXBwZXIoY29uc3QgRSYgZSkgOiBlXyhlKSB7fQorICB2aXJ0dWFsIHZvaWQgdGhyb3dfaXQoKSB7CisgICAgRSB0ZW1wKGVfKTsKKyAgICBkZWxldGUgdGhpczsKKyAgICB0aHJvdyB0ZW1wOworICB9CisKK3ByaXZhdGU6CisgIEUgZV87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRT4KK1REZWxheWVkRXhjZXB0aW9uKiBURGVsYXllZEV4Y2VwdGlvbjo6ZGVsYXlFeGNlcHRpb24oY29uc3QgRSYgZSkgeworICByZXR1cm4gbmV3IFRFeGNlcHRpb25XcmFwcGVyPEU+KGUpOworfQorCisjaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA+IDEKK3ZvaWQgcHJvZmlsZV92aXJ0dWFsX2NhbGwoY29uc3Qgc3RkOjp0eXBlX2luZm8mIGluZm8pOwordm9pZCBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRlbXBsYXRlX3R5cGUsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBwcm90X3R5cGUpOwordm9pZCBwcm9maWxlX3ByaW50X2luZm8oRklMRSogZik7Cit2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbygpOwordm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mKEZJTEUqIGdlbl9jYWxsc19mLCBGSUxFKiB2aXJ0dWFsX2NhbGxzX2YpOworI2VuZGlmCit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlMzQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCisvLyBEbyBub3RoaW5nIGlmIHZpcnR1YWwgY2FsbCBwcm9maWxpbmcgaXMgbm90IGVuYWJsZWQKKyNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQorCisvLyBUT0RPOiBUaGlzIGNvZGUgb25seSB3b3JrcyB3aXRoIGcrKyAoc2luY2Ugd2UgcmVseSBvbiB0aGUgZmFjdAorLy8gdGhhdCBhbGwgc3RkOjp0eXBlX2luZm8gaW5zdGFuY2VzIHJlZmVycmluZyB0byBhIHBhcnRpY3VsYXIgdHlwZQorLy8gYWx3YXlzIHJldHVybiB0aGUgZXhhY3Qgc2FtZSBwb2ludGVyIHZhbHVlIGZyb20gbmFtZSgpLikKKyNpZm5kZWYgX19HTlVHX18KKyNlcnJvciAiVGhyaWZ0IHZpcnR1YWwgZnVuY3Rpb24gcHJvZmlsaW5nIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggZ2NjIgorI2VuZGlmIC8vICFfX0dOVUdfXworCisvLyBUT0RPOiBXZSBhbHNvIHJlcXVpcmUgZ2xpYmMgZm9yIHRoZSBiYWNrdHJhY2UoKSBhbmQgYmFja3RyYWNlX3N5bWJvbHMoKQorLy8gZnVuY3Rpb25zLgorI2lmbmRlZiBfX0dMSUJDX18KKyNlcnJvciAiVGhyaWZ0IHZpcnR1YWwgZnVuY3Rpb24gcHJvZmlsaW5nIGN1cnJlbnRseSByZXF1aXJlcyBnbGliYyIKKyNlbmRpZiAvLyAhX19HTElCQ19fCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKworI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KKyNpbmNsdWRlIDxleGVjaW5mby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3VzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfU1RBQ0tfREVQVEggPSAxNTsKKworLyoqCisgKiBBIHN0YWNrIHRyYWNlCisgKi8KK2NsYXNzIEJhY2t0cmFjZSB7CitwdWJsaWM6CisgIEJhY2t0cmFjZShpbnQgc2tpcCA9IDApOworICBCYWNrdHJhY2UoQmFja3RyYWNlIGNvbnN0JiBidCk7CisKKyAgdm9pZCBvcGVyYXRvcj0oQmFja3RyYWNlIGNvbnN0JiBidCkgeworICAgIG51bUNhbGxlcnNfID0gYnQubnVtQ2FsbGVyc187CisgICAgaWYgKG51bUNhbGxlcnNfID49IDApIHsKKyAgICAgIG1lbWNweShjYWxsZXJzXywgYnQuY2FsbGVyc18sIG51bUNhbGxlcnNfICogc2l6ZW9mKHZvaWQqKSk7CisgICAgfQorICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KEJhY2t0cmFjZSBjb25zdCYgYnQpIGNvbnN0IHsgcmV0dXJuIChjbXAoYnQpID09IDApOyB9CisKKyAgc2l6ZV90IGhhc2goKSBjb25zdCB7CisgICAgaW50cHRyX3QgcmV0ID0gMDsKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKKyAgICAgIHJldCBePSByZWludGVycHJldF9jYXN0PGludHB0cl90PihjYWxsZXJzX1tuXSk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCk7CisgIH0KKworICBpbnQgY21wKEJhY2t0cmFjZSBjb25zdCYgYnQpIGNvbnN0IHsKKyAgICBpbnQgZGVwdGhfZGlmZiA9IChudW1DYWxsZXJzXyAtIGJ0Lm51bUNhbGxlcnNfKTsKKyAgICBpZiAoZGVwdGhfZGlmZiAhPSAwKSB7CisgICAgICByZXR1cm4gZGVwdGhfZGlmZjsKKyAgICB9CisKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKKyAgICAgIGludCBkaWZmID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oY2FsbGVyc19bbl0pCisgICAgICAgICAgICAgICAgIC0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYnQuY2FsbGVyc19bbl0pOworICAgICAgaWYgKGRpZmYgIT0gMCkgeworICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZvaWQgcHJpbnQoRklMRSogZiwgaW50IGluZGVudCA9IDAsIGludCBzdGFydCA9IDApIGNvbnN0IHsKKyAgICBjaGFyKiogc3RyaW5ncyA9IGJhY2t0cmFjZV9zeW1ib2xzKGNhbGxlcnNfLCBudW1DYWxsZXJzXyk7CisgICAgaWYgKHN0cmluZ3MpIHsKKyAgICAgIHN0YXJ0ICs9IHNraXBfOworICAgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCA9IDA7CisgICAgICB9CisgICAgICBmb3IgKGludCBuID0gc3RhcnQ7IG4gPCBudW1DYWxsZXJzXzsgKytuKSB7CisgICAgICAgIGZwcmludGYoZiwgIiUqcyMlLTJkICVzXG4iLCBpbmRlbnQsICIiLCBuLCBzdHJpbmdzW25dKTsKKyAgICAgIH0KKyAgICAgIGZyZWUoc3RyaW5ncyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoZiwgIiUqczxmYWlsZWQgdG8gZGV0ZXJtaW5lIHN5bWJvbHM+XG4iLCBpbmRlbnQsICIiKTsKKyAgICB9CisgIH0KKworICBpbnQgZ2V0RGVwdGgoKSBjb25zdCB7IHJldHVybiBudW1DYWxsZXJzXyAtIHNraXBfOyB9CisKKyAgdm9pZCogZ2V0RnJhbWUoaW50IGluZGV4KSBjb25zdCB7CisgICAgaW50IGFkanVzdGVkX2luZGV4ID0gaW5kZXggKyBza2lwXzsKKyAgICBpZiAoYWRqdXN0ZWRfaW5kZXggPCAwIHx8IGFkanVzdGVkX2luZGV4ID49IG51bUNhbGxlcnNfKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGNhbGxlcnNfW2FkanVzdGVkX2luZGV4XTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkKiBjYWxsZXJzX1tNQVhfU1RBQ0tfREVQVEhdOworICBpbnQgbnVtQ2FsbGVyc187CisgIGludCBza2lwXzsKK307CisKKy8vIERlZmluZSB0aGUgY29uc3RydWN0b3JzIG5vbi1pbmxpbmUsIHNvIHRoZXkgY29uc2lzdGVudGx5IGFkZCBhIHNpbmdsZQorLy8gZnJhbWUgdG8gdGhlIHN0YWNrIHRyYWNlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQKK0JhY2t0cmFjZTo6QmFja3RyYWNlKGludCBza2lwKQorICA6IHNraXBfKHNraXAgKyAxKSAvLyBpZ25vcmUgdGhlIGNvbnN0cnVjdG9yIGl0c2VsZgoreworICBudW1DYWxsZXJzXyA9IGJhY2t0cmFjZShjYWxsZXJzXywgTUFYX1NUQUNLX0RFUFRIKTsKKyAgaWYgKHNraXBfID4gbnVtQ2FsbGVyc18pIHsKKyAgICBza2lwXyA9IG51bUNhbGxlcnNfOworICB9Cit9CisKK0JhY2t0cmFjZTo6QmFja3RyYWNlKEJhY2t0cmFjZSBjb25zdCYgYnQpIDogbnVtQ2FsbGVyc18oYnQubnVtQ2FsbGVyc18pLCBza2lwXyhidC5za2lwXykgeworICBpZiAobnVtQ2FsbGVyc18gPj0gMCkgeworICAgIG1lbWNweShjYWxsZXJzXywgYnQuY2FsbGVyc18sIG51bUNhbGxlcnNfICogc2l6ZW9mKHZvaWQqKSk7CisgIH0KK30KKworLyoqCisgKiBBIGJhY2t0cmFjZSwgcGx1cyBvbmUgb3IgdHdvIHR5cGUgbmFtZXMKKyAqLworY2xhc3MgS2V5IHsKK3B1YmxpYzoKKyAgY2xhc3MgSGFzaCB7CisgIHB1YmxpYzoKKyAgICBzaXplX3Qgb3BlcmF0b3IoKShLZXkgY29uc3QmIGspIGNvbnN0IHsgcmV0dXJuIGsuaGFzaCgpOyB9CisgIH07CisKKyAgS2V5KGNvbnN0IEJhY2t0cmFjZSogYnQsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8pCisgICAgOiBiYWNrdHJhY2VfKGJ0KSwgdHlwZU5hbWUxXyh0eXBlX2luZm8ubmFtZSgpKSwgdHlwZU5hbWUyXyhOVUxMKSB7fQorCisgIEtleShjb25zdCBCYWNrdHJhY2UqIGJ0LCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvMSwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzIpCisgICAgOiBiYWNrdHJhY2VfKGJ0KSwgdHlwZU5hbWUxXyh0eXBlX2luZm8xLm5hbWUoKSksIHR5cGVOYW1lMl8odHlwZV9pbmZvMi5uYW1lKCkpIHt9CisKKyAgS2V5KGNvbnN0IEtleSYgaykKKyAgICA6IGJhY2t0cmFjZV8oay5iYWNrdHJhY2VfKSwgdHlwZU5hbWUxXyhrLnR5cGVOYW1lMV8pLCB0eXBlTmFtZTJfKGsudHlwZU5hbWUyXykge30KKworICB2b2lkIG9wZXJhdG9yPShjb25zdCBLZXkmIGspIHsKKyAgICBiYWNrdHJhY2VfID0gay5iYWNrdHJhY2VfOworICAgIHR5cGVOYW1lMV8gPSBrLnR5cGVOYW1lMV87CisgICAgdHlwZU5hbWUyXyA9IGsudHlwZU5hbWUyXzsKKyAgfQorCisgIGNvbnN0IEJhY2t0cmFjZSogZ2V0QmFja3RyYWNlKCkgY29uc3QgeyByZXR1cm4gYmFja3RyYWNlXzsgfQorCisgIGNvbnN0IGNoYXIqIGdldFR5cGVOYW1lKCkgY29uc3QgeyByZXR1cm4gdHlwZU5hbWUxXzsgfQorCisgIGNvbnN0IGNoYXIqIGdldFR5cGVOYW1lMigpIGNvbnN0IHsgcmV0dXJuIHR5cGVOYW1lMl87IH0KKworICB2b2lkIG1ha2VQZXJzaXN0ZW50KCkgeworICAgIC8vIENvcHkgdGhlIEJhY2t0cmFjZSBvYmplY3QKKyAgICBiYWNrdHJhY2VfID0gbmV3IEJhY2t0cmFjZSgqYmFja3RyYWNlXyk7CisKKyAgICAvLyBOT1RFOiBXZSBkb24ndCBjb3B5IHRoZSB0eXBlIG5hbWUuCisgICAgLy8gVGhlIEdOVSBsaWJzdGRjKysgaW1wbGVtZW50YXRpb24gb2YgdHlwZV9pbmZvOjpuYW1lKCkgcmV0dXJucyBhIHZhbHVlCisgICAgLy8gdGhhdCB3aWxsIGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2dyYW0uICAoQWx0aG91Z2ggdGhlIEMrKworICAgIC8vIHN0YW5kYXJkIGRvZXNuJ3QgZ3VhcmFudGVlIHRoaXMgd2lsbCBiZSB0cnVlIG9uIGFsbCBpbXBsZW1lbnRhdGlvbnMuKQorICB9CisKKyAgLyoqCisgICAqIENsZWFuIHVwIG1lbW9yeSBhbGxvY2F0ZWQgYnkgbWFrZVBlcnNpc3RlbnQoKQorICAgKgorICAgKiBTaG91bGQgb25seSBiZSBpbnZva2VkIGlmIG1ha2VQZXJzaXN0ZW50KCkgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQuCisgICAqIFRoZSBLZXkgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyIGNsZWFudXAoKSBpcyBjYWxsZWQuCisgICAqLworICB2b2lkIGNsZWFudXAoKSB7CisgICAgZGVsZXRlIGJhY2t0cmFjZV87CisgICAgYmFja3RyYWNlXyA9IE5VTEw7CisgIH0KKworICBpbnQgY21wKGNvbnN0IEtleSYgaykgY29uc3QgeworICAgIGludCByZXQgPSBiYWNrdHJhY2VfLT5jbXAoKmsuYmFja3RyYWNlXyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIE5PVEU6IFdlIGNvbXBhcmUganVzdCB0aGUgbmFtZSBwb2ludGVycy4KKyAgICAvLyBXaXRoIEdOVSBsaWJzdGRjKyssIGV2ZXJ5IHR5cGVfaW5mbyBvYmplY3QgZm9yIHRoZSBzYW1lIHR5cGUgcG9pbnRzIHRvCisgICAgLy8gZXhhY3RseSB0aGUgc2FtZSBuYW1lIHN0cmluZy4gIChBbHRob3VnaCB0aGlzIGlzbid0IGd1YXJhbnRlZWQgYnkgdGhlCisgICAgLy8gQysrIHN0YW5kYXJkLikKKyAgICByZXQgPSBrLnR5cGVOYW1lMV8gLSB0eXBlTmFtZTFfOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIGsudHlwZU5hbWUyXyAtIHR5cGVOYW1lMl87CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgS2V5JiBrKSBjb25zdCB7IHJldHVybiBjbXAoaykgPT0gMDsgfQorCisgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgIC8vIE5PVEU6IEFzIGFib3ZlLCB3ZSBqdXN0IHVzZSB0aGUgbmFtZSBwb2ludGVyIHZhbHVlLgorICAgIC8vIFdvcmtzIHdpdGggR05VIGxpYnN0ZGMrKywgYnV0IG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3Qgb24gYWxsCisgICAgLy8gaW1wbGVtZW50YXRpb25zLgorICAgIHJldHVybiBiYWNrdHJhY2VfLT5oYXNoKCkgXiByZWludGVycHJldF9jYXN0PHNpemVfdD4odHlwZU5hbWUxXykKKyAgICAgICAgICAgXiByZWludGVycHJldF9jYXN0PHNpemVfdD4odHlwZU5hbWUyXyk7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgQmFja3RyYWNlKiBiYWNrdHJhY2VfOworICBjb25zdCBjaGFyKiB0eXBlTmFtZTFfOworICBjb25zdCBjaGFyKiB0eXBlTmFtZTJfOworfTsKKworLyoqCisgKiBBIGZ1bmN0b3IgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIG9mIHR3byBCYWNrdHJhY2VNYXAgZW50cmllcworICogaGFzIGEgaGlnaGVyIGNvdW50LgorICovCitjbGFzcyBDb3VudEdyZWF0ZXIgeworcHVibGljOgorICBib29sIG9wZXJhdG9yKCkoc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDEsIHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gYnQyKSBjb25zdCB7CisgICAgcmV0dXJuIGJ0MS5zZWNvbmQgPiBidDIuc2Vjb25kOworICB9Cit9OworCit0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tYXA8S2V5LCBzaXplX3QsIEtleTo6SGFzaD4gQmFja3RyYWNlTWFwOworCisvKioKKyAqIEEgbWFwIGRlc2NyaWJpbmcgaG93IG1hbnkgdGltZXMgVF9WSVJUVUFMX0NBTEwoKSBoYXMgYmVlbiBpbnZva2VkLgorICovCitCYWNrdHJhY2VNYXAgdmlydHVhbF9jYWxsczsKK011dGV4IHZpcnR1YWxfY2FsbHNfbXV0ZXg7CisKKy8qKgorICogQSBtYXAgZGVzY3JpYmluZyBob3cgbWFueSB0aW1lcyBUX0dFTkVSSUNfUFJPVE9DT0woKSBoYXMgYmVlbiBpbnZva2VkLgorICovCitCYWNrdHJhY2VNYXAgZ2VuZXJpY19jYWxsczsKK011dGV4IGdlbmVyaWNfY2FsbHNfbXV0ZXg7CisKK3ZvaWQgX3JlY29yZF9iYWNrdHJhY2UoQmFja3RyYWNlTWFwKiBtYXAsIGNvbnN0IE11dGV4JiBtdXRleCwgS2V5KiBrKSB7CisgIEd1YXJkIGd1YXJkKG11dGV4KTsKKworICBCYWNrdHJhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbWFwLT5maW5kKCprKTsKKyAgaWYgKGl0ID09IG1hcC0+ZW5kKCkpIHsKKyAgICBrLT5tYWtlUGVyc2lzdGVudCgpOworICAgIG1hcC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCprLCAxKSk7CisgIH0gZWxzZSB7CisgICAgLy8gaW5jcmVtZW50IHRoZSBjb3VudAorICAgIC8vIE5PVEU6IHdlIGNvdWxkIGFzc2VydCBpZiBpdC0+c2Vjb25kIGlzIDAgYWZ0ZXJ3YXJkcywgc2luY2UgdGhhdCB3b3VsZAorICAgIC8vIG1lYW4gd2UndmUgd3JhcHBlZC4KKyAgICArKyhpdC0+c2Vjb25kKTsKKyAgfQorfQorCisvKioKKyAqIFJlY29yZCBhbiB1bm5lY2Vzc2FyeSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwuCisgKgorICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgVF9WSVJUVUFMX0NBTEwoKSBtYWNyby4KKyAqLwordm9pZCBwcm9maWxlX3ZpcnR1YWxfY2FsbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZSkgeworICBpbnQgY29uc3Qgc2tpcCA9IDE7IC8vIGlnbm9yZSB0aGlzIGZyYW1lCisgIEJhY2t0cmFjZSBidChza2lwKTsKKyAgS2V5IGsoJmJ0LCB0eXBlKTsKKyAgX3JlY29yZF9iYWNrdHJhY2UoJnZpcnR1YWxfY2FsbHMsIHZpcnR1YWxfY2FsbHNfbXV0ZXgsICZrKTsKK30KKworLyoqCisgKiBSZWNvcmQgYSBjYWxsIHRvIGEgdGVtcGxhdGUgcHJvY2Vzc29yIHdpdGggYSBwcm90b2NvbCB0aGF0IGlzIG5vdCB0aGUgb25lCisgKiBzcGVjaWZpZWQgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBUX0dFTkVSSUNfUFJPVE9DT0woKSBtYWNyby4KKyAqLwordm9pZCBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRlbXBsYXRlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgcHJvdF90eXBlKSB7CisgIGludCBjb25zdCBza2lwID0gMTsgLy8gaWdub3JlIHRoaXMgZnJhbWUKKyAgQmFja3RyYWNlIGJ0KHNraXApOworICBLZXkgaygmYnQsIHRlbXBsYXRlX3R5cGUsIHByb3RfdHlwZSk7CisgIF9yZWNvcmRfYmFja3RyYWNlKCZnZW5lcmljX2NhbGxzLCBnZW5lcmljX2NhbGxzX211dGV4LCAmayk7Cit9CisKKy8qKgorICogUHJpbnQgdGhlIHJlY29yZGVkIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCisgKi8KK3ZvaWQgcHJvZmlsZV9wcmludF9pbmZvKEZJTEUqIGYpIHsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+ID4gQmFja3RyYWNlVmVjdG9yOworCisgIENvdW50R3JlYXRlciBpc19ncmVhdGVyOworCisgIC8vIEdyYWIgYm90aCBsb2NrcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcmludCBvcGVyYXRpb24sCisgIC8vIHRvIGVuc3VyZSB0aGUgb3V0cHV0IGlzIGEgY29uc2lzdGVudCBzbmFwc2hvdCBvZiBhIHNpbmdsZSBwb2ludCBpbiB0aW1lCisgIEd1YXJkIGdlbmVyaWNfY2FsbHNfZ3VhcmQoZ2VuZXJpY19jYWxsc19tdXRleCk7CisgIEd1YXJkIHZpcnR1YWxfY2FsbHNfZ3VhcmQodmlydHVhbF9jYWxsc19tdXRleCk7CisKKyAgLy8gcHJpbnQgdGhlIGluZm8gZnJvbSBnZW5lcmljX2NhbGxzLCBzb3J0ZWQgYnkgZnJlcXVlbmN5CisgIC8vCisgIC8vIFdlIHByaW50IHRoZSBnZW5lcmljX2NhbGxzIGluZm8gYWhlYWQgb2YgdmlydHVhbF9jYWxscywgc2luY2UgaXQgaXMgbW9yZQorICAvLyB1c2VmdWwgaW4gc29tZSBjYXNlcy4gIEFsbCBUX0dFTkVSSUNfUFJPVE9DT0wgY2FsbHMgY2FuIGJlIGVsaW1pbmF0ZWQKKyAgLy8gZnJvbSBtb3N0IHByb2dyYW1zLiAgTm90IGFsbCBUX1ZJUlRVQUxfQ0FMTHMgd2lsbCBiZSBlbGltaW5hdGVkIGJ5CisgIC8vIGNvbnZlcnRpbmcgdG8gdGVtcGxhdGVzLgorICBCYWNrdHJhY2VWZWN0b3IgZ3Bfc29ydGVkKGdlbmVyaWNfY2FsbHMuYmVnaW4oKSwgZ2VuZXJpY19jYWxscy5lbmQoKSk7CisgIHN0ZDo6c29ydChncF9zb3J0ZWQuYmVnaW4oKSwgZ3Bfc29ydGVkLmVuZCgpLCBpc19ncmVhdGVyKTsKKworICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBncF9zb3J0ZWQuYmVnaW4oKTsgaXQgIT0gZ3Bfc29ydGVkLmVuZCgpOyArK2l0KSB7CisgICAgS2V5IGNvbnN0JiBrZXkgPSBpdC0+Zmlyc3Q7CisgICAgc2l6ZV90IGNvbnN0IGNvdW50ID0gaXQtPnNlY29uZDsKKyAgICBmcHJpbnRmKGYsCisgICAgICAgICAgICAiVF9HRU5FUklDX1BST1RPQ09MOiAlenUgY2FsbHMgdG8gJXMgd2l0aCBhICVzOlxuIiwKKyAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAga2V5LmdldFR5cGVOYW1lKCksCisgICAgICAgICAgICBrZXkuZ2V0VHlwZU5hbWUyKCkpOworICAgIGtleS5nZXRCYWNrdHJhY2UoKS0+cHJpbnQoZiwgMik7CisgICAgZnByaW50ZihmLCAiXG4iKTsKKyAgfQorCisgIC8vIHByaW50IHRoZSBpbmZvIGZyb20gdmlydHVhbF9jYWxscywgc29ydGVkIGJ5IGZyZXF1ZW5jeQorICBCYWNrdHJhY2VWZWN0b3IgdmNfc29ydGVkKHZpcnR1YWxfY2FsbHMuYmVnaW4oKSwgdmlydHVhbF9jYWxscy5lbmQoKSk7CisgIHN0ZDo6c29ydCh2Y19zb3J0ZWQuYmVnaW4oKSwgdmNfc29ydGVkLmVuZCgpLCBpc19ncmVhdGVyKTsKKworICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB2Y19zb3J0ZWQuYmVnaW4oKTsgaXQgIT0gdmNfc29ydGVkLmVuZCgpOyArK2l0KSB7CisgICAgS2V5IGNvbnN0JiBrZXkgPSBpdC0+Zmlyc3Q7CisgICAgc2l6ZV90IGNvbnN0IGNvdW50ID0gaXQtPnNlY29uZDsKKyAgICBmcHJpbnRmKGYsICJUX1ZJUlRVQUxfQ0FMTDogJXp1IGNhbGxzIG9uICVzOlxuIiwgY291bnQsIGtleS5nZXRUeXBlTmFtZSgpKTsKKyAgICBrZXkuZ2V0QmFja3RyYWNlKCktPnByaW50KGYsIDIpOworICAgIGZwcmludGYoZiwgIlxuIik7CisgIH0KK30KKworLyoqCisgKiBQcmludCB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIHN0ZG91dC4KKyAqLwordm9pZCBwcm9maWxlX3ByaW50X2luZm8oKSB7CisgIHByb2ZpbGVfcHJpbnRfaW5mbyhzdGRvdXQpOworfQorCisvKioKKyAqIFdyaXRlIGEgQmFja3RyYWNlTWFwIGFzIEdvb2dsZSBDUFUgcHJvZmlsZXIgYmluYXJ5IGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2ZfZmlsZShGSUxFKiBmLCBCYWNrdHJhY2VNYXAgY29uc3QmIG1hcCkgeworICAvLyBXcml0ZSB0aGUgaGVhZGVyCisgIHVpbnRwdHJfdCBoZWFkZXJbNV0gPSB7MCwgMywgMCwgMCwgMH07CisgIGZ3cml0ZSgmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgMSwgZik7CisKKyAgLy8gV3JpdGUgdGhlIHByb2ZpbGUgcmVjb3JkcworICBmb3IgKEJhY2t0cmFjZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAuYmVnaW4oKTsgaXQgIT0gbWFwLmVuZCgpOyArK2l0KSB7CisgICAgdWludHB0cl90IGNvdW50ID0gaXQtPnNlY29uZDsKKyAgICBmd3JpdGUoJmNvdW50LCBzaXplb2YoY291bnQpLCAxLCBmKTsKKworICAgIEJhY2t0cmFjZSBjb25zdCogYnQgPSBpdC0+Zmlyc3QuZ2V0QmFja3RyYWNlKCk7CisgICAgdWludHB0cl90IG51bV9wY3MgPSBidC0+Z2V0RGVwdGgoKTsKKyAgICBmd3JpdGUoJm51bV9wY3MsIHNpemVvZihudW1fcGNzKSwgMSwgZik7CisKKyAgICBmb3IgKHVpbnRwdHJfdCBuID0gMDsgbiA8IG51bV9wY3M7ICsrbikgeworICAgICAgdm9pZCogcGMgPSBidC0+Z2V0RnJhbWUobik7CisgICAgICBmd3JpdGUoJnBjLCBzaXplb2YocGMpLCAxLCBmKTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZSB0aGUgdHJhaWxlcgorICB1aW50cHRyX3QgdHJhaWxlclszXSA9IHswLCAxLCAwfTsKKyAgZndyaXRlKCZ0cmFpbGVyLCBzaXplb2YodHJhaWxlciksIDEsIGYpOworCisgIC8vIFdyaXRlIC9wcm9jL3NlbGYvbWFwcworICAvLyBUT0RPKHNpbXBraW5zKTogVGhpcyBvbmx5IHdvcmtzIG9uIGxpbnV4CisgIEZJTEUqIHByb2NfbWFwcyA9IGZvcGVuKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOworICBpZiAocHJvY19tYXBzKSB7CisgICAgdWludDhfdCBidWZbNDA5Nl07CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHNpemVfdCBieXRlc19yZWFkID0gZnJlYWQoYnVmLCAxLCBzaXplb2YoYnVmKSwgcHJvY19tYXBzKTsKKyAgICAgIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmd3JpdGUoYnVmLCAxLCBieXRlc19yZWFkLCBmKTsKKyAgICB9CisgICAgZmNsb3NlKHByb2NfbWFwcyk7CisgIH0KK30KKworLyoqCisgKiBXcml0ZSB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGFzIHBwcm9mIGZpbGVzLgorICoKKyAqIFRoaXMgd3JpdGVzIHRoZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgR29vZ2xlIENQVSBwcm9maWxlciBiaW5hcnkgZGF0YQorICogZm9ybWF0LCBzbyBpdCBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBwcHJvZi4gIE5vdGUgdGhhdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAqIHByb3RvY29sL3RyYW5zcG9ydCBkYXRhIHR5cGVzIGNhbm5vdCBiZSBzdG9yZWQgaW4gdGhpcyBmaWxlIGZvcm1hdC4KKyAqCisgKiBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1wZXJmdG9vbHMvIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQHBhcmFtIGdlbl9jYWxsc19mICAgICBUaGUgaW5mb3JtYXRpb24gYWJvdXQgY2FsbHMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKCkgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS4KKyAqIEBwYXJhbSB2aXJ0dWFsX2NhbGxzX2YgVGhlIGluZm9ybWF0aW9uIGFib3V0IGNhbGxzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfdmlydHVhbF9jYWxsKCkgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KKyAqLwordm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mKEZJTEUqIGdlbl9jYWxsc19mLCBGSUxFKiB2aXJ0dWFsX2NhbGxzX2YpIHsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+ID4gQmFja3RyYWNlVmVjdG9yOworCisgIENvdW50R3JlYXRlciBpc19ncmVhdGVyOworCisgIC8vIEdyYWIgYm90aCBsb2NrcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcmludCBvcGVyYXRpb24sCisgIC8vIHRvIGVuc3VyZSB0aGUgb3V0cHV0IGlzIGEgY29uc2lzdGVudCBzbmFwc2hvdCBvZiBhIHNpbmdsZSBwb2ludCBpbiB0aW1lCisgIEd1YXJkIGdlbmVyaWNfY2FsbHNfZ3VhcmQoZ2VuZXJpY19jYWxsc19tdXRleCk7CisgIEd1YXJkIHZpcnR1YWxfY2FsbHNfZ3VhcmQodmlydHVhbF9jYWxsc19tdXRleCk7CisKKyAgLy8gd3JpdGUgdGhlIGluZm8gZnJvbSBnZW5lcmljX2NhbGxzCisgIHByb2ZpbGVfd3JpdGVfcHByb2ZfZmlsZShnZW5fY2FsbHNfZiwgZ2VuZXJpY19jYWxscyk7CisKKyAgLy8gd3JpdGUgdGhlIGluZm8gZnJvbSB2aXJ0dWFsX2NhbGxzCisgIHByb2ZpbGVfd3JpdGVfcHByb2ZfZmlsZSh2aXJ0dWFsX2NhbGxzX2YsIHZpcnR1YWxfY2FsbHMpOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gVF9HTE9CQUxfUFJPRklMRV9WSVJUVUFMID4gMApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTZiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworY2xhc3MgVEFzeW5jQnVmZmVyUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgLy8gUHJvY2VzcyBkYXRhIGluICJpbiIsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiAib3V0Ii4KKyAgLy8gQ2FsbCBfcmV0dXJuKHRydWUpIHdoZW4gZG9uZSwgb3IgX3JldHVybihmYWxzZSkgdG8KKyAgLy8gZm9yY2VmdWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiAoaWYgYXBwbGljYWJsZSkuCisgIC8vICJpbiIgYW5kICJvdXQiIHNob3VsZCBiZSBUTWVtb3J5QnVmZmVyIG9yIHNpbWlsYXIsCisgIC8vIG5vdCBhIHdyYXBwZXIgYXJvdW5kIGEgc29ja2V0LgorICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKSA9IDA7CisgIHZpcnR1YWwgflRBc3luY0J1ZmZlclByb2Nlc3NvcigpIHt9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjkxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK3ZvaWQgVEFzeW5jQ2hhbm5lbDo6c2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpIHsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNlbmRfZG9uZQorICAgICAgPSBzdGQ6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOworCisgIHNlbmRNZXNzYWdlKHNlbmRfZG9uZSwgc2VuZEJ1Zik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhY2U5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXworI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8gMQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CitjbGFzcyBUTWVtb3J5QnVmZmVyOworfQorfQorfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CisKK2NsYXNzIFRBc3luY0NoYW5uZWwgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7CisKKyAgdmlydHVhbCB+VEFzeW5jQ2hhbm5lbCgpIHt9CisKKyAgLy8gaXMgdGhlIGNoYW5uZWwgaW4gYSBnb29kIHN0YXRlPworICB2aXJ0dWFsIGJvb2wgZ29vZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGVycm9yKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgdGltZWRPdXQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIGNoYW5uZWwuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSA9IDA7CisKKyAgLyoqCisgICAqIFJlY2VpdmUgYSBtZXNzYWdlIGZyb20gdGhlIGNoYW5uZWwuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSA9IDA7CisKKyAgLyoqCisgICAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIGNoYW5uZWwgYW5kIHJlY2VpdmUgYSByZXNwb25zZS4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYjU5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DRElTUEFUQ0hQUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9BU1lOQ19UQVNZTkNESVNQQVRDSFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCisvKioKKyAqIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIGlzIGEgaGVscGVyIGNsYXNzIHRvIHBhcnNlIHRoZSBtZXNzYWdlIGhlYWRlciB0aGVuCisgKiBjYWxsIGFub3RoZXIgZnVuY3Rpb24gdG8gZGlzcGF0Y2ggYmFzZWQgb24gdGhlIGZ1bmN0aW9uIG5hbWUuCisgKgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBkaXNwYXRjaENhbGwoKSB0byBkaXNwYXRjaCBvbiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVCA6IHB1YmxpYyBUQXN5bmNQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CisKKyAgICAvLyBUcnkgdG8gZHluYW1pYyBjYXN0IHRvIHRoZSB0ZW1wbGF0ZSBwcm90b2NvbCB0eXBlCisgICAgUHJvdG9jb2xfKiBzcGVjaWZpY0luID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGluUmF3KTsKKyAgICBQcm90b2NvbF8qIHNwZWNpZmljT3V0ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG91dFJhdyk7CisgICAgaWYgKHNwZWNpZmljSW4gJiYgc3BlY2lmaWNPdXQpIHsKKyAgICAgIHJldHVybiBwcm9jZXNzRmFzdChfcmV0dXJuLCBzcGVjaWZpY0luLCBzcGVjaWZpY091dCk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIHNsb3cgcGF0aAorICAgIFRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpblJhdywgc3BlY2lmaWNJbik7CisgICAgVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG91dFJhdywgc3BlY2lmaWNPdXQpOworCisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICAgIGluUmF3LT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgICAgLy8gSWYgdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHZhbGlkIGNhbGwsIGxvZyBhbiBlcnJvciBhbmQgcmV0dXJuIGZhbHNlIHNvCisgICAgLy8gdGhhdCB0aGUgc2VydmVyIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgLy8KKyAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAorICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQorICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICBfcmV0dXJuKGZhbHNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsKF9yZXR1cm4sIGluUmF3LCBvdXRSYXcsIGZuYW1lLCBzZXFpZCk7CisgIH0KKworICB2b2lkIHByb2Nlc3NGYXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgX3JldHVybihmYWxzZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbFRlbXBsYXRlZChfcmV0dXJuLCBpbiwgb3V0LCBmbmFtZSwgc2VxaWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkKSA9IDA7Cit9OworCisvKioKKyAqIE5vbi10ZW1wbGF0aXplZCB2ZXJzaW9uIG9mIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLAorICogdGhhdCBkb2Vzbid0IGJvdGhlciB0cnlpbmcgdG8gcGVyZm9ybSBhIGR5bmFtaWNfY2FzdC4KKyAqLworY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVEFzeW5jUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgeworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOworCisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworICAgIGluUmF3LT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgICAgLy8gSWYgdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHZhbGlkIGNhbGwsIGxvZyBhbiBlcnJvciBhbmQgcmV0dXJuIGZhbHNlIHNvCisgICAgLy8gdGhhdCB0aGUgc2VydmVyIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgLy8KKyAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAorICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQorICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICBfcmV0dXJuKGZhbHNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm4gZGlzcGF0Y2hDYWxsKF9yZXR1cm4sIGluUmF3LCBvdXRSYXcsIGZuYW1lLCBzZXFpZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOworfTsKKworLy8gU3BlY2lhbGl6ZSBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQgZm9yIFRQcm90b2NvbCBhbmQgVER1bW15UHJvdG9jb2wganVzdCB0bworLy8gdXNlIHRoZSBnZW5lcmljIFREaXNwYXRjaFByb2Nlc3Nvci4KK3RlbXBsYXRlIDw+CitjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlREdW1teVByb3RvY29sPiA6IHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKK3RlbXBsYXRlIDw+CitjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlRQcm90b2NvbD4gOiBwdWJsaWMgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3Ige307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gX1RIUklGVF9BU1lOQ19UQVNZTkNESVNQQVRDSFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjk3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKKy8qKgorICogQXN5bmMgdmVyc2lvbiBvZiBhIFRQcm9jZXNzb3IuICBJdCBpcyBub3QgZXhwZWN0ZWQgdG8gY29tcGxldGUgYnkgdGhlIHRpbWUKKyAqIHRoZSBjYWxsIHRvIHByb2Nlc3MgcmV0dXJucy4gIEluc3RlYWQsIGl0IGNhbGxzIGEgY29iIHRvIHNpZ25hbCBjb21wbGV0aW9uLgorICovCisKK2NsYXNzIFRBc3luY1Byb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgPSAwOworCisgIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbykgeworICAgIHJldHVybiBwcm9jZXNzKF9yZXR1cm4sIGlvLCBpbyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorCisgIHZvaWQgc2V0RXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworICB9CisKK3Byb3RlY3RlZDoKKyAgVEFzeW5jUHJvY2Vzc29yKCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKK307CisKK2NsYXNzIFRBc3luY1Byb2Nlc3NvckZhY3RvcnkgeworcHVibGljOgorICB2aXJ0dWFsIH5UQXN5bmNQcm9jZXNzb3JGYWN0b3J5KCkge30KKworICAvKioKKyAgICogR2V0IHRoZSBUQXN5bmNQcm9jZXNzb3IgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgaXMgYWx3YXlzIGludm9rZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzCisgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQorICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworICB1c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb2Nlc3NvcjsKK30KK30KKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTIwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKwordm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6cHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiBpYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IG9idWYpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3QocGZhY3RfLT5nZXRQcm90b2NvbChpYnVmKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2wob2J1ZikpOworICByZXR1cm4gdW5kZXJseWluZ18KKyAgICAgIC0+cHJvY2VzcyhzdGQ6OmJpbmQoJlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgIGlwcm90LAorICAgICAgICAgICAgICAgIG9wcm90KTsKK30KKworLyogc3RhdGljICovIHZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCgKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCwKKyAgICBib29sIGhlYWx0aHkpIHsKKyAgKHZvaWQpb3Byb3Q7CisgIC8vIFRoaXMgaXMgYSBzdHViIGZ1bmN0aW9uIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8gb3Byb3QuCisgIHJldHVybiBfcmV0dXJuKGhlYWx0aHkpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1MmNmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1ROQU1FX01FX0hfCisjZGVmaW5lIF9USFJJRlRfVE5BTUVfTUVfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQXN5bmNQcm90b2NvbFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgeworcHVibGljOgorICBUQXN5bmNQcm90b2NvbFByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCkKKyAgICA6IHVuZGVybHlpbmdfKHVuZGVybHlpbmcpLCBwZmFjdF8ocGZhY3QpIHt9CisKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKTsKKworICB2aXJ0dWFsIH5UQXN5bmNQcm90b2NvbFByb2Nlc3NvcigpIHt9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGZpbmlzaChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3Byb3QsCisgICAgICAgICAgICAgICAgICAgICBib29sIGhlYWx0aHkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmdfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTkFNRV9NRV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTI3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworCit1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK1RDb25jdXJyZW50Q2xpZW50U3luY0luZm86OlRDb25jdXJyZW50Q2xpZW50U3luY0luZm8oKSA6CisgIHN0b3BfKGZhbHNlKSwKKyAgc2VxaWRNdXRleF8oKSwKKyAgLy8gdGVzdCByb2xsb3ZlciBhbGwgdGhlIHRpbWUKKyAgbmV4dHNlcWlkXygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpLTEwKSwKKyAgc2VxaWRUb01vbml0b3JNYXBfKCksCisgIGZyZWVNb25pdG9yc18oKSwKKyAgd3JpdGVNdXRleF8oKSwKKyAgcmVhZE11dGV4XygpLAorICByZWN2UGVuZGluZ18oZmFsc2UpLAorICB3YWtldXBTb21lb25lXyhmYWxzZSksCisgIHNlcWlkUGVuZGluZ18oMCksCisgIGZuYW1lUGVuZGluZ18oKSwKKyAgbXR5cGVQZW5kaW5nXyg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMKQoreworICBmcmVlTW9uaXRvcnNfLnJlc2VydmUoTU9OSVRPUl9DQUNIRV9TSVpFKTsKK30KKworYm9vbCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpnZXRQZW5kaW5nKAorICBzdGQ6OnN0cmluZyAmZm5hbWUsCisgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgJm10eXBlLAorICBpbnQzMl90ICZyc2VxaWQpCit7CisgIGlmKHN0b3BfKQorICAgIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisgIHdha2V1cFNvbWVvbmVfID0gZmFsc2U7CisgIGlmKHJlY3ZQZW5kaW5nXykKKyAgeworICAgIHJlY3ZQZW5kaW5nXyA9IGZhbHNlOworICAgIHJzZXFpZCA9IHNlcWlkUGVuZGluZ187CisgICAgZm5hbWUgID0gZm5hbWVQZW5kaW5nXzsKKyAgICBtdHlwZSAgPSBtdHlwZVBlbmRpbmdfOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp1cGRhdGVQZW5kaW5nKAorICBjb25zdCBzdGQ6OnN0cmluZyAmZm5hbWUsCisgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGUsCisgIGludDMyX3QgcnNlcWlkKQoreworICByZWN2UGVuZGluZ18gPSB0cnVlOworICBzZXFpZFBlbmRpbmdfID0gcnNlcWlkOworICBmbmFtZVBlbmRpbmdfID0gZm5hbWU7CisgIG10eXBlUGVuZGluZ18gPSBtdHlwZTsKKyAgTW9uaXRvclB0ciBtb25pdG9yOworICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzZXFpZE11dGV4Xyk7CisgICAgTW9uaXRvck1hcDo6aXRlcmF0b3IgaSA9IHNlcWlkVG9Nb25pdG9yTWFwXy5maW5kKHJzZXFpZCk7CisgICAgaWYoaSA9PSBzZXFpZFRvTW9uaXRvck1hcF8uZW5kKCkpCisgICAgICB0aHJvd0JhZFNlcUlkXygpOworICAgIG1vbml0b3IgPSBpLT5zZWNvbmQ7CisgIH0KKyAgbW9uaXRvci0+bm90aWZ5KCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6d2FpdEZvcldvcmsoaW50MzJfdCBzZXFpZCkKK3sKKyAgTW9uaXRvclB0ciBtOworICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzZXFpZE11dGV4Xyk7CisgICAgbSA9IHNlcWlkVG9Nb25pdG9yTWFwX1tzZXFpZF07CisgIH0KKyAgd2hpbGUodHJ1ZSkKKyAgeworICAgIC8vIGJlIHZlcnkgY2FyZWZ1bCBhYm91dCBzZXR0aW5nIHN0YXRlIGluIHRoaXMgbG9vcCB0aGF0IGFmZmVjdHMgd2FraW5nIHVwLiAgWW91IG1heSBleGl0CisgICAgLy8gdGhpcyBmdW5jdGlvbiwgYXR0ZW1wdCB0byBncmFiIHNvbWUgd29yaywgYW5kIHNvbWVvbmUgZWxzZSBjb3VsZCBoYXZlIGJlYXRlbiB5b3UgKG9yIG5vdAorICAgIC8vIGxlZnQpIHRoZSByZWFkIG11dGV4LCBhbmQgdGhhdCB3aWxsIHB1dCB5b3UgcmlnaHQgYmFjayBpbiB0aGlzIGxvb3AsIHdpdGggdGhlIG1hbmdsZWQKKyAgICAvLyBzdGF0ZSB5b3UgbGVmdCBiZWhpbmQuCisgICAgaWYoc3RvcF8pCisgICAgICB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworICAgIGlmKHdha2V1cFNvbWVvbmVfKQorICAgICAgcmV0dXJuOworICAgIGlmKHJlY3ZQZW5kaW5nXyAmJiBzZXFpZFBlbmRpbmdfID09IHNlcWlkKQorICAgICAgcmV0dXJuOworICAgIG0tPndhaXRGb3JldmVyKCk7CisgIH0KK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp0aHJvd0JhZFNlcUlkXygpCit7CisgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQsCisgICAgInNlcnZlciBzZW50IGEgYmFkIHNlcWlkIik7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6dGhyb3dEZWFkQ29ubmVjdGlvbl8oKQoreworICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICJ0aGlzIGNsaWVudCBkaWVkIG9uIGFub3RoZXIgdGhyZWFkLCBhbmQgaXMgbm93IGluIGFuIHVudXNhYmxlIHN0YXRlIik7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6d2FrZXVwQW55b25lXyhjb25zdCBHdWFyZCAmKQoreworICB3YWtldXBTb21lb25lXyA9IHRydWU7CisgIGlmKCFzZXFpZFRvTW9uaXRvck1hcF8uZW1wdHkoKSkKKyAgeworICAgIC8vIFRoZSBtb25pdG9yIG1hcCBtYXBzIGludGVnZXJzIHRvIG1vbml0b3JzLiAgTGFyZ2VyIGludGVnZXJzIGFyZSBtb3JlIHJlY2VudAorICAgIC8vIG1lc3NhZ2VzLiAgU2luY2UgdGhpcyBpcyBvcmRlcmVkLCBpdCBtZWFucyB0aGF0IHRoZSBsYXN0IGVsZW1lbnQgaXMgdGhlIG1vc3QgcmVjZW50LgorICAgIC8vIFdlIGFyZSB0cnlpbmcgdG8gZ3Vlc3Mgd2hpY2ggdGhyZWFkIHdpbGwgaGF2ZSBpdHMgbWVzc2FnZSBjb21wbGV0ZSBuZXh0LCBzbyB3ZSBhcmUgcGlja2luZworICAgIC8vIHRoZSBtb3N0IHJlY2VudC4gVGhlIG9sZGVzdCBtZXNzYWdlIGlzIGxpa2VseSB0byBiZSBzb21lIHBvbGxpbmcsIGxvbmcgbGl2ZWQgbWVzc2FnZS4KKyAgICAvLyBJZiB3ZSBndWVzcyByaWdodCwgdGhlIHRocmVhZCB3ZSB3YWtlIHVwIHdpbGwgaGFuZGxlIHRoZSBtZXNzYWdlIHRoYXQgY29tZXMgaW4uCisgICAgLy8gSWYgd2UgZ3Vlc3Mgd3JvbmcsIHRoZSB0aHJlYWQgd2Ugd2FrZSB1cCB3aWxsIGhhbmQgb2ZmIHRoZSB3b3JrIHRvIHRoZSBjb3JyZWN0IHRocmVhZCwKKyAgICAvLyBjb3N0aW5nIHVzIGFuIGV4dHJhIGNvbnRleHQgc3dpdGNoLgorICAgIHNlcWlkVG9Nb25pdG9yTWFwXy5yYmVnaW4oKS0+c2Vjb25kLT5ub3RpZnkoKTsKKyAgfQorfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Om1hcmtCYWRfKGNvbnN0IEd1YXJkICYpCit7CisgIHdha2V1cFNvbWVvbmVfID0gdHJ1ZTsKKyAgc3RvcF8gPSB0cnVlOworICBmb3IoTW9uaXRvck1hcDo6aXRlcmF0b3IgaSA9IHNlcWlkVG9Nb25pdG9yTWFwXy5iZWdpbigpOyBpICE9IHNlcWlkVG9Nb25pdG9yTWFwXy5lbmQoKTsgKytpKQorICAgIGktPnNlY29uZC0+bm90aWZ5KCk7Cit9CisKK1RDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIKK1RDb25jdXJyZW50Q2xpZW50U3luY0luZm86Om5ld01vbml0b3JfKGNvbnN0IEd1YXJkICYpCit7CisgIGlmKGZyZWVNb25pdG9yc18uZW1wdHkoKSkKKyAgICByZXR1cm4gTW9uaXRvclB0cihuZXcgTW9uaXRvcigmcmVhZE11dGV4XykpOworICBNb25pdG9yUHRyIHJldHZhbDsKKyAgLy9zd2FwcGluZyB0byBhdm9pZCBhbiBhdG9taWMgb3BlcmF0aW9uCisgIHJldHZhbC5zd2FwKGZyZWVNb25pdG9yc18uYmFjaygpKTsKKyAgZnJlZU1vbml0b3JzXy5wb3BfYmFjaygpOworICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmRlbGV0ZU1vbml0b3JfKAorICBjb25zdCBHdWFyZCAmLAorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjpNb25pdG9yUHRyICZtKSAvKm5vZXhjZXB0Ki8KK3sKKyAgaWYoZnJlZU1vbml0b3JzXy5zaXplKCkgPiBNT05JVE9SX0NBQ0hFX1NJWkUpCisgIHsKKyAgICBtLnJlc2V0KCk7CisgICAgcmV0dXJuOworICB9CisgIC8vZnJlZU1vbml0b3JzXyB3YXMgcmVzZXJ2ZWQgdXAgdG8gTU9OSVRPUl9DQUNIRV9TSVpFIGluIHRoZSBjdG9yLAorICAvL3NvIHRoaXMgc2hvdWxkbid0IHRocm93CisgIGZyZWVNb25pdG9yc18ucHVzaF9iYWNrKFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIoKSk7CisgIC8vc3dhcHBpbmcgdG8gYXZvaWQgYW4gYXRvbWljIG9wZXJhdGlvbgorICBtLnN3YXAoZnJlZU1vbml0b3JzXy5iYWNrKCkpOworfQorCitpbnQzMl90IFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmdlbmVyYXRlU2VxSWQoKQoreworICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgaWYoc3RvcF8pCisgICAgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKworICBpZighc2VxaWRUb01vbml0b3JNYXBfLmVtcHR5KCkpCisgICAgaWYobmV4dHNlcWlkXyA9PSBzZXFpZFRvTW9uaXRvck1hcF8uYmVnaW4oKS0+Zmlyc3QpCisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCwKKyAgICAgICAgImFib3V0IHRvIHJlcGVhdCBhIHNlcWlkIik7CisgIGludDMyX3QgbmV3U2VxSWQgPSBuZXh0c2VxaWRfKys7CisgIHNlcWlkVG9Nb25pdG9yTWFwX1tuZXdTZXFJZF0gPSBuZXdNb25pdG9yXyhzZXFpZEd1YXJkKTsKKyAgcmV0dXJuIG5ld1NlcUlkOworfQorCitUQ29uY3VycmVudFJlY3ZTZW50cnk6OlRDb25jdXJyZW50UmVjdlNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICpzeW5jLCBpbnQzMl90IHNlcWlkKSA6CisgIHN5bmNfKCpzeW5jKSwKKyAgc2VxaWRfKHNlcWlkKSwKKyAgY29tbWl0dGVkXyhmYWxzZSkKK3sKKyAgc3luY18uZ2V0UmVhZE11dGV4KCkubG9jaygpOworfQorCitUQ29uY3VycmVudFJlY3ZTZW50cnk6On5UQ29uY3VycmVudFJlY3ZTZW50cnkoKQoreworICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzeW5jXy5zZXFpZE11dGV4Xyk7CisgICAgc3luY18uZGVsZXRlTW9uaXRvcl8oc2VxaWRHdWFyZCwgc3luY18uc2VxaWRUb01vbml0b3JNYXBfW3NlcWlkX10pOworCisgICAgc3luY18uc2VxaWRUb01vbml0b3JNYXBfLmVyYXNlKHNlcWlkXyk7CisgICAgaWYoY29tbWl0dGVkXykKKyAgICAgIHN5bmNfLndha2V1cEFueW9uZV8oc2VxaWRHdWFyZCk7CisgICAgZWxzZQorICAgICAgc3luY18ubWFya0JhZF8oc2VxaWRHdWFyZCk7CisgIH0KKyAgc3luY18uZ2V0UmVhZE11dGV4KCkudW5sb2NrKCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRSZWN2U2VudHJ5Ojpjb21taXQoKQoreworICBjb21taXR0ZWRfID0gdHJ1ZTsKK30KKworVENvbmN1cnJlbnRTZW5kU2VudHJ5OjpUQ29uY3VycmVudFNlbmRTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyAqc3luYykgOgorICBzeW5jXygqc3luYyksCisgIGNvbW1pdHRlZF8oZmFsc2UpCit7CisgIHN5bmNfLmdldFdyaXRlTXV0ZXgoKS5sb2NrKCk7Cit9CisKK1RDb25jdXJyZW50U2VuZFNlbnRyeTo6flRDb25jdXJyZW50U2VuZFNlbnRyeSgpCit7CisgIGlmKCFjb21taXR0ZWRfKQorICB7CisgICAgR3VhcmQgc2VxaWRHdWFyZChzeW5jXy5zZXFpZE11dGV4Xyk7CisgICAgc3luY18ubWFya0JhZF8oc2VxaWRHdWFyZCk7CisgIH0KKyAgc3luY18uZ2V0V3JpdGVNdXRleCgpLnVubG9jaygpOworfQorCit2b2lkIFRDb25jdXJyZW50U2VuZFNlbnRyeTo6Y29tbWl0KCkKK3sKKyAgY29tbWl0dGVkXyA9IHRydWU7Cit9CisKKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjNWViNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9UQ09OQ1VSUkVOVENMSUVOVFNZTkNJTkZPX0hfCisjZGVmaW5lIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOworCitjbGFzcyBUQ29uY3VycmVudFNlbmRTZW50cnkgeworcHVibGljOgorICBleHBsaWNpdCBUQ29uY3VycmVudFNlbmRTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYyk7CisgIH5UQ29uY3VycmVudFNlbmRTZW50cnkoKTsKKworICB2b2lkIGNvbW1pdCgpOworCitwcml2YXRlOgorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKKyAgYm9vbCBjb21taXR0ZWRfOworfTsKKworY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5IHsKK3B1YmxpYzoKKyAgVENvbmN1cnJlbnRSZWN2U2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8qIHN5bmMsIGludDMyX3Qgc2VxaWQpOworICB+VENvbmN1cnJlbnRSZWN2U2VudHJ5KCk7CisKKyAgdm9pZCBjb21taXQoKTsKKworcHJpdmF0ZToKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyYgc3luY187CisgIGludDMyX3Qgc2VxaWRfOworICBib29sIGNvbW1pdHRlZF87Cit9OworCitjbGFzcyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIHsKK3ByaXZhdGU6IC8vIHR5cGVkZWZzCisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcj4gTW9uaXRvclB0cjsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQzMl90LCBNb25pdG9yUHRyPiBNb25pdG9yTWFwOworCitwdWJsaWM6CisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8oKTsKKworICBpbnQzMl90IGdlbmVyYXRlU2VxSWQoKTsKKworICBib29sIGdldFBlbmRpbmcoc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSYgbXR5cGUsCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiByc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisKKyAgdm9pZCB1cGRhdGVQZW5kaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICB2b2lkIHdhaXRGb3JXb3JrKGludDMyX3Qgc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4JiBnZXRSZWFkTXV0ZXgoKSB7IHJldHVybiByZWFkTXV0ZXhfOyB9CisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCYgZ2V0V3JpdGVNdXRleCgpIHsgcmV0dXJuIHdyaXRlTXV0ZXhfOyB9CisKK3ByaXZhdGU6IC8vIGNvbnN0YW50cworICBlbnVtIHsgTU9OSVRPUl9DQUNIRV9TSVpFID0gMTAgfTsKKworcHJpdmF0ZTogLy8gZnVuY3Rpb25zCisgIE1vbml0b3JQdHIgbmV3TW9uaXRvcl8oCisgICAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIGRlbGV0ZU1vbml0b3JfKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCwgTW9uaXRvclB0ciYgbSk7CisgICAgICAvKm5vZXhjZXB0Ki8gLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCB3YWtldXBBbnlvbmVfKAorICAgICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgICAgICAgICAgIC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgbWFya0JhZF8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkKTsgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCB0aHJvd0JhZFNlcUlkXygpOworICB2b2lkIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisKK3ByaXZhdGU6IC8vIGRhdGEgbWVtYmVycworICB2b2xhdGlsZSBib29sIHN0b3BfOworCisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCBzZXFpZE11dGV4XzsKKyAgLy8gYmVnaW4gc2VxaWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKyAgaW50MzJfdCBuZXh0c2VxaWRfOworICBNb25pdG9yTWFwIHNlcWlkVG9Nb25pdG9yTWFwXzsKKyAgc3RkOjp2ZWN0b3I8TW9uaXRvclB0cj4gZnJlZU1vbml0b3JzXzsKKyAgLy8gZW5kIHNlcWlkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHdyaXRlTXV0ZXhfOworCisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCByZWFkTXV0ZXhfOworICAvLyBiZWdpbiByZWFkTXV0ZXhfIHByb3RlY3RlZCBtZW1iZXJzCisgIGJvb2wgcmVjdlBlbmRpbmdfOworICBib29sIHdha2V1cFNvbWVvbmVfOworICBpbnQzMl90IHNlcWlkUGVuZGluZ187CisgIHN0ZDo6c3RyaW5nIGZuYW1lUGVuZGluZ187CisgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGVQZW5kaW5nXzsKKyAgLy8gZW5kIHJlYWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKworICBmcmllbmQgY2xhc3MgVENvbmN1cnJlbnRTZW5kU2VudHJ5OworICBmcmllbmQgY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5OworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjgxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaD4KKyNpbmNsdWRlIDxldmh0dHAuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlcl9jb21wYXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitURXZodHRwQ2xpZW50Q2hhbm5lbDo6VEV2aHR0cENsaWVudENoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZG5zX2Jhc2UqIGRuc2Jhc2UpCisKKyAgOiBob3N0Xyhob3N0KSwgcGF0aF8ocGF0aCksIGNvbm5fKE5VTEwpIHsKKyAgY29ubl8gPSBldmh0dHBfY29ubmVjdGlvbl9iYXNlX25ldyhlYiwgZG5zYmFzZSwgYWRkcmVzcywgcG9ydCk7CisgIGlmIChjb25uXyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2Nvbm5lY3Rpb25fbmV3IGZhaWxlZCIpOworICB9Cit9CisKK1RFdmh0dHBDbGllbnRDaGFubmVsOjp+VEV2aHR0cENsaWVudENoYW5uZWwoKSB7CisgIGlmIChjb25uXyAhPSBOVUxMKSB7CisgICAgZXZodHRwX2Nvbm5lY3Rpb25fZnJlZShjb25uXyk7CisgIH0KK30KKwordm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1ZikgeworICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSA9IGV2aHR0cF9yZXF1ZXN0X25ldyhyZXNwb25zZSwgdGhpcyk7CisgIGlmIChyZXEgPT0gTlVMTCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9yZXF1ZXN0X25ldyBmYWlsZWQiKTsKKyAgfQorCisgIGludCBydjsKKworICBydiA9IGV2aHR0cF9hZGRfaGVhZGVyKHJlcS0+b3V0cHV0X2hlYWRlcnMsICJIb3N0IiwgaG9zdF8uY19zdHIoKSk7CisgIGlmIChydiAhPSAwKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2FkZF9oZWFkZXIgZmFpbGVkIik7CisgIH0KKworICBydiA9IGV2aHR0cF9hZGRfaGVhZGVyKHJlcS0+b3V0cHV0X2hlYWRlcnMsICJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfYWRkX2hlYWRlciBmYWlsZWQiKTsKKyAgfQorCisgIHVpbnQ4X3QqIG9idWY7CisgIHVpbnQzMl90IHN6OworICBzZW5kQnVmLT5nZXRCdWZmZXIoJm9idWYsICZzeik7CisgIHJ2ID0gZXZidWZmZXJfYWRkKHJlcS0+b3V0cHV0X2J1ZmZlciwgb2J1Ziwgc3opOworICBpZiAocnYgIT0gMCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2YnVmZmVyX2FkZCBmYWlsZWQiKTsKKyAgfQorCisgIHJ2ID0gZXZodHRwX21ha2VfcmVxdWVzdChjb25uXywgcmVxLCBFVkhUVFBfUkVRX1BPU1QsIHBhdGhfLmNfc3RyKCkpOworICBpZiAocnYgIT0gMCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9tYWtlX3JlcXVlc3QgZmFpbGVkIik7CisgIH0KKworICBjb21wbGV0aW9uUXVldWVfLnB1c2goQ29tcGxldGlvbihjb2IsIHJlY3ZCdWYpKTsKK30KKwordm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSB7CisgICh2b2lkKWNvYjsKKyAgKHZvaWQpbWVzc2FnZTsKKyAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZE1lc3NhZ2UiKTsKK30KKwordm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6cmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKSB7CisgICh2b2lkKWNvYjsKKyAgKHZvaWQpbWVzc2FnZTsKKyAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwQ2xpZW50Q2hhbm5lbDo6cmVjdk1lc3NhZ2UiKTsKK30KKwordm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6ZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKSB7CisgIGFzc2VydCghY29tcGxldGlvblF1ZXVlXy5lbXB0eSgpKTsKKyAgQ29tcGxldGlvbiBjb21wbGV0aW9uID0gY29tcGxldGlvblF1ZXVlXy5mcm9udCgpOworICBjb21wbGV0aW9uUXVldWVfLnBvcCgpOworICBpZiAocmVxID09IE5VTEwpIHsKKyAgICB0cnkgeworICAgICAgY29tcGxldGlvbi5maXJzdCgpOworICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGUpIHsKKyAgICAgIGlmIChlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSkKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiY29ubmVjdCBmYWlsZWQiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGhyb3c7CisgICAgfQorICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChyZXEtPnJlc3BvbnNlX2NvZGUgIT0gMjAwKSB7CisgICAgdHJ5IHsKKyAgICAgIGNvbXBsZXRpb24uZmlyc3QoKTsKKyAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBlKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8ICJzZXJ2ZXIgcmV0dXJuZWQgY29kZSAiIDw8IHJlcS0+cmVzcG9uc2VfY29kZTsKKyAgICAgIGlmIChyZXEtPnJlc3BvbnNlX2NvZGVfbGluZSkKKyAgICAgICAgc3MgPDwgIjogIiA8PCByZXEtPnJlc3BvbnNlX2NvZGVfbGluZTsKKyAgICAgIGlmIChlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSkKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbihzcy5zdHIoKSk7CisgICAgICBlbHNlCisgICAgICAgIHRocm93OworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgY29tcGxldGlvbi5zZWNvbmQtPnJlc2V0QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEVWQlVGRkVSX0xFTkdUSChyZXEtPmlucHV0X2J1ZmZlcikpKTsKKyAgY29tcGxldGlvbi5maXJzdCgpOworICByZXR1cm47Cit9CisKKy8qIHN0YXRpYyAqLyB2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZXNwb25zZShzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogYXJnKSB7CisgIFRFdmh0dHBDbGllbnRDaGFubmVsKiBzZWxmID0gKFRFdmh0dHBDbGllbnRDaGFubmVsKilhcmc7CisgIHRyeSB7CisgICAgc2VsZi0+ZmluaXNoKHJlcSk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgLy8gZG9uJ3QgcHJvcGFnYXRlIGEgQysrIGV4Y2VwdGlvbiBpbiBDIGNvZGUgKGUuZy4gbGliZXZlbnQpCisgICAgc3RkOjpjZXJyIDw8ICJURXZodHRwQ2xpZW50Q2hhbm5lbDo6cmVzcG9uc2UgZXhjZXB0aW9uIHRocm93biAoaWdub3JlZCk6ICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzIxZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXworI2RlZmluZSBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8gMQorCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmg+CisKK3N0cnVjdCBldmVudF9iYXNlOworc3RydWN0IGV2ZG5zX2Jhc2U7CitzdHJ1Y3QgZXZodHRwX2Nvbm5lY3Rpb247CitzdHJ1Y3QgZXZodHRwX3JlcXVlc3Q7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK2NsYXNzIFRNZW1vcnlCdWZmZXI7Cit9Cit9Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBURXZodHRwQ2xpZW50Q2hhbm5lbCA6IHB1YmxpYyBUQXN5bmNDaGFubmVsIHsKK3B1YmxpYzoKKyAgdXNpbmcgVEFzeW5jQ2hhbm5lbDo6Vm9pZENhbGxiYWNrOworCisgIFRFdmh0dHBDbGllbnRDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZG5zX2Jhc2UgKmRuc2Jhc2UgPSAwKTsKKyAgflRFdmh0dHBDbGllbnRDaGFubmVsKCk7CisKKyAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOworCisgIHZpcnR1YWwgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOworICB2aXJ0dWFsIHZvaWQgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKTsKKworICB2b2lkIGZpbmlzaChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7CisKKyAgLy8gWFhYCisgIHZpcnR1YWwgYm9vbCBnb29kKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgZXJyb3IoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgdGltZWRPdXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCByZXNwb25zZShzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogYXJnKTsKKworICBzdGQ6OnN0cmluZyBob3N0XzsKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisgIHR5cGVkZWYgc3RkOjpwYWlyPFZvaWRDYWxsYmFjaywgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcio+IENvbXBsZXRpb247CisgIHR5cGVkZWYgc3RkOjpxdWV1ZTxDb21wbGV0aW9uPiBDb21wbGV0aW9uUXVldWU7CisgIENvbXBsZXRpb25RdWV1ZSBjb21wbGV0aW9uUXVldWVfOworICBzdHJ1Y3QgZXZodHRwX2Nvbm5lY3Rpb24qIGNvbm5fOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzMyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8ZXZodHRwLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlci5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXJfY29tcGF0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpZm5kZWYgSFRUUF9JTlRFUk5BTCAvLyBsaWJldmVudCA8IDIKKyNkZWZpbmUgSFRUUF9JTlRFUk5BTCA1MDAKKyNlbmRpZgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworc3RydWN0IFRFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0IHsKKyAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXE7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb2J1ZjsKKworICBSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7Cit9OworCitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvcikKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksIGViXyhOVUxMKSwgZWhfKE5VTEwpIHsKK30KKworVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgeworICAvLyBDcmVhdGUgZXZlbnRfYmFzZSBhbmQgZXZodHRwLgorICBlYl8gPSBldmVudF9iYXNlX25ldygpOworICBpZiAoZWJfID09IE5VTEwpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmVudF9iYXNlX25ldyBmYWlsZWQiKTsKKyAgfQorICBlaF8gPSBldmh0dHBfbmV3KGViXyk7CisgIGlmIChlaF8gPT0gTlVMTCkgeworICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9uZXcgZmFpbGVkIik7CisgIH0KKworICAvLyBCaW5kIHRvIHBvcnQuCisgIGludCByZXQgPSBldmh0dHBfYmluZF9zb2NrZXQoZWhfLCBOVUxMLCBwb3J0KTsKKyAgaWYgKHJldCA8IDApIHsKKyAgICBldmh0dHBfZnJlZShlaF8pOworICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9iaW5kX3NvY2tldCBmYWlsZWQiKTsKKyAgfQorCisgIC8vIFJlZ2lzdGVyIGEgaGFuZGxlci4gIElmIHlvdSB1c2UgdGhlIG90aGVyIGNvbnN0cnVjdG9yLAorICAvLyB5b3Ugd2lsbCB3YW50IHRvIGRvIHRoaXMgeW91cnNlbGYuCisgIC8vIERvbid0IGZvcmdldCB0byB1bnJlZ2lzdGVyIGJlZm9yZSBkZXN0b3J5aW5nIHRoaXMgVEV2aHR0cFNlcnZlci4KKyAgZXZodHRwX3NldF9jYihlaF8sICIvIiwgcmVxdWVzdCwgKHZvaWQqKXRoaXMpOworfQorCitURXZodHRwU2VydmVyOjp+VEV2aHR0cFNlcnZlcigpIHsKKyAgaWYgKGVoXyAhPSBOVUxMKSB7CisgICAgZXZodHRwX2ZyZWUoZWhfKTsKKyAgfQorICBpZiAoZWJfICE9IE5VTEwpIHsKKyAgICBldmVudF9iYXNlX2ZyZWUoZWJfKTsKKyAgfQorfQorCitpbnQgVEV2aHR0cFNlcnZlcjo6c2VydmUoKSB7CisgIGlmIChlYl8gPT0gTlVMTCkgeworICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwU2VydmVyOjpzZXJ2ZSIpOworICB9CisgIHJldHVybiBldmVudF9iYXNlX2Rpc3BhdGNoKGViXyk7Cit9CisKK1RFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0OjpSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkKKyAgOiByZXEocmVxKSwKKyAgICBpYnVmKG5ldyBUTWVtb3J5QnVmZmVyKEVWQlVGRkVSX0RBVEEocmVxLT5pbnB1dF9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEVWQlVGRkVSX0xFTkdUSChyZXEtPmlucHV0X2J1ZmZlcikpKSksCisgICAgb2J1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKSB7Cit9CisKK3ZvaWQgVEV2aHR0cFNlcnZlcjo6cmVxdWVzdChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogc2VsZikgeworICB0cnkgeworICAgIHN0YXRpY19jYXN0PFRFdmh0dHBTZXJ2ZXIqPihzZWxmKS0+cHJvY2VzcyhyZXEpOworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgIGV2aHR0cF9zZW5kX3JlcGx5KHJlcSwgSFRUUF9JTlRFUk5BTCwgZS53aGF0KCksIDApOworICB9Cit9CisKK3ZvaWQgVEV2aHR0cFNlcnZlcjo6cHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgeworICBSZXF1ZXN0Q29udGV4dCogY3R4ID0gbmV3IFJlcXVlc3RDb250ZXh0KHJlcSk7CisgIHJldHVybiBwcm9jZXNzb3JfLT5wcm9jZXNzKHN0ZDo6YmluZCgmVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm9idWYpOworfQorCit2b2lkIFRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2VzcykgeworICAodm9pZClzdWNjZXNzOworICBzdGQ6OnVuaXF1ZV9wdHI8UmVxdWVzdENvbnRleHQ+IHB0cihjdHgpOworCisgIGludCBjb2RlID0gc3VjY2VzcyA/IDIwMCA6IDQwMDsKKyAgY29uc3QgY2hhciogcmVhc29uID0gc3VjY2VzcyA/ICJPSyIgOiAiQmFkIFJlcXVlc3QiOworCisgIGludCBydiA9IGV2aHR0cF9hZGRfaGVhZGVyKGN0eC0+cmVxLT5vdXRwdXRfaGVhZGVycywgIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOworICBpZiAocnYgIT0gMCkgeworICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KKyAgICBzdGQ6OmNlcnIgPDwgImV2aHR0cF9hZGRfaGVhZGVyIGZhaWxlZCAiIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBzdHJ1Y3QgZXZidWZmZXIqIGJ1ZiA9IGV2YnVmZmVyX25ldygpOworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAvLyBUT0RPOiBMb2cgYW4gZXJyb3IuCisgICAgc3RkOjpjZXJyIDw8ICJldmJ1ZmZlcl9uZXcgZmFpbGVkICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fIDw8IHN0ZDo6ZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBvYnVmOworICAgIHVpbnQzMl90IHN6OworICAgIGN0eC0+b2J1Zi0+Z2V0QnVmZmVyKCZvYnVmLCAmc3opOworICAgIGludCByZXQgPSBldmJ1ZmZlcl9hZGQoYnVmLCBvYnVmLCBzeik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAvLyBUT0RPOiBMb2cgYW4gZXJyb3IuCisgICAgICBzdGQ6OmNlcnIgPDwgImV2aHR0cF9hZGQgZmFpbGVkIHdpdGggIiA8PCByZXQgPDwgIiAiIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXworICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICBldmh0dHBfc2VuZF9yZXBseShjdHgtPnJlcSwgY29kZSwgcmVhc29uLCBidWYpOworICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICBldmJ1ZmZlcl9mcmVlKGJ1Zik7CisgIH0KK30KKworc3RydWN0IGV2ZW50X2Jhc2UqIFRFdmh0dHBTZXJ2ZXI6OmdldEV2ZW50QmFzZSgpIHsKKyAgcmV0dXJuIGViXzsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJmM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKworc3RydWN0IGV2ZW50X2Jhc2U7CitzdHJ1Y3QgZXZodHRwOworc3RydWN0IGV2aHR0cF9yZXF1ZXN0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworY2xhc3MgVEFzeW5jQnVmZmVyUHJvY2Vzc29yOworCitjbGFzcyBURXZodHRwU2VydmVyIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRFdmh0dHBTZXJ2ZXIgZm9yIHVzZSB3aXRoIGFuIGV4dGVybmFsIGV2aHR0cCBpbnN0YW5jZS4KKyAgICogTXVzdCBiZSBtYW51YWxseSBpbnN0YWxsZWQgd2l0aCBldmh0dHBfc2V0X2NiLCB1c2luZworICAgKiBURXZodHRwU2VydmVyOjpyZXF1ZXN0IGFzIHRoZSBjYWxsYmFjayBhbmQgdGhlCisgICAqIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBhcyB0aGUgZXh0cmEgYXJnLgorICAgKiBEbyBub3QgY2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyLgorICAgKi8KKyAgVEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBURXZodHRwU2VydmVyIHdpdGggYW4gZW1iZWRkZWQgZXZlbnRfYmFzZSBhbmQgZXZodHRwLAorICAgKiBsaXN0ZW5pbmcgb24gcG9ydCBhbmQgcmVzcG9uZGluZyBvbiB0aGUgZW5kcG9pbnQgIi8iLgorICAgKiBDYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIgdG8gc2VydmUgZm9yZXZlci4KKyAgICovCisgIFRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCk7CisKKyAgflRFdmh0dHBTZXJ2ZXIoKTsKKworICBzdGF0aWMgdm9pZCByZXF1ZXN0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBzZWxmKTsKKyAgaW50IHNlcnZlKCk7CisKKyAgc3RydWN0IGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpOworCitwcml2YXRlOgorICBzdHJ1Y3QgUmVxdWVzdENvbnRleHQ7CisKKyAgdm9pZCBwcm9jZXNzKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKKyAgdm9pZCBjb21wbGV0ZShSZXF1ZXN0Q29udGV4dCogY3R4LCBib29sIHN1Y2Nlc3MpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0cnVjdCBldmVudF9iYXNlKiBlYl87CisgIHN0cnVjdCBldmh0dHAqIGVoXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzOGZkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaApAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8gMQorCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKK2NsYXNzIE5vU3VjaFRhc2tFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307CisKK2NsYXNzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OworCitjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307CisKK2NsYXNzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHt9CisgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Cit9OworCitjbGFzcyBUaW1lZE91dEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRpbWVkT3V0RXhjZXB0aW9uKCkgOiBURXhjZXB0aW9uKCJUaW1lZE91dEV4Y2VwdGlvbiIpe307CisgIFRpbWVkT3V0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307CisKK2NsYXNzIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworcHVibGljOgorICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKCkgOiBURXhjZXB0aW9uKCJUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIil7fTsKKyAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Cit9OworCitjbGFzcyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCkge30KKworICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkMTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSAorI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9IIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIENvbnZlbmllbnQgaW1wbGVtZW50YXRpb24gb2YgUnVubmFibGUgdGhhdCB3aWxsIGV4ZWN1dGUgYXJiaXRyYXJ5IGNhbGxiYWNrcy4KKyAqIEludGVyZmFjZXMgYXJlIHByb3ZpZGVkIHRvIGFjY2VwdCBib3RoIGEgZ2VuZXJpYyAndm9pZCh2b2lkKScgY2FsbGJhY2ssIGFuZAorICogYSAndm9pZCogKHZvaWQqKScgcHRocmVhZF9jcmVhdGUtc3R5bGUgY2FsbGJhY2suCisgKgorICogRXhhbXBsZSB1c2U6CisgKiAgdm9pZCogbXlfdGhyZWFkX21haW4odm9pZCogYXJnKTsKKyAqICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IGZhY3RvcnkgPSAuLi47CisgKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgbXlfdGhyZWFkX21haW4gb25jZToKKyAqICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gZmFjdG9yeS0+bmV3VGhyZWFkKAorICogICAgRnVuY3Rpb25SdW5uZXI6OmNyZWF0ZShteV90aHJlYWRfbWFpbiwgc29tZV9hcmd1bWVudCkpOworICogIHRocmVhZC0+c3RhcnQoKTsKKyAqCisgKiAgYm9vbCBBOjpmb28oKTsKKyAqICBBKiBhID0gbmV3IEEoKTsKKyAqICAvLyBUbyBjcmVhdGUgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBhLmZvbygpIGV2ZXJ5IDEwMCBtaWxsaXNlY29uZHM6CisgKiAgZmFjdG9yeS0+bmV3VGhyZWFkKEZ1bmN0aW9uUnVubmVyOjpjcmVhdGUoCisgKiAgICBzdGQ6OmJpbmQoJkE6OmZvbywgYSksIDEwMCkpLT5zdGFydCgpOworICoKKyAqLworCitjbGFzcyBGdW5jdGlvblJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7CitwdWJsaWM6CisgIC8vIFRoaXMgaXMgdGhlIHR5cGUgb2YgY2FsbGJhY2sgJ3B0aHJlYWRfY3JlYXRlKCknIGV4cGVjdHMuCisgIHR5cGVkZWYgdm9pZCogKCpQdGhyZWFkRnVuY1B0cikodm9pZCogYXJnKTsKKyAgLy8gVGhpcyBhIGZ1bGx5LWdlbmVyaWMgdm9pZCh2b2lkKSBjYWxsYmFjayBmb3IgY3VzdG9tIGJpbmRpbmdzLgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkRnVuYzsKKworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKKworICAvKioKKyAgICogU3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNyZWF0ZSBuZXcgRnVuY3Rpb25SdW5uZXIKKyAgICogb2JqZWN0cyB3cmFwcGVkIGluIHNoYXJlZF9wdHIuCisgICAqLworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KG5ldyBGdW5jdGlvblJ1bm5lcihjb2IpKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPihuZXcgRnVuY3Rpb25SdW5uZXIoZnVuYywgYXJnKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgcHRocmVhZF9mdW5jX3dyYXBwZXIoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKSB7CisgICAgLy8gZGlzY2FyZCByZXR1cm4gdmFsdWUKKyAgICBmdW5jKGFyZyk7CisgIH0KKworcHVibGljOgorICAvKioKKyAgICogR2l2ZW4gYSAncHRocmVhZF9jcmVhdGUnIHN0eWxlIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwKKyAgICogZXhlY3V0ZSB0aGUgZ2l2ZW4gY2FsbGJhY2suICBOb3RlIHRoYXQgdGhlICd2b2lkKicgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCisgICAqLworICBGdW5jdGlvblJ1bm5lcihQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpCisgICAgOiBmdW5jXyhzdGQ6OmJpbmQocHRocmVhZF9mdW5jX3dyYXBwZXIsIGZ1bmMsIGFyZykpLCBpbnRlcnZhbE1zXygtMSkge30KKworICAvKioKKyAgICogR2l2ZW4gYSBnZW5lcmljIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZSBpdC4KKyAgICovCisgIEZ1bmN0aW9uUnVubmVyKGNvbnN0IFZvaWRGdW5jJiBjb2IpIDogZnVuY18oY29iKSwgaW50ZXJ2YWxNc18oLTEpIHt9CisKKyAgLyoqCisgICAqIEdpdmVuIGEgYm9vbCBmb28oLi4uKSB0eXBlIGNhbGxiYWNrLCBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUKKyAgICogdGhlIGNhbGxiYWNrIHJlcGVhdGVkbHkgd2l0aCAnaW50ZXJ2YWxNcycgbWlsbGlzZWNvbmRzIGJldHdlZW4gdGhlIGNhbGxzLAorICAgKiB1bnRpbCBpdCByZXR1cm5zIGZhbHNlLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBpbnRlcnZhbCBiZXR3ZWVuIGNhbGxzIHdpbGwKKyAgICogYmUgaW50ZXJ2YWxNcyBwbHVzIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBjYWxsYmFjay4KKyAgICovCisgIEZ1bmN0aW9uUnVubmVyKGNvbnN0IEJvb2xGdW5jJiBjb2IsIGludCBpbnRlcnZhbE1zKSA6IHJlcEZ1bmNfKGNvYiksIGludGVydmFsTXNfKGludGVydmFsTXMpIHt9CisKKyAgdm9pZCBydW4oKSB7CisgICAgaWYgKHJlcEZ1bmNfKSB7CisgICAgICB3aGlsZSAocmVwRnVuY18oKSkgeworICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhpbnRlcnZhbE1zXyAqIDEwMDApOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmdW5jXygpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBWb2lkRnVuYyBmdW5jXzsKKyAgQm9vbEZ1bmMgcmVwRnVuY187CisgIGludCBpbnRlcnZhbE1zXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MGNjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBQT1NJWCBwdGhyZWFkIGxpYnJhcnkKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNb25pdG9yOjpJbXBsIHsKKworcHVibGljOgorICBJbXBsKCkgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksIG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgeworICAgIGluaXQob3duZWRNdXRleF8uZ2V0KCkpOworICB9CisKKyAgSW1wbChNdXRleCogbXV0ZXgpIDogbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7IGluaXQobXV0ZXgpOyB9CisKKyAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgeyBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOyB9CisKKyAgfkltcGwoKSB7IGNsZWFudXAoKTsgfQorCisgIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KKyAgdm9pZCBsb2NrKCkgeyBtdXRleCgpLmxvY2soKTsgfQorICB2b2lkIHVubG9jaygpIHsgbXV0ZXgoKS51bmxvY2soKTsgfQorCisgIC8qKgorICAgKiBFeGNlcHRpb24tdGhyb3dpbmcgdmVyc2lvbiBvZiB3YWl0Rm9yVGltZVJlbGF0aXZlKCksIGNhbGxlZCBzaW1wbHkKKyAgICogd2FpdChpbnQ2NCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgorICAgKgorICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCisgICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7CisgICAgaW50IHJlc3VsdCA9IHdhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7CisgICAgaWYgKHJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKSB7CisgICAgICAvLyBwdGhyZWFkX2NvbmRfdGltZWR3YWl0IGhhcyBiZWVuIG9ic2VydmVkIHRvIHJldHVybiBlYXJseSBvbgorICAgICAgLy8gdmFyaW91cyBwbGF0Zm9ybXMsIHNvIGNvbW1lbnQgb3V0IHRoaXMgYXNzZXJ0LgorICAgICAgLy8gYXNzZXJ0KFV0aWw6OmN1cnJlbnRUaW1lKCkgPj0gKG5vdyArIHRpbWVvdXQpKTsKKyAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigicHRocmVhZF9jb25kX3dhaXQoKSBvciBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCkgZmFpbGVkIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KKyAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgorICAgKgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7CisgICAgaWYgKHRpbWVvdXRfbXMgPT0gMExMKSB7CisgICAgICByZXR1cm4gd2FpdEZvcmV2ZXIoKTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIGFic3RpbWU7CisgICAgVXRpbDo6dG9UaW1lc3BlYyhhYnN0aW1lLCBVdGlsOjpjdXJyZW50VGltZSgpICsgdGltZW91dF9tcyk7CisgICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZhYnN0aW1lKTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4CisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCwgYWJzdGltZSk7CisgIH0KKworICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRlbXA7CisgICAgdGVtcC50dl9zZWMgPSBhYnN0aW1lLT50dl9zZWM7CisgICAgdGVtcC50dl9uc2VjID0gYWJzdGltZS0+dHZfdXNlYyAqIDEwMDA7CisgICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKKyAgfQorICAvKioKKyAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgKi8KKyAgaW50IHdhaXRGb3JldmVyKCkgY29uc3QgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0gcmVpbnRlcnByZXRfY2FzdDxwdGhyZWFkX211dGV4X3QqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworICAgIHJldHVybiBwdGhyZWFkX2NvbmRfd2FpdCgmcHRocmVhZF9jb25kXywgbXV0ZXhJbXBsKTsKKyAgfQorCisgIHZvaWQgbm90aWZ5KCkgeworICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4CisgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwdGhyZWFkX2NvbmRfKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGlyZXQpOworICAgIGFzc2VydChpcmV0ID09IDApOworICB9CisKKyAgdm9pZCBub3RpZnlBbGwoKSB7CisgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKKyAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnB0aHJlYWRfY29uZF8pOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaXJldCk7CisgICAgYXNzZXJ0KGlyZXQgPT0gMCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBpbml0KE11dGV4KiBtdXRleCkgeworICAgIG11dGV4XyA9IG11dGV4OworCisgICAgaWYgKHB0aHJlYWRfY29uZF9pbml0KCZwdGhyZWFkX2NvbmRfLCBOVUxMKSA9PSAwKSB7CisgICAgICBjb25kSW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWNvbmRJbml0aWFsaXplZF8pIHsKKyAgICAgIGNsZWFudXAoKTsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBjbGVhbnVwKCkgeworICAgIGlmIChjb25kSW5pdGlhbGl6ZWRfKSB7CisgICAgICBjb25kSW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCZwdGhyZWFkX2NvbmRfKTsKKyAgICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaXJldCk7CisgICAgICBhc3NlcnQoaXJldCA9PSAwKTsKKyAgICB9CisgIH0KKworICB1bmlxdWVfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgTXV0ZXgqIG11dGV4XzsKKworICBtdXRhYmxlIHB0aHJlYWRfY29uZF90IHB0aHJlYWRfY29uZF87CisgIG11dGFibGUgYm9vbCBjb25kSW5pdGlhbGl6ZWRfOworfTsKKworTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHsKK30KKworTW9uaXRvcjo6fk1vbml0b3IoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPm11dGV4KCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPmxvY2soKTsKK30KKwordm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KKwordm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeworICBpbXBsXy0+d2FpdCh0aW1lb3V0KTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPndhaXRGb3JUaW1lKGFic3RpbWUpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPndhaXRGb3JUaW1lKGFic3RpbWUpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvcmV2ZXIoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvcmV2ZXIoKTsKK30KKwordm9pZCBNb25pdG9yOjpub3RpZnkoKSBjb25zdCB7CisgIGltcGxfLT5ub3RpZnkoKTsKK30KKwordm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7CisgIGltcGxfLT5ub3RpZnlBbGwoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk5YTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8gMQorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS5ocHA+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEEgbW9uaXRvciBpcyBhIGNvbWJpbmF0aW9uIG11dGV4IGFuZCBjb25kaXRpb24tZXZlbnQuICBXYWl0aW5nIGFuZAorICogbm90aWZ5aW5nIGNvbmRpdGlvbiBldmVudHMgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIG93biB0aGUgbXV0ZXguICBNdXRleAorICogbG9jayBhbmQgdW5sb2NrIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBpbmRlcGVuZGVudGx5IG9mIGNvbmRpdGlvbgorICogZXZlbnRzLiAgVGhpcyBpcyBtb3JlIG9yIGxlc3MgYW5hbG9nb3VzIHRvIGphdmEubGFuZy5PYmplY3QgbXVsdGktdGhyZWFkCisgKiBvcGVyYXRpb25zLgorICoKKyAqIE5vdGUgdGhlIE1vbml0b3IgY2FuIGNyZWF0ZSBhIG5ldywgaW50ZXJuYWwgbXV0ZXg7IGFsdGVybmF0aXZlbHksIGEKKyAqIHNlcGFyYXRlIE11dGV4IGNhbiBiZSBwYXNzZWQgaW4gYW5kIHRoZSBNb25pdG9yIHdpbGwgcmUtdXNlIGl0IHdpdGhvdXQKKyAqIHRha2luZyBvd25lcnNoaXAuICBJdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisgKiBNdXRleCBpcyBub3QgZGVhbGxvY2F0ZWQgYmVmb3JlIHRoZSBNb25pdG9yLgorICoKKyAqIE5vdGUgdGhhdCBhbGwgbWV0aG9kcyBhcmUgY29uc3QuICBNb25pdG9ycyBpbXBsZW1lbnQgbG9naWNhbCBjb25zdG5lc3MsIG5vdAorICogYml0IGNvbnN0bmVzcy4gIFRoaXMgYWxsb3dzIGNvbnN0IG1ldGhvZHMgdG8gY2FsbCBtb25pdG9yIG1ldGhvZHMgd2l0aG91dAorICogbmVlZGluZyB0byBjYXN0IGF3YXkgY29uc3RuZXNzIG9yIGNoYW5nZSB0byBub24tY29uc3Qgc2lnbmF0dXJlcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNb25pdG9yIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgLyoqIENyZWF0ZXMgYSBuZXcgbXV0ZXgsIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgaXQuICovCisgIE1vbml0b3IoKTsKKworICAvKiogVXNlcyB0aGUgcHJvdmlkZWQgbXV0ZXggd2l0aG91dCB0YWtpbmcgb3duZXJzaGlwLiAqLworICBleHBsaWNpdCBNb25pdG9yKE11dGV4KiBtdXRleCk7CisKKyAgLyoqIFVzZXMgdGhlIG11dGV4IGluc2lkZSB0aGUgcHJvdmlkZWQgTW9uaXRvciB3aXRob3V0IHRha2luZyBvd25lcnNoaXAuICovCisgIGV4cGxpY2l0IE1vbml0b3IoTW9uaXRvciogbW9uaXRvcik7CisKKyAgLyoqIERlYWxsb2NhdGVzIHRoZSBtdXRleCBvbmx5IGlmIHdlIG93biBpdC4gKi8KKyAgdmlydHVhbCB+TW9uaXRvcigpOworCisgIE11dGV4JiBtdXRleCgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHVubG9jaygpIGNvbnN0OworCisgIC8qKgorICAgKiBXYWl0cyBhIG1heGltdW0gb2YgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbgorICAgKiB0byBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCisgICAqCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0OworCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0OworCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0OworCisgIC8qKgorICAgKiBXYWl0cyBmb3JldmVyIHVudGlsIHRoZSBjb25kaXRpb24gb2NjdXJzLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3Vycywgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAqLworICBpbnQgd2FpdEZvcmV2ZXIoKSBjb25zdDsKKworICAvKioKKyAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5CisgICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KKyAgICoKKyAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgorICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKi8KKyAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcyA9IDBMTCkgY29uc3Q7CisKKyAgLyoqIFdha2VzIHVwIG9uZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlzIG1vbml0b3IuICovCisgIHZpcnR1YWwgdm9pZCBub3RpZnkoKSBjb25zdDsKKworICAvKiogV2FrZXMgdXAgYWxsIHdhaXRpbmcgdGhyZWFkcyBvbiB0aGlzIG1vbml0b3IuICovCisgIHZpcnR1YWwgdm9pZCBub3RpZnlBbGwoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgY2xhc3MgSW1wbDsKKworICBJbXBsKiBpbXBsXzsKK307CisKK2NsYXNzIFN5bmNocm9uaXplZCB7CitwdWJsaWM6CisgIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yKiBtb25pdG9yKSA6IGcobW9uaXRvci0+bXV0ZXgoKSkge30KKyAgU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3ImIG1vbml0b3IpIDogZyhtb25pdG9yLm11dGV4KCkpIHt9CisKK3ByaXZhdGU6CisgIEd1YXJkIGc7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI2NDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBuZWVkZWQgdG8gdGVzdCBmb3IgcHRocmVhZCBpbXBsZW1lbnRhdGlvbiBjYXBhYmlsaXRpZXM6CisjZGVmaW5lIF9fVVNFX0dOVQorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvLyBFbmFibGUgdGhpcyB0byB0dXJuIG9uIG11dGV4IGNvbnRlbnRpb24gcHJvZmlsaW5nIHN1cHBvcnQKKy8vICNkZWZpbmUgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKK3N0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7CitzdGF0aWMgaW50MzJfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOworc3RhdGljIE11dGV4V2FpdENhbGxiYWNrIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSAwOworCit2b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gcHJvZmlsaW5nU2FtcGxlUmF0ZTsKKyAgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IGNhbGxiYWNrOworfQorCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpIGludDY0X3QgX2xvY2tfc3RhcnRUaW1lID0gbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKTsKKworI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfbG9ja19zdGFydFRpbWUgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50NjRfdCBlbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBlbmRUaW1lIC0gX2xvY2tfc3RhcnRUaW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJvZmlsZVRpbWVfID0gX2xvY2tfc3RhcnRUaW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHByb2ZpbGVUaW1lXyA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBwcm9maWxlVGltZV8gPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKSAtIHByb2ZpbGVUaW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50NjRfdCBfdGVtcF9wcm9maWxlVGltZSA9IHByb2ZpbGVUaW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJvZmlsZVRpbWVfID0gMDsKKworI2RlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfdGVtcF9wcm9maWxlVGltZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBfdGVtcF9wcm9maWxlVGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKSB7CisgIGlmIChtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgJiYgbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykgeworICAgIC8vIFRoaXMgYmxvY2sgaXMgdW5zeW5jaHJvbml6ZWQsIGJ1dCBzaG91bGQgcHJvZHVjZSBhIHJlYXNvbmFibGUgc2FtcGxpbmcKKyAgICAvLyByYXRlIG9uIG1vc3QgYXJjaGl0ZWN0dXJlcy4gIFRoZSBtYWluIHJhY2UgY29uZGl0aW9ucyBhcmUgdGhlIGdhcAorICAgIC8vIGJldHdlZW4gdGhlIGRlY3JlbWVudCBhbmQgdGhlIHRlc3QsIHRoZSBub24tYXRvbWljaXR5IG9mIGRlY3JlbWVudCwgYW5kCisgICAgLy8gcG90ZW50aWFsIGNhY2hpbmcgb2YgZGlmZmVyZW50IHZhbHVlcyBhdCBkaWZmZXJlbnQgQ1BVcy4KKyAgICAvLworICAgIC8vIC0gaWYgdHdvIGRlY3JlbWVudHMgcmFjZSwgdGhlIGxpa2VsaWVzdCByZXN1bHQgaXMgdGhhdCB0aGUgY291bnRlcgorICAgIC8vICAgICAgZGVjcmVtZW50cyBzbG93bHkgKHBlcmhhcHMgbXVjaCBtb3JlIHNsb3dseSkgdGhhbiBpbnRlbmRlZC4KKyAgICAvLworICAgIC8vIC0gbWFueSB0aHJlYWRzIGNvdWxkIHBvdGVudGlhbGx5IGRlY3JlbWVudCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBjb3VudGVyCisgICAgLy8gICAgICB0byBpdHMgbGFyZ2UgdmFsdWUsIGNhdXNpbmcgZWFjaCBhZGRpdGlvbmFsIGluY29taW5nIHRocmVhZCB0bworICAgIC8vICAgICAgcHJvZmlsZSBldmVyeSBjYWxsLiAgVGhpcyBzaXR1YXRpb24gaXMgdW5saWtlbHkgdG8gcGVyc2lzdCBmb3IgbG9uZworICAgIC8vICAgICAgYXMgdGhlIGNyaXRpY2FsIGdhcCBpcyBxdWl0ZSBzaG9ydCwgYnV0IHByb2ZpbGluZyBjb3VsZCBiZSBidXJzdHkuCisgICAgc2lnX2F0b21pY190IGxvY2FsVmFsdWUgPSAtLW11dGV4UHJvZmlsaW5nQ291bnRlcjsKKyAgICBpZiAobG9jYWxWYWx1ZSA8PSAwKSB7CisgICAgICBtdXRleFByb2ZpbGluZ0NvdW50ZXIgPSBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGU7CisgICAgICByZXR1cm4gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkKKyNlbmRpZiAvLyBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworCisjZGVmaW5lIEVJTlRSX0xPT1AoX0NBTEwpICAgICAgICAgIGludCByZXQ7IGRvIHsgcmV0ID0gX0NBTEw7IH0gd2hpbGUgKHJldCA9PSBFSU5UUikKKyNkZWZpbmUgQUJPUlRfT05GQUlMKF9DQUxMKSAgICAgIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQpIHsgYWJvcnQoKTsgfSB9CisjZGVmaW5lIFRIUk9XX1NSRShfQ0FMTFNUUiwgUkVUKSB7IHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGJvb3N0OjpzdHIoYm9vc3Q6OmZvcm1hdCgiJTElIHJldHVybmVkICUyJSAoJTMlKSIpICUgX0NBTExTVFIgJSBSRVQgJSA6OnN0cmVycm9yKFJFVCkpKTsgfQorI2RlZmluZSBUSFJPV19TUkVfT05GQUlMKF9DQUxMKSAgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCkgeyBUSFJPV19TUkUoI19DQUxMLCByZXQpOyB9IH0KKyNkZWZpbmUgVEhST1dfU1JFX1RSWUZBSUwoX0NBTEwpIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQgPT0gMCkgeyByZXR1cm4gdHJ1ZTsgfSBlbHNlIGlmIChyZXQgPT0gRUJVU1kpIHsgcmV0dXJuIGZhbHNlOyB9IFRIUk9XX1NSRSgjX0NBTEwsIHJldCk7IH0KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBNdXRleCBjbGFzcyB1c2luZyBQT1NJWCBtdXRleAorICoKKyAqIFRocm93cyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uIG9uIGVycm9yLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE11dGV4OjppbXBsIHsKK3B1YmxpYzoKKyAgaW1wbChJbml0aWFsaXplciBpbml0KSA6IGluaXRpYWxpemVkXyhmYWxzZSkgeworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisgICAgcHJvZmlsZVRpbWVfID0gMDsKKyNlbmRpZgorICAgIGluaXQoJnB0aHJlYWRfbXV0ZXhfKTsKKyAgICBpbml0aWFsaXplZF8gPSB0cnVlOworICB9CisKKyAgfmltcGwoKSB7CisgICAgaWYgKGluaXRpYWxpemVkXykgeworICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICAgICBBQk9SVF9PTkZBSUwocHRocmVhZF9tdXRleF9kZXN0cm95KCZwdGhyZWFkX211dGV4XykpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9jaygpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfbG9jaygmcHRocmVhZF9tdXRleF8pKTsKKyAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOworICB9CisKKyAgYm9vbCB0cnlsb2NrKCkgY29uc3QgeworICAgIFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsKKyAgfQorCisgIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdCB7CisjaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAyMDAxMTJMCisgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7CisKKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRzOworICAgIFV0aWw6OnRvVGltZXNwZWModHMsIG1pbGxpc2Vjb25kcyArIFV0aWw6OmN1cnJlbnRUaW1lKCkpOworICAgIEVJTlRSX0xPT1AocHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSBFVElNRURPVVQpIHsKKyAgICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFRIUk9XX1NSRSgicHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpIiwgcmV0KTsKKyNlbHNlCisgICAgLyogT3RoZXJ3aXNlIGZvbGxvdyBzb2x1dGlvbiB1c2VkIGJ5IE1vbm8gZm9yIEFuZHJvaWQgKi8KKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHNsZWVweXRpbWUsIG5vdywgdG87CisKKyAgICAvKiBUaGlzIGlzIGp1c3QgdG8gYXZvaWQgYSBjb21wbGV0ZWx5IGJ1c3kgd2FpdCAqLworICAgIHNsZWVweXRpbWUudHZfc2VjID0gMDsKKyAgICBzbGVlcHl0aW1lLnR2X25zZWMgPSAxMDAwMDAwMEw7IC8qIDEwbXMgKi8KKworICAgIFV0aWw6OnRvVGltZXNwZWModG8sIG1pbGxpc2Vjb25kcyArIFV0aWw6OmN1cnJlbnRUaW1lKCkpOworCisgICAgd2hpbGUgKCh0cnlsb2NrKCkpID09IGZhbHNlKSB7CisgICAgICBVdGlsOjp0b1RpbWVzcGVjKG5vdywgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisgICAgICBpZiAobm93LnR2X3NlYyA+PSB0by50dl9zZWMgJiYgbm93LnR2X25zZWMgPj0gdG8udHZfbnNlYykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBuYW5vc2xlZXAoJnNsZWVweXRpbWUsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgIH0KKworICB2b2lkIHVubG9jaygpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF91bmxvY2soJnB0aHJlYWRfbXV0ZXhfKSk7CisgICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOworICB9CisKKyAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7IHJldHVybiAodm9pZCopJnB0aHJlYWRfbXV0ZXhfOyB9CisKK3ByaXZhdGU6CisgIG11dGFibGUgcHRocmVhZF9tdXRleF90IHB0aHJlYWRfbXV0ZXhfOworICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisgIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87CisjZW5kaWYKK307CisKK011dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbChpbml0KSkgeworfQorCit2b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+Z2V0VW5kZXJseWluZ0ltcGwoKTsKK30KKwordm9pZCBNdXRleDo6bG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPmxvY2soKTsKK30KKworYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlsb2NrKCk7Cit9CisKK2Jvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dGltZWRsb2NrKG1zKTsKK30KKwordm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeworICBpbXBsXy0+dW5sb2NrKCk7Cit9CisKK3ZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgIHB0aHJlYWRfbXV0ZXhfdCogcHRocmVhZF9tdXRleCA9IChwdGhyZWFkX211dGV4X3QqKWFyZzsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCkpOworfQorCisjaWYgZGVmaW5lZChQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKSB8fCBkZWZpbmVkKFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUCkgfHwgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKK3N0YXRpYyB2b2lkIGluaXRfd2l0aF9raW5kKHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXgsIGludCBraW5kKSB7CisgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhhdHRyOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cikpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCkpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4YXR0cikpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4YXR0cikpOworfQorI2VuZGlmCisKKyNpZmRlZiBQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCit2b2lkIE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgLy8gRnJvbSBteXNxbCBzb3VyY2U6IG15c3lzL215X3Rocl9pbml0LmMKKyAgLy8gU2V0IG11dGV4IHR5cGUgdG8gImZhc3QiIGEuay5hICJhZGFwdGl2ZSIKKyAgLy8KKyAgLy8gSW4gdGhpcyBjYXNlIHRoZSB0aHJlYWQgbWF5IHN0ZWFsIHRoZSBtdXRleCBmcm9tIHNvbWUgb3RoZXIgdGhyZWFkCisgIC8vIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIHNhbWUgbXV0ZXguIFRoaXMgd2lsbCBzYXZlIHVzIHNvbWUKKyAgLy8gY29udGV4dCBzd2l0Y2hlcyBidXQgbWF5IGNhdXNlIGEgdGhyZWFkIHRvICdzdGFydmUgZm9yZXZlcicgd2hpbGUKKyAgLy8gd2FpdGluZyBmb3IgdGhlIG11dGV4IChub3QgbGlrZWx5IGlmIHRoZSBjb2RlIHdpdGhpbiB0aGUgbXV0ZXggaXMKKyAgLy8gc2hvcnQpLgorICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfQURBUFRJVkVfTlApOworfQorI2VuZGlmCisKKyNpZmRlZiBQVEhSRUFEX0VSUk9SQ0hFQ0tfTVVURVhfSU5JVElBTElaRVJfTlAKK3ZvaWQgTXV0ZXg6OkVSUk9SQ0hFQ0tfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLKTsKK30KKyNlbmRpZgorCisjaWZkZWYgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKK3ZvaWQgTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBSZWFkV3JpdGVNdXRleCBjbGFzcyB1c2luZyBQT1NJWCBydyBsb2NrCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgUmVhZFdyaXRlTXV0ZXg6OmltcGwgeworcHVibGljOgorICBpbXBsKCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworICAgIHByb2ZpbGVUaW1lXyA9IDA7CisjZW5kaWYKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX2luaXQoJnJ3X2xvY2tfLCBOVUxMKSk7CisgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKyAgfQorCisgIH5pbXBsKCkgeworICAgIGlmIChpbml0aWFsaXplZF8pIHsKKyAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgICAgQUJPUlRfT05GQUlMKHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJnJ3X2xvY2tfKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pKTsKKyAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsgLy8gbm90IGV4Y2x1c2l2ZSwgc28gdXNlIG5vdC1sb2NrZWQgcGF0aAorICB9CisKKyAgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdCB7CisgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ3X2xvY2tfKSk7CisgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKKyAgfQorCisgIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdCB7IFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jaygmcndfbG9ja18pKTsgfQorCisgIGJvb2wgYXR0ZW1wdFdyaXRlKCkgY29uc3QgeyBUSFJPV19TUkVfVFJZRkFJTChwdGhyZWFkX3J3bG9ja190cnl3cmxvY2soJnJ3X2xvY2tfKSk7IH0KKworICB2b2lkIHJlbGVhc2UoKSBjb25zdCB7CisgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3VubG9jaygmcndfbG9ja18pKTsKKyAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7CisgIH0KKworcHJpdmF0ZToKKyAgbXV0YWJsZSBwdGhyZWFkX3J3bG9ja190IHJ3X2xvY2tfOworICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisgIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87CisjZW5kaWYKK307CisKK1JlYWRXcml0ZU11dGV4OjpSZWFkV3JpdGVNdXRleCgpIDogaW1wbF8obmV3IFJlYWRXcml0ZU11dGV4OjppbXBsKCkpIHsKK30KKwordm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7CisgIGltcGxfLT5hY3F1aXJlUmVhZCgpOworfQorCit2b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdCB7CisgIGltcGxfLT5hY3F1aXJlV3JpdGUoKTsKK30KKworYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFJlYWQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+YXR0ZW1wdFJlYWQoKTsKK30KKworYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFdyaXRlKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPmF0dGVtcHRXcml0ZSgpOworfQorCit2b2lkIFJlYWRXcml0ZU11dGV4OjpyZWxlYXNlKCkgY29uc3QgeworICBpbXBsXy0+cmVsZWFzZSgpOworfQorCitOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjpOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkgOiB3cml0ZXJXYWl0aW5nXyhmYWxzZSkgeworfQorCit2b2lkIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCkgY29uc3QgeworICBpZiAod3JpdGVyV2FpdGluZ18pIHsKKyAgICAvLyB3cml0ZXIgaXMgd2FpdGluZywgYmxvY2sgb24gdGhlIHdyaXRlcidzIG11dGV4IHVudGlsIGhlJ3MgZG9uZSB3aXRoIGl0CisgICAgbXV0ZXhfLmxvY2soKTsKKyAgICBtdXRleF8udW5sb2NrKCk7CisgIH0KKworICBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKTsKK30KKwordm9pZCBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdCB7CisgIC8vIGlmIHdlIGNhbiBhY3F1aXJlIHRoZSByd2xvY2sgdGhlIGVhc3kgd2F5LCB3ZSdyZSBkb25lCisgIGlmIChhdHRlbXB0V3JpdGUoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZhaWxlZCB0byBnZXQgdGhlIHJ3bG9jaywgZG8gaXQgdGhlIGhhcmQgd2F5OgorICAvLyBsb2NraW5nIHRoZSBtdXRleCBhbmQgc2V0dGluZyB3cml0ZXJXYWl0aW5nIHdpbGwgY2F1c2UgYWxsIG5ldyByZWFkZXJzIHRvCisgIC8vIGJsb2NrIG9uIHRoZSBtdXRleCByYXRoZXIgdGhhbiBvbiB0aGUgcndsb2NrLgorICBtdXRleF8ubG9jaygpOworICB3cml0ZXJXYWl0aW5nXyA9IHRydWU7CisgIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKTsKKyAgd3JpdGVyV2FpdGluZ18gPSBmYWxzZTsKKyAgbXV0ZXhfLnVubG9jaygpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmNTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisjaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworCisvKioKKyAqIERldGVybWluZXMgaWYgdGhlIFRocmlmdCBNdXRleCBhbmQgUmVhZFdyaXRlTXV0ZXggY2xhc3NlcyB3aWxsIGF0dGVtcHQgdG8KKyAqIHByb2ZpbGUgdGhlaXIgYmxvY2tpbmcgYWNxdWlyZSBtZXRob2RzLiBJZiB0aGlzIHZhbHVlIGlzIHNldCB0byBub24temVybywKKyAqIFRocmlmdCB3aWxsIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBjYWxsYmFjayBvbmNlIGV2ZXJ5IHByb2ZpbGluZ1NhbXBsZVJhdGUKKyAqIHRpbWVzLiAgSG93ZXZlciwgYXMgdGhlIHNhbXBsaW5nIGlzIG5vdCBzeW5jaHJvbml6ZWQgdGhlIHJhdGUgaXMgbm90CisgKiBndXJhbmF0ZWVkLCBhbmQgY291bGQgYmUgc3ViamVjdCB0byBiaWcgYnVyc3RzIGFuZCBzd2luZ3MuICBQbGVhc2UgZW5zdXJlCisgKiB5b3VyIHNhbXBsaW5nIGNhbGxiYWNrIGlzIGFzIHBlcmZvcm1hbnQgYXMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcy4KKyAqCisgKiBUaGUgY2FsbGJhY2sgd2lsbCBnZXQgY2FsbGVkIHdpdGggdGhlIHdhaXQgdGltZSB0YWtlbiB0byBsb2NrIHRoZSBtdXRleCBpbgorICogdXNlYyBhbmQgYSAodm9pZCopIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgTXV0ZXggKG9yIFJlYWRXcml0ZU11dGV4KQorICogYmVpbmcgbG9ja2VkLgorICoKKyAqIFRoZSBlbmFibGVNdXRleFByb2ZpbGluZygpIGZ1bmN0aW9uIGlzIHVuc3luY2hyb25pemVkOyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIHdoaWxlIHByb2ZpbGluZyBpcyBhbHJlYWR5IGVuYWJsZWQgbWF5IHJlc3VsdCBpbiByYWNlIGNvbmRpdGlvbnMuICBPbgorICogYXJjaGl0ZWN0dXJlcyB3aGVyZSBhIHBvaW50ZXIgYXNzaWdubWVudCBpcyBhdG9taWMsIHRoaXMgaXMgc2FmZSBidXQgdGhlcmUKKyAqIGlzIG5vIGd1YXJhbnRlZSB0aHJlYWRzIHdpbGwgYWdyZWUgb24gYSBzaW5nbGUgY2FsbGJhY2sgd2l0aGluIGFueQorICogcGFydGljdWxhciB0aW1lIHBlcmlvZC4KKyAqLwordHlwZWRlZiB2b2lkICgqTXV0ZXhXYWl0Q2FsbGJhY2spKGNvbnN0IHZvaWQqIGlkLCBpbnQ2NF90IHdhaXRUaW1lTWljcm9zKTsKK3ZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLCBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjayk7CisKKyNlbmRpZgorCisvKioKKyAqIE5PVEU6IEFsbCBtdXRleCBpbXBsZW1lbnRhdGlvbnMgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuICBTZWUgZWFjaAorICogICAgICAgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdG8gdW5kZXJzdGFuZCB0aGUgZXhjZXB0aW9uIHR5cGUocykgdXNlZC4KKyAqLworCisvKioKKyAqIEEgc2ltcGxlIG11dGV4IGNsYXNzCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTXV0ZXggeworcHVibGljOgorICB0eXBlZGVmIHZvaWQgKCpJbml0aWFsaXplcikodm9pZCopOworCisgIE11dGV4KEluaXRpYWxpemVyIGluaXQgPSBERUZBVUxUX0lOSVRJQUxJWkVSKTsKKyAgdmlydHVhbCB+TXV0ZXgoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCB0cnlsb2NrKCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7CisKKyAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdDsKKworICAvLyBJZiB5b3UgYXR0ZW1wdCB0byB1c2Ugb25lIG9mIHRoZXNlIGFuZCBpdCBmYWlscyB0byBsaW5rLCBpdCBtZWFucworICAvLyB5b3VyIHZlcnNpb24gb2YgcHRocmVhZHMgZG9lcyBub3Qgc3VwcG9ydCBpdCAtIHRyeSBhbm90aGVyIG9uZS4KKyAgc3RhdGljIHZvaWQgQURBUFRJVkVfSU5JVElBTElaRVIodm9pZCopOworICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgRVJST1JDSEVDS19JTklUSUFMSVpFUih2b2lkKik7CisgIHN0YXRpYyB2b2lkIFJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKik7CisKK3ByaXZhdGU6CisgIGNsYXNzIGltcGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKK307CisKK2NsYXNzIFJlYWRXcml0ZU11dGV4IHsKK3B1YmxpYzoKKyAgUmVhZFdyaXRlTXV0ZXgoKTsKKyAgdmlydHVhbCB+UmVhZFdyaXRlTXV0ZXgoKSB7fQorCisgIC8vIHRoZXNlIGdldCB0aGUgbG9jayBhbmQgYmxvY2sgdW50aWwgaXQgaXMgZG9uZSBzdWNjZXNzZnVsbHkKKyAgdmlydHVhbCB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdDsKKworICAvLyB0aGVzZSBhdHRlbXB0IHRvIGdldCB0aGUgbG9jaywgcmV0dXJuaW5nIGZhbHNlIGltbWVkaWF0ZWx5IGlmIHRoZXkgZmFpbAorICB2aXJ0dWFsIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdDsKKyAgdmlydHVhbCBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0OworCisgIC8vIHRoaXMgcmVsZWFzZXMgYm90aCByZWFkIGFuZCB3cml0ZSBsb2NrcworICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0OworCitwcml2YXRlOgorICBjbGFzcyBpbXBsOworICBzdGQ6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87Cit9OworCisvKioKKyAqIEEgUmVhZFdyaXRlTXV0ZXggdGhhdCBndWFyYW50ZWVzIHdyaXRlcnMgd2lsbCBub3QgYmUgc3RhcnZlZCBieSByZWFkZXJzOgorICogV2hlbiBhIHdyaXRlciBhdHRlbXB0cyB0byBhY3F1aXJlIHRoZSBtdXRleCwgYWxsIG5ldyByZWFkZXJzIHdpbGwgYmUKKyAqIGJsb2NrZWQgZnJvbSBhY3F1aXJpbmcgdGhlIG11dGV4IHVudGlsIHRoZSB3cml0ZXIgaGFzIGFjcXVpcmVkIGFuZAorICogcmVsZWFzZWQgaXQuIEluIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMgbWF5IGFscmVhZHkgYmUgZ3VhcmFudGVlZAorICogYnkgYSByZWd1bGFyIFJlYWRXcml0ZU11dGV4LgorICovCitjbGFzcyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4IDogcHVibGljIFJlYWRXcml0ZU11dGV4IHsKK3B1YmxpYzoKKyAgTm9TdGFydmVSZWFkV3JpdGVNdXRleCgpOworCisgIHZpcnR1YWwgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIE11dGV4IG11dGV4XzsKKyAgbXV0YWJsZSB2b2xhdGlsZSBib29sIHdyaXRlcldhaXRpbmdfOworfTsKKworY2xhc3MgR3VhcmQgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICBHdWFyZChjb25zdCBNdXRleCYgdmFsdWUsIGludDY0X3QgdGltZW91dCA9IDApIDogbXV0ZXhfKCZ2YWx1ZSkgeworICAgIGlmICh0aW1lb3V0ID09IDApIHsKKyAgICAgIHZhbHVlLmxvY2soKTsKKyAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPCAwKSB7CisgICAgICBpZiAoIXZhbHVlLnRyeWxvY2soKSkgeworICAgICAgICBtdXRleF8gPSBOVUxMOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIXZhbHVlLnRpbWVkbG9jayh0aW1lb3V0KSkgeworICAgICAgICBtdXRleF8gPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICB+R3VhcmQoKSB7CisgICAgaWYgKG11dGV4XykgeworICAgICAgbXV0ZXhfLT51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG11dGV4XyAhPSBOVUxMKTsgfQorCitwcml2YXRlOgorICBjb25zdCBNdXRleCogbXV0ZXhfOworfTsKKworLy8gQ2FuIGJlIHVzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHRvIFJXR3VhcmQgdG8gbWFrZSBjb2RlIG1vcmUgcmVhZGFibGUKKy8vIGFzIHRvIHdoZXRoZXIgd2UncmUgZG9pbmcgYWNxdWlyZVJlYWQoKSBvciBhY3F1aXJlV3JpdGUoKS4KK2VudW0gUldHdWFyZFR5cGUgeyBSV19SRUFEID0gMCwgUldfV1JJVEUgPSAxIH07CisKK2NsYXNzIFJXR3VhcmQgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICBSV0d1YXJkKGNvbnN0IFJlYWRXcml0ZU11dGV4JiB2YWx1ZSwgYm9vbCB3cml0ZSA9IGZhbHNlKSA6IHJ3X211dGV4Xyh2YWx1ZSkgeworICAgIGlmICh3cml0ZSkgeworICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVJlYWQoKTsKKyAgICB9CisgIH0KKworICBSV0d1YXJkKGNvbnN0IFJlYWRXcml0ZU11dGV4JiB2YWx1ZSwgUldHdWFyZFR5cGUgdHlwZSkgOiByd19tdXRleF8odmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBSV19XUklURSkgeworICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVJlYWQoKTsKKyAgICB9CisgIH0KKyAgflJXR3VhcmQoKSB7IHJ3X211dGV4Xy5yZWxlYXNlKCk7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHJ3X211dGV4XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNDQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8gMQorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpZiBVU0VfU1REX1RIUkVBRAorIyAgaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KKyNlbHNlCisjICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjZW5kaWYKKy8vIGNsYW5nLWZvcm1hdCBvbgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLy8gY2xhbmctZm9ybWF0IG9mZgorI2lmIFVTRV9TVERfVEhSRUFECisgIHR5cGVkZWYgU3RkVGhyZWFkRmFjdG9yeSBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7CisjZWxzZQorICB0eXBlZGVmIFBvc2l4VGhyZWFkRmFjdG9yeSBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7CisjZW5kaWYKKy8vIGNsYW5nLWZvcm1hdCBvbgorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU5MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisKKyNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAorI2luY2x1ZGUgPGdvb2dsZS9wcm9maWxlci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVGhlIFBPU0lYIHRocmVhZCBjbGFzcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBQdGhyZWFkVGhyZWFkIDogcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyB1bmluaXRpYWxpemVkLCBzdGFydGluZywgc3RhcnRlZCwgc3RvcHBpbmcsIHN0b3BwZWQgfTsKKworICBzdGF0aWMgY29uc3QgaW50IE1CID0gMTAyNCAqIDEwMjQ7CisKKyAgc3RhdGljIHZvaWQqIHRocmVhZE1haW4odm9pZCogYXJnKTsKKworcHJpdmF0ZToKKyAgcHRocmVhZF90IHB0aHJlYWRfOworICBNb25pdG9yIG1vbml0b3JfOwkJLy8gZ3VhcmQgdG8gcHJvdGVjdCBzdGF0ZV8gYW5kIGFsc28gbm90aWZpY2F0aW9uCisgIFNUQVRFIHN0YXRlXzsgICAgICAgICAvLyB0byBwcm90ZWN0IHByb3BlciB0aHJlYWQgc3RhcnQgYmVoYXZpb3IKKyAgaW50IHBvbGljeV87CisgIGludCBwcmlvcml0eV87CisgIGludCBzdGFja1NpemVfOworICBzdGQ6OndlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGZfOworICBib29sIGRldGFjaGVkXzsKKworcHVibGljOgorICBQdGhyZWFkVGhyZWFkKGludCBwb2xpY3ksCisgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUsCisgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQorICAgIDoKKworI2lmbmRlZiBfV0lOMzIKKyAgICAgIHB0aHJlYWRfKDApLAorI2VuZGlmIC8vIF9XSU4zMgorICAgICAgc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLAorICAgICAgcG9saWN5Xyhwb2xpY3kpLAorICAgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKKyAgICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSwKKyAgICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgeworCisgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7CisgIH0KKworICB+UHRocmVhZFRocmVhZCgpIHsKKyAgICAvKiBOb3RoaW5nIHJlZmVyZW5jZXMgdGhpcyB0aHJlYWQsIGlmIGlzIGlzIG5vdCBkZXRhY2hlZCwgZG8gYSBqb2luCisgICAgICAgbm93LCBvdGhlcndpc2UgdGhlIHRocmVhZC1pZCBhbmQsIHBvc3NpYmx5LCBvdGhlciByZXNvdXJjZXMgd2lsbAorICAgICAgIGJlIGxlYWtlZC4gKi8KKyAgICBpZiAoIWRldGFjaGVkXykgeworICAgICAgdHJ5IHsKKyAgICAgICAgam9pbigpOworICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBTVEFURSBnZXRTdGF0ZSgpIGNvbnN0CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgcmV0dXJuIHN0YXRlXzsKKyAgfQorCisgIHZvaWQgc2V0U3RhdGUoU1RBVEUgbmV3U3RhdGUpCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgc3RhdGVfID0gbmV3U3RhdGU7CisKKyAgICAvLyB1bmJsb2NrIHN0YXJ0KCkgd2l0aCB0aGUga25vd2xlZGdlIHRoYXQgdGhlIHRocmVhZCBoYXMgYWN0dWFsbHkKKyAgICAvLyBzdGFydGVkIHJ1bm5pbmcsIHdoaWNoIGF2b2lkcyBhIHJhY2UgaW4gZGV0YWNoZWQgdGhyZWFkcy4KKyAgICBpZiAobmV3U3RhdGUgPT0gc3RhcnRlZCkgeworCSAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzdGFydCgpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisgICAgaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cikgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9pbml0IGZhaWxlZCIpOworICAgIH0KKworICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoZWRfID8gUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQgOiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSkKKyAgICAgICAgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhyZWFkIHN0YWNrIHNpemUKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmdGhyZWFkX2F0dHIsIE1CICogc3RhY2tTaXplXykgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUgZmFpbGVkIik7CisgICAgfQorCisvLyBTZXQgdGhyZWFkIHBvbGljeQorI2lmZGVmIF9XSU4zMgorICAgIC8vIFdJTjMyIFB0aHJlYWQgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgc2hlZHVsaW5nIHBvbGljaWVzIG90aGVyIHRoZW4KKyAgICAvLyBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSIC0gcnVudGltZSBlcnJvcgorICAgIHBvbGljeV8gPSBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSOworI2VuZGlmCisKKyNpZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgPiAwCisgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSgmdGhyZWFkX2F0dHIsIHBvbGljeV8pICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgZmFpbGVkIik7CisgICAgfQorI2VuZGlmCisKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWRfcGFyYW07CisgICAgc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eV87CisKKyAgICAvLyBTZXQgdGhyZWFkIHByaW9yaXR5CisgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnNjaGVkX3BhcmFtKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gZmFpbGVkIik7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHJlZmVyZW5jZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiogc2VsZlJlZiA9IG5ldyBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4oKTsKKyAgICAqc2VsZlJlZiA9IHNlbGZfLmxvY2soKTsKKworICAgIHNldFN0YXRlKHN0YXJ0aW5nKTsKKworCVN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKwkKKyAgICBpZiAocHRocmVhZF9jcmVhdGUoJnB0aHJlYWRfLCAmdGhyZWFkX2F0dHIsIHRocmVhZE1haW4sICh2b2lkKilzZWxmUmVmKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9jcmVhdGUgZmFpbGVkIik7CisgICAgfQorICAgIAorICAgIC8vIFRoZSBjYWxsZXIgbWF5IG5vdCBjaG9vc2UgdG8gZ3VhcmFudGVlIHRoZSBzY29wZSBvZiB0aGUgUnVubmFibGUKKyAgICAvLyBiZWluZyB1c2VkIGluIHRoZSB0aHJlYWQsIHNvIHdlIG11c3QgYWN0dWFsbHkgd2FpdCB1bnRpbCB0aGUgdGhyZWFkCisgICAgLy8gc3RhcnRzIGJlZm9yZSB3ZSByZXR1cm4uICBJZiB3ZSBkbyBub3Qgd2FpdCwgaXQgd291bGQgYmUgcG9zc2libGUKKyAgICAvLyBmb3IgdGhlIGNhbGxlciB0byBzdGFydCBkZXN0cnVjdGluZyB0aGUgUnVubmFibGUgYW5kIHRoZSBUaHJlYWQsCisgICAgLy8gYW5kIHdlIHdvdWxkIGVuZCB1cCBpbiBhIHJhY2UuICBUaGlzIHdhcyBpZGVudGlmaWVkIHdpdGggdmFsZ3JpbmQuCisgICAgbW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgdm9pZCBqb2luKCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgeworICAgICAgdm9pZCogaWdub3JlOworICAgICAgLyogWFhYCisgICAgICAgICBJZiBqb2luIGZhaWxzIGl0IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdAorICAgICAgICAgdGhhdCB0aGUgbGFzdCByZWZlcmVuY2Ugd2FzIHRoZSB0aHJlYWQgaXRzZWxmIGFuZCBjYW5ub3QKKyAgICAgICAgIGpvaW4uICBUaGlzIHJlc3VsdHMgaW4gbGVha2VkIHRocmVhZHMgYW5kIHdpbGwgZXZlbnR1YWxseQorICAgICAgICAgY2F1c2UgdGhlIHByb2Nlc3MgdG8gcnVuIG91dCBvZiB0aHJlYWQgcmVzb3VyY2VzLgorICAgICAgICAgV2UncmUgYmV5b25kIHRoZSBwb2ludCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBOb3QgY2xlYXIgaG93CisgICAgICAgICBiZXN0IHRvIGhhbmRsZSB0aGlzLiAqLworICAgICAgaW50IHJlcyA9IHB0aHJlYWRfam9pbihwdGhyZWFkXywgJmlnbm9yZSk7CisgICAgICBkZXRhY2hlZF8gPSAocmVzID09IDApOworICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlB0aHJlYWRUaHJlYWQ6OmpvaW4oKTogZmFpbCB3aXRoIGNvZGUgJWQiLCByZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsKKworI2lmbmRlZiBfV0lOMzIKKyAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkXzsKKyNlbHNlCisgICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF8ucDsKKyNlbmRpZiAvLyBfV0lOMzIKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KKworICB2b2lkIHJ1bm5hYmxlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KKworICB2b2lkIHdlYWtSZWYoc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKKyAgICBhc3NlcnQoc2VsZi5nZXQoKSA9PSB0aGlzKTsKKyAgICBzZWxmXyA9IHN0ZDo6d2Vha19wdHI8UHRocmVhZFRocmVhZD4oc2VsZik7CisgIH0KK307CisKK3ZvaWQqIFB0aHJlYWRUaHJlYWQ6OnRocmVhZE1haW4odm9pZCogYXJnKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiopYXJnOworICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qPihhcmcpOworCisjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKKyAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOworI2VuZGlmCisKKyAgdGhyZWFkLT5zZXRTdGF0ZShzdGFydGVkKTsKKworICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOworCisgIFNUQVRFIF9zID0gdGhyZWFkLT5nZXRTdGF0ZSgpOworICBpZiAoX3MgIT0gc3RvcHBpbmcgJiYgX3MgIT0gc3RvcHBlZCkgeworICAgIHRocmVhZC0+c2V0U3RhdGUoc3RvcHBpbmcpOworICB9CisKKyAgcmV0dXJuICh2b2lkKikwOworfQorCisvKioKKyAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKKyAqIEFQSSB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbnQgdG9QdGhyZWFkUG9saWN5KFBvc2l4VGhyZWFkRmFjdG9yeTo6UE9MSUNZIHBvbGljeSkgeworICBzd2l0Y2ggKHBvbGljeSkgeworICBjYXNlIFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI6CisgICAgcmV0dXJuIFNDSEVEX09USEVSOworICBjYXNlIFBvc2l4VGhyZWFkRmFjdG9yeTo6RklGTzoKKyAgICByZXR1cm4gU0NIRURfRklGTzsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6OlJPVU5EX1JPQklOOgorICAgIHJldHVybiBTQ0hFRF9SUjsKKyAgfQorICByZXR1cm4gU0NIRURfT1RIRVI7Cit9CisKKy8qKgorICogQ29udmVydHMgcmVsYXRpdmUgdGhyZWFkIHByaW9yaXRpZXMgdG8gYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gcG9zaXgKKyAqIHRocmVhZCBzY2hlZHVsZXIgcG9saWN5CisgKgorICogIFRoZSBpZGVhIGlzIHNpbXBseSB0byBkaXZpZGUgdXAgdGhlIHByaW9yaXR5IHJhbmdlIGZvciB0aGUgZ2l2ZW4gcG9saWN5CisgKiBpbnRvIHRoZSBjb3JyZXBzb25kaW5nIHJlbGF0aXZlIHByaW9yaXR5IGxldmVsIChsb3dlc3QuLmhpZ2hlc3QpIGFuZAorICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KKyAqLworc3RhdGljIGludCB0b1B0aHJlYWRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3ksIFBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgcHJpb3JpdHkpIHsKKyAgaW50IHB0aHJlYWRfcG9saWN5ID0gdG9QdGhyZWFkUG9saWN5KHBvbGljeSk7CisgIGludCBtaW5fcHJpb3JpdHkgPSAwOworICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKKyNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4KKyAgbWluX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwdGhyZWFkX3BvbGljeSk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVgKKyAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwdGhyZWFkX3BvbGljeSk7CisjZW5kaWYKKyAgaW50IHF1YW50YSA9IChQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QgLSBQb3NpeFRocmVhZEZhY3Rvcnk6OkxPV0VTVCkgKyAxOworICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChmbG9hdCkobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKKworICBpZiAocHJpb3JpdHkgPD0gUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKSB7CisgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogcHJpb3JpdHkpOworICB9IGVsc2UgeworICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSBmb3IgcHJpb3JpdHkgaW5jcmVtZW50cy4KKyAgICBhc3NlcnQoZmFsc2UpOworICAgIHJldHVybiAoaW50KShtaW5fcHJpb3JpdHkgKyBzdGVwc3BlcnF1YW50YSAqIFBvc2l4VGhyZWFkRmFjdG9yeTo6Tk9STUFMKTsKKyAgfQorfQorCitQb3NpeFRocmVhZEZhY3Rvcnk6OlBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFkgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKKyAgICBwb2xpY3lfKHBvbGljeSksCisgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKKyAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSkgeworfQorCitQb3NpeFRocmVhZEZhY3Rvcnk6OlBvc2l4VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKQorICA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpLAorICAgIHBvbGljeV8oUk9VTkRfUk9CSU4pLAorICAgIHByaW9yaXR5XyhOT1JNQUwpLAorICAgIHN0YWNrU2l6ZV8oMSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBQb3NpeFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiByZXN1bHQKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KG5ldyBQdGhyZWFkVGhyZWFkKHRvUHRocmVhZFBvbGljeShwb2xpY3lfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1B0aHJlYWRQcmlvcml0eShwb2xpY3lfLCBwcmlvcml0eV8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXRhY2hlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlKSk7CisgIHJlc3VsdC0+d2Vha1JlZihyZXN1bHQpOworICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFN0YWNrU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YWNrU2l6ZV87Cit9CisKK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7CisgIHN0YWNrU2l6ZV8gPSB2YWx1ZTsKK30KKworUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFByaW9yaXR5KCkgY29uc3QgeworICByZXR1cm4gcHJpb3JpdHlfOworfQorCit2b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0UHJpb3JpdHkoUFJJT1JJVFkgdmFsdWUpIHsKKyAgcHJpb3JpdHlfID0gdmFsdWU7Cit9CisKK1RocmVhZDo6aWRfdCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKKyNpZm5kZWYgX1dJTjMyCisgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpOworI2Vsc2UKKyAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCkucDsKKyNlbmRpZiAvLyBfV0lOMzIKK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNiMTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBBIHRocmVhZCBmYWN0b3J5IHRvIGNyZWF0ZSBwb3NpeCB0aHJlYWRzCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgUG9zaXhUaHJlYWRGYWN0b3J5IDogcHVibGljIFRocmVhZEZhY3RvcnkgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBQT1NJWCBUaHJlYWQgc2NoZWR1bGVyIHBvbGljaWVzCisgICAqLworICBlbnVtIFBPTElDWSB7IE9USEVSLCBGSUZPLCBST1VORF9ST0JJTiB9OworCisgIC8qKgorICAgKiBQT1NJWCBUaHJlYWQgc2NoZWR1bGVyIHJlbGF0aXZlIHByaW9yaXRpZXMsCisgICAqCisgICAqIEFic29sdXRlIHByaW9yaXR5IGlzIGRldGVybWluZWQgYnkgc2NoZWR1bGVyIHBvbGljeSBhbmQgT1MuIFRoaXMKKyAgICogZW51bWVyYXRpb24gc3BlY2lmaWVzIHJlbGF0aXZlIHByaW9yaXRpZXMgc3VjaCB0aGF0IG9uZSBjYW4gc3BlY2lmeSBhCisgICAqIHByaW9yaXR5IHdpdGhpbiBhIGdpdmluZyBzY2hlZHVsZXIgcG9saWN5IHdpdGhvdXQga25vd2luZyB0aGUgYWJzb2x1dGUKKyAgICogdmFsdWUgb2YgdGhlIHByaW9yaXR5LgorICAgKi8KKyAgZW51bSBQUklPUklUWSB7CisgICAgTE9XRVNUID0gMCwKKyAgICBMT1dFUiA9IDEsCisgICAgTE9XID0gMiwKKyAgICBOT1JNQUwgPSAzLAorICAgIEhJR0ggPSA0LAorICAgIEhJR0hFUiA9IDUsCisgICAgSElHSEVTVCA9IDYsCisgICAgSU5DUkVNRU5UID0gNywKKyAgICBERUNSRU1FTlQgPSA4CisgIH07CisKKyAgLyoqCisgICAqIFBvc2l4IHRocmVhZCAocHRocmVhZCkgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAorICAgKiB2aWEgc3RkOjpzaGFyZWRfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kIHRoZSBSdW5uYWJsZSB0YXNrcyAKKyAgICogdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UgdG8gYm90aCBpcworICAgKiBnaXZlbiB1cC4KKyAgICoKKyAgICogVGhyZWFkcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9saWN5LCBwcmlvcml0eSwgc3RhY2stc2l6ZSBhbmQgZGV0YWNoYWJsZS1tb2RlCisgICAqIGRldGFjaGVkIG1lYW5zIHRoZSB0aHJlYWQgaXMgZnJlZS1ydW5uaW5nIGFuZCB3aWxsIHJlbGVhc2UgYWxsIHN5c3RlbSByZXNvdXJjZXMgdGhlCisgICAqIHdoZW4gaXQgY29tcGxldGVzLiAgQSBkZXRhY2hhYmxlIHRocmVhZCBpcyBub3Qgam9pbmFibGUuICBUaGUgam9pbiBtZXRob2QKKyAgICogb2YgYSBkZXRhY2hhYmxlIHRocmVhZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIG5vIGVycm9yLgorICAgKgorICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KKyAgICovCisgIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5ID0gUk9VTkRfUk9CSU4sCisgICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSA9IE5PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCA9IHRydWUpOworCisgIC8qKgorICAgKiBQcm92aWRlIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBvdGhlciBmYWN0b3JpZXMKKyAgICogVGhlIGRlZmF1bHQgcG9saWN5IGlzIFBPTElDWTo6Uk9VTkRfUk9CSU4uCisgICAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIFBSSU9SSVRZOjpOT1JNQUwuCisgICAqIFRoZSBkZWZhdWx0IHN0YWNrU2l6ZSBpcyAxLgorICAgKi8KKyAgUG9zaXhUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpOworCisgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworCisgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKKyAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXRzIHN0YWNrIHNpemUgZm9yIG5ld2x5IGNyZWF0ZWQgdGhyZWFkcworICAgKgorICAgKiBAcmV0dXJuIGludCBzaXplIGluIG1lZ2FieXRlcworICAgKi8KKyAgdmlydHVhbCBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFNldHMgc3RhY2sgc2l6ZSBmb3IgbmV3bHkgY3JlYXRlZCB0aHJlYWRzCisgICAqCisgICAqIEBwYXJhbSB2YWx1ZSBzaXplIGluIG1lZ2FieXRlcworICAgKi8KKyAgdmlydHVhbCB2b2lkIHNldFN0YWNrU2l6ZShpbnQgdmFsdWUpOworCisgIC8qKgorICAgKiBHZXRzIHByaW9yaXR5IHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9saWN5CisgICAqLworICB2aXJ0dWFsIFBSSU9SSVRZIGdldFByaW9yaXR5KCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFNldHMgcHJpb3JpdHkgcmVsYXRpdmUgdG8gY3VycmVudCBwb2xpY3kKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSBwcmlvcml0eSk7CisKK3ByaXZhdGU6CisgIFBPTElDWSBwb2xpY3lfOworICBQUklPUklUWSBwcmlvcml0eV87CisgIGludCBzdGFja1NpemVfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzYjIwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIHN0ZCB0aHJlYWQgbGlicmFyeQorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE1vbml0b3I6OkltcGwgeworCitwdWJsaWM6CisgIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQob3duZWRNdXRleF8uZ2V0KCkpOyB9CisKKyAgSW1wbChNdXRleCogbXV0ZXgpIDogb3duZWRNdXRleF8oKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQobXV0ZXgpOyB9CisKKyAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG93bmVkTXV0ZXhfKCksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8oTlVMTCkgeworICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7CisgIH0KKworICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9CisgIHZvaWQgbG9jaygpIHsgbXV0ZXhfLT5sb2NrKCk7IH0KKyAgdm9pZCB1bmxvY2soKSB7IG11dGV4Xy0+dW5sb2NrKCk7IH0KKworICAvKioKKyAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5CisgICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KKyAgICoKKyAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgorICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKi8KKyAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgeworICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOworICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgeworICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJNb25pdG9yOjp3YWl0KCkgZmFpbGVkIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KKyAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgorICAgKgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSB7CisgICAgaWYgKHRpbWVvdXRfbXMgPT0gMExMKSB7CisgICAgICByZXR1cm4gd2FpdEZvcmV2ZXIoKTsKKyAgICB9CisKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOworICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgICAgICA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgcmV0dXJuICh0aW1lZG91dCA/IFRIUklGVF9FVElNRURPVVQgOiAwKTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0ZW1wOworICAgIHRlbXAudHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjKTsKKyAgICB0ZW1wLnR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9uc2VjKSAvIDEwMDA7CisgICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIHsKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnR0aW1lOworICAgIFV0aWw6OnRvVGltZXZhbChjdXJyZW50dGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisKKyAgICBsb25nIHR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyAtIGN1cnJlbnR0aW1lLnR2X3NlYyk7CisgICAgbG9uZyB0dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfdXNlYyAtIGN1cnJlbnR0aW1lLnR2X3VzZWMpOworICAgIGlmICh0dl9zZWMgPCAwKQorICAgICAgdHZfc2VjID0gMDsKKyAgICBpZiAodHZfdXNlYyA8IDApCisgICAgICB0dl91c2VjID0gMDsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOworICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHModHZfc2VjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyh0dl91c2VjKSkKKyAgICAgICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKKyAgICBsb2NrLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gKHRpbWVkb3V0ID8gVEhSSUZUX0VUSU1FRE9VVCA6IDApOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICovCisgIGludCB3YWl0Rm9yZXZlcigpIHsKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOworICAgIGNvbmRpdGlvblZhcmlhYmxlXy53YWl0KGxvY2spOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgdm9pZCBub3RpZnkoKSB7IGNvbmRpdGlvblZhcmlhYmxlXy5ub3RpZnlfb25lKCk7IH0KKworICB2b2lkIG5vdGlmeUFsbCgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9hbGwoKTsgfQorCitwcml2YXRlOgorICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7IG11dGV4XyA9IG11dGV4OyB9CisKKyAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvblZhcmlhYmxlXzsKKyAgTXV0ZXgqIG11dGV4XzsKK307CisKK01vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7Cit9CisKK01vbml0b3I6On5Nb25pdG9yKCkgeworICBkZWxldGUgaW1wbF87Cit9CisKK011dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bXV0ZXgoKTsKK30KKwordm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPmxvY2soKTsKK30KKwordm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0KHRpbWVvdXQpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yZXZlcigpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvcmV2ZXIoKTsKK30KKwordm9pZCBNb25pdG9yOjpub3RpZnkoKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5KCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeUFsbCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjc5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIEMrKzExIHN0ZDo6dGltZWRfbXV0ZXgKKyAqCisgKiBNZXRob2RzIHRocm93IHN0ZDo6c3lzdGVtX2Vycm9yIG9uIGVycm9yLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE11dGV4OjppbXBsIDogcHVibGljIHN0ZDo6dGltZWRfbXV0ZXgge307CisKK011dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbCgpKSB7CisgICgodm9pZClpbml0KTsKK30KKwordm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8uZ2V0KCk7Cit9CisKK3ZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7CisgIGltcGxfLT5sb2NrKCk7Cit9CisKK2Jvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsKK30KKworYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlfbG9ja19mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhtcykpOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KKwordm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgKCh2b2lkKWFyZyk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODVmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZiBVU0VfU1REX1RIUkVBRAorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVGhlIEMrKzExIHRocmVhZCBjbGFzcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgdXNlIGJvb3N0IHNoYXJlZF9wdHIgcmF0aGVyIHRoYW4gc3RkIHNoYXJlZF9wdHJzIGhlcmUKKyAqIGJlY2F1c2UgdGhlIFRocmVhZC9SdW5uYWJsZSBjbGFzc2VzIHVzZSB0aG9zZSBhbmQgd2UgZG9uJ3Qgd2FudCB0bworICogbWl4IHRoZW0uCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgU3RkVGhyZWFkIDogcHVibGljIFRocmVhZCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RkVGhyZWFkPiB7CitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyB1bmluaXRpYWxpemVkLCBzdGFydGluZywgc3RhcnRlZCwgc3RvcHBpbmcsIHN0b3BwZWQgfTsKKworICBzdGF0aWMgdm9pZCB0aHJlYWRNYWluKHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4gdGhyZWFkXzsKKyAgTW9uaXRvciBtb25pdG9yXzsKKyAgU1RBVEUgc3RhdGVfOworICBib29sIGRldGFjaGVkXzsKKworcHVibGljOgorICBTdGRUaHJlYWQoYm9vbCBkZXRhY2hlZCwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKKyAgICA6IHN0YXRlXyh1bmluaXRpYWxpemVkKSwgZGV0YWNoZWRfKGRldGFjaGVkKSB7CisgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7CisgIH0KKworICB+U3RkVGhyZWFkKCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIHRocmVhZF8tPmpvaW5hYmxlKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGpvaW4oKTsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCisgICAgICB9CisgICAgfQorICB9CisKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc3RhcnQoKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHNlbGZSZWYgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgc2V0U3RhdGUoc3RhcnRpbmcpOworCisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHRocmVhZF8gPSBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp0aHJlYWQ+KG5ldyBzdGQ6OnRocmVhZCh0aHJlYWRNYWluLCBzZWxmUmVmKSk7CisKKyAgICBpZiAoZGV0YWNoZWRfKQorICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7CisgICAgCisgICAgLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydCBhbmQgZ2V0IGZhciBlbm91Z2ggdG8gZ3JhYiBldmVyeXRoaW5nCisgICAgLy8gdGhhdCBpdCBuZWVkcyBmcm9tIHRoZSBjYWxsaW5nIGNvbnRleHQsIHRodXMgYWJzb2x2aW5nIHRoZSBjYWxsZXIKKyAgICAvLyBmcm9tIGJlaW5nIHJlcXVpcmVkIHRvIGhvbGQgb24gdG8gcnVubmFibGUgaW5kZWZpbml0ZWx5LgorICAgIG1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIHZvaWQgam9pbigpIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgeworICAgICAgdGhyZWFkXy0+am9pbigpOworICAgIH0KKyAgfQorCisgIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IHN0ZDo6dGhyZWFkOjppZCgpOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQorCisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQorfTsKKwordm9pZCBTdGRUaHJlYWQ6OnRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKSB7CisjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKKyAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOworI2VuZGlmCisKKyAgdGhyZWFkLT5zZXRTdGF0ZShzdGFydGVkKTsKKyAgdGhyZWFkLT5ydW5uYWJsZSgpLT5ydW4oKTsKKworICBpZiAodGhyZWFkLT5nZXRTdGF0ZSgpICE9IHN0b3BwaW5nICYmIHRocmVhZC0+Z2V0U3RhdGUoKSAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CisgIH0KK30KKworU3RkVGhyZWFkRmFjdG9yeTo6U3RkVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKSA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gU3RkVGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gcmVzdWx0ID0gc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4obmV3IFN0ZFRocmVhZChpc0RldGFjaGVkKCksIHJ1bm5hYmxlKSk7CisgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVGhyZWFkOjppZF90IFN0ZFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vIFVTRV9TVERfVEhSRUFECmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQwNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfU1REVEhSRUFERkFDVE9SWV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHN0ZDo6dGhyZWFkcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBTdGRUaHJlYWRGYWN0b3J5IDogcHVibGljIFRocmVhZEZhY3RvcnkgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBTdGQgdGhyZWFkIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKKyAgICogdmlhIHN0ZDo6c2hhcmVkX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZCB0aGUgUnVubmFibGUgdGFza3MKKyAgICogdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKKyAgICogdG8gYm90aCBpcyBnaXZlbiB1cC4KKyAgICoKKyAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCisgICAqLworCisgIFN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCA9IHRydWUpOworCisgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworCisgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKKyAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OworfTsKKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlYTRlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfIDEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZiBVU0VfU1REX1RIUkVBRAorI2luY2x1ZGUgPHRocmVhZD4KKyNlbHNlCisjaWZkZWYgSEFWRV9QVEhSRUFEX0gKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworY2xhc3MgVGhyZWFkOworCisvKioKKyAqIE1pbmltYWwgcnVubmFibGUgY2xhc3MuICBNb3JlIG9yIGxlc3MgYW5hbG9nb3VzIHRvIGphdmEubGFuZy5SdW5uYWJsZS4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBSdW5uYWJsZSB7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+UnVubmFibGUoKXt9OworICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSB0aHJlYWQgb2JqZWN0IHRoYXQgaXMgaG9zdGluZyB0aGlzIHJ1bm5hYmxlIG9iamVjdCAgLSBjYW4gcmV0dXJuCisgICAqIGFuIGVtcHR5IGJvb3N0OjpzaGFyZWQgcG9pbnRlciBpZiBubyByZWZlcmVuY2VzIHJlbWFpbiBvbiB0aGF0IHRocmVhZCBvYmplY3QKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKCkgeyByZXR1cm4gdGhyZWFkXy5sb2NrKCk7IH0KKworICAvKioKKyAgICogU2V0cyB0aGUgdGhyZWFkIHRoYXQgaXMgZXhlY3V0aW5nIHRoaXMgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IG1lYW50IGZvcgorICAgKiB1c2UgYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCB0aHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdmFsdWUpIHsgdGhyZWFkXyA9IHZhbHVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6d2Vha19wdHI8VGhyZWFkPiB0aHJlYWRfOworfTsKKworLyoqCisgKiBNaW5pbWFsIHRocmVhZCBjbGFzcy4gUmV0dXJuZWQgYnkgdGhyZWFkIGZhY3RvcnkgYm91bmQgdG8gYSBSdW5uYWJsZSBvYmplY3QKKyAqIGFuZCByZWFkeSB0byBzdGFydCBleGVjdXRpb24uICBNb3JlIG9yIGxlc3MgYW5hbG9nb3VzIHRvIGphdmEubGFuZy5UaHJlYWQKKyAqIChtaW51cyBhbGwgdGhlIHRocmVhZCBncm91cCwgcHJpb3JpdHksIG1vZGUgYW5kIG90aGVyIGJhZ2dhZ2UsIHNpbmNlIHRoYXQKKyAqIGlzIGRpZmZpY3VsdCB0byBhYnN0cmFjdCBhY3Jvc3MgcGxhdGZvcm1zIGFuZCBpcyBsZWZ0IGZvciBwbGF0Zm9ybS1zcGVjaWZpYworICogVGhyZWFkRmFjdG9yeSBpbXBsZW10YXRpb25zIHRvIGRlYWwgd2l0aAorICoKKyAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5KQorICovCitjbGFzcyBUaHJlYWQgeworCitwdWJsaWM6CisjaWYgVVNFX1NURF9USFJFQUQKKyAgdHlwZWRlZiBzdGQ6OnRocmVhZDo6aWQgaWRfdDsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3VycmVudChpZF90IHQpIHsgcmV0dXJuIHQgPT0gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KKyAgc3RhdGljIGlubGluZSBpZF90IGdldF9jdXJyZW50KCkgeyByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KKyNlbHNlCisgIHR5cGVkZWYgcHRocmVhZF90IGlkX3Q7CisKKyAgc3RhdGljIGlubGluZSBib29sIGlzX2N1cnJlbnQoaWRfdCB0KSB7IHJldHVybiBwdGhyZWFkX2VxdWFsKHB0aHJlYWRfc2VsZigpLCB0KTsgfQorICBzdGF0aWMgaW5saW5lIGlkX3QgZ2V0X2N1cnJlbnQoKSB7IHJldHVybiBwdGhyZWFkX3NlbGYoKTsgfQorI2VuZGlmCisKKyAgdmlydHVhbCB+VGhyZWFkKCl7fTsKKworICAvKioKKyAgICogU3RhcnRzIHRoZSB0aHJlYWQuIERvZXMgcGxhdGZvcm0gc3BlY2lmaWMgdGhyZWFkIGNyZWF0aW9uIGFuZAorICAgKiBjb25maWd1cmF0aW9uIHRoZW4gaW52b2tlcyB0aGUgcnVuIG1ldGhvZCBvZiB0aGUgUnVubmFibGUgb2JqZWN0IGJvdW5kCisgICAqIHRvIHRoaXMgdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOworCisgIC8qKgorICAgKiBKb2luIHRoaXMgdGhyZWFkLiBJZiB0aGlzIHRocmVhZCBpcyBqb2luYWJsZSwgdGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcworICAgKiB1bnRpbCB0aGlzIHRocmVhZCBjb21wbGV0ZXMuICBJZiB0aGUgdGFyZ2V0IHRocmVhZCBpcyBub3Qgam9pbmFibGUsIHRoZW4KKyAgICogbm90aGluZyBoYXBwZW5zLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIHRocmVhZCdzIHBsYXRmb3JtLXNwZWNpZmljIElECisgICAqLworICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIHJ1bm5hYmxlIG9iamVjdCB0aGlzIHRocmVhZCBpcyBob3N0aW5nCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBfcnVubmFibGU7IH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBfcnVubmFibGUgPSB2YWx1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IF9ydW5uYWJsZTsKK307CisKKy8qKgorICogRmFjdG9yeSB0byBjcmVhdGUgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkIG9iamVjdCBhbmQgYmluZCB0aGVtIHRvIFJ1bm5hYmxlCisgKiBvYmplY3QgZm9yIGV4ZWN1dGlvbgorICovCitjbGFzcyBUaHJlYWRGYWN0b3J5IHsKK3Byb3RlY3RlZDoKKyAgVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKSA6IGRldGFjaGVkXyhkZXRhY2hlZCkgeyB9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+VGhyZWFkRmFjdG9yeSgpIHsgfQorCisgIC8qKgorICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQorICAgKi8KKyAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gZGV0YWNoZWRfOyB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGRldGFjaGVkIGRpc3Bvc2l0aW9uIG9mIG5ld2x5IGNyZWF0ZWQgdGhyZWFkcy4KKyAgICovCisgIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCkgeyBkZXRhY2hlZF8gPSBkZXRhY2hlZDsgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZAorICAgKi8KKyAgdmlydHVhbCBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBGb3IgY29kZSByZWFkYWJpbGl0eSBkZWZpbmUgdGhlIHVua25vd24vdW5kZWZpbmVkIHRocmVhZCBpZAorICAgKi8KKyAgc3RhdGljIGNvbnN0IFRocmVhZDo6aWRfdCB1bmtub3duX3RocmVhZF9pZDsKKworcHJpdmF0ZToKKyAgYm9vbCBkZXRhY2hlZF87Cit9OworCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDI1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKKworLyoqCisgKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCisgKgorICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKKyAqIHRocmVhZHMuICBJdCBuZXZlciBhY3R1YWxseSBjcmVhdGVzIG9yIGRlc3Ryb3lzIHdvcmtlciB0aHJlYWRzLCByYXRoZXIKKyAqIGl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKKyAqIHRhc2sgYmFja2xvZywgYW5kIGF2ZXJhZ2Ugd2FpdCBhbmQgc2VydmljZSB0aW1lcy4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IG1vbml0b3JzIHVzZWQgZm9yIHNpZ25hbGluZyBkaWZmZXJlbnQgY29uZGl0aW9ucworICogaG93ZXZlciB0aGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBtdXRleF8uCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbCA6IHB1YmxpYyBUaHJlYWRNYW5hZ2VyIHsKKworcHVibGljOgorICBJbXBsKCkKKyAgICA6IHdvcmtlckNvdW50XygwKSwKKyAgICAgIHdvcmtlck1heENvdW50XygwKSwKKyAgICAgIGlkbGVDb3VudF8oMCksCisgICAgICBwZW5kaW5nVGFza0NvdW50TWF4XygwKSwKKyAgICAgIGV4cGlyZWRDb3VudF8oMCksCisgICAgICBzdGF0ZV8oVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCisgICAgICBtb25pdG9yXygmbXV0ZXhfKSwKKyAgICAgIG1heE1vbml0b3JfKCZtdXRleF8pLAorICAgICAgd29ya2VyTW9uaXRvcl8oJm11dGV4Xykge30KKworICB+SW1wbCgpIHsgc3RvcCgpOyB9CisKKyAgdm9pZCBzdGFydCgpOworICB2b2lkIHN0b3AoKTsKKworICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQorCisgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOworICB9CisKKyAgdm9pZCB0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgaWYgKHRocmVhZEZhY3RvcnlfICYmIHRocmVhZEZhY3RvcnlfLT5pc0RldGFjaGVkKCkgIT0gdmFsdWUtPmlzRGV0YWNoZWQoKSkgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7CisgIH0KKworICB2b2lkIGFkZFdvcmtlcihzaXplX3QgdmFsdWUpOworCisgIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSk7CisKKyAgc2l6ZV90IGlkbGVXb3JrZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVDb3VudF87IH0KKworICBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiB3b3JrZXJDb3VudF87CisgIH0KKworICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHRhc2tzXy5zaXplKCk7CisgIH0KKworICBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiB0YXNrc18uc2l6ZSgpICsgd29ya2VyQ291bnRfIC0gaWRsZUNvdW50XzsKKyAgfQorCisgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gcGVuZGluZ1Rhc2tDb3VudE1heF87CisgIH0KKworICBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIGV4cGlyZWRDb3VudF87CisgIH0KKworICB2b2lkIHBlbmRpbmdUYXNrQ291bnRNYXgoY29uc3Qgc2l6ZV90IHZhbHVlKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfID0gdmFsdWU7CisgIH0KKworICB2b2lkIGFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0LCBpbnQ2NF90IGV4cGlyYXRpb24pOworCisgIHZvaWQgcmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworCisgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCk7CisKKyAgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKSB7CisgICAgcmVtb3ZlRXhwaXJlZChmYWxzZSk7CisgIH0KKworICB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIFJlbW92ZSBvbmUgb3IgbW9yZSBleHBpcmVkIHRhc2tzLgorICAgKiBccGFyYW1baW5dICBqdXN0T25lICBpZiB0cnVlLCB0cnkgdG8gcmVtb3ZlIGp1c3Qgb25lIHRhc2sgYW5kIHJldHVybgorICAgKi8KKyAgdm9pZCByZW1vdmVFeHBpcmVkKGJvb2wganVzdE9uZSk7CisKKyAgLyoqCisgICAqIFxyZXR1cm5zIHdoZXRoZXIgaXQgaXMgYWNjZXB0YWJsZSB0byBibG9jaywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRocmVhZCBpZAorICAgKi8KKyAgYm9vbCBjYW5TbGVlcCgpIGNvbnN0OworCisgIC8qKgorICAgKiBMb3dlcnMgdGhlIG1heGltdW0gd29ya2VyIGNvdW50IGFuZCBibG9ja3MgdW50aWwgZW5vdWdoIHdvcmtlciB0aHJlYWRzIGNvbXBsZXRlCisgICAqIHRvIGdldCB0byB0aGUgbmV3IG1heGltdW0gd29ya2VyIGxpbWl0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWNxdWlyaW5nCisgICAqIGEgbG9jayBvbiB0aGUgY2xhc3MgbXV0ZXhfLgorICAgKi8KKyAgdm9pZCByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHNpemVfdCB2YWx1ZSk7CisKKyAgc2l6ZV90IHdvcmtlckNvdW50XzsKKyAgc2l6ZV90IHdvcmtlck1heENvdW50XzsKKyAgc2l6ZV90IGlkbGVDb3VudF87CisgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4XzsKKyAgc2l6ZV90IGV4cGlyZWRDb3VudF87CisgIEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrXzsKKworICBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZV87CisgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CisKKyAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2s7CisgIHR5cGVkZWYgc3RkOjpkZXF1ZTxzaGFyZWRfcHRyPFRhc2s+ID4gVGFza1F1ZXVlOworICBUYXNrUXVldWUgdGFza3NfOworICBNdXRleCBtdXRleF87CisgIE1vbml0b3IgbW9uaXRvcl87CisgIE1vbml0b3IgbWF4TW9uaXRvcl87CisgIE1vbml0b3Igd29ya2VyTW9uaXRvcl87ICAgICAgIC8vIHVzZWQgdG8gc3luY2hyb25pemUgY2hhbmdlcyBpbiB3b3JrZXIgY291bnQKKworICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOworICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB3b3JrZXJzXzsKKyAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gZGVhZFdvcmtlcnNfOworICBzdGQ6Om1hcDxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+IGlkTWFwXzsKK307CisKK2NsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyBXQUlUSU5HLCBFWEVDVVRJTkcsIFRJTUVET1VULCBDT01QTEVURSB9OworCisgIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUsIGludDY0X3QgZXhwaXJhdGlvbiA9IDBMTCkKKyAgICA6IHJ1bm5hYmxlXyhydW5uYWJsZSksCisgICAgICBzdGF0ZV8oV0FJVElORyksCisgICAgICBleHBpcmVUaW1lXyhleHBpcmF0aW9uICE9IDBMTCA/IFV0aWw6OmN1cnJlbnRUaW1lKCkgKyBleHBpcmF0aW9uIDogMExMKSB7fQorCisgIH5UYXNrKCkge30KKworICB2b2lkIHJ1bigpIHsKKyAgICBpZiAoc3RhdGVfID09IEVYRUNVVElORykgeworICAgICAgcnVubmFibGVfLT5ydW4oKTsKKyAgICAgIHN0YXRlXyA9IENPTVBMRVRFOworICAgIH0KKyAgfQorCisgIHNoYXJlZF9wdHI8UnVubmFibGU+IGdldFJ1bm5hYmxlKCkgeyByZXR1cm4gcnVubmFibGVfOyB9CisKKyAgaW50NjRfdCBnZXRFeHBpcmVUaW1lKCkgY29uc3QgeyByZXR1cm4gZXhwaXJlVGltZV87IH0KKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOworICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOworICBTVEFURSBzdGF0ZV87CisgIGludDY0X3QgZXhwaXJlVGltZV87Cit9OworCitjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIgOiBwdWJsaWMgUnVubmFibGUgeworICBlbnVtIFNUQVRFIHsgVU5JTklUSUFMSVpFRCwgU1RBUlRJTkcsIFNUQVJURUQsIFNUT1BQSU5HLCBTVE9QUEVEIH07CisKK3B1YmxpYzoKKyAgV29ya2VyKFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXIpIDogbWFuYWdlcl8obWFuYWdlciksIHN0YXRlXyhVTklOSVRJQUxJWkVEKSB7fQorCisgIH5Xb3JrZXIoKSB7fQorCitwcml2YXRlOgorICBib29sIGlzQWN0aXZlKCkgY29uc3QgeworICAgIHJldHVybiAobWFuYWdlcl8tPndvcmtlckNvdW50XyA8PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKQorICAgICAgICAgICB8fCAobWFuYWdlcl8tPnN0YXRlXyA9PSBKT0lOSU5HICYmICFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpOworICB9CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdvcmtlciBlbnRyeSBwb2ludAorICAgKgorICAgKiBBcyBsb25nIGFzIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZywgcHVsbCB0YXNrcyBvZmYgdGhlIHRhc2sgcXVldWUgYW5kCisgICAqIGV4ZWN1dGUuCisgICAqLworICB2b2lkIHJ1bigpIHsKKyAgICBHdWFyZCBnKG1hbmFnZXJfLT5tdXRleF8pOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaGFzIHRocmVlIHBhcnRzOyBvbmUgaXMgdG8gY2hlY2sgZm9yIGFuZCBhY2NvdW50IGZvcgorICAgICAqIGFkbWl0dGluZyBhIHRhc2sgd2hpY2ggaGFwcGVucyB1bmRlciBhIGxvY2suICBUaGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkCisgICAgICogYW5kIHRoZSB0YXNrIGl0c2VsZiBpcyBleGVjdXRlZC4gIEZpbmFsbHkgd2UgZG8gc29tZSBhY2NvdW50aW5nCisgICAgICogdW5kZXIgbG9jayBhZ2FpbiB3aGVuIHRoZSB0YXNrIGNvbXBsZXRlcy4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEFkbWl0dGluZworICAgICAqLworCisgICAgLyoqCisgICAgICogSW5jcmVtZW50IHdvcmtlciBzZW1hcGhvcmUgYW5kIG5vdGlmeSBtYW5hZ2VyIGlmIHdvcmtlciBjb3VudCByZWFjaGVkCisgICAgICogZGVzaXJlZCBtYXgKKyAgICAgKi8KKyAgICBib29sIGFjdGl2ZSA9IG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPCBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgIGlmICgrK21hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgeworICAgICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKGFjdGl2ZSkgeworICAgICAgLyoqCisgICAgICAgICogV2hpbGUgaG9sZGluZyBtYW5hZ2VyIG1vbml0b3IgYmxvY2sgZm9yIG5vbi1lbXB0eSB0YXNrIHF1ZXVlIChBbHNvCisgICAgICAgICogY2hlY2sgdGhhdCB0aGUgdGhyZWFkIGhhc24ndCBiZWVuIHJlcXVlc3RlZCB0byBzdG9wKS4gT25jZSB0aGUgcXVldWUKKyAgICAgICAgKiBpcyBub24tZW1wdHksIGRlcXVldWUgYSB0YXNrLCByZWxlYXNlIG1vbml0b3IsIGFuZCBleGVjdXRlLiBJZiB0aGUKKyAgICAgICAgKiB3b3JrZXIgbWF4IGNvdW50IGhhcyBiZWVuIGRlY3JlbWVudGVkIHN1Y2ggdGhhdCB3ZSBleGNlZWQgaXQsIG1hcmsKKyAgICAgICAgKiBvdXJzZWxmIGluYWN0aXZlLCBkZWNyZW1lbnQgdGhlIHdvcmtlciBjb3VudCBhbmQgbm90aWZ5IHRoZSBtYW5hZ2VyCisgICAgICAgICogKHRlY2huaWNhbGx5IHdlJ3JlIG5vdGlmeWluZyB0aGUgbmV4dCBibG9ja2VkIHRocmVhZCBidXQgZXZlbnR1YWxseQorICAgICAgICAqIHRoZSBtYW5hZ2VyIHdpbGwgc2VlIGl0LgorICAgICAgICAqLworICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKKworICAgICAgd2hpbGUgKGFjdGl2ZSAmJiBtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKKyAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8rKzsKKyAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQoKTsKKyAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKKyAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8tLTsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrOworCisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7CisgICAgICAgICAgdGFzayA9IG1hbmFnZXJfLT50YXNrc18uZnJvbnQoKTsKKyAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnBvcF9mcm9udCgpOworICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6V0FJVElORykgeworICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXRlIGlzIGNoYW5nZWQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBFWEVDVVRJTkcgb3IgVElNRURPVVQgaGVyZQorICAgICAgICAgICAgLy8gdGhlbiB0aGUgZXhlY3V0aW9uIGxvb3AgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWxvdy4KKyAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9CisgICAgICAgICAgICAgICAgKHRhc2stPmdldEV4cGlyZVRpbWUoKSAmJiB0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPCBVdGlsOjpjdXJyZW50VGltZSgpKSA/CisgICAgICAgICAgICAgICAgICAgIFRocmVhZE1hbmFnZXI6OlRhc2s6OlRJTUVET1VUIDoKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGhhdmUgYSBwZW5kaW5nIHRhc2sgbWF4IGFuZCB3ZSBqdXN0IGRyb3BwZWQgYmVsb3cgaXQsIHdha2V1cCBhbnkKKyAgICAgICAgICAgIHRocmVhZCB0aGF0IG1pZ2h0IGJlIGJsb2NrZWQgb24gYWRkLiAqLworICAgICAgICBpZiAobWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfICE9IDAKKyAgICAgICAgICAgICYmIG1hbmFnZXJfLT50YXNrc18uc2l6ZSgpIDw9IG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAtIDEpIHsKKyAgICAgICAgICBtYW5hZ2VyXy0+bWF4TW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBFeGVjdXRpb24gLSBub3QgaG9sZGluZyBhIGxvY2sKKyAgICAgICAqLworICAgICAgaWYgKHRhc2spIHsKKyAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkcpIHsKKworICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGxvY2sgc28gd2UgY2FuIHJ1biB0aGUgdGFzayB3aXRob3V0IGJsb2NraW5nIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgICAgIG1hbmFnZXJfLT5tdXRleF8udW5sb2NrKCk7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFzay0+cnVuKCk7CisgICAgICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gdGFzay0+cnVuKCkgcmFpc2VkIGFuIGV4Y2VwdGlvbjogJXMiLCBlLndoYXQoKSk7CisgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIHRhc2stPnJ1bigpIHJhaXNlZCBhbiB1bmtub3duIGV4Y2VwdGlvbiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFJlLWFjcXVpcmUgdGhlIGxvY2sgdG8gcHJvY2VlZCBpbiB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgICAgICBtYW5hZ2VyXy0+bXV0ZXhfLmxvY2soKTsKKworICAgICAgICB9IGVsc2UgaWYgKG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgICAvLyBUaGUgb25seSBvdGhlciBzdGF0ZSB0aGUgdGFzayBjb3VsZCBoYXZlIGJlZW4gaW4gaXMgVElNRURPVVQgKHNlZSBhYm92ZSkKKyAgICAgICAgICBtYW5hZ2VyXy0+ZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOworICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVkQ291bnRfKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5hbCBhY2NvdW50aW5nIGZvciB0aGUgd29ya2VyIHRocmVhZCB0aGF0IGlzIGRvbmUgd29ya2luZworICAgICAqLworICAgIG1hbmFnZXJfLT5kZWFkV29ya2Vyc18uaW5zZXJ0KHRoaXMtPnRocmVhZCgpKTsKKyAgICBpZiAoLS1tYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHsKKyAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcl87CisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsOworICBTVEFURSBzdGF0ZV87Cit9OworCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcihzaXplX3QgdmFsdWUpIHsKKyAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gbmV3VGhyZWFkczsKKyAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHZhbHVlOyBpeCsrKSB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+IHdvcmtlcgorICAgICAgICA9IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPihuZXcgVGhyZWFkTWFuYWdlcjo6V29ya2VyKHRoaXMpKTsKKyAgICBuZXdUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHdvcmtlcikpOworICB9CisKKyAgR3VhcmQgZyhtdXRleF8pOworICB3b3JrZXJNYXhDb3VudF8gKz0gdmFsdWU7CisgIHdvcmtlcnNfLmluc2VydChuZXdUaHJlYWRzLmJlZ2luKCksIG5ld1RocmVhZHMuZW5kKCkpOworCisgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gbmV3VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBuZXdUaHJlYWRzLmVuZCgpOworICAgICAgICsraXgpIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyCisgICAgICAgID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8VGhyZWFkTWFuYWdlcjo6V29ya2VyLCBSdW5uYWJsZT4oKCppeCktPnJ1bm5hYmxlKCkpOworICAgIHdvcmtlci0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6V29ya2VyOjpTVEFSVElORzsKKyAgICAoKml4KS0+c3RhcnQoKTsKKyAgICBpZE1hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+KCgqaXgpLT5nZXRJZCgpLCAqaXgpKTsKKyAgfQorCisgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7CisgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOworICB9Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7CisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgIH0KKworICB3aGlsZSAoc3RhdGVfID09IFNUQVJUSU5HKSB7CisgICAgbW9uaXRvcl8ud2FpdCgpOworICB9Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RvcCgpIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBib29sIGRvU3RvcCA9IGZhbHNlOworCisgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkcgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcKKyAgICAgICYmIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7CisgICAgZG9TdG9wID0gdHJ1ZTsKKyAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpKT0lOSU5HOworICB9CisKKyAgaWYgKGRvU3RvcCkgeworICAgIHJlbW92ZVdvcmtlcnNVbmRlckxvY2sod29ya2VyQ291bnRfKTsKKyAgfQorCisgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQ7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSkgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIHJlbW92ZVdvcmtlcnNVbmRlckxvY2sodmFsdWUpOworfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcnNVbmRlckxvY2soc2l6ZV90IHZhbHVlKSB7CisgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgd29ya2VyTWF4Q291bnRfIC09IHZhbHVlOworCisgIGlmIChpZGxlQ291bnRfID4gdmFsdWUpIHsKKyAgICAvLyBUaGVyZSBhcmUgbW9yZSBpZGxlIHdvcmtlcnMgdGhhbiB3ZSBuZWVkIHRvIHJlbW92ZSwKKyAgICAvLyBzbyBub3RpZnkgZW5vdWdoIG9mIHRoZW0gc28gdGhleSBjYW4gdGVybWluYXRlLgorICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB2YWx1ZTsgaXgrKykgeworICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFRoZXJlIGFyZSBhcyBtYW55IG9yIGxlc3MgaWRsZSB3b3JrZXJzIHRoYW4gd2UgbmVlZCB0byByZW1vdmUsCisgICAgLy8gc28ganVzdCBub3RpZnkgdGhlbSBhbGwgc28gdGhleSBjYW4gdGVybWluYXRlLgorICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICB9CisKKyAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKKyAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7CisgIH0KKworICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGRlYWRXb3JrZXJzXy5iZWdpbigpOworICAgICAgIGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsKKyAgICAgICArK2l4KSB7CisKKyAgICAvLyB3aGVuIHVzZWQgd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5LCB3ZSBqb2luIHRoZSB0aHJlYWRzIGFzIHdlIHJlbW92ZSB0aGVtCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpKSB7CisgICAgICAoKml4KS0+am9pbigpOworICAgIH0KKworICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7CisgICAgd29ya2Vyc18uZXJhc2UoKml4KTsKKyAgfQorCisgIGRlYWRXb3JrZXJzXy5jbGVhcigpOworfQorCitib29sIFRocmVhZE1hbmFnZXI6OkltcGw6OmNhblNsZWVwKCkgY29uc3QgeworICBjb25zdCBUaHJlYWQ6OmlkX3QgaWQgPSB0aHJlYWRGYWN0b3J5Xy0+Z2V0Q3VycmVudFRocmVhZElkKCk7CisgIHJldHVybiBpZE1hcF8uZmluZChpZCkgPT0gaWRNYXBfLmVuZCgpOworfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0LCBpbnQ2NF90IGV4cGlyYXRpb24pIHsKKyAgR3VhcmQgZyhtdXRleF8sIHRpbWVvdXQpOworCisgIGlmICghZykgeworICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7CisgIH0KKworICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQgVGhyZWFkTWFuYWdlciAiCisgICAgICAgICJub3Qgc3RhcnRlZCIpOworICB9CisKKyAgLy8gaWYgd2UncmUgYXQgYSBsaW1pdCwgcmVtb3ZlIGFuIGV4cGlyZWQgdGFzayB0byBzZWUgaWYgdGhlIGxpbWl0IGNsZWFycworICBpZiAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmICh0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSkgeworICAgIHJlbW92ZUV4cGlyZWQodHJ1ZSk7CisgIH0KKworICBpZiAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmICh0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSkgeworICAgIGlmIChjYW5TbGVlcCgpICYmIHRpbWVvdXQgPj0gMCkgeworICAgICAgd2hpbGUgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiB0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSB7CisgICAgICAgIC8vIFRoaXMgaXMgdGhyZWFkIHNhZmUgYmVjYXVzZSB0aGUgbXV0ZXggaXMgc2hhcmVkIGJldHdlZW4gbW9uaXRvcnMuCisgICAgICAgIG1heE1vbml0b3JfLndhaXQodGltZW91dCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICB0YXNrc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4obmV3IFRocmVhZE1hbmFnZXI6OlRhc2sodmFsdWUsIGV4cGlyYXRpb24pKSk7CisKKyAgLy8gSWYgaWRsZSB0aHJlYWQgaXMgYXZhaWxhYmxlIG5vdGlmeSBpdCwgb3RoZXJ3aXNlIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUKKyAgLy8gcnVubmluZyBhbmQgd2lsbCBnZXQgYXJvdW5kIHRvIHRoaXMgdGFzayBpbiB0aW1lLgorICBpZiAoaWRsZUNvdW50XyA+IDApIHsKKyAgICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgfQorfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlIFRocmVhZE1hbmFnZXIgbm90ICIKKyAgICAgICAgInN0YXJ0ZWQiKTsKKyAgfQorCisgIGZvciAoVGFza1F1ZXVlOjppdGVyYXRvciBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICsraXQpCisgIHsKKyAgICBpZiAoKCppdCktPmdldFJ1bm5hYmxlKCkgPT0gdGFzaykKKyAgICB7CisgICAgICB0YXNrc18uZXJhc2UoaXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nKCkgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIlRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nICIKKyAgICAgICAgIlRocmVhZE1hbmFnZXIgbm90IHN0YXJ0ZWQiKTsKKyAgfQorCisgIGlmICh0YXNrc18uZW1wdHkoKSkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KCk7CisgIH0KKworICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2sgPSB0YXNrc18uZnJvbnQoKTsKKyAgdGFza3NfLnBvcF9mcm9udCgpOworCisgIHJldHVybiB0YXNrLT5nZXRSdW5uYWJsZSgpOworfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZUV4cGlyZWQoYm9vbCBqdXN0T25lKSB7CisgIC8vIHRoaXMgaXMgYWx3YXlzIGNhbGxlZCB1bmRlciBhIGxvY2sKKyAgaW50NjRfdCBub3cgPSAwTEw7CisKKyAgZm9yIChUYXNrUXVldWU6Oml0ZXJhdG9yIGl0ID0gdGFza3NfLmJlZ2luKCk7IGl0ICE9IHRhc2tzXy5lbmQoKTsgKQorICB7CisgICAgaWYgKG5vdyA9PSAwTEwpIHsKKyAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgfQorCisgICAgaWYgKCgqaXQpLT5nZXRFeHBpcmVUaW1lKCkgPiAwTEwgJiYgKCppdCktPmdldEV4cGlyZVRpbWUoKSA8IG5vdykgeworICAgICAgaWYgKGV4cGlyZUNhbGxiYWNrXykgeworICAgICAgICBleHBpcmVDYWxsYmFja18oKCppdCktPmdldFJ1bm5hYmxlKCkpOworICAgICAgfQorICAgICAgaXQgPSB0YXNrc18uZXJhc2UoaXQpOworICAgICAgKytleHBpcmVkQ291bnRfOworICAgICAgaWYgKGp1c3RPbmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgKytpdDsKKyAgICB9CisgIH0KK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGV4cGlyZUNhbGxiYWNrXyA9IGV4cGlyZUNhbGxiYWNrOworfQorCitjbGFzcyBTaW1wbGVUaHJlYWRNYW5hZ2VyIDogcHVibGljIFRocmVhZE1hbmFnZXI6OkltcGwgeworCitwdWJsaWM6CisgIFNpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IHdvcmtlckNvdW50ID0gNCwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXggPSAwKQorICAgIDogd29ya2VyQ291bnRfKHdvcmtlckNvdW50KSwgcGVuZGluZ1Rhc2tDb3VudE1heF8ocGVuZGluZ1Rhc2tDb3VudE1heCkge30KKworICB2b2lkIHN0YXJ0KCkgeworICAgIFRocmVhZE1hbmFnZXI6OkltcGw6OnBlbmRpbmdUYXNrQ291bnRNYXgocGVuZGluZ1Rhc2tDb3VudE1heF8pOworICAgIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0YXJ0KCk7CisgICAgYWRkV29ya2VyKHdvcmtlckNvdW50Xyk7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3Qgc2l6ZV90IHdvcmtlckNvdW50XzsKKyAgY29uc3Qgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOworfTsKKworc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdUaHJlYWRNYW5hZ2VyKCkgeworICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgVGhyZWFkTWFuYWdlcjo6SW1wbCgpKTsKK30KKworc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCkgeworICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgU2ltcGxlVGhyZWFkTWFuYWdlcihjb3VudCwgcGVuZGluZ1Rhc2tDb3VudE1heCkpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGZjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXyAxCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIFRocmVhZCBQb29sIE1hbmFnZXIgYW5kIHJlbGF0ZWQgY2xhc3NlcworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFRocmVhZE1hbmFnZXI7CisKKy8qKgorICogVGhyZWFkTWFuYWdlciBjbGFzcworICoKKyAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIHBvb2wgb2YgdGhyZWFkcy4gSXQgdXNlcyBhIFRocmVhZEZhY3RvcnkgdG8gY3JlYXRlCisgKiB0aHJlYWRzLiBJdCBuZXZlciBhY3R1YWxseSBjcmVhdGVzIG9yIGRlc3Ryb3lzIHdvcmtlciB0aHJlYWRzLCByYXRoZXIKKyAqIGl0IG1haW50YWlucyBzdGF0aXN0aWNzIG9uIG51bWJlciBvZiBpZGxlIHRocmVhZHMsIG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcywKKyAqIHRhc2sgYmFja2xvZywgYW5kIGF2ZXJhZ2Ugd2FpdCBhbmQgc2VydmljZSB0aW1lcyBhbmQgaW5mb3JtcyB0aGUgUG9vbFBvbGljeQorICogb2JqZWN0IGJvdW5kIHRvIGluc3RhbmNlcyBvZiB0aGlzIG1hbmFnZXIgb2YgaW50ZXJlc3RpbmcgdHJhbnNpdGlvbnMuIEl0IGlzCisgKiB0aGVuIHVwIHRoZSBQb29sUG9saWN5IG9iamVjdCB0byBkZWNpZGUgaWYgdGhlIHRocmVhZCBwb29sIHNpemUgbmVlZHMgdG8gYmUKKyAqIGFkanVzdGVkIGFuZCBjYWxsIHRoaXMgb2JqZWN0IGFkZFdvcmtlciBhbmQgcmVtb3ZlV29ya2VyIG1ldGhvZHMgdG8gbWFrZQorICogY2hhbmdlcy4KKyAqCisgKiBUaGlzIGRlc2lnbiBhbGxvd3MgZGlmZmVyZW50IHBvbGljeSBpbXBsZW1lbnRhdGlvbnMgdG8gdXNlIHRoaXMgY29kZSB0bworICogaGFuZGxlIGJhc2ljIHdvcmtlciB0aHJlYWQgbWFuYWdlbWVudCBhbmQgd29ya2VyIHRhc2sgZXhlY3V0aW9uIGFuZCBmb2N1cyBvbgorICogcG9saWN5IGlzc3Vlcy4gVGhlIHNpbXBsZXN0IHBvbGljeSwgU3RhdGljUG9saWN5LCBkb2VzIG5vdGhpbmcgb3RoZXIgdGhhbgorICogY3JlYXRlIGEgZml4ZWQgbnVtYmVyIG9mIHRocmVhZHMuCisgKi8KK2NsYXNzIFRocmVhZE1hbmFnZXIgeworCitwcm90ZWN0ZWQ6CisgIFRocmVhZE1hbmFnZXIoKSB7fQorCitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKKworICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KKworICAvKioKKyAgICogU3RhcnRzIHRoZSB0aHJlYWQgbWFuYWdlci4gVmVyaWZpZXMgYWxsIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHByb3Blcmx5CisgICAqIGluaXRpYWxpemVkLCB0aGVuIGFsbG9jYXRlcyBuZWNlc3NhcnkgcmVzb3VyY2VzIHRvIGJlZ2luIG9wZXJhdGlvbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOworCisgIC8qKgorICAgKiBTdG9wcyB0aGUgdGhyZWFkIG1hbmFnZXIuIEFib3J0cyBhbGwgcmVtYWluaW5nIHVucHJvY2Vzc2VkIHRhc2ssIHNodXRzCisgICAqIGRvd24gYWxsIGNyZWF0ZWQgd29ya2VyIHRocmVhZHMsIGFuZCByZWxlYXNlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAgICogVGhpcyBtZXRob2QgYmxvY2tzIGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gY29tcGxldGUsIHRodXMgaXQgY2FuCisgICAqIHBvdGVudGlhbGx5IGJsb2NrIGZvcmV2ZXIgaWYgYSB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcgYSB0YXNrIHRoYXQKKyAgICogd29uJ3QgdGVybWluYXRlLgorICAgKgorICAgKiBXb3JrZXIgdGhyZWFkcyB3aWxsIGJlIGpvaW5lZCBkZXBlbmRpbmcgb24gdGhlIHRocmVhZEZhY3RvcnkncyBkZXRhY2hlZAorICAgKiBkaXNwb3NpdGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOworCisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgSk9JTklORywgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworICB2aXJ0dWFsIFNUQVRFIHN0YXRlKCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBccmV0dXJucyB0aGUgY3VycmVudCB0aHJlYWQgZmFjdG9yeQorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogU2V0IHRoZSB0aHJlYWQgZmFjdG9yeS4KKyAgICogXHRocm93cyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5ldyB0aHJlYWQgZmFjdG9yeSBoYXMgYSBkaWZmZXJlbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoZWQgZGlzcG9zaXRpb24gdGhhbiB0aGUgb25lIHJlcGxhY2luZyBpdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSA9IDA7CisKKyAgLyoqCisgICAqIEFkZHMgd29ya2VyIHRocmVhZChzKS4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlID0gMSkgPSAwOworCisgIC8qKgorICAgKiBSZW1vdmVzIHdvcmtlciB0aHJlYWQocykuCisgICAqIFRocmVhZHMgYXJlIGpvaW5lZCBpZiB0aGUgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24gYWxsb3dzIGl0LgorICAgKiBCbG9ja3MgdW50aWwgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyByZWFjaGVzIHRoZSBuZXcgbGltaXQuCisgICAqIFxwYXJhbVtpbl0gIHZhbHVlICB0aGUgbnVtYmVyIHRvIHJlbW92ZQorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygd29ya2VycworICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUgPSAxKSA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGlkbGUgd29ya2VyIHRocmVhZHMKKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IGlkbGVXb3JrZXJDb3VudCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgdG90YWwgd29ya2VyIHRocmVhZHMKKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBwZW5kaW5nIHRhc2tzCisgICAqLworICB2aXJ0dWFsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBwZW5kaW5nIGFuZCBleGVjdXRpbmcgdGFza3MKKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBtYXhpbXVtIHBlbmRpbmcgdGFzayBjb3VudC4gIDAgaW5kaWNhdGVzIG5vIG1heGltdW0KKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG51bWJlciBvZiB0YXNrcyB3aGljaCBoYXZlIGJlZW4gZXhwaXJlZCB3aXRob3V0IGJlaW5nIHJ1bgorICAgKiBzaW5jZSBzdGFydCgpIHdhcyBjYWxsZWQuCisgICAqLworICB2aXJ0dWFsIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgPSAwOworCisgIC8qKgorICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCisgICAqCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgaWYgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGluIG5vdCB6ZXJvIGFuZCBwZW5kaW5nVGFza0NvdW50KCkKKyAgICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsdCB0byBwZW5kaW5nVGFza0NvdW50TWF4KCkuICBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gdGhlCisgICAqIGNvbnRleHQgb2YgYSBUaHJlYWRNYW5hZ2VyIHdvcmtlciB0aHJlYWQgaXQgd2lsbCB0aHJvdyBhCisgICAqIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24KKyAgICoKKyAgICogQHBhcmFtIHRhc2sgIFRoZSB0YXNrIHRvIHF1ZXVlIGZvciBleGVjdXRpb24KKyAgICoKKyAgICogQHBhcmFtIHRpbWVvdXQgVGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcyB0byBhZGQgYSB0YXNrIHdoZW4gYSBwZW5kaW5nLXRhc2stY291bnQKKyAgICogaXMgc3BlY2lmaWVkLiBTcGVjaWZpYyBjYXNlczoKKyAgICogdGltZW91dCA9IDAgIDogV2FpdCBmb3JldmVyIHRvIHF1ZXVlIHRhc2suCisgICAqIHRpbWVvdXQgPSAtMSA6IFJldHVybiBpbW1lZGlhdGVseSBpZiBwZW5kaW5nIHRhc2sgY291bnQgZXhjZWVkcyBzcGVjaWZpZWQgbWF4CisgICAqIEBwYXJhbSBleHBpcmF0aW9uIHdoZW4gbm9uemVybywgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhlIHRhc2sgaXMgdmFsaWQKKyAgICogdG8gYmUgcnVuOyBpZiBleGNlZWRlZCwgdGhlIHRhc2sgd2lsbCBiZSBkcm9wcGVkIG9mZiB0aGUgcXVldWUgYW5kIG5vdCBydW4uCisgICAqCisgICAqIEB0aHJvd3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiBQZW5kaW5nIHRhc2sgY291bnQgZXhjZWVkcyBtYXggcGVuZGluZyB0YXNrIGNvdW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQgPSAwTEwsCisgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcmF0aW9uID0gMExMKSA9IDA7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSA9IDA7CisKKyAgLyoqCisgICAqIFJlbW92ZSB0aGUgbmV4dCBwZW5kaW5nIHRhc2sgd2hpY2ggd291bGQgYmUgcnVuLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSB0YXNrIHJlbW92ZWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7CisKKyAgLyoqCisgICAqIFJlbW92ZSB0YXNrcyBmcm9tIGZyb250IG9mIHRhc2sgcXVldWUgdGhhdCBoYXZlIGV4cGlyZWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCkgPSAwOworCisgIC8qKgorICAgKiBTZXQgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIHRhc2sgaXMgZXhwaXJlZCBhbmQgbm90IHJ1bi4KKyAgICoKKyAgICogQHBhcmFtIGV4cGlyZUNhbGxiYWNrIGEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIHNoYXJlZF9wdHI8UnVubmFibGU+IGZvcgorICAgKiB0aGUgZXhwaXJlZCB0YXNrLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKSA9IDA7CisKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdUaHJlYWRNYW5hZ2VyKCk7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBzaW1wbGUgdGhyZWFkIG1hbmFnZXIgdGhlIHVzZXMgY291bnQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBoYXMKKyAgICogYSBwZW5kaW5nVGFza0NvdW50TWF4IG1heGltdW0gcGVuZGluZyB0YXNrcy4gVGhlIGRlZmF1bHQsIDAsIHNwZWNpZmllZCBubyBsaW1pdAorICAgKiBvbiBwZW5kaW5nIHRhc2tzCisgICAqLworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50ID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXggPSAwKTsKKworICBjbGFzcyBUYXNrOworCisgIGNsYXNzIFdvcmtlcjsKKworICBjbGFzcyBJbXBsOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWEzNGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6d2Vha19wdHI7CisKKy8qKgorICogVGltZXJNYW5hZ2VyIGNsYXNzCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgVGltZXJNYW5hZ2VyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworcHVibGljOgorICBlbnVtIFNUQVRFIHsgV0FJVElORywgRVhFQ1VUSU5HLCBDQU5DRUxMRUQsIENPTVBMRVRFIH07CisKKyAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgOiBydW5uYWJsZV8ocnVubmFibGUpLCBzdGF0ZV8oV0FJVElORykge30KKworICB+VGFzaygpIHt9CisKKyAgdm9pZCBydW4oKSB7CisgICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKKyAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7CisgICAgICBzdGF0ZV8gPSBDT01QTEVURTsKKyAgICB9CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxSdW5uYWJsZT4gJiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gcnVubmFibGVfID09IHJ1bm5hYmxlOyB9CisKKyAgdGFza19pdGVyYXRvciBpdF87CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKKyAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjsKKyAgU1RBVEUgc3RhdGVfOworfTsKKworY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyIDogcHVibGljIFJ1bm5hYmxlIHsKKworcHVibGljOgorICBEaXNwYXRjaGVyKFRpbWVyTWFuYWdlciogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSB7fQorCisgIH5EaXNwYXRjaGVyKCkge30KKworICAvKioKKyAgICogRGlzcGF0Y2hlciBlbnRyeSBwb2ludAorICAgKgorICAgKiBBcyBsb25nIGFzIGRpc3BhdGNoZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHRhc2tNYXBfCisgICAqIGFuZCBleGVjdXRlLgorICAgKi8KKyAgdm9pZCBydW4oKSB7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKKyAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpIHsKKyAgICAgICAgbWFuYWdlcl8tPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRDsKKyAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKworICAgIGRvIHsKKyAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+IGV4cGlyZWRUYXNrczsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKKyAgICAgICAgdGFza19pdGVyYXRvciBleHBpcmVkVGFza0VuZDsKKyAgICAgICAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgICB3aGlsZSAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQKKyAgICAgICAgICAgICAgICYmIChleHBpcmVkVGFza0VuZCA9IG1hbmFnZXJfLT50YXNrTWFwXy51cHBlcl9ib3VuZChub3cpKQorICAgICAgICAgICAgICAgICAgPT0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCkpIHsKKyAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQgPSAwTEw7CisgICAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza01hcF8uZW1wdHkoKSkgeworICAgICAgICAgICAgdGltZW91dCA9IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpLT5maXJzdCAtIG5vdzsKKyAgICAgICAgICB9CisgICAgICAgICAgYXNzZXJ0KCh0aW1lb3V0ICE9IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPiAwKQorICAgICAgICAgICAgICAgICB8fCAodGltZW91dCA9PSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID09IDApKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQodGltZW91dCk7CisgICAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgICAgfQorICAgICAgICAgIG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICAgICAgICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiB0YXNrID0gaXgtPnNlY29uZDsKKyAgICAgICAgICAgIGV4cGlyZWRUYXNrcy5pbnNlcnQodGFzayk7CisgICAgICAgICAgICB0YXNrLT5pdF8gPSBtYW5hZ2VyXy0+dGFza01hcF8uZW5kKCk7CisgICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VGFzazo6V0FJVElORykgeworICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrQ291bnRfLS07CisgICAgICAgICAgfQorICAgICAgICAgIG1hbmFnZXJfLT50YXNrTWFwXy5lcmFzZShtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSwgZXhwaXJlZFRhc2tFbmQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUYXNrPiA+OjppdGVyYXRvciBpeCA9IGV4cGlyZWRUYXNrcy5iZWdpbigpOworICAgICAgICAgICBpeCAhPSBleHBpcmVkVGFza3MuZW5kKCk7CisgICAgICAgICAgICsraXgpIHsKKyAgICAgICAgKCppeCktPnJ1bigpOworICAgICAgfQorCisgICAgfSB3aGlsZSAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKKyAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RPUFBJTkcpIHsKKyAgICAgICAgbWFuYWdlcl8tPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RPUFBFRDsKKyAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworcHJpdmF0ZToKKyAgVGltZXJNYW5hZ2VyKiBtYW5hZ2VyXzsKKyAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjsKK307CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQzNTUpIC8vICd0aGlzJyB1c2VkIGluIGJhc2UgbWVtYmVyIGluaXRpYWxpemVyIGxpc3QKKyNlbmRpZgorCitUaW1lck1hbmFnZXI6OlRpbWVyTWFuYWdlcigpCisgIDogdGFza0NvdW50XygwKSwKKyAgICBzdGF0ZV8oVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKKyAgICBkaXNwYXRjaGVyXyhzaGFyZWRfcHRyPERpc3BhdGNoZXI+KG5ldyBEaXNwYXRjaGVyKHRoaXMpKSkgeworfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworVGltZXJNYW5hZ2VyOjp+VGltZXJNYW5hZ2VyKCkgeworCisgIC8vIElmIHdlIGhhdmVuJ3QgYmVlbiBleHBsaWNpdGx5IHN0b3BwZWQsIGRvIHNvIG5vdy4gIFdlIGRvbid0IG5lZWQgdG8gZ3JhYgorICAvLyB0aGUgbW9uaXRvciBoZXJlLCBzaW5jZSBzdG9wIGFscmVhZHkgdGFrZXMgY2FyZSBvZiByZWVudHJhbmN5LgorCisgIGlmIChzdGF0ZV8gIT0gU1RPUFBFRCkgeworICAgIHRyeSB7CisgICAgICBzdG9wKCk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCisgICAgfQorICB9Cit9CisKK3ZvaWQgVGltZXJNYW5hZ2VyOjpzdGFydCgpIHsKKyAgYm9vbCBkb1N0YXJ0ID0gZmFsc2U7CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlmIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgICBzdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HOworICAgICAgZG9TdGFydCA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKGRvU3RhcnQpIHsKKyAgICBkaXNwYXRjaGVyVGhyZWFkXyA9IHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQoZGlzcGF0Y2hlcl8pOworICAgIGRpc3BhdGNoZXJUaHJlYWRfLT5zdGFydCgpOworICB9CisKKyAgeworICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICB3aGlsZSAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpIHsKKyAgICAgIG1vbml0b3JfLndhaXQoKTsKKyAgICB9CisgICAgYXNzZXJ0KHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKTsKKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6c3RvcCgpIHsKKyAgYm9vbCBkb1N0b3AgPSBmYWxzZTsKKyAgeworICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBpZiAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgeworICAgICAgc3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVE9QUEVEOworICAgIH0gZWxzZSBpZiAoc3RhdGVfICE9IFNUT1BQSU5HICYmIHN0YXRlXyAhPSBTVE9QUEVEKSB7CisgICAgICBkb1N0b3AgPSB0cnVlOworICAgICAgc3RhdGVfID0gU1RPUFBJTkc7CisgICAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgd2hpbGUgKHN0YXRlXyAhPSBTVE9QUEVEKSB7CisgICAgICBtb25pdG9yXy53YWl0KCk7CisgICAgfQorICB9CisKKyAgaWYgKGRvU3RvcCkgeworICAgIC8vIENsZWFuIHVwIGFueSBvdXRzdGFuZGluZyB0YXNrcworICAgIHRhc2tNYXBfLmNsZWFyKCk7CisKKyAgICAvLyBSZW1vdmUgZGlzcGF0Y2hlcidzIHJlZmVyZW5jZSB0byB1cy4KKyAgICBkaXNwYXRjaGVyXy0+bWFuYWdlcl8gPSBOVUxMOworICB9Cit9CisKK3NoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gVGltZXJNYW5hZ2VyOjp0aHJlYWRGYWN0b3J5KCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIHJldHVybiB0aHJlYWRGYWN0b3J5XzsKK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7Cit9CisKK3NpemVfdCBUaW1lck1hbmFnZXI6OnRhc2tDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRhc2tDb3VudF87Cit9CisKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KSB7CisgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgdGltZW91dCArPSBub3c7CisKKyAgeworICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHRhc2sgbWFwIGlzIGVtcHR5LCB3ZSB3aWxsIGtpY2sgdGhlIGRpc3BhdGNoZXIgZm9yIHN1cmUuIE90aGVyd2lzZSwgd2Uga2ljayBoaW0KKyAgICAvLyBpZiB0aGUgZXhwaXJhdGlvbiB0aW1lIGlzIHNob3J0ZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZS4gTmVlZCB0byB0ZXN0IGJlZm9yZSB3ZSBpbnNlcnQsCisgICAgLy8gYmVjYXVzZSB0aGUgbmV3IHRhc2sgbWlnaHQgaW5zZXJ0IGF0IHRoZSBmcm9udC4KKyAgICBib29sIG5vdGlmeVJlcXVpcmVkID0gKHRhc2tDb3VudF8gPT0gMCkgPyB0cnVlIDogdGltZW91dCA8IHRhc2tNYXBfLmJlZ2luKCktPmZpcnN0OworCisgICAgc2hhcmVkX3B0cjxUYXNrPiB0aW1lcihuZXcgVGFzayh0YXNrKSk7CisgICAgdGFza0NvdW50XysrOworICAgIHRpbWVyLT5pdF8gPSB0YXNrTWFwXy5pbnNlcnQoc3RkOjpwYWlyPGludDY0X3QsIHNoYXJlZF9wdHI8VGFzaz4gPih0aW1lb3V0LCB0aW1lcikpOworCisgICAgLy8gSWYgdGhlIHRhc2sgbWFwIHdhcyBlbXB0eSwgb3IgaWYgd2UgaGF2ZSBhbiBleHBpcmF0aW9uIHRoYXQgaXMgZWFybGllcgorICAgIC8vIHRoYW4gYW55IHByZXZpb3VzbHkgc2Vlbiwga2ljayB0aGUgZGlzcGF0Y2hlciBzbyBpdCBjYW4gdXBkYXRlIGl0cworICAgIC8vIHRpbWVvdXQKKyAgICBpZiAobm90aWZ5UmVxdWlyZWQpIHsKKyAgICAgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKworICAgIHJldHVybiB0aW1lcjsKKyAgfQorfQorCitUaW1lck1hbmFnZXI6OlRpbWVyIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgICAgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKKworICBpbnQ2NF90IGV4cGlyYXRpb247CisgIFV0aWw6OnRvTWlsbGlzZWNvbmRzKGV4cGlyYXRpb24sIHZhbHVlKTsKKworICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKKyAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgfQorCisgIHJldHVybiBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7Cit9CisKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywKKyAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKKworICBpbnQ2NF90IGV4cGlyYXRpb247CisgIFV0aWw6OnRvTWlsbGlzZWNvbmRzKGV4cGlyYXRpb24sIHZhbHVlKTsKKworICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKKyAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgfQorCisgIHJldHVybiBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7Cit9CisKK3ZvaWQgVGltZXJNYW5hZ2VyOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKyAgYm9vbCBmb3VuZCA9IGZhbHNlOworICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSB0YXNrTWFwXy5iZWdpbigpOyBpeCAhPSB0YXNrTWFwXy5lbmQoKTspIHsKKyAgICBpZiAoKml4LT5zZWNvbmQgPT0gdGFzaykgeworICAgICAgZm91bmQgPSB0cnVlOworICAgICAgdGFza0NvdW50Xy0tOworICAgICAgdGFza01hcF8uZXJhc2UoaXgrKyk7CisgICAgfSBlbHNlIHsKKyAgICAgICsraXg7CisgICAgfQorICB9CisgIGlmICghZm91bmQpIHsKKyAgICB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uKCk7CisgIH0KK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShUaW1lciBoYW5kbGUpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgc2hhcmVkX3B0cjxUYXNrPiB0YXNrID0gaGFuZGxlLmxvY2soKTsKKyAgaWYgKCF0YXNrKSB7CisgICAgdGhyb3cgTm9TdWNoVGFza0V4Y2VwdGlvbigpOworICB9CisKKyAgaWYgKHRhc2stPml0XyA9PSB0YXNrTWFwXy5lbmQoKSkgeworICAgIC8vIFRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQKKyAgICB0aHJvdyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbigpOworICB9CisKKyAgdGFza01hcF8uZXJhc2UodGFzay0+aXRfKTsKKyAgdGFza0NvdW50Xy0tOworfQorCitUaW1lck1hbmFnZXI6OlNUQVRFIFRpbWVyTWFuYWdlcjo6c3RhdGUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0ZV87Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzkyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRpbWUuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVGltZXIgTWFuYWdlcgorICoKKyAqIFRoaXMgY2xhc3MgZGlzcGF0Y2hlcyB0aW1lciB0YXNrcyB3aGVuIHRoZXkgZmFsbCBkdWUuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgVGltZXJNYW5hZ2VyIHsKKworcHVibGljOgorICBjbGFzcyBUYXNrOworICB0eXBlZGVmIHN0ZDo6d2Vha19wdHI8VGFzaz4gVGltZXI7CisKKyAgVGltZXJNYW5hZ2VyKCk7CisKKyAgdmlydHVhbCB+VGltZXJNYW5hZ2VyKCk7CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCisgICAqCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE1pc3NpbmcgdGhyZWFkIGZhY3RvcnkgYXR0cmlidXRlCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKworICAvKioKKyAgICogU3RvcHMgdGhlIHRpbWVyIG1hbmFnZXIgc2VydmljZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKworICB2aXJ0dWFsIHNpemVfdCB0YXNrQ291bnQoKSBjb25zdDsKKworICAvKioKKyAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgorICAgKgorICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCisgICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzaworICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCisgICAqLworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7CisKKyAgLyoqCisgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KKyAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQorICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCisgICAqLworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHRpbWVvdXQpOworCisgIC8qKgorICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCisgICAqCisgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGV4ZWN1dGUKKyAgICogQHBhcmFtIHRpbWVvdXQgQWJzb2x1dGUgdGltZSBpbiB0aGUgZnV0dXJlIHRvIGV4ZWN1dGUgdGFzay4KKyAgICogQHJldHVybiBIYW5kbGUgb2YgdGhlIHRpbWVyLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIHRpbWVyLgorICAgKi8KKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdGltZW91dCk7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKKyAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gcmVtb3ZlLiBBbGwgdGltZXJzIHdoaWNoIGV4ZWN1dGUgdGhpcyB0YXNrIHdpbGwKKyAgICogYmUgcmVtb3ZlZC4KKyAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCisgICAqCisgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgc2luZ2xlIHBlbmRpbmcgdGFzaworICAgKgorICAgKiBAcGFyYW0gdGltZXIgVGhlIHRpbWVyIHRvIHJlbW92ZS4gVGhlIHRpbWVyIGlzIHJldHVybmVkIHdoZW4gY2FsbGluZyB0aGUKKyAgICogYWRkKCkgbWV0aG9kLgorICAgKiBAdGhyb3dzIE5vU3VjaFRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgZG9lc24ndCBleGlzdC4gSXQgd2FzIGVpdGhlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFscmVhZHkgb3IgdGhpcyBjYWxsIHdhcyBtYWRlIGZvciBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoaXMgdGltZXIKKyAgICoKKyAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKFRpbWVyIHRpbWVyKTsKKworICBlbnVtIFNUQVRFIHsgVU5JTklUSUFMSVpFRCwgU1RBUlRJTkcsIFNUQVJURUQsIFNUT1BQSU5HLCBTVE9QUEVEIH07CisKKyAgdmlydHVhbCBTVEFURSBzdGF0ZSgpIGNvbnN0OworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CisgIGZyaWVuZCBjbGFzcyBUYXNrOworICBzdGQ6Om11bHRpbWFwPGludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOworICBzaXplX3QgdGFza0NvdW50XzsKKyAgTW9uaXRvciBtb25pdG9yXzsKKyAgU1RBVEUgc3RhdGVfOworICBjbGFzcyBEaXNwYXRjaGVyOworICBmcmllbmQgY2xhc3MgRGlzcGF0Y2hlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPERpc3BhdGNoZXI+IGRpc3BhdGNoZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBkaXNwYXRjaGVyVGhyZWFkXzsKKyAgdHlwZWRlZiBzdGQ6Om11bHRpbWFwPGludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID46Oml0ZXJhdG9yIHRhc2tfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpwYWlyPHRhc2tfaXRlcmF0b3IsIHRhc2tfaXRlcmF0b3I+IHRhc2tfcmFuZ2U7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZkMTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2lmIGRlZmluZWQoSEFWRV9TWVNfVElNRV9IKQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKK2ludDY0X3QgVXRpbDo6Y3VycmVudFRpbWVUaWNrcyhpbnQ2NF90IHRpY2tzUGVyU2VjKSB7CisgIGludDY0X3QgcmVzdWx0OworICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgIGludCByZXQgPSBUSFJJRlRfR0VUVElNRU9GREFZKCZub3csIE5VTEwpOworICBhc3NlcnQocmV0ID09IDApOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7IC8vIHNxdWVsY2hpbmcgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZworICB0b1RpY2tzKHJlc3VsdCwgbm93LCB0aWNrc1BlclNlYyk7CisgIHJldHVybiByZXN1bHQ7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5MTU5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfIDEKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzCisgKgorICogVGhpcyBjbGFzcyBjb250YWlucyBiYXNpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgdGltZSBmb3JtYXRzLAorICogYW5kIG90aGVyIGNvbW1vbiBwbGF0Zm9ybS1kZXBlbmRlbnQgY29uY3VycmVuY3kgb3BlcmF0aW9ucy4KKyAqIEl0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gQVBJIGhlYWRlcnMgZm9yIG90aGVyIGNvbmN1cnJlbmN5IGxpYnJhcnkKKyAqIGhlYWRlcnMsIHNpbmNlIGl0IHdpbGwsIGJ5IGRlZmluaXRpb24sIHB1bGwgaW4gYWxsIHNvcnRzIG9mIGhvcnJpZAorICogcGxhdGZvcm0gZGVwZW5kZW50IHN0dWZmLiAgUmF0aGVyIGl0IHNob3VsZCBiZSBpbmx1ZGVkIGRpcmVjdGx5IGluCisgKiBjb25jdXJyZW5jeSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHNvdXJjZS4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBVdGlsIHsKKworICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfUyA9IDEwMDAwMDAwMDBMTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgVVNfUEVSX1MgPSAxMDAwMDAwTEw7CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1TX1BFUl9TID0gMTAwMExMOworCisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9NUyA9IE5TX1BFUl9TIC8gTVNfUEVSX1M7CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9VUyA9IE5TX1BFUl9TIC8gVVNfUEVSX1M7CisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9NUyA9IFVTX1BFUl9TIC8gTVNfUEVSX1M7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnZlcnRzIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBpbnRvIGEgVEhSSUZUX1RJTUVTUEVDIHN0cnVjdAorICAgKgorICAgKiBAcGFyYW0gc3RydWN0IFRIUklGVF9USU1FU1BFQyYgcmVzdWx0CisgICAqIEBwYXJhbSB0aW1lIG9yIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcworICAgKi8KKyAgc3RhdGljIHZvaWQgdG9UaW1lc3BlYyhzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKKyAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgICAgICAgICAgICAgICAgLy8gbXMgdG8gcworICAgIHJlc3VsdC50dl9uc2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogTlNfUEVSX01TOyAvLyBtcyB0byBucworICB9CisKKyAgc3RhdGljIHZvaWQgdG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKKyAgICByZXN1bHQudHZfc2VjID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8gTVNfUEVSX1MpOyAgICAgICAgICAgICAgICAvLyBtcyB0byBzCisgICAgcmVzdWx0LnR2X3VzZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHZhbHVlICUgTVNfUEVSX1MpICogVVNfUEVSX01TKTsgLy8gbXMgdG8gdXMKKyAgfQorCisgIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2VjcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3NQZXJTZWMsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBuZXdUaWNrc1BlclNlYykgeworICAgIHJlc3VsdCA9IHNlY3MgKiBuZXdUaWNrc1BlclNlYzsKKyAgICByZXN1bHQgKz0gb2xkVGlja3MgKiBuZXdUaWNrc1BlclNlYyAvIG9sZFRpY2tzUGVyU2VjOworCisgICAgaW50NjRfdCBvbGRQZXJOZXcgPSBvbGRUaWNrc1BlclNlYyAvIG5ld1RpY2tzUGVyU2VjOworICAgIGlmIChvbGRQZXJOZXcgJiYgKChvbGRUaWNrcyAlIG9sZFBlck5ldykgPj0gKG9sZFBlck5ldyAvIDIpKSkgeworICAgICAgKytyZXN1bHQ7CisgICAgfQorICB9CisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRvIGFyYml0cmFyeS1zaXplZCB0aWNrcyBzaW5jZSBlcG9jaAorICAgKi8KKyAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X25zZWMsIE5TX1BFUl9TLCB0aWNrc1BlclNlYyk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCisgICAqLworICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCAodW5zaWduZWQgbG9uZyl2YWx1ZS50dl9zZWMsICh1bnNpZ25lZCBsb25nKXZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBtaWxsaXNlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gbWlsbGlzZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRvIG1pY3Jvc2Vjb25kcworICAgKi8KKyAgc3RhdGljIHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBVU19QRVJfUyk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gbWljcm9zZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b1VzZWMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBVU19QRVJfUyk7CisgIH0KKworICAvKioKKyAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBhIG51bWJlciBvZiBhcmJpdHJhcnktc2l6ZSB0aWNrcyBmcm9tIGVwb2NoCisgICAqLworICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpOworCisgIC8qKgorICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIG1pbGxpc2Vjb25kcyBmcm9tIGVwb2NoCisgICAqLworICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZSgpIHsgcmV0dXJuIGN1cnJlbnRUaW1lVGlja3MoTVNfUEVSX1MpOyB9CisKKyAgLyoqCisgICAqIEdldCBjdXJyZW50IHRpbWUgYXMgbWljcm9zIGZyb20gZXBvY2gKKyAgICovCisgIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lVXNlYygpIHsgcmV0dXJuIGN1cnJlbnRUaW1lVGlja3MoVVNfUEVSX1MpOyB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgeworCitQZWVrUHJvY2Vzc29yOjpQZWVrUHJvY2Vzc29yKCkgeworICBtZW1vcnlCdWZmZXJfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICB0YXJnZXRUcmFuc3BvcnRfID0gbWVtb3J5QnVmZmVyXzsKK30KK1BlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkgeworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OmluaXRpYWxpemUoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KSB7CisgIGFjdHVhbFByb2Nlc3Nvcl8gPSBhY3R1YWxQcm9jZXNzb3I7CisgIHBpcGVkUHJvdG9jb2xfID0gcHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbCh0YXJnZXRUcmFuc3BvcnRfKTsKKyAgdHJhbnNwb3J0RmFjdG9yeV8gPSB0cmFuc3BvcnRGYWN0b3J5OworICB0cmFuc3BvcnRGYWN0b3J5Xy0+aW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydCh0YXJnZXRUcmFuc3BvcnRfKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbikgeworICByZXR1cm4gdHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChpbik7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6c2V0VGFyZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpIHsKKyAgdGFyZ2V0VHJhbnNwb3J0XyA9IHRhcmdldFRyYW5zcG9ydDsKKyAgaWYgKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKKyAgICBtZW1vcnlCdWZmZXJfID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KAorICAgICAgICBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XyktPmdldFRhcmdldFRyYW5zcG9ydCgpKTsKKyAgfQorCisgIGlmICghbWVtb3J5QnVmZmVyXykgeworICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICJUYXJnZXQgdHJhbnNwb3J0IG11c3QgYmUgYSBUTWVtb3J5QnVmZmVyIG9yIGEgVFBpcGVkVHJhbnNwb3J0IHdpdGggVE1lbW9yeUJ1ZmZlciIpOworICB9Cit9CisKK2Jvb2wgUGVla1Byb2Nlc3Nvcjo6cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKworICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgVE1lc3NhZ2VUeXBlIG10eXBlOworICBpbnQzMl90IHNlcWlkOworICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICBpZiAobXR5cGUgIT0gVF9DQUxMICYmIG10eXBlICE9IFRfT05FV0FZKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKKyAgfQorCisgIC8vIFBlZWsgYXQgdGhlIG5hbWUKKyAgcGVla05hbWUoZm5hbWUpOworCisgIFRUeXBlIGZ0eXBlOworICBpbnQxNl90IGZpZDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpbi0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOworICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFBlZWsgYXQgdGhlIHZhcmlhYmxlCisgICAgcGVlayhpbiwgZnR5cGUsIGZpZCk7CisgICAgaW4tPnJlYWRGaWVsZEVuZCgpOworICB9CisgIGluLT5yZWFkTWVzc2FnZUVuZCgpOworICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKKworICAvLworICAvLyBBbGwgdGhlIGRhdGEgaXMgbm93IGluIG1lbW9yeUJ1ZmZlcl8gYW5kIHJlYWR5IHRvIGJlIHByb2Nlc3NlZAorICAvLworCisgIC8vIExldCdzIGZpcnN0IHRha2UgYSBwZWVrIGF0IHRoZSBmdWxsIGRhdGEgaW4gbWVtb3J5CisgIHVpbnQ4X3QqIGJ1ZmZlcjsKKyAgdWludDMyX3Qgc2l6ZTsKKyAgbWVtb3J5QnVmZmVyXy0+Z2V0QnVmZmVyKCZidWZmZXIsICZzaXplKTsKKyAgcGVla0J1ZmZlcihidWZmZXIsIHNpemUpOworCisgIC8vIERvbmUgcGVla2luZyBhdCB2YXJpYWJsZXMKKyAgcGVla0VuZCgpOworCisgIGJvb2wgcmV0ID0gYWN0dWFsUHJvY2Vzc29yXy0+cHJvY2VzcyhwaXBlZFByb3RvY29sXywgb3V0LCBjb25uZWN0aW9uQ29udGV4dCk7CisgIG1lbW9yeUJ1ZmZlcl8tPnJlc2V0QnVmZmVyKCk7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKSB7CisgICh2b2lkKWZuYW1lOworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtCdWZmZXIodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBzaXplKSB7CisgICh2b2lkKWJ1ZmZlcjsKKyAgKHZvaWQpc2l6ZTsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLCBUVHlwZSBmdHlwZSwgaW50MTZfdCBmaWQpIHsKKyAgKHZvaWQpZmlkOworICBpbi0+c2tpcChmdHlwZSk7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0VuZCgpIHsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhYzJiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQRUVLUFJPQ0VTU09SX0gKKyNkZWZpbmUgUEVFS1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvY2Vzc29yIHsKKworLyoKKyAqIENsYXNzIGZvciBwZWVraW5nIGF0IHRoZSByYXcgZGF0YSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZCBieSBhbm90aGVyIHByb2Nlc3NvcgorICogYW5kIGdpdmVzIHRoZSBkZXJpdmVkIGNsYXNzIGEgY2hhbmNlIHRvIGNoYW5nZSBiZWhhdmlvciBhY2NvcmRpbmdseQorICoKKyAqLworY2xhc3MgUGVla1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7CisKK3B1YmxpYzoKKyAgUGVla1Byb2Nlc3NvcigpOworICB2aXJ0dWFsIH5QZWVrUHJvY2Vzc29yKCk7CisKKyAgLy8gSW5wdXQgaGVyZTogYWN0dWFsUHJvY2Vzc29yICAtIHRoZSB1bmRlcmx5aW5nIHByb2Nlc3NvcgorICAvLyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkgIC0gdGhlIHByb3RvY29sIGZhY3RvcnkgdXNlZCB0byB3cmFwIHRoZSBtZW1vcnkgYnVmZmVyCisgIC8vICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgLSB0aGlzIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgaXMgdXNlZCB0byB3cmFwIHRoZSBzb3VyY2UgdHJhbnNwb3J0CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgYSBjYWxsIHRvIGdldFBpcGVkVHJhbnNwb3J0CisgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBnZXRQaXBlZFRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CisKKyAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCk7CisKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KTsKKworICAvLyBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBjYW4gYmUgb3ZlcmxvYWRlZCBieSBjaGlsZCBjbGFzc2VzIHRvCisgIC8vIGFjaGlldmUgZGVzaXJlZCBwZWVraW5nIGJlaGF2aW9yCisgIHZpcnR1YWwgdm9pZCBwZWVrTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUpOworICB2aXJ0dWFsIHZvaWQgcGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpOworICB2aXJ0dWFsIHZvaWQgcGVlayhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGZpZCk7CisgIHZpcnR1YWwgdm9pZCBwZWVrRW5kKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXBlZFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gbWVtb3J5QnVmZmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OGVmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFUU1BST0NFU1NPUl9ICisjZGVmaW5lIFNUQVRTUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb2Nlc3NvciB7CisKKy8qCisgKiBDbGFzcyBmb3Iga2VlcGluZyB0cmFjayBvZiBmdW5jdGlvbiBjYWxsIHN0YXRpc3RpY3MgYW5kIHByaW50aW5nIHRoZW0gaWYgZGVzaXJlZAorICoKKyAqLworY2xhc3MgU3RhdHNQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgeworcHVibGljOgorICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkgOiBwcmludF8ocHJpbnQpLCBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkge30KKyAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKXt9OworCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc2VydmVyQ29udGV4dCkgeworCisgICAgcGlwcm90XyA9IHBpcHJvdDsKKworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisKKyAgICBwaXByb3RfLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworICAgIGlmIChtdHlwZSAhPSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiVW5rbm93biBtZXNzYWdlIHR5cGVcbiIpOworICAgICAgfQorICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CisgICAgfQorICAgIGlmIChwcmludF8pIHsKKyAgICAgIHByaW50ZigiJXMgKCIsIGZuYW1lLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoZnJlcXVlbmN5XykgeworICAgICAgaWYgKGZyZXF1ZW5jeV9tYXBfLmZpbmQoZm5hbWUpICE9IGZyZXF1ZW5jeV9tYXBfLmVuZCgpKSB7CisgICAgICAgIGZyZXF1ZW5jeV9tYXBfW2ZuYW1lXSsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnJlcXVlbmN5X21hcF9bZm5hbWVdID0gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOworICAgIGludDE2X3QgZmlkOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKKyAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiwgIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHByaW50XykgeworICAgICAgcHJpbnRmKCJcYlxiKVxuIik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+JiBnZXRfZnJlcXVlbmN5X21hcCgpIHsgcmV0dXJuIGZyZXF1ZW5jeV9tYXBfOyB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBwcmludEFuZFBhc3NUb0J1ZmZlcihhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlKSB7CisgICAgc3dpdGNoIChmdHlwZSkgeworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0w6IHsKKyAgICAgIGJvb2wgYm9vbHY7CisgICAgICBwaXByb3RfLT5yZWFkQm9vbChib29sdik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBib29sdik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFOiB7CisgICAgICBpbnQ4X3QgYnl0ZXY7CisgICAgICBwaXByb3RfLT5yZWFkQnl0ZShieXRldik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBieXRldik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTY6IHsKKyAgICAgIGludDE2X3QgaTE2OworICAgICAgcGlwcm90Xy0+cmVhZEkxNihpMTYpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVkIiwgaTE2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMjogeworICAgICAgaW50MzJfdCBpMzI7CisgICAgICBwaXByb3RfLT5yZWFkSTMyKGkzMik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBpMzIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0OiB7CisgICAgICBpbnQ2NF90IGk2NDsKKyAgICAgIHBpcHJvdF8tPnJlYWRJNjQoaTY0KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlbGQiLCBpNjQpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFOiB7CisgICAgICBkb3VibGUgZHViOworICAgICAgcGlwcm90Xy0+cmVhZERvdWJsZShkdWIpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVmIiwgZHViKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORzogeworICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgcGlwcm90Xy0+cmVhZFN0cmluZyhzdHIpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVzIiwgc3RyLmNfc3RyKCkpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUOiB7CisgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgaW50MTZfdCBmaWQ7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOworICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIjwiKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOworICAgICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihmdHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgfQorICAgICAgICBwaXByb3RfLT5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHBpcHJvdF8tPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJcYj4iKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX01BUDogeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBrZXlUeXBlOworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSB2YWxUeXBlOworICAgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICAgIHBpcHJvdF8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGtleVR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCI9PiIpOworICAgICAgICB9CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKHZhbFR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBpcHJvdF8tPnJlYWRNYXBFbmQoKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJcYn0iKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NFVDogeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoInsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBpcHJvdF8tPnJlYWRTZXRFbmQoKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJcYn0iKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1Q6IHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7CisgICAgICB1aW50MzJfdCBpLCBzaXplOworICAgICAgcGlwcm90Xy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiWyIpOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihlbGVtVHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZExpc3RFbmQoKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJcYl0iKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiBmcmVxdWVuY3lfbWFwXzsKKworICBib29sIHByaW50XzsKKyAgYm9vbCBmcmVxdWVuY3lfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTdmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1RNVUxUSVBMRVhFRFBST0NFU1NPUl9IXworI2RlZmluZSBUSFJJRlRfVE1VTFRJUExFWEVEUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxib29zdC90b2tlbml6ZXIuaHBwPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiAgVG8gYmUgYWJsZSB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLCB3ZSBuZWVkZWQKKyAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgKiAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICovCitjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yIHsKK3B1YmxpYzoKKyAgU3RvcmVkTWVzc2FnZVByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IF9zZXFpZCkKKyAgICA6IFRQcm90b2NvbERlY29yYXRvcihfcHJvdG9jb2wpLCBuYW1lKF9uYW1lKSwgdHlwZShfdHlwZSksIHNlcWlkKF9zZXFpZCkge30KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIF9uYW1lLCBUTWVzc2FnZVR5cGUmIF90eXBlLCBpbnQzMl90JiBfc2VxaWQpIHsKKworICAgIF9uYW1lID0gbmFtZTsKKyAgICBfdHlwZSA9IHR5cGU7CisgICAgX3NlcWlkID0gc2VxaWQ7CisKKyAgICByZXR1cm4gMDsgLy8gKE5vcm1hbCBUUHJvdG9jb2wgcmVhZCBmdW5jdGlvbnMgcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkKQorICB9CisKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgVE1lc3NhZ2VUeXBlIHR5cGU7CisgIGludDMyX3Qgc2VxaWQ7Cit9OworfSAvLyBuYW1lc3BhY2UgcHJvdG9jb2wKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgPGNvZGU+VFByb2Nlc3NvcjwvY29kZT4gYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBzdGQ6OnNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKAorICogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENhbGN1bGF0b3JIYW5kbGVyPiggbmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKSkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IoCisgKiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V2VhdGhlclJlcG9ydEhhbmRsZXI+KCBuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpKSk7CisgKgorICogICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOworICogICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKKyAqCisgKiAgICAgc2VydmVyLnNlcnZlKCk7CisgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiA+IHNlcnZpY2VzX3Q7CisKKyAgLyoqCisgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKKyAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICogbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgKgorICAgICogXHBhcmFtIFtpbl0gc2VydmljZU5hbWUgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAqIFxwYXJhbSBbaW5dIHByb2Nlc3NvciAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bworICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciwKKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0SWYgaW50ZXJmYWNlLgorICAgICovCisgIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VOYW1lLCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSB7CisgICAgc2VydmljZXNbc2VydmljZU5hbWVdID0gcHJvY2Vzc29yOworICB9CisKKyAgLyoqCisgICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBxdWVyaWVzIHdpdGhvdXQgc2VydmljZSBuYW1lCisgICAqIFxwYXJhbSBbaW5dIHByb2Nlc3NvciAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZS4KKyAgICovCisgIHZvaWQgcmVnaXN0ZXJEZWZhdWx0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yKSB7CisgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgfQorCisgIC8qKgorICAgKiBDaGV3IHVwIGludmFsaWQgaW5wdXQgYW5kIHJldHVybiBhbiBleGNlcHRpb24gdG8gdGhyb3cuCisgICAqLworICBURXhjZXB0aW9uIHByb3RvY29sX2Vycm9yKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSBjb25zdCB7CisgICAgaW4tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsKKyAgICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKKyAgICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAgIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpQUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogIiArIG1zZyk7CisgICAgb3V0LT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsKKyAgICB4LndyaXRlKG91dC5nZXQoKSk7CisgICAgb3V0LT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOworICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7CisgICAgcmV0dXJuIFRFeGNlcHRpb24obXNnKTsKK30KKyAgIAorICAvKioKKyAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgKgorICAgKiA8b2w+CisgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+CisgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICogICAgIDxsaT5Vc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLjwvbGk+CisgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS48L2xpPgorICAgKiA8L29sPgorICAgKgorICAgKiBcdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgVF9DQUxMIG9yIFRfT05FV0FZLCBpZgorICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCisgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCisgICAqLworICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKworICAgIC8vIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgIC8vIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAvLyBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCk7CisKKyAgICBpZiAodHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIHR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICAvLyBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZS4KKyAgICAgIHRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLCAiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICBib29zdDo6dG9rZW5pemVyPGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPiA+IHRvayhuYW1lLCBib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4oIjoiKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zOworICAgIHN0ZDo6Y29weSh0b2suYmVnaW4oKSwgdG9rLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG9rZW5zKSk7CisKKyAgICAvLyBBIHZhbGlkIG1lc3NhZ2Ugc2hvdWxkIGNvbnNpc3Qgb2YgdHdvIHRva2VuczogdGhlIHNlcnZpY2UKKyAgICAvLyBuYW1lIGFuZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwuCisgICAgaWYgKHRva2Vucy5zaXplKCkgPT0gMikgeworICAgICAgLy8gU2VhcmNoIGZvciBhIHByb2Nlc3NvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIG5hbWUuCisgICAgICBzZXJ2aWNlc190OjppdGVyYXRvciBpdCA9IHNlcnZpY2VzLmZpbmQodG9rZW5zWzBdKTsKKworICAgICAgaWYgKGl0ICE9IHNlcnZpY2VzLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBpdC0+c2Vjb25kOworICAgICAgICAvLyBMZXQgdGhlIHByb2Nlc3NvciByZWdpc3RlcmVkIGZvciB0aGlzIHNlcnZpY2UgbmFtZQorICAgICAgICAvLyBwcm9jZXNzIHRoZSBtZXNzYWdlLgorICAgICAgICByZXR1cm4gcHJvY2Vzc29yCisgICAgICAgICAgICAtPnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvdG9jb2w6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdG9rZW5zWzFdLCB0eXBlLCBzZXFpZCkpLAorICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBVbmtub3duIHNlcnZpY2UuCisgICAgICAgIHRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLCAKKyAgICAgICAgICAgICJVbmtub3duIHNlcnZpY2U6ICIgKyB0b2tlbnNbMF0gKworCQkJCSIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRva2Vucy5zaXplKCkgPT0gMSkgeworCSAgaWYgKGRlZmF1bHRQcm9jZXNzb3IpIHsKKyAgICAgICAgLy8gbm9uLW11bHRpcGxleGVkIGNsaWVudCBmb3J3YXJkcyB0byBkZWZhdWx0IHByb2Nlc3NvcgorICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3NvciAgICAgICAgICAgIAorICAgICAgICAgICAgLT5wcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb3RvY29sOjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHRva2Vuc1swXSwgdHlwZSwgc2VxaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpOworCSAgfSBlbHNlIHsKKwkJdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsCisJCQkiTm9uLW11bHRpcGxleGVkIGNsaWVudCByZXF1ZXN0IGRyb3BwZWQuICIKKwkJCSJEaWQgeW91IGZvcmdldCB0byBjYWxsIGRlZmF1bHRQcm9jZXNzb3IoKT8iKTsKKwkgIH0KKyAgICB9IGVsc2UgeworCQl0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwKKwkJICAgICJXcm9uZyBudW1iZXIgb2YgdG9rZW5zLiIpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICAvKiogTWFwIG9mIHNlcnZpY2UgcHJvY2Vzc29yIG9iamVjdHMsIGluZGV4ZWQgYnkgc2VydmljZSBuYW1lcy4gKi8KKyAgc2VydmljZXNfdCBzZXJ2aWNlczsKKyAgCisgIC8vISBJZiBhIG5vbi1tdWx0aSBjbGllbnQgcmVxdWVzdHMgc29tZXRoaW5nLCBpdCBnb2VzIHRvIHRoZQorICAvLyEgZGVmYXVsdCBwcm9jZXNzb3IgKGlmIG9uZSBpcyBkZWZpbmVkKSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBkZWZhdWx0UHJvY2Vzc29yOworfTsKK30KK30KKworI2VuZGlmIC8vIFRIUklGVF9UTVVMVElQTEVYRURQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NGY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QqIGtCYXNlNjRFbmNvZGVUYWJsZQorICAgID0gKGNvbnN0IHVpbnQ4X3QqKSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKwordm9pZCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QqIGluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QqIGJ1ZikgeworICBidWZbMF0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzBdID4+IDIpICYgMHgzZl07CisgIGlmIChsZW4gPT0gMykgeworICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzBdIDw8IDQpICYgMHgzMCkgfCAoKGluWzFdID4+IDQpICYgMHgwZildOworICAgIGJ1ZlsyXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzFdIDw8IDIpICYgMHgzYykgfCAoKGluWzJdID4+IDYpICYgMHgwMyldOworICAgIGJ1ZlszXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVtpblsyXSAmIDB4M2ZdOworICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7CisgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgJiAweDMwKSB8ICgoaW5bMV0gPj4gNCkgJiAweDBmKV07CisgICAgYnVmWzJdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblsxXSA8PCAyKSAmIDB4M2NdOworICB9IGVsc2UgeyAvLyBsZW4gPT0gMQorICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPDwgNCkgJiAweDMwXTsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrQmFzZTY0RGVjb2RlVGFibGVbMjU2XSA9IHsKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4M2UsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgzZiwKKyAgICAweDM0LAorICAgIDB4MzUsCisgICAgMHgzNiwKKyAgICAweDM3LAorICAgIDB4MzgsCisgICAgMHgzOSwKKyAgICAweDNhLAorICAgIDB4M2IsCisgICAgMHgzYywKKyAgICAweDNkLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgwMCwKKyAgICAweDAxLAorICAgIDB4MDIsCisgICAgMHgwMywKKyAgICAweDA0LAorICAgIDB4MDUsCisgICAgMHgwNiwKKyAgICAweDA3LAorICAgIDB4MDgsCisgICAgMHgwOSwKKyAgICAweDBhLAorICAgIDB4MGIsCisgICAgMHgwYywKKyAgICAweDBkLAorICAgIDB4MGUsCisgICAgMHgwZiwKKyAgICAweDEwLAorICAgIDB4MTEsCisgICAgMHgxMiwKKyAgICAweDEzLAorICAgIDB4MTQsCisgICAgMHgxNSwKKyAgICAweDE2LAorICAgIDB4MTcsCisgICAgMHgxOCwKKyAgICAweDE5LAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4MWEsCisgICAgMHgxYiwKKyAgICAweDFjLAorICAgIDB4MWQsCisgICAgMHgxZSwKKyAgICAweDFmLAorICAgIDB4MjAsCisgICAgMHgyMSwKKyAgICAweDIyLAorICAgIDB4MjMsCisgICAgMHgyNCwKKyAgICAweDI1LAorICAgIDB4MjYsCisgICAgMHgyNywKKyAgICAweDI4LAorICAgIDB4MjksCisgICAgMHgyYSwKKyAgICAweDJiLAorICAgIDB4MmMsCisgICAgMHgyZCwKKyAgICAweDJlLAorICAgIDB4MmYsCisgICAgMHgzMCwKKyAgICAweDMxLAorICAgIDB4MzIsCisgICAgMHgzMywKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorfTsKKwordm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGJ1ZlswXSA9IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzBdXSA8PCAyKSB8IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA+PiA0KTsKKyAgaWYgKGxlbiA+IDIpIHsKKyAgICBidWZbMV0gPSAoKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dIDw8IDQpICYgMHhmMCkgfCAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPj4gMik7CisgICAgaWYgKGxlbiA+IDMpIHsKKyAgICAgIGJ1ZlsyXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsyXV0gPDwgNikgJiAweGMwKSB8IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzNdXSk7CisgICAgfQorICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTY3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvLyBpbiBtdXN0IGJlIGF0IGxlYXN0IGxlbiBieXRlcworLy8gbGVuIG11c3QgYmUgMSwgMiwgb3IgMworLy8gYnVmIG11c3QgYmUgYSBidWZmZXIgb2YgYXQgbGVhc3QgNCBieXRlcyBhbmQgbWF5IG5vdCBvdmVybGFwIGluCisvLyB0aGUgZGF0YSBpcyBub3QgcGFkZGVkIHdpdGggJz0nOyB0aGUgY2FsbGVyIGNhbiBkbyB0aGlzIGlmIGRlc2lyZWQKK3ZvaWQgYmFzZTY0X2VuY29kZShjb25zdCB1aW50OF90KiBpbiwgdWludDMyX3QgbGVuLCB1aW50OF90KiBidWYpOworCisvLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBjb250YWluIGJhc2U2NCBlbmNvZGVkIHZhbHVlcworLy8gYnVmIHdpbGwgYmUgY2hhbmdlZCB0byBjb250YWluIG91dHB1dCBieXRlcworLy8gbGVuIGlzIG51bWJlciBvZiBieXRlcyB0byBjb25zdW1lIGZyb20gaW5wdXQgKG11c3QgYmUgMiwgMywgb3IgNCkKKy8vIG5vICc9JyBwYWRkaW5nIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgaW5wdXQKK3ZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCQVNFNjRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjc3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogVGhlIGRlZmF1bHQgYmluYXJ5IHByb3RvY29sIGZvciB0aHJpZnQuIFdyaXRlcyBhbGwgZGF0YSBpbiBhIHZlcnkgYmFzaWMKKyAqIGJpbmFyeSBmb3JtYXQsIGVzc2VudGlhbGx5IGp1c3Qgc3BpdHRpbmcgb3V0IHRoZSByYXcgYnl0ZXMuCisgKgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXyA9IFROZXR3b3JrQmlnRW5kaWFuPgorY2xhc3MgVEJpbmFyeVByb3RvY29sVCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9ICgoaW50MzJfdCkweGZmZmYwMDAwKTsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl8xID0gKChpbnQzMl90KTB4ODAwMTAwMDApOworICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApIHdhcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbCAod2hpY2ggaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZCkKKworICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBzdHJpbmdfbGltaXRfKDApLAorICAgICAgY29udGFpbmVyX2xpbWl0XygwKSwKKyAgICAgIHN0cmljdF9yZWFkXyhmYWxzZSksCisgICAgICBzdHJpY3Rfd3JpdGVfKHRydWUpIHt9CisKKyAgVEJpbmFyeVByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwKKyAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF93cml0ZSkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCisgICAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAorICAgICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CisKKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQorCisgIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7IGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7IH0KKworICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgeworICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOworICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7CisgIH0KKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IFN0clR5cGUmIHN0cik7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8qKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZE1hcEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkTGlzdEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+OjpyZWFkQm9vbDsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+CisgIGlubGluZSB1aW50MzJfdCByZWFkU3RyaW5nKFN0clR5cGUmIHN0cik7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+CisgIHVpbnQzMl90IHJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwgaW50MzJfdCBzeik7CisKKyAgVHJhbnNwb3J0XyogdHJhbnNfOworCisgIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKKyAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOworCisgIC8vIEVuZm9yY2UgcHJlc2VuY2Ugb2YgdmVyc2lvbiBpZGVudGlmaWVyCisgIGJvb2wgc3RyaWN0X3JlYWRfOworICBib29sIHN0cmljdF93cml0ZV87Cit9OworCit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sOwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBUTEVCaW5hcnlQcm90b2NvbDsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGJpbmFyeSBwcm90b2NvbCBoYW5kbGVycworICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXyA9IFROZXR3b3JrQmlnRW5kaWFuPgorY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7CitwdWJsaWM6CisgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKCkKKyAgICA6IHN0cmluZ19saW1pdF8oMCksIGNvbnRhaW5lcl9saW1pdF8oMCksIHN0cmljdF9yZWFkXyhmYWxzZSksIHN0cmljdF93cml0ZV8odHJ1ZSkge30KKworICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VChpbnQzMl90IHN0cmluZ19saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3dyaXRlKQorICAgIDogc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAorICAgICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKKyAgICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSB7fQorCisgIHZpcnR1YWwgflRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKCkge30KKworICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQorCisgIHZvaWQgc2V0U3RyaWN0KGJvb2wgc3RyaWN0X3JlYWQsIGJvb2wgc3RyaWN0X3dyaXRlKSB7CisgICAgc3RyaWN0X3JlYWRfID0gc3RyaWN0X3JlYWQ7CisgICAgc3RyaWN0X3dyaXRlXyA9IHN0cmljdF93cml0ZTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOworICAgIFRQcm90b2NvbCogcHJvdDsKKyAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKKyAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPihzcGVjaWZpY190cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3JlYWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZV8pOworICAgIH0gZWxzZSB7CisgICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgQnl0ZU9yZGVyXz4odHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CisgIH0KKworcHJpdmF0ZToKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87CisgIGJvb2wgc3RyaWN0X3JlYWRfOworICBib29sIHN0cmljdF93cml0ZV87Cit9OworCit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRUcmFuc3BvcnQ+IFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRUcmFuc3BvcnQsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBUTEVCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2M+CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzM5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX1RDQ18KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICBpZiAodGhpcy0+c3RyaWN0X3dyaXRlXykgeworICAgIGludDMyX3QgdmVyc2lvbiA9IChWRVJTSU9OXzEpIHwgKChpbnQzMl90KW1lc3NhZ2VUeXBlKTsKKyAgICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgICAgd3NpemUgKz0gd3JpdGVJMzIodmVyc2lvbik7CisgICAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7CisgICAgd3NpemUgKz0gd3JpdGVJMzIoc2VxaWQpOworICAgIHJldHVybiB3c2l6ZTsKKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgICAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7CisgICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpbWVzc2FnZVR5cGUpOworICAgIHdzaXplICs9IHdyaXRlSTMyKHNlcWlkKTsKKyAgICByZXR1cm4gd3NpemU7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICAodm9pZCluYW1lOworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAodm9pZCluYW1lOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWZpZWxkVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiB3cml0ZUJ5dGUoKGludDhfdClUX1NUT1ApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWtleVR5cGUpOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCl2YWxUeXBlKTsKKyAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZWxlbVR5cGUpOworICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTGlzdEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKKyAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVNldEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgdWludDhfdCB0bXAgPSB2YWx1ZSA/IDEgOiAwOworICB0aGlzLT50cmFuc18tPndyaXRlKCZ0bXAsIDEpOworICByZXR1cm4gMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJmJ5dGUsIDEpOworICByZXR1cm4gMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICBpbnQxNl90IG5ldCA9IChpbnQxNl90KUJ5dGVPcmRlcl86OnRvV2lyZTE2KGkxNik7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDIpOworICByZXR1cm4gMjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICBpbnQzMl90IG5ldCA9IChpbnQzMl90KUJ5dGVPcmRlcl86OnRvV2lyZTMyKGkzMik7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDQpOworICByZXR1cm4gNDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OnRvV2lyZTY0KGk2NCk7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDgpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CisKKyAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKKyAgYml0cyA9IEJ5dGVPcmRlcl86OnRvV2lyZTY0KGJpdHMpOworICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7CisgIHJldHVybiA4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTdHJpbmcoY29uc3QgU3RyVHlwZSYgc3RyKSB7CisgIGlmIChzdHIuc2l6ZSgpID4gc3RhdGljX2Nhc3Q8c2l6ZV90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDMyX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIuc2l6ZSgpKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CisgIGlmIChzaXplID4gMCkgeworICAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNpemUpOworICB9CisgIHJldHVybiByZXN1bHQgKyBzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RyaW5nKHN0cik7Cit9CisKKy8qKgorICogUmVhZGluZyBmdW5jdGlvbnMKKyAqLworCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIGludDMyX3Qgc3o7CisgIHJlc3VsdCArPSByZWFkSTMyKHN6KTsKKworICBpZiAoc3ogPCAwKSB7CisgICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIKKyAgICBpbnQzMl90IHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaWRlbnRpZmllciIpOworICAgIH0KKyAgICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKHN6ICYgMHgwMDAwMDBmZik7CisgICAgcmVzdWx0ICs9IHJlYWRTdHJpbmcobmFtZSk7CisgICAgcmVzdWx0ICs9IHJlYWRJMzIoc2VxaWQpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLT5zdHJpY3RfcmVhZF8pIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyB2ZXJzaW9uIGlkZW50aWZpZXIuLi4gb2xkIHByb3RvY29sIGNsaWVudCBpbiBzdHJpY3QgbW9kZT8iKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSGFuZGxlIHByZS12ZXJzaW9uZWQgaW5wdXQKKyAgICAgIGludDhfdCB0eXBlOworICAgICAgcmVzdWx0ICs9IHJlYWRTdHJpbmdCb2R5KG5hbWUsIHN6KTsKKyAgICAgIHJlc3VsdCArPSByZWFkQnl0ZSh0eXBlKTsKKyAgICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSl0eXBlOworICAgICAgcmVzdWx0ICs9IHJlYWRJMzIoc2VxaWQpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNZXNzYWdlRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgbmFtZSA9ICIiOworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RydWN0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIGludDhfdCB0eXBlOworICByZXN1bHQgKz0gcmVhZEJ5dGUodHlwZSk7CisgIGZpZWxkVHlwZSA9IChUVHlwZSl0eXBlOworICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgeworICAgIGZpZWxkSWQgPSAwOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmVzdWx0ICs9IHJlYWRJMTYoZmllbGRJZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEZpZWxkRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgaW50OF90IGssIHY7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIGludDMyX3Qgc2l6ZWk7CisgIHJlc3VsdCArPSByZWFkQnl0ZShrKTsKKyAga2V5VHlwZSA9IChUVHlwZSlrOworICByZXN1bHQgKz0gcmVhZEJ5dGUodik7CisgIHZhbFR5cGUgPSAoVFR5cGUpdjsKKyAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOworICBpZiAoc2l6ZWkgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorICBzaXplID0gKHVpbnQzMl90KXNpemVpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNYXBFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICBpbnQ4X3QgZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50MzJfdCBzaXplaTsKKyAgcmVzdWx0ICs9IHJlYWRCeXRlKGUpOworICBlbGVtVHlwZSA9IChUVHlwZSllOworICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7CisgIGlmIChzaXplaSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmICh0aGlzLT5jb250YWluZXJfbGltaXRfICYmIHNpemVpID4gdGhpcy0+Y29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisgIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIGludDhfdCBlOworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHNpemVpOworICByZXN1bHQgKz0gcmVhZEJ5dGUoZSk7CisgIGVsZW1UeXBlID0gKFRUeXBlKWU7CisgIHJlc3VsdCArPSByZWFkSTMyKHNpemVpKTsKKyAgaWYgKHNpemVpIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKHRoaXMtPmNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiB0aGlzLT5jb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKyAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU2V0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkQm9vbChib29sJiB2YWx1ZSkgeworICB1aW50OF90IGJbMV07CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKKyAgdmFsdWUgPSAqKGludDhfdCopYiAhPSAwOworICByZXR1cm4gMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgdWludDhfdCBiWzFdOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwoYiwgMSk7CisgIGJ5dGUgPSAqKGludDhfdCopYjsKKyAgcmV0dXJuIDE7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgdW5pb24gYnl0ZXMgeworICAgIHVpbnQ4X3QgYlsyXTsKKyAgICBpbnQxNl90IGFsbDsKKyAgfSB0aGVCeXRlczsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDIpOworICBpMTYgPSAoaW50MTZfdClCeXRlT3JkZXJfOjpmcm9tV2lyZTE2KHRoZUJ5dGVzLmFsbCk7CisgIHJldHVybiAyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgIHVuaW9uIGJ5dGVzIHsKKyAgICB1aW50OF90IGJbNF07CisgICAgaW50MzJfdCBhbGw7CisgIH0gdGhlQnl0ZXM7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA0KTsKKyAgaTMyID0gKGludDMyX3QpQnl0ZU9yZGVyXzo6ZnJvbVdpcmUzMih0aGVCeXRlcy5hbGwpOworICByZXR1cm4gNDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkSTY0KGludDY0X3QmIGk2NCkgeworICB1bmlvbiBieXRlcyB7CisgICAgdWludDhfdCBiWzhdOworICAgIGludDY0X3QgYWxsOworICB9IHRoZUJ5dGVzOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgOCk7CisgIGk2NCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OmZyb21XaXJlNjQodGhlQnl0ZXMuYWxsKTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOworCisgIHVuaW9uIGJ5dGVzIHsKKyAgICB1aW50OF90IGJbOF07CisgICAgdWludDY0X3QgYWxsOworICB9IHRoZUJ5dGVzOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgOCk7CisgIHRoZUJ5dGVzLmFsbCA9IEJ5dGVPcmRlcl86OmZyb21XaXJlNjQodGhlQnl0ZXMuYWxsKTsKKyAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4odGhlQnl0ZXMuYWxsKTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RyaW5nKFN0clR5cGUmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQ7CisgIGludDMyX3Qgc2l6ZTsKKyAgcmVzdWx0ID0gcmVhZEkzMihzaXplKTsKKyAgcmV0dXJuIHJlc3VsdCArIHJlYWRTdHJpbmdCb2R5KHN0ciwgc2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RyaW5nKHN0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RyaW5nQm9keShTdHJUeXBlJiBzdHIsIGludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCByZXN1bHQgPSAwOworCisgIC8vIENhdGNoIGVycm9yIGNhc2VzCisgIGlmIChzaXplIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9CisgIGlmICh0aGlzLT5zdHJpbmdfbGltaXRfID4gMCAmJiBzaXplID4gdGhpcy0+c3RyaW5nX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisKKyAgLy8gQ2F0Y2ggZW1wdHkgc3RyaW5nIGNhc2UKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIHN0ci5jbGVhcigpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyBUcnkgdG8gYm9ycm93IGZpcnN0CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd19idWY7CisgIHVpbnQzMl90IGdvdCA9IHNpemU7CisgIGlmICgoYm9ycm93X2J1ZiA9IHRoaXMtPnRyYW5zXy0+Ym9ycm93KE5VTEwsICZnb3QpKSkgeworICAgIHN0ci5hc3NpZ24oKGNvbnN0IGNoYXIqKWJvcnJvd19idWYsIHNpemUpOworICAgIHRoaXMtPnRyYW5zXy0+Y29uc3VtZShzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHN0ci5yZXNpemUoc2l6ZSk7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3RyWzBdKSwgc2l6ZSk7CisgIHJldHVybiAodWludDMyX3Qpc2l6ZTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX1RDQ18KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZmI0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBDKysgSW1wbGVtZW50YXRpb24gb2YgdGhlIENvbXBhY3QgUHJvdG9jb2wgYXMgZGVzY3JpYmVkIGluIFRIUklGVC0xMTAKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitjbGFzcyBUQ29tcGFjdFByb3RvY29sVCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50OF90IFBST1RPQ09MX0lEID0gKGludDhfdCkweDgydTsKKyAgc3RhdGljIGNvbnN0IGludDhfdCBWRVJTSU9OX04gPSAxOworICBzdGF0aWMgY29uc3QgaW50OF90IFZFUlNJT05fTUFTSyA9IDB4MWY7ICAgICAgIC8vIDAwMDEgMTExMQorCitwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVFlQRV9NQVNLID0gKGludDhfdCkweEUwdTsgLy8gMTExMCAwMDAwCisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVFlQRV9CSVRTID0gMHgwNzsgICAgICAgICAgLy8gMDAwMCAwMTExCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICBUcmFuc3BvcnRfKiB0cmFuc187CisKKyAgLyoqCisgICAqIChXcml0aW5nKSBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZQorICAgKiBzbyBpdCBjYW4gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgKi8KKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIFRUeXBlIGZpZWxkVHlwZTsKKyAgICBpbnQxNl90IGZpZWxkSWQ7CisgIH0gYm9vbGVhbkZpZWxkXzsKKworICAvKioKKyAgICogKFJlYWRpbmcpIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZQorICAgKiB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICovCisgIHN0cnVjdCB7CisgICAgYm9vbCBoYXNCb29sVmFsdWU7CisgICAgYm9vbCBib29sVmFsdWU7CisgIH0gYm9vbFZhbHVlXzsKKworICAvKioKKyAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICovCisKKyAgc3RkOjpzdGFjazxpbnQxNl90PiBsYXN0RmllbGRfOworICBpbnQxNl90IGxhc3RGaWVsZElkXzsKKworcHVibGljOgorICBUQ29tcGFjdFByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIGxhc3RGaWVsZElkXygwKSwKKyAgICAgIHN0cmluZ19saW1pdF8oMCksCisgICAgICBzdHJpbmdfYnVmXyhOVUxMKSwKKyAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKDApIHsKKyAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOworICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CisgIH0KKworICBUQ29tcGFjdFByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgbGFzdEZpZWxkSWRfKDApLAorICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgc3RyaW5nX2J1Zl8oTlVMTCksCisgICAgICBzdHJpbmdfYnVmX3NpemVfKDApLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHsKKyAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOworICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CisgIH0KKworICB+VENvbXBhY3RQcm90b2NvbFQoKSB7IGZyZWUoc3RyaW5nX2J1Zl8pOyB9CisKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKioKKyAgKiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmVkCisgICogb3V0cHV0IG9yIHB1cnBvc2UKKyAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgeyByZXR1cm4gMDsgfQorCitwcm90ZWN0ZWQ6CisgIGludDMyX3Qgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCB0eXBlT3ZlcnJpZGUpOworICB1aW50MzJfdCB3cml0ZUNvbGxlY3Rpb25CZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgaW50MzJfdCBzaXplKTsKKyAgdWludDMyX3Qgd3JpdGVWYXJpbnQzMih1aW50MzJfdCBuKTsKKyAgdWludDMyX3Qgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCBuKTsKKyAgdWludDY0X3QgaTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKTsKKyAgdWludDMyX3QgaTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKTsKKyAgaW5saW5lIGludDhfdCBnZXRDb21wYWN0VHlwZShjb25zdCBUVHlwZSB0dHlwZSk7CisKK3B1YmxpYzoKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKKworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoKKyAgICpUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCisgICAqIGVuY29kaW5nLgorICAgKi8KKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoKKyAgdWludDMyX3QgcmVhZFZhcmludDMyKGludDMyX3QmIGkzMik7CisgIHVpbnQzMl90IHJlYWRWYXJpbnQ2NChpbnQ2NF90JiBpNjQpOworICBpbnQzMl90IHppZ3phZ1RvSTMyKHVpbnQzMl90IG4pOworICBpbnQ2NF90IHppZ3phZ1RvSTY0KHVpbnQ2NF90IG4pOworICBUVHlwZSBnZXRUVHlwZShpbnQ4X3QgdHlwZSk7CisKKyAgLy8gQnVmZmVyIGZvciByZWFkaW5nIHN0cmluZ3MsIHNhdmUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvdG9jb2wgdG8KKyAgLy8gYXZvaWQgbWVtb3J5IGNodXJuIGFsbG9jYXRpbmcgbWVtb3J5IG9uIGV2ZXJ5IHN0cmluZyByZWFkCisgIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKKyAgdWludDhfdCogc3RyaW5nX2J1Zl87CisgIGludDMyX3Qgc3RyaW5nX2J1Zl9zaXplXzsKKyAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOworfTsKKwordHlwZWRlZiBUQ29tcGFjdFByb3RvY29sVDxUVHJhbnNwb3J0PiBUQ29tcGFjdFByb3RvY29sOworCisvKioKKyAqIENvbnN0cnVjdHMgY29tcGFjdCBwcm90b2NvbCBoYW5kbGVycworICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkgOiBzdHJpbmdfbGltaXRfKDApLCBjb250YWluZXJfbGltaXRfKDApIHt9CisKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKKyAgICA6IHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHt9CisKKyAgdmlydHVhbCB+VENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkge30KKworICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOworICAgIFRQcm90b2NvbCogcHJvdDsKKyAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKKyAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4oc3BlY2lmaWNfdHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8pOworICAgIH0gZWxzZSB7CisgICAgICBwcm90ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8pOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgfQorCitwcml2YXRlOgorICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKK307CisKK3R5cGVkZWYgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRUcmFuc3BvcnQ+IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmZWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpAQCAtMCwwICsxLDgyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfVENDXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfVENDXyAxCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uZmlnLmgiCisKKy8qCisgKiBUQ29tcGFjdFByb3RvY29sOjppKlRvWmlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAorICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCisgKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yay4KKyAqIElmIGFueW9uZSBlbmNvdW50ZXJzIHRoaXMgZXJyb3IsIHdlIGNhbiB0cnkgdG8gZmlndXJlIG91dCB0aGUgYmVzdAorICogd2F5IHRvIGltcGxlbWVudCBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IG9uIHRoZWlyIHBsYXRmb3JtLgorICovCisjaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisjZW5kaWYKKyNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorIyBlcnJvciAiVENvbXBhY3RQcm90b2NvbCBjdXJyZW50bHkgb25seSB3b3JrcyBpZiBhIHNpZ25lZCByaWdodCBzaGlmdCBpcyBhcml0aG1ldGljIgorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBVTkxJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAwKSkKKyNlbHNlCisjZGVmaW5lIFVOTElLRUxZKHZhbCkgKHZhbCkKKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7CisKK25hbWVzcGFjZSBkZXRhaWwgeyBuYW1lc3BhY2UgY29tcGFjdCB7CisKK2VudW0gVHlwZXMgeworICBDVF9TVE9QICAgICAgICAgICA9IDB4MDAsCisgIENUX0JPT0xFQU5fVFJVRSAgID0gMHgwMSwKKyAgQ1RfQk9PTEVBTl9GQUxTRSAgPSAweDAyLAorICBDVF9CWVRFICAgICAgICAgICA9IDB4MDMsCisgIENUX0kxNiAgICAgICAgICAgID0gMHgwNCwKKyAgQ1RfSTMyICAgICAgICAgICAgPSAweDA1LAorICBDVF9JNjQgICAgICAgICAgICA9IDB4MDYsCisgIENUX0RPVUJMRSAgICAgICAgID0gMHgwNywKKyAgQ1RfQklOQVJZICAgICAgICAgPSAweDA4LAorICBDVF9MSVNUICAgICAgICAgICA9IDB4MDksCisgIENUX1NFVCAgICAgICAgICAgID0gMHgwQSwKKyAgQ1RfTUFQICAgICAgICAgICAgPSAweDBCLAorICBDVF9TVFJVQ1QgICAgICAgICA9IDB4MEMKK307CisKK2NvbnN0IGludDhfdCBUVHlwZVRvQ1R5cGVbMTZdID0geworICBDVF9TVE9QLCAvLyBUX1NUT1AKKyAgMCwgLy8gdW51c2VkCisgIENUX0JPT0xFQU5fVFJVRSwgLy8gVF9CT09MCisgIENUX0JZVEUsIC8vIFRfQllURQorICBDVF9ET1VCTEUsIC8vIFRfRE9VQkxFCisgIDAsIC8vIHVudXNlZAorICBDVF9JMTYsIC8vIFRfSTE2CisgIDAsIC8vIHVudXNlZAorICBDVF9JMzIsIC8vIFRfSTMyCisgIDAsIC8vIHVudXNlZAorICBDVF9JNjQsIC8vIFRfSTY0CisgIENUX0JJTkFSWSwgLy8gVF9TVFJJTkcKKyAgQ1RfU1RSVUNULCAvLyBUX1NUUlVDVAorICBDVF9NQVAsIC8vIFRfTUFQCisgIENUX1NFVCwgLy8gVF9TRVQKKyAgQ1RfTElTVCwgLy8gVF9MSVNUCit9OworCit9fSAvLyBlbmQgZGV0YWlsOjpjb21wYWN0IG5hbWVzcGFjZQorCisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWVzc2FnZUJlZ2luKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKFBST1RPQ09MX0lEKTsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spIHwgKCgoaW50MzJfdCltZXNzYWdlVHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKKyAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzZXFpZCk7CisgIHdzaXplICs9IHdyaXRlU3RyaW5nKG5hbWUpOworICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQorICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKDwgMTUpLAorICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQorICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIGlmIChmaWVsZFR5cGUgPT0gVF9CT09MKSB7CisgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gbmFtZTsKKyAgICBib29sZWFuRmllbGRfLmZpZWxkVHlwZSA9IGZpZWxkVHlwZTsKKyAgICBib29sZWFuRmllbGRfLmZpZWxkSWQgPSBmaWVsZElkOworICB9IGVsc2UgeworICAgIHJldHVybiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQsIC0xKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRmllbGRTdG9wKCkgeworICByZXR1cm4gd3JpdGVCeXRlKFRfU1RPUCk7Cit9CisKKy8qKgorICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgKHZvaWQpIG5hbWU7CisgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gPSAwOworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgKiBvZiB0aGUgZmllbGQgc3RhY2suCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0RW5kKCkgeworICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnRvcCgpOworICBsYXN0RmllbGRfLnBvcCgpOworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSBhIExpc3QgaGVhZGVyLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKKy8qKgorICogV3JpdGUgYSBzZXQgaGVhZGVyLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCisvKioKKyAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisgKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgd3NpemUgKz0gd3JpdGVCeXRlKDApOworICB9IGVsc2UgeworICAgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2l6ZSk7CisgICAgd3NpemUgKz0gd3JpdGVCeXRlKGdldENvbXBhY3RUeXBlKGtleVR5cGUpIDw8IDQgfCBnZXRDb21wYWN0VHlwZSh2YWxUeXBlKSk7CisgIH0KKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKyAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gd3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAqIE90aGVyd2lzZSwgd3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIGlmIChib29sZWFuRmllbGRfLm5hbWUgIT0gTlVMTCkgeworICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgIHdzaXplCisgICAgICArPSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChib29sZWFuRmllbGRfLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDhfdD4odmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9GQUxTRSkpOworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKKyAgICB3c2l6ZQorICAgICAgKz0gd3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4odmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKSk7CisgIH0KKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJ5dGUsIDEpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBXcml0ZSBhbiBpMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICByZXR1cm4gd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMTYpKTsKK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMzIpKTsKK30KKworLyoqCisgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICByZXR1cm4gd3JpdGVWYXJpbnQ2NChpNjRUb1ppZ3phZyhpNjQpKTsKK30KKworLyoqCisgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CisKKyAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKKyAgYml0cyA9IFRIUklGVF9odG9sZWxsKGJpdHMpOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7CisgIHJldHVybiA4OworfQorCisvKioKKyAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHdyaXRlQmluYXJ5KHN0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgaWYoc3RyLnNpemUoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50MzJfdCBzc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIuc2l6ZSgpKTsKKyAgdWludDMyX3Qgd3NpemUgPSB3cml0ZVZhcmludDMyKHNzaXplKSA7CisgIC8vIGNoZWNraW5nIHNzaXplICsgd3NpemUgPiB1aW50X21heCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcmZsb3cgd2hpbGUgY2hlY2tpbmcgZm9yIG92ZXJmbG93cy4KKyAgLy8gdHJhbnNmb3JtaW5nIHRoZSBjaGVjayB0byBzc2l6ZSA+IHVpbnRfbWF4IC0gd3NpemUKKyAgaWYoc3NpemUgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSAtIHdzaXplKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB3c2l6ZSArPSBzc2l6ZTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3NpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKKy8vCisvLyBJbnRlcm5hbCBXcml0aW5nIG1ldGhvZHMKKy8vCisKKy8qKgorICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKKyAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgKiBib29sZWFuIGZpZWxkIGNhc2UuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgoraW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoCisgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgY29uc3QgaW50MTZfdCBmaWVsZElkLAorICAgIGludDhfdCB0eXBlT3ZlcnJpZGUpIHsKKyAgKHZvaWQpIG5hbWU7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgIGludDhfdCB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyBnZXRDb21wYWN0VHlwZShmaWVsZFR5cGUpIDogdHlwZU92ZXJyaWRlKTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkSWQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIGxhc3RGaWVsZElkXyA8PSAxNSkgeworICAgIC8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PigoZmllbGRJZCAtIGxhc3RGaWVsZElkXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgdHlwZVRvV3JpdGUpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCisgICAgd3NpemUgKz0gd3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICB3c2l6ZSArPSB3cml0ZUkxNihmaWVsZElkKTsKKyAgfQorCisgIGxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQ29sbGVjdGlvbkJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgd3NpemUgKz0gd3JpdGVCeXRlKHN0YXRpY19jYXN0PGludDhfdD4oc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpKTsKKyAgfSBlbHNlIHsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzaXplKTsKKyAgfQorICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVWYXJpbnQzMih1aW50MzJfdCBuKSB7CisgIHVpbnQ4X3QgYnVmWzVdOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisgIHRyYW5zXy0+d3JpdGUoYnVmLCB3c2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVWYXJpbnQ2NCh1aW50NjRfdCBuKSB7CisgIHVpbnQ4X3QgYnVmWzEwXTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKyAgdHJhbnNfLT53cml0ZShidWYsIHdzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50NjRfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKSB7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGwpIDw8IDEpIF4gKGwgPj4gNjMpOworfQorCisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obikgPDwgMSkgXiAobiA+PiAzMSk7Cit9CisKKy8qKgorICogR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgZGV0YWlsOjpjb21wYWN0OjpUeXBlcyB2YWx1ZQorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2ludDhfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6Z2V0Q29tcGFjdFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpIHsKKyAgcmV0dXJuIGRldGFpbDo6Y29tcGFjdDo6VFR5cGVUb0NUeXBlW3R0eXBlXTsKK30KKworLy8KKy8vIFJlYWRpbmcgTWV0aG9kcworLy8KKworLyoqCisgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNZXNzYWdlQmVnaW4oCisgICAgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICBpbnQzMl90JiBzZXFpZCkgeworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIGludDhfdCBwcm90b2NvbElkOworICBpbnQ4X3QgdmVyc2lvbkFuZFR5cGU7CisgIGludDhfdCB2ZXJzaW9uOworCisgIHJzaXplICs9IHJlYWRCeXRlKHByb3RvY29sSWQpOworICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIGlkZW50aWZpZXIiKTsKKyAgfQorCisgIHJzaXplICs9IHJlYWRCeXRlKHZlcnNpb25BbmRUeXBlKTsKKyAgdmVyc2lvbiA9IChpbnQ4X3QpKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiIpOworICB9CisKKyAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgcnNpemUgKz0gcmVhZFZhcmludDMyKHNlcWlkKTsKKyAgcnNpemUgKz0gcmVhZFN0cmluZyhuYW1lKTsKKworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb24gdGhlIGZpZWxkIHN0YWNrLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgbmFtZSA9ICIiOworICBsYXN0RmllbGRfLnB1c2gobGFzdEZpZWxkSWRfKTsKKyAgbGFzdEZpZWxkSWRfID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RydWN0RW5kKCkgeworICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnRvcCgpOworICBsYXN0RmllbGRfLnBvcCgpOworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7CisgICh2b2lkKSBuYW1lOworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIGludDhfdCBieXRlOworICBpbnQ4X3QgdHlwZTsKKworICByc2l6ZSArPSByZWFkQnl0ZShieXRlKTsKKyAgdHlwZSA9IChieXRlICYgMHgwZik7CisKKyAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICBmaWVsZFR5cGUgPSBUX1NUT1A7CisgICAgZmllbGRJZCA9IDA7CisgICAgcmV0dXJuIHJzaXplOworICB9CisKKyAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBpbnQxNl90IG1vZGlmaWVyID0gKGludDE2X3QpKCgodWludDhfdClieXRlICYgMHhmMCkgPj4gNCk7CisgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgLy8gbm90IGEgZGVsdGEsIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgorICAgIHJzaXplICs9IHJlYWRJMTYoZmllbGRJZCk7CisgIH0gZWxzZSB7CisgICAgZmllbGRJZCA9IChpbnQxNl90KShsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7CisgIH0KKyAgZmllbGRUeXBlID0gZ2V0VFR5cGUodHlwZSk7CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgaWYgKHR5cGUgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUgfHwKKyAgICAgIHR5cGUgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKSB7CisgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOworICAgIGJvb2xWYWx1ZV8uYm9vbFZhbHVlID0KKyAgICAgICh0eXBlID09IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKKyAgfQorCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBsYXN0RmllbGRJZF8gPSBmaWVsZElkOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQorICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAqICJjb3JyZWN0IiB0eXBlcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDMyX3QgcnNpemUgPSAwOworICBpbnQ4X3Qga3ZUeXBlID0gMDsKKyAgaW50MzJfdCBtc2l6ZSA9IDA7CisKKyAgcnNpemUgKz0gcmVhZFZhcmludDMyKG1zaXplKTsKKyAgaWYgKG1zaXplICE9IDApCisgICAgcnNpemUgKz0gcmVhZEJ5dGUoa3ZUeXBlKTsKKworICBpZiAobXNpemUgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBtc2l6ZSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorCisgIGtleVR5cGUgPSBnZXRUVHlwZSgoaW50OF90KSgodWludDhfdClrdlR5cGUgPj4gNCkpOworICB2YWxUeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoKHVpbnQ4X3Qpa3ZUeXBlICYgMHhmKSk7CisgIHNpemUgPSAodWludDMyX3QpbXNpemU7CisKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgKiB0cnVlIHNpemUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgaW50OF90IHNpemVfYW5kX3R5cGU7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgaW50MzJfdCBsc2l6ZTsKKworICByc2l6ZSArPSByZWFkQnl0ZShzaXplX2FuZF90eXBlKTsKKworICBsc2l6ZSA9ICgodWludDhfdClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKGxzaXplID09IDE1KSB7CisgICAgcnNpemUgKz0gcmVhZFZhcmludDMyKGxzaXplKTsKKyAgfQorCisgIGlmIChsc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIGxzaXplID4gY29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisKKyAgZWxlbVR5cGUgPSBnZXRUVHlwZSgoaW50OF90KShzaXplX2FuZF90eXBlICYgMHgwZikpOworICBzaXplID0gKHVpbnQzMl90KWxzaXplOworCisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICogdHJ1ZSBzaXplLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICByZXR1cm4gcmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKKy8qKgorICogUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICogYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBkdXJpbmcgcmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgcmVhZCBhIGJ5dGUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgIGlmIChib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9PSB0cnVlKSB7CisgICAgdmFsdWUgPSBib29sVmFsdWVfLmJvb2xWYWx1ZTsKKyAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IGZhbHNlOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGludDhfdCB2YWw7CisgICAgcmVhZEJ5dGUodmFsKTsKKyAgICB2YWx1ZSA9ICh2YWwgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUpOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qKgorICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgdWludDhfdCBiWzFdOworICB0cmFuc18tPnJlYWRBbGwoYiwgMSk7CisgIGJ5dGUgPSAqKGludDhfdCopYjsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgIGludDMyX3QgdmFsdWU7CisgIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHZhbHVlKTsKKyAgaTE2ID0gKGludDE2X3QpemlnemFnVG9JMzIodmFsdWUpOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgIGludDMyX3QgdmFsdWU7CisgIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHZhbHVlKTsKKyAgaTMyID0gemlnemFnVG9JMzIodmFsdWUpOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIGludDY0X3QgdmFsdWU7CisgIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDY0KHZhbHVlKTsKKyAgaTY0ID0gemlnemFnVG9JNjQodmFsdWUpOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgcmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKKworICB1bmlvbiB7CisgICAgdWludDY0X3QgYml0czsKKyAgICB1aW50OF90IGJbOF07CisgIH0gdTsKKyAgdHJhbnNfLT5yZWFkQWxsKHUuYiwgOCk7CisgIHUuYml0cyA9IFRIUklGVF9sZXRvaGxsKHUuYml0cyk7CisgIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KHUuYml0cyk7CisgIHJldHVybiA4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHJlYWRCaW5hcnkoc3RyKTsKK30KKworLyoqCisgKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICBpbnQzMl90IHJzaXplID0gMDsKKyAgaW50MzJfdCBzaXplOworCisgIHJzaXplICs9IHJlYWRWYXJpbnQzMihzaXplKTsKKyAgLy8gQ2F0Y2ggZW1wdHkgc3RyaW5nIGNhc2UKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIHN0ciA9ICIiOworICAgIHJldHVybiByc2l6ZTsKKyAgfQorCisgIC8vIENhdGNoIGVycm9yIGNhc2VzCisgIGlmIChzaXplIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9CisgIGlmIChzdHJpbmdfbGltaXRfID4gMCAmJiBzaXplID4gc3RyaW5nX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisKKyAgLy8gVXNlIHRoZSBoZWFwIGhlcmUgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyBmb3Igdi4gbGFyZ2Ugc3RyaW5ncworICBpZiAoc2l6ZSA+IHN0cmluZ19idWZfc2l6ZV8gfHwgc3RyaW5nX2J1Zl8gPT0gTlVMTCkgeworICAgIHZvaWQqIG5ld19zdHJpbmdfYnVmID0gc3RkOjpyZWFsbG9jKHN0cmluZ19idWZfLCAodWludDMyX3Qpc2l6ZSk7CisgICAgaWYgKG5ld19zdHJpbmdfYnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHN0cmluZ19idWZfID0gKHVpbnQ4X3QqKW5ld19zdHJpbmdfYnVmOworICAgIHN0cmluZ19idWZfc2l6ZV8gPSBzaXplOworICB9CisgIHRyYW5zXy0+cmVhZEFsbChzdHJpbmdfYnVmXywgc2l6ZSk7CisgIHN0ci5hc3NpZ24oKGNoYXIqKXN0cmluZ19idWZfLCBzaXplKTsKKworICByZXR1cm4gcnNpemUgKyAodWludDMyX3Qpc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFZhcmludDMyKGludDMyX3QmIGkzMikgeworICBpbnQ2NF90IHZhbDsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50NjQodmFsKTsKKyAgaTMyID0gKGludDMyX3QpdmFsOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFZhcmludDY0KGludDY0X3QmIGk2NCkgeworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIHVpbnQ2NF90IHZhbCA9IDA7CisgIGludCBzaGlmdCA9IDA7CisgIHVpbnQ4X3QgYnVmWzEwXTsgIC8vIDY0IGJpdHMgLyAoNyBiaXRzL2J5dGUpID0gMTAgYnl0ZXMuCisgIHVpbnQzMl90IGJ1Zl9zaXplID0gc2l6ZW9mKGJ1Zik7CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkID0gdHJhbnNfLT5ib3Jyb3coYnVmLCAmYnVmX3NpemUpOworCisgIC8vIEZhc3QgcGF0aC4KKyAgaWYgKGJvcnJvd2VkICE9IE5VTEwpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdWludDhfdCBieXRlID0gYm9ycm93ZWRbcnNpemVdOworICAgICAgcnNpemUrKzsKKyAgICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIHNoaWZ0ICs9IDc7CisgICAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICAgaTY0ID0gdmFsOworICAgICAgICB0cmFuc18tPmNvbnN1bWUocnNpemUpOworICAgICAgICByZXR1cm4gcnNpemU7CisgICAgICB9CisgICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2guCisgICAgICBpZiAoVU5MSUtFTFkocnNpemUgPT0gc2l6ZW9mKGJ1ZikpKSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTbG93IHBhdGguCisgIGVsc2UgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB1aW50OF90IGJ5dGU7CisgICAgICByc2l6ZSArPSB0cmFuc18tPnJlYWRBbGwoJmJ5dGUsIDEpOworICAgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgc2hpZnQgKz0gNzsKKyAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgICBpNjQgPSB2YWw7CisgICAgICAgIHJldHVybiByc2l6ZTsKKyAgICAgIH0KKyAgICAgIC8vIE1pZ2h0IGFzIHdlbGwgY2hlY2sgZm9yIGludmFsaWQgZGF0YSBvbiB0aGUgc2xvdyBwYXRoIHRvby4KKyAgICAgIGlmIChVTkxJS0VMWShyc2l6ZSA+PSBzaXplb2YoYnVmKSkpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp6aWd6YWdUb0kzMih1aW50MzJfdCBuKSB7CisgIHJldHVybiAobiA+PiAxKSBeIHN0YXRpY19jYXN0PHVpbnQzMl90Pigtc3RhdGljX2Nhc3Q8aW50MzJfdD4obiAmIDEpKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp6aWd6YWdUb0k2NCh1aW50NjRfdCBuKSB7CisgIHJldHVybiAobiA+PiAxKSBeIHN0YXRpY19jYXN0PHVpbnQ2NF90Pigtc3RhdGljX2Nhc3Q8aW50NjRfdD4obiAmIDEpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitUVHlwZSBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6Z2V0VFR5cGUoaW50OF90IHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgICByZXR1cm4gVF9TVE9QOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVF9CT09MOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9CWVRFOgorICAgICAgcmV0dXJuIFRfQllURTsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfSTE2OgorICAgICAgcmV0dXJuIFRfSTE2OworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9JMzI6CisgICAgICByZXR1cm4gVF9JMzI7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0k2NDoKKyAgICAgIHJldHVybiBUX0k2NDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFRfRE9VQkxFOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9CSU5BUlk6CisgICAgICByZXR1cm4gVF9TVFJJTkc7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0xJU1Q6CisgICAgICByZXR1cm4gVF9MSVNUOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9TRVQ6CisgICAgICByZXR1cm4gVF9TRVQ7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX01BUDoKKyAgICAgIHJldHVybiBUX01BUDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfU1RSVUNUOgorICAgICAgcmV0dXJuIFRfU1RSVUNUOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBURXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIikgKyAoY2hhcil0eXBlKTsKKyAgfQorfQorCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfVENDXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZDRhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitzdGF0aWMgc3RyaW5nIGJ5dGVfdG9faGV4KGNvbnN0IHVpbnQ4X3QgYnl0ZSkgeworICBjaGFyIGJ1ZlszXTsKKyAgaW50IHJldCA9IHN0ZDo6c3ByaW50ZihidWYsICIlMDJ4IiwgKGludClieXRlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOworICBhc3NlcnQocmV0ID09IDIpOworICBhc3NlcnQoYnVmWzJdID09ICdcMCcpOworICByZXR1cm4gYnVmOworfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworc3RyaW5nIFREZWJ1Z1Byb3RvY29sOjpmaWVsZFR5cGVOYW1lKFRUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9TVE9QOgorICAgIHJldHVybiAic3RvcCI7CisgIGNhc2UgVF9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgVF9CWVRFOgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgVF9JMTY6CisgICAgcmV0dXJuICJpMTYiOworICBjYXNlIFRfSTMyOgorICAgIHJldHVybiAiaTMyIjsKKyAgY2FzZSBUX1U2NDoKKyAgICByZXR1cm4gInU2NCI7CisgIGNhc2UgVF9JNjQ6CisgICAgcmV0dXJuICJpNjQiOworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgY2FzZSBUX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgVF9TVFJVQ1Q6CisgICAgcmV0dXJuICJzdHJ1Y3QiOworICBjYXNlIFRfTUFQOgorICAgIHJldHVybiAibWFwIjsKKyAgY2FzZSBUX1NFVDoKKyAgICByZXR1cm4gInNldCI7CisgIGNhc2UgVF9MSVNUOgorICAgIHJldHVybiAibGlzdCI7CisgIGNhc2UgVF9VVEY4OgorICAgIHJldHVybiAidXRmOCI7CisgIGNhc2UgVF9VVEYxNjoKKyAgICByZXR1cm4gInV0ZjE2IjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInVua25vd24iOworICB9Cit9CisKK3ZvaWQgVERlYnVnUHJvdG9jb2w6OmluZGVudFVwKCkgeworICBpbmRlbnRfc3RyXyArPSBzdHJpbmcoaW5kZW50X2luYywgJyAnKTsKK30KKwordm9pZCBURGVidWdQcm90b2NvbDo6aW5kZW50RG93bigpIHsKKyAgaWYgKGluZGVudF9zdHJfLmxlbmd0aCgpIDwgKHN0cmluZzo6c2l6ZV90eXBlKWluZGVudF9pbmMpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICB9CisgIGluZGVudF9zdHJfLmVyYXNlKGluZGVudF9zdHJfLmxlbmd0aCgpIC0gaW5kZW50X2luYyk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVBsYWluKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIGlmIChzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5sZW5ndGgoKSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5sZW5ndGgoKSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUluZGVudGVkKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIGlmIChzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgaWYgKGluZGVudF9zdHJfLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHVpbnQ2NF90IHRvdGFsX2xlbiA9IGluZGVudF9zdHJfLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpOworICBpZiAodG90YWxfbGVuID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKWluZGVudF9zdHJfLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGVudF9zdHJfLmxlbmd0aCgpKSk7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIubGVuZ3RoKCkpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRlbnRfc3RyXy5sZW5ndGgoKSArIHN0ci5sZW5ndGgoKSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjpzdGFydEl0ZW0oKSB7CisgIHVpbnQzMl90IHNpemU7CisKKyAgc3dpdGNoICh3cml0ZV9zdGF0ZV8uYmFjaygpKSB7CisgIGNhc2UgVU5JTklUOgorICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KKyAgICAvLyB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgIC8vIHJldHVybiB3cml0ZUluZGVudGVkKHN0cik7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgU1RSVUNUOgorICAgIHJldHVybiAwOworICBjYXNlIFNFVDoKKyAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7CisgIGNhc2UgTUFQX0tFWToKKyAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7CisgIGNhc2UgTUFQX1ZBTFVFOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7CisgIGNhc2UgTElTVDoKKyAgICBzaXplID0gd3JpdGVJbmRlbnRlZCgiWyIgKyB0b19zdHJpbmcobGlzdF9pZHhfLmJhY2soKSkgKyAiXSA9ICIpOworICAgIGxpc3RfaWR4Xy5iYWNrKCkrKzsKKyAgICByZXR1cm4gc2l6ZTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CisgIH0KK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OmVuZEl0ZW0oKSB7CisgIC8vIHVpbnQzMl90IHNpemU7CisKKyAgc3dpdGNoICh3cml0ZV9zdGF0ZV8uYmFjaygpKSB7CisgIGNhc2UgVU5JTklUOgorICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KKyAgICAvLyB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgIC8vIHJldHVybiB3cml0ZUluZGVudGVkKHN0cik7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgU1RSVUNUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBTRVQ6CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOworICBjYXNlIE1BUF9LRVk6CisgICAgd3JpdGVfc3RhdGVfLmJhY2soKSA9IE1BUF9WQUxVRTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBNQVBfVkFMVUU6CisgICAgd3JpdGVfc3RhdGVfLmJhY2soKSA9IE1BUF9LRVk7CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOworICBjYXNlIExJU1Q6CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOworICBkZWZhdWx0OgorICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkludmFsaWQgZW51bSB2YWx1ZS4iKTsKKyAgfQorfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gc3RhcnRJdGVtKCk7CisgIHNpemUgKz0gd3JpdGVQbGFpbihzdHIpOworICBzaXplICs9IGVuZEl0ZW0oKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAodm9pZClzZXFpZDsKKyAgc3RyaW5nIG10eXBlOworICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7CisgIGNhc2UgVF9DQUxMOgorICAgIG10eXBlID0gImNhbGwiOworICAgIGJyZWFrOworICBjYXNlIFRfUkVQTFk6CisgICAgbXR5cGUgPSAicmVwbHkiOworICAgIGJyZWFrOworICBjYXNlIFRfRVhDRVBUSU9OOgorICAgIG10eXBlID0gImV4biI7CisgICAgYnJlYWs7CisgIGNhc2UgVF9PTkVXQVk6CisgICAgbXR5cGUgPSAib25ld2F5IjsKKyAgICBicmVhazsKKyAgfQorCisgIHVpbnQzMl90IHNpemUgPSB3cml0ZUluZGVudGVkKCIoIiArIG10eXBlICsgIikgIiArIG5hbWUgKyAiKCIpOworICBpbmRlbnRVcCgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKKyAgaW5kZW50RG93bigpOworICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiKVxuIik7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gc3RhcnRJdGVtKCk7CisgIHNpemUgKz0gd3JpdGVQbGFpbihzdHJpbmcobmFtZSkgKyAiIHtcbiIpOworICBpbmRlbnRVcCgpOworICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNUUlVDVCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKKyAgc2l6ZSArPSBlbmRJdGVtKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIC8vIHNwcmludGYoaWRfc3RyLCAiJTAyZCIsIGZpZWxkSWQpOworICBzdHJpbmcgaWRfc3RyID0gdG9fc3RyaW5nKGZpZWxkSWQpOworICBpZiAoaWRfc3RyLmxlbmd0aCgpID09IDEpCisgICAgaWRfc3RyID0gJzAnICsgaWRfc3RyOworCisgIHJldHVybiB3cml0ZUluZGVudGVkKGlkX3N0ciArICI6ICIgKyBuYW1lICsgIiAoIiArIGZpZWxkVHlwZU5hbWUoZmllbGRUeXBlKSArICIpID0gIik7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgeworICBhc3NlcnQod3JpdGVfc3RhdGVfLmJhY2soKSA9PSBTVFJVQ1QpOworICByZXR1cm4gMDsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgeworICByZXR1cm4gMDsKKyAgLy8gd3JpdGVJbmRlbnRlZCgiKioqU1RPUCoqKlxuIik7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IG1hcHM/CisgIHVpbnQzMl90IGJzaXplID0gMDsKKyAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CisgIGJzaXplICs9IHdyaXRlUGxhaW4oCisgICAgICAibWFwPCIgKyBmaWVsZFR5cGVOYW1lKGtleVR5cGUpICsgIiwiICsgZmllbGRUeXBlTmFtZSh2YWxUeXBlKSArICI+IgorICAgICAgIlsiICsgdG9fc3RyaW5nKHNpemUpICsgIl0ge1xuIik7CisgIGluZGVudFVwKCk7CisgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTUFQX0tFWSk7CisgIHJldHVybiBic2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgYXJyYXlzLgorICB1aW50MzJfdCBic2l6ZSA9IDA7CisgIGJzaXplICs9IHN0YXJ0SXRlbSgpOworICBic2l6ZSArPSB3cml0ZVBsYWluKAorICAgICAgImxpc3Q8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKKyAgaW5kZW50VXAoKTsKKyAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhMSVNUKTsKKyAgbGlzdF9pZHhfLnB1c2hfYmFjaygwKTsKKyAgcmV0dXJuIGJzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOworICBsaXN0X2lkeF8ucG9wX2JhY2soKTsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOworICBzaXplICs9IGVuZEl0ZW0oKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgc2V0cy4KKyAgdWludDMyX3QgYnNpemUgPSAwOworICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgYnNpemUgKz0gd3JpdGVQbGFpbigKKyAgICAgICJzZXQ8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKKyAgaW5kZW50VXAoKTsKKyAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTRVQpOworICByZXR1cm4gYnNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKKyAgaW5kZW50RG93bigpOworICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOworICBzaXplICs9IGVuZEl0ZW0oKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICByZXR1cm4gd3JpdGVJdGVtKHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSgiMHgiICsgYnl0ZV90b19oZXgoYnl0ZSkpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTE2KSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpMzIpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGk2NCkpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhkdWIpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIC8vIFhYWCBSYXcvVVRGLTg/CisKKyAgc3RyaW5nIHRvX3Nob3cgPSBzdHI7CisgIGlmICh0b19zaG93Lmxlbmd0aCgpID4gKHN0cmluZzo6c2l6ZV90eXBlKXN0cmluZ19saW1pdF8pIHsKKyAgICB0b19zaG93ID0gc3RyLnN1YnN0cigwLCBzdHJpbmdfcHJlZml4X3NpemVfKTsKKyAgICB0b19zaG93ICs9ICJbLi4uXSgiICsgdG9fc3RyaW5nKHN0ci5sZW5ndGgoKSkgKyAiKSI7CisgIH0KKworICBzdHJpbmcgb3V0cHV0ID0gIlwiIjsKKworICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0b19zaG93LmJlZ2luKCk7IGl0ICE9IHRvX3Nob3cuZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoKml0ID09ICdcXCcpIHsKKyAgICAgIG91dHB1dCArPSAiXFxcXCI7CisgICAgfSBlbHNlIGlmICgqaXQgPT0gJyInKSB7CisgICAgICBvdXRwdXQgKz0gIlxcXCIiOworICAgICAgLy8gcGFzc2luZyBjaGFyYWN0ZXJzIDwwIHRvIHN0ZDo6aXNwcmludCBjYXVzZXMgYXNzZXJ0cy4gaXNwcmludCB0YWtlcyBhbgorICAgICAgLy8gaW50LCBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgb2Ygc2lnbiBleHRlbnNpb24KKyAgICB9IGVsc2UgaWYgKHN0ZDo6aXNwcmludCgodW5zaWduZWQgY2hhcikqaXQpKSB7CisgICAgICBvdXRwdXQgKz0gKml0OworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKCppdCkgeworICAgICAgY2FzZSAnXGEnOgorICAgICAgICBvdXRwdXQgKz0gIlxcYSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXGInOgorICAgICAgICBvdXRwdXQgKz0gIlxcYiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXGYnOgorICAgICAgICBvdXRwdXQgKz0gIlxcZiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXG4nOgorICAgICAgICBvdXRwdXQgKz0gIlxcbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXHInOgorICAgICAgICBvdXRwdXQgKz0gIlxcciI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXHQnOgorICAgICAgICBvdXRwdXQgKz0gIlxcdCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXHYnOgorICAgICAgICBvdXRwdXQgKz0gIlxcdiI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgb3V0cHV0ICs9ICJcXHgiOworICAgICAgICBvdXRwdXQgKz0gYnl0ZV90b19oZXgoKml0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXRwdXQgKz0gJ1wiJzsKKyAgcmV0dXJuIHdyaXRlSXRlbShvdXRwdXQpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgLy8gWFhYIEhleD8KKyAgcmV0dXJuIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhzdHIpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3OTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKgorCishISEgRVhQRVJJTUVOVEFMIENPREUgISEhCisKK1RoaXMgcHJvdG9jb2wgaXMgdmVyeSBtdWNoIGEgd29yayBpbiBwcm9ncmVzcy4KK0l0IGRvZXNuJ3QgaGFuZGxlIG1hbnkgY2FzZXMgcHJvcGVybHkuCitJdCB0aHJvd3MgZXhjZXB0aW9ucyBpbiBtYW55IGNhc2VzLgorSXQgcHJvYmFibHkgc2VnZmF1bHRzIGluIG1hbnkgY2FzZXMuCitCdWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0cyBhcmUgd2VsY29tZS4KK0NvbXBsYWludHMgYXJlIG5vdC4gOlIKKworKi8KKworLyoqCisgKiBQcm90b2NvbCB0aGF0IHByaW50cyB0aGUgcGF5bG9hZCBpbiBhIG5pY2UgaHVtYW4tcmVhZGFibGUgZm9ybWF0LgorICogUmVhZGluZyBmcm9tIHRoaXMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KKyAqCisgKi8KK2NsYXNzIFREZWJ1Z1Byb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+IHsKK3ByaXZhdGU6CisgIGVudW0gd3JpdGVfc3RhdGVfdCB7IFVOSU5JVCwgU1RSVUNULCBMSVNULCBTRVQsIE1BUF9LRVksIE1BUF9WQUxVRSB9OworCitwdWJsaWM6CisgIFREZWJ1Z1Byb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKSwKKyAgICAgIHN0cmluZ19wcmVmaXhfc2l6ZV8oREVGQVVMVF9TVFJJTkdfUFJFRklYX1NJWkUpIHsKKyAgICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFVOSU5JVCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19MSU1JVCA9IDI1NjsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9TVFJJTkdfUFJFRklYX1NJWkUgPSAxNjsKKworICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRTdHJpbmdQcmVmaXhTaXplKGludDMyX3Qgc3RyaW5nX3ByZWZpeF9zaXplKSB7IHN0cmluZ19wcmVmaXhfc2l6ZV8gPSBzdHJpbmdfcHJlZml4X3NpemU7IH0KKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKK3ByaXZhdGU6CisgIHZvaWQgaW5kZW50VXAoKTsKKyAgdm9pZCBpbmRlbnREb3duKCk7CisgIHVpbnQzMl90IHdyaXRlUGxhaW4oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisgIHVpbnQzMl90IHdyaXRlSW5kZW50ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisgIHVpbnQzMl90IHN0YXJ0SXRlbSgpOworICB1aW50MzJfdCBlbmRJdGVtKCk7CisgIHVpbnQzMl90IHdyaXRlSXRlbShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKTsKKworICBUVHJhbnNwb3J0KiB0cmFuc187CisKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICBpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZV87CisKKyAgc3RkOjpzdHJpbmcgaW5kZW50X3N0cl87CisgIHN0YXRpYyBjb25zdCBpbnQgaW5kZW50X2luYyA9IDI7CisKKyAgc3RkOjp2ZWN0b3I8d3JpdGVfc3RhdGVfdD4gd3JpdGVfc3RhdGVfOworICBzdGQ6OnZlY3RvcjxpbnQ+IGxpc3RfaWR4XzsKK307CisKKy8qKgorICogQ29uc3RydWN0cyBkZWJ1ZyBwcm90b2NvbCBoYW5kbGVycworICovCitjbGFzcyBURGVidWdQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7CitwdWJsaWM6CisgIFREZWJ1Z1Byb3RvY29sRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgflREZWJ1Z1Byb3RvY29sRmFjdG9yeSgpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBURGVidWdQcm90b2NvbCh0cmFucykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworLy8gVE9ETyhkcmVpc3MpOiBNb3ZlIChwYXJ0IG9mKSBUaHJpZnREZWJ1Z1N0cmluZyBpbnRvIGEgLmNwcCBmaWxlIGFuZCByZW1vdmUgdGhpcy4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+CitzdGQ6OnN0cmluZyBUaHJpZnREZWJ1Z1N0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOworICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKKworICB0cy53cml0ZSgmcHJvdG9jb2wpOworCisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3Qgc2l6ZTsKKyAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKK30KKworLy8gVE9ETyhkcmVpc3MpOiBUaGlzIGlzIGJhZGx5IGJyb2tlbi4gIERvbid0IHVzZSBpdCB1bmxlc3MgeW91IGFyZSBtZS4KKyNpZiAwCit0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3Q+CitzdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxPYmplY3Q+JiB2ZWMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisgIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgVERlYnVnUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOworCisgIC8vIEkgYW0gZ3Jvc3MhCisgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4oIlNvbWVSYW5kb21WZWN0b3IiKTsKKworICAvLyBUT0RPOiBGaXggdGhpcyB3aXRoIGEgdHJhaXQuCisgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKChUVHlwZSk5OSwgdmVjLnNpemUoKSk7CisgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPE9iamVjdD46OmNvbnN0X2l0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gdmVjLmJlZ2luKCk7IGl0ICE9IHZlYy5lbmQoKTsgKytpdCkgeworICAgIGl0LT53cml0ZSgmcHJvdG9jb2wpOworICB9CisgIHByb3RvY29sLndyaXRlTGlzdEVuZCgpOworCisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3Qgc2l6ZTsKKyAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKK30KKyNlbmRpZiAvLyAwCit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MmUzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0NQUF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3ZvaWQgVEhlYWRlclByb3RvY29sOjpyZXNldFByb3RvY29sKCkgeworICBpZiAocHJvdG9fICYmIHByb3RvSWRfID09IHRyYW5zXy0+Z2V0UHJvdG9jb2xJZCgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJvdG9JZF8gPSB0cmFuc18tPmdldFByb3RvY29sSWQoKTsKKworICBzd2l0Y2ggKHByb3RvSWRfKSB7CisgIGNhc2UgVF9CSU5BUllfUFJPVE9DT0w6CisgICAgcHJvdG9fID0gc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xUPFRIZWFkZXJUcmFuc3BvcnQ+ID4odHJhbnNfKTsKKyAgICBicmVhazsKKworICBjYXNlIFRfQ09NUEFDVF9QUk9UT0NPTDoKKyAgICBwcm90b18gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRDb21wYWN0UHJvdG9jb2xUPFRIZWFkZXJUcmFuc3BvcnQ+ID4odHJhbnNfKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHByb3RvY29sIHJlcXVlc3RlZCIpOworICB9Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFJZCkgeworICByZXNldFByb3RvY29sKCk7IC8vIFJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCBwcm90b2NvbHMKKyAgdHJhbnNfLT5zZXRTZXF1ZW5jZU51bWJlcihzZXFJZCk7CisgIHJldHVybiBwcm90b18tPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFJZCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZU1lc3NhZ2VFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUZpZWxkRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRTdG9wKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZU1hcEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTGlzdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlU2V0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVCb29sKHZhbHVlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVCeXRlKGJ5dGUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIHJldHVybiBwcm90b18tPndyaXRlSTE2KGkxNik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVJMzIoaTMyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUk2NChpNjQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVEb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlU3RyaW5nKHN0cik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJpbmFyeShzdHIpOworfQorCisvKioKKyAqIFJlYWRpbmcgZnVuY3Rpb25zCisgKi8KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxSWQpIHsKKyAgLy8gUmVhZCB0aGUgbmV4dCBmcmFtZSwgYW5kIGNoYW5nZSBwcm90b2NvbHMgaWYgbmVlZGVkCisgIHRyeSB7CisgICAgdHJhbnNfLT5yZXNldFByb3RvY29sKCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9IGNhdGNoIChjb25zdCBUQXBwbGljYXRpb25FeGNlcHRpb24mIGV4KSB7CisgICAgd3JpdGVNZXNzYWdlQmVnaW4oIiIsIFRfRVhDRVBUSU9OLCAwKTsKKyAgICBleC53cml0ZSgoVFByb3RvY29sKil0aGlzKTsKKyAgICB3cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB0cmFuc18tPmZsdXNoKCk7CisKKyAgICAvLyBUaGUgZnJhbWluZyBpcyBzdGlsbCBnb29kLCBidXQgd2UgZG9uJ3Qga25vdyBhYm91dCB0aGlzIHByb3RvY29sLgorICAgIC8vIEluIHRoZSBmdXR1cmUsIHRoaXMgY291bGQgYmUgbWFkZSBhIGNsaWVudC1zaWRlIG9ubHkgZXJyb3IgaWYKKyAgICAvLyBjb25uZWN0aW9uIHBvb2xpbmcgaXMgdXNlZC4KKyAgICB0aHJvdyBleDsKKyAgfQorICByZXR1cm4gcHJvdG9fLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFJZCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRNZXNzYWdlRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU3RydWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRmllbGRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRGaWVsZEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWFwRW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkTWFwRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRMaXN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkTGlzdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFNldEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFNldEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRCb29sKHZhbHVlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEJ5dGUoYnl0ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEkxNihpMTYpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRJMzIoaTMyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkSTY0KGludDY0X3QmIGk2NCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkSTY0KGk2NCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkRG91YmxlKGR1Yik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBiaW5hcnkpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEJpbmFyeShiaW5hcnkpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlMmI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfSF8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEhlYWRlclRyYW5zcG9ydDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogVGhlIGhlYWRlciBwcm90b2NvbCBmb3IgdGhyaWZ0LiBSZWFkcyB1bmZyYW1lZCwgZnJhbWVkLCBoZWFkZXIgZm9ybWF0LAorICogYW5kIGh0dHAKKyAqCisgKi8KK2NsYXNzIFRIZWFkZXJQcm90b2NvbCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4geworcHJvdGVjdGVkOgorcHVibGljOgorICB2b2lkIHJlc2V0UHJvdG9jb2woKTsKKworICBleHBsaWNpdCBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKKyAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgVEhlYWRlclByb3RvY29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgaW5UcmFucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgb3V0VHJhbnMsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwcm90b0lkID0gVF9DT01QQUNUX1BST1RPQ09MKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUSGVhZGVyUHJvdG9jb2w+KAorICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEhlYWRlclRyYW5zcG9ydChpblRyYW5zLCBvdXRUcmFucykpKSwKKyAgICAgIHRyYW5zXyhzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRIZWFkZXJUcmFuc3BvcnQ+KGdldFRyYW5zcG9ydCgpKSksCisgICAgICBwcm90b0lkXyhwcm90b0lkKSB7CisgICAgdHJhbnNfLT5zZXRQcm90b2NvbElkKHByb3RvSWQpOworICAgIHJlc2V0UHJvdG9jb2woKTsKKyAgfQorCisgIH5USGVhZGVyUHJvdG9jb2woKSB7fQorCisgIC8qKgorICAgKiBGdW5jdGlvbnMgdG8gd29yayB3aXRoIGhlYWRlcnMgYnkgY2FsbGluZyBpbnRvIFRIZWFkZXJUcmFuc3BvcnQKKyAgICovCisgIHZvaWQgc2V0UHJvdG9jb2xJZCh1aW50MTZfdCBwcm90b0lkKSB7CisgICAgdHJhbnNfLT5zZXRQcm90b2NvbElkKHByb3RvSWQpOworICAgIHJlc2V0UHJvdG9jb2woKTsKKyAgfQorCisgIHR5cGVkZWYgVEhlYWRlclRyYW5zcG9ydDo6U3RyaW5nVG9TdHJpbmdNYXAgU3RyaW5nVG9TdHJpbmdNYXA7CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHdyaXRlIGhlYWRlcnMKKyAgdm9pZCBzZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgdHJhbnNfLT5zZXRIZWFkZXIoa2V5LCB2YWx1ZSk7CisgIH0KKworICB2b2lkIGNsZWFySGVhZGVycygpIHsgdHJhbnNfLT5jbGVhckhlYWRlcnMoKTsgfQorCisgIFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRXcml0ZUhlYWRlcnMoKSB7IHJldHVybiB0cmFuc18tPmdldFdyaXRlSGVhZGVycygpOyB9CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHJlYWQgaGVhZGVycworICBjb25zdCBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0SGVhZGVycygpIGNvbnN0IHsgcmV0dXJuIHRyYW5zXy0+Z2V0SGVhZGVycygpOyB9CisKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgorICAgKi8KKworICAvKm9sKi8gdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcUlkKTsKKworICAvKm9sKi8gdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOworCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOworCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8qKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxSWQpOworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKKworICB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKKworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZE1hcEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZFNldEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKKyAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgorICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD46OnJlYWRCb29sOworCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOworCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKKworICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBiaW5hcnkpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUSGVhZGVyVHJhbnNwb3J0PiB0cmFuc187CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9fOworICB1aW50MzJfdCBwcm90b0lkXzsKK307CisKK2NsYXNzIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7CitwdWJsaWM6CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICBUSGVhZGVyUHJvdG9jb2wqIGhlYWRlclByb3RvY29sCisgICAgICAgID0gbmV3IFRIZWFkZXJQcm90b2NvbCh0cmFucywgdHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluVHJhbnMsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBvdXRUcmFucykgeworICAgIFRIZWFkZXJQcm90b2NvbCogaGVhZGVyUHJvdG9jb2wgPSBuZXcgVEhlYWRlclByb3RvY29sKGluVHJhbnMsIG91dFRyYW5zLCBUX0JJTkFSWV9QUk9UT0NPTCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KGhlYWRlclByb3RvY29sKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjaWZuZGVmIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc2ZmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCkBAIC0wLDAgKzEsMTEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPGJvb3N0L2xvY2FsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbWF0aC9zcGVjaWFsX2Z1bmN0aW9ucy9mcGNsYXNzaWZ5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL3NpZ24uaHBwPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLy8gU3RhdGljIGRhdGEKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RTdGFydCA9ICd7JzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0RW5kID0gJ30nOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheVN0YXJ0ID0gJ1snOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheUVuZCA9ICddJzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OUGFpclNlcGFyYXRvciA9ICc6JzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQmFja3NsYXNoID0gJ1xcJzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OU3RyaW5nRGVsaW1pdGVyID0gJyInOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05Fc2NhcGVDaGFyID0gJ3UnOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0pTT05Fc2NhcGVQcmVmaXgoIlxcdTAwIik7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrVGhyaWZ0VmVyc2lvbjEgPSAxOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdE5hbigiTmFOIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdEluZmluaXR5KCJJbmZpbml0eSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KCItSW5maW5pdHkiKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUJvb2woInRmIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lQnl0ZSgiaTgiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJMTYoImkxNiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUkzMigiaTMyIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTY0KCJpNjQiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVEb3VibGUoImRibCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVN0cnVjdCgicmVjIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU3RyaW5nKCJzdHIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVNYXAoIm1hcCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUxpc3QoImxzdCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVNldCgic2V0Iik7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0VHlwZU5hbWVGb3JUeXBlSUQoVFR5cGUgdHlwZUlEKSB7CisgIHN3aXRjaCAodHlwZUlEKSB7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiBrVHlwZU5hbWVCb29sOworICBjYXNlIFRfQllURToKKyAgICByZXR1cm4ga1R5cGVOYW1lQnl0ZTsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4ga1R5cGVOYW1lSTE2OworICBjYXNlIFRfSTMyOgorICAgIHJldHVybiBrVHlwZU5hbWVJMzI7CisgIGNhc2UgVF9JNjQ6CisgICAgcmV0dXJuIGtUeXBlTmFtZUk2NDsKKyAgY2FzZSBUX0RPVUJMRToKKyAgICByZXR1cm4ga1R5cGVOYW1lRG91YmxlOworICBjYXNlIFRfU1RSSU5HOgorICAgIHJldHVybiBrVHlwZU5hbWVTdHJpbmc7CisgIGNhc2UgVF9TVFJVQ1Q6CisgICAgcmV0dXJuIGtUeXBlTmFtZVN0cnVjdDsKKyAgY2FzZSBUX01BUDoKKyAgICByZXR1cm4ga1R5cGVOYW1lTWFwOworICBjYXNlIFRfU0VUOgorICAgIHJldHVybiBrVHlwZU5hbWVTZXQ7CisgIGNhc2UgVF9MSVNUOgorICAgIHJldHVybiBrVHlwZU5hbWVMaXN0OworICBkZWZhdWx0OgorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgIH0KK30KKworc3RhdGljIFRUeXBlIGdldFR5cGVJREZvclR5cGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIFRUeXBlIHJlc3VsdCA9IFRfU1RPUDsgLy8gU2VudGluZWwgdmFsdWUKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxKSB7CisgICAgc3dpdGNoIChuYW1lWzBdKSB7CisgICAgY2FzZSAnZCc6CisgICAgICByZXN1bHQgPSBUX0RPVUJMRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgc3dpdGNoIChuYW1lWzFdKSB7CisgICAgICBjYXNlICc4JzoKKyAgICAgICAgcmVzdWx0ID0gVF9CWVRFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzEnOgorICAgICAgICByZXN1bHQgPSBUX0kxNjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICczJzoKKyAgICAgICAgcmVzdWx0ID0gVF9JMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnNic6CisgICAgICAgIHJlc3VsdCA9IFRfSTY0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgICAgcmVzdWx0ID0gVF9MSVNUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICByZXN1bHQgPSBUX01BUDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgorICAgICAgcmVzdWx0ID0gVF9TVFJVQ1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIGlmIChuYW1lWzFdID09ICd0JykgeworICAgICAgICByZXN1bHQgPSBUX1NUUklORzsKKyAgICAgIH0gZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKKyAgICAgICAgcmVzdWx0ID0gVF9TRVQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICd0JzoKKyAgICAgIHJlc3VsdCA9IFRfQk9PTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocmVzdWx0ID09IFRfU1RPUCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGhhbmRsaW5nIGZvciB0aGUgZmlyc3QgMHgzMCBjaGFyYWN0ZXJzCisvLyAgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgorLy8gIDEgOiBqdXN0IG91dHB1dCBpbmRleAorLy8gPG90aGVyPiA6IGVzY2FwZSB1c2luZyAiXDxvdGhlcj4iIG5vdGF0aW9uCitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkNoYXJUYWJsZVsweDMwXSA9IHsKKyAgICAvLyAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAnYicsCisgICAgJ3QnLAorICAgICduJywKKyAgICAwLAorICAgICdmJywKKyAgICAncicsCisgICAgMCwKKyAgICAwLCAvLyAwCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwgLy8gMQorICAgIDEsCisgICAgMSwKKyAgICAnIicsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwgLy8gMgorfTsKKworLy8gVGhpcyBzdHJpbmcncyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZWxlbWVudHMgaW4ga0VzY2FwZUNoYXJWYWxzLgorLy8gSSBkb24ndCBoYXZlICcvJyBvbiB0aGlzIGxpc3QgZXZlbiB0aG91Z2ggaXQgYXBwZWFycyBvbiB3d3cuanNvbi5vcmcgLS0KKy8vIGl0IGlzIG5vdCBpbiB0aGUgUkZDCitjb25zdCBzdGF0aWMgc3RkOjpzdHJpbmcga0VzY2FwZUNoYXJzKCJcIlxcYmZucnQiKTsKKworLy8gVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCisvLyBrRXNjYXBlQ2hhcnMKK2NvbnN0IHN0YXRpYyB1aW50OF90IGtFc2NhcGVDaGFyVmFsc1s3XSA9IHsKKyAgICAnIicsCisgICAgJ1xcJywKKyAgICAnXGInLAorICAgICdcZicsCisgICAgJ1xuJywKKyAgICAnXHInLAorICAgICdcdCcsCit9OworCisvLyBTdGF0aWMgaGVscGVyIGZ1bmN0aW9ucworCisvLyBSZWFkIDEgY2hhcmFjdGVyIGZyb20gdGhlIHRyYW5zcG9ydCB0cmFucyBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgdGhlCisvLyBleHBlY3RlZCBjaGFyYWN0ZXIgY2guCisvLyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3QuCitzdGF0aWMgdWludDMyX3QgcmVhZFN5bnRheENoYXIoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIsIHVpbnQ4X3QgY2gpIHsKKyAgdWludDhfdCBjaDIgPSByZWFkZXIucmVhZCgpOworICBpZiAoY2gyICE9IGNoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIqKSZjaCwgMSkgKyAiXCc7IGdvdCBcJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OnN0cmluZygoY2hhciopJmNoMiwgMSkgKyAiXCcuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIGhleCBjaGFyYWN0ZXIgY2guCisvLyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBbMC05YS1mXS4KK3N0YXRpYyB1aW50OF90IGhleFZhbCh1aW50OF90IGNoKSB7CisgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgeworICAgIHJldHVybiBjaCAtICcwJzsKKyAgfSBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgeworICAgIHJldHVybiBjaCAtICdhJyArIDEwOworICB9IGVsc2UgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290IFwnIiArIHN0ZDo6c3RyaW5nKChjaGFyKikmY2gsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwnLiIpOworICB9Cit9CisKKy8vIFJldHVybiB0aGUgaGV4IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsLiBUaGUgdmFsdWUgaXMgbWFza2VkCisvLyB0byBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UuCitzdGF0aWMgdWludDhfdCBoZXhDaGFyKHVpbnQ4X3QgdmFsKSB7CisgIHZhbCAmPSAweDBGOworICBpZiAodmFsIDwgMTApIHsKKyAgICByZXR1cm4gdmFsICsgJzAnOworICB9IGVsc2UgeworICAgIHJldHVybiB2YWwgLSAxMCArICdhJzsKKyAgfQorfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGNoIGlzIGluIFstKzAtOS5FZV07IGZhbHNlIG90aGVyd2lzZQorc3RhdGljIGJvb2wgaXNKU09OTnVtZXJpYyh1aW50OF90IGNoKSB7CisgIHN3aXRjaCAoY2gpIHsKKyAgY2FzZSAnKyc6CisgIGNhc2UgJy0nOgorICBjYXNlICcuJzoKKyAgY2FzZSAnMCc6CisgIGNhc2UgJzEnOgorICBjYXNlICcyJzoKKyAgY2FzZSAnMyc6CisgIGNhc2UgJzQnOgorICBjYXNlICc1JzoKKyAgY2FzZSAnNic6CisgIGNhc2UgJzcnOgorICBjYXNlICc4JzoKKyAgY2FzZSAnOSc6CisgIGNhc2UgJ0UnOgorICBjYXNlICdlJzoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb2RlIHVuaXQgaXMgaGlnaCBzdXJyb2dhdGUKK3N0YXRpYyBib29sIGlzSGlnaFN1cnJvZ2F0ZSh1aW50MTZfdCB2YWwpIHsKKyAgcmV0dXJuIHZhbCA+PSAweEQ4MDAgJiYgdmFsIDw9IDB4REJGRjsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvZGUgdW5pdCBpcyBsb3cgc3Vycm9nYXRlCitzdGF0aWMgYm9vbCBpc0xvd1N1cnJvZ2F0ZSh1aW50MTZfdCB2YWwpIHsKKyAgcmV0dXJuIHZhbCA+PSAweERDMDAgJiYgdmFsIDw9IDB4REZGRjsKK30KKworLyoqCisgKiBDbGFzcyB0byBzZXJ2ZSBhcyBiYXNlIEpTT04gY29udGV4dCBhbmQgYXMgYmFzZSBjbGFzcyBmb3Igb3RoZXIgY29udGV4dAorICogaW1wbGVtZW50YXRpb25zCisgKi8KK2NsYXNzIFRKU09OQ29udGV4dCB7CisKK3B1YmxpYzoKKyAgVEpTT05Db250ZXh0KCl7fTsKKworICB2aXJ0dWFsIH5USlNPTkNvbnRleHQoKXt9OworCisgIC8qKgorICAgKiBXcml0ZSBjb250ZXh0IGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0JiB0cmFucykgeworICAgICh2b2lkKXRyYW5zOworICAgIHJldHVybiAwOworICB9OworCisgIC8qKgorICAgKiBSZWFkIGNvbnRleHQgZGF0YSBmcm9tIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlcikgeworICAgICh2b2lkKXJlYWRlcjsKKyAgICByZXR1cm4gMDsKKyAgfTsKKworICAvKioKKyAgICogUmV0dXJuIHRydWUgaWYgbnVtYmVycyBuZWVkIHRvIGJlIGVzY2FwZWQgYXMgc3RyaW5ncyBpbiB0aGlzIGNvbnRleHQuCisgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGZhbHNlLgorICAgKi8KKyAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCisvLyBDb250ZXh0IGNsYXNzIGZvciBvYmplY3QgbWVtYmVyIGtleS12YWx1ZSBwYWlycworY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7CisKK3B1YmxpYzoKKyAgSlNPTlBhaXJDb250ZXh0KCkgOiBmaXJzdF8odHJ1ZSksIGNvbG9uXyh0cnVlKSB7fQorCisgIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CisgICAgaWYgKGZpcnN0XykgeworICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyYW5zLndyaXRlKGNvbG9uXyA/ICZrSlNPTlBhaXJTZXBhcmF0b3IgOiAma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKKyAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CisgICAgaWYgKGZpcnN0XykgeworICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ4X3QgY2ggPSAoY29sb25fID8ga0pTT05QYWlyU2VwYXJhdG9yIDoga0pTT05FbGVtU2VwYXJhdG9yKTsKKyAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBjaCk7CisgICAgfQorICB9CisKKyAgLy8gTnVtYmVycyBtdXN0IGJlIHR1cm5lZCBpbnRvIHN0cmluZ3MgaWYgdGhleSBhcmUgdGhlIGtleSBwYXJ0IG9mIGEgcGFpcgorICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgeyByZXR1cm4gY29sb25fOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgZmlyc3RfOworICBib29sIGNvbG9uXzsKK307CisKKy8vIENvbnRleHQgY2xhc3MgZm9yIGxpc3RzCitjbGFzcyBKU09OTGlzdENvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKKworcHVibGljOgorICBKU09OTGlzdENvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSB7fQorCisgIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CisgICAgaWYgKGZpcnN0XykgeworICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgdHJhbnMud3JpdGUoJmtKU09ORWxlbVNlcGFyYXRvciwgMSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CisgICAgaWYgKGZpcnN0XykgeworICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwga0pTT05FbGVtU2VwYXJhdG9yKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBmaXJzdF87Cit9OworCitUSlNPTlByb3RvY29sOjpUSlNPTlByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCisgIDogVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPihwdHJhbnMpLAorICAgIHRyYW5zXyhwdHJhbnMuZ2V0KCkpLAorICAgIGNvbnRleHRfKG5ldyBUSlNPTkNvbnRleHQoKSksCisgICAgcmVhZGVyXygqcHRyYW5zKSB7Cit9CisKK1RKU09OUHJvdG9jb2w6On5USlNPTlByb3RvY29sKCkgeworfQorCit2b2lkIFRKU09OUHJvdG9jb2w6OnB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpIHsKKyAgY29udGV4dHNfLnB1c2goY29udGV4dF8pOworICBjb250ZXh0XyA9IGM7Cit9CisKK3ZvaWQgVEpTT05Qcm90b2NvbDo6cG9wQ29udGV4dCgpIHsKKyAgY29udGV4dF8gPSBjb250ZXh0c18udG9wKCk7CisgIGNvbnRleHRzXy5wb3AoKTsKK30KKworLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBhIEpTT04gZXNjYXBlIHNlcXVlbmNlICgiXHUwMHh4IikKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkVzY2FwZUNoYXIodWludDhfdCBjaCkgeworICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90KilrSlNPTkVzY2FwZVByZWZpeC5jX3N0cigpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihrSlNPTkVzY2FwZVByZWZpeC5sZW5ndGgoKSkpOworICB1aW50OF90IG91dENoID0gaGV4Q2hhcihjaCA+PiA0KTsKKyAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOworICBvdXRDaCA9IGhleENoYXIoY2gpOworICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7CisgIHJldHVybiA2OworfQorCisvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIHBhcnQgb2YgYSBKU09OIHN0cmluZywgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpIHsKKyAgaWYgKGNoID49IDB4MzApIHsKKyAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsgLy8gT25seSBzcGVjaWFsIGNoYXJhY3RlciA+PSAweDMwIGlzICdcJworICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOworICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOworICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJmNoLCAxKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB1aW50OF90IG91dENoID0ga0pTT05DaGFyVGFibGVbY2hdOworICAgIC8vIENoZWNrIGlmIHJlZ3VsYXIgY2hhcmFjdGVyLCBiYWNrc2xhc2ggZXNjYXBlZCwgb3IgSlNPTiBlc2NhcGVkCisgICAgaWYgKG91dENoID09IDEpIHsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJmNoLCAxKTsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAob3V0Q2ggPiAxKSB7CisgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CisgICAgICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7CisgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHdyaXRlSlNPTkVzY2FwZUNoYXIoY2gpOworICAgIH0KKyAgfQorfQorCisvLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgc3RyIGFzIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nCisvLyBjaGFyYWN0ZXJzIGFzIGFwcHJvcHJpYXRlLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcworICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdGVyKHN0ci5iZWdpbigpKTsKKyAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGVuZChzdHIuZW5kKCkpOworICB3aGlsZSAoaXRlciAhPSBlbmQpIHsKKyAgICByZXN1bHQgKz0gd3JpdGVKU09OQ2hhcigqaXRlcisrKTsKKyAgfQorICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBhcyBKU09OIHN0cmluZywgYmFzZTY0LWVuY29kaW5nCisvLyB0aGUgc3RyaW5nJ3MgY29udGVudHMsIGFuZCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZQordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcworICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgIHVpbnQ4X3QgYls0XTsKKyAgY29uc3QgdWludDhfdCogYnl0ZXMgPSAoY29uc3QgdWludDhfdCopc3RyLmNfc3RyKCk7CisgIGlmIChzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDMyX3QgbGVuID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5sZW5ndGgoKSk7CisgIHdoaWxlIChsZW4gPj0gMykgeworICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIDMsIGIpOworICAgIHRyYW5zXy0+d3JpdGUoYiwgNCk7CisgICAgcmVzdWx0ICs9IDQ7CisgICAgYnl0ZXMgKz0gMzsKKyAgICBsZW4gLT0gMzsKKyAgfQorICBpZiAobGVuKSB7IC8vIEhhbmRsZSByZW1haW5kZXIKKyAgICBiYXNlNjRfZW5jb2RlKGJ5dGVzLCBsZW4sIGIpOworICAgIHRyYW5zXy0+d3JpdGUoYiwgbGVuICsgMSk7CisgICAgcmVzdWx0ICs9IGxlbiArIDE7CisgIH0KKyAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBDb252ZXJ0IHRoZSBnaXZlbiBpbnRlZ2VyIHR5cGUgdG8gYSBKU09OIG51bWJlciwgb3IgYSBzdHJpbmcKKy8vIGlmIHRoZSBjb250ZXh0IHJlcXVpcmVzIGl0IChlZzoga2V5IGluIGEgbWFwIHBhaXIpLgordGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05JbnRlZ2VyKE51bWJlclR5cGUgbnVtKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKKyAgc3RkOjpzdHJpbmcgdmFsKHRvX3N0cmluZyhudW0pKTsKKyAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0Xy0+ZXNjYXBlTnVtKCk7CisgIGlmIChlc2NhcGVOdW0pIHsKKyAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgICAgcmVzdWx0ICs9IDE7CisgIH0KKyAgaWYgKHZhbC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90Kil2YWwuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSkpOworICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSk7CisgIGlmIChlc2NhcGVOdW0pIHsKKyAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgICAgcmVzdWx0ICs9IDE7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworbmFtZXNwYWNlIHsKK3N0ZDo6c3RyaW5nIGRvdWJsZVRvU3RyaW5nKGRvdWJsZSBkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHI7CisgIHN0ci5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIG1heF9kaWdpdHMxMCA9IDIgKyBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwOworICBzdHIucHJlY2lzaW9uKG1heF9kaWdpdHMxMCk7CisgIHN0ciA8PCBkOworICByZXR1cm4gc3RyLnN0cigpOworfQorfQorCisvLyBDb252ZXJ0IHRoZSBnaXZlbiBkb3VibGUgdG8gYSBKU09OIHN0cmluZywgd2hpY2ggaXMgZWl0aGVyIHRoZSBudW1iZXIsCisvLyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICBzdGQ6OnN0cmluZyB2YWw7CisKKyAgYm9vbCBzcGVjaWFsID0gZmFsc2U7CisgIHN3aXRjaCAoYm9vc3Q6Om1hdGg6OmZwY2xhc3NpZnkobnVtKSkgeworICBjYXNlIEZQX0lORklOSVRFOgorICAgIGlmIChib29zdDo6bWF0aDo6c2lnbmJpdChudW0pKSB7CisgICAgICB2YWwgPSBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eTsKKyAgICB9IGVsc2UgeworICAgICAgdmFsID0ga1RocmlmdEluZmluaXR5OworICAgIH0KKyAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgY2FzZSBGUF9OQU46CisgICAgdmFsID0ga1RocmlmdE5hbjsKKyAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB2YWwgPSBkb3VibGVUb1N0cmluZyhudW0pOworICAgIGJyZWFrOworICB9CisKKyAgYm9vbCBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKKyAgaWYgKGVzY2FwZU51bSkgeworICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgICByZXN1bHQgKz0gMTsKKyAgfQorICBpZiAodmFsLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKXZhbC5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKSk7CisgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKTsKKyAgaWYgKGVzY2FwZU51bSkgeworICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgICByZXN1bHQgKz0gMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RTdGFydCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdFN0YXJ0LCAxKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CisgIHJldHVybiByZXN1bHQgKyAxOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RFbmQoKSB7CisgIHBvcENvbnRleHQoKTsKKyAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RFbmQsIDEpOworICByZXR1cm4gMTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlTdGFydCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5U3RhcnQsIDEpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKKyAgcmV0dXJuIHJlc3VsdCArIDE7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkFycmF5RW5kKCkgeworICBwb3BDb250ZXh0KCk7CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OQXJyYXlFbmQsIDEpOworICByZXR1cm4gMTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoa1RocmlmdFZlcnNpb24xKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhuYW1lKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIobWVzc2FnZVR5cGUpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihzZXFpZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICAodm9pZCluYW1lOworICByZXR1cm4gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiB3cml0ZUpTT05PYmplY3RFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAodm9pZCluYW1lOworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkSWQpOworICByZXN1bHQgKz0gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZFR5cGUpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoa2V5VHlwZSkpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKHZhbFR5cGUpKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZWxlbVR5cGUpKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKHZhbHVlKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZSB0b19zdHJpbmcgc2VlcworICAvLyBpbnQ4X3QgYXMgYSB0ZXh0IHR5cGUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIHR5cGUKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoKGludDE2X3QpYnl0ZSk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKGkxNik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKGkzMik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKGk2NCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkRvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiB3cml0ZUpTT05TdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gd3JpdGVKU09OQmFzZTY0KHN0cik7Cit9CisKKy8qKgorICogUmVhZGluZyBmdW5jdGlvbnMKKyAqLworCisvLyBSZWFkcyAxIGJ5dGUgYW5kIHZlcmlmaWVzIHRoYXQgaXQgbWF0Y2hlcyBjaC4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OU3ludGF4Q2hhcih1aW50OF90IGNoKSB7CisgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXJfLCBjaCk7Cit9CisKKy8vIERlY29kZXMgdGhlIGZvdXIgaGV4IHBhcnRzIG9mIGEgSlNPTiBlc2NhcGVkIHN0cmluZyBjaGFyYWN0ZXIgYW5kIHJldHVybnMKKy8vIHRoZSBVVEYtMTYgY29kZSB1bml0IHZpYSBvdXQuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkVzY2FwZUNoYXIodWludDE2X3QqIG91dCkgeworICB1aW50OF90IGJbNF07CisgIGJbMF0gPSByZWFkZXJfLnJlYWQoKTsKKyAgYlsxXSA9IHJlYWRlcl8ucmVhZCgpOworICBiWzJdID0gcmVhZGVyXy5yZWFkKCk7CisgIGJbM10gPSByZWFkZXJfLnJlYWQoKTsKKworICAqb3V0ID0gKGhleFZhbChiWzBdKSA8PCAxMikKKyAgICArIChoZXhWYWwoYlsxXSkgPDwgOCkgKyAoaGV4VmFsKGJbMl0pIDw8IDQpICsgaGV4VmFsKGJbM10pOworCisgIHJldHVybiA0OworfQorCisvLyBEZWNvZGVzIGEgSlNPTiBzdHJpbmcsIGluY2x1ZGluZyB1bmVzY2FwaW5nLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZpYSBzdHIKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgc2tpcENvbnRleHQpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gKHNraXBDb250ZXh0ID8gMCA6IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb2RldW5pdHM7CisgIHVpbnQ4X3QgY2g7CisgIHN0ci5jbGVhcigpOworICB3aGlsZSAodHJ1ZSkgeworICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgKytyZXN1bHQ7CisgICAgaWYgKGNoID09IGtKU09OU3RyaW5nRGVsaW1pdGVyKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGNoID09IGtKU09OQmFja3NsYXNoKSB7CisgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgICAgKytyZXN1bHQ7CisgICAgICBpZiAoY2ggPT0ga0pTT05Fc2NhcGVDaGFyKSB7CisgICAgICAgIHVpbnQxNl90IGNwOworICAgICAgICByZXN1bHQgKz0gcmVhZEpTT05Fc2NhcGVDaGFyKCZjcCk7CisgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY3ApKSB7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKGNwKQorICAgICAgICAgICAgICAgJiYgY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjaygwKTsKKyAgICAgICAgICBzdHIgKz0gYm9vc3Q6OmxvY2FsZTo6Y29udjo6dXRmX3RvX3V0ZjxjaGFyPihjb2RldW5pdHMuZGF0YSgpKTsKKyAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7CisgICAgICAgIGlmIChwb3MgPT0ga0VzY2FwZUNoYXJzLm5wb3MpIHsKKyAgICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAnIiArIHN0ZDo6c3RyaW5nKChjb25zdCBjaGFyKikmY2gsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicuIik7CisgICAgICAgIH0KKyAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFjb2RldW5pdHMuZW1wdHkoKSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlIHBhaXIuIik7CisgICAgfQorICAgIHN0ciArPSBjaDsKKyAgfQorCisgIGlmICghY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlIHBhaXIuIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYSBibG9jayBvZiBiYXNlNjQgY2hhcmFjdGVycywgZGVjb2RpbmcgaXQsIGFuZCByZXR1cm5zIHZpYSBzdHIKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjpzdHJpbmcgdG1wOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN0cmluZyh0bXApOworICB1aW50OF90KiBiID0gKHVpbnQ4X3QqKXRtcC5jX3N0cigpOworICBpZiAodG1wLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHVpbnQzMl90IGxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXAubGVuZ3RoKCkpOworICBzdHIuY2xlYXIoKTsKKyAgLy8gSWdub3JlIHBhZGRpbmcKKyAgaWYgKGxlbiA+PSAyKSAgeworICAgIHVpbnQzMl90IGJvdW5kID0gbGVuIC0gMjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KKyAgfQorICB3aGlsZSAobGVuID49IDQpIHsKKyAgICBiYXNlNjRfZGVjb2RlKGIsIDQpOworICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIqKWIsIDMpOworICAgIGIgKz0gNDsKKyAgICBsZW4gLT0gNDsKKyAgfQorICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyB0eXBlKQorICBpZiAobGVuID4gMSkgeworICAgIGJhc2U2NF9kZWNvZGUoYiwgbGVuKTsKKyAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyKiliLCBsZW4gLSAxKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKKy8vIGEgdmFsaWQgSlNPTiBudW1lcmljIGNoYXJhY3Rlci4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgc3RyLmNsZWFyKCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdWludDhfdCBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgIGlmICghaXNKU09OTnVtZXJpYyhjaCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZWFkZXJfLnJlYWQoKTsKKyAgICBzdHIgKz0gY2g7CisgICAgKytyZXN1bHQ7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIFQgdDsKKyAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cihzKTsKKyAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICBzdHIgPj4gdDsKKyAgaWYgKHN0ci5iYWQoKSB8fCAhc3RyLmVvZigpKQorICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzKTsKKyAgcmV0dXJuIHQ7Cit9Cit9CisKKy8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKKy8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KK3RlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUmIG51bSkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKKyAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOworICB9CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7CisgIHRyeSB7CisgICAgbnVtID0gZnJvbVN0cmluZzxOdW1iZXJUeXBlPihzdHIpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OnJ1bnRpbWVfZXJyb3ImKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICB9CisgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyBhIEpTT04gbnVtYmVyIG9yIHN0cmluZyBhbmQgaW50ZXJwcmV0cyBpdCBhcyBhIGRvdWJsZS4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORG91YmxlKGRvdWJsZSYgbnVtKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOworICBzdGQ6OnN0cmluZyBzdHI7CisgIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBrSlNPTlN0cmluZ0RlbGltaXRlcikgeworICAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhzdHIsIHRydWUpOworICAgIC8vIENoZWNrIGZvciBOYU4sIEluZmluaXR5IGFuZCAtSW5maW5pdHkKKyAgICBpZiAoc3RyID09IGtUaHJpZnROYW4pIHsKKyAgICAgIG51bSA9IEhVR0VfVkFMIC8gSFVHRV9WQUw7IC8vIGdlbmVyYXRlcyBOYU4KKyAgICB9IGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0SW5maW5pdHkpIHsKKyAgICAgIG51bSA9IEhVR0VfVkFMOworICAgIH0gZWxzZSBpZiAoc3RyID09IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KSB7CisgICAgICBudW0gPSAtSFVHRV9WQUw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBudW0gPSBmcm9tU3RyaW5nPGRvdWJsZT4oc3RyKTsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYgZSkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKyAiXCIiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CisgICAgfQorICAgIHJlc3VsdCArPSByZWFkSlNPTk51bWVyaWNDaGFycyhzdHIpOworICAgIHRyeSB7CisgICAgICBudW0gPSBmcm9tU3RyaW5nPGRvdWJsZT4oc3RyKTsKKyAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKyAiXCIiKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RTdGFydCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RTdGFydCk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdEVuZCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OT2JqZWN0RW5kKTsKKyAgcG9wQ29udGV4dCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkFycmF5U3RhcnQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOworICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OQXJyYXlTdGFydCk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkFycmF5RW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheUVuZCk7CisgIHBvcENvbnRleHQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCAhPSBrVGhyaWZ0VmVyc2lvbjEpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICB9CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhuYW1lKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpdG1wVmFsOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIGlmICh0bXBWYWwgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHNlcWlkID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odG1wVmFsKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICAodm9pZCluYW1lOworICByZXR1cm4gcmVhZEpTT05PYmplY3RTdGFydCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgeworICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgLy8gQ2hlY2sgaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgdWludDhfdCBjaCA9IHJlYWRlcl8ucGVlaygpOworICBpZiAoY2ggPT0ga0pTT05PYmplY3RFbmQpIHsKKyAgICBmaWVsZFR5cGUgPSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUDsKKyAgfSBlbHNlIHsKKyAgICB1aW50NjRfdCB0bXBWYWwgPSAwOworICAgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgICAgaWYgKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICAgIGZpZWxkSWQgPSBzdGF0aWNfY2FzdDxpbnQxNl90Pih0bXBWYWwpOworICAgIHJlc3VsdCArPSByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgICAgZmllbGRUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50NjRfdCB0bXBWYWwgPSAwOworICBzdGQ6OnN0cmluZyB0bXBTdHI7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKKyAga2V5VHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICB2YWxUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wVmFsKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcFZhbCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRMaXN0RW5kKCkgeworICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50NjRfdCB0bXBWYWwgPSAwOworICBzdGQ6OnN0cmluZyB0bXBTdHI7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKKyAgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0RW5kKCkgeworICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQm9vbChib29sJiB2YWx1ZSkgeworICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKHZhbHVlKTsKK30KKworLy8gcmVhZEJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgcHJvcGVybHkgYmVjYXVzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMgaW50OF90CisvLyBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgIGludDE2X3QgdG1wID0gKGludDE2X3QpYnl0ZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05JbnRlZ2VyKHRtcCk7CisgIGFzc2VydCh0bXAgPCAyNTYpOworICBieXRlID0gKGludDhfdCl0bXA7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgIHJldHVybiByZWFkSlNPTkludGVnZXIoaTE2KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpMzIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTY0KGludDY0X3QmIGk2NCkgeworICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGk2NCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgcmV0dXJuIHJlYWRKU09ORG91YmxlKGR1Yik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcmVhZEpTT05TdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiByZWFkSlNPTkJhc2U2NChzdHIpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEpTT05QUk9UT0NPTF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8c3RhY2s+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uCitjbGFzcyBUSlNPTkNvbnRleHQ7CisKKy8qKgorICogSlNPTiBwcm90b2NvbCBmb3IgVGhyaWZ0LgorICoKKyAqIEltcGxlbWVudHMgYSBwcm90b2NvbCB3aGljaCB1c2VzIEpTT04gYXMgdGhlIHdpcmUtZm9ybWF0LgorICoKKyAqIFRocmlmdCB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZGVzY3JpYmVkIGJlbG93OgorICoKKyAqIDEuIEV2ZXJ5IFRocmlmdCBpbnRlZ2VyIHR5cGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG51bWJlci4KKyAqCisgKiAyLiBUaHJpZnQgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBudW1iZXJzLiBTb21lIHNwZWNpYWwgdmFsdWVzIGFyZQorICogICAgcmVwcmVzZW50ZWQgYXMgc3RyaW5nczoKKyAqICAgIGEuICJOYU4iIGZvciBub3QtYS1udW1iZXIgdmFsdWVzCisgKiAgICBiLiAiSW5maW5pdHkiIGZvciBwb3NpdGl2ZSBpbmZpbml0eQorICogICAgYy4gIi1JbmZpbml0eSIgZm9yIG5lZ2F0aXZlIGluZmluaXR5CisgKgorICogMy4gVGhyaWZ0IHN0cmluZyB2YWx1ZXMgYXJlIGVtaXR0ZWQgYXMgSlNPTiBzdHJpbmdzLCB3aXRoIGFwcHJvcHJpYXRlCisgKiAgICBlc2NhcGluZy4KKyAqCisgKiA0LiBUaHJpZnQgYmluYXJ5IHZhbHVlcyBhcmUgZW5jb2RlZCBpbnRvIEJhc2U2NCBhbmQgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MuCisgKiAgICBUaGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBpcyB3cml0dGVuIHN1Y2ggdGhhdCBpdCB3aWxsIHByb3Blcmx5IHNraXAgaWYKKyAqICAgIGNhbGxlZCBvbiBhIFRocmlmdCBzdHJpbmcgKGFsdGhvdWdoIGl0IHdpbGwgZGVjb2RlIGdhcmJhZ2UgZGF0YSkuCisgKgorICogICAgTk9URTogQmFzZTY0IHBhZGRpbmcgaXMgb3B0aW9uYWwgZm9yIFRocmlmdCBiaW5hcnkgdmFsdWUgZW5jb2RpbmcuIFNvCisgKiAgICB0aGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBuZWVkcyB0byBkZWNvZGUgYm90aCBpbnB1dCBzdHJpbmdzIHdpdGggcGFkZGluZworICogICAgYW5kIHRob3NlIHdpdGhvdXQgb25lLgorICoKKyAqIDUuIFRocmlmdCBzdHJ1Y3RzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIG9iamVjdHMsIHdpdGggdGhlIGZpZWxkIElEIGFzIHRoZQorICogICAga2V5LCBhbmQgdGhlIGZpZWxkIHZhbHVlIHJlcHJlc2VudGVkIGFzIGEgSlNPTiBvYmplY3Qgd2l0aCBhIHNpbmdsZQorICogICAga2V5LXZhbHVlIHBhaXIuIFRoZSBrZXkgaXMgYSBzaG9ydCBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhhdCB0eXBlLAorICogICAgZm9sbG93ZWQgYnkgdGhlIHZhbHVlLiBUaGUgdmFsaWQgdHlwZSBpZGVudGlmaWVycyBhcmU6ICJ0ZiIgZm9yIGJvb2wsCisgKiAgICAiaTgiIGZvciBieXRlLCAiaTE2IiBmb3IgMTYtYml0IGludGVnZXIsICJpMzIiIGZvciAzMi1iaXQgaW50ZWdlciwgImk2NCIKKyAqICAgIGZvciA2NC1iaXQgaW50ZWdlciwgImRibCIgZm9yIGRvdWJsZS1wcmVjaXNpb24gbG9hdGluZyBwb2ludCwgInN0ciIgZm9yCisgKiAgICBzdHJpbmcgKGluY2x1ZGluZyBiaW5hcnkpLCAicmVjIiBmb3Igc3RydWN0ICgicmVjb3JkcyIpLCAibWFwIiBmb3IgbWFwLAorICogICAgImxzdCIgZm9yIGxpc3QsICJzZXQiIGZvciBzZXQuCisgKgorICogNi4gVGhyaWZ0IGxpc3RzIGFuZCBzZXRzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIGFycmF5cywgd2l0aCB0aGUgZmlyc3QKKyAqICAgIGVsZW1lbnQgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgVGhyaWZ0CisgKiAgICBlbGVtZW50IHR5cGUgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgY291bnQgb2YKKyAqICAgIHRoZSBUaHJpZnQgZWxlbWVudHMuIFRoZSBUaHJpZnQgZWxlbWVudHMgdGhlbiBmb2xsb3cuCisgKgorICogNy4gVGhyaWZ0IG1hcHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBmaXJzdCB0d28gZWxlbWVudHMKKyAqICAgIG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBzdHJpbmcgaWRlbnRpZmllcnMgZm9yIHRoZSBUaHJpZnQga2V5IHR5cGUKKyAqICAgIGFuZCB2YWx1ZSB0eXBlLCBmb2xsb3dlZCBieSB0aGUgY291bnQgb2YgdGhlIFRocmlmdCBwYWlycywgZm9sbG93ZWQgYnkgYQorICogICAgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGUga2V5LXZhbHVlIHBhaXJzLiBOb3RlIHRoYXQgSlNPTiBrZXlzIGNhbiBvbmx5CisgKiAgICBiZSBzdHJpbmdzLCB3aGljaCBtZWFucyB0aGF0IHRoZSBrZXkgdHlwZSBvZiB0aGUgVGhyaWZ0IG1hcCBzaG91bGQgYmUKKyAqICAgIHJlc3RyaWN0ZWQgdG8gbnVtZXJpYyBvciBzdHJpbmcgdHlwZXMgLS0gaW4gdGhlIGNhc2Ugb2YgbnVtZXJpY3MsIHRoZXkKKyAqICAgIGFyZSBzZXJpYWxpemVkIGFzIHN0cmluZ3MuCisgKgorICogOC4gVGhyaWZ0IG1lc3NhZ2VzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIGFycmF5cywgd2l0aCB0aGUgcHJvdG9jb2wKKyAqICAgIHZlcnNpb24gIywgdGhlIG1lc3NhZ2UgbmFtZSwgdGhlIG1lc3NhZ2UgdHlwZSwgYW5kIHRoZSBzZXF1ZW5jZSBJRCBhcworICogICAgdGhlIGZpcnN0IDQgZWxlbWVudHMuCisgKgorICogTW9yZSBkaXNjdXNzaW9uIG9mIHRoZSBkb3VibGUgaGFuZGxpbmcgaXMgcHJvYmFibHkgd2FycmFudGVkLiBUaGUgYWltIG9mCisgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0byBtYXRjaCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHRoZSBiZWhhdmlvcgorICogb2YgSmF2YSdzIERvdWJsZS50b1N0cmluZygpLCB3aGljaCBoYXMgbm8gcHJlY2lzaW9uIGxvc3MuICBJbXBsZW1lbnRvcnMgaW4KKyAqIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgc3RyaXZlIHRvIGFjaGlldmUgdGhhdCB3aGVyZSBwb3NzaWJsZS4gSSBoYXZlIG5vdAorICogeWV0IHZlcmlmaWVkIHdoZXRoZXIgc3RkOjppc3RyaW5nc3RyZWFtOjpvcGVyYXRvcj4+LCB3aGljaCBpcyBkb2luZyB0aGF0CisgKiB3b3JrIGZvciBtZSBpbiBDKyssIGxvc2VzIGFueSBwcmVjaXNpb24sIGJ1dCBJIGFtIGxlYXZpbmcgdGhpcyBhcyBhIGZ1dHVyZQorICogaW1wcm92ZW1lbnQuIEkgbWF5IHRyeSB0byBwcm92aWRlIGEgQyBjb21wb25lbnQgZm9yIHRoaXMsIHNvIHRoYXQgb3RoZXIKKyAqIGxhbmd1YWdlcyBjb3VsZCBiaW5kIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZm9yIG1heGltdW0KKyAqIGNvbnNpc3RlbmN5LgorICoKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+IHsKK3B1YmxpYzoKKyAgVEpTT05Qcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKKworICB+VEpTT05Qcm90b2NvbCgpOworCitwcml2YXRlOgorICB2b2lkIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpOworCisgIHZvaWQgcG9wQ29udGV4dCgpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkVzY2FwZUNoYXIodWludDhfdCBjaCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OQ2hhcih1aW50OF90IGNoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgorICB1aW50MzJfdCB3cml0ZUpTT05JbnRlZ2VyKE51bWJlclR5cGUgbnVtKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09OQXJyYXlFbmQoKTsKKworICB1aW50MzJfdCByZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQxNl90KiBvdXQpOworCisgIHVpbnQzMl90IHJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSk7CisKKyAgdWludDMyX3QgcmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3QgcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+CisgIHVpbnQzMl90IHJlYWRKU09OSW50ZWdlcihOdW1iZXJUeXBlJiBudW0pOworCisgIHVpbnQzMl90IHJlYWRKU09ORG91YmxlKGRvdWJsZSYgbnVtKTsKKworICB1aW50MzJfdCByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05PYmplY3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkSlNPTkFycmF5U3RhcnQoKTsKKworICB1aW50MzJfdCByZWFkSlNPTkFycmF5RW5kKCk7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgorICAgKi8KKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKTsKKworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKKworICB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKKworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZE1hcEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKKworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgdWludDMyX3QgcmVhZFNldEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKKworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD46OnJlYWRCb29sOworCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOworCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKKworICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIGNsYXNzIExvb2thaGVhZFJlYWRlciB7CisKKyAgcHVibGljOgorICAgIExvb2thaGVhZFJlYWRlcihUVHJhbnNwb3J0JiB0cmFucykgOiB0cmFuc18oJnRyYW5zKSwgaGFzRGF0YV8oZmFsc2UpIHt9CisKKyAgICB1aW50OF90IHJlYWQoKSB7CisgICAgICBpZiAoaGFzRGF0YV8pIHsKKyAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy0+cmVhZEFsbCgmZGF0YV8sIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIGRhdGFfOworICAgIH0KKworICAgIHVpbnQ4X3QgcGVlaygpIHsKKyAgICAgIGlmICghaGFzRGF0YV8pIHsKKyAgICAgICAgdHJhbnNfLT5yZWFkQWxsKCZkYXRhXywgMSk7CisgICAgICB9CisgICAgICBoYXNEYXRhXyA9IHRydWU7CisgICAgICByZXR1cm4gZGF0YV87CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVFRyYW5zcG9ydCogdHJhbnNfOworICAgIGJvb2wgaGFzRGF0YV87CisgICAgdWludDhfdCBkYXRhXzsKKyAgfTsKKworcHJpdmF0ZToKKyAgVFRyYW5zcG9ydCogdHJhbnNfOworCisgIHN0ZDo6c3RhY2s8c3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGNvbnRleHRfOworICBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXzsKK307CisKKy8qKgorICogQ29uc3RydWN0cyBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sIG9iamVjdHMgZ2l2ZW4gdHJhbnNwb3J0cy4KKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7CitwdWJsaWM6CisgIFRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5USlNPTlByb3RvY29sRmFjdG9yeSgpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisvLyBUT0RPKGRyZWlzcyk6IE1vdmUgcGFydCBvZiBUaHJpZnRKU09OU3RyaW5nIGludG8gYSAuY3BwIGZpbGUgYW5kIHJlbW92ZSB0aGlzLgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRocmlmdFN0cnVjdD4KK3N0ZDo6c3RyaW5nIFRocmlmdEpTT05TdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgeworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKyAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBUSlNPTlByb3RvY29sIHByb3RvY29sKHRyYW5zKTsKKworICB0cy53cml0ZSgmcHJvdG9jb2wpOworCisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3Qgc2l6ZTsKKyAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGM2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK3VpbnQzMl90IFRNdWx0aXBsZXhlZFByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKSB7CisgIGlmIChfdHlwZSA9PSBUX0NBTEwgfHwgX3R5cGUgPT0gVF9PTkVXQVkpIHsKKyAgICByZXR1cm4gVFByb3RvY29sRGVjb3JhdG9yOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KHNlcnZpY2VOYW1lICsgc2VwYXJhdG9yICsgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZXFpZCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRQcm90b2NvbERlY29yYXRvcjo6d3JpdGVNZXNzYWdlQmVnaW5fdmlydChfbmFtZSwgX3R5cGUsIF9zZXFpZCk7CisgIH0KK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiZDgyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVE1VTFRJUExFWEVEUFJPVE9DT0xfSF8KKyNkZWZpbmUgVEhSSUZUX1RNVUxUSVBMRVhFRFBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBcbm90ZSBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuICBPbiB0aGUgc2VydmVyLCB1c2UKKyAqIHtAbGluayBhcGFjaGU6OnRocmlmdDo6VE11bHRpcGxleGVkUHJvY2Vzc29yIFRNdWx0aXBsZXhlZFByb2Nlc3Nvcn0gdG8gaGFuZGxlIHJlcXVlc3RzCisgKiBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAqCisgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgKgorICogPGJsb2NrcXVvdGU+PGNvZGU+CisgKiAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiB0cmFuc3BvcnQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKKyAqICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgKgorICogICAgIHNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvdG9jb2w+IG1wMShuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIikpOworICogICAgIHNoYXJlZF9wdHI8Q2FsY3VsYXRvckNsaWVudD4gc2VydmljZTEobmV3IENhbGN1bGF0b3JDbGllbnQobXAxKSk7CisgKgorICogICAgIHNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvdG9jb2w+IG1wMihuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0IikpOworICogICAgIHNoYXJlZF9wdHI8V2VhdGhlclJlcG9ydENsaWVudD4gc2VydmljZTIobmV3IFdlYXRoZXJSZXBvcnRDbGllbnQobXAyKSk7CisgKgorICogICAgIHNlcnZpY2UxLT5hZGQoMiwyKTsKKyAqICAgICBpbnQgdGVtcCA9IHNlcnZpY2UyLT5nZXRUZW1wZXJhdHVyZSgpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqCisgKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRGVjb3JhdG9yCisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIDogcHVibGljIFRQcm90b2NvbERlY29yYXRvciB7CitwdWJsaWM6CisgIC8qKgorICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICoKKyAgICogXHBhcmFtIF9wcm90b2NvbCAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIDxjb2RlPlRCaW5hcnlQcm90b2NvbDwvY29kZT4uCisgICAqIFxwYXJhbSBfc2VydmljZU5hbWUgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgKi8KKyAgVE11bHRpcGxleGVkUHJvdG9jb2woc2hhcmVkX3B0cjxUUHJvdG9jb2w+IF9wcm90b2NvbCwgY29uc3Qgc3RkOjpzdHJpbmcmIF9zZXJ2aWNlTmFtZSkKKyAgICA6IFRQcm90b2NvbERlY29yYXRvcihfcHJvdG9jb2wpLCBzZXJ2aWNlTmFtZShfc2VydmljZU5hbWUpLCBzZXBhcmF0b3IoIjoiKSB7fQorICB2aXJ0dWFsIH5UTXVsdGlwbGV4ZWRQcm90b2NvbCgpIHt9CisKKyAgLyoqCisgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SLgorICAgKgorICAgKiBccGFyYW0gW2luXSBfbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIGluIHRoZSBzZXJ2aWNlLgorICAgKiBccGFyYW0gW2luXSBfdHlwZSAgIFRoZSB0eXBlIG9mIG1lc3NhZ2UKKyAgICogXHBhcmFtIFtpbl0gX25hbWUgICBUaGUgc2VxdWVudGlhbCBpZCBvZiB0aGUgbWVzc2FnZQorICAgKgorICAgKiBcdGhyb3dzIFRFeGNlcHRpb24gIFBhc3NlZCB0aHJvdWdoIGZyb20gd3JhcHBlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLgorICAgKi8KKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKTsKKworcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2VydmljZU5hbWU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHNlcGFyYXRvcjsKK307Cit9Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfVE1VTFRJUExFWEVEUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3OGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK1RQcm90b2NvbDo6flRQcm90b2NvbCgpIHt9Cit1aW50MzJfdCBUUHJvdG9jb2w6OnNraXBfdmlydChUVHlwZSB0eXBlKSB7CisgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqdGhpcywgdHlwZSk7Cit9CisKK1RQcm90b2NvbEZhY3Rvcnk6On5UUHJvdG9jb2xGYWN0b3J5KCkge30KKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzY4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKQEAgLTAsMCArMSw3NjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCisKKyNpZmRlZiBfV0lOMzIKKy8vIE5lZWQgdG8gY29tZSBiZWZvcmUgYW55IFdpbmRvd3MuaCBpbmNsdWRlcworI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKworLy8gVXNlIHRoaXMgdG8gZ2V0IGFyb3VuZCBzdHJpY3QgYWxpYXNpbmcgcnVsZXMuCisvLyBGb3IgZXhhbXBsZSwgdWludDY0X3QgaSA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4ocmV0dXJuc19kb3VibGUoKSk7CisvLyBUaGUgbW9zdCBvYnZpb3VzIGltcGxlbWVudGF0aW9uIGlzIHRvIGp1c3QgY2FzdCBhIHBvaW50ZXIsCisvLyBidXQgdGhhdCBkb2Vzbid0IHdvcmsuCisvLyBGb3IgYSBwcmV0dHkgaW4tZGVwdGggZXhwbGFuYXRpb24gb2YgdGhlIHByb2JsZW0sIHNlZQorLy8gaHR0cDovL2NlbGxwZXJmb3JtYW5jZS5iZXlvbmQzZC5jb20vYXJ0aWNsZXMvMjAwNi8wNi91bmRlcnN0YW5kaW5nLXN0cmljdC1hbGlhc2luZy5odG1sCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitzdGF0aWMgaW5saW5lIFRvIGJpdHdpc2VfY2FzdChGcm9tIGZyb20pIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSwgInNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pIik7CisKKyAgLy8gQkFEISEhICBUaGVzZSBhcmUgYWxsIGJyb2tlbiB3aXRoIC1PMi4KKyAgLy9yZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VG8qPigmZnJvbSk7ICAvLyBCQUQhISEKKyAgLy9yZXR1cm4gKnN0YXRpY19jYXN0PFRvKj4oc3RhdGljX2Nhc3Q8dm9pZCo+KCZmcm9tKSk7ICAvLyBCQUQhISEKKyAgLy9yZXR1cm4gKihUbyopKHZvaWQqKSZmcm9tOyAgLy8gQkFEISEhCisKKyAgLy8gU3VwZXIgY2xlYW4gYW5kIHBhcml0YWxseSBibGVzc2VkIGJ5IHNlY3Rpb24gMy45IG9mIHRoZSBzdGFuZGFyZC4KKyAgLy91bnNpZ25lZCBjaGFyIGNbc2l6ZW9mKGZyb20pXTsKKyAgLy9tZW1jcHkoYywgJmZyb20sIHNpemVvZihmcm9tKSk7CisgIC8vVG8gdG87CisgIC8vbWVtY3B5KCZ0bywgYywgc2l6ZW9mKGMpKTsKKyAgLy9yZXR1cm4gdG87CisKKyAgLy8gU2xpZ2h0bHkgbW9yZSBxdWVzdGlvbmFibGUuCisgIC8vIFNhbWUgY29kZSBlbWl0dGVkIGJ5IEdDQy4KKyAgLy9UbyB0bzsKKyAgLy9tZW1jcHkoJnRvLCAmZnJvbSwgc2l6ZW9mKGZyb20pKTsKKyAgLy9yZXR1cm4gdG87CisKKyAgLy8gVGVjaG5pY2FsbHkgdW5kZWZpbmVkLCBidXQgYWxtb3N0IHVuaXZlcnNhbGx5IHN1cHBvcnRlZCwKKyAgLy8gYW5kIHRoZSBtb3N0IGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdW5pb24geworICAgIEZyb20gZjsKKyAgICBUbyB0OworICB9IHU7CisgIHUuZiA9IGZyb207CisgIHJldHVybiB1LnQ7Cit9CisKKworI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaWZuZGVmIF9fVEhSSUZUX0JZVEVfT1JERVIKKyMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKKyMgIGRlZmluZSBfX1RIUklGVF9CWVRFX09SREVSIEJZVEVfT1JERVIKKyMgIGRlZmluZSBfX1RIUklGVF9MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX1RIUklGVF9CSUdfRU5ESUFOIEJJR19FTkRJQU4KKyMgZWxzZQorIyAgaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L2RldGFpbC9lbmRpYW4uaHBwPgorIyAgZGVmaW5lIF9fVEhSSUZUX0JZVEVfT1JERVIgQk9PU1RfQllURV9PUkRFUgorIyAgaWZkZWYgQk9PU1RfTElUVExFX0VORElBTgorIyAgIGRlZmluZSBfX1RIUklGVF9MSVRUTEVfRU5ESUFOIF9fVEhSSUZUX0JZVEVfT1JERVIKKyMgICBkZWZpbmUgX19USFJJRlRfQklHX0VORElBTiAwCisjICBlbHNlCisjICAgZGVmaW5lIF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4gMAorIyAgIGRlZmluZSBfX1RIUklGVF9CSUdfRU5ESUFOIF9fVEhSSUZUX0JZVEVfT1JERVIKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmIF9fVEhSSUZUX0JZVEVfT1JERVIgPT0gX19USFJJRlRfQklHX0VORElBTgorIyBpZiAhZGVmaW5lZChUSFJJRlRfbnRvaGxsKQorIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSAobikKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjICBpbmNsdWRlIDxieXRlc3dhcC5oPgorIyAgZGVmaW5lIFRIUklGVF9odG9sZWxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZXMobikgYnN3YXBfMTYobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hzKG4pIGJzd2FwXzE2KG4pCisjIGVsc2UgLyogR05VQyAmIEdMSUJDICovCisjICBkZWZpbmUgYnN3YXBfNjQobikgXAorICAgICAgKCAoKChuKSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpIFwKKyAgICAgIHwgKCgobikgJiAweDAwZmYwMDAwMDAwMDAwMDB1bGwpID4+IDQwKSBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwZmYwMDAwMDAwMDAwdWxsKSA+PiAyNCkgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwZmYwMDAwMDB1bGwpIDw8IDgpICBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwZmYwMDAwdWxsKSA8PCAyNCkgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDAwMDAwZmZ1bGwpIDw8IDU2KSApCisjICBkZWZpbmUgYnN3YXBfMzIobikgXAorICAgICAgKCAoKChuKSAmIDB4ZmYwMDAwMDB1bCkgPj4gMjQpIFwKKyAgICAgIHwgKCgobikgJiAweDAwZmYwMDAwdWwpID4+IDgpICBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwZmYwMHVsKSA8PCA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwZmZ1bCkgPDwgMjQpICkKKyMgIGRlZmluZSBic3dhcF8xNihuKSBcCisgICAgICAoICgoKG4pICYgKCh1bnNpZ25lZCBzaG9ydCkweGZmMDB1bCkpID4+IDgpICBcCisgICAgICB8ICgoKG4pICYgKCh1bnNpZ25lZCBzaG9ydCkweDAwZmZ1bCkpIDw8IDgpICApCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlcyhuKSBic3dhcF8xNihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgYnN3YXBfMTYobikKKyMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCisjZWxpZiBfX1RIUklGVF9CWVRFX09SREVSID09IF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlcyhuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hzKG4pIChuKQorIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9ubGwobikgYnN3YXBfNjQobikKKyMgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAvKiBNaWNyb3NvZnQgVmlzdWFsIEMrKyAqLworIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgKCBfYnl0ZXN3YXBfdWludDY0KCh1aW50NjRfdCluKSApCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSAoIF9ieXRlc3dhcF91aW50NjQoKHVpbnQ2NF90KW4pICkKKyMgZWxpZiAhZGVmaW5lZChUSFJJRlRfbnRvaGxsKSAvKiBOb3QgR05VQy9HTElCQyBvciBNU1ZDICovCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAoICgoKHVpbnQ2NF90KW50b2hsKCh1aW50MzJfdCluKSkgPDwgMzIpICsgbnRvaGwoKHVpbnQzMl90KShuID4+IDMyKSkgKQorIyAgZGVmaW5lIFRIUklGVF9odG9ubGwobikgKCAoKCh1aW50NjRfdClodG9ubCgodWludDMyX3QpbikpIDw8IDMyKSArIGh0b25sKCh1aW50MzJfdCkobiA+PiAzMikpICkKKyMgZW5kaWYgLyogR05VQy9HTElCQyBvciBNU1ZDIG9yIHNvbWV0aGluZyBlbHNlICovCisjZWxzZSAvKiBfX1RIUklGVF9CWVRFX09SREVSICovCisjIGVycm9yICJDYW4ndCBkZWZpbmUgVEhSSUZUX2h0b25sbCBvciBUSFJJRlRfbnRvaGxsISIKKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKKworLyoqCisgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbCBzdXBwb3J0cy4KKyAqIFRha2Ugc3BlY2lhbCBub3RlIG9mIHRoZSBUX0VORCB0eXBlIHdoaWNoIGlzIHVzZWQgc3BlY2lmaWNhbGx5IHRvIG1hcmsKKyAqIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBmaWVsZHMuCisgKi8KK2VudW0gVFR5cGUgeworICBUX1NUT1AgICAgICAgPSAwLAorICBUX1ZPSUQgICAgICAgPSAxLAorICBUX0JPT0wgICAgICAgPSAyLAorICBUX0JZVEUgICAgICAgPSAzLAorICBUX0kwOCAgICAgICAgPSAzLAorICBUX0kxNiAgICAgICAgPSA2LAorICBUX0kzMiAgICAgICAgPSA4LAorICBUX1U2NCAgICAgICAgPSA5LAorICBUX0k2NCAgICAgICAgPSAxMCwKKyAgVF9ET1VCTEUgICAgID0gNCwKKyAgVF9TVFJJTkcgICAgID0gMTEsCisgIFRfVVRGNyAgICAgICA9IDExLAorICBUX1NUUlVDVCAgICAgPSAxMiwKKyAgVF9NQVAgICAgICAgID0gMTMsCisgIFRfU0VUICAgICAgICA9IDE0LAorICBUX0xJU1QgICAgICAgPSAxNSwKKyAgVF9VVEY4ICAgICAgID0gMTYsCisgIFRfVVRGMTYgICAgICA9IDE3Cit9OworCisvKioKKyAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgbWVzc2FnZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAqIHN1cHBvcnRzLgorICovCitlbnVtIFRNZXNzYWdlVHlwZSB7CisgIFRfQ0FMTCAgICAgICA9IDEsCisgIFRfUkVQTFkgICAgICA9IDIsCisgIFRfRVhDRVBUSU9OICA9IDMsCisgIFRfT05FV0FZICAgICA9IDQKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCA9IDY0OworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhIHRocmlmdCBwcm90b2NvbCBkcml2ZXIuIFRoZXNlIGFyZSBhbGwgdGhlIG1ldGhvZHMgdGhhdAorICogYSBwcm90b2NvbCBtdXN0IGltcGxlbWVudC4gRXNzZW50aWFsbHksIHRoZXJlIG11c3QgYmUgc29tZSB3YXkgb2YgcmVhZGluZworICogYW5kIHdyaXRpbmcgYWxsIHRoZSBiYXNlIHR5cGVzLCBwbHVzIGEgbWVjaGFuaXNtIGZvciB3cml0aW5nIG91dCBzdHJ1Y3RzCisgKiB3aXRoIGluZGV4ZWQgZmllbGRzLgorICoKKyAqIFRQcm90b2NvbCBvYmplY3RzIHNob3VsZCBub3QgYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBlbmNvZGluZyBjb250ZXh0cywKKyAqIGFzIHRoZXkgbWF5IG5lZWQgdG8gbWFpbnRhaW4gaW50ZXJuYWwgc3RhdGUgaW4gc29tZSBwcm90b2NvbHMgKGkuZS4gWE1MKS4KKyAqIE5vdGUgdGhhdCBpcyBpcyBhY2NlcHRhYmxlIGZvciB0aGUgVFByb3RvY29sIG1vZHVsZSB0byBkbyBpdHMgb3duIGludGVybmFsCisgKiBidWZmZXJlZCByZWFkcy93cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgVFRyYW5zcG9ydCB3aGVyZSBhcHByb3ByaWF0ZSAoaS5lLgorICogd2hlbiBwYXJzaW5nIGFuIGlucHV0IFhNTCBzdHJlYW0sIHJlYWRpbmcgc2hvdWxkIGJlIGJhdGNoZWQgcmF0aGVyIHRoYW4KKyAqIGxvb2tpbmcgYWhlYWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBmb3IgYSBjbG9zZSB0YWcpLgorICoKKyAqLworY2xhc3MgVFByb3RvY29sIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb3RvY29sKCk7CisKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgorICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpCisgICAgICA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2xfdmlydChjb25zdCBib29sIHZhbHVlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJ5dGVfdmlydChjb25zdCBpbnQ4X3QgYnl0ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgPSAwOworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU3RydWN0QmVnaW5fdmlydChuYW1lKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU3RydWN0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbl92aXJ0KG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlRmllbGRFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVGaWVsZFN0b3BfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVNYXBCZWdpbl92aXJ0KGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVNYXBFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUxpc3RCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUxpc3RFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU2V0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZVNldEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlQm9vbF92aXJ0KHZhbHVlKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlQnl0ZV92aXJ0KGJ5dGUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUkxNl92aXJ0KGkxNik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlSTMyX3ZpcnQoaTMyKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVJNjRfdmlydChpNjQpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlRG91YmxlX3ZpcnQoZHViKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZVN0cmluZ192aXJ0KHN0cik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVCaW5hcnlfdmlydChzdHIpOworICB9CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkxNl92aXJ0KGludDE2X3QmIGkxNikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMl92aXJ0KGludDMyX3QmIGkzMikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RyaW5nX3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKKworICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRNZXNzYWdlQmVnaW5fdmlydChuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZE1lc3NhZ2VFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZFN0cnVjdEJlZ2luX3ZpcnQobmFtZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRTdHJ1Y3RFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkRmllbGRCZWdpbl92aXJ0KG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEZpZWxkRW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZE1hcEJlZ2luX3ZpcnQoa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRNYXBFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZExpc3RCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRMaXN0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZFNldEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU2V0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEJvb2xfdmlydCh2YWx1ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQnl0ZV92aXJ0KGJ5dGUpOworICB9CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkSTE2X3ZpcnQoaTE2KTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEkzMl92aXJ0KGkzMik7CisgIH0KKworICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRJNjRfdmlydChpNjQpOworICB9CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWREb3VibGVfdmlydChkdWIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZFN0cmluZ192aXJ0KHN0cik7CisgIH0KKworICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQmluYXJ5X3ZpcnQoc3RyKTsKKyAgfQorCisgIC8qCisgICAqIHN0ZDo6dmVjdG9yIGlzIHNwZWNpYWxpemVkIGZvciBib29sLCBhbmQgaXRzIGVsZW1lbnRzIGFyZSBpbmRpdmlkdWFsIGJpdHMKKyAgICogcmF0aGVyIHRoYW4gYm9vbHMuICAgV2UgbmVlZCB0byBkZWZpbmUgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiByZWFkQm9vbCgpCisgICAqIHRvIHdvcmsgd2l0aCBzdGQ6OnZlY3Rvcjxib29sPi4KKyAgICovCisgIHVpbnQzMl90IHJlYWRCb29sKHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQm9vbF92aXJ0KHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEuCisgICAqLworICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiBza2lwX3ZpcnQodHlwZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSk7CisKKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CisKKyAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHR3byBjYWxscywgdGhleSBhcmUgZm9yIGJhY2t3YXJkcworICAvLyBjb21wYXRpYmlsaXR5CisgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0SW5wdXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CisgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0T3V0cHV0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQorCisgIC8vIGlucHV0IGFuZCBvdXRwdXQgcmVjdXJzaW9uIGRlcHRoIGFyZSBrZXB0IHNlcGFyYXRlIHNvIHRoYXQgb25lIHByb3RvY29sCisgIC8vIGNhbiBiZSB1c2VkIGNvbmN1cnJlbnRseSBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgorICB2b2lkIGluY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKSB7CisgICAgaWYgKHJlY3Vyc2lvbl9saW1pdF8gPCArK2lucHV0X3JlY3Vyc2lvbl9kZXB0aF8pIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkRFUFRIX0xJTUlUKTsKKyAgICB9CisgIH0KKyAgdm9pZCBkZWNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCkgeyAtLWlucHV0X3JlY3Vyc2lvbl9kZXB0aF87IH0KKworICB2b2lkIGluY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCkgeworICAgIGlmIChyZWN1cnNpb25fbGltaXRfIDwgKytvdXRwdXRfcmVjdXJzaW9uX2RlcHRoXykgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6REVQVEhfTElNSVQpOworICAgIH0KKyAgfQorICB2b2lkIGRlY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCkgeyAtLW91dHB1dF9yZWN1cnNpb25fZGVwdGhfOyB9CisKKyAgdWludDMyX3QgZ2V0UmVjdXJzaW9uTGltaXQoKSBjb25zdCB7cmV0dXJuIHJlY3Vyc2lvbl9saW1pdF87fQorICB2b2lkIHNldFJlY3VyaXNpb25MaW1pdCh1aW50MzJfdCBkZXB0aCkge3JlY3Vyc2lvbl9saW1pdF8gPSBkZXB0aDt9CisKK3Byb3RlY3RlZDoKKyAgVFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCisgICAgOiBwdHJhbnNfKHB0cmFucyksIGlucHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIG91dHB1dF9yZWN1cnNpb25fZGVwdGhfKDApLCByZWN1cnNpb25fbGltaXRfKERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUKQorICB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOworCitwcml2YXRlOgorICBUUHJvdG9jb2woKSB7fQorICB1aW50MzJfdCBpbnB1dF9yZWN1cnNpb25fZGVwdGhfOworICB1aW50MzJfdCBvdXRwdXRfcmVjdXJzaW9uX2RlcHRoXzsKKyAgdWludDMyX3QgcmVjdXJzaW9uX2xpbWl0XzsKK307CisKKy8qKgorICogQ29uc3RydWN0cyBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sIG9iamVjdHMgZ2l2ZW4gdHJhbnNwb3J0cy4KKyAqLworY2xhc3MgVFByb3RvY29sRmFjdG9yeSB7CitwdWJsaWM6CisgIFRQcm90b2NvbEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRQcm90b2NvbEZhY3RvcnkoKTsKKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpblRyYW5zLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgICAgKHZvaWQpb3V0VHJhbnM7CisgICAgcmV0dXJuIGdldFByb3RvY29sKGluVHJhbnMpOworICB9Cit9OworCisvKioKKyAqIER1bW15IHByb3RvY29sIGNsYXNzLgorICoKKyAqIFRoaXMgY2xhc3MgZG9lcyBub3RoaW5nLCBhbmQgc2hvdWxkIG5ldmVyIGJlIGluc3RhbnRpYXRlZC4KKyAqIEl0IGlzIHVzZWQgb25seSBieSB0aGUgZ2VuZXJhdG9yIGNvZGUuCisgKi8KK2NsYXNzIFREdW1teVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbCB7fTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCAvIGxlZ2FjeSBjaG9pY2UKK3N0cnVjdCBUTmV0d29ya0JpZ0VuZGlhbgoreworICBzdGF0aWMgdWludDE2X3QgdG9XaXJlMTYodWludDE2X3QgeCkgICB7cmV0dXJuIGh0b25zKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IHRvV2lyZTMyKHVpbnQzMl90IHgpICAge3JldHVybiBodG9ubCh4KTt9CisgIHN0YXRpYyB1aW50NjRfdCB0b1dpcmU2NCh1aW50NjRfdCB4KSAgIHtyZXR1cm4gVEhSSUZUX2h0b25sbCh4KTt9CisgIHN0YXRpYyB1aW50MTZfdCBmcm9tV2lyZTE2KHVpbnQxNl90IHgpIHtyZXR1cm4gbnRvaHMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgZnJvbVdpcmUzMih1aW50MzJfdCB4KSB7cmV0dXJuIG50b2hsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IGZyb21XaXJlNjQodWludDY0X3QgeCkge3JldHVybiBUSFJJRlRfbnRvaGxsKHgpO30KK307CisKKy8vIE9uIG1vc3Qgc3lzdGVtcywgdGhpcyB3aWxsIGJlIGEgYml0IGZhc3RlciB0aGFuIFROZXR3b3JrQmlnRW5kaWFuCitzdHJ1Y3QgVE5ldHdvcmtMaXR0bGVFbmRpYW4KK3sKKyAgc3RhdGljIHVpbnQxNl90IHRvV2lyZTE2KHVpbnQxNl90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbGVzKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IHRvV2lyZTMyKHVpbnQzMl90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbGVsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IHRvV2lyZTY0KHVpbnQ2NF90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbGVsbCh4KTt9CisgIHN0YXRpYyB1aW50MTZfdCBmcm9tV2lyZTE2KHVpbnQxNl90IHgpIHtyZXR1cm4gVEhSSUZUX2xldG9ocyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCBmcm9tV2lyZTMyKHVpbnQzMl90IHgpIHtyZXR1cm4gVEhSSUZUX2xldG9obCh4KTt9CisgIHN0YXRpYyB1aW50NjRfdCBmcm9tV2lyZTY0KHVpbnQ2NF90IHgpIHtyZXR1cm4gVEhSSUZUX2xldG9obGwoeCk7fQorfTsKKworc3RydWN0IFRPdXRwdXRSZWN1cnNpb25UcmFja2VyIHsKKyAgVFByb3RvY29sICZwcm90XzsKKyAgVE91dHB1dFJlY3Vyc2lvblRyYWNrZXIoVFByb3RvY29sICZwcm90KSA6IHByb3RfKHByb3QpIHsKKyAgICBwcm90Xy5pbmNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpOworICB9CisgIH5UT3V0cHV0UmVjdXJzaW9uVHJhY2tlcigpIHsKKyAgICBwcm90Xy5kZWNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpOworICB9Cit9OworCitzdHJ1Y3QgVElucHV0UmVjdXJzaW9uVHJhY2tlciB7CisgIFRQcm90b2NvbCAmcHJvdF87CisgIFRJbnB1dFJlY3Vyc2lvblRyYWNrZXIoVFByb3RvY29sICZwcm90KSA6IHByb3RfKHByb3QpIHsKKyAgICBwcm90Xy5pbmNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KKyAgflRJbnB1dFJlY3Vyc2lvblRyYWNrZXIoKSB7CisgICAgcHJvdF8uZGVjcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpOworICB9Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIFRQcm90b2NvbDo6c2tpcCgpLgorICoKKyAqIFRlbXBsYXRpemVkIHRvIGF2b2lkIGhhdmluZyB0byBtYWtlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbHMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+Cit1aW50MzJfdCBza2lwKFByb3RvY29sXyYgcHJvdCwgVFR5cGUgdHlwZSkgeworICBUSW5wdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIocHJvdCk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9CT09MOiB7CisgICAgYm9vbCBib29sdjsKKyAgICByZXR1cm4gcHJvdC5yZWFkQm9vbChib29sdik7CisgIH0KKyAgY2FzZSBUX0JZVEU6IHsKKyAgICBpbnQ4X3QgYnl0ZXYgPSAwOworICAgIHJldHVybiBwcm90LnJlYWRCeXRlKGJ5dGV2KTsKKyAgfQorICBjYXNlIFRfSTE2OiB7CisgICAgaW50MTZfdCBpMTY7CisgICAgcmV0dXJuIHByb3QucmVhZEkxNihpMTYpOworICB9CisgIGNhc2UgVF9JMzI6IHsKKyAgICBpbnQzMl90IGkzMjsKKyAgICByZXR1cm4gcHJvdC5yZWFkSTMyKGkzMik7CisgIH0KKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgaTY0OworICAgIHJldHVybiBwcm90LnJlYWRJNjQoaTY0KTsKKyAgfQorICBjYXNlIFRfRE9VQkxFOiB7CisgICAgZG91YmxlIGR1YjsKKyAgICByZXR1cm4gcHJvdC5yZWFkRG91YmxlKGR1Yik7CisgIH0KKyAgY2FzZSBUX1NUUklORzogeworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICByZXR1cm4gcHJvdC5yZWFkQmluYXJ5KHN0cik7CisgIH0KKyAgY2FzZSBUX1NUUlVDVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBpbnQxNl90IGZpZDsKKyAgICBUVHlwZSBmdHlwZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOworICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGZ0eXBlKTsKKyAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfTUFQOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBUVHlwZSBrZXlUeXBlOworICAgIFRUeXBlIHZhbFR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwga2V5VHlwZSk7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCB2YWxUeXBlKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHByb3QucmVhZE1hcEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX1NFVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgVFR5cGUgZWxlbVR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHByb3QucmVhZFNldEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX0xJU1Q6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIFRUeXBlIGVsZW1UeXBlOworICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgcmVzdWx0ICs9IHByb3QucmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX1NUT1A6CisgIGNhc2UgVF9WT0lEOgorICBjYXNlIFRfVTY0OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1VURjE2OgorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2EwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVFBST1RPQ09MREVDT1JBVE9SX0hfCisjZGVmaW5lIFRIUklGVF9UUFJPVE9DT0xERUNPUkFUT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuCisgKgorICogPHA+U2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKTwvcD4KKyAqCisgKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE11bHRpcGxleGVkUHJvdG9jb2wKKyAqLworY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogcHVibGljIFRQcm90b2NvbCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRQcm90b2NvbERlY29yYXRvcigpIHt9CisKKyAgLy8gRGVzYzogSW5pdGlhbGl6ZXMgdGhlIHByb3RvY29sIGRlY29yYXRvciBvYmplY3QuCisgIFRQcm90b2NvbERlY29yYXRvcihzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8pCisgICAgOiBUUHJvdG9jb2wocHJvdG8tPmdldFRyYW5zcG9ydCgpKSwgcHJvdG9jb2wocHJvdG8pIHt9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWVzc2FnZUVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0QmVnaW4obmFtZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkRW5kKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRTdG9wKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVNldEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2xfdmlydChjb25zdCBib29sIHZhbHVlKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCb29sKHZhbHVlKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCeXRlKGJ5dGUpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTE2KGkxNik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJMzIoaTMyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUk2NChpNjQpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZURvdWJsZShkdWIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJpbmcoc3RyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlQmluYXJ5KHN0cik7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkRmllbGRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRNYXBFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTGlzdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCb29sKHZhbHVlKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCeXRlKGJ5dGUpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkxNihpMTYpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMl92aXJ0KGludDMyX3QmIGkzMikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJMzIoaTMyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTY0KGk2NCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1YikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWREb3VibGUoZHViKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RyaW5nKHN0cik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCaW5hcnkoc3RyKTsgfQorCitwcml2YXRlOgorICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7Cit9OworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTc4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXyAxCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgcHJvdG9jb2wgZXJyb3JzIHRoYXQgbWF5CisgKiBvY2N1ciBpbiB2YXJpb3VzIHByb3RvY29sIHN5c3RlbXMuIFRoaXMgcHJvdmlkZXMgYSBzb3J0IG9mIGdlbmVyaWMKKyAqIHdyYXBwZXIgYXJvdW5kIHRoZSB2YWd1ZSBVTklYIEVfIGVycm9yIGNvZGVzIHRoYXQgbGV0cyBhIGNvbW1vbiBjb2RlCisgKiBiYXNlIG9mIGVycm9yIGhhbmRsaW5nIHRvIGJlIHVzZWQgZm9yIHZhcmlvdXMgdHlwZXMgb2YgcHJvdG9jb2xzLCBpLmUuCisgKiBwaXBlcyBldGMuCisgKgorICovCitjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworcHVibGljOgorICAvKioKKyAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCisgICAqLworICBlbnVtIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgeworICAgIFVOS05PV04gPSAwLAorICAgIElOVkFMSURfREFUQSA9IDEsCisgICAgTkVHQVRJVkVfU0laRSA9IDIsCisgICAgU0laRV9MSU1JVCA9IDMsCisgICAgQkFEX1ZFUlNJT04gPSA0LAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUsCisgICAgREVQVEhfTElNSVQgPSA2CisgIH07CisKKyAgVFByb3RvY29sRXhjZXB0aW9uKCkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwgdHlwZV8odHlwZSkge30KKworICBUUHJvdG9jb2xFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8oVU5LTk9XTikge30KKworICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQorCisgIHZpcnR1YWwgflRQcm90b2NvbEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CisKKyAgLyoqCisgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCisgICAqIHRoYXQgaGFzIG9jY3VycmVkLgorICAgKgorICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKKyAgICovCisgIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgeworICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CisgICAgICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgICBjYXNlIFVOS05PV046CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBVbmtub3duIHByb3RvY29sIGV4Y2VwdGlvbiI7CisgICAgICBjYXNlIElOVkFMSURfREFUQToKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEludmFsaWQgZGF0YSI7CisgICAgICBjYXNlIE5FR0FUSVZFX1NJWkU6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOZWdhdGl2ZSBzaXplIjsKKyAgICAgIGNhc2UgU0laRV9MSU1JVDoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEV4Y2VlZGVkIHNpemUgbGltaXQiOworICAgICAgY2FzZSBCQURfVkVSU0lPTjoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEludmFsaWQgdmVyc2lvbiI7CisgICAgICBjYXNlIE5PVF9JTVBMRU1FTlRFRDoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5vdCBpbXBsZW1lbnRlZCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIEVycm9yIGNvZGUKKyAgICovCisgIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAwYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CisKKy8qKgorICogUHV0cyBhIHdpcmV0YXAgb24gYSBwcm90b2NvbCBvYmplY3QuICBBbnkgcmVhZHMgdG8gdGhpcyBjbGFzcyBhcmUgcGFzc2VkCisgKiB0aHJvdWdoIHRvIGFuIGVuY2xvc2VkIHByb3RvY29sIG9iamVjdCwgYnV0IGFsc28gbWlycm9yZWQgYXMgd3JpdGUgdG8gYQorICogc2Vjb25kIHByb3RvY29sIG9iamVjdC4KKyAqCisgKi8KK2NsYXNzIFRQcm90b2NvbFRhcCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4geworcHVibGljOgorICBUUHJvdG9jb2xUYXAoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlLCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+KHNvdXJjZS0+Z2V0VHJhbnNwb3J0KCkpLCBzb3VyY2VfKHNvdXJjZSksIHNpbmtfKHNpbmspIHt9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgICBzaW5rXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgc2lua18tPndyaXRlTWVzc2FnZUVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICAgIHNpbmtfLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgICBpZiAoZmllbGRUeXBlID09IFRfU1RPUCkgeworICAgICAgc2lua18tPndyaXRlRmllbGRTdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNpbmtfLT53cml0ZUZpZWxkQmVnaW4obmFtZS5jX3N0cigpLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICAgIH0KKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRmllbGRFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVGaWVsZEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgICAgc2lua18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNYXBFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVNYXBFbmQoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIHNpbmtfLT53cml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEVuZCgpOworICAgIHNpbmtfLT53cml0ZUxpc3RFbmQoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICBzaW5rXy0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTZXRFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVTZXRFbmQoKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJvb2wodmFsdWUpOworICAgIHNpbmtfLT53cml0ZUJvb2wodmFsdWUpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+OjpyZWFkQm9vbDsKKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCeXRlKGJ5dGUpOworICAgIHNpbmtfLT53cml0ZUJ5dGUoYnl0ZSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJMTYoaTE2KTsKKyAgICBzaW5rXy0+d3JpdGVJMTYoaTE2KTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEkzMihpMzIpOworICAgIHNpbmtfLT53cml0ZUkzMihpMzIpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTY0KGk2NCk7CisgICAgc2lua18tPndyaXRlSTY0KGk2NCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZERvdWJsZShkdWIpOworICAgIHNpbmtfLT53cml0ZURvdWJsZShkdWIpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFN0cmluZyhzdHIpOworICAgIHNpbmtfLT53cml0ZVN0cmluZyhzdHIpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJpbmFyeShzdHIpOworICAgIHNpbmtfLT53cml0ZUJpbmFyeShzdHIpOworICAgIHJldHVybiBydjsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OThiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitlbnVtIFBST1RPQ09MX1RZUEVTIHsKKyAgVF9CSU5BUllfUFJPVE9DT0wgPSAwLAorICBUX0pTT05fUFJPVE9DT0wgPSAxLAorICBUX0NPTVBBQ1RfUFJPVE9DT0wgPSAyLAorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYTU3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RWSVJUVUFMUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UVklSVFVBTFBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgVFByb3RvY29sIG1ldGhvZHMuCisgKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbm9uLXZpcnR1YWwgVFByb3RvY29sCisgKiBtZXRob2RzLiAgSXQgZXhpc3RzIHByaW1hcmlseSBzbyBUVmlydHVhbFByb3RvY29sIGNhbiBkZXJpdmUgZnJvbSBpdC4gIEl0CisgKiBwcmV2ZW50cyBUVmlydHVhbFByb3RvY29sIG1ldGhvZHMgZnJvbSBjYXVzaW5nIGluZmluaXRlIHJlY3Vyc2lvbiBpZiB0aGUKKyAqIG5vbi12aXJ0dWFsIG1ldGhvZHMgYXJlIG5vdCBvdmVycmlkZGVuIGJ5IHRoZSBUVmlydHVhbFByb3RvY29sIHN1YmNsYXNzLgorICoKKyAqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5LiAgVXNlIFRWaXJ0dWFsUHJvdG9jb2wKKyAqIGluc3RlYWQuCisgKi8KK2NsYXNzIFRQcm90b2NvbERlZmF1bHRzIDogcHVibGljIFRQcm90b2NvbCB7CitwdWJsaWM6CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZCltZXNzYWdlVHlwZTsKKyAgICAodm9pZClzZXFpZDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgICh2b2lkKW5hbWU7CisgICAgKHZvaWQpZmllbGRUeXBlOworICAgICh2b2lkKWZpZWxkSWQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgICh2b2lkKWtleVR5cGU7CisgICAgKHZvaWQpdmFsVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSkgeworICAgICh2b2lkKXZhbHVlOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgICh2b2lkKXZhbHVlOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKSB7CisgICAgKHZvaWQpYnl0ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7CisgICAgKHZvaWQpaTE2OworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgICAodm9pZClpMzI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCkgeworICAgICh2b2lkKWk2NDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKKyAgICAodm9pZClkdWI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICAodm9pZClzdHI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICAodm9pZClzdHI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZCltZXNzYWdlVHlwZTsKKyAgICAodm9pZClzZXFpZDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICAgICh2b2lkKW5hbWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgICh2b2lkKW5hbWU7CisgICAgKHZvaWQpZmllbGRUeXBlOworICAgICh2b2lkKWZpZWxkSWQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICAodm9pZClrZXlUeXBlOworICAgICh2b2lkKXZhbFR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVNldEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgICAgKHZvaWQpdmFsdWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgICAodm9pZClieXRlOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgICAodm9pZClpMTY7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICAgICh2b2lkKWkzMjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgICAgKHZvaWQpaTY0OworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICAgICh2b2lkKWR1YjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICAodm9pZClzdHI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgKHZvaWQpc3RyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7IHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqdGhpcywgdHlwZSk7IH0KKworcHJvdGVjdGVkOgorICBUUHJvdG9jb2xEZWZhdWx0cyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFRQcm90b2NvbChwdHJhbnMpIHt9Cit9OworCisvKioKKyAqIENvbmNyZXRlIFRQcm90b2NvbCBjbGFzc2VzIHNob3VsZCBpbmhlcml0IGZyb20gVFZpcnR1YWxQcm90b2NvbAorICogc28gdGhleSBkb24ndCBoYXZlIHRvIG1hbnVhbGx5IG92ZXJyaWRlIHZpcnR1YWwgbWV0aG9kcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXywgY2xhc3MgU3VwZXJfID0gVFByb3RvY29sRGVmYXVsdHM+CitjbGFzcyBUVmlydHVhbFByb3RvY29sIDogcHVibGljIFN1cGVyXyB7CitwdWJsaWM6CisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RydWN0QmVnaW4obmFtZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJ1Y3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkU3RvcCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQm9vbCh2YWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUJ5dGUoYnl0ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTE2X3ZpcnQoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTE2KGkxNik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTMyKGkzMik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlSTY0KGk2NCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVEb3VibGUoZHViKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cmluZyhzdHIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJpbmFyeV92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQmluYXJ5KHN0cik7CisgIH0KKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBCZWdpbl92aXJ0KFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU2V0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoYm9vbCYgdmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQm9vbCh2YWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQnl0ZShieXRlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkxNl92aXJ0KGludDE2X3QmIGkxNikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEkxNihpMTYpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTMyKGkzMik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJNjQoaTY0KTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRG91YmxlKGR1Yik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RyaW5nKHN0cik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQmluYXJ5KHN0cik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+c2tpcCh0eXBlKTsgfQorCisgIC8qCisgICAqIFByb3ZpZGUgYSBkZWZhdWx0IHNraXAoKSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbm9uLXZpcnR1YWwgcmVhZAorICAgKiBtZXRob2RzLgorICAgKgorICAgKiBOb3RlOiBzdWJjbGFzc2VzIHRoYXQgdXNlIFRWaXJ0dWFsUHJvdG9jb2wgdG8gZGVyaXZlIGZyb20gYW5vdGhlciBwcm90b2NvbAorICAgKiBpbXBsZW1lbnRhdGlvbiAoaS5lLiwgbm90IFRQcm90b2NvbERlZmF1bHRzKSBzaG91bGQgYmV3YXJlIHRoYXQgdGhpcyBtYXkKKyAgICogb3ZlcnJpZGUgYW55IG5vbi1kZWZhdWx0IHNraXAoKSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGUgcGFyZW50CisgICAqIHRyYW5zcG9ydCBjbGFzcy4gIFRoZXkgbWF5IG5lZWQgdG8gZXhwbGljaXRseSByZWRlZmluZSBza2lwKCkgdG8gY2FsbCB0aGUKKyAgICogY29ycmVjdCBwYXJlbnQgaW1wbGVtZW50YXRpb24sIGlmIGRlc2lyZWQuCisgICAqLworICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsKKyAgICBQcm90b2NvbF8qIGNvbnN0IHByb3QgPSBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKTsKKyAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OnNraXAoKnByb3QsIHR5cGUpOworICB9CisKKyAgLyoKKyAgICogUHJvdmlkZSBhIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3IgdXNlIHdpdGgKKyAgICogc3RkOjp2ZWN0b3I8Ym9vbD4sIHRoYXQgYmVoYXZlcyB0aGUgc2FtZSBhcyByZWFkaW5nIGludG8gYSBub3JtYWwgYm9vbC4KKyAgICoKKyAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBpZiBkZXNpcmVkLCBidXQgdGhlcmUgbm9ybWFsbHkgc2hvdWxkbid0CisgICAqIGJlIGEgbmVlZCB0by4KKyAgICovCisgIHVpbnQzMl90IHJlYWRCb29sKHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKKyAgICBib29sIGIgPSBmYWxzZTsKKyAgICB1aW50MzJfdCByZXQgPSBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2woYik7CisgICAgdmFsdWUgPSBiOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgdXNpbmcgU3VwZXJfOjpyZWFkQm9vbDsgLy8gc28gd2UgZG9uJ3QgaGlkZSByZWFkQm9vbChib29sJikKKworcHJvdGVjdGVkOgorICBUVmlydHVhbFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDogU3VwZXJfKHB0cmFucykge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RWSVJUVUFMUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTlhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldCggdGhyaWZ0Y3BwcXQ1X1NPVVJDRVMKKyAgICBUUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorICAgIFRRVGNwU2VydmVyLmNwcAorKQorc2V0KENNQUtFX0FVVE9NT0MgT04pCitmaW5kX3BhY2thZ2UoUXQ1IFJFUVVJUkVEIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQorQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0NSAke3RocmlmdGNwcHF0NV9TT1VSQ0VTfSkKK1RBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0cXQ1IFF0NTo6Q29yZSBRdDU6Ok5ldHdvcmspCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0cXQ1IHRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzdjOTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8UUFic3RyYWN0U29ja2V0PgorI2luY2x1ZGUgPFFJT0RldmljZT4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RRSU9EZXZpY2VUcmFuc3BvcnQ6OlRRSU9EZXZpY2VUcmFuc3BvcnQoc2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldikgOiBkZXZfKGRldikgeworfQorCitUUUlPRGV2aWNlVHJhbnNwb3J0Ojp+VFFJT0RldmljZVRyYW5zcG9ydCgpIHsKKyAgZGV2Xy0+Y2xvc2UoKTsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpvcGVuKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzbid0IG9wZW4iKTsKKyAgfQorfQorCitib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmlzT3BlbigpIHsKKyAgcmV0dXJuIGRldl8tPmlzT3BlbigpOworfQorCitib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnBlZWsoKSB7CisgIHJldHVybiBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpID4gMDsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpjbG9zZSgpIHsKKyAgZGV2Xy0+Y2xvc2UoKTsKK30KKwordWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCByZXF1ZXN0TGVuID0gbGVuOworICB3aGlsZSAobGVuKSB7CisgICAgdWludDMyX3QgcmVhZFNpemU7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRTaXplID0gcmVhZChidWYsIGxlbik7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBpZiAobGVuICE9IHJlcXVlc3RMZW4pIHsKKyAgICAgICAgLy8gc29tZXRoaW5nIHJlYWQgYWxyZWFkeQorICAgICAgICByZXR1cm4gcmVxdWVzdExlbiAtIGxlbjsKKyAgICAgIH0KKyAgICAgIC8vIGVycm9yIGJ1dCBub3RoaW5nIHJlYWQgeWV0CisgICAgICB0aHJvdzsKKyAgICB9CisgICAgaWYgKHJlYWRTaXplID09IDApIHsKKyAgICAgIGRldl8tPndhaXRGb3JSZWFkeVJlYWQoNTApOworICAgIH0gZWxzZSB7CisgICAgICBidWYgKz0gcmVhZFNpemU7CisgICAgICBsZW4gLT0gcmVhZFNpemU7CisgICAgfQorICB9CisgIHJldHVybiByZXF1ZXN0TGVuOworfQorCit1aW50MzJfdCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGFjdHVhbFNpemU7CisgIHFpbnQ2NCByZWFkU2l6ZTsKKworICBpZiAoIWRldl8tPmlzT3BlbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CisgIH0KKworICBhY3R1YWxTaXplID0gKHVpbnQzMl90KShzdGQ6Om1pbikoKHFpbnQ2NClsZW4sIGRldl8tPmJ5dGVzQXZhaWxhYmxlKCkpOworICByZWFkU2l6ZSA9IGRldl8tPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmKSwgYWN0dWFsU2l6ZSk7CisKKyAgaWYgKHJlYWRTaXplIDwgMCkgeworICAgIFFBYnN0cmFjdFNvY2tldCogc29ja2V0OworICAgIGlmICgoc29ja2V0ID0gcW9iamVjdF9jYXN0PFFBYnN0cmFjdFNvY2tldCo+KGRldl8uZ2V0KCkpKSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQoKSBmcm9tIFFBYnN0cmFjdFNvY2tldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC0+ZXJyb3IoKSk7CisgICAgfQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIkZhaWxlZCB0byByZWFkIGZyb20gZnJvbSBRSU9EZXZpY2UiKTsKKyAgfQorCisgIHJldHVybiAodWludDMyX3QpcmVhZFNpemU7Cit9CisKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgd2hpbGUgKGxlbikgeworICAgIHVpbnQzMl90IHdyaXR0ZW4gPSB3cml0ZV9wYXJ0aWFsKGJ1ZiwgbGVuKTsKKyAgICBsZW4gLT0gd3JpdHRlbjsKKyAgICBkZXZfLT53YWl0Rm9yQnl0ZXNXcml0dGVuKDUwKTsKKyAgfQorfQorCit1aW50MzJfdCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojp3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHFpbnQ2NCB3cml0dGVuOworCisgIGlmICghZGV2Xy0+aXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3BhcnRpYWwoKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgfQorCisgIHdyaXR0ZW4gPSBkZXZfLT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWYpLCBsZW4pOworICBpZiAod3JpdHRlbiA8IDApIHsKKyAgICBRQWJzdHJhY3RTb2NrZXQqIHNvY2tldDsKKyAgICBpZiAoKHNvY2tldCA9IHFvYmplY3RfY2FzdDxRQWJzdHJhY3RTb2NrZXQqPihkZXZfLmdldCgpKSkpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3BhcnRpYWwoKTogZmFpbGVkIHRvIHdyaXRlIHRvIFFBYnN0cmFjdFNvY2tldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC0+ZXJyb3IoKSk7CisgICAgfQorCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3BhcnRpYWwoKTogZmFpbGVkIHRvIHdyaXRlIHRvIHVuZGVybHlpbmcgUUlPRGV2aWNlIik7CisgIH0KKworICByZXR1cm4gKHVpbnQzMl90KXdyaXR0ZW47Cit9CisKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIGlmICghZGV2Xy0+aXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdXNoKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CisgIH0KKworICBRQWJzdHJhY3RTb2NrZXQqIHNvY2tldDsKKworICBpZiAoKHNvY2tldCA9IHFvYmplY3RfY2FzdDxRQWJzdHJhY3RTb2NrZXQqPihkZXZfLmdldCgpKSkpIHsKKyAgICBzb2NrZXQtPmZsdXNoKCk7CisgIH0gZWxzZSB7CisgICAgZGV2Xy0+d2FpdEZvckJ5dGVzV3JpdHRlbigxKTsKKyAgfQorfQorCit1aW50OF90KiBUUUlPRGV2aWNlVHJhbnNwb3J0Ojpib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbGVuOworICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojpjb25zdW1lKHVpbnQzMl90IGxlbikgeworICAodm9pZClsZW47CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2U4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCitjbGFzcyBRSU9EZXZpY2U7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiAgVHJhbnNwb3J0IHRoYXQgb3BlcmF0ZXMgb24gYSBRSU9EZXZpY2UgKHNvY2tldCwgZmlsZSwgZXRjKS4KKyAqLworY2xhc3MgVFFJT0RldmljZVRyYW5zcG9ydAorICAgIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRWaXJ0dWFsVHJhbnNwb3J0PFRRSU9EZXZpY2VUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVFFJT0RldmljZVRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXYpOworICB2aXJ0dWFsIH5UUUlPRGV2aWNlVHJhbnNwb3J0KCk7CisKKyAgdm9pZCBvcGVuKCk7CisgIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgcGVlaygpOworICB2b2lkIGNsb3NlKCk7CisKKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIGZsdXNoKCk7CisKKyAgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOworCitwcml2YXRlOgorICBUUUlPRGV2aWNlVHJhbnNwb3J0KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKKyAgVFFJT0RldmljZVRyYW5zcG9ydCYgb3BlcmF0b3I9KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXZfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWFhZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx0aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8UU1ldGFUeXBlPgorI2luY2x1ZGUgPFFUY3BTb2NrZXQ+CisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydDsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6ZnVuY3Rpb247Cit1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK1FUX1VTRV9OQU1FU1BBQ0UKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK3N0cnVjdCBUUVRjcFNlcnZlcjo6Q29ubmVjdGlvbkNvbnRleHQgeworICBzaGFyZWRfcHRyPFFUY3BTb2NrZXQ+IGNvbm5lY3Rpb25fOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdF87CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdF87CisKKyAgZXhwbGljaXQgQ29ubmVjdGlvbkNvbnRleHQoc2hhcmVkX3B0cjxRVGNwU29ja2V0PiBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QpCisgICAgOiBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSwgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLCBpcHJvdF8oaXByb3QpLCBvcHJvdF8ob3Byb3QpIHt9Cit9OworCitUUVRjcFNlcnZlcjo6VFFUY3BTZXJ2ZXIoc2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFPYmplY3QqIHBhcmVudCkKKyAgOiBRT2JqZWN0KHBhcmVudCksIHNlcnZlcl8oc2VydmVyKSwgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBwZmFjdF8ocGZhY3QpIHsKKyAgcVJlZ2lzdGVyTWV0YVR5cGU8UVRjcFNvY2tldCo+KCJRVGNwU29ja2V0KiIpOworICBjb25uZWN0KHNlcnZlci5nZXQoKSwgU0lHTkFMKG5ld0Nvbm5lY3Rpb24oKSksIFNMT1QocHJvY2Vzc0luY29taW5nKCkpKTsKK30KKworVFFUY3BTZXJ2ZXI6On5UUVRjcFNlcnZlcigpIHsKK30KKwordm9pZCBUUVRjcFNlcnZlcjo6cHJvY2Vzc0luY29taW5nKCkgeworICB3aGlsZSAoc2VydmVyXy0+aGFzUGVuZGluZ0Nvbm5lY3Rpb25zKCkpIHsKKyAgICAvLyB0YWtlIG93bmVyc2hpcCBvZiB0aGUgUVRjcFNvY2tldDsgdGVjaG5pY2FsbHkgaXQgY291bGQgYmUgZGVsZXRlZAorICAgIC8vIHdoZW4gdGhlIFFUY3BTZXJ2ZXIgaXMgZGVzdHJveWVkLCBidXQgYW55IHJlYWwgYXBwIHNob3VsZCBkZWxldGUgdGhpcworICAgIC8vIGNsYXNzIGJlZm9yZSBkZWxldGluZyB0aGUgUVRjcFNlcnZlciB0aGF0IHdlIGFyZSB1c2luZworICAgIHNoYXJlZF9wdHI8UVRjcFNvY2tldD4gY29ubmVjdGlvbihzZXJ2ZXJfLT5uZXh0UGVuZGluZ0Nvbm5lY3Rpb24oKSk7CisKKyAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3Q7CisgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90OworCisgICAgdHJ5IHsKKyAgICAgIHRyYW5zcG9ydCA9IHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRRSU9EZXZpY2VUcmFuc3BvcnQoY29ubmVjdGlvbikpOworICAgICAgaXByb3QgPSBzaGFyZWRfcHRyPFRQcm90b2NvbD4ocGZhY3RfLT5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgIG9wcm90ID0gc2hhcmVkX3B0cjxUUHJvdG9jb2w+KHBmYWN0Xy0+Z2V0UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0cmFuc3BvcnRzL3Byb3RvY29scyIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY3R4TWFwX1tjb25uZWN0aW9uLmdldCgpXQorICAgICAgICA9IHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+KG5ldyBDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uLCB0cmFuc3BvcnQsIGlwcm90LCBvcHJvdCkpOworCisgICAgY29ubmVjdChjb25uZWN0aW9uLmdldCgpLCBTSUdOQUwocmVhZHlSZWFkKCkpLCBTTE9UKGJlZ2luRGVjb2RlKCkpKTsKKworICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKGRpc2Nvbm5lY3RlZCgpKSwgU0xPVChzb2NrZXRDbG9zZWQoKSkpOworICB9Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmJlZ2luRGVjb2RlKCkgeworICBRVGNwU29ja2V0KiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKKyAgUV9BU1NFUlQoY29ubmVjdGlvbik7CisKKyAgaWYgKGN0eE1hcF8uZmluZChjb25uZWN0aW9uKSA9PSBjdHhNYXBfLmVuZCgpKSB7CisgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gR290IGRhdGEgb24gYW4gdW5rbm93biBRVGNwU29ja2V0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4ID0gY3R4TWFwX1tjb25uZWN0aW9uXTsKKworICB0cnkgeworICAgIHByb2Nlc3Nvcl8KKyAgICAgICAgLT5wcm9jZXNzKGJpbmQoJlRRVGNwU2VydmVyOjpmaW5pc2gsIHRoaXMsIGN0eCwgXzEpLAorICAgICAgICAgICAgICAgICAgY3R4LT5pcHJvdF8sCisgICAgICAgICAgICAgICAgICBjdHgtPm9wcm90Xyk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVFRyYW5zcG9ydEV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZzogJyVzJyIsIGV4LndoYXQoKSk7CisgICAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBwcm9jZXNzb3IgZXhjZXB0aW9uIik7CisgICAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKKyAgfQorfQorCit2b2lkIFRRVGNwU2VydmVyOjpzb2NrZXRDbG9zZWQoKSB7CisgIFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24ocW9iamVjdF9jYXN0PFFUY3BTb2NrZXQqPihzZW5kZXIoKSkpOworICBRX0FTU0VSVChjb25uZWN0aW9uKTsKKyAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKK30KKwordm9pZCBUUVRjcFNlcnZlcjo6ZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbikgeworICBjb25zdCBDb25uZWN0aW9uQ29udGV4dE1hcDo6c2l6ZV90eXBlIGRlbGV0ZWQgPSBjdHhNYXBfLmVyYXNlKGNvbm5lY3Rpb24pOworICBpZiAoMCA9PSBkZWxldGVkKSB7CisgICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBVbmtub3duIFFUY3BTb2NrZXQiKTsKKyAgfQorfQorCit2b2lkIFRRVGNwU2VydmVyOjpzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgUU1ldGFPYmplY3Q6Omludm9rZU1ldGhvZCh0aGlzLCAiZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQiLCBRdDo6UXVldWVkQ29ubmVjdGlvbiwgUV9BUkcoUVRjcFNvY2tldCosIGNvbm5lY3Rpb24pKTsKK30KKwordm9pZCBUUVRjcFNlcnZlcjo6ZmluaXNoKHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KSB7CisgIGlmICghaGVhbHRoeSkgeworICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFByb2Nlc3NvciBmYWlsZWQgdG8gcHJvY2VzcyBkYXRhIHN1Y2Nlc3NmdWxseSIpOworICAgIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOworICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNmZTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEFTWU5DX1FUQ1BfU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfVEFTWU5DX1FUQ1BfU0VSVkVSX0hfCisKKyNpbmNsdWRlIDxRT2JqZWN0PgorI2luY2x1ZGUgPFFUY3BTZXJ2ZXI+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworY2xhc3MgVFByb3RvY29sRmFjdG9yeTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQXN5bmNQcm9jZXNzb3I7CisKKy8qKgorICogIFNlcnZlciB0aGF0IHVzZXMgUXQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucy4KKyAqICBTaW1wbHkgZ2l2ZSBpdCBhIFFUY3BTZXJ2ZXIgdGhhdCBpcyBsaXN0ZW5pbmcsIGFsb25nIHdpdGggYW4gYXN5bmMKKyAqICBwcm9jZXNzb3IgYW5kIGEgcHJvdG9jb2wgZmFjdG9yeSwgYW5kIHRoZW4gcnVuIHRoZSBRdCBldmVudCBsb29wLgorICovCitjbGFzcyBUUVRjcFNlcnZlciA6IHB1YmxpYyBRT2JqZWN0IHsKKyAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgVFFUY3BTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgIFFPYmplY3QqIHBhcmVudCA9IE5VTEwpOworICB2aXJ0dWFsIH5UUVRjcFNlcnZlcigpOworCitwcml2YXRlIFFfU0xPVFM6CisgIHZvaWQgcHJvY2Vzc0luY29taW5nKCk7CisgIHZvaWQgYmVnaW5EZWNvZGUoKTsKKyAgdm9pZCBzb2NrZXRDbG9zZWQoKTsKKyAgdm9pZCBkZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKTsKKworcHJpdmF0ZToKKyAgUV9ESVNBQkxFX0NPUFkoVFFUY3BTZXJ2ZXIpCisKKyAgc3RydWN0IENvbm5lY3Rpb25Db250ZXh0OworCisgIHZvaWQgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKTsKKyAgdm9pZCBmaW5pc2goc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKKworICB0eXBlZGVmIHN0ZDo6bWFwPFFUY3BTb2NrZXQqLCBzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+ID4gQ29ubmVjdGlvbkNvbnRleHRNYXA7CisgIENvbm5lY3Rpb25Db250ZXh0TWFwIGN0eE1hcF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfUVRDUF9TRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGFhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RDb25uZWN0ZWRDbGllbnQ6OlRDb25uZWN0ZWRDbGllbnQoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbD4mIGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgY2xpZW50KQorCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xfKGlucHV0UHJvdG9jb2wpLAorICAgIG91dHB1dFByb3RvY29sXyhvdXRwdXRQcm90b2NvbCksCisgICAgZXZlbnRIYW5kbGVyXyhldmVudEhhbmRsZXIpLAorICAgIGNsaWVudF8oY2xpZW50KSwKKyAgICBvcGFxdWVDb250ZXh0XygwKSB7Cit9CisKK1RDb25uZWN0ZWRDbGllbnQ6On5UQ29ubmVjdGVkQ2xpZW50KCkgeworfQorCit2b2lkIFRDb25uZWN0ZWRDbGllbnQ6OnJ1bigpIHsKKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBvcGFxdWVDb250ZXh0XyA9IGV2ZW50SGFuZGxlcl8tPmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgIH0KKworICBmb3IgKGJvb2wgZG9uZSA9IGZhbHNlOyAhZG9uZTspIHsKKyAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgZXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQob3BhcXVlQ29udGV4dF8sIGNsaWVudF8pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgb3BhcXVlQ29udGV4dF8pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgc3dpdGNoICh0dHguZ2V0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEU6CisgICAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQ6CisgICAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUOgorICAgICAgICAgIC8vIENsaWVudCBkaXNjb25uZWN0ZWQgb3Igd2FzIGludGVycnVwdGVkIG9yIGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gdGhlIHJlY2VpdmUgdGltZW91dC4KKyAgICAgICAgICAvLyBObyBsb2dnaW5nIG5lZWRlZC4gIERvbmUuCisgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgIC8vIEFsbCBvdGhlciB0cmFuc3BvcnQgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkLgorICAgICAgICAgIC8vIFN0YXRlIG9mIGNvbm5lY3Rpb24gaXMgdW5rbm93bi4gIERvbmUuCisgICAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mIHRleCkgeworICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBwcm9jZXNzaW5nIGV4Y2VwdGlvbjogIikgKyB0ZXgud2hhdCgpOworICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgIC8vIERpc2Nvbm5lY3QgZnJvbSBjbGllbnQsIGJlY2F1c2Ugd2UgY291bGQgbm90IHByb2Nlc3MgdGhlIG1lc3NhZ2UuCisgICAgICBkb25lID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBjbGVhbnVwKCk7Cit9CisKK3ZvaWQgVENvbm5lY3RlZENsaWVudDo6Y2xlYW51cCgpIHsKKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBldmVudEhhbmRsZXJfLT5kZWxldGVDb250ZXh0KG9wYXF1ZUNvbnRleHRfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorCisgIHRyeSB7CisgICAgaW5wdXRQcm90b2NvbF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIH0KKworICB0cnkgeworICAgIG91dHB1dFByb3RvY29sXy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIH0KKworICB0cnkgeworICAgIGNsaWVudF8tPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgY2xpZW50IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU3MGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogVGhpcyByZXByZXNlbnRzIGEgY2xpZW50IGNvbm5lY3RlZCB0byBhIFRTZXJ2ZXIuICBUaGUKKyAqIHByb2Nlc3NpbmcgbG9vcCBmb3IgYSBjbGllbnQgbXVzdCBwcm92aWRlIHNvbWUgcmVxdWlyZWQKKyAqIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvIGFsbCBpbXBsZW1lbnRhdGlvbnMgc28gaXQgaXMKKyAqIGVuY2Fwc3VsYXRlZCBoZXJlLgorICovCisKK2NsYXNzIFRDb25uZWN0ZWRDbGllbnQgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtW2luXSBwcm9jZXNzb3IgICAgICB0aGUgVFByb2Nlc3NvcgorICAgKiBAcGFyYW1baW5dIGlucHV0UHJvdG9jb2wgIHRoZSBpbnB1dCBUUHJvdG9jb2wKKyAgICogQHBhcmFtW2luXSBvdXRwdXRQcm90b2NvbCB0aGUgb3V0cHV0IFRQcm90b2NvbAorICAgKiBAcGFyYW1baW5dIGV2ZW50SGFuZGxlciAgIHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgKiBAcGFyYW1baW5dIGNsaWVudCAgICAgICAgIHRoZSBUVHJhbnNwb3J0IHJlcHJlc2VudGluZyB0aGUgY2xpZW50CisgICAqLworICBUQ29ubmVjdGVkQ2xpZW50KAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIG91dHB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+JiBldmVudEhhbmRsZXIsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4mIGNsaWVudCk7CisKKyAgLyoqCisgICAqIERlc3RydWN0b3IuCisgICAqLworICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50KCk7CisKKyAgLyoqCisgICAqIERyaXZlIHRoZSBjbGllbnQgdW50aWwgaXQgaXMgZG9uZS4KKyAgICogVGhlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3AgaXM6CisgICAqCisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPmNyZWF0ZUNvbnRleHQgb25jZQorICAgKiBbb3B0aW9uYWxdIGNhbGwgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dCBwZXIgcmVxdWVzdAorICAgKiAgICAgICAgICAgIGNhbGwgcHJvY2Vzc29yLT5wcm9jZXNzIHBlciByZXF1ZXN0CisgICAqICAgICAgICAgICAgICBoYW5kbGUgZXhwZWN0ZWQgdHJhbnNwb3J0IGV4Y2VwdGlvbnM6CisgICAqICAgICAgICAgICAgICAgIEVORF9PRl9GSUxFIG1lYW5zIHRoZSBjbGllbnQgaXMgZ29uZQorICAgKiAgICAgICAgICAgICAgICBJTlRFUlJVUFRFRCBtZWFucyB0aGUgY2xpZW50IHdhcyBpbnRlcnJ1cHRlZAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBUU2VydmVyVHJhbnNwb3J0OjppbnRlcnJ1cHRDaGlsZHJlbigpCisgICAqICAgICAgICAgICAgICBoYW5kbGUgdW5leHBlY3RlZCB0cmFuc3BvcnQgZXhjZXB0aW9ucyBieSBsb2dnaW5nCisgICAqICAgICAgICAgICAgICBoYW5kbGUgc3RhbmRhcmQgZXhjZXB0aW9ucyBieSBsb2dnaW5nCisgICAqICAgICAgICAgICAgICBoYW5kbGUgdW5leHBlY3RlZCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICBjbGVhbnVwKCkKKyAgICovCisgIHZpcnR1YWwgdm9pZCBydW4oKSAvKiBvdmVycmlkZSAqLzsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogQ2xlYW51cCBhZnRlciBhIGNsaWVudC4gIFRoaXMgaGFwcGVucyBpZiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLAorICAgKiBvciBpZiB0aGUgc2VydmVyIGlzIHN0b3BwZWQsIG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAqCisgICAqIFRoZSBjbGVhbnVwIHByb2Nlc3NpbmcgaXM6CisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPmRlbGV0ZUNvbnRleHQgb25jZQorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBpbnB1dFByb3RvY29sJ3MgVFRyYW5zcG9ydAorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBvdXRwdXRQcm90b2NvbCdzIFRUcmFuc3BvcnQKKyAgICogICAgICAgICAgICBjbG9zZSB0aGUgY2xpZW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xlYW51cCgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGNsaWVudF87CisKKyAgLyoqCisgICAqIENvbnRleHQgYWNxdWlyZWQgZnJvbSB0aGUgZXZlbnRIYW5kbGVyXyBpZiBvbmUgZXhpc3RzLgorICAgKi8KKyAgdm9pZCogb3BhcXVlQ29udGV4dF87Cit9OworfQorfQorfQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2ZmNlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcApAQCAtMCwwICsxLDE1MjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaWZkZWYgSEFWRV9QT0xMX0gKKyNpbmNsdWRlIDxwb2xsLmg+CisjZWxpZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VsaWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0FSUEFfSU5FVF9ICisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFGX0xPQ0FMCisjZGVmaW5lIEFGX0xPQ0FMIEFGX1VOSVgKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCisvLy8gVGhyZWUgc3RhdGVzIGZvciBzb2NrZXRzOiByZWN2IGZyYW1lIHNpemUsIHJlY3YgZGF0YSwgYW5kIHNlbmQgbW9kZQorZW51bSBUU29ja2V0U3RhdGUgeyBTT0NLRVRfUkVDVl9GUkFNSU5HLCBTT0NLRVRfUkVDViwgU09DS0VUX1NFTkQgfTsKKworLyoqCisgKiBGaXZlIHN0YXRlcyBmb3IgdGhlIG5vbmJsb2NraW5nIHNlcnZlcjoKKyAqICAxKSBpbml0aWFsaXplCisgKiAgMikgcmVhZCA0IGJ5dGUgZnJhbWUgc2l6ZQorICogIDMpIHJlYWQgZnJhbWUgb2YgZGF0YQorICogIDQpIHNlbmQgYmFjayBkYXRhIChpZiBhbnkpCisgKiAgNSkgZm9yY2UgaW1tZWRpYXRlIGNvbm5lY3Rpb24gY2xvc2UKKyAqLworZW51bSBUQXBwU3RhdGUgeworICBBUFBfSU5JVCwKKyAgQVBQX1JFQURfRlJBTUVfU0laRSwKKyAgQVBQX1JFQURfUkVRVUVTVCwKKyAgQVBQX1dBSVRfVEFTSywKKyAgQVBQX1NFTkRfUkVTVUxULAorICBBUFBfQ0xPU0VfQ09OTkVDVElPTgorfTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgY29ubmVjdGlvbiB0aGF0IGlzIGhhbmRsZWQgdmlhIGxpYmV2ZW50LiBUaGlzIGNvbm5lY3Rpb24KKyAqIGVzc2VudGlhbGx5IGVuY2Fwc3VsYXRlcyBhIHNvY2tldCB0aGF0IGhhcyBzb21lIGFzc29jaWF0ZWQgbGliZXZlbnQgc3RhdGUuCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24geworcHJpdmF0ZToKKyAgLy8vIFNlcnZlciBJTyBUaHJlYWQgaGFuZGxpbmcgdGhpcyBjb25uZWN0aW9uCisgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZF87CisKKyAgLy8vIFNlcnZlciBoYW5kbGUKKyAgVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXJfOworCisgIC8vLyBUUHJvY2Vzc29yCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworCisgIC8vLyBPYmplY3Qgd3JhcHBpbmcgbmV0d29yayBzb2NrZXQKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOworCisgIC8vLyBMaWJldmVudCBvYmplY3QKKyAgc3RydWN0IGV2ZW50IGV2ZW50XzsKKworICAvLy8gTGliZXZlbnQgZmxhZ3MKKyAgc2hvcnQgZXZlbnRGbGFnc187CisKKyAgLy8vIFNvY2tldCBtb2RlCisgIFRTb2NrZXRTdGF0ZSBzb2NrZXRTdGF0ZV87CisKKyAgLy8vIEFwcGxpY2F0aW9uIHN0YXRlCisgIFRBcHBTdGF0ZSBhcHBTdGF0ZV87CisKKyAgLy8vIEhvdyBtdWNoIGRhdGEgbmVlZGVkIHRvIHJlYWQKKyAgdWludDMyX3QgcmVhZFdhbnRfOworCisgIC8vLyBXaGVyZSBpbiB0aGUgcmVhZCBidWZmZXIgYXJlIHdlCisgIHVpbnQzMl90IHJlYWRCdWZmZXJQb3NfOworCisgIC8vLyBSZWFkIGJ1ZmZlcgorICB1aW50OF90KiByZWFkQnVmZmVyXzsKKworICAvLy8gUmVhZCBidWZmZXIgc2l6ZQorICB1aW50MzJfdCByZWFkQnVmZmVyU2l6ZV87CisKKyAgLy8vIFdyaXRlIGJ1ZmZlcgorICB1aW50OF90KiB3cml0ZUJ1ZmZlcl87CisKKyAgLy8vIFdyaXRlIGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IHdyaXRlQnVmZmVyU2l6ZV87CisKKyAgLy8vIEhvdyBmYXIgdGhyb3VnaCB3cml0aW5nIGFyZSB3ZT8KKyAgdWludDMyX3Qgd3JpdGVCdWZmZXJQb3NfOworCisgIC8vLyBMYXJnZXN0IHNpemUgb2Ygd3JpdGUgYnVmZmVyIHNlZW4gc2luY2UgYnVmZmVyIHdhcyBjb25zdHJ1Y3RlZAorICBzaXplX3QgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV87CisKKyAgLy8vIENvdW50IG9mIHRoZSBudW1iZXIgb2YgY2FsbHMgZm9yIHVzZSB3aXRoIGdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpLgorICBpbnQzMl90IGNhbGxzRm9yUmVzaXplXzsKKworICAvLy8gVHJhbnNwb3J0IHRvIHJlYWQgZnJvbQorICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnRfOworCisgIC8vLyBUcmFuc3BvcnQgdGhhdCBwcm9jZXNzb3Igd3JpdGVzIHRvCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOworCisgIC8vLyBleHRyYSB0cmFuc3BvcnQgZ2VuZXJhdGVkIGJ5IHRyYW5zcG9ydCBmYWN0b3J5IChlLmcuIEJ1ZmZlcmVkUm91dGVyVHJhbnNwb3J0KQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeUlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfOworCisgIC8vLyBQcm90b2NvbCBkZWNvZGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOworCisgIC8vLyBQcm90b2NvbCBlbmNvZGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKKworICAvLy8gU2VydmVyIGV2ZW50IGhhbmRsZXIsIGlmIGFueQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKKworICAvLy8gVGhyaWZ0IGNhbGwgY29udGV4dCwgaWYgYW55CisgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKKworICAvLy8gR28gaW50byByZWFkIG1vZGUKKyAgdm9pZCBzZXRSZWFkKCkgeyBzZXRGbGFncyhFVl9SRUFEIHwgRVZfUEVSU0lTVCk7IH0KKworICAvLy8gR28gaW50byB3cml0ZSBtb2RlCisgIHZvaWQgc2V0V3JpdGUoKSB7IHNldEZsYWdzKEVWX1dSSVRFIHwgRVZfUEVSU0lTVCk7IH0KKworICAvLy8gU2V0IHNvY2tldCBpZGxlCisgIHZvaWQgc2V0SWRsZSgpIHsgc2V0RmxhZ3MoMCk7IH0KKworICAvKioKKyAgICogU2V0IGV2ZW50IGZsYWdzIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgICAqCisgICAqIEBwYXJhbSBldmVudEZsYWdzIGZsYWdzIHdlIHBhc3MgdG8gbGliZXZlbnQgZm9yIHRoZSBjb25uZWN0aW9uLgorICAgKi8KKyAgdm9pZCBzZXRGbGFncyhzaG9ydCBldmVudEZsYWdzKTsKKworICAvKioKKyAgICogTGliZXZlbnQgaGFuZGxlciBjYWxsZWQgKHZpYSBvdXIgc3RhdGljIHdyYXBwZXIpIHdoZW4gdGhlIGNvbm5lY3Rpb24KKyAgICogc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgUmF0aGVyIHRoYW4gdXNlIHRoZSBmbGFncyBsaWJldmVudCBwYXNzZWQsCisgICAqIHdlIHVzZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIHJlYWQgb3IKKyAgICogd3JpdGUgdGhlIHNvY2tldC4KKyAgICovCisgIHZvaWQgd29ya1NvY2tldCgpOworCitwdWJsaWM6CisgIGNsYXNzIFRhc2s7CisKKyAgLy8vIENvbnN0cnVjdG9yCisgIFRDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQsCisgICAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCkgeworICAgIHJlYWRCdWZmZXJfID0gTlVMTDsKKyAgICByZWFkQnVmZmVyU2l6ZV8gPSAwOworCisgICAgaW9UaHJlYWRfID0gaW9UaHJlYWQ7CisgICAgc2VydmVyXyA9IGlvVGhyZWFkLT5nZXRTZXJ2ZXIoKTsKKworICAgIC8vIEFsbG9jYXRlIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cyB0aGVzZSBvbmx5IG5lZWQgdG8gYmUgYWxsb2NhdGVkCisgICAgLy8gb25jZSBwZXIgVENvbm5lY3Rpb24gKHRoZXkgZG9uJ3QgbmVlZCB0byBiZSByZWFsbG9jYXRlZCBvbiBpbml0KCkgY2FsbCkKKyAgICBpbnB1dFRyYW5zcG9ydF8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJTaXplXykpOworICAgIG91dHB1dFRyYW5zcG9ydF8ucmVzZXQoCisgICAgICAgIG5ldyBUTWVtb3J5QnVmZmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpKSk7CisKKyAgICB0U29ja2V0XyA9ICBzb2NrZXQ7CisKKyAgICBpbml0KGlvVGhyZWFkKTsKKyAgfQorCisgIH5UQ29ubmVjdGlvbigpIHsgc3RkOjpmcmVlKHJlYWRCdWZmZXJfKTsgfQorCisgIC8vLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24gYW5kIGZyZWUgb3IgcmVzZXQgaXRzIHJlc291cmNlcy4KKyAgdm9pZCBjbG9zZSgpOworCisgIC8qKgorICAgICogQ2hlY2sgYnVmZmVycyBhZ2FpbnN0IGFueSBzaXplIGxpbWl0cyBhbmQgc2hyaW5rIGl0IGlmIGV4Y2VlZGVkLgorICAgICoKKyAgICAqIEBwYXJhbSByZWFkTGltaXQgd2UgcmVkdWNlIHJlYWQgYnVmZmVyIHNpemUgdG8gdGhpcyAoaWYgbm9uemVybykuCisgICAgKiBAcGFyYW0gd3JpdGVMaW1pdCBpZiBub256ZXJvIGFuZCB3cml0ZSBidWZmZXIgaXMgbGFyZ2VyLCByZXBsYWNlIGl0LgorICAgICovCisgIHZvaWQgY2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpOworCisgIC8vLyBJbml0aWFsaXplCisgIHZvaWQgaW5pdChUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQpOworCisgIC8vLyBzZXQgc29ja2V0IGZvciBjb25uZWN0aW9uCisgIHZvaWQgc2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOworCisgIC8qKgorICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCisgICAqIGFub3RoZXIuIFRoaXMgbWVhbnMgdGhhdCBpdCBoYXMgZmluaXNoZWQgd3JpdGluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZAorICAgKiB0bywgb3IgZmluaXNoZWQgcmVjZWl2aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkIHRvLgorICAgKi8KKyAgdm9pZCB0cmFuc2l0aW9uKCk7CisKKyAgLyoqCisgICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3IgY29ubmVjdGlvbiBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCisgICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBjb25uZWN0aW9uXy0+d29ya1NvY2tldCgpLgorICAgKgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VycmVkIG9uLgorICAgKiBAcGFyYW0gd2hpY2ggdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuCisgICAqIEBwYXJhbSB2IHZvaWQqIGNhbGxiYWNrIGFyZyB3aGVyZSB3ZSBwbGFjZWQgVENvbm5lY3Rpb24ncyAidGhpcyIuCisgICAqLworICBzdGF0aWMgdm9pZCBldmVudEhhbmRsZXIoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCAvKiB3aGljaCAqLywgdm9pZCogdikgeworICAgIGFzc2VydChmZCA9PSBzdGF0aWNfY2FzdDxldnV0aWxfc29ja2V0X3Q+KCgoVENvbm5lY3Rpb24qKXYpLT5nZXRUU29ja2V0KCktPmdldFNvY2tldEZEKCkpKTsKKyAgICAoKFRDb25uZWN0aW9uKil2KS0+d29ya1NvY2tldCgpOworICB9CisKKyAgLyoqCisgICAqIE5vdGlmaWNhdGlvbiB0byBzZXJ2ZXIgdGhhdCBwcm9jZXNzaW5nIGhhcyBlbmRlZCBvbiB0aGlzIHJlcXVlc3QuCisgICAqIENhbiBiZSBjYWxsZWQgZWl0aGVyIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZWQgb3Igd2hlbiBhIHdhaXRpbmcKKyAgICogdGFzayBoYXMgYmVlbiBwcmVlbXB0aXZlbHkgdGVybWluYXRlZCAob24gb3ZlcmxvYWQpLgorICAgKgorICAgKiBEb24ndCBjYWxsIHRoaXMgZnJvbSB0aGUgSU8gdGhyZWFkIGl0c2VsZi4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHVuYWJsZSB0byBub3RpZnkgKGNoZWNrIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKS4KKyAgICovCisgIGJvb2wgbm90aWZ5SU9UaHJlYWQoKSB7IHJldHVybiBpb1RocmVhZF8tPm5vdGlmeSh0aGlzKTsgfQorCisgIC8qCisgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGlzIGNvbm5lY3Rpb24ncyBjdXJyZW50bHkgYXNzaWduZWQgSU8KKyAgICogdGhyZWFkLgorICAgKi8KKyAgaW50IGdldElPVGhyZWFkTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gaW9UaHJlYWRfLT5nZXRUaHJlYWROdW1iZXIoKTsgfQorCisgIC8vLyBGb3JjZSBjb25uZWN0aW9uIHNodXRkb3duIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgIHZvaWQgZm9yY2VDbG9zZSgpIHsKKyAgICBhcHBTdGF0ZV8gPSBBUFBfQ0xPU0VfQ09OTkVDVElPTjsKKyAgICBpZiAoIW5vdGlmeUlPVGhyZWFkKCkpIHsKKyAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUQ29ubmVjdGlvbjo6Zm9yY2VDbG9zZTogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7CisgICAgfQorICB9CisKKyAgLy8vIHJldHVybiB0aGUgc2VydmVyIHRoaXMgY29ubmVjdGlvbiB3YXMgaW5pdGlhbGl6ZWQgZm9yLgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIGdldFNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KKworICAvLy8gZ2V0IHN0YXRlIG9mIGNvbm5lY3Rpb24uCisgIFRBcHBTdGF0ZSBnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGFwcFN0YXRlXzsgfQorCisgIC8vLyByZXR1cm4gdGhlIFRTb2NrZXQgdHJhbnNwb3J0IHdyYXBwaW5nIHRoaXMgbmV0d29yayBjb25uZWN0aW9uCisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBnZXRUU29ja2V0KCkgY29uc3QgeyByZXR1cm4gdFNvY2tldF87IH0KKworICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlciBpZiBhbnkKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KKworICAvLy8gcmV0dXJuIHRoZSBUaHJpZnQgY29ubmVjdGlvbiBjb250ZXh0IGlmIGFueQorICB2b2lkKiBnZXRDb25uZWN0aW9uQ29udGV4dCgpIHsgcmV0dXJuIGNvbm5lY3Rpb25Db250ZXh0XzsgfQorfTsKKworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CitwdWJsaWM6CisgIFRhc2soc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCisgICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pCisgICAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgICBpbnB1dF8oaW5wdXQpLAorICAgICAgb3V0cHV0XyhvdXRwdXQpLAorICAgICAgY29ubmVjdGlvbl8oY29ubmVjdGlvbiksCisgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfKGNvbm5lY3Rpb25fLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSksCisgICAgICBjb25uZWN0aW9uQ29udGV4dF8oY29ubmVjdGlvbl8tPmdldENvbm5lY3Rpb25Db250ZXh0KCkpIHt9CisKKyAgdm9pZCBydW4oKSB7CisgICAgdHJ5IHsKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKKyAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGNvbm5lY3Rpb25fLT5nZXRUU29ja2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8sIGNvbm5lY3Rpb25Db250ZXh0XykKKyAgICAgICAgICAgIHx8ICFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBjbGllbnQgZGllZDogJXMiLCB0dHgud2hhdCgpKTsKKyAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmJhZF9hbGxvYyYpIHsKKyAgICAgIEdsb2JhbE91dHB1dCgiVE5vbmJsb2NraW5nU2VydmVyOiBjYXVnaHQgYmFkX2FsbG9jIGV4Y2VwdGlvbi4iKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogcHJvY2VzcygpIGV4Y2VwdGlvbjogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWlkKHgpLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeC53aGF0KCkpOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiB1bmtub3duIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nLiIpOworICAgIH0KKworICAgIC8vIFNpZ25hbCBjb21wbGV0aW9uIGJhY2sgdG8gdGhlIGxpYmV2ZW50IHRocmVhZCB2aWEgYSBwaXBlCisgICAgaWYgKCFjb25uZWN0aW9uXy0+bm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBmYWlsZWQgdG8gbm90aWZ5SU9UaHJlYWQsIGNsb3NpbmcuIik7CisgICAgICBjb25uZWN0aW9uXy0+c2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgY29ubmVjdGlvbl8tPmNsb3NlKCk7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRhc2s6OnJ1bjogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7CisgICAgfQorICB9CisKKyAgVENvbm5lY3Rpb24qIGdldFRDb25uZWN0aW9uKCkgeyByZXR1cm4gY29ubmVjdGlvbl87IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKKyAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb25fOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKKyAgdm9pZCogY29ubmVjdGlvbkNvbnRleHRfOworfTsKKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjppbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCkgeworICBpb1RocmVhZF8gPSBpb1RocmVhZDsKKyAgc2VydmVyXyA9IGlvVGhyZWFkLT5nZXRTZXJ2ZXIoKTsKKyAgYXBwU3RhdGVfID0gQVBQX0lOSVQ7CisgIGV2ZW50RmxhZ3NfID0gMDsKKworICByZWFkQnVmZmVyUG9zXyA9IDA7CisgIHJlYWRXYW50XyA9IDA7CisKKyAgd3JpdGVCdWZmZXJfID0gTlVMTDsKKyAgd3JpdGVCdWZmZXJTaXplXyA9IDA7CisgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gMDsKKworICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVl9GUkFNSU5HOworICBjYWxsc0ZvclJlc2l6ZV8gPSAwOworCisgIC8vIGdldCBpbnB1dC90cmFuc3BvcnRzCisgIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7CisgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgLy8gQ3JlYXRlIHByb3RvY29sCisgIGlmIChzZXJ2ZXJfLT5nZXRIZWFkZXJUcmFuc3BvcnQoKSkgeworICAgIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgICBvdXRwdXRQcm90b2NvbF8gPSBpbnB1dFByb3RvY29sXzsKKyAgfSBlbHNlIHsKKyAgICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOworICAgIG91dHB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgIH0KKworICAvLyBTZXQgdXAgZm9yIGFueSBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICBzZXJ2ZXJFdmVudEhhbmRsZXJfID0gc2VydmVyXy0+Z2V0RXZlbnRIYW5kbGVyKCk7CisgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CisgICAgY29ubmVjdGlvbkNvbnRleHRfID0gc2VydmVyRXZlbnRIYW5kbGVyXy0+Y3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBOVUxMOworICB9CisKKyAgLy8gR2V0IHRoZSBwcm9jZXNzb3IKKyAgcHJvY2Vzc29yXyA9IHNlcnZlcl8tPmdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCB0U29ja2V0Xyk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6c2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKKyAgdFNvY2tldF8gPSBzb2NrZXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHsKKyAgaW50IGdvdCA9IDAsIGxlZnQgPSAwLCBzZW50ID0gMDsKKyAgdWludDMyX3QgZmV0Y2ggPSAwOworCisgIHN3aXRjaCAoc29ja2V0U3RhdGVfKSB7CisgIGNhc2UgU09DS0VUX1JFQ1ZfRlJBTUlORzoKKyAgICB1bmlvbiB7CisgICAgICB1aW50OF90IGJ1ZltzaXplb2YodWludDMyX3QpXTsKKyAgICAgIHVpbnQzMl90IHNpemU7CisgICAgfSBmcmFtaW5nOworCisgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZWNlaXZlZCBzb21lIGJ5dGVzIHdlIGtlcHQgdGhlbSBoZXJlCisgICAgZnJhbWluZy5zaXplID0gcmVhZFdhbnRfOworICAgIC8vIGRldGVybWluZSBzaXplIG9mIHRoaXMgZnJhbWUKKyAgICB0cnkgeworICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgICAgIGZldGNoID0gdFNvY2tldF8tPnJlYWQoJmZyYW1pbmcuYnVmW3JlYWRCdWZmZXJQb3NfXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qoc2l6ZW9mKGZyYW1pbmcuc2l6ZSkgLSByZWFkQnVmZmVyUG9zXykpOworICAgICAgaWYgKGZldGNoID09IDApIHsKKyAgICAgICAgLy8gV2hlbmV2ZXIgd2UgZ2V0IGhlcmUgaXQgbWVhbnMgYSByZW1vdGUgZGlzY29ubmVjdAorICAgICAgICBjbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICByZWFkQnVmZmVyUG9zXyArPSBmZXRjaDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgLy9JbiBOb25ibG9ja2luZyBTU0xTb2NrZXQgc29tZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2Fpbi4KKyAgICAgIC8vQ3VycmVudCBhcHByb2FjaCBpcyBwYXJzaW5nIGV4Y2VwdGlvbiBtZXNzYWdlLCBidXQgYSBiZXR0ZXIgc29sdXRpb24gbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgaWYoIXN0cnN0cih0ZS53aGF0KCksICJyZXRyeSIpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKKyAgICAgICAgY2xvc2UoKTsKKworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlYWRCdWZmZXJQb3NfIDwgc2l6ZW9mKGZyYW1pbmcuc2l6ZSkpIHsKKyAgICAgIC8vIG1vcmUgbmVlZGVkIGJlZm9yZSBmcmFtZSBzaXplIGlzIGtub3duIC0tIHNhdmUgd2hhdCB3ZSBoYXZlIHNvIGZhcgorICAgICAgcmVhZFdhbnRfID0gZnJhbWluZy5zaXplOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlYWRXYW50XyA9IG50b2hsKGZyYW1pbmcuc2l6ZSk7CisgICAgaWYgKHJlYWRXYW50XyA+IHNlcnZlcl8tPmdldE1heEZyYW1lU2l6ZSgpKSB7CisgICAgICAvLyBEb24ndCBhbGxvdyBnaWFudCBmcmFtZSBzaXplcy4gIFRoaXMgcHJldmVudHMgYmFkIGNsaWVudHMgZnJvbQorICAgICAgLy8gY2F1c2luZyB1cyB0byB0cnkgYW5kIGFsbG9jYXRlIGEgZ2lhbnQgYnVmZmVyLgorICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigKKyAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOiBmcmFtZSBzaXplIHRvbyBsYXJnZSAiCisgICAgICAgICAgIiglIiBQUkl1MzIgIiA+ICUiIFBSSXU2NAorICAgICAgICAgICIpIGZyb20gY2xpZW50ICVzLiAiCisgICAgICAgICAgIlJlbW90ZSBzaWRlIG5vdCB1c2luZyBURnJhbWVkVHJhbnNwb3J0PyIsCisgICAgICAgICAgcmVhZFdhbnRfLAorICAgICAgICAgICh1aW50NjRfdClzZXJ2ZXJfLT5nZXRNYXhGcmFtZVNpemUoKSwKKyAgICAgICAgICB0U29ja2V0Xy0+Z2V0U29ja2V0SW5mbygpLmNfc3RyKCkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gc2l6ZSBrbm93bjsgbm93IGdldCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUKKyAgICB0cmFuc2l0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgc29ja2V0IGhhcyBtb3JlIGRhdGEgdGhhbiB0aGUgZnJhbWUgaGVhZGVyLCBjb250aW51ZSB0byB3b3JrIG9uIGl0LiBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgZm9yCisgICAgLy8gcmVndWxhciBzb2NrZXRzLCBiZWNhdXNlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSwgbGliZXZlbnQgd2lsbCBmaXJlIHRoZSBldmVudCBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHJlYWQKKyAgICAvLyByZWFkaW5lc3MsIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIHdvcmtTb2NrZXQoKS4gSG93ZXZlciwgc29tZSBzb2NrZXQgdHlwZXMgKHN1Y2ggYXMgVFNTTFNvY2tldCkgbWF5IGhhdmUgdGhlCisgICAgLy8gZGF0YSBzaXR0aW5nIGluIHRoZWlyIGludGVybmFsIGJ1ZmZlcnMgYW5kIGZyb20gbGliZXZlbnQncyBwZXJzcGVjdGl2ZSwgdGhlcmUgaXMgbm8gZnVydGhlciBkYXRhIGF2YWlsYWJsZS4gSW4KKyAgICAvLyB0aGF0IGNhc2UsIG5vdCBoYXZpbmcgdGhpcyB3b3JrU29ja2V0KCkgY2FsbCBoZXJlIHdvdWxkIHJlc3VsdCBpbiBhIGhhbmcgYXMgd2Ugd2lsbCBuZXZlciBnZXQgdG8gd29yayB0aGUgc29ja2V0LAorICAgIC8vIGRlc3BpdGUgaGF2aW5nIG1vcmUgZGF0YS4KKyAgICBpZiAodFNvY2tldF8tPmhhc1BlbmRpbmdEYXRhVG9SZWFkKCkpCisgICAgeworICAgICAgICB3b3JrU29ja2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuOworCisgIGNhc2UgU09DS0VUX1JFQ1Y6CisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gYmUgaW4gdGhpcyBzdGF0ZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYWxsIHRoZSBkYXRhCisgICAgYXNzZXJ0KHJlYWRCdWZmZXJQb3NfIDwgcmVhZFdhbnRfKTsKKworICAgIHRyeSB7CisgICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICAgICAgZmV0Y2ggPSByZWFkV2FudF8gLSByZWFkQnVmZmVyUG9zXzsKKyAgICAgIGdvdCA9IHRTb2NrZXRfLT5yZWFkKHJlYWRCdWZmZXJfICsgcmVhZEJ1ZmZlclBvc18sIGZldGNoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgLy9JbiBOb25ibG9ja2luZyBTU0xTb2NrZXQgc29tZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2Fpbi4KKyAgICAgIC8vQ3VycmVudCBhcHByb2FjaCBpcyBwYXJzaW5nIGV4Y2VwdGlvbiBtZXNzYWdlLCBidXQgYSBiZXR0ZXIgc29sdXRpb24gbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgaWYoIXN0cnN0cih0ZS53aGF0KCksICJyZXRyeSIpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAvLyBNb3ZlIGFsb25nIGluIHRoZSBidWZmZXIKKyAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGdvdDsKKworICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWQgbm90IG92ZXJkbyBpdAorICAgICAgYXNzZXJ0KHJlYWRCdWZmZXJQb3NfIDw9IHJlYWRXYW50Xyk7CisKKyAgICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcsIG1vdmUgb250byB0aGUgbmV4dCBzdGF0ZQorICAgICAgaWYgKHJlYWRCdWZmZXJQb3NfID09IHJlYWRXYW50XykgeworICAgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2hlbmV2ZXIgd2UgZ2V0IGRvd24gaGVyZSBpdCBtZWFucyBhIHJlbW90ZSBkaXNjb25uZWN0CisgICAgY2xvc2UoKTsKKworICAgIHJldHVybjsKKworICBjYXNlIFNPQ0tFVF9TRU5EOgorICAgIC8vIFNob3VsZCBuZXZlciBoYXZlIHBvc2l0aW9uIHBhc3Qgc2l6ZQorICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJTaXplXyk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIHRvIHNlbmQsIHRoZW4gbGV0IHVzIG1vdmUgb24KKyAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKKyAgICAgIEdsb2JhbE91dHB1dCgiV0FSTklORzogU2VuZCBzdGF0ZSB3aXRoIG5vIGRhdGEgdG8gc2VuZCIpOworICAgICAgdHJhbnNpdGlvbigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBsZWZ0ID0gd3JpdGVCdWZmZXJTaXplXyAtIHdyaXRlQnVmZmVyUG9zXzsKKyAgICAgIHNlbnQgPSB0U29ja2V0Xy0+d3JpdGVfcGFydGlhbCh3cml0ZUJ1ZmZlcl8gKyB3cml0ZUJ1ZmZlclBvc18sIGxlZnQpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyAiLCB0ZS53aGF0KCkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cml0ZUJ1ZmZlclBvc18gKz0gc2VudDsKKworICAgIC8vIERpZCB3ZSBvdmVyZG8gaXQ/CisgICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKKworICAgIC8vIFdlIGFyZSBkb25lIQorICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgeworICAgICAgdHJhbnNpdGlvbigpOworICAgIH0KKworICAgIHJldHVybjsKKworICBkZWZhdWx0OgorICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgU29ja2V0IFN0YXRlICVkIiwgc29ja2V0U3RhdGVfKTsKKyAgICBhc3NlcnQoMCk7CisgIH0KK30KKworYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmdldEhlYWRlclRyYW5zcG9ydCgpIHsKKyAgLy8gQ3VycmVudGx5IGlmIHRoZXJlIGlzIG5vIG91dHB1dCBwcm90b2NvbCBmYWN0b3J5LAorICAvLyB3ZSBhc3N1bWUgaGVhZGVyIHRyYW5zcG9ydCAod2l0aG91dCBoYXZpbmcgdG8gY3JlYXRlCisgIC8vIGEgbmV3IHRyYW5zcG9ydCBhbmQgY2hlY2spCisgIHJldHVybiBnZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSA9PSBOVUxMOworfQorCisvKioKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KKyAqIGFub3RoZXIuIFRoaXMgbWVhbnMgdGhhdCBpdCBoYXMgZmluaXNoZWQgd3JpdGluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZAorICogdG8sIG9yIGZpbmlzaGVkIHJlY2VpdmluZyB0aGUgZGF0YSB0aGF0IGl0IG5lZWRlZCB0by4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjp0cmFuc2l0aW9uKCkgeworICAvLyBlbnN1cmUgdGhpcyBjb25uZWN0aW9uIGlzIGFjdGl2ZSByaWdodCBub3cKKyAgYXNzZXJ0KGlvVGhyZWFkXyk7CisgIGFzc2VydChzZXJ2ZXJfKTsKKworICAvLyBTd2l0Y2ggdXBvbiB0aGUgc3RhdGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGluIGFuZCBtb3ZlIHRvIGEgbmV3IHN0YXRlCisgIHN3aXRjaCAoYXBwU3RhdGVfKSB7CisKKyAgY2FzZSBBUFBfUkVBRF9SRVFVRVNUOgorICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcgdGhlIHJlcXVlc3QsIHBhY2thZ2UgdGhlIHJlYWQgYnVmZmVyIGludG8gdHJhbnNwb3J0CisgICAgLy8gYW5kIGdldCBiYWNrIHNvbWUgZGF0YSBmcm9tIHRoZSBkaXNwYXRjaCBmdW5jdGlvbgorICAgIGlmIChzZXJ2ZXJfLT5nZXRIZWFkZXJUcmFuc3BvcnQoKSkgeworICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclBvc18pOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2F2ZWQgcm9vbSBmb3IgdGhlIGZyYW1pbmcgc2l6ZSBpbiBjYXNlIGhlYWRlciB0cmFuc3BvcnQgbmVlZGVkIGl0LAorICAgICAgLy8gYnV0IGp1c3Qgc2tpcCBpdCBmb3IgdGhlIG5vbi1oZWFkZXIgY2FzZQorICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXyArIDQsIHJlYWRCdWZmZXJQb3NfIC0gNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOworCisgICAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KKyAgICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgorICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0V3JpdGVQdHIoNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIH0KKworICAgIHNlcnZlcl8tPmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKworICAgIGlmIChzZXJ2ZXJfLT5pc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkpIHsKKyAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHVwIGEgVGFzayB0byBkbyB0aGlzIHdvcmsgYW5kIHdlIHdpbGwgd2FpdCBvbiBpdAorCisgICAgICAvLyBDcmVhdGUgdGFzayBhbmQgZGlzcGF0Y2ggdG8gdGhlIHRocmVhZCBtYW5hZ2VyCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KAorICAgICAgICAgIG5ldyBUYXNrKHByb2Nlc3Nvcl8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRoaXMpKTsKKyAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBub3cgd2FpdGluZyBvbiB0aGUgdGFzayB0byBmaW5pc2gKKyAgICAgIGFwcFN0YXRlXyA9IEFQUF9XQUlUX1RBU0s7CisKKyAgICAgIC8vIFNldCB0aGlzIGNvbm5lY3Rpb24gaWRsZSBzbyB0aGF0IGxpYmV2ZW50IGRvZXNuJ3QgcHJvY2VzcyBtb3JlCisgICAgICAvLyBkYXRhIG9uIGl0IHdoaWxlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWRtYW5hZ2VyIHRvCisgICAgICAvLyBmaW5pc2ggdGhpcyB0YXNrCisgICAgICBzZXRJZGxlKCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHNlcnZlcl8tPmFkZFRhc2sodGFzayk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24mIGlzZSkgeworICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgorICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgaXNlLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJiB0bykgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIFRpbWVkT3V0RXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHRvLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgZ2V0VFNvY2tldCgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbnZva2UgdGhlIHByb2Nlc3NvcgorICAgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIGNvbm5lY3Rpb25Db250ZXh0Xyk7CisgICAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigKKyAgICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXIgdHJhbnNwb3J0IGVycm9yIGluICIKKyAgICAgICAgICAgICJwcm9jZXNzKCk6ICVzIiwKKyAgICAgICAgICAgIHR0eC53aGF0KCkpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiB4KSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNlcnZlcjo6cHJvY2VzcygpIHVuY2F1Z2h0IGV4Y2VwdGlvbjogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU2VydmVyOjpwcm9jZXNzKCkgdW5rbm93biBleGNlcHRpb24iKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIC8vIGZhbGx0aHJvdWdoCisKKyAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSwgdGhlIGNhbGwgdG8gcHJvY2VzcyBoYXMgd3JpdHRlbiBpbnRvCisgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8KKworICBjYXNlIEFQUF9XQUlUX1RBU0s6CisgICAgLy8gV2UgaGF2ZSBub3cgZmluaXNoZWQgcHJvY2Vzc2luZyBhIHRhc2sgYW5kIHRoZSByZXN1bHQgaGFzIGJlZW4gd3JpdHRlbgorICAgIC8vIGludG8gdGhlIG91dHB1dFRyYW5zcG9ydF8sIHNvIHdlIGdyYWIgaXRzIGNvbnRlbnRzIGFuZCBwbGFjZSB0aGVtIGludG8KKyAgICAvLyB0aGUgd3JpdGVCdWZmZXJfIGZvciBhY3R1YWwgd3JpdGluZyBieSB0aGUgbGliZXZlbnQgdGhyZWFkCisKKyAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgorICAgIG91dHB1dFRyYW5zcG9ydF8tPmdldEJ1ZmZlcigmd3JpdGVCdWZmZXJfLCAmd3JpdGVCdWZmZXJTaXplXyk7CisKKyAgICAvLyBJZiB0aGUgZnVuY3Rpb24gY2FsbCBnZW5lcmF0ZWQgcmV0dXJuIGRhdGEsIHRoZW4gbW92ZSBpbnRvIHRoZSBzZW5kCisgICAgLy8gc3RhdGUgYW5kIGdldCBnb2luZworICAgIC8vIDQgYnl0ZXMgd2VyZSByZXNlcnZlZCBmb3IgZnJhbWUgc2l6ZQorICAgIGlmICh3cml0ZUJ1ZmZlclNpemVfID4gNCkgeworCisgICAgICAvLyBNb3ZlIGludG8gd3JpdGUgc3RhdGUKKyAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfU0VORDsKKworICAgICAgLy8gUHV0IHRoZSBmcmFtZSBzaXplIGludG8gdGhlIHdyaXRlIGJ1ZmZlcgorICAgICAgaW50MzJfdCBmcmFtZVNpemUgPSAoaW50MzJfdClodG9ubCh3cml0ZUJ1ZmZlclNpemVfIC0gNCk7CisgICAgICBtZW1jcHkod3JpdGVCdWZmZXJfLCAmZnJhbWVTaXplLCA0KTsKKworICAgICAgLy8gU29ja2V0IGludG8gd3JpdGUgbW9kZQorICAgICAgYXBwU3RhdGVfID0gQVBQX1NFTkRfUkVTVUxUOworICAgICAgc2V0V3JpdGUoKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJlcXVlc3Qgd2FzIG9uZXdheSBhbmQgd2Ugc2hvdWxkIGZhbGwgdGhyb3VnaAorICAgIC8vIHJpZ2h0IGJhY2sgaW50byB0aGUgcmVhZCBmcmFtZSBoZWFkZXIgc3RhdGUKKyAgICBnb3RvIExBQkVMX0FQUF9JTklUOworCisgIGNhc2UgQVBQX1NFTkRfUkVTVUxUOgorICAgIC8vIGl0J3Mgbm93IHNhZmUgdG8gcGVyZm9ybSBidWZmZXIgc2l6ZSBob3VzZWtlZXBpbmcuCisgICAgaWYgKHdyaXRlQnVmZmVyU2l6ZV8gPiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXykgeworICAgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSB3cml0ZUJ1ZmZlclNpemVfOworICAgIH0KKyAgICBpZiAoc2VydmVyXy0+Z2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgPiAwCisgICAgICAgICYmICsrY2FsbHNGb3JSZXNpemVfID49IHNlcnZlcl8tPmdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpKSB7CisgICAgICBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzZXJ2ZXJfLT5nZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfLT5nZXRJZGxlV3JpdGVCdWZmZXJMaW1pdCgpKTsKKyAgICAgIGNhbGxzRm9yUmVzaXplXyA9IDA7CisgICAgfQorICAgIC8vIGZhbGx0aHJvdWdoCisKKyAgLy8gTi5CLjogV2UgYWxzbyBpbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlIGludG8gdGhlIElOSVQgc3RhdGUhCisKKyAgTEFCRUxfQVBQX0lOSVQ6CisgIGNhc2UgQVBQX0lOSVQ6CisKKyAgICAvLyBDbGVhciB3cml0ZSBidWZmZXIgdmFyaWFibGVzCisgICAgd3JpdGVCdWZmZXJfID0gTlVMTDsKKyAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOworICAgIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOworCisgICAgLy8gSW50byByZWFkNCBzdGF0ZSB3ZSBnbworICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWX0ZSQU1JTkc7CisgICAgYXBwU3RhdGVfID0gQVBQX1JFQURfRlJBTUVfU0laRTsKKworICAgIHJlYWRCdWZmZXJQb3NfID0gMDsKKworICAgIC8vIFJlZ2lzdGVyIHJlYWQgZXZlbnQKKyAgICBzZXRSZWFkKCk7CisKKyAgICByZXR1cm47CisKKyAgY2FzZSBBUFBfUkVBRF9GUkFNRV9TSVpFOgorICAgIHJlYWRXYW50XyArPSA0OworCisgICAgLy8gV2UganVzdCByZWFkIHRoZSByZXF1ZXN0IGxlbmd0aAorICAgIC8vIERvdWJsZSB0aGUgYnVmZmVyIHNpemUgdW50aWwgaXQgaXMgYmlnIGVub3VnaAorICAgIGlmIChyZWFkV2FudF8gPiByZWFkQnVmZmVyU2l6ZV8pIHsKKyAgICAgIGlmIChyZWFkQnVmZmVyU2l6ZV8gPT0gMCkgeworICAgICAgICByZWFkQnVmZmVyU2l6ZV8gPSAxOworICAgICAgfQorICAgICAgdWludDMyX3QgbmV3U2l6ZSA9IHJlYWRCdWZmZXJTaXplXzsKKyAgICAgIHdoaWxlIChyZWFkV2FudF8gPiBuZXdTaXplKSB7CisgICAgICAgIG5ld1NpemUgKj0gMjsKKyAgICAgIH0KKworICAgICAgdWludDhfdCogbmV3QnVmZmVyID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyZWFkQnVmZmVyXywgbmV3U2l6ZSk7CisgICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gbm90aGluZyBlbHNlIHRvIGJlIGRvbmUuLi4KKyAgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICAgIH0KKyAgICAgIHJlYWRCdWZmZXJfID0gbmV3QnVmZmVyOworICAgICAgcmVhZEJ1ZmZlclNpemVfID0gbmV3U2l6ZTsKKyAgICB9CisKKyAgICByZWFkQnVmZmVyUG9zXyA9IDQ7CisgICAgKigodWludDMyX3QqKXJlYWRCdWZmZXJfKSA9IGh0b25sKHJlYWRXYW50XyAtIDQpOworCisgICAgLy8gTW92ZSBpbnRvIHJlYWQgcmVxdWVzdCBzdGF0ZQorICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWOworICAgIGFwcFN0YXRlXyA9IEFQUF9SRUFEX1JFUVVFU1Q7CisKKyAgICByZXR1cm47CisKKyAgY2FzZSBBUFBfQ0xPU0VfQ09OTkVDVElPTjoKKyAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgY2xvc2UoKTsKKyAgICByZXR1cm47CisKKyAgZGVmYXVsdDoKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIFN0YXRlICVkIiwgYXBwU3RhdGVfKTsKKyAgICBhc3NlcnQoMCk7CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpzZXRGbGFncyhzaG9ydCBldmVudEZsYWdzKSB7CisgIC8vIENhdGNoIHRoZSBkbyBub3RoaW5nIGNhc2UKKyAgaWYgKGV2ZW50RmxhZ3NfID09IGV2ZW50RmxhZ3MpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBEZWxldGUgYSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50CisgIGlmIChldmVudEZsYWdzXyAmJiBldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKSBldmVudF9kZWwiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVXBkYXRlIGluIG1lbW9yeSBzdHJ1Y3R1cmUKKyAgZXZlbnRGbGFnc18gPSBldmVudEZsYWdzOworCisgIC8vIERvIG5vdCBjYWxsIGV2ZW50X3NldCBpZiB0aGVyZSBhcmUgbm8gZmxhZ3MKKyAgaWYgKCFldmVudEZsYWdzXykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qCisgICAqIGV2ZW50X3NldDoKKyAgICoKKyAgICogUHJlcGFyZXMgdGhlIGV2ZW50IHN0cnVjdHVyZSAmZXZlbnQgdG8gYmUgdXNlZCBpbiBmdXR1cmUgY2FsbHMgdG8KKyAgICogZXZlbnRfYWRkKCkgYW5kIGV2ZW50X2RlbCgpLiAgVGhlIGV2ZW50IHdpbGwgYmUgcHJlcGFyZWQgdG8gY2FsbCB0aGUKKyAgICogZXZlbnRIYW5kbGVyIHVzaW5nIHRoZSAnc29jaycgZmlsZSBkZXNjcmlwdG9yIHRvIG1vbml0b3IgZXZlbnRzLgorICAgKgorICAgKiBUaGUgZXZlbnRzIGNhbiBiZSBlaXRoZXIgRVZfUkVBRCwgRVZfV1JJVEUsIG9yIGJvdGgsIGluZGljYXRpbmcKKyAgICogdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gcmVhZCBvciB3cml0ZSBmcm9tIHRoZSBmaWxlIHJlc3BlY3RpdmVseSB3aXRob3V0CisgICAqIGJsb2NraW5nLgorICAgKgorICAgKiBUaGUgZXZlbnRIYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHRyaWdnZXJlZAorICAgKiB0aGUgZXZlbnQgYW5kIHRoZSB0eXBlIG9mIGV2ZW50IHdoaWNoIHdpbGwgYmUgb25lIG9mOiBFVl9USU1FT1VULAorICAgKiBFVl9TSUdOQUwsIEVWX1JFQUQsIEVWX1dSSVRFLgorICAgKgorICAgKiBUaGUgYWRkaXRpb25hbCBmbGFnIEVWX1BFUlNJU1QgbWFrZXMgYW4gZXZlbnRfYWRkKCkgcGVyc2lzdGVudCB1bnRpbAorICAgKiBldmVudF9kZWwoKSBoYXMgYmVlbiBjYWxsZWQuCisgICAqCisgICAqIE9uY2UgaW5pdGlhbGl6ZWQsIHRoZSAmZXZlbnQgc3RydWN0IGNhbiBiZSB1c2VkIHJlcGVhdGVkbHkgd2l0aAorICAgKiBldmVudF9hZGQoKSBhbmQgZXZlbnRfZGVsKCkgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVpbml0aWFsaXplZCB1bmxlc3MKKyAgICogdGhlIGV2ZW50SGFuZGxlciBhbmQvb3IgdGhlIGFyZ3VtZW50IHRvIGl0IGFyZSB0byBiZSBjaGFuZ2VkLiAgSG93ZXZlciwKKyAgICogd2hlbiBhbiBldiBzdHJ1Y3R1cmUgaGFzIGJlZW4gYWRkZWQgdG8gbGliZXZlbnQgdXNpbmcgZXZlbnRfYWRkKCkgdGhlCisgICAqIHN0cnVjdHVyZSBtdXN0IHBlcnNpc3QgdW50aWwgdGhlIGV2ZW50IG9jY3VycyAoYXNzdW1pbmcgRVZfUEVSU0lTVAorICAgKiBpcyBub3Qgc2V0KSBvciBpcyByZW1vdmVkIHVzaW5nIGV2ZW50X2RlbCgpLiAgWW91IG1heSBub3QgcmV1c2UgdGhlIHNhbWUKKyAgICogZXYgc3RydWN0dXJlIGZvciBtdWx0aXBsZSBtb25pdG9yZWQgZGVzY3JpcHRvcnM7IGVhY2ggZGVzY3JpcHRvciBuZWVkcworICAgKiBpdHMgb3duIGV2LgorICAgKi8KKyAgZXZlbnRfc2V0KCZldmVudF8sIHRTb2NrZXRfLT5nZXRTb2NrZXRGRCgpLCBldmVudEZsYWdzXywgVENvbm5lY3Rpb246OmV2ZW50SGFuZGxlciwgdGhpcyk7CisgIGV2ZW50X2Jhc2Vfc2V0KGlvVGhyZWFkXy0+Z2V0RXZlbnRCYXNlKCksICZldmVudF8pOworCisgIC8vIEFkZCB0aGUgZXZlbnQKKyAgaWYgKGV2ZW50X2FkZCgmZXZlbnRfLCAwKSA9PSAtMSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpOiBjb3VsZCBub3QgZXZlbnRfYWRkIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICB9Cit9CisKKy8qKgorICogQ2xvc2VzIGEgY29ubmVjdGlvbgorICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmNsb3NlKCkgeworICBzZXRJZGxlKCk7CisKKyAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKKyAgICBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgIH0KKyAgaW9UaHJlYWRfID0gTlVMTDsKKworICAvLyBDbG9zZSB0aGUgc29ja2V0CisgIHRTb2NrZXRfLT5jbG9zZSgpOworCisgIC8vIGNsb3NlIGFueSBmYWN0b3J5IHByb2R1Y2VkIHRyYW5zcG9ydHMKKyAgZmFjdG9yeUlucHV0VHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8tPmNsb3NlKCk7CisKKyAgLy8gcmVsZWFzZSBwcm9jZXNzb3IgYW5kIGhhbmRsZXIKKyAgcHJvY2Vzc29yXy5yZXNldCgpOworCisgIC8vIEdpdmUgdGhpcyBvYmplY3QgYmFjayB0byB0aGUgc2VydmVyIHRoYXQgb3ducyBpdAorICBzZXJ2ZXJfLT5yZXR1cm5Db25uZWN0aW9uKHRoaXMpOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCByZWFkTGltaXQsIHNpemVfdCB3cml0ZUxpbWl0KSB7CisgIGlmIChyZWFkTGltaXQgPiAwICYmIHJlYWRCdWZmZXJTaXplXyA+IHJlYWRMaW1pdCkgeworICAgIGZyZWUocmVhZEJ1ZmZlcl8pOworICAgIHJlYWRCdWZmZXJfID0gTlVMTDsKKyAgICByZWFkQnVmZmVyU2l6ZV8gPSAwOworICB9CisKKyAgaWYgKHdyaXRlTGltaXQgPiAwICYmIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID4gd3JpdGVMaW1pdCkgeworICAgIC8vIGp1c3Qgc3RhcnQgb3ZlcgorICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpKTsKKyAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CisgIH0KK30KKworVE5vbmJsb2NraW5nU2VydmVyOjp+VE5vbmJsb2NraW5nU2VydmVyKCkgeworICAvLyBDbG9zZSBhbnkgYWN0aXZlIGNvbm5lY3Rpb25zIChtb3ZlcyB0aGVtIHRvIHRoZSBpZGxlIGNvbm5lY3Rpb24gc3RhY2spCisgIHdoaWxlIChhY3RpdmVDb25uZWN0aW9uc18uc2l6ZSgpKSB7CisgICAgYWN0aXZlQ29ubmVjdGlvbnNfLmZyb250KCktPmNsb3NlKCk7CisgIH0KKyAgLy8gQ2xlYW4gdXAgdW51c2VkIFRDb25uZWN0aW9uIG9iamVjdHMgaW4gY29ubmVjdGlvblN0YWNrXworICB3aGlsZSAoIWNvbm5lY3Rpb25TdGFja18uZW1wdHkoKSkgeworICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0YWNrXy50b3AoKTsKKyAgICBjb25uZWN0aW9uU3RhY2tfLnBvcCgpOworICAgIGRlbGV0ZSBjb25uZWN0aW9uOworICB9CisgIC8vIFRoZSBUTm9uYmxvY2tpbmdJT1RocmVhZCBvYmplY3RzIGhhdmUgc2hhcmVkX3B0cnMgdG8gdGhlIFRocmVhZAorICAvLyBvYmplY3RzIGFuZCB0aGUgVGhyZWFkIG9iamVjdHMgaGF2ZSBzaGFyZWRfcHRycyB0byB0aGUgVE5vbmJsb2NraW5nSU9UaHJlYWQKKyAgLy8gb2JqZWN0cyAoYXMgcnVubmFibGUpIHNvIHRoZXNlIG9iamVjdHMgd2lsbCBuZXZlciBkZWFsbG9jYXRlIHdpdGhvdXQgaGVscC4KKyAgd2hpbGUgKCFpb1RocmVhZHNfLmVtcHR5KCkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IGlvdCA9IGlvVGhyZWFkc18uYmFjaygpOworICAgIGlvVGhyZWFkc18ucG9wX2JhY2soKTsKKyAgICBpb3QtPnNldFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPigpKTsKKyAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBlaXRoZXIgYnkgcmV1c2luZyBhbiBvYmplY3Qgb2ZmIHRoZSBzdGFjayBvcgorICogYnkgYWxsb2NhdGluZyBhIG5ldyBvbmUgZW50aXJlbHkKKyAqLworVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKKyAgLy8gQ2hlY2sgdGhlIHN0YWNrCisgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisKKyAgLy8gcGljayBhbiBJTyB0aHJlYWQgdG8gaGFuZGxlIHRoaXMgY29ubmVjdGlvbiAtLSBjdXJyZW50bHkgcm91bmQgcm9iaW4KKyAgYXNzZXJ0KG5leHRJT1RocmVhZF8gPCBpb1RocmVhZHNfLnNpemUoKSk7CisgIGludCBzZWxlY3RlZFRocmVhZElkeCA9IG5leHRJT1RocmVhZF87CisgIG5leHRJT1RocmVhZF8gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKG5leHRJT1RocmVhZF8gKyAxKSAlIGlvVGhyZWFkc18uc2l6ZSgpKTsKKworICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQgPSBpb1RocmVhZHNfW3NlbGVjdGVkVGhyZWFkSWR4XS5nZXQoKTsKKworICAvLyBDaGVjayB0aGUgY29ubmVjdGlvbiBzdGFjayB0byBzZWUgaWYgd2UgY2FuIHJlLXVzZQorICBUQ29ubmVjdGlvbiogcmVzdWx0ID0gTlVMTDsKKyAgaWYgKGNvbm5lY3Rpb25TdGFja18uZW1wdHkoKSkgeworICAgIHJlc3VsdCA9IG5ldyBUQ29ubmVjdGlvbihzb2NrZXQsIGlvVGhyZWFkKTsKKyAgICArK251bVRDb25uZWN0aW9uc187CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gY29ubmVjdGlvblN0YWNrXy50b3AoKTsKKyAgICBjb25uZWN0aW9uU3RhY2tfLnBvcCgpOworICAgIHJlc3VsdC0+c2V0U29ja2V0KHNvY2tldCk7CisgICAgcmVzdWx0LT5pbml0KGlvVGhyZWFkKTsKKyAgfQorICBhY3RpdmVDb25uZWN0aW9uc18ucHVzaF9iYWNrKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gdGhlIHN0YWNrCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSB7CisgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisKKyAgYWN0aXZlQ29ubmVjdGlvbnNfLmVyYXNlKHN0ZDo6cmVtb3ZlKGFjdGl2ZUNvbm5lY3Rpb25zXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnNfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCkpOworCisgIGlmIChjb25uZWN0aW9uU3RhY2tMaW1pdF8gJiYgKGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpID49IGNvbm5lY3Rpb25TdGFja0xpbWl0XykpIHsKKyAgICBkZWxldGUgY29ubmVjdGlvbjsKKyAgICAtLW51bVRDb25uZWN0aW9uc187CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbi0+Y2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoaWRsZVJlYWRCdWZmZXJMaW1pdF8sIGlkbGVXcml0ZUJ1ZmZlckxpbWl0Xyk7CisgICAgY29ubmVjdGlvblN0YWNrXy5wdXNoKGNvbm5lY3Rpb24pOworICB9Cit9CisKKy8qKgorICogU2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZyBjbGllbnQKKyAqIGNvbm5lY3Rpb25zIG9uIGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cyB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpoYW5kbGVFdmVudChUSFJJRlRfU09DS0VUIGZkLCBzaG9ydCB3aGljaCkgeworICAodm9pZCl3aGljaDsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgbGliZXZlbnQgZGlkbid0IG1lc3MgdXAgdGhlIHNvY2tldCBoYW5kbGVzCisgIGFzc2VydChmZCA9PSBzZXJ2ZXJTb2NrZXRfKTsKKworICAvLyBHb2luZyB0byBhY2NlcHQgYSBuZXcgY2xpZW50IHNvY2tldAorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50U29ja2V0OworCisgIGNsaWVudFNvY2tldCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOworICBpZiAoY2xpZW50U29ja2V0KSB7CisgICAgLy8gSWYgd2UncmUgb3ZlcmxvYWRlZCwgdGFrZSBhY3Rpb24gaGVyZQorICAgIGlmIChvdmVybG9hZEFjdGlvbl8gIT0gVF9PVkVSTE9BRF9OT19BQ1RJT04gJiYgc2VydmVyT3ZlcmxvYWRlZCgpKSB7CisgICAgICBHdWFyZCBnKGNvbm5NdXRleF8pOworICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKKyAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8rKzsKKyAgICAgIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQpIHsKKyAgICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKG92ZXJsb2FkQWN0aW9uXyA9PSBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUpIHsKKyAgICAgICAgaWYgKCFkcmFpblBlbmRpbmdUYXNrKCkpIHsKKyAgICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gZGlzY2FyZCwgc28gd2UgZHJvcCBjb25uZWN0aW9uIGluc3RlYWQuCisgICAgICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBUQ29ubmVjdGlvbiBmb3IgdGhpcyBjbGllbnQgc29ja2V0LgorICAgIFRDb25uZWN0aW9uKiBjbGllbnRDb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihjbGllbnRTb2NrZXQpOworCisgICAgLy8gRmFpbCBmYXN0IGlmIHdlIGNvdWxkIG5vdCBjcmVhdGUgYSBUQ29ubmVjdGlvbiBvYmplY3QKKyAgICBpZiAoY2xpZW50Q29ubmVjdGlvbiA9PSBOVUxMKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IGZhaWxlZCBUQ29ubmVjdGlvbiBmYWN0b3J5Iik7CisgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFaXRoZXIgbm90aWZ5IHRoZSBpb1RocmVhZCB0aGF0IGlzIGFzc2lnbmVkIHRoaXMgY29ubmVjdGlvbiB0bworICAgICAqIHN0YXJ0IHByb2Nlc3NpbmcsIG9yIGlmIGl0IGlzIHVzLCB3ZSdsbCBqdXN0IGFzayB0aGlzCisgICAgICogY29ubmVjdGlvbiB0byBkbyBpdHMgaW5pdGlhbCBzdGF0ZSBjaGFuZ2UgaGVyZS4KKyAgICAgKgorICAgICAqIChXZSBuZWVkIHRvIGF2b2lkIHdyaXRpbmcgdG8gb3VyIG93biBub3RpZmljYXRpb24gcGlwZSwgdG8KKyAgICAgKiBhdm9pZCBwb3NzaWJsZSBkZWFkbG9ja3MgaWYgdGhlIHBpcGUgaXMgZnVsbC4pCisgICAgICoKKyAgICAgKiBUaGUgSU8gdGhyZWFkICMwIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGhhbmRsZXMgdGhlc2UgbGlzdGVuCisgICAgICogZXZlbnRzLCBzbyB1bmxlc3MgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhyZWFkICMwCisgICAgICogd2Uga25vdyBpdCdzIG5vdCBvbiBvdXIgdGhyZWFkLgorICAgICAqLworICAgIGlmIChjbGllbnRDb25uZWN0aW9uLT5nZXRJT1RocmVhZE51bWJlcigpID09IDApIHsKKyAgICAgIGNsaWVudENvbm5lY3Rpb24tPnRyYW5zaXRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFjbGllbnRDb25uZWN0aW9uLT5ub3RpZnlJT1RocmVhZCgpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIltFUlJPUl0gbm90aWZ5SU9UaHJlYWQgZmFpbGVkIG9uIGZyZXNoIGNvbm5lY3Rpb24sIGNsb3NpbmciLCBlcnJubyk7CisgICAgICAgIGNsaWVudENvbm5lY3Rpb24tPmNsb3NlKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHNvY2tldCB0byBsaXN0ZW4gb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBsb2NhbCBwb3J0LgorICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKSB7CisgIHNlcnZlclRyYW5zcG9ydF8tPmxpc3RlbigpOworICBzZXJ2ZXJTb2NrZXRfID0gc2VydmVyVHJhbnNwb3J0Xy0+Z2V0U29ja2V0RkQoKTsKK30KKworCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgeworICB0aHJlYWRNYW5hZ2VyXyA9IHRocmVhZE1hbmFnZXI7CisgIGlmICh0aHJlYWRNYW5hZ2VyKSB7CisgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soCisgICAgICAgIHN0ZDo6YmluZCgmVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gZmFsc2U7CisgIH0KK30KKworYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlck92ZXJsb2FkZWQoKSB7CisgIHNpemVfdCBhY3RpdmVDb25uZWN0aW9ucyA9IG51bVRDb25uZWN0aW9uc18gLSBjb25uZWN0aW9uU3RhY2tfLnNpemUoKTsKKyAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gbWF4QWN0aXZlUHJvY2Vzc29yc18gfHwgYWN0aXZlQ29ubmVjdGlvbnMgPiBtYXhDb25uZWN0aW9uc18pIHsKKyAgICBpZiAoIW92ZXJsb2FkZWRfKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGNvbmRpdGlvbiBiZWd1bi4iKTsKKyAgICAgIG92ZXJsb2FkZWRfID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG92ZXJsb2FkZWRfICYmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA8PSBvdmVybG9hZEh5c3RlcmVzaXNfICogbWF4QWN0aXZlUHJvY2Vzc29yc18pCisgICAgICAgICYmIChhY3RpdmVDb25uZWN0aW9ucyA8PSBvdmVybG9hZEh5c3RlcmVzaXNfICogbWF4Q29ubmVjdGlvbnNfKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigKKyAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOiBvdmVybG9hZCBlbmRlZDsgIgorICAgICAgICAgICIldSBkcm9wcGVkICglbGx1IHRvdGFsKSIsCisgICAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8sCisgICAgICAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyk7CisgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CisgICAgICBvdmVybG9hZGVkXyA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiBvdmVybG9hZGVkXzsKK30KKworYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmRyYWluUGVuZGluZ1Rhc2soKSB7CisgIGlmICh0aHJlYWRNYW5hZ2VyXykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IHRocmVhZE1hbmFnZXJfLT5yZW1vdmVOZXh0UGVuZGluZygpOworICAgIGlmICh0YXNrKSB7CisgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IHN0YXRpY19jYXN0PFRDb25uZWN0aW9uOjpUYXNrKj4odGFzay5nZXQoKSktPmdldFRDb25uZWN0aW9uKCk7CisgICAgICBhc3NlcnQoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLT5nZXRTZXJ2ZXIoKSAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOworICAgICAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IHN0YXRpY19jYXN0PFRDb25uZWN0aW9uOjpUYXNrKj4odGFzay5nZXQoKSktPmdldFRDb25uZWN0aW9uKCk7CisgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7CisgIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnN0b3AoKSB7CisgIC8vIEJyZWFrcyB0aGUgZXZlbnQgbG9vcCBpbiBhbGwgdGhyZWFkcyBzbyB0aGF0IHRoZXkgZW5kIEFTQVAuCisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpb1RocmVhZHNfLnNpemUoKTsgKytpKSB7CisgICAgaW9UaHJlYWRzX1tpXS0+c3RvcCgpOworICB9Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZWdpc3RlckV2ZW50cyhldmVudF9iYXNlKiB1c2VyX2V2ZW50X2Jhc2UpIHsKKyAgdXNlckV2ZW50QmFzZV8gPSB1c2VyX2V2ZW50X2Jhc2U7CisKKyAgLy8gaW5pdCBsaXN0ZW4gc29ja2V0CisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKKyAgICBjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpOworCisgIC8vIHNldCB1cCB0aGUgSU8gdGhyZWFkcworICBhc3NlcnQoaW9UaHJlYWRzXy5lbXB0eSgpKTsKKyAgaWYgKCFudW1JT1RocmVhZHNfKSB7CisgICAgbnVtSU9UaHJlYWRzXyA9IERFRkFVTFRfSU9fVEhSRUFEUzsKKyAgfQorICAvLyBVc2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgZG9lc24ndCB3b3JrcyBmb3IgbXVsdGktdGhyZWFkZWQgc2VydmVycworICBhc3NlcnQobnVtSU9UaHJlYWRzXyA9PSAxIHx8ICF1c2VyRXZlbnRCYXNlXyk7CisKKyAgZm9yICh1aW50MzJfdCBpZCA9IDA7IGlkIDwgbnVtSU9UaHJlYWRzXzsgKytpZCkgeworICAgIC8vIHRoZSBmaXJzdCBJTyB0aHJlYWQgYWxzbyBkb2VzIHRoZSBsaXN0ZW5pbmcgb24gc2VydmVyIHNvY2tldAorICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuRmQgPSAoaWQgPT0gMCA/IHNlcnZlclNvY2tldF8gOiBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpOworCisgICAgc2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gdGhyZWFkKAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nSU9UaHJlYWQodGhpcywgaWQsIGxpc3RlbkZkLCB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHNfKSk7CisgICAgaW9UaHJlYWRzXy5wdXNoX2JhY2sodGhyZWFkKTsKKyAgfQorCisgIC8vIE5vdGlmeSBoYW5kbGVyIG9mIHRoZSBwcmVTZXJ2ZSBldmVudAorICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7CisgIH0KKworICAvLyBTdGFydCBhbGwgb2Ygb3VyIGhlbHBlciBJTyB0aHJlYWRzLiBOb3RlIHRoYXQgdGhlIHRocmVhZHMgcnVuIGZvcmV2ZXIsCisgIC8vIG9ubHkgdGVybWluYXRpbmcgaWYgc3RvcCgpIGlzIGNhbGxlZC4KKyAgYXNzZXJ0KGlvVGhyZWFkc18uc2l6ZSgpID09IG51bUlPVGhyZWFkc18pOworICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPiAwKTsKKworICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IFNlcnZpbmcgd2l0aCAlZCBpbyB0aHJlYWRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgaW9UaHJlYWRzXy5zaXplKCkpOworCisgIC8vIExhdW5jaCBhbGwgdGhlIHNlY29uZGFyeSBJTyB0aHJlYWRzIGluIHNlcGFyYXRlIHRocmVhZHMKKyAgaWYgKGlvVGhyZWFkc18uc2l6ZSgpID4gMSkgeworICAgIGlvVGhyZWFkRmFjdG9yeV8ucmVzZXQobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgIC8vIHNjaGVkdWxlcgorICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwgLy8gcHJpb3JpdHkKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrIHNpemUgKE1CKQorI2VuZGlmCisgICAgICAgIGZhbHNlIC8vIGRldGFjaGVkCisgICAgICAgICkpOworCisgICAgYXNzZXJ0KGlvVGhyZWFkRmFjdG9yeV8uZ2V0KCkpOworCisgICAgLy8gaW50ZW50aW9uYWxseSBzdGFydGluZyBhdCB0aHJlYWQgMSwgbm90IDAKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgaW9UaHJlYWRzXy5zaXplKCk7ICsraSkgeworICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IGlvVGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChpb1RocmVhZHNfW2ldKTsKKyAgICAgIGlvVGhyZWFkc19baV0tPnNldFRocmVhZCh0aHJlYWQpOworICAgICAgdGhyZWFkLT5zdGFydCgpOworICAgIH0KKyAgfQorCisgIC8vIFJlZ2lzdGVyIHRoZSBldmVudHMgZm9yIHRoZSBwcmltYXJ5IChsaXN0ZW5lcikgSU8gdGhyZWFkCisgIGlvVGhyZWFkc19bMF0tPnJlZ2lzdGVyRXZlbnRzKCk7Cit9CisKKy8qKgorICogTWFpbiB3b3JraG9yc2UgZnVuY3Rpb24sIHN0YXJ0cyB1cCB0aGUgc2VydmVyIGxpc3RlbmluZyBvbiBhIHBvcnQgYW5kCisgKiBsb29wcyBvdmVyIHRoZSBsaWJldmVudCBoYW5kbGVyLgorICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSB7CisKKyAgaWYgKGlvVGhyZWFkc18uZW1wdHkoKSkKKyAgICByZWdpc3RlckV2ZW50cyhOVUxMKTsKKworICAvLyBSdW4gdGhlIHByaW1hcnkgKGxpc3RlbmVyKSBJTyB0aHJlYWQgbG9vcCBpbiBvdXIgbWFpbiB0aHJlYWQ7IHRoaXMgd2lsbAorICAvLyBvbmx5IHJldHVybiB3aGVuIHRoZSBzZXJ2ZXIgaXMgc2h1dHRpbmcgZG93bi4KKyAgaW9UaHJlYWRzX1swXS0+cnVuKCk7CisKKyAgLy8gRW5zdXJlIGFsbCB0aHJlYWRzIGFyZSBmaW5pc2hlZCBiZWZvcmUgZXhpdGluZyBzZXJ2ZSgpCisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpb1RocmVhZHNfLnNpemUoKTsgKytpKSB7CisgICAgaW9UaHJlYWRzX1tpXS0+am9pbigpOworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogam9pbiBkb25lIGZvciBJTyB0aHJlYWQgIyVkIiwgaSk7CisgIH0KK30KKworVE5vbmJsb2NraW5nSU9UaHJlYWQ6OlROb25ibG9ja2luZ0lPVGhyZWFkKFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5Tb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIaWdoUHJpb3JpdHkpCisgIDogc2VydmVyXyhzZXJ2ZXIpLAorICAgIG51bWJlcl8obnVtYmVyKSwKKyAgICBsaXN0ZW5Tb2NrZXRfKGxpc3RlblNvY2tldCksCisgICAgdXNlSGlnaFByaW9yaXR5Xyh1c2VIaWdoUHJpb3JpdHkpLAorICAgIGV2ZW50QmFzZV8oTlVMTCksCisgICAgb3duRXZlbnRCYXNlXyhmYWxzZSkgeworICBub3RpZmljYXRpb25QaXBlRkRzX1swXSA9IC0xOworICBub3RpZmljYXRpb25QaXBlRkRzX1sxXSA9IC0xOworfQorCitUTm9uYmxvY2tpbmdJT1RocmVhZDo6flROb25ibG9ja2luZ0lPVGhyZWFkKCkgeworICAvLyBtYWtlIHN1cmUgb3VyIGFzc29jaWF0ZWQgdGhyZWFkIGlzIGZ1bGx5IGZpbmlzaGVkCisgIGpvaW4oKTsKKworICBpZiAoZXZlbnRCYXNlXyAmJiBvd25FdmVudEJhc2VfKSB7CisgICAgZXZlbnRfYmFzZV9mcmVlKGV2ZW50QmFzZV8pOworICAgIG93bkV2ZW50QmFzZV8gPSBmYWxzZTsKKyAgfQorCisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGlmICgwICE9IDo6VEhSSUZUX0NMT1NFU09DS0VUKGxpc3RlblNvY2tldF8pKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBsaXN0ZW5Tb2NrZXRfIGNsb3NlKCk6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICB9CisgICAgbGlzdGVuU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgaWYgKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldID49IDApIHsKKyAgICAgIGlmICgwICE9IDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBub3RpZmljYXRpb25QaXBlIGNsb3NlKCk6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgICAgfQorICAgICAgbm90aWZpY2F0aW9uUGlwZUZEc19baV0gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSB7CisgIGlmIChldnV0aWxfc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIG5vdGlmaWNhdGlvblBpcGVGRHNfKSA9PSAtMSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSAiLCBFVlVUSUxfU09DS0VUX0VSUk9SKCkpOworICAgIHRocm93IFRFeGNlcHRpb24oImNhbid0IGNyZWF0ZSBub3RpZmljYXRpb24gcGlwZSIpOworICB9CisgIGlmIChldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pIDwgMAorICAgICAgfHwgZXZ1dGlsX21ha2Vfc29ja2V0X25vbmJsb2NraW5nKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKSA8IDApIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1swXSk7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pOworICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIFRIUklGVF9PX05PTkJMT0NLIik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA8IDB4MDIwMDAwMDAKKyAgICBpbnQgZmxhZ3M7CisgICAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9HRVRGRCwgMCkpIDwgMAorICAgICAgICB8fCBUSFJJRlRfRkNOVEwobm90aWZpY2F0aW9uUGlwZUZEc19baV0sIEZfU0VURkQsIGZsYWdzIHwgRkRfQ0xPRVhFQykgPCAwKSB7CisjZWxzZQorICAgIGlmIChldnV0aWxfbWFrZV9zb2NrZXRfY2xvc2VvbmV4ZWMobm90aWZpY2F0aW9uUGlwZUZEc19baV0pIDwgMCkgeworI2VuZGlmCisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1swXSk7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSAiCisgICAgICAgICAgIkZEX0NMT0VYRUMiKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZWdpc3RlciB0aGUgY29yZSBsaWJldmVudCBldmVudHMgb250byB0aGUgcHJvcGVyIGJhc2UuCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnJlZ2lzdGVyRXZlbnRzKCkgeworICB0aHJlYWRJZF8gPSBUaHJlYWQ6OmdldF9jdXJyZW50KCk7CisKKyAgYXNzZXJ0KGV2ZW50QmFzZV8gPT0gMCk7CisgIGV2ZW50QmFzZV8gPSBnZXRTZXJ2ZXIoKS0+Z2V0VXNlckV2ZW50QmFzZSgpOworICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKSB7CisgICAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgICAgb3duRXZlbnRCYXNlXyA9IHRydWU7CisgIH0KKworICAvLyBQcmludCBzb21lIGxpYmV2ZW50IHN0YXRzCisgIGlmIChudW1iZXJfID09IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IHVzaW5nIGxpYmV2ZW50ICVzIG1ldGhvZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9nZXRfdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGV2ZW50QmFzZV8pKTsKKyAgfQorCisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2ZXIgZXZlbnQKKyAgICBldmVudF9zZXQoJnNlcnZlckV2ZW50XywKKyAgICAgICAgICAgICAgbGlzdGVuU29ja2V0XywKKyAgICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QsCisgICAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkOjpsaXN0ZW5IYW5kbGVyLAorICAgICAgICAgICAgICBzZXJ2ZXJfKTsKKyAgICBldmVudF9iYXNlX3NldChldmVudEJhc2VfLCAmc2VydmVyRXZlbnRfKTsKKworICAgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKKyAgICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZzZXJ2ZXJFdmVudF8sIDApKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6ICIKKyAgICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHNlcnZlciBsaXN0ZW4gZXZlbnQiKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyB0aHJlYWQgIyVkIHJlZ2lzdGVyZWQgZm9yIGxpc3Rlbi4iLCBudW1iZXJfKTsKKyAgfQorCisgIGNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKTsKKworICAvLyBDcmVhdGUgYW4gZXZlbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHRhc2sgZmluaXNoZXMKKyAgZXZlbnRfc2V0KCZub3RpZmljYXRpb25FdmVudF8sCisgICAgICAgICAgICBnZXROb3RpZmljYXRpb25SZWN2RkQoKSwKKyAgICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNULAorICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Om5vdGlmeUhhbmRsZXIsCisgICAgICAgICAgICB0aGlzKTsKKworICAvLyBBdHRhY2ggdG8gdGhlIGJhc2UKKyAgZXZlbnRfYmFzZV9zZXQoZXZlbnRCYXNlXywgJm5vdGlmaWNhdGlvbkV2ZW50Xyk7CisKKyAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgorICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZub3RpZmljYXRpb25FdmVudF8sIDApKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgorICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHRhc2stZG9uZSBub3RpZmljYXRpb24gZXZlbnQiKTsKKyAgfQorICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIHRocmVhZCAjJWQgcmVnaXN0ZXJlZCBmb3Igbm90aWZ5LiIsIG51bWJlcl8pOworfQorCitib29sIFROb25ibG9ja2luZ0lPVGhyZWFkOjpub3RpZnkoVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogY29ubikgeworICBUSFJJRlRfU09DS0VUIGZkID0gZ2V0Tm90aWZpY2F0aW9uU2VuZEZEKCk7CisgIGlmIChmZCA8IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbnQgcmV0ID0gLTE7CisgIGxvbmcga1NpemUgPSBzaXplb2YoY29ubik7CisgIGNvbnN0IGNoYXIgKiBwb3MgPSAoY29uc3QgY2hhciAqKWNvbnN0X2Nhc3Rfc29ja29wdCgmY29ubik7CisKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTF9IKSB8fCBkZWZpbmVkKEhBVkVfU1lTX1BPTExfSCkKKyAgc3RydWN0IHBvbGxmZCBwZmQgPSB7ZmQsIFBPTExPVVQsIDB9OworCisgIHdoaWxlIChrU2l6ZSA+IDApIHsKKyAgICBwZmQucmV2ZW50cyA9IDA7CisgICAgcmV0ID0gcG9sbCgmcGZkLCAxLCAtMSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMSFVQIHx8IHBmZC5yZXZlbnRzICYgUE9MTEVSUikgeworICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExPVVQpIHsKKyAgICAgIHJldCA9IHNlbmQoZmQsIHBvcywga1NpemUsIDApOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGtTaXplIC09IHJldDsKKyAgICAgIHBvcyArPSByZXQ7CisgICAgfQorICB9CisjZWxzZQorICBmZF9zZXQgd2ZkcywgZWZkczsKKworICB3aGlsZSAoa1NpemUgPiAwKSB7CisgICAgRkRfWkVSTygmd2Zkcyk7CisgICAgRkRfWkVSTygmZWZkcyk7CisgICAgRkRfU0VUKGZkLCAmd2Zkcyk7CisgICAgRkRfU0VUKGZkLCAmZWZkcyk7CisgICAgcmV0ID0gc2VsZWN0KHN0YXRpY19jYXN0PGludD4oZmQgKyAxKSwgTlVMTCwgJndmZHMsICZlZmRzLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChGRF9JU1NFVChmZCwgJmVmZHMpKSB7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKGZkLCAmd2ZkcykpIHsKKyAgICAgIHJldCA9IHNlbmQoZmQsIHBvcywga1NpemUsIDApOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGtTaXplIC09IHJldDsKKyAgICAgIHBvcyArPSByZXQ7CisgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogc3RhdGljICovCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpub3RpZnlIYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQqIHYpIHsKKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkID0gKFROb25ibG9ja2luZ0lPVGhyZWFkKil2OworICBhc3NlcnQoaW9UaHJlYWQpOworICAodm9pZCl3aGljaDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSAwOworICAgIGNvbnN0IGludCBrU2l6ZSA9IHNpemVvZihjb25uZWN0aW9uKTsKKyAgICBsb25nIG5CeXRlcyA9IHJlY3YoZmQsIGNhc3Rfc29ja29wdCgmY29ubmVjdGlvbiksIGtTaXplLCAwKTsKKyAgICBpZiAobkJ5dGVzID09IGtTaXplKSB7CisgICAgICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNvbW1hbmQgdG8gc3RvcCBvdXIgdGhyZWFkLCBleGl0IHRoZSBoYW5kbGVyIQorICAgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOworICAgIH0gZWxzZSBpZiAobkJ5dGVzID4gMCkgeworICAgICAgLy8gdGhyb3cgYXdheSB0aGVzZSBieXRlcyBhbmQgaG9wZSB0aGF0IG5leHQgdGltZSB3ZSBnZXQgYSBzb2xpZCByZWFkCisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJub3RpZnlIYW5kbGVyOiBCYWQgcmVhZCBvZiAlZCBieXRlcywgd2FudGVkICVkIiwgbkJ5dGVzLCBrU2l6ZSk7CisgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKHRydWUpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobkJ5dGVzID09IDApIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IE5vdGlmeSBzb2NrZXQgY2xvc2VkISIpOworICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcChmYWxzZSk7CisgICAgICAvLyBleGl0IHRoZSBsb29wCisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeyAvLyBuQnl0ZXMgPCAwCisgICAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VXT1VMREJMT0NLCisgICAgICAgICAgJiYgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VBR0FJTikgeworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmc6IG5vdGlmeUhhbmRsZXIgcmVhZCgpIGZhaWxlZDogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvLyBleGl0IHRoZSBsb29wCisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6YnJlYWtMb29wKGJvb2wgZXJyb3IpIHsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGV4aXRpbmcgd2l0aCBlcnJvci4iLCBudW1iZXJfKTsKKyAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHNvbWV0aGluZyBiZXR0ZXIgdG8gZG8gaGVyZSwgYnV0IGZvciBub3cga2lsbCB0aGUKKyAgICAvLyB3aG9sZSBwcm9jZXNzLgorICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogYWJvcnRpbmcgcHJvY2Vzcy4iKTsKKyAgICA6OmFib3J0KCk7CisgIH0KKworICAvLyBJZiB3ZSdyZSBydW5uaW5nIGluIHRoZSBzYW1lIHRocmVhZCwgd2UgY2FuJ3QgdXNlIHRoZSBub3RpZnkoMCkKKyAgLy8gbWVjaGFuaXNtIHRvIHN0b3AgdGhlIHRocmVhZCwgYnV0IGhhcHBpbHkgaWYgd2UncmUgcnVubmluZyBpbiB0aGUKKyAgLy8gc2FtZSB0aHJlYWQsIHRoaXMgbWVhbnMgdGhlIHRocmVhZCBjYW4ndCBiZSBibG9ja2luZyBpbiB0aGUgZXZlbnQKKyAgLy8gbG9vcCBlaXRoZXIuCisgIGlmICghVGhyZWFkOjppc19jdXJyZW50KHRocmVhZElkXykpIHsKKyAgICBub3RpZnkoTlVMTCk7CisgIH0gZWxzZSB7CisgICAgLy8gY2F1c2UgdGhlIGxvb3AgdG8gc3RvcCBBU0FQIC0gZXZlbiBpZiBpdCBoYXMgdGhpbmdzIHRvIGRvIGluIGl0CisgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6c2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eShib29sIHZhbHVlKSB7CisjaWZkZWYgSEFWRV9TQ0hFRF9ICisgIC8vIFN0YXJ0IG91dCB3aXRoIGEgc3RhbmRhcmQsIGxvdy1wcmlvcml0eSBzZXR1cCBmb3IgdGhlIHNjaGVkIHBhcmFtcy4KKyAgc3RydWN0IHNjaGVkX3BhcmFtIHNwOworICBiemVybygodm9pZCopJnNwLCBzaXplb2Yoc3ApKTsKKyAgaW50IHBvbGljeSA9IFNDSEVEX09USEVSOworCisgIC8vIElmIGRlc2lyZWQsIHNldCB1cCBoaWdoLXByaW9yaXR5IHNjaGVkIHBhcmFtcyBzdHJ1Y3R1cmUuCisgIGlmICh2YWx1ZSkgeworICAgIC8vIEZJRk8gc2NoZWR1bGVyLCByYW5rZWQgYWJvdmUgZGVmYXVsdCBTQ0hFRF9PVEhFUiBxdWV1ZQorICAgIHBvbGljeSA9IFNDSEVEX0ZJRk87CisgICAgLy8gVGhlIHByaW9yaXR5IG9ubHkgY29tcGFyZXMgdXMgdG8gb3RoZXIgU0NIRURfRklGTyB0aHJlYWRzLCBzbyB3ZQorICAgIC8vIGp1c3QgcGljayBhIHJhbmRvbSBwcmlvcml0eSBoYWxmd2F5IGJldHdlZW4gbWluICYgbWF4LgorICAgIGNvbnN0IGludCBwcmlvcml0eSA9IChzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHBvbGljeSkgKyBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHBvbGljeSkpIC8gMjsKKworICAgIHNwLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisgIH0KKworICAvLyBBY3R1YWxseSBzZXQgdGhlIHNjaGVkIHBhcmFtcyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICBpZiAoMCA9PSBwdGhyZWFkX3NldHNjaGVkcGFyYW0ocHRocmVhZF9zZWxmKCksIHBvbGljeSwgJnNwKSkgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gVGhyZWFkICMlZCB1c2luZyBoaWdoLXByaW9yaXR5IHNjaGVkdWxlciEiLCBudW1iZXJfKTsKKyAgfSBlbHNlIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmc6IHB0aHJlYWRfc2V0c2NoZWRwYXJhbSgpOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgIH0KKyNlbHNlCisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUodmFsdWUpOworI2VuZGlmCit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnJ1bigpIHsKKyAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkgeworICAgIHJlZ2lzdGVyRXZlbnRzKCk7CisgIH0KKyAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKKyAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KHRydWUpOworICB9CisKKyAgaWYgKGV2ZW50QmFzZV8gIT0gTlVMTCkKKyAgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBlbnRlcmluZyBsb29wLi4uIiwgbnVtYmVyXyk7CisgICAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgbmV2ZXIgcmV0dXJucywgaW52b2tlcyBjYWxscyB0byBldmVudEhhbmRsZXIKKyAgICBldmVudF9iYXNlX2xvb3AoZXZlbnRCYXNlXywgMCk7CisKKyAgICBpZiAodXNlSGlnaFByaW9yaXR5XykgeworICAgICAgc2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eShmYWxzZSk7CisgICAgfQorCisgICAgLy8gY2xlYW5zIHVwIG91ciByZWdpc3RlcmVkIGV2ZW50cworICAgIGNsZWFudXBFdmVudHMoKTsKKyAgfQorCisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBydW4oKSBkb25lISIsIG51bWJlcl8pOworfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpjbGVhbnVwRXZlbnRzKCkgeworICAvLyBzdG9wIHRoZSBsaXN0ZW4gc29ja2V0LCBpZiBhbnkKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaWYgKGV2ZW50X2RlbCgmc2VydmVyRXZlbnRfKSA9PSAtMSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnN0b3AoKSBldmVudF9kZWw6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICB9CisgIH0KKworICBldmVudF9kZWwoJm5vdGlmaWNhdGlvbkV2ZW50Xyk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnN0b3AoKSB7CisgIC8vIFRoaXMgc2hvdWxkIGNhdXNlIHRoZSB0aHJlYWQgdG8gZmFsbCBvdXQgb2YgaXRzIGV2ZW50IGxvb3AgQVNBUC4KKyAgYnJlYWtMb29wKGZhbHNlKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6am9pbigpIHsKKyAgLy8gSWYgdGhpcyB3YXMgYSB0aHJlYWQgY3JlYXRlZCBieSBhIGZhY3RvcnkgKG5vdCB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkCisgIC8vIHNlcnZlKCkpLCB3ZSBqb2luKCkgaXQgdG8gbWFrZSBzdXJlIHdlIHNodXQgZG93biBmdWxseS4KKyAgaWYgKHRocmVhZF8pIHsKKyAgICB0cnkgeworICAgICAgLy8gTm90ZSB0aGF0IGl0IGlzIHNhZmUgdG8gYm90aCBqb2luKCkgb3Vyc2VsdmVzIHR3aWNlLCBhcyB3ZWxsIGFzIGpvaW4KKyAgICAgIC8vIHRoZSBjdXJyZW50IHRocmVhZCBhcyB0aGUgcHRocmVhZCBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIGRlYWRsb2NrLgorICAgICAgdGhyZWFkXy0+am9pbigpOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgLy8gc3dhbGxvdyBldmVyeXRoaW5nCisgICAgfQorICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWMyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCkBAIC0wLDAgKzEsODYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXZlbnQuaD4KKyNpbmNsdWRlIDxldmVudDIvZXZlbnRfY29tcGF0Lmg+CisjaW5jbHVkZSA8ZXZlbnQyL2V2ZW50X3N0cnVjdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOworCisjaWZkZWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NQUpPUiAoTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj4gMjQpCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgKChMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+PiAxNikgJiAweEZGKQorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX1JFTCAoKExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4+IDgpICYgMHhGRikKKyNlbHNlCisvLyBhc3N1bWUgbGF0ZXN0IHZlcnNpb24gMSBzZXJpZXMKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NQUpPUiAxCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgMTQKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9SRUwgMTMKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChMSUJFVkVOVF9WRVJTSU9OX01BSk9SIDw8IDI0KSB8IChMSUJFVkVOVF9WRVJTSU9OX01JTk9SIDw8IDE2KSB8IChMSUJFVkVOVF9WRVJTSU9OX1JFTCA8PCA4KSkKKyNlbmRpZgorCisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPCAweDAyMDAwMDAwCit0eXBlZGVmIFRIUklGVF9TT0NLRVQgZXZ1dGlsX3NvY2tldF90OworI2VuZGlmCisKKyNpZm5kZWYgU09DS09QVF9DQVNUX1QKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBjb25zdCBTT0NLT1BUX0NBU1RfVCogY29uc3RfY2FzdF9zb2Nrb3B0KGNvbnN0IFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgU09DS09QVF9DQVNUX1QqIGNhc3Rfc29ja29wdChUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKKy8qKgorICogVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBzZXJ2ZXIgaW4gQysrIGZvciBoaWdoIHBlcmZvcm1hbmNlIHRoYXQKKyAqIG9wZXJhdGVzIGEgc2V0IG9mIElPIHRocmVhZHMgKGJ5IGRlZmF1bHQgb25seSBvbmUpLiBJdCBhc3N1bWVzIHRoYXQKKyAqIGFsbCBpbmNvbWluZyByZXF1ZXN0cyBhcmUgZnJhbWVkIHdpdGggYSA0IGJ5dGUgbGVuZ3RoIGluZGljYXRvciBhbmQKKyAqIHdyaXRlcyBvdXQgcmVzcG9uc2VzIHVzaW5nIHRoZSBzYW1lIGZyYW1pbmcuCisgKi8KKworLy8vIE92ZXJsb2FkIGNvbmRpdGlvbiBhY3Rpb25zLgorZW51bSBUT3ZlcmxvYWRBY3Rpb24geworICBUX09WRVJMT0FEX05PX0FDVElPTiwgICAgICAgLy8vPCBEb24ndCBoYW5kbGUgb3ZlcmxvYWQgKi8KKyAgVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQsIC8vLzwgRHJvcCBuZXcgY29ubmVjdGlvbnMgaW1tZWRpYXRlbHkgKi8KKyAgVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFIC8vLzwgRHJvcCBzb21lIHRhc2tzIGZyb20gaGVhZCBvZiB0YXNrIHF1ZXVlICovCit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdJT1RocmVhZDsKKworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgeworcHJpdmF0ZToKKyAgY2xhc3MgVENvbm5lY3Rpb247CisKKyAgZnJpZW5kIGNsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkOworCitwcml2YXRlOgorICAvLy8gTGlzdGVuIGJhY2tsb2cKKyAgc3RhdGljIGNvbnN0IGludCBMSVNURU5fQkFDS0xPRyA9IDEwMjQ7CisKKyAgLy8vIERlZmF1bHQgbGltaXQgb24gc2l6ZSBvZiBpZGxlIGNvbm5lY3Rpb24gcG9vbAorICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTk5FQ1RJT05fU1RBQ0tfTElNSVQgPSAxMDI0OworCisgIC8vLyBEZWZhdWx0IGxpbWl0IG9uIGZyYW1lIHNpemUKKyAgc3RhdGljIGNvbnN0IGludCBNQVhfRlJBTUVfU0laRSA9IDI1NiAqIDEwMjQgKiAxMDI0OworCisgIC8vLyBEZWZhdWx0IGxpbWl0IG9uIHRvdGFsIG51bWJlciBvZiBjb25uZWN0ZWQgc29ja2V0cworICBzdGF0aWMgY29uc3QgaW50IE1BWF9DT05ORUNUSU9OUyA9IElOVF9NQVg7CisKKyAgLy8vIERlZmF1bHQgbGltaXQgb24gY29ubmVjdGlvbnMgaW4gaGFuZGxlci90YXNrIHByb2Nlc3NpbmcKKyAgc3RhdGljIGNvbnN0IGludCBNQVhfQUNUSVZFX1BST0NFU1NPUlMgPSBJTlRfTUFYOworCisgIC8vLyBEZWZhdWx0IHNpemUgb2Ygd3JpdGUgYnVmZmVyCisgIHN0YXRpYyBjb25zdCBpbnQgV1JJVEVfQlVGRkVSX0RFRkFVTFRfU0laRSA9IDEwMjQ7CisKKyAgLy8vIE1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBjb25uZWN0aW9uICgwID0gdW5saW1pdGVkKQorICBzdGF0aWMgY29uc3QgaW50IElETEVfUkVBRF9CVUZGRVJfTElNSVQgPSAxMDI0OworCisgIC8vLyBNYXhpbXVtIHNpemUgb2Ygd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIGNvbm5lY3Rpb24gKDAgPSB1bmxpbWl0ZWQpCisgIHN0YXRpYyBjb25zdCBpbnQgSURMRV9XUklURV9CVUZGRVJfTElNSVQgPSAxMDI0OworCisgIC8vLyAjIG9mIGNhbGxzIGJlZm9yZSByZXNpemluZyBvdmVyc2l6ZWQgYnVmZmVycyAoMCA9IGNoZWNrIG9ubHkgb24gY2xvc2UpCisgIHN0YXRpYyBjb25zdCBpbnQgUkVTSVpFX0JVRkZFUl9FVkVSWV9OID0gNTEyOworCisgIC8vLyAjIG9mIElPIHRocmVhZHMgdG8gdXNlIGJ5IGRlZmF1bHQKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0lPX1RIUkVBRFMgPSAxOworCisgIC8vLyAjIG9mIElPIHRocmVhZHMgdGhpcyBzZXJ2ZXIgd2lsbCB1c2UKKyAgc2l6ZV90IG51bUlPVGhyZWFkc187CisKKyAgLy8vIFdoZXRoZXIgdG8gc2V0IGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSBmb3IgSU8gdGhyZWFkcworICBib29sIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc187CisKKyAgLy8vIFNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKKworICAvLy8gVGhlIG9wdGlvbmFsIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSAoZm9yIHNpbmdsZS10aHJlYWQgc2VydmVycykKKyAgZXZlbnRfYmFzZSogdXNlckV2ZW50QmFzZV87CisKKyAgLy8vIEZvciBwcm9jZXNzaW5nIHZpYSB0aHJlYWQgcG9vbCwgbWF5IGJlIE5VTEwKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOworCisgIC8vLyBJcyB0aHJlYWQgcG9vbCBwcm9jZXNzaW5nPworICBib29sIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKKworICAvLyBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgSU8gdGhyZWFkcworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiBpb1RocmVhZEZhY3RvcnlfOworCisgIC8vIFZlY3RvciBvZiBJT1RocmVhZCBvYmplY3RzIHRoYXQgd2lsbCBoYW5kbGUgb3VyIElPCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gPiBpb1RocmVhZHNfOworCisgIC8vIEluZGV4IG9mIG5leHQgSU8gVGhyZWFkIHRvIGJlIHVzZWQgKGZvciByb3VuZC1yb2JpbikKKyAgdWludDMyX3QgbmV4dElPVGhyZWFkXzsKKworICAvLyBTeW5jaHJvbml6ZXMgYWNjZXNzIHRvIGNvbm5lY3Rpb24gc3RhY2sgYW5kIHNpbWlsYXIgZGF0YQorICBNdXRleCBjb25uTXV0ZXhfOworCisgIC8vLyBOdW1iZXIgb2YgVENvbm5lY3Rpb24gb2JqZWN0IHdlJ3ZlIGNyZWF0ZWQKKyAgc2l6ZV90IG51bVRDb25uZWN0aW9uc187CisKKyAgLy8vIE51bWJlciBvZiBDb25uZWN0aW9ucyBwcm9jZXNzaW5nIG9yIHdhaXRpbmcgdG8gcHJvY2VzcworICBzaXplX3QgbnVtQWN0aXZlUHJvY2Vzc29yc187CisKKyAgLy8vIExpbWl0IGZvciBob3cgbWFueSBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGNhY2hlCisgIHNpemVfdCBjb25uZWN0aW9uU3RhY2tMaW1pdF87CisKKyAgLy8vIExpbWl0IGZvciBudW1iZXIgb2YgY29ubmVjdGlvbnMgcHJvY2Vzc2luZyBvciB3YWl0aW5nIHRvIHByb2Nlc3MKKyAgc2l6ZV90IG1heEFjdGl2ZVByb2Nlc3NvcnNfOworCisgIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbnMKKyAgc2l6ZV90IG1heENvbm5lY3Rpb25zXzsKKworICAvLy8gTGltaXQgZm9yIGZyYW1lIHNpemUKKyAgc2l6ZV90IG1heEZyYW1lU2l6ZV87CisKKyAgLy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBhbiB1bnBlcmZvcm1lZCB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgorICBpbnQ2NF90IHRhc2tFeHBpcmVUaW1lXzsKKworICAvKioKKyAgICogSHlzdGVyZXNpcyBmb3Igb3ZlcmxvYWQgc3RhdGUuICBUaGlzIGlzIHRoZSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmxvYWQKKyAgICogdmFsdWUgdGhhdCBuZWVkcyB0byBiZSByZWFjaGVkIGJlZm9yZSB0aGUgb3ZlcmxvYWQgc3RhdGUgaXMgY2xlYXJlZDsKKyAgICogbXVzdCBiZSA8PSAxLjAuCisgICAqLworICBkb3VibGUgb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKKworICAvLy8gQWN0aW9uIHRvIHRha2Ugd2hlbiB3ZSdyZSBvdmVybG9hZGVkLgorICBUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb25fOworCisgIC8qKgorICAgKiBUaGUgd3JpdGUgYnVmZmVyIGlzIGluaXRpYWxpemVkIChhbmQgd2hlbiBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gaXMgY2hlY2tlZAorICAgKiBhbmQgZm91bmQgdG8gYmUgZXhjZWVkZWQsIHJlaW5pdGlhbGl6ZWQpIHRvIHRoaXMgc2l6ZS4KKyAgICovCisgIHNpemVfdCB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXzsKKworICAvKioKKyAgICogTWF4IHJlYWQgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgVENvbm5lY3Rpb24uICBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKKyAgICogVENvbm5lY3Rpb24gaW50byBjb25uZWN0aW9uU3RhY2tfIG9yIG9uIGV2ZXJ5IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gY2FsbHMsCisgICAqIHdlIHdpbGwgZnJlZSB0aGUgYnVmZmVyIChzdWNoIHRoYXQgaXQgd2lsbCBiZSByZWluaXRpYWxpemVkIGJ5IHRoZSBuZXh0CisgICAqIHJlY2VpdmVkIGZyYW1lKSBpZiBpdCBoYXMgZXhjZWVkZWQgdGhpcyBsaW1pdC4gIDAgZGlzYWJsZXMgdGhpcyBjaGVjay4KKyAgICovCisgIHNpemVfdCBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKKworICAvKioKKyAgICogTWF4IHdyaXRlIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIGNvbm5lY3Rpb24uICBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKKyAgICogVENvbm5lY3Rpb24gaW50byBjb25uZWN0aW9uU3RhY2tfIG9yIG9uIGV2ZXJ5IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gY2FsbHMsCisgICAqIHdlIGluc3VyZSB0aGF0IGl0cyB3cml0ZSBidWZmZXIgaXMgPD0gdG8gdGhpcyBzaXplOyBvdGhlcndpc2Ugd2UKKyAgICogcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZSBvZiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyBieXRlcyB0byBpbnN1cmUgdGhhdAorICAgKiBpZGxlIGNvbm5lY3Rpb25zIGRvbid0IGhvZyBtZW1vcnkuIDAgZGlzYWJsZXMgdGhpcyBjaGVjay4KKyAgICovCisgIHNpemVfdCBpZGxlV3JpdGVCdWZmZXJMaW1pdF87CisKKyAgLyoqCisgICAqIEV2ZXJ5IE4gY2FsbHMgd2UgY2hlY2sgdGhlIGJ1ZmZlciBzaXplIGxpbWl0cyBvbiBhIGNvbm5lY3RlZCBUQ29ubmVjdGlvbi4KKyAgICogMCBkaXNhYmxlcyAoaS5lLiB0aGUgY2hlY2tzIGFyZSBvbmx5IGRvbmUgd2hlbiBhIGNvbm5lY3Rpb24gY2xvc2VzKS4KKyAgICovCisgIGludDMyX3QgcmVzaXplQnVmZmVyRXZlcnlOXzsKKworICAvLy8gU2V0IGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gYW4gb3ZlcmxvYWRlZCBzdGF0ZS4KKyAgYm9vbCBvdmVybG9hZGVkXzsKKworICAvLy8gQ291bnQgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBzaW5jZSBvdmVybG9hZCBzdGFydGVkCisgIHVpbnQzMl90IG5Db25uZWN0aW9uc0Ryb3BwZWRfOworCisgIC8vLyBDb3VudCBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIG9uIG92ZXJsb2FkIHNpbmNlIHNlcnZlciBzdGFydGVkCisgIHVpbnQ2NF90IG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLyoqCisgICAqIFRoaXMgaXMgYSBzdGFjayBvZiBhbGwgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBidXQgdGhhdAorICAgKiBhcmUgTk9UIGN1cnJlbnRseSBpbiB1c2UuIFdoZW4gd2UgY2xvc2UgYSBjb25uZWN0aW9uLCB3ZSBwbGFjZSBpdCBvbiB0aGlzCisgICAqIHN0YWNrIHNvIHRoYXQgdGhlIG9iamVjdCBjYW4gYmUgcmV1c2VkIGxhdGVyLCByYXRoZXIgdGhhbiBmcmVlaW5nIHRoZQorICAgKiBtZW1vcnkgYW5kIHJlYWxsb2NhdGluZyBhIG5ldyBvYmplY3QgbGF0ZXIuCisgICAqLworICBzdGQ6OnN0YWNrPFRDb25uZWN0aW9uKj4gY29ubmVjdGlvblN0YWNrXzsKKworICAvKioKKyAgICogVGhpcyBjb250YWluZXIgaG9sZHMgcG9pbnRlcnMgdG8gYWxsIGFjdGl2ZSBjb25uZWN0aW9ucy4gVGhpcyBjb250YWluZXIKKyAgICogYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gY2xlYW4gdXAgdW5sY29zZWQgY29ubmVjdGlvbiBvYmplY3RzIGF0IGRlc3RydWN0aW9uLAorICAgKiB3aGljaCBpbiB0dXJuIGFsbG93cyB0aGVpciB0cmFuc3BvcnRzLCBwcm90b2NvbHMsIHByb2Nlc3NvcnMgYW5kIGhhbmRsZXJzCisgICAqIHRvIGRlYWxsb2NhdGUgYW5kIGNsZWFuIHVwIGNvcnJlY3RseS4KKyAgICovCisgIHN0ZDo6dmVjdG9yPFRDb25uZWN0aW9uKj4gYWN0aXZlQ29ubmVjdGlvbnNfOworCisgIC8qCisgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHNlcnZlciBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBXZSBhY2NlcHQgYWxsIHdhaXRpbmcKKyAgICogY2xpZW50IGNvbm5lY3Rpb25zIG9uIGxpc3RlbiBzb2NrZXQgZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzCisgICAqIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KKyAgICoKKyAgICogQHBhcmFtIHdoaWNoIHRoZSBldmVudCBmbGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyLgorICAgKi8KKyAgdm9pZCBoYW5kbGVFdmVudChUSFJJRlRfU09DS0VUIGZkLCBzaG9ydCB3aGljaCk7CisKKyAgdm9pZCBpbml0KCkgeworICAgIHNlcnZlclNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgbnVtSU9UaHJlYWRzXyA9IERFRkFVTFRfSU9fVEhSRUFEUzsKKyAgICBuZXh0SU9UaHJlYWRfID0gMDsKKyAgICB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHNfID0gZmFsc2U7CisgICAgdXNlckV2ZW50QmFzZV8gPSBOVUxMOworICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOworICAgIG51bVRDb25uZWN0aW9uc18gPSAwOworICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfID0gMDsKKyAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBDT05ORUNUSU9OX1NUQUNLX0xJTUlUOworICAgIG1heEFjdGl2ZVByb2Nlc3NvcnNfID0gTUFYX0FDVElWRV9QUk9DRVNTT1JTOworICAgIG1heENvbm5lY3Rpb25zXyA9IE1BWF9DT05ORUNUSU9OUzsKKyAgICBtYXhGcmFtZVNpemVfID0gTUFYX0ZSQU1FX1NJWkU7CisgICAgdGFza0V4cGlyZVRpbWVfID0gMDsKKyAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gMC44OworICAgIG92ZXJsb2FkQWN0aW9uXyA9IFRfT1ZFUkxPQURfTk9fQUNUSU9OOworICAgIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfID0gV1JJVEVfQlVGRkVSX0RFRkFVTFRfU0laRTsKKyAgICBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IElETEVfUkVBRF9CVUZGRVJfTElNSVQ7CisgICAgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gSURMRV9XUklURV9CVUZGRVJfTElNSVQ7CisgICAgcmVzaXplQnVmZmVyRXZlcnlOXyA9IFJFU0laRV9CVUZGRVJfRVZFUllfTjsKKyAgICBvdmVybG9hZGVkXyA9IGZhbHNlOworICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKKyAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKKyAgfQorCitwdWJsaWM6CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworICB9CisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisgIH0KKworCisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOworICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CisgIH0KKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworCisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOworICB9CisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworCisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShpbnB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKKyAgfQorCisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoaW5wdXRQcm90b2NvbEZhY3RvcnkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CisgIH0KKworICB+VE5vbmJsb2NraW5nU2VydmVyKCk7CisKKyAgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKKworICBpbnQgZ2V0TGlzdGVuUG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF8tPmdldExpc3RlblBvcnQoKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgeyByZXR1cm4gdGhyZWFkTWFuYWdlcl87IH0KKworICAvKioKKyAgICogU2V0cyB0aGUgbnVtYmVyIG9mIElPIHRocmVhZHMgdXNlZCBieSB0aGlzIHNlcnZlci4gQ2FuIG9ubHkgYmUgdXNlZCBiZWZvcmUKKyAgICogdGhlIGNhbGwgdG8gc2VydmUoKSBhbmQgaGFzIG5vIGVmZmVjdCBhZnRlcndhcmRzLiAgV2UgYWx3YXlzIHVzZSBhCisgICAqIFBvc2l4VGhyZWFkRmFjdG9yeSBmb3IgdGhlIElPIHdvcmtlciB0aHJlYWRzLCBiZWNhdXNlIHRoZXkgbXVzdCBqb2luYWJsZQorICAgKiBmb3IgY2xlYW4gc2h1dGRvd24uCisgICAqLworICB2b2lkIHNldE51bUlPVGhyZWFkcyhzaXplX3QgbnVtVGhyZWFkcykgeworICAgIG51bUlPVGhyZWFkc18gPSBudW1UaHJlYWRzOworICAgIC8vIFVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSBkb2Vzbid0IHdvcmtzIGZvciBtdWx0aS10aHJlYWRlZCBzZXJ2ZXJzCisgICAgYXNzZXJ0KG51bUlPVGhyZWFkc18gPD0gMSB8fCAhdXNlckV2ZW50QmFzZV8pOworICB9CisKKyAgLyoqIFJldHVybiB3aGV0aGVyIHRoZSBJTyB0aHJlYWRzIHdpbGwgZ2V0IGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSAqLworICBib29sIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc187IH0KKworICAvKiogU2V0IHdoZXRoZXIgdGhlIElPIHRocmVhZHMgd2lsbCBnZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5LiAqLworICB2b2lkIHNldFVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcyhib29sIHZhbCkgeyB1c2VIaWdoUHJpb3JpdHlJT1RocmVhZHNfID0gdmFsOyB9CisKKyAgLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIElPIHRocmVhZHMgdXNlZCBieSB0aGlzIHNlcnZlci4gKi8KKyAgc2l6ZV90IGdldE51bUlPVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIG51bUlPVGhyZWFkc187IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGltaXQgb24gVENvbm5lY3Rpb24gcG9vbCBzaXplLgorICAgKi8KKyAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgeyByZXR1cm4gY29ubmVjdGlvblN0YWNrTGltaXRfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIFRDb25uZWN0aW9uIHdlIHdpbGwgaG9sZCBpbiByZXNlcnZlLgorICAgKgorICAgKiBAcGFyYW0gc3ogdGhlIG5ldyBsaW1pdCBmb3IgVENvbm5lY3Rpb24gcG9vbCBzaXplLgorICAgKi8KKyAgdm9pZCBzZXRDb25uZWN0aW9uU3RhY2tMaW1pdChzaXplX3Qgc3opIHsgY29ubmVjdGlvblN0YWNrTGltaXRfID0gc3o7IH0KKworICBib29sIGlzVGhyZWFkUG9vbFByb2Nlc3NpbmcoKSBjb25zdCB7IHJldHVybiB0aHJlYWRQb29sUHJvY2Vzc2luZ187IH0KKworICB2b2lkIGFkZFRhc2soc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgICAgdGhyZWFkTWFuYWdlcl8tPmFkZCh0YXNrLCAwTEwsIHRhc2tFeHBpcmVUaW1lXyk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBzb2NrZXRzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCisgICAqCisgICAqIEByZXR1cm4gY291bnQgb2YgY29ubmVjdGVkIHNvY2tldHMuCisgICAqLworICBzaXplX3QgZ2V0TnVtQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBudW1UQ29ubmVjdGlvbnNfOyB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgY291bnQgb2Ygc29ja2V0cyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLgorICAgKgorICAgKiBAcmV0dXJuIGNvdW50IG9mIGNvbm5lY3RlZCBzb2NrZXRzLgorICAgKi8KKyAgc2l6ZV90IGdldE51bUFjdGl2ZUNvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtQ29ubmVjdGlvbnMoKSAtIGdldE51bUlkbGVDb25uZWN0aW9ucygpOyB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgY291bnQgb2YgY29ubmVjdGlvbiBvYmplY3RzIGFsbG9jYXRlZCBidXQgbm90IGluIHVzZS4KKyAgICoKKyAgICogQHJldHVybiBjb3VudCBvZiBpZGxlIGNvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICovCisgIHNpemVfdCBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uU3RhY2tfLnNpemUoKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm4gY291bnQgb2YgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgICogVGhpcyBpcyBkZWZpbmVkIGFzIGEgY29ubmVjdGlvbiB3aGVyZSBhbGwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBhbmQKKyAgICogZWl0aGVyIGFzc2lnbmVkIGEgdGFzayAod2hlbiB0aHJlYWRpbmcpIG9yIHBhc3NlZCB0byBhIGhhbmRsZXIgKHdoZW4KKyAgICogbm90IHRocmVhZGluZyksIGFuZCB3aGVyZSB0aGUgaGFuZGxlciBoYXMgbm90IHlldCByZXR1cm5lZC4KKyAgICoKKyAgICogQHJldHVybiAjIG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICAgKi8KKyAgc2l6ZV90IGdldE51bUFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsgfQorCisgIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CisgICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKyAgICArK251bUFjdGl2ZVByb2Nlc3NvcnNfOworICB9CisKKyAgLy8vIERlY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgIHZvaWQgZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKKyAgICBHdWFyZCBnKGNvbm5NdXRleF8pOworICAgIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IDApIHsKKyAgICAgIC0tbnVtQWN0aXZlUHJvY2Vzc29yc187CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYmVmb3JlIG92ZXJsb2FkLgorICAgKgorICAgKiBAcmV0dXJuIGN1cnJlbnQgc2V0dGluZy4KKyAgICovCisgIHNpemVfdCBnZXRNYXhDb25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1heENvbm5lY3Rpb25zXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGJlZm9yZSBvdmVybG9hZC4KKyAgICoKKyAgICogQHBhcmFtIG1heENvbm5lY3Rpb25zIG5ldyBzZXR0aW5nIGZvciBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMuCisgICAqLworICB2b2lkIHNldE1heENvbm5lY3Rpb25zKHNpemVfdCBtYXhDb25uZWN0aW9ucykgeyBtYXhDb25uZWN0aW9uc18gPSBtYXhDb25uZWN0aW9uczsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCisgICAqCisgICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgorICAgKi8KKyAgc2l6ZV90IGdldE1heEFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtYXhBY3RpdmVQcm9jZXNzb3JzXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCisgICAqCisgICAqIEBwYXJhbSBtYXhBY3RpdmVQcm9jZXNzb3JzIG5ldyBzZXR0aW5nIGZvciBtYXhpbXVtICMgb2YgYWN0aXZlIHByb2Nlc3Nlcy4KKyAgICovCisgIHZvaWQgc2V0TWF4QWN0aXZlUHJvY2Vzc29ycyhzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29ycykgeworICAgIG1heEFjdGl2ZVByb2Nlc3NvcnNfID0gbWF4QWN0aXZlUHJvY2Vzc29yczsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gYWxsb3dlZCBmcmFtZSBzaXplLgorICAgKgorICAgKiBJZiBhIGNsaWVudCB0cmllcyB0byBzZW5kIGEgbWVzc2FnZSBsYXJnZXIgdGhhbiB0aGlzIGxpbWl0LAorICAgKiBpdHMgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZC4KKyAgICoKKyAgICogQHJldHVybiBNYXhpdW0gZnJhbWUgc2l6ZSwgaW4gYnl0ZXMuCisgICAqLworICBzaXplX3QgZ2V0TWF4RnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gbWF4RnJhbWVTaXplXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gYWxsb3dlZCBmcmFtZSBzaXplLgorICAgKgorICAgKiBAcGFyYW0gbWF4RnJhbWVTaXplIFRoZSBuZXcgbWF4aW11bSBmcmFtZSBzaXplLgorICAgKi8KKyAgdm9pZCBzZXRNYXhGcmFtZVNpemUoc2l6ZV90IG1heEZyYW1lU2l6ZSkgeyBtYXhGcmFtZVNpemVfID0gbWF4RnJhbWVTaXplOyB9CisKKyAgLyoqCisgICAqIEdldCBmcmFjdGlvbiBvZiBtYXhpbXVtIGxpbWl0cyBiZWZvcmUgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlzIGNsZWFyZWQuCisgICAqCisgICAqIEByZXR1cm4gaHlzdGVyZXNpcyBmcmFjdGlvbgorICAgKi8KKyAgZG91YmxlIGdldE92ZXJsb2FkSHlzdGVyZXNpcygpIGNvbnN0IHsgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187IH0KKworICAvKioKKyAgICogU2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KKyAgICogQSBnb29kIHZhbHVlIHdvdWxkIHByb2JhYmx5IGJlIGJldHdlZW4gMC41IGFuZCAwLjkuCisgICAqCisgICAqIEBwYXJhbSBoeXN0ZXJlc2lzRnJhY3Rpb24gZnJhY3Rpb24gPD0gMS4wLgorICAgKi8KKyAgdm9pZCBzZXRPdmVybG9hZEh5c3RlcmVzaXMoZG91YmxlIGh5c3RlcmVzaXNGcmFjdGlvbikgeworICAgIGlmIChoeXN0ZXJlc2lzRnJhY3Rpb24gPD0gMS4wICYmIGh5c3RlcmVzaXNGcmFjdGlvbiA+IDAuMCkgeworICAgICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXyA9IGh5c3RlcmVzaXNGcmFjdGlvbjsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBhY3Rpb24gdGhlIHNlcnZlciB3aWxsIHRha2Ugb24gb3ZlcmxvYWQuCisgICAqCisgICAqIEByZXR1cm4gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnRseSBzZXQgYWN0aW9uLgorICAgKi8KKyAgVE92ZXJsb2FkQWN0aW9uIGdldE92ZXJsb2FkQWN0aW9uKCkgY29uc3QgeyByZXR1cm4gb3ZlcmxvYWRBY3Rpb25fOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgYWN0aW9uIHRoZSBzZXJ2ZXIgaXMgdG8gdGFrZSBvbiBvdmVybG9hZC4KKyAgICoKKyAgICogQHBhcmFtIG92ZXJsb2FkQWN0aW9uIGEgVE92ZXJsb2FkQWN0aW9uIGVudW0gdmFsdWUgZm9yIHRoZSBhY3Rpb24uCisgICAqLworICB2b2lkIHNldE92ZXJsb2FkQWN0aW9uKFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbikgeyBvdmVybG9hZEFjdGlvbl8gPSBvdmVybG9hZEFjdGlvbjsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KKyAgICoKKyAgICogQHJldHVybiBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KKyAgICovCisgIGludDY0X3QgZ2V0VGFza0V4cGlyZVRpbWUoKSBjb25zdCB7IHJldHVybiB0YXNrRXhwaXJlVGltZV87IH0KKworICAvKioKKyAgICogU2V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCisgICAqCisgICAqIEBwYXJhbSB0YXNrRXhwaXJlVGltZSBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KKyAgICovCisgIHZvaWQgc2V0VGFza0V4cGlyZVRpbWUoaW50NjRfdCB0YXNrRXhwaXJlVGltZSkgeyB0YXNrRXhwaXJlVGltZV8gPSB0YXNrRXhwaXJlVGltZTsgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmUgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KKyAgICogVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIG1heGltdW1zIGZvciBvcGVuIGNvbm5lY3Rpb25zIGFuZCBjb25uZWN0aW9ucworICAgKiBjdXJyZW50bHkgaW4gcHJvY2Vzc2luZywgYW5kIHNldHMgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGlmIHRoZXkgYXJlCisgICAqIGV4Y2VlZGVkLiAgVGhlIG92ZXJsb2FkIHdpbGwgcGVyc2lzdCB1bnRpbCBib3RoIHZhbHVlcyBhcmUgYmVsb3cgdGhlCisgICAqIGN1cnJlbnQgaHlzdGVyZXNpcyBmcmFjdGlvbiBvZiB0aGVpciBtYXhpbXVtcy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBleGlzdHMsIGZhbHNlIGlmIG5vdC4KKyAgICovCisgIGJvb2wgc2VydmVyT3ZlcmxvYWRlZCgpOworCisgIC8qKiBQb3AgYW5kIGRpc2NhcmQgbmV4dCB0YXNrIG9uIHRocmVhZHBvb2wgd2FpdCBxdWV1ZS4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGEgdGFzayB3YXMgZGlzY2FyZGVkLCBmYWxzZSBpZiB0aGUgd2FpdCBxdWV1ZSB3YXMgZW1wdHkuCisgICAqLworICBib29sIGRyYWluUGVuZGluZ1Rhc2soKTsKKworICAvKioKKyAgICogR2V0IHRoZSBzdGFydGluZyBzaXplIG9mIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyLgorICAgKgorICAgKiBAcmV0dXJuICMgYnl0ZXMgd2UgaW5pdGlhbGl6ZSBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlciB0by4KKyAgICovCisgIHNpemVfdCBnZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkgY29uc3QgeyByZXR1cm4gd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBzdGFydGluZyBzaXplIG9mIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyLgorICAgKgorICAgKiBAcGFyYW0gc2l6ZSAjIGJ5dGVzIHdlIGluaXRpYWxpemUgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIgdG8uCisgICAqLworICB2b2lkIHNldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoc2l6ZV90IHNpemUpIHsgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gPSBzaXplOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqCisgICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBkZWFsbG9jIGlkbGUgYnVmZmVyLgorICAgKi8KKyAgc2l6ZV90IGdldElkbGVSZWFkQnVmZmVyTGltaXQoKSBjb25zdCB7IHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsgfQorCisgIC8qKgorICAgKiBbTk9URTogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSBnZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkuXQorICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKgorICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgZGVhbGxvYyBpZGxlIGJ1ZmZlci4KKyAgICovCisgIHNpemVfdCBnZXRJZGxlQnVmZmVyTWVtTGltaXQoKSBjb25zdCB7IHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgorICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5CisgICAqIGFsbG9jYXRlZCB0byBpdHMgcmVhZCBidWZmZXIsIHdlIGZyZWUgaXQgYW5kIGFsbG93IGl0IHRvIGJlIHJlaW5pdGlhbGl6ZWQKKyAgICogb24gdGhlIG5leHQgcmVjZWl2ZWQgZnJhbWUuCisgICAqCisgICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGNoZWNrZWQuCisgICAqLworICB2b2lkIHNldElkbGVSZWFkQnVmZmVyTGltaXQoc2l6ZV90IGxpbWl0KSB7IGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KKworICAvKioKKyAgICogW05PVEU6IFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB1c2Ugc2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpLl0KKyAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICogSWYgYSBUQ29ubmVjdGlvbiBvYmplY3QgaXMgZm91bmQgKGVpdGhlciBvbiBjb25uZWN0aW9uIGNsb3NlIG9yIGJldHdlZW4KKyAgICogY2FsbHMgd2hlbiByZXNpemVCdWZmZXJFdmVyeU5fIGlzIHNldCkgd2l0aCBtb3JlIHRoYW4gdGhpcyBtdWNoIG1lbW9yeQorICAgKiBhbGxvY2F0ZWQgdG8gaXRzIHJlYWQgYnVmZmVyLCB3ZSBmcmVlIGl0IGFuZCBhbGxvdyBpdCB0byBiZSByZWluaXRpYWxpemVkCisgICAqIG9uIHRoZSBuZXh0IHJlY2VpdmVkIGZyYW1lLgorICAgKgorICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgorICAgKi8KKyAgdm9pZCBzZXRJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KSB7IGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqCisgICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCByZWFsbG9jYXRlIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgorICAgKi8KKyAgc2l6ZV90IGdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVdyaXRlQnVmZmVyTGltaXRfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgorICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5CisgICAqIGFsbG9jYXRlZCB0byBpdHMgd3JpdGUgYnVmZmVyLCB3ZSBkZXN0cm95IGFuZCBjb25zdHJ1Y3QgdGhhdCBidWZmZXIgd2l0aAorICAgKiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyBieXRlcy4KKyAgICoKKyAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gaWRsZS4KKyAgICovCisgIHZvaWQgc2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoc2l6ZV90IGxpbWl0KSB7IGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyA9IGxpbWl0OyB9CisKKyAgLyoqCisgICAqIEdldCAjIG9mIGNhbGxzIG1hZGUgYmV0d2VlbiBidWZmZXIgc2l6ZSBjaGVja3MuICAwIG1lYW5zIGRpc2FibGVkLgorICAgKgorICAgKiBAcmV0dXJuICMgb2YgY2FsbHMgYmV0d2VlbiBidWZmZXIgc2l6ZSBjaGVja3MuCisgICAqLworICBpbnQzMl90IGdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpIGNvbnN0IHsgcmV0dXJuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl87IH0KKworICAvKioKKyAgICogQ2hlY2sgYnVmZmVyIHNpemVzIGV2ZXJ5ICJjb3VudCIgY2FsbHMuICBUaGlzIGFsbG93cyBidWZmZXIgbGltaXRzCisgICAqIHRvIGJlIGVuZm9yY2VkIGZvciBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHdpdGggYSBjb250cm9sbGFibGUgZGVncmVlCisgICAqIG9mIG92ZXJoZWFkLiAwIGRpc2FibGVzIGNoZWNrcyBleGNlcHQgYXQgY29ubmVjdGlvbiBjbG9zZS4KKyAgICoKKyAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgY2FsbHMgYmV0d2VlbiBjaGVja3MsIG9yIDAgdG8gZGlzYWJsZQorICAgKi8KKyAgdm9pZCBzZXRSZXNpemVCdWZmZXJFdmVyeU4oaW50MzJfdCBjb3VudCkgeyByZXNpemVCdWZmZXJFdmVyeU5fID0gY291bnQ7IH0KKworICAvKioKKyAgICogTWFpbiB3b3JraG9yc2UgZnVuY3Rpb24sIHN0YXJ0cyB1cCB0aGUgc2VydmVyIGxpc3RlbmluZyBvbiBhIHBvcnQgYW5kCisgICAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCisgICAqLworICB2b2lkIHNlcnZlKCk7CisKKyAgLyoqCisgICAqIENhdXNlcyB0aGUgc2VydmVyIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IChjYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZCkuCisgICAqLworICB2b2lkIHN0b3AoKTsKKworICAvLy8gQ3JlYXRlcyBhIHNvY2tldCB0byBsaXN0ZW4gb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBsb2NhbCBwb3J0LgorICB2b2lkIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7CisKKyAgLyoqCisgICAqIFJlZ2lzdGVyIHRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpCisgICAqCisgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIHNlcnZlciBpcyBydW5uaW5nIGluIGEgc2luZ2xlLXRocmVhZAorICAgKiBtb2RlLCBhbmQgdGhlIGV2ZW50IGJhc2UgaXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKGkuZS4sIHRoZSBjYWxsZXIpLgorICAgKgorICAgKiBAcGFyYW0gdXNlcl9ldmVudF9iYXNlIHRoZSB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UuIFRoZSB1c2VyIGlzCisgICAqIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBldmVudCBiYXNlIG1lbW9yeS4KKyAgICovCisgIHZvaWQgcmVnaXN0ZXJFdmVudHMoZXZlbnRfYmFzZSogdXNlcl9ldmVudF9iYXNlKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKS4KKyAgICovCisgIGV2ZW50X2Jhc2UqIGdldFVzZXJFdmVudEJhc2UoKSBjb25zdCB7IHJldHVybiB1c2VyRXZlbnRCYXNlXzsgfQorCisgIC8qKiBTb21lIHRyYW5zcG9ydHMsIGxpa2UgVEhlYWRlclRyYW5zcG9ydCwgcmVxdWlyZSBwYXNzaW5nIHRocm91Z2gKKyAgICogdGhlIGZyYW1pbmcgc2l6ZSBpbnN0ZWFkIG9mIHN0cmlwcGluZyBpdC4KKyAgICovCisgIGJvb2wgZ2V0SGVhZGVyVHJhbnNwb3J0KCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSB0aHJlYWRtYW5hZ2VyIGNhbGxzIHdoZW4gYSB0YXNrIHJlYWNoZXMKKyAgICogaXRzIGV4cGlyYXRpb24gdGltZS4gIEl0IGlzIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUgZXhwaXJlZCBjb25uZWN0aW9uLgorICAgKgorICAgKiBAcGFyYW0gdGFzayB0aGUgcnVubmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBpcmVkIHRhc2suCisgICAqLworICB2b2lkIGV4cGlyZUNsb3NlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisKKyAgLyoqCisgICAqIFJldHVybiBhbiBpbml0aWFsaXplZCBjb25uZWN0aW9uIG9iamVjdC4gIENyZWF0ZXMgb3IgcmVjb3ZlcnMgZnJvbQorICAgKiBwb29sIGEgVENvbm5lY3Rpb24gYW5kIGluaXRpYWxpemVzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHNvY2tldCBGRAorICAgKiBhbmQgZmxhZ3MuCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXQgRkQgb2Ygc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24uCisgICAqIEBwYXJhbSBhZGRyIHRoZSBzb2NrYWRkciBvZiB0aGUgY2xpZW50CisgICAqIEBwYXJhbSBhZGRyTGVuIHRoZSBsZW5ndGggb2YgYWRkcgorICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgVENvbm5lY3Rpb24gb2JqZWN0LgorICAgKi8KKyAgVENvbm5lY3Rpb24qIGNyZWF0ZUNvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBjb25uZWN0aW9uIHRvIHBvb2wgb3IgZGVsZXRpb24uICBJZiB0aGUgY29ubmVjdGlvbiBwb29sCisgICAqIChhIHN0YWNrKSBpc24ndCBmdWxsLCBwbGFjZSB0aGUgY29ubmVjdGlvbiBvYmplY3Qgb24gaXQsIG90aGVyd2lzZQorICAgKiBqdXN0IGRlbGV0ZSBpdC4KKyAgICoKKyAgICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIFRDb25lY3Rpb24gYmVpbmcgcmV0dXJuZWQuCisgICAqLworICB2b2lkIHJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pOworfTsKKworY2xhc3MgVE5vbmJsb2NraW5nSU9UaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgeworcHVibGljOgorICAvLyBDcmVhdGVzIGFuIElPIHRocmVhZCBhbmQgc2V0cyB1cCB0aGUgZXZlbnQgYmFzZS4gIFRoZSBsaXN0ZW5Tb2NrZXQgc2hvdWxkCisgIC8vIGJlIGEgdmFsaWQgRkQgb24gd2hpY2ggbGlzdGVuKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuICBJZiB0aGUKKyAgLy8gbGlzdGVuU29ja2V0IGlzIDwgMCwgYWNjZXB0aW5nIHdpbGwgbm90IGJlIGRvbmUuCisgIFROb25ibG9ja2luZ0lPVGhyZWFkKFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU09DS0VUIGxpc3RlblNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIaWdoUHJpb3JpdHkpOworCisgIH5UTm9uYmxvY2tpbmdJT1RocmVhZCgpOworCisgIC8vIFJldHVybnMgdGhlIGV2ZW50LWJhc2UgZm9yIHRoaXMgdGhyZWFkLgorICBldmVudF9iYXNlKiBnZXRFdmVudEJhc2UoKSBjb25zdCB7IHJldHVybiBldmVudEJhc2VfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgc2VydmVyIGZvciB0aGlzIHRocmVhZC4KKyAgVE5vbmJsb2NraW5nU2VydmVyKiBnZXRTZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBzZXJ2ZXJfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoaXMgSU8gdGhyZWFkLgorICBpbnQgZ2V0VGhyZWFkTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbnVtYmVyXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHRocmVhZCBpZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuICBUaGlzIHNob3VsZAorICAvLyBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUgdGhyZWFkIGhhcyBiZWVuIHN0YXJ0ZWQuCisgIFRocmVhZDo6aWRfdCBnZXRUaHJlYWRJZCgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZElkXzsgfQorCisgIC8vIFJldHVybnMgdGhlIHNlbmQtZmQgZm9yIHRhc2sgY29tcGxldGUgbm90aWZpY2F0aW9ucy4KKyAgZXZ1dGlsX3NvY2tldF90IGdldE5vdGlmaWNhdGlvblNlbmRGRCgpIGNvbnN0IHsgcmV0dXJuIG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgcmVhZC1mZCBmb3IgdGFzayBjb21wbGV0ZSBub3RpZmljYXRpb25zLgorICBldnV0aWxfc29ja2V0X3QgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCkgY29uc3QgeyByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMF07IH0KKworICAvLyBSZXR1cm5zIHRoZSBhY3R1YWwgdGhyZWFkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTyB0aHJlYWQuCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGdldFRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF87IH0KKworICAvLyBTZXRzIHRoZSBhY3R1YWwgdGhyZWFkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTyB0aHJlYWQuCisgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+JiB0KSB7IHRocmVhZF8gPSB0OyB9CisKKyAgLy8gVXNlZCBieSBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGluZGljYXRlIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLgorICBib29sIG5vdGlmeShUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uKTsKKworICAvLyBFbnRlcnMgdGhlIGV2ZW50IGxvb3AgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhIGNhbGwgdG8gc3RvcCgpLgorICB2aXJ0dWFsIHZvaWQgcnVuKCk7CisKKyAgLy8gRXhpdHMgdGhlIGV2ZW50IGxvb3AgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgdm9pZCBzdG9wKCk7CisKKyAgLy8gRW5zdXJlcyB0aGF0IHRoZSBldmVudC1sb29wIHRocmVhZCBpcyBmdWxseSBmaW5pc2hlZCBhbmQgc2h1dCBkb3duLgorICB2b2lkIGpvaW4oKTsKKworICAvLy8gUmVnaXN0ZXJzIHRoZSBldmVudHMgZm9yIHRoZSBub3RpZmljYXRpb24gJiBsaXN0ZW4gc29ja2V0cworICB2b2lkIHJlZ2lzdGVyRXZlbnRzKCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIHNpZ25hbGluZyB0YXNrIGNvbXBsZXRpb24uICBQcm92aWRlcyBhCisgICAqIGNhbGxiYWNrIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgdGhhdCB3aWxsIHJlYWQgYSBjb25uZWN0aW9uCisgICAqIG9iamVjdCdzIGFkZHJlc3MgZnJvbSBhIHBpcGUgYW5kIGNhbGwgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpIGZvcgorICAgKiB0aGF0IG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cnJlZCBvbi4KKyAgICovCisgIHN0YXRpYyB2b2lkIG5vdGlmeUhhbmRsZXIoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCB3aGljaCwgdm9pZCogdik7CisKKyAgLyoqCisgICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3IgbGlzdGVuZXIgZXZlbnRzLiAgUHJvdmlkZXMgYSBjYWxsYmFjaworICAgKiB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHdoaWNoIGludm9rZXMgc2VydmVyLT5oYW5kbGVFdmVudCgpLgorICAgKgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VycmVkIG9uLgorICAgKiBAcGFyYW0gd2hpY2ggdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuCisgICAqIEBwYXJhbSB2IHZvaWQqIGNhbGxiYWNrIGFyZyB3aGVyZSB3ZSBwbGFjZWQgVE5vbmJsb2NraW5nU2VydmVyJ3MgInRoaXMiLgorICAgKi8KKyAgc3RhdGljIHZvaWQgbGlzdGVuSGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KSB7CisgICAgKChUTm9uYmxvY2tpbmdTZXJ2ZXIqKXYpLT5oYW5kbGVFdmVudChmZCwgd2hpY2gpOworICB9CisKKyAgLy8vIEV4aXRzIHRoZSBsb29wIEFTQVAgaW4gY2FzZSBvZiBzaHV0ZG93biBvciBlcnJvci4KKyAgdm9pZCBicmVha0xvb3AoYm9vbCBlcnJvcik7CisKKyAgLy8vIENyZWF0ZSB0aGUgcGlwZSB1c2VkIHRvIG5vdGlmeSBJL08gcHJvY2VzcyBvZiB0YXNrIGNvbXBsZXRpb24uCisgIHZvaWQgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOworCisgIC8vLyBVbnJlZ2lzdGVycyBvdXIgZXZlbnRzIGZvciBub3RpZmljYXRpb24gYW5kIGxpc3RlbiBzb2NrZXRzLgorICB2b2lkIGNsZWFudXBFdmVudHMoKTsKKworICAvLy8gU2V0cyAob3IgY2xlYXJzKSBoaWdoIHByaW9yaXR5IHNjaGVkdWxpbmcgc3RhdHVzIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIHZvaWQgc2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eShib29sIHZhbHVlKTsKKworcHJpdmF0ZToKKyAgLy8vIGFzc29jaWF0ZWQgc2VydmVyCisgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKKworICAvLy8gdGhyZWFkIG51bWJlciAoZm9yIGRlYnVnZ2luZykuCisgIGNvbnN0IGludCBudW1iZXJfOworCisgIC8vLyBUaGUgYWN0dWFsIHBoeXNpY2FsIHRocmVhZCBpZC4KKyAgVGhyZWFkOjppZF90IHRocmVhZElkXzsKKworICAvLy8gSWYgbGlzdGVuU29ja2V0XyA+PSAwLCBhZGRzIGFuIGV2ZW50IG9uIHRoZSBldmVudF9iYXNlIHRvIGFjY2VwdCBjb25ucworICBUSFJJRlRfU09DS0VUIGxpc3RlblNvY2tldF87CisKKyAgLy8vIFNldHMgYSBoaWdoIHNjaGVkdWxpbmcgcHJpb3JpdHkgd2hlbiBydW5uaW5nCisgIGJvb2wgdXNlSGlnaFByaW9yaXR5XzsKKworICAvLy8gcG9pbnRlciB0byBldmVudGJhc2UgdG8gYmUgdXNlZCBmb3IgbG9vcGluZworICBldmVudF9iYXNlKiBldmVudEJhc2VfOworCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBldmVudCBiYXNlCisgIC8vLyBtZW1vcnkuCisgIGJvb2wgb3duRXZlbnRCYXNlXzsKKworICAvLy8gVXNlZCB3aXRoIGV2ZW50QmFzZV8gZm9yIGNvbm5lY3Rpb24gZXZlbnRzIChvbmx5IGluIGxpc3RlbmVyIHRocmVhZCkKKyAgc3RydWN0IGV2ZW50IHNlcnZlckV2ZW50XzsKKworICAvLy8gVXNlZCB3aXRoIGV2ZW50QmFzZV8gZm9yIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24KKyAgc3RydWN0IGV2ZW50IG5vdGlmaWNhdGlvbkV2ZW50XzsKKworICAvLy8gRmlsZSBkZXNjcmlwdG9ycyBmb3IgcGlwZSB1c2VkIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgorICBldnV0aWxfc29ja2V0X3Qgbm90aWZpY2F0aW9uUGlwZUZEc19bMl07CisKKyAgLy8vIEFjdHVhbCBJTyBUaHJlYWQKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjczMWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKK2ludCBpbmNyZWFzZV9tYXhfZmRzKGludCBtYXhfZmRzID0gKDEgPDwgMjQpKSB7CisgIHN0cnVjdCBybGltaXQgZmRtYXhybDsKKworICBmb3IgKGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkczsKKyAgICAgICBtYXhfZmRzICYmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmZkbWF4cmwpIDwgMCk7CisgICAgICAgZmRtYXhybC5ybGltX2N1ciA9IG1heF9mZHMsIGZkbWF4cmwucmxpbV9tYXggPSBtYXhfZmRzKSB7CisgICAgbWF4X2ZkcyAvPSAyOworICB9CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZmRtYXhybC5ybGltX2N1cik7Cit9CisjZW5kaWYKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZkODE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OworCisvKioKKyAqIFZpcnR1YWwgaW50ZXJmYWNlIGNsYXNzIHRoYXQgY2FuIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyIGNvcmUuIFRvCisgKiB1c2UgdGhpcyB5b3Ugc2hvdWxkIHN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgdGhhdCB5b3UgY2FyZQorICogYWJvdXQuIFlvdXIgc3ViY2xhc3MgY2FuIGFsc28gc3RvcmUgbG9jYWwgZGF0YSB0aGF0IHlvdSBtYXkgY2FyZSBhYm91dCwKKyAqIHN1Y2ggYXMgYWRkaXRpb25hbCAiYXJndW1lbnRzIiB0byB0aGVzZSBtZXRob2RzIChzdG9yZWQgaW4gdGhlIG9iamVjdAorICogaW5zdGFuY2UncyBzdGF0ZSkuCisgKi8KK2NsYXNzIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5UU2VydmVyRXZlbnRIYW5kbGVyKCkge30KKworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHt9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgKi8KKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIKKyAgICogY29udGV4dC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICAodm9pZClzZXJ2ZXJDb250ZXh0OworICAgICh2b2lkKWlucHV0OworICAgICh2b2lkKW91dHB1dDsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CisgICAgKHZvaWQpdHJhbnNwb3J0OworICB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFByZXZlbnQgZGlyZWN0IGluc3RhbnRpYXRpb24uCisgICAqLworICBUU2VydmVyRXZlbnRIYW5kbGVyKCkge30KK307CisKKy8qKgorICogVGhyaWZ0IHNlcnZlci4KKyAqCisgKi8KK2NsYXNzIFRTZXJ2ZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFNlcnZlcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIHNlcnZlKCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KKworICAvLyBBbGxvd3MgcnVubmluZyB0aGUgc2VydmVyIGFzIGEgUnVubmFibGUgdGhyZWFkCisgIHZpcnR1YWwgdm9pZCBydW4oKSB7IHNlcnZlKCk7IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IGdldFByb2Nlc3NvckZhY3RvcnkoKSB7IHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB7IHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgeworICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKworcHJvdGVjdGVkOgorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSB7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICB9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSB7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICB9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICB9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICB9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9CisKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9CisKKyAgLyoqCisgICAqIEdldCBhIFRQcm9jZXNzb3IgdG8gaGFuZGxlIGNhbGxzIG9uIGEgcGFydGljdWxhciBjb25uZWN0aW9uLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgY29ubmVjdGlvbiAobmV2ZXIgb25jZSBwZXIKKyAgICogY2FsbCkuICBUaGlzIGFsbG93cyB0aGUgVFByb2Nlc3NvckZhY3RvcnkgdG8gcmV0dXJuIGEgZGlmZmVyZW50IHByb2Nlc3NvcgorICAgKiBmb3IgZWFjaCBjb25uZWN0aW9uIGlmIGl0IGRlc2lyZXMuCisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgICBUQ29ubmVjdGlvbkluZm8gY29ubkluZm87CisgICAgY29ubkluZm8uaW5wdXQgPSBpbnB1dFByb3RvY29sOworICAgIGNvbm5JbmZvLm91dHB1dCA9IG91dHB1dFByb3RvY29sOworICAgIGNvbm5JbmZvLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV8tPmdldFByb2Nlc3Nvcihjb25uSW5mbyk7CisgIH0KKworICAvLyBDbGFzcyB2YXJpYWJsZXMKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBwcm9jZXNzb3JGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworCitwdWJsaWM6CisgIHZvaWQgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSB7CisgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgfQorCisgIHZvaWQgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgIH0KKworICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSkgeworICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICB9CisKKyAgdm9pZCBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSkgeworICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgIH0KKworICB2b2lkIHNldFNlcnZlckV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKyAgfQorfTsKKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gaW5jcmVhc2UgdGhlIG1heCBmaWxlIGRlc2NyaXB0b3JzIGxpbWl0CisgKiBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbi4KKyAqIEJ5IGRlZmF1bHQsIHRyaWVzIHRvIGluY3JlYXNlIGl0IHRvIGFzIG11Y2ggYXMgMl4yNC4KKyAqLworI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKK2ludCBpbmNyZWFzZV9tYXhfZmRzKGludCBtYXhfZmRzID0gKDEgPDwgMjQpKTsKKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZWFhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3NvciwKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6On5UU2VydmVyRnJhbWV3b3JrKCkgeworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHJlbGVhc2VPbmVEZXNjcmlwdG9yKGNvbnN0IHN0cmluZyYgbmFtZSwgVCYgcFRyYW5zcG9ydCkgeworICBpZiAocFRyYW5zcG9ydCkgeworICAgIHRyeSB7CisgICAgICBwVHJhbnNwb3J0LT5jbG9zZSgpOworICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNlcnZlckZyYW1ld29yayAiICsgbmFtZSArICIgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCkgeworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudCB0byBpbmRpY2F0ZSBzZXJ2ZXIgaXMgbm93IGxpc3RlbmluZworICAvLyBhbmQgdGhhdCBpdCBpcyBzYWZlIHRvIGNvbm5lY3QuCisgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKKyAgfQorCisgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgorICBmb3IgKDs7KSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIERlcmVmZXJlbmNlIGFueSByZXNvdXJjZXMgZnJvbSBhbnkgcHJldmlvdXMgY2xpZW50IGNyZWF0aW9uCisgICAgICAvLyBzdWNoIHRoYXQgYSBibG9ja2luZyBhY2NlcHQgZG9lcyBub3QgaG9sZCB0aGVtIGluZGVmaW5pdGVseS4KKyAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7CisgICAgICBpbnB1dFByb3RvY29sLnJlc2V0KCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKKyAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7CisgICAgICBjbGllbnQucmVzZXQoKTsKKworICAgICAgLy8gSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQKKyAgICAgIC8vIGNsaWVudHMgYWxsb3dlZCwgd2FpdCBmb3Igb25lIG9yIG1vcmUgY2xpZW50cyB0byBkcmFpbiBiZWZvcmUKKyAgICAgIC8vIGFjY2VwdGluZyBhbm90aGVyLgorICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgICAgICAgd2hpbGUgKGNsaWVudHNfID49IGxpbWl0XykgeworICAgICAgICAgIG1vbl8ud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgaWYgKCFvdXRwdXRQcm90b2NvbEZhY3RvcnlfKSB7CisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0LCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2w7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIH0KKworICAgICAgbmV3bHlDb25uZWN0ZWRDbGllbnQoc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PigKKyAgICAgICAgICBuZXcgVENvbm5lY3RlZENsaWVudChnZXRQcm9jZXNzb3IoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEhhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCksCisgICAgICAgICAgYmluZCgmVFNlcnZlckZyYW1ld29yazo6ZGlzcG9zZUNvbm5lY3RlZENsaWVudCwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSkpOworCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigiaW5wdXRUcmFuc3BvcnQiLCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigib3V0cHV0VHJhbnNwb3J0Iiwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJjbGllbnQiLCBjbGllbnQpOworICAgICAgaWYgKHR0eC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB7CisgICAgICAgIC8vIEFjY2VwdCB0aW1lb3V0IC0gY29udGludWUgcHJvY2Vzc2luZy4KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKHR0eC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUKKyAgICAgICAgICAgICAgICAgfHwgdHR4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgeworICAgICAgICAvLyBTZXJ2ZXIgd2FzIGludGVycnVwdGVkLiAgVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiBzdG9wcGluZy4KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBbGwgb3RoZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZC4KKyAgICAgICAgLy8gU3RhdGUgb2YgY29ubmVjdGlvbiBpcyB1bmtub3duLiAgRG9uZS4KKyAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNlcnZlclRyYW5zcG9ydCBkaWVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJzZXJ2ZXJUcmFuc3BvcnQiLCBzZXJ2ZXJUcmFuc3BvcnRfKTsKK30KKworaW50NjRfdCBUU2VydmVyRnJhbWV3b3JrOjpnZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICByZXR1cm4gbGltaXRfOworfQorCitpbnQ2NF90IFRTZXJ2ZXJGcmFtZXdvcms6OmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIHJldHVybiBjbGllbnRzXzsKK30KKworaW50NjRfdCBUU2VydmVyRnJhbWV3b3JrOjpnZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICByZXR1cm4gaHdtXzsKK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCkgeworICBpZiAobmV3TGltaXQgPCAxKSB7CisgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJuZXdMaW1pdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7CisgIH0KKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIGxpbWl0XyA9IG5ld0xpbWl0OworICBpZiAobGltaXRfIC0gY2xpZW50c18gPiAwKSB7CisgICAgbW9uXy5ub3RpZnkoKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OnN0b3AoKSB7CisgIC8vIE9yZGVyIGlzIGltcG9ydGFudCBiZWNhdXNlIHNlcnZlKCkgcmVsZWFzZXMgc2VydmVyVHJhbnNwb3J0XyB3aGVuIGl0IGlzCisgIC8vIGludGVycnVwdGVkLCB3aGljaCBjbG9zZXMgdGhlIHNvY2tldCB0aGF0IGludGVycnVwdENoaWxkcmVuIHVzZXMuCisgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdENoaWxkcmVuKCk7CisgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOworfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6Om5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICAgICsrY2xpZW50c187CisgICAgaHdtXyA9IChzdGQ6Om1heCkoaHdtXywgY2xpZW50c18pOworICB9CisKKyAgb25DbGllbnRDb25uZWN0ZWQocENsaWVudCk7Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6ZGlzcG9zZUNvbm5lY3RlZENsaWVudChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSB7CisgIG9uQ2xpZW50RGlzY29ubmVjdGVkKHBDbGllbnQpOworICBkZWxldGUgcENsaWVudDsKKworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgaWYgKGxpbWl0XyAtIC0tY2xpZW50c18gPiAwKSB7CisgICAgbW9uXy5ub3RpZnkoKTsKKyAgfQorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhY2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUU2VydmVyRnJhbWV3b3JrIHByb3ZpZGVzIGEgc2luZ2xlIGNvbnNvbGlkYXRlZCBwcm9jZXNzaW5nIGxvb3AgZm9yCisgKiBzZXJ2ZXJzLiAgQnkgaGF2aW5nIGEgc2luZ2xlIHByb2Nlc3NpbmcgbG9vcCwgYmVoYXZpb3IgYmV0d2VlbiBzZXJ2ZXJzCisgKiBpcyBtb3JlIHByZWRpY3RhYmxlIGFuZCBtYWludGVuYW5jZSBjb3N0IGlzIGxvd2VyZWQuICBJbXBsZW1lbnRhdGlvbnMKKyAqIG9mIFRTZXJ2ZXJGcmFtZXdvcmsgbXVzdCBwcm92aWRlIGEgbWV0aG9kIHRvIGRlYWwgd2l0aCBhIGNsaWVudCB0aGF0CisgKiBjb25uZWN0cyBhbmQgb25lIHRoYXQgZGlzY29ubmVjdHMuCisgKgorICogV2hpbGUgdGhpcyBmdW5jdGlvbmFsaXR5IGNvdWxkIGJlIHJvbGxlZCBkaXJlY3RseSBpbnRvIFRTZXJ2ZXIsIGFuZAorICogcHJvYmFibHkgc2hvdWxkIGJlLCBpdCB3b3VsZCBicmVhayB0aGUgVFNlcnZlciBpbnRlcmZhY2UgY29udHJhY3Qgc28KKyAqIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB0aGlyZCBwYXJ0eSBzZXJ2ZXJzLCBubyBUU2VydmVycworICogd2VyZSBoYXJtZWQgaW4gdGhlIG1ha2luZyBvZiB0aGlzIGNsYXNzLgorICovCitjbGFzcyBUU2VydmVyRnJhbWV3b3JrIDogcHVibGljIFRTZXJ2ZXIgeworcHVibGljOgorICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIHZpcnR1YWwgflRTZXJ2ZXJGcmFtZXdvcmsoKTsKKworICAvKioKKyAgICogQWNjZXB0IGNsaWVudHMgZnJvbSB0aGUgVFNlcnZlclRyYW5zcG9ydCBhbmQgYWRkIHRoZW0gZm9yIHByb2Nlc3NpbmcuCisgICAqIENhbGwgc3RvcCgpIG9uIGFub3RoZXIgdGhyZWFkIHRvIGludGVycnVwdCBwcm9jZXNzaW5nCisgICAqIGFuZCByZXR1cm4gY29udHJvbCB0byB0aGUgY2FsbGVyLgorICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKKyAgICogICBUaGUgc2VydmVyVHJhbnNwb3J0IHdpbGwgYmUgY2xvc2VkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisKKyAgLyoqCisgICAqIEludGVycnVwdCBzZXJ2ZSgpIHNvIHRoYXQgaXQgbWVldHMgcG9zdC1jb25kaXRpb25zIGFuZCByZXR1cm5zLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKworICAvKioKKyAgICogR2V0IHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdC4KKyAgICogXHJldHVybnMgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0CisgICAqLworICB2aXJ0dWFsIGludDY0X3QgZ2V0Q29uY3VycmVudENsaWVudExpbWl0KCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEdldCB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cy4KKyAgICogXHJldHVybnMgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMKKyAgICovCisgIHZpcnR1YWwgaW50NjRfdCBnZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSBjb25zdDsKKworICAvKioKKyAgICogR2V0IHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqIFxyZXR1cm5zIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICovCisgIHZpcnR1YWwgaW50NjRfdCBnZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSBjb25zdDsKKworICAvKioKKyAgICogU2V0IHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdC4gIFRoaXMgY2FuIGJlIGNoYW5nZWQgd2hpbGUKKyAgICogdGhlIHNlcnZlciBpcyBzZXJ2aW5nIGhvd2V2ZXIgaXQgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUKKyAgICogZW5mb3JjZWQgdW50aWwgdGhlIG5leHQgY2xpZW50IGlzIGFjY2VwdGVkIGFuZCBhZGRlZC4gIElmIHRoZQorICAgKiBsaW1pdCBpcyBsb3dlcmVkIGJlbG93IHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIGNsaWVudHMsIG5vCisgICAqIGFjdGlvbiBpcyB0YWtlbiB0byBkaXNjb25uZWN0IHRoZSBjbGllbnRzLgorICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSB1c2VkIGlmIHRoaXMgaXMgbm90IGNhbGxlZCBpcyBJTlQ2NF9NQVguCisgICAqIFxwYXJhbVtpbl0gIG5ld0xpbWl0ICB0aGUgbmV3IGxpbWl0IG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKiBcdGhyb3dzIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiBuZXdMaW1pdCBpcyBsZXNzIHRoYW4gMQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90IG5ld0xpbWl0KTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogQSBjbGllbnQgaGFzIGNvbm5lY3RlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAqIGxpZmV0aW1lIG9mIHRoZSBjbGllbnQgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZSgpIHRocmVhZCwKKyAgICogdGhlcmVmb3JlIGEgZmFpbHVyZSB0byByZXR1cm4gcXVpY2tseSB3aWxsIHJlc3VsdCBpbiBuZXcgY2xpZW50IGNvbm5lY3Rpb24KKyAgICogZGVsYXlzLgorICAgKgorICAgKiBccGFyYW1baW5dICBwQ2xpZW50ICB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgPSAwOworCisgIC8qKgorICAgKiBBIGNsaWVudCBoYXMgZGlzY29ubmVjdGVkLgorICAgKiBXaGVuIGNhbGxlZDoKKyAgICogICBUaGUgc2VydmVyIG5vIGxvbmdlciB0cmFja3MgdGhlIGNsaWVudC4KKyAgICogICBUaGUgY2xpZW50IFRUcmFuc3BvcnQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCisgICAqICAgVGhlIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IGRlbGV0ZSB0aGUgcG9pbnRlci4KKyAgICoKKyAgICogXHBhcmFtW2luXSAgcENsaWVudCAgdGhlIGRpc2Nvbm5lY3RlZCBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSA9IDA7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDb21tb24gaGFuZGxpbmcgZm9yIG5ldyBjb25uZWN0ZWQgY2xpZW50cy4gIEltcGxlbWVudHMgY29uY3VycmVudAorICAgKiBjbGllbnQgcmF0ZSBsaW1pdGluZyBhZnRlciBvbkNsaWVudENvbm5lY3RlZCByZXR1cm5zIGJ5IGJsb2NraW5nIHRoZQorICAgKiBzZXJ2ZSgpIHRocmVhZCBpZiB0aGUgbGltaXQgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICovCisgIHZvaWQgbmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKKworICAvKioKKyAgICogU21hcnQgcG9pbnRlciBjbGllbnQgZGVsZXRpb24uCisgICAqIENhbGxzIG9uQ2xpZW50RGlzY29ubmVjdGVkIGFuZCB0aGVuIGRlbGV0ZXMgcENsaWVudC4KKyAgICovCisgIHZvaWQgZGlzcG9zZUNvbm5lY3RlZENsaWVudChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KTsKKworICAvKioKKyAgICogTW9uaXRvciBmb3IgbGltaXRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgbW9uXzsKKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBpbnQ2NF90IGNsaWVudHNfOworCisgIC8qKgorICAgKiBUaGUgaGlnaCB3YXRlciBtYXJrIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGludDY0X3QgaHdtXzsKKworICAvKioKKyAgICogVGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgaW50NjRfdCBsaW1pdF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjIzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6flRTaW1wbGVTZXJ2ZXIoKSB7Cit9CisKKy8qKgorICogVGhlIG1haW4gYm9keSBvZiBjdXN0b21pemVkIGltcGxlbWVudGF0aW9uIGZvciBUU2ltcGxlU2VydmVyIGlzIHF1aXRlIHNpbXBsZToKKyAqIFdoZW4gYSBjbGllbnQgY29ubmVjdHMsIHVzZSB0aGUgc2VydmUoKSB0aHJlYWQgdG8gZHJpdmUgaXQgdG8gY29tcGxldGlvbiB0aHVzCisgKiBibG9ja2luZyBuZXcgY29ubmVjdGlvbnMuCisgKi8KK3ZvaWQgVFNpbXBsZVNlcnZlcjo6b25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgeworICBwQ2xpZW50LT5ydW4oKTsKK30KKworLyoqCisgKiBUU2ltcGxlU2VydmVyIGRvZXMgbm90IHRyYWNrIGNsaWVudHMgc28gdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLgorICovCit2b2lkIFRTaW1wbGVTZXJ2ZXI6Om9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqKSB7Cit9CisKKy8qKgorICogVGhpcyBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gdGhlIHNpbXBsZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBub3QgY2FwYWJsZQorICogb2YgaGF2aW5nIG1vcmUgdGhhbiBvbmUgY2xpZW50IGF0IGEgdGltZSwgc28gd2UgaGlkZSBpdC4KKyAqLwordm9pZCBUU2ltcGxlU2VydmVyOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCkgeworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDkyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBzaW1wbGUgc2VydmVyLiBJdCBpcyBzaW5nbGUtdGhyZWFkZWQgYW5kIHJ1bnMgYQorICogY29udGludW91cyBsb29wIG9mIGFjY2VwdGluZyBhIHNpbmdsZSBjb25uZWN0aW9uLCBwcm9jZXNzaW5nIHJlcXVlc3RzIG9uCisgKiB0aGF0IGNvbm5lY3Rpb24gdW50aWwgaXQgY2xvc2VzLCBhbmQgdGhlbiByZXBlYXRpbmcuCisgKi8KK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CitwdWJsaWM6CisgIFRTaW1wbGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTaW1wbGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2ltcGxlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2ltcGxlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgdmlydHVhbCB+VFNpbXBsZVNlcnZlcigpOworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisKK3ByaXZhdGU6CisgIHZvaWQgc2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QgbmV3TGltaXQpOyAvLyBoaWRlCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzNDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAorICAgIHRpbWVvdXRfKDApLAorICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7Cit9CisKK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KKworVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KKworVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcikKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KKworVFRocmVhZFBvb2xTZXJ2ZXI6On5UVGhyZWFkUG9vbFNlcnZlcigpIHsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2VydmUoKSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCk7CisgIHRocmVhZE1hbmFnZXJfLT5zdG9wKCk7Cit9CisKK2ludDY0X3QgVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRpbWVvdXQoKSBjb25zdCB7CisgIHJldHVybiB0aW1lb3V0XzsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2V0VGltZW91dChpbnQ2NF90IHZhbHVlKSB7CisgIHRpbWVvdXRfID0gdmFsdWU7Cit9CisKK2ludDY0X3QgVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRhc2tFeHBpcmF0aW9uKCkgY29uc3QgeworICByZXR1cm4gdGFza0V4cGlyYXRpb25fOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXRUYXNrRXhwaXJhdGlvbihpbnQ2NF90IHZhbHVlKSB7CisgIHRhc2tFeHBpcmF0aW9uXyA9IHZhbHVlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPgorVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRocmVhZE1hbmFnZXIoKSBjb25zdCB7CisgIHJldHVybiB0aHJlYWRNYW5hZ2VyXzsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6b25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgeworICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHBDbGllbnQsIGdldFRpbWVvdXQoKSwgZ2V0VGFza0V4cGlyYXRpb24oKSk7Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6Om9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqKSB7Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTk5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIGEgdGhyZWFkIHBvb2wuCisgKi8KK2NsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgeworcHVibGljOgorICBUVGhyZWFkUG9vbFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKKworICBUVGhyZWFkUG9vbFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CisKKyAgVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CisKKyAgVFRocmVhZFBvb2xTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOworCisgIHZpcnR1YWwgflRUaHJlYWRQb29sU2VydmVyKCk7CisKKyAgLyoqCisgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgorICAgKiAgIFRoZXJlIHdpbGwgYmUgbm8gY2xpZW50cyBjb25uZWN0ZWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKKworICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZW91dCgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgc2V0VGltZW91dChpbnQ2NF90IHZhbHVlKTsKKworICB2aXJ0dWFsIGludDY0X3QgZ2V0VGFza0V4cGlyYXRpb24oKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHNldFRhc2tFeHBpcmF0aW9uKGludDY0X3QgdmFsdWUpOworCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gZ2V0VGhyZWFkTWFuYWdlcigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRpbWVvdXRfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0YXNrRXhwaXJhdGlvbl87Cit9OworCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY0ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7CisKK1RUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6flRUaHJlYWRlZFNlcnZlcigpIHsKK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OnNlcnZlKCkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpOworCisgIC8vIEVuc3VyZSBwb3N0LWNvbmRpdGlvbiBvZiBubyBhY3RpdmUgY2xpZW50cworICBTeW5jaHJvbml6ZWQgcyhjbGllbnRNb25pdG9yXyk7CisgIHdoaWxlICghYWN0aXZlQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgY2xpZW50TW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgZHJhaW5EZWFkQ2xpZW50cygpOworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6ZHJhaW5EZWFkQ2xpZW50cygpIHsKKyAgLy8gd2UncmUgaW4gYSBtb25pdG9yIGhlcmUKKyAgd2hpbGUgKCFkZWFkQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IGRlYWRDbGllbnRNYXBfLmJlZ2luKCk7CisgICAgaXQtPnNlY29uZC0+am9pbigpOworICAgIGRlYWRDbGllbnRNYXBfLmVyYXNlKGl0KTsKKyAgfQorfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6b25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgeworICBTeW5jaHJvbml6ZWQgc3luYyhjbGllbnRNb25pdG9yXyk7CisgIHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4gcFJ1bm5hYmxlID0gbWFrZV9zaGFyZWQ8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4ocENsaWVudCk7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiBwVGhyZWFkID0gdGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChwUnVubmFibGUpOworICBwUnVubmFibGUtPnRocmVhZChwVGhyZWFkKTsKKyAgYWN0aXZlQ2xpZW50TWFwXy5pbnNlcnQoQ2xpZW50TWFwOjp2YWx1ZV90eXBlKHBDbGllbnQuZ2V0KCksIHBUaHJlYWQpKTsKKyAgcFRocmVhZC0+c3RhcnQoKTsKK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6Om9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIHsKKyAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOworICBkcmFpbkRlYWRDbGllbnRzKCk7IC8vIHVzZSB0aGUgb3V0Z29pbmcgdGhyZWFkIHRvIGRvIHNvbWUgbWFpbnRlbmFuY2Ugb24gb3VyIGRlYWQgY2xpZW50IGJhY2tsb2cKKyAgQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IGFjdGl2ZUNsaWVudE1hcF8uZmluZChwQ2xpZW50KTsKKyAgaWYgKGl0ICE9IGFjdGl2ZUNsaWVudE1hcF8uZW5kKCkpIHsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGVuZCA9IGl0OworICAgIGRlYWRDbGllbnRNYXBfLmluc2VydChpdCwgKytlbmQpOworICAgIGFjdGl2ZUNsaWVudE1hcF8uZXJhc2UoaXQpOworICB9CisgIGlmIChhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy5ub3RpZnkoKTsKKyAgfQorfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkKKyAgOiBwQ2xpZW50XyhwQ2xpZW50KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6flRDb25uZWN0ZWRDbGllbnRSdW5uZXIoKSB7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjpydW4oKSAvKiBvdmVycmlkZSAqLyB7CisgIHBDbGllbnRfLT5ydW4oKTsgIC8vIFJ1biB0aGUgY2xpZW50CisgIHBDbGllbnRfLnJlc2V0KCk7IC8vIFRoZSBjbGllbnQgaXMgZG9uZSAtIHJlbGVhc2UgaXQgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZGVzdHJ1Y3RvciBmb3Igc2FmZXR5Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjY2QwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBNYW5hZ2UgY2xpZW50cyB1c2luZyB0aHJlYWRzIC0gdGhyZWFkcyBhcmUgY3JlYXRlZCBvbmUgZm9yIGVhY2ggY2xpZW50IGFuZCBhcmUKKyAqIHJlbGVhc2VkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gIFRoaXMgc2VydmVyIGlzIHVzZWQgdG8gbWFrZSBhIGR5bmFtaWNhbGx5CisgKiBzY2FsYWJsZSBzZXJ2ZXIgdXAgdG8gdGhlIGNvbmN1cnJlbnQgY29ubmVjdGlvbiBsaW1pdC4KKyAqLworY2xhc3MgVFRocmVhZGVkU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgeworcHVibGljOgorICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CisKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKKworICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CisKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKKworICB2aXJ0dWFsIH5UVGhyZWFkZWRTZXJ2ZXIoKTsKKworICAvKioKKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlcmUgd2lsbCBiZSBubyBjbGllbnRzIGNvbm5lY3RlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBEcmFpbiByZWNlbnRseSBjb25uZWN0ZWQgY2xpZW50cyBieSBqb2luaW5nIHRoZWlyIHRocmVhZHMgLSB0aGlzIGlzIGRvbmUgbGF6aWx5IGJlY2F1c2UKKyAgICogd2UgY2Fubm90IGRvIGl0IGluc2lkZSB0aGUgdGhyZWFkIGNvbnRleHQgdGhhdCBpcyBkaXNjb25uZWN0aW5nLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGRyYWluRGVhZENsaWVudHMoKTsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgVFNlcnZlckZyYW1ld29yazo6b25DbGllbnRDb25uZWN0ZWQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyRnJhbWV3b3JrOjpvbkNsaWVudERpc2Nvbm5lY3RlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQgKnBDbGllbnQpIC8qIG92ZXJyaWRlICovOworCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOworCisgIC8qKgorICAgKiBBIGhlbHBlciB3cmFwcGVyIHVzZWQgdG8gd3JhcCB0aGUgY2xpZW50IGluIHNvbWV0aGluZyB3ZSBjYW4gdXNlIHRvIG1haW50YWluCisgICAqIHRoZSBsaWZldGltZSBvZiB0aGUgY29ubmVjdGVkIGNsaWVudCB3aXRoaW4gYSBkZXRhY2hlZCB0aHJlYWQuICBXZSBjYW5ub3Qgc2ltcGx5CisgICAqIHRyYWNrIHRoZSB0aHJlYWRzIGJlY2F1c2UgYSBzaGFyZWRfcHRyPFRocmVhZD4gaGFuZ3Mgb24gdG8gdGhlIFJ1bm5hYmxlIGl0IGlzCisgICAqIHBhc3NlZCwgYW5kIFRTZXJ2ZXJGcmFtZXdvcmsgcmVxdWlyZXMgdGhlIHJ1bm5hYmxlIChUQ29ubmVjdGVkQ2xpZW50KSB0byBiZQorICAgKiBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gd29yayBwcm9wZXJseS4KKyAgICovCisgIGNsYXNzIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZQorICB7CisgIHB1YmxpYzoKKyAgICBUQ29ubmVjdGVkQ2xpZW50UnVubmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCk7CisgICAgdmlydHVhbCB+VENvbm5lY3RlZENsaWVudFJ1bm5lcigpOworICAgIHZvaWQgcnVuKCkgLyogb3ZlcnJpZGUgKi87CisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+IHBDbGllbnRfOworICB9OworCisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBjbGllbnRNb25pdG9yXzsKKworICB0eXBlZGVmIHN0ZDo6bWFwPFRDb25uZWN0ZWRDbGllbnQgKiwgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiA+IENsaWVudE1hcDsKKworICAvKioKKyAgICogQSBtYXAgb2YgYWN0aXZlIGNsaWVudHMKKyAgICovCisgIENsaWVudE1hcCBhY3RpdmVDbGllbnRNYXBfOworCisgIC8qKgorICAgKiBBIG1hcCBvZiBjbGllbnRzIHRoYXQgaGF2ZSBkaXNjb25uZWN0ZWQgYnV0IHRoZWlyIHRocmVhZHMgaGF2ZSBub3QgYmVlbiBqb2luZWQKKyAgICovCisgIENsaWVudE1hcCBkZWFkQ2xpZW50TWFwXzsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDg3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL2NvbmZpZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkxMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKyMgIGRlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA6OldTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PICgqX2Vycm5vKCkpCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiBXU0FFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gV1NBRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUIFdTQUVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FUElQRSBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX0VYQ0xVU0lWRUFERFJVU0UKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUIFNPQ0tFVAorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCBJTlZBTElEX1NPQ0tFVAorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHRocmlmdF9zb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIHRocmlmdF9mY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIDEKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCAwCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgMQorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgdGhyaWZ0X2dldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZXNvY2tldAorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBfY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBfb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgX2Noc2l6ZV9zCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIF9jb21taXQKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgX2xzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIF93cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIF9yZWFkCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVCBpb2N0bHNvY2tldAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgdV9sb25nCisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIF9mc3RhdAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIF9zdGF0CisjICBpZmRlZiBfV0lOMzJfV0NFCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SKC4uLikgdGhyaWZ0X3dzdHIyc3RyKGdhaV9zdHJlcnJvclcoX19WQV9BUkdTX18pKQorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3JBCisjICBlbmRpZgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgcHRyZGlmZl90CisjICBpZiAoX01TQ19WRVIgPCAxOTAwKQorIyAgICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIF9zbnByaW50ZgorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBlbmRpZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgdGhyaWZ0X3NsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdGhyaWZ0X3VzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aHJpZnRfdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiB0aHJpZnRfY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHRocmlmdF9wb2xsCisjICBpZiBXSU5WRVIgPD0gMHgwNTAyIC8vWFAsIFNlcnZlcjIwMDMKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHRocmlmdF9wb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIDB4MDMwMAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgMHgwMDEwCisjICBlbHNlIC8vVmlzdGEsIFdpbjcuLi4KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBlbmRpZiAvL1dJTlZFUgorIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0RfQk9USAorIyAgaWYgIWRlZmluZWQoQUlfQUREUkNPTkZJRykKKyMgICAgZGVmaW5lIEFJX0FERFJDT05GSUcgMHgwMDAwMDQwMAorIyAgZW5kaWYKKyNlbHNlIC8vbm90IF9XSU4zMgorIyAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FUlJOTyBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiAgICAgICBFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUICBFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OICAgIEVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCAgIEVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gICAgICBFQUdBSU4KKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgICAgICAgRVBJUEUKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fUkVVU0VBRERSCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVCBpbnQKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgKC0xKQorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHNvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyBPX05PTkJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgRl9HRVRGTAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIEZfU0VURkwKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIGdldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIG9wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIGZ0cnVuY2F0ZQorIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBmc3luYworIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBsc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSB3cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIHJlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3RsCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBpbnQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBzdGF0CisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIGZzdGF0CisjICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3IKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHNzaXplX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHBvbGwKKyMgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTSFVUX1JEV1IKKyNlbmRpZgorCisjZW5kaWYgLy8gX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzJmODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcApAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VpbnQzMl90IFRCdWZmZXJlZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKKworICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAorICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KKyAgYXNzZXJ0KGhhdmUgPCBsZW4pOworCisgIC8vIElmIHdlIGhhdmUgc29tZSBkYXRhIGluIHRoZSBidWZmZXIsIGNvcHkgaXQgb3V0IGFuZCByZXR1cm4gaXQuCisgIC8vIFdlIGhhdmUgdG8gcmV0dXJuIGl0IHdpdGhvdXQgYXR0ZW1wdGluZyB0byByZWFkIG1vcmUsIHNpbmNlIHdlIGFyZW4ndAorICAvLyBndWFyYW50ZWVkIHRoYXQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGFjdHVhbGx5IGhhcyBtb3JlIGRhdGEsIHNvCisgIC8vIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIGl0IGNvdWxkIGJsb2NrLgorICBpZiAoaGF2ZSA+IDApIHsKKyAgICBtZW1jcHkoYnVmLCByQmFzZV8sIGhhdmUpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDApOworICAgIHJldHVybiBoYXZlOworICB9CisKKyAgLy8gTm8gZGF0YSBpcyBhdmFpbGFibGUgaW4gb3VyIGJ1ZmZlci4KKyAgLy8gR2V0IG1vcmUgZnJvbSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1cCB0byBidWZmZXIgc2l6ZS4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UgaWYgbGVuIDwgckJ1ZlNpemVfCisgIC8vIGFuZCBhbG1vc3Qgbm8gc2Vuc2Ugb3RoZXJ3aXNlLiAgVE9ETyhkcmVpc3MpOiBGaXggdGhhdAorICAvLyBjYXNlIChwb3NzaWJseSBpbmNsdWRpbmcgc29tZSByZWFkdiBob3RuZXNzKS4KKyAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgdHJhbnNwb3J0Xy0+cmVhZChyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKSk7CisKKyAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUuCisgIHVpbnQzMl90IGdpdmUgPSAoc3RkOjptaW4pKGxlbiwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pKTsKKyAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBnaXZlKTsKKyAgckJhc2VfICs9IGdpdmU7CisKKyAgcmV0dXJuIGdpdmU7Cit9CisKK3ZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgIHVpbnQzMl90IHNwYWNlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCb3VuZF8gLSB3QmFzZV8pOworICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3QgYWNjb21tb2RhdGUgdGhlIHdyaXRlCisgIC8vIHdpdGggdGhlIGZyZWUgc3BhY2UgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgorICBhc3NlcnQod0JvdW5kXyAtIHdCYXNlXyA8IHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSk7CisKKyAgLy8gTm93IGhlcmUncyB0aGUgdHJpY2t5IHF1ZXN0aW9uOiBzaG91bGQgd2UgY29weSBkYXRhIGZyb20gYnVmIGludG8gb3VyCisgIC8vIGludGVybmFsIGJ1ZmZlciBhbmQgd3JpdGUgaXQgZnJvbSB0aGVyZSwgb3Igc2hvdWxkIHdlIGp1c3Qgd3JpdGUgb3V0CisgIC8vIHRoZSBjdXJyZW50IGludGVybmFsIGJ1ZmZlciBpbiBvbmUgc3lzY2FsbCBhbmQgd3JpdGUgb3V0IGJ1ZiBpbiBhbm90aGVyLgorICAvLyBJZiBvdXIgY3VycmVudGx5IGJ1ZmZlcmVkIGRhdGEgcGx1cyBidWYgaXMgYXQgbGVhc3QgZG91YmxlIG91ciBidWZmZXIKKyAgLy8gc2l6ZSwgd2Ugd2lsbCBoYXZlIHRvIGRvIHR3byBzeXNjYWxscyBubyBtYXR0ZXIgd2hhdCAoZXhjZXB0IGluIHRoZQorICAvLyBkZWdlbmVyYXRlIGNhc2Ugd2hlbiBvdXIgYnVmZmVyIGlzIGVtcHR5KSwgc28gdGhlcmUgaXMgbm8gdXNlIGNvcHlpbmcuCisgIC8vIE90aGVyd2lzZSwgdGhlcmUgaXMgc29ydCBvZiBhIHNsaWRpbmcgc2NhbGUuICBJZiB3ZSBoYXZlIE4tMSBieXRlcworICAvLyBidWZmZXJlZCBhbmQgbmVlZCB0byB3cml0ZSAyLCBpdCB3b3VsZCBiZSBjcmF6eSB0byBkbyB0d28gc3lzY2FsbHMuCisgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBoYXZlIDIgYnl0ZXMgYnVmZmVyZWQgYW5kIGFyZSB3cml0aW5nIDJOLTMsCisgIC8vIHdlIGNhbiBzYXZlIGEgc3lzY2FsbCBpbiB0aGUgc2hvcnQgdGVybSBieSBsb2FkaW5nIHVwIG91ciBidWZmZXIsIHdyaXRpbmcKKyAgLy8gaXQgb3V0LCBhbmQgY29weWluZyB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgaW50byBvdXIgYnVmZmVyLiAgT2YgY291cnNlLAorICAvLyBpZiB3ZSBnZXQgYW5vdGhlciAyLWJ5dGUgd3JpdGUsIHdlIGhhdmVuJ3Qgc2F2ZWQgYW55IHN5c2NhbGxzIGF0IGFsbCwKKyAgLy8gYW5kIGhhdmUganVzdCBjb3BpZWQgbmVhcmx5IDJOIGJ5dGVzIGZvciBub3RoaW5nLiAgRmluZGluZyBhIHBlcmZlY3QKKyAgLy8gcG9saWN5IHdvdWxkIHJlcXVpcmUgcHJlZGljdGluZyB0aGUgc2l6ZSBvZiBmdXR1cmUgd3JpdGVzLCBzbyB3ZSdyZSBqdXN0CisgIC8vIGdvaW5nIHRvIGFsd2F5cyBlc2NoZXcgc3lzY2FsbHMgaWYgd2UgaGF2ZSBsZXNzIHRoYW4gMk4gYnl0ZXMgdG8gd3JpdGUuCisKKyAgLy8gVGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBkbyB0d28gc3lzY2FsbHMuCisgIC8vIFRoaXMgY2FzZSBhbHNvIGNvdmVycyB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGlzIGVtcHR5LAorICAvLyBidXQgaXQgaXMgY2xlYXJlciAoSSB0aGluaykgdG8gdGhpbmsgb2YgaXQgYXMgdHdvIHNlcGFyYXRlIGNhc2VzLgorICBpZiAoKGhhdmVfYnl0ZXMgKyBsZW4gPj0gMiAqIHdCdWZTaXplXykgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpIHsKKyAgICAvLyBUT0RPKGRyZWlzcyk6IHdyaXRldgorICAgIGlmIChoYXZlX2J5dGVzID4gMCkgeworICAgICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVfYnl0ZXMpOworICAgIH0KKyAgICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7CisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRmlsbCB1cCBvdXIgaW50ZXJuYWwgYnVmZmVyIGZvciBhIHdyaXRlLgorICBtZW1jcHkod0Jhc2VfLCBidWYsIHNwYWNlKTsKKyAgYnVmICs9IHNwYWNlOworICBsZW4gLT0gc3BhY2U7CisgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworCisgIC8vIENvcHkgdGhlIHJlc3QgaW50byBvdXIgYnVmZmVyLgorICBhc3NlcnQobGVuIDwgd0J1ZlNpemVfKTsKKyAgbWVtY3B5KHdCdWZfLmdldCgpLCBidWYsIGxlbik7CisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgbGVuOworICByZXR1cm47Cit9CisKK2NvbnN0IHVpbnQ4X3QqIFRCdWZmZXJlZFRyYW5zcG9ydDo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICAodm9pZClsZW47CisgIC8vIFNpbXBseSByZXR1cm4gTlVMTC4gIFdlIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgYWN0dWFsbHkgZGF0YSBhdmFpbGFibGUgb24KKyAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBzbyBjYWxsaW5nIHJlYWQoKSBtaWdodCBibG9jay4KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7CisgIGlmIChoYXZlX2J5dGVzID4gMCkgeworICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKKyAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZV9ieXRlcyk7CisgIH0KKworICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgIHRyYW5zcG9ydF8tPmZsdXNoKCk7Cit9CisKK3VpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IHdhbnQgPSBsZW47CisgIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CisKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IHNhdGlzZnkgdGhlIHJlYWQKKyAgLy8gd2l0aCB0aGUgZGF0YSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCisgIGFzc2VydChoYXZlIDwgd2FudCk7CisKKyAgLy8gSWYgd2UgaGF2ZSBzb21lIGRhdGEgaW4gdGhlIGJ1ZmZlciwgY29weSBpdCBvdXQgYW5kIHJldHVybiBpdC4KKyAgLy8gV2UgaGF2ZSB0byByZXR1cm4gaXQgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSwgc2luY2Ugd2UgYXJlbid0CisgIC8vIGd1YXJhbnRlZWQgdGhhdCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYWN0dWFsbHkgaGFzIG1vcmUgZGF0YSwgc28KKyAgLy8gYXR0ZW1wdGluZyB0byByZWFkIGZyb20gaXQgY291bGQgYmxvY2suCisgIGlmIChoYXZlID4gMCkgeworICAgIG1lbWNweShidWYsIHJCYXNlXywgaGF2ZSk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7CisgICAgcmV0dXJuIGhhdmU7CisgIH0KKworICAvLyBSZWFkIGFub3RoZXIgZnJhbWUuCisgIGlmICghcmVhZEZyYW1lKCkpIHsKKyAgICAvLyBFT0YuICBObyBmcmFtZSBhdmFpbGFibGUuCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBUT0RPKGRyZWlzcyk6IFNob3VsZCB3ZSB3YXJuIHdoZW4gcmVhZHMgY3Jvc3MgZnJhbWVzPworCisgIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlLgorICB1aW50MzJfdCBnaXZlID0gKHN0ZDo6bWluKSh3YW50LCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXykpOworICBtZW1jcHkoYnVmLCByQmFzZV8sIGdpdmUpOworICByQmFzZV8gKz0gZ2l2ZTsKKyAgd2FudCAtPSBnaXZlOworCisgIHJldHVybiAobGVuIC0gd2FudCk7Cit9CisKK2Jvb2wgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEZyYW1lKCkgeworICAvLyBUT0RPKGRyZWlzcyk6IFRoaW5rIGFib3V0IHVzaW5nIHJlYWR2IGhlcmUsIGV2ZW4gdGhvdWdoIGl0IHdvdWxkCisgIC8vIHJlc3VsdCBpbiAoZ2FzcCkgcmVhZC1haGVhZC4KKworICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgorICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KKyAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgorICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgaW50MzJfdCBzeiA9IC0xOworICB1aW50MzJfdCBzaXplX2J5dGVzX3JlYWQgPSAwOworICB3aGlsZSAoc2l6ZV9ieXRlc19yZWFkIDwgc2l6ZW9mKHN6KSkgeworICAgIHVpbnQ4X3QqIHN6cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzeikgKyBzaXplX2J5dGVzX3JlYWQ7CisgICAgdWludDMyX3QgYnl0ZXNfcmVhZAorICAgICAgICA9IHRyYW5zcG9ydF8tPnJlYWQoc3pwLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZW9mKHN6KSkgLSBzaXplX2J5dGVzX3JlYWQpOworICAgIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICAgIGlmIChzaXplX2J5dGVzX3JlYWQgPT0gMCkgeworICAgICAgICAvLyBFT0YgYmVmb3JlIGFueSBkYXRhIHdhcyByZWFkLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFT0YgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lIGhlYWRlci4gIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aWFsIGZyYW1lIGhlYWRlci4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2l6ZV9ieXRlc19yZWFkICs9IGJ5dGVzX3JlYWQ7CisgIH0KKworICBzeiA9IG50b2hsKHN6KTsKKworICBpZiAoc3ogPCAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSBoYXMgbmVnYXRpdmUgdmFsdWUiKTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBvdmVyc2l6ZWQgZnJhbWUKKyAgaWYgKHN6ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obWF4RnJhbWVTaXplXykpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwgIlJlY2VpdmVkIGFuIG92ZXJzaXplZCBmcmFtZSIpOworCisgIC8vIFJlYWQgdGhlIGZyYW1lIHBheWxvYWQsIGFuZCByZXNldCBtYXJrZXJzLgorICBpZiAoc3ogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihyQnVmU2l6ZV8pKSB7CisgICAgckJ1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbc3pdKTsKKyAgICByQnVmU2l6ZV8gPSBzejsKKyAgfQorICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpLCBzeik7CisgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIC8vIERvdWJsZSBidWZmZXIgc2l6ZSB1bnRpbCBzdWZmaWNpZW50LgorICB1aW50MzJfdCBoYXZlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgdWludDMyX3QgbmV3X3NpemUgPSB3QnVmU2l6ZV87CisgIGlmIChsZW4gKyBoYXZlIDwgaGF2ZSAvKiBvdmVyZmxvdyAqLyB8fCBsZW4gKyBoYXZlID4gMHg3ZmZmZmZmZikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHdyaXRlIG92ZXIgMiBHQiB0byBURnJhbWVkVHJhbnNwb3J0LiIpOworICB9CisgIHdoaWxlIChuZXdfc2l6ZSA8IGxlbiArIGhhdmUpIHsKKyAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4gMCA/IG5ld19zaXplICogMiA6IDE7CisgIH0KKworICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1vZGlmeWluZyB0aGlzIGNsYXNzIHRvIHVzZSBtYWxsb2MvZnJlZQorICAvLyBzbyB3ZSBjYW4gdXNlIHJlYWxsb2MgaGVyZS4KKworICAvLyBBbGxvY2F0ZSBuZXcgYnVmZmVyLgorICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOworCisgIC8vIENvcHkgdGhlIG9sZCBidWZmZXIgdG8gdGhlIG5ldyBvbmUuCisgIG1lbWNweShuZXdfYnVmLCB3QnVmXy5nZXQoKSwgaGF2ZSk7CisKKyAgLy8gTm93IHBvaW50IGJ1ZiB0byB0aGUgbmV3IG9uZS4KKyAgd0J1Zl8ucmVzZXQobmV3X2J1Zik7CisgIHdCdWZTaXplXyA9IG5ld19zaXplOworICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIGhhdmU7CisgIHdCb3VuZF8gPSB3QnVmXy5nZXQoKSArIHdCdWZTaXplXzsKKworICAvLyBDb3B5IHRoZSBkYXRhIGludG8gdGhlIG5ldyBidWZmZXIuCisgIG1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKKyAgd0Jhc2VfICs9IGxlbjsKK30KKwordm9pZCBURnJhbWVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgaW50MzJfdCBzel9oYm8sIHN6X25ibzsKKyAgYXNzZXJ0KHdCdWZTaXplXyA+IHNpemVvZihzel9uYm8pKTsKKworICAvLyBTbGlwIHRoZSBmcmFtZSBzaXplIGludG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgIHN6X2hibyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSAod0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKSkpOworICBzel9uYm8gPSAoaW50MzJfdClodG9ubCgodWludDMyX3QpKHN6X2hibykpOworICBtZW1jcHkod0J1Zl8uZ2V0KCksICh1aW50OF90Kikmc3pfbmJvLCBzaXplb2Yoc3pfbmJvKSk7CisKKyAgaWYgKHN6X2hibyA+IDApIHsKKyAgICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd0Jhc2VfICh3aXRoIGEgcGFkIGZvciB0aGUgZnJhbWUgc2l6ZSkKKyAgICAvLyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZSB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlCisgICAgLy8gKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cworICAgIC8vIHVwIGFuIGV4Y2VwdGlvbgorICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc2l6ZW9mKHN6X25ibyk7CisKKyAgICAvLyBXcml0ZSBzaXplIGFuZCBmcmFtZSBib2R5LgorICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZW9mKHN6X25ibykpICsgc3pfaGJvKTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKKworICAvLyByZWNsYWltIHdyaXRlIGJ1ZmZlcgorICBpZiAod0J1ZlNpemVfID4gYnVmUmVjbGFpbVRocmVzaF8pIHsKKyAgICB3QnVmU2l6ZV8gPSBERUZBVUxUX0JVRkZFUl9TSVpFOworICAgIHdCdWZfLnJlc2V0KG5ldyB1aW50OF90W3dCdWZTaXplX10pOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworCisgICAgLy8gcmVzZXQgd0Jhc2VfIHdpdGggYSBwYWQgZm9yIHRoZSBmcmFtZSBzaXplCisgICAgaW50MzJfdCBwYWQgPSAwOworICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc2l6ZW9mKHBhZCk7CisgIH0KK30KKwordWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6d3JpdGVFbmQoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworfQorCitjb25zdCB1aW50OF90KiBURnJhbWVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgICh2b2lkKWxlbjsKKyAgLy8gRG9uJ3QgdHJ5IHRvIGJlIGNsZXZlciB3aXRoIHNoaWZ0aW5nIGJ1ZmZlcnMuCisgIC8vIElmIHRoZSBmYXN0IHBhdGggZmFpbGVkIGxldCB0aGUgcHJvdG9jb2wgdXNlIGl0cyBzbG93IHBhdGguCisgIC8vIEJlc2lkZXMsIHdobyBpcyBnb2luZyB0byB0cnkgdG8gYm9ycm93IGFjcm9zcyBtZXNzYWdlcz8KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3VpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7CisgIC8vIGluY2x1ZGUgZnJhbWluZyBieXRlcworICB1aW50MzJfdCBieXRlc19yZWFkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQnVmXy5nZXQoKSArIHNpemVvZih1aW50MzJfdCkpOworCisgIGlmIChyQnVmU2l6ZV8gPiBidWZSZWNsYWltVGhyZXNoXykgeworICAgIHJCdWZTaXplXyA9IDA7CisgICAgckJ1Zl8ucmVzZXQoKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pOworICB9CisKKyAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3ZvaWQgVE1lbW9yeUJ1ZmZlcjo6Y29tcHV0ZVJlYWQodWludDMyX3QgbGVuLCB1aW50OF90Kiogb3V0X3N0YXJ0LCB1aW50MzJfdCogb3V0X2dpdmUpIHsKKyAgLy8gQ29ycmVjdCByQm91bmRfIHNvIHdlIGNhbiB1c2UgdGhlIGZhc3QgcGF0aCBpbiB0aGUgZnV0dXJlLgorICByQm91bmRfID0gd0Jhc2VfOworCisgIC8vIERlY2lkZSBob3cgbXVjaCB0byBnaXZlLgorICB1aW50MzJfdCBnaXZlID0gKHN0ZDo6bWluKShsZW4sIGF2YWlsYWJsZV9yZWFkKCkpOworCisgICpvdXRfc3RhcnQgPSByQmFzZV87CisgICpvdXRfZ2l2ZSA9IGdpdmU7CisKKyAgLy8gUHJlaW5jcmVtZW50IHJCYXNlXyBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSB0by4KKyAgckJhc2VfICs9IGdpdmU7Cit9CisKK3VpbnQzMl90IFRNZW1vcnlCdWZmZXI6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQ4X3QqIHN0YXJ0OworICB1aW50MzJfdCBnaXZlOworICBjb21wdXRlUmVhZChsZW4sICZzdGFydCwgJmdpdmUpOworCisgIC8vIENvcHkgaW50byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICBtZW1jcHkoYnVmLCBzdGFydCwgZ2l2ZSk7CisKKyAgcmV0dXJuIGdpdmU7Cit9CisKK3VpbnQzMl90IFRNZW1vcnlCdWZmZXI6OnJlYWRBcHBlbmRUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCB1aW50MzJfdCBsZW4pIHsKKyAgLy8gRG9uJ3QgZ2V0IHNvbWUgc3R1cGlkIGFzc2VydGlvbiBmYWlsdXJlLgorICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50OF90KiBzdGFydDsKKyAgdWludDMyX3QgZ2l2ZTsKKyAgY29tcHV0ZVJlYWQobGVuLCAmc3RhcnQsICZnaXZlKTsKKworICAvLyBBcHBlbmQgdG8gdGhlIHByb3ZpZGVkIHN0cmluZy4KKyAgc3RyLmFwcGVuZCgoY2hhciopc3RhcnQsIGdpdmUpOworCisgIHJldHVybiBnaXZlOworfQorCit2b2lkIFRNZW1vcnlCdWZmZXI6OmVuc3VyZUNhbldyaXRlKHVpbnQzMl90IGxlbikgeworICAvLyBDaGVjayBhdmFpbGFibGUgc3BhY2UKKyAgdWludDMyX3QgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKTsKKyAgaWYgKGxlbiA8PSBhdmFpbCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghb3duZXJfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiSW5zdWZmaWNpZW50IHNwYWNlIGluIGV4dGVybmFsIE1lbW9yeUJ1ZmZlciIpOworICB9CisKKyAgLy8gR3JvdyB0aGUgYnVmZmVyIGFzIG5lY2Vzc2FyeS4KKyAgdWludDY0X3QgbmV3X3NpemUgPSBidWZmZXJTaXplXzsKKyAgd2hpbGUgKGxlbiA+IGF2YWlsKSB7CisgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA+IDAgPyBuZXdfc2l6ZSAqIDIgOiAxOworICAgIGlmIChuZXdfc2l6ZSA+IG1heEJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWwgYnVmZmVyIHNpemUgb3ZlcmZsb3ciKTsKKyAgICB9CisgICAgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKSArIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3X3NpemUpIC0gYnVmZmVyU2l6ZV8pOworICB9CisKKyAgLy8gQWxsb2NhdGUgaW50byBhIG5ldyBwb2ludGVyIHNvIHdlIGRvbid0IGJvcmsgb3VycyBpZiBpdCBmYWlscy4KKyAgdWludDhfdCogbmV3X2J1ZmZlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihzdGQ6OnJlYWxsb2MoYnVmZmVyXywgbmV3X3NpemUpKTsKKyAgaWYgKG5ld19idWZmZXIgPT0gTlVMTCkgeworICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgIH0KKworICByQmFzZV8gPSBuZXdfYnVmZmVyICsgKHJCYXNlXyAtIGJ1ZmZlcl8pOworICByQm91bmRfID0gbmV3X2J1ZmZlciArIChyQm91bmRfIC0gYnVmZmVyXyk7CisgIHdCYXNlXyA9IG5ld19idWZmZXIgKyAod0Jhc2VfIC0gYnVmZmVyXyk7CisgIHdCb3VuZF8gPSBuZXdfYnVmZmVyICsgbmV3X3NpemU7CisgIGJ1ZmZlcl8gPSBuZXdfYnVmZmVyOworICBidWZmZXJTaXplXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSk7Cit9CisKK3ZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGVuc3VyZUNhbldyaXRlKGxlbik7CisKKyAgLy8gQ29weSBpbnRvIHRoZSBidWZmZXIgYW5kIGluY3JlbWVudCB3QmFzZV8uCisgIG1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKKyAgd0Jhc2VfICs9IGxlbjsKK30KKwordm9pZCBUTWVtb3J5QnVmZmVyOjp3cm90ZUJ5dGVzKHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOworICBpZiAobGVuID4gYXZhaWwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDbGllbnQgd3JvdGUgbW9yZSBieXRlcyB0aGFuIHNpemUgb2YgYnVmZmVyLiIpOworICB9CisgIHdCYXNlXyArPSBsZW47Cit9CisKK2NvbnN0IHVpbnQ4X3QqIFRNZW1vcnlCdWZmZXI6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgckJvdW5kXyA9IHdCYXNlXzsKKyAgaWYgKGF2YWlsYWJsZV9yZWFkKCkgPj0gKmxlbikgeworICAgICpsZW4gPSBhdmFpbGFibGVfcmVhZCgpOworICAgIHJldHVybiByQmFzZV87CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIzZjljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCkBAIC0wLDAgKzEsNzQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8gMQorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgVERCX0xJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAxKSkKKyNkZWZpbmUgVERCX1VOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQorI2Vsc2UKKyNkZWZpbmUgVERCX0xJS0VMWSh2YWwpICh2YWwpCisjZGVmaW5lIFREQl9VTkxJS0VMWSh2YWwpICh2YWwpCisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0cmFuc3BvcnRzIHRoYXQgdXNlIHJlYWQvd3JpdGUgYnVmZmVycyBmb3IgcGVyZm9ybWFuY2UuCisgKgorICogVEJ1ZmZlckJhc2UgaXMgZGVzaWduZWQgdG8gaW1wbGVtZW50IHRoZSBmYXN0LXBhdGggIm1lbWNweSIgc3R5bGUKKyAqIG9wZXJhdGlvbnMgdGhhdCB3b3JrIGluIHRoZSBjb21tb24gY2FzZS4gIEl0IGRvZXMgc28gd2l0aCBzbWFsbCBhbmQKKyAqIChldmVudHVhbGx5KSBub252aXJ0dWFsLCBpbmxpbmFibGUgbWV0aG9kcy4gIFRCdWZmZXJCYXNlIGlzIGFuIGFic3RyYWN0CisgKiBjbGFzcy4gIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIGRlZmluZSB0aGUgInNsb3cgcGF0aCIgb3BlcmF0aW9ucworICogdGhhdCBoYXZlIHRvIGJlIGRvbmUgd2hlbiB0aGUgYnVmZmVycyBhcmUgZnVsbCBvciBlbXB0eS4KKyAqCisgKi8KK2NsYXNzIFRCdWZmZXJCYXNlIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRCdWZmZXJCYXNlPiB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIEZhc3QtcGF0aCByZWFkLgorICAgKgorICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGRhdGEgYnVmZmVyZWQgdG8gZnVsZmlsbCB0aGUgcmVhZCwgd2UgY2FuIHNhdGlzZnkgaXQKKyAgICogd2l0aCBhIHNpbmdsZSBtZW1jcHksIHRoZW4gYWRqdXN0IG91ciBpbnRlcm5hbCBwb2ludGVycy4gIElmIHRoZSBidWZmZXIKKyAgICogaXMgZW1wdHksIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAqIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGV2ZW50dWFsbHkgYmUgbm9udmlydHVhbCBhbmQgaW5saW5hYmxlLgorICAgKi8KKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHVpbnQ4X3QqIG5ld19yQmFzZSA9IHJCYXNlXyArIGxlbjsKKyAgICBpZiAoVERCX0xJS0VMWShuZXdfckJhc2UgPD0gckJvdW5kXykpIHsKKyAgICAgIHN0ZDo6bWVtY3B5KGJ1ZiwgckJhc2VfLCBsZW4pOworICAgICAgckJhc2VfID0gbmV3X3JCYXNlOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRTbG93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBTaG9ydGN1dHRlZCB2ZXJzaW9uIG9mIHJlYWRBbGwuCisgICAqLworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgdWludDhfdCogbmV3X3JCYXNlID0gckJhc2VfICsgbGVuOworICAgIGlmIChUREJfTElLRUxZKG5ld19yQmFzZSA8PSByQm91bmRfKSkgeworICAgICAgc3RkOjptZW1jcHkoYnVmLCByQmFzZV8sIGxlbik7CisgICAgICByQmFzZV8gPSBuZXdfckJhc2U7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgICByZXR1cm4gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6cmVhZEFsbCgqdGhpcywgYnVmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIEZhc3QtcGF0aCB3cml0ZS4KKyAgICoKKyAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBlbXB0eSBzcGFjZSBpbiBvdXIgYnVmZmVyIHRvIGFjY29tbW9kYXRlIHRoZSB3cml0ZSwgd2UKKyAgICogY2FuIHNhdGlzZnkgaXQgd2l0aCBhIHNpbmdsZSBtZW1jcHksIHRoZW4gYWRqdXN0IG91ciBpbnRlcm5hbCBwb2ludGVycy4KKyAgICogSWYgdGhlIGJ1ZmZlciBpcyBmdWxsLCB3ZSBjYWxsIG91dCB0byBvdXIgc2xvdyBwYXRoLCBpbXBsZW1lbnRlZCBieSBhCisgICAqIHN1YmNsYXNzLiAgVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gZXZlbnR1YWxseSBiZSBub252aXJ0dWFsIGFuZAorICAgKiBpbmxpbmFibGUuCisgICAqLworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgdWludDhfdCogbmV3X3dCYXNlID0gd0Jhc2VfICsgbGVuOworICAgIGlmIChUREJfTElLRUxZKG5ld193QmFzZSA8PSB3Qm91bmRfKSkgeworICAgICAgc3RkOjptZW1jcHkod0Jhc2VfLCBidWYsIGxlbik7CisgICAgICB3QmFzZV8gPSBuZXdfd0Jhc2U7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHdyaXRlU2xvdyhidWYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogRmFzdC1wYXRoIGJvcnJvdy4gIEEgbG90IGxpa2UgdGhlIGZhc3QtcGF0aCByZWFkLgorICAgKi8KKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAgIGlmIChUREJfTElLRUxZKHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oKmxlbikgPD0gckJvdW5kXyAtIHJCYXNlXykpIHsKKyAgICAgIC8vIFdpdGggc3RyaWN0IGFsaWFzaW5nLCB3cml0aW5nIHRvIGxlbiBzaG91bGRuJ3QgZm9yY2UgdXMgdG8KKyAgICAgIC8vIHJlZmV0Y2ggckJhc2VfIGZyb20gbWVtb3J5LiAgVE9ETyhkcmVpc3MpOiBWZXJpZnkgdGhpcy4KKyAgICAgICpsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CisgICAgICByZXR1cm4gckJhc2VfOworICAgIH0KKyAgICByZXR1cm4gYm9ycm93U2xvdyhidWYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogQ29uc3VtZSBkb2Vzbid0IHJlcXVpcmUgYSBzbG93IHBhdGguCisgICAqLworICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7CisgICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pIDw9IHJCb3VuZF8gLSByQmFzZV8pKSB7CisgICAgICByQmFzZV8gKz0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gU2xvdyBwYXRoIHJlYWQuCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKKworICAvLy8gU2xvdyBwYXRoIHdyaXRlLgorICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CisKKyAgLyoqCisgICAqIFNsb3cgcGF0aCBib3Jyb3cuCisgICAqCisgICAqIFBPU1RDT05ESVRJT046IHJldHVybiA9PSBOVUxMIHx8IHJCb3VuZF8gLSByQmFzZV8gPj0gKmxlbgorICAgKi8KKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgPSAwOworCisgIC8qKgorICAgKiBUcml2aWFsIGNvbnN0cnVjdG9yLgorICAgKgorICAgKiBJbml0aWFsaXplIHBvaW50ZXJzIHNhZmVseS4gIENvbnN0cnVjdGluZyBpcyBub3QgYSB2ZXJ5CisgICAqIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBvcGVyYXRpb24sIHNvIGl0IGlzIG9rYXkgdG8ganVzdCBsZWF2ZSBpdCB0bworICAgKiB0aGUgY29uY3JldGUgY2xhc3MgdG8gc2V0IHVwIHBvaW50ZXJzIGNvcnJlY3RseS4KKyAgICovCisgIFRCdWZmZXJCYXNlKCkgOiByQmFzZV8oTlVMTCksIHJCb3VuZF8oTlVMTCksIHdCYXNlXyhOVUxMKSwgd0JvdW5kXyhOVUxMKSB7fQorCisgIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSByZWFkIGJ1ZmZlci4KKyAgdm9pZCBzZXRSZWFkQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgckJhc2VfID0gYnVmOworICAgIHJCb3VuZF8gPSBidWYgKyBsZW47CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgd3JpdGUgYnVmZmVyLgorICB2b2lkIHNldFdyaXRlQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgd0Jhc2VfID0gYnVmOworICAgIHdCb3VuZF8gPSBidWYgKyBsZW47CisgIH0KKworICB2aXJ0dWFsIH5UQnVmZmVyQmFzZSgpIHt9CisKKyAgLy8vIFJlYWRzIGJlZ2luIGhlcmUuCisgIHVpbnQ4X3QqIHJCYXNlXzsKKyAgLy8vIFJlYWRzIG1heSBleHRlbmQgdG8ganVzdCBiZWZvcmUgaGVyZS4KKyAgdWludDhfdCogckJvdW5kXzsKKworICAvLy8gV3JpdGVzIGJlZ2luIGhlcmUuCisgIHVpbnQ4X3QqIHdCYXNlXzsKKyAgLy8vIFdyaXRlcyBtYXkgZXh0ZW5kIHRvIGp1c3QgYmVmb3JlIGhlcmUuCisgIHVpbnQ4X3QqIHdCb3VuZF87Cit9OworCisvKioKKyAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gRm9yIHJlYWRzIGl0IHdpbGwgcmVhZCBtb3JlIGRhdGEgdGhhbiBpcyByZXF1ZXN0ZWQKKyAqIGFuZCB3aWxsIHNlcnZlIGZ1dHVyZSBkYXRhIG91dCBvZiBhIGxvY2FsIGJ1ZmZlci4gRm9yIHdyaXRlcywgZGF0YSBpcworICogc3RvcmVkIHRvIGFuIGluIG1lbW9yeSBidWZmZXIgYmVmb3JlIGJlaW5nIHdyaXR0ZW4gb3V0LgorICoKKyAqLworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRCdWZmZXJlZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOworCisgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICAvLy8gVXNlIHNwZWNpZmllZCBidWZmZXIgc2l6ZXMuCisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCBzeikKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHJCdWZTaXplXyhzeiksCisgICAgICB3QnVmU2l6ZV8oc3opLAorICAgICAgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICAvLy8gVXNlIHNwZWNpZmllZCByZWFkIGFuZCB3cml0ZSBidWZmZXIgc2l6ZXMuCisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCByc3osIHVpbnQzMl90IHdzeikKKyAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHJCdWZTaXplXyhyc3opLAorICAgICAgd0J1ZlNpemVfKHdzeiksCisgICAgICByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsKKyAgICBpZiAockJhc2VfID09IHJCb3VuZF8pIHsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHRyYW5zcG9ydF8tPnJlYWQockJ1Zl8uZ2V0KCksIHJCdWZTaXplXykpOworICAgIH0KKyAgICByZXR1cm4gKHJCb3VuZF8gPiByQmFzZV8pOworICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBmbHVzaCgpOworICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIGZsdXNoKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG9yaWdpbiBvZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICovCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Z2V0T3JpZ2luKCk7IH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBiZWhhdmlvciBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgKiBidXQgdGhhdCBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb246CisgICAqIDEvIElmIGxlbiBpcyBhdCBtb3N0IHJCdWZTaXplXywgYm9ycm93IHdpbGwgbmV2ZXIgcmV0dXJuIE5VTEwuCisgICAqICAgIERlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIGl0IGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbgorICAgKiAgICBvciBoYW5nIGZvcmV2ZXIuCisgICAqIDIvIFNvbWUgYm9ycm93IHJlcXVlc3RzIG1heSBjb3B5IGJ5dGVzIGludGVybmFsbHkuICBIb3dldmVyLAorICAgKiAgICBpZiBsZW4gaXMgYXQgbW9zdCByQnVmU2l6ZV8vMiwgbm9uZSBvZiB0aGUgY29waWVkIGJ5dGVzCisgICAqICAgIHdpbGwgZXZlciBoYXZlIHRvIGJlIGNvcGllZCBhZ2Fpbi4gIEZvciBvcHRpbWlhbCBwZXJmb3JtYW5jZSwKKyAgICogICAgc3RheSB1bmRlciB0aGlzIGxpbWl0LgorICAgKi8KKyAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKKyAgLyoKKyAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KKyAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZiwgbGVuKTsgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgaW5pdFBvaW50ZXJzKCkgeworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDApOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworICAgIC8vIFdyaXRlIHNpemUgbmV2ZXIgY2hhbmdlcy4KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworCisgIHVpbnQzMl90IHJCdWZTaXplXzsKKyAgdWludDMyX3Qgd0J1ZlNpemVfOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHJCdWZfOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHdCdWZfOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgorICoKKyAqLworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307CisKKy8qKgorICogRnJhbWVkIHRyYW5zcG9ydC4gQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMKKyAqIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlCisgKiBiaW5hcnkgY2h1bmsgZm9sbG93ZWQgYnkgdGhlIGRhdGEgcGF5bG9hZC4gVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIG9uIHRoZQorICogb3RoZXIgZW5kIHRvIGFsd2F5cyBkbyBmaXhlZC1sZW5ndGggcmVhZHMuCisgKgorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRGcmFtZWRUcmFuc3BvcnQsIFRCdWZmZXJCYXNlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX01BWF9GUkFNRV9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7CisKKyAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KKyAgVEZyYW1lZFRyYW5zcG9ydCgpCisgICAgOiB0cmFuc3BvcnRfKCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKDApLAorICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpLAorICAgICAgbWF4RnJhbWVTaXplXyhERUZBVUxUX01BWF9GUkFNRV9TSVpFKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3osCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmUmVjbGFpbVRocmVzaCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKDApLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHJCdWZfKCksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSwKKyAgICAgIGJ1ZlJlY2xhaW1UaHJlc2hfKGJ1ZlJlY2xhaW1UaHJlc2gpLAorICAgICAgbWF4RnJhbWVTaXplXyhERUZBVUxUX01BWF9GUkFNRV9TSVpFKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKworICBib29sIHBlZWsoKSB7IHJldHVybiAockJhc2VfIDwgckJvdW5kXykgfHwgdHJhbnNwb3J0Xy0+cGVlaygpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBmbHVzaCgpOworICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKworICB1aW50MzJfdCByZWFkRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVFbmQoKTsKKworICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKKyAgLyoKKyAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KKyAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KKyAgICovCisgIHVzaW5nIFRCdWZmZXJCYXNlOjpyZWFkQWxsOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBmcmFtZSBhdCByZWFkCisgICAqLworICB2b2lkIHNldE1heEZyYW1lU2l6ZSh1aW50MzJfdCBtYXhGcmFtZVNpemUpIHsgbWF4RnJhbWVTaXplXyA9IG1heEZyYW1lU2l6ZTsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZnJhbWUgYXQgcmVhZAorICAgKi8KKyAgdWludDMyX3QgZ2V0TWF4RnJhbWVTaXplKCkgeyByZXR1cm4gbWF4RnJhbWVTaXplXzsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBSZWFkcyBhIGZyYW1lIG9mIGlucHV0IGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgKgorICAgKiBSZXR1cm5zIHRydWUgaWYgYSBmcmFtZSB3YXMgcmVhZCBzdWNjZXNzZnVsbHksIG9yIGZhbHNlIG9uIEVPRi4KKyAgICogKFJhaXNlcyBhIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgRU9GIG9jY3VycyBhZnRlciBhIHBhcnRpYWwgZnJhbWUuKQorICAgKi8KKyAgdmlydHVhbCBib29sIHJlYWRGcmFtZSgpOworCisgIHZvaWQgaW5pdFBvaW50ZXJzKCkgeworICAgIHNldFJlYWRCdWZmZXIoTlVMTCwgMCk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisKKyAgICAvLyBQYWQgdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gaW5zZXJ0IHRoZSBzaXplIGxhdGVyLgorICAgIGludDMyX3QgcGFkID0gMDsKKyAgICB0aGlzLT53cml0ZSgodWludDhfdCopJnBhZCwgc2l6ZW9mKHBhZCkpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisKKyAgdWludDMyX3QgckJ1ZlNpemVfOworICB1aW50MzJfdCB3QnVmU2l6ZV87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gckJ1Zl87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gd0J1Zl87CisgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2hfOworICB1aW50MzJfdCBtYXhGcmFtZVNpemVfOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgZnJhbWVkIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgZnJhbWVkIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307CisKKy8qKgorICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgorICogaW4gbWVtb3J5IGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5IHBsYWNlZAorICogaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdCBidWZmZXIuCisgKgorICogVGhlIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCB1c2luZyBDIGNvbnN0cnVjdHMgbWFsbG9jLHJlYWxsb2MsIGFuZCB0aGUgc2l6ZQorICogZG91YmxlcyBhcyBuZWNlc3NhcnkuICBXZSd2ZSBjb25zaWRlcmVkIHVzaW5nIHNjb3BlZAorICoKKyAqLworY2xhc3MgVE1lbW9yeUJ1ZmZlciA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUTWVtb3J5QnVmZmVyLCBUQnVmZmVyQmFzZT4geworcHJpdmF0ZToKKyAgLy8gQ29tbW9uIGluaXRpYWxpemF0aW9uIGRvbmUgYnkgYWxsIGNvbnN0cnVjdG9ycy4KKyAgdm9pZCBpbml0Q29tbW9uKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc2l6ZSwgYm9vbCBvd25lciwgdWludDMyX3Qgd1BvcykgeworCisgICAgbWF4QnVmZmVyU2l6ZV8gPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKTsKKworICAgIGlmIChidWYgPT0gTlVMTCAmJiBzaXplICE9IDApIHsKKyAgICAgIGFzc2VydChvd25lcik7CisgICAgICBidWYgPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZSk7CisgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKwl0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgIH0KKworICAgIGJ1ZmZlcl8gPSBidWY7CisgICAgYnVmZmVyU2l6ZV8gPSBzaXplOworCisgICAgckJhc2VfID0gYnVmZmVyXzsKKyAgICByQm91bmRfID0gYnVmZmVyXyArIHdQb3M7CisgICAgLy8gVE9ETyhkcmVpc3MpOiBJbnZlc3RpZ2F0ZSBOVUxMLWluZyB0aGlzIGlmICFvd25lci4KKyAgICB3QmFzZV8gPSBidWZmZXJfICsgd1BvczsKKyAgICB3Qm91bmRfID0gYnVmZmVyXyArIGJ1ZmZlclNpemVfOworCisgICAgb3duZXJfID0gb3duZXI7CisKKyAgICAvLyByQm91bmRfIGlzIHJlYWxseSBhbiBhcnRpZmFjdC4gIEluIHByaW5jaXBsZSwgaXQgc2hvdWxkIGFsd2F5cyBiZQorICAgIC8vIGVxdWFsIHRvIHdCYXNlXy4gIFdlIHVwZGF0ZSBpdCBpbiBhIGZldyBwbGFjZXMgKGNvbXB1dGVSZWFkLCBldGMuKS4KKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBkZWZhdWx0U2l6ZSA9IDEwMjQ7CisKKyAgLyoqCisgICAqIFRoaXMgZW51bSBzcGVjaWZpZXMgaG93IGEgVE1lbW9yeUJ1ZmZlciBzaG91bGQgdHJlYXQKKyAgICogbWVtb3J5IHBhc3NlZCB0byBpdCB2aWEgY29uc3RydWN0b3JzIG9yIHJlc2V0QnVmZmVyLgorICAgKgorICAgKiBPQlNFUlZFOgorICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBzaW1wbHkgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkuCisgICAqICAgSXQgaXMgdGhlIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIHBvaW50ZXIKKyAgICogICByZW1haW5zIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIFRNZW1vcnlCdWZmZXIsCisgICAqICAgYW5kIHRoYXQgaXQgaXMgcHJvcGVybHkgY2xlYW5lZCB1cC4KKyAgICogICBOb3RlIHRoYXQgbm8gZGF0YSBjYW4gYmUgd3JpdHRlbiB0byBvYnNlcnZlZCBidWZmZXJzLgorICAgKgorICAgKiBDT1BZOgorICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBtYWtlIGFuIGludGVybmFsIGNvcHkgb2YgdGhlIGJ1ZmZlci4KKyAgICogICBUaGUgY2FsbGVyIGhhcyBubyByZXNwb25zaWJpbGl0aWVzLgorICAgKgorICAgKiBUQUtFX09XTkVSU0hJUDoKKyAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgYmVjb21lIHRoZSAib3duZXIiIG9mIHRoZSBidWZmZXIsCisgICAqICAgYW5kIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQuCisgICAqICAgVGhlIG1lbWJvcnkgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggbWFsbG9jLgorICAgKi8KKyAgZW51bSBNZW1vcnlQb2xpY3kgeyBPQlNFUlZFID0gMSwgQ09QWSA9IDIsIFRBS0VfT1dORVJTSElQID0gMyB9OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBkZWZhdWx0LXNpemVkIGJ1ZmZlciwKKyAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgorICAgKi8KKyAgVE1lbW9yeUJ1ZmZlcigpIHsgaW5pdENvbW1vbihOVUxMLCBkZWZhdWx0U2l6ZSwgdHJ1ZSwgMCk7IH0KKworICAvKioKKyAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGEgYnVmZmVyIG9mIGEgc3BlY2lmaWVkIHNpemUsCisgICAqIG93bmVkIGJ5IHRoZSBUTWVtb3J5QnVmZmVyIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtIHN6ICBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIuCisgICAqLworICBUTWVtb3J5QnVmZmVyKHVpbnQzMl90IHN6KSB7IGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOyB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBidWYgYXMgaXRzIGluaXRpYWwgY29udGVudHMuCisgICAqCisgICAqIEBwYXJhbSBidWYgICAgVGhlIGluaXRpYWwgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KKyAgICogICAgICAgICAgICAgICBOb3RlIHRoYXQsIHdoaWxlIGJ1ZiBpcyBhIG5vbi1jb25zdCBwb2ludGVyLAorICAgKiAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIgd2lsbCBub3Qgd3JpdGUgdG8gaXQgaWYgcG9saWN5ID09IE9CU0VSVkUsCisgICAqICAgICAgICAgICAgICAgc28gaXQgaXMgc2FmZSB0byBjb25zdF9jYXN0PHVpbnQ4X3QqPih3aGF0ZXZlcikuCisgICAqIEBwYXJhbSBzeiAgICAgVGhlIHNpemUgb2YgQGMgYnVmLgorICAgKiBAcGFyYW0gcG9saWN5IFNlZSBAbGluayBNZW1vcnlQb2xpY3kgQGVuZGxpbmsgLgorICAgKi8KKyAgVE1lbW9yeUJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IHN6LCBNZW1vcnlQb2xpY3kgcG9saWN5ID0gT0JTRVJWRSkgeworICAgIGlmIChidWYgPT0gTlVMTCAmJiBzeiAhPSAwKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE1lbW9yeUJ1ZmZlciBnaXZlbiBudWxsIGJ1ZmZlciB3aXRoIG5vbi16ZXJvIHNpemUuIik7CisgICAgfQorCisgICAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICBjYXNlIE9CU0VSVkU6CisgICAgY2FzZSBUQUtFX09XTkVSU0hJUDoKKyAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPUFk6CisgICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKKyAgICAgIHRoaXMtPndyaXRlKGJ1Ziwgc3opOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE1lbW9yeVBvbGljeSBmb3IgVE1lbW9yeUJ1ZmZlciIpOworICAgIH0KKyAgfQorCisgIH5UTWVtb3J5QnVmZmVyKCkgeworICAgIGlmIChvd25lcl8pIHsKKyAgICAgIHN0ZDo6ZnJlZShidWZmZXJfKTsKKyAgICB9CisgIH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIHBlZWsoKSB7IHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsgfQorCisgIHZvaWQgb3BlbigpIHt9CisKKyAgdm9pZCBjbG9zZSgpIHt9CisKKyAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIGJ1ZlB0ciBjb25zdC4KKyAgdm9pZCBnZXRCdWZmZXIodWludDhfdCoqIGJ1ZlB0ciwgdWludDMyX3QqIHN6KSB7CisgICAgKmJ1ZlB0ciA9IHJCYXNlXzsKKyAgICAqc3ogPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gckJhc2VfKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldEJ1ZmZlckFzU3RyaW5nKCkgeworICAgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgdWludDhfdCogYnVmOworICAgIHVpbnQzMl90IHN6OworICAgIGdldEJ1ZmZlcigmYnVmLCAmc3opOworICAgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSlzeik7CisgIH0KKworICB2b2lkIGFwcGVuZEJ1ZmZlclRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ4X3QqIGJ1ZjsKKyAgICB1aW50MzJfdCBzejsKKyAgICBnZXRCdWZmZXIoJmJ1ZiwgJnN6KTsKKyAgICBzdHIuYXBwZW5kKChjaGFyKilidWYsIHN6KTsKKyAgfQorCisgIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisgICAgckJhc2VfID0gYnVmZmVyXzsKKyAgICByQm91bmRfID0gYnVmZmVyXzsKKyAgICB3QmFzZV8gPSBidWZmZXJfOworICAgIC8vIEl0IGlzbid0IHNhZmUgdG8gd3JpdGUgaW50byBhIGJ1ZmZlciB3ZSBkb24ndCBvd24uCisgICAgaWYgKCFvd25lcl8pIHsKKyAgICAgIHdCb3VuZF8gPSB3QmFzZV87CisgICAgICBidWZmZXJTaXplXyA9IDA7CisgICAgfQorICB9CisKKyAgLy8vIFNlZSBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uLgorICB2b2lkIHJlc2V0QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc3osIE1lbW9yeVBvbGljeSBwb2xpY3kgPSBPQlNFUlZFKSB7CisgICAgLy8gVXNlIGEgdmFyaWFudCBvZiB0aGUgY29weS1hbmQtc3dhcCB0cmljayBmb3IgYXNzaWdubWVudCBvcGVyYXRvcnMuCisgICAgLy8gVGhpcyBpcyBzdWItb3B0aW1hbCBpbiB0ZXJtcyBvZiBwZXJmb3JtYW5jZSBmb3IgdHdvIHJlYXNvbnM6CisgICAgLy8gICAxLyBUaGUgY29uc3RydWN0aW5nIGFuZCBzd2FwcGluZyBvZiB0aGUgKHNtYWxsKSB2YWx1ZXMKKyAgICAvLyAgICAgIGluIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0IHRha2VzIHNvbWUgdGltZSwgYW5kIGlzIG5vdCBuZWNlc3NhcnkuCisgICAgLy8gICAyLyBJZiBwb2xpY3kgPT0gQ09QWSwgd2UgYWxsb2NhdGUgdGhlIG5ldyBidWZmZXIgYmVmb3JlCisgICAgLy8gICAgICBmcmVlaW5nIHRoZSBvbGQgb25lLCBwcmVjbHVkaW5nIHRoZSBwb3NzaWJpbGl0eSBvZgorICAgIC8vICAgICAgcmV1c2luZyB0aGF0IG1lbW9yeS4KKyAgICAvLyBJIGRvdWJ0IHRoYXQgZWl0aGVyIG9mIHRoZXNlIHByb2JsZW1zIGNvdWxkIGJlIG9wdGltaXplZCBhd2F5LAorICAgIC8vIGJ1dCB0aGUgc2Vjb25kIGlzIHByb2JhYmx5IG5vIGEgY29tbW9uIGNhc2UsIGFuZCB0aGUgZmlyc3QgaXMgbWlub3IuCisgICAgLy8gSSBkb24ndCBleHBlY3QgcmVzZXRCdWZmZXIgdG8gYmUgYSBjb21tb24gb3BlcmF0aW9uLCBzbyBJJ20gd2lsbGluZyB0bworICAgIC8vIGJpdGUgdGhlIHBlcmZvcm1hbmNlIGJ1bGxldCB0byBtYWtlIHRoZSBtZXRob2QgdGhpcyBzaW1wbGUuCisKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIG5ldyBidWZmZXIuCisgICAgVE1lbW9yeUJ1ZmZlciBuZXdfYnVmZmVyKGJ1Ziwgc3osIHBvbGljeSk7CisgICAgLy8gTW92ZSBpdCBpbnRvIG91cnNlbGYuCisgICAgdGhpcy0+c3dhcChuZXdfYnVmZmVyKTsKKyAgICAvLyBPdXIgb2xkIHNlbGYgZ2V0cyBkZXN0cm95ZWQuCisgIH0KKworICAvLy8gU2VlIGNvbnN0cnVjdG9yIGRvY3VtZW50YXRpb24uCisgIHZvaWQgcmVzZXRCdWZmZXIodWludDMyX3Qgc3opIHsKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIG5ldyBidWZmZXIuCisgICAgVE1lbW9yeUJ1ZmZlciBuZXdfYnVmZmVyKHN6KTsKKyAgICAvLyBNb3ZlIGl0IGludG8gb3Vyc2VsZi4KKyAgICB0aGlzLT5zd2FwKG5ld19idWZmZXIpOworICAgIC8vIE91ciBvbGQgc2VsZiBnZXRzIGRlc3Ryb3llZC4KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlYWRBc1N0cmluZyh1aW50MzJfdCBsZW4pIHsKKyAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgKHZvaWQpcmVhZEFwcGVuZFRvU3RyaW5nKHN0ciwgbGVuKTsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgdWludDMyX3QgcmVhZEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQzMl90IGxlbik7CisKKyAgLy8gcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkCisgIHVpbnQzMl90IHJlYWRFbmQoKSB7CisgICAgLy8gVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICB1aW50MzJfdCBieXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQmFzZV8gLSBidWZmZXJfKTsKKyAgICBpZiAockJhc2VfID09IHdCYXNlXykgeworICAgICAgcmVzZXRCdWZmZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgLy8gUmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuCisgIHVpbnQzMl90IHdyaXRlRW5kKCkgeworICAgIC8vIFRoaXMgY2FzdCBzaG91bGQgYmUgc2FmZSwgYmVjYXVzZSBidWZmZXJfJ3Mgc2l6ZSBpcyBhIHVpbnQzMl90CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSBidWZmZXJfKTsKKyAgfQorCisgIHVpbnQzMl90IGF2YWlsYWJsZV9yZWFkKCkgY29uc3QgeworICAgIC8vIFJlbWVtYmVyLCB3QmFzZV8gaXMgdGhlIHJlYWwgckJvdW5kXy4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHJCYXNlXyk7CisgIH0KKworICB1aW50MzJfdCBhdmFpbGFibGVfd3JpdGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7IH0KKworICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgY2xpZW50IGNhbiB3cml0ZSBkYXRhIHRvIGFwcGVuZCB0bworICAvLyB0aGUgVE1lbW9yeUJ1ZmZlciwgYW5kIGVuc3VyZXMgdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGEKKyAgLy8gd3JpdGUgb2YgdGhlIHByb3ZpZGVkIGxlbmd0aC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHZlcnkgY29udmVuaWVudCBmb3IKKyAgLy8gcGFzc2luZyB0byByZWFkKCksIHJlY3YoKSwgb3Igc2ltaWxhci4gWW91IG11c3QgY2FsbCB3cm90ZUJ5dGVzKCkgYXMgc29vbgorICAvLyBhcyBkYXRhIGlzIHdyaXR0ZW4gb3IgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBhd2FyZSB0aGF0IGRhdGEgaGFzIGNoYW5nZWQuCisgIHVpbnQ4X3QqIGdldFdyaXRlUHRyKHVpbnQzMl90IGxlbikgeworICAgIGVuc3VyZUNhbldyaXRlKGxlbik7CisgICAgcmV0dXJuIHdCYXNlXzsKKyAgfQorCisgIC8vIEluZm9ybXMgdGhlIGJ1ZmZlciB0aGF0IHRoZSBjbGllbnQgaGFzIHdyaXR0ZW4gJ2xlbicgYnl0ZXMgaW50byBzdG9yYWdlCisgIC8vIHRoYXQgaGFkIGJlZW4gcHJvdmlkZWQgYnkgZ2V0V3JpdGVQdHIoKS4KKyAgdm9pZCB3cm90ZUJ5dGVzKHVpbnQzMl90IGxlbik7CisKKyAgLyoKKyAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KKyAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZiwgbGVuKTsgfQorCisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIC8vISBccmV0dXJucyB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBnZXRCdWZmZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBidWZmZXJTaXplXzsKKyAgfQorCisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgdWludDMyX3QgZ2V0TWF4QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4QnVmZmVyU2l6ZV87CisgIH0KKworICAvLyEgXGJyaWVmIENoYW5nZSB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHBhcmFtW2luXSAgbWF4U2l6ZSAgdGhlIG5ldyBtYXhpbXVtIGJ1ZmZlciBzaXplIGFsbG93ZWQgdG8gZ3JvdyB0bworICAvLyEgXHRocm93cyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihCQURfQVJHUykgaWYgbWF4U2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgdm9pZCBzZXRNYXhCdWZmZXJTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBpZiAobWF4U2l6ZSA8IGJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSBidWZmZXIgc2l6ZSB3b3VsZCBiZSBsZXNzIHRoYW4gY3VycmVudCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgICBtYXhCdWZmZXJTaXplXyA9IG1heFNpemU7CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICBzd2FwKGJ1ZmZlcl8sIHRoYXQuYnVmZmVyXyk7CisgICAgc3dhcChidWZmZXJTaXplXywgdGhhdC5idWZmZXJTaXplXyk7CisKKyAgICBzd2FwKHJCYXNlXywgdGhhdC5yQmFzZV8pOworICAgIHN3YXAockJvdW5kXywgdGhhdC5yQm91bmRfKTsKKyAgICBzd2FwKHdCYXNlXywgdGhhdC53QmFzZV8pOworICAgIHN3YXAod0JvdW5kXywgdGhhdC53Qm91bmRfKTsKKworICAgIHN3YXAob3duZXJfLCB0aGF0Lm93bmVyXyk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhlcmUncyBhdCBsZWFzdCAnbGVuJyBieXRlcyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCisgIHZvaWQgZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKTsKKworICAvLyBDb21wdXRlIHRoZSBwb3NpdGlvbiBhbmQgYXZhaWxhYmxlIGRhdGEgZm9yIHJlYWRpbmcuCisgIHZvaWQgY29tcHV0ZVJlYWQodWludDMyX3QgbGVuLCB1aW50OF90Kiogb3V0X3N0YXJ0LCB1aW50MzJfdCogb3V0X2dpdmUpOworCisgIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOworCisgIC8vIERhdGEgYnVmZmVyCisgIHVpbnQ4X3QqIGJ1ZmZlcl87CisKKyAgLy8gQWxsb2NhdGVkIGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGJ1ZmZlclNpemVfOworCisgIC8vIE1heGltdW0gYWxsb3dlZCBzaXplCisgIHVpbnQzMl90IG1heEJ1ZmZlclNpemVfOworCisgIC8vIElzIHRoaXMgb2JqZWN0IHRoZSBvd25lciBvZiB0aGUgYnVmZmVyPworICBib29sIG93bmVyXzsKKworICAvLyBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIGNvbnN0cmN0b3JzLCBpbml0Q29tbW9uLCBhbmQgc3dhcCBpZgorICAvLyB5b3UgYWRkIG5ldyBtZW1iZXJzLgorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGQxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3ZvaWQgVEZEVHJhbnNwb3J0OjpjbG9zZSgpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGludCBydiA9IDo6VEhSSUZUX0NMT1NFKGZkXyk7CisgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICBmZF8gPSAtMTsKKyAgLy8gSGF2ZSB0byBjaGVjayB1bmNhdWdodF9leGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKyAgaWYgKHJ2IDwgMCAmJiAhc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRGRFRyYW5zcG9ydDo6Y2xvc2UoKSIsIGVycm5vX2NvcHkpOworICB9Cit9CisKK3VpbnQzMl90IFRGRFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1bnNpZ25lZCBpbnQgbWF4UmV0cmllcyA9IDU7IC8vIHNhbWUgYXMgdGhlIFRTb2NrZXQgZGVmYXVsdAorICB1bnNpZ25lZCBpbnQgcmV0cmllcyA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgVEhSSUZUX1NTSVpFVCBydiA9IDo6VEhSSUZUX1JFQUQoZmRfLCBidWYsIGxlbik7CisgICAgaWYgKHJ2IDwgMCkgeworICAgICAgaWYgKFRIUklGVF9FUlJOTyA9PSBUSFJJRlRfRUlOVFIgJiYgcmV0cmllcyA8IG1heFJldHJpZXMpIHsKKyAgICAgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgorICAgICAgICArK3JldHJpZXM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OnJlYWQoKSIsIGVycm5vX2NvcHkpOworICAgIH0KKyAgICAvLyB0aGlzIHNob3VsZCBiZSBmaW5lLCBzaW5jZSB3ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcywKKyAgICAvLyBhbmQgOjpyZWFkIHNob3VsZCBvbmx5IHJldHVybiBhIDMyLWJpdCB2YWx1ZSBzaW5jZSBsZW4gaXMgMzItYml0LgorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocnYpOworICB9Cit9CisKK3ZvaWQgVEZEVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB3aGlsZSAobGVuID4gMCkgeworICAgIFRIUklGVF9TU0laRVQgcnYgPSA6OlRIUklGVF9XUklURShmZF8sIGJ1ZiwgbGVuKTsKKworICAgIGlmIChydiA8IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZEVHJhbnNwb3J0Ojp3cml0ZSgpIiwgZXJybm9fY29weSk7CisgICAgfSBlbHNlIGlmIChydiA9PSAwKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiVEZEVHJhbnNwb3J0Ojp3cml0ZSgpIik7CisgICAgfQorCisgICAgYnVmICs9IHJ2OworICAgIC8vIHRoaXMgc2hvdWxkIGJlIGZpbmUsIGFzIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgbmVnYXRpdmUgdmFsdWVzLCBhbmQKKyAgICAvLzo6d3JpdGUgc2hvdWxkbid0IHJldHVybiBtb3JlIHRoYW4gYSB1aW50MzJfdCBzaW5jZSBsZW4gaXMgYSB1aW50MzJfdAorICAgIGxlbiAtPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocnYpOworICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTNkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEZEVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBEZWFkLXNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKi8KK2NsYXNzIFRGRFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxURkRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgZW51bSBDbG9zZVBvbGljeSB7IE5PX0NMT1NFX09OX0RFU1RST1kgPSAwLCBDTE9TRV9PTl9ERVNUUk9ZID0gMSB9OworCisgIFRGRFRyYW5zcG9ydChpbnQgZmQsIENsb3NlUG9saWN5IGNsb3NlX3BvbGljeSA9IE5PX0NMT1NFX09OX0RFU1RST1kpCisgICAgOiBmZF8oZmQpLCBjbG9zZV9wb2xpY3lfKGNsb3NlX3BvbGljeSkge30KKworICB+VEZEVHJhbnNwb3J0KCkgeworICAgIGlmIChjbG9zZV9wb2xpY3lfID09IENMT1NFX09OX0RFU1RST1kpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ+VEZEVHJhbnNwb3J0IFRUcmFuc3BvcnRFeGNlcHRpb246ICclcyciLCBleC53aGF0KCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gZmRfID49IDA7IH0KKworICB2b2lkIG9wZW4oKSB7fQorCisgIHZvaWQgY2xvc2UoKTsKKworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIHNldEZEKGludCBmZCkgeyBmZF8gPSBmZDsgfQorICBpbnQgZ2V0RkQoKSB7IHJldHVybiBmZF87IH0KKworcHJvdGVjdGVkOgorICBpbnQgZmRfOworICBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3lfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiNDQxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsMTA4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaD4KKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmNlcnI7Cit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitURmlsZVRyYW5zcG9ydDo6VEZpbGVUcmFuc3BvcnQoc3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHkpCisgIDogcmVhZFN0YXRlXygpLAorICAgIHJlYWRCdWZmXyhOVUxMKSwKKyAgICBjdXJyZW50RXZlbnRfKE5VTEwpLAorICAgIHJlYWRCdWZmU2l6ZV8oREVGQVVMVF9SRUFEX0JVRkZfU0laRSksCisgICAgcmVhZFRpbWVvdXRfKE5PX1RBSUxfUkVBRF9USU1FT1VUKSwKKyAgICBjaHVua1NpemVfKERFRkFVTFRfQ0hVTktfU0laRSksCisgICAgZXZlbnRCdWZmZXJTaXplXyhERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFKSwKKyAgICBmbHVzaE1heFVzXyhERUZBVUxUX0ZMVVNIX01BWF9VUyksCisgICAgZmx1c2hNYXhCeXRlc18oREVGQVVMVF9GTFVTSF9NQVhfQllURVMpLAorICAgIG1heEV2ZW50U2l6ZV8oREVGQVVMVF9NQVhfRVZFTlRfU0laRSksCisgICAgbWF4Q29ycnVwdGVkRXZlbnRzXyhERUZBVUxUX01BWF9DT1JSVVBURURfRVZFTlRTKSwKKyAgICBlb2ZTbGVlcFRpbWVfKERFRkFVTFRfRU9GX1NMRUVQX1RJTUVfVVMpLAorICAgIGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyhERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTKSwKKyAgICB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyhERUZBVUxUX1dSSVRFUl9USFJFQURfU0xFRVBfVElNRV9VUyksCisgICAgZGVxdWV1ZUJ1ZmZlcl8oTlVMTCksCisgICAgZW5xdWV1ZUJ1ZmZlcl8oTlVMTCksCisgICAgbm90RnVsbF8oJm11dGV4XyksCisgICAgbm90RW1wdHlfKCZtdXRleF8pLAorICAgIGNsb3NpbmdfKGZhbHNlKSwKKyAgICBmbHVzaGVkXygmbXV0ZXhfKSwKKyAgICBmb3JjZUZsdXNoXyhmYWxzZSksCisgICAgZmlsZW5hbWVfKHBhdGgpLAorICAgIGZkXygwKSwKKyAgICBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8oZmFsc2UpLAorICAgIG9mZnNldF8oMCksCisgICAgbGFzdEJhZENodW5rXygwKSwKKyAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXygwKSwKKyAgICByZWFkT25seV8ocmVhZE9ubHkpIHsKKyAgdGhyZWFkRmFjdG9yeV8uc2V0RGV0YWNoZWQoZmFsc2UpOworICBvcGVuTG9nRmlsZSgpOworfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpyZXNldE91dHB1dEZpbGUoaW50IGZkLCBzdHJpbmcgZmlsZW5hbWUsIG9mZl90IG9mZnNldCkgeworICBmaWxlbmFtZV8gPSBmaWxlbmFtZTsKKyAgb2Zmc2V0XyA9IG9mZnNldDsKKworICAvLyBjaGVjayBpZiBjdXJyZW50IGZpbGUgaXMgc3RpbGwgb3BlbgorICBpZiAoZmRfID4gMCkgeworICAgIC8vIGZsdXNoIGFueSBldmVudHMgaW4gdGhlIHF1ZXVlCisgICAgZmx1c2goKTsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJlcnJvciwgY3VycmVudCBmaWxlICglcykgbm90IGNsb3NlZCIsIGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogcmVzZXRPdXRwdXRGaWxlKCkgOjpjbG9zZSgpICIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIGluIGZpbGUgY2xvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGNsb3NlZCBmZAorICAgICAgZmRfID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoZmQpIHsKKyAgICBmZF8gPSBmZDsKKyAgfSBlbHNlIHsKKyAgICAvLyBvcGVuIGZpbGUgaWYgdGhlIGlucHV0IGZkIGlzIDAKKyAgICBvcGVuTG9nRmlsZSgpOworICB9Cit9CisKK1RGaWxlVHJhbnNwb3J0Ojp+VEZpbGVUcmFuc3BvcnQoKSB7CisgIC8vIGZsdXNoIHRoZSBidWZmZXIgaWYgYSB3cml0ZXIgdGhyZWFkIGlzIGFjdGl2ZQorICBpZiAod3JpdGVyVGhyZWFkXy5nZXQoKSkgeworICAgIC8vIHNldCBzdGF0ZSB0byBjbG9zaW5nCisgICAgY2xvc2luZ18gPSB0cnVlOworCisgICAgLy8gd2FrZSB1cCB0aGUgd3JpdGVyIHRocmVhZAorICAgIC8vIFNpbmNlIGNsb3NpbmdfIGlzIHRydWUsIGl0IHdpbGwgYXR0ZW1wdCB0byBmbHVzaCBhbGwgZGF0YSwgdGhlbiBleGl0LgorICAgIG5vdEVtcHR5Xy5ub3RpZnkoKTsKKworICAgIHdyaXRlclRocmVhZF8tPmpvaW4oKTsKKyAgICB3cml0ZXJUaHJlYWRfLnJlc2V0KCk7CisgIH0KKworICBpZiAoZGVxdWV1ZUJ1ZmZlcl8pIHsKKyAgICBkZWxldGUgZGVxdWV1ZUJ1ZmZlcl87CisgICAgZGVxdWV1ZUJ1ZmZlcl8gPSBOVUxMOworICB9CisKKyAgaWYgKGVucXVldWVCdWZmZXJfKSB7CisgICAgZGVsZXRlIGVucXVldWVCdWZmZXJfOworICAgIGVucXVldWVCdWZmZXJfID0gTlVMTDsKKyAgfQorCisgIGlmIChyZWFkQnVmZl8pIHsKKyAgICBkZWxldGVbXSByZWFkQnVmZl87CisgICAgcmVhZEJ1ZmZfID0gTlVMTDsKKyAgfQorCisgIGlmIChjdXJyZW50RXZlbnRfKSB7CisgICAgZGVsZXRlIGN1cnJlbnRFdmVudF87CisgICAgY3VycmVudEV2ZW50XyA9IE5VTEw7CisgIH0KKworICAvLyBjbG9zZSBsb2dmaWxlCisgIGlmIChmZF8gPiAwKSB7CisgICAgaWYgKC0xID09IDo6VEhSSUZUX0NMT1NFKGZkXykpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB+VEZpbGVUcmFuc3BvcnQoKSA6OmNsb3NlKCkgIiwgVEhSSUZUX0VSUk5PKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGNsb3NlZCBmZAorICAgICAgZmRfID0gMDsKKyAgICB9CisgIH0KK30KKworYm9vbCBURmlsZVRyYW5zcG9ydDo6aW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkgeworICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7CisgICAgVF9FUlJPUigiJXMiLCAiVHJ5aW5nIHRvIGRvdWJsZS1pbml0IFRGaWxlVHJhbnNwb3J0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCF3cml0ZXJUaHJlYWRfLmdldCgpKSB7CisgICAgd3JpdGVyVGhyZWFkXyA9IHRocmVhZEZhY3RvcnlfLm5ld1RocmVhZCgKKyAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKHN0YXJ0V3JpdGVyVGhyZWFkLCB0aGlzKSk7CisgICAgd3JpdGVyVGhyZWFkXy0+c3RhcnQoKTsKKyAgfQorCisgIGRlcXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOworICBlbnF1ZXVlQnVmZmVyXyA9IG5ldyBURmlsZVRyYW5zcG9ydEJ1ZmZlcihldmVudEJ1ZmZlclNpemVfKTsKKyAgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHJlYWRPbmx5XykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIGZpbGUgb3BlbmVkIHJlYWRvbmx5Iik7CisgIH0KKworICBlbnF1ZXVlRXZlbnQoYnVmLCBsZW4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdHJ1Y3QgdW5pcXVlRGVsZXRlcgoreworICB2b2lkIG9wZXJhdG9yKCkoX1QgKnB0cikgY29uc3QgeyBkZWxldGUgcHRyOyB9Cit9OworCit2b2lkIFRGaWxlVHJhbnNwb3J0OjplbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbikgeworICAvLyBjYW4ndCBlbnF1ZXVlIG1vcmUgZXZlbnRzIGlmIGZpbGUgaXMgZ29pbmcgdG8gY2xvc2UKKyAgaWYgKGNsb3NpbmdfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gbWFrZSBzdXJlIHRoYXQgZXZlbnQgc2l6ZSBpcyB2YWxpZAorICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAoZXZlbnRMZW4gPiBtYXhFdmVudFNpemVfKSkgeworICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgZXZlbnRMZW4sIG1heEV2ZW50U2l6ZV8pOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChldmVudExlbiA9PSAwKSB7CisgICAgVF9FUlJPUigiJXMiLCAiY2Fubm90IGVucXVldWUgYW4gZW1wdHkgZXZlbnQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8ZXZlbnRJbmZvLCB1bmlxdWVEZWxldGVyPGV2ZW50SW5mbz4gPiB0b0VucXVldWUobmV3IGV2ZW50SW5mbygpKTsKKyAgdG9FbnF1ZXVlLT5ldmVudEJ1ZmZfID0gbmV3IHVpbnQ4X3RbKHNpemVvZih1aW50OF90KSAqIGV2ZW50TGVuKSArIDRdOworCisgIC8vIGZpcnN0IDQgYnl0ZXMgaXMgdGhlIGV2ZW50IGxlbmd0aAorICBtZW1jcHkodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfLCAodm9pZCopKCZldmVudExlbiksIDQpOworICAvLyBhY3R1YWwgZXZlbnQgY29udGVudHMKKyAgbWVtY3B5KHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyArIDQsIGJ1ZiwgZXZlbnRMZW4pOworICB0b0VucXVldWUtPmV2ZW50U2l6ZV8gPSBldmVudExlbiArIDQ7CisKKyAgLy8gbG9jayBtdXRleAorICBHdWFyZCBnKG11dGV4Xyk7CisKKyAgLy8gbWFrZSBzdXJlIHRoYXQgZW5xdWV1ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIHdyaXRlciB0aHJlYWQgaXMgcnVubmluZworICBpZiAoIWJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgeworICAgIGlmICghaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBDYW4ndCBlbnF1ZXVlIHdoaWxlIGJ1ZmZlciBpcyBmdWxsCisgIHdoaWxlIChlbnF1ZXVlQnVmZmVyXy0+aXNGdWxsKCkpIHsKKyAgICBub3RGdWxsXy53YWl0KCk7CisgIH0KKworICAvLyBXZSBzaG91bGRuJ3QgYmUgdHJ5aW5nIHRvIGVucXVldWUgbmV3IGRhdGEgd2hpbGUgYSBmb3JjZWQgZmx1c2ggaXMKKyAgLy8gcmVxdWVzdGVkLiAgKE90aGVyd2lzZSB0aGUgd3JpdGVyIHRocmVhZCBtaWdodCBub3QgZXZlciBiZSBhYmxlIHRvIGZpbmlzaAorICAvLyB0aGUgZmx1c2ggaWYgbW9yZSBkYXRhIGtlZXBzIGJlaW5nIGVucXVldWVkLikKKyAgYXNzZXJ0KCFmb3JjZUZsdXNoXyk7CisKKyAgLy8gYWRkIHRvIHRoZSBidWZmZXIKKyAgZXZlbnRJbmZvKiBwRXZlbnQgPSB0b0VucXVldWUucmVsZWFzZSgpOworICBpZiAoIWVucXVldWVCdWZmZXJfLT5hZGRFdmVudChwRXZlbnQpKSB7CisgICAgZGVsZXRlIHBFdmVudDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBzaWduYWwgYW55Ym9keSB3aG8ncyB3YWl0aW5nIGZvciB0aGUgYnVmZmVyIHRvIGJlIG5vbi1lbXB0eQorICBub3RFbXB0eV8ubm90aWZ5KCk7CisKKyAgLy8gdGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgbG9vcCB3aGVyZSBpdCBtYWtlcyBzdXJlIGl0IGdvdCBmbHVzaGVkCisgIC8vIGJlY2F1c2UgY29uZGl0aW9uIHZhcmlhYmxlcyBjYW4gZ2V0IHRyaWdnZXJlZCBieSB0aGUgb3MgZm9yIG5vIHJlYXNvbgorICAvLyBpdCBpcyBwcm9iYWJseSBhIG5vbi1mYWN0b3IgZm9yIHRoZSB0aW1lIGJlaW5nCit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnQ6OnN3YXBFdmVudEJ1ZmZlcnMoc3RydWN0IHRpbWV2YWwqIGRlYWRsaW5lKSB7CisgIGJvb2wgc3dhcDsKKyAgR3VhcmQgZyhtdXRleF8pOworCisgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgeworICAgIHN3YXAgPSB0cnVlOworICB9IGVsc2UgaWYgKGNsb3NpbmdfKSB7CisgICAgLy8gZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gZGF0YSB0byB3cml0ZSwKKyAgICAvLyByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHRyYW5zcG9ydCBpcyBjbG9zaW5nCisgICAgc3dhcCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGlmIChkZWFkbGluZSAhPSBOVUxMKSB7CisgICAgICAvLyBpZiB3ZSB3ZXJlIGhhbmRlZCBhIGRlYWRsaW5lIHRpbWUgc3RydWN0LCBkbyBhIHRpbWVkIHdhaXQKKyAgICAgIG5vdEVtcHR5Xy53YWl0Rm9yVGltZShkZWFkbGluZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGp1c3Qgd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGdldHMgYW4gaXRlbQorICAgICAgbm90RW1wdHlfLndhaXQoKTsKKyAgICB9CisKKyAgICAvLyBjb3VsZCBiZSBlbXB0eSBpZiB3ZSB0aW1lZCBvdXQKKyAgICBzd2FwID0gZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKTsKKyAgfQorCisgIGlmIChzd2FwKSB7CisgICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIHRlbXAgPSBlbnF1ZXVlQnVmZmVyXzsKKyAgICBlbnF1ZXVlQnVmZmVyXyA9IGRlcXVldWVCdWZmZXJfOworICAgIGRlcXVldWVCdWZmZXJfID0gdGVtcDsKKyAgfQorCisgIGlmIChzd2FwKSB7CisgICAgbm90RnVsbF8ubm90aWZ5KCk7CisgIH0KKworICByZXR1cm4gc3dhcDsKK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6d3JpdGVyVGhyZWFkKCkgeworICBib29sIGhhc0lPRXJyb3IgPSBmYWxzZTsKKworICAvLyBvcGVuIGZpbGUgaWYgaXQgaXMgbm90IG9wZW4KKyAgaWYgKCFmZF8pIHsKKyAgICB0cnkgeworICAgICAgb3BlbkxvZ0ZpbGUoKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIG9wZW5Mb2dGaWxlKCkgIiwgZXJybm9fY29weSk7CisgICAgICBmZF8gPSAwOworICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gc2V0IHRoZSBvZmZzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUgKEVPRikKKyAgaWYgKCFoYXNJT0Vycm9yKSB7CisgICAgdHJ5IHsKKyAgICAgIHNlZWtUb0VuZCgpOworICAgICAgLy8gdGhyb3cgYXdheSBhbnkgcGFydGlhbCBldmVudHMKKyAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfOworICAgICAgaWYgKDAgPT0gVEhSSUZUX0ZUUlVOQ0FURShmZF8sIG9mZnNldF8pKSB7CisgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgdHJ1bmNhdGUgIiwgZXJybm9fY29weSk7CisgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOworICAgICAgfQorICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgaW5pdGlhbGl6YXRpb24gIiwgZXJybm9fY29weSk7CisgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBGaWd1cmUgb3V0IHRoZSBuZXh0IHRpbWUgYnkgd2hpY2ggYSBmbHVzaCBtdXN0IHRha2UgcGxhY2UKKyAgc3RydWN0IHRpbWV2YWwgdHNfbmV4dF9mbHVzaDsKKyAgZ2V0TmV4dEZsdXNoVGltZSgmdHNfbmV4dF9mbHVzaCk7CisgIHVpbnQzMl90IHVuZmx1c2hlZCA9IDA7CisKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyB0aGlzIHdpbGwgb25seSBiZSB0cnVlIHdoZW4gdGhlIGRlc3RydWN0b3IgaXMgYmVpbmcgaW52b2tlZAorICAgIGlmIChjbG9zaW5nXykgeworICAgICAgaWYgKGhhc0lPRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBUcnkgdG8gZW1wdHkgYnVmZmVycyBiZWZvcmUgZXhpdAorICAgICAgaWYgKGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkgJiYgZGVxdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgeworICAgICAgICA6OlRIUklGVF9GU1lOQyhmZF8pOworICAgICAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgeworICAgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gZmQgc3VjY2Vzc2Z1bGx5IGNsb3NlZAorICAgICAgICAgIGZkXyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzd2FwRXZlbnRCdWZmZXJzKCZ0c19uZXh0X2ZsdXNoKSkgeworICAgICAgZXZlbnRJbmZvKiBvdXRFdmVudDsKKyAgICAgIHdoaWxlIChOVUxMICE9IChvdXRFdmVudCA9IGRlcXVldWVCdWZmZXJfLT5nZXROZXh0KCkpKSB7CisgICAgICAgIC8vIFJlbW92ZSBhbiBldmVudCBmcm9tIHRoZSBidWZmZXIgYW5kIHdyaXRlIGl0IG91dCB0byBkaXNrLiBJZiB0aGVyZSBpcyBhbnkgSU8gZXJyb3IsIGZvcgorICAgICAgICAvLyBpbnN0YW5jZSwKKyAgICAgICAgLy8gdGhlIG91dHB1dCBmaWxlIGlzIHVubW91bnRlZCBvciBkZWxldGVkLCB0aGVuIHRoaXMgZXZlbnQgaXMgZHJvcHBlZC4gSG93ZXZlciwgdGhlIHdyaXRlcgorICAgICAgICAvLyB0aHJlYWQKKyAgICAgICAgLy8gd2lsbDogKDEpIHNsZWVwIGZvciBhIHNob3J0IHdoaWxlOyAoMikgdHJ5IHRvIHJlb3BlbiB0aGUgZmlsZTsgKDMpIGlmIHN1Y2Nlc3NmdWwgdGhlbgorICAgICAgICAvLyBzdGFydCB3cml0aW5nCisgICAgICAgIC8vIGZyb20gdGhlIGVuZC4KKworICAgICAgICB3aGlsZSAoaGFzSU9FcnJvcikgeworICAgICAgICAgIFRfRVJST1IoCisgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogd3JpdGVyIHRocmVhZCBnb2luZyB0byBzbGVlcCBmb3IgJXUgbWljcm9zZWNvbmRzIGR1ZSB0byBJTyBlcnJvcnMiLAorICAgICAgICAgICAgICB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7CisgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMod3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8pOworICAgICAgICAgIGlmIChjbG9zaW5nXykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIWZkXykgeworICAgICAgICAgICAgOjpUSFJJRlRfQ0xPU0UoZmRfKTsKKyAgICAgICAgICAgIGZkXyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcGVuTG9nRmlsZSgpOworICAgICAgICAgICAgc2Vla1RvRW5kKCk7CisgICAgICAgICAgICB1bmZsdXNoZWQgPSAwOworICAgICAgICAgICAgaGFzSU9FcnJvciA9IGZhbHNlOworICAgICAgICAgICAgVF9MT0dfT1BFUigKKyAgICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlICVzIHJlb3BlbmVkIGJ5IHdyaXRlciB0aHJlYWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwKKyAgICAgICAgICAgICAgICBmaWxlbmFtZV8uY19zdHIoKSk7CisgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogdW5hYmxlIHRvIHJlb3BlbiBsb2cgZmlsZSAlcyBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV8uY19zdHIoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrIG9uIGV2ZW50CisgICAgICAgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IG1heEV2ZW50U2l6ZV8pKSB7CisgICAgICAgICAgVF9FUlJPUigibXNnIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplOiAldSA+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgb3V0RXZlbnQtPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICAgICAgICBtYXhFdmVudFNpemVfKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGNodW5raW5nIGlzIHJlcXVpcmVkLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IG1zZyBkb2VzIG5vdCBjcm9zcyBjaHVuayBib3VuZGFyeQorICAgICAgICBpZiAoKG91dEV2ZW50LT5ldmVudFNpemVfID4gMCkgJiYgKGNodW5rU2l6ZV8gIT0gMCkpIHsKKyAgICAgICAgICAvLyBldmVudCBzaXplIG11c3QgYmUgbGVzcyB0aGFuIGNodW5rIHNpemUKKyAgICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7CisgICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogZXZlbnQgc2l6ZSgldSkgPiBjaHVuayBzaXplKCV1KTogc2tpcHBpbmcgZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICBvdXRFdmVudC0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbnQ2NF90IGNodW5rMSA9IG9mZnNldF8gLyBjaHVua1NpemVfOworICAgICAgICAgIGludDY0X3QgY2h1bmsyID0gKG9mZnNldF8gKyBvdXRFdmVudC0+ZXZlbnRTaXplXyAtIDEpIC8gY2h1bmtTaXplXzsKKworICAgICAgICAgIC8vIGlmIGFkZGluZyB0aGlzIGV2ZW50IHdpbGwgY3Jvc3MgYSBjaHVuayBib3VuZGFyeSwgcGFkIHRoZSBjaHVuayB3aXRoIHplcm9zCisgICAgICAgICAgaWYgKGNodW5rMSAhPSBjaHVuazIpIHsKKyAgICAgICAgICAgIC8vIHJlZmV0Y2ggdGhlIG9mZnNldCB0byBrZWVwIGluIHN5bmMKKyAgICAgICAgICAgIG9mZnNldF8gPSBUSFJJRlRfTFNFRUsoZmRfLCAwLCBTRUVLX0NVUik7CisgICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAoaW50MzJfdCkoKG9mZnNldF8gLyBjaHVua1NpemVfICsgMSkgKiBjaHVua1NpemVfIC0gb2Zmc2V0Xyk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QqIHplcm9zID0gbmV3IHVpbnQ4X3RbcGFkZGluZ107CisgICAgICAgICAgICBtZW1zZXQoemVyb3MsICdcMCcsIHBhZGRpbmcpOworICAgICAgICAgICAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiBhcnJheSh6ZXJvcyk7CisgICAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIHplcm9zLCBwYWRkaW5nKSkgeworICAgICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGVycm9yIHdoaWxlIHBhZGRpbmcgemVyb3MgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICAgICAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5mbHVzaGVkICs9IHBhZGRpbmc7CisgICAgICAgICAgICBvZmZzZXRfICs9IHBhZGRpbmc7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIGRlcXVldWVkIGV2ZW50IHRvIHRoZSBmaWxlCisgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IDApIHsKKyAgICAgICAgICBpZiAoLTEgPT0gOjpUSFJJRlRfV1JJVEUoZmRfLCBvdXRFdmVudC0+ZXZlbnRCdWZmXywgb3V0RXZlbnQtPmV2ZW50U2l6ZV8pKSB7CisgICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSB3cml0aW5nIGV2ZW50ICIsIGVycm5vX2NvcHkpOworICAgICAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdW5mbHVzaGVkICs9IG91dEV2ZW50LT5ldmVudFNpemVfOworICAgICAgICAgIG9mZnNldF8gKz0gb3V0RXZlbnQtPmV2ZW50U2l6ZV87CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRlcXVldWVCdWZmZXJfLT5yZXNldCgpOworICAgIH0KKworICAgIGlmIChoYXNJT0Vycm9yKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBMb2NhbCB2YXJpYWJsZSB0byBjYWNoZSB0aGUgc3RhdGUgb2YgZm9yY2VGbHVzaF8uCisgICAgLy8KKyAgICAvLyBXZSBvbmx5IHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlIG9mIGZvcmNlRmx1c2hfIG9uY2UgZWFjaCB0aW1lIGFyb3VuZCB0aGUKKyAgICAvLyBsb29wLiAgSWYgd2UgY2hlY2sgaXQgbW9yZSB0aGFuIG9uY2Ugd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrIHRoZSBlbnRpcmUKKyAgICAvLyB0aW1lLCBpdCBjb3VsZCBoYXZlIGNoYW5nZWQgc3RhdGUgaW4gYmV0d2Vlbi4gIFRoaXMgd2lsbCByZXN1bHQgaW4gdXMKKyAgICAvLyBtYWtpbmcgaW5jb25zaXN0ZW50IGRlY2lzaW9ucy4KKyAgICBib29sIGZvcmNlZF9mbHVzaCA9IGZhbHNlOworICAgIHsKKyAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgIGlmIChmb3JjZUZsdXNoXykgeworICAgICAgICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAvLyBJZiBmb3JjZUZsdXNoXyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGFsbCBhdmFpbGFibGUgZGF0YS4KKyAgICAgICAgICAvLyBJZiBlbnF1ZXVlQnVmZmVyXyBpcyBub3QgZW1wdHksIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsb29wIHRvCisgICAgICAgICAgLy8gd3JpdGUgaXQgb3V0LgorICAgICAgICAgIC8vCisgICAgICAgICAgLy8gV2Uga25vdyB0aGUgbWFpbiB0aHJlYWQgaXMgd2FpdGluZyBvbiBmb3JjZUZsdXNoXyB0byBiZSBjbGVhcmVkLAorICAgICAgICAgIC8vIHNvIG5vIG5ldyBldmVudHMgd2lsbCBiZSBhZGRlZCB0byBlbnF1ZXVlQnVmZmVyXyB1bnRpbCB3ZSBjbGVhcgorICAgICAgICAgIC8vIGZvcmNlRmx1c2hfLiAgVGhlcmVmb3JlIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wIGVucXVldWVCdWZmZXJfCisgICAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBlbXB0eS4gIChJLmUuLCB3ZSdyZSBndWFyYW50ZWVkIHRvIG1ha2UgcHJvZ3Jlc3MKKyAgICAgICAgICAvLyBhbmQgY2xlYXIgZm9yY2VGbHVzaF8gdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AuKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvcmNlZF9mbHVzaCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBmc3luYworICAgIGJvb2wgZmx1c2ggPSBmYWxzZTsKKyAgICBpZiAoZm9yY2VkX2ZsdXNoIHx8IHVuZmx1c2hlZCA+IGZsdXNoTWF4Qnl0ZXNfKSB7CisgICAgICBmbHVzaCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKyAgICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmN1cnJlbnRfdGltZSwgTlVMTCk7CisgICAgICBpZiAoY3VycmVudF90aW1lLnR2X3NlYyA+IHRzX25leHRfZmx1c2gudHZfc2VjCisgICAgICAgICAgfHwgKGN1cnJlbnRfdGltZS50dl9zZWMgPT0gdHNfbmV4dF9mbHVzaC50dl9zZWMKKyAgICAgICAgICAgICAgJiYgY3VycmVudF90aW1lLnR2X3VzZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3VzZWMpKSB7CisgICAgICAgIGlmICh1bmZsdXNoZWQgPiAwKSB7CisgICAgICAgICAgZmx1c2ggPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5ldyBkYXRhIHNpbmNlIHRoZSBsYXN0IGZzeW5jLAorICAgICAgICAgIC8vIGRvbid0IHBlcmZvcm0gdGhlIGZzeW5jLCBidXQgZG8gcmVzZXQgdGhlIHRpbWVyLgorICAgICAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZsdXNoKSB7CisgICAgICAvLyBzeW5jIChmb3JjZSBmbHVzaCkgZmlsZSB0byBkaXNrCisgICAgICBUSFJJRlRfRlNZTkMoZmRfKTsKKyAgICAgIHVuZmx1c2hlZCA9IDA7CisgICAgICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKKworICAgICAgLy8gbm90aWZ5IGFueWJvZHkgd2FpdGluZyBmb3IgZmx1c2ggY29tcGxldGlvbgorICAgICAgaWYgKGZvcmNlZF9mbHVzaCkgeworICAgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICAgIGZvcmNlRmx1c2hfID0gZmFsc2U7CisgICAgICAgIGFzc2VydChlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0KGRlcXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOworICAgICAgICBmbHVzaGVkXy5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIC8vIGZpbGUgbXVzdCBiZSBvcGVuIGZvciB3cml0aW5nIGZvciBhbnkgZmx1c2hpbmcgdG8gdGFrZSBwbGFjZQorICBpZiAoIXdyaXRlclRocmVhZF8uZ2V0KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gd2FpdCBmb3IgZmx1c2ggdG8gdGFrZSBwbGFjZQorICBHdWFyZCBnKG11dGV4Xyk7CisKKyAgLy8gSW5kaWNhdGUgdGhhdCB3ZSBhcmUgcmVxdWVzdGluZyBhIGZsdXNoCisgIGZvcmNlRmx1c2hfID0gdHJ1ZTsKKyAgLy8gV2FrZSB1cCB0aGUgd3JpdGVyIHRocmVhZCBzbyBpdCB3aWxsIHBlcmZvcm0gdGhlIGZsdXNoIGltbWVkaWF0ZWx5CisgIG5vdEVtcHR5Xy5ub3RpZnkoKTsKKworICB3aGlsZSAoZm9yY2VGbHVzaF8pIHsKKyAgICBmbHVzaGVkXy53YWl0KCk7CisgIH0KK30KKwordWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgaGF2ZSA9IDA7CisgIHVpbnQzMl90IGdldCA9IDA7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBnZXQgPSByZWFkKGJ1ZiArIGhhdmUsIGxlbiAtIGhhdmUpOworICAgIGlmIChnZXQgPD0gMCkgeworICAgICAgdGhyb3cgVEVPRkV4Y2VwdGlvbigpOworICAgIH0KKyAgICBoYXZlICs9IGdldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCitib29sIFRGaWxlVHJhbnNwb3J0OjpwZWVrKCkgeworICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbiBldmVudCByZWFkeSB0byBiZSByZWFkCisgIGlmICghY3VycmVudEV2ZW50XykgeworICAgIGN1cnJlbnRFdmVudF8gPSByZWFkRXZlbnQoKTsKKyAgfQorCisgIC8vIGRpZCBub3QgbWFuYWdlIHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgZmlsZS4gVGhpcyBjb3VsZCBoYXZlIGhhcHBlbmVkCisgIC8vIGlmIHRoZSB0aW1lb3V0IGV4cGlyZWQgb3IgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZXJyb3IKKyAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gcmVhZAorICByZXR1cm4gKGN1cnJlbnRFdmVudF8tPmV2ZW50U2l6ZV8gLSBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfKSA+IDA7Cit9CisKK3VpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIC8vIGNoZWNrIGlmIHRoZXJlIGFuIGV2ZW50IGlzIHJlYWR5IHRvIGJlIHJlYWQKKyAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOworICB9CisKKyAgLy8gZGlkIG5vdCBtYW5hZ2UgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBmaWxlLiBUaGlzIGNvdWxkIGhhdmUgaGFwcGVuZWQKKyAgLy8gaWYgdGhlIHRpbWVvdXQgZXhwaXJlZCBvciB0aGVyZSB3YXMgc29tZSBvdGhlciBlcnJvcgorICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIHJlYWQgYXMgbXVjaCBvZiB0aGUgY3VycmVudCBldmVudCBhcyBwb3NzaWJsZQorICBpbnQzMl90IHJlbWFpbmluZyA9IGN1cnJlbnRFdmVudF8tPmV2ZW50U2l6ZV8gLSBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfOworICBpZiAocmVtYWluaW5nIDw9IChpbnQzMl90KWxlbikgeworICAgIC8vIGNvcHkgb3ZlciBhbnl0aGluZyB0aGF0cyByZW1haW5pbmcKKyAgICBpZiAocmVtYWluaW5nID4gMCkgeworICAgICAgbWVtY3B5KGJ1ZiwgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sIHJlbWFpbmluZyk7CisgICAgfQorICAgIGRlbGV0ZSAoY3VycmVudEV2ZW50Xyk7CisgICAgY3VycmVudEV2ZW50XyA9IE5VTEw7CisgICAgcmV0dXJuIHJlbWFpbmluZzsKKyAgfQorCisgIC8vIHJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZQorICBtZW1jcHkoYnVmLCBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZfICsgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXywgbGVuKTsKKyAgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyArPSBsZW47CisgIHJldHVybiBsZW47Cit9CisKKy8vIG5vdGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHJldHVybmVkIGV2ZW50cworZXZlbnRJbmZvKiBURmlsZVRyYW5zcG9ydDo6cmVhZEV2ZW50KCkgeworICBpbnQgcmVhZFRyaWVzID0gMDsKKworICBpZiAoIXJlYWRCdWZmXykgeworICAgIHJlYWRCdWZmXyA9IG5ldyB1aW50OF90W3JlYWRCdWZmU2l6ZV9dOworICB9CisKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyByZWFkIGZyb20gdGhlIGZpbGUgaWYgcmVhZCBidWZmZXIgaXMgZXhoYXVzdGVkCisgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA9PSByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgIC8vIGFkdmFuY2UgdGhlIG9mZnNldCBwb2ludGVyCisgICAgICBvZmZzZXRfICs9IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXzsKKyAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pig6OlRIUklGVF9SRUFEKGZkXywgcmVhZEJ1ZmZfLCByZWFkQnVmZlNpemVfKSk7CisgICAgICAvLyAgICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CisgICAgICAvLyAgICAgICAgIFRfREVCVUdfTCgxLCAiQW1vdW50IHJlYWQ6ICV1IChvZmZzZXQ6ICVsdSkiLCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8sIG9mZnNldF8pOworICAgICAgLy8gICAgICAgfQorICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfID0gMDsKKyAgICAgIHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyA9IDA7CisKKyAgICAgIC8vIHJlYWQgZXJyb3IKKyAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gLTEpIHsKKyAgICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICAgICAgICBHbG9iYWxPdXRwdXQoIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIpOworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiKTsKKyAgICAgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IDApIHsgLy8gRU9GCisgICAgICAgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQKKyAgICAgICAgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgeworICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGVvZlNsZWVwVGltZV8pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBOT19UQUlMX1JFQURfVElNRU9VVCkgeworICAgICAgICAgIC8vIHJlc2V0IHN0YXRlCisgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAvLyB0aW1lb3V0IGFscmVhZHkgZXhwaXJlZCBvbmNlCisgICAgICAgICAgaWYgKHJlYWRUcmllcyA+IDApIHsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhyZWFkVGltZW91dF8gKiAxMDAwKTsKKyAgICAgICAgICAgIHJlYWRUcmllcysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmVhZFRyaWVzID0gMDsKKworICAgIC8vIGF0dGVtcHQgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBidWZmZXIKKyAgICB3aGlsZSAocmVhZFN0YXRlXy5idWZmZXJQdHJfIDwgcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CisgICAgICBpZiAocmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8pIHsKKyAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gMCkgeworICAgICAgICAgIGlmICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykgLyBjaHVua1NpemVfCisgICAgICAgICAgICAgICE9ICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIDMpIC8gY2h1bmtTaXplXykpIHsKKyAgICAgICAgICAgIC8vIHNraXAgb25lIGJ5dGUgdG93YXJkcyBjaHVuayBib3VuZGFyeQorICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIlNraXBwaW5nIGEgYnl0ZSIpOworICAgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfW3JlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18rK10KKyAgICAgICAgICAgID0gcmVhZEJ1ZmZfW3JlYWRTdGF0ZV8uYnVmZmVyUHRyXysrXTsKKworICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSA0KSB7CisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZ2V0RXZlbnRTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gMCBsZW5ndGggZXZlbnQgaW5kaWNhdGVzIHBhZGRpbmcKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgVF9ERUJVR19MKDEsICJHb3QgcGFkZGluZyIpOworICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gZ290IGEgdmFsaWQgZXZlbnQKKyAgICAgICAgICByZWFkU3RhdGVfLnJlYWRpbmdTaXplXyA9IGZhbHNlOworICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50XykgeworICAgICAgICAgICAgZGVsZXRlIChyZWFkU3RhdGVfLmV2ZW50Xyk7CisgICAgICAgICAgfQorICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gbmV3IGV2ZW50SW5mbygpOworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID0gcmVhZFN0YXRlXy5nZXRFdmVudFNpemUoKTsKKworICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBpcyBjb3JydXB0ZWQgYW5kIHBlcmZvcm0gcmVjb3ZlcnkgaWYgcmVxdWlyZWQKKyAgICAgICAgICBpZiAoaXNFdmVudENvcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICBwZXJmb3JtUmVjb3ZlcnkoKTsKKyAgICAgICAgICAgIC8vIHN0YXJ0IGZyb20gdGhlIHRvcAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfKSB7CisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFtyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplX107CisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPSAwOworICAgICAgICB9CisgICAgICAgIC8vIHRha2UgZWl0aGVyIHRoZSBlbnRpcmUgZXZlbnQgb3IgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgYnVmZmVyCisgICAgICAgIGludCByZWNsYWltQnVmZmVyID0gKHN0ZDo6bWluKSgodWludDMyX3QpKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyAtIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfKTsKKworICAgICAgICAvLyBjb3B5IGRhdGEgZnJvbSByZWFkIGJ1ZmZlciBpbnRvIGV2ZW50IGJ1ZmZlcgorICAgICAgICBtZW1jcHkocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXywKKyAgICAgICAgICAgICAgIHJlYWRCdWZmXyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXywKKyAgICAgICAgICAgICAgIHJlY2xhaW1CdWZmZXIpOworCisgICAgICAgIC8vIGluY3JlbWVudCBwb3NpdGlvbiBwdHJzCisgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfICs9IHJlY2xhaW1CdWZmZXI7CisgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArPSByZWNsYWltQnVmZmVyOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBoYXMgYmVlbiByZWFkIGluIGZ1bGwKKyAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfID09IHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfKSB7CisgICAgICAgICAgLy8gc2V0IHRoZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIGN1cnJlbnQgZXZlbnQKKyAgICAgICAgICBldmVudEluZm8qIGNvbXBsZXRlRXZlbnQgPSByZWFkU3RhdGVfLmV2ZW50XzsKKyAgICAgICAgICBjb21wbGV0ZUV2ZW50LT5ldmVudEJ1ZmZQb3NfID0gMDsKKworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gTlVMTDsKKyAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5idWZmZXJQdHJfKTsKKworICAgICAgICAgIC8vIGV4aXQgY3JpdGVyaWEKKyAgICAgICAgICByZXR1cm4gY29tcGxldGVFdmVudDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitib29sIFRGaWxlVHJhbnNwb3J0Ojppc0V2ZW50Q29ycnVwdGVkKCkgeworICAvLyBhbiBlcnJvciBpcyB0cmlnZ2VyZWQgaWY6CisgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA+IG1heEV2ZW50U2l6ZV8pKSB7CisgICAgLy8gMS4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiB1c2VyLXNwZWZpY2llZCBtYXgtZXZlbnQgc2l6ZQorICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplICgldSkiLAorICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICBtYXhFdmVudFNpemVfKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA+IGNodW5rU2l6ZV8pIHsKKyAgICAvLyAyLiBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIGNodW5rIHNpemUKKyAgICBUX0VSUk9SKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IHNpemUoJXUpIGdyZWF0ZXIgdGhhbiBjaHVuayBzaXplICgldSkiLAorICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICBjaHVua1NpemVfKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmICgoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gLSA0KSAvIGNodW5rU2l6ZV8pCisgICAgICAgICAgICAgIT0gKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gLSAxKQorICAgICAgICAgICAgICAgICAvIGNodW5rU2l6ZV8pKSB7CisgICAgLy8gMy4gc2l6ZSBpbmRpY2F0ZXMgdGhhdCBldmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5CisgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5LiBFdmVudCBzaXplOiV1ICBPZmZzZXQ6JWx1IiwKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIDQpKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpwZXJmb3JtUmVjb3ZlcnkoKSB7CisgIC8vIHBlcmZvcm0gc29tZSBraWNrYXNzIHJlY292ZXJ5CisgIHVpbnQzMl90IGN1ckNodW5rID0gZ2V0Q3VyQ2h1bmsoKTsKKyAgaWYgKGxhc3RCYWRDaHVua18gPT0gY3VyQ2h1bmspIHsKKyAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXysrOworICB9IGVsc2UgeworICAgIGxhc3RCYWRDaHVua18gPSBjdXJDaHVuazsKKyAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA9IDE7CisgIH0KKworICBpZiAobnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPCBtYXhDb3JydXB0ZWRFdmVudHNfKSB7CisgICAgLy8gbWF5YmUgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJlYWRpbmcgdGhlIGZpbGUgZnJvbSBkaXNrCisgICAgLy8gc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIGNodW5rIGFuZCB0cnkgYWdhaW4KKyAgICBzZWVrVG9DaHVuayhjdXJDaHVuayk7CisgIH0gZWxzZSB7CisKKyAgICAvLyBqdXN0IHNraXAgYWhlYWQgdG8gdGhlIG5leHQgY2h1bmsgaWYgd2Ugbm90IGFscmVhZHkgYXQgdGhlIGxhc3QgY2h1bmsKKyAgICBpZiAoY3VyQ2h1bmsgIT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKKyAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7CisgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gVEFJTF9SRUFEX1RJTUVPVVQpIHsKKyAgICAgIC8vIGlmIHRhaWxpbmcgdGhlIGZpbGUsIHdhaXQgdW50aWwgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gc3RhcnQKKyAgICAgIC8vIHRoZSBuZXh0IGNodW5rCisgICAgICB3aGlsZSAoY3VyQ2h1bmsgPT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKKyAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfKTsKKyAgICAgIH0KKyAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHByZXR0eSBob3NlZCBhdCB0aGlzIHN0YWdlLCByZXdpbmQgdGhlIGZpbGUgYmFjayB0byB0aGUgbGFzdCBzdWNjZXNzZnVsCisgICAgICAvLyBwb2ludCBhbmQgcHVudCBvbiB0aGUgZXJyb3IKKyAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pOworICAgICAgY3VycmVudEV2ZW50XyA9IE5VTEw7CisgICAgICBjaGFyIGVycm9yTXNnWzEwMjRdOworICAgICAgc3ByaW50ZihlcnJvck1zZywKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSBjb3JydXB0ZWQgYXQgb2Zmc2V0OiAlbHUiLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXRfICsgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKSk7CisKKyAgICAgIEdsb2JhbE91dHB1dChlcnJvck1zZyk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKGVycm9yTXNnKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBURmlsZVRyYW5zcG9ydDo6c2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgeworICBpZiAoZmRfIDw9IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlIG5vdCBvcGVuIik7CisgIH0KKworICBpbnQzMl90IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworCisgIC8vIGZpbGUgaXMgZW1wdHksIHNlZWtpbmcgdG8gY2h1bmsgaXMgcG9pbnRsZXNzCisgIGlmIChudW1DaHVua3MgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIG5lZ2F0aXZlIGluZGljYXRlcyByZXZlcnNlIHNlZWsgKGZyb20gdGhlIGVuZCkKKyAgaWYgKGNodW5rIDwgMCkgeworICAgIGNodW5rICs9IG51bUNodW5rczsKKyAgfQorCisgIC8vIHRvbyBsYXJnZSBhIHZhbHVlIGZvciByZXZlcnNlIHNlZWssIGp1c3Qgc2VlayB0byBiZWdpbm5pbmcKKyAgaWYgKGNodW5rIDwgMCkgeworICAgIFRfREVCVUcoIiVzIiwgIkluY29ycmVjdCB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLiBTZWVraW5nIHRvIGJlZ2lubmluZy4uLiIpOworICAgIGNodW5rID0gMDsKKyAgfQorCisgIC8vIGNhbm5vdCBzZWVrIHBhc3QgRU9GCisgIGJvb2wgc2Vla1RvRW5kID0gZmFsc2U7CisgIG9mZl90IG1pbkVuZE9mZnNldCA9IDA7CisgIGlmIChjaHVuayA+PSBudW1DaHVua3MpIHsKKyAgICBUX0RFQlVHKCIlcyIsICJUcnlpbmcgdG8gc2VlayBwYXN0IEVPRi4gU2Vla2luZyB0byBFT0YgaW5zdGVhZC4uLiIpOworICAgIHNlZWtUb0VuZCA9IHRydWU7CisgICAgY2h1bmsgPSBudW1DaHVua3MgLSAxOworICAgIC8vIHRoaXMgaXMgdGhlIG1pbiBvZmZzZXQgdG8gcHJvY2VzcyBldmVudHMgdGlsbAorICAgIG1pbkVuZE9mZnNldCA9IDo6VEhSSUZUX0xTRUVLKGZkXywgMCwgU0VFS19FTkQpOworICB9CisKKyAgb2ZmX3QgbmV3T2Zmc2V0ID0gb2ZmX3QoY2h1bmspICogY2h1bmtTaXplXzsKKyAgb2Zmc2V0XyA9IDo6VEhSSUZUX0xTRUVLKGZkXywgbmV3T2Zmc2V0LCBTRUVLX1NFVCk7CisgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgY3VycmVudEV2ZW50XyA9IE5VTEw7CisgIGlmIChvZmZzZXRfID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogbHNlZWsgZXJyb3IgaW4gc2Vla1RvQ2h1bmsiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogbHNlZWsgZXJyb3IgaW4gc2Vla1RvQ2h1bmsiKTsKKyAgfQorCisgIC8vIHNlZWsgdG8gRU9GIGlmIHVzZXIgd2FudGVkIHRvIGdvIHRvIGxhc3QgY2h1bmsKKyAgaWYgKHNlZWtUb0VuZCkgeworICAgIHVpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gZ2V0UmVhZFRpbWVvdXQoKTsKKyAgICBzZXRSZWFkVGltZW91dChOT19UQUlMX1JFQURfVElNRU9VVCk7CisgICAgLy8ga2VlcCBvbiByZWFkaW5nIHVudGkgdGhlIGxhc3QgZXZlbnQgYXQgcG9pbnQgb2Ygc2Vla0NodW5rIGNhbGwKKyAgICBzaGFyZWRfcHRyPGV2ZW50SW5mbz4gZXZlbnQ7CisgICAgd2hpbGUgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSA8IG1pbkVuZE9mZnNldCkgeworICAgICAgZXZlbnQucmVzZXQocmVhZEV2ZW50KCkpOworICAgICAgaWYgKGV2ZW50LmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9FbmQoKSB7CisgIHNlZWtUb0NodW5rKGdldE51bUNodW5rcygpKTsKK30KKwordWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIHsKKyAgaWYgKGZkXyA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdHJ1Y3QgVEhSSUZUX1NUQVQgZl9pbmZvOworICBpbnQgcnYgPSA6OlRIUklGVF9GU1RBVChmZF8sICZmX2luZm8pOworCisgIGlmIChydiA8IDApIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIChmc3RhdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoZl9pbmZvLnN0X3NpemUgPiAwKSB7CisgICAgc2l6ZV90IG51bUNodW5rcyA9ICgoZl9pbmZvLnN0X3NpemUpIC8gY2h1bmtTaXplXykgKyAxOworICAgIGlmIChudW1DaHVua3MgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRvbyBtYW55IGNodW5rcyIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtQ2h1bmtzKTsKKyAgfQorCisgIC8vIGVtcHR5IGZpbGUgaGFzIG5vIGNodW5rcworICByZXR1cm4gMDsKK30KKwordWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OmdldEN1ckNodW5rKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG9mZnNldF8gLyBjaHVua1NpemVfKTsKK30KKworLy8gVXRpbGl0eSBGdW5jdGlvbnMKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6Om9wZW5Mb2dGaWxlKCkgeworI2lmbmRlZiBfV0lOMzIKKyAgbW9kZV90IG1vZGUgPSByZWFkT25seV8gPyBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEggOiBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworICBpbnQgZmxhZ3MgPSByZWFkT25seV8gPyBPX1JET05MWSA6IE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKKyNlbHNlCisgIGludCBtb2RlID0gcmVhZE9ubHlfID8gX1NfSVJFQUQgOiBfU19JUkVBRCB8IF9TX0lXUklURTsKKyAgaW50IGZsYWdzID0gcmVhZE9ubHlfID8gX09fUkRPTkxZIDogX09fUkRXUiB8IF9PX0NSRUFUIHwgX09fQVBQRU5EOworI2VuZGlmCisgIGZkXyA9IDo6VEhSSUZUX09QRU4oZmlsZW5hbWVfLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKKyAgb2Zmc2V0XyA9IDA7CisKKyAgLy8gbWFrZSBzdXJlIG9wZW4gY2FsbCB3YXMgc3VjY2Vzc2Z1bAorICBpZiAoZmRfID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IG9wZW5Mb2dGaWxlKCkgOjpvcGVuKCkgZmlsZTogIiArIGZpbGVuYW1lXywgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgZmlsZW5hbWVfLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1ldmFsKiB0c19uZXh0X2ZsdXNoKSB7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkodHNfbmV4dF9mbHVzaCwgTlVMTCk7CisKKyAgdHNfbmV4dF9mbHVzaC0+dHZfdXNlYyArPSBmbHVzaE1heFVzXzsKKyAgaWYgKHRzX25leHRfZmx1c2gtPnR2X3VzZWMgPiAxMDAwMDAwKSB7CisgICAgbG9uZyBleHRyYV9zZWNzID0gdHNfbmV4dF9mbHVzaC0+dHZfdXNlYyAvIDEwMDAwMDA7CisgICAgdHNfbmV4dF9mbHVzaC0+dHZfdXNlYyAlPSAxMDAwMDAwOworICAgIHRzX25leHRfZmx1c2gtPnR2X3NlYyArPSBleHRyYV9zZWNzOworICB9Cit9CisKK1RGaWxlVHJhbnNwb3J0QnVmZmVyOjpURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKQorICA6IGJ1ZmZlck1vZGVfKFdSSVRFKSwgd3JpdGVQb2ludF8oMCksIHJlYWRQb2ludF8oMCksIHNpemVfKHNpemUpIHsKKyAgYnVmZmVyXyA9IG5ldyBldmVudEluZm8qIFtzaXplXTsKK30KKworVEZpbGVUcmFuc3BvcnRCdWZmZXI6On5URmlsZVRyYW5zcG9ydEJ1ZmZlcigpIHsKKyAgaWYgKGJ1ZmZlcl8pIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVQb2ludF87IGkrKykgeworICAgICAgZGVsZXRlIGJ1ZmZlcl9baV07CisgICAgfQorICAgIGRlbGV0ZVtdIGJ1ZmZlcl87CisgICAgYnVmZmVyXyA9IE5VTEw7CisgIH0KK30KKworYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6YWRkRXZlbnQoZXZlbnRJbmZvKiBldmVudCkgeworICBpZiAoYnVmZmVyTW9kZV8gPT0gUkVBRCkgeworICAgIEdsb2JhbE91dHB1dCgiVHJ5aW5nIHRvIHdyaXRlIHRvIGEgYnVmZmVyIGluIHJlYWQgbW9kZSIpOworICB9CisgIGlmICh3cml0ZVBvaW50XyA8IHNpemVfKSB7CisgICAgYnVmZmVyX1t3cml0ZVBvaW50XysrXSA9IGV2ZW50OworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIGJ1ZmZlciBpcyBmdWxsCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2V2ZW50SW5mbyogVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmdldE5leHQoKSB7CisgIGlmIChidWZmZXJNb2RlXyA9PSBXUklURSkgeworICAgIGJ1ZmZlck1vZGVfID0gUkVBRDsKKyAgfQorICBpZiAocmVhZFBvaW50XyA8IHdyaXRlUG9pbnRfKSB7CisgICAgcmV0dXJuIGJ1ZmZlcl9bcmVhZFBvaW50XysrXTsKKyAgfSBlbHNlIHsKKyAgICAvLyBubyBtb3JlIGVudHJpZXMKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjpyZXNldCgpIHsKKyAgaWYgKGJ1ZmZlck1vZGVfID09IFdSSVRFIHx8IHdyaXRlUG9pbnRfID4gcmVhZFBvaW50XykgeworICAgIFRfREVCVUcoIiVzIiwgIlJlc2V0dGluZyBhIGJ1ZmZlciB3aXRoIHVucmVhZCBlbnRyaWVzIik7CisgIH0KKyAgLy8gQ2xlYW4gdXAgdGhlIG9sZCBlbnRyaWVzCisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZVBvaW50XzsgaSsrKSB7CisgICAgZGVsZXRlIGJ1ZmZlcl9baV07CisgIH0KKyAgYnVmZmVyTW9kZV8gPSBXUklURTsKKyAgd3JpdGVQb2ludF8gPSAwOworICByZWFkUG9pbnRfID0gMDsKK30KKworYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6aXNGdWxsKCkgeworICByZXR1cm4gd3JpdGVQb2ludF8gPT0gc2l6ZV87Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmlzRW1wdHkoKSB7CisgIHJldHVybiB3cml0ZVBvaW50XyA9PSAwOworfQorCitURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKKworICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQorICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOworfQorCitURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7CisKKyAgLy8gZGVmYXVsdCB0aGUgb3V0cHV0IHRyYW5zcG9ydCB0byBhIG51bGwgdHJhbnNwb3J0IChjb21tb24gY2FzZSkKKyAgb3V0cHV0VHJhbnNwb3J0XyA9IHNoYXJlZF9wdHI8VE51bGxUcmFuc3BvcnQ+KG5ldyBUTnVsbFRyYW5zcG9ydCgpKTsKK30KKworVEZpbGVQcm9jZXNzb3I6OlRGaWxlUHJvY2Vzc29yKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSwKKyAgICBvdXRwdXRUcmFuc3BvcnRfKG91dHB1dFRyYW5zcG9ydCkgeworfQorCit2b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKSB7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKKworICAvLyBzZXQgdGhlIHJlYWQgdGltZW91dCB0byAwIGlmIHRhaWxpbmcgaXMgcmVxdWlyZWQKKyAgaW50MzJfdCBvbGRSZWFkVGltZW91dCA9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0UmVhZFRpbWVvdXQoKTsKKyAgaWYgKHRhaWwpIHsKKyAgICAvLyBzYXZlIG9sZCByZWFkIHRpbWVvdXQgc28gaXQgY2FuIGJlIHJlc3RvcmVkCisgICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChURmlsZVRyYW5zcG9ydDo6VEFJTF9SRUFEX1RJTUVPVVQpOworICB9CisKKyAgdWludDMyX3QgbnVtUHJvY2Vzc2VkID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKKyAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0CisgICAgdHJ5IHsKKyAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOworICAgICAgbnVtUHJvY2Vzc2VkKys7CisgICAgICBpZiAoKG51bUV2ZW50cyA+IDApICYmIChudW1Qcm9jZXNzZWQgPT0gbnVtRXZlbnRzKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYpIHsKKyAgICAgIGlmICghdGFpbCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0ZSkgeworICAgICAgY2VyciA8PCB0ZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIHJlc3RvcmUgb2xkIHJlYWQgdGltZW91dAorICBpZiAodGFpbCkgeworICAgIGlucHV0VHJhbnNwb3J0Xy0+c2V0UmVhZFRpbWVvdXQob2xkUmVhZFRpbWVvdXQpOworICB9Cit9CisKK3ZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3NDaHVuaygpIHsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOworCisgIHVpbnQzMl90IGN1ckNodW5rID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRDdXJDaHVuaygpOworCisgIHdoaWxlICgxKSB7CisgICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5CisgICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAorICAgIHRyeSB7CisgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKKyAgICAgIGlmIChjdXJDaHVuayAhPSBpbnB1dFRyYW5zcG9ydF8tPmdldEN1ckNodW5rKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYpIHsKKyAgICAgIGJyZWFrOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHRlKSB7CisgICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M3YmQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOworCisvLyBEYXRhIHBlcnRhaW5pbmcgdG8gYSBzaW5nbGUgZXZlbnQKK3R5cGVkZWYgc3RydWN0IGV2ZW50SW5mbyB7CisgIHVpbnQ4X3QqIGV2ZW50QnVmZl87CisgIHVpbnQzMl90IGV2ZW50U2l6ZV87CisgIHVpbnQzMl90IGV2ZW50QnVmZlBvc187CisKKyAgZXZlbnRJbmZvKCkgOiBldmVudEJ1ZmZfKE5VTEwpLCBldmVudFNpemVfKDApLCBldmVudEJ1ZmZQb3NfKDApe307CisgIH5ldmVudEluZm8oKSB7CisgICAgaWYgKGV2ZW50QnVmZl8pIHsKKyAgICAgIGRlbGV0ZVtdIGV2ZW50QnVmZl87CisgICAgfQorICB9Cit9IGV2ZW50SW5mbzsKKworLy8gaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCByZWFkIHN0YXRlCit0eXBlZGVmIHN0cnVjdCByZWFkU3RhdGUgeworICBldmVudEluZm8qIGV2ZW50XzsKKworICAvLyBrZWVwIHRyYWNrIG9mIGV2ZW50IHNpemUKKyAgdWludDhfdCBldmVudFNpemVCdWZmX1s0XTsKKyAgdWludDhfdCBldmVudFNpemVCdWZmUG9zXzsKKyAgYm9vbCByZWFkaW5nU2l6ZV87CisKKyAgLy8gcmVhZCBidWZmZXIgdmFyaWFibGVzCisgIGludDMyX3QgYnVmZmVyUHRyXzsKKyAgaW50MzJfdCBidWZmZXJMZW5fOworCisgIC8vIGxhc3Qgc3VjY2Vzc2Z1bCBkaXNwYXRjaCBwb2ludAorICBpbnQzMl90IGxhc3REaXNwYXRjaFB0cl87CisKKyAgdm9pZCByZXNldFN0YXRlKHVpbnQzMl90IGxhc3REaXNwYXRjaFB0cikgeworICAgIHJlYWRpbmdTaXplXyA9IHRydWU7CisgICAgZXZlbnRTaXplQnVmZlBvc18gPSAwOworICAgIGxhc3REaXNwYXRjaFB0cl8gPSBsYXN0RGlzcGF0Y2hQdHI7CisgIH0KKworICB2b2lkIHJlc2V0QWxsVmFsdWVzKCkgeworICAgIHJlc2V0U3RhdGUoMCk7CisgICAgYnVmZmVyUHRyXyA9IDA7CisgICAgYnVmZmVyTGVuXyA9IDA7CisgICAgaWYgKGV2ZW50XykgeworICAgICAgZGVsZXRlIChldmVudF8pOworICAgIH0KKyAgICBldmVudF8gPSAwOworICB9CisKKyAgaW5saW5lIHVpbnQzMl90IGdldEV2ZW50U2l6ZSgpIHsKKyAgICBjb25zdCB2b2lkKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihldmVudFNpemVCdWZmXyk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oYnVmZmVyKTsKKyAgfQorCisgIHJlYWRTdGF0ZSgpIHsKKyAgICBldmVudF8gPSAwOworICAgIHJlc2V0QWxsVmFsdWVzKCk7CisgIH0KKworICB+cmVhZFN0YXRlKCkgeworICAgIGlmIChldmVudF8pIHsKKyAgICAgIGRlbGV0ZSAoZXZlbnRfKTsKKyAgICB9CisgIH0KKworfSByZWFkU3RhdGU7CisKKy8qKgorICogVEZpbGVUcmFuc3BvcnRCdWZmZXIgLSBidWZmZXIgY2xhc3MgdXNlZCBieSBURmlsZVRyYW5zcG9ydCBmb3IgcXVldWVpbmcgdXAgZXZlbnRzCisgKiB0byBiZSB3cml0dGVuIHRvIGRpc2suICBTaG91bGQgYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKKyAqICAxKSBCdWZmZXIgY3JlYXRlZAorICogIDIpIEJ1ZmZlciB3cml0dGVuIHRvIChhZGRFdmVudCkKKyAqICAzKSBCdWZmZXIgcmVhZCBmcm9tIChnZXROZXh0KQorICogIDQpIEJ1ZmZlciByZXNldCAocmVzZXQpCisgKiAgNSkgR28gYmFjayB0byAyLCBvciBkZXN0cm95IGJ1ZmZlcgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4gdG8gYWZ0ZXIgaXQgaXMgcmVhZCBmcm9tLCB1bmxlc3MgaXQgaXMgcmVzZXQgZmlyc3QuCisgKiBOb3RlOiBUaGUgYWJvdmUgcnVsZXMgYXJlIGVuZm9yY2VkIG1haW5seSBmb3IgZGVidWdnaW5nIGl0cyBzb2xlIGNsaWVudCBURmlsZVRyYW5zcG9ydAorICogICAgICAgd2hpY2ggdXNlcyB0aGUgYnVmZmVyIGluIHRoaXMgd2F5LgorICoKKyAqLworY2xhc3MgVEZpbGVUcmFuc3BvcnRCdWZmZXIgeworcHVibGljOgorICBURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKTsKKyAgflRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7CisKKyAgYm9vbCBhZGRFdmVudChldmVudEluZm8qIGV2ZW50KTsKKyAgZXZlbnRJbmZvKiBnZXROZXh0KCk7CisgIHZvaWQgcmVzZXQoKTsKKyAgYm9vbCBpc0Z1bGwoKTsKKyAgYm9vbCBpc0VtcHR5KCk7CisKK3ByaXZhdGU6CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7IC8vIHNob3VsZCBub3QgYmUgdXNlZAorCisgIGVudW0gbW9kZSB7IFdSSVRFLCBSRUFEIH07CisgIG1vZGUgYnVmZmVyTW9kZV87CisKKyAgdWludDMyX3Qgd3JpdGVQb2ludF87CisgIHVpbnQzMl90IHJlYWRQb2ludF87CisgIHVpbnQzMl90IHNpemVfOworICBldmVudEluZm8qKiBidWZmZXJfOworfTsKKworLyoqCisgKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRyYW5zcG9ydHMgdXNlZCB0byByZWFkIGZpbGVzCisgKi8KK2NsYXNzIFRGaWxlUmVhZGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHZpcnR1YWwgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bUNodW5rcygpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDdXJDaHVuaygpID0gMDsKKyAgdmlydHVhbCB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspID0gMDsKKyAgdmlydHVhbCB2b2lkIHNlZWtUb0VuZCgpID0gMDsKK307CisKKy8qKgorICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB0cmFuc3BvcnRzIHVzZWQgdG8gd3JpdGUgZmlsZXMKKyAqLworY2xhc3MgVEZpbGVXcml0ZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDaHVua1NpemUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZXRDaHVua1NpemUodWludDMyX3QgY2h1bmtTaXplKSA9IDA7Cit9OworCisvKioKKyAqIEZpbGUgaW1wbGVtZW50YXRpb24gb2YgYSB0cmFuc3BvcnQuIFJlYWRzIGFuZCB3cml0ZXMgYXJlIGRvbmUgdG8gYQorICogZmlsZSBvbiBkaXNrLgorICoKKyAqLworY2xhc3MgVEZpbGVUcmFuc3BvcnQgOiBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQsIHB1YmxpYyBURmlsZVdyaXRlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRGaWxlVHJhbnNwb3J0KHN0ZDo6c3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHkgPSBmYWxzZSk7CisgIH5URmlsZVRyYW5zcG9ydCgpOworCisgIC8vIFRPRE86IHdoYXQgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3VyIGZvciB0aGlzPworICAvLyB0aGUgbG9nIGZpbGUgaXMgZ2VuZXJhbGx5IGFsd2F5cyBvcGVuCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2b2lkIGZsdXNoKCk7CisKKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICBib29sIHBlZWsoKTsKKworICAvLyBsb2ctZmlsZSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKKyAgdm9pZCBzZWVrVG9FbmQoKTsKKyAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCk7CisgIHVpbnQzMl90IGdldEN1ckNodW5rKCk7CisKKyAgLy8gZm9yIGNoYW5naW5nIHRoZSBvdXRwdXQgZmlsZQorICB2b2lkIHJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBvZmZfdCBvZmZzZXQpOworCisgIC8vIFNldHRlci9HZXR0ZXIgZnVuY3Rpb25zIGZvciB1c2VyLWNvbnRyb2xsYWJsZSBvcHRpb25zCisgIHZvaWQgc2V0UmVhZEJ1ZmZTaXplKHVpbnQzMl90IHJlYWRCdWZmU2l6ZSkgeworICAgIGlmIChyZWFkQnVmZlNpemUpIHsKKyAgICAgIHJlYWRCdWZmU2l6ZV8gPSByZWFkQnVmZlNpemU7CisgICAgfQorICB9CisgIHVpbnQzMl90IGdldFJlYWRCdWZmU2l6ZSgpIHsgcmV0dXJuIHJlYWRCdWZmU2l6ZV87IH0KKworICBzdGF0aWMgY29uc3QgaW50MzJfdCBUQUlMX1JFQURfVElNRU9VVCA9IC0xOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBOT19UQUlMX1JFQURfVElNRU9VVCA9IDA7CisgIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgeyByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsgfQorICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgeyByZXR1cm4gcmVhZFRpbWVvdXRfOyB9CisKKyAgdm9pZCBzZXRDaHVua1NpemUodWludDMyX3QgY2h1bmtTaXplKSB7CisgICAgaWYgKGNodW5rU2l6ZSkgeworICAgICAgY2h1bmtTaXplXyA9IGNodW5rU2l6ZTsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgeyByZXR1cm4gY2h1bmtTaXplXzsgfQorCisgIHZvaWQgc2V0RXZlbnRCdWZmZXJTaXplKHVpbnQzMl90IGJ1ZmZlclNpemUpIHsKKyAgICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7CisgICAgICBHbG9iYWxPdXRwdXQoIkNhbm5vdCBjaGFuZ2UgdGhlIGJ1ZmZlciBzaXplIGFmdGVyIHdyaXRlciB0aHJlYWQgc3RhcnRlZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBldmVudEJ1ZmZlclNpemVfID0gYnVmZmVyU2l6ZTsKKyAgfQorCisgIHVpbnQzMl90IGdldEV2ZW50QnVmZmVyU2l6ZSgpIHsgcmV0dXJuIGV2ZW50QnVmZmVyU2l6ZV87IH0KKworICB2b2lkIHNldEZsdXNoTWF4VXModWludDMyX3QgZmx1c2hNYXhVcykgeworICAgIGlmIChmbHVzaE1heFVzKSB7CisgICAgICBmbHVzaE1heFVzXyA9IGZsdXNoTWF4VXM7CisgICAgfQorICB9CisgIHVpbnQzMl90IGdldEZsdXNoTWF4VXMoKSB7IHJldHVybiBmbHVzaE1heFVzXzsgfQorCisgIHZvaWQgc2V0Rmx1c2hNYXhCeXRlcyh1aW50MzJfdCBmbHVzaE1heEJ5dGVzKSB7CisgICAgaWYgKGZsdXNoTWF4Qnl0ZXMpIHsKKyAgICAgIGZsdXNoTWF4Qnl0ZXNfID0gZmx1c2hNYXhCeXRlczsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0Rmx1c2hNYXhCeXRlcygpIHsgcmV0dXJuIGZsdXNoTWF4Qnl0ZXNfOyB9CisKKyAgdm9pZCBzZXRNYXhFdmVudFNpemUodWludDMyX3QgbWF4RXZlbnRTaXplKSB7IG1heEV2ZW50U2l6ZV8gPSBtYXhFdmVudFNpemU7IH0KKyAgdWludDMyX3QgZ2V0TWF4RXZlbnRTaXplKCkgeyByZXR1cm4gbWF4RXZlbnRTaXplXzsgfQorCisgIHZvaWQgc2V0TWF4Q29ycnVwdGVkRXZlbnRzKHVpbnQzMl90IG1heENvcnJ1cHRlZEV2ZW50cykgeworICAgIG1heENvcnJ1cHRlZEV2ZW50c18gPSBtYXhDb3JydXB0ZWRFdmVudHM7CisgIH0KKyAgdWludDMyX3QgZ2V0TWF4Q29ycnVwdGVkRXZlbnRzKCkgeyByZXR1cm4gbWF4Q29ycnVwdGVkRXZlbnRzXzsgfQorCisgIHZvaWQgc2V0RW9mU2xlZXBUaW1lVXModWludDMyX3QgZW9mU2xlZXBUaW1lKSB7CisgICAgaWYgKGVvZlNsZWVwVGltZSkgeworICAgICAgZW9mU2xlZXBUaW1lXyA9IGVvZlNsZWVwVGltZTsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0RW9mU2xlZXBUaW1lVXMoKSB7IHJldHVybiBlb2ZTbGVlcFRpbWVfOyB9CisKKyAgLyoKKyAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCisgICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0CisgICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQorCitwcml2YXRlOgorICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciB3cml0aW5nIHRvIGEgZmlsZQorICB2b2lkIGVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuKTsKKyAgYm9vbCBzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1ldmFsKiBkZWFkbGluZSk7CisgIGJvb2wgaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCk7CisKKyAgLy8gY29udHJvbCBmb3Igd3JpdGVyIHRocmVhZAorICBzdGF0aWMgdm9pZCogc3RhcnRXcml0ZXJUaHJlYWQodm9pZCogcHRyKSB7CisgICAgc3RhdGljX2Nhc3Q8VEZpbGVUcmFuc3BvcnQqPihwdHIpLT53cml0ZXJUaHJlYWQoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkIHdyaXRlclRocmVhZCgpOworCisgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgZnJvbSBhIGZpbGUKKyAgZXZlbnRJbmZvKiByZWFkRXZlbnQoKTsKKworICAvLyBldmVudCBjb3JydXB0aW9uLXJlbGF0ZWQgZnVuY3Rpb25zCisgIGJvb2wgaXNFdmVudENvcnJ1cHRlZCgpOworICB2b2lkIHBlcmZvcm1SZWNvdmVyeSgpOworCisgIC8vIFV0aWxpdHkgZnVuY3Rpb25zCisgIHZvaWQgb3BlbkxvZ0ZpbGUoKTsKKyAgdm9pZCBnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1ldmFsKiB0c19uZXh0X2ZsdXNoKTsKKworICAvLyBDbGFzcyB2YXJpYWJsZXMKKyAgcmVhZFN0YXRlIHJlYWRTdGF0ZV87CisgIHVpbnQ4X3QqIHJlYWRCdWZmXzsKKyAgZXZlbnRJbmZvKiBjdXJyZW50RXZlbnRfOworCisgIHVpbnQzMl90IHJlYWRCdWZmU2l6ZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1JFQURfQlVGRl9TSVpFID0gMSAqIDEwMjQgKiAxMDI0OworCisgIGludDMyX3QgcmVhZFRpbWVvdXRfOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1JFQURfVElNRU9VVF9NUyA9IDIwMDsKKworICAvLyBzaXplIG9mIGNodW5rcyB0aGF0IGZpbGUgd2lsbCBiZSBzcGxpdCB1cCBpbnRvCisgIHVpbnQzMl90IGNodW5rU2l6ZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0NIVU5LX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0OworCisgIC8vIHNpemUgb2YgZXZlbnQgYnVmZmVycworICB1aW50MzJfdCBldmVudEJ1ZmZlclNpemVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSA9IDEwMDAwOworCisgIC8vIG1heCBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRoYXQgY2FuIHBhc3Mgd2l0aG91dCBmbHVzaGluZworICB1aW50MzJfdCBmbHVzaE1heFVzXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRkxVU0hfTUFYX1VTID0gMzAwMDAwMDsKKworICAvLyBtYXggbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gd2l0aG91dCBmbHVzaGluZworICB1aW50MzJfdCBmbHVzaE1heEJ5dGVzXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTID0gMTAwMCAqIDEwMjQ7CisKKyAgLy8gbWF4IGV2ZW50IHNpemUKKyAgdWludDMyX3QgbWF4RXZlbnRTaXplXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfTUFYX0VWRU5UX1NJWkUgPSAwOworCisgIC8vIG1heCBudW1iZXIgb2YgY29ycnVwdGVkIGV2ZW50cyBwZXIgY2h1bmsKKyAgdWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMgPSAwOworCisgIC8vIHNsZWVwIGR1cmF0aW9uIHdoZW4gRU9GIGlzIGhpdAorICB1aW50MzJfdCBlb2ZTbGVlcFRpbWVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUyA9IDUwMCAqIDEwMDA7CisKKyAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBhIGNvcnJ1cHRlZCBldmVudCBpcyBlbmNvdW50ZXJlZAorICB1aW50MzJfdCBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTID0gMSAqIDEwMDAgKiAxMDAwOworCisgIC8vIHNsZWVwIGR1cmF0aW9uIGluIHNlY29uZHMgd2hlbiBhbiBJTyBlcnJvciBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgd3JpdGVyIHRocmVhZAorICB1aW50MzJfdCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTID0gNjAgKiAxMDAwICogMTAwMDsKKworICAvLyB3cml0ZXIgdGhyZWFkCisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHdyaXRlclRocmVhZF87CisKKyAgLy8gYnVmZmVycyB0byBob2xkIGRhdGEgYmVmb3JlIGl0IGlzIGZsdXNoZWQuIEVhY2ggZWxlbWVudCBvZiB0aGUgYnVmZmVyIHN0b3JlcyBhIG1zZyB0aGF0CisgIC8vIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUuICBUaGUgYnVmZmVycyBhcmUgc3dhcHBlZCBieSB0aGUgd3JpdGVyIHRocmVhZC4KKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIGRlcXVldWVCdWZmZXJfOworICBURmlsZVRyYW5zcG9ydEJ1ZmZlciogZW5xdWV1ZUJ1ZmZlcl87CisKKyAgLy8gY29uZGl0aW9ucyB1c2VkIHRvIGJsb2NrIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsIG9yIGVtcHR5CisgIE1vbml0b3Igbm90RnVsbF8sIG5vdEVtcHR5XzsKKyAgc3RkOjphdG9taWM8Ym9vbD4gY2xvc2luZ187CisKKyAgLy8gVG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBidWZmZXIgaGFzIGJlZW4gZmx1c2hlZAorICBNb25pdG9yIGZsdXNoZWRfOworICBzdGQ6OmF0b21pYzxib29sPiBmb3JjZUZsdXNoXzsKKworICAvLyBNdXRleCB0aGF0IGlzIGdyYWJiZWQgd2hlbiBlbnF1ZXVlaW5nIGFuZCBzd2FwcGluZyB0aGUgcmVhZC93cml0ZSBidWZmZXJzCisgIE11dGV4IG11dGV4XzsKKworICAvLyBGaWxlIGluZm9ybWF0aW9uCisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKKyAgaW50IGZkXzsKKworICAvLyBXaGV0aGVyIHRoZSB3cml0ZXIgdGhyZWFkIGFuZCBidWZmZXJzIGhhdmUgYmVlbiBpbml0aWFsaXplZAorICBib29sIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXzsKKworICAvLyBPZmZzZXQgd2l0aGluIHRoZSBmaWxlCisgIG9mZl90IG9mZnNldF87CisKKyAgLy8gZXZlbnQgY29ycnVwdGlvbiBpbmZvcm1hdGlvbgorICB1aW50MzJfdCBsYXN0QmFkQ2h1bmtfOworICB1aW50MzJfdCBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXzsKKworICBib29sIHJlYWRPbmx5XzsKK307CisKKy8vIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBFT0YgaXMgaGl0CitjbGFzcyBURU9GRXhjZXB0aW9uIDogcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24geworcHVibGljOgorICBURU9GRXhjZXB0aW9uKCkgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKXt9OworfTsKKworLy8gd3JhcHBlciBjbGFzcyB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIGEgZmlsZSBjb250YWluaW5nIHRocmlmdCBldmVudHMKK2NsYXNzIFRGaWxlUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgZGVmYXVsdHMgb3V0cHV0IHRyYW5zcG9ydCB0byBudWxsIHRyYW5zcG9ydAorICAgKgorICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKKyAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5CisgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBmaWxlIHRyYW5zcG9ydAorICAgKi8KKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CisKKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHByb2Nlc3NvciBwcm9jZXNzZXMgbG9nLWZpbGUgZXZlbnRzCisgICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQorICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgaW5wdXQgZmlsZSB0cmFuc3BvcnQKKyAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgdHJhbnNwb3J0CisgICAqLworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KTsKKworICAvKioKKyAgICogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIHRoZSBmaWxlCisgICAqCisgICAqIEBwYXJhbSBudW1FdmVudHMgbnVtYmVyIG9mIGV2ZW50cyB0byBwcm9jZXNzICgwIGZvciB1bmxpbWl0ZWQpCisgICAqIEBwYXJhbSB0YWlsIHRhaWxzIHRoZSBmaWxlIGlmIHRydWUKKyAgICovCisgIHZvaWQgcHJvY2Vzcyh1aW50MzJfdCBudW1FdmVudHMsIGJvb2wgdGFpbCk7CisKKyAgLyoqCisgICAqIHByb2Nlc3MgZXZlbnRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNodW5rCisgICAqCisgICAqLworICB2b2lkIHByb2Nlc3NDaHVuaygpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfCisKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDg0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWSB8fCBjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUKSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8tPnJlYWQoYnVmLCBsZW4pOworICB9CisKKyAgcmV0dXJuIFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRTbG93KGJ1ZiwgbGVuKTsKK30KKwordWludDE2X3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0UHJvdG9jb2xJZCgpIGNvbnN0IHsKKyAgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSkgeworICAgIHJldHVybiBwcm90b0lkOworICB9IGVsc2UgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1QpIHsKKyAgICByZXR1cm4gVF9DT01QQUNUX1BST1RPQ09MOworICB9IGVsc2UgeworICAgIHJldHVybiBUX0JJTkFSWV9QUk9UT0NPTDsgLy8gQXNzdW1lIG90aGVyIHRyYW5zcG9ydHMgdXNlIFRCaW5hcnkKKyAgfQorfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OmVuc3VyZVJlYWRCdWZmZXIodWludDMyX3Qgc3opIHsKKyAgaWYgKHN6ID4gckJ1ZlNpemVfKSB7CisgICAgckJ1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbc3pdKTsKKyAgICByQnVmU2l6ZV8gPSBzejsKKyAgfQorfQorCitib29sIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRGcmFtZSgpIHsKKyAgLy8gc3pOIGlzIG5ldHdvcmsgYnl0ZSBvcmRlciBvZiBzegorICB1aW50MzJfdCBzek47CisgIHVpbnQzMl90IHN6OworCisgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIG5leHQgZnJhbWUuCisgIC8vIFdlIGNhbid0IHVzZSByZWFkQWxsKCZzeiwgc2l6ZW9mKHN6KSksIHNpbmNlIHRoYXQgYWx3YXlzIHRocm93cyBhbgorICAvLyBleGNlcHRpb24gb24gRU9GLiAgV2Ugd2FudCB0byB0aHJvdyBhbiBleGNlcHRpb24gb25seSBpZiBFT0Ygb2NjdXJzIGFmdGVyCisgIC8vIHBhcnRpYWwgc2l6ZSBkYXRhLgorICB1aW50MzJfdCBzaXplQnl0ZXNSZWFkID0gMDsKKyAgd2hpbGUgKHNpemVCeXRlc1JlYWQgPCBzaXplb2Yoc3pOKSkgeworICAgIHVpbnQ4X3QqIHN6cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzek4pICsgc2l6ZUJ5dGVzUmVhZDsKKyAgICB1aW50MzJfdCBieXRlc1JlYWQgPSB0cmFuc3BvcnRfLT5yZWFkKHN6cCwgc2l6ZW9mKHN6TikgLSBzaXplQnl0ZXNSZWFkKTsKKyAgICBpZiAoYnl0ZXNSZWFkID09IDApIHsKKyAgICAgIGlmIChzaXplQnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgLy8gRU9GIGJlZm9yZSBhbnkgZGF0YSB3YXMgcmVhZC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRU9GIGFmdGVyIGEgcGFydGlhbCBmcmFtZSBoZWFkZXIuICBSYWlzZSBhbiBleGNlcHRpb24uCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgZGF0YSB0byByZWFkIGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydGlhbCBmcmFtZSBoZWFkZXIuIik7CisgICAgICB9CisgICAgfQorICAgIHNpemVCeXRlc1JlYWQgKz0gYnl0ZXNSZWFkOworICB9CisKKyAgc3ogPSBudG9obChzek4pOworCisgIGVuc3VyZVJlYWRCdWZmZXIoNCk7CisKKyAgaWYgKChzeiAmIFRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl9NQVNLKSA9PSAodWludDMyX3QpVEJpbmFyeVByb3RvY29sOjpWRVJTSU9OXzEpIHsKKyAgICAvLyB1bmZyYW1lZAorICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5GUkFNRURfQklOQVJZOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJnN6Tiwgc2l6ZW9mKHN6TikpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDQpOworICB9IGVsc2UgaWYgKHN0YXRpY19jYXN0PGludDhfdD4oc3ogPj4gMjQpID09IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lECisgICAgICAgICAgICAgJiYgKHN0YXRpY19jYXN0PGludDhfdD4oc3ogPj4gMTYpICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgICAgICAgICA9PSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX04pIHsKKyAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1Q7CisgICAgbWVtY3B5KHJCdWZfLmdldCgpLCAmc3pOLCBzaXplb2Yoc3pOKSk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgNCk7CisgIH0gZWxzZSB7CisgICAgLy8gQ291bGQgYmUgaGVhZGVyIGZvcm1hdCBvciBmcmFtZWQuIENoZWNrIG5leHQgdWludDMyCisgICAgdWludDMyX3QgbWFnaWNfbjsKKyAgICB1aW50MzJfdCBtYWdpYzsKKworICAgIGlmIChzeiA+IE1BWF9GUkFNRV9TSVpFKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHRyYW5zcG9ydCBmcmFtZSBpcyB0b28gbGFyZ2UiKTsKKyAgICB9CisKKyAgICBlbnN1cmVSZWFkQnVmZmVyKHN6KTsKKworICAgIC8vIFdlIGNhbiB1c2UgcmVhZEFsbCBoZXJlLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGFuIGludmFsaWQgZnJhbWUgb3RoZXJ3aXNlCisgICAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmbWFnaWNfbiksIHNpemVvZihtYWdpY19uKSk7CisgICAgbWVtY3B5KHJCdWZfLmdldCgpLCAmbWFnaWNfbiwgc2l6ZW9mKG1hZ2ljX24pKTsKKyAgICBtYWdpYyA9IG50b2hsKG1hZ2ljX24pOworCisgICAgaWYgKChtYWdpYyAmIFRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl9NQVNLKSA9PSAodWludDMyX3QpVEJpbmFyeVByb3RvY29sOjpWRVJTSU9OXzEpIHsKKyAgICAgIC8vIGZyYW1lZAorICAgICAgY2xpZW50VHlwZSA9IFRIUklGVF9GUkFNRURfQklOQVJZOworICAgICAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyQnVmXy5nZXQoKSArIDQsIHN6IC0gNCk7CisgICAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1hZ2ljID4+IDI0KSA9PSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRAorICAgICAgICAgICAgICAgJiYgKHN0YXRpY19jYXN0PGludDhfdD4obWFnaWMgPj4gMTYpICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgID09IFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTikgeworICAgICAgY2xpZW50VHlwZSA9IFRIUklGVF9GUkFNRURfQ09NUEFDVDsKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSBpZiAoSEVBREVSX01BR0lDID09IChtYWdpYyAmIEhFQURFUl9NQVNLKSkgeworICAgICAgaWYgKHN6IDwgMTApIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHRyYW5zcG9ydCBmcmFtZSBpcyB0b28gc21hbGwiKTsKKyAgICAgIH0KKworICAgICAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyQnVmXy5nZXQoKSArIDQsIHN6IC0gNCk7CisKKyAgICAgIC8vIGhlYWRlciBmb3JtYXQKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFOworICAgICAgLy8gZmxhZ3MKKyAgICAgIGZsYWdzID0gbWFnaWMgJiBGTEFHU19NQVNLOworICAgICAgLy8gc2VxSWQKKyAgICAgIHVpbnQzMl90IHNlcUlkX247CisgICAgICBtZW1jcHkoJnNlcUlkX24sIHJCdWZfLmdldCgpICsgNCwgc2l6ZW9mKHNlcUlkX24pKTsKKyAgICAgIHNlcUlkID0gbnRvaGwoc2VxSWRfbik7CisgICAgICAvLyBoZWFkZXIgc2l6ZQorICAgICAgdWludDE2X3QgaGVhZGVyU2l6ZV9uOworICAgICAgbWVtY3B5KCZoZWFkZXJTaXplX24sIHJCdWZfLmdldCgpICsgOCwgc2l6ZW9mKGhlYWRlclNpemVfbikpOworICAgICAgdWludDE2X3QgaGVhZGVyU2l6ZSA9IG50b2hzKGhlYWRlclNpemVfbik7CisgICAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBzeik7CisgICAgICByZWFkSGVhZGVyRm9ybWF0KGhlYWRlclNpemUsIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTktOT1dOX0NMSUVOVF9UWVBFOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlY3QgY2xpZW50IHRyYW5zcG9ydCB0eXBlIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUmVhZHMgYSBzdHJpbmcgZnJvbSBwdHIsIHRha2luZyBjYXJlIG5vdCB0byByZWFjaCBoZWFkZXJCb3VuZGFyeQorICogQWR2YW5jZXMgcHRyIG9uIHN1Y2Nlc3MKKyAqCisgKiBAcGFyYW0gICBzdHIgICAgICAgICAgICAgb3V0cHV0IHN0cmluZworICogQHRocm93cyAgQ09SUlVQVEVEX0RBVEEgIGlmIHNpemUgb2Ygc3RyaW5nIGV4Y2VlZHMgYm91bmRhcnkKKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkU3RyaW5nKHVpbnQ4X3QqJiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovIHN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY29uc3QqIGhlYWRlckJvdW5kYXJ5KSB7CisgIGludDMyX3Qgc3RyTGVuOworCisgIHVpbnQzMl90IGJ5dGVzID0gcmVhZFZhcmludDMyKHB0ciwgJnN0ckxlbiwgaGVhZGVyQm91bmRhcnkpOworICBpZiAoc3RyTGVuID4gaGVhZGVyQm91bmRhcnkgLSBwdHIpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm8gaGVhZGVyIGxlbmd0aCBleGNlZWRzIGhlYWRlciBzaXplIik7CisgIH0KKyAgcHRyICs9IGJ5dGVzOworICBzdHIuYXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHB0ciksIHN0ckxlbik7CisgIHB0ciArPSBzdHJMZW47Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZEhlYWRlckZvcm1hdCh1aW50MTZfdCBoZWFkZXJTaXplLCB1aW50MzJfdCBzeikgeworICByZWFkVHJhbnNfLmNsZWFyKCk7ICAgLy8gQ2xlYXIgb3V0IGFueSBwcmV2aW91cyB0cmFuc2Zvcm1zLgorICByZWFkSGVhZGVyc18uY2xlYXIoKTsgLy8gQ2xlYXIgb3V0IGFueSBwcmV2aW91cyBoZWFkZXJzLgorCisgIC8vIHNraXAgb3ZlciBhbHJlYWR5IHByb2Nlc3NlZCBtYWdpYyg0KSwgc2VxSWQoNCksIGhlYWRlclNpemUoMikKKyAgdWludDhfdCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ockJ1Zl8uZ2V0KCkgKyAxMCk7CisKKyAgLy8gQ2F0Y2ggaW50ZWdlciBvdmVyZmxvdywgY2hlY2sgZm9yIHJlYXNvbmFibGUgaGVhZGVyIHNpemUKKyAgaWYgKGhlYWRlclNpemUgPj0gMTYzODQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzaXplIGlzIHVucmVhc29uYWJsZSIpOworICB9CisgIGhlYWRlclNpemUgKj0gNDsKKyAgY29uc3QgdWludDhfdCogY29uc3QgaGVhZGVyQm91bmRhcnkgPSBwdHIgKyBoZWFkZXJTaXplOworICBpZiAoaGVhZGVyU2l6ZSA+IHN6KSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbiBmcmFtZSIpOworICB9CisgIHVpbnQ4X3QqIGRhdGEgPSBwdHIgKyBoZWFkZXJTaXplOworICBwdHIgKz0gcmVhZFZhcmludDE2KHB0ciwgJnByb3RvSWQsIGhlYWRlckJvdW5kYXJ5KTsKKyAgaW50MTZfdCBudW1UcmFuc2Zvcm1zOworICBwdHIgKz0gcmVhZFZhcmludDE2KHB0ciwgJm51bVRyYW5zZm9ybXMsIGhlYWRlckJvdW5kYXJ5KTsKKworICAvLyBGb3Igbm93IGFsbCB0cmFuc2Zvcm1zIGNvbnNpc3Qgb2Ygb25seSB0aGUgSUQsIG5vdCBkYXRhLgorICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRyYW5zZm9ybXM7IGkrKykgeworICAgIGludDMyX3QgdHJhbnNJZDsKKyAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgJnRyYW5zSWQsIGhlYWRlckJvdW5kYXJ5KTsKKworICAgIHJlYWRUcmFuc18ucHVzaF9iYWNrKHRyYW5zSWQpOworICB9CisKKyAgLy8gSW5mbyBoZWFkZXJzCisgIHdoaWxlIChwdHIgPCBoZWFkZXJCb3VuZGFyeSkgeworICAgIGludDMyX3QgaW5mb0lkOworICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAmaW5mb0lkLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgICBpZiAoaW5mb0lkID09IDApIHsKKyAgICAgIC8vIGhlYWRlciBwYWRkaW5nCisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGluZm9JZCA+PSBpbmZvSWRUeXBlOjpFTkQpIHsKKyAgICAgIC8vIGNhbm5vdCBoYW5kbGUgaW5mb0lkCisgICAgICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChpbmZvSWQpIHsKKyAgICBjYXNlIGluZm9JZFR5cGU6OktFWVZBTFVFOgorICAgICAgLy8gUHJvY2VzcyBrZXktdmFsdWUgaGVhZGVycworICAgICAgdWludDMyX3QgbnVtS1ZIZWFkZXJzOworICAgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsIChpbnQzMl90KikmbnVtS1ZIZWFkZXJzLCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAvLyBjb250aW51ZSB1bnRpbCB3ZSByZWFjaCAocGFkZGVkKSBlbmQgb2YgcGFja2V0CisgICAgICB3aGlsZSAobnVtS1ZIZWFkZXJzLS0gJiYgcHRyIDwgaGVhZGVyQm91bmRhcnkpIHsKKyAgICAgICAgLy8gZm9ybWF0OiBrZXk7IHZhbHVlCisgICAgICAgIC8vIGJvdGg6IGxlbmd0aCAodmFyaW50MzIpOyB2YWx1ZSAoc3RyaW5nKQorICAgICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAgICAgcmVhZFN0cmluZyhwdHIsIGtleSwgaGVhZGVyQm91bmRhcnkpOworICAgICAgICAvLyB2YWx1ZQorICAgICAgICByZWFkU3RyaW5nKHB0ciwgdmFsdWUsIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgICAgLy8gc2F2ZSB0byBoZWFkZXJzCisgICAgICAgIHJlYWRIZWFkZXJzX1trZXldID0gdmFsdWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBVbnRyYW5zZm9ybSB0aGUgZGF0YSBzZWN0aW9uLiAgckJ1ZiB3aWxsIGNvbnRhaW4gcmVzdWx0LgorICB1bnRyYW5zZm9ybShkYXRhLCBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihzeikgLSAoZGF0YSAtIHJCdWZfLmdldCgpKSkpOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnVudHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKKyAgLy8gVXBkYXRlIHRoZSB0cmFuc2Zvcm0gYnVmZmVyIHNpemUgaWYgbmVlZGVkCisgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcigpOworCisgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWFkVHJhbnNfLmJlZ2luKCk7IGl0ICE9IHJlYWRUcmFuc18uZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCB1aW50MTZfdCB0cmFuc0lkID0gKml0OworCisgICAgaWYgKHRyYW5zSWQgPT0gWkxJQl9UUkFOU0ZPUk0pIHsKKyAgICAgIHpfc3RyZWFtIHN0cmVhbTsKKyAgICAgIGludCBlcnI7CisKKyAgICAgIHN0cmVhbS5uZXh0X2luID0gcHRyOworICAgICAgc3RyZWFtLmF2YWlsX2luID0gc3o7CisKKyAgICAgIC8vIFNldHRpbmcgdGhlc2UgdG8gMCBtZWFucyB1c2UgdGhlIGRlZmF1bHQgZnJlZS9hbGxvYyBmdW5jdGlvbnMKKyAgICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIGVyciA9IGluZmxhdGVJbml0KCZzdHJlYW0pOworICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHpsaWIgZGVmbGF0ZUluaXQiKTsKKyAgICAgIH0KKyAgICAgIHN0cmVhbS5uZXh0X291dCA9IHRCdWZfLmdldCgpOworICAgICAgc3RyZWFtLmF2YWlsX291dCA9IHRCdWZTaXplXzsKKyAgICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQgfHwgc3RyZWFtLmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHpsaWIgZGVmbGF0ZSIpOworICAgICAgfQorICAgICAgc3ogPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHpsaWIgZGVmbGF0ZUVuZCIpOworICAgICAgfQorCisgICAgICBtZW1jcHkocHRyLCB0QnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwgIlVua25vd24gdHJhbnNmb3JtIik7CisgICAgfQorICB9CisKKyAgc2V0UmVhZEJ1ZmZlcihwdHIsIHN6KTsKK30KKworLyoqCisgKiBXZSBtYXkgaGF2ZSB1cGRhdGVkIHRoZSB3QnVmIHNpemUsIHVwZGF0ZSB0aGUgdEJ1ZiBzaXplIHRvIG1hdGNoLgorICogU2hvdWxkIGJlIGNhbGxlZCBpbiB0cmFuc2Zvcm0uCisgKgorICogVGhlIGJ1ZmZlciBzaG91bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gd3JpdGUgYnVmZmVyIHNpemUgZHVlIHRvCisgKiBjb21wcmVzc2lvbiB0cmFuc2Zvcm1zICh0aGF0IG1heSBzbGlnaHRseSBncm93IG9uIHNtYWxsIGZyYW1lIHNpemVzKQorICovCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih1aW50MzJfdCBhZGRpdGlvbmFsU2l6ZSkgeworICBpZiAodEJ1ZlNpemVfIDwgd0J1ZlNpemVfICsgREVGQVVMVF9CVUZGRVJfU0laRSkgeworICAgIHVpbnQzMl90IG5ld19zaXplID0gd0J1ZlNpemVfICsgREVGQVVMVF9CVUZGRVJfU0laRSArIGFkZGl0aW9uYWxTaXplOworICAgIHVpbnQ4X3QqIG5ld19idWYgPSBuZXcgdWludDhfdFtuZXdfc2l6ZV07CisgICAgdEJ1Zl8ucmVzZXQobmV3X2J1Zik7CisgICAgdEJ1ZlNpemVfID0gbmV3X3NpemU7CisgIH0KK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp0cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeikgeworICAvLyBVcGRhdGUgdGhlIHRyYW5zZm9ybSBidWZmZXIgc2l6ZSBpZiBuZWVkZWQKKyAgcmVzaXplVHJhbnNmb3JtQnVmZmVyKCk7CisKKyAgZm9yICh2ZWN0b3I8dWludDE2X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHdyaXRlVHJhbnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgY29uc3QgdWludDE2X3QgdHJhbnNJZCA9ICppdDsKKworICAgIGlmICh0cmFuc0lkID09IFpMSUJfVFJBTlNGT1JNKSB7CisgICAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgICBpbnQgZXJyOworCisgICAgICBzdHJlYW0ubmV4dF9pbiA9IHB0cjsKKyAgICAgIHN0cmVhbS5hdmFpbF9pbiA9IHN6OworCisgICAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBlcnIgPSBkZWZsYXRlSW5pdCgmc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHpsaWIgZGVmbGF0ZUluaXQiKTsKKyAgICAgIH0KKyAgICAgIHVpbnQzMl90IHRidWZfc2l6ZSA9IDA7CisgICAgICB3aGlsZSAoZXJyID09IFpfT0spIHsKKyAgICAgICAgcmVzaXplVHJhbnNmb3JtQnVmZmVyKHRidWZfc2l6ZSk7CisKKyAgICAgICAgc3RyZWFtLm5leHRfb3V0ID0gdEJ1Zl8uZ2V0KCk7CisgICAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB0QnVmU2l6ZV87CisgICAgICAgIGVyciA9IGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgICAgICB0YnVmX3NpemUgKz0gREVGQVVMVF9CVUZGRVJfU0laRTsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgICAgZXJyID0gZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVFbmQiKTsKKyAgICAgIH0KKworICAgICAgbWVtY3B5KHB0ciwgdEJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwgIlVua25vd24gdHJhbnNmb3JtIik7CisgICAgfQorICB9CisKKyAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzejsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZXNldFByb3RvY29sKCkgeworICAvLyBTZXQgdG8gYW55dGhpbmcgZXhjZXB0IEhUVFAgdHlwZSBzbyB3ZSBkb24ndCBmbHVzaCBhZ2FpbgorICBjbGllbnRUeXBlID0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRTsKKworICAvLyBSZWFkIHRoZSBoZWFkZXIgYW5kIGRlY2lkZSB3aGljaCBwcm90b2NvbCB0byBnbyB3aXRoCisgIHJlYWRGcmFtZSgpOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRXcml0ZUJ5dGVzKCkgeworICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKK30KKworLyoqCisgKiBXcml0ZXMgYSBzdHJpbmcgdG8gYSBieXRlIGJ1ZmZlciwgYXMgc2l6ZSAodmFyaW50MzIpICsgc3RyaW5nIChub24tbnVsbAorICogdGVybWluYXRlZCkKKyAqIEF1dG9tYXRpY2FsbHkgYWR2YW5jZXMgcHRyIHRvIGFmdGVyIHRoZSB3cml0dGVuIHBvcnRpb24KKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp3cml0ZVN0cmluZyh1aW50OF90KiYgcHRyLCBjb25zdCBzdHJpbmcmIHN0cikgeworICBpbnQzMl90IHN0ckxlbiA9IHNhZmVfbnVtZXJpY19jYXN0PGludDMyX3Q+KHN0ci5sZW5ndGgoKSk7CisgIHB0ciArPSB3cml0ZVZhcmludDMyKHN0ckxlbiwgcHRyKTsKKyAgbWVtY3B5KHB0ciwgc3RyLmNfc3RyKCksIHN0ckxlbik7IC8vIG5vIG5lZWQgdG8gd3JpdGUgXDAKKyAgcHRyICs9IHN0ckxlbjsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpzZXRIZWFkZXIoY29uc3Qgc3RyaW5nJiBrZXksIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgd3JpdGVIZWFkZXJzX1trZXldID0gdmFsdWU7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldE1heFdyaXRlSGVhZGVyc1NpemUoKSBjb25zdCB7CisgIHNpemVfdCBtYXhXcml0ZUhlYWRlcnNTaXplID0gMDsKKyAgVEhlYWRlclRyYW5zcG9ydDo6U3RyaW5nVG9TdHJpbmdNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gd3JpdGVIZWFkZXJzXy5iZWdpbigpOyBpdCAhPSB3cml0ZUhlYWRlcnNfLmVuZCgpOyArK2l0KSB7CisgICAgLy8gYWRkIHNpemVzIG9mIGtleSBhbmQgdmFsdWUgdG8gbWF4V3JpdGVIZWFkZXJzU2l6ZQorICAgIC8vIDIgdmFyaW50czMyICsgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcworICAgIG1heFdyaXRlSGVhZGVyc1NpemUgKz0gNSArIDUgKyAoaXQtPmZpcnN0KS5sZW5ndGgoKSArIChpdC0+c2Vjb25kKS5sZW5ndGgoKTsKKyAgfQorICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KG1heFdyaXRlSGVhZGVyc1NpemUpOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OmNsZWFySGVhZGVycygpIHsKKyAgd3JpdGVIZWFkZXJzXy5jbGVhcigpOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OmZsdXNoKCkgeworICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLgorICB1aW50MzJfdCBoYXZlQnl0ZXMgPSBnZXRXcml0ZUJ5dGVzKCk7CisKKyAgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSkgeworICAgIHRyYW5zZm9ybSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgICBoYXZlQnl0ZXMgPSBnZXRXcml0ZUJ5dGVzKCk7IC8vIHRyYW5zZm9ybSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBzaXplCisgIH0KKworICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd0Jhc2VfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCk7CisKKyAgaWYgKGhhdmVCeXRlcyA+IE1BWF9GUkFNRV9TSVpFKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNlbmQgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UiKTsKKyAgfQorCisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICAvLyBoZWFkZXIgc2l6ZSB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBhdCB0aGUgZW5kIGJlY2F1c2Ugb2YgdmFyaW50cy4KKyAgICAvLyBNYWtlIGl0IGJpZyBlbm91Z2ggaGVyZSBmb3IgbWF4IHZhcmludCBzaXplLCBwbHVzIDQgZm9yIHBhZGRpbmcuCisgICAgdWludDMyX3QgaGVhZGVyU2l6ZSA9ICgyICsgZ2V0TnVtVHJhbnNmb3JtcygpKSAqIFRIUklGVF9NQVhfVkFSSU5UMzJfQllURVMgKyA0OworICAgIC8vIGFkZCBhcHByb3hpbWF0ZSBzaXplIG9mIGluZm8gaGVhZGVycworICAgIGhlYWRlclNpemUgKz0gZ2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpOworCisgICAgLy8gUGt0IHNpemUKKyAgICB1aW50MzJfdCBtYXhTekhibyA9IGhlYWRlclNpemUgKyBoYXZlQnl0ZXMgLy8gdGhyaWZ0IGhlYWRlciArIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgMTA7ICAgICAgICAgICAgICAgICAgLy8gY29tbW9uIGhlYWRlciBzZWN0aW9uCisgICAgdWludDhfdCogcGt0ID0gdEJ1Zl8uZ2V0KCk7CisgICAgdWludDhfdCogaGVhZGVyU3RhcnQ7CisgICAgdWludDhfdCogaGVhZGVyU2l6ZVB0cjsKKyAgICB1aW50OF90KiBwa3RTdGFydCA9IHBrdDsKKworICAgIGlmIChtYXhTekhibyA+IHRCdWZTaXplXykgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gaGVhZGVyIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlIik7CisgICAgfQorCisgICAgdWludDMyX3Qgc3pIYm87CisgICAgdWludDMyX3Qgc3pOYm87CisgICAgdWludDE2X3QgaGVhZGVyU2l6ZU47CisKKyAgICAvLyBGaXh1cCBzekhibyBsYXRlcgorICAgIHBrdCArPSBzaXplb2Yoc3pOYm8pOworICAgIHVpbnQxNl90IGhlYWRlck4gPSBodG9ucyhIRUFERVJfTUFHSUMgPj4gMTYpOworICAgIG1lbWNweShwa3QsICZoZWFkZXJOLCBzaXplb2YoaGVhZGVyTikpOworICAgIHBrdCArPSBzaXplb2YoaGVhZGVyTik7CisgICAgdWludDE2X3QgZmxhZ3NOID0gaHRvbnMoZmxhZ3MpOworICAgIG1lbWNweShwa3QsICZmbGFnc04sIHNpemVvZihmbGFnc04pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKGZsYWdzTik7CisgICAgdWludDMyX3Qgc2VxSWROID0gaHRvbmwoc2VxSWQpOworICAgIG1lbWNweShwa3QsICZzZXFJZE4sIHNpemVvZihzZXFJZE4pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKHNlcUlkTik7CisgICAgaGVhZGVyU2l6ZVB0ciA9IHBrdDsKKyAgICAvLyBGaXh1cCBoZWFkZXJTaXplTiBsYXRlcgorICAgIHBrdCArPSBzaXplb2YoaGVhZGVyU2l6ZU4pOworICAgIGhlYWRlclN0YXJ0ID0gcGt0OworCisgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIocHJvdG9JZCwgcGt0KTsKKyAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihnZXROdW1UcmFuc2Zvcm1zKCksIHBrdCk7CisKKyAgICAvLyBGb3Igbm93LCBlYWNoIHRyYW5zZm9ybSBpcyBvbmx5IHRoZSBJRCwgbm8gZm9sbG93aW5nIGRhdGEuCisgICAgZm9yICh2ZWN0b3I8dWludDE2X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHdyaXRlVHJhbnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMigqaXQsIHBrdCk7CisgICAgfQorCisgICAgLy8gd3JpdGUgaW5mbyBoZWFkZXJzCisKKyAgICAvLyBmb3Igbm93IG9ubHkgd3JpdGUga3YtaGVhZGVycworICAgIGludDMyX3QgaGVhZGVyQ291bnQgPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90Pih3cml0ZUhlYWRlcnNfLnNpemUoKSk7CisgICAgaWYgKGhlYWRlckNvdW50ID4gMCkgeworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoaW5mb0lkVHlwZTo6S0VZVkFMVUUsIHBrdCk7CisgICAgICAvLyBXcml0ZSBrZXktdmFsdWUgaGVhZGVycyBjb3VudAorICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGVhZGVyQ291bnQpLCBwa3QpOworICAgICAgLy8gV3JpdGUgaW5mbyBoZWFkZXJzCisgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdDsKKyAgICAgIGZvciAoaXQgPSB3cml0ZUhlYWRlcnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlSGVhZGVyc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgd3JpdGVTdHJpbmcocGt0LCBpdC0+Zmlyc3QpOyAgLy8ga2V5CisgICAgICAgIHdyaXRlU3RyaW5nKHBrdCwgaXQtPnNlY29uZCk7IC8vIHZhbHVlCisgICAgICB9CisgICAgICB3cml0ZUhlYWRlcnNfLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gRml4dXBzIGFmdGVyIHZhcmludCBzaXplIGNhbGN1bGF0aW9ucworICAgIGhlYWRlclNpemUgPSBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4ocGt0IC0gaGVhZGVyU3RhcnQpOworICAgIHVpbnQ4X3QgcGFkZGluZyA9IDQgLSAoaGVhZGVyU2l6ZSAlIDQpOworICAgIGhlYWRlclNpemUgKz0gcGFkZGluZzsKKworICAgIC8vIFBhZCBvdXQgcGt0IHdpdGggMHgwMAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFkZGluZzsgaSsrKSB7CisgICAgICAqKHBrdCsrKSA9IDB4MDA7CisgICAgfQorCisgICAgLy8gUGt0IHNpemUKKyAgICBwdHJkaWZmX3Qgc3pIYnAgPSAoaGVhZGVyU3RhcnQgLSBwa3RTdGFydCAtIDQpOworICAgIGlmIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3pIYnApID4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90PigpLm1heCkoKSkgLSAoaGVhZGVyU2l6ZSArIGhhdmVCeXRlcykpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2VjdGlvbiBzaXplIGlzIHVucmVhc29uYWJsZSIpOworICAgIH0KKyAgICBzekhibyA9IGhlYWRlclNpemUgKyBoYXZlQnl0ZXMgICAgICAgICAgLy8gdGhyaWZ0IGhlYWRlciArIHBheWxvYWQKKyAgICAgICAgICAgICsgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN6SGJwKTsgLy8gY29tbW9uIGhlYWRlciBzZWN0aW9uCisgICAgaGVhZGVyU2l6ZU4gPSBodG9ucyhoZWFkZXJTaXplIC8gNCk7CisgICAgbWVtY3B5KGhlYWRlclNpemVQdHIsICZoZWFkZXJTaXplTiwgc2l6ZW9mKGhlYWRlclNpemVOKSk7CisKKyAgICAvLyBTZXQgZnJhbWluZyBzaXplLgorICAgIHN6TmJvID0gaHRvbmwoc3pIYm8pOworICAgIG1lbWNweShwa3RTdGFydCwgJnN6TmJvLCBzaXplb2Yoc3pOYm8pKTsKKworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHBrdFN0YXJ0LCBzekhibyAtIGhhdmVCeXRlcyArIDQpOworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICB9IGVsc2UgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1QpIHsKKyAgICB1aW50MzJfdCBzekhibyA9ICh1aW50MzJfdCloYXZlQnl0ZXM7CisgICAgdWludDMyX3Qgc3pOYm8gPSBodG9ubChzekhibyk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOYm8pLCA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJVbmtub3duIGNsaWVudCB0eXBlIik7CisgIH0KKworICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgIG91dFRyYW5zcG9ydF8tPmZsdXNoKCk7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDMgYnl0ZXMuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRWYXJpbnQxNih1aW50OF90IGNvbnN0KiBwdHIsIGludDE2X3QqIGkxNiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpIHsKKyAgaW50MzJfdCB2YWw7CisgIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHB0ciwgJnZhbCwgYm91bmRhcnkpOworICAqaTE2ID0gKGludDE2X3QpdmFsOworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRWYXJpbnQzMih1aW50OF90IGNvbnN0KiBwdHIsIGludDMyX3QqIGkzMiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpIHsKKworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIHVpbnQzMl90IHZhbCA9IDA7CisgIGludCBzaGlmdCA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAocHRyID09IGJvdW5kYXJ5KSB7CisgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5aW5nIHRvIHJlYWQgcGFzdCBoZWFkZXIgYm91bmRhcnkiKTsKKyAgICB9CisgICAgdWludDhfdCBieXRlID0gKihwdHIrKyk7CisgICAgcnNpemUrKzsKKyAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICppMzIgPSB2YWw7CisgICAgICByZXR1cm4gcnNpemU7CisgICAgfQorICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAqLwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVWYXJpbnQzMihpbnQzMl90IG4sIHVpbnQ4X3QqIHBrdCkgeworICB1aW50OF90IGJ1Zls1XTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIC8vIENhbGxlciB3aWxsIGFkdmFuY2UgcGt0LgorICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3NpemU7IGkrKykgeworICAgIHBrdFtpXSA9IGJ1ZltpXTsKKyAgfQorCisgIHJldHVybiB3c2l6ZTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVWYXJpbnQxNihpbnQxNl90IG4sIHVpbnQ4X3QqIHBrdCkgeworICByZXR1cm4gd3JpdGVWYXJpbnQzMihuLCBwa3QpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YzU3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UUkFOU1BPUlRfVEhFQURFUlRSQU5TUE9SVF9IXworI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworZW51bSBDTElFTlRfVFlQRSB7CisgIFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUgPSAwLAorICBUSFJJRlRfRlJBTUVEX0JJTkFSWSA9IDEsCisgIFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgPSAyLAorICBUSFJJRlRfRlJBTUVEX0NPTVBBQ1QgPSAzLAorICBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCA9IDQsCisgIFRIUklGVF9VTktOT1dOX0NMSUVOVF9UWVBFID0gNSwKK307CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NPTVBBQ1RfUFJPVE9DT0w7CisKKy8qKgorICogSGVhZGVyIHRyYW5zcG9ydC4gQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMKKyAqIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlCisgKiBiaW5hcnkgY2h1bmsgZm9sbG93ZWQgYnkgdGhlIGRhdGEgcGF5bG9hZC4gVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIG9uIHRoZQorICogb3RoZXIgZW5kIHRvIGFsd2F5cyBkbyBmaXhlZC1sZW5ndGggcmVhZHMuCisgKgorICogU3ViY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBiZWNhdXNlIG1vc3Qgb2YgdGhlIHJlYWQvd3JpdGUgbWV0aG9kcyBhcmUgc2ltaWxhcgorICogYW5kIG5lZWQgc2ltaWxhciBidWZmZXJzLiAgTWFqb3IgY2hhbmdlcyBhcmUgcmVhZEZyYW1lICYgZmx1c2guCisgKgorICogSGVhZGVyIFRyYW5zcG9ydCAqbXVzdCogYmUgdGhlIHNhbWUgdHJhbnNwb3J0IGZvciBib3RoIGlucHV0IGFuZAorICogb3V0cHV0IHdoZW4gdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUgLSBjbGllbnQgcmVzcG9uc2VzIHNob3VsZCBiZQorICogdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhvc2UgaW4gdGhlIHJlcXVlc3QuCisgKi8KK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEhlYWRlclRyYW5zcG9ydCwgVEZyYW1lZFRyYW5zcG9ydD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTJ1OworICBzdGF0aWMgY29uc3QgaW50IFRIUklGVF9NQVhfVkFSSU5UMzJfQllURVMgPSA1OworCisgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCisgIGV4cGxpY2l0IFRIZWFkZXJUcmFuc3BvcnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQpCisgICAgOiBUVmlydHVhbFRyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgb3V0VHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgcHJvdG9JZChUX0NPTVBBQ1RfUFJPVE9DT0wpLAorICAgICAgY2xpZW50VHlwZShUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSwKKyAgICAgIHNlcUlkKDApLAorICAgICAgZmxhZ3MoMCksCisgICAgICB0QnVmU2l6ZV8oMCksCisgICAgICB0QnVmXyhOVUxMKSB7CisgICAgaWYgKCF0cmFuc3BvcnRfKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoInRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGluaXRCdWZmZXJzKCk7CisgIH0KKworICBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpblRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0KQorICAgIDogVFZpcnR1YWxUcmFuc3BvcnQoaW5UcmFuc3BvcnQpLAorICAgICAgb3V0VHJhbnNwb3J0XyhvdXRUcmFuc3BvcnQpLAorICAgICAgcHJvdG9JZChUX0NPTVBBQ1RfUFJPVE9DT0wpLAorICAgICAgY2xpZW50VHlwZShUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSwKKyAgICAgIHNlcUlkKDApLAorICAgICAgZmxhZ3MoMCksCisgICAgICB0QnVmU2l6ZV8oMCksCisgICAgICB0QnVmXyhOVUxMKSB7CisgICAgaWYgKCF0cmFuc3BvcnRfKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoImluVHJhbnNwb3J0IGlzIGVtcHR5Iik7CisgICAgaWYgKCFvdXRUcmFuc3BvcnRfKSB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIm91dFRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGluaXRCdWZmZXJzKCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKKyAgdm9pZCByZXNpemVUcmFuc2Zvcm1CdWZmZXIodWludDMyX3QgYWRkaXRpb25hbFNpemUgPSAwKTsKKworICB1aW50MTZfdCBnZXRQcm90b2NvbElkKCkgY29uc3Q7CisgIHZvaWQgc2V0UHJvdG9jb2xJZCh1aW50MTZfdCBwcm90b0lkKSB7IHRoaXMtPnByb3RvSWQgPSBwcm90b0lkOyB9CisKKyAgdm9pZCByZXNldFByb3RvY29sKCk7CisKKyAgLyoqCisgICAqIFdlIGtub3cgd2UgZ290IGEgcGFja2V0IGluIGhlYWRlciBmb3JtYXQgaGVyZSwgdHJ5IHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICoKKyAgICogQHBhcmFtIGhlYWRlclNpemUgc2l6ZSBvZiB0aGUgaGVhZGVyIHBvcnRpb24KKyAgICogQHBhcmFtIHN6IFNpemUgb2YgdGhlIHdob2xlIG1lc3NhZ2UsIGluY2x1ZGluZyBoZWFkZXIKKyAgICovCisgIHZvaWQgcmVhZEhlYWRlckZvcm1hdCh1aW50MTZfdCBoZWFkZXJTaXplLCB1aW50MzJfdCBzeik7CisKKyAgLyoqCisgICAqIFVudHJhbnNmb3JtIHRoZSBkYXRhIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBoZWFkZXIgZmxhZ3MKKyAgICogT24gY29uY2x1c2lvbiBvZiBmdW5jdGlvbiwgc2V0UmVhZEJ1ZmZlciBpcyBjYWxsZWQgd2l0aCB0aGUKKyAgICogdW50cmFuc2Zvcm1lZCBkYXRhLgorICAgKgorICAgKiBAcGFyYW0gcHRyIHB0ciB0byBkYXRhCisgICAqIEBwYXJhbSBzaXplIG9mIGRhdGEKKyAgICovCisgIHZvaWQgdW50cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeik7CisKKyAgLyoqCisgICAqIFRyYW5zZm9ybSB0aGUgZGF0YSBiYXNlZCBvbiBvdXIgd3JpdGUgdHJhbnNmb3JtIGZsYWdzCisgICAqIEF0IGNvbmNsdXNpb24gb2YgZnVuY3Rpb24gdGhlIHdyaXRlIGJ1ZmZlciBpcyBzZXQgdG8gdGhlCisgICAqIHRyYW5zZm9ybWVkIGRhdGEuCisgICAqCisgICAqIEBwYXJhbSBwdHIgUHRyIHRvIGRhdGEgdG8gdHJhbnNmb3JtCisgICAqIEBwYXJhbSBzeiBTaXplIG9mIGRhdGEgYnVmZmVyCisgICAqLworICB2b2lkIHRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KTsKKworICB1aW50MTZfdCBnZXROdW1UcmFuc2Zvcm1zKCkgY29uc3QgeworICAgIHJldHVybiBzYWZlX251bWVyaWNfY2FzdDx1aW50MTZfdD4od3JpdGVUcmFuc18uc2l6ZSgpKTsKKyAgfQorCisgIHZvaWQgc2V0VHJhbnNmb3JtKHVpbnQxNl90IHRyYW5zSWQpIHsgd3JpdGVUcmFuc18ucHVzaF9iYWNrKHRyYW5zSWQpOyB9CisKKyAgLy8gSW5mbyBoZWFkZXJzCisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IFN0cmluZ1RvU3RyaW5nTWFwOworCisgIC8vIHRoZXNlIHdvcmsgd2l0aCB3cml0ZSBoZWFkZXJzCisgIHZvaWQgc2V0SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisKKyAgdm9pZCBjbGVhckhlYWRlcnMoKTsKKworICBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0V3JpdGVIZWFkZXJzKCkgeyByZXR1cm4gd3JpdGVIZWFkZXJzXzsgfQorCisgIC8vIHRoZXNlIHdvcmsgd2l0aCByZWFkIGhlYWRlcnMKKyAgY29uc3QgU3RyaW5nVG9TdHJpbmdNYXAmIGdldEhlYWRlcnMoKSBjb25zdCB7IHJldHVybiByZWFkSGVhZGVyc187IH0KKworICAvLyBhY2Nlc3NvcnMgZm9yIHNlcUlkCisgIGludDMyX3QgZ2V0U2VxdWVuY2VOdW1iZXIoKSBjb25zdCB7IHJldHVybiBzZXFJZDsgfQorICB2b2lkIHNldFNlcXVlbmNlTnVtYmVyKGludDMyX3Qgc2VxSWQpIHsgdGhpcy0+c2VxSWQgPSBzZXFJZDsgfQorCisgIGVudW0gVFJBTlNGT1JNUyB7CisgICAgWkxJQl9UUkFOU0ZPUk0gPSAweDAxLAorICB9OworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBSZWFkcyBhIGZyYW1lIG9mIGlucHV0IGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgKgorICAgKiBSZXR1cm5zIHRydWUgaWYgYSBmcmFtZSB3YXMgcmVhZCBzdWNjZXNzZnVsbHksIG9yIGZhbHNlIG9uIEVPRi4KKyAgICogKFJhaXNlcyBhIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgRU9GIG9jY3VycyBhZnRlciBhIHBhcnRpYWwgZnJhbWUuKQorICAgKi8KKyAgdmlydHVhbCBib29sIHJlYWRGcmFtZSgpOworCisgIHZvaWQgZW5zdXJlUmVhZEJ1ZmZlcih1aW50MzJfdCBzeik7CisgIHVpbnQzMl90IGdldFdyaXRlQnl0ZXMoKTsKKworICB2b2lkIGluaXRCdWZmZXJzKCkgeworICAgIHNldFJlYWRCdWZmZXIoTlVMTCwgMCk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0XzsKKworICAvLyAwIGFuZCAxNnRoIGJpdHMgbXVzdCBiZSAwIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBmcmFtZWQgJiB1bmZyYW1lZAorICBzdGF0aWMgY29uc3QgdWludDMyX3QgSEVBREVSX01BR0lDID0gMHgwRkZGMDAwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEhFQURFUl9NQVNLID0gMHhGRkZGMDAwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEZMQUdTX01BU0sgPSAweDAwMDBGRkZGOworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkY7CisKKyAgaW50MTZfdCBwcm90b0lkOworICB1aW50MTZfdCBjbGllbnRUeXBlOworICB1aW50MzJfdCBzZXFJZDsKKyAgdWludDE2X3QgZmxhZ3M7CisKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHJlYWRUcmFuc187CisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiB3cml0ZVRyYW5zXzsKKworICAvLyBNYXAgdG8gdXNlIGZvciBoZWFkZXJzCisgIFN0cmluZ1RvU3RyaW5nTWFwIHJlYWRIZWFkZXJzXzsKKyAgU3RyaW5nVG9TdHJpbmdNYXAgd3JpdGVIZWFkZXJzXzsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3cml0ZSBrL3YgaGVhZGVycyBjYW4gdGFrZQorICAgKi8KKyAgdWludDMyX3QgZ2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpIGNvbnN0OworCisgIHN0cnVjdCBpbmZvSWRUeXBlIHsKKyAgICBlbnVtIGlkVHlwZSB7CisgICAgICAvLyBzdGFydCBhdCAxIHRvIGF2b2lkIGNvbmZ1c2luZyBoZWFkZXIgcGFkZGluZyBmb3IgYW4gaW5mb0lkCisgICAgICBLRVlWQUxVRSA9IDEsCisgICAgICBFTkQgLy8gc2lnbmFsIHRoZSBlbmQgb2YgaW5mb0lkcyB3ZSBjYW4gaGFuZGxlCisgICAgfTsKKyAgfTsKKworICAvLyBCdWZmZXJzIHRvIHVzZSBmb3IgdHJhbnNmb3JtIHByb2Nlc3NpbmcKKyAgdWludDMyX3QgdEJ1ZlNpemVfOworICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHRCdWZfOworCisgIHZvaWQgcmVhZFN0cmluZyh1aW50OF90KiYgcHRyLCAvKiBvdXQgKi8gc3RkOjpzdHJpbmcmIHN0ciwgdWludDhfdCBjb25zdCogaGVhZGVyQm91bmRhcnkpOworCisgIHZvaWQgd3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLy8gVmFyaW50IHV0aWxzCisgIC8qKgorICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAzIGJ5dGVzLgorICAgKi8KKyAgdWludDMyX3QgcmVhZFZhcmludDE2KHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MTZfdCogaTE2LCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSk7CisKKyAgLyoqCisgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAqLworICB1aW50MzJfdCByZWFkVmFyaW50MzIodWludDhfdCBjb25zdCogcHRyLCBpbnQzMl90KiBpMzIsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KTsKKworICAvKioKKyAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlVmFyaW50MzIoaW50MzJfdCBuLCB1aW50OF90KiBwa3QpOworCisgIC8qKgorICAgKiBXcml0ZSBhbiBpMTYgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0zIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgKi8KKyAgdWludDMyX3Qgd3JpdGVWYXJpbnQxNihpbnQxNl90IG4sIHVpbnQ4X3QqIHBrdCk7Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBoZWFkZXIgb25lLgorICoKKyAqLworY2xhc3MgVEhlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUSGVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEhlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBoZWFkZXIgb25lLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MjE5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKQorICA6IFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCksIGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSB7Cit9CisKK1RIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBwYXRoKQorICA6IFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSkpLAorICAgIGhvc3RfKGhvc3QpLAorICAgIHBhdGhfKHBhdGgpIHsKK30KKworVEh0dHBDbGllbnQ6On5USHR0cENsaWVudCgpIHsKK30KKwordm9pZCBUSHR0cENsaWVudDo6cGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSB7CisgIGNoYXIqIGNvbG9uID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgaWYgKGNvbG9uID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgY2hhciogdmFsdWUgPSBjb2xvbiArIDE7CisKKyAgaWYgKGJvb3N0Ojppc3RhcnRzX3dpdGgoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciKSkgeworICAgIGlmIChib29zdDo6aWVuZHNfd2l0aCh2YWx1ZSwgImNodW5rZWQiKSkgeworICAgICAgY2h1bmtlZF8gPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIGlmIChib29zdDo6aXN0YXJ0c193aXRoKGhlYWRlciwgIkNvbnRlbnQtTGVuZ3RoIikpIHsKKyAgICBjaHVua2VkXyA9IGZhbHNlOworICAgIGNvbnRlbnRMZW5ndGhfID0gYXRvaSh2YWx1ZSk7CisgIH0KK30KKworYm9vbCBUSHR0cENsaWVudDo6cGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgeworICBjaGFyKiBodHRwID0gc3RhdHVzOworCisgIGNoYXIqIGNvZGUgPSBzdHJjaHIoaHR0cCwgJyAnKTsKKyAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KKworICAqY29kZSA9ICdcMCc7CisgIHdoaWxlICgqKGNvZGUrKykgPT0gJyAnKSB7CisgIH07CisKKyAgY2hhciogbXNnID0gc3RyY2hyKGNvZGUsICcgJyk7CisgIGlmIChtc2cgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KKyAgKm1zZyA9ICdcMCc7CisKKyAgaWYgKHN0cmNtcChjb2RlLCAiMjAwIikgPT0gMCkgeworICAgIC8vIEhUVFAgMjAwID0gT0ssIHdlIGdvdCB0aGUgcmVzcG9uc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChzdHJjbXAoY29kZSwgIjEwMCIpID09IDApIHsKKyAgICAvLyBIVFRQIDEwMCA9IGNvbnRpbnVlLCBqdXN0IGtlZXAgcmVhZGluZworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOworICB9Cit9CisKK3ZvaWQgVEh0dHBDbGllbnQ6OmZsdXNoKCkgeworICAvLyBGZXRjaCB0aGUgY29udGVudHMgb2YgdGhlIHdyaXRlIGJ1ZmZlcgorICB1aW50OF90KiBidWY7CisgIHVpbnQzMl90IGxlbjsKKyAgd3JpdGVCdWZmZXJfLmdldEJ1ZmZlcigmYnVmLCAmbGVuKTsKKworICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOworICBoIDw8ICJQT1NUICIgPDwgcGF0aF8gPDwgIiBIVFRQLzEuMSIgPDwgQ1JMRiA8PCAiSG9zdDogIiA8PCBob3N0XyA8PCBDUkxGCisgICAgPDwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGCisgICAgPDwgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIlVzZXItQWdlbnQ6IFRocmlmdC8iIDw8IFBBQ0tBR0VfVkVSU0lPTgorICAgIDw8ICIgKEMrKy9USHR0cENsaWVudCkiIDw8IENSTEYgPDwgQ1JMRjsKKyAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CisKKyAgaWYgKGhlYWRlci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIZWFkZXIgdG9vIGJpZyIpOworICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCisgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOworICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKKyAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgIHJlYWRIZWFkZXJzXyA9IHRydWU7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZiMTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVEh0dHBDbGllbnQgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgeworcHVibGljOgorICBUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOworCisgIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOworCisgIHZpcnR1YWwgflRIdHRwQ2xpZW50KCk7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgaG9zdF87CisgIHN0ZDo6c3RyaW5nIHBhdGhfOworCisgIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpOworICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjaW5jbHVkZSA8U2hsd2FwaS5oPgorI2VuZGlmCisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RIdHRwU2VydmVyOjpUSHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6IFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCkgeworfQorCitUSHR0cFNlcnZlcjo6flRIdHRwU2VydmVyKCkgeworfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcygmVE0sICZUSU1FKQorICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIF9zdHJuaWNtcChzdHIxLCBzdHIyLCBsZW4pCisgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgU3RyU3RySUEoaGF5c3RhY2ssIG5lZWRsZSkKKyNlbHNlCisgICNkZWZpbmUgVEhSSUZUX0dNVElNRShUTSwgVElNRSkgICAgICAgICAgICAgZ210aW1lX3IoJlRJTUUsICZUTSkKKyAgI2RlZmluZSBUSFJJRlRfc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKSBzdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pCisgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKQorI2VuZGlmCisKK3ZvaWQgVEh0dHBTZXJ2ZXI6OnBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgeworICBjaGFyKiBjb2xvbiA9IHN0cmNocihoZWFkZXIsICc6Jyk7CisgIGlmIChjb2xvbiA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCBzeiA9IGNvbG9uIC0gaGVhZGVyOworICBjaGFyKiB2YWx1ZSA9IGNvbG9uICsgMTsKKworICBpZiAoVEhSSUZUX3N0cm5jYXNlY21wKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIiwgc3opID09IDApIHsKKyAgICBpZiAoVEhSSUZUX3N0cmNhc2VzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgeworICAgICAgY2h1bmtlZF8gPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIGlmIChUSFJJRlRfc3RybmNhc2VjbXAoaGVhZGVyLCAiQ29udGVudC1sZW5ndGgiLCBzeikgPT0gMCkgeworICAgIGNodW5rZWRfID0gZmFsc2U7CisgICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKKyAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIlgtRm9yd2FyZGVkLUZvciIsIHN6KSA9PSAwKSB7CisgICAgb3JpZ2luXyA9IHZhbHVlOworICB9Cit9CisKK2Jvb2wgVEh0dHBTZXJ2ZXI6OnBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpIHsKKyAgY2hhciogbWV0aG9kID0gc3RhdHVzOworCisgIGNoYXIqIHBhdGggPSBzdHJjaHIobWV0aG9kLCAnICcpOworICBpZiAocGF0aCA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorCisgICpwYXRoID0gJ1wwJzsKKyAgd2hpbGUgKCooKytwYXRoKSA9PSAnICcpIHsKKyAgfTsKKworICBjaGFyKiBodHRwID0gc3RyY2hyKHBhdGgsICcgJyk7CisgIGlmIChodHRwID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOworICB9CisgICpodHRwID0gJ1wwJzsKKworICBpZiAoc3RyY21wKG1ldGhvZCwgIlBPU1QiKSA9PSAwKSB7CisgICAgLy8gUE9TVCBtZXRob2Qgb2ssIGxvb2tpbmcgZm9yIGNvbnRlbnQuCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoc3RyY21wKG1ldGhvZCwgIk9QVElPTlMiKSA9PSAwKSB7CisgICAgLy8gcHJlZmxpZ2h0IE9QVElPTlMgbWV0aG9kLCB3ZSBkb24ndCBuZWVkIGZ1cnRoZXIgY29udGVudC4KKyAgICAvLyBob3cgdG8gZ3JhY2lvdXNseSBjbG9zZSBjb25uZWN0aW9uPworICAgIHVpbnQ4X3QqIGJ1ZjsKKyAgICB1aW50MzJfdCBsZW47CisgICAgd3JpdGVCdWZmZXJfLmdldEJ1ZmZlcigmYnVmLCAmbGVuKTsKKworICAgIC8vIENvbnN0cnVjdCB0aGUgSFRUUCBoZWFkZXIKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKKyAgICBoIDw8ICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwgIkRhdGU6ICIgPDwgZ2V0VGltZVJGQzExMjMoKSA8PCBDUkxGCisgICAgICA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzOiBQT1NULCBPUFRJT05TIgorICAgICAgPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyczogQ29udGVudC1UeXBlIiA8PCBDUkxGIDw8IENSTEY7CisgICAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CisKKyAgICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCisgICAgdHJhbnNwb3J0Xy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWhlYWRlci5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaGVhZGVyLnNpemUoKSkpOworICAgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKKyAgICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgICAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcworICAgIHdyaXRlQnVmZmVyXy5yZXNldEJ1ZmZlcigpOworICAgIHJlYWRIZWFkZXJzXyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXMgKHVuc3VwcG9ydGVkIG1ldGhvZCk6ICIpICsgc3RhdHVzKTsKK30KKwordm9pZCBUSHR0cFNlcnZlcjo6Zmx1c2goKSB7CisgIC8vIEZldGNoIHRoZSBjb250ZW50cyBvZiB0aGUgd3JpdGUgYnVmZmVyCisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3QgbGVuOworICB3cml0ZUJ1ZmZlcl8uZ2V0QnVmZmVyKCZidWYsICZsZW4pOworCisgIC8vIENvbnN0cnVjdCB0aGUgSFRUUCBoZWFkZXIKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CisgIGggPDwgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PCAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwgIlNlcnZlcjogVGhyaWZ0LyIKKyAgICA8PCBQQUNLQUdFX1ZFUlNJT04gPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGCisgICAgPDwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGCisgICAgPDwgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIDw8IENSTEYgPDwgQ1JMRjsKKyAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CisKKyAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAorICAvLyBjYXN0IHNob3VsZCBiZSBmaW5lLCBiZWNhdXNlIG5vbmUgb2YgImhlYWRlciIgaXMgdW5kZXIgYXR0YWNrZXIgY29udHJvbAorICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihoZWFkZXIuc2l6ZSgpKSk7CisgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKKyAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKKworICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzCisgIHdyaXRlQnVmZmVyXy5yZXNldEJ1ZmZlcigpOworICByZWFkSGVhZGVyc18gPSB0cnVlOworfQorCitzdGQ6OnN0cmluZyBUSHR0cFNlcnZlcjo6Z2V0VGltZVJGQzExMjMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBEYXlzW10gPSB7IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJ9OworICBzdGF0aWMgY29uc3QgY2hhciogTW9udGhzW10KKyAgICAgID0geyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OworICBjaGFyIGJ1ZmZbMTI4XTsKKworICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisgIHN0cnVjdCB0bSB0bWI7CisgIFRIUklGVF9HTVRJTUUodG1iLCB0KTsKKworICBzcHJpbnRmKGJ1ZmYsCisgICAgICAgICAgIiVzLCAlZCAlcyAlZCAlZDolZDolZCBHTVQiLAorICAgICAgICAgIERheXNbdG1iLnRtX3dkYXldLAorICAgICAgICAgIHRtYi50bV9tZGF5LAorICAgICAgICAgIE1vbnRoc1t0bWIudG1fbW9uXSwKKyAgICAgICAgICB0bWIudG1feWVhciArIDE5MDAsCisgICAgICAgICAgdG1iLnRtX2hvdXIsCisgICAgICAgICAgdG1iLnRtX21pbiwKKyAgICAgICAgICB0bWIudG1fc2VjKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmYpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4NjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRIdHRwU2VydmVyIDogcHVibGljIFRIdHRwVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CisKKyAgdmlydHVhbCB+VEh0dHBTZXJ2ZXIoKTsKKworICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKworcHJvdGVjdGVkOgorICB2b2lkIHJlYWRIZWFkZXJzKCk7CisgIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpOworICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7CisgIHN0ZDo6c3RyaW5nIGdldFRpbWVSRkMxMTIzKCk7Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gSFRUUCBwcm90b2NvbAorICovCitjbGFzcyBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSHR0cFNlcnZlcih0cmFucykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2MwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLy8gWWVhaCwgeWVhaCwgaGFja3kgdG8gcHV0IHRoZXNlIGhlcmUsIEkga25vdy4KK2NvbnN0IGNoYXIqIFRIdHRwVHJhbnNwb3J0OjpDUkxGID0gIlxyXG4iOworY29uc3QgaW50IFRIdHRwVHJhbnNwb3J0OjpDUkxGX0xFTiA9IDI7CisKK1RIdHRwVHJhbnNwb3J0OjpUSHR0cFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICBvcmlnaW5fKCIiKSwKKyAgICByZWFkSGVhZGVyc18odHJ1ZSksCisgICAgY2h1bmtlZF8oZmFsc2UpLAorICAgIGNodW5rZWREb25lXyhmYWxzZSksCisgICAgY2h1bmtTaXplXygwKSwKKyAgICBjb250ZW50TGVuZ3RoXygwKSwKKyAgICBodHRwQnVmXyhOVUxMKSwKKyAgICBodHRwUG9zXygwKSwKKyAgICBodHRwQnVmTGVuXygwKSwKKyAgICBodHRwQnVmU2l6ZV8oMTAyNCkgeworICBpbml0KCk7Cit9CisKK3ZvaWQgVEh0dHBUcmFuc3BvcnQ6OmluaXQoKSB7CisgIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6bWFsbG9jKGh0dHBCdWZTaXplXyArIDEpOworICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgeworICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgIH0KKyAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKK30KKworVEh0dHBUcmFuc3BvcnQ6On5USHR0cFRyYW5zcG9ydCgpIHsKKyAgaWYgKGh0dHBCdWZfICE9IE5VTEwpIHsKKyAgICBzdGQ6OmZyZWUoaHR0cEJ1Zl8pOworICB9Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChyZWFkQnVmZmVyXy5hdmFpbGFibGVfcmVhZCgpID09IDApIHsKKyAgICByZWFkQnVmZmVyXy5yZXNldEJ1ZmZlcigpOworICAgIHVpbnQzMl90IGdvdCA9IHJlYWRNb3JlRGF0YSgpOworICAgIGlmIChnb3QgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiByZWFkQnVmZmVyXy5yZWFkKGJ1ZiwgbGVuKTsKK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7CisgIC8vIFJlYWQgYW55IHBlbmRpbmcgY2h1bmtlZCBkYXRhIChmb290ZXJzIGV0Yy4pCisgIGlmIChjaHVua2VkXykgeworICAgIHdoaWxlICghY2h1bmtlZERvbmVfKSB7CisgICAgICByZWFkQ2h1bmtlZCgpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRNb3JlRGF0YSgpIHsKKyAgdWludDMyX3Qgc2l6ZTsKKworICBpZiAoaHR0cFBvc18gPT0gaHR0cEJ1Zkxlbl8pIHsKKyAgICAvLyBHZXQgbW9yZSBkYXRhIQorICAgIHJlZmlsbCgpOworICB9CisKKyAgaWYgKHJlYWRIZWFkZXJzXykgeworICAgIHJlYWRIZWFkZXJzKCk7CisgIH0KKworICBpZiAoY2h1bmtlZF8pIHsKKyAgICBzaXplID0gcmVhZENodW5rZWQoKTsKKyAgfSBlbHNlIHsKKyAgICBzaXplID0gcmVhZENvbnRlbnQoY29udGVudExlbmd0aF8pOworICAgIHJlYWRIZWFkZXJzXyA9IHRydWU7CisgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRDaHVua2VkKCkgeworICB1aW50MzJfdCBsZW5ndGggPSAwOworCisgIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOworICB1aW50MzJfdCBjaHVua1NpemUgPSBwYXJzZUNodW5rU2l6ZShsaW5lKTsKKyAgaWYgKGNodW5rU2l6ZSA9PSAwKSB7CisgICAgcmVhZENodW5rZWRGb290ZXJzKCk7CisgIH0gZWxzZSB7CisgICAgLy8gUmVhZCBkYXRhIGNvbnRlbnQKKyAgICBsZW5ndGggKz0gcmVhZENvbnRlbnQoY2h1bmtTaXplKTsKKyAgICAvLyBSZWFkIHRyYWlsaW5nIENSTEYgYWZ0ZXIgY29udGVudAorICAgIHJlYWRMaW5lKCk7CisgIH0KKyAgcmV0dXJuIGxlbmd0aDsKK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6cmVhZENodW5rZWRGb290ZXJzKCkgeworICAvLyBFbmQgb2YgZGF0YSwgcmVhZCBmb290ZXIgbGluZXMgdW50aWwgYSBibGFuayBvbmUgYXBwZWFycworICB3aGlsZSAodHJ1ZSkgeworICAgIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOworICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgeworICAgICAgY2h1bmtlZERvbmVfID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cGFyc2VDaHVua1NpemUoY2hhciogbGluZSkgeworICBjaGFyKiBzZW1pID0gc3RyY2hyKGxpbmUsICc7Jyk7CisgIGlmIChzZW1pICE9IE5VTEwpIHsKKyAgICAqc2VtaSA9ICdcMCc7CisgIH0KKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNzY2FuZihsaW5lLCAiJXgiLCAmc2l6ZSk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZENvbnRlbnQodWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCBuZWVkID0gc2l6ZTsKKyAgd2hpbGUgKG5lZWQgPiAwKSB7CisgICAgdWludDMyX3QgYXZhaWwgPSBodHRwQnVmTGVuXyAtIGh0dHBQb3NfOworICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICAvLyBXZSBoYXZlIGdpdmVuIGFsbCB0aGUgZGF0YSwgcmVzZXQgcG9zaXRpb24gdG8gaGVhZCBvZiB0aGUgYnVmZmVyCisgICAgICBodHRwUG9zXyA9IDA7CisgICAgICBodHRwQnVmTGVuXyA9IDA7CisgICAgICByZWZpbGwoKTsKKworICAgICAgLy8gTm93IGhhdmUgYXZhaWxhYmxlIGhvd2V2ZXIgbXVjaCB3ZSByZWFkCisgICAgICBhdmFpbCA9IGh0dHBCdWZMZW5fOworICAgIH0KKyAgICB1aW50MzJfdCBnaXZlID0gYXZhaWw7CisgICAgaWYgKG5lZWQgPCBnaXZlKSB7CisgICAgICBnaXZlID0gbmVlZDsKKyAgICB9CisgICAgcmVhZEJ1ZmZlcl8ud3JpdGUoKHVpbnQ4X3QqKShodHRwQnVmXyArIGh0dHBQb3NfKSwgZ2l2ZSk7CisgICAgaHR0cFBvc18gKz0gZ2l2ZTsKKyAgICBuZWVkIC09IGdpdmU7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK2NoYXIqIFRIdHRwVHJhbnNwb3J0OjpyZWFkTGluZSgpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjaGFyKiBlb2wgPSBOVUxMOworCisgICAgZW9sID0gc3Ryc3RyKGh0dHBCdWZfICsgaHR0cFBvc18sIENSTEYpOworCisgICAgLy8gTm8gQ1JMRiB5ZXQ/CisgICAgaWYgKGVvbCA9PSBOVUxMKSB7CisgICAgICAvLyBTaGlmdCB3aGF0ZXZlciB3ZSBoYXZlIG5vdyB0byBmcm9udCBhbmQgcmVmaWxsCisgICAgICBzaGlmdCgpOworICAgICAgcmVmaWxsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFJldHVybiBwb2ludGVyIHRvIG5leHQgbGluZQorICAgICAgKmVvbCA9ICdcMCc7CisgICAgICBjaGFyKiBsaW5lID0gaHR0cEJ1Zl8gKyBodHRwUG9zXzsKKyAgICAgIGh0dHBQb3NfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChlb2wgLSBodHRwQnVmXykgKyBDUkxGX0xFTik7CisgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6c2hpZnQoKSB7CisgIGlmIChodHRwQnVmTGVuXyA+IGh0dHBQb3NfKSB7CisgICAgLy8gU2hpZnQgZG93biByZW1haW5pbmcgZGF0YSBhbmQgcmVhZCBtb3JlCisgICAgdWludDMyX3QgbGVuZ3RoID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKKyAgICBtZW1tb3ZlKGh0dHBCdWZfLCBodHRwQnVmXyArIGh0dHBQb3NfLCBsZW5ndGgpOworICAgIGh0dHBCdWZMZW5fID0gbGVuZ3RoOworICB9IGVsc2UgeworICAgIGh0dHBCdWZMZW5fID0gMDsKKyAgfQorICBodHRwUG9zXyA9IDA7CisgIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Cit9CisKK3ZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlZmlsbCgpIHsKKyAgdWludDMyX3QgYXZhaWwgPSBodHRwQnVmU2l6ZV8gLSBodHRwQnVmTGVuXzsKKyAgaWYgKGF2YWlsIDw9IChodHRwQnVmU2l6ZV8gLyA0KSkgeworICAgIGh0dHBCdWZTaXplXyAqPSAyOworICAgIGNoYXIqIHRtcEJ1ZiA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXyArIDEpOworICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgICAgaHR0cEJ1Zl8gPSB0bXBCdWY7CisgIH0KKworICAvLyBSZWFkIG1vcmUgZGF0YQorICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKCh1aW50OF90KikoaHR0cEJ1Zl8gKyBodHRwQnVmTGVuXyksIGh0dHBCdWZTaXplXyAtIGh0dHBCdWZMZW5fKTsKKyAgaHR0cEJ1Zkxlbl8gKz0gZ290OworICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOworCisgIGlmIChnb3QgPT0gMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIpOworICB9Cit9CisKK3ZvaWQgVEh0dHBUcmFuc3BvcnQ6OnJlYWRIZWFkZXJzKCkgeworICAvLyBJbml0aWFsaXplIGhlYWRlcnMgc3RhdGUgdmFyaWFibGVzCisgIGNvbnRlbnRMZW5ndGhfID0gMDsKKyAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgY2h1bmtlZERvbmVfID0gZmFsc2U7CisgIGNodW5rU2l6ZV8gPSAwOworCisgIC8vIENvbnRyb2wgc3RhdGUgZmxvdworICBib29sIHN0YXR1c0xpbmUgPSB0cnVlOworICBib29sIGZpbmlzaGVkID0gZmFsc2U7CisKKyAgLy8gTG9vcCB1bnRpbCBoZWFkZXJzIGFyZSBmaW5pc2hlZAorICB3aGlsZSAodHJ1ZSkgeworICAgIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOworCisgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwKSB7CisgICAgICBpZiAoZmluaXNoZWQpIHsKKyAgICAgICAgcmVhZEhlYWRlcnNfID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE11c3QgaGF2ZSBiZWVuIGFuIEhUVFAgMTAwLCBrZWVwIGdvaW5nIGZvciBhbm90aGVyIHN0YXR1cyBsaW5lCisgICAgICAgIHN0YXR1c0xpbmUgPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RhdHVzTGluZSkgeworICAgICAgICBzdGF0dXNMaW5lID0gZmFsc2U7CisgICAgICAgIGZpbmlzaGVkID0gcGFyc2VTdGF0dXNMaW5lKGxpbmUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2VIZWFkZXIobGluZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgVEh0dHBUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHdyaXRlQnVmZmVyXy53cml0ZShidWYsIGxlbik7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nIFRIdHRwVHJhbnNwb3J0OjpnZXRPcmlnaW4oKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgIGlmICghb3JpZ2luXy5lbXB0eSgpKSB7CisgICAgb3NzIDw8IG9yaWdpbl8gPDwgIiwgIjsKKyAgfQorICBvc3MgPDwgdHJhbnNwb3J0Xy0+Z2V0T3JpZ2luKCk7CisgIHJldHVybiBvc3Muc3RyKCk7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2YWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0aHJpZnQgdHJhbnNwb3J0LiBUaGlzIHdhcyBpcnJpdGF0aW5nCisgKiB0byB3cml0ZSwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgaW4gQysrIGxhbmQgYXJlIGRhdW50aW5nLiBMaW5raW5nIENVUkwKKyAqIHJlcXVpcmVzIDIzIGR5bmFtaWMgbGlicmFyaWVzIGxhc3QgdGltZSBJIGNoZWNrZWQgKFdURj8hPykuIEFsbCB3ZSBoYXZlCisgKiBoZXJlIGlzIGEgVkVSWSBiYXNpYyBIVFRQLzEuMSBjbGllbnQgd2hpY2ggc3VwcG9ydHMgSFRUUCAxMDAgQ29udGludWUsCisgKiBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLCBrZWVwYWxpdmUsIGV0Yy4gVGVzdGVkIGFnYWluc3QgQXBhY2hlLgorICovCitjbGFzcyBUSHR0cFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUSHR0cFRyYW5zcG9ydD4geworcHVibGljOgorICBUSHR0cFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKworICB2aXJ0dWFsIH5USHR0cFRyYW5zcG9ydCgpOworCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsgfQorCisgIHZvaWQgY2xvc2UoKSB7IHRyYW5zcG9ydF8tPmNsb3NlKCk7IH0KKworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB1aW50MzJfdCByZWFkRW5kKCk7CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOworCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c3RyaW5nIG9yaWdpbl87CisKKyAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87CisgIFRNZW1vcnlCdWZmZXIgcmVhZEJ1ZmZlcl87CisKKyAgYm9vbCByZWFkSGVhZGVyc187CisgIGJvb2wgY2h1bmtlZF87CisgIGJvb2wgY2h1bmtlZERvbmVfOworICB1aW50MzJfdCBjaHVua1NpemVfOworICB1aW50MzJfdCBjb250ZW50TGVuZ3RoXzsKKworICBjaGFyKiBodHRwQnVmXzsKKyAgdWludDMyX3QgaHR0cFBvc187CisgIHVpbnQzMl90IGh0dHBCdWZMZW5fOworICB1aW50MzJfdCBodHRwQnVmU2l6ZV87CisKKyAgdmlydHVhbCB2b2lkIGluaXQoKTsKKworICB1aW50MzJfdCByZWFkTW9yZURhdGEoKTsKKyAgY2hhciogcmVhZExpbmUoKTsKKworICB2b2lkIHJlYWRIZWFkZXJzKCk7CisgIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpID0gMDsKKyAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpID0gMDsKKworICB1aW50MzJfdCByZWFkQ2h1bmtlZCgpOworICB2b2lkIHJlYWRDaHVua2VkRm9vdGVycygpOworICB1aW50MzJfdCBwYXJzZUNodW5rU2l6ZShjaGFyKiBsaW5lKTsKKworICB1aW50MzJfdCByZWFkQ29udGVudCh1aW50MzJfdCBzaXplKTsKKworICB2b2lkIHJlZmlsbCgpOworICB2b2lkIHNoaWZ0KCk7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqIENSTEY7CisgIHN0YXRpYyBjb25zdCBpbnQgQ1JMRl9MRU47Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlYzVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogTm9uYmxvY2tpbmcgU1NMIHNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24uCisgKi8KK1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChhZGRyZXNzLCBwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHRTU0xTb2NrZXQ7CisgIHRTU0xTb2NrZXQgPSBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCk7CisgIHRTU0xTb2NrZXQtPnNldExpYmV2ZW50U2FmZSgpOworICByZXR1cm4gdFNTTFNvY2tldDsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWM0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTU0xTRVJWRVJTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU1NMU0VSVkVSU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKKy8qKgorICogTm9uYmxvY2tpbmcgU2VydmVyIHNvY2tldCB0aGF0IGFjY2VwdHMgU1NMIGNvbm5lY3Rpb25zLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgKiBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgKiBAcGFyYW0gZmFjdG9yeSAgICAgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNGNjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDU0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVU5fSAorI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaWZuZGVmIEFGX0xPQ0FMCisjZGVmaW5lIEFGX0xPQ0FMIEFGX1VOSVgKKyNlbmRpZgorCisjaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgY29uc3QgU09DS09QVF9DQVNUX1QqIGNvbnN0X2Nhc3Rfc29ja29wdChjb25zdCBUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpIHsKK30KKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XyhzZW5kVGltZW91dCksCisgICAgcmVjdlRpbWVvdXRfKHJlY3ZUaW1lb3V0KSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgYWRkcmVzc18oYWRkcmVzcyksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKKyAgOiBwb3J0XygwKSwKKyAgICBsaXN0ZW5Qb3J0XygwKSwKKyAgICBwYXRoXyhwYXRoKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpIHsKK30KKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Ojp+VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KCkgeworICBjbG9zZSgpOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KSB7CisgIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KSB7CisgIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZykgeworICBhY2NlcHRCYWNrbG9nXyA9IGFjY0JhY2tsb2c7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KSB7CisgIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpIHsKKyAgcmV0cnlEZWxheV8gPSByZXRyeURlbGF5OworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcikgeworICB0Y3BTZW5kQnVmZmVyXyA9IHRjcFNlbmRCdWZmZXI7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSB7CisgIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHsKKyAgbGlzdGVuaW5nXyA9IHRydWU7CisjaWZkZWYgX1dJTjMyCisgIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZiAvLyBfV0lOMzIKKyAgCisgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCisgIGlmIChwb3J0XyA8IDAgfHwgcG9ydF8gPiAweEZGRkYpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOworICB9CisKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpyZXM7CisgIGludCBlcnJvcjsKKyAgY2hhciBwb3J0W3NpemVvZigiNjU1MzUiKV07CisgIFRIUklGVF9TTlBSSU5URihwb3J0LCBzaXplb2YocG9ydCksICIlZCIsIHBvcnRfKTsKKworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKKworICAvLyBJZiBhZGRyZXNzIGlzIG5vdCBzcGVjaWZpZWQgdXNlIHdpbGRjYXJkIGFkZHJlc3MgKE5VTEwpCisgIFRHZXRBZGRySW5mb1dyYXBwZXIgaW5mbyhhZGRyZXNzXy5lbXB0eSgpID8gTlVMTCA6ICZhZGRyZXNzX1swXSwgcG9ydCwgJmhpbnRzKTsKKworICBlcnJvciA9IGluZm8uaW5pdCgpOworICBpZiAoZXJyb3IpIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJnZXRhZGRyaW5mbyAlZDogJXMiLCBlcnJvciwgVEhSSUZUX0dBSV9TVFJFUlJPUihlcnJvcikpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBzZXJ2ZXIgc29ja2V0LiIpOworICB9CisKKyAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKKyAgLy8gaW50byBpcHY2IHNwYWNlLgorICBmb3IgKHJlcyA9IGluZm8ucmVzKCk7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7CisgICAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2IHx8IHJlcy0+YWlfbmV4dCA9PSBOVUxMKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgfSBlbHNlIGlmIChyZXMgIT0gTlVMTCkgeworICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICB9CisKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBzb2NrZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0CisgIGludCBvbmUgPSAxOworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcsCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uZSkpKSB7CisvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0IG9uIFdpbmRvd3MuICBUaGlzIGlzIGJlY2F1c2UKKy8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisvLyB3YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisjaWZuZGVmIF9XSU4zMgorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HICIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisjZW5kaWYKKyAgfQorCisgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzCisgIGlmICh0Y3BTZW5kQnVmZmVyXyA+IDApIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU09fU05EQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmdGNwU2VuZEJ1ZmZlcl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fU05EQlVGICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFNPX1NOREJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisgIGlmICh0Y3BSZWN2QnVmZmVyXyA+IDApIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU09fUkNWQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmdGNwUmVjdkJ1ZmZlcl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BSZWN2QnVmZmVyXykpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisjaWZkZWYgSVBWNl9WNk9OTFkKKyAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2ICYmIHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpbnQgemVybyA9IDA7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX0lQVjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBWNl9WNk9OTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ6ZXJvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoemVybykpKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIElQVjZfVjZPTkxZICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyAjaWZkZWYgSVBWNl9WNk9OTFkKKworICAvLyBUdXJuIGxpbmdlciBvZmYsIGRvbid0IHdhbnQgdG8gYmxvY2sgb24gY2FsbHMgdG8gY2xvc2UKKyAgc3RydWN0IGxpbmdlciBsaW5nID0gezAsIDB9OworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIGNhc3Rfc29ja29wdCgmbGluZyksIHNpemVvZihsaW5nKSkpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0xJTkdFUiAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX0xJTkdFUiIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gS2VlcGFsaXZlIHRvIGVuc3VyZSBmdWxsIHJlc3VsdCBmbHVzaGluZworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19LRUVQQUxJVkUgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgZXJybm9fY29weSk7CisgIH0KKworICAvLyBTZXQgVENQIG5vZGVsYXkgaWYgYXZhaWxhYmxlLCBNQUMgT1MgWCBIYWNrCisgIC8vIFNlZSBodHRwOi8vbGlzdHMuZGFuZ2EuY29tL3BpcGVybWFpbC9tZW1jYWNoZWQvMjAwNS1NYXJjaC8wMDEyNDAuaHRtbAorI2lmbmRlZiBUQ1BfTk9QVVNICisgIC8vIFVuaXggU29ja2V0cyBkbyBub3QgbmVlZCB0aGF0CisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgLy8gVENQIE5vZGVsYXksIHNwZWVkIG92ZXIgYmFuZHdpZHRoCisgICAgaWYgKC0xCisgICAgICAgID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9OT0RFTEFZICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNlcnZlclNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNlcnZlclNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfT19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgVEhSSUZUX09fTk9OQkxPQ0sgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyNpZmRlZiBUQ1BfTE9XX01JTl9SVE8KKyAgaWYgKFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTE9XX01JTl9SVE8gIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KKyAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CisgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgorICBpbnQgcmV0cmllcyA9IDA7CisgIGludCBlcnJub19jb3B5ID0gMDsKKworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKworI2lmbmRlZiBfV0lOMzIKKworICAgIC8vIFVuaXggRG9tYWluIFNvY2tldAorICAgIHNpemVfdCBsZW4gPSBwYXRoXy5zaXplKCkgKyAxOworICAgIGlmIChsZW4gPiBzaXplb2YoKChzb2NrYWRkcl91biopTlVMTCktPnN1bl9wYXRoKSkgeworICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6bGlzdGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOworICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7CisKKyAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOworCisgICAgaWYgKCFhZGRyZXNzLnN1bl9wYXRoWzBdKSB7IC8vIGFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIHN1bl9wYXRoIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgaW4gdGhpcyBjYXNlIGFuZCBzdHJ1Y3RsZW4gZGV0ZXJtaW5lcyBpdHMgbGVuZ3RoCisgICAgICBzdHJ1Y3RsZW4gLT0gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gbGVuOworI2Vsc2UKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQorCisgICAgZG8geworICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzdHJ1Y3RsZW4pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bworICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKKyNlbHNlCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQgb24gd2luZG93cyIsIC05OSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgZG8geworICAgICAgaWYgKDAgPT0gOjpiaW5kKHNlcnZlclNvY2tldF8sIHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8aW50PihyZXMtPmFpX2FkZHJsZW4pKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisKKyAgICAvLyByZXRyaWV2ZSBiaW5kIGluZm8KKyAgICBpZiAocG9ydF8gPT0gMCAmJiByZXRyaWVzIDw9IHJldHJ5TGltaXRfKSB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgICAgIHNvY2tsZW5fdCBsZW4gPSBzaXplb2Yoc2EpOworICAgICAgc3RkOjptZW1zZXQoJnNhLCAwLCBsZW4pOworICAgICAgaWYgKDo6Z2V0c29ja25hbWUoc2VydmVyU29ja2V0XywgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHIqPigmc2EpLCAmbGVuKSA8IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSBnZXRzb2NrbmFtZSgpICIsIGVycm5vX2NvcHkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KCZzYSk7CisgICAgICAgICAgbGlzdGVuUG9ydF8gPSBudG9ocyhzaW4tPnNpbjZfcG9ydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbio+KCZzYSk7CisgICAgICAgICAgbGlzdGVuUG9ydF8gPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CisgIGlmIChyZXRyaWVzID4gcmV0cnlMaW1pdF8pIHsKKyAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKKyAgICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBCSU5EICVkIiwgcG9ydF8pOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQoZXJyYnVmKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGJpbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAobGlzdGVuQ2FsbGJhY2tfKQorICAgIGxpc3RlbkNhbGxiYWNrXyhzZXJ2ZXJTb2NrZXRfKTsKKworICAvLyBDYWxsIGxpc3RlbgorICBpZiAoLTEgPT0gOjpsaXN0ZW4oc2VydmVyU29ja2V0XywgYWNjZXB0QmFja2xvZ18pKSB7CisgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQorfQorCitpbnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgeworICByZXR1cm4gcG9ydF87Cit9CisKK2ludCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmdldExpc3RlblBvcnQoKSB7CisgIHJldHVybiBsaXN0ZW5Qb3J0XzsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSB7CisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgbm90IGxpc3RlbmluZyIpOworICB9CisgIAorICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBjbGllbnRBZGRyZXNzOworICBpbnQgc2l6ZSA9IHNpemVvZihjbGllbnRBZGRyZXNzKTsKKyAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQKKyAgICAgID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIChzb2NrbGVuX3QqKSZzaXplKTsKKworICBpZiAoY2xpZW50U29ja2V0ID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gRXhwbGljaXRseSBzZXQgdGhpcyBzb2NrZXQgdG8gTk9OQkxPQ0sgbW9kZQorICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX0dFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0CisgICAgICAgIC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIH5USFJJRlRfT19OT05CTE9DSyAiLAorICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfU0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnQgPSBjcmVhdGVTb2NrZXQoY2xpZW50U29ja2V0KTsKKyAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKKyAgICBjbGllbnQtPnNldFNlbmRUaW1lb3V0KHNlbmRUaW1lb3V0Xyk7CisgIH0KKyAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKKyAgICBjbGllbnQtPnNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7CisgIH0KKyAgaWYgKGtlZXBBbGl2ZV8pIHsKKyAgICBjbGllbnQtPnNldEtlZXBBbGl2ZShrZWVwQWxpdmVfKTsKKyAgfQorICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgc2l6ZSk7CisKKyAgaWYgKGFjY2VwdENhbGxiYWNrXykKKyAgICBhY2NlcHRDYWxsYmFja18oY2xpZW50U29ja2V0KTsKKworICByZXR1cm4gY2xpZW50OworfQorCitzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0KSB7CisgIHJldHVybiBzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCkpOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Y2xvc2UoKSB7CisgIGlmIChzZXJ2ZXJTb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHNodXRkb3duKHNlcnZlclNvY2tldF8sIFRIUklGVF9TSFVUX1JEV1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNlcnZlclNvY2tldF8pOworICB9CisgIHNlcnZlclNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGxpc3RlbmluZ18gPSBmYWxzZTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4NmZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTb2NrZXQ7CisKKy8qKgorICogTm9uYmxvY2tpbmcgU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuIFdyYXBwZXIgYXJvdW5kIGEgdW5peAorICogc29ja2V0IGxpc3RlbiBhbmQgYWNjZXB0IGNhbGxzLgorICoKKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IDogcHVibGljIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFRIUklGVF9TT0NLRVQgZmQpPiBzb2NrZXRfZnVuY190OworCisgIGNvbnN0IHN0YXRpYyBpbnQgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKiBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgKiBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgKi8KKyAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKi8KKyAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIHVuaXggc29ja2V0cy4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aG5hbWUgZm9yIHVuaXggc29ja2V0LgorICAgKi8KKyAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICB2aXJ0dWFsIH5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoKTsKKworICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCk7CisgIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KTsKKworICB2b2lkIHNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpOworCisgIHZvaWQgc2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCk7CisgIHZvaWQgc2V0UmV0cnlEZWxheShpbnQgcmV0cnlEZWxheSk7CisKKyAgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpIHsga2VlcEFsaXZlXyA9IGtlZXBBbGl2ZTsgfQorCisgIHZvaWQgc2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcik7CisgIHZvaWQgc2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcik7CisKKyAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAorICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKKyAgLy8gdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldExpc3RlbkNhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGxpc3RlbkNhbGxiYWNrKSB7IGxpc3RlbkNhbGxiYWNrXyA9IGxpc3RlbkNhbGxiYWNrOyB9CisKKyAgLy8gYWNjZXB0Q2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWZ0ZXIgZWFjaCBhY2NlcHQgY2FsbCwgb24gdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0LgorICAvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIFRocmlmdCBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUKKyAgLy8gY3VzdG9tIHNldHNvY2tvcHQgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGFjY2VwdGVkCisgIC8vIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0QWNjZXB0Q2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgYWNjZXB0Q2FsbGJhY2spIHsgYWNjZXB0Q2FsbGJhY2tfID0gYWNjZXB0Q2FsbGJhY2s7IH0KKworICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCisgIGludCBnZXRQb3J0KCk7CisgIAorICBpbnQgZ2V0TGlzdGVuUG9ydCgpOworCisgIHZvaWQgbGlzdGVuKCk7CisgIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpOworCitwcml2YXRlOgorICBpbnQgcG9ydF87CisgIGludCBsaXN0ZW5Qb3J0XzsKKyAgc3RkOjpzdHJpbmcgYWRkcmVzc187CisgIHN0ZDo6c3RyaW5nIHBhdGhfOworICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CisgIGludCBhY2NlcHRCYWNrbG9nXzsKKyAgaW50IHNlbmRUaW1lb3V0XzsKKyAgaW50IHJlY3ZUaW1lb3V0XzsKKyAgaW50IHJldHJ5TGltaXRfOworICBpbnQgcmV0cnlEZWxheV87CisgIGludCB0Y3BTZW5kQnVmZmVyXzsKKyAgaW50IHRjcFJlY3ZCdWZmZXJfOworICBib29sIGtlZXBBbGl2ZV87CisgIGJvb2wgbGlzdGVuaW5nXzsKKworICBzb2NrZXRfZnVuY190IGxpc3RlbkNhbGxiYWNrXzsKKyAgc29ja2V0X2Z1bmNfdCBhY2NlcHRDYWxsYmFja187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogU2VydmVyIHRyYW5zcG9ydCBmcmFtZXdvcmsuIEEgc2VydmVyIG5lZWRzIHRvIGhhdmUgc29tZSBmYWNpbGl0eSBmb3IKKyAqIGNyZWF0aW5nIGJhc2UgdHJhbnNwb3J0cyB0byByZWFkL3dyaXRlIGZyb20uICBUaGUgc2VydmVyIGlzIGV4cGVjdGVkCisgKiB0byBrZWVwIHRyYWNrIG9mIFRUcmFuc3BvcnQgY2hpbGRyZW4gdGhhdCBpdCBjcmVhdGVzIGZvciBwdXJwb3NlcyBvZgorICogY29udHJvbGxpbmcgdGhlaXIgbGlmZXRpbWUuCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4gUHJpb3IgdG8gdGhpcworICAgKiBjYWxsIG1vc3QgdHJhbnNwb3J0cyB3aWxsIG5vdCByZXR1cm4gYW55dGhpbmcgd2hlbiBhY2NlcHQgaXMgY2FsbGVkLgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd2Ugd2VyZSB1bmFibGUgdG8gbGlzdGVuCisgICAqLworICB2aXJ0dWFsIHZvaWQgbGlzdGVuKCkge30KKworICAvKioKKyAgICogR2V0cyBhIG5ldyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IG9iamVjdCBhbmQgcGFzc2VzIGl0IHRvIHRoZQorICAgKiBjYWxsZXIuIE5vdGUgdGhhdCBpdCBpcyB0aGUgZXhwbGljaXQgZHV0eSBvZiB0aGUgY2FsbGVyIHRvIGZyZWUgdGhlCisgICAqIGFsbG9jYXRlZCBvYmplY3QuIFRoZSByZXR1cm5lZCBUVHJhbnNwb3J0IG9iamVjdCBtdXN0IGFsd2F5cyBiZSBpbiB0aGUKKyAgICogb3BlbmVkIHN0YXRlLiBOVUxMIHNob3VsZCBuZXZlciBiZSByZXR1cm5lZCwgaW5zdGVhZCBhbiBFeGNlcHRpb24gc2hvdWxkCisgICAqIGFsd2F5cyBiZSB0aHJvd24uCisgICAqCisgICAqIEByZXR1cm4gQSBuZXcgVFRyYW5zcG9ydCBvYmplY3QKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAqIFV0aWxpdHkgbWV0aG9kCisgICogCisgICogQHJldHVybiBzZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAKKyAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgKi8KKworICB2aXJ0dWFsIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgZ2V0UG9ydCgpID0gMDsKKworICB2aXJ0dWFsIGludCBnZXRMaXN0ZW5Qb3J0KCkgPSAwOworCisgIC8qKgorICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGZvciBhY2NlcHQuCisgICAqCisgICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKKyAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBhY2NlcHRJbXBsKCkgPSAwOworCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg0NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKQEAgLTAsMCArMSwzOTggQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyogVFBpcGUgaW1wbGVtZW50YXRpb24uCisqLworCisjaWZkZWYgX1dJTjMyCisKK3VpbnQzMl90IHBpcGVfcmVhZChIQU5ETEUgcGlwZSwgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwordm9pZCBwaXBlX3dyaXRlKEhBTkRMRSBwaXBlLCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKK3VpbnQzMl90IHBzZXVkb19zeW5jX3JlYWQoSEFORExFIHBpcGUsIEhBTkRMRSBldmVudCwgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwordm9pZCBwc2V1ZG9fc3luY193cml0ZShIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKK2NsYXNzIFRQaXBlSW1wbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIFRQaXBlSW1wbCgpIHt9CisgIHZpcnR1YWwgflRQaXBlSW1wbCgpIHt9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpID0gMDsgLy8gZG91YmxlcyBhcyB0aGUgcmVhZCBoYW5kbGUgZm9yIGFub24gcGlwZQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCB2b2lkIHNldFdydFBpcGVIYW5kbGUoSEFORExFKSB7fQorICB2aXJ0dWFsIGJvb2wgaXNCdWZmZXJlZERhdGFBdmFpbGFibGUoKSB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KK307CisKK2NsYXNzIFROYW1lZFBpcGVJbXBsIDogcHVibGljIFRQaXBlSW1wbCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFROYW1lZFBpcGVJbXBsKFRBdXRvSGFuZGxlICZwaXBlaGFuZGxlKSA6IFBpcGVfKHBpcGVoYW5kbGUucmVsZWFzZSgpKSB7fQorICB2aXJ0dWFsIH5UTmFtZWRQaXBlSW1wbCgpIHt9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJldHVybiBwc2V1ZG9fc3luY19yZWFkKFBpcGVfLmgsIHJlYWRfZXZlbnRfLmgsIGJ1ZiwgbGVuKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBwc2V1ZG9fc3luY193cml0ZShQaXBlXy5oLCB3cml0ZV9ldmVudF8uaCwgYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHsgUGlwZV8ucmVzZXQocGlwZWhhbmRsZSk7IH0KKworcHJpdmF0ZToKKyAgVE1hbnVhbFJlc2V0RXZlbnQgcmVhZF9ldmVudF87CisgIFRNYW51YWxSZXNldEV2ZW50IHdyaXRlX2V2ZW50XzsKKyAgVEF1dG9IYW5kbGUgUGlwZV87Cit9OworCitjbGFzcyBUQW5vblBpcGVJbXBsIDogcHVibGljIFRQaXBlSW1wbCB7CitwdWJsaWM6CisgIFRBbm9uUGlwZUltcGwoSEFORExFIFBpcGVSZCwgSEFORExFIFBpcGVXcnQpIDogUGlwZVJkXyhQaXBlUmQpLCBQaXBlV3J0XyhQaXBlV3J0KSB7fQorICB2aXJ0dWFsIH5UQW5vblBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiBwaXBlX3JlYWQoUGlwZVJkXy5oLCBidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHBpcGVfd3JpdGUoUGlwZVdydF8uaCwgYnVmLCBsZW4pOyB9CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVSZF8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgUGlwZVJkKSB7IFBpcGVSZF8ucmVzZXQoUGlwZVJkKTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVdydF8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0V3J0UGlwZUhhbmRsZShIQU5ETEUgUGlwZVdydCkgeyBQaXBlV3J0Xy5yZXNldChQaXBlV3J0KTsgfQorCitwcml2YXRlOgorICBUQXV0b0hhbmRsZSBQaXBlUmRfOworICBUQXV0b0hhbmRsZSBQaXBlV3J0XzsKK307CisKKy8vIElmIHlvdSB3YW50IGEgc2VsZWN0LWxpa2UgbG9vcCB0byB3b3JrLCB1c2UgdGhpcyBzdWJjbGFzcy4gIEJlIHdhcm5lZC4uLgorLy8gdGhlIHJlYWQgaW1wbGVtZW50YXRpb24gaGFzIHNldmVyYWwgY29udGV4dCBzd2l0Y2hlcywgc28gdGhpcyBpcyBzbG93ZXIKKy8vIHRoYW4gdXNpbmcgdGhlIHJlZ3VsYXIgbmFtZWQgcGlwZSBpbXBsZW1lbnRhdGlvbgorY2xhc3MgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbCA6IHB1YmxpYyBUUGlwZUltcGwgeworcHVibGljOgorICBleHBsaWNpdCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKFRBdXRvSGFuZGxlICZwaXBlaGFuZGxlKQorICAgIDogYmVnaW5fdW5yZWFkX2lkeF8oMCksIGVuZF91bnJlYWRfaWR4XygwKSB7CisgICAgcmVhZE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OlJFQUQ7CisgICAgcmVhZE92ZXJsYXBfLmggPSBwaXBlaGFuZGxlLmg7CisgICAgY2FuY2VsT3ZlcmxhcF8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6Q0FOQ0VMSU87CisgICAgY2FuY2VsT3ZlcmxhcF8uaCA9IHBpcGVoYW5kbGUuaDsKKyAgICBidWZmZXJfLnJlc2l6ZSgxMDI0IC8qYXJiaXRyYXJ5IGJ1ZmZlciBzaXplKi8sICdcMCcpOworICAgIGJlZ2luQXN5bmNSZWFkKCZidWZmZXJfWzBdLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyXy5zaXplKCkpKTsKKyAgICBQaXBlXy5yZXNldChwaXBlaGFuZGxlLnJlbGVhc2UoKSk7CisgIH0KKyAgdmlydHVhbCB+VFdhaXRhYmxlTmFtZWRQaXBlSW1wbCgpIHsKKyAgICAvLyBzZWUgaWYgdGhlcmUgaXMgYW4gb3V0c3RhbmRpbmcgcmVhZCByZXF1ZXN0CisgICAgaWYgKGJlZ2luX3VucmVhZF9pZHhfID09IGVuZF91bnJlYWRfaWR4XykgeworICAgICAgLy8gaWYgc28sIGNhbmNlbCBpdCwgYW5kIHdhaXQgZm9yIHRoZSBkZWFkIGNvbXBsZXRpb24KKyAgICAgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZjYW5jZWxPdmVybGFwXyk7CisgICAgICByZWFkT3ZlcmxhcF8ub3ZlcmxhcHBlZFJlc3VsdHMoZmFsc2UgLyppZ25vcmUgZXJyb3JzKi8pOworICAgIH0KKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBwc2V1ZG9fc3luY193cml0ZShQaXBlXy5oLCB3cml0ZV9ldmVudF8uaCwgYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHsgUGlwZV8ucmVzZXQocGlwZWhhbmRsZSk7IH0KKyAgdmlydHVhbCBib29sIGlzQnVmZmVyZWREYXRhQXZhaWxhYmxlKCkgeyByZXR1cm4gYmVnaW5fdW5yZWFkX2lkeF8gPCBlbmRfdW5yZWFkX2lkeF87IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIHJlYWR5X2V2ZW50Xy5oOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgYmVnaW5Bc3luY1JlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCBlbmRBc3luY1JlYWQoKTsKKworICBUQXV0b092ZXJsYXBUaHJlYWQgdGhyZWFkXzsKKyAgVEF1dG9IYW5kbGUgUGlwZV87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gcmVhZE92ZXJsYXBfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIGNhbmNlbE92ZXJsYXBfOworICBUTWFudWFsUmVzZXRFdmVudCByZWFkeV9ldmVudF87CisgIFRNYW51YWxSZXNldEV2ZW50IHdyaXRlX2V2ZW50XzsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyXzsKKyAgdWludDMyX3QgYmVnaW5fdW5yZWFkX2lkeF87CisgIHVpbnQzMl90IGVuZF91bnJlYWRfaWR4XzsKK307CisKK3ZvaWQgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6YmVnaW5Bc3luY1JlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgYmVnaW5fdW5yZWFkX2lkeF8gPSBlbmRfdW5yZWFkX2lkeF8gPSAwOworICByZWFkT3ZlcmxhcF8ucmVzZXQoYnVmLCBsZW4sIHJlYWR5X2V2ZW50Xy5oKTsKKyAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJnJlYWRPdmVybGFwXyk7CisgIGlmIChyZWFkT3ZlcmxhcF8uc3VjY2VzcyA9PSBGQUxTRSAmJiByZWFkT3ZlcmxhcF8ubGFzdF9lcnJvciAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpSZWFkRmlsZSBlcnJvcmVkIEdMRT0iLCByZWFkT3ZlcmxhcF8ubGFzdF9lcnJvcik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IFJlYWRGaWxlIGZhaWxlZCIpOworICB9Cit9CisKK3VpbnQzMl90IFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OmVuZEFzeW5jUmVhZCgpIHsKKyAgcmV0dXJuIHJlYWRPdmVybGFwXy5vdmVybGFwcGVkUmVzdWx0cygpOworfQorCit1aW50MzJfdCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChiZWdpbl91bnJlYWRfaWR4XyA9PSBlbmRfdW5yZWFkX2lkeF8pIHsKKyAgICBlbmRfdW5yZWFkX2lkeF8gPSBlbmRBc3luY1JlYWQoKTsKKyAgfQorCisgIHVpbnQzMl90IF9faWR4c2l6ZSA9IGVuZF91bnJlYWRfaWR4XyAtIGJlZ2luX3VucmVhZF9pZHhfOworICB1aW50MzJfdCBieXRlc190b19jb3B5ID0gKGxlbiA8IF9faWR4c2l6ZSkgPyBsZW4gOiBfX2lkeHNpemU7CisgIG1lbWNweShidWYsICZidWZmZXJfW2JlZ2luX3VucmVhZF9pZHhfXSwgYnl0ZXNfdG9fY29weSk7CisgIGJlZ2luX3VucmVhZF9pZHhfICs9IGJ5dGVzX3RvX2NvcHk7CisgIGlmIChiZWdpbl91bnJlYWRfaWR4XyAhPSBlbmRfdW5yZWFkX2lkeF8pIHsKKyAgICBhc3NlcnQobGVuID09IGJ5dGVzX3RvX2NvcHkpOworICAgIC8vIHdlIHdlcmUgYWJsZSB0byBmdWxmaWxsIHRoZSByZWFkIHdpdGgganVzdCB0aGUgYnl0ZXMgaW4gb3VyCisgICAgLy8gYnVmZmVyLCBhbmQgd2Ugc3RpbGwgaGF2ZSBidWZmZXIgbGVmdAorICAgIHJldHVybiBieXRlc190b19jb3B5OworICB9CisgIHVpbnQzMl90IGJ5dGVzX2NvcGllZCA9IGJ5dGVzX3RvX2NvcHk7CisKKyAgLy8gYWxsIG9mIHRoZSByZXF1ZXN0ZWQgZGF0YSBoYXMgYmVlbiByZWFkLiAgS2ljayBvZmYgYW4gYXN5bmMgcmVhZCBmb3IgdGhlIG5leHQgcm91bmQuCisgIGJlZ2luQXN5bmNSZWFkKCZidWZmZXJfWzBdLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyXy5zaXplKCkpKTsKKworICByZXR1cm4gYnl0ZXNfY29waWVkOworfQorCit2b2lkIHBzZXVkb19zeW5jX3dyaXRlKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIE9WRVJMQVBQRUQgdGVtcE92ZXJsYXA7CisgIG1lbXNldCgmdGVtcE92ZXJsYXAsIDAsIHNpemVvZih0ZW1wT3ZlcmxhcCkpOworICB0ZW1wT3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKKworICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBCT09MIHJlc3VsdCA9IDo6V3JpdGVGaWxlKHBpcGUsIGJ1ZiArIHdyaXR0ZW4sIGxlbiAtIHdyaXR0ZW4sIE5VTEwsICZ0ZW1wT3ZlcmxhcCk7CisKKyAgICBpZiAocmVzdWx0ID09IEZBTFNFICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU9fUEVORElORykgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpXcml0ZUZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogd3JpdGUgZmFpbGVkIik7CisgICAgfQorCisgICAgRFdPUkQgYnl0ZXMgPSAwOworICAgIHJlc3VsdCA9IDo6R2V0T3ZlcmxhcHBlZFJlc3VsdChwaXBlLCAmdGVtcE92ZXJsYXAsICZieXRlcywgVFJVRSk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6R2V0T3ZlcmxhcHBlZFJlc3VsdCBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiBHZXRPdmVybGFwcGVkUmVzdWx0IGZhaWxlZCIpOworICAgIH0KKyAgICB3cml0dGVuICs9IGJ5dGVzOworICB9Cit9CisKK3VpbnQzMl90IHBzZXVkb19zeW5jX3JlYWQoSEFORExFIHBpcGUsIEhBTkRMRSBldmVudCwgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgT1ZFUkxBUFBFRCB0ZW1wT3ZlcmxhcDsKKyAgbWVtc2V0KCZ0ZW1wT3ZlcmxhcCwgMCwgc2l6ZW9mKHRlbXBPdmVybGFwKSk7CisgIHRlbXBPdmVybGFwLmhFdmVudCA9IGV2ZW50OworCisgIEJPT0wgcmVzdWx0ID0gOjpSZWFkRmlsZShwaXBlLCBidWYsIGxlbiwgTlVMTCwgJnRlbXBPdmVybGFwKTsKKworICBpZiAocmVzdWx0ID09IEZBTFNFICYmIDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU9fUEVORElORykgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6UmVhZEZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IHJlYWQgZmFpbGVkIik7CisgIH0KKworICBEV09SRCBieXRlcyA9IDA7CisgIHJlc3VsdCA9IDo6R2V0T3ZlcmxhcHBlZFJlc3VsdChwaXBlLCAmdGVtcE92ZXJsYXAsICZieXRlcywgVFJVRSk7CisgIGlmICghcmVzdWx0KSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpHZXRPdmVybGFwcGVkUmVzdWx0IGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiBHZXRPdmVybGFwcGVkUmVzdWx0IGZhaWxlZCIpOworICB9CisgIHJldHVybiBieXRlczsKK30KKworLy8tLS0tIENvbnN0cnVjdG9ycyAtLS0tCitUUGlwZTo6VFBpcGUoVEF1dG9IYW5kbGUgJlBpcGUpCisgIDogaW1wbF8obmV3IFRXYWl0YWJsZU5hbWVkUGlwZUltcGwoUGlwZSkpLCBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworfQorCitUUGlwZTo6VFBpcGUoSEFORExFIFBpcGUpCisgIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpCit7CisgIFRBdXRvSGFuZGxlIHBpcGVIYW5kbGUoUGlwZSk7CisgIGltcGxfLnJlc2V0KG5ldyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKHBpcGVIYW5kbGUpKTsKK30KKworVFBpcGU6OlRQaXBlKGNvbnN0IGNoYXIqIHBpcGVuYW1lKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKK30KKworVFBpcGU6OlRQaXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgOiBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7Cit9CisKK1RQaXBlOjpUUGlwZShIQU5ETEUgUGlwZVJkLCBIQU5ETEUgUGlwZVdydCkKKyAgOiBpbXBsXyhuZXcgVEFub25QaXBlSW1wbChQaXBlUmQsIFBpcGVXcnQpKSwgVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18odHJ1ZSkgeworfQorCitUUGlwZTo6VFBpcGUoKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7Cit9CisKK1RQaXBlOjp+VFBpcGUoKSB7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc3BvcnQgY2FsbGJhY2tzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYm9vbCBUUGlwZTo6aXNPcGVuKCkgeworICByZXR1cm4gaW1wbF8uZ2V0KCkgIT0gTlVMTDsKK30KKworYm9vbCBUUGlwZTo6cGVlaygpIHsKKyAgcmV0dXJuIGlzT3BlbigpOworfQorCit2b2lkIFRQaXBlOjpvcGVuKCkgeworICBpZiAoaXNPcGVuKCkpCisgICAgcmV0dXJuOworCisgIFRBdXRvSGFuZGxlIGhQaXBlOworICBkbyB7CisgICAgRFdPUkQgZmxhZ3MgPSBGSUxFX0ZMQUdfT1ZFUkxBUFBFRDsgLy8gYXN5bmMgbW9kZSwgc28gd2UgY2FuIGRvIHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUgYXMgd3JpdGVzCisgICAgaFBpcGUucmVzZXQoQ3JlYXRlRmlsZUEocGlwZW5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBubyBzaGFyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgLy8gb3BlbnMgZXhpc3RpbmcgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsgLy8gbm8gdGVtcGxhdGUgZmlsZQorCisgICAgaWYgKGhQaXBlLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICBicmVhazsgLy8gc3VjY2VzcyEKKworICAgIGlmICg6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX1BJUEVfQlVTWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGU6Om9wZW4gOjpDcmVhdGVGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlVuYWJsZSB0byBvcGVuIHBpcGUiKTsKKyAgICB9CisgIH0gd2hpbGUgKDo6V2FpdE5hbWVkUGlwZUEocGlwZW5hbWVfLmNfc3RyKCksIFRpbWVvdXRTZWNvbmRzXyAqIDEwMDApKTsKKworICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlOjpvcGVuIDo6Q3JlYXRlRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVW5hYmxlIHRvIG9wZW4gcGlwZSIpOworICB9CisKKyAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVJbXBsKGhQaXBlKSk7Cit9CisKK3ZvaWQgVFBpcGU6OmNsb3NlKCkgeworICBpbXBsXy5yZXNldCgpOworfQorCit1aW50MzJfdCBUUGlwZTo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoIWlzT3BlbigpKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlIik7CisgIHJldHVybiBpbXBsXy0+cmVhZChidWYsIGxlbik7Cit9CisKK3VpbnQzMl90IHBpcGVfcmVhZChIQU5ETEUgcGlwZSwgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgRFdPUkQgY2JSZWFkOworICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZShwaXBlLCAgICAvLyBwaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsICAgICAvLyBidWZmZXIgdG8gcmVjZWl2ZSByZXBseQorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sICAgICAvLyBzaXplIG9mIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JSZWFkLCAvLyBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAvLyBub3Qgb3ZlcmxhcHBlZAorCisgIGlmICghZlN1Y2Nlc3MgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTU9SRV9EQVRBKQorICAgIHJldHVybiAwOyAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KKworICByZXR1cm4gY2JSZWFkOworfQorCit2b2lkIFRQaXBlOjp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoIWlzT3BlbigpKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZSIpOworICBpbXBsXy0+d3JpdGUoYnVmLCBsZW4pOworfQorCit2b2lkIHBpcGVfd3JpdGUoSEFORExFIHBpcGUsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIERXT1JEIGNiV3JpdHRlbjsKKyAgaW50IGZTdWNjZXNzID0gV3JpdGVGaWxlKHBpcGUsICAgICAgIC8vIHBpcGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsICAgICAgICAvLyBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sICAgICAgICAvLyBtZXNzYWdlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNiV3JpdHRlbiwgLy8gYnl0ZXMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgICAgLy8gbm90IG92ZXJsYXBwZWQKKworICBpZiAoIWZTdWNjZXNzKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJXcml0ZSB0byBwaXBlIGZhaWxlZCIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWNjZXNzb3JzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGQ6OnN0cmluZyBUUGlwZTo6Z2V0UGlwZW5hbWUoKSB7CisgIHJldHVybiBwaXBlbmFtZV87Cit9CisKK3ZvaWQgVFBpcGU6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgeworICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHBpcGVuYW1lXyA9ICJcXFxcLlxccGlwZVxcIiArIHBpcGVuYW1lOworICBlbHNlCisgICAgcGlwZW5hbWVfID0gcGlwZW5hbWU7Cit9CisKK0hBTkRMRSBUUGlwZTo6Z2V0UGlwZUhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0UGlwZUhhbmRsZSgpOworICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKK3ZvaWQgVFBpcGU6OnNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHsKKyAgaWYgKGlzQW5vbnltb3VzXykKKyAgICBpbXBsXy0+c2V0UGlwZUhhbmRsZShwaXBlaGFuZGxlKTsKKyAgZWxzZQorICB7CisgICAgVEF1dG9IYW5kbGUgcGlwZShwaXBlaGFuZGxlKTsKKyAgICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZUltcGwocGlwZSkpOworICB9Cit9CisKK0hBTkRMRSBUUGlwZTo6Z2V0V3J0UGlwZUhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0V3J0UGlwZUhhbmRsZSgpOworICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKK3ZvaWQgVFBpcGU6OnNldFdydFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpIHsKKyAgaWYgKGltcGxfKQorICAgIGltcGxfLT5zZXRXcnRQaXBlSGFuZGxlKHBpcGVoYW5kbGUpOworfQorCitIQU5ETEUgVFBpcGU6OmdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7CisgIGlmIChpbXBsXykKKyAgICByZXR1cm4gaW1wbF8tPmdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKKyAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCitsb25nIFRQaXBlOjpnZXRDb25uVGltZW91dCgpIHsKKyAgcmV0dXJuIFRpbWVvdXRTZWNvbmRzXzsKK30KKwordm9pZCBUUGlwZTo6c2V0Q29ublRpbWVvdXQobG9uZyBzZWNvbmRzKSB7CisgIFRpbWVvdXRTZWNvbmRzXyA9IHNlY29uZHM7Cit9CisKKyNlbmRpZiAvL19XSU4zMgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExNGY5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RQSVBFX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RQSVBFX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBXaW5kb3dzIFBpcGVzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqIERvbid0IGRlc3Ryb3kgYSBUUGlwZSBhdCBnbG9iYWwgc2NvcGUsIGFzIHRoYXQgd2lsbCBjYXVzZSBhIHRocmVhZCBqb2luCisgKiBkdXJpbmcgRExMTWFpbi4gIFRoYXQgYWxzbyBtZWFucyB0aGF0IGNsaWVudCBvYmplY3RzIHVzaW5nIFRQaXBlIHNob3VsZG4ndCBiZSBhdCBnbG9iYWwKKyAqIHNjb3BlLgorICovCisjaWZkZWYgX1dJTjMyCitjbGFzcyBUUGlwZUltcGw7CisKK2NsYXNzIFRQaXBlIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRQaXBlPiB7CitwdWJsaWM6CisgIC8vIENvbnN0cnVjdHMgYSBuZXcgcGlwZSBvYmplY3QuCisgIFRQaXBlKCk7CisgIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3JzIC0KKyAgZXhwbGljaXQgVFBpcGUoSEFORExFIFBpcGUpOyAgICAgICAvLyBIQU5ETEUgaXMgYSB2b2lkKgorICBleHBsaWNpdCBUUGlwZShUQXV0b0hhbmRsZSYgUGlwZSk7IC8vIHRoaXMgY3RvciB3aWxsIGNsZWFyIG91dCAvIG1vdmUgZnJvbSBQaXBlCisgIC8vIG5lZWQgYSBjb25zdCBjaGFyICogb3ZlcmxvYWQgc28gc3RyaW5nIGxpdGVyYWxzIGRvbid0IGdvIHRvIHRoZSBIQU5ETEUgb3ZlcmxvYWQKKyAgZXhwbGljaXQgVFBpcGUoY29uc3QgY2hhciogcGlwZW5hbWUpOworICBleHBsaWNpdCBUUGlwZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICAvLyBBbm9ueW1vdXMgcGlwZSAtCisgIFRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KTsKKworICAvLyBEZXN0cm95cyB0aGUgcGlwZSBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICB2aXJ0dWFsIH5UUGlwZSgpOworCisgIC8vIFJldHVybnMgd2hldGhlciB0aGUgcGlwZSBpcyBvcGVuICYgdmFsaWQuCisgIHZpcnR1YWwgYm9vbCBpc09wZW4oKTsKKworICAvLyBDaGVja3Mgd2hldGhlciBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSBwaXBlLgorICB2aXJ0dWFsIGJvb2wgcGVlaygpOworCisgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBuYW1lZC9hbm9ueW1vdXMgcGlwZS4KKyAgdmlydHVhbCB2b2lkIG9wZW4oKTsKKworICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBwaXBlLgorICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAvLyBSZWFkcyBmcm9tIHRoZSBwaXBlLgorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIC8vIFdyaXRlcyB0byB0aGUgcGlwZS4KKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvLyBBY2Nlc3NvcnMKKyAgc3RkOjpzdHJpbmcgZ2V0UGlwZW5hbWUoKTsKKyAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAvLyBkb3VibGVzIGFzIHRoZSByZWFkIGhhbmRsZSBmb3IgYW5vbiBwaXBlCisgIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSk7CisgIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCk7CisgIHZvaWQgc2V0V3J0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSk7CisgIGxvbmcgZ2V0Q29ublRpbWVvdXQoKTsKKyAgdm9pZCBzZXRDb25uVGltZW91dChsb25nIHNlY29uZHMpOworCisgIC8vIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBnZW5lcmljIC8gdGVtcGxhdGUgc2l0dWF0aW9ucywKKyAgLy8gc28gaXRzIG5hbWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgVFBpcGVTZXJ2ZXIncworICBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVJbXBsPiBpbXBsXzsKKworICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CisKKyAgbG9uZyBUaW1lb3V0U2Vjb25kc187CisgIGJvb2wgaXNBbm9ueW1vdXNfOworfTsKKworI2Vsc2UKK3R5cGVkZWYgVFNvY2tldCBUUGlwZTsKKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RQSVBFX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzM1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcApAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oPgorI2luY2x1ZGUgPEFjY0N0cmwuaD4KKyNpbmNsdWRlIDxBY2xhcGkuaD4KKyNlbmRpZiAvL19XSU4zMgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKyNpZmRlZiBfV0lOMzIKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitjbGFzcyBUUGlwZVNlcnZlckltcGwgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICBUUGlwZVNlcnZlckltcGwoKSB7fQorICB2aXJ0dWFsIH5UUGlwZVNlcnZlckltcGwoKSB7fQorICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgPSAwOworCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIE5VTEw7IH0KK307CisKK2NsYXNzIFRBbm9uUGlwZVNlcnZlciA6IHB1YmxpYyBUUGlwZVNlcnZlckltcGwgeworcHVibGljOgorICBUQW5vblBpcGVTZXJ2ZXIoKSB7CisgICAgLy8gVGhlIGFub255bW91cyBwaXBlIG5lZWRzIHRvIGJlIGNyZWF0ZWQgZmlyc3Qgc28gdGhhdCB0aGUgc2VydmVyIGNhbgorICAgIC8vIHBhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQorICAgIC8vIGJsb2NraW5nIGNhbGwuCisgICAgaWYgKCFjcmVhdGVBbm9uUGlwZSgpKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDcmVhdGUoQW5vbilQaXBlIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgQ3JlYXRlKEFub24pUGlwZSBmYWlsZWQiKTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIH5UQW5vblBpcGVTZXJ2ZXIoKSB7CisgICAgUGlwZVJfLnJlc2V0KCk7CisgICAgUGlwZVdfLnJlc2V0KCk7CisgICAgQ2xpZW50QW5vblJlYWRfLnJlc2V0KCk7CisgICAgQ2xpZW50QW5vbldyaXRlXy5yZXNldCgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpIHt9IC8vIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQKKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVSXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlV18uaDsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSB7IHJldHVybiBDbGllbnRBbm9uUmVhZF8uaDsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gQ2xpZW50QW5vbldyaXRlXy5oOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgY3JlYXRlQW5vblBpcGUoKTsKKworICBUQXV0b0hhbmRsZSBQaXBlUl87IC8vIEFub255bW91cyBQaXBlIChSKQorICBUQXV0b0hhbmRsZSBQaXBlV187IC8vIEFub255bW91cyBQaXBlIChXKQorCisgIC8vIENsaWVudCBzaWRlIGFub255bW91cyBwaXBlIGhhbmRsZXMKKyAgLy8/IERvIHdlIG5lZWQgZHVwbGljYXRlcyB0byBzZW5kIHRvIGNsaWVudD8KKyAgVEF1dG9IYW5kbGUgQ2xpZW50QW5vblJlYWRfOworICBUQXV0b0hhbmRsZSBDbGllbnRBbm9uV3JpdGVfOworfTsKKworY2xhc3MgVE5hbWVkUGlwZVNlcnZlciA6IHB1YmxpYyBUUGlwZVNlcnZlckltcGwgeworcHVibGljOgorICBUTmFtZWRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSwgdWludDMyX3QgbWF4Y29ubmVjdGlvbnMpCisgICAgOiBzdG9wcGluZ18oZmFsc2UpLCBwaXBlbmFtZV8ocGlwZW5hbWUpLCBidWZzaXplXyhidWZzaXplKSwgbWF4Y29ubnNfKG1heGNvbm5lY3Rpb25zKQorICB7CisgICAgY29ubmVjdE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OkNPTk5FQ1Q7CisgICAgY2FuY2VsT3ZlcmxhcF8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6Q0FOQ0VMSU87CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgIH0KKyAgdmlydHVhbCB+VE5hbWVkUGlwZVNlcnZlcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBjYWNoZWRfY2xpZW50Xy5yZXNldCgpOworICAgIGlmIChQaXBlXy5oICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICBzdG9wcGluZ18gPSB0cnVlOworICAgICAgY2FuY2VsT3ZlcmxhcF8uaCA9IFBpcGVfLmg7CisgICAgICAvLyBUaGlzIHNob3VsZCB3YWtlIHVwIEdldE92ZXJsYXBwZWRSZXN1bHQKKyAgICAgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZjYW5jZWxPdmVybGFwXyk7CisgICAgfQorICB9CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIGxpc3Rlbl9ldmVudF8uaDsgfQorCitwcml2YXRlOgorICBib29sIGNyZWF0ZU5hbWVkUGlwZShjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZik7CisgIHZvaWQgaW5pdGlhdGVOYW1lZENvbm5lY3QoY29uc3QgVEF1dG9Dcml0ICZsb2NrUHJvb2YpOworCisgIFRBdXRvT3ZlcmxhcFRocmVhZCB0aHJlYWRfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIGNvbm5lY3RPdmVybGFwXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBjYW5jZWxPdmVybGFwXzsKKworICBib29sIHN0b3BwaW5nXzsKKyAgc3RkOjpzdHJpbmcgcGlwZW5hbWVfOworICB1aW50MzJfdCBidWZzaXplXzsKKyAgdWludDMyX3QgbWF4Y29ubnNfOworICBUTWFudWFsUmVzZXRFdmVudCBsaXN0ZW5fZXZlbnRfOworCisgIFRDcml0aWNhbFNlY3Rpb24gcGlwZV9wcm90ZWN0XzsKKyAgLy8gb25seSByZWFkIG9yIHdyaXRlIHRoZXNlIHZhcmlhYmxlcyB1bmRlcm5lYXRoIGEgbG9ja2VkIHBpcGVfcHJvdGVjdF8KKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlPiBjYWNoZWRfY2xpZW50XzsKKyAgVEF1dG9IYW5kbGUgUGlwZV87Cit9OworCitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7CisgIGlmIChpbXBsXykKKyAgICByZXR1cm4gaW1wbF8tPmdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLS0tLSBDb25zdHJ1Y3RvcnMgLS0tLQorVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSkKKyAgOiBidWZzaXplXyhidWZzaXplKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKFRQSVBFX1NFUlZFUl9NQVhfQ09OTlNfREVGQVVMVCk7CisgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKK30KKworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSwgdWludDMyX3QgbWF4Y29ubmVjdGlvbnMpCisgIDogYnVmc2l6ZV8oYnVmc2l6ZSksIGlzQW5vbnltb3VzXyhmYWxzZSkgeworICBzZXRNYXhDb25uZWN0aW9ucyhtYXhjb25uZWN0aW9ucyk7CisgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKK30KKworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgOiBidWZzaXplXygxMDI0KSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKFRQSVBFX1NFUlZFUl9NQVhfQ09OTlNfREVGQVVMVCk7CisgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKK30KKworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGludCBidWZzaXplKSA6IGJ1ZnNpemVfKGJ1ZnNpemUpLCBpc0Fub255bW91c18odHJ1ZSkgeworICBzZXRNYXhDb25uZWN0aW9ucygxKTsKKyAgaW1wbF8ucmVzZXQobmV3IFRBbm9uUGlwZVNlcnZlcik7Cit9CisKK1RQaXBlU2VydmVyOjpUUGlwZVNlcnZlcigpIDogYnVmc2l6ZV8oMTAyNCksIGlzQW5vbnltb3VzXyh0cnVlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKDEpOworICBpbXBsXy5yZXNldChuZXcgVEFub25QaXBlU2VydmVyKTsKK30KKworLy8tLS0tIERlc3RydWN0b3IgLS0tLQorVFBpcGVTZXJ2ZXI6On5UUGlwZVNlcnZlcigpIHt9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc3BvcnQgY2FsbGJhY2tzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBUUGlwZVNlcnZlcjo6bGlzdGVuKCkgeworICBpZiAoaXNBbm9ueW1vdXNfKQorICAgIHJldHVybjsKKyAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVTZXJ2ZXIocGlwZW5hbWVfLCBidWZzaXplXywgbWF4Y29ubnNfKSk7Cit9CisKK3NoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVFBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7CisgIHJldHVybiBpbXBsXy0+YWNjZXB0SW1wbCgpOworfQorCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFRBbm9uUGlwZVNlcnZlcjo6YWNjZXB0SW1wbCgpIHsKKyAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KKyAgYnl0ZSBidWY7CisgIERXT1JEIGJyOworICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZShQaXBlUl8uaCwgLy8gcGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZiwgICAgIC8vIGJ1ZmZlciB0byByZWNlaXZlIHJlcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAvLyBzaXplIG9mIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnIsICAgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgIC8vIG5vdCBvdmVybGFwcGVkCisKKyAgaWYgKCFmU3VjY2VzcyAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9NT1JFX0RBVEEpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tcywgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUUGlwZVNlcnZlciB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tcyIpOworICB9CisgIHNoYXJlZF9wdHI8VFBpcGU+IGNsaWVudChuZXcgVFBpcGUoUGlwZVJfLmgsIFBpcGVXXy5oKSk7CisgIHJldHVybiBjbGllbnQ7Cit9CisKK3ZvaWQgVE5hbWVkUGlwZVNlcnZlcjo6aW5pdGlhdGVOYW1lZENvbm5lY3QoY29uc3QgVEF1dG9Dcml0ICZsb2NrUHJvb2YpIHsKKyAgaWYgKHN0b3BwaW5nXykKKyAgICByZXR1cm47CisgIGlmICghY3JlYXRlTmFtZWRQaXBlKGxvY2tQcm9vZikpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDcmVhdGVOYW1lZFBpcGUgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVFBpcGVTZXJ2ZXIgQ3JlYXRlTmFtZWRQaXBlIGZhaWxlZCIpOworICB9CisKKyAgLy8gVGhlIHByaW9yIGNvbm5lY3Rpb24gaGFzIGJlZW4gaGFuZGxlZCwgc28gY2xvc2UgdGhlIGdhdGUKKyAgUmVzZXRFdmVudChsaXN0ZW5fZXZlbnRfLmgpOworICBjb25uZWN0T3ZlcmxhcF8ucmVzZXQoTlVMTCwgMCwgbGlzdGVuX2V2ZW50Xy5oKTsKKyAgY29ubmVjdE92ZXJsYXBfLmggPSBQaXBlXy5oOworICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmY29ubmVjdE92ZXJsYXBfKTsKKworICAvLyBXYWl0IGZvciB0aGUgY2xpZW50IHRvIGNvbm5lY3Q7IGlmIGl0IHN1Y2NlZWRzLCB0aGUKKyAgLy8gZnVuY3Rpb24gcmV0dXJucyBhIG5vbnplcm8gdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgIC8vIHplcm8sIEdldExhc3RFcnJvciBzaG91bGQgcmV0dXJuIEVSUk9SX1BJUEVfQ09OTkVDVEVELgorICBpZiAoY29ubmVjdE92ZXJsYXBfLnN1Y2Nlc3MpIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJDbGllbnQgY29ubmVjdGVkLiIpOworICAgIGNhY2hlZF9jbGllbnRfLnJlc2V0KG5ldyBUUGlwZShQaXBlXykpOworICAgIC8vIG1ha2Ugc3VyZSBwZW9wbGUga25vdyB0aGF0IGEgY29ubmVjdGlvbiBpcyByZWFkeQorICAgIFNldEV2ZW50KGxpc3Rlbl9ldmVudF8uaCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRFdPUkQgZHdFcnIgPSBjb25uZWN0T3ZlcmxhcF8ubGFzdF9lcnJvcjsKKyAgc3dpdGNoIChkd0VycikgeworICBjYXNlIEVSUk9SX1BJUEVfQ09OTkVDVEVEOgorICAgIEdsb2JhbE91dHB1dC5wcmludGYoIkNsaWVudCBjb25uZWN0ZWQuIik7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8gbWFrZSBzdXJlIHBlb3BsZSBrbm93IHRoYXQgYSBjb25uZWN0aW9uIGlzIHJlYWR5CisgICAgU2V0RXZlbnQobGlzdGVuX2V2ZW50Xy5oKTsKKyAgICByZXR1cm47CisgIGNhc2UgRVJST1JfSU9fUEVORElORzoKKyAgICByZXR1cm47IC8vIGFjY2VwdEltcGwgd2lsbCBkbyB0aGUgYXBwcm9wcmlhdGUgV2FpdEZvck11bHRpcGxlT2JqZWN0cworICBkZWZhdWx0OgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgZmFpbGVkLCBHTEU9IiwgZHdFcnIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgZmFpbGVkIik7CisgIH0KK30KKworc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUTmFtZWRQaXBlU2VydmVyOjphY2NlcHRJbXBsKCkgeworICB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgaWYgKGNhY2hlZF9jbGllbnRfLmdldCgpICE9IE5VTEwpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFBpcGU+IGNsaWVudDsKKyAgICAgIC8vIHplcm8gb3V0IGNhY2hlZF9jbGllbnQsIHNpbmNlIHdlIGFyZSBhYm91dCB0byByZXR1cm4gaXQuCisgICAgICBjbGllbnQuc3dhcChjYWNoZWRfY2xpZW50Xyk7CisKKyAgICAgIC8vIGtpY2sgb2ZmIHRoZSBuZXh0IGNvbm5lY3Rpb24gYmVmb3JlIHJldHVybmluZworICAgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgICAgICByZXR1cm4gY2xpZW50OyAvLyBzdWNjZXNzIQorICAgIH0KKyAgfQorCisgIGlmIChQaXBlXy5oID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTmFtZWRQaXBlU2VydmVyOiBzb21lb25lIGNhbGxlZCBhY2NlcHQgb24gYSBjbG9zZWQgcGlwZSBzZXJ2ZXIiKTsKKyAgfQorCisgIERXT1JEIGR3RHVtbXkgPSAwOworCisgIC8vIEZvciB0aGUgbW9zdCBwYXJ0LCBQaXBlXyBzaG91bGQgYmUgcHJvdGVjdGVkIHdpdGggcGlwZV9wcm90ZWN0Xy4gIFdlIGNhbid0CisgIC8vIHJlYXNvbmFibHkgZG8gdGhhdCBoZXJlIHRob3VnaCB3aXRob3V0IGJyZWFraW5nIGludGVycnVwdGFiaWxpdHkuICBIb3dldmVyLAorICAvLyB0aGlzIHNob3VsZCBiZSBzYWZlLCB0aG91Z2ggSSdtIG5vdCBoYXBweSBhYm91dCBpdC4gIFdlIG9ubHkgbmVlZCB0byBlbnN1cmUKKyAgLy8gdGhhdCBubyBvbmUgd3JpdGVzIC8gbW9kaWZpZXMgUGlwZV8uaCB3aGlsZSB3ZSBhcmUgcmVhZGluZyBpdC4gIFdlbGwsIHRoZQorICAvLyBvbmx5IHR3byB0aGluZ3MgdGhhdCBzaG91bGQgYmUgbW9kaWZ5aW5nIFBpcGVfIGFyZSBhY2NlcHRJbXBsLCB0aGUKKyAgLy8gZnVuY3Rpb25zIGl0IGNhbGxzLCBhbmQgdGhlIGRlc3RydWN0b3IuICBUaG9zZSB0aGluZ3Mgc2hvdWxkbid0IGJlIHJ1bgorICAvLyBjb25jdXJyZW50bHkgYW55d2F5LiAgU28gdGhpcyBjYWxsIGlzICdyZWFsbHknIGp1c3QgYSByZWFkIHRoYXQgbWF5IGhhcHBlbgorICAvLyBjb25jdXJyZW50bHkgd2l0aCBpbnRlcnJ1cHQsIGFuZCB0aGF0IHNob3VsZCBiZSBmaW5lLgorICBpZiAoR2V0T3ZlcmxhcHBlZFJlc3VsdChQaXBlXy5oLCAmY29ubmVjdE92ZXJsYXBfLm92ZXJsYXAsICZkd0R1bW15LCBUUlVFKSkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIkNsaWVudCBjb25uZWN0ZWQuIik7CisgICAgc2hhcmVkX3B0cjxUUGlwZT4gY2xpZW50KG5ldyBUUGlwZShQaXBlXykpOworICAgIC8vIGtpY2sgb2ZmIHRoZSBuZXh0IGNvbm5lY3Rpb24gYmVmb3JlIHJldHVybmluZworICAgIGluaXRpYXRlTmFtZWRDb25uZWN0KGxvY2spOworICAgIHJldHVybiBjbGllbnQ7IC8vIHN1Y2Nlc3MhCisgIH0KKyAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgYXJlIGluIGFuIGVycm9yIC8gc2h1dGRvd24gY2FzZQorICBEV09SRCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsgLy8gc2F2ZSBlcnJvciBiZWZvcmUgZG9pbmcgY2xlYW51cAorICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDb25uZWN0TmFtZWRQaXBlIEdMRT0iLCBnbGUpOworICBpZihnbGUgPT0gRVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsgICAgCS8vIE5lZWRlZCB0byBpbnN1cmUgY29uY3VycmVudCB0aHJlYWQgdG8gYmUgb3V0IG9mIGludGVycnVwdC4KKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCAiVFBpcGVTZXJ2ZXI6IHNlcnZlciBpbnRlcnVwdGVkIik7CisgIH0KKyAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRQaXBlU2VydmVyOiBjbGllbnQgY29ubmVjdGlvbiBmYWlsZWQiKTsKK30KKwordm9pZCBUUGlwZVNlcnZlcjo6aW50ZXJydXB0KCkgeworICBpZiAoaW1wbF8pCisgICAgaW1wbF8tPmludGVycnVwdCgpOworfQorCit2b2lkIFRQaXBlU2VydmVyOjpjbG9zZSgpIHsKKyAgaW1wbF8ucmVzZXQoKTsKK30KKworYm9vbCBUTmFtZWRQaXBlU2VydmVyOjpjcmVhdGVOYW1lZFBpcGUoY29uc3QgVEF1dG9Dcml0ICYgLypsb2NrUHJvb2YqLykgeworCisgIC8vIFdpbmRvd3MgLSBzZXQgc2VjdXJpdHkgdG8gYWxsb3cgbm9uLWVsZXZhdGVkIGFwcHMKKyAgLy8gdG8gYWNjZXNzIHBpcGVzIGNyZWF0ZWQgYnkgZWxldmF0ZWQgYXBwcy4KKyAgU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZIFNJREF1dGhXb3JsZCA9IFNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFk7CisgIFBTSUQgZXZlcnlvbmVfc2lkID0gTlVMTDsKKyAgQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKAorICAgICAgJlNJREF1dGhXb3JsZCwgMSwgU0VDVVJJVFlfV09STERfUklELCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAmZXZlcnlvbmVfc2lkKTsKKworICBFWFBMSUNJVF9BQ0NFU1MgZWE7CisgIFplcm9NZW1vcnkoJmVhLCBzaXplb2YoRVhQTElDSVRfQUNDRVNTKSk7CisgIGVhLmdyZkFjY2Vzc1Blcm1pc3Npb25zID0gU1BFQ0lGSUNfUklHSFRTX0FMTCB8IFNUQU5EQVJEX1JJR0hUU19BTEw7CisgIGVhLmdyZkFjY2Vzc01vZGUgPSBTRVRfQUNDRVNTOworICBlYS5ncmZJbmhlcml0YW5jZSA9IE5PX0lOSEVSSVRBTkNFOworICBlYS5UcnVzdGVlLlRydXN0ZWVGb3JtID0gVFJVU1RFRV9JU19TSUQ7CisgIGVhLlRydXN0ZWUuVHJ1c3RlZVR5cGUgPSBUUlVTVEVFX0lTX1dFTExfS05PV05fR1JPVVA7CisgIGVhLlRydXN0ZWUucHRzdHJOYW1lID0gc3RhdGljX2Nhc3Q8TFBUU1RSPihldmVyeW9uZV9zaWQpOworCisgIFBBQ0wgYWNsID0gTlVMTDsKKyAgU2V0RW50cmllc0luQWNsKDEsICZlYSwgTlVMTCwgJmFjbCk7CisKKyAgUFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2QgPSAoUFNFQ1VSSVRZX0RFU0NSSVBUT1IpTG9jYWxBbGxvYyhMUFRSLCBTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpOworICBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKTsKKyAgU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbChzZCwgVFJVRSwgYWNsLCBGQUxTRSk7CisKKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKKyAgc2Eubkxlbmd0aCA9IHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKTsKKyAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgPSBzZDsKKyAgc2EuYkluaGVyaXRIYW5kbGUgPSBGQUxTRTsKKworICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIG5hbWVkIHBpcGUKKyAgVEF1dG9IYW5kbGUgaFBpcGUoQ3JlYXRlTmFtZWRQaXBlQShwaXBlbmFtZV8uY19zdHIoKSwgICAgLy8gcGlwZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9BQ0NFU1NfRFVQTEVYIHwgIC8vIHJlYWQvd3JpdGUgYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQsIC8vIGFzeW5jIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1RZUEVfQllURSB8ICAgICAgLy8gYnl0ZSB0eXBlIHBpcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1JFQURNT0RFX0JZVEUsICAgLy8gYnl0ZSByZWFkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb25uc18sICAgICAgICAgICAgLy8gbWF4LiBpbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplXywgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZV8sICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCB0aW1lLW91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYSkpOyAgICAgICAgICAgICAgICAvLyBzZWN1cml0eSBhdHRyaWJ1dGVzCisKKyAgRFdPUkQgbGFzdEVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgIExvY2FsRnJlZShzZCk7CisgIExvY2FsRnJlZShhY2wpOworICBGcmVlU2lkKGV2ZXJ5b25lX3NpZCk7CisKKyAgaWYgKGhQaXBlLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBQaXBlXy5yZXNldCgpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyOjpUQ3JlYXRlTmFtZWRQaXBlKCkgR0xFPSIsIGxhc3RFcnJvcik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICBsYXN0RXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFBpcGVfLnJlc2V0KGhQaXBlLnJlbGVhc2UoKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRBbm9uUGlwZVNlcnZlcjo6Y3JlYXRlQW5vblBpcGUoKSB7CisgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2E7CisgIFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7IC8vIHNlY3VyaXR5IGluZm9ybWF0aW9uIGZvciBwaXBlcworCisgIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoJnNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKTsKKyAgU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCgmc2QsIHRydWUsIE5VTEwsIGZhbHNlKTsKKyAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgPSAmc2Q7CisgIHNhLm5MZW5ndGggPSBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUyk7CisgIHNhLmJJbmhlcml0SGFuZGxlID0gdHJ1ZTsgLy8gYWxsb3cgcGFzc2luZyBoYW5kbGUgdG8gY2hpbGQKKworICBIQU5ETEUgQ2xpZW50QW5vblJlYWRILCBQaXBlV19ILCBDbGllbnRBbm9uV3JpdGVILCBQaXBlX0g7CisgIGlmICghQ3JlYXRlUGlwZSgmQ2xpZW50QW5vblJlYWRILCAmUGlwZVdfSCwgJnNhLCAwKSkgLy8gY3JlYXRlIHN0ZGluIHBpcGUKKyAgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDcmVhdGVQaXBlKCZQaXBlX0gsICZDbGllbnRBbm9uV3JpdGVILCAmc2EsIDApKSAvLyBjcmVhdGUgc3Rkb3V0IHBpcGUKKyAgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICBDbG9zZUhhbmRsZShDbGllbnRBbm9uUmVhZEgpOworICAgIENsb3NlSGFuZGxlKFBpcGVXX0gpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIENsaWVudEFub25SZWFkXy5yZXNldChDbGllbnRBbm9uUmVhZEgpOworICBDbGllbnRBbm9uV3JpdGVfLnJlc2V0KENsaWVudEFub25Xcml0ZUgpOworICBQaXBlUl8ucmVzZXQoUGlwZV9IKTsKKyAgUGlwZVdfLnJlc2V0KFBpcGVXX0gpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWNjZXNzb3JzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RkOjpzdHJpbmcgVFBpcGVTZXJ2ZXI6OmdldFBpcGVuYW1lKCkgeworICByZXR1cm4gcGlwZW5hbWVfOworfQorCit2b2lkIFRQaXBlU2VydmVyOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIHsKKyAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICBwaXBlbmFtZV8gPSAiXFxcXC5cXHBpcGVcXCIgKyBwaXBlbmFtZTsKKyAgZWxzZQorICAgIHBpcGVuYW1lXyA9IHBpcGVuYW1lOworfQorCitpbnQgVFBpcGVTZXJ2ZXI6OmdldEJ1ZmZlclNpemUoKSB7CisgIHJldHVybiBidWZzaXplXzsKK30KK3ZvaWQgVFBpcGVTZXJ2ZXI6OnNldEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpIHsKKyAgYnVmc2l6ZV8gPSBidWZzaXplOworfQorCitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0V3J0UGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldFdydFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorSEFORExFIFRQaXBlU2VydmVyOjpnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRDbGllbnRSZFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorSEFORExFIFRQaXBlU2VydmVyOjpnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKK2Jvb2wgVFBpcGVTZXJ2ZXI6OmdldEFub255bW91cygpIHsKKyAgcmV0dXJuIGlzQW5vbnltb3VzXzsKK30KK3ZvaWQgVFBpcGVTZXJ2ZXI6OnNldEFub255bW91cyhib29sIGFub24pIHsKKyAgaXNBbm9ueW1vdXNfID0gYW5vbjsKK30KKwordm9pZCBUUGlwZVNlcnZlcjo6c2V0TWF4Q29ubmVjdGlvbnModWludDMyX3QgbWF4Y29ubmVjdGlvbnMpIHsKKyAgaWYgKG1heGNvbm5lY3Rpb25zID09IDApCisgICAgbWF4Y29ubnNfID0gMTsKKyAgZWxzZSBpZiAobWF4Y29ubmVjdGlvbnMgPiBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpCisgICAgbWF4Y29ubnNfID0gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTOworICBlbHNlCisgICAgbWF4Y29ubnNfID0gbWF4Y29ubmVjdGlvbnM7Cit9CisKKyNlbmRpZiAvL19XSU4zMgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMTNlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJXSU5QSVBFU19IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNlbmRpZgorCisjZGVmaW5lIFRQSVBFX1NFUlZFUl9NQVhfQ09OTlNfREVGQVVMVCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFdpbmRvd3MgUGlwZXMgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydC4KKyAqIERvbid0IGRlc3Ryb3kgYSBUUGlwZVNlcnZlciBhdCBnbG9iYWwgc2NvcGUsIGFzIHRoYXQgd2lsbCBjYXVzZSBhIHRocmVhZCBqb2luCisgKiBkdXJpbmcgRExMTWFpbi4gIFRoYXQgYWxzbyBtZWFucyB0aGF0IFRTZXJ2ZXIncyB1c2luZyBUUGlwZVNlcnZlciBzaG91bGRuJ3QgYmUgYXQgZ2xvYmFsCisgKiBzY29wZS4KKyAqLworI2lmZGVmIF9XSU4zMgorY2xhc3MgVFBpcGVTZXJ2ZXJJbXBsOworY2xhc3MgVFBpcGU7CisKK2NsYXNzIFRQaXBlU2VydmVyIDogcHVibGljIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICAvLyBDb25zdHJ1Y3RvcnMKKyAgLy8gTmFtZWQgUGlwZSAtCisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSwgdWludDMyX3QgbWF4Y29ubmVjdGlvbnMpOworICBUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICAvLyBBbm9ueW1vdXMgcGlwZSAtCisgIFRQaXBlU2VydmVyKGludCBidWZzaXplKTsKKyAgVFBpcGVTZXJ2ZXIoKTsKKworICAvLyBEZXN0cnVjdG9yCisgIHZpcnR1YWwgflRQaXBlU2VydmVyKCk7CisKKyAgLy8gU3RhbmRhcmQgdHJhbnNwb3J0IGNhbGxiYWNrcworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCk7CisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICB2aXJ0dWFsIHZvaWQgbGlzdGVuKCk7CisKKyAgLy8gQWNjZXNzb3JzCisgIHN0ZDo6c3RyaW5nIGdldFBpcGVuYW1lKCk7CisgIHZvaWQgc2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKKyAgaW50IGdldEJ1ZmZlclNpemUoKTsKKyAgdm9pZCBzZXRCdWZmZXJTaXplKGludCBidWZzaXplKTsKKyAgSEFORExFIGdldFBpcGVIYW5kbGUoKTsgLy8gTmFtZWQgUGlwZSBSL1cgLW9yLSBBbm9ueW1vdXMgcGlwZSBSZWFkIGhhbmRsZQorICBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpOworICBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCk7CisgIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCk7CisgIGJvb2wgZ2V0QW5vbnltb3VzKCk7CisgIHZvaWQgc2V0QW5vbnltb3VzKGJvb2wgYW5vbik7CisgIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnModWludDMyX3QgbWF4Y29ubmVjdGlvbnMpOworCisgIC8vIHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBnZW5lcmljIC8gdGVtcGxhdGUgc2l0dWF0aW9ucywKKyAgLy8gc28gaXRzIG5hbWUgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgVFBpcGUncworICBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpOworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlU2VydmVySW1wbD4gaW1wbF87CisKKyAgc3RkOjpzdHJpbmcgcGlwZW5hbWVfOworICB1aW50MzJfdCBidWZzaXplXzsKKyAgdWludDMyX3QgbWF4Y29ubnNfOworICBib29sIGlzQW5vbnltb3VzXzsKK307CisjZWxzZSAvL19XSU4zMgorLy8qTklYIG5hbWVkIHBpcGUgaW1wbGVtZW50YXRpb24gdXNlcyBkb21haW4gc29ja2V0Cit0eXBlZGVmIFRTZXJ2ZXJTb2NrZXQgVFBpcGVTZXJ2ZXI7CisjZW5kaWYKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjA1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogU1NMIHNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24uCisgKi8KK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVFNlcnZlclNvY2tldChhZGRyZXNzLCBwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gVFNTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KSB7CisgIGlmIChpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKSB7CisgICAgICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQsIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfKTsKKworICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc1ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKKworLyoqCisgKiBTZXJ2ZXIgc29ja2V0IHRoYXQgYWNjZXB0cyBTU0wgY29ubmVjdGlvbnMuCisgKi8KK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclNvY2tldCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgKiBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgKiBAcGFyYW0gZmFjdG9yeSAgICAgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4ZTliMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKQEAgLTAsMCArMSwxMTE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpZmRlZiBIQVZFX0FSUEFfSU5FVF9ICisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgT1BFTlNTTF9FTkdJTkVfQ0xFQU5VUF9SRVFVSVJFRF9CRUZPUkUgMHgxMDEwMDAwMEwKKworI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9FTkdJTkVfQ0xFQU5VUF9SRVFVSVJFRF9CRUZPUkUpCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlIHsKKyAgTXV0ZXggbXV0ZXg7Cit9OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8vIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24vY2xlYW51cAorCitzdGF0aWMgYm9vbCBvcGVuU1NMSW5pdGlhbGl6ZWQgPSBmYWxzZTsKK3N0YXRpYyBib29zdDo6c2hhcmVkX2FycmF5PE11dGV4PiBtdXRleGVzOworCitzdGF0aWMgdm9pZCBjYWxsYmFja0xvY2tpbmcoaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyKiwgaW50KSB7CisgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAvLyBhc3NlcnRpb24gb2YgKHB4ICE9IDApIGhlcmUgdHlwaWNhbGx5IG1lYW5zIHRoYXQgYSBUU1NMU29ja2V0J3MgbGlmZXRpbWUKKyAgICAvLyBleGNlZWRlZCB0aGUgbGlmZXRpbWUgb2YgdGhlIFRTU0xTb2NrZXRGYWN0b3J5IHRoYXQgY3JlYXRlZCBpdCwgYW5kIHRoZQorICAgIC8vIFRTU0xTb2NrZXRGYWN0b3J5IGFscmVhZHkgcmFuIGNsZWFudXBPcGVuU1NMKCksIHdoaWNoIGRlbGV0ZWQgIm11dGV4ZXMiLgorICAgIG11dGV4ZXNbbl0ubG9jaygpOworICB9IGVsc2UgeworICAgIG11dGV4ZXNbbl0udW5sb2NrKCk7CisgIH0KK30KKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxsYmFja1RocmVhZElEKCkgeworI2lmZGVmIF9XSU4zMgorICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFRocmVhZElkKCk7CisjZWxzZQorICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHRocmVhZF9zZWxmKCk7CisjZW5kaWYKK30KKyNlbmRpZgorCitzdGF0aWMgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGR5bl9jcmVhdGUoY29uc3QgY2hhciosIGludCkgeworICByZXR1cm4gbmV3IENSWVBUT19keW5sb2NrX3ZhbHVlOworfQorCitzdGF0aWMgdm9pZCBkeW5fbG9jayhpbnQgbW9kZSwgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlKiBsb2NrLCBjb25zdCBjaGFyKiwgaW50KSB7CisgIGlmIChsb2NrICE9IE5VTEwpIHsKKyAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICBsb2NrLT5tdXRleC5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvY2stPm11dGV4LnVubG9jaygpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBkeW5fZGVzdHJveShzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGxvY2ssIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgZGVsZXRlIGxvY2s7Cit9CisKK3ZvaWQgaW5pdGlhbGl6ZU9wZW5TU0woKSB7CisgIGlmIChvcGVuU1NMSW5pdGlhbGl6ZWQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgb3BlblNTTEluaXRpYWxpemVkID0gdHJ1ZTsKKyAgU1NMX2xpYnJhcnlfaW5pdCgpOworICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKyAgLy8gc3RhdGljIGxvY2tpbmcKKyAgLy8gbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTCBjaGFuZ2VkIENSWVBUT19udW1fbG9ja3MgLSBzZWUgVEhSSUZULTM4NzgKKyNpZmRlZiBDUllQVE9fbnVtX2xvY2tzCisgIG11dGV4ZXMgPSBib29zdDo6c2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbQ1JZUFRPX251bV9sb2NrcygpXSk7CisjZWxzZQorICBtdXRleGVzID0gYm9vc3Q6OnNoYXJlZF9hcnJheTxNdXRleD4obmV3IE11dGV4WyA6OkNSWVBUT19udW1fbG9ja3MoKV0pOworI2VuZGlmCisKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSURfQkVGT1JFKQorICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKGNhbGxiYWNrVGhyZWFkSUQpOworI2VuZGlmCisKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGNhbGxiYWNrTG9ja2luZyk7CisKKyAgLy8gZHluYW1pYyBsb2NraW5nCisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soZHluX2NyZWF0ZSk7CisgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGR5bl9sb2NrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soZHluX2Rlc3Ryb3kpOworfQorCit2b2lkIGNsZWFudXBPcGVuU1NMKCkgeworICBpZiAoIW9wZW5TU0xJbml0aWFsaXplZCkgeworICAgIHJldHVybjsKKyAgfQorICBvcGVuU1NMSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAvLyBodHRwczovL3dpa2kub3BlbnNzbC5vcmcvaW5kZXgucGhwL0xpYnJhcnlfSW5pdGlhbGl6YXRpb24jQ2xlYW51cAorICAvLyB3ZSBwdXJwb3NlZnVsbHkgZG8gTk9UIGNhbGwgRklQU19tb2RlX3NldCgwKSBhbmQgbGVhdmUgaXQgdXAgdG8gdGhlIGVuY2xvc2luZyBhcHBsaWNhdGlvbiB0byBtYW5hZ2UgRklQUyBlbnRpcmVseQorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9FTkdJTkVfQ0xFQU5VUF9SRVFVSVJFRF9CRUZPUkUpCisgIEVOR0lORV9jbGVhbnVwKCk7ICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvbWFuMS4xLjAvY3J5cHRvL0VOR0lORV9jbGVhbnVwLmh0bWwgLSBjbGVhbnVwIGNhbGwgaXMgbmVlZGVkIGJlZm9yZSAxLjEuMAorI2VuZGlmCisgIENPTkZfbW9kdWxlc191bmxvYWQoMSk7CisgIEVWUF9jbGVhbnVwKCk7CisgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIEVSUl9mcmVlX3N0cmluZ3MoKTsKKworICBtdXRleGVzLnJlc2V0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkgPSAwLCBpbnQgc3NsZXJybm8gPSAwKTsKK3N0YXRpYyBib29sIG1hdGNoTmFtZShjb25zdCBjaGFyKiBob3N0LCBjb25zdCBjaGFyKiBwYXR0ZXJuLCBpbnQgc2l6ZSk7CitzdGF0aWMgY2hhciB1cHBlcmNhc2UoY2hhciBjKTsKKworLy8gU1NMQ29udGV4dCBpbXBsZW1lbnRhdGlvbgorU1NMQ29udGV4dDo6U1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wpIHsKKyAgaWYgKHByb3RvY29sID09IFNTTFRMUykgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBTU0x2MykgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2M19tZXRob2QoKSk7CisjZW5kaWYKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8wKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8xKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxXzFfbWV0aG9kKCkpOworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzIpIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfMl9tZXRob2QoKSk7CisgIH0gZWxzZSB7CisgICAgLy8vIFVOS05PV04gUFJPVE9DT0whCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXc6IFVua25vd24gcHJvdG9jb2wiKTsKKyAgfQorCisgIGlmIChjdHhfID09IE5VTEwpIHsKKyAgICBzdHJpbmcgZXJyb3JzOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycyk7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXc6ICIgKyBlcnJvcnMpOworICB9CisgIFNTTF9DVFhfc2V0X21vZGUoY3R4XywgU1NMX01PREVfQVVUT19SRVRSWSk7CisKKyAgLy8gRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMgcHJvdG9jb2xzIGJ1dCBhbGxvdyBhIGhhbmRzaGFrZQorICAvLyB3aXRoIG9sZGVyIGNsaWVudHMgc28gdGhleSBnZXQgYSBncmFjZWZ1bCBkZW5pYWwuCisgIGlmIChwcm90b2NvbCA9PSBTU0xUTFMpIHsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYyKTsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYzKTsgICAvLyBUSFJJRlQtMzE2NAorICB9Cit9CisKK1NTTENvbnRleHQ6On5TU0xDb250ZXh0KCkgeworICBpZiAoY3R4XyAhPSBOVUxMKSB7CisgICAgU1NMX0NUWF9mcmVlKGN0eF8pOworICAgIGN0eF8gPSBOVUxMOworICB9Cit9CisKK1NTTCogU1NMQ29udGV4dDo6Y3JlYXRlU1NMKCkgeworICBTU0wqIHNzbCA9IFNTTF9uZXcoY3R4Xyk7CisgIGlmIChzc2wgPT0gTlVMTCkgeworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfbmV3OiAiICsgZXJyb3JzKTsKKyAgfQorICByZXR1cm4gc3NsOworfQorCisvLyBUU1NMU29ja2V0IGltcGxlbWVudGF0aW9uCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpCisgIDogVFNvY2tldCgpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgICAgICAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CisgIGludGVycnVwdExpc3RlbmVyXyA9IGludGVycnVwdExpc3RlbmVyOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KQorICA6IFRTb2NrZXQoc29ja2V0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lciksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KQorICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7Cit9CisKK1RTU0xTb2NrZXQ6On5UU1NMU29ja2V0KCkgeworICBjbG9zZSgpOworfQorCitib29sIFRTU0xTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlRTU0xTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkOiBIYW5kc2hha2UgaXMgbm90IGNvbXBsZXRlZCIpOworICAvLyBkYXRhIG1heSBiZSBhdmFpbGFibGUgaW4gU1NMIGJ1ZmZlcnMgKG5vdGU6IFNTTF9wZW5kaW5nIGRvZXMgbm90IGhhdmUgYSBmYWlsdXJlIG1vZGUpCisgIHJldHVybiBTU0xfcGVuZGluZyhzc2xfKSA+IDAgfHwgVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0KCkgeworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gZmFsc2U7CisgIHJlYWRSZXRyeUNvdW50XyA9IDA7CisgIGV2ZW50U2FmZV8gPSBmYWxzZTsKK30KKworYm9vbCBUU1NMU29ja2V0Ojppc09wZW4oKSB7CisgIGlmIChzc2xfID09IE5VTEwgfHwgIVRTb2NrZXQ6OmlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGludCBzaHV0ZG93biA9IFNTTF9nZXRfc2h1dGRvd24oc3NsXyk7CisgIC8vICIhISIgaXMgc3F1ZWxjaGluZyBDNDgwMCAiZm9yY2luZyBib29sIC0+IHRydWUgb3IgZmFsc2UiIHBlcmZvcm1hbmNlIHdhcm5pbmcKKyAgYm9vbCBzaHV0ZG93blJlY2VpdmVkID0gISEoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pOworICBib29sIHNodXRkb3duU2VudCA9ICEhKHNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pOworICBpZiAoc2h1dGRvd25SZWNlaXZlZCAmJiBzaHV0ZG93blNlbnQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCitib29sIFRTU0xTb2NrZXQ6OnBlZWsoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CisgIGludCByYzsKKyAgdWludDhfdCBieXRlOworICBkbyB7CisgICAgcmMgPSBTU0xfcGVlayhzc2xfLCAmYnl0ZSwgMSk7CisgICAgaWYgKHJjIDwgMCkgeworCisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9wZWVrOiAiICsgZXJyb3JzKTsKKyAgICB9IGVsc2UgaWYgKHJjID09IDApIHsKKyAgICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlICh0cnVlKTsKKyAgcmV0dXJuIChyYyA+IDApOworfQorCit2b2lkIFRTU0xTb2NrZXQ6Om9wZW4oKSB7CisgIGlmIChpc09wZW4oKSB8fCBzZXJ2ZXIoKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworICB9CisgIFRTb2NrZXQ6Om9wZW4oKTsKK30KKworLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KK3ZvaWQgVFNTTFNvY2tldDo6Y2xvc2UoKSB7CisgIGlmIChzc2xfICE9IE5VTEwpIHsKKyAgICB0cnkgeworICAgICAgaW50IHJjOworICAgICAgaW50IGVycm5vX2NvcHkgPSAwOworICAgICAgaW50IGVycm9yID0gMDsKKworICAgICAgZG8geworICAgICAgICByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgICAgaWYgKHJjIDw9IDApIHsKKyAgICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgICAgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKHJjID09IDIpOworCisgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgICBHbG9iYWxPdXRwdXQoKCJTU0xfc2h1dGRvd246ICIgKyBlcnJvcnMpLmNfc3RyKCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvLyBEb24ndCBlbWl0IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUKKyAgICAgIC8vIGRlc3RydWN0b3IuIFRoZXJlJ3MgYWxzbyBub3QgbXVjaCB0aGF0IGEgdXNlciBjYW4gZG8gdG8gcmVjb3Zlciwgc28KKyAgICAgIC8vIGp1c3QgY2xlYW4gdXAgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRob3V0IHRocm93aW5nLCBzaW1pbGFyIHRvIHRoZSByYworICAgICAgLy8gPCAwIGNhc2UgYWJvdmUuCisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJTU0xfc2h1dGRvd246ICVzIiwgdGUud2hhdCgpKTsKKyAgICB9CisgICAgU1NMX2ZyZWUoc3NsXyk7CisgICAgc3NsXyA9IE5VTEw7CisgICAgaGFuZHNoYWtlQ29tcGxldGVkXyA9IGZhbHNlOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyAgVFNvY2tldDo6Y2xvc2UoKTsKK30KKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW4gU1NMIFNvY2tldC4KKyAqIElmIGV2ZW50U2FmZSBpcyBzZXQsIGFuZCBpdCBtYXkgcmV0dXJucyAwIGJ5dGVzIHRoZW4gcmVhZCBtZXRob2QKKyAqIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCBpdCBpcyBzdWNjZXNzZnVsbCBvciBpdCB0aHJvd3MKKyAqIGV4Y2VwdGlvbiBpbmNhc2Ugb2YgZmFpbHVyZS4KKyovCit1aW50MzJfdCBUU1NMU29ja2V0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJldHJ5IGFnYWluIik7CisgIGludDMyX3QgYnl0ZXMgPSAwOworICB3aGlsZSAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfLCBidWYsIGxlbik7CisgICAgaW50MzJfdCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaW50MzJfdCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgIHJlYWRSZXRyeUNvdW50XysrOworICAgIGlmIChlcnJvciA9PSBTU0xfRVJST1JfTk9ORSkgeworICAgICAgcmVhZFJldHJ5Q291bnRfID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgd2FpdEV2ZW50UmV0dXJuOworICAgIGJvb2wgYnJlYWtvdXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgImNsaWVudCBkaXNjb25uZWN0ZWQiKTsKKworICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgaWYgKGVycm5vX2NvcHkgPT0gMCAmJiBFUlJfcGVla19lcnJvcigpID09IDApIHsKKyAgICAgICAgICBicmVha291dCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPj0gbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgLy8gZmFsbHRocm91Z2gKKworICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgIGVsc2UgaWYgKCh3YWl0RXZlbnRSZXR1cm4gPSB3YWl0Rm9yRXZlbnQoZXJyb3IgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpKSA9PSBUU1NMX0VJTlRSICkgeworICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHdhaXRFdmVudFJldHVybiA9PSBUU1NMX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgU1NMIGFuZCBodWdlIHRocmlmdCBwYWNrZXRzLCB0aGVyZSBtYXkgYmUgYSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHNvY2tldCBvcGVyYXRpb25zLCBiZWZvcmUgYW55IGRhdGEgYmVjb21lcyBhdmFpbGFibGUgYnkgU1NMX3JlYWQoKS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIG5vdCBiZSBpbmNyZWFzZWQgYW5kCisgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXBlYXRlZC4KKyAgICAgICAgICAgIHJlYWRSZXRyeUNvdW50Xy0tOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInVua293biB3YWl0Rm9yRXZlbnQgcmV0dXJuIHZhbHVlIik7CisgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgfQorICAgIGlmIChicmVha291dCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3JlYWQ6ICIgKyBlcnJvcnMpOworICB9CisgIHJldHVybiBieXRlczsKK30KKwordm9pZCBUU1NMU29ja2V0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICByZXR1cm47CisgIC8vIGxvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgaW50MzJfdCBieXRlcyA9IFNTTF93cml0ZShzc2xfLCAmYnVmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoICAgICAgICAKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZSBldmVudCBhZ2FpbgorICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgICB3cml0dGVuICs9IGJ5dGVzOworICB9Cit9CisKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHdyaXRlIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KK3VpbnQzMl90IFRTU0xTb2NrZXQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgcmV0dXJuIDA7CisgIC8vIGxvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgaW50MzJfdCBieXRlcyA9IFNTTF93cml0ZShzc2xfLCAmYnVmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZSBldmVudCBhZ2FpbgorICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgICB3cml0dGVuICs9IGJ5dGVzOworICB9CisgIHJldHVybiB3cml0dGVuOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmZsdXNoKCkgeworICAvLyBEb24ndCB0aHJvdyBleGNlcHRpb24gaWYgbm90IG9wZW4uIFRocmlmdCBzZXJ2ZXJzIGNsb3NlIHNvY2tldCB0d2ljZS4KKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZmx1c2g6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CisgIEJJTyogYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJucyBOVUxMIik7CisgIH0KKyAgaWYgKEJJT19mbHVzaChiaW8pICE9IDEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZmx1c2g6ICIgKyBlcnJvcnMpOworICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZVBhcmFtcygpIHsKKyAgLy8gc2V0IHVuZGVybHlpbmcgc29ja2V0IHRvIG5vbi1ibG9ja2luZworICBpbnQgZmxhZ3M7CisgIGlmICgoZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApKSA8IDAKKyAgICAgIHx8IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykgPCAwKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBzZXQgVEhSSUZUX09fTk9OQkxPQ0sgKFRIUklGVF9GQ05UTCkgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzb2NrZXRfKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3NsXyA9IGN0eF8tPmNyZWF0ZVNTTCgpOworCisgIFNTTF9zZXRfZmQoc3NsXywgc3RhdGljX2Nhc3Q8aW50Pihzb2NrZXRfKSk7Cit9CisKK2Jvb2wgVFNTTFNvY2tldDo6Y2hlY2tIYW5kc2hha2UoKSB7CisgIHJldHVybiBoYW5kc2hha2VDb21wbGV0ZWRfOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmluaXRpYWxpemVIYW5kc2hha2UoKSB7CisgIGlmICghVFNvY2tldDo6aXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgfQorICBpZiAoY2hlY2tIYW5kc2hha2UoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzc2xfID09IE5VTEwpIHsKKyAgICBpbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCk7CisgIH0KKworICBpbnQgcmM7CisgIGludCBlcnJub19jb3B5ID0gMDsKKyAgaW50IGVycm9yID0gMDsKKyAgaWYgKHNlcnZlcigpKSB7CisgICAgZG8geworICAgICAgcmMgPSBTU0xfYWNjZXB0KHNzbF8pOworICAgICAgaWYgKHJjIDw9IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChyYyA9PSAyKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPcGVuU1NMIDwgMC45LjhmIGRvZXMgbm90IGhhdmUgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKCkKKyAgICAjaWYgZGVmaW5lZChTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUpCisgICAgICAvLyBzZXQgdGhlIFNOSSBob3N0bmFtZQorICAgICAgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKHNzbF8sIGdldEhvc3QoKS5jX3N0cigpKTsKKyAgICAjZW5kaWYKKyAgICBkbyB7CisgICAgICByYyA9IFNTTF9jb25uZWN0KHNzbF8pOworICAgICAgaWYgKHJjIDw9IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChyYyA9PSAyKTsKKyAgfQorICBpZiAocmMgPD0gMCkgeworICAgIHN0cmluZyBmbmFtZShzZXJ2ZXIoKSA/ICJTU0xfYWNjZXB0IiA6ICJTU0xfY29ubmVjdCIpOworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihmbmFtZSArICI6ICIgKyBlcnJvcnMpOworICB9CisgIGF1dGhvcml6ZSgpOworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gdHJ1ZTsKK30KKwordm9pZCBUU1NMU29ja2V0OjphdXRob3JpemUoKSB7CisgIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfKTsKKyAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAvLyB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihzdHJpbmcoIlNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCgpLCAiKSArIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSk7CisgIH0KKworICBYNTA5KiBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF8pOworICBpZiAoY2VydCA9PSBOVUxMKSB7CisgICAgLy8gY2VydGlmaWNhdGUgaXMgbm90IHByZXNlbnQKKyAgICBpZiAoU1NMX2dldF92ZXJpZnlfbW9kZShzc2xfKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogcmVxdWlyZWQgY2VydGlmaWNhdGUgbm90IHByZXNlbnQiKTsKKyAgICB9CisgICAgLy8gY2VydGlmaWNhdGUgd2FzIG9wdGlvbmFsOiBkaWRuJ3QgaW50ZW5kIHRvIGF1dGhvcml6ZSByZW1vdGUKKyAgICBpZiAoc2VydmVyKCkgJiYgYWNjZXNzXyAhPSBOVUxMKSB7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJhdXRob3JpemU6IGNlcnRpZmljYXRlIHJlcXVpcmVkIGZvciBhdXRob3JpemF0aW9uIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICAvLyBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50CisgIGlmIChhY2Nlc3NfID09IE5VTEwpIHsKKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgcmV0dXJuOworICB9CisgIC8vIGJvdGggY2VydGlmaWNhdGUgYW5kIGFjY2VzcyBtYW5hZ2VyIGFyZSBwcmVzZW50CisKKyAgc3RyaW5nIGhvc3Q7CisgIHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgIHNvY2tsZW5fdCBzYUxlbmd0aCA9IHNpemVvZihzYSk7CisKKyAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopJnNhLCAmc2FMZW5ndGgpICE9IDApIHsKKyAgICBzYS5zc19mYW1pbHkgPSBBRl9VTlNQRUM7CisgIH0KKworICBBY2Nlc3NNYW5hZ2VyOjpEZWNpc2lvbiBkZWNpc2lvbiA9IGFjY2Vzc18tPnZlcmlmeShzYSk7CisKKyAgaWYgKGRlY2lzaW9uICE9IEFjY2Vzc01hbmFnZXI6OlNLSVApIHsKKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgaWYgKGRlY2lzaW9uICE9IEFjY2Vzc01hbmFnZXI6OkFMTE9XKSB7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJhdXRob3JpemU6IGFjY2VzcyBkZW5pZWQgYmFzZWQgb24gcmVtb3RlIElQIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIGV4dHJhY3Qgc3ViamVjdEFsdGVybmF0aXZlTmFtZQorICBTVEFDS19PRihHRU5FUkFMX05BTUUpKiBhbHRlcm5hdGl2ZXMKKyAgICAgID0gKFNUQUNLX09GKEdFTkVSQUxfTkFNRSkqKVg1MDlfZ2V0X2V4dF9kMmkoY2VydCwgTklEX3N1YmplY3RfYWx0X25hbWUsIE5VTEwsIE5VTEwpOworICBpZiAoYWx0ZXJuYXRpdmVzICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgY291bnQgPSBza19HRU5FUkFMX05BTUVfbnVtKGFsdGVybmF0aXZlcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGRlY2lzaW9uID09IEFjY2Vzc01hbmFnZXI6OlNLSVAgJiYgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGNvbnN0IEdFTkVSQUxfTkFNRSogbmFtZSA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShhbHRlcm5hdGl2ZXMsIGkpOworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopQVNOMV9TVFJJTkdfZGF0YShuYW1lLT5kLmlhNSk7CisgICAgICBpbnQgbGVuZ3RoID0gQVNOMV9TVFJJTkdfbGVuZ3RoKG5hbWUtPmQuaWE1KTsKKyAgICAgIHN3aXRjaCAobmFtZS0+dHlwZSkgeworICAgICAgY2FzZSBHRU5fRE5TOgorICAgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7CisgICAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldFBlZXJIb3N0KCkgOiBnZXRIb3N0KCkpOworICAgICAgICB9CisgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRU5fSVBBREQ6CisgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGFsdGVybmF0aXZlcywgR0VORVJBTF9OQU1FX2ZyZWUpOworICB9CisKKyAgaWYgKGRlY2lzaW9uICE9IEFjY2Vzc01hbmFnZXI6OlNLSVApIHsKKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgaWYgKGRlY2lzaW9uICE9IEFjY2Vzc01hbmFnZXI6OkFMTE9XKSB7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJhdXRob3JpemU6IGFjY2VzcyBkZW5pZWQiKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZXh0cmFjdCBjb21tb25OYW1lCisgIFg1MDlfTkFNRSogbmFtZSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjZXJ0KTsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIFg1MDlfTkFNRV9FTlRSWSogZW50cnk7CisgICAgdW5zaWduZWQgY2hhciogdXRmODsKKyAgICBpbnQgbGFzdCA9IC0xOworICAgIHdoaWxlIChkZWNpc2lvbiA9PSBBY2Nlc3NNYW5hZ2VyOjpTS0lQKSB7CisgICAgICBsYXN0ID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIGxhc3QpOworICAgICAgaWYgKGxhc3QgPT0gLTEpCisgICAgICAgIGJyZWFrOworICAgICAgZW50cnkgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGxhc3QpOworICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgQVNOMV9TVFJJTkcqIGNvbW1vbiA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShlbnRyeSk7CisgICAgICBpbnQgc2l6ZSA9IEFTTjFfU1RSSU5HX3RvX1VURjgoJnV0ZjgsIGNvbW1vbik7CisgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7CisgICAgICAgIGhvc3QgPSAoc2VydmVyKCkgPyBnZXRQZWVySG9zdCgpIDogZ2V0SG9zdCgpKTsKKyAgICAgIH0KKyAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIChjaGFyKil1dGY4LCBzaXplKTsKKyAgICAgIE9QRU5TU0xfZnJlZSh1dGY4KTsKKyAgICB9CisgIH0KKyAgWDUwOV9mcmVlKGNlcnQpOworICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJhdXRob3JpemU6IGNhbm5vdCBhdXRob3JpemUgcGVlciIpOworICB9Cit9CisKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCit1bnNpZ25lZCBpbnQgVFNTTFNvY2tldDo6d2FpdEZvckV2ZW50KGJvb2wgd2FudFJlYWQpIHsKKyAgaW50IGZkU29ja2V0OworICBCSU8qIGJpbzsKKworICBpZiAod2FudFJlYWQpIHsKKyAgICBiaW8gPSBTU0xfZ2V0X3JiaW8oc3NsXyk7CisgIH0gZWxzZSB7CisgICAgYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOworICB9CisKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF8/YmlvIHJldHVybmVkIE5VTEwiKTsKKyAgfQorCisgIGlmIChCSU9fZ2V0X2ZkKGJpbywgJmZkU29ja2V0KSA8PSAwKSB7CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiQklPX2dldF9mZCBmYWlsZWQiKTsKKyAgfQorCisgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKKyAgbWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICBmZHNbMF0uZmQgPSBmZFNvY2tldDsKKyAgLy8gdXNlIFBPTExJTiBhbHNvIG9uIHdyaXRlIG9wZXJhdGlvbnMgdG9vLCB0aGlzIGlzIG5lZWRlZCBmb3Igb3BlcmF0aW9ucworICAvLyB3aGljaCByZXF1aXJlcyByZWFkIGFuZCB3cml0ZSBvbiB0aGUgc29ja2V0LgorICBmZHNbMF0uZXZlbnRzID0gd2FudFJlYWQgPyBUSFJJRlRfUE9MTElOIDogVEhSSUZUX1BPTExJTiB8IFRIUklGVF9QT0xMT1VUOworCisgIGlmIChpbnRlcnJ1cHRMaXN0ZW5lcl8pIHsKKyAgICBmZHNbMV0uZmQgPSAqKGludGVycnVwdExpc3RlbmVyXy5nZXQoKSk7CisgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgIH0KKworICBpbnQgdGltZW91dCA9IC0xOworICBpZiAod2FudFJlYWQgJiYgcmVjdlRpbWVvdXRfKSB7CisgICAgdGltZW91dCA9IHJlY3ZUaW1lb3V0XzsKKyAgfQorICBpZiAoIXdhbnRSZWFkICYmIHNlbmRUaW1lb3V0XykgeworICAgIHRpbWVvdXQgPSBzZW5kVGltZW91dF87CisgIH0KKworICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCBpbnRlcnJ1cHRMaXN0ZW5lcl8gPyAyIDogMSwgdGltZW91dCk7CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICAvLyBlcnJvciBjYXNlcworICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRUlOVFIpIHsKKyAgICAgIHJldHVybiBUU1NMX0VJTlRSOyAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgfQorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNTTFNvY2tldDo6cmVhZCBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfSBlbHNlIGlmIChyZXQgPiAwKXsKKyAgICBpZiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCAiSW50ZXJydXB0ZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFRTU0xfREFUQTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9QT0xMICh0aW1lZCBvdXQpIik7CisgIH0KK30KKworLy8gVFNTTFNvY2tldEZhY3RvcnkgaW1wbGVtZW50YXRpb24KK3VpbnQ2NF90IFRTU0xTb2NrZXRGYWN0b3J5Ojpjb3VudF8gPSAwOworTXV0ZXggVFNTTFNvY2tldEZhY3Rvcnk6Om11dGV4XzsKK2Jvb2wgVFNTTFNvY2tldEZhY3Rvcnk6Om1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gPSBmYWxzZTsKKworVFNTTFNvY2tldEZhY3Rvcnk6OlRTU0xTb2NrZXRGYWN0b3J5KFNTTFByb3RvY29sIHByb3RvY29sKSA6IHNlcnZlcl8oZmFsc2UpIHsKKyAgR3VhcmQgZ3VhcmQobXV0ZXhfKTsKKyAgaWYgKGNvdW50XyA9PSAwKSB7CisgICAgaWYgKCFtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fKSB7CisgICAgICBpbml0aWFsaXplT3BlblNTTCgpOworICAgIH0KKyAgICByYW5kb21pemUoKTsKKyAgfQorICBjb3VudF8rKzsKKyAgY3R4XyA9IHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PihuZXcgU1NMQ29udGV4dChwcm90b2NvbCkpOworfQorCitUU1NMU29ja2V0RmFjdG9yeTo6flRTU0xTb2NrZXRGYWN0b3J5KCkgeworICBHdWFyZCBndWFyZChtdXRleF8pOworICBjdHhfLnJlc2V0KCk7CisgIGNvdW50Xy0tOworICBpZiAoY291bnRfID09IDAgJiYgIW1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8pIHsKKyAgICBjbGVhbnVwT3BlblNTTCgpOworICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8pKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBzb2NrZXQpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKSB7CisgIHNzbC0+c2VydmVyKHNlcnZlcigpKTsKKyAgaWYgKGFjY2Vzc18gPT0gTlVMTCAmJiAhc2VydmVyKCkpIHsKKyAgICBhY2Nlc3NfID0gc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+KG5ldyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcik7CisgIH0KKyAgaWYgKGFjY2Vzc18gIT0gTlVMTCkgeworICAgIHNzbC0+YWNjZXNzKGFjY2Vzc18pOworICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmNpcGhlcnMoY29uc3Qgc3RyaW5nJiBlbmFibGUpIHsKKyAgaW50IHJjID0gU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4Xy0+Z2V0KCksIGVuYWJsZS5jX3N0cigpKTsKKyAgaWYgKEVSUl9wZWVrX2Vycm9yKCkgIT0gMCkgeworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdDogIiArIGVycm9ycyk7CisgIH0KKyAgaWYgKHJjID09IDApIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJOb25lIG9mIHNwZWNpZmllZCBjaXBoZXJzIGFyZSBzdXBwb3J0ZWQiKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjphdXRoZW50aWNhdGUoYm9vbCByZXF1aXJlZCkgeworICBpbnQgbW9kZTsKKyAgaWYgKHJlcXVpcmVkKSB7CisgICAgbW9kZSA9IFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworICB9IGVsc2UgeworICAgIG1vZGUgPSBTU0xfVkVSSUZZX05PTkU7CisgIH0KKyAgU1NMX0NUWF9zZXRfdmVyaWZ5KGN0eF8tPmdldCgpLCBtb2RlLCBOVUxMKTsKK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZENlcnRpZmljYXRlKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCkgeworICBpZiAocGF0aCA9PSBOVUxMIHx8IGZvcm1hdCA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkQ2VydGlmaWNhdGVDaGFpbjogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CisgIH0KKyAgaWYgKHN0cmNtcChmb3JtYXQsICJQRU0iKSA9PSAwKSB7CisgICAgaWYgKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY3R4Xy0+Z2V0KCksIHBhdGgpID09IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSBmb3JtYXQ6ICIgKyBzdHJpbmcoZm9ybWF0KSk7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFByaXZhdGVLZXkoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0KSB7CisgIGlmIChwYXRoID09IE5VTEwgfHwgZm9ybWF0ID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRQcml2YXRlS2V5OiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiKTsKKyAgfQorICBpZiAoc3RyY21wKGZvcm1hdCwgIlBFTSIpID09IDApIHsKKyAgICBpZiAoU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGN0eF8tPmdldCgpLCBwYXRoLCBTU0xfRklMRVRZUEVfUEVNKSA9PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGgpIHsKKyAgaWYgKHBhdGggPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIik7CisgIH0KKyAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8tPmdldCgpLCBwYXRoLCBjYXBhdGgpID09IDApIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9uczogIiArIGVycm9ycyk7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkgeworICBSQU5EX3BvbGwoKTsKK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6b3ZlcnJpZGVEZWZhdWx0UGFzc3dvcmRDYWxsYmFjaygpIHsKKyAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoY3R4Xy0+Z2V0KCksIHBhc3N3b3JkQ2FsbGJhY2spOworICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShjdHhfLT5nZXQoKSwgdGhpcyk7Cit9CisKK2ludCBUU1NMU29ja2V0RmFjdG9yeTo6cGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwgaW50IHNpemUsIGludCwgdm9pZCogZGF0YSkgeworICBUU1NMU29ja2V0RmFjdG9yeSogZmFjdG9yeSA9IChUU1NMU29ja2V0RmFjdG9yeSopZGF0YTsKKyAgc3RyaW5nIHVzZXJQYXNzd29yZDsKKyAgZmFjdG9yeS0+Z2V0UGFzc3dvcmQodXNlclBhc3N3b3JkLCBzaXplKTsKKyAgaW50IGxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4odXNlclBhc3N3b3JkLnNpemUoKSk7CisgIGlmIChsZW5ndGggPiBzaXplKSB7CisgICAgbGVuZ3RoID0gc2l6ZTsKKyAgfQorICBzdHJuY3B5KHBhc3N3b3JkLCB1c2VyUGFzc3dvcmQuY19zdHIoKSwgbGVuZ3RoKTsKKyAgdXNlclBhc3N3b3JkLmFzc2lnbih1c2VyUGFzc3dvcmQuc2l6ZSgpLCAnKicpOworICByZXR1cm4gbGVuZ3RoOworfQorCisvLyBleHRyYWN0IGVycm9yIG1lc3NhZ2VzIGZyb20gZXJyb3IgcXVldWUKK3ZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBlcnJvcnMsIGludCBlcnJub19jb3B5LCBpbnQgc3NsZXJybm8pIHsKKyAgdW5zaWduZWQgbG9uZyBlcnJvckNvZGU7CisgIGNoYXIgbWVzc2FnZVsyNTZdOworCisgIGVycm9ycy5yZXNlcnZlKDUxMik7CisgIHdoaWxlICgoZXJyb3JDb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgaWYgKCFlcnJvcnMuZW1wdHkoKSkgeworICAgICAgZXJyb3JzICs9ICI7ICI7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yQ29kZSk7CisgICAgaWYgKHJlYXNvbiA9PSBOVUxMKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYobWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpIC0gMSwgIlNTTCBlcnJvciAjICVsdSIsIGVycm9yQ29kZSk7CisgICAgICByZWFzb24gPSBtZXNzYWdlOworICAgIH0KKyAgICBlcnJvcnMgKz0gcmVhc29uOworICB9CisgIGlmIChlcnJvcnMuZW1wdHkoKSkgeworICAgIGlmIChlcnJub19jb3B5ICE9IDApIHsKKyAgICAgIGVycm9ycyArPSBUT3V0cHV0OjpzdHJlcnJvcl9zKGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorICBpZiAoZXJyb3JzLmVtcHR5KCkpIHsKKyAgICBlcnJvcnMgPSAiZXJyb3IgY29kZTogIiArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKKyAgfQorICBpZiAoc3NsZXJybm8pIHsKKyAgICBlcnJvcnMgKz0gIiAoU1NMX2Vycm9yX2NvZGUgPSAiICsgdG9fc3RyaW5nKHNzbGVycm5vKSArICIpIjsKKyAgICBpZiAoc3NsZXJybm8gPT0gU1NMX0VSUk9SX1NZU0NBTEwpIHsKKyAgICAgIGNoYXIgYnVmWzQwOTZdOworICAgICAgaW50IGVycjsKKyAgICAgIHdoaWxlICgoZXJyID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgICAgIGVycm9ycyArPSAiICI7CisgICAgICAgIGVycm9ycyArPSBFUlJfZXJyb3Jfc3RyaW5nKGVyciwgYnVmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFjY2Vzc01hbmFnZXIKKyAqLworRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgbm9leGNlcHQgeworICAodm9pZClzYTsKKyAgcmV0dXJuIFNLSVA7Cit9CisKK0RlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc3RyaW5nJiBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgeworICBpZiAoaG9zdC5lbXB0eSgpIHx8IG5hbWUgPT0gTlVMTCB8fCBzaXplIDw9IDApIHsKKyAgICByZXR1cm4gU0tJUDsKKyAgfQorICByZXR1cm4gKG1hdGNoTmFtZShob3N0LmNfc3RyKCksIG5hbWUsIHNpemUpID8gQUxMT1cgOiBTS0lQKTsKK30KKworRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIG5vZXhjZXB0IHsKKyAgYm9vbCBtYXRjaCA9IGZhbHNlOworICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQgJiYgc2l6ZSA9PSBzaXplb2YoaW5fYWRkcikpIHsKKyAgICBtYXRjaCA9IChtZW1jbXAoJigoc29ja2FkZHJfaW4qKSZzYSktPnNpbl9hZGRyLCBkYXRhLCBzaXplKSA9PSAwKTsKKyAgfSBlbHNlIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYgJiYgc2l6ZSA9PSBzaXplb2YoaW42X2FkZHIpKSB7CisgICAgbWF0Y2ggPSAobWVtY21wKCYoKHNvY2thZGRyX2luNiopJnNhKS0+c2luNl9hZGRyLCBkYXRhLCBzaXplKSA9PSAwKTsKKyAgfQorICByZXR1cm4gKG1hdGNoID8gQUxMT1cgOiBTS0lQKTsKK30KKworLyoqCisgKiBNYXRjaCBhIG5hbWUgd2l0aCBhIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIG1heSBpbmNsdWRlIHdpbGRjYXJkLiBBIHNpbmdsZQorICogd2lsZGNhcmQgIioiIGNhbiBtYXRjaCB1cCB0byBvbmUgY29tcG9uZW50IGluIHRoZSBkb21haW4gbmFtZS4KKyAqCisgKiBAcGFyYW0gIGhvc3QgICAgSG9zdCBuYW1lLCB0eXBpY2FsbHkgdGhlIG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0CisgKiBAcGFyYW0gIHBhdHRlcm4gTmFtZSByZXRyaWV2ZWQgZnJvbSBjZXJ0aWZpY2F0ZQorICogQHBhcmFtICBzaXplICAgIFNpemUgb2YgInBhdHRlcm4iCisgKiBAcmV0dXJuIFRydWUsIGlmICJob3N0IiBtYXRjaGVzICJwYXR0ZXJuIi4gRmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIG1hdGNoTmFtZShjb25zdCBjaGFyKiBob3N0LCBjb25zdCBjaGFyKiBwYXR0ZXJuLCBpbnQgc2l6ZSkgeworICBib29sIG1hdGNoID0gZmFsc2U7CisgIGludCBpID0gMCwgaiA9IDA7CisgIHdoaWxlIChpIDwgc2l6ZSAmJiBob3N0W2pdICE9ICdcMCcpIHsKKyAgICBpZiAodXBwZXJjYXNlKHBhdHRlcm5baV0pID09IHVwcGVyY2FzZShob3N0W2pdKSkgeworICAgICAgaSsrOworICAgICAgaisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChwYXR0ZXJuW2ldID09ICcqJykgeworICAgICAgd2hpbGUgKGhvc3Rbal0gIT0gJy4nICYmIGhvc3Rbal0gIT0gJ1wwJykgeworICAgICAgICBqKys7CisgICAgICB9CisgICAgICBpKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgaWYgKGkgPT0gc2l6ZSAmJiBob3N0W2pdID09ICdcMCcpIHsKKyAgICBtYXRjaCA9IHRydWU7CisgIH0KKyAgcmV0dXJuIG1hdGNoOworfQorCisvLyBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIHRoZSBUdXJraXNoIGxvY2FsZSBpc3N1ZSwgaS5lLiwKKy8vIHRvdXBwZXIoJ2knKSAhPSB0b3VwcGVyKCdJJykgaWYgbG9jYWxlIGlzICJ0cl9UUiIKK2NoYXIgdXBwZXJjYXNlKGNoYXIgYykgeworICBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHsKKyAgICByZXR1cm4gYyArICgnQScgLSAnYScpOworICB9CisgIHJldHVybiBjOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTg3ZDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmgKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTT0NLRVRfSF8gMQorCisvLyBQdXQgdGhpcyBmaXJzdCB0byBhdm9pZCBXSU4zMiBidWlsZCBmYWlsdXJlCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBBY2Nlc3NNYW5hZ2VyOworY2xhc3MgU1NMQ29udGV4dDsKKworZW51bSBTU0xQcm90b2NvbCB7CisgIFNTTFRMUyAgPSAwLCAgLy8gU3VwcG9ydHMgU1NMdjIgYW5kIFNTTHYzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGVzIGF0IFRMU3YxXzAgb3IgbGF0ZXIuCisvL1NTTHYyICAgPSAxLCAgLy8gSE9SUklCTFkgSU5TRUNVUkUhCisgIFNTTHYzICAgPSAyLCAgLy8gU3VwcG9ydHMgU1NMdjMgb25seSAtIGFsc28gaG9ycmlibHkgaW5zZWN1cmUhCisgIFRMU3YxXzAgPSAzLCAgLy8gU3VwcG9ydHMgVExTdjFfMCBvciBsYXRlci4KKyAgVExTdjFfMSA9IDQsICAvLyBTdXBwb3J0cyBUTFN2MV8xIG9yIGxhdGVyLgorICBUTFN2MV8yID0gNSwgIC8vIFN1cHBvcnRzIFRMU3YxXzIgb3IgbGF0ZXIuCisgIExBVEVTVCAgPSBUTFN2MV8yCit9OworCisjZGVmaW5lIFRTU0xfRUlOVFIgMAorI2RlZmluZSBUU1NMX0RBVEEgMQorCisvKioKKyAqIEluaXRpYWxpemUgT3BlblNTTCBsaWJyYXJ5LiAgVGhpcyBmdW5jdGlvbiwgb3Igc29tZSBvdGhlcgorICogZXF1aXZhbGVudCBmdW5jdGlvbiB0byBpbml0aWFsaXplIE9wZW5TU0wsIG11c3QgYmUgY2FsbGVkIGJlZm9yZQorICogVFNTTFNvY2tldCBpcyB1c2VkLiAgSWYgeW91IHNldCBUU1NMU29ja2V0RmFjdG9yeSB0byB1c2UgbWFudWFsCisgKiBPcGVuU1NMIGluaXRpYWxpemF0aW9uLCB5b3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBvciBvdGhlcndpc2UKKyAqIGVuc3VyZSBPcGVuU1NMIGlzIGluaXRpYWxpemVkIHlvdXJzZWxmLgorICovCit2b2lkIGluaXRpYWxpemVPcGVuU1NMKCk7CisvKioKKyAqIENsZWFudXAgT3BlblNTTCBsaWJyYXJ5LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHRvIGNsZWFuCisgKiB1cCBPcGVuU1NMIGFmdGVyIHVzZSBvZiBPcGVuU1NMIGZ1bmN0aW9uYWxpdHkgaXMgZmluaXNoZWQuICBJZiB5b3UKKyAqIHNldCBUU1NMU29ja2V0RmFjdG9yeSB0byB1c2UgbWFudWFsIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24sIHlvdQorICogc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB5b3Vyc2VsZiBvciBlbnN1cmUgdGhhdCB3aGF0ZXZlcgorICogaW5pdGlhbGl6ZWQgT3BlblNTTCBjbGVhbnMgaXQgdXAgdG9vLgorICovCit2b2lkIGNsZWFudXBPcGVuU1NMKCk7CisKKy8qKgorICogT3BlblNTTCBpbXBsZW1lbnRhdGlvbiBmb3IgU1NMIHNvY2tldCBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIFRTU0xTb2NrZXQgOiBwdWJsaWMgVFNvY2tldCB7CitwdWJsaWM6CisgIH5UU1NMU29ja2V0KCk7CisgIC8qKgorICAgKiBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICovCisgIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgcGVlaygpOworICB2b2lkIG9wZW4oKTsKKyAgdm9pZCBjbG9zZSgpOworICBib29sIGhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7CisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3Qgd3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgZmx1c2goKTsKKyAgLyoqCisgICogU2V0IHdoZXRoZXIgdG8gdXNlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZSBTU0wgaGFuZHNoYWtlIHByb3RvY29sLgorICAqCisgICogQHBhcmFtIGZsYWcgIFVzZSBzZXJ2ZXIgc2lkZSBoYW5kc2hha2UgcHJvdG9jb2wgaWYgdHJ1ZS4KKyAgKi8KKyAgdm9pZCBzZXJ2ZXIoYm9vbCBmbGFnKSB7IHNlcnZlcl8gPSBmbGFnOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgU1NMIHNvY2tldCBpcyBzZXJ2ZXIgb3IgY2xpZW50IG1vZGUuCisgICAqLworICBib29sIHNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KKyAgLyoqCisgICAqIFNldCBBY2Nlc3NNYW5hZ2VyLgorICAgKgorICAgKiBAcGFyYW0gbWFuYWdlciAgSW5zdGFuY2Ugb2YgQWNjZXNzTWFuYWdlcgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFjY2VzcyhzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICAvKioKKyAgICogU2V0IGV2ZW50U2FmZSBmbGFnIGlmIGxpYmV2ZW50IGlzIHVzZWQuCisgICAqLworICB2b2lkIHNldExpYmV2ZW50U2FmZSgpIHsgZXZlbnRTYWZlXyA9IHRydWU7IH0KKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBTU0wgU29ja2V0IGlzIGxpYmV2ZW50IHNhZmUgb3Igbm90LgorICAgKi8KKyAgYm9vbCBpc0xpYmV2ZW50U2FmZSgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50U2FmZV87IH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOworICAvKioKKyAgICogQ29uc3RydWN0b3Igd2l0aCBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAvKioKKyAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICAvKioKKyAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldCB0aGF0IGNhbiBiZSBpbnRlcnJ1cHRlZC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCisgICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCBudW1iZXIKKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQpOworICAgIC8qKgorICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAqLworICAgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAgKiBBdXRob3JpemUgcGVlciBhY2Nlc3MgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYXV0aG9yaXplKCk7CisgIC8qKgorICAgKiBJbml0aWF0ZSBTU0wgaGFuZHNoYWtlIGlmIG5vdCBhbHJlYWR5IGluaXRpYXRlZC4KKyAgICovCisgIHZvaWQgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICAvKioKKyAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBwYXJhbXMuCisgICAqLworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgLyoqCisgICAqIENoZWNrIGlmICBTU0wgaGFuZHNoYWtlIGlzIGNvbXBsZXRlZCBvciBub3QuCisgICAqLworICBib29sIGNoZWNrSGFuZHNoYWtlKCk7CisgIC8qKgorICAgKiBXYWl0cyBmb3IgYW4gc29ja2V0IG9yIHNodXRkb3duIGV2ZW50LgorICAgKgorICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQgaWYgaW50ZXJydXB0ZWQgaXMgc2lnbmFsZWQuCisgICAqCisgICAqIEByZXR1cm4gVFNTTF9FSU5UUiBpZiBFSU5UUiBoYXBwZW5lZCBvbiB0aGUgdW5kZXJseWluZyBzb2NrZXQKKyAgICogICAgICAgICBUU1NMX0RBVEEgIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQuCisgICAqLworICB1bnNpZ25lZCBpbnQgd2FpdEZvckV2ZW50KGJvb2wgd2FudFJlYWQpOworCisgIGJvb2wgc2VydmVyXzsKKyAgU1NMKiBzc2xfOworICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKKyAgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc187CisgIGZyaWVuZCBjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKKworcHJpdmF0ZToKKyAgYm9vbCBoYW5kc2hha2VDb21wbGV0ZWRfOworICBpbnQgcmVhZFJldHJ5Q291bnRfOworICBib29sIGV2ZW50U2FmZV87CisKKyAgdm9pZCBpbml0KCk7Cit9OworCisvKioKKyAqIFNTTCBzb2NrZXQgZmFjdG9yeS4gU1NMIHNvY2tldHMgc2hvdWxkIGJlIGNyZWF0ZWQgdmlhIFNTTCBmYWN0b3J5LgorICogVGhlIGZhY3Rvcnkgd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCBhcyBsb25nIGFzCisgKiB0aGVyZSBpcyBhIFRTU0xTb2NrZXRGYWN0b3J5IGluc3RhbnRpYXRlZCwgYW5kIGFzIGxvbmcgYXMgdGhlIHN0YXRpYworICogYm9vbGVhbiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHNldCB0byBmYWxzZSwgdGhlIGRlZmF1bHQuCisgKgorICogSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCBvcGVuc3NsIHlvdXJzZWxmLCBzZXQKKyAqIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gdG8gdHJ1ZSBhbmQgVFNTTFNvY2tldEZhY3Rvcnkgd2lsbCBubworICogbG9uZ2VyIGJlIHJlc3BvbnNpYmxlIGZvciBvcGVuc3NsIGluaXRpYWxpemF0aW9uIGFuZCB0ZWFyZG93bi4KKyAqCisgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNvZGUgdXNpbmcgVFNTTFNvY2tldEZhY3RvcnkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBmYWN0b3J5IGxpZmV0aW1lIGV4Y2VlZHMgdGhlIGxpZmV0aW1lIG9mIGFueSBzb2NrZXRzCisgKiBpdCBtaWdodCBjcmVhdGUuICBJZiB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLCBhIHNvY2tldCBtYXkgY2FsbCBpbnRvCisgKiBvcGVuc3NsIGFmdGVyIHRoZSBzb2NrZXQgZmFjdG9yeSBoYXMgY2xlYW5lZCB1cCBvcGVuc3NsISAgVGhpcworICogZ3VhcmFudGVlIGlzIHVubmVjZXNzYXJ5IGlmIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gaXMgdHJ1ZSwKKyAqIGhvd2V2ZXIsIHNpbmNlIGl0IHdvdWxkIGJlIHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gaW5zdGVhZC4KKyAqLworY2xhc3MgVFNTTFNvY2tldEZhY3RvcnkgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IvRGVzdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIFNTTC9UTFMgcHJvdG9jb2wgdG8gdXNlLgorICAgKi8KKyAgVFNTTFNvY2tldEZhY3RvcnkoU1NMUHJvdG9jb2wgcHJvdG9jb2wgPSBTU0xUTFMpOworICB2aXJ0dWFsIH5UU1NMU29ja2V0RmFjdG9yeSgpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoKTsKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggYSBmcmVzaCBuZXcgc29ja2V0LCB3aGljaCBpcyBpbnRlcnJ1cHRhYmxlLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIHRoZSBnaXZlbiBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldCB3aGljaCBpcyBpbnRlcnJ1cHRhYmxlLgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQuCisgICoKKyAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKyAgLyoqCisgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQuCisgICoKKyAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAvKioKKyAgICogU2V0IGNpcGhlcnMgdG8gYmUgdXNlZCBpbiBTU0wgaGFuZHNoYWtlIHByb2Nlc3MuCisgICAqCisgICAqIEBwYXJhbSBjaXBoZXJzICBBIGxpc3Qgb2YgY2lwaGVycworICAgKi8KKyAgdmlydHVhbCB2b2lkIGNpcGhlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGVuYWJsZSk7CisgIC8qKgorICAgKiBFbmFibGUvRGlzYWJsZSBhdXRoZW50aWNhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHJlcXVpcmVkIFJlcXVpcmUgcGVlciB0byBwcmVzZW50IHZhbGlkIGNlcnRpZmljYXRlIGlmIHRydWUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBhdXRoZW50aWNhdGUoYm9vbCByZXF1aXJlZCk7CisgIC8qKgorICAgKiBMb2FkIHNlcnZlciBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggICBQYXRoIHRvIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlCisgICAqIEBwYXJhbSBmb3JtYXQgQ2VydGlmaWNhdGUgZmlsZSBmb3JtYXQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBsb2FkQ2VydGlmaWNhdGUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0ID0gIlBFTSIpOworICAvKioKKyAgICogTG9hZCBwcml2YXRlIGtleS4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggICBQYXRoIHRvIHRoZSBwcml2YXRlIGtleSBmaWxlCisgICAqIEBwYXJhbSBmb3JtYXQgUHJpdmF0ZSBrZXkgZmlsZSBmb3JtYXQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBsb2FkUHJpdmF0ZUtleShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQgPSAiUEVNIik7CisgIC8qKgorICAgKiBMb2FkIHRydXN0ZWQgY2VydGlmaWNhdGVzIGZyb20gc3BlY2lmaWVkIGZpbGUuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmaWxlCisgICAqLworICB2aXJ0dWFsIHZvaWQgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogY2FwYXRoID0gTlVMTCk7CisgIC8qKgorICAgKiBEZWZhdWx0IHJhbmRvbWl6ZSBtZXRob2QuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmFuZG9taXplKCk7CisgIC8qKgorICAgKiBPdmVycmlkZSBkZWZhdWx0IE9wZW5TU0wgcGFzc3dvcmQgY2FsbGJhY2sgd2l0aCBnZXRQYXNzd29yZCgpLgorICAgKi8KKyAgdm9pZCBvdmVycmlkZURlZmF1bHRQYXNzd29yZENhbGxiYWNrKCk7CisgIC8qKgorICAgKiBTZXQvVW5zZXQgc2VydmVyIG1vZGUuCisgICAqCisgICAqIEBwYXJhbSBmbGFnICBTZXJ2ZXIgbW9kZSBpZiB0cnVlCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VydmVyKGJvb2wgZmxhZykgeyBzZXJ2ZXJfID0gZmxhZzsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBpbiBzZXJ2ZXIgb3IgY2xpZW50IG1vZGUuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc2VydmVyIG1vZGUsIG9yLCBmYWxzZSwgaWYgY2xpZW50IG1vZGUKKyAgICovCisgIHZpcnR1YWwgYm9vbCBzZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBzZXJ2ZXJfOyB9CisgIC8qKgorICAgKiBTZXQgQWNjZXNzTWFuYWdlci4KKyAgICoKKyAgICogQHBhcmFtIG1hbmFnZXIgIFRoZSBBY2Nlc3NNYW5hZ2VyIGluc3RhbmNlCisgICAqLworICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIHN0YXRpYyB2b2lkIHNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbihib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbikgeworICAgIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gPSBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb247CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKKworICAvKioKKyAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZAorICAgKiBtdWx0aXBsZSB0aW1lcyBhdCBhbnkgdGltZSBkdXJpbmcgYSBzZXNzaW9uIGFzIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3MgY29sbGVjdGVkIHBhc3N3b3JkIHRvIE9wZW5TU0wKKyAgICogQHBhcmFtIHNpemUgICAgIE1heGltdW0gbGVuZ3RoIG9mIHBhc3N3b3JkIGluY2x1ZGluZyBOVUxMIGNoYXJhY3RlcgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdldFBhc3N3b3JkKHN0ZDo6c3RyaW5nJiAvKiBwYXNzd29yZCAqLywgaW50IC8qIHNpemUgKi8pIHt9CisKK3ByaXZhdGU6CisgIGJvb2wgc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc187CisgIHN0YXRpYyBjb25jdXJyZW5jeTo6TXV0ZXggbXV0ZXhfOworICBzdGF0aWMgdWludDY0X3QgY291bnRfOworICBzdGF0aWMgYm9vbCBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fOworICB2b2lkIHNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpOworICBzdGF0aWMgaW50IHBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpOworfTsKKworLyoqCisgKiBTU0wgZXhjZXB0aW9uLgorICovCitjbGFzcyBUU1NMRXhjZXB0aW9uIDogcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24geworcHVibGljOgorICBUU1NMRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSkge30KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiAiVFNTTEV4Y2VwdGlvbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOworICAgIH0KKyAgfQorfTsKKworLyoqCisgKiBXcmFwIE9wZW5TU0wgU1NMX0NUWCBpbnRvIGEgY2xhc3MuCisgKi8KK2NsYXNzIFNTTENvbnRleHQgeworcHVibGljOgorICBTU0xDb250ZXh0KGNvbnN0IFNTTFByb3RvY29sJiBwcm90b2NvbCA9IFNTTFRMUyk7CisgIHZpcnR1YWwgflNTTENvbnRleHQoKTsKKyAgU1NMKiBjcmVhdGVTU0woKTsKKyAgU1NMX0NUWCogZ2V0KCkgeyByZXR1cm4gY3R4XzsgfQorCitwcml2YXRlOgorICBTU0xfQ1RYKiBjdHhfOworfTsKKworLyoqCisgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIGFjY2VzcyBjb250cm9sLiBJdCdzIG1lYW50IHRvIHZlcmlmeSB0aGUgcmVtb3RlIGhvc3QuCisgKiBJdCdzIGNvbnN0cnVjdGVkIHdoZW4gYXBwbGljYXRpb24gc3RhcnRzIGFuZCBzZXQgdG8gVFNTTFNvY2tldEZhY3RvcnkKKyAqIGluc3RhbmNlLiBJdCdzIHBhc3NlZCBvbnRvIGFsbCBUU1NMU29ja2V0IGluc3RhbmNlcyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeQorICogb2JqZWN0LgorICovCitjbGFzcyBBY2Nlc3NNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgZW51bSBEZWNpc2lvbiB7CisgICAgREVOWSA9IC0xLCAvLyBkZW55IGFjY2VzcworICAgIFNLSVAgPSAwLCAgLy8gY2Fubm90IG1ha2UgZGVjaXNpb24sIG1vdmUgb24gdG8gbmV4dCAoaWYgYW55KQorICAgIEFMTE9XID0gMSAgLy8gYWxsb3cgYWNjZXNzCisgIH07CisgIC8qKgorICAgKiBEZXN0cnVjdG9yCisgICAqLworICB2aXJ0dWFsIH5BY2Nlc3NNYW5hZ2VyKCkge30KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIG9uY2UgYWZ0ZXIgdGhlIFNTTCBoYW5kc2hha2UgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgYmVmb3JlIHBlZXIgY2VydGlmaWNhdGUKKyAgICogaXMgZXhhbWluZWQuCisgICAqCisgICAqIElmIGEgdmFsaWQgZGVjaXNpb24gKEFMTE9XIG9yIERFTlkpIGlzIHJldHVybmVkLCB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBpcworICAgKiBub3QgdG8gYmUgdmVyaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgc2EgUGVlciBJUCBhZGRyZXNzCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovKSBub2V4Y2VwdCB7IHJldHVybiBERU5ZOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90LiBJdCdzIGNhbGxlZAorICAgKiBldmVyeSB0aW1lIGEgRE5TIHN1YmplY3RBbHROYW1lL2NvbW1vbiBuYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHBlZXIncworICAgKiBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogQHBhcmFtICBob3N0IENsaWVudCBtb2RlOiBob3N0IG5hbWUgcmV0dXJuZWQgYnkgVFNvY2tldDo6Z2V0SG9zdCgpCisgICAqICAgICAgICAgICAgICBTZXJ2ZXIgbW9kZTogaG9zdCBuYW1lIHJldHVybmVkIGJ5IFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkKKyAgICogQHBhcmFtICBuYW1lIFN1YmplY3RBbHROYW1lIG9yIGNvbW1vbiBuYW1lIGV4dHJhY3RlZCBmcm9tIHBlZXIgY2VydGlmaWNhdGUKKyAgICogQHBhcmFtICBzaXplIExlbmd0aCBvZiBuYW1lCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICoKKyAgICogTm90ZTogVGhlICJuYW1lIiBwYXJhbWV0ZXIgbWF5IGJlIFVURjggZW5jb2RlZC4KKyAgICovCisgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBob3N0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBuYW1lICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgbm9leGNlcHQgeworICAgIHJldHVybiBERU5ZOworICB9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90LiBJdCdzIGNhbGxlZAorICAgKiBldmVyeSB0aW1lIGFuIElQIHN1YmplY3RBbHROYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHBlZXIncyBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogQHBhcmFtICBzYSAgIFBlZXIgSVAgYWRkcmVzcyByZXRyaWV2ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQKKyAgICogQHBhcmFtICBkYXRhIElQIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gY2VydGlmaWNhdGUKKyAgICogQHBhcmFtICBzaXplIExlbmd0aCBvZiB0aGUgSVAgYWRkcmVzcworICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyogZGF0YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKKyAgICByZXR1cm4gREVOWTsKKyAgfQorfTsKKwordHlwZWRlZiBBY2Nlc3NNYW5hZ2VyOjpEZWNpc2lvbiBEZWNpc2lvbjsKKworY2xhc3MgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIgOiBwdWJsaWMgQWNjZXNzTWFuYWdlciB7CitwdWJsaWM6CisgIC8vIEFjY2Vzc01hbmFnZXIgaW50ZXJmYWNlCisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpIG5vZXhjZXB0OworICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSBub2V4Y2VwdDsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4Yjk5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZm5kZWYgQUZfTE9DQUwKKyNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAorI2VuZGlmCisKKyNpZm5kZWYgU09DS09QVF9DQVNUX1QKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBjb25zdCBTT0NLT1BUX0NBU1RfVCogY29uc3RfY2FzdF9zb2Nrb3B0KGNvbnN0IFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgU09DS09QVF9DQVNUX1QqIGNhc3Rfc29ja29wdChUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK3ZvaWQgZGVzdHJveWVyX29mX2ZpbmVfc29ja2V0cyhUSFJJRlRfU09DS0VUKiBzc29jaykgeworICA6OlRIUklGVF9DTE9TRVNPQ0tFVCgqc3NvY2spOworICBkZWxldGUgc3NvY2s7Cit9CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVEdldEFkZHJJbmZvV3JhcHBlcjo6VEdldEFkZHJJbmZvV3JhcHBlcihjb25zdCBjaGFyKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzKQorICA6IG5vZGVfKG5vZGUpLCBzZXJ2aWNlXyhzZXJ2aWNlKSwgaGludHNfKGhpbnRzKSwgcmVzXyhOVUxMKSB7fQorCitUR2V0QWRkckluZm9XcmFwcGVyOjp+VEdldEFkZHJJbmZvV3JhcHBlcigpIHsKKyAgaWYgKHRoaXMtPnJlc18gIT0gTlVMTCkKKyAgICBmcmVlYWRkcmluZm8odGhpcy0+cmVzXyk7Cit9CisKK2ludCBUR2V0QWRkckluZm9XcmFwcGVyOjppbml0KCkgeworICBpZiAodGhpcy0+cmVzXyA9PSBOVUxMKQorICAgIHJldHVybiBnZXRhZGRyaW5mbyh0aGlzLT5ub2RlXywgdGhpcy0+c2VydmljZV8sIHRoaXMtPmhpbnRzXywgJih0aGlzLT5yZXNfKSk7CisgIHJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIFRHZXRBZGRySW5mb1dyYXBwZXI6OnJlcygpIHsKKyAgcmV0dXJuIHRoaXMtPnJlc187Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBhZGRyZXNzXyhhZGRyZXNzKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0XygwKSwKKyAgICBwYXRoXyhwYXRoKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGFjY1RpbWVvdXRfKC0xKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSwKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGludGVycnVwdFNvY2tSZWFkZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKK30KKworVFNlcnZlclNvY2tldDo6flRTZXJ2ZXJTb2NrZXQoKSB7CisgIGNsb3NlKCk7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KSB7CisgIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgeworICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRBY2NlcHRUaW1lb3V0KGludCBhY2NUaW1lb3V0KSB7CisgIGFjY1RpbWVvdXRfID0gYWNjVGltZW91dDsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKSB7CisgIGFjY2VwdEJhY2tsb2dfID0gYWNjQmFja2xvZzsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KSB7CisgIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7CisgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSB7CisgIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSB7CisgIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oYm9vbCBlbmFibGUpIHsKKyAgaWYgKGxpc3RlbmluZ18pIHsKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJzZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gY2Fubm90IGJlIGNhbGxlZCBhZnRlciBsaXN0ZW4oKSIpOworICB9CisgIGludGVycnVwdGFibGVDaGlsZHJlbl8gPSBlbmFibGU7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgeworICBsaXN0ZW5pbmdfID0gdHJ1ZTsKKyNpZmRlZiBfV0lOMzIKKyAgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmIC8vIF9XSU4zMgorICBUSFJJRlRfU09DS0VUIHN2WzJdOworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0CisgIGlmICgtMSA9PSBUSFJJRlRfU09DS0VUUEFJUihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHN2KSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSBpbnRlcnJ1cHQiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIH0gZWxzZSB7CisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IHN2WzBdOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdCBhbGwgY2xpZW50cworICBpZiAoLTEgPT0gVEhSSUZUX1NPQ0tFVFBBSVIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBzdikpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXRwYWlyKCkgY2hpbGRJbnRlcnJ1cHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8ucmVzZXQoKTsKKyAgfSBlbHNlIHsKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfID0gc3ZbMV07CisgICAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8KKyAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4obmV3IFRIUklGVF9TT0NLRVQoc3ZbMF0pLCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKTsKKyAgfQorCisgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCisgIGlmIChwb3J0XyA8IDAgfHwgcG9ydF8gPiAweEZGRkYpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOworICB9CisKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpyZXM7CisgIGludCBlcnJvcjsKKyAgY2hhciBwb3J0W3NpemVvZigiNjU1MzUiKV07CisgIFRIUklGVF9TTlBSSU5URihwb3J0LCBzaXplb2YocG9ydCksICIlZCIsIHBvcnRfKTsKKworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CisgIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKKworICAvLyBJZiBhZGRyZXNzIGlzIG5vdCBzcGVjaWZpZWQgdXNlIHdpbGRjYXJkIGFkZHJlc3MgKE5VTEwpCisgIFRHZXRBZGRySW5mb1dyYXBwZXIgaW5mbyhhZGRyZXNzXy5lbXB0eSgpID8gTlVMTCA6ICZhZGRyZXNzX1swXSwgcG9ydCwgJmhpbnRzKTsKKworICBlcnJvciA9IGluZm8uaW5pdCgpOworICBpZiAoZXJyb3IpIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJnZXRhZGRyaW5mbyAlZDogJXMiLCBlcnJvciwgVEhSSUZUX0dBSV9TVFJFUlJPUihlcnJvcikpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBzZXJ2ZXIgc29ja2V0LiIpOworICB9CisKKyAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKKyAgLy8gaW50byBpcHY2IHNwYWNlLgorICBmb3IgKHJlcyA9IGluZm8ucmVzKCk7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7CisgICAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2IHx8IHJlcy0+YWlfbmV4dCA9PSBOVUxMKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgfSBlbHNlIGlmIChyZXMgIT0gTlVMTCkgeworICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICB9CisKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgc29ja2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBpbnQgb25lID0gMTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbmUpKSkgeworLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorI2lmbmRlZiBfV0lOMzIKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyNlbmRpZgorICB9CisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKKyAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BTZW5kQnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFNlbmRCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fU05EQlVGICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFNPX1NOREJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisgIGlmICh0Y3BSZWN2QnVmZmVyXyA+IDApIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU09fUkNWQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmdGNwUmVjdkJ1ZmZlcl8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0Y3BSZWN2QnVmZmVyXykpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworLy8gRGVmZXIgYWNjZXB0CisjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfREVGRVJfQUNDRVBULCAmb25lLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0RFRkVSX0FDQ0VQVCAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfREVGRVJfQUNDRVBUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKKworI2lmZGVmIElQVjZfVjZPTkxZCisgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgaW50IHplcm8gPSAwOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQorCisgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQorICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0xJTkdFUiAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX0xJTkdFUiIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gVW5peCBTb2NrZXRzIGRvIG5vdCBuZWVkIHRoYXQKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKKyAgICBpZiAoLTEKKyAgICAgICAgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9OT0RFTEFZICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfT19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgVEhSSUZUX09fTk9OQkxPQ0sgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgorICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIGRvZXNuJ3QKKyAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCisgIGludCByZXRyaWVzID0gMDsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworCisjaWZuZGVmIF9XSU4zMgorCisgICAgLy8gVW5peCBEb21haW4gU29ja2V0CisgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7CisgICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpsaXN0ZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorCisgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7CisgICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBtZW1jcHkoYWRkcmVzcy5zdW5fcGF0aCwgcGF0aF8uY19zdHIoKSwgbGVuKTsKKworICAgIHNvY2tsZW5fdCBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CisjZWxzZQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworI2Vsc2UKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bworICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKKworICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CisgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7CisgICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcio+KCZzYSksICZsZW4pIDwgMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSBnZXRzb2NrbmFtZSgpICIsIGVycm5vX2NvcHkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KCZzYSk7CisgICAgICAgICAgcG9ydF8gPSBudG9ocyhzaW4tPnNpbjZfcG9ydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbio+KCZzYSk7CisgICAgICAgICAgcG9ydF8gPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CisgIGlmIChyZXRyaWVzID4gcmV0cnlMaW1pdF8pIHsKKyAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKKyAgICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CisgICAgfQorICAgIEdsb2JhbE91dHB1dChlcnJidWYpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYmluZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmIChsaXN0ZW5DYWxsYmFja18pCisgICAgbGlzdGVuQ2FsbGJhY2tfKHNlcnZlclNvY2tldF8pOworCisgIC8vIENhbGwgbGlzdGVuCisgIGlmICgtMSA9PSA6Omxpc3RlbihzZXJ2ZXJTb2NrZXRfLCBhY2NlcHRCYWNrbG9nXykpIHsKKyAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQorfQorCitpbnQgVFNlcnZlclNvY2tldDo6Z2V0UG9ydCgpIHsKKyAgcmV0dXJuIHBvcnRfOworfQorCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSB7CisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKKyAgfQorCisgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKKworICBpbnQgbWF4RWludHJzID0gNTsKKyAgaW50IG51bUVpbnRycyA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgICBmZHNbMF0uZmQgPSBzZXJ2ZXJTb2NrZXRfOworICAgIGZkc1swXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgIGZkc1sxXS5mZCA9IGludGVycnVwdFNvY2tSZWFkZXJfOworICAgICAgZmRzWzFdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgfQorICAgIC8qCisgICAgICBUT0RPOiBpZiBUSFJJRlRfRUlOVFIgaXMgcmVjZWl2ZWQsIHdlJ2xsIHJlc3RhcnQgdGhlIHRpbWVvdXQuCisgICAgICBUbyBiZSBhY2N1cmF0ZSwgd2UgbmVlZCB0byBmaXggdGhpcyBpbiB0aGUgZnV0dXJlLgorICAgICAqLworICAgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIDIsIGFjY1RpbWVvdXRfKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FSU5UUiAmJiAobnVtRWludHJzKysgPCBtYXhFaW50cnMpKSB7CisgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgIC8vIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgc2lnbmFsCisgICAgICBpZiAoaW50ZXJydXB0U29ja1JlYWRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pKSB7CisgICAgICAgIGludDhfdCBidWY7CisgICAgICAgIGlmICgtMSA9PSByZWN2KGludGVycnVwdFNvY2tSZWFkZXJfLCBjYXN0X3NvY2tvcHQoJmJ1ZiksIHNpemVvZihpbnQ4X3QpLCAwKSkgeworICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSByZWN2KCkgaW50ZXJydXB0ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCk7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgYmVpbmcgcmVhZHkKKyAgICAgIGlmIChmZHNbMF0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9QT0xMIDAiKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgfQorICB9CisKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKKyAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7CisgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CisgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CisKKyAgaWYgKGNsaWVudFNvY2tldCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSA6OmFjY2VwdCgpICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgImFjY2VwdCgpIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgY2xpZW50IHNvY2tldCBpcyBibG9ja2luZworICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9HRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfU0VURkwsIGZsYWdzICYgflRIUklGVF9PX05PTkJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICBHbG9iYWxPdXRwdXQKKyAgICAgICAgLnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIH5USFJJRlRfT19OT05CTE9DSyAiLAorICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfU0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnQgPSBjcmVhdGVTb2NrZXQoY2xpZW50U29ja2V0KTsKKyAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKKyAgICBjbGllbnQtPnNldFNlbmRUaW1lb3V0KHNlbmRUaW1lb3V0Xyk7CisgIH0KKyAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKKyAgICBjbGllbnQtPnNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7CisgIH0KKyAgaWYgKGtlZXBBbGl2ZV8pIHsKKyAgICBjbGllbnQtPnNldEtlZXBBbGl2ZShrZWVwQWxpdmVfKTsKKyAgfQorICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgc2l6ZSk7CisKKyAgaWYgKGFjY2VwdENhbGxiYWNrXykKKyAgICBhY2NlcHRDYWxsYmFja18oY2xpZW50U29ja2V0KTsKKworICByZXR1cm4gY2xpZW50OworfQorCitzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgeworICBpZiAoaW50ZXJydXB0YWJsZUNoaWxkcmVuXykgeworICAgIHJldHVybiBzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6Om5vdGlmeShUSFJJRlRfU09DS0VUIG5vdGlmeVNvY2tldCkgeworICBpZiAobm90aWZ5U29ja2V0ICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludDhfdCBieXRlID0gMDsKKyAgICBpZiAoLTEgPT0gc2VuZChub3RpZnlTb2NrZXQsIGNhc3Rfc29ja29wdCgmYnl0ZSksIHNpemVvZihpbnQ4X3QpLCAwKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bm90aWZ5KCkgc2VuZCgpICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSB7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKGludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIG5vdGlmeShpbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KK30KKwordm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHRDaGlsZHJlbigpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKKyAgfQorICBpZiAoaW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoaW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9CisgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChpbnRlcnJ1cHRTb2NrUmVhZGVyXyk7CisgIH0KKyAgaWYgKGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KKyAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgaW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGludGVycnVwdFNvY2tSZWFkZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXy5yZXNldCgpOworICBsaXN0ZW5pbmdfID0gZmFsc2U7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzZDJjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTb2NrZXQ7CisKK2NsYXNzIFRHZXRBZGRySW5mb1dyYXBwZXIgeworcHVibGljOgorICBUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsIGNvbnN0IGNoYXIqIHNlcnZpY2UsIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpOworCisgIHZpcnR1YWwgflRHZXRBZGRySW5mb1dyYXBwZXIoKTsKKworICBpbnQgaW5pdCgpOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIHJlcygpOworCitwcml2YXRlOgorICBjb25zdCBjaGFyKiBub2RlXzsKKyAgY29uc3QgY2hhciogc2VydmljZV87CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHNfOworICBzdHJ1Y3QgYWRkcmluZm8qIHJlc187Cit9OworCisvKioKKyAqIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CisgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCisgKgorICovCitjbGFzcyBUU2VydmVyU29ja2V0IDogcHVibGljIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKworICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUU2VydmVyU29ja2V0KGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqLworICBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKi8KKyAgVFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciB1bml4IHNvY2tldHMuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lIGZvciB1bml4IHNvY2tldC4KKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIHZpcnR1YWwgflRTZXJ2ZXJTb2NrZXQoKTsKKworICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCk7CisgIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KTsKKworICB2b2lkIHNldEFjY2VwdFRpbWVvdXQoaW50IGFjY1RpbWVvdXQpOworICB2b2lkIHNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpOworCisgIHZvaWQgc2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCk7CisgIHZvaWQgc2V0UmV0cnlEZWxheShpbnQgcmV0cnlEZWxheSk7CisKKyAgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpIHsga2VlcEFsaXZlXyA9IGtlZXBBbGl2ZTsgfQorCisgIHZvaWQgc2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcik7CisgIHZvaWQgc2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcik7CisKKyAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAorICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKKyAgLy8gdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldExpc3RlbkNhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGxpc3RlbkNhbGxiYWNrKSB7IGxpc3RlbkNhbGxiYWNrXyA9IGxpc3RlbkNhbGxiYWNrOyB9CisKKyAgLy8gYWNjZXB0Q2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWZ0ZXIgZWFjaCBhY2NlcHQgY2FsbCwgb24gdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0LgorICAvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIFRocmlmdCBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUKKyAgLy8gY3VzdG9tIHNldHNvY2tvcHQgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGFjY2VwdGVkCisgIC8vIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0QWNjZXB0Q2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgYWNjZXB0Q2FsbGJhY2spIHsgYWNjZXB0Q2FsbGJhY2tfID0gYWNjZXB0Q2FsbGJhY2s7IH0KKworICAvLyBXaGVuIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSwgbmV3IGNoaWxkcmVuIFRTb2NrZXRzIHdpbGwgYmUgY29uc3RydWN0ZWQgc28KKyAgLy8gdGhleSBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgVFNlcnZlclRyYW5zcG9ydDo6aW50ZXJydXB0Q2hpbGRyZW4oKS4KKyAgLy8gVGhpcyBpcyBtb3JlIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzeXN0ZW0gY2FsbHMgKHBvbGwgKyByZWN2KSBob3dldmVyCisgIC8vIGVuc3VyZXMgYSBjb25uZWN0ZWQgY2xpZW50IGNhbm5vdCBpbnRlcmZlcmUgd2l0aCBUU2VydmVyOjpzdG9wKCkuCisgIC8vCisgIC8vIFdoZW4gZGlzYWJsZWQsIFRTb2NrZXQgY2hpbGRyZW4gZG8gbm90IGluY3VyIGFuIGFkZGl0aW9uYWwgcG9sbCgpIGNhbGwuCisgIC8vIFNlcnZlci1zaWRlIHJlYWRzIGFyZSBtb3JlIGVmZmljaWVudCwgaG93ZXZlciBhIGNsaWVudCBjYW4gaW50ZXJmZXJlIHdpdGgKKyAgLy8gdGhlIHNlcnZlcidzIGFiaWxpdHkgdG8gc2h1dGRvd24gcHJvcGVybHkgYnkgc3RheWluZyBjb25uZWN0ZWQuCisgIC8vCisgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBsaXN0ZW4oKTsgbW9kZSBjYW5ub3QgYmUgc3dpdGNoZWQgYWZ0ZXIgdGhhdC4KKyAgLy8gXHRocm93cyBzdGQ6OmxvZ2ljX2Vycm9yIGlmIGxpc3RlbigpIGhhcyBiZWVuIGNhbGxlZAorICB2b2lkIHNldEludGVycnVwdGFibGVDaGlsZHJlbihib29sIGVuYWJsZSk7CisKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKworICBpbnQgZ2V0UG9ydCgpOworCisgIHZvaWQgbGlzdGVuKCk7CisgIHZvaWQgaW50ZXJydXB0KCk7CisgIHZvaWQgaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCk7CisgIGJvb2wgaW50ZXJydXB0YWJsZUNoaWxkcmVuXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfOyAvLyBpZiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fIHRoaXMgaXMgc2hhcmVkIHdpdGggY2hpbGQgVFNvY2tldHMKKworcHJpdmF0ZToKKyAgdm9pZCBub3RpZnkoVEhSSUZUX1NPQ0tFVCBub3RpZnlTb2NrKTsKKworICBpbnQgcG9ydF87CisgIHN0ZDo6c3RyaW5nIGFkZHJlc3NfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworICBpbnQgYWNjZXB0QmFja2xvZ187CisgIGludCBzZW5kVGltZW91dF87CisgIGludCByZWN2VGltZW91dF87CisgIGludCBhY2NUaW1lb3V0XzsKKyAgaW50IHJldHJ5TGltaXRfOworICBpbnQgcmV0cnlEZWxheV87CisgIGludCB0Y3BTZW5kQnVmZmVyXzsKKyAgaW50IHRjcFJlY3ZCdWZmZXJfOworICBib29sIGtlZXBBbGl2ZV87CisgIGJvb2wgbGlzdGVuaW5nXzsKKworICBjb25jdXJyZW5jeTo6TXV0ZXggcndNdXRleF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkLXNhZmUgaW50ZXJydXB0CisgIFRIUklGVF9TT0NLRVQgaW50ZXJydXB0U29ja1dyaXRlcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBpbnRlcnJ1cHQoKQorICBUSFJJRlRfU09DS0VUIGludGVycnVwdFNvY2tSZWFkZXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZCBpbiBzZWxlY3QvcG9sbCB3aXRoIHNlcnZlclNvY2tldF8gZm9yIGludGVycnVwdGFiaWxpdHkKKyAgVEhSSUZUX1NPQ0tFVCBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfOyAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIGludGVycnVwdENoaWxkcmVuKCkKKworICBzb2NrZXRfZnVuY190IGxpc3RlbkNhbGxiYWNrXzsKKyAgc29ja2V0X2Z1bmNfdCBhY2NlcHRDYWxsYmFja187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3NjMyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogU2VydmVyIHRyYW5zcG9ydCBmcmFtZXdvcmsuIEEgc2VydmVyIG5lZWRzIHRvIGhhdmUgc29tZSBmYWNpbGl0eSBmb3IKKyAqIGNyZWF0aW5nIGJhc2UgdHJhbnNwb3J0cyB0byByZWFkL3dyaXRlIGZyb20uICBUaGUgc2VydmVyIGlzIGV4cGVjdGVkCisgKiB0byBrZWVwIHRyYWNrIG9mIFRUcmFuc3BvcnQgY2hpbGRyZW4gdGhhdCBpdCBjcmVhdGVzIGZvciBwdXJwb3NlcyBvZgorICogY29udHJvbGxpbmcgdGhlaXIgbGlmZXRpbWUuCisgKi8KK2NsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIH5UU2VydmVyVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBQcmlvciB0byB0aGlzCisgICAqIGNhbGwgbW9zdCB0cmFuc3BvcnRzIHdpbGwgbm90IHJldHVybiBhbnl0aGluZyB3aGVuIGFjY2VwdCBpcyBjYWxsZWQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsaXN0ZW4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKSB7fQorCisgIC8qKgorICAgKiBHZXRzIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0cmFuc3BvcnQgb2JqZWN0IGFuZCBwYXNzZXMgaXQgdG8gdGhlCisgICAqIGNhbGxlci4gTm90ZSB0aGF0IGl0IGlzIHRoZSBleHBsaWNpdCBkdXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGUKKyAgICogYWxsb2NhdGVkIG9iamVjdC4gVGhlIHJldHVybmVkIFRUcmFuc3BvcnQgb2JqZWN0IG11c3QgYWx3YXlzIGJlIGluIHRoZQorICAgKiBvcGVuZWQgc3RhdGUuIE5VTEwgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLCBpbnN0ZWFkIGFuIEV4Y2VwdGlvbiBzaG91bGQKKyAgICogYWx3YXlzIGJlIHRocm93bi4KKyAgICoKKyAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIEZvciAic21hcnQiIFRTZXJ2ZXJUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRoYXQgd29yayBpbiBhIG11bHRpCisgICAqIHRocmVhZGVkIGNvbnRleHQgdGhpcyBjYW4gYmUgdXNlZCB0byBicmVhayBvdXQgb2YgYW4gYWNjZXB0KCkgY2FsbC4KKyAgICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgdHJhbnNwb3J0IHdpbGwgdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqIHdpdGggdGhlIElOVEVSUlVQVEVEIGVycm9yIGNvZGUuCisgICAqCisgICAqIFRoaXMgd2lsbCBub3QgbWFrZSBhbiBhdHRlbXB0IHRvIGludGVycnVwdCBhbnkgVFRyYW5zcG9ydCBjaGlsZHJlbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7fQorCisgIC8qKgorICAgKiBUaGlzIHdpbGwgaW50ZXJydXB0IHRoZSBjaGlsZHJlbiBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIgdHJhbnNwb3J0LgorICAgKiBhbGxvd2luZyB0aGVtIHRvIGJyZWFrIG91dCBvZiBhbnkgYmxvY2tpbmcgZGF0YSByZWNlcHRpb24gY2FsbC4KKyAgICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY2hpbGRyZW4gd2lsbCB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICogd2l0aCB0aGUgSU5URVJSVVBURUQgZXJyb3IgY29kZS4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpIHt9CisKKyAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKgorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgKi8KKworICB2aXJ0dWFsIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiAtMTsgfQorCisgIC8qKgorICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgIFRTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTgyNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSE9SVFJFQURUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgdGVzdCB7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBvbmx5IG1lYW50IGZvciB0ZXN0aW5nLiAgSXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQuCisgKiBDYWxscyB0byByZWFkIGFyZSBwYXNzZWQgdGhyb3VnaCB3aXRoIHNvbWUgcHJvYmFiaWxpdHkuICBPdGhlcndpc2UsCisgKiB0aGUgcmVhZCBhbW91bnQgaXMgcmFuZG9tbHkgcmVkdWNlZCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRocm91Z2guCisgKgorICovCitjbGFzcyBUU2hvcnRSZWFkVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRTaG9ydFJlYWRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgVFNob3J0UmVhZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLCBmdWxsUHJvYl8oZnVsbF9wcm9iKSB7fQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KKworICBib29sIHBlZWsoKSB7IHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KKworICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorCisgIHZvaWQgY2xvc2UoKSB7IHRyYW5zcG9ydF8tPmNsb3NlKCk7IH0KKworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocmFuZCgpIC8gKGRvdWJsZSlSQU5EX01BWCA+PSBmdWxsUHJvYl8pIHsKKyAgICAgIGxlbiA9IDEgKyByYW5kKCkgJSBsZW47CisgICAgfQorICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOyB9CisKKyAgdm9pZCBmbHVzaCgpIHsgdHJhbnNwb3J0Xy0+Zmx1c2goKTsgfQorCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmJvcnJvdyhidWYsIGxlbik7IH0KKworICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7IHJldHVybiB0cmFuc3BvcnRfLT5jb25zdW1lKGxlbik7IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgZG91YmxlIGZ1bGxQcm9iXzsKK307Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3QKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjEzOTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RTaW1wbGVGaWxlVHJhbnNwb3J0OjpUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCByZWFkLCBib29sIHdyaXRlKQorICA6IFRGRFRyYW5zcG9ydCgtMSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSB7CisgIGludCBmbGFncyA9IDA7CisgIGlmIChyZWFkICYmIHdyaXRlKSB7CisgICAgZmxhZ3MgPSBPX1JEV1I7CisgIH0gZWxzZSBpZiAocmVhZCkgeworICAgIGZsYWdzID0gT19SRE9OTFk7CisgIH0gZWxzZSBpZiAod3JpdGUpIHsKKyAgICBmbGFncyA9IE9fV1JPTkxZOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5laXRoZXIgUkVBRCBub3IgV1JJVEUgc3BlY2lmaWVkIik7CisgIH0KKyAgaWYgKHdyaXRlKSB7CisgICAgZmxhZ3MgfD0gT19DUkVBVCB8IE9fQVBQRU5EOworICB9CisjaWZuZGVmIF9XSU4zMgorICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisjZWxzZQorICBpbnQgbW9kZSA9IF9TX0lSRUFEIHwgX1NfSVdSSVRFOworI2VuZGlmCisgIGludCBmZCA9IDo6VEhSSUZUX09QRU4ocGF0aC5jX3N0cigpLCBmbGFncywgbW9kZSk7CisgIGlmIChmZCA8IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJmYWlsZWQgdG8gb3BlbiBmaWxlIGZvciB3cml0aW5nOiAiICsgcGF0aCk7CisgIH0KKyAgc2V0RkQoZmQpOworICBvcGVuKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmUxODk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlLgorICoKKyAqIFdyaXRlYWJsZSBmaWxlcyBhcmUgb3BlbmVkIHdpdGggT19DUkVBVCBhbmQgT19BUFBFTkQKKyAqLworY2xhc3MgVFNpbXBsZUZpbGVUcmFuc3BvcnQgOiBwdWJsaWMgVEZEVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wgcmVhZCA9IHRydWUsIGJvb2wgd3JpdGUgPSBmYWxzZSk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAgX1RIUklGVF9UUkFOU1BPUlRfVFNJTVBMRUZJTEVUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzJiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCkBAIC0wLDAgKzEsOTU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVU5fSAorI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZm5kZWYgU09DS09QVF9DQVNUX1QKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBjb25zdCBTT0NLT1BUX0NBU1RfVCogY29uc3RfY2FzdF9zb2Nrb3B0KGNvbnN0IFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgU09DS09QVF9DQVNUX1QqIGNhc3Rfc29ja29wdChUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogVFNvY2tldCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKi8KKworVFNvY2tldDo6VFNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQorICA6IGhvc3RfKGhvc3QpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKK30KKworVFNvY2tldDo6VFNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogcG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworfQorCitUU29ja2V0OjpUU29ja2V0KCkKKyAgOiBwb3J0XygwKSwKKyAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7CisgIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7Cit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0Xyhzb2NrZXQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworI2lmZGVmIFNPX05PU0lHUElQRQorICB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgOiBwb3J0XygwKSwKKyAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGludGVycnVwdExpc3RlbmVyXyhpbnRlcnJ1cHRMaXN0ZW5lciksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKKyAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyNpZmRlZiBTT19OT1NJR1BJUEUKKyAgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmb25lLCBzaXplb2Yob25lKSk7CisgIH0KKyNlbmRpZgorfQorCitUU29ja2V0Ojp+VFNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKworYm9vbCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludDMyX3QgcmV0cmllcyA9IDA7CisgIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgbnVtQnl0ZXNBdmFpbGFibGU7Cit0cnlfYWdhaW46CisgIGludCByID0gVEhSSUZUX0lPQ1RMX1NPQ0tFVChzb2NrZXRfLCBGSU9OUkVBRCwgJm51bUJ5dGVzQXZhaWxhYmxlKTsKKyAgaWYgKHIgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSkgeworICAgICAgZ290byB0cnlfYWdhaW47CisgICAgfQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgVEhSSUZUX0lPQ1RMX1NPQ0tFVCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfQorICByZXR1cm4gbnVtQnl0ZXNBdmFpbGFibGUgPiAwOworfQorCitib29sIFRTb2NrZXQ6OmlzT3BlbigpIHsKKyAgcmV0dXJuIChzb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCk7Cit9CisKK2Jvb2wgVFNvY2tldDo6cGVlaygpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgZm9yIChpbnQgcmV0cmllcyA9IDA7OykgeworICAgICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICAgICAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgICAgICBmZHNbMF0uZmQgPSBzb2NrZXRfOworICAgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgICBmZHNbMV0uZmQgPSAqKGludGVycnVwdExpc3RlbmVyXy5nZXQoKSk7CisgICAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICAgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIDIsIChyZWN2VGltZW91dF8gPT0gMCkgPyAtMSA6IHJlY3ZUaW1lb3V0Xyk7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cGVlaygpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgICAgaWYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGRhdGEgb3IgYSBkaXNjb25uZWN0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIFBFRUsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyB0aW1lb3V0CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgZGF0YSBpcyBhdmFpbGFibGUgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZAorICB1aW50OF90IGJ1ZjsKKyAgaW50IHIgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3Yoc29ja2V0XywgY2FzdF9zb2Nrb3B0KCZidWYpLCAxLCBNU0dfUEVFSykpOworICBpZiAociA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCisgICAgLyogc2hpZ2luOgorICAgICAqIGZyZWVic2QgcmV0dXJucyAtMSBhbmQgVEhSSUZUX0VDT05OUkVTRVQgaWYgc29ja2V0IHdhcyBjbG9zZWQgYnkKKyAgICAgKiB0aGUgb3RoZXIgc2lkZQorICAgICAqLworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cGVlaygpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZWN2KCkiLCBlcnJub19jb3B5KTsKKyAgfQorICByZXR1cm4gKHIgPiAwKTsKK30KKwordm9pZCBUU29ja2V0OjpvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8qIHJlcykgeworCisgIGlmIChpc09wZW4oKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICB9IGVsc2UgeworICAgIHNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOworICB9CisKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgc29ja2V0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCgpIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBTZW5kIHRpbWVvdXQKKyAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKKyAgICBzZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOworICB9CisKKyAgLy8gUmVjdiB0aW1lb3V0CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgc2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKKyAgfQorCisgIGlmIChrZWVwQWxpdmVfKSB7CisgICAgc2V0S2VlcEFsaXZlKGtlZXBBbGl2ZV8pOworICB9CisKKyAgLy8gTGluZ2VyCisgIHNldExpbmdlcihsaW5nZXJPbl8sIGxpbmdlclZhbF8pOworCisgIC8vIE5vIGRlbGF5CisgIHNldE5vRGVsYXkobm9EZWxheV8pOworCisjaWZkZWYgU09fTk9TSUdQSVBFCisgIHsKKyAgICBpbnQgb25lID0gMTsKKyAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKKworLy8gVXNlcyBhIGxvdyBtaW4gUlRPIGlmIGFza2VkIHRvLgorI2lmZGVmIFRDUF9MT1dfTUlOX1JUTworICBpZiAoZ2V0VXNlTG93TWluUnRvKCkpIHsKKyAgICBpbnQgb25lID0gMTsKKyAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCisKKyAgLy8gU2V0IHRoZSBzb2NrZXQgdG8gYmUgbm9uIGJsb2NraW5nIGZvciBjb25uZWN0IGlmIGEgdGltZW91dCBleGlzdHMKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGNvbm5UaW1lb3V0XyA+IDApIHsKKyAgICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRkNOVEwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgJiB+VEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9GQ05UTCAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRkNOVEwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICAvLyBDb25uZWN0IHRoZSBzb2NrZXQKKyAgaW50IHJldDsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7CisgICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIik7CisgICAgfQorCisgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7CisgICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBtZW1jcHkoYWRkcmVzcy5zdW5fcGF0aCwgcGF0aF8uY19zdHIoKSwgbGVuKTsKKworICAgIHNvY2tsZW5fdCBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CisjZWxzZQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXQgPSBjb25uZWN0KHNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyZXNzLCBzdHJ1Y3RsZW4pOworI2Vsc2UKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKworICB9IGVsc2UgeworICAgIHJldCA9IGNvbm5lY3Qoc29ja2V0XywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpOworICB9CisKKyAgLy8gc3VjY2VzcyBjYXNlCisgIGlmIChyZXQgPT0gMCkgeworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmICgoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VJTlBST0dSRVNTKQorICAgICAgJiYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FV09VTERCTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBjb25uZWN0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImNvbm5lY3QoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1sxXTsKKyAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgIGZkc1swXS5mZCA9IHNvY2tldF87CisgIGZkc1swXS5ldmVudHMgPSBUSFJJRlRfUE9MTE9VVDsKKyAgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAxLCBjb25uVGltZW91dF8pOworCisgIGlmIChyZXQgPiAwKSB7CisgICAgLy8gRW5zdXJlIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBlcnJvcnMgc2V0CisgICAgaW50IHZhbDsKKyAgICBzb2NrbGVuX3QgbG9uOworICAgIGxvbiA9IHNpemVvZihpbnQpOworICAgIGludCByZXQyID0gZ2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19FUlJPUiwgY2FzdF9zb2Nrb3B0KCZ2YWwpLCAmbG9uKTsKKyAgICBpZiAocmV0MiA9PSAtMSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBnZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZ2V0c29ja29wdCgpIiwgZXJybm9fY29weSk7CisgICAgfQorICAgIC8vIG5vIGVycm9ycyBvbiBzb2NrZXQsIGdvIHRvIHRvd24KKyAgICBpZiAodmFsID09IDApIHsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGVycm9yIG9uIHNvY2tldCAoYWZ0ZXIgVEhSSUZUX1BPTEwpICIgKyBnZXRTb2NrZXRJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQgb3BlbigpIGVycm9yIiwgdmFsKTsKKyAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgIC8vIHNvY2tldCB0aW1lZCBvdXQKKyAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSB0aW1lZCBvdXQgIiArIGdldFNvY2tldEluZm8oKTsKKyAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJvcGVuKCkgdGltZWQgb3V0Iik7CisgIH0gZWxzZSB7CisgICAgLy8gZXJyb3Igb24gVEhSSUZUX1BPTEwoKQorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9QT0xMKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9QT0xMKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgIH0KKworZG9uZToKKyAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX0ZDTlRMICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRkNOVEwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgc2V0Q2FjaGVkQWRkcmVzcyhyZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PHNvY2tsZW5fdD4ocmVzLT5haV9hZGRybGVuKSk7CisgIH0KK30KKwordm9pZCBUU29ja2V0OjpvcGVuKCkgeworICBpZiAoaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgdW5peF9vcGVuKCk7CisgIH0gZWxzZSB7CisgICAgbG9jYWxfb3BlbigpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6dW5peF9vcGVuKCkgeworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICAvLyBVbml4IERvbWFpbiBTT2NrZXQgZG9lcyBub3QgbmVlZCBhZGRyaW5mbyBzdHJ1Y3QsIHNvIHdlIHBhc3MgTlVMTAorICAgIG9wZW5Db25uZWN0aW9uKE5VTEwpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6bG9jYWxfb3BlbigpIHsKKworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisKKyAgaWYgKGlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgIH0KKworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOworICByZXMgPSBOVUxMOworICByZXMwID0gTlVMTDsKKyAgaW50IGVycm9yOworICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOworICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKKworICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RfLmNfc3RyKCksIHBvcnQsICZoaW50cywgJnJlczApOworCisjaWZkZWYgX1dJTjMyCisgIGlmIChlcnJvciA9PSBXU0FOT19EQVRBKSB7CisgICAgaGludHMuYWlfZmxhZ3MgJj0gfkFJX0FERFJDT05GSUc7CisgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhob3N0Xy5jX3N0cigpLCBwb3J0LCAmaGludHMsICZyZXMwKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKGVycm9yKSB7CisgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0OjpvcGVuKCkgZ2V0YWRkcmluZm8oKSAiICsgZ2V0U29ja2V0SW5mbygpCisgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBjbGllbnQgc29ja2V0LiIpOworICB9CisKKyAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgdGhlIHJldHVybmVkIGFkZHJlc3NlcyB1bnRpbCBvbmUKKyAgLy8gY29ubmVjdHMgb3IgcHVzaCB0aGUgZXhjZXB0aW9uIHVwLgorICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7CisgICAgdHJ5IHsKKyAgICAgIG9wZW5Db25uZWN0aW9uKHJlcyk7CisgICAgICBicmVhazsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgaWYgKHJlcy0+YWlfbmV4dCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOyAvLyBjbGVhbnVwIG9uIGZhaWx1cmUKKyAgICAgICAgdGhyb3c7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRnJlZSBhZGRyZXNzIHN0cnVjdHVyZSBtZW1vcnkKKyAgZnJlZWFkZHJpbmZvKHJlczApOworfQorCit2b2lkIFRTb2NrZXQ6OmNsb3NlKCkgeworICBpZiAoc29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBzaHV0ZG93bihzb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzb2NrZXRfKTsKKyAgfQorICBzb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCit2b2lkIFRTb2NrZXQ6OnNldFNvY2tldEZEKFRIUklGVF9TT0NLRVQgc29ja2V0KSB7CisgIGlmIChzb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGNsb3NlKCk7CisgIH0KKyAgc29ja2V0XyA9IHNvY2tldDsKK30KKwordWludDMyX3QgVFNvY2tldDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gc29ja2V0Iik7CisgIH0KKworICBpbnQzMl90IHJldHJpZXMgPSAwOworCisgIC8vIFRIUklGVF9FQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgorICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgorICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKKyAgLy8gVEhSSUZUX0VBR0FJTiBpcyB0YWtlbiB0byBpbmRpY2F0ZSBhbiBvdXQgb2YgcmVzb3VyY2VzIGVycm9yLgorICB1aW50MzJfdCBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAwOworICBpZiAocmVjdlRpbWVvdXRfKSB7CisgICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCisgICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCisgICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKKyAgICBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAocmVjdlRpbWVvdXRfICogMTAwMCkgLyAoKG1heFJlY3ZSZXRyaWVzXyA+IDApID8gbWF4UmVjdlJldHJpZXNfIDogMik7CisgIH0KKwordHJ5X2FnYWluOgorICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICBzdHJ1Y3QgdGltZXZhbCBiZWdpbjsKKyAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZiZWdpbiwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgIC8vIGFuIFRIUklGVF9FQUdBSU4gaXMgZHVlIHRvIGEgdGltZW91dCBvciBhbiBvdXQtb2YtcmVzb3VyY2UgY29uZGl0aW9uLgorICAgIGJlZ2luLnR2X3NlYyA9IGJlZ2luLnR2X3VzZWMgPSAwOworICB9CisKKyAgaW50IGdvdCA9IDA7CisKKyAgaWYgKGludGVycnVwdExpc3RlbmVyXykgeworICAgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKKyAgICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgICBmZHNbMF0uZmQgPSBzb2NrZXRfOworICAgIGZkc1swXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKKyAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKworICAgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIDIsIChyZWN2VGltZW91dF8gPT0gMCkgPyAtMSA6IHJlY3ZUaW1lb3V0Xyk7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSkgeworICAgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICAgIH0KKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnJlYWQoKSBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICBpZiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJJbnRlcnJ1cHRlZCIpOworICAgICAgfQorICAgIH0gZWxzZSAvKiByZXQgPT0gMCAqLyB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9FQUdBSU4gKHRpbWVkIG91dCkiKTsKKyAgICB9CisKKyAgICAvLyBmYWxsaW5nIHRocm91Z2ggbWVhbnMgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlY3YgYW5kIGl0IGNhbm5vdCBibG9jaworICB9CisKKyAgZ290ID0gc3RhdGljX2Nhc3Q8aW50PihyZWN2KHNvY2tldF8sIGNhc3Rfc29ja29wdChidWYpLCBsZW4sIDApKTsKKyAgLy8gVEhSSUZUX0dFVFRJTUVPRkRBWSBjYW4gY2hhbmdlIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SCisgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisKKyAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKKyAgaWYgKGdvdCA8IDApIHsKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUFHQUlOKSB7CisgICAgICAvLyBpZiBubyB0aW1lb3V0IHdlIGNhbiBhc3N1bWUgdGhhdCByZXNvdXJjZSBleGhhdXN0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgIGlmIChyZWN2VGltZW91dF8gPT0gMCkgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOworICAgICAgfQorICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCisgICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7CisgICAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOworICAgICAgdWludDMyX3QgcmVhZEVsYXBzZWRNaWNyb3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZW5kLnR2X3VzZWMgLSBiZWdpbi50dl91c2VjKSk7CisKKyAgICAgIGlmICghZWFnYWluVGhyZXNob2xkTWljcm9zIHx8IChyZWFkRWxhcHNlZE1pY3JvcyA8IGVhZ2FpblRocmVzaG9sZE1pY3JvcykpIHsKKyAgICAgICAgaWYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKDUwKTsKKyAgICAgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfRUFHQUlOICh0aW1lZCBvdXQpIik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgorICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiByZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgIH0KKworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzaCBpc24ndCBvcGVuCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VOT1RDT05OKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX0VOT1RDT05OIik7CisgICAgfQorCisgICAgLy8gVGltZWQgb3V0IQorICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FVElNRURPVVQpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VUSU1FRE9VVCIpOworICAgIH0KKworICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKworICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgIH0KKworICByZXR1cm4gZ290OworfQorCit2b2lkIFRTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IHNlbnQgPSAwOworCisgIHdoaWxlIChzZW50IDwgbGVuKSB7CisgICAgdWludDMyX3QgYiA9IHdyaXRlX3BhcnRpYWwoYnVmICsgc2VudCwgbGVuIC0gc2VudCk7CisgICAgaWYgKGIgPT0gMCkgeworICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KKyAgICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAic2VuZCB0aW1lb3V0IGV4cGlyZWQiKTsKKyAgICB9CisgICAgc2VudCArPSBiOworICB9Cit9CisKK3VpbnQzMl90IFRTb2NrZXQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBzb2NrZXQiKTsKKyAgfQorCisgIHVpbnQzMl90IHNlbnQgPSAwOworCisgIGludCBmbGFncyA9IDA7CisjaWZkZWYgTVNHX05PU0lHTkFMCisgIC8vIE5vdGUgdGhlIHVzZSBvZiBNU0dfTk9TSUdOQUwgdG8gc3VwcHJlc3MgU0lHUElQRSBlcnJvcnMsIGluc3RlYWQgd2UKKyAgLy8gY2hlY2sgZm9yIHRoZSBUSFJJRlRfRVBJUEUgcmV0dXJuIGNvbmRpdGlvbiBhbmQgY2xvc2UgdGhlIHNvY2tldCBpbiB0aGF0IGNhc2UKKyAgZmxhZ3MgfD0gTVNHX05PU0lHTkFMOworI2VuZGlmIC8vIGlmZGVmIE1TR19OT1NJR05BTAorCisgIGludCBiID0gc3RhdGljX2Nhc3Q8aW50PihzZW5kKHNvY2tldF8sIGNvbnN0X2Nhc3Rfc29ja29wdChidWYgKyBzZW50KSwgbGVuIC0gc2VudCwgZmxhZ3MpKTsKKworICBpZiAoYiA8IDApIHsKKyAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VXT1VMREJMT0NLIHx8IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FQUdBSU4pIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBGYWlsIG9uIGEgc2VuZCBlcnJvcgorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6d3JpdGVfcGFydGlhbCgpIHNlbmQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FUElQRSB8fCBlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUCisgICAgICAgIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VOT1RDT05OKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gRmFpbCBvbiBibG9ja2VkIHNlbmQKKyAgaWYgKGIgPT0gMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJTb2NrZXQgc2VuZCByZXR1cm5lZCAwLiIpOworICB9CisgIHJldHVybiBiOworfQorCitzdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRIb3N0KCkgeworICByZXR1cm4gaG9zdF87Cit9CisKK2ludCBUU29ja2V0OjpnZXRQb3J0KCkgeworICByZXR1cm4gcG9ydF87Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0SG9zdChzdHJpbmcgaG9zdCkgeworICBob3N0XyA9IGhvc3Q7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0UG9ydChpbnQgcG9ydCkgeworICBwb3J0XyA9IHBvcnQ7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0TGluZ2VyKGJvb2wgb24sIGludCBsaW5nZXIpIHsKKyAgbGluZ2VyT25fID0gb247CisgIGxpbmdlclZhbF8gPSBsaW5nZXI7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHJldHVybjsKKyAgfQorCisjaWZuZGVmIF9XSU4zMgorICBzdHJ1Y3QgbGluZ2VyIGwgPSB7KGxpbmdlck9uXyA/IDEgOiAwKSwgbGluZ2VyVmFsX307CisjZWxzZQorICBzdHJ1Y3QgbGluZ2VyIGwgPSB7c3RhdGljX2Nhc3Q8dV9zaG9ydD4obGluZ2VyT25fID8gMSA6IDApLCBzdGF0aWNfY2FzdDx1X3Nob3J0PihsaW5nZXJWYWxfKX07CisjZW5kaWYKKworICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIGNhc3Rfc29ja29wdCgmbCksIHNpemVvZihsKSk7CisgIGlmIChyZXQgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0TGluZ2VyKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0Tm9EZWxheShib29sIG5vRGVsYXkpIHsKKyAgbm9EZWxheV8gPSBub0RlbGF5OworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgfHwgIXBhdGhfLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTZXQgc29ja2V0IHRvIE5PREVMQVkKKyAgaW50IHYgPSBub0RlbGF5XyA/IDEgOiAwOworICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNhc3Rfc29ja29wdCgmdiksIHNpemVvZih2KSk7CisgIGlmIChyZXQgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0Tm9EZWxheSgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OnNldENvbm5UaW1lb3V0KGludCBtcykgeworICBjb25uVGltZW91dF8gPSBtczsKK30KKwordm9pZCBzZXRHZW5lcmljVGltZW91dChUSFJJRlRfU09DS0VUIHMsIGludCB0aW1lb3V0X21zLCBpbnQgb3B0bmFtZSkgeworICBpZiAodGltZW91dF9tcyA8IDApIHsKKyAgICBjaGFyIGVyckJ1Zls1MTJdOworICAgIHNwcmludGYoZXJyQnVmLCAiVFNvY2tldDo6c2V0R2VuZXJpY1RpbWVvdXQgd2l0aCBuZWdhdGl2ZSBpbnB1dDogJWRcbiIsIHRpbWVvdXRfbXMpOworICAgIEdsb2JhbE91dHB1dChlcnJCdWYpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHJldHVybjsKKyAgfQorCisjaWZkZWYgX1dJTjMyCisgIERXT1JEIHBsYXRmb3JtX3RpbWUgPSBzdGF0aWNfY2FzdDxEV09SRD4odGltZW91dF9tcyk7CisjZWxzZQorICBzdHJ1Y3QgdGltZXZhbCBwbGF0Zm9ybV90aW1lID0geyhpbnQpKHRpbWVvdXRfbXMgLyAxMDAwKSwgKGludCkoKHRpbWVvdXRfbXMgJSAxMDAwKSAqIDEwMDApfTsKKyNlbmRpZgorCisgIGludCByZXQgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIG9wdG5hbWUsIGNhc3Rfc29ja29wdCgmcGxhdGZvcm1fdGltZSksIHNpemVvZihwbGF0Zm9ybV90aW1lKSk7CisgIGlmIChyZXQgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0R2VuZXJpY1RpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgIiwgZXJybm9fY29weSk7CisgIH0KK30KKwordm9pZCBUU29ja2V0OjpzZXRSZWN2VGltZW91dChpbnQgbXMpIHsKKyAgc2V0R2VuZXJpY1RpbWVvdXQoc29ja2V0XywgbXMsIFNPX1JDVlRJTUVPKTsKKyAgcmVjdlRpbWVvdXRfID0gbXM7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IG1zKSB7CisgIHNldEdlbmVyaWNUaW1lb3V0KHNvY2tldF8sIG1zLCBTT19TTkRUSU1FTyk7CisgIHNlbmRUaW1lb3V0XyA9IG1zOworfQorCit2b2lkIFRTb2NrZXQ6OnNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeworICBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOworCisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGludCB2YWx1ZSA9IGtlZXBBbGl2ZV87CisgIGludCByZXQKKyAgICAgID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIGNvbnN0X2Nhc3Rfc29ja29wdCgmdmFsdWUpLCBzaXplb2YodmFsdWUpKTsKKworICBpZiAocmV0ID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkKKyAgICAgICAgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldEtlZXBBbGl2ZSgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OnNldE1heFJlY3ZSZXRyaWVzKGludCBtYXhSZWN2UmV0cmllcykgeworICBtYXhSZWN2UmV0cmllc18gPSBtYXhSZWN2UmV0cmllczsKK30KKworc3RyaW5nIFRTb2NrZXQ6OmdldFNvY2tldEluZm8oKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgaWYgKGhvc3RfLmVtcHR5KCkgfHwgcG9ydF8gPT0gMCkgeworICAgICAgb3NzIDw8ICI8SG9zdDogIiA8PCBnZXRQZWVyQWRkcmVzcygpOworICAgICAgb3NzIDw8ICIgUG9ydDogIiA8PCBnZXRQZWVyUG9ydCgpIDw8ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgb3NzIDw8ICI8SG9zdDogIiA8PCBob3N0XyA8PCAiIFBvcnQ6ICIgPDwgcG9ydF8gPDwgIj4iOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvc3MgPDwgIjxQYXRoOiAiIDw8IHBhdGhfIDw8ICI+IjsKKyAgfQorICByZXR1cm4gb3NzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRQZWVySG9zdCgpIHsKKyAgaWYgKHBlZXJIb3N0Xy5lbXB0eSgpICYmIHBhdGhfLmVtcHR5KCkpIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkciogYWRkclB0cjsKKyAgICBzb2NrbGVuX3QgYWRkckxlbjsKKworICAgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgcmV0dXJuIGhvc3RfOworICAgIH0KKworICAgIGFkZHJQdHIgPSBnZXRDYWNoZWRBZGRyZXNzKCZhZGRyTGVuKTsKKworICAgIGlmIChhZGRyUHRyID09IE5VTEwpIHsKKyAgICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkcik7CisgICAgICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHBlZXJIb3N0XzsKKyAgICAgIH0KKyAgICAgIGFkZHJQdHIgPSAoc29ja2FkZHIqKSZhZGRyOworCisgICAgICBzZXRDYWNoZWRBZGRyZXNzKGFkZHJQdHIsIGFkZHJMZW4pOworICAgIH0KKworICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKKyAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07CisKKyAgICBnZXRuYW1laW5mbygoc29ja2FkZHIqKWFkZHJQdHIsCisgICAgICAgICAgICAgICAgYWRkckxlbiwKKyAgICAgICAgICAgICAgICBjbGllbnRob3N0LAorICAgICAgICAgICAgICAgIHNpemVvZihjbGllbnRob3N0KSwKKyAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLAorICAgICAgICAgICAgICAgIHNpemVvZihjbGllbnRzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAwKTsKKworICAgIHBlZXJIb3N0XyA9IGNsaWVudGhvc3Q7CisgIH0KKyAgcmV0dXJuIHBlZXJIb3N0XzsKK30KKworc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckFkZHJlc3MoKSB7CisgIGlmIChwZWVyQWRkcmVzc18uZW1wdHkoKSAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7CisgICAgc29ja2xlbl90IGFkZHJMZW47CisKKyAgICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICAgIHJldHVybiBwZWVyQWRkcmVzc187CisgICAgfQorCisgICAgYWRkclB0ciA9IGdldENhY2hlZEFkZHJlc3MoJmFkZHJMZW4pOworCisgICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgeworICAgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSZhZGRyLCAmYWRkckxlbikgIT0gMCkgeworICAgICAgICByZXR1cm4gcGVlckFkZHJlc3NfOworICAgICAgfQorICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7CisKKyAgICAgIHNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7CisgICAgfQorCisgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOworICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKKworICAgIGdldG5hbWVpbmZvKGFkZHJQdHIsCisgICAgICAgICAgICAgICAgYWRkckxlbiwKKyAgICAgICAgICAgICAgICBjbGllbnRob3N0LAorICAgICAgICAgICAgICAgIHNpemVvZihjbGllbnRob3N0KSwKKyAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLAorICAgICAgICAgICAgICAgIHNpemVvZihjbGllbnRzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsKKworICAgIHBlZXJBZGRyZXNzXyA9IGNsaWVudGhvc3Q7CisgICAgcGVlclBvcnRfID0gc3RkOjphdG9pKGNsaWVudHNlcnZpY2UpOworICB9CisgIHJldHVybiBwZWVyQWRkcmVzc187Cit9CisKK2ludCBUU29ja2V0OjpnZXRQZWVyUG9ydCgpIHsKKyAgZ2V0UGVlckFkZHJlc3MoKTsKKyAgcmV0dXJuIHBlZXJQb3J0XzsKK30KKwordm9pZCBUU29ja2V0OjpzZXRDYWNoZWRBZGRyZXNzKGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgbGVuKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CisgIGNhc2UgQUZfSU5FVDoKKyAgICBpZiAobGVuID09IHNpemVvZihzb2NrYWRkcl9pbikpIHsKKyAgICAgIG1lbWNweSgodm9pZCopJmNhY2hlZFBlZXJBZGRyXy5pcHY0LCAodm9pZCopYWRkciwgbGVuKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBBRl9JTkVUNjoKKyAgICBpZiAobGVuID09IHNpemVvZihzb2NrYWRkcl9pbjYpKSB7CisgICAgICBtZW1jcHkoKHZvaWQqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NiwgKHZvaWQqKWFkZHIsIGxlbik7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHBlZXJBZGRyZXNzXy5jbGVhcigpOworICBwZWVySG9zdF8uY2xlYXIoKTsKK30KKworc29ja2FkZHIqIFRTb2NrZXQ6OmdldENhY2hlZEFkZHJlc3Moc29ja2xlbl90KiBsZW4pIGNvbnN0IHsKKyAgc3dpdGNoIChjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5KSB7CisgIGNhc2UgQUZfSU5FVDoKKyAgICAqbGVuID0gc2l6ZW9mKHNvY2thZGRyX2luKTsKKyAgICByZXR1cm4gKHNvY2thZGRyKikmY2FjaGVkUGVlckFkZHJfLmlwdjQ7CisKKyAgY2FzZSBBRl9JTkVUNjoKKyAgICAqbGVuID0gc2l6ZW9mKHNvY2thZGRyX2luNik7CisgICAgcmV0dXJuIChzb2NrYWRkciopJmNhY2hlZFBlZXJBZGRyXy5pcHY2OworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworYm9vbCBUU29ja2V0Ojp1c2VMb3dNaW5SdG9fID0gZmFsc2U7Cit2b2lkIFRTb2NrZXQ6OnNldFVzZUxvd01pblJ0byhib29sIHVzZUxvd01pblJ0bykgeworICB1c2VMb3dNaW5SdG9fID0gdXNlTG93TWluUnRvOworfQorYm9vbCBUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSB7CisgIHJldHVybiB1c2VMb3dNaW5SdG9fOworfQorCitjb25zdCBzdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRPcmlnaW4oKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgIG9zcyA8PCBnZXRQZWVySG9zdCgpIDw8ICI6IiA8PCBnZXRQZWVyUG9ydCgpOworICByZXR1cm4gb3NzLnN0cigpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzBkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaWZkZWYgSEFWRV9BUlBBX0lORVRfSAorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFRDUCBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqLworY2xhc3MgVFNvY2tldCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUU29ja2V0PiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICogc29ja2V0LgorICAgKgorICAgKi8KKyAgVFNvY2tldCgpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICogc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gaG9zdCBBbiBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KKyAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgKi8KKyAgVFNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFVuaXggZG9tYWluIHNvY2tldC4KKyAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUgc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBUaGUgVW5peCBkb21haW4gc29ja2V0IGUuZy4gIi90bXAvVGhyaWZ0VGVzdC5iaW5hcnkudGhyaWZ0IgorICAgKi8KKyAgVFNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgLyoqCisgICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAqLworICB2aXJ0dWFsIH5UU29ja2V0KCk7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBhbGl2ZS4KKyAgICoKKyAgICogQHJldHVybiBJcyB0aGUgc29ja2V0IGFsaXZlPworICAgKi8KKyAgdmlydHVhbCBib29sIGlzT3BlbigpOworCisgIC8qKgorICAgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBzb2NrZXQgdG8gcmVhZC4KKyAgICoKKyAgICogVGhpcyBjYWxsIGJsb2NrcyB1bnRpbCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyBhdmFpbGFibGUgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQuCisgICAqLworICB2aXJ0dWFsIGJvb2wgcGVlaygpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiB0aGUgc29ja2V0IGNvdWxkIG5vdCBjb25uZWN0CisgICAqLworICB2aXJ0dWFsIHZvaWQgb3BlbigpOworCisgIC8qKgorICAgKiBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIHBlbmRpbmcgZGF0YSB0byByZWFkIG9yIG5vdC4KKyAgICoKKyAgICogVGhpcyBjYWxsIGRvZXMgbm90IGJsb2NrLgorICAgKiBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAqICAgICAgICAgICBOT1RfT1BFTiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgKiAgICAgICAgICAgVU5LTk9XTiBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgKiBccmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIHBlbmRpbmcgZGF0YSB0byByZWFkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgYm9vbCBoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworCisgIC8qKgorICAgKiBSZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICogXHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaW5kaWNhdGVzIEVPRgorICAgKiBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAqICAgICAgICAgICBJTlRFUlJVUFRFRCBtZWFucyB0aGUgc29ja2V0IHdhcyBpbnRlcnJ1cHRlZAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgb3V0IG9mIGEgYmxvY2tpbmcgY2FsbAorICAgKiAgICAgICAgICAgTk9UX09QRU4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICogICAgICAgICAgIFRJTUVEX09VVCBtZWFucyB0aGUgcmVjZWl2ZSB0aW1lb3V0IGV4cGlyZWQKKyAgICogICAgICAgICAgIFVOS05PV04gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLyoqCisgICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBMb29wcyB1bnRpbCBkb25lIG9yIGZhaWwuCisgICAqLworICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIC8qKgorICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgRG9lcyBzaW5nbGUgc2VuZCgpIGFuZCByZXR1cm5zIHJlc3VsdC4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLyoqCisgICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAqCisgICAqIEByZXR1cm4gc3RyaW5nIGhvc3QgaWRlbnRpZmllcgorICAgKi8KKyAgc3RkOjpzdHJpbmcgZ2V0SG9zdCgpOworCisgIC8qKgorICAgKiBHZXQgdGhlIHBvcnQgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgKgorICAgKiBAcmV0dXJuIGludCBwb3J0IG51bWJlcgorICAgKi8KKyAgaW50IGdldFBvcnQoKTsKKworICAvKioKKyAgICogU2V0IHRoZSBob3N0IHRoYXQgc29ja2V0IHdpbGwgY29ubmVjdCB0bworICAgKgorICAgKiBAcGFyYW0gaG9zdCBob3N0IGlkZW50aWZpZXIKKyAgICovCisgIHZvaWQgc2V0SG9zdChzdGQ6OnN0cmluZyBob3N0KTsKKworICAvKioKKyAgICogU2V0IHRoZSBwb3J0IHRoYXQgc29ja2V0IHdpbGwgY29ubmVjdCB0bworICAgKgorICAgKiBAcGFyYW0gcG9ydCBwb3J0IG51bWJlcgorICAgKi8KKyAgdm9pZCBzZXRQb3J0KGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29udHJvbHMgd2hldGhlciB0aGUgbGluZ2VyIG9wdGlvbiBpcyBzZXQgb24gdGhlIHNvY2tldC4KKyAgICoKKyAgICogQHBhcmFtIG9uICAgICAgV2hldGhlciBTT19MSU5HRVIgaXMgb24KKyAgICogQHBhcmFtIGxpbmdlciAgSWYgbGluZ2VyIGlzIGFjdGl2ZSwgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGxpbmdlciBmb3IKKyAgICovCisgIHZvaWQgc2V0TGluZ2VyKGJvb2wgb24sIGludCBsaW5nZXIpOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGVuYWJsZS9kaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtLgorICAgKgorICAgKiBAcGFyYW0gbm9EZWxheSBXaGV0aGVyIG9yIG5vdCB0byBkaXNhYmxlIHRoZSBhbGdvcml0aG0uCisgICAqIEByZXR1cm4KKyAgICovCisgIHZvaWQgc2V0Tm9EZWxheShib29sIG5vRGVsYXkpOworCisgIC8qKgorICAgKiBTZXQgdGhlIGNvbm5lY3QgdGltZW91dAorICAgKi8KKyAgdm9pZCBzZXRDb25uVGltZW91dChpbnQgbXMpOworCisgIC8qKgorICAgKiBTZXQgdGhlIHJlY2VpdmUgdGltZW91dAorICAgKi8KKyAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgbXMpOworCisgIC8qKgorICAgKiBTZXQgdGhlIHNlbmQgdGltZW91dAorICAgKi8KKyAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgbXMpOworCisgIC8qKgorICAgKiBTZXQgdGhlIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzIGluIGNhc2Ugb2YgYW4gVEhSSUZUX0VBR0FJTgorICAgKiBlcnJvcgorICAgKi8KKyAgdm9pZCBzZXRNYXhSZWN2UmV0cmllcyhpbnQgbWF4UmVjdlJldHJpZXMpOworCisgIC8qKgorICAgKiBTZXQgU09fS0VFUEFMSVZFCisgICAqLworICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSk7CisKKyAgLyoqCisgICAqIEdldCBzb2NrZXQgaW5mb3JtYXRpb24gZm9ybWF0dGVkIGFzIGEgc3RyaW5nIDxIb3N0OiB4IFBvcnQ6IHg+CisgICAqLworICBzdGQ6OnN0cmluZyBnZXRTb2NrZXRJbmZvKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEROUyBuYW1lIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRQZWVySG9zdCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRQZWVyQWRkcmVzcygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBwb3J0IG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAqKi8KKyAgaW50IGdldFBlZXJQb3J0KCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgc29ja2V0IGZpbGUgZGVzY3JpcHRvci4KKyAgICovCisgIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiBzb2NrZXRfOyB9CisKKyAgLyoqCisgICAqIChSZS0paW5pdGlhbGl6ZSBhIFRTb2NrZXQgZm9yIHRoZSBzdXBwbGllZCBkZXNjcmlwdG9yLiAgVGhpcyBpcyBvbmx5CisgICAqIGludGVuZGVkIGZvciB1c2UgYnkgVE5vbmJsb2NraW5nU2VydmVyIC0tIG90aGVyIHVzZSBtYXkgcmVzdWx0IGluCisgICAqIHVuZm9ydHVuYXRlIHN1cnByaXNlcy4KKyAgICoKKyAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBhbHJlYWR5LWNvbm5lY3RlZCBzb2NrZXQKKyAgICovCisgIHZvaWQgc2V0U29ja2V0RkQoVEhSSUZUX1NPQ0tFVCBmZCk7CisKKyAgLyoKKyAgICogUmV0dXJucyBhIGNhY2hlZCBjb3B5IG9mIHRoZSBwZWVyIGFkZHJlc3MuCisgICAqLworICBzb2NrYWRkciogZ2V0Q2FjaGVkQWRkcmVzcyhzb2NrbGVuX3QqIGxlbikgY29uc3Q7CisKKyAgLyoqCisgICAqIFNldHMgd2hldGhlciB0byB1c2UgYSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dC4KKyAgICovCisgIHN0YXRpYyB2b2lkIHNldFVzZUxvd01pblJ0byhib29sIHVzZUxvd01pblJ0byk7CisKKyAgLyoqCisgICAqIEdldHMgd2hldGhlciB0byB1c2UgYSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dC4KKyAgICovCisgIHN0YXRpYyBib29sIGdldFVzZUxvd01pblJ0bygpOworCisgIC8qKgorICAgKiBHZXQgdGhlIG9yaWdpbiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgKgorICAgKiBAcmV0dXJuIHN0cmluZyBwZWVyIGhvc3QgaWRlbnRpZmllciBhbmQgcG9ydAorICAgKi8KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIGZpbGUgZGVzY3JpcHRvci4KKyAgICovCisgIFRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yIHRoYXQKKyAgICogY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KKyAgICovCisgIFRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisKKyAgLyoqCisgICAqIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCisgICAqIGFjY2VwdCgpIG9yIGNvbm5lY3QoKSkuIE9ubHkgY2FjaGVzIElQVjQgYW5kIElQVjY7IHVuc2V0IGZvciBvdGhlcnMuCisgICAqLworICB2b2lkIHNldENhY2hlZEFkZHJlc3MoY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBsZW4pOworCitwcm90ZWN0ZWQ6CisgIC8qKiBjb25uZWN0LCBjYWxsZWQgYnkgb3BlbiAqLworICB2b2lkIG9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyogcmVzKTsKKworICAvKiogSG9zdCB0byBjb25uZWN0IHRvICovCisgIHN0ZDo6c3RyaW5nIGhvc3RfOworCisgIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCisgIGludCBwb3J0XzsKKworICAvKiogVU5JWCBkb21haW4gc29ja2V0IHBhdGggKi8KKyAgc3RkOjpzdHJpbmcgcGF0aF87CisKKyAgLyoqIFVuZGVybHlpbmcgc29ja2V0IGhhbmRsZSAqLworICBUSFJJRlRfU09DS0VUIHNvY2tldF87CisKKyAgLyoqIFBlZXIgaG9zdG5hbWUgKi8KKyAgc3RkOjpzdHJpbmcgcGVlckhvc3RfOworCisgIC8qKiBQZWVyIGFkZHJlc3MgKi8KKyAgc3RkOjpzdHJpbmcgcGVlckFkZHJlc3NfOworCisgIC8qKiBQZWVyIHBvcnQgKi8KKyAgaW50IHBlZXJQb3J0XzsKKworICAvKioKKyAgICogQSBzaGFyZWQgc29ja2V0IHBvaW50ZXIgdGhhdCB3aWxsIGludGVycnVwdCBhIGJsb2NraW5nIHJlYWQgaWYgZGF0YQorICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvbiBpdAorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyXzsKKworICAvKiogQ29ubmVjdCB0aW1lb3V0IGluIG1zICovCisgIGludCBjb25uVGltZW91dF87CisKKyAgLyoqIFNlbmQgdGltZW91dCBpbiBtcyAqLworICBpbnQgc2VuZFRpbWVvdXRfOworCisgIC8qKiBSZWN2IHRpbWVvdXQgaW4gbXMgKi8KKyAgaW50IHJlY3ZUaW1lb3V0XzsKKworICAvKiogS2VlcCBhbGl2ZSBvbiAqLworICBib29sIGtlZXBBbGl2ZV87CisKKyAgLyoqIExpbmdlciBvbiAqLworICBib29sIGxpbmdlck9uXzsKKworICAvKiogTGluZ2VyIHZhbCAqLworICBpbnQgbGluZ2VyVmFsXzsKKworICAvKiogTm9kZWxheSAqLworICBib29sIG5vRGVsYXlfOworCisgIC8qKiBSZWN2IEVHQUlOIHJldHJpZXMgKi8KKyAgaW50IG1heFJlY3ZSZXRyaWVzXzsKKworICAvKiogQ2FjaGVkIHBlZXIgYWRkcmVzcyAqLworICB1bmlvbiB7CisgICAgc29ja2FkZHJfaW4gaXB2NDsKKyAgICBzb2NrYWRkcl9pbjYgaXB2NjsKKyAgfSBjYWNoZWRQZWVyQWRkcl87CisKKyAgLyoqIFdoZXRoZXIgdG8gdXNlIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCisgIHN0YXRpYyBib29sIHVzZUxvd01pblJ0b187CisKK3ByaXZhdGU6CisgIHZvaWQgdW5peF9vcGVuKCk7CisgIHZvaWQgbG9jYWxfb3BlbigpOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzdiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMCisjaW5jbHVkZSA8cmFuZG9tPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmg+CisKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCisvKioKKyAqIFRTb2NrZXRQb29sU2VydmVyIGltcGxlbWVudGF0aW9uCisgKgorICovCitUU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoKQorICA6IGhvc3RfKCIiKSwgcG9ydF8oMCksIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwgbGFzdEZhaWxUaW1lXygwKSwgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkgeworfQorCisvKioKKyAqIENvbnN0cnVjdG9yIGZvciBUU29ja2V0UG9vbCBzZXJ2ZXIKKyAqLworVFNvY2tldFBvb2xTZXJ2ZXI6OlRTb2NrZXRQb29sU2VydmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpCisgIDogaG9zdF8oaG9zdCksCisgICAgcG9ydF8ocG9ydCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGxhc3RGYWlsVGltZV8oMCksCisgICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkgeworfQorCisvKioKKyAqIFRTb2NrZXRQb29sIGltcGxlbWVudGF0aW9uLgorICoKKyAqLworCitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woKQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7Cit9CisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c3RyaW5nPiYgaG9zdHMsIGNvbnN0IHZlY3RvcjxpbnQ+JiBwb3J0cykKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgeworICBpZiAoaG9zdHMuc2l6ZSgpICE9IHBvcnRzLnNpemUoKSkgeworICAgIEdsb2JhbE91dHB1dCgiVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sOiBob3N0cy5zaXplICE9IHBvcnRzLnNpemUiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKyAgfQorCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgaG9zdHMuc2l6ZSgpOyArK2kpIHsKKyAgICBhZGRTZXJ2ZXIoaG9zdHNbaV0sIHBvcnRzW2ldKTsKKyAgfQorfQorCitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPHBhaXI8c3RyaW5nLCBpbnQ+ID4mIHNlcnZlcnMpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNlcnZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBhZGRTZXJ2ZXIoc2VydmVyc1tpXS5maXJzdCwgc2VydmVyc1tpXS5zZWNvbmQpOworICB9Cit9CisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykKKyAgOiBUU29ja2V0KCksCisgICAgc2VydmVyc18oc2VydmVycyksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgeworfQorCitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgeworICBhZGRTZXJ2ZXIoaG9zdCwgcG9ydCk7Cit9CisKK1RTb2NrZXRQb29sOjp+VFNvY2tldFBvb2woKSB7CisgIHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gc2VydmVyc18uYmVnaW4oKTsKKyAgdmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJFbmQgPSBzZXJ2ZXJzXy5lbmQoKTsKKyAgZm9yICg7IGl0ZXIgIT0gaXRlckVuZDsgKytpdGVyKSB7CisgICAgc2V0Q3VycmVudFNlcnZlcigqaXRlcik7CisgICAgVFNvY2tldFBvb2w6OmNsb3NlKCk7CisgIH0KK30KKwordm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIHsKKyAgc2VydmVyc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+KG5ldyBUU29ja2V0UG9vbFNlcnZlcihob3N0LCBwb3J0KSkpOworfQorCit2b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcikgeworICBpZiAoc2VydmVyKSB7CisgICAgc2VydmVyc18ucHVzaF9iYWNrKHNlcnZlcik7CisgIH0KK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0U2VydmVycyhjb25zdCB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgeworICBzZXJ2ZXJzXyA9IHNlcnZlcnM7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OmdldFNlcnZlcnModmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKKyAgc2VydmVycyA9IHNlcnZlcnNfOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKSB7CisgIG51bVJldHJpZXNfID0gbnVtUmV0cmllczsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0UmV0cnlJbnRlcnZhbChpbnQgcmV0cnlJbnRlcnZhbCkgeworICByZXRyeUludGVydmFsXyA9IHJldHJ5SW50ZXJ2YWw7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXMpIHsKKyAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRSYW5kb21pemUoYm9vbCByYW5kb21pemUpIHsKKyAgcmFuZG9taXplXyA9IHJhbmRvbWl6ZTsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0QWx3YXlzVHJ5TGFzdChib29sIGFsd2F5c1RyeUxhc3QpIHsKKyAgYWx3YXlzVHJ5TGFzdF8gPSBhbHdheXNUcnlMYXN0OworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRDdXJyZW50U2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKKyAgY3VycmVudFNlcnZlcl8gPSBzZXJ2ZXI7CisgIGhvc3RfID0gc2VydmVyLT5ob3N0XzsKKyAgcG9ydF8gPSBzZXJ2ZXItPnBvcnRfOworICBzb2NrZXRfID0gc2VydmVyLT5zb2NrZXRfOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBzb2NrZXQgb3BlbiBmYWlscy4gV2hlbiBzb2NrZXQKKyAqIG9wZW5zIGZhaWxzLCB0aGUgc29ja2V0IGluIHRoZSBjdXJyZW50IHNlcnZlciBpcyByZXNldC4KKyAqLworLyogVE9ETzogd2l0aG91dCBhcGMgd2UgaWdub3JlIGEgbG90IG9mIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgcGhwIHZlcnNpb24gKi8KK3ZvaWQgVFNvY2tldFBvb2w6Om9wZW4oKSB7CisKKyAgc2l6ZV90IG51bVNlcnZlcnMgPSBzZXJ2ZXJzXy5zaXplKCk7CisgIGlmIChudW1TZXJ2ZXJzID09IDApIHsKKyAgICBzb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisKKyAgaWYgKGlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHJhbmRvbWl6ZV8gJiYgbnVtU2VydmVycyA+IDEpIHsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMCisgICAgc3RkOjpyYW5kb21fZGV2aWNlIHJuZzsKKyAgICBzdGQ6Om10MTk5MzcgdXJuZyhybmcoKSk7CisgICAgc3RkOjpzaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpLCB1cm5nKTsKKyNlbHNlCisgICAgc3RkOjpyYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7CisjZW5kaWYKKyAgfQorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2VydmVyczsgKytpKSB7CisKKyAgICBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyID0gc2VydmVyc19baV07CisgICAgLy8gSW1wZXJzb25hdGUgdGhlIHNlcnZlciBzb2NrZXQKKyAgICBzZXRDdXJyZW50U2VydmVyKHNlcnZlcik7CisKKyAgICBpZiAoaXNPcGVuKCkpIHsKKyAgICAgIC8vIGFscmVhZHkgb3BlbiBtZWFucyB3ZSdyZSBkb25lCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCByZXRyeUludGVydmFsUGFzc2VkID0gKHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9PSAwKTsKKyAgICBib29sIGlzTGFzdFNlcnZlciA9IGFsd2F5c1RyeUxhc3RfID8gKGkgPT0gKG51bVNlcnZlcnMgLSAxKSkgOiBmYWxzZTsKKworICAgIGlmIChzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPiAwKSB7CisgICAgICAvLyBUaGUgc2VydmVyIHdhcyBtYXJrZWQgYXMgZG93biwgc28gY2hlY2sgaWYgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgdG8gcmV0cnkKKyAgICAgIHRpbWVfdCBlbGFwc2VkVGltZSA9IHRpbWUoTlVMTCkgLSBzZXJ2ZXItPmxhc3RGYWlsVGltZV87CisgICAgICBpZiAoZWxhcHNlZFRpbWUgPiByZXRyeUludGVydmFsXykgeworICAgICAgICByZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0cnlJbnRlcnZhbFBhc3NlZCB8fCBpc0xhc3RTZXJ2ZXIpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtUmV0cmllc187ICsraikgeworICAgICAgICB0cnkgeworICAgICAgICAgIFRTb2NrZXQ6Om9wZW4oKTsKKyAgICAgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiAmZSkgeworICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldFBvb2w6Om9wZW4gZmFpbGVkICIgKyBnZXRTb2NrZXRJbmZvKCkgKyAiOiAiICsgZS53aGF0KCk7CisgICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgICAgICBzb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBvdmVyIHRoZSBvcGVuZWQgc29ja2V0IHNvIHRoYXQgd2UgY2FuIGtlZXAgaXQgcGVyc2lzdGVudAorICAgICAgICBzZXJ2ZXItPnNvY2tldF8gPSBzb2NrZXRfOworICAgICAgICAvLyByZXNldCBsYXN0RmFpbFRpbWVfIGlzIHJlcXVpcmVkCisgICAgICAgIHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9IDA7CisgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICArK3NlcnZlci0+Y29uc2VjdXRpdmVGYWlsdXJlc187CisgICAgICBpZiAoc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXyA+IG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7CisgICAgICAgIC8vIE1hcmsgc2VydmVyIGFzIGRvd24KKyAgICAgICAgc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDA7CisgICAgICAgIHNlcnZlci0+bGFzdEZhaWxUaW1lXyA9IHRpbWUoTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6b3BlbjogYWxsIGNvbm5lY3Rpb25zIGZhaWxlZCIpOworICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6Y2xvc2UoKSB7CisgIFRTb2NrZXQ6OmNsb3NlKCk7CisgIGlmIChjdXJyZW50U2VydmVyXykgeworICAgIGN1cnJlbnRTZXJ2ZXJfLT5zb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICB9Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYxMDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8gMQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogQ2xhc3MgdG8gaG9sZCBzZXJ2ZXIgaW5mb3JtYXRpb24gZm9yIFRTb2NrZXRQb29sCisgKgorICovCitjbGFzcyBUU29ja2V0UG9vbFNlcnZlciB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIHNlcnZlciBpbmZvCisgICAqLworICBUU29ja2V0UG9vbFNlcnZlcigpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCisgICAqLworICBUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworCisgIC8vIEhvc3QgbmFtZQorICBzdGQ6OnN0cmluZyBob3N0XzsKKworICAvLyBQb3J0IHRvIGNvbm5lY3Qgb24KKyAgaW50IHBvcnRfOworCisgIC8vIFNvY2tldCBmb3IgdGhlIHNlcnZlcgorICBUSFJJRlRfU09DS0VUIHNvY2tldF87CisKKyAgLy8gTGFzdCB0aW1lIGNvbm5lY3RpbmcgdG8gdGhpcyBzZXJ2ZXIgZmFpbGVkCisgIHRpbWVfdCBsYXN0RmFpbFRpbWVfOworCisgIC8vIE51bWJlciBvZiBjb25zZWN1dGl2ZSB0aW1lcyBjb25uZWN0aW5nIHRvIHRoaXMgc2VydmVyIGZhaWxlZAorICBpbnQgY29uc2VjdXRpdmVGYWlsdXJlc187Cit9OworCisvKioKKyAqIFRDUCBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqLworY2xhc3MgVFNvY2tldFBvb2wgOiBwdWJsaWMgVFNvY2tldCB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqLworICBUU29ja2V0UG9vbCgpOworCisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gaG9zdHMgbGlzdCBvZiBob3N0IG5hbWVzCisgICAqIEBwYXJhbSBwb3J0cyBsaXN0IG9mIHBvcnQgbmFtZXMKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaG9zdHMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBvcnRzKTsKKworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHNlcnZlcnMgbGlzdCBvZiBwYWlycyBvZiBob3N0IG5hbWUgYW5kIHBvcnQKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50PiA+JiBzZXJ2ZXJzKTsKKworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHNlcnZlcnMgbGlzdCBvZiBUU29ja2V0UG9vbFNlcnZlcnMKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBob3N0IHNpbmdsZSBob3N0CisgICAqIEBwYXJhbSBwb3J0IHNpbmdsZSBwb3J0CisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgKi8KKyAgdmlydHVhbCB+VFNvY2tldFBvb2woKTsKKworICAvKioKKyAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCisgICAqLworICB2b2lkIGFkZFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICovCisgIHZvaWQgYWRkU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisKKyAgLyoqCisgICAqIFNldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCisgICAqLworICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKworICAvKioKKyAgICogR2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKKyAgICovCisgIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworCisgIC8qKgorICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgorICAgKi8KKyAgdm9pZCBzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKTsKKworICAvKioKKyAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KKyAgICovCisgIHZvaWQgc2V0UmV0cnlJbnRlcnZhbChpbnQgcmV0cnlJbnRlcnZhbCk7CisKKyAgLyoqCisgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KKyAgICovCisgIHZvaWQgc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcyk7CisKKyAgLyoqCisgICAqIFR1cm5zIHJhbmRvbWl6YXRpb24gaW4gY29ubmVjdCBvcmRlciBvbiBvciBvZmYuCisgICAqLworICB2b2lkIHNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSk7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCisgICAqLworICB2b2lkIHNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgorICAgKi8KKyAgdm9pZCBvcGVuKCk7CisKKyAgLyoKKyAgICogQ2xvc2VzIHRoZSBVTklYIHNvY2tldAorICAgKi8KKyAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOworCisgIC8qKiBMaXN0IG9mIHNlcnZlcnMgdG8gY29ubmVjdCB0byAqLworICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4gc2VydmVyc187CisKKyAgLyoqIEN1cnJlbnQgc2VydmVyICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CisKKyAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCisgIGludCBudW1SZXRyaWVzXzsKKworICAvKiogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KKyAgICogbWFya2VkIGFzIGRvd24uCisgICAqLworICB0aW1lX3QgcmV0cnlJbnRlcnZhbF87CisKKyAgLyoqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4gKi8KKyAgaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXNfOworCisgIC8qKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/ICovCisgIGJvb2wgcmFuZG9taXplXzsKKworICAvKiogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/ICovCisgIGJvb2wgYWx3YXlzVHJ5TGFzdF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDQyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSB0byBob2lzdCByZWFkQWxsIGltcGxlbWVudGF0aW9uIG91dCBvZiBUVHJhbnNwb3J0CisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgcmVhZEFsbChUcmFuc3BvcnRfJiB0cmFucywgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgaGF2ZSA9IDA7CisgIHVpbnQzMl90IGdldCA9IDA7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBnZXQgPSB0cmFucy5yZWFkKGJ1ZiArIGhhdmUsIGxlbiAtIGhhdmUpOworICAgIGlmIChnZXQgPD0gMCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIk5vIG1vcmUgZGF0YSB0byByZWFkLiIpOworICAgIH0KKyAgICBoYXZlICs9IGdldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCisvKioKKyAqIEdlbmVyaWMgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBvZiB0cmFuc3BvcnRpbmcgZGF0YS4gQSBUVHJhbnNwb3J0IG1heSBiZQorICogY2FwYWJsZSBvZiBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nLCBidXQgbm90IG5lY2Vzc2FyaWx5IGJvdGguCisgKgorICovCitjbGFzcyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIFZpcnR1YWwgZGVjb25zdHJ1Y3Rvci4KKyAgICovCisgIHZpcnR1YWwgflRUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAqLworICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAvKioKKyAgICogVGVzdHMgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcmVhZCBvciBpZiB0aGUgcmVtb3RlIHNpZGUgaXMKKyAgICogc3RpbGwgb3Blbi4gQnkgZGVmYXVsdCB0aGlzIGlzIHRydWUgd2hlbmV2ZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLAorICAgKiBidXQgaW1wbGVtZW50YXRpb25zIHNob3VsZCBhZGQgbG9naWMgdG8gdGVzdCBmb3IgdGhpcyBjb25kaXRpb24gd2hlcmUKKyAgICogcG9zc2libGUgKGkuZS4gb24gYSBzb2NrZXQpLgorICAgKiBUaGlzIGlzIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY2hlY2sgaWYgaXQgc2hvdWxkIGxpc3RlbiBmb3IgYW5vdGhlcgorICAgKiByZXF1ZXN0LgorICAgKi8KKyAgdmlydHVhbCBib29sIHBlZWsoKSB7IHJldHVybiBpc09wZW4oKTsgfQorCisgIC8qKgorICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9ucy4KKyAgICoKKyAgICogQHJldHVybiBib29sIFdoZXRoZXIgdGhlIHRyYW5zcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgb3BlbmluZyBmYWlsZWQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvcGVuKCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYXNlIFRUcmFuc3BvcnQuIik7CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbm5vdCBjbG9zZSBiYXNlIFRUcmFuc3BvcnQuIik7CisgIH0KKworICAvKioKKyAgICogQXR0ZW1wdCB0byByZWFkIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGludG8gdGhlIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZiAgUmVmZXJlbmNlIHRvIHRoZSBsb2NhdGlvbiB0byB3cml0ZSB0aGUgZGF0YQorICAgKiBAcGFyYW0gbGVuICBIb3cgbWFueSBieXRlcyB0byByZWFkCisgICAqIEByZXR1cm4gSG93IG1hbnkgYnl0ZXMgd2VyZSBhY3R1YWxseSByZWFkCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkX3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3QgcmVhZC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkcyB0aGUgZ2l2ZW4gYW1vdW50IG9mIGRhdGEgaW4gaXRzIGVudGlyZXR5IG5vIG1hdHRlciB3aGF0LgorICAgKgorICAgKiBAcGFyYW0gcyAgICAgUmVmZXJlbmNlIHRvIGxvY2F0aW9uIGZvciByZWFkIGRhdGEKKyAgICogQHBhcmFtIGxlbiAgIEhvdyBtYW55IGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBIb3cgbWFueSBieXRlcyByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIHNpemUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGluc3VmZmljaWVudCBkYXRhIHdhcyByZWFkCisgICAqLworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEFsbF92aXJ0KGJ1ZiwgbGVuKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJldHVybiBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0aGlzLCBidWYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gcmVhZCBpcyBjb21wbGV0ZWQuCisgICAqIFRoaXMgY2FuIGJlIG92ZXItcmlkZGVuIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uCisgICAqIGUuZy4gbG9nZ2luZyB0aGUgcmVxdWVzdCB0byBhIGZpbGUKKyAgICoKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpZiBhdmFpbGFibGUsIDAgb3RoZXJ3aXNlLgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRW5kKCkgeworICAgIC8vIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRvIG5vdGhpbmcKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIHN0cmluZyBpbiBpdHMgZW50aXJldHkgdG8gdGhlIGJ1ZmZlci4KKyAgICoKKyAgICogTm90ZTogWW91IG11c3QgY2FsbCBmbHVzaCgpIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuLAorICAgKiBhbmQgYXZhaWxhYmxlIHRvIGJlIHJlYWQgYmFjayBpbiB0aGUgZnV0dXJlLiAgRGVzdHJveWluZyBhIFRUcmFuc3BvcnQKKyAgICogb2JqZWN0IGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZmx1c2ggcGVuZGluZyBkYXRhLS1pZiB5b3UgZGVzdHJveSBhCisgICAqIFRUcmFuc3BvcnQgb2JqZWN0IHdpdGggd3JpdHRlbiBidXQgdW5mbHVzaGVkIGRhdGEsIHRoYXQgZGF0YSBtYXkgYmUKKyAgICogZGlzY2FyZGVkLgorICAgKgorICAgKiBAcGFyYW0gYnVmICBUaGUgZGF0YSB0byB3cml0ZSBvdXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgd3JpdGVfdmlydChidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCB3cml0ZS4iKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZWQuCisgICAqIFRoaXMgY2FuIGJlIG92ZXItcmlkZGVuIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uCisgICAqIGF0IHRoZSBlbmQgb2YgYSByZXF1ZXN0LgorICAgKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVFbmQoKSB7CisgICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZworICAgIHJldHVybiAwOworICB9CisKKyAgLyoqCisgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCisgICAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2aXJ0dWFsIHZvaWQgZmx1c2goKSB7CisgICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZworICB9CisKKyAgLyoqCisgICAqIEF0dGVtcHRzIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gXGMgbGVuIGJ5dGVzLCBwb3NzaWJseSBjb3BpZWQgaW50byBcYyBidWYuCisgICAqIERvZXMgbm90IGNvbnN1bWUgdGhlIGJ5dGVzIHJlYWQgKGkuZS46IGEgbGF0ZXIgcmVhZCB3aWxsIHJldHVybiB0aGUgc2FtZQorICAgKiBkYXRhKS4gIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIHN1cHBvcnQgcHJvdG9jb2xzIHRoYXQgbmVlZCB0byByZWFkCisgICAqIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuICBUaGV5IGNhbiBhdHRlbXB0IHRvIGJvcnJvdyB0aGUgbWF4aW11bSBhbW91bnQgb2YKKyAgICogZGF0YSB0aGF0IHRoZXkgd2lsbCBuZWVkLCB0aGVuIGNvbnN1bWUgKHNlZSBuZXh0IG1ldGhvZCkgd2hhdCB0aGV5CisgICAqIGFjdHVhbGx5IHVzZS4gIFNvbWUgdHJhbnNwb3J0cyB3aWxsIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIGFuZCBvdGhlcnMKKyAgICogd2lsbCBmYWlsIG9jY2FzaW9uYWxseSwgc28gcHJvdG9jb2xzIG11c3QgYmUgcHJlcGFyZWQgdG8gdXNlIHJlYWQgaWYKKyAgICogYm9ycm93IGZhaWxzLgorICAgKgorICAgKiBAb2FyYW0gYnVmICBBIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSBjYW4gYmUgc3RvcmVkIGlmIG5lZWRlZC4KKyAgICogICAgICAgICAgICAgSWYgYm9ycm93IGRvZXNuJ3QgcmV0dXJuIGJ1ZiwgdGhlbiB0aGUgY29udGVudHMgb2YKKyAgICogICAgICAgICAgICAgYnVmIGFmdGVyIHRoZSBjYWxsIGFyZSB1bmRlZmluZWQuICBUaGlzIHBhcmFtZXRlciBtYXkgYmUKKyAgICogICAgICAgICAgICAgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IHN1cHBseWluZyBzdG9yYWdlLAorICAgKiAgICAgICAgICAgICBidXQgd291bGQgbGlrZSBhIHBvaW50ZXIgaW50byBhbiBpbnRlcm5hbCBidWZmZXIsIGlmCisgICAqICAgICAgICAgICAgIGF2YWlsYWJsZS4KKyAgICogQHBhcmFtIGxlbiAgKmxlbiBzaG91bGQgaW5pdGlhbGx5IGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBib3Jyb3cuCisgICAqICAgICAgICAgICAgIElmIGJvcnJvdyBzdWNjZWVkcywgKmxlbiB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcworICAgKiAgICAgICAgICAgICBhdmFpbGFibGUgaW4gdGhlIHJldHVybmVkIHBvaW50ZXIuICBUaGlzIHdpbGwgYmUgYXQgbGVhc3QKKyAgICogICAgICAgICAgICAgd2hhdCB3YXMgcmVxdWVzdGVkLCBidXQgbWF5IGJlIG1vcmUgaWYgYm9ycm93IHJldHVybnMKKyAgICogICAgICAgICAgICAgYSBwb2ludGVyIHRvIGFuIGludGVybmFsIGJ1ZmZlciwgcmF0aGVyIHRoYW4gYnVmLgorICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZmFpbHMsIHRoZSBjb250ZW50cyBvZiAqbGVuIGFyZSB1bmRlZmluZWQuCisgICAqIEByZXR1cm4gSWYgdGhlIGJvcnJvdyBzdWNjZWVkcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYm9ycm93ZWQgZGF0YS4KKyAgICogICAgICAgICBUaGlzIG1pZ2h0IGJlIGVxdWFsIHRvIFxjIGJ1Ziwgb3IgaXQgbWlnaHQgYmUgYSBwb2ludGVyIGludG8KKyAgICogICAgICAgICB0aGUgdHJhbnNwb3J0J3MgaW50ZXJuYWwgYnVmZmVycy4KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIGJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgeyByZXR1cm4gTlVMTDsgfQorCisgIC8qKgorICAgKiBSZW1vdmUgbGVuIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydC4gIFRoaXMgc2hvdWxkIGFsd2F5cyBmb2xsb3cgYSBib3Jyb3cKKyAgICogb2YgYXQgbGVhc3QgbGVuIGJ5dGVzLCBhbmQgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLgorICAgKiBUT0RPKGRyZWlzcyk6IElzIHRoZXJlIGFueSB0cmFuc3BvcnQgdGhhdCBjb3VsZCBib3Jyb3cgYnV0IGZhaWwgdG8KKyAgICogY29uc3VtZSwgb3IgdGhhdCB3b3VsZCByZXF1aXJlIGEgYnVmZmVyIHRvIGR1bXAgdGhlIGNvbnN1bWVkIGRhdGE/CisgICAqCisgICAqIEBwYXJhbSBsZW4gIEhvdyBtYW55IGJ5dGVzIHRvIGNvbnN1bWUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgY29uc3VtZV92aXJ0KGxlbik7CisgIH0KKyAgdmlydHVhbCB2b2lkIGNvbnN1bWVfdmlydCh1aW50MzJfdCAvKiBsZW4gKi8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCBjb25zdW1lLiIpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG9yaWdpbiBvZiB0aGUgdHJhbnNwb3J0cyBjYWxsLiBUaGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUKKyAgICogdHJhbnNwb3J0IHVzZWQuIEFuIElQIGJhc2VkIHRyYW5zcG9ydCBmb3IgZXhhbXBsZSB3aWxsIHJldHVybiB0aGUKKyAgICogSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50IG1ha2luZyB0aGUgcmVxdWVzdC4KKyAgICogSWYgdGhlIHRyYW5zcG9ydCBkb2Vzbid0IGtub3cgdGhlIG9yaWdpbiBVbmtub3duIGlzIHJldHVybmVkLgorICAgKgorICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSBmb3IgZXhhbXBsZQorICAgKi8KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiAiVW5rbm93biI7IH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogU2ltcGxlIGNvbnN0cnVjdG9yLgorICAgKi8KKyAgVFRyYW5zcG9ydCgpIHt9Cit9OworCisvKioKKyAqIEdlbmVyaWMgZmFjdG9yeSBjbGFzcyB0byBtYWtlIGFuIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0IG91dCBvZiBhCisgKiBzb3VyY2UgdHJhbnNwb3J0LiBDb21tb25seSB1c2VkIGluc2lkZSBzZXJ2ZXJzIHRvIG1ha2UgaW5wdXQgYW5kIG91dHB1dAorICogc3RyZWFtcyBvdXQgb2YgcmF3IGNsaWVudHMuCisgKgorICovCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5UVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gdHJhbnM7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNzMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NvbnN0IGNoYXIqIFRUcmFuc3BvcnRFeGNlcHRpb246OndoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CisgICAgc3dpdGNoICh0eXBlXykgeworICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogVW5rbm93biB0cmFuc3BvcnQgZXhjZXB0aW9uIjsKKyAgICBjYXNlIE5PVF9PUEVOOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgbm90IG9wZW4iOworICAgIGNhc2UgVElNRURfT1VUOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUaW1lZCBvdXQiOworICAgIGNhc2UgRU5EX09GX0ZJTEU6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEVuZCBvZiBmaWxlIjsKKyAgICBjYXNlIElOVEVSUlVQVEVEOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnRlcnJ1cHRlZCI7CisgICAgY2FzZSBCQURfQVJHUzoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW52YWxpZCBhcmd1bWVudHMiOworICAgIGNhc2UgQ09SUlVQVEVEX0RBVEE6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IENvcnJ1cHRlZCBEYXRhIjsKKyAgICBjYXNlIElOVEVSTkFMX0VSUk9SOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnRlcm5hbCBlcnJvciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjVmMDBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8gMQorCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2Nhc3QuaHBwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBDbGFzcyB0byBlbmNhcHN1bGF0ZSBhbGwgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIHRyYW5zcG9ydCBlcnJvcnMgdGhhdCBtYXkKKyAqIG9jY3VyIGluIHZhcmlvdXMgdHJhbnNwb3J0IHN5c3RlbXMuIFRoaXMgcHJvdmlkZXMgYSBzb3J0IG9mIGdlbmVyaWMKKyAqIHdyYXBwZXIgYXJvdW5kIHRoZSB2YWd1ZSBVTklYIEVfIGVycm9yIGNvZGVzIHRoYXQgbGV0cyBhIGNvbW1vbiBjb2RlCisgKiBiYXNlIG9mIGVycm9yIGhhbmRsaW5nIHRvIGJlIHVzZWQgZm9yIHZhcmlvdXMgdHlwZXMgb2YgdHJhbnNwb3J0cywgaS5lLgorICogcGlwZXMgZXRjLgorICoKKyAqLworY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgeworICAgIFVOS05PV04gPSAwLAorICAgIE5PVF9PUEVOID0gMSwKKyAgICBUSU1FRF9PVVQgPSAyLAorICAgIEVORF9PRl9GSUxFID0gMywKKyAgICBJTlRFUlJVUFRFRCA9IDQsCisgICAgQkFEX0FSR1MgPSA1LAorICAgIENPUlJVUFRFRF9EQVRBID0gNiwKKyAgICBJTlRFUk5BTF9FUlJPUiA9IDcKKyAgfTsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uKCkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQorCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8oVU5LTk9XTikge30KKworICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLCB0eXBlXyh0eXBlKSB7fQorCisgIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgorICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KKyAgICoKKyAgICogQHJldHVybiBFcnJvciBjb2RlCisgICAqLworICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gdHlwZV87IH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdDsKKworcHJvdGVjdGVkOgorICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KKyAgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7CisKKyAgLyoqIEVycm9yIGNvZGUgKi8KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZV87Cit9OworCisvKioKKyAqIExlZ2FjeSBjb2RlIGluIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBvdmVyZmxvdyBpc3N1ZXMKKyAqIHRoYXQgbmVlZCB0byBiZSBlbmZvcmNlZC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBUbyBzYWZlX251bWVyaWNfY2FzdChGcm9tIGkpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gYm9vc3Q6Om51bWVyaWNfY2FzdDxUbz4oaSk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2Nhc3QmIGJjKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjLndoYXQoKSk7CisgIH0KK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQ3Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1aW50MzJfdCBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgbmVlZCA9IGxlbjsKKworICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHlldAorICBpZiAockxlbl8gLSByUG9zXyA8IG5lZWQpIHsKKyAgICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlCisgICAgaWYgKHJMZW5fIC0gclBvc18gPiAwKSB7CisgICAgICBtZW1jcHkoYnVmLCByQnVmXyArIHJQb3NfLCByTGVuXyAtIHJQb3NfKTsKKyAgICAgIG5lZWQgLT0gckxlbl8gLSByUG9zXzsKKyAgICAgIGJ1ZiArPSByTGVuXyAtIHJQb3NfOworICAgICAgclBvc18gPSByTGVuXzsKKyAgICB9CisKKyAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKKyAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7CisgICAgICByQnVmU2l6ZV8gKj0gMjsKKyAgICAgIHVpbnQ4X3QgKnRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgICAgckJ1Zl8gPSB0bXBCdWY7CisgICAgfQorCisgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgorICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXyArIHJQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7CisgIH0KKworICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZQorICB1aW50MzJfdCBnaXZlID0gbmVlZDsKKyAgaWYgKHJMZW5fIC0gclBvc18gPCBnaXZlKSB7CisgICAgZ2l2ZSA9IHJMZW5fIC0gclBvc187CisgIH0KKyAgaWYgKGdpdmUgPiAwKSB7CisgICAgbWVtY3B5KGJ1ZiwgckJ1Zl8gKyByUG9zXywgZ2l2ZSk7CisgICAgclBvc18gKz0gZ2l2ZTsKKyAgICBuZWVkIC09IGdpdmU7CisgIH0KKworICByZXR1cm4gKGxlbiAtIG5lZWQpOworfQorCit2b2lkIFRQaXBlZFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gTWFrZSB0aGUgYnVmZmVyIGFzIGJpZyBhcyBpdCBuZWVkcyB0byBiZQorICBpZiAoKGxlbiArIHdMZW5fKSA+PSB3QnVmU2l6ZV8pIHsKKyAgICB1aW50MzJfdCBuZXdCdWZTaXplID0gd0J1ZlNpemVfICogMjsKKyAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7CisgICAgICBuZXdCdWZTaXplICo9IDI7CisgICAgfQorICAgIHVpbnQ4X3QgKnRtcEJ1Zj0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyh3QnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogbmV3QnVmU2l6ZSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICB3QnVmXyA9IHRtcEJ1ZjsKKworICAgIHdCdWZTaXplXyA9IG5ld0J1ZlNpemU7CisgIH0KKworICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlcgorICBtZW1jcHkod0J1Zl8gKyB3TGVuXywgYnVmLCBsZW4pOworICB3TGVuXyArPSBsZW47Cit9CisKK3ZvaWQgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlcgorICBpZiAod0xlbl8gPiAwKSB7CisgICAgc3JjVHJhbnNfLT53cml0ZSh3QnVmXywgd0xlbl8pOworICAgIHdMZW5fID0gMDsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICBzcmNUcmFuc18tPmZsdXNoKCk7Cit9CisKK1RQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OlRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgIDogVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFucyksIHNyY1RyYW5zXyhzcmNUcmFucykgeworfQorCitUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpIHsKK30KKworYm9vbCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojppc09wZW4oKSB7CisgIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OmlzT3BlbigpOworfQorCitib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnBlZWsoKSB7CisgIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnBlZWsoKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpvcGVuKCkgeworICBUUGlwZWRUcmFuc3BvcnQ6Om9wZW4oKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpjbG9zZSgpIHsKKyAgVFBpcGVkVHJhbnNwb3J0OjpjbG9zZSgpOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQoYnVmLCBsZW4pOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpyZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGhhdmUgPSAwOworICB1aW50MzJfdCBnZXQgPSAwOworCisgIHdoaWxlIChoYXZlIDwgbGVuKSB7CisgICAgZ2V0ID0gcmVhZChidWYgKyBoYXZlLCBsZW4gLSBoYXZlKTsKKyAgICBpZiAoZ2V0IDw9IDApIHsKKyAgICAgIHRocm93IFRFT0ZFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaGF2ZSArPSBnZXQ7CisgIH0KKworICByZXR1cm4gaGF2ZTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cmVhZEVuZCgpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIFRQaXBlZFRyYW5zcG9ydDo6d3JpdGUoYnVmLCBsZW4pOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp3cml0ZUVuZCgpIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6d3JpdGVFbmQoKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpOworfQorCitpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmdldFJlYWRUaW1lb3V0KCkgeworICByZXR1cm4gc3JjVHJhbnNfLT5nZXRSZWFkVGltZW91dCgpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpIHsKKyAgc3JjVHJhbnNfLT5zZXRSZWFkVGltZW91dChyZWFkVGltZW91dCk7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIHsKKyAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0TnVtQ2h1bmtzKCk7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmdldEN1ckNodW5rKCkgeworICByZXR1cm4gc3JjVHJhbnNfLT5nZXRDdXJDaHVuaygpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspIHsKKyAgc3JjVHJhbnNfLT5zZWVrVG9DaHVuayhjaHVuayk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2Vla1RvRW5kKCkgeworICBzcmNUcmFuc18tPnNlZWtUb0VuZCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8gMQorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisvLyBJbmNsdWRlIHRoZSBidWZmZXJlZCB0cmFuc3BvcnRzIHRoYXQgdXNlZCB0byBiZSBkZWZpbmVkIGhlcmUuCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFRoZSBudWxsIHRyYW5zcG9ydCBpcyBhIGR1bW15IHRyYW5zcG9ydCB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuCisgKiBJdCdzIHNvcnQgb2YgYW4gYW5hbG9neSB0byAvZGV2L251bGwsIHlvdSBjYW4gbmV2ZXIgcmVhZCBhbnl0aGluZyBmcm9tIGl0CisgKiBhbmQgaXQgd2lsbCBsZXQgeW91IHdyaXRlIGFueXRoaW5nIHlvdSB3YW50IHRvIGl0LCB0aG91Z2ggaXQgd29uJ3QgYWN0dWFsbHkKKyAqIGdvIGFueXdoZXJlLgorICoKKyAqLworY2xhc3MgVE51bGxUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VE51bGxUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgVE51bGxUcmFuc3BvcnQoKSB7fQorCisgIH5UTnVsbFRyYW5zcG9ydCgpIHt9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBvcGVuKCkge30KKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7IHJldHVybjsgfQorfTsKKworLyoqCisgKiBUUGlwZWRUcmFuc3BvcnQuIFRoaXMgdHJhbnNwb3J0IGFsbG93cyBwaXBpbmcgb2YgYSByZXF1ZXN0IGZyb20gb25lCisgKiB0cmFuc3BvcnQgdG8gYW5vdGhlciBlaXRoZXIgd2hlbiByZWFkRW5kKCkgb3Igd3JpdGVFbmQoKS4gVGhlIHR5cGljYWwKKyAqIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIGxvZyBhIHJlcXVlc3Qgb3IgYSByZXBseSB0byBkaXNrLgorICogVGhlIHVuZGVybHlpbmcgYnVmZmVyIGV4cGFuZHMgdG8gYSBrZWVwIGEgY29weSBvZiB0aGUgZW50aXJlCisgKiByZXF1ZXN0L3Jlc3BvbnNlLgorICoKKyAqLworY2xhc3MgVFBpcGVkVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICA6IHNyY1RyYW5zXyhzcmNUcmFucyksCisgICAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAorICAgICAgckJ1ZlNpemVfKDUxMiksCisgICAgICByUG9zXygwKSwKKyAgICAgIHJMZW5fKDApLAorICAgICAgd0J1ZlNpemVfKDUxMiksCisgICAgICB3TGVuXygwKSB7CisKKyAgICAvLyBkZWZhdWx0IGlzIHRvIHRvIHBpcGUgdGhlIHJlcXVlc3Qgd2hlbiByZWFkRW5kKCkgaXMgY2FsbGVkCisgICAgcGlwZU9uUmVhZF8gPSB0cnVlOworICAgIHBpcGVPbldyaXRlXyA9IGZhbHNlOworCisgICAgckJ1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICBpZiAockJ1Zl8gPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgICAgd0J1Zl8gPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKKyAgICBpZiAod0J1Zl8gPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgIH0KKworICBUUGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zLAorICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3opCisgICAgOiBzcmNUcmFuc18oc3JjVHJhbnMpLAorICAgICAgZHN0VHJhbnNfKGRzdFRyYW5zKSwKKyAgICAgIHJCdWZTaXplXyg1MTIpLAorICAgICAgclBvc18oMCksCisgICAgICByTGVuXygwKSwKKyAgICAgIHdCdWZTaXplXyhzeiksCisgICAgICB3TGVuXygwKSB7CisKKyAgICByQnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOworICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgfQorCisgIH5UUGlwZWRUcmFuc3BvcnQoKSB7CisgICAgc3RkOjpmcmVlKHJCdWZfKTsKKyAgICBzdGQ6OmZyZWUod0J1Zl8pOworICB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiBzcmNUcmFuc18tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeworICAgIGlmIChyUG9zXyA+PSByTGVuXykgeworICAgICAgLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiBpdCBpcyBmdWxsCisgICAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7CisgICAgICAgIHJCdWZTaXplXyAqPSAyOworICAgICAgICB1aW50OF90ICogdG1wQnVmID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKwlpZiAodG1wQnVmID09IE5VTEwpIHsKKwkgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisJfQorCXJCdWZfID0gdG1wQnVmOworICAgICAgfQorCisgICAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCisgICAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8gKyByUG9zXywgckJ1ZlNpemVfIC0gclBvc18pOworICAgIH0KKyAgICByZXR1cm4gKHJMZW5fID4gclBvc18pOworICB9CisKKyAgdm9pZCBvcGVuKCkgeyBzcmNUcmFuc18tPm9wZW4oKTsgfQorCisgIHZvaWQgY2xvc2UoKSB7IHNyY1RyYW5zXy0+Y2xvc2UoKTsgfQorCisgIHZvaWQgc2V0UGlwZU9uUmVhZChib29sIHBpcGVWYWwpIHsgcGlwZU9uUmVhZF8gPSBwaXBlVmFsOyB9CisKKyAgdm9pZCBzZXRQaXBlT25Xcml0ZShib29sIHBpcGVWYWwpIHsgcGlwZU9uV3JpdGVfID0gcGlwZVZhbDsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHVpbnQzMl90IHJlYWRFbmQoKSB7CisKKyAgICBpZiAocGlwZU9uUmVhZF8pIHsKKyAgICAgIGRzdFRyYW5zXy0+d3JpdGUockJ1Zl8sIHJQb3NfKTsKKyAgICAgIGRzdFRyYW5zXy0+Zmx1c2goKTsKKyAgICB9CisKKyAgICBzcmNUcmFuc18tPnJlYWRFbmQoKTsKKworICAgIC8vIElmIHJlcXVlc3RzIGFyZSBiZWluZyBwaXBlbGluZWQsIGNvcHkgZG93biBvdXIgcmVhZC1haGVhZCBkYXRhLAorICAgIC8vIHRoZW4gcmVzZXQgb3VyIHN0YXRlLgorICAgIGludCByZWFkX2FoZWFkID0gckxlbl8gLSByUG9zXzsKKyAgICB1aW50MzJfdCBieXRlcyA9IHJQb3NfOworICAgIG1lbWNweShyQnVmXywgckJ1Zl8gKyByUG9zXywgcmVhZF9haGVhZCk7CisgICAgclBvc18gPSAwOworICAgIHJMZW5fID0gcmVhZF9haGVhZDsKKworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHVpbnQzMl90IHdyaXRlRW5kKCkgeworICAgIGlmIChwaXBlT25Xcml0ZV8pIHsKKyAgICAgIGRzdFRyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKKyAgICAgIGRzdFRyYW5zXy0+Zmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIHdMZW5fOworICB9CisKKyAgdm9pZCBmbHVzaCgpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUYXJnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBkc3RUcmFuc187IH0KKworICAvKgorICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KKyAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKKyAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnNfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOworCisgIHVpbnQ4X3QqIHJCdWZfOworICB1aW50MzJfdCByQnVmU2l6ZV87CisgIHVpbnQzMl90IHJQb3NfOworICB1aW50MzJfdCByTGVuXzsKKworICB1aW50OF90KiB3QnVmXzsKKyAgdWludDMyX3Qgd0J1ZlNpemVfOworICB1aW50MzJfdCB3TGVuXzsKKworICBib29sIHBpcGVPblJlYWRfOworICBib29sIHBpcGVPbldyaXRlXzsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIHBpcGVkVHJhbnNwb3J0IGluc3RhbmNlLgorICoKKyAqLworY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgeworICAgIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoZHN0VHJhbnMpOworICB9CisgIHZpcnR1YWwgflRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBXcmFwcyB0aGUgYmFzZSB0cmFuc3BvcnQgaW50byBhIHBpcGVkIHRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgICAgaWYgKGRzdFRyYW5zXy5nZXQoKSA9PSBOVUxMKSB7CisgICAgICBkc3RUcmFuc18gPSBkc3RUcmFuczsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVGFyZ2V0IHRyYW5zcG9ydCBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKK307CisKKy8qKgorICogVFBpcGVkRmlsZVRyYW5zcG9ydC4gVGhpcyBpcyBqdXN0IGxpa2UgYSBUVHJhbnNwb3J0LCBleGNlcHQgdGhhdAorICogaXQgaXMgYSB0ZW1wbGF0aXplZCBjbGFzcywgc28gdGhhdCBjbGllbnRzIHdobyByZWx5IG9uIGEgc3BlY2lmaWMKKyAqIFRUcmFuc3BvcnQgY2FuIHN0aWxsIGFjY2VzcyB0aGUgb3JpZ2luYWwgdHJhbnNwb3J0LgorICoKKyAqLworY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCA6IHB1YmxpYyBUUGlwZWRUcmFuc3BvcnQsIHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOworCisgIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7CisKKyAgLy8gVFRyYW5zcG9ydCBmdW5jdGlvbnMKKyAgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBwZWVrKCk7CisgIHZvaWQgb3BlbigpOworICB2b2lkIGNsb3NlKCk7CisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZEVuZCgpOworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3Qgd3JpdGVFbmQoKTsKKyAgdm9pZCBmbHVzaCgpOworCisgIC8vIFRGaWxlUmVhZGVyVHJhbnNwb3J0IGZ1bmN0aW9ucworICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCk7CisgIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCk7CisgIHVpbnQzMl90IGdldE51bUNodW5rcygpOworICB1aW50MzJfdCBnZXRDdXJDaHVuaygpOworICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOworICB2b2lkIHNlZWtUb0VuZCgpOworCisgIC8qCisgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgorICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAorICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KKworcHJvdGVjdGVkOgorICAvLyBzaG91bGRuJ3QgYmUgdXNlZAorICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCBmcm9tIGEgZmlsZXBhdGggYW5kIGEgZGVzdGluYXRpb24gdHJhbnNwb3J0CisgKgorICovCitjbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgICAgOiBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGRzdFRyYW5zKSB7fQorICB2aXJ0dWFsIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHBGaWxlUmVhZGVyVHJhbnNwb3J0CisgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOworICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4oKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGdldEZpbGVSZWFkZXJUcmFuc3BvcnQoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4oCisgICAgICAgIG5ldyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FjZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBUVHJhbnNwb3J0IG1ldGhvZHMuCisgKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiByZWFkKCksIHJlYWRBbGwoKSwgd3JpdGUoKSwKKyAqIGJvcnJvdygpIGFuZCBjb25zdW1lKCkuCisgKgorICogSW4gdGhlIFRUcmFuc3BvcnQgYmFzZSBjbGFzcywgZWFjaCBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSBpbnZva2VzIGl0cworICogdmlydHVhbCBjb3VudGVycGFydC4gIFRoaXMgY2xhc3Mgb3ZlcnJpZGVzIHRoZW0gdG8gYWx3YXlzIHBlcmZvcm0gdGhlCisgKiBkZWZhdWx0IGJlaGF2aW9yLCB3aXRob3V0IGEgdmlydHVhbCBmdW5jdGlvbiBjYWxsLgorICoKKyAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBzZXJ2ZSBhcyBhIGJhc2UgY2xhc3MgZm9yCisgKiBUVmlydHVhbFRyYW5zcG9ydCwgYW5kIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIG9uZSBvZiBpdHMgc3ViY2xhc3NlcworICogZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcy4gIChTaW5jZQorICogVFZpcnR1YWxUcmFuc3BvcnQ6OnJlYWRfdmlydCgpIGNhbGxzIHJlYWQoKSwgYW5kIFRUcmFuc3BvcnQ6OnJlYWQoKSBjYWxscworICogcmVhZF92aXJ0KCkuKQorICovCitjbGFzcyBUVHJhbnNwb3J0RGVmYXVsdHMgOiBwdWJsaWMgVFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIC8qCisgICAqIFRUcmFuc3BvcnQgKl92aXJ0KCkgbWV0aG9kcyBwcm92aWRlIHJlYXNvbmFibGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuCisgICAqIEludm9rZSB0aGVtIG5vbi12aXJ0dWFsbHkuCisgICAqLworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkX3ZpcnQoYnVmLCBsZW4pOyB9CisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OnJlYWRBbGxfdmlydChidWYsIGxlbik7IH0KKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT5UVHJhbnNwb3J0Ojp3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsgfQorICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OmJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKKyAgfQorICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7IHRoaXMtPlRUcmFuc3BvcnQ6OmNvbnN1bWVfdmlydChsZW4pOyB9CisKK3Byb3RlY3RlZDoKKyAgVFRyYW5zcG9ydERlZmF1bHRzKCkge30KK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHByb3ZpZGUgcG9seW1vcnBoaXNtIGZvciBzdWJjbGFzc2VzIG9mIFRUcmFuc3BvcnQuCisgKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzICpfdmlydCgpIG1ldGhvZHMgb2YgVFRyYW5zcG9ydCwgdG8gY2FsbCB0aGUKKyAqIG5vbi12aXJ0dWFsIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgcHJvcGVyIHN1YmNsYXNzLgorICoKKyAqIFRvIGRlZmluZSB5b3VyIG93biB0cmFuc3BvcnQgY2xhc3MgdXNpbmcgVFZpcnR1YWxUcmFuc3BvcnQ6CisgKiAxKSBEZXJpdmUgeW91ciBzdWJjbGFzcyBmcm9tIFRWaXJ0dWFsVHJhbnNwb3J0PHlvdXIgY2xhc3M+CisgKiAgICBlLmc6ICBjbGFzcyBNeVRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxNeVRyYW5zcG9ydD4geworICogMikgUHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbnMgb2YgcmVhZCgpLCByZWFkQWxsKCksIGV0Yy4KKyAqICAgIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIG5vbi12aXJ0dWFsLgorICoKKyAqIFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBuZWVkIHRvIHVzZSB2aXJ0dWFsIGluaGVyaXRhbmNlIHdoZW4KKyAqIGluaGVyaXRpbmcgZnJvbSBUVHJhbnNwb3J0IGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQuCisgKgorICogQGF1dGhvciBDaGFkIFdhbHRlcnMgPGNoYWRAcG93ZXJzZXQuY29tPgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgU3VwZXJfID0gVFRyYW5zcG9ydERlZmF1bHRzPgorY2xhc3MgVFZpcnR1YWxUcmFuc3BvcnQgOiBwdWJsaWMgU3VwZXJfIHsKK3B1YmxpYzoKKyAgLyoKKyAgICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSAqX3ZpcnQoKSBmdW5jdGlvbnMsIHRvIGNhbGwgdGhlIHN1YmNsYXNzJ3MKKyAgICogbm9uLXZpcnR1YWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb24uCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPnJlYWQoYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5yZWFkQWxsKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT53cml0ZShidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPmJvcnJvdyhidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IGxlbikgeyBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPmNvbnN1bWUobGVuKTsgfQorCisgIC8qCisgICAqIFByb3ZpZGUgYSBkZWZhdWx0IHJlYWRBbGwoKSBpbXBsZW1lbnRhdGlvbiB0aGF0IGludm9rZXMKKyAgICogcmVhZCgpIG5vbi12aXJ0dWFsbHkuCisgICAqCisgICAqIE5vdGU6IHN1YmNsYXNzZXMgdGhhdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gZGVyaXZlIGZyb20gYW5vdGhlcgorICAgKiB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gKGkuZS4sIG5vdCBUVHJhbnNwb3J0RGVmYXVsdHMpIHNob3VsZCBiZXdhcmUgdGhhdAorICAgKiB0aGlzIG1heSBvdmVycmlkZSBhbnkgbm9uLWRlZmF1bHQgcmVhZEFsbCgpIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5CisgICAqIHRoZSBwYXJlbnQgdHJhbnNwb3J0IGNsYXNzLiAgVGhleSBtYXkgbmVlZCB0byByZWRlZmluZSByZWFkQWxsKCkgdG8gY2FsbAorICAgKiB0aGUgY29ycmVjdCBwYXJlbnQgaW1wbGVtZW50YXRpb24sIGlmIGRlc2lyZWQuCisgICAqLworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgVHJhbnNwb3J0XyogdHJhbnMgPSBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyk7CisgICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6cmVhZEFsbCgqdHJhbnMsIGJ1ZiwgbGVuKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFRWaXJ0dWFsVHJhbnNwb3J0KCkge30KKworICAvKgorICAgKiBUZW1wbGF0aXplZCBjb25zdHJ1Y3RvcnMsIHRvIGFsbG93IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIFN1cGVyXworICAgKiBjb25zdHJ1Y3Rvci4gIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgMCwgMSwgb3IgMiBhcmd1bWVudHMsIGJ1dAorICAgKiBhZGRpdGlvbmFsIHZlcnNpb25zIGNhbiBiZSBhZGRlZCBhcyBuZWVkZWQuCisgICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnXz4KKyAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnXyBjb25zdCYgYXJnKQorICAgIDogU3VwZXJfKGFyZykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMV8sIHR5cGVuYW1lIEFyZzJfPgorICBUVmlydHVhbFRyYW5zcG9ydChBcmcxXyBjb25zdCYgYTEsIEFyZzJfIGNvbnN0JiBhMikKKyAgICA6IFN1cGVyXyhhMSwgYTIpIHt9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjZkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmluaXRabGliKCkgeworICBpbnQgcnY7CisgIGJvb2wgcl9pbml0ID0gZmFsc2U7CisgIHRyeSB7CisgICAgcnN0cmVhbV8gPSBuZXcgel9zdHJlYW07CisgICAgd3N0cmVhbV8gPSBuZXcgel9zdHJlYW07CisKKyAgICByc3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOworICAgIHdzdHJlYW1fLT56YWxsb2MgPSBaX05VTEw7CisgICAgcnN0cmVhbV8tPnpmcmVlID0gWl9OVUxMOworICAgIHdzdHJlYW1fLT56ZnJlZSA9IFpfTlVMTDsKKyAgICByc3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOworICAgIHdzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7CisKKyAgICByc3RyZWFtXy0+bmV4dF9pbiA9IGNyYnVmXzsKKyAgICB3c3RyZWFtXy0+bmV4dF9pbiA9IHV3YnVmXzsKKyAgICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICAgIHJzdHJlYW1fLT5hdmFpbF9pbiA9IDA7CisgICAgd3N0cmVhbV8tPmF2YWlsX2luID0gMDsKKyAgICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CisgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworCisgICAgcnYgPSBpbmZsYXRlSW5pdChyc3RyZWFtXyk7CisgICAgY2hlY2tabGliUnYocnYsIHJzdHJlYW1fLT5tc2cpOworCisgICAgLy8gSGF2ZSB0byBzZXQgdGhpcyBmbGFnIHNvIHdlIGtub3cgd2hldGhlciB0byBkZS1pbml0aWFsaXplLgorICAgIHJfaW5pdCA9IHRydWU7CisKKyAgICBydiA9IGRlZmxhdGVJbml0KHdzdHJlYW1fLCBjb21wX2xldmVsXyk7CisgICAgY2hlY2tabGliUnYocnYsIHdzdHJlYW1fLT5tc2cpOworICB9CisKKyAgY2F0Y2ggKC4uLikgeworICAgIGlmIChyX2luaXQpIHsKKyAgICAgIHJ2ID0gaW5mbGF0ZUVuZChyc3RyZWFtXyk7CisgICAgICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHJzdHJlYW1fLT5tc2cpOworICAgIH0KKyAgICAvLyBUaGVyZSBpcyBubyB3YXkgd2UgY2FuIGdldCBoZXJlIGlmIHdzdHJlYW1fIHdhcyBpbml0aWFsaXplZC4KKworICAgIHRocm93OworICB9Cit9CisKK2lubGluZSB2b2lkIFRabGliVHJhbnNwb3J0OjpjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgIGlmIChzdGF0dXMgIT0gWl9PSykgeworICAgIHRocm93IFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKHN0YXR1cywgbWVzc2FnZSk7CisgIH0KK30KKworaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgIGlmIChzdGF0dXMgIT0gWl9PSykgeworICAgIHN0cmluZyBvdXRwdXQgPSAiVFpsaWJUcmFuc3BvcnQ6IHpsaWIgZmFpbHVyZSBpbiBkZXN0cnVjdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb246OmVycm9yTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UpOworICAgIEdsb2JhbE91dHB1dChvdXRwdXQuY19zdHIoKSk7CisgIH0KK30KKworVFpsaWJUcmFuc3BvcnQ6On5UWmxpYlRyYW5zcG9ydCgpIHsKKyAgaW50IHJ2OworICBydiA9IGluZmxhdGVFbmQocnN0cmVhbV8pOworICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHJzdHJlYW1fLT5tc2cpOworCisgIHJ2ID0gZGVmbGF0ZUVuZCh3c3RyZWFtXyk7CisgIC8vIFpfREFUQV9FUlJPUiBtYXkgYmUgcmV0dXJuZWQgaWYgdGhlIGNhbGxlciBoYXMgd3JpdHRlbiBkYXRhLCBidXQgbm90CisgIC8vIGNhbGxlZCBmbHVzaCgpIHRvIGFjdHVhbGx5IGZpbmlzaCB3cml0aW5nIHRoZSBkYXRhIG91dCB0byB0aGUgdW5kZXJseWluZworICAvLyB0cmFuc3BvcnQuICBUaGUgZGVmaW5lZCBUVHJhbnNwb3J0IGJlaGF2aW9yIGluIHRoaXMgY2FzZSBpcyB0aGF0IHRoaXMgZGF0YQorICAvLyBtYXkgYmUgZGlzY2FyZGVkLCBzbyB3ZSBpZ25vcmUgdGhlIGVycm9yIGFuZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBkYXRhLgorICAvLyBGb3Igb3RoZXIgZXJyb3MsIGxvZyBhIG1lc3NhZ2UuCisgIGlmIChydiAhPSBaX0RBVEFfRVJST1IpIHsKKyAgICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHdzdHJlYW1fLT5tc2cpOworICB9CisKKyAgZGVsZXRlW10gdXJidWZfOworICBkZWxldGVbXSBjcmJ1Zl87CisgIGRlbGV0ZVtdIHV3YnVmXzsKKyAgZGVsZXRlW10gY3didWZfOworICBkZWxldGUgcnN0cmVhbV87CisgIGRlbGV0ZSB3c3RyZWFtXzsKK30KKworYm9vbCBUWmxpYlRyYW5zcG9ydDo6aXNPcGVuKCkgeworICByZXR1cm4gKHJlYWRBdmFpbCgpID4gMCkgfHwgKHJzdHJlYW1fLT5hdmFpbF9pbiA+IDApIHx8IHRyYW5zcG9ydF8tPmlzT3BlbigpOworfQorCitib29sIFRabGliVHJhbnNwb3J0OjpwZWVrKCkgeworICByZXR1cm4gKHJlYWRBdmFpbCgpID4gMCkgfHwgKHJzdHJlYW1fLT5hdmFpbF9pbiA+IDApIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsKK30KKworLy8gUkVBRElORyBTVFJBVEVHWQorLy8KKy8vIFdlIGhhdmUgdHdvIGJ1ZmZlcnMgZm9yIHJlYWRpbmc6IG9uZSBjb250YWluaW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKGNyYnVmXykKKy8vIGFuZCBvbmUgY29udGFpbmluZyB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKHVyYnVmXykuICBXaGVuIHJlYWQgaXMgY2FsbGVkLAorLy8gd2UgcmVwZWF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgdW50aWwgd2UgaGF2ZSBzYXRpc2ZpZWQgdGhlIHJlcXVlc3Q6CisvLyAtIENvcHkgZGF0YSBmcm9tIHVyYnVmXyBpbnRvIHRoZSBjYWxsZXIncyBidWZmZXIuCisvLyAtIElmIHdlIGhhZCBlbm91Z2gsIHJldHVybi4KKy8vIC0gSWYgdXJidWZfIGlzIGVtcHR5LCByZWFkIHNvbWUgZGF0YSBpbnRvIGl0IGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorLy8gLSBJbmZsYXRlIGRhdGEgZnJvbSBjcmJ1Zl8gaW50byB1cmJ1Zl8uCisvLworLy8gSW4gc3RhbmRhbG9uZSBvYmplY3RzLCB3ZSBzZXQgaW5wdXRfZW5kZWRfIHRvIHRydWUgd2hlbiBpbmZsYXRlIHJldHVybnMKKy8vIFpfU1RSRUFNX0VORC4gIFRoaXMgYWxsb3dzIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY2hlY2tzdW0gd2FzIHZlcmlmaWVkLgorCitpbmxpbmUgaW50IFRabGliVHJhbnNwb3J0OjpyZWFkQXZhaWwoKSB7CisgIHJldHVybiB1cmJ1Zl9zaXplXyAtIHJzdHJlYW1fLT5hdmFpbF9vdXQgLSB1cnBvc187Cit9CisKK3VpbnQzMl90IFRabGliVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IG5lZWQgPSBsZW47CisKKyAgLy8gVE9ETyhkcmVpc3MpOiBTa2lwIHVyYnVmIG9uIGJpZyByZWFkcy4KKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUgYXZhaWxhYmxlLCB0aGVuIGdpdmUgdGhlbSB0aGUgbWluIG9mCisgICAgLy8gd2hhdCB3ZSBoYXZlIGFuZCB3aGF0IHRoZXkgd2FudCwgdGhlbiBhZHZhbmNlIGluZGljZXMuCisgICAgaW50IGdpdmUgPSAoc3RkOjptaW4pKCh1aW50MzJfdClyZWFkQXZhaWwoKSwgbmVlZCk7CisgICAgbWVtY3B5KGJ1ZiwgdXJidWZfICsgdXJwb3NfLCBnaXZlKTsKKyAgICBuZWVkIC09IGdpdmU7CisgICAgYnVmICs9IGdpdmU7CisgICAgdXJwb3NfICs9IGdpdmU7CisKKyAgICAvLyBJZiB0aGV5IHdlcmUgc2F0aXNmaWVkLCB3ZSBhcmUgZG9uZS4KKyAgICBpZiAobmVlZCA9PSAwKSB7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIC8vIElmIHdlIHdpbGwgbmVlZCB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIGdldCBtb3JlIGRhdGEsCisgICAgLy8gYnV0IHdlIGFscmVhZHkgaGF2ZSBzb21lIGRhdGEgYXZhaWxhYmxlLCByZXR1cm4gaXQgbm93LiAgUmVhZGluZyBmcm9tCisgICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IG1heSBibG9jaywgYW5kIHJlYWQoKSBpcyBvbmx5IGFsbG93ZWQgdG8gYmxvY2sKKyAgICAvLyB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgIGlmIChuZWVkIDwgbGVuICYmIHJzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICByZXR1cm4gbGVuIC0gbmVlZDsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBnZXQgdG8gdGhpcyBwb2ludCwgd2UgbmVlZCB0byBnZXQgc29tZSBtb3JlIGRhdGEuCisKKyAgICAvLyBJZiB6bGliIGhhcyByZXBvcnRlZCB0aGUgZW5kIG9mIGEgc3RyZWFtLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55IG1vcmUuCisgICAgaWYgKGlucHV0X2VuZGVkXykgeworICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7CisgICAgfQorCisgICAgLy8gVGhlIHVuY29tcHJlc3NlZCByZWFkIGJ1ZmZlciBpcyBlbXB0eSwgc28gcmVzZXQgdGhlIHN0cmVhbSBmaWVsZHMuCisgICAgcnN0cmVhbV8tPm5leHRfb3V0ID0gdXJidWZfOworICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKKyAgICB1cnBvc18gPSAwOworCisgICAgLy8gQ2FsbCBpbmZsYXRlKCkgdG8gdW5jb21wcmVzcyBzb21lIG1vcmUgZGF0YQorICAgIGlmICghcmVhZEZyb21abGliKCkpIHsKKyAgICAgIC8vIG5vIGRhdGEgYXZhaWxhYmxlIGZyb20gdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgIHJldHVybiBsZW4gLSBuZWVkOworICAgIH0KKworICAgIC8vIE9rYXkuICBUaGUgcmVhZCBidWZmZXIgc2hvdWxkIGhhdmUgd2hhdGV2ZXIgd2UgY2FuIGdpdmUgaXQgbm93LgorICAgIC8vIExvb3AgYmFjayB0byB0aGUgc3RhcnQgYW5kIHRyeSB0byBnaXZlIHNvbWUgbW9yZS4KKyAgfQorfQorCitib29sIFRabGliVHJhbnNwb3J0OjpyZWFkRnJvbVpsaWIoKSB7CisgIGFzc2VydCghaW5wdXRfZW5kZWRfKTsKKworICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvbXByZXNzZWQgZGF0YSBhdmFpbGFibGUsCisgIC8vIHJlYWQgc29tZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgaWYgKHJzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgdWludDMyX3QgZ290ID0gdHJhbnNwb3J0Xy0+cmVhZChjcmJ1Zl8sIGNyYnVmX3NpemVfKTsKKyAgICBpZiAoZ290ID09IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcnN0cmVhbV8tPm5leHRfaW4gPSBjcmJ1Zl87CisgICAgcnN0cmVhbV8tPmF2YWlsX2luID0gZ290OworICB9CisKKyAgLy8gV2UgaGF2ZSBzb21lIGNvbXByZXNzZWQgZGF0YSBub3cuICBVbmNvbXByZXNzIGl0LgorICBpbnQgemxpYl9ydiA9IGluZmxhdGUocnN0cmVhbV8sIFpfU1lOQ19GTFVTSCk7CisKKyAgaWYgKHpsaWJfcnYgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgaW5wdXRfZW5kZWRfID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBjaGVja1psaWJSdih6bGliX3J2LCByc3RyZWFtXy0+bXNnKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBXUklUSU5HIFNUUkFURUdZCisvLworLy8gV2UgYnVmZmVyIHVwIHNtYWxsIHdyaXRlcyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIHpsaWIsIHNvIG91ciBsb2dpYyBpczoKKy8vIC0gSXMgdGhlIHdyaXRlIGJpZz8KKy8vICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KKy8vICAgLSBTZW5kIHRoaXMgZGF0YSB0byB6bGliLgorLy8gLSBJcyB0aGUgd3JpdGUgc21hbGw/CisvLyAgIC0gSXMgdGhlcmUgaW5zdWZmaWNpZW50IHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIGl0PworLy8gICAgIC0gU2VuZCB0aGUgYnVmZmVyIHRvIHpsaWIuCisvLyAgIC0gQ29weSB0aGUgZGF0YSB0byB0aGUgYnVmZmVyLgorLy8KKy8vIFdlIGhhdmUgdHdvIGJ1ZmZlcnMgZm9yIHdyaXRpbmcgYWxzbzogdGhlIHVuY29tcHJlc3NlZCBidWZmZXIgKG1lbnRpb25lZAorLy8gYWJvdmUpIGFuZCB0aGUgY29tcHJlc3NlZCBidWZmZXIuICBXaGVuIHNlbmRpbmcgZGF0YSB0byB6bGliIHdlIGxvb3Agb3ZlcgorLy8gdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgc291cmNlICh1bmNvbXByZXNzZWQgYnVmZmVyIG9yIGJpZyB3cml0ZSkgaXMgZW1wdHk6CisvLyAtIElzIHRoZXJlIG5vIG1vcmUgc3BhY2UgaW4gdGhlIGNvbXByZXNzZWQgYnVmZmVyPworLy8gICAtIFdyaXRlIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisvLyAtIERlZmxhdGUgZnJvbSB0aGUgc291cmNlIGludG8gdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorCit2b2lkIFRabGliVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJ3cml0ZSgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOworICB9CisKKyAgLy8gemxpYidzICJkZWZsYXRlIiBmdW5jdGlvbiBoYXMgZW5vdWdoIGxvZ2ljIGluIGl0IHRoYXQgSSB0aGluaworICAvLyB3ZSdyZSBiZXR0ZXIgb2ZmIChwZXJmb3JtYW5jZS13aXNlKSBidWZmZXJpbmcgdXAgc21hbGwgd3JpdGVzLgorICBpZiAobGVuID4gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKKyAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9OT19GTFVTSCk7CisgICAgdXdwb3NfID0gMDsKKyAgICBmbHVzaFRvWmxpYihidWYsIGxlbiwgWl9OT19GTFVTSCk7CisgIH0gZWxzZSBpZiAobGVuID4gMCkgeworICAgIGlmICh1d2J1Zl9zaXplXyAtIHV3cG9zXyA8IGxlbikgeworICAgICAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIFpfTk9fRkxVU0gpOworICAgICAgdXdwb3NfID0gMDsKKyAgICB9CisgICAgbWVtY3B5KHV3YnVmXyArIHV3cG9zXywgYnVmLCBsZW4pOworICAgIHV3cG9zXyArPSBsZW47CisgIH0KK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CisgIH0KKworICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9CTE9DSyk7CisgIHV3cG9zXyA9IDA7CisKKyAgaWYod3N0cmVhbV8tPmF2YWlsX291dCA8IDYpeworICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworICB9CisKKyAgZmx1c2hUb1RyYW5zcG9ydChaX0ZVTExfRkxVU0gpOworfQorCit2b2lkIFRabGliVHJhbnNwb3J0OjpmaW5pc2goKSB7CisgIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZpbmlzaCgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICB9CisKKyAgZmx1c2hUb1RyYW5zcG9ydChaX0ZJTklTSCk7Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKSB7CisgIC8vIHdyaXRlIHBlbmRpbmcgZGF0YSBpbiB1d2J1Zl8gdG8gemxpYgorICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgZmx1c2gpOworICB1d3Bvc18gPSAwOworCisgIC8vIHdyaXRlIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIHpsaWIgdG8gdGhlIHRyYW5zcG9ydAorICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfIC0gd3N0cmVhbV8tPmF2YWlsX291dCk7CisgIHdzdHJlYW1fLT5uZXh0X291dCA9IGN3YnVmXzsKKyAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworCisgIC8vIGZsdXNoIHRoZSB0cmFuc3BvcnQKKyAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBpbnQgZmx1c2gpIHsKKyAgd3N0cmVhbV8tPm5leHRfaW4gPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihidWYpOworICB3c3RyZWFtXy0+YXZhaWxfaW4gPSBsZW47CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKGZsdXNoID09IFpfTk9fRkxVU0ggfHwgZmx1c2ggPT0gWl9CTE9DSykgJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIElmIG91ciBvdXB1dCBidWZmZXIgaXMgZnVsbCwgZmx1c2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIGlmICh3c3RyZWFtXy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8pOworICAgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICAgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworICAgIH0KKworICAgIGludCB6bGliX3J2ID0gZGVmbGF0ZSh3c3RyZWFtXywgZmx1c2gpOworCisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIICYmIHpsaWJfcnYgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICBhc3NlcnQod3N0cmVhbV8tPmF2YWlsX2luID09IDApOworICAgICAgb3V0cHV0X2ZpbmlzaGVkXyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjaGVja1psaWJSdih6bGliX3J2LCB3c3RyZWFtXy0+bXNnKTsKKworICAgIGlmICgoZmx1c2ggPT0gWl9TWU5DX0ZMVVNIIHx8IGZsdXNoID09IFpfRlVMTF9GTFVTSCkgJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDAKKyAgICAgICAgJiYgd3N0cmVhbV8tPmF2YWlsX291dCAhPSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworY29uc3QgdWludDhfdCogVFpsaWJUcmFuc3BvcnQ6OmJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KKyAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgZ2l2ZSBhIHBvaW50ZXIgdG8gaXQsCisgIC8vIG90aGVyd2lzZSBsZXQgdGhlIHByb3Rjb2wgdXNlIGl0cyBzbG93IHBhdGguCisgIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KSpsZW4pIHsKKyAgICAqbGVuID0gKHVpbnQzMl90KXJlYWRBdmFpbCgpOworICAgIHJldHVybiB1cmJ1Zl8gKyB1cnBvc187CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7CisgIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KWxlbikgeworICAgIHVycG9zXyArPSBsZW47CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7CisgIH0KK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6dmVyaWZ5Q2hlY2tzdW0oKSB7CisgIC8vIElmIHpsaWIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLAorICAvLyBpdCBoYXMgdmVyaWZpZWQgdGhlIGNoZWNrc3VtLgorICBpZiAoaW5wdXRfZW5kZWRfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiByZWFkaW5nIGlzIGNvbXBsZXRlLgorICAvLyBJZiB0aGUgY2FsbGVyIHN0aWxsIGhhcyB1bnJlYWQgZGF0YSwgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBpZiAocmVhZEF2YWlsKCkgPiAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mIHpsaWIgc3RyZWFtIik7CisgIH0KKworICAvLyBSZXNldCB0aGUgcnN0cmVhbSBmaWVsZHMsIGluIGNhc2UgYXZhaWxfb3V0IGlzIDAuCisgIC8vIChTaW5jZSByZWFkQXZhaWwoKSBpcyAwLCB3ZSBrbm93IHRoZXJlIGlzIG5vIHVucmVhZCBkYXRhIGluIHVyYnVmXykKKyAgcnN0cmVhbV8tPm5leHRfb3V0ID0gdXJidWZfOworICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CisgIHVycG9zXyA9IDA7CisKKyAgLy8gQ2FsbCBpbmZsYXRlKCkKKyAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY2hlY2tzdW0gaXMgYmFkLgorICBib29sIHBlcmZvcm1lZF9pbmZsYXRlID0gcmVhZEZyb21abGliKCk7CisgIGlmICghcGVyZm9ybWVkX2luZmxhdGUpIHsKKyAgICAvLyBXZSBuZWVkZWQgdG8gcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgYW5kIHRoZSByZWFkKCkgY2FsbAorICAgIC8vIHJldHVybmVkIDAuCisgICAgLy8KKyAgICAvLyBOb3QgYWxsIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIGJlaGF2ZSB0aGUgc2FtZSB3YXkgaGVyZSwgc28gd2UnbGwKKyAgICAvLyBlbmQgdXAgd2l0aCBkaWZmZXJlbnQgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAvLworICAgIC8vIEZvciBzb21lIHRyYW5zcG9ydHMgKGUuZy4sIFRGRFRyYW5zcG9ydCksIHJlYWQoKSBibG9ja3MgaWYgbm8gbW9yZSBkYXRhCisgICAgLy8gaXMgYXZhaWxhYmxlLiAgVGhleSBvbmx5IHJldHVybiAwIGlmIEVPRiBoYXMgYmVlbiByZWFjaGVkLCBvciBpZiB0aGUKKyAgICAvLyByZW1vdGUgZW5kcG9pbnQgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4gIEZvciB0aG9zZSB0cmFuc3BvcnRzLAorICAgIC8vIHZlcmlmeUNoZWNrc3VtKCkgd2lsbCBibG9jayB1bnRpbCB0aGUgY2hlY2tzdW0gYmVjb21lcyBhdmFpbGFibGUuCisgICAgLy8KKyAgICAvLyBPdGhlciB0cmFuc3BvcnQgdHlwZXMgKGUuZy4sIFRNZW1vcnlCdWZmZXIpIGFsd2F5cyByZXR1cm4gMCBpbW1lZGlhdGVseQorICAgIC8vIGlmIG5vIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUuICBGb3IgdGhvc2UgdHJhbnNwb3J0IHR5cGVzLCB2ZXJpZnlDaGVja3N1bQorICAgIC8vIHdpbGwgcmFpc2UgdGhlIGZvbGxvd2luZyBleGNlcHRpb24gaWYgdGhlIGNoZWNrc3VtIGlzIG5vdCBhdmFpbGFibGUgZnJvbQorICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB5ZXQuCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja3N1bSBub3QgYXZhaWxhYmxlIHlldCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSIpOworICB9CisKKyAgLy8gSWYgaW5wdXRfZW5kZWRfIGlzIHRydWUgbm93LCB0aGUgY2hlY2tzdW0gaGFzIGJlZW4gdmVyaWZpZWQKKyAgaWYgKGlucHV0X2VuZGVkXykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRoZSBjYWxsZXIgaW52b2tlZCB1cyBiZWZvcmUgdGhlIGFjdHVhbCBlbmQgb2YgdGhlIGRhdGEgc3RyZWFtCisgIGFzc2VydChyc3RyZWFtXy0+YXZhaWxfb3V0IDwgdXJidWZfc2l6ZV8pOworICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemxpYiBzdHJlYW0iKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworc3RydWN0IHpfc3RyZWFtX3M7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykKKyAgICA6IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsIGVycm9yTWVzc2FnZShzdGF0dXMsIG1zZykpLAorICAgICAgemxpYl9zdGF0dXNfKHN0YXR1cyksCisgICAgICB6bGliX21zZ18obXNnID09IE5VTEwgPyAiKG51bGwpIiA6IG1zZykge30KKworICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CisKKyAgaW50IGdldFpsaWJTdGF0dXMoKSB7IHJldHVybiB6bGliX3N0YXR1c187IH0KKyAgc3RkOjpzdHJpbmcgZ2V0WmxpYk1lc3NhZ2UoKSB7IHJldHVybiB6bGliX21zZ187IH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZXJyb3JNZXNzYWdlKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgeworICAgIHN0ZDo6c3RyaW5nIHJ2ID0gInpsaWIgZXJyb3I6ICI7CisgICAgaWYgKG1zZykgeworICAgICAgcnYgKz0gbXNnOworICAgIH0gZWxzZSB7CisgICAgICBydiArPSAiKG5vIG1lc3NhZ2UpIjsKKyAgICB9CisgICAgcnYgKz0gIiAoc3RhdHVzID0gIjsKKyAgICBydiArPSB0b19zdHJpbmcoc3RhdHVzKTsKKyAgICBydiArPSAiKSI7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgaW50IHpsaWJfc3RhdHVzXzsKKyAgc3RkOjpzdHJpbmcgemxpYl9tc2dfOworfTsKKworLyoqCisgKiBUaGlzIHRyYW5zcG9ydCB1c2VzIHpsaWIgdG8gY29tcHJlc3Mgb24gd3JpdGUgYW5kIGRlY29tcHJlc3Mgb24gcmVhZAorICoKKyAqIFRPRE8oZHJlaXNzKTogRG9uJ3QgZG8gYW4gZXh0cmEgY29weSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGlmCisgKiAgICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpcyBUQnVmZmVyZWQgb3IgVE1lbW9yeS4KKyAqCisgKi8KK2NsYXNzIFRabGliVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRabGliVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBAcGFyYW0gdHJhbnNwb3J0ICAgIFRoZSB0cmFuc3BvcnQgdG8gcmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbQorICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8uCisgICAqIEBwYXJhbSB1cmJ1Zl9zaXplICAgVW5jb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nLgorICAgKiBAcGFyYW0gY3JidWZfc2l6ZSAgIENvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHJlYWRpbmcuCisgICAqIEBwYXJhbSB1d2J1Zl9zaXplICAgVW5jb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgorICAgKiBAcGFyYW0gY3didWZfc2l6ZSAgIENvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCisgICAqIEBwYXJhbSBjb21wX2xldmVsICAgQ29tcHJlc3Npb24gbGV2ZWwgKDA9bm9uZVtmYXN0XSwgNj1kZWZhdWx0LCA5PW1heFtzbG93XSkuCisgICAqLworICBUWmxpYlRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAorICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgaW50MTZfdCBjb21wX2xldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgdXJwb3NfKDApLAorICAgICAgdXdwb3NfKDApLAorICAgICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKKyAgICAgIG91dHB1dF9maW5pc2hlZF8oZmFsc2UpLAorICAgICAgdXJidWZfc2l6ZV8odXJidWZfc2l6ZSksCisgICAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKKyAgICAgIHV3YnVmX3NpemVfKHV3YnVmX3NpemUpLAorICAgICAgY3didWZfc2l6ZV8oY3didWZfc2l6ZSksCisgICAgICB1cmJ1Zl8oTlVMTCksCisgICAgICBjcmJ1Zl8oTlVMTCksCisgICAgICB1d2J1Zl8oTlVMTCksCisgICAgICBjd2J1Zl8oTlVMTCksCisgICAgICByc3RyZWFtXyhOVUxMKSwKKyAgICAgIHdzdHJlYW1fKE5VTEwpLAorICAgICAgY29tcF9sZXZlbF8oY29tcF9sZXZlbCkgeworICAgIGlmICh1d2J1Zl9zaXplXyA8IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7CisgICAgICAvLyBIYXZlIHRvIGNvcHkgdGhpcyBpbnRvIGEgbG9jYWwgYmVjYXVzZSBvZiBhIGxpbmtpbmcgaXNzdWUuCisgICAgICBpbnQgbWluaW11bSA9IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRaTGliVHJhbnNwb3J0OiB1bmNvbXByZXNzZWQgd3JpdGUgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fc3RyaW5nKG1pbmltdW0pICsgIi4iKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgdXJidWZfID0gbmV3IHVpbnQ4X3RbdXJidWZfc2l6ZV07CisgICAgICBjcmJ1Zl8gPSBuZXcgdWludDhfdFtjcmJ1Zl9zaXplXTsKKyAgICAgIHV3YnVmXyA9IG5ldyB1aW50OF90W3V3YnVmX3NpemVdOworICAgICAgY3didWZfID0gbmV3IHVpbnQ4X3RbY3didWZfc2l6ZV07CisKKyAgICAgIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgIGluaXRabGliKCk7CisKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIGRlbGV0ZVtdIHVyYnVmXzsKKyAgICAgIGRlbGV0ZVtdIGNyYnVmXzsKKyAgICAgIGRlbGV0ZVtdIHV3YnVmXzsKKyAgICAgIGRlbGV0ZVtdIGN3YnVmXzsKKyAgICAgIHRocm93OworICAgIH0KKyAgfQorCisgIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBpbml0WmxpYigpOworCisgIC8qKgorICAgKiBUWmxpYlRyYW5zcG9ydCBkZXN0cnVjdG9yLgorICAgKgorICAgKiBXYXJuaW5nOiBEZXN0cm95aW5nIGEgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IG1heSBkaXNjYXJkIGFueSB3cml0dGVuIGJ1dAorICAgKiB1bmZsdXNoZWQgZGF0YS4gIFlvdSBtdXN0IGV4cGxpY2l0bHkgY2FsbCBmbHVzaCgpIG9yIGZpbmlzaCgpIHRvIGVuc3VyZQorICAgKiB0aGF0IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBhbmQgZmx1c2hlZCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAqLworICB+VFpsaWJUcmFuc3BvcnQoKTsKKworICBib29sIGlzT3BlbigpOworICBib29sIHBlZWsoKTsKKworICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQorCisgIHZvaWQgY2xvc2UoKSB7IHRyYW5zcG9ydF8tPmNsb3NlKCk7IH0KKworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2b2lkIGZsdXNoKCk7CisKKyAgLyoqCisgICAqIEZpbmFsaXplIHRoZSB6bGliIHN0cmVhbS4KKyAgICoKKyAgICogVGhpcyBjYXVzZXMgemxpYiB0byBmbHVzaCBhbnkgcGVuZGluZyB3cml0ZSBkYXRhIGFuZCB3cml0ZSBlbmQtb2Ytc3RyZWFtCisgICAqIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGNoZWNrc3VtLiAgT25jZSBmaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQsIG5vCisgICAqIG5ldyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCisgICAqLworICB2b2lkIGZpbmlzaCgpOworCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOworCisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOworCisgIC8qKgorICAgKiBWZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHpsaWIgc3RyZWFtLgorICAgKgorICAgKiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLgorICAgKiBJdCB2ZXJpZmllcyB0aGUgY2hlY2tzdW0gdGhhdCB3YXMgd3JpdHRlbiBieSB0aGUgZmluaXNoKCkgY2FsbC4KKyAgICovCisgIHZvaWQgdmVyaWZ5Q2hlY2tzdW0oKTsKKworICAvKioKKyAgICogVE9ETyhzb21lb25lX3NtYXJ0KTogQ2hvb3NlIHNtYXJ0IGRlZmF1bHRzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VSQlVGX1NJWkUgPSAxMjg7CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DUkJVRl9TSVpFID0gMTAyNDsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VXQlVGX1NJWkUgPSAxMjg7CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DV0JVRl9TSVpFID0gMTAyNDsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIGNvbnN0IHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKworcHJvdGVjdGVkOgorICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOworICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKKyAgaW5saW5lIGludCByZWFkQXZhaWwoKTsKKyAgdm9pZCBmbHVzaFRvVHJhbnNwb3J0KGludCBmbHVzaCk7CisgIHZvaWQgZmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBpbnQgZmx1c2gpOworICBib29sIHJlYWRGcm9tWmxpYigpOworCitwcm90ZWN0ZWQ6CisgIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAuCisgIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworCisgIGludCB1cnBvc187CisgIGludCB1d3Bvc187CisKKyAgLy8vIFRydWUgaWZmIHpsaWIgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICBib29sIGlucHV0X2VuZGVkXzsKKyAgLy8vIFRydWUgaWZmIHdlIGhhdmUgZmluaXNoZWQgdGhlIG91dHB1dCBzdHJlYW0uCisgIGJvb2wgb3V0cHV0X2ZpbmlzaGVkXzsKKworICB1aW50MzJfdCB1cmJ1Zl9zaXplXzsKKyAgdWludDMyX3QgY3JidWZfc2l6ZV87CisgIHVpbnQzMl90IHV3YnVmX3NpemVfOworICB1aW50MzJfdCBjd2J1Zl9zaXplXzsKKworICB1aW50OF90KiB1cmJ1Zl87CisgIHVpbnQ4X3QqIGNyYnVmXzsKKyAgdWludDhfdCogdXdidWZfOworICB1aW50OF90KiBjd2J1Zl87CisKKyAgc3RydWN0IHpfc3RyZWFtX3MqIHJzdHJlYW1fOworICBzdHJ1Y3Qgel9zdHJlYW1fcyogd3N0cmVhbV87CisKKyAgY29uc3QgaW50IGNvbXBfbGV2ZWxfOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgemxpYmJlZCBvbmUuCisgKgorICovCitjbGFzcyBUWmxpYlRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUWmxpYlRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRabGliVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDgyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisvLyB3aW4zMgorI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykKKyNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVWk2NAorI2Vsc2UKKyNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVUxMCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorc3RydWN0IHRpbWV6b25lIHsKKyAgaW50IHR6X21pbnV0ZXN3ZXN0OyAvKiBtaW51dGVzIFcgb2YgR3JlZW53aWNoICovCisgIGludCB0el9kc3R0aW1lOyAgICAgLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLworfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgeworICByZXR1cm4gZ2V0dGltZW9mZGF5KHR2LHR6KTsKK30KKyNlbHNlCitpbnQgdGhyaWZ0X2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogdHYsIHN0cnVjdCB0aW1lem9uZSogdHopIHsKKyAgRklMRVRJTUUgZnQ7CisgIHVuc2lnbmVkIF9faW50NjQgdG1wcmVzKDApOworICBzdGF0aWMgaW50IHR6ZmxhZzsKKworICBpZiAoTlVMTCAhPSB0dikgeworICAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCZmdCk7CisKKyAgICB0bXByZXMgfD0gZnQuZHdIaWdoRGF0ZVRpbWU7CisgICAgdG1wcmVzIDw8PSAzMjsKKyAgICB0bXByZXMgfD0gZnQuZHdMb3dEYXRlVGltZTsKKworICAgIC8qY29udmVydGluZyBmaWxlIHRpbWUgdG8gdW5peCBlcG9jaCovCisgICAgdG1wcmVzIC09IERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUzsKKyAgICB0bXByZXMgLz0gMTA7IC8qY29udmVydCBpbnRvIG1pY3Jvc2Vjb25kcyovCisgICAgdHYtPnR2X3NlYyA9IChsb25nKSh0bXByZXMgLyAxMDAwMDAwVUwpOworICAgIHR2LT50dl91c2VjID0gKGxvbmcpKHRtcHJlcyAlIDEwMDAwMDBVTCk7CisgIH0KKworICBpZiAoTlVMTCAhPSB0eikgeworICAgIGlmICghdHpmbGFnKSB7CisgICAgICBfdHpzZXQoKTsKKyAgICAgIHR6ZmxhZysrOworICAgIH0KKworICAgIGxvbmcgdGltZV96b25lKDApOworICAgIGVycm5vX3QgZXJyKF9nZXRfdGltZXpvbmUoJnRpbWVfem9uZSkpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgIHR6LT50el9taW51dGVzd2VzdCA9IHRpbWVfem9uZSAvIDYwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IGRheV9saWdodCgwKTsKKyAgICBlcnIgPSAoX2dldF9kYXlsaWdodCgmZGF5X2xpZ2h0KSk7CisgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgdHotPnR6X2RzdHRpbWUgPSBkYXlfbGlnaHQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmCisKK2ludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpIHsKKyAgOjpTbGVlcChzZWNvbmRzICogMTAwMCk7CisgIHJldHVybiAwOworfQoraW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3Jvc2Vjb25kcykgeworICB1bnNpZ25lZCBpbnQgbWlsbGlzZWNvbmRzID0gKG1pY3Jvc2Vjb25kcyArIDk5OSkgLyAxMDAwOworICA6OlNsZWVwKG1pbGxpc2Vjb25kcyk7CisgIHJldHVybiAwOworfQorCitjaGFyKiB0aHJpZnRfY3RpbWVfcihjb25zdCB0aW1lX3QqIF9jbG9jaywgY2hhciogX2J1ZikgeworICBzdHJjcHkoX2J1ZiwgY3RpbWUoX2Nsb2NrKSk7CisgIHJldHVybiBfYnVmOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJhYzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19HRVRUSU1FT0ZEQVlfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitzdHJ1Y3QgdGhyaWZ0X3RpbWVzcGVjIHsKKyAgaW50NjRfdCB0dl9zZWM7CisgIGludDY0X3QgdHZfbnNlYzsKK307CisKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eik7CitpbnQgdGhyaWZ0X3NsZWVwKHVuc2lnbmVkIGludCBzZWNvbmRzKTsKK2ludCB0aHJpZnRfdXNsZWVwKHVuc2lnbmVkIGludCBtaWNyb19zZWNvbmRzKTsKK2NoYXIqIHRocmlmdF9jdGltZV9yKGNvbnN0IHRpbWVfdCogX2Nsb2NrLCBjaGFyKiBfYnVmKTsKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19HRVRUSU1FT0ZEQVlfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL09wZXJhdG9ycy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NjA5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL09wZXJhdG9ycy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfT1BFUkFUT1JTX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19PUEVSQVRPUlNfSF8KKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBURW51bUl0ZXJhdG9yOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRFbnVtSXRlcmF0b3ImLCBjb25zdCBURW51bUl0ZXJhdG9yJikgeworICAvLyBOb3QgZW50aXJlbHkgc3VyZSB3aGF0IHRoZSB0ZXN0IHNob3VsZCBiZSBoZXJlLiBJdCBpcyBvbmx5IHRvIGVuYWJsZQorICAvLyBpdGVyYXRvciBkZWJ1Z2dpbmcgYW5kIGlzIG5vdCB1c2VkIGluIHJlbGVhc2UgbW9kZS4KKyAgcmV0dXJuIHRydWU7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfT1BFUkFUT1JTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjNmZlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlX2V4aXQuaHBwPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUT3ZlcmxhcHBlZFdvcmtJdGVtOjpUT3ZlcmxhcHBlZFdvcmtJdGVtKCkKKyAgOiBTTElTVF9FTlRSWSgpLAorICAgIGFjdGlvbihVTktOT1dOKSwKKyAgICBoKElOVkFMSURfSEFORExFX1ZBTFVFKSwKKyAgICBidWZmZXIoTlVMTCksCisgICAgYnVmZmVyX2xlbigwKSwKKyAgICBvdmVybGFwKCksCisgICAgbGFzdF9lcnJvcigwKSwKKyAgICBzdWNjZXNzKFRSVUUpIHsKK30KKwordm9pZCBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpyZXNldCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbiwgSEFORExFIGV2ZW50KSB7CisgIG1lbXNldCgmb3ZlcmxhcCwgMCwgc2l6ZW9mKG92ZXJsYXApKTsKKyAgb3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKKyAgYnVmZmVyID0gYnVmOworICBidWZmZXJfbGVuID0gbGVuOworICBsYXN0X2Vycm9yID0gMDsKKyAgc3VjY2VzcyA9IEZBTFNFOworfQorCit1aW50MzJfdCBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpvdmVybGFwcGVkUmVzdWx0cyhib29sIHNpZ25hbF9mYWlsdXJlKSB7CisgIERXT1JEIGJ5dGVzID0gMDsKKyAgQk9PTCByZXN1bHQgPSA6OkdldE92ZXJsYXBwZWRSZXN1bHQoaCwgJm92ZXJsYXAsICZieXRlcywgVFJVRSk7CisgIGlmIChzaWduYWxfZmFpbHVyZSAmJiAhcmVzdWx0KSAvLyBnZXQgb3ZlcmxhcHBlZCBlcnJvciBjYXNlCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCitib29sIFRPdmVybGFwcGVkV29ya0l0ZW06OnByb2Nlc3MoKSB7CisgIEJPT1NUX1NDT1BFX0VYSVQoKCZkb25lU3VibWl0dGluZ0V2ZW50KSkgeyBTZXRFdmVudChkb25lU3VibWl0dGluZ0V2ZW50LmgpOyB9CisgIEJPT1NUX1NDT1BFX0VYSVRfRU5ECisKKyAgc3dpdGNoIChhY3Rpb24pIHsKKyAgY2FzZSAoQ09OTkVDVCk6CisgICAgc3VjY2VzcyA9IDo6Q29ubmVjdE5hbWVkUGlwZShoLCAmb3ZlcmxhcCk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSAoUkVBRCk6CisgICAgc3VjY2VzcyA9IDo6UmVhZEZpbGUoaCwgYnVmZmVyLCBidWZmZXJfbGVuLCBOVUxMLCAmb3ZlcmxhcCk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSAoQ0FOQ0VMSU8pOgorICAgIHN1Y2Nlc3MgPSA6OkNhbmNlbElvKGgpOworICAgIGlmIChzdWNjZXNzID09IEZBTFNFKQorICAgICAgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgKFNUT1ApOgorICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSogaXRlbSkgeworICBJbnRlcmxvY2tlZFB1c2hFbnRyeVNMaXN0KCZ3b3JrTGlzdF8sIGl0ZW0pOworICBTZXRFdmVudCh3b3JrQXZhaWxhYmxlRXZlbnRfLmgpOworICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGl0ZW0tPmRvbmVTdWJtaXR0aW5nRXZlbnQuaCwgSU5GSU5JVEUpOworfQorCitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWNxdWlyZV9pbnN0YW5jZSgpIHsKKyAgVEF1dG9Dcml0IGxvY2soaW5zdGFuY2VHdWFyZF8pOworICBpZiAoaW5zdGFuY2VfID09IE5VTEwpIHsKKyAgICBhc3NlcnQoaW5zdGFuY2VSZWZDb3VudF8gPT0gMCk7CisgICAgaW5zdGFuY2VfID0gbmV3IFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDsKKyAgfQorICArK2luc3RhbmNlUmVmQ291bnRfOworICByZXR1cm4gaW5zdGFuY2VfOworfQordm9pZCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJlbGVhc2VfaW5zdGFuY2UoKSB7CisgIFRBdXRvQ3JpdCBsb2NrKGluc3RhbmNlR3VhcmRfKTsKKyAgaWYgKC0taW5zdGFuY2VSZWZDb3VudF8gPT0gMCkgeworICAgIGRlbGV0ZSBpbnN0YW5jZV87CisgICAgaW5zdGFuY2VfID0gTlVMTDsKKyAgfQorfQorCitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OlRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpIHsKKyAgc3RvcEl0ZW1fLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OlNUT1A7CisKKyAgSW5pdGlhbGl6ZVNMaXN0SGVhZCgmd29ya0xpc3RfKTsKKyAgdGhyZWFkXyA9IChIQU5ETEUpX2JlZ2ludGhyZWFkZXgoTlVMTCwgMCwgdGhyZWFkX3Byb2MsIHRoaXMsIDAsIE5VTEwpOworICBpZiAodGhyZWFkXyA9PSAwKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkLCBlcnJubz0iLCBlcnJubyk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkIik7CisgIH0KK30KKworVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjp+VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCkgeworICBhZGRXb3JrSXRlbSgmc3RvcEl0ZW1fKTsKKyAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF8sIElORklOSVRFKTsKKyAgQ2xvc2VIYW5kbGUodGhyZWFkXyk7Cit9CisKK3ZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpydW4oKSB7CisgIGZvciAoOzspIHsKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHdvcmtBdmFpbGFibGVFdmVudF8uaCwgSU5GSU5JVEUpOworICAgIC8vIHRvZG8gY2hlY2sgcmVzdWx0CisgICAgU0xJU1RfRU5UUlkqIGVudHJ5ID0gTlVMTDsKKyAgICB3aGlsZSAoKGVudHJ5ID0gSW50ZXJsb2NrZWRQb3BFbnRyeVNMaXN0KCZ3b3JrTGlzdF8pKSAhPSBOVUxMKSB7CisgICAgICBUT3ZlcmxhcHBlZFdvcmtJdGVtJiBpdGVtID0gKnN0YXRpY19jYXN0PFRPdmVybGFwcGVkV29ya0l0ZW0qPihlbnRyeSk7CisgICAgICBpZiAoIWl0ZW0ucHJvY2VzcygpKQorICAgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3Vuc2lnbmVkIF9fc3RkY2FsbCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnRocmVhZF9wcm9jKHZvaWQqIGFkZHIpIHsKKyAgc3RhdGljX2Nhc3Q8VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKj4oYWRkciktPnJ1bigpOworICByZXR1cm4gMDsKK30KKworVENyaXRpY2FsU2VjdGlvbiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6Omluc3RhbmNlR3VhcmRfOworVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6Omluc3RhbmNlXzsKK3VpbnQzMl90IFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6aW5zdGFuY2VSZWZDb3VudF8gPSAwOworfQorfQorfSAvLyBhcGFjaDo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZF9IXyAxCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIk92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmggaXMgb25seSB1c2FibGUgb24gV2luZG93cyIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisKKy8qCisgICoqKiBXaHkgZG9lcyB0aGlzIGNsYXNzIGV4aXN0PworICBJbiBzaG9ydCwgYmVjYXVzZSB3ZSB3YW50IHRvIGVuYWJsZSBzb21ldGhpbmcgc2ltaWxhciB0byBhICJzZWxlY3QiIGxvb3AsIG9uIFdpbmRvd3MsIHdpdGgKKyAgbmFtZWQgcGlwZXMuICBUaGUgY29yZSBvZiB0aGUgInNlbGVjdCIgbG9vcCBpcyBhIGNhbGwgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cy4gIFNvIHRoYXQgbWVhbnMKKyAgd2UgbmVlZCBhIHNpZ25hbGFibGUgb2JqZWN0IHRoYXQgaW5kaWNhdGVzIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUuCisKKyAgQSBwaXBlIGhhbmRsZSBkb2Vzbid0IGRvIHRoYXQuICBBIHBpcGUgaGFuZGxlIGlzIHNpZ25hbGVkIHdoZW4gYSByZWFkIG9yIHdyaXRlIGNvbXBsZXRlcywgYW5kIGlmCisgIG5vIG9uZSBoYXMgY2FsbGVkIHJlYWQgb3Igd3JpdGUsIHRoZW4gdGhlIHBpcGUgaGFuZGxlIGlzIHVzZWxlc3MgaW4gV2FpdEZvck11bHRpcGxlT2JqZWN0cy4gIFNvCisgIGluc3RlYWQsIHdlIHVzZSBvdmVybGFwcGVkIEkvTy4gIFdpdGggb3ZlcmxhcHBlZCBJL08sIHlvdSBjYWxsIHJlYWQsIGFuZCBhc3NvY2lhdGUgYW4gZXZlbnQgd2l0aAorICB0aGUgcmVhZC4gIFdoZW4gdGhlIHJlYWQgZmluaXNoZXMsIHRoZSBldmVudCBpcyBzaWduYWxlZC4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHlvdSBjcmVhdGUgYSBwaXBlLAorICB5b3Ugc3RhcnQgYSByZWFkLiAgV2hlbiB0aGUgY3VzdG9tZXIgY2FsbHMgcmVhZCBvbiB5b3VyIHRyYW5zcG9ydCBvYmplY3QsIHlvdSB3YWl0IGZvciB0aGUgbGFzdAorICByZWFkIHRvIGZpbmlzaCwgYW5kIHRoZW4ga2ljayBvZmYgYW5vdGhlci4KKworICBUaGVyZSBpcyBvbmUgYmlnIGNhdmVhdCB0byB0aGlzIHRob3VnaC4gIFRoZSB0aHJlYWQgdGhhdCBpbml0aWF0ZWQgdGhlIHJlYWQgbXVzdCBzdGF5IGFsaXZlLiAgSWYKKyAgdGhlIHRocmVhZCB0aGF0IGluaXRpYXRlZCB0aGUgcmVhZCBleGl0cywgdGhlbiB0aGUgcmVhZCBjb21wbGV0ZXMgaW4gYW4gZXJyb3Igc3RhdGUuICBUbyBlbnN1cmUKKyAgdGhhdCB0aGUgaW5pdGlhdGluZyB0aHJlYWQgc3RheXMgYWxpdmUsIHdlIGNyZWF0ZSBhIHNpbmdsZXRvbiB0aHJlYWQgd2hvc2Ugc29sZSByZXNwb25zaWJpbGl0eSBpcworICB0byBtYW5hZ2UgdGhpcyBvdmVybGFwcGVkIEkvTyByZXF1ZXN0cy4gIFRoaXMgaW50cm9kdWNlcyBzb21lIG92ZXJoZWFkLCBidXQgaXQgaXMgb3ZlcmhlYWQgdGhhdAorICBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3QgYmVoYXZpb3IuCisKKyAgVGhpcyB0aHJlYWQgY3VycmVudGx5IHN1cHBvcnRzIGNvbm5lY3QsIHJlYWQsIGFuZCBjYW5jZWwgaW8uICBTbyBmYXIsIEkgaGF2ZW4ndCBuZWVkZWQgdG8gcHV0IGFueQorICB3cml0ZXMgb24gdGhpcyB0aHJlYWQsIGJ1dCBpZiBuZWVkZWQsIGl0IGNvdWxkIGJlIGRvbmUuICBUaGUgY2xpZW50IHdyaXRlIGJ1ZmZlciB3b3VsZCBuZWVkIHRvIGJlCisgIGNvcGllZCB0byBlbnN1cmUgdGhhdCBpdCBkb2Vzbid0IGdldCBpbnZhbGlkYXRlZC4KKworICAqKiogSG93IGRvZXMgb25lIHVzZSB0aGlzIGNsYXNzPworICBDcmVhdGUgYSBUT3ZlcmxhcHBlZFdvcmtJdGVtLCBhbmQgZmlsbCBpbiB0aGUgYWN0aW9uIGFuZCAiaCIsIHRoZW4gY2FsbCByZXNldCgpLiAgWW91ciB3b3JrIGl0ZW0KKyAgaXMgbm93IHJlYWR5IHRvIGJlIHN1Ym1pdHRlZCB0byB0aGUgb3ZlcmxhcHBlZCBzdWJtaXNzaW9uIHRocmVhZC4gIENyZWF0ZSBhIFRBdXRvT3ZlcmxhcFRocmVhZCwKKyAgYW5kIGNhbGwgdGhyZWFkLT5hZGRXb3JrSXRlbSB3aXRoIHlvdXIgd29yayBpdGVtLiAgQWZ0ZXIgYWRkV29ya0l0ZW0gY29tcGxldGVzLCB5b3UgbWF5IGluc3BlY3QKKyAgbGFzdF9lcnJvciBhbmQgc3VjY2Vzcy4gIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgY2FsbCB3b3JrSXRlbS5vdmVybGFwcGVkUmVzdWx0cyB0byB3YWl0CisgIHVudGlsIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KKyovCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworc3RydWN0IERFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgVE92ZXJsYXBwZWRXb3JrSXRlbSA6IHB1YmxpYyBTTElTVF9FTlRSWSB7CisgIFRPdmVybGFwcGVkV29ya0l0ZW0oKTsKKworICBlbnVtIGFjdGlvbl90IHsKKyAgICBVTktOT1dOID0gMzAwMCwKKyAgICBDT05ORUNULAorICAgIFJFQUQsCisgICAgQ0FOQ0VMSU8sCisgICAgU1RPUCwKKyAgfTsKKworICBUQXV0b1Jlc2V0RXZlbnQgZG9uZVN1Ym1pdHRpbmdFdmVudDsKKyAgYWN0aW9uX3QgYWN0aW9uOworICBIQU5ETEUgaDsKKyAgdWludDhfdCogYnVmZmVyOworICB1aW50MzJfdCBidWZmZXJfbGVuOworICBPVkVSTEFQUEVEIG92ZXJsYXA7CisKKyAgRFdPUkQgbGFzdF9lcnJvcjsKKyAgQk9PTCBzdWNjZXNzOworCisgIHZvaWQgcmVzZXQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4sIEhBTkRMRSBldmVudCk7CisgIHVpbnQzMl90IG92ZXJsYXBwZWRSZXN1bHRzKGJvb2wgc2lnbmFsX2ZhaWx1cmUgPSB0cnVlKTsKKyAgYm9vbCBwcm9jZXNzKCk7Cit9OworCitjbGFzcyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICB2b2lkIGFkZFdvcmtJdGVtKFRPdmVybGFwcGVkV29ya0l0ZW0qIGl0ZW0pOworCisgIC8vIHNpbmdsZXRvbiBzdHVmZgorcHVibGljOgorICBzdGF0aWMgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBhY3F1aXJlX2luc3RhbmNlKCk7CisgIHN0YXRpYyB2b2lkIHJlbGVhc2VfaW5zdGFuY2UoKTsKKworcHJpdmF0ZToKKyAgc3RhdGljIFRDcml0aWNhbFNlY3Rpb24gaW5zdGFuY2VHdWFyZF87CisgIHN0YXRpYyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIGluc3RhbmNlXzsKKyAgc3RhdGljIHVpbnQzMl90IGluc3RhbmNlUmVmQ291bnRfOworCisgIC8vIHRocmVhZCBkZXRhaWxzCitwcml2YXRlOgorICBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKTsKKyAgflRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpOworICB2b2lkIHJ1bigpOworICBzdGF0aWMgdW5zaWduZWQgX19zdGRjYWxsIHRocmVhZF9wcm9jKHZvaWQqIGFkZHIpOworCitwcml2YXRlOgorICBERUNMU1BFQ19BTElHTihNRU1PUllfQUxMT0NBVElPTl9BTElHTk1FTlQpIFNMSVNUX0hFQURFUiB3b3JrTGlzdF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gc3RvcEl0ZW1fOworICBUQXV0b1Jlc2V0RXZlbnQgd29ya0F2YWlsYWJsZUV2ZW50XzsKKyAgSEFORExFIHRocmVhZF87Cit9OworCitjbGFzcyBUQXV0b092ZXJsYXBUaHJlYWQgOiBib29zdDo6bm9uY29weWFibGUgeworcHJpdmF0ZToKKyAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBwOworCitwdWJsaWM6CisgIFRBdXRvT3ZlcmxhcFRocmVhZCgpIDogcChUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OmFjcXVpcmVfaW5zdGFuY2UoKSkge30KKyAgflRBdXRvT3ZlcmxhcFRocmVhZCgpIHsgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpyZWxlYXNlX2luc3RhbmNlKCk7IH0KKyAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gcDsgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyODgzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKiBzb2NrZXRwYWlyLmMKKyAqIENvcHlyaWdodCAyMDA3IGJ5IE5hdGhhbiBDLiBNeWVycyA8bmNtQGNhbnRyaXAub3JnPjsgc29tZSByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIGNvZGUgaXMgRnJlZSBTb2Z0d2FyZS4gIEl0IG1heSBiZSBjb3BpZWQgZnJlZWx5LCBpbiBvcmlnaW5hbCBvcgorICogbW9kaWZpZWQgZm9ybSwgc3ViamVjdCBvbmx5IHRvIHRoZSByZXN0cmljdGlvbnMgdGhhdCAoMSkgdGhlIGF1dGhvciBpcworICogcmVsaWV2ZWQgZnJvbSBhbGwgcmVzcG9uc2liaWxpdGllcyBmb3IgYW55IHVzZSBmb3IgYW55IHB1cnBvc2UsIGFuZCAoMikKKyAqIHRoaXMgY29weXJpZ2h0IG5vdGljZSBtdXN0IGJlIHJldGFpbmVkLCB1bmNoYW5nZWQsIGluIGl0cyBlbnRpcmV0eS4gIElmCisgKiBmb3IgYW55IHJlYXNvbiB0aGUgYXV0aG9yIG1pZ2h0IGJlIGhlbGQgcmVzcG9uc2libGUgZm9yIGFueSBjb25zZXF1ZW5jZXMKKyAqIG9mIGNvcHlpbmcgb3IgdXNlLCBsaWNlbnNlIGlzIHdpdGhoZWxkLgorICovCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKKy8vIHN0bAorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBXaW4zMgorI2luY2x1ZGUgPFdTMnRjcGlwLmg+CisKK2ludCB0aHJpZnRfc29ja2V0cGFpcihpbnQgZCwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgVEhSSUZUX1NPQ0tFVCBzdlsyXSkgeworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh0eXBlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShkKTsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGluYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKKyAgfSBhOworICBUSFJJRlRfU09DS0VUIGxpc3RlbmVyOworICBpbnQgZTsKKyAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYS5pbmFkZHIpOworICBEV09SRCBmbGFncyA9IDA7CisgIGludCByZXVzZSA9IDE7CisKKyAgaWYgKHN2ID09IDApIHsKKyAgICBXU0FTZXRMYXN0RXJyb3IoV1NBRUlOVkFMKTsKKyAgICByZXR1cm4gU09DS0VUX0VSUk9SOworICB9CisKKyAgbGlzdGVuZXIgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKyAgaWYgKGxpc3RlbmVyID09IElOVkFMSURfU09DS0VUKQorICAgIHJldHVybiBTT0NLRVRfRVJST1I7CisKKyAgbWVtc2V0KCZhLCAwLCBzaXplb2YoYSkpOworICBhLmluYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgYS5pbmFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKyAgYS5pbmFkZHIuc2luX3BvcnQgPSAwOworCisgIHN2WzBdID0gc3ZbMV0gPSBJTlZBTElEX1NPQ0tFVDsKKyAgZG8geworICAgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQuICBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAgIC8vIHdhbnQgdG8gZm9yY2Ugc29ja2V0IHBhaXJzIHRvIGJlIGFuIGFkbWluLgorICAgIHNldHNvY2tvcHQobGlzdGVuZXIsIFNPTF9TT0NLRVQsIFNPX0VYQ0xVU0lWRUFERFJVU0UsIChjaGFyKikmcmV1c2UsIChzb2NrbGVuX3Qpc2l6ZW9mKHJldXNlKSk7CisgICAgaWYgKGJpbmQobGlzdGVuZXIsICZhLmFkZHIsIHNpemVvZihhLmluYWRkcikpID09IFNPQ0tFVF9FUlJPUikKKyAgICAgIGJyZWFrOworICAgIGlmIChnZXRzb2NrbmFtZShsaXN0ZW5lciwgJmEuYWRkciwgJmFkZHJsZW4pID09IFNPQ0tFVF9FUlJPUikKKyAgICAgIGJyZWFrOworICAgIGlmIChsaXN0ZW4obGlzdGVuZXIsIDEpID09IFNPQ0tFVF9FUlJPUikKKyAgICAgIGJyZWFrOworICAgIHN2WzBdID0gV1NBU29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwLCBOVUxMLCAwLCBmbGFncyk7CisgICAgaWYgKHN2WzBdID09IElOVkFMSURfU09DS0VUKQorICAgICAgYnJlYWs7CisgICAgaWYgKGNvbm5lY3Qoc3ZbMF0sICZhLmFkZHIsIHNpemVvZihhLmluYWRkcikpID09IFNPQ0tFVF9FUlJPUikKKyAgICAgIGJyZWFrOworICAgIHN2WzFdID0gYWNjZXB0KGxpc3RlbmVyLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoc3ZbMV0gPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICBicmVhazsKKworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICByZXR1cm4gMDsKKworICB9IHdoaWxlICgwKTsKKworICBlID0gV1NBR2V0TGFzdEVycm9yKCk7CisgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgY2xvc2Vzb2NrZXQoc3ZbMF0pOworICBjbG9zZXNvY2tldChzdlsxXSk7CisgIFdTQVNldExhc3RFcnJvcihlKTsKKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJmNDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfU09DS0VUUEFJUl9IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfU09DS0VUUEFJUl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlbmRpZgorCisvLyBXaW4zMgorI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworaW50IHRocmlmdF9zb2NrZXRwYWlyKGludCBkLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBUSFJJRlRfU09DS0VUIHN2WzJdKTsKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19TT0NLRVRQQUlSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TeW5jLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzMjE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N5bmMuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19TeW5jX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19TeW5jX0hfIDEKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAid2luZG93cy9TeW5jLmggaXMgb25seSB1c2FibGUgb24gV2luZG93cyIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisKKy8qCisgIExpZ2h0d2VpZ2h0IHN5bmNocm9uaXphdGlvbiBvYmplY3RzIHRoYXQgb25seSBtYWtlIHNlbnNlIG9uIFdpbmRvd3MuICBGb3IgY3Jvc3MtcGxhdGZvcm0KKyAgY29kZSwgdXNlIHRoZSBjbGFzc2VzIGZvdW5kIGluIHRoZSBjb25jdXJyZW5jeSBuYW1lc3BhY2UKKyovCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3N0cnVjdCBUQ3JpdGljYWxTZWN0aW9uIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgQ1JJVElDQUxfU0VDVElPTiBjczsKKyAgVENyaXRpY2FsU2VjdGlvbigpIHsgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmY3MpOyB9CisgIH5UQ3JpdGljYWxTZWN0aW9uKCkgeyBEZWxldGVDcml0aWNhbFNlY3Rpb24oJmNzKTsgfQorfTsKKworY2xhc3MgVEF1dG9Dcml0IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3ByaXZhdGU6CisgIENSSVRJQ0FMX1NFQ1RJT04qIGNzXzsKKworcHVibGljOgorICBleHBsaWNpdCBUQXV0b0NyaXQoVENyaXRpY2FsU2VjdGlvbiYgY3MpIDogY3NfKCZjcy5jcykgeyBFbnRlckNyaXRpY2FsU2VjdGlvbihjc18pOyB9CisgIH5UQXV0b0NyaXQoKSB7IExlYXZlQ3JpdGljYWxTZWN0aW9uKGNzXyk7IH0KK307CisKK3N0cnVjdCBUQXV0b1Jlc2V0RXZlbnQgOiBib29zdDo6bm9uY29weWFibGUgeworICBIQU5ETEUgaDsKKworICBUQXV0b1Jlc2V0RXZlbnQoKSB7CisgICAgaCA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEF1dG9SZXNldEV2ZW50IHVuYWJsZSB0byBjcmVhdGUgZXZlbnQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJDcmVhdGVFdmVudCBmYWlsZWQiKTsKKyAgICB9CisgIH0KKyAgflRBdXRvUmVzZXRFdmVudCgpIHsgQ2xvc2VIYW5kbGUoaCk7IH0KK307CisKK3N0cnVjdCBUTWFudWFsUmVzZXRFdmVudCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIEhBTkRMRSBoOworCisgIFRNYW51YWxSZXNldEV2ZW50KCkgeworICAgIGggPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE1hbnVhbFJlc2V0RXZlbnQgdW5hYmxlIHRvIGNyZWF0ZSBldmVudCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oIkNyZWF0ZUV2ZW50IGZhaWxlZCIpOworICAgIH0KKyAgfQorICB+VE1hbnVhbFJlc2V0RXZlbnQoKSB7IENsb3NlSGFuZGxlKGgpOyB9Cit9OworCitzdHJ1Y3QgVEF1dG9IYW5kbGUgOiBib29zdDo6bm9uY29weWFibGUgeworICBIQU5ETEUgaDsKKyAgZXhwbGljaXQgVEF1dG9IYW5kbGUoSEFORExFIGhfID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIDogaChoXykge30KKyAgflRBdXRvSGFuZGxlKCkgeworICAgIGlmIChoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgQ2xvc2VIYW5kbGUoaCk7CisgIH0KKworICBIQU5ETEUgcmVsZWFzZSgpIHsKKyAgICBIQU5ETEUgcmV0dmFsID0gaDsKKyAgICBoID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorICB2b2lkIHJlc2V0KEhBTkRMRSBoXyA9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgaWYgKGhfID09IGgpCisgICAgICByZXR1cm47CisgICAgaWYgKGggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICBDbG9zZUhhbmRsZShoKTsKKyAgICBoID0gaF87CisgIH0KK307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjgzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKworLy8gYm9vc3QKKyNpbmNsdWRlIDxib29zdC9hc3NlcnQuaHBwPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUV2luc29ja1NpbmdsZXRvbjo6aW5zdGFuY2VfcHRyIFRXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHJfKE5VTEwpOworc3RkOjpvbmNlX2ZsYWcgVFdpbnNvY2tTaW5nbGV0b246OmZsYWdzXzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RXaW5zb2NrU2luZ2xldG9uOjpUV2luc29ja1NpbmdsZXRvbih2b2lkKSB7CisgIFdPUkQgdmVyc2lvbihNQUtFV09SRCgyLCAyKSk7CisgIFdTQURhdGEgZGF0YSA9IHswfTsKKworICBpbnQgZXJyb3IoV1NBU3RhcnR1cCh2ZXJzaW9uLCAmZGF0YSkpOworICBpZiAoZXJyb3IgIT0gMCkgeworICAgIEJPT1NUX0FTU0VSVChmYWxzZSk7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBXaW5zb2NrLiIpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUV2luc29ja1NpbmdsZXRvbjo6flRXaW5zb2NrU2luZ2xldG9uKHZvaWQpIHsKKyAgV1NBQ2xlYW51cCgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKHZvaWQpIHsKKyAgc3RkOjpjYWxsX29uY2UoZmxhZ3NfLCBpbml0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmluaXQodm9pZCkgeworICBpbnN0YW5jZV9wdHJfLnJlc2V0KG5ldyBUV2luc29ja1NpbmdsZXRvbik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDgwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9XSU5ET1dTX1RXSU5TT0NLU0lOR0xFVE9OX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1dJTkRPV1NfVFdJTlNPQ0tTSU5HTEVUT05fSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKy8vIGJvb3N0CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBXaW5zb2NrMiBtdXN0IGJlIGludGlhbGlzZWQgb25jZSBvbmx5IGluIG9yZGVyIHRvIGNyZWF0ZSBzb2NrZXRzLiBUaGlzIGNsYXNzCisgKiBwZXJmb3JtcyBhIG9uZSB0aW1lIGluaXRpYWxpc2F0aW9uIHdoZW4gY3JlYXRlIGlzIGNhbGxlZC4KKyAqLworY2xhc3MgVFdpbnNvY2tTaW5nbGV0b24gOiBwcml2YXRlIGJvb3N0Ojpub25jb3B5YWJsZSB7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8VFdpbnNvY2tTaW5nbGV0b24+IGluc3RhbmNlX3B0cjsKKworcHJpdmF0ZToKKyAgVFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisKK3B1YmxpYzoKKyAgflRXaW5zb2NrU2luZ2xldG9uKHZvaWQpOworCitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGNyZWF0ZSh2b2lkKTsKKworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgaW5pdCh2b2lkKTsKKworcHJpdmF0ZToKKyAgc3RhdGljIGluc3RhbmNlX3B0ciBpbnN0YW5jZV9wdHJfOworICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZ3NfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gX1RIUklGVF9UUkFOU1BPUlRfV0lORE9XU19UV0lOU09DS1NJTkdMRVRPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDdlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1dpbkZjbnRsLmg+CisKK2ludCB0aHJpZnRfZmNudGwoVEhSSUZUX1NPQ0tFVCBmZCwgaW50IGNtZCwgaW50IGZsYWdzKSB7CisgIGlmIChjbWQgIT0gVEhSSUZUX0ZfR0VURkwgJiYgY21kICE9IFRIUklGVF9GX1NFVEZMKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGZsYWdzICE9IFRIUklGVF9PX05PTkJMT0NLICYmIGZsYWdzICE9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoY21kID09IFRIUklGVF9GX0dFVEZMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpbnQgcmVzOworICBpZiAoZmxhZ3MpIHsKKyAgICByZXMgPSBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgcmVpbnRlcnByZXRfY2FzdDx1X2xvbmcqPigmKGZsYWdzID0gMSkpKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgcmVpbnRlcnByZXRfY2FzdDx1X2xvbmcqPigmKGZsYWdzID0gMCkpKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKyNpZiBXSU5WRVIgPD0gMHgwNTAyIC8vIFhQLCBTZXJ2ZXIyMDAzCitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpIHsKKyAgZmRfc2V0IHJlYWRfZmRzLCB3cml0ZV9mZHM7CisgIGZkX3NldCogcmVhZF9mZHNfcHRyID0gTlVMTDsKKyAgZmRfc2V0KiB3cml0ZV9mZHNfcHRyID0gTlVMTDsKKworICBGRF9aRVJPKCZyZWFkX2Zkcyk7CisgIEZEX1pFUk8oJndyaXRlX2Zkcyk7CisKKyAgZm9yIChVTE9ORyBpID0gMDsgaSA8IG5mZHM7IGkrKykgeworICAgIC8vIFJlYWQgKGluKSBzb2NrZXQKKyAgICBpZiAoKGZkQXJyYXlbaV0uZXZlbnRzICYgVEhSSUZUX1BPTExJTikgPT0gVEhSSUZUX1BPTExJTikgeworICAgICAgcmVhZF9mZHNfcHRyID0gJnJlYWRfZmRzOworICAgICAgRkRfU0VUKGZkQXJyYXlbaV0uZmQsICZyZWFkX2Zkcyk7CisgICAgfQorICAgIC8vIFdyaXRlIChvdXQpIHNvY2tldAorICAgIGVsc2UgaWYgKChmZEFycmF5W2ldLmV2ZW50cyAmIFRIUklGVF9QT0xMT1VUKSA9PSBUSFJJRlRfUE9MTE9VVCkgeworICAgICAgd3JpdGVfZmRzX3B0ciA9ICZ3cml0ZV9mZHM7CisgICAgICBGRF9TRVQoZmRBcnJheVtpXS5mZCwgJndyaXRlX2Zkcyk7CisgICAgfQorICB9CisKKyAgdGltZXZhbCB0aW1lX291dDsKKyAgdGltZXZhbCogdGltZV9vdXRfcHRyID0gTlVMTDsKKyAgaWYgKHRpbWVvdXQgPj0gMCkgeworICAgIHRpbWVfb3V0LnR2X3NlYyA9IHRpbWVvdXQgLyAxMDAwOworICAgIHRpbWVfb3V0LnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDApICogMTAwMDsKKyAgICB0aW1lX291dF9wdHIgPSAmdGltZV9vdXQ7CisgIH0gZWxzZSB7IC8vIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCisgICAgKHZvaWQpdGltZV9vdXQ7CisgICAgKHZvaWQpdGltZW91dDsKKyAgfQorCisgIGludCBza3RyZWFkeSA9IHNlbGVjdCgxLCByZWFkX2Zkc19wdHIsIHdyaXRlX2Zkc19wdHIsIE5VTEwsIHRpbWVfb3V0X3B0cik7CisgIGlmIChza3RyZWFkeSA+IDApIHsKKyAgICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgICBmZEFycmF5W2ldLnJldmVudHMgPSAwOworICAgICAgaWYgKEZEX0lTU0VUKGZkQXJyYXlbaV0uZmQsICZyZWFkX2ZkcykpCisgICAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyB8PSBUSFJJRlRfUE9MTElOOworICAgICAgaWYgKEZEX0lTU0VUKGZkQXJyYXlbaV0uZmQsICZ3cml0ZV9mZHMpKQorICAgICAgICBmZEFycmF5W2ldLnJldmVudHMgfD0gVEhSSUZUX1BPTExPVVQ7CisgICAgfQorICB9CisgIHJldHVybiBza3RyZWFkeTsKK30KKyNlbHNlICAvLyBWaXN0YSwgV2luNy4uLgoraW50IHRocmlmdF9wb2xsKFRIUklGVF9QT0xMRkQqIGZkQXJyYXksIFVMT05HIG5mZHMsIElOVCB0aW1lb3V0KSB7CisgIHJldHVybiBXU0FQb2xsKGZkQXJyYXksIG5mZHMsIHRpbWVvdXQpOworfQorI2VuZGlmIC8vIFdJTlZFUgorCisjaWZkZWYgX1dJTjMyX1dDRQorc3RkOjpzdHJpbmcgdGhyaWZ0X3dzdHIyc3RyKHN0ZDo6d3N0cmluZyB3cykgeworICBzdGQ6OnN0cmluZyBzKHdzLmJlZ2luKCksIHdzLmVuZCgpKTsKKyAgcmV0dXJuIHM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfRkNOVExfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0ZDTlRMX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzJfV0NFCisjaW5jbHVkZSA8c3RyaW5nPgorI2VuZGlmCisKKy8vIFdpbjMyCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZiBXSU5WRVIgPD0gMHgwNTAyIC8vIFhQLCBTZXJ2ZXIyMDAzCitzdHJ1Y3QgdGhyaWZ0X3BvbGxmZCB7CisgIFRIUklGVF9TT0NLRVQgZmQ7CisgIFNIT1JUIGV2ZW50czsKKyAgU0hPUlQgcmV2ZW50czsKK307CisjZW5kaWYKKworZXh0ZXJuICJDIiB7CitpbnQgdGhyaWZ0X2ZjbnRsKFRIUklGVF9TT0NLRVQgZmQsIGludCBjbWQsIGludCBmbGFncyk7CitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpOworfQorCisjaWZkZWYgX1dJTjMyX1dDRQorc3RkOjpzdHJpbmcgdGhyaWZ0X3dzdHIyc3RyKHN0ZDo6d3N0cmluZyB3cyk7CisjZW5kaWYKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19GQ05UTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY0NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgorI2VuZGlmCisKKy8vIHVzZSBzdGQ6OnRocmVhZCBpbiBNU1ZDMTEgKDIwMTIpIG9yIG5ld2VyIGFuZCBpbiBNaW5HVworI2lmIChfTVNDX1ZFUiA+PSAxNzAwKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2RlZmluZSBVU0VfU1REX1RIUkVBRCAxCisjZW5kaWYKKworLy8gU29tZXRoaW5nIHRoYXQgZGVmaW5lcyBQUklkNjQgaXMgcmVxdWlyZWQgdG8gYnVpbGQKKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLy8gVlMyMDEwIG9yIGxhdGVyIGhhcyBzdGRpbnQuaCBhcyBkb2VzIE1pbkdXCisjaWYgKF9NU0NfVkVSID49IDE2MDApIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorI2VuZGlmCisKKyNpZm5kZWYgVEFSR0VUX1dJTl9YUAorI2RlZmluZSBUQVJHRVRfV0lOX1hQIDEKKyNlbmRpZgorCisjaWYgVEFSR0VUX1dJTl9YUAorI2lmbmRlZiBXSU5WRVIKKyNkZWZpbmUgV0lOVkVSIDB4MDUwMQorI2VuZGlmCisjaWZuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMl9XSU5OVAorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNjAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfTV9YNjQpCisjZGVmaW5lIEFSSVRITUVUSUNfUklHSFRfU0hJRlQgMQorI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQorI2VuZGlmCisKKyNpZm5kZWYgX19NSU5HVzMyX18KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDk5NikgLy8gRGVwcmVjYXRlZCBwb3NpeCBuYW1lLgorI2VuZGlmCisKKyNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQorI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvLyBNdXN0IGJlIHVzaW5nIFZTMjAxMCBvciBsYXRlciwgb3IgYm9vc3QsIHNvIHRoYXQgQzk5IHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxib29zdC9jc3RkaW50LmhwcD4KKwordHlwZWRlZiBib29zdDo6aW50NjRfdCBpbnQ2NF90OwordHlwZWRlZiBib29zdDo6dWludDY0X3QgdWludDY0X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQzMl90IGludDMyX3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MzJfdCB1aW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDE2X3QgaW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQxNl90IHVpbnQxNl90OwordHlwZWRlZiBib29zdDo6aW50OF90IGludDhfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ4X3QgdWludDhfdDsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL09wZXJhdG9ycy5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmg+CisKKy8vIHdpbmRvd3MKKyNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjaWZuZGVmIF9fTUlOR1czMl9fCisgICNpZmRlZiBfV0lOMzJfV0NFCisgICNwcmFnbWEgY29tbWVudChsaWIsICJXczIubGliIikKKyAgI2Vsc2UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMl8zMi5saWIiKQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiYWR2YXBpMzIubGliIikgLy8gRm9yIHNlY3VyaXR5IEFQSXMgaW4gVFBpcGVTZXJ2ZXIKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIlNobHdhcGkubGliIikgIC8vIEZvciBTdHJTdHJJQSBpbiBUUGlwZVNlcnZlcgorICAjZW5kaWYKKyNlbmRpZiAvLyBfX01JTkdXMzJfXworCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTIwYzIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotCi11aW50MzJfdCBUQnVmZmVyZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGhhdmUgPSByQm91bmRfIC0gckJhc2VfOwotCi0gIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBzYXRpc2Z5IHRoZSByZWFkCi0gIC8vIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgotICBhc3NlcnQoaGF2ZSA8IGxlbik7Ci0KLSAgLy8gSWYgd2UgaGF2ZSBzb21lIGRhdGUgaW4gdGhlIGJ1ZmZlciwgY29weSBpdCBvdXQgYW5kIHJldHVybiBpdC4KLSAgLy8gV2UgaGF2ZSB0byByZXR1cm4gaXQgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSwgc2luY2Ugd2UgYXJlbid0Ci0gIC8vIGd1YXJhbnRlZWQgdGhhdCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYWN0dWFsbHkgaGFzIG1vcmUgZGF0YSwgc28KLSAgLy8gYXR0ZW1wdGluZyB0byByZWFkIGZyb20gaXQgY291bGQgYmxvY2suCi0gIGlmIChoYXZlID4gMCkgewotICAgIG1lbWNweShidWYsIHJCYXNlXywgaGF2ZSk7Ci0gICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7Ci0gICAgcmV0dXJuIGhhdmU7Ci0gIH0KLQotICAvLyBObyBkYXRhIGlzIGF2YWlsYWJsZSBpbiBvdXIgYnVmZmVyLgotICAvLyBHZXQgbW9yZSBmcm9tIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVwIHRvIGJ1ZmZlciBzaXplLgotICAvLyBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGxvdCBvZiBzZW5zZSBpZiBsZW4gPCByQnVmU2l6ZV8KLSAgLy8gYW5kIGFsbW9zdCBubyBzZW5zZSBvdGhlcndpc2UuICBUT0RPKGRyZWlzcyk6IEZpeCB0aGF0Ci0gIC8vIGNhc2UgKHBvc3NpYmx5IGluY2x1ZGluZyBzb21lIHJlYWR2IGhvdG5lc3MpLgotICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCB0cmFuc3BvcnRfLT5yZWFkKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pKTsKLQotICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KLSAgdWludDMyX3QgZ2l2ZSA9IHN0ZDo6bWluKGxlbiwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pKTsKLSAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBnaXZlKTsKLSAgckJhc2VfICs9IGdpdmU7Ci0KLSAgcmV0dXJuIGdpdmU7Ci19Ci0KLXZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHdCYXNlXyAtIHdCdWZfLmdldCgpOwotICB1aW50MzJfdCBzcGFjZSA9IHdCb3VuZF8gLSB3QmFzZV87Ci0gIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBhY2NvbW9kYXRlIHRoZSB3cml0ZQotICAvLyB3aXRoIHRoZSBmcmVlIHNwYWNlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KLSAgYXNzZXJ0KHdCb3VuZF8gLSB3QmFzZV8gPCBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikpOwotCi0gIC8vIE5vdyBoZXJlJ3MgdGhlIHRyaWNreSBxdWVzdGlvbjogc2hvdWxkIHdlIGNvcHkgZGF0YSBmcm9tIGJ1ZiBpbnRvIG91cgotICAvLyBpbnRlcm5hbCBidWZmZXIgYW5kIHdyaXRlIGl0IGZyb20gdGhlcmUsIG9yIHNob3VsZCB3ZSBqdXN0IHdyaXRlIG91dAotICAvLyB0aGUgY3VycmVudCBpbnRlcm5hbCBidWZmZXIgaW4gb25lIHN5c2NhbGwgYW5kIHdyaXRlIG91dCBidWYgaW4gYW5vdGhlci4KLSAgLy8gSWYgb3VyIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIHBsdXMgYnVmIGlzIGF0IGxlYXN0IGRvdWJsZSBvdXIgYnVmZmVyCi0gIC8vIHNpemUsIHdlIHdpbGwgaGF2ZSB0byBkbyB0d28gc3lzY2FsbHMgbm8gbWF0dGVyIHdoYXQgKGV4Y2VwdCBpbiB0aGUKLSAgLy8gZGVnZW5lcmF0ZSBjYXNlIHdoZW4gb3VyIGJ1ZmZlciBpcyBlbXB0eSksIHNvIHRoZXJlIGlzIG5vIHVzZSBjb3B5aW5nLgotICAvLyBPdGhlcndpc2UsIHRoZXJlIGlzIHNvcnQgb2YgYSBzbGlkaW5nIHNjYWxlLiAgSWYgd2UgaGF2ZSBOLTEgYnl0ZXMKLSAgLy8gYnVmZmVyZWQgYW5kIG5lZWQgdG8gd3JpdGUgMiwgaXQgd291bGQgYmUgY3JhenkgdG8gZG8gdHdvIHN5c2NhbGxzLgotICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgaGF2ZSAyIGJ5dGVzIGJ1ZmZlcmVkIGFuZCBhcmUgd3JpdGluZyAyTi0zLAotICAvLyB3ZSBjYW4gc2F2ZSBhIHN5c2NhbGwgaW4gdGhlIHNob3J0IHRlcm0gYnkgbG9hZGluZyB1cCBvdXIgYnVmZmVyLCB3cml0aW5nCi0gIC8vIGl0IG91dCwgYW5kIGNvcHlpbmcgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIGludG8gb3VyIGJ1ZmZlci4gIE9mIGNvdXJzZSwKLSAgLy8gaWYgd2UgZ2V0IGFub3RoZXIgMi1ieXRlIHdyaXRlLCB3ZSBoYXZlbid0IHNhdmVkIGFueSBzeXNjYWxscyBhdCBhbGwsCi0gIC8vIGFuZCBoYXZlIGp1c3QgY29waWVkIG5lYXJseSAyTiBieXRlcyBmb3Igbm90aGluZy4gIEZpbmRpbmcgYSBwZXJmZWN0Ci0gIC8vIHBvbGljeSB3b3VsZCByZXF1aXJlIHByZWRpY3RpbmcgdGhlIHNpemUgb2YgZnV0dXJlIHdyaXRlcywgc28gd2UncmUganVzdAotICAvLyBnb2luZyB0byBhbHdheXMgZXNjaGV3IHN5c2NhbGxzIGlmIHdlIGhhdmUgbGVzcyB0aGFuIDJOIGJ5dGVzIHRvIHdyaXRlLgotCi0gIC8vIFRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gZG8gdHdvIHN5c2NhbGxzLgotICAvLyBUaGlzIGNhc2UgYWxzbyBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBpcyBlbXB0eSwKLSAgLy8gYnV0IGl0IGlzIGNsZWFyZXIgKEkgdGhpbmspIHRvIHRoaW5rIG9mIGl0IGFzIHR3byBzZXBhcmF0ZSBjYXNlcy4KLSAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqd0J1ZlNpemVfKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkgewotICAgIC8vIFRPRE8oZHJlaXNzKTogd3JpdGV2Ci0gICAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7Ci0gICAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZV9ieXRlcyk7Ci0gICAgfQotICAgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKLSAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBGaWxsIHVwIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGEgd3JpdGUuCi0gIG1lbWNweSh3QmFzZV8sIGJ1Ziwgc3BhY2UpOwotICBidWYgKz0gc3BhY2U7Ci0gIGxlbiAtPSBzcGFjZTsKLSAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0KLSAgLy8gQ29weSB0aGUgcmVzdCBpbnRvIG91ciBidWZmZXIuCi0gIGFzc2VydChsZW4gPCB3QnVmU2l6ZV8pOwotICBtZW1jcHkod0J1Zl8uZ2V0KCksIGJ1ZiwgbGVuKTsKLSAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBsZW47Ci0gIHJldHVybjsKLX0KLQotY29uc3QgdWludDhfdCogVEJ1ZmZlcmVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICAodm9pZCkgbGVuOwotICAvLyBTaW1wbHkgcmV0dXJuIE5VTEwuICBXZSBkb24ndCBrbm93IGlmIHRoZXJlIGlzIGFjdHVhbGx5IGRhdGEgYXZhaWxhYmxlIG9uCi0gIC8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgc28gY2FsbGluZyByZWFkKCkgbWlnaHQgYmxvY2suCi0gIHJldHVybiBOVUxMOwotfQotCi12b2lkIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSAgewotICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLgotICB1aW50MzJfdCBoYXZlX2J5dGVzID0gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7Ci0gIGlmIChoYXZlX2J5dGVzID4gMCkgewotICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKLSAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZV9ieXRlcyk7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci19Ci0KLQotdWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3Qgd2FudCA9IGxlbjsKLSAgdWludDMyX3QgaGF2ZSA9IHJCb3VuZF8gLSByQmFzZV87Ci0KLSAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IHNhdGlzZnkgdGhlIHJlYWQKLSAgLy8gd2l0aCB0aGUgZGF0YSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCi0gIGFzc2VydChoYXZlIDwgd2FudCk7Ci0KLSAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZS4KLSAgaWYgKGhhdmUgPiAwKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBoYXZlKTsKLSAgICB3YW50IC09IGhhdmU7Ci0gICAgYnVmICs9IGhhdmU7Ci0gIH0KLQotICAvLyBSZWFkIGFub3RoZXIgZnJhbWUuCi0gIGlmICghcmVhZEZyYW1lKCkpIHsKLSAgICAvLyBFT0YuICBObyBmcmFtZSBhdmFpbGFibGUuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IFNob3VsZCB3ZSB3YXJuIHdoZW4gcmVhZHMgY3Jvc3MgZnJhbWVzPwotCi0gIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlLgotICB1aW50MzJfdCBnaXZlID0gc3RkOjptaW4od2FudCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pKTsKLSAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBnaXZlKTsKLSAgckJhc2VfICs9IGdpdmU7Ci0gIHdhbnQgLT0gZ2l2ZTsKLQotICByZXR1cm4gKGxlbiAtIHdhbnQpOwotfQotCi1ib29sIFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRGcmFtZSgpIHsKLSAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCB1c2luZyByZWFkdiBoZXJlLCBldmVuIHRob3VnaCBpdCB3b3VsZAotICAvLyByZXN1bHQgaW4gKGdhc3ApIHJlYWQtYWhlYWQuCi0KLSAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBmcmFtZS4KLSAgLy8gV2UgY2FuJ3QgdXNlIHJlYWRBbGwoJnN6LCBzaXplb2Yoc3opKSwgc2luY2UgdGhhdCBhbHdheXMgdGhyb3dzIGFuCi0gIC8vIGV4Y2VwdGlvbiBvbiBFT0YuICBXZSB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvbmx5IGlmIEVPRiBvY2N1cnMgYWZ0ZXIKLSAgLy8gcGFydGlhbCBzaXplIGRhdGEuCi0gIGludDMyX3Qgc3o7Ci0gIHVpbnQzMl90IHNpemVfYnl0ZXNfcmVhZCA9IDA7Ci0gIHdoaWxlIChzaXplX2J5dGVzX3JlYWQgPCBzaXplb2Yoc3opKSB7Ci0gICAgdWludDhfdCogc3pwID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6KSArIHNpemVfYnl0ZXNfcmVhZDsKLSAgICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHNpemVvZihzeikgLSBzaXplX2J5dGVzX3JlYWQpOwotICAgIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICAgIGlmIChzaXplX2J5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICAvLyBFT0YgYmVmb3JlIGFueSBkYXRhIHdhcyByZWFkLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBFT0YgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lIGhlYWRlci4gIFJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQgYWZ0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aWFsIGZyYW1lIGhlYWRlci4iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2l6ZV9ieXRlc19yZWFkICs9IGJ5dGVzX3JlYWQ7Ci0gIH0KLQotICBzeiA9IG50b2hsKHN6KTsKLQotICBpZiAoc3ogPCAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSBoYXMgbmVnYXRpdmUgdmFsdWUiKTsKLSAgfQotCi0gIC8vIFJlYWQgdGhlIGZyYW1lIHBheWxvYWQsIGFuZCByZXNldCBtYXJrZXJzLgotICBpZiAoc3ogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihyQnVmU2l6ZV8pKSB7Ci0gICAgckJ1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbc3pdKTsKLSAgICByQnVmU2l6ZV8gPSBzejsKLSAgfQotICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpLCBzeik7Ci0gIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIC8vIERvdWJsZSBidWZmZXIgc2l6ZSB1bnRpbCBzdWZmaWNpZW50LgotICB1aW50MzJfdCBoYXZlID0gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7Ci0gIHVpbnQzMl90IG5ld19zaXplID0gd0J1ZlNpemVfOwotICB3aGlsZSAobmV3X3NpemUgPCBsZW4gKyBoYXZlKSB7Ci0gICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA+IDAgPyBuZXdfc2l6ZSAqIDIgOiAxOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtb2RpZnlpbmcgdGhpcyBjbGFzcyB0byB1c2UgbWFsbG9jL2ZyZWUKLSAgLy8gc28gd2UgY2FuIHVzZSByZWFsbG9jIGhlcmUuCi0KLSAgLy8gQWxsb2NhdGUgbmV3IGJ1ZmZlci4KLSAgdWludDhfdCogbmV3X2J1ZiA9IG5ldyB1aW50OF90W25ld19zaXplXTsKLQotICAvLyBDb3B5IHRoZSBvbGQgYnVmZmVyIHRvIHRoZSBuZXcgb25lLgotICBtZW1jcHkobmV3X2J1Ziwgd0J1Zl8uZ2V0KCksIGhhdmUpOwotCi0gIC8vIE5vdyBwb2ludCBidWYgdG8gdGhlIG5ldyBvbmUuCi0gIHdCdWZfLnJlc2V0KG5ld19idWYpOwotICB3QnVmU2l6ZV8gPSBuZXdfc2l6ZTsKLSAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBoYXZlOwotICB3Qm91bmRfID0gd0J1Zl8uZ2V0KCkgKyB3QnVmU2l6ZV87Ci0KLSAgLy8gQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBuZXcgYnVmZmVyLgotICBtZW1jcHkod0Jhc2VfLCBidWYsIGxlbik7Ci0gIHdCYXNlXyArPSBsZW47Ci19Ci0KLXZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6Zmx1c2goKSAgewotICBpbnQzMl90IHN6X2hibywgc3pfbmJvOwotICBhc3NlcnQod0J1ZlNpemVfID4gc2l6ZW9mKHN6X25ibykpOwotCi0gIC8vIFNsaXAgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KLSAgc3pfaGJvID0gd0Jhc2VfIC0gKHdCdWZfLmdldCgpICsgc2l6ZW9mKHN6X25ibykpOwotICBzel9uYm8gPSAoaW50MzJfdClodG9ubCgodWludDMyX3QpKHN6X2hibykpOwotICBtZW1jcHkod0J1Zl8uZ2V0KCksICh1aW50OF90Kikmc3pfbmJvLCBzaXplb2Yoc3pfbmJvKSk7Ci0KLSAgaWYgKHN6X2hibyA+IDApIHsKLSAgICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd0Jhc2VfICh3aXRoIGEgcGFkIGZvciB0aGUgZnJhbWUgc2l6ZSkKLSAgICAvLyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZSB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlCi0gICAgLy8gKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cwotICAgIC8vIHVwIGFuIGV4Y2VwdGlvbgotICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc2l6ZW9mKHN6X25ibyk7Ci0KLSAgICAvLyBXcml0ZSBzaXplIGFuZCBmcmFtZSBib2R5LgotICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBzaXplb2Yoc3pfbmJvKStzel9oYm8pOwotICB9Ci0KLSAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotfQotCi11aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZUVuZCgpIHsKLSAgcmV0dXJuIHdCYXNlXyAtIHdCdWZfLmdldCgpOwotfQotCi1jb25zdCB1aW50OF90KiBURnJhbWVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICAodm9pZCkgbGVuOwotICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KLSAgLy8gSWYgdGhlIGZhc3QgcGF0aCBmYWlsZWQgbGV0IHRoZSBwcm90b2NvbCB1c2UgaXRzIHNsb3cgcGF0aC4KLSAgLy8gQmVzaWRlcywgd2hvIGlzIGdvaW5nIHRvIHRyeSB0byBib3Jyb3cgYWNyb3NzIG1lc3NhZ2VzPwotICByZXR1cm4gTlVMTDsKLX0KLQotdWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKLSAgLy8gaW5jbHVkZSBmcmFtaW5nIGJ5dGVzCi0gIHJldHVybiByQm91bmRfIC0gckJ1Zl8uZ2V0KCkgKyBzaXplb2YodWludDMyX3QpOwotfQotCi12b2lkIFRNZW1vcnlCdWZmZXI6OmNvbXB1dGVSZWFkKHVpbnQzMl90IGxlbiwgdWludDhfdCoqIG91dF9zdGFydCwgdWludDMyX3QqIG91dF9naXZlKSB7Ci0gIC8vIENvcnJlY3QgckJvdW5kXyBzbyB3ZSBjYW4gdXNlIHRoZSBmYXN0IHBhdGggaW4gdGhlIGZ1dHVyZS4KLSAgckJvdW5kXyA9IHdCYXNlXzsKLQotICAvLyBEZWNpZGUgaG93IG11Y2ggdG8gZ2l2ZS4KLSAgdWludDMyX3QgZ2l2ZSA9IHN0ZDo6bWluKGxlbiwgYXZhaWxhYmxlX3JlYWQoKSk7Ci0KLSAgKm91dF9zdGFydCA9IHJCYXNlXzsKLSAgKm91dF9naXZlID0gZ2l2ZTsKLQotICAvLyBQcmVpbmNyZW1lbnQgckJhc2VfIHNvIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHRvLgotICByQmFzZV8gKz0gZ2l2ZTsKLX0KLQotdWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDhfdCogc3RhcnQ7Ci0gIHVpbnQzMl90IGdpdmU7Ci0gIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7Ci0KLSAgLy8gQ29weSBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuCi0gIG1lbWNweShidWYsIHN0YXJ0LCBnaXZlKTsKLQotICByZXR1cm4gZ2l2ZTsKLX0KLQotdWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQzMl90IGxlbikgewotICAvLyBEb24ndCBnZXQgc29tZSBzdHVwaWQgYXNzZXJ0aW9uIGZhaWx1cmUuCi0gIGlmIChidWZmZXJfID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHVpbnQ4X3QqIHN0YXJ0OwotICB1aW50MzJfdCBnaXZlOwotICBjb21wdXRlUmVhZChsZW4sICZzdGFydCwgJmdpdmUpOwotCi0gIC8vIEFwcGVuZCB0byB0aGUgcHJvdmlkZWQgc3RyaW5nLgotICBzdHIuYXBwZW5kKChjaGFyKilzdGFydCwgZ2l2ZSk7Ci0KLSAgcmV0dXJuIGdpdmU7Ci19Ci0KLXZvaWQgVE1lbW9yeUJ1ZmZlcjo6ZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKSB7Ci0gIC8vIENoZWNrIGF2YWlsYWJsZSBzcGFjZQotICB1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOwotICBpZiAobGVuIDw9IGF2YWlsKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFvd25lcl8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnN1ZmZpY2llbnQgc3BhY2UgaW4gZXh0ZXJuYWwgTWVtb3J5QnVmZmVyIik7Ci0gIH0KLQotICAvLyBHcm93IHRoZSBidWZmZXIgYXMgbmVjZXNzYXJ5LgotICB1aW50MzJfdCBuZXdfc2l6ZSA9IGJ1ZmZlclNpemVfOwotICB3aGlsZSAobGVuID4gYXZhaWwpIHsKLSAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4gMCA/IG5ld19zaXplICogMiA6IDE7Ci0gICAgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKSArIChuZXdfc2l6ZSAtIGJ1ZmZlclNpemVfKTsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGludG8gYSBuZXcgcG9pbnRlciBzbyB3ZSBkb24ndCBib3JrIG91cnMgaWYgaXQgZmFpbHMuCi0gIHZvaWQqIG5ld19idWZmZXIgPSBzdGQ6OnJlYWxsb2MoYnVmZmVyXywgbmV3X3NpemUpOwotICBpZiAobmV3X2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgfQotICBidWZmZXJTaXplXyA9IG5ld19zaXplOwotCi0gIHB0cmRpZmZfdCBvZmZzZXQgPSAodWludDhfdCopbmV3X2J1ZmZlciAtIGJ1ZmZlcl87Ci0gIGJ1ZmZlcl8gKz0gb2Zmc2V0OwotICByQmFzZV8gKz0gb2Zmc2V0OwotICByQm91bmRfICs9IG9mZnNldDsKLSAgd0Jhc2VfICs9IG9mZnNldDsKLSAgd0JvdW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJTaXplXzsKLX0KLQotdm9pZCBUTWVtb3J5QnVmZmVyOjp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgZW5zdXJlQ2FuV3JpdGUobGVuKTsKLQotICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlciBhbmQgaW5jcmVtZW50IHdCYXNlXy4KLSAgbWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOwotICB3QmFzZV8gKz0gbGVuOwotfQotCi12b2lkIFRNZW1vcnlCdWZmZXI6Ondyb3RlQnl0ZXModWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7Ci0gIGlmIChsZW4gPiBhdmFpbCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNsaWVudCB3cm90ZSBtb3JlIGJ5dGVzIHRoYW4gc2l6ZSBvZiBidWZmZXIuIik7Ci0gIH0KLSAgd0Jhc2VfICs9IGxlbjsKLX0KLQotY29uc3QgdWludDhfdCogVE1lbW9yeUJ1ZmZlcjo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgKHZvaWQpIGJ1ZjsKLSAgckJvdW5kXyA9IHdCYXNlXzsKLSAgaWYgKGF2YWlsYWJsZV9yZWFkKCkgPj0gKmxlbikgewotICAgICpsZW4gPSBhdmFpbGFibGVfcmVhZCgpOwotICAgIHJldHVybiByQmFzZV87Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQ1MmQ1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXyAxCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgImJvb3N0L3Njb3BlZF9hcnJheS5ocHAiCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgVERCX0xJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAxKSkKLSNkZWZpbmUgVERCX1VOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVERCX0xJS0VMWSh2YWwpICh2YWwpCi0jZGVmaW5lIFREQl9VTkxJS0VMWSh2YWwpICh2YWwpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0cmFuc3BvcnRzIHRoYXQgdXNlIHJlYWQvd3JpdGUgYnVmZmVycyBmb3IgcGVyZm9ybWFuY2UuCi0gKgotICogVEJ1ZmZlckJhc2UgaXMgZGVzaWduZWQgdG8gaW1wbGVtZW50IHRoZSBmYXN0LXBhdGggIm1lbWNweSIgc3R5bGUKLSAqIG9wZXJhdGlvbnMgdGhhdCB3b3JrIGluIHRoZSBjb21tb24gY2FzZS4gIEl0IGRvZXMgc28gd2l0aCBzbWFsbCBhbmQKLSAqIChldmVudHVhbGx5KSBub252aXJ0dWFsLCBpbmxpbmFibGUgbWV0aG9kcy4gIFRCdWZmZXJCYXNlIGlzIGFuIGFic3RyYWN0Ci0gKiBjbGFzcy4gIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIGRlZmluZSB0aGUgInNsb3cgcGF0aCIgb3BlcmF0aW9ucwotICogdGhhdCBoYXZlIHRvIGJlIGRvbmUgd2hlbiB0aGUgYnVmZmVycyBhcmUgZnVsbCBvciBlbXB0eS4KLSAqCi0gKi8KLWNsYXNzIFRCdWZmZXJCYXNlIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRCdWZmZXJCYXNlPiB7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEZhc3QtcGF0aCByZWFkLgotICAgKgotICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGRhdGEgYnVmZmVyZWQgdG8gZnVsZmlsbCB0aGUgcmVhZCwgd2UgY2FuIHNhdGlzZnkgaXQKLSAgICogd2l0aCBhIHNpbmdsZSBtZW1jcHksIHRoZW4gYWRqdXN0IG91ciBpbnRlcm5hbCBwb2ludGVycy4gIElmIHRoZSBidWZmZXIKLSAgICogaXMgZW1wdHksIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCi0gICAqIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGV2ZW50dWFsbHkgYmUgbm9udmlydHVhbCBhbmQgaW5saW5hYmxlLgotICAgKi8KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHVpbnQ4X3QqIG5ld19yQmFzZSA9IHJCYXNlXyArIGxlbjsKLSAgICBpZiAoVERCX0xJS0VMWShuZXdfckJhc2UgPD0gckJvdW5kXykpIHsKLSAgICAgIHN0ZDo6bWVtY3B5KGJ1ZiwgckJhc2VfLCBsZW4pOwotICAgICAgckJhc2VfID0gbmV3X3JCYXNlOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWRTbG93KGJ1ZiwgbGVuKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaG9ydGN1dHRlZCB2ZXJzaW9uIG9mIHJlYWRBbGwuCi0gICAqLwotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdWludDhfdCogbmV3X3JCYXNlID0gckJhc2VfICsgbGVuOwotICAgIGlmIChUREJfTElLRUxZKG5ld19yQmFzZSA8PSByQm91bmRfKSkgewotICAgICAgc3RkOjptZW1jcHkoYnVmLCByQmFzZV8sIGxlbik7Ci0gICAgICByQmFzZV8gPSBuZXdfckJhc2U7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICByZXR1cm4gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6cmVhZEFsbCgqdGhpcywgYnVmLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIEZhc3QtcGF0aCB3cml0ZS4KLSAgICoKLSAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBlbXB0eSBzcGFjZSBpbiBvdXIgYnVmZmVyIHRvIGFjY29tb2RhdGUgdGhlIHdyaXRlLCB3ZQotICAgKiBjYW4gc2F0aXNmeSBpdCB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLgotICAgKiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEKLSAgICogc3ViY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kCi0gICAqIGlubGluYWJsZS4KLSAgICovCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB1aW50OF90KiBuZXdfd0Jhc2UgPSB3QmFzZV8gKyBsZW47Ci0gICAgaWYgKFREQl9MSUtFTFkobmV3X3dCYXNlIDw9IHdCb3VuZF8pKSB7Ci0gICAgICBzdGQ6Om1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKLSAgICAgIHdCYXNlXyA9IG5ld193QmFzZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd3JpdGVTbG93KGJ1ZiwgbGVuKTsKLSAgfQotCi0gIC8qKgotICAgKiBGYXN0LXBhdGggYm9ycm93LiAgQSBsb3QgbGlrZSB0aGUgZmFzdC1wYXRoIHJlYWQuCi0gICAqLwotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PigqbGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgewotICAgICAgLy8gV2l0aCBzdHJpY3QgYWxpYXNpbmcsIHdyaXRpbmcgdG8gbGVuIHNob3VsZG4ndCBmb3JjZSB1cyB0bwotICAgICAgLy8gcmVmZXRjaCByQmFzZV8gZnJvbSBtZW1vcnkuICBUT0RPKGRyZWlzcyk6IFZlcmlmeSB0aGlzLgotICAgICAgKmxlbiA9IHJCb3VuZF8gLSByQmFzZV87Ci0gICAgICByZXR1cm4gckJhc2VfOwotICAgIH0KLSAgICByZXR1cm4gYm9ycm93U2xvdyhidWYsIGxlbik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3VtZSBkb2Vzbid0IHJlcXVpcmUgYSBzbG93IHBhdGguCi0gICAqLwotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pIDw9IHJCb3VuZF8gLSByQmFzZV8pKSB7Ci0gICAgICByQmFzZV8gKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKLSAgICB9Ci0gIH0KLQotCi0gcHJvdGVjdGVkOgotCi0gIC8vLyBTbG93IHBhdGggcmVhZC4KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwotCi0gIC8vLyBTbG93IHBhdGggd3JpdGUuCi0gIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKLQotICAvKioKLSAgICogU2xvdyBwYXRoIGJvcnJvdy4KLSAgICoKLSAgICogUE9TVENPTkRJVElPTjogcmV0dXJuID09IE5VTEwgfHwgckJvdW5kXyAtIHJCYXNlXyA+PSAqbGVuCi0gICAqLwotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFRyaXZpYWwgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEluaXRpYWxpemUgcG9pbnRlcnMgc2FmZWx5LiAgQ29uc3RydWN0aW5nIGlzIG5vdCBhIHZlcnkKLSAgICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIG9wZXJhdGlvbiwgc28gaXQgaXMgb2theSB0byBqdXN0IGxlYXZlIGl0IHRvCi0gICAqIHRoZSBjb25jcmV0ZSBjbGFzcyB0byBzZXQgdXAgcG9pbnRlcnMgY29ycmVjdGx5LgotICAgKi8KLSAgVEJ1ZmZlckJhc2UoKQotICAgIDogckJhc2VfKE5VTEwpCi0gICAgLCByQm91bmRfKE5VTEwpCi0gICAgLCB3QmFzZV8oTlVMTCkKLSAgICAsIHdCb3VuZF8oTlVMTCkKLSAge30KLQotICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgcmVhZCBidWZmZXIuCi0gIHZvaWQgc2V0UmVhZEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJCYXNlXyA9IGJ1ZjsKLSAgICByQm91bmRfID0gYnVmK2xlbjsKLSAgfQotCi0gIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSB3cml0ZSBidWZmZXIuCi0gIHZvaWQgc2V0V3JpdGVCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB3QmFzZV8gPSBidWY7Ci0gICAgd0JvdW5kXyA9IGJ1ZitsZW47Ci0gIH0KLQotICB2aXJ0dWFsIH5UQnVmZmVyQmFzZSgpIHt9Ci0KLSAgLy8vIFJlYWRzIGJlZ2luIGhlcmUuCi0gIHVpbnQ4X3QqIHJCYXNlXzsKLSAgLy8vIFJlYWRzIG1heSBleHRlbmQgdG8ganVzdCBiZWZvcmUgaGVyZS4KLSAgdWludDhfdCogckJvdW5kXzsKLQotICAvLy8gV3JpdGVzIGJlZ2luIGhlcmUuCi0gIHVpbnQ4X3QqIHdCYXNlXzsKLSAgLy8vIFdyaXRlcyBtYXkgZXh0ZW5kIHRvIGp1c3QgYmVmb3JlIGhlcmUuCi0gIHVpbnQ4X3QqIHdCb3VuZF87Ci19OwotCi0KLS8qKgotICogQnVmZmVyZWQgdHJhbnNwb3J0LiBGb3IgcmVhZHMgaXQgd2lsbCByZWFkIG1vcmUgZGF0YSB0aGFuIGlzIHJlcXVlc3RlZAotICogYW5kIHdpbGwgc2VydmUgZnV0dXJlIGRhdGEgb3V0IG9mIGEgbG9jYWwgYnVmZmVyLiBGb3Igd3JpdGVzLCBkYXRhIGlzCi0gKiBzdG9yZWQgdG8gYW4gaW4gbWVtb3J5IGJ1ZmZlciBiZWZvcmUgYmVpbmcgd3JpdHRlbiBvdXQuCi0gKgotICovCi1jbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQKLSAgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBUQnVmZmVyQmFzZT4gewotIHB1YmxpYzoKLQotICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0KLSAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSkKLSAgICAsIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKQotICB7Ci0gICAgaW5pdFBvaW50ZXJzKCk7Ci0gIH0KLQotICAvLy8gVXNlIHNwZWNpZmllZCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oc3opCi0gICAgLCB3QnVmU2l6ZV8oc3opCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgLy8vIFVzZSBzcGVjaWZpZWQgcmVhZCBhbmQgd3JpdGUgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCByc3osIHVpbnQzMl90IHdzeikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKHJzeikKLSAgICAsIHdCdWZTaXplXyh3c3opCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIGJvb2wgcGVlaygpIHsKLSAgICBpZiAockJhc2VfID09IHJCb3VuZF8pIHsKLSAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHRyYW5zcG9ydF8tPnJlYWQockJ1Zl8uZ2V0KCksIHJCdWZTaXplXykpOwotICAgIH0KLSAgICByZXR1cm4gKHJCb3VuZF8gPiByQmFzZV8pOwotICB9Ci0KLSAgdm9pZCBjbG9zZSgpIHsKLSAgICBmbHVzaCgpOwotICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2aXJ0dWFsIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIGZsdXNoKCk7Ci0KLQotICAvKioKLSAgICogVGhlIGZvbGxvd2luZyBiZWhhdmlvciBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYnkgVEJ1ZmZlcmVkVHJhbnNwb3J0LAotICAgKiBidXQgdGhhdCBtYXkgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb246Ci0gICAqIDEvIElmIGxlbiBpcyBhdCBtb3N0IHJCdWZTaXplXywgYm9ycm93IHdpbGwgbmV2ZXIgcmV0dXJuIE5VTEwuCi0gICAqICAgIERlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIGl0IGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbgotICAgKiAgICBvciBoYW5nIGZvcmV2ZXIuCi0gICAqIDIvIFNvbWUgYm9ycm93IHJlcXVlc3RzIG1heSBjb3B5IGJ5dGVzIGludGVybmFsbHkuICBIb3dldmVyLAotICAgKiAgICBpZiBsZW4gaXMgYXQgbW9zdCByQnVmU2l6ZV8vMiwgbm9uZSBvZiB0aGUgY29waWVkIGJ5dGVzCi0gICAqICAgIHdpbGwgZXZlciBoYXZlIHRvIGJlIGNvcGllZCBhZ2Fpbi4gIEZvciBvcHRpbWlhbCBwZXJmb3JtYW5jZSwKLSAgICogICAgc3RheSB1bmRlciB0aGlzIGxpbWl0LgotICAgKi8KLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0XzsKLSAgfQotCi0gIC8qCi0gICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCi0gICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCi0gICAqLwotICB1c2luZyBUQnVmZmVyQmFzZTo6cmVhZEFsbDsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBpbml0UG9pbnRlcnMoKSB7Ci0gICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7Ci0gICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0gICAgLy8gV3JpdGUgc2l6ZSBuZXZlciBjaGFuZ2VzLgotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLQotICB1aW50MzJfdCByQnVmU2l6ZV87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKLX07Ci0KLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICoKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykpOwotICB9Ci0KLX07Ci0KLQotLyoqCi0gKiBGcmFtZWQgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcwotICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKLSAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCi0gKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KLSAqCi0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQKLSAgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZyYW1lZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKLSBwdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwotCi0gIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRGcmFtZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oMCkKLSAgICAsIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKQotICAgICwgckJ1Zl8oKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oMCkKLSAgICAsIHdCdWZTaXplXyhzeikKLSAgICAsIHJCdWZfKCkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIGZsdXNoKCk7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gIHVpbnQzMl90IHJlYWRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUVuZCgpOwotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfOwotICB9Ci0KLSAgLyoKLSAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KLSAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KLSAgICovCi0gIHVzaW5nIFRCdWZmZXJCYXNlOjpyZWFkQWxsOwotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICoKLSAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCi0gICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKLSAgICovCi0gIGJvb2wgcmVhZEZyYW1lKCk7Ci0KLSAgdm9pZCBpbml0UG9pbnRlcnMoKSB7Ci0gICAgc2V0UmVhZEJ1ZmZlcihOVUxMLCAwKTsKLSAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKLQotICAgIC8vIFBhZCB0aGUgYnVmZmVyIHNvIHdlIGNhbiBpbnNlcnQgdGhlIHNpemUgbGF0ZXIuCi0gICAgaW50MzJfdCBwYWQgPSAwOwotICAgIHRoaXMtPndyaXRlKCh1aW50OF90KikmcGFkLCBzaXplb2YocGFkKSk7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotCi0gIHVpbnQzMl90IHJCdWZTaXplXzsKLSAgdWludDMyX3Qgd0J1ZlNpemVfOwotICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHJCdWZfOwotICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHdCdWZfOwotfTsKLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgZnJhbWVkIG9uZS4KLSAqCi0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGZyYW1lZCBvbmUuCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucykpOwotICB9Ci0KLX07Ci0KLQotLyoqCi0gKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCi0gKiBpbiBtZW1vcnkgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkgcGxhY2VkCi0gKiBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0IGJ1ZmZlci4KLSAqCi0gKiBUaGUgYnVmZmVycyBhcmUgYWxsb2NhdGVkIHVzaW5nIEMgY29uc3RydWN0cyBtYWxsb2MscmVhbGxvYywgYW5kIHRoZSBzaXplCi0gKiBkb3VibGVzIGFzIG5lY2Vzc2FyeS4gIFdlJ3ZlIGNvbnNpZGVyZWQgdXNpbmcgc2NvcGVkCi0gKgotICovCi1jbGFzcyBUTWVtb3J5QnVmZmVyIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRNZW1vcnlCdWZmZXIsIFRCdWZmZXJCYXNlPiB7Ci0gcHJpdmF0ZToKLQotICAvLyBDb21tb24gaW5pdGlhbGl6YXRpb24gZG9uZSBieSBhbGwgY29uc3RydWN0b3JzLgotICB2b2lkIGluaXRDb21tb24odWludDhfdCogYnVmLCB1aW50MzJfdCBzaXplLCBib29sIG93bmVyLCB1aW50MzJfdCB3UG9zKSB7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHNpemUgIT0gMCkgewotICAgICAgYXNzZXJ0KG93bmVyKTsKLSAgICAgIGJ1ZiA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlcl8gPSBidWY7Ci0gICAgYnVmZmVyU2l6ZV8gPSBzaXplOwotCi0gICAgckJhc2VfID0gYnVmZmVyXzsKLSAgICByQm91bmRfID0gYnVmZmVyXyArIHdQb3M7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBJbnZlc3RpZ2F0ZSBOVUxMLWluZyB0aGlzIGlmICFvd25lci4KLSAgICB3QmFzZV8gPSBidWZmZXJfICsgd1BvczsKLSAgICB3Qm91bmRfID0gYnVmZmVyXyArIGJ1ZmZlclNpemVfOwotCi0gICAgb3duZXJfID0gb3duZXI7Ci0KLSAgICAvLyByQm91bmRfIGlzIHJlYWxseSBhbiBhcnRpZmFjdC4gIEluIHByaW5jaXBsZSwgaXQgc2hvdWxkIGFsd2F5cyBiZQotICAgIC8vIGVxdWFsIHRvIHdCYXNlXy4gIFdlIHVwZGF0ZSBpdCBpbiBhIGZldyBwbGFjZXMgKGNvbXB1dGVSZWFkLCBldGMuKS4KLSAgfQotCi0gcHVibGljOgotICBzdGF0aWMgY29uc3QgdWludDMyX3QgZGVmYXVsdFNpemUgPSAxMDI0OwotCi0gIC8qKgotICAgKiBUaGlzIGVudW0gc3BlY2lmaWVzIGhvdyBhIFRNZW1vcnlCdWZmZXIgc2hvdWxkIHRyZWF0Ci0gICAqIG1lbW9yeSBwYXNzZWQgdG8gaXQgdmlhIGNvbnN0cnVjdG9ycyBvciByZXNldEJ1ZmZlci4KLSAgICoKLSAgICogT0JTRVJWRToKLSAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgc2ltcGx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5LgotICAgKiAgIEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBwb2ludGVyCi0gICAqICAgcmVtYWlucyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBUTWVtb3J5QnVmZmVyLAotICAgKiAgIGFuZCB0aGF0IGl0IGlzIHByb3Blcmx5IGNsZWFuZWQgdXAuCi0gICAqICAgTm90ZSB0aGF0IG5vIGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gb2JzZXJ2ZWQgYnVmZmVycy4KLSAgICoKLSAgICogQ09QWToKLSAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgbWFrZSBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBidWZmZXIuCi0gICAqICAgVGhlIGNhbGxlciBoYXMgbm8gcmVzcG9uc2liaWxpdGllcy4KLSAgICoKLSAgICogVEFLRV9PV05FUlNISVA6Ci0gICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIGJlY29tZSB0aGUgIm93bmVyIiBvZiB0aGUgYnVmZmVyLAotICAgKiAgIGFuZCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgotICAgKiAgIFRoZSBtZW1ib3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG1hbGxvYy4KLSAgICovCi0gIGVudW0gTWVtb3J5UG9saWN5Ci0gIHsgT0JTRVJWRSA9IDEKLSAgLCBDT1BZID0gMgotICAsIFRBS0VfT1dORVJTSElQID0gMwotICB9OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBkZWZhdWx0LXNpemVkIGJ1ZmZlciwKLSAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgotICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcigpIHsKLSAgICBpbml0Q29tbW9uKE5VTEwsIGRlZmF1bHRTaXplLCB0cnVlLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBidWZmZXIgb2YgYSBzcGVjaWZpZWQgc2l6ZSwKLSAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gc3ogIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAgICovCi0gIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsKLSAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYnVmIGFzIGl0cyBpbml0aWFsIGNvbnRlbnRzLgotICAgKgotICAgKiBAcGFyYW0gYnVmICAgIFRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAqICAgICAgICAgICAgICAgTm90ZSB0aGF0LCB3aGlsZSBidWYgaXMgYSBub24tY29uc3QgcG9pbnRlciwKLSAgICogICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyIHdpbGwgbm90IHdyaXRlIHRvIGl0IGlmIHBvbGljeSA9PSBPQlNFUlZFLAotICAgKiAgICAgICAgICAgICAgIHNvIGl0IGlzIHNhZmUgdG8gY29uc3RfY2FzdDx1aW50OF90Kj4od2hhdGV2ZXIpLgotICAgKiBAcGFyYW0gc3ogICAgIFRoZSBzaXplIG9mIEBjIGJ1Zi4KLSAgICogQHBhcmFtIHBvbGljeSBTZWUgQGxpbmsgTWVtb3J5UG9saWN5IEBlbmRsaW5rIC4KLSAgICovCi0gIFRNZW1vcnlCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBzeiwgTWVtb3J5UG9saWN5IHBvbGljeSA9IE9CU0VSVkUpIHsKLSAgICBpZiAoYnVmID09IE5VTEwgJiYgc3ogIT0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRNZW1vcnlCdWZmZXIgZ2l2ZW4gbnVsbCBidWZmZXIgd2l0aCBub24temVybyBzaXplLiIpOwotICAgIH0KLQotICAgIHN3aXRjaCAocG9saWN5KSB7Ci0gICAgICBjYXNlIE9CU0VSVkU6Ci0gICAgICBjYXNlIFRBS0VfT1dORVJTSElQOgotICAgICAgICBpbml0Q29tbW9uKGJ1Ziwgc3osIHBvbGljeSA9PSBUQUtFX09XTkVSU0hJUCwgc3opOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ09QWToKLSAgICAgICAgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7Ci0gICAgICAgIHRoaXMtPndyaXRlKGJ1Ziwgc3opOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTWVtb3J5UG9saWN5IGZvciBUTWVtb3J5QnVmZmVyIik7Ci0gICAgfQotICB9Ci0KLSAgflRNZW1vcnlCdWZmZXIoKSB7Ci0gICAgaWYgKG93bmVyXykgewotICAgICAgc3RkOjpmcmVlKGJ1ZmZlcl8pOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHt9Ci0KLSAgdm9pZCBjbG9zZSgpIHt9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIGJ1ZlB0ciBjb25zdC4KLSAgdm9pZCBnZXRCdWZmZXIodWludDhfdCoqIGJ1ZlB0ciwgdWludDMyX3QqIHN6KSB7Ci0gICAgKmJ1ZlB0ciA9IHJCYXNlXzsKLSAgICAqc3ogPSB3QmFzZV8gLSByQmFzZV87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRCdWZmZXJBc1N0cmluZygpIHsKLSAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIHVpbnQ4X3QqIGJ1ZjsKLSAgICB1aW50MzJfdCBzejsKLSAgICBnZXRCdWZmZXIoJmJ1ZiwgJnN6KTsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUpc3opOwotICB9Ci0KLSAgdm9pZCBhcHBlbmRCdWZmZXJUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90KiBidWY7Ci0gICAgdWludDMyX3Qgc3o7Ci0gICAgZ2V0QnVmZmVyKCZidWYsICZzeik7Ci0gICAgc3RyLmFwcGVuZCgoY2hhciopYnVmLCBzeik7Ci0gIH0KLQotICB2b2lkIHJlc2V0QnVmZmVyKCkgewotICAgIHJCYXNlXyA9IGJ1ZmZlcl87Ci0gICAgckJvdW5kXyA9IGJ1ZmZlcl87Ci0gICAgd0Jhc2VfID0gYnVmZmVyXzsKLSAgICAvLyBJdCBpc24ndCBzYWZlIHRvIHdyaXRlIGludG8gYSBidWZmZXIgd2UgZG9uJ3Qgb3duLgotICAgIGlmICghb3duZXJfKSB7Ci0gICAgICB3Qm91bmRfID0gd0Jhc2VfOwotICAgICAgYnVmZmVyU2l6ZV8gPSAwOwotICAgIH0KLSAgfQotCi0gIC8vLyBTZWUgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbi4KLSAgdm9pZCByZXNldEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IHN6LCBNZW1vcnlQb2xpY3kgcG9saWN5ID0gT0JTRVJWRSkgewotICAgIC8vIFVzZSBhIHZhcmlhbnQgb2YgdGhlIGNvcHktYW5kLXN3YXAgdHJpY2sgZm9yIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgotICAgIC8vIFRoaXMgaXMgc3ViLW9wdGltYWwgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UgZm9yIHR3byByZWFzb25zOgotICAgIC8vICAgMS8gVGhlIGNvbnN0cnVjdGluZyBhbmQgc3dhcHBpbmcgb2YgdGhlIChzbWFsbCkgdmFsdWVzCi0gICAgLy8gICAgICBpbiB0aGUgdGVtcG9yYXJ5IG9iamVjdCB0YWtlcyBzb21lIHRpbWUsIGFuZCBpcyBub3QgbmVjZXNzYXJ5LgotICAgIC8vICAgMi8gSWYgcG9saWN5ID09IENPUFksIHdlIGFsbG9jYXRlIHRoZSBuZXcgYnVmZmVyIGJlZm9yZQotICAgIC8vICAgICAgZnJlZWluZyB0aGUgb2xkIG9uZSwgcHJlY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YKLSAgICAvLyAgICAgIHJldXNpbmcgdGhhdCBtZW1vcnkuCi0gICAgLy8gSSBkb3VidCB0aGF0IGVpdGhlciBvZiB0aGVzZSBwcm9ibGVtcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXdheSwKLSAgICAvLyBidXQgdGhlIHNlY29uZCBpcyBwcm9iYWJseSBubyBhIGNvbW1vbiBjYXNlLCBhbmQgdGhlIGZpcnN0IGlzIG1pbm9yLgotICAgIC8vIEkgZG9uJ3QgZXhwZWN0IHJlc2V0QnVmZmVyIHRvIGJlIGEgY29tbW9uIG9wZXJhdGlvbiwgc28gSSdtIHdpbGxpbmcgdG8KLSAgICAvLyBiaXRlIHRoZSBwZXJmb3JtYW5jZSBidWxsZXQgdG8gbWFrZSB0aGUgbWV0aG9kIHRoaXMgc2ltcGxlLgotCi0gICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgYnVmZmVyLgotICAgIFRNZW1vcnlCdWZmZXIgbmV3X2J1ZmZlcihidWYsIHN6LCBwb2xpY3kpOwotICAgIC8vIE1vdmUgaXQgaW50byBvdXJzZWxmLgotICAgIHRoaXMtPnN3YXAobmV3X2J1ZmZlcik7Ci0gICAgLy8gT3VyIG9sZCBzZWxmIGdldHMgZGVzdHJveWVkLgotICB9Ci0KLSAgLy8vIFNlZSBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uLgotICB2b2lkIHJlc2V0QnVmZmVyKHVpbnQzMl90IHN6KSB7Ci0gICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgYnVmZmVyLgotICAgIFRNZW1vcnlCdWZmZXIgbmV3X2J1ZmZlcihzeik7Ci0gICAgLy8gTW92ZSBpdCBpbnRvIG91cnNlbGYuCi0gICAgdGhpcy0+c3dhcChuZXdfYnVmZmVyKTsKLSAgICAvLyBPdXIgb2xkIHNlbGYgZ2V0cyBkZXN0cm95ZWQuCi0gIH0gICAgCi0KLSAgc3RkOjpzdHJpbmcgcmVhZEFzU3RyaW5nKHVpbnQzMl90IGxlbikgewotICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICAodm9pZClyZWFkQXBwZW5kVG9TdHJpbmcoc3RyLCBsZW4pOwotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKTsKLQotICAvLyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLSAgdWludDMyX3QgcmVhZEVuZCgpIHsKLSAgICB1aW50MzJfdCBieXRlcyA9IHJCYXNlXyAtIGJ1ZmZlcl87Ci0gICAgaWYgKHJCYXNlXyA9PSB3QmFzZV8pIHsKLSAgICAgIHJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBieXRlczsKLSAgfQotCi0gIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICB1aW50MzJfdCB3cml0ZUVuZCgpIHsKLSAgICByZXR1cm4gd0Jhc2VfIC0gYnVmZmVyXzsKLSAgfQotCi0gIHVpbnQzMl90IGF2YWlsYWJsZV9yZWFkKCkgY29uc3QgewotICAgIC8vIFJlbWVtYmVyLCB3QmFzZV8gaXMgdGhlIHJlYWwgckJvdW5kXy4KLSAgICByZXR1cm4gd0Jhc2VfIC0gckJhc2VfOwotICB9Ci0KLSAgdWludDMyX3QgYXZhaWxhYmxlX3dyaXRlKCkgY29uc3QgewotICAgIHJldHVybiB3Qm91bmRfIC0gd0Jhc2VfOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNsaWVudCBjYW4gd3JpdGUgZGF0YSB0byBhcHBlbmQgdG8KLSAgLy8gdGhlIFRNZW1vcnlCdWZmZXIsIGFuZCBlbnN1cmVzIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBhY2NvbW9kYXRlIGEKLSAgLy8gd3JpdGUgb2YgdGhlIHByb3ZpZGVkIGxlbmd0aC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHZlcnkgY29udmVuaWVudCBmb3IKLSAgLy8gcGFzc2luZyB0byByZWFkKCksIHJlY3YoKSwgb3Igc2ltaWxhci4gWW91IG11c3QgY2FsbCB3cm90ZUJ5dGVzKCkgYXMgc29vbgotICAvLyBhcyBkYXRhIGlzIHdyaXR0ZW4gb3IgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBhd2FyZSB0aGF0IGRhdGEgaGFzIGNoYW5nZWQuCi0gIHVpbnQ4X3QqIGdldFdyaXRlUHRyKHVpbnQzMl90IGxlbikgewotICAgIGVuc3VyZUNhbldyaXRlKGxlbik7Ci0gICAgcmV0dXJuIHdCYXNlXzsKLSAgfQotCi0gIC8vIEluZm9ybXMgdGhlIGJ1ZmZlciB0aGF0IHRoZSBjbGllbnQgaGFzIHdyaXR0ZW4gJ2xlbicgYnl0ZXMgaW50byBzdG9yYWdlCi0gIC8vIHRoYXQgaGFkIGJlZW4gcHJvdmlkZWQgYnkgZ2V0V3JpdGVQdHIoKS4KLSAgdm9pZCB3cm90ZUJ5dGVzKHVpbnQzMl90IGxlbik7Ci0KLSAgLyoKLSAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KLSAgICogV2Ugd2FudCB0byB1c2UgdGhlIFRCdWZmZXJCYXNlIHZlcnNpb24gaW5zdGVhZC4KLSAgICovCi0gIHVzaW5nIFRCdWZmZXJCYXNlOjpyZWFkQWxsOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgewotICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGJ1ZmZlcl8sICAgICB0aGF0LmJ1ZmZlcl8pOwotICAgIHN3YXAoYnVmZmVyU2l6ZV8sIHRoYXQuYnVmZmVyU2l6ZV8pOwotCi0gICAgc3dhcChyQmFzZV8sICAgICAgdGhhdC5yQmFzZV8pOwotICAgIHN3YXAockJvdW5kXywgICAgIHRoYXQuckJvdW5kXyk7Ci0gICAgc3dhcCh3QmFzZV8sICAgICAgdGhhdC53QmFzZV8pOwotICAgIHN3YXAod0JvdW5kXywgICAgIHRoYXQud0JvdW5kXyk7Ci0KLSAgICBzd2FwKG93bmVyXywgICAgICB0aGF0Lm93bmVyXyk7Ci0gIH0KLQotICAvLyBNYWtlIHN1cmUgdGhlcmUncyBhdCBsZWFzdCAnbGVuJyBieXRlcyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCi0gIHZvaWQgZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKTsKLQotICAvLyBDb21wdXRlIHRoZSBwb3NpdGlvbiBhbmQgYXZhaWxhYmxlIGRhdGEgZm9yIHJlYWRpbmcuCi0gIHZvaWQgY29tcHV0ZVJlYWQodWludDMyX3QgbGVuLCB1aW50OF90Kiogb3V0X3N0YXJ0LCB1aW50MzJfdCogb3V0X2dpdmUpOwotCi0gIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gIC8vIERhdGEgYnVmZmVyCi0gIHVpbnQ4X3QqIGJ1ZmZlcl87Ci0KLSAgLy8gQWxsb2NhdGVkIGJ1ZmZlciBzaXplCi0gIHVpbnQzMl90IGJ1ZmZlclNpemVfOwotCi0gIC8vIElzIHRoaXMgb2JqZWN0IHRoZSBvd25lciBvZiB0aGUgYnVmZmVyPwotICBib29sIG93bmVyXzsKLQotICAvLyBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIGNvbnN0cmN0b3JzLCBpbml0Q29tbW9uLCBhbmQgc3dhcCBpZgotICAvLyB5b3UgYWRkIG5ldyBtZW1iZXJzLgotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDc5ZmEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXZvaWQgVEZEVHJhbnNwb3J0OjpjbG9zZSgpIHsKLSAgaWYgKCFpc09wZW4oKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBydiA9IDo6Y2xvc2UoZmRfKTsKLSAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgZmRfID0gLTE7Ci0gIC8vIEhhdmUgdG8gY2hlY2sgdW5jYXVnaHRfZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIGRlc3RydWN0b3IuCi0gIGlmIChydiA8IDAgJiYgIXN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0OjpjbG9zZSgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXVpbnQzMl90IFRGRFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1bnNpZ25lZCBpbnQgbWF4UmV0cmllcyA9IDU7IC8vIHNhbWUgYXMgdGhlIFRTb2NrZXQgZGVmYXVsdAotICB1bnNpZ25lZCBpbnQgcmV0cmllcyA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc3NpemVfdCBydiA9IDo6cmVhZChmZF8sIGJ1ZiwgbGVuKTsKLSAgICBpZiAocnYgPCAwKSB7Ci0gICAgICBpZiAoZXJybm8gPT0gRUlOVFIgJiYgcmV0cmllcyA8IG1heFJldHJpZXMpIHsKLSAgICAgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgotICAgICAgICArK3JldHJpZXM7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6cmVhZCgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7Ci0gICAgfQotICAgIHJldHVybiBydjsKLSAgfQotfQotCi12b2lkIFRGRFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICBzc2l6ZV90IHJ2ID0gOjp3cml0ZShmZF8sIGJ1ZiwgbGVuKTsKLQotICAgIGlmIChydiA8IDApIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKLSAgICB9IGVsc2UgaWYgKHJ2ID09IDApIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiKTsKLSAgICB9Ci0KLSAgICBidWYgKz0gcnY7Ci0gICAgbGVuIC09IHJ2OwotICB9Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMWEzZTYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFZpcnR1YWxUcmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBEZWFkLXNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIGZpbGUgZGVzY3JpcHRvci4KLSAqCi0gKi8KLWNsYXNzIFRGRFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxURkRUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6Ci0gIGVudW0gQ2xvc2VQb2xpY3kKLSAgeyBOT19DTE9TRV9PTl9ERVNUUk9ZID0gMAotICAsIENMT1NFX09OX0RFU1RST1kgPSAxCi0gIH07Ci0KLSAgVEZEVHJhbnNwb3J0KGludCBmZCwgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5ID0gTk9fQ0xPU0VfT05fREVTVFJPWSkKLSAgICA6IGZkXyhmZCkKLSAgICAsIGNsb3NlX3BvbGljeV8oY2xvc2VfcG9saWN5KQotICB7fQotCi0gIH5URkRUcmFuc3BvcnQoKSB7Ci0gICAgaWYgKGNsb3NlX3BvbGljeV8gPT0gQ0xPU0VfT05fREVTVFJPWSkgewotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsgcmV0dXJuIGZkXyA+PSAwOyB9Ci0KLSAgdm9pZCBvcGVuKCkge30KLQotICB2b2lkIGNsb3NlKCk7Ci0KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCBzZXRGRChpbnQgZmQpIHsgZmRfID0gZmQ7IH0KLSAgaW50IGdldEZEKCkgeyByZXR1cm4gZmRfOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludCBmZF87Ci0gIENsb3NlUG9saWN5IGNsb3NlX3BvbGljeV87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJhMDkzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiVEZpbGVUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUVHJhbnNwb3J0VXRpbHMuaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpZmRlZiBIQVZFX1NZU19USU1FX0gKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgYm9vc3Q6OnNjb3BlZF9wdHI7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotCi0jaWZuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQotCi0vKioKLSAqIEZha2UgY2xvY2tfZ2V0dGltZSBmb3Igc3lzdGVtcyBsaWtlIGRhcndpbgotICoKLSAqLwotI2RlZmluZSBDTE9DS19SRUFMVElNRSAwCi1zdGF0aWMgaW50IGNsb2NrX2dldHRpbWUoaW50IGNsa19pZCAvKmlnbm9yZWQqLywgc3RydWN0IHRpbWVzcGVjICp0cCkgewotICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0KLSAgaW50IHJ2ID0gZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOwotICBpZiAocnYgIT0gMCkgewotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHRwLT50dl9zZWMgPSBub3cudHZfc2VjOwotICB0cC0+dHZfbnNlYyA9IG5vdy50dl91c2VjICogMTAwMDsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotVEZpbGVUcmFuc3BvcnQ6OlRGaWxlVHJhbnNwb3J0KHN0cmluZyBwYXRoLCBib29sIHJlYWRPbmx5KQotICA6IHJlYWRTdGF0ZV8oKQotICAsIHJlYWRCdWZmXyhOVUxMKQotICAsIGN1cnJlbnRFdmVudF8oTlVMTCkKLSAgLCByZWFkQnVmZlNpemVfKERFRkFVTFRfUkVBRF9CVUZGX1NJWkUpCi0gICwgcmVhZFRpbWVvdXRfKE5PX1RBSUxfUkVBRF9USU1FT1VUKQotICAsIGNodW5rU2l6ZV8oREVGQVVMVF9DSFVOS19TSVpFKQotICAsIGV2ZW50QnVmZmVyU2l6ZV8oREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSkKLSAgLCBmbHVzaE1heFVzXyhERUZBVUxUX0ZMVVNIX01BWF9VUykKLSAgLCBmbHVzaE1heEJ5dGVzXyhERUZBVUxUX0ZMVVNIX01BWF9CWVRFUykKLSAgLCBtYXhFdmVudFNpemVfKERFRkFVTFRfTUFYX0VWRU5UX1NJWkUpCi0gICwgbWF4Q29ycnVwdGVkRXZlbnRzXyhERUZBVUxUX01BWF9DT1JSVVBURURfRVZFTlRTKQotICAsIGVvZlNsZWVwVGltZV8oREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUykKLSAgLCBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV8oREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUykKLSAgLCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyhERUZBVUxUX1dSSVRFUl9USFJFQURfU0xFRVBfVElNRV9VUykKLSAgLCB3cml0ZXJUaHJlYWRJZF8oMCkKLSAgLCBkZXF1ZXVlQnVmZmVyXyhOVUxMKQotICAsIGVucXVldWVCdWZmZXJfKE5VTEwpCi0gICwgY2xvc2luZ18oZmFsc2UpCi0gICwgZm9yY2VGbHVzaF8oZmFsc2UpCi0gICwgZmlsZW5hbWVfKHBhdGgpCi0gICwgZmRfKDApCi0gICwgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKGZhbHNlKQotICAsIG9mZnNldF8oMCkKLSAgLCBsYXN0QmFkQ2h1bmtfKDApCi0gICwgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18oMCkKLSAgLCByZWFkT25seV8ocmVhZE9ubHkpCi17Ci0gIC8vIGluaXRpYWxpemUgYWxsIHRoZSBjb25kaXRpb24gdmFycy9tdXRleGVzCi0gIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXhfLCBOVUxMKTsKLSAgcHRocmVhZF9jb25kX2luaXQoJm5vdEZ1bGxfLCBOVUxMKTsKLSAgcHRocmVhZF9jb25kX2luaXQoJm5vdEVtcHR5XywgTlVMTCk7Ci0gIHB0aHJlYWRfY29uZF9pbml0KCZmbHVzaGVkXywgTlVMTCk7Ci0KLSAgb3BlbkxvZ0ZpbGUoKTsKLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6cmVzZXRPdXRwdXRGaWxlKGludCBmZCwgc3RyaW5nIGZpbGVuYW1lLCBpbnQ2NF90IG9mZnNldCkgewotICBmaWxlbmFtZV8gPSBmaWxlbmFtZTsKLSAgb2Zmc2V0XyA9IG9mZnNldDsKLQotICAvLyBjaGVjayBpZiBjdXJyZW50IGZpbGUgaXMgc3RpbGwgb3BlbgotICBpZiAoZmRfID4gMCkgewotICAgIC8vIGZsdXNoIGFueSBldmVudHMgaW4gdGhlIHF1ZXVlCi0gICAgZmx1c2goKTsKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJlcnJvciwgY3VycmVudCBmaWxlICglcykgbm90IGNsb3NlZCIsIGZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICBpZiAoLTEgPT0gOjpjbG9zZShmZF8pKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHJlc2V0T3V0cHV0RmlsZSgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRGaWxlVHJhbnNwb3J0OiBlcnJvciBpbiBmaWxlIGNsb3NlIiwgZXJybm9fY29weSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vc3VjY2Vzc2Z1bGx5IGNsb3NlZCBmZAotICAgICAgZmRfID0gMDsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmQpIHsKLSAgICBmZF8gPSBmZDsKLSAgfSBlbHNlIHsKLSAgICAvLyBvcGVuIGZpbGUgaWYgdGhlIGlucHV0IGZkIGlzIDAKLSAgICBvcGVuTG9nRmlsZSgpOwotICB9Ci19Ci0KLQotVEZpbGVUcmFuc3BvcnQ6On5URmlsZVRyYW5zcG9ydCgpIHsKLSAgLy8gZmx1c2ggdGhlIGJ1ZmZlciBpZiBhIHdyaXRlciB0aHJlYWQgaXMgYWN0aXZlCi0gIGlmICh3cml0ZXJUaHJlYWRJZF8gPiAwKSB7Ci0gICAgLy8gc2V0IHN0YXRlIHRvIGNsb3NpbmcKLSAgICBjbG9zaW5nXyA9IHRydWU7Ci0KLSAgICAvLyB3YWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkCi0gICAgLy8gU2luY2UgY2xvc2luZ18gaXMgdHJ1ZSwgaXQgd2lsbCBhdHRlbXB0IHRvIGZsdXNoIGFsbCBkYXRhLCB0aGVuIGV4aXQuCi0gICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbm90RW1wdHlfKTsKLQotICAgIHB0aHJlYWRfam9pbih3cml0ZXJUaHJlYWRJZF8sIE5VTEwpOwotICAgIHdyaXRlclRocmVhZElkXyA9IDA7Ci0gIH0KLQotICBpZiAoZGVxdWV1ZUJ1ZmZlcl8pIHsKLSAgICBkZWxldGUgZGVxdWV1ZUJ1ZmZlcl87Ci0gICAgZGVxdWV1ZUJ1ZmZlcl8gPSBOVUxMOwotICB9Ci0KLSAgaWYgKGVucXVldWVCdWZmZXJfKSB7Ci0gICAgZGVsZXRlIGVucXVldWVCdWZmZXJfOwotICAgIGVucXVldWVCdWZmZXJfID0gTlVMTDsKLSAgfQotCi0gIGlmIChyZWFkQnVmZl8pIHsKLSAgICBkZWxldGVbXSByZWFkQnVmZl87Ci0gICAgcmVhZEJ1ZmZfID0gTlVMTDsKLSAgfQotCi0gIGlmIChjdXJyZW50RXZlbnRfKSB7Ci0gICAgZGVsZXRlIGN1cnJlbnRFdmVudF87Ci0gICAgY3VycmVudEV2ZW50XyA9IE5VTEw7Ci0gIH0KLQotICAvLyBjbG9zZSBsb2dmaWxlCi0gIGlmIChmZF8gPiAwKSB7Ci0gICAgaWYoLTEgPT0gOjpjbG9zZShmZF8pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogflRGaWxlVHJhbnNwb3J0KCkgOjpjbG9zZSgpICIsIGVycm5vKTsKLSAgICB9IGVsc2UgewotICAgICAgLy9zdWNjZXNzZnVsbHkgY2xvc2VkIGZkCi0gICAgICBmZF8gPSAwOwotICAgIH0KLSAgfQotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0Ojppbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSB7Ci0gIGlmIChidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKLSAgICBUX0VSUk9SKCIlcyIsICJUcnlpbmcgdG8gZG91YmxlLWluaXQgVEZpbGVUcmFuc3BvcnQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAod3JpdGVyVGhyZWFkSWRfID09IDApIHsKLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJndyaXRlclRocmVhZElkXywgTlVMTCwgc3RhcnRXcml0ZXJUaHJlYWQsICh2b2lkICopdGhpcykgIT0gMCkgewotICAgICAgVF9FUlJPUigiJXMiLCAiQ291bGQgbm90IGNyZWF0ZSB3cml0ZXIgdGhyZWFkIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgZGVxdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7Ci0gIGVucXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOwotICBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAocmVhZE9ubHlfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gZmlsZSBvcGVuZWQgcmVhZG9ubHkiKTsKLSAgfQotCi0gIGVucXVldWVFdmVudChidWYsIGxlbik7Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OmVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuKSB7Ci0gIC8vIGNhbid0IGVucXVldWUgbW9yZSBldmVudHMgaWYgZmlsZSBpcyBnb2luZyB0byBjbG9zZQotICBpZiAoY2xvc2luZ18pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgdGhhdCBldmVudCBzaXplIGlzIHZhbGlkCi0gIGlmICggKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAoZXZlbnRMZW4gPiBtYXhFdmVudFNpemVfKSApIHsKLSAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsIGV2ZW50TGVuLCBtYXhFdmVudFNpemVfKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZXZlbnRMZW4gPT0gMCkgewotICAgIFRfRVJST1IoIiVzIiwgImNhbm5vdCBlbnF1ZXVlIGFuIGVtcHR5IGV2ZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZXZlbnRJbmZvKiB0b0VucXVldWUgPSBuZXcgZXZlbnRJbmZvKCk7Ci0gIHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyA9ICh1aW50OF90ICopc3RkOjptYWxsb2MoKHNpemVvZih1aW50OF90KSAqIGV2ZW50TGVuKSArIDQpOwotICBpZiAodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfID09IE5VTEwpIHsKLSAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICB9Ci0gIC8vIGZpcnN0IDQgYnl0ZXMgaXMgdGhlIGV2ZW50IGxlbmd0aAotICBtZW1jcHkodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfLCAodm9pZCopKCZldmVudExlbiksIDQpOwotICAvLyBhY3R1YWwgZXZlbnQgY29udGVudHMKLSAgbWVtY3B5KHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyArIDQsIGJ1ZiwgZXZlbnRMZW4pOwotICB0b0VucXVldWUtPmV2ZW50U2l6ZV8gPSBldmVudExlbiArIDQ7Ci0KLSAgLy8gbG9jayBtdXRleAotICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0KLSAgLy8gbWFrZSBzdXJlIHRoYXQgZW5xdWV1ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIHdyaXRlciB0aHJlYWQgaXMgcnVubmluZwotICBpZiAoIWJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewotICAgIGlmICghaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkpIHsKLSAgICAgIGRlbGV0ZSB0b0VucXVldWU7Ci0gICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvLyBDYW4ndCBlbnF1ZXVlIHdoaWxlIGJ1ZmZlciBpcyBmdWxsCi0gIHdoaWxlIChlbnF1ZXVlQnVmZmVyXy0+aXNGdWxsKCkpIHsKLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmbm90RnVsbF8sICZtdXRleF8pOwotICB9Ci0KLSAgLy8gV2Ugc2hvdWxkbid0IGJlIHRyeWluZyB0byBlbnF1ZXVlIG5ldyBkYXRhIHdoaWxlIGEgZm9yY2VkIGZsdXNoIGlzCi0gIC8vIHJlcXVlc3RlZC4gIChPdGhlcndpc2UgdGhlIHdyaXRlciB0aHJlYWQgbWlnaHQgbm90IGV2ZXIgYmUgYWJsZSB0byBmaW5pc2gKLSAgLy8gdGhlIGZsdXNoIGlmIG1vcmUgZGF0YSBrZWVwcyBiZWluZyBlbnF1ZXVlZC4pCi0gIGFzc2VydCghZm9yY2VGbHVzaF8pOwotCi0gIC8vIGFkZCB0byB0aGUgYnVmZmVyCi0gIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmFkZEV2ZW50KHRvRW5xdWV1ZSkpIHsKLSAgICBkZWxldGUgdG9FbnF1ZXVlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIHNpZ25hbCBhbnlib2R5IHdobydzIHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgdG8gYmUgbm9uLWVtcHR5Ci0gIHB0aHJlYWRfY29uZF9zaWduYWwoJm5vdEVtcHR5Xyk7Ci0KLSAgLy8gdGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgbG9vcCB3aGVyZSBpdCBtYWtlcyBzdXJlIGl0IGdvdCBmbHVzaGVkCi0gIC8vIGJlY2F1c2UgY29uZGl0aW9uIHZhcmlhYmxlcyBjYW4gZ2V0IHRyaWdnZXJlZCBieSB0aGUgb3MgZm9yIG5vIHJlYXNvbgotICAvLyBpdCBpcyBwcm9iYWJseSBhIG5vbi1mYWN0b3IgZm9yIHRoZSB0aW1lIGJlaW5nCi0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotfQotCi1ib29sIFRGaWxlVHJhbnNwb3J0Ojpzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1lc3BlYyogZGVhZGxpbmUpIHsKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotCi0gIGJvb2wgc3dhcDsKLSAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7Ci0gICAgc3dhcCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoY2xvc2luZ18pIHsKLSAgICAvLyBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBkYXRhIHRvIHdyaXRlLAotICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNsb3NpbmcKLSAgICBzd2FwID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGRlYWRsaW5lICE9IE5VTEwpIHsKLSAgICAgIC8vIGlmIHdlIHdlcmUgaGFuZGVkIGEgZGVhZGxpbmUgdGltZSBzdHJ1Y3QsIGRvIGEgdGltZWQgd2FpdAotICAgICAgcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbm90RW1wdHlfLCAmbXV0ZXhfLCBkZWFkbGluZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGp1c3Qgd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGdldHMgYW4gaXRlbQotICAgICAgcHRocmVhZF9jb25kX3dhaXQoJm5vdEVtcHR5XywgJm11dGV4Xyk7Ci0gICAgfQotCi0gICAgLy8gY291bGQgYmUgZW1wdHkgaWYgd2UgdGltZWQgb3V0Ci0gICAgc3dhcCA9IGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCk7Ci0gIH0KLQotICBpZiAoc3dhcCkgewotICAgIFRGaWxlVHJhbnNwb3J0QnVmZmVyICp0ZW1wID0gZW5xdWV1ZUJ1ZmZlcl87Ci0gICAgZW5xdWV1ZUJ1ZmZlcl8gPSBkZXF1ZXVlQnVmZmVyXzsKLSAgICBkZXF1ZXVlQnVmZmVyXyA9IHRlbXA7Ci0gIH0KLQotICAvLyB1bmxvY2sgdGhlIG11dGV4IGFuZCBzaWduYWwgaWYgcmVxdWlyZWQKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0KLSAgaWYgKHN3YXApIHsKLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZub3RGdWxsXyk7Ci0gIH0KLQotICByZXR1cm4gc3dhcDsKLX0KLQotCi12b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZXJUaHJlYWQoKSB7Ci0gIGJvb2wgaGFzSU9FcnJvciA9IGZhbHNlOwotCi0gIC8vIG9wZW4gZmlsZSBpZiBpdCBpcyBub3Qgb3BlbgotICBpZighZmRfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIG9wZW5Mb2dGaWxlKCk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIG9wZW5Mb2dGaWxlKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICBmZF8gPSAwOwotICAgICAgaGFzSU9FcnJvciA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gc2V0IHRoZSBvZmZzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUgKEVPRikKLSAgaWYgKCFoYXNJT0Vycm9yKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlZWtUb0VuZCgpOwotICAgICAgLy8gdGhyb3cgYXdheSBhbnkgcGFydGlhbCBldmVudHMKLSAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfOwotICAgICAgZnRydW5jYXRlKGZkXywgb2Zmc2V0Xyk7Ci0gICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGluaXRpYWxpemF0aW9uICIsIGVycm5vX2NvcHkpOwotICAgICAgaGFzSU9FcnJvciA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gRmlndXJlIG91dCB0aGUgbmV4dCB0aW1lIGJ5IHdoaWNoIGEgZmx1c2ggbXVzdCB0YWtlIHBsYWNlCi0gIHN0cnVjdCB0aW1lc3BlYyB0c19uZXh0X2ZsdXNoOwotICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKLSAgdWludDMyX3QgdW5mbHVzaGVkID0gMDsKLQotICB3aGlsZSAoMSkgewotICAgIC8vIHRoaXMgd2lsbCBvbmx5IGJlIHRydWUgd2hlbiB0aGUgZGVzdHJ1Y3RvciBpcyBiZWluZyBpbnZva2VkCi0gICAgaWYgKGNsb3NpbmdfKSB7Ci0gICAgICBpZiAoaGFzSU9FcnJvcikgewotICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRyeSB0byBlbXB0eSBidWZmZXJzIGJlZm9yZSBleGl0Ci0gICAgICBpZiAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSAmJiBkZXF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7Ci0gICAgICAgIGZzeW5jKGZkXyk7Ci0gICAgICAgIGlmICgtMSA9PSA6OmNsb3NlKGZkXykpIHsKLSAgICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy9mZCBzdWNjZXNzZnVsbHkgY2xvc2VkCi0gICAgICAgICAgZmRfID0gMDsKLSAgICAgICAgfQotICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN3YXBFdmVudEJ1ZmZlcnMoJnRzX25leHRfZmx1c2gpKSB7Ci0gICAgICBldmVudEluZm8qIG91dEV2ZW50OwotICAgICAgd2hpbGUgKE5VTEwgIT0gKG91dEV2ZW50ID0gZGVxdWV1ZUJ1ZmZlcl8tPmdldE5leHQoKSkpIHsKLSAgICAgICAgLy8gUmVtb3ZlIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlciBhbmQgd3JpdGUgaXQgb3V0IHRvIGRpc2suIElmIHRoZXJlIGlzIGFueSBJTyBlcnJvciwgZm9yIGluc3RhbmNlLAotICAgICAgICAvLyB0aGUgb3V0cHV0IGZpbGUgaXMgdW5tb3VudGVkIG9yIGRlbGV0ZWQsIHRoZW4gdGhpcyBldmVudCBpcyBkcm9wcGVkLiBIb3dldmVyLCB0aGUgd3JpdGVyIHRocmVhZAotICAgICAgICAvLyB3aWxsOiAoMSkgc2xlZXAgZm9yIGEgc2hvcnQgd2hpbGU7ICgyKSB0cnkgdG8gcmVvcGVuIHRoZSBmaWxlOyAoMykgaWYgc3VjY2Vzc2Z1bCB0aGVuIHN0YXJ0IHdyaXRpbmcKLSAgICAgICAgLy8gZnJvbSB0aGUgZW5kLgotCi0gICAgICAgIHdoaWxlIChoYXNJT0Vycm9yKSB7Ci0gICAgICAgICAgVF9FUlJPUigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVkIG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8pOwotICAgICAgICAgIHVzbGVlcCh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7Ci0gICAgICAgICAgaWYgKGNsb3NpbmdfKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghZmRfKSB7Ci0gICAgICAgICAgICA6OmNsb3NlKGZkXyk7Ci0gICAgICAgICAgICBmZF8gPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgb3BlbkxvZ0ZpbGUoKTsKLSAgICAgICAgICAgIHNlZWtUb0VuZCgpOwotICAgICAgICAgICAgdW5mbHVzaGVkID0gMDsKLSAgICAgICAgICAgIGhhc0lPRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgIFRfTE9HX09QRVIoIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSAlcyByZW9wZW5lZCBieSB3cml0ZXIgdGhyZWFkIGR1cmluZyBlcnJvciByZWNvdmVyeSIsIGZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICAgICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB1bmFibGUgdG8gcmVvcGVuIGxvZyBmaWxlICVzIGR1cmluZyBlcnJvciByZWNvdmVyeSIsIGZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gZXZlbnQKLSAgICAgICAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKLSAgICAgICAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsIG91dEV2ZW50LT5ldmVudFNpemVfLCBtYXhFdmVudFNpemVfKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGNodW5raW5nIGlzIHJlcXVpcmVkLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IG1zZyBkb2VzIG5vdCBjcm9zcyBjaHVuayBib3VuZGFyeQotICAgICAgICBpZiAoKG91dEV2ZW50LT5ldmVudFNpemVfID4gMCkgJiYgKGNodW5rU2l6ZV8gIT0gMCkpIHsKLSAgICAgICAgICAvLyBldmVudCBzaXplIG11c3QgYmUgbGVzcyB0aGFuIGNodW5rIHNpemUKLSAgICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7Ci0gICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogZXZlbnQgc2l6ZSgldSkgPiBjaHVuayBzaXplKCV1KTogc2tpcHBpbmcgZXZlbnQiLCBvdXRFdmVudC0+ZXZlbnRTaXplXywgY2h1bmtTaXplXyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpbnQ2NF90IGNodW5rMSA9IG9mZnNldF8vY2h1bmtTaXplXzsKLSAgICAgICAgICBpbnQ2NF90IGNodW5rMiA9IChvZmZzZXRfICsgb3V0RXZlbnQtPmV2ZW50U2l6ZV8gLSAxKS9jaHVua1NpemVfOwotCi0gICAgICAgICAgLy8gaWYgYWRkaW5nIHRoaXMgZXZlbnQgd2lsbCBjcm9zcyBhIGNodW5rIGJvdW5kYXJ5LCBwYWQgdGhlIGNodW5rIHdpdGggemVyb3MKLSAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgewotICAgICAgICAgICAgLy8gcmVmZXRjaCB0aGUgb2Zmc2V0IHRvIGtlZXAgaW4gc3luYwotICAgICAgICAgICAgb2Zmc2V0XyA9IGxzZWVrKGZkXywgMCwgU0VFS19DVVIpOwotICAgICAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gKGludDMyX3QpKChvZmZzZXRfIC8gY2h1bmtTaXplXyArIDEpICogY2h1bmtTaXplXyAtIG9mZnNldF8pOwotCi0gICAgICAgICAgICB1aW50OF90KiB6ZXJvcyA9IG5ldyB1aW50OF90W3BhZGRpbmddOwotICAgICAgICAgICAgbWVtc2V0KHplcm9zLCAnXDAnLCBwYWRkaW5nKTsKLSAgICAgICAgICAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gYXJyYXkoemVyb3MpOwotICAgICAgICAgICAgaWYgKC0xID09IDo6d3JpdGUoZmRfLCB6ZXJvcywgcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGVycm9yIHdoaWxlIHBhZGRpbmcgemVyb3MgIiwgZXJybm9fY29weSk7Ci0gICAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuZmx1c2hlZCArPSBwYWRkaW5nOwotICAgICAgICAgICAgb2Zmc2V0XyArPSBwYWRkaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdyaXRlIHRoZSBkZXF1ZXVlZCBldmVudCB0byB0aGUgZmlsZQotICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSB7Ci0gICAgICAgICAgaWYgKC0xID09IDo6d3JpdGUoZmRfLCBvdXRFdmVudC0+ZXZlbnRCdWZmXywgb3V0RXZlbnQtPmV2ZW50U2l6ZV8pKSB7Ci0gICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHdyaXRpbmcgZXZlbnQgIiwgZXJybm9fY29weSk7Ci0gICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICB1bmZsdXNoZWQgKz0gb3V0RXZlbnQtPmV2ZW50U2l6ZV87Ci0gICAgICAgICAgb2Zmc2V0XyArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVxdWV1ZUJ1ZmZlcl8tPnJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGhhc0lPRXJyb3IpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIExvY2FsIHZhcmlhYmxlIHRvIGNhY2hlIHRoZSBzdGF0ZSBvZiBmb3JjZUZsdXNoXy4KLSAgICAvLwotICAgIC8vIFdlIG9ubHkgd2FudCB0byBjaGVjayB0aGUgdmFsdWUgb2YgZm9yY2VGbHVzaF8gb25jZSBlYWNoIHRpbWUgYXJvdW5kIHRoZQotICAgIC8vIGxvb3AuICBJZiB3ZSBjaGVjayBpdCBtb3JlIHRoYW4gb25jZSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2sgdGhlIGVudGlyZQotICAgIC8vIHRpbWUsIGl0IGNvdWxkIGhhdmUgY2hhbmdlZCBzdGF0ZSBpbiBiZXR3ZWVuLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiB1cwotICAgIC8vIG1ha2luZyBpbmNvbnNpc3RlbnQgZGVjaXNpb25zLgotICAgIGJvb2wgZm9yY2VkX2ZsdXNoID0gZmFsc2U7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotICAgIGlmIChmb3JjZUZsdXNoXykgewotICAgICAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIElmIGZvcmNlRmx1c2hfIGlzIHRydWUsIHdlIG5lZWQgdG8gZmx1c2ggYWxsIGF2YWlsYWJsZSBkYXRhLgotICAgICAgICAvLyBJZiBlbnF1ZXVlQnVmZmVyXyBpcyBub3QgZW1wdHksIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsb29wIHRvCi0gICAgICAgIC8vIHdyaXRlIGl0IG91dC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gV2Uga25vdyB0aGUgbWFpbiB0aHJlYWQgaXMgd2FpdGluZyBvbiBmb3JjZUZsdXNoXyB0byBiZSBjbGVhcmVkLAotICAgICAgICAvLyBzbyBubyBuZXcgZXZlbnRzIHdpbGwgYmUgYWRkZWQgdG8gZW5xdWV1ZUJ1ZmZlcl8gdW50aWwgd2UgY2xlYXIKLSAgICAgICAgLy8gZm9yY2VGbHVzaF8uICBUaGVyZWZvcmUgdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AgZW5xdWV1ZUJ1ZmZlcl8KLSAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBlbXB0eS4gIChJLmUuLCB3ZSdyZSBndWFyYW50ZWVkIHRvIG1ha2UgcHJvZ3Jlc3MKLSAgICAgICAgLy8gYW5kIGNsZWFyIGZvcmNlRmx1c2hfIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLikKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZm9yY2VkX2ZsdXNoID0gdHJ1ZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0KLSAgICAvLyBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGZzeW5jCi0gICAgYm9vbCBmbHVzaCA9IGZhbHNlOwotICAgIGlmIChmb3JjZWRfZmx1c2ggfHwgdW5mbHVzaGVkID4gZmx1c2hNYXhCeXRlc18pIHsKLSAgICAgIGZsdXNoID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgc3RydWN0IHRpbWVzcGVjIGN1cnJlbnRfdGltZTsKLSAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZjdXJyZW50X3RpbWUpOwotICAgICAgaWYgKGN1cnJlbnRfdGltZS50dl9zZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3NlYyB8fAotICAgICAgICAgIChjdXJyZW50X3RpbWUudHZfc2VjID09IHRzX25leHRfZmx1c2gudHZfc2VjICYmCi0gICAgICAgICAgIGN1cnJlbnRfdGltZS50dl9uc2VjID4gdHNfbmV4dF9mbHVzaC50dl9uc2VjKSkgewotICAgICAgICBpZiAodW5mbHVzaGVkID4gMCkgewotICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZXcgZGF0YSBzaW5jZSB0aGUgbGFzdCBmc3luYywKLSAgICAgICAgICAvLyBkb24ndCBwZXJmb3JtIHRoZSBmc3luYywgYnV0IGRvIHJlc2V0IHRoZSB0aW1lci4KLSAgICAgICAgICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmbHVzaCkgewotICAgICAgLy8gc3luYyAoZm9yY2UgZmx1c2gpIGZpbGUgdG8gZGlzawotICAgICAgZnN5bmMoZmRfKTsKLSAgICAgIHVuZmx1c2hlZCA9IDA7Ci0gICAgICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKLQotICAgICAgLy8gbm90aWZ5IGFueWJvZHkgd2FpdGluZyBmb3IgZmx1c2ggY29tcGxldGlvbgotICAgICAgaWYgKGZvcmNlZF9mbHVzaCkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0gICAgICAgIGZvcmNlRmx1c2hfID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydChlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0KGRlcXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOwotICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZmbHVzaGVkXyk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpIHsKLSAgLy8gZmlsZSBtdXN0IGJlIG9wZW4gZm9yIHdyaXRpbmcgZm9yIGFueSBmbHVzaGluZyB0byB0YWtlIHBsYWNlCi0gIGlmICh3cml0ZXJUaHJlYWRJZF8gPD0gMCkgewotICAgIHJldHVybjsKLSAgfQotICAvLyB3YWl0IGZvciBmbHVzaCB0byB0YWtlIHBsYWNlCi0gIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsKLQotICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSByZXF1ZXN0aW5nIGEgZmx1c2gKLSAgZm9yY2VGbHVzaF8gPSB0cnVlOwotICAvLyBXYWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkIHNvIGl0IHdpbGwgcGVyZm9ybSB0aGUgZmx1c2ggaW1tZWRpYXRlbHkKLSAgcHRocmVhZF9jb25kX3NpZ25hbCgmbm90RW1wdHlfKTsKLQotICB3aGlsZSAoZm9yY2VGbHVzaF8pIHsKLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmZmx1c2hlZF8sICZtdXRleF8pOwotICB9Ci0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci19Ci0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZSA9IDA7Ci0gIHVpbnQzMl90IGdldCA9IDA7Ci0KLSAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7Ci0gICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGhhdmUgKz0gZ2V0OwotICB9Ci0KLSAgcmV0dXJuIGhhdmU7Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnQ6OnBlZWsoKSB7Ci0gIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGV2ZW50IHJlYWR5IHRvIGJlIHJlYWQKLSAgaWYgKCFjdXJyZW50RXZlbnRfKSB7Ci0gICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOwotICB9Ci0KLSAgLy8gZGlkIG5vdCBtYW5hZ2UgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBmaWxlLiBUaGlzIGNvdWxkIGhhdmUgaGFwcGVuZWQKLSAgLy8gaWYgdGhlIHRpbWVvdXQgZXhwaXJlZCBvciB0aGVyZSB3YXMgc29tZSBvdGhlciBlcnJvcgotICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byByZWFkCi0gIHJldHVybiAoY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18pID4gMDsKLX0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgLy8gY2hlY2sgaWYgdGhlcmUgYW4gZXZlbnQgaXMgcmVhZHkgdG8gYmUgcmVhZAotICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKLSAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7Ci0gIH0KLQotICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAotICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCi0gIGlmICghY3VycmVudEV2ZW50XykgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gcmVhZCBhcyBtdWNoIG9mIHRoZSBjdXJyZW50IGV2ZW50IGFzIHBvc3NpYmxlCi0gIGludDMyX3QgcmVtYWluaW5nID0gY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc187Ci0gIGlmIChyZW1haW5pbmcgPD0gKGludDMyX3QpbGVuKSB7Ci0gICAgLy8gY29weSBvdmVyIGFueXRoaW5nIHRoYXRzIHJlbWFpbmluZwotICAgIGlmIChyZW1haW5pbmcgPiAwKSB7Ci0gICAgICBtZW1jcHkoYnVmLAotICAgICAgICAgICAgIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLAotICAgICAgICAgICAgIHJlbWFpbmluZyk7Ci0gICAgfQotICAgIGRlbGV0ZShjdXJyZW50RXZlbnRfKTsKLSAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgICByZXR1cm4gcmVtYWluaW5nOwotICB9Ci0KLSAgLy8gcmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCBsZW4pOwotICBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfICs9IGxlbjsKLSAgcmV0dXJuIGxlbjsKLX0KLQotLy8gbm90ZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgcmV0dXJuZWQgZXZlbnRzCi1ldmVudEluZm8qIFRGaWxlVHJhbnNwb3J0OjpyZWFkRXZlbnQoKSB7Ci0gIGludCByZWFkVHJpZXMgPSAwOwotCi0gIGlmICghcmVhZEJ1ZmZfKSB7Ci0gICAgcmVhZEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZEJ1ZmZTaXplX107Ci0gIH0KLQotICB3aGlsZSAoMSkgewotICAgIC8vIHJlYWQgZnJvbSB0aGUgZmlsZSBpZiByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQKLSAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQdHJfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewotICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKLSAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOwotICAgICAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gOjpyZWFkKGZkXywgcmVhZEJ1ZmZfLCByZWFkQnVmZlNpemVfKTsKLSAgICAgIC8vICAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKLSAgICAgIC8vICAgICAgICAgVF9ERUJVR19MKDEsICJBbW91bnQgcmVhZDogJXUgKG9mZnNldDogJWx1KSIsIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXywgb2Zmc2V0Xyk7Ci0gICAgICAvLyAgICAgICB9Ci0gICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPSAwOwotICAgICAgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfID0gMDsKLQotICAgICAgLy8gcmVhZCBlcnJvcgotICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAtMSkgewotICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIpOwotICAgICAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeyAgLy8gRU9GCi0gICAgICAgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQKLSAgICAgICAgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgewotICAgICAgICAgIHVzbGVlcChlb2ZTbGVlcFRpbWVfKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gTk9fVEFJTF9SRUFEX1RJTUVPVVQpIHsKLSAgICAgICAgICAvLyByZXNldCBzdGF0ZQotICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPiAwKSB7Ci0gICAgICAgICAgLy8gdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb25jZQotICAgICAgICAgIGlmIChyZWFkVHJpZXMgPiAwKSB7Ci0gICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNsZWVwKHJlYWRUaW1lb3V0XyAqIDEwMDApOwotICAgICAgICAgICAgcmVhZFRyaWVzKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZWFkVHJpZXMgPSAwOwotCi0gICAgLy8gYXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlcgotICAgIHdoaWxlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewotICAgICAgaWYgKHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfKSB7Ci0gICAgICAgIGlmKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gMCkgewotICAgICAgICAgIGlmICggKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pL2NodW5rU2l6ZV8gIT0KLSAgICAgICAgICAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIDMpL2NodW5rU2l6ZV8pKSB7Ci0gICAgICAgICAgICAvLyBza2lwIG9uZSBieXRlIHRvd2FyZHMgY2h1bmsgYm91bmRhcnkKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgVF9ERUJVR19MKDEsICJTa2lwcGluZyBhIGJ5dGUiKTsKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXysrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmX1tyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfKytdID0KLSAgICAgICAgICByZWFkQnVmZl9bcmVhZFN0YXRlXy5idWZmZXJQdHJfKytdOwotICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSA0KSB7Ci0gICAgICAgICAgLy8gMCBsZW5ndGggZXZlbnQgaW5kaWNhdGVzIHBhZGRpbmcKLSAgICAgICAgICBpZiAoKigodWludDMyX3QgKikocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmXykpID09IDApIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgVF9ERUJVR19MKDEsICJHb3QgcGFkZGluZyIpOwotICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZ290IGEgdmFsaWQgZXZlbnQKLSAgICAgICAgICByZWFkU3RhdGVfLnJlYWRpbmdTaXplXyA9IGZhbHNlOwotICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50XykgewotICAgICAgICAgICAgZGVsZXRlKHJlYWRTdGF0ZV8uZXZlbnRfKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBuZXcgZXZlbnRJbmZvKCk7Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPSAqKCh1aW50MzJfdCAqKShyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfKSk7Ci0KLSAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaXMgY29ycnVwdGVkIGFuZCBwZXJmb3JtIHJlY292ZXJ5IGlmIHJlcXVpcmVkCi0gICAgICAgICAgaWYgKGlzRXZlbnRDb3JydXB0ZWQoKSkgewotICAgICAgICAgICAgcGVyZm9ybVJlY292ZXJ5KCk7Ci0gICAgICAgICAgICAvLyBzdGFydCBmcm9tIHRoZSB0b3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXykgewotICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV9dOwotICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfID0gMDsKLSAgICAgICAgfQotICAgICAgICAvLyB0YWtlIGVpdGhlciB0aGUgZW50aXJlIGV2ZW50IG9yIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBpbnQgcmVjbGFpbUJ1ZmZlciA9IG1pbigodWludDMyX3QpKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyAtIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOwotCi0gICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCi0gICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLAotICAgICAgICAgICAgICAgcmVhZEJ1ZmZfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfLAotICAgICAgICAgICAgICAgcmVjbGFpbUJ1ZmZlcik7Ci0KLSAgICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHB0cnMKLSAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gKz0gcmVjbGFpbUJ1ZmZlcjsKLSAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfICs9IHJlY2xhaW1CdWZmZXI7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGhhcyBiZWVuIHJlYWQgaW4gZnVsbAotICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPT0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8pIHsKLSAgICAgICAgICAvLyBzZXQgdGhlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgY3VycmVudCBldmVudAotICAgICAgICAgIGV2ZW50SW5mbyogY29tcGxldGVFdmVudCA9IHJlYWRTdGF0ZV8uZXZlbnRfOwotICAgICAgICAgIGNvbXBsZXRlRXZlbnQtPmV2ZW50QnVmZlBvc18gPSAwOwotCi0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBOVUxMOwotICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmJ1ZmZlclB0cl8pOwotCi0gICAgICAgICAgLy8gZXhpdCBjcml0ZXJpYQotICAgICAgICAgIHJldHVybiBjb21wbGV0ZUV2ZW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydDo6aXNFdmVudENvcnJ1cHRlZCgpIHsKLSAgLy8gYW4gZXJyb3IgaXMgdHJpZ2dlcmVkIGlmOgotICBpZiAoIChtYXhFdmVudFNpemVfID4gMCkgJiYgIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA+IG1heEV2ZW50U2l6ZV8pKSB7Ci0gICAgLy8gMS4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiB1c2VyLXNwZWZpY2llZCBtYXgtZXZlbnQgc2l6ZQotICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplICgldSkiLAotICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sIG1heEV2ZW50U2l6ZV8pOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gY2h1bmtTaXplXykgewotICAgIC8vIDIuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gY2h1bmsgc2l6ZQotICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIGNodW5rIHNpemUgKCV1KSIsCi0gICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgY2h1bmtTaXplXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiggKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfIC0gNCkvY2h1bmtTaXplXykgIT0KLSAgICAgICAgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIDEpL2NodW5rU2l6ZV8pICkgewotICAgIC8vIDMuIHNpemUgaW5kaWNhdGVzIHRoYXQgZXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeQotICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeS4gRXZlbnQgc2l6ZToldSAgT2Zmc2V0OiVsbGQiLAotICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sCi0gICAgICAgICAgICAoaW50NjRfdCkgKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyA0KSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6cGVyZm9ybVJlY292ZXJ5KCkgewotICAvLyBwZXJmb3JtIHNvbWUga2lja2FzcyByZWNvdmVyeQotICB1aW50MzJfdCBjdXJDaHVuayA9IGdldEN1ckNodW5rKCk7Ci0gIGlmIChsYXN0QmFkQ2h1bmtfID09IGN1ckNodW5rKSB7Ci0gICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18rKzsKLSAgfSBlbHNlIHsKLSAgICBsYXN0QmFkQ2h1bmtfID0gY3VyQ2h1bms7Ci0gICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPSAxOwotICB9Ci0KLSAgaWYgKG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfIDwgbWF4Q29ycnVwdGVkRXZlbnRzXykgewotICAgIC8vIG1heWJlIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWFkaW5nIHRoZSBmaWxlIGZyb20gZGlzawotICAgIC8vIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiBjaHVuayBhbmQgdHJ5IGFnYWluCi0gICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmspOwotICB9IGVsc2UgewotCi0gICAgLy8ganVzdCBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IGNodW5rIGlmIHdlIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IGNodW5rCi0gICAgaWYgKGN1ckNodW5rICE9IChnZXROdW1DaHVua3MoKSAtIDEpKSB7Ci0gICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOwotICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7Ci0gICAgICAvLyBpZiB0YWlsaW5nIHRoZSBmaWxlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHN0YXJ0Ci0gICAgICAvLyB0aGUgbmV4dCBjaHVuawotICAgICAgd2hpbGUoY3VyQ2h1bmsgPT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKLSAgICAgICAgdXNsZWVwKERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMpOwotICAgICAgfQotICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gcHJldHR5IGhvc2VkIGF0IHRoaXMgc3RhZ2UsIHJld2luZCB0aGUgZmlsZSBiYWNrIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWwKLSAgICAgIC8vIHBvaW50IGFuZCBwdW50IG9uIHRoZSBlcnJvcgotICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7Ci0gICAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgICAgIGNoYXIgZXJyb3JNc2dbMTAyNF07Ci0gICAgICBzcHJpbnRmKGVycm9yTXNnLCAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICVsbGQiLAotICAgICAgICAgICAgICAoaW50NjRfdCkgKG9mZnNldF8gKyByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pKTsKLSAgICAgICAgICAgICAgCi0gICAgICBHbG9iYWxPdXRwdXQoZXJyb3JNc2cpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihlcnJvck1zZyk7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6c2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgewotICBpZiAoZmRfIDw9IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlIG5vdCBvcGVuIik7Ci0gIH0KLQotICBpbnQzMl90IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOwotCi0gIC8vIGZpbGUgaXMgZW1wdHksIHNlZWtpbmcgdG8gY2h1bmsgaXMgcG9pbnRsZXNzCi0gIGlmIChudW1DaHVua3MgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIG5lZ2F0aXZlIGluZGljYXRlcyByZXZlcnNlIHNlZWsgKGZyb20gdGhlIGVuZCkKLSAgaWYgKGNodW5rIDwgMCkgewotICAgIGNodW5rICs9IG51bUNodW5rczsKLSAgfQotCi0gIC8vIHRvbyBsYXJnZSBhIHZhbHVlIGZvciByZXZlcnNlIHNlZWssIGp1c3Qgc2VlayB0byBiZWdpbm5pbmcKLSAgaWYgKGNodW5rIDwgMCkgewotICAgIFRfREVCVUcoIiVzIiwgIkluY29ycmVjdCB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLiBTZWVraW5nIHRvIGJlZ2lubmluZy4uLiIpOwotICAgIGNodW5rID0gMDsKLSAgfQotCi0gIC8vIGNhbm5vdCBzZWVrIHBhc3QgRU9GCi0gIGJvb2wgc2Vla1RvRW5kID0gZmFsc2U7Ci0gIG9mZl90IG1pbkVuZE9mZnNldCA9IDA7Ci0gIGlmIChjaHVuayA+PSBudW1DaHVua3MpIHsKLSAgICBUX0RFQlVHKCIlcyIsICJUcnlpbmcgdG8gc2VlayBwYXN0IEVPRi4gU2Vla2luZyB0byBFT0YgaW5zdGVhZC4uLiIpOwotICAgIHNlZWtUb0VuZCA9IHRydWU7Ci0gICAgY2h1bmsgPSBudW1DaHVua3MgLSAxOwotICAgIC8vIHRoaXMgaXMgdGhlIG1pbiBvZmZzZXQgdG8gcHJvY2VzcyBldmVudHMgdGlsbAotICAgIG1pbkVuZE9mZnNldCA9IGxzZWVrKGZkXywgMCwgU0VFS19FTkQpOwotICB9Ci0KLSAgb2ZmX3QgbmV3T2Zmc2V0ID0gb2ZmX3QoY2h1bmspICogY2h1bmtTaXplXzsKLSAgb2Zmc2V0XyA9IGxzZWVrKGZkXywgbmV3T2Zmc2V0LCBTRUVLX1NFVCk7Ci0gIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKLSAgY3VycmVudEV2ZW50XyA9IE5VTEw7Ci0gIGlmIChvZmZzZXRfID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogbHNlZWsgZXJyb3IgaW4gc2Vla1RvQ2h1bmsiKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogbHNlZWsgZXJyb3IgaW4gc2Vla1RvQ2h1bmsiKTsKLSAgfQotCi0gIC8vIHNlZWsgdG8gRU9GIGlmIHVzZXIgd2FudGVkIHRvIGdvIHRvIGxhc3QgY2h1bmsKLSAgaWYgKHNlZWtUb0VuZCkgewotICAgIHVpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gZ2V0UmVhZFRpbWVvdXQoKTsKLSAgICBzZXRSZWFkVGltZW91dChOT19UQUlMX1JFQURfVElNRU9VVCk7Ci0gICAgLy8ga2VlcCBvbiByZWFkaW5nIHVudGkgdGhlIGxhc3QgZXZlbnQgYXQgcG9pbnQgb2Ygc2Vla0NodW5rIGNhbGwKLSAgICBib29zdDo6c2NvcGVkX3B0cjxldmVudEluZm8+IGV2ZW50OwotICAgIHdoaWxlICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykgPCBtaW5FbmRPZmZzZXQpIHsKLSAgICAgIGV2ZW50LnJlc2V0KHJlYWRFdmVudCgpKTsKLSAgICAgIGlmIChldmVudC5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7Ci0gIH0KLQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9FbmQoKSB7Ci0gIHNlZWtUb0NodW5rKGdldE51bUNodW5rcygpKTsKLX0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIHsKLSAgaWYgKGZkXyA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdHJ1Y3Qgc3RhdCBmX2luZm87Ci0gIGludCBydiA9IGZzdGF0KGZkXywgJmZfaW5mbyk7Ci0KLSAgaWYgKHJ2IDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSAoZnN0YXQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgaWYgKGZfaW5mby5zdF9zaXplID4gMCkgewotICAgIHJldHVybiAoKGZfaW5mby5zdF9zaXplKS9jaHVua1NpemVfKSArIDE7Ci0gIH0KLQotICAvLyBlbXB0eSBmaWxlIGhhcyBubyBjaHVua3MKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKLSAgcmV0dXJuIG9mZnNldF8vY2h1bmtTaXplXzsKLX0KLQotLy8gVXRpbGl0eSBGdW5jdGlvbnMKLXZvaWQgVEZpbGVUcmFuc3BvcnQ6Om9wZW5Mb2dGaWxlKCkgewotICBtb2RlX3QgbW9kZSA9IHJlYWRPbmx5XyA/IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCA6IFNfSVJVU1IgfCBTX0lXVVNSfCBTX0lSR1JQIHwgU19JUk9USDsKLSAgaW50IGZsYWdzID0gcmVhZE9ubHlfID8gT19SRE9OTFkgOiBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7Ci0gIGZkXyA9IDo6b3BlbihmaWxlbmFtZV8uY19zdHIoKSwgZmxhZ3MsIG1vZGUpOwotICBvZmZzZXRfID0gMDsKLQotICAvLyBtYWtlIHN1cmUgb3BlbiBjYWxsIHdhcyBzdWNjZXNzZnVsCi0gIGlmKGZkXyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IG9wZW5Mb2dGaWxlKCkgOjpvcGVuKCkgZmlsZTogIiArIGZpbGVuYW1lXywgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgZmlsZW5hbWVfLCBlcnJub19jb3B5KTsKLSAgfQotCi19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OmdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWVzcGVjKiB0c19uZXh0X2ZsdXNoKSB7Ci0gIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsIHRzX25leHRfZmx1c2gpOwotICB0c19uZXh0X2ZsdXNoLT50dl9uc2VjICs9IChmbHVzaE1heFVzXyAlIDEwMDAwMDApICogMTAwMDsKLSAgaWYgKHRzX25leHRfZmx1c2gtPnR2X25zZWMgPiAxMDAwMDAwMDAwKSB7Ci0gICAgdHNfbmV4dF9mbHVzaC0+dHZfbnNlYyAtPSAxMDAwMDAwMDAwOwotICAgIHRzX25leHRfZmx1c2gtPnR2X3NlYyArPSAxOwotICB9Ci0gIHRzX25leHRfZmx1c2gtPnR2X3NlYyArPSBmbHVzaE1heFVzXyAvIDEwMDAwMDA7Ci19Ci0KLVRGaWxlVHJhbnNwb3J0QnVmZmVyOjpURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKQotICA6IGJ1ZmZlck1vZGVfKFdSSVRFKQotICAsIHdyaXRlUG9pbnRfKDApCi0gICwgcmVhZFBvaW50XygwKQotICAsIHNpemVfKHNpemUpCi17Ci0gIGJ1ZmZlcl8gPSBuZXcgZXZlbnRJbmZvKltzaXplXTsKLX0KLQotVEZpbGVUcmFuc3BvcnRCdWZmZXI6On5URmlsZVRyYW5zcG9ydEJ1ZmZlcigpIHsKLSAgaWYgKGJ1ZmZlcl8pIHsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVQb2ludF87IGkrKykgewotICAgICAgZGVsZXRlIGJ1ZmZlcl9baV07Ci0gICAgfQotICAgIGRlbGV0ZVtdIGJ1ZmZlcl87Ci0gICAgYnVmZmVyXyA9IE5VTEw7Ci0gIH0KLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6YWRkRXZlbnQoZXZlbnRJbmZvICpldmVudCkgewotICBpZiAoYnVmZmVyTW9kZV8gPT0gUkVBRCkgewotICAgIEdsb2JhbE91dHB1dCgiVHJ5aW5nIHRvIHdyaXRlIHRvIGEgYnVmZmVyIGluIHJlYWQgbW9kZSIpOwotICB9Ci0gIGlmICh3cml0ZVBvaW50XyA8IHNpemVfKSB7Ci0gICAgYnVmZmVyX1t3cml0ZVBvaW50XysrXSA9IGV2ZW50OwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIC8vIGJ1ZmZlciBpcyBmdWxsCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWV2ZW50SW5mbyogVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmdldE5leHQoKSB7Ci0gIGlmIChidWZmZXJNb2RlXyA9PSBXUklURSkgewotICAgIGJ1ZmZlck1vZGVfID0gUkVBRDsKLSAgfQotICBpZiAocmVhZFBvaW50XyA8IHdyaXRlUG9pbnRfKSB7Ci0gICAgcmV0dXJuIGJ1ZmZlcl9bcmVhZFBvaW50XysrXTsKLSAgfSBlbHNlIHsKLSAgICAvLyBubyBtb3JlIGVudHJpZXMKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjpyZXNldCgpIHsKLSAgaWYgKGJ1ZmZlck1vZGVfID09IFdSSVRFIHx8IHdyaXRlUG9pbnRfID4gcmVhZFBvaW50XykgewotICAgIFRfREVCVUcoIiVzIiwgIlJlc2V0dGluZyBhIGJ1ZmZlciB3aXRoIHVucmVhZCBlbnRyaWVzIik7Ci0gIH0KLSAgLy8gQ2xlYW4gdXAgdGhlIG9sZCBlbnRyaWVzCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZVBvaW50XzsgaSsrKSB7Ci0gICAgZGVsZXRlIGJ1ZmZlcl9baV07Ci0gIH0KLSAgYnVmZmVyTW9kZV8gPSBXUklURTsKLSAgd3JpdGVQb2ludF8gPSAwOwotICByZWFkUG9pbnRfID0gMDsKLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6aXNGdWxsKCkgewotICByZXR1cm4gd3JpdGVQb2ludF8gPT0gc2l6ZV87Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmlzRW1wdHkoKSB7Ci0gIHJldHVybiB3cml0ZVBvaW50XyA9PSAwOwotfQotCi1URmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOgotICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgewotCi0gIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCi0gIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Ci19Ci0KLVRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KToKLSAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgewotCi0gIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCi0gIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Ci19Ci0KLVRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSwKLSAgb3V0cHV0VHJhbnNwb3J0XyhvdXRwdXRUcmFuc3BvcnQpIHt9Ci0KLXZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpIHsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOwotCi0gIC8vIHNldCB0aGUgcmVhZCB0aW1lb3V0IHRvIDAgaWYgdGFpbGluZyBpcyByZXF1aXJlZAotICBpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRSZWFkVGltZW91dCgpOwotICBpZiAodGFpbCkgewotICAgIC8vIHNhdmUgb2xkIHJlYWQgdGltZW91dCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQKLSAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KFRGaWxlVHJhbnNwb3J0OjpUQUlMX1JFQURfVElNRU9VVCk7Ci0gIH0KLQotICB1aW50MzJfdCBudW1Qcm9jZXNzZWQgPSAwOwotICB3aGlsZSgxKSB7Ci0gICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5Ci0gICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAotICAgIHRyeSB7Ci0gICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKLSAgICAgIG51bVByb2Nlc3NlZCsrOwotICAgICAgaWYgKCAobnVtRXZlbnRzID4gMCkgJiYgKG51bVByb2Nlc3NlZCA9PSBudW1FdmVudHMpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJiB0ZW9mKSB7Ci0gICAgICBpZiAoIXRhaWwpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdGUpIHsKLSAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyByZXN0b3JlIG9sZCByZWFkIHRpbWVvdXQKLSAgaWYgKHRhaWwpIHsKLSAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKLSAgfQotCi19Ci0KLXZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3NDaHVuaygpIHsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOwotCi0gIHVpbnQzMl90IGN1ckNodW5rID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRDdXJDaHVuaygpOwotCi0gIHdoaWxlKDEpIHsKLSAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKLSAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0Ci0gICAgdHJ5IHsKLSAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOwotICAgICAgaWYgKGN1ckNodW5rICE9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJiB0ZW9mKSB7Ci0gICAgICBicmVhazsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0ZSkgewotICAgICAgY2VyciA8PCB0ZS53aGF0KCkgPDwgZW5kbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhOGM5YS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSAiVFRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRocmlmdC5oIgotI2luY2x1ZGUgIlRQcm9jZXNzb3IuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotCi0vLyBEYXRhIHBlcnRhaW5pbmcgdG8gYSBzaW5nbGUgZXZlbnQKLXR5cGVkZWYgc3RydWN0IGV2ZW50SW5mbyB7Ci0gIHVpbnQ4X3QqIGV2ZW50QnVmZl87Ci0gIHVpbnQzMl90IGV2ZW50U2l6ZV87Ci0gIHVpbnQzMl90IGV2ZW50QnVmZlBvc187Ci0KLSAgZXZlbnRJbmZvKCk6ZXZlbnRCdWZmXyhOVUxMKSwgZXZlbnRTaXplXygwKSwgZXZlbnRCdWZmUG9zXygwKXt9OwotICB+ZXZlbnRJbmZvKCkgewotICAgIGlmIChldmVudEJ1ZmZfKSB7Ci0gICAgICBkZWxldGVbXSBldmVudEJ1ZmZfOwotICAgIH0KLSAgfQotfSBldmVudEluZm87Ci0KLS8vIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcmVhZCBzdGF0ZQotdHlwZWRlZiBzdHJ1Y3QgcmVhZFN0YXRlIHsKLSAgZXZlbnRJbmZvKiBldmVudF87Ci0KLSAgLy8ga2VlcCB0cmFjayBvZiBldmVudCBzaXplCi0gIHVpbnQ4X3QgICBldmVudFNpemVCdWZmX1s0XTsKLSAgdWludDhfdCAgIGV2ZW50U2l6ZUJ1ZmZQb3NfOwotICBib29sICAgICAgcmVhZGluZ1NpemVfOwotCi0gIC8vIHJlYWQgYnVmZmVyIHZhcmlhYmxlcwotICBpbnQzMl90ICBidWZmZXJQdHJfOwotICBpbnQzMl90ICBidWZmZXJMZW5fOwotCi0gIC8vIGxhc3Qgc3VjY2Vzc2Z1bCBkaXNwYXRjaCBwb2ludAotICBpbnQzMl90IGxhc3REaXNwYXRjaFB0cl87Ci0KLSAgdm9pZCByZXNldFN0YXRlKHVpbnQzMl90IGxhc3REaXNwYXRjaFB0cikgewotICAgIHJlYWRpbmdTaXplXyA9IHRydWU7Ci0gICAgZXZlbnRTaXplQnVmZlBvc18gPSAwOwotICAgIGxhc3REaXNwYXRjaFB0cl8gPSBsYXN0RGlzcGF0Y2hQdHI7Ci0gIH0KLQotICB2b2lkIHJlc2V0QWxsVmFsdWVzKCkgewotICAgIHJlc2V0U3RhdGUoMCk7Ci0gICAgYnVmZmVyUHRyXyA9IDA7Ci0gICAgYnVmZmVyTGVuXyA9IDA7Ci0gICAgaWYgKGV2ZW50XykgewotICAgICAgZGVsZXRlKGV2ZW50Xyk7Ci0gICAgfQotICAgIGV2ZW50XyA9IDA7Ci0gIH0KLQotICByZWFkU3RhdGUoKSB7Ci0gICAgZXZlbnRfID0gMDsKLSAgIHJlc2V0QWxsVmFsdWVzKCk7Ci0gIH0KLQotICB+cmVhZFN0YXRlKCkgewotICAgIGlmIChldmVudF8pIHsKLSAgICAgIGRlbGV0ZShldmVudF8pOwotICAgIH0KLSAgfQotCi19IHJlYWRTdGF0ZTsKLQotLyoqCi0gKiBURmlsZVRyYW5zcG9ydEJ1ZmZlciAtIGJ1ZmZlciBjbGFzcyB1c2VkIGJ5IFRGaWxlVHJhbnNwb3J0IGZvciBxdWV1ZWluZyB1cCBldmVudHMKLSAqIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4gIFNob3VsZCBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgotICogIDEpIEJ1ZmZlciBjcmVhdGVkCi0gKiAgMikgQnVmZmVyIHdyaXR0ZW4gdG8gKGFkZEV2ZW50KQotICogIDMpIEJ1ZmZlciByZWFkIGZyb20gKGdldE5leHQpCi0gKiAgNCkgQnVmZmVyIHJlc2V0IChyZXNldCkKLSAqICA1KSBHbyBiYWNrIHRvIDIsIG9yIGRlc3Ryb3kgYnVmZmVyCi0gKgotICogVGhlIGJ1ZmZlciBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbiB0byBhZnRlciBpdCBpcyByZWFkIGZyb20sIHVubGVzcyBpdCBpcyByZXNldCBmaXJzdC4KLSAqIE5vdGU6IFRoZSBhYm92ZSBydWxlcyBhcmUgZW5mb3JjZWQgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgaXRzIHNvbGUgY2xpZW50IFRGaWxlVHJhbnNwb3J0Ci0gKiAgICAgICB3aGljaCB1c2VzIHRoZSBidWZmZXIgaW4gdGhpcyB3YXkuCi0gKgotICovCi1jbGFzcyBURmlsZVRyYW5zcG9ydEJ1ZmZlciB7Ci0gIHB1YmxpYzoKLSAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKTsKLSAgICB+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsKLQotICAgIGJvb2wgYWRkRXZlbnQoZXZlbnRJbmZvICpldmVudCk7Ci0gICAgZXZlbnRJbmZvKiBnZXROZXh0KCk7Ci0gICAgdm9pZCByZXNldCgpOwotICAgIGJvb2wgaXNGdWxsKCk7Ci0gICAgYm9vbCBpc0VtcHR5KCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlcigpOyAvLyBzaG91bGQgbm90IGJlIHVzZWQKLQotICAgIGVudW0gbW9kZSB7Ci0gICAgICBXUklURSwKLSAgICAgIFJFQUQKLSAgICB9OwotICAgIG1vZGUgYnVmZmVyTW9kZV87Ci0KLSAgICB1aW50MzJfdCB3cml0ZVBvaW50XzsKLSAgICB1aW50MzJfdCByZWFkUG9pbnRfOwotICAgIHVpbnQzMl90IHNpemVfOwotICAgIGV2ZW50SW5mbyoqIGJ1ZmZlcl87Ci19OwotCi0vKioKLSAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHJlYWQgZmlsZXMKLSAqLwotY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpID0gMDsKLSAgdmlydHVhbCB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bUNodW5rcygpID0gMDsKLSAgdmlydHVhbCB1aW50MzJfdCBnZXRDdXJDaHVuaygpID0gMDsKLSAgdmlydHVhbCB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspID0gMDsKLSAgdmlydHVhbCB2b2lkIHNlZWtUb0VuZCgpID0gMDsKLX07Ci0KLS8qKgotICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB0cmFuc3BvcnRzIHVzZWQgdG8gd3JpdGUgZmlsZXMKLSAqLwotY2xhc3MgVEZpbGVXcml0ZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgPSAwOwotfTsKLQotLyoqCi0gKiBGaWxlIGltcGxlbWVudGF0aW9uIG9mIGEgdHJhbnNwb3J0LiBSZWFkcyBhbmQgd3JpdGVzIGFyZSBkb25lIHRvIGEKLSAqIGZpbGUgb24gZGlzay4KLSAqCi0gKi8KLWNsYXNzIFRGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVXcml0ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEZpbGVUcmFuc3BvcnQoc3RkOjpzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seT1mYWxzZSk7Ci0gIH5URmlsZVRyYW5zcG9ydCgpOwotCi0gIC8vIFRPRE86IHdoYXQgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3VyIGZvciB0aGlzPwotICAvLyB0aGUgbG9nIGZpbGUgaXMgZ2VuZXJhbGx5IGFsd2F5cyBvcGVuCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgZmx1c2goKTsKLQotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIGJvb2wgcGVlaygpOwotCi0gIC8vIGxvZy1maWxlIHNwZWNpZmljIGZ1bmN0aW9ucwotICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOwotICB2b2lkIHNlZWtUb0VuZCgpOwotICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKLSAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKLQotICAvLyBmb3IgY2hhbmdpbmcgdGhlIG91dHB1dCBmaWxlCi0gIHZvaWQgcmVzZXRPdXRwdXRGaWxlKGludCBmZCwgc3RkOjpzdHJpbmcgZmlsZW5hbWUsIGludDY0X3Qgb2Zmc2V0KTsKLQotICAvLyBTZXR0ZXIvR2V0dGVyIGZ1bmN0aW9ucyBmb3IgdXNlci1jb250cm9sbGFibGUgb3B0aW9ucwotICB2b2lkIHNldFJlYWRCdWZmU2l6ZSh1aW50MzJfdCByZWFkQnVmZlNpemUpIHsKLSAgICBpZiAocmVhZEJ1ZmZTaXplKSB7Ci0gICAgICByZWFkQnVmZlNpemVfID0gcmVhZEJ1ZmZTaXplOwotICAgIH0KLSAgfQotICB1aW50MzJfdCBnZXRSZWFkQnVmZlNpemUoKSB7Ci0gICAgcmV0dXJuIHJlYWRCdWZmU2l6ZV87Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgaW50MzJfdCBUQUlMX1JFQURfVElNRU9VVCA9IC0xOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBOT19UQUlMX1JFQURfVElNRU9VVCA9IDA7Ci0gIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgewotICAgIHJlYWRUaW1lb3V0XyA9IHJlYWRUaW1lb3V0OwotICB9Ci0gIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSB7Ci0gICAgcmV0dXJuIHJlYWRUaW1lb3V0XzsKLSAgfQotCi0gIHZvaWQgc2V0Q2h1bmtTaXplKHVpbnQzMl90IGNodW5rU2l6ZSkgewotICAgIGlmIChjaHVua1NpemUpIHsKLSAgICAgIGNodW5rU2l6ZV8gPSBjaHVua1NpemU7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldENodW5rU2l6ZSgpIHsKLSAgICByZXR1cm4gY2h1bmtTaXplXzsKLSAgfQotCi0gIHZvaWQgc2V0RXZlbnRCdWZmZXJTaXplKHVpbnQzMl90IGJ1ZmZlclNpemUpIHsKLSAgICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIkNhbm5vdCBjaGFuZ2UgdGhlIGJ1ZmZlciBzaXplIGFmdGVyIHdyaXRlciB0aHJlYWQgc3RhcnRlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBldmVudEJ1ZmZlclNpemVfID0gYnVmZmVyU2l6ZTsKLSAgfQotCi0gIHVpbnQzMl90IGdldEV2ZW50QnVmZmVyU2l6ZSgpIHsKLSAgICByZXR1cm4gZXZlbnRCdWZmZXJTaXplXzsKLSAgfQotCi0gIHZvaWQgc2V0Rmx1c2hNYXhVcyh1aW50MzJfdCBmbHVzaE1heFVzKSB7Ci0gICAgaWYgKGZsdXNoTWF4VXMpIHsKLSAgICAgIGZsdXNoTWF4VXNfID0gZmx1c2hNYXhVczsKLSAgICB9Ci0gIH0KLSAgdWludDMyX3QgZ2V0Rmx1c2hNYXhVcygpIHsKLSAgICByZXR1cm4gZmx1c2hNYXhVc187Ci0gIH0KLQotICB2b2lkIHNldEZsdXNoTWF4Qnl0ZXModWludDMyX3QgZmx1c2hNYXhCeXRlcykgewotICAgIGlmIChmbHVzaE1heEJ5dGVzKSB7Ci0gICAgICBmbHVzaE1heEJ5dGVzXyA9IGZsdXNoTWF4Qnl0ZXM7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldEZsdXNoTWF4Qnl0ZXMoKSB7Ci0gICAgcmV0dXJuIGZsdXNoTWF4Qnl0ZXNfOwotICB9Ci0KLSAgdm9pZCBzZXRNYXhFdmVudFNpemUodWludDMyX3QgbWF4RXZlbnRTaXplKSB7Ci0gICAgbWF4RXZlbnRTaXplXyA9IG1heEV2ZW50U2l6ZTsKLSAgfQotICB1aW50MzJfdCBnZXRNYXhFdmVudFNpemUoKSB7Ci0gICAgcmV0dXJuIG1heEV2ZW50U2l6ZV87Ci0gIH0KLQotICB2b2lkIHNldE1heENvcnJ1cHRlZEV2ZW50cyh1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHMpIHsKLSAgICBtYXhDb3JydXB0ZWRFdmVudHNfID0gbWF4Q29ycnVwdGVkRXZlbnRzOwotICB9Ci0gIHVpbnQzMl90IGdldE1heENvcnJ1cHRlZEV2ZW50cygpIHsKLSAgICByZXR1cm4gbWF4Q29ycnVwdGVkRXZlbnRzXzsKLSAgfQotCi0gIHZvaWQgc2V0RW9mU2xlZXBUaW1lVXModWludDMyX3QgZW9mU2xlZXBUaW1lKSB7Ci0gICAgaWYgKGVvZlNsZWVwVGltZSkgewotICAgICAgZW9mU2xlZXBUaW1lXyA9IGVvZlNsZWVwVGltZTsKLSAgICB9Ci0gIH0KLSAgdWludDMyX3QgZ2V0RW9mU2xlZXBUaW1lVXMoKSB7Ci0gICAgcmV0dXJuIGVvZlNsZWVwVGltZV87Ci0gIH0KLQotICAvKgotICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KLSAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKLSAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciB3cml0aW5nIHRvIGEgZmlsZQotICB2b2lkIGVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuKTsKLSAgYm9vbCBzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1lc3BlYyogZGVhZGxpbmUpOwotICBib29sIGluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpOwotCi0gIC8vIGNvbnRyb2wgZm9yIHdyaXRlciB0aHJlYWQKLSAgc3RhdGljIHZvaWQqIHN0YXJ0V3JpdGVyVGhyZWFkKHZvaWQqIHB0cikgewotICAgICgoKFRGaWxlVHJhbnNwb3J0KilwdHIpLT53cml0ZXJUaHJlYWQoKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdm9pZCB3cml0ZXJUaHJlYWQoKTsKLQotICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gYSBmaWxlCi0gIGV2ZW50SW5mbyogcmVhZEV2ZW50KCk7Ci0KLSAgLy8gZXZlbnQgY29ycnVwdGlvbi1yZWxhdGVkIGZ1bmN0aW9ucwotICBib29sIGlzRXZlbnRDb3JydXB0ZWQoKTsKLSAgdm9pZCBwZXJmb3JtUmVjb3ZlcnkoKTsKLQotICAvLyBVdGlsaXR5IGZ1bmN0aW9ucwotICB2b2lkIG9wZW5Mb2dGaWxlKCk7Ci0gIHZvaWQgZ2V0TmV4dEZsdXNoVGltZShzdHJ1Y3QgdGltZXNwZWMqIHRzX25leHRfZmx1c2gpOwotCi0gIC8vIENsYXNzIHZhcmlhYmxlcwotICByZWFkU3RhdGUgcmVhZFN0YXRlXzsKLSAgdWludDhfdCogcmVhZEJ1ZmZfOwotICBldmVudEluZm8qIGN1cnJlbnRFdmVudF87Ci0KLSAgdWludDMyX3QgcmVhZEJ1ZmZTaXplXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVBRF9CVUZGX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7Ci0KLSAgaW50MzJfdCByZWFkVGltZW91dF87Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfUkVBRF9USU1FT1VUX01TID0gMjAwOwotCi0gIC8vIHNpemUgb2YgY2h1bmtzIHRoYXQgZmlsZSB3aWxsIGJlIHNwbGl0IHVwIGludG8KLSAgdWludDMyX3QgY2h1bmtTaXplXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ0hVTktfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7Ci0KLSAgLy8gc2l6ZSBvZiBldmVudCBidWZmZXJzCi0gIHVpbnQzMl90IGV2ZW50QnVmZmVyU2l6ZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFID0gMTAwMDA7Ci0KLSAgLy8gbWF4IG51bWJlciBvZiBtaWNyb3NlY29uZHMgdGhhdCBjYW4gcGFzcyB3aXRob3V0IGZsdXNoaW5nCi0gIHVpbnQzMl90IGZsdXNoTWF4VXNfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfVVMgPSAzMDAwMDAwOwotCi0gIC8vIG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGZsdXNoaW5nCi0gIHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXNfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfQllURVMgPSAxMDAwICogMTAyNDsKLQotICAvLyBtYXggZXZlbnQgc2l6ZQotICB1aW50MzJfdCBtYXhFdmVudFNpemVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfRVZFTlRfU0laRSA9IDA7Ci0KLSAgLy8gbWF4IG51bWJlciBvZiBjb3JydXB0ZWQgZXZlbnRzIHBlciBjaHVuawotICB1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHNfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyA9IDA7Ci0KLSAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBFT0YgaXMgaGl0Ci0gIHVpbnQzMl90IGVvZlNsZWVwVGltZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTID0gNTAwICogMTAwMDsKLQotICAvLyBzbGVlcCBkdXJhdGlvbiB3aGVuIGEgY29ycnVwdGVkIGV2ZW50IGlzIGVuY291bnRlcmVkCi0gIHVpbnQzMl90IGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMgPSAxICogMTAwMCAqIDEwMDA7Ci0KLSAgLy8gc2xlZXAgZHVyYXRpb24gaW4gc2Vjb25kcyB3aGVuIGFuIElPIGVycm9yIGlzIGVuY291bnRlcmVkIGluIHRoZSB3cml0ZXIgdGhyZWFkCi0gIHVpbnQzMl90IHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMgPSA2MCAqIDEwMDAgKiAxMDAwOwotCi0gIC8vIHdyaXRlciB0aHJlYWQgaWQKLSAgcHRocmVhZF90IHdyaXRlclRocmVhZElkXzsKLQotICAvLyBidWZmZXJzIHRvIGhvbGQgZGF0YSBiZWZvcmUgaXQgaXMgZmx1c2hlZC4gRWFjaCBlbGVtZW50IG9mIHRoZSBidWZmZXIgc3RvcmVzIGEgbXNnIHRoYXQKLSAgLy8gbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBidWZmZXJzIGFyZSBzd2FwcGVkIGJ5IHRoZSB3cml0ZXIgdGhyZWFkLgotICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqZGVxdWV1ZUJ1ZmZlcl87Ci0gIFRGaWxlVHJhbnNwb3J0QnVmZmVyICplbnF1ZXVlQnVmZmVyXzsKLQotICAvLyBjb25kaXRpb25zIHVzZWQgdG8gYmxvY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKLSAgcHRocmVhZF9jb25kX3Qgbm90RnVsbF8sIG5vdEVtcHR5XzsKLSAgdm9sYXRpbGUgYm9vbCBjbG9zaW5nXzsKLQotICAvLyBUbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCi0gIHB0aHJlYWRfY29uZF90IGZsdXNoZWRfOwotICB2b2xhdGlsZSBib29sIGZvcmNlRmx1c2hfOwotCi0gIC8vIE11dGV4IHRoYXQgaXMgZ3JhYmJlZCB3aGVuIGVucXVldWVpbmcgYW5kIHN3YXBwaW5nIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMKLSAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKLQotICAvLyBGaWxlIGluZm9ybWF0aW9uCi0gIHN0ZDo6c3RyaW5nIGZpbGVuYW1lXzsKLSAgaW50IGZkXzsKLQotICAvLyBXaGV0aGVyIHRoZSB3cml0ZXIgdGhyZWFkIGFuZCBidWZmZXJzIGhhdmUgYmVlbiBpbml0aWFsaXplZAotICBib29sIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXzsKLQotICAvLyBPZmZzZXQgd2l0aGluIHRoZSBmaWxlCi0gIG9mZl90IG9mZnNldF87Ci0KLSAgLy8gZXZlbnQgY29ycnVwdGlvbiBpbmZvcm1hdGlvbgotICB1aW50MzJfdCBsYXN0QmFkQ2h1bmtfOwotICB1aW50MzJfdCBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXzsKLQotICBib29sIHJlYWRPbmx5XzsKLX07Ci0KLS8vIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBFT0YgaXMgaGl0Ci1jbGFzcyBURU9GRXhjZXB0aW9uIDogcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgVEVPRkV4Y2VwdGlvbigpOgotICAgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpIHt9OwotfTsKLQotCi0vLyB3cmFwcGVyIGNsYXNzIHRvIHByb2Nlc3MgZXZlbnRzIGZyb20gYSBmaWxlIGNvbnRhaW5pbmcgdGhyaWZ0IGV2ZW50cwotY2xhc3MgVEZpbGVQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHRoYXQgZGVmYXVsdHMgb3V0cHV0IHRyYW5zcG9ydCB0byBudWxsIHRyYW5zcG9ydAotICAgKgotICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKLSAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5Ci0gICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBmaWxlIHRyYW5zcG9ydAotICAgKi8KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7Ci0KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKLSAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5Ci0gICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBpbnB1dCBmaWxlIHRyYW5zcG9ydAotICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCB0cmFuc3BvcnQKLSAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgLyoqCi0gICAqIHByb2Nlc3NlcyBldmVudHMgZnJvbSB0aGUgZmlsZQotICAgKgotICAgKiBAcGFyYW0gbnVtRXZlbnRzIG51bWJlciBvZiBldmVudHMgdG8gcHJvY2VzcyAoMCBmb3IgdW5saW1pdGVkKQotICAgKiBAcGFyYW0gdGFpbCB0YWlscyB0aGUgZmlsZSBpZiB0cnVlCi0gICAqLwotICB2b2lkIHByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpOwotCi0gIC8qKgotICAgKiBwcm9jZXNzIGV2ZW50cyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjaHVuawotICAgKgotICAgKi8KLSAgdm9pZCBwcm9jZXNzQ2h1bmsoKTsKLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKLX07Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ZGYwZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9USHR0cENsaWVudC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLVRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKLX0KLQotVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpIDoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKLX0KLQotVEh0dHBDbGllbnQ6On5USHR0cENsaWVudCgpIHt9Ci0KLXZvaWQgVEh0dHBDbGllbnQ6OnBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgewotICBjaGFyKiBjb2xvbiA9IHN0cmNocihoZWFkZXIsICc6Jyk7Ci0gIGlmIChjb2xvbiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQzMl90IHN6ID0gY29sb24gLSBoZWFkZXI7Ci0gIGNoYXIqIHZhbHVlID0gY29sb24rMTsKLQotICBpZiAoc3RybmNtcChoZWFkZXIsICJUcmFuc2Zlci1FbmNvZGluZyIsIHN6KSA9PSAwKSB7Ci0gICAgaWYgKHN0cnN0cih2YWx1ZSwgImNodW5rZWQiKSAhPSBOVUxMKSB7Ci0gICAgICBjaHVua2VkXyA9IHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHN0cm5jbXAoaGVhZGVyLCAiQ29udGVudC1MZW5ndGgiLCBzeikgPT0gMCkgewotICAgIGNodW5rZWRfID0gZmFsc2U7Ci0gICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKLSAgfQotfQotCi1ib29sIFRIdHRwQ2xpZW50OjpwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSB7Ci0gIGNoYXIqIGh0dHAgPSBzdGF0dXM7Ci0KLSAgY2hhciogY29kZSA9IHN0cmNocihodHRwLCAnICcpOwotICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotCi0gICpjb2RlID0gJ1wwJzsKLSAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpIHt9OwotCi0gIGNoYXIqIG1zZyA9IHN0cmNocihjb2RlLCAnICcpOwotICBpZiAobXNnID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwotICB9Ci0gICptc2cgPSAnXDAnOwotCi0gIGlmIChzdHJjbXAoY29kZSwgIjIwMCIpID09IDApIHsKLSAgICAvLyBIVFRQIDIwMCA9IE9LLCB3ZSBnb3QgdGhlIHJlc3BvbnNlCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoc3RyY21wKGNvZGUsICIxMDAiKSA9PSAwKSB7Ci0gICAgLy8gSFRUUCAxMDAgPSBjb250aW51ZSwganVzdCBrZWVwIHJlYWRpbmcKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotfQotCi12b2lkIFRIdHRwQ2xpZW50OjpmbHVzaCgpIHsKLSAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBsZW47Ci0gIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7Ci0KLSAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgotICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgaCA8PAotICAgICJQT1NUICIgPDwgcGF0aF8gPDwgIiBIVFRQLzEuMSIgPDwgQ1JMRiA8PAotICAgICJIb3N0OiAiIDw8IGhvc3RfIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PAotICAgICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRiA8PAotICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8Ci0gICAgIlVzZXItQWdlbnQ6IFRocmlmdC8iIDw8IFZFUlNJT04gPDwgIiAoQysrL1RIdHRwQ2xpZW50KSIgPDwgQ1JMRiA8PAotICAgIENSTEY7Ci0gIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwotCi0gIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKLSAgdHJhbnNwb3J0Xy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWhlYWRlci5jX3N0cigpLCBoZWFkZXIuc2l6ZSgpKTsKLSAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotCi0gIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKLSAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7Ci0gIHJlYWRIZWFkZXJzXyA9IHRydWU7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIwNjNkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGg9IiIpOwotCi0gIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoPSIiKTsKLQotICB2aXJ0dWFsIH5USHR0cENsaWVudCgpOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICB2aXJ0dWFsIHZvaWQgcGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKTsKLSAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NmMwZjYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1USHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gIFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCkgewotfQotCi1USHR0cFNlcnZlcjo6flRIdHRwU2VydmVyKCkge30KLQotdm9pZCBUSHR0cFNlcnZlcjo6cGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSB7Ci0gIGNoYXIqIGNvbG9uID0gc3RyY2hyKGhlYWRlciwgJzonKTsKLSAgaWYgKGNvbG9uID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3Qgc3ogPSBjb2xvbiAtIGhlYWRlcjsKLSAgY2hhciogdmFsdWUgPSBjb2xvbisxOwotCi0gIGlmIChzdHJuY21wKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIiwgc3opID09IDApIHsKLSAgICBpZiAoc3Ryc3RyKHZhbHVlLCAiY2h1bmtlZCIpICE9IE5VTEwpIHsKLSAgICAgIGNodW5rZWRfID0gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoc3RybmNtcChoZWFkZXIsICJDb250ZW50LUxlbmd0aCIsIHN6KSA9PSAwKSB7Ci0gICAgY2h1bmtlZF8gPSBmYWxzZTsKLSAgICBjb250ZW50TGVuZ3RoXyA9IGF0b2kodmFsdWUpOwotICB9Ci19Ci0KLWJvb2wgVEh0dHBTZXJ2ZXI6OnBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpIHsKLSAgY2hhciogbWV0aG9kID0gc3RhdHVzOwotCi0gIGNoYXIqIHBhdGggPSBzdHJjaHIobWV0aG9kLCAnICcpOwotICBpZiAocGF0aCA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotCi0gICpwYXRoID0gJ1wwJzsKLSAgd2hpbGUgKCooKytwYXRoKSA9PSAnICcpIHt9OwotCi0gIGNoYXIqIGh0dHAgPSBzdHJjaHIocGF0aCwgJyAnKTsKLSAgaWYgKGh0dHAgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7Ci0gIH0KLSAgKmh0dHAgPSAnXDAnOwotCi0gIGlmIChzdHJjbXAobWV0aG9kLCAiUE9TVCIpID09IDApIHsKLSAgICAvLyBQT1NUIG1ldGhvZCBvaywgbG9va2luZyBmb3IgY29udGVudC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1cyAodW5zdXBwb3J0ZWQgbWV0aG9kKTogIikgKyBzdGF0dXMpOwotfQotCi12b2lkIFRIdHRwU2VydmVyOjpmbHVzaCgpIHsKLSAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBsZW47Ci0gIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7Ci0KLSAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgotICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgaCA8PAotICAgICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwKLSAgICAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwKLSAgICAiU2VydmVyOiBUaHJpZnQvIiA8PCBWRVJTSU9OIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PAotICAgICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRiA8PAotICAgICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIiA8PCBDUkxGIDw8Ci0gICAgQ1JMRjsKLSAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAotICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIGhlYWRlci5zaXplKCkpOwotICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7Ci0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0KLSAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcwotICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKLSAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKLX0KLQotc3RkOjpzdHJpbmcgVEh0dHBTZXJ2ZXI6OmdldFRpbWVSRkMxMTIzKCkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERheXNbXSA9IHsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0In07Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBNb250aHNbXSA9IHsiSmFuIiwiRmViIiwiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsIkF1ZyIsICJTZXAiLCAiT2N0IiwiTm92IiwiRGVjIn07Ci0gIGNoYXIgYnVmZlsxMjhdOwotICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7Ci0gIHRtKiBicm9rZW5fdCA9IGdtdGltZSgmdCk7Ci0KLSAgc3ByaW50ZihidWZmLCIlcywgJWQgJXMgJWQgJWQ6JWQ6JWQgR01UIiwKLSAgICAgICAgICBEYXlzW2Jyb2tlbl90LT50bV93ZGF5XSwgYnJva2VuX3QtPnRtX21kYXksIE1vbnRoc1ticm9rZW5fdC0+dG1fbW9uXSwKLSAgICAgICAgICBicm9rZW5fdC0+dG1feWVhciArIDE5MDAsCi0gICAgICAgICAgYnJva2VuX3QtPnRtX2hvdXIsYnJva2VuX3QtPnRtX21pbixicm9rZW5fdC0+dG1fc2VjKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmYpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMzQwOC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXyAxCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKLQotICB2aXJ0dWFsIH5USHR0cFNlcnZlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHZvaWQgcmVhZEhlYWRlcnMoKTsKLSAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7Ci0gIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKLSAgc3RkOjpzdHJpbmcgZ2V0VGltZVJGQzExMjMoKTsKLQotfTsKLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIEhUVFAgcHJvdG9jb2wKLSAqLwotY2xhc3MgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIdHRwU2VydmVyKHRyYW5zKSk7Ci0gIH0KLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZlMjA3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8vIFllYWgsIHllYWgsIGhhY2t5IHRvIHB1dCB0aGVzZSBoZXJlLCBJIGtub3cuCi1jb25zdCBjaGFyKiBUSHR0cFRyYW5zcG9ydDo6Q1JMRiA9ICJcclxuIjsKLWNvbnN0IGludCBUSHR0cFRyYW5zcG9ydDo6Q1JMRl9MRU4gPSAyOwotCi1USHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gIHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKLSAgcmVhZEhlYWRlcnNfKHRydWUpLAotICBjaHVua2VkXyhmYWxzZSksCi0gIGNodW5rZWREb25lXyhmYWxzZSksCi0gIGNodW5rU2l6ZV8oMCksCi0gIGNvbnRlbnRMZW5ndGhfKDApLAotICBodHRwQnVmXyhOVUxMKSwKLSAgaHR0cFBvc18oMCksCi0gIGh0dHBCdWZMZW5fKDApLAotICBodHRwQnVmU2l6ZV8oMTAyNCkgewotICBpbml0KCk7Ci19Ci0KLXZvaWQgVEh0dHBUcmFuc3BvcnQ6OmluaXQoKSB7Ci0gIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6bWFsbG9jKGh0dHBCdWZTaXplXysxKTsKLSAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKLSAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICB9Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci19Ci0KLVRIdHRwVHJhbnNwb3J0Ojp+VEh0dHBUcmFuc3BvcnQoKSB7Ci0gIGlmIChodHRwQnVmXyAhPSBOVUxMKSB7Ci0gICAgc3RkOjpmcmVlKGh0dHBCdWZfKTsKLSAgfQotfQotCi11aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAocmVhZEJ1ZmZlcl8uYXZhaWxhYmxlX3JlYWQoKSA9PSAwKSB7Ci0gICAgcmVhZEJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKLSAgICB1aW50MzJfdCBnb3QgPSByZWFkTW9yZURhdGEoKTsKLSAgICBpZiAoZ290ID09IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIGxlbik7Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkRW5kKCkgewotICAvLyBSZWFkIGFueSBwZW5kaW5nIGNodW5rZWQgZGF0YSAoZm9vdGVycyBldGMuKQotICBpZiAoY2h1bmtlZF8pIHsKLSAgICB3aGlsZSAoIWNodW5rZWREb25lXykgewotICAgICAgcmVhZENodW5rZWQoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkTW9yZURhdGEoKSB7Ci0gIHVpbnQzMl90IHNpemU7Ci0KLSAgLy8gR2V0IG1vcmUgZGF0YSEKLSAgcmVmaWxsKCk7Ci0KLSAgaWYgKHJlYWRIZWFkZXJzXykgewotICAgIHJlYWRIZWFkZXJzKCk7Ci0gIH0KLQotICBpZiAoY2h1bmtlZF8pIHsKLSAgICBzaXplID0gcmVhZENodW5rZWQoKTsKLSAgfSBlbHNlIHsKLSAgICBzaXplID0gcmVhZENvbnRlbnQoY29udGVudExlbmd0aF8pOwotICB9Ci0gIHJlYWRIZWFkZXJzXyA9IHRydWU7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZENodW5rZWQoKSB7Ci0gIHVpbnQzMl90IGxlbmd0aCA9IDA7Ci0KLSAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7Ci0gIHVpbnQzMl90IGNodW5rU2l6ZSA9IHBhcnNlQ2h1bmtTaXplKGxpbmUpOwotICBpZiAoY2h1bmtTaXplID09IDApIHsKLSAgICByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBSZWFkIGRhdGEgY29udGVudAotICAgIGxlbmd0aCArPSByZWFkQ29udGVudChjaHVua1NpemUpOwotICAgIC8vIFJlYWQgdHJhaWxpbmcgQ1JMRiBhZnRlciBjb250ZW50Ci0gICAgcmVhZExpbmUoKTsKLSAgfQotICByZXR1cm4gbGVuZ3RoOwotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWFkQ2h1bmtlZEZvb3RlcnMoKSB7Ci0gIC8vIEVuZCBvZiBkYXRhLCByZWFkIGZvb3RlciBsaW5lcyB1bnRpbCBhIGJsYW5rIG9uZSBhcHBlYXJzCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7Ci0gICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwKSB7Ci0gICAgICBjaHVua2VkRG9uZV8gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpwYXJzZUNodW5rU2l6ZShjaGFyKiBsaW5lKSB7Ci0gIGNoYXIqIHNlbWkgPSBzdHJjaHIobGluZSwgJzsnKTsKLSAgaWYgKHNlbWkgIT0gTlVMTCkgewotICAgICpzZW1pID0gJ1wwJzsKLSAgfQotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc3NjYW5mKGxpbmUsICIleCIsICZzaXplKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkQ29udGVudCh1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IG5lZWQgPSBzaXplOwotICB3aGlsZSAobmVlZCA+IDApIHsKLSAgICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZMZW5fIC0gaHR0cFBvc187Ci0gICAgaWYgKGF2YWlsID09IDApIHsKLSAgICAgIC8vIFdlIGhhdmUgZ2l2ZW4gYWxsIHRoZSBkYXRhLCByZXNldCBwb3NpdGlvbiB0byBoZWFkIG9mIHRoZSBidWZmZXIKLSAgICAgIGh0dHBQb3NfID0gMDsKLSAgICAgIGh0dHBCdWZMZW5fID0gMDsKLSAgICAgIHJlZmlsbCgpOwotCi0gICAgICAvLyBOb3cgaGF2ZSBhdmFpbGFibGUgaG93ZXZlciBtdWNoIHdlIHJlYWQKLSAgICAgIGF2YWlsID0gaHR0cEJ1Zkxlbl87Ci0gICAgfQotICAgIHVpbnQzMl90IGdpdmUgPSBhdmFpbDsKLSAgICBpZiAobmVlZCA8IGdpdmUpIHsKLSAgICAgIGdpdmUgPSBuZWVkOwotICAgIH0KLSAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfK2h0dHBQb3NfKSwgZ2l2ZSk7Ci0gICAgaHR0cFBvc18gKz0gZ2l2ZTsKLSAgICBuZWVkIC09IGdpdmU7Ci0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWNoYXIqIFRIdHRwVHJhbnNwb3J0OjpyZWFkTGluZSgpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBlb2wgPSBOVUxMOwotCi0gICAgZW9sID0gc3Ryc3RyKGh0dHBCdWZfK2h0dHBQb3NfLCBDUkxGKTsKLQotICAgIC8vIE5vIENSTEYgeWV0PwotICAgIGlmIChlb2wgPT0gTlVMTCkgewotICAgICAgLy8gU2hpZnQgd2hhdGV2ZXIgd2UgaGF2ZSBub3cgdG8gZnJvbnQgYW5kIHJlZmlsbAotICAgICAgc2hpZnQoKTsKLSAgICAgIHJlZmlsbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBuZXh0IGxpbmUKLSAgICAgICplb2wgPSAnXDAnOwotICAgICAgY2hhciogbGluZSA9IGh0dHBCdWZfK2h0dHBQb3NfOwotICAgICAgaHR0cFBvc18gPSAoZW9sLWh0dHBCdWZfKSArIENSTEZfTEVOOwotICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBUSHR0cFRyYW5zcG9ydDo6c2hpZnQoKSB7Ci0gIGlmIChodHRwQnVmTGVuXyA+IGh0dHBQb3NfKSB7Ci0gICAgLy8gU2hpZnQgZG93biByZW1haW5pbmcgZGF0YSBhbmQgcmVhZCBtb3JlCi0gICAgdWludDMyX3QgbGVuZ3RoID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKLSAgICBtZW1tb3ZlKGh0dHBCdWZfLCBodHRwQnVmXytodHRwUG9zXywgbGVuZ3RoKTsKLSAgICBodHRwQnVmTGVuXyA9IGxlbmd0aDsKLSAgfSBlbHNlIHsKLSAgICBodHRwQnVmTGVuXyA9IDA7Ci0gIH0KLSAgaHR0cFBvc18gPSAwOwotICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOwotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWZpbGwoKSB7Ci0gIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl87Ci0gIGlmIChhdmFpbCA8PSAoaHR0cEJ1ZlNpemVfIC8gNCkpIHsKLSAgICBodHRwQnVmU2l6ZV8gKj0gMjsKLSAgICBodHRwQnVmXyA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXysxKTsKLSAgICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgewotICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZWFkIG1vcmUgZGF0YQotICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKCh1aW50OF90KikoaHR0cEJ1Zl8raHR0cEJ1Zkxlbl8pLCBodHRwQnVmU2l6ZV8taHR0cEJ1Zkxlbl8pOwotICBodHRwQnVmTGVuXyArPSBnb3Q7Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci0KLSAgaWYgKGdvdCA9PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IHJlZmlsbCBidWZmZXIiKTsKLSAgfQotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWFkSGVhZGVycygpIHsKLSAgLy8gSW5pdGlhbGl6ZSBoZWFkZXJzIHN0YXRlIHZhcmlhYmxlcwotICBjb250ZW50TGVuZ3RoXyA9IDA7Ci0gIGNodW5rZWRfID0gZmFsc2U7Ci0gIGNodW5rZWREb25lXyA9IGZhbHNlOwotICBjaHVua1NpemVfID0gMDsKLQotICAvLyBDb250cm9sIHN0YXRlIGZsb3cKLSAgYm9vbCBzdGF0dXNMaW5lID0gdHJ1ZTsKLSAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOwotCi0gIC8vIExvb3AgdW50aWwgaGVhZGVycyBhcmUgZmluaXNoZWQKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKLQotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgewotICAgICAgaWYgKGZpbmlzaGVkKSB7Ci0gICAgICAgIHJlYWRIZWFkZXJzXyA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBNdXN0IGhhdmUgYmVlbiBhbiBIVFRQIDEwMCwga2VlcCBnb2luZyBmb3IgYW5vdGhlciBzdGF0dXMgbGluZQotICAgICAgICBzdGF0dXNMaW5lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0YXR1c0xpbmUpIHsKLSAgICAgICAgc3RhdHVzTGluZSA9IGZhbHNlOwotICAgICAgICBmaW5pc2hlZCA9IHBhcnNlU3RhdHVzTGluZShsaW5lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFRIdHRwVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmLCBsZW4pOwotfQotCi19fX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2M2NWYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgIlRWaXJ0dWFsVHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGhyaWZ0IHRyYW5zcG9ydC4gVGhpcyB3YXMgaXJyaXRhdGluZwotICogdG8gd3JpdGUsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIGluIEMrKyBsYW5kIGFyZSBkYXVudGluZy4gTGlua2luZyBDVVJMCi0gKiByZXF1aXJlcyAyMyBkeW5hbWljIGxpYnJhcmllcyBsYXN0IHRpbWUgSSBjaGVja2VkIChXVEY/IT8pLiBBbGwgd2UgaGF2ZQotICogaGVyZSBpcyBhIFZFUlkgYmFzaWMgSFRUUC8xLjEgY2xpZW50IHdoaWNoIHN1cHBvcnRzIEhUVFAgMTAwIENvbnRpbnVlLAotICogY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZywga2VlcGFsaXZlLCBldGMuIFRlc3RlZCBhZ2FpbnN0IEFwYWNoZS4KLSAqLwotY2xhc3MgVEh0dHBUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEh0dHBUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6Ci0gIFRIdHRwVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7Ci0KLSAgdmlydHVhbCB+VEh0dHBUcmFuc3BvcnQoKTsKLQotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB1aW50MzJfdCByZWFkRW5kKCk7Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Ci0KLSAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87Ci0gIFRNZW1vcnlCdWZmZXIgcmVhZEJ1ZmZlcl87Ci0KLSAgYm9vbCByZWFkSGVhZGVyc187Ci0gIGJvb2wgY2h1bmtlZF87Ci0gIGJvb2wgY2h1bmtlZERvbmVfOwotICB1aW50MzJfdCBjaHVua1NpemVfOwotICB1aW50MzJfdCBjb250ZW50TGVuZ3RoXzsKLQotICBjaGFyKiBodHRwQnVmXzsKLSAgdWludDMyX3QgaHR0cFBvc187Ci0gIHVpbnQzMl90IGh0dHBCdWZMZW5fOwotICB1aW50MzJfdCBodHRwQnVmU2l6ZV87Ci0KLSAgdmlydHVhbCB2b2lkIGluaXQoKTsKLQotICB1aW50MzJfdCByZWFkTW9yZURhdGEoKTsKLSAgY2hhciogcmVhZExpbmUoKTsKLQotICB2b2lkIHJlYWRIZWFkZXJzKCk7Ci0gIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpID0gMDsKLSAgdmlydHVhbCBib29sIHBhcnNlU3RhdHVzTGluZShjaGFyKiBzdGF0dXMpID0gMDsKLQotICB1aW50MzJfdCByZWFkQ2h1bmtlZCgpOwotICB2b2lkIHJlYWRDaHVua2VkRm9vdGVycygpOwotICB1aW50MzJfdCBwYXJzZUNodW5rU2l6ZShjaGFyKiBsaW5lKTsKLQotICB1aW50MzJfdCByZWFkQ29udGVudCh1aW50MzJfdCBzaXplKTsKLQotICB2b2lkIHJlZmlsbCgpOwotICB2b2lkIHNoaWZ0KCk7Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIENSTEY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgQ1JMRl9MRU47Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA4ODk4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiVFNvY2tldC5oIgotI2luY2x1ZGUgIlRTZXJ2ZXJTb2NrZXQuaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2lmbmRlZiBBRl9MT0NBTAotI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0KSA6Ci0gIHBvcnRfKHBvcnQpLAotICBzZXJ2ZXJTb2NrZXRfKC0xKSwKLSAgYWNjZXB0QmFja2xvZ18oMTAyNCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkgOgotICBwb3J0Xyhwb3J0KSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAotICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KHN0cmluZyBwYXRoKSA6Ci0gIHBvcnRfKDApLAotICBwYXRoXyhwYXRoKSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgcmV0cnlMaW1pdF8oMCksCi0gIHJldHJ5RGVsYXlfKDApLAotICB0Y3BTZW5kQnVmZmVyXygwKSwKLSAgdGNwUmVjdkJ1ZmZlcl8oMCksCi0gIGludFNvY2sxXygtMSksCi0gIGludFNvY2syXygtMSkge30KLQotVFNlcnZlclNvY2tldDo6flRTZXJ2ZXJTb2NrZXQoKSB7Ci0gIGNsb3NlKCk7Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6c2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KSB7Ci0gIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgewotICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KSB7Ci0gIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7Ci0gIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSB7Ci0gIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSB7Ci0gIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7Ci0gIGludCBzdlsyXTsKLSAgaWYgKC0xID09IHNvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBzdikpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXRwYWlyKCkgIiwgZXJybm8pOwotICAgIGludFNvY2sxXyA9IC0xOwotICAgIGludFNvY2syXyA9IC0xOwotICB9IGVsc2UgewotICAgIGludFNvY2sxXyA9IHN2WzFdOwotICAgIGludFNvY2syXyA9IHN2WzBdOwotICB9Ci0KLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgaW50IGVycm9yOwotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNiIpICsgMV07Ci0gIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgLy8gV2lsZGNhcmQgYWRkcmVzcwotICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnQsICZoaW50cywgJnJlczApOwotICBpZiAoZXJyb3IpIHsKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJnZXRhZGRyaW5mbyAlZDogJXMiLCBlcnJvciwgZ2FpX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKLSAgfQotCi0gIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCi0gIC8vIGludG8gaXB2NiBzcGFjZS4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewotICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOwotICB9IGVsc2UgewotICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwotICB9Ci0KLSAgaWYgKHNlcnZlclNvY2tldF8gPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFNldCByZXVzYWRkcmVzcyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0Ci0gIGludCBvbmUgPSAxOwotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICZvbmUsIHNpemVvZihvbmUpKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JFVVNFQUREUiAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JFVVNFQUREUiIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKLSAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgewotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdGNwU2VuZEJ1ZmZlcl8sIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0KLQotICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ0Y3BSZWN2QnVmZmVyXywgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICIsIGVycm5vX2NvcHkpOwotICAgICAgY2xvc2UoKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRiIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIC8vIERlZmVyIGFjY2VwdAotICAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBUQ1BfREVGRVJfQUNDRVBULAotICAgICAgICAgICAgICAgICAgICAgICAmb25lLCBzaXplb2Yob25lKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfREVGRVJfQUNDRVBUICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgVENQX0RFRkVSX0FDQ0VQVCIsIGVycm5vX2NvcHkpOwotICB9Ci0gICNlbmRpZiAvLyAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAotCi0gICNpZmRlZiBJUFY2X1Y2T05MWQotICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBpbnQgemVybyA9IDA7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgCi0gICAgICAgICAgJnplcm8sIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIElQVjZfVjZPTkxZICIsIGVycm5vKTsKLSAgICB9Ci0gIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0gIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQotICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0gIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgJmxpbmcsIHNpemVvZihsaW5nKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFVuaXggU29ja2V0cyBkbyBub3QgbmVlZCB0aGF0Ci0gIGlmIChwYXRoXy5lbXB0eSgpKSB7Ci0gICAgLy8gVENQIE5vZGVsYXksIHNwZWVkIG92ZXIgYmFuZHdpZHRoCi0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICZvbmUsIHNpemVvZihvbmUpKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAotICBpbnQgZmxhZ3MgPSBmY250bChzZXJ2ZXJTb2NrZXRfLCBGX0dFVEZMLCAwKTsKLSAgaWYgKGZsYWdzID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBmY250bCgpIEZfR0VURkwgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICBpZiAoLTEgPT0gZmNudGwoc2VydmVyU29ja2V0XywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgZmNudGwoKSBPX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgotICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgU09fUkVVU0VBRERSIGRvZXNuJ3QKLSAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCi0gIGludCByZXRyaWVzID0gMDsKLQotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgLy8gVW5peCBEb21haW4gU29ja2V0Ci0gICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7Ci0gICAgc29ja2xlbl90IGxlbjsKLQotICAgIGlmIChwYXRoXy5sZW5ndGgoKSA+IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIik7Ci0gICAgfQotCi0gICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzbnByaW50ZihhZGRyZXNzLnN1bl9wYXRoLCBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCksICIlcyIsIHBhdGhfLmNfc3RyKCkpOwotICAgIGxlbiA9IHNpemVvZihhZGRyZXNzKTsKLQotICAgIGRvIHsKLSAgICAgIGlmICgwID09IGJpbmQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgbGVuKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KLSAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChzbGVlcChyZXRyeURlbGF5XykgPT0gMCkpOwotICB9IGVsc2UgewotICAgIGRvIHsKLSAgICAgIGlmICgwID09IGJpbmQoc2VydmVyU29ja2V0XywgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bwotICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKHNsZWVwKHJldHJ5RGVsYXlfKSA9PSAwKSk7Ci0KLSAgICAvLyBmcmVlIGFkZHJpbmZvCi0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICB9Ci0KLSAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKLSAgaWYgKHJldHJpZXMgPiByZXRyeUxpbWl0XykgewotICAgIGNoYXIgZXJyYnVmWzEwMjRdOwotICAgIGlmICghIHBhdGhfLmVtcHR5KCkpIHsKLSAgICAgIHNwcmludGYoZXJyYnVmLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHNwcmludGYoZXJyYnVmLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKLSAgICB9Ci0gICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGJpbmQiKTsKLSAgfQotCi0gIC8vIENhbGwgbGlzdGVuCi0gIGlmICgtMSA9PSA6Omxpc3RlbihzZXJ2ZXJTb2NrZXRfLCBhY2NlcHRCYWNrbG9nXykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKLX0KLQotc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgewotICBpZiAoc2VydmVyU29ja2V0XyA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFNlcnZlclNvY2tldCBub3QgbGlzdGVuaW5nIik7Ci0gIH0KLQotICBzdHJ1Y3QgcG9sbGZkIGZkc1syXTsKLQotICBpbnQgbWF4RWludHJzID0gNTsKLSAgaW50IG51bUVpbnRycyA9IDA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzdGQ6Om1lbXNldChmZHMsIDAgLCBzaXplb2YoZmRzKSk7Ci0gICAgZmRzWzBdLmZkID0gc2VydmVyU29ja2V0XzsKLSAgICBmZHNbMF0uZXZlbnRzID0gUE9MTElOOwotICAgIGlmIChpbnRTb2NrMl8gPj0gMCkgewotICAgICAgZmRzWzFdLmZkID0gaW50U29jazJfOwotICAgICAgZmRzWzFdLmV2ZW50cyA9IFBPTExJTjsKLSAgICB9Ci0gICAgaW50IHJldCA9IHBvbGwoZmRzLCAyLCAtMSk7Ci0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgLy8gZXJyb3IgY2FzZXMKLSAgICAgIGlmIChlcnJubyA9PSBFSU5UUiAmJiAobnVtRWludHJzKysgPCBtYXhFaW50cnMpKSB7Ci0gICAgICAgIC8vIEVJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQotICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBwb2xsKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7Ci0gICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0gICAgICAvLyBDaGVjayBmb3IgYW4gaW50ZXJydXB0IHNpZ25hbAotICAgICAgaWYgKGludFNvY2syXyA+PSAwICYmIChmZHNbMV0ucmV2ZW50cyAmIFBPTExJTikpIHsKLSAgICAgICAgaW50OF90IGJ1ZjsKLSAgICAgICAgaWYgKC0xID09IHJlY3YoaW50U29jazJfLCAmYnVmLCBzaXplb2YoaW50OF90KSwgMCkpIHsKLSAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcmVjdigpIGludGVycnVwdCAiLCBlcnJubyk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgYmVpbmcgcmVhZHkKLSAgICAgIGlmIChmZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcG9sbCAwIik7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLSAgfQotCi0gIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGNsaWVudEFkZHJlc3M7Ci0gIGludCBzaXplID0gc2l6ZW9mKGNsaWVudEFkZHJlc3MpOwotICBpbnQgY2xpZW50U29ja2V0ID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2xlbl90ICopICZzaXplKTsKLQotICBpZiAoY2xpZW50U29ja2V0IDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCi0gIGludCBmbGFncyA9IGZjbnRsKGNsaWVudFNvY2tldCwgRl9HRVRGTCwgMCk7Ci0gIGlmIChmbGFncyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIGZjbnRsKCkgRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJmY250bChGX0dFVEZMKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgaWYgKC0xID09IGZjbnRsKGNsaWVudFNvY2tldCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBmY250bCgpIEZfU0VURkwgfk9fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiZmNudGwoRl9TRVRGTCkiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCkpOwotICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgewotICAgIGNsaWVudC0+c2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKLSAgfQotICBpZiAocmVjdlRpbWVvdXRfID4gMCkgewotICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKLSAgfQotICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikgJmNsaWVudEFkZHJlc3MsIHNpemUpOwotICAKLSAgcmV0dXJuIGNsaWVudDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSB7Ci0gIGlmIChpbnRTb2NrMV8gPj0gMCkgewotICAgIGludDhfdCBieXRlID0gMDsKLSAgICBpZiAoLTEgPT0gc2VuZChpbnRTb2NrMV8sICZieXRlLCBzaXplb2YoaW50OF90KSwgMCkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHNlbmQoKSAiLCBlcnJubyk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6Y2xvc2UoKSB7Ci0gIGlmIChzZXJ2ZXJTb2NrZXRfID49IDApIHsKLSAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBTSFVUX1JEV1IpOwotICAgIDo6Y2xvc2Uoc2VydmVyU29ja2V0Xyk7Ci0gIH0KLSAgaWYgKGludFNvY2sxXyA+PSAwKSB7Ci0gICAgOjpjbG9zZShpbnRTb2NrMV8pOwotICB9Ci0gIGlmIChpbnRTb2NrMl8gPj0gMCkgewotICAgIDo6Y2xvc2UoaW50U29jazJfKTsKLSAgfQotICBzZXJ2ZXJTb2NrZXRfID0gLTE7Ci0gIGludFNvY2sxXyA9IC0xOwotICBpbnRTb2NrMl8gPSAtMTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Q1MjFmLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfIDEKLQotI2luY2x1ZGUgIlRTZXJ2ZXJUcmFuc3BvcnQuaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotY2xhc3MgVFNvY2tldDsKLQotLyoqCi0gKiBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuIFdyYXBwZXIgYXJvdW5kIGEgdW5peAotICogc29ja2V0IGxpc3RlbiBhbmQgYWNjZXB0IGNhbGxzLgotICoKLSAqLwotY2xhc3MgVFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOwotICBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCk7Ci0gIFRTZXJ2ZXJTb2NrZXQoc3RkOjpzdHJpbmcgcGF0aCk7Ci0KLSAgflRTZXJ2ZXJTb2NrZXQoKTsKLQotICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCk7Ci0gIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KTsKLQotICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOwotICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOwotCi0gIHZvaWQgc2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcik7Ci0gIHZvaWQgc2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcik7Ci0KLSAgdm9pZCBsaXN0ZW4oKTsKLSAgdm9pZCBjbG9zZSgpOwotCi0gIHZvaWQgaW50ZXJydXB0KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKLQotIHByaXZhdGU6Ci0gIGludCBwb3J0XzsKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0gIGludCBzZXJ2ZXJTb2NrZXRfOwotICBpbnQgYWNjZXB0QmFja2xvZ187Ci0gIGludCBzZW5kVGltZW91dF87Ci0gIGludCByZWN2VGltZW91dF87Ci0gIGludCByZXRyeUxpbWl0XzsKLSAgaW50IHJldHJ5RGVsYXlfOwotICBpbnQgdGNwU2VuZEJ1ZmZlcl87Ci0gIGludCB0Y3BSZWN2QnVmZmVyXzsKLQotICBpbnQgaW50U29jazFfOwotICBpbnQgaW50U29jazJfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmJjNmMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSAiVFRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBTZXJ2ZXIgdHJhbnNwb3J0IGZyYW1ld29yay4gQSBzZXJ2ZXIgbmVlZHMgdG8gaGF2ZSBzb21lIGZhY2lsaXR5IGZvcgotICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4KLSAqCi0gKi8KLWNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VFNlcnZlclRyYW5zcG9ydCgpIHt9Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucy4gUHJpb3IgdG8gdGhpcwotICAgKiBjYWxsIG1vc3QgdHJhbnNwb3J0cyB3aWxsIG5vdCByZXR1cm4gYW55dGhpbmcgd2hlbiBhY2NlcHQgaXMgY2FsbGVkLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd2Ugd2VyZSB1bmFibGUgdG8gbGlzdGVuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgbGlzdGVuKCkge30KLQotICAvKioKLSAgICogR2V0cyBhIG5ldyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdHJhbnNwb3J0IG9iamVjdCBhbmQgcGFzc2VzIGl0IHRvIHRoZQotICAgKiBjYWxsZXIuIE5vdGUgdGhhdCBpdCBpcyB0aGUgZXhwbGljaXQgZHV0eSBvZiB0aGUgY2FsbGVyIHRvIGZyZWUgdGhlCi0gICAqIGFsbG9jYXRlZCBvYmplY3QuIFRoZSByZXR1cm5lZCBUVHJhbnNwb3J0IG9iamVjdCBtdXN0IGFsd2F5cyBiZSBpbiB0aGUKLSAgICogb3BlbmVkIHN0YXRlLiBOVUxMIHNob3VsZCBuZXZlciBiZSByZXR1cm5lZCwgaW5zdGVhZCBhbiBFeGNlcHRpb24gc2hvdWxkCi0gICAqIGFsd2F5cyBiZSB0aHJvd24uCi0gICAqCi0gICAqIEByZXR1cm4gQSBuZXcgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEZvciAic21hcnQiIFRTZXJ2ZXJUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRoYXQgd29yayBpbiBhIG11bHRpCi0gICAqIHRocmVhZGVkIGNvbnRleHQgdGhpcyBjYW4gYmUgdXNlZCB0byBicmVhayBvdXQgb2YgYW4gYWNjZXB0KCkgY2FsbC4KLSAgICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgdHJhbnNwb3J0IHdpbGwgdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uCi0gICAqIHdpdGggdGhlIGludGVycnVwdGVkIGVycm9yIGNvZGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30KLQotICAvKioKLSAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgVFNlcnZlclRyYW5zcG9ydCgpIHt9Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGZvciBhY2NlcHQuCi0gICAqCi0gICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBlYjg2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IG1lYW50IGZvciB0ZXN0aW5nLiAgSXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQuCi0gKiBDYWxscyB0byByZWFkIGFyZSBwYXNzZWQgdGhyb3VnaCB3aXRoIHNvbWUgcHJvYmFiaWxpdHkuICBPdGhlcndpc2UsCi0gKiB0aGUgcmVhZCBhbW91bnQgaXMgcmFuZG9tbHkgcmVkdWNlZCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRocm91Z2guCi0gKgotICovCi1jbGFzcyBUU2hvcnRSZWFkVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRTaG9ydFJlYWRUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6Ci0gIFRTaG9ydFJlYWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCBmdWxsUHJvYl8oZnVsbF9wcm9iKQotICB7fQotCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOwotICB9Ci0KLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChyYW5kKCkvKGRvdWJsZSlSQU5EX01BWCA+PSBmdWxsUHJvYl8pIHsKLSAgICAgIGxlbiA9IDEgKyByYW5kKCklbGVuOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cmVhZChidWYsIGxlbik7Ci0gIH0KLQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICB9Ci0KLSAgdm9pZCBmbHVzaCgpIHsKLSAgICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotICB9Ci0KLSAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5ib3Jyb3coYnVmLCBsZW4pOwotICB9Ci0KLSAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5jb25zdW1lKGxlbik7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Ci0gIGRvdWJsZSBmdWxsUHJvYl87Ci19OwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3QKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGE1NzQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlRTaW1wbGVGaWxlVHJhbnNwb3J0LmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLVRTaW1wbGVGaWxlVHJhbnNwb3J0OjoKLVRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIHJlYWQsIGJvb2wgd3JpdGUpCi0gICAgOiBURkRUcmFuc3BvcnQoLTEsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSkgewotICBpbnQgZmxhZ3MgPSAwOwotICBpZiAocmVhZCAmJiB3cml0ZSkgewotICAgIGZsYWdzID0gT19SRFdSOwotICB9IGVsc2UgaWYgKHJlYWQpIHsKLSAgICBmbGFncyA9IE9fUkRPTkxZOwotICB9IGVsc2UgaWYgKHdyaXRlKSB7Ci0gICAgZmxhZ3MgPSBPX1dST05MWTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOZWl0aGVyIFJFQUQgbm9yIFdSSVRFIHNwZWNpZmllZCIpOwotICB9Ci0gIGlmICh3cml0ZSkgewotICAgIGZsYWdzIHw9IE9fQ1JFQVQgfCBPX0FQUEVORDsKLSAgfQotICBpbnQgZmQgPSA6Om9wZW4ocGF0aC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUnwgU19JUkdSUCB8IFNfSVJPVEgpOwotICBpZiAoZmQgPCAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiZmFpbGVkIHRvIG9wZW4gZmlsZSBmb3Igd3JpdGluZzogIiArIHBhdGgpOwotICB9Ci0gIHNldEZEKGZkKTsKLSAgb3BlbigpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjNTJlYS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlICJURkRUcmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBEZWFkLXNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIGZpbGUuCi0gKgotICogV3JpdGVhYmxlIGZpbGVzIGFyZSBvcGVuZWQgd2l0aCBPX0NSRUFUIGFuZCBPX0FQUEVORAotICovCi1jbGFzcyBUU2ltcGxlRmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURkRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCA9ICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlID0gZmFsc2UpOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2NiNTZkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgPHN5cy9wb2xsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpbmNsdWRlICJjb25jdXJyZW5jeS9Nb25pdG9yLmgiCi0jaW5jbHVkZSAiVFNvY2tldC5oIgotI2luY2x1ZGUgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLy8gR2xvYmFsIHZhciB0byB0cmFjayB0b3RhbCBzb2NrZXQgc3lzIGNhbGxzCi11aW50MzJfdCBnX3NvY2tldF9zeXNjYWxscyA9IDA7Ci0KLS8qKgotICogVFNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKi8KLQotVFNvY2tldDo6VFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQpIDoKLSAgaG9zdF8oaG9zdCksCi0gIHBvcnRfKHBvcnQpLAotICBwYXRoXygiIiksCi0gIHNvY2tldF8oLTEpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgewotICByZWN2VGltZXZhbF8udHZfc2VjID0gKGludCkocmVjdlRpbWVvdXRfLzEwMDApOwotICByZWN2VGltZXZhbF8udHZfdXNlYyA9IChpbnQpKChyZWN2VGltZW91dF8lMTAwMCkqMTAwMCk7Ci19Ci0KLVRTb2NrZXQ6OlRTb2NrZXQoc3RyaW5nIHBhdGgpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgcGF0aF8ocGF0aCksCi0gIHNvY2tldF8oLTEpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgewotICByZWN2VGltZXZhbF8udHZfc2VjID0gKGludCkocmVjdlRpbWVvdXRfLzEwMDApOwotICByZWN2VGltZXZhbF8udHZfdXNlYyA9IChpbnQpKChyZWN2VGltZW91dF8lMTAwMCkqMTAwMCk7Ci0gIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7Ci19Ci0KLVRTb2NrZXQ6OlRTb2NrZXQoKSA6Ci0gIGhvc3RfKCIiKSwKLSAgcG9ydF8oMCksCi0gIHBhdGhfKCIiKSwKLSAgc29ja2V0XygtMSksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLSAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKLX0KLQotVFNvY2tldDo6VFNvY2tldChpbnQgc29ja2V0KSA6Ci0gIGhvc3RfKCIiKSwKLSAgcG9ydF8oMCksCi0gIHBhdGhfKCIiKSwKLSAgc29ja2V0Xyhzb2NrZXQpLAotICBjb25uVGltZW91dF8oMCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBsaW5nZXJPbl8oMSksCi0gIGxpbmdlclZhbF8oMCksCi0gIG5vRGVsYXlfKDEpLAotICBtYXhSZWN2UmV0cmllc18oNSkgewotICByZWN2VGltZXZhbF8udHZfc2VjID0gKGludCkocmVjdlRpbWVvdXRfLzEwMDApOwotICByZWN2VGltZXZhbF8udHZfdXNlYyA9IChpbnQpKChyZWN2VGltZW91dF8lMTAwMCkqMTAwMCk7Ci0gIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7Ci19Ci0KLVRTb2NrZXQ6On5UU29ja2V0KCkgewotICBjbG9zZSgpOwotfQotCi1ib29sIFRTb2NrZXQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIChzb2NrZXRfID49IDApOwotfQotCi1ib29sIFRTb2NrZXQ6OnBlZWsoKSB7Ci0gIGlmICghaXNPcGVuKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDhfdCBidWY7Ci0gIGludCByID0gcmVjdihzb2NrZXRfLCAmYnVmLCAxLCBNU0dfUEVFSyk7Ci0gIGlmIChyID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCi0gICAgLyogc2hpZ2luOgotICAgICAqIGZyZWVic2QgcmV0dXJucyAtMSBhbmQgRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieSAKLSAgICAgKiB0aGUgb3RoZXIgc2lkZQotICAgICAqLwotICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpCi0gICAgewotICAgICAgY2xvc2UoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgI2VuZGlmCi0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cGVlaygpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZWN2KCkiLCBlcnJub19jb3B5KTsKLSAgfQotICByZXR1cm4gKHIgPiAwKTsKLX0KLQotdm9pZCBUU29ja2V0OjpvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8gKnJlcykgewotICBpZiAoaXNPcGVuKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgc29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7Ci0gIH0gZWxzZSB7Ci0gICAgc29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7Ci0gIH0KLQotICBpZiAoc29ja2V0XyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIHNvY2tldCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gU2VuZCB0aW1lb3V0Ci0gIGlmIChzZW5kVGltZW91dF8gPiAwKSB7Ci0gICAgc2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKLSAgfQotCi0gIC8vIFJlY3YgdGltZW91dAotICBpZiAocmVjdlRpbWVvdXRfID4gMCkgewotICAgIHNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7Ci0gIH0KLQotICAvLyBMaW5nZXIKLSAgc2V0TGluZ2VyKGxpbmdlck9uXywgbGluZ2VyVmFsXyk7Ci0KLSAgLy8gTm8gZGVsYXkKLSAgc2V0Tm9EZWxheShub0RlbGF5Xyk7Ci0KLSAgLy8gVXNlcyBhIGxvdyBtaW4gUlRPIGlmIGFza2VkIHRvLgotI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwotICBpZiAoZ2V0VXNlTG93TWluUnRvKCkpIHsKLSAgICBpbnQgb25lID0gMTsKLSAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sICZvbmUsIHNpemVvZihvbmUpKTsKLSAgfQotI2VuZGlmCi0KLQotICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cwotICBpbnQgZmxhZ3MgPSBmY250bChzb2NrZXRfLCBGX0dFVEZMLCAwKTsKLSAgaWYgKGNvbm5UaW1lb3V0XyA+IDApIHsKLSAgICBpZiAoLTEgPT0gZmNudGwoc29ja2V0XywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBmY250bCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICgtMSA9PSBmY250bChzb2NrZXRfLCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBmY250bCAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIC8vIENvbm5lY3QgdGhlIHNvY2tldAotICBpbnQgcmV0OwotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7Ci0gICAgc29ja2xlbl90IGxlbjsKLQotICAgIGlmIChwYXRoXy5sZW5ndGgoKSA+IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIpOwotICAgIH0KLQotICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gICAgc25wcmludGYoYWRkcmVzcy5zdW5fcGF0aCwgc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpLCAiJXMiLCBwYXRoXy5jX3N0cigpKTsKLSAgICBsZW4gPSBzaXplb2YoYWRkcmVzcyk7Ci0gICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyZXNzLCBsZW4pOwotICB9IGVsc2UgewotICAgIHJldCA9IGNvbm5lY3Qoc29ja2V0XywgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pOwotICB9Ci0KLSAgLy8gc3VjY2VzcyBjYXNlCi0gIGlmIChyZXQgPT0gMCkgewotICAgIGdvdG8gZG9uZTsKLSAgfQotCi0gIGlmIChlcnJubyAhPSBFSU5QUk9HUkVTUykgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGNvbm5lY3QoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiY29ubmVjdCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICB9Ci0KLQotICBzdHJ1Y3QgcG9sbGZkIGZkc1sxXTsKLSAgc3RkOjptZW1zZXQoZmRzLCAwICwgc2l6ZW9mKGZkcykpOwotICBmZHNbMF0uZmQgPSBzb2NrZXRfOwotICBmZHNbMF0uZXZlbnRzID0gUE9MTE9VVDsKLSAgcmV0ID0gcG9sbChmZHMsIDEsIGNvbm5UaW1lb3V0Xyk7Ci0KLSAgaWYgKHJldCA+IDApIHsKLSAgICAvLyBFbnN1cmUgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9ycyBzZXQKLSAgICBpbnQgdmFsOwotICAgIHNvY2tsZW5fdCBsb247Ci0gICAgbG9uID0gc2l6ZW9mKGludCk7Ci0gICAgaW50IHJldDIgPSBnZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSZ2YWwsICZsb24pOwotICAgIGlmIChyZXQyID09IC0xKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGdldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJnZXRzb2Nrb3B0KCkiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgotICAgIGlmICh2YWwgPT0gMCkgewotICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBwb2xsKSAiICsgZ2V0U29ja2V0SW5mbygpLCB2YWwpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQgb3BlbigpIGVycm9yIiwgdmFsKTsKLSAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewotICAgIC8vIHNvY2tldCB0aW1lZCBvdXQKLSAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSB0aW1lZCBvdXQgIiArIGdldFNvY2tldEluZm8oKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJvcGVuKCkgdGltZWQgb3V0Iik7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gZXJyb3Igb24gcG9sbCgpCi0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgcG9sbCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJwb2xsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotIGRvbmU6Ci0gIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCi0gIGZjbnRsKHNvY2tldF8sIEZfU0VURkwsIGZsYWdzKTsKLQotICBzZXRDYWNoZWRBZGRyZXNzKHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKTsKLX0KLQotdm9pZCBUU29ja2V0OjpvcGVuKCkgewotICBpZiAoaXNPcGVuKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgewotICAgIHVuaXhfb3BlbigpOwotICB9IGVsc2UgewotICAgIGxvY2FsX29wZW4oKTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnVuaXhfb3BlbigpewotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgLy8gVW5peCBEb21haW4gU09ja2V0IGRvZXMgbm90IG5lZWQgYWRkcmluZm8gc3RydWN0LCBzbyB3ZSBwYXNzIE5VTEwKLSAgICBvcGVuQ29ubmVjdGlvbihOVUxMKTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OmxvY2FsX29wZW4oKXsKLSAgaWYgKGlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKLSAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7Ci0gIH0KLQotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICByZXMgPSBOVUxMOwotICByZXMwID0gTlVMTDsKLSAgaW50IGVycm9yOwotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKLSAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RfLmNfc3RyKCksIHBvcnQsICZoaW50cywgJnJlczApOwotCi0gIGlmIChlcnJvcikgewotICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIGdldGFkZHJpbmZvKCkgIiArIGdldFNvY2tldEluZm8oKSArIHN0cmluZyhnYWlfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIGNsaWVudCBzb2NrZXQuIik7Ci0gIH0KLQotICAvLyBDeWNsZSB0aHJvdWdoIGFsbCB0aGUgcmV0dXJuZWQgYWRkcmVzc2VzIHVudGlsIG9uZQotICAvLyBjb25uZWN0cyBvciBwdXNoIHRoZSBleGNlcHRpb24gdXAuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICB0cnkgewotICAgICAgb3BlbkNvbm5lY3Rpb24ocmVzKTsKLSAgICAgIGJyZWFrOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKHJlcy0+YWlfbmV4dCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOyAvLyBjbGVhbnVwIG9uIGZhaWx1cmUKLSAgICAgICAgdGhyb3c7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gRnJlZSBhZGRyZXNzIHN0cnVjdHVyZSBtZW1vcnkKLSAgZnJlZWFkZHJpbmZvKHJlczApOwotfQotCi12b2lkIFRTb2NrZXQ6OmNsb3NlKCkgewotICBpZiAoc29ja2V0XyA+PSAwKSB7Ci0gICAgc2h1dGRvd24oc29ja2V0XywgU0hVVF9SRFdSKTsKLSAgICA6OmNsb3NlKHNvY2tldF8pOwotICB9Ci0gIHNvY2tldF8gPSAtMTsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRTb2NrZXRGRChpbnQgc29ja2V0KSB7Ci0gIGlmIChzb2NrZXRfID49IDApIHsKLSAgICBjbG9zZSgpOwotICB9Ci0gIHNvY2tldF8gPSBzb2NrZXQ7Ci19Ci0KLXVpbnQzMl90IFRTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHNvY2tldCIpOwotICB9Ci0KLSAgaW50MzJfdCByZXRyaWVzID0gMDsKLQotICAvLyBFQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgotICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgotICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKLSAgLy8gRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCi0gIHVpbnQzMl90IGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IDA7Ci0gIGlmIChyZWN2VGltZW91dF8pIHsKLSAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KLSAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKLSAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycwotICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8qMTAwMCkvICgobWF4UmVjdlJldHJpZXNfPjApID8gbWF4UmVjdlJldHJpZXNfIDogMik7Ci0gIH0KLQotIHRyeV9hZ2FpbjoKLSAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKLSAgc3RydWN0IHRpbWV2YWwgYmVnaW47Ci0gIGlmIChyZWN2VGltZW91dF8gPiAwKSB7Ci0gICAgZ2V0dGltZW9mZGF5KCZiZWdpbiwgTlVMTCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgotICAgIC8vIGFuIEVBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCi0gICAgYmVnaW4udHZfc2VjID0gYmVnaW4udHZfdXNlYyA9IDA7Ci0gIH0KLSAgaW50IGdvdCA9IHJlY3Yoc29ja2V0XywgYnVmLCBsZW4sIDApOwotICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAvL2dldHRpbWVvZmRheSBjYW4gY2hhbmdlIGVycm5vCi0gICsrZ19zb2NrZXRfc3lzY2FsbHM7Ci0KLSAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKLSAgaWYgKGdvdCA8IDApIHsKLSAgICBpZiAoZXJybm9fY29weSA9PSBFQUdBSU4pIHsKLSAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgotICAgICAgaWYgKHJlY3ZUaW1lb3V0XyA9PSAwKSB7Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOwotICAgICAgfQotICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCi0gICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7Ci0gICAgICBnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7Ci0gICAgICB1aW50MzJfdCByZWFkRWxhcHNlZE1pY3JvcyA9ICAoKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgodWludDY0X3QpKGVuZC50dl91c2VjIC0gYmVnaW4udHZfdXNlYykpKSk7Ci0KLSAgICAgIGlmICghZWFnYWluVGhyZXNob2xkTWljcm9zIHx8IChyZWFkRWxhcHNlZE1pY3JvcyA8IGVhZ2FpblRocmVzaG9sZE1pY3JvcykpIHsKLSAgICAgICAgaWYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgewotICAgICAgICAgIHVzbGVlcCg1MCk7Ci0gICAgICAgICAgZ290byB0cnlfYWdhaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodGltZWQgb3V0KSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KLSAgICBpZiAoZXJybm9fY29weSA9PSBFSU5UUiAmJiByZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKLSAgICAgIGdvdG8gdHJ5X2FnYWluOwotICAgIH0KLQotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KLSAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKSB7Ci0gICAgICAvKiBzaGlnaW46IGZyZWVic2QgZG9lc24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdiBhbmQgZmFpbHMgd2l0aAotICAgICAgICogRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93biAKLSAgICAgICAqIGVkaGFsbDogZWxpbWluYXRlZCBjbG9zZSgpIHNpbmNlIHdlIGRvIHRoYXQgaW4gdGhlIGRlc3RydWN0b3IuCi0gICAgICAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAjZW5kaWYKLQotICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLQotICAgIC8vIElmIHdlIGRpc2Nvbm5lY3Qgd2l0aCBubyBsaW5nZXIgdGltZQotICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJFQ09OTlJFU0VUIik7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgotICAgIGlmIChlcnJub19jb3B5ID09IEVOT1RDT05OKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiRU5PVENPTk4iKTsKLSAgICB9Ci0KLSAgICAvLyBUaW1lZCBvdXQhCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRVRJTUVET1VUKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIkVUSU1FRE9VVCIpOwotICAgIH0KLQotICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBUaGUgcmVtb3RlIGhvc3QgaGFzIGNsb3NlZCB0aGUgc29ja2V0Ci0gIGlmIChnb3QgPT0gMCkgewotICAgIC8vIGVkaGFsbDogd2UgdXNlZCB0byBjYWxsIGNsb3NlKCkgaGVyZSwgYnV0IG91ciBjYWxsZXIgbWF5IHdhbnQgdG8gZGVhbAotICAgIC8vIHdpdGggdGhlIHNvY2tldCBmZCBhbmQgd2UnbGwgY2xvc2UoKSBpbiBvdXIgZGVzdHJ1Y3RvciBpbiBhbnkgY2FzZS4KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFBhY2sgZGF0YSBpbnRvIHN0cmluZwotICByZXR1cm4gZ290OwotfQotCi12b2lkIFRTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IHNlbnQgPSAwOwotCi0gIHdoaWxlIChzZW50IDwgbGVuKSB7Ci0gICAgdWludDMyX3QgYiA9IHdyaXRlX3BhcnRpYWwoYnVmICsgc2VudCwgbGVuIC0gc2VudCk7Ci0gICAgaWYgKGIgPT0gMCkgewotICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgd2UgZ290IDAgYmVjYXVzZSBzZW5kKCkgZXJyb3JlZCB3aXRoIEVBR0FJTiBkdWUgdG8KLSAgICAgIC8vIGxhY2sgb2Ygc3lzdGVtIHJlc291cmNlczsgcmVsZWFzZSB0aGUgQ1BVIGZvciBhIGJpdC4KLSAgICAgIHVzbGVlcCg1MCk7Ci0gICAgfQotICAgIHNlbnQgKz0gYjsKLSAgfQotfQotCi11aW50MzJfdCBUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Iik7Ci0gIH0KLQotICB1aW50MzJfdCBzZW50ID0gMDsKLQotICBpbnQgZmxhZ3MgPSAwOwotI2lmZGVmIE1TR19OT1NJR05BTAotICAvLyBOb3RlIHRoZSB1c2Ugb2YgTVNHX05PU0lHTkFMIHRvIHN1cHByZXNzIFNJR1BJUEUgZXJyb3JzLCBpbnN0ZWFkIHdlCi0gIC8vIGNoZWNrIGZvciB0aGUgRVBJUEUgcmV0dXJuIGNvbmRpdGlvbiBhbmQgY2xvc2UgdGhlIHNvY2tldCBpbiB0aGF0IGNhc2UKLSAgZmxhZ3MgfD0gTVNHX05PU0lHTkFMOwotI2VuZGlmIC8vIGlmZGVmIE1TR19OT1NJR05BTAotCi0gIGludCBiID0gc2VuZChzb2NrZXRfLCBidWYgKyBzZW50LCBsZW4gLSBzZW50LCBmbGFncyk7Ci0gICsrZ19zb2NrZXRfc3lzY2FsbHM7Ci0KLSAgaWYgKGIgPCAwKSB7Ci0gICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCi0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKCkgc2VuZCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRVBJUEUgfHwgZXJybm9fY29weSA9PSBFQ09OTlJFU0VUIHx8IGVycm5vX2NvcHkgPT0gRU5PVENPTk4pIHsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0KLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0gIAotICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAotICBpZiAoYiA9PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlNvY2tldCBzZW5kIHJldHVybmVkIDAuIik7Ci0gIH0KLSAgcmV0dXJuIGI7Ci19Ci0KLXN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldEhvc3QoKSB7Ci0gIHJldHVybiBob3N0XzsKLX0KLQotaW50IFRTb2NrZXQ6OmdldFBvcnQoKSB7Ci0gIHJldHVybiBwb3J0XzsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRIb3N0KHN0cmluZyBob3N0KSB7Ci0gIGhvc3RfID0gaG9zdDsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRQb3J0KGludCBwb3J0KSB7Ci0gIHBvcnRfID0gcG9ydDsKLX0KLQotdm9pZCBUU29ja2V0OjpzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcikgewotICBsaW5nZXJPbl8gPSBvbjsKLSAgbGluZ2VyVmFsXyA9IGxpbmdlcjsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICZsLCBzaXplb2YobCkpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpzZXROb0RlbGF5KGJvb2wgbm9EZWxheSkgewotICBub0RlbGF5XyA9IG5vRGVsYXk7Ci0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNldCBzb2NrZXQgdG8gTk9ERUxBWQotICBpbnQgdiA9IG5vRGVsYXlfID8gMSA6IDA7Ci0gIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJnYsIHNpemVvZih2KSk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldE5vRGVsYXkoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpzZXRDb25uVGltZW91dChpbnQgbXMpIHsKLSAgY29ublRpbWVvdXRfID0gbXM7Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IG1zKSB7Ci0gIGlmIChtcyA8IDApIHsKLSAgICBjaGFyIGVyckJ1Zls1MTJdOwotICAgIHNwcmludGYoZXJyQnVmLCAiVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQgd2l0aCBuZWdhdGl2ZSBpbnB1dDogJWRcbiIsIG1zKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyQnVmKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcmVjdlRpbWVvdXRfID0gbXM7Ci0KLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcmVjdlRpbWV2YWxfLnR2X3NlYyA9IChpbnQpKHJlY3ZUaW1lb3V0Xy8xMDAwKTsKLSAgcmVjdlRpbWV2YWxfLnR2X3VzZWMgPSAoaW50KSgocmVjdlRpbWVvdXRfJTEwMDApKjEwMDApOwotCi0gIC8vIENvcHkgYmVjYXVzZSBwb2xsIG1heSBtb2RpZnkKLSAgc3RydWN0IHRpbWV2YWwgciA9IHJlY3ZUaW1ldmFsXzsKLSAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZyLCBzaXplb2YocikpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRSZWN2VGltZW91dCgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBtcykgewotICBpZiAobXMgPCAwKSB7Ci0gICAgY2hhciBlcnJCdWZbNTEyXTsKLSAgICBzcHJpbnRmKGVyckJ1ZiwgIlRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0IHdpdGggbmVnYXRpdmUgaW5wdXQ6ICVkXG4iLCBtcyk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNlbmRUaW1lb3V0XyA9IG1zOwotCi0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cnVjdCB0aW1ldmFsIHMgPSB7KGludCkoc2VuZFRpbWVvdXRfLzEwMDApLAotICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChzZW5kVGltZW91dF8lMTAwMCkqMTAwMCl9OwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgJnMsIHNpemVvZihzKSk7Ci0gIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKSB7Ci0gIG1heFJlY3ZSZXRyaWVzXyA9IG1heFJlY3ZSZXRyaWVzOwotfQotCi1zdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgaWYgKGhvc3RfLmVtcHR5KCkgfHwgcG9ydF8gPT0gMCkgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKLSAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOwotICB9IGVsc2UgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKLSAgfQotICByZXR1cm4gb3NzLnN0cigpOwotfQotCi1zdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRQZWVySG9zdCgpIHsKLSAgaWYgKHBlZXJIb3N0Xy5lbXB0eSgpKSB7Ci0gICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7Ci0gICAgc29ja2xlbl90IGFkZHJMZW47Ci0KLSAgICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICAgIHJldHVybiBob3N0XzsKLSAgICB9Ci0KLSAgICBhZGRyUHRyID0gZ2V0Q2FjaGVkQWRkcmVzcygmYWRkckxlbik7Ci0KLSAgICBpZiAoYWRkclB0ciA9PSBOVUxMKSB7Ci0gICAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOwotICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopICZhZGRyLCAmYWRkckxlbikgIT0gMCkgewotICAgICAgICByZXR1cm4gcGVlckhvc3RfOwotICAgICAgfQotICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7Ci0KLSAgICAgIHNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7Ci0gICAgfQotCi0gICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwotICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKLQotICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopIGFkZHJQdHIsIGFkZHJMZW4sCi0gICAgICAgICAgICAgICAgY2xpZW50aG9zdCwgc2l6ZW9mKGNsaWVudGhvc3QpLAotICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsIHNpemVvZihjbGllbnRzZXJ2aWNlKSwgMCk7Ci0KLSAgICBwZWVySG9zdF8gPSBjbGllbnRob3N0OwotICB9Ci0gIHJldHVybiBwZWVySG9zdF87Ci19Ci0KLXN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJBZGRyZXNzKCkgewotICBpZiAocGVlckFkZHJlc3NfLmVtcHR5KCkpIHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotICAgIHN0cnVjdCBzb2NrYWRkciogYWRkclB0cjsKLSAgICBzb2NrbGVuX3QgYWRkckxlbjsKLQotICAgIGlmIChzb2NrZXRfIDwgMCkgewotICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKLSAgICB9Ci0KLSAgICBhZGRyUHRyID0gZ2V0Q2FjaGVkQWRkcmVzcygmYWRkckxlbik7Ci0KLSAgICBpZiAoYWRkclB0ciA9PSBOVUxMKSB7Ci0gICAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOwotICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopICZhZGRyLCAmYWRkckxlbikgIT0gMCkgewotICAgICAgICByZXR1cm4gcGVlckFkZHJlc3NfOwotICAgICAgfQotICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7Ci0KLSAgICAgIHNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7Ci0gICAgfQotCi0gICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwotICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKLQotICAgIGdldG5hbWVpbmZvKGFkZHJQdHIsIGFkZHJMZW4sCi0gICAgICAgICAgICAgICAgY2xpZW50aG9zdCwgc2l6ZW9mKGNsaWVudGhvc3QpLAotICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsIHNpemVvZihjbGllbnRzZXJ2aWNlKSwKLSAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVik7Ci0KLSAgICBwZWVyQWRkcmVzc18gPSBjbGllbnRob3N0OwotICAgIHBlZXJQb3J0XyA9IHN0ZDo6YXRvaShjbGllbnRzZXJ2aWNlKTsKLSAgfQotICByZXR1cm4gcGVlckFkZHJlc3NfOwotfQotCi1pbnQgVFNvY2tldDo6Z2V0UGVlclBvcnQoKSB7Ci0gIGdldFBlZXJBZGRyZXNzKCk7Ci0gIHJldHVybiBwZWVyUG9ydF87Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGxlbikgewotICBzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgewotICBjYXNlIEFGX0lORVQ6Ci0gICAgaWYgKGxlbiA9PSBzaXplb2Yoc29ja2FkZHJfaW4pKSB7Ci0gICAgICBtZW1jcHkoKHZvaWQqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NCwgKHZvaWQqKWFkZHIsIGxlbik7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgQUZfSU5FVDY6Ci0gICAgaWYgKGxlbiA9PSBzaXplb2Yoc29ja2FkZHJfaW42KSkgewotICAgICAgbWVtY3B5KCh2b2lkKikmY2FjaGVkUGVlckFkZHJfLmlwdjYsICh2b2lkKilhZGRyLCBsZW4pOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotfQotCi1zb2NrYWRkciogVFNvY2tldDo6Z2V0Q2FjaGVkQWRkcmVzcyhzb2NrbGVuX3QqIGxlbikgY29uc3QgewotICBzd2l0Y2ggKGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkpIHsKLSAgY2FzZSBBRl9JTkVUOgotICAgICpsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW4pOwotICAgIHJldHVybiAoc29ja2FkZHIqKSAmY2FjaGVkUGVlckFkZHJfLmlwdjQ7Ci0KLSAgY2FzZSBBRl9JTkVUNjoKLSAgICAqbGVuID0gc2l6ZW9mKHNvY2thZGRyX2luNik7Ci0gICAgcmV0dXJuIChzb2NrYWRkciopICZjYWNoZWRQZWVyQWRkcl8uaXB2NjsKLQotICBkZWZhdWx0OgotICAgIHJldHVybiBOVUxMOwotICB9Ci19IAotCi1ib29sIFRTb2NrZXQ6OnVzZUxvd01pblJ0b18gPSBmYWxzZTsKLXZvaWQgVFNvY2tldDo6c2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKSB7Ci0gIHVzZUxvd01pblJ0b18gPSB1c2VMb3dNaW5SdG87Ci19Ci1ib29sIFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpIHsKLSAgcmV0dXJuIHVzZUxvd01pblJ0b187Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5MDU5Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUVmlydHVhbFRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRTZXJ2ZXJTb2NrZXQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBUQ1AgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKi8KLWNsYXNzIFRTb2NrZXQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNvY2tldD4gewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqLwotICBUU29ja2V0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IEFuIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgdG8gY29ubmVjdCB0bwotICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqLwotICBUU29ja2V0KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0KTsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBVbml4IGRvbWFpbiBzb2NrZXQuCi0gICAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHBhdGggVGhlIFVuaXggZG9tYWluIHNvY2tldCBlLmcuICIvdG1wL1RocmlmdFRlc3QuYmluYXJ5LnRocmlmdCIKLSAgICovCi0gIFRTb2NrZXQoc3RkOjpzdHJpbmcgcGF0aCk7Ci0KLSAgLyoqCi0gICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCi0gICAqLwotICB2aXJ0dWFsIH5UU29ja2V0KCk7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBhbGl2ZS4KLSAgICoKLSAgICogQHJldHVybiBJcyB0aGUgc29ja2V0IGFsaXZlPwotICAgKi8KLSAgYm9vbCBpc09wZW4oKTsKLQotICAvKioKLSAgICogQ2FsbHMgc2VsZWN0IG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCi0gICAqLwotICBib29sIHBlZWsoKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgdGhlIHNvY2tldCBjb3VsZCBub3QgY29ubmVjdAotICAgKi8KLSAgdmlydHVhbCB2b2lkIG9wZW4oKTsKLQotICAvKioKLSAgICogU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgotICAgKi8KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBMb29wcyB1bnRpbCBkb25lIG9yIGZhaWwuCi0gICAqLwotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICAvKioKLSAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCi0gICAqLwotICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgaG9zdCBpZGVudGlmaWVyCi0gICAqLwotICBzdGQ6OnN0cmluZyBnZXRIb3N0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHBvcnQgbnVtYmVyCi0gICAqLwotICBpbnQgZ2V0UG9ydCgpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGhvc3QgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCi0gICAqCi0gICAqIEBwYXJhbSBob3N0IGhvc3QgaWRlbnRpZmllcgotICAgKi8KLSAgdm9pZCBzZXRIb3N0KHN0ZDo6c3RyaW5nIGhvc3QpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHBvcnQgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCi0gICAqCi0gICAqIEBwYXJhbSBwb3J0IHBvcnQgbnVtYmVyCi0gICAqLwotICB2b2lkIHNldFBvcnQoaW50IHBvcnQpOwotCi0gIC8qKgotICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gb24gICAgICBXaGV0aGVyIFNPX0xJTkdFUiBpcyBvbgotICAgKiBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgotICAgKi8KLSAgdm9pZCBzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcik7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZW5hYmxlL2Rpc2FibGUgTmFnbGUncyBhbGdvcml0aG0uCi0gICAqCi0gICAqIEBwYXJhbSBub0RlbGF5IFdoZXRoZXIgb3Igbm90IHRvIGRpc2FibGUgdGhlIGFsZ29yaXRobS4KLSAgICogQHJldHVybgotICAgKi8KLSAgdm9pZCBzZXROb0RlbGF5KGJvb2wgbm9EZWxheSk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY29ubmVjdCB0aW1lb3V0Ci0gICAqLwotICB2b2lkIHNldENvbm5UaW1lb3V0KGludCBtcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcmVjZWl2ZSB0aW1lb3V0Ci0gICAqLwotICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCBtcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgc2VuZCB0aW1lb3V0Ci0gICAqLwotICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBtcyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gY2FzZSBvZiBhbiBFQUdBSU4KLSAgICogZXJyb3IKLSAgICovCi0gIHZvaWQgc2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKTsKLQotICAvKioKLSAgICogR2V0IHNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0U29ja2V0SW5mbygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBETlMgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0UGVlckhvc3QoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0UGVlckFkZHJlc3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAotICAgKiovCi0gIGludCBnZXRQZWVyUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IuCi0gICAqLwotICBpbnQgZ2V0U29ja2V0RkQoKSB7Ci0gICAgcmV0dXJuIHNvY2tldF87Ci0gIH0KLQotICAvKioKLSAgICogKFJlLSlpbml0aWFsaXplIGEgVFNvY2tldCBmb3IgdGhlIHN1cHBsaWVkIGRlc2NyaXB0b3IuICBUaGlzIGlzIG9ubHkKLSAgICogaW50ZW5kZWQgZm9yIHVzZSBieSBUTm9uYmxvY2tpbmdTZXJ2ZXIgLS0gb3RoZXIgdXNlIG1heSByZXN1bHQgaW4KLSAgICogdW5mb3J0dW5hdGUgc3VycHJpc2VzLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGFscmVhZHktY29ubmVjdGVkIHNvY2tldAotICAgKi8KLSAgdm9pZCBzZXRTb2NrZXRGRChpbnQgZmQpOwotCi0gIC8qCi0gICAqIFJldHVybnMgYSBjYWNoZWQgY29weSBvZiB0aGUgcGVlciBhZGRyZXNzLgotICAgKi8KLSAgc29ja2FkZHIqIGdldENhY2hlZEFkZHJlc3Moc29ja2xlbl90KiBsZW4pIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHdoZXRoZXIgdG8gdXNlIGEgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQuCi0gICAqLwotICBzdGF0aWMgdm9pZCBzZXRVc2VMb3dNaW5SdG8oYm9vbCB1c2VMb3dNaW5SdG8pOwotCi0gIC8qKgotICAgKiBHZXRzIHdoZXRoZXIgdG8gdXNlIGEgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQuCi0gICAqLwotICBzdGF0aWMgYm9vbCBnZXRVc2VMb3dNaW5SdG8oKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHJhdyBVTklYIGhhbmRsZS4KLSAgICovCi0gIFRTb2NrZXQoaW50IHNvY2tldCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCi0gICAqIGFjY2VwdCgpIG9yIGNvbm5lY3QoKSkuIE9ubHkgY2FjaGVzIElQVjQgYW5kIElQVjY7IHVuc2V0IGZvciBvdGhlcnMuCi0gICAqLwotICB2b2lkIHNldENhY2hlZEFkZHJlc3MoY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBsZW4pOwotCi0gcHJvdGVjdGVkOgotICAvKiogY29ubmVjdCwgY2FsbGVkIGJ5IG9wZW4gKi8KLSAgdm9pZCBvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8gKnJlcyk7Ci0KLSAgLyoqIEhvc3QgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnN0cmluZyBob3N0XzsKLQotICAvKiogUGVlciBob3N0bmFtZSAqLwotICBzdGQ6OnN0cmluZyBwZWVySG9zdF87Ci0KLSAgLyoqIFBlZXIgYWRkcmVzcyAqLwotICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187Ci0KLSAgLyoqIFBlZXIgcG9ydCAqLwotICBpbnQgcGVlclBvcnRfOwotCi0gIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCi0gIGludCBwb3J0XzsKLQotICAvKiogVU5JWCBkb21haW4gc29ja2V0IHBhdGggKi8KLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLyoqIFVuZGVybHlpbmcgVU5JWCBzb2NrZXQgaGFuZGxlICovCi0gIGludCBzb2NrZXRfOwotCi0gIC8qKiBDb25uZWN0IHRpbWVvdXQgaW4gbXMgKi8KLSAgaW50IGNvbm5UaW1lb3V0XzsKLQotICAvKiogU2VuZCB0aW1lb3V0IGluIG1zICovCi0gIGludCBzZW5kVGltZW91dF87Ci0KLSAgLyoqIFJlY3YgdGltZW91dCBpbiBtcyAqLwotICBpbnQgcmVjdlRpbWVvdXRfOwotCi0gIC8qKiBMaW5nZXIgb24gKi8KLSAgYm9vbCBsaW5nZXJPbl87Ci0KLSAgLyoqIExpbmdlciB2YWwgKi8KLSAgaW50IGxpbmdlclZhbF87Ci0KLSAgLyoqIE5vZGVsYXkgKi8KLSAgYm9vbCBub0RlbGF5XzsKLQotICAvKiogUmVjdiBFR0FJTiByZXRyaWVzICovCi0gIGludCBtYXhSZWN2UmV0cmllc187Ci0KLSAgLyoqIFJlY3YgdGltZW91dCB0aW1ldmFsICovCi0gIHN0cnVjdCB0aW1ldmFsIHJlY3ZUaW1ldmFsXzsKLQotICAvKiogQ2FjaGVkIHBlZXIgYWRkcmVzcyAqLwotICB1bmlvbiB7Ci0gICAgc29ja2FkZHJfaW4gaXB2NDsKLSAgICBzb2NrYWRkcl9pbjYgaXB2NjsKLSAgfSBjYWNoZWRQZWVyQWRkcl87Ci0KLSAgLyoqIENvbm5lY3Rpb24gc3RhcnQgdGltZSAqLwotICB0aW1lc3BlYyBzdGFydFRpbWVfOwotCi0gIC8qKiBXaGV0aGVyIHRvIHVzZSBsb3cgbWluaW11bSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dCAqLwotICBzdGF0aWMgYm9vbCB1c2VMb3dNaW5SdG9fOwotCi0gcHJpdmF0ZToKLSAgdm9pZCB1bml4X29wZW4oKTsKLSAgdm9pZCBsb2NhbF9vcGVuKCk7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjBjNWEzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiVFNvY2tldFBvb2wuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLS8qKgotICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLVRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcigpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHNvY2tldF8oLTEpLAotICAgIGxhc3RGYWlsVGltZV8oMCksCi0gICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkge30KLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCi0gKi8KLVRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdHJpbmcgJmhvc3QsIGludCBwb3J0KQotICA6IGhvc3RfKGhvc3QpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHNvY2tldF8oLTEpLAotICAgIGxhc3RGYWlsVGltZV8oMCksCi0gICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkge30KLQotLyoqCi0gKiBUU29ja2V0UG9vbCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKi8KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKCkgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c3RyaW5nPiAmaG9zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludD4gJnBvcnRzKSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17Ci0gIGlmIChob3N0cy5zaXplKCkgIT0gcG9ydHMuc2l6ZSgpKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6VFNvY2tldFBvb2w6IGhvc3RzLnNpemUgIT0gcG9ydHMuc2l6ZSIpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOwotICB9Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBob3N0cy5zaXplKCk7ICsraSkgewotICAgIGFkZFNlcnZlcihob3N0c1tpXSwgcG9ydHNbaV0pOwotICB9Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQotewotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2VydmVycy5zaXplKCk7ICsraSkgewotICAgIGFkZFNlcnZlcihzZXJ2ZXJzW2ldLmZpcnN0LCBzZXJ2ZXJzW2ldLnNlY29uZCk7Ci0gIH0KLX0KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIHNlcnZlcnNfKHNlcnZlcnMpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLX0KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLSAgYWRkU2VydmVyKGhvc3QsIHBvcnQpOwotfQotCi1UU29ja2V0UG9vbDo6flRTb2NrZXRQb29sKCkgewotICB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzZXJ2ZXJzXy5iZWdpbigpOwotICB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJFbmQgPSBzZXJ2ZXJzXy5lbmQoKTsKLSAgZm9yICg7IGl0ZXIgIT0gaXRlckVuZDsgKytpdGVyKSB7Ci0gICAgc2V0Q3VycmVudFNlcnZlcigqaXRlcik7Ci0gICAgVFNvY2tldFBvb2w6OmNsb3NlKCk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIHsKLSAgc2VydmVyc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+KG5ldyBUU29ja2V0UG9vbFNlcnZlcihob3N0LCBwb3J0KSkpOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcikgewotICBpZiAoc2VydmVyKSB7Ci0gICAgc2VydmVyc18ucHVzaF9iYWNrKHNlcnZlcik7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0U2VydmVycyhjb25zdCB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKLSAgc2VydmVyc18gPSBzZXJ2ZXJzOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpnZXRTZXJ2ZXJzKHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgewotICBzZXJ2ZXJzID0gc2VydmVyc187Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpIHsKLSAgbnVtUmV0cmllc18gPSBudW1SZXRyaWVzOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKSB7Ci0gIHJldHJ5SW50ZXJ2YWxfID0gcmV0cnlJbnRlcnZhbDsKLX0KLQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7Ci0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKSB7Ci0gIHJhbmRvbWl6ZV8gPSByYW5kb21pemU7Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KSB7Ci0gIGFsd2F5c1RyeUxhc3RfID0gYWx3YXlzVHJ5TGFzdDsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0Q3VycmVudFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKSB7Ci0gIGN1cnJlbnRTZXJ2ZXJfID0gc2VydmVyOwotICBob3N0XyA9IHNlcnZlci0+aG9zdF87Ci0gIHBvcnRfID0gc2VydmVyLT5wb3J0XzsKLSAgc29ja2V0XyA9IHNlcnZlci0+c29ja2V0XzsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgc29ja2V0IG9wZW4gZmFpbHMuIFdoZW4gc29ja2V0Ci0gKiBvcGVucyBmYWlscywgdGhlIHNvY2tldCBpbiB0aGUgY3VycmVudCBzZXJ2ZXIgaXMgcmVzZXQuCi0gKi8KLS8qIFRPRE86IHdpdGhvdXQgYXBjIHdlIGlnbm9yZSBhIGxvdCBvZiBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIHBocCB2ZXJzaW9uICovCi12b2lkIFRTb2NrZXRQb29sOjpvcGVuKCkgewotCi0gIHVuc2lnbmVkIGludCBudW1TZXJ2ZXJzID0gc2VydmVyc18uc2l6ZSgpOwotICBpZiAobnVtU2VydmVycyA9PSAwKSB7Ci0gICAgc29ja2V0XyA9IC0xOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICB9Ci0KLSAgaWYgKGlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJhbmRvbWl6ZV8gJiYgbnVtU2VydmVycyA+IDEpIHsKLSAgICByYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7Ci0gIH0KLQotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVNlcnZlcnM7ICsraSkgewotCi0gICAgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlciA9IHNlcnZlcnNfW2ldOwotICAgIC8vIEltcGVyc29uYXRlIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgc2V0Q3VycmVudFNlcnZlcihzZXJ2ZXIpOwotCi0gICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAvLyBhbHJlYWR5IG9wZW4gbWVhbnMgd2UncmUgZG9uZQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IChzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPT0gMCk7Ci0gICAgYm9vbCBpc0xhc3RTZXJ2ZXIgPSBhbHdheXNUcnlMYXN0XyA/IChpID09IChudW1TZXJ2ZXJzIC0gMSkpIDogZmFsc2U7Ci0KLSAgICBpZiAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID4gMCkgewotICAgICAgLy8gVGhlIHNlcnZlciB3YXMgbWFya2VkIGFzIGRvd24sIHNvIGNoZWNrIGlmIGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIHRvIHJldHJ5Ci0gICAgICBpbnQgZWxhcHNlZFRpbWUgPSB0aW1lKE5VTEwpIC0gc2VydmVyLT5sYXN0RmFpbFRpbWVfOwotICAgICAgaWYgKGVsYXBzZWRUaW1lID4gcmV0cnlJbnRlcnZhbF8pIHsKLSAgICAgICAgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJldHJ5SW50ZXJ2YWxQYXNzZWQgfHwgaXNMYXN0U2VydmVyKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVJldHJpZXNfOyArK2opIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU29ja2V0OjpvcGVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldFBvb2w6Om9wZW4gZmFpbGVkICIrZ2V0U29ja2V0SW5mbygpKyI6ICIrZS53aGF0KCk7Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgICAgICBzb2NrZXRfID0gLTE7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIG9wZW5lZCBzb2NrZXQgc28gdGhhdCB3ZSBjYW4ga2VlcCBpdCBwZXJzaXN0ZW50Ci0gICAgICAgIHNlcnZlci0+c29ja2V0XyA9IHNvY2tldF87Ci0gICAgICAgIC8vIHJlc2V0IGxhc3RGYWlsVGltZV8gaXMgcmVxdWlyZWQKLSAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gMDsKLSAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgICsrc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXzsKLSAgICAgIGlmIChzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID4gbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKLSAgICAgICAgLy8gTWFyayBzZXJ2ZXIgYXMgZG93bgotICAgICAgICBzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID0gMDsKLSAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gdGltZShOVUxMKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBHbG9iYWxPdXRwdXQoIlRTb2NrZXRQb29sOjpvcGVuOiBhbGwgY29ubmVjdGlvbnMgZmFpbGVkIik7Ci0gIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpjbG9zZSgpIHsKLSAgVFNvY2tldDo6Y2xvc2UoKTsKLSAgaWYgKGN1cnJlbnRTZXJ2ZXJfKSB7Ci0gICAgY3VycmVudFNlcnZlcl8tPnNvY2tldF8gPSAtMTsKLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MTE2YS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8gMQotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotIC8qKgotICAqIENsYXNzIHRvIGhvbGQgc2VydmVyIGluZm9ybWF0aW9uIGZvciBUU29ja2V0UG9vbAotICAqCi0gICovCi1jbGFzcyBUU29ja2V0UG9vbFNlcnZlciB7Ci0KLSAgcHVibGljOgotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc2VydmVyIGluZm8KLSAgICovCi0gIFRTb2NrZXRQb29sU2VydmVyKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUU29ja2V0UG9vbCBzZXJ2ZXIKLSAgICovCi0gIFRTb2NrZXRQb29sU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nICZob3N0LCBpbnQgcG9ydCk7Ci0KLSAgLy8gSG9zdCBuYW1lCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotCi0gIC8vIFBvcnQgdG8gY29ubmVjdCBvbgotICBpbnQgcG9ydF87Ci0KLSAgLy8gU29ja2V0IGZvciB0aGUgc2VydmVyCi0gIGludCBzb2NrZXRfOwotCi0gIC8vIExhc3QgdGltZSBjb25uZWN0aW5nIHRvIHRoaXMgc2VydmVyIGZhaWxlZAotICBpbnQgbGFzdEZhaWxUaW1lXzsKLQotICAvLyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgdGltZXMgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKLSAgaW50IGNvbnNlY3V0aXZlRmFpbHVyZXNfOwotfTsKLQotLyoqCi0gKiBUQ1AgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKi8KLWNsYXNzIFRTb2NrZXRQb29sIDogcHVibGljIFRTb2NrZXQgewotCi0gcHVibGljOgotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKCk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdHMgbGlzdCBvZiBob3N0IG5hbWVzCi0gICAgKiBAcGFyYW0gcG9ydHMgbGlzdCBvZiBwb3J0IG5hbWVzCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmaG9zdHMsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+ICZwb3J0cyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIHBhaXJzIG9mIGhvc3QgbmFtZSBhbmQgcG9ydAotICAgICovCi0gICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycwotICAgICovCi0gIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdCBzaW5nbGUgaG9zdAotICAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKLSAgICAqLwotICAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKLQotICAgLyoqCi0gICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgICovCi0gICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOwotCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gICB2b2lkIGFkZFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOwotCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gIHZvaWQgYWRkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKTsKLQotICAgLyoqCi0gICAgKiBTZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAotICAgICovCi0gIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwotCi0gICAvKioKLSAgICAqIEdldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCi0gICAgKi8KLSAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KLSAgICAqLwotICAgdm9pZCBzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKTsKLQotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgICovCi0gICB2b2lkIHNldFJldHJ5SW50ZXJ2YWwoaW50IHJldHJ5SW50ZXJ2YWwpOwotCi0gICAvKioKLSAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KLSAgICAqLwotICAgdm9pZCBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKTsKLQotICAgLyoqCi0gICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgotICAgICovCi0gICB2b2lkIHNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSk7Ci0KLSAgIC8qKgotICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KLSAgICAqLwotICAgdm9pZCBzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCk7Ci0KLSAgIC8qKgotICAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgotICAgICovCi0gICB2b2lkIG9wZW4oKTsKLQotICAgLyoKLSAgICAqIENsb3NlcyB0aGUgVU5JWCBzb2NrZXQKLSAgICAqLwotICAgdm9pZCBjbG9zZSgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcik7Ci0KLSAgIC8qKiBMaXN0IG9mIHNlcnZlcnMgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4gc2VydmVyc187Ci0KLSAgLyoqIEN1cnJlbnQgc2VydmVyICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKLQotICAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCi0gICBpbnQgbnVtUmV0cmllc187Ci0KLSAgIC8qKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgotICAgICogbWFya2VkIGFzIGRvd24uCi0gICAgKi8KLSAgIGludCByZXRyeUludGVydmFsXzsKLQotICAgLyoqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4gKi8KLSAgIGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXzsKLQotICAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KLSAgIGJvb2wgcmFuZG9taXplXzsKLQotICAgLyoqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPyAqLwotICAgYm9vbCBhbHdheXNUcnlMYXN0XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBlZDhhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBIZWxwZXIgdGVtcGxhdGUgdG8gaG9pc3QgcmVhZEFsbCBpbXBsZW1lbnRhdGlvbiBvdXQgb2YgVFRyYW5zcG9ydAotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IHJlYWRBbGwoVHJhbnNwb3J0XyAmdHJhbnMsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIHVpbnQzMl90IGhhdmUgPSAwOwotICB1aW50MzJfdCBnZXQgPSAwOwotCi0gIHdoaWxlIChoYXZlIDwgbGVuKSB7Ci0gICAgZ2V0ID0gdHJhbnMucmVhZChidWYraGF2ZSwgbGVuLWhhdmUpOwotICAgIGlmIChnZXQgPD0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgZGF0YSB0byByZWFkLiIpOwotICAgIH0KLSAgICBoYXZlICs9IGdldDsKLSAgfQotCi0gIHJldHVybiBoYXZlOwotfQotCi0KLS8qKgotICogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIG9mIHRyYW5zcG9ydGluZyBkYXRhLiBBIFRUcmFuc3BvcnQgbWF5IGJlCi0gKiBjYXBhYmxlIG9mIGVpdGhlciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYm90aC4KLSAqCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIFZpcnR1YWwgZGVjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHZpcnR1YWwgflRUcmFuc3BvcnQoKSB7fQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcwotICAgKiBzdGlsbCBvcGVuLiBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sCi0gICAqIGJ1dCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZQotICAgKiBwb3NzaWJsZSAoaS5lLiBvbiBhIHNvY2tldCkuCi0gICAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyCi0gICAqIHJlcXVlc3QuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gaXNPcGVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIHRoZSB0cmFuc3BvcnQgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW5pbmcgZmFpbGVkCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgb3BlbigpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFzZSBUVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsb3NlKCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYW5ub3QgY2xvc2UgYmFzZSBUVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gcmVhZCB1cCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBzdHJpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgIFJlZmVyZW5jZSB0byB0aGUgbG9jYXRpb24gdG8gd3JpdGUgdGhlIGRhdGEKLSAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHdlcmUgYWN0dWFsbHkgcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICByZXR1cm4gcmVhZF92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCByZWFkLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YSBpbiBpdHMgZW50aXJldHkgbm8gbWF0dGVyIHdoYXQuCi0gICAqCi0gICAqIEBwYXJhbSBzICAgICBSZWZlcmVuY2UgdG8gbG9jYXRpb24gZm9yIHJlYWQgZGF0YQotICAgKiBAcGFyYW0gbGVuICAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAotICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gc2l6ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgaW5zdWZmaWNpZW50IGRhdGEgd2FzIHJlYWQKLSAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICBUX1ZJUlRVQUxfQ0FMTCgpOwotICAgIHJldHVybiByZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnJlYWRBbGwoKnRoaXMsIGJ1ZiwgbGVuKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KLSAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KLSAgICogZS5nLiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZQotICAgKgotICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRFbmQoKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgc3RyaW5nIGluIGl0cyBlbnRpcmV0eSB0byB0aGUgYnVmZmVyLgotICAgKgotICAgKiBOb3RlOiBZb3UgbXVzdCBjYWxsIGZsdXNoKCkgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4sCi0gICAqIGFuZCBhdmFpbGFibGUgdG8gYmUgcmVhZCBiYWNrIGluIHRoZSBmdXR1cmUuICBEZXN0cm95aW5nIGEgVFRyYW5zcG9ydAotICAgKiBvYmplY3QgZG9lcyBub3QgYXV0b21hdGljYWxseSBmbHVzaCBwZW5kaW5nIGRhdGEtLWlmIHlvdSBkZXN0cm95IGEKLSAgICogVFRyYW5zcG9ydCBvYmplY3Qgd2l0aCB3cml0dGVuIGJ1dCB1bmZsdXNoZWQgZGF0YSwgdGhhdCBkYXRhIG1heSBiZQotICAgKiBkaXNjYXJkZWQuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgIFRoZSBkYXRhIHRvIHdyaXRlIG91dAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICB3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCB3cml0ZS4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZWQuCi0gICAqIFRoaXMgY2FuIGJlIG92ZXItcmlkZGVuIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uCi0gICAqIGF0IHRoZSBlbmQgb2YgYSByZXF1ZXN0LgotICAgKgotICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UKLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVFbmQoKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCi0gICAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZmx1c2goKSB7Ci0gICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGVtcHRzIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gXGMgbGVuIGJ5dGVzLCBwb3NzaWJseSBjb3BpZWQgaW50byBcYyBidWYuCi0gICAqIERvZXMgbm90IGNvbnN1bWUgdGhlIGJ5dGVzIHJlYWQgKGkuZS46IGEgbGF0ZXIgcmVhZCB3aWxsIHJldHVybiB0aGUgc2FtZQotICAgKiBkYXRhKS4gIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIHN1cHBvcnQgcHJvdG9jb2xzIHRoYXQgbmVlZCB0byByZWFkCi0gICAqIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuICBUaGV5IGNhbiBhdHRlbXB0IHRvIGJvcnJvdyB0aGUgbWF4aW11bSBhbW91bnQgb2YKLSAgICogZGF0YSB0aGF0IHRoZXkgd2lsbCBuZWVkLCB0aGVuIGNvbnN1bWUgKHNlZSBuZXh0IG1ldGhvZCkgd2hhdCB0aGV5Ci0gICAqIGFjdHVhbGx5IHVzZS4gIFNvbWUgdHJhbnNwb3J0cyB3aWxsIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIGFuZCBvdGhlcnMKLSAgICogd2lsbCBmYWlsIG9jY2FzaW9uYWxseSwgc28gcHJvdG9jb2xzIG11c3QgYmUgcHJlcGFyZWQgdG8gdXNlIHJlYWQgaWYKLSAgICogYm9ycm93IGZhaWxzLgotICAgKgotICAgKiBAb2FyYW0gYnVmICBBIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSBjYW4gYmUgc3RvcmVkIGlmIG5lZWRlZC4KLSAgICogICAgICAgICAgICAgSWYgYm9ycm93IGRvZXNuJ3QgcmV0dXJuIGJ1ZiwgdGhlbiB0aGUgY29udGVudHMgb2YKLSAgICogICAgICAgICAgICAgYnVmIGFmdGVyIHRoZSBjYWxsIGFyZSB1bmRlZmluZWQuICBUaGlzIHBhcmFtZXRlciBtYXkgYmUKLSAgICogICAgICAgICAgICAgTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IHN1cHBseWluZyBzdG9yYWdlLAotICAgKiAgICAgICAgICAgICBidXQgd291bGQgbGlrZSBhIHBvaW50ZXIgaW50byBhbiBpbnRlcm5hbCBidWZmZXIsIGlmCi0gICAqICAgICAgICAgICAgIGF2YWlsYWJsZS4KLSAgICogQHBhcmFtIGxlbiAgKmxlbiBzaG91bGQgaW5pdGlhbGx5IGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBib3Jyb3cuCi0gICAqICAgICAgICAgICAgIElmIGJvcnJvdyBzdWNjZWVkcywgKmxlbiB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBieXRlcwotICAgKiAgICAgICAgICAgICBhdmFpbGFibGUgaW4gdGhlIHJldHVybmVkIHBvaW50ZXIuICBUaGlzIHdpbGwgYmUgYXQgbGVhc3QKLSAgICogICAgICAgICAgICAgd2hhdCB3YXMgcmVxdWVzdGVkLCBidXQgbWF5IGJlIG1vcmUgaWYgYm9ycm93IHJldHVybnMKLSAgICogICAgICAgICAgICAgYSBwb2ludGVyIHRvIGFuIGludGVybmFsIGJ1ZmZlciwgcmF0aGVyIHRoYW4gYnVmLgotICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZmFpbHMsIHRoZSBjb250ZW50cyBvZiAqbGVuIGFyZSB1bmRlZmluZWQuCi0gICAqIEByZXR1cm4gSWYgdGhlIGJvcnJvdyBzdWNjZWVkcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYm9ycm93ZWQgZGF0YS4KLSAgICogICAgICAgICBUaGlzIG1pZ2h0IGJlIGVxdWFsIHRvIFxjIGJ1Ziwgb3IgaXQgbWlnaHQgYmUgYSBwb2ludGVyIGludG8KLSAgICogICAgICAgICB0aGUgdHJhbnNwb3J0J3MgaW50ZXJuYWwgYnVmZmVycy4KLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgKi8KLSAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIFRfVklSVFVBTF9DQUxMKCk7Ci0gICAgcmV0dXJuIGJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBsZW4gYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0LiAgVGhpcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBhIGJvcnJvdwotICAgKiBvZiBhdCBsZWFzdCBsZW4gYnl0ZXMsIGFuZCBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCi0gICAqIFRPRE8oZHJlaXNzKTogSXMgdGhlcmUgYW55IHRyYW5zcG9ydCB0aGF0IGNvdWxkIGJvcnJvdyBidXQgZmFpbCB0bwotICAgKiBjb25zdW1lLCBvciB0aGF0IHdvdWxkIHJlcXVpcmUgYSBidWZmZXIgdG8gZHVtcCB0aGUgY29uc3VtZWQgZGF0YT8KLSAgICoKLSAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gY29uc3VtZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgVF9WSVJUVUFMX0NBTEwoKTsKLSAgICBjb25zdW1lX3ZpcnQobGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCBjb25zdW1lLiIpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCi0gICAqLwotICBUVHJhbnNwb3J0KCkge30KLX07Ci0KLS8qKgotICogR2VuZXJpYyBmYWN0b3J5IGNsYXNzIHRvIG1ha2UgYW4gaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnQgb3V0IG9mIGEKLSAqIHNvdXJjZSB0cmFuc3BvcnQuIENvbW1vbmx5IHVzZWQgaW5zaWRlIHNlcnZlcnMgdG8gbWFrZSBpbnB1dCBhbmQgb3V0cHV0Ci0gKiBzdHJlYW1zIG91dCBvZiByYXcgY2xpZW50cy4KLSAqCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIH5UVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhYWVkYy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjb25maWcuaD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBib29zdDo6bGV4aWNhbF9jYXN0OwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2MzBlZi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPFRocmlmdC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgdHJhbnNwb3J0IGVycm9ycyB0aGF0IG1heQotICogb2NjdXIgaW4gdmFyaW91cyB0cmFuc3BvcnQgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYwotICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKLSAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmFuc3BvcnRzLCBpLmUuCi0gKiBwaXBlcyBldGMuCi0gKgotICovCi1jbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KLSAgICovCi0gIGVudW0gVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUKLSAgeyBVTktOT1dOID0gMAotICAsIE5PVF9PUEVOID0gMQotICAsIFRJTUVEX09VVCA9IDIKLSAgLCBFTkRfT0ZfRklMRSA9IDMKLSAgLCBJTlRFUlJVUFRFRCA9IDQKLSAgLCBCQURfQVJHUyA9IDUKLSAgLCBDT1JSVVBURURfREFUQSA9IDYKLSAgLCBJTlRFUk5BTF9FUlJPUiA9IDcKLSAgfTsKLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKCkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJub19jb3B5KSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSArICI6ICIgKyBUT3V0cHV0OjpzdHJlcnJvcl9zKGVycm5vX2NvcHkpKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCi0gICAqIHRoYXQgaGFzIG9jY3VycmVkLgotICAgKgotICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKLSAgICovCi0gIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB0aHJvdygpIHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKLSAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOwotICAgICAgICBjYXNlIE5PVF9PUEVOICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgbm90IG9wZW4iOwotICAgICAgICBjYXNlIFRJTUVEX09VVCAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUaW1lZCBvdXQiOwotICAgICAgICBjYXNlIEVORF9PRl9GSUxFICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBFbmQgb2YgZmlsZSI7Ci0gICAgICAgIGNhc2UgSU5URVJSVVBURUQgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKLSAgICAgICAgY2FzZSBCQURfQVJHUyAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW52YWxpZCBhcmd1bWVudHMiOwotICAgICAgICBjYXNlIENPUlJVUFRFRF9EQVRBIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBDb3JydXB0ZWQgRGF0YSI7Ci0gICAgICAgIGNhc2UgSU5URVJOQUxfRVJST1IgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7Ci0gICAgfQotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwotICBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKLQotICAvKiogRXJyb3IgY29kZSAqLwotICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyODliYy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11aW50MzJfdCBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgbmVlZCA9IGxlbjsKLQotICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHlldAotICBpZiAockxlbl8tclBvc18gPCBuZWVkKSB7Ci0gICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZQotICAgIGlmIChyTGVuXy1yUG9zXyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCByTGVuXy1yUG9zXyk7Ci0gICAgICBuZWVkIC09IHJMZW5fLXJQb3NfOwotICAgICAgYnVmICs9IHJMZW5fLXJQb3NfOwotICAgICAgclBvc18gPSByTGVuXzsKLSAgICB9Ci0KLSAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKLSAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7Ci0gICAgICByQnVmU2l6ZV8gKj0yOwotICAgICAgckJ1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCi0gICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7Ci0gIH0KLQotCi0gIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlCi0gIHVpbnQzMl90IGdpdmUgPSBuZWVkOwotICBpZiAockxlbl8tclBvc18gPCBnaXZlKSB7Ci0gICAgZ2l2ZSA9IHJMZW5fLXJQb3NfOwotICB9Ci0gIGlmIChnaXZlID4gMCkgewotICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCBnaXZlKTsKLSAgICByUG9zXyArPSBnaXZlOwotICAgIG5lZWQgLT0gZ2l2ZTsKLSAgfQotCi0gIHJldHVybiAobGVuIC0gbmVlZCk7Ci19Ci0KLXZvaWQgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAobGVuID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBNYWtlIHRoZSBidWZmZXIgYXMgYmlnIGFzIGl0IG5lZWRzIHRvIGJlCi0gIGlmICgobGVuICsgd0xlbl8pID49IHdCdWZTaXplXykgewotICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8qMjsKLSAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7Ci0gICAgICBuZXdCdWZTaXplICo9IDI7Ci0gICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2Mod0J1Zl8sIHNpemVvZih1aW50OF90KSAqIG5ld0J1ZlNpemUpOwotICAgIHdCdWZTaXplXyA9IG5ld0J1ZlNpemU7Ci0gIH0KLQotICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlcgotICBtZW1jcHkod0J1Zl8gKyB3TGVuXywgYnVmLCBsZW4pOwotICB3TGVuXyArPSBsZW47Ci19Ci0KLXZvaWQgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIKLSAgaWYgKHdMZW5fID4gMCkgewotICAgIHNyY1RyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKLSAgICB3TGVuXyA9IDA7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgc3JjVHJhbnNfLT5mbHVzaCgpOwotfQotCi1UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCi0gIDogVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFucyksCi0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSB7Ci19Ci0KLVRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgewotfQotCi1ib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6aXNPcGVuKCk7Ci19Ci0KLWJvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cGVlaygpIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cGVlaygpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6Om9wZW4oKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6b3BlbigpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmNsb3NlKCkgewotICBUUGlwZWRUcmFuc3BvcnQ6OmNsb3NlKCk7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cmVhZChidWYsIGxlbik7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZSA9IDA7Ci0gIHVpbnQzMl90IGdldCA9IDA7Ci0KLSAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7Ci0gICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGhhdmUgKz0gZ2V0OwotICB9Ci0KLSAgcmV0dXJuIGhhdmU7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRFbmQoKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OnJlYWRFbmQoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlKGJ1ZiwgbGVuKTsKLX0KLQotdWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGVFbmQoKSB7Ci0gIHJldHVybiBUUGlwZWRUcmFuc3BvcnQ6OndyaXRlRW5kKCk7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Zmx1c2goKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6Zmx1c2goKTsKLX0KLQotaW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRSZWFkVGltZW91dCgpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0UmVhZFRpbWVvdXQoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7Ci0gIHNyY1RyYW5zXy0+c2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXQpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSB7Ci0gIHJldHVybiBzcmNUcmFuc18tPmdldE51bUNodW5rcygpOwotfQotCi11aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0Q3VyQ2h1bmsoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7Ci0gIHNyY1RyYW5zXy0+c2Vla1RvQ2h1bmsoY2h1bmspOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKLSAgc3JjVHJhbnNfLT5zZWVrVG9FbmQoKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZGFhZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8gMQotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLS8vIEluY2x1ZGUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgaGVyZS4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBUaGUgbnVsbCB0cmFuc3BvcnQgaXMgYSBkdW1teSB0cmFuc3BvcnQgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLgotICogSXQncyBzb3J0IG9mIGFuIGFuYWxvZ3kgdG8gL2Rldi9udWxsLCB5b3UgY2FuIG5ldmVyIHJlYWQgYW55dGhpbmcgZnJvbSBpdAotICogYW5kIGl0IHdpbGwgbGV0IHlvdSB3cml0ZSBhbnl0aGluZyB5b3Ugd2FudCB0byBpdCwgdGhvdWdoIGl0IHdvbid0IGFjdHVhbGx5Ci0gKiBnbyBhbnl3aGVyZS4KLSAqCi0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFROdWxsVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBUTnVsbFRyYW5zcG9ydCgpIHt9Ci0KLSAgflROdWxsVHJhbnNwb3J0KCkge30KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHt9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHJldHVybjsKLSAgfQotCi19OwotCi0KLS8qKgotICogVFBpcGVkVHJhbnNwb3J0LiBUaGlzIHRyYW5zcG9ydCBhbGxvd3MgcGlwaW5nIG9mIGEgcmVxdWVzdCBmcm9tIG9uZQotICogdHJhbnNwb3J0IHRvIGFub3RoZXIgZWl0aGVyIHdoZW4gcmVhZEVuZCgpIG9yIHdyaXRlRW5kKCkuIFRoZSB0eXBpY2FsCi0gKiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBsb2cgYSByZXF1ZXN0IG9yIGEgcmVwbHkgdG8gZGlzay4KLSAqIFRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBleHBhbmRzIHRvIGEga2VlcCBhIGNvcHkgb2YgdGhlIGVudGlyZQotICogcmVxdWVzdC9yZXNwb25zZS4KLSAqCi0gKi8KLWNsYXNzIFRQaXBlZFRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIDoKLSAgICBzcmNUcmFuc18oc3JjVHJhbnMpLAotICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCi0gICAgckJ1ZlNpemVfKDUxMiksIHJQb3NfKDApLCByTGVuXygwKSwKLSAgICB3QnVmU2l6ZV8oNTEyKSwgd0xlbl8oMCkgewotCi0gICAgLy8gZGVmYXVsdCBpcyB0byB0byBwaXBlIHRoZSByZXF1ZXN0IHdoZW4gcmVhZEVuZCgpIGlzIGNhbGxlZAotICAgIHBpcGVPblJlYWRfID0gdHJ1ZTsKLSAgICBwaXBlT25Xcml0ZV8gPSBmYWxzZTsKLQotICAgIHJCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwotICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgIH0KLSAgICB3QnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKLSAgICBpZiAod0J1Zl8gPT0gTlVMTCkgewotICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICB9Ci0gIH0KLQotICBUUGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKLSAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6KSA6Ci0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSwKLSAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAotICAgIHJCdWZTaXplXyg1MTIpLCByUG9zXygwKSwgckxlbl8oMCksCi0gICAgd0J1ZlNpemVfKHN6KSwgd0xlbl8oMCkgewotCi0gICAgckJ1Zl8gPSAodWludDhfdCopIHN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7Ci0gICAgaWYgKHJCdWZfID09IE5VTEwpIHsKLSAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7Ci0gICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwotICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICAgIH0KLSAgfQotCi0gIH5UUGlwZWRUcmFuc3BvcnQoKSB7Ci0gICAgc3RkOjpmcmVlKHJCdWZfKTsKLSAgICBzdGQ6OmZyZWUod0J1Zl8pOwotICB9Ci0KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgaWYgKHJQb3NfID49IHJMZW5fKSB7Ci0gICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKLSAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKLSAgICAgICAgckJ1ZlNpemVfICo9MjsKLSAgICAgICAgckJ1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICAgIH0KLQotICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgotICAgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7Ci0gICAgfQotICAgIHJldHVybiAockxlbl8gPiByUG9zXyk7Ci0gIH0KLQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICBzcmNUcmFuc18tPm9wZW4oKTsKLSAgfQotCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgc3JjVHJhbnNfLT5jbG9zZSgpOwotICB9Ci0KLSAgdm9pZCBzZXRQaXBlT25SZWFkKGJvb2wgcGlwZVZhbCkgewotICAgIHBpcGVPblJlYWRfID0gcGlwZVZhbDsKLSAgfQotCi0gIHZvaWQgc2V0UGlwZU9uV3JpdGUoYm9vbCBwaXBlVmFsKSB7Ci0gICAgcGlwZU9uV3JpdGVfID0gcGlwZVZhbDsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHVpbnQzMl90IHJlYWRFbmQoKSB7Ci0KLSAgICBpZiAocGlwZU9uUmVhZF8pIHsKLSAgICAgIGRzdFRyYW5zXy0+d3JpdGUockJ1Zl8sIHJQb3NfKTsKLSAgICAgIGRzdFRyYW5zXy0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICBzcmNUcmFuc18tPnJlYWRFbmQoKTsKLQotICAgIC8vIElmIHJlcXVlc3RzIGFyZSBiZWluZyBwaXBlbGluZWQsIGNvcHkgZG93biBvdXIgcmVhZC1haGVhZCBkYXRhLAotICAgIC8vIHRoZW4gcmVzZXQgb3VyIHN0YXRlLgotICAgIGludCByZWFkX2FoZWFkID0gckxlbl8gLSByUG9zXzsKLSAgICB1aW50MzJfdCBieXRlcyA9IHJQb3NfOwotICAgIG1lbWNweShyQnVmXywgckJ1Zl8gKyByUG9zXywgcmVhZF9haGVhZCk7Ci0gICAgclBvc18gPSAwOwotICAgIHJMZW5fID0gcmVhZF9haGVhZDsKLQotICAgIHJldHVybiBieXRlczsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHVpbnQzMl90IHdyaXRlRW5kKCkgewotICAgIGlmIChwaXBlT25Xcml0ZV8pIHsKLSAgICAgIGRzdFRyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKLSAgICAgIGRzdFRyYW5zXy0+Zmx1c2goKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdMZW5fOwotICB9Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gZHN0VHJhbnNfOwotICB9Ci0KLSAgLyoKLSAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCi0gICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0Ci0gICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKLQotICB1aW50OF90KiByQnVmXzsKLSAgdWludDMyX3QgckJ1ZlNpemVfOwotICB1aW50MzJfdCByUG9zXzsKLSAgdWludDMyX3Qgckxlbl87Ci0KLSAgdWludDhfdCogd0J1Zl87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgdWludDMyX3Qgd0xlbl87Ci0KLSAgYm9vbCBwaXBlT25SZWFkXzsKLSAgYm9vbCBwaXBlT25Xcml0ZV87Ci19OwotCi0KLS8qKgotICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIHBpcGVkVHJhbnNwb3J0IGluc3RhbmNlLgotICoKLSAqLwotY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLSAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgewotICAgIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoZHN0VHJhbnMpOwotICB9Ci0gIHZpcnR1YWwgflRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgYmFzZSB0cmFuc3BvcnQgaW50byBhIHBpcGVkIHRyYW5zcG9ydC4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKLSAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKLSAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwotfTsKLQotLyoqCi0gKiBUUGlwZWRGaWxlVHJhbnNwb3J0LiBUaGlzIGlzIGp1c3QgbGlrZSBhIFRUcmFuc3BvcnQsIGV4Y2VwdCB0aGF0Ci0gKiBpdCBpcyBhIHRlbXBsYXRpemVkIGNsYXNzLCBzbyB0aGF0IGNsaWVudHMgd2hvIHJlbHkgb24gYSBzcGVjaWZpYwotICogVFRyYW5zcG9ydCBjYW4gc3RpbGwgYWNjZXNzIHRoZSBvcmlnaW5hbCB0cmFuc3BvcnQuCi0gKgotICovCi1jbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKTsKLQotICB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOwotCi0gIC8vIFRUcmFuc3BvcnQgZnVuY3Rpb25zCi0gIGJvb2wgaXNPcGVuKCk7Ci0gIGJvb2wgcGVlaygpOwotICB2b2lkIG9wZW4oKTsKLSAgdm9pZCBjbG9zZSgpOwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHJlYWRFbmQoKTsKLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHdyaXRlRW5kKCk7Ci0gIHZvaWQgZmx1c2goKTsKLQotICAvLyBURmlsZVJlYWRlclRyYW5zcG9ydCBmdW5jdGlvbnMKLSAgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpOwotICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpOwotICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKLSAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKLSAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKLSAgdm9pZCBzZWVrVG9FbmQoKTsKLQotICAvKgotICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KLSAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKLSAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIHNob3VsZG4ndCBiZSB1c2VkCi0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKLX07Ci0KLS8qKgotICogQ3JlYXRlcyBhIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgZnJvbSBhIGZpbGVwYXRoIGFuZCBhIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAotICoKLSAqLwotY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQotICAgIDogVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShkc3RUcmFucykKLSAge30KLSAgdmlydHVhbCB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydCA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwotICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOwotICAgIH0KLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4obmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwotICB9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjA2ODEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RWSVJUVUFMVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBUVHJhbnNwb3J0IG1ldGhvZHMuCi0gKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiByZWFkKCksIHJlYWRBbGwoKSwgd3JpdGUoKSwKLSAqIGJvcnJvdygpIGFuZCBjb25zdW1lKCkuCi0gKgotICogSW4gdGhlIFRUcmFuc3BvcnQgYmFzZSBjbGFzcywgZWFjaCBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSBpbnZva2VzIGl0cwotICogdmlydHVhbCBjb3VudGVycGFydC4gIFRoaXMgY2xhc3Mgb3ZlcnJpZGVzIHRoZW0gdG8gYWx3YXlzIHBlcmZvcm0gdGhlCi0gKiBkZWZhdWx0IGJlaGF2aW9yLCB3aXRob3V0IGEgdmlydHVhbCBmdW5jdGlvbiBjYWxsLgotICoKLSAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBzZXJ2ZSBhcyBhIGJhc2UgY2xhc3MgZm9yCi0gKiBUVmlydHVhbFRyYW5zcG9ydCwgYW5kIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIG9uZSBvZiBpdHMgc3ViY2xhc3NlcwotICogZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcy4gIChTaW5jZQotICogVFZpcnR1YWxUcmFuc3BvcnQ6OnJlYWRfdmlydCgpIGNhbGxzIHJlYWQoKSwgYW5kIFRUcmFuc3BvcnQ6OnJlYWQoKSBjYWxscwotICogcmVhZF92aXJ0KCkuKQotICovCi1jbGFzcyBUVHJhbnNwb3J0RGVmYXVsdHMgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICAvKgotICAgKiBUVHJhbnNwb3J0ICpfdmlydCgpIG1ldGhvZHMgcHJvdmlkZSByZWFzb25hYmxlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgotICAgKiBJbnZva2UgdGhlbSBub24tdmlydHVhbGx5LgotICAgKi8KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkX3ZpcnQoYnVmLCBsZW4pOwotICB9Ci0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZEFsbF92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+VFRyYW5zcG9ydDo6d3JpdGVfdmlydChidWYsIGxlbik7Ci0gIH0KLSAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0Ojpib3Jyb3dfdmlydChidWYsIGxlbik7Ci0gIH0KLSAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPlRUcmFuc3BvcnQ6OmNvbnN1bWVfdmlydChsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRUcmFuc3BvcnREZWZhdWx0cygpIHt9Ci19OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIHBvbHltb3JwaGlzbSBmb3Igc3ViY2xhc3NlcyBvZiBUVHJhbnNwb3J0LgotICoKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyAqX3ZpcnQoKSBtZXRob2RzIG9mIFRUcmFuc3BvcnQsIHRvIGNhbGwgdGhlCi0gKiBub24tdmlydHVhbCB2ZXJzaW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlIHByb3BlciBzdWJjbGFzcy4KLSAqCi0gKiBUbyBkZWZpbmUgeW91ciBvd24gdHJhbnNwb3J0IGNsYXNzIHVzaW5nIFRWaXJ0dWFsVHJhbnNwb3J0OgotICogMSkgRGVyaXZlIHlvdXIgc3ViY2xhc3MgZnJvbSBUVmlydHVhbFRyYW5zcG9ydDx5b3VyIGNsYXNzPgotICogICAgZS5nOiAgY2xhc3MgTXlUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8TXlUcmFuc3BvcnQ+IHsKLSAqIDIpIFByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb25zIG9mIHJlYWQoKSwgcmVhZEFsbCgpLCBldGMuCi0gKiAgICBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSBub24tdmlydHVhbC4KLSAqCi0gKiBUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRoYXQgbmVlZCB0byB1c2UgdmlydHVhbCBpbmhlcml0YW5jZSB3aGVuCi0gKiBpbmhlcml0aW5nIGZyb20gVFRyYW5zcG9ydCBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0LgotICoKLSAqIEBhdXRob3IgQ2hhZCBXYWx0ZXJzIDxjaGFkQHBvd2Vyc2V0LmNvbT4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIFN1cGVyXz1UVHJhbnNwb3J0RGVmYXVsdHM+Ci1jbGFzcyBUVmlydHVhbFRyYW5zcG9ydCA6IHB1YmxpYyBTdXBlcl8gewotIHB1YmxpYzoKLSAgLyoKLSAgICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSAqX3ZpcnQoKSBmdW5jdGlvbnMsIHRvIGNhbGwgdGhlIHN1YmNsYXNzJ3MKLSAgICogbm9uLXZpcnR1YWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb24uCi0gICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5yZWFkQWxsKGJ1ZiwgbGVuKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT53cml0ZShidWYsIGxlbik7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPmJvcnJvdyhidWYsIGxlbik7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IGxlbikgewotICAgIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOwotICB9Ci0KLSAgLyoKLSAgICogUHJvdmlkZSBhIGRlZmF1bHQgcmVhZEFsbCgpIGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcwotICAgKiByZWFkKCkgbm9uLXZpcnR1YWxseS4KLSAgICoKLSAgICogTm90ZTogc3ViY2xhc3NlcyB0aGF0IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBkZXJpdmUgZnJvbSBhbm90aGVyCi0gICAqIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiAoaS5lLiwgbm90IFRUcmFuc3BvcnREZWZhdWx0cykgc2hvdWxkIGJld2FyZSB0aGF0Ci0gICAqIHRoaXMgbWF5IG92ZXJyaWRlIGFueSBub24tZGVmYXVsdCByZWFkQWxsKCkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkKLSAgICogdGhlIHBhcmVudCB0cmFuc3BvcnQgY2xhc3MuICBUaGV5IG1heSBuZWVkIHRvIHJlZGVmaW5lIHJlYWRBbGwoKSB0byBjYWxsCi0gICAqIHRoZSBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KLSAgICovCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICBUcmFuc3BvcnRfKiB0cmFucyA9IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKTsKLSAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0cmFucywgYnVmLCBsZW4pOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFRWaXJ0dWFsVHJhbnNwb3J0KCkge30KLQotICAvKgotICAgKiBUZW1wbGF0aXplZCBjb25zdHJ1Y3RvcnMsIHRvIGFsbG93IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIFN1cGVyXwotICAgKiBjb25zdHJ1Y3Rvci4gIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgMCwgMSwgb3IgMiBhcmd1bWVudHMsIGJ1dAotICAgKiBhZGRpdGlvbmFsIHZlcnNpb25zIGNhbiBiZSBhZGRlZCBhcyBuZWVkZWQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnXz4KLSAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnXyBjb25zdCYgYXJnKSA6IFN1cGVyXyhhcmcpIHsgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxXywgdHlwZW5hbWUgQXJnMl8+Ci0gIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZzFfIGNvbnN0JiBhMSwgQXJnMl8gY29uc3QmIGEyKSA6IFN1cGVyXyhhMSwgYTIpIHsgfQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY1Mjg4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx6bGliLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vLyBEb24ndCBjYWxsIHRoaXMgb3V0c2lkZSBvZiB0aGUgY29uc3RydWN0b3IuCi12b2lkIFRabGliVHJhbnNwb3J0Ojppbml0WmxpYigpIHsKLSAgaW50IHJ2OwotICBib29sIHJfaW5pdCA9IGZhbHNlOwotICB0cnkgewotICAgIHJzdHJlYW1fID0gbmV3IHpfc3RyZWFtOwotICAgIHdzdHJlYW1fID0gbmV3IHpfc3RyZWFtOwotCi0gICAgcnN0cmVhbV8tPnphbGxvYyA9IFpfTlVMTDsKLSAgICB3c3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOwotICAgIHJzdHJlYW1fLT56ZnJlZSAgPSBaX05VTEw7Ci0gICAgd3N0cmVhbV8tPnpmcmVlICA9IFpfTlVMTDsKLSAgICByc3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOwotICAgIHdzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7Ci0KLSAgICByc3RyZWFtXy0+bmV4dF9pbiAgID0gY3JidWZfOwotICAgIHdzdHJlYW1fLT5uZXh0X2luICAgPSB1d2J1Zl87Ci0gICAgcnN0cmVhbV8tPm5leHRfb3V0ICA9IHVyYnVmXzsKLSAgICB3c3RyZWFtXy0+bmV4dF9vdXQgID0gY3didWZfOwotICAgIHJzdHJlYW1fLT5hdmFpbF9pbiAgPSAwOwotICAgIHdzdHJlYW1fLT5hdmFpbF9pbiAgPSAwOwotICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKLSAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87Ci0KLSAgICBydiA9IGluZmxhdGVJbml0KHJzdHJlYW1fKTsKLSAgICBjaGVja1psaWJSdihydiwgcnN0cmVhbV8tPm1zZyk7Ci0KLSAgICAvLyBIYXZlIHRvIHNldCB0aGlzIGZsYWcgc28gd2Uga25vdyB3aGV0aGVyIHRvIGRlLWluaXRpYWxpemUuCi0gICAgcl9pbml0ID0gdHJ1ZTsKLQotICAgIHJ2ID0gZGVmbGF0ZUluaXQod3N0cmVhbV8sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci0gICAgY2hlY2tabGliUnYocnYsIHdzdHJlYW1fLT5tc2cpOwotICB9Ci0KLSAgY2F0Y2ggKC4uLikgewotICAgIGlmIChyX2luaXQpIHsKLSAgICAgIHJ2ID0gaW5mbGF0ZUVuZChyc3RyZWFtXyk7Ci0gICAgICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHJzdHJlYW1fLT5tc2cpOwotICAgIH0KLSAgICAvLyBUaGVyZSBpcyBubyB3YXkgd2UgY2FuIGdldCBoZXJlIGlmIHdzdHJlYW1fIHdhcyBpbml0aWFsaXplZC4KLQotICAgIHRocm93OwotICB9Ci19Ci0KLWlubGluZSB2b2lkIFRabGliVHJhbnNwb3J0OjpjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGlmIChzdGF0dXMgIT0gWl9PSykgewotICAgIHRocm93IFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKHN0YXR1cywgbWVzc2FnZSk7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIGlmIChzdGF0dXMgIT0gWl9PSykgewotICAgIHN0cmluZyBvdXRwdXQgPSAiVFpsaWJUcmFuc3BvcnQ6IHpsaWIgZmFpbHVyZSBpbiBkZXN0cnVjdG9yOiAiICsKLSAgICAgIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uOjplcnJvck1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlKTsKLSAgICBHbG9iYWxPdXRwdXQob3V0cHV0LmNfc3RyKCkpOwotICB9Ci19Ci0KLVRabGliVHJhbnNwb3J0Ojp+VFpsaWJUcmFuc3BvcnQoKSB7Ci0gIGludCBydjsKLSAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKLSAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCByc3RyZWFtXy0+bXNnKTsKLQotICBydiA9IGRlZmxhdGVFbmQod3N0cmVhbV8pOwotICAvLyBaX0RBVEFfRVJST1IgbWF5IGJlIHJldHVybmVkIGlmIHRoZSBjYWxsZXIgaGFzIHdyaXR0ZW4gZGF0YSwgYnV0IG5vdAotICAvLyBjYWxsZWQgZmx1c2goKSB0byBhY3R1YWxseSBmaW5pc2ggd3JpdGluZyB0aGUgZGF0YSBvdXQgdG8gdGhlIHVuZGVybHlpbmcKLSAgLy8gdHJhbnNwb3J0LiAgVGhlIGRlZmluZWQgVFRyYW5zcG9ydCBiZWhhdmlvciBpbiB0aGlzIGNhc2UgaXMgdGhhdCB0aGlzIGRhdGEKLSAgLy8gbWF5IGJlIGRpc2NhcmRlZCwgc28gd2UgaWdub3JlIHRoZSBlcnJvciBhbmQgc2lsZW50bHkgZGlzY2FyZCB0aGUgZGF0YS4KLSAgLy8gRm9yIG90aGVyIGVycm9zLCBsb2cgYSBtZXNzYWdlLgotICBpZiAocnYgIT0gWl9EQVRBX0VSUk9SKSB7Ci0gICAgY2hlY2tabGliUnZOb3Rocm93KHJ2LCB3c3RyZWFtXy0+bXNnKTsKLSAgfQotCi0gIGRlbGV0ZVtdIHVyYnVmXzsKLSAgZGVsZXRlW10gY3JidWZfOwotICBkZWxldGVbXSB1d2J1Zl87Ci0gIGRlbGV0ZVtdIGN3YnVmXzsKLSAgZGVsZXRlIHJzdHJlYW1fOwotICBkZWxldGUgd3N0cmVhbV87Ci19Ci0KLWJvb2wgVFpsaWJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIChyZWFkQXZhaWwoKSA+IDApIHx8IHRyYW5zcG9ydF8tPmlzT3BlbigpOwotfQotCi0vLyBSRUFESU5HIFNUUkFURUdZCi0vLwotLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3IgcmVhZGluZzogb25lIGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoY3JidWZfKQotLy8gYW5kIG9uZSBjb250YWluaW5nIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAodXJidWZfKS4gIFdoZW4gcmVhZCBpcyBjYWxsZWQsCi0vLyB3ZSByZXBlYXQgdGhlIGZvbGxvd2luZyBzdGVwcyB1bnRpbCB3ZSBoYXZlIHNhdGlzZmllZCB0aGUgcmVxdWVzdDoKLS8vIC0gQ29weSBkYXRhIGZyb20gdXJidWZfIGludG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4KLS8vIC0gSWYgd2UgaGFkIGVub3VnaCwgcmV0dXJuLgotLy8gLSBJZiB1cmJ1Zl8gaXMgZW1wdHksIHJlYWQgc29tZSBkYXRhIGludG8gaXQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0vLyAtIEluZmxhdGUgZGF0YSBmcm9tIGNyYnVmXyBpbnRvIHVyYnVmXy4KLS8vCi0vLyBJbiBzdGFuZGFsb25lIG9iamVjdHMsIHdlIHNldCBpbnB1dF9lbmRlZF8gdG8gdHJ1ZSB3aGVuIGluZmxhdGUgcmV0dXJucwotLy8gWl9TVFJFQU1fRU5ELiAgVGhpcyBhbGxvd3MgdG8gbWFrZSBzdXJlIHRoYXQgYSBjaGVja3N1bSB3YXMgdmVyaWZpZWQuCi0KLWlubGluZSBpbnQgVFpsaWJUcmFuc3BvcnQ6OnJlYWRBdmFpbCgpIHsKLSAgcmV0dXJuIHVyYnVmX3NpemVfIC0gcnN0cmVhbV8tPmF2YWlsX291dCAtIHVycG9zXzsKLX0KLQotdWludDMyX3QgVFpsaWJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgbmVlZCA9IGxlbjsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFNraXAgdXJidWYgb24gYmlnIHJlYWRzLgotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZSBhdmFpbGFibGUsIHRoZW4gZ2l2ZSB0aGVtIHRoZSBtaW4gb2YKLSAgICAvLyB3aGF0IHdlIGhhdmUgYW5kIHdoYXQgdGhleSB3YW50LCB0aGVuIGFkdmFuY2UgaW5kaWNlcy4KLSAgICBpbnQgZ2l2ZSA9IHN0ZDo6bWluKCh1aW50MzJfdCkgcmVhZEF2YWlsKCksIG5lZWQpOwotICAgIG1lbWNweShidWYsIHVyYnVmXyArIHVycG9zXywgZ2l2ZSk7Ci0gICAgbmVlZCAtPSBnaXZlOwotICAgIGJ1ZiArPSBnaXZlOwotICAgIHVycG9zXyArPSBnaXZlOwotCi0gICAgLy8gSWYgdGhleSB3ZXJlIHNhdGlzZmllZCwgd2UgYXJlIGRvbmUuCi0gICAgaWYgKG5lZWQgPT0gMCkgewotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSB3aWxsIG5lZWQgdG8gcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byBnZXQgbW9yZSBkYXRhLAotICAgIC8vIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIGF2YWlsYWJsZSwgcmV0dXJuIGl0IG5vdy4gIFJlYWRpbmcgZnJvbQotICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBtYXkgYmxvY2ssIGFuZCByZWFkKCkgaXMgb25seSBhbGxvd2VkIHRvIGJsb2NrCi0gICAgLy8gd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgICBpZiAobmVlZCA8IGxlbiAmJiByc3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgewotICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gZ2V0IHNvbWUgbW9yZSBkYXRhLgotCi0gICAgLy8gSWYgemxpYiBoYXMgcmVwb3J0ZWQgdGhlIGVuZCBvZiBhIHN0cmVhbSwgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueSBtb3JlLgotICAgIGlmIChpbnB1dF9lbmRlZF8pIHsKLSAgICAgIHJldHVybiBsZW4gLSBuZWVkOwotICAgIH0KLQotICAgIC8vIFRoZSB1bmNvbXByZXNzZWQgcmVhZCBidWZmZXIgaXMgZW1wdHksIHNvIHJlc2V0IHRoZSBzdHJlYW0gZmllbGRzLgotICAgIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87Ci0gICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOwotICAgIHVycG9zXyA9IDA7Ci0KLSAgICAvLyBDYWxsIGluZmxhdGUoKSB0byB1bmNvbXByZXNzIHNvbWUgbW9yZSBkYXRhCi0gICAgaWYgKCFyZWFkRnJvbVpsaWIoKSkgewotICAgICAgLy8gbm8gZGF0YSBhdmFpbGFibGUgZnJvbSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7Ci0gICAgfQotCi0gICAgLy8gT2theS4gIFRoZSByZWFkIGJ1ZmZlciBzaG91bGQgaGF2ZSB3aGF0ZXZlciB3ZSBjYW4gZ2l2ZSBpdCBub3cuCi0gICAgLy8gTG9vcCBiYWNrIHRvIHRoZSBzdGFydCBhbmQgdHJ5IHRvIGdpdmUgc29tZSBtb3JlLgotICB9Ci19Ci0KLWJvb2wgVFpsaWJUcmFuc3BvcnQ6OnJlYWRGcm9tWmxpYigpIHsKLSAgYXNzZXJ0KCFpbnB1dF9lbmRlZF8pOwotCi0gIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29tcHJlc3NlZCBkYXRhIGF2YWlsYWJsZSwKLSAgLy8gcmVhZCBzb21lIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICBpZiAocnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKLSAgICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKGNyYnVmXywgY3JidWZfc2l6ZV8pOwotICAgIGlmIChnb3QgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByc3RyZWFtXy0+bmV4dF9pbiAgPSBjcmJ1Zl87Ci0gICAgcnN0cmVhbV8tPmF2YWlsX2luID0gZ290OwotICB9Ci0KLSAgLy8gV2UgaGF2ZSBzb21lIGNvbXByZXNzZWQgZGF0YSBub3cuICBVbmNvbXByZXNzIGl0LgotICBpbnQgemxpYl9ydiA9IGluZmxhdGUocnN0cmVhbV8sIFpfU1lOQ19GTFVTSCk7Ci0KLSAgaWYgKHpsaWJfcnYgPT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgaW5wdXRfZW5kZWRfID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBjaGVja1psaWJSdih6bGliX3J2LCByc3RyZWFtXy0+bXNnKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8vIFdSSVRJTkcgU1RSQVRFR1kKLS8vCi0vLyBXZSBidWZmZXIgdXAgc21hbGwgd3JpdGVzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gemxpYiwgc28gb3VyIGxvZ2ljIGlzOgotLy8gLSBJcyB0aGUgd3JpdGUgYmlnPwotLy8gICAtIFNlbmQgdGhlIGJ1ZmZlciB0byB6bGliLgotLy8gICAtIFNlbmQgdGhpcyBkYXRhIHRvIHpsaWIuCi0vLyAtIElzIHRoZSB3cml0ZSBzbWFsbD8KLS8vICAgLSBJcyB0aGVyZSBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgaXQ/Ci0vLyAgICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KLS8vICAgLSBDb3B5IHRoZSBkYXRhIHRvIHRoZSBidWZmZXIuCi0vLwotLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3Igd3JpdGluZyBhbHNvOiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlciAobWVudGlvbmVkCi0vLyBhYm92ZSkgYW5kIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gIFdoZW4gc2VuZGluZyBkYXRhIHRvIHpsaWIgd2UgbG9vcCBvdmVyCi0vLyB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSBzb3VyY2UgKHVuY29tcHJlc3NlZCBidWZmZXIgb3IgYmlnIHdyaXRlKSBpcyBlbXB0eToKLS8vIC0gSXMgdGhlcmUgbm8gbW9yZSBzcGFjZSBpbiB0aGUgY29tcHJlc3NlZCBidWZmZXI/Ci0vLyAgIC0gV3JpdGUgdGhlIGNvbXByZXNzZWQgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLS8vIC0gRGVmbGF0ZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOwotICB9Ci0KLSAgLy8gemxpYidzICJkZWZsYXRlIiBmdW5jdGlvbiBoYXMgZW5vdWdoIGxvZ2ljIGluIGl0IHRoYXQgSSB0aGluawotICAvLyB3ZSdyZSBiZXR0ZXIgb2ZmIChwZXJmb3JtYW5jZS13aXNlKSBidWZmZXJpbmcgdXAgc21hbGwgd3JpdGVzLgotICBpZiAobGVuID4gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKLSAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9OT19GTFVTSCk7Ci0gICAgdXdwb3NfID0gMDsKLSAgICBmbHVzaFRvWmxpYihidWYsIGxlbiwgWl9OT19GTFVTSCk7Ci0gIH0gZWxzZSBpZiAobGVuID4gMCkgewotICAgIGlmICh1d2J1Zl9zaXplXyAtIHV3cG9zXyA8IGxlbikgewotICAgICAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIFpfTk9fRkxVU0gpOwotICAgICAgdXdwb3NfID0gMDsKLSAgICB9Ci0gICAgbWVtY3B5KHV3YnVmXyArIHV3cG9zXywgYnVmLCBsZW4pOwotICAgIHV3cG9zXyArPSBsZW47Ci0gIH0KLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSAgewotICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2goKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKLSAgfQotCi0gIGZsdXNoVG9UcmFuc3BvcnQoWl9TWU5DX0ZMVVNIKTsKLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6ZmluaXNoKCkgIHsKLSAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmlzaCgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOwotICB9Ci0KLSAgZmx1c2hUb1RyYW5zcG9ydChaX0ZJTklTSCk7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKSAgewotICAvLyB3cml0ZSBwZW5kaW5nIGRhdGEgaW4gdXdidWZfIHRvIHpsaWIKLSAgZmx1c2hUb1psaWIodXdidWZfLCB1d3Bvc18sIGZsdXNoKTsKLSAgdXdwb3NfID0gMDsKLQotICAvLyB3cml0ZSBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSB6bGliIHRvIHRoZSB0cmFuc3BvcnQKLSAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyAtIHdzdHJlYW1fLT5hdmFpbF9vdXQpOwotICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87Ci0gIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKLQotICAvLyBmbHVzaCB0aGUgdHJhbnNwb3J0Ci0gIHRyYW5zcG9ydF8tPmZsdXNoKCk7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9abGliKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IGxlbiwgaW50IGZsdXNoKSB7Ci0gIHdzdHJlYW1fLT5uZXh0X2luICA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7Ci0gIHdzdHJlYW1fLT5hdmFpbF9pbiA9IGxlbjsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChmbHVzaCA9PSBaX05PX0ZMVVNIICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBJZiBvdXIgb3VwdXQgYnVmZmVyIGlzIGZ1bGwsIGZsdXNoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgICBpZiAod3N0cmVhbV8tPmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfKTsKLSAgICAgIHdzdHJlYW1fLT5uZXh0X291dCAgPSBjd2J1Zl87Ci0gICAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87Ci0gICAgfQotCi0gICAgaW50IHpsaWJfcnYgPSBkZWZsYXRlKHdzdHJlYW1fLCBmbHVzaCk7Ci0KLSAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0ggJiYgemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgIGFzc2VydCh3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCk7Ci0gICAgICBvdXRwdXRfZmluaXNoZWRfID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHdzdHJlYW1fLT5tc2cpOwotCi0gICAgaWYgKChmbHVzaCA9PSBaX1NZTkNfRkxVU0ggfHwgZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSAmJgotICAgICAgICB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCAmJiB3c3RyZWFtXy0+YXZhaWxfb3V0ICE9IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1jb25zdCB1aW50OF90KiBUWmxpYlRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KLSAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgZ2l2ZSBhIHBvaW50ZXIgdG8gaXQsCi0gIC8vIG90aGVyd2lzZSBsZXQgdGhlIHByb3Rjb2wgdXNlIGl0cyBzbG93IHBhdGguCi0gIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KSpsZW4pIHsKLSAgICAqbGVuID0gKHVpbnQzMl90KXJlYWRBdmFpbCgpOwotICAgIHJldHVybiB1cmJ1Zl8gKyB1cnBvc187Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gIGlmIChyZWFkQXZhaWwoKSA+PSAoaW50KWxlbikgewotICAgIHVycG9zXyArPSBsZW47Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOwotICB9Ci19Ci0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OnZlcmlmeUNoZWNrc3VtKCkgewotICAvLyBJZiB6bGliIGhhcyBhbHJlYWR5IHJlcG9ydGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwKLSAgLy8gaXQgaGFzIHZlcmlmaWVkIHRoZSBjaGVja3N1bS4KLSAgaWYgKGlucHV0X2VuZGVkXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZS4KLSAgLy8gSWYgdGhlIGNhbGxlciBzdGlsbCBoYXMgdW5yZWFkIGRhdGEsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgaWYgKHJlYWRBdmFpbCgpID4gMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oCi0gICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAotICAgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIpOwotICB9Ci0KLSAgLy8gUmVzZXQgdGhlIHJzdHJlYW0gZmllbGRzLCBpbiBjYXNlIGF2YWlsX291dCBpcyAwLgotICAvLyAoU2luY2UgcmVhZEF2YWlsKCkgaXMgMCwgd2Uga25vdyB0aGVyZSBpcyBubyB1bnJlYWQgZGF0YSBpbiB1cmJ1Zl8pCi0gIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87Ci0gIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKLSAgdXJwb3NfID0gMDsKLQotICAvLyBDYWxsIGluZmxhdGUoKQotICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjaGVja3N1bSBpcyBiYWQuCi0gIGJvb2wgcGVyZm9ybWVkX2luZmxhdGUgPSByZWFkRnJvbVpsaWIoKTsKLSAgaWYgKCFwZXJmb3JtZWRfaW5mbGF0ZSkgewotICAgIC8vIFdlIG5lZWRlZCB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBhbmQgdGhlIHJlYWQoKSBjYWxsCi0gICAgLy8gcmV0dXJuZWQgMC4KLSAgICAvLwotICAgIC8vIE5vdCBhbGwgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgYmVoYXZlIHRoZSBzYW1lIHdheSBoZXJlLCBzbyB3ZSdsbAotICAgIC8vIGVuZCB1cCB3aXRoIGRpZmZlcmVudCBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgIC8vCi0gICAgLy8gRm9yIHNvbWUgdHJhbnNwb3J0cyAoZS5nLiwgVEZEVHJhbnNwb3J0KSwgcmVhZCgpIGJsb2NrcyBpZiBubyBtb3JlIGRhdGEKLSAgICAvLyBpcyBhdmFpbGFibGUuICBUaGV5IG9ubHkgcmV0dXJuIDAgaWYgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIG9yIGlmIHRoZQotICAgIC8vIHJlbW90ZSBlbmRwb2ludCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiAgRm9yIHRob3NlIHRyYW5zcG9ydHMsCi0gICAgLy8gdmVyaWZ5Q2hlY2tzdW0oKSB3aWxsIGJsb2NrIHVudGlsIHRoZSBjaGVja3N1bSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAgICAvLwotICAgIC8vIE90aGVyIHRyYW5zcG9ydCB0eXBlcyAoZS5nLiwgVE1lbW9yeUJ1ZmZlcikgYWx3YXlzIHJldHVybiAwIGltbWVkaWF0ZWx5Ci0gICAgLy8gaWYgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4gIEZvciB0aG9zZSB0cmFuc3BvcnQgdHlwZXMsIHZlcmlmeUNoZWNrc3VtCi0gICAgLy8gd2lsbCByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpZiB0aGUgY2hlY2tzdW0gaXMgbm90IGF2YWlsYWJsZSBmcm9tCi0gICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHlldC4KLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtIG5vdCBhdmFpbGFibGUgeWV0IGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIik7Ci0gIH0KLQotICAvLyBJZiBpbnB1dF9lbmRlZF8gaXMgdHJ1ZSBub3csIHRoZSBjaGVja3N1bSBoYXMgYmVlbiB2ZXJpZmllZAotICBpZiAoaW5wdXRfZW5kZWRfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gVGhlIGNhbGxlciBpbnZva2VkIHVzIGJlZm9yZSB0aGUgYWN0dWFsIGVuZCBvZiB0aGUgZGF0YSBzdHJlYW0KLSAgYXNzZXJ0KHJzdHJlYW1fLT5hdmFpbF9vdXQgPCB1cmJ1Zl9zaXplXyk7Ci0gIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6bGliIHN0cmVhbSIpOwotfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJmZjMxLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+Ci0KLXN0cnVjdCB6X3N0cmVhbV9zOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgOgotICAgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2Uoc3RhdHVzLCBtc2cpKSwKLSAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKLSAgICB6bGliX21zZ18obXNnID09IE5VTEwgPyAiKG51bGwpIiA6IG1zZykge30KLQotICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICBpbnQgZ2V0WmxpYlN0YXR1cygpIHsgcmV0dXJuIHpsaWJfc3RhdHVzXzsgfQotICBzdGQ6OnN0cmluZyBnZXRabGliTWVzc2FnZSgpIHsgcmV0dXJuIHpsaWJfbXNnXzsgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKSB7Ci0gICAgc3RkOjpzdHJpbmcgcnYgPSAiemxpYiBlcnJvcjogIjsKLSAgICBpZiAobXNnKSB7Ci0gICAgICBydiArPSBtc2c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOwotICAgIH0KLSAgICBydiArPSAiIChzdGF0dXMgPSAiOwotICAgIHJ2ICs9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0YXR1cyk7Ci0gICAgcnYgKz0gIikiOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIGludCB6bGliX3N0YXR1c187Ci0gIHN0ZDo6c3RyaW5nIHpsaWJfbXNnXzsKLX07Ci0KLS8qKgotICogVGhpcyB0cmFuc3BvcnQgdXNlcyB6bGliJ3MgY29tcHJlc3NlZCBmb3JtYXQgb24gdGhlICJmYXIiIHNpZGUuCi0gKgotICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBUWmxpYlRyYW5zcG9ydCBvYmplY3RzOgotICogLSBTdGFuZGFsb25lIG9iamVjdHMgYXJlIHVzZWQgdG8gZW5jb2RlIHNlbGYtY29udGFpbmVkIGNodW5rcyBvZiBkYXRhCi0gKiAgIChsaWtlIHN0cnVjdHVyZXMpLiAgVGhleSBpbmNsdWRlIGNoZWNrc3Vtcy4KLSAqIC0gTm9uLXN0YW5kYWxvbmUgdHJhbnNwb3J0cyBhcmUgdXNlZCBmb3IgUlBDLiAgVGhleSBhcmUgbm90IGltcGxlbWVudGVkIHlldC4KLSAqCi0gKiBUT0RPKGRyZWlzcyk6IERvbid0IGRvIGFuIGV4dHJhIGNvcHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpZgotICogICAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgVEJ1ZmZlcmVkIG9yIFRNZW1vcnkuCi0gKgotICovCi1jbGFzcyBUWmxpYlRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUWmxpYlRyYW5zcG9ydD4gewotIHB1YmxpYzoKLQotICAvKioKLSAgICogQHBhcmFtIHRyYW5zcG9ydCAgICBUaGUgdHJhbnNwb3J0IHRvIHJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20KLSAgICogICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGUgY29tcHJlc3NlZCBkYXRhIHRvLgotICAgKiBAcGFyYW0gdXJidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3IgcmVhZGluZy4KLSAgICogQHBhcmFtIGNyYnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nLgotICAgKiBAcGFyYW0gdXdidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KLSAgICogQHBhcmFtIGN3YnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgotICAgKgotICAgKiBUT0RPKGRyZWlzcyk6IFdyaXRlIGEgY29uc3RydWN0b3IgdGhhdCBpc24ndCBhIHBhaW4uCi0gICAqLwotICBUWmxpYlRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCBjd2J1Zl9zaXplID0gREVGQVVMVF9DV0JVRl9TSVpFKSA6Ci0gICAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAotICAgIHVycG9zXygwKSwKLSAgICB1d3Bvc18oMCksCi0gICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKLSAgICBvdXRwdXRfZmluaXNoZWRfKGZhbHNlKSwKLSAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKLSAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKLSAgICB1d2J1Zl9zaXplXyh1d2J1Zl9zaXplKSwKLSAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKLSAgICB1cmJ1Zl8oTlVMTCksCi0gICAgY3JidWZfKE5VTEwpLAotICAgIHV3YnVmXyhOVUxMKSwKLSAgICBjd2J1Zl8oTlVMTCksCi0gICAgcnN0cmVhbV8oTlVMTCksCi0gICAgd3N0cmVhbV8oTlVMTCkKLSAgewotICAgIGlmICh1d2J1Zl9zaXplXyA8IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7Ci0gICAgICAvLyBIYXZlIHRvIGNvcHkgdGhpcyBpbnRvIGEgbG9jYWwgYmVjYXVzZSBvZiBhIGxpbmtpbmcgaXNzdWUuCi0gICAgICBpbnQgbWluaW11bSA9IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKLSAgICAgICAgICArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG1pbmltdW0pICsgIi4iKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgdXJidWZfID0gbmV3IHVpbnQ4X3RbdXJidWZfc2l6ZV07Ci0gICAgICBjcmJ1Zl8gPSBuZXcgdWludDhfdFtjcmJ1Zl9zaXplXTsKLSAgICAgIHV3YnVmXyA9IG5ldyB1aW50OF90W3V3YnVmX3NpemVdOwotICAgICAgY3didWZfID0gbmV3IHVpbnQ4X3RbY3didWZfc2l6ZV07Ci0KLSAgICAgIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgIGluaXRabGliKCk7Ci0KLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGRlbGV0ZVtdIHVyYnVmXzsKLSAgICAgIGRlbGV0ZVtdIGNyYnVmXzsKLSAgICAgIGRlbGV0ZVtdIHV3YnVmXzsKLSAgICAgIGRlbGV0ZVtdIGN3YnVmXzsKLSAgICAgIHRocm93OwotICAgIH0KLSAgfQotCi0gIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLSAgdm9pZCBpbml0WmxpYigpOwotCi0gIC8qKgotICAgKiBUWmxpYlRyYW5zcG9ydCBkZXN0cnVjdG9yLgotICAgKgotICAgKiBXYXJuaW5nOiBEZXN0cm95aW5nIGEgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IG1heSBkaXNjYXJkIGFueSB3cml0dGVuIGJ1dAotICAgKiB1bmZsdXNoZWQgZGF0YS4gIFlvdSBtdXN0IGV4cGxpY2l0bHkgY2FsbCBmbHVzaCgpIG9yIGZpbmlzaCgpIHRvIGVuc3VyZQotICAgKiB0aGF0IGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBhbmQgZmx1c2hlZCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAqLwotICB+VFpsaWJUcmFuc3BvcnQoKTsKLQotICBib29sIGlzT3BlbigpOwotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIGZsdXNoKCk7Ci0KLSAgLyoqCi0gICAqIEZpbmFsaXplIHRoZSB6bGliIHN0cmVhbS4KLSAgICoKLSAgICogVGhpcyBjYXVzZXMgemxpYiB0byBmbHVzaCBhbnkgcGVuZGluZyB3cml0ZSBkYXRhIGFuZCB3cml0ZSBlbmQtb2Ytc3RyZWFtCi0gICAqIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGNoZWNrc3VtLiAgT25jZSBmaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQsIG5vCi0gICAqIG5ldyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCi0gICAqLwotICB2b2lkIGZpbmlzaCgpOwotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOwotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHpsaWIgc3RyZWFtLgotICAgKgotICAgKiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLgotICAgKiBJdCB2ZXJpZmllcyB0aGUgY2hlY2tzdW0gdGhhdCB3YXMgd3JpdHRlbiBieSB0aGUgZmluaXNoKCkgY2FsbC4KLSAgICovCi0gIHZvaWQgdmVyaWZ5Q2hlY2tzdW0oKTsKLQotICAgLyoqCi0gICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCi0gICAgKi8KLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VSQlVGX1NJWkUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DUkJVRl9TSVpFID0gMTAyNDsKLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VXQlVGX1NJWkUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DV0JVRl9TSVpFID0gMTAyNDsKLQotIHByb3RlY3RlZDoKLQotICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOwotICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKLSAgaW5saW5lIGludCByZWFkQXZhaWwoKTsKLSAgdm9pZCBmbHVzaFRvVHJhbnNwb3J0KGludCBmbHVzaCk7Ci0gIHZvaWQgZmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBpbnQgZmx1c2gpOwotICBib29sIHJlYWRGcm9tWmxpYigpOwotCi0gcHJpdmF0ZToKLSAgLy8gRGVwcmVjYXRlZCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuCi0gIC8vCi0gIC8vIFRoaXMgdXNlZCB0byBiZSB0aGUgY29uc3RydWN0b3Igc2lnbmF0dXJlLiAgSWYgeW91IGFyZSBnZXR0aW5nIGEgY29tcGlsZQotICAvLyBlcnJvciBiZWNhdXNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yLCB5b3UgbmVlZCB0byB1cGRhdGUKLSAgLy8geW91ciBjb2RlIGFzIGZvbGxvd3M6Ci0gIC8vIC0gUmVtb3ZlIHRoZSB1c2VfZm9yX3JwYyBhcmd1bWVudCBpbiB0aGUgY29uc3RydWN0dXIuCi0gIC8vICAgVGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFJQQyBhbmQgc3RhbmRhbG9uZSB6bGliCi0gIC8vICAgdHJhbnNwb3J0cy4gIChQcmV2aW91c2x5LCBvbmx5IHN0YW5kYWxvbmUgd2FzIGFsbG93ZWQsIGFueXdheS4pCi0gIC8vIC0gUmVwbGFjZSBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSBjYWxscyB3aXRoIFRabGliVHJhbnNwb3J0OjpmaW5pc2goKQotICAvLyAgIGluIHlvdXIgY29kZS4gIFByZXZpb3VzbHksIGZsdXNoKCkgdXNlZCB0byBmaW5pc2ggdGhlIHpsaWIgc3RyZWFtLgotICAvLyAgIE5vdyBmbHVzaCgpIG9ubHkgZmx1c2hlcyBvdXQgcGVuZGluZyBkYXRhLCBzbyBtb3JlIHdyaXRlcyBjYW4gYmUKLSAgLy8gICBwZXJmb3JtZWQgYWZ0ZXIgYSBmbHVzaCgpLiAgVGhlIGZpbmlzaCgpIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmaW5hbGl6ZQotICAvLyAgIHRoZSB6bGliIHN0cmVhbS4KLSAgLy8KLSAgLy8gSWYgd2UgZG9uJ3QgZGVjbGFyZSB0aGlzIGNvbnN0cnVjdG9yLCBvbGQgY29kZSB3cml0dGVuIGFzCi0gIC8vIFRabGliVHJhbnNwb3J0KHRyYW5zLCBmYWxzZSkgc3RpbGwgY29tcGlsZXMgYnV0IGJlaGF2ZXMgaW5jb3JyZWN0bHkuCi0gIC8vIFRoZSBzZWNvbmQgYm9vbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBhbmQgdXNlZCBhcyB0aGUKLSAgLy8gdXJidWZfc2l6ZS4KLSAgVFpsaWJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29sIHVzZV9mb3JfcnBjLAotICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAuCi0gIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Ci0KLSAgaW50IHVycG9zXzsKLSAgaW50IHV3cG9zXzsKLQotICAvLy8gVHJ1ZSBpZmYgemxpYiBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0gIGJvb2wgaW5wdXRfZW5kZWRfOwotICAvLy8gVHJ1ZSBpZmYgd2UgaGF2ZSBmaW5pc2hlZCB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgYm9vbCBvdXRwdXRfZmluaXNoZWRfOwotCi0gIHVpbnQzMl90IHVyYnVmX3NpemVfOwotICB1aW50MzJfdCBjcmJ1Zl9zaXplXzsKLSAgdWludDMyX3QgdXdidWZfc2l6ZV87Ci0gIHVpbnQzMl90IGN3YnVmX3NpemVfOwotCi0gIHVpbnQ4X3QqIHVyYnVmXzsKLSAgdWludDhfdCogY3JidWZfOwotICB1aW50OF90KiB1d2J1Zl87Ci0gIHVpbnQ4X3QqIGN3YnVmXzsKLQotICBzdHJ1Y3Qgel9zdHJlYW1fcyogcnN0cmVhbV87Ci0gIHN0cnVjdCB6X3N0cmVhbV9zKiB3c3RyZWFtXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKaW5kZXggOGZlYzdmNS4uNmI1YzdjNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcApAQCAtMTksOSArMTksMTMgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFsbFByb3RvY29sVGVzdHMKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKICNpbmNsdWRlICJBbGxQcm90b2NvbFRlc3RzLnRjYyIKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwpAQCAtMzAsMTUgKzM0LDE0IEBACiAKIGNoYXIgZXJyb3JNZXNzYWdlW0VSUl9MRU5dOwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgKHZvaWQpIGFyZ2M7Ci0gICh2b2lkKSBhcmd2OwotICB0cnkgewotICAgIHRlc3RQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+KCJUQmluYXJ5UHJvdG9jb2wiKTsKLSAgICB0ZXN0UHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbD4oIlRDb21wYWN0UHJvdG9jb2wiKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgcHJpbnRmKCIlc1xuIiwgZS53aGF0KCkpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRCaW5hcnlQcm90b2NvbD4oIlRCaW5hcnlQcm90b2NvbCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpdHRsZV9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRMRUJpbmFyeVByb3RvY29sPigiVExFQmluYXJ5UHJvdG9jb2wiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb21wYWN0X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sPigiVENvbXBhY3RQcm90b2NvbCIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCmluZGV4IGE1YTMxMTUuLmE3ZWFiMDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYworKysgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKQEAgLTIyLDEzICsyMiwxMyBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKICNpbmNsdWRlICJHZW5lcmljSGVscGVycy5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKQEAgLTQ1LDcgKzQ1LDEwIEBACiAgIFZhbCBvdXQ7CiAgIEdlbmVyaWNJTzo6cmVhZChwcm90b2NvbCwgb3V0KTsKICAgaWYgKG91dCAhPSB2YWwpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIG5ha2VkIHRlc3QgKHR5cGU6ICVzKSIsIENsYXNzTmFtZXM6OmdldE5hbWU8VmFsPigpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBFUlJfTEVOLAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBuYWtlZCB0ZXN0ICh0eXBlOiAlcykiLAorICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVzOjpnZXROYW1lPFZhbD4oKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CkBAIC03MSwxMSArNzQsMTEgQEAKICAgcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAKICAgaWYgKGZpZWxkSWQgIT0gMTUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOworICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOwogICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKICAgfQogICBpZiAoZmllbGRUeXBlICE9IHR5cGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIEZpZWxkIFR5cGUgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgRmllbGQgVHlwZSAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CiAgIH0KIApAQCAtODMsNyArODYsNyBAQAogICBHZW5lcmljSU86OnJlYWQocHJvdG9jb2wsIG91dCk7CiAKICAgaWYgKG91dCAhPSB2YWwpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIHZhbHVlIHJlYWQgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgdmFsdWUgcmVhZCAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CiAgIH0KIApAQCAtOTcsMjAgKzEwMCwxOCBAQAogICAgIGNvbnN0IGNoYXIqIG5hbWU7CiAgICAgVE1lc3NhZ2VUeXBlIHR5cGU7CiAgICAgaW50MzJfdCBzZXFpZDsKLSAgfSBtZXNzYWdlc1s0XSA9IHsKLSAgICB7InNob3J0IG1lc3NhZ2UgbmFtZSIsIFRfQ0FMTCwgMH0sCi0gICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAotICAgIHsibG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyIsIFRfRVhDRVBUSU9OLCAxIDw8IDE2fSwKLSAgICB7Ikphbmt5IiwgVF9DQUxMLCAwfQotICB9OworICB9IG1lc3NhZ2VzW10gPSB7eyJzaG9ydCBtZXNzYWdlIG5hbWUiLCBUX0NBTEwsIDB9LAorICAgICAgICAgICAgICAgICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAorICAgICAgICAgICAgICAgICAgeyJsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIiwgVF9FWENFUFRJT04sIDEgPDwgMTZ9LAorICAgICAgICAgICAgICAgICAgeyJvbmUgd2F5IHB1c2giLCBUX09ORVdBWSwgMTJ9LAorICAgICAgICAgICAgICAgICAgeyJKYW5reSIsIFRfQ0FMTCwgMH19OworICBjb25zdCBpbnQgbWVzc2FnZXNfY291bnQgPSBzaXplb2YobWVzc2FnZXMpIC8gc2l6ZW9mKFRNZXNzYWdlKTsKIAotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzX2NvdW50OyBpKyspIHsKICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKIAotICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlc1tpXS5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS5zZXFpZCk7CisgICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2VzW2ldLm5hbWUsIG1lc3NhZ2VzW2ldLnR5cGUsIG1lc3NhZ2VzW2ldLnNlcWlkKTsKICAgICBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7CiAKICAgICBzdGQ6OnN0cmluZyBuYW1lOwpAQCAtMTE4LDkgKzExOSw3IEBACiAgICAgaW50MzJfdCBzZXFpZDsKIAogICAgIHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKLSAgICBpZiAobmFtZSAhPSBtZXNzYWdlc1tpXS5uYW1lIHx8Ci0gICAgICAgIHR5cGUgIT0gbWVzc2FnZXNbaV0udHlwZSB8fAotICAgICAgICBzZXFpZCAhPSBtZXNzYWdlc1tpXS5zZXFpZCkgeworICAgIGlmIChuYW1lICE9IG1lc3NhZ2VzW2ldLm5hbWUgfHwgdHlwZSAhPSBtZXNzYWdlc1tpXS50eXBlIHx8IHNlcWlkICE9IG1lc3NhZ2VzW2ldLnNlcWlkKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJyZWFkTWVzc2FnZUJlZ2luIGZhaWxlZC4iKTsKICAgICB9CiAgIH0KQEAgLTE0Myw4ICsxNDIsOCBAQAogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0xKTsKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSk7CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMCk7CiAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTEpOwpAQCAtMTY1LDggKzE2NCw4IEBACiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTEpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xNTAwMCk7CiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTB4ZmZmZik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKIAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigwKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMSk7CkBAIC0xODIsMjQgKzE4MSwyMyBAQAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMTUwMDApOwogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMHhmZmZmKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTB4ZmZmZmZmKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICsgMTApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpIC0gMTYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSk7Ci0KKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpICsgMTApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkgLSAxNik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSk7CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigwKTsKICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigxTCA8PCBpKTsKLSAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUwgPDwgaSkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oLSgxTEwgPDwgaSkpOwogICAgIH0KIAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigwKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYyOyBpKyspIHsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTCA8PCBpKTsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTEwgPDwgaSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTEwgPDwgaSkpOwogICAgIH0KIAogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGRvdWJsZT4oMTIzLjQ1Nik7CkBAIC0yMDgsNyArMjA2LDcgQEAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oInNob3J0Iik7CiAgICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJib3JkZXJsaW5ldGlueSIpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiYSBiaXQgbG9uZ2VyIHRoYW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJceDFceDJceDNceDRceDVceDZceDdceDhceDlceEEiKTsgLy9raW5kYSBiaW5hcnkgdGVzdAorICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiXHgxXHgyXHgzXHg0XHg1XHg2XHg3XHg4XHg5XHhBIik7IC8vIGtpbmRhIGJpbmFyeSB0ZXN0CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCIiKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOwpAQCAtMjE5LDcgKzIxNyw3IEBACiAKICAgICBwcmludGYoIiVzID0+IE9LXG4iLCBwcm90b25hbWUpOwogICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICIlcyA9PiBUZXN0IEZBSUxFRDogJXMiLCBwcm90b25hbWUsIGUud2hhdCgpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiJXMgPT4gVGVzdCBGQUlMRUQ6ICVzIiwgcHJvdG9uYW1lLCBlLndoYXQoKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE4ODQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFubm90YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgImdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCIKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIE5vcm1hbGx5IHRocmlmdCBnZW5lcmF0ZXMgb3N0cmVhbSBvcGVyYXRvcnMsIGhvd2V2ZXIKKy8vIHdpdGggdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiBvbmUgY2FuIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGV5IGFyZSBnb2luZyB0byBwcm92aWRlIHRoZWlyIG93biwgYW5kIG5vdAorLy8gZW1pdCBvcGVyYXRvciA8PCBvciBwcmludFRvKCkuCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBvc3RyX2N1c3RvbSYgb3NjKQoreworICBvcyA8PCAieyBiYXIgPSAiIDw8IG9zYy5iYXIgPDwgIjsgfSI7CisgIHJldHVybiBvczsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEJPT1NUX1RFU1RfTU9EVUxFKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jb21waWxlcl9nZW5lcmF0ZWRfb3N0cmVhbV9vcGVyYXRvcikKK3sKKyAgb3N0cl9kZWZhdWx0IGRlZjsKKyAgZGVmLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3NkOworICBzc2QgPDwgZGVmOworICBCT09TVF9DSEVDS19FUVVBTChzc2Quc3RyKCksICJvc3RyX2RlZmF1bHQoYmFyPTEwKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jdXN0b21vc3RyZWFtX3VzZXNfY29uc3VtaW5nX2FwcGxpY2F0aW9uX2RlZmluaXRpb24pCit7CisgIG9zdHJfY3VzdG9tIGN1czsKKyAgY3VzLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gY3NkOworICBjc2QgPDwgY3VzOworICBCT09TVF9DSEVDS19FUVVBTChjc2Quc3RyKCksICJ7IGJhciA9IDEwOyB9Iik7Cit9CisKKy8qKgorICogRGlzYWJsZWQ7IHNlZSBUSFJJRlQtMTU2NyAtIG5vdCBzdXJlIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX3R5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgImNwcC50eXBlIiBhbm5vdGF0aW9uIGNoYW5nZXMgInN0cnVjdCBmb28iIHRvICJEZW5zZUZvbyIKKyAgLy8gVGhpcyB3b24ndCBjb21waWxlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc2hhbmRsZWQKKyAgRGVuc2VGb28gZm9vOworICBmb28uX19zZXRfYmFyKDUpOworfQorICovCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODZlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OmJhc2U2NF9lbmNvZGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OmJhc2U2NF9kZWNvZGU7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShCYXNlNjRUZXN0KQorCit2b2lkIHNldHVwVGVzdERhdGEoaW50IGksIHVpbnQ4X3QqIGRhdGEsIGludCYgbGVuKSB7CisgIGxlbiA9IDA7CisgIGRvIHsKKyAgICBkYXRhW2xlbl0gPSAodWludDhfdCkoaSAmIDB4RkYpOworICAgIGkgPj49IDg7CisgICAgbGVuKys7CisgIH0gd2hpbGUgKChsZW4gPCAzKSAmJiAoaSAhPSAwKSk7CisKKyAgQk9PU1RfQVNTRVJUKGkgPT0gMCk7Cit9CisKK3ZvaWQgY2hlY2tFbmNvZGluZyh1aW50OF90KiBkYXRhLCBpbnQgbGVuKSB7CisjaWZkZWYgTkRFQlVHCisgICgodm9pZClkYXRhKTsKKyNlbmRpZgorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBCT09TVF9BU1NFUlQoaXNhbG51bShkYXRhW2ldKSB8fCBkYXRhW2ldID09ICcvJyB8fCBkYXRhW2ldID09ICcrJyk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9CYXNlNjRfRW5jb2RlX0RlY29kZSkgeworICBpbnQgbGVuOworICB1aW50OF90IHRlc3RJbnB1dFszXTsKKyAgdWludDhfdCB0ZXN0T3V0cHV0WzRdOworCisgIC8vIFRlc3QgYWxsIHBvc3NpYmxlIGVuY29kaW5nIC8gZGVjb2RpbmcgY2FzZXMgZ2l2ZW4gdGhlCisgIC8vIHRocmVlIGJ5dGUgbGltaXQgZm9yIGJhc2U2NF9lbmNvZGUuCisKKyAgZm9yIChpbnQgaSA9IDB4RkZGRkZGOyBpID49IDA7IGktLSkgeworCisgICAgLy8gZmlsbCB0ZXN0SW5wdXQgYmFzZWQgb24gaQorICAgIHNldHVwVGVzdERhdGEoaSwgdGVzdElucHV0LCBsZW4pOworCisgICAgLy8gZW5jb2RlIHRoZSB0ZXN0IGRhdGEsIHRoZW4gZGVjb2RlIGl0IGFnYWluCisgICAgYmFzZTY0X2VuY29kZSh0ZXN0SW5wdXQsIGxlbiwgdGVzdE91dHB1dCk7CisKKyAgICAvLyB2ZXJpZnkgZWFjaCBieXRlIGhhcyBhIHZhbGlkIEJhc2U2NCB2YWx1ZSAoYWxwaGFudW1lcmljIG9yIGVpdGhlciArIG9yIC8pCisgICAgY2hlY2tFbmNvZGluZyh0ZXN0T3V0cHV0LCBsZW4pOworCisgICAgLy8gZGVjb2RlIG91dHB1dCBhbmQgY2hlY2sgdGhhdCBpdCBtYXRjaGVzIGlucHV0CisgICAgYmFzZTY0X2RlY29kZSh0ZXN0T3V0cHV0LCBsZW4gKyAxKTsKKyAgICBCT09TVF9BU1NFUlQoMCA9PSBtZW1jbXAodGVzdElucHV0LCB0ZXN0T3V0cHV0LCBsZW4pKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKaW5kZXggZjRjZDM5Mi4uNWZmNzdhYSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAKQEAgLTE3LDg4ICsxNywyMjYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlICJ0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKLSNpbmNsdWRlICJwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKIAogY2xhc3MgVGltZXIgewogcHVibGljOgogICB0aW1ldmFsIHZTdGFydDsKIAotICBUaW1lcigpIHsKLSAgICBnZXR0aW1lb2ZkYXkoJnZTdGFydCwgMCk7Ci0gIH0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBnZXR0aW1lb2ZkYXkoJnZTdGFydCwgMCk7Ci0gIH0KKyAgVGltZXIoKSB7IFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZTdGFydCwgMCk7IH0KKyAgdm9pZCBzdGFydCgpIHsgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdlN0YXJ0LCAwKTsgfQogCiAgIGRvdWJsZSBmcmFtZSgpIHsKICAgICB0aW1ldmFsIHZFbmQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ2RW5kLCAwKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZ2RW5kLCAwKTsKICAgICBkb3VibGUgZHN0YXJ0ID0gdlN0YXJ0LnR2X3NlYyArICgoZG91YmxlKXZTdGFydC50dl91c2VjIC8gMTAwMDAwMC4wKTsKICAgICBkb3VibGUgZGVuZCA9IHZFbmQudHZfc2VjICsgKChkb3VibGUpdkVuZC50dl91c2VjIC8gMTAwMDAwMC4wKTsKICAgICByZXR1cm4gZGVuZCAtIGRzdGFydDsKICAgfQotCiB9OwogCiBpbnQgbWFpbigpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisgIHVzaW5nIHN0ZDo6Y291dDsKKyAgdXNpbmcgc3RkOjplbmRsOwogCiAgIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOworICBvb2UuaW1fdHJ1ZSA9IHRydWU7CisgIG9vZS5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UuYV9iaXRlID0gMHg3ZjsKICAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7CisgIG9vZS5pbnRlZ2VyMzIgPSAxIDw8IDI0OwogICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKICAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICJKU09OIFRISVMhIFwiXDEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICBvb2Uuem9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOwogICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOwogCi0gIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBpbnQgbnVtID0gMTAwMDAwOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CiAKLSAgaW50IG51bSA9IDEwMDAwMDA7CisgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICB1aW50MzJfdCBkYXRhc2l6ZSA9IDA7CiAKICAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBidWYtPnJlc2V0QnVmZmVyKCk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiBwcm90KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgICAgb29lLndyaXRlKCZwcm90KTsKICAgICB9Ci0gICAgY291dCA8PCAiV3JpdGU6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CiAgIH0KIAotICB1aW50OF90KiBkYXRhOwotICB1aW50MzJfdCBkYXRhc2l6ZTsKLQogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBPbmVPZkVhY2ggb29lMjsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwotICAgICAgLy9idWYyLT5yZXNldEJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiBwcm90KGJ1ZjIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICAgIG9vZTIucmVhZCgmcHJvdCk7Ci0KLSAgICAgIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lMikgPDwgZW5kbCA8PCBlbmRsOwogICAgIH0KLSAgICBjb3V0IDw8ICIgUmVhZDogIiA8PCBudW0gLyAoMTAwMCAqIHRpbWVyLmZyYW1lKCkpIDw8ICIga0h6IiA8PCBlbmRsOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lLndyaXRlKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiV3JpdGUgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIE9uZU9mRWFjaCBvb2UyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYyKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZTIucmVhZCgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2Uud3JpdGUoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CisgICAgT25lT2ZFYWNoIG9vZTI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2UyLnJlYWQoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworCisgIGRhdGEgPSBOVUxMOworICBkYXRhc2l6ZSA9IDA7CisgIG51bSA9IDEwMDAwMDAwOworCisgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmOworICBsaXN0RG91YmxlUGVyZi5maWVsZC5yZXNlcnZlKG51bSk7CisgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtOyArK3gpCisgICAgbGlzdERvdWJsZVBlcmYuZmllbGQucHVzaF9iYWNrKGRvdWJsZSh4KSk7CisKKyAgYnVmLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKG51bSAqIDEwMCkpOworCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZi53cml0ZSgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiRG91YmxlIHdyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIGJ1Zi0+Z2V0QnVmZmVyKCZkYXRhLCAmZGF0YXNpemUpOworCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYud3JpdGUoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIkRvdWJsZSB3cml0ZSBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyLCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gcHJvdChidWYyKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmLndyaXRlKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJEb3VibGUgd3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOwogICB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDQ3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworaWYgKFdJVEhfRFlOX0xJTktfVEVTVCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1EQk9PU1RfVEVTVF9EWU5fTElOSyApCitlbmRpZigpCisKKyMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKK3NldCh0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgKKyAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAorICAgIFRocmlmdFRlc3RfZXh0cmFzLmNwcAorICAgIERlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKykKKworYWRkX2xpYnJhcnkodGVzdGdlbmNwcCBTVEFUSUMgJHt0ZXN0Z2VuY3BwX1NPVVJDRVN9KQorCitzZXQodGVzdGdlbmNwcF9jb2JfU09VUkNFUworICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmgKKyAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oCisgICAgZ2VuLWNwcC9wcm9jX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvcHJvY190eXBlcy5oCispCithZGRfbGlicmFyeSh0ZXN0Z2VuY3BwX2NvYiBTVEFUSUMgJHt0ZXN0Z2VuY3BwX2NvYl9TT1VSQ0VTfSkKKworYWRkX2V4ZWN1dGFibGUoQmVuY2htYXJrIEJlbmNobWFyay5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQmVuY2htYXJrIHRlc3RnZW5jcHApCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQmVuY2htYXJrIHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQmVuY2htYXJrIENPTU1BTkQgQmVuY2htYXJrKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQorCitzZXQoVW5pdFRlc3RfU09VUkNFUworICAgIFVuaXRUZXN0TWFpbi5jcHAKKyAgICBPbmVXYXlIVFRQVGVzdC5jcHAKKyAgICBUTWVtb3J5QnVmZmVyVGVzdC5jcHAKKyAgICBUQnVmZmVyQmFzZVRlc3QuY3BwCisgICAgQmFzZTY0VGVzdC5jcHAKKyAgICBUb1N0cmluZ1Rlc3QuY3BwCisgICAgVHlwZWRlZlRlc3QuY3BwCisgICAgVFNlcnZlclNvY2tldFRlc3QuY3BwCisgICAgVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCispCisKK2lmKE5PVCBXSVRIX1NURFRIUkVBRFMgQU5EIE5PVCBNU1ZDIEFORCBOT1QgTUlOR1cpCisgICAgbGlzdChBUFBFTkQgVW5pdFRlc3RfU09VUkNFUyBjb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwKQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShVbml0VGVzdHMgJHtVbml0VGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhVbml0VGVzdHMgdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVW5pdFRlc3RzIHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVW5pdFRlc3RzIENPTU1BTkQgVW5pdFRlc3RzKQoraWYgKCBNU1ZDICkKKyAgICAjIERpc2FibGUgQzQ1MDM6IGRlY29yYXRlZCBuYW1lIGxlbmd0aCBleGNlZWRlZCwgbmFtZSB3YXMgdHJ1bmNhdGVkCisgICAgIyAnaW5zYW5pdHknIHJlc3VsdHMgaW4gdmVyeSBsb25nIGRlY29yYXRlZCBuYW1lcworICAgIHNldF9wcm9wZXJ0eSggVEFSR0VUIFVuaXRUZXN0cyBBUFBFTkRfU1RSSU5HIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgL3dkNDUwMyApCitlbmRpZiAoIE1TVkMgKQorCisKK3NldCggVEludGVycnVwdFRlc3RfU09VUkNFUworICAgICBUU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKyAgICAgVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCispCitpZiAoV0lOMzIpCisgICAgbGlzdChBUFBFTkQgVEludGVycnVwdFRlc3RfU09VUkNFUworICAgICAgICBUUGlwZUludGVycnVwdFRlc3QuY3BwCisgICAgKQorZW5kaWYoKQorYWRkX2V4ZWN1dGFibGUoVEludGVycnVwdFRlc3QgJHtUSW50ZXJydXB0VGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUSW50ZXJydXB0VGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUSW50ZXJydXB0VGVzdCB0aHJpZnQpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEludGVycnVwdFRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFRJbnRlcnJ1cHRUZXN0IENPTU1BTkQgVEludGVycnVwdFRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorCithZGRfZXhlY3V0YWJsZShUU2VydmVySW50ZWdyYXRpb25UZXN0IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgdGhyaWZ0KQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgQ09NTUFORCBUU2VydmVySW50ZWdyYXRpb25UZXN0KQorCitpZihXSVRIX1pMSUIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtaTElCX0lOQ0xVREVfRElSU30iKQorYWRkX2V4ZWN1dGFibGUoVHJhbnNwb3J0VGVzdCBUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUcmFuc3BvcnRUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICR7WkxJQl9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHJhbnNwb3J0VGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHJhbnNwb3J0VGVzdCB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBUcmFuc3BvcnRUZXN0IENPTU1BTkQgVHJhbnNwb3J0VGVzdCkKKworYWRkX2V4ZWN1dGFibGUoWmxpYlRlc3QgWmxpYlRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFpsaWJUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICR7WkxJQl9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoWmxpYlRlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFpsaWJUZXN0IHRocmlmdHopCithZGRfdGVzdChOQU1FIFpsaWJUZXN0IENPTU1BTkQgWmxpYlRlc3QpCitlbmRpZihXSVRIX1pMSUIpCisKK2FkZF9leGVjdXRhYmxlKEFubm90YXRpb25UZXN0IEFubm90YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhBbm5vdGF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbm5vdGF0aW9uVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFubm90YXRpb25UZXN0IENPTU1BTkQgQW5ub3RhdGlvblRlc3QpCisKK2FkZF9leGVjdXRhYmxlKEVudW1UZXN0IEVudW1UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhFbnVtVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShFbnVtVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEVudW1UZXN0IENPTU1BTkQgRW51bVRlc3QpCisKK2lmKEhBVkVfR0VUT1BUX0gpCithZGRfZXhlY3V0YWJsZShURmlsZVRyYW5zcG9ydFRlc3QgVEZpbGVUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhURmlsZVRyYW5zcG9ydFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEZpbGVUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVEZpbGVUcmFuc3BvcnRUZXN0IENPTU1BTkQgVEZpbGVUcmFuc3BvcnRUZXN0KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShURkRUcmFuc3BvcnRUZXN0IFRGRFRyYW5zcG9ydFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRGRFRyYW5zcG9ydFRlc3QKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShURkRUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVEZEVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRGRFRyYW5zcG9ydFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFRQaXBlZFRyYW5zcG9ydFRlc3QgVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFBpcGVkVHJhbnNwb3J0VGVzdAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRQaXBlZFRyYW5zcG9ydFRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBUUGlwZWRUcmFuc3BvcnRUZXN0IENPTU1BTkQgVFBpcGVkVHJhbnNwb3J0VGVzdCkKKworc2V0KEFsbFByb3RvY29sc1Rlc3RfU09VUkNFUworICAgIEFsbFByb3RvY29sVGVzdHMuY3BwCisgICAgQWxsUHJvdG9jb2xUZXN0cy50Y2MKKyAgICBHZW5lcmljSGVscGVycworICAgICkKKworYWRkX2V4ZWN1dGFibGUoQWxsUHJvdG9jb2xzVGVzdCAke0FsbFByb3RvY29sc1Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoQWxsUHJvdG9jb2xzVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbGxQcm90b2NvbHNUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQWxsUHJvdG9jb2xzVGVzdCBDT01NQU5EIEFsbFByb3RvY29sc1Rlc3QpCisKKyMgVGhlIGRlYnVnIHJ1bi10aW1lIGluIFdpbmRvd3MgYXNzZXJ0cyBvbiBpc3ByaW50KCkgd2l0aCBuZWdhdGl2ZSBpbnB1dHMKK2lmIChOT1QgTVNWQyBPUiAoTVNWQyBBTkQgQ01BS0VfQlVJTERfVFlQRSBFUVVBTCAiREVCVUciKSkKK2FkZF9leGVjdXRhYmxlKERlYnVnUHJvdG9UZXN0IERlYnVnUHJvdG9UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhEZWJ1Z1Byb3RvVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShEZWJ1Z1Byb3RvVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIERlYnVnUHJvdG9UZXN0IENPTU1BTkQgRGVidWdQcm90b1Rlc3QpCitlbmRpZigpCisKK2FkZF9leGVjdXRhYmxlKEpTT05Qcm90b1Rlc3QgSlNPTlByb3RvVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoSlNPTlByb3RvVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShKU09OUHJvdG9UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgSlNPTlByb3RvVGVzdCBDT01NQU5EIEpTT05Qcm90b1Rlc3QpCisKK2FkZF9leGVjdXRhYmxlKE9wdGlvbmFsUmVxdWlyZWRUZXN0IE9wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhPcHRpb25hbFJlcXVpcmVkVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShPcHRpb25hbFJlcXVpcmVkVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIE9wdGlvbmFsUmVxdWlyZWRUZXN0IENPTU1BTkQgT3B0aW9uYWxSZXF1aXJlZFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFJlY3Vyc2l2ZVRlc3QgUmVjdXJzaXZlVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoUmVjdXJzaXZlVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShSZWN1cnNpdmVUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgUmVjdXJzaXZlVGVzdCBDT01NQU5EIFJlY3Vyc2l2ZVRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFNwZWNpYWxpemF0aW9uVGVzdCBTcGVjaWFsaXphdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFNwZWNpYWxpemF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTcGVjaWFsaXphdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBTcGVjaWFsaXphdGlvblRlc3QgQ09NTUFORCBTcGVjaWFsaXphdGlvblRlc3QpCisKK3NldChjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVMKKyAgICBjb25jdXJyZW5jeS9UZXN0cy5jcHAKKyAgICBjb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAorICAgIGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCisgICAgY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaAorKQorYWRkX2V4ZWN1dGFibGUoY29uY3VycmVuY3lfdGVzdCAke2NvbmN1cnJlbmN5X3Rlc3RfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY29uY3VycmVuY3lfdGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIGNvbmN1cnJlbmN5X3Rlc3QgQ09NTUFORCBjb25jdXJyZW5jeV90ZXN0KQorCitzZXQobGlua190ZXN0X1NPVVJDRVMKKyAgICBsaW5rL0xpbmtUZXN0LmNwcAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oCisgICAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAKKyAgICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcAorKQorCithZGRfZXhlY3V0YWJsZShsaW5rX3Rlc3QgJHtsaW5rX3Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHBfY29iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGxpbmtfdGVzdCB0aHJpZnQpCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHApCithZGRfdGVzdChOQU1FIGxpbmtfdGVzdCBDT01NQU5EIGxpbmtfdGVzdCkKKworaWYoV0lUSF9MSUJFVkVOVCkKK3NldChwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTCisgICAgcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCisgICAgcHJvY2Vzc29yL0V2ZW50TG9nLmNwcAorICAgIHByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCisgICAgcHJvY2Vzc29yL0V2ZW50TG9nLmgKKyAgICBwcm9jZXNzb3IvSGFuZGxlcnMuaAorICAgIHByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaAorKQorYWRkX2V4ZWN1dGFibGUocHJvY2Vzc29yX3Rlc3QgJHtwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhwcm9jZXNzb3JfdGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkocHJvY2Vzc29yX3Rlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHByb2Nlc3Nvcl90ZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBwcm9jZXNzb3JfdGVzdCBDT01NQU5EIHByb2Nlc3Nvcl90ZXN0KQorCitzZXQoVE5vbmJsb2NraW5nU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwKQorYWRkX2V4ZWN1dGFibGUoVE5vbmJsb2NraW5nU2VydmVyVGVzdCAke1ROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFU30pCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKKworaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICBzZXQoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwKQorICBhZGRfZXhlY3V0YWJsZShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0ICR7VE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgKQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnQpCisgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IHRocmlmdG5iKQorICBhZGRfdGVzdChOQU1FIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgQ09NTUFORCBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2VuZGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2VuZGlmKFdJVEhfTElCRVZFTlQpCisKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2FkZF9leGVjdXRhYmxlKE9wZW5TU0xNYW51YWxJbml0VGVzdCBPcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKE9wZW5TU0xNYW51YWxJbml0VGVzdAorICAgICR7T1BFTlNTTF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoT3BlblNTTE1hbnVhbEluaXRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgT3BlblNTTE1hbnVhbEluaXRUZXN0IENPTU1BTkQgT3BlblNTTE1hbnVhbEluaXRUZXN0KQorCithZGRfZXhlY3V0YWJsZShTZWN1cml0eVRlc3QgU2VjdXJpdHlUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU2VjdXJpdHlUZXN0IHRocmlmdCkKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFNlY3VyaXR5VGVzdCBDT01NQU5EIFNlY3VyaXR5VGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCisKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDQgUkVRVUlSRUQgQ09NUE9ORU5UUyBRdFRlc3QpCitzZXQoVFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVMKKyAgICBxdC9UUVRjcFNlcnZlclRlc3QuY3BwCispCithZGRfZXhlY3V0YWJsZShUUVRjcFNlcnZlclRlc3QgJHtUUVRjcFNlcnZlclRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0IHRlc3RnZW5jcHBfY29iIHRocmlmdHF0IFF0NDo6UXRUZXN0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRRVGNwU2VydmVyVGVzdCBDT01NQU5EIFRRVGNwU2VydmVyVGVzdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDUpCithZGRfc3ViZGlyZWN0b3J5KHF0KQorZW5kaWYoKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvZm9vX3NlcnZpY2UuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvZm9vX3NlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0VudW1UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuY3BwIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vT25lV2F5VGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcHJvY2Vzc29yL3Byb2MudGhyaWZ0CispCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAppbmRleCA0ZjQ1NmYzLi4wNjBmMzU0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKQEAgLTE3LDg5ICsxNywyOTQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCi0jaW5jbHVkZSA8cHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIERlYnVnUHJvdG9UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKIAotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7CitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Cit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkRlYnVnIFRISVMhIjsKKyAgb29lLT56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVidWdfcHJvdG9fMSkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKIAotICBOZXN0aW5nIG47Ci0gIG4ubXlfb29lID0gb29lOwotICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKLSAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7Ci0gIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbmVPZkVhY2gge1xuIgorICAgICIgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHg3ZixcbiIKKyAgICAiICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDE2Nzc3MjE2LFxuIgorICAgICIgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2MDAwMDAwMDAwLFxuIgorICAgICIgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIkRlYnVnIFRISVMhXCIsXG4iCisgICAgIiAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDdcXG5cXGFcXHRcIixcbiIKKyAgICAiICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgWzBdID0gMSxcbiIKKyAgICAiICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICBbMl0gPSAzLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICBbMF0gPSAxLFxuIgorICAgICIgICAgWzFdID0gMixcbiIKKyAgICAiICAgIFsyXSA9IDMsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpvb2UpKTsKIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhuKSA8PCBlbmRsIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKIAotICBIb2x5TW9sZXkgaG07Cit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CiAKLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOworICBuLnJlc2V0KG5ldyBOZXN0aW5nKTsKKyAgbi0+bXlfb29lID0gKm9vZTsKKyAgbi0+bXlfb29lLmludGVnZXIxNiA9IDE2OworICBuLT5teV9vb2UuaW50ZWdlcjMyID0gMzI7CisgIG4tPm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKKyAgbi0+bXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4tPm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4tPm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi0+bXlfYm9uay50eXBlID0gMzEzMzc7CisgIG4tPm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiTmVzdGluZyB7XG4iCisgICAgIiAgMDE6IG15X2JvbmsgKHN0cnVjdCkgPSBCb25rIHtcbiIKKyAgICAiICAgIDAxOiB0eXBlIChpMzIpID0gMzEzMzcsXG4iCisgICAgIiAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiSSBhbSBhIGJvbmsuLi4geG9yIVwiLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IG15X29vZSAoc3RydWN0KSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDdmLFxuIgorICAgICIgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDE2LFxuIgorICAgICIgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDY0LFxuIgorICAgICIgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAxLjYxODAzMzk4ODc0OTg5NDksXG4iCisgICAgIiAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDNcXHg4MFxceGUyXFx4ODVcXHhhZVxceGNlXFx4OWQgXFx4ZCIKKyAgICAgICIwXFx4OWRcXHhjZVxceGJmXFx4ZTJcXHg4NVxceGJmXFx4ZDBcXHhiZVxceGM5XFx4YTFcXHhkMFxceGIzXFx4ZDBcXHhiMCIKKyAgICAgICJcXHhjZlxceDgxXFx4ZTJcXHg4NFxceDhlIFxceGNlXFx4OTF0dFxceGNlXFx4YjFcXHhlMlxceDg1XFx4YmRcXHhjZVxceGIiCisgICAgICAiYVxceGM3XFx4ODNcXHhlMlxceDgwXFx4YmNcIixcbiIKKyAgICAiICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpuKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgaG0ucmVzZXQobmV3IEhvbHlNb2xleSk7CisKKyAgaG0tPmJpZy5wdXNoX2JhY2soKm9vZSk7CisgIGhtLT5iaWcucHVzaF9iYWNrKG4tPm15X29vZSk7CisgIGhtLT5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0tPmJpZ1sxXS5hX2JpdGUgPSAweDMzOwogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAgIHN0YWdlMS5jbGVhcigpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogCiAgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKLSAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBobS0+Ym9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDI7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXaGF0PyI7Ci0gIGhtLmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgaG0tPmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKICAgc3RhZ2UyLmNsZWFyKCk7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKLSAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInBvZSJdID0gc3RhZ2UyOworfQogCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlYnVnX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CiAKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJIb2x5TW9sZXkge1xuIgorICAgICIgIDAxOiBiaWcgKGxpc3QpID0gbGlzdDxzdHJ1Y3Q+WzJdIHtcbiIKKyAgICAiICAgIFswXSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgICAgIDAyOiBpbV9mYWxzZSAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDIyLFxuIgorICAgICIgICAgICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgICAgIDA1OiBpbnRlZ2VyMzIgKGkzMikgPSAxNjc3NzIxNixcbiIKKyAgICAiICAgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDYwMDAwMDAwMDAsXG4iCisgICAgIiAgICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgICAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCJEZWJ1ZyBUSElTIVwiLFxuIgorICAgICIgICAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkN1xcblxcYVxcdFwiLFxuIgorICAgICIgICAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgWzFdID0gT25lT2ZFYWNoIHtcbiIKKyAgICAiICAgICAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAwMzogYV9iaXRlIChieXRlKSA9IDB4MzMsXG4iCisgICAgIiAgICAgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAxNixcbiIKKyAgICAiICAgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjQsXG4iCisgICAgIiAgICAgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMS42MTgwMzM5ODg3NDk4OTQ5LFxuIgorICAgICIgICAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkM1xceDgwXFx4ZTJcXHg4NVxceGFlXFx4Y2VcXHg5ZCBcXCIKKyAgICAgICJ4ZDBcXHg5ZFxceGNlXFx4YmZcXHhlMlxceDg1XFx4YmZcXHhkMFxceGJlXFx4YzlcXHhhMVxceGQwXFx4YjNcXHhkMFxceGIiCisgICAgICAiMFxceGNmXFx4ODFcXHhlMlxceDg0XFx4OGUgXFx4Y2VcXHg5MXR0XFx4Y2VcXHhiMVxceGUyXFx4ODVcXHhiZFxceGNlXFx4IgorICAgICAgImJhXFx4YzdcXHg4M1xceGUyXFx4ODBcXHhiY1wiLFxuIgorICAgICIgICAgICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IGNvbnRhaW4gKHNldCkgPSBzZXQ8bGlzdD5bM10ge1xuIgorICAgICIgICAgbGlzdDxzdHJpbmc+WzBdIHtcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBsaXN0PHN0cmluZz5bMl0ge1xuIgorICAgICIgICAgICBbMF0gPSBcImFuZCBhIG9uZVwiLFxuIgorICAgICIgICAgICBbMV0gPSBcImFuZCBhIHR3b1wiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIGxpc3Q8c3RyaW5nPlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IFwidGhlbiBhIG9uZSwgdHdvXCIsXG4iCisgICAgIiAgICAgIFsxXSA9IFwidGhyZWUhXCIsXG4iCisgICAgIiAgICAgIFsyXSA9IFwiRk9VUiEhXCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDM6IGJvbmtzIChtYXApID0gbWFwPHN0cmluZyxsaXN0PlszXSB7XG4iCisgICAgIiAgICBcIm5vdGhpbmdcIiAtPiBsaXN0PHN0cnVjdD5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFwicG9lXCIgLT4gbGlzdDxzdHJ1Y3Q+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAzLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJxdW90aFwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMV0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDQsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcInRoZSByYXZlblwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMl0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDUsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIm5ldmVybW9yZVwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFwic29tZXRoaW5nXCIgLT4gbGlzdDxzdHJ1Y3Q+WzJdIHtcbiIKKyAgICAiICAgICAgWzBdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAxLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJXYWl0LlwiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICBbMV0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDIsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIldoYXQ/XCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZygqaG0pKTsKIAotICByZXR1cm4gMDsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCmluZGV4IGM4OWRiNzQuLjVjNGZkMzUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCkBAIC0yMSwxMyArMjEsMTUgQEAKIAogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeyBuYW1lc3BhY2UgZGVidWcgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgZGVidWcgewogCiBib29sIEVtcHR5OjpvcGVyYXRvcjwoRW1wdHkgY29uc3QmIG90aGVyKSBjb25zdCB7Ci0gICh2b2lkKSBvdGhlcjsKKyAgKHZvaWQpb3RoZXI7CiAgIC8vIEl0IGlzIGVtcHR5LCBzbyBhbGwgYXJlIGVxdWFsLgogICByZXR1cm4gZmFsc2U7CiB9Ci0KLX19fQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Zjc4NjUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNwcDpkZW5zZSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLS4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3BwOmRlbnNlIE9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAotZysrIC1XYWxsIC1nIC1JLi4vbGliL2NwcC9zcmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvYm9vc3QtMV8zM18xIFwKLSAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0gIERlbnNlUHJvdG9UZXN0LmNwcCAuLi9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hIC1vIERlbnNlUHJvdG9UZXN0Ci0uL0RlbnNlUHJvdG9UZXN0Ci0qLwotCi0vLyBJIGRvIHRoaXMgdG8gcmVhY2ggaW50byB0aGUgZ3V0cyBvZiBURGVuc2VQcm90b2NvbC4gIFNvcnJ5LgotI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2RlZmluZSBpbmxpbmUKLQotI3VuZGVmIE5ERUJVRwotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKLSNpbmNsdWRlIDxwcm90b2NvbC9URGVuc2VQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotCi0KLS8vIENhbid0IHVzZSBtZW1jbXAgaGVyZS4gIEdDQyBpcyB0b28gc21hcnQuCi1ib29sIG15X21lbWVxKGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIsIGludCBsZW4pIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmIChzdHIxW2ldICE9IHN0cjJbaV0pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6c3RyaW5nOwotICB1c2luZyBzdGQ6OmNvdXQ7Ci0gIHVzaW5nIHN0ZDo6ZW5kbDsKLSAgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0gIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQotCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweGQ2OwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG9vZSkgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgTmVzdGluZyBuOwotICBuLm15X29vZSA9IG9vZTsKLSAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7Ci0gIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwotICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNSkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwotCi0gIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobikgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgSG9seU1vbGV5IGhtOwotCi0gIGhtLmJpZy5wdXNoX2JhY2sob29lKTsKLSAgaG0uYmlnLnB1c2hfYmFjayhuLm15X29vZSk7Ci0gIGhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotICBobS5iaWdbMV0uYV9iaXRlID0gMHgzMzsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOwotICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0gIHN0YWdlMS5jbGVhcigpOwotICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLQotICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7Ci0gIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAyOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2hhdD8iOwotICBobS5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7Ci0gIHN0YWdlMi5jbGVhcigpOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7Ci0gIGhtLmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGhtKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VERlbnNlUHJvdG9jb2w+IHByb3RvKG5ldyBURGVuc2VQcm90b2NvbChidWZmZXIpKTsKLSAgcHJvdG8tPnNldFR5cGVTcGVjKEhvbHlNb2xleTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0KLSAgaG0ud3JpdGUocHJvdG8uZ2V0KCkpOwotICBIb2x5TW9sZXkgaG0yOwotICBobTIucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KGhtID09IGhtMik7Ci0KLQotICAvLyBMZXQncyB0ZXN0IG91dCB0aGUgdmFyaWFibGUtbGVuZ3RoIGludHMsIHNoYWxsIHdlPwotICB1aW50NjRfdCB2bHE7Ci0gICNkZWZpbmUgY2hlY2tvdXQoaSwgYykgeyBcCi0gICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOyBcCi0gICAgcHJvdG8tPnZscVdyaXRlKGkpOyBcCi0gICAgcHJvdG8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyBcCi0gICAgYXNzZXJ0KG15X21lbWVxKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKS5kYXRhKCksIGMsIHNpemVvZihjKS0xKSk7IFwKLSAgICBwcm90by0+dmxxUmVhZCh2bHEpOyBcCi0gICAgYXNzZXJ0KHZscSA9PSBpKTsgXAotICB9Ci0KLSAgY2hlY2tvdXQoMHgwMDAwMDAwMCwgIlx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA0MCwgIlx4NDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA3RiwgIlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDA4MCwgIlx4ODFceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDIwMDAsICJceEMwXHgwMCIpOwotICBjaGVja291dCgweDAwMDAzRkZGLCAiXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwNDAwMCwgIlx4ODFceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMTAwMDAwLCAiXHhDMFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAxRkZGRkYsICJceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDIwMDAwMCwgIlx4ODFceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwODAwMDAwMCwgIlx4QzBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwRkZGRkZGRiwgIlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgxMDAwMDAwMCwgIlx4ODFceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MjAwMDAwMDAsICJceDgyXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGLCAiXHg4MVx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRiwgIlx4OEZceEZGXHhGRlx4RkZceDdGIik7Ci0KLSAgY2hlY2tvdXQoMHgwMDAwMDAwMTAwMDAwMDAwdWxsLCAiXHg5MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMjAwMDAwMDAwdWxsLCAiXHhBMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMzAwMDAwMDAwdWxsLCAiXHhCMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwNzAwMDAwMDAwdWxsLCAiXHhGMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0YwMDAwMDAwdWxsLCAiXHhGRlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0ZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwODAwMDAwMDAwdWxsLCAiXHg4MVx4ODBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4OUZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg4MVx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIC8vIFRlc3Qgb3V0IHRoZSBzbG93IHBhdGggd2l0aCBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KLSAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZfdHJhbnMobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChidWZmZXIsIDMpKTsKLSAgcHJvdG8ucmVzZXQobmV3IFREZW5zZVByb3RvY29sKGJ1ZmZfdHJhbnMpKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMTAwMDAwMDAwdWxsLCAiXHg5MFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMjAwMDAwMDAwdWxsLCAiXHhBMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwMzAwMDAwMDAwdWxsLCAiXHhCMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwNzAwMDAwMDAwdWxsLCAiXHhGMFx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0YwMDAwMDAwdWxsLCAiXHhGRlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwN0ZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHgwMDAwMDAwODAwMDAwMDAwdWxsLCAiXHg4MVx4ODBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MUZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4OUZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotICBjaGVja291dCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwsICJceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHhGRkZGRkZGRkZGRkZGRkZGdWxsLCAiXHg4MVx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIC8vIFRlc3Qgb3B0aW9uYWwgc3R1ZmYuCi0gIHByb3RvLnJlc2V0KG5ldyBURGVuc2VQcm90b2NvbChidWZmZXIpKTsKLSAgcHJvdG8tPnNldFR5cGVTcGVjKE1hbnlPcHQ6OmxvY2FsX3JlZmxlY3Rpb24pOwotICBNYW55T3B0IG1vMSwgbW8yLCBtbzMsIG1vNCwgbW81LCBtbzY7Ci0gIG1vMS5vcHQxID0gOTIzNzU5MzQ3OwotICBtbzEub3B0MiA9IDM5Mjc0OTI3NDsKLSAgbW8xLm9wdDMgPSAzOTU3Mzk0MDI7Ci0gIG1vMS5kZWY0ID0gMjk0NzMwOTI4OwotICBtbzEub3B0NSA9IDM5NDMwOTIxODsKLSAgbW8xLm9wdDYgPSA4MzIxOTQ3MjM7Ci0gIG1vMS5fX2lzc2V0Lm9wdDEgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQyID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0LmRlZjQgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NiA9IHRydWU7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW8yLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzIuX19pc3NldC5vcHQxID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0MiA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQub3B0NSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDYgPT0gdHJ1ZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzIpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IGZhbHNlOwotICBtbzEuX19pc3NldC5vcHQ1ID0gZmFsc2U7Ci0KLSAgbW8xLndyaXRlKHByb3RvLmdldCgpKTsKLSAgbW8zLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChtbzMuX19pc3NldC5vcHQxID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDIgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQzID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQ1ID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vMy5fX2lzc2V0Lm9wdDYgPT0gdHJ1ZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzMpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQzID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDIgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NiA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNC5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDIgPT0gZmFsc2UpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0MyA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQ1ID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzQpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDEgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNS5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW81Ll9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0NSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQ2ID09IGZhbHNlKTsKLQotICBhc3NlcnQobW8xID09IG1vNSk7Ci0KLSAgbW8xLl9faXNzZXQub3B0MyA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vNi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW82Ll9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDMgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDUgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzYpOwotCi0KLSAgLy8gVGVzdCBmaW5nZXJwcmludCBjaGVja2luZyBzdHVmZi4KLQotICB7Ci0gICAgLy8gRGVmYXVsdCBhbmQgcmVxdWlyZWQgaGF2ZSB0aGUgc2FtZSBmaW5nZXJwcmludC4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTMgdDM7Ci0gICAgYXNzZXJ0KHN0cmluZyhUcmlja3kxOjphc2NpaV9maW5nZXJwcmludCkgPT0gVHJpY2t5Mzo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5Mzo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDMucmVhZChwcm90by5nZXQoKSk7Ci0gICAgYXNzZXJ0KHQzLmltX3JlcXVpcmVkID09IDIyNyk7Ci0gIH0KLQotICB7Ci0gICAgLy8gT3B0aW9uYWwgY2hhbmdlcyB0aGluZ3MuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpICE9IFRyaWNreTI6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kyOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICAgIHQyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIC8vIEhvbHkgY293LiAgV2UgY2FuIHVzZSB0aGUgVHJpY2t5MSB0eXBlc3BlYyB3aXRoIHRoZSBUcmlja3kyIHN0cnVjdHVyZS4KLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHQyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IHRydWUpOwotICAgIGFzc2VydCh0Mi5pbV9vcHRpb25hbCA9PSAyMjcpOwotICB9Ci0KLSAgewotICAgIC8vIEFuZCB0b3RhbGx5IG9mZiB0aGUgd2FsbC4KLSAgICBUcmlja3kxIHQxOwotICAgIE9uZU9mRWFjaCBvb2UyOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpICE9IE9uZU9mRWFjaDo6YXNjaWlfZmluZ2VycHJpbnQpOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICB0cnkgewotICAgICAgcHJvdG8tPnNldFR5cGVTcGVjKE9uZU9mRWFjaDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7Ci0gICAgICBidWZmZXItPnJlc2V0QnVmZmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gT2theSwgdGhpcyBpcyByZWFsbHkgb2ZmIHRoZSB3YWxsLgotICAvLyBKdXN0IGRvbid0IGNyYXNoLgotICBjb3V0IDw8ICJTdGFydGluZyBmdXp6IHRlc3QuICBUaGlzIHRha2VzIGEgd2hpbGUuICAoMjAgZG90cy4pIiA8PCBlbmRsOwotICBzdGQ6OnNyYW5kKDEyMzQ1KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKLSAgICBpZiAoaSAlIDEwMCA9PSAwKSB7Ci0gICAgICBjb3V0IDw8ICIuIjsKLSAgICAgIGNvdXQuZmx1c2goKTsKLSAgICB9Ci0gICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmluZ2VycHJpbnQgcHJlZml4IGlzIHJpZ2h0LgotICAgIGJ1ZmZlci0+d3JpdGUoTmVzdGluZzo6YmluYXJ5X2ZpbmdlcnByaW50LCA0KTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMjQqMTAyNDsgaisrKSB7Ci0gICAgICB1aW50OF90IHIgPSBzdGQ6OnJhbmQoKTsKLSAgICAgIGJ1ZmZlci0+d3JpdGUoJnIsIDEpOwotICAgIH0KLSAgICBOZXN0aW5nIG47Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKE9uZU9mRWFjaDo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdHJ5IHsKLSAgICAgIG4ucmVhZChwcm90by5nZXQoKSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7Ci0gICAgfQotICB9Ci0gIGNvdXQgPDwgZW5kbDsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzViYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgRW51bVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSAiZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE15RW51bVdpdGhDdXN0b21Pc3RyZWFtOjp0eXBlJiB2YWwpCit7CisgIG9zIDw8ICJ7IiA8PCAoaW50KXZhbCA8PCAiOkNVU1RPTSEiIDw8ICJ9IjsKKyAgcmV0dXJuIG9zOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoRW51bVRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV92YWx1ZSkgeworICAvLyBDaGVjayB0aGF0IGFsbCB0aGUgZW51bSB2YWx1ZXMgbWF0Y2ggd2hhdCB3ZSBleHBlY3QKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8yLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzMsIDMpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfNSwgNSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV82LCA2KTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0yOjpNRTJfMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTI6Ok1FMl8xLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMjo6TUUyXzIsIDIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM18wLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzXzEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfTjIsIC0yKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzX04xLCAtMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19EMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19EMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM185LCA5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzXzEwLCAxMCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0EsIDB4N2ZmZmZmZmQpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQiwgMHg3ZmZmZmZmZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9DLCAweDdmZmZmZmZmKTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTU6OmUyLCA0Mik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVD4KK3N0ZDo6c3RyaW5nIEVudW1Ub1N0cmluZyhfVCBlKQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgZTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9vc3RyZWFtKQoreworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtMTo6TUUxXzApLCAiTUUxXzAiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTU6OmUyKSwgImUyIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW0zOjpNRTNfTjEpLCAiTUUzX04xIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6Q3VzdG9NMiksICJ7MjpDVVNUT00hfSIpOworCisgIC8vIHNvbWUgaW52YWxpZCBvciB1bmtub3duIHZhbHVlCisgIE15RW51bTU6OnR5cGUgdXV0ID0gKE15RW51bTU6OnR5cGUpNDQ7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyh1dXQpLCAiNDQiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX2NvbnN0YW50KQoreworICBNeVN0cnVjdCBtczsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUyXzIsIDIpOworICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTNfbjIsIC0yKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUzX2QxLCAxKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaCBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCmluZGV4IGQ2NjFkOGIuLmJjZWY5ZjIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCisrKyBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCkBAIC0yMCw4MyArMjAsODggQEAKICNpZm5kZWYgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfCiAjZGVmaW5lIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXyAxCiAKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCiAvKiBDbGFzc05hbWUgSGVscGVyIGZvciBjbGVhbmVyIGV4Y2VwdGlvbnMgKi8KIGNsYXNzIENsYXNzTmFtZXMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gIlVua25vd24gdHlwZSI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgcmV0dXJuICJVbmtub3duIHR5cGUiOworICB9CiB9OwogCi10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDhfdD4oKSB7IHJldHVybiAiYnl0ZSI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7IHJldHVybiAic2hvcnQiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDMyX3Q+KCkgeyByZXR1cm4gImludCI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50NjRfdD4oKSB7IHJldHVybiAibG9uZyI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPHN0ZDo6c3RyaW5nPigpIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZSA8PgorY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ4X3Q+KCkgeworICByZXR1cm4gImJ5dGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7CisgIHJldHVybiAic2hvcnQiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MzJfdD4oKSB7CisgIHJldHVybiAiaW50IjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDY0X3Q+KCkgeworICByZXR1cm4gImxvbmciOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsKKyAgcmV0dXJuICJkb3VibGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8c3RkOjpzdHJpbmc+KCkgeworICByZXR1cm4gInN0cmluZyI7Cit9CiAKIC8qIEdlbmVyaWMgUHJvdG9jb2wgSS9PIGZ1bmN0aW9uIGZvciB0ZXN0cyAqLwogY2xhc3MgR2VuZXJpY0lPIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyogV3JpdGUgZnVuY3Rpb25zICovCiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQzMl90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTMyKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlRG91YmxlKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJNjQodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlU3RyaW5nKHZhbCk7CiAgIH0KIAogICAvKiBSZWFkIGZ1bmN0aW9ucyAqLwogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsKLSAgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMzIodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGRvdWJsZSYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPnJlYWRTdHJpbmcodmFsKTsKICAgfQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAppbmRleCBhOTI2OGEyLi5jMmFkNzNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCkBAIC0xNywxMjggKzE3LDIyNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwogI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBKU09OUHJvdG9UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0gIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Ci0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Cit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2w7CiAKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKLSAgTmVzdGluZyBuOwotICBuLm15X29vZSA9IG9vZTsKLSAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7Ci0gIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwotICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSsxKS8yOwotICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODBceGJjIjsKLSAgbi5teV9ib25rLnR5cGUgICAgPSAzMTMzNzsKLSAgbi5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS0+em9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworICBvb2UtPmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKK30KIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18xKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOwogCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNjc3NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iKTsKIAotICBIb2x5TW9sZXkgaG07CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqb29lKSk7CiAKLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxOZXN0aW5nPiBuOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgbi5yZXNldChuZXcgTmVzdGluZyk7CisgIG4tPm15X29vZSA9ICpvb2U7CisgIG4tPm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKKyAgbi0+bXlfb29lLmludGVnZXIzMiA9IDMyOworICBuLT5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7CisgIG4tPm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApICsgMSkgLyAyOworICBuLT5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOworICBuLT5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMFx4ZDBceDlkXHhjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZVx4MjBceGNlXHg5MVx4NzRceDc0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiYyI7CisgIG4tPm15X2JvbmsudHlwZSA9IDMxMzM3OworICBuLT5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAie1wiMVwiOntcInJlY1wiOntcIjFcIjp7XCJpMzJcIjozMTMzN30sXCIyXCI6e1wic3RyXCI6XCJJIGFtIGEgYm9uay4uLiB4b3IiCisgICAgIiFcIn19fSxcIjJcIjp7XCJyZWNcIjp7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3IgorICAgICJ9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LFwiN1wiOntcImRibFwiOiIKKyAgICAiMS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCJ9LFwiOVwiOnsiCisgICAgIlwic3RyXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc66x4PigLxcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiIgorICAgICJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiIKKyAgICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fX19IgorICApOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqbikpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEhvbHlNb2xleT4gaG07CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8zKCkgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBobS5yZXNldChuZXcgSG9seU1vbGV5KTsKKworICBobS0+YmlnLnB1c2hfYmFjaygqb29lKTsKKyAgaG0tPmJpZy5wdXNoX2JhY2sobi0+bXlfb29lKTsKKyAgaG0tPmJpZ1swXS5hX2JpdGUgPSAweDIyOworICBobS0+YmlnWzFdLmFfYml0ZSA9IDB4MzM7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7CiAgIHN0YWdlMS5wdXNoX2JhY2soInRoZW4gYSBvbmUsIHR3byIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aHJlZSEiKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiRk9VUiEhIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAKICAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIGhtLT5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwogICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CisgIGhtLT5ib25rc1sicG9lIl0gPSBzdGFnZTI7Cit9CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhobSkgPDwgZW5kbCA8PCBlbmRsOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcImxzdFwiOltcInJlY1wiLDIse1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOiIKKyAgIjM0fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sXCI1XCI6e1wiaTMyXCI6MTY3NzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDAiCisgICJ9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxIgorICAiXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOiIKKyAgIlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIiCisgICIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19LHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sIgorICAiXCIzXCI6e1wiaThcIjo1MX0sXCI0XCI6e1wiaTE2XCI6MTZ9LFwiNVwiOntcImkzMlwiOjMyfSxcIjZcIjp7XCJpNjRcIjo2NH0sIgorICAiXCI3XCI6e1wiZGJsXCI6MS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIiCisgICIpXCJ9LFwiOVwiOntcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7IgorICAiXCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNiIKKyAgIlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fV19LFwiMlwiOntcInNldFwiOltcImxzdFwiLDMiCisgICIsW1wic3RyXCIsMF0sW1wic3RyXCIsMixcImFuZCBhIG9uZVwiLFwiYW5kIGEgdHdvXCJdLFtcInN0clwiLDMsXCJ0aGVuIGEgb25lIgorICAiLCB0d29cIixcInRocmVlIVwiLFwiRk9VUiEhXCJdXX0sXCIzXCI6e1wibWFwXCI6W1wic3RyXCIsXCJsc3RcIiwzLHtcIm5vdGhpbiIKKyAgImdcIjpbXCJyZWNcIiwwXSxcInBvZVwiOltcInJlY1wiLDMse1wiMVwiOntcImkzMlwiOjN9LFwiMlwiOntcInN0clwiOlwicXVvdGgiCisgICJcIn19LHtcIjFcIjp7XCJpMzJcIjo0fSxcIjJcIjp7XCJzdHJcIjpcInRoZSByYXZlblwifX0se1wiMVwiOntcImkzMlwiOjV9LFwiIgorICAiMlwiOntcInN0clwiOlwibmV2ZXJtb3JlXCJ9fV0sXCJzb21ldGhpbmdcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJpMzJcIjoxfSxcIiIKKyAgIjJcIjp7XCJzdHJcIjpcIldhaXQuXCJ9fSx7XCIxXCI6e1wiaTMyXCI6Mn0sXCIyXCI6e1wic3RyXCI6XCJXaGF0P1wifX1dfV19fSIKKyAgKTsKIAorICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKmhtKSk7CiAKLSAgY291dCA8PCAiVGVzdGluZyBvb2UiIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCi0gIG9vZS53cml0ZShwcm90by5nZXQoKSk7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fNCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgb29lLT53cml0ZShwcm90by5nZXQoKSk7CiAgIE9uZU9mRWFjaCBvb2UyOwogICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChvb2UgPT0gb29lMik7CisgIEJPT1NUX0NIRUNLKCpvb2UgPT0gb29lMik7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b181KSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOwogCi0gIGNvdXQgPDwgIlRlc3RpbmcgaG0iIDw8IGVuZGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAotICBobS53cml0ZShwcm90by5nZXQoKSk7CisgIGhtLT53cml0ZShwcm90by5nZXQoKSk7CiAgIEhvbHlNb2xleSBobTI7CiAgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQoaG0gPT0gaG0yKTsKKyAgQk9PU1RfQ0hFQ0soKmhtID09IGhtMik7CiAKICAgaG0yLmJpZ1swXS5hX2JpdGUgPSAweDAwOwogCi0gIGFzc2VydChobSAhPSBobTIpOworICBCT09TVF9DSEVDSygqaG0gIT0gaG0yKTsKK30KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzYpIHsKICAgRG91YmxlcyBkdWI7Ci0gIGR1Yi5uYW4gPSBIVUdFX1ZBTC9IVUdFX1ZBTDsKKyAgZHViLm5hbiA9IEhVR0VfVkFMIC8gSFVHRV9WQUw7CiAgIGR1Yi5pbmYgPSBIVUdFX1ZBTDsKICAgZHViLm5lZ2luZiA9IC1IVUdFX1ZBTDsKLSAgZHViLnJlcGVhdGluZyA9IDEwLjAvMy4wOworICBkdWIucmVwZWF0aW5nID0gMTAuMCAvIDMuMDsKICAgZHViLmJpZyA9IDFFKzMwNTsKLSAgZHViLnNtYWxsID0gMUUtMzA1OworICBkdWIudGlueSA9IDFFLTMwNTsKICAgZHViLnplcm8gPSAwLjA7CiAgIGR1Yi5uZWd6ZXJvID0gLTAuMDsKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhkdWIpIDw8IGVuZGwgPDwgZW5kbDsKIAotICBjb3V0IDw8ICJUZXN0aW5nIGJhc2UiIDw8IGVuZGw7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJkYmxcIjpcIk5hTlwifSxcIjJcIjp7XCJkYmxcIjpcIkluZmluaXR5XCJ9LFwiM1wiOntcImRibFwiOlwiLUluZmkiCisgICJuaXR5XCJ9LFwiNFwiOntcImRibFwiOjMuMzMzMzMzMzMzMzMzMzMzNX0sXCI1XCI6e1wiZGJsXCI6OS45OTk5OTk5OTk5OTk5OTk0ZSsiCisgICIzMDR9LFwiNlwiOntcImRibFwiOjFlLTMwNX0sXCI3XCI6e1wiZGJsXCI6MH0sXCI4XCI6e1wiZGJsXCI6LTB9fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoZHViKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b183KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBCYXNlNjQgYmFzZTsKICAgYmFzZS5hID0gMTIzOwpAQCAtMTUzLDcgKzI1Miw5MiBAQAogICBCYXNlNjQgYmFzZTI7CiAgIGJhc2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChiYXNlID09IGJhc2UyKTsKKyAgQk9PU1RfQ0hFQ0soYmFzZSA9PSBiYXNlMik7Cit9CiAKLSAgcmV0dXJuIDA7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fOCkgeworICBjb25zdCBjaGFyKiBqc29uX3N0cmluZyA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTYuNzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBjb25zdCBzdGQ6OnNpemVfdCBidWZTaXogPSBzdHJsZW4oanNvbl9zdHJpbmcpICogc2l6ZW9mKGNoYXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmU2l6KSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB0b0hleFNlcXVlbmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgaSsrKSB7CisgICAgc3MgPDwgIlxceCIgPDwgaW50KHVpbnQ4X3Qoc3RyW2ldKSk7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1MGUwMSBcXHVkODM1XFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworICBjb25zdCBjaGFyKiBleHBlY3RlZF96b21nX3VuaWNvZGUgPSAiXHhlMFx4YjhceDgxIFx4ZjBceDlkXHg5NFx4YmUiOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFvb2UyLnpvbWdfdW5pY29kZS5jb21wYXJlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSksCisgICAgIkV4cGVjdGVkOlxuIiA8PCB0b0hleFNlcXVlbmNlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSkgPDwgIlxuR290dGVuOlxuIgorICAgICAgICAgICAgICAgICAgPDwgdG9IZXhTZXF1ZW5jZShvb2UyLnpvbWdfdW5pY29kZSkpOworCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWRfbWlzc2luZ19sb3dfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZDgzNVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2hpX3N1cnJvZ2F0ZSkgeworICBjb25zdCBjaGFyIGpzb25fc3RyaW5nW10gPQorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTIVwifSxcIjlcIjp7XCJzdHJcIjpcIlxcdWRkM2VcIn0sIgorICAiXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiMDAwMDAwXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAxODI5MjY4Li5kNjQ1YTY1Ci0tLSBhL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE2LDI1ICsxNiw2OSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cwogCi1ub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBcCisJCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCQlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvcHJvY190eXBlcy5oCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEgbGlicHJvY2Vzc29ydGVzdC5sYQogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIFwKIAlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0JZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAotCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKLQlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcCBcCiAJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKIAlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCiAKK25vZGlzdF9saWJwcm9jZXNzb3J0ZXN0X2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL0NoaWxkU2VydmljZS5oIFwKKwlnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvRW1wdHlTZXJ2aWNlLmggXAorCWdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAgXAorCWdlbi1jcHAvUGFyZW50U2VydmljZS5oIFwKKwlnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL3Byb2NfdHlwZXMuaAorCiBUaHJpZnRUZXN0X2V4dHJhcy5vOiBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAogRGVidWdQcm90b1Rlc3RfZXh0cmFzLm86IGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAogCiBsaWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQogCi1ub2luc3RfUFJPR1JBTVMgPSBCZW5jaG1hcmsKK25vaW5zdF9QUk9HUkFNUyA9IEJlbmNobWFyayBcCisJY29uY3VycmVuY3lfdGVzdAogCiBCZW5jaG1hcmtfU09VUkNFUyA9IFwKIAlCZW5jaG1hcmsuY3BwCkBAIC00MiwzMCArODYsOTcgQEAKIEJlbmNobWFya19MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKIAogY2hlY2tfUFJPR1JBTVMgPSBcCisJVW5pdFRlc3RzIFwKIAlURkRUcmFuc3BvcnRUZXN0IFwKIAlUUGlwZWRUcmFuc3BvcnRUZXN0IFwKIAlEZWJ1Z1Byb3RvVGVzdCBcCiAJSlNPTlByb3RvVGVzdCBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QgXAorCVJlY3Vyc2l2ZVRlc3QgXAogCVNwZWNpYWxpemF0aW9uVGVzdCBcCiAJQWxsUHJvdG9jb2xzVGVzdCBcCiAJVHJhbnNwb3J0VGVzdCBcCisJVEludGVycnVwdFRlc3QgXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgXAorCVNlY3VyaXR5VGVzdCBcCiAJWmxpYlRlc3QgXAogCVRGaWxlVHJhbnNwb3J0VGVzdCBcCi0JVW5pdFRlc3RzCisJbGlua190ZXN0IFwKKwlPcGVuU1NMTWFudWFsSW5pdFRlc3QgXAorCUVudW1UZXN0IFwKKwlSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QgXAorICAgICAgICBBbm5vdGF0aW9uVGVzdAorCitpZiBBTVhfSEFWRV9MSUJFVkVOVAorbm9pbnN0X1BST0dSQU1TICs9IFwKKwlwcm9jZXNzb3JfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gXAorCVROb25ibG9ja2luZ1NlcnZlclRlc3QgXAorCVROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKK2VuZGlmCisKK1RFU1RTX0VOVklST05NRU5UPSBcCisJQk9PU1RfVEVTVF9MT0dfU0lOSz10ZXN0cy54bWwgXAorCUJPT1NUX1RFU1RfTE9HX0xFVkVMPXRlc3Rfc3VpdGUgXAorCUJPT1NUX1RFU1RfTE9HX0ZPUk1BVD1YTUwKIAogVEVTVFMgPSBcCiAJJChjaGVja19QUk9HUkFNUykKIAogVW5pdFRlc3RzX1NPVVJDRVMgPSBcCiAJVW5pdFRlc3RNYWluLmNwcCBcCisJT25lV2F5SFRUUFRlc3QuY3BwIFwKIAlUTWVtb3J5QnVmZmVyVGVzdC5jcHAgXAotCVRCdWZmZXJCYXNlVGVzdC5jcHAKKwlUQnVmZmVyQmFzZVRlc3QuY3BwIFwKKwlCYXNlNjRUZXN0LmNwcCBcCisJVG9TdHJpbmdUZXN0LmNwcCBcCisJVHlwZWRlZlRlc3QuY3BwIFwKKwlUU2VydmVyU29ja2V0VGVzdC5jcHAgXAorCVRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcCBcCisJVFRyYW5zcG9ydENoZWNrVGhyb3cuaAorCitVbml0VGVzdHNfU09VUkNFUyArPSBcCisgIGNvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAgXAorICBjb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKIAogVW5pdFRlc3RzX0xEQUREID0gXAotICAkKEJPT1NUX0xERkxBR1MpIFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCi0gICQoQk9PU1RfUk9PVF9QQVRIKS9saWIvbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1RIUkVBRF9MREFERCkKKworVEludGVycnVwdFRlc3RfU09VUkNFUyA9IFwKKwlUU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgXAorCVRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorCitUSW50ZXJydXB0VGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAkKEJPT1NUX0ZJTEVTWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9DSFJPTk9fTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCisKK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RfU09VUkNFUyA9IFwKKwlUU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcAorCitUU2VydmVySW50ZWdyYXRpb25UZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1RIUkVBRF9MREFERCkKKworU2VjdXJpdHlUZXN0X1NPVVJDRVMgPSBcCisJU2VjdXJpdHlUZXN0LmNwcAorCitTZWN1cml0eVRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1RIUkVBRF9MREFERCkKIAogVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAogCVRyYW5zcG9ydFRlc3QuY3BwCkBAIC03Myw3ICsxODQsNyBAQAogVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCiAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAotICAkKEJPT1NUX1JPT1RfUEFUSCkvbGliL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAogICAtbHoKIAogWmxpYlRlc3RfU09VUkNFUyA9IFwKQEAgLTgyLDE1ICsxOTMsMzMgQEAKIFpsaWJUZXN0X0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCi0gICQoQk9PU1RfUk9PVF9QQVRIKS9saWIvbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCiAgIC1segogCitFbnVtVGVzdF9TT1VSQ0VTID0gXAorCUVudW1UZXN0LmNwcAorCitFbnVtVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKworUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0X1NPVVJDRVMgPSBSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCisKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEgJChCT09TVF9URVNUX0xEQUREKQorCitBbm5vdGF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCUFubm90YXRpb25UZXN0LmNwcAorCitBbm5vdGF0aW9uVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKwogVEZpbGVUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCiAJVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAogCiBURmlsZVRyYW5zcG9ydFRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAotICAkKEJPT1NUX1JPT1RfUEFUSCkvbGliL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAkKEJPT1NUX1RFU1RfTERBREQpCiAKICMKICMgVEZEVHJhbnNwb3J0VGVzdApAQCAtOTgsMTggKzIyNywyNCBAQAogVEZEVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAogCVRGRFRyYW5zcG9ydFRlc3QuY3BwCiAKLVRGRFRyYW5zcG9ydFRlc3RfTERBREQgPSBcCi0JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCitURkRUcmFuc3BvcnRUZXN0X0xEQUREID0gIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAogCiAjCiAjIFRQaXBlZFRyYW5zcG9ydFRlc3QKICMKIFRQaXBlZFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKLQlUUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAorCVRQaXBlZFRyYW5zcG9ydFRlc3QuY3BwIFwKKwlUUGlwZUludGVycnVwdFRlc3QuY3BwCiAKIFRQaXBlZFRyYW5zcG9ydFRlc3RfTERBREQgPSBcCi0JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpIFwKKwkkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorCSQoQk9PU1RfVEhSRUFEX0xEQUREKQogCiAjCiAjIEFsbFByb3RvY29sc1Rlc3QKQEAgLTExOSw3ICsyNTQsOSBAQAogCUFsbFByb3RvY29sVGVzdHMudGNjIFwKIAlHZW5lcmljSGVscGVycy5oCiAKLUFsbFByb3RvY29sc1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitBbGxQcm90b2NvbHNUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKQogCiAjCiAjIERlYnVnUHJvdG9UZXN0CkBAIC0xMjcsNyArMjY0LDkgQEAKIERlYnVnUHJvdG9UZXN0X1NPVVJDRVMgPSBcCiAJRGVidWdQcm90b1Rlc3QuY3BwCiAKLURlYnVnUHJvdG9UZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorRGVidWdQcm90b1Rlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQogCiAKICMKQEAgLTEzNiw3ICsyNzUsMzYgQEAKIEpTT05Qcm90b1Rlc3RfU09VUkNFUyA9IFwKIAlKU09OUHJvdG9UZXN0LmNwcAogCi1KU09OUHJvdG9UZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorSlNPTlByb3RvVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCisKKyMKKyMgVE5vbmJsb2NraW5nU2VydmVyVGVzdAorIworVE5vbmJsb2NraW5nU2VydmVyVGVzdF9TT1VSQ0VTID0gVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKKworVE5vbmJsb2NraW5nU2VydmVyVGVzdF9MREFERCA9IGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKKyMKKyMgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorIworVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTID0gVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAKKworVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9MREFERCA9IGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfQ0hST05PX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RIUkVBRF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKIAogIwogIyBPcHRpb25hbFJlcXVpcmVkVGVzdApAQCAtMTQ0LDcgKzMxMiwxOSBAQAogT3B0aW9uYWxSZXF1aXJlZFRlc3RfU09VUkNFUyA9IFwKIAlPcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKIAotT3B0aW9uYWxSZXF1aXJlZFRlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCitPcHRpb25hbFJlcXVpcmVkVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCisKKyMKKyMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyMKK1JlY3Vyc2l2ZVRlc3RfU09VUkNFUyA9IFwKKwlSZWN1cnNpdmVUZXN0LmNwcAorCitSZWN1cnNpdmVUZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAogIwogIyBTcGVjaWFsaXphdGlvblRlc3QKQEAgLTE1MiwzNiArMzMyLDk4IEBACiBTcGVjaWFsaXphdGlvblRlc3RfU09VUkNFUyA9IFwKIAlTcGVjaWFsaXphdGlvblRlc3QuY3BwCiAKLVNwZWNpYWxpemF0aW9uVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK1NwZWNpYWxpemF0aW9uVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCiAKK2NvbmN1cnJlbmN5X3Rlc3RfU09VUkNFUyA9IFwKKwljb25jdXJyZW5jeS9UZXN0cy5jcHAgXAorCWNvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oIFwKKwljb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBcCisJY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaAorCitjb25jdXJyZW5jeV90ZXN0X0xEQUREID0gXAorICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworbGlua190ZXN0X1NPVVJDRVMgPSBcCisgIGxpbmsvTGlua1Rlc3QuY3BwIFwKKyAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAgXAorICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcAorCitwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTID0gXAorCXByb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcCBcCisJcHJvY2Vzc29yL0V2ZW50TG9nLmNwcCBcCisJcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAgXAorCXByb2Nlc3Nvci9FdmVudExvZy5oIFwKKwlwcm9jZXNzb3IvSGFuZGxlcnMuaCBcCisJcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oCisKK3Byb2Nlc3Nvcl90ZXN0X0xEQUREID0gbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCisKK09wZW5TU0xNYW51YWxJbml0VGVzdF9TT1VSQ0VTID0gXAorCU9wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAKKworT3BlblNTTE1hbnVhbEluaXRUZXN0X0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChPUEVOU1NMX0xERkxBR1MpIFwKKwkkKE9QRU5TU0xfTElCUykKIAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIAotZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmg6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCisKK2dlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0VudW1UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHA6ZGVuc2UgJDwKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKLUlOQ0xVREVTID0gXAotCS1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYworZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcDogT25lV2F5VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKLUFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykKLUFNX0NYWEZMQUdTID0gLVdhbGwKK2dlbi1jcHAvQ2hpbGRTZXJ2aWNlLmNwcCBnZW4tY3BwL0NoaWxkU2VydmljZS5oIGdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmggZ2VuLWNwcC9wcm9jX3R5cGVzLmNwcCBnZW4tY3BwL3Byb2NfdHlwZXMuaDogcHJvY2Vzc29yL3Byb2MudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlICQ8CisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1EX19TVERDX0ZPUk1BVF9NQUNST1MgLURfX1NURENfTElNSVRfTUFDUk9TIC1JLgorQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgogCiBFWFRSQV9ESVNUID0gXAotCURlbnNlUHJvdG9UZXN0LmNwcCBcCisJY29uY3VycmVuY3kgXAorCXByb2Nlc3NvciBcCisJcXQgXAorCUNNYWtlTGlzdHMudHh0IFwKKwlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwIFwKIAlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAotCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKwlPbmVXYXlUZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09uZVdheUhUVFBUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL09uZVdheVNlcnZpY2UuaCIKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE9uZVdheUhUVFBUZXN0KQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cENsaWVudDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CituYW1lc3BhY2UgdXRmID0gYm9vc3Q6OnVuaXRfdGVzdDsKKworLy8gRGVmaW5lIHRoaXMgZW52IHZhciB0byBlbmFibGUgc29tZSBsb2dnaW5nIChpbiBjYXNlIHlvdSBuZWVkIHRvIGRlYnVnKQorI3VuZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworCitjbGFzcyBPbmVXYXlTZXJ2aWNlSGFuZGxlciA6IHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYgeworcHVibGljOgorICBPbmVXYXlTZXJ2aWNlSGFuZGxlcigpIHt9CisKKyAgdm9pZCByb3VuZFRyaXBSUEMoKSBvdmVycmlkZSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAicm91bmRUcmlwUlBDKCkiIDw8IGVuZGw7CisjZW5kaWYKKyAgfQorICB2b2lkIG9uZVdheVJQQygpIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJvbmVXYXlSUEMoKSIgPDwgc3RkOjplbmRsIDsKKyNlbmRpZgorIH0KK307CisKK2NsYXNzIE9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWZGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfk9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB7CisgICAgKHZvaWQpY29ubkluZm8gOworICAgIHJldHVybiBuZXcgT25lV2F5U2VydmljZUhhbmRsZXI7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGhhbmRsZXIpIHsKKyAgICBkZWxldGUgaGFuZGxlcjsKKyAgfQorfTsKKworY2xhc3MgUlBDMFRocmVhZENsYXNzIHsKK3B1YmxpYzoKKyAgUlBDMFRocmVhZENsYXNzKFRUaHJlYWRlZFNlcnZlciYgc2VydmVyKSA6IHNlcnZlcl8oc2VydmVyKSB7IH0gLy8gQ29uc3RydWN0b3IKK35SUEMwVGhyZWFkQ2xhc3MoKSB7IH0gLy8gRGVzdHJ1Y3RvcgorCit2b2lkIFJ1bigpIHsKKyAgc2VydmVyXy5zZXJ2ZSgpIDsKK30KKyBUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcl8gOworfSA7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKKworLy8gY29waWVkIGZyb20gSW50ZWdyYXRpb25UZXN0CitjbGFzcyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciwgcHVibGljIE1vbml0b3IgeworcHVibGljOgorICBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSA6IGlzTGlzdGVuaW5nXyhmYWxzZSksIGFjY2VwdGVkXygwKSB7fQorICB2aXJ0dWFsIH5UU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgIGlzTGlzdGVuaW5nXyA9IHRydWU7CisgICAgbm90aWZ5KCk7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CisgICAgKythY2NlcHRlZF87CisgICAgbm90aWZ5KCk7CisKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYm9vbCBpc0xpc3RlbmluZygpIGNvbnN0IHsgcmV0dXJuIGlzTGlzdGVuaW5nXzsgfQorICB1aW50NjRfdCBhY2NlcHRlZENvdW50KCkgY29uc3QgeyByZXR1cm4gYWNjZXB0ZWRfOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNMaXN0ZW5pbmdfOworICB1aW50NjRfdCBhY2NlcHRlZF87Cit9OworCitjbGFzcyBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQgOiBwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyBwdWJsaWM6CisgIFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCwgMTAyNDApLAorICAgIGJsb2NrZWRfKGZhbHNlKSB7CisgIH0KKworICB1aW50MzJfdCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkgeworICAgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICAgIHJldHVybiBoYXZlX2J5dGVzIDsKKyAgfQorCisgIHZvaWQgYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSB0cnVlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJibG9jayBmbHVzaGluZ1xuIiA7CisjZW5kaWYKKyB9CisgIHZvaWQgdW5ibG9jaygpIHsKKyAgICBibG9ja2VkXyA9IGZhbHNlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJ1bmJsb2NrIGZsdXNoaW5nLCBidWZmZXIgaXNcbjw8IiA8PCBzdGQ6OnN0cmluZygoY2hhciAqKXdCdWZfLmdldCgpLCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkpIDw8ICI+PlxuIiA7CisjZW5kaWYKKyB9CisKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICBpZiAoYmxvY2tlZF8pIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICAgIGNlcnIgPDwgImZsdXNoIHdhcyBibG9ja2VkXG4iIDsKKyNlbmRpZgorICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIDsKKyAgfQorCisgIGJvb2wgYmxvY2tlZF8gOworfSA7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCBKU09OX0J1ZmZlcmVkSFRUUCApCit7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oMCkgOworICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8b25ld2F5dGVzdDo6T25lV2F5U2VydmljZVByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8T25lV2F5U2VydmljZUNsb25lRmFjdG9yeT4oKSksCisgICAgc3MsIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEpTT05Qcm90b2NvbEZhY3Rvcnk+KCkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXIobmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikgOworICBzZXJ2ZXIuc2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOworCisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi5cbiI7CisjZW5kaWYKKyAgUlBDMFRocmVhZENsYXNzIHQoc2VydmVyKSA7CisgIGJvb3N0Ojp0aHJlYWQgdGhyZWFkKCZSUEMwVGhyZWFkQ2xhc3M6OlJ1biwgJnQpOworCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqKHBFdmVudEhhbmRsZXIuZ2V0KCkpKTsKKyAgICB3aGlsZSAoIXBFdmVudEhhbmRsZXItPmlzTGlzdGVuaW5nKCkpIHsKKyAgICAgIHBFdmVudEhhbmRsZXItPndhaXQoKTsKKyAgICB9CisgIH0KKworICBpbnQgcG9ydCA9IHNzLT5nZXRQb3J0KCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJwb3J0ICIgPDwgcG9ydCA8PCBlbmRsIDsKKyNlbmRpZgorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KSk7CisgICAgc29ja2V0LT5zZXRSZWN2VGltZW91dCgxMDAwMCkgOyAvLyAxMDAwbXNlYyBzaG91bGQgYmUgZW5vdWdoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydD4gYmxvY2thYmxlX3RyYW5zcG9ydChuZXcgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRIdHRwQ2xpZW50KGJsb2NrYWJsZV90cmFuc3BvcnQsICJsb2NhbGhvc3QiLCAiL3NlcnZpY2UiKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUNsaWVudCBjbGllbnQocHJvdG9jb2wpOworCisKKyAgICB0cmFuc3BvcnQtPm9wZW4oKTsKKyAgICBjbGllbnQucm91bmRUcmlwUlBDKCk7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+YmxvY2soKSA7CisgICAgdWludDMyX3Qgc2l6ZTAgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMSA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgY2xpZW50LnNlbmRfb25lV2F5UlBDKCkgOworICAgIHVpbnQzMl90IHNpemUyID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBCT09TVF9DSEVDSygoc2l6ZTEgLSBzaXplMCkgPT0gKHNpemUyIC0gc2l6ZTEpKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+dW5ibG9jaygpIDsKKyAgICBjbGllbnQuc2VuZF9yb3VuZFRyaXBSUEMoKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+Zmx1c2goKSA7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC5yZWN2X3JvdW5kVHJpcFJQQygpIDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIEJPT1NUX0VSUk9SKCAid2Ugc2hvdWxkIG5vdCBnZXQgYSB0cmFuc3BvcnQgZXhjZXB0aW9uIC0tIHRoaXMgbWVhbnMgd2UgZmFpbGVkOiAiICsgc3RkOjpzdHJpbmcoZS53aGF0KCkpICkgOworICAgIH0KKyAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CisgIH0KKyAgc2VydmVyLnN0b3AoKTsKKyAgdGhyZWFkLmpvaW4oKSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgImZpbmlzaGVkLlxuIjsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdlOWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09uZVdheVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgT25lV2F5VGVzdAorbmFtZXNwYWNlIGphdmEgb25ld2F5dGVzdAorbmFtZXNwYWNlIGNwcCBvbmV3YXl0ZXN0CituYW1lc3BhY2UgcmIgT25ld2F5dGVzdAorbmFtZXNwYWNlIHBlcmwgT25lV2F5VGVzdAorbmFtZXNwYWNlIGNzaGFycCBPbmV3YXl0ZXN0CituYW1lc3BhY2UganMgT25lV2F5VGVzdAorbmFtZXNwYWNlIHN0IE9uZVdheVRlc3QKK25hbWVzcGFjZSBweSBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkudHdpc3RlZCBPbmVXYXlUZXN0CituYW1lc3BhY2UgZ28gb25ld2F5dGVzdAorbmFtZXNwYWNlIHBocCBPbmVXYXlUZXN0CituYW1lc3BhY2UgZGVscGhpIE9uZXdheXRlc3QKK25hbWVzcGFjZSBjb2NvYSBPbmVXYXlUZXN0CituYW1lc3BhY2UgbHVhIE9uZVdheVRlc3QKK25hbWVzcGFjZSB4c2QgdGVzdCAodXJpID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9ucy9PbmVXYXlUZXN0JykKK25hbWVzcGFjZSBuZXRjb3JlIFRocmlmdEFzeW5jLk9uZVdheVRlc3QKKworLy8gYSBtaW5pbWFsIFRocmlmdCBzZXJ2aWNlLCBmb3IgdXNlIGluIE9uZVdheUhUVFBUdGVzdC5jcHAKK3NlcnZpY2UgT25lV2F5U2VydmljZSB7CisgIHZvaWQgcm91bmRUcmlwUlBDKCksCisgIG9uZXdheSB2b2lkIG9uZVdheVJQQygpCit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBUbyBzaG93IHRoYXQgdGhpcyB0ZXN0IGFjdHVhbGx5IHRlc3RzIHNvbWV0aGluZywgeW91IGNhbiBjaGFuZ2UKKy8vIE1BTlVBTF9PUEVOU1NMX0lOSVQgdG8gMCB0byBjYXVzZSBhdXRvbWF0aWMgT3BlblNTTCBpbml0L2NsZWFudXAsCisvLyB3aGljaCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKKyNkZWZpbmUgTUFOVUFMX09QRU5TU0xfSU5JVCAxCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCit2b2lkIG1ha2VfaXNvbGF0ZWRfc3Nsc29ja2V0ZmFjdG9yeSgpIHsKKyAgLy8gSGVyZSB3ZSBjcmVhdGUgYW4gaXNvbGF0ZWQgVFNTTFNvY2tldEZhY3RvcnkgdG8gZW5zdXJlIHRoZQorICAvLyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBvZiBUU1NMU29ja2V0RmFjdG9yeSBnZXQgcnVuLiAgVGh1cworICAvLyB3aXRob3V0IG1hbnVhbCBpbml0aWFsaXphdGlvbiBub3JtYWxseSBPcGVuU1NMIHdvdWxkIGJlCisgIC8vIHVuaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4KKyAgVFNTTFNvY2tldEZhY3RvcnkgZmFjdG9yeTsKK30KKwordm9pZCBvcGVuc3NsX2luaXQoKSB7CisjaWYgTUFOVUFMX09QRU5TU0xfSU5JVAorICBUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOworICBpbml0aWFsaXplT3BlblNTTCgpOworI2VuZGlmCit9CisKK3ZvaWQgb3BlbnNzbF9jbGVhbnVwKCkgeworI2lmIE1BTlVBTF9PUEVOU1NMX0lOSVQKKyAgY2xlYW51cE9wZW5TU0woKTsKKyNlbmRpZgorfQorCit2b2lkIHRlc3Rfb3BlbnNzbF9hdmFpbGFiaWxpdHkoKSB7CisgIC8vIENoZWNrIHdoZXRoZXIgVGhyaWZ0IGxlYXZlcyBPcGVuU1NMIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIGFmdGVyCisgIC8vIHRoZSBsYXN0IFRTU0xTb2NrZXRGYWN0b3J5IGlzIGRlc3Ryb3llZCB3aGVuIG1hbnVhbAorICAvLyBpbml0aWFsaXphdGlvbiBpcyBzZXQKKyAgb3BlbnNzbF9pbml0KCk7CisgIG1ha2VfaXNvbGF0ZWRfc3Nsc29ja2V0ZmFjdG9yeSgpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25lIHRoYXQgd2lsbCBmYWlsIGlmIE9wZW5TU0wgaXMKKyAgLy8gdW5pbml0aWFsaXplZC4gIEl0IG1pZ2h0IGFsc28gZmFpbCBvbiB2ZXJ5IG9sZCB2ZXJzaW9ucyBvZgorICAvLyBPcGVuU1NMLi4uCisgIGNvbnN0IEVWUF9NRCogbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgiU0hBMjU2Iik7CisgIEJPT1NUX0NIRUNLKG1kICE9IE5VTEwpOworICBvcGVuc3NsX2NsZWFudXAoKTsKK30KKworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJPcGVuU1NMTWFudWFsSW5pdCI7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSkpOworCisgIHJldHVybiB0cnVlOworfQorIAoraW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIk9wZW5TU0xNYW51YWxJbml0IjsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KSk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAppbmRleCA3NDcyNjAzLi40YzQzNTQ2IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKQEAgLTIxLDIyNiArMjEsMzY2IEBACiAgKiBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxwcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIgogCi11c2luZyBzdGQ6OmNvdXQ7Ci11c2luZyBzdGQ6OmVuZGw7Ci11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6c3RyaW5nOworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBPcHRpb25hbFJlcXVpcmVkVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKwogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIAotCiAvKgogdGVtcGxhdGU8dHlwZW5hbWUgU3RydWN0Pgogdm9pZCB0cnl3cml0ZShjb25zdCBTdHJ1Y3QmIHMsIGJvb2wgc2hvdWxkX3dvcmspIHsKICAgYm9vbCB3b3JrZWQ7CiAgIHRyeSB7Ci0gICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICAgIHMud3JpdGUoJnByb3RvY29sKTsKICAgICB3b3JrZWQgPSB0cnVlOwogICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJiBleCkgewogICAgIHdvcmtlZCA9IGZhbHNlOwogICB9Ci0gIGFzc2VydCh3b3JrZWQgPT0gc2hvdWxkX3dvcmspOworICBCT09TVF9DSEVDSyh3b3JrZWQgPT0gc2hvdWxkX3dvcmspOwogfQogKi8KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFN0cnVjdDEsIHR5cGVuYW1lIFN0cnVjdDI+Ci12b2lkIHdyaXRlX3RvX3JlYWQoY29uc3QgU3RydWN0MSAmIHcsIFN0cnVjdDIgJiByKSB7Ci0gIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwordm9pZCB3cml0ZV90b19yZWFkKGNvbnN0IFN0cnVjdDEmIHcsIFN0cnVjdDImIHIpIHsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICB3LndyaXRlKCZwcm90b2NvbCk7CiAgIHIucmVhZCgmcHJvdG9jb2wpOwogfQogCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzEpIHsKKyAgT2xkU2Nob29sIG87CiAKLWludCBtYWluKCkgeworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIk9sZFNjaG9vbCB7XG4iCisgICAgIiAgMDE6IGltX2ludCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3N0ciAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgMDM6IGltX2JpZyAobGlzdCkgPSBsaXN0PG1hcD5bMF0ge1xuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvKSk7CiAKLSAgY291dCA8PCAiVGhpcyBvbGQgc2Nob29sIHN0cnVjdCBzaG91bGQgaGF2ZSB0aHJlZSBmaWVsZHMuIiA8PCBlbmRsOwotICB7Ci0gICAgT2xkU2Nob29sIG87Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhvKSA8PCBlbmRsOwotICB9Ci0gIGNvdXQgPDwgZW5kbDsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CiAKLSAgY291dCA8PCAiU2V0dGluZyBhIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGlzc2V0LiIgPDwgZW5kbDsKLSAgewotICAgIFNpbXBsZSBzOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLmltX29wdGlvbmFsID0gMTA7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICB9Ci0gIGNvdXQgPDwgZW5kbDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl8xKSB7CisgIFNpbXBsZSBzOwogCi0gIGNvdXQgPDwgIlNldHRpbmcgaXNzZXQgYmVmb3JlIHNldHRpbmcgYSB2YWx1ZS4iIDw8IGVuZGw7Ci0gIHsKLSAgICBTaW1wbGUgczsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5pbV9vcHRpb25hbCA9IDEwOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgfQotICBjb3V0IDw8IGVuZGw7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKIAorICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzIpIHsKKyAgU2ltcGxlIHM7CisgIHMuaW1fb3B0aW9uYWwgPSAxMDsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl8zKSB7CisgIFNpbXBsZSBzOworICBzLmltX29wdGlvbmFsID0gMTA7CisgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDAzOiBpbV9vcHRpb25hbCAoaTE2KSA9IDEwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfNCkgeworICBTaW1wbGUgczsKKyAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDM6IGltX29wdGlvbmFsIChpMTYpID0gMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzUpIHsKKyAgU2ltcGxlIHM7CisgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIHMuaW1fb3B0aW9uYWwgPSAxMDsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDM6IGltX29wdGlvbmFsIChpMTYpID0gMTAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMykgeworICAvLyBhc3NpZ24vY29weS1jb25zdHJ1Y3Qgd2l0aCBub24tcmVxdWlyZWQgZmllbGRzCisKKyAgU2ltcGxlIHMxLCBzMjsKKyAgczEuX19pc3NldC5pbV9kZWZhdWx0ID0gdHJ1ZTsKKyAgczEuX19zZXRfaW1fb3B0aW9uYWwoMTApOworICBCT09TVF9DSEVDSyhzMS5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyhzMS5fX2lzc2V0LmltX29wdGlvbmFsKTsKKworICBzMiA9IHMxOworCisgIEJPT1NUX0NIRUNLKHMyLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHMyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworCisgIFNpbXBsZSBzMyhzMSk7CisKKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9vcHRpb25hbCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNCkgewogICAvLyBXcml0ZS10by1yZWFkIHdpdGggb3B0aW9uYWwgZmllbGRzLgotICB7Ci0gICAgU2ltcGxlIHMxLCBzMiwgczM7Ci0gICAgczEuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBhc3NlcnQoIXMxLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gIC8vYXNzZXJ0KCFzMS5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgYXNzZXJ0KCFzMS5fX2lzc2V0LmltX29wdGlvbmFsKTsKIAotICAgIHdyaXRlX3RvX3JlYWQoczEsIHMyKTsKKyAgU2ltcGxlIHMxLCBzMiwgczM7CisgIHMxLmltX29wdGlvbmFsID0gMTA7CisgIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX2RlZmF1bHQpOworICAvLyBCT09TVF9DSEVDSyghczEuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgorICBCT09TVF9DSEVDSyghczEuX19pc3NldC5pbV9vcHRpb25hbCk7CiAKLSAgICBhc3NlcnQoIHMyLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gIC8vYXNzZXJ0KCBzMi5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgYXNzZXJ0KCFzMi5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQoczMuaW1fb3B0aW9uYWwgPT0gMCk7CisgIHdyaXRlX3RvX3JlYWQoczEsIHMyKTsKIAotICAgIHMxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIHdyaXRlX3RvX3JlYWQoczEsIHMzKTsKKyAgQk9PU1RfQ0hFQ0soczIuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgLy8gQk9PU1RfQ0hFQ0soIHMyLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgQk9PU1RfQ0hFQ0soIXMyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyhzMy5pbV9vcHRpb25hbCA9PSAwKTsKIAotICAgIGFzc2VydCggczMuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgLy9hc3NlcnQoIHMzLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICBhc3NlcnQoIHMzLl9faXNzZXQuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydChzMy5pbV9vcHRpb25hbCA9PSAxMCk7Ci0gIH0KKyAgczEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIHdyaXRlX3RvX3JlYWQoczEsIHMzKTsKIAorICBCT09TVF9DSEVDSyhzMy5fX2lzc2V0LmltX2RlZmF1bHQpOworICAvLyBCT09TVF9DSEVDSyggczMuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgorICBCT09TVF9DSEVDSyhzMy5fX2lzc2V0LmltX29wdGlvbmFsKTsKKyAgQk9PU1RfQ0hFQ0soczMuaW1fb3B0aW9uYWwgPT0gMTApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzUpIHsKICAgLy8gV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCBkZWZhdWx0LgotICB7Ci0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwogCi0gICAgdDIuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICB3cml0ZV90b19yZWFkKHQyLCB0MSk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MSwgdDIpOwotICAgIGFzc2VydCghdDEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgICBhc3NlcnQoIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydCh0MS5pbV9kZWZhdWx0ID09IHQyLmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQodDEuaW1fZGVmYXVsdCA9PSAwKTsKLSAgfQorICBUcmlja3kxIHQxOworICBUcmlja3kyIHQyOwogCisgIHQyLmltX29wdGlvbmFsID0gMTA7CisgIHdyaXRlX3RvX3JlYWQodDIsIHQxKTsKKyAgd3JpdGVfdG9fcmVhZCh0MSwgdDIpOworICBCT09TVF9DSEVDSyghdDEuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHQxLmltX2RlZmF1bHQgPT0gdDIuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyh0MS5pbV9kZWZhdWx0ID09IDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzYpIHsKICAgLy8gV3JpdGluZyBiZXR3ZWVuIGRlZmF1bHQgYW5kIHJlcXVpcmVkLgotICB7Ci0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kzIHQzOwotICAgIHdyaXRlX3RvX3JlYWQodDEsIHQzKTsKLSAgICB3cml0ZV90b19yZWFkKHQzLCB0MSk7Ci0gICAgYXNzZXJ0KHQxLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gIH0KIAorICBUcmlja3kxIHQxOworICBUcmlja3kzIHQzOworICB3cml0ZV90b19yZWFkKHQxLCB0Myk7CisgIHdyaXRlX3RvX3JlYWQodDMsIHQxKTsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5pbV9kZWZhdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF83KSB7CiAgIC8vIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgcmVxdWlyZWQuCi0gIHsKLSAgICBUcmlja3kyIHQyOwotICAgIFRyaWNreTMgdDM7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MiwgdDMpOwotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQyKTsKLSAgfQogCisgIFRyaWNreTIgdDI7CisgIFRyaWNreTMgdDM7CisgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICB3cml0ZV90b19yZWFkKHQyLCB0Myk7CisgIHdyaXRlX3RvX3JlYWQodDMsIHQyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF84KSB7CiAgIC8vIE11LWh1LWhhLWhhLWhhIQotICB7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICBUcmlja3kzIHQzOwotICAgIHRyeSB7Ci0gICAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkge30KIAotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQyKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIFRyaWNreTIgdDI7CisgIFRyaWNreTMgdDM7CisgIHRyeSB7CisgICAgd3JpdGVfdG9fcmVhZCh0MiwgdDMpOworICAgIGFib3J0KCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRQcm90b2NvbEV4Y2VwdGlvbiYpIHsKICAgfQogCi0gIGNvdXQgPDwgIkNvbXBsZXggc3RydWN0LCBzaW1wbGUgdGVzdC4iIDw8IGVuZGw7Ci0gIHsKLSAgICBDb21wbGV4IGM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhjKSA8PCBlbmRsOwotICB9CisgIHdyaXRlX3RvX3JlYWQodDMsIHQyKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5pbV9vcHRpb25hbCk7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfOSkgeworICBDb21wbGV4IGM7CiAKLSAgewotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICAvLyBDb21waWxlIGVycm9yLgotICAgIC8vKHZvaWQpKHQxID09IHQyKTsKLSAgfQorICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIkNvbXBsZXgge1xuIgorICAgICIgIDAxOiBjcF9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogY3BfcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDA0OiB0aGVfbWFwIChtYXApID0gbWFwPGkxNixzdHJ1Y3Q+WzBdIHtcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDA1OiByZXFfc2ltcCAoc3RydWN0KSA9IFNpbXBsZSB7XG4iCisgICAgIiAgICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhjKSk7CiAKLSAgewotICAgIE9sZFNjaG9vbCBvMSwgbzIsIG8zOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuaW1faW50ID0gbzIuaW1faW50ID0gMTA7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5fX2lzc2V0LmltX2ludCA9IHRydWU7Ci0gICAgbzIuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLmltX2ludCA9IDIwOwotICAgIG8xLl9faXNzZXQuaW1faW50ID0gZmFsc2U7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMS5pbV9pbnQgPSAxMDsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLmltX3N0ciA9IG8yLmltX3N0ciA9ICJmb28iOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuX19pc3NldC5pbV9zdHIgPSBvMi5fX2lzc2V0LmltX3N0ciA9IHRydWU7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBtYXA8aW50MzJfdCxzdHJpbmc+IG15bWFwOwotICAgIG15bWFwWzFdID0gImJhciI7Ci0gICAgbXltYXBbMl0gPSAiYmF6IjsKLSAgICBvMS5pbV9iaWcucHVzaF9iYWNrKG1hcDxpbnQzMl90LHN0cmluZz4oKSk7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMi5pbV9iaWcucHVzaF9iYWNrKG1hcDxpbnQzMl90LHN0cmluZz4oKSk7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSA9PSBvMik7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCi0gICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7Ci0gICAgbzEud3JpdGUoJnByb3RvY29sKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTApIHsKKyAgVHJpY2t5MSB0MTsKKyAgVHJpY2t5MiB0MjsKKyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgLy8odm9pZCkodDEgPT0gdDIpOworfQogCi0gICAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgbXltYXBbM10gPSAicXV4IjsKLSAgICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8xLmltX2JpZy5iYWNrKClbM10gPSAicXV4IjsKLSAgICBhc3NlcnQobzEgPT0gbzIpOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMSkgeworICBPbGRTY2hvb2wgbzEsIG8yLCBvMzsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9pbnQgPSBvMi5pbV9pbnQgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5fX2lzc2V0LmltX2ludCA9IHRydWU7CisgIG8yLl9faXNzZXQuaW1faW50ID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuaW1faW50ID0gMjA7CisgIG8xLl9faXNzZXQuaW1faW50ID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLKG8xICE9IG8yKTsKKyAgbzEuaW1faW50ID0gMTA7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuaW1fc3RyID0gbzIuaW1fc3RyID0gImZvbyI7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuX19pc3NldC5pbV9zdHIgPSBvMi5fX2lzc2V0LmltX3N0ciA9IHRydWU7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+IG15bWFwOworICBteW1hcFsxXSA9ICJiYXIiOworICBteW1hcFsyXSA9ICJiYXoiOworICBvMS5pbV9iaWcucHVzaF9iYWNrKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPigpKTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMi5pbV9iaWcucHVzaF9iYWNrKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPigpKTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOwogCi0gICAgbzMucmVhZCgmcHJvdG9jb2wpOwotICAgIG8zLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSA9PSBvMyk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgbzEud3JpdGUoJnByb3RvY29sKTsKIAotICAgIC8vY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhvMykgPDwgZW5kbDsKLSAgfQorICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgbXltYXBbM10gPSAicXV4IjsKKyAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xICE9IG8yKTsKKyAgbzEuaW1fYmlnLmJhY2soKVszXSA9ICJxdXgiOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIAorICBvMy5yZWFkKCZwcm90b2NvbCk7CisgIG8zLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSA9PSBvMyk7CiAKLSAgewotICAgIFRyaWNreTIgdDEsIHQyOwotICAgIGFzc2VydCh0MS5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5pbV9vcHRpb25hbCA9IDU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0Mi5pbV9vcHRpb25hbCA9IDU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBhc3NlcnQodDEgIT0gdDIpOwotICAgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGFzc2VydCh0MSA9PSB0Mik7Ci0gICAgdDEuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBhc3NlcnQodDEgIT0gdDIpOwotICAgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSBmYWxzZTsKLSAgICBhc3NlcnQodDEgIT0gdDIpOwotICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT2xkU2Nob29sIHtcbiIKKyAgICAiICAwMTogaW1faW50IChpMTYpID0gMTAsXG4iCisgICAgIiAgMDI6IGltX3N0ciAoc3RyaW5nKSA9IFwiZm9vXCIsXG4iCisgICAgIiAgMDM6IGltX2JpZyAobGlzdCkgPSBsaXN0PG1hcD5bM10ge1xuIgorICAgICIgICAgWzBdID0gbWFwPGkzMixzdHJpbmc+WzBdIHtcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBbMV0gPSBtYXA8aTMyLHN0cmluZz5bMl0ge1xuIgorICAgICIgICAgICAxIC0+IFwiYmFyXCIsXG4iCisgICAgIiAgICAgIDIgLT4gXCJiYXpcIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBbMl0gPSBtYXA8aTMyLHN0cmluZz5bM10ge1xuIgorICAgICIgICAgICAxIC0+IFwiYmFyXCIsXG4iCisgICAgIiAgICAgIDIgLT4gXCJiYXpcIixcbiIKKyAgICAiICAgICAgMyAtPiBcInF1eFwiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobzMpKTsKIAotICByZXR1cm4gMDsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTIpIHsKKyAgVHJpY2t5MiB0MSwgdDI7CisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0MS5pbV9vcHRpb25hbCA9IDU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDIuaW1fb3B0aW9uYWwgPSA1OworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICBCT09TVF9DSEVDSyh0MSAhPSB0Mik7CisgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLmltX29wdGlvbmFsID0gMTA7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IGZhbHNlOworICBCT09TVF9DSEVDSyh0MSAhPSB0Mik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTMpIHsKKyAgT3B0aW9uYWxEZWZhdWx0IHQxLCB0MjsKKworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0Lm9wdF9pbnQgPT0gdHJ1ZSk7CisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQub3B0X3N0ciA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDEub3B0X2ludCA9PSB0Mi5vcHRfaW50KTsKKyAgQk9PU1RfQ0hFQ0sodDEub3B0X3N0ciA9PSB0Mi5vcHRfc3RyKTsKKworICB3cml0ZV90b19yZWFkKHQxLCB0Mik7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5vcHRfc3RyID09IHRydWUpOworICBCT09TVF9DSEVDSyh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOworICBCT09TVF9DSEVDSyh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT3B0aW9uYWxEZWZhdWx0IHtcbiIKKyAgICAiICAwMTogb3B0X2ludCAoaTE2KSA9IDEyMzQsXG4iCisgICAgIiAgMDI6IG9wdF9zdHIgKHN0cmluZykgPSBcImRlZmF1bHRcIixcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHQyKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMjM0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcApAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZWN1cnNpdmVUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzEpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CisKKyAgUmVjVHJlZSB0cmVlOworICBSZWNUcmVlIGNoaWxkOworICB0cmVlLmNoaWxkcmVuLnB1c2hfYmFjayhjaGlsZCk7CisKKyAgdHJlZS53cml0ZShwcm90LmdldCgpKTsKKworICBSZWNUcmVlIHJlc3VsdDsKKyAgcmVzdWx0LnJlYWQocHJvdC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLKHRyZWUgPT0gcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMikgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBSZWNMaXN0IGw7CisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gbDIobmV3IFJlY0xpc3QpOworICBsLm5leHRpdGVtID0gbDI7CisKKyAgbC53cml0ZShwcm90LmdldCgpKTsKKworICBSZWNMaXN0IHJlc3VsdGxpc3Q7CisgIHJlc3VsdGxpc3QucmVhZChwcm90LmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0socmVzdWx0bGlzdC5uZXh0aXRlbSAhPSBOVUxMKTsKKyAgQk9PU1RfQ0hFQ0socmVzdWx0bGlzdC5uZXh0aXRlbS0+bmV4dGl0ZW0gPT0gTlVMTCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzMpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7CisKKyAgQ29SZWMgYzsKKyAgc2hhcmVkX3B0cjxDb1JlYzI+IHIobmV3IENvUmVjMik7CisgIGMub3RoZXIgPSByOworCisgIGMud3JpdGUocHJvdC5nZXQoKSk7CisKKyAgYy5yZWFkKHByb3QuZ2V0KCkpOworICBCT09TVF9DSEVDSyhjLm90aGVyICE9IE5VTEwpOworICBCT09TVF9DSEVDSyhjLm90aGVyLT5vdGhlci5vdGhlciA9PSBOVUxMKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfNCkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBzaGFyZWRfcHRyPFJlY0xpc3Q+IGRlcHRoTGltaXQobmV3IFJlY0xpc3QpOworICBkZXB0aExpbWl0LT5uZXh0aXRlbSA9IGRlcHRoTGltaXQ7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGRlcHRoTGltaXQtPndyaXRlKHByb3QuZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKKworICBkZXB0aExpbWl0LT5uZXh0aXRlbS5yZXNldCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2EwNDJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgRVBTSUxPTiAwLjAwMDAwMDEKKyNpbmNsdWRlIDx0eXBlaW5kZXg+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5oIgordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cykgeworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkKKyAgICAgICAgICAgIC5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9saXN0KSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiBFWFBFQ1RFRF9ET1VCTEVfTElTVHsxLjAsLTEwMC4wLDEwMC4wLDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwtOTIyMzM3MjAzNjg1NDc3NTgwNy4wLAorICAgICAgICAzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzfTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1Quc2l6ZSgpLCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgRVhQRUNURURfRE9VQkxFX0xJU1Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUW2ldLCBFWFBFQ1RFRF9ET1VCTEVfTElTVFtpXSwgRVBTSUxPTik7CisgICAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyYTRmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU2VjdXJpdHlUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKKwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIGtleURpciAvIGZpbGVuYW1lOworfQorYm9vc3Q6Om11dGV4IGdNdXRleDsKKworc3RydWN0IEdsb2JhbEZpeHR1cmUKK3sKKyAgICBHbG9iYWxGaXh0dXJlKCkKKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICB7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiYXJndlslMSVdID0gXCIlMiVcIiIpICUgaSAlIG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndltpXSk7CisgICAgfQorCisgICAgI2lmZGVmIF9fbGludXhfXworICAgIC8vIE9wZW5TU0wgY2FsbHMgc2VuZCgpIHdpdGhvdXQgTVNHX05PU0lHUElQRSBzbyB3cml0aW5nIHRvIGEgc29ja2V0IHRoYXQgaGFzCisgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgICNlbmRpZgorCisgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmN1cnJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpIC8gInRlc3QiIC8gImtleXMiOworICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICB7CisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOworICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgeworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgdGVzdCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVzdCBjZXJ0aWZpY2F0ZShzKS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZSgpCisgICAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmNsZWFudXBPcGVuU1NMKCk7CisjaWZkZWYgX19saW51eF9fCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworI2VuZGlmCisgICAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpCisjZW5kaWYKKworc3RydWN0IFNlY3VyaXR5Rml4dHVyZQoreworICAgIHZvaWQgc2VydmVyKGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sIHByb3RvY29sKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNlcnZlclNvY2tldD4gcFNlcnZlclNvY2tldDsKKworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihwcm90b2NvbCkpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KSk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNvbm5lY3RlZENsaWVudDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFNlcnZlclNvY2tldC0+bGlzdGVuKCk7CisgICAgICAgICAgICAgICAgbVBvcnQgPSBwU2VydmVyU29ja2V0LT5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgbUNWYXIubm90aWZ5X29uZSgpOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQgPSBwU2VydmVyU29ja2V0LT5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZlsyXTsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnTyc7CisgICAgICAgICAgICAgICAgYnVmWzFdID0gJ0snOworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC0+d3JpdGUoJmJ1ZlswXSwgMik7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT5mbHVzaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaCAoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKGdNdXRleCk7CisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlNSViAlMSUgRXhjZXB0aW9uOiAlMiUiKSAlIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgJSBleC53aGF0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29ubmVjdGVkQ2xpZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNlcnZlclNvY2tldC0+Y2xvc2UoKTsKKyAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsaWVudChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gcENsaWVudFNvY2tldDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihwcm90b2NvbCkpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoImNsaWVudC5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoImNsaWVudC5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBtUG9ydCk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldC0+b3BlbigpOworCisgICAgICAgICAgICAgICAgdWludDhfdCBidWZbM107CisgICAgICAgICAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgICAgICAgICAgICBidWZbMV0gPSAwOworICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBDbGllbnRTb2NrZXQtPnJlYWQoJmJ1ZlswXSwgMikpOworICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIG1lbWNtcCgmYnVmWzBdLCAiT0siLCAyKSk7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKGdNdXRleCk7CisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIkNMSSAlMSUgRXhjZXB0aW9uOiAlMiUiKSAlIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCkgJSBleC53aGF0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocENsaWVudFNvY2tldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcHJvdG9jb2wyc3RyKHNpemVfdCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdzW2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVCArIDFdID0KKyAgICAgICAgeworICAgICAgICAgICAgICAgICJTU0xUTFMiLAorICAgICAgICAgICAgICAgICJTU0x2MiIsCisgICAgICAgICAgICAgICAgIlNTTHYzIiwKKyAgICAgICAgICAgICAgICAiVExTdjFfMCIsCisgICAgICAgICAgICAgICAgIlRMU3YxXzEiLAorICAgICAgICAgICAgICAgICJUTFN2MV8yIgorICAgICAgICB9OworICAgICAgICByZXR1cm4gc3RyaW5nc1twcm90b2NvbF07CisgICAgfQorCisgICAgYm9vc3Q6Om11dGV4IG1NdXRleDsKKyAgICBib29zdDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DVmFyOworICAgIGludCBtUG9ydDsKKyAgICBib29sIG1Db25uZWN0ZWQ7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoQk9PU1RfVEVTVF9NT0RVTEUsIFNlY3VyaXR5Rml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc3NsX3NlY3VyaXR5X21hdHJpeCkKK3sKKyAgICB0cnkKKyAgICB7CisgICAgICAgIC8vIG1hdHJpeCBvZiBjb25uZWN0aW9uIHN1Y2Nlc3MgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciB3aXRoIGRpZmZlcmVudCBTU0xQcm90b2NvbCBzZWxlY3Rpb25zCisgICAgICAgIGJvb2wgbWF0cml4W2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVCArIDFdW2FwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVCArIDFdID0KKyAgICAgICAgeworICAgIC8vICAgc2VydmVyICAgID0gU1NMVExTICAgU1NMdjIgICAgU1NMdjMgICAgVExTdjFfMCAgVExTdjFfMSAgVExTdjFfMgorICAgIC8vIGNsaWVudAorICAgIC8qIFNTTFRMUyAgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgdHJ1ZSwgICAgdHJ1ZSAgICB9LAorICAgIC8qIFNTTHYyICAgKi8gIHsgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UgICB9LAorICAgIC8qIFNTTHYzICAgKi8gIHsgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UgICB9LAorICAgIC8qIFRMU3YxXzAgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UgICB9LAorICAgIC8qIFRMU3YxXzEgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSwgICAgZmFsc2UgICB9LAorICAgIC8qIFRMU3YxXzIgKi8gIHsgdHJ1ZSwgICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgZmFsc2UsICAgdHJ1ZSAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3Qgc2kgPSAwOyBzaSA8PSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1Q7ICsrc2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGNpID0gMDsgY2kgPD0gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUOyArK2NpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzaSA9PSAxIHx8IGNpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFsbCBTU0x2MiBjYXNlcyAtIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgT1BFTlNTTF9OT19TU0wzCisgICAgICAgICAgICAgICAgaWYgKHNpID09IDIgfHwgY2kgPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIFNTTHYzIGNhc2VzIC0gcHJvdG9jb2wgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlRFU1Q6IFNlcnZlciA9ICUxJSwgQ2xpZW50ID0gJTIlIikKKyAgICAgICAgICAgICAgICAgICAgJSBwcm90b2NvbDJzdHIoc2kpICUgcHJvdG9jb2wyc3RyKGNpKSk7CisKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gdGhyZWFkX2dyb3VwIG1hbmFnZXMgdGhlIHRocmVhZCBsaWZldGltZSAtIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGNyZWF0ZV90aHJlYWQKKyAgICAgICAgICAgICAgICBib29zdDo6dGhyZWFkX2dyb3VwIHRocmVhZHM7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6c2VydmVyLCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oc2kpKSk7CisgICAgICAgICAgICAgICAgbUNWYXIud2FpdChsb2NrKTsgICAgICAgICAgIC8vIHdhaXQgZm9yIGxpc3RlbigpIHRvIHN1Y2NlZWQKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICh2b2lkKXRocmVhZHMuY3JlYXRlX3RocmVhZChiaW5kKCZTZWN1cml0eUZpeHR1cmU6OmNsaWVudCwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KGNpKSkpOworICAgICAgICAgICAgICAgIHRocmVhZHMuam9pbl9hbGwoKTsKKworICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX01FU1NBR0UobUNvbm5lY3RlZCA9PSBtYXRyaXhbY2ldW3NpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojpmb3JtYXQoIiAgICAgIFNlcnZlciA9ICUxJSwgQ2xpZW50ID0gJTIlIGV4cGVjdGVkIG1Db25uZWN0ZWQgPT0gJTMlIGJ1dCB3YXMgJTQlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHByb3RvY29sMnN0cihzaSkgJSBwcm90b2NvbDJzdHIoY2kpICUgbWF0cml4W2NpXVtzaV0gJSBtQ29ubmVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQorICAgIHsKKyAgICAgICAgQk9PU1RfRkFJTChib29zdDo6Zm9ybWF0KCIlMSU6ICUyJSIpICUgdHlwZWlkKGV4KS5uYW1lKCkgJSBleC53aGF0KCkpOworICAgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCmluZGV4IGZhZTFkMzIuLjAwODgzN2QgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCkBAIC0xLDMwICsxLDMwIEBACi0jaW5jbHVkZSA8aW9zdHJlYW0+CisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiAjaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaD4KIAotdXNpbmcgc3RkOjpjb3V0OwotdXNpbmcgc3RkOjplbmRsOwogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiAKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU3BlY2lhbGl6YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gTXlQcm90b2NvbDsKLS8vdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IE15UHJvdG9jb2w7CisvLyB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gTXlQcm90b2NvbDsKIAotaW50IG1haW4oKSB7Ci0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3BlY2lhbGl6YXRpb25fMSkgewogICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKKyAgb29lLmltX3RydWUgPSB0cnVlOworICBvb2UuaW1fZmFsc2UgPSBmYWxzZTsKKyAgb29lLmFfYml0ZSA9IDB4N2Y7CiAgIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgb29lLmludGVnZXIzMiA9IDE8PDI0OworICBvb2UuaW50ZWdlcjMyID0gMSA8PCAyNDsKICAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CiAgIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7CisgIG9vZS5zb21lX2NoYXJhY3RlcnMgPSAiSlNPTiBUSElTISBcIlwxIjsKKyAgb29lLnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKICAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKIAogICBOZXN0aW5nIG47CkBAIC0zMiwxMiArMzIsMTQgQEAKICAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7CiAgIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwogICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNSkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7CisgIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKKyAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMFx4ZDBceDlkXHhjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGIwXHhjZlx4ODFceGUyXHg4NFx4OGVceDIwXHhjZVx4OTFceDc0XHg3NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi5teV9ib25rLnR5cGUgPSAzMTMzNzsKICAgbi5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7CiAKICAgSG9seU1vbGV5IGhtOwpAQCAtNjEsNDggKzYzLDQxIEBACiAKICAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwogICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSAxOwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2FpdC4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSAyOwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2hhdD8iOwogICBobS5ib25rc1sic29tZXRoaW5nIl0gPSBzdGFnZTI7CiAgIHN0YWdlMi5jbGVhcigpOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOwogICBzdGFnZTIuYmFjaygpLnR5cGUgPSA0OwogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAidGhlIHJhdmVuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gNTsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7CiAgIGhtLmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8obmV3IE15UHJvdG9jb2woYnVmZmVyKSk7Ci0KLSAgY291dCA8PCAiVGVzdGluZyBvb2UiIDw8IGVuZGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvKG5ldyBNeVByb3RvY29sKGJ1ZmZlcikpOwogCiAgIG9vZS53cml0ZShwcm90by5nZXQoKSk7CiAgIE9uZU9mRWFjaCBvb2UyOwogICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChvb2UgPT0gb29lMik7Ci0KLQotICBjb3V0IDw8ICJUZXN0aW5nIGhtIiA8PCBlbmRsOworICBCT09TVF9DSEVDSyhvb2UgPT0gb29lMik7CiAKICAgaG0ud3JpdGUocHJvdG8uZ2V0KCkpOwogICBIb2x5TW9sZXkgaG0yOwogICBobTIucmVhZChwcm90by5nZXQoKSk7CiAKLSAgYXNzZXJ0KGhtID09IGhtMik7CisgIEJPT1NUX0NIRUNLKGhtID09IGhtMik7CiAKICAgaG0yLmJpZ1swXS5hX2JpdGUgPSAweDAwOwogCi0gIGFzc2VydChobSAhPSBobTIpOwotCi0gIHJldHVybiAwOworICBCT09TVF9DSEVDSyhobSAhPSBobTIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcAppbmRleCAxYTA1NTJhLi40MzAzMDJjIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcApAQCAtMTksMTUgKzE5LDE2IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0OjpUU2hvcnRSZWFkVHJhbnNwb3J0OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIC8vIFNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIFpsaWJUcmFuc3BvcnQuICBUT0RPOiByZWZhY3Rvci4KIHVuc2lnbmVkIGludCBkaXN0W11bNTAwMF0gPSB7CkBAIC0zNDksNyArMzUwLDcgQEAKICAgICAgIGludCB3cml0ZV9pbmRleCA9IDA7CiAgICAgICB1bnNpZ25lZCBpbnQgdG9fd3JpdGUgPSAoMTw8MTQpLTQyOwogICAgICAgd2hpbGUgKHRvX3dyaXRlID4gMCkgewotICAgICAgICBpbnQgd3JpdGVfYW10ID0gc3RkOjptaW4oZGlzdFtkMV1bd3JpdGVfaW5kZXhdLCB0b193cml0ZSk7CisgICAgICAgIGludCB3cml0ZV9hbXQgPSAoc3RkOjptaW4pKGRpc3RbZDFdW3dyaXRlX2luZGV4XSwgdG9fd3JpdGUpOwogICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbd3JpdGVfb2Zmc2V0XSwgd3JpdGVfYW10KTsKICAgICAgICAgd3JpdGVfb2Zmc2V0ICs9IHdyaXRlX2FtdDsKICAgICAgICAgd3JpdGVfaW5kZXgrKzsKQEAgLTM2MCw3ICszNjEsNyBAQAogICAgICAgaW50IHJlYWRfaW5kZXggPSAwOwogICAgICAgdW5zaWduZWQgaW50IHRvX3JlYWQgPSAoMTw8MTMpLTQyOwogICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKSB7Ci0gICAgICAgIGludCByZWFkX2FtdCA9IHN0ZDo6bWluKGRpc3RbZDJdW3JlYWRfaW5kZXhdLCB0b19yZWFkKTsKKyAgICAgICAgaW50IHJlYWRfYW10ID0gKHN0ZDo6bWluKShkaXN0W2QyXVtyZWFkX2luZGV4XSwgdG9fcmVhZCk7CiAgICAgICAgIGludCBnb3QgPSBidWZmZXIucmVhZCgmZGF0YV9vdXRbcmVhZF9vZmZzZXRdLCByZWFkX2FtdCk7CiAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgcmVhZF9hbXQpOwogICAgICAgICByZWFkX29mZnNldCArPSByZWFkX2FtdDsKQEAgLTM3NCw3ICszNzUsNyBAQAogICAgICAgaW50IHNlY29uZF9pbmRleCA9IHdyaXRlX2luZGV4LTE7CiAgICAgICB1bnNpZ25lZCBpbnQgdG9fc2Vjb25kID0gKDE8PDE0KSs0MjsKICAgICAgIHdoaWxlICh0b19zZWNvbmQgPiAwKSB7Ci0gICAgICAgIGludCBzZWNvbmRfYW10ID0gc3RkOjptaW4oZGlzdFtkMV1bc2Vjb25kX2luZGV4XSwgdG9fc2Vjb25kKTsKKyAgICAgICAgaW50IHNlY29uZF9hbXQgPSAoc3RkOjptaW4pKGRpc3RbZDFdW3NlY29uZF9pbmRleF0sIHRvX3NlY29uZCk7CiAgICAgICAgIC8vcHJpbnRmKCIlZFxuIiwgc2Vjb25kX2FtdCk7CiAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtzZWNvbmRfb2Zmc2V0XSwgc2Vjb25kX2FtdCk7CiAgICAgICAgIHNlY29uZF9vZmZzZXQgKz0gc2Vjb25kX2FtdDsKQEAgLTU2Niw3ICs1NjcsNyBAQAogICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKICAgICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoMTYpKTsKICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOwotICAgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV9vdXQoMTw8MTcsIDApOwogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGZsdXNoX3NpemVzOwogCiAgICAgICAgIGludCB3cml0ZV9vZmZzZXQgPSAwOwpAQCAtNjA0LDcgKzYwNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBCT09TVF9DSEVDS19FUVVBTCgodW5zaWduZWQgaW50KXJlYWRfb2Zmc2V0LCBzaXplb2YoZGF0YSkpOwotICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCAmZGF0YV9vdXRbMF0sIHNpemVvZihkYXRhKSkpOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCmluZGV4IDFlYzUzOGUuLjBiYTAzNWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTE5LDM4ICsxOSwzMiBAQAogCiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRGRFRyYW5zcG9ydFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKy8vIERpc2FibGVkIG9uIE1TVkMgYmVjYXVzZSB0aGUgUlRMIGFzc2VydHMgb24gYW4gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKKy8vIGluIGJvdGggZGVidWcgYW5kIHJlbGVhc2UgbW9kZTsgYXQgbGVhc3QgaW4gTVNWQ1IxMDAgKFZpc3VhbCBTdHVkaW8gMjAxMCkKKyNpZiAhZGVmaW5lZChXSU4zMikKKwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKIAotY2xhc3MgRHVtbXlFeGNlcHRpb24gOiBzdGQ6OmV4Y2VwdGlvbiB7Ci19OwotCi1pbnQgbWFpbigpIHsKLSAgewotICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpOT19DTE9TRV9PTl9ERVNUUk9ZKTsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgIH0KLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIHsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgICAgdGhyb3cgRHVtbXlFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgc3RkOjphYm9ydCgpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgewotICAgIGFib3J0KCk7Ci0gIH0gY2F0Y2ggKER1bW15RXhjZXB0aW9uJikgewotICB9Ci0KLSAgcmV0dXJuIDA7Ci0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0XzEpIHsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpKTsKIH0KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfMikgeworICBURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHQuY2xvc2UoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKKyNlbHNlCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0X2R1bW15KSB7CisgIEJPT1NUX0NIRUNLKHRydWUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggNjI2MDA5NC4uZDBjMjZiMyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTIwLDExICsyMCwyMyBAQAogI2RlZmluZSBfR05VX1NPVVJDRSAvLyBuZWVkZWQgZm9yIGdldG9wdF9sb25nCiAjZW5kaWYKIAorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorCisjaWZkZWYgX19NSU5HVzMyX18KKyAgI2luY2x1ZGUgPGlvLmg+CisgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8ZmNudGwuaD4KKyAgI2luY2x1ZGUgPHN5c1xzdGF0Lmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKQEAgLTM3LDMwICs0OSwxNSBAQAogY2xhc3MgRnN5bmNMb2c7CiBGc3luY0xvZyogZnN5bmNfbG9nOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSGVscGVyIGNvZGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLy8gUHJvdmlkZSBCT09TVF9DSEVDS19MVCgpIGFuZCBCT09TVF9DSEVDS19HVCgpLCBpbiBjYXNlIHdlJ3JlIGNvbXBpbGVkCi0vLyB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgYm9vc3QKLSNpZm5kZWYgQk9PU1RfQ0hFQ0tfTFQKLSNkZWZpbmUgQk9PU1RfQ0hFQ0tfQ01QKGEsIGIsIG9wLCBjaGVja19mbikgXAotICBjaGVja19mbigoYSkgb3AgKGIpLCBcCi0gICAgICAgICAgICJjaGVjayAiIEJPT1NUX1NUUklOR0laRShhKSAiICIgQk9PU1RfU1RSSU5HSVpFKG9wKSAiICIgXAotICAgICAgICAgICBCT09TVF9TVFJJTkdJWkUoYikgIiBmYWlsZWQ6ICIgQk9PU1RfU1RSSU5HSVpFKGEpICI9IiA8PCAoYSkgPDwgXAotICAgICAgICAgICAiICIgQk9PU1RfU1RSSU5HSVpFKGIpICI9IiA8PCAoYikpCi0KLSNkZWZpbmUgQk9PU1RfQ0hFQ0tfTFQoYSwgYikgQk9PU1RfQ0hFQ0tfQ01QKGEsIGIsIDwsIEJPT1NUX0NIRUNLX01FU1NBR0UpCi0jZGVmaW5lIEJPT1NUX0NIRUNLX0dUKGEsIGIpIEJPT1NUX0NIRUNLX0NNUChhLCBiLCA+LCBCT09TVF9DSEVDS19NRVNTQUdFKQotI2RlZmluZSBCT09TVF9SRVFVSVJFX0xUKGEsIGIpIEJPT1NUX0NIRUNLX0NNUChhLCBiLCA8LCBCT09TVF9SRVFVSVJFX01FU1NBR0UpCi0jZW5kaWYgLy8gQk9PU1RfQ0hFQ0tfTFQKLQogLyoqCiAgKiBDbGFzcyB0byByZWNvcmQgY2FsbHMgdG8gZnN5bmMKICAqLwogY2xhc3MgRnN5bmNMb2cgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgc3RydWN0IEZzeW5jQ2FsbCB7CiAgICAgc3RydWN0IHRpbWV2YWwgdGltZTsKICAgICBpbnQgZmQ7CkBAIC03MCwxNyArNjcsMTUgQEAKICAgRnN5bmNMb2coKSB7fQogCiAgIHZvaWQgZnN5bmMoaW50IGZkKSB7Ci0gICAgKHZvaWQpIGZkOworICAgICh2b2lkKWZkOwogICAgIEZzeW5jQ2FsbCBjYWxsOwotICAgIGdldHRpbWVvZmRheSgmY2FsbC50aW1lLCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZjYWxsLnRpbWUsIE5VTEwpOwogICAgIGNhbGxzXy5wdXNoX2JhY2soY2FsbCk7CiAgIH0KIAotICBjb25zdCBDYWxsTGlzdCogZ2V0Q2FsbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICZjYWxsc187Ci0gIH0KKyAgY29uc3QgQ2FsbExpc3QqIGdldENhbGxzKCkgY29uc3QgeyByZXR1cm4gJmNhbGxzXzsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIENhbGxMaXN0IGNhbGxzXzsKIH07CiAKQEAgLTg4LDggKzgzLDIyIEBACiAgKiBIZWxwZXIgY2xhc3MgdG8gY2xlYW4gdXAgdGVtcG9yYXJ5IGZpbGVzCiAgKi8KIGNsYXNzIFRlbXBGaWxlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlbXBGaWxlKGNvbnN0IGNoYXIqIGRpcmVjdG9yeSwgY29uc3QgY2hhciogcHJlZml4KSB7CisgICNpZmRlZiBfX01JTkdXMzJfXworICAgICgodm9pZClkaXJlY3RvcnkpOworICAgIHNpemVfdCBwYXRoX2xlbiA9IHN0cmxlbihwcmVmaXgpICsgODsKKyAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKKyAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlc1hYWFhYWCIsIHByZWZpeCk7CisgICAgaWYgKF9ta3RlbXBfcyhwYXRoXyxwYXRoX2xlbikgPT0gMCkgeworICAgICAgZmRfID0gb3BlbihwYXRoXyxPX0NSRUFUIHwgT19SRFdSIHwgT19CSU5BUlksU19JUkVBRCB8IFNfSVdSSVRFKTsKKyAgICAgIGlmIChmZF8gPCAwKSB7CisgICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJfbWt0ZW1wX3MoKSBmYWlsZWQiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIl9ta3RlbXBfcygpIGZhaWxlZCIpOworICAgIH0KKyAgI2Vsc2UKICAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4oZGlyZWN0b3J5KSArIHN0cmxlbihwcmVmaXgpICsgODsKICAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKICAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlcy8lc1hYWFhYWCIsIGRpcmVjdG9yeSwgcHJlZml4KTsKQEAgLTk4LDYgKzEwNyw3IEBACiAgICAgaWYgKGZkXyA8IDApIHsKICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJta3N0ZW1wKCkgZmFpbGVkIik7CiAgICAgfQorICAjZW5kaWYKICAgfQogCiAgIH5UZW1wRmlsZSgpIHsKQEAgLTEwNSwxMyArMTE1LDkgQEAKICAgICBjbG9zZSgpOwogICB9CiAKLSAgY29uc3QgY2hhciogZ2V0UGF0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcGF0aF87Ci0gIH0KKyAgY29uc3QgY2hhciogZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9CiAKLSAgaW50IGdldEZEKCkgY29uc3QgewotICAgIHJldHVybiBmZF87Ci0gIH0KKyAgaW50IGdldEZEKCkgY29uc3QgeyByZXR1cm4gZmRfOyB9CiAKICAgdm9pZCB1bmxpbmsoKSB7CiAgICAgaWYgKHBhdGhfKSB7CkBAIC0xMzAsNyArMTM2LDcgQEAKICAgICBmZF8gPSAtMTsKICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGNoYXIqIHBhdGhfOwogICBpbnQgZmRfOwogfTsKQEAgLTEzOCw4ICsxNDQsNyBAQAogLy8gVXNlIG91ciBvd24gdmVyc2lvbiBvZiBmc3luYygpIGZvciB0ZXN0aW5nLgogLy8gVGhpcyByZXR1cm5zIGltbWVkaWF0ZWx5LCBzbyB0aW1pbmcgaW4gdGVzdF9kZXN0cnVjdG9yKCkgaXNuJ3QgYWZmZWN0ZWQgYnkKIC8vIHdhaXRpbmcgb24gdGhlIGFjdHVhbCBmaWxlc3lzdGVtLgotZXh0ZXJuICJDIgotaW50IGZzeW5jKGludCBmZCkgeworZXh0ZXJuICJDIiBpbnQgZnN5bmMoaW50IGZkKSB7CiAgIGlmIChmc3luY19sb2cpIHsKICAgICBmc3luY19sb2ctPmZzeW5jKGZkKTsKICAgfQpAQCAtMTUwLDcgKzE1NSw2IEBACiAgIHJldHVybiAodDItPnR2X3VzZWMgLSB0MS0+dHZfdXNlYykgKyAodDItPnR2X3NlYyAtIHQxLT50dl9zZWMpICogMTAwMDAwMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRlc3QgY2FzZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3Miw3ICsxNzYsNyBAQAogCiAgIHVuc2lnbmVkIGludCBudW1fb3ZlciA9IDA7CiAgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgTlVNX0lURVJBVElPTlM7ICsrbikgewotICAgIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApKTsKIAogICAgIFRGaWxlVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBuZXcgVEZpbGVUcmFuc3BvcnQoZi5nZXRQYXRoKCkpOwogCkBAIC0xOTEsMzcgKzE5NSwzNiBAQAogICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwogICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKIAotICAgIGdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnN0YXJ0LCBOVUxMKTsKICAgICBkZWxldGUgdHJhbnNwb3J0OwotICAgIGdldHRpbWVvZmRheSgmZW5kLCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOwogCiAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKCZzdGFydCwgJmVuZCk7CiAKLSAgICAvLyBJZiBhbnkgYXR0ZW1wdCB0YWtlcyBtb3JlIHRoYW4gMTAwbXMsIHRyZWF0IHRoYXQgYXMgYSBmYWlsdXJlLgorICAgIC8vIElmIGFueSBhdHRlbXB0IHRha2VzIG1vcmUgdGhhbiA1MDBtcywgdHJlYXQgdGhhdCBhcyBhIGZhaWx1cmUuCiAgICAgLy8gVHJlYXQgdGhpcyBhcyBhIGZhdGFsIGZhaWx1cmUsIHNvIHdlJ2xsIHJldHVybiBub3cgaW5zdGVhZCBvZgogICAgIC8vIGxvb3Bpbmcgb3ZlciBhIHZlcnkgc2xvdyBvcGVyYXRpb24uCi0gICAgQk9PU1RfUkVRVUlSRV9MVChkZWx0YSwgMTAwMDAwKTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDUwMDAwMCApOwogCi0gICAgLy8gTm9ybWFsbHksIGl0IHRha2VzIGxlc3MgdGhhbiAxMDAwdXMgb24gbXkgZGV2IGJveC4KKyAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDEwMG1zIG9uIG15IGRldiBib3guCiAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zCiAgICAgLy8gdGFrZSBsb25nZXIsIHNpbmNlIHdlJ3JlIGp1c3Qgd2FpdGluZyBmb3Igb3VyIHR1cm4gb24gdGhlIENQVS4KLSAgICBpZiAoZGVsdGEgPiAxMDAwKSB7CisgICAgaWYgKGRlbHRhID4gMTAwMDAwKSB7CiAgICAgICArK251bV9vdmVyOwogICAgIH0KICAgfQogCiAgIC8vIE1ha2Ugc3VyZSBmZXdlciB0aGFuIDEwJSBvZiB0aGUgcnVucyB0b29rIGxvbmdlciB0aGFuIDEwMDB1cwotICBCT09TVF9DSEVDSyhudW1fb3ZlciA8IChOVU1fSVRFUkFUSU9OUyAvIDEwKSk7CisgIEJPT1NUX1dBUk4obnVtX292ZXIgPCAoTlVNX0lURVJBVElPTlMgLyAxMCkpOwogfQogCiAvKioKICAqIE1ha2Ugc3VyZSBzZXRGbHVzaE1heFVzKCkgaXMgaG9ub3JlZC4KICAqLwotdm9pZCB0ZXN0X2ZsdXNoX21heF91c19pbXBsKHVpbnQzMl90IGZsdXNoX3VzLCB1aW50MzJfdCB3cml0ZV91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0ZXN0X3VzKSB7Cit2b2lkIHRlc3RfZmx1c2hfbWF4X3VzX2ltcGwodWludDMyX3QgZmx1c2hfdXMsIHVpbnQzMl90IHdyaXRlX3VzLCB1aW50MzJfdCB0ZXN0X3VzKSB7CiAgIC8vIFRGaWxlVHJhbnNwb3J0IG9ubHkgY2FsbHMgZnN5bmMoKSBpZiBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sCiAgIC8vIHNvIG1ha2Ugc3VyZSB0aGUgd3JpdGUgaW50ZXJ2YWwgaXMgc21hbGxlciB0aGFuIHRoZSBmbHVzaCBpbnRlcnZhbC4KLSAgQk9PU1RfUkVRVUlSRSh3cml0ZV91cyA8IGZsdXNoX3VzKTsKKyAgQk9PU1RfV0FSTih3cml0ZV91cyA8IGZsdXNoX3VzKTsKIAogICBUZW1wRmlsZSBmKHRtcF9kaXIsICJ0aHJpZnQuVEZpbGVUcmFuc3BvcnRUZXN0LiIpOwogCkBAIC0yNzMsMTYgKzI3NiwxMyBAQAogICBjb25zdCBGc3luY0xvZzo6Q2FsbExpc3QqIGNhbGxzID0gbG9nLmdldENhbGxzKCk7CiAgIC8vIFdlIGFkZGVkIDEgZnN5bmMgY2FsbCBhYm92ZS4KICAgLy8gTWFrZSBzdXJlIFRGaWxlVHJhbnNwb3J0IGNhbGxlZCBmc3luYyBhdCBsZWFzdCBvbmNlCi0gIEJPT1NUX0NIRUNLX0dUKGNhbGxzLT5zaXplKCksCi0gICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZzeW5jTG9nOjpDYWxsTGlzdDo6c2l6ZV90eXBlPigxKSk7CisgIEJPT1NUX1dBUk5fR0UoY2FsbHMtPnNpemUoKSwgc3RhdGljX2Nhc3Q8RnN5bmNMb2c6OkNhbGxMaXN0OjpzaXplX3R5cGU+KDEpKTsKIAogICBjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHJldl90aW1lID0gTlVMTDsKLSAgZm9yIChGc3luY0xvZzo6Q2FsbExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2FsbHMtPmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gY2FsbHMtPmVuZCgpOwotICAgICAgICsraXQpIHsKKyAgZm9yIChGc3luY0xvZzo6Q2FsbExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2FsbHMtPmJlZ2luKCk7IGl0ICE9IGNhbGxzLT5lbmQoKTsgKytpdCkgewogICAgIGlmIChwcmV2X3RpbWUpIHsKICAgICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZihwcmV2X3RpbWUsICZpdC0+dGltZSk7Ci0gICAgICBCT09TVF9DSEVDS19MVChkZWx0YSwgbWF4X2FsbG93ZWRfZGVsdGEpOworICAgICAgQk9PU1RfV0FSTiggZGVsdGEgPCBtYXhfYWxsb3dlZF9kZWx0YSApOwogICAgIH0KICAgICBwcmV2X3RpbWUgPSAmaXQtPnRpbWU7CiAgIH0KQEAgLTMxOCwxMyArMzE4LDEzIEBACiAgIHRyYW5zcG9ydC53cml0ZShidWYsIDEpOwogCiAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwotICBnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmc3RhcnQsIE5VTEwpOwogCiAgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgMTA7ICsrbikgewogICAgIHRyYW5zcG9ydC5mbHVzaCgpOwogCiAgICAgc3RydWN0IHRpbWV2YWwgbm93OwotICAgIGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZub3csIE5VTEwpOwogCiAgICAgLy8gRmFpbCBpZiBhdCBhbnkgcG9pbnQgd2UndmUgYmVlbiBydW5uaW5nIGZvciBsb25nZXIgdGhhbiBoYWxmIGEgc2Vjb25kLgogICAgIC8vIChXaXRoIHRoZSBidWdneSBjb2RlLCBURmlsZVRyYW5zcG9ydCB1c2VkIHRvIHRha2UgMyBzZWNvbmRzIHBlciBmbHVzaCgpKQpAQCAtMzMyLDcgKzMzMiw3IEBACiAgICAgLy8gVXNlIGEgZmF0YWwgZmFpbCBzbyB3ZSBicmVhayBvdXQgZWFybHksIHJhdGhlciB0aGFuIGNvbnRpbnVpbmcgdG8gbWFrZQogICAgIC8vIG1hbnkgbW9yZSBzbG93IGZsdXNoKCkgY2FsbHMuCiAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKCZzdGFydCwgJm5vdyk7Ci0gICAgQk9PU1RfUkVRVUlSRV9MVChkZWx0YSwgNTAwMDAwKTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDIwMDAwMDAgKTsKICAgfQogfQogCkBAIC0zNDgsMTEgKzM0OCw4IEBACiB9CiAKIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7Ci0gICAgeyAiaGVscCIsIGZhbHNlLCBOVUxMLCAnaCcgfSwKLSAgICB7ICJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnIH0sCi0gICAgeyBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgfTsKKyAgc3RydWN0IG9wdGlvbiBsb25nX29wdHNbXQorICAgICAgPSB7eyJoZWxwIiwgZmFsc2UsIE5VTEwsICdoJ30sIHsidG1wLWRpciIsIHRydWUsIE5VTEwsICd0J30sIHtOVUxMLCAwLCBOVUxMLCAwfX07CiAKICAgd2hpbGUgKHRydWUpIHsKICAgICBvcHRvcHQgPSAxOwpAQCAtMzYyLDI4ICszNTksNDYgQEAKICAgICB9CiAKICAgICBzd2l0Y2ggKG9wdGNoYXIpIHsKLSAgICAgIGNhc2UgJ3QnOgotICAgICAgICB0bXBfZGlyID0gb3B0YXJnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2gnOgotICAgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDApOwotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAotICAgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOwotICAgICAgICBleGl0KDEpOworICAgIGNhc2UgJ3QnOgorICAgICAgdG1wX2RpciA9IG9wdGFyZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgcHJpbnRfdXNhZ2Uoc3Rkb3V0LCBhcmd2WzBdKTsKKyAgICAgIGV4aXQoMCk7CisgICAgY2FzZSAnPyc6CisgICAgICBleGl0KDEpOworICAgIGRlZmF1bHQ6CisgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAorICAgICAgLy8gYnV0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRvIGhhbmRsZSBpdC4KKyAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBvcHRpb24gXCItJWNcIlxuIiwgb3B0Y2hhcik7CisgICAgICBleGl0KDEpOwogICAgIH0KICAgfQogfQogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworc3RhdGljIGludCBteUFyZ2MgPSAwOworc3RhdGljIGNoYXIgKipteUFyZ3YgPSBOVUxMOworCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CisKKyAgLy8gUGFyc2UgYXJndW1lbnRzCisgIHBhcnNlX2FyZ3MobXlBcmdjLG15QXJndik7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgbXlBcmdjID0gYXJnYzsKKyAgbXlBcmd2ID0gYXJndjsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQogYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0KLSAgICAiVEZpbGVUcmFuc3BvcnRUZXN0IjsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJURmlsZVRyYW5zcG9ydFRlc3QiOwogCiAgIC8vIFBhcnNlIGFyZ3VtZW50cwogICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKaW5kZXggMzcxMTk3MC4uOTIwNjg3MiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCkBAIC0yMCw4OSArMjAsMTQxIEBACiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKIAotQk9PU1RfQVVUT19URVNUX1NVSVRFKCBUTWVtb3J5QnVmZmVyVGVzdCApCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE1lbW9yeUJ1ZmZlclRlc3QpCiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X3JvdW5kdHJpcCApIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwotICAgIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCi0gICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wobmV3IFRCaW5hcnlQcm90b2NvbChzdHJCdWZmZXIpKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZV9ncm93KSB7CisgIC8vIEFkZGVkIHRvIHRlc3QgdGhlIGZpeCBmb3IgVEhSSUZULTEyNDgKKyAgVE1lbW9yeUJ1ZmZlciB1dXQ7CisgIGNvbnN0IGludCBtYXhTaXplID0gNjU1MzY7CisgIHVpbnQ4X3QgdmVyaWZ5W21heFNpemVdOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWY7CisgIGJ1Zi5yZXNpemUobWF4U2l6ZSk7CiAKLSAgICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhOwotICAgIGEuaTMyX3RoaW5nID0gMTA7Ci0gICAgYS5pNjRfdGhpbmcgPSAzMDsKLSAgICBhLnN0cmluZ190aGluZyA9ImhvbGxhIGJhY2sgYSI7Ci0KLSAgICBhLndyaXRlKGJpbmFyeVByb3Rjb2wuZ2V0KCkpOwotICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQgPSBzdHJCdWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCk7Ci0KLSAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcjIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wyKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyMikpOwotCi0gICAgc3RyQnVmZmVyMi0+cmVzZXRCdWZmZXIoKHVpbnQ4X3QqKXNlcmlhbGl6ZWQuZGF0YSgpLCBzZXJpYWxpemVkLmxlbmd0aCgpKTsKLSAgICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhMjsKLSAgICBhMi5yZWFkKGJpbmFyeVByb3Rjb2wyLmdldCgpKTsKLQotICAgIGFzc2VydChhID09IGEyKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1heFNpemU7ICsraSkgeworICAgIGJ1ZltpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpOwogICB9CiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X2NvcHkgKQorICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgbWF4U2l6ZTsgaSAqPSAyKSB7CisgICAgdXV0LndyaXRlKCZidWZbMF0sIGkpOworICB9CisKKyAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IG1heFNpemU7IGkgKj0gMikgeworICAgIHV1dC5yZWFkKHZlcmlmeSwgaSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgOjptZW1jbXAodmVyaWZ5LCAmYnVmWzBdLCBpKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yb3VuZHRyaXApIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyKSk7CisKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTsKKyAgYS5pMzJfdGhpbmcgPSAxMDsKKyAgYS5pNjRfdGhpbmcgPSAzMDsKKyAgYS5zdHJpbmdfdGhpbmcgPSAiaG9sbGEgYmFjayBhIjsKKworICBhLndyaXRlKGJpbmFyeVByb3Rjb2wuZ2V0KCkpOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkID0gc3RyQnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOworCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyMihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wyKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyMikpOworCisgIHN0ckJ1ZmZlcjItPnJlc2V0QnVmZmVyKCh1aW50OF90KilzZXJpYWxpemVkLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcmlhbGl6ZWQubGVuZ3RoKCkpKTsKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTI7CisgIGEyLnJlYWQoYmluYXJ5UHJvdGNvbDIuZ2V0KCkpOworCisgIEJPT1NUX0NIRUNLKGEgPT0gYTIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRBcHBlbmRUb1N0cmluZykgeworICBzdHJpbmcqIHN0cjEgPSBuZXcgc3RyaW5nKCJhYmNkMTIzNCIpOworICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyMS0+bGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKKworICBzdHJpbmcgc3RyMyA9ICJ3eHl6Iiwgc3RyNCA9ICI2Nzg5IjsKKyAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHIzLCA0KTsKKyAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHI0LCBJTlRfTUFYKTsKKworICBCT09TVF9DSEVDSyhzdHIzID09ICJ3eHl6YWJjZCIpOworICBCT09TVF9DSEVDSyhzdHI0ID09ICI2Nzg5MTIzNCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2V4Y2VwdGlvbnMpIHsKKyAgY2hhciBkYXRhW10gPSAiZm9vXDBiYXIiOworCisgIFRNZW1vcnlCdWZmZXIgYnVmMSgodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6T0JTRVJWRSk7CisgIHN0cmluZyBzdHIgPSBidWYxLmdldEJ1ZmZlckFzU3RyaW5nKCk7CisgIEJPT1NUX0NIRUNLKHN0ci5sZW5ndGgoKSA9PSA3KTsKKworICBidWYxLnJlc2V0QnVmZmVyKCk7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmMS53cml0ZSgoY29uc3QgdWludDhfdCopImZvbyIsIDMpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKKworICBUTWVtb3J5QnVmZmVyIGJ1ZjIoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6OkNPUFkpOworICBCT09TVF9DSEVDS19OT19USFJPVyhidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMykpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCksIFRNZW1vcnlCdWZmZXIoKS5nZXRNYXhCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEwMjQsIFRNZW1vcnlCdWZmZXIoKS5nZXRCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Vycm9yX3NldF9tYXhfYnVmZmVyX3NpemVfdG9vX3NtYWxsKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLnNldE1heEJ1ZmZlclNpemUoYnVmLmdldEJ1ZmZlclNpemUoKSAtIDEpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tYXhpbXVtX2J1ZmZlcl9zaXplKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgYnVmLnNldE1heEJ1ZmZlclNpemUoODE5Mik7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNtYWxsX2J1ZmYoMSk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4MTkyOyArK2kpCiAgIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotICAgIHVzaW5nIHN0ZDo6c3RyaW5nOwotICAgIHVzaW5nIHN0ZDo6Y291dDsKLSAgICB1c2luZyBzdGQ6OmVuZGw7Ci0KLSAgICBzdHJpbmcqIHN0cjEgPSBuZXcgc3RyaW5nKCJhYmNkMTIzNCIpOwotICAgIGNvbnN0IGNoYXIqIGRhdGExID0gc3RyMS0+ZGF0YSgpOwotICAgIFRNZW1vcnlCdWZmZXIgYnVmKCh1aW50OF90KilzdHIxLT5kYXRhKCksIHN0cjEtPmxlbmd0aCgpLCBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKLSAgICBkZWxldGUgc3RyMTsKLSAgICBzdHJpbmcqIHN0cjIgPSBuZXcgc3RyaW5nKCJwbHNyZXVzZSIpOwotICAgIGJvb2wgb2JqX3JldXNlID0gKHN0cjEgPT0gc3RyMik7Ci0gICAgYm9vbCBkYXRfcmV1c2UgPSAoZGF0YTEgPT0gc3RyMi0+ZGF0YSgpKTsKLSAgICBjb3V0IDw8ICJPYmplY3QgcmV1c2U6ICIgPDwgb2JqX3JldXNlIDw8ICIgICBEYXRhIHJldXNlOiAiIDw8IGRhdF9yZXVzZQotICAgICAgPDwgKChvYmpfcmV1c2UgJiYgZGF0X3JldXNlKSA/ICIgICBZQVkhIiA6ICIiKSA8PCBlbmRsOwotICAgIGRlbGV0ZSBzdHIyOwotCi0gICAgc3RyaW5nIHN0cjMgPSAid3h5eiIsIHN0cjQgPSAiNjc4OSI7Ci0gICAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHIzLCA0KTsKLSAgICBidWYucmVhZEFwcGVuZFRvU3RyaW5nKHN0cjQsIElOVF9NQVgpOwotCi0gICAgYXNzZXJ0KHN0cjMgPT0gInd4eXphYmNkIik7Ci0gICAgYXNzZXJ0KHN0cjQgPT0gIjY3ODkxMjM0Iik7CisgICAgYnVmLndyaXRlKCZzbWFsbF9idWZmWzBdLCAxKTsKICAgfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9leGNlcHRpb25zICkKLSAgewotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBzdGQ6OnN0cmluZzsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLndyaXRlKCZzbWFsbF9idWZmWzBdLCAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CiAKLSAgICBjaGFyIGRhdGFbXSA9ICJmb29cMGJhciI7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X21lbW9yeV9idWZmZXJfdG9fZ2V0X3NpemVvZl9vYmplY3RzKQoreworICAvLyBUaGlzIGlzIGEgZGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIFRNZW1vcnlCdWZmZXIgdG8gZGV0ZXJtaW5lCisgIC8vIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgYSB0aHJpZnQgb2JqZWN0IGluIHRoZSBCaW5hcnkgcHJvdG9jb2wuCisgIC8vIFNlZSBUSFJJRlQtMzQ4MAogCi0gICAgVE1lbW9yeUJ1ZmZlciBidWYxKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpPQlNFUlZFKTsKLSAgICBzdHJpbmcgc3RyID0gYnVmMS5nZXRCdWZmZXJBc1N0cmluZygpOwotICAgIGFzc2VydChzdHIubGVuZ3RoKCkgPT0gNyk7Ci0gICAgYnVmMS5yZXNldEJ1ZmZlcigpOwotICAgIHRyeSB7Ci0gICAgICBidWYxLndyaXRlKChjb25zdCB1aW50OF90KikiZm9vIiwgMyk7Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7fQorICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbUJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wobmV3IFRCaW5hcnlQcm90b2NvbChtZW1CdWZmZXIpKTsKIAotICAgIFRNZW1vcnlCdWZmZXIgYnVmMigodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1ZjIud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJiYXIiLCAzKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9Ci0gIH0KKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3Qgb2JqZWN0OworICBvYmplY3QuaTMyX3RoaW5nID0gMTA7CisgIG9iamVjdC5pNjRfdGhpbmcgPSAzMDsKKyAgb2JqZWN0LnN0cmluZ190aGluZyA9ICJ3aG8ncyB5b3VyIGRhZGR5PyI7CisKKyAgdWludDMyX3Qgc2l6ZSA9IG9iamVjdC53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNDcsIHNpemUpOworfQogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDM4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiCisKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGV2ZW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKKworc3RydWN0IEhhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUlmIHsKKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsgc3RyaW5nc18ucHVzaF9iYWNrKHMpOyB9CisgIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIF9yZXR1cm4pIHsgX3JldHVybiA9IHN0cmluZ3NfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKKworICAvLyBkdW1teSBvdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0CisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeyByZXR1cm4gMDsgfQorICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiwgY29uc3QgaW50MzJfdCkge30KKyAgdm9pZCBvbmV3YXlXYWl0KCkge30KKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikge30KKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9Cit9OworCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KKworc3RydWN0IEdsb2JhbEZpeHR1cmVTU0wKK3sKKyAgICBHbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOworICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcworICAgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisjZW5kaWYKKworICAgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKKyAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgIHsKKyAgICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKKyAgICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIHRlc3QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlc3QgY2VydGlmaWNhdGUocykuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworI2lmZGVmIF9fbGludXhfXworICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworI2VuZGlmCisgICAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpCisjZW5kaWYKKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworCisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+c2VydmVyKHRydWUpOworICByZXR1cm4gcFNlcnZlclNvY2tldEZhY3Rvcnk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKKworICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoImNsaWVudC5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHJldHVybiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKK30KKworY2xhc3MgRml4dHVyZSB7Citwcml2YXRlOgorICBzdHJ1Y3QgTGlzdGVuRXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgIExpc3RlbkV2ZW50SGFuZGxlcihNdXRleCogbXV0ZXgpIDogbGlzdGVuTW9uaXRvcl8obXV0ZXgpLCByZWFkeV8oZmFsc2UpIHt9CisKKyAgICAgIHZvaWQgcHJlU2VydmUoKSAvKiBvdmVycmlkZSAqLyB7CisgICAgICAgIEd1YXJkIGcobGlzdGVuTW9uaXRvcl8ubXV0ZXgoKSk7CisgICAgICAgIHJlYWR5XyA9IHRydWU7CisgICAgICAgIGxpc3Rlbk1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICBNb25pdG9yIGxpc3Rlbk1vbml0b3JfOworICAgICAgYm9vbCByZWFkeV87CisgIH07CisKKyAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKKyAgICBpbnQgcG9ydDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5FdmVudEhhbmRsZXI+IGxpc3RlbkhhbmRsZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ+IHNvY2tldDsKKyAgICBNdXRleCBtdXRleF87CisKKyAgICBSdW5uZXIoKSB7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgICAvLyBXaGVuIGJpbmRpbmcgdG8gZXhwbGljaXQgcG9ydCwgYWxsb3cgcmV0cnlpbmcgdG8gd29ya2Fyb3VuZCBiaW5kIGZhaWx1cmVzIG9uIHBvcnRzIGluIHVzZQorICAgICAgaW50IHJldHJ5Q291bnQgPSBwb3J0ID8gMTAgOiAwOworICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7ICAKKyAgICAgIHN0YXJ0U2VydmVyKHJldHJ5Q291bnQpOworICAgIH0KKworICAgIHZvaWQgcmVhZHlCYXJyaWVyKCkgeworICAgICAgLy8gYmxvY2sgdW50aWwgc2VydmVyIGlzIGxpc3RlbmluZyBhbmQgcmVhZHkgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICB3aGlsZSAoIWxpc3RlbkhhbmRsZXItPnJlYWR5XykgeworICAgICAgICBsaXN0ZW5IYW5kbGVyLT5saXN0ZW5Nb25pdG9yXy53YWl0KCk7CisgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgc3RhcnRTZXJ2ZXIoaW50IHJldHJ5X2NvdW50KSB7CisgICAgICB0cnkgeworICAgICAgICBzb2NrZXQucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KHBvcnQsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KSk7CisgICAgICAgIHNlcnZlci5yZXNldChuZXcgc2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQpKTsKKwkgICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihsaXN0ZW5IYW5kbGVyKTsKKyAgICAgICAgc2VydmVyLT5zZXROdW1JT1RocmVhZHMoMSk7CisgICAgICAgIGlmICh1c2VyRXZlbnRCYXNlKSB7CisgICAgICAgICAgc2VydmVyLT5yZWdpc3RlckV2ZW50cyh1c2VyRXZlbnRCYXNlLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBzZXJ2ZXItPnNlcnZlKCk7CisgICAgICB9IGNhdGNoIChjb25zdCB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIGlmIChyZXRyeV9jb3VudCA+IDApIHsKKyAgICAgICAgICArK3BvcnQ7CisgICAgICAgICAgc3RhcnRTZXJ2ZXIocmV0cnlfY291bnQgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBzdHJ1Y3QgRXZlbnREZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoZXZlbnRfYmFzZSogcCkgeyBldmVudF9iYXNlX2ZyZWUocCk7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3Ioc3RkOjptYWtlX3NoYXJlZDxIYW5kbGVyPigpKSkge30KKworICB+Rml4dHVyZSgpIHsKKyAgICBpZiAoc2VydmVyKSB7CisgICAgICBzZXJ2ZXItPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHRocmVhZCkgeworICAgICAgdGhyZWFkLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRFdmVudEJhc2UoZXZlbnRfYmFzZSogdXNlcl9ldmVudF9iYXNlKSB7CisgICAgdXNlckV2ZW50QmFzZV8ucmVzZXQodXNlcl9ldmVudF9iYXNlLCBFdmVudERlbGV0ZXIoKSk7CisgIH0KKworICBpbnQgc3RhcnRTZXJ2ZXIoaW50IHBvcnQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmVyPiBydW5uZXIobmV3IFJ1bm5lcik7CisgICAgcnVubmVyLT5wb3J0ID0gcG9ydDsKKyAgICBydW5uZXItPnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICBydW5uZXItPnVzZXJFdmVudEJhc2UgPSB1c2VyRXZlbnRCYXNlXzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoCisgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgICAgICAgIGNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgICAxLAorI2VuZGlmCisgICAgICAgICAgICBmYWxzZSkpOworICAgIHRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChydW5uZXIpOworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBydW5uZXItPnJlYWR5QmFycmllcigpOworCisgICAgc2VydmVyID0gcnVubmVyLT5zZXJ2ZXI7CisgICAgcmV0dXJuIHJ1bm5lci0+cG9ydDsKKyAgfQorCisgIGJvb2wgY2FuQ29tbXVuaWNhdGUoaW50IHNlcnZlclBvcnQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzb2NrZXQgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KTsKKyAgICBzb2NrZXQtPm9wZW4oKTsKKyAgICB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KSkpOworICAgIGNsaWVudC5hZGRTdHJpbmcoImZvbyIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworICAgIGNsaWVudC5nZXRTdHJpbmdzKHN0cmluZ3MpOworICAgIHJldHVybiBzdHJpbmdzLnNpemUoKSA9PSAxICYmICEoc3RyaW5nc1swXS5jb21wYXJlKCJmb28iKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2VfOworICBzdGQ6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3Nvcj4gcHJvY2Vzc29yOworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkOworCit9OworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCkKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X3NwZWNpZmllZF9wb3J0LCBGaXh0dXJlKSB7CisgIGludCBzcGVjaWZpZWRfcG9ydCA9IHN0YXJ0U2VydmVyKDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9HRShzcGVjaWZpZWRfcG9ydCwgMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpLCBzcGVjaWZpZWRfcG9ydCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKHNwZWNpZmllZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9hc3NpZ25lZF9wb3J0LCBGaXh0dXJlKSB7CisgIGludCBzcGVjaWZpZWRfcG9ydCA9IHN0YXJ0U2VydmVyKDApOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHNwZWNpZmllZF9wb3J0LCAwKTsKKyAgaW50IGFzc2lnbmVkX3BvcnQgPSBzZXJ2ZXItPmdldExpc3RlblBvcnQoKTsKKyAgQk9PU1RfUkVRVUlSRV9ORShhc3NpZ25lZF9wb3J0LCAwKTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoYXNzaWduZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShwcm92aWRlX2V2ZW50X2Jhc2UsIEZpeHR1cmUpIHsKKyAgZXZlbnRfYmFzZSogZWIgPSBldmVudF9iYXNlX25ldygpOworICBzZXRFdmVudEJhc2UoZWIpOworICBzdGFydFNlcnZlcigwKTsKKworICAvLyBhc3NlcnQgdGhhdCB0aGUgc2VydmVyIHdvcmtzCisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpKSk7CisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPiAweDAyMDEwNDAwCisgIC8vIGFsc28gYXNzZXJ0IHRoYXQgdGhlIGV2ZW50X2Jhc2UgaXMgYWN0dWFsbHkgdXNlZCB3aGVuIGl0J3MgZWFzeQorICBCT09TVF9DSEVDS19HVChldmVudF9iYXNlX2dldF9udW1fZXZlbnRzKGViLCBFVkVOVF9CQVNFX0NPVU5UX0FEREVEKSwgMCk7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiYjI4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcApAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFROb25ibG9ja2luZ1NlcnZlclRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgiCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworc3RydWN0IEhhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUlmIHsKKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsgc3RyaW5nc18ucHVzaF9iYWNrKHMpOyB9CisgIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIF9yZXR1cm4pIHsgX3JldHVybiA9IHN0cmluZ3NfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKKworICAvLyBkdW1teSBvdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0CisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeyByZXR1cm4gMDsgfQorICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiwgY29uc3QgaW50MzJfdCkge30KKyAgdm9pZCBvbmV3YXlXYWl0KCkge30KKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikge30KKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9Cit9OworCitjbGFzcyBGaXh0dXJlIHsKK3ByaXZhdGU6CisgIHN0cnVjdCBMaXN0ZW5FdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgTGlzdGVuRXZlbnRIYW5kbGVyKE11dGV4KiBtdXRleCkgOiBsaXN0ZW5Nb25pdG9yXyhtdXRleCksIHJlYWR5XyhmYWxzZSkge30KKworICAgICAgdm9pZCBwcmVTZXJ2ZSgpIC8qIG92ZXJyaWRlICovIHsKKyAgICAgICAgR3VhcmQgZyhsaXN0ZW5Nb25pdG9yXy5tdXRleCgpKTsKKyAgICAgICAgcmVhZHlfID0gdHJ1ZTsKKyAgICAgICAgbGlzdGVuTW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICB9CisKKyAgICAgIE1vbml0b3IgbGlzdGVuTW9uaXRvcl87CisgICAgICBib29sIHJlYWR5XzsKKyAgfTsKKworICBzdHJ1Y3QgUnVubmVyIDogcHVibGljIFJ1bm5hYmxlIHsKKyAgICBpbnQgcG9ydDsKKyAgICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3I7CisgICAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworICAgIHNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldDsKKyAgICBNdXRleCBtdXRleF87CisKKyAgICBSdW5uZXIoKSB7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgICAvLyBXaGVuIGJpbmRpbmcgdG8gZXhwbGljaXQgcG9ydCwgYWxsb3cgcmV0cnlpbmcgdG8gd29ya2Fyb3VuZCBiaW5kIGZhaWx1cmVzIG9uIHBvcnRzIGluIHVzZQorICAgICAgaW50IHJldHJ5Q291bnQgPSBwb3J0ID8gMTAgOiAwOworICAgICAgc3RhcnRTZXJ2ZXIocmV0cnlDb3VudCk7CisgICAgfQorCisgICAgdm9pZCByZWFkeUJhcnJpZXIoKSB7CisgICAgICAvLyBibG9jayB1bnRpbCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIGFuZCByZWFkeSB0byBhY2NlcHQgY29ubmVjdGlvbnMKKyAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgIHdoaWxlICghbGlzdGVuSGFuZGxlci0+cmVhZHlfKSB7CisgICAgICAgIGxpc3RlbkhhbmRsZXItPmxpc3Rlbk1vbml0b3JfLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisgIHByaXZhdGU6CisgICAgdm9pZCBzdGFydFNlcnZlcihpbnQgcmV0cnlfY291bnQpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2tldC5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgICBzZXJ2ZXIucmVzZXQobmV3IHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0KSk7CisgICAgICAgIHNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKGxpc3RlbkhhbmRsZXIpOworICAgICAgICBpZiAodXNlckV2ZW50QmFzZSkgeworICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLT5zZXJ2ZSgpOworICAgICAgfSBjYXRjaCAoY29uc3QgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICBpZiAocmV0cnlfY291bnQgPiAwKSB7CisgICAgICAgICAgKytwb3J0OworICAgICAgICAgIHN0YXJ0U2VydmVyKHJldHJ5X2NvdW50IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgc3RydWN0IEV2ZW50RGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKGV2ZW50X2Jhc2UqIHApIHsgZXZlbnRfYmFzZV9mcmVlKHApOyB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgRml4dHVyZSgpIDogcHJvY2Vzc29yKG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yKG1ha2Vfc2hhcmVkPEhhbmRsZXI+KCkpKSB7fQorCisgIH5GaXh0dXJlKCkgeworICAgIGlmIChzZXJ2ZXIpIHsKKyAgICAgIHNlcnZlci0+c3RvcCgpOworICAgIH0KKyAgICBpZiAodGhyZWFkKSB7CisgICAgICB0aHJlYWQtPmpvaW4oKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldEV2ZW50QmFzZShldmVudF9iYXNlKiB1c2VyX2V2ZW50X2Jhc2UpIHsKKyAgICB1c2VyRXZlbnRCYXNlXy5yZXNldCh1c2VyX2V2ZW50X2Jhc2UsIEV2ZW50RGVsZXRlcigpKTsKKyAgfQorCisgIGludCBzdGFydFNlcnZlcihpbnQgcG9ydCkgeworICAgIHNoYXJlZF9wdHI8UnVubmVyPiBydW5uZXIobmV3IFJ1bm5lcik7CisgICAgcnVubmVyLT5wb3J0ID0gcG9ydDsKKyAgICBydW5uZXItPnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICBydW5uZXItPnVzZXJFdmVudEJhc2UgPSB1c2VyRXZlbnRCYXNlXzsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgKKyAgICAgICAgbmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLAorICAgICAgICAgICAgMSwKKyNlbmRpZgorICAgICAgICAgICAgZmFsc2UpKTsKKyAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgcnVubmVyLT5yZWFkeUJhcnJpZXIoKTsKKworICAgIHNlcnZlciA9IHJ1bm5lci0+c2VydmVyOworICAgIHJldHVybiBydW5uZXItPnBvcnQ7CisgIH0KKworICBib29sIGNhbkNvbW11bmljYXRlKGludCBzZXJ2ZXJQb3J0KSB7CisgICAgc2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRTb2NrZXQ+IHNvY2tldChuZXcgdHJhbnNwb3J0OjpUU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KSk7CisgICAgc29ja2V0LT5vcGVuKCk7CisgICAgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudCBjbGllbnQobWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbD4oCisgICAgICAgIG1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KSkpOworICAgIGNsaWVudC5hZGRTdHJpbmcoImZvbyIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworICAgIGNsaWVudC5nZXRTdHJpbmdzKHN0cmluZ3MpOworICAgIHJldHVybiBzdHJpbmdzLnNpemUoKSA9PSAxICYmICEoc3RyaW5nc1swXS5jb21wYXJlKCJmb28iKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlXzsKKyAgc2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPiBwcm9jZXNzb3I7Citwcm90ZWN0ZWQ6CisgIHNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKKworfTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFROb25ibG9ja2luZ1NlcnZlclRlc3QpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9zcGVjaWZpZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfR0Uoc3BlY2lmaWVkX3BvcnQsIDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzZXJ2ZXItPmdldExpc3RlblBvcnQoKSwgc3BlY2lmaWVkX3BvcnQpOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzcGVjaWZpZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfYXNzaWduZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigwKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzcGVjaWZpZWRfcG9ydCwgMCk7CisgIGludCBhc3NpZ25lZF9wb3J0ID0gc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCk7CisgIEJPT1NUX1JFUVVJUkVfTkUoYXNzaWduZWRfcG9ydCwgMCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKGFzc2lnbmVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UocHJvdmlkZV9ldmVudF9iYXNlLCBGaXh0dXJlKSB7CisgIGV2ZW50X2Jhc2UqIGViID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgc2V0RXZlbnRCYXNlKGViKTsKKyAgc3RhcnRTZXJ2ZXIoMCk7CisKKyAgLy8gYXNzZXJ0IHRoYXQgdGhlIHNlcnZlciB3b3JrcworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzZXJ2ZXItPmdldExpc3RlblBvcnQoKSkpOworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4gMHgwMjAxMDQwMAorICAvLyBhbHNvIGFzc2VydCB0aGF0IHRoZSBldmVudF9iYXNlIGlzIGFjdHVhbGx5IHVzZWQgd2hlbiBpdCdzIGVhc3kKKyAgQk9PU1RfQ0hFQ0tfR1QoZXZlbnRfYmFzZV9nZXRfbnVtX2V2ZW50cyhlYiwgRVZFTlRfQkFTRV9DT1VOVF9BRERFRCksIDApOworI2VuZGlmCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDIzZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3Rlc3RfdG9vbHMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0X3N1aXRlLmhwcD4KKworI2luY2x1ZGUgPGJvb3N0L2Nocm9uby9kdXJhdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZV9kdXJhdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRQaXBlSW50ZXJydXB0VGVzdCkKKworLy8gVE9ETzogZHVwbGljYXRlIHRoZSB0ZXN0IGNhc2VzIGluIFRTb2NrZXRJbnRlcnJ1cHRUZXN0IGZvciBwaXBlcywKKy8vIG9uY2UgcGlwZXMgaW1wbGVtZW50IGludGVycnVwdENoaWxkcmVuCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0X2JlZm9yZV9hY2NlcHQpIHsKKyAgVFBpcGVTZXJ2ZXIgcGlwZTEoIlRQaXBlSW50ZXJydXB0VGVzdCIpOworICBwaXBlMS5saXN0ZW4oKTsKKyAgcGlwZTEuaW50ZXJydXB0KCk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHBpcGUxLmFjY2VwdCgpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQgYWNjZXB0V29ya2VyKFRQaXBlU2VydmVyICpwaXBlKSB7CisgIHRyeQorICB7CisgICAgZm9yICg7OykKKyAgICB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGVtcCA9IHBpcGUtPmFjY2VwdCgpOworICAgIH0KKyAgfQorICBjYXRjaCAoLi4uKSB7LypqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIG5vdGhpbmcgY3Jhc2hlcyovIH0KK30KKworc3RhdGljIHZvaWQgaW50ZXJydXB0V29ya2VyKFRQaXBlU2VydmVyICpwaXBlKSB7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBwaXBlLT5pbnRlcnJ1cHQoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc3RyZXNzX3BpcGVfYWNjZXB0X2ludGVycnVwdGlvbikgeworICBpbnQgaW50ZXJydXB0SXRlcnMgPSAxMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGludGVycnVwdEl0ZXJzOyArK2kpCisgIHsKKyAgICBUUGlwZVNlcnZlciBwaXBlU2VydmVyKCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgICBwaXBlU2VydmVyLmxpc3RlbigpOworICAgIGJvb3N0Ojp0aHJlYWQgYWNjZXB0VGhyZWFkKHN0ZDo6YmluZChhY2NlcHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgYm9vc3Q6OnRocmVhZCBpbnRlcnJ1cHRUaHJlYWQoc3RkOjpiaW5kKGludGVycnVwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKKyAgICB0cnkKKyAgICB7CisgICAgICBmb3IgKDs7KQorICAgICAgeworICAgICAgICBUUGlwZSBjbGllbnQoIlRQaXBlSW50ZXJydXB0VGVzdCIpOworICAgICAgICBjbGllbnQuc2V0Q29ublRpbWVvdXQoMSk7CisgICAgICAgIGNsaWVudC5vcGVuKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoLi4uKSB7IC8qanVzdCB0ZXN0aW5nIGZvciBjcmFzaGVzKi8gfQorICAgIGludGVycnVwdFRocmVhZC5qb2luKCk7CisgICAgYWNjZXB0VGhyZWFkLmpvaW4oKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCmluZGV4IDU3MDhmZDIuLmYzMDkxYTQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTE3LDM4ICsxNywzNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRQaXBlZFRyYW5zcG9ydFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCi1pbnQgbWFpbigpIHsKLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB1bmRlcmx5aW5nKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgc2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnQ+IHRyYW5zKG5ldyBUUGlwZWRUcmFuc3BvcnQodW5kZXJseWluZywgcGlwZSkpOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWFkX3dyaXRlKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB1bmRlcmx5aW5nKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHBpcGUobmV3IFRNZW1vcnlCdWZmZXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0PiB0cmFucyhuZXcgVFBpcGVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIHBpcGUpKTsKIAogICB1aW50OF90IGJ1ZmZlcls0XTsKIAogICB1bmRlcmx5aW5nLT53cml0ZSgodWludDhfdCopImFiY2QiLCA0KTsKICAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKLSAgYXNzZXJ0KCBzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImFiIiApOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiYWIiKTsKICAgdHJhbnMtPnJlYWRFbmQoKTsKLSAgYXNzZXJ0KCBwaXBlLT5nZXRCdWZmZXJBc1N0cmluZygpID09ICJhYiIgKTsKKyAgQk9PU1RfQ0hFQ0socGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiYWIiKTsKICAgcGlwZS0+cmVzZXRCdWZmZXIoKTsKICAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJlZiIsIDIpOwogICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOwotICBhc3NlcnQoIHN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiY2QiICk7CisgIEJPT1NUX0NIRUNLKHN0ZDo6c3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJjZCIpOwogICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOwotICBhc3NlcnQoIHN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiZWYiICk7CisgIEJPT1NUX0NIRUNLKHN0ZDo6c3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJlZiIpOwogICB0cmFucy0+cmVhZEVuZCgpOwotICBhc3NlcnQoIHBpcGUtPmdldEJ1ZmZlckFzU3RyaW5nKCkgPT0gImNkZWYiICk7Ci0KLSAgcmV0dXJuIDA7Ci0KKyAgQk9PU1RfQ0hFQ0socGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiY2RlZiIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmNjg2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0X3N1aXRlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKKwordXNpbmcgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNTTFNvY2tldEludGVycnVwdFRlc3QpCisKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgcmV0dXJuIGtleURpciAvIGZpbGVuYW1lOworfQorYm9vc3Q6Om11dGV4IGdNdXRleDsKKworc3RydWN0IEdsb2JhbEZpeHR1cmVTU0wKK3sKKyAgICBHbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOworICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcworICAgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisjZW5kaWYKKworICAgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKKyAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgIHsKKyAgICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKKyAgICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIHRlc3QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlc3QgY2VydGlmaWNhdGUocykuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworI2lmZGVmIF9fbGludXhfXworICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworI2VuZGlmCisgICAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpCisjZW5kaWYKKwordm9pZCByZWFkZXJXb3JrZXIoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKKyAgdWludDhfdCBidWZbNF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnJlYWQoYnVmLCA0KSk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK3ZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdHJ5IHsKKyAgICB1aW50OF90IGJ1Zls0MDBdOworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgdHQtPnJlYWQoYnVmLCA0MDApOworICAgIEJPT1NUX0VSUk9SKCJzaG91bGQgbm90IGhhdmUgZ290dGVuIGhlcmUiKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCitzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKworICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgcmV0dXJuIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworfQorCitzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKKworICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoImNsaWVudC5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHJldHVybiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfaW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkX3doaWxlX2hhbmRzaGFraW5nKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXJNdXN0VGhyb3csIGFjY2VwdGVkKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSksCisgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGRpZCBub3QgaW50ZXJydXB0IGNoaWxkIHJlYWQiKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShyZWFkVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgc3RhdGljX3BvaW50ZXJfY2FzdDxUU1NMU29ja2V0PihhY2NlcHRlZCktPnNldFJlY3ZUaW1lb3V0KDEwMDApOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlciwgYWNjZXB0ZWQsIDApKTsKKyAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgaGVyZQorICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFyZWFkVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcmVhZCIpOworCisgIC8vIHdhaXQgZm9yIHJlY2VpdmUgdGltZW91dCB0byBraWNrIGluCisgIHJlYWRUaHJlYWQuam9pbigpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfY2Fubm90X2NoYW5nZV9hZnRlcl9saXN0ZW4pIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKKyAgc29jazEubGlzdGVuKCk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSksIHN0ZDo6bG9naWNfZXJyb3IpOworICBzb2NrMS5jbG9zZSgpOworfQorCit2b2lkIHBlZWtlcldvcmtlcihzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCBib29sIGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzQwMF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK3ZvaWQgcGVla2VyV29ya2VySW50ZXJydXB0KHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdWludDhfdCBidWZbNDAwXTsKKyAgdHJ5IHsKKyAgICB0dC0+cmVhZChidWYsIDEpOworICAgIHR0LT5wZWVrKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsIHR4LmdldFR5cGUoKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXJJbnRlcnJ1cHQsIGFjY2VwdGVkKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHBlZWtUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCBwZWVrIik7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgc3RhdGljX3BvaW50ZXJfY2FzdDxUU1NMU29ja2V0PihhY2NlcHRlZCktPnNldFJlY3ZUaW1lb3V0KDEwMDApOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcGVlayIpOworCisgIC8vIHdhaXQgZm9yIHRoZSByZWNlaXZlIHRpbWVvdXQgdG8ga2ljayBpbgorICBwZWVrVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzZjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUU2VydmVySW50ZWdyYXRpb25UZXN0CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3B0aW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JlYWNoLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcjsKK3VzaW5nIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZkZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk7Cit1c2luZyBib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzOworCisvKioKKyAqIHByZVNlcnZlIHJ1bnMgYWZ0ZXIgbGlzdGVuKCkgaXMgc3VjY2Vzc2Z1bCwgd2hlbiB3ZSBjYW4gY29ubmVjdAorICovCitjbGFzcyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciwgcHVibGljIE1vbml0b3IgeworcHVibGljOgorICBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSA6IGlzTGlzdGVuaW5nXyhmYWxzZSksIGFjY2VwdGVkXygwKSB7fQorICB2aXJ0dWFsIH5UU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgIGlzTGlzdGVuaW5nXyA9IHRydWU7CisgICAgbm90aWZ5KCk7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CisgICAgKythY2NlcHRlZF87CisgICAgbm90aWZ5KCk7CisKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYm9vbCBpc0xpc3RlbmluZygpIGNvbnN0IHsgcmV0dXJuIGlzTGlzdGVuaW5nXzsgfQorICB1aW50NjRfdCBhY2NlcHRlZENvdW50KCkgY29uc3QgeyByZXR1cm4gYWNjZXB0ZWRfOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNMaXN0ZW5pbmdfOworICB1aW50NjRfdCBhY2NlcHRlZF87Cit9OworCisvKioKKyAqIFJldXNpbmcgYW5vdGhlciBnZW5lcmF0ZWQgdGVzdCwganVzdCBzb21ldGhpbmcgdG8gc2VydmUgdXAKKyAqLworY2xhc3MgUGFyZW50SGFuZGxlciA6IHB1YmxpYyBQYXJlbnRTZXJ2aWNlSWYgeworcHVibGljOgorICBQYXJlbnRIYW5kbGVyKCkgOiBnZW5lcmF0aW9uXygwKSB7fQorCisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuICsrZ2VuZXJhdGlvbl87CisgIH0KKworICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiBnZW5lcmF0aW9uXzsKKyAgfQorCisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHN0cmluZ3NfLnB1c2hfYmFjayhzKTsKKyAgfQorCisgIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIF9yZXR1cm4pIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgX3JldHVybiA9IHN0cmluZ3NfOworICB9CisKKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3QgaW50MzJfdCBsZW5ndGgpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKF9yZXR1cm4pOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUobGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisKKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7IFRIUklGVF9VTlVTRURfVkFSSUFCTEUobWVzc2FnZSk7IH0KKworICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7IFRIUklGVF9VTlVTRURfVkFSSUFCTEUobWVzc2FnZSk7IH0KKworcHJvdGVjdGVkOgorICBNdXRleCBtdXRleF87CisgIGludDMyX3QgZ2VuZXJhdGlvbl87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKK307CisKK3ZvaWQgYXV0b1NvY2tldENsb3NlcihUU29ja2V0KiBwU29jaykgeworICBwU29jay0+Y2xvc2UoKTsKKyAgZGVsZXRlIHBTb2NrOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+CitjbGFzcyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZSB7CitwdWJsaWM6CisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBfcHJvY2Vzc29yRmFjdG9yeSkKKyAgICA6IHBTZXJ2ZXIobmV3IFRTZXJ2ZXJUeXBlKF9wcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCisgICAgICBwRXZlbnRIYW5kbGVyKHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgYlN0cmVzc0RvbmUoZmFsc2UpLAorICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQoMCksCisgICAgYlN0cmVzc1JlcXVlc3RDb3VudCgwKSB7CisgICAgcFNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOworICB9CisKKyAgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgX3Byb2Nlc3NvcikKKyAgICA6IHBTZXJ2ZXIoCisgICAgICAgICAgbmV3IFRTZXJ2ZXJUeXBlKF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4obmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKKyAgICAgIHBFdmVudEhhbmRsZXIoc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+KG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpKSwKKyAgICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgeworICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKyAgfQorCisgIHZvaWQgc3RhcnRTZXJ2ZXIoKSB7CisgICAgcFNlcnZlclRocmVhZC5yZXNldChuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJUeXBlOjpzZXJ2ZSwgcFNlcnZlci5nZXQoKSkpKTsKKworICAgIC8vIGJsb2NrIHVudGlsIGxpc3RlbigpIGNvbXBsZXRlcyBzbyBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBjb25uZWN0CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKCFwRXZlbnRIYW5kbGVyLT5pc0xpc3RlbmluZygpKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciBpcyBsaXN0ZW5pbmciKTsKKyAgfQorCisgIHZvaWQgYmxvY2tVbnRpbEFjY2VwdGVkKHVpbnQ2NF90IG51bUFjY2VwdGVkKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKHBFdmVudEhhbmRsZXItPmFjY2VwdGVkQ291bnQoKSA8IG51bUFjY2VwdGVkKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIiAgc2VydmVyIGhhcyBhY2NlcHRlZCAlMSUiKSAlIG51bUFjY2VwdGVkKTsKKyAgfQorCisgIHZvaWQgc3RvcFNlcnZlcigpIHsKKyAgICBpZiAocFNlcnZlclRocmVhZCkgeworICAgICAgcFNlcnZlci0+c3RvcCgpOworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciBzdG9wIGNvbXBsZXRlZCIpOworCisgICAgICBwU2VydmVyVGhyZWFkLT5qb2luKCk7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoIiAgc2VydmVyIHRocmVhZCBqb2luZWQiKTsKKyAgICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQoKTsKKyAgICB9CisgIH0KKworICB+VFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoKSB7IHN0b3BTZXJ2ZXIoKTsgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGJhc2VsaW5lIHRlc3Qgd2hlcmUgc29tZSBjbGllbnRzIGFyZSBvcGVuZWQgYW5kIGlzc3VlIGEgc2luZ2xlIG9wZXJhdGlvbgorICAgKiBhbmQgdGhlbiBkaXNjb25uZWN0IGF0IGRpZmZlcmVudCBpbnRlcnZhbHMuCisgICAqIFxwYXJhbVtpbl0gIG51bVRvTWFrZSAgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICogXHBhcmFtW2luXSAgZXhwZWN0ZWRIV00gIHRoZSBoaWdoIHdhdGVyIG1hcmsgd2UgZXhwZWN0IG9mIGNvbmN1cnJlbmN5CisgICAqIFxwYXJhbVtpbl0gIHB1cnBvc2UgIGEgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QgZm9yIGxvZ2dpbmcgcHVycG9zZXMKKyAgICovCisgIHZvaWQgYmFzZWxpbmUoaW50NjRfdCBudW1Ub01ha2UsIGludDY0X3QgZXhwZWN0ZWRIV00sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwdXJwb3NlKSB7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlRlc3RpbmcgJTElOiAlMiUgd2l0aCAlMyUgY2xpZW50cywgZXhwZWN0ICU0JSBIV00iKQorICAgICAgICAgICAgJSB0eXBlaWQoVFNlcnZlclR5cGUpLm5hbWUoKSAlIHB1cnBvc2UgJSBudW1Ub01ha2UgJSBleHBlY3RlZEhXTSk7CisKKyAgICBzdGFydFNlcnZlcigpOworCisgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0PiA+IGhvbGRTb2NrZXRzOworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gPiBob2xkVGhyZWFkczsKKworICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG51bVRvTWFrZTsgKytpKSB7CisgICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBob2xkU29ja2V0cy5wdXNoX2JhY2socENsaWVudFNvY2spOworICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHBDbGllbnRQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHBDbGllbnRTb2NrKSk7CisgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwQ2xpZW50UHJvdG9jb2wpOworICAgICAgcENsaWVudFNvY2stPm9wZW4oKTsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPigKKyAgICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDEwICogbnVtVG9NYWtlKSkpKSk7CisgICAgfQorCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRIV00sIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpKTsKKworICAgIEJPT1NUX0ZPUkVBQ0ggKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9CisgICAgaG9sZFRocmVhZHMuY2xlYXIoKTsKKyAgICBob2xkU29ja2V0cy5jbGVhcigpOworCisgICAgc3RvcFNlcnZlcigpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBjbG9zZSBhIGNvbm5lY3Rpb24gYWZ0ZXIgYSBkZWxheS4KKyAgICogXHBhcmFtW2luXSAgdG9DbG9zZSAgdGhlIGNvbm5lY3Rpb24gdG8gY2xvc2UKKyAgICogXHBhcmFtW2luXSAgYWZ0ZXIgIHRoZSBkZWxheSB0byBpbXBvc2UKKyAgICovCisgIHZvaWQgZGVsYXlDbG9zZShzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRvQ2xvc2UsIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGFmdGVyKSB7CisgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChhZnRlcik7CisgICAgdG9DbG9zZS0+Y2xvc2UoKTsKKyAgfQorCisgIC8qKgorICAgKiBccmV0dXJucyAgdGhlIHNlcnZlciBwb3J0IG51bWJlcgorICAgKi8KKyAgaW50IGdldFNlcnZlclBvcnQoKSB7CisgICAgVFNlcnZlclNvY2tldCogcFNvY2sgPSBkeW5hbWljX2Nhc3Q8VFNlcnZlclNvY2tldCo+KHBTZXJ2ZXItPmdldFNlcnZlclRyYW5zcG9ydCgpLmdldCgpKTsKKyAgICBpZiAoIXBTb2NrKSB7IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoImhvdyBjb21lPyIpOyB9CisgICAgcmV0dXJuIHBTb2NrLT5nZXRQb3J0KCk7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBzdHJlc3MgdGVzdCBieSBzcGF3bmluZyB0aHJlYWRzIHRoYXQgY29ubmVjdCwgZG8gYSBudW1iZXIgb2Ygb3BlcmF0aW9ucworICAgKiBhbmQgZGlzY29ubmVjdCwgdGhlbiBhIHJhbmRvbSBkZWxheSwgdGhlbiBkbyBpdCBvdmVyIGFnYWluLiAgVGhpcyBpcyBkb25lIGZvciBhIGZpeGVkCisgICAqIHBlcmlvZCBvZiB0aW1lIHRvIHRlc3QgZm9yIGNvbmN1cnJlbmN5IGNvcnJlY3RuZXNzLgorICAgKiBccGFyYW1baW5dICBudW1Ub01ha2UgIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqLworICB2b2lkIHN0cmVzcyhpbnQ2NF90IG51bVRvTWFrZSwgY29uc3QgYm9vc3Q6OnBvc2l4X3RpbWU6OnRpbWVfZHVyYXRpb24mIGR1cmF0aW9uKSB7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlN0cmVzcyB0ZXN0aW5nICUxJSB3aXRoICUyJSBjbGllbnRzIGZvciAlMyUgc2Vjb25kcyIpCisgICAgICAgICUgdHlwZWlkKFRTZXJ2ZXJUeXBlKS5uYW1lKCkgJSBudW1Ub01ha2UgJSBkdXJhdGlvbi50b3RhbF9zZWNvbmRzKCkpOworCisgICAgc3RhcnRTZXJ2ZXIoKTsKKworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gPiBob2xkVGhyZWFkczsKKyAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgeworICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgIG5ldyBib29zdDo6dGhyZWFkKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OnN0cmVzc29yLCB0aGlzKSkpKTsKKyAgICB9CisKKyAgICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGR1cmF0aW9uKTsKKyAgICBiU3RyZXNzRG9uZSA9IHRydWU7CisKKyAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiICBzZXJ2aWNlZCAlMSUgY29ubmVjdGlvbnMgKEhXTSAlMiUpIHRvdGFsaW5nICUzJSByZXF1ZXN0cyIpCisgICAgICAgICUgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudCAlIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpICUgYlN0cmVzc1JlcXVlc3RDb3VudCk7CisKKyAgICBCT09TVF9GT1JFQUNIIChzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQorICAgIGhvbGRUaHJlYWRzLmNsZWFyKCk7CisKKyAgICBCT09TVF9DSEVDSyhiU3RyZXNzUmVxdWVzdENvdW50ID4gMCk7CisKKyAgICBzdG9wU2VydmVyKCk7CisgIH0KKworICAvKioKKyAgICogSGVscGVyIG1ldGhvZCB0byBzdHJlc3MgdGhlIHN5c3RlbQorICAgKi8KKyAgdm9pZCBzdHJlc3NvcigpIHsKKyAgd2hpbGUgKCFiU3RyZXNzRG9uZSkgeworICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBwU29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLCBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwUHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwU29ja2V0KSk7CisgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwUHJvdG9jb2wpOworICAgICAgcFNvY2tldC0+b3BlbigpOworICAgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmQoKSAlIDEwMDA7ICsraSkgeworICAgICAgY2xpZW50LmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgICAgICAgYlN0cmVzc1JlcXVlc3RDb3VudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2hhcmVkX3B0cjxUU2VydmVyVHlwZT4gcFNlcnZlcjsKKyAgc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXI7CisgIHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFNlcnZlclRocmVhZDsKKyAgc3RkOjphdG9taWM8Ym9vbD4gYlN0cmVzc0RvbmU7CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IGJTdHJlc3NDb25uZWN0aW9uQ291bnQ7CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IGJTdHJlc3NSZXF1ZXN0Q291bnQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+CitjbGFzcyBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmUKKyAgICA6IHB1YmxpYyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTxUU2VydmVyVHlwZT4geworcHVibGljOgorICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmUoKQorICAgIDogVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+KG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PigKKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlSWZTaW5nbGV0b25GYWN0b3J5PigKKyAgICAgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50SGFuZGxlcj4oKSkpKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmUgOiBwdWJsaWMgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+IHsKK3B1YmxpYzoKKyAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmUoKQorICAgIDogVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+KAorICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3I+KG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSB7fQorfTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKGNvbnN0cnVjdG9ycykKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGVfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUU2ltcGxlU2VydmVyPikgeworICBiYXNlbGluZSgzLCAxLCAiZmFjdG9yeSIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3NpbXBsZSwgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFNpbXBsZVNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMywgMSwgInByb2Nlc3NvciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgeworICBiYXNlbGluZSgxMCwgMTAsICJmYWN0b3J5Iik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWQsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMTAsIDEwLCAicHJvY2Vzc29yIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWRfYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKKyAgYmFzZWxpbmUoMTAsIDQsICJsaW1pdCBieSBzZXJ2ZXIgZnJhbWV3b3JrIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWRfc3RyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgc3RyZXNzKDEwLCBib29zdDo6cG9zaXhfdGltZTo6c2Vjb25kcygzKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKworICAvLyB0aHJlYWQgZmFjdG9yeSBoYXMgNCB0aHJlYWRzIGFzIGEgZGVmYXVsdAorICAvLyB0aHJlYWQgZmFjdG9yeSBob3dldmVyIGlzIGEgYmFkIHdheSB0byBsaW1pdCBjb25jdXJyZW50IGNsaWVudHMKKyAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKKyAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCisgIC8vIHRoYXQgY2xpZW50LgorICBiYXNlbGluZSgxMCwgNSwgImxpbWl0IGJ5IHRocmVhZCBtYW5hZ2VyIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKworICAvLyB0aHJlYWQgZmFjdG9yeSBoYXMgNCB0aHJlYWRzIGFzIGEgZGVmYXVsdAorICAvLyB0aHJlYWQgZmFjdG9yeSBob3dldmVyIGlzIGEgYmFkIHdheSB0byBsaW1pdCBjb25jdXJyZW50IGNsaWVudHMKKyAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKKyAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCisgIC8vIHRoYXQgY2xpZW50LgorICBiYXNlbGluZSgxMCwgNSwgImxpbWl0IGJ5IHRocmVhZCBtYW5hZ2VyIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9ib3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKyAgcFNlcnZlci0+c2V0Q29uY3VycmVudENsaWVudExpbWl0KDQpOworCisgIGJhc2VsaW5lKDEwLCA0LCAic2VydmVyIGZyYW1ld29yayBjb25uZWN0aW9uIGxpbWl0Iik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9zdHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgc3RyZXNzKDEwLCBib29zdDo6cG9zaXhfdGltZTo6c2Vjb25kcygzKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoVFNlcnZlckludGVncmF0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF9pbnRlcnJ1cHRhYmxlX2NsaWVudHNfY29ubmVjdGVkKSB7CisgIC8vIFRoaXMgdGVzdHMgVEhSSUZULTI0NDEgbmV3IGJlaGF2aW9yOiBzdG9wcGluZyB0aGUgc2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHN0b3Agd2l0aCBpbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKKworICBzdGFydFNlcnZlcigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMS0+b3BlbigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworCisgIC8vIEVuc3VyZSB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZAorICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisKKyAgLy8gVGhlIHRlc3QgZml4dHVyZSBkZXN0cnVjdG9yIHdpbGwgZm9yY2UgdGhlIHNvY2tldHMgdG8gZGlzY29ubmVjdAorICAvLyBQcmlvciB0byBUSFJJRlQtMjQ0MSwgcFNlcnZlci0+c3RvcCgpIHdvdWxkIGhhbmcgdW50aWwgY2xpZW50cyBkaXNjb25uZWN0ZWQKKyAgc3RvcFNlcnZlcigpOworCisgIC8vIGV4dHJhIHByb29mIHRoZSBzZXJ2ZXIgZW5kIGRpc2Nvbm5lY3RlZCB0aGUgY2xpZW50cworICB1aW50OF90IGJ1ZlsxXTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcENsaWVudFNvY2sxLT5yZWFkKCZidWZbMF0sIDEpKTsgLy8gMCA9IGRpc2Nvbm5lY3RlZAorICBCT09TVF9DSEVDS19FUVVBTCgwLCBwQ2xpZW50U29jazItPnJlYWQoJmJ1ZlswXSwgMSkpOyAvLyAwID0gZGlzY29ubmVjdGVkCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RvcF93aXRoX3VuaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgeworICAvLyBUaGlzIHRlc3RzIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBibG9ja3MgdW50aWwgY2xpZW50cworICAvLyBkaXNjb25uZWN0LgorICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggdW5pbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKKworICBkeW5hbWljX3BvaW50ZXJfY2FzdDxUU2VydmVyU29ja2V0PihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKSkKKyAgICAgIC0+c2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKworICBzdGFydFNlcnZlcigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMS0+b3BlbigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworCisgIC8vIEVuc3VyZSB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZAorICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisKKyAgYm9vc3Q6OnRocmVhZCB0MShzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2sxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CisgIGJvb3N0Ojp0aHJlYWQgdDIoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOworCisgIC8vIE9uY2UgdGhlIGNsaWVudHMgZGlzY29ubmVjdCB0aGUgc2VydmVyIHdpbGwgc3RvcAorICBzdG9wU2VydmVyKCk7CisgIEJPT1NUX0NIRUNLKHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpID4gMCk7CisgIHQxLmpvaW4oKTsKKyAgdDIuam9pbigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NvbmN1cnJlbnRfY2xpZW50X2xpbWl0KSB7CisgIHN0YXJ0U2VydmVyKCk7CisgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQiKTsKKworICBCT09TVF9DSEVDS19FUVVBTChJTlQ2NF9NQVgsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpKTsKKyAgcFNlcnZlci0+c2V0Q29uY3VycmVudENsaWVudExpbWl0KDIpOworICBCT09TVF9DSEVDS19FUVVBTCgwLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDEpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSk7CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2syLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworCisgIC8vIGEgdGhpcmQgY2xpZW50IGNhbm5vdCBjb25uZWN0IHVudGlsIG9uZSBvZiB0aGUgb3RoZXIgdHdvIGNsb3NlcworICBib29zdDo6dGhyZWFkIHQyKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDI1MCkpKTsKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazMobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2syLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CisKKyAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOworICB0Mi5qb2luKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjNmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIlRUcmFuc3BvcnRDaGVja1Rocm93LmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUU2VydmVyU29ja2V0VGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9iaW5kX3RvX2FkZHJlc3MpIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7CisKKyAgc3RkOjpjb3V0IDw8ICJBbiBlcnJvciBtZXNzYWdlIGZyb20gZ2V0YWRkcmluZm8gb24gdGhlIGNvbnNvbGUgaXMgZXhwZWN0ZWQ6IiA8PCBzdGQ6OmVuZGw7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazIoIjI1Ny4yNTguMjU5LjI2MCIsIDApOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMi5saXN0ZW4oKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CisgIHNvY2syLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbGlzdGVuX3ZhbGlkX3BvcnQpIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgtMSk7CisgIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coc29jazEubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKworICBUU2VydmVyU29ja2V0IHNvY2syKDY1NTM2KTsKKyAgVFRSQU5TUE9SVF9DSEVDS19USFJPVyhzb2NrMi5saXN0ZW4oKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nsb3NlX2JlZm9yZV9saXN0ZW4pIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZ2V0X3BvcnQpIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxIb3N0IiwgODg4KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoODg4LCBzb2NrMS5nZXRQb3J0KCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWJkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclRyYW5zcG9ydFRlc3QpCisKK2NsYXNzIFRlc3RUVHJhbnNwb3J0IDogcHVibGljIFRUcmFuc3BvcnQge307CisKK2NsYXNzIFRlc3RUU2VydmVyVHJhbnNwb3J0IDogcHVibGljIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICBUZXN0VFNlcnZlclRyYW5zcG9ydCgpIDogdmFsaWRfKHRydWUpIHt9CisgIHZvaWQgY2xvc2UoKSB7fQorICBib29sIHZhbGlkXzsKKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSB7CisgICAgcmV0dXJuIHZhbGlkXyA/IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KG5ldyBUZXN0VFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgIDogc2hhcmVkX3B0cjxUZXN0VFRyYW5zcG9ydD4oKTsKKyAgfQorfTsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9wb3NpdGl2ZV9hY2NlcHQpIHsKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQgdXV0OworICBCT09TVF9DSEVDSyh1dXQuYWNjZXB0KCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25lZ2F0aXZlX2FjY2VwdCkgeworICBUZXN0VFNlcnZlclRyYW5zcG9ydCB1dXQ7CisgIHV1dC52YWxpZF8gPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1codXV0LmFjY2VwdCgpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjYyNDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRTb2NrZXRJbnRlcnJ1cHRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTb2NrZXRJbnRlcnJ1cHRUZXN0KQorCit2b2lkIHJlYWRlcldvcmtlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnJlYWQoYnVmLCA0KSk7Cit9CisKK3ZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgeworICB0cnkgeworICAgIHVpbnQ4X3QgYnVmWzRdOworICAgIHR0LT5yZWFkKGJ1ZiwgNCk7CisgICAgQk9PU1RfRVJST1IoInNob3VsZCBub3QgaGF2ZSBnb3R0ZW4gaGVyZSIpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXJNdXN0VGhyb3csIGFjY2VwdGVkKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGRpZCBub3QgaW50ZXJydXB0IGNoaWxkIHJlYWQiKTsKKyAgY2xpZW50U29jay5jbG9zZSgpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgaGVyZQorICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFyZWFkVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcmVhZCIpOworCisgIC8vIG9ubHkgd2F5IHRvIHByb2NlZWQgaXMgdG8gaGF2ZSB0aGUgY2xpZW50IGRpc2Nvbm5lY3QKKyAgY2xpZW50U29jay5jbG9zZSgpOworICByZWFkVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY2Fubm90X2NoYW5nZV9hZnRlcl9saXN0ZW4pIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmxpc3RlbigpOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKwordm9pZCBwZWVrZXJXb3JrZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCBib29sIGV4cGVjdGVkUmVzdWx0KSB7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkUmVzdWx0LCB0dC0+cGVlaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2UgaWYgY2hpbGQgaXMgaW50ZXJydXB0ZWQKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHBlZWtUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCBwZWVrIik7CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIC8vIHBlZWsoKSB3aWxsIHJldHVybiBmYWxzZSB3aGVuIHJlbW90ZSBzaWRlIGlzIGNsb3NlZAorICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIXBlZWtUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBpbnRlcnJ1cHRlZCBjaGlsZCBwZWVrIik7CisKKyAgLy8gb25seSB3YXkgdG8gcHJvY2VlZCBpcyB0byBoYXZlIHRoZSBjbGllbnQgZGlzY29ubmVjdAorICBjbGllbnRTb2NrLmNsb3NlKCk7CisgIHBlZWtUaHJlYWQuam9pbigpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaCBiL2xpYi9jcHAvdGVzdC9UVHJhbnNwb3J0Q2hlY2tUaHJvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjc3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjZGVmaW5lIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coX0NBTEwsIF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBjYXVnaHQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX0NBTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIF9UWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXVnaHQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShjYXVnaHQsICJleHBlY3RlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGJ1dCBub3RoaW5nIHdhcyB0aHJvd24iKTsgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBUVFJBTlNQT1JUX1JFUVVJUkVfVEhST1coX0NBTEwsIF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgY2F1Z2h0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9DQUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChleC5nZXRUeXBlKCksIF9UWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F1Z2h0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX1JFUVVJUkVfTUVTU0FHRShjYXVnaHQsICJleHBlY3RlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGJ1dCBub3RoaW5nIHdhcyB0aHJvd24iKTsgICAgICAgICAgXAorICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwIGIvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcAppbmRleCBiNzhmMjc2Li5hZjU2MDZlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKQEAgLTE5LDE1ICsxOSwxNSBAQAogCiAvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yawogCi0jaW5jbHVkZSA8cHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KICNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKIAotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIGJvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgewogICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7CiAgIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7CiB9Ci0KLX19Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Ub1N0cmluZ1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRvX3N0cmluZzsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRvU3RyaW5nVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoYmFzZV90eXBlc190b19zdHJpbmcpIHsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKDEwKSwgIjEwIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyh0cnVlKSwgIjEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKCdhJyksICJhIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygxLjIpLCAiMS4yIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygiYWJjIiksICJhYmMiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZW1wdHlfdmVjdG9yX3RvX3N0cmluZykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGw7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhsKSwgIltdIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBsLnB1c2hfYmFjaygxMDApOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbMTAwXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShtdWx0aXBsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBsLnB1c2hfYmFjaygxMDApOworICBsLnB1c2hfYmFjaygxNTApOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbMTAwLCAxNTBdIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5X21hcF90b19zdHJpbmcpIHsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gbTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKG0pLCAie30iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc2luZ2xlX2l0ZW1fbWFwX3RvX3N0cmluZykgeworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOworICBtWzEyXSA9ICJhYmMiOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiY30iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UobXVsdGlfaXRlbV9tYXBfdG9fc3RyaW5nKSB7CisgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG07CisgIG1bMTJdID0gImFiYyI7CisgIG1bMzFdID0gInh5eiI7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhtKSwgInsxMjogYWJjLCAzMTogeHl6fSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9zZXRfdG9fc3RyaW5nKSB7CisgIHN0ZDo6c2V0PGNoYXI+IHM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhzKSwgInt9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX3NldF90b19zdHJpbmcpIHsKKyAgc3RkOjpzZXQ8Y2hhcj4gczsKKyAgcy5pbnNlcnQoJ2MnKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKHMpLCAie2N9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fc2V0X3RvX3N0cmluZykgeworICBzdGQ6OnNldDxjaGFyPiBzOworICBzLmluc2VydCgnYScpOworICBzLmluc2VydCgneicpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7YSwgen0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX2VtcHR5X29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpFbXB0eVN0cnVjdCBlOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoZSksICJFbXB0eVN0cnVjdCgpIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9zaW5nbGVfYmFzaWNfZmllbGRfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6OlN0cnVjdEEgYTsKKyAgYS5fX3NldF9zKCJhYmNkIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlN0cnVjdEEocz1hYmNkKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfdHdvX2Jhc2ljX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6Qm9uayBhOworICBhLl9fc2V0X21lc3NhZ2UoImFiY2QiKTsKKyAgYS5fX3NldF90eXBlKDEyMzQpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJCb25rKG1lc3NhZ2U9YWJjZCwgdHlwZT0xMjM0KSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfb3B0aW9uYWxfZmllbGRzX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpUcmlja3kyIGE7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlRyaWNreTIoaW1fb3B0aW9uYWw9PG51bGw+KSIpOworICBhLl9fc2V0X2ltX29wdGlvbmFsKDEyMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlRyaWNreTIoaW1fb3B0aW9uYWw9MTIzKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfbmVzdGVkX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpPbmVGaWVsZCBhOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJPbmVGaWVsZChmaWVsZD1FbXB0eVN0cnVjdCgpKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfbmVzdGVkX2xpc3Rfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6Okxpc3RCb25rcyBsOworICBsLmJvbmsuYXNzaWduKDIsIHRocmlmdDo6dGVzdDo6Qm9uaygpKTsKKyAgbC5ib25rWzBdLl9fc2V0X21lc3NhZ2UoImEiKTsKKyAgbC5ib25rWzFdLl9fc2V0X21lc3NhZ2UoImIiKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksCisgICAgICAgICAgICAgICAgICAgICJMaXN0Qm9ua3MoYm9uaz1bQm9uayhtZXNzYWdlPWEsIHR5cGU9MCksIEJvbmsobWVzc2FnZT1iLCB0eXBlPTApXSkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggZDEyZTM4NC4uY2UxOTU0NCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcApAQCAtMTYsNDggKzE2LDU0IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotI2RlZmluZSBfR05VX1NPVVJDRSAvLyBuZWVkZWQgZm9yIGdldG9wdF9sb25nCi0jZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKICNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPGZzdHJlYW0+CiAKICNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KICNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzLmhwcD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CiAKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIHN0YXRpYyBib29zdDo6bXQxOTkzNyBybmc7Ci1zdGF0aWMgY29uc3QgY2hhciogdG1wX2RpciA9ICIvdG1wIjsKIAogdm9pZCBpbml0cmFuZCh1bnNpZ25lZCBpbnQgc2VlZCkgewogICBybmcuc2VlZChzZWVkKTsKIH0KIAogY2xhc3MgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkge30KICAgdmlydHVhbCB1aW50MzJfdCBuZXh0U2l6ZSgpID0gMDsKICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0ID0gMDsKIH07CiAKIGNsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvbnN0YW50U2l6ZUdlbmVyYXRvcih1aW50MzJfdCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9CiAgIHVpbnQzMl90IG5leHRTaXplKCkgeyByZXR1cm4gdmFsdWVfOyB9CiAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgewpAQCAtNjYsMTQgKzcyLDE0IEBACiAgICAgcmV0dXJuIGRlc2Muc3RyKCk7CiAgIH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICB1aW50MzJfdCB2YWx1ZV87CiB9OwogCiBjbGFzcyBSYW5kb21TaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgUmFuZG9tU2l6ZUdlbmVyYXRvcih1aW50MzJfdCBtaW4sIHVpbnQzMl90IG1heCkgOgotICAgIGdlbmVyYXRvcl8ocm5nLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PihtaW4sIG1heCkpIHt9CitwdWJsaWM6CisgIFJhbmRvbVNpemVHZW5lcmF0b3IodWludDMyX3QgbWluLCB1aW50MzJfdCBtYXgpCisgICAgOiBnZW5lcmF0b3JfKHJuZywgYm9vc3Q6OnVuaWZvcm1faW50PGludD4obWluLCBtYXgpKSB7fQogCiAgIHVpbnQzMl90IG5leHRTaXplKCkgeyByZXR1cm4gZ2VuZXJhdG9yXygpOyB9CiAKQEAgLTgzLDEyICs4OSwxMSBAQAogICAgIHJldHVybiBkZXNjLnN0cigpOwogICB9CiAKLSAgdWludDMyX3QgZ2V0TWluKCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5taW4oKTsgfQotICB1aW50MzJfdCBnZXRNYXgoKSBjb25zdCB7IHJldHVybiBnZW5lcmF0b3JfLmRpc3RyaWJ1dGlvbigpLm1heCgpOyB9CisgIHVpbnQzMl90IGdldE1pbigpIGNvbnN0IHsgcmV0dXJuIChnZW5lcmF0b3JfLmRpc3RyaWJ1dGlvbigpLm1pbikoKTsgfQorICB1aW50MzJfdCBnZXRNYXgoKSBjb25zdCB7IHJldHVybiAoZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5tYXgpKCk7IH0KIAotIHByaXZhdGU6Ci0gIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcmLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PiA+Ci0gICAgZ2VuZXJhdG9yXzsKK3ByaXZhdGU6CisgIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjxib29zdDo6bXQxOTkzNyYsIGJvb3N0Ojp1bmlmb3JtX2ludDxpbnQ+ID4gZ2VuZXJhdG9yXzsKIH07CiAKIC8qKgpAQCAtOTksMTcgKzEwNCwxNiBAQAogICogICB0byBtYWtlIGEgY29weSBvZiB0aGUgZ2VuZXJhdG9yIHRvIGJpbmQgaXQgdG8gdGhlIHRlc3QgZnVuY3Rpb24uKQogICovCiBjbGFzcyBHZW5lcmljU2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6Ci0gICAgZ2VuZXJhdG9yXyhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHZhbHVlKSkge30KLSAgR2VuZXJpY1NpemVHZW5lcmF0b3IodWludDMyX3QgbWluLCB1aW50MzJfdCBtYXgpIDoKLSAgICBnZW5lcmF0b3JfKG5ldyBSYW5kb21TaXplR2VuZXJhdG9yKG1pbiwgbWF4KSkge30KK3B1YmxpYzoKKyAgR2VuZXJpY1NpemVHZW5lcmF0b3IodWludDMyX3QgdmFsdWUpIDogZ2VuZXJhdG9yXyhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHZhbHVlKSkge30KKyAgR2VuZXJpY1NpemVHZW5lcmF0b3IodWludDMyX3QgbWluLCB1aW50MzJfdCBtYXgpCisgICAgOiBnZW5lcmF0b3JfKG5ldyBSYW5kb21TaXplR2VuZXJhdG9yKG1pbiwgbWF4KSkge30KIAogICB1aW50MzJfdCBuZXh0U2l6ZSgpIHsgcmV0dXJuIGdlbmVyYXRvcl8tPm5leHRTaXplKCk7IH0KICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCB7IHJldHVybiBnZW5lcmF0b3JfLT5kZXNjcmliZSgpOyB9CiAKLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBnZW5lcmF0b3JfOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IGdlbmVyYXRvcl87CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyNiwzMSArMTMwLDMxIEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogY2xhc3MgQ291cGxlZFRyYW5zcG9ydHMgewotIHB1YmxpYzoKK3B1YmxpYzoKKyAgdmlydHVhbCB+Q291cGxlZFRyYW5zcG9ydHMoKSB7fQogICB0eXBlZGVmIFRyYW5zcG9ydF8gVHJhbnNwb3J0VHlwZTsKIAogICBDb3VwbGVkVHJhbnNwb3J0cygpIDogaW4oKSwgb3V0KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBpbjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gaW47CisgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBvdXQ7CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgQ291cGxlZFRyYW5zcG9ydHMoY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKLSAgQ291cGxlZFRyYW5zcG9ydHMgJm9wZXJhdG9yPShjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpOworICBDb3VwbGVkVHJhbnNwb3J0cyYgb3BlcmF0b3I9KGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7CiB9OwogCiAvKioKICAqIENvdXBsZWQgVE1lbW9yeUJ1ZmZlcnMKICAqLwogY2xhc3MgQ291cGxlZE1lbW9yeUJ1ZmZlcnMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VE1lbW9yeUJ1ZmZlcj4gewotIHB1YmxpYzoKLSAgQ291cGxlZE1lbW9yeUJ1ZmZlcnMoKSA6Ci0gICAgYnVmKG5ldyBUTWVtb3J5QnVmZmVyKSB7CitwdWJsaWM6CisgIENvdXBsZWRNZW1vcnlCdWZmZXJzKCkgOiBidWYobmV3IFRNZW1vcnlCdWZmZXIpIHsKICAgICBpbiA9IGJ1ZjsKICAgICBvdXQgPSBidWY7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7CiB9OwogCiAvKioKQEAgLTE1OSw3ICsxNjMsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgV3JhcHBlclRyYW5zcG9ydF8sIGNsYXNzIElubmVyQ291cGxlZFRyYW5zcG9ydHNfPgogY2xhc3MgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVCA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxXcmFwcGVyVHJhbnNwb3J0Xz4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVCgpIHsKICAgICBpZiAoaW5uZXJfLmluKSB7CiAgICAgICB0aGlzLT5pbi5yZXNldChuZXcgV3JhcHBlclRyYW5zcG9ydF8oaW5uZXJfLmluKSk7CkBAIC0xNzYsNDAgKzE4MCwzNSBAQAogICogQ291cGxlZCBUQnVmZmVyZWRUcmFuc3BvcnRzLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJUcmFuc3BvcnRfPgotY2xhc3MgQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1QgOgotICBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUQnVmZmVyZWRUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4gewotfTsKK2NsYXNzIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUCisgICAgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUQnVmZmVyZWRUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4ge307CiAKLXR5cGVkZWYgQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+Ci0gIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPiBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzOwogCiAvKioKICAqIENvdXBsZWQgVEZyYW1lZFRyYW5zcG9ydHMuCiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBJbm5lclRyYW5zcG9ydF8+Ci1jbGFzcyBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1QgOgotICBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxURnJhbWVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHsKLX07CitjbGFzcyBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1QKKyAgICA6IHB1YmxpYyBDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHNUPFRGcmFtZWRUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4ge307CiAKLXR5cGVkZWYgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0czsKK3R5cGVkZWYgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPiBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0czsKIAogLyoqCiAgKiBDb3VwbGVkIFRabGliVHJhbnNwb3J0cy4KICAqLwogdGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KLWNsYXNzIENvdXBsZWRabGliVHJhbnNwb3J0c1QgOgotICBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUWmxpYlRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7Ci19OworY2xhc3MgQ291cGxlZFpsaWJUcmFuc3BvcnRzVCA6IHB1YmxpYyBDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHNUPFRabGliVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+Ci0gIENvdXBsZWRabGliVHJhbnNwb3J0czsKK3R5cGVkZWYgQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZFpsaWJUcmFuc3BvcnRzOwogCisjaWZuZGVmIF9XSU4zMgorLy8gRkQgdHJhbnNwb3J0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIG9uIFdpbmRvd3MuCiAvKioKICAqIENvdXBsZWQgVEZEVHJhbnNwb3J0cy4KICAqLwogY2xhc3MgQ291cGxlZEZEVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxURkRUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvdXBsZWRGRFRyYW5zcG9ydHMoKSB7CiAgICAgaW50IHBpcGVzWzJdOwogCkBAIC0yMjEsNTQgKzIyMCw3MyBAQAogICAgIG91dC5yZXNldChuZXcgVEZEVHJhbnNwb3J0KHBpcGVzWzFdLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpKTsKICAgfQogfTsKKyNlbHNlCisvKioKKyAqIENvdXBsZWQgcGlwZSB0cmFuc3BvcnRzCisgKi8KK2NsYXNzIENvdXBsZWRQaXBlVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxUUGlwZT4geworcHVibGljOgorICBIQU5ETEUgaFJlYWQ7CisgIEhBTkRMRSBoV3JpdGU7CisKKyAgQ291cGxlZFBpcGVUcmFuc3BvcnRzKCkgeworICAgIEJPT1NUX1JFUVVJUkUoQ3JlYXRlUGlwZSgmaFJlYWQsICZoV3JpdGUsIE5VTEwsIDEwNDg1NzYgKiAyKSk7CisgICAgaW4ucmVzZXQobmV3IFRQaXBlKGhSZWFkLCBoV3JpdGUpKTsKKyAgICBpbi0+b3BlbigpOworICAgIG91dCA9IGluOworICB9Cit9OworI2VuZGlmCiAKIC8qKgogICogQ291cGxlZCBUU29ja2V0cwogICovCiBjbGFzcyBDb3VwbGVkU29ja2V0VHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxUU29ja2V0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygpIHsKLSAgICBpbnQgc29ja2V0c1syXTsKLSAgICBpZiAoc29ja2V0cGFpcihQRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc29ja2V0cykgIT0gMCkgeworICAgIFRIUklGVF9TT0NLRVQgc29ja2V0c1syXSA9IHswfTsKKyAgICBpZiAoVEhSSUZUX1NPQ0tFVFBBSVIoUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNvY2tldHMpICE9IDApIHsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpbi5yZXNldChuZXcgVFNvY2tldChzb2NrZXRzWzBdKSk7CiAgICAgb3V0LnJlc2V0KG5ldyBUU29ja2V0KHNvY2tldHNbMV0pKTsKKyAgICBvdXQtPnNldFNlbmRUaW1lb3V0KDEwMCk7CiAgIH0KIH07CiAKKy8vIFRoZXNlIGNvdWxkIGJlIG1hZGUgdG8gd29yayBvbiBXaW5kb3dzLCBidXQgSSBkb24ndCBjYXJlIGVub3VnaCB0byBtYWtlIGl0IGhhcHBlbgorI2lmbmRlZiBfV0lOMzIKIC8qKgogICogQ291cGxlZCBURmlsZVRyYW5zcG9ydHMKICAqLwogY2xhc3MgQ291cGxlZEZpbGVUcmFuc3BvcnRzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRGaWxlVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7CisjaWZuZGVmIF9XSU4zMgorICAgIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSAiL3RtcCI7CisjZGVmaW5lIEZJTEVOQU1FX1NVRkZJWCAiL3RocmlmdC50cmFuc3BvcnRfdGVzdCIKKyNlbHNlCisgICAgY29uc3QgY2hhciogdG1wX2RpciA9IGdldGVudigiVE1QIik7CisjZGVmaW5lIEZJTEVOQU1FX1NVRkZJWCAiXFx0aHJpZnQudHJhbnNwb3J0X3Rlc3QiCisjZW5kaWYKKwogICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotICAgIHNpemVfdCBmaWxlbmFtZV9sZW4gPSBzdHJsZW4odG1wX2RpcikgKyAzMjsKLSAgICBmaWxlbmFtZSA9IG5ldyBjaGFyW2ZpbGVuYW1lX2xlbl07Ci0gICAgc25wcmludGYoZmlsZW5hbWUsIGZpbGVuYW1lX2xlbiwKLSAgICAgICAgICAgICAiJXMvdGhyaWZ0LnRyYW5zcG9ydF90ZXN0LlhYWFhYWCIsIHRtcF9kaXIpOwotICAgIGZkID0gbWtzdGVtcChmaWxlbmFtZSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBmaWxlbmFtZS5yZXNpemUoc3RybGVuKHRtcF9kaXIpICsgc3RybGVuKEZJTEVOQU1FX1NVRkZJWCkpOworICAgIFRIUklGVF9TTlBSSU5URigmZmlsZW5hbWVbMF0sIGZpbGVuYW1lLnNpemUoKSwgIiVzIiBGSUxFTkFNRV9TVUZGSVgsIHRtcF9kaXIpOworI3VuZGVmIEZJTEVOQU1FX1NVRkZJWAorCisgICAgeyBzdGQ6Om9mc3RyZWFtIGR1bW15X2NyZWF0aW9uKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6b2ZzdHJlYW06OnRydW5jKTsgfQogCiAgICAgaW4ucmVzZXQobmV3IFRGaWxlVHJhbnNwb3J0KGZpbGVuYW1lLCB0cnVlKSk7CiAgICAgb3V0LnJlc2V0KG5ldyBURmlsZVRyYW5zcG9ydChmaWxlbmFtZSkpOwogICB9CiAKLSAgfkNvdXBsZWRGaWxlVHJhbnNwb3J0cygpIHsKLSAgICBpZiAoZmQgPj0gMCkgewotICAgICAgY2xvc2UoZmQpOwotICAgICAgdW5saW5rKGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgZGVsZXRlW10gZmlsZW5hbWU7Ci0gIH0KKyAgfkNvdXBsZWRGaWxlVHJhbnNwb3J0cygpIHsgcmVtb3ZlKGZpbGVuYW1lLmNfc3RyKCkpOyB9CiAKLSAgY2hhciogZmlsZW5hbWU7Ci0gIGludCBmZDsKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7CiB9OworI2VuZGlmCiAKIC8qKgogICogV3JhcHBlciBhcm91bmQgYW5vdGhlciBDb3VwbGVkVHJhbnNwb3J0cyBpbXBsZW1lbnRhdGlvbiB0aGF0IGV4cG9zZXMgdGhlCkBAIC0yODAsNyArMjk4LDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzXz4KIGNsYXNzIENvdXBsZWRUVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxUVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkVFRyYW5zcG9ydHMoKSA6IHRyYW5zcG9ydHMoKSB7CiAgICAgaW4gPSB0cmFuc3BvcnRzLmluOwogICAgIG91dCA9IHRyYW5zcG9ydHMub3V0OwpAQCAtMjk4LDcgKzMxNiw3IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0c18+CiBjbGFzcyBDb3VwbGVkQnVmZmVyQmFzZXMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEJ1ZmZlckJhc2U+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvdXBsZWRCdWZmZXJCYXNlcygpIDogdHJhbnNwb3J0cygpIHsKICAgICBpbiA9IHRyYW5zcG9ydHMuaW47CiAgICAgb3V0ID0gdHJhbnNwb3J0cy5vdXQ7CkBAIC0zMjIsNDQgKzM0MCw0MiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgVHJpZ2dlckluZm8gewotICBUcmlnZ2VySW5mbyhpbnQgc2Vjb25kcywgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVMZW5ndGgpIDoKLSAgICB0aW1lb3V0U2Vjb25kcyhzZWNvbmRzKSwKLSAgICB0cmFuc3BvcnQodHJhbnNwb3J0KSwKLSAgICB3cml0ZUxlbmd0aCh3cml0ZUxlbmd0aCksCi0gICAgbmV4dChOVUxMKSB7fQorICBUcmlnZ2VySW5mbyhpbnQgc2Vjb25kcywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsIHVpbnQzMl90IHdyaXRlTGVuZ3RoKQorICAgIDogdGltZW91dFNlY29uZHMoc2Vjb25kcyksIHRyYW5zcG9ydCh0cmFuc3BvcnQpLCB3cml0ZUxlbmd0aCh3cml0ZUxlbmd0aCksIG5leHQoTlVMTCkge30KIAogICBpbnQgdGltZW91dFNlY29uZHM7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKICAgdWludDMyX3Qgd3JpdGVMZW5ndGg7CiAgIFRyaWdnZXJJbmZvKiBuZXh0OwogfTsKIAotVHJpZ2dlckluZm8qIHRyaWdnZXJJbmZvOwotdW5zaWduZWQgaW50IG51bVRyaWdnZXJzRmlyZWQ7CithcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgZ19hbGFybV9tb25pdG9yOworVHJpZ2dlckluZm8qIGdfdHJpZ2dlckluZm87Cit1bnNpZ25lZCBpbnQgZ19udW1UcmlnZ2Vyc0ZpcmVkOworYm9vbCBnX3RlYXJkb3duID0gZmFsc2U7CiAKLXZvaWQgc2V0X2FsYXJtKCk7Cit2b2lkIGFsYXJtX2hhbmRsZXIoKSB7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gTlVMTDsKKyAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICAvLyBUaGUgYWxhcm0gdGltZWQgb3V0LCB3aGljaCBhbG1vc3QgY2VydGFpbmx5IG1lYW5zIHdlJ3JlIHN0dWNrCisgICAgLy8gb24gYSB0cmFuc3BvcnQgdGhhdCBpcyBpbmNvcnJlY3RseSBibG9ja2VkLgorICAgICsrZ19udW1UcmlnZ2Vyc0ZpcmVkOwogCi12b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZ251bSkgewotICAodm9pZCkgc2lnbnVtOwotICAvLyBUaGUgYWxhcm0gdGltZWQgb3V0LCB3aGljaCBhbG1vc3QgY2VydGFpbmx5IG1lYW5zIHdlJ3JlIHN0dWNrCi0gIC8vIG9uIGEgdHJhbnNwb3J0IHRoYXQgaXMgaW5jb3JyZWN0bHkgYmxvY2tlZC4KLSAgKytudW1UcmlnZ2Vyc0ZpcmVkOworICAgIC8vIE5vdGU6IHdlIHByaW50IG1lc3NhZ2VzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciwgc2luY2UKKyAgICAvLyB0b29scy90ZXN0L3J1bm5lciBvbmx5IHJlY29yZHMgc3Rkb3V0IG1lc3NhZ2VzIGluIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIGZvcgorICAgIC8vIGJvb3N0IHRlc3RzLiAgKGJvb3N0IHByaW50cyBpdHMgdGVzdCBpbmZvIHRvIHN0ZG91dC4pCisgICAgcHJpbnRmKCJUaW1lb3V0IGFsYXJtIGV4cGlyZWQ7IGF0dGVtcHRpbmcgdG8gdW5ibG9jayB0cmFuc3BvcnRcbiIpOworICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgIHByaW50ZigiICB0cmlnZ2VyIHN0YWNrIGlzIGVtcHR5IVxuIik7CisgICAgfQogCi0gIC8vIE5vdGU6IHdlIHByaW50IG1lc3NhZ2VzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciwgc2luY2UKLSAgLy8gdG9vbHMvdGVzdC9ydW5uZXIgb25seSByZWNvcmRzIHN0ZG91dCBtZXNzYWdlcyBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlcyBmb3IKLSAgLy8gYm9vc3QgdGVzdHMuICAoYm9vc3QgcHJpbnRzIGl0cyB0ZXN0IGluZm8gdG8gc3Rkb3V0LikKLSAgcHJpbnRmKCJUaW1lb3V0IGFsYXJtIGV4cGlyZWQ7IGF0dGVtcHRpbmcgdG8gdW5ibG9jayB0cmFuc3BvcnRcbiIpOwotICBpZiAodHJpZ2dlckluZm8gPT0gTlVMTCkgewotICAgIHByaW50ZigiICB0cmlnZ2VyIHN0YWNrIGlzIGVtcHR5IVxuIik7CisgICAgLy8gUG9wIG9mZiB0aGUgZmlyc3QgVHJpZ2dlckluZm8uCisgICAgLy8gSWYgdGhlcmUgaXMgYW5vdGhlciBvbmUsIHNjaGVkdWxlIGFuIGFsYXJtIGZvciBpdC4KKyAgICBpbmZvID0gZ190cmlnZ2VySW5mbzsKKyAgICBnX3RyaWdnZXJJbmZvID0gaW5mby0+bmV4dDsKICAgfQogCi0gIC8vIFBvcCBvZmYgdGhlIGZpcnN0IFRyaWdnZXJJbmZvLgotICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIG9uZSwgc2NoZWR1bGUgYW4gYWxhcm0gZm9yIGl0LgotICBUcmlnZ2VySW5mbyogaW5mbyA9IHRyaWdnZXJJbmZvOwotICB0cmlnZ2VySW5mbyA9IGluZm8tPm5leHQ7Ci0gIHNldF9hbGFybSgpOwotCiAgIC8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgdHJhbnNwb3J0IHRvIGhvcGVmdWxseSB1bmJsb2NrIGl0LgogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtpbmZvLT53cml0ZUxlbmd0aF07CiAgIG1lbXNldChidWYsICdiJywgaW5mby0+d3JpdGVMZW5ndGgpOwpAQCAtMzcwLDIxICszODYsMjggQEAKICAgZGVsZXRlIGluZm87CiB9CiAKLXZvaWQgc2V0X2FsYXJtKCkgewotICBpZiAodHJpZ2dlckluZm8gPT0gTlVMTCkgewotICAgIC8vIGNsZWFyIGFueSBhbGFybQotICAgIGFsYXJtKDApOwotICAgIHJldHVybjsKK3ZvaWQgYWxhcm1faGFuZGxlcl93cmFwcGVyKCkgeworICBpbnQ2NF90IHRpbWVvdXQgPSAwOyAvLyB0aW1lb3V0IG9mIDAgbWVhbnMgd2FpdCBmb3JldmVyCisgIHdoaWxlICh0cnVlKSB7CisgICAgYm9vbCBmaXJlSGFuZGxlciA9IGZhbHNlOworICAgIHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICAgIGlmIChnX3RlYXJkb3duKQorICAgICAgICByZXR1cm47CisgICAgICAvLyBjYWxjdWxhdGUgdGltZW91dAorICAgICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gTlVMTCkgeworICAgICAgICB0aW1lb3V0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVvdXQgPSBnX3RyaWdnZXJJbmZvLT50aW1lb3V0U2Vjb25kcyAqIDEwMDA7CisgICAgICB9CisKKyAgICAgIGludCB3YWl0UmVzdWx0ID0gZ19hbGFybV9tb25pdG9yLndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dCk7CisgICAgICBpZiAod2FpdFJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKQorICAgICAgICBmaXJlSGFuZGxlciA9IHRydWU7CisgICAgfQorICAgIGlmIChmaXJlSGFuZGxlcikKKyAgICAgIGFsYXJtX2hhbmRsZXIoKTsgLy8gY2FsbGluZyBvdXRzaWRlIHRoZSBsb2NrCiAgIH0KLQotICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKLSAgbWVtc2V0KCZhY3Rpb24sIDAsIHNpemVvZihhY3Rpb24pKTsKLSAgYWN0aW9uLnNhX2hhbmRsZXIgPSBhbGFybV9oYW5kbGVyOwotICBhY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7Ci0gIHNpZ2VtcHR5c2V0KCZhY3Rpb24uc2FfbWFzayk7Ci0gIHNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0aW9uLCBOVUxMKTsKLQotICBhbGFybSh0cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMpOwogfQogCiAvKioKQEAgLTM5NiwzMSArNDE5LDM3IEBACiAgKiB0byB0aGUgZW5kLikKICAqLwogdm9pZCBhZGRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gJnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2xlbikgewogICBUcmlnZ2VySW5mbyogaW5mbyA9IG5ldyBUcmlnZ2VySW5mbyhzZWNvbmRzLCB0cmFuc3BvcnQsIHdyaXRlX2xlbik7Ci0KLSAgaWYgKHRyaWdnZXJJbmZvID09IE5VTEwpIHsKLSAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0cmlnZ2VyLgotICAgIC8vIFNldCB0cmlnZ2VySW5mbywgYW5kIHNjaGVkdWxlIHRoZSBhbGFybQotICAgIHRyaWdnZXJJbmZvID0gaW5mbzsKLSAgICBzZXRfYWxhcm0oKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBBZGQgdGhpcyB0cmlnZ2VyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLSAgICBUcmlnZ2VySW5mbyogcHJldiA9IHRyaWdnZXJJbmZvOwotICAgIHdoaWxlIChwcmV2LT5uZXh0KSB7Ci0gICAgICBwcmV2ID0gcHJldi0+bmV4dDsKKyAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICBpZiAoZ190cmlnZ2VySW5mbyA9PSBOVUxMKSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0cmlnZ2VyLgorICAgICAgLy8gU2V0IGdfdHJpZ2dlckluZm8sIGFuZCBzY2hlZHVsZSB0aGUgYWxhcm0KKyAgICAgIGdfdHJpZ2dlckluZm8gPSBpbmZvOworICAgICAgZ19hbGFybV9tb25pdG9yLm5vdGlmeSgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBZGQgdGhpcyB0cmlnZ2VyIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgIFRyaWdnZXJJbmZvKiBwcmV2ID0gZ190cmlnZ2VySW5mbzsKKyAgICAgIHdoaWxlIChwcmV2LT5uZXh0KSB7CisgICAgICAgIHByZXYgPSBwcmV2LT5uZXh0OworICAgICAgfQorICAgICAgcHJldi0+bmV4dCA9IGluZm87CiAgICAgfQotCi0gICAgcHJldi0+bmV4dCA9IGluZm87CiAgIH0KIH0KIAogdm9pZCBjbGVhcl90cmlnZ2VycygpIHsKLSAgVHJpZ2dlckluZm8gKmluZm8gPSB0cmlnZ2VySW5mbzsKLSAgYWxhcm0oMCk7Ci0gIHRyaWdnZXJJbmZvID0gTlVMTDsKLSAgbnVtVHJpZ2dlcnNGaXJlZCA9IDA7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gTlVMTDsKKworICB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgIGluZm8gPSBnX3RyaWdnZXJJbmZvOworICAgIGdfdHJpZ2dlckluZm8gPSBOVUxMOworICAgIGdfbnVtVHJpZ2dlcnNGaXJlZCA9IDA7CisgICAgZ19hbGFybV9tb25pdG9yLm5vdGlmeSgpOworICB9CiAKICAgd2hpbGUgKGluZm8gIT0gTlVMTCkgewogICAgIFRyaWdnZXJJbmZvKiBuZXh0ID0gaW5mby0+bmV4dDsKQEAgLTQzMCw3ICs0NTksNyBAQAogfQogCiB2b2lkIHNldF90cmlnZ2VyKHVuc2lnbmVkIGludCBzZWNvbmRzLAotICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiAmdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbGVuKSB7CiAgIGNsZWFyX3RyaWdnZXJzKCk7CiAgIGFkZF90cmlnZ2VyKHNlY29uZHMsIHRyYW5zcG9ydCwgd3JpdGVfbGVuKTsKQEAgLTQ3NCwxMCArNTAzLDggQEAKICAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOwogICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOwogCi0gIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gd2J1ZiA9Ci0gICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKLSAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiByYnVmID0KLSAgICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KG5ldyB1aW50OF90W3RvdGFsU2l6ZV0pOworICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IHdidWYgPSBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KG5ldyB1aW50OF90W3RvdGFsU2l6ZV0pOworICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IHJidWYgPSBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KG5ldyB1aW50OF90W3RvdGFsU2l6ZV0pOwogCiAgIC8vIHN0b3JlIHNvbWUgZGF0YSBpbiB3YnVmCiAgIGZvciAodWludDMyX3QgbiA9IDA7IG4gPCB0b3RhbFNpemU7ICsrbikgewpAQCAtNDk3LDggKzUyNCw3IEBACiAKICAgICAvLyBNYWtlIHN1cmUgKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKSArIHdjaHVua19zaXplCiAgICAgLy8gaXMgbGVzcyB0aGFuIG1heE91dHN0YW5kaW5nCi0gICAgaWYgKG1heE91dHN0YW5kaW5nID4gMCAmJgotICAgICAgICB3Y2h1bmtfc2l6ZSA+IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKSkgeworICAgIGlmIChtYXhPdXRzdGFuZGluZyA+IDAgJiYgd2NodW5rX3NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkpIHsKICAgICAgIHdjaHVua19zaXplID0gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpOwogICAgIH0KIApAQCAtNTEwLDcgKzUzNiwxMyBAQAogICAgICAgICB3cml0ZV9zaXplID0gd2NodW5rX3NpemUgLSBjaHVua193cml0dGVuOwogICAgICAgfQogCi0gICAgICB0cmFuc3BvcnRzLm91dC0+d3JpdGUod2J1Zi5nZXQoKSArIHRvdGFsX3dyaXR0ZW4sIHdyaXRlX3NpemUpOworICAgICAgdHJ5IHsKKyAgICAgICAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdidWYuZ2V0KCkgKyB0b3RhbF93cml0dGVuLCB3cml0ZV9zaXplKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAgIGlmICh0ZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKQorICAgICAgICAgIGJyZWFrOworICAgICAgICB0aHJvdyB0ZTsKKyAgICAgIH0KICAgICAgIGNodW5rX3dyaXR0ZW4gKz0gd3JpdGVfc2l6ZTsKICAgICAgIHRvdGFsX3dyaXR0ZW4gKz0gd3JpdGVfc2l6ZTsKICAgICB9CkBAIC01NDAsMTcgKzU3MiwxNSBAQAogICAgICAgdHJ5IHsKICAgICAgICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmJ1Zi5nZXQoKSArIHRvdGFsX3JlYWQsIHJlYWRfc2l6ZSk7CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIEJPT1NUX0ZBSUwoInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8Ci0gICAgICAgICAgICAgICAgICAgIikgdGhyZXcgZXhjZXB0aW9uIFwiIiA8PCBlLndoYXQoKSA8PAotICAgICAgICAgICAgICAgICAgICJcIjsgd3JpdHRlbiBzbyBmYXI6ICIgPDwgdG90YWxfd3JpdHRlbiA8PCAiIC8gIiA8PAotICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSA8PCAiIGJ5dGVzIik7CisgICAgICAgIEJPT1NUX0ZBSUwoInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8ICIpIHRocmV3IGV4Y2VwdGlvbiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlLndoYXQoKSA8PCAiXCI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b3RhbFNpemUgPDwgIiBieXRlcyIpOwogICAgICAgfQogCiAgICAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoYnl0ZXNfcmVhZCA+IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NpemUgPDwgIikgcmV0dXJuZWQgIiA8PCBieXRlc19yZWFkIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsgd3JpdHRlbiBzbyBmYXI6ICIgPDwgdG90YWxfd3JpdHRlbiA8PCAiIC8gIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSA8PCAiIGJ5dGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8ICIpIHJldHVybmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBieXRlc19yZWFkIDw8ICI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIC8gIiA8PCB0b3RhbFNpemUgPDwgIiBieXRlcyIpOwogICAgICAgY2h1bmtfcmVhZCArPSBieXRlc19yZWFkOwogICAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkOwogICAgIH0KQEAgLTU3Niw4ICs2MDYsMzUgQEAKICAgdHJhbnNwb3J0cy5vdXQtPmZsdXNoKCk7CiAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkgMCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkgOSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KTkpOworCisgIGNsZWFyX3RyaWdnZXJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KK3ZvaWQgdGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rcygpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgdWludDhfdCByZWFkX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIFdyaXRlIDEwIGJ5dGVzIChpbiBhIHNpbmdsZSBmcmFtZSwgZm9yIHRyYW5zcG9ydHMgdGhhdCB1c2UgZnJhbWluZykKKyAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdyaXRlX2J1ZiwgMTApOworICB0cmFuc3BvcnRzLm91dC0+Zmx1c2goKTsKKworICAvLyBSZWFkIDEgYnl0ZSwgdG8gZm9yY2UgdGhlIHRyYW5zcG9ydCB0byByZWFkIHRoZSBmcmFtZQorICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsIDF1KTsKKworICAvLyBSZWFkIG1vcmUgdGhhbiB3aGF0IGlzIHJlbWFpbmluZyBhbmQgdmVyaWZ5IHRoZSB0cmFuc3BvcnQgZG9lcyBub3QgYmxvY2sKKyAgc2V0X3RyaWdnZXIoMywgdHJhbnNwb3J0cy5vdXQsIDEpOworICBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMTApOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsIDB1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgOXUpOwogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CiB9CkBAIC02MTYsNyArNjczLDcgQEAKIAogICAvLyBOb3cgcmVhZCA0IGJ5dGVzLCBzbyB0aGF0IHdlIGFyZSBwYXJ0d2F5IHRocm91Z2ggdGhlIHdyaXR0ZW4gZGF0YS4KICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDQpOwotICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpIDQpOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpNCk7CiAKICAgLy8gTm93IGF0dGVtcHQgdG8gcmVhZCAxMCBieXRlcy4gIE9ubHkgOSBtb3JlIGFyZSBhdmFpbGFibGUuCiAgIC8vCkBAIC02MjksMTMgKzY4NiwxMyBAQAogICB3aGlsZSAodG90YWxfcmVhZCA8IDkpIHsKICAgICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CiAgICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKLSAgICBCT09TVF9SRVFVSVJFX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOwotICAgIEJPT1NUX1JFUVVJUkVfR1QoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KSAwKTsKKyAgICBCT09TVF9SRVFVSVJFX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKyAgICBCT09TVF9SRVFVSVJFX0dUKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkwKTsKICAgICB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQ7Ci0gICAgQk9PU1RfUkVRVUlSRV9MRSh0b3RhbF9yZWFkLCAodWludDMyX3QpIDkpOworICAgIEJPT1NUX1JFUVVJUkVfTEUodG90YWxfcmVhZCwgKHVpbnQzMl90KTkpOwogICB9CiAKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwodG90YWxfcmVhZCwgKHVpbnQzMl90KSA5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG90YWxfcmVhZCwgKHVpbnQzMl90KTkpOwogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CiB9CkBAIC02NTcsNyArNzE0LDcgQEAKICAgc2V0X3RyaWdnZXIoMywgdHJhbnNwb3J0cy5vdXQsIDEpOwogICB1aW50MzJfdCBib3Jyb3dfbGVuID0gMTA7CiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkX2J1ZiA9IHRyYW5zcG9ydHMuaW4tPmJvcnJvdyhyZWFkX2J1ZiwgJmJvcnJvd19sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChudW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOwogICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKQEAgLTY4MywxMSArNzQwLDExIEBACiAgIGFkZF90cmlnZ2VyKDEsIHRyYW5zcG9ydHMub3V0LCA4KTsKICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKICAgICBjbGVhcl90cmlnZ2VycygpOwogICB9IGVsc2UgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDEpOwotICAgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkgMik7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTEpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkyKTsKICAgfQogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CkBAIC03MDcsNyArNzY0LDcgQEAKICAgdWludDMyX3QgYm9ycm93X2xlbiA9IDEwOwogICBjb25zdCB1aW50OF90KiBib3Jyb3dlZF9idWYgPSB0cmFuc3BvcnRzLmluLT5ib3Jyb3coTlVMTCwgJmJvcnJvd19sZW4pOwogICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKIH0KQEAgLTcyMiw1MyArNzc5LDQ2IEBACiAgKiAtIENvbWJpbmluZyBtYW55IHRlc3RzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8KICAqICAgdGVsbCBwcmVjaXNlbHkgd2hpY2ggdGVzdHMgZmFpbGVkLiAgSXQgYWxzbyBtZWFucyB5b3UgY2FuJ3QgZ2V0IGEgcHJvZ3Jlc3MKICAqICAgdXBkYXRlIGFmdGVyIGVhY2ggdGVzdCwgYW5kIHRoZSB0ZXN0cyBhcmUgYWxyZWFkeSBmYWlybHkgc2xvdy4KLSAqIC0gU2ltaWxhciByZWdpc3RyYXRpb24gY291bGQgYmUgYWNoZWl2ZWQgd2l0aCBCT09TVF9URVNUX0NBU0VfVEVNUExBVEUsCisgKiAtIFNpbWlsYXIgcmVnaXN0cmF0aW9uIGNvdWxkIGJlIGFjaGlldmVkIHdpdGggQk9PU1RfVEVTVF9DQVNFX1RFTVBMQVRFLAogICogICBidXQgaXQgcmVxdWlyZXMgYSBsb3Qgb2YgYXdrd2FyZCBNUEwgY29kZSwgYW5kIHJlc3VsdHMgaW4gdXNlbGVzcyB0ZXN0CiAgKiAgIGNhc2UgbmFtZXMuICAoVGhlIG5hbWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSBzdGQ6OnR5cGVfaW5mbzo6bmFtZSgpLCB3aGljaAogICogICBpcyBjb21waWxlci1kZXBlbmRlbnQuICBnY2MgcmV0dXJucyBtYW5nbGVkIG5hbWVzLikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBBRERfVEVTVF9SVyhDb3VwbGVkVHJhbnNwb3J0cywgdG90YWxTaXplLCAuLi4pIFwKLSAgICBhZGRUZXN0Ulc8IENvdXBsZWRUcmFuc3BvcnRzID4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsKKyNkZWZpbmUgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWRkVGVzdFJXPENvdXBsZWRUcmFuc3BvcnRzPihCT09TVF9TVFJJTkdJWkUoQ291cGxlZFRyYW5zcG9ydHMpLCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOwogCi0jZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSBcCi0gIGRvIHsgXAotICAgIC8qIEFkZCB0aGUgdGVzdCBhcyBzcGVjaWZpZWQsIHRvIHRlc3QgdGhlIG5vbi12aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkVHJhbnNwb3J0cywgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBcCi0gICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCBcCi0gICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyBcCi0gICAgICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+LCBcCi0gICAgICAgICAgICAgICAgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBUZXN0IHdyYXBwaW5nIHRoZSB0cmFuc3BvcnQgd2l0aCBUQnVmZmVyZWRUcmFuc3BvcnQgKi8gXAotICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCi0gICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gXAotICAgIEFERF9URVNUX1JXKENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIFwKLSAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsgXAotICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRabGliVHJhbnNwb3J0ICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCisjZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQWRkIHRoZSB0ZXN0IGFzIHNwZWNpZmllZCwgdG8gdGVzdCB0aGUgbm9uLXZpcnR1YWwgZnVuY3Rpb24gY2FsbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVFpsaWJUcmFuc3BvcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpIFwKLSAgICBhZGRUZXN0QmxvY2tpbmc8IENvdXBsZWRUcmFuc3BvcnRzID4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CisjZGVmaW5lIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkZFRlc3RCbG9ja2luZzxDb3VwbGVkVHJhbnNwb3J0cz4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CiAKLSNkZWZpbmUgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkVHJhbnNwb3J0cykgXAotICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPik7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgXAotICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgXAorI2RlZmluZSBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7CiAKIGNsYXNzIFRyYW5zcG9ydFRlc3RHZW4gewotIHB1YmxpYzoKLSAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwKLSAgICAgICAgICAgICAgICAgICBmbG9hdCBzaXplTXVsdGlwbGllcikgOgotICAgICAgc3VpdGVfKHN1aXRlKSwKLSAgICAgIHNpemVNdWx0aXBsaWVyXyhzaXplTXVsdGlwbGllcikge30KK3B1YmxpYzoKKyAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwgZmxvYXQgc2l6ZU11bHRpcGxpZXIpCisgICAgOiBzdWl0ZV8oc3VpdGUpLCBzaXplTXVsdGlwbGllcl8oc2l6ZU11bHRpcGxpZXIpIHt9CiAKICAgdm9pZCBnZW5lcmF0ZSgpIHsKICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByYW5kNGsoMSwgNDA5Nik7CkBAIC03NzksMTA0ICs4MjksMTM5IEBACiAgICAgICovCiAKICAgICAvLyBUTWVtb3J5QnVmZmVyIHRlc3RzCi0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoxMDI0LCAwLCAwKTsKLSAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0KjI1NiwgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCAxNjcsIDE2Myk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoxNiwgMSwgMSk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDE2LCAxLCAxKTsKIAotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRNZW1vcnlCdWZmZXJzKTsKIAorI2lmbmRlZiBfV0lOMzIKICAgICAvLyBURkRUcmFuc3BvcnQgdGVzdHMKICAgICAvLyBTaW5jZSBDb3VwbGVkRkRUcmFuc3BvcnRzIHRlc3RzIHdpdGggYSBwaXBlLCB3cml0ZXMgd2lsbCBibG9jawogICAgIC8vIGlmIHRoZXJlIGlzIHRvbyBtdWNoIG91dHN0YW5kaW5nIHVucmVhZCBkYXRhIGluIHRoZSBwaXBlLgogICAgIHVpbnQzMl90IGZkX21heF9vdXRzdGFuZGluZyA9IDQwOTY7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjEwMjQsIDAsIDAsCi0gICAgICAgICAgICAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLAotICAgICAgICAgICAgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKIAotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoyNTYsIDAsIDAsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoyNTYsIDE2NywgMTYzLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGRFRyYW5zcG9ydHMpOworI2Vsc2UKKyAgICAvLyBUUGlwZSB0ZXN0cyAoV0lOMzIgb25seSkKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxKTsKKworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkUGlwZVRyYW5zcG9ydHMpOworI2VuZGlmIC8vX1dJTjMyCiAKICAgICAvLyBUU29ja2V0IHRlc3RzCiAgICAgdWludDMyX3Qgc29ja2V0X21heF9vdXRzdGFuZGluZyA9IDQwOTY7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoxMDI0LCAwLCAwLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIDE2NywgMTYzLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDAsIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CiAgICAgLy8gRG9oLiAgQXBwYXJlbnRseSB3cml0aW5nIHRvIGEgc29ja2V0IGhhcyBzb21lIGFkZGl0aW9uYWwgb3ZlcmhlYWQgZm9yCiAgICAgLy8gZWFjaCBzZW5kKCkgY2FsbC4gIElmIHdlIGhhdmUgbW9yZSB0aGFuIH40MDAgb3V0c3RhbmRpbmcgMS1ieXRlIHdyaXRlCiAgICAgLy8gcmVxdWVzdHMsIGFkZGl0aW9uYWwgc2VuZCgpIGNhbGxzIHN0YXJ0IGJsb2NraW5nLgotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMTYsIDEsIDEsCi0gICAgICAgICAgICAwLCAwLCA0MDApOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAwLCAwLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgMTY3LCAxNjMsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoxNiwgMSwgMSwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCA0MDApOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsCisgICAgICAgICAgICAxMDI0ICogMjU2LAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKIAogICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMpOwogCisvLyBUaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKyNpZm5kZWYgX1dJTjMyCiAgICAgLy8gVEZpbGVUcmFuc3BvcnQgdGVzdHMKICAgICAvLyBXZSB1c2Ugc21hbGxlciBidWZmZXIgc2l6ZXMgaGVyZSwgc2luY2UgVEZpbGVUcmFuc3BvcnQgaXMgZmFpcmx5IHNsb3cuCiAgICAgLy8KICAgICAvLyBURmlsZVRyYW5zcG9ydCBjYW4ndCB3cml0ZSBtb3JlIHRoYW4gMTZNQiBhdCBvbmNlCi0gICAgdWludDMyX3QgbWF4X3dyaXRlX2F0X29uY2UgPSAxMDI0KjEwMjQqMTYgLSA0OwotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjEwMjQsIG1heF93cml0ZV9hdF9vbmNlLCAwKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoxMjgsIHJhbmQ0aywgcmFuZDRrKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoxMjgsIDE2NywgMTYzKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoyLCAxLCAxKTsKKyAgICB1aW50MzJfdCBtYXhfd3JpdGVfYXRfb25jZSA9IDEwMjQgKiAxMDI0ICogMTYgLSA0OworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgbWF4X3dyaXRlX2F0X29uY2UsIDApOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTI4LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAxMjgsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDIsIDEsIDEpOwogCi0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqNjQsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCo2NCwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqNjQsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAyLCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGaWxlVHJhbnNwb3J0cyk7CisjZW5kaWYKIAogICAgIC8vIEFkZCBzb21lIHRlc3RzIHRoYXQgYWNjZXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBhbmQgVEZyYW1lZFRyYW5zcG9ydAogICAgIC8vIHZpYSBUVHJhbnNwb3J0IHBvaW50ZXJzIGFuZCBUQnVmZmVyQmFzZSBwb2ludGVycy4KICAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM+LAotICAgICAgICAgICAgICAgIDEwMjQqMTAyNCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOwogICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkRnJhbWVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzPiwKLSAgICAgICAgICAgICAgICAxMDI0KjEwMjQsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKIAogICAgIC8vIFRlc3QgdXNpbmcgVFpsaWJUcmFuc3BvcnQgdmlhIGEgVFRyYW5zcG9ydCBwb2ludGVyCiAgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRabGliVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgIH0KIAotIHByaXZhdGU6CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorI2RlZmluZSBNQUtFX1RFU1RfQ0FTRShfRlVOQywgX05BTUUpIGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKF9GVU5DLCBfTkFNRSwgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUgTUFLRV9URVNUX0NBU0UoX0ZVTkMsIF9OQU1FKSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZShfRlVOQywgX05BTUUpCisjZW5kaWYKKworcHJpdmF0ZToKICAgdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgotICB2b2lkIGFkZFRlc3RSVyhjb25zdCBjaGFyKiB0cmFuc3BvcnRfbmFtZSwgdWludDMyX3QgdG90YWxTaXplLAotICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbiwgR2VuZXJpY1NpemVHZW5lcmF0b3IgclNpemVHZW4sCisgIHZvaWQgYWRkVGVzdFJXKGNvbnN0IGNoYXIqIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbFNpemUsCisgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHdTaXplR2VuLAorICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByU2l6ZUdlbiwKICAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3Igd0NodW5rU2l6ZUdlbiA9IDAsCiAgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJDaHVua1NpemVHZW4gPSAwLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhPdXRzdGFuZGluZyA9IDAsCkBAIC04ODUsNTUgKzk3MCw0NiBAQAogICAgIHRvdGFsU2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0b3RhbFNpemUgKiBzaXplTXVsdGlwbGllcl8pOwogCiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG5hbWU7Ci0gICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwKLSAgICAgIHdTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwKLSAgICAgIHdDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8Ci0gICAgICBtYXhPdXRzdGFuZGluZyA8PCAiKSI7CisgICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwgd1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiCisgICAgICAgICA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgd0NodW5rU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIKKyAgICAgICAgIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IG1heE91dHN0YW5kaW5nIDw8ICIpIjsKIAotICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYyA9Ci0gICAgICBzdGQ6OnRyMTo6YmluZCh0ZXN0X3J3PENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLAotICAgICAgICAgICAgICAgICAgICAgd1NpemVHZW4sIHJTaXplR2VuLCB3Q2h1bmtTaXplR2VuLCByQ2h1bmtTaXplR2VuLAotICAgICAgICAgICAgICAgICAgICAgbWF4T3V0c3RhbmRpbmcpOwotICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgPQotICAgICAgYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UodGVzdF9mdW5jLCBuYW1lLnN0cigpKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jCisjZWxzZQorICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYworI2VuZGlmCisgICAgICAgID0gc3RkOjpiaW5kKHRlc3Rfcnc8Q291cGxlZFRyYW5zcG9ydHM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDaHVua1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ2h1bmtTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T3V0c3RhbmRpbmcpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfZnVuYywgbmFtZS5zdHIoKSksIGV4cGVjdGVkRmFpbHVyZXMpOwogICB9CiAKICAgdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgotICB2b2lkIGFkZFRlc3RCbG9ja2luZyhjb25zdCBjaGFyKiB0cmFuc3BvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZEZhaWx1cmVzID0gMCkgeworICB2b2lkIGFkZFRlc3RCbG9ja2luZyhjb25zdCBjaGFyKiB0cmFuc3BvcnROYW1lLCB1aW50MzJfdCBleHBlY3RlZEZhaWx1cmVzID0gMCkgewogICAgIGNoYXIgbmFtZVsxMDI0XTsKLSAgICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lKCkiLAotICAgICAgICAgICAgIHRyYW5zcG9ydE5hbWUpOwotICAgIHRjID0gYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoCi0gICAgICAgICAgdGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKIAotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfbm9uZV9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CiAKLSAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSIsCi0gICAgICAgICAgICAgdHJhbnNwb3J0TmFtZSk7Ci0gICAgdGMgPSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSgKLSAgICAgICAgICB0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKKworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogICB9CiAKICAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGVfOwpAQCAtOTQ4LDEwMyArMTAyNCw2OCBAQAogICogR2VuZXJhbCBJbml0aWFsaXphdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIHByaW50X3VzYWdlKEZJTEUqIGYsIGNvbnN0IGNoYXIqIGFyZ3YwKSB7Ci0gIGZwcmludGYoZiwgIlVzYWdlOiAlcyBbYm9vc3Rfb3B0aW9uc10gW29wdGlvbnNdXG4iLCBhcmd2MCk7Ci0gIGZwcmludGYoZiwgIk9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZihmLCAiICAtLXNlZWQ9PE4+LCAtcyA8Tj5cbiIpOwotICBmcHJpbnRmKGYsICIgIC0tdG1wLWRpcj1ESVIsIC10IERJUlxuIik7Ci0gIGZwcmludGYoZiwgIiAgLS1oZWxwXG4iKTsKLX0KK3N0cnVjdCBnbG9iYWxfZml4dHVyZSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gYWxhcm1UaHJlYWRfOworICBnbG9iYWxfZml4dHVyZSgpIHsKKyNpZiBfV0lOMzIKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKIAotc3RydWN0IE9wdGlvbnMgewotICBpbnQgc2VlZDsKLSAgYm9vbCBoYXZlU2VlZDsKLSAgZmxvYXQgc2l6ZU11bHRpcGxpZXI7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgZmFjdG9yeTsKKyAgICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKworICAgIGFsYXJtVGhyZWFkXyA9IGZhY3RvcnkubmV3VGhyZWFkKAorICAgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OkZ1bmN0aW9uUnVubmVyOjpjcmVhdGUoYWxhcm1faGFuZGxlcl93cmFwcGVyKSk7CisgICAgYWxhcm1UaHJlYWRfLT5zdGFydCgpOworICB9CisgIH5nbG9iYWxfZml4dHVyZSgpIHsKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgICBnX3RlYXJkb3duID0gdHJ1ZTsKKyAgICAgIGdfYWxhcm1fbW9uaXRvci5ub3RpZnkoKTsKKyAgICB9CisgICAgYWxhcm1UaHJlYWRfLT5qb2luKCk7CisgIH0KIH07CiAKLXZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciogYXJndltdLCBPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGJvb2wgaGF2ZV9zZWVkID0gZmFsc2U7Ci0gIG9wdGlvbnMtPnNpemVNdWx0aXBsaWVyID0gMTsKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShnbG9iYWxfZml4dHVyZSk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoZ2xvYmFsX2ZpeHR1cmUpCisjZW5kaWYKIAotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0gewotICAgIHsgImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnIH0sCi0gICAgeyAic2VlZCIsIHRydWUsIE5VTEwsICdzJyB9LAotICAgIHsgInRtcC1kaXIiLCB0cnVlLCBOVUxMLCAndCcgfSwKLSAgICB7ICJzaXplLW11bHRpcGxpZXIiLCB0cnVlLCBOVUxMLCAneCcgfSwKLSAgICB7IE5VTEwsIDAsIE5VTEwsIDAgfQotICB9OworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBUSFJJRlRfR0VUVElNRU9GREFZKCZ0diwgTlVMTCk7CisgIGludCBzZWVkID0gdHYudHZfc2VjIF4gdHYudHZfdXNlYzsKIAotICB3aGlsZSAodHJ1ZSkgewotICAgIG9wdG9wdCA9IDE7Ci0gICAgaW50IG9wdGNoYXIgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaHM6dDp4OiIsIGxvbmdfb3B0cywgTlVMTCk7Ci0gICAgaWYgKG9wdGNoYXIgPT0gLTEpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KKyAgaW5pdHJhbmQoc2VlZCk7CiAKLSAgICBzd2l0Y2ggKG9wdGNoYXIpIHsKLSAgICAgIGNhc2UgJ3QnOgotICAgICAgICB0bXBfZGlyID0gb3B0YXJnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3MnOiB7Ci0gICAgICAgIGNoYXIgKmVuZHB0cjsKLSAgICAgICAgb3B0aW9ucy0+c2VlZCA9IHN0cnRvbChvcHRhcmcsICZlbmRwdHIsIDApOwotICAgICAgICBpZiAoZW5kcHRyID09IG9wdGFyZyB8fCAqZW5kcHRyICE9ICdcMCcpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgc2VlZCB2YWx1ZSBcIiVzXCI6IG11c3QgYmUgYW4gaW50ZWdlclxuIiwKLSAgICAgICAgICAgICAgICAgIG9wdGFyZyk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBoYXZlX3NlZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJ2gnOgotICAgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDApOwotICAgICAgY2FzZSAneCc6IHsKLSAgICAgICAgY2hhciAqZW5kcHRyOwotICAgICAgICBvcHRpb25zLT5zaXplTXVsdGlwbGllciA9IHN0cnRvZihvcHRhcmcsICZlbmRwdHIpOwotICAgICAgICBpZiAoZW5kcHRyID09IG9wdGFyZyB8fCAqZW5kcHRyICE9ICdcMCcpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgc2l6ZSBtdWx0aXBsaWVyIFwiJXNcIjogbXVzdCBiZSBhIG51bWJlclxuIiwKLSAgICAgICAgICAgICAgICAgIG9wdGFyZyk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3B0aW9ucy0+c2l6ZU11bHRpcGxpZXIgPCAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHNpemUgbXVsdGlwbGllciBcIiVzXCI6ICIKLSAgICAgICAgICAgICAgICAgICJtdXN0IGJlIG5vbi1uZWdhdGl2ZVxuIiwgb3B0YXJnKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAotICAgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgfQotCi0gIGlmICghaGF2ZV9zZWVkKSB7Ci0gICAgLy8gY2hvb3NlIGEgc2VlZCBub3cgaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgb25lCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgc3RydWN0IHRpbWV6b25lIHR6OwotICAgIGdldHRpbWVvZmRheSgmdHYsICZ0eik7Ci0gICAgb3B0aW9ucy0+c2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7Ci0gIH0KKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlRyYW5zcG9ydFRlc3QiOworICBUcmFuc3BvcnRUZXN0R2VuIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvcihzdWl0ZSwgMSk7CisgIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvci5nZW5lcmF0ZSgpOworICByZXR1cm4gdHJ1ZTsKIH0KIAoraW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgLy8gUGFyc2UgYXJndW1lbnRzCi0gIE9wdGlvbnMgb3B0aW9uczsKLSAgcGFyc2VfYXJncyhhcmdjLCBhcmd2LCAmb3B0aW9ucyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBUSFJJRlRfR0VUVElNRU9GREFZKCZ0diwgTlVMTCk7CisgIGludCBzZWVkID0gdHYudHZfc2VjIF4gdHYudHZfdXNlYzsKIAotICBpbml0cmFuZChvcHRpb25zLnNlZWQpOworICBpbml0cmFuZChzZWVkKTsKIAotICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9Ci0gICAgJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOwogICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlRyYW5zcG9ydFRlc3QiOwotICBUcmFuc3BvcnRUZXN0R2VuIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvcihzdWl0ZSwgb3B0aW9ucy5zaXplTXVsdGlwbGllcik7CisgIFRyYW5zcG9ydFRlc3RHZW4gdHJhbnNwb3J0X3Rlc3RfZ2VuZXJhdG9yKHN1aXRlLCAxKTsKICAgdHJhbnNwb3J0X3Rlc3RfZ2VuZXJhdG9yLmdlbmVyYXRlKCk7Ci0KICAgcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UeXBlZGVmVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTkyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3NhbWUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oIgorCitCT09TVF9TVEFUSUNfQVNTRVJUKChib29zdDo6aXNfc2FtZTxpbnQzMl90LCB0aHJpZnQ6OnRlc3Q6Ok15SW50MzI+Ojp2YWx1ZSkpOworQk9PU1RfU1RBVElDX0FTU0VSVCgoYm9vc3Q6OmlzX3NhbWU8c3RkOjpzdHJpbmcsIHRocmlmdDo6dGVzdDo6TXlTdHJpbmc+Ojp2YWx1ZSkpOworQk9PU1RfU1RBVElDX0FTU0VSVCgKKyAgICAoYm9vc3Q6OmlzX3NhbWU8dGhyaWZ0Ojp0ZXN0OjpUeXBlZGVmVGVzdFN0cnVjdCwgdGhyaWZ0Ojp0ZXN0OjpNeVN0cnVjdD46OnZhbHVlKSk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcAppbmRleCA5ZGY5ZGM0Li5jODI2ODE0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKQEAgLTE3LDMxICsxNywzOCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0KICNpZm5kZWYgX0dOVV9TT1VSQ0UKICNkZWZpbmUgX0dOVV9TT1VSQ0UgLy8gbmVlZGVkIGZvciBnZXRvcHRfbG9uZwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPD0gMTcwMCkKKy8vIHBvbHlub21pYWwgYW5kIHN0ZDo6ZmlsbF90IHdhcm5pbmcgaGFwcGVucyBpbiBNU1ZDIDIwMTAsIDIwMTMsIG1heWJlIG90aGVycworLy8gaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMvYm9vc3QvdGlja2V0LzExNDI2CisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CiAKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogYm9vc3Q6Om10MTk5Mzcgcm5nOwogCkBAIC01MCwyNiArNTcsMjQgQEAKICAqLwogCiBjbGFzcyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflNpemVHZW5lcmF0b3IoKSB7fQogICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgPSAwOwogfTsKIAogY2xhc3MgQ29uc3RhbnRTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHVuc2lnbmVkIGludCB2YWx1ZSkgOiB2YWx1ZV8odmFsdWUpIHt9Ci0gIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldFNpemUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgeyByZXR1cm4gdmFsdWVfOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdW5zaWduZWQgaW50IHZhbHVlXzsKIH07CiAKIGNsYXNzIExvZ05vcm1hbFNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKGRvdWJsZSBtZWFuLCBkb3VibGUgc3RkX2RldikgOgotICAgICAgZ2VuXyhybmcsIGxvZ25vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPihtZWFuLCBzdGRfZGV2KSkge30KK3B1YmxpYzoKKyAgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcihkb3VibGUgbWVhbiwgZG91YmxlIHN0ZF9kZXYpCisgICAgOiBnZW5fKHJuZywgYm9vc3Q6OmxvZ25vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPihtZWFuLCBzdGRfZGV2KSkge30KIAogICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgewogICAgIC8vIExvb3AgdW50aWwgd2UgZ2V0IGEgc2l6ZSBvZiAxIG9yIG1vcmUKQEAgLTgxLDI2ICs4NiwyNiBAQAogICAgIH0KICAgfQogCi0gcHJpdmF0ZToKLSAgdmFyaWF0ZV9nZW5lcmF0b3I8IG10MTk5MzcsIGxvZ25vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPiA+IGdlbl87Citwcml2YXRlOgorICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gPiBnZW5fOwogfTsKIAotdWludDhfdCogZ2VuX3VuaWZvcm1fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4sIHVpbnQ4X3QgYykgeworYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBnZW5fdW5pZm9ybV9idWZmZXIodWludDMyX3QgYnVmX2xlbiwgdWludDhfdCBjKSB7CiAgIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOwogICBtZW1zZXQoYnVmLCBjLCBidWZfbGVuKTsKLSAgcmV0dXJuIGJ1ZjsKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKIH0KIAotdWludDhfdCogZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIodWludDMyX3QgYnVmX2xlbikgeworYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBnZW5fY29tcHJlc3NpYmxlX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7CiAgIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOwogCiAgIC8vIEdlbmVyYXRlIHNtYWxsIHJ1bnMgb2YgYWx0ZXJuYXRlbHkgaW5jcmVhc2luZyBhbmQgZGVjcmVhc2luZyBieXRlcwogICBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50MzJfdD4gcnVuX2xlbmd0aF9kaXN0cmlidXRpb24oMSwgNjQpOwogICBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50OF90PiBieXRlX2Rpc3RyaWJ1dGlvbigwLCBVSU5UOF9NQVgpOwotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3LCBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50OF90PiA+Ci0gICAgYnl0ZV9nZW5lcmF0b3Iocm5nLCBieXRlX2Rpc3RyaWJ1dGlvbik7Ci0gIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQzMl90PiA+Ci0gICAgcnVuX2xlbl9nZW5lcmF0b3Iocm5nLCBydW5fbGVuZ3RoX2Rpc3RyaWJ1dGlvbik7CisgIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjxib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgorICAgICAgYnl0ZV9nZW5lcmF0b3Iocm5nLCBieXRlX2Rpc3RyaWJ1dGlvbik7CisgIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjxib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDMyX3Q+ID4KKyAgICAgIHJ1bl9sZW5fZ2VuZXJhdG9yKHJuZywgcnVuX2xlbmd0aF9kaXN0cmlidXRpb24pOwogCiAgIHVpbnQzMl90IGlkeCA9IDA7CiAgIGludDhfdCBzdGVwID0gMTsKQEAgLTEyMCw0MSArMTI1LDQxIEBACiAgICAgc3RlcCAqPSAtMTsKICAgfQogCi0gIHJldHVybiBidWY7CisgIHJldHVybiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KGJ1Zik7CiB9CiAKLXVpbnQ4X3QqIGdlbl9yYW5kb21fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX3JhbmRvbV9idWZmZXIodWludDMyX3QgYnVmX2xlbikgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKIAogICBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50OF90PiBkaXN0cmlidXRpb24oMCwgVUlOVDhfTUFYKTsKLSAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPCBib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgotICAgIGdlbmVyYXRvcihybmcsIGRpc3RyaWJ1dGlvbik7CisgIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjxib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgorICAgICAgZ2VuZXJhdG9yKHJuZywgZGlzdHJpYnV0aW9uKTsKIAogICBmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgYnVmX2xlbjsgKytuKSB7CiAgICAgYnVmW25dID0gZ2VuZXJhdG9yKCk7CiAgIH0KIAotICByZXR1cm4gYnVmOworICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihidWYpOwogfQogCiAvKgogICogVGVzdCBmdW5jdGlvbnMKICAqLwogCi12b2lkIHRlc3Rfd3JpdGVfdGhlbl9yZWFkKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewordm9pZCB0ZXN0X3dyaXRlX3RoZW5fcmVhZChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogCiAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOwogICBCT09TVF9SRVFVSVJFX0VRVUFMKGdvdCwgYnVmX2xlbik7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1ZiwgYnVmX2xlbiksIDApOworICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYuZ2V0KCksIGJ1Zl9sZW4pLCAwKTsKICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKIH0KIAotdm9pZCB0ZXN0X3NlcGFyYXRlX2NoZWNrc3VtKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewordm9pZCB0ZXN0X3NlcGFyYXRlX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIFRoaXMgb25lIGlzIHRyaWNreS4gIEkgc2VwYXJhdGUgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIG91dAogICAvLyBpbnRvIGEgc2VwYXJhdGUgY3JidWZfLiAgVGhlIGxhc3QgYnl0ZSBpcyBwYXJ0IG9mIHRoZSBjaGVja3N1bSwKICAgLy8gc28gdGhlIGVudGlyZSByZWFkIGdvZXMgZmluZSwgYnV0IHdoZW4gSSBnbyB0byB2ZXJpZnkgdGhlIGNoZWNrc3VtCkBAIC0xNjMsMzkgKzE2OCwzOCBAQAogICAvLyBJdCB3b3JrZWQuICBBd2Vzb21lLgogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKICAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKICAgemxpYl90cmFucy5yZXNldChuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWmxpYlRyYW5zcG9ydDo6REVGQVVMVF9VUkJVRl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfYnVmLmxlbmd0aCgpLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkgLSAxKSkpOwogCiAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZEFsbChtaXJyb3IuZ2V0KCksIGJ1Zl9sZW4pOwogICBCT09TVF9SRVFVSVJFX0VRVUFMKGdvdCwgYnVmX2xlbik7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1ZiwgYnVmX2xlbiksIDApOworICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYuZ2V0KCksIGJ1Zl9sZW4pLCAwKTsKICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKIH0KIAotdm9pZCB0ZXN0X2luY29tcGxldGVfY2hlY2tzdW0oY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7Cit2b2lkIHRlc3RfaW5jb21wbGV0ZV9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyBNYWtlIHN1cmUgd2Ugc3RpbGwgZ2V0IHRoYXQgIm5vdCBjb21wbGV0ZSIgZXJyb3IgaWYKICAgLy8gaXQgcmVhbGx5IGlzbid0IGNvbXBsZXRlLgogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKICAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKICAgdG1wX2J1Zi5lcmFzZSh0bXBfYnVmLmxlbmd0aCgpIC0gMSk7Ci0gIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4oCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAotICAgICAgICAgICAgICAgICAgICAgIHRtcF9idWYubGVuZ3RoKCkpOworICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkpKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWRBbGwobWlycm9yLmdldCgpLCBidWZfbGVuKTsKICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnb3QsIGJ1Zl9sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYsIGJ1Zl9sZW4pLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CiAgIHRyeSB7CiAgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKICAgICBCT09TVF9FUlJPUigidmVyaWZ5Q2hlY2tzdW0oKSBkaWQgbm90IHJlcG9ydCBhbiBlcnJvciIpOwpAQCAtMjA0LDcgKzIwOCw4IEBACiAgIH0KIH0KIAotdm9pZCB0ZXN0X3JlYWRfd3JpdGVfbWl4KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbiwKK3ZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHdyaXRlX2dlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiByZWFkX2dlbikgewogICAvLyBUcnkgaXQgd2l0aCBhIG1peCBvZiByZWFkL3dyaXRlIHNpemVzLgpAQCAtMjE4LDcgKzIyMyw3IEBACiAgICAgaWYgKHRvdCArIHdyaXRlX2xlbiA+IGJ1Zl9sZW4pIHsKICAgICAgIHdyaXRlX2xlbiA9IGJ1Zl9sZW4gLSB0b3Q7CiAgICAgfQotICAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiArIHRvdCwgd3JpdGVfbGVuKTsKKyAgICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCkgKyB0b3QsIHdyaXRlX2xlbik7CiAgICAgdG90ICs9IHdyaXRlX2xlbjsKICAgfQogCkBAIC0yMzQsMTkgKzIzOSwxOSBAQAogICAgIH0KICAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKG1pcnJvci5nZXQoKSArIHRvdCwgcmVhZF9sZW4pOwogICAgIEJPT1NUX1JFUVVJUkVfTEUoZ290LCBleHBlY3RlZF9yZWFkX2xlbik7Ci0gICAgQk9PU1RfUkVRVUlSRV9ORShnb3QsICh1aW50MzJfdCkgMCk7CisgICAgQk9PU1RfUkVRVUlSRV9ORShnb3QsICh1aW50MzJfdCkwKTsKICAgICB0b3QgKz0gZ290OwogICB9CiAKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLCBidWZfbGVuKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOwogICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwogfQogCi12b2lkIHRlc3RfaW52YWxpZF9jaGVja3N1bShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF9pbnZhbGlkX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIFZlcmlmeSBjaGVja3N1bSBjaGVja2luZy4KICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKICAgc3RyaW5nIHRtcF9idWY7CiAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7CkBAIC0yNjQsMTEgKzI2OSwxMCBAQAogICAvLyAoV2hlbiB0aGlzIG9jY3VycywgdmVyaWZ5Q2hlY2tzdW0oKSB0aHJvd3MgYW4gZXhjZXB0aW9uIGluZGljYXRpbmcKICAgLy8gdGhhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGhhc24ndCBiZWVuIHJlYWNoZWQuKSAgSSBoYXZlbid0IHNlZW4gdGhpcwogICAvLyBlcnJvciB3aGVuIG9ubHkgbW9kaWZ5aW5nIGNoZWNrc3VtIGJ5dGVzLgotICBpbnQgaW5kZXggPSB0bXBfYnVmLnNpemUoKSAtIDE7CisgIGludCBpbmRleCA9IHN0YXRpY19jYXN0PGludD4odG1wX2J1Zi5zaXplKCkgLSAxKTsKICAgdG1wX2J1ZltpbmRleF0rKzsKLSAgbWVtYnVmLT5yZXNldEJ1ZmZlcihjb25zdF9jYXN0PHVpbnQ4X3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgdG1wX2J1Zi5sZW5ndGgoKSk7CisgIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odG1wX2J1Zi5kYXRhKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wX2J1Zi5sZW5ndGgoKSkpOwogCiAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKICAgdHJ5IHsKQEAgLTI4MCwxMSArMjg0LDExIEBACiAgIH0KIH0KIAotdm9pZCB0ZXN0X3dyaXRlX2FmdGVyX2ZsdXNoKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewordm9pZCB0ZXN0X3dyaXRlX2FmdGVyX2ZsdXNoKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIHdyaXRlIHNvbWUgZGF0YQogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAKICAgLy8gY2FsbCBmaW5pc2goKQogICB6bGliX3RyYW5zLT5maW5pc2goKTsKQEAgLTMyNSwyNSArMzI5LDQ1IEBACiAgICAgVFpsaWJUcmFuc3BvcnQgd196bGliX3RyYW5zKG1lbWJ1Zik7CiAgIH0KIAotICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYtPmF2YWlsYWJsZV9yZWFkKCksICh1aW50MzJfdCkgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWJ1Zi0+YXZhaWxhYmxlX3JlYWQoKSwgKHVpbnQzMl90KTApOworfQorCit2b2lkIHRlc3RfZ2V0X3VuZGVybHlpbmdfdHJhbnNwb3J0KCkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWJ1Zi5nZXQoKSwgemxpYl90cmFucy0+Z2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpLmdldCgpKTsKIH0KIAogLyoKICAqIEluaXRpYWxpemF0aW9uCiAgKi8KIAotI2RlZmluZSBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCBmdW5jdGlvbiwgLi4uKSBcCi0gIGRvIHsgXAotICAgIDo6c3RkOjpvc3RyaW5nc3RyZWFtIG5hbWVfc3M7IFwKLSAgICBuYW1lX3NzIDw8IG5hbWUgPDwgIi0iIDw8IEJPT1NUX1NUUklOR0laRShmdW5jdGlvbik7IFwKLSAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKCBcCi0gICAgICAgIDo6c3RkOjp0cjE6OmJpbmQoZnVuY3Rpb24sICMjIF9fVkFfQVJHU19fKSwgXAotICAgICAgICBuYW1lX3NzLnN0cigpKTsgXAotICAgIChzdWl0ZSktPmFkZCh0Yyk7IFwKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCisjZGVmaW5lIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIF9GVU5DLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjpzdGQ6OmJpbmQoX0ZVTkMsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA9IDo6Ym9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UodGVzdF9mdW5jLCBuYW1lX3NzLnN0cigpLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICAgXAorICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgX0ZVTkMsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lX3NzIDw8IG5hbWUgPDwgIi0iIDw8IEJPT1NUX1NUUklOR0laRShfRlVOQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKDo6c3RkOjpiaW5kKF9GVU5DLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjX19WQV9BUkdTX18pLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9zcy5zdHIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCiAKLXZvaWQgYWRkX3Rlc3RzKHVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUsCi0gICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBidWYsCit2b2lkIGFkZF90ZXN0cyhib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4mIGJ1ZiwKICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKSB7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3Rfd3JpdGVfdGhlbl9yZWFkLCBidWYsIGJ1Zl9sZW4pOwpAQCAtMzUyLDIwICszNzYsMzAgQEAKICAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF9pbnZhbGlkX2NoZWNrc3VtLCBidWYsIGJ1Zl9sZW4pOwogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X3dyaXRlX2FmdGVyX2ZsdXNoLCBidWYsIGJ1Zl9sZW4pOwogCi0gIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV8zMmsobmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigxPDwxNSkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfMzJrKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMSA8PCAxNSkpOwogICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItY29uc3RhbnQiLAotICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICBzaXplXzMyaywgc2l6ZV8zMmspOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItbG9nbm9ybWFsLXdyaXRlIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsIHNpemVfMzJrKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWxvZ25vcm1hbC1yZWFkIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV8zMmssIHNpemVfbG9nbm9ybWFsKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWxvZ25vcm1hbC1ib3RoIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsIHNpemVfbG9nbm9ybWFsKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWNvbnN0YW50IiwgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLCBzaXplXzMyaywgc2l6ZV8zMmspOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtd3JpdGUiLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsCisgICAgICAgICAgICAgICAgc2l6ZV8zMmspOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtcmVhZCIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICBzaXplXzMyaywKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1ib3RoIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsKTsKIAogICAvLyBUZXN0IHdpdGggYSByYW5kb20gc2l6ZSBkaXN0cmlidXRpb24sCiAgIC8vIGJ1dCB1c2UgdGhlIGV4YWN0IHNhbWUgZGlzdHJpYnV0aW9uIGZvciByZWFkaW5nIGFzIGZvciB3cml0aW5nLgpAQCAtMzc1LDkgKzQwOSwxMyBAQAogICAvLyBib3RoIHN0YXJ0IHdpdGggcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGluIHRoZSBzYW1lIHN0YXRlLgogICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHdyaXRlX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwogICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHJlYWRfc2l6ZV9nZW4obmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7Ci0gIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1sb2dub3JtYWwtc2FtZS1kaXN0cmlidXRpb24iLAotICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICB3cml0ZV9zaXplX2dlbiwgcmVhZF9zaXplX2dlbik7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1zYW1lLWRpc3RyaWJ1dGlvbiIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICB3cml0ZV9zaXplX2dlbiwKKyAgICAgICAgICAgICAgICByZWFkX3NpemVfZ2VuKTsKIH0KIAogdm9pZCBwcmludF91c2FnZShGSUxFKiBmLCBjb25zdCBjaGFyKiBhcmd2MCkgewpAQCAtMzg3LDY0ICs0MjUsNDUgQEAKICAgZnByaW50ZihmLCAiICAtLWhlbHBcbiIpOwogfQogCi12b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICB1aW50MzJfdCBzZWVkID0gMDsKLSAgYm9vbCBoYXNfc2VlZCA9IGZhbHNlOwotCi0gIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7Ci0gICAgeyAiaGVscCIsIGZhbHNlLCBOVUxMLCAnaCcgfSwKLSAgICB7ICJzZWVkIiwgdHJ1ZSwgTlVMTCwgJ3MnIH0sCi0gICAgeyBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgfTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIG9wdG9wdCA9IDE7Ci0gICAgaW50IG9wdGNoYXIgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaHM6IiwgbG9uZ19vcHRzLCBOVUxMKTsKLSAgICBpZiAob3B0Y2hhciA9PSAtMSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoIChvcHRjaGFyKSB7Ci0gICAgICBjYXNlICdzJzogewotICAgICAgICBjaGFyICplbmRwdHI7Ci0gICAgICAgIHNlZWQgPSBzdHJ0b2wob3B0YXJnLCAmZW5kcHRyLCAwKTsKLSAgICAgICAgaWYgKGVuZHB0ciA9PSBvcHRhcmcgfHwgKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHNlZWQgdmFsdWUgXCIlc1wiOiBtdXN0IGJlIGEgcG9zaXRpdmUgIgotICAgICAgICAgICAgICAgICAgImludGVnZXJcbiIsIG9wdGFyZyk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBoYXNfc2VlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAnaCc6Ci0gICAgICAgIHByaW50X3VzYWdlKHN0ZG91dCwgYXJndlswXSk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgICBjYXNlICc/JzoKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIE9ubHkgaGFwcGVucyBpZiBzb21lb25lIGFkZHMgYW5vdGhlciBvcHRpb24gdG8gdGhlIG9wdGFyZyBzdHJpbmcsCi0gICAgICAgIC8vIGJ1dCBkb2Vzbid0IHVwZGF0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudCB0byBoYW5kbGUgaXQuCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBvcHRpb24gXCItJWNcIlxuIiwgb3B0Y2hhcik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFoYXNfc2VlZCkgewotICAgIHNlZWQgPSB0aW1lKE5VTEwpOwotICB9Ci0KKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICB1aW50MzJfdCBzZWVkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRpbWUoTlVMTCkpOworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAogICBwcmludGYoInNlZWQ6ICUiIFBSSXUzMiAiXG4iLCBzZWVkKTsKKyNlbmRpZgogICBybmcuc2VlZChzZWVkKTsKLX0KIAotdW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIHBhcnNlX2FyZ3MoYXJnYywgYXJndik7Ci0KLSAgdW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9Ci0gICAgJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOwogICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKIAotICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCozMjsKKyAgdWludDMyX3QgYnVmX2xlbiA9IDEwMjQgKiAzMjsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fdW5pZm9ybV9idWZmZXIoYnVmX2xlbiwgJ2EnKSwgYnVmX2xlbiwgInVuaWZvcm0iKTsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fY29tcHJlc3NpYmxlX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgImNvbXByZXNzaWJsZSIpOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9yYW5kb21fYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAicmFuZG9tIik7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9ub193cml0ZSkpOworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X2dldF91bmRlcmx5aW5nX3RyYW5zcG9ydCkpOworCisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ2MpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ3YpOworICB1aW50MzJfdCBzZWVkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRpbWUoTlVMTCkpOworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorICBwcmludGYoInNlZWQ6ICUiIFBSSXUzMiAiXG4iLCBzZWVkKTsKKyNlbmRpZgorICBybmcuc2VlZChzZWVkKTsKKworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiWmxpYlRlc3QiOworCisgIHVpbnQzMl90IGJ1Zl9sZW4gPSAxMDI0ICogMzI7CiAgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3VuaWZvcm1fYnVmZmVyKGJ1Zl9sZW4sICdhJyksIGJ1Zl9sZW4sICJ1bmlmb3JtIik7CiAgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJjb21wcmVzc2libGUiKTsKICAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fcmFuZG9tX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgInJhbmRvbSIpOwpAQCAtNDUzLDMgKzQ3Miw0IEBACiAKICAgcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZWMxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCIKKwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3N0cnVjdCBMRkFUCit7CisgIExGQVQoKQorICAgIDogdXV0KE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcHRocmVhZF9tdXRleF9pbml0KCZteCwgMCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfY29uZF9pbml0KCZjdiwgMCkpOworICB9CisKKyAgTXV0ZXggdXV0OworICBwdGhyZWFkX211dGV4X3QgbXg7CisgIHB0aHJlYWRfY29uZF90IGN2OworfTsKKworLy8gSGVscGVyIGZvciB0ZXN0aW5nIG11dGV4IGJlaGF2aW9yIHdoZW4gbG9ja2VkIGJ5IGFub3RoZXIgdGhyZWFkCit2b2lkICogbG9ja0Zyb21Bbm90aGVyVGhyZWFkKHZvaWQgKnB0cikKK3sKKyAgc3RydWN0IExGQVQgKmxmYXQgPSAoTEZBVCAqKXB0cjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0LT5teCkpOyAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCB0ZXN0aW5nIHRocmVhZAorICBCT09TVF9DSEVDS19OT19USFJPVyggbGZhdC0+dXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF9zaWduYWwoJmxmYXQtPmN2KSk7ICAgICAgICAgIC8vIHRlbGwgdGVzdGluZyB0aHJlYWQgd2UgaGF2ZSBsb2NrZWQgdGhlIG11dGV4CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF93YWl0KCZsZmF0LT5jdiwgJmxmYXQtPm14KSk7IC8vIHdhaXQgZm9yIHRlc3RpbmcgdGhyZWFkIHRvIHNpZ25hbCBjb25kaXRpb24gdmFyaWFibGUgdGVsbGluZyB1cyB0byB1bmxvY2sKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC51bmxvY2soKSk7CisgIHJldHVybiBwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RpbmcgdGhyZWFkIHNob3VsZCBqb2luIHRvIGVuc3VyZSBjb21wbGV0ZW5lc3MKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE11dGV4VGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoaGFwcHlfcGF0aCkKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIHRvIHRlc3QgdW5sb2NraW5nIHR3aWNlIHdpdGhvdXQgdW5kZWZpbmVkIGJlaGF2aW9yCisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19USFJPVyAgICggdXV0LmxvY2soKSwgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAvLyBFREVBRExLICh0aGlzIHRocmVhZCBvd25zIGl0KQorICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UocmVjdXJzaXZlX2hhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKTsKKworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0cnlsb2NrKQoreworICBNdXRleCB1dXQoTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKTsgICAvLyBqdXN0IHVzaW5nIGFub3RoZXIgaW5pdGlhbGl6ZXIgZm9yIGNvdmVyYWdlCisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIHV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDSyAgICAgICAgICghdXV0LnRyeWxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0aW1lZGxvY2spCit7CisgIHB0aHJlYWRfdCB0aDsKKyAgc3RydWN0IExGQVQgbGZhdDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggbGZhdC51dXQudGltZWRsb2NrKDEwMCkpOworICBCT09TVF9DSEVDS19USFJPVyAgICggbGZhdC51dXQudGltZWRsb2NrKDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbik7ICAgICAgICAgICAgICAgICAgIC8vIEVERUFETEsgKGN1cnJlbnQgdGhyZWFkIG93bnMgbXV0ZXggLSBsb2dpYyBlcnJvcikKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQudXV0LnVubG9jaygpKTsKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X2xvY2soJmxmYXQubXgpKTsgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB3aXRoIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jcmVhdGUoJnRoLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tGcm9tQW5vdGhlclRocmVhZCwgJmxmYXQpKTsgICAgICAgICAvLyBjcmVhdGUgaGVscGVyIHRocmVhZAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC5jdiwgJmxmYXQubXgpKTsgICAvLyB3YWl0IGZvciBoZWxwZXIgdGhyZWFkIHRvIGxvY2sgbXV0ZXgKKworICBCT09TVF9DSEVDSyAgICAgICAgICghbGZhdC51dXQudGltZWRsb2NrKDEwMCkpOyAgICAgICAgICAgICAgICAgICAvLyBmYWxzZTogYW5vdGhlciB0aHJlYWQgb3ducyB0aGUgbG9jaworCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF9zaWduYWwoJmxmYXQuY3YpKTsgICAgICAgICAgIC8vIHRlbGwgaGVscGVyIHRocmVhZCB3ZSBhcmUgZG9uZQorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X3VubG9jaygmbGZhdC5teCkpOyAgICAgICAgICAvLyBsZXQgaGVscGVyIHRocmVhZCBjbGVhbiB1cAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2pvaW4odGgsIDApKTsgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byB1bmxvY2sgYW5kIGJlIGRvbmUKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodW5kZXJseWluZykKK3sKKyAgTXV0ZXggdXV0OworCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQuZ2V0VW5kZXJseWluZ0ltcGwoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1YTIzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhpcyBpcyBsaW5rZWQgaW50byB0aGUgVW5pdFRlc3RzIHRlc3QgZXhlY3V0YWJsZQorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK2NsYXNzIExvY2tlciA6IHB1YmxpYyBSdW5uYWJsZSB7Citwcm90ZWN0ZWQ6CisgIExvY2tlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2ssIGJvb2wgd3JpdGVyKQorICAgIDogcndsb2NrXyhyd2xvY2spLCB3cml0ZXJfKHdyaXRlciksIHN0YXJ0ZWRfKGZhbHNlKSwgZ290TG9ja18oZmFsc2UpLCBzaWduYWxlZF8oZmFsc2UpIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHJ1bigpIHsKKyAgICBzdGFydGVkXyA9IHRydWU7CisgICAgaWYgKHdyaXRlcl8pIHsKKyAgICAgIHJ3bG9ja18tPmFjcXVpcmVXcml0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgICBnb3RMb2NrXyA9IHRydWU7CisgICAgd2hpbGUgKCFzaWduYWxlZF8pIHsKKyAgICAgIHVzbGVlcCg1MDAwKTsKKyAgICB9CisgICAgcndsb2NrXy0+cmVsZWFzZSgpOworICB9CisKKyAgYm9vbCBzdGFydGVkKCkgY29uc3QgeyByZXR1cm4gc3RhcnRlZF87IH0KKyAgYm9vbCBnb3RMb2NrKCkgY29uc3QgeyByZXR1cm4gZ290TG9ja187IH0KKyAgdm9pZCBzaWduYWwoKSB7IHNpZ25hbGVkXyA9IHRydWU7IH0KKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2tfOworICBib29sIHdyaXRlcl87CisgIHZvbGF0aWxlIGJvb2wgc3RhcnRlZF87CisgIHZvbGF0aWxlIGJvb2wgZ290TG9ja187CisgIHZvbGF0aWxlIGJvb2wgc2lnbmFsZWRfOworfTsKKworY2xhc3MgUmVhZGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFJlYWRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgZmFsc2UpIHt9Cit9OworCitjbGFzcyBXcml0ZXIgOiBwdWJsaWMgTG9ja2VyIHsKK3B1YmxpYzoKKyAgV3JpdGVyKHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaykgOiBMb2NrZXIocndsb2NrLCB0cnVlKSB7fQorfTsKKwordm9pZCB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3kpIHsKKyAgLy8gdGhlIG1hbiBwYWdlcyBmb3IgcHRocmVhZF93cmxvY2tfcmRsb2NrIHN1Z2dlc3QgdGhhdCBhbnkgT1MgZ3VhcmFudGVlIGFib3V0CisgIC8vIHdyaXRlciBzdGFydmF0aW9uIG1heSBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBzY2hlZHVsaW5nIHBvbGljeSwgc28gbGV0J3MgdHJ5CisgIC8vIGFsbCAzIHBvbGljaWVzIHRvIHNlZSBpZiBhbnkgb2YgdGhlbSB3b3JrLgorICBQb3NpeFRocmVhZEZhY3RvcnkgZmFjdG9yeShwb2xpY3kpOworICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKworICBzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2sobmV3IE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjEobmV3IFJlYWRlcihyd2xvY2spKTsKKyAgc2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjIobmV3IFJlYWRlcihyd2xvY2spKTsKKyAgc2hhcmVkX3B0cjxXcml0ZXI+IHdyaXRlcihuZXcgV3JpdGVyKHJ3bG9jaykpOworCisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMSA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjEpOworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjIgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIyKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHR3cml0ZXIgPSBmYWN0b3J5Lm5ld1RocmVhZCh3cml0ZXIpOworCisgIC8vIGxhdW5jaCBhIHJlYWRlciBhbmQgbWFrZSBzdXJlIGhlIGhhcyB0aGUgbG9jaworICB0cmVhZGVyMS0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIxLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyBsYXVuY2ggYSB3cml0ZXIgYW5kIG1ha2Ugc3VyZSBoZSdzIGJsb2NrZWQgb24gdGhlIGxvY2sKKyAgdHdyaXRlci0+c3RhcnQoKTsKKyAgd2hpbGUgKCF3cml0ZXItPnN0YXJ0ZWQoKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorICAvLyB0cmlja3kgcGFydC4uLiB3ZSBjYW4gbmV2ZXIgYmUgMTAwJSBzdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBhY3R1YWxseQorICAvLyBibG9ja2VkIG9uIHRoZSBsb2NrLCBidXQgd2UgY2FuIHByZXR0eSByZWFzb25hYmx5IHN1cmUgYmVjYXVzZSB3ZSBrbm93CisgIC8vIGhlIGp1c3QgZXhlY3V0ZWQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVmb3JlIGdldHRpbmcgdGhlIGxvY2ssIGFuZAorICAvLyB3ZSdsbCB3YWl0IGEgZnVsbCBzZWNvbmQgZm9yIGhpbSB0byBnZXQgb24gaXQuCisgIHNsZWVwKDEpOworCisgIC8vIGxhdW5jaCBhIHNlY29uZCByZWFkZXIuLi4gaWYgdGhlIFJXTXV0ZXggZ3VhcmFudGVlcyB0aGF0IHdyaXRlcnMgd29uJ3QKKyAgLy8gc3RhcnZlLCB0aGlzIHJlYWRlciBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbG9jayB1bnRpbCB0aGUgd3JpdGVyCisgIC8vIGhhcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaXQuCisgIHRyZWFkZXIyLT5zdGFydCgpOworICB3aGlsZSAoIXJlYWRlcjItPnN0YXJ0ZWQoKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorICAvLyBhZ2Fpbi4uLiBjYW4ndCBiZSAxMDAlIHN1cmUgdGhlIHJlYWRlciBpcyB3YWl0aW5nIG9uIChvciBoYXMpIHRoZSBsb2NrCisgIC8vIGJ1dCB3ZSBjYW4gYmUgY2xvc2UuCisgIHNsZWVwKDEpOworCisgIC8vIHRlbGwgcmVhZGVyIDEgdG8gbGV0IGdvIG9mIHRoZSBsb2NrCisgIHJlYWRlcjEtPnNpZ25hbCgpOworCisgIC8vIHdhaXQgZm9yIHNvbWVvbmUgdG8gZ2V0IHRoZSBsb2NrCisgIHdoaWxlICghcmVhZGVyMi0+Z290TG9jaygpICYmICF3cml0ZXItPmdvdExvY2soKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorCisgIC8vIHRoZSB0ZXN0IHN1Y2NlZWRlZCBpZiB0aGUgV1JJVEVSIGdvdCB0aGUgbG9jay4KKyAgYm9vbCBzdWNjZXNzID0gd3JpdGVyLT5nb3RMb2NrKCk7CisKKyAgLy8gdGVsbCBldmVyeW9uZSB3ZSdyZSBkb25lIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaAorICByZWFkZXIyLT5zaWduYWwoKTsKKyAgd3JpdGVyLT5zaWduYWwoKTsKKyAgdHJlYWRlcjEtPmpvaW4oKTsKKyAgdHJlYWRlcjItPmpvaW4oKTsKKyAgdHdyaXRlci0+am9pbigpOworCisgIC8vIG1ha2Ugc3VyZSBpdCB3b3JrZWQuCisgIEJPT1NUX0NIRUNLX01FU1NBR0Uoc3VjY2VzcywgIndyaXRlciBpcyBzdGFydmluZyIpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoUldNdXRleFN0YXJ2ZVRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX290aGVyKSB7CisgIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9ycikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlJPVU5EX1JPQklOKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfZmlmbykgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk8pOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGJhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiVGhyZWFkRmFjdG9yeVRlc3RzLmgiCisjaW5jbHVkZSAiVGltZXJNYW5hZ2VyVGVzdHMuaCIKKyNpbmNsdWRlICJUaHJlYWRNYW5hZ2VyVGVzdHMuaCIKKworLy8gVGhlIHRlc3Qgd2VpZ2h0LCB3aGVyZSAxMCBpcyAxMCB0aW1lcyBtb3JlIHRocmVhZHMgdGhhbiBiYXNlbGluZQorLy8gYW5kIHRoZSBiYXNlbGluZSBpcyBvcHRpbWl6ZWQgZm9yIHJ1bm5pbmcgaW4gdmFsZ3JpbmQKK3N0YXRpYyBpbnQgV0VJR0hUID0gMTA7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworCisgIHN0ZDo6c3RyaW5nIGFyZzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyhhcmdjIC0gMSA+IDEgPyBhcmdjIC0gMSA6IDEpOworCisgIGFyZ3NbMF0gPSAiYWxsIjsKKworICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgeworICAgIGFyZ3NbaXggLSAxXSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbaXhdKTsKKyAgfQorCisgIGlmIChnZXRlbnYoIlZBTEdSSU5EIikgIT0gMCkgeworCSAgLy8gbG93ZXIgdGhlIHNjYWxlIG9mIGV2ZXJ5IHRlc3QKKwkgIFdFSUdIVCA9IDE7CisgIH0KKworICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKKworICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7CisKKyAgICBUaHJlYWRGYWN0b3J5VGVzdHMgdGhyZWFkRmFjdG9yeVRlc3RzOworCisgICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRGYWN0b3J5IHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpbnQgcmVhcExvb3BzID0gMiAqIFdFSUdIVDsKKyAgICBpbnQgcmVhcENvdW50ID0gMTAwICogV0VJR0hUOworICAgIHNpemVfdCBmbG9vZExvb3BzID0gMzsKKyAgICBzaXplX3QgZmxvb2RDb3VudCA9IDUwMCAqIFdFSUdIVDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgcmVhcExvb3BzIDw8ICJ4IiA8PCByZWFwQ291bnQgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKHJlYXBMb29wcywgcmVhcENvdW50KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kIE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCBmbG9vZExvb3BzIDw8ICJ4IiA8PCBmbG9vZENvdW50IDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLmZsb29kTlRlc3QoZmxvb2RMb29wcywgZmxvb2RDb3VudCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IGZsb29kIE4gdGhyZWFkcyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgdGVzdCIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCB0ZXN0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlV0aWwgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFV0aWwgbWluaW11bSB0aW1lIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRNaW5pbXVtIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwIDw8ICJtcyIgPDwgc3RkOjplbmRsOworCisgICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICB0aW1lMDEgPSB0aW1lMDA7CisgICAgc2l6ZV90IGNvdW50ID0gMDsKKworICAgIHdoaWxlICh0aW1lMDEgPCB0aW1lMDAgKyAxMCkgeworICAgICAgY291bnQrKzsKKyAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRzY2FsbCBwZXIgbXM6ICIgPDwgY291bnQgLyAodGltZTAxIC0gdGltZTAwKSA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGltZXItbWFuYWdlciIpID09IDApIHsKKworICAgIHN0ZDo6Y291dCA8PCAiVGltZXJNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAwIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBUaW1lck1hbmFnZXJUZXN0cyB0aW1lck1hbmFnZXJUZXN0czsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAwKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDEiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAxKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDIiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAyKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAzKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDQiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDA0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlciIpID09IDApIHsKKworICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgc2l6ZV90IHdvcmtlckNvdW50ID0gMTAgKiBXRUlHSFQ7CisgICAgICBzaXplX3QgdGFza0NvdW50ID0gNTAwICogV0VJR0hUOworICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7CisKKyAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpIHRlc3Q6IiA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmFwaVRlc3QoKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGFwaVRlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50CisgICAgICAgICAgICAgICAgPDwgIiB0YXNrIGNvdW50OiAiIDw8IHRhc2tDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZFRlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAorICAgICAgICAgICAgICAgIDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOworCisgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5ibG9ja1Rlc3QoZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1tYW5hZ2VyLWJlbmNobWFyayIpID09IDApIHsKKworICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciBiZW5jaG1hcmsgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKworICAgICAgc2l6ZV90IG1pbldvcmtlckNvdW50ID0gMjsKKworICAgICAgc2l6ZV90IG1heFdvcmtlckNvdW50ID0gODsKKworICAgICAgc2l6ZV90IHRhc2tzUGVyV29ya2VyID0gMTAwICogV0VJR0hUOworCisgICAgICBpbnQ2NF90IGRlbGF5ID0gNUxMOworCisgICAgICBmb3IgKHNpemVfdCB3b3JrZXJDb3VudCA9IG1pbldvcmtlckNvdW50OyB3b3JrZXJDb3VudCA8PSBtYXhXb3JrZXJDb3VudDsgd29ya2VyQ291bnQgKj0gNCkgeworCisgICAgICAgIHNpemVfdCB0YXNrQ291bnQgPSB3b3JrZXJDb3VudCAqIHRhc2tzUGVyV29ya2VyOworCisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZCB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKKworICAgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RkOjpjb3V0IDw8ICJBTEwgVEVTVFMgUEFTU0VEIiA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTg1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCisvKioKKyAqIFRocmVhZE1hbmFnZXJUZXN0cyBjbGFzcworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFRocmVhZEZhY3RvcnlUZXN0cyB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFJlYXAgTiB0aHJlYWRzCisgICAqLworICBjbGFzcyBSZWFwTlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCisgIHB1YmxpYzoKKyAgICBSZWFwTlRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50JiBhY3RpdmVDb3VudCkgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGFjdGl2ZUNvdW50KSB7fQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICAKKyAgICAgIGlmICgtLV9jb3VudCA9PSAwKSB7CisgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKworICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIGludCYgX2NvdW50OworICB9OworCisgIGJvb2wgcmVhcE5UaHJlYWRzKGludCBsb29wID0gMSwgaW50IGNvdW50ID0gMTApIHsKKworICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgc2hhcmVkX3B0cjxNb25pdG9yPiBtb25pdG9yKG5ldyBNb25pdG9yKTsKKworICAgIGZvciAoaW50IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CisKKyAgICAgIGludCBhY3RpdmVDb3VudCA9IDA7CisKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+IHRocmVhZHM7CisgICAgICBpbnQgdGl4OworCisgICAgICBmb3IgKHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgeworICAgICAgICB0cnkgeworICAgICAgICAgICsrYWN0aXZlQ291bnQ7CisgICAgICAgICAgdGhyZWFkcy5wdXNoX2JhY2soCisgICAgICAgICAgICAgIHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsIGFjdGl2ZUNvdW50KSkpKTsKKyAgICAgICAgfSBjYXRjaCAoU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBjcmVhdGUgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGl4ID0gMDsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IHRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgICAgdGhyZWFkICE9IHRocmVhZHMuZW5kKCk7CisgICAgICAgICAgIHRpeCsrLCArK3RocmVhZCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOworICAgICAgICB9IGNhdGNoIChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKCptb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICAgIG1vbml0b3ItPndhaXQoMTAwMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXgqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNsYXNzIFN5bmNoU3RhcnRUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworICBwdWJsaWM6CisgICAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OworCisgICAgU3luY2hTdGFydFRhc2soTW9uaXRvciYgbW9uaXRvciwgdm9sYXRpbGUgU1RBVEUmIHN0YXRlKSA6IF9tb25pdG9yKG1vbml0b3IpLCBfc3RhdGUoc3RhdGUpIHt9CisKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICBpZiAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgeworICAgICAgICAgIF9zdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEOworICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICB3aGlsZSAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7CisgICAgICAgICAgX21vbml0b3Iud2FpdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkcpIHsKKyAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRDsKKyAgICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIHZvbGF0aWxlIFNUQVRFJiBfc3RhdGU7CisgIH07CisKKyAgYm9vbCBzeW5jaFN0YXJ0VGVzdCgpIHsKKworICAgIE1vbml0b3IgbW9uaXRvcjsKKworICAgIFN5bmNoU3RhcnRUYXNrOjpTVEFURSBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpVTklOSVRJQUxJWkVEOworCisgICAgc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4gdGFzaworICAgICAgICA9IHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+KG5ldyBTeW5jaFN0YXJ0VGFzayhtb25pdG9yLCBzdGF0ZSkpOworCisgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKKworICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRCkgeworCisgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORzsKKworICAgICAgdGhyZWFkLT5zdGFydCgpOworICAgIH0KKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgeworICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoc3RhdGUgIT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworCisgICAgICB0cnkgeworICAgICAgICBtb25pdG9yLndhaXQoMTAwKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQpIHsKKworICAgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORzsKKworICAgICAgICBtb25pdG9yLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICB3aGlsZSAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7CisgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRCk7CisKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG9ubHkgZ3VhcmFudGVlIGEgbW9uaXRvciB0aW1lb3V0IGNhbiBnaXZlIHlvdSBpcyB0aGF0CisgICAqIGl0IHdpbGwgdGFrZSAiYXQgbGVhc3QiIGFzIGxvbmcgYXMgdGhlIHRpbWVvdXQsIG5vIGxlc3MuCisgICAqIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gZ3VhcmFudGVlIGFyb3VuZCByZWdhaW5pbmcgZXhlY3V0aW9uCisgICAqIG5lYXIgdGhlIHRpbWVvdXQuICBPbiBhIGJ1c3kgc3lzdGVtIChsaWtlIGluc2lkZSBhIHRoaXJkIHBhcnR5CisgICAqIENJIGVudmlyb25tZW50KSBpdCBjb3VsZCB0YWtlIHF1aXRlIGEgYml0IGxvbmdlciB0aGFuIHRoZQorICAgKiByZXF1ZXN0ZWQgdGltZW91dCwgYW5kIHRoYXQncyBvay4KKyAgICovCisKKyAgYm9vbCBtb25pdG9yVGltZW91dFRlc3QoaW50NjRfdCBjb3VudCA9IDEwMDAsIGludDY0X3QgdGltZW91dCA9IDIpIHsKKworICAgIE1vbml0b3IgbW9uaXRvcjsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGZvciAoaW50NjRfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOworICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgYm9vbCBzdWNjZXNzID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpID49IChjb3VudCAqIHRpbWVvdXQpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQorICAgICAgICAgICAgICA8PCAiOiBtaW5pbXVtIHJlcXVpcmVkIHRpbWUgdG8gZWxhcHNlICIgPDwgY291bnQgKiB0aW1lb3V0CisgICAgICAgICAgICAgIDw8ICJtczsgYWN0dWFsIGVsYXBzZWQgdGltZSAiIDw8IGVuZFRpbWUgLSBzdGFydFRpbWUgPDwgIm1zIgorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorCisgIGNsYXNzIEZsb29kVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIHB1YmxpYzoKKyAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkLCBNb25pdG9yJiBtb24pIDogX2lkKGlkKSwgX21vbihtb24pIHt9CisgICAgfkZsb29kVGFzaygpIHsKKyAgICAgIGlmIChfaWQgJSAxMDAwMCA9PSAwKSB7CisJCVN5bmNocm9uaXplZCBzeW5jKF9tb24pOworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBkb25lIiA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOworICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzaXplX3QgX2lkOworICAgIE1vbml0b3ImIF9tb247CisgIH07CisKKyAgdm9pZCBmb28oUGxhdGZvcm1UaHJlYWRGYWN0b3J5KiB0ZikgeyAodm9pZCl0ZjsgfQorCisgIGJvb2wgZmxvb2ROVGVzdChzaXplX3QgbG9vcCA9IDEsIHNpemVfdCBjb3VudCA9IDEwMDAwMCkgeworCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgTW9uaXRvciBtb247CisJCisgICAgZm9yIChzaXplX3QgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKKworICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKKyAgICAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQodHJ1ZSk7CisKKyAgICAgIGZvciAoc2l6ZV90IHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4LCBtb24pKTsKKyAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7CisgICAgICAgICAgdGhyZWFkLT5zdGFydCgpOworCisgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGUpIHsKKworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBTeW5jaHJvbml6ZWQgc3luYyhtb24pOworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmbG9vZGVkICIgPDwgKGxpeCArIDEpICogY291bnQgPDwgIiB0aHJlYWRzIiA8PCBzdGQ6OmVuZGw7CisgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorfTsKKworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3QKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmMwOTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCkBAIC0wLDAgKzEsNjg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgdGVzdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3N0YXRpYyBzdGQ6OmRlcXVlPHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gPiBtX2V4cGlyZWQ7CitzdGF0aWMgdm9pZCBleHBpcmVkTm90aWZpZXIoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKK3sKKyAgbV9leHBpcmVkLnB1c2hfYmFjayhydW5uYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNsZWVwXyhpbnQ2NF90IG1pbGxpc2VjKSB7CisgIE1vbml0b3IgX3NsZWVwOworICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOworCisgIHRyeSB7CisgICAgX3NsZWVwLndhaXQobWlsbGlzZWMpOworICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICA7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCitjbGFzcyBUaHJlYWRNYW5hZ2VyVGVzdHMgeworCitwdWJsaWM6CisgIGNsYXNzIFRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCisgIHB1YmxpYzoKKyAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgY291bnQsIGludDY0X3QgdGltZW91dCkKKyAgICAgIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChjb3VudCksIF90aW1lb3V0KHRpbWVvdXQpLCBfc3RhcnRUaW1lKDApLCBfZW5kVGltZSgwKSwgX2RvbmUoZmFsc2UpIHt9CisKKyAgICB2b2lkIHJ1bigpIHsKKworICAgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICAgIHNsZWVwXyhfdGltZW91dCk7CisKKyAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgICAgX2RvbmUgPSB0cnVlOworCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIlRocmVhZCAiIDw8IF9jb3VudCA8PCAiIGNvbXBsZXRlZCAiIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICBfY291bnQtLTsKKyAgICAgICAgaWYgKF9jb3VudCAlIDEwMDAwID09IDApIHsKKyAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIHNpemVfdCYgX2NvdW50OworICAgIGludDY0X3QgX3RpbWVvdXQ7CisgICAgaW50NjRfdCBfc3RhcnRUaW1lOworICAgIGludDY0X3QgX2VuZFRpbWU7CisgICAgYm9vbCBfZG9uZTsKKyAgICBNb25pdG9yIF9zbGVlcDsKKyAgfTsKKworICAvKioKKyAgICogRGlzcGF0Y2ggY291bnQgdGFza3MsIGVhY2ggb2Ygd2hpY2ggYmxvY2tzIGZvciB0aW1lb3V0IG1pbGxpc2Vjb25kcyB0aGVuCisgICAqIGNvbXBsZXRlcy4gVmVyaWZ5IHRoYXQgYWxsIHRhc2tzIGNvbXBsZXRlZCBhbmQgdGhhdCB0aHJlYWQgbWFuYWdlciBjbGVhbnMKKyAgICogdXAgcHJvcGVybHkgb24gZGVsZXRlLgorICAgKi8KKyAgYm9vbCBsb2FkVGVzdChzaXplX3QgY291bnQgPSAxMDAsIGludDY0X3QgdGltZW91dCA9IDEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQgPSA0KSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBzaXplX3QgYWN0aXZlQ291bnQgPSBjb3VudDsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworCisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpOworCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKyNlbmRpZgorICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID4gdGFza3M7CisKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKKworICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPigKKyAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKG1vbml0b3IsIGFjdGl2ZUNvdW50LCB0aW1lb3V0KSkpOworICAgIH0KKworICAgIGludDY0X3QgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgaXgrKykgeworCisgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoKml4KTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0bG9hZGVkICIgPDwgY291bnQgPDwgIiB0YXNrcyB0byBleGVjdXRlIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKworICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWN0aXZlQ291bnQgPSAiIDw8IGFjdGl2ZUNvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBsYXN0VGltZSA9IDA7CisKKyAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOworICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKKyAgICBpbnQ2NF90IG1heFRpbWUgPSAwOworCisgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrID0gKml4OworCisgICAgICBpbnQ2NF90IGRlbHRhID0gdGFzay0+X2VuZFRpbWUgLSB0YXNrLT5fc3RhcnRUaW1lOworCisgICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKKworICAgICAgaWYgKHRhc2stPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKKyAgICAgICAgZmlyc3RUaW1lID0gdGFzay0+X3N0YXJ0VGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRhc2stPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKKyAgICAgICAgbGFzdFRpbWUgPSB0YXNrLT5fZW5kVGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgeworICAgICAgICBtaW5UaW1lID0gZGVsdGE7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKKyAgICAgICAgbWF4VGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKKyAgICB9CisKKyAgICBhdmVyYWdlVGltZSAvPSBjb3VudDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmlyc3Qgc3RhcnQ6ICIgPDwgZmlyc3RUaW1lIDw8ICIgTGFzdCBlbmQ6ICIgPDwgbGFzdFRpbWUKKyAgICAgICAgICAgICAgPDwgIiBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBib29sIHN1Y2Nlc3MgPSAodGltZTAxIC0gdGltZTAwKSA+PSAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50OworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQorICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8ICgoaW50NjRfdCljb3VudCAqIHRpbWVvdXQpIC8gKGludDY0X3Qpd29ya2VyQ291bnQgPDwgIm1zIGVsYXBzZWQgdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorCisgIGNsYXNzIEJsb2NrVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKKyAgcHVibGljOgorICAgIEJsb2NrVGFzayhNb25pdG9yJiBlbnRyeU1vbml0b3IsIE1vbml0b3ImIGJsb2NrTW9uaXRvciwgYm9vbCYgYmxvY2tlZCwgTW9uaXRvciYgZG9uZU1vbml0b3IsIHNpemVfdCYgY291bnQpCisgICAgICA6IF9lbnRyeU1vbml0b3IoZW50cnlNb25pdG9yKSwgX2VudGVyZWQoZmFsc2UpLCBfYmxvY2tNb25pdG9yKGJsb2NrTW9uaXRvciksIF9ibG9ja2VkKGJsb2NrZWQpLCBfZG9uZU1vbml0b3IoZG9uZU1vbml0b3IpLCBfY291bnQoY291bnQpIHt9CisKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2VudHJ5TW9uaXRvcik7CisgICAgICAgIF9lbnRlcmVkID0gdHJ1ZTsKKyAgICAgICAgX2VudHJ5TW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfYmxvY2tNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKF9ibG9ja2VkKSB7CisgICAgICAgICAgX2Jsb2NrTW9uaXRvci53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfZG9uZU1vbml0b3IpOworICAgICAgICBpZiAoLS1fY291bnQgPT0gMCkgeworICAgICAgICAgIF9kb25lTW9uaXRvci5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIE1vbml0b3ImIF9lbnRyeU1vbml0b3I7CisgICAgYm9vbCBfZW50ZXJlZDsKKyAgICBNb25pdG9yJiBfYmxvY2tNb25pdG9yOworICAgIGJvb2wmIF9ibG9ja2VkOworICAgIE1vbml0b3ImIF9kb25lTW9uaXRvcjsKKyAgICBzaXplX3QmIF9jb3VudDsKKyAgfTsKKworICAvKioKKyAgICogQmxvY2sgdGVzdC4gIENyZWF0ZSBwZW5kaW5nVGFza0NvdW50TWF4IHRhc2tzLiAgVmVyaWZ5IHRoYXQgd2UgYmxvY2sgYWRkaW5nIHRoZQorICAgKiBwZW5kaW5nVGFza0NvdW50TWF4ICsgMXRoIHRhc2suICBWZXJpZnkgdGhhdCB3ZSB1bmJsb2NrIHdoZW4gYSB0YXNrIGNvbXBsZXRlcyAqLworCisgIGJvb2wgYmxvY2tUZXN0KGludDY0X3QgdGltZW91dCA9IDEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQgPSAyKSB7CisgICAgKHZvaWQpdGltZW91dDsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIHRyeSB7CisKKyAgICAgIE1vbml0b3IgZW50cnlNb25pdG9yOyAgIC8vIG5vdCB1c2VkIGJ5IHRoaXMgdGVzdAorICAgICAgTW9uaXRvciBibG9ja01vbml0b3I7CisgICAgICBib29sIGJsb2NrZWRbXSA9IHt0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgIE1vbml0b3IgZG9uZU1vbml0b3I7CisKKyAgICAgIHNpemVfdCBwZW5kaW5nVGFza01heENvdW50ID0gd29ya2VyQ291bnQ7CisKKyAgICAgIHNpemVfdCBhY3RpdmVDb3VudHNbXSA9IHt3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCwgMX07CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CisKKyAgICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKyNlbmRpZgorICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKworICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPiB0YXNrczsKKyAgICAgIHRhc2tzLnJlc2VydmUod29ya2VyQ291bnQgKyBwZW5kaW5nVGFza01heENvdW50KTsKKworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHdvcmtlckNvdW50OyBpeCsrKSB7CisKKyAgICAgICAgdGFza3MucHVzaF9iYWNrKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+KAorICAgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzBdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzBdKSkpOworICAgICAgfQorCisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgeworCisgICAgICAgIHRhc2tzLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKKyAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsxXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1sxXSkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgICBpeCsrKSB7CisgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOworICAgICAgfQorCisgICAgICBpZiAoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gcGVuZGluZ1Rhc2tNYXhDb3VudCArIHdvcmtlckNvdW50KSkpIHsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gZXh0cmFUYXNrKAorICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsyXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOworCisgICAgICB0cnkgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0gY2F0Y2ggKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlNob3VsZCBoYXZlIHRpbWVkIG91dCBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIC0xKTsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOworICAgICAgfSBjYXRjaCAoVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYpIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0CisgICAgICB9CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzBdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMF0gIT0gMCkgeworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIDEpOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgICAgPDwgImFkZCB0aW1lZCBvdXQgdW5leHBlY3RlZGx5IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOworCisgICAgICB9IGNhdGNoIChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICAgIDw8ICJhZGQgZW5jb3VudGVyZWQgdG9vIG1hbnkgcGVuZGluZyBleGVwY3Rpb25zIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOworICAgICAgfQorCisgICAgICAvLyBXYWtlIHVwIHRhc2tzIHRoYXQgd2VyZSBwZW5kaW5nIGJlZm9yZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMV0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFdha2UgdXAgdGhlIGV4dHJhIHRhc2sgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFsyXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhyZWFkTWFuYWdlci0+c3RvcCgpOworCisgICAgICBpZiAoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gMCkpKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdG90YWwgdGFzayBjb3VudCIpOworICAgICAgfQorCisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZSkgeworICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworCisgIGJvb2wgYXBpVGVzdCgpIHsKKworICAgIC8vIHByb3ZlIGN1cnJlbnRUaW1lIGhhcyBtaWxsaXNlY29uZHMgZ3JhbnVsYXJpdHkgc2luY2UgbWFueSBvdGhlciB0aGluZ3MgZGVwZW5kIG9uIGl0CisgICAgaW50NjRfdCBhID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBzbGVlcF8oMTAwKTsKKyAgICBpbnQ2NF90IGIgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGlmIChiIC0gYSA8IDUwIHx8IGIgLSBhID4gMTUwKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdGV4cGVjdGVkIDEwMG1zIGdhcCwgZm91bmQgIiA8PCAoYi1hKSA8PCAibXMgZ2FwIGluc3RlYWQuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgLy8gdGVzdCBvbmNlIHdpdGggYSBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSBhbmQgb25jZSB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnkKKworICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoZmFsc2UpKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0YXBpVGVzdCB3aXRoIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5IiA8PCBzdGQ6OmVuZGw7CisgICAgaWYgKCFhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRGYWN0b3J5LnJlc2V0KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkodHJ1ZSkpOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0YXBpVGVzdCB3aXRoIGRldGFjaGVkIHRocmVhZCBmYWN0b3J5IiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyNlbHNlCisgICAgcmV0dXJuIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisjZW5kaWYKKworICB9CisKKyAgYm9vbCBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpCisgIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOworCisgICAgLy8gdmVyaWZ5IHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB3aXRoIHRoZSBvcHBvc2l0ZSBkZXRhY2hlZCBzZXR0aW5nCisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkyCisgICAgICAgID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTiwKKyAgICAgICAgICBQb3NpeFRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwKKyAgICAgICAgICAxLAorICAgICAgICAgICF0aHJlYWRGYWN0b3J5LT5pc0RldGFjaGVkKCkpKTsKKyAgICB0cnkgeworICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5Mik7CisgICAgICAvLyBpZiB0aGUgY2FsbCBzdWNjZWVkZWQgd2UgY2hhbmdlZCB0aGUgdGhyZWFkIGZhY3RvcnkgdG8gb25lIHRoYXQgaGFkIHRoZSBvcHBvc2l0ZSBzZXR0aW5nIGZvciAiaXNEZXRhY2hlZCgpIi4KKyAgICAgIC8vIHRoaXMgaXMgYmFkLCBiZWNhdXNlIHRoZSB0aHJlYWQgbWFuYWdlciBjaGVja3Mgd2l0aCB0aGUgdGhyZWFkIGZhY3RvcnkgdG8gc2VlIGlmIGl0IHNob3VsZCBqb2luIHRocmVhZHMKKyAgICAgIC8vIGFzIHRoZXkgYXJlIGxlYXZpbmcgLSBzbyB0aGUgZGV0YWNoZWQgc3RhdHVzIG9mIG5ldyB0aHJlYWRzIGNhbm5vdCBjaGFuZ2Ugd2hpbGUgdGhlcmUgYXJlIGV4aXN0aW5nIHRocmVhZHMuCisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFNob3VsZCBub3QgYmUgYWJsZSB0byBjaGFuZ2UgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorI2VuZGlmCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0c3RhcnRpbmcuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soZXhwaXJlZE5vdGlmaWVyKTsgLy8gc3RkOjpiaW5kKCZUaHJlYWRNYW5hZ2VyVGVzdHM6OmV4cGlyZWROb3RpZmllciwgdGhpcykpOworCisjZGVmaW5lIEVYUEVDVChGVU5DLCBDT1VOVCkgeyBzaXplX3QgYyA9IEZVTkM7IGlmIChjICE9IENPVU5UKSB7IHN0ZDo6Y2VyciA8PCAiZXhwZWN0ZWQgIiAjRlVOQyIgdG8gYmUgIiAjQ09VTlQgIiwgYnV0IHdhcyAiIDw8IGMgPDwgc3RkOjplbmRsOyByZXR1cm4gZmFsc2U7IH0gfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMik7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDFzdCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRocm93IGEgYmxvY2tpbmcgdGFzayBpbnRvIHRoZSBtaXgKKyAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBzaWduYWxlZCB3aGVuIHRhc2sgaXMgcnVubmluZworICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOyAgIC8vIHRvIGJlIHNpZ25hbGVkIHRvIHVuYmxvY2sgdGhlIHRhc2sKKyAgICBib29sIGJsb2NrZWQodHJ1ZSk7ICAgICAvLyBzZXQgdG8gZmFsc2UgYmVmb3JlIG5vdGlmeWluZworICAgIE1vbml0b3IgZG9uZU1vbml0b3I7ICAgIC8vIHNpZ25hbGVkIHdoZW4gY291bnQgcmVhY2hlcyB6ZXJvCisgICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gMTsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiBibG9ja2luZ1Rhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWQsIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCkpOworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIG90aGVyIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiBvdGhlclRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKG90aGVyVGFzayk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAyKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgYmxvY2tpbmcgdGFzayBzcGVjaWZpY2FsbHkuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8UnVubmFibGU+IG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2sgIT0gb3RoZXJUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gb3RoZXJUYXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrIChub25lIGxlZnQpLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIHJlbW92ZU5leHRQZW5kaW5nIHRvIHJldHVybiBhbiBlbXB0eSBSdW5uYWJsZSIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgMiBleHBpcmVkIHRhc2tzIGFuZCAxIG5vdC4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gZXhwaXJlZFRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsgICAgICAgLy8gYWRkIG9uZSB0aGF0IGhhc24ndCBleHBpcmVkIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHNraXBwZWQKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gYWRkIGEgc2Vjb25kIGV4cGlyZWQgdG8gZW5zdXJlIHJlbW92ZUV4cGlyZWRUYXNrcyByZW1vdmVzIGJvdGgKKworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxIG1pbGxpc2Vjb25kCisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAzKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+ZXhwaXJlZFRhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgZXhwaXJlZCB0YXNrcy4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIW1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgZW1wdHkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVFeHBpcmVkVGFza3MoKTsKKworICAgIGlmIChtX2V4cGlyZWQuc2l6ZSgpICE9IDIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZCB0byBiZSBzZXQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFswXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1fZXhwaXJlZC5wb3BfZnJvbnQoKTsKKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkWzFdIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGV4cGlyZWQgdGFzayAoYWdhaW4pLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7ICAvLyBleHBpcmVzIGluIDFtcworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxbXMKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgd29ya2VyIHRvIGNvbnN1bWUgZXhwaXJlZCB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHNsZWVwXygxMDApOyAgLy8gbWFrZSBzdXJlIGl0IGhhcyB0aW1lIHRvIHNwaW4gdXAgYW5kIGV4cGlyZSB0aGUgdGFzaworCisgICAgaWYgKG1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZXhwaXJlZC5jbGVhcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0dHJ5IHRvIHJlbW92ZSB0b28gbWFueSB3b3JrZXJzIiA8PCBzdGQ6OmVuZGw7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigyKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gY2F0Y2ggKGNvbnN0IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkV29ya2VyKCk7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoZW50cnlNb25pdG9yKTsKKyAgICAgIHdoaWxlICghYmxvY2tpbmdUYXNrLT5fZW50ZXJlZCkgeworICAgICAgICBlbnRyeU1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHVuYmxvY2sgdGFzayBhbmQgcmVtb3ZlIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgIGJsb2NrZWQgPSBmYWxzZTsKKyAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlV29ya2VyKCk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRjbGVhbnVwLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBibG9ja2luZ1Rhc2sucmVzZXQoKTsKKyAgICB0aHJlYWRNYW5hZ2VyLnJlc2V0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3Q7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTJjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgdGVzdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK2NsYXNzIFRpbWVyTWFuYWdlclRlc3RzIHsKKworcHVibGljOgorICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKyAgcHVibGljOgorICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KQorICAgICAgOiBfdGltZW91dCh0aW1lb3V0KSwKKyAgICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKKyAgICAgICAgX2VuZFRpbWUoMCksCisgICAgICAgIF9tb25pdG9yKG1vbml0b3IpLAorICAgICAgICBfc3VjY2VzcyhmYWxzZSksCisgICAgICAgIF9kb25lKGZhbHNlKSB7fQorCisgICAgflRhc2soKSB7IHN0ZDo6Y2VyciA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsgfQorCisgICAgdm9pZCBydW4oKSB7CisKKyAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIF9zdWNjZXNzID0gKF9lbmRUaW1lIC0gX3N0YXJ0VGltZSkgPj0gX3RpbWVvdXQ7CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICBfZG9uZSA9IHRydWU7CisgICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgX3RpbWVvdXQ7CisgICAgaW50NjRfdCBfc3RhcnRUaW1lOworICAgIGludDY0X3QgX2VuZFRpbWU7CisgICAgTW9uaXRvciYgX21vbml0b3I7CisgICAgYm9vbCBfc3VjY2VzczsKKyAgICBib29sIF9kb25lOworICB9OworCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MgYW5kIHdhaXRzIGZvciB0aGUgZmlyc3QgdG8gZXhwaXJlIHdpdGhpbiAxMCUKKyAgICogb2YgdGhlIGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyCisgICAqIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUKKyAgICogbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDAoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiBvcnBoYW5UYXNrCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCAxMCAqIHRpbWVvdXQpKTsKKworICAgIHsKKyAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICAgIGlmICh0aW1lck1hbmFnZXIuc3RhdGUoKSAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0aW1lck1hbmFnZXIgaXMgbm90IGluIHRoZSBTVEFSVEVEIHN0YXRlLCBidXQgc2hvdWxkIGJlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gRG9uJ3QgY3JlYXRlIHRhc2sgeWV0LCBiZWNhdXNlIGl0cyBjb25zdHJ1Y3RvciBzZXRzIHRoZSBleHBlY3RlZCBjb21wbGV0aW9uIHRpbWUsIGFuZCB3ZQorICAgICAgLy8gbmVlZCB0byBkZWxheSBiZXR3ZWVuIGluc2VydGluZyB0aGUgdHdvIHRhc2tzIGludG8gdGhlIHJ1biBxdWV1ZS4KKyAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2s7CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICB0aW1lck1hbmFnZXIuYWRkKG9ycGhhblRhc2ssIDEwICogdGltZW91dCk7CisKKyAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUModGltZW91dCAqIDEwMDApOworCisgICAgICAgIHRhc2sucmVzZXQobmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGltZW91dCk7CisgICAgICAgIF9tb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0YXNrLT5fZG9uZSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInRhc2sgaXMgbm90IGRvbmUsIGJ1dCBpdCBzaG91bGQgaGF2ZSBleGVjdXRlZCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAodGFzay0+X3N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgaWYgKG9ycGhhblRhc2stPl9kb25lKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIm9ycGhhbiB0YXNrIGlzIGRvbmUsIGJ1dCBpdCBzaG91bGQgbm90IGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDEoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDIpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0YXNrVG9SZW1vdmUpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzIHdpdGggdGhlIHNhbWUgY2FsbGJhY2sgYW5kIGFub3RoZXIgb25lLCB0aGVuIHJlbW92ZXMgdGhlIHR3bworICAgKiBkdXBsaWNhdGVkIHRoZW4gd2FpdHMgZm9yIHRoZSBsYXN0IG9uZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5CisgICAqIGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZQorICAgKiBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDIoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgb25lIHRhc2tzIGFuZCBhZGQgaXQgdHdpY2UKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMykpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCAqIDIpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgdGFzayAoZS5nLiB0d28gdGltZXJzKSBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcywgcmVtb3ZlcyB0aGUgZmlyc3Qgb25lIHRoZW4gd2FpdHMgZm9yIHRoZSBzZWNvbmQgb25lLiBJdCB0aGVuCisgICAqIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQKKyAgICogdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMyhpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0d28gdGFza3MKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgVGltZXJNYW5hZ2VyOjpUaW1lciB0aW1lciA9IHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgb25lIHRhc2sgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIC8vIFZlcmlmeSBiZWhhdmlvciB3aGVuIHJlbW92aW5nIHRoZSByZW1vdmVkIHRhc2sKKyAgICB0cnkgeworICAgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgICBhc3NlcnQoMCA9PSAiRVJST1I6IFRoaXMgcmVtb3ZlIHNob3VsZCBzZW5kIGEgTm9TdWNoVGFza0V4Y2VwdGlvbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTm9TdWNoVGFza0V4Y2VwdGlvbiYpIHsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyBvbmUgdGFza3MsIGFuZCB0cmllcyB0byByZW1vdmUgaXQgYWZ0ZXIgaXQgaGFzIGV4cGlyZWQuCisgICAqLworICBib29sIHRlc3QwNChpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0YXNrCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAxMCkpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIHRhc2sgaGFzIGNvbXBsZXRlZAorICAgIF9tb25pdG9yLndhaXQodGltZW91dCk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgZXhwaXJlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmcmllbmQgY2xhc3MgVGVzdFRhc2s7CisKKyAgTW9uaXRvciBfbW9uaXRvcjsKK307CisKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9saW5rL0xpbmtUZXN0LmNwcApAQCAtMCwwICsxLDIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ludCBtYWluKGludCwgY2hhcioqKSB7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTc5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBhIGxpbmsgdGVzdCB0aGF0IG1ha2VzIHN1cmUgZ2VuZXJhdGVkCisgKiB0ZW1wbGF0ZWQgc2VydmljZSBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIG11bHRpcGxlCisgKiBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcApAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGEgbGluayB0ZXN0IHRoYXQgbWFrZXMgc3VyZSBnZW5lcmF0ZWQKKyAqIHRlbXBsYXRlZCBzZXJ2aWNlIGhlYWRlcnMgY2FuIGJlIGluY2x1ZGVkIGZyb20gbXVsdGlwbGUKKyAqIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICovCisKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkZGJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRXZlbnRMb2cuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCituYW1lc3BhY2UgeworCisvLyBEZWZpbmUgZW52aXJvbm1lbnQgdmFyaWFibGUgREVCVUdfRVZFTlRMT0cgdG8gZW5hYmxlIGRlYnVnIGxvZ2dpbmcKKy8vIGV4OiAkIERFQlVHX0VWRU5UTE9HPTEgcHJvY2Vzc29yX3Rlc3QKK3N0YXRpYyBjb25zdCBjaGFyICogREVCVUdfRVZFTlRMT0cgPSBnZXRlbnYoIkRFQlVHX0VWRU5UTE9HIik7CisKK3ZvaWQgZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKERFQlVHX0VWRU5UTE9HKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIH0KK30KK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKwordWludDMyX3QgRXZlbnRMb2c6Om5leHRJZF8gPSAwOworCisjZGVmaW5lIEVWRU5UX1RZUEUodmFsdWUpIEV2ZW50VHlwZSBFdmVudExvZzo6dmFsdWUgPSAjdmFsdWUKK0VWRU5UX1RZUEUoRVRfTE9HX0VORCk7CitFVkVOVF9UWVBFKEVUX0NPTk5fQ1JFQVRFRCk7CitFVkVOVF9UWVBFKEVUX0NPTk5fREVTVFJPWUVEKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9TVEFSVEVEKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9GSU5JU0hFRCk7CitFVkVOVF9UWVBFKEVUX1BST0NFU1MpOworRVZFTlRfVFlQRShFVF9QUkVfUkVBRCk7CitFVkVOVF9UWVBFKEVUX1BPU1RfUkVBRCk7CitFVkVOVF9UWVBFKEVUX1BSRV9XUklURSk7CitFVkVOVF9UWVBFKEVUX1BPU1RfV1JJVEUpOworRVZFTlRfVFlQRShFVF9BU1lOQ19DT01QTEVURSk7CitFVkVOVF9UWVBFKEVUX0hBTkRMRVJfRVJST1IpOworCitFVkVOVF9UWVBFKEVUX0NBTExfSU5DUkVNRU5UX0dFTkVSQVRJT04pOworRVZFTlRfVFlQRShFVF9DQUxMX0dFVF9HRU5FUkFUSU9OKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9BRERfU1RSSU5HKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9HRVRfU1RSSU5HUyk7CitFVkVOVF9UWVBFKEVUX0NBTExfR0VUX0RBVEFfV0FJVCk7CitFVkVOVF9UWVBFKEVUX0NBTExfT05FV0FZX1dBSVQpOworRVZFTlRfVFlQRShFVF9DQUxMX0VYQ0VQVElPTl9XQUlUKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9VTkVYUEVDVEVEX0VYQ0VQVElPTl9XQUlUKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9TRVRfVkFMVUUpOworRVZFTlRfVFlQRShFVF9DQUxMX0dFVF9WQUxVRSk7CitFVkVOVF9UWVBFKEVUX1dBSVRfUkVUVVJOKTsKKworRXZlbnRMb2c6OkV2ZW50TG9nKCkgeworICBpZF8gPSBuZXh0SWRfKys7CisgIGRlYnVnKCJOZXcgbG9nOiAlZCIsIGlkXyk7Cit9CisKK3ZvaWQgRXZlbnRMb2c6OmFwcGVuZChFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FsbElkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgZGVidWcoIiVkIDwtLSAldSwgJXUsICVzIFwiJXNcIiIsIGlkXywgY29ubmVjdGlvbklkLCBjYWxsSWQsIHR5cGUsIG1lc3NhZ2UuY19zdHIoKSk7CisKKyAgRXZlbnQgZSh0eXBlLCBjb25uZWN0aW9uSWQsIGNhbGxJZCwgbWVzc2FnZSk7CisgIGV2ZW50c18ucHVzaF9iYWNrKGUpOworCisgIG1vbml0b3JfLm5vdGlmeSgpOworfQorCitFdmVudCBFdmVudExvZzo6d2FpdEZvckV2ZW50KGludDY0X3QgdGltZW91dCkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisKKyAgdHJ5IHsKKyAgICB3aGlsZSAoZXZlbnRzXy5lbXB0eSgpKSB7CisgICAgICBtb25pdG9yXy53YWl0KHRpbWVvdXQpOworICAgIH0KKyAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24gZXgpIHsKKyAgICByZXR1cm4gRXZlbnQoRVRfTE9HX0VORCwgMCwgMCwgIiIpOworICB9CisKKyAgRXZlbnQgZXZlbnQgPSBldmVudHNfLmZyb250KCk7CisgIGV2ZW50c18ucG9wX2Zyb250KCk7CisgIHJldHVybiBldmVudDsKK30KKworRXZlbnQgRXZlbnRMb2c6OndhaXRGb3JDb25uRXZlbnQodWludDMyX3QgY29ubklkLCBpbnQ2NF90IHRpbWVvdXQpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworCisgIEV2ZW50TGlzdDo6aXRlcmF0b3IgaXQgPSBldmVudHNfLmJlZ2luKCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIFRPRE86IGl0IHdvdWxkIGJlIG5pY2VyIHRvIGhvbm9yIHRpbWVvdXQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzCisgICAgICAvLyBjYWxsLCByYXRoZXIgdGhhbiByZXN0YXJ0aW5nIGl0IGZvciBlYWNoIGNhbGwgdG8gd2FpdCgpLiAgSXQgc2hvdWxkbid0CisgICAgICAvLyBiZSBhIGJpZyBwcm9ibGVtIGluIHByYWN0aWNlLCB0aG91Z2guCisgICAgICB3aGlsZSAoaXQgPT0gZXZlbnRzXy5lbmQoKSkgeworICAgICAgICBtb25pdG9yXy53YWl0KHRpbWVvdXQpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uIGV4KSB7CisgICAgICByZXR1cm4gRXZlbnQoRVRfTE9HX0VORCwgMCwgMCwgIiIpOworICAgIH0KKworICAgIGlmIChpdC0+Y29ubmVjdGlvbklkID09IGNvbm5JZCkgeworICAgICAgRXZlbnQgZXZlbnQgPSAqaXQ7CisgICAgICBldmVudHNfLmVyYXNlKGl0KTsKKyAgICAgIHJldHVybiBldmVudDsKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjgyNzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URVNUX0VWRU5UTE9HX0hfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9FVkVOVExPR19IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCisvLyBJbml0aWFsbHkgSSBtYWRlIEV2ZW50VHlwZSBhbiBlbnVtLCBidXQgdXNpbmcgY2hhciogcmVzdWx0cworLy8gaW4gbXVjaCBtb3JlIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYSBtaXNtYXRjaC4KKy8vIEl0IGFsc28gbGV0cyB1c2VycyBvZiBFdmVudExvZyBlYXNpbHkgZGVmaW5lIHRoZWlyIG93biBuZXcgdHlwZXMuCisvLyBDb21wYXJpbmcgdGhlIGxpdGVyYWwgcG9pbnRlciB2YWx1ZXMgc2hvdWxkIGJlIHNhZmUsIGJhcnJpbmcgYW55IHN0cmFuZ2UKKy8vIGxpbmtpbmcgc2V0dXAgdGhhdCByZXN1bHRzIGluIGR1cGxpY2F0ZSBzeW1ib2xzLgordHlwZWRlZiBjb25zdCBjaGFyKiBFdmVudFR5cGU7CisKK3N0cnVjdCBFdmVudCB7CisgIEV2ZW50KEV2ZW50VHlwZSB0eXBlLCB1aW50MzJfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGNhbGxJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiB0eXBlKHR5cGUpLCBjb25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgY2FsbElkKGNhbGxJZCksIG1lc3NhZ2UobWVzc2FnZSkge30KKworICBFdmVudFR5cGUgdHlwZTsKKyAgdWludDMyX3QgY29ubmVjdGlvbklkOworICB1aW50MzJfdCBjYWxsSWQ7CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7Cit9OworCitjbGFzcyBFdmVudExvZyB7CitwdWJsaWM6CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfTE9HX0VORDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DT05OX0NSRUFURUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ09OTl9ERVNUUk9ZRUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9TVEFSVEVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfRklOSVNIRUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUFJPQ0VTUzsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9QUkVfUkVBRDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9QT1NUX1JFQUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUFJFX1dSSVRFOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX1BPU1RfV1JJVEU7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQVNZTkNfQ09NUExFVEU7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfSEFORExFUl9FUlJPUjsKKworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfSU5DUkVNRU5UX0dFTkVSQVRJT047CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfR0VORVJBVElPTjsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0FERF9TVFJJTkc7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfU1RSSU5HUzsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0dFVF9EQVRBX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9PTkVXQVlfV0FJVDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX1VORVhQRUNURURfRVhDRVBUSU9OX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9FWENFUFRJT05fV0FJVDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9XQUlUX1JFVFVSTjsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX1NFVF9WQUxVRTsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0dFVF9WQUxVRTsKKworICBFdmVudExvZygpOworCisgIHZvaWQgYXBwZW5kKEV2ZW50VHlwZSB0eXBlLAorICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UgPSAiIik7CisKKyAgRXZlbnQgd2FpdEZvckV2ZW50KGludDY0X3QgdGltZW91dCA9IDUwMCk7CisgIEV2ZW50IHdhaXRGb3JDb25uRXZlbnQodWludDMyX3QgY29ubklkLCBpbnQ2NF90IHRpbWVvdXQgPSA1MDApOworCitwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgc3RkOjpsaXN0PEV2ZW50PiBFdmVudExpc3Q7CisKKyAgY29uY3VycmVuY3k6Ok1vbml0b3IgbW9uaXRvcl87CisgIEV2ZW50TGlzdCBldmVudHNfOworICB1aW50MzJfdCBpZF87CisKKyAgc3RhdGljIHVpbnQzMl90IG5leHRJZF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9URVNUX0VWRU5UTE9HX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3ODRkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1BST0NFU1NPUl9URVNUX0hBTkRMRVJTX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPQ0VTU09SX1RFU1RfSEFORExFUlNfSF8gMQorCisjaW5jbHVkZSAiRXZlbnRMb2cuaCIKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCitjbGFzcyBQYXJlbnRIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgUGFyZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpCisgICAgOiB0cmlnZ2VyTW9uaXRvcigmbXV0ZXhfKSwgZ2VuZXJhdGlvbl8oMCksIHdhaXRfKGZhbHNlKSwgbG9nXyhsb2cpIHt9CisKKyAgaW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0lOQ1JFTUVOVF9HRU5FUkFUSU9OLCAwLCAwKTsKKyAgICByZXR1cm4gKytnZW5lcmF0aW9uXzsKKyAgfQorCisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9HRVRfR0VORVJBVElPTiwgMCwgMCk7CisgICAgcmV0dXJuIGdlbmVyYXRpb25fOworICB9CisKKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9BRERfU1RSSU5HLCAwLCAwKTsKKyAgICBzdHJpbmdzXy5wdXNoX2JhY2socyk7CisgIH0KKworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX1NUUklOR1MsIDAsIDApOworICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKKyAgfQorCisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0RBVEFfV0FJVCwgMCwgMCk7CisKKyAgICBibG9ja1VudGlsVHJpZ2dlcmVkKCk7CisKKyAgICBfcmV0dXJuLmFwcGVuZChsZW5ndGgsICdhJyk7CisgIH0KKworICB2b2lkIG9uZXdheVdhaXQoKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfT05FV0FZX1dBSVQsIDAsIDApOworCisgICAgYmxvY2tVbnRpbFRyaWdnZXJlZCgpOworICB9CisKKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfRVhDRVBUSU9OX1dBSVQsIDAsIDApOworCisgICAgYmxvY2tVbnRpbFRyaWdnZXJlZCgpOworCisgICAgTXlFcnJvciBlOworICAgIGUubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhyb3cgZTsKKyAgfQorCisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9VTkVYUEVDVEVEX0VYQ0VQVElPTl9XQUlULCAwLCAwKTsKKworICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKKworICAgIE15RXJyb3IgZTsKKyAgICBlLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRocm93IGU7CisgIH0KKworICAvKioKKyAgICogQWZ0ZXIgcHJlcGFyZVRyaWdnZXJlZENhbGwoKSBpcyBpbnZva2VkLCBjYWxscyB0byBhbnkgb2YgdGhlICpXYWl0KCkKKyAgICogZnVuY3Rpb25zIHdvbid0IHJldHVybiB1bnRpbCB0cmlnZ2VyUGVuZGluZ0NhbGxzKCkgaXMgaW52b2tlZAorICAgKgorICAgKiBUaGlzIGhhcyB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGludm9rZWQgYnkgdGhlIG1haW4gdGVzdCB0aHJlYWQKKyAgICogaW4gb3JkZXIgdG8gdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLgorICAgKi8KKyAgdm9pZCBwcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIHdhaXRfID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBXYWtlIHVwIGFsbCBjYWxscyB3YWl0aW5nIGluIGJsb2NrVW50aWxUcmlnZ2VyZWQoKQorICAgKi8KKyAgdm9pZCB0cmlnZ2VyUGVuZGluZ0NhbGxzKCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgd2FpdF8gPSBmYWxzZTsKKyAgICB0cmlnZ2VyTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBibG9ja1VudGlsVHJpZ2dlcmVkKCkgd29uJ3QgcmV0dXJuIHVudGlsIHRyaWdnZXJQZW5kaW5nQ2FsbHMoKSBpcyBpbnZva2VkCisgICAqIGluIGFub3RoZXIgdGhyZWFkLgorICAgKgorICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGFscmVhZHkgaG9sZGluZyBtdXRleF8uCisgICAqLworICB2b2lkIGJsb2NrVW50aWxUcmlnZ2VyZWQoKSB7CisgICAgd2hpbGUgKHdhaXRfKSB7CisgICAgICB0cmlnZ2VyTW9uaXRvci53YWl0Rm9yZXZlcigpOworICAgIH0KKworICAgIC8vIExvZyBhbiBldmVudCB3aGVuIHdlIHJldHVybgorICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfV0FJVF9SRVRVUk4sIDAsIDApOworICB9CisKKyAgY29uY3VycmVuY3k6Ok11dGV4IG11dGV4XzsKKyAgY29uY3VycmVuY3k6Ok1vbml0b3IgdHJpZ2dlck1vbml0b3I7CisgIGludDMyX3QgZ2VuZXJhdGlvbl87CisgIGJvb2wgd2FpdF87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworfTsKKworI2lmZGVmIF9XSU4zMgorICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjUwICkgLy9pbmhlcml0aW5nIG1ldGhvZHMgdmlhIGRvbWluYW5jZQorI2VuZGlmCisKK2NsYXNzIENoaWxkSGFuZGxlciA6IHB1YmxpYyBQYXJlbnRIYW5kbGVyLCB2aXJ0dWFsIHB1YmxpYyBDaGlsZFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIENoaWxkSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogUGFyZW50SGFuZGxlcihsb2cpLCB2YWx1ZV8oMCkge30KKworICBpbnQzMl90IHNldFZhbHVlKGNvbnN0IGludDMyX3QgdmFsdWUpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsIDAsIDApOworCisgICAgaW50MzJfdCBvbGRWYWx1ZSA9IHZhbHVlXzsKKyAgICB2YWx1ZV8gPSB2YWx1ZTsKKyAgICByZXR1cm4gb2xkVmFsdWU7CisgIH0KKworICBpbnQzMl90IGdldFZhbHVlKCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwgMCwgMCk7CisKKyAgICByZXR1cm4gdmFsdWVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgaW50MzJfdCB2YWx1ZV87Cit9OworCisjaWZkZWYgX1dJTjMyCisgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCitzdHJ1Y3QgQ29ubkNvbnRleHQgeworcHVibGljOgorICBDb25uQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGlkKQorICAgIDogaW5wdXQoaW4pLCBvdXRwdXQob3V0KSwgaWQoaWQpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICB1aW50MzJfdCBpZDsKK307CisKK3N0cnVjdCBDYWxsQ29udGV4dCB7CitwdWJsaWM6CisgIENhbGxDb250ZXh0KENvbm5Db250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiBjb25uQ29udGV4dChjb250ZXh0KSwgbmFtZShuYW1lKSwgaWQoaWQpIHt9CisKKyAgQ29ubkNvbnRleHQqIGNvbm5Db250ZXh0OworICBzdGQ6OnN0cmluZyBuYW1lOworICB1aW50MzJfdCBpZDsKK307CisKK2NsYXNzIFNlcnZlckV2ZW50SGFuZGxlciA6IHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworcHVibGljOgorICBTZXJ2ZXJFdmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQorCisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHt9CisKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBDb25uQ29udGV4dCogY29udGV4dCA9IG5ldyBDb25uQ29udGV4dChpbnB1dCwgb3V0cHV0LCBuZXh0SWRfKTsKKyAgICArK25leHRJZF87CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DT05OX0NSRUFURUQsIGNvbnRleHQtPmlkLCAwKTsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgeworICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOworCisgICAgaWYgKGlucHV0ICE9IGNvbnRleHQtPmlucHV0KSB7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBpZiAob3V0cHV0ICE9IGNvbnRleHQtPm91dHB1dCkgeworICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBjb250ZXh0LT5pZCwgMCk7CisKKyAgICBkZWxldGUgY29udGV4dDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisvLyBUT0RPOiBXZSBjdXJyZW50bHkgZG9uJ3QgdGVzdCB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2Nlc3NDb250ZXh0KCkKKy8vIGNhbGxzLiAgVGhlIHZhcmlvdXMgc2VydmVyIGltcGxlbWVudGF0aW9ucyBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYXQKKy8vIHNsaWdodGx5IGRpZmZlcmVudCB0aW1lcywgYW5kIGl0IGlzIHRvbyBhbm5veWluZyB0byB0cnkgYW5kIGFjY291bnQgZm9yCisvLyB0aGVpciB2YXJpb3VzIGRpZmZlcmVuY2VzLgorLy8KKy8vIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIsIGFuZCBUU2ltcGxlU2VydmVyIHVzdWFsbHkgd2FpdCB1bnRpbAorLy8gdGhleSBzZWUgdGhlIGZpcnN0IGJ5dGUgb2YgYSByZXF1ZXN0IGJlZm9yZSBjYWxsaW5nIHByb2Nlc3NDb250ZXh0KCkuCisvLyBIb3dldmVyLCB0aGV5IGRvbid0IHdhaXQgZm9yIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB2ZXJ5IGZpcnN0IHJlcXVlc3QsCisvLyBhbmQgaW5zdGVhZCBpbW1lZGlhdGVseSBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYmVmb3JlIGFueSBkYXRhIGlzCisvLyByZWNlaXZlZC4KKy8vCisvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYWx3YXlzIHdhaXRzIHVudGlsIHJlY2VpdmluZyB0aGUgZnVsbCByZXF1ZXN0IGJlZm9yZQorLy8gY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgorI2lmIDAKKyAgICBDb25uQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BST0NFU1MsIGNvbnRleHQtPmlkLCAwKTsKKyNlbHNlCisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShzZXJ2ZXJDb250ZXh0KTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHRyYW5zcG9ydCk7CisjZW5kaWYKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHVpbnQzMl90IG5leHRJZF87CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKK307CisKK2NsYXNzIFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KKworICB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuTmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgeworICAgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKKworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gbmV3IENhbGxDb250ZXh0KGNvbm5Db250ZXh0LCBuZXh0SWRfLCBmbk5hbWUpOworICAgICsrbmV4dElkXzsKKworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9TVEFSVEVELCBjb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIHJldHVybiBjb250ZXh0OworICB9CisKKyAgdm9pZCBmcmVlQ29udGV4dCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIGRlbGV0ZSBjb250ZXh0OworICB9CisKKyAgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BSRV9SRUFELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKKyAgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGJ5dGVzKTsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUE9TVF9SRUFELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKKyAgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUkVfV1JJVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworICB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGJ5dGVzKTsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUE9TVF9XUklURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9BU1lOQ19DT01QTEVURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlckVycm9yKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0hBTkRMRVJfRVJST1IsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIGNoZWNrTmFtZShjb25zdCBDYWxsQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogZm5OYW1lKSB7CisgICAgLy8gTm90ZTogd2UgY2FuJ3QgdXNlIEJPT1NUX0NIRUNLX0VRVUFMIGhlcmUsIHNpbmNlIHRoZSBoYW5kbGVyIHJ1bnMgaW4gYQorICAgIC8vIGRpZmZlcmVudCB0aHJlYWQgZnJvbSB0aGUgdGVzdCBmdW5jdGlvbnMuICBKdXN0IGFib3J0IGlmIHRoZSBuYW1lcyBhcmUKKyAgICAvLyBkaWZmZXJlbnQKKyAgICBpZiAoY29udGV4dC0+bmFtZSAhPSBmbk5hbWUpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiY2FsbCBjb250ZXh0IG5hbWUgbWlzbWF0Y2g6IFwiJXNcIiAhPSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgIGNvbnRleHQtPm5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgZm5OYW1lKTsKKyAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgYWJvcnQoKTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCBuZXh0SWRfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9QUk9DRVNTT1JfVEVTVF9IQU5ETEVSU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjZTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0ZXN0cyB0aGF0IGVuc3VyZSBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIGFuZAorICogVFNlcnZlckV2ZW50SGFuZGxlciBhcmUgaW52b2tlZCBwcm9wZXJseSBieSB0aGUgdmFyaW91cyBzZXJ2ZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKworI2luY2x1ZGUgIkV2ZW50TG9nLmgiCisjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCisjaW5jbHVkZSAiSGFuZGxlcnMuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvKgorICogVHJhaXRzIGNsYXNzZXMgdGhhdCBlbmNhcHN1bGF0ZSBob3cgdG8gY3JlYXRlIHZhcmlvdXMgdHlwZXMgb2Ygc2VydmVycy4KKyAqLworCitjbGFzcyBUU2ltcGxlU2VydmVyVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUU2ltcGxlU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgdWludDE2X3QgcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4oCisgICAgICAgIG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgfQorfTsKKworY2xhc3MgVFRocmVhZGVkU2VydmVyVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUVGhyZWFkZWRTZXJ2ZXIgU2VydmVyVHlwZTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworICB9Cit9OworCitjbGFzcyBUVGhyZWFkUG9vbFNlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVFRocmVhZFBvb2xTZXJ2ZXIgU2VydmVyVHlwZTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgdWludDE2X3QgcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSk7CisgIH0KK307CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVE5vbmJsb2NraW5nU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICB1aW50MTZfdCBwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgorICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKKyAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQorICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgICAgID0gZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CisgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKKyAgfQorfTsKKworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyTm9UaHJlYWRzVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUTm9uYmxvY2tpbmdTZXJ2ZXIgU2VydmVyVHlwZTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYXV0b21hdGljYWxseSB1c2VzIFRGcmFtZWRUcmFuc3BvcnQuCisgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCB0cmFuc3BvcnQgZmFjdG9yeSBpcyBub3QgYQorICAgIC8vIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5CisgICAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqIGZyYW1lZEZhY3RvcnkKKyAgICAgICAgPSBkeW5hbWljX2Nhc3Q8VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqPih0cmFuc3BvcnRGYWN0b3J5LmdldCgpKTsKKyAgICBpZiAoZnJhbWVkRmFjdG9yeSA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAvLyBVc2UgYSBOVUxMIFRocmVhZE1hbmFnZXIKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcjsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOworICB9Cit9OworCisvKgorICogVHJhaXRzIGNsYXNzZXMgZm9yIGNvbnRyb2xsaW5nIGlmIHdlIGluc3RhbnRpYXRlIHRlbXBsYXRlZCBvciBnZW5lcmljCisgKiBwcm90b2NvbCBmYWN0b3JpZXMsIHByb2Nlc3NvcnMsIGNsaWVudHMsIGV0Yy4KKyAqCisgKiBUaGUgZ29hbCBpcyB0byBhbGxvdyB0aGUgb3V0ZXIgdGVzdCBjb2RlIHRvIHNlbGVjdCB3aGljaCBzZXJ2ZXIgdHlwZSBpcworICogYmVpbmcgdGVzdGVkLCBhbmQgd2hldGhlciBvciBub3Qgd2UgYXJlIHRlc3RpbmcgdGhlIHRlbXBsYXRlZCBjbGFzc2VzLCBvcgorICogdGhlIGdlbmVyaWMgY2xhc3Nlcy4KKyAqCisgKiBFYWNoIHNwZWNpZmljIHRlc3QgY2FzZSBjYW4gY29udHJvbCB3aGV0aGVyIHdlIGNyZWF0ZSBhIGNoaWxkIG9yIHBhcmVudAorICogc2VydmVyLCBhbmQgd2hldGhlciB3ZSB1c2UgVEZyYW1lZFRyYW5zcG9ydCBvciBUQnVmZmVyZWRUcmFuc3BvcnQuCisgKi8KKworY2xhc3MgVW50ZW1wbGF0ZWRUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbCBQcm90b2NvbDsKKworICB0eXBlZGVmIFBhcmVudFNlcnZpY2VQcm9jZXNzb3IgUGFyZW50UHJvY2Vzc29yOworICB0eXBlZGVmIENoaWxkU2VydmljZVByb2Nlc3NvciBDaGlsZFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlQ2xpZW50IFBhcmVudENsaWVudDsKKyAgdHlwZWRlZiBDaGlsZFNlcnZpY2VDbGllbnQgQ2hpbGRDbGllbnQ7Cit9OworCitjbGFzcyBUZW1wbGF0ZWRUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiBQcm90b2NvbEZhY3Rvcnk7CisgIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUQnVmZmVyQmFzZT4gUHJvdG9jb2w7CisKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yVDxQcm90b2NvbD4gUGFyZW50UHJvY2Vzc29yOworICB0eXBlZGVmIENoaWxkU2VydmljZVByb2Nlc3NvclQ8UHJvdG9jb2w+IENoaWxkUHJvY2Vzc29yOworICB0eXBlZGVmIFBhcmVudFNlcnZpY2VDbGllbnRUPFByb3RvY29sPiBQYXJlbnRDbGllbnQ7CisgIHR5cGVkZWYgQ2hpbGRTZXJ2aWNlQ2xpZW50VDxQcm90b2NvbD4gQ2hpbGRDbGllbnQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgorY2xhc3MgUGFyZW50U2VydmljZVRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQYXJlbnRQcm9jZXNzb3IgUHJvY2Vzc29yOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UGFyZW50Q2xpZW50IENsaWVudDsKKyAgdHlwZWRlZiBQYXJlbnRIYW5kbGVyIEhhbmRsZXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3Rvcnk7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQcm90b2NvbCBQcm90b2NvbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c18+CitjbGFzcyBDaGlsZFNlcnZpY2VUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6Q2hpbGRQcm9jZXNzb3IgUHJvY2Vzc29yOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6Q2hpbGRDbGllbnQgQ2xpZW50OworICB0eXBlZGVmIENoaWxkSGFuZGxlciBIYW5kbGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7Cit9OworCisvLyBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlciBpZiB0aGUgVFRyYW5zcG9ydEZhY3RvcnkgdHlwZXMgZGVmaW5lZCBhIHR5cGVkZWYsCisvLyB0byBhbGxvdyB1cyB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCB0cmFuc3BvcnQgdHlwZSB3aXRob3V0IGhhdmluZyB0byBwYXNzIGl0CisvLyBpbiBhcyBhIHNlcGFyYXRlIHRlbXBsYXRlIHBhcmFtZXRlciBoZXJlLgorLy8KKy8vIEl0IHdvdWxkIGFsc28gYmUgbmllYyBpZiB0aGV5IHVzZWQgY292YXJpYW50IHJldHVybiB0eXBlcy4gIFVuZm9ydHVuYXRlbHksCisvLyBzaW5jZSB0aGV5IHJldHVybiBzaGFyZWRfcHRyIGluc3RlYWQgb2YgcmF3IHBvaW50ZXJzLCBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzCisvLyB3b24ndCB3b3JrLgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0c18sCisgICAgICAgICAgdHlwZW5hbWUgU2VydmljZVRyYWl0c18sCisgICAgICAgICAgdHlwZW5hbWUgVHJhbnNwb3J0RmFjdG9yeV8gPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICB0eXBlbmFtZSBUcmFuc3BvcnRfID0gVEZyYW1lZFRyYW5zcG9ydD4KK2NsYXNzIFNlcnZpY2VTdGF0ZSA6IHB1YmxpYyBTZXJ2ZXJTdGF0ZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb2Nlc3NvciBQcm9jZXNzb3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OkNsaWVudCBDbGllbnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OkhhbmRsZXIgSGFuZGxlcjsKKworICBTZXJ2aWNlU3RhdGUoKQorICAgIDogcG9ydF8oMCksCisgICAgICBsb2dfKG5ldyBFdmVudExvZyksCisgICAgICBoYW5kbGVyXyhuZXcgSGFuZGxlcihsb2dfKSksCisgICAgICBwcm9jZXNzb3JfKG5ldyBQcm9jZXNzb3IoaGFuZGxlcl8pKSwKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnlfKG5ldyBUcmFuc3BvcnRGYWN0b3J5XyksCisgICAgICBwcm90b2NvbEZhY3RvcnlfKG5ldyB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8obmV3IFNlcnZlckV2ZW50SGFuZGxlcihsb2dfKSksCisgICAgICBwcm9jZXNzb3JFdmVudEhhbmRsZXJfKG5ldyBQcm9jZXNzb3JFdmVudEhhbmRsZXIobG9nXykpIHsKKyAgICBwcm9jZXNzb3JfLT5zZXRFdmVudEhhbmRsZXIocHJvY2Vzc29yRXZlbnRIYW5kbGVyXyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpIHsKKyAgICBTZXJ2ZXJUcmFpdHNfIHNlcnZlclRyYWl0czsKKyAgICByZXR1cm4gc2VydmVyVHJhaXRzLmNyZWF0ZVNlcnZlcihwcm9jZXNzb3JfLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5XywgcHJvdG9jb2xGYWN0b3J5Xyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQorCisgIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgcG9ydCkgeyBwb3J0XyA9IHBvcnQ7IH0KKworICB1aW50MTZfdCBnZXRQb3J0KCkgY29uc3QgeyByZXR1cm4gcG9ydF87IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7IHJldHVybiBsb2dfOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXI+JiBnZXRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlcl87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0XykpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFuc3BvcnQobmV3IFRyYW5zcG9ydF8oc29ja2V0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjbGllbnQobmV3IENsaWVudChwcm90b2NvbCkpOworICAgIHJldHVybiBjbGllbnQ7CisgIH0KKworcHJpdmF0ZToKKyAgdWludDE2X3QgcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXI+IGhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBwcm9jZXNzb3JFdmVudEhhbmRsZXJfOworfTsKKworLyoqCisgKiBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyBpbiB0aGUgbG9nCisgKi8KK3ZvaWQgY2hlY2tOb0V2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKKyAgLy8gV2FpdCBmb3IgYW4gZXZlbnQgd2l0aCBhIHZlcnkgc2hvcnQgdGltZW91dCBwZXJpb2QuICBXZSBkb24ndCBleHBlY3QKKyAgLy8gYW55dGhpbmcgdG8gYmUgcHJlc2VudCwgc28gd2Ugd2lsbCBub3JtYWxseSB3YWl0IGZvciB0aGUgZnVsbCB0aW1lb3V0LgorICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgYSBub24temVybyB0aW1lb3V0IGlzIG5pY2Ugc2luY2UgaXQgZG9lcyBnaXZlIGEgc2hvcnQKKyAgLy8gd2luZG93IGZvciBldmVudHMgdG8gYXJyaXZlIGluIGNhc2UgdGhlcmUgaXMgYSBwcm9ibGVtLgorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0xPR19FTkQsIGV2ZW50LnR5cGUpOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgY3JlYXRlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgorICovCit1aW50MzJfdCBjaGVja05ld0Nvbm5FdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7CisgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0NSRUFURUQgZXZlbnQKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgyNTAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fQ1JFQVRFRCwgZXZlbnQudHlwZSk7CisKKyAgLy8gU29tZSBzZXJ2ZXJzIGNhbGwgdGhlIHByb2Nlc3NDb250ZXh0KCkgaG9vayBpbW1lZGlhdGVseS4KKyAgLy8gT3RoZXJzIChUTm9uYmxvY2tpbmdTZXJ2ZXIpIG9ubHkgY2FsbCBpdCBvbmNlIGEgZnVsbCByZXF1ZXN0IGlzIHJlY2VpdmVkLgorICAvLyBXZSBkb24ndCBjaGVjayBmb3IgaXQgeWV0LCB0byBhbGxvdyBlaXRoZXIgYmVoYXZpb3IuCisKKyAgcmV0dXJuIGV2ZW50LmNvbm5lY3Rpb25JZDsKK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICovCit2b2lkIGNoZWNrQ2xvc2VFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLCB1aW50MzJfdCBjb25uSWQpIHsKKyAgLy8gQ2hlY2sgZm9yIGFuIEVUX0NPTk5fREVTVFJPWUVEIGV2ZW50CisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgY2FsbCBpcyByZWNlaXZlZAorICogYW5kIHRoZSBoYW5kbGVyIGlzIGludm9rZWQuCisgKgorICogSXQgZG9lcyBub3QgY2hlY2sgZm9yIGFueXRoaW5nIGFmdGVyIHRoZSBoYW5kbGVyIGludm9jYXRpb24uCisgKgorICogUmV0dXJucyB0aGUgY2FsbCBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLwordWludDMyX3QgY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CisgIC8vIENhbGwgc3RhcnRlZAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX1NUQVJURUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgdWludDMyX3QgY2FsbElkID0gZXZlbnQuY2FsbElkOworCisgIC8vIFByZS1yZWFkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BSRV9SRUFELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBQb3N0LXJlYWQKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUE9TVF9SRUFELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBIYW5kbGVyIGludm9jYXRpb24KKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsVHlwZSwgZXZlbnQudHlwZSk7CisgIC8vIFRoZSBoYW5kbGVyIGRvZXNuJ3QgaGF2ZSBhbnkgY29ubmVjdGlvbiBvciBjYWxsIGNvbnRleHQsCisgIC8vIHNvIHRoZSBjb25uZWN0aW9uSWQgYW5kIGNhbGxJZCBpbiB0aGlzIGV2ZW50IGFyZW4ndCB2YWxpZAorCisgIHJldHVybiBjYWxsSWQ7Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgYSBoYW5kbGVyIHJldHVybnMuCisgKi8KK3ZvaWQgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsTmFtZSkgeworICAvLyBQcmUtd3JpdGUKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBQb3N0LXdyaXRlCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIENhbGwgZmluaXNoZWQKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gSXQgaXMgYWNjZXB0YWJsZSBmb3Igc2VydmVycyB0byBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYWdhaW4gaW1tZWRpYXRlbHkKKyAgLy8gdG8gc3RhcnQgd2FpdGluZyBvbiB0aGUgbmV4dCByZXF1ZXN0LiAgSG93ZXZlciwgc29tZSBzZXJ2ZXJzIHdhaXQgYmVmb3JlCisgIC8vIGdldHRpbmcgZWl0aGVyIGEgcGFydGlhbCByZXF1ZXN0IG9yIHRoZSBmdWxsIHJlcXVlc3QgYmVmb3JlIGNhbGxpbmcKKyAgLy8gcHJvY2Vzc0NvbnRleHQoKS4gIFdlIGRvbid0IGNoZWNrIGZvciB0aGUgbmV4dCBjYWxsIHRvIHByb2Nlc3NDb250ZXh0KCkKKyAgLy8geWV0LgorfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgY2FsbCBpcyBtYWRlLgorICoKKyAqIFRoaXMganVzdCBjYWxscyBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKCkgZm9sbG93ZWQgYnkKKyAqIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKCkuCisgKgorICogUmV0dXJucyB0aGUgY2FsbCBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLwordWludDMyX3QgY2hlY2tDYWxsRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgY2FsbFR5cGUsIGNhbGxOYW1lKTsKKyAgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIGNhbGxJZCwgY2FsbE5hbWUpOworCisgIHJldHVybiBjYWxsSWQ7Cit9CisKKy8qCisgKiBUZXN0IGZ1bmN0aW9ucworICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdGF0ZV8+Cit2b2lkIHRlc3RQYXJlbnRTZXJ2aWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGVfOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKworICBpbnQzMl90IGdlbiA9IGNsaWVudC0+Z2V0R2VuZXJhdGlvbigpOworICBpbnQzMl90IG5ld0dlbiA9IGNsaWVudC0+aW5jcmVtZW50R2VuZXJhdGlvbigpOworICBCT09TVF9DSEVDS19FUVVBTChnZW4gKyAxLCBuZXdHZW4pOworICBuZXdHZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2VuICsgMSwgbmV3R2VuKTsKKworICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJiYXIiKTsKKyAgY2xpZW50LT5hZGRTdHJpbmcoImFzZGYiKTsKKworICB2ZWN0b3I8c3RyaW5nPiBzdHJpbmdzOworICBjbGllbnQtPmdldFN0cmluZ3Moc3RyaW5ncyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoMywgc3RyaW5ncy5zaXplKCkpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKCJmb28iLCBzdHJpbmdzWzBdKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCgiYmFyIiwgc3RyaW5nc1sxXSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoImFzZGYiLCBzdHJpbmdzWzJdKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlXz4KK3ZvaWQgdGVzdENoaWxkU2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisKKyAgLy8gVGVzdCBjYWxsaW5nIHNvbWUgb2YgdGhlIHBhcmVudCBtZXRoaWRzIHZpYSB0aGUgYSBjaGlsZCBjbGllbnQKKyAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKKyAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2VuICsgMSwgbmV3R2VuKTsKKyAgbmV3R2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdlbiArIDEsIG5ld0dlbik7CisKKyAgLy8gVGVzdCBzb21lIG9mIHRoZSBjaGlsZCBtZXRob2RzCisgIGNsaWVudC0+c2V0VmFsdWUoMTApOworICBCT09TVF9DSEVDS19FUVVBTCgxMCwgY2xpZW50LT5nZXRWYWx1ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAsIGNsaWVudC0+c2V0VmFsdWUoOTkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoOTksIGNsaWVudC0+Z2V0VmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0QmFzaWNTZXJ2aWNlKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIFBhcmVudFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIHRlc3RQYXJlbnRTZXJ2aWNlKHN0YXRlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RJbmhlcml0ZWRTZXJ2aWNlKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOworICB0ZXN0Q2hpbGRTZXJ2aWNlKHN0YXRlKTsKK30KKworLyoqCisgKiBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBUU2VydmVyRXZlbnRIYW5kbGVyIGFuZCBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyCisgKiBtZXRob2RzIGFyZSBpbnZva2VkIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggdGhlIGFjdHVhbCBldmVudHMuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0RXZlbnRTZXF1ZW5jaW5nKCkgeworICAvLyBXZSB1c2UgVEJ1ZmZlcmVkVHJhbnNwb3J0IGZvciB0aGlzIHRlc3QsIGluc3RlYWQgb2YgVEZyYW1lZFRyYW5zcG9ydC4KKyAgLy8gVGhpcyB3YXkgdGhlIHNlcnZlciB3aWxsIHN0YXJ0IHByb2Nlc3NpbmcgZGF0YSBhcyBzb29uIGFzIGl0IGlzIHJlY2VpdmVkLAorICAvLyBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBmdWxsIHJlcXVlc3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB3ZSBjYW4KKyAgLy8gc2VwYXJhdGUgdGhlIHByZVJlYWQoKSBhbmQgcG9zdFJlYWQoKSBldmVudHMuCisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiwKKyAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0PiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb2cKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnByZXBhcmVUcmlnZ2VyZWRDYWxsKCk7CisKKyAgLy8gTWFrZSBzdXJlIGNyZWF0ZUNvbnRleHQoKSBpcyBjYWxsZWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBiZWVuCisgIC8vIGVzdGFibGlzaGVkLiAgV2Ugb3BlbiBhIHBsYWluIHNvY2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY2xpZW50LgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CisgIHNvY2tldC0+b3BlbigpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGV2ZW50cyBvY2N1cnJlZCBhZnRlciBhIG5ldyBjb25uZWN0aW9uCisgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgYSBtZXNzYWdlIGhlYWRlci4gIFdlIG1hbnVhbGx5IGNvbnN0cnVjdCB0aGUgcmVxdWVzdCBzbyB0aGF0IHdlCisgIC8vIGNhbiB0ZXN0IHRoZSB0aW1pbmcgZm9yIHRoZSBwcmVSZWFkKCkgY2FsbC4KKyAgc3RyaW5nIHJlcXVlc3ROYW1lID0gImdldERhdGFXYWl0IjsKKyAgc3RyaW5nIGV2ZW50TmFtZSA9ICJQYXJlbnRTZXJ2aWNlLmdldERhdGFXYWl0IjsKKyAgaW50MzJfdCBzZXFpZCA9IGludDMyX3QodGltZShOVUxMKSk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzb2NrZXQpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihyZXF1ZXN0TmFtZSwgVF9DQUxMLCBzZXFpZCk7CisgIHNvY2tldC0+Zmx1c2goKTsKKworICAvLyBNYWtlIHN1cmUgd2Ugc2F3IHRoZSBjYWxsIHN0YXJ0ZWQgYW5kIHByZS1yZWFkIGV2ZW50cworICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX1NUQVJURUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIHVpbnQzMl90IGNhbGxJZCA9IGV2ZW50LmNhbGxJZDsKKworICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV2ZW50TmFtZSwgZXZlbnQubWVzc2FnZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbmV3IGV2ZW50cworICBjaGVja05vRXZlbnRzKGxvZyk7CisKKyAgLy8gU2VuZCB0aGUgcmVzdCBvZiB0aGUgcmVxdWVzdAorICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKCJQYXJlbnRTZXJ2aWNlX2dldERhdGFOb3RpZmllZF9wYXJncyIpOworICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oImxlbmd0aCIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIsIDEpOworICBwcm90b2NvbC53cml0ZUkzMig4ICogMTAyNCAqIDEwMjQpOworICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgIHByb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICBzb2NrZXQtPndyaXRlRW5kKCk7CisgIHNvY2tldC0+Zmx1c2goKTsKKworICAvLyBXZSBzaG91bGQgdGhlbiBzZWUgcG9zdFJlYWQoKQorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QT1NUX1JFQUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBUaGVuIHRoZSBoYW5kbGVyIHNob3VsZCBiZSBpbnZva2VkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0RBVEFfV0FJVCwgZXZlbnQudHlwZSk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd29uJ3QgcmVzcG9uZCB1bnRpbCB3ZSBub3RpZnkgaXQuCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMuCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBOb3RpZnkgdGhlIGhhbmRsZXIgdGhhdCBpdCBzaG91bGQgcmV0dXJuCisgIC8vIFdlIGp1c3QgdXNlIGEgZ2xvYmFsIGxvY2sgZm9yIG5vdywgc2luY2UgaXQgaXMgZWFzaWVzdAorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYSBzZXBhcmF0ZSBldmVudCBiZWZvcmUgaXQgcmV0dXJucworICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gV2Ugc2hvdWxkIHRoZW4gc2VlIHByZVdyaXRlKCkKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gV2UgcmVxdWVzdGVkIG1vcmUgZGF0YSB0aGFuIGNhbiBiZSBidWZmZXJlZCwgYW5kIHdlIGFyZW4ndCByZWFkaW5nIGl0LAorICAvLyBzbyB0aGUgc2VydmVyIHNob3VsZG4ndCBiZSBhYmxlIHRvIGZpbmlzaCBpdHMgd3JpdGUgeWV0LgorICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzLgorICBjaGVja05vRXZlbnRzKGxvZyk7CisKKyAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgaGVhZGVyCisgIHN0cmluZyByZXNwb25zZU5hbWU7CisgIGludDMyX3QgcmVzcG9uc2VTZXFpZCA9IDA7CisgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHJlc3BvbnNlVHlwZTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbihyZXNwb25zZU5hbWUsIHJlc3BvbnNlVHlwZSwgcmVzcG9uc2VTZXFpZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlU2VxaWQsIHNlcWlkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVxdWVzdE5hbWUsIHJlc3BvbnNlTmFtZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlVHlwZSwgVF9SRVBMWSk7CisgIC8vIFJlYWQgdGhlIGJvZHkuICBXZSBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LgorICBwcm90b2NvbC5za2lwKFRfU1RSVUNUKTsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHJlYWQsIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgZmluaXNoZWQgc2VuZGluZyB0aGUgZGF0YQorICAvLyBhbmQgY2FsbGVkIHRoZSBwb3N0V3JpdGUoKSBoYW5kbGVyCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBDYWxsIGZpbmlzaGVkIHNob3VsZCBiZSBsYXN0CisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uLCBhbmQgbWFrZSBzdXJlIHdlIGdldCBhIGNvbm5lY3Rpb24gZGVzdHJveWVkIGV2ZW50CisgIHNvY2tldC0+Y2xvc2UoKTsKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ09OTl9ERVNUUk9ZRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RTZXBhcmF0ZUNvbm5lY3Rpb25zKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MSA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50cyB3ZXJlIGxvZ2dlZAorICB1aW50MzJfdCBjbGllbnQxSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBDcmVhdGUgYSBzZWNvbmQgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQyID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgZXZlbnRzIHdlcmUgbG9nZ2VkCisgIHVpbnQzMl90IGNsaWVudDJJZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFRoZSB0d28gY29ubmVjdGlvbnMgc2hvdWxkIGhhdmUgZGlmZmVyZW50IElEcworICBCT09TVF9DSEVDS19ORShjbGllbnQxSWQsIGNsaWVudDJJZCk7CisKKyAgLy8gTWFrZSBhIGNhbGwsIGFuZCBjaGVjayBmb3IgdGhlIHByb3BlciBldmVudHMKKyAgaW50MzJfdCB2YWx1ZSA9IDU7CisgIGNsaWVudDEtPnNldFZhbHVlKHZhbHVlKTsKKyAgdWludDMyX3QgY2FsbDEKKyAgICAgID0gY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MUlkLCBFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsICJDaGlsZFNlcnZpY2Uuc2V0VmFsdWUiKTsKKworICAvLyBNYWtlIGEgY2FsbCB3aXRoIGNsaWVudDIKKyAgaW50MzJfdCB2ID0gY2xpZW50Mi0+Z2V0VmFsdWUoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmFsdWUsIHYpOworICBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQySWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwgIkNoaWxkU2VydmljZS5nZXRWYWx1ZSIpOworCisgIC8vIE1ha2UgYW5vdGhlciBjYWxsIHdpdGggY2xpZW50MQorICB2ID0gY2xpZW50MS0+Z2V0VmFsdWUoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmFsdWUsIHYpOworICB1aW50MzJfdCBjYWxsMgorICAgICAgPSBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQxSWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwgIkNoaWxkU2VydmljZS5nZXRWYWx1ZSIpOworICBCT09TVF9DSEVDS19ORShjYWxsMSwgY2FsbDIpOworCisgIC8vIENsb3NlIHRoZSBzZWNvbmQgY2xpZW50LCBhbmQgY2hlY2sgZm9yIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKKyAgY2xpZW50Mi5yZXNldCgpOworICBjaGVja0Nsb3NlRXZlbnRzKGxvZywgY2xpZW50MklkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RPbmV3YXlDYWxsKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBNYWtlIGEgb25ld2F5IGNhbGwKKyAgLy8gSXQgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseSwgZXZlbiB0aG91Z2ggdGhlIHNlcnZlcidzIGhhbmRsZXIKKyAgLy8gd29uJ3QgcmV0dXJuIHJpZ2h0IGF3YXkKKyAgc3RhdGUtPmdldEhhbmRsZXIoKS0+cHJlcGFyZVRyaWdnZXJlZENhbGwoKTsKKyAgY2xpZW50LT5vbmV3YXlXYWl0KCk7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLm9uZXdheVdhaXQiOworICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBFdmVudExvZzo6RVRfQ0FMTF9PTkVXQVlfV0FJVCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFRyaWdnZXIgdGhlIGhhbmRsZXIgdG8gcmV0dXJuCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnRyaWdnZXJQZW5kaW5nQ2FsbHMoKTsKKworICAvLyBUaGUgaGFuZGxlciB3aWxsIGxvZyBhbiBFVF9XQUlUX1JFVFVSTiBldmVudCB3aGVuIGl0IHdha2VzIHVwCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCBldmVudC50eXBlKTsKKworICAvLyBOb3cgd2Ugc2hvdWxkIHNlZSB0aGUgYXN5bmMgY29tcGxldGUgZXZlbnQsIHRoZW4gY2FsbCBmaW5pc2hlZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9BU1lOQ19DT01QTEVURSwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gRGVzdHJveSB0aGUgY2xpZW50LCBhbmQgY2hlY2sgZm9yIGNvbm5lY3Rpb24gY2xvc2VkIGV2ZW50cworICBjbGllbnQucmVzZXQoKTsKKyAgY2hlY2tDbG9zZUV2ZW50cyhsb2csIGNvbm5JZCk7CisKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3ZvaWQgdGVzdEV4cGVjdGVkRXJyb3IoKSB7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisKKyAgLy8gQ3JlYXRlIGEgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgdGhlIGV4Y2VwdGlvbldhaXQoKSBjYWxsCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnByZXBhcmVUcmlnZ2VyZWRDYWxsKCk7CisgIHN0cmluZyBtZXNzYWdlID0gInRlc3QgMTIzNCB0ZXN0IjsKKyAgY2xpZW50LT5zZW5kX2V4Y2VwdGlvbldhaXQobWVzc2FnZSk7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLmV4Y2VwdGlvbldhaXQiOworICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBFdmVudExvZzo6RVRfQ0FMTF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFRyaWdnZXIgdGhlIGhhbmRsZXIgdG8gcmV0dXJuCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnRyaWdnZXJQZW5kaW5nQ2FsbHMoKTsKKworICAvLyBUaGUgaGFuZGxlciB3aWxsIGxvZyBhbiBFVF9XQUlUX1JFVFVSTiBldmVudCB3aGVuIGl0IHdha2VzIHVwCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCBldmVudC50eXBlKTsKKworICAvLyBOb3cgcmVjZWl2ZSB0aGUgcmVzcG9uc2UKKyAgdHJ5IHsKKyAgICBjbGllbnQtPnJlY3ZfZXhjZXB0aW9uV2FpdCgpOworICAgIEJPT1NUX0ZBSUwoImV4cGVjdGVkIE15RXJyb3IgdG8gYmUgdGhyb3duIik7CisgIH0gY2F0Y2ggKGNvbnN0IE15RXJyb3ImIGUpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlLCBlLm1lc3NhZ2UpOworICAgIC8vIENoZWNrIGlmIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkgaXMgaGFuZGxlZCBwcm9wZXJseQorICAgIHNpemVfdCBtZXNzYWdlX3BvcyA9IHN0cmluZyhlLndoYXQoKSkuZmluZCgiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogTXlFcnJvciIpOworICAgIEJPT1NUX0NIRUNLX05FKG1lc3NhZ2VfcG9zLCBzdHJpbmc6Om5wb3MpOworICB9CisKKyAgLy8gTm93IHdlIHNob3VsZCBzZWUgdGhlIGV2ZW50cyBmb3IgYSBub3JtYWwgY2FsbCBmaW5pc2gKKyAgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIGNhbGxJZCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIERlc3Ryb3kgdGhlIGNsaWVudCwgYW5kIGNoZWNrIGZvciBjb25uZWN0aW9uIGNsb3NlZCBldmVudHMKKyAgY2xpZW50LnJlc2V0KCk7CisgIGNoZWNrQ2xvc2VFdmVudHMobG9nLCBjb25uSWQpOworCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RVbmV4cGVjdGVkRXJyb3IoKSB7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisKKyAgLy8gQ3JlYXRlIGEgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgdGhlIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCkgY2FsbAorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT5wcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpOworICBzdHJpbmcgbWVzc2FnZSA9ICIxMjM0IHRlc3QgNTY3OCI7CisgIGNsaWVudC0+c2VuZF91bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChtZXNzYWdlKTsKKyAgc3RyaW5nIGNhbGxOYW1lID0gIlBhcmVudFNlcnZpY2UudW5leHBlY3RlZEV4Y2VwdGlvbldhaXQiOworICB1aW50MzJfdCBjYWxsSWQKKyAgICAgID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFRyaWdnZXIgdGhlIGhhbmRsZXIgdG8gcmV0dXJuCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnRyaWdnZXJQZW5kaW5nQ2FsbHMoKTsKKworICAvLyBUaGUgaGFuZGxlciB3aWxsIGxvZyBhbiBFVF9XQUlUX1JFVFVSTiBldmVudCB3aGVuIGl0IHdha2VzIHVwCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCBldmVudC50eXBlKTsKKworICAvLyBOb3cgcmVjZWl2ZSB0aGUgcmVzcG9uc2UKKyAgdHJ5IHsKKyAgICBjbGllbnQtPnJlY3ZfdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoKTsKKyAgICBCT09TVF9GQUlMKCJleHBlY3RlZCBUQXBwbGljYXRpb25FcnJvciB0byBiZSB0aHJvd24iKTsKKyAgfSBjYXRjaCAoY29uc3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJikgeworICB9CisKKyAgLy8gTm93IHdlIHNob3VsZCBzZWUgYSBoYW5kbGVyIGVycm9yIGV2ZW50CisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0hBTkRMRVJfRVJST1IsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIHByZS13cml0ZSBhbmQgcG9zdC13cml0ZSBldmVudHMgYXJlbid0IGdlbmVyYXRlZCBhZnRlciBhIGhhbmRsZXIgZXJyb3IKKyAgLy8gKEV2ZW4gZm9yIG5vbi1vbmV3YXkgY2FsbHMgd2hlcmUgYSByZXNwb25zZSBpcyB3cml0dGVuLikKKyAgLy8KKyAgLy8gQSBjYWxsIGZpbmlzaGVkIGV2ZW50IGlzIGxvZ2dlZCB3aGVuIHRoZSBjYWxsIGNvbnRleHQgaXMgZGVzdHJveWVkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIERlc3Ryb3kgdGhlIGNsaWVudCwgYW5kIGNoZWNrIGZvciBjb25uZWN0aW9uIGNsb3NlZCBldmVudHMKKyAgY2xpZW50LnJlc2V0KCk7CisgIGNoZWNrQ2xvc2VFdmVudHMobG9nLCBjb25uSWQpOworCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKworLy8gTWFjcm8gdG8gZGVmaW5lIHNpbXBsZSB0ZXN0cyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYWxsIHNlcnZlciB0eXBlcworI2RlZmluZSBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfYmFzaWNTZXJ2aWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RCYXNpY1NlcnZpY2U8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfaW5oZXJpdGVkU2VydmljZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RJbmhlcml0ZWRTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfb25ld2F5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RPbmV3YXlDYWxsPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfZXhjZXB0aW9uKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RFeHBlY3RlZEVycm9yPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfdW5leHBlY3RlZEV4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RVbmV4cGVjdGVkRXJyb3I8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIFRlc3RzIHRoYXQgcmVxdWlyZSB0aGUgc2VydmVyIHRvIHByb2Nlc3MgbXVsdGlwbGUgY29ubmVjdGlvbnMgY29uY3VycmVudGx5CisvLyAoaS5lLiwgbm90IFRTaW1wbGVTZXJ2ZXIpCisjZGVmaW5lIERFRklORV9DT05DVVJSRU5UX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19zZXBhcmF0ZUNvbm5lY3Rpb25zKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdFNlcGFyYXRlQ29ubmVjdGlvbnM8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gVGhlIHRlc3RFdmVudFNlcXVlbmNpbmcoKSB0ZXN0IG1hbnVhbGx5IGdlbmVyYXRlcyBhIHJlcXVlc3QgZm9yIHRoZSBzZXJ2ZXIsCisvLyBhbmQgZG9lc24ndCB3b3JrIHdpdGggVEZyYW1lZFRyYW5zcG9ydC4gIFRoZXJlZm9yZSB3ZSBjYW4ndCB0ZXN0IGl0IHdpdGgKKy8vIFROb25ibG9ja2luZ1NlcnZlci4KKyNkZWZpbmUgREVGSU5FX05PRlJBTUVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V2ZW50U2VxdWVuY2luZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXZlbnRTZXF1ZW5jaW5nPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIERFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9TSU1QTEVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9DT05DVVJSRU5UX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKQorCisjZGVmaW5lIERFRklORV9BTExfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9TSU1QTEVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9DT05DVVJSRU5UX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9OT0ZSQU1FX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpCisKK0RFRklORV9BTExfU0VSVkVSX1RFU1RTKFRUaHJlYWRlZFNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoVFRocmVhZGVkU2VydmVyLCBVbnRlbXBsYXRlZCkKK0RFRklORV9BTExfU0VSVkVSX1RFU1RTKFRUaHJlYWRQb29sU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhUVGhyZWFkUG9vbFNlcnZlciwgVW50ZW1wbGF0ZWQpCisKK0RFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoVE5vbmJsb2NraW5nU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFROb25ibG9ja2luZ1NlcnZlciwgVW50ZW1wbGF0ZWQpCitERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFROb25ibG9ja2luZ1NlcnZlck5vVGhyZWFkcywgVGVtcGxhdGVkKQorREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXJOb1RocmVhZHMsIFVudGVtcGxhdGVkKQorCitERUZJTkVfU0lNUExFX1RFU1RTKFRTaW1wbGVTZXJ2ZXIsIFRlbXBsYXRlZCkKK0RFRklORV9TSU1QTEVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVW50ZW1wbGF0ZWQpCitERUZJTkVfTk9GUkFNRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfTk9GUkFNRV9URVNUUyhUU2ltcGxlU2VydmVyLCBVbnRlbXBsYXRlZCkKKworLy8gVE9ETzogV2Ugc2hvdWxkIHRlc3QgVEV2ZW50U2VydmVyIGluIHRoZSBmdXR1cmUuCisvLyBGb3Igbm93LCBpdCBpcyBrbm93biBub3QgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyLgorI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCis6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgOjpib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMWVjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9UQ0NfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfVENDXyAxCisKKyNpbmNsdWRlICJTZXJ2ZXJUaHJlYWQuaCIKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CisKK3ZvaWQgU2VydmVyVGhyZWFkOjpzdGFydCgpIHsKKyAgYXNzZXJ0KCFydW5uaW5nXyk7CisgIHJ1bm5pbmdfID0gdHJ1ZTsKKworICBoZWxwZXJfLnJlc2V0KG5ldyBIZWxwZXIodGhpcykpOworCisgIC8vIFN0YXJ0IHRoZSBvdGhlciB0aHJlYWQKKyAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5OworICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKyAgdGhyZWFkXyA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKGhlbHBlcl8pOworCisgIHRocmVhZF8tPnN0YXJ0KCk7CisKKyAgLy8gV2FpdCBvbiB0aGUgb3RoZXIgdGhyZWFkIHRvIHRlbGwgdXMgdGhhdCBpdCBoYXMgc3VjY2Vzc2Z1bGx5CisgIC8vIGJvdW5kIHRvIHRoZSBwb3J0IGFuZCBzdGFydGVkIGxpc3RlbmluZyAob3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzKS4KKyAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgd2hpbGUgKCFzZXJ2aW5nXyAmJiAhZXJyb3JfKSB7CisgICAgc2VydmVyTW9uaXRvcl8ud2FpdEZvcmV2ZXIoKTsKKyAgfQorCisgIGlmIChlcnJvcl8pIHsKKyAgICB0aHJvdyB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBiaW5kIG9uIHNlcnZlciBzb2NrZXQiKTsKKyAgfQorfQorCit2b2lkIFNlcnZlclRocmVhZDo6c3RvcCgpIHsKKyAgaWYgKCFydW5uaW5nXykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRlbGwgdGhlIHNlcnZlciB0byBzdG9wCisgIHNlcnZlcl8tPnN0b3AoKTsKKyAgcnVubmluZ18gPSBmYWxzZTsKKworICAvLyBXYWl0IGZvciB0aGUgc2VydmVyIHRocmVhZCB0byBleGl0CisgIC8vCisgIC8vIE5vdGU6IHRoaXMgb25seSB3b3JrcyBpZiBhbGwgY2xpZW50IGNvbm5lY3Rpb25zIGhhdmUgY2xvc2VkLiAgVGhlIHNlcnZlcnMKKyAgLy8gZ2VuZXJhbGx5IHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gYmUgY2xvc2VkIGJlZm9yZSBleGl0aW5nOyB0aGVyZSBjdXJyZW50bHkKKyAgLy8gaXNuJ3QgYSB3YXkgdG8gdGVsbCB0aGVtIHRvIGp1c3QgZXhpdCBub3csIGFuZCBzaHV0IGRvd24gZXhpc3RpbmcKKyAgLy8gY29ubmVjdGlvbnMuCisgIHRocmVhZF8tPmpvaW4oKTsKK30KKwordm9pZCBTZXJ2ZXJUaHJlYWQ6OnJ1bigpIHsKKyAgLyoKKyAgICogVHJ5IGJpbmRpbmcgdG8gc2V2ZXJhbCBwb3J0cywgaW4gY2FzZSB0aGUgb25lIHdlIHdhbnQgaXMgYWxyZWFkeSBpbiB1c2UuCisgICAqLworICBwb3J0XyA9IDEyMzQ1OworICB1bnNpZ25lZCBpbnQgbWF4UmV0cmllcyA9IDEwOworICBmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IG1heFJldHJpZXM7ICsrbikgeworICAgIC8vIENyZWF0ZSB0aGUgc2VydmVyCisgICAgc2VydmVyXyA9IHNlcnZlclN0YXRlXy0+Y3JlYXRlU2VydmVyKHBvcnRfKTsKKyAgICAvLyBJbnN0YWxsIG91ciBoZWxwZXIgYXMgdGhlIHNlcnZlciBldmVudCBoYW5kbGVyLCBzbyB0aGF0IG91cgorICAgIC8vIHByZVNlcnZlKCkgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2Ugd2UndmUgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvCisgICAgLy8gdGhlIHBvcnQgYW5kIGFyZSBhYm91dCB0byBzdGFydCBsaXN0ZW5pbmcuCisgICAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKGhlbHBlcl8pOworCisgICAgdHJ5IHsKKyAgICAgIC8vIFRyeSB0byBzZXJ2ZSByZXF1ZXN0cworICAgICAgc2VydmVyXy0+c2VydmUoKTsKKyAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgeworICAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIHRocm93cyBhIGdlbmVyaWMgVEV4Y2VwdGlvbiBpZiBpdCBmYWlscyB0byBiaW5kLgorICAgICAgLy8gSWYgd2UgZ2V0IGEgVEV4Y2VwdGlvbiwgd2UnbGwgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoZSBiaW5kIGZhaWxlZC4KKyAgICAgICsrcG9ydF87CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBTZXJpb3VzbHk/ICBzZXJ2ZSgpIGlzIHByZXR0eSBsYW1lLiAgSWYgaXQgZmFpbHMgdG8gc3RhcnQgc2VydmluZyBpdAorICAgIC8vIGp1c3QgcmV0dXJucyByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICAgLy8KKyAgICAvLyBXZSBoYXZlIHRvIHVzZSBvdXIgcHJlU2VydmUoKSBob29rIHRvIHRlbGwgaWYgc2VydmUoKSBzdWNjZXNzZnVsbHkKKyAgICAvLyBzdGFydGVkIHNlcnZpbmcgYW5kIGlzIHJldHVybmluZyBiZWNhdXNlIHN0b3AoKSBpcyBjYWxsZWQsIG9yIGlmIGl0IGp1c3QKKyAgICAvLyBmYWlsZWQgdG8gc3RhcnQgc2VydmluZyBpbiB0aGUgZmlyc3QgcGxhY2UuCisgICAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgICBpZiAoc2VydmluZ18pIHsKKyAgICAgIC8vIE9oIGdvb2QsIHdlIHN0YXJ0ZWQgc2VydmluZyBhbmQgYXJlIGV4aXRpbmcgYmVjYXVzZQorICAgICAgLy8gd2UncmUgdHJ5aW5nIHRvIHN0b3AuCisgICAgICBzZXJ2aW5nXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBuZXZlciBzdGFydGVkIHNlcnZpbmcsIHByb2JhYmx5IGJlY2F1c2Ugd2UgZmFpbGVkIHRvIGJpbmQgdG8gdGhlCisgICAgICAvLyBwb3J0LiAgSW5jcmVtZW50IHRoZSBwb3J0IG51bWJlciBhbmQgdHJ5IGFnYWluLgorICAgICAgKytwb3J0XzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorCisgIC8vIFdlIGZhaWxlZCB0byBiaW5kIG9uIGFueSBwb3J0LgorICBjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoc2VydmVyTW9uaXRvcl8pOworICBlcnJvcl8gPSB0cnVlOworICBzZXJ2ZXJNb25pdG9yXy5ub3RpZnkoKTsKK30KKwordm9pZCBTZXJ2ZXJUaHJlYWQ6OnByZVNlcnZlKCkgeworICAvLyBXZSBib3VuZCB0byB0aGUgcG9ydCBzdWNjZXNzZnVsbHksIGFuZCBhcmUgYWJvdXQgdG8gc3RhcnQgc2VydmluZyByZXF1ZXN0cworICBzZXJ2ZXJTdGF0ZV8tPmJpbmRTdWNjZXNzZnVsKHBvcnRfKTsKKworICAvLyBTZXQgdGhlIHJlYWwgc2VydmVyIGV2ZW50IGhhbmRsZXIgKHJlcGxhY2luZyBvdXJzZWxmKQorICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgID0gc2VydmVyU3RhdGVfLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50SGFuZGxlcik7CisKKyAgLy8gTm90aWZ5IHRoZSBtYWluIHRocmVhZCB0aGF0IHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc2VydmluZyByZXF1ZXN0cworICBjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoc2VydmVyTW9uaXRvcl8pOworICBzZXJ2aW5nXyA9IHRydWU7CisgIHNlcnZlck1vbml0b3JfLm5vdGlmeSgpOworCisgIC8vIEludm9rZSBwcmVTZXJ2ZSgpIG9uIHRoZSByZWFsIGV2ZW50IGhhbmRsZXIsIHNpbmNlIHdlIGF0ZQorICAvLyB0aGUgb3JpZ2luYWwgcHJlU2VydmUoKSBldmVudC4KKyAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcikgeworICAgIHNlcnZlckV2ZW50SGFuZGxlci0+cHJlU2VydmUoKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWUzMWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX0hfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJFdmVudExvZy5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRvIHRlbGwgU2VydmVyVGhyZWFkIGhvdyB0byBjcmVhdGUgdGhlIHNlcnZlcgorICovCitjbGFzcyBTZXJ2ZXJTdGF0ZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflNlcnZlclN0YXRlKCkge30KKworICAvKioKKyAgICogQ3JlYXRlIGEgc2VydmVyIHRvIGxpc3RlbiBvbiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgICAqCisgICAqIElmIHRoZSBzZXJ2ZXIgcmV0dXJuZWQgZmFpbHMgdG8gYmluZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgd2hlbiBzZXJ2ZSgpIGlzCisgICAqIGNhbGxlZCBvbiBpdCwgY3JlYXRlU2VydmVyKCkgbWF5IGJlIGNhbGxlZCBhZ2FpbiBvbiBhIGRpZmZlcmVudCBwb3J0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgPSAwOworCisgIC8qKgorICAgKiBHZXQgdGhlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgdG8gc2V0IG9uIHRoZSBzZXJ2ZXIuCisgICAqCisgICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIHNlcnZlciBzdWNjZXNzZnVsbHkgYmluZHMgYW5kIGlzIGFib3V0IHRvCisgICAqIHN0YXJ0IHNlcnZpbmcgdHJhZmZpYy4gIEl0IGlzIGludm9rZWQgZnJvbSB0aGUgc2VydmVyIHRocmVhZCwgcmF0aGVyIHRoYW4KKyAgICogdGhlIG1haW4gdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CisgIH0KKworICAvKioKKyAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBzZXJ2ZXIgdGhyZWFkIGFmdGVyIHNlcnZlciBiaW5kaW5nIHN1Y2NlZWRzLgorICAgKgorICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHdpc2ggdG8gcmVjb3JkIHRoZSBmaW5hbAorICAgKiBwb3J0IHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBzZXJ2ZXIuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgLypwb3J0Ki8pIHt9Cit9OworCisvKioKKyAqIFNlcnZlclRocmVhZCBzdGFydHMgYSB0aHJpZnQgc2VydmVyIHJ1bm5pbmcgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgKi8KK2NsYXNzIFNlcnZlclRocmVhZCB7CitwdWJsaWM6CisgIFNlcnZlclRocmVhZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+JiBzdGF0ZSwgYm9vbCBhdXRvU3RhcnQpCisgICAgOiBwb3J0XygwKSwKKyAgICAgIHJ1bm5pbmdfKGZhbHNlKSwKKyAgICAgIHNlcnZpbmdfKGZhbHNlKSwKKyAgICAgIGVycm9yXyhmYWxzZSksCisgICAgICBzZXJ2ZXJTdGF0ZV8oc3RhdGUpIHsKKyAgICBpZiAoYXV0b1N0YXJ0KSB7CisgICAgICBzdGFydCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc3RhcnQoKTsKKyAgdm9pZCBzdG9wKCk7CisKKyAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CisKKyAgflNlcnZlclRocmVhZCgpIHsKKyAgICBpZiAocnVubmluZ18pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0b3AoKTsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJlcnJvciBzaHV0dGluZyBkb3duIHNlcnZlciIpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIEFubm95aW5nLiAgdGhyaWZ0IGZvcmNlcyB1cyB0byB1c2Ugc2hhcmVkX3B0ciwgc28gd2UgaGF2ZSB0byB1c2UKKyAgLy8gYSBoZWxwZXIgY2xhc3MgdGhhdCB3ZSBjYW4gYWxsb2NhdGUgb24gdGhlIGhlYXAgYW5kIGdpdmUgdG8gdGhyaWZ0LgorICAvLyBJdCB3b3VsZCBiZSBzaW1wbGVyIGlmIHdlIGNvdWxkIGp1c3QgbWFrZSBSdW5uYWJsZSBhbmQgVFNlcnZlckV2ZW50SGFuZGxlcgorICAvLyBwcml2YXRlIGJhc2UgY2xhc3NlcyBvZiBTZXJ2ZXJUaHJlYWQuCisgIGNsYXNzIEhlbHBlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUsIHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICBwdWJsaWM6CisgICAgSGVscGVyKFNlcnZlclRocmVhZCogc2VydmVyVGhyZWFkKSA6IHNlcnZlclRocmVhZF8oc2VydmVyVGhyZWFkKSB7fQorCisgICAgdm9pZCBydW4oKSB7IHNlcnZlclRocmVhZF8tPnJ1bigpOyB9CisKKyAgICB2b2lkIHByZVNlcnZlKCkgeyBzZXJ2ZXJUaHJlYWRfLT5wcmVTZXJ2ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBTZXJ2ZXJUaHJlYWQqIHNlcnZlclRocmVhZF87CisgIH07CisKKyAgdm9pZCBydW4oKTsKKyAgdm9pZCBwcmVTZXJ2ZSgpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CisKKyAgdWludDE2X3QgcG9ydF87CisgIGJvb2wgcnVubmluZ187CisgIGJvb2wgc2VydmluZ187CisgIGJvb2wgZXJyb3JfOworICBjb25jdXJyZW5jeTo6TW9uaXRvciBzZXJ2ZXJNb25pdG9yXzsKKworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+IHNlcnZlclN0YXRlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9wcm9jLnRocmlmdCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvcHJvYy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYzVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvcHJvYy50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorbmFtZXNwYWNlIGNwcCBhcGFjaGUudGhyaWZ0LnRlc3QKKworZXhjZXB0aW9uIE15RXJyb3IgeworICAxOiBzdHJpbmcgbWVzc2FnZQorfQorCitzZXJ2aWNlIFBhcmVudFNlcnZpY2UgeworICBpMzIgaW5jcmVtZW50R2VuZXJhdGlvbigpCisgIGkzMiBnZXRHZW5lcmF0aW9uKCkKKyAgdm9pZCBhZGRTdHJpbmcoMTogc3RyaW5nIHMpCisgIGxpc3Q8c3RyaW5nPiBnZXRTdHJpbmdzKCkKKworICBiaW5hcnkgZ2V0RGF0YVdhaXQoMTogaTMyIGxlbmd0aCkKKyAgb25ld2F5IHZvaWQgb25ld2F5V2FpdCgpCisgIHZvaWQgZXhjZXB0aW9uV2FpdCgxOiBzdHJpbmcgbWVzc2FnZSkgdGhyb3dzICgyOiBNeUVycm9yIGVycm9yKQorICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KDE6IHN0cmluZyBtZXNzYWdlKQorfQorCitzZXJ2aWNlIENoaWxkU2VydmljZSBleHRlbmRzIFBhcmVudFNlcnZpY2UgeworICBpMzIgc2V0VmFsdWUoMTogaTMyIHZhbHVlKQorICBpMzIgZ2V0VmFsdWUoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzQxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldChDTUFLRV9BVVRPTU9DIE9OKQorZmluZF9wYWNrYWdlKFF0NSBSRVFVSVJFRCBDT01QT05FTlRTIFRlc3QgTmV0d29yaykKK3NldChUUVRjcFNlcnZlclRlc3RfUXQ1X1NPVVJDRVMKKyAgICBUUVRjcFNlcnZlclRlc3QuY3BwCispCithZGRfZXhlY3V0YWJsZShUUVRjcFNlcnZlclRlc3RfUXQ1ICR7VFFUY3BTZXJ2ZXJUZXN0X1F0NV9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUUVRjcFNlcnZlclRlc3RfUXQ1IHRlc3RnZW5jcHBfY29iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdF9RdDUgdGhyaWZ0cXQ1KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdF9RdDUgdGhyaWZ0KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRRVGNwU2VydmVyVGVzdF9RdDUgUXQ1OjpUZXN0IFF0NTo6TmV0d29yaykKKworYWRkX3Rlc3QoTkFNRSBUUVRjcFNlcnZlclRlc3RfUXQ1IENPTU1BTkQgVFFUY3BTZXJ2ZXJUZXN0X1F0NSkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQwYzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFFUY3BTZXJ2ZXJUZXN0CisjaW5jbHVkZSA8UVRlc3Q+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxRVGNwU2VydmVyPgorI2luY2x1ZGUgPFFUY3BTb2NrZXQ+CisjaW5jbHVkZSA8UUhvc3RBZGRyZXNzPgorI2luY2x1ZGUgPFFUaHJlYWQ+CisKKyNpZm5kZWYgUV9NT0NfUlVOCisgICNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCIKKyAgI2luY2x1ZGUgInRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgiCisKKyAgI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworc3RydWN0IEFzeW5jSGFuZGxlciA6IHB1YmxpYyB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ29iU3ZJZiB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworICB2aXJ0dWFsIHZvaWQgYWRkU3RyaW5nKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgc3RyaW5ncy5wdXNoX2JhY2socyk7CisgICAgY29iKCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIGdldFN0cmluZ3Moc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYikgeworICAgIGNvYihzdHJpbmdzKTsKKyAgfQorCisgIC8vIE92ZXJyaWRlcyBub3QgdXNlZCBpbiB0aGlzIHRlc3QKKyAgdmlydHVhbCB2b2lkIGluY3JlbWVudEdlbmVyYXRpb24oc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIHt9CisgIHZpcnR1YWwgdm9pZCBnZXRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBsZW5ndGgpIHt9CisgIHZpcnR1YWwgdm9pZCBvbmV3YXlXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IpIHt9CisgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25XYWl0KAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLywKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQorICB2aXJ0dWFsIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9Cit9OworCitjbGFzcyBUUVRjcFNlcnZlclRlc3QgOiBwdWJsaWMgUU9iamVjdCB7CisgIFFfT0JKRUNUCisKK3ByaXZhdGUgc2xvdHM6CisgIHZvaWQgaW5pdFRlc3RDYXNlKCk7CisgIHZvaWQgY2xlYW51cFRlc3RDYXNlKCk7CisgIHZvaWQgdGVzdF9jb21tdW5pY2F0ZSgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8UVRocmVhZD4gc2VydmVyVGhyZWFkOworICBzdGQ6OnNoYXJlZF9wdHI8YXN5bmM6OlRRVGNwU2VydmVyPiBzZXJ2ZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7Cit9OworCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6aW5pdFRlc3RDYXNlKCkgeworICAvLyBzZXR1cCBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlclNvY2tldCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UVRjcFNlcnZlcj4oKTsKKyAgc2VydmVyLnJlc2V0KG5ldyBhc3luYzo6VFFUY3BTZXJ2ZXIoc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRlc3Q6OlBhcmVudFNlcnZpY2VBc3luY1Byb2Nlc3Nvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSkpOworICBRVkVSSUZZKHNlcnZlclNvY2tldC0+bGlzdGVuKFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0KSk7CisgIGludCBwb3J0ID0gc2VydmVyU29ja2V0LT5zZXJ2ZXJQb3J0KCk7CisgIFFWRVJJRlkocG9ydCA+IDApOworCisgIC8vc2V0dXAgc2VydmVyIHRocmVhZCBhbmQgbW92ZSBzZXJ2ZXIgdG8gaXQKKyAgc2VydmVyVGhyZWFkLnJlc2V0KG5ldyBRVGhyZWFkKCkpOworICBzZXJ2ZXJTb2NrZXQtPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXItPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisKKyAgLy8gc2V0dXAgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU29ja2V0PiBzb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTb2NrZXQ+KCk7CisgIGNsaWVudC5yZXNldChuZXcgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudChzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRRSU9EZXZpY2VUcmFuc3BvcnQ+KHNvY2tldCkpKSk7CisgIHNvY2tldC0+Y29ubmVjdFRvSG9zdChRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCwgcG9ydCk7CisgIFFWRVJJRlkoc29ja2V0LT53YWl0Rm9yQ29ubmVjdGVkKCkpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6Y2xlYW51cFRlc3RDYXNlKCkgeworICAvL2ZpcnN0LCBzdG9wIHRoZSB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIHNlcnZlcgorICBzZXJ2ZXJUaHJlYWQtPnF1aXQoKTsKKyAgc2VydmVyVGhyZWFkLT53YWl0KCk7CisgIC8vIG5vdywgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIHNlcnZlcgorICBzZXJ2ZXIucmVzZXQoKTsKKyAgLy8gZGVsZXRlIHRocmVhZCBub3cKKyAgc2VydmVyVGhyZWFkLnJlc2V0KCk7CisKKyAgLy8gY2xlYW51cCBjbGllbnQKKyAgY2xpZW50LnJlc2V0KCk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgeworICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJiYXIiKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwbHk7CisgIGNsaWVudC0+Z2V0U3RyaW5ncyhyZXBseSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMF0pLCBRU3RyaW5nKCJmb28iKSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMV0pLCBRU3RyaW5nKCJiYXIiKSk7Cit9CisKKworI2lmIChRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNSwgMCwgMCkpCitRVEVTVF9HVUlMRVNTX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKKyNlbHNlCisjdW5kZWYgUVRfR1VJX0xJQgorUVRFU1RfTUFJTihUUVRjcFNlcnZlclRlc3QpOworI2VuZGlmCisjaW5jbHVkZSAiVFFUY3BTZXJ2ZXJUZXN0Lm1vYyIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluIGIvbGliL2NwcC90aHJpZnQtbmIucGMuaW4Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhZTA1MTg4Li4yYzZhOTY5Ci0tLSBhL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCisrKyBiL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCkBAIC0yNyw0ICsyNyw0IEBACiBWZXJzaW9uOiBAVkVSU0lPTkAKIFJlcXVpcmVzOiB0aHJpZnQgPSBAVkVSU0lPTkAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0bmIKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9L3RocmlmdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluIGIvbGliL2NwcC90aHJpZnQtcXQucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU2MGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogVGhyaWZ0CitEZXNjcmlwdGlvbjogVGhyaWZ0IFF0IEFQSQorVmVyc2lvbjogQFZFUlNJT05ACitSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHF0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluIGIvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4YjE2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC1xdDUucGMuaW4KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBUaHJpZnQKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgUXQ1IEFQSQorVmVyc2lvbjogQFZFUlNJT05ACitSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHF0NQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LXoucGMuaW4gYi9saWIvY3BwL3RocmlmdC16LnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzJmNDZiZi4uNDY3ZDJlMQotLS0gYS9saWIvY3BwL3RocmlmdC16LnBjLmluCisrKyBiL2xpYi9jcHAvdGhyaWZ0LXoucGMuaW4KQEAgLTI3LDQgKzI3LDQgQEAKIFZlcnNpb246IEBWRVJTSU9OQAogUmVxdWlyZXM6IHRocmlmdCA9IEBWRVJTSU9OQAogTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnR6Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggN2FlYzA5Zi4uZDExZTZkYgotLS0gYS9saWIvY3BwL3RocmlmdC5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC5wYy5pbgpAQCAtMjYsNCArMjYsNCBAQAogRGVzY3JpcHRpb246IFRocmlmdCBDKysgQVBJCiBWZXJzaW9uOiBAVkVSU0lPTkAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC5zbG4gYi9saWIvY3BwL3RocmlmdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwZjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGhyaWZ0LnNsbgpAQCAtMCwwICsxLDYxIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJ0aHJpZnRuYiIsICJsaWJ0aHJpZnRuYi52Y3hwcm9qIiwgIntEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJ0aHJpZnQiLCAibGlidGhyaWZ0LnZjeHByb2oiLCAie0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7MjE1MEUzMzMtOEZEQy00MkEzLTk0NzQtMUEzOTU2RDQ2REU4fSIpID0gImRvYyIsICJkb2MiLCAiezAwNjk4NEUwLTdDQzEtNDdFMi1BQ0QyLUE0MEZFNEQzODY5M30iCisJUHJvamVjdFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwcmVQcm9qZWN0CisJCVJFQURNRS5tZCA9IFJFQURNRS5tZAorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Zy1tdHxXaW4zMiA9IERlYnVnLW10fFdpbjMyCisJCURlYnVnLW10fHg2NCA9IERlYnVnLW10fHg2NAorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2UtbXR8V2luMzIgPSBSZWxlYXNlLW10fFdpbjMyCisJCVJlbGVhc2UtbXR8eDY0ID0gUmVsZWFzZS1tdHx4NjQKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWctbXR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWctbXR8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWctbXR8V2luMzIuQnVpbGQuMCA9IERlYnVnLW10fFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fHg2NC5BY3RpdmVDZmcgPSBEZWJ1Zy1tdHx4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWctbXR8eDY0LkJ1aWxkLjAgPSBEZWJ1Zy1tdHx4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2UtbXR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZS1tdHxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlLW10fFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2UtbXR8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2UtbXR8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2UtbXR8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlLW10fHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Zy1tdHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Zy1tdHxXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Zy1tdHxXaW4zMi5CdWlsZC4wID0gRGVidWctbXR8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8eDY0LkFjdGl2ZUNmZyA9IERlYnVnLW10fHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Zy1tdHx4NjQuQnVpbGQuMCA9IERlYnVnLW10fHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZS1tdHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlLW10fFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UtbXR8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZS1tdHx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZS1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZS1tdHx4NjQuQnVpbGQuMCA9IFJlbGVhc2UtbXR8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9NYWtlZmlsZS5hbSBiL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KaW5kZXggODExMDMxOS4uNTZhOGIwZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNywxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUQ09ERT0gXAorU1VCRElSUyA9IC4gdGVzdC9NdWx0aXBsZXgKKworVEhSSUZUQ09ERSA9IFwKICAgICAgICAgICAgIHNyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBcCisgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEJhc2UuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcyBcCkBAIC0zMCwxOCArMzUsMjQgQEAKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UVHlwZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEZpZWxkLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFN0cnVjdC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MgXAogICAgICAgICAgICAgc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFNlcnZlci5jcyBcCisgICAgICAgICAgICBzcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNvY2tldC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBcCkBAIC00OSwyNiArNjAsNTYgQEAKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVFByb2Nlc3Nvci5jcyBcCisgICAgICAgICAgICBzcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBcCisgICAgICAgICAgICBzcmMvVEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCiAKLQotQ1NDPWdtY3MKLQotaWYgTkVUXzJfMAotTU9OT19ERUZJTkVTPS9kOk5FVF8yXzAKK2lmIE1PTk9fTUNTCitleHBvcnQgQ1NDID0gbWNzCitlbHNlCitleHBvcnQgQ1NDID0gZ21jcwogZW5kaWYKIAotYWxsLWxvY2FsOiBUaHJpZnQuZGxsCitpZiBORVRfMl8wCitleHBvcnQgQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCitlbmRpZgorCithbGwtbG9jYWw6IFRocmlmdC5kbGwgVGhyaWZ0LjQ1LmRsbAogCiBUaHJpZnQuZGxsOiAkKFRIUklGVENPREUpCi0JJChDU0MpICQoVEhSSUZUQ09ERSkgL291dDpUaHJpZnQuZGxsIC90YXJnZXQ6bGlicmFyeSAkKE1PTk9fREVGSU5FUykKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtdGFyZ2V0OmxpYnJhcnkgLXJlZmVyZW5jZTpTeXN0ZW0uV2ViICQoVEhSSUZUQ09ERSkKKworVGhyaWZ0LjQ1LmRsbDogJChUSFJJRlRDT0RFKQorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSBUaHJpZnQuZGxsCisJJChSTSkgVGhyaWZ0LmRsbCAgXAorCSQoUk0pIFRocmlmdC40NS5kbGwKIAogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICAkKFRIUklGVENPREUpIFwKLSAgICAgICAgICAgICBUaHJpZnRNU0J1aWxkVGFzayBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC5jc3Byb2ogXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuc2xuCisJJChUSFJJRlRDT0RFKSBcCisJVGhyaWZ0TVNCdWlsZFRhc2sgXAorCXNyYy9UaHJpZnQuY3Nwcm9qIFwKKwlzcmMvVGhyaWZ0LjQ1LmNzcHJvaiBcCisJc3JjL1RocmlmdC5zbG4gXAorCXNyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgXAorCXNyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIFwKKwlzcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcyBcCisJc3JjL1RBc3luY1Byb2Nlc3Nvci5jcyBcCisJdGVzdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJUkVBRE1FLm1kCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorCU1ha2VmaWxlIFwKKwlNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9SRUFETUUgYi9saWIvY3NoYXJwL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2NzaGFycC9SRUFETUUKcmVuYW1lIHRvIGxpYi9jc2hhcnAvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCA4NzY5ZjFhLi5jNzQxYjcyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTU2LDUgKzU2LDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC43LjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4qIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcwppbmRleCA3NWJiMzM5Li40ZTZkMzAxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCisrKyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKQEAgLTMzLDIxNCArMzMsMjE0IEBACiAKIG5hbWVzcGFjZSBUaHJpZnRNU0J1aWxkVGFzawogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gTVNCdWlsZCBUYXNrIHRvIGdlbmVyYXRlIGNzaGFycCBmcm9tIC50aHJpZnQgZmlsZXMsIGFuZCBjb21waWxlIHRoZSBjb2RlIGludG8gYSBsaWJyYXJ5OiBUaHJpZnRJbXBsLmRsbAotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRocmlmdEJ1aWxkIDogVGFzawotCXsKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGhyaWZ0LmV4ZSBjb21waWxlcgotCQkvLy8gPC9zdW1tYXJ5PgotCQlbUmVxdWlyZWRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0RXhlY3V0YWJsZQotCQl7Ci0JCQlnZXQ7Ci0JCQlzZXQ7Ci0JCX0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE1TQnVpbGQgVGFzayB0byBnZW5lcmF0ZSBjc2hhcnAgZnJvbSAudGhyaWZ0IGZpbGVzLCBhbmQgY29tcGlsZSB0aGUgY29kZSBpbnRvIGEgbGlicmFyeTogVGhyaWZ0SW1wbC5kbGwKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUaHJpZnRCdWlsZCA6IFRhc2sKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRocmlmdC5leGUgY29tcGlsZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEV4ZWN1dGFibGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIGZ1bGwgcGF0aCB0byBhIHRocmlmdC5kbGwgQyMgbGlicmFyeQotCQkvLy8gPC9zdW1tYXJ5PgotCQlbUmVxdWlyZWRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0TGlicmFyeQotCQl7Ci0JCQlnZXQ7Ci0JCQlzZXQ7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bGwgcGF0aCB0byBhIHRocmlmdC5kbGwgQyMgbGlicmFyeQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0TGlicmFyeQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBBIGRpcmVjb3RyeSBjb250YWluaW5nIC50aHJpZnQgZmlsZXMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdERlZmluaXRpb25EaXIKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgZGlyZWNvdHJ5IGNvbnRhaW5pbmcgLnRocmlmdCBmaWxlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0RGVmaW5pdGlvbkRpcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgbmFtZSBvZiB0aGUgYXV0by1nZW4gYW5kIGNvbXBpbGVkIHRocmlmdCBsaWJyYXJ5LiBJdCB3aWxsIHBsYWNlZCBpbgotCQkvLy8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIFRocmlmdExpYnJhcnkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIE91dHB1dE5hbWUKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBhdXRvLWdlbiBhbmQgY29tcGlsZWQgdGhyaWZ0IGxpYnJhcnkuIEl0IHdpbGwgcGxhY2VkIGluCisgICAgICAgIC8vLyB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgVGhyaWZ0TGlicmFyeQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gT3V0cHV0TmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlZCBUaHJpZnRMaWJyYXJ5LiBUaGlzIGFsbG93cyBtc2J1aWxkIHRhc2tzIHRvIHVzZSB0aGlzCi0JCS8vLyBvdXRwdXQgYXMgYSB2YXJpYWJsZSBmb3IgdXNlIGVsc2V3aGVyZS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJW091dHB1dF0KLQkJcHVibGljIElUYXNrSXRlbSBUaHJpZnRJbXBsZW1lbnRhdGlvbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdGhyaWZ0SW1wbDsgfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbXBpbGVkIFRocmlmdExpYnJhcnkuIFRoaXMgYWxsb3dzIG1zYnVpbGQgdGFza3MgdG8gdXNlIHRoaXMKKyAgICAgICAgLy8vIG91dHB1dCBhcyBhIHZhcmlhYmxlIGZvciB1c2UgZWxzZXdoZXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbT3V0cHV0XQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEltcGxlbWVudGF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aHJpZnRJbXBsOyB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIElUYXNrSXRlbSB0aHJpZnRJbXBsOwotCQlwcml2YXRlIGNvbnN0IHN0cmluZyBsYXN0Q29tcGlsYXRpb25OYW1lID0gIkxBU1RfQ09NUF9USU1FU1RBTVAiOworICAgICAgICBwcml2YXRlIElUYXNrSXRlbSB0aHJpZnRJbXBsOworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBsYXN0Q29tcGlsYXRpb25OYW1lID0gIkxBU1RfQ09NUF9USU1FU1RBTVAiOwogCi0JCS8vdXNlIHRoZSBNZXNzYWdlIEJ1aWxkIFRhc2sgdG8gd3JpdGUgc29tZXRoaW5nIHRvIGJ1aWxkIGxvZwotCQlwcml2YXRlIHZvaWQgTG9nTWVzc2FnZShzdHJpbmcgdGV4dCwgTWVzc2FnZUltcG9ydGFuY2UgaW1wb3J0YW5jZSkKLQkJewotCQkJTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKLQkJCW0uVGV4dCA9IHRleHQ7Ci0JCQltLkltcG9ydGFuY2UgPSBpbXBvcnRhbmNlLlRvU3RyaW5nKCk7Ci0JCQltLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKLQkJCW0uRXhlY3V0ZSgpOwotCQl9CisgICAgICAgIC8vdXNlIHRoZSBNZXNzYWdlIEJ1aWxkIFRhc2sgdG8gd3JpdGUgc29tZXRoaW5nIHRvIGJ1aWxkIGxvZworICAgICAgICBwcml2YXRlIHZvaWQgTG9nTWVzc2FnZShzdHJpbmcgdGV4dCwgTWVzc2FnZUltcG9ydGFuY2UgaW1wb3J0YW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG0uVGV4dCA9IHRleHQ7CisgICAgICAgICAgICBtLkltcG9ydGFuY2UgPSBpbXBvcnRhbmNlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBtLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKKyAgICAgICAgICAgIG0uRXhlY3V0ZSgpOworICAgICAgICB9CiAKLQkJLy9yZWN1cnNpdmVseSBmaW5kIC5jcyBmaWxlcyBpbiBzcmNEaXIsIHBhdGhzIHNob3VsZCBpbml0aWFsbHkgYmUgbm9uLW51bGwgYW5kIGVtcHR5Ci0JCXByaXZhdGUgdm9pZCBGaW5kU291cmNlc0hlbHBlcihzdHJpbmcgc3JjRGlyLCBMaXN0PHN0cmluZz4gcGF0aHMpCi0JCXsKLQkJCXN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKHNyY0RpciwgIiouY3MiKTsKLQkJCWZvcmVhY2ggKHN0cmluZyBmIGluIGZpbGVzKQotCQkJewotCQkJCXBhdGhzLkFkZChmKTsKLQkJCX0KLQkJCXN0cmluZ1tdIGRpcnMgPSBEaXJlY3RvcnkuR2V0RGlyZWN0b3JpZXMoc3JjRGlyKTsKLQkJCWZvcmVhY2ggKHN0cmluZyBkaXIgaW4gZGlycykKLQkJCXsKLQkJCQlGaW5kU291cmNlc0hlbHBlcihkaXIsIHBhdGhzKTsKLQkJCX0KLQkJfQorICAgICAgICAvL3JlY3Vyc2l2ZWx5IGZpbmQgLmNzIGZpbGVzIGluIHNyY0RpciwgcGF0aHMgc2hvdWxkIGluaXRpYWxseSBiZSBub24tbnVsbCBhbmQgZW1wdHkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZpbmRTb3VyY2VzSGVscGVyKHN0cmluZyBzcmNEaXIsIExpc3Q8c3RyaW5nPiBwYXRocykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nW10gZmlsZXMgPSBEaXJlY3RvcnkuR2V0RmlsZXMoc3JjRGlyLCAiKi5jcyIpOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGYgaW4gZmlsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aHMuQWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nW10gZGlycyA9IERpcmVjdG9yeS5HZXREaXJlY3RvcmllcyhzcmNEaXIpOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGRpciBpbiBkaXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbmRTb3VyY2VzSGVscGVyKGRpciwgcGF0aHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUXVvdGUgcGF0aHMgd2l0aCBzcGFjZXMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBzdHJpbmcgU2FmZVBhdGgoc3RyaW5nIHBhdGgpCi0JCXsKLQkJCWlmIChwYXRoLkNvbnRhaW5zKCcgJykgJiYgIXBhdGguU3RhcnRzV2l0aCgiXCIiKSkKLQkJCXsKLQkJCQlyZXR1cm4gIlwiIiArIHBhdGggKyAiXCIiOwotCQkJfQotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUXVvdGUgcGF0aHMgd2l0aCBzcGFjZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2FmZVBhdGgoc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXRoLkNvbnRhaW5zKCcgJykgJiYgIXBhdGguU3RhcnRzV2l0aCgiXCIiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIHBhdGggKyAiXCIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KIAotCQlwcml2YXRlIElUYXNrSXRlbVtdIEZpbmRTb3VyY2VzKHN0cmluZyBzcmNEaXIpCi0JCXsKLQkJCUxpc3Q8c3RyaW5nPiBmaWxlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKLQkJCUZpbmRTb3VyY2VzSGVscGVyKHNyY0RpciwgZmlsZXMpOwotCQkJSVRhc2tJdGVtW10gaXRlbXMgPSBuZXcgSVRhc2tJdGVtW2ZpbGVzLkNvdW50XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuTGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJaXRlbXNbaV0gPSBuZXcgVGFza0l0ZW0oZmlsZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIGl0ZW1zOwotCQl9CisgICAgICAgIHByaXZhdGUgSVRhc2tJdGVtW10gRmluZFNvdXJjZXMoc3RyaW5nIHNyY0RpcikKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IGZpbGVzID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICAgICAgRmluZFNvdXJjZXNIZWxwZXIoc3JjRGlyLCBmaWxlcyk7CisgICAgICAgICAgICBJVGFza0l0ZW1bXSBpdGVtcyA9IG5ldyBJVGFza0l0ZW1bZmlsZXMuQ291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVtc1tpXSA9IG5ldyBUYXNrSXRlbShmaWxlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0cmluZyBMYXN0V3JpdGVUaW1lKHN0cmluZyBkZWZEaXIpCi0JCXsKLQkJCXN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0Iik7Ci0JCQlEYXRlVGltZSBkID0gKG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcikpLkxhc3RXcml0ZVRpbWU7Ci0JCQlmb3JlYWNoKHN0cmluZyBmaWxlIGluIGZpbGVzKQotCQkJewotCQkJCUZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oZmlsZSk7Ci0JCQkJRGF0ZVRpbWUgY3VyciA9IGYuTGFzdFdyaXRlVGltZTsKLQkJCQlpZiAoRGF0ZVRpbWUuQ29tcGFyZShjdXJyLCBkKSA+IDApCi0JCQkJewotCQkJCQlkID0gY3VycjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZC5Ub0ZpbGVUaW1lVXRjKCkuVG9TdHJpbmcoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHN0cmluZyBMYXN0V3JpdGVUaW1lKHN0cmluZyBkZWZEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0Iik7CisgICAgICAgICAgICBEYXRlVGltZSBkID0gKG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcikpLkxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICBmb3JlYWNoKHN0cmluZyBmaWxlIGluIGZpbGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgICAgICAgICAgRGF0ZVRpbWUgY3VyciA9IGYuTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICBpZiAoRGF0ZVRpbWUuQ29tcGFyZShjdXJyLCBkKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkID0gY3VycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZC5Ub0ZpbGVUaW1lVXRjKCkuVG9TdHJpbmcoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIEV4ZWN1dGUoKQotCQl7Ci0JCQlzdHJpbmcgZGVmRGlyID0gU2FmZVBhdGgoVGhyaWZ0RGVmaW5pdGlvbkRpci5JdGVtU3BlYyk7Ci0JCQkvL2xvb2sgZm9yIGxhc3QgY29tcGlsYXRpb24gdGltZXN0YW1wCi0JCQlzdHJpbmcgbGFzdEJ1aWxkUGF0aCA9IFBhdGguQ29tYmluZShkZWZEaXIsIGxhc3RDb21waWxhdGlvbk5hbWUpOwotCQkJRGlyZWN0b3J5SW5mbyBkZWZEaXJJbmZvID0gbmV3IERpcmVjdG9yeUluZm8oZGVmRGlyKTsKLQkJCXN0cmluZyBsYXN0V3JpdGUgPSBMYXN0V3JpdGVUaW1lKGRlZkRpcik7Ci0JCQlpZiAoRmlsZS5FeGlzdHMobGFzdEJ1aWxkUGF0aCkpCi0JCQl7Ci0JCQkJc3RyaW5nIGxhc3RDb21wID0gRmlsZS5SZWFkQWxsVGV4dChsYXN0QnVpbGRQYXRoKTsKLQkJCQkvL2Rvbid0IHJlY29tcGlsZSBpZiB0aGUgdGhyaWZ0IGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0Q29tcAotCQkJCUZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYyk7Ci0JCQkJc3RyaW5nIHRocmlmdExpYlRpbWUgPSBmLkxhc3RXcml0ZVRpbWVVdGMuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7Ci0JCQkJaWYgKGxhc3RDb21wLkNvbXBhcmVUbyh0aHJpZnRMaWJUaW1lKSA8IDApCi0JCQkJewotCQkJCQkvL25ldyB0aHJpZnQgbGlicmFyeSwgZG8gYSBjb21waWxlCi0JCQkJCWxhc3RXcml0ZSA9IHRocmlmdExpYlRpbWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxhc3RDb21wID09IGxhc3RXcml0ZSB8fCAobGFzdENvbXAgPT0gdGhyaWZ0TGliVGltZSAmJiBsYXN0Q29tcC5Db21wYXJlVG8obGFzdFdyaXRlKSA+IDApKQotCQkJCXsKLQkJCQkJLy90aGUgLnRocmlmdCBkaXIgaGFzbid0IGJlZW4gd3JpdHRlbiB0byBzaW5jZSBsYXN0IGNvbXBpbGF0aW9uLCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCi0JCQkJCUxvZ01lc3NhZ2UoIlRocmlmdEltcGwgdXAtdG8tZGF0ZSIsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEV4ZWN1dGUoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgZGVmRGlyID0gU2FmZVBhdGgoVGhyaWZ0RGVmaW5pdGlvbkRpci5JdGVtU3BlYyk7CisgICAgICAgICAgICAvL2xvb2sgZm9yIGxhc3QgY29tcGlsYXRpb24gdGltZXN0YW1wCisgICAgICAgICAgICBzdHJpbmcgbGFzdEJ1aWxkUGF0aCA9IFBhdGguQ29tYmluZShkZWZEaXIsIGxhc3RDb21waWxhdGlvbk5hbWUpOworICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkZWZEaXJJbmZvID0gbmV3IERpcmVjdG9yeUluZm8oZGVmRGlyKTsKKyAgICAgICAgICAgIHN0cmluZyBsYXN0V3JpdGUgPSBMYXN0V3JpdGVUaW1lKGRlZkRpcik7CisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMobGFzdEJ1aWxkUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGxhc3RDb21wID0gRmlsZS5SZWFkQWxsVGV4dChsYXN0QnVpbGRQYXRoKTsKKyAgICAgICAgICAgICAgICAvL2Rvbid0IHJlY29tcGlsZSBpZiB0aGUgdGhyaWZ0IGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0Q29tcAorICAgICAgICAgICAgICAgIEZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYyk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRocmlmdExpYlRpbWUgPSBmLkxhc3RXcml0ZVRpbWVVdGMuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RDb21wLkNvbXBhcmVUbyh0aHJpZnRMaWJUaW1lKSA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL25ldyB0aHJpZnQgbGlicmFyeSwgZG8gYSBjb21waWxlCisgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZSA9IHRocmlmdExpYlRpbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhc3RDb21wID09IGxhc3RXcml0ZSB8fCAobGFzdENvbXAgPT0gdGhyaWZ0TGliVGltZSAmJiBsYXN0Q29tcC5Db21wYXJlVG8obGFzdFdyaXRlKSA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aGUgLnRocmlmdCBkaXIgaGFzbid0IGJlZW4gd3JpdHRlbiB0byBzaW5jZSBsYXN0IGNvbXBpbGF0aW9uLCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoIlRocmlmdEltcGwgdXAtdG8tZGF0ZSIsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCS8vZmluZCB0aGUgZGlyZWN0b3J5IG9mIHRoZSB0aHJpZnRsaWJyYXJ5ICh0aGF0J3Mgd2hlcmUgb3V0cHV0IHdpbGwgZ28pCi0JCQlGaWxlSW5mbyB0aHJpZnRMaWJJbmZvID0gbmV3IEZpbGVJbmZvKFNhZmVQYXRoKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpKTsKLQkJCXN0cmluZyB0aHJpZnREaXIgPSB0aHJpZnRMaWJJbmZvLkRpcmVjdG9yeS5GdWxsTmFtZTsKKyAgICAgICAgICAgIC8vZmluZCB0aGUgZGlyZWN0b3J5IG9mIHRoZSB0aHJpZnRsaWJyYXJ5ICh0aGF0J3Mgd2hlcmUgb3V0cHV0IHdpbGwgZ28pCisgICAgICAgICAgICBGaWxlSW5mbyB0aHJpZnRMaWJJbmZvID0gbmV3IEZpbGVJbmZvKFNhZmVQYXRoKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpKTsKKyAgICAgICAgICAgIHN0cmluZyB0aHJpZnREaXIgPSB0aHJpZnRMaWJJbmZvLkRpcmVjdG9yeS5GdWxsTmFtZTsKIAotCQkJc3RyaW5nIGdlbkRpciA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIik7Ci0JCQlpZiAoRGlyZWN0b3J5LkV4aXN0cyhnZW5EaXIpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJRGlyZWN0b3J5LkRlbGV0ZShnZW5EaXIsIHRydWUpOwotCQkJCX0KLQkJCQljYXRjaCB7IC8qZWggaSB0cmllZCwganVzdCBvdmVyLXdyaXRlIG5vdyovfQotCQkJfQorICAgICAgICAgICAgc3RyaW5nIGdlbkRpciA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIik7CisgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhnZW5EaXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkRlbGV0ZShnZW5EaXIsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCB7IC8qZWggaSB0cmllZCwganVzdCBvdmVyLXdyaXRlIG5vdyovfQorICAgICAgICAgICAgfQogCi0JCQkvL3J1biB0aGUgdGhyaWZ0IGV4ZWN1dGFibGUgdG8gZ2VuZXJhdGUgQyMKLQkJCWZvcmVhY2ggKHN0cmluZyB0aHJpZnRGaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpKQotCQkJewotCQkJCUxvZ01lc3NhZ2UoIkdlbmVyYXRpbmcgY29kZSBmb3I6ICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOwotCQkJCVByb2Nlc3MgcCA9IG5ldyBQcm9jZXNzKCk7Ci0JCQkJcC5TdGFydEluZm8uRmlsZU5hbWUgPSBTYWZlUGF0aChUaHJpZnRFeGVjdXRhYmxlLkl0ZW1TcGVjKTsKLQkJCQlwLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSAiLS1nZW4gY3NoYXJwIC1vICIgKyBTYWZlUGF0aCh0aHJpZnREaXIpICsgIiAtciAiICsgdGhyaWZ0RmlsZTsKLQkJCQlwLlN0YXJ0SW5mby5Vc2VTaGVsbEV4ZWN1dGUgPSBmYWxzZTsKLQkJCQlwLlN0YXJ0SW5mby5DcmVhdGVOb1dpbmRvdyA9IHRydWU7Ci0JCQkJcC5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZE91dHB1dCA9IGZhbHNlOwotCQkJCXAuU3RhcnQoKTsKLQkJCQlwLldhaXRGb3JFeGl0KCk7Ci0JCQkJaWYgKHAuRXhpdENvZGUgIT0gMCkKLQkJCQl7Ci0JCQkJCUxvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChwLkV4aXRDb2RlICE9IDApCi0JCQkJewotCQkJCQlMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIC8vcnVuIHRoZSB0aHJpZnQgZXhlY3V0YWJsZSB0byBnZW5lcmF0ZSBDIworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHRocmlmdEZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSgiR2VuZXJhdGluZyBjb2RlIGZvcjogIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLk5vcm1hbCk7CisgICAgICAgICAgICAgICAgUHJvY2VzcyBwID0gbmV3IFByb2Nlc3MoKTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5GaWxlTmFtZSA9IFNhZmVQYXRoKFRocmlmdEV4ZWN1dGFibGUuSXRlbVNwZWMpOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLkFyZ3VtZW50cyA9ICItLWdlbiBjc2hhcnAgLW8gIiArIFNhZmVQYXRoKHRocmlmdERpcikgKyAiIC1yICIgKyB0aHJpZnRGaWxlOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLkNyZWF0ZU5vV2luZG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcC5TdGFydCgpOworICAgICAgICAgICAgICAgIHAuV2FpdEZvckV4aXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocC5FeGl0Q29kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSgidGhyaWZ0LmV4ZSBmYWlsZWQgdG8gY29tcGlsZSAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHAuRXhpdENvZGUgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlDc2MgY3NjID0gbmV3IENzYygpOwotCQkJY3NjLlRhcmdldFR5cGUgPSAibGlicmFyeSI7Ci0JCQljc2MuUmVmZXJlbmNlcyA9IG5ldyBJVGFza0l0ZW1bXSB7IG5ldyBUYXNrSXRlbShUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSB9OwotCQkJY3NjLkVtaXREZWJ1Z0luZm9ybWF0aW9uID0gdHJ1ZTsKLQkJCXN0cmluZyBvdXRwdXRQYXRoID0gUGF0aC5Db21iaW5lKHRocmlmdERpciwgT3V0cHV0TmFtZS5JdGVtU3BlYyk7Ci0JCQljc2MuT3V0cHV0QXNzZW1ibHkgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7Ci0JCQljc2MuU291cmNlcyA9IEZpbmRTb3VyY2VzKFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIikpOwotCQkJY3NjLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKLQkJCUxvZ01lc3NhZ2UoIkNvbXBpbGluZyBnZW5lcmF0ZWQgY3MuLi4iLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOwotCQkJaWYgKCFjc2MuRXhlY3V0ZSgpKQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KKyAgICAgICAgICAgIENzYyBjc2MgPSBuZXcgQ3NjKCk7CisgICAgICAgICAgICBjc2MuVGFyZ2V0VHlwZSA9ICJsaWJyYXJ5IjsKKyAgICAgICAgICAgIGNzYy5SZWZlcmVuY2VzID0gbmV3IElUYXNrSXRlbVtdIHsgbmV3IFRhc2tJdGVtKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpIH07CisgICAgICAgICAgICBjc2MuRW1pdERlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworICAgICAgICAgICAgc3RyaW5nIG91dHB1dFBhdGggPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCBPdXRwdXROYW1lLkl0ZW1TcGVjKTsKKyAgICAgICAgICAgIGNzYy5PdXRwdXRBc3NlbWJseSA9IG5ldyBUYXNrSXRlbShvdXRwdXRQYXRoKTsKKyAgICAgICAgICAgIGNzYy5Tb3VyY2VzID0gRmluZFNvdXJjZXMoUGF0aC5Db21iaW5lKHRocmlmdERpciwgImdlbi1jc2hhcnAiKSk7CisgICAgICAgICAgICBjc2MuQnVpbGRFbmdpbmUgPSB0aGlzLkJ1aWxkRW5naW5lOworICAgICAgICAgICAgTG9nTWVzc2FnZSgiQ29tcGlsaW5nIGdlbmVyYXRlZCBjcy4uLiIsIE1lc3NhZ2VJbXBvcnRhbmNlLk5vcm1hbCk7CisgICAgICAgICAgICBpZiAoIWNzYy5FeGVjdXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogCi0JCQkvL3dyaXRlIGZpbGUgdG8gZGVmRGlyIHRvIGluZGljYXRlIGEgYnVpbGQgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQKLQkJCUZpbGUuV3JpdGVBbGxUZXh0KGxhc3RCdWlsZFBhdGgsIGxhc3RXcml0ZSk7CisgICAgICAgICAgICAvL3dyaXRlIGZpbGUgdG8gZGVmRGlyIHRvIGluZGljYXRlIGEgYnVpbGQgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQKKyAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGxhc3RCdWlsZFBhdGgsIGxhc3RXcml0ZSk7CiAKLQkJCXRocmlmdEltcGwgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7CisgICAgICAgICAgICB0aHJpZnRJbXBsID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOwogCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2ogYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagppbmRleCAxNWNjYjdmLi5hMzE5ZGYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagorKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagpAQCAtMSw0ICsxLDUgQEAKLe+7vzwhLS0gCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNiw4ICsxNyw3IEBACiAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8UHJvcGVydHlHcm91cD4KICAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KICAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CkBAIC0zMCw2ICszMCwyNSBAQAogICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0TVNCdWlsZFRhc2s8L0Fzc2VtYmx5TmFtZT4KICAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgogICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CiAgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CkBAIC0zOSw2ICs1OCw3IEBACiAgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KICAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KQEAgLTQ3LDYgKzY3LDcgQEAKICAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkJ1aWxkLkZyYW1ld29yayIgLz4KQEAgLTY5LDYgKzkwLDIzIEBACiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyaWZ0QnVpbGQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CiAgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgogICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgogICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jc2hhcnAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg3MTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNiBAQAorIyMgQyMgQ29kaW5nIFN0YW5kYXJkcworCitQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtNU0ROIEMjIENvZGluZyBDb252ZW50aW9uc10oaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2ZmOTI2MDc0LmFzcHgpCisgKiBbQyMgQ29kaW5nIEd1aWRlbGluZXNdKGh0dHA6Ly9jc2hhcnBndWlkZWxpbmVzLmNvZGVwbGV4LmNvbS8pCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpAQCAtMCwwICsxLDk0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIHZhbHVlLXdpc2UgdGhlIHNhbWUuCisgICAgICAgIC8vLyBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9ucyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzIChJRW51bWVyYWJsZSBmaXJzdCwgSUVudW1lcmFibGUgc2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElFbnVtZXJhdG9yIGZpdGVyID0gZmlyc3QuR2V0RW51bWVyYXRvciAoKTsKKyAgICAgICAgICAgIElFbnVtZXJhdG9yIHNpdGVyID0gc2Vjb25kLkdldEVudW1lcmF0b3IgKCk7CisKKyAgICAgICAgICAgIGJvb2wgZm5leHQgPSBmaXRlci5Nb3ZlTmV4dCAoKTsKKyAgICAgICAgICAgIGJvb2wgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCAoKTsKKyAgICAgICAgICAgIHdoaWxlIChmbmV4dCAmJiBzbmV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBmZW51bSA9IGZpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgc2VudW0gPSBzaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIGlmIChmZW51bSAhPSBudWxsICYmIHNlbnVtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUVxdWFscyhmZW51bSwgc2VudW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVudW0gPT0gbnVsbCBeIHNlbnVtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFFcXVhbHMoZml0ZXIuQ3VycmVudCwgc2l0ZXIuQ3VycmVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbmV4dCA9PSBzbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgcmV0dXJucyBhIGhhc2hjb2RlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZW51bWVyYWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgR2V0SGFzaENvZGUgKElFbnVtZXJhYmxlIGVudW1lcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnVtZXJhYmxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBoYXNoY29kZSA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgaW50IG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlICgpIDogR2V0SGFzaENvZGUgKGVudW0yKTsKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeIChvYmpIYXNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCmluZGV4IGE5OTU3NjkuLmUyOTI3MWEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCkBAIC0yMSwxMjIgKzIxLDE0MCBAQAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKKyNpZiBTSUxWRVJMSUdIVAordXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjsKKyNlbmRpZgorCiBuYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCiB7Ci0JcHVibGljIGNsYXNzIFRIYXNoU2V0PFQ+IDogSUNvbGxlY3Rpb248VD4KLQl7Ci0jaWYgTkVUXzJfMAotCQlURGljdFNldDxUPiBzZXQgPSBuZXcgVERpY3RTZXQ8VD4oKTsKKyNpZiBTSUxWRVJMSUdIVAorICAgIFtEYXRhQ29udHJhY3RdCiAjZWxzZQotCQlIYXNoU2V0PFQ+IHNldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisgICAgW1NlcmlhbGl6YWJsZV0KICNlbmRpZgotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBzZXQuQ291bnQ7IH0KLQkJfQotCi0JCXB1YmxpYyBib29sIElzUmVhZE9ubHkKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGZhbHNlOyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBBZGQoVCBpdGVtKQotCQl7Ci0JCQlzZXQuQWRkKGl0ZW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgQ2xlYXIoKQotCQl7Ci0JCQlzZXQuQ2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKLQkJewotCQkJcmV0dXJuIHNldC5Db250YWlucyhpdGVtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQotCQl7Ci0JCQlzZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKLQkJewotCQkJcmV0dXJuIHNldC5HZXRFbnVtZXJhdG9yKCk7Ci0JCX0KLQotCQlJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKLQkJewotCQkJcmV0dXJuICgoSUVudW1lcmFibGU8VD4pc2V0KS5HZXRFbnVtZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQotCQl7Ci0JCQlyZXR1cm4gc2V0LlJlbW92ZShpdGVtKTsKLQkJfQotCi0jaWYgTkVUXzJfMAotCQlwcml2YXRlIGNsYXNzIFREaWN0U2V0PFY+IDogSUNvbGxlY3Rpb248Vj4KLQkJewotCQkJRGljdGlvbmFyeTxWLCBURGljdFNldDxWPj4gZGljdCA9IG5ldyBEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PigpOwotCi0JCQlwdWJsaWMgaW50IENvdW50Ci0JCQl7Ci0JCQkJZ2V0IHsgcmV0dXJuIGRpY3QuQ291bnQ7IH0KLQkJCX0KLQotCQkJcHVibGljIGJvb2wgSXNSZWFkT25seQotCQkJewotCQkJCWdldCB7IHJldHVybiBmYWxzZTsgfQotCQkJfQotCi0JCQlwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCi0JCQl7Ci0JCQkJcmV0dXJuICgoSUVudW1lcmFibGUpZGljdC5LZXlzKS5HZXRFbnVtZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCUlFbnVtZXJhdG9yPFY+IElFbnVtZXJhYmxlPFY+LkdldEVudW1lcmF0b3IoKQotCQkJewotCQkJCXJldHVybiBkaWN0LktleXMuR2V0RW51bWVyYXRvcigpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbCBBZGQoViBpdGVtKQotCQkJewotCQkJCWlmICghZGljdC5Db250YWluc0tleShpdGVtKSkKLQkJCQl7Ci0JCQkJCWRpY3RbaXRlbV0gPSB0aGlzOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXZvaWQgSUNvbGxlY3Rpb248Vj4uQWRkKFYgaXRlbSkKLQkJCXsKLQkJCQlBZGQoaXRlbSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIENsZWFyKCkKLQkJCXsKLQkJCQlkaWN0LkNsZWFyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sIENvbnRhaW5zKFYgaXRlbSkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5Db250YWluc0tleShpdGVtKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgQ29weVRvKFZbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCi0JCQl7Ci0JCQkJZGljdC5LZXlzLkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sIFJlbW92ZShWIGl0ZW0pCi0JCQl7Ci0JCQkJcmV0dXJuIGRpY3QuUmVtb3ZlKGl0ZW0pOwotCQkJfQotCQl9CisgICAgcHVibGljIGNsYXNzIFRIYXNoU2V0PFQ+IDogSUNvbGxlY3Rpb248VD4KKyAgICB7CisjaWYgTkVUXzJfMCB8fCBTSUxWRVJMSUdIVAorI2lmIFNJTFZFUkxJR0hUCisgICAgICAgIFtEYXRhTWVtYmVyXQogI2VuZGlmCi0JfQorICAgICAgICBURGljdFNldDxUPiBzZXQgPSBuZXcgVERpY3RTZXQ8VD4oKTsKKyNlbHNlCisgICAgICAgIEhhc2hTZXQ8VD4gc2V0ID0gbmV3IEhhc2hTZXQ8VD4oKTsKKyNlbmRpZgorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXQuQ291bnQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBBZGQoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQWRkKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5Db250YWlucyhpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoSUVudW1lcmFibGU8VD4pc2V0KS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgfQorCisjaWYgTkVUXzJfMCB8fCBTSUxWRVJMSUdIVAorI2lmIFNJTFZFUkxJR0hUCisgICAgICAgIFtEYXRhQ29udHJhY3RdCisjZW5kaWYKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBURGljdFNldDxWPiA6IElDb2xsZWN0aW9uPFY+CisgICAgICAgIHsKKyNpZiBTSUxWRVJMSUdIVAorICAgICAgICAgICAgW0RhdGFNZW1iZXJdCisjZW5kaWYKKyAgICAgICAgICAgIERpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+IGRpY3QgPSBuZXcgRGljdGlvbmFyeTxWLCBURGljdFNldDxWPj4oKTsKKworICAgICAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBkaWN0LkNvdW50OyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlKWRpY3QuS2V5cykuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJRW51bWVyYXRvcjxWPiBJRW51bWVyYWJsZTxWPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5LZXlzLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgQWRkKFYgaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRpY3QuQ29udGFpbnNLZXkoaXRlbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWN0W2l0ZW1dID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIElDb2xsZWN0aW9uPFY+LkFkZChWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkKGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGljdC5DbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuQ29udGFpbnNLZXkoaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhWW10gYXJyYXksIGludCBhcnJheUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpY3QuS2V5cy5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkaWN0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpAQCAtMCwwICsxLDMxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKKyNpZiAoIU5FVDQ1KQorbmFtZXNwYWNlIFRocmlmdAoreworICAgIHN0YXRpYyBjbGFzcyBTdHJlYW1FeHRlbnNpb25zTmV0MzUKKyAgICB7CisgICAgICAgIC8vIENvcHlUbygpIGhhcyBiZWVuIGFkZGVkIGluIDQuMAorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgQ29weVRvKHRoaXMgU3RyZWFtIHNvdXJjZSwgU3RyZWFtIHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgbG9uZyBuVG90YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gc291cmNlLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuVG90YWw7CisKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgblRvdGFsICs9IG5SZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQyZTc1NzYuLjdlODY3ODEKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTEsNTYgKzEsNTUgQEAKLe+7vy8qKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCi0NCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nDQotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24NCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuDQotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkMjIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQ0KLS8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/DQotDQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlDQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQ0KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4NCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQ0KLVthc3NlbWJseTogR3VpZCgiZGYzZjhlZjAtZTBhMy00Yzg2LWE2NWItOGVjODRlMDE2YjFkIildDQotDQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCi0vLw0KLS8vICAgICAgTWFqb3IgVmVyc2lvbg0KLS8vICAgICAgTWlub3IgVmVyc2lvbg0KLS8vICAgICAgQnVpbGQgTnVtYmVyDQotLy8gICAgICBSZXZpc2lvbg0KLS8vDQotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMNCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjYuMS4qIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjYuMS4qIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisvL0BUT0RPIHdoZXJlIHRvIHB1dCBMaWNlbnNlIGluZm9ybWF0aW9uPworCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTYxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIFdyaXRlKFRQcm90b2NvbCB0UHJvdG9jb2wpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKaW5kZXggMTk2OWJiMy4uNDExZTRkOSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKQEAgLTE5LDE2ICsxOSwxMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGludGVyZmFjZSBUQmFzZQotCXsKLQkJLy8vCi0JCS8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KLQkJLy8vCi0JCXZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKLQotCQkvLy8KLQkJLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCi0JCS8vLwotCQl2b2lkIFdyaXRlKFRQcm90b2NvbCB0UHJvdG9jb2wpOwotCX0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRCYXNlIDogVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MKaW5kZXggZjg1N2Q2Zi4uOWVhYWViZCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcwpAQCAtMjEsODAgKzIxLDgwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NFV0aWxzCi0JewotCQlpbnRlcm5hbCBjb25zdCBzdHJpbmcgRU5DT0RFX1RBQkxFID0KLQkJCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NFV0aWxzCisgICAgeworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRU5DT0RFX1RBQkxFID0KKyAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKIAotCQlpbnRlcm5hbCBzdGF0aWMgdm9pZCBlbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwKLQkJCQkJCQkJaW50IGRzdE9mZikKLQkJewotCQkJZHN0W2RzdE9mZl0gPSAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRl07Ci0JCQlpZiAobGVuID09IDMpCi0JCQl7Ci0JCQkJZHN0W2RzdE9mZiArIDFdID0KLQkJCQkJKGJ5dGUpRU5DT0RFX1RBQkxFWwotCQkJCQkJKChzcmNbc3JjT2ZmXSA8PCA0KSArIChzcmNbc3JjT2ZmICsgMV0gPj4gNCkpICYgMHgzRl07Ci0JCQkJZHN0W2RzdE9mZiArIDJdID0KLQkJCQkJKGJ5dGUpRU5DT0RFX1RBQkxFWwotCQkJCQkJKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgKyAoc3JjW3NyY09mZiArIDJdID4+IDYpKSAmIDB4M0ZdOwotCQkJCWRzdFtkc3RPZmYgKyAzXSA9Ci0JCQkJCShieXRlKUVOQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxlbiA9PSAyKQotCQkJewotCQkJCWRzdFtkc3RPZmYgKyAxXSA9Ci0JCQkJCShieXRlKUVOQ09ERV9UQUJMRVsKLQkJCQkJCSgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZiArIDFdID4+IDQpKSAmIDB4M0ZdOwotCQkJCWRzdFtkc3RPZmYgKyAyXSA9Ci0JCQkJCShieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzRl07CisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIGVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZl0gPj4gMikgJiAweDNGXTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbCisgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbCisgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWworICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDXTsKIAotCQkJfQotCQkJZWxzZQotCQkJeyAvLyBsZW4gPT0gMSkgewotCQkJCWRzdFtkc3RPZmYgKyAxXSA9Ci0JCQkJCShieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZl0gPDwgNCkgJiAweDNGXTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAvLyBsZW4gPT0gMSkgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgc3RhdGljIGludFtdIERFQ09ERV9UQUJMRSA9IHsKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSw2MiwtMSwtMSwtMSw2MywKLQkJCTUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsMTEsMTIsMTMsMTQsCi0JCQkxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAotCQkJNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQl9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBERUNPREVfVEFCTEUgPSB7CisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCisgICAgICAgICAgICA1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAorICAgICAgICAgICAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKKyAgICAgICAgICAgIDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgfTsKIAotCQlpbnRlcm5hbCBzdGF0aWMgdm9pZCBkZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwKLQkJCQkJCQkJIGludCBkc3RPZmYpCi0JCXsKLQkJCWRzdFtkc3RPZmZdID0gKGJ5dGUpCi0JCQkJKChERUNPREVfVEFCTEVbc3JjW3NyY09mZl0gJiAweDBGRl0gPDwgMikgfAotCQkJCShERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdID4+IDQpKTsKLQkJCWlmIChsZW4gPiAyKQotCQkJewotCQkJCWRzdFtkc3RPZmYgKyAxXSA9IChieXRlKQotCQkJCQkoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfAotCQkJCQkoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA+PiAyKSk7Ci0JCQkJaWYgKGxlbiA+IDMpCi0JCQkJewotCQkJCQlkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkKLQkJCQkJCSgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8Ci0JCQkJCQlERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgZGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKQorICAgICAgICAgICAgICAgICgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisgICAgICAgICAgICBpZiAobGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwKKyAgICAgICAgICAgICAgICAgICAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAzXSAmIDB4MEZGXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQl9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCmluZGV4IDRiMzk4MGUuLmE0ZmFhOTQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKQEAgLTI3LDM3MCArMjcsMzY5IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCi0JewotCQlwcm90ZWN0ZWQgY29uc3QgdWludCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotCQlwcm90ZWN0ZWQgY29uc3QgdWludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworICAgIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CiAKLQkJcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKLQkJcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKIAotCQlwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOwotCQlwcm90ZWN0ZWQgYm9vbCBjaGVja1JlYWRMZW5ndGhfID0gZmFsc2U7CisgICAgICAgICNyZWdpb24gQmluYXJ5UHJvdG9jb2wgRmFjdG9yeQogCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKIAotCQkjcmVnaW9uIEJpbmFyeVByb3RvY29sIEZhY3RvcnkKLQkJIC8qKgotCQkgICogRmFjdG9yeQotCQkgICovCi0JCSAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICA6IHRoaXMoZmFsc2UsIHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CiAKLQkJCSAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKLQkJCSAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgICAgICAgICB9CiAKLQkJCSAgcHVibGljIEZhY3RvcnkoKQotCQkJCSAgOnRoaXMoZmFsc2UsIHRydWUpCi0JCQkgIHsKLQkJCSAgfQorICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQkgIHB1YmxpYyBGYWN0b3J5KGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKLQkJCSAgewotCQkJCSAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwotCQkJCSAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7Ci0JCQkgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgogCi0JCQlwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKLQkJCSAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOwotCQkJfQotCQkgIH0KKyAgICAgICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiB0aGlzKHRyYW5zLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJI2VuZHJlZ2lvbgorICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCi0JCQk6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQotCQl7Ci0JCX0KKyAgICAgICAgI3JlZ2lvbiBXcml0ZSBNZXRob2RzCiAKLQkJcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0JCQk6YmFzZSh0cmFucykKLQkJewotCQkJc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwotCQkJc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmljdFdyaXRlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCAodWludCkobWVzc2FnZS5UeXBlKTsKKyAgICAgICAgICAgICAgICBXcml0ZUkzMigoaW50KXZlcnNpb24pOworICAgICAgICAgICAgICAgIFdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICAgICAgV3JpdGVJMzIobWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKW1lc3NhZ2UuVHlwZSk7CisgICAgICAgICAgICAgICAgV3JpdGVJMzIobWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkjcmVnaW9uIFdyaXRlIE1ldGhvZHMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkKLQkJewotCQkJaWYgKHN0cmljdFdyaXRlXykKLQkJCXsKLQkJCQl1aW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCAodWludCkobWVzc2FnZS5UeXBlKTsKLQkJCQlXcml0ZUkzMigoaW50KXZlcnNpb24pOwotCQkJCVdyaXRlU3RyaW5nKG1lc3NhZ2UuTmFtZSk7Ci0JCQkJV3JpdGVJMzIobWVzc2FnZS5TZXFJRCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKLQkJCQlXcml0ZUJ5dGUoKGJ5dGUpbWVzc2FnZS5UeXBlKTsKLQkJCQlXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWMpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1YykKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpZmllbGQuVHlwZSk7CisgICAgICAgICAgICBXcml0ZUkxNihmaWVsZC5JRCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKLQkJewotCQkJV3JpdGVCeXRlKChieXRlKWZpZWxkLlR5cGUpOwotCQkJV3JpdGVJMTYoZmllbGQuSUQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSlUVHlwZS5TdG9wKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSltYXAuS2V5VHlwZSk7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKW1hcC5WYWx1ZVR5cGUpOworICAgICAgICAgICAgV3JpdGVJMzIobWFwLkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKLQkJewotCQkJV3JpdGVCeXRlKChieXRlKVRUeXBlLlN0b3ApOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKLQkJewotCQkJV3JpdGVCeXRlKChieXRlKW1hcC5LZXlUeXBlKTsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSltYXAuVmFsdWVUeXBlKTsKLQkJCVdyaXRlSTMyKG1hcC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSlsaXN0LkVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTMyKGxpc3QuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKLQkJewotCQkJV3JpdGVCeXRlKChieXRlKWxpc3QuRWxlbWVudFR5cGUpOwotCQkJV3JpdGVJMzIobGlzdC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSlzZXQuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgV3JpdGVJMzIoc2V0LkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCi0JCXsKLQkJCVdyaXRlQnl0ZSgoYnl0ZSlzZXQuRWxlbWVudFR5cGUpOwotCQkJV3JpdGVJMzIoc2V0LkNvdW50KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woYm9vbCBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoYiA/IChzYnl0ZSkxIDogKHNieXRlKTApOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gYm91dCA9IG5ldyBieXRlWzFdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgYm91dFswXSA9IChieXRlKWI7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShib3V0LCAwLCAxKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChib29sIGIpCi0JCXsKLQkJCVdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGkxNm91dCA9IG5ldyBieXRlWzJdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBzKQorICAgICAgICB7CisgICAgICAgICAgICBpMTZvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChzID4+IDgpKTsKKyAgICAgICAgICAgIGkxNm91dFsxXSA9IChieXRlKSgweGZmICYgcyk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShpMTZvdXQsIDAsIDIpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gYm91dCA9IG5ldyBieXRlWzFdOwotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoYnl0ZSBiKQotCQl7Ci0JCQlib3V0WzBdID0gYjsKLQkJCXRyYW5zLldyaXRlKGJvdXQsIDAsIDEpOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICAgICAgICAgIGkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOworICAgICAgICAgICAgaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKKyAgICAgICAgICAgIGkzMm91dFszXSA9IChieXRlKSgweGZmICYgaTMyKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGkzMm91dCwgMCwgNCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBpMTZvdXQgPSBuZXcgYnl0ZVsyXTsKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgcykKLQkJewotCQkJaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAocyA+PiA4KSk7Ci0JCQlpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIHMpOwotCQkJdHJhbnMuV3JpdGUoaTE2b3V0LCAwLCAyKTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpNjRvdXQgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGk2NG91dFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOworICAgICAgICAgICAgaTY0b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7CisgICAgICAgICAgICBpNjRvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICAgICAgICAgIGk2NG91dFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOworICAgICAgICAgICAgaTY0b3V0WzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7CisgICAgICAgICAgICBpNjRvdXRbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICAgICAgICAgIGk2NG91dFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgICAgICAgICBpNjRvdXRbN10gPSAoYnl0ZSkoMHhmZiAmIGk2NCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShpNjRvdXQsIDAsIDgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCi0JCXsKLQkJCWkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOwotCQkJaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7Ci0JCQlpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOwotCQkJaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiBpMzIpOwotCQkJdHJhbnMuV3JpdGUoaTMyb3V0LCAwLCA0KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZCkKKyAgICAgICAgeworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgV3JpdGVJNjQoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpKTsKKyNlbHNlCisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoZCk7CisgICAgICAgICAgICBXcml0ZUk2NChCaXRDb252ZXJ0ZXIuVG9JbnQ2NChieXRlcywgMCkpOworI2VuZGlmCisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBpNjRvdXQgPSBuZXcgYnl0ZVs4XTsKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCi0JCXsKLQkJCWk2NG91dFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOwotCQkJaTY0b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7Ci0JCQlpNjRvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKLQkJCWk2NG91dFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOwotCQkJaTY0b3V0WzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7Ci0JCQlpNjRvdXRbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKLQkJCWk2NG91dFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7Ci0JCQlpNjRvdXRbN10gPSAoYnl0ZSkoMHhmZiAmIGk2NCk7Ci0JCQl0cmFucy5Xcml0ZShpNjRvdXQsIDAsIDgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUkzMihiLkxlbmd0aCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCAwLCBiLkxlbmd0aCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZCkKLQkJewotCQkJV3JpdGVJNjQoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpKTsKLQkJfQorICAgICAgICAjZW5kcmVnaW9uCiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpCi0JCXsKLQkJCVdyaXRlSTMyKGIuTGVuZ3RoKTsKLQkJCXRyYW5zLldyaXRlKGIsIDAsIGIuTGVuZ3RoKTsKLQkJfQorICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCiAKLQkJI2VuZHJlZ2lvbgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gUmVhZEkzMigpOworICAgICAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQgdmVyc2lvbiA9ICh1aW50KXNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpKHNpemUgJiAweDAwMDAwMGZmKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaWN0UmVhZF8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nQm9keShzaXplKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CiAKLQkJI3JlZ2lvbiBSZWFkTWV0aG9kcworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKLQkJewotCQkJVE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOwotCQkJaW50IHNpemUgPSBSZWFkSTMyKCk7Ci0JCQlpZiAoc2l6ZSA8IDApCi0JCQl7Ci0JCQkJdWludCB2ZXJzaW9uID0gKHVpbnQpc2l6ZSAmIFZFUlNJT05fTUFTSzsKLQkJCQlpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46ICIgKyB2ZXJzaW9uKTsKLQkJCQl9Ci0JCQkJbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkoc2l6ZSAmIDB4MDAwMDAwZmYpOwotCQkJCW1lc3NhZ2UuTmFtZSA9IFJlYWRTdHJpbmcoKTsKLQkJCQltZXNzYWdlLlNlcUlEID0gUmVhZEkzMigpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChzdHJpY3RSZWFkXykKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7Ci0JCQkJfQotCQkJCW1lc3NhZ2UuTmFtZSA9IFJlYWRTdHJpbmdCb2R5KHNpemUpOwotCQkJCW1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpUmVhZEJ5dGUoKTsKLQkJCQltZXNzYWdlLlNlcUlEID0gUmVhZEkzMigpOwotCQkJfQotCQkJcmV0dXJuIG1lc3NhZ2U7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKLQkJewotCQkJcmV0dXJuIG5ldyBUU3RydWN0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgICAgIGZpZWxkLlR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKLQkJewotCQl9CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSAhPSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gUmVhZEkxNigpOworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQotCQl7Ci0JCQlURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7Ci0JCQlmaWVsZC5UeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KIAotCQkJaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKLQkJCXsKLQkJCQlmaWVsZC5JRCA9IFJlYWRJMTYoKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXJldHVybiBmaWVsZDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWFwIG1hcCA9IG5ldyBUTWFwKCk7CisgICAgICAgICAgICBtYXAuS2V5VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgbWFwLlZhbHVlVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gUmVhZEkzMigpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCi0JCXsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCi0JCXsKLQkJCVRNYXAgbWFwID0gbmV3IFRNYXAoKTsKLQkJCW1hcC5LZXlUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7Ci0JCQltYXAuVmFsdWVUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7Ci0JCQltYXAuQ291bnQgPSBSZWFkSTMyKCk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkJcmV0dXJuIG1hcDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QoKTsKKyAgICAgICAgICAgIGxpc3QuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGxpc3QuQ291bnQgPSBSZWFkSTMyKCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCi0JCXsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCi0JCXsKLQkJCVRMaXN0IGxpc3QgPSBuZXcgVExpc3QoKTsKLQkJCWxpc3QuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKLQkJCWxpc3QuQ291bnQgPSBSZWFkSTMyKCk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXJldHVybiBsaXN0OwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTZXQgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgc2V0LkNvdW50ID0gUmVhZEkzMigpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkKLQkJewotCQl9CisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKLQkJewotCQkJVFNldCBzZXQgPSBuZXcgVFNldCgpOwotCQkJc2V0LkVsZW1lbnRUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7Ci0JCQlzZXQuQ291bnQgPSBSZWFkSTMyKCk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkJcmV0dXJuIHNldDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWFkQnl0ZSgpID09IDE7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGJpbiwgMCwgMSk7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKWJpblswXTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKLQkJewotCQkJcmV0dXJuIFJlYWRCeXRlKCkgPT0gMTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMTZpbiA9IG5ldyBieXRlWzJdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRBbGwoaTE2aW4sIDAsIDIpOworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkoKChpMTZpblswXSAmIDB4ZmYpIDw8IDgpIHwgKChpMTZpblsxXSAmIDB4ZmYpKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKLQkJcHVibGljIG92ZXJyaWRlIGJ5dGUgUmVhZEJ5dGUoKQotCQl7Ci0JCQlSZWFkQWxsKGJpbiwgMCwgMSk7Ci0JCQlyZXR1cm4gYmluWzBdOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGkzMmluID0gbmV3IGJ5dGVbNF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRBbGwoaTMyaW4sIDAsIDQpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpKCgoaTMyaW5bMF0gJiAweGZmKSA8PCAyNCkgfCAoKGkzMmluWzFdICYgMHhmZikgPDwgMTYpIHwgKChpMzJpblsyXSAmIDB4ZmYpIDw8IDgpIHwgKChpMzJpblszXSAmIDB4ZmYpKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBpMTZpbiA9IG5ldyBieXRlWzJdOwotCQlwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCi0JCXsKLQkJCVJlYWRBbGwoaTE2aW4sIDAsIDIpOwotCQkJcmV0dXJuIChzaG9ydCkoKChpMTZpblswXSAmIDB4ZmYpIDw8IDgpIHwgKChpMTZpblsxXSAmIDB4ZmYpKSk7Ci0JCX0KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDY3NQogCi0JCXByaXZhdGUgYnl0ZVtdIGkzMmluID0gbmV3IGJ5dGVbNF07Ci0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCi0JCXsKLQkJCVJlYWRBbGwoaTMyaW4sIDAsIDQpOwotCQkJcmV0dXJuIChpbnQpKCgoaTMyaW5bMF0gJiAweGZmKSA8PCAyNCkgfCAoKGkzMmluWzFdICYgMHhmZikgPDwgMTYpIHwgKChpMzJpblsyXSAmIDB4ZmYpIDw8IDgpIHwgKChpMzJpblszXSAmIDB4ZmYpKSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTY0aW4gPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRBbGwoaTY0aW4sIDAsIDgpOworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls3XSAmIDB4ZmYpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBpNjRpbiA9IG5ldyBieXRlWzhdOwotCQlwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKLQkJewotCQkJUmVhZEFsbChpNjRpbiwgMCwgOCk7Ci0JCQlyZXR1cm4gKGxvbmcpKCgobG9uZykoaTY0aW5bMF0gJiAweGZmKSA8PCA1NikgfCAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwgKChsb25nKShpNjRpblsyXSAmIDB4ZmYpIDw8IDQwKSB8ICgobG9uZykoaTY0aW5bM10gJiAweGZmKSA8PCAzMikgfAotCQkJCSgobG9uZykoaTY0aW5bNF0gJiAweGZmKSA8PCAyNCkgfCAoKGxvbmcpKGk2NGluWzVdICYgMHhmZikgPDwgMTYpIHwgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwgKChsb25nKShpNjRpbls3XSAmIDB4ZmYpKSk7Ci0JCX0KKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDY3NQogCi0JCXB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCi0JCXsKLQkJCXJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoUmVhZEk2NCgpKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQorICAgICAgICB7CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKFJlYWRJNjQoKSk7CisjZWxzZQorICAgICAgICAgICAgdmFyIHZhbHVlID0gUmVhZEk2NCgpOworICAgICAgICAgICAgdmFyIGJ5dGVzID0gQml0Q29udmVydGVyLkdldEJ5dGVzKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9Eb3VibGUoYnl0ZXMsIDApOworI2VuZGlmCisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBTZXRSZWFkTGVuZ3RoKGludCByZWFkTGVuZ3RoKQotCQl7Ci0JCQlyZWFkTGVuZ3RoXyA9IHJlYWRMZW5ndGg7Ci0JCQljaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IFJlYWRJMzIoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgQ2hlY2tSZWFkTGVuZ3RoKGludCBsZW5ndGgpCi0JCXsKLQkJCWlmIChjaGVja1JlYWRMZW5ndGhfKQotCQkJewotCQkJCXJlYWRMZW5ndGhfIC09IGxlbmd0aDsKLQkJCQlpZiAocmVhZExlbmd0aF8gPCAwKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTWVzc2FnZSBsZW5ndGggZXhjZWVkZWQ6ICIgKyBsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFucy5SZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKLQkJewotCQkJaW50IHNpemUgPSBSZWFkSTMyKCk7Ci0JCQlDaGVja1JlYWRMZW5ndGgoc2l6ZSk7Ci0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQl0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCXByaXZhdGUgIHN0cmluZyBSZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkKLQkJewotCQkJQ2hlY2tSZWFkTGVuZ3RoKHNpemUpOwotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOwotCQkJcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1Zik7Ci0JCX0KLQotCQlwcml2YXRlIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCUNoZWNrUmVhZExlbmd0aChsZW4pOwotCQkJcmV0dXJuIHRyYW5zLlJlYWRBbGwoYnVmLCBvZmYsIGxlbik7Ci0JCX0KLQotCQkjZW5kcmVnaW9uCi0JfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2NzM5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw4NDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIHB1YmxpYyBjbGFzcyBUQ29tcGFjdFByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgiIik7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRGaWVsZCBUU1RPUCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlN0b3AsIChzaG9ydCkwKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gdHR5cGVUb0NvbXBhY3RUeXBlID0gbmV3IGJ5dGVbMTZdOworCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBQUk9UT0NPTF9JRCA9IDB4ODI7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWRVJTSU9OID0gMTsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFZFUlNJT05fTUFTSyA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9NQVNLID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbCBvZiB0aGUgb24td2lyZSB0eXBlIGNvZGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTVE9QID0gMHgwMDsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJPT0xFQU5fVFJVRSA9IDB4MDE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCT09MRUFOX0ZBTFNFID0gMHgwMjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJZVEUgPSAweDAzOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTE2ID0gMHgwNDsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkzMiA9IDB4MDU7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJNjQgPSAweDA2OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgRE9VQkxFID0gMHgwNzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJJTkFSWSA9IDB4MDg7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBMSVNUID0gMHgwOTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNFVCA9IDB4MEE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBNQVAgPSAweDBCOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RSVUNUID0gMHgwQzsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICAgIC8vLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFN0YWNrPHNob3J0PiBsYXN0RmllbGRfID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CisKKyAgICAgICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAgICAgICAvLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIE51bGxhYmxlPFRGaWVsZD4gYm9vbGVhbkZpZWxkXzsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgICAgLy8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIE51bGxhYmxlPEJvb2xlYW4+IGJvb2xWYWx1ZV87CisKKworICAgICAgICAjcmVnaW9uIENvbXBhY3RQcm90b2NvbCBGYWN0b3J5CisKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0b3BdID0gVHlwZXMuU1RPUDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkJvb2xdID0gVHlwZXMuQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuQnl0ZV0gPSBUeXBlcy5CWVRFOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuSTE2XSA9IFR5cGVzLkkxNjsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkkzMl0gPSBUeXBlcy5JMzI7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5JNjRdID0gVHlwZXMuSTY0OworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuRG91YmxlXSA9IFR5cGVzLkRPVUJMRTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0cmluZ10gPSBUeXBlcy5CSU5BUlk7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5MaXN0XSA9IFR5cGVzLkxJU1Q7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TZXRdID0gVHlwZXMuU0VUOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuTWFwXSA9IFR5cGVzLk1BUDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TVFJVQ1Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8uQ2xlYXIoKTsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFdyaXRlIE1ldGhvZHMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZURpcmVjdEJ1ZmZlclswXSA9IGI7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShieXRlRGlyZWN0QnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGludCBuKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAvLy8gVE9ETzogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSBXcml0ZVZhcmludDY0PworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNV07CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFyaW50MzIodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKW47CisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZShpMzJidWYsIDAsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisgICAgICAgIC8vLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KFBST1RPQ09MX0lEKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKCgoKHVpbnQpbWVzc2FnZS5UeXBlKSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKSk7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KW1lc3NhZ2UuU2VxSUQpOworICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorICAgICAgICAvLy8gdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICAgIC8vLyBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cmN0KQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICAgICAgICAvLy8gdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgICAgICAgIC8vLyBvZiB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgICAgLy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKKyAgICAgICAgLy8vIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfID0gZmllbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQsIDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKKyAgICAgICAgLy8vICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgICAgICAgIC8vLyBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLlBvcCgpOworCisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgICAgICAgICAgICBieXRlIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBnZXRDb21wYWN0VHlwZShmaWVsZC5UeXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgICAgICBpZiAoZmllbGQuSUQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGQuSUQgLSBsYXN0RmllbGRJZF8gPD0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoZmllbGQuSUQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgV3JpdGVJMTYoZmllbGQuSUQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIC8vIGxhc3RGaWVsZF8ucHVzaChmaWVsZC5pZCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KFR5cGVzLlNUT1ApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgICAgLy8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KW1hcC5Db3VudCk7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KGdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHNldCBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKHNldC5FbGVtZW50VHlwZSwgc2V0LkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAgICAvLy8gd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKyAgICAgICAgLy8vIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgICAgLy8vIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKEJvb2xlYW4gYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJvb2xlYW5GaWVsZF8gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChib29sZWFuRmllbGRfLlZhbHVlLCBiID8gVHlwZXMuQk9PTEVBTl9UUlVFIDogVHlwZXMuQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KGIgPyBUeXBlcy5CT09MRUFOX1RSVUUgOiBUeXBlcy5CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSliKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMTYpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoaW50VG9aaWdaYWcoaTMyKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQ2NChsb25nVG9aaWd6YWcoaTY0KSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZHViKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgICAgICAgICBmaXhlZExvbmdUb0J5dGVzKEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkdWIpLCBkYXRhLCAwKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHN0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVVRGOEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3RyKTsKKyAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJpbiwgMCwgYmluLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludClsZW5ndGgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKKyAgICAgICAgLy8gb3V0cHV0IG9yIHB1cnBvc2UuCisgICAgICAgIC8vCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkgeyB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisgICAgICAgIC8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAvLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBXcml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplIDw9IDE0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChzaXplIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgweGYwIHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGJ5dGVbXSB2YXJpbnQ2NG91dCA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFyaW50NjQodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKG4gJiB+KHVsb25nKTB4N0ZMKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZSh2YXJpbnQ2NG91dCwgMCwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgICAgLy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1bG9uZyBsb25nVG9aaWd6YWcobG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHVsb25nKShuIDw8IDEpIF4gKHVsb25nKShuID4+IDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAgICAvLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVpbnQgaW50VG9aaWdaYWcoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAodWludCkobiA8PCAxKSBeICh1aW50KShuID4+IDMxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZworICAgICAgICAvLy8gdW50aWwgb2ZmKzcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBmaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpKG4gJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAxXSA9IChieXRlKSgobiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDJdID0gKGJ5dGUpKChuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDNdID0gKGJ5dGUpKChuID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDRdID0gKGJ5dGUpKChuID4+IDMyKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDVdID0gKGJ5dGUpKChuID4+IDQwKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDZdID0gKGJ5dGUpKChuID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDddID0gKGJ5dGUpKChuID4+IDU2KSAmIDB4ZmYpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gUmVhZE1ldGhvZHMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSBwcm90b2NvbElkID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIHByb3RvY29sIGlkICIgKyBQUk9UT0NPTF9JRC5Ub1N0cmluZygiWCIpICsgIiBidXQgZ290ICIgKyBwcm90b2NvbElkLlRvU3RyaW5nKCJYIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZSB2ZXJzaW9uQW5kVHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBieXRlIHZlcnNpb24gPSAoYnl0ZSkodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCB2ZXJzaW9uICIgKyBWRVJTSU9OICsgIiBidXQgZ290ICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICAgICAgICAgIGludCBzZXFpZCA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKXR5cGUsIHNlcWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorICAgICAgICAvLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisgICAgICAgIC8vLyB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIHR5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOworCisgICAgICAgICAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgICAgICAgICAgICBpZiAodHlwZSA9PSBUeXBlcy5TVE9QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUU1RPUDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2hvcnQgZmllbGRJZDsKKworICAgICAgICAgICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICAgICAgICAgICAgc2hvcnQgbW9kaWZpZXIgPSAoc2hvcnQpKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgICAgICAgICAgICAgZmllbGRJZCA9IFJlYWRJMTYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgICAgICAgICAgICAgIGZpZWxkSWQgPSAoc2hvcnQpKGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgiIiwgZ2V0VFR5cGUoKGJ5dGUpKHR5cGUgJiAweDBmKSksIGZpZWxkSWQpOworCisgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgICAgICAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgYm9vbFZhbHVlXyA9IChieXRlKSh0eXBlICYgMHgwZikgPT0gVHlwZXMuQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLklEOworICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAvLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgICAgLy8vICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgYnl0ZSBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAoYnl0ZSkwIDogKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlID4+IDQpKSwgZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAvLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSBzaXplX2FuZF90eXBlID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZSB0eXBlID0gZ2V0VFR5cGUoc2l6ZV9hbmRfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAvLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU2V0KFJlYWRMaXN0QmVnaW4oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgICAgICAgIC8vLyBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICAgICAgICAvLy8gcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCBSZWFkIGEgYnl0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJvb2xlYW4gUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYm9vbFZhbHVlXyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gYm9vbFZhbHVlXy5WYWx1ZTsKKyAgICAgICAgICAgICAgICBib29sVmFsdWVfID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFJlYWRCeXRlKCkgPT0gVHlwZXMuQk9PTEVBTl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSlieXRlUmF3QnVmWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCl6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHppZ3phZ1RvSW50KFJlYWRWYXJpbnQzMigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHppZ3phZ1RvTG9uZyhSZWFkVmFyaW50NjQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBObyBtYWdpYyBoZXJlIC0ganVzdCBSZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGxvbmdCaXRzLCAwLCA4KTsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KVJlYWRWYXJpbnQzMigpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoUmVhZEJpbmFyeShsZW5ndGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRCaW5hcnkoaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQorICAgICAgICAvLyBlbmNvZGluZy4KKyAgICAgICAgLy8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpIHsgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEludGVybmFsIFJlYWRpbmcgbWV0aG9kcworICAgICAgICAvLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVpbnQgUmVhZFZhcmludDMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOworICAgICAgICAgICAgaW50IHNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1aW50KShiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgIC8vLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVsb25nIFJlYWRWYXJpbnQ2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBiID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVsb25nKShiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAvLworICAgICAgICAvLyBlbmNvZGluZyBoZWxwZXJzCisgICAgICAgIC8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCB6aWd6YWdUb0ludCh1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KShuID4+IDEpIF4gKC0oaW50KShuICYgMSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgbG9uZyB6aWd6YWdUb0xvbmcodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKShuID4+IDEpIF4gKC0obG9uZykobiAmIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAgICAvLy8gb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKyAgICAgICAgLy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgbG9uZyBieXRlc1RvTG9uZyhieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAoKGJ5dGVzWzddICYgMHhmZkwpIDw8IDU2KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbNl0gJiAweGZmTCkgPDwgNDgpIHwKKyAgICAgICAgICAgICAgKChieXRlc1s1XSAmIDB4ZmZMKSA8PCA0MCkgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzRdICYgMHhmZkwpIDw8IDMyKSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbM10gJiAweGZmTCkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgKChieXRlc1syXSAmIDB4ZmZMKSA8PCAxNikgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzFdICYgMHhmZkwpIDw8IDgpIHwKKyAgICAgICAgICAgICAgKChieXRlc1swXSAmIDB4ZmZMKSk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICAgICAgLy8KKworICAgICAgICBwcml2YXRlIEJvb2xlYW4gaXNCb29sVHlwZShieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBmOworICAgICAgICAgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fVFJVRSB8fCBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCisgICAgICAgIC8vLyBUVHlwZSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBUVHlwZSBnZXRUVHlwZShieXRlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpKHR5cGUgJiAweDBmKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNUT1A6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdG9wOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQk9PTEVBTl9GQUxTRToKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJPT0xFQU5fVFJVRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJJTkFSWToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU1RSVUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oImRvbid0IGtub3cgd2hhdCB0eXBlOiAiICsgKGJ5dGUpKHR5cGUgJiAweDBmKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGUgZ2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbKGludCl0dHlwZV07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKaW5kZXggZmExMDU4NC4uODE3OTU1NyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcwpAQCAtMjcsMzYgKzI3LDM2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRGaWVsZAotCXsKLQkJcHJpdmF0ZSBzdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBUVHlwZSB0eXBlOwotCQlwcml2YXRlIHNob3J0IGlkOworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFRUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgc2hvcnQgaWQ7CiAKLQkJcHVibGljIFRGaWVsZChzdHJpbmcgbmFtZSwgVFR5cGUgdHlwZSwgc2hvcnQgaWQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9CisgICAgICAgIHB1YmxpYyBURmllbGQoc3RyaW5nIG5hbWUsIFRUeXBlIHR5cGUsIHNob3J0IGlkKQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdHJpbmcgTmFtZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gbmFtZTsgfQotCQkJc2V0IHsgbmFtZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9CisgICAgICAgICAgICBzZXQgeyBuYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiB0eXBlOyB9Ci0JCQlzZXQgeyB0eXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgdHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgc2hvcnQgSUQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGlkOyB9Ci0JCQlzZXQgeyBpZCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBzaG9ydCBJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaWQ7IH0KKyAgICAgICAgICAgIHNldCB7IGlkID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCmluZGV4IDhjMzBjNDguLjlkYmRlYTkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcwpAQCAtMjMsMTA0OCArMjMsMTEwMiBAQAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKIHVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgotCS8vLwotCS8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgotCS8vLwotCS8vLyBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQotCS8vLyBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgotCS8vLwotCS8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIDogVFByb3RvY29sCi0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5Ci0JCXsKLQkJCXB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOwotCQkJfQotCQl9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyBXcml0ZSBhbmQgUmVhZC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7IChieXRlKScsJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gQ09MT04gPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJzonIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3snIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ30nIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0tFVCA9IG5ldyBieXRlW10geyAoYnl0ZSknWycgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSddJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gUVVPVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJyInIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBCQUNLU0xBU0ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ1xcJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gWkVSTyA9IG5ldyBieXRlW10geyAoYnl0ZSknMCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7IChieXRlKScsJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gQ09MT04gPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJzonIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3snIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ30nIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBMQlJBQ0tFVCA9IG5ldyBieXRlW10geyAoYnl0ZSknWycgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSddJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gUVVPVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJyInIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBCQUNLU0xBU0ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ1xcJyB9OwogCi0JCXByaXZhdGUgYnl0ZVtdIEVTQ1NFUSA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnLCAoYnl0ZSkndScsIChieXRlKScwJywgKGJ5dGUpJzAnIH07CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEVTQ1NFUSA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnLCAoYnl0ZSkndScsIChieXRlKScwJywgKGJ5dGUpJzAnIH07CiAKLQkJcHJpdmF0ZSBjb25zdCBsb25nIFZFUlNJT04gPSAxOwotCQlwcml2YXRlIGJ5dGVbXSBKU09OX0NIQVJfVEFCTEUgPSB7Ci0JMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsKGJ5dGUpJ2InLChieXRlKSd0JywoYnl0ZSknbicsICAwLChieXRlKSdmJywoYnl0ZSkncicsICAwLCAgMCwgCi0JMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0JMSwgIDEsKGJ5dGUpJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBsb25nIFZFUlNJT04gPSAxOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBKU09OX0NIQVJfVEFCTEUgPSB7CisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsKGJ5dGUpJ2InLChieXRlKSd0JywoYnl0ZSknbicsICAwLChieXRlKSdmJywoYnl0ZSkncicsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAxLChieXRlKSciJywgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCiAgIH07CiAKLQkJcHJpdmF0ZSBjaGFyW10gRVNDQVBFX0NIQVJTID0gIlwiXFxiZm5ydCIuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcHJpdmF0ZSBjaGFyW10gRVNDQVBFX0NIQVJTID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CiAKLQkJcHJpdmF0ZSBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKLQkoYnl0ZSknIicsIChieXRlKSdcXCcsIChieXRlKSdcYicsIChieXRlKSdcZicsIChieXRlKSdcbicsIChieXRlKSdccicsIChieXRlKSdcdCcsCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgKGJ5dGUpJyInLCAoYnl0ZSknXFwnLCAoYnl0ZSknLycsIChieXRlKSdcYicsIChieXRlKSdcZicsIChieXRlKSdcbicsIChieXRlKSdccicsIChieXRlKSdcdCcsCiAgIH07CiAKLQkJcHJpdmF0ZSBjb25zdCBpbnQgREVGX1NUUklOR19TSVpFID0gMTY7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRl9TVFJJTkdfU0laRSA9IDE2OwogCi0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0JPT0wgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3QnLCAoYnl0ZSknZicgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQllURSA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc4JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JMTYgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknMScsIChieXRlKSc2JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JMzIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknMycsIChieXRlKScyJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JNjQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknNicsIChieXRlKSc0JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9ET1VCTEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2QnLCAoYnl0ZSknYicsIChieXRlKSdsJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TVFJVQ1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3InLCAoYnl0ZSknZScsIChieXRlKSdjJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TVFJJTkcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcsIChieXRlKSdyJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9NQVAgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ20nLCAoYnl0ZSknYScsIChieXRlKSdwJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9MSVNUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdsJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfU0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdzJywgKGJ5dGUpJ2UnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQk9PTCA9IG5ldyBieXRlW10geyAoYnl0ZSkndCcsIChieXRlKSdmJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzgnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kxNiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKScxJywgKGJ5dGUpJzYnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kzMiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSczJywgKGJ5dGUpJzInIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0k2NCA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc2JywgKGJ5dGUpJzQnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0RPVUJMRSA9IG5ldyBieXRlW10geyAoYnl0ZSknZCcsIChieXRlKSdiJywgKGJ5dGUpJ2wnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUlVDVCA9IG5ldyBieXRlW10geyAoYnl0ZSkncicsIChieXRlKSdlJywgKGJ5dGUpJ2MnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUklORyA9IG5ldyBieXRlW10geyAoYnl0ZSkncycsIChieXRlKSd0JywgKGJ5dGUpJ3InIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX01BUCA9IG5ldyBieXRlW10geyAoYnl0ZSknbScsIChieXRlKSdhJywgKGJ5dGUpJ3AnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0xJU1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2wnLCAoYnl0ZSkncycsIChieXRlKSd0JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSknZScsIChieXRlKSd0JyB9OwogCi0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpCi0JCXsKLQkJCXN3aXRjaCAodHlwZUlEKQotCQkJewotCQkJCWNhc2UgVFR5cGUuQm9vbDoKLQkJCQkJcmV0dXJuIE5BTUVfQk9PTDsKLQkJCQljYXNlIFRUeXBlLkJ5dGU6Ci0JCQkJCXJldHVybiBOQU1FX0JZVEU7Ci0JCQkJY2FzZSBUVHlwZS5JMTY6Ci0JCQkJCXJldHVybiBOQU1FX0kxNjsKLQkJCQljYXNlIFRUeXBlLkkzMjoKLQkJCQkJcmV0dXJuIE5BTUVfSTMyOwotCQkJCWNhc2UgVFR5cGUuSTY0OgotCQkJCQlyZXR1cm4gTkFNRV9JNjQ7Ci0JCQkJY2FzZSBUVHlwZS5Eb3VibGU6Ci0JCQkJCXJldHVybiBOQU1FX0RPVUJMRTsKLQkJCQljYXNlIFRUeXBlLlN0cmluZzoKLQkJCQkJcmV0dXJuIE5BTUVfU1RSSU5HOwotCQkJCWNhc2UgVFR5cGUuU3RydWN0OgotCQkJCQlyZXR1cm4gTkFNRV9TVFJVQ1Q7Ci0JCQkJY2FzZSBUVHlwZS5NYXA6Ci0JCQkJCXJldHVybiBOQU1FX01BUDsKLQkJCQljYXNlIFRUeXBlLlNldDoKLQkJCQkJcmV0dXJuIE5BTUVfU0VUOwotCQkJCWNhc2UgVFR5cGUuTGlzdDoKLQkJCQkJcmV0dXJuIE5BTUVfTElTVDsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCi0JCQkJCQkJCQkJCQkgIlVucmVjb2duaXplZCB0eXBlIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9CT09MOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfQllURTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9JMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0k2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfRE9VQkxFOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9TVFJJTkc7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX1NUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9TRVQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9MSVNUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgc3RhdGljIFRUeXBlIEdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQotCQl7Ci0JCQlUVHlwZSByZXN1bHQgPSBUVHlwZS5TdG9wOwotCQkJaWYgKG5hbWUuTGVuZ3RoID4gMSkKLQkJCXsKLQkJCQlzd2l0Y2ggKG5hbWVbMF0pCi0JCQkJewotCQkJCQljYXNlIChieXRlKSdkJzoKLQkJCQkJCXJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChieXRlKSdpJzoKLQkJCQkJCXN3aXRjaCAobmFtZVsxXSkKLQkJCQkJCXsKLQkJCQkJCQljYXNlIChieXRlKSc4JzoKLQkJCQkJCQkJcmVzdWx0ID0gVFR5cGUuQnl0ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAoYnl0ZSknMSc6Ci0JCQkJCQkJCXJlc3VsdCA9IFRUeXBlLkkxNjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAoYnl0ZSknMyc6Ci0JCQkJCQkJCXJlc3VsdCA9IFRUeXBlLkkzMjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAoYnl0ZSknNic6Ci0JCQkJCQkJCXJlc3VsdCA9IFRUeXBlLkk2NDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoYnl0ZSknbCc6Ci0JCQkJCQlyZXN1bHQgPSBUVHlwZS5MaXN0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ20nOgotCQkJCQkJcmVzdWx0ID0gVFR5cGUuTWFwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ3InOgotCQkJCQkJcmVzdWx0ID0gVFR5cGUuU3RydWN0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ3MnOgotCQkJCQkJaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ3QnKQotCQkJCQkJewotCQkJCQkJCXJlc3VsdCA9IFRUeXBlLlN0cmluZzsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ2UnKQotCQkJCQkJewotCQkJCQkJCXJlc3VsdCA9IFRUeXBlLlNldDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChieXRlKSd0JzoKLQkJCQkJCXJlc3VsdCA9IFRUeXBlLkJvb2w7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAotCQkJCQkJCQkJCQkgIlVucmVjb2duaXplZCB0eXBlIik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRUeXBlIEdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBUVHlwZSByZXN1bHQgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgaWYgKG5hbWUuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknbCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ20nOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ3InOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpJ2UnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKLQkJLy8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycwotCQkvLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKLQkJewotCQkJcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQorICAgICAgICAvLy8gaW5zZXJ0aW5nL1JlYWRpbmcgYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzCisgICAgICAgIC8vLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CiAKLQkJCXB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKLQkJCXsKLQkJCQl0aGlzLnByb3RvID0gcHJvdG87Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgSlNPTkJhc2VDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKCkgeyB9CisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKCkgeyB9CiAKLQkJCXB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVhZCgpIHsgfQorICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWFkKCkgeyB9CiAKLQkJCXB1YmxpYyB2aXJ0dWFsIGJvb2wgRXNjYXBlTnVtYmVycygpIHsgcmV0dXJuIGZhbHNlOyB9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgRXNjYXBlTnVtYmVycygpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29tbWFzIGJlZm9yZSBlYWNoIGl0ZW0gZXhjZXB0Ci0JCS8vLyBmb3IgdGhlIGZpcnN0IG9uZQotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKLQkJewotCQkJcHVibGljIEpTT05MaXN0Q29udGV4dChUSlNPTlByb3RvY29sIHByb3RvY29sKQotCQkJCTogYmFzZShwcm90b2NvbCkKLQkJCXsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vIGZvciB0aGUgZmlyc3Qgb25lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEpTT05MaXN0Q29udGV4dChUSlNPTlByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKIAotCQkJfQorICAgICAgICAgICAgfQogCi0JCQlwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGZpcnN0ID0gdHJ1ZTsKIAotCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByb3RvLnRyYW5zLldyaXRlKENPTU1BKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuV3JpdGUoQ09NTUEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZCgpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKENPTU1BKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhcihDT01NQSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29sb25zIGJlZm9yZSB0aGUgdmFsdWUgcG9ydGlvbgotCQkvLy8gb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KLQkJLy8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKLQkJLy8vIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0Ci0JCXsKLQkJCXB1YmxpYyBKU09OUGFpckNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKLQkJCQk6IGJhc2UocHJvdG8pCi0JCQl7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgorICAgICAgICAvLy8gYWRkaXRpb24sIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZQorICAgICAgICAvLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBKU09OUGFpckNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG8pCisgICAgICAgICAgICB7CiAKLQkJCX0KKyAgICAgICAgICAgIH0KIAotCQkJcHJpdmF0ZSBib29sIGZpcnN0ID0gdHJ1ZTsKLQkJCXByaXZhdGUgYm9vbCBjb2xvbiA9IHRydWU7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGNvbG9uID0gdHJ1ZTsKIAotCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCWNvbG9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJvdG8udHJhbnMuV3JpdGUoY29sb24gPyBDT0xPTiA6IENPTU1BKTsKLQkJCQkJY29sb24gPSAhY29sb247Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuV3JpdGUoY29sb24gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgICAgICAgICAgICAgY29sb24gPSAhY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkKCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQljb2xvbiA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByb3RvLlJlYWRKU09OU3ludGF4Q2hhcihjb2xvbiA/IENPTE9OIDogQ09NTUEpOwotCQkJCQljb2xvbiA9ICFjb2xvbjsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhcihjb2xvbiA/IENPTE9OIDogQ09NTUEpOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBvdmVycmlkZSBib29sIEVzY2FwZU51bWJlcnMoKQotCQkJewotCQkJCXJldHVybiBjb2xvbjsKLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXNjYXBlTnVtYmVycygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCi0JCXsKLQkJCXByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIExvb2thaGVhZFJlYWRlcgorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgVEpTT05Qcm90b2NvbCBwcm90bzsKIAotCQkJcHVibGljIExvb2thaGVhZFJlYWRlcihUSlNPTlByb3RvY29sIHByb3RvKQotCQkJewotCQkJCXRoaXMucHJvdG8gPSBwcm90bzsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBMb29rYWhlYWRSZWFkZXIoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CiAKLQkJCXByaXZhdGUgYm9vbCBoYXNEYXRhOwotCQkJcHJpdmF0ZSBieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGhhc0RhdGE7CisgICAgICAgICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMV07CiAKLQkJCS8vLzxzdW1tYXJ5PgotCQkJLy8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKLQkJCS8vLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KLQkJCS8vLzwvc3VtbWFyeT4KLQkJCXB1YmxpYyBieXRlIFJlYWQoKQotCQkJewotCQkJCWlmIChoYXNEYXRhKQotCQkJCXsKLQkJCQkJaGFzRGF0YSA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcm90by50cmFucy5SZWFkQWxsKGRhdGEsIDAsIDEpOwotCQkJCX0KLQkJCQlyZXR1cm4gZGF0YVswXTsKLQkJCX0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGJ5dGUgUmVhZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0RhdGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOworICAgICAgICAgICAgfQogCi0JCQkvLy88c3VtbWFyeT4KLQkJCS8vLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCi0JCQkvLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KLQkJCS8vLzwvc3VtbWFyeT4KLQkJCXB1YmxpYyBieXRlIFBlZWsoKQotCQkJewotCQkJCWlmICghaGFzRGF0YSkKLQkJCQl7Ci0JCQkJCXByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7Ci0JCQkJfQotCQkJCWhhc0RhdGEgPSB0cnVlOwotCQkJCXJldHVybiBkYXRhWzBdOwotCQkJfQotCQl9CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgICAgICAgICAgLy8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGJ5dGUgUGVlaygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuUmVhZEFsbChkYXRhLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBEZWZhdWx0IGVuY29kaW5nCi0JCXByb3RlY3RlZCBFbmNvZGluZyB1dGY4RW5jb2RpbmcgPSBVVEY4RW5jb2RpbmcuVVRGODsKKyAgICAgICAgLy8gRGVmYXVsdCBlbmNvZGluZworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgdXRmOEVuY29kaW5nID0gVVRGOEVuY29kaW5nLlVURjg7CiAKLQkJLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCi0JCXByb3RlY3RlZCBTdGFjazxKU09OQmFzZUNvbnRleHQ+IGNvbnRleHRTdGFjayA9IG5ldyBTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisgICAgICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8SlNPTkJhc2VDb250ZXh0PiBjb250ZXh0U3RhY2sgPSBuZXcgU3RhY2s8SlNPTkJhc2VDb250ZXh0PigpOwogCi0JCS8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgotCQlwcm90ZWN0ZWQgSlNPTkJhc2VDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgICAgICBwcm90ZWN0ZWQgSlNPTkJhc2VDb250ZXh0IGNvbnRleHQ7CiAKLQkJLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKLQkJcHJvdGVjdGVkIExvb2thaGVhZFJlYWRlciByZWFkZXI7CisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgcmVhZGVyOwogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCi0JCXsKLQkJCWNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOwotCQkJY29udGV4dCA9IGM7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFB1c2hDb250ZXh0KEpTT05CYXNlQ29udGV4dCBjKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0U3RhY2suUHVzaChjb250ZXh0KTsKKyAgICAgICAgICAgIGNvbnRleHQgPSBjOworICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKLQkJewotCQkJY29udGV4dCA9IGNvbnRleHRTdGFjay5Qb3AoKTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFRKU09OUHJvdG9jb2wgQ29uc3RydWN0b3IKLQkJLy8vPC9zdW1tYXJ5PgotCQlwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQkJOiBiYXNlKHRyYW5zKQotCQl7Ci0JCQljb250ZXh0ID0gbmV3IEpTT05CYXNlQ29udGV4dCh0aGlzKTsKLQkJCXJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVEpTT05Qcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0ID0gbmV3IEpTT05CYXNlQ29udGV4dCh0aGlzKTsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgICAgIH0KIAotCQkvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCi0JCXByaXZhdGUgYnl0ZVtdIHRlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcworICAgICAgICBwcml2YXRlIGJ5dGVbXSB0ZW1wQnVmZmVyID0gbmV3IGJ5dGVbNF07CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JCS8vLyBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQuUmVhZAotCQkvLy8gYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQotCQl7Ci0JCQlieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKLQkJCWlmIChjaCAhPSBiWzBdKQotCQkJewotCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLQkJCQkJCQkJCQkJICJVbmV4cGVjdGVkIGNoYXJhY3RlcjoiICsgKGNoYXIpY2gpOwotCQkJfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgLy8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSBiWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjoiICsgKGNoYXIpY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKLQkJLy8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhWYWwoYnl0ZSBjaCkKLQkJewotCQkJaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQotCQkJewotCQkJCXJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnMCcpOwotCQkJfQotCQkJZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpCi0JCQl7Ci0JCQkJcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKLQkJCX0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4VmFsKGJ5dGUgY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGUgSGV4Q2hhcihieXRlIHZhbCkKLQkJewotCQkJdmFsICY9IDB4MEY7Ci0JCQlpZiAodmFsIDwgMTApCi0JCQl7Ci0JCQkJcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKLQkJCX0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhDaGFyKGJ5dGUgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgJj0gMHgwRjsKKyAgICAgICAgICAgIGlmICh2YWwgPCAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsIC09IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTlN0cmluZyhieXRlW10gYikKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQkJaW50IGxlbiA9IGIuTGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCXsKLQkJCQlpZiAoKGJbaV0gJiAweDAwRkYpID49IDB4MzApCi0JCQkJewotCQkJCQlpZiAoYltpXSA9PSBCQUNLU0xBU0hbMF0pCi0JCQkJCXsKLQkJCQkJCXRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7Ci0JCQkJCQl0cmFucy5Xcml0ZShCQUNLU0xBU0gpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoYiwgaSwgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGVtcEJ1ZmZlclswXSA9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKLQkJCQkJaWYgKHRlbXBCdWZmZXJbMF0gPT0gMSkKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoYiwgaSwgMSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGVtcEJ1ZmZlclswXSA+IDEpCi0JCQkJCXsKLQkJCQkJCXRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7Ci0JCQkJCQl0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCAxKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXRyYW5zLldyaXRlKEVTQ1NFUSk7Ci0JCQkJCQl0ZW1wQnVmZmVyWzBdID0gSGV4Q2hhcigoYnl0ZSkoYltpXSA+PiA0KSk7Ci0JCQkJCQl0ZW1wQnVmZmVyWzFdID0gSGV4Q2hhcihiW2ldKTsKLQkJCQkJCXRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgICAgICBpbnQgbGVuID0gYi5MZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYltpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiW2ldID09IEJBQ0tTTEFTSFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyWzBdID0gSlNPTl9DSEFSX1RBQkxFW2JbaV1dOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wQnVmZmVyWzBdID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoRVNDU0VRKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMF0gPSBIZXhDaGFyKChieXRlKShiW2ldID4+IDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMV0gPSBIZXhDaGFyKGJbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQotCQkvLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCi0JCXsKLQkJCWNvbnRleHQuV3JpdGUoKTsKLQkJCVN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCisgICAgICAgIC8vLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKIAotCQkJYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogCi0JCQl0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CiAKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQotCQkvLy8gY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgV3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgdm9pZCBXcml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJU3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygpOwotCQkJYm9vbCBzcGVjaWFsID0gZmFsc2U7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAgICAgLy8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICBzdHJpbmcgc3RyID0gbnVtLlRvU3RyaW5nKCJHMTciLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIGJvb2wgc3BlY2lhbCA9IGZhbHNlOwogCi0JCQlzd2l0Y2ggKHN0clswXSkKLQkJCXsKLQkJCQljYXNlICdOJzogLy8gTmFOCi0JCQkJY2FzZSAnSSc6IC8vIEluZmluaXR5Ci0JCQkJCXNwZWNpYWwgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlICctJzoKLQkJCQkJaWYgKHN0clsxXSA9PSAnSScpCi0JCQkJCXsgLy8gLUluZmluaXR5Ci0JCQkJCQlzcGVjaWFsID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KKyAgICAgICAgICAgIHN3aXRjaCAoc3RyWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ04nOiAvLyBOYU4KKyAgICAgICAgICAgICAgICBjYXNlICdJJzogLy8gSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyWzFdID09ICdJJykKKyAgICAgICAgICAgICAgICAgICAgeyAvLyAtSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0JCQlib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisgICAgICAgICAgICBib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CiAKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CiAKLQkJCXRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKIAotCQkJaWYgKGVzY2FwZU51bSkKLQkJCQl0cmFucy5Xcml0ZShRVU9URSk7Ci0JCX0KLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQKLQkJLy8vIGRhdGEKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OQmFzZTY0KGJ5dGVbXSBiKQotCQl7Ci0JCQljb250ZXh0LldyaXRlKCk7Ci0JCQl0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQKKyAgICAgICAgLy8vIGRhdGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkJhc2U2NChieXRlW10gYikKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogCi0JCQlpbnQgbGVuID0gYi5MZW5ndGg7Ci0JCQlpbnQgb2ZmID0gMDsKKyAgICAgICAgICAgIGludCBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIGludCBvZmYgPSAwOwogCi0JCQl3aGlsZSAobGVuID49IDMpCi0JCQl7Ci0JCQkJLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCi0JCQkJVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIDMsIHRlbXBCdWZmZXIsIDApOwotCQkJCXRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDQpOwotCQkJCW9mZiArPSAzOwotCQkJCWxlbiAtPSAzOwotCQkJfQotCQkJaWYgKGxlbiA+IDApCi0JCQl7Ci0JCQkJLy8gRW5jb2RlIHJlbWFpbmRlcgotCQkJCVRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCBsZW4sIHRlbXBCdWZmZXIsIDApOwotCQkJCXRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIGxlbiArIDEpOwotCQkJfQorICAgICAgICAgICAgd2hpbGUgKGxlbiA+PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCAzLCB0ZW1wQnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCA0KTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gMzsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEVuY29kZSByZW1haW5kZXIKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgbGVuLCB0ZW1wQnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCBsZW4gKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoTEJSQUNFKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFJCUkFDRSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKExCUkFDS0VUKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkFycmF5RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoUkJSQUNLRVQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKKworICAgICAgICAgICAgYnl0ZVtdIGIgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhiKTsKKworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZyltZXNzYWdlLlR5cGUpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OT2JqZWN0U3RhcnQoKQotCQl7Ci0JCQljb250ZXh0LldyaXRlKCk7Ci0JCQl0cmFucy5Xcml0ZShMQlJBQ0UpOwotCQkJUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBXcml0ZUpTT05PYmplY3RFbmQoKQotCQl7Ci0JCQlQb3BDb250ZXh0KCk7Ci0JCQl0cmFucy5Xcml0ZShSQlJBQ0UpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoZmllbGQuSUQpOworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC5UeXBlKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OQXJyYXlTdGFydCgpCi0JCXsKLQkJCWNvbnRleHQuV3JpdGUoKTsKLQkJCXRyYW5zLldyaXRlKExCUkFDS0VUKTsKLQkJCVB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheUVuZCgpCi0JCXsKLQkJCVBvcENvbnRleHQoKTsKLQkJCXRyYW5zLldyaXRlKFJCUkFDS0VUKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpIHsgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLQkJCVdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChtYXAuS2V5VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5WYWx1ZVR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIobWFwLkNvdW50KTsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIH0KIAotCQkJYnl0ZVtdIGIgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKLQkJCVdyaXRlSlNPTlN0cmluZyhiKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQkJV3JpdGVKU09OSW50ZWdlcigobG9uZyltZXNzYWdlLlR5cGUpOwotCQkJV3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLlNlcUlEKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobGlzdC5FbGVtZW50VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihsaXN0LkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHIpCi0JCXsKLQkJCVdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5FbGVtZW50VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihzZXQuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05PYmplY3RFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQotCQl7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKLQkJCVdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQuVHlwZSkpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoYiA/IChsb25nKTEgOiAobG9uZykwKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05PYmplY3RFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZyliKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZylpMTYpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKLQkJewotCQkJV3JpdGVKU09OQXJyYXlTdGFydCgpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5LZXlUeXBlKSk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLlZhbHVlVHlwZSkpOwotCQkJV3JpdGVKU09OSW50ZWdlcihtYXAuQ291bnQpOwotCQkJV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKChsb25nKWkzMik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCi0JCXsKLQkJCVdyaXRlSlNPTk9iamVjdEVuZCgpOwotCQkJV3JpdGVKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihpNjQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKLQkJewotCQkJV3JpdGVKU09OQXJyYXlTdGFydCgpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuRWxlbWVudFR5cGUpKTsKLQkJCVdyaXRlSlNPTkludGVnZXIobGlzdC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGR1YikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoYik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoc2V0LkVsZW1lbnRUeXBlKSk7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKHNldC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQmFzZTY0KGJpbik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgICAgICovCiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKLQkJewotCQkJV3JpdGVKU09OSW50ZWdlcihiID8gKGxvbmcpMSA6IChsb25nKTApOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgUmVhZGluZyBmcm9tIHRoZQorICAgICAgICAvLy8gY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTlN0cmluZyhib29sIHNraXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gYnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgTGlzdDxjaGFyPiBjb2RldW5pdHMgPSBuZXcgTGlzdDxjaGFyPigpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIGIpCi0JCXsKLQkJCVdyaXRlSlNPTkludGVnZXIoKGxvbmcpYik7Ci0JCX0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpCi0JCXsKLQkJCVdyaXRlSlNPTkludGVnZXIoKGxvbmcpaTE2KTsKLQkJfQorICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gUVVPVEVbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKLQkJewotCQkJV3JpdGVKU09OSW50ZWdlcigobG9uZylpMzIpOwotCQl9CisgICAgICAgICAgICAgICAgLy8gZXNjYXBlZD8KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gRVNDU0VRWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQotCQl7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKGk2NCk7Ci0JCX0KKyAgICAgICAgICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgXD8KKyAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoICE9IEVTQ1NFUVsxXSkgIC8vIGNvbnRyb2wgY2hhcnMgbGlrZSBcbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZiA9IEFycmF5LkluZGV4T2YoRVNDQVBFX0NIQVJTLCAoY2hhciljaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoID0gRVNDQVBFX0NIQVJfVkFMU1tvZmZdOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUobmV3IGJ5dGVbXSB7IChieXRlKWNoIH0sIDAsIDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGR1YikKLQkJewotCQkJV3JpdGVKU09ORG91YmxlKGR1Yik7Ci0JCX0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgc3RyKQotCQl7Ci0JCQlieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOwotCQkJV3JpdGVKU09OU3RyaW5nKGIpOwotCQl9CisgICAgICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgICAgICB0cmFucy5SZWFkQWxsKHRlbXBCdWZmZXIsIDAsIDQpOworICAgICAgICAgICAgICAgIHZhciB3Y2ggPSAoc2hvcnQpKChIZXhWYWwoKGJ5dGUpdGVtcEJ1ZmZlclswXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4VmFsKHRlbXBCdWZmZXJbM10pKTsKKyAgICAgICAgICAgICAgICBpZiAoQ2hhci5Jc0hpZ2hTdXJyb2dhdGUoKGNoYXIpd2NoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKENoYXIuSXNMb3dTdXJyb2dhdGUoKGNoYXIpd2NoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhjb2RldW5pdHMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKHRtcCwgMCwgdG1wLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5DbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ldyBjaGFyW10geyAoY2hhcil3Y2ggfSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQotCQl7Ci0JCQlXcml0ZUpTT05CYXNlNjQoYmluKTsKLQkJfQogCi0JCS8qKgotCQkgKiBSZWFkaW5nIG1ldGhvZHMuCi0JCSAqLworICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCi0JCS8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKLQkJewotCQkJTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXIuVG9BcnJheSgpOworICAgICAgICB9CiAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbCBJc0pTT05OdW1lcmljKGJ5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJysnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJy0nOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJy4nOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzAnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzEnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzInOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzMnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzQnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzUnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzYnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzcnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzgnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzknOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ0UnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2UnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCQlpZiAoIXNraXBDb250ZXh0KQotCQkJewotCQkJCWNvbnRleHQuUmVhZCgpOwotCQkJfQotCQkJUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKLQkJCXdoaWxlICh0cnVlKQotCQkJewotCQkJCWJ5dGUgY2ggPSByZWFkZXIuUmVhZCgpOwotCQkJCWlmIChjaCA9PSBRVU9URVswXSkKLQkJCQl7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY2ggPT0gRVNDU0VRWzBdKQotCQkJCXsKLQkJCQkJY2ggPSByZWFkZXIuUmVhZCgpOwotCQkJCQlpZiAoY2ggPT0gRVNDU0VRWzFdKQotCQkJCQl7Ci0JCQkJCQlSZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0JCQkJCQlSZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0JCQkJCQl0cmFucy5SZWFkQWxsKHRlbXBCdWZmZXIsIDAsIDIpOwotCQkJCQkJY2ggPSAoYnl0ZSkoKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzBdKSA8PCA0KSArIEhleFZhbCh0ZW1wQnVmZmVyWzFdKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpbnQgb2ZmID0gQXJyYXkuSW5kZXhPZihFU0NBUEVfQ0hBUlMsIChjaGFyKWNoKTsKLQkJCQkJCWlmIChvZmYgPT0gLTEpCi0JCQkJCQl7Ci0JCQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkJCQkgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOwotCQkJCQkJfQotCQkJCQkJY2ggPSBFU0NBUEVfQ0hBUl9WQUxTW29mZl07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIuVG9BcnJheSgpOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAgICAgLy8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmJsZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgICAgICAgICBpZiAoIUlzSlNPTk51bWVyaWMoY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmJsZC5BcHBlbmQoKGNoYXIpcmVhZGVyLlJlYWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RyYmxkLlRvU3RyaW5nKCk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgYm9vbCBJc0pTT05OdW1lcmljKGJ5dGUgYikKLQkJewotCQkJc3dpdGNoIChiKQotCQkJewotCQkJCWNhc2UgKGJ5dGUpJysnOgotCQkJCWNhc2UgKGJ5dGUpJy0nOgotCQkJCWNhc2UgKGJ5dGUpJy4nOgotCQkJCWNhc2UgKGJ5dGUpJzAnOgotCQkJCWNhc2UgKGJ5dGUpJzEnOgotCQkJCWNhc2UgKGJ5dGUpJzInOgotCQkJCWNhc2UgKGJ5dGUpJzMnOgotCQkJCWNhc2UgKGJ5dGUpJzQnOgotCQkJCWNhc2UgKGJ5dGUpJzUnOgotCQkJCWNhc2UgKGJ5dGUpJzYnOgotCQkJCWNhc2UgKGJ5dGUpJzcnOgotCQkJCWNhc2UgKGJ5dGUpJzgnOgotCQkJCWNhc2UgKGJ5dGUpJzknOgotCQkJCWNhc2UgKGJ5dGUpJ0UnOgotCQkJCWNhc2UgKGJ5dGUpJ2UnOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgbG9uZyBSZWFkSlNPTkludGVnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcwotCQkvLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgotCQkvLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIFN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCi0JCXsKLQkJCVN0cmluZ0J1aWxkZXIgc3RyYmxkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXdoaWxlICh0cnVlKQotCQkJewotCQkJCWJ5dGUgY2ggPSByZWFkZXIuUGVlaygpOwotCQkJCWlmICghSXNKU09OTnVtZXJpYyhjaCkpCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJc3RyYmxkLkFwcGVuZCgoY2hhcilyZWFkZXIuUmVhZCgpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKLQkJfQorICAgICAgICAgICAgc3RyaW5nIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIGxvbmcgUmVhZEpTT05JbnRlZ2VyKCkKLQkJewotCQkJY29udGV4dC5SZWFkKCk7Ci0JCQlpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCi0JCQl7Ci0JCQkJUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKLQkJCX0KLQkJCVN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOwotCQkJaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQotCQkJewotCQkJCVJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7Ci0JCQl9Ci0JCQl0cnkKLQkJCXsKLQkJCQlyZXR1cm4gSW50NjQuUGFyc2Uoc3RyKTsKLQkJCX0KLQkJCWNhdGNoIChGb3JtYXRFeGNlcHRpb24pCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludDY0LlBhcnNlKHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcwotCQkvLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIGRvdWJsZSBSZWFkSlNPTkRvdWJsZSgpCi0JCXsKLQkJCWNvbnRleHQuUmVhZCgpOwotCQkJaWYgKHJlYWRlci5QZWVrKCkgPT0gUVVPVEVbMF0pCi0JCQl7Ci0JCQkJYnl0ZVtdIGFyciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOwotCQkJCWRvdWJsZSBkdWIgPSBEb3VibGUuUGFyc2UodXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIpKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgICAgICAgIC8vLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGRvdWJsZSBSZWFkSlNPTkRvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICAgICAgaWYgKHJlYWRlci5QZWVrKCkgPT0gUVVPVEVbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGFyciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOworICAgICAgICAgICAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUuUGFyc2UodXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsIDAsIGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKIAotCQkJCWlmICghY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkgJiYgIURvdWJsZS5Jc05hTihkdWIpICYmCi0JCQkJCSFEb3VibGUuSXNJbmZpbml0eShkdWIpKQotCQkJCXsKLQkJCQkJLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0JCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLQkJCQkJCQkJCQkJCSAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGR1YjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCi0JCQkJewotCQkJCQkvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQotCQkJCQlSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOwotCQkJCX0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXJldHVybiBEb3VibGUuUGFyc2UoUmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChGb3JtYXRFeGNlcHRpb24pCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0JCQkJCQkJCQkJCQkgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJiAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkdWI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLlBhcnNlKFJlYWRKU09OTnVtZXJpY0NoYXJzKCksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBieXRlW10gUmVhZEpTT05CYXNlNjQoKQotCQl7Ci0JCQlieXRlW10gYiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLQkJCWludCBsZW4gPSBiLkxlbmd0aDsKLQkJCWludCBvZmYgPSAwOwotCQkJaW50IHNpemUgPSAwOwotCQkJd2hpbGUgKGxlbiA+PSA0KQotCQkJewotCQkJCS8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQotCQkJCVRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKLQkJCQlvZmYgKz0gNDsKLQkJCQlsZW4gLT0gNDsKLQkJCQlzaXplICs9IDM7Ci0JCQl9Ci0JCQkvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKLQkJCS8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKLQkJCWlmIChsZW4gPiAxKQotCQkJewotCQkJCS8vIERlY29kZSByZW1haW5kZXIKLQkJCQlUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKLQkJCQlzaXplICs9IGxlbiAtIDE7Ci0JCQl9Ci0JCQkvLyBTYWRseSB3ZSBtdXN0IGNvcHkgdGhlIGJ5dGVbXSAoYW55IHdheSBhcm91bmQgdGhpcz8pCi0JCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlBcnJheS5Db3B5KGIsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICAgICBpbnQgbGVuID0gYi5MZW5ndGg7CisgICAgICAgICAgICBpbnQgb2ZmID0gMDsKKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlICgobGVuID4gMCkgJiYgKGJbbGVuIC0gMV0gPT0gJz0nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBvZmYgKz0gNDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgICAgICAgICBzaXplICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAgICAgICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTYWRseSB3ZSBtdXN0IGNvcHkgdGhlIGJ5dGVbXSAoYW55IHdheSBhcm91bmQgdGhpcz8pCisgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBBcnJheS5Db3B5KGIsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0U3RhcnQoKQotCQl7Ci0JCQljb250ZXh0LlJlYWQoKTsKLQkJCVJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0UpOwotCQkJUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0UpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgUmVhZEpTT05PYmplY3RFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKTsKLQkJCVBvcENvbnRleHQoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgUmVhZEpTT05PYmplY3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBSZWFkSlNPTkFycmF5U3RhcnQoKQotCQl7Ci0JCQljb250ZXh0LlJlYWQoKTsKLQkJCVJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCk7Ci0JCQlQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgUmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgUmVhZEpTT05BcnJheUVuZCgpCi0JCXsKLQkJCVJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0tFVCk7Ci0JCQlQb3BDb250ZXh0KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OQXJyYXlFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpOworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQotCQl7Ci0JCQlUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7Ci0JCQlSZWFkSlNPTkFycmF5U3RhcnQoKTsKLQkJCWlmIChSZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKQotCQkJewotCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotCQkJCQkJCQkJCQkgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgaWYgKFJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT04pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgICAgICAgICB9CiAKLQkJCW1lc3NhZ2UuTmFtZSA9IHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLQkJCW1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQltZXNzYWdlLlNlcUlEID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9CisgICAgICAgICAgICB2YXIgYnVmID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gdXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSlSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpCi0JCXsKLQkJCVJlYWRKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCi0JCXsKLQkJCVJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQkJCXJldHVybiBuZXcgVFN0cnVjdCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCi0JCXsKLQkJCVJlYWRKU09OT2JqZWN0RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKLQkJewotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOwotCQkJYnl0ZSBjaCA9IHJlYWRlci5QZWVrKCk7Ci0JCQlpZiAoY2ggPT0gUkJSQUNFWzBdKQotCQkJewotCQkJCWZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZpZWxkLklEID0gKHNob3J0KVJlYWRKU09OSW50ZWdlcigpOwotCQkJCVJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQkJCQlmaWVsZC5UeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLQkJCX0KLQkJCXJldHVybiBmaWVsZDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgYnl0ZSBjaCA9IHJlYWRlci5QZWVrKCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gUkJSQUNFWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gKHNob3J0KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRGaWVsZEVuZCgpCi0JCXsKLQkJCVJlYWRKU09OT2JqZWN0RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCi0JCXsKLQkJCVRNYXAgbWFwID0gbmV3IFRNYXAoKTsKLQkJCVJlYWRKU09OQXJyYXlTdGFydCgpOwotCQkJbWFwLktleVR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotCQkJbWFwLlZhbHVlVHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCQltYXAuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOwotCQkJUmVhZEpTT05PYmplY3RTdGFydCgpOwotCQkJcmV0dXJuIG1hcDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWFwIG1hcCA9IG5ldyBUTWFwKCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIG1hcC5LZXlUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgICAgIG1hcC5WYWx1ZVR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKLQkJewotCQkJUmVhZEpTT05PYmplY3RFbmQoKTsKLQkJCVJlYWRKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKLQkJewotCQkJVExpc3QgbGlzdCA9IG5ldyBUTGlzdCgpOwotCQkJUmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0JCQlsaXN0LkVsZW1lbnRUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLQkJCWxpc3QuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOwotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIGxpc3QuRWxlbWVudFR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkKLQkJewotCQkJUmVhZEpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKLQkJewotCQkJVFNldCBzZXQgPSBuZXcgVFNldCgpOwotCQkJUmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0JCQlzZXQuRWxlbWVudFR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotCQkJc2V0LkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKLQkJCXJldHVybiBzZXQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVFNldCBzZXQgPSBuZXcgVFNldCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBzZXQuRWxlbWVudFR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgc2V0LkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKLQkJewotCQkJUmVhZEpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCi0JCXsKLQkJCXJldHVybiAoUmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZSk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWUpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJ5dGUgUmVhZEJ5dGUoKQotCQl7Ci0JCQlyZXR1cm4gKGJ5dGUpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSlSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKLQkJewotCQkJcmV0dXJuIChzaG9ydClSZWFkSlNPTkludGVnZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQotCQl7Ci0JCQlyZXR1cm4gKGludClSZWFkSlNPTkludGVnZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQotCQl7Ci0JCQlyZXR1cm4gKGxvbmcpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZylSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCi0JCXsKLQkJCXJldHVybiBSZWFkSlNPTkRvdWJsZSgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKLQkJewotCQkJcmV0dXJuIFJlYWRKU09OU3RyaW5nKGZhbHNlKS5Ub1N0cmluZygpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKLQkJewotCQkJcmV0dXJuIFJlYWRKU09OQmFzZTY0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlYWRKU09OQmFzZTY0KCk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCmluZGV4IGE2NTFlYjEuLjBjOGYyMTQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCkBAIC0yNywyOCArMjcsMjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVExpc3QKLQl7Ci0JCXByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7Ci0JCXByaXZhdGUgaW50IGNvdW50OworICAgIHB1YmxpYyBzdHJ1Y3QgVExpc3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OwogCi0JCXB1YmxpYyBUTGlzdChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gZWxlbWVudFR5cGU7IH0KLQkJCXNldCB7IGVsZW1lbnRUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBjb3VudDsgfQotCQkJc2V0IHsgY291bnQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb3VudDsgfQorICAgICAgICAgICAgc2V0IHsgY291bnQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKaW5kZXggNWM4ZDY1MC4uYWJhOWQzYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCkBAIC0yNywzNiArMjcsMzYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVE1hcAotCXsKLQkJcHJpdmF0ZSBUVHlwZSBrZXlUeXBlOwotCQlwcml2YXRlIFRUeXBlIHZhbHVlVHlwZTsKLQkJcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgcHVibGljIHN0cnVjdCBUTWFwCisgICAgeworICAgICAgICBwcml2YXRlIFRUeXBlIGtleVR5cGU7CisgICAgICAgIHByaXZhdGUgVFR5cGUgdmFsdWVUeXBlOworICAgICAgICBwcml2YXRlIGludCBjb3VudDsKIAotCQlwdWJsaWMgVE1hcChUVHlwZSBrZXlUeXBlLCBUVHlwZSB2YWx1ZVR5cGUsIGludCBjb3VudCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKLQkJCXRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQl9CisgICAgICAgIHB1YmxpYyBUTWFwKFRUeXBlIGtleVR5cGUsIFRUeXBlIHZhbHVlVHlwZSwgaW50IGNvdW50KQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgS2V5VHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4ga2V5VHlwZTsgfQotCQkJc2V0IHsga2V5VHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIEtleVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGtleVR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IGtleVR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIFZhbHVlVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdmFsdWVUeXBlOyB9Ci0JCQlzZXQgeyB2YWx1ZVR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBWYWx1ZVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlVHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgdmFsdWVUeXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgQ291bnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGNvdW50OyB9Ci0JCQlzZXQgeyBjb3VudCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNvdW50OyB9CisgICAgICAgICAgICBzZXQgeyBjb3VudCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCmluZGV4IDhlOTZkYTUuLjM0ODI2M2MgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCkBAIC0yNywzNiArMjcsMzYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKLQl7Ci0JCXByaXZhdGUgc3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgVE1lc3NhZ2VUeXBlIHR5cGU7Ci0JCXByaXZhdGUgaW50IHNlcUlEOworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgVE1lc3NhZ2VUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IHNlcUlEOwogCi0JCXB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnNlcUlEID0gc2VxaWQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRNZXNzYWdlKHN0cmluZyBuYW1lLCBUTWVzc2FnZVR5cGUgdHlwZSwgaW50IHNlcWlkKQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuc2VxSUQgPSBzZXFpZDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdHJpbmcgTmFtZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gbmFtZTsgfQotCQkJc2V0IHsgbmFtZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9CisgICAgICAgICAgICBzZXQgeyBuYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHlwZTsgfQotCQkJc2V0IHsgdHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRNZXNzYWdlVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgICAgICBzZXQgeyB0eXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgU2VxSUQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHNlcUlEOyB9Ci0JCQlzZXQgeyBzZXFJRCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgU2VxSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHNlcUlEOyB9CisgICAgICAgICAgICBzZXQgeyBzZXFJRCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKaW5kZXggYWIwN2NmNi4uYzcwOTFmZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcwpAQCAtMjEsMTEgKzIxLDExIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKLQl7Ci0JCUNhbGwgPSAxLAotCQlSZXBseSA9IDIsCi0JCUV4Y2VwdGlvbiA9IDMsCi0JCU9uZXdheSA9IDQKLQl9CisgICAgcHVibGljIGVudW0gVE1lc3NhZ2VUeXBlCisgICAgeworICAgICAgICBDYWxsID0gMSwKKyAgICAgICAgUmVwbHkgPSAyLAorICAgICAgICBFeGNlcHRpb24gPSAzLAorICAgICAgICBPbmV3YXkgPSA0CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTFjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwxODMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUTXVsdGlwbGV4ZWRQcm9jZXNzb3IiLz4gaXMgYSA8c2VlIGNyZWY9IlRQcm9jZXNzb3IiLz4gYWxsb3dpbmcgYSBzaW5nbGUgPHNlZSBjcmVmPSJUaHJpZnQuU2VydmVyLlRTZXJ2ZXIiLz4KKyAgICAvLy8gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgICAgLy8vIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgLy8vCisgICAgLy8vICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgLy8vICAgICAgICAgIkNhbGN1bGF0b3IiLAorICAgIC8vLyAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAgICAvLy8gICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgIC8vLyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICAgIC8vLworICAgIC8vLyAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCisgICAgeworICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBUUHJvY2Vzc29yPiBTZXJ2aWNlUHJvY2Vzc29yTWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBUUHJvY2Vzc29yPigpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAgICAvLy8gcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBBcmdzOgorICAgICAgICAvLy8gLSBzZXJ2aWNlTmFtZSAgICBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICAgIC8vLyAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihzdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZhaWwoVFByb3RvY29sIG9wcm90LCBUTWVzc2FnZSBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZSBleHR5cGUsIHN0cmluZyBldHh0KQorICAgICAgICB7CisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgICAgIFRNZXNzYWdlIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3TWVzc2FnZSk7CisgICAgICAgICAgICBhcHBleC5Xcml0ZShvcHJvdCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyAtIERpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICAgIC8vLyAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgICAgLy8vIDxwYXJhLz4KKyAgICAgICAgLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgICAgLy8vIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IKKyAgICAgICAgLy8vIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KQorICAgICAgICB7CisgICAgICAgICAgICAvKiAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLiAqLworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOworCisgICAgICAgICAgICAgICAgaWYgKChtZXNzYWdlLlR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNhbGwpICYmIChtZXNzYWdlLlR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9uZXdheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UuTmFtZS5JbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5OYW1lICsgIi4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgICAgICAgICAgICAgc3RyaW5nIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5OYW1lLlN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBhY3R1YWxQcm9jZXNzb3I7CisgICAgICAgICAgICAgICAgaWYgKCFTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKHNlcnZpY2VOYW1lLCBvdXQgYWN0dWFsUHJvY2Vzc29yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgUmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIFRNZXNzYWdlIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKHNlcnZpY2VOYW1lLkxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5MZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG5ld01lc3NhZ2UpLCBvcHJvdCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBzaW1pbGFyIHRvIGFsbCBvdGhlciBwcm9jZXNzb3JzCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICAgICAgICAvLy8gIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAgICAgICAgLy8vICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNZXNzYWdlIE1zZ0JlZ2luOworCisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLk1zZ0JlZ2luID0gbWVzc2FnZUJlZ2luOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1zZ0JlZ2luOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZDQyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDEwMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgICAgLy8vIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vLyB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgIC8vLyBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgICAgLy8vIDxjb2RlPgorICAgIC8vLyAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgLy8vICAgICB0cmFuc3BvcnQub3BlbigpOworICAgIC8vLworICAgIC8vLyAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIC8vLworICAgIC8vLyAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgLy8vICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAvLy8gICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgICAgLy8vCisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgIHsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmljZU5hbWU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAgICAvLy8gbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8cGFyYW1yZWYgbmFtZT0ic2VydmljZU5hbWUiLz4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgICAgLy8vIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgIC8vLyB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2wiPllvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wiLz4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZXJ2aWNlTmFtZSI+VGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIHN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idE1lc3NhZ2UiPlRoZSBvcmlnaW5hbCBtZXNzYWdlLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRNZXNzYWdlLlR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ2FsbDoKKyAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PbmV3YXk6CisgICAgICAgICAgICAgICAgICAgIGJhc2UuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyB0TWVzc2FnZS5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdE1lc3NhZ2UuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLlNlcUlEKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5Xcml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCmluZGV4IDRmNzIzZGQuLmRkN2E2ZTAgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKQEAgLTI3LDY1ICsyNywxMTYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKLQl7Ci0JCXByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9SRUNVUlNJT05fREVQVEggPSA2NDsKIAotCQlwcm90ZWN0ZWQgVFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCi0JCXsKLQkJCXRoaXMudHJhbnMgPSB0cmFuczsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgcHJvdGVjdGVkIGludCByZWN1cnNpb25MaW1pdDsKKyAgICAgICAgcHJvdGVjdGVkIGludCByZWN1cnNpb25EZXB0aDsKIAotCQlwdWJsaWMgVFRyYW5zcG9ydCBUcmFuc3BvcnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRyYW5zOyB9Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgICAgICAgICB0aGlzLnJlY3Vyc2lvbkxpbWl0ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgICAgICAgICB0aGlzLnJlY3Vyc2lvbkRlcHRoID0gMDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZFN0b3AoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQm9vbChib29sIGIpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJ5dGUoYnl0ZSBiKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMzIoaW50IGkzMik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpOwotCQlwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKSB7Ci0JCQlXcml0ZUJpbmFyeShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpKTsKLQkJfQotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYik7CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJhbnM7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBhYnN0cmFjdCBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRNZXNzYWdlRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkU3RydWN0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBURmllbGQgUmVhZEZpZWxkQmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZEZpZWxkRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBUTWFwIFJlYWRNYXBCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWFwRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBUTGlzdCBSZWFkTGlzdEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRMaXN0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBUU2V0IFJlYWRTZXRCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkU2V0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBib29sIFJlYWRCb29sKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBieXRlIFJlYWRCeXRlKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBzaG9ydCBSZWFkSTE2KCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZEkzMigpOwotCQlwdWJsaWMgYWJzdHJhY3QgbG9uZyBSZWFkSTY0KCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgUmVhZERvdWJsZSgpOwotCQlwdWJsaWMgdmlydHVhbCBzdHJpbmcgUmVhZFN0cmluZygpIHsKLQkJICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhSZWFkQmluYXJ5KCkpOwotCQl9Ci0JCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gUmVhZEJpbmFyeSgpOwotCX0KKyAgICAgICAgcHVibGljIGludCBSZWN1cnNpb25MaW1pdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVjdXJzaW9uTGltaXQ7IH0KKyAgICAgICAgICAgIHNldCB7IHJlY3Vyc2lvbkxpbWl0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkRlcHRoIDwgcmVjdXJzaW9uTGltaXQpCisgICAgICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zIGlzIElEaXNwb3NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgKHRyYW5zIGFzIElEaXNwb3NhYmxlKS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Yyk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1hcEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVMaXN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVNldEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJvb2woYm9vbCBiKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUkzMihpbnQgaTMyKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZCk7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQmluYXJ5KEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocykpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWVzc2FnZUVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFN0cnVjdEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRGaWVsZEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVE1hcCBSZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1hcEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVExpc3QgUmVhZExpc3RCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTGlzdEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVFNldCBSZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFNldEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBSZWFkQm9vbCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc2J5dGUgUmVhZEJ5dGUoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHNob3J0IFJlYWRJMTYoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBSZWFkSTMyKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIFJlYWRJNjQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBSZWFkRG91YmxlKCk7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gUmVhZEJpbmFyeSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAwMDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCkBAIC0wLDAgKzEsMjYxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIDxzZWUgY3JlZj0iVFByb3RvY29sRGVjb3JhdG9yIi8+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCA8c2VlIGNyZWY9IlRQcm90b2NvbCIvPiBpbnN0YW5jZSwKKyAgICAvLy8gcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBXaGlsZSBpdCBoYXMKKyAgICAvLy8gbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQgaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsCisgICAgLy8vIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8c2VlIGNyZWY9IlRQcm90b2NvbCIvPi4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iVE11bHRpcGxleGVkUHJvdG9jb2wiLz4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIFRQcm90b2NvbCBXcmFwcGVkUHJvdG9jb2w7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+QWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworCisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRTdHJ1Y3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luKHRTdHJ1Y3QpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgdEZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luKHRGaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgdE1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW4odE1hcCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgdExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RCZWdpbih0TGlzdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgdFNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW4odFNldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlQm9vbChiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVCeXRlKGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTE2KGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMihpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTY0KGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZSh2KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUJpbmFyeShieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQm9vbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRJMTYoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEkzMigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEk2NCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKaW5kZXggMjA3ZjVlOS4uYzBmMDA3ZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtMjUsNDIgKzI1LDQzIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQljbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBFeGNlcHRpb24KLQl7Ci0JCXB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7Ci0JCXB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKLQkJcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKLQkJcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKLQkJcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7Ci0JCXB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEPSA1OworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgU0laRV9MSU1JVCA9IDM7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgREVQVEhfTElNSVQgPSA2OwogCi0JCXByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOworICAgICAgICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKLQkJCTogYmFzZSgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogYmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUpCi0JCQk6IGJhc2UoKQotCQl7Ci0JCQl0eXBlXyA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKKyAgICAgICAgICAgIDogYmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVfID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIFN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJCXR5cGVfID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZV8gPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIGludCBnZXRUeXBlKCkKLQkJewotCQkJcmV0dXJuIHR5cGVfOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IGdldFR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZV87CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwppbmRleCBlYmM3MzY3Li43MTM2MGExIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKQEAgLTI2LDggKzI2LDggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQotCXsKLQkJVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpOwotCX0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcwppbmRleCA4MmNkM2UzLi5kOTk1YzZjIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKQEAgLTI1LDc0ICsyNSw4NCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBUUHJvdG9jb2xVdGlsCi0JewotCQlwdWJsaWMgc3RhdGljIHZvaWQgU2tpcChUUHJvdG9jb2wgcHJvdCwgVFR5cGUgdHlwZSkKLQkJewotCQkJc3dpdGNoICh0eXBlKQotCQkJewotCQkJCWNhc2UgVFR5cGUuQm9vbDoKLQkJCQkJcHJvdC5SZWFkQm9vbCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkJ5dGU6Ci0JCQkJCXByb3QuUmVhZEJ5dGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5JMTY6Ci0JCQkJCXByb3QuUmVhZEkxNigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkkzMjoKLQkJCQkJcHJvdC5SZWFkSTMyKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuSTY0OgotCQkJCQlwcm90LlJlYWRJNjQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5Eb3VibGU6Ci0JCQkJCXByb3QuUmVhZERvdWJsZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLlN0cmluZzoKLQkJCQkJLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCi0JCQkJCXByb3QuUmVhZEJpbmFyeSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLlN0cnVjdDoKLQkJCQkJcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKLQkJCQkJd2hpbGUgKHRydWUpCi0JCQkJCXsKLQkJCQkJCVRGaWVsZCBmaWVsZCA9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsKLQkJCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCi0JCQkJCQl7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlTa2lwKHByb3QsIGZpZWxkLlR5cGUpOwotCQkJCQkJcHJvdC5SZWFkRmllbGRFbmQoKTsKLQkJCQkJfQotCQkJCQlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5NYXA6Ci0JCQkJCVRNYXAgbWFwID0gcHJvdC5SZWFkTWFwQmVnaW4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuQ291bnQ7IGkrKykKLQkJCQkJewotCQkJCQkJU2tpcChwcm90LCBtYXAuS2V5VHlwZSk7Ci0JCQkJCQlTa2lwKHByb3QsIG1hcC5WYWx1ZVR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZE1hcEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLlNldDoKLQkJCQkJVFNldCBzZXQgPSBwcm90LlJlYWRTZXRCZWdpbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQotCQkJCQl7Ci0JCQkJCQlTa2lwKHByb3QsIHNldC5FbGVtZW50VHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkU2V0RW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuTGlzdDoKLQkJCQkJVExpc3QgbGlzdCA9IHByb3QuUmVhZExpc3RCZWdpbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuQ291bnQ7IGkrKykKLQkJCQkJewotCQkJCQkJU2tpcChwcm90LCBsaXN0LkVsZW1lbnRUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LlJlYWRMaXN0RW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFNraXAoVFByb3RvY29sIHByb3QsIFRUeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEJvb2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJMTYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEkzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyeSB0byBkZWNvZGUgdGhlIHN0cmluZywganVzdCBza2lwIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQmluYXJ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdC5SZWFkRmllbGRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRGaWVsZEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkU3RydWN0RW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgICAgICBUTWFwIG1hcCA9IHByb3QuUmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgbWFwLktleVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgbWFwLlZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXQgc2V0ID0gcHJvdC5SZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBzZXQuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkU2V0RW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgVExpc3QgbGlzdCA9IHByb3QuUmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBsaXN0LkVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiVW5rbm93biBkYXRhIHR5cGUgIiArIHR5cGUuVG9TdHJpbmcoImQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCmluZGV4IGFmZjdmNjUuLmE5MThhYjUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcwpAQCAtMjcsMjggKzI3LDMzIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRTZXQKLQl7Ci0JCXByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7Ci0JCXByaXZhdGUgaW50IGNvdW50OworICAgIHB1YmxpYyBzdHJ1Y3QgVFNldAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSBlbGVtZW50VHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CiAKLQkJcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQl9CisgICAgICAgIHB1YmxpYyBUU2V0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gZWxlbWVudFR5cGU7IH0KLQkJCXNldCB7IGVsZW1lbnRUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgQ291bnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGNvdW50OyB9Ci0JCQlzZXQgeyBjb3VudCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZWxlbWVudFR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IGVsZW1lbnRUeXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNvdW50OyB9CisgICAgICAgICAgICBzZXQgeyBjb3VudCA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwppbmRleCAzN2QxMTA2Li5mNDg0NGE0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKQEAgLTI3LDIwICsyNywyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBUU3RydWN0Ci0JewotCQlwcml2YXRlIHN0cmluZyBuYW1lOworICAgIHB1YmxpYyBzdHJ1Y3QgVFN0cnVjdAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgbmFtZTsKIAotCQlwdWJsaWMgVFN0cnVjdChzdHJpbmcgbmFtZSkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFN0cnVjdChzdHJpbmcgbmFtZSkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdHJpbmcgTmFtZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gbmFtZTsgfQotCQkJc2V0IHsgbmFtZSA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmFtZTsgfQorICAgICAgICAgICAgc2V0IHsgbmFtZSA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCmluZGV4IGVmYzdiZWYuLjljZTkxNWUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzCkBAIC0yNSwyMCArMjUsMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBlbnVtIFRUeXBlIDogYnl0ZQotCXsKLQkJU3RvcCA9IDAsCi0JCVZvaWQgPSAxLAotCQlCb29sID0gMiwKLQkJQnl0ZSA9IDMsCi0JCURvdWJsZSA9IDQsCi0JCUkxNiA9IDYsCi0JCUkzMiA9IDgsCi0JCUk2NCA9IDEwLAotCQlTdHJpbmcgPSAxMSwKLQkJU3RydWN0ID0gMTIsCi0JCU1hcCA9IDEzLAotCQlTZXQgPSAxNCwKLQkJTGlzdCA9IDE1Ci0JfQorICAgIHB1YmxpYyBlbnVtIFRUeXBlIDogYnl0ZQorICAgIHsKKyAgICAgICAgU3RvcCA9IDAsCisgICAgICAgIFZvaWQgPSAxLAorICAgICAgICBCb29sID0gMiwKKyAgICAgICAgQnl0ZSA9IDMsCisgICAgICAgIERvdWJsZSA9IDQsCisgICAgICAgIEkxNiA9IDYsCisgICAgICAgIEkzMiA9IDgsCisgICAgICAgIEk2NCA9IDEwLAorICAgICAgICBTdHJpbmcgPSAxMSwKKyAgICAgICAgU3RydWN0ID0gMTIsCisgICAgICAgIE1hcCA9IDEzLAorICAgICAgICBTZXQgPSAxNCwKKyAgICAgICAgTGlzdCA9IDE1CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwppbmRleCA3YmYyNzQ3Li4yYmMwNGYzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwpAQCAtMjgsMTEyICsyOCwxMjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgotCXsKLQkJLyoqCi0JCSAqIENvcmUgcHJvY2Vzc29yCi0JCSAqLwotCQlwcm90ZWN0ZWQgVFByb2Nlc3NvciBwcm9jZXNzb3I7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIC8vQXR0cmlidXRlcworICAgICAgICBwcm90ZWN0ZWQgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0OworICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKIAotCQkvKioKLQkJICogU2VydmVyIHRyYW5zcG9ydAotCQkgKi8KLQkJcHJvdGVjdGVkIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0OworICAgICAgICAvL01ldGhvZHMKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBzZWg7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcjsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBJbnB1dCBUcmFuc3BvcnQgRmFjdG9yeQotCQkgKi8KLQkJcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgLy9Mb2cgZGVsZWdhdGlvbgorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKKyAgICAgICAgcHJpdmF0ZSBMb2dEZWxlZ2F0ZSBfbG9nRGVsZWdhdGU7CisgICAgICAgIHByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9CisgICAgICAgICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIE91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeQotCQkgKi8KLQkJcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIC8vQ29uc3RydWN0aW9uCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIElucHV0IFByb3RvY29sIEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIE91dHB1dCBQcm90b2NvbCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0JCXB1YmxpYyBkZWxlZ2F0ZSB2b2lkIExvZ0RlbGVnYXRlKHN0cmluZyBzdHIpOwotCQlwcm90ZWN0ZWQgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGU7CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9ycy4KLQkJICovCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTp0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gbmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3Nvcik7CisgICAgICAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IChsb2dEZWxlZ2F0ZSAhPSBudWxsKSA/IGxvZ0RlbGVnYXRlIDogRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQlUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCUxvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLQkJCTp0aGlzKHByb2Nlc3NvciwKLQkJCQkgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9Ci0KLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLQkJCTp0aGlzKHByb2Nlc3NvciwKLQkJCQkgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwKLQkJCSAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCSAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCSAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotCQl7Ci0JCQl0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLQkJCXRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OwotCQkJdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0JCQl0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotCQkJdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwotCQkJdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0JCQl0aGlzLmxvZ0RlbGVnYXRlID0gbG9nRGVsZWdhdGU7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIHJ1biBtZXRob2QgZmlyZXMgdXAgdGhlIHNlcnZlciBhbmQgZ2V0cyB0aGluZ3MgZ29pbmcuCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOwotCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKLQotCQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgRGVmYXVsdExvZ0RlbGVnYXRlKHN0cmluZyBzKQotCQl7Ci0JCQlDb25zb2xlLkVycm9yLldyaXRlTGluZShzKTsKLQkJfQotCX0KKyAgICAgICAgLy9BYnN0cmFjdCBJbnRlcmZhY2UKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU2VydmUoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOworICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFlZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJlU2VydmUoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgb2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBkZWxldGVDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIHByb2Nlc3NDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwppbmRleCBjNmZkOTllLi40ZTdlYTk2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwpAQCAtMjcsMTI2ICsyNywxNTQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIGZvciB0ZXN0aW5nCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKLQl7Ci0JCXByaXZhdGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUU2ltcGxlU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIHN0b3AgPSBmYWxzZTsKIAotCQlwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0JCQk6YmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQlUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCQlMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0JCQk6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQotCQkJOmJhc2UocHJvY2Vzc29yLAotCQkJCSBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCSAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOmJhc2UocHJvY2Vzc29yLAotCQkJCSBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7Ci0JCQkJVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQkJVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJCVRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLQkJCQlUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOwotCQkJCQlpZiAoY2xpZW50ICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCWlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCQkJb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQkJCWlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0JCQkJCQlvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCQkJCQkJd2hpbGUgKHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeyB9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgotCQkJCQlpZiAoc3RvcCkKLQkJCQkJewotCQkJCQkJbG9nRGVsZWdhdGUoIlRTaW1wbGVTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAiICsgdHR4LkdldFR5cGUoKS5OYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIHgpCi0JCQkJewotCQkJCQlsb2dEZWxlZ2F0ZSh4LlRvU3RyaW5nKCkpOwotCQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJCWlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJCXsKLQkJCQkJaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9CisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKIAotCQkJCWlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCW91dHB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAob3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CiAKLQkJCWlmIChzdG9wKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnBvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCX0KLQkJCQlzdG9wID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLQkJewotCQkJc3RvcCA9IHRydWU7Ci0JCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwppbmRleCBjZjgzNTRlLi5hNDk0Y2U3IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCkBAIC0yOCwxNjMgKzI4LDI2OCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyBidWlsdC1pbiBUaHJlYWRQb29sIHRvIHNwYXduIHRocmVhZHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0cwotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogVFNlcnZlcgotCXsKLQkJcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IDEwOwotCQlwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gMTAwOwotCQlwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyBidWlsdC1pbiBUaHJlYWRQb29sIHRvIHNwYXduIHRocmVhZHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0cy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUlOX1RIUkVBRFMgPSAtMTsgIC8vIHVzZSAuTkVUIFRocmVhZFBvb2wgZGVmYXVsdHMKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOwogCi0JCXB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0JCQk6dGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBzdHJ1Y3QgQ29uZmlndXJhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1pbldvcmtlclRocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1heFdvcmtlclRocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1pbklPVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4SU9UaHJlYWRzOwogCi0JCXB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb24oaW50IG1pbiA9IERFRkFVTFRfTUlOX1RIUkVBRFMsIGludCBtYXggPSBERUZBVUxUX01BWF9USFJFQURTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pbldvcmtlclRocmVhZHMgPSBtaW47CisgICAgICAgICAgICAgICAgTWF4V29ya2VyVGhyZWFkcyA9IG1heDsKKyAgICAgICAgICAgICAgICBNaW5JT1RocmVhZHMgPSBtaW47CisgICAgICAgICAgICAgICAgTWF4SU9UaHJlYWRzID0gbWF4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihpbnQgbWluV29yaywgaW50IG1heFdvcmssIGludCBtaW5JTywgaW50IG1heElPKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pbldvcmtlclRocmVhZHMgPSBtaW5Xb3JrOworICAgICAgICAgICAgICAgIE1heFdvcmtlclRocmVhZHMgPSBtYXhXb3JrOworICAgICAgICAgICAgICAgIE1pbklPVGhyZWFkcyA9IG1pbklPOworICAgICAgICAgICAgICAgIE1heElPVGhyZWFkcyA9IG1heElPOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbihtaW5UaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpLAorICAgICAgICAgICAgIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHRocmVhZENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sU2VydmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1heFRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNYXhUaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1pblRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNaW5UaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogCi0JCXB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOnRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgbmV3IFRocmVhZFBvb2wgdGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0JCQk6YmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCSAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQotCQl7Ci0JCQlpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyhtaW5UaHJlYWRQb29sVGhyZWFkcywgbWluVGhyZWFkUG9vbFRocmVhZHMpKQotCQkJewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7Ci0JCQl9Ci0JCQlpZiAoIVRocmVhZFBvb2wuU2V0TWF4VGhyZWFkcyhtYXhUaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpKQotCQkJewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWF4VGhyZWFkcyBpbiBUaHJlYWRQb29sIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFVzZSBuZXcgVGhyZWFkUG9vbCB0aHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKHRoaXMuRXhlY3V0ZSwgY2xpZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCWludCBmYWlsdXJlQ291bnQgPSAwOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0JCQkJCVRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0odGhpcy5FeGVjdXRlLCBjbGllbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlpZiAoc3RvcCkKLQkJCQkJewotCQkJCQkJbG9nRGVsZWdhdGUoIlRUaHJlYWRQb29sU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgIiArIHR0eC5HZXRUeXBlKCkuTmFtZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkrK2ZhaWx1cmVDb3VudDsKLQkJCQkJCWxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLQkJCQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIGlmIChzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCWlmIChzdG9wKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IGZhbHNlOwotCQkJfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgorICAgICAgICAvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKG9iamVjdCB0aHJlYWRDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCl0aHJlYWRDb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKLQkJLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgotCQlwcml2YXRlIHZvaWQgRXhlY3V0ZShPYmplY3QgdGhyZWFkQ29udGV4dCkKLQkJewotCQkJVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCl0aHJlYWRDb250ZXh0OwotCQkJVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQlUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQlUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0JCQlUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQlpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotCQkJCW91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0JCQkJd2hpbGUgKHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLQkJCQl7Ci0JCQkJCS8va2VlcCBwcm9jZXNzaW5nIHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQotCQkJewotCQkJCS8vIEFzc3VtZSB0aGUgY2xpZW50IGRpZWQgYW5kIGNvbnRpbnVlIHNpbGVudGx5Ci0JCQkJLy9Db25zb2xlLldyaXRlTGluZSh0dHgpOwotCQkJfQotCQkJCi0JCQljYXRjaCAoRXhjZXB0aW9uIHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CiAKLQkJCWlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJewotCQkJCWlucHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotCQl7Ci0JCQlzdG9wID0gdHJ1ZTsKLQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcwppbmRleCBmMmJlMDczLi5jYzA1MWEzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKQEAgLTI2LDIwOSArMjYsMjU3IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gMTAwOwotCQlwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOwotCQlwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyB0aHJlYWRzIChhcyBvcHBvc2VkIHRvIHRoZSBUaHJlYWRQb29sKSB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG1heFRocmVhZHM7CiAKLQkJcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKLQkJcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7Ci0JCXByaXZhdGUgb2JqZWN0IGNsaWVudExvY2s7Ci0JCXByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKKyAgICAgICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKKyAgICAgICAgcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7CisgICAgICAgIHByaXZhdGUgb2JqZWN0IGNsaWVudExvY2s7CisgICAgICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKIAotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgQ2xpZW50VGhyZWFkc0NvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjbGllbnRUaHJlYWRzLkNvdW50OyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCiAKLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkJCSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCQkJIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkJCSBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQotCQkJOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCi0JCXsKLQkJCXRoaXMubWF4VGhyZWFkcyA9IG1heFRocmVhZHM7Ci0JCQljbGllbnRRdWV1ZSA9IG5ldyBRdWV1ZTxUVHJhbnNwb3J0PigpOwotCQkJY2xpZW50TG9jayA9IG5ldyBvYmplY3QoKTsKLQkJCWNsaWVudFRocmVhZHMgPSBuZXcgVEhhc2hTZXQ8VGhyZWFkPigpOwotCQl9CisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtYXhUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWF4VGhyZWFkcyA9IG1heFRocmVhZHM7CisgICAgICAgICAgICBjbGllbnRRdWV1ZSA9IG5ldyBRdWV1ZTxUVHJhbnNwb3J0PigpOworICAgICAgICAgICAgY2xpZW50TG9jayA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZHMgPSBuZXcgVEhhc2hTZXQ8VGhyZWFkPigpOworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVXNlIG5ldyBUaHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLiBibG9jayB1bnRpbCBudW1Db25uZWN0aW9ucyA8IG1heFRocmVhZHMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQkvL3N0YXJ0IHdvcmtlciB0aHJlYWQKLQkJCQl3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChFeGVjdXRlKSk7Ci0JCQkJd29ya2VyVGhyZWFkLlN0YXJ0KCk7Ci0JCQkJc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIG5ldyBUaHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLiBibG9jayB1bnRpbCBudW1Db25uZWN0aW9ucyAmbHQ7IG1heFRocmVhZHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9zdGFydCB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoRXhlY3V0ZSkpOworICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZC5TdGFydCgpOworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlpbnQgZmFpbHVyZUNvdW50ID0gMDsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOwotCQkJCQlsb2NrIChjbGllbnRMb2NrKQotCQkJCQl7Ci0JCQkJCQljbGllbnRRdWV1ZS5FbnF1ZXVlKGNsaWVudCk7Ci0JCQkJCQlNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWlmIChzdG9wKQotCQkJCQl7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSgiVFRocmVhZFBvb2xTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAiICsgdHR4KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCSsrZmFpbHVyZUNvdW50OwotCQkJCQkJbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotCQkJCQl9CisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKIAotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRRdWV1ZS5FbnF1ZXVlKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCWlmIChzdG9wKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKCJUU2VydmVUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCX0KLQkJCQlzdG9wID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCi0JCS8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KLQkJcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoKQotCQl7Ci0JCQl3aGlsZSAoIXN0b3ApCi0JCQl7Ci0JCQkJVFRyYW5zcG9ydCBjbGllbnQ7Ci0JCQkJVGhyZWFkIHQ7Ci0JCQkJbG9jayAoY2xpZW50TG9jaykKLQkJCQl7Ci0JCQkJCS8vZG9uJ3QgZGVxdWV1ZSBpZiB0b28gbWFueSBjb25uZWN0aW9ucwotCQkJCQl3aGlsZSAoY2xpZW50VGhyZWFkcy5Db3VudCA+PSBtYXhUaHJlYWRzKQotCQkJCQl7Ci0JCQkJCQlNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0JCQkJCX0KKyAgICAgICAgICAgIGlmIChzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCQl3aGlsZSAoY2xpZW50UXVldWUuQ291bnQgPT0gMCkKLQkJCQkJewotCQkJCQkJTW9uaXRvci5XYWl0KGNsaWVudExvY2spOwotCQkJCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgICAgICAgICAgICBUaHJlYWQgdDsKKyAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCWNsaWVudCA9IGNsaWVudFF1ZXVlLkRlcXVldWUoKTsKLQkJCQkJdCA9IG5ldyBUaHJlYWQobmV3IFBhcmFtZXRlcml6ZWRUaHJlYWRTdGFydChDbGllbnRXb3JrZXIpKTsKLQkJCQkJY2xpZW50VGhyZWFkcy5BZGQodCk7Ci0JCQkJfQotCQkJCS8vc3RhcnQgcHJvY2Vzc2luZyByZXF1ZXN0cyBmcm9tIGNsaWVudCBvbiBuZXcgdGhyZWFkCi0JCQkJdC5TdGFydChjbGllbnQpOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgQ2xpZW50V29ya2VyKE9iamVjdCBjb250ZXh0KQotCQl7Ci0JCQlUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KWNvbnRleHQ7Ci0JCQlUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLQkJCVRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQlvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCWlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0JCQkJb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQkJCQl3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQotCQkJCXsKLQkJCQkJLy9rZWVwIHByb2Nlc3NpbmcgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0JCQl7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IGNsaWVudFF1ZXVlLkRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyBUaHJlYWQobmV3IFBhcmFtZXRlcml6ZWRUaHJlYWRTdGFydChDbGllbnRXb3JrZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkcy5BZGQodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vc3RhcnQgcHJvY2Vzc2luZyByZXF1ZXN0cyBmcm9tIGNsaWVudCBvbiBuZXcgdGhyZWFkCisgICAgICAgICAgICAgICAgdC5TdGFydChjbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCWlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJewotCQkJCWlucHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIob2JqZWN0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KWNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCi0JCQlsb2NrIChjbGllbnRMb2NrKQotCQkJewotCQkJCWNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKLQkJCQlNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOwotCQkJfQotCQkJcmV0dXJuOwotCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0JCXsKLQkJCXN0b3AgPSB0cnVlOwotCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkvL2NsZWFuIHVwIGFsbCB0aGUgdGhyZWFkcyBteXNlbGYKLQkJCXdvcmtlclRocmVhZC5BYm9ydCgpOwotCQkJZm9yZWFjaCAoVGhyZWFkIHQgaW4gY2xpZW50VGhyZWFkcykKLQkJCXsKLQkJCQl0LkFib3J0KCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkcy5SZW1vdmUoVGhyZWFkLkN1cnJlbnRUaHJlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2xvc2UgdHJhbnNwb3J0cworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2FibGUgc3R1ZmYgc2hvdWxkIGJlIGRpc3Bvc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAvL2NsZWFuIHVwIGFsbCB0aGUgdGhyZWFkcyBteXNlbGYKKyAgICAgICAgICAgIHdvcmtlclRocmVhZC5BYm9ydCgpOworICAgICAgICAgICAgZm9yZWFjaCAoVGhyZWFkIHQgaW4gY2xpZW50VGhyZWFkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0LkFib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKaW5kZXggY2MyOWYwYS4uOGRkN2FlNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtMjYsMTEwICsyNiwxMjEgQEAKIAogbmFtZXNwYWNlIFRocmlmdAogewotCXB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBFeGNlcHRpb24KLQl7Ci0JCXByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGU7CisgICAgcHVibGljIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGU7CiAKLQkJcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUpCi0JCXsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgbnVsbCkgLy8gVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIHNlcmlhbGl6YWJsZSwgYnV0IHdlIG5ldmVyIHNlcmlhbGl6ZSBJbm5lckV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gUmVhZChUUHJvdG9jb2wgaXByb3QpCi0JCXsKLQkJCVRGaWVsZCBmaWVsZDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gUmVhZChUUHJvdG9jb2wgaXByb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZDsKIAotCQkJc3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJRXhjZXB0aW9uVHlwZSB0eXBlID0gRXhjZXB0aW9uVHlwZS5Vbmtub3duOworICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSB0eXBlID0gRXhjZXB0aW9uVHlwZS5Vbmtub3duOwogCi0JCQl3aGlsZSAodHJ1ZSkKLQkJCXsKLQkJCQlmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7Ci0JCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKLQkJCQl7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgIGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlzd2l0Y2ggKGZpZWxkLklEKQotCQkJCXsKLQkJCQkJY2FzZSAxOgotCQkJCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RyaW5nKQotCQkJCQkJewotCQkJCQkJCW1lc3NhZ2UgPSBpcHJvdC5SZWFkU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5JMzIpCi0JCQkJCQl7Ci0JCQkJCQkJdHlwZSA9IChFeGNlcHRpb25UeXBlKWlwcm90LlJlYWRJMzIoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlwcm90LlJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gKEV4Y2VwdGlvblR5cGUpaXByb3QuUmVhZEkzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlpcHJvdC5SZWFkRmllbGRFbmQoKTsKLQkJCX0KKyAgICAgICAgICAgICAgICBpcHJvdC5SZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KIAotCQkJaXByb3QuUmVhZFN0cnVjdEVuZCgpOworICAgICAgICAgICAgaXByb3QuUmVhZFN0cnVjdEVuZCgpOwogCi0JCQlyZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpCi0JCXsKLQkJCVRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7Ci0JCQlURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKIAotCQkJb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsKIAotCQkJaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShNZXNzYWdlKSkKLQkJCXsKLQkJCQlmaWVsZC5OYW1lID0gIm1lc3NhZ2UiOwotCQkJCWZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7Ci0JCQkJZmllbGQuSUQgPSAxOwotCQkJCW9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7Ci0JCQkJb3Byb3QuV3JpdGVTdHJpbmcoTWVzc2FnZSk7Ci0JCQkJb3Byb3QuV3JpdGVGaWVsZEVuZCgpOwotCQkJfQorICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShNZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5OYW1lID0gIm1lc3NhZ2UiOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSAxOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgICAgICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJpbmcoTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOworICAgICAgICAgICAgfQogCi0JCQlmaWVsZC5OYW1lID0gInR5cGUiOwotCQkJZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKLQkJCWZpZWxkLklEID0gMjsKLQkJCW9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7Ci0JCQlvcHJvdC5Xcml0ZUkzMigoaW50KXR5cGUpOwotCQkJb3Byb3QuV3JpdGVGaWVsZEVuZCgpOwotCQkJb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsKLQkJCW9wcm90LldyaXRlU3RydWN0RW5kKCk7Ci0JCX0KKyAgICAgICAgICAgIGZpZWxkLk5hbWUgPSAidHlwZSI7CisgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuSTMyOworICAgICAgICAgICAgZmllbGQuSUQgPSAyOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlSTMyKChpbnQpdHlwZSk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKLQkJewotCQkJVW5rbm93biwKLQkJCVVua25vd25NZXRob2QsCi0JCQlJbnZhbGlkTWVzc2FnZVR5cGUsCi0JCQlXcm9uZ01ldGhvZE5hbWUsCi0JCQlCYWRTZXF1ZW5jZUlELAotCQkJTWlzc2luZ1Jlc3VsdAotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBVbmtub3duTWV0aG9kLAorICAgICAgICAgICAgSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgV3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgQmFkU2VxdWVuY2VJRCwKKyAgICAgICAgICAgIE1pc3NpbmdSZXN1bHQsCisgICAgICAgICAgICBJbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvciwKKyAgICAgICAgICAgIEludmFsaWRUcmFuc2Zvcm0sCisgICAgICAgICAgICBJbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RBc3luY1Byb2Nlc3Nvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RBc3luY1Byb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQzMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb2Nlc3NlcyBhIG1lc3NhZ2UgYXN5bmNocm9ub3VzbHkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBc3luY1Byb2Nlc3NvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJvY2Vzc2VzIHRoZSBuZXh0IHBhcnQgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXByb3QiPlRoZSBpbnB1dCBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9wcm90Ij5UaGUgb3V0cHV0IHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZXJlJ3MgbW9yZSB0byBwcm9jZXNzLCBmYWxzZSBvdGhlcndpc2UuPC9yZXR1cm5zPgorICAgICAgICBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1MjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MKQEAgLTAsMCArMSwyOSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuU2VydmVyOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBUQ29udHJvbGxpbmdIYW5kbGVyCisgICAgeworICAgICAgICBUU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5YTIxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBURXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKaW5kZXggZGMxYjc5NS4uNzFjZTc1NSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCkBAIC0yNiw4ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQKIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFRQcm9jZXNzb3IKLQl7Ci0JCWJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7Ci0JfQorICAgIHB1YmxpYyBpbnRlcmZhY2UgVFByb2Nlc3NvcgorICAgIHsKKyAgICAgICAgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjYzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDMwIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDcyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGNsYXNzIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5PFAsIEg+IDogVFByb2Nlc3NvckZhY3Rvcnkgd2hlcmUgUCA6IFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIG9iamVjdFtdIGhhbmRsZXJBcmdzID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVyQXJncyA9IG5ldyBvYmplY3RbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkocGFyYW1zIG9iamVjdFtdIGhhbmRsZXJBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJBcmdzID0gaGFuZGxlckFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBIIGhhbmRsZXIgPSAoSClBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKEgpLCBoYW5kbGVyQXJncyk7CisKKyAgICAgICAgICAgIFRDb250cm9sbGluZ0hhbmRsZXIgaGFuZGxlclNlcnZlclJlZiA9IGhhbmRsZXIgYXMgVENvbnRyb2xsaW5nSGFuZGxlcjsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyU2VydmVyUmVmICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlclNlcnZlclJlZi5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihQKSwgbmV3IG9iamVjdFtdIHsgaGFuZGxlciB9KSBhcyBUUHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI4OTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IFRQcm9jZXNzb3JGYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKworICAgICAgICBwdWJsaWMgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc29yXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjhiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCkBAIC0wLDAgKzEsMTI5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvamVjdEd1aWQ+e0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdDQ1PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRMaXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2VUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbFV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXN5bmNQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2lsdmVybGlnaHRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iU2VydmVyXENvbGxlY3Rpb25zXCIgLz4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxQcm90b2NvbFwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCmluZGV4IDdlZWI2ZmUuLmJmNjU1NjkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagpAQCAtMSw0ICsxLDUgQEAKLe+7vzwhLS0KK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE2LDcgKzE3LDcgQEAKICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPFByb3BlcnR5R3JvdXA+CiAgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CiAgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgpAQCAtMjksNjggKzMwLDEyOCBAQAogICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CiAgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgogICAgIDxSb290TmFtZXNwYWNlPlRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CiAgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgogICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CiAgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz4KKyAgICA8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CiAgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+CiAgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KICAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOZXQzNVxFeHRlbnNpb25zTmV0MzUuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEFic3RyYWN0QmFzZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZTY0VXRpbHMuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRDb21wYWN0UHJvdG9jb2wuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEZpZWxkLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRKU09OUHJvdG9jb2wuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVExpc3QuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1hcC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWVzc2FnZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWVzc2FnZVR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xEZWNvcmF0b3IuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEZhY3RvcnkuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sVXRpbC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTdHJ1Y3QuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFR5cGUuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlckV2ZW50SGFuZGxlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldFZlcnNpb25pemVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTSEFSUC5UYXJnZXRzIiAvPgogICA8UHJvamVjdEV4dGVuc2lvbnM+CiAgICAgPFZpc3VhbFN0dWRpbyBBbGxvd0V4aXN0aW5nRm9sZGVyPSJ0cnVlIiAvPgogICA8L1Byb2plY3RFeHRlbnNpb25zPgotPC9Qcm9qZWN0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4gYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCmluZGV4IDI5NTUzNzkuLmEyOWU0NjggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgpAQCAtMSwzMyArMSwxNiBAQAot77u/IwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDAKLSMgVmlzdWFsIFN0dWRpbyAyMDA4Civvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAogUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKIEVuZFByb2plY3QKLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICIuLlwuLlwuLlx0ZXN0XGNzaGFycFxUaHJpZnRUZXN0XFRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgotCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQotCUVuZFByb2plY3RTZWN0aW9uCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiLi5cdGVzdFxUaHJpZnRUZXN0XFRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgogRW5kUHJvamVjdAogUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRNU0J1aWxkVGFzayIsICIuLlxUaHJpZnRNU0J1aWxkVGFza1xUaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oiLCAie0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0iCiBFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdC40NSIsICJUaHJpZnQuNDUuY3Nwcm9qIiwgIntFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRNVkNUZXN0IiwgIi4uXHRlc3RcVGhyaWZ0TVZDVGVzdFxUaHJpZnRNVkNUZXN0LmNzcHJvaiIsICJ7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfSIKK0VuZFByb2plY3QKIEdsb2JhbAogCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCiAJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCkBAIC00Niw4ICsyOSwxOSBAQAogCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCiAJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKIAkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCiAJRW5kR2xvYmFsU2VjdGlvbgogCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCiAJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQogCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE1vbm9EZXZlbG9wUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQkgICAgICAgIFN0YXJ0dXBJdGVtID0gVGhyaWZ0LmNzcHJvagorCUVuZEdsb2JhbFNlY3Rpb24KIEVuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKaW5kZXggMjhhODU1YS4uODg3MDk4OCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCkBAIC0yMiw3OSArMjIsMTczIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKLQl7Ci0JCXByaXZhdGUgQnVmZmVyZWRTdHJlYW0gaW5wdXRCdWZmZXI7Ci0JCXByaXZhdGUgQnVmZmVyZWRTdHJlYW0gb3V0cHV0QnVmZmVyOwotCQlwcml2YXRlIGludCBidWZTaXplOwotCQlwcml2YXRlIFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHB1YmxpYyBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgYnVmU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBvdXRwdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OwogCi0JCXB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQpCi0JCQk6dGhpcyh0cmFuc3BvcnQsIDEwMjQpCi0JCXsKKyAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidHJhbnNwb3J0Iik7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiYnVmU2l6ZSIsICJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiIpOworICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICB9CiAKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUpCi0JCXsKLQkJCXRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7Ci0JCQl0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKLQkJCUluaXRCdWZmZXJzKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBsZWdpdGltYXRlbHkgdGhyb3cgaGVyZSBidXQgYmUgbmljZSBhIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfSXNEaXNwb3NlZCAmJiB0cmFuc3BvcnQuSXNPcGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIEluaXRCdWZmZXJzKCkKLQkJewotCQkJaWYgKHRyYW5zcG9ydC5JbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCWlucHV0QnVmZmVyID0gbmV3IEJ1ZmZlcmVkU3RyZWFtKHRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgYnVmU2l6ZSk7Ci0JCQl9Ci0JCQlpZiAodHJhbnNwb3J0Lk91dHB1dFN0cmVhbSAhPSBudWxsKQotCQkJewotCQkJCW91dHB1dEJ1ZmZlciA9IG5ldyBCdWZmZXJlZFN0cmVhbSh0cmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBidWZTaXplKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRyYW5zcG9ydDsgfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRyYW5zcG9ydC5Jc09wZW47IH0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQotCQl7Ci0JCQl0cmFuc3BvcnQuT3BlbigpOwotCQkJSW5pdEJ1ZmZlcnMoKTsKLQkJfQorICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyLkNhcGFjaXR5IDwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCAmJiBpbnB1dEJ1ZmZlci5DYW5SZWFkKQotCQkJewotCQkJCWlucHV0QnVmZmVyLkNsb3NlKCk7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0QnVmZmVyICE9IG51bGwgJiYgb3V0cHV0QnVmZmVyLkNhbldyaXRlKQotCQkJewotCQkJCW91dHB1dEJ1ZmZlci5DbG9zZSgpOwotCQkJfQotCQl9CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZ290ID0gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJcmV0dXJuIGlucHV0QnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChpbnB1dEJ1ZmZlci5DYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgaW50IGZpbGxlZCA9IHRyYW5zcG9ydC5SZWFkKGlucHV0QnVmZmVyLkdldEJ1ZmZlcigpLCAwLCAoaW50KWlucHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGZpbGxlZCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGxlZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCW91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNhcGEgPSAoaW50KShvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdGVTaXplID0gY2FwYSA8PSBsZW4gPyBjYXBhIDogbGVuOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgd3JpdGVTaXplKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd3JpdGVTaXplOworICAgICAgICAgICAgICAgIGlmICh3cml0ZVNpemUgPT0gY2FwYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGxlbiAtIG9mZnNldCA+PSBidWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmVtYWluID0gbGVuIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmICsgb2Zmc2V0LCByZW1haW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQlvdXRwdXRCdWZmZXIuRmx1c2goKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydC5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5FbmRGbHVzaCggYXN5bmNSZXN1bHQpOworICAgICAgICB9CisKKworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0lzRGlzcG9zZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJUQnVmZmVyZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgX0lzRGlzcG9zZWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCmluZGV4IGUyNTlmNWEuLmE3NDZhMzIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCkBAIC0xNiwxMjIgKzE2LDE5MCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQordXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLklPOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydAotCXsKLQkJcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKLQkJcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlcjsKLQkJcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbnVsbDsKKyAgICBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIHJlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOwogCi0JCXByaXZhdGUgY29uc3QgaW50IGhlYWRlcl9zaXplID0gNDsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhlYWRlcl9kdW1teSA9IG5ldyBieXRlW2hlYWRlcl9zaXplXTsgLy8gdXNlZCBhcyBoZWFkZXIgcGxhY2Vob2xkZXIgd2hpbGUgaW5pdGlsaXppbmcgbmV3IHdyaXRlIGJ1ZmZlcgorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBIZWFkZXJTaXplID0gNDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gaGVhZGVyQnVmID0gbmV3IGJ5dGVbSGVhZGVyU2l6ZV07CiAKLQkJcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeQotCQl7Ci0JCQlwdWJsaWMgb3ZlcnJpZGUgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KCkKLQkJewotCQkJSW5pdFdyaXRlQnVmZmVyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiB0aGlzKCkKLQkJewotCQkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGxlZ2l0aW1hdGVseSB0aHJvdyBoZXJlIGJ1dCBiZSBuaWNlIGEgYml0LgorICAgICAgICAgICAgICAgIC8vIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIV9Jc0Rpc3Bvc2VkICYmIHRyYW5zcG9ydC5Jc09wZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHRyYW5zcG9ydC5Jc09wZW47Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQotCQkJewotCQkJCWludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCQkJaWYgKGdvdCA+IDApCi0JCQkJewotCQkJCQlyZXR1cm4gZ290OwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgICAgICAgICBSZWFkRnJhbWUoKTsKIAotCQkJLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKLQkJCVJlYWRGcmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChoZWFkZXJCdWYsIDAsIEhlYWRlclNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaGVhZGVyQnVmKTsKIAotCQlwcml2YXRlIHZvaWQgUmVhZEZyYW1lKCkKLQkJewotCQkJYnl0ZVtdIGkzMnJkID0gbmV3IGJ5dGVbaGVhZGVyX3NpemVdOwotCQkJdHJhbnNwb3J0LlJlYWRBbGwoaTMycmQsIDAsIGhlYWRlcl9zaXplKTsKLQkJCWludCBzaXplID0KLQkJCQkoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKLQkJCQkoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKLQkJCQkoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKLQkJCQkoKGkzMnJkWzNdICYgMHhmZikpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZXRMZW5ndGgoc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBieXRlW10gYnVmZiA9IHJlYWRCdWZmZXIuR2V0QnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChidWZmLCAwLCBzaXplKTsKKyAgICAgICAgfQogCi0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnNwb3J0LlJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7Ci0JCQlyZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbShidWZmKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAod3JpdGVCdWZmZXIuTGVuZ3RoICsgKGxvbmcpbGVuID4gKGxvbmcpaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgICAgIEZsdXNoKCk7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCXdyaXRlQnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBJbnRlcm5hbEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyLkdldEJ1ZmZlcigpOworICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpd3JpdGVCdWZmZXIuTGVuZ3RoOworICAgICAgICAgICAgaW50IGRhdGFfbGVuID0gbGVuIC0gSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgIGlmIChkYXRhX2xlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQlieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuR2V0QnVmZmVyKCk7Ci0JCQlpbnQgbGVuID0gKGludCl3cml0ZUJ1ZmZlci5MZW5ndGg7Ci0JCQlpbnQgZGF0YV9sZW4gPSBsZW4gLSBoZWFkZXJfc2l6ZTsKLQkJCWlmICggZGF0YV9sZW4gPCAwICkKLQkJCQl0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICAvLyBJbmplY3QgbWVzc2FnZSBoZWFkZXIgaW50byB0aGUgcmVzZXJ2ZWQgYnVmZmVyIHNwYWNlCisgICAgICAgICAgICBFbmNvZGVGcmFtZVNpemUoZGF0YV9sZW4sIGJ1Zik7CiAKLQkJCUluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICAgICAgLy8gU2VuZCB0aGUgZW50aXJlIG1lc3NhZ2UgYXQgb25jZQorICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKIAotCQkJLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQotCQkJYnVmWzBdID0gKGJ5dGUpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKLQkJCWJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGRhdGFfbGVuID4+IDE2KSk7Ci0JCQlidWZbMl0gPSAoYnl0ZSkoMHhmZiAmIChkYXRhX2xlbiA+PiA4KSk7Ci0JCQlidWZbM10gPSAoYnl0ZSkoMHhmZiAmIChkYXRhX2xlbikpOworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KIAotCQkJLy8gU2VuZCB0aGUgZW50aXJlIG1lc3NhZ2UgYXQgb25jZQotCQkJdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CiAKLQkJCXRyYW5zcG9ydC5GbHVzaCgpOwotCQl9CisgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIgKCkKLQkJewotCQkJLy8gQ3JlYXRlIG5ldyBidWZmZXIgaW5zdGFuY2UKLQkJCXdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOwogCi0JCQkvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0Ci0JCQl3cml0ZUJ1ZmZlci5Xcml0ZSAoIGhlYWRlcl9kdW1teSwgMCwgaGVhZGVyX3NpemUgKTsKLQkJfQotCX0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuQmVnaW5GbHVzaCggY2FsbGJhY2ssIHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAorICAgICAgICAgICAgd3JpdGVCdWZmZXIuU2V0TGVuZ3RoKEhlYWRlclNpemUpOworICAgICAgICAgICAgd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUgPj4gMjQpKTsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAxNikpOworICAgICAgICAgICAgYnVmWzJdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDgpKTsKKyAgICAgICAgICAgIGJ1ZlszXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IERlY29kZUZyYW1lU2l6ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzNdICYgMHhmZikpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKaW5kZXggYmY2Y2E0ZC4uNjY3ZmMyNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcwpAQCAtNyw3ICs3LDcgQEAKICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqCSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMTUsMTc0ICsxNSw0NjEgQEAKICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqIAotICogCisgKgorICoKICAqLwogCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5JTzsKIHVzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uSU8uQ29tcHJlc3Npb247CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRIdHRwQ2xpZW50IDogVFRyYW5zcG9ydAotCXsKLQkJcHJpdmF0ZSByZWFkb25seSBVcmkgdXJpOwotCQlwcml2YXRlIFN0cmVhbSBpbnB1dFN0cmVhbTsKLQkJcHJpdmF0ZSBNZW1vcnlTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotCQlwcml2YXRlIGludCBjb25uZWN0VGltZW91dCA9IDA7Ci0JCXByaXZhdGUgaW50IHJlYWRUaW1lb3V0ID0gMDsKLQkJcHJpdmF0ZSBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworICAgIHB1YmxpYyBjbGFzcyBUSHR0cENsaWVudCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFVyaSB1cmk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzOworICAgICAgICBwcml2YXRlIFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwogCi0JCXB1YmxpYyBUSHR0cENsaWVudChVcmkgdSkKLQkJewotCQkJdXJpID0gdTsKLQkJfQorICAgICAgICAvLyBUaW1lb3V0cyBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXQgPSAzMDAwMDsKIAotCQlwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0Ci0JCXsKLQkJCXNldAotCQkJewotCQkJICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIGludCByZWFkVGltZW91dCA9IDMwMDAwOwogCi0JCXB1YmxpYyBpbnQgUmVhZFRpbWVvdXQKLQkJewotCQkJc2V0Ci0JCQl7Ci0JCQkJcmVhZFRpbWVvdXQgPSB2YWx1ZTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CiAKLQkJcHVibGljIElEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBDdXN0b21IZWFkZXJzCi0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBjdXN0b21IZWFkZXJzOwotCQkJfQotCQl9CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgIHByaXZhdGUgSVdlYlByb3h5IHByb3h5ID0gV2ViUmVxdWVzdC5EZWZhdWx0V2ViUHJveHk7CisjZW5kaWYKIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50KFVyaSB1KQorICAgICAgICAgICAgOiB0aGlzKHUsIEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUSHR0cENsaWVudChVcmkgdSwgSUVudW1lcmFibGU8WDUwOUNlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVyaSA9IHU7CisgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlcyA9IChjZXJ0aWZpY2F0ZXMgPz8gRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpLlRvQXJyYXkoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0U3RyZWFtLkNsb3NlKCk7Ci0JCQkJb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQiKTsKLQkJCX0KKyAgICAgICAgcHVibGljIGludCBSZWFkVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkVGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCXRyeQotCQkJewotCQkJCWludCByZXQgPSBpbnB1dFN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbUhlYWRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCWlmIChyZXQgPT0gLTEpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOwotCQkJCX0KKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgcHVibGljIElXZWJQcm94eSBQcm94eQorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm94eSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKIAotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW94KQotCQkJeyAKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCW91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQl0cnkgCi0JCQl7Ci0JCQkJU2VuZFJlcXVlc3QoKTsKLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCQlvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFNlbmRSZXF1ZXN0KCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Iik7CisgICAgICAgICAgICB9CiAKLQkJCQlieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7Ci0JCQkJY29ubmVjdGlvbi5Db250ZW50TGVuZ3RoID0gZGF0YS5MZW5ndGg7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKIAotCQkJCVN0cmVhbSByZXF1ZXN0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXF1ZXN0U3RyZWFtKCk7Ci0JCQkJcmVxdWVzdFN0cmVhbS5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7Ci0JCQkJaW5wdXRTdHJlYW0gPSBjb25uZWN0aW9uLkdldFJlc3BvbnNlKCkuR2V0UmVzcG9uc2VTdHJlYW0oKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKLQkJCX0KLQkJCWNhdGNoIChXZWJFeGNlcHRpb24gd3gpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4KTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIH0KIAotCQlwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVJlcXVlc3QoKQotCQl7Ci0JCQlIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gKEh0dHBXZWJSZXF1ZXN0KVdlYlJlcXVlc3QuQ3JlYXRlKHVyaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCWlmIChjb25uZWN0VGltZW91dCA+IDApCi0JCQl7Ci0JCQkJY29ubmVjdGlvbi5UaW1lb3V0ID0gY29ubmVjdFRpbWVvdXQ7Ci0JCQl9Ci0JCQlpZiAocmVhZFRpbWVvdXQgPiAwKQotCQkJewotCQkJCWNvbm5lY3Rpb24uUmVhZFdyaXRlVGltZW91dCA9IHJlYWRUaW1lb3V0OwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAotCQkJLy8gTWFrZSB0aGUgcmVxdWVzdAotCQkJY29ubmVjdGlvbi5Db250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7Ci0JCQljb25uZWN0aW9uLkFjY2VwdCA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7Ci0JCQljb25uZWN0aW9uLlVzZXJBZ2VudCA9ICJDIy9USHR0cENsaWVudCI7Ci0JCQljb25uZWN0aW9uLk1ldGhvZCA9ICJQT1NUIjsKLQkJCWNvbm5lY3Rpb24uUHJvdG9jb2xWZXJzaW9uID0gSHR0cFZlcnNpb24uVmVyc2lvbjEwOworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNlbmRSZXF1ZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCS8vYWRkIGN1c3RvbSBoZWFkZXJzIGhlcmUKLQkJCWZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4gaXRlbSBpbiBjdXN0b21IZWFkZXJzKQotCQkJewotCQkJCWNvbm5lY3Rpb24uSGVhZGVycy5BZGQoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOwotCQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgU2VuZFJlcXVlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gQ3JlYXRlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIik7CiAKLQkJCWNvbm5lY3Rpb24uUHJveHkgPSBudWxsOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkNvbnRlbnRMZW5ndGggPSBkYXRhLkxlbmd0aDsKIAotCQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSByZXF1ZXN0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXF1ZXN0U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RyZWFtLldyaXRlKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIEhUVFAgaGFuZyB0aGF0IGNhbiBoYXBwZW5zIGFmdGVyIHN1Y2Nlc3NpdmUgY2FsbHMgYnkgbWFraW5nIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSByZWxlYXNlIHRoZSByZXNwb25zZSBhbmQgcmVzcG9uc2Ugc3RyZWFtLiBUbyBzdXBwb3J0IHRoaXMsIHdlIGNvcHkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHRvIGEgbWVtb3J5IHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZXNwb25zZSA9IGNvbm5lY3Rpb24uR2V0UmVzcG9uc2UoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZXNwb25zZVN0cmVhbSA9IHJlc3BvbnNlLkdldFJlc3BvbnNlU3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgcmVzcG9uc2UgdG8gYSBtZW1vcnkgc3RyZWFtIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5seSBjbG9zZSB0aGUgcmVzcG9uc2UgYW5kIHJlc3BvbnNlIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07ICAvLyBtdWx0aXBsZSBvZiA0MDk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IHJlc3BvbnNlU3RyZWFtLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uV3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jb2RpbmdzID0gcmVzcG9uc2UuSGVhZGVycy5HZXRWYWx1ZXMoIkNvbnRlbnQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW5jb2RpbmcgaW4gZW5jb2RpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZ3ppcCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0daaXBwZWQocmVmIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlZmxhdGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29tcHJlc3NEZWZsYXRlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFdlYkV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gsIHd4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IERlZmxhdGVTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0daaXBwZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IEdaaXBTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVJlcXVlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gKEh0dHBXZWJSZXF1ZXN0KVdlYlJlcXVlc3QuQ3JlYXRlKHVyaSk7CisKKworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgLy8gQWRkaW5nIGNlcnRpZmljYXRlcyB0aHJvdWdoIGNvZGUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIFdQNyBTaWx2ZXJsaWdodAorICAgICAgICAgICAgLy8gc2VlICJXaW5kb3dzIFBob25lIDcgYW5kIENlcnRpZmljYXRlc19GSU5BTF8xMjE2MTAucGRmIgorICAgICAgICAgICAgY29ubmVjdGlvbi5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoY2VydGlmaWNhdGVzKTsKKworICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLlRpbWVvdXQgPSBjb25uZWN0VGltZW91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFkVGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5SZWFkV3JpdGVUaW1lb3V0ID0gcmVhZFRpbWVvdXQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uQ29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOworICAgICAgICAgICAgY29ubmVjdGlvbi5BY2NlcHQgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOworICAgICAgICAgICAgY29ubmVjdGlvbi5Vc2VyQWdlbnQgPSAiQyMvVEh0dHBDbGllbnQiOworICAgICAgICAgICAgY29ubmVjdGlvbi5NZXRob2QgPSAiUE9TVCI7CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICBjb25uZWN0aW9uLlByb3RvY29sVmVyc2lvbiA9IEh0dHBWZXJzaW9uLlZlcnNpb24xMDsKKyNlbmRpZgorCisgICAgICAgICAgICAvL2FkZCBjdXN0b20gaGVhZGVycyBoZXJlCisgICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+IGl0ZW0gaW4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIHsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnMuQWRkKGl0ZW0uS2V5LCBpdGVtLlZhbHVlKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5IZWFkZXJzW2l0ZW0uS2V5XSA9IGl0ZW0uVmFsdWU7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgY29ubmVjdGlvbi5Qcm94eSA9IHByb3h5OworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKKyAgICAgICAgICAgIHZhciBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgLy9yZXF1ZXN0QnVmZmVyXyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24gb2JqZWN0CisgICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSBuZXcgRmx1c2hBc3luY1Jlc3VsdChjYWxsYmFjaywgc3RhdGUpOworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuRGF0YSA9IGRhdGE7CisKKworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5CZWdpbkdldFJlcXVlc3RTdHJlYW0oR2V0UmVxdWVzdFN0cmVhbUNhbGxiYWNrLCBmbHVzaEFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmx1c2hBc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3guVG9TdHJpbmcoKSwgaW94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgICAgIGlmICghZmx1c2hBc3luY1Jlc3VsdC5Jc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB3YWl0SGFuZGxlID0gZmx1c2hBc3luY1Jlc3VsdC5Bc3luY1dhaXRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuV2FpdE9uZSgpOyAgLy8gYmxvY2tpbmcgSU5GSU5JVEVseQorICAgICAgICAgICAgICAgICAgICB3YWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdldFJlcXVlc3RTdHJlYW1DYWxsYmFjayhJQXN5bmNSZXN1bHQgYXN5bmNocm9ub3VzUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jaHJvbm91c1Jlc3VsdC5Bc3luY1N0YXRlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlcVN0cmVhbSA9IGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5FbmRHZXRSZXF1ZXN0U3RyZWFtKGFzeW5jaHJvbm91c1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgcmVxU3RyZWFtLldyaXRlKGZsdXNoQXN5bmNSZXN1bHQuRGF0YSwgMCwgZmx1c2hBc3luY1Jlc3VsdC5EYXRhLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmVxU3RyZWFtLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgcmVxU3RyZWFtLkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byBnZXQgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Db25uZWN0aW9uLkJlZ2luR2V0UmVzcG9uc2UoR2V0UmVzcG9uc2VDYWxsYmFjaywgZmx1c2hBc3luY1Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBHZXRSZXNwb25zZUNhbGxiYWNrKElBc3luY1Jlc3VsdCBhc3luY2hyb25vdXNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNocm9ub3VzUmVzdWx0LkFzeW5jU3RhdGU7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGZsdXNoQXN5bmNSZXN1bHQuQ29ubmVjdGlvbi5FbmRHZXRSZXNwb25zZShhc3luY2hyb25vdXNSZXN1bHQpLkdldFJlc3BvbnNlU3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCYXNlZCBvbiBodHRwOi8vbXNtdnBzLmNvbS9ibG9ncy9sdWlzYWJyZXUvYXJjaGl2ZS8yMDA5LzA2LzE1L211bHRpdGhyZWFkaW5nLWltcGxlbWVudGluZy10aGUtaWFzeW5jcmVzdWx0LWludGVyZmFjZS5hc3B4CisgICAgICAgIGNsYXNzIEZsdXNoQXN5bmNSZXN1bHQgOiBJQXN5bmNSZXN1bHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKKworICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOworICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gRGF0YSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBIdHRwV2ViUmVxdWVzdCBDb25uZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIFRUcmFuc3BvcnRFeGNlcHRpb24gQXN5bmNFeGNlcHRpb24geyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IEFzeW5jU3RhdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3N0YXRlOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgV2FpdEhhbmRsZSBBc3luY1dhaXRIYW5kbGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0RXZ0SGFuZGxlKCk7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIENvbXBsZXRlZFN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzQ29tcGxldGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pc0NvbXBsZXRlZDsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBHZXRFdnRIYW5kbGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChfaXNDb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ldnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pc0NvbXBsZXRlZCA9IHRydWU7IC8vMS4gc2V0IF9pc2NvbXBsZXRlZCB0byB0cnVlCisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7IC8vMi4gc2V0IHRoZSBldmVudCwgd2hlbiBpdCBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBOb3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY2JNZXRob2QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jYk1ldGhvZCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTVlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLldlYjsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uSU87CisKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBIYW5kbGVyIDogSUh0dHBIYW5kbGVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgVFByb2Nlc3NvciBwcm9jZXNzb3I7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICBwcm90ZWN0ZWQgY29uc3Qgc3RyaW5nIGNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgcHJvdGVjdGVkIFN5c3RlbS5UZXh0LkVuY29kaW5nIGVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuVVRGODsKKworICAgICAgICBwdWJsaWMgVEh0dHBIYW5kbGVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwSGFuZGxlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBIYW5kbGVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFByb2Nlc3NSZXF1ZXN0KEh0dHBMaXN0ZW5lckNvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50RW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgICAgIFByb2Nlc3NSZXF1ZXN0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUHJvY2Vzc1JlcXVlc3QoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50RW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgICAgIFByb2Nlc3NSZXF1ZXN0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUHJvY2Vzc1JlcXVlc3QoU3RyZWFtIGlucHV0LCBTdHJlYW0gb3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGlucHV0LG91dHB1dCk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzUmV1c2FibGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTFmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzCkBAIC0wLDAgKzEsOTcgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLldlYjsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGFzeW5jIHRhc2sgYmFzZWQgSFRUUCBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIHRocmlmdCBzZXJ2aWNlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUSHR0cFRhc2tBc3luY0hhbmRsZXIgOiBIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQXN5bmNQcm9jZXNzb3IgX3Byb2Nlc3NvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2xGYWN0b3J5IF9pbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2xGYWN0b3J5IF9vdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVEh0dHBUYXNrQXN5bmNIYW5kbGVyIi8+IGNsYXNzCisgICAgICAgIC8vLyB1c2luZyB0aGUgPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUSHR0cFRhc2tBc3luY0hhbmRsZXIoVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIDxwYXJhbXJlZiBuYW1lPSJwcm90b2NvbEZhY3RvcnkiLz4gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb2Nlc3NvciI+VGhlIGFzeW5jIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sRmFjdG9yeSI+VGhlIHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBpbnB1dCBwcm90b2NvbCBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0UHJvdG9jb2xGYWN0b3J5Ij5UaGUgb3V0cHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICAgICAgICBfaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBQcm9jZXNzUmVxdWVzdEFzeW5jKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuSW5wdXRTdHJlYW0sIGNvbnRleHQuUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gX2lucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IF9vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBfcHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNkMDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MKQEAgLTAsMCArMSwxMTcgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyIDogVFRyYW5zcG9ydAorICAgIHsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBieXRlU3RyZWFtOworCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlU3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5Ub0FycmF5KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU2VyaWFsaXplKFRBYnN0cmFjdEJhc2UgcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAgICAgdmFyIHAgPSBuZXcgVEJpbmFyeVByb3RvY29sKHQpOworCisgICAgICAgICAgICBzLldyaXRlKHApOworCisgICAgICAgICAgICByZXR1cm4gdC5HZXRCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVCBEZVNlcmlhbGl6ZTxUPihieXRlW10gYnVmKSB3aGVyZSBUIDogVEFic3RyYWN0QmFzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVE1lbW9yeUJ1ZmZlcihidWYpOworICAgICAgICAgICAgdmFyIHAgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoVEJhc2UpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gdHlwZW9mKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgICAgIHZhciB0ID0gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlPFQ+KCk7CisgICAgICAgICAgICAgICAgbWV0aG9kLkludm9rZSh0LCBuZXcgb2JqZWN0W10geyBwIH0pOworICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgICAgIHJldHVybiAoVCltZXRob2QuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXSB7IHAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhNTBhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTExIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIGNsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmVyTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUGlwZU5hbWU7CisgICAgICAgIHByaXZhdGUgaW50IENvbm5lY3RUaW1lb3V0OworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlck5hbWUgPSAiLiI7CisgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgc2VydmVyLCBzdHJpbmcgcGlwZSwgaW50IHRpbWVvdXQgPSBUaW1lb3V0LkluZmluaXRlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJOYW1lID0gKHNlcnZlciAhPSAiIikgPyBzZXJ2ZXIgOiAiLiI7CisgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsaWVudCAhPSBudWxsICYmIGNsaWVudC5Jc0Nvbm5lY3RlZDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oU2VydmVyTmFtZSwgUGlwZU5hbWUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOworICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoQ29ubmVjdFRpbWVvdXQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2xpZW50LlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKworICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuRGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIxNWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyOTYgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFBpcGUgb24gdGhlIGxvY2FsaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgcGlwZUFkZHJlc3M7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbCBhc3luY01vZGUgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHN0cmluZyBwaXBlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5waXBlQWRkcmVzcyA9IHBpcGVBZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbnN1cmVQaXBlSW5zdGFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0uTWF4QWxsb3dlZFNlcnZlckluc3RhbmNlczsKKyAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IFBpcGVUcmFuc21pc3Npb25Nb2RlLkJ5dGU7CisgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhc3luY01vZGUgPyBQaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMgOiBQaXBlT3B0aW9ucy5Ob25lOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBJTkJVRl9TSVpFID0gNDA5NjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgT1VUQlVGX1NJWkUgPSA0MDk2OworCisgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICB2YXIgc2VjdXJpdHkgPSBuZXcgUGlwZVNlY3VyaXR5KCk7CisgICAgICAgICAgICAgICAgc2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFBpcGVBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5SWRlbnRpZmllcihXZWxsS25vd25TaWRUeXBlLldvcmxkU2lkLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVBY2Nlc3NSaWdodHMuUmVhZCB8IFBpcGVBY2Nlc3NSaWdodHMuV3JpdGUgfCBQaXBlQWNjZXNzUmlnaHRzLlN5bmNocm9uaXplIHwgUGlwZUFjY2Vzc1JpZ2h0cy5DcmVhdGVOZXdJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlLkFsbG93CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIElOQlVGX1NJWkUsIE9VVEJVRl9TSVpFLCBzZWN1cml0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgIC8vIE1vbm8gc3RpbGwgZG9lcyBub3Qgc3VwcG9ydCBhc3luYywgZmFsbGJhY2sgdG8gc3luYworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIElOQlVGX1NJWkUsIE9VVEJVRl9TSVpFLCBzZWN1cml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luV2FpdEZvckNvbm5lY3Rpb24oYXN5bmNSZXN1bHQgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRW5kV2FpdEZvckNvbm5lY3Rpb24oYXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uV2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgU2VydmVyVHJhbnNwb3J0KHN0cmVhbSxhc3luY01vZGUpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7ICAvLyBwYXNzIG93bmVyc2hpcCB0byBTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFNlcnZlclRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGFzeW5jTW9kZTsKKworICAgICAgICAgICAgcHVibGljIFNlcnZlclRyYW5zcG9ydChOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtLCBib29sIGFzeW5jTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgICAgICB0aGlzLmFzeW5jTW9kZSA9IGFzeW5jTW9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHN0cmVhbSAhPSBudWxsICYmIHN0cmVhbS5Jc0Nvbm5lY3RlZDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpblJlYWQoYnVmLCBvZmYsIGxlbiwgYXN5bmNSZXN1bHQgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBzdHJlYW0uRW5kUmVhZChhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZU91dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgICAgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgICAgICAgICAgICAgICB2YXIgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCAxNSAqIDQwOTYpOyAgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICAgICAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpbldyaXRlKGJ1Ziwgb2ZmLCBuQnl0ZXMsIGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRW5kV3JpdGUoYXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZU91dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBuQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb2ZmICs9IG5CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCBuQnl0ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwppbmRleCAyMTgyOTFhLi5kOGVjNjJhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwpAQCAtMjcsMTM1ICsyNywxNTAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKLQl7Ci0JCS8qKgotCQkqIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0Ci0JCSovCi0JCXByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKKyAgICBwdWJsaWMgY2xhc3MgVFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIHNlcnZlciA9IG51bGw7CiAKLQkJLyoqCi0JCSAqIFBvcnQgdG8gbGlzdGVuIG9uCi0JCSAqLwotCQlwcml2YXRlIGludCBwb3J0ID0gMDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9ydCB0byBsaXN0ZW4gb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOwogCi0JCS8qKgotCQkgKiBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dCA9IDA7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBjbGllbnRUaW1lb3V0ID0gMDsKIAotCQkvKioKLQkJICogV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCi0JCSAqLwotCQlwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOwogCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotCQkgKi8KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQk6dGhpcyhsaXN0ZW5lciwgMCkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCi0JCXsKLQkJCXRoaXMuc2VydmVyID0gbGlzdGVuZXI7Ci0JCQl0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKLQkJICovCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0KQotCQkJOiB0aGlzKHBvcnQsIDApCi0JCXsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAotCQkgKi8KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0KQotCQkJOnRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCi0JCXsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpCi0JCXsKLQkJCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCQl0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwotCQkJdGhpcy51c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7Ci0JCQl0cnkKLQkJCXsKLQkJCQkvLyBNYWtlIHNlcnZlciBzb2NrZXQKLQkJCQlzZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCB0aGlzLnBvcnQpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbikKLQkJCXsKLQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRoaXMudXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwTGlzdGVuZXIodGhpcy5wb3J0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHRoaXMucG9ydCArICIuIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKLQkJewotCQkJLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNlcnZlci5TdGFydCgpOwotCQkJCX0KLQkJCQljYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSwgc3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQotCQl7Ci0JCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7Ci0JCQl9Ci0JCQl0cnkKLQkJCXsKLQkJCQlUY3BDbGllbnQgcmVzdWx0ID0gc2VydmVyLkFjY2VwdFRjcENsaWVudCgpOwotCQkJCVRTb2NrZXQgcmVzdWx0MiA9IG5ldyBUU29ja2V0KHJlc3VsdCk7Ci0JCQkJcmVzdWx0Mi5UaW1lb3V0ID0gY2xpZW50VGltZW91dDsKLQkJCQlpZiAodXNlQnVmZmVyZWRTb2NrZXRzKQotCQkJCXsKLQkJCQkJVEJ1ZmZlcmVkVHJhbnNwb3J0IHJlc3VsdDMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHJlc3VsdDIpOwotCQkJCQlyZXR1cm4gcmVzdWx0MzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIHJlc3VsdDI7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKLQkJCX0KLQkJfQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFNvY2tldCByZXN1bHQyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQgcmVzdWx0ID0gc2VydmVyLkFjY2VwdFRjcENsaWVudCgpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0MiA9IG5ldyBUU29ja2V0KHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDIuVGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydCByZXN1bHQzID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChyZXN1bHQyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIFRTb2NrZXQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCB0aGVuIGxldAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBkbyBwcm9wZXIgY2xlYW51cCBvZiB0aGUgVGNwQ2xpZW50IG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdDIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpcmVzdWx0KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXIuU3RvcCgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOwotCQkJCX0KLQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwppbmRleCBjOTlkMDdmLi5lNjM4ODBiIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMjUsMTkgKzI1LDIwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKLQl7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIExpc3RlbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCk7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIExpc3RlbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCk7CiAKLQkJcHVibGljIFRUcmFuc3BvcnQgQWNjZXB0KCkKLQkJewotCQkJVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBBY2NlcHRJbXBsKCk7Ci0JCQlpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKLQkJCSAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc3BvcnQ7Ci0JCSB9Ci0JfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBBY2NlcHQoKQorICAgICAgICB7CisgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IEFjY2VwdEltcGwoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDY5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzCkBAIC0wLDAgKzEsMzkzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworLyogb25seSBmb3Igc2lsdmVybGlnaHQgKi8KKyNpZiBTSUxWRVJMSUdIVAorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVFNpbHZlcmxpZ2h0U29ja2V0IDogVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IG51bGw7CisgICAgICAgIHN0YXRpYyBNYW51YWxSZXNldEV2ZW50IHJlYWRBc3luY0NvbXBsZXRlID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICBwdWJsaWMgZXZlbnQgRXZlbnRIYW5kbGVyPFNvY2tldEFzeW5jRXZlbnRBcmdzPiBjb25uZWN0SGFuZGxlciA9IG51bGw7CisKKyAgICAgICAgLy8gbWVtb3J5IHN0cmVhbSBmb3Igd3JpdGUgY2FjaGUuCisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICBwcml2YXRlIHN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQgPSAwOworCisgICAgICAgIC8vIGNvbnN0cnVjdG9yCisgICAgICAgIHB1YmxpYyBUU2lsdmVybGlnaHRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnN0cnVjdG9yCisgICAgICAgIHB1YmxpYyBUU2lsdmVybGlnaHRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworCisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIHN0cmVhbS1iYXNlZCwgVENQIHNvY2tldCB1c2luZyB0aGUgSW50ZXJOZXR3b3JrIEFkZHJlc3MgRmFtaWx5LgorICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldChBZGRyZXNzRmFtaWx5LkludGVyTmV0d29yaywgU29ja2V0VHlwZS5TdHJlYW0sIFByb3RvY29sVHlwZS5UY3ApOworICAgICAgICAgICAgc29ja2V0Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgSG9zdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgUG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc29ja2V0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMCkgICAgIC8vIG5vIHRpbWVvdXQgLT4gaW5maW5pdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMTAwMDA7ICAvLyBzZXQgYSBkZWZhdWx0IHRpbWVvdXQgZm9yIFdQLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIERuc0VuZFBvaW50LiBUaGUgaG9zdE5hbWUgYW5kIHBvcnQgYXJlIHBhc3NlZCBpbiB0byB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAgICBEbnNFbmRQb2ludCBob3N0RW50cnkgPSBuZXcgRG5zRW5kUG9pbnQodGhpcy5ob3N0LCB0aGlzLnBvcnQpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgU29ja2V0QXN5bmNFdmVudEFyZ3Mgb2JqZWN0IHRvIGJlIHVzZWQgaW4gdGhlIGNvbm5lY3Rpb24gcmVxdWVzdAorICAgICAgICAgICAgICAgIFNvY2tldEFzeW5jRXZlbnRBcmdzIHNvY2tldEV2ZW50QXJnID0gbmV3IFNvY2tldEFzeW5jRXZlbnRBcmdzKCk7CisgICAgICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuUmVtb3RlRW5kUG9pbnQgPSBob3N0RW50cnk7CisKKyAgICAgICAgICAgICAgICAvLyBJbmxpbmUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIENvbXBsZXRlZCBldmVudC4KKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIGV2ZW50IGhhbmRsZXIgd2FzIGltcGxlbWVudGVkIGlubGluZSBpbiBvcmRlciB0byBtYWtlIHRoaXMgbWV0aG9kIHNlbGYtY29udGFpbmVkLgorICAgICAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLkNvbXBsZXRlZCArPSBuZXcgRXZlbnRIYW5kbGVyPFNvY2tldEFzeW5jRXZlbnRBcmdzPihkZWxlZ2F0ZShvYmplY3QgcywgU29ja2V0QXN5bmNFdmVudEFyZ3MgZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0SGFuZGxlcih0aGlzLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgLy8gTWFrZSBhbiBhc3luY2hyb25vdXMgQ29ubmVjdCByZXF1ZXN0IG92ZXIgdGhlIHNvY2tldAorICAgICAgICAgICAgICAgIHNvY2tldC5Db25uZWN0QXN5bmMoc29ja2V0RXZlbnRBcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgX3RpbWVvdXQgPSB0cnVlOworICAgICAgICAgICAgc3RyaW5nIF9lcnJvciA9IG51bGw7CisgICAgICAgICAgICBpbnQgX3JlY3ZCeXRlcyA9IC0xOworCisgICAgICAgICAgICBpZiAoc29ja2V0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJTb2NrZXQgaXMgbm90IG9wZW4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIFNvY2tldEFzeW5jRXZlbnRBcmdzIGNvbnRleHQgb2JqZWN0CisgICAgICAgICAgICBTb2NrZXRBc3luY0V2ZW50QXJncyBzb2NrZXRFdmVudEFyZyA9IG5ldyBTb2NrZXRBc3luY0V2ZW50QXJncygpOworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuUmVtb3RlRW5kUG9pbnQgPSBzb2NrZXQuUmVtb3RlRW5kUG9pbnQ7CisKKyAgICAgICAgICAgIC8vIFNldHVwIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZGF0YQorICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuU2V0QnVmZmVyKGJ1Ziwgb2ZmLCBsZW4pOworCisgICAgICAgICAgICAvLyBJbmxpbmUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIENvbXBsZXRlZCBldmVudC4KKyAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgZXZlbiBoYW5kbGVyIHdhcyBpbXBsZW1lbnRlZCBpbmxpbmUgaW4gb3JkZXIgdG8gbWFrZQorICAgICAgICAgICAgLy8gdGhpcyBtZXRob2Qgc2VsZi1jb250YWluZWQuCisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5Db21wbGV0ZWQgKz0gbmV3IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4oZGVsZWdhdGUob2JqZWN0IHMsIFNvY2tldEFzeW5jRXZlbnRBcmdzIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RpbWVvdXQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChlLlNvY2tldEVycm9yID09IFNvY2tldEVycm9yLlN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcmVjdkJ5dGVzID0gZS5CeXRlc1RyYW5zZmVycmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZXJyb3IgPSBlLlNvY2tldEVycm9yLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVhZEFzeW5jQ29tcGxldGUuU2V0KCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGV2ZW50IHRvIG5vbnNpZ25hbGVkLCBjYXVzaW5nIHRocmVhZHMgdG8gYmxvY2sKKyAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLlJlc2V0KCk7CisKKyAgICAgICAgICAgIC8vIE1ha2UgYW4gYXN5bmNocm9ub3VzIFJlY2VpdmUgcmVxdWVzdCBvdmVyIHRoZSBzb2NrZXQKKyAgICAgICAgICAgIHNvY2tldC5SZWNlaXZlQXN5bmMoc29ja2V0RXZlbnRBcmcpOworCisgICAgICAgICAgICAvLyBCbG9jayB0aGUgVUkgdGhyZWFkIGZvciBhIG1heGltdW0gb2YgVElNRU9VVF9NSUxMSVNFQ09ORFMgbWlsbGlzZWNvbmRzLgorICAgICAgICAgICAgLy8gSWYgbm8gcmVzcG9uc2UgY29tZXMgYmFjayB3aXRoaW4gdGhpcyB0aW1lIHRoZW4gcHJvY2VlZAorICAgICAgICAgICAgcmVhZEFzeW5jQ29tcGxldGUuV2FpdE9uZSh0aGlzLnRpbWVvdXQpOworCisgICAgICAgICAgICBpZiAoX3RpbWVvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlRpbWVkT3V0LCAiU29ja2V0IHJlY3YgdGltZW91dCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2Vycm9yICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIF9lcnJvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBfcmVjdkJ5dGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGJlZ2luRmx1c2hfQ29tcGxldGVkKG9iamVjdCBzZW5kZXIsIFNvY2tldEFzeW5jRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZsdXNoQXN5bmNSZXN1bHQgZmx1c2hBc3luY1Jlc3VsdCA9IGUuVXNlclRva2VuIGFzIEZsdXNoQXN5bmNSZXN1bHQ7CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgIGlmIChlLlNvY2tldEVycm9yICE9IFNvY2tldEVycm9yLlN1Y2Nlc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGUuU29ja2V0RXJyb3IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUFzeW5jUmVzdWx0IEJlZ2luRmx1c2goQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFeHRyYWN0IHJlcXVlc3QgYW5kIHJlc2V0IGJ1ZmZlcgorICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBvdXRwdXRTdHJlYW0uVG9BcnJheSgpOworCisgICAgICAgICAgICBGbHVzaEFzeW5jUmVzdWx0IGZsdXNoQXN5bmNSZXN1bHQgPSBuZXcgRmx1c2hBc3luY1Jlc3VsdChjYWxsYmFjaywgc3RhdGUpOworCisgICAgICAgICAgICBTb2NrZXRBc3luY0V2ZW50QXJncyBzb2NrZXRFdmVudEFyZyA9IG5ldyBTb2NrZXRBc3luY0V2ZW50QXJncygpOworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuUmVtb3RlRW5kUG9pbnQgPSBzb2NrZXQuUmVtb3RlRW5kUG9pbnQ7CisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5Vc2VyVG9rZW4gPSBmbHVzaEFzeW5jUmVzdWx0OworCisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5Db21wbGV0ZWQgKz0gYmVnaW5GbHVzaF9Db21wbGV0ZWQ7CisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5TZXRCdWZmZXIoZGF0YSwgMCwgZGF0YS5MZW5ndGgpOworCisgICAgICAgICAgICBzb2NrZXQuU2VuZEFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKworICAgICAgICAgICAgcmV0dXJuIGZsdXNoQXN5bmNSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNSZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIWZsdXNoQXN5bmNSZXN1bHQuSXNDb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgd2FpdEhhbmRsZSA9IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNXYWl0SGFuZGxlOworICAgICAgICAgICAgICAgICAgICB3YWl0SGFuZGxlLldhaXRPbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEhhbmRsZS5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IGZyb20gaW1wbCBmcm9tIFRIdHRwQ2xpZW50LmNzCisgICAgICAgIC8vIEJhc2VkIG9uIGh0dHA6Ly9tc212cHMuY29tL2Jsb2dzL2x1aXNhYnJldS9hcmNoaXZlLzIwMDkvMDYvMTUvbXVsdGl0aHJlYWRpbmctaW1wbGVtZW50aW5nLXRoZS1pYXN5bmNyZXN1bHQtaW50ZXJmYWNlLmFzcHgKKyAgICAgICAgY2xhc3MgRmx1c2hBc3luY1Jlc3VsdCA6IElBc3luY1Jlc3VsdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEJvb2xlYW4gX2lzQ29tcGxldGVkOworICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IF9ldnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFzeW5jQ2FsbGJhY2sgX2NiTWV0aG9kOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX3N0YXRlOworCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBvYmplY3Qgc3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NiTWV0aG9kID0gY2JNZXRob2Q7CisgICAgICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIGJ5dGVbXSBEYXRhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIFNvY2tldCBDb25uZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIFRUcmFuc3BvcnRFeGNlcHRpb24gQXN5bmNFeGNlcHRpb24geyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IEFzeW5jU3RhdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3N0YXRlOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBXYWl0SGFuZGxlIEFzeW5jV2FpdEhhbmRsZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBHZXRFdnRIYW5kbGUoKTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDb21wbGV0ZWRTeW5jaHJvbm91c2x5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzQ29tcGxldGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pc0NvbXBsZXRlZDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfbG9ja2VyID0gbmV3IG9iamVjdCgpOworCisgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgR2V0RXZ0SGFuZGxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NrIChfbG9ja2VyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9ldnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoX2lzQ29tcGxldGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZXZ0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pc0NvbXBsZXRlZCA9IHRydWU7IC8vMS4gc2V0IF9pc2NvbXBsZXRlZCB0byB0cnVlCisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7IC8vMi4gc2V0IHRoZSBldmVudCwgd2hlbiBpdCBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBOb3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY2JNZXRob2QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jYk1ldGhvZCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzb2NrZXQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpc29ja2V0KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyNlbmRyZWdpb24KKyAgICB9Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCmluZGV4IDRjNjRhMzYuLmQ4ZmEzMzUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCkBAIC0yNiwxMjMgKzI2LDIyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUU29ja2V0IDogVFN0cmVhbVRyYW5zcG9ydAotCXsKLQkJcHJpdmF0ZSBUY3BDbGllbnQgY2xpZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBzdHJpbmcgaG9zdCA9IG51bGw7Ci0JCXByaXZhdGUgaW50IHBvcnQgPSAwOwotCQlwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKKyAgICBwdWJsaWMgY2xhc3MgVFNvY2tldCA6IFRTdHJlYW1UcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7CiAKLQkJcHVibGljIFRTb2NrZXQoVGNwQ2xpZW50IGNsaWVudCkKLQkJewotCQkJdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHB1YmxpYyBUU29ja2V0KFRjcENsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogCi0JCQlpZiAoSXNPcGVuKQotCQkJewotCQkJCWlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOwotCQkJCW91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQpIDogdGhpcyhob3N0LCBwb3J0LCAwKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCi0JCXsKLQkJCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JCQl0aGlzLnBvcnQgPSBwb3J0OwotCQkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwogCi0JCQlJbml0U29ja2V0KCk7Ci0JCX0KKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKLQkJewotCQkJY2xpZW50ID0gbmV3IFRjcENsaWVudCgpOwotCQkJY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOworICAgICAgICAgICAgdGhpcy5jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgdGhpcy5jbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CiAKLQkJcHVibGljIGludCBUaW1lb3V0Ci0JCXsKLQkJCXNldAotCQkJewotCQkJCWNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQgPSB2YWx1ZTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIGNsaWVudDsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIHN0cmluZyBIb3N0Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBob3N0OwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSG9zdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgUG9ydAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gcG9ydDsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJaWYgKGNsaWVudCA9PSBudWxsKQotCQkJCXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlyZXR1cm4gY2xpZW50LkNvbm5lY3RlZDsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJCWlmIChJc09wZW4pCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQogCi0JCQlpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQogCi0JCQlpZiAocG9ydCA8PSAwKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7Ci0JCQl9CisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChjbGllbnQgPT0gbnVsbCkKLQkJCXsKLQkJCQlJbml0U29ja2V0KCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQogCi0JCQljbGllbnQuQ29ubmVjdChob3N0LCBwb3J0KTsKLQkJCWlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOwotCQkJb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOwotCQl9CisgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKSAgICAgICAgICAgIC8vIG5vIHRpbWVvdXQgLT4gaW5maW5pdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgdGltZW91dCAtPiB1c2UgaXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25uZWN0SGVscGVyIGhscCA9IG5ldyBDb25uZWN0SGVscGVyKGNsaWVudCk7CisgICAgICAgICAgICAgICAgSUFzeW5jUmVzdWx0IGFzeW5jcmVzID0gY2xpZW50LkJlZ2luQ29ubmVjdChob3N0LCBwb3J0LCBuZXcgQXN5bmNDYWxsYmFjayhDb25uZWN0Q2FsbGJhY2spLCBobHApOworICAgICAgICAgICAgICAgIGJvb2wgYkNvbm5lY3RlZCA9IGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5XYWl0T25lKHRpbWVvdXQpICYmIGNsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICAgICAgaWYgKCFiQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jayAoaGxwLk11dGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNhbGxiYWNrRG9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHAuRG9DbGVhbnVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5UaW1lZE91dCwgIkNvbm5lY3QgdGltZWQgb3V0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJYmFzZS5DbG9zZSgpOwotCQkJaWYgKGNsaWVudCAhPSBudWxsKQotCQkJewotCQkJCWNsaWVudC5DbG9zZSgpOwotCQkJCWNsaWVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgc3RhdGljIHZvaWQgQ29ubmVjdENhbGxiYWNrKElBc3luY1Jlc3VsdCBhc3luY3JlcykKKyAgICAgICAgeworICAgICAgICAgICAgQ29ubmVjdEhlbHBlciBobHAgPSBhc3luY3Jlcy5Bc3luY1N0YXRlIGFzIENvbm5lY3RIZWxwZXI7CisgICAgICAgICAgICBsb2NrIChobHAuTXV0ZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGxwLkNhbGxiYWNrRG9uZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50LkNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaGxwLkNsaWVudC5FbmRDb25uZWN0KGFzeW5jcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhdGNoIHRoYXQgYXdheQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChobHAuRG9DbGVhbnVwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNsaWVudCBpcyBJRGlzcG9zYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKWhscC5DbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgaGxwLkNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDb25uZWN0SGVscGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgTXV0ZXggPSBuZXcgb2JqZWN0KCk7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBEb0NsZWFudXAgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIENhbGxiYWNrRG9uZSA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIFRjcENsaWVudCBDbGllbnQ7CisgICAgICAgICAgICBwdWJsaWMgQ29ubmVjdEhlbHBlcihUY3BDbGllbnQgY2xpZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5DbG9zZSgpOworICAgICAgICAgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKWNsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNGMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzCkBAIC0wLDAgKzEsNzggQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKKyNpZiBORVQ0NQordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKyNlbmRpZgorCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvcGVydHlJbmZvIGZvciB0aGUgRHVhbE1vZGUgcHJvcGVydHkgb2YgdGhlIFN5c3RlbS5OZXQuU29ja2V0cy5Tb2NrZXQgY2xhc3MuIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzb2NrZXRzIGFyZSBjYXBhYmxlIG9mCisgICAgLy8vIGF1dG9tYXRpYyBJUHY0IGFuZCBJUHY2IGhhbmRsaW5nLiBJZiBEdWFsTW9kZSBpcyBwcmVzZW50IHRoZSBzb2NrZXRzIGF1dG9tYXRpY2FsbHkgaGFuZGxlIElQdjQgYW5kIElQdjYgY29ubmVjdGlvbnMuCisgICAgLy8vIElmIHRoZSBEdWFsTW9kZSBpcyBub3QgYXZhaWxhYmxlIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgSVB2NCBvciBJUHY2IGlzIHVzZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVFNvY2tldFZlcnNpb25pemVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVGNwQ2xpZW50IGFjY29yZGluZyB0byB0aGUgY2FwYWJpbGl0aXRlcyBvZiB0aGUgdXNlZCBmcmFtZXdvcmsKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFRjcENsaWVudCBDcmVhdGVUY3BDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgY2xpZW50ID0gbnVsbDsKKworI2lmIE5FVDQ1CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrVjYpOworICAgICAgICAgICAgY2xpZW50LkNsaWVudC5EdWFsTW9kZSA9IHRydWU7CisjZWxzZQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRjcENsaWVudChBZGRyZXNzRmFtaWx5LkludGVyTmV0d29yayk7CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUY3BMaXN0ZW5lciBhY2NvcmRpbmcgdG8gdGhlIGNhcGFiaWxpdGl0ZXMgb2YgdGhlIHVzZWQgZnJhbWV3b3JrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGNwTGlzdGVuZXIgQ3JlYXRlVGNwTGlzdGVuZXIoSW50MzIgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgVGNwTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOworCisjaWYgTkVUNDUKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLklQdjZBbnksIHBvcnQpOworICAgICAgICAgICAgbGlzdGVuZXIuU2VydmVyLkR1YWxNb2RlID0gdHJ1ZTsKKyNlbHNlCisKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLkFueSwgcG9ydCk7CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcwppbmRleCA2MGE4NDEyLi4zMDQ1OTlmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcwpAQCAtMjYsODIgKzI2LDEwMyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IDogVFRyYW5zcG9ydAotCXsKLQkJcHJvdGVjdGVkIFN0cmVhbSBpbnB1dFN0cmVhbTsKLQkJcHJvdGVjdGVkIFN0cmVhbSBvdXRwdXRTdHJlYW07CisgICAgcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIGlucHV0U3RyZWFtOworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIG91dHB1dFN0cmVhbTsKIAotCQlwdWJsaWMgVFN0cmVhbVRyYW5zcG9ydCgpCi0JCXsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgVFN0cmVhbVRyYW5zcG9ydCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU3RyZWFtVHJhbnNwb3J0KFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyZWFtIG91dHB1dFN0cmVhbSkKLQkJewotCQkJdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQkJdGhpcy5vdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07Ci0JCX0KKyAgICAgICAgcHVibGljIFRTdHJlYW1UcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJlYW0gT3V0cHV0U3RyZWFtCi0JCXsKLQkJCWdldCB7IHJldHVybiBvdXRwdXRTdHJlYW07IH0KLQkJfQorICAgICAgICBwdWJsaWMgU3RyZWFtIE91dHB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gb3V0cHV0U3RyZWFtOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyZWFtIElucHV0U3RyZWFtCi0JCXsKLQkJCWdldCB7IHJldHVybiBpbnB1dFN0cmVhbTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBTdHJlYW0gSW5wdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGlucHV0U3RyZWFtOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRydWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0U3RyZWFtLkNsb3NlKCk7Ci0JCQkJb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CiAKLQkJCXJldHVybiBpbnB1dFN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbSIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KIAotCQkJb3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCi0JCXsKLQkJCWlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbSIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQogCi0JCQlvdXRwdXRTdHJlYW0uRmx1c2goKTsKLQkJfQotCX0KKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5GbHVzaCgpOworICAgICAgICB9CisKKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2YTk3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzCkBAIC0wLDAgKzEsMjIzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU1NMIFNlcnZlciBTb2NrZXQgV3JhcHBlciBDbGFzcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUTFNTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVbmRlcmx5aW5nIHRjcCBzZXJ2ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBzZXJ2ZXIgPSBudWxsOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBwb3J0IHdoZXJlIHRoZSBzb2NrZXQgbGlzdGVuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpbWVvdXQgZm9yIHRoZSBjcmVhdGVkIHNlcnZlciBzb2NrZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgY2xpZW50VGltZW91dDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBzZXJ2ZXJjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBwcml2YXRlLSBhbmQgcHVibGljLWtleQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBzZXJ2ZXJDZXJ0aWZpY2F0ZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NlcnZlclNvY2tldCIgLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQgd2hlcmUgdGhlIHNlcnZlciBydW5zLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCwgY2VydGlmaWNhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTZXJ2ZXJTb2NrZXQiIC8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0IHdoZXJlIHRoZSBzZXJ2ZXIgcnVucy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudFRpbWVvdXQiPlNlbmQvcmVjZWl2ZSB0aW1lb3V0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NlcnZlclNvY2tldCIgLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQgd2hlcmUgdGhlIHNlcnZlciBydW5zLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xpZW50VGltZW91dCI+U2VuZC9yZWNlaXZlIHRpbWVvdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1c2VCdWZmZXJlZFNvY2tldHMiPklmIHNldCB0byA8Yz50cnVlPC9jPiBbdXNlIGJ1ZmZlcmVkIHNvY2tldHNdLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZSBvYmplY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRDZXJ0VmFsaWRhdG9yIj5UaGUgY2VydGlmaWNhdGUgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBpbnQgY2xpZW50VGltZW91dCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICAvLyBUT0RPOiBFbmFibGUgVGxzMTEgYW5kIFRsczEyIChUTFMgMS4xIGFuZCAxLjIpIGJ5IGRlZmF1bHQgb25jZSB3ZSBzdGFydCB1c2luZyAuTkVUIDQuNSsuCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjZXJ0aWZpY2F0ZS5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCAiWW91ciBzZXJ2ZXItY2VydGlmaWNhdGUgbmVlZHMgdG8gaGF2ZSBhIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgdGhpcy51c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IgPSBjbGllbnRDZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwTGlzdGVuZXIodGhpcy5wb3J0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHRoaXMucG9ydCArICIuIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RhcnRzIHRoZSBzZXJ2ZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhY2NlcHQgaXMgbm90IGJsb2NraW5nCisgICAgICAgICAgICBpZiAodGhpcy5zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSwgc3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxiYWNrIGZvciBBY2NlcHQgSW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPgorICAgICAgICAvLy8gVFRyYW5zcG9ydC1vYmplY3QuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50IGNsaWVudCA9IHRoaXMuc2VydmVyLkFjY2VwdFRjcENsaWVudCgpOworICAgICAgICAgICAgICAgIGNsaWVudC5TZW5kVGltZW91dCA9IGNsaWVudC5SZWNlaXZlVGltZW91dCA9IHRoaXMuY2xpZW50VGltZW91dDsKKworICAgICAgICAgICAgICAgIC8vd3JhcCB0aGUgY2xpZW50IGluIGFuIFNTTCBTb2NrZXQgcGFzc2luZyBpbiB0aGUgU1NMIGNlcnQKKyAgICAgICAgICAgICAgICBUVExTU29ja2V0IHNvY2tldCA9IG5ldyBUVExTU29ja2V0KAorICAgICAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyQ2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydFZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzKTsKKworICAgICAgICAgICAgICAgIHNvY2tldC5zZXR1cFRMUygpOworCisgICAgICAgICAgICAgICAgaWYgKHVzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRCdWZmZXJlZFRyYW5zcG9ydCB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdG9wcyB0aGUgU2VydmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDE5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcwpAQCAtMCwwICsxLDM3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNTTCBTb2NrZXQgV3JhcHBlciBjbGFzcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUTFNTb2NrZXQgOiBUU3RyZWFtVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnRlcm5hbCBUQ1AgQ2xpZW50CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IGNsaWVudDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgaG9zdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0cmluZyBob3N0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBwb3J0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZXJuYWwgU1NMIFN0cmVhbSBmb3IgSU8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBTc2xTdHJlYW0gc2VjdXJlU3RyZWFtOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmluZXMgd2hldGVyIG9yIG5vdCB0aGlzIHNvY2tldCBpcyBhIHNlcnZlciBzb2NrZXQ8YnIvPgorICAgICAgICAvLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgVExTLWF1dGhlbnRpY2F0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbCBpc1NlcnZlcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY2VydGlmaWNhdGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlciBkZWZpbmVkIGNlcnRpZmljYXRlIHZhbGlkYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLlNTTCBwcm90b2NvbHMgdG8gYmUgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xpZW50Ij5BbiBhbHJlYWR5IGNyZWF0ZWQgVENQLWNsaWVudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzU2VydmVyIj5pZiBzZXQgdG8gPGM+dHJ1ZTwvYz4gW2lzIHNlcnZlcl0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBUY3BDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgYm9vbCBpc1NlcnZlciA9IGZhbHNlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBUbHMxMSBhbmQgVGxzMTIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIHRoaXMuY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworICAgICAgICAgICAgdGhpcy5pc1NlcnZlciA9IGlzU2VydmVyOworICAgICAgICAgICAgaWYgKGlzU2VydmVyICYmIGNlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUVExTU29ja2V0IG5lZWRzIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgZm9yIHNlcnZlciIsICJjZXJ0aWZpY2F0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2UuaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYmFzZS5vdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imhvc3QiPlRoZSBob3N0LCB3aGVyZSB0aGUgc29ja2V0IHNob3VsZCBjb25uZWN0IHRvLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZVBhdGgiPlRoZSBjZXJ0aWZpY2F0ZSBwYXRoLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgc3RyaW5nIGhvc3QsCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIHN0cmluZyBjZXJ0aWZpY2F0ZVBhdGgsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgWDUwOUNlcnRpZmljYXRlLkNyZWF0ZUZyb21DZXJ0RmlsZShjZXJ0aWZpY2F0ZVBhdGgpLCBjZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJob3N0Ij5UaGUgaG9zdCwgd2hlcmUgdGhlIHNvY2tldCBzaG91bGQgY29ubmVjdCB0by48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIHN0cmluZyBob3N0LAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsIGNlcnRpZmljYXRlLCBjZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJob3N0Ij5UaGUgaG9zdCwgd2hlcmUgdGhlIHNvY2tldCBzaG91bGQgY29ubmVjdCB0by48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGltZW91dCI+VGhlIHRpbWVvdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgc3RyaW5nIGhvc3QsCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGludCB0aW1lb3V0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICB0aGlzLmNlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyB0aGUgVGNwQ2xpZW50IGFuZCBzZXRzIHRoZSB0aW1lb3V0cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudCA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBjbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyBTZW5kIC8gUmVjdiBUaW1lb3V0IGZvciBJTworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSB0aGlzLmNsaWVudC5TZW5kVGltZW91dCA9IHRoaXMudGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgVENQIGNsaWVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIGhvc3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSG9zdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHBvcnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgUG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgVENQIENsaWVudCBpcyBDcGVuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGVzIHRoZSBjZXJ0aWZpY2F0ZXMhPGJyLz4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzZW5kZXItb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSB1c2VkIGNlcnRpZmljYXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhaW4iPlRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFZhbGlkYXRpb25FcnJvcnMiPkFuIGVudW0sIHdoaWNoIGxpc3RzIGFsbCB0aGUgZXJyb3JzIGZyb20gdGhlIC5ORVQgY2VydGlmaWNhdGUgY2hlY2suPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBib29sIERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc3NsVmFsaWRhdGlvbkVycm9ycyA9PSBTc2xQb2xpY3lFcnJvcnMuTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25uZWN0cyB0byB0aGUgaG9zdCBhbmQgc3RhcnRzIHRoZSByb3V0aW5lLCB3aGljaCBzZXRzIHVwIHRoZSBUTFMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOworCisgICAgICAgICAgICBzZXR1cFRMUygpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRMUy1zdHJlYW0gYW5kIGxheXMgaXQgb3ZlciB0aGUgZXhpc3Rpbmcgc29ja2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIHNldHVwVExTKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgdmFsaWRhdG9yID0gdGhpcy5jZXJ0VmFsaWRhdG9yID8/IERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcjsKKworICAgICAgICAgICAgaWYgKHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5HZXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNTZXJ2ZXIodGhpcy5jZXJ0aWZpY2F0ZSwgdGhpcy5jZXJ0VmFsaWRhdG9yICE9IG51bGwsIHNzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsaWVudCBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIGNlcnRzID0gY2VydGlmaWNhdGUgIT0gbnVsbCA/IG5ldyBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIHsgY2VydGlmaWNhdGUgfSA6IG5ldyBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzQ2xpZW50KGhvc3QsIGNlcnRzLCBzc2xQcm90b2NvbHMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRoaXMuc2VjdXJlU3RyZWFtOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gdGhpcy5zZWN1cmVTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDbG9zZXMgdGhlIFNTTCBTb2NrZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAodGhpcy5jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuc2VjdXJlU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCmluZGV4IGNlY2RlODcuLjVlNGFjMjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCkBAIC0yMiw1NCArMjIsMTI1IEBACiAgKi8KIAogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0Ci0JewotCQlwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0OwotCQl9CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sIFBlZWsoKQotCQl7Ci0JCQlyZXR1cm4gSXNPcGVuOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9wZWVrQnVmZmVyID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzUGVla0J5dGU7CiAKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgT3BlbigpOworICAgICAgICBwdWJsaWMgYm9vbCBQZWVrKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9JZiB3ZSBhbHJlYWR5IGhhdmUgYSBieXRlIHJlYWQgYnV0IG5vdCBjb25zdW1lZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGlmIChfaGFzUGVla0J5dGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vSWYgdHJhbnNwb3J0IGNsb3NlZCB3ZSBjYW4ndCBwZWVrLgorICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCXB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBieXRlcyA9IFJlYWQoX3BlZWtCdWZmZXIsIDAsIDEpOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpbnQgZ290ID0gMDsKLQkJCWludCByZXQgPSAwOworICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKLQkJCXdoaWxlIChnb3QgPCBsZW4pCi0JCQl7Ci0JCQkJcmV0ID0gUmVhZChidWYsIG9mZiArIGdvdCwgbGVuIC0gZ290KTsKLQkJCQlpZiAocmV0IDw9IDApCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQiKTsKLQkJCQl9Ci0JCQkJZ290ICs9IHJldDsKLQkJCX0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgT3BlbigpOwogCi0JCQlyZXR1cm4gZ290OwotCQl9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CiAKLQkJcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZShieXRlW10gYnVmKSAKLQkJewotCQkJV3JpdGUgKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmIik7CisgICAgICAgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChvZmYgKyBsZW4gPiBidWYuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CiAKLQkJcHVibGljIHZpcnR1YWwgdm9pZCBGbHVzaCgpCi0JCXsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGludCBnb3QgPSAwOworCisgICAgICAgICAgICAvL0lmIHdlIHByZXZpb3VzbHkgcGVla2VkIGEgYnl0ZSwgd2UgbmVlZCB0byB1c2UgdGhhdCBmaXJzdC4KKyAgICAgICAgICAgIGlmIChfaGFzUGVla0J5dGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmW29mZiArIGdvdCsrXSA9IF9wZWVrQnVmZmVyWzBdOworICAgICAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoZ290IDwgbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBSZWFkKGJ1Ziwgb2ZmICsgZ290LCBsZW4gLSBnb3QpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3QgKz0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGUoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRyYW5zcG9ydC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwKKyAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0cmFuc3BvcnQuIik7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpOworCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgY29kZS4gIFB1dCBjbGVhbnVwIGNvZGUgaW4gRGlzcG9zZShCeVZhbCBkaXNwb3NpbmcgQXMgQm9vbGVhbikgYWJvdmUuCisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICAgICAgR0MuU3VwcHJlc3NGaW5hbGl6ZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwppbmRleCBiOTZmN2U4Li43ZjZjYzE4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtMjUsNDQgKzI1LDQ1IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBFeGNlcHRpb24KLQl7Ci0JCXByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGU7CisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlOwogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKCkKLQkJCTogYmFzZSgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUpCi0JCQk6IHRoaXMoKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHlwZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKLQkJewotCQkJVW5rbm93biwKLQkJCU5vdE9wZW4sCi0JCQlBbHJlYWR5T3BlbiwKLQkJCVRpbWVkT3V0LAotCQkJRW5kT2ZGaWxlCi0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIE5vdE9wZW4sCisgICAgICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgIFRpbWVkT3V0LAorICAgICAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwppbmRleCA4ZjRmMTVkLi40N2EwYzYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCkBAIC0yNSwxOCArMjUsMTggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIEZyb20gTWFyayBTbGVlICYgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6Ci0JLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgotCS8vLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KLQkvLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCi0JLy8vIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQotCXsKLQkJcHVibGljIHZpcnR1YWwgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKLQkJewotCQkJcmV0dXJuIHRyYW5zOwotCQl9Ci0JfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRnJvbSBNYXJrIFNsZWUgJmFtcDsgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CisgICAgLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAgICAvLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisgICAgLy8vIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQorICAgIHsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vSlNPTlRlc3QuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L0pTT04vSlNPTlRlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2Q0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9KU09OVGVzdC5jc3Byb2oKQEAgLTAsMCArMSw4NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+eDg2PC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjMwNzAzPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPntFMzdBMDAzNC1EQ0JGLTQ4ODYtQTBEQS0yNUEwM0QxMkQ5NzV9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkpTT05UZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+SlNPTlRlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPgorICAgIDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3x4ODYnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8eDg2JyAiPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iYXBwLmNvbmZpZyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTM4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsOTUgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBKU09OVGVzdAoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFRocmlmdDIzNjUoKTsgIC8vIEpTT04gYmluYXJ5IGRlY29kZXMgdG9vIG11Y2ggZGF0YQorICAgICAgICAgICAgVGVzdFRocmlmdDIzMzYoKTsgIC8vIGhleCBlbmNvZGluZyB1c2luZyBcdVhYWFggd2hlcmUgMHhYWFhYID4gMHhGRgorICAgICAgICAgICAgVGVzdFRocmlmdDM0MDMoKTsgLy8gSlNPTiBlc2NhcGVkIHVuaWNvZGUgc3Vycm9nYXRlIHBhaXIgc3VwcG9ydC4KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQyMzY1KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGxlbiA9IDA7IGxlbiA8IDEwOyArK2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YVdyaXR0ZW4gPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgICAgIHJuZC5OZXh0Qnl0ZXMoZGF0YVdyaXR0ZW4pOworCisgICAgICAgICAgICAgICAgU3RyZWFtIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQobnVsbCwgc3RtKTsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgICAgICBwcm90LldyaXRlQmluYXJ5KGRhdGFXcml0dGVuKTsKKworICAgICAgICAgICAgICAgIHN0bS5Qb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgICAgIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGFSZWFkID0gcHJvdC5SZWFkQmluYXJ5KCk7CisKKyAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZGF0YVJlYWQuTGVuZ3RoID09IGRhdGFXcml0dGVuLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhUmVhZC5MZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGRhdGFSZWFkW2ldID09IGRhdGFXcml0dGVuW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQyMzM2KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIFJVU1NJQU5fVEVYVCA9ICJcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBSVVNTSUFOX0pTT04gPSAiXCJcXHUwNDIwXFx1MDQ0M1xcdTA0NDFcXHUwNDQxXFx1MDQzYVxcdTA0M2VcXHUwNDM1IFxcdTA0MWRcXHUwNDMwXFx1MDQzN1xcdTA0MzJcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDM1XCIiOworCisgICAgICAgICAgICAvLyBwcmVwYXJlIGJ1ZmZlciB3aXRoIEpTT04gZGF0YQorICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbmV3IGJ5dGVbUlVTU0lBTl9KU09OLkxlbmd0aF07CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFJVU1NJQU5fSlNPTi5MZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICByYXdCeXRlc1tpXSA9IChieXRlKShSVVNTSUFOX0pTT05baV0gJiAoY2hhcikweEZGKTsgIC8vIG9ubHkgbG93IGJ5dGVzCisKKyAgICAgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0ocmF3Qnl0ZXMpOworICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHByb3QuUmVhZFN0cmluZygpID09IFJVU1NJQU5fVEVYVCwgInJlYWRpbmcgSlNPTiB3aXRoIGhleC1lbmNvZGVkIGNoYXJzID4gOCBiaXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBUZXN0VGhyaWZ0MzQwMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBHQ0xFRl9URVhUID0gIlx1ZDgzNFx1ZGQxZSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgR0NMRUZfSlNPTiA9ICJcIlxcdWQ4MzRcXHVkZDFlXCIiOworCisgICAgICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoR0NMRUZfSlNPTikpOworICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHByb3QuUmVhZFN0cmluZygpID09IEdDTEVGX1RFWFQsICJyZWFkaW5nIEpTT04gd2l0aCBzdXJyb2dhdGUgcGFpciBoZXgtZW5jb2RlZCBjaGFycyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZmNGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiDDvGJlciBlaW5lIEFzc2VtYmx5IHdlcmRlbiDDvGJlciBkaWUgZm9sZ2VuZGVuCisvLyBBdHRyaWJ1dGUgZ2VzdGV1ZXJ0LiDDhG5kZXJuIFNpZSBkaWVzZSBBdHRyaWJ1dHdlcnRlLCB1bSBkaWUgSW5mb3JtYXRpb25lbiB6dSDDpG5kZXJuLAorLy8gZGllIG1pdCBlaW5lciBBc3NlbWJseSB2ZXJrbsO8cGZ0IHNpbmQuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkpTT05UZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gRHVyY2ggRmVzdGxlZ2VuIHZvbiBDb21WaXNpYmxlIGF1ZiAiZmFsc2UiIHdlcmRlbiBkaWUgVHlwZW4gaW4gZGllc2VyIEFzc2VtYmx5IHVuc2ljaHRiYXIKKy8vIGbDvHIgQ09NLUtvbXBvbmVudGVuLiBXZW5uIFNpZSBhdWYgZWluZW4gVHlwIGluIGRpZXNlciBBc3NlbWJseSB2b24KKy8vIENPTSB6dWdyZWlmZW4gbcO8c3NlbiwgbGVnZW4gU2llIGRhcyBDb21WaXNpYmxlLUF0dHJpYnV0IGbDvHIgZGllc2VuIFR5cCBhdWYgInRydWUiIGZlc3QuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBEaWUgZm9sZ2VuZGUgR1VJRCBiZXN0aW1tdCBkaWUgSUQgZGVyIFR5cGJpYmxpb3RoZWssIHdlbm4gZGllc2VzIFByb2pla3QgZsO8ciBDT00gdmVyZsO8Z2JhciBnZW1hY2h0IHdpcmQKK1thc3NlbWJseTogR3VpZCgiMmIyZTdkNTYtM2U2NS00MzY4LTkyZDctZTM0ZDU2YjcxMDVlIildCisKKy8vIFZlcnNpb25zaW5mb3JtYXRpb25lbiBmw7xyIGVpbmUgQXNzZW1ibHkgYmVzdGVoZW4gYXVzIGRlbiBmb2xnZW5kZW4gdmllciBXZXJ0ZW46CisvLworLy8gICAgICBIYXVwdHZlcnNpb24KKy8vICAgICAgTmViZW52ZXJzaW9uCisvLyAgICAgIEJ1aWxkbnVtbWVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gU2llIGvDtm5uZW4gYWxsZSBXZXJ0ZSBhbmdlYmVuIG9kZXIgZGllIHN0YW5kYXJkbcOkw59pZ2VuIEJ1aWxkLSB1bmQgUmV2aXNpb25zbnVtbWVybgorLy8gw7xiZXJuZWhtZW4sIGluZGVtIFNpZSAiKiIgZWluZ2ViZW46CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL2FwcC5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9hcHAuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTkxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9hcHAuY29uZmlnCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKzxzdGFydHVwPjxzdXBwb3J0ZWRSdW50aW1lIHZlcnNpb249InY0LjAiIHNrdT0iLk5FVEZyYW1ld29yayxWZXJzaW9uPXY0LjAiLz48L3N0YXJ0dXA+PC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTBhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGVzdC5NdWx0aXBsZXg7CisKK25hbWVzcGFjZSBUZXN0Lk11bHRpcGxleC5DbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZShpbnQgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICB0cmFucy5PcGVuKCk7CisKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgUHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCB0cnVlLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG11bHRpcGxleDsKKworICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworCisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9BR0dSKTsKKyAgICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3IgPSBuZXcgQWdnci5DbGllbnQobXVsdGlwbGV4KTsKKworICAgICAgICAgICAgICAgIGZvciAoc2J5dGUgaSA9IDE7IDEwID49IGk7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoYmVuY2guZmlib25hY2NpKGkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgayBpbiBhZ2dyLmdldFZhbHVlcygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrLlRvU3RyaW5nKCkgKyAiICIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gdXNob3J0LlBhcnNlKGFyZ3NbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhlY3V0ZShwb3J0KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUxY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDE0OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns1RTkxREExNy1FNTQ4LTQxNUYtOEM5Ri05RTg0RURGOEVFMDZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPk11bHRpcGxleENsaWVudDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPk11bHRpcGxleENsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPi4uXGJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXE11bHRpcGxleC5UZXN0LkNvbW1vbi5jcyI+CisgICAgICA8TGluaz5NdWx0aXBsZXguVGVzdC5Db21tb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQWdnci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEJlbmNobWFya1NlcnZpY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxFcnJvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNdWx0aXBsZXguVGVzdC5DbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKKworU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg2ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleENsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjY2RkM2MUU1LTQyMEItNGI1Ni04MDEyLUQ2RDZDRTIyNTM3RiIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI1M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworR0VORVJBVEVEID0gXAorCWdlbi1jc2hhcnAvQWdnci5jcyBcCisJZ2VuLWNzaGFycC9CZW5jaG1hcmtTZXJ2aWNlLmNzIFwKKwlnZW4tY3NoYXJwL0Vycm9yLmNzCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkVSQVRFRCkKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworZ2VuLWNzaGFycC9BZ2dyLmNzOiAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgJDwKKworZ2VuLWNzaGFycC9CZW5jaG1hcmtTZXJ2aWNlLmNzIGdlbi1jc2hhcnAvRXJyb3IuY3M6ICQodG9wX3NyY2RpcikvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAkPAorCitUaHJpZnRJbXBsLmRsbDogTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzICQoR0VORVJBVEVEKSAuLi8uLi9UaHJpZnQuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC10OmxpYnJhcnkgLW91dDouL1RocmlmdEltcGwuZGxsIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAkKEdFTkVSQVRFRCkgJDwKKworTXVsdGlwbGV4Q2xpZW50LmV4ZTogQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcyBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQ8CisKK011bHRpcGxleFNlcnZlci5leGU6IFNlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkPAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNzaGFycCAqLmV4ZSAqLmRsbAorCitURVNUUE9SVCA9IDk1MDEKK2NoZWNrLWxvY2FsOiBNdWx0aXBsZXhTZXJ2ZXIuZXhlIE11bHRpcGxleENsaWVudC5leGUKKwllY2hvICQoVEVTVFBPUlQpCisJTU9OT19QQVRIPS4uLy4uLyB0aW1lb3V0IDEwIG1vbm8gTXVsdGlwbGV4U2VydmVyLmV4ZSAkKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0uLi8uLi8gbW9ubyBNdWx0aXBsZXhDbGllbnQuZXhlICQoVEVTVFBPUlQpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L011bHRpcGxleC5UZXN0LkNvbW1vbi5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODc4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L011bHRpcGxleC5UZXN0LkNvbW1vbi5jcwpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOworCituYW1lc3BhY2UgVGVzdC5NdWx0aXBsZXgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ29uc3RhbnRzCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICJCZW5jaG1hcmtTZXJ2aWNlIjsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOQU1FX0FHR1IgICAgICAgICAgICAgPSAiQWdnciI7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg2MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUZXN0Lk11bHRpcGxleDsKKworbmFtZXNwYWNlIFRlc3QuTXVsdGlwbGV4LlNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCisgICAgeworICAgICAgICBjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCA6IEJlbmNobWFya1NlcnZpY2UuSWZhY2UKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBmaWJvbmFjY2koc2J5dGUgbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJldiwgbmV4dCwgcmVzdWx0OworICAgICAgICAgICAgICAgIHByZXYgICA9IDA7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobiA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXh0ICAgPSByZXN1bHQgKyBwcmV2OworICAgICAgICAgICAgICAgICAgICBwcmV2ICAgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIC0tbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEFnZ3JTZXJ2aWNlSW1wbCA6IEFnZ3IuSWZhY2UKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxpbnQ+IHZhbHVlcyA9IG5ldyBMaXN0PGludD4oKTsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkVmFsdWUoaW50IHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlcy5BZGQodmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IGdldFZhbHVlcygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoaW50IHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlcnRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlIGJlbmNoSGFuZGxlciA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCgpOworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYmVuY2hQcm9jZXNzb3IgPSBuZXcgQmVuY2htYXJrU2VydmljZS5Qcm9jZXNzb3IoYmVuY2hIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnckhhbmRsZXIgPSBuZXcgQWdnclNlcnZpY2VJbXBsKCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBhZ2dyUHJvY2Vzc29yID0gbmV3IEFnZ3IuUHJvY2Vzc29yKGFnZ3JIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoQ29uc3RhbnRzLk5BTUVfQUdHUiwgYWdnclByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUU2VydmVyIFNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKG11bHRpcGxleCwgc2VydmVydHJhbnMsIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvY29sRmFjdG9yeSk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1c2hvcnQuUGFyc2UoYXJnc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeGVjdXRlKHBvcnQpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE0Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDE0OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPntENTkyQkRGMy0wRENFLTQ4RkItODkwRi1FNEFFMUQ5Q0U3Q0R9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPk11bHRpcGxleFNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPk11bHRpcGxleFNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPi4uXGJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXE11bHRpcGxleC5UZXN0LkNvbW1vbi5jcyI+CisgICAgICA8TGluaz5NdWx0aXBsZXguVGVzdC5Db21tb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQWdnci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEJlbmNobWFya1NlcnZpY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxFcnJvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKKworU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQwNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleFNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIkYyRjQzNkMxLTNENEYtNDExYS1BREMzLUI5ODg0ODQ3NkE4RSIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUxODRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpAQCAtMCwwICsxLDMxIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlckNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyR2xvYmFsRmlsdGVycyhHbG9iYWxGaWx0ZXJDb2xsZWN0aW9uIGZpbHRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlcnMuQWRkKG5ldyBIYW5kbGVFcnJvckF0dHJpYnV0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgU3lzdGVtLldlYi5Sb3V0aW5nOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVDb25maWcKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlclJvdXRlcyhSb3V0ZUNvbGxlY3Rpb24gcm91dGVzKQorICAgICAgICB7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0udGhyaWZ0Iik7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0uYXhkL3sqcGF0aEluZm99Iik7CisKKyAgICAgICAgICAgIHJvdXRlcy5NYXBSb3V0ZSgKKyAgICAgICAgICAgICAgICBuYW1lOiAiRGVmYXVsdCIsCisgICAgICAgICAgICAgICAgdXJsOiAie2NvbnRyb2xsZXJ9L3thY3Rpb259L3tpZH0iLAorICAgICAgICAgICAgICAgIGRlZmF1bHRzOiBuZXcgeyBjb250cm9sbGVyID0gIkhvbWUiLCBhY3Rpb24gPSAiSW5kZXgiLCBpZCA9IFVybFBhcmFtZXRlci5PcHRpb25hbCB9CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKQEAgLTAsMCArMSwzMiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXN5bmNIdHRwSGFuZGxlciA6IFRIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIEFzeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLkFzeW5jUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCkBAIC0wLDAgKzEsNzAgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QuQ29udHJvbGxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSG9tZUNvbnRyb2xsZXIgOiBDb250cm9sbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IEluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZpZXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPEFjdGlvblJlc3VsdD4gVGVzdFRocmlmdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JQXN5bmMgYXN5bmNTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiQXN5bmMudGhyaWZ0IikpKSk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBhc3luY1NlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZ0FzeW5jKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IFRlc3RUaHJpZnRTeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JU3luYyBzZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiU3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZygiVGVzdFN0cmluZyIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAidGVzdFN0cmluZyhcIlRlc3RTdHJpbmdcIikiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSB3cm9uZyByZXN1bHQgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBSZWRpcmVjdFRvQWN0aW9uKCJJbmRleCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXggYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI2ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXgKQEAgLTAsMCArMSwxOSBAQAor77u/PCVAIEFwcGxpY2F0aW9uIENvZGViZWhpbmQ9Ikdsb2JhbC5hc2F4LmNzIiBJbmhlcml0cz0iVGhyaWZ0TVZDVGVzdC5NdmNBcHBsaWNhdGlvbiIgTGFuZ3VhZ2U9IkMjIiAlPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTczMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MKQEAgLTAsMCArMSwzNCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIE12Y0FwcGxpY2F0aW9uIDogU3lzdGVtLldlYi5IdHRwQXBwbGljYXRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFwcGxpY2F0aW9uX1N0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXJlYVJlZ2lzdHJhdGlvbi5SZWdpc3RlckFsbEFyZWFzKCk7CisgICAgICAgICAgICBGaWx0ZXJDb25maWcuUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlcnMuRmlsdGVycyk7CisgICAgICAgICAgICBSb3V0ZUNvbmZpZy5SZWdpc3RlclJvdXRlcyhSb3V0ZVRhYmxlLlJvdXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTg4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0TVZDVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJBIHdlYiBwcm9qZWN0IGZvciB0ZXN0aW5nIHRoZSB0aHJpZnQgQVNQLk5FVCBmZWF0dXJlcy4iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjM2NmY5YmQwLTNjMGUtNDhhYS1iMmNhLTYxZmQ0YTkzZTQyNyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQzMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKQEAgLTAsMCArMSwzNyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UZXN0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBTZWNvbmRTZXJ2aWNlSW1wbCA6IFNlY29uZFNlcnZpY2UuSUFzeW5jLCBTZWNvbmRTZXJ2aWNlLklTeW5jCisgICAgeworICAgICAgICBwdWJsaWMgVGFzazxzdHJpbmc+IHNlY29uZHRlc3RTdHJpbmdBc3luYyhzdHJpbmcgdGhpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDMyIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBTeW5jSHR0cEhhbmRsZXIgOiBUSHR0cEhhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBTeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZUltcGwoKSkpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjk2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvagpAQCAtMCwwICsxLDIwMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPgorICAgIDwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfTwvUHJvamVjdEd1aWQ+CisgICAgPFByb2plY3RUeXBlR3VpZHM+ezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0TVZDVGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdE1WQ1Rlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxNdmNCdWlsZFZpZXdzPmZhbHNlPC9NdmNCdWlsZFZpZXdzPgorICAgIDxVc2VJSVNFeHByZXNzPnRydWU8L1VzZUlJU0V4cHJlc3M+CisgICAgPElJU0V4cHJlc3NTU0xQb3J0IC8+CisgICAgPElJU0V4cHJlc3NBbm9ueW1vdXNBdXRoZW50aWNhdGlvbiAvPgorICAgIDxJSVNFeHByZXNzV2luZG93c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NVc2VDbGFzc2ljUGlwZWxpbmVNb2RlIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmciIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkR5bmFtaWNEYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5FbnRpdHkiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkFwcGxpY2F0aW9uU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRGF0YUFubm90YXRpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkFic3RyYWN0aW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29uZmlndXJhdGlvbiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRW50ZXJwcmlzZVNlcnZpY2VzIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSwgVmVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZS4xLjAuMC4wXGxpYlxuZXQ0MFxNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAiPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldlYlJlcXVlc3QiPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5IZWxwZXJzLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLkhlbHBlcnMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuTXZjLCBWZXJzaW9uPTUuMi4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0Lk12Yy41LjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5NdmMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuUmF6b3IuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuRGVwbG95bWVudCwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsIj4KKyAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwX1N0YXJ0XEZpbHRlckNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcUm91dGVDb25maWcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3luY0h0dHBIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29udHJvbGxlcnNcSG9tZUNvbnRyb2xsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2xvYmFsLmFzYXguY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+R2xvYmFsLmFzYXg8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlY29uZFNlcnZpY2VJbXBsLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJmYXZpY29uLmljbyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJHbG9iYWwuYXNheCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuY29uZmlnIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5EZWJ1Zy5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLlJlbGVhc2UuY29uZmlnIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPldlYi5jb25maWc8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db250ZW50PgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXFdlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcX1ZpZXdTdGFydC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcU2hhcmVkXF9MYXlvdXQuY3NodG1sIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXEhvbWVcSW5kZXguY3NodG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IkFwcF9EYXRhXCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0icGFja2FnZXMuY29uZmlnIj4KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPgorICAgIDwvQ29udGVudD4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cc3JjXFRocmlmdC40NS5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+e2ViY2UzNWRhLWNmNmEtNDJiYy1hMzU3LWE5YzA5YjUzNDI5OX08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQuNDU8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFZpc3VhbFN0dWRpb1ZlcnNpb24gQ29uZGl0aW9uPSInJChWaXN1YWxTdHVkaW9WZXJzaW9uKScgPT0gJyciPjEwLjA8L1Zpc3VhbFN0dWRpb1ZlcnNpb24+CisgICAgPFZTVG9vbHNQYXRoIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyA9PSAnJyI+JChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2JChWaXN1YWxTdHVkaW9WZXJzaW9uKTwvVlNUb29sc1BhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWU1Rvb2xzUGF0aClcV2ViQXBwbGljYXRpb25zXE1pY3Jvc29mdC5XZWJBcHBsaWNhdGlvbi50YXJnZXRzIiBDb25kaXRpb249IickKFZTVG9vbHNQYXRoKScgIT0gJyciIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2MTAuMFxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iZmFsc2UiIC8+CisgIDxUYXJnZXQgTmFtZT0iTXZjQnVpbGRWaWV3cyIgQWZ0ZXJUYXJnZXRzPSJBZnRlckJ1aWxkIiBDb25kaXRpb249IickKE12Y0J1aWxkVmlld3MpJz09J3RydWUnIj4KKyAgICA8QXNwTmV0Q29tcGlsZXIgVmlydHVhbFBhdGg9InRlbXAiIFBoeXNpY2FsUGF0aD0iJChXZWJQcm9qZWN0T3V0cHV0RGlyKSIgLz4KKyAgPC9UYXJnZXQ+CisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICA8VmlzdWFsU3R1ZGlvPgorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0iezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX0iPgorICAgICAgICA8V2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICAgICAgPFVzZUlJUz5UcnVlPC9Vc2VJSVM+CisgICAgICAgICAgPEF1dG9Bc3NpZ25Qb3J0PlRydWU8L0F1dG9Bc3NpZ25Qb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclBvcnQ+NTc0ODI8L0RldmVsb3BtZW50U2VydmVyUG9ydD4KKyAgICAgICAgICA8RGV2ZWxvcG1lbnRTZXJ2ZXJWUGF0aD4vPC9EZXZlbG9wbWVudFNlcnZlclZQYXRoPgorICAgICAgICAgIDxJSVNVcmw+aHR0cDovL2xvY2FsaG9zdDo1NzQ4Mi88L0lJU1VybD4KKyAgICAgICAgICA8TlRMTUF1dGhlbnRpY2F0aW9uPkZhbHNlPC9OVExNQXV0aGVudGljYXRpb24+CisgICAgICAgICAgPFVzZUN1c3RvbVNlcnZlcj5GYWxzZTwvVXNlQ3VzdG9tU2VydmVyPgorICAgICAgICAgIDxDdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPC9DdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPFNhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+RmFsc2U8L1NhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+CisgICAgICAgIDwvV2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+CisgICAgPC9WaXN1YWxTdHVkaW8+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cdGVzdFxUaHJpZnRUZXN0LnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcRGVidWdcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwOmFzeW5jPXRydWUgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorIiQoTVNCdWlsZFRvb2xzUGF0aClcQ3NjLmV4ZSIgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cc3JjXGJpblxEZWJ1Z1xUaHJpZnQ0NS5kbGwiPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PiAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2E3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbApAQCAtMCwwICsxLDI1IEBACivvu79AKgorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorKkAKKworQHsKKyAgICBWaWV3QmFnLlRpdGxlID0gIkhvbWUgUGFnZSI7Cit9CisKKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IEFzeW5jIFNlcnZpY2UiLCAiVGVzdFRocmlmdEFzeW5jIik8L3A+Cis8cD5ASHRtbC5BY3Rpb25MaW5rKCJUZXN0IFRocmlmdCBTeW5jIFNlcnZpY2UiLCAiVGVzdFRocmlmdFN5bmMiKTwvcD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFjOTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCkBAIC0wLDAgKzEsMzAgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgQVNQLk5FVCBUZXN0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIEBSZW5kZXJCb2R5KCkKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjExMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnCkBAIC0wLDAgKzEsNjAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24+CisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbkdyb3VwIG5hbWU9InN5c3RlbS53ZWIud2ViUGFnZXMucmF6b3IiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5SYXpvcldlYlNlY3Rpb25Hcm91cCwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiPgorICAgICAgPHNlY3Rpb24gbmFtZT0iaG9zdCIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLkhvc3RTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgICAgPHNlY3Rpb24gbmFtZT0icGFnZXMiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5SYXpvclBhZ2VzU2VjdGlvbiwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgLz4KKyAgICA8L3NlY3Rpb25Hcm91cD4KKyAgPC9jb25maWdTZWN0aW9ucz4KKworICA8c3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvcj4KKyAgICA8aG9zdCBmYWN0b3J5VHlwZT0iU3lzdGVtLldlYi5NdmMuTXZjV2ViUmF6b3JIb3N0RmFjdG9yeSwgU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiAvPgorICAgIDxwYWdlcyBwYWdlQmFzZVR5cGU9IlN5c3RlbS5XZWIuTXZjLldlYlZpZXdQYWdlIj4KKyAgICAgIDxuYW1lc3BhY2VzPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5BamF4IiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMuSHRtbCIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIi8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLlJvdXRpbmciIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJUaHJpZnRNVkNUZXN0IiAvPgorICAgICAgPC9uYW1lc3BhY2VzPgorICAgIDwvcGFnZXM+CisgIDwvc3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvcj4KKworICA8YXBwU2V0dGluZ3M+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOkVuYWJsZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKworICA8c3lzdGVtLndlYlNlcnZlcj4KKyAgICA8aGFuZGxlcnM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkJsb2NrVmlld0hhbmRsZXIiLz4KKyAgICAgIDxhZGQgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIgcGF0aD0iKiIgdmVyYj0iKiIgcHJlQ29uZGl0aW9uPSJpbnRlZ3JhdGVkTW9kZSIgdHlwZT0iU3lzdGVtLldlYi5IdHRwTm90Rm91bmRIYW5kbGVyIiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKworICA8c3lzdGVtLndlYj4KKyAgICA8Y29tcGlsYXRpb24+CisgICAgICA8YXNzZW1ibGllcz4KKyAgICAgICAgPGFkZCBhc3NlbWJseT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiAvPgorICAgICAgPC9hc3NlbWJsaWVzPgorICAgIDwvY29tcGlsYXRpb24+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkZTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sCkBAIC0wLDAgKzEsMjIgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIExheW91dCA9ICJ+L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbCI7Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ1NmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZwpAQCAtMCwwICsxLDQ1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIHhtbG5zOnhkdD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9YTUwtRG9jdW1lbnQtVHJhbnNmb3JtIj4KKyAgPCEtLQorICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlNldEF0dHJpYnV0ZXMiIHRyYW5zZm9ybSB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YKKyAgICAiY29ubmVjdGlvblN0cmluZyIgdG8gdXNlICJSZWxlYXNlU1FMU2VydmVyIiBvbmx5IHdoZW4gdGhlICJNYXRjaCIgbG9jYXRvcgorICAgIGZpbmRzIGFuIGF0dHJpYnV0ZSAibmFtZSIgdGhhdCBoYXMgYSB2YWx1ZSBvZiAiTXlEQiIuCisKKyAgICA8Y29ubmVjdGlvblN0cmluZ3M+CisgICAgICA8YWRkIG5hbWU9Ik15REIiCisgICAgICAgIGNvbm5lY3Rpb25TdHJpbmc9IkRhdGEgU291cmNlPVJlbGVhc2VTUUxTZXJ2ZXI7SW5pdGlhbCBDYXRhbG9nPU15UmVsZWFzZURCO0ludGVncmF0ZWQgU2VjdXJpdHk9VHJ1ZSIKKyAgICAgICAgeGR0OlRyYW5zZm9ybT0iU2V0QXR0cmlidXRlcyIgeGR0OkxvY2F0b3I9Ik1hdGNoKG5hbWUpIi8+CisgICAgPC9jb25uZWN0aW9uU3RyaW5ncz4KKyAgLS0+CisgIDxzeXN0ZW0ud2ViPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpAQCAtMCwwICsxLDQ2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIHhtbG5zOnhkdD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9YTUwtRG9jdW1lbnQtVHJhbnNmb3JtIj4KKyAgPCEtLQorICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlNldEF0dHJpYnV0ZXMiIHRyYW5zZm9ybSB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YKKyAgICAiY29ubmVjdGlvblN0cmluZyIgdG8gdXNlICJSZWxlYXNlU1FMU2VydmVyIiBvbmx5IHdoZW4gdGhlICJNYXRjaCIgbG9jYXRvcgorICAgIGZpbmRzIGFuIGF0dHJpYnV0ZSAibmFtZSIgdGhhdCBoYXMgYSB2YWx1ZSBvZiAiTXlEQiIuCisKKyAgICA8Y29ubmVjdGlvblN0cmluZ3M+CisgICAgICA8YWRkIG5hbWU9Ik15REIiCisgICAgICAgIGNvbm5lY3Rpb25TdHJpbmc9IkRhdGEgU291cmNlPVJlbGVhc2VTUUxTZXJ2ZXI7SW5pdGlhbCBDYXRhbG9nPU15UmVsZWFzZURCO0ludGVncmF0ZWQgU2VjdXJpdHk9VHJ1ZSIKKyAgICAgICAgeGR0OlRyYW5zZm9ybT0iU2V0QXR0cmlidXRlcyIgeGR0OkxvY2F0b3I9Ik1hdGNoKG5hbWUpIi8+CisgICAgPC9jb25uZWN0aW9uU3RyaW5ncz4KKyAgLS0+CisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbiB4ZHQ6VHJhbnNmb3JtPSJSZW1vdmVBdHRyaWJ1dGVzKGRlYnVnKSIgLz4KKyAgICA8IS0tCisgICAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlICJSZXBsYWNlIiB0cmFuc2Zvcm0gd2lsbCByZXBsYWNlIHRoZSBlbnRpcmUKKyAgICAgIDxjdXN0b21FcnJvcnM+IHNlY3Rpb24gb2YgeW91ciBXZWIuY29uZmlnIGZpbGUuCisgICAgICBOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBjdXN0b21FcnJvcnMgc2VjdGlvbiB1bmRlciB0aGUKKyAgICAgIDxzeXN0ZW0ud2ViPiBub2RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGUgInhkdDpMb2NhdG9yIiBhdHRyaWJ1dGUuCisKKyAgICAgIDxjdXN0b21FcnJvcnMgZGVmYXVsdFJlZGlyZWN0PSJHZW5lcmljRXJyb3IuaHRtIgorICAgICAgICBtb2RlPSJSZW1vdGVPbmx5IiB4ZHQ6VHJhbnNmb3JtPSJSZXBsYWNlIj4KKyAgICAgICAgPGVycm9yIHN0YXR1c0NvZGU9IjUwMCIgcmVkaXJlY3Q9IkludGVybmFsRXJyb3IuaHRtIi8+CisgICAgICA8L2N1c3RvbUVycm9ycz4KKyAgICAtLT4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1N2QxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcKQEAgLTAsMCArMSw5MiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBBU1AuTkVUIGFwcGxpY2F0aW9uLCBwbGVhc2UgdmlzaXQKKyAgaHR0cDovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9MaW5rSWQ9MzAxODgwCisgIC0tPgorPGNvbmZpZ3VyYXRpb24+CisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6VmVyc2lvbiIgdmFsdWU9IjMuMC4wLjAiIC8+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOkVuYWJsZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8YWRkIGtleT0iQ2xpZW50VmFsaWRhdGlvbkVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJVbm9idHJ1c2l2ZUphdmFTY3JpcHRFbmFibGVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8YWRkIGtleT0ib3dpbjpBdXRvbWF0aWNBcHBTdGFydHVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgIDwvYXBwU2V0dGluZ3M+CisgIDxzeXN0ZW0ud2ViPgorICAgIDxhdXRoZW50aWNhdGlvbiBtb2RlPSJOb25lIiAvPgorICAgIDxjb21waWxhdGlvbiBkZWJ1Zz0idHJ1ZSIgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgICAgPGh0dHBSdW50aW1lIHRhcmdldEZyYW1ld29yaz0iNC41IiAvPgorICA8L3N5c3RlbS53ZWI+CisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxtb2R1bGVzPgorICAgICAgPHJlbW92ZSBuYW1lPSJGb3Jtc0F1dGhlbnRpY2F0aW9uIiAvPgorICAgIDwvbW9kdWxlcz4KKyAgICA8aGFuZGxlcnM+CisgICAgICA8YWRkIG5hbWU9IkFzeW5jSHR0cEhhbmRsZXIiIHZlcmI9IioiIHBhdGg9IkFzeW5jLnRocmlmdCIgdHlwZT0iVGhyaWZ0TVZDVGVzdC5Bc3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgICAgPGFkZCBuYW1lPSJTeW5jSHR0cEhhbmRsZXIiIHZlcmI9IioiIHBhdGg9IlN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LlN5bmNIdHRwSGFuZGxlciwgVGhyaWZ0TVZDVGVzdCIgLz4KKyAgICA8L2hhbmRsZXJzPgorICA8L3N5c3RlbS53ZWJTZXJ2ZXI+CisgIDxydW50aW1lPgorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5Lk9BdXRoIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eS5Db29raWVzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbiIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTmV3dG9uc29mdC5Kc29uIiBjdWx0dXJlPSJuZXV0cmFsIiBwdWJsaWNLZXlUb2tlbj0iMzBhZDRmZTZiMmE2YWVlZCIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTYuMC4wLjAiIG5ld1ZlcnNpb249IjYuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk9wdGltaXphdGlvbiIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0xLjEuMC4wIiBuZXdWZXJzaW9uPSIxLjEuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iV2ViR3JlYXNlIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTEuNS4yLjE0MjM0IiBuZXdWZXJzaW9uPSIxLjUuMi4xNDIzNCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuSGVscGVycyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5NdmMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtNS4yLjMuMCIgbmV3VmVyc2lvbj0iNS4yLjMuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuV2ViUGFnZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtMy4wLjAuMCIgbmV3VmVyc2lvbj0iMy4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgPC9hc3NlbWJseUJpbmRpbmc+CisgIDwvcnVudGltZT4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTc5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjODQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHBhY2thZ2VzPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5NdmMiIHZlcnNpb249IjUuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5SYXpvciIgdmVyc2lvbj0iMy4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUiIHZlcnNpb249IjEuMC4wLjAiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+Cis8L3BhY2thZ2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kL01ha2VmaWxlLmFtIGIvbGliL2QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4MTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTk0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cworCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKKyMKKyMgRW51bWVyYXRpb24gb2YgYWxsIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUgbW9kdWxlcy4KKyMKKyMgV2UgdW5jb25kaXRpb25hbGx5IGluc3RhbGwgYWxsIG9mIHRoZW0sIGV2ZW4gaWYgbGliZXZlbnQgb3IgT3BlblNTTCBhcmUKKyMgbm90IGF2YWlsYWJsZSwgYnV0IGJ1aWxkIHRoZSByZXNwZWN0aXZlIGxpYnJhcmllcyBvbmx5IGlmIHRoZSBEZWltb3MgaGVhZGVycworIyBjb3VsZCBiZSBmb3VuZC4KKyMKK2RfdGhyaWZ0bW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC8sIGJhc2UpCitkX3RocmlmdGRpciA9ICQoRF9JTVBPUlRfUFJFRklYKS90aHJpZnQKK2RfdGhyaWZ0X0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3RocmlmdG1vZHVsZXMpKSkKKworZF9hc3luY21vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvYXN5bmMvLCBiYXNlIGxpYmV2ZW50IHNvY2tldCBzc2wpCitkX2FzeW5jZGlyID0gJChkX3RocmlmdGRpcikvYXN5bmMKK2RfYXN5bmNfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfYXN5bmNtb2R1bGVzKSkpCisKK2RfY29kZWdlbm1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvY29kZWdlbi8sIGFzeW5jX2NsaWVudCBcCisJYXN5bmNfY2xpZW50X3Bvb2wgYmFzZSBjbGllbnQgY2xpZW50X3Bvb2wgcHJvY2Vzc29yKQorI2RfY29kZWdlbm1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvY29kZWdlbi8sIGFzeW5jX2NsaWVudCBcCisjCWFzeW5jX2NsaWVudF9wb29sIGJhc2UgY2xpZW50IGNsaWVudF9wb29sIGlkbGdlbiBwcm9jZXNzb3IpCisKK2RfY29kZWdlbmRpciA9ICQoZF90aHJpZnRkaXIpL2NvZGVnZW4KK2RfY29kZWdlbl9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9jb2RlZ2VubW9kdWxlcykpKQorCitkX3Byb3RvY29sbW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9wcm90b2NvbC8sIGJhc2UgYmluYXJ5IGNvbXBhY3QganNvbiBcCisJcHJvY2Vzc29yKQorZF9wcm90b2NvbGRpciA9ICQoZF90aHJpZnRkaXIpL3Byb3RvY29sCitkX3Byb3RvY29sX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3Byb3RvY29sbW9kdWxlcykpKQorCitkX3NlcnZlcm1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvc2VydmVyLywgYmFzZSBzaW1wbGUgbm9uYmxvY2tpbmcgXAorCXRhc2twb29sIHRocmVhZGVkKQorZF9zZXJ2ZXJkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9zZXJ2ZXIKK2Rfc2VydmVyX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3NlcnZlcm1vZHVsZXMpKSkKKworZF9zZXJ2ZXJ0cmFuc3BvcnRtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvLCBiYXNlIHNvY2tldCBzc2wpCitkX3NlcnZlcnRyYW5zcG9ydGRpciA9ICQoZF90aHJpZnRkaXIpL3NlcnZlci90cmFuc3BvcnQKK2Rfc2VydmVydHJhbnNwb3J0X0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgXAorCSQoZF9zZXJ2ZXJ0cmFuc3BvcnRtb2R1bGVzKSkpCisKK2RfdHJhbnNwb3J0bW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC90cmFuc3BvcnQvLCBiYXNlIGJ1ZmZlcmVkIGZpbGUgXAorCWZyYW1lZCBodHRwIG1lbW9yeSBwaXBlZCByYW5nZSBzb2NrZXQgc3NsIHpsaWIpCitkX3RyYW5zcG9ydGRpciA9ICQoZF90aHJpZnRkaXIpL3RyYW5zcG9ydAorZF90cmFuc3BvcnRfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfdHJhbnNwb3J0bW9kdWxlcykpKQorCitkX3V0aWxtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3V0aWwvLCBhd2FpdGFibGUgY2FuY2VsbGF0aW9uIGZ1dHVyZSBcCisJaGFzaHNldCkKK2RfdXRpbGRpciA9ICQoZF90aHJpZnRkaXIpL3V0aWwKK2RfdXRpbF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF91dGlsbW9kdWxlcykpKQorCitkX2ludGVybmFsbW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9pbnRlcm5hbC8sIGFsZ29yaXRobSBjb2RlZ2VuIGN0ZmUgXAorCWVuZGlhbiByZXNvdXJjZV9wb29sIHNvY2tldCBzc2wgc3NsX2JpbyB0cmFpdHMpCitkX2ludGVybmFsZGlyID0gJChkX3RocmlmdGRpcikvaW50ZXJuYWwKK2RfaW50ZXJuYWxfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfaW50ZXJuYWxtb2R1bGVzKSkpCisKK2RfdGVzdG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvaW50ZXJuYWwvdGVzdC8sIHByb3RvY29sIHNlcnZlcikKK2RfdGVzdGRpciA9ICQoZF9pbnRlcm5hbGRpcikvdGVzdAorZF90ZXN0X0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3Rlc3Rtb2R1bGVzKSkpCisKK2RfcHVibGljbW9kdWxlcyA9ICQoZF90aHJpZnRtb2R1bGVzKSAkKGRfYXN5bmNtb2R1bGVzKSBcCisJJChkX2NvZGVnZW5tb2R1bGVzKSAkKGRfcHJvdG9jb2xtb2R1bGVzKSAkKGRfc2VydmVybW9kdWxlcykgXAorCSQoZF9zZXJ2ZXJ0cmFuc3BvcnRtb2R1bGVzKSAkKGRfdHJhbnNwb3J0bW9kdWxlcykgJChkX3V0aWxtb2R1bGVzKQorZF9wdWJsaWNzb3VyY2VzID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9wdWJsaWNtb2R1bGVzKSkpCisKK2RfbW9kdWxlcyA9ICQoZF9wdWJsaWNtb2R1bGVzKSAkKGRfaW50ZXJuYWxtb2R1bGVzKSAkKGRfdGVzdG1vZHVsZXMpCisKKyMgTGlzdCBtb2R1bGVzIHdpdGggZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYWluIGxpc3QKK2RfbGliZXZlbnRfZGVwZW5kZW50X21vZHVsZXMgPSB0aHJpZnQvYXN5bmMvbGliZXZlbnQgdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZworZF9vcGVuc3NsX2RlcGVuZGVudF9tb2R1bGVzID0gdGhyaWZ0L2FzeW5jL3NzbCB0aHJpZnQvaW50ZXJuYWwvc3NsIFwKKwl0aHJpZnQvaW50ZXJuYWwvc3NsX2JpbyB0aHJpZnQvdHJhbnNwb3J0L3NzbCB0aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zc2wKK2RfbWFpbl9tb2R1bGVzID0gJChmaWx0ZXItb3V0ICQoZF9saWJldmVudF9kZXBlbmRlbnRfbW9kdWxlcykgXAorCSQoZF9vcGVuc3NsX2RlcGVuZGVudF9tb2R1bGVzKSwkKGRfbW9kdWxlcykpCisKKworZF9saWJfZmxhZ3MgPSAtdyAtd2kgLUlzcmMgLWxpYgorYWxsX3RhcmdldHMgPQorCisjCisjIGxpYmV2ZW50LWRlcGVuZGVudCBtb2R1bGVzLgorIworaWYgSEFWRV9ERUlNT1NfRVZFTlQyCiskKERfRVZFTlRfTElCX05BTUUpOiAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX2xpYmV2ZW50X2RlcGVuZGVudF9tb2R1bGVzKSkpCisJJChETUQpIC1vZiQoRF9FVkVOVF9MSUJfTkFNRSkgJChkX2xpYl9mbGFncykgJF4KK2FsbF90YXJnZXRzICs9ICQoRF9FVkVOVF9MSUJfTkFNRSkKK2VuZGlmCisKKyMKKyMgT3BlblNTTC1kZXBlbmRlbnQgbW9kdWxlcy4KKyMKK2lmIEhBVkVfREVJTU9TX09QRU5TU0wKKyQoRF9TU0xfTElCX05BTUUpOiAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMpKSkKKwkkKERNRCkgLW9mJChEX1NTTF9MSUJfTkFNRSkgJChkX2xpYl9mbGFncykgJF4KK2FsbF90YXJnZXRzICs9ICQoRF9TU0xfTElCX05BTUUpCitlbmRpZgorCisjCisjIE1haW4gbGlicmFyeSB0YXJnZXQuCisjCiskKERfTElCX05BTUUpOiAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX21haW5fbW9kdWxlcykpKQorCSQoRE1EKSAtb2YkKERfTElCX05BTUUpICQoZF9saWJfZmxhZ3MpICReCithbGxfdGFyZ2V0cyArPSAkKERfTElCX05BTUUpCisKKworIworIyBEb2N1bWVudGF0aW9uIHRhcmdldCAocmVxdWlyZXMgRGlsKS4KKyMKK2RvY3M6ICQoZF9wdWJsaWNzb3VyY2VzKSBzcmMvdGhyaWZ0L2luZGV4LmQKKwlkaWwgZGRvYyBkb2NzIC1obCAtLWthbmRpbCAkXgorCisKKyMKKyMgSG9vayBjdXN0b20gbGlicmFyeSB0YXJnZXRzIGludG8gdGhlIGF1dG9tYWtlIGFsbC9pbnN0YWxsIHRhcmdldHMuCisjCithbGwtbG9jYWw6ICQoYWxsX3RhcmdldHMpCisKK2luc3RhbGwtZXhlYy1sb2NhbDoKKwkkKElOU1RBTExfUFJPR1JBTSkgJChhbGxfdGFyZ2V0cykgJChERVNURElSKSQobGliZGlyKQorCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBkb2NzICQoRF9MSUJfTkFNRSkgJChEX0VWRU5UX0xJQl9OQU1FKSAkKERfU1NMX0xJQl9OQU1FKSB1bml0dGVzdAorCisKKyMKKyMgVW5pdCB0ZXN0cyAoYnVpbHQgYm90aCBpbiBkZWJ1ZyBhbmQgcmVsZWFzZSBtb2RlKS4KKyMKK2RfdGVzdF9mbGFncyA9IC11bml0dGVzdCAtdyAtd2kgLUkkKHRvcF9zcmNkaXIpL2xpYi9kL3NyYworCisjIFRoZXJlIGp1c3QgbXVzdCBiZSBzb21lIHdheSB0byByZWFzc2lnbiBhIHZhcmlhYmxlIHdpdGhvdXQgd2FybmluZ3MgaW4KKyMgQXV0b21ha2UuLi4KK2RfdGVzdF9tb2R1bGVzX18gPSAkKGRfbW9kdWxlcykKKworaWYgV0lUSF9EX0VWRU5UX1RFU1RTCitkX3Rlc3RfZmxhZ3MgKz0gJChETURfTElCRVZFTlRfRkxBR1MpCitkX3Rlc3RfbW9kdWxlc18gPSAkKGRfdGVzdF9tb2R1bGVzX18pCitlbHNlCitkX3Rlc3RfbW9kdWxlc18gPSAkKGZpbHRlci1vdXQgJChkX2xpYmV2ZW50X2RlcGVuZGVudF9tb2R1bGVzKSwgJChkX3Rlc3RfbW9kdWxlc19fKSkKK2VuZGlmCisKK2lmIFdJVEhfRF9TU0xfVEVTVFMKK2RfdGVzdF9mbGFncyArPSAkKERNRF9PUEVOU1NMX0ZMQUdTKQorZF90ZXN0X21vZHVsZXMgPSAkKGRfdGVzdF9tb2R1bGVzXykKK2Vsc2UKK2RfdGVzdF9tb2R1bGVzID0gJChmaWx0ZXItb3V0ICQoZF9vcGVuc3NsX2RlcGVuZGVudF9tb2R1bGVzKSwgJChkX3Rlc3RfbW9kdWxlc18pKQorZW5kaWYKKwordW5pdHRlc3QvZW1wdHltYWluLmQ6IHVuaXR0ZXN0Ly5kaXJlY3RvcnkKKwlAZWNobyAndm9pZCBtYWluKCl7fScgPiRACisKK3VuaXR0ZXN0Ly5kaXJlY3Rvcnk6CisJbWtkaXIgLXAgdW5pdHRlc3QgfHwgZXhpc3RzIHVuaXR0ZXN0CisJdG91Y2ggJEAKKwordW5pdHRlc3QvZGVidWcvJTogc3JjLyUuZCAkKGFsbF90YXJnZXRzKSB1bml0dGVzdC9lbXB0eW1haW4uZAorCSQoRE1EKSAtZyAtb2YkKHN1YnN0IC8sJChETURfT0ZfRElSU0VQKSwkQCkgJChkX3Rlc3RfZmxhZ3MpICReCisKK3VuaXR0ZXN0L3JlbGVhc2UvJTogc3JjLyUuZCAkKGFsbF90YXJnZXRzKSB1bml0dGVzdC9lbXB0eW1haW4uZAorCSQoRE1EKSAtTyAtcmVsZWFzZSAtb2YkKHN1YnN0IC8sJChETURfT0ZfRElSU0VQKSwkQCkgJChkX3Rlc3RfZmxhZ3MpICReCisKK1RFU1RTID0gJChhZGRwcmVmaXggdW5pdHRlc3QvZGVidWcvLCAkKGRfdGVzdF9tb2R1bGVzKSkgXAorCSQoYWRkcHJlZml4IHVuaXR0ZXN0L3JlbGVhc2UvLCAkKGRfdGVzdF9tb2R1bGVzKSkKKworcHJlY3Jvc3M6IGFsbC1sb2NhbAorCSQoTUFLRSkgLUMgdGVzdCBwcmVjcm9zcworCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJdGVzdCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvZC9SRUFETUUubWQgYi9saWIvZC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzN2U0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL1JFQURNRS5tZApAQCAtMCwwICsxLDU4IEBACitUaHJpZnQgRCBTb2Z0d2FyZSBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpY2Vuc2UKKy0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1Rlc3RpbmcKKy0tLS0tLS0KKworRCBzdXBwb3J0IGluIFRocmlmdCBpcyBjb3ZlcmVkIGJ5IHR3byBzZXRzIG9mIHRlc3RzOiBmaXJzdCwKK3RoZSB1bml0IHRlc3QgYmxvY2tzIGNvbnRhaW5lZCBpbiB0aGUgRCBzb3VyY2UgZmlsZXMsIGFuZAorc2Vjb25kLCB0aGUgbW9yZSBleHRlbnNpdmUgdGVzdGluZyBhcHBsaWNhdGlvbnMgaW4gdGhlIHRlc3QvCitzdWJkaXJlY3RvcnksIHdoaWNoIGFsc28gbWFrZSB1c2Ugb2YgdGhlIFRocmlmdCBjb21waWxlci4KK0JvdGggYXJlIGJ1aWx0IHdoZW4gcnVubmluZyAibWFrZSBjaGVjayIsIGJ1dCBvbmx5IHRoZQordW5pdCB0ZXN0cyBhcmUgaW1tZWRpYXRlbHkgcnVuLCBob3dldmVyIOKAkyB0aGUgc2VwYXJhdGUgdGVzdAorY2FzZXMgdHlwaWNhbGx5IHJ1biBsb25nZXIgb3IgcmVxdWlyZSBtYW51YWwgaW50ZXJ2ZW50aW9uLgorSXQgbWlnaHQgYWxzbyBiZSBwcnVkZW50IHRvIHJ1biB0aGUgaW5kZXBlbmRlbnQgdGVzdHMsCit3aGljaCB0eXBpY2FsbHkgY29uc2lzdCBvZiBhIHNlcnZlciBhbmQgYSBjbGllbnQgcGFydCwKK2FnYWluc3QgdGhlIG90aGVyIGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucy4KKworVG8gYnVpbGQgdGhlIHVuaXQgdGVzdHMgb24gV2luZG93cywgdGhlIGVhc2llc3Qgd2F5IG1pZ2h0CitiZSB0byBtYW51YWxseSBjcmVhdGUgYSBmaWxlIGNvbnRhaW5pbmcgYW4gZW1wdHkgbWFpbigpIGFuZAoraW52b2tlIHRoZSBjb21waWxlciBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHNyYy8KK2RpcmVjdG9yeSAoUG93ZXJTaGVsbCBzeW50YXgpOgorCitkbWQgLW9mdW5pdHRlc3QgLXVuaXR0ZXN0IC13ICQoZGlyIC1yIC1maWx0ZXIgJyouZCcgLW5hbWUpCisKK0lmIHlvdSB3YW50IHRvIHJ1biB0aGUgdGVzdCBjbGllbnRzL3NlcnZlcnMgaW4gT3BlblNTTAorbW9kZSwgeW91IGhhdmUgdG8gcHJvdmlkZSDCu3NlcnZlci1wcml2YXRlLWtleS5wZW3CqyBhbmQKK8K7c2VydmVyLWNlcnRpZmljYXRlLnBlbcKrIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhlIHNlcnZlcgorZXhlY3V0YWJsZSByZXNpZGVzIGluLCBhbmQgYSDCu3RydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtwqsKK2ZpbGUgZm9yIHRoZSBjbGllbnQuIFRoZSBlYXNpZXN0IHdheSBpcyB0byBnZW5lcmF0ZSBhIG5ldworc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbmZpZyBmaWxlCisob3BlbnNzbC50ZXN0LmNuZik6CisKK29wZW5zc2wgcmVxIC1uZXcgLXg1MDkgLW5vZGVzIC1jb25maWcgb3BlbnNzbC50ZXN0LmNuZiBcCisgIC1vdXQgc2VydmVyLWNlcnRpZmljYXRlLnBlbQorY2F0IHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0gPiB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbQorCitUaGlzIHN0ZXBzIGFyZSBhbHNvIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQorQXV0b3Rvb2xzIGJ1aWxkIHN5c3RlbSBpZiB0aGUgZmlsZXMgYXJlIG5vdCBwcmVzZW50LgpkaWZmIC0tZ2l0IGEvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9kL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2Jhc2UuZApAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIGZvciBjbGllbnQtc2lkZSBoYW5kbGluZyBvZiBhc3luY2hyb25vdXMKKyAqIEkvTyBvcGVyYXRpb25zLCBiYXNlZCBvbiBjb3JvdXRpbmVzLgorICoKKyAqIFRoZSBtYWluIHBpZWNlIG9mIHRoZSDCu2NsaWVudCBzaWRlwqsgKGUuZy4gZm9yIFRBc3luY0NsaWVudCB1c2Vycykgb2YgdGhlCisgKiBBUEkgaXMgVEZ1dHVyZSwgd2hpY2ggcmVwcmVzZW50cyBhbiBhc3luY2hyb25vdXNseSBleGVjdXRlZCBvcGVyYXRpb24sCisgKiB3aGljaCBjYW4gaGF2ZSBhIHJldHVybiB2YWx1ZSwgdGhyb3cgZXhjZXB0aW9ucywgYW5kIHdoaWNoIGNhbiBiZSB3YWl0ZWQKKyAqIHVwb24uCisgKgorICogT24gdGhlIMK7aW1wbGVtZW50YXRpb24gc2lkZcKrLCB0aGUgaWRlYSBpcyB0aGF0IGJ5IHVzaW5nIGEgVEFzeW5jVHJhbnNwb3J0CisgKiBpbnN0ZWFkIG9mIGEgbm9ybWFsIFRUcmFuc3BvcnQgYW5kIGV4ZWN1dGluZyB0aGUgd29yayB0aHJvdWdoIGEKKyAqIFRBc3luY01hbmFnZXIsIHRoZSBzYW1lIGNvZGUgYXMgZm9yIHN5bmNocm9ub3VzIEkvTyBjYW4gYmUgdXNlZCBmb3IKKyAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gYXMgd2VsbCwgZm9yIGV4YW1wbGU6CisgKgorICogLS0tCisgKiBhdXRvIHNvY2tldCA9IG5ldyBUQXN5bmNTb2NrZXQoc29tZVRBc3luY1NvY2tldE1hbmFnZXIoKSwgaG9zdCwgcG9ydCk7CisgKiAvLyDigKYKKyAqIHNvY2tldC5hc3luY01hbmFnZXIuZXhlY3V0ZShzb2NrZXQsIHsKKyAqICAgU29tZVRocmlmdFN0cnVjdCBzOworICoKKyAqICAgLy8gV2FpdGluZyBmb3Igc29ja2V0IEkvTyB3aWxsIG5vdCBibG9jayBhbiBlbnRpcmUgdGhyZWFkIGJ1dCBjYXVzZQorICogICAvLyB0aGUgYXN5bmMgbWFuYWdlciB0byBleGVjdXRlIGFub3RoZXIgdGFzayBpbiB0aGUgbWVhbnRpbWUsIGJlY2F1c2UKKyAqICAgLy8gd2UgYXJlIHVzaW5nIFRBc3luY1NvY2tldCBpbnN0ZWFkIG9mIFRTb2NrZXQuCisgKiAgIHMucmVhZChzb2NrZXQpOworICoKKyAqICAgLy8gRG8gc29tZXRoaW5nIHdpdGggcywgZS5nLiBzZXQgYSBUUHJvbWlzZSByZXN1bHQgdG8gaXQuCisgKiAgIHdyaXRlbG4ocyk7CisgKiB9KTsKKyAqIC0tLQorICovCittb2R1bGUgdGhyaWZ0LmFzeW5jLmJhc2U7CisKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IHN0ZC5zb2NrZXQvKyA6IFNvY2tldCsvOyAvLyBETUQgQEBCVUczMTRAQAoraW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogTWFuYWdlcyBvbmUgb3IgbW9yZSBhc3luY2hyb25vdXMgdHJhbnNwb3J0IHJlc291cmNlcyAoZS5nLiBzb2NrZXRzIGluIHRoZQorICogY2FzZSBvZiBUQXN5bmNTb2NrZXRNYW5hZ2VyKSBhbmQgYWxsb3dzIHdvcmsgaXRlbXMgdG8gYmUgc3VibWl0dGVkIGZvciB0aGVtLgorICoKKyAqIEltcGxlbWVudGF0aW9ucyB3aWxsIHR5cGljYWxseSBydW4gb25lIG9yIG1vcmUgYmFja2dyb3VuZCB0aHJlYWRzIGZvcgorICogZXhlY3V0aW5nIHRoZSB3b3JrLCB3aGljaCBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgZm9yIGEgVEFzeW5jTWFuYWdlciB0byBiZQorICogdXNlZC4gRWFjaCB3b3JrIGl0ZW0gaXMgcnVuIGluIGl0cyBvd24gZmliZXIgYW5kIGlzIGV4cGVjdGVkIHRvIHlpZWxkKCkgYXdheQorICogd2hpbGUgd2FpdGluZyBmb3IgdGltZS1jb25zdW1pbmcgb3BlcmF0aW9ucy4KKyAqCisgKiBUaGUgc2Vjb25kIGltcG9ydGFudCBwdXJwb3NlIG9mIFRBc3luY01hbmFnZXIgaXMgdG8gc2VyaWFsaXplIGFjY2VzcyB0bworICogdGhlIHRyYW5zcG9ydCByZXNvdXJjZXMg4oCTIHdpdGhvdXQgdGFraW5nIGNhcmUgb2YgdGhhdCwgZS5nLiBpc3N1aW5nIG11bHRpcGxlCisgKiBSUEMgY2FsbHMgb3ZlciB0aGUgc2FtZSBjb25uZWN0aW9uIGluIHJhcGlkIHN1Y2Nlc3Npb24gd291bGQgbGlrZWx5IGxlYWQgdG8KKyAqIG1vcmUgdGhhbiBvbmUgcmVxdWVzdCBiZWluZyB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUsIGNhdXNpbmcgb25seSBnYXJiYWdlCisgKiB0byBhcnJpdmUgYXQgdGhlIHJlbW90ZSBlbmQuCisgKgorICogQWxsIG1ldGhvZHMgYXJlIHRocmVhZC1zYWZlLgorICovCitpbnRlcmZhY2UgVEFzeW5jTWFuYWdlciB7CisgIC8qKgorICAgKiBTdWJtaXRzIGEgd29yayBpdGVtIHRvIGJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5LgorICAgKgorICAgKiBBY2Nlc3MgdG8gYXNueWMgdHJhbnNwb3J0cyBpcyBzZXJpYWxpemVkIOKAkyBpZiB0d28gd29yayBpdGVtcyBhc3NvY2lhdGVkCisgICAqIHdpdGggdGhlIHNhbWUgdHJhbnNwb3J0IGFyZSBzdWJtaXR0ZWQsIHRoZSBzZWNvbmQgZGVsZWdhdGUgd2lsbCBub3QgYmUKKyAgICogaW52b2tlZCB1bnRpbCB0aGUgZmlyc3QgaGFzIHJldHVybmVkLCBldmVuIGl0IHRoZSBsYXR0ZXIgY29udGV4dC1zd2l0Y2hlcworICAgKiBhd2F5IChiZWNhdXNlIGl0IGlzIHdhaXRpbmcgZm9yIEkvTykgYW5kIHRoZSBhc3luYyBtYW5hZ2VyIGlzIGlkbGUKKyAgICogb3RoZXJ3aXNlLgorICAgKgorICAgKiBPcHRpb25hbGx5LCBhIFRDYW5jZWxsYXRpb24gaW5zdGFuY2UgY2FuIGJlIHNwZWNpZmllZC4gSWYgcHJlc2VudCwKKyAgICogdHJpZ2dlcmluZyBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYSByZXF1ZXN0IHRvIGNhbmNlbCB0aGUgd29yayBpdGVtLCBpZiBpdAorICAgKiBpcyBzdGlsbCB3YWl0aW5nIGZvciB0aGUgYXNzb2NpYXRlZCB0cmFuc3BvcnQgdG8gYmVjb21lIGF2YWlsYWJsZS4KKyAgICogRGVsZWdhdGVzIHdoaWNoIGFyZSBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCAoaS5lLiB3YWl0aW5nIGZvciBJL08pIGFyZSBub3QKKyAgICogYWZmZWN0ZWQgYmVjYXVzZSB0aGlzIHdvdWxkIGJyaW5nIHRoZSBjb25uZWN0aW9uIGludG8gYW4gdW5kZWZpbmVkIHN0YXRlCisgICAqIChhcyBwcm9iYWJseSBoYWxmLXdyaXR0ZW4gcmVxdWVzdCBvciBhIGhhbGYtcmVhZCByZXNwb25zZSB3b3VsZCBiZSBsZWZ0CisgICAqIGJlaGluZCkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgVEFzeW5jVHJhbnNwb3J0IHRoZSB3b3JrIGRlbGVnYXRlIHdpbGwgb3BlcmF0ZSBvbi4gTXVzdAorICAgKiAgICAgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVEFzeW5jTWFuYWdlciBpbnN0YW5jZS4KKyAgICogICB3b3JrID0gVGhlIG9wZXJhdGlvbnMgdG8gZXhlY3V0ZSBvbiB0aGUgZ2l2ZW4gdHJhbnNwb3J0LiBNdXN0IG5ldmVyCisgICAqICAgICB0aHJvdywgZXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkIGluIGFub3RoZXIgd2F5LiBub3Rocm93IHNlbWFudGljcyBhcmUKKyAgICogICAgIGRpZmZpY3VsdCB0byBlbmZvcmNlIGluIGNvbWJpbmF0aW9uIHdpdGggZmlicmVzIHRob3VnaCwgc28gY3VycmVudGx5CisgICAqICAgICBleGNlcHRpb25zIGFyZSBqdXN0IHN3YWxsb3dlZCBieSBUQXN5bmNNYW5hZ2VyIGltcGxlbWVudGF0aW9ucy4KKyAgICogICBjYW5jZWxsYXRpb24gPSBJZiBzZXQsIGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW5vbiBvZiB0aGlzIHdvcmsKKyAgICogICAgIGl0ZW0gaWYgaXQgaXMgc3RpbGwgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KKyAgICoKKyAgICogTm90ZTogVGhlIHdvcmsgaXRlbSB3aWxsIGxpa2VseSBiZSBleGVjdXRlZCBpbiBhIGRpZmZlcmVudCB0aHJlYWQsIHNvIG1ha2UKKyAgICogICBzdXJlIHRoZSBjb2RlIGl0IHJlbGllcyBvbiBpcyB0aHJlYWQtc2FmZS4gQW4gZXhjZXB0aW9uIGFyZSB0aGUgYXN5bmMKKyAgICogICB0cmFuc3BvcnRzIHRoZW1zZWx2ZXMsIHRvIHdoaWNoIGFjY2VzcyBpcyBzZXJpYWxpemVkIGFzIG5vdGVkIGFib3ZlLgorICAgKi8KKyAgdm9pZCBleGVjdXRlKFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQsIHZvaWQgZGVsZWdhdGUoKSB3b3JrLAorICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbAorICApIGluIHsKKyAgICBhc3NlcnQodHJhbnNwb3J0LmFzeW5jTWFuYWdlciBpcyB0aGlzLAorICAgICAgIlRoZSBnaXZlbiB0cmFuc3BvcnQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUQXN5bmNNYW5hZ2VyLiIpOworICB9CisKKyAgLyoqCisgICAqIFN1Ym1pdHMgYSBkZWxlZ2F0ZSB0byBiZSBleGVjdXRlZCBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgaGFzCisgICAqIHBhc3NlZC4KKyAgICoKKyAgICogVGhlIGFjdHVhbCBhbW91bnQgb2YgdGltZSBlbGFwc2VkIGNhbiBiZSBoaWdoZXIgaWYgdGhlIGFzeW5jIG1hbmFnZXIKKyAgICogaW5zdGFuY2UgaXMgYnVzeSBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHJlbGllZCBvbi4gVGhlCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBkdXJhdGlvbiA9IFRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJlZm9yZSBzdGFydGluZyB0byBleGVjdXRlIHRoZQorICAgKiAgICAgd29yayBkZWxlZ2F0ZS4KKyAgICogICB3b3JrID0gVGhlIGNvZGUgdG8gZXhlY3V0ZSBhZnRlciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGhhcyBwYXNzZWQuCisgICAqCisgICAqIEV4YW1wbGU6CisgICAqIC0tLQorICAgKiAvLyBBIHZlcnkgYmFzaWMgZXhhbXBsZSDigJMgdXN1YWxseSwgdGhlIGFjdHVhbGwgd29yayBpdGVtIHdvdWxkIGVucXVldWUKKyAgICogLy8gc29tZSBhc3luYyB0cmFuc3BvcnQgb3BlcmF0aW9uLgorICAgKiBhdXRvIGFzeW5jTWFuZ2FnZXIgPSBzb21lQXN5bmNNYW5hZ2VyKCk7CisgICAqCisgICAqIFRGdXR1cmUhaW50IGNhbGN1bGF0ZSgpIHsKKyAgICogICAvLyBDcmVhdGUgYSBwcm9taXNlIGFuZCBhc3luY2hyb25vdXNseSBzZXQgaXRzIHZhbHVlIGFmdGVyIHRocmVlCisgICAqICAgLy8gc2Vjb25kcyBoYXZlIHBhc3NlZC4KKyAgICogICBhdXRvIHByb21pc2UgPSBuZXcgVFByb21pc2UhaW50OworICAgKiAgIGFzeW5jTWFuYWdlci5kZWxheShkdXIhInNlY29uZHMiKDMpLCB7CisgICAqICAgICBwcm9taXNlLnN1Y2NlZWQoNDIpOworICAgKiAgIH0pOworICAgKgorICAgKiAgIC8vIEltbWVkaWF0ZWx5IHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgKiAgIHJldHVybiBwcm9taXNlOworICAgKiB9CisgICAqCisgICAqIC8vIFRoaXMgd2lsbCB3YWl0IHVudGlsIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlIGFuZCB0aGVuIHByaW50IGl0LgorICAgKiB3cml0ZWxuKGNhbGN1bGF0ZSgpLndhaXRHZXQoKSk7CisgICAqIC0tLQorICAgKi8KKyAgdm9pZCBkZWxheShEdXJhdGlvbiBkdXJhdGlvbiwgdm9pZCBkZWxlZ2F0ZSgpIHdvcmspOworCisgIC8qKgorICAgKiBTaHV0cyBkb3duIGFsbCBiYWNrZ3JvdW5kIHRocmVhZHMgb3Igb3RoZXIgZmFjaWxpdGllcyB0aGF0IG1pZ2h0IGhhdmUKKyAgICogYmVlbiBzdGFydGVkIGluIG9yZGVyIHRvIGV4ZWN1dGUgd29yayBpdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkKKyAgICogY2FsbGVkIGR1cmluZyBwcm9ncmFtIHNodXRkb3duLgorICAgKgorICAgKiBJZiB0aGVyZSBhcmUgc3RpbGwgdGFza3MgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgdGltZW91dCBleHBpcmVzLCBhbnkKKyAgICogY3VycmVudGx5IGV4ZWN1dGVkIHdvcmsgaXRlbXMgd2lsbCBuZXZlciByZWNlaXZlIGFueSBub3RpZmljYXRpb25zCisgICAqIGZvciBhc3luYyB0cmFuc3BvcnRzIG1hbmFnZWQgYnkgdGhpcyBpbnN0YW5jZSwgcXVldWVkIHdvcmsgaXRlbXMgd2lsbAorICAgKiBiZSBzaWxlbnRseSBkcm9wcGVkLCBhbmQgaW1wbGVtZW50YXRpb25zIGFyZSBhbGxvd2VkIHRvIGxlYWsgcmVzb3VyY2VzLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgd2FpdEZpbmlzaFRpbWVvdXQgPSBJZiBwb3NpdGl2ZSwgd2FpdHMgZm9yIGFsbCB3b3JrIGl0ZW1zIHRvIGJlCisgICAqICAgICBmaW5pc2hlZCBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSwgaWYgbmVnYXRpdmUsIHdhaXRzIGZvcgorICAgKiAgICAgY29tcGxldGlvbiB3aXRob3V0IGV2ZXIgdGltaW5nIG91dCwgaWYgemVybywgaW1tZWRpYXRlbHkgc2h1dHMgZG93bgorICAgKiAgICAgdGhlIGJhY2tncm91bmQgZmFjaWxpdGllcy4KKyAgICovCisgIGJvb2wgc3RvcChEdXJhdGlvbiB3YWl0RmluaXNoVGltZW91dCA9IGR1ciEiaG5zZWNzIigtMSkpOworfQorCisvKioKKyAqIEEgVFRyYW5zcG9ydCB3aGljaCB1c2VzIGEgVEFzeW5jTWFuYWdlciB0byBzY2hlZHVsZSBub24tYmxvY2tpbmcgb3BlcmF0aW9ucy4KKyAqCisgKiBUaGUgYWN0dWFsIHR5cGUgb2YgZGV2aWNlIGlzIG5vdCBzcGVjaWZpZWQ7IHR5cGljYWxseSwgaW1wbGVtZW50YXRpb25zIHdpbGwKKyAqIGRlcGVuZCBvbiBhbiBpbnRlcmZhY2UgZGVyaXZlZCBmcm9tIFRBc3luY01hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2YgY2hhbmdlcworICogaW4gdGhlIHRyYW5zcG9ydCBzdGF0ZS4KKyAqCisgKiBUaGUgcGVla2luZywgcmVhZGluZywgd3JpdGluZyBhbmQgZmx1c2hpbmcgbWV0aG9kcyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQKKyAqIGZyb20gd2l0aGluIHRoZSBhc3NvY2lhdGVkIGFzeW5jIG1hbmFnZXIuCisgKi8KK2ludGVyZmFjZSBUQXN5bmNUcmFuc3BvcnQgOiBUVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIFRoZSBUQXN5bmNNYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zcG9ydC4KKyAgICovCisgIFRBc3luY01hbmFnZXIgYXN5bmNNYW5hZ2VyKCkgQHByb3BlcnR5OworfQorCisvKioKKyAqIEEgVEFzeW5jTWFuYWdlciBwcm92aWRpbmcgbm90aWZpY2lhdGlvbnMgZm9yIHNvY2tldCBldmVudHMuCisgKi8KK2ludGVyZmFjZSBUQXN5bmNTb2NrZXRNYW5hZ2VyIDogVEFzeW5jTWFuYWdlciB7CisgIC8qKgorICAgKiBBZGRzIGEgbGlzdGVuZXIgdGhhdCBpcyB0cmlnZ2VyZWQgb25jZSB3aGVuIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQorICAgKiBvY2N1cnMsIGFuZCByZW1vdmVkIGFmdGVyd2FyZHMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBzb2NrZXQgPSBUaGUgc29ja2V0IHRvIGxpc3RlbiBmb3IgZXZlbnRzIGF0LgorICAgKiAgIGV2ZW50VHlwZSA9IFRoZSB0eXBlIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gZm9yLgorICAgKiAgIHRpbWVvdXQgPSBUaGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkCisgICAqICAgICB3aXRoIFRBc3luY0V2ZW50UmVhc29uLlRJTUVEX09VVCBpZiBubyBldmVudCBoYXBwZW5lZC4KKyAgICogICBsaXN0ZW5lciA9IFRoZSBkZWxlZ2F0ZSB0byBjYWxsIHdoZW4gYW4gZXZlbnQgaGFwcGVuZWQuCisgICAqLworICB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgIER1cmF0aW9uIHRpbWVvdXQsIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAvLy8gRGl0dG8KKyAgdm9pZCBhZGRPbmVzaG90TGlzdGVuZXIoU29ja2V0IHNvY2tldCwgVEFzeW5jRXZlbnRUeXBlIGV2ZW50VHlwZSwKKyAgICBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcik7Cit9CisKKy8qKgorICogVHlwZXMgb2YgZXZlbnRzIHRoYXQgY2FuIGhhcHBlbiBmb3IgYW4gYXN5bmNocm9ub3VzIHRyYW5zcG9ydC4KKyAqLworZW51bSBUQXN5bmNFdmVudFR5cGUgeworICBSRUFELCAvLy8gTmV3IGRhdGEgYmVjYW1lIGF2YWlsYWJsZSB0byByZWFkLgorICBXUklURSAvLy8gVGhlIHRyYW5zcG9ydCBiZWNhbWUgcmVhZHkgdG8gYmUgd3JpdHRlbiB0by4KK30KKworLyoqCisgKiBUaGUgdHlwZSBvZiB0aGUgZGVsZWdhdGVzIHVzZWQgdG8gcmVnaXN0ZXIgc29ja2V0IGV2ZW50IGhhbmRsZXJzLgorICovCithbGlhcyB2b2lkIGRlbGVnYXRlKFRBc3luY0V2ZW50UmVhc29uIGNhbGxSZWFzb24pIFRTb2NrZXRFdmVudExpc3RlbmVyOworCisvKioKKyAqIFRoZSByZWFzb24gYSBsaXN0ZW5lciB3YXMgY2FsbGVkLgorICovCitlbnVtIFRBc3luY0V2ZW50UmVhc29uIDogYnl0ZSB7CisgIE5PUk1BTCwgLy8vIFRoZSBldmVudCBsaXN0ZW5lZCBmb3Igd2FzIHRyaWdnZXJlZCBub3JtYWxseS4KKyAgVElNRURfT1VUIC8vLyBBIHRpbWVvdXQgZm9yIHRoZSBldmVudCB3YXMgc2V0LCBhbmQgaXQgZXhwaXJlZC4KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTJlNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OworCitpbXBvcnQgY29yZS5hdG9taWM7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKK2ltcG9ydCBjb3JlLmV4Y2VwdGlvbiA6IG9uT3V0T2ZNZW1vcnlFcnJvcjsKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXIsIFRocmVhZDsKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RkbGliIDogZnJlZSwgbWFsbG9jOworaW1wb3J0IGRlaW1vcy5ldmVudDIuZXZlbnQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250LCBwb3BGcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBTb2NrZXQsIHNvY2tldFBhaXI7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwudHJhaXRzOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLy8gVG8gYXZvaWQgRE1EIEBAQlVHNjM5NUBALgoraW1wb3J0IHRocmlmdC5pbnRlcm5hbC5hbGdvcml0aG07CisKKy8qKgorICogQSBUQXN5bmNNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGxpYmV2ZW50LgorICoKKyAqIFRoZSBsaWJldmVudCBsb29wIGZvciBoYW5kbGluZyBub24tYmxvY2tpbmcgc29ja2V0cyBpcyBydW4gaW4gYSBiYWNrZ3JvdW5kCisgKiB0aHJlYWQsIHdoaWNoIGlzIGxhemlseSBzcGF3bmVkLiBUaGUgdGhyZWFkIGlzIG5vdCBkYWVtb25pemVkIHRvIGF2b2lkCisgKiBjcmFzaGVzIG9uIHByb2dyYW0gc2h1dGRvd24sIGl0IGlzIG9ubHkgc3RvcHBlZCB3aGVuIHRoZSBtYW5hZ2VyIGluc3RhbmNlCisgKiBpcyBkZXN0cm95ZWQuIFNvLCB0byBlbnN1cmUgYSBjbGVhbiBwcm9ncmFtIHRlYXJkb3duLCBlaXRoZXIgbWFrZSBzdXJlIHRoaXMKKyAqIGluc3RhbmNlIGdldHMgZGVzdHJveWVkIChlLmcuIGJ5IHVzaW5nIHNjb3BlKSwgb3IgbWFudWFsbHkgY2FsbCBzdG9wKCkgYXQKKyAqIHRoZSBlbmQuCisgKi8KK2NsYXNzIFRMaWJldmVudEFzeW5jTWFuYWdlciA6IFRBc3luY1NvY2tldE1hbmFnZXIgeworICB0aGlzKCkgeworICAgIGV2ZW50QmFzZV8gPSBldmVudF9iYXNlX25ldygpOworCisgICAgLy8gU2V0IHVwIHRoZSBzb2NrZXQgcGFpciBmb3IgdHJhbnNmZXJyaW5nIGNvbnRyb2wgbWVzc2FnZXMgdG8gdGhlIGV2ZW50CisgICAgLy8gbG9vcC4KKyAgICBhdXRvIHBhaXIgPSBzb2NrZXRQYWlyKCk7CisgICAgY29udHJvbFNlbmRTb2NrZXRfID0gcGFpclswXTsKKyAgICBjb250cm9sUmVjZWl2ZVNvY2tldF8gPSBwYWlyWzFdOworICAgIGNvbnRyb2xSZWNlaXZlU29ja2V0Xy5ibG9ja2luZyA9IGZhbHNlOworCisgICAgLy8gUmVnaXN0ZXIgYW4gZXZlbnQgZm9yIHJlY2VpdmluZyBjb250cm9sIG1lc3NhZ2VzLgorICAgIGNvbnRyb2xSZWNlaXZlRXZlbnRfID0gZXZlbnRfbmV3KGV2ZW50QmFzZV8sIGNvbnRyb2xSZWNlaXZlU29ja2V0Xy5oYW5kbGUsCisgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCB8IEVWX0VULCBhc3N1bWVOb3Rocm93KCZjb250cm9sTXNnUmVjZWl2ZUNhbGxiYWNrKSwKKyAgICAgIGNhc3Qodm9pZCopdGhpcyk7CisgICAgZXZlbnRfYWRkKGNvbnRyb2xSZWNlaXZlRXZlbnRfLCBudWxsKTsKKworICAgIHF1ZXVlZENvdW50TXV0ZXhfID0gbmV3IE11dGV4OworICAgIHplcm9RdWV1ZWRDb25kaXRpb25fID0gbmV3IENvbmRpdGlvbihxdWV1ZWRDb3VudE11dGV4Xyk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICAvLyBzdG9wKCkgc2hvdWxkIGJlIHNhZmUgdG8gY2FsbCwgYmVjYXVzZSBlaXRoZXIgd2UgZG9uJ3QgaGF2ZSBhIHdvcmtlcgorICAgIC8vIHRocmVhZCBydW5uaW5nIGFuZCBpdCBpcyBhIG5vLW9wIGFueXdheSwgb3IgaXQgaXMgZ3VhcmFudGVlZCB0byBiZQorICAgIC8vIHN0aWxsIHJ1bm5pbmcgKGJsb2NrZWQgaW4gZXZlbnRfYmFzZV9sb29wKSwgYW5kIHRodXMgZ3VhcmFudGVlZCBub3QgdG8KKyAgICAvLyBiZSBnYXJiYWdlIGNvbGxlY3RlZCB5ZXQuCisgICAgc3RvcChkdXIhImhuc2VjcyIoMCkpOworCisgICAgZXZlbnRfZnJlZShjb250cm9sUmVjZWl2ZUV2ZW50Xyk7CisgICAgZXZlbnRfYmFzZV9mcmVlKGV2ZW50QmFzZV8pOworICAgIGV2ZW50QmFzZV8gPSBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBleGVjdXRlKFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQsIFdvcmsgd29yaywKKyAgICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwKKyAgKSB7CisgICAgaWYgKGNhbmNlbGxhdGlvbiAmJiBjYW5jZWxsYXRpb24udHJpZ2dlcmVkKSByZXR1cm47CisKKyAgICAvLyBLZWVwIHRyYWNrIHRoYXQgdGhlcmUgaXMgYSBuZXcgd29yayBpdGVtIHRvIGJlIHByb2Nlc3NlZC4KKyAgICBpbmNyZW1lbnRRdWV1ZWRDb3VudCgpOworCisgICAgZW5zdXJlV29ya2VyVGhyZWFkUnVubmluZygpOworCisgICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gc2VuZCB0aGUgY29udHJvbCBtZXNzYWdlIGFzIGEgd2hvbGUg4oCTIHdlIGN1cnJlbnRseQorICAgIC8vIGFzc3VtZSB0byBiZSBhYmxlIHRvIHJlY2VpdmUgaXQgYXQgb25jZSBhcyB3ZWxsLiBJZiB0aGlzIHByb3ZlcyB0byBiZQorICAgIC8vIHVuc3RhYmxlIChlLmcuIHNlbmQgY291bGQgcG9zc2libHkgcmV0dXJuIGVhcmx5IGlmIHRoZSByZWNlaXZpbmcgYnVmZmVyCisgICAgLy8gaXMgZnVsbCBhbmQgdGhlIGJsb2NraW5nIGNhbGwgZ2V0cyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCksIGl0IGNvdWxkCisgICAgLy8gYmUgY2hhbmdlZCB0byBhIG1vcmUgc29waGlzdGljYXRlZCBzY2hlbWUuCisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGRlbGVnYXRlIGNvbnRleHQgZG9lc24ndCBnZXQgR0NkIHdoaWxlIHRoZSB3b3JrIGl0ZW0gaXMKKyAgICAvLyBvbiB0aGUgd2lyZS4KKyAgICBHQy5hZGRSb290KHdvcmsucHRyKTsKKworICAgIC8vIFNlbmQgd29yayBtZXNzYWdlLgorICAgIHNlbmRDb250cm9sTXNnKENvbnRyb2xNc2coTXNnVHlwZS5XT1JLLCB3b3JrLCB0cmFuc3BvcnQpKTsKKworICAgIGlmIChjYW5jZWxsYXRpb24pIHsKKyAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyaW5nLmFkZENhbGxiYWNrKHsKKyAgICAgICAgc2VuZENvbnRyb2xNc2coQ29udHJvbE1zZyhNc2dUeXBlLkNBTkNFTCwgd29yaywgdHJhbnNwb3J0KSk7CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGRlbGF5KER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGRlbGVnYXRlKCkgd29yaykgeworICAgIGluY3JlbWVudFF1ZXVlZENvdW50KCk7CisKKyAgICBlbnN1cmVXb3JrZXJUaHJlYWRSdW5uaW5nKCk7CisKKyAgICBjb25zdCB0diA9IHRvVGltZXZhbChkdXJhdGlvbik7CisKKyAgICAvLyBETUQgQEBCVUdAQDogQ2Fubm90IGRlZHVjZSBUIHRvIHZvaWQgZGVsZWdhdGUoKSBoZXJlLgorICAgIHJlZ2lzdGVyT25lc2hvdEV2ZW50ISh2b2lkIGRlbGVnYXRlKCkpKAorICAgICAgLTEsIDAsIGFzc3VtZU5vdGhyb3coJmRlbGF5Q2FsbGJhY2spLCAmdHYsCisgICAgICB7CisgICAgICAgIHdvcmsoKTsKKyAgICAgICAgZGVjcmVtZW50UXVldWVkQ291bnQoKTsKKyAgICAgIH0KKyAgICApOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBzdG9wKER1cmF0aW9uIHdhaXRGaW5pc2hUaW1lb3V0ID0gZHVyISJobnNlY3MiKC0xKSkgeworICAgIGJvb2wgY2xlYW5FeGl0ID0gdHJ1ZTsKKworICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgaWYgKHdvcmtlclRocmVhZF8pIHsKKyAgICAgICAgc3luY2hyb25pemVkIChxdWV1ZWRDb3VudE11dGV4XykgeworICAgICAgICAgIGlmICh3YWl0RmluaXNoVGltZW91dCA+IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgICAgaWYgKHF1ZXVlZENvdW50XyA+IDApIHsKKyAgICAgICAgICAgICAgemVyb1F1ZXVlZENvbmRpdGlvbl8ud2FpdCh3YWl0RmluaXNoVGltZW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICh3YWl0RmluaXNoVGltZW91dCA8IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgICAgd2hpbGUgKHF1ZXVlZENvdW50XyA+IDApIHplcm9RdWV1ZWRDb25kaXRpb25fLndhaXQoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2FpdEZpbmlzaFRpbWVvdXQgaXMgemVybywgaW1tZWRpYXRlbHkgZXhpdCBpbiBhbGwgY2FzZXMuCisgICAgICAgICAgfQorICAgICAgICAgIGNsZWFuRXhpdCA9IChxdWV1ZWRDb3VudF8gPT0gMCk7CisgICAgICAgIH0KKworICAgICAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKKyAgICAgICAgc2VuZENvbnRyb2xNc2coQ29udHJvbE1zZyhNc2dUeXBlLlNIVVRET1dOKSk7CisgICAgICAgIHdvcmtlclRocmVhZF8uam9pbigpOworICAgICAgICB3b3JrUXVldWVzXyA9IG51bGw7CisgICAgICAgIC8vIFdlIGhhdmUgbnVrZWQgYWxsIGN1cnJlbnRseSBlbnF1ZXVlZCBpdGVtcywgc28gc2V0IHRoZSBjb3VudCB0bworICAgICAgICAvLyB6ZXJvLiBUaGlzIGlzIHNhZmUgdG8gZG8gd2l0aG91dCBsb2NraW5nLCBzaW5jZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICAvLyBpcyBkb3duLgorICAgICAgICBxdWV1ZWRDb3VudF8gPSAwOworICAgICAgICBhdG9taWNTdG9yZSgqKGNhc3Qoc2hhcmVkKSZ3b3JrZXJUaHJlYWRfKSwgY2FzdChzaGFyZWQoVGhyZWFkKSludWxsKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2xlYW5FeGl0OworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBhZGRPbmVzaG90TGlzdGVuZXIoU29ja2V0IHNvY2tldCwgVEFzeW5jRXZlbnRUeXBlIGV2ZW50VHlwZSwKKyAgICAgVFNvY2tldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIKKyAgKSB7CisgICAgYWRkT25lc2hvdExpc3RlbmVySW1wbChzb2NrZXQsIGV2ZW50VHlwZSwgbnVsbCwgbGlzdGVuZXIpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBhZGRPbmVzaG90TGlzdGVuZXIoU29ja2V0IHNvY2tldCwgVEFzeW5jRXZlbnRUeXBlIGV2ZW50VHlwZSwKKyAgICBEdXJhdGlvbiB0aW1lb3V0LCBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcgorICApIHsKKyAgICBpZiAodGltZW91dCA8PSBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgIGFkZE9uZXNob3RMaXN0ZW5lckltcGwoc29ja2V0LCBldmVudFR5cGUsIG51bGwsIGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBpcyBub3QgcmVhbGx5IGRvY3VtZW50ZWQgd2VsbCwgYnV0IGxpYmV2ZW50IGRvZXMgbm90IHJlcXVpcmUgdG8KKyAgICAgIC8vIGtlZXAgdGhlIHRpbWV2YWwgYXJvdW5kIGFmdGVyIHRoZSBldmVudCB3YXMgYWRkZWQuCisgICAgICBhdXRvIHR2ID0gdG9UaW1ldmFsKHRpbWVvdXQpOworICAgICAgYWRkT25lc2hvdExpc3RlbmVySW1wbChzb2NrZXQsIGV2ZW50VHlwZSwgJnR2LCBsaXN0ZW5lcik7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIGFsaWFzIHZvaWQgZGVsZWdhdGUoKSBXb3JrOworCisgIHZvaWQgYWRkT25lc2hvdExpc3RlbmVySW1wbChTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgICBjb25zdCh0aW1ldmFsKSogdGltZW91dCwgVFNvY2tldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIKKyAgKSB7CisgICAgcmVnaXN0ZXJPbmVzaG90RXZlbnQoc29ja2V0LmhhbmRsZSwgbGliZXZlbnRFdmVudFR5cGUoZXZlbnRUeXBlKSwKKyAgICAgIGFzc3VtZU5vdGhyb3coJnNvY2tldENhbGxiYWNrKSwgdGltZW91dCwgbGlzdGVuZXIpOworICB9CisKKyAgdm9pZCByZWdpc3Rlck9uZXNob3RFdmVudChUKShldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IHR5cGUsCisgICAgZXZlbnRfY2FsbGJhY2tfZm4gY2FsbGJhY2ssIGNvbnN0KHRpbWV2YWwpKiB0aW1lb3V0LCBUIHBheWxvYWQKKyAgKSB7CisgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgcGF5bG9hZCBvbiB0aGUgQyBoZWFwLgorICAgIGF1dG8gcGF5bG9hZE1lbSA9IG1hbGxvYyhwYXlsb2FkLnNpemVvZik7CisgICAgaWYgKCFwYXlsb2FkTWVtKSBvbk91dE9mTWVtb3J5RXJyb3IoKTsKKyAgICAoY2FzdChUKilwYXlsb2FkTWVtKVswIC4uIDFdID0gcGF5bG9hZDsKKyAgICBHQy5hZGRSYW5nZShwYXlsb2FkTWVtLCBwYXlsb2FkLnNpemVvZik7CisKKyAgICBhdXRvIHJlc3VsdCA9IGV2ZW50X2Jhc2Vfb25jZShldmVudEJhc2VfLCBmZCwgdHlwZSwgY2FsbGJhY2ssCisgICAgICBwYXlsb2FkTWVtLCB0aW1lb3V0KTsKKworICAgIC8vIEFzc3VtaW5nIHRoYXQgd2UgZGlkbid0IGdldCBvdXIgYXJndW1lbnRzIHdyb25nIGFib3ZlLCB0aGUgb25seSBvdGhlcgorICAgIC8vIHNpdHVhdGlvbiBpbiB3aGljaCBldmVudF9iYXNlX29uY2UgY2FuIGZhaWwgaXMgd2hlbiBpdCBjYW4ndCBhbGxvY2F0ZQorICAgIC8vIG1lbW9yeS4KKyAgICBpZiAocmVzdWx0ICE9IDApIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworICB9CisKKyAgZW51bSBNc2dUeXBlIDogdWJ5dGUgeworICAgIFNIVVRET1dOLAorICAgIFdPUkssCisgICAgQ0FOQ0VMCisgIH0KKworICBzdHJ1Y3QgQ29udHJvbE1zZyB7CisgICAgTXNnVHlwZSB0eXBlOworICAgIFdvcmsgd29yazsKKyAgICBUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0OworICB9CisKKyAgLyoqCisgICAqIFN0YXJ0cyB0aGUgd29ya2VyIHRocmVhZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBydW5uaW5nLgorICAgKi8KKyAgdm9pZCBlbnN1cmVXb3JrZXJUaHJlYWRSdW5uaW5nKCkgeworICAgIC8vIFRlY2huaWNhbGx5LCBvbmx5IGhhbGYgYmFycmllcnMgd291bGQgYmUgcmVxdWlyZWQgaGVyZSwgYnV0IGFkZGluZyB0aGUKKyAgICAvLyBhcmd1bWVudCBzZWVtcyB0byB0cmlnZ2VyIGEgRE1EIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBAQEJVR0BALgorICAgIGlmICghYXRvbWljTG9hZCgqKGNhc3Qoc2hhcmVkKSZ3b3JrZXJUaHJlYWRfKSkpIHsKKyAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICBpZiAoIXdvcmtlclRocmVhZF8pIHsKKyAgICAgICAgICBhdXRvIHRocmVhZCA9IG5ldyBUaHJlYWQoeyBldmVudF9iYXNlX2xvb3AoZXZlbnRCYXNlXywgMCk7IH0pOworICAgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgICAgIGF0b21pY1N0b3JlKCooY2FzdChzaGFyZWQpJndvcmtlclRocmVhZF8pLCBjYXN0KHNoYXJlZCl0aHJlYWQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNlbmRzIGEgY29udHJvbCBtZXNzYWdlIHRvIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgKi8KKyAgdm9pZCBzZW5kQ29udHJvbE1zZyhjb25zdChDb250cm9sTXNnKSBtc2cpIHsKKyAgICBhdXRvIHJlc3VsdCA9IGNvbnRyb2xTZW5kU29ja2V0Xy5zZW5kKCgmbXNnKVswIC4uIDFdKTsKKyAgICBlbnVtIHNpemUgPSBtc2cuc2l6ZW9mOworICAgIGVuZm9yY2UocmVzdWx0ID09IHNpemUsIG5ldyBURXhjZXB0aW9uKHRleHQoCisgICAgICAiU2VuZGluZyBjb250cm9sIG1lc3NhZ2Ugb2YgdHlwZSAiLCBtc2cudHlwZSwgIiBmYWlsZWQgKCIsIHJlc3VsdCwKKyAgICAgICIgYnl0ZXMgaW5zdGVhZCBvZiAiLCBzaXplLCAiIHRyYW5zbWl0dGVkKS4iKSkpOworICB9CisKKyAgLyoqCisgICAqIFJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIGNvbnRyb2wgbWVzc2FnZSBzb2NrZXQgYW5kIGFjdHMgb24gdGhlbS4gQ2FsbGVkCisgICAqIGZyb20gdGhlIHdvcmtlciB0aHJlYWQuCisgICAqLworICB2b2lkIHJlY2VpdmVDb250cm9sTXNnKCkgeworICAgIC8vIFJlYWQgYXMgbWFueSBuZXcgd29yayBpdGVtcyBvZmYgdGhlIHNvY2tldCBhcyBwb3NzaWJsZSAoYXQgbGVhc3Qgb25lCisgICAgLy8gc2hvdWxkIGJlIGF2YWlsYWJsZSwgYXMgd2UgZ290IG5vdGlmaWVkIGJ5IGxpYmV2ZW50KS4KKyAgICBDb250cm9sTXNnIG1zZzsKKyAgICBwdHJkaWZmX3QgYnl0ZXNSZWFkOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBieXRlc1JlYWQgPSBjb250cm9sUmVjZWl2ZVNvY2tldF8ucmVjZWl2ZShjYXN0KHVieXRlW10pKCgmbXNnKVswIC4uIDFdKSk7CisKKyAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgIGF1dG8gZXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworICAgICAgICBpZiAoZXJybm8gIT0gV09VTERfQkxPQ0tfRVJSTk8pIHsKKyAgICAgICAgICBsb2dFcnJvcigiUmVhZGluZyBjb250cm9sIG1lc3NhZ2UsIHNvbWUgd29yayBpdGVtIHdpbGwgcG9zc2libHkgIiB+CisgICAgICAgICAgICAibmV2ZXIgYmUgZXhlY3V0ZWQ6ICVzIiwgc29ja2V0RXJybm9TdHJpbmcoZXJybm8pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBtc2cuc2l6ZW9mKSBicmVhazsKKworICAgICAgLy8gRXZlcnl0aGluZyB3ZW50IGZpbmUsIHdlIHJlY2VpdmVkIGEgbmV3IGNvbnRyb2wgbWVzc2FnZS4KKyAgICAgIGZpbmFsIHN3aXRjaCAobXNnLnR5cGUpIHsKKyAgICAgICAgY2FzZSBNc2dUeXBlLlNIVVRET1dOOgorICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIHdhcyBqdXN0IGludGVuZGVkIHRvIHdha2UgdXMgdXAgZm9yIHNodXRkb3duLgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTXNnVHlwZS5DQU5DRUw6CisgICAgICAgICAgLy8gV2hlbiBwcm9jZXNzaW5nIGEgY2FuY2VsbGF0aW9uLCB3ZSBtdXN0IG5vdCB0b3VjaCB0aGUgZmlyc3QgaXRlbSwKKyAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgICAgICBhdXRvIHF1ZXVlID0gd29ya1F1ZXVlc19bbXNnLnRyYW5zcG9ydF07CisgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHdvcmtRdWV1ZXNfW21zZy50cmFuc3BvcnRdID0gW3F1ZXVlWzBdXSB+CisgICAgICAgICAgICAgIHJlbW92ZUVxdWFsKHF1ZXVlWzEgLi4gJF0sIG1zZy53b3JrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNc2dUeXBlLldPUks6CisgICAgICAgICAgLy8gTm93IHRoYXQgdGhlIHdvcmsgaXRlbSBpcyBiYWNrIGluIHRoZSBEIHdvcmxkLCB3ZSBkb24ndCBuZWVkIHRoZQorICAgICAgICAgIC8vIGV4dHJhIEdDIHJvb3QgZm9yIHRoZSBjb250ZXh0IHBvaW50ZXIgYW55bW9yZSAoc2VlIGV4ZWN1dGUoKSkuCisgICAgICAgICAgR0MucmVtb3ZlUm9vdChtc2cud29yay5wdHIpOworCisgICAgICAgICAgLy8gQWRkIHRoZSB3b3JrIGl0ZW0gdG8gdGhlIHF1ZXVlIGFuZCBleGVjdXRlIGl0LgorICAgICAgICAgIGF1dG8gcXVldWUgPSBtc2cudHJhbnNwb3J0IGluIHdvcmtRdWV1ZXNfOworICAgICAgICAgIGlmIChxdWV1ZSBpcyBudWxsIHx8ICgqcXVldWUpLmVtcHR5KSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcXVldWUgaXMgZW1wdHksIGFkZCB0aGUgbmV3IHdvcmsgaXRlbSB0byB0aGUgcXVldWUgYXMgd2VsbCwKKyAgICAgICAgICAgIC8vIGJ1dCBpbW1lZGlhdGVseSBzdGFydCBleGVjdXRpbmcgaXQuCisgICAgICAgICAgICB3b3JrUXVldWVzX1ttc2cudHJhbnNwb3J0XSA9IFttc2cud29ya107CisgICAgICAgICAgICBleGVjdXRlV29yayhtc2cudHJhbnNwb3J0LCBtc2cud29yayk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgqcXVldWUpIH49IG1zZy53b3JrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbGFzdCByZWFkIHdhcyBzdWNjZXNzZnVsLCBidXQgZGlkbid0IHJlYWQgZW5vdWdoIGJ5dGVzLCB3ZSBnb3QKKyAgICAvLyBhIHByb2JsZW0uCisgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKKyAgICAgIGxvZ0Vycm9yKCJVbmV4cGVjdGVkIHBhcnRpYWwgY29udHJvbCBtZXNzYWdlIHJlYWQgKCVzIGJ5dGUocykgIiB+CisgICAgICAgICJpbnN0ZWFkIG9mICVzKSwgc29tZSB3b3JrIGl0ZW0gd2lsbCBwb3NzaWJseSBuZXZlciBiZSBleGVjdXRlZC4iLAorICAgICAgICBieXRlc1JlYWQsIG1zZy5zaXplb2YpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gd29yayBpdGVtIGFuZCBhbGwgb3RoZXJzIGVucXVldWVkIGZvciB0aGUgc2FtZQorICAgKiB0cmFuc3BvcnQgaW4gYSBuZXcgZmliZXIuIENhbGxlZCBmcm9tIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgKi8KKyAgdm9pZCBleGVjdXRlV29yayhUQXN5bmNUcmFuc3BvcnQgdHJhbnNwb3J0LCBXb3JrIHdvcmspIHsKKyAgICAobmV3IEZpYmVyKHsKKyAgICAgIGF1dG8gaXRlbSA9IHdvcms7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGFjdHVhbCB3b3JrLiBJdCB3aWxsIHBvc3NpYmx5IGFkZCBsaXN0ZW5lcnMgdG8gdGhlCisgICAgICAgICAgLy8gZXZlbnQgbG9vcCBhbmQgeWllbGQgYXdheSBpZiBpdCBoYXMgdG8gd2FpdCBmb3IgYmxvY2tpbmcKKyAgICAgICAgICAvLyBvcGVyYXRpb25zLiBJdCBpcyBxdWl0ZSBwb3NzaWJsZSB0aGF0IGFub3RoZXIgZmliZXIgd2lsbCBtb2RpZnkKKyAgICAgICAgICAvLyB0aGUgd29yayBxdWV1ZSBmb3IgdGhlIGN1cnJlbnQgdHJhbnNwb3J0LgorICAgICAgICAgIGl0ZW0oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGp1c3QgdG8gYmUgc3VyZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICAgIC8vIGRvZXNuJ3Qgc3RvcCB3b3JraW5nIGluIG15c3RlcmlvdXMgd2F5cyBiZWNhdXNlIG9mIGFuIHVuaGFuZGxlZAorICAgICAgICAgIC8vIGV4Y2VwdGlvbi4KKyAgICAgICAgICBsb2dFcnJvcigiRXhjZXB0aW9uIHRocm93biBieSB3b3JrIGl0ZW06ICVzIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgd29yayBxdWV1ZS4KKyAgICAgICAgLy8gTm90ZTogRHVlIHRvIHRoZSB2YWx1ZSBzZW1hbnRpY3Mgb2YgYXJyYXkgc2xpY2VzLCB3ZSBoYXZlIHRvCisgICAgICAgIC8vIHJlLWxvb2t1cCB0aGlzIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4gVGhpcyBjb3VsZCBiZSBzb2x2ZWQsIGJ1dCBJJ2QKKyAgICAgICAgLy8gcmF0aGVyIHJlcGxhY2UgdGhpcyBkaXJlY3RseSB3aXRoIGEgcXVldWUgdHlwZSBvbmNlIG9uZSBiZWNvbWVzCisgICAgICAgIC8vIGF2YWlsYWJsZSBpbiBQaG9ib3MuCisgICAgICAgIGF1dG8gcXVldWUgPSB3b3JrUXVldWVzX1t0cmFuc3BvcnRdOworICAgICAgICBhc3NlcnQocXVldWUuZnJvbnQgPT0gaXRlbSk7CisgICAgICAgIHF1ZXVlLnBvcEZyb250KCk7CisgICAgICAgIHdvcmtRdWV1ZXNfW3RyYW5zcG9ydF0gPSBxdWV1ZTsKKworICAgICAgICAvLyBOb3cgdGhhdCB0aGUgd29yayBpdGVtIGlzIGRvbmUsIG5vIGxvbmdlciBjb3VudCBpdCBhcyBxdWV1ZWQuCisgICAgICAgIGRlY3JlbWVudFF1ZXVlZENvdW50KCk7CisKKyAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KSBicmVhazsKKworICAgICAgICAvLyBJZiB0aGUgcXVldWUgaXMgbm90IGVtcHR5LCBleGVjdXRlIHRoZSBuZXh0IHdhaXRpbmcgaXRlbS4KKyAgICAgICAgaXRlbSA9IHF1ZXVlLmZyb250OworICAgICAgfQorICAgIH0pKS5jYWxsKCk7CisgIH0KKworICAvKioKKyAgICogSW5jcmVtZW50cyB0aGUgYW1vdW50IG9mIHF1ZXVlZCBpdGVtcy4KKyAgICovCisgIHZvaWQgaW5jcmVtZW50UXVldWVkQ291bnQoKSB7CisgICAgc3luY2hyb25pemVkIChxdWV1ZWRDb3VudE11dGV4XykgeworICAgICAgKytxdWV1ZWRDb3VudF87CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERlY3JlbWVudHMgdGhlIGFtb3VudCBvZiBxdWV1ZWQgaXRlbXMuCisgICAqLworICB2b2lkIGRlY3JlbWVudFF1ZXVlZENvdW50KCkgeworICAgIHN5bmNocm9uaXplZCAocXVldWVkQ291bnRNdXRleF8pIHsKKyAgICAgIGFzc2VydChxdWV1ZWRDb3VudF8gPiAwKTsKKyAgICAgIC0tcXVldWVkQ291bnRfOworICAgICAgaWYgKHF1ZXVlZENvdW50XyA9PSAwKSB7CisgICAgICAgIHplcm9RdWV1ZWRDb25kaXRpb25fLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBleHRlcm4oQykgdm9pZCBjb250cm9sTXNnUmVjZWl2ZUNhbGxiYWNrKGV2dXRpbF9zb2NrZXRfdCwgc2hvcnQsCisgICAgdm9pZCAqbWFuYWdlclRoaXMKKyAgKSB7CisgICAgKGNhc3QoVExpYmV2ZW50QXN5bmNNYW5hZ2VyKW1hbmFnZXJUaGlzKS5yZWNlaXZlQ29udHJvbE1zZygpOworICB9CisKKyAgc3RhdGljIGV4dGVybihDKSB2b2lkIHNvY2tldENhbGxiYWNrKGV2dXRpbF9zb2NrZXRfdCwgc2hvcnQgZmxhZ3MsCisgICAgdm9pZCAqYXJnCisgICkgeworICAgIGF1dG8gcmVhc29uID0gKGZsYWdzICYgRVZfVElNRU9VVCkgPyBUQXN5bmNFdmVudFJlYXNvbi5USU1FRF9PVVQgOgorICAgICAgVEFzeW5jRXZlbnRSZWFzb24uTk9STUFMOworICAgICgqKGNhc3QoVFNvY2tldEV2ZW50TGlzdGVuZXIqKWFyZykpKHJlYXNvbik7CisgICAgR0MucmVtb3ZlUmFuZ2UoYXJnKTsKKyAgICBkZXN0cm95KGFyZyk7CisgICAgZnJlZShhcmcpOworICB9CisKKyAgc3RhdGljIGV4dGVybihDKSB2b2lkIGRlbGF5Q2FsbGJhY2soZXZ1dGlsX3NvY2tldF90LCBzaG9ydCBmbGFncywKKyAgICB2b2lkICphcmcKKyAgKSB7CisgICAgYXNzZXJ0KGZsYWdzICYgRVZfVElNRU9VVCk7CisgICAgKCooY2FzdCh2b2lkIGRlbGVnYXRlKCkqKWFyZykpKCk7CisgICAgR0MucmVtb3ZlUmFuZ2UoYXJnKTsKKyAgICBkZXN0cm95KGFyZyk7CisgICAgZnJlZShhcmcpOworICB9CisKKyAgVGhyZWFkIHdvcmtlclRocmVhZF87CisKKyAgZXZlbnRfYmFzZSogZXZlbnRCYXNlXzsKKworICAvLy8gVGhlIHNvY2tldCB1c2VkIGZvciByZWNlaXZpbmcgbmV3IHdvcmsgaXRlbXMgaW4gdGhlIGV2ZW50IGxvb3AuIFBhaXJlZAorICAvLy8gd2l0aCBjb250cm9sU2VuZFNvY2tldF8uIEludmFsaWQgKGkuZS4gVEFzeW5jV29ya0l0ZW0uaW5pdCkgaXRlbXMgYXJlCisgIC8vLyBpZ25vcmVkIGFuZCBjYW4gYmUgdXNlZCB0byB3YWtlIHVwIHRoZSB3b3JrZXIgdGhyZWFkLgorICBTb2NrZXQgY29udHJvbFJlY2VpdmVTb2NrZXRfOworICBldmVudCogY29udHJvbFJlY2VpdmVFdmVudF87CisKKyAgLy8vIFRoZSBzb2NrZXQgdXNlZCB0byBzZW5kIG5ldyB3b3JrIGl0ZW1zIHRvIHRoZSBldmVudCBsb29wLiBJdCBpcworICAvLy8gZXhwZWN0ZWQgdGhhdCB3b3JrIGl0ZW1zIGNhbiBhbHdheXMgYmUgcmVhZCBhdCBvbmNlIGZyb20gaXQsIGkuZS4gdGhhdAorICAvLy8gdGhlcmUgd2lsbCBuZXZlciBiZSBzaG9ydCByZWFkcy4KKyAgU29ja2V0IGNvbnRyb2xTZW5kU29ja2V0XzsKKworICAvLy8gUXVldWVkIHVwIHdvcmsgZGVsZWdhdGVzIGZvciBhc3luYyB0cmFuc3BvcnRzLiBUaGlzIGFsc28gaW5jbHVkZXMKKyAgLy8vIGN1cnJlbnRseSBhY3RpdmUgb25lcywgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBvbiBjb21wbGV0aW9uLAorICAvLy8gd2hpY2ggaXMgcmVsaWVkIG9uIGJ5IHRoZSBjb250cm9sIG1lc3NhZ2UgcmVjZWl2ZSBmaWJlciAodGhlIG1haW4gb25lKQorICAvLy8gdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW1tZWRpYXRlbHkgc3RhcnQgZXhlY3V0aW5nIGl0ZW1zIG9yIG5vdC4KKyAgLy8gVE9ETzogVGhpcyBzaG91bGQgcmVhbGx5IGJlIG9mIHNvbWUgcXVldWUgdHlwZSwgbm90IGFuIGFycmF5IHNsaWNlLCBidXQKKyAgLy8gc3RkLmNvbnRhaW5lciBkb2Vzbid0IGhhdmUgYW55dGhpbmcuCisgIFdvcmtbXVtUQXN5bmNUcmFuc3BvcnRdIHdvcmtRdWV1ZXNfOworCisgIC8vLyBUaGUgdG90YWwgbnVtYmVyIG9mIHdvcmsgaXRlbXMgbm90IHlldCBmaW5pc2hlZCAocXVldWVkIGFuZCBjdXJyZW50bHkKKyAgLy8vIGV4ZWN1dGVkKSBhbmQgZGVsYXlzIG5vdCB5ZXQgZXhlY3V0ZWQuCisgIHVpbnQgcXVldWVkQ291bnRfOworCisgIC8vLyBQcm90ZWN0cyBxdWV1ZWRDb3VudF8uCisgIE11dGV4IHF1ZXVlZENvdW50TXV0ZXhfOworCisgIC8vLyBUcmlnZ2VyZWQgd2hlbiBxdWV1ZWRDb3VudF8gcmVhY2hlcyB6ZXJvLCBwcm90ZWN0ZWQgYnkgcXVldWVkQ291bnRNdXRleF8uCisgIENvbmRpdGlvbiB6ZXJvUXVldWVkQ29uZGl0aW9uXzsKK30KKworcHJpdmF0ZSB7CisgIHRpbWV2YWwgdG9UaW1ldmFsKGNvbnN0KER1cmF0aW9uKSBkdXIpIHsKKyAgICB0aW1ldmFsIHR2OworICAgIGR1ci5zcGxpdCEoInNlY29uZHMiLCAidXNlY3MiKSh0di50dl9zZWMsIHR2LnR2X3VzZWMpOworICAgIHJldHVybiB0djsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBsaWJldmVudCBmbGFncyBjb21iaW5hdGlvbiB0byByZXByZXNlbnQgYSBnaXZlbiBUQXN5bmNFdmVudFR5cGUuCisgICAqLworICBzaG9ydCBsaWJldmVudEV2ZW50VHlwZShUQXN5bmNFdmVudFR5cGUgdHlwZSkgeworICAgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUQXN5bmNFdmVudFR5cGUuUkVBRDoKKyAgICAgICAgcmV0dXJuIEVWX1JFQUQgfCBFVl9FVDsKKyAgICAgIGNhc2UgVEFzeW5jRXZlbnRUeXBlLldSSVRFOgorICAgICAgICByZXR1cm4gRVZfV1JJVEUgfCBFVl9FVDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOGY1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmFzeW5jLnNvY2tldDsKKworaW1wb3J0IGNvcmUuc3RkYy5lcnJubzogRUNPTk5SRVNFVDsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IEZpYmVyOworaW1wb3J0IGNvcmUudGltZSA6IGR1ciwgRHVyYXRpb247CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldCA6IFRTb2NrZXRCYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKKwordmVyc2lvbiAoV2luZG93cykgeworICBpbXBvcnQgc3RkLmMud2luZG93cy53aW5zb2NrIDogY29ubmVjdDsKK30gZWxzZSB2ZXJzaW9uIChQb3NpeCkgeworICBpbXBvcnQgY29yZS5zeXMucG9zaXguc3lzLnNvY2tldCA6IGNvbm5lY3Q7Cit9IGVsc2Ugc3RhdGljIGFzc2VydCgwLCAiRG9uJ3Qga25vdyBjb25uZWN0IG9uIHRoaXMgcGxhdGZvcm0uIik7CisKKy8qKgorICogTm9uLWJsb2NraW5nIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogV2hlbmV2ZXIgYSBzb2NrZXQgb3BlcmF0aW9uIHdvdWxkIGJsb2NrLCBUQXN5bmNTb2NrZXQgcmVnaXN0ZXJzIGEgY2FsbGJhY2sKKyAqIHdpdGggdGhlIHNwZWNpZmllZCBUQXN5bmNTb2NrZXRNYW5hZ2VyIGFuZCB5aWVsZHMuCisgKgorICogQXMgZm9yIHRocmlmdC50cmFuc3BvcnQuc29ja2V0LCBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIG9mIHN0ZC5zb2NrZXQsCisgKiBjdXJyZW50bHkgb25seSBUQ1AvSVAgc29ja2V0cyBhcmUgc3VwcG9ydGVkIChpLmUuIFVuaXggZG9tYWluIHNvY2tldHMgYXJlCisgKiBub3QpLgorICovCitjbGFzcyBUQXN5bmNTb2NrZXQgOiBUU29ja2V0QmFzZSwgVEFzeW5jVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gYWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgKCEpIHNvY2tldC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGFzeW5jTWFuYWdlciA9IFRoZSBUQXN5bmNTb2NrZXRNYW5hZ2VyIHRvIHVzZSBmb3Igbm9uLWJsb2NraW5nIEkvTy4KKyAgICogICBzb2NrZXQgPSBBbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCBzb2NrZXQgb2JqZWN0LiBXaWxsIGJlIHN3aXRjaGVkIHRvCisgICAqICAgICBub24tYmxvY2tpbmcgbW9kZSBpZiBpdCBpc24ndCBhbHJlYWR5LgorICAgKi8KKyAgdGhpcyhUQXN5bmNTb2NrZXRNYW5hZ2VyIGFzeW5jTWFuYWdlciwgU29ja2V0IHNvY2tldCkgeworICAgIGFzeW5jTWFuYWdlcl8gPSBhc3luY01hbmFnZXI7CisgICAgc29ja2V0LmJsb2NraW5nID0gZmFsc2U7CisgICAgc3VwZXIoc29ja2V0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGFzeW5jTWFuYWdlciA9IFRoZSBUQXN5bmNTb2NrZXRNYW5hZ2VyIHRvIHVzZSBmb3Igbm9uLWJsb2NraW5nIEkvTy4KKyAgICogICBob3N0ID0gUmVtb3RlIGhvc3QuCisgICAqICAgcG9ydCA9IFJlbW90ZSBwb3J0LgorICAgKi8KKyAgdGhpcyhUQXN5bmNTb2NrZXRNYW5hZ2VyIGFzeW5jTWFuYWdlciwgc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0KSB7CisgICAgYXN5bmNNYW5hZ2VyXyA9IGFzeW5jTWFuYWdlcjsKKyAgICBzdXBlcihob3N0LCBwb3J0KTsKKyAgfQorCisgIG92ZXJyaWRlIFRBc3luY01hbmFnZXIgYXN5bmNNYW5hZ2VyKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gYXN5bmNNYW5hZ2VyXzsKKyAgfQorCisgIC8qKgorICAgKiBBc3luY2hyb25vdXNseSBjb25uZWN0cyB0aGUgc29ja2V0LgorICAgKgorICAgKiBDb21wbGV0ZXMgd2l0aG91dCBibG9ja2luZyBhbmQgZGVmZXJzIGZ1cnRoZXIgb3BlcmF0aW9ucyBvbiB0aGUgc29ja2V0CisgICAqIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLiBJZiBjb25uZWN0aW5nIGZhaWxzLCB0aGlzIGlzCisgICAqIGN1cnJlbnRseSBub3QgaW5kaWNhdGVkIGluIGFueSB3YXkgb3RoZXIgdGhhbiBldmVyeSBjYWxsIHRvIHJlYWQvd3JpdGUKKyAgICogZmFpbGluZy4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisKKyAgICBlbmZvcmNlKCFob3N0Xy5lbXB0eSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IG9wZW4gbnVsbCBob3N0LiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworICAgIGVuZm9yY2UocG9ydF8gIT0gMCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IG9wZW4gd2l0aCBudWxsIHBvcnQuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKworICAgIC8vIENhbm5vdCB1c2Ugc3RkLnNvY2tldC5Tb2NrZXQuY29ubmVjdCBoZXJlIGJlY2F1c2UgaXQgaGlkZXMgYXdheQorICAgIC8vIEVJTlBST0dSRVNTL1dTQVdPVUxEQkxPQ0suCisgICAgQWRkcmVzcyBhZGRyOworICAgIHRyeSB7CisgICAgICAvLyBDdXJyZW50bHksIHdlIGp1c3QgZ28gd2l0aCB0aGUgZmlyc3QgYWRkcmVzcyByZXR1cm5lZCwgY291bGQgYmUgbWFkZQorICAgICAgLy8gbW9yZSBpbnRlbGxpZ2VudCB0aG91Z2gg4oCTIElQdjY/CisgICAgICBhZGRyID0gZ2V0QWRkcmVzcyhob3N0XywgcG9ydF8pWzBdOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihgVW5hYmxlIHRvIHJlc29sdmUgaG9zdCAiYCB+IGhvc3RfIH4gYCIuYCwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOLCBfX0ZJTEVfXywgX19MSU5FX18sIGUpOworICAgIH0KKworICAgIHNvY2tldF8gPSBuZXcgVGNwU29ja2V0KGFkZHIuYWRkcmVzc0ZhbWlseSk7CisgICAgc29ja2V0Xy5ibG9ja2luZyA9IGZhbHNlOworICAgIHNldFNvY2tldE9wdHMoKTsKKworICAgIGF1dG8gZXJyb3JDb2RlID0gY29ubmVjdChzb2NrZXRfLmhhbmRsZSwgYWRkci5uYW1lKCksIGFkZHIubmFtZUxlbigpKTsKKyAgICBpZiAoZXJyb3JDb2RlID09IDApIHsKKyAgICAgIC8vIElmIHRoZSBjb25uZWN0aW9uIGNvdWxkIGJlIGVzdGFibGlzaGVkIGltbWVkaWF0ZWx5LCBqdXN0IHJldHVybi4gSQorICAgICAgLy8gZG9uJ3Qga25vdyBpZiB0aGlzIGV2ZXIgaGFwcGVucy4KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKyAgICBpZiAoZXJybm8gIT0gQ09OTkVDVF9JTlBST0dSRVNTX0VSUk5PKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihgQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvICJgIH4KKyAgICAgICAgaG9zdF8gfiBgIjogYCB+IHNvY2tldEVycm5vU3RyaW5nKGVycm5vKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBleHBlY3RlZCBjYXNlOiBjb25uZWN0KCkgc2lnbmFsbGVkIHRoYXQgdGhlIGNvbm5lY3Rpb24KKyAgICAvLyBpcyBiZWluZyBlc3RhYmxpc2hlZCBpbiB0aGUgYmFja2dyb3VuZC4gUXVldWUgdXAgYSB3b3JrIGl0ZW0gd2l0aCB0aGUKKyAgICAvLyBhc3luYyBtYW5hZ2VyIHdoaWNoIGp1c3QgZGVmZXJzIGFueSBvdGhlciBvcGVyYXRpb25zIG9uIHRoaXMKKyAgICAvLyBUQXN5bmNTb2NrZXQgaW5zdGFuY2UgdW50aWwgdGhlIHNvY2tldCBpcyByZWFkeS4KKyAgICBhc3luY01hbmFnZXJfLmV4ZWN1dGUodGhpcywKKyAgICAgIHsKKyAgICAgICAgYXV0byBmaWJlciA9IEZpYmVyLmdldFRoaXMoKTsKKyAgICAgICAgVEFzeW5jRXZlbnRSZWFzb24gcmVhc29uID0gdm9pZDsKKyAgICAgICAgYXN5bmNNYW5hZ2VyXy5hZGRPbmVzaG90TGlzdGVuZXIoc29ja2V0XywgVEFzeW5jRXZlbnRUeXBlLldSSVRFLAorICAgICAgICAgIGNvbm5lY3RUaW1lb3V0LAorICAgICAgICAgIHNjb3BlZERlbGVnYXRlKChUQXN5bmNFdmVudFJlYXNvbiByKXsgcmVhc29uID0gcjsgZmliZXIuY2FsbCgpOyB9KQorICAgICAgICApOworICAgICAgICBGaWJlci55aWVsZCgpOworCisgICAgICAgIGlmIChyZWFzb24gPT0gVEFzeW5jRXZlbnRSZWFzb24uVElNRURfT1VUKSB7CisgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24sIHNvIHRoYXQgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIGZhaWwgaW1tZWRpYXRlbHkuCisgICAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBlcnJvckNvZGUgPSB2b2lkOworICAgICAgICBzb2NrZXRfLmdldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5TT0NLRVQsIGNhc3QoU29ja2V0T3B0aW9uKVNPX0VSUk9SLAorICAgICAgICAgIGVycm9yQ29kZSk7CisKKyAgICAgICAgaWYgKGVycm9yQ29kZSkgeworICAgICAgICAgIGxvZ0luZm8oIkNvdWxkIG5vdCBjb25uZWN0IFRBc3luY1NvY2tldDogJXMiLAorICAgICAgICAgICAgc29ja2V0RXJybm9TdHJpbmcoZXJyb3JDb2RlKSk7CisKKyAgICAgICAgICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgc28gdGhhdCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgZmFpbCBpbW1lZGlhdGVseS4KKyAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIH0KKyAgICApOworICB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgc29ja2V0LgorICAgKgorICAgKiBXaWxsIGJsb2NrIHVudGlsIGFsbCBjdXJyZW50bHkgYWN0aXZlIG9wZXJhdGlvbnMgYXJlIGZpbmlzaGVkIGJlZm9yZSB0aGUKKyAgICogc29ja2V0IGlzIGNsb3NlZC4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKworICAgIGltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworICAgIGltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CisKKyAgICBhdXRvIGRvbmVNdXRleCA9IG5ldyBNdXRleDsKKyAgICBhdXRvIGRvbmVDb25kID0gbmV3IENvbmRpdGlvbihkb25lTXV0ZXgpOworICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSB7CisgICAgICBhc3luY01hbmFnZXJfLmV4ZWN1dGUodGhpcywKKyAgICAgICAgc2NvcGVkRGVsZWdhdGUoCisgICAgICAgICAgeworICAgICAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIGRvbmVDb25kLm5vdGlmeUFsbCgpOworICAgICAgICAgIH0KKyAgICAgICAgKQorICAgICAgKTsKKyAgICAgIGRvbmVDb25kLndhaXQoKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKworICAgIHVieXRlIGJ1ZjsKKyAgICBhdXRvIHIgPSBzb2NrZXRfLnJlY2VpdmUoKCZidWYpWzAuLjFdLCBTb2NrZXRGbGFncy5QRUVLKTsKKyAgICBpZiAociA9PSBTb2NrZXQuRVJST1IpIHsKKyAgICAgIGF1dG8gbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKyAgICAgIHN0YXRpYyBpZiAoY29ubnJlc2V0T25QZWVyU2h1dGRvd24pIHsKKyAgICAgICAgaWYgKGxhc3RFcnJubyA9PSBFQ09OTlJFU0VUKSB7CisgICAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlBlZWtpbmcgaW50byBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04pOworICAgIH0KKyAgICByZXR1cm4gKHIgPiAwKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCByZWFkIGlmIHNvY2tldCBpcyBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIHR5cGVvZihnZXRTb2NrZXRFcnJubygpKSBsYXN0RXJybm87CisKKyAgICBhdXRvIHIgPSB5aWVsZE9uQmxvY2soc29ja2V0Xy5yZWNlaXZlKGNhc3Qodm9pZFtdKWJ1ZiksCisgICAgICBUQXN5bmNFdmVudFR5cGUuUkVBRCk7CisKKyAgICAvLyBJZiByZWN2IHdlbnQgZmluZSwgaW1tZWRpYXRlbHkgcmV0dXJuLgorICAgIGlmIChyID49IDApIHJldHVybiByOworCisgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcsIGZpbmQgb3V0IGhvdyB0byBoYW5kbGUgaXQuCisgICAgbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgIHN0YXRpYyBpZiAoY29ubnJlc2V0T25QZWVyU2h1dGRvd24pIHsKKyAgICAgIC8vIFNlZSB0b3AgY29tbWVudC4KKyAgICAgIGlmIChsYXN0RXJybm8gPT0gRUNPTk5SRVNFVCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVjZWl2aW5nIGZyb20gc29ja2V0IGZhaWxlZDogIiB+CisgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgc2l6ZV90IHNlbnQ7CisgICAgd2hpbGUgKHNlbnQgPCBidWYubGVuZ3RoKSB7CisgICAgICBzZW50ICs9IHdyaXRlU29tZShidWZbc2VudCAuLiAkXSk7CisgICAgfQorICAgIGFzc2VydChzZW50ID09IGJ1Zi5sZW5ndGgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHdyaXRlU29tZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgd3JpdGUgaWYgc29ja2V0IGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgYXV0byByID0geWllbGRPbkJsb2NrKHNvY2tldF8uc2VuZChidWYpLCBUQXN5bmNFdmVudFR5cGUuV1JJVEUpOworCisgICAgLy8gRXZlcnl0aGluZyB3ZW50IHdlbGwsIGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAgICBpZiAociA+IDApIHJldHVybiByOworCisgICAgLy8gSGFuZGxlIGVycm9yIGNvbmRpdGlvbnMuCisgICAgaWYgKHIgPCAwKSB7CisgICAgICBhdXRvIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICAgIGF1dG8gdHlwZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOOworICAgICAgaWYgKGlzU29ja2V0Q2xvc2VFcnJubyhsYXN0RXJybm8pKSB7CisgICAgICAgIHR5cGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU47CisgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNlbmRpbmcgdG8gc29ja2V0IGZhaWxlZDogIiB+CisgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIHR5cGUpOworICAgIH0KKworICAgIC8vIHNlbmQoKSBzaG91bGQgbmV2ZXIgcmV0dXJuIDAuCisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNlbmRpbmcgdG8gc29ja2V0IGZhaWxlZCAoMCBieXRlcyB3cml0dGVuKS4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04pOworICB9CisKKyAgLy8vIFRoZSBhbW91bnQgb2YgdGltZSBpbiB3aGljaCBhIGNvbm5jZXRpb24gbXVzdCBiZSBlc3RhYmxpc2hlZCBiZWZvcmUgdGhlCisgIC8vLyBvcGVuKCkgY2FsbCB0aW1lcyBvdXQuCisgIER1cmF0aW9uIGNvbm5lY3RUaW1lb3V0ID0gZHVyISJzZWNvbmRzIig1KTsKKworcHJpdmF0ZToKKyAgdm9pZCBjbG9zZUltbWVkaWF0ZWx5KCkgeworICAgIHNvY2tldF8uY2xvc2UoKTsKKyAgICBzb2NrZXRfID0gbnVsbDsKKyAgfQorCisgIFQgeWllbGRPbkJsb2NrKFQpKGxhenkgVCBjYWxsLCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gcmVzdWx0ID0gY2FsbCgpOworICAgICAgaWYgKHJlc3VsdCAhPSBTb2NrZXQuRVJST1IgfHwgZ2V0U29ja2V0RXJybm8oKSAhPSBXT1VMRF9CTE9DS19FUlJOTykgcmV0dXJuIHJlc3VsdDsKKworICAgICAgLy8gV2UgZ290IGFuIEVBR0FJTiByZXN1bHQsIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcmV0dXJuIGhlcmUgb25jZSBzb21lCisgICAgICAvLyBldmVudCBoYXBwZW5zIGFuZCB5aWVsZC4KKworICAgICAgRHVyYXRpb24gdGltZW91dCA9IHZvaWQ7CisgICAgICBmaW5hbCBzd2l0Y2ggKGV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIFRBc3luY0V2ZW50VHlwZS5SRUFEOgorICAgICAgICAgIHRpbWVvdXQgPSByZWN2VGltZW91dF87CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVEFzeW5jRXZlbnRUeXBlLldSSVRFOgorICAgICAgICAgIHRpbWVvdXQgPSBzZW5kVGltZW91dF87CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGF1dG8gZmliZXIgPSBGaWJlci5nZXRUaGlzKCk7CisgICAgICBhc3NlcnQoZmliZXIsICJDdXJyZW50IGZpYmVyIG51bGwg4oCTIG5vdCBydW5uaW5nIGluIFRBc3luY01hbmFnZXI/Iik7CisgICAgICBUQXN5bmNFdmVudFJlYXNvbiBldmVudFJlYXNvbiA9IHZvaWQ7CisgICAgICBhc3luY01hbmFnZXJfLmFkZE9uZXNob3RMaXN0ZW5lcihzb2NrZXRfLCBldmVudFR5cGUsIHRpbWVvdXQsCisgICAgICAgIHNjb3BlZERlbGVnYXRlKChUQXN5bmNFdmVudFJlYXNvbiByZWFzb24pIHsKKyAgICAgICAgICBldmVudFJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgICBmaWJlci5jYWxsKCk7CisgICAgICAgIH0pCisgICAgICApOworCisgICAgICAvLyBZaWVsZHMgZXhlY3V0aW9uIGJhY2sgdG8gdGhlIGFzeW5jIG1hbmFnZXIsIHdpbGwgcmV0dXJuIGJhY2sgaGVyZSBvbmNlCisgICAgICAvLyB0aGUgYWJvdmUgbGlzdGVuZXIgaXMgY2FsbGVkLgorICAgICAgRmliZXIueWllbGQoKTsKKworICAgICAgaWYgKGV2ZW50UmVhc29uID09IFRBc3luY0V2ZW50UmVhc29uLlRJTUVEX09VVCkgeworICAgICAgICAvLyBJZiB3ZSBhcmUgY2FuY2VsbGluZyB0aGUgcmVxdWVzdCBkdWUgdG8gYSB0aW1lZCBvdXQgb3BlcmF0aW9uLCB0aGUKKyAgICAgICAgLy8gY29ubmVjdGlvbiBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUsIGJlY2F1c2UgdGhlIHNlcnZlciBjb3VsZCBkZWNpZGUKKyAgICAgICAgLy8gdG8gc2VuZCB0aGUgcmVxdWVzdGVkIGRhdGEgbGF0ZXIsIG9yIHdlIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGhhbGYtCisgICAgICAgIC8vIHdheSBpbnRvIHdyaXRpbmcgYSByZXF1ZXN0LiBUaHVzLCB3ZSBjbG9zZSB0aGUgY29ubmVjdGlvbiB0byBtYWtlIGFueQorICAgICAgICAvLyBwb3NzaWJseSBxdWV1ZWQgdXAgd29yayBpdGVtcyBmYWlsIGltbWVkaWF0ZWx5LiBCZXNpZGVzLCB0aGUgc2VydmVyCisgICAgICAgIC8vIGlzIG5vdCB2ZXJ5IGxpa2VseSB0byBpbW1lZGlhdGVseSByZWNvdmVyIGFmdGVyIGEgc29ja2V0LWxldmVsCisgICAgICAgIC8vIHRpbWVvdXQgaGFzIGV4cGlyZWQgYW55d2F5LgorICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciBzb2NrZXQgIiB+CisgICAgICAgICAgInRvIGdldCByZWFkeSB0byAiIH4gdG8hc3RyaW5nKGV2ZW50VHlwZSkgfiAiLiIsCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlRJTUVEX09VVCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIFRoZSBUQXN5bmNTb2NrZXRNYW5hZ2VyIHRvIHVzZSBmb3Igbm9uLWJsb2NraW5nIEkvTy4KKyAgVEFzeW5jU29ja2V0TWFuYWdlciBhc3luY01hbmFnZXJfOworfQorCitwcml2YXRlIHsKKyAgLy8gc3RkLnNvY2tldCBkb2Vzbid0IGluY2x1ZGUgU09fRVJST1IgZm9yIHJlYXNvbnMgdW5rbm93bi4KKyAgdmVyc2lvbiAobGludXgpIHsKKyAgICBlbnVtIFNPX0VSUk9SID0gNDsKKyAgfSBlbHNlIHZlcnNpb24gKE9TWCkgeworICAgIGVudW0gU09fRVJST1IgPSAweDEwMDc7CisgIH0gZWxzZSB2ZXJzaW9uIChGcmVlQlNEKSB7CisgICAgZW51bSBTT19FUlJPUiA9IDB4MTAwNzsKKyAgfSBlbHNlIHZlcnNpb24gKFdpbjMyKSB7CisgICAgaW1wb3J0IHN0ZC5jLndpbmRvd3Mud2luc29jayA6IFNPX0VSUk9SOworICB9IGVsc2Ugc3RhdGljIGFzc2VydChmYWxzZSwgIkRvbid0IGtub3cgU09fRVJST1Igb24gdGhpcyBwbGF0Zm9ybS4iKTsKKworICAvLyBUaGlzIGhhY2sgZm9yY2VzIGEgZGVsZWdhdGUgbGl0ZXJhbCB0byBiZSBzY29wZWQsIGV2ZW4gaWYgaXQgaXMgcGFzc2VkIHRvCisgIC8vIGEgZnVuY3Rpb24gYWNjZXB0aW5nIG5vcm1hbCBkZWxlZ2F0ZXMgYXMgd2VsbC4gRE1EIGxpa2VzIHRvIGFsbG9jYXRlIHRoZQorICAvLyBjb250ZXh0IG9uIHRoZSBoZWFwIGFueXdheSwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgZm9yIExEQy4KKyAgaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0RlbGVnYXRlOworICBhdXRvIHNjb3BlZERlbGVnYXRlKEQpKHNjb3BlIEQgZCkgaWYgKGlzRGVsZWdhdGUhRCkgeworICAgIHJldHVybiBkOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTYyNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zc2wuZApAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5hc3luYy5zc2w7CisKK2ltcG9ydCBjb3JlLnRocmVhZCA6IEZpYmVyOworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldDsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5lcnI7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuc3NsOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNzbDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc3NsX2JpbzsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CisKKy8qKgorICogUHJvdmlkZXMgU1NML1RMUyBlbmNyeXB0aW9uIGZvciBhc3luYyBzb2NrZXRzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLCBhcyBpdCBjb250ZXh0LXN3aXRjaGVzCisgKiBiZXR3ZWVuIGZpYmVycyBmcm9tIHdpdGhpbiBPcGVuU1NMIGNhbGxzLCBhbmQgdGhlIHNhZmV0eSBvZiB0aGlzIGhhcyBub3QgeWV0CisgKiBiZWVuIHZlcmlmaWVkLgorICoKKyAqIEZvciBvYnZpb3VzIHJlYXNvbnMgKHRoZSBTU0wgY29ubmVjdGlvbiBpcyBzdGF0ZWZ1bCksIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UKKyAqIHNob3VsZCBuZXZlciBiZSB1c2VkIG9uIGEgZ2l2ZW4gc29ja2V0IGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KKy8vIE5vdGU6IFRoaXMgY291bGQgZWFzaWx5IGJlIGV4dGVuZGVkIHRvIG90aGVyIHRyYW5zcG9ydHMgaW4gdGhlIGZ1dHVyZSBhcyB3ZWxsLgorLy8gVGhlcmUgYXJlIG9ubHkgdHdvIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBkb24ndCB3b3JrIHdpdGggYSBnZW5lcmljCisvLyBUVHJhbnNwb3J0OiAxKSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLCBmb3Igd2hpY2ggcGVlciBuYW1lL2FkZHJlc3MgYXJlCisvLyBuZWVkZWQgZnJvbSB0aGUgc29ja2V0LCBhbmQgMikgdGhlIGNvbm5lY3Rpb24gc2h1dGRvd24sIHdoZXJlIHRoZSBhc3NvY2lhdGVkCisvLyBhc3luYyBtYW5hZ2VyIGlzIG5lZWRlZCBiZWNhdXNlIGNsb3NlKCkgaXMgbm90IHVzdWFsbHkgY2FsbGVkIGZyb20gd2l0aGluIGEKKy8vIHdvcmsgaXRlbS4KK2ZpbmFsIGNsYXNzIFRBc3luY1NTTFNvY2tldCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgY29udGV4dCA9IFRoZSBTU0wgc29ja2V0IGNvbnRleHQgdG8gdXNlLiBBIHJlZmVyZW5jZSB0byBpdCBpcyBzdG9yZWQgc28KKyAgICogICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNsZWFuZWQgdXAgd2hpbGUgdGhlIHNvY2tldCBpcyB1c2VkLgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIGFzeW5jIG5ldHdvcmsgdHJhbnNwb3J0IHRvIHVzZSBmb3IKKyAgICogICAgIGNvbW11bmljYXRpb24uCisgICAqLworICB0aGlzKFRBc3luY1NvY2tldCB1bmRlcmx5aW5nU29ja2V0LCBUU1NMQ29udGV4dCBjb250ZXh0KSB7CisgICAgc29ja2V0XyA9IHVuZGVybHlpbmdTb2NrZXQ7CisgICAgY29udGV4dF8gPSBjb250ZXh0OworICAgIHNlcnZlclNpZGVfID0gY29udGV4dC5zZXJ2ZXJTaWRlOworICAgIGFjY2Vzc01hbmFnZXJfID0gY29udGV4dC5hY2Nlc3NNYW5hZ2VyOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIGlmIChzc2xfIGlzIG51bGwgfHwgIXNvY2tldF8uaXNPcGVuKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIHNodXRkb3duID0gU1NMX2dldF9zaHV0ZG93bihzc2xfKTsKKyAgICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pICE9IDA7CisgICAgYm9vbCBzaHV0ZG93blNlbnQgPSAoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikgIT0gMDsKKyAgICByZXR1cm4gIShzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgYnl0ZSBidCA9IHZvaWQ7CisgICAgYXV0byByYyA9IFNTTF9wZWVrKHNzbF8sICZidCwgYnQuc2l6ZW9mKTsKKyAgICBzc2xFbmZvcmNlKHJjID49IDAsICJTU0xfcGVlayIpOworCisgICAgaWYgKHJjID09IDApIHsKKyAgICAgIEVSUl9jbGVhcl9lcnJvcigpOworICAgIH0KKyAgICByZXR1cm4gKHJjID4gMCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgZW5mb3JjZSghc2VydmVyU2lkZV8sICJDYW5ub3Qgb3BlbiBhIHNlcnZlci1zaWRlIFNTTCBzb2NrZXQuIik7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworCisgICAgaWYgKHNzbF8pIHsKKyAgICAgIC8vIElmIHRoZSB1bmRlcmx5aW5nIHNvY2tldCB3YXMgYXV0b21hdGljYWxseSBjbG9zZWQgYmVjYXVzZSBvZiBhbiBlcnJvcgorICAgICAgLy8gKGkuZS4gY2xvc2UoKSB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgc29ja2V0IG1ldGhvZCksIHdlIGNhbiBsYW5kCisgICAgICAvLyBoZXJlIHdpdGggdGhlIFNTTCBvYmplY3Qgc3RpbGwgYWxsb2NhdGVkOyBkZWxldGUgaXQgaGVyZS4KKyAgICAgIGNsZWFudXBTU0woKTsKKyAgICB9CisKKyAgICBzb2NrZXRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKworICAgIGlmIChzc2xfICFpcyBudWxsKSB7CisgICAgICAvLyBTU0wgbmVlZHMgdG8gc2VuZC9yZWNlaXZlIGRhdGEgb3ZlciB0aGUgc29ja2V0IGFzIHBhcnQgb2YgdGhlIHNodXRkb3duCisgICAgICAvLyBwcm90b2NvbCwgc28gd2UgbXVzdCBleGVjdXRlIHRoZSBjYWxscyBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAgLy8gYXN5bmMgbWFuYWdlci4gT24gdGhlIG90aGVyIGhhbmQsIFRUcmFuc3BvcnQgY2xpZW50cyBleHBlY3QgdGhlIHNvY2tldAorICAgICAgLy8gdG8gYmUgY2xvc2VkIHdoZW4gY2xvc2UoKSByZXR1cm5zLCBzbyB3ZSBoYXZlIHRvIGJsb2NrIHVudGlsIHRoZQorICAgICAgLy8gc2h1dGRvd24gd29yayBpdGVtIGhhcyBiZWVuIGV4ZWN1dGVkLgorICAgICAgaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CisgICAgICBpbXBvcnQgY29yZS5zeW5jLm11dGV4OworCisgICAgICBpbnQgcmMgPSB2b2lkOworICAgICAgYXV0byBkb25lTXV0ZXggPSBuZXcgTXV0ZXg7CisgICAgICBhdXRvIGRvbmVDb25kID0gbmV3IENvbmRpdGlvbihkb25lTXV0ZXgpOworICAgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIHsKKyAgICAgICAgc29ja2V0Xy5hc3luY01hbmFnZXIuZXhlY3V0ZShzb2NrZXRfLCB7CisgICAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgICAgIH0KKyAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgZG9uZUNvbmQubm90aWZ5QWxsKCk7CisgICAgICAgIH0pOworICAgICAgICBkb25lQ29uZC53YWl0KCk7CisgICAgICB9CisKKyAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgLy8gRG8gbm90IHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlIGFzIGxlYXZpbmcgdGhlIHRyYW5zcG9ydCAib3BlbiIgd2lsbAorICAgICAgICAvLyBwcm9iYWJseSBwcm9kdWNlIG9ubHkgbW9yZSBlcnJvcnMsIGFuZCB0aGUgY2hhbmNlIHdlIGNhbiBkbworICAgICAgICAvLyBzb21ldGhpbmcgYWJvdXQgdGhlIGVycm9yIGUuZy4gYnkgcmV0cnlpbmcgaXMgdmVyeSBsb3cuCisgICAgICAgIGxvZ0Vycm9yKCJFcnJvciB3aGlsZSBzaHV0dGluZyBkb3duIFNTTDogJXMiLCBnZXRTU0xFeGNlcHRpb24oKSk7CisgICAgICB9CisKKyAgICAgIGNsZWFudXBTU0woKTsKKyAgICB9CisKKyAgICBzb2NrZXRfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisgICAgYXV0byByYyA9IFNTTF9yZWFkKHNzbF8sIGJ1Zi5wdHIsIGNhc3QoaW50KWJ1Zi5sZW5ndGgpOworICAgIHNzbEVuZm9yY2UocmMgPj0gMCwgIlNTTF9yZWFkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICAvLyBMb29wIGluIGNhc2UgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgaXMgc2V0IGluIFNTTF9DVFguCisgICAgc2l6ZV90IHdyaXR0ZW4gPSAwOworICAgIHdoaWxlICh3cml0dGVuIDwgYnVmLmxlbmd0aCkgeworICAgICAgYXV0byBieXRlcyA9IFNTTF93cml0ZShzc2xfLCBidWYucHRyICsgd3JpdHRlbiwKKyAgICAgICAgY2FzdChpbnQpKGJ1Zi5sZW5ndGggLSB3cml0dGVuKSk7CisgICAgICBzc2xFbmZvcmNlKGJ5dGVzID4gMCwgIlNTTF93cml0ZSIpOworICAgICAgd3JpdHRlbiArPSBieXRlczsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBhdXRvIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgICBlbmZvcmNlKGJpbyAhaXMgbnVsbCwgbmV3IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5lZCBudWxsIikpOworCisgICAgYXV0byByYyA9IEJJT19mbHVzaChiaW8pOworICAgIHNzbEVuZm9yY2UocmMgPT0gMSwgIkJJT19mbHVzaCIpOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZSBTU0wgaGFuZHNoYWtlIHByb3RvY29sLgorICAgKi8KKyAgYm9vbCBzZXJ2ZXJTaWRlKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gc2VydmVyU2lkZV87CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBzZXJ2ZXJTaWRlKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc2VydmVyU2lkZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgYWNjZXNzIG1hbmFnZXIgdG8gdXNlLgorICAgKi8KKyAgdm9pZCBhY2Nlc3NNYW5hZ2VyKFRBY2Nlc3NNYW5hZ2VyIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGFjY2Vzc01hbmFnZXJfID0gdmFsdWU7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UsIGNsZWFucyB1cCB0aGUgU1NMIGNvbm5lY3Rpb24gYW5kIHRocm93cyB0aGUKKyAgICogZXhjZXB0aW9uIGZvciB0aGUgbGFzdCBTU0wgZXJyb3IuCisgICAqLworICB2b2lkIHNzbEVuZm9yY2UoYm9vbCBjb25kaXRpb24sIHN0cmluZyBsb2NhdGlvbikgeworICAgIGlmICghY29uZGl0aW9uKSB7CisgICAgICAvLyBXZSBuZWVkIHRvIGZldGNoIHRoZSBlcnJvciBmaXJzdCwgYXMgdGhlIGVycm9yIHN0YWNrIHdpbGwgYmUgY2xlYW5lZAorICAgICAgLy8gd2hlbiBzaHV0dGluZyBkb3duIFNTTC4KKyAgICAgIGF1dG8gZSA9IGdldFNTTEV4Y2VwdGlvbihsb2NhdGlvbik7CisgICAgICBjbGVhbnVwU1NMKCk7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGcmVlcyB0aGUgU1NMIGNvbm5lY3Rpb24gb2JqZWN0IGFuZCBjbGVhcnMgdGhlIFNTTCBlcnJvciBzdGF0ZS4KKyAgICovCisgIHZvaWQgY2xlYW51cFNTTCgpIHsKKyAgICBTU0xfZnJlZShzc2xfKTsKKyAgICBzc2xfID0gbnVsbDsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisKKyAgLyoqCisgICAqIE1ha2VzIHN1cmUgdGhlIFNTTCBjb25uZWN0aW9uIGlzIHVwIGFuZCBydW5uaW5nLCBhbmQgaW5pdGlhbGl6ZXMgaXQgaWYgbm90LgorICAgKi8KKyAgdm9pZCBjaGVja0hhbmRzaGFrZSgpIHsKKyAgICBlbmZvcmNlKHNvY2tldF8uaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgaWYgKHNzbF8gIWlzIG51bGwpIHJldHVybjsKKyAgICBzc2xfID0gY29udGV4dF8uY3JlYXRlU1NMKCk7CisKKyAgICBhdXRvIGJpbyA9IGNyZWF0ZVRUcmFuc3BvcnRCSU8oc29ja2V0XywgZmFsc2UpOworICAgIFNTTF9zZXRfYmlvKHNzbF8sIGJpbywgYmlvKTsKKworICAgIGludCByYyA9IHZvaWQ7CisgICAgaWYgKHNlcnZlclNpZGVfKSB7CisgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgfQorICAgIGVuZm9yY2UocmMgPiAwLCBnZXRTU0xFeGNlcHRpb24oKSk7CisKKyAgICBhdXRvIGFkZHIgPSBzb2NrZXRfLmdldFBlZXJBZGRyZXNzKCk7CisgICAgYXV0aG9yaXplKHNzbF8sIGFjY2Vzc01hbmFnZXJfLCBhZGRyLAorICAgICAgKHNlcnZlclNpZGVfID8gYWRkci50b0hvc3ROYW1lU3RyaW5nKCkgOiBzb2NrZXRfLmhvc3QpKTsKKyAgfQorCisgIFRBc3luY1NvY2tldCBzb2NrZXRfOworICBib29sIHNlcnZlclNpZGVfOworICBTU0wqIHNzbF87CisgIFRTU0xDb250ZXh0IGNvbnRleHRfOworICBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyXzsKK30KKworLyoqCisgKiBXcmFwcyBwYXNzZWQgVEFzeW5jU29ja2V0IGluc3RhbmNlcyBpbnRvIFRBc3luY1NTTFNvY2tldHMuCisgKgorICogVHlwaWNhbGx5IHVzZWQgd2l0aCBUQXN5bmNDbGllbnQuIEFzIGFuIHVuZm9ydHVuYXRlIGNvbnNlcXVlbmNlIG9mIHRoZQorICogYXN5bmMgY2xpZW50IGRlc2lnbiwgdGhlIHBhc3NlZCB0cmFuc3BvcnRzIGNhbm5vdCBiZSBzdGF0aWNhbGx5IHZlcmlmaWVkIHRvCisgKiBiZSBvZiB0eXBlIFRBc3luY1NvY2tldC4gSW5zdGVhZCwgdGhlIHR5cGUgaXMgdmVyaWZpZWQgYXQgcnVudGltZSDigJMgaWYgYQorICogdHJhbnNwb3J0IG9mIGFuIHVuZXhwZWN0ZWQgdHlwZSBpcyBwYXNzZWQgdG8gZ2V0VHJhbnNwb3J0KCksIGl0IGZhaWxzLAorICogdGhyb3dpbmcgYSBUVHJhbnNwb3J0RXhjZXB0aW9uLgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIGF1dG8gY29udGV4dCA9IG53ZSBUU1NMQ29udGV4dCgpOworICogLi4uIC8vIENvbmZpZ3VyZSBTU0wgY29udGV4dC4KKyAqIGF1dG8gZmFjdG9yeSA9IG5ldyBUQXN5bmNTU0xTb2NrZXRGYWN0b3J5KGNvbnRleHQpOworICoKKyAqIGF1dG8gc29ja2V0ID0gbmV3IFRBc3luY1NvY2tldChzb21lQXN5bmNNYW5hZ2VyLCBob3N0LCBwb3J0KTsKKyAqIHNvY2tldC5vcGVuKCk7CisgKgorICogYXV0byBjbGllbnQgPSBuZXcgVEFzeW5jQ2xpZW50IVNlcnZpY2UodHJhbnNwb3J0LCBmYWN0b3J5LAorICogICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKSk7CisgKiAtLS0KKyAqLworY2xhc3MgVEFzeW5jU1NMU29ja2V0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgLy8vCisgIHRoaXMoVFNTTENvbnRleHQgY29udGV4dCkgeworICAgIGNvbnRleHRfID0gY29udGV4dDsKKyAgfQorCisgIG92ZXJyaWRlIFRBc3luY1NTTFNvY2tldCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBhdXRvIHNvY2tldCA9IGNhc3QoVEFzeW5jU29ja2V0KXRyYW5zcG9ydDsKKyAgICBlbmZvcmNlKHNvY2tldCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiVEFzeW5jU1NMU29ja2V0RmFjdG9yeSByZXF1aXJlcyBhIFRBc3luY1NvY2tldCB0byB3b3JrIG9uLCBub3QgYSAiIH4KKyAgICAgIHRvIXN0cmluZyh0eXBlaWQodHJhbnNwb3J0KSkgfiAiLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuSU5URVJOQUxfRVJST1IKKyAgICApKTsKKyAgICByZXR1cm4gbmV3IFRBc3luY1NTTFNvY2tldChzb2NrZXQsIGNvbnRleHRfKTsKKyAgfQorCitwcml2YXRlOgorICBUU1NMQ29udGV4dCBjb250ZXh0XzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlY2U3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmJhc2U7CisKKy8qKgorICogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBUaHJpZnQgZXhjZXB0aW9ucy4KKyAqLworY2xhc3MgVEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2cgPSAiIiwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICB9Cit9CisKKy8qKgorICogQW4gb3BlcmF0aW9uIGZhaWxlZCBiZWNhdXNlIG9uZSBvciBtb3JlIHN1Yi10YXNrcyBmYWlsZWQuCisgKi8KK2NsYXNzIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBFeGNlcHRpb25bXSBleGNlcHRpb25zLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLAorICAgIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdGhpcy5leGNlcHRpb25zID0gZXhjZXB0aW9uczsKKyAgfQorCisgIC8vLyBUaGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNoaWxkcmVuIG9mIHRoZSBvcGVyYXRpb24uIElmIGFwcGxpY2FibGUsCisgIC8vLyB0aGUgbGlzdCBpcyBvcmRlcmVkIGluIHRoZSBzYW1lIHdheSB0aGUgZXhjZXB0aW9ucyBvY2N1cnJlZC4KKyAgRXhjZXB0aW9uW10gZXhjZXB0aW9uczsKK30KKworLy8vIFRoZSBUaHJpZnQgdmVyc2lvbiBzdHJpbmcsIHVzZWQgZm9yIGluZm9ybWF0aXZlIHB1cnBvc2VzLgorLy8gTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgaGFyZGNvZGVkLCBidXQgd2lsbCBsaWtlbHkgYmUgZmlsbGVkIGluIGJ5IHRoZSBidWlsZAorLy8gc3lzdGVtIGluIGZ1dHVyZSB2ZXJzaW9ucy4KK2VudW0gVkVSU0lPTiA9ICIxLjAuMCI7CisKKy8qKgorICogRnVuY3Rpb25zIHVzZWQgZm9yIGxvZ2dpbmcgaW5zaWRlIFRocmlmdC4KKyAqCisgKiBCeSBkZWZhdWx0LCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2VzIGFyZSB3cml0dGVuIHRvIHN0ZG91dC9zdGRlcnIsIGJ1dCB0aGlzCisgKiBiZWhhdmlvciBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgcHJvdmlkaW5nIGN1c3RvbSBnX3tJbmZvLCBFcnJvcn1Mb2dTaW5rCisgKiBoYW5kbGVycy4KKyAqCisgKiBFeGFtcGxlczoKKyAqIC0tLQorICogbG9nSW5mbygiQW4gaW5mb3JtYXRpdmUgbWVzc2FnZS4iKTsKKyAqIGxvZ0Vycm9yKCJTb21lIGVycm9yIG9jY3VycmVkOiAlcyIsIGUpOworICogLS0tCisgKi8KK2FsaWFzIGxvZ0Zvcm1hdHRlZCFnX2luZm9Mb2dTaW5rIGxvZ0luZm87CithbGlhcyBsb2dGb3JtYXR0ZWQhZ19lcnJvckxvZ1NpbmsgbG9nRXJyb3I7IC8vLyBEaXR0bworCisvKioKKyAqIEVycm9yIGFuZCBpbmZvIGxvZyBtZXNzYWdlIHNpbmtzLgorICoKKyAqIFRoZXNlIGRlbGVnYXRlcyBhcmUgY2FsbGVkIHdpdGggdGhlIGxvZyBtZXNzYWdlIHBhc3NlZCBhcyBjb25zdChjaGFyKVtdCisgKiBhcmd1bWVudCwgYW5kIGNhbiBiZSBvdmVyd3JpdHRlbiB0byBob29rIHRoZSBUaHJpZnQgbGlicmFyaWVzIHVwIHdpdGggYQorICogY3VzdG9tIGxvZ2dpbmcgc3lzdGVtLiBCeSBkZWZhdWx0LCB0aGV5IGZvcndhcmQgYWxsIG91dHB1dCB0byBzdGRvdXQvc3RkZXJyLgorICovCitfX2dzaGFyZWQgdm9pZCBkZWxlZ2F0ZShjb25zdChjaGFyKVtdKSBnX2luZm9Mb2dTaW5rOworX19nc2hhcmVkIHZvaWQgZGVsZWdhdGUoY29uc3QoY2hhcilbXSkgZ19lcnJvckxvZ1Npbms7IC8vLyBEaXR0bworCitzaGFyZWQgc3RhdGljIHRoaXMoKSB7CisgIGltcG9ydCBzdGQuc3RkaW87CisKKyAgZ19pbmZvTG9nU2luayA9IChjb25zdChjaGFyKVtdIHRleHQpIHsKKyAgICBzdGRvdXQud3JpdGVsbih0ZXh0KTsKKyAgfTsKKworICBnX2Vycm9yTG9nU2luayA9IChjb25zdChjaGFyKVtdIHRleHQpIHsKKyAgICBzdGRlcnIud3JpdGVsbih0ZXh0KTsKKyAgfTsKK30KKworLy8gVGhpcyBzaG91bGQgYmUgcHJpdmF0ZSwgaWYgaXQgY291bGQgc3RpbGwgYmUgdXNlZCB0aHJvdWdoIHRoZSBhbGlhc2VzIHRoZW4uCit0ZW1wbGF0ZSBsb2dGb3JtYXR0ZWQoYWxpYXMgdGFyZ2V0KSB7CisgIHZvaWQgbG9nRm9ybWF0dGVkKHN0cmluZyBmaWxlID0gX19GSUxFX18sIGludCBsaW5lID0gX19MSU5FX18sCisgICAgVC4uLikoc3RyaW5nIGZtdCwgVCBhcmdzKSBpZiAoCisgICAgX190cmFpdHMoY29tcGlsZXMsIHsgdGFyZ2V0KCIiKTsgfSkKKyAgKSB7CisgICAgaW1wb3J0IHN0ZC5mb3JtYXQsIHN0ZC5zdGRpbzsKKyAgICBpZiAodGFyZ2V0ICFpcyBudWxsKSB7CisgICAgICBzY29wZShleGl0KSBnX2Zvcm1hdEJ1ZmZlci5jbGVhcigpOworCisgICAgICAvLyBQaG9ib3MgQEBCVUdAQDogSWYgdGhlIGVtcHR5IHN0cmluZyBwdXQoKSBpcyByZW1vdmVkLCBBcHBlbmRlci5kYXRhCisgICAgICAvLyBzdGF5cyBlbXB0eS4KKyAgICAgIGdfZm9ybWF0QnVmZmVyLnB1dCgiIik7CisKKyAgICAgIGZvcm1hdHRlZFdyaXRlKGdfZm9ybWF0QnVmZmVyLCAiJXM6JXM6ICIsIGZpbGUsIGxpbmUpOworCisgICAgICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICAgICAgZ19mb3JtYXRCdWZmZXIucHV0KGZtdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXR0ZWRXcml0ZShnX2Zvcm1hdEJ1ZmZlciwgZm10LCBhcmdzKTsKKyAgICAgIH0KKyAgICAgIHRhcmdldChnX2Zvcm1hdEJ1ZmZlci5kYXRhKTsKKyAgICB9CisgIH0KK30KKworcHJpdmF0ZSB7CisgIC8vIFVzZSBhIGdsb2JhbCwgYnV0IHRocmVhZC1sb2NhbCBidWZmZXIgZm9yIGNvbnN0cnVjdGluZyBsb2cgbWVzc2FnZXMuCisgIGltcG9ydCBzdGQuYXJyYXkgOiBBcHBlbmRlcjsKKyAgQXBwZW5kZXIhKGNoYXJbXSkgZ19mb3JtYXRCdWZmZXI7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxNmRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuZApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKKworaW1wb3J0IHN0ZC5jb252IDogdGV4dCwgdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclN0b3JhZ2VDbGFzcywgUGFyYW1ldGVyU3RvcmFnZUNsYXNzVHVwbGUsCisgIFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY3RmZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworaW1wb3J0IHRocmlmdC51dGlsLmZ1dHVyZTsKKworLyoqCisgKiBBc3luY2hyb25vdXMgVGhyaWZ0IHNlcnZpY2UgY2xpZW50IHdoaWNoIHJldHVybnMgdGhlIHJlc3VsdHMgYXMgVEZ1dHVyZXMgYW4KKyAqIHVzZXMgYSBUQXN5bmNNYW5hZ2VyIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCB3b3JrLgorICoKKyAqIFRBc3luY0NsaWVudEJhc2Ugc2VydmVzIGFzIGEgc3VwZXJ0eXBlIGZvciBhbGwgVEFzeW5jQ2xpZW50cyBmb3IgdGhlIHNhbWUKKyAqIHNlcnZpY2UsIHdoaWNoIG1pZ2h0IGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBjb25jcmV0ZSBwcm90b2NvbCB0eXBlcworICogKHRoZXJlIGlzIG5vIGNvdmFyaWFuY2UgZm9yIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVycyksIGFuZCBleHRlbmRzCisgKiBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZS4gSWYgSW50ZXJmYWNlIGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIHNlcnZpY2UKKyAqIEJhc2VJbnRlcmZhY2UsIGl0IGFsc28gZXh0ZW5kcyBUQXN5bmNDbGllbnRCYXNlIUJhc2VJbnRlcmZhY2UuCisgKgorICogVEFzeW5jQ2xpZW50IGltcGxlbWVudHMgVEFzeW5jQ2xpZW50QmFzZSBhbmQgb2ZmZXJzIHR3byBjb25zdHJ1Y3RvcnMgd2l0aAorICogdGhlIGZvbGxvd2luZyBzaWduYXR1cmVzOgorICogLS0tCisgKiB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgdGYsIFRQcm90b2NvbEZhY3RvcnkgcGYpOworICogdGhpcyhUQXN5bmNUcmFuc3BvcnQgdHJhbnMsIFRUcmFuc3BvcnRGYWN0b3J5IGl0ZiwgVFRyYW5zcG9ydEZhY3Rvcnkgb3RmLAorICogICBUUHJvdG9jb2xGYWN0b3J5IGlwZiwgVFByb3RvY29sRmFjdG9yeSBvcGYpOworICogLS0tCisgKgorICogQWdhaW4sIGlmIEludGVyZmFjZSByZXByZXNlbnRzIGEgZGVyaXZlZCBUaHJpZnQgc2VydmljZSwKKyAqIFRBc3luY0NsaWVudCFJbnRlcmZhY2UgaXMgYWxzbyBkZXJpdmVkIGZyb20gVEFzeW5jQ2xpZW50IUJhc2VJbnRlcmZhY2UuCisgKgorICogVEFzeW5jQ2xpZW50IGNhbiBleGNsdXNpdmVseSBiZSB1c2VkIHdpdGggVEFzeW5jVHJhbnNwb3J0cywgYXMgaXQgbmVlZHMgdG8KKyAqIGFjY2VzcyB0aGUgYXNzb2NpYXRlZCBUQXN5bmNNYW5hZ2VyLiBUbyBzZXQgdXAgYW55IHdyYXBwZXIgdHJhbnNwb3J0cworICogKGUuZy4gYnVmZmVyZWQsIGZyYW1lZCkgb24gdG9wIG9mIGl0IGFuZCB0byBpbnN0YW5jaWF0ZSB0aGUgcHJvdG9jb2xzIHRvIHVzZSwKKyAqIFRUcmFuc3BvcnRGYWN0b3J5IGFuZCBUUHJvdG9jb2xGYWN0b3J5IGluc3RhbmNlcyBhcmUgcGFzc2VkIHRvIHRoZQorICogY29uc3RydWN0b3JzIOKAkyB0aGUgdGhyZWUgYXJndW1lbnQgY29uc3RydWN0b3IgaXMgYSBzaG9ydGN1dCBpZiB0aGUgc2FtZQorICogdHJhbnNwb3J0IGFuZCBwcm90b2NvbCBhcmUgdG8gYmUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LCB3aGljaCBpcworICogdGhlIG1vc3QgY29tbW9uIGNhc2UuCisgKgorICogSWYgdGhlIHNhbWUgdHJhbnNwb3J0IGZhY3RvcnkgaXMgcGFzc2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cywKKyAqIG9ubHkgYSBzaW5nbGUgd3JhcHBlciB0cmFuc3BvcnQgd2lsbCBiZSBjcmVhdGVkIGFuZCB1c2VkIGZvciBib3RoIGRpcmVjdGlvbnMuCisgKiBUaGlzIGFsbG93cyBlYXN5IGltcGxlbWVudGF0aW9uIG9mIHByb3RvY29scyBsaWtlIFNTTC4KKyAqCisgKiBKdXN0IGFzIFRDbGllbnQgZG9lcywgVEFzeW5jQ2xpZW50IGFsc28gdGFrZXMgdHdvIG9wdGlvbmFsIHRlbXBsYXRlCisgKiBhcmd1bWVudHMgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIGFjdHVhbCBUUHJvdG9jb2wKKyAqIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcywgYXMgdmlydHVhbCBjYWxscyBjYW4KKyAqIGNvbXBsZXRlbHkgYmUgZWxpbWluYXRlZCB0aGVuLiBJZiB0aGUgYWN0dWFsIHR5cGVzIG9mIHRoZSBwcm90b2NvbHMKKyAqIGluc3RhbnRpYXRlZCBieSB0aGUgZmFjdG9yaWVzIHVzZWQgZG9lcyBub3QgbWF0Y2ggdGhlIG9uZXMgc3RhdGljYWxseQorICogc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBhIFRFeGNlcHRpb24gaXMgdGhyb3duIGR1cmluZworICogY29uc3RydWN0aW9uLgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIC8vIEEgc2ltcGxlIFRocmlmdCBzZXJ2aWNlLgorICogaW50ZXJmYWNlIEZvbyB7IGludCBmb28oKTsgfQorICoKKyAqIC8vIENyZWF0ZSBhIFRBc3luY1NvY2tldE1hbmFnZXIg4oCTIHRocmlmdC5hc3luYy5saWJldmVudCBpcyB1c2VkIGZvciB0aGlzCisgKiAvLyBleGFtcGxlLgorICogYXV0byBtYW5hZ2VyID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlcjsKKyAqCisgKiAvLyBTZXQgdXAgYW4gYXN5bmMgdHJhbnNwb3J0IHRvIHVzZS4KKyAqIGF1dG8gc29ja2V0ID0gbmV3IFRBc3luY1NvY2tldChtYW5hZ2VyLCBob3N0LCBwb3J0KTsKKyAqCisgKiAvLyBDcmVhdGUgYSBjbGllbnQgaW5zdGFuY2UuCisgKiBhdXRvIGNsaWVudCA9IG5ldyBUQXN5bmNDbGllbnQhRm9vKAorICogICBzb2NrZXQsCisgKiAgIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LCAvLyBXcmFwIHRoZSBzb2NrZXQgaW4gYSBUQnVmZmVyZWRUcmFuc3BvcnQuCisgKiAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpIC8vIFVzZSB0aGUgQmluYXJ5IHByb3RvY29sLgorICogKTsKKyAqCisgKiAvLyBDYWxsIGZvbyBhbmQgdXNlIHRoZSByZXR1cm5lZCBmdXR1cmUuCisgKiBhdXRvIHJlc3VsdCA9IGNsaWVudC5mb28oKTsKKyAqIHByYWdtYShtc2csIHR5cGVvZihyZXN1bHQpKTsgLy8gVEZ1dHVyZSFpbnQKKyAqIGludCByZXN1bHRWYWx1ZSA9IHJlc3VsdC53YWl0R2V0KCk7IC8vIFdhaXRzIHVudGlsIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlLgorICogLS0tCisgKi8KK2ludGVyZmFjZSBUQXN5bmNDbGllbnRCYXNlKEludGVyZmFjZSkgaWYgKGlzQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlCit7CisgIC8qKgorICAgKiBUaGUgdW5kZXJseWluZyBUQXN5bmNUcmFuc3BvcnQgdXNlZCBieSB0aGlzIGNsaWVudCBpbnN0YW5jZS4KKyAgICovCisgIFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHk7Cit9CisKKy8vLyBEaXR0bworaW50ZXJmYWNlIFRBc3luY0NsaWVudEJhc2UoSW50ZXJmYWNlKSBpZiAoaXNEZXJpdmVkU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEFzeW5jQ2xpZW50QmFzZSEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSwgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UKK3t9CisKKy8vLyBEaXR0bwordGVtcGxhdGUgVEFzeW5jQ2xpZW50KEludGVyZmFjZSwgSW5wdXRQcm90b2NvbCA9IFRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wgPSB2b2lkKSBpZiAoCisgIGlzU2VydmljZSFJbnRlcmZhY2UgJiYgaXNUUHJvdG9jb2whSW5wdXRQcm90b2NvbCAmJgorICAoaXNUUHJvdG9jb2whT3V0cHV0UHJvdG9jb2wgfHwgaXMoT3V0cHV0UHJvdG9jb2wgPT0gdm9pZCkpCispIHsKKyAgbWl4aW4oeworICAgIHN0YXRpYyBpZiAoaXNEZXJpdmVkU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRBc3luY0NsaWVudCA6ICIgfgorICAgICAgICAiVEFzeW5jQ2xpZW50IShCYXNlU2VydmljZSFJbnRlcmZhY2UsIElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKSwgIiB+CisgICAgICAgICJUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZSB7XG4iOworICAgICAgY29kZSB+PSBxeworICAgICAgICB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgdGYsIFRQcm90b2NvbEZhY3RvcnkgcGYpIHsKKyAgICAgICAgICB0aGlzKHRyYW5zLCB0ZiwgdGYsIHBmLCBwZik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgaXRmLAorICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG90ZiwgVFByb3RvY29sRmFjdG9yeSBpcGYsIFRQcm90b2NvbEZhY3Rvcnkgb3BmCisgICAgICAgICkgeworICAgICAgICAgIHN1cGVyKHRyYW5zLCBpdGYsIG90ZiwgaXBmLCBvcGYpOworICAgICAgICAgIGNsaWVudF8gPSBuZXcgdHlwZW9mKGNsaWVudF8pKGlwcm90Xywgb3Byb3RfKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVENsaWVudCEoSW50ZXJmYWNlLCBJUHJvdCwgT1Byb3QpIGNsaWVudF87CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUQXN5bmNDbGllbnQgOiBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZSB7IjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgYWxpYXMgSW5wdXRQcm90b2NvbCBJUHJvdDsKKyAgICAgICAgc3RhdGljIGlmIChpc1RQcm90b2NvbCFPdXRwdXRQcm90b2NvbCkgeworICAgICAgICAgIGFsaWFzIE91dHB1dFByb3RvY29sIE9Qcm90OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXRpYyBhc3NlcnQoaXMoT3V0cHV0UHJvdG9jb2wgPT0gdm9pZCkpOworICAgICAgICAgIGFsaWFzIElucHV0UHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0KKworICAgICAgICB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgdGYsIFRQcm90b2NvbEZhY3RvcnkgcGYpIHsKKyAgICAgICAgICB0aGlzKHRyYW5zLCB0ZiwgdGYsIHBmLCBwZik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgaXRmLAorICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG90ZiwgVFByb3RvY29sRmFjdG9yeSBpcGYsIFRQcm90b2NvbEZhY3Rvcnkgb3BmCisgICAgICAgICkgeworICAgICAgICAgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICAgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuczsKKworICAgICAgICAgIGF1dG8gaXAgPSBpdGYuZ2V0VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICBUVHJhbnNwb3J0IG9wID0gdm9pZDsKKyAgICAgICAgICBpZiAoaXRmID09IG90ZikgeworICAgICAgICAgICAgb3AgPSBpcDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3AgPSBvdGYuZ2V0VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhdXRvIGlwcm90ID0gaXBmLmdldFByb3RvY29sKGlwKTsKKyAgICAgICAgICBpcHJvdF8gPSBjYXN0KElQcm90KWlwcm90OworICAgICAgICAgIGVuZm9yY2UoaXByb3RfLCBuZXcgVEV4Y2VwdGlvbih0ZXh0KCJJbnB1dCBwcm90b2NvbCBub3Qgb2YgdGhlICIgfgorICAgICAgICAgICAgInNwZWNpZmllZCBjb25jcmV0ZSB0eXBlICgiLCBJUHJvdC5zdHJpbmdvZiwgIikuIikpKTsKKworICAgICAgICAgIGF1dG8gb3Byb3QgPSBvcGYuZ2V0UHJvdG9jb2wob3ApOworICAgICAgICAgIG9wcm90XyA9IGNhc3QoT1Byb3Qpb3Byb3Q7CisgICAgICAgICAgZW5mb3JjZShvcHJvdF8sIG5ldyBURXhjZXB0aW9uKHRleHQoIk91dHB1dCBwcm90b2NvbCBub3Qgb2YgdGhlICIgfgorICAgICAgICAgICAgInNwZWNpZmllZCBjb25jcmV0ZSB0eXBlICgiLCBPUHJvdC5zdHJpbmdvZiwgIikuIikpKTsKKworICAgICAgICAgIGNsaWVudF8gPSBuZXcgdHlwZW9mKGNsaWVudF8pKGlwcm90Xywgb3Byb3RfKTsKKyAgICAgICAgfQorCisgICAgICAgIG92ZXJyaWRlIFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgICAgICAgIHJldHVybiB0cmFuc3BvcnRfOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnRfOworICAgICAgICBwcm90ZWN0ZWQgSVByb3QgaXByb3RfOworICAgICAgICBwcm90ZWN0ZWQgT1Byb3Qgb3Byb3RfOworICAgICAgICBwcml2YXRlIFRDbGllbnQhKEludGVyZmFjZSwgSVByb3QsIE9Qcm90KSBjbGllbnRfOworICAgICAgfTsKKyAgICB9CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOworICAgICAgRmlsdGVyTWV0aG9kTmFtZXMhKEludGVyZmFjZSwgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIEludGVyZmFjZSkpCisgICAgKSB7CisgICAgICBzdHJpbmdbXSBwYXJhbUxpc3Q7CisgICAgICBzdHJpbmdbXSBwYXJhbU5hbWVzOworICAgICAgZm9yZWFjaCAoaSwgXzsgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpIHsKKyAgICAgICAgaW1tdXRhYmxlIHBhcmFtTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgICBpbW11dGFibGUgc3RvcmFnZSA9IFBhcmFtZXRlclN0b3JhZ2VDbGFzc1R1cGxlISgKKyAgICAgICAgICBtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSlbaV07CisKKyAgICAgICAgcGFyYW1MaXN0IH49ICgoc3RvcmFnZSAmIFBhcmFtZXRlclN0b3JhZ2VDbGFzcy5yZWZfKSA/ICJyZWYgIiA6ICIiKSB+CisgICAgICAgICAgIlBhcmFtZXRlclR5cGVUdXBsZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4gIilbIiB+CisgICAgICAgICAgdG8hc3RyaW5nKGkpIH4gIl0gIiB+IHBhcmFtTmFtZTsKKyAgICAgICAgcGFyYW1OYW1lcyB+PSBwYXJhbU5hbWU7CisgICAgICB9CisgICAgICBwYXJhbUxpc3Qgfj0gIlRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCI7CisKKyAgICAgIGltbXV0YWJsZSByZXR1cm5UeXBlQ29kZSA9ICJSZXR1cm5UeXBlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKSI7CisgICAgICBjb2RlIH49ICJURnV0dXJlISgiIH4gcmV0dXJuVHlwZUNvZGUgfiAiKSAiIH4gbWV0aG9kTmFtZSB+ICIoIiB+CisgICAgICAgIGN0ZmVKb2luKHBhcmFtTGlzdCkgfiAiKSB7XG4iOworCisgICAgICAvLyBDcmVhdGUgdGhlIGZ1dHVyZSBpbnN0YW5jZSB0aGF0IHdpbGwgcmVwZXNlbnQgdGhlIHJlc3VsdC4KKyAgICAgIGNvZGUgfj0gImF1dG8gcHJvbWlzZSA9IG5ldyBUUHJvbWlzZSEoIiB+IHJldHVyblR5cGVDb2RlIH4gIik7XG4iOworCisgICAgICAvLyBQcmVwYXJlIGRlbGVnYXRlIHdoaWNoIGV4ZWN1dGVzIHRoZSBUQ2xpZW50IG1ldGhvZCBjYWxsLgorICAgICAgY29kZSB+PSAiYXV0byB3b3JrID0ge1xuIjsKKyAgICAgIGNvZGUgfj0gInRyeSB7XG4iOworICAgICAgY29kZSB+PSAic3RhdGljIGlmIChpcyhSZXR1cm5UeXBlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKSA9PSB2b2lkKSkge1xuIjsKKyAgICAgIGNvZGUgfj0gImNsaWVudF8uIiB+IG1ldGhvZE5hbWUgfiAiKCIgfiBjdGZlSm9pbihwYXJhbU5hbWVzKSB+ICIpO1xuIjsKKyAgICAgIGNvZGUgfj0gInByb21pc2Uuc3VjY2VlZCgpO1xuIjsKKyAgICAgIGNvZGUgfj0gIn0gZWxzZSB7XG4iOworICAgICAgY29kZSB+PSAiYXV0byByZXN1bHQgPSBjbGllbnRfLiIgfiBtZXRob2ROYW1lIH4gIigiIH4KKyAgICAgICAgY3RmZUpvaW4ocGFyYW1OYW1lcykgfiAiKTtcbiI7CisgICAgICBjb2RlIH49ICJwcm9taXNlLnN1Y2NlZWQocmVzdWx0KTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgY29kZSB+PSAifSBjYXRjaCAoRXhjZXB0aW9uIGUpIHtcbiI7CisgICAgICBjb2RlIH49ICJwcm9taXNlLmZhaWwoZSk7XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIGNvZGUgfj0gIn07XG4iOworCisgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyBjYW5jZWxsZWQsIHNldCB0aGUgcmVzdWx0IHByb21pc2UgdG8gY2FuY2VsbGVkCisgICAgICAvLyBhcyB3ZWxsLiBUaGlzIGNvdWxkIGJlIG1vdmVkIGludG8gYW4gYWRkaXRpb25hbCBUQXN5bmNXb3JrSXRlbQorICAgICAgLy8gZGVsZWdhdGUgcGFyYW1ldGVyLgorICAgICAgY29kZSB+PSBxeworICAgICAgICBpZiAoY2FuY2VsbGF0aW9uKSB7CisgICAgICAgICAgY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcuYWRkQ2FsbGJhY2soeworICAgICAgICAgICAgcHJvbWlzZS5jYW5jZWwoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgLy8gRW5xdWV1ZSB0aGUgd29yayBpdGVtIGFuZCBpbW1lZGlhdGVseSByZXR1cm4gdGhlIHByb21pc2UgKHJlc3AuIGl0cworICAgICAgLy8gZnV0dXJlIGludGVyZmFjZSkuCisgICAgICBjb2RlIH49ICJ0cmFuc3BvcnRfLmFzeW5jTWFuYWdlci5leGVjdXRlKHRyYW5zcG9ydF8sIHdvcmssIGNhbmNlbGxhdGlvbik7XG4iOworICAgICAgY29kZSB+PSAicmV0dXJuIHByb21pc2U7XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKworICAgIH0KKworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50X3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnRfcG9vbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2I5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50X3Bvb2wuZApAQCAtMCwwICsxLDkwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgYXN5bmNocm9ub3VzbHkgcXVlcnlpbmcgbXVsdGlwbGUgc2VydmVycywgYnVpbGRpbmcgb24KKyAqIFRBc3luY0NsaWVudC4KKyAqCisgKiBUZXJtaW5vbG9neSBub3RlOiBUaGUgbmFtZXMgb2YgdGhlIGFydGlmYWN0cyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIGFyZQorICogICBkZXJpdmVkIGZyb20gwrtjbGllbnQgcG9vbMKrLCBiZWNhdXNlIHRoZXkgb3BlcmF0ZSBvbiBhIHBvb2wgb2YKKyAqICAgVEFzeW5jQ2xpZW50cy4gSG93ZXZlciwgZnJvbSBhIGFyY2hpdGVjdHVyYWwgcG9pbnQgb2YgdmlldywgdGhleSBvZnRlbgorICogICByZXByZXNlbnQgYSBwb29sIG9mIGhvc3RzIGEgVGhyaWZ0IGNsaWVudCBhcHBsaWNhdGlvbiBjb21tdW5pY2F0ZXMgd2l0aAorICogICB1c2luZyBSUEMgY2FsbHMuCisgKi8KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnRfcG9vbDsKKworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtYXA7CitpbXBvcnQgc3RkLmFycmF5IDogYXJyYXksIGVtcHR5OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC50cmFpdHMgOiBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQudXRpbC5hd2FpdGFibGU7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworaW1wb3J0IHRocmlmdC51dGlsLmZ1dHVyZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwucmVzb3VyY2VfcG9vbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyBjbGllbnQgcG9vbCB3aGljaCBpbXBsZW1lbnRzIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlCisgKiB1c2luZyBtdWx0aXBsZSBUQXN5bmNDbGllbnRzLgorICovCitpbnRlcmZhY2UgVEFzeW5jQ2xpZW50UG9vbEJhc2UoSW50ZXJmYWNlKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgOgorICBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZQoreworICAvLy8gU2hvcnRoYW5kIGZvciB0aGUgY2xpZW50IHR5cGUgdGhpcyBwb29sIG9wZXJhdGVzIG9uLgorICBhbGlhcyBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZSBDbGllbnQ7CisKKyAgLyoqCisgICAqIEFkZHMgYSBjbGllbnQgdG8gdGhlIHBvb2wuCisgICAqLworICB2b2lkIGFkZENsaWVudChDbGllbnQgY2xpZW50KTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIGNsaWVudCBmcm9tIHRoZSBwb29sLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSBjbGllbnQgd2FzIGZvdW5kIGluIHRoZSBwb29sLgorICAgKi8KKyAgYm9vbCByZW1vdmVDbGllbnQoQ2xpZW50IGNsaWVudCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBleGNlcHRpb24gY29tZXMgZnJvbSBhIGNsaWVudCBmcm9tIHRoZQorICAgKiBwb29sIG5vdCB3b3JraW5nIHByb3Blcmx5LCBvciBpZiBpdCBhbiBleGNlcHRpb24gdGhyb3duIGF0IHRoZQorICAgKiBhcHBsaWNhdGlvbiBsZXZlbC4KKyAgICoKKyAgICogSWYgdGhlIGRlbGVnYXRlIHJldHVybnMgdHJ1ZSwgdGhlIHNlcnZlci9jb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAgICogYXQgZmF1bHQsIGlmIGl0IHJldHVybnMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMganVzdCBwYXNzZWQgb24gdG8gdGhlCisgICAqIGNhbGxlci4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgcmV0dXJucyB0cnVlIGZvciBpbnN0YW5jZXMgb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhbmQKKyAgICogVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXIoKSBjb25zdCBAcHJvcGVydHk7CisgIHZvaWQgcnBjRmF1bHRGaWx0ZXIoYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pKSBAcHJvcGVydHk7IC8vLyBEaXR0bworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0cyBvZiBhIGNsaWVudCBiZWZvcmUgdHJ5aW5nIHRvCisgICAqIGV4ZWN1dGUgYSBtZXRob2QgaWYgdGhleSBhcmUgbm90IG9wZW4uIFRoaXMgaXMgdXN1YWxseSBkZXNpcmFibGUKKyAgICogYmVjYXVzZSBpdCBhbGxvd3MgZS5nLiB0byBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCB0byBhIHJlbW90ZSBzZXJ2ZXIKKyAgICogaWYgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBkcm9wcGVkLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgKi8KKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzKCkgY29uc3QgQHByb3BlcnR5OworICB2b2lkIHJlb3BlblRyYW5zcG9ydHMoYm9vbCkgQHByb3BlcnR5OyAvLy8gRGl0dG8KK30KKworaW1tdXRhYmxlIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBkZWZhdWx0UnBjRmF1bHRGaWx0ZXI7CitzdGF0aWMgdGhpcygpIHsKKyAgZGVmYXVsdFJwY0ZhdWx0RmlsdGVyID0gKEV4Y2VwdGlvbiBlKSB7CisgICAgaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworICAgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisgICAgcmV0dXJuICgKKyAgICAgIChjYXN0KFRUcmFuc3BvcnRFeGNlcHRpb24pZSAhaXMgbnVsbCkgfHwKKyAgICAgIChjYXN0KFRBcHBsaWNhdGlvbkV4Y2VwdGlvbillICFpcyBudWxsKQorICAgICk7CisgIH07Cit9CisKKy8qKgorICogQSBUQXN5bmNDbGllbnRQb29sQmFzZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBxdWVyaWVzIG11bHRpcGxlIHNlcnZlcnMgaW4gYQorICogcm93IHVudGlsIGEgcmVxdWVzdCBzdWNjZWVkcywgdGhlIHJlc3VsdCBvZiB3aGljaCBpcyB0aGVuIHJldHVybmVkLgorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIMK7c3VjY2Vzc8KrIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBycGNGYXVsdEZpbHRlcigpCisgKiBkZWxlZ2F0ZSBwcm9wZXJ0eS4gSWYgaXQgaXMgbm9uLW51bGwgYW5kIGNhbGxpbmcgaXQgZm9yIGFuIGV4Y2VwdGlvbiBzZXQgYnkKKyAqIGEgZmFpbGVkIG1ldGhvZCBpbnZvY2F0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGVycm9yIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAqIGNhdXNlZCBieSB0aGUgUlBDIGxheWVyIHJhdGhlciB0aGFuIHRoZSBhcHBsaWNhdGlvbiBsYXllciwgYW5kIHRoZSBuZXh0CisgKiBzZXJ2ZXIgaW4gdGhlIHBvb2wgaXMgdHJpZWQuIElmIHRoZXJlIGFyZSBubyBtb3JlIGNsaWVudHMgdG8gdHJ5LCB0aGUKKyAqIG9wZXJhdGlvbiBpcyBtYXJrZWQgYXMgZmFpbGVkIHdpdGggYSBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24uCisgKgorICogSWYgYSBUQXN5bmNDbGllbnQgaW4gdGhlIHBvb2wgZmFpbHMgd2l0aCBhbiBSUEMgZXhjZXB0aW9uIGZvciBhIG51bWJlciBvZgorICogY29uc2VjdXRpdmUgdHJpZXMsIGl0IGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkIChub3QgdHJpZWQgYW55IGxvbmdlcikgZm9yCisgKiBhIGNlcnRhaW4gZHVyYXRpb24uIEJvdGggdGhlIGxpbWl0IGFuZCB0aGUgdGltZW91dCBjYW4gYmUgY29uZmlndXJlZC4gSWYgYWxsCisgKiBjbGllbnRzIGZhaWwgKGFuZCBrZWVwVHJ5aW5nIGlzIGZhbHNlKSwgdGhlIG9wZXJhdGlvbiBmYWlscyB3aXRoIGEKKyAqIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiB3aGljaCBjb250YWlucyB0aGUgY29sbGVjdGVkIFJQQyBleGNlcHRpb25zLgorICovCitmaW5hbCBjbGFzcyBUQXN5bmNDbGllbnRQb29sKEludGVyZmFjZSkgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEFzeW5jQ2xpZW50UG9vbEJhc2UhSW50ZXJmYWNlCit7CisgIC8vLworICB0aGlzKENsaWVudFtdIGNsaWVudHMpIHsKKyAgICBwb29sXyA9IG5ldyBUUmVzb3VyY2VQb29sIUNsaWVudChjbGllbnRzKTsKKyAgICBycGNGYXVsdEZpbHRlcl8gPSBkZWZhdWx0UnBjRmF1bHRGaWx0ZXI7CisgICAgcmVvcGVuVHJhbnNwb3J0c18gPSB0cnVlOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgYWRkQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICBwb29sXy5hZGQoY2xpZW50KTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgcmV0dXJuIHBvb2xfLnJlbW92ZShjbGllbnQpOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8ga2VlcCB0cnlpbmcgdG8gZmluZCBhIHdvcmtpbmcgY2xpZW50IGlmIGFsbCBoYXZlIGZhaWxlZCBpbiBhCisgICAqIHJvdy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAqLworICBib29sIGtlZXBUcnlpbmcoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5jeWNsZTsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGtlZXBUcnlpbmcoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5jeWNsZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIGEgcmFuZG9tIHBlcm11dGF0aW9uIG9mIHRoZSBjbGllbnQgcG9vbCBvbiBldmVyeSBjYWxsIHRvCisgICAqIGV4ZWN1dGUoKS4gVGhpcyBjYW4gYmUgdXNlZCBlLmcuIGFzIGEgc2ltcGxlIGZvcm0gb2YgbG9hZCBiYWxhbmNpbmcuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAqLworICBib29sIHBlcm11dGVDbGllbnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8ucGVybXV0ZTsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHBlcm11dGVDbGllbnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8ucGVybXV0ZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZmF1bHRzIGFmdGVyIHdoaWNoIGEgY2xpZW50IGlzIGRpc2FibGVkIHVudGlsCisgICAqIGZhdWx0RGlzYWJsZUR1cmF0aW9uIGhhcyBwYXNzZWQuIDAgdG8gbmV2ZXIgZGlzYWJsZSBjbGllbnRzLgorICAgKgorICAgKiBEZWZhdWx0cyB0byAwLgorICAgKi8KKyAgdXNob3J0IGZhdWx0RGlzYWJsZUNvdW50KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uZmF1bHREaXNhYmxlQ291bnQ7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBmYXVsdERpc2FibGVDb3VudCh1c2hvcnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uZmF1bHREaXNhYmxlQ291bnQgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZHVyYXRpb24gZm9yIHdoaWNoIGEgY2xpZW50IGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGFmdGVyIGl0IGhhcworICAgKiBmYWlsZWQgdG9vIG9mdGVuLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBvbmUgc2Vjb25kLgorICAgKi8KKyAgRHVyYXRpb24gZmF1bHREaXNhYmxlRHVyYXRpb24oKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5mYXVsdERpc2FibGVEdXJhdGlvbjsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGZhdWx0RGlzYWJsZUR1cmF0aW9uKER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gdmFsdWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcnBjRmF1bHRGaWx0ZXJfOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgcnBjRmF1bHRGaWx0ZXIoYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IHZhbHVlOworICB9CisKKyAgLytvdmVycmlkZSsvIGJvb2wgcmVvcGVuVHJhbnNwb3J0cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJlb3BlblRyYW5zcG9ydHNfOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgcmVvcGVuVHJhbnNwb3J0cyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJlb3BlblRyYW5zcG9ydHNfID0gdmFsdWU7CisgIH0KKworICBtaXhpbihmYWxsYmFja1Bvb2xGb3J3YXJkQ29kZSFJbnRlcmZhY2UoKSk7CisKK3Byb3RlY3RlZDoKKyAgLy8gVGhlIGFjdHVhbCB3b3JrZXIgaW1wbGVtZW50YXRpb24gdG8gd2hpY2ggUlBDIG1ldGhvZCBjYWxscyBhcmUgZm9yd2FyZGVkLgorICBhdXRvIGV4ZWN1dGVPblBvb2woc3RyaW5nIG1ldGhvZCwgQXJncy4uLikoQXJncyBhcmdzLAorICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uCisgICkgeworICAgIGF1dG8gY2xpZW50cyA9IHBvb2xfW107CisgICAgaWYgKGNsaWVudHMuZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJObyBjbGllbnRzIGF2YWlsYWJsZSB0byB0cnkuIik7CisgICAgfQorCisgICAgYXV0byBwcm9taXNlID0gbmV3IFRQcm9taXNlIShSZXR1cm5UeXBlIShNZW1iZXJUeXBlIShJbnRlcmZhY2UsIG1ldGhvZCkpKTsKKyAgICBFeGNlcHRpb25bXSBycGNFeGNlcHRpb25zOworCisgICAgdm9pZCB0cnlOZXh0KCkgeworICAgICAgd2hpbGUgKGNsaWVudHMuZW1wdHkpIHsKKyAgICAgICAgQ2xpZW50IG5leHQ7CisgICAgICAgIER1cmF0aW9uIHdhaXRUaW1lOworICAgICAgICBpZiAoY2xpZW50cy53aWxsQmVjb21lTm9uZW1wdHkobmV4dCwgd2FpdFRpbWUpKSB7CisgICAgICAgICAgaWYgKHdhaXRUaW1lID4gZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICBpZiAod2FpdFRpbWUgPCBkdXIhInVzZWNzIigxMCkpIHsKKyAgICAgICAgICAgICAgaW1wb3J0IGNvcmUudGhyZWFkOworICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbmV4dC50cmFuc3BvcnQuYXN5bmNNYW5hZ2VyLmRlbGF5KHdhaXRUaW1lLCB7IHRyeU5leHQoKTsgfSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJvbWlzZS5mYWlsKG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oIkFsbCBjbGllbnRzIGZhaWxlZC4iLAorICAgICAgICAgICAgcnBjRXhjZXB0aW9ucykpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBhdXRvIGNsaWVudCA9IGNsaWVudHMuZnJvbnQ7CisgICAgICBjbGllbnRzLnBvcEZyb250OworCisgICAgICBpZiAocmVvcGVuVHJhbnNwb3J0cykgeworICAgICAgICBpZiAoIWNsaWVudC50cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBwb29sXy5yZWNvcmRGYXVsdChjbGllbnQpOworICAgICAgICAgICAgdHJ5TmV4dCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBhdXRvIGZ1dHVyZSA9IG1peGluKCJjbGllbnQuIiB+IG1ldGhvZCkoYXJncywgY2FuY2VsbGF0aW9uKTsKKyAgICAgIGZ1dHVyZS5jb21wbGV0aW9uLmFkZENhbGxiYWNrKHsKKyAgICAgICAgaWYgKGZ1dHVyZS5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHsKKyAgICAgICAgICBwcm9taXNlLmNhbmNlbCgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gZSA9IGZ1dHVyZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGUpIHsKKyAgICAgICAgICBpZiAocnBjRmF1bHRGaWx0ZXJfICYmIHJwY0ZhdWx0RmlsdGVyXyhlKSkgeworICAgICAgICAgICAgcG9vbF8ucmVjb3JkRmF1bHQoY2xpZW50KTsKKyAgICAgICAgICAgIHJwY0V4Y2VwdGlvbnMgfj0gZTsKKyAgICAgICAgICAgIHRyeU5leHQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcG9vbF8ucmVjb3JkU3VjY2VzcyhjbGllbnQpOworICAgICAgICBwcm9taXNlLmNvbXBsZXRlKGZ1dHVyZSk7CisgICAgICB9KTsKKyAgICB9CisKKyAgICB0cnlOZXh0KCk7CisgICAgcmV0dXJuIHByb21pc2U7CisgIH0KKworcHJpdmF0ZToKKyAgVFJlc291cmNlUG9vbCFDbGllbnQgcG9vbF87CisgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcl87CisgIGJvb2wgcmVvcGVuVHJhbnNwb3J0c187Cit9CisKKy8qKgorICogVEFzeW5jQ2xpZW50UG9vbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkCisgKiB1c2luZyBJRlRJIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXN0IDYwODIpKS4KKyAqLworVEFzeW5jQ2xpZW50UG9vbCFJbnRlcmZhY2UgdEFzeW5jQ2xpZW50UG9vbChJbnRlcmZhY2UpKAorICBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZVtdIGNsaWVudHMKKykgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgcmV0dXJuIG5ldyB0eXBlb2YocmV0dXJuKShjbGllbnRzKTsKK30KKworcHJpdmF0ZSB7CisgIC8vIENhbm5vdCB1c2UgYW4gYW5vbnltb3VzIGRlbGVnYXRlIGxpdGVyYWwgZm9yIHRoaXMgYmVjYXVzZSB0aGV5IGFyZW4ndAorICAvLyBhbGxvd2VkIGluIGNsYXNzIHNjb3BlLgorICBzdHJpbmcgZmFsbGJhY2tQb29sRm9yd2FyZENvZGUoSW50ZXJmYWNlKSgpIHsKKyAgICBzdHJpbmcgY29kZSA9ICIiOworCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgQWxsTWVtYmVyTWV0aG9kTmFtZXMhSW50ZXJmYWNlKSB7CisgICAgICBlbnVtIHFuID0gIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZTsKKyAgICAgIGNvZGUgfj0gIlRGdXR1cmUhKFJldHVyblR5cGUhKCIgfiBxbiB+ICIpKSAiIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIoUGFyYW1ldGVyVHlwZVR1cGxlISgiIH4gcW4gfiAiKSBhcmdzLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHtcbiI7CisgICAgICBjb2RlIH49ICJyZXR1cm4gZXhlY3V0ZU9uUG9vbCEoYCIgfiBtZXRob2ROYW1lIH4gImApKGFyZ3MsIGNhbmNlbGxhdGlvbik7XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKKyAgfQorfQorCisvKioKKyAqIEEgVEFzeW5jQ2xpZW50UG9vbEJhc2UgaW1wbGVtZW50YXRpb24gd2hpY2ggcXVlcmllcyBtdWx0aXBsZSBzZXJ2ZXJzIGF0CisgKiB0aGUgc2FtZSB0aW1lIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBzdWNjZXNzIHJlc3BvbnNlLgorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIMK7c3VjY2Vzc8KrIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBycGNGYXVsdEZpbHRlcigpCisgKiBkZWxlZ2F0ZSBwcm9wZXJ0eS4gSWYgaXQgaXMgbm9uLW51bGwgYW5kIGNhbGxpbmcgaXQgZm9yIGFuIGV4Y2VwdGlvbiBzZXQgYnkKKyAqIGEgZmFpbGVkIG1ldGhvZCBpbnZvY2F0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGVycm9yIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAqIGNhdXNlZCBieSB0aGUgUlBDIGxheWVyIHJhdGhlciB0aGFuIHRoZSBhcHBsaWNhdGlvbiBsYXllciwgYW5kIHRoZSBuZXh0CisgKiBzZXJ2ZXIgaW4gdGhlIHBvb2wgaXMgdHJpZWQuIElmIGFsbCBjbGllbnRzIGZhaWwsIHRoZSBvcGVyYXRpb24gaXMgbWFya2VkCisgKiBhcyBmYWlsZWQgd2l0aCBhIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAqLworZmluYWwgY2xhc3MgVEFzeW5jRmFzdGVzdENsaWVudFBvb2woSW50ZXJmYWNlKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQXN5bmNDbGllbnRQb29sQmFzZSFJbnRlcmZhY2UKK3sKKyAgLy8vCisgIHRoaXMoQ2xpZW50W10gY2xpZW50cykgeworICAgIGNsaWVudHNfID0gY2xpZW50czsKKyAgICBycGNGYXVsdEZpbHRlcl8gPSBkZWZhdWx0UnBjRmF1bHRGaWx0ZXI7CisgICAgcmVvcGVuVHJhbnNwb3J0c18gPSB0cnVlOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgYWRkQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICBjbGllbnRzXyB+PSBjbGllbnQ7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCByZW1vdmVDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIGF1dG8gb2xkTGVuZ3RoID0gY2xpZW50c18ubGVuZ3RoOworICAgIGNsaWVudHNfID0gcmVtb3ZlRXF1YWwoY2xpZW50c18sIGNsaWVudCk7CisgICAgcmV0dXJuIGNsaWVudHNfLmxlbmd0aCA8IG9sZExlbmd0aDsKKyAgfQorCisKKyAgLytvdmVycmlkZSsvIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcigpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJwY0ZhdWx0RmlsdGVyXzsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIHJwY0ZhdWx0RmlsdGVyKGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBycGNGYXVsdEZpbHRlcl8gPSB2YWx1ZTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrL2Jvb2wgcmVvcGVuVHJhbnNwb3J0cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJlb3BlblRyYW5zcG9ydHNfOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgcmVvcGVuVHJhbnNwb3J0cyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJlb3BlblRyYW5zcG9ydHNfID0gdmFsdWU7CisgIH0KKworICBtaXhpbihmYXN0ZXN0UG9vbEZvcndhcmRDb2RlIUludGVyZmFjZSgpKTsKKworcHJpdmF0ZToKKyAgQ2xpZW50W10gY2xpZW50c187CisgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcl87CisgIGJvb2wgcmVvcGVuVHJhbnNwb3J0c187Cit9CisKKy8qKgorICogVEFzeW5jRmFzdGVzdENsaWVudFBvb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseQorICogc3BlY2lmeSB0aGUgaW50ZXJmYWNlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZAorICogdXNpbmcgSUZUSSAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWVzdCA2MDgyKSkuCisgKi8KK1RBc3luY0Zhc3Rlc3RDbGllbnRQb29sIUludGVyZmFjZSB0QXN5bmNGYXN0ZXN0Q2xpZW50UG9vbChJbnRlcmZhY2UpKAorICBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZVtdIGNsaWVudHMKKykgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgcmV0dXJuIG5ldyB0eXBlb2YocmV0dXJuKShjbGllbnRzKTsKK30KKworcHJpdmF0ZSB7CisgIC8vIENhbm5vdCB1c2UgYW4gYW5vbnltb3VzIGRlbGVnYXRlIGxpdGVyYWwgZm9yIHRoaXMgYmVjYXVzZSB0aGV5IGFyZW4ndAorICAvLyBhbGxvd2VkIGluIGNsYXNzIHNjb3BlLgorICBzdHJpbmcgZmFzdGVzdFBvb2xGb3J3YXJkQ29kZShJbnRlcmZhY2UpKCkgeworICAgIHN0cmluZyBjb2RlID0gIiI7CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBBbGxNZW1iZXJNZXRob2ROYW1lcyFJbnRlcmZhY2UpIHsKKyAgICAgIGVudW0gcW4gPSAiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lOworICAgICAgY29kZSB+PSAiVEZ1dHVyZSEoUmV0dXJuVHlwZSEoIiB+IHFuIH4gIikpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIihQYXJhbWV0ZXJUeXBlVHVwbGUhKCIgfiBxbiB+ICIpIGFyZ3MsICIgfgorICAgICAgICAiVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7XG4iOworICAgICAgY29kZSB+PSAiZW51bSBtZXRob2ROYW1lID0gYCIgfiBtZXRob2ROYW1lIH4gImA7XG4iOworICAgICAgY29kZSB+PSBxeworICAgICAgICBhbGlhcyBSZXR1cm5UeXBlIShNZW1iZXJUeXBlIShJbnRlcmZhY2UsIG1ldGhvZE5hbWUpKSBSZXN1bHRUeXBlOworCisgICAgICAgIGF1dG8gY2hpbGRDYW5jZWxsYXRpb24gPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKworICAgICAgICBURnV0dXJlIVJlc3VsdFR5cGVbXSBmdXR1cmVzOworICAgICAgICBmdXR1cmVzLnJlc2VydmUoY2xpZW50c18ubGVuZ3RoKTsKKworICAgICAgICBmb3JlYWNoIChjOyBjbGllbnRzXykgeworICAgICAgICAgIGlmIChyZW9wZW5UcmFuc3BvcnRzKSB7CisgICAgICAgICAgICBpZiAoIWMudHJhbnNwb3J0LmlzT3BlbikgeworICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGMudHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBmdXR1cmVzIH49IG1peGluKCJjLiIgfiBtZXRob2ROYW1lKShhcmdzLCBjaGlsZENhbmNlbGxhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEZhc3Rlc3RQb29sSm9iIShSZXN1bHRUeXBlKSgKKyAgICAgICAgICBmdXR1cmVzLCBycGNGYXVsdEZpbHRlciwgY2FuY2VsbGF0aW9uLCBjaGlsZENhbmNlbGxhdGlvbik7CisgICAgICB9OworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKKyAgfQorCisgIGZpbmFsIGNsYXNzIEZhc3Rlc3RQb29sSm9iKFJlc3VsdCkgOiBURnV0dXJlIVJlc3VsdCB7CisgICAgdGhpcyhURnV0dXJlIVJlc3VsdFtdIHBvb2xGdXR1cmVzLCBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXIsCisgICAgICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiwgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbgorICAgICkgeworICAgICAgcmVzdWx0UHJvbWlzZV8gPSBuZXcgVFByb21pc2UhUmVzdWx0OworICAgICAgcG9vbEZ1dHVyZXNfID0gcG9vbEZ1dHVyZXM7CisgICAgICBycGNGYXVsdEZpbHRlcl8gPSBycGNGYXVsdEZpbHRlcjsKKyAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXyA9IGNoaWxkQ2FuY2VsbGF0aW9uOworCisgICAgICBmb3JlYWNoIChmdXR1cmU7IHBvb2xGdXR1cmVzKSB7CisgICAgICAgIGZ1dHVyZS5jb21wbGV0aW9uLmFkZENhbGxiYWNrKHsKKyAgICAgICAgICBhdXRvIGYgPSBmdXR1cmU7CisgICAgICAgICAgcmV0dXJuIHsgY29tcGxldGlvbkNhbGxiYWNrKGYpOyB9OworICAgICAgICB9KCkpOworICAgICAgICBpZiAoZnV0dXJlLnN0YXR1cyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpIHsKKyAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBmdXR1cmUgaXMgYWxyZWFkeSBjb21wbGV0ZWQsIHdlIGFyZSBkb25lLCBkb24ndAorICAgICAgICAgIC8vIGJvdGhlciBhZGRpbmcgY2FsbGJhY2tzIGZvciB0aGUgb3RoZXJzICh0aGV5IHdvdWxkIGp1c3QgcmV0dXJuCisgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBsb2NrKS4KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNhbmNlbGxhdGlvbikgeworICAgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcmluZy5hZGRDYWxsYmFjayh7CisgICAgICAgICAgcmVzdWx0UHJvbWlzZV8uY2FuY2VsKCk7CisgICAgICAgICAgY2hpbGRDYW5jZWxsYXRpb24udHJpZ2dlcigpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBURnV0dXJlU3RhdHVzIHN0YXR1cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZV8uc3RhdHVzOworICAgIH0KKworICAgIFRBd2FpdGFibGUgY29tcGxldGlvbigpIEBwcm9wZXJ0eSB7CisgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZV8uY29tcGxldGlvbjsKKyAgICB9CisKKyAgICBSZXN1bHQgZ2V0KCkgeworICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2VfLmdldCgpOworICAgIH0KKworICAgIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZV8uZ2V0RXhjZXB0aW9uKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBjb21wbGV0aW9uQ2FsbGJhY2soVEZ1dHVyZSFSZXN1bHQgZnV0dXJlKSB7CisgICAgICBzeW5jaHJvbml6ZWQgeworICAgICAgICBpZiAoZnV0dXJlLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgeworICAgICAgICAgIGFzc2VydChyZXN1bHRQcm9taXNlXy5zdGF0dXMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0UHJvbWlzZV8uc3RhdHVzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORykgeworICAgICAgICAgIC8vIFRoZSBvcGVyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuIFRoaXMgY2FuIGhhcHBlbiBpZgorICAgICAgICAgIC8vIGFub3RoZXIgY2xpZW50IGNvbXBsZXRlZCBmaXJzdCwgYnV0IHRoaXMgY2FsbGJhY2sgd2FzIGFscmVhZHkKKyAgICAgICAgICAvLyB3YWl0aW5nIGZvciB0aGUgbG9jayB3aGVuIGl0IGNhbGxlZCBjYW5jZWwoKS4KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnV0dXJlLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkZBSUxFRCkgeworICAgICAgICAgIGF1dG8gZSA9IGZ1dHVyZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICBpZiAocnBjRmF1bHRGaWx0ZXJfICYmIHJwY0ZhdWx0RmlsdGVyXyhlKSkgeworICAgICAgICAgICAgcnBjRXhjZXB0aW9uc18gfj0gZTsKKworICAgICAgICAgICAgaWYgKHJwY0V4Y2VwdGlvbnNfLmxlbmd0aCA9PSBwb29sRnV0dXJlc18ubGVuZ3RoKSB7CisgICAgICAgICAgICAgIHJlc3VsdFByb21pc2VfLmZhaWwobmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQWxsIGNoaWxkIG9wZXJhdGlvbnMgZmFpbGVkLCB1bmFibGUgdG8gcmV0cmlldmUgYSByZXN1bHQuIiwKKyAgICAgICAgICAgICAgICBycGNFeGNlcHRpb25zXworICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSByZXN1bHQgdG8gdGhlIHRhcmdldCBwcm9taXNlLgorICAgICAgICByZXN1bHRQcm9taXNlXy5jb21wbGV0ZShmdXR1cmUpOworCisgICAgICAgIC8vIENhbmNlbCB0aGUgb3RoZXIgZnV0dXJlcywgd2Ugd291bGQganVzdCBkaXNjYXJkIHRoZWlyIHJlc3VsdHMuCisgICAgICAgIC8vIE5vdGU6IFdlIGRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZSBzdG9yZWQgdGhlIHJlc3VsdHMgdG8gb3VyIHByb21pc2UsCisgICAgICAgIC8vIHNlZSB0aGUgYXNzZXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgICBjaGlsZENhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICAgICAgfQorICAgIH0KKworICAgIFRQcm9taXNlIVJlc3VsdCByZXN1bHRQcm9taXNlXzsKKyAgICBURnV0dXJlIVJlc3VsdFtdIHBvb2xGdXR1cmVzXzsKKyAgICBFeGNlcHRpb25bXSBycGNFeGNlcHRpb25zXzsKKyAgICBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXJfOworICAgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb25fOworICB9Cit9CisKKy8qKgorICogQWxsb3dzIGVhc2lseSBhZ2dyZWdhdGluZyByZXN1bHRzIGZyb20gYSBudW1iZXIgb2YgVEFzeW5jQ2xpZW50cy4KKyAqCisgKiBDb250cmFyeSB0byBUQXN5bmN7RmFsbGJhY2ssIEZhc3Rlc3R9Q2xpZW50UG9vbCwgdGhpcyBjbGFzcyBkb2VzIG5vdAorICogc2ltcGx5IGltcGxlbWVudCBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZS4gSXQgbWFuYWdlcyBhIHBvb2wgb2YgY2xpZW50cywKKyAqIGJ1dCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIGN1c3RvbSBhY2N1bXVsYXRvciBmdW5jdGlvbiB0byB1c2Ugb3IgdG8KKyAqIGl0ZXJhdGUgb3ZlciB0aGUgcmVzdWx0cyB1c2luZyBhIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UuCisgKgorICogRm9yIGVhY2ggc2VydmljZSBtZXRob2QsIFRBc3luY0FnZ3JlZ2F0b3Igb2ZmZXJzIGEgbWV0aG9kCisgKiBhY2NlcHRpbmcgdGhlIHNhbWUgYXJndW1lbnRzLCBhbmQgYW4gb3B0aW9uYWwgVENhbmNlbGxhdGlvbiBpbnN0YW5jZSwganVzdAorICogbGlrZSB3aXRoIFRGdXR1cmVJbnRlcmZhY2UuIFRoZSByZXR1cm4gdHlwZSwgaG93ZXZlciwgaXMgYSBwcm94eSBvYmplY3QKKyAqIHRoYXQgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAqIC0tLQorICogLysrCisgKiAgKyBSZXR1cm5zIGEgdGhyaWZ0LnV0aWwuZnV0dXJlLlRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UgZm9yIHRoZSByZXN1bHRzIG9mCisgKiAgKyB0aGUgY2xpZW50IHBvb2wgbWV0aG9kIGludm9jYXRpb25zLgorICogICsKKyAqICArIFRoZSBbXSAoc2xpY2luZykgb3BlcmF0b3IgY2FuIGFsc28gYmUgdXNlZCB0byBvYnRhaW4gdGhlIHJhbmdlLgorICogICsKKyAqICArIFBhcmFtczoKKyAqICArICAgdGltZW91dCA9IEEgdGltZW91dCB0byBwYXNzIHRvIHRoZSBURnV0dXJlQWdncmVnYXRvclJhbmdlIGNvbnN0cnVjdG9yLAorICogICsgICAgIGRlZmF1bHRzIHRvIHplcm8gKG5vIHRpbWVvdXQpLgorICogICsvCisgKiBURnV0dXJlQWdncmVnYXRvclJhbmdlIVJldHVyblR5cGUgcmFuZ2UoRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSk7CisgKiBhdXRvIG9wU2xpY2UoKSB7IHJldHVybiByYW5nZSgpOyB9IC8vLyBEaXR0bworICoKKyAqIC8rKworICogICsgUmV0dXJucyBhIGZ1dHVyZSB0aGF0IGdhdGhlcnMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgY2xpZW50cyBpbiB0aGUgcG9vbAorICogICsgYW5kIGludm9rZXMgYSB1c2VyLXN1cHBsaWVkIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIG9uIHRoZW0sIHJldHVybmluZyBpdHMKKyAqICArIHJldHVybiB2YWx1ZSB0byB0aGUgY2xpZW50LgorICogICsKKyAqICArIEluIGFkZGl0aW9uIHRvIHRoZSBURnV0dXJlIUFjY3VtdWxhdGVkVHlwZSBpbnRlcmZhY2UgKHdoZXJlCisgKiAgKyBBY2N1bXVsYXRlZFR5cGUgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBhY2N1bXVsYXRvciBmdW5jdGlvbiksIHRoZQorICogICsgcmV0dXJuZWQgb2JqZWN0IGFsc28gb2ZmZXJzIHR3byBhZGRpdGlvbmFsIG1ldGhvZHMsIGZpbmlzaCgpIGFuZAorICogICsgZmluaXNoR2V0KCk6IEJ5IGRlZmF1bHQsIHRoZSBhY2N1bXVsYXRvciBmdW5jdGlvbnMgaXMgY2FsbGVkIGFmdGVyIGFsbAorICogICsgdGhlIHJlc3VsdHMgZnJvbSB0aGUgcG9vbCBjbGllbnRzIGhhdmUgYmVjb21lIGF2YWlsYWJsZS4gQ2FsbGluZyBmaW5pc2goKQorICogICsgY2F1c2VzIHRoZSBhY2N1bXVsYXRvciBmdXR1cmUgdG8gc3RvcCB3YWl0aW5nIGZvciBvdGhlciByZXN1bHRzIGFuZAorICogICsgaW1tZWRpYXRlbHkgaW52b2tpbmcgdGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIG9uIHRoZSByZXN1bHRzIGN1cnJlbnRseQorICogICsgYXZhaWxhYmxlLiBJZiBhbGwgcmVzdWx0cyBhcmUgYWxyZWFkeSBhdmFpbGFibGUsIGZpbmlzaCgpIGlzIGEgbm8tb3AuCisgKiAgKyBmaW5pc2hHZXQoKSBpcyBhIGNvbnZlbmllbmNlIHNob3J0Y3V0IGZvciBjb21iaW5pbmcgaXQgd2l0aAorICogICsgYSBjYWxsIHRvIGdldCgpIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMsIGxpa2Ugd2FpdEdldCgpIGlzIGZvciB3YWl0KCkuCisgKiAgKworICogICsgVGhlIGFjYyBhbGlhcyBjYW4gcG9pbnQgdG8gYW55IGNhbGxhYmxlIGFjY2VwdGluZyBlaXRoZXIgYW4gYXJyYXkgb2YKKyAqICArIHJldHVybiB2YWx1ZXMgb3IgYW4gYXJyYXkgb2YgcmV0dXJuIHZhbHVlcyBhbmQgYW4gYXJyYXkgb2YgZXhjZXB0aW9uczsKKyAqICArIHNlZSBpc0FjY3VtdWxhdG9yISgpIGZvciBkZXRhaWxzLiBUaGUgZGVmYXVsdCBhY2N1bXVsYXRvciBjb25jYXRlbmF0ZXMKKyAqICArIHJldHVybiB2YWx1ZXMgdGhhdCBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggZWFjaCBvdGhlcnMgKGUuZy4gYXJyYXlzKSwKKyAqICArIGFuZCBzaW1wbHkgcmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMgb3RoZXJ3aXNlLCBmYWlsaW5nIHdpdGggYQorICogICsgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uIG5vIHZhbHVlcyB3ZXJlIHJldHVybmVkLgorICogICsKKyAqICArIFRoZSBhY2N1bXVsYXRvciBmdW5jdGlvbiBpcyBub3QgZXhlY3V0ZWQgaW4gYW55IG9mIHRoZSBhc3luYyBtYW5hZ2VyCisgKiAgKyB3b3JrZXIgdGhyZWFkcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzeW5jIGNsaWVudHMsIGJ1dCBpbnN0ZWFkIGl0IGlzCisgKiAgKyBpbnZva2VkIHdoZW4gdGhlIGFjdHVhbCByZXN1bHQgaXMgcmVxdWVzdGVkIGZvciB0aGUgZmlyc3QgdGltZSBhZnRlciB0aGUKKyAqICArIG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuIFRoaXMgYWxzbyBpbmNsdWRlcyBjaGVja2luZyB0aGUgc3RhdHVzCisgKiAgKyBvZiB0aGUgb3BlcmF0aW9uIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcsIHNpbmNlIHRoZSBhY2N1bXVsYXRvcgorICogICsgaGFzIHRvIGJlIHJ1biB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQuCisgKiAgKy8KKyAqIGF1dG8gYWNjdW11bGF0ZShhbGlhcyBhY2MgPSBkZWZhdWx0QWNjdW11bGF0b3IpKCkgaWYgKGlzQWNjdW11bGF0b3IhYWNjKTsKKyAqIC0tLQorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIC8vIFNvbWUgVGhyaWZ0IHNlcnZpY2UuCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgaW50IGZvbyhzdHJpbmcgbmFtZSk7CisgKiAgIGJ5dGVbXSBiYXIoKTsKKyAqIH0KKyAqCisgKiAvLyBDcmVhdGUgdGhlIGFnZ3JlZ2F0b3IgcG9vbCDigJMgY2xpZW50MCwgY2xpZW50MSwgY2xpZW50MiBhcmUgc29tZQorICogLy8gVEFzeW5jQ2xpZW50IUZvbyBpbnN0YW5jZXMsIGJ1dCBpbiB0aGVvcnkgY291bGQgYWxzbyBiZSBvdGhlcgorICogLy8gVEZ1dHVyZUludGVyZmFjZSFGb28gaW1wbGVtZW50YXRpb25zIChlLmcuIHNvbWUgYXN5bmMgY2xpZW50IHBvb2wpLgorICogYXV0byBwb29sID0gbmV3IFRBc3luY0FnZ3JlZ2F0b3IhRm9vKFtjbGllbnQwLCBjbGllbnQxLCBjbGllbnQyXSk7CisgKgorICogZm9yZWFjaCAodmFsOyBwb29sLmZvbygiYmF6IikucmFuZ2UoZHVyISJzZWNvbmRzIigxKSkpIHsKKyAqICAgLy8gUHJvY2VzcyBhbGwgdGhlIHJlc3VsdHMgdGhhdCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBhIHNlY29uZCBoYXMgcGFzc2VkLAorICogICAvLyBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuCisgKiAgIHdyaXRlbG4odmFsKTsKKyAqIH0KKyAqCisgKiBhdXRvIHN1bVJvb3RzID0gcG9vbC5mb28oImJheiIpLmFjY3VtdWxhdGUhKChpbnRbXSB2YWxzLCBFeGNlcHRpb25zW10gZXhzKXsKKyAqICAgaWYgKHZhbHMuZW1wdHkpIHsKKyAqICAgICB0aHJvdyBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKCJBbGwgY2xpZW50cyBmYWlsZWQiLCBleHMpOworICogICB9CisgKgorICogICAvLyBKdXN0IHRvIGlsbHVzdHJhdGUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIGNhbiBjaGFuZ2UsIGNvbnZlcnQgdGhlCisgKiAgIC8vIG51bWJlcnMgdG8gZG91YmxlIGFuZCBzdW0gdXAgdGhlaXIgcm9vdHMuCisgKiAgIGRvdWJsZSByZXN1bHQgPSAwOworICogICBmb3JlYWNoICh2OyB2YWxzKSByZXN1bHQgKz0gc3FydChjYXN0KGRvdWJsZSl2KTsKKyAqICAgcmV0dXJuIHJlc3VsdDsKKyAqIH0pKCk7CisgKgorICogLy8gV2FpdCB1cCB0byB0aHJlZSBzZWNvbmRzIGZvciB0aGUgcmVzdWx0LCBhbmQgdGhlbiBhY2N1bXVsYXRlIHdoYXQgaGFzCisgKiAvLyBhcnJpdmVkIHNvIGZhci4KKyAqIHN1bVJvb3RzLmNvbXBsZXRpb24ud2FpdChkdXIhInNlY29uZHMiKDMpKTsKKyAqIHdyaXRlbG4oc3VtUm9vdHMuZmluaXNoR2V0KCkpOworICoKKyAqIC8vIEZvciBzY2FsYXJzLCB0aGUgZGVmYXVsdCBhY2N1bXVsYXRvciByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSB2YWx1ZXMuCisgKiBwcmFnbWEobXNnLCB0eXBlb2YocG9vbC5mb28oIiIpLmFjY3VtdWxhdGUoKS5nZXQoKSk7IC8vIGludFtdLgorICoKKyAqIC8vIEZvciBsaXN0cywgZXRjLiwgaXQgY29uY2F0ZW5hdGVzIHRoZSByZXN1bHRzIHRvZ2V0aGVyLgorICogcHJhZ21hKG1zZywgdHlwZW9mKHBvb2wuYmFyKCkuYWNjdW11bGF0ZSgpLmdldCgpKSk7IC8vIGJ5dGVbXS4KKyAqIC0tLQorICoKKyAqIE5vdGU6IEZvciB0aGUgYWNjdW11bGF0ZSEoKSBpbnRlcmZhY2UsIHlvdSBtaWdodCBjdXJyZW50bHkgaGl0IGEgwrtjYW5ub3QgdXNlCisgKiBsb2NhbCAn4oCmJyBhcyBwYXJhbWV0ZXIgdG8gbm9uLWdsb2JhbCB0ZW1wbGF0ZSBhY2N1bXVsYXRlwqstZXJyb3IsIHNlZQorICogJChETURCVUcgNTcxMCwgRE1EIGlzc3VlIDU3MTApLiBJZiB5b3VyIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQKKyAqIHRvIGFjY2VzcyB0aGUgc3Vycm91bmRpbmcgc2NvcGUsIHlvdSBtaWdodCB3YW50IHRvIHVzZSBhIGZ1bmN0aW9uIGxpdGVyYWwKKyAqIGluc3RlYWQgb2YgYSBkZWxlZ2F0ZSB0byBhdm9pZCB0aGUgaXNzdWUuCisgKi8KK2NsYXNzIFRBc3luY0FnZ3JlZ2F0b3IoSW50ZXJmYWNlKSBpZiAoaXNCYXNlU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgLy8vIFNob3J0aGFuZCBmb3IgdGhlIGNsaWVudCB0eXBlIHRoaXMgaW5zdGFuY2Ugb3BlcmF0ZXMgb24uCisgIGFsaWFzIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIENsaWVudDsKKworICAvLy8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgY2xpZW50c18gPSBjbGllbnRzOworICB9CisKKyAgLy8vIFdoZXRoZXIgdG8gb3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnRzIG9mIGEgY2xpZW50IGJlZm9yZSB0cnlpbmcgdG8KKyAgLy8vIGV4ZWN1dGUgYSBtZXRob2QgaWYgdGhleSBhcmUgbm90IG9wZW4uIFRoaXMgaXMgdXN1YWxseSBkZXNpcmFibGUKKyAgLy8vIGJlY2F1c2UgaXQgYWxsb3dzIGUuZy4gdG8gYXV0b21hdGljYWxseSByZWNvbm5lY3QgdG8gYSByZW1vdGUgc2VydmVyCisgIC8vLyBpZiB0aGUgbmV0d29yayBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCisgIC8vLworICAvLy8gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzID0gdHJ1ZTsKKworICBtaXhpbiBBZ2dyZWdhdG9yT3BEaXNwYXRjaCEoKTsKKworcHJpdmF0ZToKKyAgQ2xpZW50W10gY2xpZW50c187Cit9CisKKy8vLyBEaXR0bworY2xhc3MgVEFzeW5jQWdncmVnYXRvcihJbnRlcmZhY2UpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQXN5bmNBZ2dyZWdhdG9yIShCYXNlU2VydmljZSFJbnRlcmZhY2UpCit7CisgIC8vLyBTaG9ydGhhbmQgZm9yIHRoZSBjbGllbnQgdHlwZSB0aGlzIGluc3RhbmNlIG9wZXJhdGVzIG9uLgorICBhbGlhcyBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZSBDbGllbnQ7CisKKyAgLy8vCisgIHRoaXMoQ2xpZW50W10gY2xpZW50cykgeworICAgIHN1cGVyKGNhc3QoVEFzeW5jQ2xpZW50QmFzZSEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKVtdKWNsaWVudHMpOworICB9CisKKyAgbWl4aW4gQWdncmVnYXRvck9wRGlzcGF0Y2ghKCk7Cit9CisKKy8qKgorICogV2hldGhlciBmdW4gaXMgYSB2YWxpZCBhY2N1bXVsYXRvciBmdW5jdGlvbiBmb3IgdmFsdWVzIG9mIHR5cGUgVmFsdWVUeXBlLgorICoKKyAqIEZvciB0aGlzIHRvIGJlIHRydWUsIGZ1biBtdXN0IGJlIGEgY2FsbGFibGUgbWF0Y2hpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAqIGFyZ3VtZW50IGxpc3RzOgorICogLS0tCisgKiBmdW4oVmFsdWVUeXBlW10gdmFsdWVzKTsKKyAqIGZ1bihWYWx1ZVR5cGVbXSB2YWx1ZXMsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMpOworICogLS0tCisgKgorICogVGhlIHNlY29uZCB2ZXJzaW9uIGlzIHBhc3NlZCB0aGUgY29sbGVjdGVkIGFycmF5IGV4Y2VwdGlvbnMgZnJvbSBhbGwgdGhlCisgKiBjbGllbnRzIGluIHRoZSBwb29sLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgY2xpZW50ICh2aWEKKyAqIHRoZSByZXN1bHQgZnV0dXJlKS4gSWYgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIG9wZXJhdGlvbiBpcyBtYXJrZWQgYXMKKyAqIGZhaWxlZCB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24gaW5zdGVhZC4KKyAqLwordGVtcGxhdGUgaXNBY2N1bXVsYXRvcihWYWx1ZVR5cGUsIGFsaWFzIGZ1bikgeworICBlbnVtIGlzQWNjdW11bGF0b3IgPSBpcyh0eXBlb2YoZnVuKGNhc3QoVmFsdWVUeXBlW10pW10pKSkgfHwKKyAgICBpcyh0eXBlb2YoZnVuKGNhc3QoVmFsdWVUeXBlW10pW10sIGNhc3QoRXhjZXB0aW9uW10pW10pKSk7Cit9CisKKy8qKgorICogVEFzeW5jQWdncmVnYXRvciBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkCisgKiB1c2luZyBJRlRJIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXN0IDYwODIpKS4KKyAqLworVEFzeW5jQWdncmVnYXRvciFJbnRlcmZhY2UgdEFzeW5jQWdncmVnYXRvcihJbnRlcmZhY2UpKAorICBUQXN5bmNDbGllbnRCYXNlIUludGVyZmFjZVtdIGNsaWVudHMKKykgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgcmV0dXJuIG5ldyB0eXBlb2YocmV0dXJuKShjbGllbnRzKTsKK30KKworcHJpdmF0ZSB7CisgIG1peGluIHRlbXBsYXRlIEFnZ3JlZ2F0b3JPcERpc3BhdGNoKCkgeworICAgIGF1dG8gb3BEaXNwYXRjaChzdHJpbmcgbmFtZSwgQXJncy4uLikoQXJncyBhcmdzKSBpZiAoCisgICAgICBpcyh0eXBlb2YobWl4aW4oIkludGVyZmFjZS5pbml0LiIgfiBuYW1lKShhcmdzKSkpCisgICAgKSB7CisgICAgICBhbGlhcyBSZXR1cm5UeXBlIShNZW1iZXJUeXBlIShJbnRlcmZhY2UsIG5hbWUpKSBSZXN1bHRUeXBlOworCisgICAgICBhdXRvIGNoaWxkQ2FuY2VsbGF0aW9uID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisKKyAgICAgIFRGdXR1cmUhUmVzdWx0VHlwZVtdIGZ1dHVyZXM7CisgICAgICBmdXR1cmVzLnJlc2VydmUoY2xpZW50c18ubGVuZ3RoKTsKKworICAgICAgZm9yZWFjaCAoYzsgY2FzdChDbGllbnRbXSljbGllbnRzXykgeworICAgICAgICBpZiAocmVvcGVuVHJhbnNwb3J0cykgeworICAgICAgICAgIGlmICghYy50cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBjLnRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnV0dXJlcyB+PSBtaXhpbigiYy4iIH4gbmFtZSkoYXJncywgY2hpbGRDYW5jZWxsYXRpb24pOworICAgICAgfQorCisgICAgICByZXR1cm4gQWdncmVnYXRpb25SZXN1bHQhUmVzdWx0VHlwZShmdXR1cmVzLCBjaGlsZENhbmNlbGxhdGlvbik7CisgICAgfQorICB9CisKKyAgc3RydWN0IEFnZ3JlZ2F0aW9uUmVzdWx0KFQpIHsKKyAgICBhdXRvIG9wU2xpY2UoKSB7CisgICAgICByZXR1cm4gcmFuZ2UoKTsKKyAgICB9CisKKyAgICBhdXRvIHJhbmdlKER1cmF0aW9uIHRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgIHJldHVybiB0RnV0dXJlQWdncmVnYXRvclJhbmdlKGZ1dHVyZXNfLCBjaGlsZENhbmNlbGxhdGlvbl8sIHRpbWVvdXQpOworICAgIH0KKworICAgIGF1dG8gYWNjdW11bGF0ZShhbGlhcyBhY2MgPSBkZWZhdWx0QWNjdW11bGF0b3IpKCkgaWYgKGlzQWNjdW11bGF0b3IhKFQsIGFjYykpIHsKKyAgICAgIHJldHVybiBuZXcgQWNjdW11bGF0b3JKb2IhKFQsIGFjYykoZnV0dXJlc18sIGNoaWxkQ2FuY2VsbGF0aW9uXyk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVEZ1dHVyZSFUW10gZnV0dXJlc187CisgICAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbl87CisgIH0KKworICBhdXRvIGRlZmF1bHRBY2N1bXVsYXRvcihUKShUW10gdmFsdWVzLCBFeGNlcHRpb25bXSBleGNlcHRpb25zKSB7CisgICAgaWYgKHZhbHVlcy5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWxsIGNsaWVudHMgZmFpbGVkIiwKKyAgICAgICAgZXhjZXB0aW9ucyk7CisgICAgfQorCisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoVC5pbml0IH4gVC5pbml0KSkpIHsKKyAgICAgIGltcG9ydCBzdGQuYWxnb3JpdGhtOworICAgICAgcmV0dXJuIHJlZHVjZSEiYSB+IGIiKHZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorICB9CisKKyAgZmluYWwgY2xhc3MgQWNjdW11bGF0b3JKb2IoVCwgYWxpYXMgYWNjdW11bGF0b3IpIGlmICgKKyAgICBpc0FjY3VtdWxhdG9yIShULCBhY2N1bXVsYXRvcikKKyAgKSA6IFRGdXR1cmUhKEFjY3VtdWxhdG9yUmVzdWx0IShULCBhY2N1bXVsYXRvcikpIHsKKyAgICB0aGlzKFRGdXR1cmUhVFtdIGZ1dHVyZXMsIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb24pIHsKKyAgICAgIGZ1dHVyZXNfID0gZnV0dXJlczsKKyAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXyA9IGNoaWxkQ2FuY2VsbGF0aW9uOworICAgICAgcmVzdWx0TXV0ZXhfID0gbmV3IE11dGV4OworICAgICAgY29tcGxldGlvbkV2ZW50XyA9IG5ldyBUT25lc2hvdEV2ZW50OworCisgICAgICBmb3JlYWNoIChmdXR1cmU7IGZ1dHVyZXMpIHsKKyAgICAgICAgZnV0dXJlLmNvbXBsZXRpb24uYWRkQ2FsbGJhY2soeworICAgICAgICAgIGF1dG8gZiA9IGZ1dHVyZTsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgc3luY2hyb25pemVkIChyZXN1bHRNdXRleF8pIHsKKyAgICAgICAgICAgICAgaWYgKGYuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaW5pc2hlZF8pIHsKKyAgICAgICAgICAgICAgICAgIHN0YXR1c18gPSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRDsKKyAgICAgICAgICAgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChmLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkZBSUxFRCkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnNfIH49IGYuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0c18gfj0gZi5nZXQoKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChyZXN1bHRzXy5sZW5ndGggKyBleGNlcHRpb25zXy5sZW5ndGggPT0gZnV0dXJlc18ubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0oKSk7CisgICAgICB9CisgICAgfQorCisgICAgVEZ1dHVyZVN0YXR1cyBzdGF0dXMoKSBAcHJvcGVydHkgeworICAgICAgc3luY2hyb25pemVkIChyZXN1bHRNdXRleF8pIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZF8pIHJldHVybiBURnV0dXJlU3RhdHVzLlJVTk5JTkc7CisgICAgICAgIGlmIChzdGF0dXNfICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORykgcmV0dXJuIHN0YXR1c187CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXN1bHRfID0gaW52b2tlQWNjdW11bGF0b3IhYWNjdW11bGF0b3IocmVzdWx0c18sIGV4Y2VwdGlvbnNfKTsKKyAgICAgICAgICBzdGF0dXNfID0gVEZ1dHVyZVN0YXR1cy5TVUNDRUVERUQ7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZXhjZXB0aW9uXyA9IGU7CisgICAgICAgICAgc3RhdHVzXyA9IFRGdXR1cmVTdGF0dXMuRkFJTEVEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXR1c187CisgICAgICB9CisgICAgfQorCisgICAgVEF3YWl0YWJsZSBjb21wbGV0aW9uKCkgQHByb3BlcnR5IHsKKyAgICAgIHJldHVybiBjb21wbGV0aW9uRXZlbnRfOworICAgIH0KKworICAgIEFjY3VtdWxhdG9yUmVzdWx0IShULCBhY2N1bXVsYXRvcikgZ2V0KCkgeworICAgICAgYXV0byBzID0gc3RhdHVzOworCisgICAgICBlbmZvcmNlKHMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCB5ZXQgY29tcGxldGVkLiIpKTsKKworICAgICAgaWYgKHMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICAgICAgaWYgKHMgPT0gVEZ1dHVyZVN0YXR1cy5GQUlMRUQpIHRocm93IGV4Y2VwdGlvbl87CisgICAgICByZXR1cm4gcmVzdWx0XzsKKyAgICB9CisKKyAgICBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworICAgICAgYXV0byBzID0gc3RhdHVzOworICAgICAgZW5mb3JjZShzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORywKKyAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgeWV0IGNvbXBsZXRlZC4iKSk7CisKKyAgICAgIGlmIChzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSB0aHJvdyBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKworICAgICAgaWYgKHMgPT0gVEZ1dHVyZVN0YXR1cy5TVUNDRUVERUQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gZXhjZXB0aW9uXzsKKyAgICB9CisKKyAgICB2b2lkIGZpbmlzaCgpIHsKKyAgICAgIHN5bmNocm9uaXplZCAocmVzdWx0TXV0ZXhfKSB7CisgICAgICAgIGlmICghZmluaXNoZWRfKSB7CisgICAgICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgICAgICBjaGlsZENhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICAgICAgICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYXV0byBmaW5pc2hHZXQoKSB7CisgICAgICBmaW5pc2goKTsKKyAgICAgIHJldHVybiBnZXQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBURnV0dXJlIVRbXSBmdXR1cmVzXzsKKyAgICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uXzsKKworICAgIGJvb2wgZmluaXNoZWRfOworICAgIFRbXSByZXN1bHRzXzsKKyAgICBFeGNlcHRpb25bXSBleGNlcHRpb25zXzsKKworICAgIFRGdXR1cmVTdGF0dXMgc3RhdHVzXzsKKyAgICBNdXRleCByZXN1bHRNdXRleF87CisgICAgdW5pb24geworICAgICAgQWNjdW11bGF0b3JSZXN1bHQhKFQsIGFjY3VtdWxhdG9yKSByZXN1bHRfOworICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbl87CisgICAgfQorICAgIFRPbmVzaG90RXZlbnQgY29tcGxldGlvbkV2ZW50XzsKKyAgfQorCisgIGF1dG8gaW52b2tlQWNjdW11bGF0b3IoYWxpYXMgYWNjdW11bGF0b3IsIFQpKAorICAgIFRbXSB2YWx1ZXMsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMKKyAgKSBpZiAoCisgICAgaXNBY2N1bXVsYXRvciEoVCwgYWNjdW11bGF0b3IpCisgICkgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKGFjY3VtdWxhdG9yKHZhbHVlcywgZXhjZXB0aW9ucykpKSkgeworICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yKHZhbHVlcywgZXhjZXB0aW9ucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhY2N1bXVsYXRvcih2YWx1ZXMpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIEFjY3VtdWxhdG9yUmVzdWx0KFQsIGFsaWFzIGFjYykgeworICAgIGFsaWFzIHR5cGVvZihpbnZva2VBY2N1bXVsYXRvciFhY2MoY2FzdChUW10pW10sIGNhc3QoRXhjZXB0aW9uW10pW10pKQorICAgICAgQWNjdW11bGF0b3JSZXN1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTQ5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kCkBAIC0wLDAgKzEsMTAyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIENvZGUgZ2VuZXJhdGlvbiBtZXRhZGF0YSBhbmQgdGVtcGxhdGVzIHVzZWQgZm9yIGltcGxlbWVudGluZyBzdHJ1Y3QKKyAqIHNlcmlhbGl6YXRpb24uCisgKgorICogTWFueSB0ZW1wbGF0ZXMgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgZmllbGQgbWV0YSBkYXRhLCB3aGljaCBpcyByZWFkIGZyb20KKyAqIGEgbWFuaWZlc3QgY29uc3RhbnQgbWVtYmVyIG9mIHRoZSBnaXZlbiB0eXBlIGNhbGxlZCBmaWVsZE1ldGEgKGlmIHByZXNlbnQpLAorICogYW5kIGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBvcHRpb25hbCBmaWVsZE1ldGFEYXRhCisgKiB0ZW1wbGF0ZSBhbGlhcyBwYXJhbWV0ZXIuCisgKgorICogU29tZSBjb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzIHRha2UgYWNjb3VudCBvZiB0aGUgb3B0aW9uYWwgVFZlcmJvc2VDb2RlZ2VuCisgKiB2ZXJzaW9uIGRlY2xhcmF0aW9uLCB3aGljaCBjYXVzZXMgd2FybmluZyBtZXNzYWdlcyB0byBiZSBlbWl0dGVkIGlmIG5vCisgKiBtZXRhZGF0YSBmb3IgYSBmaWVsZC9tZXRob2QgaGFzIGJlZW4gZm91bmQgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCisgKiB1c2VkIGluc3RlYWQuIElmIHRoaXMgdmVyc2lvbiBpcyBub3QgZGVmaW5lZCwgdGhlIHRlbXBsYXRlcyBqdXN0IHNpbGVudGx5CisgKiBiZWhhdmUgbGlrZSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGRvZXMgaW4gdGhpcyBzaXR1YXRpb24sIGkuZS4gYXV0b21hdGljYWxseQorICogYXNzaWduIG5lZ2F0aXZlIGlkcyAoc3RhcnRpbmcgYXQgLTEpIGZvciBmaWVsZHMgYW5kIGFzc3VtZSBUUmVxLkFVVE8gYXMKKyAqIHJlcXVpcmVtZW50IGxldmVsLgorICovCisvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBBbGwgdGhlIHRlbXBsYXRlcyBpbiBoZXJlIHRha2luZyBhIGZpZWxkIG1ldGFkYXRhCisvLyBwYXJhbWV0ZXIgc2hvdWxkIGlkZWFsbHkgaGF2ZSBhIGNvbnN0cmFpbnQgdGhhdCByZXN0cmljdHMgdGhlIGFsaWFzIHRvCisvLyBURmllbGRNZXRhW10tdHlwZWQgdmFsdWVzLCBidXQgdGhlIGlzKCkgZXhwcmVzc2lvbnMgc2VlbXMgdG8gYWx3YXlzIGZhaWwuCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBmaW5kOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC50cmFpdHMgOiBCYXNlVHlwZVR1cGxlLCBpc1BvaW50ZXIsIGlzU29tZUZ1bmN0aW9uLCBQb2ludGVyVGFyZ2V0LAorICBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CisKKy8qCisgKiBUaHJpZnQgc3RydWN0L3NlcnZpY2UgbWV0YSBkYXRhLCB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGZyb20KKyAqIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcyBub3QgcmVwcmVzZW50YWJsZSBpbiBwbGFpbiBELCBpLmUuIGZpZWxkCisgKiByZXF1aXJlbWVudCBsZXZlbHMsIFRocmlmdCBmaWVsZCBJRHMsIGV0Yy4KKyAqLworCisvKioKKyAqIFN0cnVjdCBmaWVsZCByZXF1aXJlbWVudCBsZXZlbHMuCisgKi8KK2VudW0gVFJlcSB7CisgIC8vLyBEZXRlY3QgdGhlIHJlcXVpcmVkbmVzcyBmcm9tIHRoZSBmaWVsZCB0eXBlOiBpZiBpdCBpcyBudWxsYWJsZSwgdHJlYXQKKyAgLy8vIHRoZSBmaWVsZCBhcyBvcHRpb25hbCwgaWYgaXQgaXMgbm9uLW51bGxhYmxlLCB0cmVhdCB0aGUgZmllbGQgYXMKKyAgLy8vIHJlcXVpcmVkLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHVzZWQgZm9yIGhhbmRsaW5nIHN0cnVjdHMgbm90IGdlbmVyYXRlZAorICAvLy8gZnJvbSBhbiBJREwgZmlsZSwgYW5kIG5ldmVyIGVtaXR0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlci4gVFJlcS5BVVRPCisgIC8vLyBzaG91bGRuJ3QgYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgIC8vIEltcGxlbWVudGF0aW9uIG5vdGU6IHRocmlmdC5jb2RlZ2VuIHRlbXBsYXRlcyB1c2UKKyAgLy8gdGhyaWZ0LmludGVybmFsLmNvZGVnZW4ubWVtYmVyUmVxIHRvIHJlc29sdmUgQVVUTyB0byBSRVFVSVJFRC9PUFRJT05BTAorICAvLyBpbnN0ZWFkIG9mIGhhbmRsaW5nIGl0IGRpcmVjdGx5LgorICBBVVRPLAorCisgIC8vLyBUaGUgZmllbGQgaXMgdHJlYXRlZCBhcyBvcHRpb25hbCB3aGVuIGRlc2VyaWFsaXppbmcvcmVjZWl2aW5nIHRoZSBzdHJ1Y3QKKyAgLy8vIGFuZCBhcyByZXF1aXJlZCB3aGVuIHNlcmlhbGl6aW5nL3NlbmRpbmcuIFRoaXMgaXMgdGhlIFRocmlmdCBkZWZhdWx0IGlmCisgIC8vLyBuZWl0aGVyICJyZXF1aXJlZCIgbm9yICJvcHRpb25hbCIgYXJlIHNwZWNpZmllZCBpbiB0aGUgSURMIGZpbGUuCisgIE9QVF9JTl9SRVFfT1VULAorCisgIC8vLyBUaGUgZmllbGQgaXMgb3B0aW9uYWwuCisgIE9QVElPTkFMLAorCisgIC8vLyBUaGUgZmllbGQgaXMgcmVxdWlyZWQuCisgIFJFUVVJUkVELAorCisgIC8vLyBJZ25vcmUgdGhlIHN0cnVjdCBmaWVsZCB3aGVuIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcuCisgIElHTk9SRQorfQorCisvKioKKyAqIFRoZSB3YXkgaG93IG1ldGhvZHMgYXJlIGNhbGxlZC4KKyAqLworZW51bSBUTWV0aG9kVHlwZSB7CisgIC8vLyBDYWxsZWQgaW4gdGhlIG5vcm1hbCB0d28td2F5IHNjaGVtZSBjb25zaXN0aW5nIG9mIGEgcmVxdWVzdCBhbmQgYQorICAvLy8gcmVzcG9uc2UuCisgIFJFR1VMQVIsCisKKyAgLy8vIEEgZmlyZS1hbmQtZm9yZ2V0IG9uZS13YXkgbWV0aG9kLCB3aGVyZSBubyByZXNwb25zZSBpcyBzZW50IGFuZCB0aGUKKyAgLy8vIGNsaWVudCBpbW1lZGlhdGVseSByZXR1cm5zLgorICBPTkVXQVkKK30KKworLyoqCisgKiBDb21waWxlLXRpbWUgbWV0YWRhdGEgZm9yIGEgc3RydWN0IGZpZWxkLgorICovCitzdHJ1Y3QgVEZpZWxkTWV0YSB7CisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZmllbGQuIFVzZWQgZm9yIG1hdGNoaW5nIGEgVEZpZWxkTWV0YSB3aXRoIHRoZSBhY3R1YWwKKyAgLy8vIEQgc3RydWN0IG1lbWJlciBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgorICBzdHJpbmcgbmFtZTsKKworICAvLy8gVGhlIChUaHJpZnQpIGlkIG9mIHRoZSBmaWVsZC4KKyAgc2hvcnQgaWQ7CisKKyAgLy8vIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVyaWVkLgorICBUUmVxIHJlcTsKKworICAvLy8gQSBjb2RlIHN0cmluZyBjb250YWluaW5nIGEgRCBleHByZXNzaW9uIGZvciB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgdGhlcmUKKyAgLy8vIGlzIG9uZS4KKyAgc3RyaW5nIGRlZmF1bHRWYWx1ZTsKK30KKworLyoqCisgKiBDb21waWxlLXRpbWUgbWV0YWRhdGEgZm9yIGEgc2VydmljZSBtZXRob2QuCisgKi8KK3N0cnVjdCBUTWV0aG9kTWV0YSB7CisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kLiBVc2VkIGZvciBtYXRjaGluZyBhIFRNZXRob2RNZXRhIHdpdGggdGhlIGFjdHVhbAorICAvLy8gbWV0aG9kIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCisgIHN0cmluZyBuYW1lOworCisgIC8vLyBNZXRhIGluZm9ybWF0aW9uIGZvciB0aGUgcGFyYW1ldGVyZXMuCisgIFRQYXJhbU1ldGFbXSBwYXJhbXM7CisKKyAgLy8vIFNwZWNpZmllcyB3aGljaCBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24gYnkgdGhlIG1ldGhvZC4gQWxsIG90aGVyCisgIC8vLyBleGNlcHRpb25zIGFyZSBjb252ZXJ0ZWQgdG8gYSBUQXBwbGljYXRpb25FeGNlcHRpb24gaW5zdGVhZC4KKyAgVEV4Y2VwdGlvbk1ldGFbXSBleGNlcHRpb25zOworCisgIC8vLyBUaGUgZnVuZGFtZW50YWwgdHlwZSBvZiB0aGUgbWV0aG9kLgorICBUTWV0aG9kVHlwZSB0eXBlOworfQorCisvKioKKyAqIENvbXBpbGUtdGltZSBtZXRhZGF0YSBmb3IgYSBzZXJ2aWNlIG1ldGhvZCBwYXJhbWV0ZXIuCisgKi8KK3N0cnVjdCBUUGFyYW1NZXRhIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuIENvbnRyYXJ5IHRvIFRGaWVsZE1ldGEsIGl0IG9ubHkgc2VydmVzCisgIC8vLyBkZWNvcmF0aXZlIHB1cnBvc2VzIGhlcmUuCisgIHN0cmluZyBuYW1lOworCisgIC8vLyBUaGUgVGhyaWZ0IGlkIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIHBhcmFtIHN0cnVjdC4KKyAgc2hvcnQgaWQ7CisKKyAgLy8vIEEgY29kZSBzdHJpbmcgY29udGFpbmluZyBhIEQgZXhwcmVzc2lvbiBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQorICAvLy8gcGFyYW1ldGVyLCBpZiBhbnkuCisgIHN0cmluZyBkZWZhdWx0VmFsdWU7Cit9CisKKy8qKgorICogQ29tcGlsZS10aW1lIG1ldGFkYXRhIGZvciBhIHNlcnZpY2UgbWV0aG9kIGV4Y2VwdGlvbiBhbm5vdGF0aW9uLgorICovCitzdHJ1Y3QgVEV4Y2VwdGlvbk1ldGEgeworICAvLy8gVGhlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbiDCu3JldHVybiB2YWx1ZcKrLiBDb250cmFyeSB0byBURmllbGRNZXRhLCBpdAorICAvLy8gb25seSBzZXJ2ZXMgZGVjb3JhdGl2ZSBwdXJwb3NlcyBoZXJlLCBhcyBpdCBpcyBvbmx5IHVzZWQgaW4gY29kZSBub3QKKyAgLy8vIHZpc2libGUgdG8gcHJvY2Vzc29yIGltcGxlbWVudGF0aW9ucy9zZXJ2aWNlIGNsaWVudHMuCisgIHN0cmluZyBuYW1lOworCisgIC8vLyBUaGUgVGhyaWZ0IGlkIG9mIHRoZSBleGNlcHRpb24gZmllbGQgaW4gdGhlIHJldHVybiB2YWx1ZSBzdHJ1Y3QuCisgIHNob3J0IGlkOworCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uIHR5cGUuCisgIHN0cmluZyB0eXBlOworfQorCisvKioKKyAqIEEgcGFpciBvZiB0d28gVFBvcm90b2NvbHMuIFRvIGJlIHVzZWQgaW4gcGxhY2VzIHdoZXJlIGEgbGlzdCBvZiBwcm90b2NvbHMKKyAqIGlzIGV4cGVjdGVkLCBmb3Igc3BlY2lmeWluZyBkaWZmZXJlbnQgcHJvdG9jb2xzIGZvciBpbnB1dCBhbmQgb3V0cHV0LgorICovCitzdHJ1Y3QgVFByb3RvY29sUGFpcihJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCkgaWYgKAorICBpc1RQcm90b2NvbCFJbnB1dFByb3RvY29sICYmIGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sCispIHt9CisKKy8qKgorICogdHJ1ZSBpZiBUIGlzIGEgVFByb3RvY29sUGFpci4KKyAqLwordGVtcGxhdGUgaXNUUHJvdG9jb2xQYWlyKFQpIHsKKyAgc3RhdGljIGlmIChpcyhUIF8gPT0gVFByb3RvY29sUGFpciEoSSwgTyksIEksIE8pKSB7CisgICAgZW51bSBpc1RQcm90b2NvbFBhaXIgPSB0cnVlOworICB9IGVsc2UgeworICAgIGVudW0gaXNUUHJvdG9jb2xQYWlyID0gZmFsc2U7CisgIH0KK30KKwordW5pdHRlc3QgeworICBzdGF0aWMgYXNzZXJ0KGlzVFByb3RvY29sUGFpciEoVFByb3RvY29sUGFpciEoVFByb3RvY29sLCBUUHJvdG9jb2wpKSk7CisgIHN0YXRpYyBhc3NlcnQoIWlzVFByb3RvY29sUGFpciFUUHJvdG9jb2wpOworfQorCisvKioKKyAqIHRydWUgaWYgVCBpcyBhIFRQcm90b2NvbCBvciBhIFRQcm90b2NvbFBhaXIuCisgKi8KK3RlbXBsYXRlIGlzVFByb3RvY29sT3JQYWlyKFQpIHsKKyAgZW51bSBpc1RQcm90b2NvbE9yUGFpciA9IGlzVFByb3RvY29sIVQgfHwgaXNUUHJvdG9jb2xQYWlyIVQ7Cit9CisKK3VuaXR0ZXN0IHsKKyAgc3RhdGljIGFzc2VydChpc1RQcm90b2NvbE9yUGFpciFUUHJvdG9jb2wpOworICBzdGF0aWMgYXNzZXJ0KGlzVFByb3RvY29sT3JQYWlyIShUUHJvdG9jb2xQYWlyIShUUHJvdG9jb2wsIFRQcm90b2NvbCkpKTsKKyAgc3RhdGljIGFzc2VydCghaXNUUHJvdG9jb2xPclBhaXIhdm9pZCk7Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZS4KKyAqLwordGVtcGxhdGUgaXNTZXJ2aWNlKFQpIHsKKyAgZW51bSBpc1NlcnZpY2UgPSBpc0Jhc2VTZXJ2aWNlIVQgfHwgaXNEZXJpdmVkU2VydmljZSFUOworfQorCisvKioKKyAqIHRydWUgaWYgVCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2Ugbm90IGRlcml2ZWQgZnJvbSBhbm90aGVyIHNlcnZpY2UuCisgKi8KK3RlbXBsYXRlIGlzQmFzZVNlcnZpY2UoVCkgeworICBzdGF0aWMgaWYoaXMoVCBfID09IGludGVyZmFjZSkgJiYKKyAgICAoIWlzKFQgVEJhc2VzID09IHN1cGVyKSB8fCBUQmFzZXMubGVuZ3RoID09IDApCisgICkgeworICAgIGVudW0gaXNCYXNlU2VydmljZSA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgZW51bSBpc0Jhc2VTZXJ2aWNlID0gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiB0cnVlIGlmIFQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIGRlcml2ZWQgZnJvbSBhbm90aGVyIHNlcnZpY2UuCisgKi8KK3RlbXBsYXRlIGlzRGVyaXZlZFNlcnZpY2UoVCkgeworICBzdGF0aWMgaWYoaXMoVCBfID09IGludGVyZmFjZSkgJiYKKyAgICBpcyhUIFRCYXNlcyA9PSBzdXBlcikgJiYgVEJhc2VzLmxlbmd0aCA9PSAxCisgICkgeworICAgIGVudW0gaXNEZXJpdmVkU2VydmljZSA9IGlzU2VydmljZSEoVEJhc2VzWzBdKTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzRGVyaXZlZFNlcnZpY2UgPSBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEZvciBkZXJpdmVkIHNlcnZpY2VzLCBnZXRzIHRoZSBiYXNlIHNlcnZpY2UgaW50ZXJmYWNlLgorICovCit0ZW1wbGF0ZSBCYXNlU2VydmljZShUKSBpZiAoaXNEZXJpdmVkU2VydmljZSFUKSB7CisgIGFsaWFzIEJhc2VUeXBlVHVwbGUhVFswXSBCYXNlU2VydmljZTsKK30KKworCisvKgorICogQ29kZSBnZW5lcmF0aW9uIHRlbXBsYXRlcy4KKyAqLworCisvKioKKyAqIE1peGluIHRlbXBsYXRlIGRlZmluaW5nIGFkZGl0aW9uYWwgaGVscGVyIG1ldGhvZHMgZm9yIHVzaW5nIGEgc3RydWN0IHdpdGgKKyAqIFRocmlmdCwgYW5kIGEgbWVtYmVyIGNhbGxlZCBpc1NldEZsYWdzIGlmIHRoZSBzdHJ1Y3QgY29udGFpbnMgYW55IGZpZWxkcworICogZm9yIHdoaWNoIGFuIMK7aXMgc2V0wqsgZmxhZyBpcyBuZWVkZWQuCisgKgorICogSXQgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc3RydWN0cyBvciBFeGNlcHRpb24gY2xhc3Nlcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBzdHJ1Y3QgZGVmaW5pdGlvbjoKKyAqIC0tLQorICogc3RydWN0IEZvbyB7CisgKiAgIHN0cmluZyBhOworICogICBpbnQgYjsKKyAqICAgaW50IGM7CisgKgorICogICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICogICAgIFRGaWVsZE1ldGEoImEiLCAxKSwgLy8gSW1wbGljaXRseSBvcHRpb25hbCAobnVsbGFibGUpLgorICogICAgIFRGaWVsZE1ldGEoImIiLCAyKSwgLy8gSW1wbGljaXRseSByZXF1aXJlZCAobm9uLW51bGxhYmxlKS4KKyAqICAgICBURmllbGRNZXRhKCJjIiwgMywgVFJlcS5SRVFVSVJFRCwgIjQiKQorICogICBdKTsKKyAqIH0KKyAqIC0tLQorICoKKyAqIFRTdHJ1Y3RIZWxwZXIgYWRkcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdG8gdGhlIHN0cnVjdDoKKyAqIC0tLQorICogLysrCisgKiAgKyBTZXRzIG1lbWJlciBmaWVsZE5hbWUgdG8gdGhlIGdpdmVuIHZhbHVlIGFuZCBtYXJrcyBpdCBhcyBzZXQuCisgKiAgKworICogICsgRXhhbXBsZXM6CisgKiAgKyAtLS0KKyAqICArIGF1dG8gZiA9IEZvbygpOworICogICsgZi5zZXQhImIiKDEyMzQ1KTsKKyAqICArIGFzc2VydChmLmlzU2V0ISJiIik7CisgKiAgKyAtLS0KKyAqICArLworICogdm9pZCBzZXQoc3RyaW5nIGZpZWxkTmFtZSkoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSB2YWx1ZSk7CisgKgorICogLysrCisgKiAgKyBSZXNldHMgbWVtYmVyIGZpZWxkTmFtZSB0byB0aGUgaW5pdCBwcm9wZXJ0eSBvZiBpdHMgdHlwZSBhbmQgbWFya3MgaXQgYXMKKyAqICArIG5vdCBzZXQuCisgKiAgKworICogICsgRXhhbXBsZXM6CisgKiAgKyAtLS0KKyAqICArIC8vIFNldCBmLmIgdG8gc29tZSB2YWx1ZS4KKyAqICArIGF1dG8gZiA9IEZvbygpOworICogICsgZi5zZXQhImIiKDEyMzQ1KTsKKyAqICArCisgKiAgKyBmLnVuc2V0IWIoKTsKKyAqICArCisgKiAgKyAvLyBmLmIgaXMgbm93IHVuc2V0IGFnYWluLgorICogICsgYXNzZXJ0KCFmLmlzU2V0ISJiIik7CisgKiAgKyAtLS0KKyAqICArLworICogdm9pZCB1bnNldChzdHJpbmcgZmllbGROYW1lKSgpOworICoKKyAqIC8rKworICogICsgUmV0dXJucyB3aGV0aGVyIG1lbWJlciBmaWVsZE5hbWUgaXMgc2V0LgorICogICsKKyAqICArIEV4YW1wbGVzOgorICogICsgLS0tCisgKiAgKyBhdXRvIGYgPSBGb28oKTsKKyAqICArIGFzc2VydCghZi5pc1NldCEiYiIpOworICogICsgZi5zZXQhImIiKDEyMzQ1KTsKKyAqICArIGFzc2VydChmLmlzU2V0ISJiIik7CisgKiAgKyAtLS0KKyAqICArLworICogYm9vbCBpc1NldChzdHJpbmcgZmllbGROYW1lKSgpIGNvbnN0IEBwcm9wZXJ0eTsKKyAqCisgKiAvKysKKyAqICArIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cnVjdC4KKyAqICArCisgKiAgKyBFeGFtcGxlczoKKyAqICArIC0tLQorICogICsgYXV0byBmID0gRm9vKCk7CisgKiAgKyBmLmEgPSAiYSBzdHJpbmciOworICogICsgYXNzZXJ0KGYudG9TdHJpbmcoKSA9PSBgRm9vKCJhIHN0cmluZyIsIDAgKHVuc2V0KSwgNClgKTsKKyAqICArIC0tLQorICogICsvCisgKiBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKyAqCisgKiAvKysKKyAqICArIERlc2VyaWFsaXplcyB0aGUgc3RydWN0LCBzZXR0aW5nIGl0cyBtZW1iZXJzIHRvIHRoZSB2YWx1ZXMgcmVhZCBmcm9tIHRoZQorICogICsgcHJvdG9jb2wuIEZvcndhcmRzIHRvIHJlYWRTdHJ1Y3QodGhpcywgcHJvdG8pOworICogICsvCisgKiB2b2lkIHJlYWQoUHJvdG9jb2wpKFByb3RvY29sIHByb3RvKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpOworICoKKyAqIC8rKworICogICsgU2VyaWFsaXplcyB0aGUgc3RydWN0IHRvIHRoZSB0YXJnZXQgcHJvdG9jb2wuIEZvcndhcmRzIHRvCisgKiAgKyB3cml0ZVN0cnVjdCh0aGlzLCBwcm90byk7CisgKiAgKy8KKyAqIHZvaWQgd3JpdGUoUHJvdG9jb2wpKFByb3RvY29sIHByb3RvKSBjb25zdCBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpOworICogLS0tCisgKgorICogQWRkaXRpb25hbGx5LCBhbiBvcEVxdWFscygpIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIHdoaWNoIHNpbXBseQorICogY29tcGFyZXMgYWxsIGZpZWxkcywgYnV0IGRpc3JlZ2FyZHMgdGhlIGlzIHNldCBzdHJ1Y3QsIGlmIGFueSAodGhlIGV4YWN0CisgKiBzaWduYXR1cmUgb2J2aW91c2x5IGRpZmZlcnMgYmV0d2VlbiBzdHJ1Y3RzIGFuZCBleGNlcHRpb24gY2xhc3NlcykuIFRoZQorICogbWV0YWRhdGEgaXMgc3RvcmVkIGluIGEgbWFuaWZlc3QgY29uc3RhbnQgY2FsbGVkIGZpZWxkTWV0YS4KKyAqCisgKiBOb3RlOiBUbyBzZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBmaWVsZHMgd2hlcmUgb25lIGhhcyBiZWVuIHNwZWNpZmllZCBpbgorICogdGhlIGZpZWxkIG1ldGFkYXRhLCBhIHBhcmFtZXRlcmxlc3Mgc3RhdGljIG9wQ2FsbCBpcyBnZW5lcmF0ZWQsIGJlY2F1c2UgRAorICogZG9lcyBub3QgYWxsb3cgcGFyYW1ldGVybGVzcyAoZGVmYXVsdCkgY29uc3RydWN0b3JzIGZvciBzdHJ1Y3RzLiBUaHVzLCBiZQorICogYWx3YXlzIHRvIHVzZSB0byBpbml0aWFsaXplIHN0cnVjdHM6CisgKiAtLS0KKyAqIEZvbyBmb287IC8vIFdyb25nIQorICogYXV0byBmb28gPSBGb28oKTsgLy8gQ29ycmVjdC4KKyAqIC0tLQorICovCittaXhpbiB0ZW1wbGF0ZSBUU3RydWN0SGVscGVycyhhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgaWYgKAorICBpcyh0eXBlb2YoZmllbGRNZXRhRGF0YSkgOiBURmllbGRNZXRhW10pCispIHsKKyAgaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBhbnk7CisgIGltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW4gOiBpc051bGxhYmxlLCBNZW1iZXJUeXBlLCBtZXJnZUZpZWxkTWV0YSwKKyAgICBGaWVsZE5hbWVzOworICBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2UgOiBUUHJvdG9jb2wsIGlzVFByb3RvY29sOworCisgIGFsaWFzIHR5cGVvZih0aGlzKSBUaGlzOworICBzdGF0aWMgYXNzZXJ0KGlzKFRoaXMgPT0gc3RydWN0KSB8fCBpcyhUaGlzIDogRXhjZXB0aW9uKSwKKyAgICAiVFN0cnVjdEhlbHBlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgYSBzdHJ1Y3Qgb3IgYW4gRXhjZXB0aW9uIGNsYXNzLiIpOworCisgIHN0YXRpYyBpZiAoVElzU2V0RmxhZ3MhKFRoaXMsIGZpZWxkTWV0YURhdGEpLnR1cGxlb2YubGVuZ3RoID4gMCkgeworICAgIC8vIElmIHdlIG5lZWQgdG8ga2VlcCBpc1NldCBmbGFncyBhcm91bmQsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgICAvLyBjb250YWluZXIgc3RydWN0LgorICAgIFRJc1NldEZsYWdzIShUaGlzLCBmaWVsZE1ldGFEYXRhKSBpc1NldEZsYWdzOworICAgIGVudW0gZmllbGRNZXRhID0gZmllbGRNZXRhRGF0YSB+IFtURmllbGRNZXRhKCJpc1NldEZsYWdzIiwgMCwgVFJlcS5JR05PUkUpXTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGZpZWxkTWV0YSA9IGZpZWxkTWV0YURhdGE7CisgIH0KKworICB2b2lkIHNldChzdHJpbmcgZmllbGROYW1lKShNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpIHZhbHVlKSBpZiAoCisgICAgaXMoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSkKKyAgKSB7CisgICAgX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLCBmaWVsZE5hbWUpID0gdmFsdWU7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YobWl4aW4oInRoaXMuaXNTZXRGbGFncy4iIH4gZmllbGROYW1lKSkgOiBib29sKSkgeworICAgICAgX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLmlzU2V0RmxhZ3MsIGZpZWxkTmFtZSkgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZvaWQgdW5zZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBpZiAoaXMoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSkpIHsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihtaXhpbigidGhpcy5pc1NldEZsYWdzLiIgfiBmaWVsZE5hbWUpKSA6IGJvb2wpKSB7CisgICAgICBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMuaXNTZXRGbGFncywgZmllbGROYW1lKSA9IGZhbHNlOworICAgIH0KKyAgICBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMsIGZpZWxkTmFtZSkgPSBNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpLmluaXQ7CisgIH0KKworICBib29sIGlzU2V0KHN0cmluZyBmaWVsZE5hbWUpKCkgY29uc3QgQHByb3BlcnR5IGlmICgKKyAgICBpcyhNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpKQorICApIHsKKyAgICBzdGF0aWMgaWYgKGlzTnVsbGFibGUhKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkpKSB7CisgICAgICByZXR1cm4gX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLCBmaWVsZE5hbWUpICFpcyBudWxsOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKHR5cGVvZihtaXhpbigidGhpcy5pc1NldEZsYWdzLiIgfiBmaWVsZE5hbWUpKSA6IGJvb2wpKSB7CisgICAgICByZXR1cm4gX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLmlzU2V0RmxhZ3MsIGZpZWxkTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMgYSByZXF1aXJlZCBmaWVsZCwgd2hpY2ggaXMgYWx3YXlzIHNldC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpZiAoaXMoVGhpcyBfID09IGNsYXNzKSkgeworICAgIG92ZXJyaWRlIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb1N0cmluZ0ltcGwoKTsKKyAgICB9CisKKyAgICBvdmVycmlkZSBib29sIG9wRXF1YWxzKE9iamVjdCBvdGhlcikgY29uc3QgeworICAgICAgYXV0byByaHMgPSBjYXN0KFRoaXMpb3RoZXI7CisgICAgICBpZiAocmhzKSB7CisgICAgICAgIHJldHVybiB0aHJpZnRPcEVxdWFsc0ltcGwocmhzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIChjYXN0KClzdXBlcikub3BFcXVhbHMob3RoZXIpOworICAgIH0KKworICAgIG92ZXJyaWRlIHNpemVfdCB0b0hhc2goKSBjb25zdCB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9IYXNoSW1wbCgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9TdHJpbmdJbXBsKCk7CisgICAgfQorCisgICAgYm9vbCBvcEVxdWFscyhyZWYgY29uc3QgVGhpcyBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIHRocmlmdE9wRXF1YWxzSW1wbChvdGhlcik7CisgICAgfQorCisgICAgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IEBzYWZlIG5vdGhyb3cgeworICAgICAgcmV0dXJuIHRocmlmdFRvSGFzaEltcGwoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyB0aHJpZnRUb1N0cmluZ0ltcGwoKSBjb25zdCB7CisgICAgaW1wb3J0IHN0ZC5jb252IDogdG87CisgICAgc3RyaW5nIHJlc3VsdCA9IFRoaXMuc3RyaW5nb2YgfiAiKCI7CisgICAgbWl4aW4oeworICAgICAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyEoVGhpcywgZmllbGRNZXRhKSkgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvZGUgfj0gInJlc3VsdCB+PSBgLCBgO1xuIjsKKyAgICAgICAgfQorICAgICAgICBjb2RlIH49ICJyZXN1bHQgfj0gYCIgfiBuYW1lIH4gIjogYCB+IHRvIXN0cmluZyhjYXN0KCl0aGlzLiIgfiBuYW1lIH4gIik7XG4iOworICAgICAgICBjb2RlIH49ICJpZiAoIWlzU2V0IXF7IiB+IG5hbWUgfiAifSkge1xuIjsKKyAgICAgICAgY29kZSB+PSAicmVzdWx0IH49IGAgKHVuc2V0KWA7XG4iOworICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgfQorICAgICAgcmV0dXJuIGNvZGU7CisgICAgfSgpKTsKKyAgICByZXN1bHQgfj0gIikiOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIGJvb2wgdGhyaWZ0T3BFcXVhbHNJbXBsKGNvbnN0IHJlZiBUaGlzIHJocykgY29uc3QgeworICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhVGhpcykgeworICAgICAgaWYgKG1peGluKCJ0aGlzLiIgfiBuYW1lKSAhPSBtaXhpbigicmhzLiIgfiBuYW1lKSkgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgc2l6ZV90IHRocmlmdFRvSGFzaEltcGwoKSBjb25zdCBAdHJ1c3RlZCBub3Rocm93IHsKKyAgICBzaXplX3QgaGFzaCA9IDA7CisgICAgZm9yZWFjaCAoaSwgXzsgdGhpcy50dXBsZW9mKSB7CisgICAgICBhdXRvIHZhbCA9IHRoaXMudHVwbGVvZltpXTsKKyAgICAgIGhhc2ggKz0gdHlwZWlkKHZhbCkuZ2V0SGFzaCgmdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworICBzdGF0aWMgaWYgKGFueSFgIWEuZGVmYXVsdFZhbHVlLmVtcHR5YChtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKSB7CisgICAgc3RhdGljIGlmIChpcyhUaGlzIF8gPT0gY2xhc3MpKSB7CisgICAgICB0aGlzKCkgeworICAgICAgICBtaXhpbih0aHJpZnRGaWVsZEluaXRDb2RlIShtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKCJ0aGlzIikpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBETUQgQEBCVUdAQDogSGF2ZSB0byB1c2UgYXV0byBoZXJlIHRvIGF2b2lkIMK7bm8gc2l6ZSB5ZXQgZm9yIGZvcndhcmQKKyAgICAgIC8vIHJlZmVyZW5jZcKrIGVycm9ycy4KKyAgICAgIHN0YXRpYyBhdXRvIG9wQ2FsbCgpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBUaGlzLmluaXQ7CisgICAgICAgIG1peGluKHRocmlmdEZpZWxkSW5pdENvZGUhKG1lcmdlRmllbGRNZXRhIShUaGlzLCBmaWVsZE1ldGFEYXRhKSkoInJlc3VsdCIpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHJlYWQoUHJvdG9jb2wpKFByb3RvY29sIHByb3RvKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpIHsKKyAgICAvLyBOZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSBmaWVsZE1ldGFEYXRhIGhlcmUsIHNpbmNlIGl0IGlzbid0IGFscmVhZHkKKyAgICAvLyBwaWNrZWQgdXAgaW4gc29tZSBzaXR1YXRpb25zIChlLmcuIHRoZSBUQXJncyBzdHJ1Y3QgZm9yIG1ldGhvZHMgd2l0aAorICAgIC8vIG11bHRpcGxlIHBhcmFtZXRlcnMgaW4gYXN5bmNfdGVzdF9zZXJ2ZXJzKSBvdGhlcndpc2UuIER1ZSB0byBhIERNRAorICAgIC8vIEBAQlVHQEAsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBvdGhlciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisgICAgLy8gYXMgd2VsbC4KKyAgICByZWFkU3RydWN0IShUaGlzLCBQcm90b2NvbCwgZmllbGRNZXRhRGF0YSwgZmFsc2UpKHRoaXMsIHByb3RvKTsKKyAgfQorCisgIHZvaWQgd3JpdGUoUHJvdG9jb2wpKFByb3RvY29sIHByb3RvKSBjb25zdCBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpIHsKKyAgICB3cml0ZVN0cnVjdCEoVGhpcywgUHJvdG9jb2wsIGZpZWxkTWV0YURhdGEsIGZhbHNlKSh0aGlzLCBwcm90byk7CisgIH0KK30KKworLy8gRE1EIEBAQlVHQEA6IEhhdmluZyB0aGlzIGluc2lkZSBUU3RydWN0SGVscGVycyBsZWFkcyB0byB3ZWlyZCBsb29rdXAgZXJyb3JzCisvLyAoZS5nLiBmb3Igc3RkLmFycnkuZW1wdHkpLgorc3RyaW5nIHRocmlmdEZpZWxkSW5pdENvZGUoYWxpYXMgZmllbGRNZXRhKShzdHJpbmcgdGhpc05hbWUpIHsKKyAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgZm9yZWFjaCAoZmllbGQ7IGZpZWxkTWV0YSkgeworICAgIGlmIChmaWVsZC5kZWZhdWx0VmFsdWUuZW1wdHkpIGNvbnRpbnVlOworICAgIGNvZGUgfj0gdGhpc05hbWUgfiAiLiIgfiBmaWVsZC5uYW1lIH4gIiA9ICIgfiBmaWVsZC5kZWZhdWx0VmFsdWUgfiAiO1xuIjsKKyAgfQorICByZXR1cm4gY29kZTsKK30KKwordW5pdHRlc3QgeworICAvLyBDYW5ub3QgbWFrZSB0aGlzIG5lc3RlZCBpbiB0aGUgdW5pdHRlc3QgYmxvY2sgZHVlIHRvIGEgwrtubyBzaXplIHlldCBmb3IKKyAgLy8gZm9yd2FyZCByZWZlcmVuY2XCqyBlcnJvci4KKyAgc3RhdGljIHN0cnVjdCBGb28geworICAgIHN0cmluZyBhOworICAgIGludCBiOworICAgIGludCBjOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImEiLCAxKSwKKyAgICAgIFRGaWVsZE1ldGEoImIiLCAyLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAgICAgIFRGaWVsZE1ldGEoImMiLCAzLCBUUmVxLlJFUVVJUkVELCAiNCIpCisgICAgXSk7CisgIH0KKworICBhdXRvIGYgPSBGb28oKTsKKworICBmLnNldCEiYiIoMTIzNDUpOworICBhc3NlcnQoZi5pc1NldCEiYiIpOworICBmLnVuc2V0ISJiIigpOworICBhc3NlcnQoIWYuaXNTZXQhImIiKTsKKyAgZi5zZXQhImIiKDEyMzQ1KTsKKyAgYXNzZXJ0KGYuaXNTZXQhImIiKTsKKyAgZi51bnNldCEiYiIoKTsKKworICBmLmEgPSAiYSBzdHJpbmciOworICBhc3NlcnQoZi50b1N0cmluZygpID09IGBGb28oYTogYSBzdHJpbmcsIGI6IDAgKHVuc2V0KSwgYzogNClgKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlcyBhbiBlcG9ueW1vdXMgc3RydWN0IHdpdGggYm9vbGVhbiBmbGFncyBmb3IgdGhlIG5vbi1yZXF1aXJlZAorICogbm9uLW51bGxhYmxlIGZpZWxkcyBvZiBULgorICoKKyAqIE51bGxhYmxlIGZpZWxkcyBhcmUganVzdCBzZXQgdG8gbnVsbCB0byBzaWduYWwgwrtub3Qgc2V0wqssIHNvIG5vIGZsYWcgaXMKKyAqIGVtaXR0ZWQgZm9yIHRoZW0sIGV2ZW4gaWYgdGhleSBhcmUgb3B0aW9uYWwuCisgKgorICogSW4gbW9zdCBjYXNlcywgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGlzIGRpcmVjdGx5LCBidXQgdmlhIFRTdHJ1Y3RIZWxwZXJzCisgKiBpbnN0ZWFkLgorICovCit0ZW1wbGF0ZSBUSXNTZXRGbGFncyhULCBhbGlhcyBmaWVsZE1ldGFEYXRhKSB7CisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVElzU2V0RmxhZ3Mge1xuIjsKKyAgICBmb3JlYWNoIChtZXRhOyBmaWVsZE1ldGFEYXRhKSB7CisgICAgICBjb2RlIH49ICJzdGF0aWMgaWYgKCFpcyhNZW1iZXJUeXBlIShULCBgIiB+IG1ldGEubmFtZSB+ICJgKSkpIHtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJGaWVsZCAnIiB+IG1ldGEubmFtZSB+CisgICAgICAgICAgIicgcmVmZXJlbmNlZCBpbiBtZXRhZGF0YSBub3QgcHJlc2VudCBpbiBzdHJ1Y3QgJyIgfiBULnN0cmluZ29mIH4gIicuIik7CisgICAgICB9OworICAgICAgY29kZSB+PSAifSI7CisgICAgICBpZiAobWV0YS5yZXEgPT0gVFJlcS5PUFRJT05BTCB8fCBtZXRhLnJlcSA9PSBUUmVxLk9QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGNvZGUgfj0gImVsc2Ugc3RhdGljIGlmICghaXNOdWxsYWJsZSEoTWVtYmVyVHlwZSEoVCwgYCIgfiBtZXRhLm5hbWUgfiAiYCkpKSB7XG4iOworICAgICAgICBjb2RlIH49ICIgIGJvb2wgIiB+IG1ldGEubmFtZSB+ICI7XG4iOworICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgfQorICAgIH0KKyAgICBjb2RlIH49ICJ9IjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBUaHJpZnQgc3RydWN0IGZyb20gYSBwcm90b2NvbC4KKyAqCisgKiBVc2luZyB0aGUgUHJvdG9jb2wgdGVtcGxhdGUgcGFyYW1ldGVyLCB0aGUgY29uY3JldGUgVFByb3RvY29sIHRvIHVzZSBjYW4gYmUKKyAqIGJlIHNwZWNpZmllZC4gSWYgdGhlIHBvaW50ZXJTdHJ1Y3QgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGUgc3RydWN0CisgKiBmaWVsZHMgYXJlIGV4cGVjdGVkIHRvIGJlIHBvaW50ZXJzIHRvIHRoZSBhY3R1YWwgZGF0YS4gVGhpcyBpcyB1c2VkCisgKiBpbnRlcm5hbGx5IChjb21iaW5lZCB3aXRoIFRQUmVzdWx0U3RydWN0KSBhbmQgdXN1YWxseSBzaG91bGQgbm90IGJlIHVzZWQgaW4KKyAqIHVzZXIgY29kZS4KKyAqCisgKiBUaGlzIGlzIGEgZnJlZSBmdW5jdGlvbiB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlYWQgZXhpc2l0aW5nIHN0cnVjdHMgZnJvbQorICogdGhlIHdpcmUgd2l0aG91dCBhbHRlcmluZyB0aGVpciBkZWZpbml0aW9ucy4KKyAqLwordm9pZCByZWFkU3RydWN0KFQsIFByb3RvY29sLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCwKKyAgYm9vbCBwb2ludGVyU3RydWN0ID0gZmFsc2UpKGF1dG8gcmVmIFQgcywgUHJvdG9jb2wgcCkgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKQoreworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGU7CisKKyAgICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgZm9yIHdoaWNoIHRoZXJlIGlzIG1ldGEgaW5mbyBhcmUgYWN0dWFsbHkgaW4gdGhlCisgICAgLy8gcGFzc2VkIHN0cnVjdCB0eXBlLgorICAgIGZvcmVhY2ggKGZpZWxkOyBtZXJnZUZpZWxkTWV0YSEoVCwgZmllbGRNZXRhRGF0YSkpIHsKKyAgICAgIGNvZGUgfj0gInN0YXRpYyBhc3NlcnQoaXMoTWVtYmVyVHlwZSEoVCwgYCIgfiBmaWVsZC5uYW1lIH4gImApKSk7XG4iOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIGNvZGUgc3RyaW5nIGZvciByZWFkaW5nIGEgdmFsdWUgb2YgdHlwZSBGIG9mZiB0aGUgd2lyZSBhbmQKKyAgICAvLyBhc3NpZ25pbmcgaXQgdG8gdi4gVGhlIGxldmVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlCisgICAgLy8gYXJlIG5vIGNvbmZsaWN0aW5nIHZhcmlhYmxlIG5hbWVzIG9uIHJlY3Vyc2l2ZSBjYWxscy4KKyAgICBzdHJpbmcgcmVhZFZhbHVlQ29kZShWYWx1ZVR5cGUpKHN0cmluZyB2LCBzaXplX3QgbGV2ZWwgPSAwKSB7CisgICAgICAvLyBTb21lIG5vbi1hbWJpZ291cyBuYW1lcyB0byB1c2UgKHNoYWRvd2luZyBpcyBub3QgYWxsb3dlZCBpbiBEKS4KKyAgICAgIGltbXV0YWJsZSBpID0gImkiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBlbGVtID0gImVsZW0iIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBrZXkgPSAia2V5IiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgbGlzdCA9ICJsaXN0IiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgbWFwID0gIm1hcCIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIHNldCA9ICJzZXQiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSB2YWx1ZSA9ICJ2YWx1ZSIgfiB0byFzdHJpbmcobGV2ZWwpOworCisgICAgICBhbGlhcyBGdWxseVVucXVhbCFWYWx1ZVR5cGUgRjsKKworICAgICAgc3RhdGljIGlmIChpcyhGID09IGJvb2wpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEJvb2woKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBieXRlKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRCeXRlKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gZG91YmxlKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWREb3VibGUoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBzaG9ydCkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkSTE2KCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gaW50KSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRJMzIoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBsb25nKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRJNjQoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA6IHN0cmluZykpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkU3RyaW5nKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gZW51bSkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gY2FzdCh0eXBlb2YoIiB+IHYgfiAiKSlwLnJlYWRJMzIoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogRVtdLCBFKSkgeworICAgICAgICByZXR1cm4gIntcbiIgfgorICAgICAgICAgICJhdXRvICIgfiBsaXN0IH4gIiA9IHAucmVhZExpc3RCZWdpbigpO1xuIiB+CisgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgZWxlbWVudCB0eXBlIGhlcmU/CisgICAgICAgICAgdiB+ICIgPSBuZXcgdHlwZW9mKCIgfiB2IH4gIlswXSlbIiB+IGxpc3QgfiAiLnNpemVdO1xuIiB+CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBpIH4gIjsgMCAuLiAiIH4gbGlzdCB+ICIuc2l6ZSkge1xuIiB+CisgICAgICAgICAgICByZWFkVmFsdWVDb2RlIUUodiB+ICJbIiB+IGkgfiAiXSIsIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAucmVhZExpc3RFbmQoKTtcbiIgfgorICAgICAgICAifSI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgICByZXR1cm4gIntcbiIgfgorICAgICAgICAgICJhdXRvICIgfiBtYXAgfiAiID0gcC5yZWFkTWFwQmVnaW4oKTsiIH4KKyAgICAgICAgICB2IH4gIiA9IG51bGw7XG4iIH4KKyAgICAgICAgICAvLyBUT0RPOiBDaGVjayBrZXkvdmFsdWUgdHlwZXMgaGVyZT8KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGkgfiAiOyAwIC4uICIgfiBtYXAgfiAiLnNpemUpIHtcbiIgfgorICAgICAgICAgICAgIkZ1bGx5VW5xdWFsISh0eXBlb2YoIiB+IHYgfiAiLmtleXNbMF0pKSAiIH4ga2V5IH4gIjtcbiIgfgorICAgICAgICAgICAgcmVhZFZhbHVlQ29kZSFLKGtleSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICAgInR5cGVvZigiIH4gdiB+ICIudmFsdWVzWzBdKSAiIH4gdmFsdWUgfiAiO1xuIiB+CisgICAgICAgICAgICByZWFkVmFsdWVDb2RlIVYodmFsdWUsIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAgIHYgfiAiW2Nhc3QodHlwZW9mKCIgfiB2IH4gIi5rZXlzWzBdKSkiIH4ga2V5IH4gIl0gPSAiIH4gdmFsdWUgfiAiO1xuIiB+CisgICAgICAgICAgIn1cbiIgfgorICAgICAgICAgICJwLnJlYWRNYXBFbmQoKTsiIH4KKyAgICAgICAgIn0iOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogSGFzaFNldCEoRSksIEUpKSB7CisgICAgICAgIHJldHVybiAie1xuIiB+CisgICAgICAgICAgImF1dG8gIiB+IHNldCB+ICIgPSBwLnJlYWRTZXRCZWdpbigpOyIgfgorICAgICAgICAgIC8vIFRPRE86IENoZWNrIGVsZW1lbnQgdHlwZSBoZXJlPworICAgICAgICAgIHYgfiAiID0gbmV3IHR5cGVvZigiIH4gdiB+ICIpKCk7XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGkgfiAiOyAwIC4uICIgfiBzZXQgfiAiLnNpemUpIHtcbiIgfgorICAgICAgICAgICAgInR5cGVvZigiIH4gdiB+ICJbXVswXSkgIiB+IGVsZW0gfiAiO1xuIiB+CisgICAgICAgICAgICByZWFkVmFsdWVDb2RlIUUoZWxlbSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICAgdiB+ICIgfj0gIiB+IGVsZW0gfiAiO1xuIiB+CisgICAgICAgICAgIn1cbiIgfgorICAgICAgICAgICJwLnJlYWRTZXRFbmQoKTsiIH4KKyAgICAgICAgIn0iOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBzdHJ1Y3QpIHx8IGlzKEYgOiBURXhjZXB0aW9uKSkgeworICAgICAgICBzdGF0aWMgaWYgKGlzKEYgPT0gc3RydWN0KSkgeworICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdiB+ICIgPSB0eXBlb2YoIiB+IHYgfiAiKSgpO1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhdXRvIHJlc3VsdCA9IHYgfiAiID0gbmV3IHR5cGVvZigiIH4gdiB+ICIpKCk7XG4iOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGlmIChfX3RyYWl0cyhjb21waWxlcywgRi5pbml0LnJlYWQoVFByb3RvY29sLmluaXQpKSkgeworICAgICAgICAgIHJlc3VsdCB+PSB2IH4gIi5yZWFkKHApOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0IH49ICJyZWFkU3RydWN0KCIgfiB2IH4gIiwgcCk7IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBGLnN0cmluZ29mKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgcmVhZEZpZWxkQ29kZShGaWVsZFR5cGUpKHN0cmluZyBuYW1lLCBzaG9ydCBpZCwgVFJlcSByZXEpIHsKKyAgICAgIHN0YXRpYyBpZiAocG9pbnRlclN0cnVjdCAmJiBpc1BvaW50ZXIhRmllbGRUeXBlKSB7CisgICAgICAgIGltbXV0YWJsZSB2ID0gIigqcy4iIH4gbmFtZSB+ICIpIjsKKyAgICAgICAgYWxpYXMgUG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGltbXV0YWJsZSB2ID0gInMuIiB+IG5hbWU7CisgICAgICAgIGFsaWFzIEZpZWxkVHlwZSBGOworICAgICAgfQorCisgICAgICBzdHJpbmcgY29kZSA9ICJjYXNlICIgfiB0byFzdHJpbmcoaWQpIH4gIjpcbiI7CisgICAgICBjb2RlIH49ICJpZiAoZi50eXBlID09ICIgfiBkVG9UVHlwZVN0cmluZyFGIH4gIikge1xuIjsKKyAgICAgIGNvZGUgfj0gcmVhZFZhbHVlQ29kZSFGKHYpIH4gIlxuIjsKKyAgICAgIGlmIChyZXEgPT0gVFJlcS5SRVFVSVJFRCkgeworICAgICAgICAvLyBGb3IgcmVxdWlyZWQgZmllbGRzLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwgaXNTZXQgdmFyaWFibGUuCisgICAgICAgIGNvZGUgfj0gImlzU2V0XyIgfiBuYW1lIH4gIiA9IHRydWU7XG4iOworICAgICAgfSBlbHNlIGlmICghaXNOdWxsYWJsZSFGKXsKKyAgICAgICAgY29kZSB+PSAicy5pc1NldEZsYWdzLiIgfiBuYW1lIH4gIiA9IHRydWU7XG4iOworICAgICAgfQorICAgICAgY29kZSB+PSAifSBlbHNlIHNraXAocCwgZi50eXBlKTtcbiI7CisgICAgICBjb2RlIH49ICJicmVhaztcbiI7CisgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisKKyAgICAvLyBDb2RlIGZvciB0aGUgbG9jYWwgYm9vbGVhbiBmbGFncyB1c2VkIHRvIG1ha2Ugc3VyZSByZXF1aXJlZCBmaWVsZHMgaGF2ZQorICAgIC8vIGJlZW4gZm91bmQuCisgICAgc3RyaW5nIGlzU2V0RmxhZ0NvZGUgPSAiIjsKKworICAgIC8vIENvZGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhlIGZsYWdzIGZvciB0aGUgcmVxdWlyZWQgZmllbGRzIGFyZSB0cnVlLgorICAgIHN0cmluZyBpc1NldENoZWNrQ29kZSA9ICIiOworCisgICAgLy8vIENvZGUgZm9yIHRoZSBjYXNlIHN0YXRlbWVudHMgc3RvcmluZyB0aGUgZmllbGRzIHRvIHRoZSByZXN1bHQgc3RydWN0LgorICAgIHN0cmluZyByZWFkTWVtYmVyc0NvZGUgPSAiIjsKKworICAgIC8vIFRoZSBsYXN0IGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWQg4oCTIGZpZWxkcyB3aXRoIG5vIG1ldGEgaW5mb3JtYXRpb24KKyAgICAvLyBhcmUgYXNzaWduZWQgKGluIGxleGljYWwgb3JkZXIpIGRlc2NlbmRpbmcgbmVnYXRpdmUgaWRzLCBzdGFydGluZyB3aXRoCisgICAgLy8gLTEsIGp1c3QgbGlrZSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGRvZXMuCisgICAgc2hvcnQgbGFzdElkOworCisgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyFUKSB7CisgICAgICBlbnVtIHJlcSA9IG1lbWJlclJlcSEoVCwgbmFtZSwgZmllbGRNZXRhRGF0YSk7CisgICAgICBpZiAocmVxID09IFRSZXEuUkVRVUlSRUQpIHsKKyAgICAgICAgLy8gRm9yIHJlcXVpcmVkIGZpZWxkcywgZ2VuZXJhdGUgbG9jYWwgYm9vbCBmbGFncyB0byBrZWVwIHRyYWNrCisgICAgICAgIC8vIHdoZXRoZXIgdGhlIGZpZWxkIGhhcyBiZWVuIGVuY291bnRlcmVkLgorICAgICAgICBpbW11dGFibGUgbiA9ICJpc1NldF8iIH4gbmFtZTsKKyAgICAgICAgaXNTZXRGbGFnQ29kZSB+PSAiYm9vbCAiIH4gbiB+ICI7XG4iOworICAgICAgICBpc1NldENoZWNrQ29kZSB+PSAiZW5mb3JjZSgiIH4gbiB+ICIsIG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIiB+CisgICAgICAgICAgImBSZXF1aXJlZCBmaWVsZCAnIiB+IG5hbWUgfiAiJyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhYCwgIiB+CisgICAgICAgICAgIlRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSkpO1xuIjsKKyAgICAgIH0KKworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSwgbmFtZSk7CisgICAgICBzdGF0aWMgaWYgKG1ldGEuZW1wdHkpIHsKKyAgICAgICAgLS1sYXN0SWQ7CisgICAgICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4uYmFzZS5yZWFkU3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBmaWVsZCAnIiB+IG5hbWUgfiAiJyBpbiBzdHJ1Y3QgJyIgfgorICAgICAgICAgICAgVC5zdHJpbmdvZiB+ICInLiBBc3NpZ25lZCBpZDogIiB+IHRvIXN0cmluZyhsYXN0SWQpIH4gIi5gKTtcbiI7CisgICAgICAgIH0KKyAgICAgICAgcmVhZE1lbWJlcnNDb2RlIH49IHJlYWRGaWVsZENvZGUhKE1lbWJlclR5cGUhKFQsIG5hbWUpKSgKKyAgICAgICAgICBuYW1lLCBsYXN0SWQsIHJlcSk7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChyZXEgIT0gVFJlcS5JR05PUkUpIHsKKyAgICAgICAgcmVhZE1lbWJlcnNDb2RlIH49IHJlYWRGaWVsZENvZGUhKE1lbWJlclR5cGUhKFQsIG5hbWUpKSgKKyAgICAgICAgICBuYW1lLCBtZXRhLmZyb250LmlkLCByZXEpOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gaXNTZXRGbGFnQ29kZTsKKyAgICBjb2RlIH49ICJwLnJlYWRTdHJ1Y3RCZWdpbigpO1xuIjsKKyAgICBjb2RlIH49ICJ3aGlsZSAodHJ1ZSkge1xuIjsKKyAgICBjb2RlIH49ICJhdXRvIGYgPSBwLnJlYWRGaWVsZEJlZ2luKCk7XG4iOworICAgIGNvZGUgfj0gImlmIChmLnR5cGUgPT0gVFR5cGUuU1RPUCkgYnJlYWs7XG4iOworICAgIGNvZGUgfj0gInN3aXRjaChmLmlkKSB7XG4iOworICAgIGNvZGUgfj0gcmVhZE1lbWJlcnNDb2RlOworICAgIGNvZGUgfj0gImRlZmF1bHQ6IHNraXAocCwgZi50eXBlKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICBjb2RlIH49ICJwLnJlYWRGaWVsZEVuZCgpO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIGNvZGUgfj0gInAucmVhZFN0cnVjdEVuZCgpO1xuIjsKKyAgICBjb2RlIH49IGlzU2V0Q2hlY2tDb2RlOworCisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIHN0cnVjdCB0byB0aGUgdGFyZ2V0IHByb3RvY29sLgorICoKKyAqIFVzaW5nIHRoZSBQcm90b2NvbCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoZSBjb25jcmV0ZSBUUHJvdG9jb2wgdG8gdXNlIGNhbiBiZQorICogYmUgc3BlY2lmaWVkLiBJZiB0aGUgcG9pbnRlclN0cnVjdCBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIHRoZSBzdHJ1Y3QKKyAqIGZpZWxkcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcG9pbnRlcnMgdG8gdGhlIGFjdHVhbCBkYXRhLiBUaGlzIGlzIHVzZWQKKyAqIGludGVybmFsbHkgKGNvbWJpbmVkIHdpdGggVFBhcmdzU3RydWN0KSBhbmQgdXN1YWxseSBzaG91bGQgbm90IGJlIHVzZWQgaW4KKyAqIHVzZXIgY29kZS4KKyAqCisgKiBUaGlzIGlzIGEgZnJlZSBmdW5jdGlvbiB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlYWQgZXhpc2l0aW5nIHN0cnVjdHMgZnJvbQorICogdGhlIHdpcmUgd2l0aG91dCBhbHRlcmluZyB0aGVpciBkZWZpbml0aW9ucy4KKyAqLwordm9pZCB3cml0ZVN0cnVjdChULCBQcm90b2NvbCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwsCisgIGJvb2wgcG9pbnRlclN0cnVjdCA9IGZhbHNlKSAoY29uc3QgVCBzLCBQcm90b2NvbCBwKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpCit7CisgIG1peGluKHsKKyAgICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgZm9yIHdoaWNoIHRoZXJlIGlzIG1ldGEgaW5mbyBhcmUgYWN0dWFsbHkgaW4gdGhlCisgICAgLy8gcGFzc2VkIHN0cnVjdCB0eXBlLgorICAgIHN0cmluZyBjb2RlID0gIiI7CisgICAgZm9yZWFjaCAoZmllbGQ7IG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSkgeworICAgICAgY29kZSB+PSAic3RhdGljIGFzc2VydChpcyhNZW1iZXJUeXBlIShULCBgIiB+IGZpZWxkLm5hbWUgfiAiYCkpKTtcbiI7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCByZXF1aXJlZCBudWxsYWJsZSBtZW1iZXJzIGFyZSBub24tbnVsbC4KKyAgICAvLyBXT1JLQVJPVU5EOiBUbyBzdG9wIExEQyBmcm9tIGVtaXR0aW5nIHRoZSBtYW5pZmVzdCBjb25zdGFudCDCu21ldGHCqyBiZWxvdworICAgIC8vIGludG8gdGhlIHdyaXRlU3RydWN0IGZ1bmN0aW9uIGJvZHkgdGhpcyBpcyBpbnNpZGUgdGhlIHN0cmluZyBtaXhpbgorICAgIC8vIGJsb2NrIOKAkyB0aGUgY29kZSB3b3VsZG4ndCBkZXBlbmQgb24gaXQgKHRoaXMgaXMgYW4gTERDIGJ1ZywgYW5kIGJlY2F1c2UKKyAgICAvLyBvZiBpdCBhIG5ldyBhcnJheSB3b3VsZCBiZSBhbGxvY2F0ZWQgb24gZWFjaCBtZXRob2QgaW52b2NhdGlvbiBhdCBydW50aW1lKS4KKyAgICBmb3JlYWNoIChuYW1lOyBTdGF0aWNGaWx0ZXIhKAorICAgICAgQ29tcG9zZSEoaXNOdWxsYWJsZSwgUEFwcGx5IShNZW1iZXJUeXBlLCBUKSksCisgICAgICBGaWVsZE5hbWVzIVQKKyAgICApKSB7CisgICAgICAgc3RhdGljIGlmIChtZW1iZXJSZXEhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpID09IFRSZXEuUkVRVUlSRUQpIHsKKyAgICAgICAgIGNvZGUgfj0gImVuZm9yY2UoX190cmFpdHMoZ2V0TWVtYmVyLCBzLCBgIiB+IG5hbWUgfiAiYCkgIWlzIG51bGwsCisgICAgICAgICAgIG5ldyBURXhjZXB0aW9uKGBSZXF1aXJlZCBmaWVsZCAnIiB+IG5hbWUgfiAiJyBpcyBudWxsLmApKTtcbiI7CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9KCkpOworCisgIHAud3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0KFQuc3RyaW5nb2YpKTsKKyAgbWl4aW4oeworICAgIHN0cmluZyB3cml0ZVZhbHVlQ29kZShWYWx1ZVR5cGUpKHN0cmluZyB2LCBzaXplX3QgbGV2ZWwgPSAwKSB7CisgICAgICAvLyBTb21lIG5vbi1hbWJpZ291cyBuYW1lcyB0byB1c2UgKHNoYWRvd2luZyBpcyBub3QgYWxsb3dlZCBpbiBEKS4KKyAgICAgIGltbXV0YWJsZSBlbGVtID0gImVsZW0iIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBrZXkgPSAia2V5IiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgdmFsdWUgPSAidmFsdWUiIH4gdG8hc3RyaW5nKGxldmVsKTsKKworICAgICAgYWxpYXMgRnVsbHlVbnF1YWwhVmFsdWVUeXBlIEY7CisgICAgICBzdGF0aWMgaWYgKGlzKEYgPT0gYm9vbCkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlQm9vbCgiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGJ5dGUpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUJ5dGUoIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBkb3VibGUpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZURvdWJsZSgiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHNob3J0KSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVJMTYoIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBpbnQpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUkzMigiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGxvbmcpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUk2NCgiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIDogc3RyaW5nKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVTdHJpbmcoIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBlbnVtKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVJMzIoY2FzdChpbnQpIiB+IHYgfiAiKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogRVtdLCBFKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVMaXN0QmVnaW4oVExpc3QoIiB+IGRUb1RUeXBlU3RyaW5nIUUgfiAiLCAiIH4gdiB+CisgICAgICAgICAgIi5sZW5ndGgpKTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4gZWxlbSB+ICI7ICIgfiB2IH4gIikge1xuIiB+CisgICAgICAgICAgICB3cml0ZVZhbHVlQ29kZSFFKGVsZW0sIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAud3JpdGVMaXN0RW5kKCk7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZU1hcEJlZ2luKFRNYXAoIiB+IGRUb1RUeXBlU3RyaW5nIUsgfiAiLCAiIH4KKyAgICAgICAgICBkVG9UVHlwZVN0cmluZyFWIH4gIiwgIiB+IHYgfiAiLmxlbmd0aCkpO1xuIiB+CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBrZXkgfiAiLCAiIH4gdmFsdWUgfiAiOyAiIH4gdiB+ICIpIHtcbiIgfgorICAgICAgICAgICAgd3JpdGVWYWx1ZUNvZGUhSyhrZXksIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAgIHdyaXRlVmFsdWVDb2RlIVYodmFsdWUsIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAud3JpdGVNYXBFbmQoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogSGFzaFNldCFFLCBFKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVTZXRCZWdpbihUU2V0KCIgfiBkVG9UVHlwZVN0cmluZyFFIH4gIiwgIiB+IHYgfgorICAgICAgICAgICIubGVuZ3RoKSk7XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGVsZW0gfiAiOyAiIH4gdiB+ICJbXSkge1xuIiB+CisgICAgICAgICAgICB3cml0ZVZhbHVlQ29kZSFFKGVsZW0sIGxldmVsICsgMSkgfiAiXG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAud3JpdGVTZXRFbmQoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBzdHJ1Y3QpIHx8IGlzKEYgOiBURXhjZXB0aW9uKSkgeworICAgICAgICBzdGF0aWMgaWYgKF9fdHJhaXRzKGNvbXBpbGVzLCBGLmluaXQud3JpdGUoVFByb3RvY29sLmluaXQpKSkgeworICAgICAgICAgIHJldHVybiB2IH4gIi53cml0ZShwKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAid3JpdGVTdHJ1Y3QoIiB+IHYgfiAiLCBwKTsiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IEYuc3RyaW5nb2YpOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyB3cml0ZUZpZWxkQ29kZShGaWVsZFR5cGUpKHN0cmluZyBuYW1lLCBzaG9ydCBpZCwgVFJlcSByZXEpIHsKKyAgICAgIHN0cmluZyBjb2RlOworICAgICAgaWYgKCFwb2ludGVyU3RydWN0ICYmIHJlcSA9PSBUUmVxLk9QVElPTkFMKSB7CisgICAgICAgIGNvZGUgfj0gImlmIChzLmlzU2V0IWAiIH4gbmFtZSB+ICJgKSB7XG4iOworICAgICAgfQorCisgICAgICBzdGF0aWMgaWYgKHBvaW50ZXJTdHJ1Y3QgJiYgaXNQb2ludGVyIUZpZWxkVHlwZSkgeworICAgICAgICBpbW11dGFibGUgdiA9ICIoKnMuIiB+IG5hbWUgfiAiKSI7CisgICAgICAgIGFsaWFzIFBvaW50ZXJUYXJnZXQhRmllbGRUeXBlIEY7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbW11dGFibGUgdiA9ICJzLiIgfiBuYW1lOworICAgICAgICBhbGlhcyBGaWVsZFR5cGUgRjsKKyAgICAgIH0KKworICAgICAgY29kZSB+PSAicC53cml0ZUZpZWxkQmVnaW4oVEZpZWxkKGAiIH4gbmFtZSB+ICJgLCAiIH4gZFRvVFR5cGVTdHJpbmchRiB+CisgICAgICAgICIsICIgfiB0byFzdHJpbmcoaWQpIH4gIikpO1xuIjsKKyAgICAgIGNvZGUgfj0gd3JpdGVWYWx1ZUNvZGUhRih2KSB+ICJcbiI7CisgICAgICBjb2RlIH49ICJwLndyaXRlRmllbGRFbmQoKTtcbiI7CisKKyAgICAgIGlmICghcG9pbnRlclN0cnVjdCAmJiByZXEgPT0gVFJlcS5PUFRJT05BTCkgeworICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgfQorICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgLy8gVGhlIGxhc3QgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZCDigJMgZmllbGRzIHdpdGggbm8gbWV0YSBpbmZvcm1hdGlvbgorICAgIC8vIGFyZSBhc3NpZ25lZCAoaW4gbGV4aWNhbCBvcmRlcikgZGVzY2VuZGluZyBuZWdhdGl2ZSBpZHMsIHN0YXJ0aW5nIHdpdGgKKyAgICAvLyAtMSwganVzdCBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAgICBzaG9ydCBsYXN0SWQ7CisKKyAgICBzdHJpbmcgY29kZSA9ICIiOworICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhVCkgeworICAgICAgYWxpYXMgTWVtYmVyVHlwZSEoVCwgbmFtZSkgRjsKKyAgICAgIGVudW0gcmVxID0gbWVtYmVyUmVxIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKTsKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChtZXJnZUZpZWxkTWV0YSEoVCwgZmllbGRNZXRhRGF0YSksIG5hbWUpOworICAgICAgaWYgKG1ldGEuZW1wdHkpIHsKKyAgICAgICAgLS1sYXN0SWQ7CisgICAgICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4uYmFzZS53cml0ZVN0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgZmllbGQgJyIgfiBuYW1lIH4gIicgaW4gc3RydWN0ICciIH4KKyAgICAgICAgICAgIFQuc3RyaW5nb2YgfiAiJy4gQXNzaWduZWQgaWQ6ICIgfiB0byFzdHJpbmcobGFzdElkKSB+ICIuYCk7XG4iOworICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gd3JpdGVGaWVsZENvZGUhRihuYW1lLCBsYXN0SWQsIHJlcSk7CisgICAgICB9IGVsc2UgaWYgKHJlcSAhPSBUUmVxLklHTk9SRSkgeworICAgICAgICBjb2RlIH49IHdyaXRlRmllbGRDb2RlIUYobmFtZSwgbWV0YS5mcm9udC5pZCwgcmVxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKKyAgcC53cml0ZUZpZWxkU3RvcCgpOworICBwLndyaXRlU3RydWN0RW5kKCk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGF0IGxlYXN0IGNvbXBpbGVzIGZvciB0aGUgYmFzaWMgZmllbGQgdHlwZQorICAvLyBjb21iaW5hdGlvbnMuIEZ1bmN0aW9uYWxpdHkgY2hlY2tzIGFyZSBjb3ZlcmVkIGJ5IHRoZSByZXN0IG9mIHRoZSB0ZXN0CisgIC8vIHN1aXRlLgorCisgIHN0YXRpYyBzdHJ1Y3QgVGVzdCB7CisgICAgLy8gTm9uLW51bGxhYmxlLgorICAgIGludCBhMTsKKyAgICBpbnQgYTI7CisgICAgaW50IGEzOworICAgIGludCBhNDsKKworICAgIC8vIE51bGxhYmxlLgorICAgIHN0cmluZyBiMTsKKyAgICBzdHJpbmcgYjI7CisgICAgc3RyaW5nIGIzOworICAgIHN0cmluZyBiNDsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKCJhMSIsIDEsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICAgICAgVEZpZWxkTWV0YSgiYTIiLCAyLCBUUmVxLk9QVElPTkFMKSwKKyAgICAgIFRGaWVsZE1ldGEoImEzIiwgMywgVFJlcS5SRVFVSVJFRCksCisgICAgICBURmllbGRNZXRhKCJhNCIsIDQsIFRSZXEuSUdOT1JFKSwKKyAgICAgIFRGaWVsZE1ldGEoImIxIiwgNSwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgICAgICBURmllbGRNZXRhKCJiMiIsIDYsIFRSZXEuT1BUSU9OQUwpLAorICAgICAgVEZpZWxkTWV0YSgiYjMiLCA3LCBUUmVxLlJFUVVJUkVEKSwKKyAgICAgIFRGaWVsZE1ldGEoImI0IiwgOCwgVFJlcS5JR05PUkUpLAorICAgIF0pOworICB9CisKKyAgc3RhdGljIGFzc2VydChfX3RyYWl0cyhjb21waWxlcywgeyBUZXN0IHQ7IHQucmVhZChjYXN0KFRQcm90b2NvbCludWxsKTsgfSkpOworICBzdGF0aWMgYXNzZXJ0KF9fdHJhaXRzKGNvbXBpbGVzLCB7IFRlc3QgdDsgdC53cml0ZShjYXN0KFRQcm90b2NvbCludWxsKTsgfSkpOworfQorCisvLyBFbnN1cmUgb3BFcXVhbHMgYW5kIHRvSGFzaCBjb25zaXN0ZW5jeS4KK3VuaXR0ZXN0IHsKKyAgc3RydWN0IFRlc3RFcXVhbHMgeworICAgIGludCBhMTsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKCJhMSIsIDEsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICAgIF0pOworICB9CisKKyAgVGVzdEVxdWFscyBhLCBiOworICBhc3NlcnQoYSA9PSBiKTsKKyAgYXNzZXJ0KGEudG9IYXNoKCkgPT0gYi50b0hhc2goKSk7CisKKyAgYS5hMSA9IDQyOworICBhc3NlcnQoYSAhPSBiKTsKKyAgYXNzZXJ0KGEudG9IYXNoKCkgIT0gYi50b0hhc2goKSk7CisKKyAgYi5hMSA9IDQyOworICBhc3NlcnQoYSA9PSBiKTsKKyAgYXNzZXJ0KGEudG9IYXNoKCkgPT0gYi50b0hhc2goKSk7Cit9CisKK3ByaXZhdGUgeworICAvKgorICAgKiBSZXR1cm5zIGEgRCBjb2RlIHN0cmluZyBjb250YWluaW5nIHRoZSBtYXRjaGluZyBUVHlwZSB2YWx1ZSBmb3IgYSBwYXNzZWQKKyAgICogRCB0eXBlLCBlLmcuIGRUb1RUeXBlU3RyaW5nIWJ5dGUgPT0gIlRUeXBlLkJZVEUiLgorICAgKi8KKyAgdGVtcGxhdGUgZFRvVFR5cGVTdHJpbmcoVCkgeworICAgIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBib29sKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5CT09MIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJ5dGUpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkJZVEUiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZG91YmxlKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5ET1VCTEUiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gc2hvcnQpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkkxNiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBpbnQpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkkzMiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBsb25nKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5JNjQiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgOiBzdHJpbmcpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLlNUUklORyI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBlbnVtKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5JMzIiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFVbXSwgVSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuTElTVCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVltLXSwgSywgVikpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuTUFQIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBIYXNoU2V0IUUsIEUpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLlNFVCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzdHJ1Y3QpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLlNUUlVDVCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA6IFRFeGNlcHRpb24pKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLlNUUlVDVCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gVC5zdHJpbmdvZik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3YjA3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZApAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBmaW5kOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBpc1NvbWVGdW5jdGlvbiwgUGFyYW1ldGVyU3RvcmFnZUNsYXNzLAorICBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3NUdXBsZSwgUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmN0ZmU7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CisKKy8qKgorICogVGhyaWZ0IHNlcnZpY2UgY2xpZW50LCB3aGljaCBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSBieSBzeW5jaHJvbm91c2x5CisgKiBjYWxsaW5nIGEgc2VydmVyIG92ZXIgYSBUUHJvdG9jb2wuCisgKgorICogVENsaWVudEJhc2Ugc2ltcGx5IGV4dGVuZHMgSW50ZXJmYWNlIHdpdGggZ2VuZXJpYyBpbnB1dC9vdXRwdXQgcHJvdG9jb2wKKyAqIHByb3BlcnRpZXMgdG8gc2VydmUgYXMgYSBzdXBlcnR5cGUgZm9yIGFsbCBUQ2xpZW50cyBmb3IgdGhlIHNhbWUgc2VydmljZSwKKyAqIHdoaWNoIG1pZ2h0IGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBjb25jcmV0ZSBwcm90b2NvbCB0eXBlcyAodGhlcmUKKyAqIGlzIG5vIGNvdmFyaWFuY2UgZm9yIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVycykuIElmIEludGVyZmFjZSBpcyBkZXJpdmVkCisgKiBmcm9tIGFub3RoZXIgaW50ZXJmYWNlIEJhc2VJbnRlcmZhY2UsIGl0IGFsc28gZXh0ZW5kcworICogVENsaWVudEJhc2UhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUQ2xpZW50IGlzIHRoZSBjbGFzcyB0aGF0IGFjdHVhbGx5IGltcGxlbWVudHMgVENsaWVudEJhc2UuIEp1c3QgYXMKKyAqIFRDbGllbnRCYXNlLCBpdCBpcyBhbHNvIGRlcml2ZWQgZnJvbSBUQ2xpZW50IUJhc2VJbnRlcmZhY2UgZm9yIGluaGVyaXRpbmcKKyAqIHNlcnZpY2VzLgorICoKKyAqIFRDbGllbnQgdGFrZXMgdHdvIG9wdGlvbmFsIHRlbXBsYXRlIGFyZ3VtZW50cyB3aGljaCBjYW4gYmUgdXNlZCBmb3IKKyAqIHNwZWNpZnlpbmcgdGhlIGFjdHVhbCBUUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdXNlZCBmb3Igb3B0aW1pemF0aW9uCisgKiBwdXJwb3NlcywgYXMgdmlydHVhbCBjYWxscyBjYW4gY29tcGxldGVseSBiZSBlbGltaW5hdGVkIHRoZW4uIElmCisgKiBPdXRwdXRQcm90b2NvbCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzCisgKiBJbnB1dFByb3RvY29sLiBUaGUgcHJvdG9jb2wgcHJvcGVydGllcyBkZWZpbmVkIGJ5IFRDbGllbnRCYXNlIGFyZSBleHBvc2VkCisgKiB3aXRoIHRoZWlyIGNvbmNyZXRlIHR5cGUgKHJldHVybiB0eXBlIGNvdmFyaWFuY2UpLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIGltcGxlbWVudGluZyBUQ2xpZW50QmFzZSFJbnRlcmZhY2UsIFRDbGllbnQgb2ZmZXJzIHRoZQorICogZm9sbG93aW5nIGNvbnN0cnVjdG9yczoKKyAqIC0tLQorICogdGhpcyhJbnB1dFByb3RvY29sIGlwcm90LCBPdXRwdXRQcm90b2NvbCBvcHJvdCk7CisgKiAvLyBPbmx5IGlmIGlzKElucHV0UHJvdG9jb2wgPT0gT3V0cHV0UHJvdG9jb2wpLCB0byB1c2UgdGhlIHNhbWUgcHJvdG9jb2wKKyAqIC8vIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQ6CisgKiB0aGlzKElucHV0UHJvdG9jb2wgcHJvdCk7CisgKiAtLS0KKyAqCisgKiBUaGUgc2VxdWVuY2UgaWQgb2YgdGhlIG1ldGhvZCBjYWxscyBzdGFydHMgYXQgemVybyBhbmQgaXMgYXV0b21hdGljYWxseQorICogaW5jcmVtZW50ZWQuCisgKi8KK2ludGVyZmFjZSBUQ2xpZW50QmFzZShJbnRlcmZhY2UpIGlmIChpc0Jhc2VTZXJ2aWNlIUludGVyZmFjZSkgOiBJbnRlcmZhY2UgeworICAvKioKKyAgICogVGhlIGlucHV0IHByb3RvY29sIHVzZWQgYnkgdGhlIGNsaWVudC4KKyAgICovCisgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sKCkgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBUaGUgb3V0cHV0IHByb3RvY29sIHVzZWQgYnkgdGhlIGNsaWVudC4KKyAgICovCisgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCgpIEBwcm9wZXJ0eTsKK30KKworLy8vIERpdHRvCitpbnRlcmZhY2UgVENsaWVudEJhc2UoSW50ZXJmYWNlKSBpZiAoaXNEZXJpdmVkU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVENsaWVudEJhc2UhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSksIEludGVyZmFjZSB7fQorCisvLy8gRGl0dG8KK3RlbXBsYXRlIFRDbGllbnQoSW50ZXJmYWNlLCBJbnB1dFByb3RvY29sID0gVFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCA9IHZvaWQpIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBpc1RQcm90b2NvbCFJbnB1dFByb3RvY29sICYmCisgIChpc1RQcm90b2NvbCFPdXRwdXRQcm90b2NvbCB8fCBpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSkKKykgeworICBtaXhpbih7CisgICAgc3RhdGljIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgeworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVENsaWVudCA6IFRDbGllbnQhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSwgIiB+CisgICAgICAgICJJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCksIFRDbGllbnRCYXNlIUludGVyZmFjZSB7XG4iOworICAgICAgY29kZSB+PSBxeworICAgICAgICB0aGlzKElQcm90IGlwcm90LCBPUHJvdCBvcHJvdCkgeworICAgICAgICAgIHN1cGVyKGlwcm90LCBvcHJvdCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaWYgKGlzKElQcm90ID09IE9Qcm90KSkgeworICAgICAgICAgIHRoaXMoSVByb3QgcHJvdCkgeworICAgICAgICAgICAgc3VwZXIocHJvdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRE1EIEBAQlVHQEA6IElmIHRoZXNlIGFyZSBub3QgcHJlc2VudCBpbiB0aGlzIGNsYXNzICh3b3VsZCBiZSkKKyAgICAgICAgLy8gaW5oZXJpdGVkIGFueXdheSwgwrtub3QgaW1wbGVtZW50ZWTCqyBlcnJvcnMgYXJlIHJhaXNlZC4KKyAgICAgICAgb3ZlcnJpZGUgSVByb3QgaW5wdXRQcm90b2NvbCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLmlucHV0UHJvdG9jb2w7CisgICAgICAgIH0KKyAgICAgICAgb3ZlcnJpZGUgT1Byb3Qgb3V0cHV0UHJvdG9jb2woKSBAcHJvcGVydHkgeworICAgICAgICAgIHJldHVybiBzdXBlci5vdXRwdXRQcm90b2NvbDsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVENsaWVudCA6IFRDbGllbnRCYXNlIUludGVyZmFjZSB7IjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgYWxpYXMgSW5wdXRQcm90b2NvbCBJUHJvdDsKKyAgICAgICAgc3RhdGljIGlmIChpc1RQcm90b2NvbCFPdXRwdXRQcm90b2NvbCkgeworICAgICAgICAgIGFsaWFzIE91dHB1dFByb3RvY29sIE9Qcm90OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXRpYyBhc3NlcnQoaXMoT3V0cHV0UHJvdG9jb2wgPT0gdm9pZCkpOworICAgICAgICAgIGFsaWFzIElucHV0UHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0KKworICAgICAgICB0aGlzKElQcm90IGlwcm90LCBPUHJvdCBvcHJvdCkgeworICAgICAgICAgIGlwcm90XyA9IGlwcm90OworICAgICAgICAgIG9wcm90XyA9IG9wcm90OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGlmIChpcyhJUHJvdCA9PSBPUHJvdCkpIHsKKyAgICAgICAgICB0aGlzKElQcm90IHByb3QpIHsKKyAgICAgICAgICAgIHRoaXMocHJvdCwgcHJvdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSVByb3QgaW5wdXRQcm90b2NvbCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIGlwcm90XzsKKyAgICAgICAgfQorCisgICAgICAgIE9Qcm90IG91dHB1dFByb3RvY29sKCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gb3Byb3RfOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIElQcm90IGlwcm90XzsKKyAgICAgICAgcHJvdGVjdGVkIE9Qcm90IG9wcm90XzsKKyAgICAgICAgcHJvdGVjdGVkIGludCBzZXFpZF87CisgICAgICB9OworICAgIH0KKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBJbnRlcmZhY2UpKSB7CisgICAgICBzdGF0aWMgaWYgKGlzU29tZUZ1bmN0aW9uIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpIHsKKyAgICAgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgICAgIFRNZXRob2RNZXRhIG1ldGhvZE1ldGE7CisgICAgICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICAgICAgICBtZXRob2RNZXRhID0gbWV0YS5mcm9udDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgY29kZSBmb3Igc2VuZGluZy4KKyAgICAgICAgc3RyaW5nW10gcGFyYW1MaXN0OworICAgICAgICBzdHJpbmcgcGFyYW1Bc3NpZ25Db2RlOworICAgICAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICAgIC8vIFVzZSB0aGUgcGFyYW0gbmFtZSBzcGVmaWNpZWQgaW4gdGhlIG1ldGEgaW5mb3JtYXRpb24gaWYgYW55IOKAkworICAgICAgICAgIC8vIGp1c3QgY29zbWV0aWNzIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICBzdHJpbmcgcGFyYW1OYW1lOworICAgICAgICAgIGlmIChtZXRob2RNZXRhRm91bmQgJiYgaSA8IG1ldGhvZE1ldGEucGFyYW1zLmxlbmd0aCkgeworICAgICAgICAgICAgcGFyYW1OYW1lID0gbWV0aG9kTWV0YS5wYXJhbXNbaV0ubmFtZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1OYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW1tdXRhYmxlIHN0b3JhZ2UgPSBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3NUdXBsZSEoCisgICAgICAgICAgICBtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSlbaV07CisgICAgICAgICAgcGFyYW1MaXN0IH49ICgoc3RvcmFnZSAmIFBhcmFtZXRlclN0b3JhZ2VDbGFzcy5yZWZfKSA/ICJyZWYgIiA6ICIiKSB+CisgICAgICAgICAgICAiUGFyYW1ldGVyVHlwZVR1cGxlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKVsiIH4KKyAgICAgICAgICAgIHRvIXN0cmluZyhpKSB+ICJdICIgfiBwYXJhbU5hbWU7CisgICAgICAgICAgcGFyYW1Bc3NpZ25Db2RlIH49ICJhcmdzLiIgfiBwYXJhbU5hbWUgfiAiID0gJiIgfiBwYXJhbU5hbWUgfiAiO1xuIjsKKyAgICAgICAgfQorICAgICAgICBjb2RlIH49ICJSZXR1cm5UeXBlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKSAiIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICAgIigiIH4gY3RmZUpvaW4ocGFyYW1MaXN0KSB+ICIpIHtcbiI7CisKKyAgICAgICAgY29kZSB+PSAiaW1tdXRhYmxlIG1ldGhvZE5hbWUgPSBgIiB+IG1ldGhvZE5hbWUgfiAiYDtcbiI7CisKKyAgICAgICAgaW1tdXRhYmxlIHBhcmFtU3RydWN0VHlwZSA9CisgICAgICAgICAgIlRQYXJnc1N0cnVjdCEoSW50ZXJmYWNlLCBgIiB+IG1ldGhvZE5hbWUgfiAiYCkiOworICAgICAgICBjb2RlIH49IHBhcmFtU3RydWN0VHlwZSB+ICIgYXJncyA9ICIgfiBwYXJhbVN0cnVjdFR5cGUgfiAiKCk7XG4iOworICAgICAgICBjb2RlIH49IHBhcmFtQXNzaWduQ29kZTsKKyAgICAgICAgY29kZSB+PSAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlKGAiIH4gbWV0aG9kTmFtZSB+ICJgLCAiOworICAgICAgICBjb2RlIH49ICgobWV0aG9kTWV0YUZvdW5kICYmIG1ldGhvZE1ldGEudHlwZSA9PSBUTWV0aG9kVHlwZS5PTkVXQVkpCisgICAgICAgICAgICAgICAgID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIik7CisgICAgICAgIGNvZGUgfj0gIiwgKytzZXFpZF8pKTtcbiI7CisgICAgICAgIGNvZGUgfj0gImFyZ3Mud3JpdGUob3Byb3RfKTtcbiI7CisgICAgICAgIGNvZGUgfj0gIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTtcbiI7CisgICAgICAgIGNvZGUgfj0gIm9wcm90Xy50cmFuc3BvcnQuZmx1c2goKTtcbiI7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBvbmV3YXkgbWV0aG9kLCBnZW5lcmF0ZSB0aGUgcmVjZWl2aW5nIGNvZGUuCisgICAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kIHx8IG1ldGhvZE1ldGEudHlwZSAhPSBUTWV0aG9kVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgICBjb2RlIH49ICJUUHJlc3VsdFN0cnVjdCEoSW50ZXJmYWNlLCBgIiB+IG1ldGhvZE5hbWUgfiAiYCkgcmVzdWx0O1xuIjsKKworICAgICAgICAgIGlmICghaXMoUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpID09IHZvaWQpKSB7CisgICAgICAgICAgICBjb2RlIH49ICJSZXR1cm5UeXBlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKSBfcmV0dXJuO1xuIjsKKyAgICAgICAgICAgIGNvZGUgfj0gInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47XG4iOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFRPRE86IFRoZSBDKysgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBtYXRjaGluZyBtZXRob2QgbmFtZSBoZXJlLAorICAgICAgICAgIC8vIHNob3VsZCB3ZSBkbyBhcyB3ZWxsPworICAgICAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgICAgIGF1dG8gbXNnID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgICAgIHNjb3BlIChleGl0KSB7CisgICAgICAgICAgICAgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgICBpcHJvdF8udHJhbnNwb3J0LnJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsKKyAgICAgICAgICAgICAgYXV0byB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgeC5yZWFkKGlwcm90Xyk7CisgICAgICAgICAgICAgIGlwcm90Xy50cmFuc3BvcnQucmVhZEVuZCgpOworICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy50eXBlICE9IFRNZXNzYWdlVHlwZS5SRVBMWSkgeworICAgICAgICAgICAgICBza2lwKGlwcm90XywgVFR5cGUuU1RSVUNUKTsKKyAgICAgICAgICAgICAgaXByb3RfLnRyYW5zcG9ydC5yZWFkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgfiAiIGZhaWxlZDogT3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlLiIsCisgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlR5cGUuQkFEX1NFUVVFTkNFX0lECisgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQucmVhZChpcHJvdF8pOworICAgICAgICAgIH07CisKKyAgICAgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kKSB7CisgICAgICAgICAgICBmb3JlYWNoIChlOyBtZXRob2RNZXRhLmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgICAgY29kZSB+PSAiaWYgKHJlc3VsdC5pc1NldCFgIiB+IGUubmFtZSB+ICJgKSB0aHJvdyByZXN1bHQuIiB+CisgICAgICAgICAgICAgICAgZS5uYW1lIH4gIjtcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFpcyhSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkgPT0gdm9pZCkpIHsKKyAgICAgICAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1NldCFgc3VjY2Vzc2ApIHJldHVybiBfcmV0dXJuOworICAgICAgICAgICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgfiAiIGZhaWxlZDogVW5rbm93biByZXN1bHQuIiwKKyAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5NSVNTSU5HX1JFU1VMVAorICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIFRDbGllbnQgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgcHJvdG9jb2wgdHlwZXMsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVENsaWVudCEoSW50ZXJmYWNlLCBQcm90KSB0Q2xpZW50KEludGVyZmFjZSwgUHJvdCkoUHJvdCBwcm90KSBpZiAoCisgIGlzU2VydmljZSFJbnRlcmZhY2UgJiYgaXNUUHJvdG9jb2whUHJvdAorKSB7CisgIHJldHVybiBuZXcgVENsaWVudCEoSW50ZXJmYWNlLCBQcm90KShwcm90KTsKK30KKworLy8vIERpdHRvCitUQ2xpZW50IShJbnRlcmZhY2UsIElQcm90LCBPcHJvdCkgdENsaWVudChJbnRlcmZhY2UsIElQcm90LCBPUHJvdCkKKyAgKElQcm90IGlwcm90LCBPUHJvdCBvcHJvdCkgaWYgKAorICBpc1NlcnZpY2UhSW50ZXJmYWNlICYmIGlzVFByb3RvY29sIUlQcm90ICYmIGlzVFByb3RvY29sIU9Qcm90CispIHsKKyAgcmV0dXJuIG5ldyBUQ2xpZW50IShJbnRlcmZhY2UsIElQcm90LCBPUHJvdCkoaXByb3QsIG9wcm90KTsKK30KKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBhcmd1bWVudHMgb2YgYSBUaHJpZnQgbWV0aG9kIGNhbGwsIGFzIHBvaW50ZXJzIHRvIHRoZSAoY29uc3QpCisgKiBwYXJhbWV0ZXIgdHlwZSB0byBhdm9pZCBjb3B5aW5nLgorICoKKyAqIFRoZXJlIHNob3VsZCB1c3VhbGx5IGJlIG5vIHJlYXNvbiB0byB1c2UgdGhpcyBzdHJ1Y3QgZGlyZWN0bHkgd2l0aG91dCB0aGUKKyAqIGhlbHAgb2YgVENsaWVudCwgYnV0IGl0IGlzIGRvY3VtZW50ZWQgcHVibGljbHkgdG8gaGVscCBkZWJ1Z2dpbmcgaW4gY2FzZQorICogb2YgQ1RGRSBlcnJvcnMuCisgKgorICogQ29uc2lkZXIgdGhpcyBleGFtcGxlOgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgaW50IGJhcihzdHJpbmcgYSwgYm9vbCBiKTsKKyAqCisgKiAgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAqICAgICBUTWV0aG9kTWV0YSgiYmFyIiwgW1RQYXJhbU1ldGEoImEiLCAxKSwgVFBhcmFtTWV0YSgiYiIsIDIpXSkKKyAqICAgXTsKKyAqIH0KKyAqCisgKiBhbGlhcyBUUGFyZ3NTdHJ1Y3QhKEZvbywgImJhciIpIEZvb0JhclBhcmdzOworICogLS0tCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgRm9vQmFyUGFyZ3MgaXMgZXF1aXZhbGVudCB0byAoaWdub3JpbmcgdGhlIG5lY2Vzc2FyeQorICogbWV0YWRhdGEgdG8gYXNzaWduIHRoZSBmaWVsZCBJRHMpOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vQmFyUGFyZ3MgeworICogICBjb25zdChzdHJpbmcpKiBhOworICogICBjb25zdChib29sKSogYjsKKyAqCisgKiAgIHZvaWQgd3JpdGUoUHJvdG9jb2wpKFByb3RvY29sIHByb3RvKSBjb25zdCBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpOworICogfQorICogLS0tCisgKi8KK3RlbXBsYXRlIFRQYXJnc1N0cnVjdChJbnRlcmZhY2UsIHN0cmluZyBtZXRob2ROYW1lKSB7CisgIHN0YXRpYyBhc3NlcnQoaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSksCisgICAgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiAnIiB+IEludGVyZmFjZS5zdHJpbmdvZiB+ICInLiIpOworICBtaXhpbih7CisgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgVE1ldGhvZE1ldGEgbWV0aG9kTWV0YTsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgYXV0byBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgICBtZXRob2RNZXRhID0gbWV0YS5mcm9udDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgbWVtYmVyQ29kZTsKKyAgICBzdHJpbmdbXSBmaWVsZE1ldGFDb2RlczsKKyAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgLy8gSWYgd2UgaGF2ZSBubyBtZXRhIGluZm9ybWF0aW9uLCBqdXN0IHVzZSBwYXJhbTEsIHBhcmFtMiwgZXRjLiBhcworICAgICAgLy8gZmllbGQgbmFtZXMsIGl0IHNob3VsZG4ndCByZWFsbHkgbWF0dGVyIGFueXdheS4gMS1iYXNlZCDCu2luZGV4aW5nwqsKKyAgICAgIC8vIGlzIHVzZWQgdG8gbWF0Y2ggdGhlIGNvbW1vbiBzY2hlbWUgaW4gdGhlIFRocmlmdCB3b3JsZC4KKyAgICAgIHN0cmluZyBtZW1iZXJJZDsKKyAgICAgIHN0cmluZyBtZW1iZXJOYW1lOworICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCAmJiBpIDwgbWV0aG9kTWV0YS5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgIG1lbWJlcklkID0gdG8hc3RyaW5nKG1ldGhvZE1ldGEucGFyYW1zW2ldLmlkKTsKKyAgICAgICAgbWVtYmVyTmFtZSA9IG1ldGhvZE1ldGEucGFyYW1zW2ldLm5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1iZXJJZCA9IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIG1lbWJlck5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgIH0KKworICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgRE1EIEBAQlVHQEAgNjA1NjogbWFrZSBhbiBpbnRlcm1lZGlhcnkgYWxpYXMgZm9yIHRoZQorICAgICAgLy8gcGFyYW1ldGVyIHR5cGUsIGFuZCBkZWNsYXJlIHRoZSBtZW1iZXIgdXNpbmcgY29uc3QobWVtYmVyTmFtZVR5cGUpKi4KKyAgICAgIG1lbWJlckNvZGUgfj0gImFsaWFzIFBhcmFtZXRlclR5cGVUdXBsZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIilbIiB+IHRvIXN0cmluZyhpKSB+ICJdICIgfiBtZW1iZXJOYW1lIH4gIlR5cGU7XG4iOworICAgICAgbWVtYmVyQ29kZSB+PSAiY29uc3QoIiB+IG1lbWJlck5hbWUgfiAiVHlwZSkqICIgfiBtZW1iZXJOYW1lIH4gIjtcbiI7CisKKyAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGAiIH4gbWVtYmVyTmFtZSB+ICJgLCAiIH4gbWVtYmVySWQgfgorICAgICAgICAiLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSI7CisgICAgfQorCisgICAgc3RyaW5nIGNvZGUgPSAic3RydWN0IFRQYXJnc1N0cnVjdCB7XG4iOworICAgIGNvZGUgfj0gbWVtYmVyQ29kZTsKKyAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kICYmCisgICAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4uYmFzZS5UUGFyZ3NTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gc2VydmljZSAnIiB+CisgICAgICAgICAgSW50ZXJmYWNlLnN0cmluZ29mIH4gIicgZm91bmQuYCk7XG4iOworICAgICAgfQorICAgIH0KKyAgICBjb2RlIH49ICJ2b2lkIHdyaXRlKFApKFAgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQKSB7XG4iOworICAgIGNvZGUgfj0gIndyaXRlU3RydWN0ISh0eXBlb2YodGhpcyksIFAsIFsiIH4gY3RmZUpvaW4oZmllbGRNZXRhQ29kZXMpIH4KKyAgICAgICJdLCB0cnVlKSh0aGlzLCBwcm90byk7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBUaHJpZnQgbWV0aG9kIGNhbGwsIHVzaW5nIGEgcG9pbnRlciB0byB0aGUgcmV0dXJuCisgKiB2YWx1ZSB0byBhdm9pZCBjb3B5aW5nLgorICoKKyAqIFRoZXJlIHNob3VsZCB1c3VhbGx5IGJlIG5vIHJlYXNvbiB0byB1c2UgdGhpcyBzdHJ1Y3QgZGlyZWN0bHkgd2l0aG91dCB0aGUKKyAqIGhlbHAgb2YgVENsaWVudCwgYnV0IGl0IGlzIGRvY3VtZW50ZWQgcHVibGljbHkgdG8gaGVscCBkZWJ1Z2dpbmcgaW4gY2FzZQorICogb2YgQ1RGRSBlcnJvcnMuCisgKgorICogQ29uc2lkZXIgdGhpcyBleGFtcGxlOgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgaW50IGJhcihzdHJpbmcgYSk7CisgKgorICogICBhbGlhcyAuRm9vRXhjZXB0aW9uIEZvb0V4Y2VwdGlvbjsKKyAqCisgKiAgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAqICAgICBUTWV0aG9kTWV0YSgiYmFyIiwKKyAqICAgICAgIFtUUGFyYW1NZXRhKCJhIiwgMSldLAorICogICAgICAgW1RFeGNlcHRpb25NZXRhKCJmb29lIiwgMSwgIkZvb0V4Y2VwdGlvbiIpXQorICogICAgICkKKyAqICAgXTsKKyAqIH0KKyAqIGFsaWFzIFRQcmVzdWx0U3RydWN0IShGb28sICJiYXIiKSBGb29CYXJQcmVzdWx0OworICogLS0tCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgRm9vQmFyUHJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIChpZ25vcmluZyB0aGUgbmVjZXNzYXJ5CisgKiBtZXRhZGF0YSB0byBhc3NpZ24gdGhlIGZpZWxkIElEcyk6CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJQcmVzdWx0IHsKKyAqICAgaW50KiBzdWNjZXNzOworICogICBGb28uRm9vRXhjZXB0aW9uIGZvb2U7CisgKgorICogICBzdHJ1Y3QgSXNTZXRGbGFncyB7CisgKiAgICAgYm9vbCBzdWNjZXNzOworICogICB9CisgKiAgIElzU2V0RmxhZ3MgaXNTZXRGbGFnczsKKyAqCisgKiAgIGJvb2wgaXNTZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBjb25zdCBAcHJvcGVydHk7CisgKiAgIHZvaWQgcmVhZChQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKiB9CisgKiAtLS0KKyAqLwordGVtcGxhdGUgVFByZXN1bHRTdHJ1Y3QoSW50ZXJmYWNlLCBzdHJpbmcgbWV0aG9kTmFtZSkgeworICBzdGF0aWMgYXNzZXJ0KGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpLAorICAgICJDb3VsZCBub3QgZmluZCBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gJyIgfiBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJy4iKTsKKworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGUgPSAic3RydWN0IFRQcmVzdWx0U3RydWN0IHtcbiI7CisKKyAgICBzdHJpbmdbXSBmaWVsZE1ldGFDb2RlczsKKworICAgIGFsaWFzIFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSBSZXN1bHRUeXBlOworICAgIHN0YXRpYyBpZiAoIWlzKFJlc3VsdFR5cGUgPT0gdm9pZCkpIHsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKiBzdWNjZXNzOworICAgICAgfTsKKyAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGBzdWNjZXNzYCwgMCwgVFJlcS5PUFRJT05BTCkiOworCisgICAgICBzdGF0aWMgaWYgKCFpc051bGxhYmxlIVJlc3VsdFR5cGUpIHsKKyAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgIHN0cnVjdCBJc1NldEZsYWdzIHsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzczsKKyAgICAgICAgICB9CisgICAgICAgICAgSXNTZXRGbGFncyBpc1NldEZsYWdzOworICAgICAgICB9OworICAgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgaXNTZXRGbGFnc2AsIDAsIFRSZXEuSUdOT1JFKSI7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgIGF1dG8gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChJbnRlcmZhY2UubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgZm9yZWFjaCAoZTsgbWV0YS5mcm9udC5leGNlcHRpb25zKSB7CisgICAgICAgICAgY29kZSB+PSAiSW50ZXJmYWNlLiIgfiBlLnR5cGUgfiAiICIgfiBlLm5hbWUgfiAiO1xuIjsKKyAgICAgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgIiB+IGUubmFtZSB+ICJgLCAiIH4gdG8hc3RyaW5nKGUuaWQpIH4KKyAgICAgICAgICAgICIsIFRSZXEuT1BUSU9OQUwpIjsKKyAgICAgICAgfQorICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgJiYKKyAgICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkubGVuZ3RoID4gMCkKKyAgICAgIHsKKyAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLlRQcmVzdWx0U3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluIHNlcnZpY2UgJyIgfgorICAgICAgICAgIEludGVyZmFjZS5zdHJpbmdvZiB+ICInIGZvdW5kLmApO1xuIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlIH49IHF7CisgICAgICBib29sIGlzU2V0KHN0cmluZyBmaWVsZE5hbWUpKCkgY29uc3QgQHByb3BlcnR5IGlmICgKKyAgICAgICAgaXMoTWVtYmVyVHlwZSEodHlwZW9mKHRoaXMpLCBmaWVsZE5hbWUpKQorICAgICAgKSB7CisgICAgICAgIHN0YXRpYyBpZiAoZmllbGROYW1lID09ICJzdWNjZXNzIikgeworICAgICAgICAgIHN0YXRpYyBpZiAoaXNOdWxsYWJsZSEodHlwZW9mKCpzdWNjZXNzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAqc3VjY2VzcyAhaXMgbnVsbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGlzU2V0RmxhZ3Muc3VjY2VzczsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gV2UgYXJlIGRlYWxpbmcgd2l0aCBhbiBleGNlcHRpb24gbWVtYmVyLCB3aGljaCwgYmVpbmcgYSBudWxsYWJsZQorICAgICAgICAgIC8vIHR5cGUgKGV4Y2VwdGlvbnMgYXJlIGFsd2F5cyBjbGFzc2VzKSwgaGFzIG5vIGlzU2V0IGZsYWcuCisgICAgICAgICAgcmV0dXJuIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcywgZmllbGROYW1lKSAhaXMgbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBjb2RlIH49ICJ2b2lkIHJlYWQoUCkoUCBwcm90bykgaWYgKGlzVFByb3RvY29sIVApIHtcbiI7CisgICAgY29kZSB+PSAicmVhZFN0cnVjdCEodHlwZW9mKHRoaXMpLCBQLCBbIiB+IGN0ZmVKb2luKGZpZWxkTWV0YUNvZGVzKSB+CisgICAgICAiXSwgdHJ1ZSkodGhpcywgcHJvdG8pO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50X3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmI3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50X3Bvb2wuZApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmNsaWVudF9wb29sOworCitpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbiwgVGlja0R1cmF0aW9uOworaW1wb3J0IHN0ZC50cmFpdHMgOiBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnJlc291cmNlX3Bvb2w7CisKKy8qKgorICogTWFuYWdlcyBhIHBvb2wgb2YgVENsaWVudHMgZm9yIHRoZSBnaXZlbiBpbnRlcmZhY2UsIGZvcndhcmRpbmcgUlBDIGNhbGxzIHRvCisgKiBtZW1iZXJzIG9mIHRoZSBwb29sLgorICoKKyAqIElmIGEgcmVxdWVzdCBmYWlscywgYW5vdGhlciBjbGllbnQgZnJvbSB0aGUgcG9vbCBpcyB0cmllZCwgYW5kIG9wdGlvbmFsbHksCisgKiBhIGNsaWVudCBpcyBkaXNhYmxlZCBmb3IgYSBjb25maWd1cmFibGUgYW1vdW50IG9mIHRpbWUgaWYgaXQgZmFpbHMgdG9vCisgKiBvZnRlbi4gSWYgYWxsIGNsaWVudHMgZmFpbCAoYW5kIGtlZXBUcnlpbmcgaXMgZmFsc2UpLCBhCisgKiBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24gaXMgdGhyb3duLCBjb250YWluaW5nIGFsbCB0aGUgY29sbGVjdGVkIFJQQworICogZXhjZXB0aW9ucy4KKyAqLworY2xhc3MgVENsaWVudFBvb2woSW50ZXJmYWNlKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgOiBJbnRlcmZhY2UgeworICAvLy8gU2hvcnRoYW5kIGZvciBUQ2xpZW50QmFzZSFJbnRlcmZhY2UsIHRoZSBjbGllbnQgdHlwZSB0aGlzIGluc3RhbmNlCisgIC8vLyBvcGVyYXRlcyBvbi4KKyAgYWxpYXMgVENsaWVudEJhc2UhSW50ZXJmYWNlIENsaWVudDsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBhbmQgYWRkcyB0aGUgZ2l2ZW4gY2xpZW50cyB0byB0aGUgcG9vbC4KKyAgICovCisgIHRoaXMoQ2xpZW50W10gY2xpZW50cykgeworICAgIHBvb2xfID0gbmV3IFRSZXNvdXJjZVBvb2whQ2xpZW50KGNsaWVudHMpOworCisgICAgcnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKyAgICAgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisgICAgICByZXR1cm4gKAorICAgICAgICAoY2FzdChUVHJhbnNwb3J0RXhjZXB0aW9uKWUgIWlzIG51bGwpIHx8CisgICAgICAgIChjYXN0KFRBcHBsaWNhdGlvbkV4Y2VwdGlvbillICFpcyBudWxsKQorICAgICAgKTsKKyAgICB9OworICB9CisKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGFuIG9wZXJhdGlvbiBvbiB0aGUgZmlyc3QgY3VycmVudGx5IGFjdGl2ZSBjbGllbnQuCisgICAqCisgICAqIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgKHRocm93cyBhbiBleGNlcHRpb24gZm9yIHdoaWNoIHJwY0ZhdWx0RmlsdGVyIGlzCisgICAqIHRydWUpLCB0aGUgZmFpbHVyZSBpcyByZWNvcmRlZCBhbmQgdGhlIG5leHQgY2xpZW50IGluIHRoZSBwb29sIGlzIHRyaWVkLgorICAgKgorICAgKiBUaHJvd3M6IEFueSBub24tcnBjIGV4Y2VwdGlvbiB0aGF0IG9jY3VycywgYSBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24KKyAgICogICBpZiBhbGwgY2xpZW50cyBmYWlsZWQgd2l0aCBhbiBycGMgZXhjZXB0aW9uIChpZiBrZWVwVHJ5aW5nIGlzIGZhbHNlKS4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICogLS0tCisgICAqIGludGVyZmFjZSBGb28geyBzdHJpbmcgYmFyKCk7IH0KKyAgICogYXV0byBwb29sQ2xpZW50ID0gdENsaWVudFBvb2woW3RDbGllbnQhRm9vKHNvbWVQcm90b2NvbCldKTsKKyAgICogYXV0byByZXN1bHQgPSBwb29sQ2xpZW50LmV4ZWN1dGUoKGMpeyByZXR1cm4gYy5iYXIoKTsgfSk7CisgICAqIC0tLQorICAgKi8KKyAgUmVzdWx0VHlwZSBleGVjdXRlKFJlc3VsdFR5cGUpKHNjb3BlIFJlc3VsdFR5cGUgZGVsZWdhdGUoQ2xpZW50KSB3b3JrKSB7CisgICAgcmV0dXJuIGV4ZWN1dGVPblBvb2whQ2xpZW50KHdvcmspOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSBjbGllbnQgdG8gdGhlIHBvb2wuCisgICAqLworICB2b2lkIGFkZENsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgcG9vbF8uYWRkKGNsaWVudCk7CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlcyBhIGNsaWVudCBmcm9tIHRoZSBwb29sLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSBjbGllbnQgd2FzIGZvdW5kIGluIHRoZSBwb29sLgorICAgKi8KKyAgYm9vbCByZW1vdmVDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIHJldHVybiBwb29sXy5yZW1vdmUoY2xpZW50KTsKKyAgfQorCisgIG1peGluKHBvb2xGb3J3YXJkQ29kZSFJbnRlcmZhY2UoKSk7CisKKyAgLy8vIFdoZXRoZXIgdG8gb3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnRzIG9mIGEgY2xpZW50IGJlZm9yZSB0cnlpbmcgdG8KKyAgLy8vIGV4ZWN1dGUgYSBtZXRob2QgaWYgdGhleSBhcmUgbm90IG9wZW4uIFRoaXMgaXMgdXN1YWxseSBkZXNpcmFibGUKKyAgLy8vIGJlY2F1c2UgaXQgYWxsb3dzIGUuZy4gdG8gYXV0b21hdGljYWxseSByZWNvbm5lY3QgdG8gYSByZW1vdGUgc2VydmVyCisgIC8vLyBpZiB0aGUgbmV0d29yayBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCisgIC8vLworICAvLy8gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzID0gdHJ1ZTsKKworICAvLy8gQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGV4Y2VwdGlvbiBjb21lcyBmcm9tIGEgY2xpZW50IGZyb20gdGhlCisgIC8vLyBwb29sIG5vdCB3b3JraW5nIHByb3Blcmx5LCBvciBpZiBpdCBhbiBleGNlcHRpb24gdGhyb3duIGF0IHRoZQorICAvLy8gYXBwbGljYXRpb24gbGV2ZWwuCisgIC8vLworICAvLy8gSWYgdGhlIGRlbGVnYXRlIHJldHVybnMgdHJ1ZSwgdGhlIHNlcnZlci9jb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAgLy8vIGF0IGZhdWx0LCBpZiBpdCByZXR1cm5zIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIGp1c3QgcGFzc2VkIG9uIHRvIHRoZQorICAvLy8gY2FsbGVyLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQsIHJldHVybnMgdHJ1ZSBmb3IgaW5zdGFuY2VzIG9mIFRUcmFuc3BvcnRFeGNlcHRpb24gYW5kCisgIC8vLyBUQXBwbGljYXRpb25FeGNlcHRpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGtlZXAgdHJ5aW5nIHRvIGZpbmQgYSB3b3JraW5nIGNsaWVudCBpZiBhbGwgaGF2ZSBmYWlsZWQgaW4gYQorICAgKiByb3cuCisgICAqCisgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgKi8KKyAgYm9vbCBrZWVwVHJ5aW5nKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uY3ljbGU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBrZWVwVHJ5aW5nKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uY3ljbGUgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBhIHJhbmRvbSBwZXJtdXRhdGlvbiBvZiB0aGUgY2xpZW50IHBvb2wgb24gZXZlcnkgY2FsbCB0bworICAgKiBleGVjdXRlKCkuIFRoaXMgY2FuIGJlIHVzZWQgZS5nLiBhcyBhIHNpbXBsZSBmb3JtIG9mIGxvYWQgYmFsYW5jaW5nLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgKi8KKyAgYm9vbCBwZXJtdXRlQ2xpZW50cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLnBlcm11dGU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBwZXJtdXRlQ2xpZW50cyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLnBlcm11dGUgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZhdWx0cyBhZnRlciB3aGljaCBhIGNsaWVudCBpcyBkaXNhYmxlZCB1bnRpbAorICAgKiBmYXVsdERpc2FibGVEdXJhdGlvbiBoYXMgcGFzc2VkLiAwIHRvIG5ldmVyIGRpc2FibGUgY2xpZW50cy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gMC4KKyAgICovCisgIHVzaG9ydCBmYXVsdERpc2FibGVDb3VudCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmZhdWx0RGlzYWJsZUNvdW50OworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgZmF1bHREaXNhYmxlQ291bnQodXNob3J0IHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmZhdWx0RGlzYWJsZUNvdW50ID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGR1cmF0aW9uIGZvciB3aGljaCBhIGNsaWVudCBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhZnRlciBpdCBoYXMKKyAgICogZmFpbGVkIHRvbyBvZnRlbi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gb25lIHNlY29uZC4KKyAgICovCisgIER1cmF0aW9uIGZhdWx0RGlzYWJsZUR1cmF0aW9uKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uZmF1bHREaXNhYmxlRHVyYXRpb247CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBmYXVsdERpc2FibGVEdXJhdGlvbihEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5mYXVsdERpc2FibGVEdXJhdGlvbiA9IHZhbHVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgUmVzdWx0VHlwZSBleGVjdXRlT25Qb29sKFJlc3VsdFR5cGUpKHNjb3BlIFJlc3VsdFR5cGUgZGVsZWdhdGUoQ2xpZW50KSB3b3JrKSB7CisgICAgYXV0byBjbGllbnRzID0gcG9vbF9bXTsKKyAgICBpZiAoY2xpZW50cy5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vIGNsaWVudHMgYXZhaWxhYmxlIHRvIHRyeS4iKTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgRXhjZXB0aW9uW10gcnBjRXhjZXB0aW9uczsKKyAgICAgIHdoaWxlICghY2xpZW50cy5lbXB0eSkgeworICAgICAgICBhdXRvIGMgPSBjbGllbnRzLmZyb250OworICAgICAgICBjbGllbnRzLnBvcEZyb250OworICAgICAgICB0cnkgeworICAgICAgICAgIHNjb3BlIChzdWNjZXNzKSB7CisgICAgICAgICAgICBwb29sXy5yZWNvcmRTdWNjZXNzKGMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZW9wZW5UcmFuc3BvcnRzKSB7CisgICAgICAgICAgICBjLmlucHV0UHJvdG9jb2wudHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICAgIGMub3V0cHV0UHJvdG9jb2wudHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gd29yayhjKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBpZiAocnBjRmF1bHRGaWx0ZXIgJiYgcnBjRmF1bHRGaWx0ZXIoZSkpIHsKKyAgICAgICAgICAgIHBvb2xfLnJlY29yZEZhdWx0KGMpOworICAgICAgICAgICAgcnBjRXhjZXB0aW9ucyB+PSBlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgZGVhbGluZyB3aXRoIGEgbm9ybWFsIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlCisgICAgICAgICAgICAvLyBzZXJ2ZXItc2lkZSBtZXRob2QsIGp1c3QgcGFzcyBpdCBvbi4gQXMgZmFyIGFzIHdlIGFyZQorICAgICAgICAgICAgLy8gY29uY2VybmVkLCB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZGVkLgorICAgICAgICAgICAgcG9vbF8ucmVjb3JkU3VjY2VzcyhjKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBubyBjbGllbnQgc3VjY2VlZGVkIGR1cmluZyB0aGUgY3VycmVudCBpdGVyYXRpb24uCisgICAgICBEdXJhdGlvbiB3YWl0VGltZTsKKyAgICAgIENsaWVudCBkdW1teTsKKyAgICAgIGlmIChjbGllbnRzLndpbGxCZWNvbWVOb25lbXB0eShkdW1teSwgd2FpdFRpbWUpKSB7CisgICAgICAgIGlmICh3YWl0VGltZSA+IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgIGltcG9ydCBjb3JlLnRocmVhZDsKKyAgICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKCJBbGwgY2xpZW50cyBmYWlsZWQuIiwKKyAgICAgICAgICBycGNFeGNlcHRpb25zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgVFJlc291cmNlUG9vbCFDbGllbnQgcG9vbF87Cit9CisKK3ByaXZhdGUgeworICAvLyBDYW5ub3QgdXNlIGFuIGFub255bW91cyBkZWxlZ2F0ZSBsaXRlcmFsIGZvciB0aGlzIGJlY2F1c2UgdGhleSBhcmVuJ3QKKyAgLy8gYWxsb3dlZCBpbiBjbGFzcyBzY29wZS4KKyAgc3RyaW5nIHBvb2xGb3J3YXJkQ29kZShJbnRlcmZhY2UpKCkgeworICAgIHN0cmluZyBjb2RlID0gIiI7CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBBbGxNZW1iZXJNZXRob2ROYW1lcyFJbnRlcmZhY2UpIHsKKyAgICAgIGVudW0gcW4gPSAiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lOworICAgICAgY29kZSB+PSAiUmV0dXJuVHlwZSEoIiB+IHFuIH4gIikgIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKFBhcmFtZXRlclR5cGVUdXBsZSEoIiB+IHFuIH4gIikgYXJncykge1xuIjsKKyAgICAgIGNvZGUgfj0gInJldHVybiBleGVjdXRlT25Qb29sKChDbGllbnQgYyl7IHJldHVybiBjLiIgfgorICAgICAgICBtZXRob2ROYW1lIH4gIihhcmdzKTsgfSk7XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKKyAgfQorfQorCisvKioKKyAqIFRDbGllbnRQb29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgc3BlY2lmeQorICogdGhlIGludGVyZmFjZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcgSUZUSQorICogKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RDbGllbnRQb29sIUludGVyZmFjZSB0Q2xpZW50UG9vbChJbnRlcmZhY2UpKAorICBUQ2xpZW50QmFzZSFJbnRlcmZhY2VbXSBjbGllbnRzCispIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSB7CisgIHJldHVybiBuZXcgdHlwZW9mKHJldHVybikoY2xpZW50cyk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4ODkzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZApAQCAtMCwwICsxLDc3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIENvbnRhaW5zIDxiPmV4cGVyaW1lbnRhbDwvYj4gZnVuY3Rpb25hbGl0eSBmb3IgZ2VuZXJhdGluZyBUaHJpZnQgSURMIGZpbGVzCisgKiAoLnRocmlmdCkgZnJvbSBleGlzdGluZyBEIGRhdGEgc3RydWN0dXJlcywgaS5lLiB0aGUgcmV2ZXJzZSBvZiB3aGF0IHRoZQorICogVGhyaWZ0IGNvbXBpbGVyIGRvZXMuCisgKi8KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5pZGxnZW47CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogZmluZDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQudHJhaXRzIDogRW51bU1lbWJlcnMsIGlzU29tZUZ1bmN0aW9uLCBPcmlnaW5hbFR5cGUsCisgIFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgc3RhdGljSW5kZXhPZiwgc3RhdGljTWFwLCBOb0R1cGxpY2F0ZXMsCisgIFR5cGVUdXBsZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jdGZlOworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CisKKy8qKgorICogVHJ1ZSBpZiB0aGUgcGFzc2VkIHR5cGUgaXMgYSBUaHJpZnQgZW50aXR5IChzdHJ1Y3QsIGV4Y2VwdGlvbiwgZW51bSwKKyAqIHNlcnZpY2UpLgorICovCithbGlhcyBBbnkhKGlzU3RydWN0LCBpc0V4Y2VwdGlvbiwgaXNFbnVtLCBpc1NlcnZpY2UpIGlzVGhyaWZ0RW50aXR5OworCisvKioKKyAqIFJldHVybnMgYW4gSURMIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgwrtyb290wqsgZW50aXRpZXMgYW5kIGFsbCB0eXBlcworICogdGhleSBkZXBlbmQgb24uCisgKi8KK3RlbXBsYXRlIGlkbFN0cmluZyhSb290cy4uLikgaWYgKGFsbFNhdGlzZnkhKGlzVGhyaWZ0RW50aXR5LCBSb290cykpIHsKKyAgZW51bSBpZGxTdHJpbmcgPSBpZGxTdHJpbmdJbXBsIVJvb3RzLnJlc3VsdDsKK30KKworcHJpdmF0ZSB7CisgIHRlbXBsYXRlIGlkbFN0cmluZ0ltcGwoUm9vdHMuLi4pIGlmIChhbGxTYXRpc2Z5IShpc1RocmlmdEVudGl0eSwgUm9vdHMpKSB7CisgICAgYWxpYXMgRm9yQWxsV2l0aExpc3QhKAorICAgICAgQ29uZmluZWRUdXBsZSEoU3RhdGljRmlsdGVyIShpc1NlcnZpY2UsIFJvb3RzKSksCisgICAgICBBZGRCYXNlU2VydmljZXMKKyAgICApIFNlcnZpY2VzOworCisgICAgYWxpYXMgVHlwZVR1cGxlISgKKyAgICAgIFN0YXRpY0ZpbHRlciEoaXNFbnVtLCBSb290cyksCisgICAgICBGb3JBbGxXaXRoTGlzdCEoCisgICAgICAgIENvbmZpbmVkVHVwbGUhKAorICAgICAgICAgIFN0YXRpY0ZpbHRlciEoQW55IShpc0V4Y2VwdGlvbiwgaXNTdHJ1Y3QpLCBSb290cyksCisgICAgICAgICAgc3RhdGljTWFwIShDb21wb3NpdGVUeXBlRGVwcywgc3RhdGljTWFwIShTZXJ2aWNlVHlwZURlcHMsIFNlcnZpY2VzKSkKKyAgICAgICAgKSwKKyAgICAgICAgQWRkU3RydWN0V2l0aERlcHMKKyAgICAgICkKKyAgICApIFR5cGVzOworCisgICAgZW51bSByZXN1bHQgPSBjdGZlSm9pbigKKyAgICAgIFsKKyAgICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgICBlbnVtSWRsU3RyaW5nLAorICAgICAgICAgIFN0YXRpY0ZpbHRlciEoaXNFbnVtLCBUeXBlcykKKyAgICAgICAgKSwKKyAgICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgICBzdHJ1Y3RJZGxTdHJpbmcsCisgICAgICAgICAgU3RhdGljRmlsdGVyIShBbnkhKGlzU3RydWN0LCBpc0V4Y2VwdGlvbiksIFR5cGVzKQorICAgICAgICApLAorICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgIHNlcnZpY2VJZGxTdHJpbmcsCisgICAgICAgICAgU2VydmljZXMKKyAgICAgICAgKQorICAgICAgXSwKKyAgICAgICJcbiIKKyAgICApOworICB9CisKKyAgdGVtcGxhdGUgU2VydmljZVR5cGVEZXBzKFQpIGlmIChpc1NlcnZpY2UhVCkgeworICAgIGFsaWFzIHN0YXRpY01hcCEoCisgICAgICBQQXBwbHkhKE1ldGhvZFR5cGVEZXBzLCBUKSwKKyAgICAgIEZpbHRlck1ldGhvZE5hbWVzIShULCBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkpCisgICAgKSBTZXJ2aWNlVHlwZURlcHM7CisgIH0KKworICB0ZW1wbGF0ZSBNZXRob2RUeXBlRGVwcyhULCBzdHJpbmcgbmFtZSkgaWYgKAorICAgIGlzU2VydmljZSFUICYmIGlzU29tZUZ1bmN0aW9uIShNZW1iZXJUeXBlIShULCBuYW1lKSkKKyAgKSB7CisgICAgYWxpYXMgVHlwZVR1cGxlISgKKyAgICAgIFJldHVyblR5cGUhKE1lbWJlclR5cGUhKFQsIG5hbWUpKSwKKyAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpLAorICAgICAgRXhjZXB0aW9uVHlwZXMhKFQsIG5hbWUpCisgICAgKSBNZXRob2RUeXBlRGVwczsKKyAgfQorCisgIHRlbXBsYXRlIEV4Y2VwdGlvblR5cGVzKFQsIHN0cmluZyBuYW1lKSBpZiAoCisgICAgaXNTZXJ2aWNlIVQgJiYgaXNTb21lRnVuY3Rpb24hKE1lbWJlclR5cGUhKFQsIG5hbWUpKQorICApIHsKKyAgICBtaXhpbih7CisgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoZ2V0TWV0aG9kTWV0YSFULCBuYW1lKTsKKyAgICAgIGlmIChtZXRhLmVtcHR5KSByZXR1cm4gImFsaWFzIFR5cGVUdXBsZSEoKSBFeGNlcHRpb25UeXBlczsiOworCisgICAgICBzdHJpbmcgcmVzdWx0ID0gImFsaWFzIFR5cGVUdXBsZSEoIjsKKyAgICAgIGZvcmVhY2ggKGksIGU7IG1ldGEuZnJvbnQuZXhjZXB0aW9ucykgeworICAgICAgICBpZiAoaSA+IDApIHJlc3VsdCB+PSAiLCAiOworICAgICAgICByZXN1bHQgfj0gIm1peGluKGBULiIgfiBlLnR5cGUgfiAiYCkiOworICAgICAgfQorICAgICAgcmVzdWx0IH49ICIpIEV4Y2VwdGlvblR5cGVzOyI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0oKSk7CisgIH0KKworICB0ZW1wbGF0ZSBBZGRCYXNlU2VydmljZXMoVCwgTGlzdC4uLikgeworICAgIHN0YXRpYyBpZiAoc3RhdGljSW5kZXhPZiEoVCwgTGlzdCkgPT0gLTEpIHsKKyAgICAgIGFsaWFzIE5vRHVwbGljYXRlcyEoQmFzZVNlcnZpY2VzIVQsIExpc3QpIEFkZEJhc2VTZXJ2aWNlczsKKyAgICB9IGVsc2UgeworICAgICAgYWxpYXMgTGlzdCBBZGRTdHJ1Y3RXaXRoRGVwczsKKyAgICB9CisgIH0KKworICB1bml0dGVzdCB7CisgICAgaW50ZXJmYWNlIEEge30KKyAgICBpbnRlcmZhY2UgQiA6IEEge30KKyAgICBpbnRlcmZhY2UgQyA6IEIge30KKyAgICBpbnRlcmZhY2UgRCA6IEEge30KKworICAgIHN0YXRpYyBhc3NlcnQoaXMoQWRkQmFzZVNlcnZpY2VzIShDKSA9PSBUeXBlVHVwbGUhKEEsIEIsIEMpKSk7CisgICAgc3RhdGljIGFzc2VydChpcyhGb3JBbGxXaXRoTGlzdCEoQ29uZmluZWRUdXBsZSEoQywgRCksIEFkZEJhc2VTZXJ2aWNlcykgPT0KKyAgICAgIFR5cGVUdXBsZSEoQSwgRCwgQiwgQykpKTsKKyAgfQorCisgIHRlbXBsYXRlIEJhc2VTZXJ2aWNlcyhULCBSZXN0Li4uKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgICBzdGF0aWMgaWYgKGlzRGVyaXZlZFNlcnZpY2UhVCkgeworICAgICAgYWxpYXMgQmFzZVNlcnZpY2VzIShCYXNlU2VydmljZSFULCBULCBSZXN0KSBCYXNlU2VydmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoVCwgUmVzdCkgQmFzZVNlcnZpY2VzOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIEFkZFN0cnVjdFdpdGhEZXBzKFQsIExpc3QuLi4pIHsKKyAgICBzdGF0aWMgaWYgKHN0YXRpY0luZGV4T2YhKFQsIExpc3QpID09IC0xKSB7CisgICAgICAvLyBUIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBMaXN0LCBzbyBhZGQgVCBhbmQgdGhlIHR5cGVzIGl0IGRlcGVuZHMgb24gaW4KKyAgICAgIC8vIHRoZSBmcm9udC4gQmVjYXVzZSB3aXRoIHRoZSBUaHJpZnQgY29tcGlsZXIgdHlwZXMgY2FuIG9ubHkgZGVwZW5kIG9uCisgICAgICAvLyBvdGhlciB0eXBlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQsIHdlIGNvbGxlY3QgYWxsIHRoZQorICAgICAgLy8gZGVwZW5kZW5jaWVzLCBwcmVwZW5kIHRoZW0gdG8gdGhlIGxpc3QsIGFuZCB0aGVuIHBydW5lIHRoZSBkdXBsaWNhdGVzCisgICAgICAvLyAoa2VlcGluZyB0aGUgZmlyc3Qgb2NjdXJyZW5jZXMpLiBJZiB0aGlzIHJlcXVpcmVtZW50IHNob3VsZCBldmVyIGJlCisgICAgICAvLyBkcm9wcGVkIGZyb20gVGhyaWZ0LCB0aGlzIGNvdWxkIGJlIGVhc2lseSBhZGFwdGVkIHRvIGhhbmRsZSBjaXJjdWxhcgorICAgICAgLy8gZGVwZW5kZW5jaWVzIGJ5IHBhc3NpbmcgVHlwZVR1cGxlIShULCBMaXN0KSB0byBGb3JBbGxXaXRoTGlzdCBpbnN0ZWFkCisgICAgICAvLyBvZiBhcHBlbmRpbmcgTGlzdCBhZnRlcndhcmRzLCBhbmQgcmVtb3ZpbmcgdGhlIG5vdyB1bm5lY2Vzc2FyeQorICAgICAgLy8gTm9EdXBsaWNhdGVzLgorICAgICAgYWxpYXMgTm9EdXBsaWNhdGVzISgKKyAgICAgICAgRm9yQWxsV2l0aExpc3QhKAorICAgICAgICAgIENvbmZpbmVkVHVwbGUhKAorICAgICAgICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgICAgICAgQ29tcG9zaXRlVHlwZURlcHMsCisgICAgICAgICAgICAgIHN0YXRpY01hcCEoCisgICAgICAgICAgICAgICAgUEFwcGx5IShNZW1iZXJUeXBlLCBUKSwKKyAgICAgICAgICAgICAgICBGaWVsZE5hbWVzIVQKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICAgICksCisgICAgICAgICAgLkFkZFN0cnVjdFdpdGhEZXBzLAorICAgICAgICAgIFQKKyAgICAgICAgKSwKKyAgICAgICAgTGlzdAorICAgICAgKSBBZGRTdHJ1Y3RXaXRoRGVwczsKKyAgICB9IGVsc2UgeworICAgICAgYWxpYXMgTGlzdCBBZGRTdHJ1Y3RXaXRoRGVwczsKKyAgICB9CisgIH0KKworICB2ZXJzaW9uICh1bml0dGVzdCkgeworICAgIHN0cnVjdCBBIHt9CisgICAgc3RydWN0IEIgeworICAgICAgQSBhOworICAgICAgaW50IGI7CisgICAgICBBIGM7CisgICAgICBzdHJpbmcgZDsKKyAgICB9CisgICAgc3RydWN0IEMgeworICAgICAgQiBiOworICAgICAgQSBhOworICAgIH0KKworICAgIHN0YXRpYyBhc3NlcnQoaXMoQWRkU3RydWN0V2l0aERlcHMhQyA9PSBUeXBlVHVwbGUhKEEsIEIsIEMpKSk7CisKKyAgICBzdHJ1Y3QgRCB7CisgICAgICBDIGM7CisgICAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoW1RGaWVsZE1ldGEoImMiLCAwLCBUUmVxLklHTk9SRSldKTsKKyAgICB9CisgICAgc3RhdGljIGFzc2VydChpcyhBZGRTdHJ1Y3RXaXRoRGVwcyFEID09IFR5cGVUdXBsZSEoRCkpKTsKKyAgfQorCisgIHZlcnNpb24gKHVuaXR0ZXN0KSB7CisgICAgLy8gQ2lyY2xlcyBpbiB0aGUgdHlwZSBkZXBlbmRlbmN5IGdyYXBoIGFyZSBub3QgYWxsb3dlZCBpbiBUaHJpZnQsIGJ1dCBtYWtlCisgICAgLy8gc3VyZSB3ZSBmYWlsIGluIGEgc2FuZSB3YXkgaW5zdGVhZCBvZiBjcmFzaGluZyB0aGUgY29tcGlsZXIuCisKKyAgICBzdHJ1Y3QgUmVjMSB7CisgICAgICBSZWMyW10gb3RoZXI7CisgICAgfQorCisgICAgc3RydWN0IFJlYzIgeworICAgICAgUmVjMVtdIG90aGVyOworICAgIH0KKworICAgIHN0YXRpYyBhc3NlcnQoIV9fdHJhaXRzKGNvbXBpbGVzLCBBZGRTdHJ1Y3RXaXRoRGVwcyFSZWMxKSk7CisgIH0KKworICAvKgorICAgKiBSZXR1cm5zIHRoZSBub24tcHJpbWl0aXZlIHR5cGVzIFQgZGlyZWN0bHkgZGVwZW5kcyBvbi4KKyAgICoKKyAgICogRm9yIGV4YW1wbGUsIENvbXBvc2l0ZVR5cGVEZXBzIWludCB3b3VsZCB5aWVsZCBhbiBlbXB0eSB0eXBlIHR1cGxlLAorICAgKiBDb21wb3NpdGVUeXBlRGVwcyFTb21lU3RydWN0IHdvdWxkIGdpdmUgU29tZVN0cnVjdCwgYW5kCisgICAqIENvbXBvc2l0ZVR5cGVEZXBzIShBW0JdKSBib3RoIENvbXBvc2l0ZVR5cGVEZXBzIUEgYW5kIENvbXBvc2l0ZVR5cGVEZXBzIUIuCisgICAqLworICB0ZW1wbGF0ZSBDb21wb3NpdGVUeXBlRGVwcyhUKSB7CisgICAgc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJvb2wpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gYnl0ZSkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgPT0gc2hvcnQpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gaW50KSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBsb25nKSB8fCBpcyhGdWxseVVucXVhbCFUIDogc3RyaW5nKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBkb3VibGUpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gdm9pZCkKKyAgICApIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoKSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBVW10sIFUpKSB7CisgICAgICBhbGlhcyBDb21wb3NpdGVUeXBlRGVwcyFVIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IEhhc2hTZXQhRSwgRSkpIHsKKyAgICAgIGFsaWFzIENvbXBvc2l0ZVR5cGVEZXBzIUUgQ29tcG9zaXRlVHlwZURlcHM7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVltLXSwgSywgVikpIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoQ29tcG9zaXRlVHlwZURlcHMhSywgQ29tcG9zaXRlVHlwZURlcHMhVikgQ29tcG9zaXRlVHlwZURlcHM7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBlbnVtKSB8fCBpcyhGdWxseVVucXVhbCFUID09IHN0cnVjdCkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgOiBURXhjZXB0aW9uKQorICAgICkgeworICAgICAgYWxpYXMgVHlwZVR1cGxlIShGdWxseVVucXVhbCFUKSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBULnN0cmluZ29mKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGFuIElETCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcGFzc2VkIHNlcnZpY2UuIElETCBjb2RlIGZvciBhbnkgdHlwZQorICogZGVwZW5kY2llcyBpcyBub3QgaW5jbHVkZWQuCisgKi8KK3RlbXBsYXRlIHNlcnZpY2VJZGxTdHJpbmcoVCkgaWYgKGlzU2VydmljZSFUKSB7CisgIGVudW0gc2VydmljZUlkbFN0cmluZyA9IHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gInNlcnZpY2UgIiB+IFQuc3RyaW5nb2Y7CisgICAgc3RhdGljIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIVQpIHsKKyAgICAgIHJlc3VsdCB+PSAiIGV4dGVuZHMgIiB+IEJhc2VTZXJ2aWNlIVQuc3RyaW5nb2Y7CisgICAgfQorICAgIHJlc3VsdCB+PSAiIHtcbiI7CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBGaWx0ZXJNZXRob2ROYW1lcyEoVCwgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKSkgeworICAgICAgcmVzdWx0IH49ICIgICI7CisKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChULm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworCisgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5ICYmIG1ldGEuZnJvbnQudHlwZSA9PSBUTWV0aG9kVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgcmVzdWx0IH49ICJvbmV3YXkgIjsKKyAgICAgIH0KKworICAgICAgYWxpYXMgUmV0dXJuVHlwZSEoTWVtYmVyVHlwZSEoVCwgbWV0aG9kTmFtZSkpIFJUOworICAgICAgc3RhdGljIGlmIChpcyhSVCA9PSB2b2lkKSkgeworICAgICAgICAvLyBXZSBzcGVjaWFsLWNhc2UgdGhpcyBoZXJlIGluc3RlYWQgb2YgYWRkaW5nIHZvaWQgdG8gZFRvSWRsVHlwZSB0bworICAgICAgICAvLyBhdm9pZCBhY2NlcHRpbmcgdGhpbmdzIGxpa2Ugdm9pZFtdLgorICAgICAgICByZXN1bHQgfj0gInZvaWQgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCB+PSBkVG9JZGxUeXBlIVJUIH4gIiAiOworICAgICAgfQorICAgICAgcmVzdWx0IH49IG1ldGhvZE5hbWUgfiAiKCI7CisKKyAgICAgIHNob3J0IGxhc3RJZDsKKyAgICAgIGZvcmVhY2ggKGksIFBhcmFtVHlwZTsgUGFyYW1ldGVyVHlwZVR1cGxlIShNZW1iZXJUeXBlIShULCBtZXRob2ROYW1lKSkpIHsKKyAgICAgICAgc3RhdGljIGlmICghbWV0YS5lbXB0eSAmJiBpIDwgbWV0YS5mcm9udC5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgICAgZW51bSBoYXZlUE0gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVudW0gaGF2ZVBNID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzaG9ydCBpZDsKKyAgICAgICAgc3RhdGljIGlmIChoYXZlUE0pIHsKKyAgICAgICAgICBpZCA9IG1ldGEuZnJvbnQucGFyYW1zW2ldLmlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlkID0gLS1sYXN0SWQ7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcgcGFyYW1OYW1lOworICAgICAgICBzdGF0aWMgaWYgKGhhdmVQTSkgeworICAgICAgICAgIHBhcmFtTmFtZSA9IG1ldGEuZnJvbnQucGFyYW1zW2ldLm5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyYW1OYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgfj0gdG8hc3RyaW5nKGlkKSB+ICI6ICIgfiBkVG9JZGxUeXBlIVBhcmFtVHlwZSB+ICIgIiB+IHBhcmFtTmFtZTsKKworICAgICAgICBzdGF0aWMgaWYgKGhhdmVQTSAmJiAhbWV0YS5mcm9udC5wYXJhbXNbaV0uZGVmYXVsdFZhbHVlLmVtcHR5KSB7CisgICAgICAgICAgcmVzdWx0IH49ICIgPSAiIH4gZFRvSWRsQ29uc3QobWl4aW4obWV0YS5mcm9udC5wYXJhbXNbaV0uZGVmYXVsdFZhbHVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgZ2V0dGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgcGFyYW1ldGVycyBmcm9tIGEKKyAgICAgICAgICAvLyBmdW5jdGlvbiBhbGlhcyBpc24ndCBwb3NzaWJsZSDigJMgd2UgY2FuJ3QgdHJhbnNmZXIgdGhlIGRlZmF1bHQKKyAgICAgICAgICAvLyB2YWx1ZSB0byB0aGUgSURMIGUuZy4gZm9yIGludGVyZmFjZSBGb28geyB2b2lkIGZvbyhpbnQgYSA9IDUpOyB9CisgICAgICAgICAgLy8gd2l0aG91dCB0aGUgdXNlciBleHBsaWNpdGx5IGRlY2xhcmluZyBpdCBpbiBtZXRhZGF0YS4KKyAgICAgICAgfQorICAgICAgICByZXN1bHQgfj0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAiKSI7CisKKyAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkgJiYgIW1ldGEuZnJvbnQuZXhjZXB0aW9ucy5lbXB0eSkgeworICAgICAgICByZXN1bHQgfj0gIiB0aHJvd3MgKCI7CisgICAgICAgIGZvcmVhY2ggKGU7IG1ldGEuZnJvbnQuZXhjZXB0aW9ucykgeworICAgICAgICAgIHJlc3VsdCB+PSB0byFzdHJpbmcoZS5pZCkgfiAiOiAiIH4gZS50eXBlIH4gIiAiIH4gZS5uYW1lIH4gIiwgIjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgfj0gIikiOworICAgICAgfQorCisgICAgICByZXN1bHQgfj0gIixcbiI7CisgICAgfQorCisgICAgcmVzdWx0IH49ICJ9XG4iOworICAgIHJldHVybiByZXN1bHQ7CisgIH0oKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIElETCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcGFzc2VkIGVudW0uIElETCBjb2RlIGZvciBhbnkgdHlwZQorICogZGVwZW5kY2llcyBpcyBub3QgaW5jbHVkZWQuCisgKi8KK3RlbXBsYXRlIGVudW1JZGxTdHJpbmcoVCkgaWYgKGlzRW51bSFUKSB7CisgIGVudW0gZW51bUlkbFN0cmluZyA9IHsKKyAgICBzdGF0aWMgYXNzZXJ0KGlzKE9yaWdpbmFsVHlwZSFUIDogbG9uZyksCisgICAgICAiQ2FuIG9ubHkgaGF2ZSBpbnRlZ2VyIGVudW1zIGluIFRocmlmdCAobm90ICIgfiBPcmlnaW5hbFR5cGUhVC5zdHJpbmdvZiB+CisgICAgICAiLCBmb3IgIiB+IFQuc3RyaW5nb2YgfiAiKS4iKTsKKworICAgIHN0cmluZyByZXN1bHQgPSAiZW51bSAiIH4gVC5zdHJpbmdvZiB+ICIge1xuIjsKKworICAgIGZvcmVhY2ggKG5hbWU7IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkgeworICAgICAgcmVzdWx0IH49ICIgICIgfiBuYW1lIH4gIiA9ICIgfiBkVG9JZGxDb25zdChHZXRNZW1iZXIhKFQsIG5hbWUpKSB+ICIsXG4iOworICAgIH0KKworICAgIHJlc3VsdCB+PSAifVxuIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9KCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBJREwgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCBzdHJ1Y3QuIElETCBjb2RlIGZvciBhbnkgdHlwZQorICogZGVwZW5kY2llcyBpcyBub3QgaW5jbHVkZWQuCisgKi8KK3RlbXBsYXRlIHN0cnVjdElkbFN0cmluZyhUKSBpZiAoaXNTdHJ1Y3QhVCB8fCBpc0V4Y2VwdGlvbiFUKSB7CisgIGVudW0gc3RydWN0SWRsU3RyaW5nID0geworICAgIG1peGluKHsKKyAgICAgIHN0cmluZyBjb2RlID0gIiI7CisgICAgICBmb3JlYWNoIChmaWVsZDsgZ2V0RmllbGRNZXRhIVQpIHsKKyAgICAgICAgY29kZSB+PSAic3RhdGljIGFzc2VydChpcyhNZW1iZXJUeXBlIShULCBgIiB+IGZpZWxkLm5hbWUgfiAiYCkpKTtcbiI7CisgICAgICB9CisgICAgICByZXR1cm4gY29kZTsKKyAgICB9KCkpOworCisgICAgc3RyaW5nIHJlc3VsdDsKKyAgICBzdGF0aWMgaWYgKGlzRXhjZXB0aW9uIVQpIHsKKyAgICAgIHJlc3VsdCA9ICJleGNlcHRpb24gIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gInN0cnVjdCAiOworICAgIH0KKyAgICByZXN1bHQgfj0gVC5zdHJpbmdvZiB+ICIge1xuIjsKKworICAgIC8vIFRoZSBsYXN0IGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWQg4oCTIGZpZWxkcyB3aXRoIG5vIG1ldGEgaW5mb3JtYXRpb24KKyAgICAvLyBhcmUgYXNzaWduZWQgKGluIGxleGljYWwgb3JkZXIpIGRlc2NlbmRpbmcgbmVnYXRpdmUgaWRzLCBzdGFydGluZyB3aXRoCisgICAgLy8gLTEsIGp1c3QgbGlrZSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGRvZXMuCisgICAgc2hvcnQgbGFzdElkOworCisgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyFUKSB7CisgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoZ2V0RmllbGRNZXRhIVQsIG5hbWUpOworCisgICAgICBzdGF0aWMgaWYgKG1ldGEuZW1wdHkgfHwgbWV0YS5mcm9udC5yZXEgIT0gVFJlcS5JR05PUkUpIHsKKyAgICAgICAgc2hvcnQgaWQ7CisgICAgICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSkgeworICAgICAgICAgIGlkID0gLS1sYXN0SWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWQgPSBtZXRhLmZyb250LmlkOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0IH49ICIgICIgfiB0byFzdHJpbmcoaWQpIH4gIjoiOworICAgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgICAgcmVzdWx0IH49IGRUb0lkbFJlcShtZXRhLmZyb250LnJlcSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0IH49ICIgIiB+IGRUb0lkbFR5cGUhKE1lbWJlclR5cGUhKFQsIG5hbWUpKSB+ICIgIiB+IG5hbWU7CisKKyAgICAgICAgc3RhdGljIGlmICghbWV0YS5lbXB0eSAmJiAhbWV0YS5mcm9udC5kZWZhdWx0VmFsdWUuZW1wdHkpIHsKKyAgICAgICAgICByZXN1bHQgfj0gIiA9ICIgfiBkVG9JZGxDb25zdChtaXhpbihtZXRhLmZyb250LmRlZmF1bHRWYWx1ZSkpOworICAgICAgICB9IGVsc2Ugc3RhdGljIGlmIChfX3RyYWl0cyhjb21waWxlcywgZmllbGRJbml0QSEoVCwgbmFtZSkpKSB7CisgICAgICAgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoZmllbGRJbml0QSEoVCwgbmFtZSkpKSAmJgorICAgICAgICAgICAgIWlzKHR5cGVvZihmaWVsZEluaXRBIShULCBuYW1lKSkgPT0gdm9pZCkKKyAgICAgICAgICApIHsKKyAgICAgICAgICAgIHJlc3VsdCB+PSAiID0gIiB+IGRUb0lkbENvbnN0KGZpZWxkSW5pdEEhKFQsIG5hbWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKHR5cGVvZihmaWVsZEluaXRCIShULCBuYW1lKSkpICYmCisgICAgICAgICAgIWlzKHR5cGVvZihmaWVsZEluaXRCIShULCBuYW1lKSkgPT0gdm9pZCkKKyAgICAgICAgKSB7CisgICAgICAgICAgcmVzdWx0IH49ICIgPSAiIH4gZFRvSWRsQ29uc3QoZmllbGRJbml0QiEoVCwgbmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCB+PSAiLFxuIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgfj0gIn1cbiI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSgpOworfQorCitwcml2YXRlIHsKKyAgLy8gVGhpcyB2ZXJ5IGNvbnZvbHV0ZWQgd2F5IG9mIGRvaW5nIHRoaW5ncyB3YXMgY2hvc2VuIGJlY2F1c2UgcHV0dGluZyB0aGUKKyAgLy8gc3RhdGljIGlmIGRpcmVjdGx5IGludG8gc3RydWN0SWRsU3RyaW5nIGNhdXNlZCDCu25vdCBldmFsdWF0YWJsZSBhdCBjb21waWxlCisgIC8vIHRpbWXCqyBlcnJvcnMgdG8gc2xpcCB0aHJvdWdoIGV2ZW4gdGhvdWdoIHR5cGVvZigpIHdhcyB1c2VkLCByZXNwLiB0aGUKKyAgLy8gY29uZGl0aW9uIHRvIGJlIHRydWUgZXZlbiB0aG91Z2ggdGhlIHZhbHVlIGNvdWxkbid0IGFjdHVhbGx5IGJlIHJlYWQgYXQKKyAgLy8gY29tcGlsZSB0aW1lIGR1ZSB0byBhIEBAQlVHQEAgaW4gRE1EIDIuMDU1LgorICAvLyBUaGUgZXh0cmEgwrtjb21waWxlZMKrIGZpZWxkIGluIGZpZWxkSW5pdEEgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgbXVzdCBub3QgdHJ5CisgIC8vIHRvIHVzZSAhPSBpZiAhaXMgY29tcGlsZWQgYXMgd2VsbCAoYnV0IHdhcyBmYWxzZSksIGUuZy4gZm9yIGZsb2F0aW5nIHBvaW50CisgIC8vIHR5cGVzLgorICB0ZW1wbGF0ZSBmaWVsZEluaXRBKFQsIHN0cmluZyBuYW1lKSB7CisgICAgc3RhdGljIGlmIChtaXhpbigiVC5pbml0LiIgfiBuYW1lKSAhaXMgTWVtYmVyVHlwZSEoVCwgbmFtZSkuaW5pdCkgeworICAgICAgZW51bSBmaWVsZEluaXRBID0gbWl4aW4oIlQuaW5pdC4iIH4gbmFtZSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgZmllbGRJbml0QihULCBzdHJpbmcgbmFtZSkgeworICAgIHN0YXRpYyBpZiAobWl4aW4oIlQuaW5pdC4iIH4gbmFtZSkgIT0gTWVtYmVyVHlwZSEoVCwgbmFtZSkuaW5pdCkgeworICAgICAgZW51bSBmaWVsZEluaXRCID0gbWl4aW4oIlQuaW5pdC4iIH4gbmFtZSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgZFRvSWRsVHlwZShUKSB7CisgICAgc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJvb2wpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiYm9vbCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBieXRlKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImJ5dGUiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZG91YmxlKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImRvdWJsZSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzaG9ydCkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJpMTYiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gaW50KSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImkzMiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBsb25nKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImk2NCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA6IHN0cmluZykpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJzdHJpbmciOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFVbXSwgVSkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJsaXN0PCIgfiBkVG9JZGxUeXBlIVUgfiAiPiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVltLXSwgSywgVikpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJtYXA8IiB+IGRUb0lkbFR5cGUhSyB+ICIsICIgfiBkVG9JZGxUeXBlIVYgfiAiPiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogSGFzaFNldCFFLCBFKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gInNldDwiIH4gZFRvSWRsVHlwZSFFIH4gIj4iOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gc3RydWN0KSB8fCBpcyhGdWxseVVucXVhbCFUID09IGVudW0pIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUIDogVEV4Y2VwdGlvbikKKyAgICApIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9IEZ1bGx5VW5xdWFsIShUKS5zdHJpbmdvZjsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBULnN0cmluZ29mKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgZFRvSWRsUmVxKFRSZXEgcmVxKSB7CisgICAgc3dpdGNoIChyZXEpIHsKKyAgICAgIGNhc2UgVFJlcS5SRVFVSVJFRDogcmV0dXJuICIgcmVxdWlyZWQiOworICAgICAgY2FzZSBUUmVxLk9QVElPTkFMOiByZXR1cm4gIiBvcHRpb25hbCI7CisgICAgICBkZWZhdWx0OiByZXR1cm4gIiI7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGRUb0lkbENvbnN0KFQpKFQgdmFsdWUpIHsKKyAgICBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYm9vbCkpIHsKKyAgICAgIHJldHVybiB2YWx1ZSA/ICIxIiA6ICIwIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJ5dGUpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IHNob3J0KSB8fCBpcyhGdWxseVVucXVhbCFUID09IGludCkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgPT0gbG9uZykKKyAgICApIHsKKyAgICAgIHJldHVybiB0byFzdHJpbmcodmFsdWUpOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgOiBzdHJpbmcpKSB7CisgICAgICByZXR1cm4gYCJgIH4gdG8hc3RyaW5nKHZhbHVlKSB+IGAiYDsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGRvdWJsZSkpIHsKKyAgICAgIHJldHVybiBjdGZlVG9TdHJpbmcodmFsdWUpOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFVbXSwgVSkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgXyA6IEhhc2hTZXQhRSwgRSkKKyAgICApIHsKKyAgICAgIHN0cmluZyByZXN1bHQgPSAiWyI7CisgICAgICBmb3JlYWNoIChlOyB2YWx1ZSkgeworICAgICAgICByZXN1bHQgfj0gZFRvSWRsQ29uc3QoZSkgfiAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0IH49ICJdIjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVltLXSwgSywgVikpIHsKKyAgICAgIHN0cmluZyByZXN1bHQgPSAieyI7CisgICAgICBmb3JlYWNoIChrZXksIHZhbDsgdmFsdWUpIHsKKyAgICAgICAgcmVzdWx0IH49IGRUb0lkbENvbnN0KGtleSkgfiAiOiAiIH4gZFRvSWRsQ29uc3QodmFsKSB+ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIn0iOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGVudW0pKSB7CisgICAgICBpbXBvcnQgc3RkLmNvbnY7CisgICAgICBpbXBvcnQgc3RkLnRyYWl0czsKKyAgICAgIHJldHVybiB0byFzdHJpbmcoY2FzdChPcmlnaW5hbFR5cGUhVCl2YWx1ZSk7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzdHJ1Y3QpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUIDogVEV4Y2VwdGlvbikKKyAgICApIHsKKyAgICAgIHN0cmluZyByZXN1bHQgPSAieyI7CisgICAgICBmb3JlYWNoIChuYW1lOyBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkpIHsKKyAgICAgICAgc3RhdGljIGlmIChtZW1iZXJSZXEhKFQsIG5hbWUpICE9IFRSZXEuSUdOT1JFKSB7CisgICAgICAgICAgcmVzdWx0IH49IG5hbWUgfiAiOiAiIH4gZFRvSWRsQ29uc3QobWl4aW4oInZhbHVlLiIgfiBuYW1lKSkgfiAiLCAiOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIn0iOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBULnN0cmluZ29mKTsKKyAgICB9CisgIH0KK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgZW51bSBGb28geworICAgIGEgPSAxLAorICAgIGIgPSAxMCwKKyAgICBjID0gNQorICB9CisKKyAgc3RhdGljIGFzc2VydChlbnVtSWRsU3RyaW5nIUZvbyA9PQorYGVudW0gRm9vIHsKKyAgYSA9IDEsCisgIGIgPSAxMCwKKyAgYyA9IDUsCit9CitgKTsKK30KKworCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBzdHJ1Y3QgV2l0aG91dE1ldGEgeworICAgIHN0cmluZyBhOworICAgIGludCBiOworICB9CisKKyAgc3RydWN0IFdpdGhEZWZhdWx0cyB7CisgICAgc3RyaW5nIGEgPSAiYXNkZiI7CisgICAgZG91YmxlIGIgPSAzLjE0MTU7CisgICAgV2l0aG91dE1ldGEgYzsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKCJjIiwgMSwgVFJlcS5pbml0LCBgV2l0aG91dE1ldGEoImZvbyIsIDMpYCkKKyAgICBdKTsKKyAgfQorCisgIC8vIFRoZXNlIGFyZSBmcm9tIERlYnVnUHJvdG9UZXN0LnRocmlmdC4KKyAgc3RydWN0IE9uZU9mRWFjaCB7CisgICAgYm9vbCBpbV90cnVlOworICAgIGJvb2wgaW1fZmFsc2U7CisgICAgYnl0ZSBhX2JpdGU7CisgICAgc2hvcnQgaW50ZWdlcjE2OworICAgIGludCBpbnRlZ2VyMzI7CisgICAgbG9uZyBpbnRlZ2VyNjQ7CisgICAgZG91YmxlIGRvdWJsZV9wcmVjaXNpb247CisgICAgc3RyaW5nIHNvbWVfY2hhcmFjdGVyczsKKyAgICBzdHJpbmcgem9tZ191bmljb2RlOworICAgIGJvb2wgd2hhdF93aG87CisgICAgc3RyaW5nIGJhc2U2NDsKKyAgICBieXRlW10gYnl0ZV9saXN0OworICAgIHNob3J0W10gaTE2X2xpc3Q7CisgICAgbG9uZ1tdIGk2NF9saXN0OworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoYGltX3RydWVgLCAxKSwKKyAgICAgIFRGaWVsZE1ldGEoYGltX2ZhbHNlYCwgMiksCisgICAgICBURmllbGRNZXRhKGBhX2JpdGVgLCAzLCBUUmVxLk9QVF9JTl9SRVFfT1VULCBxe2Nhc3QoYnl0ZSkxMjd9KSwKKyAgICAgIFRGaWVsZE1ldGEoYGludGVnZXIxNmAsIDQsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7Y2FzdChzaG9ydCkzMjc2N30pLAorICAgICAgVEZpZWxkTWV0YShgaW50ZWdlcjMyYCwgNSksCisgICAgICBURmllbGRNZXRhKGBpbnRlZ2VyNjRgLCA2LCBUUmVxLk9QVF9JTl9SRVFfT1VULCBxezEwMDAwMDAwMDAwTH0pLAorICAgICAgVEZpZWxkTWV0YShgZG91YmxlX3ByZWNpc2lvbmAsIDcpLAorICAgICAgVEZpZWxkTWV0YShgc29tZV9jaGFyYWN0ZXJzYCwgOCksCisgICAgICBURmllbGRNZXRhKGB6b21nX3VuaWNvZGVgLCA5KSwKKyAgICAgIFRGaWVsZE1ldGEoYHdoYXRfd2hvYCwgMTApLAorICAgICAgVEZpZWxkTWV0YShgYmFzZTY0YCwgMTEpLAorICAgICAgVEZpZWxkTWV0YShgYnl0ZV9saXN0YCwgMTIsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7eworICAgICAgICBieXRlW10gdjsKKyAgICAgICAgdiB+PSBjYXN0KGJ5dGUpMTsKKyAgICAgICAgdiB+PSBjYXN0KGJ5dGUpMjsKKyAgICAgICAgdiB+PSBjYXN0KGJ5dGUpMzsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgICB9KCl9KSwKKyAgICAgIFRGaWVsZE1ldGEoYGkxNl9saXN0YCwgMTMsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7eworICAgICAgICBzaG9ydFtdIHY7CisgICAgICAgIHYgfj0gY2FzdChzaG9ydCkxOworICAgICAgICB2IH49IGNhc3Qoc2hvcnQpMjsKKyAgICAgICAgdiB+PSBjYXN0KHNob3J0KTM7CisgICAgICAgIHJldHVybiB2OworICAgICAgfSgpfSksCisgICAgICBURmllbGRNZXRhKGBpNjRfbGlzdGAsIDE0LCBUUmVxLk9QVF9JTl9SRVFfT1VULCBxe3sKKyAgICAgICAgbG9uZ1tdIHY7CisgICAgICAgIHYgfj0gMUw7CisgICAgICAgIHYgfj0gMkw7CisgICAgICAgIHYgfj0gM0w7CisgICAgICAgIHJldHVybiB2OworICAgICAgfSgpfSkKKyAgICBdKTsKKyAgfQorCisgIHN0cnVjdCBCb25rIHsKKyAgICBpbnQgdHlwZTsKKyAgICBzdHJpbmcgbWVzc2FnZTsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKGB0eXBlYCwgMSksCisgICAgICBURmllbGRNZXRhKGBtZXNzYWdlYCwgMikKKyAgICBdKTsKKyAgfQorCisgIHN0cnVjdCBIb2x5TW9sZXkgeworICAgIE9uZU9mRWFjaFtdIGJpZzsKKyAgICBIYXNoU2V0IShzdHJpbmdbXSkgY29udGFpbjsKKyAgICBCb25rW11bc3RyaW5nXSBib25rczsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKGBiaWdgLCAxKSwKKyAgICAgIFRGaWVsZE1ldGEoYGNvbnRhaW5gLCAyKSwKKyAgICAgIFRGaWVsZE1ldGEoYGJvbmtzYCwgMykKKyAgICBdKTsKKyAgfQorCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhvdXRNZXRhID09Citgc3RydWN0IFdpdGhvdXRNZXRhIHsKKyAgLTE6IHN0cmluZyBhLAorICAtMjogaTMyIGIsCit9CitgKTsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG07CisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cy5zdGFydHNXaXRoKAorYHN0cnVjdCBXaXRoRGVmYXVsdHMgeworICAtMTogc3RyaW5nIGEgPSAiYXNkZiIsCisgIC0yOiBkb3VibGUgYiA9IDMuMTQxYCkpOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cy5lbmRzV2l0aCgKK2AxOiBXaXRob3V0TWV0YSBjID0ge2E6ICJmb28iLCBiOiAzLCB9LAorfQorYCkpOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIU9uZU9mRWFjaCA9PQorYHN0cnVjdCBPbmVPZkVhY2ggeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGJ5dGUgYV9iaXRlID0gMTI3LAorICA0OiBpMTYgaW50ZWdlcjE2ID0gMzI3NjcsCisgIDU6IGkzMiBpbnRlZ2VyMzIsCisgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorICAxMTogc3RyaW5nIGJhc2U2NCwKKyAgMTI6IGxpc3Q8Ynl0ZT4gYnl0ZV9saXN0ID0gWzEsIDIsIDMsIF0sCisgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwgMiwgMywgXSwKKyAgMTQ6IGxpc3Q8aTY0PiBpNjRfbGlzdCA9IFsxLCAyLCAzLCBdLAorfQorYCk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchQm9uayA9PQorYHN0cnVjdCBCb25rIHsKKyAgMTogaTMyIHR5cGUsCisgIDI6IHN0cmluZyBtZXNzYWdlLAorfQorYCk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchSG9seU1vbGV5ID09Citgc3RydWN0IEhvbHlNb2xleSB7CisgIDE6IGxpc3Q8T25lT2ZFYWNoPiBiaWcsCisgIDI6IHNldDxsaXN0PHN0cmluZz4+IGNvbnRhaW4sCisgIDM6IG1hcDxzdHJpbmcsIGxpc3Q8Qm9uaz4+IGJvbmtzLAorfQorYCk7Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGNsYXNzIEV4Y2VwdGlvbldpdGhBTWFwIDogVEV4Y2VwdGlvbiB7CisgICAgc3RyaW5nIGJsYWg7CisgICAgc3RyaW5nW3N0cmluZ10gbWFwX2ZpZWxkOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoYGJsYWhgLCAxKSwKKyAgICAgIFRGaWVsZE1ldGEoYG1hcF9maWVsZGAsIDIpCisgICAgXSk7CisgIH0KKworICBpbnRlcmZhY2UgU3J2IHsKKyAgICB2b2lkIHZvaWRNZXRob2QoKTsKKyAgICBpbnQgcHJpbWl0aXZlTWV0aG9kKCk7CisgICAgT25lT2ZFYWNoIHN0cnVjdE1ldGhvZCgpOworICAgIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKGludCBzb21ldGhpbmcpOworICAgIHZvaWQgb25ld2F5TWV0aG9kKCk7CisgICAgdm9pZCBleGNlcHRpb25NZXRob2QoKTsKKworICAgIGFsaWFzIC5FeGNlcHRpb25XaXRoQU1hcCBFeGNlcHRpb25XaXRoQU1hcDsKKworICAgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAgICAgIFRNZXRob2RNZXRhKGBtZXRob2RXaXRoRGVmYXVsdEFyZ3NgLAorICAgICAgICBbVFBhcmFtTWV0YShgc29tZXRoaW5nYCwgMSwgcXsyfSldCisgICAgICApLAorICAgICAgVE1ldGhvZE1ldGEoYG9uZXdheU1ldGhvZGAsCisgICAgICAgIFtdLAorICAgICAgICBbXSwKKyAgICAgICAgVE1ldGhvZFR5cGUuT05FV0FZCisgICAgICApLAorICAgICAgVE1ldGhvZE1ldGEoYGV4Y2VwdGlvbk1ldGhvZGAsCisgICAgICAgIFtdLAorICAgICAgICBbCisgICAgICAgICAgVEV4Y2VwdGlvbk1ldGEoImEiLCAxLCAiRXhjZXB0aW9uV2l0aEFNYXAiKSwKKyAgICAgICAgICBURXhjZXB0aW9uTWV0YSgiYiIsIDIsICJFeGNlcHRpb25XaXRoQU1hcCIpCisgICAgICAgIF0KKyAgICAgICkKKyAgICBdOworICB9CisKKyAgaW50ZXJmYWNlIENoaWxkU3J2IDogU3J2IHsKKyAgICBpbnQgY2hpbGRNZXRob2QoaW50IGFyZyk7CisgIH0KKworICBzdGF0aWMgYXNzZXJ0KGlkbFN0cmluZyFDaGlsZFNydiA9PQorYGV4Y2VwdGlvbiBFeGNlcHRpb25XaXRoQU1hcCB7CisgIDE6IHN0cmluZyBibGFoLAorICAyOiBtYXA8c3RyaW5nLCBzdHJpbmc+IG1hcF9maWVsZCwKK30KKworc3RydWN0IE9uZU9mRWFjaCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogYnl0ZSBhX2JpdGUgPSAxMjcsCisgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAzMjc2NywKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCA9IDEwMDAwMDAwMDAwLAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCisgIDExOiBzdHJpbmcgYmFzZTY0LAorICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgMywgXSwKKyAgMTM6IGxpc3Q8aTE2PiBpMTZfbGlzdCA9IFsxLCAyLCAzLCBdLAorICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsIDIsIDMsIF0sCit9CisKK3NlcnZpY2UgU3J2IHsKKyAgdm9pZCB2b2lkTWV0aG9kKCksCisgIGkzMiBwcmltaXRpdmVNZXRob2QoKSwKKyAgT25lT2ZFYWNoIHN0cnVjdE1ldGhvZCgpLAorICB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncygxOiBpMzIgc29tZXRoaW5nID0gMiwgKSwKKyAgb25ld2F5IHZvaWQgb25ld2F5TWV0aG9kKCksCisgIHZvaWQgZXhjZXB0aW9uTWV0aG9kKCkgdGhyb3dzICgxOiBFeGNlcHRpb25XaXRoQU1hcCBhLCAyOiBFeGNlcHRpb25XaXRoQU1hcCBiLCApLAorfQorCitzZXJ2aWNlIENoaWxkU3J2IGV4dGVuZHMgU3J2IHsKKyAgaTMyIGNoaWxkTWV0aG9kKC0xOiBpMzIgcGFyYW0xLCApLAorfQorYCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vcHJvY2Vzc29yLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vcHJvY2Vzc29yLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlN2FjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBmaW5kOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGUsIFVucXVhbDsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jdGZlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CisKKy8qKgorICogU2VydmljZSBwcm9jZXNzb3IgZm9yIEludGVyZmFjZSwgd2hpY2ggaW1wbGVtZW50cyBUUHJvY2Vzc29yIGJ5CisgKiBzeW5jaHJvbm91c2x5IGZvcndhcmRpbmcgcmVxdWVzdHMgZm9yIHRoZSBzZXJ2aWNlIG1ldGhvZHMgdG8gYSBoYW5kbGVyCisgKiBpbXBsZW1lbnRpbmcgSW50ZXJmYWNlLgorICoKKyAqIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaW1wbGVtZW50cyBUUHJvY2Vzc29yIGFuZCBhZGRpdGlvbmFsbHkgYWxsb3dzIGEKKyAqIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgdG8gYmUgc3BlY2lmaWVkIHZpYSB0aGUgcHVibGljIGV2ZW50SGFuZGxlciBwcm9wZXJ0eS4KKyAqIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBvZiB0eXBlIEludGVyZmFjZSwgd2hpY2ggaXMgdGhlCisgKiBoYW5kbGVyIHRvIGZvcndhcmQgdGhlIHJlcXVlc3RzIHRvOgorICogLS0tCisgKiB0aGlzKEludGVyZmFjZSBpZmFjZSk7CisgKiBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcjsKKyAqIC0tLQorICoKKyAqIElmIEludGVyZmFjZSBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBzZXJ2aWNlIEJhc2VJbnRlcmZhY2UsIHRoaXMgY2xhc3MgaXMKKyAqIGFsc28gZGVyaXZlZCBmcm9tIFRTZXJ2aWNlUHJvY2Vzc29yIUJhc2VJbnRlcmZhY2UuCisgKgorICogVGhlIG9wdGlvbmFsIFByb3RvY29scyB0ZW1wbGF0ZSB0dXBsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorICogb25lIG9yIG1vcmUgVFByb3RvY29sIGltcGxlbWVudGF0aW9ucyB0byBzcGVjaWZpY2FsbHkgZ2VuZXJhdGUgY29kZSBmb3IuIElmCisgKiB0aGUgYWN0dWFsIHR5cGVzIG9mIHRoZSBwcm90b2NvbHMgcGFzc2VkIHRvIHByb2Nlc3MoKSBhdCBydW50aW1lIG1hdGNoIG9uZQorICogb2YgdGhlIGl0ZW1zIGZyb20gdGhlIGxpc3QsIHRoZSBvcHRpbWl6ZWQgY29kZSBwYXRocyBhcmUgdGFrZW4sIG90aGVyd2lzZSwKKyAqIGEgZ2VuZXJpYyBUUHJvdG9jb2wgdmVyc2lvbiBpcyB1c2VkIGFzIGZhbGxiYWNrLiBGb3IgY2FzZXMgd2hlcmUgdGhlIGlucHV0CisgKiBhbmQgb3V0cHV0IHByb3RvY29scyBkaWZmZXIsIFRQcm90b2NvbFBhaXIhKElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKQorICogY2FuIGJlIHVzZWQgaW4gdGhlIFByb3RvY29scyBsaXN0OgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vU2VydmljZSB7IHZvaWQgZm9vKCk7IH0KKyAqIGNsYXNzIEZvb0ltcGwgeyBvdmVycmlkZSB2b2lkIGZvbyB7fSB9CisgKgorICogLy8gUHJvdmlkZXMgZmFzdCBwYXRoIGlmIFRCaW5hcnlQcm90b2NvbCFUQnVmZmVyZWRUcmFuc3BvcnQgaXMgdXNlZCBmb3IKKyAqIC8vIGJvdGggaW5wdXQgYW5kIG91dHB1dDoKKyAqIGFsaWFzIFRTZXJ2aWNlUHJvY2Vzc29yIShGb29TZXJ2aWNlLCBUQmluYXJ5UHJvdG9jb2whVEJ1ZmZlcmVkVHJhbnNwb3J0KQorICogICBCaW5hcnlQcm9jZXNzb3I7CisgKgorICogYXV0byBwcm9jID0gbmV3IEJpbmFyeVByb2Nlc3NvcihuZXcgRm9vSW1wbCgpKTsKKyAqCisgKiAvLyBMb3cgb3ZlcmhlYWQuCisgKiBwcm9jLnByb2Nlc3ModEJpbmFyeVByb3RvY29sKHRCdWZmZXJUcmFuc3BvcnQoc29tZVNvY2tldCkpKTsKKyAqCisgKiAvLyBOb3QgaW4gdGhlIHNwZWNpYWxpemF0aW9uIGxpc3Qg4oCTIGhpZ2hlciBvdmVyaGVhZC4KKyAqIHByb2MucHJvY2Vzcyh0QmluYXJ5UHJvdG9jb2wodEZyYW1lZFRyYW5zcG9ydChzb21lU29ja2V0KSkpOworICoKKyAqIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBvcHRpbWl6ZWQgZm9yIHRoZSBDb21wYWN0IHByb3RvY29sIGJhY2tlZCBieSBhCisgKiAvLyBUUGlwZWRUcmFuc3BvcnQgZm9yIGlucHV0IGFuZCBhIFRCdWZmZXJlZFRyYW5zcG9ydCBmb3Igb3V0cHV0LgorICogYWxpYXMgVFNlcnZpY2VQcm9jZXNzb3IhKEZvb1NlcnZpY2UsIFRQcm90b2NvbFBhaXIhKAorICogICBUQ29tcGFjdFByb3RvY29sIVRQaXBlZFRyYW5zcG9ydCwgVENvbXBhY3RQcm90b2NvbCFUQnVmZmVyZWRUcmFuc3BvcnQpCisgKiApIE1peGVkUHJvY2Vzc29yOworICogLS0tCisgKi8KK3RlbXBsYXRlIFRTZXJ2aWNlUHJvY2Vzc29yKEludGVyZmFjZSwgUHJvdG9jb2xzLi4uKSBpZiAoCisgIGlzU2VydmljZSFJbnRlcmZhY2UgJiYgYWxsU2F0aXNmeSEoaXNUUHJvdG9jb2xPclBhaXIsIFByb3RvY29scykKKykgeworICBtaXhpbih7CisgICAgc3RhdGljIGlmIChpcyhJbnRlcmZhY2UgQmFzZUludGVyZmFjZXMgPT0gc3VwZXIpICYmIEJhc2VJbnRlcmZhY2VzLmxlbmd0aCA+IDApIHsKKyAgICAgIHN0YXRpYyBhc3NlcnQoQmFzZUludGVyZmFjZXMubGVuZ3RoID09IDEsCisgICAgICAgICJTZXJ2aWNlcyBjYW5ub3QgYmUgZGVyaXZlZCBmcm9tIG1vcmUgdGhhbiBvbmUgcGFyZW50LiIpOworCisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUU2VydmljZVByb2Nlc3NvciA6ICIgfgorICAgICAgICAiVFNlcnZpY2VQcm9jZXNzb3IhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSkge1xuIjsKKyAgICAgIGNvZGUgfj0gInByaXZhdGUgSW50ZXJmYWNlIGlmYWNlXztcbiI7CisKKyAgICAgIHN0cmluZyBjb25zdHJ1Y3RvckNvZGUgPSAidGhpcyhJbnRlcmZhY2UgaWZhY2UpIHtcbiI7CisgICAgICBjb25zdHJ1Y3RvckNvZGUgfj0gInN1cGVyKGlmYWNlKTtcbiI7CisgICAgICBjb25zdHJ1Y3RvckNvZGUgfj0gImlmYWNlXyA9IGlmYWNlO1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVFNlcnZpY2VQcm9jZXNzb3IgOiBUUHJvY2Vzc29yIHsiOworICAgICAgY29kZSB+PSBxeworICAgICAgICBvdmVycmlkZSBib29sIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsCisgICAgICAgICAgVmFyaWFudCBjb250ZXh0ID0gVmFyaWFudCgpCisgICAgICAgICkgeworICAgICAgICAgIGF1dG8gbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOworCisgICAgICAgICAgdm9pZCB3cml0ZUV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sCisgICAgICAgICAgICAgIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgZS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC53cml0ZUVuZCgpOworICAgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG1zZy50eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMICYmIG1zZy50eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgICAgIHNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7CisgICAgICAgICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgaXByb3QudHJhbnNwb3J0LnJlYWRFbmQoKTsKKworICAgICAgICAgICAgd3JpdGVFeGNlcHRpb24obmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9NRVNTQUdFX1RZUEUpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhdXRvIGRnID0gbXNnLm5hbWUgaW4gcHJvY2Vzc01hcF87CisgICAgICAgICAgaWYgKCFkZykgeworICAgICAgICAgICAgc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsKKyAgICAgICAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBpcHJvdC50cmFuc3BvcnQucmVhZEVuZCgpOworCisgICAgICAgICAgICB3cml0ZUV4Y2VwdGlvbihuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIiB+CisgICAgICAgICAgICAgIG1zZy5uYW1lIH4gIicuIiwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9NRVNTQUdFX1RZUEUpKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgICgqZGcpKG1zZy5zZXFpZCwgaXByb3QsIG9wcm90LCBjb250ZXh0KTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyOworCisgICAgICAgIGFsaWFzIHZvaWQgZGVsZWdhdGUoaW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgVmFyaWFudCkgUHJvY2Vzc0Z1bmM7CisgICAgICAgIHByb3RlY3RlZCBQcm9jZXNzRnVuY1tzdHJpbmddIHByb2Nlc3NNYXBfOworICAgICAgICBwcml2YXRlIEludGVyZmFjZSBpZmFjZV87CisgICAgICB9OworCisgICAgICBzdHJpbmcgY29uc3RydWN0b3JDb2RlID0gInRoaXMoSW50ZXJmYWNlIGlmYWNlKSB7XG4iOworICAgICAgY29uc3RydWN0b3JDb2RlIH49ICJpZmFjZV8gPSBpZmFjZTtcbiI7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsaW5nIGNvZGUgZm9yIGVhY2ggbWV0aG9kLCBjb25zaXN0aW5nIG9mIHRoZSBkaXNwYXRjaAorICAgIC8vIGZ1bmN0aW9uLCByZWdpc3RlcmluZyBpdCBpbiB0aGUgY29uc3RydWN0b3IsIGFuZCB0aGUgYWN0dWFsIHRlbXBsYXRlZAorICAgIC8vIGhhbmRsZXIgZnVuY3Rpb24uCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsKKyAgICAgIEZpbHRlck1ldGhvZE5hbWVzIShJbnRlcmZhY2UsIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBJbnRlcmZhY2UpKQorICAgICkgeworICAgICAgLy8gUmVnaXN0ZXIgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb24gaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgaW1tdXRhYmxlIHByb2NGdW5jTmFtZSA9ICJwcm9jZXNzXyIgfiBtZXRob2ROYW1lOworICAgICAgaW1tdXRhYmxlIGRpc3BhdGNoRnVuY05hbWUgPSBwcm9jRnVuY05hbWUgfiAiX3Byb3RvY29sRGlzcGF0Y2giOworICAgICAgY29uc3RydWN0b3JDb2RlIH49ICJwcm9jZXNzTWFwX1tgIiB+IG1ldGhvZE5hbWUgfiAiYF0gPSAmIiB+CisgICAgICAgIGRpc3BhdGNoRnVuY05hbWUgfiAiO1xuIjsKKworICAgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgICBUTWV0aG9kTWV0YSBtZXRob2RNZXRhOworICAgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICBtZXRob2RNZXRhID0gbWV0YS5mcm9udDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBUaGUgZGlzcGF0Y2ggZnVuY3Rpb24gdG8gY2FsbCB0aGUgc3BlY2lhbGl6ZWQgaGFuZGxlciBmdW5jdGlvbnMuIFdlCisgICAgICAvLyB0ZXN0IHRoZSBwcm90b2NvbHMgaWYgdGhleSBjYW4gYmUgY29udmVydGVkIHRvIG9uZSBvZiB0aGUgcGFzc2VkCisgICAgICAvLyBwcm90b2NvbCB0eXBlcywgYW5kIGlmIG5vdCwgZmFsbCBiYWNrIHRvIHRoZSBnZW5lcmljIFRQcm90b2NvbAorICAgICAgLy8gdmVyc2lvbiBvZiB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbi4KKyAgICAgIGNvZGUgfj0gInZvaWQgIiB+IGRpc3BhdGNoRnVuY05hbWUgfgorICAgICAgICAiKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIFZhcmlhbnQgY29udGV4dCkge1xuIjsKKyAgICAgIGNvZGUgfj0gImZvcmVhY2ggKFByb3RvY29sOyBUeXBlVHVwbGUhKFByb3RvY29scywgVFByb3RvY29sKSkge1xuIjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgc3RhdGljIGlmIChpcyhQcm90b2NvbCBfIDogVFByb3RvY29sUGFpciEoSSwgTyksIEksIE8pKSB7CisgICAgICAgICAgYWxpYXMgSSBJUHJvdDsKKyAgICAgICAgICBhbGlhcyBPIE9Qcm90OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFsaWFzIFByb3RvY29sIElQcm90OworICAgICAgICAgIGFsaWFzIFByb3RvY29sIE9Qcm90OworICAgICAgICB9CisgICAgICAgIGF1dG8gY2FzdGVkSVByb3QgPSBjYXN0KElQcm90KWlwcm90OworICAgICAgICBhdXRvIGNhc3RlZE9Qcm90ID0gY2FzdChPUHJvdClvcHJvdDsKKyAgICAgIH07CisgICAgICBjb2RlIH49ICJpZiAoY2FzdGVkSVByb3QgJiYgY2FzdGVkT1Byb3QpIHtcbiI7CisgICAgICBjb2RlIH49IHByb2NGdW5jTmFtZSB+CisgICAgICAgICIhKElQcm90LCBPUHJvdCkoc2VxaWQsIGNhc3RlZElQcm90LCBjYXN0ZWRPUHJvdCwgY29udGV4dCk7XG4iOworICAgICAgY29kZSB+PSAicmV0dXJuO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgY29kZSB+PSAidGhyb3cgbmV3IFRFeGNlcHRpb24oYEludGVybmFsIGVycm9yOiBOdWxsIGlwcm90L29wcm90ICIgfgorICAgICAgICAicGFzc2VkIHRvIHByb2Nlc3NvciBwcm90b2NvbCBkaXNwYXRjaCBmdW5jdGlvbi5gKTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworCisgICAgICAvLyBUaGUgYWN0dWFsIGhhbmRsZXIgZnVuY3Rpb24sIHRlbXBsYXRlZCBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dAorICAgICAgLy8gcHJvdG9jb2wgdHlwZXMuCisgICAgICBjb2RlIH49ICJ2b2lkICIgfiBwcm9jRnVuY05hbWUgfiAiKElQcm90LCBPUHJvdCkoaW50IHNlcWlkLCBJUHJvdCAiIH4KKyAgICAgICAgImlwcm90LCBPUHJvdCBvcHJvdCwgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dCkgIiB+CisgICAgICAgICJpZiAoaXNUUHJvdG9jb2whSVByb3QgJiYgaXNUUHJvdG9jb2whT1Byb3QpIHtcbiI7CisgICAgICBjb2RlIH49ICJUQXJnc1N0cnVjdCEoSW50ZXJmYWNlLCBgIiB+IG1ldGhvZE5hbWUgfiAiYCkgYXJncztcbiI7CisKKyAgICAgIC8vIFN0b3JlIHRoZSAocXVhbGlmaWVkKSBtZXRob2QgbmFtZSBpbiBhIG1hbmlmZXN0IGNvbnN0YW50IHRvIGF2b2lkCisgICAgICAvLyBoYXZpbmcgdG8gbGl0dGVyIHRoZSBjb2RlIGJlbG93IHdpdGggbG90cyBvZiBzdHJpbmcgbWFuaXB1bGF0aW9uLgorICAgICAgY29kZSB+PSAiZW51bSBtZXRob2ROYW1lID0gYCIgfiBtZXRob2ROYW1lIH4gImA7XG4iOworCisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGVudW0gcU5hbWUgPSBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiLiIgfiBtZXRob2ROYW1lOworCisgICAgICAgIFZhcmlhbnQgY2FsbENvbnRleHQ7CisgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICBjYWxsQ29udGV4dCA9IGV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KHFOYW1lLCBjb25uZWN0aW9uQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBzY29wZSAoZXhpdCkgeworICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNhbGxDb250ZXh0LCBxTmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVJlYWQoY2FsbENvbnRleHQsIHFOYW1lKTsKKworICAgICAgICBhcmdzLnJlYWQoaXByb3QpOworICAgICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOworICAgICAgICBpcHJvdC50cmFuc3BvcnQucmVhZEVuZCgpOworCisgICAgICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wb3N0UmVhZChjYWxsQ29udGV4dCwgcU5hbWUpOworICAgICAgfTsKKworICAgICAgY29kZSB+PSAiVFJlc3VsdFN0cnVjdCEoSW50ZXJmYWNlLCBgIiB+IG1ldGhvZE5hbWUgfiAiYCkgcmVzdWx0O1xuIjsKKyAgICAgIGNvZGUgfj0gInRyeSB7XG4iOworCisgICAgICAvLyBHZW5lcmF0ZSB0aGUgcGFyYW1ldGVyIGxpc3QgdG8gcGFzcyB0byB0aGUgY2FsbGVkIGlmYWNlIGZ1bmN0aW9uLgorICAgICAgc3RyaW5nW10gcGFyYW1MaXN0OworICAgICAgZm9yZWFjaCAoaSwgXzsgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpIHsKKyAgICAgICAgc3RyaW5nIHBhcmFtTmFtZTsKKyAgICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCAmJiBpIDwgbWV0aG9kTWV0YS5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgICAgcGFyYW1OYW1lID0gbWV0aG9kTWV0YS5wYXJhbXNbaV0ubmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbU5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBwYXJhbUxpc3Qgfj0gImFyZ3MuIiB+IHBhcmFtTmFtZTsKKyAgICAgIH0KKworICAgICAgaW1tdXRhYmxlIGNhbGwgPSAiaWZhY2VfLiIgfiBtZXRob2ROYW1lIH4gIigiIH4gY3RmZUpvaW4ocGFyYW1MaXN0KSB+ICIpIjsKKyAgICAgIGlmIChpcyhSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkgPT0gdm9pZCkpIHsKKyAgICAgICAgY29kZSB+PSBjYWxsIH4gIjtcbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlIH49ICJyZXN1bHQuc2V0IWBzdWNjZXNzYCgiIH4gY2FsbCB+ICIpO1xuIjsKKyAgICAgIH0KKworICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBvbmV3YXkgbWV0aG9kLCBnZW5lcmF0ZSB0aGUgcmVjZWl2aW5nIGNvZGUuCisgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCB8fCBtZXRob2RNZXRhLnR5cGUgIT0gVE1ldGhvZFR5cGUuT05FV0FZKSB7CisgICAgICAgIGlmIChtZXRob2RNZXRhRm91bmQpIHsKKyAgICAgICAgICBmb3JlYWNoIChlOyBtZXRob2RNZXRhLmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgIGNvZGUgfj0gIn0gY2F0Y2ggKEludGVyZmFjZS4iIH4gZS50eXBlIH4gIiAiIH4gZS5uYW1lIH4gIikge1xuIjsKKyAgICAgICAgICAgIGNvZGUgfj0gInJlc3VsdC5zZXQhYCIgfiBlLm5hbWUgfiAiYCgiIH4gZS5uYW1lIH4gIik7XG4iOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb2RlIH49ICJ9XG4iOworCisgICAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLmhhbmRsZXJFcnJvcihjYWxsQ29udGV4dCwgcU5hbWUsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRvIXN0cmluZyhlKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigKKyAgICAgICAgICAgICAgVE1lc3NhZ2UobWV0aG9kTmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsKKyAgICAgICAgICAgIHgud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC50cmFuc3BvcnQud3JpdGVFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVXcml0ZShjYWxsQ29udGV4dCwgcU5hbWUpOworCisgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UobWV0aG9kTmFtZSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsKKyAgICAgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC53cml0ZUVuZCgpOworICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnBvc3RXcml0ZShjYWxsQ29udGV4dCwgcU5hbWUpOworICAgICAgICB9OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRm9yIG9uZXdheSBtZXRob2RzLCB3ZSBvYnZpb3VzbHkgY2Fubm90IG5vdGlmeSB0aGUgY2xpZW50IG9mIGFueQorICAgICAgICAvLyBleGNlcHRpb25zLCBqdXN0IGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgb25lIGlzIHNldC4KKyAgICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgICAgICBldmVudEhhbmRsZXIuaGFuZGxlckVycm9yKGNhbGxDb250ZXh0LCBxTmFtZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLm9uZXdheUNvbXBsZXRlKGNhbGxDb250ZXh0LCBxTmFtZSk7CisgICAgICAgIH07CisgICAgICB9CisgICAgICBjb2RlIH49ICJ9XG4iOworCisgICAgfQorCisgICAgY29kZSB+PSBjb25zdHJ1Y3RvckNvZGUgfiAifVxuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworCisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogQSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSBhcmd1bWVudHMgb2YgYSBUaHJpZnQgbWV0aG9kIGNhbGwuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIGRpcmVjdGx5IHdpdGhvdXQgdGhlIGhlbHAgb2YKKyAqIFRTZXJ2aWNlUHJvY2Vzc29yLCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhLCBib29sIGIpOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLCBbVFBhcmFtTWV0YSgiYSIsIDEpLCBUUGFyYW1NZXRhKCJiIiwgMildKQorICogICBdOworICogfQorICoKKyAqIGFsaWFzIFRBcmdzU3RydWN0IShGb28sICJiYXIiKSBGb29CYXJBcmdzOworICogLS0tCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgRm9vQmFyQXJncyBpcyBlcXVpdmFsZW50IHRvOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vQmFyQXJncyB7CisgKiAgIHN0cmluZyBhOworICogICBib29sIGI7CisgKgorICogICBtaXhpbiBUU3RydWN0SGVscGVycyEoW1RGaWVsZE1ldGEoImEiLCAxLCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAqICAgICBURmllbGRNZXRhKCJiIiwgMiwgVFJlcS5PUFRfSU5fUkVRX09VVCldKTsKKyAqIH0KKyAqIC0tLQorICoKKyAqIElmIHRoZSBUVmVyYm9zZUNvZGVnZW4gdmVyc2lvbiBpcyBkZWZpbmVkLCBhIHdhcm5pbmcgbWVzc2FnZSBpcyBpc3N1ZWQgYXQKKyAqIGNvbXBpbGF0aW9uIGlmIG5vIFRNZXRob2RNZXRhIGZvciBJbnRlcmZhY2UubWV0aG9kTmFtZSBpcyBmb3VuZC4KKyAqLwordGVtcGxhdGUgVEFyZ3NTdHJ1Y3QoSW50ZXJmYWNlLCBzdHJpbmcgbWV0aG9kTmFtZSkgeworICBzdGF0aWMgYXNzZXJ0KGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpLAorICAgICJDb3VsZCBub3QgZmluZCBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gJyIgfiBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJy4iKTsKKyAgbWl4aW4oeworICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgIFRNZXRob2RNZXRhIG1ldGhvZE1ldGE7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgIGF1dG8gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChJbnRlcmZhY2UubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgbWV0aG9kTWV0YSA9IG1ldGEuZnJvbnQ7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIG1lbWJlckNvZGU7CisgICAgc3RyaW5nW10gZmllbGRNZXRhQ29kZXM7CisgICAgZm9yZWFjaCAoaSwgXzsgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpIHsKKyAgICAgIC8vIElmIHdlIGhhdmUgbm8gbWV0YSBpbmZvcm1hdGlvbiwganVzdCB1c2UgcGFyYW0xLCBwYXJhbTIsIGV0Yy4gYXMKKyAgICAgIC8vIGZpZWxkIG5hbWVzLCBpdCBzaG91bGRuJ3QgcmVhbGx5IG1hdHRlciBhbnl3YXkuIDEtYmFzZWQgwrtpbmRleGluZ8KrCisgICAgICAvLyBpcyB1c2VkIHRvIG1hdGNoIHRoZSBjb21tb24gc2NoZW1lIGluIHRoZSBUaHJpZnQgd29ybGQuCisgICAgICBzdHJpbmcgbWVtYmVySWQ7CisgICAgICBzdHJpbmcgbWVtYmVyTmFtZTsKKyAgICAgIGlmIChtZXRob2RNZXRhRm91bmQgJiYgaSA8IG1ldGhvZE1ldGEucGFyYW1zLmxlbmd0aCkgeworICAgICAgICBtZW1iZXJJZCA9IHRvIXN0cmluZyhtZXRob2RNZXRhLnBhcmFtc1tpXS5pZCk7CisgICAgICAgIG1lbWJlck5hbWUgPSBtZXRob2RNZXRhLnBhcmFtc1tpXS5uYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtYmVySWQgPSB0byFzdHJpbmcoaSArIDEpOworICAgICAgICBtZW1iZXJOYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICB9CisKKyAgICAgIC8vIFVucXVhbCEoKSBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgbXV0YWJsZSBmaWVsZHMgZm9yIHJlZiBjb25zdCgpCisgICAgICAvLyBzdHJ1Y3QgcGFyYW1ldGVycy4KKyAgICAgIG1lbWJlckNvZGUgfj0gIlVucXVhbCEoUGFyYW1ldGVyVHlwZVR1cGxlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKVsiIH4gdG8hc3RyaW5nKGkpIH4gIl0pIiB+IG1lbWJlck5hbWUgfiAiO1xuIjsKKworICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYCIgfiBtZW1iZXJOYW1lIH4gImAsICIgfiBtZW1iZXJJZCB+CisgICAgICAgICIsIFRSZXEuT1BUX0lOX1JFUV9PVVQpIjsKKyAgICB9CisKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVEFyZ3NTdHJ1Y3Qge1xuIjsKKyAgICBjb2RlIH49IG1lbWJlckNvZGU7CisgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCAmJgorICAgICAgICBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKS5sZW5ndGggPiAwKQorICAgICAgeworICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLnByb2Nlc3Nvci5UQXJnc1N0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiBzZXJ2aWNlICciIH4KKyAgICAgICAgICBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJyBmb3VuZC5gKTtcbiI7CisgICAgICB9CisgICAgfQorICAgIGltbXV0YWJsZSBmaWVsZE1ldGFDb2RlID0KKyAgICAgIGZpZWxkTWV0YUNvZGVzLmVtcHR5ID8gIiIgOiAiWyIgfiBjdGZlSm9pbihmaWVsZE1ldGFDb2RlcykgfiAiXSI7CisgICAgY29kZSB+PSAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCIgfiBmaWVsZE1ldGFDb2RlICB+ICIpO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIEEgc3RydWN0IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGEgVGhyaWZ0IG1ldGhvZCBjYWxsLgorICoKKyAqIEl0IGNvbnRhaW5zIGEgZmllbGQgY2FsbGVkICJzdWNjZXNzIiBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24KKyAqICh3aXRoIGlkIDApLCBhbmQgYWRkaXRpb25hbCBmaWVsZHMgZm9yIHRoZSBleGNlcHRpb25zIGRlY2xhcmVkIGZvciB0aGUKKyAqIG1ldGhvZCwgaWYgYW55LgorICoKKyAqIFRoZXJlIHNob3VsZCB1c3VhbGx5IGJlIG5vIHJlYXNvbiB0byB1c2UgdGhpcyBkaXJlY3RseSB3aXRob3V0IHRoZSBoZWxwIG9mCisgKiBUU2VydmljZVByb2Nlc3NvciwgYnV0IGl0IGlzIGRvY3VtZW50ZWQgcHVibGljbHkgdG8gaGVscCBkZWJ1Z2dpbmcgaW4gY2FzZQorICogb2YgQ1RGRSBlcnJvcnMuCisgKgorICogQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgaW50IGJhcihzdHJpbmcgYSk7CisgKgorICogICBhbGlhcyAuRm9vRXhjZXB0aW9uIEZvb0V4Y2VwdGlvbjsKKyAqCisgKiAgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAqICAgICBUTWV0aG9kTWV0YSgiYmFyIiwKKyAqICAgICAgIFtUUGFyYW1NZXRhKCJhIiwgMSldLAorICogICAgICAgW1RFeGNlcHRpb25NZXRhKCJmb29lIiwgMSwgIkZvb0V4Y2VwdGlvbiIpXQorICogICAgICkKKyAqICAgXTsKKyAqIH0KKyAqIGFsaWFzIFRSZXN1bHRTdHJ1Y3QhKEZvbywgImJhciIpIEZvb0JhclJlc3VsdDsKKyAqIC0tLQorICoKKyAqIFRoZSBkZWZpbml0aW9uIG9mIEZvb0JhclJlc3VsdCBpcyBlcXVpdmFsZW50IHRvOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vQmFyUmVzdWx0IHsKKyAqICAgaW50IHN1Y2Nlc3M7CisgKiAgIEZvb0V4Y2VwdGlvbiBmb29lOworICoKKyAqICAgbWl4aW4oVFN0cnVjdEhlbHBlcnMhKFtURmllbGRNZXRhKCJzdWNjZXNzIiwgMCwgVFJlcS5PUFRJT05BTCksCisgKiAgICAgVEZpZWxkTWV0YSgiZm9vZSIsIDEsIFRSZXEuT1BUSU9OQUwpXSkpOworICogfQorICogLS0tCisgKgorICogSWYgdGhlIFRWZXJib3NlQ29kZWdlbiB2ZXJzaW9uIGlzIGRlZmluZWQsIGEgd2FybmluZyBtZXNzYWdlIGlzIGlzc3VlZCBhdAorICogY29tcGlsYXRpb24gaWYgbm8gVE1ldGhvZE1ldGEgZm9yIEludGVyZmFjZS5tZXRob2ROYW1lIGlzIGZvdW5kLgorICovCit0ZW1wbGF0ZSBUUmVzdWx0U3RydWN0KEludGVyZmFjZSwgc3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgc3RhdGljIGFzc2VydChpcyh0eXBlb2YobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSwKKyAgICAiQ291bGQgbm90IGZpbmQgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluICciIH4gSW50ZXJmYWNlLnN0cmluZ29mIH4gIicuIik7CisKKyAgbWl4aW4oeworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUUmVzdWx0U3RydWN0IHtcbiI7CisKKyAgICBzdHJpbmdbXSBmaWVsZE1ldGFDb2RlczsKKworICAgIHN0YXRpYyBpZiAoIWlzKFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSA9PSB2b2lkKSkgeworICAgICAgY29kZSB+PSAiUmV0dXJuVHlwZSEoSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lIH4gIikgc3VjY2VzcztcbiI7CisgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgc3VjY2Vzc2AsIDAsIFRSZXEuT1BUSU9OQUwpIjsKKyAgICB9CisKKyAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgYXV0byBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICBmb3JlYWNoIChlOyBtZXRhLmZyb250LmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICBjb2RlIH49ICJJbnRlcmZhY2UuIiB+IGUudHlwZSB+ICIgIiB+IGUubmFtZSB+ICI7XG4iOworICAgICAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGAiIH4gZS5uYW1lIH4gImAsICIgfiB0byFzdHJpbmcoZS5pZCkgfgorICAgICAgICAgICAgIiwgVFJlcS5PUFRJT05BTCkiOworICAgICAgICB9CisgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCAmJgorICAgICAgICBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKS5sZW5ndGggPiAwKQorICAgICAgeworICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLnByb2Nlc3Nvci5UUmVzdWx0U3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluIHNlcnZpY2UgJyIgfgorICAgICAgICAgIEludGVyZmFjZS5zdHJpbmdvZiB+ICInIGZvdW5kLmApO1xuIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbW11dGFibGUgZmllbGRNZXRhQ29kZSA9CisgICAgICBmaWVsZE1ldGFDb2Rlcy5lbXB0eSA/ICIiIDogIlsiIH4gY3RmZUpvaW4oZmllbGRNZXRhQ29kZXMpIH4gIl0iOworICAgIGNvZGUgfj0gIm1peGluIFRTdHJ1Y3RIZWxwZXJzISgiIH4gZmllbGRNZXRhQ29kZSAgfiAiKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW5kZXguZCBiL2xpYi9kL3NyYy90aHJpZnQvaW5kZXguZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkxNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbmRleC5kCkBAIC0wLDAgKzEsMzMgQEAKK0Rkb2MKKworPGgyPlBhY2thZ2Ugb3ZlcnZpZXc8L2gyPgorCis8ZGw+CisgIDxkdD4kKERfQ09ERSB0aHJpZnQuYXN5bmMpPC9kdD4KKyAgPGRkPlN1cHBvcnQgaW5mcmFzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIGNsaWVudC1zaWRlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHVzaW5nIG5vbi1ibG9ja2luZyBJL08gYW5kIGNvcm91dGluZXMuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LmNvZGVnZW4pPC9kdD4KKyAgPGRkPgorICAgIDxwPlRlbXBsYXRlcyB1c2VkIGZvciBnZW5lcmF0aW5nIFRocmlmdCBjbGllbnRzL3Byb2Nlc3NvcnMgZnJvbSByZWd1bGFyIEQgc3RydWN0IGFuZCBpbnRlcmZhY2UgZGVmaW5pdGlvbnMuPC9wPgorICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gU2V2ZXJhbCBhcnRpZmFjdHMgaW4gdGhlc2UgbW9kdWxlcyBoYXZlIG9wdGlvbnMgZm9yIHNwZWNpZnlpbmcgdGhlIGV4YWN0IHByb3RvY29sIHR5cGVzIHVzZWQuIEluIHRoaXMgY2FzZSwgdGhlIGFtb3VudCBvZiB2aXJ0dWFsIGNhbGxzIGNhbiBiZSBncmVhdGx5IHJlZHVjZWQgYW5kIGFzIGEgcmVzdWx0LCB0aGUgY29kZSBhbHNvIGNhbiBiZSBvcHRpbWl6ZWQgYmV0dGVyLiBJZiBwZXJmb3JtYW5jZSBpcyBub3QgYSBjb25jZXJuIG9yIHRoZSBhY3R1YWwgcHJvdG9jb2wgdHlwZSBpcyBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLCB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBqdXN0IGJlIGxlZnQgYXQgdGhlaXIgZGVmYXVsdHMuCisgICAgPC9wPgorICA8L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQuaW50ZXJuYWwpPC9kdD4KKyAgPGRkPkludGVybmFsIGhlbHBlciBtb2R1bGVzIHVzZWQgYnkgdGhlIFRocmlmdCBsaWJyYXJ5LiBUaGlzIHBhY2thZ2UgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEksIGFuZCBubyBzdGFiaWxpdHkgZ3VhcmFudGVlcyBhcmUgZ2l2ZW4gd2hhdHNvZXZlci48L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQucHJvdG9jb2wpPC9kdD4KKyAgPGRkPlRoZSBUaHJpZnQgcHJvdG9jb2wgaW1wbGVtdGF0aW9ucyB3aGljaCBzcGVjaWZ5IGhvdyB0byBwYXNzIG1lc3NhZ2VzIG92ZXIgYSBUVHJhbnNwb3J0LjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5zZXJ2ZXIpPC9kdD4KKyAgPGRkPkdlbmVyaWMgVGhyaWZ0IHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgaGFuZGxpbmcgY2xpZW50cyBvdmVyIGEgVFRyYW5zcG9ydCBpbnRlcmZhY2UgYW5kIGZvcndhcmRpbmcgcmVxdWVzdHMgdG8gYSBUUHJvY2Vzc29yICh3aGljaCBpcyBpbiB0dXJuIHVzdWFsbHkgcHJvdmlkZWQgYnkgdGhyaWZ0LmNvZGVnZW4pLjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC50cmFuc3BvcnQpPC9kdD4KKyAgPGRkPlRoZSBUVHJhbnNwb3J0IGRhdGEgc291cmNlL3NpbmsgaW50ZXJmYWNlIHVzZWQgaW4gdGhlIFRocmlmdCBsaWJyYXJ5IGFuZCBpdHMgaW1pcGxlbWVudGF0aW9ucy48L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQudXRpbCk8L2R0PgorICA8ZGQ+R2VuZXJhbC1wdXJwb3NlIHV0aWxpdHkgbW9kdWxlcyBub3Qgc3BlY2lmaWMgdG8gVGhyaWZ0LCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLjwvZGQ+Cis8L2RsPgorCitNYWNyb3M6CisgIFRJVExFID0gVGhyaWZ0IEQgU29mdHdhcmUgTGlicmFyeQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9hbGdvcml0aG0uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvYWxnb3JpdGhtLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzOGFjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvYWxnb3JpdGhtLmQKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBDb250YWlucyBhIG1vZGlmaWVkIHZlcnNpb24gb2Ygc3RkLmFsZ29yaXRobS5yZW1vdmUgdGhhdCBkb2Vzbid0IHRha2UgYW4KKyAqIGFsaWFzIHBhcmFtZXRlciB0byBhdm9pZCBETUQgQEBCVUc2Mzk1QEAuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuYWxnb3JpdGhtOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1vdmU7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCBzdGQuZnVuY3Rpb25hbDsKK2ltcG9ydCBzdGQucmFuZ2U7CitpbXBvcnQgc3RkLnRyYWl0czsKKworZW51bSBTd2FwU3RyYXRlZ3kKK3sKKyAgICB1bnN0YWJsZSwKKyAgICBzZW1pc3RhYmxlLAorICAgIHN0YWJsZSwKK30KKworUmFuZ2UgcmVtb3ZlRXF1YWwoU3dhcFN0cmF0ZWd5IHMgPSBTd2FwU3RyYXRlZ3kuc3RhYmxlLCBSYW5nZSwgRSkoUmFuZ2UgcmFuZ2UsIEUgZSkKK2lmIChpc0JpZGlyZWN0aW9uYWxSYW5nZSFSYW5nZSkKK3sKKyAgICBhdXRvIHJlc3VsdCA9IHJhbmdlOworICAgIHN0YXRpYyBpZiAocyAhPSBTd2FwU3RyYXRlZ3kuc3RhYmxlKQorICAgIHsKKyAgICAgICAgZm9yICg7IXJhbmdlLmVtcHR5OykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJhbmdlLmZyb250ICFpcyBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmdlLnBvcEZyb250OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZShyYW5nZS5iYWNrLCByYW5nZS5mcm9udCk7CisgICAgICAgICAgICByYW5nZS5wb3BCYWNrOworICAgICAgICAgICAgcmVzdWx0LnBvcEJhY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXV0byB0Z3QgPSByYW5nZTsKKyAgICAgICAgZm9yICg7ICFyYW5nZS5lbXB0eTsgcmFuZ2UucG9wRnJvbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYW5nZS5mcm9udCBpcyBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHlhbmsgdGhpcyBndXkKKyAgICAgICAgICAgICAgICByZXN1bHQucG9wQmFjazsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGtlZXAgdGhpcyBndXkKKyAgICAgICAgICAgIG1vdmUocmFuZ2UuZnJvbnQsIHRndC5mcm9udCk7CisgICAgICAgICAgICB0Z3QucG9wRnJvbnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY29kZWdlbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jb2RlZ2VuLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmOWQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY29kZWdlbi5kCkBAIC0wLDAgKzEsNDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBjYW5GaW5kOworaW1wb3J0IHN0ZC50cmFpdHMgOiBJbnRlcmZhY2VzVHVwbGUsIGlzU29tZUZ1bmN0aW9uLCBpc1NvbWVTdHJpbmc7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IHN0YXRpY0luZGV4T2YsIHN0YXRpY01hcCwgTm9EdXBsaWNhdGVzLCBUeXBlVHVwbGU7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKKworLyoqCisgKiBSZW1vdmVzIGFsbCB0eXBlIHF1YWxpZmllcnMgZnJvbSBULgorICoKKyAqIEluIGNvbnRyYXN0IHRvIHN0ZC50cmFpdHMuVW5xdWFsLCBGdWxseVVucXVhbCBhbHNvIHJlbW92ZXMgcXVhbGlmaWVycyBmcm9tCisgKiBhcnJheSBlbGVtZW50cyAoZS5nLiBpbW11dGFibGUoYnl0ZVtdKSAtPiBieXRlW10sIG5vdCBpbW11dGFibGUoYnl0ZSlbXSksCisgKiBleGNsdWRpbmcgc3RyaW5ncyAoc3RyaW5nIGlzbid0IHJlZHVjZWQgdG8gY2hhcltdKS4KKyAqLwordGVtcGxhdGUgRnVsbHlVbnF1YWwoVCkgeworICBzdGF0aWMgaWYgKGlzKFQgXyA9PSBjb25zdChVKSwgVSkpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCFVIEZ1bGx5VW5xdWFsOworICB9IGVsc2Ugc3RhdGljIGlmIChpcyhUIF8gPT0gaW1tdXRhYmxlKFUpLCBVKSkgeworICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVUgRnVsbHlVbnF1YWw7CisgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKFQgXyA9PSBzaGFyZWQoVSksIFUpKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhVSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoVCBfID09IFVbXSwgVSkgJiYgIWlzU29tZVN0cmluZyFUKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhKFUpW10gRnVsbHlVbnF1YWw7CisgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKFQgXyA9PSBWW0tdLCBLLCBWKSkgeworICAgIGFsaWFzIEZ1bGx5VW5xdWFsIShWKVtGdWxseVVucXVhbCFLXSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHsKKyAgICBhbGlhcyBUIEZ1bGx5VW5xdWFsOworICB9Cit9CisKKy8qKgorICogdHJ1ZSBpZiBudWxsIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgcGFzc2VkIHR5cGUsIGZhbHNlIGlmIG5vdC4KKyAqLwordGVtcGxhdGUgaXNOdWxsYWJsZShUKSB7CisgIGVudW0gaXNOdWxsYWJsZSA9IF9fdHJhaXRzKGNvbXBpbGVzLCB7IFQgdCA9IG51bGw7IH0pOworfQorCit0ZW1wbGF0ZSBpc1N0cnVjdChUKSB7CisgIGVudW0gaXNTdHJ1Y3QgPSBpcyhUID09IHN0cnVjdCk7Cit9CisKK3RlbXBsYXRlIGlzRXhjZXB0aW9uKFQpIHsKKyBlbnVtIGlzRXhjZXB0aW9uID0gaXMoVCA6IEV4Y2VwdGlvbik7Cit9CisKK3RlbXBsYXRlIGlzRW51bShUKSB7CisgIGVudW0gaXNFbnVtID0gaXMoVCA9PSBlbnVtKTsKK30KKworLyoqCisgKiBBbGlhc2VzIGl0c2VsZiB0byBULm5hbWUuCisgKi8KK3RlbXBsYXRlIEdldE1lbWJlcihULCBzdHJpbmcgbmFtZSkgeworICBtaXhpbigiYWxpYXMgVC4iIH4gbmFtZSB+ICIgR2V0TWVtYmVyOyIpOworfQorCisvKioKKyAqIEFsaWFzZXMgaXRzZWxmIHRvIHR5cGVvZihzeW1ib2wpLgorICovCit0ZW1wbGF0ZSBUeXBlT2YoYWxpYXMgc3ltYm9sKSB7CisgIGFsaWFzIHR5cGVvZihzeW1ib2wpIFR5cGVPZjsKK30KKworLyoqCisgKiBBbGlhc2VzIGl0c2VsZiB0byB0aGUgdHlwZSBvZiB0aGUgVCBtZW1iZXIgY2FsbGVkIG5hbWUuCisgKi8KK2FsaWFzIENvbXBvc2UhKFR5cGVPZiwgR2V0TWVtYmVyKSBNZW1iZXJUeXBlOworCisvKioKKyAqIFJldHVybnMgdGhlIGZpZWxkIG1ldGFkYXRhIGFycmF5IGZvciBUIGlmIGFueSwgb3IgYW4gZW1wdHkgYXJyYXkgb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSBnZXRGaWVsZE1ldGEoVCkgaWYgKGlzU3RydWN0IVQgfHwgaXNFeGNlcHRpb24hVCkgeworICBzdGF0aWMgaWYgKGlzKHR5cGVvZihULmZpZWxkTWV0YSkgPT0gVEZpZWxkTWV0YVtdKSkgeworICAgIGVudW0gZ2V0RmllbGRNZXRhID0gVC5maWVsZE1ldGE7CisgIH0gZWxzZSB7CisgICAgZW51bSBURmllbGRNZXRhW10gZ2V0RmllbGRNZXRhID0gW107CisgIH0KK30KKworLyoqCisgKiBNZXJnZXMgdGhlIGZpZWxkIG1ldGFkYXRhIGFycmF5IGZvciBEIHdpdGggdGhlIHBhc3NlZCBhcnJheS4KKyAqLwordGVtcGxhdGUgbWVyZ2VGaWVsZE1ldGEoVCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIHsKKyAgLy8gTm90ZTogV2UgZG9uJ3QgdXNlIGdldEZpZWxkTWV0YSBoZXJlIHRvIGF2b2lkIGJ1ZyBpZiBpdCBpcyBpbnN0YW50aWF0ZWQKKyAgLy8gZnJvbSBUSXNTZXRGbGFncywgc2VlIGNvbW1lbnQgdGhlcmUuCisgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQuZmllbGRNZXRhKSA9PSBURmllbGRNZXRhW10pKSB7CisgICAgZW51bSBtZXJnZUZpZWxkTWV0YSA9IFQuZmllbGRNZXRhIH4gZmllbGRNZXRhRGF0YTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIFRGaWVsZE1ldGFbXSBtZXJnZUZpZWxkTWV0YSA9IGZpZWxkTWV0YURhdGE7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBmaWVsZCByZXF1aXJlbWVudCBsZXZlbCBmb3IgVC5uYW1lLgorICovCit0ZW1wbGF0ZSBtZW1iZXJSZXEoVCwgc3RyaW5nIG5hbWUsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsKSB7CisgIGVudW0gbWVtYmVyUmVxID0gbWVtYmVyUmVxSW1wbCEoVCwgbmFtZSwgZmllbGRNZXRhRGF0YSkucmVzdWx0OworfQorCitwcml2YXRlIHsKKyAgaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBmaW5kOworICAvLyBETUQgQEBCVUdAQDogTWlzc2luZyBpbXBvcnQgbGVhZHMgdG8gZmFpbGluZyBidWlsZCB3aXRob3V0IGVycm9yCisgIC8vIG1lc3NhZ2UgaW4gdW5pdHRlc3QvZGVidWcvdGhyaWZ0L2NvZGVnZW4vYXN5bmNfY2xpZW50LgorICBpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworCisgIHRlbXBsYXRlIG1lbWJlclJlcUltcGwoVCwgc3RyaW5nIG5hbWUsIGFsaWFzIGZpZWxkTWV0YURhdGEpIHsKKyAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAobWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpLCBuYW1lKTsKKyAgICBzdGF0aWMgaWYgKG1ldGEuZW1wdHkgfHwgbWV0YS5mcm9udC5yZXEgPT0gVFJlcS5BVVRPKSB7CisgICAgICBzdGF0aWMgaWYgKGlzTnVsbGFibGUhKE1lbWJlclR5cGUhKFQsIG5hbWUpKSkgeworICAgICAgICBlbnVtIHJlc3VsdCA9IFRSZXEuT1BUSU9OQUw7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnVtIHJlc3VsdCA9IFRSZXEuUkVRVUlSRUQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGVudW0gcmVzdWx0ID0gbWV0YS5mcm9udC5yZXE7CisgICAgfQorICB9Cit9CisKKwordGVtcGxhdGUgbm90SWdub3JlZChULCBzdHJpbmcgbmFtZSwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIHsKKyAgZW51bSBub3RJZ25vcmVkID0gbWVtYmVyUmVxIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKSAhPSBUUmVxLklHTk9SRTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBtZXRob2QgbWV0YWRhdGEgYXJyYXkgZm9yIFQgaWYgYW55LCBvciBhbiBlbXB0eSBhcnJheSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIGdldE1ldGhvZE1ldGEoVCkgaWYgKGlzU2VydmljZSFUKSB7CisgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQubWV0aG9kTWV0YSkgPT0gVE1ldGhvZE1ldGFbXSkpIHsKKyAgICBlbnVtIGdldE1ldGhvZE1ldGEgPSBULm1ldGhvZE1ldGE7CisgIH0gZWxzZSB7CisgICAgZW51bSBUTWV0aG9kTWV0YVtdIGdldE1ldGhvZE1ldGEgPSBbXTsKKyAgfQorfQorCisKKy8qKgorICogdHJ1ZSBpZiBULm5hbWUgaXMgYSBtZW1iZXIgdmFyaWFibGUuIEV4Y2VwdGlvbnMgaW5jbHVkZSBtZXRob2RzLCBzdGF0aWMKKyAqIG1lbWJlcnMsIGFydGlmYWN0cyBsaWtlIHBhY2thZ2UgYWxpYXNlcywg4oCmCisgKi8KK3RlbXBsYXRlIGlzVmFsdWVNZW1iZXIoVCwgc3RyaW5nIG5hbWUpIHsKKyAgc3RhdGljIGlmICghaXMoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKSB7CisgICAgZW51bSBpc1ZhbHVlTWVtYmVyID0gZmFsc2U7CisgIH0gZWxzZSBzdGF0aWMgaWYgKAorICAgIGlzKE1lbWJlclR5cGUhKFQsIG5hbWUpID09IHZvaWQpIHx8CisgICAgaXNTb21lRnVuY3Rpb24hKE1lbWJlclR5cGUhKFQsIG5hbWUpKSB8fAorICAgIF9fdHJhaXRzKGNvbXBpbGVzLCB7IHJldHVybiBtaXhpbigiVC4iIH4gbmFtZSk7IH0oKSkKKyAgKSB7CisgICAgZW51bSBpc1ZhbHVlTWVtYmVyID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgZW51bSBpc1ZhbHVlTWVtYmVyID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIG9mIFQsIG5vdCBpbmNsdWRpbmcKKyAqIGluaGVyaXRlZCBmaWVsZHMuIElmIGEgbWVtYmVyIGlzIG1hcmtlZCBhcyBUUmVxLklHTk9SRSwgaXQgaXMgbm90IGluY2x1ZGVkCisgKiBhcyB3ZWxsLgorICovCit0ZW1wbGF0ZSBGaWVsZE5hbWVzKFQsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsKSB7CisgIGFsaWFzIFN0YXRpY0ZpbHRlciEoCisgICAgQWxsISgKKyAgICAgIGRvZXNOb3RSZWFkTWVtYmVycywKKyAgICAgIFBBcHBseSEoaXNWYWx1ZU1lbWJlciwgVCksCisgICAgICBQQXBwbHkhKG5vdElnbm9yZWQsIFQsIFBBcHBseVNraXAsIGZpZWxkTWV0YURhdGEpCisgICAgKSwKKyAgICBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkKKyAgKSBGaWVsZE5hbWVzOworfQorCisvKgorICogdHJ1ZSBpZiB0aGUgcGFzc2VkIG1lbWJlciBuYW1lIGlzIG5vdCBhIG1ldGhvZCBnZW5lcmF0ZWQgYnkgdGhlCisgKiBUU3RydWN0SGVscGVycyB0ZW1wbGF0ZSB0aGF0IGluIGl0cyBpbXBsZW1lbnRhdGlvbnMgcXVlcmllcyB0aGUgc3RydWN0CisgKiBtZW1iZXJzLgorICoKKyAqIEtsdWRnZSB1c2VkIGludGVybmFsbHkgdG8gYnJlYWsgYSBjeWNsZSBjYXVzZWQgYSBETUQgZm9yd2FyZCByZWZlcmVuY2UKKyAqIHJlZ3Jlc3Npb24sIHNlZSBUSFJJRlQtMjEzMC4KKyAqLworZW51bSBkb2VzTm90UmVhZE1lbWJlcnMoc3RyaW5nIG5hbWUpID0gIVsib3BFcXVhbHMiLCAidGhyaWZ0T3BFcXVhbHNJbXBsIiwKKyAgInRvU3RyaW5nIiwgInRocmlmdFRvU3RyaW5nSW1wbCJdLmNhbkZpbmQobmFtZSk7CisKK3RlbXBsYXRlIGRlcml2ZWRNZW1iZXJzKFQpIHsKKyAgYWxpYXMgVHlwZVR1cGxlIShfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkpIGRlcml2ZWRNZW1iZXJzOworfQorCit0ZW1wbGF0ZSBBbGxNZW1iZXJNZXRob2ROYW1lcyhUKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgYWxpYXMgTm9EdXBsaWNhdGVzISgKKyAgICBGaWx0ZXJNZXRob2ROYW1lcyEoCisgICAgICBULAorICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgZGVyaXZlZE1lbWJlcnMsCisgICAgICAgIFR5cGVUdXBsZSEoVCwgSW50ZXJmYWNlc1R1cGxlIVQpCisgICAgICApCisgICAgKQorICApIEFsbE1lbWJlck1ldGhvZE5hbWVzOworfQorCit0ZW1wbGF0ZSBGaWx0ZXJNZXRob2ROYW1lcyhULCBNZW1iZXJOYW1lcy4uLikgeworICBhbGlhcyBTdGF0aWNGaWx0ZXIhKAorICAgIENvbXBpbGVzQW5kVHJ1ZSEoCisgICAgICBDb21wb3NlIShpc1NvbWVGdW5jdGlvbiwgVHlwZU9mLCBQQXBwbHkhKEdldE1lbWJlciwgVCkpCisgICAgKSwKKyAgICBNZW1iZXJOYW1lcworICApIEZpbHRlck1ldGhvZE5hbWVzOworfQorCisvKioKKyAqIFJldHVybnMgYSB0eXBlIHR1cGxlIGNvbnRhaW5pbmcgb25seSB0aGUgZWxlbWVudHMgb2YgVCBmb3Igd2hpY2ggdGhlCisgKiBlcG9ueW1vdXMgdGVtcGxhdGUgcHJlZGljYXRlIHByZWQgaXMgdHJ1ZS4KKyAqCisgKiBFeGFtcGxlOgorICogLS0tCisgKiBhbGlhcyBTdGF0aWNGaWx0ZXIhKGlzSW50ZWdyYWwsIGludCwgc3RyaW5nLCBsb25nLCBmbG9hdFtdKSBGaWx0ZXJlZDsKKyAqIHN0YXRpYyBhc3NlcnQoaXMoRmlsdGVyZWQgPT0gVHlwZVR1cGxlIShpbnQsIGxvbmcpKSk7CisgKiAtLS0KKyAqLwordGVtcGxhdGUgU3RhdGljRmlsdGVyKGFsaWFzIHByZWQsIFQuLi4pIHsKKyAgc3RhdGljIGlmIChULmxlbmd0aCA9PSAwKSB7CisgICAgYWxpYXMgVHlwZVR1cGxlISgpIFN0YXRpY0ZpbHRlcjsKKyAgfSBlbHNlIHN0YXRpYyBpZiAocHJlZCEoVFswXSkpIHsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKFRbMF0sIFN0YXRpY0ZpbHRlciEocHJlZCwgVFsxIC4uICRdKSkgU3RhdGljRmlsdGVyOworICB9IGVsc2UgeworICAgIGFsaWFzIFN0YXRpY0ZpbHRlciEocHJlZCwgVFsxIC4uICRdKSBTdGF0aWNGaWx0ZXI7CisgIH0KK30KKworLyoqCisgKiBCaW5kcyB0aGUgZmlyc3QgbiBhcmd1bWVudHMgb2YgYSB0ZW1wbGF0ZSB0byBhIHBhcnRpY3VsYXIgdmFsdWUgKHdoZXJlIG4gaXMKKyAqIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBQQXBwbHkpLgorICoKKyAqIFRoZSBwYXNzZWQgYXJndW1lbnRzIGFyZSBhbHdheXMgYXBwbGllZCBzdGFydGluZyBmcm9tIHRoZSBsZWZ0LiBIb3dldmVyLAorICogdGhlIHNwZWNpYWwgUEFwcGx5U2tpcCBtYXJrZXIgdGVtcGxhdGUgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbgorICogYXJndW1lbnQgc2hvdWxkIGJlIHNraXBwZWQsIHNvIHRoYXQgZS5nLiB0aGUgZmlyc3QgYW5kIHRoaXJkIGFyZ3VtZW50CisgKiB0byBhIHRlbXBsYXRlIGNhbiBiZSBmaXhlZCwgYnV0IHRoZSBzZWNvbmQgYW5kIHJlbWFpbmluZyBhcmd1bWVudHMgd291bGQKKyAqIHN0aWxsIGJlIGxlZnQgdW5kZWZpbmVkLgorICoKKyAqIFNraXBwaW5nIGEgbnVtYmVyIG9mIHBhcmFtZXRlcnMsIGJ1dCBub3QgcHJvdmlkaW5nIGVub3VnaCBhcmd1bWVudHMgdG8KKyAqIGFzc2lnbiBhbGwgb2YgdGhlbSBkdXJpbmcgaW5zdGFudGlhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIHRlbXBsYXRlIGlzIGFuCisgKiBlcnJvci4KKyAqCisgKiBFeGFtcGxlOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vKFQsIFUsIFYpIHt9CisgKiBhbGlhcyBQQXBwbHkhKEZvbywgaW50LCBsb25nKSBQYXJ0aWFsRm9vOworICogc3RhdGljIGFzc2VydChpcyhQYXJ0aWFsRm9vIWZsb2F0ID09IEZvbyEoaW50LCBsb25nLCBmbG9hdCkpKTsKKyAqCisgKiBhbGlhcyBQQXBwbHkhKFRlc3QsIGludCwgUEFwcGx5U2tpcCwgZmxvYXQpIFNraXBwZWRUZXN0OworICogc3RhdGljIGFzc2VydChpcyhTa2lwcGVkVGVzdCFsb25nID09IFRlc3QhKGludCwgbG9uZywgZmxvYXQpKSk7CisgKiAtLS0KKyAqLwordGVtcGxhdGUgUEFwcGx5KGFsaWFzIFRhcmdldCwgVC4uLikgeworICB0ZW1wbGF0ZSBQQXBwbHkoVS4uLikgeworICAgIGFsaWFzIFRhcmdldCEoUEFwcGx5TWVyZ2VBcmdzIShDb25maW5lZFR1cGxlIVQsIFUpLlJlc3VsdCkgUEFwcGx5OworICB9Cit9CisKKy8vLyBEaXR0by4KK3RlbXBsYXRlIFBBcHBseVNraXAoKSB7fQorCitwcml2YXRlIHRlbXBsYXRlIFBBcHBseU1lcmdlQXJncyhhbGlhcyBQcmVzZXQsIEFyZ3MuLi4pIHsKKyAgc3RhdGljIGlmIChQcmVzZXQubGVuZ3RoID09IDApIHsKKyAgICBhbGlhcyBBcmdzIFJlc3VsdDsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIG5leHRTa2lwID0gc3RhdGljSW5kZXhPZiEoUEFwcGx5U2tpcCwgUHJlc2V0LlR1cGxlKTsKKyAgICBzdGF0aWMgaWYgKG5leHRTa2lwID09IC0xKSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKFByZXNldC5UdXBsZSwgQXJncykgUmVzdWx0OworICAgIH0gZWxzZSBzdGF0aWMgaWYgKEFyZ3MubGVuZ3RoID09IDApIHsKKyAgICAgIC8vIEhhdmUgdG8gdXNlIGEgc3RhdGljIGlmIGNsYXVzZSBpbnN0ZWFkIG9mIHB1dHRpbmcgdGhlIGNvbmRpdGlvbgorICAgICAgLy8gZGlyZWN0bHkgaW50byB0aGUgYXNzZXJ0IHRvIGF2b2lkIERNRCB0cnlpbmcgdG8gYWNjZXNzIEFyZ3NbMF0KKyAgICAgIC8vIG5ldmVydGhlbGVzcyBiZWxvdy4KKyAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsCisgICAgICAgICJQQXJnc1NraXAgZW5jb3VudGVyZWQsIGJ1dCBubyBhcmd1bWVudCBsZWZ0IHRvIGJpbmQuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoCisgICAgICAgIFByZXNldC5UdXBsZVswIC4uIG5leHRTa2lwXSwKKyAgICAgICAgQXJnc1swXSwKKyAgICAgICAgUEFwcGx5TWVyZ2VBcmdzISgKKyAgICAgICAgICBDb25maW5lZFR1cGxlIShQcmVzZXQuVHVwbGVbbmV4dFNraXAgKyAxIC4uICRdKSwKKyAgICAgICAgICBBcmdzWzEgLi4gJF0KKyAgICAgICAgKS5SZXN1bHQKKyAgICAgICkgUmVzdWx0OworICAgIH0KKyAgfQorfQorCit1bml0dGVzdCB7CisgIHN0cnVjdCBUZXN0KFQsIFUsIFYpIHt9CisgIGFsaWFzIFBBcHBseSEoVGVzdCwgaW50LCBsb25nKSBQYXJ0aWFsVGVzdDsKKyAgc3RhdGljIGFzc2VydChpcyhQYXJ0aWFsVGVzdCFmbG9hdCA9PSBUZXN0IShpbnQsIGxvbmcsIGZsb2F0KSkpOworCisgIGFsaWFzIFBBcHBseSEoVGVzdCwgaW50LCBQQXBwbHlTa2lwLCBmbG9hdCkgU2tpcHBlZFRlc3Q7CisgIHN0YXRpYyBhc3NlcnQoaXMoU2tpcHBlZFRlc3QhbG9uZyA9PSBUZXN0IShpbnQsIGxvbmcsIGZsb2F0KSkpOworCisgIGFsaWFzIFBBcHBseSEoVGVzdCwgaW50LCBQQXBwbHlTa2lwLCBQQXBwbHlTa2lwKSBUd29Ta2lwcGVkOworICBzdGF0aWMgYXNzZXJ0KCFfX3RyYWl0cyhjb21waWxlcywgVHdvU2tpcHBlZCFsb25nKSk7Cit9CisKKworLyoqCisgKiBDb21wb3NlcyBhIG51bWJlciBvZiB0ZW1wbGF0ZXMuIFRoZSByZXN1bHQgaXMgYSB0ZW1wbGF0ZSBlcXVpdmFsZW50IHRvCisgKiBhbGwgdGhlIHBhc3NlZCB0ZW1wbGF0ZXMgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCwgYWtpbiB0byB0aGUKKyAqIG1hdGhlbWF0aWNhbCBmdW5jdGlvbiBjb21wb3NpdGlvbiBub3RhdGlvbjogSW5zdGFudGlhdGluZyBDb21wb3NlIShBLCBCLCBDKQorICogaXMgdGhlIHNhbWUgYXMgaW5zdGFudGlhdGluZyBBIShCIShDISjigKYpKSkuCisgKgorICogVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYSB0ZW1wbGF0ZSB0byB1c2Ugd2l0aCBzdGF0aWNNYXAvCisgKiBTdGF0aWNGaWx0ZXIsIGFzIGRlbW9uc3RyYXRlZCBiZWxvdy4KKyAqCisgKiBFeGFtcGxlOgorICogLS0tCisgKiB0ZW1wbGF0ZSBBbGxNZXRob2ROYW1lcyhUKSB7CisgKiAgIGFsaWFzIFN0YXRpY0ZpbHRlciEoCisgKiAgICAgQ29tcGlsZXNBbmRUcnVlISgKKyAqICAgICAgIENvbXBvc2UhKGlzU29tZUZ1bmN0aW9uLCBUeXBlT2YsIFBBcHBseSEoR2V0TWVtYmVyLCBUKSkKKyAqICAgICApLAorICogICAgIF9fdHJhaXRzKGFsbE1lbWJlcnMsIFQpCisgKiAgICkgQWxsTWV0aG9kTmFtZXM7CisgKiB9CisgKgorICogcHJhZ21hKG1zZywgQWxsTWV0aG9kTmFtZXMhT2JqZWN0KTsKKyAqIC0tLQorICovCit0ZW1wbGF0ZSBDb21wb3NlKFQuLi4pIHsKKyAgc3RhdGljIGlmIChULmxlbmd0aCA9PSAwKSB7CisgICAgdGVtcGxhdGUgQ29tcG9zZShVLi4uKSB7CisgICAgICBhbGlhcyBVIENvbXBvc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIHRlbXBsYXRlIENvbXBvc2UoVS4uLikgeworICAgICAgYWxpYXMgSW5zdGFudGlhdGUhKFRbMF0sIEluc3RhbnRpYXRlISguQ29tcG9zZSEoVFsxIC4uICRdKSwgVSkpIENvbXBvc2U7CisgICAgfQorICB9Cit9CisKKy8qKgorICogSW5zdGFudGlhdGVzIHRoZSBnaXZlbiB0ZW1wbGF0ZSB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIHBhcmFtZXRlcnMuCisgKgorICogVXNlZCB0byB3b3JrIGFyb3VuZCBzeW50YWN0aWMgbGltaWF0aW9ucyBvZiBEIHdpdGggcmVnYXJkIHRvIGluc3RhbnRpYXRpbmcKKyAqIGEgdGVtcGxhdGUgZnJvbSBhIHR5cGUgdHVwbGUgKGUuZy4gVFswXSEoLi4uKSBpcyBub3QgdmFsaWQpIG9yIGEgdGVtcGxhdGUKKyAqIHJldHVybmluZyBhbm90aGVyIHRlbXBsYXRlIChlLmcuIEZvbyEoQmFyKSEoQmF6KSBpcyBub3QgYWxsb3dlZCkuCisgKi8KK3RlbXBsYXRlIEluc3RhbnRpYXRlKGFsaWFzIFRlbXBsYXRlLCBQYXJhbXMuLi4pIHsKKyAgYWxpYXMgVGVtcGxhdGUhUGFyYW1zIEluc3RhbnRpYXRlOworfQorCisvKioKKyAqIENvbWJpbmVzIHNldmVyYWwgdGVtcGxhdGUgcHJlZGljYXRlcyB1c2luZyBsb2dpY2FsIEFORCwgaS5lLiBpbnN0YW50aWF0aW5nCisgKiBBbGwhKGEsIGIsIGMpIHdpdGggcGFyYW1ldGVycyBQIGZvciBzb21lIHRlbXBsYXRlcyBhLCBiLCBjIGlzIGVxdWl2YWxlbnQgdG8KKyAqIGEhUCAmJiBiIVAgJiYgYyFQLgorICoKKyAqIFRoZSB0ZW1wbGF0ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQsIGFib3J0aW5nIGV2YWx1YXRpb24gaW4gYQorICogc2h1cnQtY3V0IG1hbm5lciBpZiBhIGZhbHNlIHJlc3VsdCBpcyBlbmNvdW50ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGUgbGF0dGVyCisgKiBpbnN0YW50aWF0aW9ucyBkbyBub3QgbmVlZCB0byBjb21waWxlLgorICovCit0ZW1wbGF0ZSBBbGwoVC4uLikgeworICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICB0ZW1wbGF0ZSBBbGwoVS4uLikgeworICAgICAgZW51bSBBbGwgPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0ZW1wbGF0ZSBBbGwoVS4uLikgeworICAgICAgc3RhdGljIGlmIChJbnN0YW50aWF0ZSEoVFswXSwgVSkpIHsKKyAgICAgICAgYWxpYXMgSW5zdGFudGlhdGUhKC5BbGwhKFRbMSAuLiAkXSksIFUpIEFsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVudW0gQWxsID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogQ29tYmluZXMgc2V2ZXJhbCB0ZW1wbGF0ZSBwcmVkaWNhdGVzIHVzaW5nIGxvZ2ljYWwgT1IsIGkuZS4gaW5zdGFudGlhdGluZworICogQW55IShhLCBiLCBjKSB3aXRoIHBhcmFtZXRlcnMgUCBmb3Igc29tZSB0ZW1wbGF0ZXMgYSwgYiwgYyBpcyBlcXVpdmFsZW50IHRvCisgKiBhIVAgfHwgYiFQIHx8IGMhUC4KKyAqCisgKiBUaGUgdGVtcGxhdGVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LCBhYm9ydGluZyBldmFsdWF0aW9uIGluIGEKKyAqIHNodXJ0LWN1dCBtYW5uZXIgaWYgYSB0cnVlIHJlc3VsdCBpcyBlbmNvdW50ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGUgbGF0dGVyCisgKiBpbnN0YW50aWF0aW9ucyBkbyBub3QgbmVlZCB0byBjb21waWxlLgorICovCit0ZW1wbGF0ZSBBbnkoVC4uLikgeworICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICB0ZW1wbGF0ZSBBbnkoVS4uLikgeworICAgICAgZW51bSBBbnkgPSBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGVtcGxhdGUgQW55KFUuLi4pIHsKKyAgICAgIHN0YXRpYyBpZiAoSW5zdGFudGlhdGUhKFRbMF0sIFUpKSB7CisgICAgICAgIGVudW0gQW55ID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFsaWFzIEluc3RhbnRpYXRlISguQW55IShUWzEgLi4gJF0pLCBVKSBBbnk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIENvbmZpbmVkVHVwbGUoVC4uLikgeworICBhbGlhcyBUIFR1cGxlOworICBlbnVtIGxlbmd0aCA9IFQubGVuZ3RoOworfQorCisvKgorICogZm9yZWFjaCAoSXRlbTsgSXRlbXMpIHsKKyAqICAgTGlzdCA9IE9wZXJhdG9yIShJdGVtLCBMaXN0KTsKKyAqIH0KKyAqIHdoZXJlIEl0ZW1zIGlzIGEgQ29uZmluZWRUdXBsZSBhbmQgTGlzdCBpcyBhIHR5cGUgdHVwbGUuCisgKi8KK3RlbXBsYXRlIEZvckFsbFdpdGhMaXN0KGFsaWFzIEl0ZW1zLCBhbGlhcyBPcGVyYXRvciwgTGlzdC4uLikgaWYgKAorICBpcyh0eXBlb2YoSXRlbXMubGVuZ3RoKSA6IHNpemVfdCkKKyl7CisgIHN0YXRpYyBpZiAoSXRlbXMubGVuZ3RoID09IDApIHsKKyAgICBhbGlhcyBMaXN0IEZvckFsbFdpdGhMaXN0OworICB9IGVsc2UgeworICAgIGFsaWFzIC5Gb3JBbGxXaXRoTGlzdCEoCisgICAgICBDb25maW5lZFR1cGxlIShJdGVtcy5UdXBsZVsxIC4uICRdKSwKKyAgICAgIE9wZXJhdG9yLAorICAgICAgT3BlcmF0b3IhKEl0ZW1zLlR1cGxlWzBdLCBMaXN0KQorICAgICkgRm9yQWxsV2l0aExpc3Q7CisgIH0KK30KKworLyoqCisgKiBXcmFwcyB0aGUgcGFzc2VkIHRlbXBsYXRlIHByZWRpY2F0ZSBzbyBpdCByZXR1cm5zIHRydWUgaWYgaXQgY29tcGlsZXMgYW5kCisgKiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZmFsc2UgaXQgaXQgZG9lc24ndCBjb21waWxlIG9yIGV2YWx1YXRlcyB0byBmYWxzZS4KKyAqLwordGVtcGxhdGUgQ29tcGlsZXNBbmRUcnVlKGFsaWFzIFQpIHsKKyAgdGVtcGxhdGUgQ29tcGlsZXNBbmRUcnVlKFUuLi4pIHsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihUIVUpIDogYm9vbCkpIHsKKyAgICAgIGVudW0gYm9vbCBDb21waWxlc0FuZFRydWUgPSBUIVU7CisgICAgfSBlbHNlIHsKKyAgICAgIGVudW0gYm9vbCBDb21waWxlc0FuZFRydWUgPSBmYWxzZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY3RmZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jdGZlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0ZGIwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY3RmZS5kCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5jdGZlOworCitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQudHJhaXRzOworCisvKgorICogU2ltcGxlIGVhZ2VyIGpvaW4oKSBmb3Igc3RyaW5ncywgc3RkLmFsZ29yaXRobS5qb2luIGlzbid0IENURkVhYmxlIHlldC4KKyAqLworc3RyaW5nIGN0ZmVKb2luKHN0cmluZ1tdIHN0cmluZ3MsIHN0cmluZyBzZXBhcmF0b3IgPSAiLCAiKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIGlmIChzdHJpbmdzLmxlbmd0aCA+IDApIHsKKyAgICByZXN1bHQgfj0gc3RyaW5nc1swXTsKKyAgICBmb3JlYWNoIChzOyBzdHJpbmdzWzEuLiRdKSB7CisgICAgICByZXN1bHQgfj0gc2VwYXJhdG9yIH4gczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEEgdmVyeSBwcmltaXRpdmUgdG8hc3RyaW5nKCkgaW1wbGVtZW50YXRpb24gZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgdGhhdAorICogaXMgZXZhbHVhdGFibGUgYXQgY29tcGlsZSB0aW1lLgorICoKKyAqIFRoZXJlIGlzIGEgd2VhbHRoIG9mIHByb2JsZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWxnb3JpdGhtIHVzZWQgKGUuZy4gNS4wCisgKiBwcmludHMgYXMgNC45OTnigKYsIGluY29ycmVjdCByb3VuZGluZywgZXRjLiksIGJ1dCBhIGJldHRlciBhbHRlcm5hdGl2ZSBzaG91bGQKKyAqIGJlIGluY2x1ZGVkIHdpdGggdGhlIEQgc3RhbmRhcmQgbGlicmFyeSBpbnN0ZWFkIG9mIGltcGxlbWVudGluZyBpdCBoZXJlLgorICovCitzdHJpbmcgY3RmZVRvU3RyaW5nKFQpKFQgdmFsKSBpZiAoaXNGbG9hdGluZ1BvaW50IVQpIHsKKyAgaWYgKHZhbCBpcyBULm5hbikgcmV0dXJuICJuYW4iOworICBpZiAodmFsIGlzIFQuaW5maW5pdHkpIHJldHVybiAiaW5mIjsKKyAgaWYgKHZhbCBpcyAtVC5pbmZpbml0eSkgcmV0dXJuICItaW5mIjsKKyAgaWYgKHZhbCBpcyAwLjApIHJldHVybiAiMCI7CisgIGlmICh2YWwgaXMgLTAuMCkgcmV0dXJuICItMCI7CisKKyAgYXV0byBiID0gdmFsOworCisgIHN0cmluZyByZXN1bHQ7CisgIGlmIChiIDwgMCkgeworICAgIHJlc3VsdCB+PSAnLSc7CisgICAgYiAqPSAtMTsKKyAgfQorCisgIHNob3J0IG1hZ25pdHVkZTsKKyAgd2hpbGUgKGIgPj0gMTApIHsKKyAgICArK21hZ25pdHVkZTsKKyAgICBiIC89IDEwOworICB9CisgIHdoaWxlIChiIDwgMSkgeworICAgIC0tbWFnbml0dWRlOworICAgIGIgKj0gMTA7CisgIH0KKworICBmb3JlYWNoIChpOyAwIC4uIFQuZGlnKSB7CisgICAgaWYgKGkgPT0gMSkgcmVzdWx0IH49ICcuJzsKKworICAgIGF1dG8gZmlyc3QgPSBjYXN0KHVieXRlKWI7CisgICAgcmVzdWx0IH49IHRvIXN0cmluZyhmaXJzdCk7CisKKyAgICBiIC09IGZpcnN0OworICAgIGltcG9ydCBzdGQubWF0aDsKKyAgICBpZiAoYiA8IHBvdygxMC4wLCBpIC0gVC5kaWcpKSBicmVhazsKKyAgICBiICo9IDEwOworICB9CisKKyAgaWYgKG1hZ25pdHVkZSAhPSAwKSByZXN1bHQgfj0gImUiIH4gdG8hc3RyaW5nKG1hZ25pdHVkZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5hbGdvcml0aG07CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKGRvdWJsZS5pbmZpbml0eSkgPT0gImluZiIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygtZG91YmxlLmluZmluaXR5KSA9PSAiLWluZiIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZyhkb3VibGUubmFuKSA9PSAibmFuIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDAuMCkgPT0gIjAiKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoLTAuMCkgPT0gIi0wIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDIuNSkgPT0gIjIuNSIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygzLjE0MTUpLnN0YXJ0c1dpdGgoIjMuMTQxIikpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygyZS0yMDApID09ICIyZS0yMDAiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvZW5kaWFuLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2VuZGlhbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjk4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2VuZGlhbi5kCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFNpbXBsZSBoZWxwZXJzIGZvciBoYW5kbGluZyB0eXBpY2FsIGJ5dGUgb3JkZXItcmVsYXRlZCBpc3N1ZXMuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuZW5kaWFuOworCitpbXBvcnQgY29yZS5iaXRvcCA6IGJzd2FwOworaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0ludGVncmFsOworCit1bmlvbiBJbnRCdWYoVCkgeworICB1Ynl0ZVtULnNpemVvZl0gYnl0ZXM7CisgIFQgdmFsdWU7Cit9CisKK1QgYnl0ZVN3YXAoVCkoVCB0KSBwdXJlIG5vdGhyb3cgQHRydXN0ZWQgaWYgKGlzSW50ZWdyYWwhVCkgeworICBzdGF0aWMgaWYgKFQuc2l6ZW9mID09IDIpIHsKKyAgICByZXR1cm4gY2FzdChUKSgodCAmIDB4ZmYpIDw8IDgpIHwgY2FzdChUKSgodCAmIDB4ZmYwMCkgPj4gOCk7CisgIH0gZWxzZSBzdGF0aWMgaWYgKFQuc2l6ZW9mID09IDQpIHsKKyAgICByZXR1cm4gY2FzdChUKWJzd2FwKGNhc3QodWludCl0KTsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoVC5zaXplb2YgPT0gOCkgeworICAgIHJldHVybiBjYXN0KFQpYnl0ZVN3YXAoY2FzdCh1aW50KSh0ICYgMHhmZmZmZmZmZikpIDw8IDMyIHwKKyAgICAgIGNhc3QoVClic3dhcChjYXN0KHVpbnQpKHQgPj4gMzIpKTsKKyAgfSBlbHNlIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJUeXBlIG9mIHNpemUgIiB+IHRvIXN0cmluZyhULnNpemVvZikgfiAiIG5vdCBzdXBwb3J0ZWQuIik7Cit9CisKK1QgZG9Ob3RoaW5nKFQpKFQgdmFsKSB7IHJldHVybiB2YWw7IH0KKwordmVyc2lvbiAoQmlnRW5kaWFuKSB7CisgIGFsaWFzIGRvTm90aGluZyBob3N0VG9OZXQ7CisgIGFsaWFzIGRvTm90aGluZyBuZXRUb0hvc3Q7CisgIGFsaWFzIGJ5dGVTd2FwIGhvc3RUb0xlOworICBhbGlhcyBieXRlU3dhcCBsZVRvSG9zdDsKK30gZWxzZSB7CisgIGFsaWFzIGJ5dGVTd2FwIGhvc3RUb05ldDsKKyAgYWxpYXMgYnl0ZVN3YXAgbmV0VG9Ib3N0OworICBhbGlhcyBkb05vdGhpbmcgaG9zdFRvTGU7CisgIGFsaWFzIGRvTm90aGluZyBsZVRvSG9zdDsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKworICBJbnRCdWYhc2hvcnQgczsKKyAgcy5ieXRlcyA9IFsxLCAyXTsKKyAgcy52YWx1ZSA9IGJ5dGVTd2FwKHMudmFsdWUpOworICBlbmZvcmNlKHMuYnl0ZXMgPT0gWzIsIDFdKTsKKworICBJbnRCdWYhaW50IGk7CisgIGkuYnl0ZXMgPSBbMSwgMiwgMywgNF07CisgIGkudmFsdWUgPSBieXRlU3dhcChpLnZhbHVlKTsKKyAgZW5mb3JjZShpLmJ5dGVzID09IFs0LCAzLCAyLCAxXSk7CisKKyAgSW50QnVmIWxvbmcgbDsKKyAgbC5ieXRlcyA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4XTsKKyAgbC52YWx1ZSA9IGJ5dGVTd2FwKGwudmFsdWUpOworICBlbmZvcmNlKGwuYnl0ZXMgPT0gWzgsIDcsIDYsIDUsIDQsIDMsIDIsIDFdKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvcmVzb3VyY2VfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MjBhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvcmVzb3VyY2VfcG9vbC5kCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnJlc291cmNlX3Bvb2w7CisKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyLCBUaWNrRHVyYXRpb247CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pblBvcywgcmVkdWNlLCByZW1vdmU7CitpbXBvcnQgc3RkLmFycmF5IDogYXJyYXksIGVtcHR5OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnJhbmRvbSA6IHJhbmRvbUNvdmVyLCBybmRHZW47CitpbXBvcnQgc3RkLnJhbmdlIDogemlwOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5hbGdvcml0aG0gOiByZW1vdmVFcXVhbDsKKworLyoqCisgKiBBIHBvb2wgb2YgcmVzb3VyY2VzLCB3aGljaCBjYW4gYmUgaXRlcmF0ZWQgb3ZlciwgYW5kIHdoZXJlIHJlc291cmNlcyB0aGF0CisgKiBoYXZlIGZhaWxlZCB0b28gb2Z0ZW4gY2FuIGJlIHRlbXBvcmFyaWx5IGRpc2FibGVkLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgb2JsaXZpb3VzIHRvIHRoZSBhY3R1YWwgcmVzb3VyY2UgdHlwZSBtYW5hZ2VkLgorICovCitmaW5hbCBjbGFzcyBUUmVzb3VyY2VQb29sKFJlc291cmNlKSB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcmVzb3VyY2VzID0gVGhlIGluaXRpYWwgbWVtYmVycyBvZiB0aGUgcG9vbC4KKyAgICovCisgIHRoaXMoUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKKyAgICByZXNvdXJjZXNfID0gcmVzb3VyY2VzOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgYSByZXNvdXJjZSB0byB0aGUgcG9vbC4KKyAgICovCisgIHZvaWQgYWRkKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgcmVzb3VyY2VzXyB+PSByZXNvdXJjZTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgcG9vbC4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgcmVzb3VyY2UgY291bGQgYmUgZm91bmQgaW4gdGhlIHBvb2wuCisgICAqLworICBib29sIHJlbW92ZShSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIGF1dG8gb2xkTGVuZ3RoID0gcmVzb3VyY2VzXy5sZW5ndGg7CisgICAgcmVzb3VyY2VzXyA9IHJlbW92ZUVxdWFsKHJlc291cmNlc18sIHJlc291cmNlKTsKKyAgICByZXR1cm4gcmVzb3VyY2VzXy5sZW5ndGggPCBvbGRMZW5ndGg7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhbiDCu2VucmljaGVkwqsgaW5wdXQgcmFuZ2UgdG8gaXRlcmF0ZSBvdmVyIHRoZSBwb29sIG1lbWJlcnMuCisgICAqLworICBzdGF0aWMgc3RydWN0IFJhbmdlIHsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIGNhc2UgaWYgYWxsIG1lbWJlcnMgb2YgdGhlIHBvb2wgaGF2ZSBiZWVuIHBvcHBlZCAob3Igc2tpcHBlZAorICAgICAqIGJlY2F1c2UgdGhleSB3ZXJlIGRpc2FibGVkKSBhbmQgVFJlc291cmNlUG9vbC5jeWNsZSBpcyBmYWxzZSwgb3IgdGhlcmUKKyAgICAgKiBpcyBubyBlbGVtZW50IHRvIHJldHVybiBpbiBjeWNsZSBtb2RlIGJlY2F1c2UgYWxsIGhhdmUgYmVlbiB0ZW1wb3JhcmlseQorICAgICAqIGRpc2FibGVkLgorICAgICAqLworICAgIGJvb2wgZW1wdHkoKSBAcHJvcGVydHkgeworICAgICAgLy8gSWYgbm8gcmVzb3VyY2VzIGFyZSBpbiB0aGUgcG9vbCwgdGhlIHJhbmdlIHdpbGwgbmV2ZXIgYmVjb21lIG5vbi1lbXB0eS4KKyAgICAgIGlmIChyZXNvdXJjZXNfLmVtcHR5KSByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gSWYgd2UgYWxyZWFkeSBnb3QgdGhlIG5leHQgcmVzb3VyY2UgaW4gdGhlIGNhY2hlLCBpdCBkb2Vzbid0IG1hdHRlcgorICAgICAgLy8gd2hldGhlciB0aGVyZSBhcmUgbW9yZS4KKyAgICAgIGlmIChjYWNoZWRfKSByZXR1cm4gZmFsc2U7CisKKyAgICAgIHNpemVfdCBleGFtaW5lQ291bnQ7CisgICAgICBpZiAocGFyZW50Xy5jeWNsZSkgeworICAgICAgICAvLyBXZSB3YW50IHRvIGNoZWNrIGFsbCB0aGUgcmVzb3VyY2VzLCBidXQgbm90IGl0ZXJhdGUgbW9yZSB0aGFuIG9uY2UKKyAgICAgICAgLy8gdG8gYXZvaWQgc3Bpbm5pbmcgaW4gYSBsb29wIGlmIG5vdGhpbmcgaXMgYXZhaWxhYmxlLgorICAgICAgICBleGFtaW5lQ291bnQgPSByZXNvdXJjZXNfLmxlbmd0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdoZW4gbm90IGluIGN5Y2xlIG1vZGUsIHdlIGp1c3QgaXRlcmF0ZSB0aGUgbGlzdCBleGFjdGx5IG9uY2UuIElmIGFsbAorICAgICAgICAvLyBpdGVtcyBoYXZlIGJlZW4gY29uc3VtZWQsIHRoZSBpbnRlcnZhbCBiZWxvdyBpcyBlbXB0eS4KKyAgICAgICAgZXhhbWluZUNvdW50ID0gcmVzb3VyY2VzXy5sZW5ndGggLSBuZXh0SW5kZXhfOworICAgICAgfQorCisgICAgICBmb3JlYWNoIChpOyAwIC4uIGV4YW1pbmVDb3VudCkgeworICAgICAgICBhdXRvIHIgPSByZXNvdXJjZXNfWyhuZXh0SW5kZXhfICsgaSkgJSByZXNvdXJjZXNfLmxlbmd0aF07CisgICAgICAgIGF1dG8gZmkgPSByIGluIHBhcmVudF8uZmF1bHRJbmZvc187CisKKyAgICAgICAgaWYgKGZpICYmIGZpLnJlc2V0VGltZSAhPSBmaS5yZXNldFRpbWUuaW5pdCkgeworICAgICAgICAgIGlmIChmaS5yZXNldFRpbWUgPCBwYXJlbnRfLmdldEN1cnJlbnRUaWNrXygpKSB7CisgICAgICAgICAgICAvLyBUaGUgdGltZW91dCBleHBpcmVkLCByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gdGhlIGxpc3QgYW5kIGdvCisgICAgICAgICAgICAvLyBhaGVhZCB0cnlpbmcgaXQuCisgICAgICAgICAgICBwYXJlbnRfLmZhdWx0SW5mb3NfLnJlbW92ZShyKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIHRpbWVvdXQgZGlkbid0IGV4cGlyZSB5ZXQsIHRyeSB0aGUgbmV4dCByZXNvdXJjZS4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNhY2hlXyA9IHI7CisgICAgICAgIGNhY2hlZF8gPSB0cnVlOworICAgICAgICBuZXh0SW5kZXhfID0gbmV4dEluZGV4XyArIGkgKyAxOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBhbGwgcmVzb3VyY2VzIGFyZSBjdXJyZW50bHkgaW5hY3RpdmUgb3IgdGhlIG5vbi1jeWNsZQorICAgICAgLy8gcG9vbCBoYXMgYmVlbiBleGhhdXN0ZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvLgorICAgICAgbmV4dEluZGV4XyA9IG5leHRJbmRleF8gKyBleGFtaW5lQ291bnQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCByZXNvdXJjZSBpbiB0aGUgcmFuZ2UuCisgICAgICovCisgICAgUmVzb3VyY2UgZnJvbnQoKSBAcHJvcGVydHkgeworICAgICAgZW5mb3JjZSghZW1wdHkpOworICAgICAgcmV0dXJuIGNhY2hlXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBmaXJzdCByZXNvdXJjZSBmcm9tIHRoZSByYW5nZS4KKyAgICAgKgorICAgICAqIFVzdWFsbHksIHRoaXMgaXMgY29tYmluZWQgd2l0aCBhIGNhbGwgdG8gVFJlc291cmNlUG9vbC5yZWNvcmRTdWNjZXNzKCkKKyAgICAgKiBvciByZWNvcmRGYXVsdCgpLgorICAgICAqLworICAgIHZvaWQgcG9wRnJvbnQoKSB7CisgICAgICBlbmZvcmNlKCFlbXB0eSk7CisgICAgICBjYWNoZWRfID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByYW5nZSB3aWxsIGJlY29tZSBub24tZW1wdHkgYXQgc29tZSBwb2ludCBpbiB0aGUKKyAgICAgKiBmdXR1cmUsIGFuZCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoZW4gdGhpcyB3aWxsIGhhcHBlbiBhbmQKKyAgICAgKiB3aGF0IHdpbGwgYmUgdGhlIG5leHQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBNYWtlcyBvbmx5IHNlbnNlIHRvIGNhbGwgb24gZW1wdHkgcmFuZ2VzLgorICAgICAqCisgICAgICogUGFyYW1zOgorICAgICAqICAgbmV4dCA9IFRoZSBuZXh0IHJlc291cmNlIHRoYXQgd2lsbCBiZWNvbWUgYXZhaWxhYmxlLgorICAgICAqICAgd2FpdFRpbWUgPSBUaGUgZHVyYXRpb24gdW50aWwgdGhhdCByZXNvdXJjZSB3aWxsIGJlY29tZSBhdmFpbGFibGUuCisgICAgICovCisgICAgYm9vbCB3aWxsQmVjb21lTm9uZW1wdHkob3V0IFJlc291cmNlIG5leHQsIG91dCBEdXJhdGlvbiB3YWl0VGltZSkgeworICAgICAgLy8gSWYgbm8gcmVzb3VyY2VzIGFyZSBpbiB0aGUgcG9vbCwgdGhlIHJhbmdlIHdpbGwgbmV2ZXIgYmVjb21lIG5vbi1lbXB0eS4KKyAgICAgIGlmIChyZXNvdXJjZXNfLmVtcHR5KSByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIElmIGN5Y2xlIG1vZGUgaXMgbm90IGVuYWJsZWQsIGEgcmFuZ2UgbmV2ZXIgYmVjb21lcyBub24tZW1wdHkgYWZ0ZXIKKyAgICAgIC8vIGJlaW5nIGVtcHR5IG9uY2UsIGJlY2F1c2UgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbgorICAgICAgLy8gdXNlZC9za2lwcGVkIGluIG9yZGVyIHRvIGJlY29tZSBlbXB0eS4KKyAgICAgIGlmICghcGFyZW50Xy5jeWNsZSkgcmV0dXJuIGZhbHNlOworCisgICAgICBhdXRvIGZpID0gcGFyZW50Xy5mYXVsdEluZm9zXzsKKyAgICAgIGF1dG8gbmV4dFBhaXIgPSBtaW5Qb3MhImFbMV0ucmVzZXRUaW1lIDwgYlsxXS5yZXNldFRpbWUiKAorICAgICAgICB6aXAoZmkua2V5cywgZmkudmFsdWVzKQorICAgICAgKS5mcm9udDsKKworICAgICAgbmV4dCA9IG5leHRQYWlyWzBdOworICAgICAgd2FpdFRpbWUgPSB0byFEdXJhdGlvbihuZXh0UGFpclsxXS5yZXNldFRpbWUgLSBwYXJlbnRfLmdldEN1cnJlbnRUaWNrXygpKTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdGhpcyhUUmVzb3VyY2VQb29sIHBhcmVudCwgUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKKyAgICAgIHBhcmVudF8gPSBwYXJlbnQ7CisgICAgICByZXNvdXJjZXNfID0gcmVzb3VyY2VzOworICAgIH0KKworICAgIFRSZXNvdXJjZVBvb2wgcGFyZW50XzsKKworICAgIC8vLyBBbGwgYXZhaWxhYmxlIHJlc291cmNlcy4gV2Uga2VlcCBhIGNvcHkgb2YgaXQgYXMgdG8gbm90IGdldCBjb25mdXNlZAorICAgIC8vLyB3aGVuIHJlc291cmNlcyBhcmUgYWRkZWQgdG8vcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQgcG9vbC4KKyAgICBSZXNvdXJjZVtdIHJlc291cmNlc187CisKKyAgICAvLy8gQWZ0ZXIgd2UgaGF2ZSBkZXRlcm1pbmVkIHRoZSBuZXh0IGVsZW1lbnQgaW4gZW1wdHkoKSwgd2Ugc3RvcmUgaXQgaGVyZS4KKyAgICBSZXNvdXJjZSBjYWNoZV87CisKKyAgICAvLy8gV2hldGhlciB0aGVyZSBpcyBjdXJyZW50bHkgc29tZXRoaW5nIGluIHRoZSBjYWNoZS4KKyAgICBib29sIGNhY2hlZF87CisKKyAgICAvLy8gVGhlIGluZGV4IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIGF0IHRoZSBuZXh0IGNhbGwgdG8gZW1wdHkoKS4KKyAgICBzaXplX3QgbmV4dEluZGV4XzsKKyAgfQorCisgIC8vLyBEaXR0bworICBSYW5nZSBvcFNsaWNlKCkgeworICAgIGF1dG8gcmVzID0gcmVzb3VyY2VzXzsKKyAgICBpZiAocGVybXV0ZSkgeworICAgICAgcmVzID0gYXJyYXkocmFuZG9tQ292ZXIocmVzLCBybmRHZW4pKTsKKyAgICB9CisgICAgcmV0dXJuIFJhbmdlKHRoaXMsIHJlcyk7CisgIH0KKworICAvKioKKyAgICogUmVjb3JkcyBhIHN1Y2Nlc3MgZm9yIGFuIG9wZXJhdGlvbiBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2UsIGNhbmNlbGxpbmcgYQorICAgKiBmYXVsdCBzdHJlYWssIGlmIGFueS4KKyAgICovCisgIHZvaWQgcmVjb3JkU3VjY2VzcyhSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIGlmIChyZXNvdXJjZSBpbiBmYXVsdEluZm9zXykgeworICAgICAgZmF1bHRJbmZvc18ucmVtb3ZlKHJlc291cmNlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVjb3JkcyBhIGZhdWx0IGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCisgICAqCisgICAqIElmIGEgcmVzb3VyY2UgZmFpbHMgY29uc2VjdXRpdmVseSBmb3IgbW9yZSB0aGFuIGZhdWx0RGlzYWJsZUNvdW50IHRpbWVzLAorICAgKiBpdCBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCAobm8gbG9uZ2VyIGNvbnNpZGVyZWQpIHVudGlsCisgICAqIGZhdWx0RGlzYWJsZUR1cmF0aW9uIGhhcyBwYXNzZWQuCisgICAqLworICB2b2lkIHJlY29yZEZhdWx0KFJlc291cmNlIHJlc291cmNlKSB7CisgICAgYXV0byBmaSA9IHJlc291cmNlIGluIGZhdWx0SW5mb3NfOworCisgICAgaWYgKCFmaSkgeworICAgICAgZmF1bHRJbmZvc19bcmVzb3VyY2VdID0gRmF1bHRJbmZvKCk7CisgICAgICBmaSA9IHJlc291cmNlIGluIGZhdWx0SW5mb3NfOworICAgIH0KKworICAgICsrZmkuY291bnQ7CisgICAgaWYgKGZpLmNvdW50ID49IGZhdWx0RGlzYWJsZUNvdW50KSB7CisgICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaGFzIGhpdCB0aGUgZmF1bHQgY291bnQgbGltaXQsIGRpc2FibGUgaXQgZm9yCisgICAgICAvLyBzcGVjaWZpZWQgZHVyYXRpb24uCisgICAgICBmaS5yZXNldFRpbWUgPSBnZXRDdXJyZW50VGlja18oKSArIGNhc3QoVGlja0R1cmF0aW9uKWZhdWx0RGlzYWJsZUR1cmF0aW9uOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHJhbmRvbWx5IHBlcm11dGUgdGhlIG9yZGVyIG9mIHRoZSByZXNvdXJjZXMgaW4gdGhlIHBvb2wgd2hlbgorICAgKiB0YWtpbmcgYSByYW5nZSB1c2luZyBvcFNsaWNlKCkuCisgICAqCisgICAqIFRoaXMgY2FuIGJlIHVzZWQgZS5nLiBhcyBhIHNpbXBsZSBmb3JtIG9mIGxvYWQgYmFsYW5jaW5nLgorICAgKi8KKyAgYm9vbCBwZXJtdXRlID0gdHJ1ZTsKKworICAvKioKKyAgICogV2hldGhlciB0byBrZWVwIGl0ZXJhdGluZyBvdmVyIHRoZSBwb29sIG1lbWJlcnMgYWZ0ZXIgYWxsIGhhdmUgYmVlbgorICAgKiByZXR1cm5lZC9oYXZlIGZhaWxlZCBvbmNlLgorICAgKi8KKyAgYm9vbCBjeWNsZSA9IGZhbHNlOworCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZhdWx0cyBhZnRlciB3aGljaCBhIHJlc291cmNlIGlzIGRpc2FibGVkIHVudGlsCisgICAqIGZhdWx0RGlzYWJsZUR1cmF0aW9uIGhhcyBwYXNzZWQuIFplcm8gdG8gbmV2ZXIgZGlzYWJsZSByZXNvdXJjZXMuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8uCisgICAqLworICB1c2hvcnQgZmF1bHREaXNhYmxlQ291bnQgPSAwOworCisgIC8qKgorICAgKiBUaGUgZHVyYXRpb24gZm9yIHdoaWNoIGEgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYWZ0ZXIgaXQgaGFzCisgICAqIGZhaWxlZCB0b28gb2Z0ZW4uCisgICAqCisgICAqIERlZmF1bHRzIHRvIG9uZSBzZWNvbmQuCisgICAqLworICBEdXJhdGlvbiBmYXVsdERpc2FibGVEdXJhdGlvbiA9IGR1ciEic2Vjb25kcyIoMSk7CisKK3ByaXZhdGU6CisgIFJlc291cmNlW10gcmVzb3VyY2VzXzsKKyAgRmF1bHRJbmZvW1Jlc291cmNlXSBmYXVsdEluZm9zXzsKKworICAvLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBmcm9tIHNvbWUgbW9ub3RvbmljIHN5c3RlbSBjbG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG92ZXJyaWRhYmxlIHRvIGJlIGFibGUgdG8gd3JpdGUgdGltaW5nLWluc2Vuc2l0aXZlIHVuaXQgdGVzdHMuCisgIC8vLyBUaGUgZXh0cmEgaW5kaXJlY3Rpb24gc2hvdWxkIG5vdCBtYXR0ZXIgbXVjaCBwZXJmb3JtYW5jZS13aXNlIGNvbXBhcmVkIHRvCisgIC8vLyB0aGUgYWN0dWFsIHN5c3RlbSBjYWxsLCBhbmQgYnkgaXRzIHZlcnkgbmF0dXJlIHRoaXNzaG91bGQgbm90IGJlIG9uIGEgaG90CisgIC8vLyBwYXRoIGFueXdheS4KKyAgdHlwZW9mKCZUaWNrRHVyYXRpb24uY3VyclN5c3RlbVRpY2spIGdldEN1cnJlbnRUaWNrXyA9CisgICAgJlRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljazsKK30KKworcHJpdmF0ZSB7CisgIHN0cnVjdCBGYXVsdEluZm8geworICAgIHVzaG9ydCBjb3VudDsKKyAgICBUaWNrRHVyYXRpb24gcmVzZXRUaW1lOworICB9Cit9CisKK3VuaXR0ZXN0IHsKKyAgYXV0byBwb29sID0gbmV3IFRSZXNvdXJjZVBvb2whT2JqZWN0KFtdKTsKKyAgZW5mb3JjZShwb29sW10uZW1wdHkpOworICBPYmplY3QgZHVtbXlSZXM7CisgIER1cmF0aW9uIGR1bW15RHVyOworICBlbmZvcmNlKCFwb29sW10ud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZGF0ZXRpbWU7CisgIGltcG9ydCB0aHJpZnQuYmFzZTsKKworICBhdXRvIGEgPSBuZXcgT2JqZWN0OworICBhdXRvIGIgPSBuZXcgT2JqZWN0OworICBhdXRvIGMgPSBuZXcgT2JqZWN0OworICBhdXRvIG9ianMgPSBbYSwgYiwgY107CisgIGF1dG8gcG9vbCA9IG5ldyBUUmVzb3VyY2VQb29sIU9iamVjdChvYmpzKTsKKyAgcG9vbC5wZXJtdXRlID0gZmFsc2U7CisKKyAgc3RhdGljIER1cmF0aW9uIGZha2VDbG9jazsKKyAgcG9vbC5nZXRDdXJyZW50VGlja18gPSAoKSA9PiBjYXN0KFRpY2tEdXJhdGlvbilmYWtlQ2xvY2s7CisKKyAgT2JqZWN0IGR1bW15UmVzID0gdm9pZDsKKyAgRHVyYXRpb24gZHVtbXlEdXIgPSB2b2lkOworCisgIHsKKyAgICBhdXRvIHIgPSBwb29sW107CisKKyAgICBmb3JlYWNoIChpLCBvOyBvYmpzKSB7CisgICAgICBlbmZvcmNlKCFyLmVtcHR5KTsKKyAgICAgIGVuZm9yY2Uoci5mcm9udCA9PSBvKTsKKyAgICAgIHIucG9wRnJvbnQoKTsKKyAgICB9CisKKyAgICBlbmZvcmNlKHIuZW1wdHkpOworICAgIGVuZm9yY2UoIXIud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworICB9CisKKyAgeworICAgIHBvb2wuZmF1bHREaXNhYmxlQ291bnQgPSAyOworCisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZFN1Y2Nlc3MoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworCisgICAgYXV0byByID0gcG9vbFtdOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBiKTsKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGMpOworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZW1wdHkpOworICAgIGVuZm9yY2UoIXIud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworCisgICAgZmFrZUNsb2NrICs9IDIuc2Vjb25kczsKKyAgICAvLyBOb3QgaW4gY3ljbGUgbW9kZSwgaGFzIHRvIGJlIHN0aWxsIGVtcHR5IGFmdGVyIHRoZSB0aW1lb3V0cyBleHBpcmVkLgorICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisKKyAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CisgIH0KKworICB7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDE7CisKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYik7CisgICAgcG9vbC5yZWNvcmRGYXVsdChjKTsKKworICAgIGF1dG8gciA9IHBvb2xbXTsKKyAgICBlbmZvcmNlKHIuZW1wdHkpOworICAgIGVuZm9yY2UoIXIud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworCisgICAgZm9yZWFjaCAobzsgb2JqcykgcG9vbC5yZWNvcmRTdWNjZXNzKG8pOworICB9CisKKyAgcG9vbC5jeWNsZSA9IHRydWU7CisKKyAgeworICAgIGF1dG8gciA9IHBvb2xbXTsKKworICAgIGZvcmVhY2ggKG87IG9ianMgfiBvYmpzKSB7CisgICAgICBlbmZvcmNlKCFyLmVtcHR5KTsKKyAgICAgIGVuZm9yY2Uoci5mcm9udCA9PSBvKTsKKyAgICAgIHIucG9wRnJvbnQoKTsKKyAgICB9CisgIH0KKworICB7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDI7CisKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkU3VjY2VzcyhhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisKKyAgICBhdXRvIHIgPSBwb29sW107CisgICAgZW5mb3JjZShyLmZyb250ID09IGIpOworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYyk7CisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBiKTsKKworICAgIGZha2VDbG9jayArPSAyLnNlY29uZHM7CisKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGMpOworCisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBhKTsKKworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworCisgICAgZm9yZWFjaCAobzsgb2JqcykgcG9vbC5yZWNvcmRTdWNjZXNzKG8pOworICB9CisKKyAgeworICAgIHBvb2wuZmF1bHREaXNhYmxlQ291bnQgPSAxOworCisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKyAgICBmYWtlQ2xvY2sgKz0gMS5tc2VjczsKKyAgICBwb29sLnJlY29yZEZhdWx0KGIpOworICAgIGZha2VDbG9jayArPSAxLm1zZWNzOworICAgIHBvb2wucmVjb3JkRmF1bHQoYyk7CisKKyAgICBhdXRvIHIgPSBwb29sW107CisgICAgZW5mb3JjZShyLmVtcHR5KTsKKworICAgIC8vIE1ha2Ugc3VyZSB3aWxsQmVjb21lTm9uZW1wdHkgZ2V0cyB0aGUgb3JkZXIgcmlnaHQuCisgICAgZW5mb3JjZShyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKKyAgICBlbmZvcmNlKGR1bW15UmVzID09IGEpOworICAgIGVuZm9yY2UoZHVtbXlEdXIgPiBEdXJhdGlvbi56ZXJvKTsKKworICAgIGZvcmVhY2ggKG87IG9ianMpIHBvb2wucmVjb3JkU3VjY2VzcyhvKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc29ja2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhMGE5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc29ja2V0LmQKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEFic3RyYWN0aW9ucyBvdmVyIE9TLWRlcGVuZGVudCBzb2NrZXQgZnVuY3Rpb25hbGl0eS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CisKK2ltcG9ydCBzdGQuY29udiA6IHRvOworCisvLyBGcmVlQlNEIGFuZCBPUyBYIHJldHVybiAtMSBhbmQgc2V0IEVDT05OUkVTRVQgaWYgc29ja2V0IHdhcyBjbG9zZWQgYnkKKy8vIHRoZSBvdGhlciBzaWRlLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGF0IGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24uCit2ZXJzaW9uIChGcmVlQlNEKSB7CisgIGVudW0gY29ubnJlc2V0T25QZWVyU2h1dGRvd24gPSB0cnVlOworfSBlbHNlIHZlcnNpb24gKE9TWCkgeworICBlbnVtIGNvbm5yZXNldE9uUGVlclNodXRkb3duID0gdHJ1ZTsKK30gZWxzZSB7CisgIGVudW0gY29ubnJlc2V0T25QZWVyU2h1dGRvd24gPSBmYWxzZTsKK30KKwordmVyc2lvbiAoV2luMzIpIHsKKyAgaW1wb3J0IHN0ZC5jLndpbmRvd3Mud2luc29jayA6IFdTQUdldExhc3RFcnJvciwgV1NBRUlOVFIsIFdTQUVXT1VMREJMT0NLOworICBpbXBvcnQgc3RkLndpbmRvd3Muc3lzZXJyb3IgOiBzeXNFcnJvclN0cmluZzsKKworICAvLyBUaGVzZSBhcmUgdW5mb3J0dW5hdGVseSBub3QgZGVmaW5lZCBpbiBzdGQuYy53aW5kb3dzLndpbnNvY2ssIHNlZQorICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM3NDA2NjguYXNweC4KKyAgZW51bSBXU0FFQ09OTlJFU0VUID0gMTAwNTQ7CisgIGVudW0gV1NBRU5PVENPTk4gPSAxMDA1NzsKKyAgZW51bSBXU0FFVElNRURPVVQgPSAxMDA2MDsKK30gZWxzZSB7CisgIGltcG9ydCBjb3JlLnN0ZGMuZXJybm8gOiBlcnJubywgRUFHQUlOLCBFQ09OTlJFU0VULCBFSU5QUk9HUkVTUywgRUlOVFIsCisgICAgRU5PVENPTk4sIEVQSVBFOworICBpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmVycm9yOworfQorCisvKgorICogQ09OTkVDVF9JTlBST0dSRVNTX0VSUk5POiBzZXQgYnkgY29ubmVjdCgpIGZvciBub24tYmxvY2tpbmcgc29ja2V0cyBpZiB0aGUKKyAqICAgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgaW1tZWRpYXRlbHkgZXN0YWJsaXNoZWQuCisgKiBJTlRFUlJVUFRFRF9FUlJOTzogc2V0IHdoZW4gYmxvY2tpbmcgc3lzdGVtIGNhbGxzIGFyZSBpbnRlcnJ1cHRlZCBieQorICogICBzaWduYWxzIG9yIHNpbWlsYXIuCisgKiBUSU1FT1VUX0VSUk5POiBzZXQgd2hlbiBhIHNvY2tldCB0aW1lb3V0IGhhcyBiZWVuIGV4Y2VlZGVkLgorICogV09VTERfQkxPQ0tfRVJSTk86IHNldCB3aGVuIHNlbmQvcmVjdiB3b3VsZCBibG9jayBvbiBub24tYmxvY2tpbmcgc29ja2V0cy4KKyAqCisgKiBpc1NvY2V0Q2xvc2VFcnJubyhlcnJubyk6IHJldHVybnMgdHJ1ZSBpZiBlcnJubyBpbmRpY2F0ZXMgdGhhdCB0aGUgc29ja2V0CisgKiAgIGlzIGxvZ2ljYWxseSBpbiBjbG9zZWQgc3RhdGUgbm93LgorICovCit2ZXJzaW9uIChXaW4zMikgeworICBhbGlhcyBXU0FHZXRMYXN0RXJyb3IgZ2V0U29ja2V0RXJybm87CisgIGVudW0gQ09OTkVDVF9JTlBST0dSRVNTX0VSUk5PID0gV1NBRVdPVUxEQkxPQ0s7CisgIGVudW0gSU5URVJSVVBURURfRVJSTk8gPSBXU0FFSU5UUjsKKyAgZW51bSBUSU1FT1VUX0VSUk5PID0gV1NBRVRJTUVET1VUOworICBlbnVtIFdPVUxEX0JMT0NLX0VSUk5PID0gV1NBRVdPVUxEQkxPQ0s7CisKKyAgYm9vbCBpc1NvY2tldENsb3NlRXJybm8odHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGVycm5vKSB7CisgICAgcmV0dXJuIChlcnJubyA9PSBXU0FFQ09OTlJFU0VUIHx8IGVycm5vID09IFdTQUVOT1RDT05OKTsKKyAgfQorfSBlbHNlIHsKKyAgYWxpYXMgZXJybm8gZ2V0U29ja2V0RXJybm87CisgIGVudW0gQ09OTkVDVF9JTlBST0dSRVNTX0VSUk5PID0gRUlOUFJPR1JFU1M7CisgIGVudW0gSU5URVJSVVBURURfRVJSTk8gPSBFSU5UUjsKKyAgZW51bSBXT1VMRF9CTE9DS19FUlJOTyA9IEVBR0FJTjsKKworICAvLyBUT0RPOiBUaGUgQysrIFRTb2NrZXQgaW1wbGVtZW50YXRpb24gbWVudGlvbnMgdGhhdCBFQUdBSU4gY2FuIGFsc28gYmUKKyAgLy8gc2V0ICh1bmRvY3VtZW50ZWRseSkgaW4gb3V0IG9mIHJlc291cmNlIGNvbmRpdGlvbnM7IGl0IHdvdWxkIGJlIGEgZ29vZAorICAvLyBpZGVhIHRvIGNvbnRhY3QgdGhlIG9yaWdpbmFsIGF1dGhvcnMgb2YgdGhlIEMrKyBjb2RlIGZvciBkZXRhaWxzIGFuZCBhZGFwdAorICAvLyB0aGUgY29kZSBhY2NvcmRpbmdseS4KKyAgZW51bSBUSU1FT1VUX0VSUk5PID0gRUFHQUlOOworCisgIGJvb2wgaXNTb2NrZXRDbG9zZUVycm5vKHR5cGVvZihnZXRTb2NrZXRFcnJubygpKSBlcnJubykgeworICAgIHJldHVybiAoZXJybm8gPT0gRVBJUEUgfHwgZXJybm8gPT0gRUNPTk5SRVNFVCB8fCBlcnJubyA9PSBFTk9UQ09OTik7CisgIH0KK30KKworc3RyaW5nIHNvY2tldEVycm5vU3RyaW5nKHVpbnQgZXJybm8pIHsKKyAgdmVyc2lvbiAoV2luMzIpIHsKKyAgICByZXR1cm4gc3lzRXJyb3JTdHJpbmcoZXJybm8pOworICB9IGVsc2UgeworICAgIHJldHVybiB0byFzdHJpbmcoc3RyZXJyb3IoZXJybm8pKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmNTRiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuc3NsOworCitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBjb3JlLnN0ZGMuY29uZmlnOworaW1wb3J0IGNvcmUuc3RkYy5lcnJubyA6IGVycm5vOworaW1wb3J0IGNvcmUuc3RkYy5zdHJpbmcgOiBzdHJlcnJvcjsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5lcnI7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuc3NsOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLng1MDl2MzsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgYXBwZW5kZXI7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuc29ja2V0IDogQWRkcmVzczsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKKworLyoqCisgKiBDaGVja3MgaWYgdGhlIHBlZXIgaXMgYXV0aG9yaXplZCBhZnRlciB0aGUgU1NMIGhhbmRzaGFrZSBoYXMgYmVlbgorICogY29tcGxldGVkIG9uIHRoZSBnaXZlbiBjb25uY2V0aW9uIGFuZCB0aHJvd3MgYW4gVFNTTEV4Y2VwdGlvbiBpZiBub3QuCisgKgorICogUGFyYW1zOgorICogICBzc2wgPSBUaGUgU1NMIGNvbm5lY3Rpb24gdG8gY2hlY2suCisgKiAgIGFjY2Vzc01hbmFnZXIgPSBUaGUgYWNjZXNzIG1hbmFnZXIgdG8gY2hlY2sgdGhlIHBlZXIgYWdhaW50cy4KKyAqICAgcGVlckFkZHJlc3MgPSBUaGUgKElQKSBhZGRyZXNzIG9mIHRoZSBwZWVyLgorICogICBob3N0TmFtZSA9IFRoZSBob3N0IG5hbWUgb2YgdGhlIHBlZXIuCisgKi8KK3ZvaWQgYXV0aG9yaXplKFNTTCogc3NsLCBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyLAorICBBZGRyZXNzIHBlZXJBZGRyZXNzLCBsYXp5IHN0cmluZyBob3N0TmFtZQorKSB7CisgIGFsaWFzIFRBY2Nlc3NNYW5hZ2VyLkRlY2lzaW9uIERlY2lzaW9uOworCisgIGF1dG8gcmMgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsKTsKKyAgaWYgKHJjICE9IFg1MDlfVl9PSykgeworICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoKTogIiB+CisgICAgICB0byFzdHJpbmcoWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpKSk7CisgIH0KKworICBhdXRvIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsKTsKKyAgaWYgKGNlcnQgaXMgbnVsbCkgeworICAgIC8vIENlcnRpZmljYXRlIGlzIG5vdCBwcmVzZW50LgorICAgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbCkgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigKKyAgICAgICAgIkF1dGhvcml6ZTogUmVxdWlyZWQgY2VydGlmaWNhdGUgbm90IHByZXNlbnQuIik7CisgICAgfQorCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBhY2Nlc3MgbWFuYWdlciBzZXQsIHdlIGRvbid0IGludGVuZCB0byBhdXRob3JpemUKKyAgICAvLyB0aGUgY2xpZW50LCBzbyBldmVyeXRoaW5nJ3MgZmluZS4KKyAgICBpZiAoYWNjZXNzTWFuYWdlcikgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oCisgICAgICAgICJBdXRob3JpemU6IENlcnRpZmljYXRlIHJlcXVpcmVkIGZvciBhdXRob3JpemF0aW9uLiIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYWNjZXNzTWFuYWdlciBpcyBudWxsKSB7CisgICAgLy8gTm8gYWNjZXNzIG1hbmFnZXIgc2V0LCBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5IGFzIHRoZSBjZXJ0IGlzIHZhbGlkCisgICAgLy8gYW5kIGFsbCBwZWVycyBhcmUgYXV0aG9yaXplZC4KKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQKKyAgYXV0byBkZWNpc2lvbiA9IGFjY2Vzc01hbmFnZXIudmVyaWZ5KHBlZXJBZGRyZXNzKTsKKworICBpZiAoZGVjaXNpb24gIT0gRGVjaXNpb24uU0tJUCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICBpZiAoZGVjaXNpb24gIT0gRGVjaXNpb24uQUxMT1cpIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJBdXRob3JpemU6IEFjY2VzcyBkZW5pZWQgYmFzZWQgb24gcmVtb3RlIElQLiIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBDaGVjayBzdWJqZWN0QWx0TmFtZShzKSwgaWYgcHJlc2VudC4KKyAgYXV0byBhbHRlcm5hdGl2ZXMgPSBjYXN0KFNUQUNLX09GIShHRU5FUkFMX05BTUUpKikKKyAgICBYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBudWxsLCBudWxsKTsKKyAgaWYgKGFsdGVybmF0aXZlcyAhPSBudWxsKSB7CisgICAgYXV0byBjb3VudCA9IHNrX0dFTkVSQUxfTkFNRV9udW0oYWx0ZXJuYXRpdmVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgZGVjaXNpb24gPT0gRGVjaXNpb24uU0tJUCAmJiBpIDwgY291bnQ7IGkrKykgeworICAgICAgYXV0byBuYW1lID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGFsdGVybmF0aXZlcywgaSk7CisgICAgICBpZiAobmFtZSBpcyBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYXV0byBkYXRhID0gQVNOMV9TVFJJTkdfZGF0YShuYW1lLmQuaWE1KTsKKyAgICAgIGF1dG8gbGVuZ3RoID0gQVNOMV9TVFJJTkdfbGVuZ3RoKG5hbWUuZC5pYTUpOworICAgICAgc3dpdGNoIChuYW1lLnR5cGUpIHsKKyAgICAgICAgY2FzZSBHRU5FUkFMX05BTUUuR0VOX0ROUzoKKyAgICAgICAgICBkZWNpc2lvbiA9IGFjY2Vzc01hbmFnZXIudmVyaWZ5KGhvc3ROYW1lLCBjYXN0KGNoYXJbXSlkYXRhWzAgLi4gbGVuZ3RoXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0VORVJBTF9OQU1FLkdFTl9JUEFERDoKKyAgICAgICAgICBkZWNpc2lvbiA9IGFjY2Vzc01hbmFnZXIudmVyaWZ5KHBlZXJBZGRyZXNzLCBkYXRhWzAgLi4gbGVuZ3RoXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBETUQgQEBCVUdAQDogRW1wdHkgdGVtcGxhdGUgYXJndW1lbnRzIHBhcmVucyBzaG91bGQgbm90IGJlIG5lZWRlZC4KKyAgICBza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUhKCkoYWx0ZXJuYXRpdmVzLCAmR0VORVJBTF9OQU1FX2ZyZWUpOworICB9CisKKyAgLy8gSWYgd2UgYXJlIGFscmVkeSBkb25lLCByZXR1cm4uCisgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5TS0lQKSB7CisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5BTExPVykgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIkF1dGhvcml6ZTogQWNjZXNzIGRlbmllZC4iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ2hlY2sgY29tbW9uTmFtZS4KKyAgYXV0byBuYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOworICBpZiAobmFtZSAhaXMgbnVsbCkgeworICAgIFg1MDlfTkFNRV9FTlRSWSogZW50cnk7CisgICAgY2hhciogdXRmODsKKyAgICBpbnQgbGFzdCA9IC0xOworICAgIHdoaWxlIChkZWNpc2lvbiA9PSBEZWNpc2lvbi5TS0lQKSB7CisgICAgICBsYXN0ID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIGxhc3QpOworICAgICAgaWYgKGxhc3QgPT0gLTEpCisgICAgICAgIGJyZWFrOworICAgICAgZW50cnkgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGxhc3QpOworICAgICAgaWYgKGVudHJ5IGlzIG51bGwpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgYXV0byBjb21tb24gPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOworICAgICAgYXV0byBzaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgY29tbW9uKTsKKyAgICAgIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkoaG9zdE5hbWUsIHV0ZjhbMCAuLiBzaXplXSk7CisgICAgICBDUllQVE9fZnJlZSh1dGY4KTsKKyAgICB9CisgIH0KKyAgWDUwOV9mcmVlKGNlcnQpOworICBpZiAoZGVjaXNpb24gIT0gRGVjaXNpb24uQUxMT1cpIHsKKyAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiQXV0aG9yaXplOiBDb3VsZCBub3QgYXV0aG9yaXplIHBlZXIuIik7CisgIH0KK30KKworLyoKKyAqIE9wZW5TU0wgZXJyb3IgaW5mb3JtYXRpb24gdXNlZCBmb3Igc3RvcmluZyBEIGV4Y2VwdGlvbnMgb24gdGhlIE9wZW5TU0wKKyAqIGVycm9yIHN0YWNrLgorICovCitlbnVtIEVSUl9MSUJfRF9FWENFUFRJT04gPSBFUlJfTElCX1VTRVI7CitlbnVtIEVSUl9GX0RfRVhDRVBUSU9OID0gMDsgLy8gZnVuY3Rpb24gaWQgLSB3aGF0IHRvIHVzZSBoZXJlPworZW51bSBFUlJfUl9EX0VYQ0VQVElPTiA9IDEyMzQ7IC8vIDk5IGFuZCBhYm92ZSBhcmUgcmVzZXJ2ZWQgZm9yIGFwcGxpY2F0aW9ucworZW51bSBFUlJfRklMRV9EX0VYQ0VQVElPTiA9ICJkX2V4Y2VwdGlvbiI7CitlbnVtIEVSUl9MSU5FX0RfRVhDRVBUSU9OID0gMDsKK2VudW0gRVJSX0ZMQUdTX0RfRVhDRVBUSU9OID0gMDsKKworLyoqCisgKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiBmb3IgdGhlIGxhc3QuCisgKgorICogUGFyYW1zOgorICogICBsb2NhdGlvbiA9IEFuIG9wdGlvbmFsICJsb2NhdGlvbiIgdG8gYWRkIHRvIHRoZSBlcnJvciBtZXNzYWdlICh0eXBpY2FsbHkKKyAqICAgICB0aGUgbGFzdCBTU0wgQVBJIGNhbGwpLgorICovCitFeGNlcHRpb24gZ2V0U1NMRXhjZXB0aW9uKHN0cmluZyBsb2NhdGlvbiA9IG51bGwsIHN0cmluZyBjbGllbnRGaWxlID0gX19GSUxFX18sCisgIHNpemVfdCBjbGllbnRMaW5lID0gX19MSU5FX18KKykgeworICAvLyBXZSBjYW4gcmV0dXJuIGVpdGhlciBhbiBleGNlcHRpb24gc2F2ZWQgZnJvbSBEIEJJTyBjb2RlLCBvciBhICJ0cnVlIgorICAvLyBPcGVuU1NMIGVycm9yLiBCZWNhdXNlIHRoZXJlIGNhbiBwb3NzaWJseSBiZSBtb3JlIHRoYW4gb25lIGVycm9yIG9uIHRoZQorICAvLyBlcnJvciBzdGFjaywgd2UgaGF2ZSB0byBmZXRjaCBhbGwgb2YgdGhlbSwgYW5kIHBpY2sgdGhlIGxhc3QsIGkuZS4gbmV3ZXN0CisgIC8vIG9uZS4gV2UgY29uY2F0ZW5hdGUgbXVsdGlwbGUgc3VjY2Vzc2l2ZSBPcGVuU1NMIGVycm9yIG1lc3NhZ2VzIGludG8gYQorICAvLyBzaW5nbGUgb25lLCBidXQgYWx3YXlzIGp1c3QgcmV0dXJuIHRoZSBsYXN0IEQgZXhwY2V0aW9uLgorICBzdHJpbmcgbWVzc2FnZTsgLy8gUHJvYmFibHkgYmV0dGVyIHVzZSBhbiBBcHBlbmRlciBoZXJlLgorICBib29sIGhhZE1lc3NhZ2U7CisgIEV4Y2VwdGlvbiBleGNlcHRpb247CisKKyAgdm9pZCBpbml0TWVzc2FnZSgpIHsKKyAgICBtZXNzYWdlLmRlc3Ryb3koKTsKKyAgICBoYWRNZXNzYWdlID0gZmFsc2U7CisgICAgaWYgKCFsb2NhdGlvbi5lbXB0eSkgeworICAgICAgbWVzc2FnZSB+PSBsb2NhdGlvbjsKKyAgICAgIG1lc3NhZ2Ugfj0gIjogIjsKKyAgICB9CisgIH0KKyAgaW5pdE1lc3NhZ2UoKTsKKworICBhdXRvIGVycm4gPSBlcnJubzsKKworICBjb25zdChjaGFyKSogZmlsZSA9IHZvaWQ7CisgIGludCBsaW5lID0gdm9pZDsKKyAgY29uc3QoY2hhcikqIGRhdGEgPSB2b2lkOworICBpbnQgZmxhZ3MgPSB2b2lkOworICBjX3Vsb25nIGNvZGUgPSB2b2lkOworICB3aGlsZSAoKGNvZGUgPSBFUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YSgmZmlsZSwgJmxpbmUsICZkYXRhLCAmZmxhZ3MpKSAhPSAwKSB7CisgICAgaWYgKEVSUl9HRVRfUkVBU09OKGNvZGUpID09IEVSUl9SX0RfRVhDRVBUSU9OKSB7CisgICAgICBpbml0TWVzc2FnZSgpOworICAgICAgR0MucmVtb3ZlUm9vdChjYXN0KHZvaWQqKWRhdGEpOworICAgICAgZXhjZXB0aW9uID0gY2FzdChFeGNlcHRpb24pZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgZXhjZXB0aW9uID0gbnVsbDsKKworICAgICAgaWYgKGhhZE1lc3NhZ2UpIHsKKyAgICAgICAgbWVzc2FnZSB+PSAiLCAiOworICAgICAgfQorCisgICAgICBhdXRvIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGNvZGUpOworICAgICAgaWYgKHJlYXNvbikgeworICAgICAgICBtZXNzYWdlIH49ICJTU0wgZXJyb3I6ICIgfiB0byFzdHJpbmcocmVhc29uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lc3NhZ2Ugfj0gIlNTTCBlcnJvciAjIiB+IHRvIXN0cmluZyhjb2RlKTsKKyAgICAgIH0KKworICAgICAgaGFkTWVzc2FnZSA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGxhc3QgaXRlbSBmcm9tIHRoZSBzdGFjayB3YXMgYSBEIGV4Y2VwdGlvbiwgdGhyb3cgaXQuCisgIGlmIChleGNlcHRpb24pIHJldHVybiBleGNlcHRpb247CisKKyAgLy8gV2UgYXJlIGRlYWxpbmcgd2l0aCBhbiBPcGVuU1NMIGVycm9yIHRoYXQgZG9lc24ndCByb290IGluIGEgRCBleGNlcHRpb24uCisgIGlmICghaGFkTWVzc2FnZSkgeworICAgIC8vIElmIHdlIGRpZG4ndCBnZXQgYW4gYWN0dWFsIGVycm9yIGZyb20gdGhlIHN0YWNrIHlldCwgdHJ5IGVycm5vLgorICAgIHN0cmluZyBlcnJuU3RyaW5nOworICAgIGlmIChlcnJuICE9IDApIHsKKyAgICAgIGVycm5TdHJpbmcgPSB0byFzdHJpbmcoc3RyZXJyb3IoZXJybikpOworICAgIH0KKyAgICBpZiAoZXJyblN0cmluZy5lbXB0eSkgeworICAgICAgbWVzc2FnZSB+PSAiVW5rbm93biBlcnJvciI7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2Ugfj0gZXJyblN0cmluZzsKKyAgICB9CisgIH0KKworICBtZXNzYWdlIH49ICIuIjsKKyAgcmV0dXJuIG5ldyBUU1NMRXhjZXB0aW9uKG1lc3NhZ2UsIGNsaWVudEZpbGUsIGNsaWVudExpbmUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2xfYmlvLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg1MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2xfYmlvLmQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBQcm92aWRlcyBhIFNTTCBCSU8gaW1wbGVtZW50YXRpb24gd3JhcHBpbmcgYSBUaHJpZnQgdHJhbnNwb3J0LgorICoKKyAqIFRoaXMgd2F5LCBTU0wgSS9PIGNhbiBiZSByZWxheWVkIG92ZXIgVGhyaWZ0IHRyYW5zcG9ydCB3aXRob3V0IGludHJvZHVjaW5nCisgKiBhbiBhZGRpdGlvbmFsIGxheWVyIG9mIGJ1ZmZlcmluZywgZXNwZWNpYWxseSBmb3IgdGhlIG5vbi1ibG9ja2luZworICogdHJhbnNwb3J0cy4KKyAqCisgKiBGb3IgdGhlIFRocmlmdCB0cmFuc3BvcnQgaW5jYXJuYXRpb25zIG9mIHRoZSBTU0wgZW50aXRpZXMsICJ0dCIgaXMgdXNlZCBhcworICogcHJlZml4IGZvciBjbGFyaXR5LgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnNzbF9iaW87CisKK2ltcG9ydCBjb3JlLnN0ZGMuY29uZmlnOworaW1wb3J0IGNvcmUuc3RkYy5zdHJpbmcgOiBzdHJsZW47CitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5iaW87CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuZXJyOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zc2w7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIENyZWF0ZXMgYW4gU1NMIEJJTyBvYmplY3Qgd3JhcHBpbmcgdGhlIGdpdmVuIHRyYW5zcG9ydC4KKyAqCisgKiBFeGNlcHRpb25zIHRocm93biBieSB0aGUgdHJhbnNwb3J0IGFyZSBwdXNoZWQgb250byB0aGUgT3BlblNTTCBlcnJvciBzdGFjaywKKyAqIHVzaW5nIHRoZSBsb2NhdGlvbi9yZWFzb24gdmFsdWVzIGZyb20gdGhyaWZ0LmludGVybmFsLnNzbC5FUlJfKl9EX0VYQ0VQVElPTi4KKyAqCisgKiBUaGUgdHJhbnNwb3J0IGlzIGFzc3VtZWQgdG8gYmUgcmVhZHkgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgd2hlbiB0aGUgQklPCisgKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCwgaXQgaXMgbm90IG9wZW5lZCBieSB0aGUgaW1wbGVtZW50YXRpb24uCisgKgorICogUGFyYW1zOgorICogICB0cmFuc3BvcnQgPSBUaGUgdHJhbnNwb3J0IHRvIHdyYXAuCisgKiAgIGNsb3NlVHJhbnNwb3J0ID0gV2hldGhlciB0aGUgY2xvc2UgdGhlIHRyYW5zcG9ydCB3aGVuIHRoZSBTU0wgQklPIGlzCisgKiAgICAgY2xvc2VkLgorICovCitCSU8qIGNyZWF0ZVRUcmFuc3BvcnRCSU8oVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGJvb2wgY2xvc2VUcmFuc3BvcnQpIHsKKyAgYXV0byByZXN1bHQgPSBCSU9fbmV3KGNhc3QoQklPX01FVEhPRCopJnR0QmlvTWV0aG9kKTsKKyAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsOworCisgIEdDLmFkZFJvb3QoY2FzdCh2b2lkKil0cmFuc3BvcnQpOworICBCSU9fc2V0X2ZkKHJlc3VsdCwgY2xvc2VUcmFuc3BvcnQsIGNhc3QoY19sb25nKWNhc3Qodm9pZCopdHJhbnNwb3J0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitwcml2YXRlIHsKKyAgLy8gSGVscGVyIHRvIGdldCB0aGUgVGhyaWZ0IHRyYW5zcG9ydCBhc3NpZ25lZCB3aXRoIHRoZSBnaXZlbiBCSU8uCisgIFRUcmFuc3BvcnQgdHJhbnMoQklPKiBiKSBub3Rocm93IHsKKyAgICBhdXRvIHJlc3VsdCA9IGNhc3QoVFRyYW5zcG9ydCliLnB0cjsKKyAgICBhc3NlcnQocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgdm9pZCBzZXRFcnJvcihFeGNlcHRpb24gZSkgbm90aHJvdyB7CisgICAgRVJSX3B1dF9lcnJvcihFUlJfTElCX0RfRVhDRVBUSU9OLCBFUlJfRl9EX0VYQ0VQVElPTiwgRVJSX1JfRF9FWENFUFRJT04sCisgICAgICBFUlJfRklMRV9EX0VYQ0VQVElPTiwgRVJSX0xJTkVfRF9FWENFUFRJT04pOworICAgIHRyeSB7IEdDLmFkZFJvb3QoY2FzdCh2b2lkKillKTsgfSBjYXRjaCAoVGhyb3dhYmxlKSB7fQorICAgIEVSUl9zZXRfZXJyb3JfZGF0YShjYXN0KGNoYXIqKWUsIEVSUl9GTEFHU19EX0VYQ0VQVElPTik7CisgIH0KKworICBleHRlcm4oQykgaW50IHR0V3JpdGUoQklPKiBiLCBjb25zdChjaGFyKSogZGF0YSwgaW50IGxlbmd0aCkgbm90aHJvdyB7CisgICAgYXNzZXJ0KGIpOworICAgIGlmICghZGF0YSB8fCBsZW5ndGggPD0gMCkgcmV0dXJuIDA7CisgICAgdHJ5IHsKKyAgICAgIHRyYW5zKGIpLndyaXRlKChjYXN0KHVieXRlKilkYXRhKVswIC4uIGxlbmd0aF0pOworICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgc2V0RXJyb3IoZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dFJlYWQoQklPKiBiLCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKSBub3Rocm93IHsKKyAgICBhc3NlcnQoYik7CisgICAgaWYgKCFkYXRhIHx8IGxlbmd0aCA8PSAwKSByZXR1cm4gMDsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNhc3QoaW50KXRyYW5zKGIpLnJlYWQoKGNhc3QodWJ5dGUqKWRhdGEpWzAgLi4gbGVuZ3RoXSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHNldEVycm9yKGUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIGV4dGVybihDKSBpbnQgdHRQdXRzKEJJTyogYiwgY29uc3QoY2hhcikqIHN0cikgbm90aHJvdyB7CisgICAgcmV0dXJuIHR0V3JpdGUoYiwgc3RyLCBjYXN0KGludClzdHJsZW4oc3RyKSk7CisgIH0KKworICBleHRlcm4oQykgY19sb25nIHR0Q3RybChCSU8qIGIsIGludCBjbWQsIGNfbG9uZyBudW0sIHZvaWQqIHB0cikgbm90aHJvdyB7CisgICAgYXNzZXJ0KGIpOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgIGNhc2UgQklPX0NfU0VUX0ZEOgorICAgICAgICAvLyBOb3RlIHRoYXQgY2xvc2UgZmxhZyBhbmQgImZkIiBhcmUgYWN0dWFsbHkgcmV2ZXJzZWQgaGVyZSBiZWNhdXNlIHdlCisgICAgICAgIC8vIG5lZWQgNjQgYml0IHdpZHRoIGZvciB0aGUgcG9pbnRlciDigJMgc2hvdWxkIHByb2JhYmx5IGRyb3AgQklPX3NldF9mZAorICAgICAgICAvLyBhbHRvZ2V0aGVyLgorICAgICAgICB0dERlc3Ryb3koYik7CisgICAgICAgIGIucHRyID0gY2FzdCh2b2lkKiludW07CisgICAgICAgIGIuc2h1dGRvd24gPSBjYXN0KGludClwdHI7CisgICAgICAgIGIuaW5pdF8gPSAxOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIGNhc2UgQklPX0NfR0VUX0ZEOgorICAgICAgICBpZiAoIWIuaW5pdF8pIHJldHVybiAtMTsKKyAgICAgICAgKihjYXN0KHZvaWQqKilwdHIpID0gYi5wdHI7CisgICAgICAgIHJldHVybiBjYXN0KGNfbG9uZyliLnB0cjsKKyAgICAgIGNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorICAgICAgICByZXR1cm4gYi5zaHV0ZG93bjsKKyAgICAgIGNhc2UgQklPX0NUUkxfU0VUX0NMT1NFOgorICAgICAgICBiLnNodXRkb3duID0gY2FzdChpbnQpbnVtOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIGNhc2UgQklPX0NUUkxfRkxVU0g6CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHJhbnMoYikuZmx1c2goKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBzZXRFcnJvcihlKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIGNhc2UgQklPX0NUUkxfRFVQOgorICAgICAgICAvLyBTZWVtcyBsaWtlIHdlIGhhdmUgbm90aGluZyB0byBkbyBvbiBkdXBsaWNhdGlvbiwgYnV0IGNvdWxkbid0IGZpbmQKKyAgICAgICAgLy8gYW55IGRvY3VtZW50YXRpb24gaWYgdGhpcyBhY3R1YWxseSBldmVyIGhhcHBlbnMgZHVyaW5nIG5vcm1hbCBTU0wKKyAgICAgICAgLy8gdXNhZ2UuCisgICAgICAgIHJldHVybiAxOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dENyZWF0ZShCSU8qIGIpIG5vdGhyb3cgeworICAgIGFzc2VydChiKTsKKyAgICBiLmluaXRfID0gMDsKKyAgICBiLm51bSA9IDA7IC8vIFVzZXItZGVmaW5lZCBudW1iZXIgZmllbGQsIHVudXNlZCBoZXJlLgorICAgIGIucHRyID0gbnVsbDsKKyAgICBiLmZsYWdzID0gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGV4dGVybihDKSBpbnQgdHREZXN0cm95KEJJTyogYikgbm90aHJvdyB7CisgICAgaWYgKCFiKSByZXR1cm4gMDsKKworICAgIGludCByYyA9IDE7CisgICAgaWYgKGIuc2h1dGRvd24pIHsKKyAgICAgIGlmIChiLmluaXRfKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHJhbnMoYikuY2xvc2UoKTsKKyAgICAgICAgICBHQy5yZW1vdmVSb290KGNhc3Qodm9pZCopdHJhbnMoYikpOworICAgICAgICAgIGIucHRyID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBzZXRFcnJvcihlKTsKKyAgICAgICAgICByYyA9IC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBiLmluaXRfID0gMDsKKyAgICAgIGIuZmxhZ3MgPSAwOworICAgIH0KKworICAgIHJldHVybiByYzsKKyAgfQorCisgIGltbXV0YWJsZSBCSU9fTUVUSE9EIHR0QmlvTWV0aG9kID0geworICAgIEJJT19UWVBFX1NPVVJDRV9TSU5LLAorICAgICJUVHJhbnNwb3J0IiwKKyAgICAmdHRXcml0ZSwKKyAgICAmdHRSZWFkLAorICAgICZ0dFB1dHMsCisgICAgbnVsbCwgLy8gZ2V0cworICAgICZ0dEN0cmwsCisgICAgJnR0Q3JlYXRlLAorICAgICZ0dERlc3Ryb3ksCisgICAgbnVsbCAvLyBjYWxsYmFja19jdHJsCisgIH07Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3QvcHJvdG9jb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9wcm90b2NvbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjUxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3QvcHJvdG9jb2wuZApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC50ZXN0LnByb3RvY29sOworCitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKwordmVyc2lvbiAodW5pdHRlc3QpOgorCit2b2lkIHRlc3RDb250YWluZXJTaXplTGltaXQoUHJvdG9jb2wpKCkgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKSB7CisgIGF1dG8gYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gcHJvdCA9IG5ldyBQcm90b2NvbChidWZmZXIpOworCisgIC8vIE1ha2Ugc3VyZSByZWFkaW5nIGZhaWxzIGlmIGEgY29udGFpbmVyIGxhcmdlciB0aGFuIHRoZSBzaXplIGxpbWl0IGlzIHJlYWQuCisgIHByb3QuY29udGFpbmVyU2l6ZUxpbWl0ID0gMzsKKworICB7CisgICAgcHJvdC53cml0ZUxpc3RCZWdpbihUTGlzdChUVHlwZS5JMzIsIDQpKTsKKyAgICBwcm90LndyaXRlSTMyKDApOyAvLyBNYWtlIHN1cmUgc2l6ZSBjYW4gYmUgcmVhZCBlLmcuIGZvciBKU09OIHByb3RvY29sLgorICAgIHByb3QucmVzZXQoKTsKKworICAgIGF1dG8gZSA9IGNhc3QoVFByb3RvY29sRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocHJvdC5yZWFkTGlzdEJlZ2luKCkpOworICAgIGVuZm9yY2UoZSAmJiBlLnR5cGUgPT0gVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgcHJvdC5yZXNldCgpOworICAgIGJ1ZmZlci5yZXNldCgpOworICB9CisKKyAgeworICAgIHByb3Qud3JpdGVNYXBCZWdpbihUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCA0KSk7CisgICAgcHJvdC53cml0ZUkzMigwKTsgLy8gTWFrZSBzdXJlIHNpemUgY2FuIGJlIHJlYWQgZS5nLiBmb3IgSlNPTiBwcm90b2NvbC4KKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZE1hcEJlZ2luKCkpOworICAgIGVuZm9yY2UoZSAmJiBlLnR5cGUgPT0gVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgcHJvdC5yZXNldCgpOworICAgIGJ1ZmZlci5yZXNldCgpOworICB9CisKKyAgeworICAgIHByb3Qud3JpdGVTZXRCZWdpbihUU2V0KFRUeXBlLkkzMiwgNCkpOworICAgIHByb3Qud3JpdGVJMzIoMCk7IC8vIE1ha2Ugc3VyZSBzaXplIGNhbiBiZSByZWFkIGUuZy4gZm9yIEpTT04gcHJvdG9jb2wuCisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRTZXRCZWdpbigpKTsKKyAgICBlbmZvcmNlKGUgJiYgZS50eXBlID09IFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIHByb3QucmVzZXQoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSByZWFkaW5nIHdvcmtzIGlmIHRoZSBjb250YWluZXJzIGFyZSBzbWFsbGVyIHRoYW4gdGhlIGxpbWl0IG9yCisgIC8vIG5vIGxpbWl0IGlzIHNldC4KKyAgZm9yZWFjaCAobGltaXQ7IFszLCAwLCAtMV0pIHsKKyAgICBwcm90LmNvbnRhaW5lclNpemVMaW1pdCA9IGxpbWl0OworCisgICAgeworICAgICAgcHJvdC53cml0ZUxpc3RCZWdpbihUTGlzdChUVHlwZS5JMzIsIDIpKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMCk7CisgICAgICBwcm90LndyaXRlSTMyKDEpOworICAgICAgcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKworICAgICAgYXV0byBsaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBlbmZvcmNlKGxpc3QuZWxlbVR5cGUgPT0gVFR5cGUuSTMyKTsKKyAgICAgIGVuZm9yY2UobGlzdC5zaXplID09IDIpOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAwKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMSk7CisgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisKKyAgICAgIHByb3QucmVzZXQoKTsKKyAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIHsKKyAgICAgIHByb3Qud3JpdGVNYXBCZWdpbihUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAyKSk7CisgICAgICBwcm90LndyaXRlSTMyKDApOworICAgICAgcHJvdC53cml0ZUkzMigxKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMik7CisgICAgICBwcm90LndyaXRlSTMyKDMpOworICAgICAgcHJvdC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdC5yZXNldCgpOworCisgICAgICBhdXRvIG1hcCA9IHByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICBlbmZvcmNlKG1hcC5rZXlUeXBlID09IFRUeXBlLkkzMik7CisgICAgICBlbmZvcmNlKG1hcC52YWx1ZVR5cGUgPT0gVFR5cGUuSTMyKTsKKyAgICAgIGVuZm9yY2UobWFwLnNpemUgPT0gMik7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDApOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAxKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMik7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDMpOworICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisKKyAgICAgIHByb3QucmVzZXQoKTsKKyAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIHsKKyAgICAgIHByb3Qud3JpdGVTZXRCZWdpbihUU2V0KFRUeXBlLkkzMiwgMikpOworICAgICAgcHJvdC53cml0ZUkzMigwKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMSk7CisgICAgICBwcm90LndyaXRlU2V0RW5kKCk7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGF1dG8gc2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGVuZm9yY2Uoc2V0LmVsZW1UeXBlID09IFRUeXBlLkkzMik7CisgICAgICBlbmZvcmNlKHNldC5zaXplID09IDIpOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAwKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMSk7CisgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdGVzdFN0cmluZ1NpemVMaW1pdChQcm90b2NvbCkoKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpIHsKKyAgYXV0byBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBwcm90ID0gbmV3IFByb3RvY29sKGJ1ZmZlcik7CisKKyAgLy8gTWFrZSBzdXJlIHJlYWRpbmcgZmFpbHMgaWYgYSBzdHJpbmcgbGFyZ2VyIHRoYW4gdGhlIHNpemUgbGltaXQgaXMgcmVhZC4KKyAgcHJvdC5zdHJpbmdTaXplTGltaXQgPSAzOworCisgIHsKKyAgICBwcm90LndyaXRlU3RyaW5nKCJhc2RmIik7CisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRTdHJpbmcoKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICB7CisgICAgcHJvdC53cml0ZUJpbmFyeShbMSwgMiwgMywgNF0pOworICAgIHByb3QucmVzZXQoKTsKKworICAgIGF1dG8gZSA9IGNhc3QoVFByb3RvY29sRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocHJvdC5yZWFkQmluYXJ5KCkpOworICAgIGVuZm9yY2UoZSAmJiBlLnR5cGUgPT0gVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgcHJvdC5yZXNldCgpOworICAgIGJ1ZmZlci5yZXNldCgpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHJlYWRpbmcgd29ya3MgaWYgdGhlIGNvbnRhaW5lcnMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgbGltaXQgb3IKKyAgLy8gbm8gbGltaXQgaXMgc2V0LgorICBmb3JlYWNoIChsaW1pdDsgWzMsIDAsIC0xXSkgeworICAgIHByb3QuY29udGFpbmVyU2l6ZUxpbWl0ID0gbGltaXQ7CisKKyAgICB7CisgICAgICBwcm90LndyaXRlU3RyaW5nKCJhcyIpOworICAgICAgcHJvdC5yZXNldCgpOworCisgICAgICBlbmZvcmNlKHByb3QucmVhZFN0cmluZygpID09ICJhcyIpOworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgeworICAgICAgcHJvdC53cml0ZUJpbmFyeShbMSwgMl0pOworICAgICAgcHJvdC5yZXNldCgpOworCisgICAgICBlbmZvcmNlKHByb3QucmVhZEJpbmFyeSgpID09IFsxLCAyXSk7CisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzVlODZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnRlc3Quc2VydmVyOworCitpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CitpbXBvcnQgc3RkLmRhdGV0aW1lOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC50eXBlY29ucyA6IFdoaXRlSG9sZTsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKwordmVyc2lvbih1bml0dGVzdCk6CisKKy8qKgorICogVGVzdHMgaWYgc2VydmluZyBpcyBzdG9wcGVkIGNvcnJlY3RseSBpZiB0aGUgY2FuY2VsbGF0aW9uIHBhc3NlZCB0byBzZXJ2ZSgpCisgKiBpcyB0cmlnZ2VyZWQuCisgKgorICogQmVjYXVzZSB0aGUgdGVzdHMgYXJlIHJ1biBtYW55IHRpbWVzIGluIGEgbG9vcCwgdGhpcyBpcyBpbmRpcmVjdGx5IGFsc28gYQorICogdGVzdCB3aGV0aGVyIHNvY2tldCwgZXRjLiBoYW5kbGVzIGFyZSBjbGVhbmVkIHVwIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUKKyAqIGFwcGxpY2F0aW9uIHdpbGwgbGlrZWx5IHJ1biBvdXQgb2YgaGFuZGxlcyBvdGhlcndpc2UuCisgKi8KK3ZvaWQgdGVzdFNlcnZlQ2FuY2VsKFNlcnZlcikodm9pZCBkZWxlZ2F0ZShTZXJ2ZXIpIHNlcnZlclNldHVwID0gbnVsbCkgaWYgKAorICBpcyhTZXJ2ZXIgOiBUU2VydmVyKQorKSB7CisgIGF1dG8gcHJvYyA9IG5ldyBXaGl0ZUhvbGUhVFByb2Nlc3NvcjsKKyAgYXV0byB0ZiA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeTsKKyAgYXV0byBwZiA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOworCisgIC8vIE5lZWQgYSBzcGVjaWFsIGNhc2UgZm9yIFROb25ibG9ja2luZ1NlcnZlciB3aGljaCBkb2Vzbid0IHVzZQorICAvLyBUU2VydmVyVHJhbnNwb3J0LgorICBzdGF0aWMgaWYgKF9fdHJhaXRzKGNvbXBpbGVzLCBuZXcgU2VydmVyKHByb2MsIDAsIHRmLCBwZikpKSB7CisgICAgYXV0byBzZXJ2ZXIgPSBuZXcgU2VydmVyKHByb2MsIDAsIHRmLCBwZik7CisgIH0gZWxzZSB7CisgICAgYXV0byBzZXJ2ZXIgPSBuZXcgU2VydmVyKHByb2MsIG5ldyBUU2VydmVyU29ja2V0KDApLCB0ZiwgcGYpOworICB9CisKKyAgLy8gT24gV2luZG93cywgd2UgdXNlIFRDUCBzb2NrZXRzIHRvIHJlcGxhY2Ugc29ja2V0cGFpcigpLiBTaW5jZSB0aGV5IHN0YXkKKyAgLy8gaW4gVElNRV9XQUlUIGZvciBzb21lIHRpbWUgZXZlbiBpZiB0aGV5IGFyZSBwcm9wZXJseSBjbG9zZWQsIHdlIGhhdmUgdG8gdXNlCisgIC8vIGEgbG93ZXIgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgcG9ydHMvYnVmZmVyIHNwYWNlLgorICB2ZXJzaW9uIChXaW5kb3dzKSB7CisgICAgZW51bSBJVEVSQVRJT05TID0gMTAwOworICB9IGVsc2UgeworICAgIGVudW0gSVRFUkFUSU9OUyA9IDEwMDAwOworICB9CisKKyAgaWYgKHNlcnZlclNldHVwKSBzZXJ2ZXJTZXR1cChzZXJ2ZXIpOworCisgIGF1dG8gc2VydmluZ011dGV4ID0gbmV3IE11dGV4OworICBhdXRvIHNlcnZpbmdDb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKHNlcnZpbmdNdXRleCk7CisgIGF1dG8gZG9uZU11dGV4ID0gbmV3IE11dGV4OworICBhdXRvIGRvbmVDb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKGRvbmVNdXRleCk7CisKKyAgY2xhc3MgQ2FuY2VsbGluZ0hhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgICB2b2lkIHByZVNlcnZlKCkgeworICAgICAgc3luY2hyb25pemVkIChzZXJ2aW5nTXV0ZXgpIHsKKyAgICAgICAgc2VydmluZ0NvbmRpdGlvbi5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisgICAgVmFyaWFudCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkgeyByZXR1cm4gVmFyaWFudC5pbml0OyB9CisgICAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7fQorICAgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7fQorICB9CisgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBuZXcgQ2FuY2VsbGluZ0hhbmRsZXI7CisKKyAgZm9yZWFjaCAoaTsgMCAuLiBJVEVSQVRJT05TKSB7CisgICAgc3luY2hyb25pemVkIChzZXJ2aW5nTXV0ZXgpIHsKKyAgICAgIGF1dG8gY2FuY2VsID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgeworICAgICAgICBhdXRvIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoeworICAgICAgICAgIHNlcnZlci5zZXJ2ZShjYW5jZWwpOworICAgICAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSB7CisgICAgICAgICAgICBkb25lQ29uZGl0aW9uLm5vdGlmeUFsbCgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHNlcnZlclRocmVhZC5pc0RhZW1vbiA9IHRydWU7CisgICAgICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworCisgICAgICAgIHNlcnZpbmdDb25kaXRpb24ud2FpdCgpOworCisgICAgICAgIGNhbmNlbC50cmlnZ2VyKCk7CisgICAgICAgIGVuZm9yY2UoZG9uZUNvbmRpdGlvbi53YWl0KGR1ciEibXNlY3MiKDMqMTAwMCkpKTsKKyAgICAgICAgc2VydmVyVGhyZWFkLmpvaW4oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdHJhaXRzLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3RyYWl0cy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTEwODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3RyYWl0cy5kCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwudHJhaXRzOworCitpbXBvcnQgc3RkLnRyYWl0czsKKworLyoqCisgKiBBZGRzIMK7bm90aHJvd8KrIHRvIHRoZSB0eXBlIG9mIHRoZSBwYXNzZWQgZnVuY3Rpb24gcG9pbnRlci9kZWxlZ2F0ZSwgaWYgaXQKKyAqIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCisgKgorICogVGVjaG5pY2FsbHksIGFzc3VtZU5vdGhyb3cganVzdCBwZXJmb3JtcyBhIGNhc3QsIGJ1dCB1c2luZyBpdCBoYXMgdGhlCisgKiBhZHZhbnRhZ2Ugb2YgYmVpbmcgZXhwbGljaXRseSBhYm91dCB0aGUgb3BlcmF0aW9uIHRoYXQgaXMgcGVyZm9ybWVkLgorICovCithdXRvIGFzc3VtZU5vdGhyb3coVCkoVCB0KSBpZiAoaXNGdW5jdGlvblBvaW50ZXIhVCB8fCBpc0RlbGVnYXRlIVQpIHsKKyAgZW51bSBhdHRycyA9IGZ1bmN0aW9uQXR0cmlidXRlcyFUIHwgRnVuY3Rpb25BdHRyaWJ1dGUubm90aHJvd187CisgIHJldHVybiBjYXN0KFNldEZ1bmN0aW9uQXR0cmlidXRlcyEoVCwgZnVuY3Rpb25MaW5rYWdlIVQsIGF0dHJzKSkgdDsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NDhiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogRGVmaW5lcyB0aGUgYmFzaWMgaW50ZXJmYWNlIGZvciBhIFRocmlmdCBwcm90b2NvbCBhbmQgYXNzb2NpYXRlZCBleGNlcHRpb24KKyAqIHR5cGVzLgorICoKKyAqIE1vc3QgcGFydHMgb2YgdGhlIHByb3RvY29sIEFQSSBhcmUgdHlwaWNhbGx5IG5vdCB1c2VkIGluIGNsaWVudCBjb2RlLCBhcworICogdGhlIGFjdHVhbCBzZXJpYWxpemF0aW9uIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IHRocmlmdC5jb2RlZ2VuLiog4oCTIHRoZSBvbmx5CisgKiBpbnRlcmVzdGluZyB0aGluZyB1c3VhbGx5IGlzIHRoYXQgdGhlcmUgYXJlIHByb3RvY29scyB3aGljaCBjYW4gYmUgY3JlYXRlZAorICogZnJvbSB0cmFuc3BvcnRzIGFuZCBwYXNzZWQgYXJvdW5kLgorICovCittb2R1bGUgdGhyaWZ0LnByb3RvY29sLmJhc2U7CisKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogVGhlIGZpZWxkIHR5cGVzIFRocmlmdCBwcm90b2NvbHMgc3VwcG9ydC4KKyAqLworZW51bSBUVHlwZSA6IGJ5dGUgeworICBTVE9QICAgPSAwLCAvLy8gVXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBmaWVsZHMuCisgIFZPSUQgICA9IDEsIC8vLworICBCT09MICAgPSAyLCAvLy8KKyAgQllURSAgID0gMywgLy8vCisgIERPVUJMRSA9IDQsIC8vLworICBJMTYgICAgPSA2LCAvLy8KKyAgSTMyICAgID0gOCwgLy8vCisgIEk2NCAgICA9IDEwLCAvLy8KKyAgU1RSSU5HID0gMTEsIC8vLworICBTVFJVQ1QgPSAxMiwgLy8vCisgIE1BUCAgICA9IDEzLCAvLy8KKyAgU0VUICAgID0gMTQsIC8vLworICBMSVNUICAgPSAxNSAvLy8KK30KKworLyoqCisgKiBUeXBlcyBvZiBUaHJpZnQgUlBDIG1lc3NhZ2VzLgorICovCitlbnVtIFRNZXNzYWdlVHlwZSA6IGJ5dGUgeworICBDQUxMID0gMSwgLy8vIENhbGwgb2YgYSBub3JtYWwsIHR3by13YXkgUlBDIG1ldGhvZC4KKyAgUkVQTFkgPSAyLCAvLy8gUmVwbHkgdG8gYSBub3JtYWwgbWV0aG9kIGNhbGwuCisgIEVYQ0VQVElPTiA9IDMsIC8vLyBSZXBseSB0byBhIG1ldGhvZCBjYWxsIGlmIHRhcmdldCByYWlzZWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24uCisgIE9ORVdBWSA9IDQgLy8vIENhbGwgb2YgYSBvbmUtd2F5IFJQQyBtZXRob2Qgd2hpY2ggaXMgbm90IGZvbGxvd2VkIGJ5IGEgcmVwbHkuCit9CisKKy8qKgorICogRGVzY3JpcHRpb25zIG9mIFRocmlmdCBlbnRpdGllcy4KKyAqLworc3RydWN0IFRGaWVsZCB7CisgIHN0cmluZyBuYW1lOworICBUVHlwZSB0eXBlOworICBzaG9ydCBpZDsKK30KKworLy8vIGRpdHRvCitzdHJ1Y3QgVExpc3QgeworICBUVHlwZSBlbGVtVHlwZTsKKyAgc2l6ZV90IHNpemU7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRNYXAgeworICBUVHlwZSBrZXlUeXBlOworICBUVHlwZSB2YWx1ZVR5cGU7CisgIHNpemVfdCBzaXplOworfQorCisvLy8gZGl0dG8KK3N0cnVjdCBUTWVzc2FnZSB7CisgIHN0cmluZyBuYW1lOworICBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgaW50IHNlcWlkOworfQorCisvLy8gZGl0dG8KK3N0cnVjdCBUU2V0IHsKKyAgVFR5cGUgZWxlbVR5cGU7CisgIHNpemVfdCBzaXplOworfQorCisvLy8gZGl0dG8KK3N0cnVjdCBUU3RydWN0IHsKKyAgc3RyaW5nIG5hbWU7Cit9CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBhIFRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4gRXNzZW50aWFsbHksIGl0IGRlZmluZXMKKyAqIGEgd2F5IG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgYWxsIHRoZSBiYXNlIHR5cGVzLCBwbHVzIGEgbWVjaGFuaXNtIGZvcgorICogd3JpdGluZyBvdXQgc3RydWN0cyB3aXRoIGluZGV4ZWQgZmllbGRzLgorICoKKyAqIFRQcm90b2NvbCBvYmplY3RzIHNob3VsZCBub3QgYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBlbmNvZGluZyBjb250ZXh0cywKKyAqIGFzIHRoZXkgbWF5IG5lZWQgdG8gbWFpbnRhaW4gaW50ZXJuYWwgc3RhdGUgaW4gc29tZSBwcm90b2NvbHMgKGUuZy4gSlNPTikuCisgKiBOb3RlIHRoYXQgaXMgaXMgYWNjZXB0YWJsZSBmb3IgdGhlIFRQcm90b2NvbCBtb2R1bGUgdG8gZG8gaXRzIG93biBpbnRlcm5hbAorICogYnVmZmVyZWQgcmVhZHMvd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIFRUcmFuc3BvcnQgd2hlcmUgYXBwcm9wcmlhdGUgKGkuZS4KKyAqIHdoZW4gcGFyc2luZyBhbiBpbnB1dCBYTUwgc3RyZWFtLCByZWFkaW5nIGNvdWxkIGJlIGJhdGNoZWQgcmF0aGVyIHRoYW4KKyAqIGxvb2tpbmcgYWhlYWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBmb3IgYSBjbG9zZSB0YWcpLgorICovCitpbnRlcmZhY2UgVFByb3RvY29sIHsKKyAgLy8vIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGJ5IHRoZSBwcm90b2NvbC4KKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHk7CisKKyAgLyoKKyAgICogV3JpdGluZyBtZXRob2RzLgorICAgKi8KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpOyAvLy8KKyAgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKTsgLy8vCisgIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KTsgLy8vCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMik7IC8vLworICB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KTsgLy8vCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1Yik7IC8vLworICB2b2lkIHdyaXRlU3RyaW5nKHN0cmluZyBzdHIpOyAvLy8KKyAgdm9pZCB3cml0ZUJpbmFyeSh1Ynl0ZVtdIGJ1Zik7IC8vLworCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSk7IC8vLworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpOyAvLy8KKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdHN0cnVjdCk7IC8vLworICB2b2lkIHdyaXRlU3RydWN0RW5kKCk7IC8vLworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOyAvLy8KKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCk7IC8vLworICB2b2lkIHdyaXRlRmllbGRTdG9wKCk7IC8vLworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOyAvLy8KKyAgdm9pZCB3cml0ZUxpc3RFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7IC8vLworICB2b2lkIHdyaXRlTWFwRW5kKCk7IC8vLworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOyAvLy8KKyAgdm9pZCB3cml0ZVNldEVuZCgpOyAvLy8KKworICAvKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIGJvb2wgcmVhZEJvb2woKTsgLy8vCisgIGJ5dGUgcmVhZEJ5dGUoKTsgLy8vCisgIHNob3J0IHJlYWRJMTYoKTsgLy8vCisgIGludCByZWFkSTMyKCk7IC8vLworICBsb25nIHJlYWRJNjQoKTsgLy8vCisgIGRvdWJsZSByZWFkRG91YmxlKCk7IC8vLworICBzdHJpbmcgcmVhZFN0cmluZygpOyAvLy8KKyAgdWJ5dGVbXSByZWFkQmluYXJ5KCk7IC8vLworCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKTsgLy8vCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKTsgLy8vCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkRmllbGRFbmQoKTsgLy8vCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZExpc3RFbmQoKTsgLy8vCisgIFRNYXAgcmVhZE1hcEJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRNYXBFbmQoKTsgLy8vCisgIFRTZXQgcmVhZFNldEJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRTZXRFbmQoKTsgLy8vCisKKyAgLyoqCisgICAqIFJlc2V0IGFueSBpbnRlcm5hbCBzdGF0ZSBiYWNrIHRvIGEgYmxhbmsgc2xhdGUsIGlmIHRoZSBwcm90b2NvbCBpcworICAgKiBzdGF0ZWZ1bC4KKyAgICovCisgIHZvaWQgcmVzZXQoKTsKK30KKworLyoqCisgKiB0cnVlIGlmIFQgaXMgYSBUUHJvdG9jb2wuCisgKi8KK3RlbXBsYXRlIGlzVFByb3RvY29sKFQpIHsKKyAgZW51bSBpc1RQcm90b2NvbCA9IGlzKFQgOiBUUHJvdG9jb2wpOworfQorCit1bml0dGVzdCB7CisgIHN0YXRpYyBhc3NlcnQoaXNUUHJvdG9jb2whVFByb3RvY29sKTsKKyAgc3RhdGljIGFzc2VydCghaXNUUHJvdG9jb2whdm9pZCk7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHByb3RvY29sIG9wZXJhdGluZyBvbiBhIGdpdmVuIHRyYW5zcG9ydC4KKyAqLworaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkgeworICAvLy8KKyAgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpOworfQorCisvKioKKyAqIEEgcHJvdG9jb2wtbGV2ZWwgZXhjZXB0aW9uLgorICovCitjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLy8vIFRoZSBwb3NzaWJsZSBleGNlcHRpb24gdHlwZXMuCisgIGVudW0gVHlwZSB7CisgICAgVU5LTk9XTiwgLy8vCisgICAgSU5WQUxJRF9EQVRBLCAvLy8KKyAgICBORUdBVElWRV9TSVpFLCAvLy8KKyAgICBTSVpFX0xJTUlULCAvLy8KKyAgICBCQURfVkVSU0lPTiwgLy8vCisgICAgTk9UX0lNUExFTUVOVEVELCAvLy8KKyAgICBERVBUSF9MSU1JVCAvLy8KKyAgfQorCisgIC8vLworICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7CisgICAgc3RhdGljIHN0cmluZyBtc2dGb3JUeXBlKFR5cGUgdHlwZSkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiByZXR1cm4gIlVua25vd24gcHJvdG9jb2wgZXhjZXB0aW9uIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVkFMSURfREFUQTogcmV0dXJuICJJbnZhbGlkIGRhdGEiOworICAgICAgICBjYXNlIFR5cGUuTkVHQVRJVkVfU0laRTogcmV0dXJuICJOZWdhdGl2ZSBzaXplIjsKKyAgICAgICAgY2FzZSBUeXBlLlNJWkVfTElNSVQ6IHJldHVybiAiRXhjZWVkZWQgc2l6ZSBsaW1pdCI7CisgICAgICAgIGNhc2UgVHlwZS5CQURfVkVSU0lPTjogcmV0dXJuICJJbnZhbGlkIHZlcnNpb24iOworICAgICAgICBjYXNlIFR5cGUuTk9UX0lNUExFTUVOVEVEOiByZXR1cm4gIk5vdCBpbXBsZW1lbnRlZCI7CisgICAgICAgIGNhc2UgVHlwZS5ERVBUSF9MSU1JVDogcmV0dXJuICJFeGNlZWRlZCBzaXplIGxpbWl0IjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfQorICAgIH0KKyAgICB0aGlzKG1zZ0ZvclR5cGUodHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICB0aGlzKG1zZywgVHlwZS5VTktOT1dOLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIC8vLworICBUeXBlIHR5cGUoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiB0eXBlXzsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFR5cGUgdHlwZV87Cit9CisKKy8qKgorICogU2tpcHMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gdHlwZSBvbiB0aGUgcHJvdG9jb2wuCisgKgorICogVGhlIG1haW4gcHVycG9zZSBvZiBza2lwKCkgaXMgdG8gYWxsb3cgdHJlYXRpbmcgc3RydWN0IGFuZCBjb250YWluZXIgdHlwZXMsCisgKiAod2hlcmUgbXVsdGlwbGUgcHJpbWl0aXZlIHR5cGVzIGhhdmUgdG8gYmUgc2tpcHBlZCkgdGhlIHNhbWUgYXMgc2NhbGFyIHR5cGVzCisgKiBpbiBnZW5lcmF0ZWQgY29kZS4KKyAqLwordm9pZCBza2lwKFByb3RvY29sKShQcm90b2NvbCBwcm90LCBUVHlwZSB0eXBlKSBpZiAoaXMoUHJvdG9jb2wgOiBUUHJvdG9jb2wpKSB7CisgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgIHByb3QucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgcHJvdC5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgIHByb3QucmVhZEkxNigpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgIHByb3QucmVhZEkzMigpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgIHByb3QucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgIHByb3QucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgIHByb3QucmVhZEJpbmFyeSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBhdXRvIGYgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuU1RPUCkgYnJlYWs7CisgICAgICAgIHNraXAocHJvdCwgZi50eXBlKTsKKyAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICBhdXRvIGwgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gbC5zaXplKSB7CisgICAgICAgIHNraXAocHJvdCwgbC5lbGVtVHlwZSk7CisgICAgICB9CisgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgYXV0byBtID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gbS5zaXplKSB7CisgICAgICAgIHNraXAocHJvdCwgbS5rZXlUeXBlKTsKKyAgICAgICAgc2tpcChwcm90LCBtLnZhbHVlVHlwZSk7CisgICAgICB9CisgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICBhdXRvIHMgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBzLnNpemUpIHsKKyAgICAgICAgc2tpcChwcm90LCBzLmVsZW1UeXBlKTsKKyAgICAgIH0KKyAgICAgIHByb3QucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUVHlwZS5TVE9QOiBnb3RvIGNhc2U7CisgICAgY2FzZSBUVHlwZS5WT0lEOgorICAgICAgYXNzZXJ0KGZhbHNlLCAiSW52YWxpZCBmaWVsZCB0eXBlIHBhc3NlZC4iKTsKKyAgfQorfQorCisvKioKKyAqIEFwcGxpY2F0aW9uLWxldmVsIGV4Y2VwdGlvbi4KKyAqCisgKiBJdCBpcyB0aHJvd24gaWYgYW4gUlBDIGNhbGwgd2VudCB3cm9uZyBvbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIsIGUuZy4gaWYKKyAqIHRoZSByZWNlaXZlciBkb2VzIG5vdCBrbm93IHRoZSBtZXRob2QgbmFtZSByZXF1ZXN0ZWQgb3IgYSBtZXRob2QgaW52b2tlZCBieQorICogdGhlIHNlcnZpY2UgcHJvY2Vzc29yIHRocm93cyBhbiBleGNlcHRpb24gbm90IHBhcnQgb2YgdGhlIFRocmlmdCBBUEkuCisgKi8KK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8gVGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiB0eXBlcy4KKyAgZW51bSBUeXBlIHsKKyAgICBVTktOT1dOID0gMCwgLy8vCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxLCAvLy8KKyAgICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIsIC8vLworICAgIFdST05HX01FVEhPRF9OQU1FID0gMywgLy8vCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNCwgLy8vCisgICAgTUlTU0lOR19SRVNVTFQgPSA1LCAvLy8KKyAgICBJTlRFUk5BTF9FUlJPUiA9IDYsIC8vLworICAgIFBST1RPQ09MX0VSUk9SID0gNywgLy8vCisgICAgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4LCAvLy8KKyAgICBJTlZBTElEX1BST1RPQ09MID0gOSwgLy8vCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMCAvLy8KKyAgfQorCisgIC8vLworICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7CisgICAgc3RhdGljIHN0cmluZyBtc2dGb3JUeXBlKFR5cGUgdHlwZSkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiByZXR1cm4gIlVua25vd24gYXBwbGljYXRpb24gZXhjZXB0aW9uIjsKKyAgICAgICAgY2FzZSBUeXBlLlVOS05PV05fTUVUSE9EOiByZXR1cm4gIlVua25vd24gbWV0aG9kIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVkFMSURfTUVTU0FHRV9UWVBFOiByZXR1cm4gIkludmFsaWQgbWVzc2FnZSB0eXBlIjsKKyAgICAgICAgY2FzZSBUeXBlLldST05HX01FVEhPRF9OQU1FOiByZXR1cm4gIldyb25nIG1ldGhvZCBuYW1lIjsKKyAgICAgICAgY2FzZSBUeXBlLkJBRF9TRVFVRU5DRV9JRDogcmV0dXJuICJCYWQgc2VxdWVuY2UgaWRlbnRpZmllciI7CisgICAgICAgIGNhc2UgVHlwZS5NSVNTSU5HX1JFU1VMVDogcmV0dXJuICJNaXNzaW5nIHJlc3VsdCI7CisgICAgICAgIGNhc2UgVHlwZS5JTlRFUk5BTF9FUlJPUjogcmV0dXJuICJJbnRlcm5hbCBlcnJvciI7CisgICAgICAgIGNhc2UgVHlwZS5QUk9UT0NPTF9FUlJPUjogcmV0dXJuICJQcm90b2NvbCBlcnJvciI7CisgICAgICAgIGNhc2UgVHlwZS5JTlZBTElEX1RSQU5TRk9STTogcmV0dXJuICJJbnZhbGlkIHRyYW5zZm9ybSI7CisgICAgICAgIGNhc2UgVHlwZS5JTlZBTElEX1BST1RPQ09MOiByZXR1cm4gIkludmFsaWQgcHJvdG9jb2wiOworICAgICAgICBjYXNlIFR5cGUuVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6IHJldHVybiAiVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9CisgICAgfQorICAgIHRoaXMobXNnRm9yVHlwZSh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHRoaXMobXNnLCBUeXBlLlVOS05PV04sIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgLy8vCisgIFR5cGUgdHlwZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKKyAgLy8gVE9ETzogUmVwbGFjZSBoYW5kLXdyaXR0ZW4gcmVhZCgpL3dyaXRlKCkgd2l0aCB0aHJpZnQuY29kZWdlbiB0ZW1wbGF0ZXMuCisKKyAgLy8vCisgIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHsKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBmID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuU1RPUCkgYnJlYWs7CisKKyAgICAgIHN3aXRjaCAoZi5pZCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1zZyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2tpcChpcHJvdCwgZi50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBpZiAoZi50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZV8gPSBjYXN0KFR5cGUpaXByb3QucmVhZEkzMigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwKGlwcm90LCBmLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBza2lwKGlwcm90LCBmLnR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgIH0KKworICAvLy8KKyAgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIGNvbnN0IHsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpKTsKKworICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgMSkpOworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcobXNnKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCAyKSk7CisgICAgb3Byb3Qud3JpdGVJMzIodHlwZV8pOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorCitwcml2YXRlOgorICBUeXBlIHR5cGVfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iaW5hcnkuZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmluYXJ5LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmluYXJ5LmQKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworCitpbXBvcnQgc3RkLmFycmF5IDogdW5pbml0aWFsaXplZEFycmF5OworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBUeXBlVHVwbGU7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CisKKy8qKgorICogVFByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIHRoZSBCaW5hcnkgVGhyaWZ0IHByb3RvY29sLgorICovCitmaW5hbCBjbGFzcyBUQmluYXJ5UHJvdG9jb2woVHJhbnNwb3J0ID0gVFRyYW5zcG9ydCkgaWYgKAorICBpc1RUcmFuc3BvcnQhVHJhbnNwb3J0CispIDogVFByb3RvY29sIHsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zID0gVGhlIHRyYW5zcG9ydCB0byB1c2UuCisgICAqICAgY29udGFpbmVyU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBjb250YWluZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLgorICAgKiAgIHN0cmluZ1NpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKiAgIHN0cmljdFJlYWQgPSBJZiBmYWxzZSwgb2xkIHBlZXJzIHdoaWNoIGRvIG5vdCBpbmNsdWRlIHRoZSBwcm90b2NvbAorICAgKiAgICAgdmVyc2lvbiBhcmUgdG9sZXJhdGVkLgorICAgKiAgIHN0cmljdFdyaXRlID0gV2hldGhlciB0byBpbmNsdWRlIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZSBoZWFkZXIuCisgICAqLworICB0aGlzKFRyYW5zcG9ydCB0cmFucywgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwLAorICAgIGJvb2wgc3RyaWN0UmVhZCA9IGZhbHNlLCBib29sIHN0cmljdFdyaXRlID0gdHJ1ZQorICApIHsKKyAgICB0cmFuc18gPSB0cmFuczsKKyAgICB0aGlzLmNvbnRhaW5lclNpemVMaW1pdCA9IGNvbnRhaW5lclNpemVMaW1pdDsKKyAgICB0aGlzLnN0cmluZ1NpemVMaW1pdCA9IHN0cmluZ1NpemVMaW1pdDsKKyAgICB0aGlzLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOworICAgIHRoaXMuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgfQorCisgIFRyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc187CisgIH0KKworICB2b2lkIHJlc2V0KCkge30KKworICAvKioKKyAgICogSWYgZmFsc2UsIG9sZCBwZWVycyB3aGljaCBkbyBub3QgaW5jbHVkZSB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGUKKyAgICogbWVzc2FnZSBoZWFkZXIgYXJlIHRvbGVyYXRlZC4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAqLworICBib29sIHN0cmljdFJlYWQ7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGUgbWVzc2FnZSBoZWFkZXIgKG9sZGVyCisgICAqIHZlcnNpb25zIGRpZG4ndCkuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAqLworICBib29sIHN0cmljdFdyaXRlOworCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgb2YgZGVzZXJpYWxpemVkIGNvbnRhaW5lcnMgdG8gdGhlCisgICAqIGdpdmVuIGFtb3VudC4KKyAgICoKKyAgICogVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkgd2hlbiBicm9rZW4KKyAgICogZGF0YSBpcyByZWNlaXZlZC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBhIFNJWkVfTElNSVQtdHlwZQorICAgKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0OworCisgIC8qKgorICAgKiBJZiBwb3NpdGl2ZSwgbGltaXRzIHRoZSBsZW5ndGggb2YgZGVzZXJpYWxpemVkIHN0cmluZ3MvYmluYXJ5IGRhdGEgdG8gdGhlCisgICAqIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgICoKKyAgICogVGhpcyBpcyB1c2VmdWwgdG8gYXZvaWQgYWxsb2NhdGluZyBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkgd2hlbiBicm9rZW4KKyAgICogZGF0YSBpcyByZWNlaXZlZC4gSWYgdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLCBhIFNJWkVfTElNSVQtdHlwZQorICAgKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgdGhyb3duLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBsaW1pdCkuCisgICAqLworICBpbnQgc3RyaW5nU2l6ZUxpbWl0OworCisgIC8qCisgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgd3JpdGVCeXRlKGIgPyAxIDogMCk7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZiKVswIC4uIDFdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB7CisgICAgc2hvcnQgbmV0ID0gaG9zdFRvTmV0KGkxNik7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmbmV0KVswIC4uIDJdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIGludCBuZXQgPSBob3N0VG9OZXQoaTMyKTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZuZXQpWzAgLi4gNF0pOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgeworICAgIGxvbmcgbmV0ID0gaG9zdFRvTmV0KGk2NCk7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmbmV0KVswIC4uIDhdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIHN0YXRpYyBhc3NlcnQoZG91YmxlLnNpemVvZiA9PSB1bG9uZy5zaXplb2YpOworICAgIGF1dG8gYml0cyA9IGhvc3RUb05ldCgqY2FzdCh1bG9uZyopKCZkdWIpKTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZiaXRzKVswIC4uIDhdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoc3RyaW5nIHN0cikgeworICAgIHdyaXRlQmluYXJ5KGNhc3QodWJ5dGVbXSlzdHIpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeSh1Ynl0ZVtdIGJ1ZikgeworICAgIGFzc2VydChidWYubGVuZ3RoIDw9IGludC5tYXgpOworICAgIHdyaXRlSTMyKGNhc3QoaW50KWJ1Zi5sZW5ndGgpOworICAgIHRyYW5zXy53cml0ZShidWYpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgaWYgKHN0cmljdFdyaXRlKSB7CisgICAgICBpbnQgdmVyc24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlLnR5cGU7CisgICAgICB3cml0ZUkzMih2ZXJzbik7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKyAgfQorICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdHN0cnVjdCkge30KKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgfQorICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgYXNzZXJ0KGxpc3Quc2l6ZSA8PSBpbnQubWF4KTsKKyAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CisgICAgd3JpdGVJMzIoY2FzdChpbnQpbGlzdC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgYXNzZXJ0KG1hcC5zaXplIDw9IGludC5tYXgpOworICAgIHdyaXRlQnl0ZShtYXAua2V5VHlwZSk7CisgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgIHdyaXRlSTMyKGNhc3QoaW50KW1hcC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBhc3NlcnQoc2V0LnNpemUgPD0gaW50Lm1heCk7CisgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CisgICAgd3JpdGVJMzIoY2FzdChpbnQpc2V0LnNpemUpOworICB9CisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisKKyAgLyoKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBib29sIHJlYWRCb29sKCkgeworICAgIHJldHVybiByZWFkQnl0ZSgpICE9IDA7CisgIH0KKworICBieXRlIHJlYWRCeXRlKCkgeworICAgIHVieXRlWzFdIGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIpOworICAgIHJldHVybiBjYXN0KGJ5dGUpYlswXTsKKyAgfQorCisgIHNob3J0IHJlYWRJMTYoKSB7CisgICAgSW50QnVmIXNob3J0IGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIuYnl0ZXMpOworICAgIHJldHVybiBuZXRUb0hvc3QoYi52YWx1ZSk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICBJbnRCdWYhaW50IGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIuYnl0ZXMpOworICAgIHJldHVybiBuZXRUb0hvc3QoYi52YWx1ZSk7CisgIH0KKworICBsb25nIHJlYWRJNjQoKSB7CisgICAgSW50QnVmIWxvbmcgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgcmV0dXJuIG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIEludEJ1ZiFsb25nIGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIuYnl0ZXMpOworICAgIGIudmFsdWUgPSBuZXRUb0hvc3QoYi52YWx1ZSk7CisgICAgcmV0dXJuICpjYXN0KGRvdWJsZSopKCZiLnZhbHVlKTsKKyAgfQorCisgIHN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIHJldHVybiBjYXN0KHN0cmluZylyZWFkQmluYXJ5KCk7CisgIH0KKworICB1Ynl0ZVtdIHJlYWRCaW5hcnkoKSB7CisgICAgcmV0dXJuIHJlYWRCaW5hcnlCb2R5KHJlYWRTaXplKHN0cmluZ1NpemVMaW1pdCkpOworICB9CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBUTWVzc2FnZSBtc2cgPSB2b2lkOworCisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICBpbnQgdmVyc24gPSBzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgaWYgKHZlcnNuICE9IFZFUlNJT05fMSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJCYWQgcHJvdG9jb2wgdmVyc2lvbi4iLAorICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICAgIH0KKworICAgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSkoc2l6ZSAmIE1FU1NBR0VfVFlQRV9NQVNLKTsKKyAgICAgIG1zZy5uYW1lID0gcmVhZFN0cmluZygpOworICAgICAgbXNnLnNlcWlkID0gcmVhZEkzMigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyaWN0UmVhZCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICJQcm90b2NvbCB2ZXJzaW9uIG1pc3NpbmcsIG9sZCBjbGllbnQ/IiwKKyAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5CQURfVkVSU0lPTik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLk5FR0FUSVZFX1NJWkUpOworICAgICAgICB9CisgICAgICAgIG1zZy5uYW1lID0gY2FzdChzdHJpbmcpcmVhZEJpbmFyeUJvZHkoc2l6ZSk7CisgICAgICAgIG1zZy50eXBlID0gY2FzdChUTWVzc2FnZVR5cGUpKHJlYWRCeXRlKCkpOworICAgICAgICBtc2cuc2VxaWQgPSByZWFkSTMyKCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1zZzsKKyAgfQorICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZXR1cm4gVFN0cnVjdCgpOworICB9CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHt9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFRGaWVsZCBmID0gdm9pZDsKKyAgICBmLm5hbWUgPSBudWxsOworICAgIGYudHlwZSA9IGNhc3QoVFR5cGUpcmVhZEJ5dGUoKTsKKyAgICBpZiAoZi50eXBlID09IFRUeXBlLlNUT1ApIHJldHVybiBmOworICAgIGYuaWQgPSByZWFkSTE2KCk7CisgICAgcmV0dXJuIGY7CisgIH0KKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgcmV0dXJuIFRMaXN0KGNhc3QoVFR5cGUpcmVhZEJ5dGUoKSwgcmVhZFNpemUoY29udGFpbmVyU2l6ZUxpbWl0KSk7CisgIH0KKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgcmV0dXJuIFRNYXAoY2FzdChUVHlwZSlyZWFkQnl0ZSgpLCBjYXN0KFRUeXBlKXJlYWRCeXRlKCksCisgICAgICByZWFkU2l6ZShjb250YWluZXJTaXplTGltaXQpKTsKKyAgfQorICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIHJldHVybiBUU2V0KGNhc3QoVFR5cGUpcmVhZEJ5dGUoKSwgcmVhZFNpemUoY29udGFpbmVyU2l6ZUxpbWl0KSk7CisgIH0KKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworcHJpdmF0ZToKKyAgdWJ5dGVbXSByZWFkQmluYXJ5Qm9keShpbnQgc2l6ZSkgeworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGF1dG8gYnVmID0gdW5pbml0aWFsaXplZEFycmF5ISh1Ynl0ZVtdKShzaXplKTsKKyAgICB0cmFuc18ucmVhZEFsbChidWYpOworICAgIHJldHVybiBidWY7CisgIH0KKworICBpbnQgcmVhZFNpemUoaW50IGxpbWl0KSB7CisgICAgYXV0byBzaXplID0gcmVhZEkzMigpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5ORUdBVElWRV9TSVpFKTsKKyAgICB9IGVsc2UgaWYgKGxpbWl0ID4gMCAmJiBzaXplID4gbGltaXQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgZW51bSBNRVNTQUdFX1RZUEVfTUFTSyA9IDB4MDAwMDAwZmY7CisgIGVudW0gVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgZW51bSBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgIFRyYW5zcG9ydCB0cmFuc187Cit9CisKKy8qKgorICogVEJpbmFyeVByb3RvY29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkgc3BlY2lmeQorICogdGhlIHRyYW5zcG9ydCB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcgSUZUSQorICogKHNlZSAkKExJTksyIGh0dHA6Ly9kLnB1cmVtYWdpYy5jb20vaXNzdWVzL3Nob3dfYnVnLmNnaT9pZD02MDgyLCBEIEJ1Z3ppbGxhCisgKiBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUQmluYXJ5UHJvdG9jb2whVHJhbnNwb3J0IHRCaW5hcnlQcm90b2NvbChUcmFuc3BvcnQpKFRyYW5zcG9ydCB0cmFucywKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwLAorICBib29sIHN0cmljdFJlYWQgPSBmYWxzZSwgYm9vbCBzdHJpY3RXcml0ZSA9IHRydWUKKykgaWYgKGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQpIHsKKyAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2whVHJhbnNwb3J0KHRyYW5zLCBjb250YWluZXJTaXplTGltaXQsCisgICAgc3RyaW5nU2l6ZUxpbWl0LCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICAvLyBDaGVjayB0aGUgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LgorICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIGJpbmFyeSA9IHRCaW5hcnlQcm90b2NvbChidWYpOworICBiaW5hcnkud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UoImZvbyIsIFRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7CisKKyAgYXV0byBoZWFkZXIgPSBuZXcgdWJ5dGVbMTVdOworICBidWYucmVhZEFsbChoZWFkZXIpOworICBlbmZvcmNlKGhlYWRlciA9PSBbCisgICAgMTI4LCAxLCAwLCAxLCAvLyBWZXJzaW9uIDEsIFRNZXNzYWdlVHlwZS5DQUxMCisgICAgMCwgMCwgMCwgMywgLy8gTWV0aG9kIG5hbWUgbGVuZ3RoCisgICAgMTAyLCAxMTEsIDExMSwgLy8gTWV0aG9kIG5hbWUgKCJmb28iKQorICAgIDAsIDAsIDAsIDAsIC8vIFNlcXVlbmNlIGlkCisgIF0pOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKKyAgdGVzdENvbnRhaW5lclNpemVMaW1pdCEoVEJpbmFyeVByb3RvY29sISgpKSgpOworICB0ZXN0U3RyaW5nU2l6ZUxpbWl0IShUQmluYXJ5UHJvdG9jb2whKCkpKCk7Cit9CisKKy8qKgorICogVFByb3RvY29sRmFjdG9yeSBjcmVhdGluZyBhIFRCaW5hcnlQcm90b2NvbCBpbnN0YW5jZSBmb3IgcGFzc2VkIGluCisgKiB0cmFuc3BvcnRzLgorICoKKyAqIFRoZSBvcHRpb25hbCBUcmFuc3BvcnRzIHRlbXBsYXRlIHR1cGxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisgKiBvbmUgb3IgbW9yZSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0byBzcGVjaWZpY2FsbHkgaW5zdGFudGlhdGUKKyAqIFRCaW5hcnlQcm90b2NvbCBmb3IuIElmIHRoZSBhY3R1YWwgdHJhbnNwb3J0IHR5cGVzIGVuY291bnRlcmVkIGF0CisgKiBydW50aW1lIG1hdGNoIG9uZSBvZiB0aGUgdHJhbnNwb3J0cyBpbiB0aGUgbGlzdCwgYSBzcGVjaWFsaXplZCBwcm90b2NvbAorICogaW5zdGFuY2UgaXMgY3JlYXRlZC4gT3RoZXJ3aXNlLCBhIGdlbmVyaWMgVFRyYW5zcG9ydCB2ZXJzaW9uIGlzIHVzZWQuCisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoVHJhbnNwb3J0cy4uLikgaWYgKAorICBhbGxTYXRpc2Z5IShpc1RUcmFuc3BvcnQsIFRyYW5zcG9ydHMpCispIDogVFByb3RvY29sRmFjdG9yeSB7CisgIC8vLworICB0aGlzIChpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAsCisgICAgYm9vbCBzdHJpY3RSZWFkID0gZmFsc2UsIGJvb2wgc3RyaWN0V3JpdGUgPSB0cnVlCisgICkgeworICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICBjb250YWluZXJTaXplTGltaXRfID0gY29udGFpbmVyU2l6ZUxpbWl0OworICAgIHN0cmluZ1NpemVMaW1pdF8gPSBzdHJpbmdTaXplTGltaXQ7CisgIH0KKworICBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgY29uc3QgeworICAgIGZvcmVhY2ggKFRyYW5zcG9ydDsgVHlwZVR1cGxlIShUcmFuc3BvcnRzLCBUVHJhbnNwb3J0KSkgeworICAgICAgYXV0byBjb25jcmV0ZVRyYW5zID0gY2FzdChUcmFuc3BvcnQpdHJhbnM7CisgICAgICBpZiAoY29uY3JldGVUcmFucykgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCFUcmFuc3BvcnQoY29uY3JldGVUcmFucywKKyAgICAgICAgICBjb250YWluZXJTaXplTGltaXRfLCBzdHJpbmdTaXplTGltaXRfLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICJQYXNzZWQgbnVsbCB0cmFuc3BvcnQgdG8gVEJpbmFyeVByb3RvY29sRmFjdG95LiIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBzdHJpY3RSZWFkXzsKKyAgYm9vbCBzdHJpY3RXcml0ZV87CisgIGludCBjb250YWluZXJTaXplTGltaXRfOworICBpbnQgc3RyaW5nU2l6ZUxpbWl0XzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvY29tcGFjdC5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9jb21wYWN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1NWM4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvY29tcGFjdC5kCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnByb3RvY29sLmNvbXBhY3Q7CisKK2ltcG9ydCBzdGQuYXJyYXkgOiB1bmluaXRpYWxpemVkQXJyYXk7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKKworLyoqCisgKiBEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wYWN0IHByb3RvY29sLgorICoKKyAqIFNlZSBUSFJJRlQtMTEwIGZvciBhIHByb3RvY29sIGRlc2NyaXB0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uCisgKiB0aGUgQysrIG9uZS4KKyAqLworZmluYWwgY2xhc3MgVENvbXBhY3RQcm90b2NvbChUcmFuc3BvcnQgPSBUVHJhbnNwb3J0KSBpZiAoCisgIGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQKKykgOiBUUHJvdG9jb2wgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zID0gVGhlIHRyYW5zcG9ydCB0byB1c2UuCisgICAqICAgY29udGFpbmVyU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBjb250YWluZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLgorICAgKiAgIHN0cmluZ1NpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUcmFuc3BvcnQgdHJhbnMsIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCkgeworICAgIHRyYW5zXyA9IHRyYW5zOworICAgIHRoaXMuY29udGFpbmVyU2l6ZUxpbWl0ID0gY29udGFpbmVyU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaW5nU2l6ZUxpbWl0ID0gc3RyaW5nU2l6ZUxpbWl0OworICB9CisKKyAgVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zXzsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICBmaWVsZElkU3RhY2tfID0gbnVsbDsKKyAgICBib29sZWFuRmllbGRfID0gVEZpZWxkLmluaXQ7CisgICAgaGFzQm9vbFZhbHVlXyA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBvZiBkZXNlcmlhbGl6ZWQgY29udGFpbmVycyB0byB0aGUKKyAgICogZ2l2ZW4gYW1vdW50LgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBjb250YWluZXJTaXplTGltaXQ7CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIGxlbmd0aCBvZiBkZXNlcmlhbGl6ZWQgc3RyaW5ncy9iaW5hcnkgZGF0YSB0byB0aGUKKyAgICogZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBzdHJpbmdTaXplTGltaXQ7CisKKyAgLyoKKyAgICogV3JpdGluZyBtZXRob2RzLgorICAgKi8KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYm9vbGVhbkZpZWxkXy5uYW1lICFpcyBudWxsKSB7CisgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgIHdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8sCisgICAgICAgIGIgPyBDVHlwZS5CT09MRUFOX1RSVUUgOiBDVHlwZS5CT09MRUFOX0ZBTFNFKTsKKyAgICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCisgICAgICB3cml0ZUJ5dGUoYiA/IENUeXBlLkJPT0xFQU5fVFJVRSA6IENUeXBlLkJPT0xFQU5fRkFMU0UpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgeworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmIpWzAuLjFdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB7CisgICAgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMTYpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIHdyaXRlVmFyaW50MzIoaTMyVG9aaWd6YWcoaTMyKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB7CisgICAgd3JpdGVWYXJpbnQ2NChpNjRUb1ppZ3phZyhpNjQpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIHVsb25nIGJpdHMgPSBob3N0VG9MZSgqY2FzdCh1bG9uZyopKCZkdWIpKTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZiaXRzKVswIC4uIDhdKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoc3RyaW5nIHN0cikgeworICAgIHdyaXRlQmluYXJ5KGNhc3QodWJ5dGVbXSlzdHIpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeSh1Ynl0ZVtdIGJ1ZikgeworICAgIGFzc2VydChidWYubGVuZ3RoIDw9IGludC5tYXgpOworICAgIHdyaXRlVmFyaW50MzIoY2FzdChpbnQpYnVmLmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGJ1Zik7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1zZykgeworICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpUFJPVE9DT0xfSUQpOworICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpKChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKGNhc3QoaW50KW1zZy50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpKTsKKyAgICB3cml0ZVZhcmludDMyKG1zZy5zZXFpZCk7CisgICAgd3JpdGVTdHJpbmcobXNnLm5hbWUpOworICB9CisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KSB7CisgICAgZmllbGRJZFN0YWNrXyB+PSBsYXN0RmllbGRJZF87CisgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgbGFzdEZpZWxkSWRfID0gZmllbGRJZFN0YWNrX1skIC0gMV07CisgICAgZmllbGRJZFN0YWNrXyA9IGZpZWxkSWRTdGFja19bMCAuLiAkIC0gMV07CisgICAgZmllbGRJZFN0YWNrXy5hc3N1bWVTYWZlQXBwZW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CisgICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBmaWVsZC5uYW1lOworICAgICAgYm9vbGVhbkZpZWxkXy50eXBlID0gZmllbGQudHlwZTsKKyAgICAgIGJvb2xlYW5GaWVsZF8uaWQgPSBmaWVsZC5pZDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkKTsKKyAgICB9CisgIH0KKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGxpc3QuZWxlbVR5cGUsIGxpc3Quc2l6ZSk7CisgIH0KKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIGlmIChtYXAuc2l6ZSA9PSAwKSB7CisgICAgICB3cml0ZUJ5dGUoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChtYXAuc2l6ZSA8PSBpbnQubWF4KTsKKyAgICAgIHdyaXRlVmFyaW50MzIoY2FzdChpbnQpbWFwLnNpemUpOworICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkodG9DVHlwZShtYXAua2V5VHlwZSkgPDwgNCB8IHRvQ1R5cGUobWFwLnZhbHVlVHlwZSkpKTsKKyAgICB9CisgIH0KKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2V0LmVsZW1UeXBlLCBzZXQuc2l6ZSk7CisgIH0KKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKworICAvKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgaWYgKGhhc0Jvb2xWYWx1ZV8gPT0gdHJ1ZSkgeworICAgICAgaGFzQm9vbFZhbHVlXyA9IGZhbHNlOworICAgICAgcmV0dXJuIGJvb2xWYWx1ZV87CisgICAgfQorCisgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gQ1R5cGUuQk9PTEVBTl9UUlVFOworICB9CisKKyAgYnl0ZSByZWFkQnl0ZSgpIHsKKyAgICB1Ynl0ZVsxXSBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiKTsKKyAgICByZXR1cm4gY2FzdChieXRlKWJbMF07CisgIH0KKworICBzaG9ydCByZWFkSTE2KCkgeworICAgIHJldHVybiBjYXN0KHNob3J0KXppZ3phZ1RvSTMyKHJlYWRWYXJpbnQzMigpKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIHJldHVybiB6aWd6YWdUb0kzMihyZWFkVmFyaW50MzIoKSk7CisgIH0KKworICBsb25nIHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIHppZ3phZ1RvSTY0KHJlYWRWYXJpbnQ2NCgpKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIEludEJ1ZiFsb25nIGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIuYnl0ZXMpOworICAgIGIudmFsdWUgPSBsZVRvSG9zdChiLnZhbHVlKTsKKyAgICByZXR1cm4gKmNhc3QoZG91YmxlKikoJmIudmFsdWUpOworICB9CisKKyAgc3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIGNhc3Qoc3RyaW5nKXJlYWRCaW5hcnkoKTsKKyAgfQorCisgIHVieXRlW10gcmVhZEJpbmFyeSgpIHsKKyAgICBhdXRvIHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICBjaGVja1NpemUoc2l6ZSwgc3RyaW5nU2l6ZUxpbWl0KTsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGF1dG8gYnVmID0gdW5pbml0aWFsaXplZEFycmF5ISh1Ynl0ZVtdKShzaXplKTsKKyAgICB0cmFuc18ucmVhZEFsbChidWYpOworICAgIHJldHVybiBidWY7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIFRNZXNzYWdlIG1zZyA9IHZvaWQ7CisKKyAgICBhdXRvIHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOworICAgIGlmIChwcm90b2NvbElkICE9IGNhc3QoYnl0ZSlQUk9UT0NPTF9JRCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiQmFkIHByb3RvY29sIGlkZW50aWZpZXIiLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5CQURfVkVSU0lPTik7CisgICAgfQorCisgICAgYXV0byB2ZXJzaW9uQW5kVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgYXV0byB2ZXIgPSB2ZXJzaW9uQW5kVHlwZSAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyICE9IFZFUlNJT05fTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiQmFkIHByb3RvY29sIHZlcnNpb24iLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5CQURfVkVSU0lPTik7CisgICAgfQorCisgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgICAgbXNnLnNlcWlkID0gcmVhZFZhcmludDMyKCk7CisgICAgbXNnLm5hbWUgPSByZWFkU3RyaW5nKCk7CisKKyAgICByZXR1cm4gbXNnOworICB9CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIGZpZWxkSWRTdGFja18gfj0gbGFzdEZpZWxkSWRfOworICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgcmV0dXJuIFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBsYXN0RmllbGRJZF8gPSBmaWVsZElkU3RhY2tfWyQgLSAxXTsKKyAgICBmaWVsZElkU3RhY2tfID0gZmllbGRJZFN0YWNrX1swIC4uICQgLSAxXTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBURmllbGQgZiA9IHZvaWQ7CisgICAgZi5uYW1lID0gbnVsbDsKKworICAgIGF1dG8gYml0ZSA9IHJlYWRCeXRlKCk7CisgICAgYXV0byB0eXBlID0gY2FzdChDVHlwZSkoYml0ZSAmIDB4MGYpOworCisgICAgaWYgKHR5cGUgPT0gQ1R5cGUuU1RPUCkgeworICAgICAgLy8gU3RydWN0IHN0b3AgYnl0ZSwgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgZi5pZCA9IDA7CisgICAgICBmLnR5cGUgPSBUVHlwZS5TVE9QOworICAgICAgcmV0dXJuIGY7CisgICAgfQorCisgICAgLy8gTWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlciwgd2hpY2ggY291bGQgY29udGFpbiBhIGZpZWxkIGlkCisgICAgLy8gZGVsdGEuCisgICAgYXV0byBtb2RpZmllciA9IGNhc3Qoc2hvcnQpKChiaXRlICYgMHhmMCkgPj4gNCk7CisgICAgaWYgKG1vZGlmaWVyID4gMCkgeworICAgICAgZi5pZCA9IGNhc3Qoc2hvcnQpKGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRGVsdGEgZW5jb2Rpbmcgbm90IHVzZWQsIGp1c3QgcmVhZCB0aGUgaWQgYXMgdXN1YWwuCisgICAgICBmLmlkID0gcmVhZEkxNigpOworICAgIH0KKyAgICBmLnR5cGUgPSBnZXRUVHlwZSh0eXBlKTsKKworICAgIGlmICh0eXBlID09IENUeXBlLkJPT0xFQU5fVFJVRSB8fCB0eXBlID09IENUeXBlLkJPT0xFQU5fRkFMU0UpIHsKKyAgICAgIC8vIEZvciBib29sZWFuIGZpZWxkcywgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUg4oCTIGtlZXAgaXQgYXJvdW5kCisgICAgICAvLyBmb3IgdGhlIHJlYWRCb29sKCkgY2FsbC4KKyAgICAgIGhhc0Jvb2xWYWx1ZV8gPSB0cnVlOworICAgICAgYm9vbFZhbHVlXyA9ICh0eXBlID09IENUeXBlLkJPT0xFQU5fVFJVRSA/IHRydWUgOiBmYWxzZSk7CisgICAgfQorCisgICAgbGFzdEZpZWxkSWRfID0gZi5pZDsKKyAgICByZXR1cm4gZjsKKyAgfQorICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBhdXRvIHNpemVBbmRUeXBlID0gcmVhZEJ5dGUoKTsKKworICAgIGF1dG8gbHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweGY7CisgICAgaWYgKGxzaXplID09IDB4ZikgeworICAgICAgbHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICB9CisgICAgY2hlY2tTaXplKGxzaXplLCBjb250YWluZXJTaXplTGltaXQpOworCisgICAgVExpc3QgbCA9IHZvaWQ7CisgICAgbC5lbGVtVHlwZSA9IGdldFRUeXBlKGNhc3QoQ1R5cGUpKHNpemVBbmRUeXBlICYgMHgwZikpOworICAgIGwuc2l6ZSA9IGNhc3Qoc2l6ZV90KWxzaXplOworCisgICAgcmV0dXJuIGw7CisgIH0KKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgVE1hcCBtID0gdm9pZDsKKworICAgIGF1dG8gc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIHVieXRlIGt2VHlwZTsKKyAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICBrdlR5cGUgPSByZWFkQnl0ZSgpOworICAgIH0KKyAgICBjaGVja1NpemUoc2l6ZSwgY29udGFpbmVyU2l6ZUxpbWl0KTsKKworICAgIG0uc2l6ZSA9IHNpemU7CisgICAgbS5rZXlUeXBlID0gZ2V0VFR5cGUoY2FzdChDVHlwZSkoa3ZUeXBlID4+IDQpKTsKKyAgICBtLnZhbHVlVHlwZSA9IGdldFRUeXBlKGNhc3QoQ1R5cGUpKGt2VHlwZSAmIDB4ZikpOworCisgICAgcmV0dXJuIG07CisgIH0KKyAgdm9pZCByZWFkTWFwRW5kKCkge30KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBhdXRvIHNpemVBbmRUeXBlID0gcmVhZEJ5dGUoKTsKKworICAgIGF1dG8gbHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweGY7CisgICAgaWYgKGxzaXplID09IDB4ZikgeworICAgICAgbHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICB9CisgICAgY2hlY2tTaXplKGxzaXplLCBjb250YWluZXJTaXplTGltaXQpOworCisgICAgVFNldCBzID0gdm9pZDsKKyAgICBzLmVsZW1UeXBlID0gZ2V0VFR5cGUoY2FzdChDVHlwZSkoc2l6ZUFuZFR5cGUgJiAweGYpKTsKKyAgICBzLnNpemUgPSBjYXN0KHNpemVfdClsc2l6ZTsKKworICAgIHJldHVybiBzOworICB9CisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKK3ByaXZhdGU6CisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSA9IC0xKSB7CisgICAgLy8gSWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgIGF1dG8gdHlwZVRvV3JpdGUgPSAodHlwZU92ZXJyaWRlID09IC0xID8gdG9DVHlwZShmaWVsZC50eXBlKSA6IHR5cGVPdmVycmlkZSk7CisKKyAgICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgICBpZiAoZmllbGQuaWQgPiBsYXN0RmllbGRJZF8gJiYgKGZpZWxkLmlkIC0gbGFzdEZpZWxkSWRfKSA8PSAxNSkgeworICAgICAgLy8gd3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoKGZpZWxkLmlkIC0gbGFzdEZpZWxkSWRfKSA8PCA0IHwgdHlwZVRvV3JpdGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSl0eXBlVG9Xcml0ZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgIH0KKworCisgIHZvaWQgd3JpdGVDb2xsZWN0aW9uQmVnaW4oVFR5cGUgZWxlbVR5cGUsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpKHNpemUgPDwgNCB8IHRvQ1R5cGUoZWxlbVR5cGUpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChzaXplIDw9IGludC5tYXgpOworICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoMHhmMCB8IHRvQ1R5cGUoZWxlbVR5cGUpKSk7CisgICAgICB3cml0ZVZhcmludDMyKGNhc3QoaW50KXNpemUpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVWYXJpbnQzMih1aW50IG4pIHsKKyAgICB1Ynl0ZVs1XSBidWYgPSB2b2lkOworICAgIHVieXRlIHdzaXplOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGNhc3QodWJ5dGUpbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICBidWZbd3NpemUrK10gPSBjYXN0KHVieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgIG4gPj49IDc7CisgICAgICB9CisgICAgfQorCisgICAgdHJhbnNfLndyaXRlKGJ1ZlswIC4uIHdzaXplXSk7CisgIH0KKworICAvKgorICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHZvaWQgd3JpdGVWYXJpbnQ2NCh1bG9uZyBuKSB7CisgICAgdWJ5dGVbMTBdIGJ1ZiA9IHZvaWQ7CisgICAgdWJ5dGUgd3NpemU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGNhc3QodWJ5dGUpbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICBidWZbd3NpemUrK10gPSBjYXN0KHVieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgIG4gPj49IDc7CisgICAgICB9CisgICAgfQorCisgICAgdHJhbnNfLndyaXRlKGJ1ZlswIC4uIHdzaXplXSk7CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICovCisgIHVsb25nIGk2NFRvWmlnemFnKGxvbmcgbCkgeworICAgIHJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKTsKKyAgfQorCisgIC8qCisgICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAqLworICB1aW50IGkzMlRvWmlnemFnKGludCBuKSB7CisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworICB9CisKKyAgQ1R5cGUgdG9DVHlwZShUVHlwZSB0eXBlKSB7CisgICAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFRUeXBlLlNUT1A6CisgICAgICAgIHJldHVybiBDVHlwZS5TVE9QOworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICByZXR1cm4gQ1R5cGUuQk9PTEVBTl9UUlVFOworICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICByZXR1cm4gQ1R5cGUuQllURTsKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gQ1R5cGUuRE9VQkxFOworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHJldHVybiBDVHlwZS5JMTY7CisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcmV0dXJuIENUeXBlLkkzMjsKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICByZXR1cm4gQ1R5cGUuSTY0OworICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgIHJldHVybiBDVHlwZS5CSU5BUlk7CisgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgcmV0dXJuIENUeXBlLlNUUlVDVDsKKyAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICByZXR1cm4gQ1R5cGUuTUFQOworICAgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICAgIHJldHVybiBDVHlwZS5TRVQ7CisgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgIHJldHVybiBDVHlwZS5MSVNUOworICAgICAgY2FzZSBUVHlwZS5WT0lEOgorICAgICAgICBhc3NlcnQoZmFsc2UsICJJbnZhbGlkIHR5cGUgcGFzc2VkLiIpOworICAgIH0KKyAgfQorCisgIGludCByZWFkVmFyaW50MzIoKSB7CisgICAgcmV0dXJuIGNhc3QoaW50KXJlYWRWYXJpbnQ2NCgpOworICB9CisKKyAgbG9uZyByZWFkVmFyaW50NjQoKSB7CisgICAgdWxvbmcgdmFsOworICAgIHVieXRlIHNoaWZ0OworICAgIHVieXRlWzEwXSBidWYgPSB2b2lkOyAgLy8gNjQgYml0cyAvICg3IGJpdHMvYnl0ZSkgPSAxMCBieXRlcy4KKyAgICBhdXRvIGJ1ZlNpemUgPSBidWYuc2l6ZW9mOworICAgIGF1dG8gYm9ycm93ZWQgPSB0cmFuc18uYm9ycm93KGJ1Zi5wdHIsIGJ1ZlNpemUpOworCisgICAgdWJ5dGUgcnNpemU7CisKKyAgICBpZiAoYm9ycm93ZWQpIHsKKyAgICAgIC8vIEZhc3QgcGF0aC4KKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGF1dG8gYml0ZSA9IGJvcnJvd2VkW3JzaXplXTsKKyAgICAgICAgcnNpemUrKzsKKyAgICAgICAgdmFsIHw9IGNhc3QodWxvbmcpKGJpdGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgaWYgKCEoYml0ZSAmIDB4ODApKSB7CisgICAgICAgICAgdHJhbnNfLmNvbnN1bWUocnNpemUpOworICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgaW52YWxpZCBkYXRhIHNvIHdlIGRvbid0IGNyYXNoLgorICAgICAgICBpZiAocnNpemUgPT0gYnVmLnNpemVvZikgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBTbG93IHBhdGguCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB1Ynl0ZVsxXSBiaXRlOworICAgICAgICB0cmFuc18ucmVhZEFsbChiaXRlKTsKKyAgICAgICAgKytyc2l6ZTsKKworICAgICAgICB2YWwgfD0gY2FzdCh1bG9uZykoYml0ZVswXSAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICBzaGlmdCArPSA3OworICAgICAgICBpZiAoIShiaXRlWzBdICYgMHg4MCkpIHsKKyAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgorICAgICAgICBpZiAocnNpemUgPj0gYnVmLnNpemVvZikgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qCisgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICovCisgIGludCB6aWd6YWdUb0kzMih1aW50IG4pIHsKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIC8qCisgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICAgKi8KKyAgbG9uZyB6aWd6YWdUb0k2NCh1bG9uZyBuKSB7CisgICAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSk7CisgIH0KKworICBUVHlwZSBnZXRUVHlwZShDVHlwZSB0eXBlKSB7CisgICAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIENUeXBlLlNUT1A6CisgICAgICAgIHJldHVybiBUVHlwZS5TVE9QOworICAgICAgY2FzZSBDVHlwZS5CT09MRUFOX0ZBTFNFOgorICAgICAgICByZXR1cm4gVFR5cGUuQk9PTDsKKyAgICAgIGNhc2UgQ1R5cGUuQk9PTEVBTl9UUlVFOgorICAgICAgICByZXR1cm4gVFR5cGUuQk9PTDsKKyAgICAgIGNhc2UgQ1R5cGUuQllURToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJZVEU7CisgICAgICBjYXNlIENUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgIGNhc2UgQ1R5cGUuSTMyOgorICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgY2FzZSBDVHlwZS5JNjQ6CisgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICBjYXNlIENUeXBlLkRPVUJMRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkRPVUJMRTsKKyAgICAgIGNhc2UgQ1R5cGUuQklOQVJZOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSSU5HOworICAgICAgY2FzZSBDVHlwZS5MSVNUOgorICAgICAgICByZXR1cm4gVFR5cGUuTElTVDsKKyAgICAgIGNhc2UgQ1R5cGUuU0VUOgorICAgICAgICByZXR1cm4gVFR5cGUuU0VUOworICAgICAgY2FzZSBDVHlwZS5NQVA6CisgICAgICAgIHJldHVybiBUVHlwZS5NQVA7CisgICAgICBjYXNlIENUeXBlLlNUUlVDVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUlVDVDsKKyAgICB9CisgIH0KKworICB2b2lkIGNoZWNrU2l6ZShpbnQgc2l6ZSwgaW50IGxpbWl0KSB7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLk5FR0FUSVZFX1NJWkUpOworICAgIH0gZWxzZSBpZiAobGltaXQgPiAwICYmIHNpemUgPiBsaW1pdCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICB9CisgIH0KKworICBlbnVtIFBST1RPQ09MX0lEID0gMHg4MjsKKyAgZW51bSBWRVJTSU9OX04gPSAxOworICBlbnVtIFZFUlNJT05fTUFTSyA9IDBiMDAwMV8xMTExOworICBlbnVtIFRZUEVfTUFTSyA9IDBiMTExMF8wMDAwOworICBlbnVtIFRZUEVfQklUUyA9IDBiMDAwMF8wMTExOworICBlbnVtIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAvLyBQcm9iYWJseSBuZWVkIHRvIGltcGxlbWVudCBhIGJldHRlciBzdGFjayBhdCBzb21lIHBvaW50LgorICBzaG9ydFtdIGZpZWxkSWRTdGFja187CisgIHNob3J0IGxhc3RGaWVsZElkXzsKKworICBURmllbGQgYm9vbGVhbkZpZWxkXzsKKworICBib29sIGhhc0Jvb2xWYWx1ZV87CisgIGJvb2wgYm9vbFZhbHVlXzsKKworICBUcmFuc3BvcnQgdHJhbnNfOworfQorCisvKioKKyAqIFRDb21wYWN0UHJvdG9jb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgdHJhbnNwb3J0IHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoTElOSzIgaHR0cDovL2QucHVyZW1hZ2ljLmNvbS9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTYwODIsIEQgQnVnemlsbGEKKyAqIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RDb21wYWN0UHJvdG9jb2whVHJhbnNwb3J0IHRDb21wYWN0UHJvdG9jb2woVHJhbnNwb3J0KShUcmFuc3BvcnQgdHJhbnMsCisgIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMAorKSBpZiAoaXNUVHJhbnNwb3J0IVRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sIVRyYW5zcG9ydCh0cmFucywKKyAgICBjb250YWluZXJTaXplTGltaXQsIHN0cmluZ1NpemVMaW1pdCk7Cit9CisKK3ByaXZhdGUgeworICBlbnVtIENUeXBlIDogdWJ5dGUgeworICAgIFNUT1AgPSAweDAsCisgICAgQk9PTEVBTl9UUlVFID0gMHgxLAorICAgIEJPT0xFQU5fRkFMU0UgPSAweDIsCisgICAgQllURSA9IDB4MywKKyAgICBJMTYgPSAweDQsCisgICAgSTMyID0gMHg1LAorICAgIEk2NCA9IDB4NiwKKyAgICBET1VCTEUgPSAweDcsCisgICAgQklOQVJZID0gMHg4LAorICAgIExJU1QgPSAweDksCisgICAgU0VUID0gMHhhLAorICAgIE1BUCA9IDB4YiwKKyAgICBTVFJVQ1QgPSAweGMKKyAgfQorICBzdGF0aWMgYXNzZXJ0KENUeXBlLm1heCA8PSAweGYsCisgICAgIkNvbXBhY3QgcHJvdG9jb2wgd2lyZSB0eXBlIHJlcHJlc2VudGF0aW9uIG11c3QgZml0IGludG8gNCBiaXRzLiIpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgLy8gQ2hlY2sgdGhlIG1lc3NhZ2UgaGVhZGVyIGZvcm1hdC4KKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBjb21wYWN0ID0gdENvbXBhY3RQcm90b2NvbChidWYpOworICBjb21wYWN0LndyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlKCJmb28iLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMCkpOworCisgIGF1dG8gaGVhZGVyID0gbmV3IHVieXRlWzddOworICBidWYucmVhZEFsbChoZWFkZXIpOworICBlbmZvcmNlKGhlYWRlciA9PSBbCisgICAgMTMwLCAvLyBQcm90b2NvbCBpZC4KKyAgICAzMywgLy8gVmVyc2lvbi90eXBlIGJ5dGUuCisgICAgMCwgLy8gU2VxdWVuY2UgaWQuCisgICAgMywgMTAyLCAxMTEsIDExMSAvLyBNZXRob2QgbmFtZS4KKyAgXSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnByb3RvY29sOworICB0ZXN0Q29udGFpbmVyU2l6ZUxpbWl0IShUQ29tcGFjdFByb3RvY29sISgpKSgpOworICB0ZXN0U3RyaW5nU2l6ZUxpbWl0IShUQ29tcGFjdFByb3RvY29sISgpKSgpOworfQorCisvKioKKyAqIFRQcm90b2NvbEZhY3RvcnkgY3JlYXRpbmcgYSBUQ29tcGFjdFByb3RvY29sIGluc3RhbmNlIGZvciBwYXNzZWQgaW4KKyAqIHRyYW5zcG9ydHMuCisgKgorICogVGhlIG9wdGlvbmFsIFRyYW5zcG9ydHMgdGVtcGxhdGUgdHVwbGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAqIG9uZSBvciBtb3JlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRvIHNwZWNpZmljYWxseSBpbnN0YW50aWF0ZQorICogVENvbXBhY3RQcm90b2NvbCBmb3IuIElmIHRoZSBhY3R1YWwgdHJhbnNwb3J0IHR5cGVzIGVuY291bnRlcmVkIGF0CisgKiBydW50aW1lIG1hdGNoIG9uZSBvZiB0aGUgdHJhbnNwb3J0cyBpbiB0aGUgbGlzdCwgYSBzcGVjaWFsaXplZCBwcm90b2NvbAorICogaW5zdGFuY2UgaXMgY3JlYXRlZC4gT3RoZXJ3aXNlLCBhIGdlbmVyaWMgVFRyYW5zcG9ydCB2ZXJzaW9uIGlzIHVzZWQuCisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KFRyYW5zcG9ydHMuLi4pIGlmICgKKyAgYWxsU2F0aXNmeSEoaXNUVHJhbnNwb3J0LCBUcmFuc3BvcnRzKQorKSA6IFRQcm90b2NvbEZhY3RvcnkgeworICAvLy8KKyAgdGhpcyhpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDApIHsKKyAgICBjb250YWluZXJTaXplTGltaXRfID0gMDsKKyAgICBzdHJpbmdTaXplTGltaXRfID0gMDsKKyAgfQorCisgIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSBjb25zdCB7CisgICAgZm9yZWFjaCAoVHJhbnNwb3J0OyBUeXBlVHVwbGUhKFRyYW5zcG9ydHMsIFRUcmFuc3BvcnQpKSB7CisgICAgICBhdXRvIGNvbmNyZXRlVHJhbnMgPSBjYXN0KFRyYW5zcG9ydCl0cmFuczsKKyAgICAgIGlmIChjb25jcmV0ZVRyYW5zKSB7CisgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCFUcmFuc3BvcnQoY29uY3JldGVUcmFucyk7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAiUGFzc2VkIG51bGwgdHJhbnNwb3J0IHRvIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5LiIpOworICB9CisKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdF87CisgIGludCBzdHJpbmdTaXplTGltaXRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE3MWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9qc29uLmQKQEAgLTAsMCArMSwxMDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnByb3RvY29sLmpzb247CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworaW1wb3J0IHN0ZC5hcnJheTsKK2ltcG9ydCBzdGQuYmFzZTY0OworaW1wb3J0IHN0ZC5jb252OworaW1wb3J0IHN0ZC5yYW5nZTsKK2ltcG9ydCBzdGQuc3RyaW5nIDogZm9ybWF0OworaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0ludGVncmFsOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBUeXBlVHVwbGU7CitpbXBvcnQgc3RkLnV0ZiA6IHRvVVRGODsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKK2FsaWFzIEJhc2U2NEltcGwhKCcrJywgJy8nLCBCYXNlNjQuTm9QYWRkaW5nKSBCYXNlNjROb1BhZDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IEpTT04gcHJvdG9jb2wuCisgKi8KK2ZpbmFsIGNsYXNzIFRKc29uUHJvdG9jb2woVHJhbnNwb3J0ID0gVFRyYW5zcG9ydCkgaWYgKAorICBpc1RUcmFuc3BvcnQhVHJhbnNwb3J0CispIDogVFByb3RvY29sIHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFucyA9IFRoZSB0cmFuc3BvcnQgdG8gdXNlLgorICAgKiAgIGNvbnRhaW5lclNpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgY29udGFpbmVyIHNpemUgaXMgbGltaXRlZCB0byB0aGUKKyAgICogICAgIGdpdmVuIG51bWJlciBvZiBpdGVtcy4KKyAgICogICBzdHJpbmdTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIHN0cmluZyBsZW5ndGggaXMgbGltaXRlZCB0byB0aGUKKyAgICogICAgIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgICovCisgIHRoaXMoVHJhbnNwb3J0IHRyYW5zLCBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDApIHsKKyAgICB0cmFuc18gPSB0cmFuczsKKyAgICB0aGlzLmNvbnRhaW5lclNpemVMaW1pdCA9IGNvbnRhaW5lclNpemVMaW1pdDsKKyAgICB0aGlzLnN0cmluZ1NpemVMaW1pdCA9IHN0cmluZ1NpemVMaW1pdDsKKworICAgIGNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKKyAgICByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcih0cmFucyk7CisgIH0KKworICBUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNfOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBkZXN0cm95KGNvbnRleHRTdGFja18pOworICAgIGNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKKyAgICByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcih0cmFuc18pOworICB9CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBvZiBkZXNlcmlhbGl6ZWQgY29udGFpbmVycyB0byB0aGUKKyAgICogZ2l2ZW4gYW1vdW50LgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBjb250YWluZXJTaXplTGltaXQ7CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIGxlbmd0aCBvZiBkZXNlcmlhbGl6ZWQgc3RyaW5ncy9iaW5hcnkgZGF0YSB0byB0aGUKKyAgICogZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIE5vdGU6IEZvciBiaW5hcnkgZGF0YSwgdGhlIGxpbWl0IGFwcGxpZXMgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgICogQmFzZTY0LWVuY29kZWQgc3RyaW5nIGRhdGEsIG5vdCB0aGUgcmVzdWx0aW5nIGJ5dGUgYXJyYXkuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBzdHJpbmdTaXplTGltaXQ7CisKKyAgLyoKKyAgICogV3JpdGluZyBtZXRob2RzLgorICAgKi8KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGIgPyAxIDogMCk7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGIpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGkxNik7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGkzMik7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB7CisgICAgd3JpdGVKc29uSW50ZWdlcihpNjQpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKworICAgIHN0cmluZyB2YWx1ZTsKKyAgICBpZiAoZHViIGlzIGRvdWJsZS5uYW4pIHsKKyAgICAgIHZhbHVlID0gTkFOX1NUUklORzsKKyAgICB9IGVsc2UgaWYgKGR1YiBpcyBkb3VibGUuaW5maW5pdHkpIHsKKyAgICAgIHZhbHVlID0gSU5GSU5JVFlfU1RSSU5HOworICAgIH0gZWxzZSBpZiAoZHViIGlzIC1kb3VibGUuaW5maW5pdHkpIHsKKyAgICAgIHZhbHVlID0gTkVHX0lORklOSVRZX1NUUklORzsKKyAgICB9CisKKyAgICBib29sIGVzY2FwZU51bSA9IHZhbHVlICFpcyBudWxsIHx8IGNvbnRleHRfLmVzY2FwZU51bTsKKworICAgIGlmICh2YWx1ZSBpcyBudWxsKSB7CisgICAgICAvKiBwcmVjaXNpb24gaXMgMTcgKi8KKyAgICAgIHZhbHVlID0gZm9ybWF0KCIlLjE3ZyIsIGR1Yik7CisgICAgfQorCisgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICAgIHRyYW5zXy53cml0ZShjYXN0KHVieXRlW10pdmFsdWUpOworICAgIGlmIChlc2NhcGVOdW0pIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoc3RyaW5nIHN0cikgeworICAgIGNvbnRleHRfLndyaXRlKHRyYW5zXyk7CisgICAgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICAgIGZvcmVhY2ggKGM7IHN0cikgeworICAgICAgd3JpdGVKc29uQ2hhcihjKTsKKyAgICB9CisgICAgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeSh1Ynl0ZVtdIGJ1ZikgeworICAgIGNvbnRleHRfLndyaXRlKHRyYW5zXyk7CisKKyAgICB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgdWJ5dGVbNF0gYjsKKyAgICB3aGlsZSAoIWJ1Zi5lbXB0eSkgeworICAgICAgYXV0byB0b1dyaXRlID0gdGFrZShidWYsIDMpOworICAgICAgQmFzZTY0Tm9QYWQuZW5jb2RlKHRvV3JpdGUsIGJbXSk7CisgICAgICB0cmFuc18ud3JpdGUoYlswIC4uIHRvV3JpdGUubGVuZ3RoICsgMV0pOworICAgICAgYnVmLnBvcEZyb250Tih0b1dyaXRlLmxlbmd0aCk7CisgICAgfQorICAgIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbXNnKSB7CisgICAgd3JpdGVKc29uQXJyYXlCZWdpbigpOworICAgIHdyaXRlSnNvbkludGVnZXIoVEhSSUZUX0pTT05fVkVSU0lPTik7CisgICAgd3JpdGVTdHJpbmcobXNnLm5hbWUpOworICAgIHdyaXRlSnNvbkludGVnZXIoY2FzdChieXRlKW1zZy50eXBlKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKG1zZy5zZXFpZCk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICB3cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdHN0cnVjdCkgeworICAgIHdyaXRlSnNvbk9iamVjdEJlZ2luKCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIHdyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgd3JpdGVKc29uSW50ZWdlcihmaWVsZC5pZCk7CisgICAgd3JpdGVKc29uT2JqZWN0QmVnaW4oKTsKKyAgICB3cml0ZVN0cmluZyhnZXROYW1lRnJvbVRUeXBlKGZpZWxkLnR5cGUpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHsKKyAgICB3cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIHdyaXRlSnNvbkFycmF5QmVnaW4oKTsKKyAgICB3cml0ZVN0cmluZyhnZXROYW1lRnJvbVRUeXBlKGxpc3QuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGxpc3Quc2l6ZSk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHsKKyAgICB3cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgd3JpdGVKc29uQXJyYXlCZWdpbigpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUobWFwLmtleVR5cGUpKTsKKyAgICB3cml0ZVN0cmluZyhnZXROYW1lRnJvbVRUeXBlKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKG1hcC5zaXplKTsKKyAgICB3cml0ZUpzb25PYmplY3RCZWdpbigpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHsKKyAgICB3cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICB3cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgd3JpdGVKc29uQXJyYXlCZWdpbigpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUoc2V0LmVsZW1UeXBlKSk7CisgICAgd3JpdGVKc29uSW50ZWdlcihzZXQuc2l6ZSk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkgeworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworCisgIC8qCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIWJ5dGUoKSA/IHRydWUgOiBmYWxzZTsKKyAgfQorCisgIGJ5dGUgcmVhZEJ5dGUoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFieXRlKCk7CisgIH0KKworICBzaG9ydCByZWFkSTE2KCkgeworICAgIHJldHVybiByZWFkSnNvbkludGVnZXIhc2hvcnQoKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIHJldHVybiByZWFkSnNvbkludGVnZXIhaW50KCk7CisgIH0KKworICBsb25nIHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFsb25nKCk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICBjb250ZXh0Xy5yZWFkKHJlYWRlcl8pOworCisgICAgaWYgKHJlYWRlcl8ucGVlaygpID09IFNUUklOR19ERUxJTUlURVIpIHsKKyAgICAgIGF1dG8gc3RyID0gcmVhZEpzb25TdHJpbmcodHJ1ZSk7CisgICAgICBpZiAoc3RyID09IE5BTl9TVFJJTkcpIHsKKyAgICAgICAgcmV0dXJuIGRvdWJsZS5uYW47CisgICAgICB9CisgICAgICBpZiAoc3RyID09IElORklOSVRZX1NUUklORykgeworICAgICAgICByZXR1cm4gZG91YmxlLmluZmluaXR5OworICAgICAgfQorICAgICAgaWYgKHN0ciA9PSBORUdfSU5GSU5JVFlfU1RSSU5HKSB7CisgICAgICAgIHJldHVybiAtZG91YmxlLmluZmluaXR5OworICAgICAgfQorCisgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSkgeworICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiLAorICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gdG8hZG91YmxlKHN0cik7CisgICAgICB9IGNhdGNoIChDb252RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihgRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290ICJgIH4gc3RyIH4KKyAgICAgICAgICBgIi5gLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0pIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgICAgICAgcmVhZEpzb25TeW50YXhDaGFyKFNUUklOR19ERUxJTUlURVIpOworICAgICAgfQorCisgICAgICBhdXRvIHN0ciA9IHJlYWRKc29uTnVtZXJpY0NoYXJzKCk7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gdG8hZG91YmxlKHN0cik7CisgICAgICB9IGNhdGNoIChDb252RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihgRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290ICJgIH4gc3RyIH4KKyAgICAgICAgICBgIi5gLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIHJldHVybiByZWFkSnNvblN0cmluZyhmYWxzZSk7CisgIH0KKworICB1Ynl0ZVtdIHJlYWRCaW5hcnkoKSB7CisgICAgcmV0dXJuIEJhc2U2NE5vUGFkLmRlY29kZShyZWFkU3RyaW5nKCkpOworICB9CisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHsKKyAgICBUTWVzc2FnZSBtc2cgPSB2b2lkOworCisgICAgcmVhZEpzb25BcnJheUJlZ2luKCk7CisKKyAgICBhdXRvIHZlciA9IHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworICAgIGlmICh2ZXIgIT0gVEhSSUZUX0pTT05fVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIiwKKyAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuQkFEX1ZFUlNJT04pOworICAgIH0KKworICAgIG1zZy5uYW1lID0gcmVhZFN0cmluZygpOworICAgIG1zZy50eXBlID0gY2FzdChUTWVzc2FnZVR5cGUpcmVhZEpzb25JbnRlZ2VyIWJ5dGUoKTsKKyAgICBtc2cuc2VxaWQgPSByZWFkSnNvbkludGVnZXIhc2hvcnQoKTsKKworICAgIHJldHVybiBtc2c7CisgIH0KKworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgeworICAgIHJlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJlYWRKc29uT2JqZWN0QmVnaW4oKTsKKyAgICByZXR1cm4gVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIHJlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgVEZpZWxkIGYgPSB2b2lkOworICAgIGYubmFtZSA9IG51bGw7CisKKyAgICBhdXRvIGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgaWYgKGNoID09IE9CSkVDVF9FTkQpIHsKKyAgICAgIGYudHlwZSA9IFRUeXBlLlNUT1A7CisgICAgfSBlbHNlIHsKKyAgICAgIGYuaWQgPSByZWFkSnNvbkludGVnZXIhc2hvcnQoKTsKKyAgICAgIHJlYWRKc29uT2JqZWN0QmVnaW4oKTsKKyAgICAgIGYudHlwZSA9IGdldFRUeXBlRnJvbU5hbWUocmVhZFN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZjsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkgeworICAgIHJlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIHJlYWRKc29uQXJyYXlCZWdpbigpOworICAgIGF1dG8gdHlwZSA9IGdldFRUeXBlRnJvbU5hbWUocmVhZFN0cmluZygpKTsKKyAgICBhdXRvIHNpemUgPSByZWFkQ29udGFpbmVyU2l6ZSgpOworICAgIHJldHVybiBUTGlzdCh0eXBlLCBzaXplKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7CisgICAgcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgcmVhZEpzb25BcnJheUJlZ2luKCk7CisgICAgYXV0byBrZXlUeXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIGF1dG8gdmFsdWVUeXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIGF1dG8gc2l6ZSA9IHJlYWRDb250YWluZXJTaXplKCk7CisgICAgcmVhZEpzb25PYmplY3RCZWdpbigpOworICAgIHJldHVybiBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7CisgICAgcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgICByZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICByZWFkSnNvbkFycmF5QmVnaW4oKTsKKyAgICBhdXRvIHR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgYXV0byBzaXplID0gcmVhZENvbnRhaW5lclNpemUoKTsKKyAgICByZXR1cm4gVFNldCh0eXBlLCBzaXplKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHsKKyAgICByZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBwdXNoQ29udGV4dChDb250ZXh0IGMpIHsKKyAgICBjb250ZXh0U3RhY2tfIH49IGNvbnRleHRfOworICAgIGNvbnRleHRfID0gYzsKKyAgfQorCisgIHZvaWQgcG9wQ29udGV4dCgpIHsKKyAgICBjb250ZXh0XyA9IGNvbnRleHRTdGFja18uYmFjazsKKyAgICBjb250ZXh0U3RhY2tfLnBvcEJhY2soKTsKKyAgICBjb250ZXh0U3RhY2tfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKyAgfQorCisgIC8qCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIC8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgYSBKc29uIGVzY2FwZSBzZXF1ZW5jZSAoIlx1MDB4eCIpCisgIHZvaWQgd3JpdGVKc29uRXNjYXBlQ2hhcih1Ynl0ZSBjaCkgeworICAgIHRyYW5zXy53cml0ZShFU0NBUEVfUFJFRklYKTsKKyAgICB0cmFuc18ud3JpdGUoRVNDQVBFX1BSRUZJWCk7CisgICAgYXV0byBvdXRDaCA9IGhleENoYXIoY2FzdCh1Ynl0ZSkoY2ggPj4gNCkpOworICAgIHRyYW5zXy53cml0ZSgoJm91dENoKVswIC4uIDFdKTsKKyAgICBvdXRDaCA9IGhleENoYXIoY2gpOworICAgIHRyYW5zXy53cml0ZSgoJm91dENoKVswIC4uIDFdKTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgcGFydCBvZiBhIEpzb24gc3RyaW5nLCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KKyAgdm9pZCB3cml0ZUpzb25DaGFyKHVieXRlIGNoKSB7CisgICAgaWYgKGNoID49IDB4MzApIHsKKyAgICAgIGlmIChjaCA9PSAnXFwnKSB7IC8vIE9ubHkgc3BlY2lhbCBjaGFyYWN0ZXIgPj0gMHgzMCBpcyAnXCcKKyAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhbnNfLndyaXRlKCgmY2gpWzAgLi4gMV0pOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGF1dG8gb3V0Q2ggPSBrSnNvbkNoYXJUYWJsZVtjaF07CisgICAgICAvLyBDaGVjayBpZiByZWd1bGFyIGNoYXJhY3RlciwgYmFja3NsYXNoIGVzY2FwZWQsIG9yIEpzb24gZXNjYXBlZAorICAgICAgaWYgKG91dENoID09IDEpIHsKKyAgICAgICAgdHJhbnNfLndyaXRlKCgmY2gpWzAgLi4gMV0pOworICAgICAgfSBlbHNlIGlmIChvdXRDaCA+IDEpIHsKKyAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgIHRyYW5zXy53cml0ZSgoJm91dENoKVswIC4uIDFdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlSnNvbkVzY2FwZUNoYXIoY2gpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpzb24gbnVtYmVyLCBvciBhIHN0cmluZworICAvLyBpZiB0aGUgY29udGV4dCByZXF1aXJlcyBpdCAoZWc6IGtleSBpbiBhIG1hcCBwYWlyKS4KKyAgdm9pZCB3cml0ZUpzb25JbnRlZ2VyKFQpKFQgbnVtKSBpZiAoaXNJbnRlZ3JhbCFUKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKworICAgIGF1dG8gZXNjYXBlTnVtID0gY29udGV4dF8uZXNjYXBlTnVtKCk7CisgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICAgIHRyYW5zXy53cml0ZShjYXN0KHVieXRlW10pdG8hc3RyaW5nKG51bSkpOworICAgIGlmIChlc2NhcGVOdW0pIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgfQorCisgIHZvaWQgd3JpdGVKc29uT2JqZWN0QmVnaW4oKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKyAgICB0cmFuc18ud3JpdGUoT0JKRUNUX0JFR0lOKTsKKyAgICBwdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoKSk7CisgIH0KKworICB2b2lkIHdyaXRlSnNvbk9iamVjdEVuZCgpIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKE9CSkVDVF9FTkQpOworICB9CisKKyAgdm9pZCB3cml0ZUpzb25BcnJheUJlZ2luKCkgeworICAgIGNvbnRleHRfLndyaXRlKHRyYW5zXyk7CisgICAgdHJhbnNfLndyaXRlKEFSUkFZX0JFR0lOKTsKKyAgICBwdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CisgIH0KKworICB2b2lkIHdyaXRlSnNvbkFycmF5RW5kKCkgeworICAgIHBvcENvbnRleHQoKTsKKyAgICB0cmFuc18ud3JpdGUoQVJSQVlfRU5EKTsKKyAgfQorCisgIC8qCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIGludCByZWFkQ29udGFpbmVyU2l6ZSgpIHsKKyAgICBhdXRvIHNpemUgPSByZWFkSnNvbkludGVnZXIhaW50KCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLk5FR0FUSVZFX1NJWkUpOworICAgIH0gZWxzZSBpZiAoY29udGFpbmVyU2l6ZUxpbWl0ID4gMCAmJiBzaXplID4gY29udGFpbmVyU2l6ZUxpbWl0KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25TeW50YXhDaGFyKHVieXRlWzFdIGNoKSB7CisgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKKyAgfQorCisgIHdjaGFyIHJlYWRKc29uRXNjYXBlQ2hhcigpIHsKKyAgICBhdXRvIGEgPSByZWFkZXJfLnJlYWQoKTsKKyAgICBhdXRvIGIgPSByZWFkZXJfLnJlYWQoKTsKKyAgICBhdXRvIGMgPSByZWFkZXJfLnJlYWQoKTsKKyAgICBhdXRvIGQgPSByZWFkZXJfLnJlYWQoKTsKKyAgICByZXR1cm4gY2FzdCh1c2hvcnQpKAorICAgICAgICAgIChoZXhWYWwoYVswXSkgPDwgMTIpICsgKGhleFZhbChiWzBdKSA8PCA4KSArCisgICAgICAgICAgKGhleFZhbChjWzBdKSA8PCA0KSArIGhleFZhbChkWzBdKQorICAgICAgICApOworICB9CisKKyAgc3RyaW5nIHJlYWRKc29uU3RyaW5nKGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSkgeworICAgIGlmICghc2tpcENvbnRleHQpIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisKKyAgICByZWFkSnNvblN5bnRheENoYXIoU1RSSU5HX0RFTElNSVRFUik7CisgICAgYXV0byBidWZmZXIgPSBhcHBlbmRlciFzdHJpbmcoKTsKKworICAgIHdjaGFyW10gd2NoczsKKyAgICBpbnQgYnl0ZXNSZWFkOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICBpZiAoY2ggPT0gU1RSSU5HX0RFTElNSVRFUikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgKytieXRlc1JlYWQ7CisgICAgICBpZiAoc3RyaW5nU2l6ZUxpbWl0ID4gMCAmJiBieXRlc1JlYWQgPiBzdHJpbmdTaXplTGltaXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNoID09IEJBQ0tTTEFTSCkgeworICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgICAgICBpZiAoY2ggPT0gRVNDQVBFX0NIQVIpIHsKKyAgICAgICAgICBhdXRvIHdjaCA9IHJlYWRKc29uRXNjYXBlQ2hhcigpOworICAgICAgICAgIGlmICh3Y2ggPj0gMHhEODAwICYmIHdjaCA8PSAweERCRkYpIHsKKyAgICAgICAgICAgIHdjaHMgfj0gd2NoOworICAgICAgICAgIH0gZWxzZSBpZiAod2NoID49IDB4REMwMCAmJiB3Y2ggPD0gMHhERkZGICYmIHdjaHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGhpZ2ggc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdjaHMgfj0gd2NoOworICAgICAgICAgICAgYnVmZmVyLnB1dCh3Y2hzLnRvVVRGOCk7CisgICAgICAgICAgICB3Y2hzID0gW107CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGF1dG8gcG9zID0gY291bnRVbnRpbChrRXNjYXBlQ2hhcnNbXSwgY2hbMF0pOworICAgICAgICAgIGlmIChwb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciIH4KKyAgICAgICAgICAgICAgY2FzdChjaGFyKWNoWzBdIH4gIicuIiwgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHdjaHMubGVuZ3RoICE9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBidWZmZXIucHV0KGNoWzBdKTsKKyAgICB9CisKKyAgICBpZiAod2Nocy5sZW5ndGggIT0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyLmRhdGE7CisgIH0KKworICAvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKKyAgLy8gYSB2YWxpZCBKc29uIG51bWVyaWMgY2hhcmFjdGVyLgorICBzdHJpbmcgcmVhZEpzb25OdW1lcmljQ2hhcnMoKSB7CisgICAgc3RyaW5nIHN0cjsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgICAgaWYgKCFpc0pzb25OdW1lcmljKGNoWzBdKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJlYWRlcl8ucmVhZCgpOworICAgICAgc3RyIH49IGNoOworICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAorICAvLyByZXR1cm5pbmcgdGhlbSB2aWEgbnVtCisgIFQgcmVhZEpzb25JbnRlZ2VyKFQpKCkgaWYgKGlzSW50ZWdyYWwhVCkgeworICAgIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICByZWFkSnNvblN5bnRheENoYXIoU1RSSU5HX0RFTElNSVRFUik7CisgICAgfQorICAgIGF1dG8gc3RyID0gcmVhZEpzb25OdW1lcmljQ2hhcnMoKTsKKyAgICBUIG51bTsKKyAgICB0cnkgeworICAgICAgbnVtID0gdG8hVChzdHIpOworICAgIH0gY2F0Y2ggKENvbnZFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihgRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZSwgZ290ICJgIH4gc3RyIH4gYCIuYCwKKyAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICB9CisgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICByZWFkSnNvblN5bnRheENoYXIoU1RSSU5HX0RFTElNSVRFUik7CisgICAgfQorICAgIHJldHVybiBudW07CisgIH0KKworICB2b2lkIHJlYWRKc29uT2JqZWN0QmVnaW4oKSB7CisgICAgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKyAgICByZWFkSnNvblN5bnRheENoYXIoT0JKRUNUX0JFR0lOKTsKKyAgICBwdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoKSk7CisgIH0KKworICB2b2lkIHJlYWRKc29uT2JqZWN0RW5kKCkgeworICAgIHJlYWRKc29uU3ludGF4Q2hhcihPQkpFQ1RfRU5EKTsKKyAgICBwb3BDb250ZXh0KCk7CisgIH0KKworICB2b2lkIHJlYWRKc29uQXJyYXlCZWdpbigpIHsKKyAgICBjb250ZXh0Xy5yZWFkKHJlYWRlcl8pOworICAgIHJlYWRKc29uU3ludGF4Q2hhcihBUlJBWV9CRUdJTik7CisgICAgcHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOworICB9CisKKyAgdm9pZCByZWFkSnNvbkFycmF5RW5kKCkgeworICAgIHJlYWRKc29uU3ludGF4Q2hhcihBUlJBWV9FTkQpOworICAgIHBvcENvbnRleHQoKTsKKyAgfQorCisgIHN0YXRpYyB7CisgICAgZmluYWwgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKyAgICAgIHRoaXMoVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICAgIHRyYW5zXyA9IHRyYW5zOworICAgICAgfQorCisgICAgICB1Ynl0ZVsxXSByZWFkKCkgeworICAgICAgICBpZiAoaGFzRGF0YV8pIHsKKyAgICAgICAgICBoYXNEYXRhXyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YV87CisgICAgICB9CisKKyAgICAgIHVieXRlWzFdIHBlZWsoKSB7CisgICAgICAgIGlmICghaGFzRGF0YV8pIHsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbChkYXRhXyk7CisgICAgICAgICAgaGFzRGF0YV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhXzsKKyAgICAgIH0KKworICAgICBwcml2YXRlOgorICAgICAgVHJhbnNwb3J0IHRyYW5zXzsKKyAgICAgIGJvb2wgaGFzRGF0YV87CisgICAgICB1Ynl0ZVsxXSBkYXRhXzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSnNvbiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0CisgICAgICogaW1wbGVtZW50YXRpb25zCisgICAgICovCisgICAgY2xhc3MgQ29udGV4dCB7CisgICAgICAvKioKKyAgICAgICAqIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAgICAgKi8KKyAgICAgIHZvaWQgd3JpdGUoVHJhbnNwb3J0IHRyYW5zKSB7fQorCisgICAgICAvKioKKyAgICAgICAqIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgICAgICovCisgICAgICB2b2lkIHJlYWQoTG9va2FoZWFkUmVhZGVyIHJlYWRlcikge30KKworICAgICAgLyoqCisgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyBzdHJpbmdzIGluIHRoaXMgY29udGV4dC4KKyAgICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGZhbHNlLgorICAgICAgICovCisgICAgICBib29sIGVzY2FwZU51bSgpIEBwcm9wZXJ0eSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb250ZXh0IGNsYXNzIGZvciBvYmplY3QgbWVtYmVyIGtleS12YWx1ZSBwYWlycworICAgIGNsYXNzIFBhaXJDb250ZXh0IDogQ29udGV4dCB7CisgICAgICB0aGlzKCkgeworICAgICAgICBmaXJzdF8gPSB0cnVlOworICAgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgfQorCisgICAgICBvdmVycmlkZSB2b2lkIHdyaXRlKFRyYW5zcG9ydCB0cmFucykgeworICAgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFucy53cml0ZShjb2xvbl8gPyBQQUlSX1NFUCA6IEVMRU1fU0VQKTsKKyAgICAgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG92ZXJyaWRlIHZvaWQgcmVhZChMb29rYWhlYWRSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGF1dG8gY2ggPSAoY29sb25fID8gUEFJUl9TRVAgOiBFTEVNX1NFUCk7CisgICAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBjaCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gTnVtYmVycyBtdXN0IGJlIHR1cm5lZCBpbnRvIHN0cmluZ3MgaWYgdGhleSBhcmUgdGhlIGtleSBwYXJ0IG9mIGEgcGFpcgorICAgICAgb3ZlcnJpZGUgYm9vbCBlc2NhcGVOdW0oKSBAcHJvcGVydHkgeworICAgICAgICByZXR1cm4gY29sb25fOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGJvb2wgZmlyc3RfOworICAgICAgYm9vbCBjb2xvbl87CisgICAgfQorCisgICAgY2xhc3MgTGlzdENvbnRleHQgOiBDb250ZXh0IHsKKyAgICAgIHRoaXMoKSB7CisgICAgICAgIGZpcnN0XyA9IHRydWU7CisgICAgICB9CisKKyAgICAgIG92ZXJyaWRlIHZvaWQgd3JpdGUoVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFucy53cml0ZShFTEVNX1NFUCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3ZlcnJpZGUgdm9pZCByZWFkKExvb2thaGVhZFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlYWRTeW50YXhDaGFyKHJlYWRlciwgRUxFTV9TRVApOworICAgICAgICB9CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgYm9vbCBmaXJzdF87CisgICAgfQorCisgICAgLy8gUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFuc3BvcnQgdHJhbnMgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIHRoZQorICAgIC8vIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KKyAgICAvLyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3QuCisgICAgdm9pZCByZWFkU3ludGF4Q2hhcihMb29rYWhlYWRSZWFkZXIgcmVhZGVyLCB1Ynl0ZVsxXSBjaCkgeworICAgICAgYXV0byBjaDIgPSByZWFkZXIucmVhZCgpOworICAgICAgaWYgKGNoMiAhPSBjaCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCAnIiB+IGNhc3QoY2hhciljaFswXSB+ICInLCBnb3QgJyIgfgorICAgICAgICAgIGNhc3QoY2hhciljaDJbMF0gfiAiJy4iLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFByb2JhYmx5IG5lZWQgdG8gaW1wbGVtZW50IGEgYmV0dGVyIHN0YWNrIGF0IHNvbWUgcG9pbnQuCisgIENvbnRleHRbXSBjb250ZXh0U3RhY2tfOworICBDb250ZXh0IGNvbnRleHRfOworCisgIFRyYW5zcG9ydCB0cmFuc187CisgIExvb2thaGVhZFJlYWRlciByZWFkZXJfOworfQorCisvKioKKyAqIFRKc29uUHJvdG9jb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgdHJhbnNwb3J0IHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoTElOSzIgaHR0cDovL2QucHVyZW1hZ2ljLmNvbS9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTYwODIsIEQgQnVnemlsbGEKKyAqIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RKc29uUHJvdG9jb2whVHJhbnNwb3J0IHRKc29uUHJvdG9jb2woVHJhbnNwb3J0KShUcmFuc3BvcnQgdHJhbnMsCisgIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMAorKSBpZiAoaXNUVHJhbnNwb3J0IVRyYW5zcG9ydCkgeworICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2whVHJhbnNwb3J0KHRyYW5zLCBjb250YWluZXJTaXplTGltaXQsIHN0cmluZ1NpemVMaW1pdCk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICAvLyBDaGVjayB0aGUgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LgorICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGpzb24ud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UoImZvbyIsIFRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7CisgIGpzb24ud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgYXV0byBoZWFkZXIgPSBuZXcgdWJ5dGVbMTNdOworICBidWYucmVhZEFsbChoZWFkZXIpOworICBlbmZvcmNlKGNhc3QoY2hhcltdKWhlYWRlciA9PSBgWzEsImZvbyIsMSwwXWApOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgLy8gQ2hlY2sgdGhhdCBzaG9ydCBiaW5hcnkgZGF0YSBpcyByZWFkIGNvcnJlY3RseSAodGhlIFRocmlmdCBKU09OIGZvcm1hdAorICAvLyBkb2VzIG5vdCBpbmNsdWRlIHBhZGRpbmcgY2hhcnMgaW4gdGhlIEJhc2U2NCBlbmNvZGVkIGRhdGEpLgorICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGpzb24ud3JpdGVCaW5hcnkoWzEsIDJdKTsKKyAganNvbi5yZXNldCgpOworICBlbmZvcmNlKGpzb24ucmVhZEJpbmFyeSgpID09IFsxLCAyXSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWQ4MzVcXHVkZDNlXCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhdXRvIHN0ciA9IGpzb24ucmVhZFN0cmluZygpOworICBlbmZvcmNlKHN0ciA9PSAi4LiBIPCdlL4iKTsKK30KKwordW5pdHRlc3QgeworICAvLyBUaHJvd24gaWYgbG93IHN1cnJvZ2F0ZSBpcyBtaXNzaW5nLgorICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZDgzNVwiIik7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAgYXNzZXJ0VGhyb3duIVRQcm90b2NvbEV4Y2VwdGlvbihqc29uLnJlYWRTdHJpbmcoKSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gVGhyb3duIGlmIGhpZ2ggc3Vycm9nYXRlIGlzIG1pc3NpbmcuCisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkZDNlXCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhc3NlcnRUaHJvd24hVFByb3RvY29sRXhjZXB0aW9uKGpzb24ucmVhZFN0cmluZygpKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CisgIHRlc3RDb250YWluZXJTaXplTGltaXQhKFRKc29uUHJvdG9jb2whKCkpKCk7CisgIHRlc3RTdHJpbmdTaXplTGltaXQhKFRKc29uUHJvdG9jb2whKCkpKCk7Cit9CisKKy8qKgorICogVFByb3RvY29sRmFjdG9yeSBjcmVhdGluZyBhIFRKc29uUHJvdG9jb2wgaW5zdGFuY2UgZm9yIHBhc3NlZCBpbgorICogdHJhbnNwb3J0cy4KKyAqCisgKiBUaGUgb3B0aW9uYWwgVHJhbnNwb3J0cyB0ZW1wbGF0ZSB0dXBsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorICogb25lIG9yIG1vcmUgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdG8gc3BlY2lmaWNhbGx5IGluc3RhbnRpYXRlCisgKiBUSnNvblByb3RvY29sIGZvci4gSWYgdGhlIGFjdHVhbCB0cmFuc3BvcnQgdHlwZXMgZW5jb3VudGVyZWQgYXQKKyAqIHJ1bnRpbWUgbWF0Y2ggb25lIG9mIHRoZSB0cmFuc3BvcnRzIGluIHRoZSBsaXN0LCBhIHNwZWNpYWxpemVkIHByb3RvY29sCisgKiBpbnN0YW5jZSBpcyBjcmVhdGVkLiBPdGhlcndpc2UsIGEgZ2VuZXJpYyBUVHJhbnNwb3J0IHZlcnNpb24gaXMgdXNlZC4KKyAqLworY2xhc3MgVEpzb25Qcm90b2NvbEZhY3RvcnkoVHJhbnNwb3J0cy4uLikgaWYgKAorICBhbGxTYXRpc2Z5IShpc1RUcmFuc3BvcnQsIFRyYW5zcG9ydHMpCispIDogVFByb3RvY29sRmFjdG9yeSB7CisgIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSBjb25zdCB7CisgICAgZm9yZWFjaCAoVHJhbnNwb3J0OyBUeXBlVHVwbGUhKFRyYW5zcG9ydHMsIFRUcmFuc3BvcnQpKSB7CisgICAgICBhdXRvIGNvbmNyZXRlVHJhbnMgPSBjYXN0KFRyYW5zcG9ydCl0cmFuczsKKyAgICAgIGlmIChjb25jcmV0ZVRyYW5zKSB7CisgICAgICAgIGF1dG8gcCA9IG5ldyBUSnNvblByb3RvY29sIVRyYW5zcG9ydChjb25jcmV0ZVRyYW5zKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAiUGFzc2VkIG51bGwgdHJhbnNwb3J0IHRvIFRKc29uUHJvdG9jb2xGYWN0b3kuIik7CisgIH0KK30KKworcHJpdmF0ZSB7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBPQkpFQ1RfQkVHSU4gPSAneyc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBPQkpFQ1RfRU5EID0gJ30nOworICBpbW11dGFibGUgdWJ5dGVbMV0gQVJSQVlfQkVHSU4gPSAnWyc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBBUlJBWV9FTkQgPSAnXSc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBORVdMSU5FID0gJ1xuJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIFBBSVJfU0VQID0gJzonOworICBpbW11dGFibGUgdWJ5dGVbMV0gRUxFTV9TRVAgPSAnLCc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBCQUNLU0xBU0ggPSAnXFwnOworICBpbW11dGFibGUgdWJ5dGVbMV0gU1RSSU5HX0RFTElNSVRFUiA9ICciJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIFpFUk9fQ0hBUiA9ICcwJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEVTQ0FQRV9DSEFSID0gJ3UnOworICBpbW11dGFibGUgdWJ5dGVbNF0gRVNDQVBFX1BSRUZJWCA9IGNhc3QodWJ5dGVbNF0pciJcdTAwIjsKKworICBlbnVtIFRIUklGVF9KU09OX1ZFUlNJT04gPSAxOworCisgIGltbXV0YWJsZSBOQU5fU1RSSU5HID0gIk5hTiI7CisgIGltbXV0YWJsZSBJTkZJTklUWV9TVFJJTkcgPSAiSW5maW5pdHkiOworICBpbW11dGFibGUgTkVHX0lORklOSVRZX1NUUklORyA9ICItSW5maW5pdHkiOworCisgIHN0cmluZyBnZXROYW1lRnJvbVRUeXBlKFRUeXBlIHR5cGVJRCkgeworICAgIGZpbmFsIHN3aXRjaCAodHlwZUlEKSB7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHJldHVybiAidGYiOworICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICByZXR1cm4gImk4IjsKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICByZXR1cm4gImkxNiI7CisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcmV0dXJuICJpMzIiOworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHJldHVybiAiaTY0IjsKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gImRibCI7CisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcmV0dXJuICJzdHIiOworICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIHJldHVybiAicmVjIjsKKyAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICByZXR1cm4gIm1hcCI7CisgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgIHJldHVybiAibHN0IjsKKyAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICByZXR1cm4gInNldCI7CisgICAgICBjYXNlIFRUeXBlLlNUT1A6IGdvdG8gY2FzZTsKKyAgICAgIGNhc2UgVFR5cGUuVk9JRDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlLCAiSW52YWxpZCB0eXBlIHBhc3NlZC4iKTsKKyAgICB9CisgIH0KKworICBUVHlwZSBnZXRUVHlwZUZyb21OYW1lKHN0cmluZyBuYW1lKSB7CisgICAgVFR5cGUgcmVzdWx0OworICAgIGlmIChuYW1lLmxlbmd0aCA+IDEpIHsKKyAgICAgIHN3aXRjaCAobmFtZVswXSkgeworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5ET1VCTEU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgIHN3aXRjaCAobmFtZVsxXSkgeworICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJZVEU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTMyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JNjQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkxJU1Q7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1BUDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSVUNUOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICBpZiAobmFtZVsxXSA9PSAndCcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNUUklORzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNFVDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJPT0w7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBUVHlwZS5TVE9QKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaGFuZGxpbmcgZm9yIHRoZSBmaXJzdCAweDMwIGNoYXJhY3RlcnMKKyAgLy8gIDAgOiBlc2NhcGUgdXNpbmcgIlx1MDB4eCIgbm90YXRpb24KKyAgLy8gIDEgOiBqdXN0IG91dHB1dCBpbmRleAorICAvLyA8b3RoZXI+IDogZXNjYXBlIHVzaW5nICJcPG90aGVyPiIgbm90YXRpb24KKyAgaW1tdXRhYmxlIHVieXRlWzB4MzBdIGtKc29uQ2hhclRhYmxlID0gWworICAvLyAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgorICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsJ2InLCd0JywnbicsICAwLCdmJywncicsICAwLCAgMCwgLy8gMAorICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLy8gMQorICAgICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgorICBdOworCisgIC8vIFRoaXMgc3RyaW5nJ3MgY2hhcmFjdGVycyBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVsZW1lbnRzIGluIGtFc2NhcGVDaGFyVmFscy4KKyAgLy8gSSBkb24ndCBoYXZlICcvJyBvbiB0aGlzIGxpc3QgZXZlbiB0aG91Z2ggaXQgYXBwZWFycyBvbiB3d3cuanNvbi5vcmcgLS0KKyAgLy8gaXQgaXMgbm90IGluIHRoZSBSRkMKKyAgaW1tdXRhYmxlIGtFc2NhcGVDaGFycyA9IGNhc3QodWJ5dGVbN10pIGAiXFxiZm5ydGA7CisKKyAgLy8gVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCisgIC8vIGtFc2NhcGVDaGFycworICBpbW11dGFibGUgdWJ5dGVbN10ga0VzY2FwZUNoYXJWYWxzID0gWworICAgICciJywgJ1xcJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKKyAgXTsKKworICAvLyBSZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgb2YgYSBoZXggY2hhcmFjdGVyIGNoLgorICAvLyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBbMC05YS1mXS4KKyAgdWJ5dGUgaGV4VmFsKHVieXRlIGNoKSB7CisgICAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7CisgICAgICByZXR1cm4gY2FzdCh1Ynl0ZSkoY2ggLSAnMCcpOworICAgIH0gZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKKyAgICAgIHJldHVybiBjYXN0KHVieXRlKShjaCAtICdhJyArIDEwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBoZXggdmFsIChbMC05YS1mXSksIGdvdCAnIiB+CisgICAgICAgIGNoIH4gIicuIiwgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICB9CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGhleCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHRoZSBpbnRlZ2VyIHZhbC4gVGhlIHZhbHVlIGlzIG1hc2tlZAorICAvLyB0byBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UuCisgIHVieXRlIGhleENoYXIodWJ5dGUgdmFsKSB7CisgICAgdmFsICY9IDB4MEY7CisgICAgaWYgKHZhbCA8IDEwKSB7CisgICAgICByZXR1cm4gY2FzdCh1Ynl0ZSkodmFsICsgJzAnKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNhc3QodWJ5dGUpKHZhbCAtIDEwICsgJ2EnKTsKKyAgICB9CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGNoIGlzIGluIFstKzAtOS5FZV07IGZhbHNlIG90aGVyd2lzZQorICBib29sIGlzSnNvbk51bWVyaWModWJ5dGUgY2gpIHsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlICcrJzoKKyAgICAgIGNhc2UgJy0nOgorICAgICAgY2FzZSAnLic6CisgICAgICBjYXNlICcwJzoKKyAgICAgIGNhc2UgJzEnOgorICAgICAgY2FzZSAnMic6CisgICAgICBjYXNlICczJzoKKyAgICAgIGNhc2UgJzQnOgorICAgICAgY2FzZSAnNSc6CisgICAgICBjYXNlICc2JzoKKyAgICAgIGNhc2UgJzcnOgorICAgICAgY2FzZSAnOCc6CisgICAgICBjYXNlICc5JzoKKyAgICAgIGNhc2UgJ0UnOgorICAgICAgY2FzZSAnZSc6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9wcm9jZXNzb3IuZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvcHJvY2Vzc29yLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NDIxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvcHJvY2Vzc29yLmQKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworCisvLyBVc2Ugc2VsZWN0aXZlIGltcG9ydCBvbmNlIERNRCBAQEJVRzMxNEBAIGlzIGZpeGVkLgoraW1wb3J0IHN0ZC52YXJpYW50IC8rIDogVmFyaWFudCArLzsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogQSBwcm9jZXNzb3IgaXMgYSBnZW5lcmljIG9iamVjdCB3aGljaCBvcGVyYXRlcyB1cG9uIGFuIGlucHV0IHN0cmVhbSBhbmQKKyAqIHdyaXRlcyB0byBzb21lIG91dHB1dCBzdHJlYW0uCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgdGhpcyBvYmplY3QgaXMgbG9vc2UsIHRob3VnaCB0aGUgdHlwaWNhbCBjYXNlIGlzIGZvciBzb21lCisgKiBzb3J0IG9mIHNlcnZlciB0aGF0IGVpdGhlciBnZW5lcmF0ZXMgcmVzcG9uc2VzIHRvIGFuIGlucHV0IHN0cmVhbSBvcgorICogZm9yd2FyZHMgZGF0YSBmcm9tIG9uZSBwaXBlIG9udG8gYW5vdGhlci4KKyAqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gb3B0aW9uYWxseSBhbGxvdyBvbmUgb3IgbW9yZSBUUHJvY2Vzc29yRXZlbnRIYW5kbGVycworICogdG8gYmUgYXR0YWNoZWQsIHByb3ZpZGluZyBhbiBpbnRlcmZhY2UgdG8gaG9vayBjdXN0b20gY29kZSBpbnRvIHRoZQorICogaGFuZGxpbmcgcHJvY2Vzcywgd2hpY2ggY2FuIGJlIHVzZWQgZS5nLiBmb3IgZ2F0aGVyaW5nIHN0YXRpc3RpY3MuCisgKi8KK2ludGVyZmFjZSBUUHJvY2Vzc29yIHsKKyAgLy8vCisgIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwKKyAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0ID0gVmFyaWFudCgpCisgICkgaW4geworICAgIGFzc2VydChpcHJvdCk7CisgICAgYXNzZXJ0KG9wcm90KTsKKyAgfQorCisgIC8vLworICBmaW5hbCBib29sIHByb2Nlc3MoVFByb3RvY29sIHByb3QsIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQgPSBWYXJpYW50KCkpIHsKKyAgICByZXR1cm4gcHJvY2Vzcyhwcm90LCBwcm90LCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KK30KKworLyoqCisgKiBIYW5kbGVzIGV2ZW50cyBmcm9tIGEgcHJvY2Vzc29yLgorICovCitpbnRlcmZhY2UgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIGNhbGxpbmcgb3RoZXIgY2FsbGJhY2sgbWV0aG9kcy4KKyAgICoKKyAgICogRXhwZWN0ZWQgdG8gcmV0dXJuIHNvbWUgc29ydCBvZiDCu2NhbGwgY29udGV4dMKrLCB3aGljaCBpcyBwYXNzZWQgdG8gYWxsCisgICAqIG90aGVyIGNhbGxiYWNrcyBmb3IgdGhhdCBmdW5jdGlvbiBpbnZvY2F0aW9uLgorICAgKi8KKyAgVmFyaWFudCBjcmVhdGVDb250ZXh0KHN0cmluZyBtZXRob2ROYW1lLCBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0KTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gaGFuZGxpbmcgdGhlIG1ldGhvZCBhc3NvY2lhdGVkIHdpdGggYSBjb250ZXh0IGhhcyBiZWVuCisgICAqIGZpbmlzaGVkIOKAkyBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGNsZWFuIHVwIHdvcmsuCisgICAqLworICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHJlYWRpbmcgYXJndW1lbnRzLgorICAgKi8KKyAgdm9pZCBwcmVSZWFkKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIGJldHdlZW4gcmVhZGluZyBhcmd1bWVudHMgYW5kIGNhbGxpbmcgdGhlIGhhbmRsZXIuCisgICAqLworICB2b2lkIHBvc3RSZWFkKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIGJldHdlZW4gY2FsbGluZyB0aGUgaGFuZGxlciBhbmQgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAqLworICB2b2lkIHByZVdyaXRlKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgKi8KKyAgdm9pZCBwb3N0V3JpdGUoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBoYW5kbGluZyBhIG9uZS13YXkgZnVuY3Rpb24gY2FsbCBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgKi8KKyAgdm9pZCBvbmV3YXlDb21wbGV0ZShWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24uCisgICAqLworICB2b2lkIGhhbmRsZXJFcnJvcihWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSwgRXhjZXB0aW9uIGUpOworfQorCitzdHJ1Y3QgVENvbm5lY3Rpb25JbmZvIHsKKyAgLy8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scy4KKyAgVFByb3RvY29sIGlucHV0OworICBUUHJvdG9jb2wgb3V0cHV0OyAvLy8gRGl0dG8uCisKKyAgLy8vIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgY29ubmVjdGlvbgorICAvLy8gVGhpcyBpcyB0aGUgdHJhbnNwb3J0IHRoYXQgd2FzIHJldHVybmVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCksCisgIC8vLyBhbmQgaXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3BvcnQgcG9pbnRlZCB0byBieSB0aGUgaW5wdXQgYW5kCisgIC8vLyBvdXRwdXQgcHJvdG9jb2xzLgorICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKK30KKworaW50ZXJmYWNlIFRQcm9jZXNzb3JGYWN0b3J5IHsKKyAgLyoqCisgICAqIEdldCB0aGUgVFByb2Nlc3NvciB0byB1c2UgZm9yIGEgcGFydGljdWxhciBjb25uZWN0aW9uLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgaW52b2tlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMKKyAgICogYWNjZXB0ZWQgb24sIHdoaWNoIGlzIGFsd2F5cyB0aGUgc2FtZSB0aHJlYWQgZm9yIGFsbCBjdXJyZW50IHNlcnZlcgorICAgKiBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworICBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcihyZWYgY29uc3QoVENvbm5lY3Rpb25JbmZvKSBjb25uSW5mbyk7Cit9CisKKy8qKgorICogVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGZhY3Rvcnkgd2hpY2ggYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgaW5zdGFuY2UuCisgKi8KK2NsYXNzIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5IDogVFByb2Nlc3NvckZhY3RvcnkgeworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHByb2Nlc3NvciA9IFRoZSBwcm9jZXNzb3Igb2JqZWN0IHRvIHJldHVybiBmcm9tIGdldFByb2Nlc3NvcigpLgorICAgKi8KKyAgdGhpcyhUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgIH0KKworICBvdmVycmlkZSBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcihyZWYgY29uc3QoVENvbm5lY3Rpb25JbmZvKSBjb25uSW5mbykgeworICAgIHJldHVybiBwcm9jZXNzb3JfOworICB9CisKK3ByaXZhdGU6CisgIFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNiMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci5iYXNlOworCitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBzZXJ2ZXJzLgorICoKKyAqIEJ5IHNldHRpbmcgdGhlIGV2ZW50SGFuZGxlciBwcm9wZXJ0eSB0byBhIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAqIGltcGxlbWVudGF0aW9uLCBjdXN0b20gY29kZSBjYW4gYmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lLAorICogd2hpY2ggY2FuIGJlIHVzZWQgZS5nLiBmb3IgZ2F0aGVyaW5nIHN0YXRpc3RpY3MuCisgKi8KK2NsYXNzIFRTZXJ2ZXIgeworICAvKioKKyAgICogU3RhcnRzIHNlcnZpbmcuCisgICAqCisgICAqIEJsb2NrcyB1bnRpbCB0aGUgc2VydmVyIGZpbmlzaGVzLCBpLmUuIGEgc2VyaW91cyBwcm9ibGVtIG9jY3VycmVkIG9yIHRoZQorICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiB0cmlnZ2VyZWQuCisgICAqCisgICAqIFNlcnZlciBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGltcGxlbWVudCBjYW5jZWxsYXRpb24gaW4gYSBiZXN0LQorICAgKiBlZmZvcnQgd2F5IOKAkyB1c3VhbGx5LCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaW1tZWRpYXRlbHkgc3RvcCBhY2NlcHRpbmcKKyAgICogY29ubmVjdGlvbnMgYW5kIHJldHVybiBhZnRlciBhbGwgY3VycmVudGx5IGFjdGl2ZSBjbGllbnRzIGhhdmUgYmVlbgorICAgKiBwcm9jZXNzZWQsIGJ1dCB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgY2FzZSBmb3IgZXZlcnkgY29uY2VpdmFibGUKKyAgICogaW1wbGVtZW50YXRpb24uCisgICAqLworICBhYnN0cmFjdCB2b2lkIHNlcnZlKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCk7CisKKyAgLy8vIFRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlciB0byBub3RpZnkuIE51bGwgYnkgZGVmYXVsdC4KKyAgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7CisKK3Byb3RlY3RlZDoKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICAgIGltcG9ydCB0aHJpZnQuYmFzZTsKKyAgICBlbmZvcmNlKGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG5ldyBURXhjZXB0aW9uKCJJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsLiIpKTsKKyAgICBlbmZvcmNlKG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBuZXcgVEV4Y2VwdGlvbigiT3V0cHV0IHRyYW5zcG9ydCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworICAgIGVuZm9yY2UoaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBuZXcgVEV4Y2VwdGlvbigiSW5wdXQgcHJvdG9jb2wgZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsLiIpKTsKKyAgICBlbmZvcmNlKG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIG5ldyBURXhjZXB0aW9uKCJPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsLiIpKTsKKworICAgIHByb2Nlc3NvckZhY3RvcnlfID0gcHJvY2Vzc29yRmFjdG9yeTsKKyAgICBzZXJ2ZXJUcmFuc3BvcnRfID0gc2VydmVyVHJhbnNwb3J0OworICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgIH0KKworICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5XzsKKyAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnRfOworICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKworcHVibGljOgorCisgIEBwcm9wZXJ0eSBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCgpCisgIHsKKyAgICByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICB9Cit9CisKKy8qKgorICogSGFuZGxlcyBldmVudHMgZnJvbSBhIFRTZXJ2ZXIgY29yZS4KKyAqLworaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cyBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCisgICAqLworICB2b2lkIHByZVNlcnZlKCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBwcm9jZXNzaW5nIGlzIGFib3V0IHRvIGJlZ2luLgorICAgKi8KKyAgVmFyaWFudCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHJlcXVlc3QgaGFuZGxpbmcgZm9yIGEgY2xpZW50IGhhcyBiZWVuIGZpbmlzaGVkIOKAkyBjYW4gYmUgdXNlZAorICAgKiB0byBwZXJmb3JtIGNsZWFuIHVwIHdvcmsuCisgICAqLworICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiB0aGUgcHJvY2Vzc29yIGZvciBhIGNsaWVudCBjYWxsIGlzIGFib3V0IHRvIGJlIGludm9rZWQuCisgICAqLworICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODYwYzBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZApAQCAtMCwwICsxLDEzOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBBIG5vbi1ibG9ja2luZyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBvcGVyYXRlcyBhIHNldCBvZiBJL08gdGhyZWFkcyAoYnkKKyAqIGRlZmF1bHQgb25seSBvbmUpIGFuZCBlaXRoZXIgZG9lcyBwcm9jZXNzaW5nIMK7aW4tbGluZcKrIG9yIG9mZi1sb2FkcyBpdCB0byBhCisgKiB0YXNrIHBvb2wuCisgKgorICogSXQgKnJlcXVpcmVzKiBURnJhbWVkVHJhbnNwb3J0IHRvIGJlIHVzZWQgb24gdGhlIGNsaWVudCBzaWRlLCBhcyBpdCBleHBlY3RzCisgKiBhIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZCB3cml0ZXMgb3V0IHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBmcmFtaW5nLgorICoKKyAqIEJlY2F1c2UgSS9PIGlzIGRvbmUgYXN5bmNocm9ub3VzL2V2ZW50IGJhc2VkLCB1bmZvcnR1bmF0ZWx5CisgKiBUU2VydmVyVHJhbnNwb3J0IGNhbid0IGJlIHVzZWQuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgQysrIG9uZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHJlcXVlc3QKKyAqIHRpbWVvdXRzIGFuZCB0aGUgZHJhaW4gdGFzayBxdWV1ZSBvdmVybG9hZCBoYW5kbGluZyBzdHJhdGVneSBub3QgYmVpbmcKKyAqIGltcGxlbWVudGVkIHlldC4KKyAqLworLy8gVGhpcyByZWFsbHkgc2hvdWxkIHVzZSBhIEQgbm9uLWJsb2NraW5nIEkvTyBsaWJyYXJ5LCBvbmNlIG9uZSBiZWNvbWVzCisvLyBhdmFpbGFibGUuCittb2R1bGUgdGhyaWZ0LnNlcnZlci5ub25ibG9ja2luZzsKKworaW1wb3J0IGNvcmUuYXRvbWljIDogYXRvbWljTG9hZCwgYXRvbWljU3RvcmUsIGF0b21pY09wOworaW1wb3J0IGNvcmUuZXhjZXB0aW9uIDogb25PdXRPZk1lbW9yeUVycm9yOworaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWIgOiBmcmVlLCByZWFsbG9jOworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQsIFRocmVhZEdyb3VwOworaW1wb3J0IGRlaW1vcy5ldmVudDIuZXZlbnQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiBlbXBsYWNlLCB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc20gOiBUYXNrUG9vbCwgdGFzazsKK2ltcG9ydCBzdGQuc29ja2V0IDogU29ja2V0LCBzb2NrZXRQYWlyLCBTb2NrZXRBY2NlcHRFeGNlcHRpb24sCisgIFNvY2tldEV4Y2VwdGlvbiwgVGNwU29ja2V0OworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuZW5kaWFuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRyYWl0czsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogUG9zc2libGUgYWN0aW9ucyB0YWtlbiBvbiBuZXcgaW5jb21pbmcgY29ubmVjdGlvbnMgd2hlbiB0aGUgc2VydmVyIGlzCisgKiBvdmVybG9hZGVkLgorICovCitlbnVtIFRPdmVybG9hZEFjdGlvbiB7CisgIC8vLyBEbyBub3QgdGFrZSBhbnkgc3BlY2lhbCBhY3Rpb25zIHdoaWxlIHRoZSBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCwganVzdAorICAvLy8gY29udGludWUgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLgorICBOT05FLAorCisgIC8vLyBJbW1lZGlhdGVseSBkcm9wIG5ldyBjb25uZWN0aW9ucyBhZnRlciB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZCBpZiB0aGUKKyAgLy8vIHNlcnZlciBpcyBvdmVybG9hZGVkLgorICBDTE9TRV9PTl9BQ0NFUFQKK30KKworLy8vCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgOiBUU2VydmVyIHsKKyAgLy8vCisgIHRoaXMoVFByb2Nlc3NvciBwcm9jZXNzb3IsIHVzaG9ydCBwb3J0LCBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0YXNrUG9vbCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LCB1c2hvcnQgcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIHVzaG9ydCBwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHBvcnQsCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCB0YXNrUG9vbCk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIHVzaG9ydCBwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIG51bGwsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICAgIHBvcnRfID0gcG9ydDsKKworICAgIHRoaXMudGFza1Bvb2wgPSB0YXNrUG9vbDsKKworICAgIGNvbm5lY3Rpb25NdXRleF8gPSBuZXcgTXV0ZXg7CisKKyAgICBjb25uZWN0aW9uU3RhY2tMaW1pdCA9IERFRkFVTFRfQ09OTkVDVElPTl9TVEFDS19MSU1JVDsKKyAgICBtYXhBY3RpdmVQcm9jZXNzb3JzID0gREVGQVVMVF9NQVhfQUNUSVZFX1BST0NFU1NPUlM7CisgICAgbWF4Q29ubmVjdGlvbnMgPSBERUZBVUxUX01BWF9DT05ORUNUSU9OUzsKKyAgICBvdmVybG9hZEh5c3RlcmVzaXMgPSBERUZBVUxUX09WRVJMT0FEX0hZU1RFUkVTSVM7CisgICAgb3ZlcmxvYWRBY3Rpb24gPSBERUZBVUxUX09WRVJMT0FEX0FDVElPTjsKKyAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplID0gREVGQVVMVF9XUklURV9CVUZGRVJfREVGQVVMVF9TSVpFOworICAgIGlkbGVSZWFkQnVmZmVyTGltaXQgPSBERUZBVUxUX0lETEVfUkVBRF9CVUZGRVJfTElNSVQ7CisgICAgaWRsZVdyaXRlQnVmZmVyTGltaXQgPSBERUZBVUxUX0lETEVfV1JJVEVfQlVGRkVSX0xJTUlUOworICAgIHJlc2l6ZUJ1ZmZlckV2ZXJ5TiA9IERFRkFVTFRfUkVTSVpFX0JVRkZFUl9FVkVSWV9OOworICAgIG1heEZyYW1lU2l6ZSA9IERFRkFVTFRfTUFYX0ZSQU1FX1NJWkU7CisgICAgbnVtSU9UaHJlYWRzXyA9IERFRkFVTFRfTlVNX0lPX1RIUkVBRFM7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHNlcnZlKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgeworICAgIGlmIChjYW5jZWxsYXRpb24gJiYgY2FuY2VsbGF0aW9uLnRyaWdnZXJlZCkgcmV0dXJuOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKyAgICAvLyBUT0RPOiBTT19LRUVQQUxJVkUsIFRDUF9MT1dfTUlOX1JUTywgZXRjLgorICAgIGxpc3RlblNvY2tldF8gPSBtYWtlU29ja2V0QW5kTGlzdGVuKHBvcnRfLCBUU2VydmVyU29ja2V0LkFDQ0VQVF9CQUNLTE9HLAorICAgICAgQklORF9SRVRSWV9MSU1JVCwgQklORF9SRVRSWV9ERUxBWSwgMCwgMCwgaXB2Nk9ubHlfKTsKKyAgICBsaXN0ZW5Tb2NrZXRfLmJsb2NraW5nID0gZmFsc2U7CisKKyAgICBsb2dJbmZvKCJVc2luZyAlcyBJL08gdGhyZWFkKHMpLiIsIG51bUlPVGhyZWFkc18pOworICAgIGlmICh0YXNrUG9vbF8pIHsKKyAgICAgIGxvZ0luZm8oIlVzaW5nIHRhc2sgcG9vbCB3aXRoIHNpemU6ICVzLiIsIG51bUlPVGhyZWFkc18sIHRhc2tQb29sXy5zaXplKTsKKyAgICB9CisKKyAgICBhc3NlcnQobnVtSU9UaHJlYWRzXyA+IDApOworICAgIGFzc2VydChpb0xvb3BzXy5lbXB0eSk7CisgICAgZm9yZWFjaCAoaWQ7IDAgLi4gbnVtSU9UaHJlYWRzXykgeworICAgICAgLy8gVGhlIElPIGxvb3Agb24gdGhlIGZpcnN0IElPIHRocmVhZCAodGhpcyB0aHJlYWQsIGkuZS4gdGhlIG9uZSBzZXJ2ZSgpCisgICAgICAvLyBpcyBjYWxsZWQgZnJvbSkgYWxzbyBhY2NlcHRzIG5ldyBjb25uZWN0aW9ucy4KKyAgICAgIGF1dG8gbGlzdGVuU29ja2V0ID0gKGlkID09IDAgPyBsaXN0ZW5Tb2NrZXRfIDogbnVsbCk7CisgICAgICBpb0xvb3BzXyB+PSBuZXcgSU9Mb29wKHRoaXMsIGxpc3RlblNvY2tldCk7CisgICAgfQorCisgICAgaWYgKGNhbmNlbGxhdGlvbikgeworICAgICAgY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcuYWRkQ2FsbGJhY2soeworICAgICAgICBmb3JlYWNoIChpLCBsb29wOyBpb0xvb3BzXykgbG9vcC5zdG9wKCk7CisKKyAgICAgICAgLy8gU3RvcCBhY2NlcHRpbmcgbmV3IGNvbm5lY3Rpb25zIHJpZ2h0IGF3YXkuCisgICAgICAgIGxpc3RlblNvY2tldF8uY2xvc2UoKTsKKyAgICAgICAgbGlzdGVuU29ja2V0XyA9IG51bGw7CisgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGUgSU8gaGVscGVyIHRocmVhZHMgZm9yIGFsbCBidXQgdGhlIGZpcnN0IGxvb3AsIHdoaWNoIHdlIHdpbGwgcnVuCisgICAgLy8gb3Vyc2VsdmVzLiBOb3RlIHRoYXQgdGhlIHRocmVhZHMgcnVuIGZvcmV2ZXIsIG9ubHkgdGVybWluYXRpbmcgaWYgc3RvcCgpCisgICAgLy8gaXMgY2FsbGVkLgorICAgIGF1dG8gdGhyZWFkcyA9IG5ldyBUaHJlYWRHcm91cCgpOworICAgIGZvcmVhY2ggKGxvb3A7IGlvTG9vcHNfWzEgLi4gJF0pIHsKKyAgICAgIGF1dG8gdCA9IG5ldyBUaHJlYWQoJmxvb3AucnVuKTsKKyAgICAgIHRocmVhZHMuYWRkKHQpOworICAgICAgdC5zdGFydCgpOworICAgIH0KKworICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgLy8gUnVuIHRoZSBwcmltYXJ5IChsaXN0ZW5lcikgSU8gdGhyZWFkIGxvb3AgaW4gb3VyIG1haW4gdGhyZWFkOyB0aGlzIHdpbGwKKyAgICAvLyBibG9jayB1bnRpbCB0aGUgc2VydmVyIGlzIHNodXR0aW5nIGRvd24uCisgICAgaW9Mb29wc19bMF0ucnVuKCk7CisKKyAgICAvLyBFbnN1cmUgYWxsIHRocmVhZHMgYXJlIGZpbmlzaGVkIGJlZm9yZSBsZWF2aW5nIHNlcnZlKCkuCisgICAgdGhyZWFkcy5qb2luQWxsKCk7CisKKyAgICBpb0xvb3BzXyA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBhY3RpdmUgY29ubmVjdGlvbnMsIGkuZS4gb3BlbiBzb2NrZXRzLgorICAgKi8KKyAgc2l6ZV90IG51bUNvbm5lY3Rpb25zKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbnVtQ29ubmVjdGlvbnNfOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb25uZWN0aW9uIG9iamVjdHMgYWxsb2NhdGVkLCBidXQgbm90IGluIHVzZS4KKyAgICovCisgIHNpemVfdCBudW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBjb25uZWN0aW9uU3RhY2tfLmxlbmd0aDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gY291bnQgb2YgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgICoKKyAgICogVGhpcyBpcyBkZWZpbmVkIGFzIGEgY29ubmVjdGlvbiB3aGVyZSBhbGwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgYW5kIHRoZQorICAgKiBwcm9jZXNzb3Igd2FzIGludm9rZWQgYnV0IGhhcyBub3QgeWV0IGNvbXBsZXRlZC4KKyAgICovCisgIHNpemVfdCBudW1BY3RpdmVQcm9jZXNzb3JzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbnVtQWN0aXZlUHJvY2Vzc29yc187CisgIH0KKworICAvLy8gTnVtYmVyIG9mIGJpbmQoKSByZXRyaWVzLgorICBlbnVtIEJJTkRfUkVUUllfTElNSVQgPSAwOworCisgIC8vLyBEdXJhdGlvbiBiZXR3ZWVuIGJpbmQoKSByZXRyaWVzLgorICBlbnVtIEJJTkRfUkVUUllfREVMQVkgPSBkdXIhImhuc2VjcyIoMCk7CisKKyAgLy8vIFdoZXRoZXIgdG8gbGlzdGVuIG9uIElQdjYgb25seSwgaWYgSVB2NiBzdXBwb3J0IGlzIGRldGVjdGVkCisgIC8vIChkZWZhdWx0OiBmYWxzZSkuCisgIHZvaWQgaXB2Nk9ubHkoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpcHY2T25seV8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgdGFzayBwb29sIHRvIHVzZSBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cy4gSWYgbnVsbCwgbm8gYWRkaXRpb25hbAorICAgKiB0aHJlYWRzIGFyZSB1c2VkIGFuZCByZXF1ZXN0IGFyZSBwcm9jZXNzZWQgwrtpbmxpbmXCqy4KKyAgICoKKyAgICogQ2FuIHNhZmVseSBiZSBzZXQgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLgorICAgKi8KKyAgVGFza1Bvb2wgdGFza1Bvb2woKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0YXNrUG9vbF87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCB0YXNrUG9vbChUYXNrUG9vbCBwb29sKSBAcHJvcGVydHkgeworICAgIHRhc2tQb29sXyA9IHBvb2w7CisgIH0KKworICAvKioKKyAgICogSHlzdGVyZXNpcyBmb3Igb3ZlcmxvYWQgc3RhdGUuCisgICAqCisgICAqIFRoaXMgaXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBvdmVybG9hZCB2YWx1ZSB0aGF0IG5lZWRzIHRvIGJlIHJlYWNoZWQKKyAgICogYmVmb3JlIHRoZSBvdmVybG9hZCBzdGF0ZSBpcyBjbGVhcmVkLiBJdCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSwKKyAgICogcHJhY3RpY2FsIGNob2ljZXMgcHJvYmFibHkgbGllIGJldHdlZW4gMC41IGFuZCAwLjkuCisgICAqLworICBkb3VibGUgb3ZlcmxvYWRIeXN0ZXJlc2lzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIG92ZXJsb2FkSHlzdGVyZXNpcyhkb3VibGUgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSgwIDwgdmFsdWUgJiYgdmFsdWUgPD0gMSwKKyAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvdmVybG9hZCBoeXN0ZXJlc2lzOiAiIH4gdG8hc3RyaW5nKHZhbHVlKSk7CisgICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXyA9IHZhbHVlOworICB9CisKKyAgLy8vIERpdHRvCisgIGVudW0gREVGQVVMVF9PVkVSTE9BRF9IWVNURVJFU0lTID0gMC44OworCisgIC8qKgorICAgKiBUaGUgYWN0aW9uIHdoaWNoIHdpbGwgYmUgdGFrZW4gb24gb3ZlcmxvYWQuCisgICAqLworICBUT3ZlcmxvYWRBY3Rpb24gb3ZlcmxvYWRBY3Rpb247CisKKyAgLy8vIERpdHRvCisgIGVudW0gREVGQVVMVF9PVkVSTE9BRF9BQ1RJT04gPSBUT3ZlcmxvYWRBY3Rpb24uTk9ORTsKKworICAvKioKKyAgICogVGhlIHdyaXRlIGJ1ZmZlciBpcyBpbml0aWFsaXplZCAoYW5kIHdoZW4gaWRsZVdyaXRlQnVmZmVyTGltaXRfIGlzIGNoZWNrZWQKKyAgICogYW5kIGZvdW5kIHRvIGJlIGV4Y2VlZGVkLCByZWluaXRpYWxpemVkKSB0byB0aGlzIHNpemUuCisgICAqLworICBzaXplX3Qgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZTsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9XUklURV9CVUZGRVJfREVGQVVMVF9TSVpFID0gMTAyNDsKKworICAvKioKKyAgICogTWF4IHJlYWQgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgQ29ubmVjdGlvbi4gV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCisgICAqIENvbm5lY3Rpb24gaW50byBjb25uZWN0aW9uU3RhY2tfIG9yIG9uIGV2ZXJ5IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gY2FsbHMsCisgICAqIHdlIHdpbGwgZnJlZSB0aGUgYnVmZmVyIChzdWNoIHRoYXQgaXQgd2lsbCBiZSByZWluaXRpYWxpemVkIGJ5IHRoZSBuZXh0CisgICAqIHJlY2VpdmVkIGZyYW1lKSBpZiBpdCBoYXMgZXhjZWVkZWQgdGhpcyBsaW1pdC4gMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVSZWFkQnVmZmVyTGltaXQ7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfSURMRV9SRUFEX0JVRkZFUl9MSU1JVCA9IDEwMjQ7CisKKyAgLyoqCisgICAqIE1heCB3cml0ZSBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBjb25uZWN0aW9uLiAgV2hlbiB3ZSBwbGFjZSBhbiBpZGxlCisgICAqIENvbm5lY3Rpb24gaW50byBjb25uZWN0aW9uU3RhY2tfIG9yIG9uIGV2ZXJ5IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gY2FsbHMsCisgICAqIHdlIGVuc3VyZSB0aGF0IGl0cyB3cml0ZSBidWZmZXIgaXMgPD0gdG8gdGhpcyBzaXplOyBvdGhlcndpc2Ugd2UKKyAgICogcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZSBvZiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyBieXRlcyB0byBlbnN1cmUgdGhhdAorICAgKiBpZGxlIGNvbm5lY3Rpb25zIGRvbid0IGhvZyBtZW1vcnkuIDAgZGlzYWJsZXMgdGhpcyBjaGVjay4KKyAgICovCisgIHNpemVfdCBpZGxlV3JpdGVCdWZmZXJMaW1pdDsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9JRExFX1dSSVRFX0JVRkZFUl9MSU1JVCA9IDEwMjQ7CisKKyAgLyoqCisgICAqIEV2ZXJ5IE4gY2FsbHMgd2UgY2hlY2sgdGhlIGJ1ZmZlciBzaXplIGxpbWl0cyBvbiBhIGNvbm5lY3RlZCBDb25uZWN0aW9uLgorICAgKiAwIGRpc2FibGVzIChpLmUuIHRoZSBjaGVja3MgYXJlIG9ubHkgZG9uZSB3aGVuIGEgY29ubmVjdGlvbiBjbG9zZXMpLgorICAgKi8KKyAgdWludCByZXNpemVCdWZmZXJFdmVyeU47CisKKyAgLy8vIERpdHRvCisgIGVudW0gdWludCBERUZBVUxUX1JFU0laRV9CVUZGRVJfRVZFUllfTiA9IDUxMjsKKworICAvLy8gTGltaXQgZm9yIGhvdyBtYW55IENvbm5lY3Rpb24gb2JqZWN0cyB0byBjYWNoZS4KKyAgc2l6ZV90IGNvbm5lY3Rpb25TdGFja0xpbWl0OworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX0NPTk5FQ1RJT05fU1RBQ0tfTElNSVQgPSAxMDI0OworCisgIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbnMgYmVmb3JlIHNlcnZlciBnb2VzIGludG8gb3ZlcmxvYWQKKyAgLy8vIHN0YXRlLgorICBzaXplX3QgbWF4Q29ubmVjdGlvbnM7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfTUFYX0NPTk5FQ1RJT05TID0gaW50Lm1heDsKKworICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBjb25uZWN0aW9ucyBwcm9jZXNzaW5nIG9yIHdhaXRpbmcgdG8gcHJvY2VzcworICBzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29yczsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9NQVhfQUNUSVZFX1BST0NFU1NPUlMgPSBpbnQubWF4OworCisgIC8vLyBNYXhpbXVtIGZyYW1lIHNpemUsIGluIGJ5dGVzLgorICAvLy8KKyAgLy8vIElmIGEgY2xpZW50IHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIGxhcmdlciB0aGFuIHRoaXMgbGltaXQsIGl0cworICAvLy8gY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZC4gVGhpcyBoZWxwcyB0byBhdm9pZCBhbGxvY2F0aW5nIGh1Z2UgYnVmZmVycworICAvLy8gb24gYm9nb3VzIGlucHV0LgorICB1aW50IG1heEZyYW1lU2l6ZTsKKworICAvLy8gRGl0dG8KKyAgZW51bSB1aW50IERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworCisgIHNpemVfdCBudW1JT1RocmVhZHMoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBudW1JT1RocmVhZHNfOworICB9CisKKyAgdm9pZCBudW1JT1RocmVhZHMoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UodmFsdWUgPj0gMSwgbmV3IFRFeGNlcHRpb24oIk11c3QgdXNlIGF0IGxlYXN0IG9uZSBJL08gdGhyZWFkLiIpKTsKKyAgICBudW1JT1RocmVhZHNfID0gdmFsdWU7CisgIH0KKworICBlbnVtIERFRkFVTFRfTlVNX0lPX1RIUkVBRFMgPSAxOworCitwcml2YXRlOgorICAvKioKKyAgICogQyBjYWxsYmFjayB3cmFwcGVyIGFyb3VuZCBhY2NlcHRDb25uZWN0aW9ucygpLiBFeHBlY3RzIHRoZSBjdXN0b20gYXJndW1lbnQKKyAgICogdG8gYmUgdGhlIHRoaXMgcG9pbnRlciBvZiB0aGUgYXNzb2NpYXRlZCBzZXJ2ZXIgaW5zdGFuY2UuCisgICAqLworICBleHRlcm4oQykgc3RhdGljIHZvaWQgYWNjZXB0Q29ubmVjdGlvbnNDYWxsYmFjayhpbnQgZmQsIHNob3J0IHdoaWNoLAorICAgIHZvaWQqIHNlcnZlclRoaXMKKyAgKSB7CisgICAgKGNhc3QoVE5vbmJsb2NraW5nU2VydmVyKXNlcnZlclRoaXMpLmFjY2VwdENvbm5lY3Rpb25zKGZkLCB3aGljaCk7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGxpYmV2ZW50IChJTyBsb29wIDAvc2VydmUoKSB0aHJlYWQgb25seSkgd2hlbiBzb21ldGhpbmcKKyAgICogaGFwcGVuZWQgb24gdGhlIGxpc3RlbmluZyBzb2NrZXQuCisgICAqLworICB2b2lkIGFjY2VwdENvbm5lY3Rpb25zKGludCBmZCwgc2hvcnQgZXZlbnRGbGFncykgeworICAgIGlmIChhdG9taWNMb2FkKGlvTG9vcHNfWzBdLnNodXR0aW5nRG93bl8pKSByZXR1cm47CisKKyAgICBhc3NlcnQoISFsaXN0ZW5Tb2NrZXRfLAorICAgICAgIlNlcnZlciBzaG91bGQgYmUgc2h1dHRpbmcgZG93biBpZiBsaXN0ZW4gc29ja2V0IGlzIG51bGwuIik7CisgICAgYXNzZXJ0KGZkID09IGxpc3RlblNvY2tldF8uaGFuZGxlKTsKKyAgICBhc3NlcnQoZXZlbnRGbGFncyAmIEVWX1JFQUQpOworCisgICAgLy8gQWNjZXB0IGFzIG1hbnkgbmV3IGNsaWVudHMgYXMgcG9zc2libGUsIGV2ZW4gdGhvdWdoIGxpYmV2ZW50IHNpZ25hbGVkCisgICAgLy8gb25seSBvbmUuIFRoaXMgaGVscHMgdGhlIG51bWJlciBvZiBjYWxscyBpbnRvIGxpYmV2ZW50IHNwYWNlLgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAvLyBJdCBpcyBsYW1lIHRvIHVzZSBleGNlcHRpb25zIGZvciByZWd1bGFyIGNvbnRyb2wgZmxvdyAoZmFpbGluZyBpcworICAgICAgLy8gZXhjZXB0ZWQgZHVlIHRvIG5vbi1ibG9ja2luZyBtb2RlIG9mIG9wZXJhdGlvbiksIGJ1dCB0aGF0J3MgdGhlCisgICAgICAvLyBpbnRlcmZhY2Ugc3RkLnNvY2tldCBvZmZlcnPigKYKKyAgICAgIFNvY2tldCBjbGllbnRTb2NrZXQ7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnRTb2NrZXQgPSBsaXN0ZW5Tb2NrZXRfLmFjY2VwdCgpOworICAgICAgfSBjYXRjaCAoU29ja2V0QWNjZXB0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGUuZXJyb3JDb2RlICE9IFdPVUxEX0JMT0NLX0VSUk5PKSB7CisgICAgICAgICAgbG9nRXJyb3IoIkVycm9yIGFjY2VwdGluZyBjb25uZWN0aW9uOiAlcyIsIGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGUgc2VydmVyIGlzIG92ZXJsb2FkZWQsIHRoaXMgaXMgdGhlIHBvaW50IHRvIHRha2UgdGhlIHNwZWNpZmllZAorICAgICAgLy8gYWN0aW9uLgorICAgICAgaWYgKG92ZXJsb2FkQWN0aW9uICE9IFRPdmVybG9hZEFjdGlvbi5OT05FICYmIGNoZWNrT3ZlcmxvYWRlZCgpKSB7CisgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKys7CisgICAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8rKzsKKyAgICAgICAgaWYgKG92ZXJsb2FkQWN0aW9uID09IFRPdmVybG9hZEFjdGlvbi5DTE9TRV9PTl9BQ0NFUFQpIHsKKyAgICAgICAgICBjbGllbnRTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50U29ja2V0LmJsb2NraW5nID0gZmFsc2U7CisgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dFcnJvcigiQ291bGRuJ3Qgc2V0IGNsaWVudCBzb2NrZXQgdG8gbm9uLWJsb2NraW5nIG1vZGU6ICVzIiwgZSk7CisgICAgICAgIGNsaWVudFNvY2tldC5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSBhIG5ldyBDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCisgICAgICBDb25uZWN0aW9uIGNvbm4gPSB2b2lkOworICAgICAgSU9Mb29wIGxvb3AgPSB2b2lkOworICAgICAgYm9vbCB0aGlzVGhyZWFkID0gdm9pZDsKKyAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdGlvbk11dGV4XykgeworICAgICAgICAvLyBBc3NpZ24gYW4gSS9PIGxvb3AgdG8gdGhlIGNvbm5lY3Rpb24gKHJvdW5kLXJvYmluKS4KKyAgICAgICAgYXNzZXJ0KG5leHRJT0xvb3BfID49IDApOworICAgICAgICBhc3NlcnQobmV4dElPTG9vcF8gPCBpb0xvb3BzXy5sZW5ndGgpOworICAgICAgICBhdXRvIHNlbGVjdGVkVGhyZWFkSWR4ID0gbmV4dElPTG9vcF87CisgICAgICAgIG5leHRJT0xvb3BfID0gKG5leHRJT0xvb3BfICsgMSkgJSBpb0xvb3BzXy5sZW5ndGg7CisKKyAgICAgICAgbG9vcCA9IGlvTG9vcHNfW3NlbGVjdGVkVGhyZWFkSWR4XTsKKyAgICAgICAgdGhpc1RocmVhZCA9IChzZWxlY3RlZFRocmVhZElkeCA9PSAwKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgY29ubmVjdGlvbiBzdGFjayB0byBzZWUgaWYgd2UgY2FuIHJlLXVzZSBhbiBleGlzdGluZyBvbmUuCisgICAgICAgIGlmIChjb25uZWN0aW9uU3RhY2tfLmVtcHR5KSB7CisgICAgICAgICAgKytudW1Db25uZWN0aW9uc187CisgICAgICAgICAgY29ubiA9IG5ldyBDb25uZWN0aW9uKGNsaWVudFNvY2tldCwgbG9vcCk7CisKKyAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gZG9lcyBub3QgZ2V0IGNvbGxlY3RlZCB3aGlsZSBpdCBpcyBhY3RpdmUsCisgICAgICAgICAgLy8gaS5lLiBob29rZWQgdXAgd2l0aCBsaWJldmVudC4KKyAgICAgICAgICBHQy5hZGRSb290KGNhc3Qodm9pZCopY29ubik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29ubiA9IGNvbm5lY3Rpb25TdGFja19bJCAtIDFdOworICAgICAgICAgIGNvbm5lY3Rpb25TdGFja18gPSBjb25uZWN0aW9uU3RhY2tfWzAgLi4gJCAtIDFdOworICAgICAgICAgIGNvbm5lY3Rpb25TdGFja18uYXNzdW1lU2FmZUFwcGVuZCgpOworICAgICAgICAgIGNvbm4uaW5pdChjbGllbnRTb2NrZXQsIGxvb3ApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxvb3AuYWRkQ29ubmVjdGlvbigpOworCisgICAgICAvLyBFaXRoZXIgbm90aWZ5IHRoZSBpb1RocmVhZCB0aGF0IGlzIGFzc2lnbmVkIHRoaXMgY29ubmVjdGlvbiB0bworICAgICAgLy8gc3RhcnQgcHJvY2Vzc2luZywgb3IgaWYgaXQgaXMgdXMsIHdlJ2xsIGp1c3QgYXNrIHRoaXMKKyAgICAgIC8vIGNvbm5lY3Rpb24gdG8gZG8gaXRzIGluaXRpYWwgc3RhdGUgY2hhbmdlIGhlcmUuCisgICAgICAvLworICAgICAgLy8gKFdlIG5lZWQgdG8gYXZvaWQgd3JpdGluZyB0byBvdXIgb3duIG5vdGlmaWNhdGlvbiBwaXBlLCB0bworICAgICAgLy8gYXZvaWQgcG9zc2libGUgZGVhZGxvY2tzIGlmIHRoZSBwaXBlIGlzIGZ1bGwuKQorICAgICAgaWYgKHRoaXNUaHJlYWQpIHsKKyAgICAgICAgY29ubi50cmFuc2l0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb29wLm5vdGlmeUNvbXBsZXRlZChjb25uKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgdm9pZCBpbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgeworICAgIGF0b21pY09wISIrPSIobnVtQWN0aXZlUHJvY2Vzc29yc18sIDEpOworICB9CisKKyAgLy8vIERlY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgIHZvaWQgZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKKyAgICBhc3NlcnQobnVtQWN0aXZlUHJvY2Vzc29yc18gPiAwKTsKKyAgICBhdG9taWNPcCEiLT0iKG51bUFjdGl2ZVByb2Nlc3NvcnNfLCAxKTsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQuCisgICAqCisgICAqIElmIHRoZSBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucyBvciDCu3Byb2Nlc3NpbmfCqyBjb25uZWN0aW9ucyBpcyBvdmVyIHRoZQorICAgKiByZXNwZWN0aXZlIGxpbWl0LCB0aGUgc2VydmVyIHdpbGwgZW50ZXIgb3ZlcmxvYWQgaGFuZGxpbmcgbW9kZSBhbmQgYQorICAgKiB3YXJuaW5nIHdpbGwgYmUgbG9nZ2VkLiBJZiBiZWxvdyB2YWx1ZXMgYXJlIGJlbG93IHRoZSBoeXN0ZXJlc2lzIGN1cnZlLAorICAgKiB0aGlzIHdpbGwgY2F1c2UgdGhlIHNlcnZlciB0byBleGl0IGl0IGFnYWluLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IG92ZXJsb2FkZWQuCisgICAqLworICBib29sIGNoZWNrT3ZlcmxvYWRlZCgpIHsKKyAgICBhdXRvIGFjdGl2ZUNvbm5lY3Rpb25zID0gbnVtQ29ubmVjdGlvbnNfIC0gY29ubmVjdGlvblN0YWNrXy5sZW5ndGg7CisgICAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gbWF4QWN0aXZlUHJvY2Vzc29ycyB8fAorICAgICAgICBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zKSB7CisgICAgICBpZiAoIW92ZXJsb2FkZWRfKSB7CisgICAgICAgIGxvZ0luZm8oIkVudGVyaW5nIG92ZXJsb2FkZWQgc3RhdGUuIik7CisgICAgICAgIG92ZXJsb2FkZWRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG92ZXJsb2FkZWRfICYmCisgICAgICAgIChudW1BY3RpdmVQcm9jZXNzb3JzXyA8PSBvdmVybG9hZEh5c3RlcmVzaXNfICogbWF4QWN0aXZlUHJvY2Vzc29ycykgJiYKKyAgICAgICAgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9ucykpCisgICAgICB7CisgICAgICAgIGxvZ0luZm8oIkV4aXRpbmcgb3ZlcmxvYWRlZCBzdGF0ZSwgJXMgY29ubmVjdGlvbihzKSBkcm9wcGVkICglIHRvdGFsKS4iLAorICAgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfLCBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKKyAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOworICAgICAgICBvdmVybG9hZGVkXyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdmVybG9hZGVkXzsKKyAgfQorCisgIC8qKgorICAgKiBNYXJrcyBhIGNvbm5lY3Rpb24gYXMgaW5hY3RpdmUgYW5kIGVpdGhlciBwdXRzIGl0IGJhY2sgaW50byB0aGUKKyAgICogY29ubmVjdGlvbiBwb29sIG9yIGxlYXZlcyBpdCBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgKi8KKyAgdm9pZCBkaXNwb3NlQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICBzeW5jaHJvbml6ZWQgKGNvbm5lY3Rpb25NdXRleF8pIHsKKyAgICAgIGlmICghY29ubmVjdGlvblN0YWNrTGltaXQgfHwKKyAgICAgICAgKGNvbm5lY3Rpb25TdGFja18ubGVuZ3RoIDwgY29ubmVjdGlvblN0YWNrTGltaXQpKQorICAgICAgeworICAgICAgICBjb25uZWN0aW9uLmNoZWNrSWRsZUJ1ZmZlckxpbWl0KGlkbGVSZWFkQnVmZmVyTGltaXQsCisgICAgICAgICAgaWRsZVdyaXRlQnVmZmVyTGltaXQpOworICAgICAgICBjb25uZWN0aW9uU3RhY2tfIH49IGNvbm5lY3Rpb247CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQobnVtQ29ubmVjdGlvbnNfID4gMCk7CisgICAgICAgIC0tbnVtQ29ubmVjdGlvbnNfOworCisgICAgICAgIC8vIExlYXZlIHRoZSBjb25uZWN0aW9uIG9iamVjdCBmb3IgY29sbGVjdGlvbiBub3cuCisgICAgICAgIEdDLnJlbW92ZVJvb3QoY2FzdCh2b2lkKiljb25uZWN0aW9uKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gU29ja2V0IHVzZWQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBhbmQgYWNjZXB0aW5nIHRoZW0uCisgIFNvY2tldCBsaXN0ZW5Tb2NrZXRfOworCisgIC8vLyBQb3J0IHRvIGxpc3RlbiBvbi4KKyAgdXNob3J0IHBvcnRfOworCisgIC8vLyBXaGV0aGVyIHRvIGxpc3RlbiBvbiBJUHY2IG9ubHkuCisgIGJvb2wgaXB2Nk9ubHlfOworCisgIC8vLyBUaGUgdG90YWwgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGV4aXN0aW5nLCBib3RoIGFjdGl2ZSBhbmQgaWRsZS4KKyAgc2l6ZV90IG51bUNvbm5lY3Rpb25zXzsKKworICAvLy8gVGhlIG51bWJlciBvZiBjb25uZWN0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHdhaXRpbmcgZm9yIHRoZSBwcm9jZXNzb3IKKyAgLy8vIHRvIHJldHVybi4KKyAgc2hhcmVkIHNpemVfdCBudW1BY3RpdmVQcm9jZXNzb3JzXzsKKworICAvLy8gSHlzdGVyZXNpcyBmb3IgbGVhdmluZyBvdmVybG9hZCBzdGF0ZS4KKyAgZG91YmxlIG92ZXJsb2FkSHlzdGVyZXNpc187CisKKyAgLy8vIFdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KKyAgYm9vbCBvdmVybG9hZGVkXzsKKworICAvLy8gTnVtYmVyIG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgc2luY2UgdGhlIHNlcnZlciBlbnRlcmVkIHRoZSBjdXJyZW50CisgIC8vLyBvdmVybG9hZGVkIHN0YXRlLgorICB1aW50IG5Db25uZWN0aW9uc0Ryb3BwZWRfOworCisgIC8vLyBOdW1iZXIgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBkdWUgdG8gb3ZlcmxvYWQgc2luY2UgdGhlIHNlcnZlciBzdGFydGVkLgorICB1bG9uZyBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfOworCisgIC8vLyBUaGUgdGFzayBwb29sIHVzZWQgZm9yIHByb2Nlc3NpbmcgcmVxdWVzdHMuCisgIFRhc2tQb29sIHRhc2tQb29sXzsKKworICAvLy8gTnVtYmVyIG9mIElPIHRocmVhZHMgdGhpcyBzZXJ2ZXIgd2lsbCB1c2UgKD49IDEpLgorICBzaXplX3QgbnVtSU9UaHJlYWRzXzsKKworICAvLy8gVGhlIElPTG9vcHMgYW1vbmcgd2hpY2ggc29ja2V0IGhhbmRsaW5nIHdvcmsgaXMgZGlzdHJpYnV0ZWQuCisgIElPTG9vcFtdIGlvTG9vcHNfOworCisgIC8vLyBUaGUgaW5kZXggb2YgdGhlIGxvb3AgaW4gaW9Mb29wc18gd2hpY2ggd2lsbCBoYW5kbGUgdGhlIG5leHQgYWNjZXB0ZWQKKyAgLy8vIGNvbm5lY3Rpb24uCisgIHNpemVfdCBuZXh0SU9Mb29wXzsKKworICAvLy8gQWxsIHRoZSBjb25uZWN0aW9uIG9iamVjdHMgd2hpY2ggaGF2ZSBiZWVuIGNyZWF0ZWQgYnV0IGFyZSBub3QgY3VycmVudGx5CisgIC8vLyBpbiB1c2UuIFdoZW4gYSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgaXQgaXQgcGxhY2VkIGhlcmUgdG8gZW5hYmxlIG9iamVjdAorICAvLy8gKHJlc3AuIGJ1ZmZlcikgcmV1c2UuCisgIENvbm5lY3Rpb25bXSBjb25uZWN0aW9uU3RhY2tfOworCisgIC8vLyBUaGlzIG11dGV4IHByb3RlY3RzIHRoZSBjb25uZWN0aW9uIHN0YWNrLgorICBNdXRleCBjb25uZWN0aW9uTXV0ZXhfOworfQorCitwcml2YXRlIHsKKyAgLyoKKyAgICogRW5jYXBzdWxhdGVzIGEgbGliZXZlbnQgZXZlbnQgbG9vcC4KKyAgICoKKyAgICogVGhlIGRlc2lnbiBpcyBhIGJpdCBvZiBhIG1lc3MsIHNpbmNlIHRoZSBmaXJzdCBsb29wIGlzIGFjdHVhbGx5IHJ1biBvbiB0aGUKKyAgICogc2VydmVyIHRocmVhZCBpdHNlbGYgYW5kIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBpcyB0aGUgb25seSBpbnN0YW5jZSBmb3IKKyAgICogd2hpY2ggbGlzdGVuU29ja2V0XyBpcyBub3QgbnVsbC4KKyAgICovCisgIGZpbmFsIGNsYXNzIElPTG9vcCB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBhbmQgc2V0IHVwIHRoZSBldmVudCBiYXNlLgorICAgICAqCisgICAgICogSWYgbGlzdGVuU29ja2V0IGlzIG5vdCBudWxsLCB0aGUgdGhyZWFkIHdpbGwgYWxzbyBhY2NlcHQgbmV3CisgICAgICogY29ubmVjdGlvbnMgaXRzZWxmLgorICAgICAqLworICAgIHRoaXMoVE5vbmJsb2NraW5nU2VydmVyIHNlcnZlciwgU29ja2V0IGxpc3RlblNvY2tldCkgeworICAgICAgc2VydmVyXyA9IHNlcnZlcjsKKyAgICAgIGxpc3RlblNvY2tldF8gPSBsaXN0ZW5Tb2NrZXQ7CisgICAgICBpbml0TXV0ZXhfID0gbmV3IE11dGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIGV2ZW50IGxvb3A7IG9ubHkgcmV0dXJucyBhZnRlciBhIGNhbGwgdG8gc3RvcCgpLgorICAgICAqLworICAgIHZvaWQgcnVuKCkgeworICAgICAgYXNzZXJ0KCFhdG9taWNMb2FkKGluaXRpYWxpemVkXyksICJJT0xvb3AgYWxyZWFkeSBydW5uaW5nPyEiKTsKKworICAgICAgc3luY2hyb25pemVkIChpbml0TXV0ZXhfKSB7CisgICAgICAgIGlmIChhdG9taWNMb2FkKHNodXR0aW5nRG93bl8pKSByZXR1cm47CisgICAgICAgIGF0b21pY1N0b3JlKGluaXRpYWxpemVkXywgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0KCFldmVudEJhc2VfKTsKKyAgICAgICAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisKKyAgICAgICAgaWYgKGxpc3RlblNvY2tldF8pIHsKKyAgICAgICAgICAvLyBMb2cgdGhlIGxpYmV2ZW50IHZlcnNpb24gYW5kIGJhY2tlbmQuCisgICAgICAgICAgbG9nSW5mbygibGliZXZlbnQgdmVyc2lvbiAlcywgdXNpbmcgbWV0aG9kICVzLiIsCisgICAgICAgICAgICB0byFzdHJpbmcoZXZlbnRfZ2V0X3ZlcnNpb24oKSksIHRvIXN0cmluZyhldmVudF9iYXNlX2dldF9tZXRob2QoZXZlbnRCYXNlXykpKTsKKworICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBldmVudCBmb3IgdGhlIGxpc3RlbmluZyBzb2NrZXQuCisgICAgICAgICAgbGlzdGVuRXZlbnRfID0gZXZlbnRfbmV3KGV2ZW50QmFzZV8sIGxpc3RlblNvY2tldF8uaGFuZGxlLAorICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QgfCBFVl9FVCwKKyAgICAgICAgICAgIGFzc3VtZU5vdGhyb3coJlROb25ibG9ja2luZ1NlcnZlci5hY2NlcHRDb25uZWN0aW9uc0NhbGxiYWNrKSwKKyAgICAgICAgICAgIGNhc3Qodm9pZCopc2VydmVyXyk7CisgICAgICAgICAgaWYgKGV2ZW50X2FkZChsaXN0ZW5FdmVudF8sIG51bGwpID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiZXZlbnRfYWRkIGZvciB0aGUgbGlzdGVuaW5nIHNvY2tldCBldmVudCBmYWlsZWQuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXV0byBwYWlyID0gc29ja2V0UGFpcigpOworICAgICAgICBmb3JlYWNoIChzOyBwYWlyKSBzLmJsb2NraW5nID0gZmFsc2U7CisgICAgICAgIGNvbXBsZXRpb25TZW5kU29ja2V0XyA9IHBhaXJbMF07CisgICAgICAgIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0XyA9IHBhaXJbMV07CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgYW4gZXZlbnQgZm9yIHRoZSB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIHNvY2tldC4KKyAgICAgICAgY29tcGxldGlvbkV2ZW50XyA9IGV2ZW50X25ldyhldmVudEJhc2VfLCBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8uaGFuZGxlLAorICAgICAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNUIHwgRVZfRVQsIGFzc3VtZU5vdGhyb3coJmNvbXBsZXRlZENhbGxiYWNrKSwKKyAgICAgICAgICBjYXN0KHZvaWQqKXRoaXMpOworCisgICAgICAgIGlmIChldmVudF9hZGQoY29tcGxldGlvbkV2ZW50XywgbnVsbCkgPT0gLTEpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiZXZlbnRfYWRkIGZvciB0aGUgbm90aWZpY2F0aW9uIHNvY2tldCBmYWlsZWQuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgcmV0dXJucyBvbmx5IGFmdGVyIHN0b3AoKS4KKyAgICAgIGV2ZW50X2Jhc2VfZGlzcGF0Y2goZXZlbnRCYXNlXyk7CisKKyAgICAgIGlmIChsaXN0ZW5FdmVudF8pIHsKKyAgICAgICAgZXZlbnRfZnJlZShsaXN0ZW5FdmVudF8pOworICAgICAgICBsaXN0ZW5FdmVudF8gPSBudWxsOworICAgICAgfQorCisgICAgICBldmVudF9mcmVlKGNvbXBsZXRpb25FdmVudF8pOworICAgICAgY29tcGxldGlvbkV2ZW50XyA9IG51bGw7CisKKyAgICAgIGNvbXBsZXRpb25TZW5kU29ja2V0Xy5jbG9zZSgpOworICAgICAgY29tcGxldGlvblNlbmRTb2NrZXRfID0gbnVsbDsKKworICAgICAgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfLmNsb3NlKCk7CisgICAgICBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8gPSBudWxsOworCisgICAgICBldmVudF9iYXNlX2ZyZWUoZXZlbnRCYXNlXyk7CisgICAgICBldmVudEJhc2VfID0gbnVsbDsKKworICAgICAgYXRvbWljU3RvcmUoc2h1dHRpbmdEb3duXywgZmFsc2UpOworCisgICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGNvbm5lY3Rpb24gaGFuZGxlZCBieSB0aGlzIGxvb3AuCisgICAgICovCisgICAgdm9pZCBhZGRDb25uZWN0aW9uKCkgeworICAgICAgKytudW1BY3RpdmVDb25uZWN0aW9uc187CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcG9zZXMgYSBjb25uZWN0aW9uIG9iamVjdCAodHlwaWNhbGx5IGFmdGVyIGl0IGhhcyBiZWVuIGNsb3NlZCkuCisgICAgICovCisgICAgdm9pZCBkaXNwb3NlQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgIHNlcnZlcl8uZGlzcG9zZUNvbm5lY3Rpb24oY29ubik7CisgICAgICBhc3NlcnQobnVtQWN0aXZlQ29ubmVjdGlvbnNfID4gMCk7CisgICAgICAtLW51bUFjdGl2ZUNvbm5lY3Rpb25zXzsKKyAgICAgIGlmIChudW1BY3RpdmVDb25uZWN0aW9uc18gPT0gMCkgeworICAgICAgICBpZiAoYXRvbWljTG9hZChzaHV0dGluZ0Rvd25fKSkgeworICAgICAgICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIGV2ZW50IGxvb3AgdGhhdCB0aGUgY3VycmVudCBzdGVwIChpbml0aWFsaXphdGlvbiwKKyAgICAgKiBwcm9jZXNzaW5nIG9mIGEgcmVxdWVzdCkgb24gYSBjZXJ0YWluIGNvbm5lY3Rpb24gaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSwgYnV0IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZnJvbSB0aGUKKyAgICAgKiB0aHJlYWQgcnVubmluZyB0aGUgbG9vcCBpdHNlbGYuCisgICAgICovCisgICAgdm9pZCBub3RpZnlDb21wbGV0ZWQoQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICBhc3NlcnQoISFjb21wbGV0aW9uU2VuZFNvY2tldF8pOworICAgICAgYXV0byBieXRlc1NlbnQgPSBjb21wbGV0aW9uU2VuZFNvY2tldF8uc2VuZChjYXN0KHVieXRlW10pKCgmY29ubilbMCAuLiAxXSkpOworCisgICAgICBpZiAoYnl0ZXNTZW50ICE9IENvbm5lY3Rpb24uc2l6ZW9mKSB7CisgICAgICAgIGxvZ0Vycm9yKCJTZW5kaW5nIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIGZhaWxlZCwgY29ubmVjdGlvbiB3aWxsICIgfgorICAgICAgICAgICJub3QgYmUgcHJvcGVybHkgdGVybWluYXRlZC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGl0cyB0aGUgZXZlbnQgbG9vcCBhZnRlciBhbGwgY3VycmVudGx5IGFjdGl2ZSBjb25uZWN0aW9ucyBoYXZlIGJlZW4KKyAgICAgKiBjbG9zZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLgorICAgICAqLworICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIGluIGVpdGhlciBsaWJldmVudCBvciBpdHMgZG9jdW1lbnRhdGlvbiwgaGF2aW5nIG5vCisgICAgICAvLyBldmVudHMgcmVnaXN0ZXJlZCBkb2Vzbid0IGFjdHVhbGx5IHRlcm1pbmF0ZSB0aGUgbG9vcCwgYmVjYXVzZQorICAgICAgLy8gZXZlbnRfYmFzZV9uZXcoKSByZWdpc3RlcnMgc29tZSBpbnRlcm5hbCBvbmUgYnkgY2FsbGluZworICAgICAgLy8gZXZ0aHJlYWRfbWFrZV9iYXNlX25vdGlmaWFibGUoKS4KKyAgICAgIC8vIER1ZSB0byB0aGlzLCB3ZSBjYW4ndCBzaW1wbHkgcmVtb3ZlIGFsbCBldmVudHMgYW5kIGV4cGVjdCB0aGUgZXZlbnQKKyAgICAgIC8vIGxvb3AgdG8gdGVybWluYXRlLiBJbnN0ZWFkLCB3ZSBwaW5nIHRoZSBldmVudCBsb29wIHVzaW5nIGEgbnVsbAorICAgICAgLy8gY29tcGxldGlvbiBtZXNzYWdlLiBUaGlzIHdheSwgd2UgbWFrZSBzdXJlIHRvIHdha2UgdXAgdGhlIGxpYmV2ZW50CisgICAgICAvLyB0aHJlYWQgaWYgaXQgbm90IGN1cnJlbnRseSBwcm9jZXNzaW5nIGFueSBjb25uZWN0aW9ucy4gSXQgd2lsbCBicmVhaworICAgICAgLy8gb3V0IG9mIHRoZSBsb29wIGluIGRpc3Bvc2VDb25uZWN0aW9uKCkgYWZ0ZXIgdGhlIGxhc3QgYWN0aXZlCisgICAgICAvLyBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgIHN5bmNocm9uaXplZCAoaW5pdE11dGV4XykgeworICAgICAgICBhdG9taWNTdG9yZShzaHV0dGluZ0Rvd25fLCB0cnVlKTsKKyAgICAgICAgaWYgKGF0b21pY0xvYWQoaW5pdGlhbGl6ZWRfKSkgbm90aWZ5Q29tcGxldGVkKG51bGwpOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8qKgorICAgICAqIEMgY2FsbGJhY2sgdG8gY2FsbCBjb21wbGV0ZWQoKSBmcm9tIGxpYmV2ZW50LgorICAgICAqCisgICAgICogRXhwZWN0cyB0aGUgY3VzdG9tIGFyZ3VtZW50IHRvIGJlIHRoZSB0aGlzIHBvaW50ZXIgb2YgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiBJT0xvb3AgaW5zdGFuY2UuCisgICAgICovCisgICAgZXh0ZXJuKEMpIHN0YXRpYyB2b2lkIGNvbXBsZXRlZENhbGxiYWNrKGludCBmZCwgc2hvcnQgd2hhdCwgdm9pZCogbG9vcFRoaXMpIHsKKyAgICAgIGFzc2VydCh3aGF0ICYgRVZfUkVBRCk7CisgICAgICBhdXRvIGxvb3AgPSBjYXN0KElPTG9vcClsb29wVGhpczsKKyAgICAgIGFzc2VydChmZCA9PSBsb29wLmNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy5oYW5kbGUpOworICAgICAgbG9vcC5jb21wbGV0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBmcm9tIHRoZSBjb21wbGV0aW9uIHJlY2VpdmUgc29ja2V0IGFuZCBhcHByb3ByaWF0ZWx5IHRyYW5zaXRpb25zCisgICAgICogdGhlIGNvbm5lY3Rpb25zIGFuZCBzaHV0cyBkb3duIHRoZSBsb29wIGlmIHJlcXVlc3RlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNvbXBsZXRlZCgpIHsKKyAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKyAgICAgIHB0cmRpZmZfdCBieXRlc1JlYWQ7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBieXRlc1JlYWQgPSBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8ucmVjZWl2ZSgKKyAgICAgICAgICBjYXN0KHVieXRlW10pKCgmY29ubmVjdGlvbilbMCAuLiAxXSkpOworICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgIGF1dG8gZXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworCisgICAgICAgICAgaWYgKGVycm5vICE9IFdPVUxEX0JMT0NLX0VSUk5PKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiUmVhZGluZyBmcm9tIGNvbXBsZXRpb24gc29ja2V0IGZhaWxlZCwgc29tZSBjb25uZWN0aW9uICIgfgorICAgICAgICAgICAgICAid2lsbCBuZXZlciBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkOiAlcyIsIHNvY2tldEVycm5vU3RyaW5nKGVycm5vKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBDb25uZWN0aW9uLnNpemVvZikgYnJlYWs7CisKKyAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7CisgICAgICAgICAgYXNzZXJ0KGF0b21pY0xvYWQoc2h1dHRpbmdEb3duXykpOworICAgICAgICAgIGlmIChudW1BY3RpdmVDb25uZWN0aW9uc18gPT0gMCkgeworICAgICAgICAgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29ubmVjdGlvbi50cmFuc2l0aW9uKCk7CisgICAgICB9CisKKyAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7CisgICAgICAgIGxvZ0Vycm9yKCJVbmV4cGVjdGVkIHBhcnRpYWwgcmVhZCBmcm9tIGNvbXBsZXRpb24gc29ja2V0ICIgfgorICAgICAgICAgICIoJXMgYnl0ZXMgaW5zdGVhZCBvZiAlcykuIiwgYnl0ZXNSZWFkLCBDb25uZWN0aW9uLnNpemVvZik7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIGFzc29jaWF0ZWQgc2VydmVyCisgICAgVE5vbmJsb2NraW5nU2VydmVyIHNlcnZlcl87CisKKyAgICAvLy8gVGhlIG1hbmFnZWQgbGlzdGVuaW5nIHNvY2tldCwgaWYgYW55LgorICAgIFNvY2tldCBsaXN0ZW5Tb2NrZXRfOworCisgICAgLy8vIFRoZSBsaWJldmVudCBldmVudCBiYXNlIGZvciB0aGUgbG9vcC4KKyAgICBldmVudF9iYXNlKiBldmVudEJhc2VfOworCisgICAgLy8vIFRyaWdnZXJlZCBvbiBsaXN0ZW4gc29ja2V0IGV2ZW50cy4KKyAgICBldmVudCogbGlzdGVuRXZlbnRfOworCisgICAgLy8vIFRyaWdnZXJlZCBvbiBjb21wbGV0aW9uIHJlY2VpdmUgc29ja2V0IGV2ZW50cy4KKyAgICBldmVudCogY29tcGxldGlvbkV2ZW50XzsKKworICAgIC8vLyBTb2NrZXQgdXNlZCB0byBzZW5kIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIG1lc3NhZ2VzLiBQYWlyZWQgd2l0aAorICAgIC8vLyBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8uCisgICAgU29ja2V0IGNvbXBsZXRpb25TZW5kU29ja2V0XzsKKworICAgIC8vLyBTb2NrZXQgdXNlZCB0byBzZW5kIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uIG1lc3NhZ2VzLiBQYWlyZWQgd2l0aAorICAgIC8vLyBjb21wbGV0aW9uU2VuZFNvY2tldF8uCisgICAgU29ja2V0IGNvbXBsZXRpb25SZWNlaXZlU29ja2V0XzsKKworICAgIC8vLyBXaGV0aGVyIHRoZSBzZXJ2ZXIgaXMgY3VycmVudGx5IHNodXR0aW5nIGRvd24gKGkuZS4gdGhlIGNhbmNlbGxhdGlvbiBoYXMKKyAgICAvLy8gYmVlbiB0cmlnZ2VyZWQsIGJ1dCBub3QgYWxsIGNsaWVudCBjb25uZWN0aW9ucyBoYXZlIGJlZW4gY2xvc2VkIHlldCkuCisgICAgc2hhcmVkIGJvb2wgc2h1dHRpbmdEb3duXzsKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGN1cnJlbnRseSBhY3RpdmUgY2xpZW50IGNvbm5lY3Rpb25zLgorICAgIHNpemVfdCBudW1BY3RpdmVDb25uZWN0aW9uc187CisKKyAgICAvLy8gR3VhcmRzIGxvb3Agc3RhcnR1cCBzbyB0aGF0IHRoZSBsb29wIGNhbiBiZSByZWxpYWJseSBzaHV0IGRvd24gZXZlbiBpZgorICAgIC8vLyBhbm90aGVyIHRocmVhZCBoYXMganVzdCBzdGFydGVkIHRvIGV4ZWN1dGUgcnVuKCkuIExvY2tlZCBkdXJpbmcKKyAgICAvLy8gaW5pdGlhbGl6YXRpb24gaW4gcnVuKCkuIFdoZW4gdW5sb2NrZWQsIHRoZSBjb21wbGV0aW9uIG1lY2hhbmlzbSBpcworICAgIC8vLyBleHBlY3RlZCB0byBiZSBmdWxseSBzZXQgdXAuCisgICAgTXV0ZXggaW5pdE11dGV4XzsKKyAgICBzaGFyZWQgYm9vbCBpbml0aWFsaXplZF87IC8vLyBEaXR0bworICB9CisKKyAgLyoKKyAgICogSS9PIHN0YXRlcyBhIHNvY2tldCBjYW4gYmUgaW4uCisgICAqLworICBlbnVtIFNvY2tldFN0YXRlIHsKKyAgICBSRUNWX0ZSQU1FX1NJWkUsIC8vLyBUaGUgZnJhbWUgc2l6ZSBpcyByZWNlaXZlZC4KKyAgICBSRUNWLCAvLy8gVGhlIHBheWxvYWQgaXMgcmVjZWl2ZWQuCisgICAgU0VORCAvLy8gVGhlIHJlc3BvbnNlIGlzIHdyaXR0ZW4gYmFjayBvdXQuCisgIH0KKworICAvKgorICAgKiBTdGF0ZXMgYSBjb25uZWN0aW9uIGNhbiBiZSBpbi4KKyAgICovCisgIGVudW0gQ29ubmVjdGlvblN0YXRlIHsKKyAgICBJTklULCAvLy8gVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgICBSRUFEX0ZSQU1FX1NJWkUsIC8vLyBUaGUgZm91ciBmcmFtZSBzaXplIGJ5dGVzIGFyZSBiZWluZyByZWFkLgorICAgIFJFQURfUkVRVUVTVCwgLy8vIFRoZSByZXF1ZXN0IHBheWxvYWQgaXRzZWxmIGlzIGJlaW5nIHJlYWQuCisgICAgV0FJVF9QUk9DRVNTT1IsIC8vLyBUaGUgY29ubmVjdGlvbiB3YWl0cyBmb3IgdGhlIHByb2Nlc3NvciB0byBmaW5pc2guCisgICAgU0VORF9SRVNVTFQgLy8vIFRoZSByZXN1bHQgaXMgd3JpdHRlbiBiYWNrIG91dC4KKyAgfQorCisgIC8qCisgICAqIEEgY29ubmVjdGlvbiB0aGF0IGlzIGhhbmRsZWQgdmlhIGxpYmV2ZW50LgorICAgKgorICAgKiBEYXRhIHJlY2VpdmVkIGlzIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlIChyZXR1cm5pbmcgYmFjayB0bworICAgKiBsaWJldmVudCBpZiBub3QpLCBhdCB3aGljaCBwb2ludCB0aGUgcHJvY2Vzc29yIGlzIGludm9rZWQuCisgICAqLworICBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgICAqCisgICAgICogVG8gcmV1c2UgYSBjb25uZWN0aW9uIG9iamVjdCBsYXRlciBvbiwgdGhlIGluaXQoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZAorICAgICAqIHRvIHRoZSBzYW1lIGVmZmVjdCBvbiB0aGUgaW50ZXJuYWwgc3RhdGUuCisgICAgICovCisgICAgdGhpcyhTb2NrZXQgc29ja2V0LCBJT0xvb3AgbG9vcCkgeworICAgICAgLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0IG9iamVjdHMgYXJlIHJldXNlZCBiZXR3ZWVuIGNsaWVudHMKKyAgICAgIC8vIGNvbm5lY3Rpb25zLCBzbyBpbml0aWFsaXplIHRoZW0gaGVyZSByYXRoZXIgdGhhbiBpbiBpbml0KCkuCisgICAgICBpbnB1dFRyYW5zcG9ydF8gPSBuZXcgVElucHV0UmFuZ2VUcmFuc3BvcnQhKHVieXRlW10pKFtdKTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8gPSBuZXcgVE1lbW9yeUJ1ZmZlcihsb29wLnNlcnZlcl8ud3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSk7CisKKyAgICAgIGluaXQoc29ja2V0LCBsb29wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFBhcmFtczoKKyAgICAgKiAgIHNvY2tldCA9IFRoZSBzb2NrZXQgdG8gd29yayBvbi4KKyAgICAgKiAgIGV2ZW50RmxhZ3MgPSBBbnkgZmxhZ3MgdG8gcGFzcyB0byBsaWJldmVudC4KKyAgICAgKiAgIHMgPSBUaGUgc2VydmVyIHRoaXMgY29ubmVjdGlvbiBpcyBwYXJ0IG9mLgorICAgICAqLworICAgIHZvaWQgaW5pdChTb2NrZXQgc29ja2V0LCBJT0xvb3AgbG9vcCkgeworICAgICAgLy8gVE9ETzogVGhpcyBhbGxvY2F0aW9uIGNvdWxkIGJlIGF2b2lkZWQuCisgICAgICBzb2NrZXRfID0gbmV3IFRTb2NrZXQoc29ja2V0KTsKKworICAgICAgbG9vcF8gPSBsb29wOworICAgICAgc2VydmVyXyA9IGxvb3BfLnNlcnZlcl87CisgICAgICBjb25uU3RhdGVfID0gQ29ubmVjdGlvblN0YXRlLklOSVQ7CisgICAgICBldmVudEZsYWdzXyA9IDA7CisKKyAgICAgIHJlYWRCdWZmZXJQb3NfID0gMDsKKyAgICAgIHJlYWRXYW50XyA9IDA7CisKKyAgICAgIHdyaXRlQnVmZmVyXyA9IG51bGw7CisgICAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOworICAgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOworCisgICAgICBzb2NrZXRTdGF0ZV8gPSBTb2NrZXRTdGF0ZS5SRUNWX0ZSQU1FX1NJWkU7CisgICAgICBjYWxsc1NpbmNlUmVzaXplXyA9IDA7CisKKyAgICAgIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8gPQorICAgICAgICBzZXJ2ZXJfLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKKyAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0KKyAgICAgICAgc2VydmVyXy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKKworICAgICAgaW5wdXRQcm90b2NvbF8gPQorICAgICAgICBzZXJ2ZXJfLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOworICAgICAgb3V0cHV0UHJvdG9jb2xfID0KKyAgICAgICAgc2VydmVyXy5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworCisgICAgICBpZiAoc2VydmVyXy5ldmVudEhhbmRsZXIpIHsKKyAgICAgICAgY29ubmVjdGlvbkNvbnRleHRfID0KKyAgICAgICAgICBzZXJ2ZXJfLmV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICAgICAgfQorCisgICAgICBhdXRvIGluZm8gPSBUQ29ubmVjdGlvbkluZm8oaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgc29ja2V0Xyk7CisgICAgICBwcm9jZXNzb3JfID0gc2VydmVyXy5wcm9jZXNzb3JGYWN0b3J5LmdldFByb2Nlc3NvcihpbmZvKTsKKyAgICB9CisKKyAgICB+dGhpcygpIHsKKyAgICAgIGZyZWUocmVhZEJ1ZmZlcl8pOworICAgICAgaWYgKGV2ZW50XykgeworICAgICAgICBldmVudF9mcmVlKGV2ZW50Xyk7CisgICAgICAgIGV2ZW50XyA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgYnVmZmVycyBhZ2FpbnN0IHRoZSBzaXplIGxpbWl0cyBhbmQgc2hyaW5rIHRoZW0gaWYgZXhjZWVkZWQuCisgICAgICoKKyAgICAgKiBQYXJhbXM6CisgICAgICogICByZWFkTGltaXQgPSBSZWFkIGJ1ZmZlciBzaXplIGxpbWl0IChpbiBieXRlcywgMCB0byBpZ25vcmUpLgorICAgICAqICAgd3JpdGVMaW1pdCA9IFdyaXRlIGJ1ZmZlciBzaXplIGxpbWl0IChpbiBieXRlcywgMCB0byBpZ25vcmUpLgorICAgICAqLworICAgIHZvaWQgY2hlY2tJZGxlQnVmZmVyTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpIHsKKyAgICAgIGlmIChyZWFkTGltaXQgPiAwICYmIHJlYWRCdWZmZXJTaXplXyA+IHJlYWRMaW1pdCkgeworICAgICAgICBmcmVlKHJlYWRCdWZmZXJfKTsKKyAgICAgICAgcmVhZEJ1ZmZlcl8gPSBudWxsOworICAgICAgICByZWFkQnVmZmVyU2l6ZV8gPSAwOworICAgICAgfQorCisgICAgICBpZiAod3JpdGVMaW1pdCA+IDAgJiYgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPiB3cml0ZUxpbWl0KSB7CisgICAgICAgIC8vIGp1c3Qgc3RhcnQgb3ZlcgorICAgICAgICBvdXRwdXRUcmFuc3BvcnRfLnJlc2V0KHNlcnZlcl8ud3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSk7CisgICAgICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2l0aW9ucyB0aGUgY29ubmVjdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIGUuZy4gd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiByZWFkIGNvbXBsZXRlbHkgb3IgYWxsCisgICAgICogdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBiYWNrLgorICAgICAqLworICAgIHZvaWQgdHJhbnNpdGlvbigpIHsKKyAgICAgIGFzc2VydCghIWxvb3BfKTsKKyAgICAgIGFzc2VydCghIXNlcnZlcl8pOworCisgICAgICAvLyBTd2l0Y2ggdXBvbiB0aGUgc3RhdGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGluIGFuZCBtb3ZlIHRvIGEgbmV3IHN0YXRlCisgICAgICBmaW5hbCBzd2l0Y2ggKGNvbm5TdGF0ZV8pIHsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuUkVBRF9SRVFVRVNUOgorICAgICAgICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcgdGhlIHJlcXVlc3QsIHBhY2thZ2UgdGhlIHJlYWQgYnVmZmVyIGludG8gdHJhbnNwb3J0CisgICAgICAgICAgLy8gYW5kIGdldCBiYWNrIHNvbWUgZGF0YSBmcm9tIHRoZSBkaXNwYXRjaCBmdW5jdGlvbgorICAgICAgICAgIGlucHV0VHJhbnNwb3J0Xy5yZXNldChyZWFkQnVmZmVyX1swIC4uIHJlYWRCdWZmZXJQb3NfXSk7CisgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldCgpOworCisgICAgICAgICAgLy8gUHJlcGVuZCBmb3VyIGJ5dGVzIG9mIGJsYW5rIHNwYWNlIHRvIHRoZSBidWZmZXIgc28gd2UgY2FuCisgICAgICAgICAgLy8gd3JpdGUgdGhlIGZyYW1lIHNpemUgdGhlcmUgbGF0ZXIuCisgICAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHdlIHdvdWxkbid0IGhhdmUgdG8gd3JpdGUgYW55dGhpbmcsIGp1c3QKKyAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIFRNZW1vcnlCdWZmZXIgd3JpdGVPZmZzZXRfLiBUaGlzIHdvdWxkIHlpZWxkIGEgdGlueQorICAgICAgICAgIC8vIHBlcmZvcm1hbmNlIGdhaW4uCisgICAgICAgICAgdWJ5dGVbNF0gc3BhY2UgPSB2b2lkOworICAgICAgICAgIG91dHB1dFRyYW5zcG9ydF8ud3JpdGUoc3BhY2UpOworCisgICAgICAgICAgc2VydmVyXy5pbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisKKyAgICAgICAgICB0YXNrUG9vbF8gPSBzZXJ2ZXJfLnRhc2tQb29sOworICAgICAgICAgIGlmICh0YXNrUG9vbF8pIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0YXNrIGFuZCBhZGQgaXQgdG8gdGhlIHRhc2sgcG9vbCBxdWV1ZS4KKyAgICAgICAgICAgIGF1dG8gcHJvY2Vzc2luZ1Rhc2sgPSB0YXNrIXByb2Nlc3NSZXF1ZXN0KHRoaXMpOworICAgICAgICAgICAgY29ublN0YXRlXyA9IENvbm5lY3Rpb25TdGF0ZS5XQUlUX1BST0NFU1NPUjsKKyAgICAgICAgICAgIHRhc2tQb29sXy5wdXQocHJvY2Vzc2luZ1Rhc2spOworCisgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgYW55IG1vcmUgZGF0YSB3aGlsZSB0aGUgdGFzayBpcyBhY3RpdmUuCisgICAgICAgICAgICB1bnJlZ2lzdGVyRXZlbnQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBKdXN0IHByb2Nlc3MgaXQgcmlnaHQgbm93IGlmIHRoZXJlIGlzIG5vIHRhc2sgcG9vbCBzZXQuCisgICAgICAgICAgcHJvY2Vzc1JlcXVlc3QodGhpcyk7CisgICAgICAgICAgZ290byBjYXNlOworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5XQUlUX1BST0NFU1NPUjoKKyAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LCBzZXQgdGhlIGZyYW1lIHNpemUKKyAgICAgICAgICAvLyBmb3IgdGhlIG91dHB1dFRyYW5zcG9ydF8gY29udGVudHMgYW5kIHNldCBldmVyeXRoaW5nIHVwIHRvIHdyaXRlCisgICAgICAgICAgLy8gaXQgb3V0IHZpYSBsaWJldmVudC4KKyAgICAgICAgICBzZXJ2ZXJfLmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKworICAgICAgICAgIC8vIEFjcXVpcmUgdGhlIGRhdGEgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0LgorICAgICAgICAgIC8vIEtMVURHRTogVG8gYXZvaWQgY29weWluZywgd2Ugc2ltcGx5IGNhc3QgdGhlIGNvbnN0IGF3YXkgYW5kCisgICAgICAgICAgLy8gbW9kaWZ5IHRoZSBpbnRlcm5hbCBidWZmZXIgb2YgdGhlIFRNZW1vcnlCdWZmZXIg4oCTIHdvcmtzIHdpdGggdGhlCisgICAgICAgICAgLy8gY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzbid0IGV4YWN0bHkgYmVhdXRpZnVsLgorICAgICAgICAgIHdyaXRlQnVmZmVyXyA9IGNhc3QodWJ5dGVbXSlvdXRwdXRUcmFuc3BvcnRfLmdldENvbnRlbnRzKCk7CisKKyAgICAgICAgICBhc3NlcnQod3JpdGVCdWZmZXJfLmxlbmd0aCA+PSA0LCAiVGhlIHdyaXRlIGJ1ZmZlciBzaG91bGQgaGF2ZSAiIH4KKyAgICAgICAgICAgICJsZWFzdCB0aGUgaW5pdGlhbGx5IGFkZGVkIGR1bW15IGxlbmd0aCBieXRlcy4iKTsKKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJfLmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdCB3YXMgb25lLXdheSwgbm8gcmVzcG9uc2UgdG8gd3JpdGUuCisgICAgICAgICAgICBnb3RvIGNhc2UgQ29ubmVjdGlvblN0YXRlLklOSVQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gV3JpdGUgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgZm91ciBieXRlcyByZXNlcnZlZCBmb3IgaXQuCisgICAgICAgICAgYXV0byBzaXplID0gaG9zdFRvTmV0KGNhc3QodWludCkod3JpdGVCdWZmZXJfLmxlbmd0aCAtIDQpKTsKKyAgICAgICAgICB3cml0ZUJ1ZmZlcl9bMCAuLiA0XSA9IGNhc3QodWJ5dGVbXSkoKCZzaXplKVswIC4uIDFdKTsKKworICAgICAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgICAgICAgc29ja2V0U3RhdGVfID0gU29ja2V0U3RhdGUuU0VORDsKKyAgICAgICAgICBjb25uU3RhdGVfID0gQ29ubmVjdGlvblN0YXRlLlNFTkRfUkVTVUxUOworICAgICAgICAgIHJlZ2lzdGVyRXZlbnQoRVZfV1JJVEUgfCBFVl9QRVJTSVNUKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuU0VORF9SRVNVTFQ6CisgICAgICAgICAgLy8gVGhlIHJlc3VsdCBoYXMgYmVlbiBzZW50IGJhY2sgdG8gdGhlIGNsaWVudCwgd2UgZG9uJ3QgbmVlZCB0aGUKKyAgICAgICAgICAvLyBidWZmZXJzIGFueW1vcmUuCisgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyXy5sZW5ndGggPiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXykgeworICAgICAgICAgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSB3cml0ZUJ1ZmZlcl8ubGVuZ3RoOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzZXJ2ZXJfLnJlc2l6ZUJ1ZmZlckV2ZXJ5TiA+IDAgJiYKKyAgICAgICAgICAgICAgKytjYWxsc1NpbmNlUmVzaXplXyA+PSBzZXJ2ZXJfLnJlc2l6ZUJ1ZmZlckV2ZXJ5TgorICAgICAgICAgICkgeworICAgICAgICAgICAgY2hlY2tJZGxlQnVmZmVyTGltaXQoc2VydmVyXy5pZGxlUmVhZEJ1ZmZlckxpbWl0LAorICAgICAgICAgICAgICBzZXJ2ZXJfLmlkbGVXcml0ZUJ1ZmZlckxpbWl0KTsKKyAgICAgICAgICAgIGNhbGxzU2luY2VSZXNpemVfID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnb3RvIGNhc2U7CisgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLklOSVQ6CisgICAgICAgICAgd3JpdGVCdWZmZXJfID0gbnVsbDsKKyAgICAgICAgICB3cml0ZUJ1ZmZlclBvc18gPSAwOworICAgICAgICAgIHNvY2tldFN0YXRlXyA9IFNvY2tldFN0YXRlLlJFQ1ZfRlJBTUVfU0laRTsKKyAgICAgICAgICBjb25uU3RhdGVfID0gQ29ubmVjdGlvblN0YXRlLlJFQURfRlJBTUVfU0laRTsKKyAgICAgICAgICByZWFkQnVmZmVyUG9zXyA9IDA7CisgICAgICAgICAgcmVnaXN0ZXJFdmVudChFVl9SRUFEIHwgRVZfUEVSU0lTVCk7CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLlJFQURfRlJBTUVfU0laRToKKyAgICAgICAgICAvLyBXZSBqdXN0IHJlYWQgdGhlIHJlcXVlc3QgbGVuZ3RoLCBzZXQgdXAgdGhlIGJ1ZmZlcnMgZm9yIHJlYWRpbmcKKyAgICAgICAgICAvLyB0aGUgcGF5bG9hZC4KKyAgICAgICAgICBpZiAocmVhZFdhbnRfID4gcmVhZEJ1ZmZlclNpemVfKSB7CisgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBidWZmZXIgaXMgdG9vIHNtYWxsLCBleHBvbmVudGlhbGx5IGdyb3cgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgLy8gdW50aWwgaXQgaXMgYmlnIGVub3VnaC4KKworICAgICAgICAgICAgaWYgKHJlYWRCdWZmZXJTaXplXyA9PSAwKSB7CisgICAgICAgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gbmV3U2l6ZSA9IHJlYWRCdWZmZXJTaXplXzsKKyAgICAgICAgICAgIHdoaWxlIChyZWFkV2FudF8gPiBuZXdTaXplKSB7CisgICAgICAgICAgICAgIG5ld1NpemUgKj0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXV0byBuZXdCdWZmZXIgPSBjYXN0KHVieXRlKilyZWFsbG9jKHJlYWRCdWZmZXJfLCBuZXdTaXplKTsKKyAgICAgICAgICAgIGlmICghbmV3QnVmZmVyKSBvbk91dE9mTWVtb3J5RXJyb3IoKTsKKworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXdCdWZmZXI7CisgICAgICAgICAgICByZWFkQnVmZmVyU2l6ZV8gPSBuZXdTaXplOworICAgICAgICAgIH0KKworICAgICAgICAgIHJlYWRCdWZmZXJQb3NfPSAwOworCisgICAgICAgICAgc29ja2V0U3RhdGVfID0gU29ja2V0U3RhdGUuUkVDVjsKKyAgICAgICAgICBjb25uU3RhdGVfID0gQ29ubmVjdGlvblN0YXRlLlJFQURfUkVRVUVTVDsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDIGNhbGxiYWNrIHRvIGNhbGwgd29ya1NvY2tldCgpIGZyb20gbGliZXZlbnQuCisgICAgICoKKyAgICAgKiBFeHBlY3RzIHRoZSBjdXN0b20gYXJndW1lbnQgdG8gYmUgdGhlIHRoaXMgcG9pbnRlciBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAqIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgZXh0ZXJuKEMpIHN0YXRpYyB2b2lkIHdvcmtTb2NrZXRDYWxsYmFjayhpbnQgZmQsIHNob3J0IGZsYWdzLCB2b2lkKiBjb25uVGhpcykgeworICAgICAgYXV0byBjb25uID0gY2FzdChDb25uZWN0aW9uKWNvbm5UaGlzOworICAgICAgYXNzZXJ0KGZkID09IGNvbm4uc29ja2V0Xy5zb2NrZXRIYW5kbGUpOworICAgICAgY29ubi53b3JrU29ja2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlZCBieSBsaWJldmVudCB3aGVuIHNvbWV0aGluZyBoYXBwZW5zIG9uIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgdm9pZCB3b3JrU29ja2V0KCkgeworICAgICAgZmluYWwgc3dpdGNoIChzb2NrZXRTdGF0ZV8pIHsKKyAgICAgICAgY2FzZSBTb2NrZXRTdGF0ZS5SRUNWX0ZSQU1FX1NJWkU6CisgICAgICAgICAgLy8gSWYgc29tZSBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiByZWFkLCB0aGV5IGhhdmUgYmVlbiBrZXB0IGluCisgICAgICAgICAgLy8gcmVhZFdhbnRfLgorICAgICAgICAgIGF1dG8gZnJhbWVTaXplID0gcmVhZFdhbnRfOworCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgICAgICAgICAgICBhdXRvIGJ5dGVzUmVhZCA9IHNvY2tldF8ucmVhZCgKKyAgICAgICAgICAgICAgKGNhc3QodWJ5dGVbXSkoKCZmcmFtZVNpemUpWzAgLi4gMV0pKVtyZWFkQnVmZmVyUG9zXyAuLiAkXSk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgcmVhZCBhbnl0aGluZywgYnV0IHdlIGhhdmUgYmVlbiBub3RpZmllZCDigJMgY2xpZW50CisgICAgICAgICAgICAgIC8vIGhhcyBkaXNjb25uZWN0ZWQuCisgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gYnl0ZXNSZWFkOworICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJGYWlsZWQgdG8gcmVhZCBmcmFtZSBzaXplIGZyb20gY2xpZW50IGNvbm5lY3Rpb246ICVzIiwgdGUpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmVhZEJ1ZmZlclBvc18gPCBmcmFtZVNpemUuc2l6ZW9mKSB7CisgICAgICAgICAgICAvLyBGcmFtZSBzaXplIG5vdCBjb21wbGV0ZSB5ZXQsIHNhdmUgdGhlIGN1cnJlbnQgYnVmZmVyIGluCisgICAgICAgICAgICAvLyByZWFkV2FudF8gc28gdGhhdCB0aGUgcmVtYWluaW5nIGJ5dGVzIGNhbiBiZSByZWFkIGxhdGVyLgorICAgICAgICAgICAgcmVhZFdhbnRfID0gZnJhbWVTaXplOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGF1dG8gc2l6ZSA9IG5ldFRvSG9zdChmcmFtZVNpemUpOworICAgICAgICAgIGlmIChzaXplID4gc2VydmVyXy5tYXhGcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJGcmFtZSBzaXplIHRvbyBsYXJnZSAoJXMgPiAlcyksIGNsaWVudCAlcyBub3QgdXNpbmcgIiB+CisgICAgICAgICAgICAgICJURnJhbWVkVHJhbnNwb3J0PyIsIHNpemUsIHNlcnZlcl8ubWF4RnJhbWVTaXplLAorICAgICAgICAgICAgICBzb2NrZXRfLmdldFBlZXJBZGRyZXNzKCkudG9Ib3N0TmFtZVN0cmluZygpKTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIHJlYWRXYW50XyA9IHNpemU7CisKKyAgICAgICAgICAvLyBOb3cgd2Uga25vdyB0aGUgZnJhbWUgc2l6ZSwgc2V0IGV2ZXJ5dGhpbmcgdXAgZm9yIHJlYWRpbmcgdGhlCisgICAgICAgICAgLy8gcGF5bG9hZC4KKyAgICAgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgU29ja2V0U3RhdGUuUkVDVjoKKyAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGdvdCBhbGwgdGhlIGRhdGEsIHdlIHNob3VsZCBiZSBpbiB0aGUgU0VORCBzdGF0ZS4KKyAgICAgICAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPCByZWFkV2FudF8pOworCisgICAgICAgICAgc2l6ZV90IGJ5dGVzUmVhZDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNvY2tldC4KKyAgICAgICAgICAgIGJ5dGVzUmVhZCA9IHNvY2tldF8ucmVhZChyZWFkQnVmZmVyX1tyZWFkQnVmZmVyUG9zXyAuLiByZWFkV2FudF9dKTsKKyAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiRmFpbGVkIHRvIHJlYWQgZnJvbSBjbGllbnQgc29ja2V0OiAlcyIsIHRlKTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBXZSB3ZXJlIG5vdGlmaWVkLCBidXQgbm8gYnl0ZXMgY291bGQgYmUgcmVhZCAtPiB0aGUgY2xpZW50CisgICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQuCisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPD0gcmVhZFdhbnRfKTsKKworICAgICAgICAgIGlmIChyZWFkQnVmZmVyUG9zXyA9PSByZWFkV2FudF8pIHsKKyAgICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgbW92ZSBvbi4KKyAgICAgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgU29ja2V0U3RhdGUuU0VORDoKKyAgICAgICAgICBhc3NlcnQod3JpdGVCdWZmZXJQb3NfIDw9IHdyaXRlQnVmZmVyXy5sZW5ndGgpOworCisgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlcl8ubGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gc2VuZCDigJMgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBqdXN0IG1vdmUgb24uCisgICAgICAgICAgICBsb2dJbmZvKCJXQVJOSU5HOiBJbiBzZW5kIHN0YXRlLCBidXQgbm8gZGF0YSB0byBzZW5kLlxuIik7CisgICAgICAgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgc2l6ZV90IGJ5dGVzU2VudDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZXNTZW50ID0gc29ja2V0Xy53cml0ZVNvbWUod3JpdGVCdWZmZXJfW3dyaXRlQnVmZmVyUG9zXyAuLiAkXSk7CisgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIkZhaWxlZCB0byB3cml0ZSB0byBjbGllbnQgc29ja2V0OiAlcyIsIHRlKTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgd3JpdGVCdWZmZXJQb3NfICs9IGJ5dGVzU2VudDsKKyAgICAgICAgICBhc3NlcnQod3JpdGVCdWZmZXJQb3NfIDw9IHdyaXRlQnVmZmVyXy5sZW5ndGgpOworCisgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlcl8ubGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBUaGUgd2hvbGUgcmVzcG9uc2UgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIHdlIGFyZSBkb25lLgorICAgICAgICAgICAgdHJhbnNpdGlvbigpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBsaWJldmVudCBldmVudCBmb3Igd29ya1NvY2tldCgpIHdpdGggdGhlIHBhc3NlZCBmbGFncywKKyAgICAgKiB1bnJlZ2lzdGVyaW5nIHRoZSBwcmV2aW91cyBvbmUgKGlmIGFueSkuCisgICAgICovCisgICAgdm9pZCByZWdpc3RlckV2ZW50KHNob3J0IGV2ZW50RmxhZ3MpIHsKKyAgICAgIGlmIChldmVudEZsYWdzXyA9PSBldmVudEZsYWdzKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgZmxhZ3MgYXJlIHRoZSBzYW1lLgorICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIERlbGV0ZSB0aGUgcHJldmlvdXNseSBleGlzdGluZyBldmVudC4KKyAgICAgIHVucmVnaXN0ZXJFdmVudCgpOworCisgICAgICBldmVudEZsYWdzXyA9IGV2ZW50RmxhZ3M7CisKKyAgICAgIGlmIChldmVudEZsYWdzID09IDApIHJldHVybjsKKworICAgICAgaWYgKCFldmVudF8pIHsKKyAgICAgICAgLy8gSWYgdGhlIGV2ZW50IHdhcyBub3QgYWxyZWFkeSBhbGxvY2F0ZWQsIGRvIGl0IG5vdy4KKyAgICAgICAgZXZlbnRfID0gZXZlbnRfbmV3KGxvb3BfLmV2ZW50QmFzZV8sIHNvY2tldF8uc29ja2V0SGFuZGxlLAorICAgICAgICAgIGV2ZW50RmxhZ3NfLCBhc3N1bWVOb3Rocm93KCZ3b3JrU29ja2V0Q2FsbGJhY2spLCBjYXN0KHZvaWQqKXRoaXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXZlbnRfYXNzaWduKGV2ZW50XywgbG9vcF8uZXZlbnRCYXNlXywgc29ja2V0Xy5zb2NrZXRIYW5kbGUsCisgICAgICAgICAgZXZlbnRGbGFnc18sIGFzc3VtZU5vdGhyb3coJndvcmtTb2NrZXRDYWxsYmFjayksIGNhc3Qodm9pZCopdGhpcyk7CisgICAgICB9CisKKyAgICAgIC8vIEFkZCB0aGUgZXZlbnQKKyAgICAgIGlmIChldmVudF9hZGQoZXZlbnRfLCBudWxsKSA9PSAtMSkgeworICAgICAgICBsb2dFcnJvcigiZXZlbnRfYWRkKCkgZm9yIGNsaWVudCBzb2NrZXQgZmFpbGVkLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIHRoZSBjdXJyZW50IGxpYmV2ZW50IGV2ZW50LCBpZiBhbnkuCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyRXZlbnQoKSB7CisgICAgICBpZiAoZXZlbnRfICYmIGV2ZW50RmxhZ3NfICE9IDApIHsKKyAgICAgICAgZXZlbnRGbGFnc18gPSAwOworICAgICAgICBpZiAoZXZlbnRfZGVsKGV2ZW50XykgPT0gLTEpIHsKKyAgICAgICAgICBsb2dFcnJvcigiZXZlbnRfZGVsKCkgZm9yIGNsaWVudCBzb2NrZXQgZmFpbGVkLiIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gYW5kIHJldHVybnMgaXQgYmFjayB0byB0aGUgc2VydmVyLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKSB7CisgICAgICB1bnJlZ2lzdGVyRXZlbnQoKTsKKworICAgICAgaWYgKHNlcnZlcl8uZXZlbnRIYW5kbGVyKSB7CisgICAgICAgIHNlcnZlcl8uZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoCisgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHRfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgdGhlIHNvY2tldAorICAgICAgc29ja2V0Xy5jbG9zZSgpOworCisgICAgICAvLyBjbG9zZSBhbnkgZmFjdG9yeSBwcm9kdWNlZCB0cmFuc3BvcnRzLgorICAgICAgZmFjdG9yeUlucHV0VHJhbnNwb3J0Xy5jbG9zZSgpOworICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8uY2xvc2UoKTsKKworICAgICAgLy8gVGhpcyBjb25uZWN0aW9uIG9iamVjdCBjYW4gbm93IGJlIHJldXNlZC4KKyAgICAgIGxvb3BfLmRpc3Bvc2VDb25uZWN0aW9uKHRoaXMpOworICAgIH0KKworICAgIC8vLyBUaGUgc2VydmVyIHRoaXMgY29ubmVjdGlvbiBiZWxvbmdzIHRvLgorICAgIFROb25ibG9ja2luZ1NlcnZlciBzZXJ2ZXJfOworCisgICAgLy8vIFRoZSB0YXNrIHBvb2wgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLiBUaGlzIGlzIGNhY2hlZCBpbnN0ZWFkIG9mCisgICAgLy8vIGRpcmVjdGx5IHVzaW5nIHNlcnZlcl8udGFza1Bvb2wgdG8gYXZvaWQgY29uZnVzaW9uIGlmIGl0IGlzIGNoYW5nZWQgaW4KKyAgICAvLy8gYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkLgorICAgIFRhc2tQb29sIHRhc2tQb29sXzsKKworICAgIC8vLyBUaGUgSS9PIHRocmVhZCBoYW5kbGluZyB0aGlzIGNvbm5lY3Rpb24uCisgICAgSU9Mb29wIGxvb3BfOworCisgICAgLy8vIFRoZSBzb2NrZXQgbWFuYWdlZCBieSB0aGlzIGNvbm5lY3Rpb24uCisgICAgVFNvY2tldCBzb2NrZXRfOworCisgICAgLy8vIFRoZSBsaWJldmVudCBvYmplY3QgdXNlZCBmb3IgcmVnaXN0ZXJpbmcgdGhlIHdvcmtTb2NrZXRDYWxsYmFjay4KKyAgICBldmVudCogZXZlbnRfOworCisgICAgLy8vIExpYmV2ZW50IGZsYWdzCisgICAgc2hvcnQgZXZlbnRGbGFnc187CisKKyAgICAvLy8gU29ja2V0IG1vZGUKKyAgICBTb2NrZXRTdGF0ZSBzb2NrZXRTdGF0ZV87CisKKyAgICAvLy8gQXBwbGljYXRpb24gc3RhdGUKKyAgICBDb25uZWN0aW9uU3RhdGUgY29ublN0YXRlXzsKKworICAgIC8vLyBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgdG8gcmVhZC4gSWYgc3RpbGwgaW4gUkVBRF9GUkFNRV9TSVpFIHN0YXRlLCBzb21lCisgICAgLy8vIG9mIHRoZSBieXRlcyBtaWdodCBub3QgaGF2ZSBiZWVuIHdyaXR0ZW4sIGFuZCB0aGUgdmFsdWUgbWlnaHQgc3RpbGwgYmUKKyAgICAvLy8gaW4gbmV0d29yayBieXRlIG9yZGVyLiBBbiB1aW50IChub3QgYSBzaXplX3QpIGJlY2F1c2UgdGhlIGZyYW1lIHNpemUgb24KKyAgICAvLy8gdGhlIHdpcmUgaXMgc3BlY2lmaWVkIGFzIG9uZS4KKyAgICB1aW50IHJlYWRXYW50XzsKKworICAgIC8vLyBUaGUgcG9zaXRpb24gaW4gdGhlIHJlYWQgYnVmZmVyLCBpLmUuIHRoZSBudW1iZXIgb2YgcGF5bG9hZCBieXRlcworICAgIC8vLyBhbHJlYWR5IHJlY2VpdmVkIGZyb20gdGhlIHNvY2tldCBpbiBSRUFEX1JFUVVFU1Qgc3RhdGUsIHJlc3AuIHRoZQorICAgIC8vLyBudW1iZXIgb2Ygc2l6ZSBieXRlcyBpbiBSRUFEX0ZSQU1FX1NJWkUgc3RhdGUuCisgICAgdWludCByZWFkQnVmZmVyUG9zXzsKKworICAgIC8vLyBSZWFkIGJ1ZmZlcgorICAgIHVieXRlKiByZWFkQnVmZmVyXzsKKworICAgIC8vLyBSZWFkIGJ1ZmZlciBzaXplCisgICAgc2l6ZV90IHJlYWRCdWZmZXJTaXplXzsKKworICAgIC8vLyBXcml0ZSBidWZmZXIKKyAgICB1Ynl0ZVtdIHdyaXRlQnVmZmVyXzsKKworICAgIC8vLyBIb3cgZmFyIHRocm91Z2ggd3JpdGluZyBhcmUgd2U/CisgICAgc2l6ZV90IHdyaXRlQnVmZmVyUG9zXzsKKworICAgIC8vLyBMYXJnZXN0IHNpemUgb2Ygd3JpdGUgYnVmZmVyIHNlZW4gc2luY2UgYnVmZmVyIHdhcyBjb25zdHJ1Y3RlZAorICAgIHNpemVfdCBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXzsKKworICAgIC8vLyBOdW1iZXIgb2YgY2FsbHMgc2luY2UgdGhlIGxhc3QgdGltZSBjaGVja0lkbGVCdWZmZXJMaW1pdCBoYXMgYmVlbgorICAgIC8vLyBpbnZva2VkIChzZWUgVFNlcnZlci5yZXNpemVCdWZmZXJFdmVyeU4pLgorICAgIHVpbnQgY2FsbHNTaW5jZVJlc2l6ZV87CisKKyAgICAvLy8gQmFzZSB0cmFuc3BvcnRzIHRoZSBwcm9jZXNzb3IgcmVhZHMgZnJvbS93cml0ZXMgdG8uCisgICAgVElucHV0UmFuZ2VUcmFuc3BvcnQhKHVieXRlW10pIGlucHV0VHJhbnNwb3J0XzsKKyAgICBUTWVtb3J5QnVmZmVyIG91dHB1dFRyYW5zcG9ydF87CisKKyAgICAvLy8gVGhlIGFjdHVhbCB0cmFuc3BvcnRzIHBhc3NlZCB0byB0aGUgcHJvY2Vzc29yIG9idGFpbmVkIHZpYSB0aGUKKyAgICAvLy8gdHJhbnNwb3J0IGZhY3RvcnkuCisgICAgVFRyYW5zcG9ydCBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOworICAgIFRUcmFuc3BvcnQgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87IC8vLyBEaXR0bworCisgICAgLy8vIElucHV0L291dHB1dCBwcm90b2NvbHMsIGNvbm5lY3RlZCB0byBmYWN0b3J5e0lucHV0LCBPdXRwdXR9VHJhbnNwb3J0LgorICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sXzsKKyAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2xfOyAvLy8gRGl0dG8uCisKKyAgICAvLy8gQ29ubmVjdGlvbiBjb250ZXh0IG9wdGlvbmFsbHkgY3JlYXRlZCBieSB0aGUgc2VydmVyIGV2ZW50IGhhbmRsZXIuCisgICAgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dF87CisKKyAgICAvLy8gVGhlIHByb2Nlc3NvciB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworICB9Cit9CisKKy8qCisgKiBUaGUgcmVxdWVzdCBwcm9jZXNzaW5nIGZ1bmN0aW9uLCB3aGljaCBpbnZva2VzIHRoZSBwcm9jZXNzb3IgZm9yIHRoZSBzZXJ2ZXIKKyAqIGZvciBhbGwgdGhlIFJQQyBtZXNzYWdlcyByZWNlaXZlZCBvdmVyIGEgY29ubmVjdGlvbi4KKyAqCisgKiBNdXN0IGJlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHBhc3NlZCBhcyBhbGlhcyB0byBzdGQucGFyYWxsZWxpc20udGFzaygpLgorICovCit2b2lkIHByb2Nlc3NSZXF1ZXN0KENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICB0cnkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB3aXRoIChjb25uZWN0aW9uKSB7CisgICAgICAgIGlmIChzZXJ2ZXJfLmV2ZW50SGFuZGxlcikgeworICAgICAgICAgIHNlcnZlcl8uZXZlbnRIYW5kbGVyLnByZVByb2Nlc3MoY29ubmVjdGlvbkNvbnRleHRfLCBzb2NrZXRfKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcHJvY2Vzc29yXy5wcm9jZXNzKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sCisgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHRfKSB8fCAhaW5wdXRQcm90b2NvbF8udHJhbnNwb3J0LnBlZWsoKQorICAgICAgICApIHsKKyAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCBmdW5kYW1lbnRhbGx5IHdyb25nIG9yIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0bworICAgICAgICAgIC8vIHByb2Nlc3MsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CisgIH0KKworICBpZiAoY29ubmVjdGlvbi50YXNrUG9vbF8pIGNvbm5lY3Rpb24ubG9vcF8ubm90aWZ5Q29tcGxldGVkKGNvbm5lY3Rpb24pOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisKKyAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZSBpbmZvIGxvZyBvdXRwdXQgaW4gb3JkZXIgbm90IHRvIHNwYW0gdGhlIHRlc3QgcmVzdWx0cworICAvLyB3aXRoIHN0YXJ0dXAgaW5mbyBtZXNzYWdlcy4KKyAgYXV0byBvbGRJbmZvTG9nU2luayA9IGdfaW5mb0xvZ1Npbms7CisgIGdfaW5mb0xvZ1NpbmsgPSBudWxsOworICBzY29wZSAoZXhpdCkgZ19pbmZvTG9nU2luayA9IG9sZEluZm9Mb2dTaW5rOworCisgIC8vIFRlc3QgaW4tbGluZSBwcm9jZXNzaW5nIHNodXRkb3duIHdpdGggb25lIGFzIHdlbGwgYXMgc2V2ZXJhbCBJL08gdGhyZWFkcy4KKyAgdGVzdFNlcnZlQ2FuY2VsIShUTm9uYmxvY2tpbmdTZXJ2ZXIpKCk7CisgIHRlc3RTZXJ2ZUNhbmNlbCEoVE5vbmJsb2NraW5nU2VydmVyKSgoVE5vbmJsb2NraW5nU2VydmVyIHMpIHsKKyAgICBzLm51bUlPVGhyZWFkcyA9IDQ7CisgIH0pOworCisgIC8vIFRlc3QgdGFzayBwb29sIHByb2Nlc3Npbmcgc2h1dGRvd24gd2l0aCBvbmUgYXMgd2VsbCBhcyBzZXZlcmFsIEkvTyB0aHJlYWRzLgorICBhdXRvIHRwID0gbmV3IFRhc2tQb29sKDQpOworICB0cC5pc0RhZW1vbiA9IHRydWU7CisgIHRlc3RTZXJ2ZUNhbmNlbCEoVE5vbmJsb2NraW5nU2VydmVyKSgoVE5vbmJsb2NraW5nU2VydmVyIHMpIHsKKyAgICBzLnRhc2tQb29sID0gdHA7CisgIH0pOworICB0ZXN0U2VydmVDYW5jZWwhKFROb25ibG9ja2luZ1NlcnZlcikoKFROb25ibG9ja2luZ1NlcnZlciBzKSB7CisgICAgcy50YXNrUG9vbCA9IHRwOworICAgIHMubnVtSU9UaHJlYWRzID0gNDsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYmE0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIuc2ltcGxlOworCitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBUaGUgbW9zdCBiYXNpYyBzZXJ2ZXIuCisgKgorICogSXQgaXMgc2luZ2xlLXRocmVhZGVkIGFuZCBhZnRlciBpdCBhY2NlcHRzIGEgY29ubmVjdGlvbnMsIGl0IHByb2Nlc3NlcworICogcmVxdWVzdHMgb24gaXQgdW50aWwgaXQgY2xvc2VzLCB0aGVuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IGNvbm5lY3Rpb24uCisgKgorICogSXQgaXMgbm90IHNvIG11Y2ggb2YgdXNlIGluIHByb2R1Y3Rpb24gdGhhbiBpdCBpcyBmb3Igd3JpdGluZyB1bml0dGVzdHMsIG9yCisgKiBhcyBhbiBleGFtcGxlIG9uIGhvdyB0byBwcm92aWRlIGEgY3VzdG9tIFRTZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyIHsKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHNlcnZlKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgeworICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQ7CisgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydDsKKyAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sOworICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sOworCisgICAgICB0cnkgeworICAgICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLmFjY2VwdChjYW5jZWxsYXRpb24pOworICAgICAgICBzY29wZShmYWlsdXJlKSBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIH0gY2F0Y2ggKFRDYW5jZWxsZWRFeGNlcHRpb24gdGN4KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGFjY2VwdDogJXMiLCB0dHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNhdWdodCBURXhjZXB0aW9uIG9uIGFjY2VwdDogJXMiLCB0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBhdXRvIGluZm8gPSBUQ29ubmVjdGlvbkluZm8oaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCk7CisgICAgICBhdXRvIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpbmZvKTsKKworICAgICAgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dDsKKyAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPQorICAgICAgICAgIGV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICBldmVudEhhbmRsZXIucHJlUHJvY2Vzcyhjb25uZWN0aW9uQ29udGV4dCwgY2xpZW50KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpIHx8ICFpbnB1dFByb3RvY29sLnRyYW5zcG9ydC5wZWVrKCkKKyAgICAgICAgICApIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IGZ1bmRhbWVudGxseSB3cm9uZyBvciB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8KKyAgICAgICAgICAgIC8vIHByb2Nlc3MsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CisgICAgICB9CisKKyAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgb3V0cHV0UHJvdG9jb2wpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIklucHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiT3V0cHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgICAgfQorICAgIH0KKworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiU2VydmVyIHRyYW5zcG9ydCBmYWlsZWQgdG8gY2xvc2UoKTogJXMiLCBlKTsKKyAgICB9CisgIH0KK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3Quc2VydmVyOworICB0ZXN0U2VydmVDYW5jZWwhVFNpbXBsZVNlcnZlcigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRhc2twb29sOworCitpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnBhcmFsbGVsaXNtOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogQSBzZXJ2ZXIgd2hpY2ggZGlzcGF0Y2hlcyBjbGllbnQgcmVxdWVzdHMgdG8gYSBzdGQucGFyYWxsZWxpc20gVGFza1Bvb2wuCisgKi8KK2NsYXNzIFRUYXNrUG9vbFNlcnZlciA6IFRTZXJ2ZXIgeworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgICBpZiAodGFza1Bvb2wpIHsKKyAgICAgIHRoaXMudGFza1Bvb2wgPSB0YXNrUG9vbDsKKyAgICB9IGVsc2UgeworICAgICAgYXV0byBwdHAgPSBzdGQucGFyYWxsZWxpc20udGFza1Bvb2w7CisgICAgICBpZiAocHRwLnNpemUgPiAwKSB7CisgICAgICAgIHRhc2tQb29sXyA9IHB0cDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBnbG9iYWwgdGFzayBwb29sIGlzIGVtcHR5IChkZWZhdWx0IG9uIGEgc2luZ2xlLWNvcmUgbWFjaGluZSksCisgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCBhIHNpbmdsZSB3b3JrZXIgdGhyZWFkLiBUaGUgcmF0aW9uYWxlIGZvciB0aGlzCisgICAgICAgIC8vIGlzIHRvIGF2b2lkIHRoYXQgYW4gYXBwbGljYXRpb24gd2hpY2ggd29ya2VkIGZpbmUgd2l0aCBubyB0YXNrIHBvb2wKKyAgICAgICAgLy8gZXhwbGljaXRseSBzZXQgb24gdGhlIG11bHRpLWNvcmUgZGV2ZWxvcGVyIGJveGVzIHN1ZGRlbmx5IGZhaWxzIG9uIGEKKyAgICAgICAgLy8gc2luZ2xlLWNvcmUgdXNlciBtYWNoaW5lLgorICAgICAgICB0YXNrUG9vbF8gPSBuZXcgVGFza1Bvb2woMSk7CisgICAgICAgIHRhc2tQb29sXy5pc0RhZW1vbiA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBzZXJ2ZShUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHsKKyAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworCisgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisKKyAgICBhdXRvIHF1ZXVlU3RhdGUgPSBRdWV1ZVN0YXRlKCk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIHN0aWxsIGhhbmRsZSBtb3JlIGNvbm5lY3Rpb25zLgorICAgICAgaWYgKG1heEFjdGl2ZUNvbm5zKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocXVldWVTdGF0ZS5tdXRleCkgeworICAgICAgICAgIHdoaWxlIChxdWV1ZVN0YXRlLmFjdGl2ZUNvbm5zID49IG1heEFjdGl2ZUNvbm5zKSB7CisgICAgICAgICAgICBxdWV1ZVN0YXRlLmNvbm5DbG9zZWQud2FpdCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQ7CisgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydDsKKyAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sOworICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sOworCisgICAgICB0cnkgeworICAgICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLmFjY2VwdChjYW5jZWxsYXRpb24pOworICAgICAgICBzY29wZShmYWlsdXJlKSBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIH0gY2F0Y2ggKFRDYW5jZWxsZWRFeGNlcHRpb24gdGNlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGFjY2VwdDogJXMiLCB0dHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNhdWdodCBURXhjZXB0aW9uIG9uIGFjY2VwdDogJXMiLCB0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBhdXRvIGluZm8gPSBUQ29ubmVjdGlvbkluZm8oaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCk7CisgICAgICBhdXRvIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpbmZvKTsKKworICAgICAgc3luY2hyb25pemVkIChxdWV1ZVN0YXRlLm11dGV4KSB7CisgICAgICAgICsrcXVldWVTdGF0ZS5hY3RpdmVDb25uczsKKyAgICAgIH0KKyAgICAgIHRhc2tQb29sXy5wdXQodGFzayF3b3JrZXIocXVldWVTdGF0ZSwgY2xpZW50LCBpbnB1dFByb3RvY29sLAorICAgICAgICBvdXRwdXRQcm90b2NvbCwgcHJvY2Vzc29yLCBldmVudEhhbmRsZXIpKTsKKyAgICB9CisKKyAgICAvLyBGaXJzdCwgc3RvcCBhY2NlcHRpbmcgbmV3IGNvbm5lY3Rpb25zLgorICAgIHRyeSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiU2VydmVyIHRyYW5zcG9ydCBmYWlsZWQgdG8gY2xvc2U6ICVzIiwgZSk7CisgICAgfQorCisgICAgLy8gVGhlbiwgd2FpdCB1bnRpbCBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zIGFyZSBmaW5pc2hlZC4KKyAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlU3RhdGUubXV0ZXgpIHsKKyAgICAgIHdoaWxlIChxdWV1ZVN0YXRlLmFjdGl2ZUNvbm5zID4gMCkgeworICAgICAgICBxdWV1ZVN0YXRlLmNvbm5DbG9zZWQud2FpdCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0YXNrIHBvb2wgdG8gdXNlLgorICAgKgorICAgKiBCeSBkZWZhdWx0LCB0aGUgZ2xvYmFsIHN0ZC5wYXJhbGxlbGlzbSB0YXNrUG9vbCBpbnN0YW5jZSBpcyB1c2VkLCB3aGljaAorICAgKiBtaWdodCBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIG1hbnkgYXBwbGljYXRpb25zLCBlLmcuIHdoZXJlIHR1bmluZyB0aGUKKyAgICogbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGlzIGRlc2lyZWQuIChPbiBzaW5nbGUtY29yZSBzeXN0ZW1zLCBhIHByaXZhdGUKKyAgICogdGFzayBwb29sIHdpdGggYSBzaW5nbGUgdGhyZWFkIGlzIHVzZWQgYnkgZGVmYXVsdCwgc2luY2UgdGhlIGdsb2JhbAorICAgKiB0YXNrUG9vbCBpbnN0YW5jZSBoYXMgbm8gd29ya2VyIHRocmVhZHMgdGhlbi4pCisgICAqCisgICAqIE5vdGU6IFRUYXNrUG9vbFNlcnZlciBleHBlY3RzIHRoYXQgdGFza3MgYXJlIG5ldmVyIGRyb3BwZWQgZnJvbSB0aGUgcG9vbCwKKyAgICogZS5nLiBieSBjYWxsaW5nIFRhc2tQb29sLmNsb3NlKCkgd2hpbGUgdGhlcmUgYXJlIHN0aWxsIHRhc2tzIGluIHRoZQorICAgKiBxdWV1ZS4gSWYgdGhpcyBoYXBwZW5zLCBzZXJ2ZSgpIHdpbGwgbmV2ZXIgcmV0dXJuLgorICAgKi8KKyAgdm9pZCB0YXNrUG9vbChUYXNrUG9vbCBwb29sKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UocG9vbCAhaXMgbnVsbCwgIkNhbm5vdCB1c2UgYSBudWxsIHRhc2sgcG9vbC4iKTsKKyAgICBlbmZvcmNlKHBvb2wuc2l6ZSA+IDAsICJDYW5ub3QgdXNlIGEgdGFzayBwb29sIHdpdGggbm8gd29ya2VyIHRocmVhZHMuIik7CisgICAgdGFza1Bvb2xfID0gcG9vbDsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50IGNvbm5lY3Rpb25zIG9wZW4gYXQgdGhlIHNhbWUgdGltZS4gWmVybyBmb3IKKyAgICogbm8gbGltaXQsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgorICAgKgorICAgKiBJZiB0aGlzIGxpbWl0IGlzIHJlYWNoZWQsIG5vIGNsaWVudHMgYXJlIGFjY2VwdCgpZWQgZnJvbSB0aGUgc2VydmVyCisgICAqIHRyYW5zcG9ydCBhbnkgbG9uZ2VyIHVudGlsIGFub3RoZXIgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgYWdhaW4uCisgICAqLworICBzaXplX3QgbWF4QWN0aXZlQ29ubnM7CisKK3Byb3RlY3RlZDoKKyAgVGFza1Bvb2wgdGFza1Bvb2xfOworfQorCisvLyBDYW5ub3QgYmUgcHJpdmF0ZSBhcyB3b3JrZXIgaGFzIHRvIGJlIHBhc3NlZCBhcyBhbGlhcyBwYXJhbWV0ZXIgdG8KKy8vIGFub3RoZXIgbW9kdWxlLgorLy8gcHJpdmF0ZSB7CisgIC8qCisgICAqIFRoZSBzdGF0ZSBvZiB0aGUgwrtjb25uZWN0aW9uIHF1ZXVlwqssIGkuZS4gdXNlZCBmb3Iga2VlcGluZyB0cmFjayBvZiBob3cKKyAgICogbWFueSBjbGllbnQgY29ubmVjdGlvbnMgYXJlIGN1cnJlbnRseSBwcm9jZXNzZWQuCisgICAqLworICBzdHJ1Y3QgUXVldWVTdGF0ZSB7CisgICAgLy8vIFByb3RlY3RzIHRoZSBxdWV1ZSBzdGF0ZS4KKyAgICBNdXRleCBtdXRleDsKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBjb25uZWN0aW9ucyAoZnJvbSB0aGUgdGltZSB0aGV5IGFyZSBhY2NlcHQoKWVkCisgICAgLy8vIHVudGlsIHRoZXkgYXJlIGNsb3NlZCB3aGVuIHRoZSB3b3JrZWQgdGFzayBmaW5pc2hlcykuCisgICAgc2l6ZV90IGFjdGl2ZUNvbm5zOworCisgICAgLy8vIFNpZ25hbHMgdGhhdCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjb25uZWN0aW9ucyBoYXMgYmVlbiBkZWNyZWFzZWQsIGkuZS4KKyAgICAvLy8gdGhhdCBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLgorICAgIENvbmRpdGlvbiBjb25uQ2xvc2VkOworCisgICAgLy8vIFJldHVybnMgYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2UuCisgICAgc3RhdGljIFF1ZXVlU3RhdGUgb3BDYWxsKCkgeworICAgICAgUXVldWVTdGF0ZSBxOworICAgICAgcS5tdXRleCA9IG5ldyBNdXRleDsKKyAgICAgIHEuY29ubkNsb3NlZCA9IG5ldyBDb25kaXRpb24ocS5tdXRleCk7CisgICAgICByZXR1cm4gcTsKKyAgICB9CisgIH0KKworICB2b2lkIHdvcmtlcihyZWYgUXVldWVTdGF0ZSBxdWV1ZVN0YXRlLCBUVHJhbnNwb3J0IGNsaWVudCwKKyAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sLAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcikKKyAgeworICAgIHNjb3BlIChleGl0KSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlU3RhdGUubXV0ZXgpIHsKKyAgICAgICAgYXNzZXJ0KHF1ZXVlU3RhdGUuYWN0aXZlQ29ubnMgPiAwKTsKKyAgICAgICAgLS1xdWV1ZVN0YXRlLmFjdGl2ZUNvbm5zOworICAgICAgICBxdWV1ZVN0YXRlLmNvbm5DbG9zZWQubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorCisgICAgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dDsKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICBjb25uZWN0aW9uQ29udGV4dCA9CisgICAgICAgIGV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgIGV2ZW50SGFuZGxlci5wcmVQcm9jZXNzKGNvbm5lY3Rpb25Db250ZXh0LCBjbGllbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCkgfHwgIWlucHV0UHJvdG9jb2wudHJhbnNwb3J0LnBlZWsoKQorICAgICAgICApIHsKKyAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCBmdW5kYW1lbnRsbHkgd3Jvbmcgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvCisgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgICB9CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpbnB1dFByb3RvY29sLnRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiSW5wdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBvdXRwdXRQcm90b2NvbC50cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIk91dHB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiQ2xpZW50IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgfQorLy8gfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisgIHRlc3RTZXJ2ZUNhbmNlbCFUVGFza1Bvb2xTZXJ2ZXIoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGNjODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci50aHJlYWRlZDsKKworaW1wb3J0IGNvcmUudGhyZWFkOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogQSBzaW1wbGUgdGhyZWFkZWQgc2VydmVyIHdoaWNoIHNwYXducyBhIG5ldyB0aHJlYWQgcGVyIGNvbm5lY3Rpb24uCisgKi8KK2NsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIgeworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHNlcnZlKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgeworICAgIHRyeSB7CisgICAgICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZworICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoImxpc3RlbigpIGZhaWxlZDogJXMiLCB0dHgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgYXV0byB3b3JrZXJUaHJlYWRzID0gbmV3IFRocmVhZEdyb3VwKCk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVFRyYW5zcG9ydCBjbGllbnQ7CisgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0OworICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQ7CisgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbDsKKyAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy5hY2NlcHQoY2FuY2VsbGF0aW9uKTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgY2xpZW50LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICBzY29wZShmYWlsdXJlKSBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICBzY29wZShmYWlsdXJlKSBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICB9IGNhdGNoIChUQ2FuY2VsbGVkRXhjZXB0aW9uIHRjZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBhY2NlcHQ6ICVzIiwgdHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJDYXVnaHQgVEV4Y2VwdGlvbiBvbiBhY2NlcHQ6ICVzIiwgdHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYXV0byBpbmZvID0gVENvbm5lY3Rpb25JbmZvKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjbGllbnQpOworICAgICAgYXV0byBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5mbyk7CisgICAgICBhdXRvIHdvcmtlciA9IG5ldyBXb3JrZXJUaHJlYWQoY2xpZW50LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgcHJvY2Vzc29yLCBldmVudEhhbmRsZXIpOworICAgICAgd29ya2VyVGhyZWFkcy5hZGQod29ya2VyKTsKKyAgICAgIHdvcmtlci5zdGFydCgpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiU2VydmVyIHRyYW5zcG9ydCBmYWlsZWQgdG8gY2xvc2U6ICVzIiwgZSk7CisgICAgfQorICAgIHdvcmtlclRocmVhZHMuam9pbkFsbCgpOworICB9Cit9CisKKy8vIFRoZSB3b3JrZXIgdGhyZWFkIGhhbmRsaW5nIGEgY2xpZW50IGNvbm5lY3Rpb24uCitwcml2YXRlIGNsYXNzIFdvcmtlclRocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVFRyYW5zcG9ydCBjbGllbnQsIFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wsCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKQorICB7CisgICAgY2xpZW50XyA9IGNsaWVudDsKKyAgICBpbnB1dFByb3RvY29sXyA9IGlucHV0UHJvdG9jb2w7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gb3V0cHV0UHJvdG9jb2w7CisgICAgcHJvY2Vzc29yXyA9IHByb2Nlc3NvcjsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworCisgICAgc3VwZXIoJnJ1bik7CisgIH0KKworICB2b2lkIHJ1bigpIHsKKyAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0OworICAgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgICBjb25uZWN0aW9uQ29udGV4dCA9CisgICAgICAgIGV2ZW50SGFuZGxlcl8uY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByZVByb2Nlc3MoY29ubmVjdGlvbkNvbnRleHQsIGNsaWVudF8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwcm9jZXNzb3JfLnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCkgfHwgIWlucHV0UHJvdG9jb2xfLnRyYW5zcG9ydC5wZWVrKCkKKyAgICAgICAgKSB7CisgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgZnVuZGFtZW50bGx5IHdyb25nIG9yIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0bworICAgICAgICAgIC8vIHByb2Nlc3MsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CisgICAgfQorCisgICAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICAgIGV2ZW50SGFuZGxlcl8uZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbF8sCisgICAgICAgIG91dHB1dFByb3RvY29sXyk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlucHV0UHJvdG9jb2xfLnRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiSW5wdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBvdXRwdXRQcm90b2NvbF8udHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJPdXRwdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBjbGllbnRfLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJDbGllbnQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIFRUcmFuc3BvcnQgY2xpZW50XzsKKyAgVFByb3RvY29sIGlucHV0UHJvdG9jb2xfOworICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2xfOworICBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87CisgIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyXzsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3Quc2VydmVyOworICB0ZXN0U2VydmVDYW5jZWwhVFRocmVhZGVkU2VydmVyKCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGUxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKKworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKKy8qKgorICogU29tZSBraW5kIG9mIEkvTyBkZXZpY2UgZW5hYmxpbmcgc2VydmVycyB0byBsaXN0ZW4gZm9yIGluY29taW5nIGNsaWVudAorICogY29ubmVjdGlvbnMgYW5kIGNvbW11bmljYXRlIHdpdGggdGhlbSB2aWEgYSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqLworaW50ZXJmYWNlIFRTZXJ2ZXJUcmFuc3BvcnQgeworICAvKioKKyAgICogU3RhcnRzIGxpc3RlbmluZyBmb3Igc2VydmVyIGNvbm5lY3Rpb25zLgorICAgKgorICAgKiBKdXN0IGFzIHNpbWxpYXIgZnVuY3Rpb25zIGNvbW1vbmx5IGZvdW5kIGluIHNvY2tldCBsaWJyYXJpZXMsIHRoaXMKKyAgICogZnVuY3Rpb24gZG9lcyBub3QgYmxvY2suCisgICAqCisgICAqIElmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcsIG5vdGhpbmcgaGFwcGVucy4KKyAgICoKKyAgICogVGhyb3dzOiBUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGxpc3RlbmluZyBmYWlsZWQgb3IgdGhlIHRyYW5zcG9ydAorICAgKiAgIHdhcyBhbHJlYWR5IGxpc3RlbmluZy4KKyAgICovCisgIHZvaWQgbGlzdGVuKCk7CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgc2VydmVyIHRyYW5zcG9ydCwgY2F1c2luZyBpdCB0byBzdG9wIGxpc3RlbmluZy4KKyAgICoKKyAgICogVGhyb3dzOiBUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBsaXN0ZW5pbmcuCisgICAqLworICB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hldGhlciB0aGUgc2VydmVyIHRyYW5zcG9ydCBpcyBjdXJyZW50bHkgbGlzdGVuaW5nLgorICAgKi8KKyAgYm9vbCBpc0xpc3RlbmluZygpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogQWNjZXB0cyBhIGNsaWVudCBjb25uZWN0aW9uIGFuZCByZXR1cm5zIGFuIG9wZW5lZCBUVHJhbnNwb3J0IGZvciBpdCwKKyAgICogbmV2ZXIgcmV0dXJuaW5nIG51bGwuCisgICAqCisgICAqIEJsb2NrcyB1bnRpbCBhIGNsaWVudCBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGNhbmNlbGxhdGlvbiA9IElmIHRyaWdnZXJlZCwgcmVxdWVzdHMgdGhlIGNhbGwgdG8gc3RvcCBibG9ja2luZyBhbmQKKyAgICogICAgIHJldHVybiB3aXRoIGEgVENhbmNlbGxlZEV4Y2VwdGlvbi4gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvCisgICAqICAgICBpZ25vcmUgdGhpcyBpZiB0aGV5IGNhbm5vdCBwcm92aWRlIGEgcmVhc29uYWJsZS4KKyAgICoKKyAgICogVGhyb3dzOiBUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFjY2VwdGluZyBmYWlsZWQsCisgICAqICAgVENhbmNlbGxlZEV4Y2VwdGlvbiBpZiBpdCB3YXMgY2FuY2VsbGVkLgorICAgKi8KKyAgVFRyYW5zcG9ydCBhY2NlcHQoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSBvdXQgKHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQgIWlzIG51bGwpOworICB9Cit9CisKKy8qKgorICogU2VydmVyIHRyYW5zcG9ydCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUeXBlIHsKKyAgICAvLy8KKyAgICBVTktOT1dOLAorCisgICAgLy8vIFRoZSBzZXJ2ZXIgc29ja2V0IGlzIG5vdCBsaXN0ZW5pbmcsIGJ1dCBleGNlcHRlZCB0byBiZS4KKyAgICBOT1RfTElTVEVOSU5HLAorCisgICAgLy8vIFRoZSBzZXJ2ZXIgc29ja2V0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBidXQgZXhwZWN0ZWQgbm90IHRvIGJlLgorICAgIEFMUkVBRFlfTElTVEVOSU5HLAorCisgICAgLy8vIEFuIG9wZXJhdGlvbiBvbiB0aGUgcHJpbWFyeSB1bmRlcmx5aW5nIHJlc291cmNlLCBlLmcuIGEgc29ja2V0IHVzZWQKKyAgICAvLy8gZm9yIGFjY2VwdGluZyBjb25uZWN0aW9ucywgZmFpbGVkLgorICAgIFJFU09VUkNFX0ZBSUxFRAorICB9CisKKyAgLy8vCisgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKKyAgICB0aGlzKGVycm9yTXNnKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgdGhpcyhtc2csIFR5cGUuVU5LTk9XTiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICAvLy8KKyAgVHlwZSB0eXBlKCkgY29uc3Qgbm90aHJvdyBAcHJvcGVydHkgeworICAgIHJldHVybiB0eXBlXzsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFR5cGUgdHlwZV87CisKK3ByaXZhdGU6CisgIHN0cmluZyBlcnJvck1zZyhUeXBlIHR5cGUpIHsKKyAgICBzdHJpbmcgbXNnID0gIlRUcmFuc3BvcnRFeGNlcHRpb246ICI7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFR5cGUuVU5LTk9XTjogbXNnIH49ICJVbmtub3duIHNlcnZlciB0cmFuc3BvcnQgZXhjZXB0aW9uIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuTk9UX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IG5vdCBsaXN0ZW5pbmciOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5BTFJFQURZX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IGFscmVhZHkgbGlzdGVuaW5nIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuUkVTT1VSQ0VfRkFJTEVEOiBtc2cgfj0gIkFuIHVuZGVybHlpbmcgcmVzb3VyY2UgZmFpbGVkIjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBtc2cgfj0gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbXNnOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zb2NrZXQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjZkODBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NvY2tldC5kCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworCitpbXBvcnQgY29yZS50aHJlYWQgOiBkdXIsIER1cmF0aW9uLCBUaHJlYWQ7CitpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmVycm9yOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogdGV4dCwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC51dGlsLmF3YWl0YWJsZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKK3ByaXZhdGUgYWxpYXMgVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiBTVEU7CisKKy8qKgorICogU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LgorICoKKyAqIE1hcHMgdG8gc3RkLnNvY2tldCBsaXN0ZW4oKS9hY2NlcHQoKTsgb25seSBwcm92aWRlcyBUQ1AvSVAgc29ja2V0cyAoaS5lLiBubworICogVW5peCBzb2NrZXRzKSBmb3Igbm93LCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gc3RkLnNvY2tldC4KKyAqLworY2xhc3MgVFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBvcnQgPSBUaGUgVENQIHBvcnQgdG8gbGlzdGVuIGF0IChob3N0IGlzIGFsd2F5cyAwLjAuMC4wKS4KKyAgICogICBzZW5kVGltZW91dCA9IFRoZSBzb2NrZXQgc2VuZGluZyB0aW1lb3V0LgorICAgKiAgIHJlY3ZUaW1vdXQgPSBUaGUgc29ja2V0IHJlY2VpdmluZyB0aW1lb3V0LgorICAgKi8KKyAgdGhpcyh1c2hvcnQgcG9ydCwgRHVyYXRpb24gc2VuZFRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCksCisgICAgRHVyYXRpb24gcmVjdlRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCkpCisgIHsKKyAgICBwb3J0XyA9IHBvcnQ7CisgICAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7CisgICAgcmVjdlRpbWVvdXRfID0gcmVjdlRpbWVvdXQ7CisKKyAgICBjYW5jZWxsYXRpb25Ob3RpZmllcl8gPSBuZXcgVFNvY2tldE5vdGlmaWVyOworCisgICAgc29ja2V0U2V0XyA9IG5ldyBTb2NrZXRTZXQ7CisgIH0KKworICAvLy8gVGhlIHBvcnQgdGhlIHNlcnZlciBzb2NrZXQgbGlzdGVucyBhdC4KKyAgdXNob3J0IHBvcnQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb3J0XzsKKyAgfQorCisgIC8vLyBUaGUgc29ja2V0IHNlbmRpbmcgdGltZW91dCwgemVybyB0byBibG9jayBpbmZpbml0ZWx5LgorICB2b2lkIHNlbmRUaW1lb3V0KER1cmF0aW9uIHNlbmRUaW1lb3V0KSBAcHJvcGVydHkgeworICAgIHNlbmRUaW1lb3V0XyA9IHNlbmRUaW1lb3V0OworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgcmVjZWl2aW5nIHRpbWVvdXQsIHplcm8gdG8gYmxvY2sgaW5maW5pdGVseS4KKyAgdm9pZCByZWN2VGltZW91dChEdXJhdGlvbiByZWN2VGltZW91dCkgQHByb3BlcnR5IHsKKyAgICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKKyAgfQorCisgIC8vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlzdGVuaW5nIHJldHJpZXMgaWYgaXQgZmFpbHMuCisgIHZvaWQgcmV0cnlMaW1pdCh1c2hvcnQgcmV0cnlMaW1pdCkgQHByb3BlcnR5IHsKKyAgICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7CisgIH0KKworICAvLy8gVGhlIGRlbGF5IGJldHdlZW4gYSBsaXN0ZW5pbmcgYXR0ZW1wdCBmYWlsaW5nIGFuZCByZXRyeWluZyBpdC4KKyAgdm9pZCByZXRyeURlbGF5KER1cmF0aW9uIHJldHJ5RGVsYXkpIEBwcm9wZXJ0eSB7CisgICAgcmV0cnlEZWxheV8gPSByZXRyeURlbGF5OworICB9CisKKyAgLy8vIFRoZSBzaXplIG9mIHRoZSBUQ1Agc2VuZCBidWZmZXIsIGluIGJ5dGVzLgorICB2b2lkIHRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIEBwcm9wZXJ0eSB7CisgICAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworICB9CisKKyAgLy8vIFRoZSBzaXplIG9mIHRoZSBUQ1AgcmVjZWl2aW5nIGJ1ZmZlciwgaW4gYnl0ZXMuCisgIHZvaWQgdGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgQHByb3BlcnR5IHsKKyAgICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7CisgIH0KKworICAvLy8gV2hldGhlciB0byBsaXN0ZW4gb24gSVB2NiBvbmx5LCBpZiBJUHY2IHN1cHBvcnQgaXMgZGV0ZWN0ZWQKKyAgLy8vIChkZWZhdWx0OiBmYWxzZSkuCisgIHZvaWQgaXB2Nk9ubHkoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpcHY2T25seV8gPSB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgbGlzdGVuKCkgeworICAgIGVuZm9yY2UoIWlzTGlzdGVuaW5nLCBuZXcgU1RFKFNURS5UeXBlLkFMUkVBRFlfTElTVEVOSU5HKSk7CisKKyAgICBzZXJ2ZXJTb2NrZXRfID0gbWFrZVNvY2tldEFuZExpc3Rlbihwb3J0XywgQUNDRVBUX0JBQ0tMT0csIHJldHJ5TGltaXRfLAorICAgICAgcmV0cnlEZWxheV8sIHRjcFNlbmRCdWZmZXJfLCB0Y3BSZWN2QnVmZmVyXywgaXB2Nk9ubHlfKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgZW5mb3JjZShpc0xpc3RlbmluZywgbmV3IFNURShTVEUuVHlwZS5OT1RfTElTVEVOSU5HKSk7CisKKyAgICBzZXJ2ZXJTb2NrZXRfLnNodXRkb3duKFNvY2tldFNodXRkb3duLkJPVEgpOworICAgIHNlcnZlclNvY2tldF8uY2xvc2UoKTsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNMaXN0ZW5pbmcoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBzZXJ2ZXJTb2NrZXRfICFpcyBudWxsOworICB9CisKKyAgLy8vIE51bWJlciBvZiBjb25uZWN0aW9ucyBsaXN0ZW4oKSBiYWNrbG9ncy4KKyAgZW51bSBBQ0NFUFRfQkFDS0xPRyA9IDEwMjQ7CisKKyAgb3ZlcnJpZGUgVFRyYW5zcG9ydCBhY2NlcHQoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgZW5mb3JjZShpc0xpc3RlbmluZywgbmV3IFNURShTVEUuVHlwZS5OT1RfTElTVEVOSU5HKSk7CisKKyAgICBpZiAoY2FuY2VsbGF0aW9uKSBjYW5jZWxsYXRpb25Ob3RpZmllcl8uYXR0YWNoKGNhbmNlbGxhdGlvbi50cmlnZ2VyaW5nKTsKKyAgICBzY29wZSAoZXhpdCkgaWYgKGNhbmNlbGxhdGlvbikgY2FuY2VsbGF0aW9uTm90aWZpZXJfLmRldGFjaCgpOworCisKKyAgICAvLyBUb28gbWFueSBFSU5UUnMgaXMgYSBmYXVsdCBjb25kaXRpb24gYW5kIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZAorICAgIC8vIG1hbnVhbGx5IGJ5IG91ciBjYWxsZXIsIGJ1dCB3ZSBjYW4gdG9sZXJhdGUgYSBjZXJ0YWluIG51bWJlci4KKyAgICBlbnVtIE1BWF9FSU5UUlMgPSAxMDsKKyAgICB1aW50IG51bUVpbnRyczsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzb2NrZXRTZXRfLnJlc2V0KCk7CisgICAgICBzb2NrZXRTZXRfLmFkZChzZXJ2ZXJTb2NrZXRfKTsKKyAgICAgIHNvY2tldFNldF8uYWRkKGNhbmNlbGxhdGlvbk5vdGlmaWVyXy5zb2NrZXQpOworCisgICAgICBhdXRvIHJldCA9IFNvY2tldC5zZWxlY3Qoc29ja2V0U2V0XywgbnVsbCwgbnVsbCk7CisgICAgICBlbmZvcmNlKHJldCAhPSAwLCBuZXcgU1RFKCJTb2NrZXQuc2VsZWN0KCkgcmV0dXJuZWQgMC4iLAorICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpKTsKKworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgLy8gU2VsZWN0IGl0c2VsZiBmYWlsZWQsIGNoZWNrIGlmIGl0IHdhcyBqdXN0IGR1ZSB0byBhbiBpbnRlcnJ1cHRlZAorICAgICAgICAvLyBzeXNjYWxsLgorICAgICAgICBpZiAoZ2V0U29ja2V0RXJybm8oKSA9PSBJTlRFUlJVUFRFRF9FUlJOTykgeworICAgICAgICAgIGlmIChudW1FaW50cnMrKyA8IE1BWF9FSU5UUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1RFKCJTb2NrZXQuc2VsZWN0KCkgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIChFSU5UUikgIiB+CisgICAgICAgICAgICAgICJtb3JlIHRoYW4gIiB+IHRvIXN0cmluZyhNQVhfRUlOVFJTKSB+ICIgdGltZXMuIiwKKyAgICAgICAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVECisgICAgICAgICAgICApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgU1RFKCJVbmtub3duIGVycm9yIG9uIFNvY2tldC5zZWxlY3QoKTogIiB+CisgICAgICAgICAgc29ja2V0RXJybm9TdHJpbmcoZ2V0U29ja2V0RXJybm8oKSksIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayBmb3IgYSBwaW5nIG9uIHRoZSBpbnRlcnJ1cHQgc29ja2V0LgorICAgICAgICBpZiAoc29ja2V0U2V0Xy5pc1NldChjYW5jZWxsYXRpb25Ob3RpZmllcl8uc29ja2V0KSkgeworICAgICAgICAgIGNhbmNlbGxhdGlvbi50aHJvd0lmVHJpZ2dlcmVkKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgc29ja2V0IGhhdmluZyBhIGNvbm5lY3Rpb24gd2FpdGluZy4KKyAgICAgICAgaWYgKHNvY2tldFNldF8uaXNTZXQoc2VydmVyU29ja2V0XykpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRyeSB7CisgICAgICBhdXRvIGNsaWVudCA9IGNyZWF0ZVRTb2NrZXQoc2VydmVyU29ja2V0Xy5hY2NlcHQoKSk7CisgICAgICBjbGllbnQuc2VuZFRpbWVvdXQgPSBzZW5kVGltZW91dF87CisgICAgICBjbGllbnQucmVjdlRpbWVvdXQgPSByZWN2VGltZW91dF87CisgICAgICByZXR1cm4gY2xpZW50OworICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgU1RFKCJVbmtub3duIGVycm9yIG9uIGFjY2VwdGluZzogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogQWxsb3dzIGRlcml2ZWQgY2xhc3NlcyB0byBjcmVhdGUgYSBkaWZmZXJlbnQgVFNvY2tldCB0eXBlLgorICAgKi8KKyAgVFNvY2tldCBjcmVhdGVUU29ja2V0KFNvY2tldCBzb2NrZXQpIHsKKyAgICByZXR1cm4gbmV3IFRTb2NrZXQoc29ja2V0KTsKKyAgfQorCitwcml2YXRlOgorICB1c2hvcnQgcG9ydF87CisgIER1cmF0aW9uIHNlbmRUaW1lb3V0XzsKKyAgRHVyYXRpb24gcmVjdlRpbWVvdXRfOworICB1c2hvcnQgcmV0cnlMaW1pdF87CisgIER1cmF0aW9uIHJldHJ5RGVsYXlfOworICB1aW50IHRjcFNlbmRCdWZmZXJfOworICB1aW50IHRjcFJlY3ZCdWZmZXJfOworICBib29sIGlwdjZPbmx5XzsKKworICBTb2NrZXQgc2VydmVyU29ja2V0XzsKKyAgVFNvY2tldE5vdGlmaWVyIGNhbmNlbGxhdGlvbk5vdGlmaWVyXzsKKworICAvLyBLZWVwIHNvY2tldCBzZXQgYmV0d2VlbiBhY2NlcHQoKSBjYWxscyB0byBhdm9pZCByZWFsbG9jYXRpbmcuCisgIFNvY2tldFNldCBzb2NrZXRTZXRfOworfQorCitTb2NrZXQgbWFrZVNvY2tldEFuZExpc3Rlbih1c2hvcnQgcG9ydCwgaW50IGJhY2tsb2csIHVzaG9ydCByZXRyeUxpbWl0LAorICBEdXJhdGlvbiByZXRyeURlbGF5LCB1aW50IHRjcFNlbmRCdWZmZXIgPSAwLCB1aW50IHRjcFJlY3ZCdWZmZXIgPSAwLAorICBib29sIGlwdjZPbmx5ID0gZmFsc2UKKykgeworICBBZGRyZXNzIGxvY2FsQWRkcjsKKyAgdHJ5IHsKKyAgICAvLyBudWxsIHJlcHJlc2VudHMgdGhlIHdpbGRjYXJkIGFkZHJlc3MuCisgICAgYXV0byBhZGRySW5mb3MgPSBnZXRBZGRyZXNzSW5mbyhudWxsLCB0byFzdHJpbmcocG9ydCksCisgICAgICBBZGRyZXNzSW5mb0ZsYWdzLlBBU1NJVkUsIFNvY2tldFR5cGUuU1RSRUFNLCBQcm90b2NvbFR5cGUuVENQKTsKKyAgICBmb3JlYWNoIChpLCBhaTsgYWRkckluZm9zKSB7CisgICAgICAvLyBQcmVmZXIgdG8gYmluZCB0byBJUHY2IGFkZHJlc3NlcywgYmVjYXVzZSB0aGVuIElQdjQgaXMgbGlzdGVuZWQgdG8gYXMKKyAgICAgIC8vIHdlbGwsIGJ1dCBub3QgdGhlIG90aGVyIHdheSByb3VuZC4KKyAgICAgIGlmIChhaS5mYW1pbHkgPT0gQWRkcmVzc0ZhbWlseS5JTkVUNiB8fCBpID09IChhZGRySW5mb3MubGVuZ3RoIC0gMSkpIHsKKyAgICAgICAgbG9jYWxBZGRyID0gYWkuYWRkcmVzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBkZXRlcm1pbmUgbG9jYWwgYWRkcmVzcyB0byBsaXN0ZW4gb24uIiwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCwgX19GSUxFX18sIF9fTElORV9fLCBlKTsKKyAgfQorCisgIFNvY2tldCBzb2NrZXQ7CisgIHRyeSB7CisgICAgc29ja2V0ID0gbmV3IFNvY2tldChsb2NhbEFkZHIuYWRkcmVzc0ZhbWlseSwgU29ja2V0VHlwZS5TVFJFQU0sCisgICAgICBQcm90b2NvbFR5cGUuVENQKTsKKyAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3QgY3JlYXRlIGFjY2VwdGluZyBzb2NrZXQ6ICIgfiB0byFzdHJpbmcoZSksCisgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICB9CisKKyAgdHJ5IHsKKyAgICBzb2NrZXQuc2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLklQVjYsIFNvY2tldE9wdGlvbi5JUFY2X1Y2T05MWSwgaXB2Nk9ubHkpOworICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgIC8vIFRoaXMgaXMgc29tZXdoYXQgZXhwZWN0ZWQgb24gb2xkZXIgc3lzdGVtcyAoZS5nLiBwcmUtVmlzdGEgV2luZG93cyksCisgICAgLy8gd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIElQVjZfVjZPTkxZIGZsYWcgeWV0LiBSYWN5IGZsYWcganVzdCB0byBhdm9pZAorICAgIC8vIGxvZyBzcGV3IGluIHVuaXQgdGVzdHMuCisgICAgc2hhcmVkIHN0YXRpYyB3YXJuZWQgPSBmYWxzZTsKKyAgICBpZiAoIXdhcm5lZCkgeworICAgICAgbG9nRXJyb3IoIkNvdWxkIG5vdCBzZXQgSVBWNl9WNk9OTFkgc29ja2V0IG9wdGlvbjogJXMiLCBlKTsKKyAgICAgIHdhcm5lZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgYWxpYXMgU29ja2V0T3B0aW9uTGV2ZWwuU09DS0VUIGx2bFNvY2s7CisKKyAgLy8gUHJldmVudCAyIG1heGltdW0gc2VnZW1lbnQgbGlmZXRpbWUgZGVsYXkgb24gYWNjZXB0LgorICB0cnkgeworICAgIHNvY2tldC5zZXRPcHRpb24obHZsU29jaywgU29ja2V0T3B0aW9uLlJFVVNFQUREUiwgdHJ1ZSk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IHNldCBSRVVTRUFERFIgc29ja2V0IG9wdGlvbjogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcy4KKyAgaWYgKHRjcFNlbmRCdWZmZXIgPiAwKSB7CisgICAgdHJ5IHsKKyAgICAgIHNvY2tldC5zZXRPcHRpb24obHZsU29jaywgU29ja2V0T3B0aW9uLlNOREJVRiwgdGNwU2VuZEJ1ZmZlcik7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBzZXQgc29ja2V0IHNlbmQgYnVmZmVyIHNpemU6ICIgfiB0byFzdHJpbmcoZSksCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgfQorICB9CisKKyAgaWYgKHRjcFJlY3ZCdWZmZXIgPiAwKSB7CisgICAgdHJ5IHsKKyAgICAgIHNvY2tldC5zZXRPcHRpb24obHZsU29jaywgU29ja2V0T3B0aW9uLlJDVkJVRiwgdGNwUmVjdkJ1ZmZlcik7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBzZXQgcmVjZWl2ZSBzZW5kIGJ1ZmZlciBzaXplOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICAgIH0KKyAgfQorCisgIC8vIFR1cm4gbGluZ2VyIG9mZiB0byBhdm9pZCBibG9ja2luZyBvbiBzb2NrZXQgY2xvc2UuCisgIHRyeSB7CisgICAgTGluZ2VyIGw7CisgICAgbC5vbiA9IDA7CisgICAgbC50aW1lID0gMDsKKyAgICBzb2NrZXQuc2V0T3B0aW9uKGx2bFNvY2ssIFNvY2tldE9wdGlvbi5MSU5HRVIsIGwpOworICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBkaXNhYmxlIHNvY2tldCBsaW5nZXI6ICIgfiB0byFzdHJpbmcoZSksCisgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICB9CisKKyAgLy8gU2V0IFRDUF9OT0RFTEFZLgorICB0cnkgeworICAgIHNvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuVENQLCBTb2NrZXRPcHRpb24uVENQX05PREVMQVksIHRydWUpOworICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgfQorCisgIHVzaG9ydCByZXRyaWVzOworICB3aGlsZSAodHJ1ZSkgeworICAgIHRyeSB7CisgICAgICBzb2NrZXQuYmluZChsb2NhbEFkZHIpOworICAgICAgYnJlYWs7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uKSB7fQorCisgICAgLy8gSWYgYmluZCgpIHdvcmtlZCwgd2UgYnJlYWtlZCBvdXRzaWRlIHRoZSBsb29wIGFib3ZlLgorICAgIHJldHJpZXMrKzsKKyAgICBpZiAocmV0cmllcyA8IHJldHJ5TGltaXQpIHsKKyAgICAgIFRocmVhZC5zbGVlcChyZXRyeURlbGF5KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFNURSh0ZXh0KCJDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzOiAiLCBsb2NhbEFkZHIpLAorICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICAgIH0KKyAgfQorCisgIHNvY2tldC5saXN0ZW4oYmFja2xvZyk7CisgIHJldHVybiBzb2NrZXQ7Cit9CisKK3VuaXR0ZXN0IHsKKyAgLy8gVGVzdCBpbnRlcnJ1cHQoKS4KKyAgeworICAgIGF1dG8gc29jayA9IG5ldyBUU2VydmVyU29ja2V0KDApOworICAgIHNvY2subGlzdGVuKCk7CisgICAgc2NvcGUgKGV4aXQpIHNvY2suY2xvc2UoKTsKKworICAgIGF1dG8gY2FuY2VsbGF0aW9uID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisKKyAgICBhdXRvIGludFRocmVhZCA9IG5ldyBUaHJlYWQoeworICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IHVudGlsIHRoZSBzb2NrZXQgaXMgYWNjZXB0aW5nLgorICAgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDUwKSk7CisgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcigpOworICAgIH0pOworICAgIGludFRocmVhZC5zdGFydCgpOworCisgICAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgICAgYXNzZXJ0VGhyb3duIVRDYW5jZWxsZWRFeGNlcHRpb24oc29jay5hY2NlcHQoY2FuY2VsbGF0aW9uKSk7CisgIH0KKworICAvLyBUZXN0IHJlY2VpdmUoKSB0aW1lb3V0IG9uIGFjY2VwdGVkIGNsaWVudCBzb2NrZXRzLgorICB7CisgICAgaW1tdXRhYmxlIHBvcnQgPSAxMTEyMjsKKyAgICBhdXRvIHRpbWVvdXQgPSBkdXIhIm1zZWNzIig1MDApOworICAgIGF1dG8gc2VydmVyU29jayA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIHRpbWVvdXQsIHRpbWVvdXQpOworICAgIHNlcnZlclNvY2subGlzdGVuKCk7CisgICAgc2NvcGUgKGV4aXQpIHNlcnZlclNvY2suY2xvc2UoKTsKKworICAgIGF1dG8gY2xpZW50U29jayA9IG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KTsKKyAgICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgY2xpZW50U29jay5jbG9zZSgpOworCisgICAgc2hhcmVkIGJvb2wgaGFzVGltZWRPdXQ7CisgICAgYXV0byByZWN2VGhyZWFkID0gbmV3IFRocmVhZCh7CisgICAgICBhdXRvIHNvY2sgPSBzZXJ2ZXJTb2NrLmFjY2VwdCgpOworICAgICAgdWJ5dGVbMV0gZGF0YTsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2sucmVhZChkYXRhKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoZS50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5USU1FRF9PVVQpIHsKKyAgICAgICAgICBoYXNUaW1lZE91dCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW1wb3J0IHN0ZC5zdGRpbzsKKyAgICAgICAgICBzdGRlcnIud3JpdGVsbihlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIHJlY3ZUaHJlYWQuaXNEYWVtb24gPSB0cnVlOworICAgIHJlY3ZUaHJlYWQuc3RhcnQoKTsKKworICAgIC8vIFdhaXQgZm9yIHRoZSB0aW1lb3V0LCB3aXRoIGEgbGl0dGxlIGJpdCBvZiBzcGFyZSB0aW1lLgorICAgIFRocmVhZC5zbGVlcCh0aW1lb3V0ICsgZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKGhhc1RpbWVkT3V0LAorICAgICAgIkNsaWVudCBzb2NrZXQgcmVjZWl2ZSgpIGJsb2NrZWQgZm9yIGxvbmdlciB0aGFuIHJlY3ZUaW1lb3V0LiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc3NsLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkOWQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zc2wuZApAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc3NsOworCitpbXBvcnQgc3RkLmRhdGV0aW1lIDogRHVyYXRpb247CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldCA6IFNvY2tldDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworCisvKioKKyAqIEEgc2VydmVyIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB1c2luZyBTU0wtZW5jcnlwdGVkIHNvY2tldHMuCisgKgorICogTm90ZToKKyAqIE9uIFBvc2l4IHN5c3RlbXMgd2hpY2ggZG8gbm90IGhhdmUgdGhlIEJTRC1zcGVjaWZpYyBTT19OT1NJR1BJUEUgZmxhZywgeW91CisgKiBtaWdodCB3YW50IHRvIGlnbm9yZSB0aGUgU0lHUElQRSBzaWduYWwsIGFzIE9wZW5TU0wgbWlnaHQgdHJ5IHRvIHdyaXRlIHRvCisgKiBhIGNsb3NlZCBzb2NrZXQgaWYgdGhlIHBlZXIgZGlzY29ubmVjdHMgYWJydXB0bHk6CisgKiAtLS0KKyAqIGltcG9ydCBjb3JlLnN0ZGMuc2lnbmFsOworICogaW1wb3J0IGNvcmUuc3lzLnBvc2l4LnNpZ25hbDsKKyAqIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAqIC0tLQorICoKKyAqIFNlZTogdGhyaWZ0LnRyYW5zcG9ydC5zc2wuCisgKi8KK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyU29ja2V0IHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgVFNTTFNlcnZlclNvY2tldC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBvcnQgPSBUaGUgcG9ydCBvbiB3aGljaCB0byBsaXN0ZW4uCisgICAqICAgc3NsQ29udGV4dCA9IFRoZSBUU1NMQ29udGV4dCB0byB1c2UgZm9yIGNyZWF0aW5nIGNsaWVudAorICAgKiAgICAgc29ja2V0cy4gTXVzdCBiZSBpbiBzZXJ2ZXItc2lkZSBtb2RlLgorICAgKi8KKyAgdGhpcyh1c2hvcnQgcG9ydCwgVFNTTENvbnRleHQgc3NsQ29udGV4dCkgeworICAgIHN1cGVyKHBvcnQpOworICAgIHNldFNTTENvbnRleHQoc3NsQ29udGV4dCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUU1NMU2VydmVyU29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcG9ydCA9IFRoZSBwb3J0IG9uIHdoaWNoIHRvIGxpc3Rlbi4KKyAgICogICBzZW5kVGltZW91dCA9IFRoZSBzZW5kIHRpbWVvdXQgdG8gc2V0IG9uIHRoZSBjbGllbnQgc29ja2V0cy4KKyAgICogICByZWN2VGltZW91dCA9IFRoZSByZWNlaXZlIHRpbWVvdXQgdG8gc2V0IG9uIHRoZSBjbGllbnQgc29ja2V0cy4KKyAgICogICBzc2xDb250ZXh0ID0gVGhlIFRTU0xDb250ZXh0IHRvIHVzZSBmb3IgY3JlYXRpbmcgY2xpZW50CisgICAqICAgICBzb2NrZXRzLiBNdXN0IGJlIGluIHNlcnZlci1zaWRlIG1vZGUuCisgICAqLworICB0aGlzKHVzaG9ydCBwb3J0LCBEdXJhdGlvbiBzZW5kVGltZW91dCwgRHVyYXRpb24gcmVjdlRpbWVvdXQsCisgICAgVFNTTENvbnRleHQgc3NsQ29udGV4dCkKKyAgeworICAgIHN1cGVyKHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCk7CisgICAgc2V0U1NMQ29udGV4dChzc2xDb250ZXh0KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIG92ZXJyaWRlIFRTb2NrZXQgY3JlYXRlVFNvY2tldChTb2NrZXQgc29ja2V0KSB7CisgICAgcmV0dXJuIG5ldyBUU1NMU29ja2V0KHNzbENvbnRleHRfLCBzb2NrZXQpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgc2V0U1NMQ29udGV4dChUU1NMQ29udGV4dCBzc2xDb250ZXh0KSB7CisgICAgZW5mb3JjZShzc2xDb250ZXh0LnNlcnZlclNpZGUsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIk5lZWQgc2VydmVyLXNpZGUgU1NMIHNvY2tldCBmYWN0b3J5IGZvciBUU1NMU2VydmVyU29ja2V0IikpOworICAgIHNzbENvbnRleHRfID0gc3NsQ29udGV4dDsKKyAgfQorCisgIFRTU0xDb250ZXh0IHNzbENvbnRleHRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzZhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlLmQKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKK2ltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RyZXJyb3I7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0OworaW1wb3J0IHRocmlmdC5iYXNlOworCisvKioKKyAqIEFuIGVudGl0eSBkYXRhIGNhbiBiZSByZWFkIGZyb20gYW5kL29yIHdyaXR0ZW4gdG8uCisgKgorICogQSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIG1heSBjYXBhYmxlIG9mIGVpdGhlciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dAorICogbm90IG5lY2Vzc2FyaWx5IGJvdGguCisgKi8KK2ludGVyZmFjZSBUVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICoKKyAgICogSWYgYSB0cmFuc3BvcnQgaXMgY2xvc2VkLCBpdCBjYW4gYmUgb3BlbmVkIGJ5IGNhbGxpbmcgb3BlbigpLCBhbmQgdmljZQorICAgKiB2ZXJzYSBmb3IgY2xvc2UoKS4KKyAgICoKKyAgICogV2hpbGUgYSB0cmFuc3BvcnQgc2hvdWxkIGFsd2F5cyBiZSBvcGVuIHdoZW4gdHJ5aW5nIHRvIHJlYWQvd3JpdGUgZGF0YSwKKyAgICogdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIGRvIG5vdCBuZWNlc3NhcmlseSBmYWlsIHdoZW4gY2FsbGVkIGZvciBhIGNsb3NlZAorICAgKiB0cmFuc3BvcnQuIFNpdHVhdGlvbnMgbGlrZSB0aGlzIGNvdWxkIG9jY3VyIGUuZy4gd2l0aCBhIHdyYXBwZXIKKyAgICogdHJhbnNwb3J0IHdoaWNoIGJ1ZmZlcnMgZGF0YSB3aGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBoYXMgYWxyZWFkeQorICAgKiBiZWVuIGNsb3NlZCAocG9zc2libHkgYmVjYXVzZSB0aGUgY29ubmVjdGlvbiB3YXMgYWJydXB0bHkgY2xvc2VkKSwgYnV0CisgICAqIHRoZXJlIGlzIHN0aWxsIGRhdGEgbGVmdCB0byBiZSByZWFkIGluIHRoZSBidWZmZXJzLiBUaGlzIGNob2ljZSBoYXMgYmVlbgorICAgKiBtYWRlIHRvIHNpbXBsaWZ5IHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMsIGluIHRlcm1zIG9mIGJvdGggIGNvZGUKKyAgICogY29tcGxleGl0eSBhbmQgcnVudGltZSBvdmVyaGVhZC4KKyAgICovCisgIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcworICAgKiBzdGlsbCBvcGVuLgorICAgKgorICAgKiBBIHR5cGljYWwgdXNlIGNhc2Ugd291bGQgYmUgYSBzZXJ2ZXIgY2hlY2tpbmcgaWYgaXQgc2hvdWxkIHByb2Nlc3MKKyAgICogYW5vdGhlciByZXF1ZXN0IG9uIHRoZSB0cmFuc3BvcnQuCisgICAqLworICBib29sIHBlZWsoKTsKKworICAvKioKKyAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbnMuCisgICAqCisgICAqIElmIHRoZSB0cmFuc3BvcnQgaXMgYWxyZWFkeSBvcGVuLCBub3RoaW5nIGhhcHBlbnMuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBvcGVuaW5nIGZhaWxzLgorICAgKi8KKyAgdm9pZCBvcGVuKCk7CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICAgKgorICAgKiBJZiB0aGUgdHJhbnNwb3J0IGlzIG5vdCBvcGVuLCBub3RoaW5nIGhhcHBlbnMuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjbG9zaW5nIGZhaWxzLgorICAgKi8KKyAgdm9pZCBjbG9zZSgpOworCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byBmaWxsIHRoZSBnaXZlbiBidWZmZXIgYnkgcmVhZGluZyBkYXRhLgorICAgKgorICAgKiBGb3IgcG90ZW50aWFsbHkgYmxvY2tpbmcgZGF0YSBzb3VyY2VzIChlLmcuIHNvY2tldHMpLCByZWFkKCkgd2lsbCBvbmx5CisgICAqIGJsb2NrIGlmIG5vIGRhdGEgaXMgYXZhaWxhYmxlIGF0IGFsbC4gSWYgdGhlcmUgaXMgc29tZSBkYXRhIGF2YWlsYWJsZSwKKyAgICogYnV0IHdhaXRpbmcgZm9yIG5ldyBkYXRhIHRvIGFycml2ZSB3b3VsZCBiZSByZXF1aXJlZCB0byBmaWxsIHRoZSB3aG9sZQorICAgKiBidWZmZXIsIHRoZSByZWFkaWx5IGF2YWlsYWJsZSBkYXRhIHdpbGwgYmUgaW1tZWRpYXRlbHkgcmV0dXJuZWQg4oCTIHVzZQorICAgKiByZWFkQWxsKCkgaWYgeW91IHdhbnQgdG8gd2FpdCB1bnRpbCB0aGUgd2hvbGUgYnVmZmVyIGlzIGZpbGxlZC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIHRvIHVzZSBhcyBidWZmZXIuCisgICAqCisgICAqIFJldHVybnM6IEhvdyBtYW55IGJ5dGVzIHdlcmUgYWN0dWFsbHkgcmVhZAorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpOworCisgIC8qKgorICAgKiBGaWxscyB0aGUgZ2l2ZW4gYnVmZmVyIGJ5IHJlYWRpbmcgZGF0YSBpbnRvIGl0LCBmYWlsaW5nIGlmIG5vdCBlbm91Z2gKKyAgICogZGF0YSBpcyBhdmFpbGFibGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSB0byB1c2UgYXMgYnVmZmVyLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgaW5zdWZmaWNpZW50IGRhdGEgaXMgYXZhaWxhYmxlIG9yIHJlYWRpbmcKKyAgICogICBmYWlscyBhbHRvZ2V0aGVyLgorICAgKi8KKyAgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKTsKKworICAvKioKKyAgICogTXVzdCBiZSBjYWxsZWQgYnkgY2xpZW50cyB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgorICAgKgorICAgKiBJbXBsZW1lbnRhdGlvbnMgY2FuIGNob29zZSB0byBwZXJmb3JtIGEgdHJhbnNwb3J0LXNwZWNpZmljIGFjdGlvbiwgZS5nLgorICAgKiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZS4KKyAgICoKKyAgICogUmV0dXJuczogVGhlIG51bWJlciBvZiBieXRlcyByZWFkIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuCisgICAqLworICBzaXplX3QgcmVhZEVuZCgpOworCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIHBhc3NlZCBzbGljZSBvZiBkYXRhLgorICAgKgorICAgKiBOb3RlOiBZb3UgbXVzdCBjYWxsIGZsdXNoKCkgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4sCisgICAqIGFuZCBhdmFpbGFibGUgdG8gYmUgcmVhZCBiYWNrIGluIHRoZSBmdXR1cmUuICBEZXN0cm95aW5nIGEgVFRyYW5zcG9ydAorICAgKiBvYmplY3QgZG9lcyBub3QgYXV0b21hdGljYWxseSBmbHVzaCBwZW5kaW5nIGRhdGEg4oCTIGlmIHlvdSBkZXN0cm95IGEKKyAgICogVFRyYW5zcG9ydCBvYmplY3Qgd2l0aCB3cml0dGVuIGJ1dCB1bmZsdXNoZWQgZGF0YSwgdGhhdCBkYXRhIG1heSBiZQorICAgKiBkaXNjYXJkZWQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSBvZiBkYXRhIHRvIHdyaXRlLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1Zik7CisKKyAgLyoqCisgICAqIE11c3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZWQuCisgICAqCisgICAqIEltcGxlbWVudGF0aW9ucyBjYW4gY2hvb3NlIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uLCBlLmcuCisgICAqIGxvZ2dpbmcgdGhlIHJlcXVlc3QgdG8gYSBmaWxlLgorICAgKgorICAgKiBSZXR1cm5zOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4KKyAgICovCisgIHNpemVfdCB3cml0ZUVuZCgpOworCisgIC8qKgorICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICoKKyAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3RydWN0aW9uIHRvIGVuc3VyZSB3cml0ZXMgYXJlIGFjdHVhbGx5IGNvbXBsZXRlLAorICAgKiBvdGhlcndpc2UgcGVuZGluZyBkYXRhIG1heSBiZSBkaXNjYXJkZWQuIFR5cGljYWxseSB1c2VkIHdpdGggYnVmZmVyZWQKKyAgICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICB2b2lkIGZsdXNoKCk7CisKKyAgLyoqCisgICAqIEF0dGVtcHRzIHRvIHJldHVybiBhIHNsaWNlIG9mIDxjb2RlPmxlbjwvY29kZT4gYnl0ZXMgb2YgaW5jb21pbmcgZGF0YSwKKyAgICogcG9zc2libHkgY29waWVkIGludG8gYnVmLCBub3QgY29uc3VtaW5nIHRoZW0gKGkuZS46IGEgbGF0ZXIgcmVhZCB3aWxsCisgICAqIHJldHVybiB0aGUgc2FtZSBkYXRhKS4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gc3VwcG9ydCBwcm90b2NvbHMgdGhhdCBuZWVkIHRvIHJlYWQgdmFyaWFibGUtCisgICAqIGxlbmd0aCBmaWVsZHMuIFRoZXkgY2FuIGF0dGVtcHQgdG8gYm9ycm93IHRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRoYXQKKyAgICogdGhleSB3aWxsIG5lZWQsIHRoZW4gPGNvZGU+Y29uc3VtZSgpPC9jb2RlPiB3aGF0IHRoZXkgYWN0dWFsbHkgdXNlLiBTb21lCisgICAqIHRyYW5zcG9ydHMgd2lsbCBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCBhbmQgb3RoZXJzIHdpbGwgZmFpbCBvY2Nhc2lvbmFsbHksCisgICAqIHNvIHByb3RvY29scyBtdXN0IGJlIHByZXBhcmVkIHRvIGZhbGwgYmFjayB0byA8Y29kZT5yZWFkKCk8L2NvZGU+IGlmCisgICAqIGJvcnJvdyBmYWlscy4KKyAgICoKKyAgICogVGhlIHRyYW5zcG9ydCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBBIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSBjYW4gYmUgc3RvcmVkIGlmIG5lZWRlZCwgb3IgbnVsbCB0bworICAgKiAgICAgaW5kaWNhdGUgdGhhdCB0aGUgY2FsbGVyIGlzIG5vdCBzdXBwbHlpbmcgc3RvcmFnZSwgYnV0IHdvdWxkIGxpa2UgYQorICAgKiAgICAgc2xpY2Ugb2YgYW4gaW50ZXJuYWwgYnVmZmVyLCBpZiBhdmFpbGFibGUuCisgICAqICAgbGVuID0gVGhlIG51bWJlciBvZiBieXRlcyB0byBib3Jyb3cuCisgICAqCisgICAqIFJldHVybnM6IElmIHRoZSBib3Jyb3cgc3VjY2VlZHMsIGEgc2xpY2UgY29udGFpbmluZyB0aGUgYm9ycm93ZWQgZGF0YSwKKyAgICogICBudWxsIG90aGVyd2lzZS4gVGhlIHNsaWNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyByZXF1ZXN0ZWQsIGJ1dAorICAgKiAgIG1heSBiZSBsb25nZXIgaWYgdGhlIHJldHVybmVkIHNsaWNlIHBvaW50cyBpbnRvIGFuIGludGVybmFsIGJ1ZmZlcgorICAgKiAgIHJhdGhlciB0aGFuIGJ1Zi4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSBvdXQgKHJlc3VsdCkgeworICAgIC8vIEZJWE1FOiBDb21tZW50ZWQgb3V0IGJlY2F1c2UgbGVuIGdldHMgY29ycnVwdGVkIGluCisgICAgLy8gdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnkgYm9ycm93KCkgdW5pdHRlc3QuCisgICAgdmVyc2lvbihub25lKSBhc3NlcnQocmVzdWx0IGlzIG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA+PSBsZW4sCisgICAgICAgIkJ1ZmZlciByZXR1cm5lZCBieSBib3Jyb3coKSB0b28gc2hvcnQuIik7CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlIGxlbiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnQuIFRoaXMgbXVzdCBhbHdheXMgZm9sbG93IGEgYm9ycm93CisgICAqIG9mIGF0IGxlYXN0IGxlbiBieXRlcywgYW5kIHNob3VsZCBhbHdheXMgc3VjY2VlZC4KKyAgICoKKyAgICogVGhlIHRyYW5zcG9ydCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBsZW4gPSBOdW1iZXIgb2YgYnl0ZXMgdG8gY29uc3VtZS4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKTsKK30KKworLyoqCisgKiBQcm92aWRlcyBiYXNpYyBmYWxsLWJhY2sgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqLworY2xhc3MgVEJhc2VUcmFuc3BvcnQgOiBUVHJhbnNwb3J0IHsKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gaXNPcGVuOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgY2xvc2UgVEJhc2VUcmFuc3BvcnQuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IHJlYWQgZnJvbSBhIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgcmVhZEFsbCh1Ynl0ZVtdIGJ1ZikgeworICAgIHNpemVfdCBoYXZlOworICAgIHdoaWxlIChoYXZlIDwgYnVmLmxlbmd0aCkgeworICAgICAgc2l6ZV90IGdldCA9IHJlYWQoYnVmW2hhdmUuLiRdKTsKKyAgICAgIGlmIChnZXQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbih0ZXh0KCJDb3VsZCBub3QgcmVhZEFsbCgpICIsIGJ1Zi5sZW5ndGgsCisgICAgICAgICAgIiBieXRlcyBhcyBubyBtb3JlIGRhdGEgd2FzIGF2YWlsYWJsZSBhZnRlciAiLCBoYXZlLCAiIGJ5dGVzLiIpLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSk7CisgICAgICB9CisgICAgICBoYXZlICs9IGdldDsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZEVuZCgpIHsKKyAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQsIG5vdCBuZWVkZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIHRvIGEgVEJhc2VUcmFuc3BvcnQuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHdyaXRlRW5kKCkgeworICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdCwgbm90IG5lZWRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorICAgIHJldHVybiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICAvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQsIG5vdCBuZWVkZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgLy8gYm9ycm93KCkgaXMgYWxsb3dlZCB0byBmYWlsIGFueXdheSwgc28ganVzdCByZXR1cm4gbnVsbC4KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCBjb25zdW1lIGZyb20gYSBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworcHJvdGVjdGVkOgorICB0aGlzKCkge30KK30KKworLyoqCisgKiBNYWtlcyBhIFRUcmFuc3BvcnQgd2hpY2ggd3JhcHMgYSBnaXZlbiBzb3VyY2UgdHJhbnNwb3J0IGluIHNvbWUgd2F5LgorICoKKyAqIEEgY29tbW9uIHVzZSBjYXNlIGlzIGluc2lkZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLCB3aGVyZSB0aGUgcmF3IGNsaWVudAorICogY29ubmVjdGlvbnMgYWNjZXB0ZWQgZnJvbSBlLmcuIFRTZXJ2ZXJTb2NrZXQgbmVlZCB0byBiZSB3cmFwcGVkIGludG8KKyAqIGJ1ZmZlcmVkIG9yIGNvbXByZXNzZWQgdHJhbnNwb3J0cy4KKyAqLworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworICAvKioKKyAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGp1c3QgcmV0dXJucyB0aGUgdHJhbnNwb3J0IGdpdmVuLgorICAgKi8KKyAgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykgeworICAgIHJldHVybiB0cmFuczsKKyAgfQorfQorCisvKioKKyAqIFRyYW5zcG9ydCBmYWN0b3J5IGZvciB0cmFuc3BvcnRzIHdoaWNoIHNpbXBseSB3cmFwIGFuIHVuZGVybHlpbmcgVFRyYW5zcG9ydAorICogd2l0aG91dCByZXF1aXJpbmcgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLgorICovCitjbGFzcyBUV3JhcHBlclRyYW5zcG9ydEZhY3RvcnkoVCkgaWYgKAorICBpcyhUIDogVFRyYW5zcG9ydCkgJiYgX190cmFpdHMoY29tcGlsZXMsIG5ldyBUKFRUcmFuc3BvcnQuaW5pdCkpCispICA6IFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgb3ZlcnJpZGUgVCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykgeworICAgIHJldHVybiBuZXcgVCh0cmFucyk7CisgIH0KK30KKworLyoqCisgKiBUcmFuc3BvcnQtbGV2ZWwgZXhjZXB0aW9uLgorICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVHlwZSB7CisgICAgVU5LTk9XTiwgLy8vCisgICAgTk9UX09QRU4sIC8vLworICAgIFRJTUVEX09VVCwgLy8vCisgICAgRU5EX09GX0ZJTEUsIC8vLworICAgIElOVEVSUlVQVEVELCAvLy8KKyAgICBCQURfQVJHUywgLy8vCisgICAgQ09SUlVQVEVEX0RBVEEsIC8vLworICAgIElOVEVSTkFMX0VSUk9SLCAvLy8KKyAgICBOT1RfSU1QTEVNRU5URUQgLy8vCisgIH0KKworICAvLy8KKyAgdGhpcyhUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkgeworICAgIHN0YXRpYyBzdHJpbmcgbXNnRm9yVHlwZShUeXBlIHR5cGUpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFR5cGUuVU5LTk9XTjogcmV0dXJuICJVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOworICAgICAgICBjYXNlIFR5cGUuTk9UX09QRU46IHJldHVybiAiVHJhbnNwb3J0IG5vdCBvcGVuIjsKKyAgICAgICAgY2FzZSBUeXBlLlRJTUVEX09VVDogcmV0dXJuICJUaW1lZCBvdXQiOworICAgICAgICBjYXNlIFR5cGUuRU5EX09GX0ZJTEU6IHJldHVybiAiRW5kIG9mIGZpbGUiOworICAgICAgICBjYXNlIFR5cGUuSU5URVJSVVBURUQ6IHJldHVybiAiSW50ZXJydXB0ZWQiOworICAgICAgICBjYXNlIFR5cGUuQkFEX0FSR1M6IHJldHVybiAiSW52YWxpZCBhcmd1bWVudHMiOworICAgICAgICBjYXNlIFR5cGUuQ09SUlVQVEVEX0RBVEE6IHJldHVybiAiQ29ycnVwdGVkIERhdGEiOworICAgICAgICBjYXNlIFR5cGUuSU5URVJOQUxfRVJST1I6IHJldHVybiAiSW50ZXJuYWwgZXJyb3IiOworICAgICAgICBjYXNlIFR5cGUuTk9UX0lNUExFTUVOVEVEOiByZXR1cm4gIk5vdCBpbXBsZW1lbnRlZCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcyhtc2dGb3JUeXBlKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgdGhpcyhtc2csIFR5cGUuVU5LTk9XTiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICAvLy8KKyAgVHlwZSB0eXBlKCkgY29uc3Qgbm90aHJvdyBAcHJvcGVydHkgeworICAgIHJldHVybiB0eXBlXzsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFR5cGUgdHlwZV87Cit9CisKKy8qKgorICogTWV0YS1wcm9ncmFtbWluZyBoZWxwZXIgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIHBhc3NlZCB0eXBlIGlzIGEgVFRyYW5zcG9ydAorICogaW1wbGVtZW50YXRpb24uCisgKi8KK3RlbXBsYXRlIGlzVFRyYW5zcG9ydChUKSB7CisgIGVudW0gaXNUVHJhbnNwb3J0ID0gaXMoVCA6IFRUcmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiZmJkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkLmQKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogV3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGJ1ZmZlcnMgcmVhZHMgYW5kIHdyaXRlcyB1bnRpbCB0aGUgaW50ZXJuYWwKKyAqIGJ1ZmZlcnMgYXJlIGV4aGF1c3RlZCwgYXQgd2hpY2ggcG9pbnQgbmV3IGRhdGEgaXMgZmV0Y2hlZCByZXNwLiB0aGUKKyAqIGFjY3VtdWxhdGVkIGRhdGEgaXMgd3JpdHRlbiBvdXQgYXQgb25jZS4KKyAqLworZmluYWwgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgdXNpbmcgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHdyYXAuCisgICAqLworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgdGhpcyh0cmFuc3BvcnQsIERFRkFVTFRfQlVGRkVSX1NJWkUpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHNpemUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICogICBidWZmZXJTaXplID0gVGhlIHNpemUgb2YgdGhlIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgdG8gdXNlLCBpbiBieXRlcy4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgdGhpcyh0cmFuc3BvcnQsIGJ1ZmZlclNpemUsIGJ1ZmZlclNpemUpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHNpemUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICogICByZWFkQnVmZmVyU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSByZWFkIGJ1ZmZlciB0byB1c2UsIGluIGJ5dGVzLgorICAgKiAgIHdyaXRlQnVmZmVyU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSB3cml0ZSBidWZmZXIgdG8gdXNlLCBpbiBieXRlcy4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHNpemVfdCByZWFkQnVmZmVyU2l6ZSwgc2l6ZV90IHdyaXRlQnVmZmVyU2l6ZSkgeworICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgdWJ5dGVbcmVhZEJ1ZmZlclNpemVdOworICAgIHdyaXRlQnVmZmVyXyA9IG5ldyB1Ynl0ZVt3cml0ZUJ1ZmZlclNpemVdOworICAgIHdyaXRlQXZhaWxfID0gd3JpdGVCdWZmZXJfOworICB9CisKKyAgLy8vIFRoZSBkZWZhdWx0IHNpemUgb2YgdGhlIHJlYWQvd3JpdGUgYnVmZmVycywgaW4gYnl0ZXMuCisgIGVudW0gaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTI7CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLmlzT3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIGlmIChyZWFkQXZhaWxfLmVtcHR5KSB7CisgICAgICAvLyBJZiB0aGVyZSBpcyBub3RoaW5nIGF2YWlsYWJsZSB0byByZWFkLCBzZWUgaWYgd2UgY2FuIGdldCBzb21ldGhpbmcKKyAgICAgIC8vIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgYXV0byBieXRlc1JlYWQgPSB0cmFuc3BvcnRfLnJlYWQocmVhZEJ1ZmZlcl8pOworICAgICAgcmVhZEF2YWlsXyA9IHJlYWRCdWZmZXJfWzAgLi4gYnl0ZXNSZWFkXTsKKyAgICB9CisKKyAgICByZXR1cm4gIXJlYWRBdmFpbF8uZW1wdHk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisgICAgZmx1c2goKTsKKyAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGlmIChyZWFkQXZhaWxfLmVtcHR5KSB7CisgICAgICAvLyBObyBkYXRhIGxlZnQgaW4gb3VyIGJ1ZmZlciwgZmV0Y2ggc29tZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKworICAgICAgaWYgKGJ1Zi5sZW5ndGggPiByZWFkQnVmZmVyXy5sZW5ndGgpIHsKKyAgICAgICAgLy8gSWYgdGhlIGFtb3VudCBvZiBkYXRhIHJlcXVlc3RlZCBpcyBsYXJnZXIgdGhhbiBvdXIgcmVhZGluZyBidWZmZXIsCisgICAgICAgIC8vIGRpcmVjdGx5IHJlYWQgdG8gdGhlIHBhc3NlZCBidWZmZXIuIFRoaXMgcHJvYmFibHkgZG9lc24ndCBvY2N1ciB0b28KKyAgICAgICAgLy8gb2Z0ZW4gaW4gcHJhY3RpY2UgKGFuZCBldmVuIGlmIGl0IGRvZXMsIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICAvLyBwcm9iYWJseSBjYW5ub3QgZnVsZmlsbCB0aGUgcmVxdWVzdCBhdCBvbmNlIGFueXdheSksIGJ1dCBpdCBjYW4ndAorICAgICAgICAvLyBoYXJtIHRvIHRyeeKApgorICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5yZWFkKGJ1Zik7CisgICAgICB9CisKKyAgICAgIGF1dG8gYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy5yZWFkKHJlYWRCdWZmZXJfKTsKKyAgICAgIHJlYWRBdmFpbF8gPSByZWFkQnVmZmVyX1swIC4uIGJ5dGVzUmVhZF07CisgICAgfQorCisgICAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUuCisgICAgYXV0byBnaXZlID0gbWluKHJlYWRBdmFpbF8ubGVuZ3RoLCBidWYubGVuZ3RoKTsKKyAgICBidWZbMCAuLiBnaXZlXSA9IHJlYWRBdmFpbF9bMCAuLiBnaXZlXTsKKyAgICByZWFkQXZhaWxfID0gcmVhZEF2YWlsX1tnaXZlIC4uICRdOworICAgIHJldHVybiBnaXZlOworICB9CisKKyAgLyoqCisgICAqIFNob3J0Y3V0IHZlcnNpb24gb2YgcmVhZEFsbC4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgcmVhZEFsbCh1Ynl0ZVtdIGJ1ZikgeworICAgIGlmIChyZWFkQXZhaWxfLmxlbmd0aCA+PSBidWYubGVuZ3RoKSB7CisgICAgICBidWZbXSA9IHJlYWRBdmFpbF9bMCAuLiBidWYubGVuZ3RoXTsKKyAgICAgIHJlYWRBdmFpbF8gPSByZWFkQXZhaWxfW2J1Zi5sZW5ndGggLi4gJF07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3VwZXIucmVhZEFsbChidWYpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGlmICh3cml0ZUF2YWlsXy5sZW5ndGggPj0gYnVmLmxlbmd0aCkgeworICAgICAgLy8gSWYgdGhlIGRhdGEgZml0cyBpbiB0aGUgYnVmZmVyLCBqdXN0IHNhdmUgaXQgdGhlcmUuCisgICAgICB3cml0ZUF2YWlsX1swIC4uIGJ1Zi5sZW5ndGhdID0gYnVmOworICAgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUF2YWlsX1tidWYubGVuZ3RoIC4uICRdOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgdG8gZGVjaWRlIGlmIHdlIGNvcHkgZGF0YSBmcm9tIGJ1ZiB0byBvdXIgaW50ZXJuYWwgYnVmZmVyLCBvcgorICAgIC8vIGp1c3QgZGlyZWN0bHkgd3JpdGUgdGhlbSBvdXQuIFRoZSBzYW1lIGNvbnNpZGVyYXRpb25zIGFib3V0IGF2b2lkaW5nCisgICAgLy8gc3lzY2FsbHMgYXMgZm9yIEMrKyBhcHBseSBoZXJlLgorICAgIGF1dG8gYnl0ZXNBdmFpbCA9IHdyaXRlQXZhaWxfLnB0ciAtIHdyaXRlQnVmZmVyXy5wdHI7CisgICAgaWYgKChieXRlc0F2YWlsICsgYnVmLmxlbmd0aCA+PSAyICogd3JpdGVCdWZmZXJfLmxlbmd0aCkgfHwgKGJ5dGVzQXZhaWwgPT0gMCkpIHsKKyAgICAgIC8vIFdlIHdvdWxkIGltbWVkaWF0ZWx5IG5lZWQgdHdvIHN5c2NhbGxzIGFueXdheSAob3Igd2UgZG9uJ3QgaGF2ZQorICAgICAgLy8gYW55dGhpbmcpIGluIG91ciBidWZmZXIgdG8gd3JpdGUsIHNvIGp1c3Qgd3JpdGUgb3V0IGJvdGggYnVmZmVycy4KKyAgICAgIGlmIChieXRlc0F2YWlsID4gMCkgeworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKHdyaXRlQnVmZmVyX1swIC4uIGJ5dGVzQXZhaWxdKTsKKyAgICAgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUJ1ZmZlcl87CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGaWxsIHVwIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGEgd3JpdGUuCisgICAgd3JpdGVBdmFpbF9bXSA9IGJ1ZlswIC4uIHdyaXRlQXZhaWxfLmxlbmd0aF07CisgICAgYXV0byBsZWZ0ID0gYnVmW3dyaXRlQXZhaWxfLmxlbmd0aCAuLiAkXTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKHdyaXRlQnVmZmVyXyk7CisKKyAgICAvLyBDb3B5IHRoZSByZXN0IGludG8gb3VyIGJ1ZmZlci4KKyAgICB3cml0ZUJ1ZmZlcl9bMCAuLiBsZWZ0Lmxlbmd0aF0gPSBsZWZ0W107CisgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUJ1ZmZlcl9bbGVmdC5sZW5ndGggLi4gJF07CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCisgICAgYXV0byBieXRlc0F2YWlsID0gd3JpdGVBdmFpbF8ucHRyIC0gd3JpdGVCdWZmZXJfLnB0cjsKKyAgICBpZiAoYnl0ZXNBdmFpbCA+IDApIHsKKyAgICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3cml0ZUF2YWlsXyBwcmlvciB0byBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sCisgICAgICAvLyB0byBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBpcyBjbGVhcmVkIGV2ZW4gaWYgdGhlIHRyYW5zcG9ydCB0aHJvd3MgYW4KKyAgICAgIC8vIGV4Y2VwdGlvbi4KKyAgICAgIHdyaXRlQXZhaWxfID0gd3JpdGVCdWZmZXJfOworICAgICAgdHJhbnNwb3J0Xy53cml0ZSh3cml0ZUJ1ZmZlcl9bMCAuLiBieXRlc0F2YWlsXSk7CisgICAgfQorCisgICAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA8PSByZWFkQXZhaWxfLmxlbmd0aCkgeworICAgICAgcmV0dXJuIHJlYWRBdmFpbF87CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICBlbmZvcmNlKGxlbiA8PSByZWFkQnVmZmVyXy5sZW5ndGgsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkludmFsaWQgY29uc3VtZSBsZW5ndGguIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisgICAgcmVhZEF2YWlsXyA9IHJlYWRBdmFpbF9bbGVuIC4uICRdOworICB9CisKKyAgLyoqCisgICAqIFRoZSB3cmFwcGVkIHRyYW5zcG9ydC4KKyAgICovCisgIFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF87CisgIH0KKworcHJpdmF0ZToKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnRfOworCisgIHVieXRlW10gcmVhZEJ1ZmZlcl87CisgIHVieXRlW10gd3JpdGVCdWZmZXJfOworCisgIHVieXRlW10gcmVhZEF2YWlsXzsKKyAgdWJ5dGVbXSB3cml0ZUF2YWlsXzsKK30KKworLyoqCisgKiBXcmFwcyBnaXZlbiB0cmFuc3BvcnRzIGludG8gVEJ1ZmZlcmVkVHJhbnNwb3J0cy4KKyAqLworYWxpYXMgVFdyYXBwZXJUcmFuc3BvcnRGYWN0b3J5IVRCdWZmZXJlZFRyYW5zcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODhlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKQEAgLTAsMCArMSwxMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVHJhbnNwb3J0cyBmb3IgcmVhZGluZyBmcm9tL3dyaXRpbmcgdG8gVGhyaWZ0IMK7bG9nIGZpbGVzwqsuCisgKgorICogVGhlc2UgdHJhbnNwb3J0cyBhcmUgbm90IMK7c3R1cGlkwqsgc291cmNlcyBhbmQgc2lua3MganVzdCByZWFkaW5nIGFuZAorICogd3JpdGluZyBieXRlcyBmcm9tIGEgZmlsZSB2ZXJiYXRpbSwgYnV0IG9yZ2FuaXplIHRoZSBjb250ZW50cyBpbiB0aGUgZm9ybQorICogb2Ygc28tY2FsbGVkIMK7ZXZlbnRzwqssIHdoaWNoIHJlZmVycyB0byB0aGUgZGF0YSB3cml0dGVuIGJldHdlZW4gdHdvIGZsdXNoKCkKKyAqIGNhbGxzLgorICoKKyAqIENodW5raW5nIGlzIHN1cHBvcnRlZCwgZXZlbnRzIGFyZSBndWFyYW50ZWVkIHRvIG5ldmVyIHNwYW4gY2h1bmsgYm91bmRhcmllcy4KKyAqIEFzIGEgY29uc2VxdWVuY2UsIGFuIGV2ZW50IGNhbiBuZXZlciBiZSBsYXJnZXIgdGhhbiB0aGUgY2h1bmsgc2l6ZS4gVGhlCisgKiBjaHVuayBzaXplIHVzZWQgaXMgbm90IHNhdmVkIHdpdGggdGhlIGZpbGUsIHNvIGNhcmUgaGFzIHRvIGJlIHRha2VuIHRvIG1ha2UKKyAqIHN1cmUgdGhlIHNhbWUgY2h1bmsgc2l6ZSBpcyB1c2VkIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5maWxlOworCitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbiwgbWF4OworaW1wb3J0IHN0ZC5jb25jdXJyZW5jeTsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5kYXRldGltZSA6IGR1ciwgRHVyYXRpb247CitpbXBvcnQgc3RkLmRhdGV0aW1lLnN0b3B3YXRjaCA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5leGNlcHRpb247CitpbXBvcnQgc3RkLnN0ZGlvIDogRmlsZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8vLyBUaGUgZGVmYXVsdCBjaHVuayBzaXplLCBpbiBieXRlcy4KK2VudW0gREVGQVVMVF9DSFVOS19TSVpFID0gMTYgKiAxMDI0ICogMTAyNDsKKworLy8vIFRoZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGV2ZW50IHNpemVzIGluIHRoZSBmaWxlLgorYWxpYXMgdWludCBFdmVudFNpemU7CisKK3ZlcnNpb24gKEJpZ0VuZGlhbikgeworICBzdGF0aWMgYXNzZXJ0KGZhbHNlLAorICAgICJMaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgaXMgYXNzdW1lZCBpbiB0aHJpZnQudHJhbnNwb3J0LmZpbGUuIik7Cit9CisKKy8qKgorICogQSB0cmFuc3BvcnQgdXNlZCB0byByZWFkIGxvZyBmaWxlcy4gSXQgY2FuIG5ldmVyIGJlIHdyaXR0ZW4gdG8sIGNhbGxpbmcKKyAqIHdyaXRlKCkgdGhyb3dzLgorICoKKyAqIENvbnRyYXJ5IHRvIHRoZSBDKysgZGVzaWduLCBleHBsaWNpdGx5IG9wZW5pbmcgdGhlIHRyYW5zcG9ydC9maWxlIGJlZm9yZQorICogdXNpbmcgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IG1hbnVhbGx5IGNsb3NpbmcgdGhlIGZpbGUgd2l0aG91dCByZWx5aW5nIG9uIHRoZQorICogb2JqZWN0IGxpZmV0aW1lLiBPdGhlcndpc2UsIGl0J3MgYSBzdHJhaWdodCBwb3J0IG9mIHRoZSBDKysgaW1wbGVtZW50YXRpb24uCisgKi8KK2ZpbmFsIGNsYXNzIFRGaWxlUmVhZGVyVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIHdyaXRlciB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwYXRoID0gUGF0aCBvZiB0aGUgZmlsZSB0byBvcHBlcmF0ZSBvbi4KKyAgICovCisgIHRoaXMoc3RyaW5nIHBhdGgpIHsKKyAgICBwYXRoXyA9IHBhdGg7CisgICAgY2h1bmtTaXplXyA9IERFRkFVTFRfQ0hVTktfU0laRTsKKyAgICByZWFkQnVmZmVyU2l6ZV8gPSBERUZBVUxUX1JFQURfQlVGRkVSX1NJWkU7CisgICAgcmVhZFRpbWVvdXRfID0gREVGQVVMVF9SRUFEX1RJTUVPVVQ7CisgICAgY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uXyA9IERFRkFVTFRfQ09SUlVQVEVEX0VWRU5UX1NMRUVQX0RVUkFUSU9OOworICAgIG1heEV2ZW50U2l6ZSA9IERFRkFVTFRfTUFYX0VWRU5UX1NJWkU7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGlzT3Blbl87CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGV2ZW50IGN1cnJlbnRseSBwcm9jZXNzZWQsIHRyeSBmZXRjaGluZyBvbmUgZnJvbSB0aGUKKyAgICAvLyBmaWxlLgorICAgIGlmICghY3VycmVudEV2ZW50XykgeworICAgICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOworCisgICAgICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICAgICAgLy8gU3RpbGwgbm90aGluZyB0aGVyZSwgY291bGRuJ3QgcmVhZCBhIG5ldyBldmVudC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byByZWFkCisgICAgcmV0dXJuIChjdXJyZW50RXZlbnRfLmxlbmd0aCAtIGN1cnJlbnRFdmVudFBvc18pID4gMDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisgICAgdHJ5IHsKKyAgICAgIGZpbGVfID0gRmlsZShwYXRoXywgInJiIik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciBvbiBvcGVuaW5nIGlucHV0IGZpbGUuIiwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOLCBfX0ZJTEVfXywgX19MSU5FX18sIGUpOworICAgIH0KKyAgICBpc09wZW5fID0gdHJ1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKworICAgIGZpbGVfLmNsb3NlKCk7CisgICAgaXNPcGVuXyA9IGZhbHNlOworICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCByZWFkIGlmIGZpbGUgaXMgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBldmVudCBjdXJyZW50bHkgcHJvY2Vzc2VkLCB0cnkgZmV0Y2hpbmcgb25lIGZyb20gdGhlCisgICAgLy8gZmlsZS4KKyAgICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICAgIGN1cnJlbnRFdmVudF8gPSByZWFkRXZlbnQoKTsKKworICAgICAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgICAgIC8vIFN0aWxsIG5vdGhpbmcgdGhlcmUsIGNvdWxkbid0IHJlYWQgYSBuZXcgZXZlbnQuCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICAgIGF1dG8gbGVuID0gYnVmLmxlbmd0aDsKKyAgICBhdXRvIHJlbWFpbmluZyA9IGN1cnJlbnRFdmVudF8ubGVuZ3RoIC0gY3VycmVudEV2ZW50UG9zXzsKKworICAgIGlmIChyZW1haW5pbmcgPD0gbGVuKSB7CisgICAgICAvLyBJZiBsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBsZW5ndGggaXMgYXZhaWxhYmxlLCByZWFkIGFzIG11Y2ggYXMKKyAgICAgIC8vIHBvc3NpYmxlLgorICAgICAgYnVmWzAgLi4gcmVtYWluaW5nXSA9IGN1cnJlbnRFdmVudF9bY3VycmVudEV2ZW50UG9zXyAuLiAkXTsKKyAgICAgIGN1cnJlbnRFdmVudF8gPSBudWxsOworICAgICAgY3VycmVudEV2ZW50UG9zXyA9IDA7CisgICAgICByZXR1cm4gcmVtYWluaW5nOworICAgIH0KKworICAgIC8vIFRoZXJlIHdpbGwgc3RpbGwgYmUgZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIgYWZ0ZXIgcmVhZGluZywgcGFzcyBvdXQgbGVuCisgICAgLy8gYnl0ZXMuCisgICAgYnVmW10gPSBjdXJyZW50RXZlbnRfW2N1cnJlbnRFdmVudFBvc18gLi4gY3VycmVudEV2ZW50UG9zXyArIGxlbl07CisgICAgY3VycmVudEV2ZW50UG9zXyArPSBsZW47CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIHVsb25nIGdldE51bUNodW5rcygpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IGdldCBudW1iZXIgb2YgY2h1bmtzIGlmIGZpbGUgbm90IG9wZW4uIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgdHJ5IHsKKyAgICAgIGF1dG8gZmlsZVNpemUgPSBmaWxlXy5zaXplKCk7CisgICAgICBpZiAoZmlsZVNpemUgPT0gMCkgeworICAgICAgICAvLyBFbXB0eSBmaWxlcyBoYXZlIG5vIGNodW5rcy4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gKChmaWxlU2l6ZSkvY2h1bmtTaXplXykgKyAxOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBmaWxlIHNpemUuIiwgX19GSUxFX18sCisgICAgICAgIF9fTElORV9fLCBlKTsKKyAgICB9CisgIH0KKworICB1bG9uZyBnZXRDdXJDaHVuaygpIHsKKyAgICByZXR1cm4gb2Zmc2V0XyAvIGNodW5rU2l6ZV87CisgIH0KKworICB2b2lkIHNlZWtUb0NodW5rKGxvbmcgY2h1bmspIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IGdldCBudW1iZXIgb2YgY2h1bmtzIGlmIGZpbGUgbm90IG9wZW4uIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgYXV0byBudW1DaHVua3MgPSBnZXROdW1DaHVua3MoKTsKKworICAgIGlmIChjaHVuayA8IDApIHsKKyAgICAgIC8vIENvdW50IG5lZ2F0aXZlIGluZGljZXMgZnJvbSB0aGUgZW5kLgorICAgICAgY2h1bmsgKz0gbnVtQ2h1bmtzOworICAgIH0KKworICAgIGlmIChjaHVuayA8IDApIHsKKyAgICAgIGxvZ0Vycm9yKCJJbmNvcnJlY3QgY2h1bmsgbnVtYmVyIGZvciByZXZlcnNlIHNlZWssIHNlZWtpbmcgdG8gIiB+CisgICAgICAgImJlZ2lubmluZyBpbnN0ZWFkOiAlcyIsIGNodW5rKTsKKyAgICAgIGNodW5rID0gMDsKKyAgICB9CisKKyAgICBib29sIHNlZWtUb0VuZDsKKyAgICBsb25nIG1pbkVuZE9mZnNldDsKKyAgICBpZiAoY2h1bmsgPj0gbnVtQ2h1bmtzKSB7CisgICAgICBsb2dFcnJvcigiVHJ5aW5nIHRvIHNlZWsgdG8gbm9uLWV4aXN0aW5nIGNodW5rLCBzZWVraW5nIHRvICIgfgorICAgICAgICJlbmQgb2YgZmlsZSBpbnN0ZWFkOiAlcyIsIGNodW5rKTsKKyAgICAgIHNlZWtUb0VuZCA9IHRydWU7CisgICAgICBjaHVuayA9IG51bUNodW5rcyAtIDE7CisgICAgICAvLyB0aGlzIGlzIHRoZSBtaW4gb2Zmc2V0IHRvIHByb2Nlc3MgZXZlbnRzIHRpbGwKKyAgICAgIG1pbkVuZE9mZnNldCA9IGZpbGVfLnNpemUoKTsKKyAgICB9CisKKyAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgY3VycmVudEV2ZW50XyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgZmlsZV8uc2VlayhjaHVuayAqIGNodW5rU2l6ZV8pOworICAgICAgb2Zmc2V0XyA9IGNodW5rICogY2h1bmtTaXplXzsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIHNlZWtpbmcgdG8gY2h1bmsiLCBfX0ZJTEVfXywKKyAgICAgICAgX19MSU5FX18sIGUpOworICAgIH0KKworICAgIGlmIChzZWVrVG9FbmQpIHsKKyAgICAgIC8vIE5ldmVyIHdhaXQgb24gdGhlIGVuZCBvZiB0aGUgZmlsZSBmb3IgbmV3IGNvbnRlbnQsIHdlIGp1c3Qgd2FudCB0bworICAgICAgLy8gZmluZCB0aGUgbGFzdCBvbmUuCisgICAgICBhdXRvIG9sZFJlYWRUaW1lb3V0ID0gcmVhZFRpbWVvdXRfOworICAgICAgc2NvcGUgKGV4aXQpIHJlYWRUaW1lb3V0XyA9IG9sZFJlYWRUaW1lb3V0OworICAgICAgcmVhZFRpbWVvdXRfID0gZHVyISJobnNlY3MiKDApOworCisgICAgICAvLyBLZWVwIG9uIHJlYWRpbmcgdW50aSB0aGUgbGFzdCBldmVudCBhdCBwb2ludCBvZiBzZWVrVG9DaHVuayBjYWxsLgorICAgICAgd2hpbGUgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfKSA8IG1pbkVuZE9mZnNldCkgeworICAgICAgICBpZiAocmVhZEV2ZW50KCkgaXMgbnVsbCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBzZWVrVG9FbmQoKSB7CisgICAgc2Vla1RvQ2h1bmsoZ2V0TnVtQ2h1bmtzKCkpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzaXplIG9mIHRoZSBjaHVua3MgdGhlIGZpbGUgaXMgZGl2aWRlZCBpbnRvLCBpbiBieXRlcy4KKyAgICovCisgIHVsb25nIGNodW5rU2l6ZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIGNodW5rU2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBjaHVua1NpemUodWxvbmcgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSghaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgc2V0IGNodW5rIHNpemUgYWZ0ZXIgVEZpbGVSZWFkZXJUcmFuc3BvcnQgaGFzIGJlZW4gb3BlbmVkLiIpKTsKKyAgICBlbmZvcmNlKHZhbHVlID4gRXZlbnRTaXplLnNpemVvZiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNodW5rcyBtdXN0ICIgfgorICAgICAgImJlIGxhcmdlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBhdCBsZWFzdCBhIHNpbmdsZSBieXRlIG9mIHBheWxvYWQgZGF0YS4iKSk7CisgICAgY2h1bmtTaXplXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCB3YWl0IHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gZm9yIG5ldyBkYXRhIHdoZW4gYXJyaXZpbmcgYXQKKyAgICogZW5kIG9mIGZpbGUuIElmIG5lZ2F0aXZlLCB3YWl0IGZvcmV2ZXIgKHRhaWxpbmcgbW9kZSksIHdha2luZyB1cCB0byBjaGVjaworICAgKiBpbiB0aGUgc3BlY2lmaWVkIGludGVydmFsLiBJZiB6ZXJvLCBkbyBub3Qgd2FpdCBhdCBhbGwuCisgICAqCisgICAqIERlZmF1bHRzIHRvIDUwMCBtcy4KKyAgICovCisgIER1cmF0aW9uIHJlYWRUaW1lb3V0KCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZFRpbWVvdXRfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgcmVhZFRpbWVvdXQoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcmVhZFRpbWVvdXRfID0gdmFsdWU7CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX1JFQURfVElNRU9VVCA9IGR1ciEibXNlY3MiKDUwMCk7CisKKyAgLyoqCisgICAqIFJlYWQgYnVmZmVyIHNpemUsIGluIGJ5dGVzLgorICAgKgorICAgKiBEZWZhdWx0cyB0byAxIE1pQi4KKyAgICovCisgIHNpemVfdCByZWFkQnVmZmVyU2l6ZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHJlYWRCdWZmZXJTaXplXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIHJlYWRCdWZmZXJTaXplKHNpemVfdCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpZiAocmVhZEJ1ZmZlcl8pIHsKKyAgICAgIGVuZm9yY2UodmFsdWUgPD0gcmVhZEJ1ZmZlclNpemVfLAorICAgICAgICAiQ2Fubm90IHNocmluayByZWFkIGJ1ZmZlciBhZnRlciBmaXJzdCByZWFkLiIpOworICAgICAgcmVhZEJ1ZmZlcl8ubGVuZ3RoID0gdmFsdWU7CisgICAgfQorICAgIHJlYWRCdWZmZXJTaXplXyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9SRUFEX0JVRkZFUl9TSVpFID0gMSAqIDEwMjQgKiAxMDI0OworCisgIC8qKgorICAgKiBBcmJpdHJhcnkgZXZlbnQgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuIE11c3QgYmUgc21hbGxlciB0aGFuIGNodW5rIHNpemUuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIHNpemVfdCBtYXhFdmVudFNpemUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBtYXhFdmVudFNpemVfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgbWF4RXZlbnRTaXplKHNpemVfdCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKHZhbHVlIDw9IGNodW5rU2l6ZV8gLSBFdmVudFNpemUuc2l6ZW9mLCAiRXZlbnRzIGNhbm5vdCBzcGFuICIgfgorICAgICAgIm11dGlwbGUgY2h1bmtzLCBtYXhFdmVudFNpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gY2h1bmsgc2l6ZS4iKTsKKyAgICBtYXhFdmVudFNpemVfID0gdmFsdWU7CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX01BWF9FVkVOVF9TSVpFID0gMDsKKworICAvKioKKyAgICogVGhlIGludGVydmFsIGF0IHdoaWNoIHRoZSB0aHJlYWQgd2FrZXMgdXAgdG8gY2hlY2sgZm9yIHRoZSBuZXh0IGNodW5rCisgICAqIGluIHRhaWxpbmcgbW9kZS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gb25lIHNlY29uZC4KKyAgICovCisgIER1cmF0aW9uIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbihEdXJhdGlvbiB2YWx1ZSkgeworICAgIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbl8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfQ09SUlVQVEVEX0VWRU5UX1NMRUVQX0RVUkFUSU9OID0gZHVyISJzZWNvbmRzIigxKTsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvcnJ1cHRlZCBldmVudHMgdG9sZXJhdGVkIGJlZm9yZSB0aGUgd2hvbGUgY2h1bmsKKyAgICogaXMgc2tpcHBlZC4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVyby4KKyAgICovCisgIHVpbnQgbWF4Q29ycnVwdGVkRXZlbnRzKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gbWF4Q29ycnVwdGVkRXZlbnRzXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIG1heENvcnJ1cHRlZEV2ZW50cyh1aW50IHZhbHVlKSBAcHJvcGVydHkgeworICAgIG1heENvcnJ1cHRlZEV2ZW50c18gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMgPSAwOworCitwcml2YXRlOgorICB1Ynl0ZVtdIHJlYWRFdmVudCgpIHsKKyAgICBpZiAoIXJlYWRCdWZmZXJfKSB7CisgICAgICByZWFkQnVmZmVyXyA9IG5ldyB1Ynl0ZVtyZWFkQnVmZmVyU2l6ZV9dOworICAgIH0KKworICAgIGJvb2wgdGltZW91dEV4cGlyZWQ7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIC8vIHJlYWQgZnJvbSB0aGUgZmlsZSBpZiByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQKKyAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlclBvc18gPT0gcmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CisgICAgICAgIC8vIGFkdmFuY2UgdGhlIG9mZnNldCBwb2ludGVyCisgICAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgLy8gTmVlZCB0byBjbGVhciBlb2YgZmxhZyBiZWZvcmUgcmVhZGluZywgb3RoZXJ3aXNlIHRhaWxpbmcgYSBmaWxlCisgICAgICAgICAgLy8gZG9lcyBub3Qgd29yay4KKyAgICAgICAgICBmaWxlXy5jbGVhcmVycigpOworCisgICAgICAgICAgYXV0byB1c2VkQnVmID0gZmlsZV8ucmF3UmVhZChyZWFkQnVmZmVyXyk7CisgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gdXNlZEJ1Zi5sZW5ndGg7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIsCisgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQb3NfID0gMDsKKyAgICAgICAgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfID0gMDsKKworICAgICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IDApIHsKKyAgICAgICAgICAvLyBSZWFjaGVkIGVuZCBvZiBmaWxlLgorICAgICAgICAgIGlmIChyZWFkVGltZW91dF8gPCBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIC8vIFRhaWxpbmcgbW9kZSwgc2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgtcmVhZFRpbWVvdXRfKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IGR1ciEiaG5zZWNzIigwKSB8fCB0aW1lb3V0RXhwaXJlZCkgeworICAgICAgICAgICAgLy8gRWl0aGVyIG5vIHRpbWVvdXQgc2V0LCBvciBpdCBoYXMgYWxyZWFkeSBleHBpcmVkLgorICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRpbWVvdXQgbW9kZSwgc2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgYW5kIHJldHJ5LgorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHJlYWRUaW1lb3V0Xyk7CisgICAgICAgICAgICB0aW1lb3V0RXhwaXJlZCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgIHdoaWxlIChyZWFkU3RhdGVfLmJ1ZmZlclBvc18gPCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgICAgaWYgKHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfKSB7CisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gMCkgeworICAgICAgICAgICAgaWYgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfKS9jaHVua1NpemVfICE9CisgICAgICAgICAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyArIDMpL2NodW5rU2l6ZV8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclBvc18rKzsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmX1tyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfKytdID0KKyAgICAgICAgICAgIHJlYWRCdWZmZXJfW3JlYWRTdGF0ZV8uYnVmZmVyUG9zXysrXTsKKworICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDQpIHsKKyAgICAgICAgICAgIGF1dG8gc2l6ZSA9IChjYXN0KHVpbnRbXSlyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfKVswXTsKKworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIHBhcnQgb2YgdGhlIHplcm8gcGFkZGluZyBiZXR3ZWVuIGNodW5rcy4KKyAgICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUG9zXyk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnb3QgYSB2YWxpZCBldmVudAorICAgICAgICAgICAgcmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8gPSBmYWxzZTsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRMZW5fID0gc2l6ZTsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRQb3NfID0gMDsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGlzIGNvcnJ1cHRlZCBhbmQgcGVyZm9ybSByZWNvdmVyeSBpZiByZXF1aXJlZAorICAgICAgICAgICAgaWYgKGlzRXZlbnRDb3JydXB0ZWQoKSkgeworICAgICAgICAgICAgICBwZXJmb3JtUmVjb3ZlcnkoKTsKKyAgICAgICAgICAgICAgLy8gc3RhcnQgZnJvbSB0aGUgdG9wCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIXJlYWRTdGF0ZV8uZXZlbnRfKSB7CisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IG5ldyB1Ynl0ZVtyZWFkU3RhdGVfLmV2ZW50TGVuX107CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gdGFrZSBlaXRoZXIgdGhlIGVudGlyZSBldmVudCBvciB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAgICAgICAgICBhdXRvIHJlY2xhaW1CdWZmZXIgPSBtaW4ocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQb3NfLAorICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudExlbl8gLSByZWFkU3RhdGVfLmV2ZW50UG9zXyk7CisKKyAgICAgICAgICAvLyBjb3B5IGRhdGEgZnJvbSByZWFkIGJ1ZmZlciBpbnRvIGV2ZW50IGJ1ZmZlcgorICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfWworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudFBvc18gLi4gcmVhZFN0YXRlXy5ldmVudFBvc18gKyByZWNsYWltQnVmZmVyCisgICAgICAgICAgXSA9IHJlYWRCdWZmZXJfWworICAgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQb3NfIC4uIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyArIHJlY2xhaW1CdWZmZXIKKyAgICAgICAgICBdOworCisgICAgICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHB0cnMKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50UG9zXyArPSByZWNsYWltQnVmZmVyOworICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyArPSByZWNsYWltQnVmZmVyOworCisgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGhhcyBiZWVuIHJlYWQgaW4gZnVsbAorICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50UG9zXyA9PSByZWFkU3RhdGVfLmV2ZW50TGVuXykgeworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHJlYWQgc3RhdGUgYW5kIHJldHVybiB0aGUgY29tcGxldGVkIGV2ZW50LgorICAgICAgICAgICAgYXV0byBjb21wbGV0ZUV2ZW50ID0gcmVhZFN0YXRlXy5ldmVudF87CisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50XyA9IG51bGw7CisgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5idWZmZXJQb3NfKTsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZUV2ZW50OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGJvb2wgaXNFdmVudENvcnJ1cHRlZCgpIHsKKyAgICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAocmVhZFN0YXRlXy5ldmVudExlbl8gPiBtYXhFdmVudFNpemVfKSkgeworICAgICAgLy8gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiB1c2VyLXNwZWZpY2llZCBtYXgtZXZlbnQgc2l6ZQorICAgICAgbG9nRXJyb3IoIkNvcnJ1cHQgZXZlbnQgcmVhZDogRXZlbnQgc2l6ZSAoJXMpIGdyZWF0ZXIgdGhhbiBtYXggIiB+CisgICAgICAgICJldmVudCBzaXplICglcykiLCByZWFkU3RhdGVfLmV2ZW50TGVuXywgbWF4RXZlbnRTaXplXyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uZXZlbnRMZW5fID4gY2h1bmtTaXplXykgeworICAgICAgLy8gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBjaHVuayBzaXplCisgICAgICBsb2dFcnJvcigiQ29ycnVwdCBldmVudCByZWFkOiBFdmVudCBzaXplICglcykgZ3JlYXRlciB0aGFuIGNodW5rICIgfgorICAgICAgICAic2l6ZSAoJXMpIiwgcmVhZFN0YXRlXy5ldmVudExlbl8sIGNodW5rU2l6ZV8pOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmICgoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18gLSBFdmVudFNpemUuc2l6ZW9mKSAvIGNodW5rU2l6ZV8pICE9CisgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18gKyByZWFkU3RhdGVfLmV2ZW50TGVuXyAtIEV2ZW50U2l6ZS5zaXplb2YpIC8gY2h1bmtTaXplXykpCisgICAgeworICAgICAgLy8gU2l6ZSBpbmRpY2F0ZXMgdGhhdCBldmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5CisgICAgICBsb2dFcnJvcigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBjcm9zc2VzIGNodW5rIGJvdW5kYXJ5LiAiIH4KKyAgICAgICAgIkV2ZW50IHNpemU6ICVzLiBPZmZzZXQ6ICVzIiwgcmVhZFN0YXRlXy5ldmVudExlbl8sCisgICAgICAgIChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfICsgRXZlbnRTaXplLnNpemVvZikKKyAgICAgICk7CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgcGVyZm9ybVJlY292ZXJ5KCkgeworICAgIC8vIHBlcmZvcm0gc29tZSBraWNrYXNzIHJlY292ZXJ5CisgICAgYXV0byBjdXJDaHVuayA9IGdldEN1ckNodW5rKCk7CisgICAgaWYgKGxhc3RCYWRDaHVua18gPT0gY3VyQ2h1bmspIHsKKyAgICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGxhc3RCYWRDaHVua18gPSBjdXJDaHVuazsKKyAgICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfID0gMTsKKyAgICB9CisKKyAgICBpZiAobnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPCBtYXhDb3JydXB0ZWRFdmVudHNfKSB7CisgICAgICAvLyBtYXliZSB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVhZGluZyB0aGUgZmlsZSBmcm9tIGRpc2sKKyAgICAgIC8vIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiBjaHVuayBhbmQgdHJ5IGFnYWluCisgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEp1c3Qgc2tpcCBhaGVhZCB0byB0aGUgbmV4dCBjaHVuayBpZiB3ZSBub3QgYWxyZWFkeSBhdCB0aGUgbGFzdCBjaHVuay4KKyAgICAgIGlmIChjdXJDaHVuayAhPSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOworICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPCBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIGluIHRhaWxpbmcgbW9kZSwgd2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byBzdGFydAorICAgICAgICAvLyB0aGUgbmV4dCBjaHVuay4KKyAgICAgICAgd2hpbGUoY3VyQ2h1bmsgPT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKKyAgICAgICAgICBUaHJlYWQuc2xlZXAoY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uXyk7CisgICAgICAgIH0KKyAgICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFByZXR0eSBob3NlZCBhdCB0aGlzIHN0YWdlLCByZXdpbmQgdGhlIGZpbGUgYmFjayB0byB0aGUgbGFzdAorICAgICAgICAvLyBzdWNjZXNzZnVsIHBvaW50IGFuZCBwdW50IG9uIHRoZSBlcnJvci4KKyAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUG9zXyk7CisgICAgICAgIGN1cnJlbnRFdmVudF8gPSBudWxsOworICAgICAgICBjdXJyZW50RXZlbnRQb3NfID0gMDsKKworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRmlsZSBjb3JydXB0ZWQgYXQgb2Zmc2V0OiAiIH4KKyAgICAgICAgICB0byFzdHJpbmcob2Zmc2V0XyArIHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUG9zXyksCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdHJpbmcgcGF0aF87CisgIEZpbGUgZmlsZV87CisgIGJvb2wgaXNPcGVuXzsKKyAgbG9uZyBvZmZzZXRfOworICB1Ynl0ZVtdIGN1cnJlbnRFdmVudF87CisgIHNpemVfdCBjdXJyZW50RXZlbnRQb3NfOworICB1bG9uZyBjaHVua1NpemVfOworICBEdXJhdGlvbiByZWFkVGltZW91dF87CisgIHNpemVfdCBtYXhFdmVudFNpemVfOworCisgIC8vIFJlYWQgYnVmZmVyIOKAkyBsYXppbHkgYWxsb2NhdGVkIG9uIHRoZSBmaXJzdCByZWFkKCkuCisgIHVieXRlW10gcmVhZEJ1ZmZlcl87CisgIHNpemVfdCByZWFkQnVmZmVyU2l6ZV87CisKKyAgc3RhdGljIHN0cnVjdCBSZWFkU3RhdGUgeworICAgIHVieXRlW10gZXZlbnRfOworICAgIHNpemVfdCBldmVudExlbl87CisgICAgc2l6ZV90IGV2ZW50UG9zXzsKKworICAgIC8vIGtlZXAgdHJhY2sgb2YgZXZlbnQgc2l6ZQorICAgIHVieXRlWzRdIGV2ZW50U2l6ZUJ1ZmZfOworICAgIHVieXRlIGV2ZW50U2l6ZUJ1ZmZQb3NfOworICAgIGJvb2wgcmVhZGluZ1NpemVfID0gdHJ1ZTsKKworICAgIC8vIHJlYWQgYnVmZmVyIHZhcmlhYmxlcworICAgIHNpemVfdCBidWZmZXJQb3NfOworICAgIHNpemVfdCBidWZmZXJMZW5fOworCisgICAgLy8gbGFzdCBzdWNjZXNzZnVsIGRpc3BhdGNoIHBvaW50CisgICAgc2l6ZV90IGxhc3REaXNwYXRjaFBvc187CisKKyAgICB2b2lkIHJlc2V0U3RhdGUoc2l6ZV90IGxhc3REaXNwYXRjaFBvcykgeworICAgICAgcmVhZGluZ1NpemVfID0gdHJ1ZTsKKyAgICAgIGV2ZW50U2l6ZUJ1ZmZQb3NfID0gMDsKKyAgICAgIGxhc3REaXNwYXRjaFBvc18gPSBsYXN0RGlzcGF0Y2hQb3M7CisgICAgfQorCisgICAgdm9pZCByZXNldEFsbFZhbHVlcygpIHsKKyAgICAgIHJlc2V0U3RhdGUoMCk7CisgICAgICBidWZmZXJQb3NfID0gMDsKKyAgICAgIGJ1ZmZlckxlbl8gPSAwOworICAgICAgZXZlbnRfID0gbnVsbDsKKyAgICB9CisgIH0KKyAgUmVhZFN0YXRlIHJlYWRTdGF0ZV87CisKKyAgdWxvbmcgbGFzdEJhZENodW5rXzsKKyAgdWludCBtYXhDb3JydXB0ZWRFdmVudHNfOworICB1aW50IG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfOworICBEdXJhdGlvbiBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fOworfQorCisvKioKKyAqIEEgdHJhbnNwb3J0IHVzZWQgdG8gd3JpdGUgbG9nIGZpbGVzLiBJdCBjYW4gbmV2ZXIgYmUgcmVhZCBmcm9tLCBjYWxsaW5nCisgKiByZWFkKCkgdGhyb3dzLgorICoKKyAqIENvbnRyYXJ5IHRvIHRoZSBDKysgZGVzaWduLCBleHBsaWNpdGx5IG9wZW5pbmcgdGhlIHRyYW5zcG9ydC9maWxlIGJlZm9yZQorICogdXNpbmcgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IG1hbnVhbGx5IGNsb3NpbmcgdGhlIGZpbGUgd2l0aG91dCByZWx5aW5nIG9uIHRoZQorICogb2JqZWN0IGxpZmV0aW1lLgorICovCitmaW5hbCBjbGFzcyBURmlsZVdyaXRlclRyYW5zcG9ydCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgZmlsZSB3cml0ZXIgdHJhbnNwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcGF0aCA9IFBhdGggb2YgdGhlIGZpbGUgdG8gb3BwZXJhdGUgb24uCisgICAqLworICB0aGlzKHN0cmluZyBwYXRoKSB7CisgICAgcGF0aF8gPSBwYXRoOworCisgICAgY2h1bmtTaXplXyA9IERFRkFVTFRfQ0hVTktfU0laRTsKKyAgICBldmVudEJ1ZmZlclNpemVfID0gREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRTsKKyAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbiA9IERFRkFVTFRfSU9fRVJST1JfU0xFRVBfRFVSQVRJT047CisgICAgbWF4Rmx1c2hCeXRlc18gPSBERUZBVUxUX01BWF9GTFVTSF9CWVRFUzsKKyAgICBtYXhGbHVzaEludGVydmFsXyA9IERFRkFVTFRfTUFYX0ZMVVNIX0lOVEVSVkFMOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBpc09wZW5fOworICB9CisKKyAgLyoqCisgICAqIEEgZmlsZSB3cml0ZXIgdHJhbnNwb3J0IGNhbiBuZXZlciBiZSByZWFkIGZyb20uCisgICAqLworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGlmIChpc09wZW4pIHJldHVybjsKKworICAgIHdyaXRlclRocmVhZF8gPSBzcGF3bigKKyAgICAgICZ3cml0ZXJUaHJlYWQsCisgICAgICBwYXRoXywKKyAgICAgIGNodW5rU2l6ZV8sCisgICAgICBtYXhGbHVzaEJ5dGVzXywKKyAgICAgIG1heEZsdXNoSW50ZXJ2YWxfLAorICAgICAgaW9FcnJvclNsZWVwRHVyYXRpb25fCisgICAgKTsKKyAgICBzZXRNYXhNYWlsYm94U2l6ZSh3cml0ZXJUaHJlYWRfLCBldmVudEJ1ZmZlclNpemVfLCBPbkNyb3dkaW5nLmJsb2NrKTsKKyAgICBpc09wZW5fID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCwgaS5lLiB0aGUgdW5kZXJseWluZyBmaWxlIGFuZCB0aGUgd3JpdGVyIHRocmVhZC4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKworICAgIHNlbmQod3JpdGVyVGhyZWFkXywgU2h1dGRvd25NZXNzYWdlKCksIHRoaXNUaWQpOworICAgIHJlY2VpdmUoKFNodXRkb3duTWVzc2FnZSBtc2csIFRpZCB0aWQpe30pOworICAgIGlzT3Blbl8gPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBFbnF1ZXVlcyB0aGUgcGFzc2VkIHNsaWNlIG9mIGRhdGEgZm9yIHdyaXRpbmcgYW5kIGltbWVkaWF0ZWx5IHJldHVybnMuCisgICAqIHdyaXRlKCkgb25seSBibG9ja3MgaWYgdGhlIGV2ZW50IGJ1ZmZlciBoYXMgYmVlbiBleGhhdXN0ZWQuCisgICAqCisgICAqIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gU2xpY2Ugb2YgZGF0YSB0byB3cml0ZS4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHdyaXRlIHRvIG5vbi1vcGVuIGZpbGUuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoYnVmLmVtcHR5KSB7CisgICAgICBsb2dFcnJvcigiQ2Fubm90IHdyaXRlIGVtcHR5IGV2ZW50LCBza2lwcGluZy4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIG1heFNpemUgPSBjaHVua1NpemUgLSBFdmVudFNpemUuc2l6ZW9mOworICAgIGVuZm9yY2UoYnVmLmxlbmd0aCA8PSBtYXhTaXplLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgd3JpdGUgbW9yZSB0aGFuICIgfiB0byFzdHJpbmcobWF4U2l6ZSkgfgorICAgICAgImJ5dGVzIGF0IG9uY2UgZHVlIHRvIGNodW5rIHNpemUuIikpOworCisgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBidWYuaWR1cCk7CisgIH0KKworICAvKioKKyAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAqCisgICAqIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IGZsdXNoIGZpbGUgaWYgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBzZW5kKHdyaXRlclRocmVhZF8sIEZsdXNoTWVzc2FnZSgpLCB0aGlzVGlkKTsKKyAgICByZWNlaXZlKChGbHVzaE1lc3NhZ2UgbXNnLCBUaWQgdGlkKXt9KTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2h1bmtzIHRoZSBmaWxlIGlzIGRpdmlkZWQgaW50bywgaW4gYnl0ZXMuCisgICAqCisgICAqIEEgc2luZ2xlIGV2ZW50ICh3cml0ZSBjYWxsKSBuZXZlciBzcGFucyBtdWx0aXBsZSBjaHVua3Mg4oCTIHRoaXMKKyAgICogZWZmZWN0aXZlbHkgbGltaXRzIHRoZSBldmVudCBzaXplIHRvIGNodW5rU2l6ZSAtIEV2ZW50U2l6ZS5zaXplb2YuCisgICAqLworICB1bG9uZyBjaHVua1NpemUoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBjaHVua1NpemVfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgY2h1bmtTaXplKHVsb25nIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UoIWlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHNldCBjaHVuayBzaXplIGFmdGVyIFRGaWxlV3JpdGVyVHJhbnNwb3J0IGhhcyBiZWVuIG9wZW5lZC4iKSk7CisgICAgY2h1bmtTaXplXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB3cml0ZSgpIGNhbGxzIGJ1ZmZlcmVkLCBvciB6ZXJvIGZvciBubyBsaW1pdC4KKyAgICoKKyAgICogSWYgdGhlIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIHdyaXRlKCkgd2lsbCBibG9jayB1bnRpbCBzcGFjZSBiZWNvbWVzCisgICAqIGF2YWlsYWJsZS4KKyAgICovCisgIHNpemVfdCBldmVudEJ1ZmZlclNpemUoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBldmVudEJ1ZmZlclNpemVfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgZXZlbnRCdWZmZXJTaXplKHNpemVfdCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBldmVudEJ1ZmZlclNpemVfID0gdmFsdWU7CisgICAgaWYgKGlzT3BlbikgeworICAgICAgc2V0TWF4TWFpbGJveFNpemUod3JpdGVyVGhyZWFkXywgdmFsdWUsIE9uQ3Jvd2RpbmcudGhyb3dFeGNlcHRpb24pOworICAgIH0KKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfRVZFTlRfQlVGRkVSX1NJWkUgPSAxMF8wMDA7CisKKyAgLyoqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB3cml0aW5nIGFuZCBmbHVzaGluZyB0aGUgZmlsZQorICAgKiB0byBkaXNrLgorICAgKgorICAgKiBDdXJyZW50bHkgY2Fubm90IGJlIHNldCBhZnRlciB0aGUgZmlyc3QgY2FsbCB0byB3cml0ZSgpLgorICAgKi8KKyAgc2l6ZV90IG1heEZsdXNoQnl0ZXMoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBtYXhGbHVzaEJ5dGVzXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIG1heEZsdXNoQnl0ZXMoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIG1heEZsdXNoQnl0ZXNfID0gdmFsdWU7CisgICAgaWYgKGlzT3BlbikgeworICAgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBGbHVzaEJ5dGVzTWVzc2FnZSh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfTUFYX0ZMVVNIX0JZVEVTID0gMTAwMCAqIDEwMjQ7CisKKyAgLyoqCisgICAqIE1heGltdW0gaW50ZXJ2YWwgYmV0d2VlbiBmbHVzaGluZyB0aGUgZmlsZSB0byBkaXNrLgorICAgKgorICAgKiBDdXJyZW5sdHkgY2Fubm90IGJlIHNldCBhZnRlciB0aGUgZmlyc3QgY2FsbCB0byB3cml0ZSgpLgorICAgKi8KKyAgRHVyYXRpb24gbWF4Rmx1c2hJbnRlcnZhbCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG1heEZsdXNoSW50ZXJ2YWxfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgbWF4Rmx1c2hJbnRlcnZhbChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBtYXhGbHVzaEludGVydmFsXyA9IHZhbHVlOworICAgIGlmIChpc09wZW4pIHsKKyAgICAgIHNlbmQod3JpdGVyVGhyZWFkXywgRmx1c2hJbnRlcnZhbE1lc3NhZ2UodmFsdWUpKTsKKyAgICB9CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX01BWF9GTFVTSF9JTlRFUlZBTCA9IGR1ciEic2Vjb25kcyIoMyk7CisKKyAgLyoqCisgICAqIFdoZW4gdGhlIHdyaXRlciB0aHJlYWQgZW5jb3VudGVyZXMgYW4gSS9PIGVycm9yLCBpdCBnb2VzIHBhdXNlcyBmb3IgYQorICAgKiBzaG9ydCB0aW1lIGJlZm9yZSB0cnlpbmcgdG8gcmVvcGVuIHRoZSBvdXRwdXQgZmlsZS4gVGhpcyBjb250cm9scyB0aGUKKyAgICogc2xlZXAgZHVyYXRpb24uCisgICAqLworICBEdXJhdGlvbiBpb0Vycm9yU2xlZXBEdXJhdGlvbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGlvRXJyb3JTbGVlcER1cmF0aW9uXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIGlvRXJyb3JTbGVlcER1cmF0aW9uKER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uXyA9IHZhbHVlOworICAgIGlmIChpc09wZW4pIHsKKyAgICAgIHNlbmQod3JpdGVyVGhyZWFkXywgRmx1c2hJbnRlcnZhbE1lc3NhZ2UodmFsdWUpKTsKKyAgICB9CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX0lPX0VSUk9SX1NMRUVQX0RVUkFUSU9OID0gZHVyISJtc2VjcyIoNTAwKTsKKworcHJpdmF0ZToKKyAgc3RyaW5nIHBhdGhfOworICB1bG9uZyBjaHVua1NpemVfOworICBzaXplX3QgZXZlbnRCdWZmZXJTaXplXzsKKyAgRHVyYXRpb24gaW9FcnJvclNsZWVwRHVyYXRpb25fOworICBzaXplX3QgbWF4Rmx1c2hCeXRlc187CisgIER1cmF0aW9uIG1heEZsdXNoSW50ZXJ2YWxfOworICBib29sIGlzT3Blbl87CisgIFRpZCB3cml0ZXJUaHJlYWRfOworfQorCitwcml2YXRlIHsKKyAgLy8gU2lnbmFscyB0aGF0IHRoZSBmaWxlIHNob3VsZCBiZSBmbHVzaGVkIG9uIGRpc2suIFNlbnQgdG8gdGhlIHdyaXRlcgorICAvLyB0aHJlYWQgYW5kIHNlbnQgYmFjayBhbG9uZyB3aXRoIHRoZSB0aWQgZm9yIGNvbmZpcm1hdGlvbi4KKyAgc3RydWN0IEZsdXNoTWVzc2FnZSB7fQorCisgIC8vIFNpZ25hbHMgdGhhdCB0aGUgd3JpdGVyIHRocmVhZCBzaG91bGQgY2xvc2UgdGhlIGZpbGUgYW5kIHNodXQgZG93bi4gU2VudAorICAvLyB0byB0aGUgd3JpdGVyIHRocmVhZCBhbmQgc2VudCBiYWNrIGFsb25nIHdpdGggdGhlIHRpZCBmb3IgY29uZmlybWF0aW9uLgorICBzdHJ1Y3QgU2h1dGRvd25NZXNzYWdlIHt9CisKKyAgc3RydWN0IEZsdXNoQnl0ZXNNZXNzYWdlIHsKKyAgICBzaXplX3QgdmFsdWU7CisgIH0KKworICBzdHJ1Y3QgRmx1c2hJbnRlcnZhbE1lc3NhZ2UgeworICAgIER1cmF0aW9uIHZhbHVlOworICB9CisKKyAgc3RydWN0IElvRXJyb3JTbGVlcER1cmF0aW9uTWVzc2FnZSB7CisgICAgRHVyYXRpb24gdmFsdWU7CisgIH0KKworICB2b2lkIHdyaXRlclRocmVhZCgKKyAgICBzdHJpbmcgcGF0aCwKKyAgICB1bG9uZyBjaHVua1NpemUsCisgICAgc2l6ZV90IG1heEZsdXNoQnl0ZXMsCisgICAgRHVyYXRpb24gbWF4Rmx1c2hJbnRlcnZhbCwKKyAgICBEdXJhdGlvbiBpb0Vycm9yU2xlZXBEdXJhdGlvbgorICApIHsKKyAgICBib29sIGVycm9yT3BlbmluZzsKKyAgICBGaWxlIGZpbGU7CisgICAgdWxvbmcgb2Zmc2V0OworICAgIHRyeSB7CisgICAgICAvLyBPcGVuIGZpbGUgaW4gYXBwZW5kaW5nIGFuZCBiaW5hcnkgbW9kZS4KKyAgICAgIGZpbGUgPSBGaWxlKHBhdGgsICJhYiIpOworICAgICAgb2Zmc2V0ID0gZmlsZS50ZWxsKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJFcnJvciBvbiBvcGVuaW5nIG91dHB1dCBmaWxlIGluIHdyaXRlciB0aHJlYWQ6ICVzIiwgZSk7CisgICAgICBlcnJvck9wZW5pbmcgPSB0cnVlOworICAgIH0KKworICAgIGF1dG8gZmx1c2hUaW1lciA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICBzaXplX3QgdW5mbHVzaGVkQnl0ZUNvdW50OworCisgICAgVGlkIHNodXRkb3duUmVxdWVzdFRpZDsKKyAgICBib29sIHNodXRkb3duUmVxdWVzdGVkOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoc2h1dGRvd25SZXF1ZXN0ZWQpIGJyZWFrOworCisgICAgICBib29sIGZvcmNlRmx1c2g7CisgICAgICBUaWQgZmx1c2hSZXF1ZXN0VGlkOworICAgICAgcmVjZWl2ZVRpbWVvdXQobWF4KGR1ciEiaG5zZWNzIigwKSwgbWF4Rmx1c2hJbnRlcnZhbCAtIGZsdXNoVGltZXIucGVlaygpKSwKKyAgICAgICAgKGltbXV0YWJsZSh1Ynl0ZSlbXSBkYXRhKSB7CisgICAgICAgICAgd2hpbGUgKGVycm9yT3BlbmluZykgeworICAgICAgICAgICAgbG9nRXJyb3IoIldyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVzIMK1cyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgaW9FcnJvclNsZWVwRHVyYXRpb24udG90YWwhInVzZWNzIik7CisKKyAgICAgICAgICAgIC8vIFNsZWVwIGZvciBpb0Vycm9yU2xlZXBEdXJhdGlvbiwgYmVpbmcgcmVhZHkgdG8gYmUgaW50ZXJydXB0ZWQKKyAgICAgICAgICAgIC8vIGJ5IHNodXRkb3duIHJlcXVlc3RzLgorICAgICAgICAgICAgYXV0byB0aW1lZE91dCA9IHJlY2VpdmVUaW1lb3V0KGlvRXJyb3JTbGVlcER1cmF0aW9uLAorICAgICAgICAgICAgICAoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCl7IHNodXRkb3duUmVxdWVzdFRpZCA9IHRpZDsgfSk7CisgICAgICAgICAgICBpZiAoIXRpbWVkT3V0KSB7CisgICAgICAgICAgICAgIC8vIFdlIGdvdCBhIHNodXRkb3duIHJlcXVlc3QsIGp1c3QgZHJvcCBhbGwgZXZlbnRzIGFuZCBleGl0IHRoZQorICAgICAgICAgICAgICAvLyBtYWluIGxvb3AgYXMgdG8gbm90IGJsb2NrIGFwcGxpY2F0aW9uIHNodXRkb3duIHdpdGggb3VyIHRyaWVzCisgICAgICAgICAgICAgIC8vIHdoaWNoIHdlIG11c3QgYXNzdW1lIHRvIGZhaWwuCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmaWxlID0gRmlsZShwYXRoLCAiYWIiKTsKKyAgICAgICAgICAgICAgdW5mbHVzaGVkQnl0ZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgZXJyb3JPcGVuaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgIGxvZ0Vycm9yKCJPdXRwdXQgZmlsZSAlcyByZW9wZW5lZCBkdXJpbmcgd3JpdGVyIHRocmVhZCBlcnJvciAiIH4KKyAgICAgICAgICAgICAgICAicmVjb3ZlcnkiLCBwYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIGxvZ0Vycm9yKCJVbmFibGUgdG8gcmVvcGVuIG91dHB1dCBmaWxlICVzIGR1cmluZyB3cml0ZXIgIiB+CisgICAgICAgICAgICAgICAgInRocmVhZCBlcnJvciByZWNvdmVyeSIsIHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXZlbnQgZG9lcyBub3QgY3Jvc3MgdGhlIGNodW5rIGJvdW5kYXJ5IGJ5IHdyaXRpbmcKKyAgICAgICAgICAvLyBhIHBhZGRpbmcgY29uc2lzdGluZyBvZiB6ZXJvZXMgaWYgaXQgd291bGQuCisgICAgICAgICAgYXV0byBjaHVuazEgPSBvZmZzZXQgLyBjaHVua1NpemU7CisgICAgICAgICAgYXV0byBjaHVuazIgPSAob2Zmc2V0ICsgRXZlbnRTaXplLnNpemVvZiArIGRhdGEubGVuZ3RoIC0gMSkgLyBjaHVua1NpemU7CisKKyAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgeworICAgICAgICAgICAgLy8gVE9ETzogVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiByZWZldGNoZXMgdGhlIG9mZnNldCBoZXJlIHRvIMK7a2VlcAorICAgICAgICAgICAgLy8gaW4gc3luY8KrIOKAkyB3aHkgd291bGQgdGhpcyBiZSBuZWVkZWQ/CisgICAgICAgICAgICBhdXRvIHBhZGRpbmcgPSBjYXN0KHNpemVfdCkKKyAgICAgICAgICAgICAgKCgoKG9mZnNldCAvIGNodW5rU2l6ZSkgKyAxKSAqIGNodW5rU2l6ZSkgLSBvZmZzZXQpOworICAgICAgICAgICAgYXV0byB6ZXJvZXMgPSBuZXcgdWJ5dGVbcGFkZGluZ107CisgICAgICAgICAgICBmaWxlLnJhd1dyaXRlKHplcm9lcyk7CisgICAgICAgICAgICB1bmZsdXNoZWRCeXRlQ291bnQgKz0gcGFkZGluZzsKKyAgICAgICAgICAgIG9mZnNldCArPSBwYWRkaW5nOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFRPRE86IDIgc3lzY2FsbHMgaGVyZSwgaXMgdGhpcyBhIHByb2JsZW0gcGVyZm9ybWFuY2Utd2lzZT8KKyAgICAgICAgICAvLyBQcm9iYWJseSBhYnlzbWFsIHBlcmZvcm1hbmNlIG9uIFdpbmRvd3MgZHVlIHRvIHJhd1dyaXRlCisgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgdWludCBsZW4gPSBjYXN0KHVpbnQpZGF0YS5sZW5ndGg7CisgICAgICAgICAgZmlsZS5yYXdXcml0ZShjYXN0KHVieXRlW10pKCZsZW4pWzAuLjFdKTsKKyAgICAgICAgICBmaWxlLnJhd1dyaXRlKGRhdGEpOworCisgICAgICAgICAgYXV0byBieXRlc1dyaXR0ZW4gPSBFdmVudFNpemUuc2l6ZW9mICsgZGF0YS5sZW5ndGg7CisgICAgICAgICAgdW5mbHVzaGVkQnl0ZUNvdW50ICs9IGJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNXcml0dGVuOworICAgICAgICB9LCAoRmx1c2hCeXRlc01lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgbWF4Rmx1c2hCeXRlcyA9IG1zZy52YWx1ZTsKKyAgICAgICAgfSwgKEZsdXNoSW50ZXJ2YWxNZXNzYWdlIG1zZykgeworICAgICAgICAgIG1heEZsdXNoSW50ZXJ2YWwgPSBtc2cudmFsdWU7CisgICAgICAgIH0sIChJb0Vycm9yU2xlZXBEdXJhdGlvbk1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgaW9FcnJvclNsZWVwRHVyYXRpb24gPSBtc2cudmFsdWU7CisgICAgICAgIH0sIChGbHVzaE1lc3NhZ2UgbXNnLCBUaWQgdGlkKSB7CisgICAgICAgICAgZm9yY2VGbHVzaCA9IHRydWU7CisgICAgICAgICAgZmx1c2hSZXF1ZXN0VGlkID0gdGlkOworICAgICAgICB9LCAoT3duZXJUZXJtaW5hdGVkIG1zZykgeworICAgICAgICAgIHNodXRkb3duUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgfSwgKFNodXRkb3duTWVzc2FnZSBtc2csIFRpZCB0aWQpIHsKKyAgICAgICAgICBzaHV0ZG93blJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgICAgc2h1dGRvd25SZXF1ZXN0VGlkID0gdGlkOworICAgICAgICB9CisgICAgICApOworCisgICAgICBpZiAoZXJyb3JPcGVuaW5nKSBjb250aW51ZTsKKworICAgICAgYm9vbCBmbHVzaDsKKyAgICAgIGlmIChmb3JjZUZsdXNoIHx8IHNodXRkb3duUmVxdWVzdGVkIHx8IHVuZmx1c2hlZEJ5dGVDb3VudCA+IG1heEZsdXNoQnl0ZXMpIHsKKyAgICAgICAgZmx1c2ggPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChjYXN0KER1cmF0aW9uKWZsdXNoVGltZXIucGVlaygpID4gbWF4Rmx1c2hJbnRlcnZhbCkgeworICAgICAgICBpZiAodW5mbHVzaGVkQnl0ZUNvdW50ID09IDApIHsKKyAgICAgICAgICAvLyBJZiB0aGUgZmx1c2ggdGltZXIgaXMgZHVlLCBidXQgbm8gZGF0YSBoYXMgYmVlbiB3cml0dGVuLCBkb24ndAorICAgICAgICAgIC8vIG5lZWRsZXNzbHkgZnN5bmMsIGJ1dCBkbyByZXNldCB0aGUgdGltZXIuCisgICAgICAgICAgZmx1c2hUaW1lci5yZXNldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgZmlsZS5mbHVzaCgpOworICAgICAgICBmbHVzaFRpbWVyLnJlc2V0KCk7CisgICAgICAgIHVuZmx1c2hlZEJ5dGVDb3VudCA9IDA7CisgICAgICAgIGlmIChmb3JjZUZsdXNoKSBzZW5kKGZsdXNoUmVxdWVzdFRpZCwgRmx1c2hNZXNzYWdlKCksIHRoaXNUaWQpOworICAgICAgfQorICAgIH0KKworICAgIGZpbGUuY2xvc2UoKTsKKworICAgIGlmIChzaHV0ZG93blJlcXVlc3RUaWQgIT0gVGlkLmluaXQpIHsKKyAgICAgIHNlbmQoc2h1dGRvd25SZXF1ZXN0VGlkLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7CisgICAgfQorICB9Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworICBpbXBvcnQgc3RkLmZpbGU7Cit9CisKK3VuaXR0ZXN0IHsKKyAgdm9pZCB0cnlSZW1vdmUoc3RyaW5nIGZpbGVOYW1lKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlbW92ZShmaWxlTmFtZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uKSB7fQorICB9CisKKyAgaW1tdXRhYmxlIGZpbGVOYW1lID0gInVuaXR0ZXN0LmRhdC50bXAiOworICBlbmZvcmNlKCFleGlzdHMoZmlsZU5hbWUpLCAiVW5pdCB0ZXN0IG91dHB1dCBmaWxlICIgfiBmaWxlTmFtZSB+CisgICAgIiBhbHJlYWR5IGV4aXN0cy4iKTsKKworICAvKgorICAgKiBDaGVjayB0aGUgbW9zdCBiYXNpYyByZWFkaW5nL3dyaXRpbmcgb3BlcmF0aW9ucy4KKyAgICovCisgIHsKKyAgICBzY29wZSAoZXhpdCkgdHJ5UmVtb3ZlKGZpbGVOYW1lKTsKKworICAgIGF1dG8gd3JpdGVyID0gbmV3IFRGaWxlV3JpdGVyVHJhbnNwb3J0KGZpbGVOYW1lKTsKKyAgICB3cml0ZXIub3BlbigpOworICAgIHNjb3BlIChleGl0KSB3cml0ZXIuY2xvc2UoKTsKKworICAgIHdyaXRlci53cml0ZShbMSwgMl0pOworICAgIHdyaXRlci53cml0ZShbMywgNF0pOworICAgIHdyaXRlci53cml0ZShbNSwgNiwgN10pOworICAgIHdyaXRlci5mbHVzaCgpOworCisgICAgYXV0byByZWFkZXIgPSBuZXcgVEZpbGVSZWFkZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgIHJlYWRlci5vcGVuKCk7CisgICAgc2NvcGUgKGV4aXQpIHJlYWRlci5jbG9zZSgpOworCisgICAgYXV0byBidWYgPSBuZXcgdWJ5dGVbN107CisgICAgcmVhZGVyLnJlYWRBbGwoYnVmKTsKKyAgICBlbmZvcmNlKGJ1ZiA9PSBbMSwgMiwgMywgNCwgNSwgNiwgN10pOworICB9CisKKyAgLyoKKyAgICogQ2hlY2sgdGhhdCBjaHVua2luZyB3b3JrcyBhcyBleHBlY3RlZC4KKyAgICovCisgIHsKKyAgICBzY29wZSAoZXhpdCkgdHJ5UmVtb3ZlKGZpbGVOYW1lKTsKKworICAgIHN0YXRpYyBhc3NlcnQoRXZlbnRTaXplLnNpemVvZiA9PSA0KTsKKyAgICBlbnVtIENIVU5LX1NJWkUgPSAxMDsKKworICAgIC8vIFdyaXRlIHNvbWUgY29udGVudHMgdG8gdGhlIGZpbGUuCisgICAgeworICAgICAgYXV0byB3cml0ZXIgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgICAgd3JpdGVyLmNodW5rU2l6ZSA9IENIVU5LX1NJWkU7CisgICAgICB3cml0ZXIub3BlbigpOworICAgICAgc2NvcGUgKGV4aXQpIHdyaXRlci5jbG9zZSgpOworCisgICAgICB3cml0ZXIud3JpdGUoWzB4ZGVdKTsKKyAgICAgIHdyaXRlci53cml0ZShbMHhhZF0pOworICAgICAgLy8gQ2h1bmsgYm91bmRhcnkgaGVyZS4KKyAgICAgIHdyaXRlci53cml0ZShbMHhiZV0pOworICAgICAgLy8gVGhlIG5leHQgd3JpdGUgZG9lc24ndCBmaXQgaW4gdGhlIGZpdmUgYnl0ZXMgcmVtYWluaW5nLCBzbyB3ZSBleHBlY3QKKyAgICAgIC8vIHBhZGRpbmcgemVybyBieXRlcyB0byBiZSB3cml0dGVuLgorICAgICAgd3JpdGVyLndyaXRlKFsweGVmLCAweDEyXSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlci53cml0ZShuZXcgdWJ5dGVbQ0hVTktfU0laRV0pOworICAgICAgICBlbmZvcmNlKGZhbHNlLCAiQ291bGQgd3JpdGUgZXZlbnQgbm90IGZpdHRpbmcgaW4gYSBzaW5nbGUgY2h1bmsuIik7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHt9CisKKyAgICAgIHdyaXRlci5mbHVzaCgpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoZSByYXcgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gc2VlIGlmIGNodW5rIHBhZGRpbmcgd2FzIHdyaXR0ZW4KKyAgICAvLyBhcyBleHBlY3RlZC4KKyAgICBhdXRvIGZpbGUgPSBGaWxlKGZpbGVOYW1lLCAiciIpOworICAgIGVuZm9yY2UoZmlsZS5zaXplID09IDI2KTsKKyAgICBhdXRvIHdyaXR0ZW4gPSBuZXcgdWJ5dGVbMjZdOworICAgIGZpbGUucmF3UmVhZCh3cml0dGVuKTsKKyAgICBlbmZvcmNlKHdyaXR0ZW4gPT0gWworICAgICAgMSwgMCwgMCwgMCwgMHhkZSwKKyAgICAgIDEsIDAsIDAsIDAsIDB4YWQsCisgICAgICAxLCAwLCAwLCAwLCAweGJlLAorICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDIsIDAsIDAsIDAsIDB4ZWYsIDB4MTIKKyAgICBdKTsKKworICAgIC8vIFJlYWQgdGhlIGRhdGEgYmFjayBpbiwgZ2V0dGluZyBhbGwgdGhlIGV2ZW50cyBhdCBvbmNlLgorICAgIHsKKyAgICAgIGF1dG8gcmVhZGVyID0gbmV3IFRGaWxlUmVhZGVyVHJhbnNwb3J0KGZpbGVOYW1lKTsKKyAgICAgIHJlYWRlci5jaHVua1NpemUgPSBDSFVOS19TSVpFOworICAgICAgcmVhZGVyLm9wZW4oKTsKKyAgICAgIHNjb3BlIChleGl0KSByZWFkZXIuY2xvc2UoKTsKKworICAgICAgYXV0byBidWYgPSBuZXcgdWJ5dGVbNV07CisgICAgICByZWFkZXIucmVhZEFsbChidWYpOworICAgICAgZW5mb3JjZShidWYgPT0gWzB4ZGUsIDB4YWQsIDB4YmUsIDB4ZWYsIDB4MTJdKTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBNYWtlIHN1cmUgdGhhdCBjbG9zZSgpIGV4aXRzICJxdWlja2x5IiwgaS5lLiB0aGF0IHRoZXJlIGlzIG5vIHByb2JsZW0KKyAgICogd2l0aCB0aGUgd29ya2VyIHRocmVhZCB3YWtpbmcgdXAuCisgICAqLworICB7CisgICAgaW1wb3J0IHN0ZC5jb252IDogdGV4dDsKKyAgICBlbnVtIE5VTV9JVEVSQVRJT05TID0gMTAwMDsKKworICAgIHVpbnQgbnVtT3ZlciA9IDA7CisgICAgZm9yZWFjaCAobjsgMCAuLiBOVU1fSVRFUkFUSU9OUykgeworICAgICAgc2NvcGUgKGV4aXQpIHRyeVJlbW92ZShmaWxlTmFtZSk7CisKKyAgICAgIGF1dG8gdHJhbnNwb3J0ID0gbmV3IFRGaWxlV3JpdGVyVHJhbnNwb3J0KGZpbGVOYW1lKTsKKyAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICAgIC8vIFdyaXRlIHNvbWV0aGluZyBzbyB0aGF0IHRoZSB3cml0ZXIgdGhyZWFkIGdldHMgc3RhcnRlZC4KKyAgICAgIHRyYW5zcG9ydC53cml0ZShjYXN0KHVieXRlW10pImZvbyIpOworCisgICAgICAvLyBFdmVyeSBvdGhlciBpdGVyYXRpb24sIGFsc28gY2FsbCBmbHVzaCgpLCBqdXN0IGluIGNhc2UgdGhhdCBwb3RlbnRpYWxseQorICAgICAgLy8gaGFzIGFueSBlZmZlY3Qgb24gaG93IHRoZSB3cml0ZXIgdGhyZWFkIHdha2VzIHVwLgorICAgICAgaWYgKG4gJiAweDEpIHsKKyAgICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICB9CisKKyAgICAgIC8vIFRpbWUgdGhlIGNhbGwgdG8gY2xvc2UoKS4KKyAgICAgIGF1dG8gc3cgPSBTdG9wV2F0Y2goQXV0b1N0YXJ0Lnllcyk7CisgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIHN3LnN0b3AoKTsKKworICAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmF0YWwgZmFpbHVyZSB0bworICAgICAgLy8gYXZvaWQgbG9vcGluZyBvdmVyIGEgcG90ZW50aWFsbHkgdmVyeSBzbG93IG9wZXJhdGlvbi4KKyAgICAgIGVuZm9yY2Uoc3cucGVlaygpLnRvdGFsISJtc2VjcyIgPCAxNTAwLAorICAgICAgICB0ZXh0KCJjbG9zZSgpIHRvb2sgIiwgc3cucGVlaygpLnRvdGFsISJtc2VjcyIsICJtcy4iKSk7CisKKyAgICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gNW1zIG9uIG15IGRldiBib3guCisgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMgY2FuIHRha2UKKyAgICAgIC8vIGxvbmdlci4gQWRkaXRpb25hbGx5LCBvbiBhIFdpbmRvd3MgU2VydmVyIDIwMDggaW5zdGFuY2UgcnVubmluZyBpbgorICAgICAgLy8gYSBWaXJ0dWFsQm94IFZNLCBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGFib3V0IGEgcXVhcnRlciBvZiB0aGUgcnVucworICAgICAgLy8gdGFrZXMgKDIxNyDCsSAxKSBtcywgZm9yIHJlYXNvbnMgbm90IHlldCBrbm93bi4KKyAgICAgIGlmIChzdy5wZWVrKCkudG90YWwhIm1zZWNzIiA+IDUwKSB7CisgICAgICAgICsrbnVtT3ZlcjsKKyAgICAgIH0KKworICAgICAgLy8gRm9yY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIHJ1bnMgZXZlcnkgbm93IGFuZCB0aGVuIHRvIG1ha2Ugc3VyZSB3ZQorICAgICAgLy8gZG9uJ3QgcnVuIG91dCBvZiBPUyB0aHJlYWQgaGFuZGxlcy4KKyAgICAgIGlmICghKG4gJSAxMDApKSBHQy5jb2xsZWN0KCk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIGZld2VyIHRoYW4gYSB0aGlyZCBvZiB0aGUgcnVucyB0b29rIGxvbmdlciB0aGFuIDVtcy4KKyAgICBlbmZvcmNlKG51bU92ZXIgPCBOVU1fSVRFUkFUSU9OUyAvIDMsCisgICAgICB0ZXh0KG51bU92ZXIsICIgaXRlcmF0aW9ucyB0b29rIG1vcmUgdGhhbiAxMCBtcy4iKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlZmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZC5kCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKKworaW1wb3J0IGNvcmUuYml0b3AgOiBic3dhcDsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LgorICoKKyAqIEFsbCB3cml0ZXMgZ28gaW50byBhbiBpbi1tZW1vcnkgYnVmZmVyIHVudGlsIGZsdXNoIGlzIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQKKyAqIHRoZSB0cmFuc3BvcnQgd3JpdGVzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBiaW5hcnkgY2h1bmsgZm9sbG93ZWQgYnkgdGhlCisgKiBkYXRhIHBheWxvYWQuIFRoZSByZWNlaXZlciBvbiB0aGUgb3RoZXIgZW5kIHRoZW4gcGVyZm9ybXMgYSBzaW5nbGUKKyAqIMK7Zml4ZWQtbGVuZ3RowqsgcmVhZCB0byBnZXQgdGhlIHdob2xlIG1lc3NhZ2Ugb2ZmIHRoZSB3aXJlLgorICovCitmaW5hbCBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBmcmFtZWQgdHJhbnNwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHdyYXAuCisgICAqLworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIHRyYW5zcG9ydC4KKyAgICovCisgIFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF87CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiByQnVmXy5sZW5ndGggPiAwIHx8IHRyYW5zcG9ydF8ucGVlaygpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHRyYW5zcG9ydF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBmbHVzaCgpOworICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0cyB0byByZWFkIGRhdGEgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLCBzdG9wcGluZyB3aGVuIHRoZSBidWZmZXIgaXMKKyAgICogZXhoYXVzdGVkIG9yIHRoZSBmcmFtZSBlbmQgaXMgcmVhY2hlZC4KKyAgICoKKyAgICogVE9ETzogQ29udHJhcnkgdG8gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBuZXZlciBkb2VzIGNyb3NzLWZyYW1lCisgICAqIHJlYWRzIOKAkyBpcyB0aGVyZSBhY3R1YWxseSBhIHZhbGlkIHVzZSBjYXNlIGZvciB0aGF0PworICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gU2xpY2UgdG8gdXNlIGFzIGJ1ZmZlci4KKyAgICoKKyAgICogUmV0dXJuczogSG93IG1hbnkgYnl0ZXMgd2VyZSBhY3R1YWxseSByZWFkLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICAvLyBJZiB0aGUgYnVmZmVyIGlzIGVtcHR5LCByZWFkIGEgbmV3IGZyYW1lIG9mZiB0aGUgd2lyZS4KKyAgICBpZiAockJ1Zl8uZW1wdHkpIHsKKyAgICAgIGJvb2wgZ290RnJhbWUgPSByZWFkRnJhbWUoKTsKKyAgICAgIGlmICghZ290RnJhbWUpIHJldHVybiAwOworICAgIH0KKworICAgIGF1dG8gc2l6ZSA9IG1pbihyQnVmXy5sZW5ndGgsIGJ1Zi5sZW5ndGgpOworICAgIGJ1ZlswLi5zaXplXSA9IHJCdWZfWzAuLnNpemVdOworICAgIHJCdWZfID0gckJ1Zl9bc2l6ZS4uJF07CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgd0J1Zl8gfj0gYnVmOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBpZiAod0J1Zl8uZW1wdHkpIHJldHVybjsKKworICAgIC8vIFByb3Blcmx5IHJlc2V0IHRoZSB3cml0ZSBidWZmZXIgZXZlbiBzb21lIG9mIHRoZSBwcm90b2NvbCBvcGVyYXRpb25zIGdvCisgICAgLy8gd3JvbmcuCisgICAgc2NvcGUgKGV4aXQpIHsKKyAgICAgIHdCdWZfLmxlbmd0aCA9IDA7CisgICAgICB3QnVmXy5hc3N1bWVTYWZlQXBwZW5kKCk7CisgICAgfQorCisgICAgaW50IGxlbiA9IGJzd2FwKGNhc3QoaW50KXdCdWZfLmxlbmd0aCk7CisgICAgdHJhbnNwb3J0Xy53cml0ZShjYXN0KHVieXRlW10pKCZsZW4pWzAuLjFdKTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKHdCdWZfKTsKKyAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CisgIH0KKworICBvdmVycmlkZSBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgIGlmIChsZW4gPD0gckJ1Zl8ubGVuZ3RoKSB7CisgICAgICByZXR1cm4gckJ1Zl87CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERvbid0IHRyeSBhdHRlbXB0aW5nIGNyb3NzLWZyYW1lIGJvcnJvd3MsIHRyeWluZyB0aGF0IGRvZXMgbm90IG1ha2UKKyAgICAgIC8vIG11Y2ggc2Vuc2UgYW55d2F5LgorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICBlbmZvcmNlKGxlbiA8PSByQnVmXy5sZW5ndGgsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkludmFsaWQgY29uc3VtZSBsZW5ndGgiLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKyAgICByQnVmXyA9IHJCdWZfW2xlbiAuLiAkXTsKKyAgfQorCitwcml2YXRlOgorICBib29sIHJlYWRGcmFtZSgpIHsKKyAgICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLiBXZSBjYW4ndCB1c2UgcmVhZEFsbCgpIHNpbmNlIHRoYXQKKyAgICAvLyBhbHdheXMgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBFT0YsIGJ1dCB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvbmx5CisgICAgLy8gaWYgRU9GIG9jY3VycyBhZnRlciBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgICBpbnQgc2l6ZTsKKyAgICBzaXplX3Qgc2l6ZV9yZWFkOworICAgIHdoaWxlIChzaXplX3JlYWQgPCBzaXplLnNpemVvZikgeworICAgICAgYXV0byBkYXRhID0gKGNhc3QodWJ5dGUqKSZzaXplKVtzaXplX3JlYWQuLnNpemUuc2l6ZW9mXTsKKyAgICAgIGF1dG8gcmVhZCA9IHRyYW5zcG9ydF8ucmVhZChkYXRhKTsKKyAgICAgIGlmIChyZWFkID09IDApIHsKKyAgICAgICAgaWYgKHNpemVfcmVhZCA9PSAwKSB7CisgICAgICAgICAgLy8gRU9GIGJlZm9yZSBhbnkgZGF0YSB3YXMgcmVhZC4KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRU9GIGFmdGVyIGEgcGFydGlhbCBmcmFtZSBoZWFkZXIg4oCTIGlsbGVnYWwuCisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQgYWZ0ZXIgcGFydGlhbCBmcmFtZSBoZWFkZXIiLAorICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFCisgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2l6ZV9yZWFkICs9IHJlYWQ7CisgICAgfQorCisgICAgc2l6ZSA9IGJzd2FwKHNpemUpOworICAgIGVuZm9yY2Uoc2l6ZSA+PSAwLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSBoYXMgbmVnYXRpdmUgdmFsdWUiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKSk7CisKKyAgICAvLyBUT0RPOiBCZW5jaG1hcmsgdGhpcy4KKyAgICByQnVmXy5sZW5ndGggPSBzaXplOworICAgIHJCdWZfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKworICAgIHRyYW5zcG9ydF8ucmVhZEFsbChyQnVmXyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBUVHJhbnNwb3J0IHRyYW5zcG9ydF87CisgIHVieXRlW10gckJ1Zl87CisgIHVieXRlW10gd0J1Zl87Cit9CisKKy8qKgorICogV3JhcHMgZ2l2ZW4gdHJhbnNwb3J0cyBpbnRvIFRGcmFtZWRUcmFuc3BvcnRzLgorICovCithbGlhcyBUV3JhcHBlclRyYW5zcG9ydEZhY3RvcnkhVEZyYW1lZFRyYW5zcG9ydCBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgaW1wb3J0IHN0ZC5yYW5kb20gOiBNdDE5OTM3LCB1bmlmb3JtOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7Cit9CisKKy8vIFNvbWUgYmFzaWMgcmFuZG9tIHRlc3RpbmcsIGFsd2F5cyBzdGFydGluZyB3aXRoIHRoZSBzYW1lIHNlZWQgZm9yCisvLyBkZXRlcm1pbmlzdGljIHVuaXQgdGVzdCByZXN1bHRzIOKAkyBtb3JlIHRlc3RzIGluIHRyYW5zcG9ydF90ZXN0LgordW5pdHRlc3QgeworICBhdXRvIHJhbmRHZW4gPSBNdDE5OTM3KDQyKTsKKworICAvLyAzMiBraUIgb2YgZGF0YSB0byB3b3JrIHdpdGguCisgIGF1dG8gZGF0YSA9IG5ldyB1Ynl0ZVsxIDw8IDE1XTsKKyAgZm9yZWFjaCAocmVmIGI7IGRhdGEpIHsKKyAgICBiID0gdW5pZm9ybSEiW10iKGNhc3QodWJ5dGUpMCwgY2FzdCh1Ynl0ZSkyNTUsIHJhbmRHZW4pOworICB9CisKKyAgLy8gR2VuZXJhdGUgYSBsaXN0IG9mIGNodW5rIHNpemVzIHRvIHNwbGl0IHRoZSBkYXRhIGludG8uIEEgdW5pZm9ybQorICAvLyBkaXN0cmlidXRpb24gaXMgbm90IHF1aXRlIHJlYWxpc3RpYywgYnV0IHN0ZC5yYW5kb20gZG9lc24ndCBoYXZlIGFueXRoaW5nCisgIC8vIGVsc2UgeWV0LgorICBlbnVtIE1BWF9GUkFNRV9MRU5HVEggPSA1MTI7CisgIGF1dG8gY2h1bmtTaXplc0xpc3QgPSBuZXcgc2l6ZV90W11bMl07CisgIGZvcmVhY2ggKHJlZiBjaHVua1NpemVzOyBjaHVua1NpemVzTGlzdCkgeworICAgIHNpemVfdCBzdW07CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gY3VyTGVuID0gdW5pZm9ybSgwLCBNQVhfRlJBTUVfTEVOR1RILCByYW5kR2VuKTsKKyAgICAgIHN1bSArPSBjdXJMZW47CisgICAgICBpZiAoc3VtID4gZGF0YS5sZW5ndGgpIGJyZWFrOworICAgICAgY2h1bmtTaXplcyB+PSBjdXJMZW47CisgICAgfQorICB9CisgIGNodW5rU2l6ZXNMaXN0IH49IFtkYXRhLmxlbmd0aF07IC8vIEFsc28gdGVzdCB3aG9sZSBjaHVuayBhdCBvbmNlLgorCisgIC8vIFRlc3Qgd3JpdGluZyBkYXRhLgorICB7CisgICAgZm9yZWFjaCAoY2h1bmtTaXplczsgY2h1bmtTaXplc0xpc3QpIHsKKyAgICAgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgICAgICBhdXRvIGZyYW1lZCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KGJ1Zik7CisKKyAgICAgIGF1dG8gcmVtYWluaW5nRGF0YSA9IGRhdGE7CisgICAgICBmb3JlYWNoIChjaHVua1NpemU7IGNodW5rU2l6ZXMpIHsKKyAgICAgICAgZnJhbWVkLndyaXRlKHJlbWFpbmluZ0RhdGFbMC4uY2h1bmtTaXplXSk7CisgICAgICAgIHJlbWFpbmluZ0RhdGEgPSByZW1haW5pbmdEYXRhW2NodW5rU2l6ZS4uJF07CisgICAgICB9CisgICAgICBmcmFtZWQuZmx1c2goKTsKKworICAgICAgYXV0byB3cml0dGVuRGF0YSA9IGRhdGFbMC4uKCQgLSByZW1haW5pbmdEYXRhLmxlbmd0aCldOworICAgICAgYXV0byBhY3R1YWxEYXRhID0gYnVmLmdldENvbnRlbnRzKCk7CisKKyAgICAgIC8vIENoZWNrIGZyYW1lIHNpemUuCisgICAgICBpbnQgZnJhbWVTaXplID0gYnN3YXAoKGNhc3QoaW50W10pKGFjdHVhbERhdGFbMC4uaW50LnNpemVvZl0pKVswXSk7CisgICAgICBlbmZvcmNlKGZyYW1lU2l6ZSA9PSB3cml0dGVuRGF0YS5sZW5ndGgpOworCisgICAgICAvLyBDaGVjayBhY3R1YWwgZGF0YS4KKyAgICAgIGVuZm9yY2UoYWN0dWFsRGF0YVtpbnQuc2l6ZW9mLi4kXSA9PSB3cml0dGVuRGF0YSk7CisgICAgfQorICB9CisKKyAgLy8gVGVzdCByZWFkaW5nIGRhdGEuCisgIHsKKyAgICBmb3JlYWNoIChjaHVua1NpemVzOyBjaHVua1NpemVzTGlzdCkgeworICAgICAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKworICAgICAgYXV0byBzaXplID0gYnN3YXAoY2FzdChpbnQpZGF0YS5sZW5ndGgpOworICAgICAgYnVmLndyaXRlKGNhc3QodWJ5dGVbXSkoJnNpemUpWzAuLjFdKTsKKyAgICAgIGJ1Zi53cml0ZShkYXRhKTsKKworICAgICAgYXV0byBmcmFtZWQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChidWYpOworICAgICAgdWJ5dGVbXSByZWFkRGF0YTsKKyAgICAgIHJlYWREYXRhLnJlc2VydmUoZGF0YS5sZW5ndGgpOworICAgICAgZm9yZWFjaCAoY2h1bmtTaXplOyBjaHVua1NpemVzKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCByZWFkIGJlY2F1c2Ugd2UgaGF2ZSBvbmUgaHVnZSBmcmFtZS4KKyAgICAgICAgYXV0byBvbGRSZWFkTGVuID0gcmVhZERhdGEubGVuZ3RoOworICAgICAgICByZWFkRGF0YS5sZW5ndGggKz0gY2h1bmtTaXplOworICAgICAgICBmcmFtZWQucmVhZChyZWFkRGF0YVtvbGRSZWFkTGVuLi4kXSk7CisgICAgICB9CisKKyAgICAgIGVuZm9yY2UocmVhZERhdGEgPT0gZGF0YVswLi5yZWFkRGF0YS5sZW5ndGhdKTsKKyAgICB9CisgIH0KKworICAvLyBUZXN0IGNvbWJpbmVkIHJlYWRpbmcvd3JpdGluZyBvZiBtdWx0aXBsZSBmcmFtZXMuCisgIGZvcmVhY2ggKGZsdXNoUHJvYmFiaWxpdHk7IFsxLCAyLCA0LCA4LCAxNiwgMzJdKSB7CisgICAgZm9yZWFjaCAoY2h1bmtTaXplczsgY2h1bmtTaXplc0xpc3QpIHsKKyAgICAgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgICAgICBhdXRvIGZyYW1lZCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KGJ1Zik7CisKKyAgICAgIHNpemVfdFtdIGZyYW1lU2l6ZXM7CisKKyAgICAgIC8vIFdyaXRlIHRoZSBkYXRhLgorICAgICAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgICAgIGF1dG8gcmVtYWluaW5nRGF0YSA9IGRhdGE7CisgICAgICBmb3JlYWNoIChjaHVua1NpemU7IGNodW5rU2l6ZXMpIHsKKyAgICAgICAgZnJhbWVkLndyaXRlKHJlbWFpbmluZ0RhdGFbMC4uY2h1bmtTaXplXSk7CisgICAgICAgIHJlbWFpbmluZ0RhdGEgPSByZW1haW5pbmdEYXRhW2NodW5rU2l6ZS4uJF07CisKKyAgICAgICAgZnJhbWVTaXplICs9IGNodW5rU2l6ZTsKKyAgICAgICAgaWYgKGZyYW1lU2l6ZSA+IDAgJiYgdW5pZm9ybSgwLCBmbHVzaFByb2JhYmlsaXR5LCByYW5kR2VuKSA9PSAwKSB7CisgICAgICAgICAgZnJhbWVTaXplcyB+PSBmcmFtZVNpemU7CisgICAgICAgICAgZnJhbWVTaXplID0gMDsKKyAgICAgICAgICBmcmFtZWQuZmx1c2goKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgZnJhbWVTaXplcyB+PSBmcmFtZVNpemU7CisgICAgICAgIGZyYW1lU2l6ZSA9IDA7CisgICAgICAgIGZyYW1lZC5mbHVzaCgpOworICAgICAgfQorCisgICAgICAvLyBSZWFkIGl0IGJhY2suCisgICAgICBhdXRvIHJlYWREYXRhID0gbmV3IHVieXRlW2RhdGEubGVuZ3RoIC0gcmVtYWluaW5nRGF0YS5sZW5ndGhdOworICAgICAgYXV0byByZW1haW5Ub1JlYWQgPSByZWFkRGF0YTsKKyAgICAgIGZvcmVhY2ggKGZTaXplOyBmcmFtZVNpemVzKSB7CisgICAgICAgIC8vIFdlIGFyZSBleHBsb2l0aW5nIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBURnJhbWVkVHJhbnNwb3J0OgorICAgICAgICAvLyBUaGUgcmVhZCBidWZmZXIgc3RhcnRzIGVtcHR5IGFuZCBpdCB3aWxsIG5ldmVyIHJldHVybiBtb3JlIHRoYW4gb25lCisgICAgICAgIC8vIGZyYW1lIHBlciByZWFkLCBzbyBieSBqdXN0IHJlcXVlc3RpbmcgYWxsIG9mIHRoZSBkYXRhLCB3ZSBzaG91bGQKKyAgICAgICAgLy8gYWx3YXlzIGdldCBleGFjdGx5IG9uZSBmcmFtZS4KKyAgICAgICAgYXV0byBnb3QgPSBmcmFtZWQucmVhZChyZW1haW5Ub1JlYWQpOworICAgICAgICBlbmZvcmNlKGdvdCA9PSBmU2l6ZSk7CisgICAgICAgIHJlbWFpblRvUmVhZCA9IHJlbWFpblRvUmVhZFtmU2l6ZS4uJF07CisgICAgICB9CisKKyAgICAgIGVuZm9yY2UocmVtYWluVG9SZWFkLmVtcHR5KTsKKyAgICAgIGVuZm9yY2UocmVhZERhdGEgPT0gZGF0YVswLi5yZWFkRGF0YS5sZW5ndGhdKTsKKyAgICB9CisgIH0KK30KKworLy8gVGVzdCBmbHVzaCgpaW5nIGFuIGVtcHR5IGJ1ZmZlci4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICBhdXRvIGZyYW1lZCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KGJ1Zik7CisgIGltbXV0YWJsZSBvdXQxID0gWzAsIDAsIDAsIDEsICdhJ107CisgIGltbXV0YWJsZSBvdXQyID0gWzAsIDAsIDAsIDEsICdhJywgMCwgMCwgMCwgMiwgJ2InLCAnYyddOworCisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IFtdKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IFtdKTsKKyAgZnJhbWVkLndyaXRlKGNhc3QodWJ5dGVbXSkiYSIpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IFtdKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gb3V0MSk7CisgIGZyYW1lZC5mbHVzaCgpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQxKTsKKyAgZnJhbWVkLndyaXRlKGNhc3QodWJ5dGVbXSkiYmMiKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQxKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gb3V0Mik7CisgIGZyYW1lZC5mbHVzaCgpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU4ZGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogSFRUUCB0cmFucHNvcnQgaW1wbGVtZW50YXRpb24sIG1vZGVsbGVkIGFmdGVyIHRoZSBDKysgb25lLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIGxpYmN1cmwgaXMgcXVpdGUgaGVhdnl3ZWlnaHQgYW5kIHN1cHBvcnRzIG9ubHkgY2xpZW50LXNpZGUKKyAqIGFwcGxpY2F0aW9ucy4gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmFzaWMgSFRUUC8xLjEgcGFydHMKKyAqIHN1cHBvcnRpbmcgSFRUUCAxMDAgQ29udGludWUsIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcsIGtlZXBhbGl2ZSwgZXRjLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGNhbkZpbmQsIGNvdW50VW50aWwsIGVuZHNXaXRoLCBmaW5kU3BsaXQsIG1pbiwgc3RhcnRzV2l0aDsKK2ltcG9ydCBzdGQuYXNjaWkgOiB0b0xvd2VyOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogcGFyc2UsIHRvOworaW1wb3J0IHN0ZC5kYXRldGltZSA6IENsb2NrLCBVVEM7CitpbXBvcnQgc3RkLnN0cmluZyA6IHN0cmlwTGVmdDsKK2ltcG9ydCB0aHJpZnQuYmFzZSA6IFZFUlNJT047CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGJvdGggY2xpZW50LSBhbmQgc2VydmVyLXNpZGUgSFRUUCB0cmFuc3BvcnRzLgorICovCithYnN0cmFjdCBjbGFzcyBUSHR0cFRyYW5zcG9ydCA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgICBodHRwQnVmXyA9IG5ldyB1Ynl0ZVtIVFRQX0JVRkZFUl9TSVpFXTsKKyAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfWzAgLi4gMF07CisgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLmlzT3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLnBlZWsoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBpZiAoIXJlYWRCdWZmZXJfLnBlZWsoKSkgeworICAgICAgcmVhZEJ1ZmZlcl8ucmVzZXQoKTsKKworICAgICAgaWYgKCFyZWZpbGwoKSkgcmV0dXJuIDA7CisKKyAgICAgIGlmIChyZWFkSGVhZGVyc18pIHsKKyAgICAgICAgcmVhZEhlYWRlcnMoKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90IGdvdDsKKyAgICAgIGlmIChjaHVua2VkXykgeworICAgICAgICBnb3QgPSByZWFkQ2h1bmtlZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290ID0gcmVhZENvbnRlbnQoY29udGVudExlbmd0aF8pOworICAgICAgfQorICAgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKworICAgICAgaWYgKGdvdCA9PSAwKSByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRCdWZmZXJfLnJlYWQoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkRW5kKCkgeworICAgIC8vIFJlYWQgYW55IHBlbmRpbmcgY2h1bmtlZCBkYXRhIChmb290ZXJzIGV0Yy4pCisgICAgaWYgKGNodW5rZWRfKSB7CisgICAgICB3aGlsZSAoIWNodW5rZWREb25lXykgeworICAgICAgICByZWFkQ2h1bmtlZCgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgYXV0byBkYXRhID0gd3JpdGVCdWZmZXJfLmdldENvbnRlbnRzKCk7CisgICAgc3RyaW5nIGhlYWRlciA9IGdldEhlYWRlcihkYXRhLmxlbmd0aCk7CisKKyAgICB0cmFuc3BvcnRfLndyaXRlKGNhc3QoY29uc3QodWJ5dGUpW10pIGhlYWRlcik7CisgICAgdHJhbnNwb3J0Xy53cml0ZShkYXRhKTsKKyAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CisKKyAgICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzLgorICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworICAgIHJlYWRIZWFkZXJzXyA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0byByZWFkIEhUVFAgcmVxdWVzdHMgaW50bywgaW4gYnl0ZXMuIFdpbGwgZXhwYW5kCisgICAqIGFzIHJlcXVpcmVkLgorICAgKi8KKyAgZW51bSBIVFRQX0JVRkZFUl9TSVpFID0gMTAyNDsKKworcHJvdGVjdGVkOgorICBhYnN0cmFjdCBzdHJpbmcgZ2V0SGVhZGVyKHNpemVfdCBkYXRhTGVuZ3RoKTsKKyAgYWJzdHJhY3QgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY29uc3QodWJ5dGUpW10gc3RhdHVzKTsKKworICB2b2lkIHBhcnNlSGVhZGVyKGNvbnN0KHVieXRlKVtdIGhlYWRlcikgeworICAgIGF1dG8gc3BsaXQgPSBmaW5kU3BsaXQoaGVhZGVyLCBbJzonXSk7CisgICAgaWYgKHNwbGl0WzFdLmVtcHR5KSB7CisgICAgICAvLyBObyBjb2xvbiBmb3VuZC4KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjb21wVG9Mb3dlcih1Ynl0ZSBhLCB1Ynl0ZSBiKSB7CisgICAgICByZXR1cm4gdG9Mb3dlcihjYXN0KGNoYXIpYSkgPT0gdG9Mb3dlcihjYXN0KGNoYXIpYik7CisgICAgfQorCisgICAgaWYgKHN0YXJ0c1dpdGghY29tcFRvTG93ZXIoc3BsaXRbMF0sIGNhc3QodWJ5dGVbXSkidHJhbnNmZXItZW5jb2RpbmciKSkgeworICAgICAgaWYgKGVuZHNXaXRoIWNvbXBUb0xvd2VyKHNwbGl0WzJdLCBjYXN0KHVieXRlW10pImNodW5rZWQiKSkgeworICAgICAgICBjaHVua2VkXyA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoIWNvbXBUb0xvd2VyKHNwbGl0WzBdLCBjYXN0KHVieXRlW10pImNvbnRlbnQtbGVuZ3RoIikpIHsKKyAgICAgIGNodW5rZWRfID0gZmFsc2U7CisgICAgICBhdXRvIGxlbmd0aFN0cmluZyA9IHN0cmlwTGVmdChjYXN0KGNvbnN0KGNoYXIpW10pc3BsaXRbMl0pOworICAgICAgY29udGVudExlbmd0aF8gPSBwYXJzZSFzaXplX3QobGVuZ3RoU3RyaW5nKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdWJ5dGVbXSByZWFkTGluZSgpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBzcGxpdCA9IGZpbmRTcGxpdChodHRwQnVmUmVtYWluaW5nXywgY2FzdCh1Ynl0ZVtdKSJcclxuIik7CisKKyAgICAgIGlmIChzcGxpdFsxXS5lbXB0eSkgeworICAgICAgICAvLyBObyBDUkxGIHlldCwgbW92ZSB3aGF0ZXZlciB3ZSBoYXZlIG5vdyB0byBmcm9udCBhbmQgcmVmaWxsLgorICAgICAgICBpZiAoaHR0cEJ1ZlJlbWFpbmluZ18uZW1wdHkpIHsKKyAgICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfWzAgLi4gMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaHR0cEJ1Zl9bMCAuLiBodHRwQnVmUmVtYWluaW5nXy5sZW5ndGhdID0gaHR0cEJ1ZlJlbWFpbmluZ187CisgICAgICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmX1swIC4uIGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlZmlsbCgpKSB7CisgICAgICAgICAgYXV0byBidWYgPSBodHRwQnVmUmVtYWluaW5nXzsKKyAgICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZSZW1haW5pbmdfWyQgLSAxIC4uICQgLSAxXTsKKyAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBTZXQgdGhlIHJlbWFpbmluZyBidWZmZXIgdG8gdGhlIHBhcnQgYWZ0ZXIgXHJcbiBhbmQgcmV0dXJuIHRoZSBwYXJ0CisgICAgICAgIC8vIChsaW5lKSBiZWZvcmUgaXQuCisgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gc3BsaXRbMl07CisgICAgICAgIHJldHVybiBzcGxpdFswXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHJlYWRIZWFkZXJzKCkgeworICAgIC8vIEluaXRpYWxpemUgaGVhZGVycyBzdGF0ZSB2YXJpYWJsZXMKKyAgICBjb250ZW50TGVuZ3RoXyA9IDA7CisgICAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgICBjaHVua2VkRG9uZV8gPSBmYWxzZTsKKyAgICBjaHVua1NpemVfID0gMDsKKworICAgIC8vIENvbnRyb2wgc3RhdGUgZmxvdworICAgIGJvb2wgc3RhdHVzTGluZSA9IHRydWU7CisgICAgYm9vbCBmaW5pc2hlZDsKKworICAgIC8vIExvb3AgdW50aWwgaGVhZGVycyBhcmUgZmluaXNoZWQKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBsaW5lID0gcmVhZExpbmUoKTsKKworICAgICAgaWYgKGxpbmUubGVuZ3RoID09IDApIHsKKyAgICAgICAgaWYgKGZpbmlzaGVkKSB7CisgICAgICAgICAgcmVhZEhlYWRlcnNfID0gZmFsc2U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE11c3QgaGF2ZSBiZWVuIGFuIEhUVFAgMTAwLCBrZWVwIGdvaW5nIGZvciBhbm90aGVyIHN0YXR1cyBsaW5lCisgICAgICAgICAgc3RhdHVzTGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdGF0dXNMaW5lKSB7CisgICAgICAgICAgc3RhdHVzTGluZSA9IGZhbHNlOworICAgICAgICAgIGZpbmlzaGVkID0gcGFyc2VTdGF0dXNMaW5lKGxpbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2l6ZV90IHJlYWRDaHVua2VkKCkgeworICAgIHNpemVfdCBsZW5ndGg7CisKKyAgICBhdXRvIGxpbmUgPSByZWFkTGluZSgpOworICAgIHNpemVfdCBjaHVua1NpemU7CisgICAgdHJ5IHsKKyAgICAgIGF1dG8gY2hhckxpbmUgPSBjYXN0KGNoYXJbXSlsaW5lOworICAgICAgY2h1bmtTaXplID0gcGFyc2Uhc2l6ZV90KGNoYXJMaW5lLCAxNik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnZhbGlkIGNodW5rIHNpemU6ICIgfiB0byFzdHJpbmcobGluZSksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgfQorCisgICAgaWYgKGNodW5rU2l6ZSA9PSAwKSB7CisgICAgICByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmVhZCBkYXRhIGNvbnRlbnQKKyAgICAgIGxlbmd0aCArPSByZWFkQ29udGVudChjaHVua1NpemUpOworICAgICAgLy8gUmVhZCB0cmFpbGluZyBDUkxGIGFmdGVyIGNvbnRlbnQKKyAgICAgIHJlYWRMaW5lKCk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7CisgIH0KKworICB2b2lkIHJlYWRDaHVua2VkRm9vdGVycygpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBsaW5lID0gcmVhZExpbmUoKTsKKyAgICAgIGlmIChsaW5lLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIGNodW5rZWREb25lXyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNpemVfdCByZWFkQ29udGVudChzaXplX3Qgc2l6ZSkgeworICAgIGF1dG8gbmVlZCA9IHNpemU7CisgICAgd2hpbGUgKG5lZWQgPiAwKSB7CisgICAgICBpZiAoaHR0cEJ1ZlJlbWFpbmluZ18ubGVuZ3RoID09IDApIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBnaXZlbiBhbGwgdGhlIGRhdGEsIHJlc2V0IHBvc2l0aW9uIHRvIGhlYWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmX1swIC4uIDBdOworICAgICAgICBpZiAoIXJlZmlsbCgpKSByZXR1cm4gc2l6ZSAtIG5lZWQ7CisgICAgICB9CisKKyAgICAgIGF1dG8gZ2l2ZSA9IG1pbihodHRwQnVmUmVtYWluaW5nXy5sZW5ndGgsIG5lZWQpOworICAgICAgcmVhZEJ1ZmZlcl8ud3JpdGUoY2FzdCh1Ynl0ZVtdKWh0dHBCdWZSZW1haW5pbmdfWzAgLi4gZ2l2ZV0pOworICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBodHRwQnVmUmVtYWluaW5nX1tnaXZlIC4uICRdOworICAgICAgbmVlZCAtPSBnaXZlOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIGJvb2wgcmVmaWxsKCkgeworICAgIC8vIElzIHRoZXJlIGEgbmljZXIgd2F5IHRvIGRvIHRoaXM/CisgICAgYXV0byBpbmRleEJlZ2luID0gaHR0cEJ1ZlJlbWFpbmluZ18ucHRyIC0gaHR0cEJ1Zl8ucHRyOworICAgIGF1dG8gaW5kZXhFbmQgPSBpbmRleEJlZ2luICsgaHR0cEJ1ZlJlbWFpbmluZ18ubGVuZ3RoOworCisgICAgaWYgKGh0dHBCdWZfLmxlbmd0aCAtIGluZGV4RW5kIDw9IChodHRwQnVmXy5sZW5ndGggLyA0KSkgeworICAgICAgaHR0cEJ1Zl8ubGVuZ3RoICo9IDI7CisgICAgfQorCisgICAgLy8gUmVhZCBtb3JlIGRhdGEuCisgICAgYXV0byBnb3QgPSB0cmFuc3BvcnRfLnJlYWQoY2FzdCh1Ynl0ZVtdKWh0dHBCdWZfW2luZGV4RW5kIC4uICRdKTsKKyAgICBpZiAoZ290ID09IDApIHJldHVybiBmYWxzZTsKKyAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfW2luZGV4QmVnaW4gLi4gaW5kZXhFbmQgKyBnb3RdOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnRfOworCisgIFRNZW1vcnlCdWZmZXIgd3JpdGVCdWZmZXJfOworICBUTWVtb3J5QnVmZmVyIHJlYWRCdWZmZXJfOworCisgIGJvb2wgcmVhZEhlYWRlcnNfOworICBib29sIGNodW5rZWRfOworICBib29sIGNodW5rZWREb25lXzsKKyAgc2l6ZV90IGNodW5rU2l6ZV87CisgIHNpemVfdCBjb250ZW50TGVuZ3RoXzsKKworICB1Ynl0ZVtdIGh0dHBCdWZfOworICB1Ynl0ZVtdIGh0dHBCdWZSZW1haW5pbmdfOworfQorCisvKioKKyAqIEhUVFAgY2xpZW50IHRyYW5zcG9ydC4KKyAqLworZmluYWwgY2xhc3MgVENsaWVudEh0dHBUcmFuc3BvcnQgOiBUSHR0cFRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgY2xpZW50IGh0dHAgdHJhbnNwb3J0IG9wZXJhdGluZyBvbiB0aGUgcGFzc2VkIHVuZGVybHlpbmcKKyAgICogdHJhbnNwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSBhY3R1YWwgSS9PLgorICAgKiAgIGhvc3QgPSBUaGUgSFRUUCBob3N0IHN0cmluZy4KKyAgICogICBwYXRoID0gVGhlIEhUVFAgcGF0aCBzdHJpbmcuCisgICAqLworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzdHJpbmcgaG9zdCwgc3RyaW5nIHBhdGgpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIGhvc3RfID0gaG9zdDsKKyAgICBwYXRoXyA9IHBhdGg7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWQgZm9yIGNvbnN0cnVjdGluZyBhIGNsaWVudCBIVFRQIHRyYW5zcG9ydCB1c2luZyBhCisgICAqIFRTb2NrZXQgY29ubmVjdGluZyB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBob3N0ID0gVGhlIHNlcnZlciB0byBjb25uZWN0IHRvLCBhbHNvIHVzZWQgYXMgSFRUUCBob3N0IHN0cmluZy4KKyAgICogICBwb3J0ID0gVGhlIHBvcnQgdG8gY29ubmVjdCB0by4KKyAgICogICBwYXRoID0gVGhlIEhUVFAgcGF0aCBzdHJpbmcuCisgICAqLworICB0aGlzKHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCwgc3RyaW5nIHBhdGgpIHsKKyAgICB0aGlzKG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpLCBob3N0LCBwYXRoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIG92ZXJyaWRlIHN0cmluZyBnZXRIZWFkZXIoc2l6ZV90IGRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gIlBPU1QgIiB+IHBhdGhfIH4gIiBIVFRQLzEuMVxyXG4iIH4KKyAgICAgICJIb3N0OiAiIH4gaG9zdF8gfiAiXHJcbiIgfgorICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiB+CisgICAgICAiQ29udGVudC1MZW5ndGg6ICIgfiB0byFzdHJpbmcoZGF0YUxlbmd0aCkgfiAiXHJcbiIgfgorICAgICAgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiB+CisgICAgICAiVXNlci1BZ2VudDogVGhyaWZ0LyIgfiBWRVJTSU9OIH4gIiAoRC9UQ2xpZW50SHR0cFRyYW5zcG9ydClcclxuIiB+CisgICAgICAiXHJcbiI7CisgIH0KKworICBvdmVycmlkZSBib29sIHBhcnNlU3RhdHVzTGluZShjb25zdCh1Ynl0ZSlbXSBzdGF0dXMpIHsKKyAgICAvLyBIVFRQLVZlcnNpb24gU1AgU3RhdHVzLUNvZGUgU1AgUmVhc29uLVBocmFzZSBDUkxGCisgICAgYXV0byBmaXJzdFNwbGl0ID0gZmluZFNwbGl0KHN0YXR1cywgWycgJ10pOworICAgIGlmIChmaXJzdFNwbGl0WzFdLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1czogIiB+IHRvIXN0cmluZyhzdGF0dXMpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGF1dG8gY29kZVJlYXNvbiA9IGZpcnN0U3BsaXRbMl1bY291bnRVbnRpbCEiYSAhPSBiIihmaXJzdFNwbGl0WzJdLCAnICcpIC4uICRdOworICAgIGF1dG8gc2Vjb25kU3BsaXQgPSBmaW5kU3BsaXQoY29kZVJlYXNvbiwgWycgJ10pOworICAgIGlmIChzZWNvbmRTcGxpdFsxXS5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXM6ICIgfiB0byFzdHJpbmcoc3RhdHVzKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBpZiAoc2Vjb25kU3BsaXRbMF0gPT0gIjIwMCIpIHsKKyAgICAgIC8vIEhUVFAgMjAwID0gT0ssIHdlIGdvdCB0aGUgcmVzcG9uc2UKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoc2Vjb25kU3BsaXRbMF0gPT0gIjEwMCIpIHsKKyAgICAgIC8vIEhUVFAgMTAwID0gY29udGludWUsIGp1c3Qga2VlcCByZWFkaW5nCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXMgKHVuaGFuZGxlZCBzdGF0dXMgY29kZSk6ICIgfgorICAgICAgdG8hc3RyaW5nKGNhc3QoY29uc3QoY2hhcltdKSlzdGF0dXMpLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICB9CisKK3ByaXZhdGU6CisgIHN0cmluZyBob3N0XzsKKyAgc3RyaW5nIHBhdGhfOworfQorCisvKioKKyAqIEhUVFAgc2VydmVyIHRyYW5zcG9ydC4KKyAqLworZmluYWwgY2xhc3MgVFNlcnZlckh0dHBUcmFuc3BvcnQgOiBUSHR0cFRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbToKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGFjdHVhbCBJL08uCisgICAqLworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIG92ZXJyaWRlIHN0cmluZyBnZXRIZWFkZXIoc2l6ZV90IGRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gIkhUVFAvMS4xIDIwMCBPS1xyXG4iIH4KKyAgICAgICJEYXRlOiAiIH4gZ2V0UkZDMTEyM1RpbWUoKSB+ICJcclxuIiB+CisgICAgICAiU2VydmVyOiBUaHJpZnQvIiB+IFZFUlNJT04gfiAiXHJcbiIgfgorICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiB+CisgICAgICAiQ29udGVudC1MZW5ndGg6ICIgfiB0byFzdHJpbmcoZGF0YUxlbmd0aCkgfiAiXHJcbiIgfgorICAgICAgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIiB+CisgICAgICAiXHJcbiI7CisgIH0KKworICBvdmVycmlkZSBib29sIHBhcnNlU3RhdHVzTGluZShjb25zdCh1Ynl0ZSlbXSBzdGF0dXMpIHsKKyAgICAvLyBNZXRob2QgU1AgUmVxdWVzdC1VUkkgU1AgSFRUUC1WZXJzaW9uIENSTEYuCisgICAgYXV0byBzcGxpdCA9IGZpbmRTcGxpdChzdGF0dXMsIFsnICddKTsKKyAgICBpZiAoc3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzOiAiIH4gdG8hc3RyaW5nKHN0YXR1cyksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgfQorCisgICAgYXV0byB1cmlWZXJzaW9uID0gc3BsaXRbMl1bY291bnRVbnRpbCEiYSAhPSBiIihzcGxpdFsyXSwgJyAnKSAuLiAkXTsKKyAgICBpZiAoIWNhbkZpbmQodXJpVmVyc2lvbiwgJyAnKSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXM6ICIgfiB0byFzdHJpbmcoc3RhdHVzKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBpZiAoc3BsaXRbMF0gPT0gIlBPU1QiKSB7CisgICAgICAvLyBQT1NUIG1ldGhvZCBvaywgbG9va2luZyBmb3IgY29udGVudC4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzICh1bnN1cHBvcnRlZCBtZXRob2QpOiAiIH4KKyAgICAgIHRvIXN0cmluZyhzdGF0dXMpLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICB9Cit9CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIEhUVFAgc2VydmVyIHByb3RvY29sLgorICovCithbGlhcyBUV3JhcHBlclRyYW5zcG9ydEZhY3RvcnkhVFNlcnZlckh0dHBUcmFuc3BvcnQgVFNlcnZlckh0dHBUcmFuc3BvcnRGYWN0b3J5OworCitwcml2YXRlIHsKKyAgaW1wb3J0IHN0ZC5zdHJpbmcgOiBmb3JtYXQ7CisgIHN0cmluZyBnZXRSRkMxMTIzVGltZSgpIHsKKyAgICBhdXRvIHN5c1RpbWUgPSBDbG9jay5jdXJyVGltZShVVEMoKSk7CisKKyAgICBhdXRvIGRheU5hbWUgPSBjYXBNZW1iZXJOYW1lKHN5c1RpbWUuZGF5T2ZXZWVrKTsKKyAgICBhdXRvIG1vbnRoTmFtZSA9IGNhcE1lbWJlck5hbWUoc3lzVGltZS5tb250aCk7CisKKyAgICByZXR1cm4gZm9ybWF0KCIlcywgJXMgJXMgJXMgJXM6JXM6JXMgR01UIiwgZGF5TmFtZSwgc3lzVGltZS5kYXksCisgICAgICBtb250aE5hbWUsIHN5c1RpbWUueWVhciwgc3lzVGltZS5ob3VyLCBzeXNUaW1lLm1pbnV0ZSwgc3lzVGltZS5zZWNvbmQpOworICB9CisKKyAgaW1wb3J0IHN0ZC5hc2NpaSA6IHRvVXBwZXI7CisgIGltcG9ydCBzdGQudHJhaXRzIDogRW51bU1lbWJlcnM7CisgIHN0cmluZyBjYXBNZW1iZXJOYW1lKFQpKFQgdmFsKSBpZiAoaXMoVCA9PSBlbnVtKSkgeworICAgIGZvcmVhY2ggKGksIGU7IEVudW1NZW1iZXJzIVQpIHsKKyAgICAgIGVudW0gbmFtZSA9IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKVtpXTsKKyAgICAgIGVudW0gY2FwTmFtZSA9IGNhc3QoY2hhcikgdG9VcHBlcihuYW1lWzBdKSB+IG5hbWUgWzEgLi4gJF07CisgICAgICBpZiAodmFsID09IGUpIHsKKyAgICAgICAgcmV0dXJuIGNhcE5hbWU7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vdCBhIG1lbWJlciBvZiAiIH4gVC5zdHJpbmdvZiB+ICI6ICIgfiB0byFzdHJpbmcodmFsKSk7CisgIH0KKworICB1bml0dGVzdCB7CisgICAgZW51bSBGb28geworICAgICAgYmFyLAorICAgICAgYkFaCisgICAgfQorCisgICAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgICAgZW5mb3JjZShjYXBNZW1iZXJOYW1lKEZvby5iYXIpID09ICJCYXIiKTsKKyAgICBlbmZvcmNlKGNhcE1lbWJlck5hbWUoRm9vLmJBWikgPT0gIkJBWiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnkuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L21lbW9yeS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjA4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnkuZApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCitpbXBvcnQgY29yZS5leGNlcHRpb24gOiBvbk91dE9mTWVtb3J5RXJyb3I7CitpbXBvcnQgY29yZS5zdGRjLnN0ZGxpYiA6IGZyZWUsIHJlYWxsb2M7CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbjsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIEEgdHJhbnNwb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbiBpbi1tZW1vcnkgYnVmZmVyLiBFdmVyeQorICogdGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5IHBsYWNlZCBpbnRvIGEgYnVmZmVyLCBhbmQKKyAqIGV2ZXJ5IHRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyBjb25zdW1lZCBmcm9tIHRoYXQgYnVmZmVyLgorICoKKyAqIEN1cnJlbnRseSwgdGhlIHN0b3JhZ2UgZm9yIHdyaXR0ZW4gZGF0YSBpcyBuZXZlciByZWNsYWltZWQsIGV2ZW4gaWYgdGhlCisgKiBidWZmZXIgY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBvdXQgYWdhaW4uCisgKi8KK2ZpbmFsIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lbW9yeSB0cmFuc3BvcnQgd2l0aCBhbiBlbXB0eSBpbnRlcm5hbCBidWZmZXIuCisgICAqLworICB0aGlzKCkge30KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBtZW1vcnkgdHJhbnNwb3J0IHdpdGggYW4gZW1wdHkgaW50ZXJuYWwgYnVmZmVyLAorICAgKiByZXNlcnZpbmcgc3BhY2UgZm9yIGNhcGFjaXR5IGJ5dGVzIGluIGFkdmFuY2UuCisgICAqCisgICAqIElmIHRoZSBhbW91bnQgb2YgZGF0YSB3aGljaCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlciBpcyBhbHJlYWR5CisgICAqIGtub3duIG9uIGNvbnN0cnVjdGlvbiwgdGhpcyBjYW4gYmV0dGVyIHBlcmZvcm1hbmNlIG92ZXIgdGhlIGRlZmF1bHQKKyAgICogY29uc3RydWN0b3IgYmVjYXVzZSByZWFsbG9jYXRpb25zIGNhbiBiZSBhdm9pZGVkLgorICAgKgorICAgKiBJZiB0aGUgcHJlYWxsb2NhdGVkIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIGRhdGEgY2FuIHN0aWxsIGJlIHdyaXR0ZW4gdG8gdGhlCisgICAqIHRyYW5zcG9ydCwgYnV0IHJlYWxsb2NhdGlvbnMgd2lsbCBoYXBwZW4uCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjYXBhY2l0eSA9IFNpemUgb2YgdGhlIGluaXRpYWxseSByZXNlcnZlZCBidWZmZXIgKGluIGJ5dGVzKS4KKyAgICovCisgIHRoaXMoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgcmVzZXQoY2FwYWNpdHkpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgbWVtb3J5IHRyYW5zcG9ydCBpbml0aWFsbHkgY29udGFpbmluZyB0aGUgcGFzc2VkIGRhdGEuCisgICAqCisgICAqIEZvciBub3csIHRoZSBwYXNzZWQgYnVmZmVyIGlzIG5vdCBpbnRlbGxpZ2VudGx5IHVzZWQsIHRoZSBkYXRhIGlzIGp1c3QKKyAgICogY29waWVkIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWZmZXIgPSBJbml0aWFsIGNvbnRlbnRzIGF2YWlsYWJsZSB0byBiZSByZWFkLgorICAgKi8KKyAgdGhpcyhpbiB1Ynl0ZVtdIGNvbnRlbnRzKSB7CisgICAgYXV0byBzaXplID0gY29udGVudHMubGVuZ3RoOworICAgIHJlc2V0KHNpemUpOworICAgIGJ1ZmZlcl9bMCAuLiBzaXplXSA9IGNvbnRlbnRzW107CisgICAgd3JpdGVPZmZzZXRfID0gc2l6ZTsKKyAgfQorCisgIC8qKgorICAgKiBEZXN0cnVjdG9yLCBmcmVlcyB0aGUgaW50ZXJuYWxseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgKi8KKyAgfnRoaXMoKSB7CisgICAgZnJlZShidWZmZXJfKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzLgorICAgKgorICAgKiBOb3RlOiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIHJldHVybmVkIHNsaWNlIGlzIG9ubHkgdmFsaWQgZm9yIHRoZQorICAgKiBsaWZlIG9mIHRoaXMgb2JqZWN0LCBhbmQgbWF5IGJlIGludmFsaWRhdGVkIG9uIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCBhdAorICAgKiB3aWxsIOKAkyB5b3UgbWlnaHQgd2FudCB0byBpbW1lZGlhdGVseSAuZHVwIGl0IGlmIHlvdSBpbnRlbmQgdG8ga2VlcCBpdAorICAgKiBhcm91bmQuCisgICAqLworICBjb25zdCh1Ynl0ZSlbXSBnZXRDb250ZW50cygpIHsKKyAgICByZXR1cm4gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiB3cml0ZU9mZnNldF9dOworICB9CisKKyAgLyoqCisgICAqIEEgbWVtb3J5IHRyYW5zcG9ydCBpcyBhbHdheXMgb3Blbi4KKyAgICovCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gd3JpdGVPZmZzZXRfIC0gcmVhZE9mZnNldF8gPiAwOworICB9CisKKyAgLyoqCisgICAqIE9wZW5pbmcgaXMgYSBuby1vcCgpIGZvciBhIG1lbW9yeSBidWZmZXIuCisgICAqLworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7fQorCisgIC8qKgorICAgKiBDbG9zaW5nIGlzIGEgbm8tb3AoKSBmb3IgYSBtZW1vcnkgYnVmZmVyLCBpdCBpcyBhbHdheXMgb3Blbi4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7fQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgYXV0byBzaXplID0gbWluKGJ1Zi5sZW5ndGgsIHdyaXRlT2Zmc2V0XyAtIHJlYWRPZmZzZXRfKTsKKyAgICBidWZbMCAuLiBzaXplXSA9IGJ1ZmZlcl9bcmVhZE9mZnNldF8gLi4gcmVhZE9mZnNldF8gKyBzaXplXTsKKyAgICByZWFkT2Zmc2V0XyArPSBzaXplOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgLyoqCisgICAqIFNob3J0Y3V0IHZlcnNpb24gb2YgcmVhZEFsbCgpIOKAkyB1c2luZyB0aGlzIG92ZXIgVEJhc2VUcmFuc3BvcnQucmVhZEFsbCgpCisgICAqIGNhbiBnaXZlIHVzIGEgbmljZSBzcGVlZCBpbmNyZWFzZSBiZWNhdXNlIGdpdmVzIHVzIGEgbmljZSBzcGVlZCBpbmNyZWFzZQorICAgKiBiZWNhdXNlIGl0IGlzIHR5cGljYWxseSBhIHZlcnkgaG90IHBhdGggZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgcmVhZEFsbCh1Ynl0ZVtdIGJ1ZikgeworICAgIGF1dG8gYXZhaWxhYmxlID0gd3JpdGVPZmZzZXRfIC0gcmVhZE9mZnNldF87CisgICAgaWYgKGJ1Zi5sZW5ndGggPiBhdmFpbGFibGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKHRleHQoIkNhbm5vdCByZWFkQWxsKCkgIiwgYnVmLmxlbmd0aCwKKyAgICAgICAgIiBieXRlcyBvZiBkYXRhIGJlY2F1c2Ugb25seSAiLCBhdmFpbGFibGUsICIgYnl0ZXMgYXJlIGF2YWlsYWJsZS4iKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKTsKKyAgICB9CisKKyAgICBidWZbXSA9IGJ1ZmZlcl9bcmVhZE9mZnNldF8gLi4gcmVhZE9mZnNldF8gKyBidWYubGVuZ3RoXTsKKyAgICByZWFkT2Zmc2V0XyArPSBidWYubGVuZ3RoOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGF1dG8gbmVlZCA9IGJ1Zi5sZW5ndGg7CisgICAgaWYgKGJ1ZmZlckxlbl8gLSB3cml0ZU9mZnNldF8gPCBuZWVkKSB7CisgICAgICAvLyBFeHBvbmVudGlhbCBncm93dGguCisgICAgICBhdXRvIG5ld0xlbiA9IGJ1ZmZlckxlbl8gKyAxOworICAgICAgd2hpbGUgKG5ld0xlbiAtIHdyaXRlT2Zmc2V0XyA8IG5lZWQpIG5ld0xlbiAqPSAyOworICAgICAgY1JlYWxsb2MoYnVmZmVyXywgbmV3TGVuKTsKKyAgICAgIGJ1ZmZlckxlbl8gPSBuZXdMZW47CisgICAgfQorCisgICAgYnVmZmVyX1t3cml0ZU9mZnNldF8gLi4gd3JpdGVPZmZzZXRfICsgbmVlZF0gPSBidWZbXTsKKyAgICB3cml0ZU9mZnNldF8gKz0gbmVlZDsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA8PSB3cml0ZU9mZnNldF8gLSByZWFkT2Zmc2V0XykgeworICAgICAgcmV0dXJuIGJ1ZmZlcl9bcmVhZE9mZnNldF8gLi4gd3JpdGVPZmZzZXRfXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICByZWFkT2Zmc2V0XyArPSBsZW47CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIHJlYWRPZmZzZXRfID0gMDsKKyAgICB3cml0ZU9mZnNldF8gPSAwOworICB9CisKKyAgdm9pZCByZXNldChzaXplX3QgY2FwYWNpdHkpIHsKKyAgICByZWFkT2Zmc2V0XyA9IDA7CisgICAgd3JpdGVPZmZzZXRfID0gMDsKKyAgICBpZiAoYnVmZmVyTGVuXyA8IGNhcGFjaXR5KSB7CisgICAgICBjUmVhbGxvYyhidWZmZXJfLCBjYXBhY2l0eSk7CisgICAgICBidWZmZXJMZW5fID0gY2FwYWNpdHk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHVieXRlKiBidWZmZXJfOworICBzaXplX3QgYnVmZmVyTGVuXzsKKyAgc2l6ZV90IHJlYWRPZmZzZXRfOworICBzaXplX3Qgd3JpdGVPZmZzZXRfOworfQorCitwcml2YXRlIHsKKyAgdm9pZCBjUmVhbGxvYyhyZWYgdWJ5dGUqIGRhdGEsIHNpemVfdCBuZXdTaXplKSB7CisgICAgYXV0byByZXN1bHQgPSByZWFsbG9jKGRhdGEsIG5ld1NpemUpOworICAgIGlmIChyZXN1bHQgaXMgbnVsbCkgb25PdXRPZk1lbW9yeUVycm9yKCk7CisgICAgZGF0YSA9IGNhc3QodWJ5dGUqKXJlc3VsdDsKKyAgfQorfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK30KKwordW5pdHRlc3QgeworICBhdXRvIGEgPSBuZXcgVE1lbW9yeUJ1ZmZlcig1KTsKKyAgaW1tdXRhYmxlKHVieXRlW10pIHRlc3REYXRhID0gWzEsIDIsIDMsIDRdOworICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVt0ZXN0RGF0YS5sZW5ndGhdOworICBlbmZvcmNlKGEuaXNPcGVuKTsKKworICAvLyBhIHNob3VsZCBiZSBlbXB0eS4KKyAgZW5mb3JjZSghYS5wZWVrKCkpOworICBlbmZvcmNlKGEucmVhZChidWYpID09IDApOworICBhc3NlcnRUaHJvd24hVFRyYW5zcG9ydEV4Y2VwdGlvbihhLnJlYWRBbGwoYnVmKSk7CisKKyAgLy8gV3JpdGUgc29tZSBkYXRhIGFuZCByZWFkIGl0IGJhY2sgYWdhaW4uCisgIGEud3JpdGUodGVzdERhdGEpOworICBlbmZvcmNlKGEucGVlaygpKTsKKyAgZW5mb3JjZShhLmdldENvbnRlbnRzKCkgPT0gdGVzdERhdGEpOworICBlbmZvcmNlKGEucmVhZChidWYpID09IHRlc3REYXRhLmxlbmd0aCk7CisgIGVuZm9yY2UoYnVmID09IHRlc3REYXRhKTsKKworICAvLyBhIHNob3VsZCBiZSBlbXB0eSBhZ2Fpbi4KKyAgZW5mb3JjZSghYS5wZWVrKCkpOworICBlbmZvcmNlKGEucmVhZChidWYpID09IDApOworICBhc3NlcnRUaHJvd24hVFRyYW5zcG9ydEV4Y2VwdGlvbihhLnJlYWRBbGwoYnVmKSk7CisKKyAgLy8gVGVzdCB0aGUgY29uc3RydWN0b3Igd2hpY2ggZGlyZWN0bHkgYWNjZXB0cyBpbml0aWFsIGRhdGEuCisgIGF1dG8gYiA9IG5ldyBUTWVtb3J5QnVmZmVyKHRlc3REYXRhKTsKKyAgZW5mb3JjZShiLmlzT3Blbik7CisgIGVuZm9yY2UoYi5wZWVrKCkpOworICBlbmZvcmNlKGIuZ2V0Q29udGVudHMoKSA9PSB0ZXN0RGF0YSk7CisKKyAgLy8gVGVzdCBib3Jyb3coKS4KKyAgYXV0byBib3Jyb3dlZCA9IGIuYm9ycm93KG51bGwsIHRlc3REYXRhLmxlbmd0aCk7CisgIGVuZm9yY2UoYm9ycm93ZWQgPT0gdGVzdERhdGEpOworICBlbmZvcmNlKGIucGVlaygpKTsKKyAgYi5jb25zdW1lKHRlc3REYXRhLmxlbmd0aCk7CisgIGVuZm9yY2UoIWIucGVlaygpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3BpcGVkLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9waXBlZC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTE0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9waXBlZC5kCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5waXBlZDsKKworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworLyoqCisgKiBQaXBlcyBkYXRhIHJlcXVlc3QgZnJvbSBvbmUgdHJhbnNwb3J0IHRvIGFub3RoZXIgd2hlbiByZWFkRW5kKCkKKyAqIG9yIHdyaXRlRW5kKCkgaXMgY2FsbGVkLgorICoKKyAqIEEgdHlwaWNhbCB1c2UgY2FzZSB3b3VsZCBiZSB0byBsb2cgcmVxdWVzdHMgb24gZS5nLiBhIHNvY2tldCB0bworICogZGlzayAoaS4gZS4gcGlwZSB0aGVtIHRvIGEgVEZpbGVXcml0ZXJUcmFuc3BvcnQpLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBrZWVwcyBhbiBpbnRlcm5hbCBidWZmZXIgd2hpY2ggZXhwYW5kcyB0bworICogaG9sZCB0aGUgd2hvbGUgYW1vdW50IG9mIGRhdGEgcmVhZC93cml0dGVuIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nICpFbmQoKQorICogbWV0aG9kIGlzIGNhbGxlZC4KKyAqCisgKiBDb250cmFyeSB0byB0aGUgQysrIGltcGxlbWVudGF0aW9uLCB0aGlzIGRvZXNuJ3QgaW50cm9kdWNlIHlldCBhbm90aGVyIGxheWVyCisgKiBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyaW5nLCBhbGwgY2FsbHMgYXJlIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBzb3VyY2UKKyAqIHRyYW5zcG9ydCB2ZXJiYXRpbS4KKyAqLworZmluYWwgY2xhc3MgVFBpcGVkVHJhbnNwb3J0KFNvdXJjZSA9IFRUcmFuc3BvcnQpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVNvdXJjZQorKSA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLy8vIFRoZSBkZWZhdWx0IGluaXRpYWwgYnVmZmVyIHNpemUgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBpbiBieXRlcy4KKyAgZW51bSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgPSA1MTI7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIEJ5IGRlZmF1bHQsIG9ubHkgcmVhZHMgYXJlIHBpcGVkIChwaXBlUmVhZHMgPSB0cnVlLCBwaXBlV3JpdGVzID0gZmFsc2UpLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgc3JjVHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRvIHdoaWNoIGFsbCByZXF1ZXN0cyBhcmUgZm9yd2FyZGVkLgorICAgKiAgIGRzdFRyYW5zID0gVGhlIHRyYW5zcG9ydCB0aGUgcmVhZC93cml0dGVuIGRhdGEgaXMgY29waWVkIHRvLgorICAgKiAgIGluaXRpYWxCdWZmZXJTaXplID0gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgcmVhZC93cml0ZSBidWZmZXJzLCBmb3IKKyAgICogICAgIHBlcmZvcm1hbmNlIHR1bmluZy4KKyAgICovCisgIHRoaXMoU291cmNlIHNyY1RyYW5zLCBUVHJhbnNwb3J0IGRzdFRyYW5zLAorICAgIHNpemVfdCBpbml0aWFsQnVmZmVyU2l6ZSA9IERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRQorICApIHsKKyAgICBzcmNUcmFuc18gPSBzcmNUcmFuczsKKyAgICBkc3RUcmFuc18gPSBkc3RUcmFuczsKKworICAgIHJlYWRCdWZmZXJfID0gbmV3IFRNZW1vcnlCdWZmZXIoaW5pdGlhbEJ1ZmZlclNpemUpOworICAgIHdyaXRlQnVmZmVyXyA9IG5ldyBUTWVtb3J5QnVmZmVyKGluaXRpYWxCdWZmZXJTaXplKTsKKworICAgIHBpcGVSZWFkc18gPSB0cnVlOworICAgIHBpcGVXcml0ZXNfID0gZmFsc2U7CisgIH0KKworICBib29sIHBpcGVSZWFkcygpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHBpcGVSZWFkc187CisgIH0KKworICB2b2lkIHBpcGVSZWFkcyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHJlYWRCdWZmZXJfLnJlc2V0KCk7CisgICAgfQorICAgIHBpcGVSZWFkc18gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgcGlwZVdyaXRlcygpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHBpcGVXcml0ZXNfOworICB9CisKKyAgdm9pZCBwaXBlV3JpdGVzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgfQorICAgIHBpcGVXcml0ZXNfID0gdmFsdWU7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIHsKKyAgICByZXR1cm4gc3JjVHJhbnNfLmlzT3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiBzcmNUcmFuc18ucGVlaygpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHNyY1RyYW5zXy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIHNyY1RyYW5zXy5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIGJ5dGVzUmVhZCA9IHNyY1RyYW5zXy5yZWFkKGJ1Zik7CisKKyAgICBpZiAocGlwZVJlYWRzXykgeworICAgICAgcmVhZEJ1ZmZlcl8ud3JpdGUoYnVmWzAgLi4gYnl0ZXNSZWFkXSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkRW5kKCkgeworICAgIGlmIChwaXBlUmVhZHNfKSB7CisgICAgICBhdXRvIGRhdGEgPSByZWFkQnVmZmVyXy5nZXRDb250ZW50cygpOworICAgICAgZHN0VHJhbnNfLndyaXRlKGRhdGEpOworICAgICAgZHN0VHJhbnNfLmZsdXNoKCk7CisgICAgICByZWFkQnVmZmVyXy5yZXNldCgpOworCisgICAgICBzcmNUcmFuc18ucmVhZEVuZCgpOworCisgICAgICAvLyBSZXR1cm4gZGF0YS5sZW5ndGggaW5zdGVhZCBvZiB0aGUgcmVhZEVuZCgpIHJlc3VsdCBvZiB0aGUgc291cmNlCisgICAgICAvLyB0cmFuc3BvcnRzIGJlY2F1c2UgaXQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBmcm9tIGl0LgorICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiBzcmNUcmFuc18ucmVhZEVuZCgpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGlmIChwaXBlV3JpdGVzXykgeworICAgICAgd3JpdGVCdWZmZXJfLndyaXRlKGJ1Zik7CisgICAgfQorCisgICAgc3JjVHJhbnNfLndyaXRlKGJ1Zik7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVFbmQoKSB7CisgICAgaWYgKHBpcGVXcml0ZXNfKSB7CisgICAgICBhdXRvIGRhdGEgPSB3cml0ZUJ1ZmZlcl8uZ2V0Q29udGVudHMoKTsKKyAgICAgIGRzdFRyYW5zXy53cml0ZShkYXRhKTsKKyAgICAgIGRzdFRyYW5zXy5mbHVzaCgpOworICAgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisKKyAgICAgIHNyY1RyYW5zXy53cml0ZUVuZCgpOworCisgICAgICAvLyBSZXR1cm4gZGF0YS5sZW5ndGggaW5zdGVhZCBvZiB0aGUgcmVhZEVuZCgpIHJlc3VsdCBvZiB0aGUgc291cmNlCisgICAgICAvLyB0cmFuc3BvcnRzIGJlY2F1c2UgaXQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBmcm9tIGl0LgorICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiBzcmNUcmFuc18ud3JpdGVFbmQoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgc3JjVHJhbnNfLmZsdXNoKCk7CisgIH0KKworcHJpdmF0ZToKKyAgU291cmNlIHNyY1RyYW5zXzsKKyAgVFRyYW5zcG9ydCBkc3RUcmFuc187CisKKyAgVE1lbW9yeUJ1ZmZlciByZWFkQnVmZmVyXzsKKyAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87CisKKyAgYm9vbCBwaXBlUmVhZHNfOworICBib29sIHBpcGVXcml0ZXNfOworfQorCisvKioKKyAqIFRQaXBlZFRyYW5zcG9ydCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSB0cmFuc3BvcnQgdHlwZXMsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZAorICogdXNpbmcgSUZUSSAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWVzdCA2MDgyKSkuCisgKi8KK1RQaXBlZFRyYW5zcG9ydCFTb3VyY2UgdFBpcGVkVHJhbnNwb3J0KFNvdXJjZSkoCisgIFNvdXJjZSBzcmNUcmFucywgVFRyYW5zcG9ydCBkc3RUcmFucworKSBpZiAoaXNUVHJhbnNwb3J0IVNvdXJjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKHNyY1RyYW5zLCBkc3RUcmFucyk7Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIC8vIERNRCBAQEJVR0BAOiBVRkNTIGZvciBzdGQuYXJyYXkuZW1wdHkgZG9lc24ndCB3b3JrIHdoZW4gaW1wb3J0IGlzIG1vdmVkCisgIC8vIGludG8gdW5pdHRlc3QgYmxvY2suCisgIGltcG9ydCBzdGQuYXJyYXk7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK30KKwordW5pdHRlc3QgeworICBhdXRvIHVuZGVybHlpbmcgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBwaXBlVGFyZ2V0ID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gdHJhbnMgPSB0UGlwZWRUcmFuc3BvcnQodW5kZXJseWluZywgcGlwZVRhcmdldCk7CisKKyAgdW5kZXJseWluZy53cml0ZShjYXN0KHVieXRlW10pImFiY2QiKTsKKworICB1Ynl0ZVs0XSBidWZmZXI7CisgIHRyYW5zLnJlYWRBbGwoYnVmZmVyWzAgLi4gMl0pOworICBlbmZvcmNlKGJ1ZmZlclswIC4uIDJdID09ICJhYiIpOworICBlbmZvcmNlKHBpcGVUYXJnZXQuZ2V0Q29udGVudHMoKS5lbXB0eSk7CisKKyAgdHJhbnMucmVhZEVuZCgpOworICBlbmZvcmNlKHBpcGVUYXJnZXQuZ2V0Q29udGVudHMoKSA9PSAiYWIiKTsKKyAgcGlwZVRhcmdldC5yZXNldCgpOworCisgIHVuZGVybHlpbmcud3JpdGUoY2FzdCh1Ynl0ZVtdKSJlZiIpOworICB0cmFucy5yZWFkQWxsKGJ1ZmZlclswIC4uIDJdKTsKKyAgZW5mb3JjZShidWZmZXJbMCAuLiAyXSA9PSAiY2QiKTsKKyAgZW5mb3JjZShwaXBlVGFyZ2V0LmdldENvbnRlbnRzKCkuZW1wdHkpOworCisgIHRyYW5zLnJlYWRBbGwoYnVmZmVyWzAgLi4gMl0pOworICBlbmZvcmNlKGJ1ZmZlclswIC4uIDJdID09ICJlZiIpOworICBlbmZvcmNlKHBpcGVUYXJnZXQuZ2V0Q29udGVudHMoKS5lbXB0eSk7CisKKyAgdHJhbnMucmVhZEVuZCgpOworICBlbmZvcmNlKHBpcGVUYXJnZXQuZ2V0Q29udGVudHMoKSA9PSAiY2RlZiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcmFuZ2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3JhbmdlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxY2VhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3JhbmdlLmQKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUcmFuc3BvcnRzIHdoaWNoIG9wZXJhdGUgb24gZ2VuZXJpYyBEIHJhbmdlcy4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQucmFuZ2U7CisKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQucmFuZ2U7CitpbXBvcnQgc3RkLnRyYWl0cyA6IFVucXVhbDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogQWRhcHRzIGFuIHVieXRlIGlucHV0IHJhbmdlIGZvciByZWFkaW5nIHZpYSB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogVGhlIGNhc2Ugd2hlcmUgUiBpcyBhIHBsYWluIHVieXRlW10gaXMgcmVhc29uYWJseSBvcHRpbWl6ZWQsIHNvIGEgcG9zc2libGUKKyAqIHVzZSBjYXNlIGZvciBUSW5wdXRSYW5nZVRyYW5zcG9ydCB3b3VsZCBiZSB0byBkZXNlcmlhbGl6ZSBzb21lIGRhdGEgaGVsZCBpbgorICogYSBtZW1vcnkgYnVmZmVyLgorICovCitmaW5hbCBjbGFzcyBUSW5wdXRSYW5nZVRyYW5zcG9ydChSKSBpZiAoCisgIGlzSW5wdXRSYW5nZSEoVW5xdWFsIVIpICYmIGlzKEVsZW1lbnRUeXBlIVIgOiBjb25zdCh1Ynl0ZSkpCispIDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGRhdGEgPSBUaGUgaW5wdXQgcmFuZ2UgdG8gdXNlIGFzIGRhdGEuCisgICAqLworICB0aGlzKFIgZGF0YSkgeworICAgIGRhdGFfID0gZGF0YTsKKyAgfQorCisgIC8qKgorICAgKiBBbiBpbnB1dCByYW5nZSB0cmFuc3BvcnQgaXMgYWx3YXlzIG9wZW4uCisgICAqLworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuICFkYXRhXy5lbXB0eTsKKyAgfQorCisgIC8qKgorICAgKiBPcGVuaW5nIGlzIGEgbm8tb3AoKSBmb3IgYW4gaW5wdXQgcmFuZ2UgdHJhbnNwb3J0LgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkge30KKworICAvKioKKyAgICogQ2xvc2luZyBpcyBhIG5vLW9wKCkgZm9yIGEgbWVtb3J5IGJ1ZmZlci4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7fQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgYXV0byBkYXRhID0gZGF0YV8udGFrZShidWYubGVuZ3RoKTsKKyAgICBhdXRvIGJ5dGVzID0gZGF0YS5sZW5ndGg7CisKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihSLmluaXRbMSAuLiAyXSkgOiBjb25zdCh1Ynl0ZSlbXSkpIHsKKyAgICAgIC8vIHB1dCgpIGlzIGN1cnJlbnRseSB1bm5lY2Vzc2FyaWx5IHNsb3cgaWYgYm90aCByYW5nZXMgYXJlIHNsaWNlYWJsZS4KKyAgICAgIGJ1ZlswIC4uIGJ5dGVzXSA9IGRhdGFbXTsKKyAgICAgIGRhdGFfID0gZGF0YV9bYnl0ZXMgLi4gJF07CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zi5wdXQoZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgLyoqCisgICAqIFNob3J0Y3V0IHZlcnNpb24gb2YgcmVhZEFsbCgpIGZvciBzbGljYWJsZSByYW5nZXMuCisgICAqCisgICAqIEJlY2F1c2UgcmVhZEFsbCgpIGlzIHR5cGljYWxseSBhIHZlcnkgaG90IHBhdGggZHVyaW5nIGRlc2VyaWFsaXphdGlvbiwKKyAgICogdXNpbmcgdGhpcyBvdmVyIFRCYXNlVHJhbnNwb3J0LnJlYWRBbGwoKSBnaXZlcyB1cyBhIG5pY2UgaW5jcmVhc2UgaW4KKyAgICogc3BlZWQgZHVlIHRvIHRoZSByZWR1Y2VkIGFtb3VudCBvZiBpbmRpcmVjdGlvbnMuCisgICAqLworICBvdmVycmlkZSB2b2lkIHJlYWRBbGwodWJ5dGVbXSBidWYpIHsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihSLmluaXRbMSAuLiAyXSkgOiBjb25zdCh1Ynl0ZSlbXSkpIHsKKyAgICAgIGlmIChidWYubGVuZ3RoIDw9IGRhdGFfLmxlbmd0aCkgeworICAgICAgICBidWZbXSA9IGRhdGFfWzAgLi4gYnVmLmxlbmd0aF07CisgICAgICAgIGRhdGFfID0gZGF0YV9bYnVmLmxlbmd0aCAuLiAkXTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBzdXBlci5yZWFkQWxsKGJ1Zik7CisgIH0KKworICBvdmVycmlkZSBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgIHN0YXRpYyBpZiAoaXMoUiA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgLy8gQ2FuIG9ubHkgYm9ycm93IGlmIG91ciBkYXRhIHR5cGUgaXMgYWN0dWFsbHkgYW4gdWJ5dGUgYXJyYXkuCisgICAgICBpZiAobGVuIDw9IGRhdGFfLmxlbmd0aCkgeworICAgICAgICByZXR1cm4gZGF0YV87CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICBzdGF0aWMgaWYgKGlzKFIgOiBjb25zdCh1Ynl0ZSlbXSkpIHsKKyAgICAgIGlmIChsZW4gPiBkYXRhXy5sZW5ndGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY29uc3VtZSBsZW5ndGgiLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUyk7CisgICAgICB9CisgICAgICBkYXRhXyA9IGRhdGFfW2xlbiAuLiAkXTsKKyAgICB9IGVsc2UgeworICAgICAgc3VwZXIuY29uc3VtZShsZW4pOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXRzIGEgbmV3IGRhdGEgcmFuZ2UgdG8gdXNlLgorICAgKi8KKyAgdm9pZCByZXNldChSIGRhdGEpIHsKKyAgICBkYXRhXyA9IGRhdGE7CisgIH0KKworcHJpdmF0ZToKKyAgUiBkYXRhXzsKK30KKworLyoqCisgKiBUSW5wdXRSYW5nZVRyYW5zcG9ydCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcKKyAqIElGVEkgKHNlZSAkKExJTksyIGh0dHA6Ly9kLnB1cmVtYWdpYy5jb20vaXNzdWVzL3Nob3dfYnVnLmNnaT9pZD02MDgyLCBECisgKiBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUSW5wdXRSYW5nZVRyYW5zcG9ydCFSIHRJbnB1dFJhbmdlVHJhbnNwb3J0KFIpKFIgZGF0YSkgaWYgKAorICBpcyAoVElucHV0UmFuZ2VUcmFuc3BvcnQhUikKKykgeworICByZXR1cm4gbmV3IFRJbnB1dFJhbmdlVHJhbnNwb3J0IVIoZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjM4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZApAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworCitpbXBvcnQgY29yZS5zdGRjLmVycm5vOiBFQ09OTlJFU0VUOworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IGNvcmUudGltZSA6IGR1ciwgRHVyYXRpb247CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0LCB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworCisvKioKKyAqIENvbW1vbiBwYXJ0cyBvZiBhIHNvY2tldCBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uLCByZWdhcmRsZXNzIG9mIGhvdyB0aGUKKyAqIGFjdHVhbCBJL08gaXMgcGVyZm9ybWVkIChzeW5jL2FzeW5jKS4KKyAqLworYWJzdHJhY3QgY2xhc3MgVFNvY2tldEJhc2UgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIGFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkICghKSBzb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBzb2NrZXQgPSBBbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCBzb2NrZXQgb2JqZWN0LgorICAgKi8KKyAgdGhpcyhTb2NrZXQgc29ja2V0KSB7CisgICAgc29ja2V0XyA9IHNvY2tldDsKKyAgICBzZXRTb2NrZXRPcHRzKCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKKyAgICogb24gdGhlIGdpdmVuIHBvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBob3N0ID0gUmVtb3RlIGhvc3QuCisgICAqICAgcG9ydCA9IFJlbW90ZSBwb3J0LgorICAgKi8KKyAgdGhpcyhzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQpIHsKKyAgICBob3N0XyA9IGhvc3Q7CisgICAgcG9ydF8gPSBwb3J0OworICB9CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLgorICAgKi8KKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBzb2NrZXRfICFpcyBudWxsOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyBhcyBtdWNoIGRhdGEgdG8gdGhlIHNvY2tldCBhcyB0aGVyZSBjYW4gYmUgaW4gYSBzaW5nbGUgT1MgY2FsbC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IERhdGEgdG8gd3JpdGUuCisgICAqCisgICAqIFJldHVybnM6IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIE5ldmVyIG1vcmUgdGhhbiBidWYubGVuZ3RoLgorICAgKi8KKyAgYWJzdHJhY3Qgc2l6ZV90IHdyaXRlU29tZShpbiB1Ynl0ZVtdIGJ1Zikgb3V0ICh3cml0dGVuKSB7CisgICAgLy8gRE1EIEBAQlVHQEA6IEVuYWJsaW5nIHRoaXMgZS5nLiBmYWlscyB0aGUgY29udHJhY3QgaW4gdGhlCisgICAgLy8gYXN5bmNfdGVzdF9zZXJ2ZXIsIGJlY2F1c2UgYnVmLmxlbmd0aCBldmFsdWF0ZXMgdG8gMCBoZXJlLCBldmVuIHRob3VnaAorICAgIC8vIGluIHRoZSBtZXRob2QgYm9keSBpdCBjb3JyZWN0bHkgaXMgMjcgKGVxdWFsIHRvIHRoZSByZXR1cm4gdmFsdWUpLgorICAgIHZlcnNpb24gKG5vbmUpIGFzc2VydCh3cml0dGVuIDw9IGJ1Zi5sZW5ndGgsIHRleHQoIkltcGxlbWVudGF0aW9uIHdyb3RlICIgfgorICAgICAgIm1vcmUgZGF0YSB0aGFuIHJlcXVlc3RlZCB0bz8hICgiLCB3cml0dGVuLCAiIHZzLiAiLCBidWYubGVuZ3RoLCAiKSIpKTsKKyAgfSBib2R5IHsKKyAgICBhc3NlcnQoMCwgIkRNRCBidWc/IOKAkyBXaHkgd291bGQgY29udHJhY3RzIHdvcmsgZm9yIGludGVyZmFjZXMsIGJ1dCBub3QgIiB+CisgICAgICAiZm9yIGFic3RyYWN0IG1ldGhvZHM/ICIgfgorICAgICAgIihFcnJvcjogZnVuY3Rpb24gW+KApl0gaW4gYW5kIG91dCBjb250cmFjdHMgcmVxdWlyZSBmdW5jdGlvbiBib2R5Iik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYWN0dWFsIGFkZHJlc3Mgb2YgdGhlIHBlZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8uCisgICAqCisgICAqIEluIGNvbnRyYXN0LCB0aGUgaG9zdCBhbmQgcG9ydCBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlIGFkZHJlc3MgdXNlZCB0bworICAgKiBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24sIGFuZCBhcmUgbm90IHVwZGF0ZWQgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoZSBzb2NrZXQgbXVzdCBiZSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzLgorICAgKi8KKyAgQWRkcmVzcyBnZXRQZWVyQWRkcmVzcygpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCBnZXQgcGVlciBob3N0IGZvciAiIH4KKyAgICAgICJjbG9zZWQgc29ja2V0LiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgaWYgKCFwZWVyQWRkcmVzc18pIHsKKyAgICAgIHBlZXJBZGRyZXNzXyA9IHNvY2tldF8ucmVtb3RlQWRkcmVzcygpOworICAgICAgYXNzZXJ0KHBlZXJBZGRyZXNzXyk7CisgICAgfQorCisgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgaG9zdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0byBvciB3aWxsIGNvbm5lY3QgdG8uIE51bGwgaWYgYW4KKyAgICogYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0IHdhcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgb2JqZWN0LgorICAgKi8KKyAgc3RyaW5nIGhvc3QoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBob3N0XzsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgcG9ydCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0byBvciB3aWxsIGNvbm5lY3QgdG8uIFplcm8gaWYgYW4KKyAgICogYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0IHdhcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgb2JqZWN0LgorICAgKi8KKyAgdXNob3J0IHBvcnQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb3J0XzsKKyAgfQorCisgIC8vLyBUaGUgc29ja2V0IHNlbmQgdGltZW91dC4KKyAgRHVyYXRpb24gc2VuZFRpbWVvdXQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBzZW5kVGltZW91dF87CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBzZW5kVGltZW91dChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzZW5kVGltZW91dF8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBUaGUgc29ja2V0IHJlY2VpdmluZyB0aW1lb3V0LiBWYWx1ZXMgc21hbGxlciB0aGFuIDUwMCBtcyBhcmUgbm90CisgIC8vLyBzdXBwb3J0ZWQgb24gV2luZG93cy4KKyAgRHVyYXRpb24gcmVjdlRpbWVvdXQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiByZWN2VGltZW91dF87CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCByZWN2VGltZW91dChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICByZWN2VGltZW91dF8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBPUyBoYW5kbGUgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgKgorICAgKiBTaG91bGQgbm90IHVzdWFsbHkgYmUgdXNlZCBkaXJlY3RseSwgYnV0IGFjY2VzcyB0byBpdCBjYW4gYmUgbmVjZXNzYXJ5CisgICAqIHRvIGludGVyZmFjZSB3aXRoIEMgbGlicmFyaWVzLgorICAgKi8KKyAgdHlwZW9mKHNvY2tldF8uaGFuZGxlKCkpIHNvY2tldEhhbmRsZSgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNvY2tldF8uaGFuZGxlKCk7CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogU2V0cyB0aGUgbmVlZGVkIHNvY2tldCBvcHRpb25zLgorICAgKi8KKyAgdm9pZCBzZXRTb2NrZXRPcHRzKCkgeworICAgIHRyeSB7CisgICAgICBhbGlhcyBTb2NrZXRPcHRpb25MZXZlbC5TT0NLRVQgbHZsU29jazsKKyAgICAgIExpbmdlciBsOworICAgICAgbC5vbiA9IDA7CisgICAgICBsLnRpbWUgPSAwOworICAgICAgc29ja2V0Xy5zZXRPcHRpb24obHZsU29jaywgU29ja2V0T3B0aW9uLkxJTkdFUiwgbCk7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJDb3VsZCBub3Qgc2V0IHNvY2tldCBvcHRpb246ICVzIiwgZSk7CisgICAgfQorCisgICAgLy8gSnVzdCB0cnkgdG8gZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobSDigJMgdGhpcyB3aWxsIGZhaWwgaWYgd2UgYXJlIHBhc3NlZAorICAgIC8vIGluIGEgbm9uLVRDUCBzb2NrZXQgdmlhIHRoZSBTb2NrZXQtYWNjZXB0aW5nIGNvbnN0cnVjdG9yLgorICAgIHRyeSB7CisgICAgICBzb2NrZXRfLnNldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5UQ1AsIFNvY2tldE9wdGlvbi5UQ1BfTk9ERUxBWSwgdHJ1ZSk7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHt9CisgIH0KKworICAvLy8gUmVtb3RlIGhvc3QuCisgIHN0cmluZyBob3N0XzsKKworICAvLy8gUmVtb3RlIHBvcnQuCisgIHVzaG9ydCBwb3J0XzsKKworICAvLy8gVGltZW91dCBmb3Igc2VuZGluZy4KKyAgRHVyYXRpb24gc2VuZFRpbWVvdXRfOworCisgIC8vLyBUaW1lb3V0IGZvciByZWNlaXZpbmcuCisgIER1cmF0aW9uIHJlY3ZUaW1lb3V0XzsKKworICAvLy8gQ2FjaGVkIHBlZXIgYWRkcmVzcy4KKyAgQWRkcmVzcyBwZWVyQWRkcmVzc187CisKKyAgLy8vIENhY2hlZCBwZWVyIGhvc3QgbmFtZS4KKyAgc3RyaW5nIHBlZXJIb3N0XzsKKworICAvLy8gQ2FjaGVkIHBlZXIgcG9ydC4KKyAgdXNob3J0IHBlZXJQb3J0XzsKKworICAvLy8gV3JhcHBlZCBzb2NrZXQgb2JqZWN0LgorICBTb2NrZXQgc29ja2V0XzsKK30KKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIER1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2Ygc3RkLnNvY2tldCwgY3VycmVudGx5IG9ubHkgVENQL0lQIHNvY2tldHMgYXJlCisgKiBzdXBwb3J0ZWQgKGkuZS4gVW5peCBkb21haW4gc29ja2V0cyBhcmUgbm90KS4KKyAqLworY2xhc3MgVFNvY2tldCA6IFRTb2NrZXRCYXNlIHsKKyAgLy8vCisgIHRoaXMoU29ja2V0IHNvY2tldCkgeworICAgIHN1cGVyKHNvY2tldCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQpIHsKKyAgICBzdXBlcihob3N0LCBwb3J0KTsKKyAgfQorCisgIC8qKgorICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGlmIChpc09wZW4pIHJldHVybjsKKworICAgIGVuZm9yY2UoIWhvc3RfLmVtcHR5LCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiBzb2NrZXQgdG8gbnVsbCBob3N0LiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworICAgIGVuZm9yY2UocG9ydF8gIT0gMCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IG9wZW4gc29ja2V0IHRvIHBvcnQgemVyby4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIEFkZHJlc3NbXSBhZGRyczsKKyAgICB0cnkgeworICAgICAgYWRkcnMgPSBnZXRBZGRyZXNzKGhvc3RfLCBwb3J0Xyk7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzb2x2ZSBnaXZlbiBob3N0IHN0cmluZy4iLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4sIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgfQorCisgICAgRXhjZXB0aW9uW10gZXJyb3JzOworICAgIGZvcmVhY2ggKGFkZHI7IGFkZHJzKSB7CisgICAgICB0cnkgeworICAgICAgICBzb2NrZXRfID0gbmV3IFRjcFNvY2tldChhZGRyLmFkZHJlc3NGYW1pbHkpOworICAgICAgICBzZXRTb2NrZXRPcHRzKCk7CisgICAgICAgIHNvY2tldF8uY29ubmVjdChhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgICBlcnJvcnMgfj0gZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGVycm9ycy5sZW5ndGggPT0gYWRkcnMubGVuZ3RoKSB7CisgICAgICBzb2NrZXRfID0gbnVsbDsKKyAgICAgIC8vIE5lZWQgdG8gdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIHRvIGFiaWRlIHRoZSBUVHJhbnNwb3J0IEFQSS4KKyAgICAgIGltcG9ydCBzdGQuYWxnb3JpdGhtLCBzdGQucmFuZ2U7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgdGV4dCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gIiwgaG9zdF8sICI6IiwgcG9ydF8sICIuIiksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTiwKKyAgICAgICAgX19GSUxFX18sIF9fTElORV9fLAorICAgICAgICBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgIHRleHQoCisgICAgICAgICAgICAiQWxsIGFkZHJlc3NlcyB0cmllZCBmYWlsZWQgKCIsCisgICAgICAgICAgICBqb2luZXIobWFwIXF7dGV4dChhWzBdLCBgOiAiYCwgYVsxXS5tc2csIGAiYCl9KHppcChhZGRycywgZXJyb3JzKSksICIsICIpLAorICAgICAgICAgICAgIikuIgorICAgICAgICAgICksCisgICAgICAgICAgZXJyb3JzCisgICAgICAgICkKKyAgICAgICk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgc29ja2V0LgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgc29ja2V0Xy5jbG9zZSgpOworICAgIHNvY2tldF8gPSBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm4gZmFsc2U7CisKKyAgICB1Ynl0ZSBidWY7CisgICAgYXV0byByID0gc29ja2V0Xy5yZWNlaXZlKCgmYnVmKVswIC4uIDFdLCBTb2NrZXRGbGFncy5QRUVLKTsKKyAgICBpZiAociA9PSAtMSkgeworICAgICAgYXV0byBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworICAgICAgc3RhdGljIGlmIChjb25ucmVzZXRPblBlZXJTaHV0ZG93bikgeworICAgICAgICBpZiAobGFzdEVycm5vID09IEVDT05OUkVTRVQpIHsKKyAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlBlZWtpbmcgaW50byBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04pOworICAgIH0KKyAgICByZXR1cm4gKHIgPiAwKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCByZWFkIGlmIHNvY2tldCBpcyBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIHR5cGVvZihnZXRTb2NrZXRFcnJubygpKSBsYXN0RXJybm87CisgICAgdXNob3J0IHRyaWVzOworICAgIHdoaWxlICh0cmllcysrIDw9IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgYXV0byByID0gc29ja2V0Xy5yZWNlaXZlKGNhc3Qodm9pZFtdKWJ1Zik7CisKKyAgICAgIC8vIElmIHJlY3Ygd2VudCBmaW5lLCBpbW1lZGlhdGVseSByZXR1cm4uCisgICAgICBpZiAociA+PSAwKSByZXR1cm4gcjsKKworICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcsIGZpbmQgb3V0IGhvdyB0byBoYW5kbGUgaXQuCisgICAgICBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworCisgICAgICBpZiAobGFzdEVycm5vID09IElOVEVSUlVQVEVEX0VSUk5PKSB7CisgICAgICAgIC8vIElmIHRoZSBzeXNjYWxsIHdhcyBpbnRlcnJ1cHRlZCwganVzdCB0cnkgYWdhaW4uCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBzdGF0aWMgaWYgKGNvbm5yZXNldE9uUGVlclNodXRkb3duKSB7CisgICAgICAgIC8vIFNlZSB0b3AgY29tbWVudC4KKyAgICAgICAgaWYgKGxhc3RFcnJubyA9PSBFQ09OTlJFU0VUKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gTm90IGFuIGVycm9yIHdoaWNoIGlzIGhhbmRsZWQgaW4gYSBzcGVjaWFsIHdheSwganVzdCBsZWF2ZSB0aGUgbG9vcC4KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc1NvY2tldENsb3NlRXJybm8obGFzdEVycm5vKSkgeworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWNlaXZpbmcgZmFpbGVkLCBjbG9zaW5nIHNvY2tldDogIiB+CisgICAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTik7CisgICAgfSBlbHNlIGlmIChsYXN0RXJybm8gPT0gVElNRU9VVF9FUlJOTykgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlRJTUVEX09VVCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWNlaXZpbmcgZnJvbSBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV04pOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBzaXplX3Qgc2VudDsKKyAgICB3aGlsZSAoc2VudCA8IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIGF1dG8gYiA9IHdyaXRlU29tZShidWZbc2VudCAuLiAkXSk7CisgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0aW1lb3V0IHNldCB3aXRoIFNPX1NORFRJTUVPIGV4cGlyZWQuCisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJzZW5kKCkgdGltZW91dCBleHBpcmVkLiIsCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlRJTUVEX09VVCk7CisgICAgICB9CisgICAgICBzZW50ICs9IGI7CisgICAgfQorICAgIGFzc2VydChzZW50ID09IGJ1Zi5sZW5ndGgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHdyaXRlU29tZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgd3JpdGUgaWYgZmlsZSBpcyBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGF1dG8gciA9IHNvY2tldF8uc2VuZChidWYpOworCisgICAgLy8gRXZlcnl0aGluZyB3ZW50IHdlbGwsIGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAgICBpZiAociA+IDApIHJldHVybiByOworCisgICAgLy8gSGFuZGxlIGVycm9yIGNvbmRpdGlvbnMuCisgICAgaWYgKHIgPCAwKSB7CisgICAgICBhdXRvIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICAgIGlmIChsYXN0RXJybm8gPT0gV09VTERfQkxPQ0tfRVJSTk8pIHsKKyAgICAgICAgLy8gTm90IGFuIGV4Y2VwdGlvbmFsIGVycm9yIHBlciBzZSDigJMgZXZlbiB3aXRoIGJsb2NraW5nIHNvY2tldHMsCisgICAgICAgIC8vIEVBR0FJTiBhcHBhcmVudGx5IGlzIHJldHVybmVkIHNvbWV0aW1lcyBvbiBvdXQtb2YtcmVzb3VyY2UKKyAgICAgICAgLy8gY29uZGl0aW9ucyAoc2VlIHRoZSBDKysgaW1wbGVtZW50YXRpb24gZm9yIGRldGFpbHMpLiBBbHNvLCB0aGlzCisgICAgICAgIC8vIGFsbG93cyB1c2luZyBUU29ja2V0IHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMgZS5nLiBpbgorICAgICAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIuCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBhdXRvIHR5cGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTjsKKyAgICAgIGlmIChpc1NvY2tldENsb3NlRXJybm8obGFzdEVycm5vKSkgeworICAgICAgICB0eXBlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOOworICAgICAgICBjbG9zZSgpOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VuZGluZyB0byBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgdHlwZSk7CisgICAgfQorCisgICAgLy8gc2VuZCgpIHNob3VsZCBuZXZlciByZXR1cm4gMC4KKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VuZGluZyB0byBzb2NrZXQgZmFpbGVkICgwIGJ5dGVzIHdyaXR0ZW4pLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHNlbmRUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHN1cGVyLnNlbmRUaW1lb3V0KHZhbHVlKTsKKyAgICBzZXRUaW1lb3V0KFNvY2tldE9wdGlvbi5TTkRUSU1FTywgdmFsdWUpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCByZWN2VGltZW91dChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzdXBlci5yZWN2VGltZW91dCh2YWx1ZSk7CisgICAgc2V0VGltZW91dChTb2NrZXRPcHRpb24uUkNWVElNRU8sIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciByZWNlaXZpbmcgZnJvbSBzb2NrZXQgb24gcmVhZCgpIGluIGNhc2Ugb2YKKyAgICogRUFHQUlOL0VJTlRSLgorICAgKi8KKyAgdXNob3J0IG1heFJlY3ZSZXRyaWVzKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gbWF4UmVjdlJldHJpZXNfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgbWF4UmVjdlJldHJpZXModXNob3J0IHZhbHVlKSBAcHJvcGVydHkgeworICAgIG1heFJlY3ZSZXRyaWVzXyA9IHZhbHVlOworICB9CisKKyAgLy8vIERpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfUkVDVl9SRVRSSUVTID0gNTsKKworcHJvdGVjdGVkOgorICBvdmVycmlkZSB2b2lkIHNldFNvY2tldE9wdHMoKSB7CisgICAgc3VwZXIuc2V0U29ja2V0T3B0cygpOworICAgIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uLlNORFRJTUVPLCBzZW5kVGltZW91dF8pOworICAgIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uLlJDVlRJTUVPLCByZWN2VGltZW91dF8pOworICB9CisKKyAgdm9pZCBzZXRUaW1lb3V0KFNvY2tldE9wdGlvbiB0eXBlLCBEdXJhdGlvbiB2YWx1ZSkgeworICAgIGFzc2VydCh0eXBlID09IFNvY2tldE9wdGlvbi5TTkRUSU1FTyB8fCB0eXBlID09IFNvY2tldE9wdGlvbi5SQ1ZUSU1FTyk7CisgICAgdmVyc2lvbiAoV2luMzIpIHsKKyAgICAgIGlmICh2YWx1ZSA+IGR1ciEiaG5zZWNzIigwKSAmJiB2YWx1ZSA8IGR1ciEibXNlY3MiKDUwMCkpIHsKKyAgICAgICAgbG9nRXJyb3IoCisgICAgICAgICAgIlNvY2tldCAlcyB0aW1lb3V0IG9mICVzIG1zIG1pZ2h0IGJlIHJhaXNlZCB0byA1MDAgbXMgb24gV2luZG93cy4iLAorICAgICAgICAgICh0eXBlID09IFNvY2tldE9wdGlvbi5TTkRUSU1FTykgPyAic2VuZCIgOiAicmVjZWl2ZSIsCisgICAgICAgICAgdmFsdWUudG90YWwhIm1zZWNzIgorICAgICAgICApOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzb2NrZXRfKSB7CisgICAgICB0cnkgeworICAgICAgICBzb2NrZXRfLnNldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5TT0NLRVQsIHR5cGUsIHZhbHVlKTsKKyAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICJDb3VsZCBub3Qgc2V0IHRpbWVvdXQuIiwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTiwKKyAgICAgICAgICBfX0ZJTEVfXywKKyAgICAgICAgICBfX0xJTkVfXywKKyAgICAgICAgICBlCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIE1heGltdW0gbnVtYmVyIG9mIHJlY3YoKSByZXRyaWVzLgorICB1c2hvcnQgbWF4UmVjdlJldHJpZXNfICA9IERFRkFVTFRfTUFYX1JFQ1ZfUkVUUklFUzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjZTQwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kCkBAIC0wLDAgKzEsNjkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogT3BlblNTTCBzb2NrZXQgaW1wbGVtZW50YXRpb24sIGluIGxhcmdlIHBhcnRzIHBvcnRlZCBmcm9tIEMrKy4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuc3NsOworCitpbXBvcnQgY29yZS5leGNlcHRpb24gOiBvbk91dE9mTWVtb3J5RXJyb3I7CitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm8sIEVJTlRSOworaW1wb3J0IGNvcmUuc3luYy5tdXRleCA6IE11dGV4OworaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CitpbXBvcnQgY29yZS5zdGRjLmNvbmZpZzsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RkbGliIDogZnJlZSwgbWFsbG9jOworaW1wb3J0IHN0ZC5hc2NpaSA6IHRvVXBwZXI7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250LCBwb3BGcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IGVtcGxhY2UsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBBZGRyZXNzLCBJbnRlcm5ldEFkZHJlc3MsIEludGVybmV0NkFkZHJlc3MsIFNvY2tldDsKK2ltcG9ydCBzdGQuc3RyaW5nIDogdG9TdHJpbmd6OworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmVycjsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5yYW5kOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLnNzbDsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC54NTA5djM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNzbDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKKy8qKgorICogU1NMIGVuY3J5cHRlZCBzb2NrZXQgaW1wbGVtZW50YXRpb24gdXNpbmcgT3BlblNTTC4KKyAqCisgKiBOb3RlOgorICogT24gUG9zaXggc3lzdGVtcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUgQlNELXNwZWNpZmljIFNPX05PU0lHUElQRSBmbGFnLCB5b3UKKyAqIG1pZ2h0IHdhbnQgdG8gaWdub3JlIHRoZSBTSUdQSVBFIHNpZ25hbCwgYXMgT3BlblNTTCBtaWdodCB0cnkgdG8gd3JpdGUgdG8KKyAqIGEgY2xvc2VkIHNvY2tldCBpZiB0aGUgcGVlciBkaXNjb25uZWN0cyBhYnJ1cHRseToKKyAqIC0tLQorICogaW1wb3J0IGNvcmUuc3RkYy5zaWduYWw7CisgKiBpbXBvcnQgY29yZS5zeXMucG9zaXguc2lnbmFsOworICogc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICogLS0tCisgKi8KK2ZpbmFsIGNsYXNzIFRTU0xTb2NrZXQgOiBUU29ja2V0IHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgdGhhdCB3cmFwcyBhbiBhbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCAoISkgc29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgY29udGV4dCA9IFRoZSBTU0wgc29ja2V0IGNvbnRleHQgdG8gdXNlLiBBIHJlZmVyZW5jZSB0byBpdCBpcyBzdG9yZWQgc28KKyAgICogICAgIHRoYXQgaXQgZG9lc24ndCBnZXQgY2xlYW5lZCB1cCB3aGlsZSB0aGUgc29ja2V0IGlzIHVzZWQuCisgICAqICAgc29ja2V0ID0gQWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgc29ja2V0IG9iamVjdC4KKyAgICovCisgIHRoaXMoVFNTTENvbnRleHQgY29udGV4dCwgU29ja2V0IHNvY2tldCkgeworICAgIHN1cGVyKHNvY2tldCk7CisgICAgY29udGV4dF8gPSBjb250ZXh0OworICAgIHNlcnZlclNpZGVfID0gY29udGV4dC5zZXJ2ZXJTaWRlOworICAgIGFjY2Vzc01hbmFnZXJfID0gY29udGV4dC5hY2Nlc3NNYW5hZ2VyOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0IHRoYXQgd2lsbCBjb25uZWN0IHRvIHRoZSBnaXZlbiBob3N0CisgICAqIG9uIHRoZSBnaXZlbiBwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgY29udGV4dCA9IFRoZSBTU0wgc29ja2V0IGNvbnRleHQgdG8gdXNlLiBBIHJlZmVyZW5jZSB0byBpdCBpcyBzdG9yZWQgc28KKyAgICAqICAgICB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGNsZWFuZWQgdXAgd2hpbGUgdGhlIHNvY2tldCBpcyB1c2VkLgorICAgKiAgIGhvc3QgPSBSZW1vdGUgaG9zdC4KKyAgICogICBwb3J0ID0gUmVtb3RlIHBvcnQuCisgICAqLworICB0aGlzKFRTU0xDb250ZXh0IGNvbnRleHQsIHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCkgeworICAgIHN1cGVyKGhvc3QsIHBvcnQpOworICAgIGNvbnRleHRfID0gY29udGV4dDsKKyAgICBzZXJ2ZXJTaWRlXyA9IGNvbnRleHQuc2VydmVyU2lkZTsKKyAgICBhY2Nlc3NNYW5hZ2VyXyA9IGNvbnRleHQuYWNjZXNzTWFuYWdlcjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICBpZiAoc3NsXyBpcyBudWxsIHx8ICFzdXBlci5pc09wZW4oKSkgcmV0dXJuIGZhbHNlOworCisgICAgYXV0byBzaHV0ZG93biA9IFNTTF9nZXRfc2h1dGRvd24oc3NsXyk7CisgICAgYm9vbCBzaHV0ZG93blJlY2VpdmVkID0gKHNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSAhPSAwOworICAgIGJvb2wgc2h1dGRvd25TZW50ID0gKHNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pICE9IDA7CisgICAgcmV0dXJuICEoc2h1dGRvd25SZWNlaXZlZCAmJiBzaHV0ZG93blNlbnQpOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm4gZmFsc2U7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIGJ5dGUgYnQ7CisgICAgYXV0byByYyA9IFNTTF9wZWVrKHNzbF8sICZidCwgYnQuc2l6ZW9mKTsKKyAgICBlbmZvcmNlKHJjID49IDAsIGdldFNTTEV4Y2VwdGlvbigiU1NMX3BlZWsiKSk7CisKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgfQorICAgIHJldHVybiAocmMgPiAwKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBlbmZvcmNlKCFzZXJ2ZXJTaWRlXywgIkNhbm5vdCBvcGVuIGEgc2VydmVyLXNpZGUgU1NMIHNvY2tldC4iKTsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisgICAgc3VwZXIub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgaWYgKHNzbF8gIWlzIG51bGwpIHsKKyAgICAgIC8vIFR3by1zdGVwIFNTTCBzaHV0ZG93bi4KKyAgICAgIGF1dG8gcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgIH0KKyAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgLy8gRG8gbm90IHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlIGFzIGxlYXZpbmcgdGhlIHRyYW5zcG9ydCAib3BlbiIgd2lsbAorICAgICAgICAvLyBwcm9iYWJseSBwcm9kdWNlIG9ubHkgbW9yZSBlcnJvcnMsIGFuZCB0aGUgY2hhbmNlIHdlIGNhbiBkbworICAgICAgICAvLyBzb21ldGhpbmcgYWJvdXQgdGhlIGVycm9yIGUuZy4gYnkgcmV0cnlpbmcgaXMgdmVyeSBsb3cuCisgICAgICAgIGxvZ0Vycm9yKCJFcnJvciBzaHV0dGluZyBkb3duIFNTTDogJXMiLCBnZXRTU0xFeGNlcHRpb24oKSk7CisgICAgICB9CisKKyAgICAgIFNTTF9mcmVlKHNzbF8pOworICAgICAgc3NsXyA9IG51bGw7CisgICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICAgIH0KKyAgICBzdXBlci5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgaW50IGJ5dGVzOworICAgIGZvcmVhY2ggKF87IDAgLi4gbWF4UmVjdlJldHJpZXMpIHsKKyAgICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsXywgYnVmLnB0ciwgY2FzdChpbnQpYnVmLmxlbmd0aCk7CisgICAgICBpZiAoYnl0ZXMgPj0gMCkgYnJlYWs7CisKKyAgICAgIGF1dG8gZXJybm9Db3B5ID0gZXJybm87CisgICAgICBpZiAoU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcykgPT0gU1NMX0VSUk9SX1NZU0NBTEwpIHsKKyAgICAgICAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vQ29weSA9PSBFSU5UUikgeworICAgICAgICAgIC8vIEZJWE1FOiBXaW5kb3dzLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBnZXRTU0xFeGNlcHRpb24oIlNTTF9yZWFkIik7CisgICAgfQorICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgLy8gTG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICAgIHNpemVfdCB3cml0dGVuID0gMDsKKyAgICB3aGlsZSAod3JpdHRlbiA8IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIGF1dG8gYnl0ZXMgPSBTU0xfd3JpdGUoc3NsXywgYnVmLnB0ciArIHdyaXR0ZW4sCisgICAgICAgIGNhc3QoaW50KShidWYubGVuZ3RoIC0gd3JpdHRlbikpOworICAgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgICAgdGhyb3cgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfd3JpdGUiKTsKKyAgICAgIH0KKyAgICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgYXV0byBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgICAgZW5mb3JjZShiaW8gIWlzIG51bGwsIG5ldyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJuZWQgbnVsbCIpKTsKKworICAgIGF1dG8gcmMgPSBCSU9fZmx1c2goYmlvKTsKKyAgICBlbmZvcmNlKHJjID09IDEsIGdldFNTTEV4Y2VwdGlvbigiQklPX2ZsdXNoIikpOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZSBTU0wgaGFuZHNoYWtlIHByb3RvY29sLgorICAgKi8KKyAgYm9vbCBzZXJ2ZXJTaWRlKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gc2VydmVyU2lkZV87CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBzZXJ2ZXJTaWRlKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc2VydmVyU2lkZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgYWNjZXNzIG1hbmFnZXIgdG8gdXNlLgorICAgKi8KKyAgdm9pZCBhY2Nlc3NNYW5hZ2VyKFRBY2Nlc3NNYW5hZ2VyIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGFjY2Vzc01hbmFnZXJfID0gdmFsdWU7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBjaGVja0hhbmRzaGFrZSgpIHsKKyAgICBlbmZvcmNlKHN1cGVyLmlzT3BlbigpLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgaWYgKHNzbF8gIWlzIG51bGwpIHJldHVybjsKKyAgICBzc2xfID0gY29udGV4dF8uY3JlYXRlU1NMKCk7CisKKyAgICBTU0xfc2V0X2ZkKHNzbF8sIHNvY2tldEhhbmRsZSk7CisgICAgaW50IHJjOworICAgIGlmIChzZXJ2ZXJTaWRlXykgeworICAgICAgcmMgPSBTU0xfYWNjZXB0KHNzbF8pOworICAgIH0gZWxzZSB7CisgICAgICByYyA9IFNTTF9jb25uZWN0KHNzbF8pOworICAgIH0KKyAgICBlbmZvcmNlKHJjID4gMCwgZ2V0U1NMRXhjZXB0aW9uKCkpOworICAgIGF1dGhvcml6ZShzc2xfLCBhY2Nlc3NNYW5hZ2VyXywgZ2V0UGVlckFkZHJlc3MoKSwKKyAgICAgIChzZXJ2ZXJTaWRlXyA/IGdldFBlZXJBZGRyZXNzKCkudG9Ib3N0TmFtZVN0cmluZygpIDogaG9zdCkpOworICB9CisKKyAgYm9vbCBzZXJ2ZXJTaWRlXzsKKyAgU1NMKiBzc2xfOworICBUU1NMQ29udGV4dCBjb250ZXh0XzsKKyAgVEFjY2Vzc01hbmFnZXIgYWNjZXNzTWFuYWdlcl87Cit9CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBPcGVuU1NMIGNvbnRleHQgd2l0aCBjZXJ0aWZpY2F0aW9uIHNldHRpbmdzLCBldGMuIGFuZCBoYW5kbGVzCisgKiBpbml0aWFsaXphdGlvbi90ZWFyZG93bi4KKyAqCisgKiBPcGVuU1NMIGlzIGluaXRpYWxpemVkIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogYW5kIHNodXQgZG93biB3aGVuIHRoZSBsYXN0IG9uZSBpcyBkZXN0cm95ZWQgKHRocmVhZC1zYWZlKS4KKyAqLworY2xhc3MgVFNTTENvbnRleHQgeworICB0aGlzKCkgeworICAgIGluaXRNdXRleF8ubG9jaygpOworICAgIHNjb3BlKGV4aXQpIGluaXRNdXRleF8udW5sb2NrKCk7CisKKyAgICBpZiAoY291bnRfID09IDApIHsKKyAgICAgIGluaXRpYWxpemVPcGVuU1NMKCk7CisgICAgICByYW5kb21pemUoKTsKKyAgICB9CisgICAgY291bnRfKys7CisKKyAgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQVRfTEVBU1QoMSwgMSkpIHsKKyAgICAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU19tZXRob2QoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisgICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYyKTsKKyAgICB9CisgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8vIFRIUklGVC0zMTY0CisgICAgZW5mb3JjZShjdHhfLCBnZXRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbmV3IikpOworICAgIFNTTF9DVFhfc2V0X21vZGUoY3R4XywgU1NMX01PREVfQVVUT19SRVRSWSk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICBpbml0TXV0ZXhfLmxvY2soKTsKKyAgICBzY29wZShleGl0KSBpbml0TXV0ZXhfLnVubG9jaygpOworCisgICAgaWYgKGN0eF8gIWlzIG51bGwpIHsKKyAgICAgIFNTTF9DVFhfZnJlZShjdHhfKTsKKyAgICAgIGN0eF8gPSBudWxsOworICAgIH0KKworICAgIGNvdW50Xy0tOworICAgIGlmIChjb3VudF8gPT0gMCkgeworICAgICAgY2xlYW51cE9wZW5TU0woKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2lwaGVycyB0byBiZSB1c2VkIGluIFNTTCBoYW5kc2hha2UgcHJvY2Vzcy4KKyAgICoKKyAgICogVGhlIHN0cmluZyBtdXN0IGJlIGluIHRoZSBjb2xvbi1kZWxpbWl0ZWQgT3BlblNTTCBub3RhdGlvbiBkZXNjcmliZWQgaW4KKyAgICogY2lwaGVycygxKSwgZm9yIGV4YW1wbGU6ICJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiLgorICAgKi8KKyAgdm9pZCBjaXBoZXJzKHN0cmluZyBlbmFibGUpIEBwcm9wZXJ0eSB7CisgICAgYXV0byByYyA9IFNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eF8sIHRvU3RyaW5neihlbmFibGUpKTsKKworICAgIGVuZm9yY2UoRVJSX3BlZWtfZXJyb3IoKSA9PSAwLCBnZXRTU0xFeGNlcHRpb24oIlNTTF9DVFhfc2V0X2NpcGhlcl9saXN0IikpOworICAgIGVuZm9yY2UocmMgPiAwLCBuZXcgVFNTTEV4Y2VwdGlvbigiTm9uZSBvZiBzcGVjaWZpZWQgY2lwaGVycyBhcmUgc3VwcG9ydGVkIikpOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgcGVlciBpcyByZXF1aXJlZCB0byBwcmVzZW50IGEgdmFsaWQgY2VydGlmaWNhdGUuCisgICAqLworICB2b2lkIGF1dGhlbnRpY2F0ZShib29sIHJlcXVpcmVkKSBAcHJvcGVydHkgeworICAgIGludCBtb2RlOworICAgIGlmIChyZXF1aXJlZCkgeworICAgICAgbW9kZSA9IFNTTF9WRVJJRllfUEVFUiB8IFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfAorICAgICAgICBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworICAgIH0gZWxzZSB7CisgICAgICBtb2RlID0gU1NMX1ZFUklGWV9OT05FOworICAgIH0KKyAgICBTU0xfQ1RYX3NldF92ZXJpZnkoY3R4XywgbW9kZSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogTG9hZCBzZXJ2ZXIgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwYXRoID0gUGF0aCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZS4KKyAgICogICBmb3JtYXQgPSBDZXJ0aWZpY2F0ZSBmaWxlIGZvcm1hdC4gRGVmYXVsdHMgdG8gUEVNLCB3aGljaCBpcyBjdXJyZW50bHkKKyAgICogICAgIHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQuCisgICAqLworICB2b2lkIGxvYWRDZXJ0aWZpY2F0ZShzdHJpbmcgcGF0aCwgc3RyaW5nIGZvcm1hdCA9ICJQRU0iKSB7CisgICAgZW5mb3JjZShwYXRoICFpcyBudWxsICYmIGZvcm1hdCAhaXMgbnVsbCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAibG9hZENlcnRpZmljYXRlQ2hhaW46IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgbnVsbCIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGlmIChmb3JtYXQgPT0gIlBFTSIpIHsKKyAgICAgIGVuZm9yY2UoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjdHhfLCB0b1N0cmluZ3oocGF0aCkpLAorICAgICAgICBnZXRTU0xFeGNlcHRpb24oCisgICAgICAgICAgYENvdWxkIG5vdCBsb2FkIFNTTCBzZXJ2ZXIgY2VydGlmaWNhdGUgZnJvbSBmaWxlICJgIH4gcGF0aCB+IGAiYAorICAgICAgICApCisgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgZm9ybWF0OiAiIH4gZm9ybWF0KTsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBMb2FkIHByaXZhdGUga2V5LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcGF0aCA9IFBhdGggdG8gdGhlIGNlcnRpZmljYXRlIGZpbGUuCisgICAqICAgZm9ybWF0ID0gUHJpdmF0ZSBrZXkgZmlsZSBmb3JtYXQuIERlZmF1bHRzIHRvIFBFTSwgd2hpY2ggaXMgY3VycmVudGx5CisgICAqICAgICB0aGUgb25seSBvbmUgc3VwcG9ydGVkLgorICAgKi8KKyAgdm9pZCBsb2FkUHJpdmF0ZUtleShzdHJpbmcgcGF0aCwgc3RyaW5nIGZvcm1hdCA9ICJQRU0iKSB7CisgICAgZW5mb3JjZShwYXRoICFpcyBudWxsICYmIGZvcm1hdCAhaXMgbnVsbCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAibG9hZFByaXZhdGVLZXk6IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGlmIChmb3JtYXQgPT0gIlBFTSIpIHsKKyAgICAgIGVuZm9yY2UoU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGN0eF8sIHRvU3RyaW5neihwYXRoKSwgU1NMX0ZJTEVUWVBFX1BFTSksCisgICAgICAgIGdldFNTTEV4Y2VwdGlvbigKKyAgICAgICAgICBgQ291bGQgbm90IGxvYWQgU1NMIHByaXZhdGUga2V5IGZyb20gZmlsZSAiYCB+IHBhdGggfiBgImAKKyAgICAgICAgKQorICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIGZvcm1hdDogIiB+IGZvcm1hdCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZnJvbSBzcGVjaWZpZWQgZmlsZSAoaW4gUEVNIGZvcm1hdCkuCisgICAqCisgICAqIFBhcmFtcy4KKyAgICogICBwYXRoID0gUGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSB0cnVzdGVkIGNlcnRpZmljYXRlcy4KKyAgICovCisgIHZvaWQgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoc3RyaW5nIHBhdGgpIHsKKyAgICBlbmZvcmNlKHBhdGggIWlzIG51bGwsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzOiA8cGF0aD4gaXMgTlVMTCIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGVuZm9yY2UoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4XywgdG9TdHJpbmd6KHBhdGgpLCBudWxsKSwKKyAgICAgIGdldFNTTEV4Y2VwdGlvbigKKyAgICAgICAgYENvdWxkIG5vdCBsb2FkIFNTTCB0cnVzdGVkIGNlcnRpZmljYXRlIGxpc3QgZnJvbSBmaWxlICJgIH4gcGF0aCB+IGAiYAorICAgICAgKQorICAgICk7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGR1cmluZyBPcGVuU1NMIGluaXRpYWxpemF0aW9uIHRvIHNlZWQgdGhlIE9wZW5TU0wgZW50cm9weSBwb29sLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBzaW1wbHkgY2FsbGluZyBSQU5EX3BvbGwoKSwgYnV0IGl0IGNhbiBiZSBvdmVyd3JpdHRlbiBpZiBhCisgICAqIGRpZmZlcmVudCwgcGVyaGFwcyBtb3JlIHNlY3VyZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpcmVkLgorICAgKi8KKyAgdm9pZCByYW5kb21pemUoKSB7CisgICAgUkFORF9wb2xsKCk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICAqLworICBib29sIHNlcnZlclNpZGUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBzZXJ2ZXJTaWRlXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlcnZlclNpZGUoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzZXJ2ZXJTaWRlXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBhY2Nlc3MgbWFuYWdlciB0byB1c2UuCisgICAqLworICBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyKCkgQHByb3BlcnR5IHsKKyAgICBpZiAoIXNlcnZlclNpZGVfICYmICFhY2Nlc3NNYW5hZ2VyXykgeworICAgICAgYWNjZXNzTWFuYWdlcl8gPSBuZXcgVERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOworICAgIH0KKyAgICByZXR1cm4gYWNjZXNzTWFuYWdlcl87CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBhY2Nlc3NNYW5hZ2VyKFRBY2Nlc3NNYW5hZ2VyIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGFjY2Vzc01hbmFnZXJfID0gdmFsdWU7CisgIH0KKworICBTU0wqIGNyZWF0ZVNTTCgpIG91dCAocmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdCk7CisgIH0gYm9keSB7CisgICAgYXV0byByZXN1bHQgPSBTU0xfbmV3KGN0eF8pOworICAgIGVuZm9yY2UocmVzdWx0LCBnZXRTU0xFeGNlcHRpb24oIlNTTF9uZXciKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY3VzdG9tIHBhc3N3b3JkIGNhbGxiYWNrLiBJdCBtYXkgYmUgY2FsbGVkCisgICAqIG11bHRpcGxlIHRpbWVzIGF0IGFueSB0aW1lIGR1cmluZyBhIHNlc3Npb24gYXMgbmVjZXNzYXJ5LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgc2l6ZSA9IE1heGltdW0gbGVuZ3RoIG9mIHBhc3N3b3JkLCBpbmNsdWRpbmcgbnVsbCBieXRlLgorICAgKi8KKyAgc3RyaW5nIGdldFBhc3N3b3JkKGludCBzaXplKSBub3Rocm93IG91dChyZXN1bHQpIHsKKyAgICBhc3NlcnQocmVzdWx0Lmxlbmd0aCA8IHNpemUpOworICB9IGJvZHkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8qKgorICAgKiBOb3RpZmllcyBPcGVuU1NMIHRvIHVzZSBnZXRQYXNzd29yZCgpIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgcGFzc3dvcmQKKyAgICogY2FsbGJhY2sgd2l0aCBnZXRQYXNzd29yZCgpLgorICAgKi8KKyAgdm9pZCBvdmVycmlkZURlZmF1bHRQYXNzd29yZENhbGxiYWNrKCkgeworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKGN0eF8sICZwYXNzd29yZENhbGxiYWNrKTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShjdHhfLCBjYXN0KHZvaWQqKXRoaXMpOworICB9CisKKyAgU1NMX0NUWCogY3R4XzsKKworcHJpdmF0ZToKKyAgYm9vbCBzZXJ2ZXJTaWRlXzsKKyAgVEFjY2Vzc01hbmFnZXIgYWNjZXNzTWFuYWdlcl87CisKKyAgc2hhcmVkIHN0YXRpYyB0aGlzKCkgeworICAgIGluaXRNdXRleF8gPSBuZXcgTXV0ZXgoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGluaXRpYWxpemVPcGVuU1NMKCkgeworICAgIGlmIChpbml0aWFsaXplZF8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKworICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQkVGT1JFKDEsIDEpKSB7CisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKworICAgIG11dGV4ZXNfID0gbmV3IE11dGV4W0NSWVBUT19udW1fbG9ja3MoKV07CisgICAgZm9yZWFjaCAocmVmIG07IG11dGV4ZXNfKSB7CisgICAgICBtID0gbmV3IE11dGV4OworICAgIH0KKworICAgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudHJhaXRzOworICAgIC8vIEFzIHBlciB0aGUgT3BlblNTTCB0aHJlYWRzIG1hbnBhZ2UsIHRoaXMgaXNuJ3QgbmVlZGVkIG9uIFdpbmRvd3MuCisgICAgdmVyc2lvbiAoUG9zaXgpIHsKKyAgICAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmdGhyZWFkSWRDYWxsYmFjaykpOworICAgIH0KKyAgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmbG9ja2luZ0NhbGxiYWNrKSk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrQ3JlYXRlQ2FsbGJhY2spKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrTG9ja0NhbGxiYWNrKSk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0Rlc3Ryb3lDYWxsYmFjaykpOworICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgY2xlYW51cE9wZW5TU0woKSB7CisgICAgaWYgKCFpbml0aWFsaXplZF8pIHJldHVybjsKKworICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQkVGT1JFKDEsIDEpKSB7CisgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKG51bGwpOworICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sobnVsbCk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sobnVsbCk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sobnVsbCk7CisgICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgICBFUlJfZnJlZV9zdHJpbmdzKCk7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgIH0KKyAgfQorCisgIHN0YXRpYyBleHRlcm4oQykgeworICAgIHZlcnNpb24gKFBvc2l4KSB7CisgICAgICBpbXBvcnQgY29yZS5zeXMucG9zaXgucHRocmVhZCA6IHB0aHJlYWRfc2VsZjsKKyAgICAgIGNfdWxvbmcgdGhyZWFkSWRDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIGNhc3QoY191bG9uZylwdGhyZWFkX3NlbGYoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvY2tpbmdDYWxsYmFjayhpbnQgbW9kZSwgaW50IG4sIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkgeworICAgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgICBtdXRleGVzX1tuXS5sb2NrKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtdXRleGVzX1tuXS51bmxvY2soKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBDUllQVE9fZHlubG9ja192YWx1ZSogZHlubG9ja0NyZWF0ZUNhbGxiYWNrKGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkgeworICAgICAgZW51bSBzaXplID0gIF9fdHJhaXRzKGNsYXNzSW5zdGFuY2VTaXplLCBNdXRleCk7CisgICAgICBhdXRvIG1lbSA9IG1hbGxvYyhzaXplKVswIC4uIHNpemVdOworICAgICAgaWYgKCFtZW0pIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworICAgICAgR0MuYWRkUmFuZ2UobWVtLnB0ciwgc2l6ZSk7CisgICAgICBhdXRvIG11dGV4ID0gZW1wbGFjZSFNdXRleChtZW0pOworICAgICAgcmV0dXJuIGNhc3QoQ1JZUFRPX2R5bmxvY2tfdmFsdWUqKW11dGV4OworICAgIH0KKworICAgIHZvaWQgZHlubG9ja0xvY2tDYWxsYmFjayhpbnQgbW9kZSwgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGwsCisgICAgICBjb25zdChjaGFyKSogZmlsZSwgaW50IGxpbmUpCisgICAgeworICAgICAgaWYgKGwgaXMgbnVsbCkgcmV0dXJuOworICAgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgICAoY2FzdChNdXRleClsKS5sb2NrKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAoY2FzdChNdXRleClsKS51bmxvY2soKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGR5bmxvY2tEZXN0cm95Q2FsbGJhY2soQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGwsCisgICAgICBjb25zdChjaGFyKSogZmlsZSwgaW50IGxpbmUpCisgICAgeworICAgICAgR0MucmVtb3ZlUmFuZ2UobCk7CisgICAgICBkZXN0cm95KGNhc3QoTXV0ZXgpbCk7CisgICAgICBmcmVlKGwpOworICAgIH0KKworICAgIGludCBwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKSBub3Rocm93IHsKKyAgICAgIGF1dG8gY29udGV4dCA9IGNhc3QoVFNTTENvbnRleHQpIGRhdGE7CisgICAgICBhdXRvIHVzZXJQYXNzd29yZCA9IGNvbnRleHQuZ2V0UGFzc3dvcmQoc2l6ZSk7CisgICAgICBhdXRvIGxlbiA9IHVzZXJQYXNzd29yZC5sZW5ndGg7CisgICAgICBpZiAobGVuID4gc2l6ZSkgeworICAgICAgICBsZW4gPSBzaXplOworICAgICAgfQorICAgICAgcGFzc3dvcmRbMCAuLiBsZW5dID0gdXNlclBhc3N3b3JkWzAgLi4gbGVuXTsgLy8gVE9ETzogXDAgaGFuZGxpbmcgY29ycmVjdD8KKyAgICAgIHJldHVybiBjYXN0KGludClsZW47CisgICAgfQorICB9CisKKyAgc3RhdGljIF9fZ3NoYXJlZCBib29sIGluaXRpYWxpemVkXzsKKyAgc3RhdGljIF9fZ3NoYXJlZCBNdXRleCBpbml0TXV0ZXhfOworICBzdGF0aWMgX19nc2hhcmVkIE11dGV4W10gbXV0ZXhlc187CisgIHN0YXRpYyBfX2dzaGFyZWQgdWludCBjb3VudF87Cit9CisKKy8qKgorICogRGVjaWRlcyB3aGV0aGVyIGEgcmVtb3RlIGhvc3QgaXMgbGVnaXRpbWF0ZSBvciBub3QuCisgKgorICogSXQgaXMgdXN1YWxseSBzZXQgYXQgYSBUU1NMQ29udGV4dCwgd2hpY2ggdGhlbiBwYXNzZXMgaXQgdG8gYWxsIHRoZSBjcmVhdGVkCisgKiBUU1NMU29ja2V0cy4KKyAqLworY2xhc3MgVEFjY2Vzc01hbmFnZXIgeworICAvLy8KKyAgZW51bSBEZWNpc2lvbiB7CisgICAgREVOWSA9IC0xLCAvLy8gRGVueSBhY2Nlc3MuCisgICAgU0tJUCA9ICAwLCAvLy8gQ2Fubm90IGRlY2lkZSwgbW92ZSBvbiB0byBuZXh0IGNoZWNrIChkZW55IGlmIGxhc3QpLgorICAgIEFMTE9XID0gMSAgLy8vIEFsbG93IGFjY2Vzcy4KKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QgYmFzZWQgb24gaXRzCisgICAqIElQIGFkZHJlc3MuCisgICAqCisgICAqIENhbGxlZCBvbmNlIGFmdGVyIFNTTCBoYW5kc2hha2UgaXMgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBhbmQgYmVmb3JlIHBlZXIKKyAgICogY2VydGlmaWNhdGUgaXMgZXhhbWluZWQuCisgICAqCisgICAqIElmIGEgdmFsaWQgZGVjaXNpb24gKEFMTE9XIG9yIERFTlkpIGlzIHJldHVybmVkLCB0aGUgcGVlciBjZXJ0aWZpY2F0ZQorICAgKiB3aWxsIG5vdCBiZSB2ZXJpZmllZC4KKyAgICovCisgIERlY2lzaW9uIHZlcmlmeShBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gRGVjaXNpb24uREVOWTsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QgYmFzZWQgb24gYQorICAgKiBuYW1lIGZyb20gaXRzIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBDYWxsZWQgZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICogcGVlcidzIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgaG9zdCA9IFRoZSBhY3R1YWwgaG9zdCBuYW1lIHN0cmluZyBmcm9tIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICogICBjZXJ0SG9zdCA9IEEgaG9zdCBuYW1lIHN0cmluZyBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICovCisgIERlY2lzaW9uIHZlcmlmeShzdHJpbmcgaG9zdCwgY29uc3QoY2hhcilbXSBjZXJ0SG9zdCkgeworICAgIHJldHVybiBEZWNpc2lvbi5ERU5ZOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBhIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdCBiYXNlZCBvbiBhbiBJUAorICAgKiBhZGRyZXNzIGZyb20gaXRzIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBDYWxsZWQgZXZlcnkgdGltZSBhbiBJUCBzdWJqZWN0QWx0TmFtZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgcGVlcidzCisgICAqIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYWRkcmVzcyA9IFRoZSBhY3R1YWwgYWRkcmVzcyBmcm9tIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICogICBjZXJ0SG9zdCA9IEEgaG9zdCBuYW1lIHN0cmluZyBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgICovCisgIERlY2lzaW9uIHZlcmlmeShBZGRyZXNzIGFkZHJlc3MsIHVieXRlW10gY2VydEFkZHJlc3MpIHsKKyAgICByZXR1cm4gRGVjaXNpb24uREVOWTsKKyAgfQorfQorCisvKioKKyAqIERlZmF1bHQgYWNjZXNzIG1hbmFnZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoIGp1c3QgY2hlY2tzIHRoZSBob3N0IG5hbWUKKyAqIHJlc3AuIElQIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gYWdhaW5zdCB0aGUgY2VydGlmaWNhdGUuCisgKi8KK2NsYXNzIFREZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlciA6IFRBY2Nlc3NNYW5hZ2VyIHsKKyAgb3ZlcnJpZGUgRGVjaXNpb24gdmVyaWZ5KEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiBEZWNpc2lvbi5TS0lQOworICB9CisKKyAgb3ZlcnJpZGUgRGVjaXNpb24gdmVyaWZ5KHN0cmluZyBob3N0LCBjb25zdChjaGFyKVtdIGNlcnRIb3N0KSB7CisgICAgaWYgKGhvc3QuZW1wdHkgfHwgY2VydEhvc3QuZW1wdHkpIHsKKyAgICAgIHJldHVybiBEZWNpc2lvbi5TS0lQOworICAgIH0KKyAgICByZXR1cm4gKG1hdGNoTmFtZShob3N0LCBjZXJ0SG9zdCkgPyBEZWNpc2lvbi5BTExPVyA6IERlY2lzaW9uLlNLSVApOworICB9CisKKyAgb3ZlcnJpZGUgRGVjaXNpb24gdmVyaWZ5KEFkZHJlc3MgYWRkcmVzcywgdWJ5dGVbXSBjZXJ0QWRkcmVzcykgeworICAgIGJvb2wgbWF0Y2g7CisgICAgaWYgKGNlcnRBZGRyZXNzLmxlbmd0aCA9PSA0KSB7CisgICAgICBpZiAoYXV0byBpYSA9IGNhc3QoSW50ZXJuZXRBZGRyZXNzKWFkZHJlc3MpIHsKKyAgICAgICAgbWF0Y2ggPSAoKGNhc3QodWJ5dGUqKWlhLmFkZHIoKSlbMCAuLiA0XSA9PSBjZXJ0QWRkcmVzc1tdKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNlcnRBZGRyZXNzLmxlbmd0aCA9PSAxNikgeworICAgICAgaWYgKGF1dG8gaWEgPSBjYXN0KEludGVybmV0NkFkZHJlc3MpYWRkcmVzcykgeworICAgICAgICBtYXRjaCA9IChpYS5hZGRyKCkgPT0gY2VydEFkZHJlc3NbXSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAobWF0Y2ggPyBEZWNpc2lvbi5BTExPVyA6IERlY2lzaW9uLlNLSVApOworICB9Cit9CisKK3ByaXZhdGUgeworICAvKioKKyAgICogTWF0Y2hlcyBhIG5hbWUgd2l0aCBhIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIG1heSBpbmNsdWRlIHdpbGRjYXJkLiBBIHNpbmdsZQorICAgKiB3aWxkY2FyZCAiKiIgY2FuIG1hdGNoIHVwIHRvIG9uZSBjb21wb25lbnQgaW4gdGhlIGRvbWFpbiBuYW1lLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgaG9zdCA9IEhvc3QgbmFtZSB0byBtYXRjaCwgdHlwaWNhbGx5IHRoZSBTU0wgcmVtb3RlIHBlZXIuCisgICAqICAgcGF0dGVybiA9IEhvc3QgbmFtZSBwYXR0ZXJuLCB0eXBpY2FsbHkgZnJvbSB0aGUgU1NMIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBSZXR1cm5zOiB0cnVlIGlmIGhvc3QgbWF0Y2hlcyBwYXR0ZXJuLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICBib29sIG1hdGNoTmFtZShjb25zdChjaGFyKVtdIGhvc3QsIGNvbnN0KGNoYXIpW10gcGF0dGVybikgeworICAgIHdoaWxlICghaG9zdC5lbXB0eSAmJiAhcGF0dGVybi5lbXB0eSkgeworICAgICAgaWYgKHRvVXBwZXIocGF0dGVybi5mcm9udCkgPT0gdG9VcHBlcihob3N0LmZyb250KSkgeworICAgICAgICBob3N0LnBvcEZyb250OworICAgICAgICBwYXR0ZXJuLnBvcEZyb250OworICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmZyb250ID09ICcqJykgeworICAgICAgICB3aGlsZSAoIWhvc3QuZW1wdHkgJiYgaG9zdC5mcm9udCAhPSAnLicpIHsKKyAgICAgICAgICBob3N0LnBvcEZyb250OworICAgICAgICB9CisgICAgICAgIHBhdHRlcm4ucG9wRnJvbnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChob3N0LmVtcHR5ICYmIHBhdHRlcm4uZW1wdHkpOworICB9CisKKyAgdW5pdHRlc3QgeworICAgIGVuZm9yY2UobWF0Y2hOYW1lKCJ0aHJpZnQuYXBhY2hlLm9yZyIsICIqLmFwYWNoZS5vcmciKSk7CisgICAgZW5mb3JjZSghbWF0Y2hOYW1lKCJ0aHJpZnQuYXBhY2hlLm9yZyIsICJhcGFjaGUub3JnIikpOworICAgIGVuZm9yY2UobWF0Y2hOYW1lKCJ0aHJpZnQuYXBhY2hlLm9yZyIsICJ0aHJpZnQuKi4qIikpOworICAgIGVuZm9yY2UobWF0Y2hOYW1lKCIiLCAiIikpOworICAgIGVuZm9yY2UoIW1hdGNoTmFtZSgiIiwgIioiKSk7CisgIH0KK30KKworLyoqCisgKiBTU0wtbGV2ZWwgZXhjZXB0aW9uLgorICovCitjbGFzcyBUU1NMRXhjZXB0aW9uIDogVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuSU5URVJOQUxfRVJST1IsIGZpbGUsIGxpbmUsIG5leHQpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC96bGliLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC96bGliLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NmY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3psaWIuZApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC56bGliOworCitpbXBvcnQgY29yZS5iaXRvcCA6IGJzd2FwOworaW1wb3J0IGV0Yy5jLnpsaWI7CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiB6bGliIHRyYW5zcG9ydC4gQ29tcHJlc3NlcyAoZGVmbGF0ZXMpIGRhdGEgYmVmb3JlIHdyaXRpbmcgaXQgdG8gdGhlCisgKiB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgYW5kIGRlY29tcHJlc3NlcyAoaW5mbGF0ZXMpIGl0IGFmdGVyIHJlYWRpbmcuCisgKi8KK2ZpbmFsIGNsYXNzIFRabGliVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICAvLyBUaGVzZSBkZWZhdWx0cyBoYXZlIHlldCB0byBiZSBvcHRpbWl6ZWQuCisgIGVudW0gREVGQVVMVF9VUkJVRl9TSVpFID0gMTI4OworICBlbnVtIERFRkFVTFRfQ1JCVUZfU0laRSA9IDEwMjQ7CisgIGVudW0gREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OworICBlbnVtIERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgemxpYiB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICogICB1cmJ1ZlNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIHJlYWRpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgICogICBjcmJ1ZlNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCByZWFkaW5nIGJ1ZmZlciwgaW4gYnl0ZXMuCisgICAqICAgdXdidWZTaXplID0gVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCB3cml0aW5nIGJ1ZmZlciwgaW4gYnl0ZXMuCisgICAqICAgY3didWZTaXplID0gVGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgd3JpdGluZyBidWZmZXIsIGluIGJ5dGVzLgorICAgKi8KKyAgdGhpcygKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICBzaXplX3QgdXJidWZTaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAorICAgIHNpemVfdCBjcmJ1ZlNpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCisgICAgc2l6ZV90IHV3YnVmU2l6ZSA9IERFRkFVTFRfVVdCVUZfU0laRSwKKyAgICBzaXplX3QgY3didWZTaXplID0gREVGQVVMVF9DV0JVRl9TSVpFCisgICkgeworICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisKKyAgICBlbmZvcmNlKHV3YnVmU2l6ZSA+PSBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCAiIH4KKyAgICAgIHRvIXN0cmluZyhNSU5fRElSRUNUX0RFRkxBVEVfU0laRSkgfiAiYnl0ZXMgaW4gc2l6ZS4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisKKyAgICB1cmJ1Zl8gPSBuZXcgdWJ5dGVbdXJidWZTaXplXTsKKyAgICBjcmJ1Zl8gPSBuZXcgdWJ5dGVbY3JidWZTaXplXTsKKyAgICB1d2J1Zl8gPSBuZXcgdWJ5dGVbdXdidWZTaXplXTsKKyAgICBjd2J1Zl8gPSBuZXcgdWJ5dGVbY3didWZTaXplXTsKKworICAgIHJzdHJlYW1fID0gbmV3IHpfc3RyZWFtOworICAgIHJzdHJlYW1fLm5leHRfaW4gPSBjcmJ1Zl8ucHRyOworICAgIHJzdHJlYW1fLmF2YWlsX2luICA9IDA7CisgICAgcnN0cmVhbV8ubmV4dF9vdXQgPSB1cmJ1Zl8ucHRyOworICAgIHJzdHJlYW1fLmF2YWlsX291dCA9IHRvIXVpbnQodXJidWZfLmxlbmd0aCk7CisKKyAgICB3c3RyZWFtXyA9IG5ldyB6X3N0cmVhbTsKKyAgICB3c3RyZWFtXy5uZXh0X2luID0gdXdidWZfLnB0cjsKKyAgICB3c3RyZWFtXy5hdmFpbF9pbiA9IDA7CisgICAgd3N0cmVhbV8ubmV4dF9vdXQgPSBjd2J1Zl8ucHRyOworICAgIHdzdHJlYW1fLmF2YWlsX291dCA9IHRvIXVpbnQoY3JidWZfLmxlbmd0aCk7CisKKyAgICB6bGliRW5mb3JjZShpbmZsYXRlSW5pdChyc3RyZWFtXyksIHJzdHJlYW1fKTsKKyAgICBzY29wZSAoZmFpbHVyZSkgeworICAgICAgemxpYkxvZ0Vycm9yKGluZmxhdGVFbmQocnN0cmVhbV8pLCByc3RyZWFtXyk7CisgICAgfQorCisgICAgemxpYkVuZm9yY2UoZGVmbGF0ZUluaXQod3N0cmVhbV8sIFpfREVGQVVMVF9DT01QUkVTU0lPTiksIHdzdHJlYW1fKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIHpsaWJMb2dFcnJvcihpbmZsYXRlRW5kKHJzdHJlYW1fKSwgcnN0cmVhbV8pOworCisgICAgYXV0byByZXN1bHQgPSBkZWZsYXRlRW5kKHdzdHJlYW1fKTsKKyAgICAvLyBaX0RBVEFfRVJST1IgbWF5IGluZGljYXRlIHVuZmx1c2hlZCBkYXRhLCBzbyBqdXN0IGlnbm9yZSBpdC4KKyAgICBpZiAocmVzdWx0ICE9IFpfREFUQV9FUlJPUikgeworICAgICAgemxpYkxvZ0Vycm9yKHJlc3VsdCwgd3N0cmVhbV8pOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIHRyYW5zcG9ydC4KKyAgICovCisgIFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF87CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJlYWRBdmFpbCA+IDAgfHwgdHJhbnNwb3J0Xy5pc09wZW47CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHJlYWRBdmFpbCA+IDAgfHwgdHJhbnNwb3J0Xy5wZWVrKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgLy8gVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBzdWdnZXN0cyB0byBza2lwIHVyYnVmIG9uIGJpZyByZWFkcyBpbiBmdXR1cmUKKyAgICAvLyB2ZXJzaW9ucywgd2Ugd291bGQgYmVuZWZpdCBmcm9tIGl0IGFzIHdlbGwuCisgICAgYXV0byBvcmlnTGVuID0gYnVmLmxlbmd0aDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBnaXZlID0gbWluKHJlYWRBdmFpbCwgYnVmLmxlbmd0aCk7CisKKyAgICAgIC8vIElmIHN0ZC5yYW5nZS5wdXQgd2FzIG9wdGltaXplZCBmb3Igc2xpY2FibGUgcmFuZ2VzLCBpdCBjb3VsZCBiZSB1c2VkCisgICAgICAvLyBoZXJlIGFzIHdlbGwuCisgICAgICBidWZbMCAuLiBnaXZlXSA9IHVyYnVmX1t1cnBvc18gLi4gdXJwb3NfICsgZ2l2ZV07CisgICAgICBidWYgPSBidWZbZ2l2ZSAuLiAkXTsKKyAgICAgIHVycG9zXyArPSBnaXZlOworCisgICAgICBhdXRvIG5lZWQgPSBidWYubGVuZ3RoOworICAgICAgaWYgKG5lZWQgPT0gMCkgeworICAgICAgICAvLyBXZSBjb3VsZCBtYW5hZ2UgdG8gZ2V0IHRoZSBhbGwgdGhlIGRhdGEgcmVxdWVzdGVkLgorICAgICAgICByZXR1cm4gb3JpZ0xlbjsKKyAgICAgIH0KKworICAgICAgaWYgKGlucHV0RW5kZWRfIHx8IChuZWVkIDwgb3JpZ0xlbiAmJiByc3RyZWFtXy5hdmFpbF9pbiA9PSAwKSkgeworICAgICAgICAvLyBXZSBkaWRuJ3QgZmlsbCBidWYgY29tcGxldGVseSwgYnV0IHRoZXJlIGlzIG5vIG1vcmUgZGF0YSBhdmFpbGFibGUuCisgICAgICAgIHJldHVybiBvcmlnTGVuIC0gbmVlZDsKKyAgICAgIH0KKworICAgICAgLy8gUmVmaWxsIG91ciBidWZmZXIgYnkgcmVhZGluZyBtb3JlIGRhdGEgdGhyb3VnaCB6bGliLgorICAgICAgcnN0cmVhbV8ubmV4dF9vdXQgPSB1cmJ1Zl8ucHRyOworICAgICAgcnN0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludCh1cmJ1Zl8ubGVuZ3RoKTsKKyAgICAgIHVycG9zXyA9IDA7CisKKyAgICAgIGlmICghcmVhZEZyb21abGliKCkpIHsKKyAgICAgICAgLy8gQ291bGRuJ3QgZ2V0IG1vcmUgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgICAgcmV0dXJuIG9yaWdMZW4gLSBuZWVkOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKCFvdXRwdXRGaW5pc2hlZF8sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIndyaXRlKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisKKyAgICBhdXRvIGxlbiA9IGJ1Zi5sZW5ndGg7CisgICAgaWYgKGxlbiA+IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7CisgICAgICBmbHVzaFRvWmxpYih1d2J1Zl9bMCAuLiB1d3Bvc19dLCBaX05PX0ZMVVNIKTsKKyAgICAgIHV3cG9zXyA9IDA7CisgICAgICBmbHVzaFRvWmxpYihidWYsIFpfTk9fRkxVU0gpOworICAgIH0gZWxzZSBpZiAobGVuID4gMCkgeworICAgICAgaWYgKHV3YnVmXy5sZW5ndGggLSB1d3Bvc18gPCBsZW4pIHsKKyAgICAgICAgZmx1c2hUb1psaWIodXdidWZfWzAgLi4gdXdwb3NfXSwgWl9OT19GTFVTSCk7CisgICAgICAgIHV3cG9zXyA9IDA7CisgICAgICB9CisgICAgICB1d2J1Zl9bdXdwb3NfIC4uIHV3cG9zXyArIGxlbl0gPSBidWZbXTsKKyAgICAgIHV3cG9zXyArPSBsZW47CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBlbmZvcmNlKCFvdXRwdXRGaW5pc2hlZF8sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisKKyAgICBmbHVzaFRvVHJhbnNwb3J0KFpfU1lOQ19GTFVTSCk7CisgIH0KKworICBvdmVycmlkZSBjb25zdCh1Ynl0ZSlbXSBib3Jyb3codWJ5dGUqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgIGlmIChsZW4gPD0gcmVhZEF2YWlsKSB7CisgICAgICByZXR1cm4gdXJidWZfW3VycG9zXyAuLiAkXTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIGVuZm9yY2UocmVhZEF2YWlsID49IGxlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiY29uc3VtZSgpIGRpZCBub3QgZm9sbG93IGEgYm9ycm93KCkuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisgICAgdXJwb3NfICs9IGxlbjsKKyAgfQorCisgIC8qKgorICAgKiBGaW5hbGl6ZSB0aGUgemxpYiBzdHJlYW0uCisgICAqCisgICAqIFRoaXMgY2F1c2VzIHpsaWIgdG8gZmx1c2ggYW55IHBlbmRpbmcgd3JpdGUgZGF0YSBhbmQgd3JpdGUgZW5kLW9mLXN0cmVhbQorICAgKiBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBjaGVja3N1bS4gIE9uY2UgZmluaXNoKCkgaGFzIGJlZW4gY2FsbGVkLCBubworICAgKiBuZXcgZGF0YSBjYW4gYmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgorICAgKi8KKyAgdm9pZCBmaW5pc2goKSB7CisgICAgZW5mb3JjZSghb3V0cHV0RmluaXNoZWRfLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJmbHVzaCgpIGNhbGxlZCBvbiBhbHJlYWR5IGZpbmlzaGVkIFRabGliVHJhbnNwb3J0IiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworICAgIGZsdXNoVG9UcmFuc3BvcnQoWl9GSU5JU0gpOworICB9CisKKyAgLyoqCisgICAqIFZlcmlmeSB0aGUgY2hlY2tzdW0gYXQgdGhlIGVuZCBvZiB0aGUgemxpYiBzdHJlYW0gKGJ5IGZpbmlzaCgpKS4KKyAgICoKKyAgICogTWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHJlYWQuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIHRoZSBjaGVja3N1bSBpcyBjb3JydXB0ZWQgb3IgdGhlcmUgaXMKKyAgICogICBzdGlsbCB1bnJlYWQgZGF0YSBsZWZ0LgorICAgKi8KKyAgdm9pZCB2ZXJpZnlDaGVja3N1bSgpIHsKKyAgICAvLyBJZiB6bGliIGhhcyBhbHJlYWR5IHJlcG9ydGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgdGhlIGNoZWNrc3VtIGhhcworICAgIC8vIGJlZW4gdmVyaWZpZWQsIG5vLgorICAgIGlmIChpbnB1dEVuZGVkXykgcmV0dXJuOworCisgICAgZW5mb3JjZSghcmVhZEF2YWlsLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mIHpsaWIgc3RyZWFtIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSkpOworCisgICAgcnN0cmVhbV8ubmV4dF9vdXQgPSB1cmJ1Zl8ucHRyOworICAgIHJzdHJlYW1fLmF2YWlsX291dCA9IHRvIXVpbnQodXJidWZfLmxlbmd0aCk7CisgICAgdXJwb3NfID0gMDsKKworICAgIC8vIHJlYWRGcm9tWmxpYigpIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjaGVja3N1bSBpcyBiYWQuCisgICAgZW5mb3JjZShyZWFkRnJvbVpsaWIoKSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiY2hlY2tzdW0gbm90IGF2YWlsYWJsZSB5ZXQgaW4gdmVyaWZ5Q2hlY2tzdW0oKSIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpKTsKKworICAgIGVuZm9yY2UoaW5wdXRFbmRlZF8sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgemxpYiBzdHJlYW0iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKSk7CisKKyAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbmQgdGh1cyB6bGliIGhhcworICAgIC8vIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZCB0aGUgY2hlY2tzdW0uCisgIH0KKworcHJpdmF0ZToKKyAgc2l6ZV90IHJlYWRBdmFpbCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHVyYnVmXy5sZW5ndGggLSByc3RyZWFtXy5hdmFpbF9vdXQgLSB1cnBvc187CisgIH0KKworICBib29sIHJlYWRGcm9tWmxpYigpIHsKKyAgICBhc3NlcnQoIWlucHV0RW5kZWRfKTsKKworICAgIGlmIChyc3RyZWFtXy5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAvLyB6bGliIGhhcyB1c2VkIHVwIGFsbCB0aGUgY29tcHJlc3NlZCBkYXRhIHdlIHByb3ZpZGVkIGluIGNyYnVmLCByZWFkCisgICAgICAvLyBzb21lIG1vcmUgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICBhdXRvIGdvdCA9IHRyYW5zcG9ydF8ucmVhZChjcmJ1Zl8pOworICAgICAgaWYgKGdvdCA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICByc3RyZWFtXy5uZXh0X2luID0gY3JidWZfLnB0cjsKKyAgICAgIHJzdHJlYW1fLmF2YWlsX2luID0gdG8hdWludChnb3QpOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgc29tZSBjb21wcmVzc2VkIGRhdGEgbm93LCB1bmNvbXByZXNzIGl0LgorICAgIGF1dG8gemxpYl9yZXN1bHQgPSBpbmZsYXRlKHJzdHJlYW1fLCBaX1NZTkNfRkxVU0gpOworICAgIGlmICh6bGliX3Jlc3VsdCA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgIGlucHV0RW5kZWRfID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgemxpYkVuZm9yY2UoemxpYl9yZXN1bHQsIHJzdHJlYW1fKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgZmx1c2hUb1RyYW5zcG9ydChpbnQgdHlwZSkgIHsKKyAgICAvLyBDb21wcmVzcyByZW1haW5pbmcgZGF0YSBpbiB1d2J1Zl8gdG8gY3didWZfLgorICAgIGZsdXNoVG9abGliKHV3YnVmX1swIC4uIHV3cG9zX10sIHR5cGUpOworICAgIHV3cG9zXyA9IDA7CisKKyAgICAvLyBXcml0ZSBhbGwgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSB0cmFuc3BvcnQuCisgICAgdHJhbnNwb3J0Xy53cml0ZShjd2J1Zl9bMCAuLiAkIC0gd3N0cmVhbV8uYXZhaWxfb3V0XSk7CisgICAgd3N0cmVhbV8ubmV4dF9vdXQgPSBjd2J1Zl8ucHRyOworICAgIHdzdHJlYW1fLmF2YWlsX291dCA9IHRvIXVpbnQoY3didWZfLmxlbmd0aCk7CisKKyAgICAvLyBGbHVzaCB0aGUgdHJhbnNwb3J0LgorICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKyAgfQorCisgIHZvaWQgZmx1c2hUb1psaWIoaW4gdWJ5dGVbXSBidWYsIGludCB0eXBlKSB7CisgICAgd3N0cmVhbV8ubmV4dF9pbiA9IGNhc3QodWJ5dGUqKWJ1Zi5wdHI7IC8vIHpsaWIgb25seSByZWFkcywgY2FzdCBpcyBzYWZlLgorICAgIHdzdHJlYW1fLmF2YWlsX2luID0gdG8hdWludChidWYubGVuZ3RoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAodHlwZSA9PSBaX05PX0ZMVVNIICYmIHdzdHJlYW1fLmF2YWlsX2luID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICh3c3RyZWFtXy5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAvLyBjd2J1ZiBoYXMgYmVlbiBleGhhdXN0ZWQgYnkgemxpYiwgZmx1c2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgICB0cmFuc3BvcnRfLndyaXRlKGN3YnVmXyk7CisgICAgICAgIHdzdHJlYW1fLm5leHRfb3V0ID0gY3didWZfLnB0cjsKKyAgICAgICAgd3N0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludChjd2J1Zl8ubGVuZ3RoKTsKKyAgICAgIH0KKworICAgICAgYXV0byB6bGliX3Jlc3VsdCA9IGRlZmxhdGUod3N0cmVhbV8sIHR5cGUpOworCisgICAgICBpZiAodHlwZSA9PSBaX0ZJTklTSCAmJiB6bGliX3Jlc3VsdCA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgYXNzZXJ0KHdzdHJlYW1fLmF2YWlsX2luID09IDApOworICAgICAgICBvdXRwdXRGaW5pc2hlZF8gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgemxpYkVuZm9yY2UoemxpYl9yZXN1bHQsIHdzdHJlYW1fKTsKKworICAgICAgaWYgKCh0eXBlID09IFpfU1lOQ19GTFVTSCB8fCB0eXBlID09IFpfRlVMTF9GTFVTSCkgJiYKKyAgICAgICAgICB3c3RyZWFtXy5hdmFpbF9pbiA9PSAwICYmIHdzdHJlYW1fLmF2YWlsX291dCAhPSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHpsaWJFbmZvcmNlKGludCBzdGF0dXMsIHpfc3RyZWFtKiBzdHJlYW0pIHsKKyAgICBpZiAoc3RhdHVzICE9IFpfT0spIHsKKyAgICAgIHRocm93IG5ldyBUWmxpYkV4Y2VwdGlvbihzdGF0dXMsIHN0cmVhbS5tc2cpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHpsaWJMb2dFcnJvcihpbnQgc3RhdHVzLCB6X3N0cmVhbSogc3RyZWFtKSB7CisgICAgaWYgKHN0YXR1cyAhPSBaX09LKSB7CisgICAgICBsb2dFcnJvcigiVFpsaWJUcmFuc3BvcnQ6IHpsaWIgZmFpbHVyZSBpbiBkZXN0cnVjdG9yOiAlcyIsCisgICAgICAgIFRabGliRXhjZXB0aW9uLmVycm9yTWVzc2FnZShzdGF0dXMsIHN0cmVhbS5tc2cpKTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZXMgc21hbGxlciB0aGFuIHRoaXMgYXJlIGJ1ZmZlcmVkIHVwIChkdWUgdG8gemxpYiBoYW5kbGluZyBvdmVyaGVhZCkuCisgIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCisgIGVudW0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUgPSAzMjsKKworICBUVHJhbnNwb3J0IHRyYW5zcG9ydF87CisgIHpfc3RyZWFtKiByc3RyZWFtXzsKKyAgel9zdHJlYW0qIHdzdHJlYW1fOworCisgIC8vLyBXaGV0aGVyIHpsaWIgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICBib29sIGlucHV0RW5kZWRfOworCisgIC8vLyBXaGV0aGVyIHRoZSBvdXRwdXQgc3RyZWFtIHdhcyBhbHJlYWR5IGZpbmlzaCgpZWQuCisgIGJvb2wgb3V0cHV0RmluaXNoZWRfOworCisgIC8vLyBDb21wcmVzc2VkIGlucHV0IGRhdGEgYnVmZmVyLgorICB1Ynl0ZVtdIGNyYnVmXzsKKworICAvLy8gVW5jb21wcmVzc2VkIGlucHV0IGRhdGEgYnVmZmVyLgorICB1Ynl0ZVtdIHVyYnVmXzsKKyAgc2l6ZV90IHVycG9zXzsKKworICAvLy8gVW5jb21wcmVzc2VkIG91dHB1dCBkYXRhIGJ1ZmZlciAod2hlcmUgc21hbGwgd3JpdGVzIGFyZSBhY2N1bXVsYXRlZAorICAvLy8gYmVmb3JlIGhhbmRpbmcgb3ZlciB0byB6bGliKS4KKyAgdWJ5dGVbXSB1d2J1Zl87CisgIHNpemVfdCB1d3Bvc187CisKKyAgLy8vIENvbXByZXNzZWQgb3V0cHV0IGRhdGEgYnVmZmVyIChmaWxsZWQgYnkgemxpYiwgd2UgZmx1c2ggaXQgdG8gdGhlCisgIC8vLyB1bmRlcmx5aW5nIHRyYW5zcG9ydCkuCisgIHVieXRlW10gY3didWZfOworfQorCisvKioKKyAqIFdyYXBzIGdpdmVuIHRyYW5zcG9ydHMgaW50byBUWmxpYlRyYW5zcG9ydHMuCisgKi8KK2FsaWFzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeSFUWmxpYlRyYW5zcG9ydCBUWmxpYlRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qKgorICogQW4gSU5URVJOQUxfRVJST1ItdHlwZSBUVHJhbnNwb3J0RXhjZXB0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXJyb3IKKyAqIHNpZ25hbGVkIGJ5IHpsaWIuCisgKi8KK2NsYXNzIFRabGliRXhjZXB0aW9uIDogVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgIHRoaXMoaW50IHN0YXR1c0NvZGUsIGNvbnN0KGNoYXIpKiBtc2cpIHsKKyAgICBzdXBlcihlcnJvck1lc3NhZ2Uoc3RhdHVzQ29kZSwgbXNnKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLklOVEVSTkFMX0VSUk9SKTsKKyAgICB6bGliU3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7CisgICAgemxpYk1zZyA9IG1zZyA/IHRvIXN0cmluZyhtc2cpIDogIihudWxsKSI7CisgIH0KKworICBpbnQgemxpYlN0YXR1c0NvZGU7CisgIHN0cmluZyB6bGliTXNnOworCisgIHN0YXRpYyBzdHJpbmcgZXJyb3JNZXNzYWdlKGludCBzdGF0dXNDb2RlLCBjb25zdChjaGFyKSogbXNnKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9ICJ6bGliIGVycm9yOiAiOworCisgICAgaWYgKG1zZykgeworICAgICAgcmVzdWx0IH49IHRvIXN0cmluZyhtc2cpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgfj0gIihubyBtZXNzYWdlKSI7CisgICAgfQorCisgICAgcmVzdWx0IH49ICIgKHN0YXR1cyBjb2RlID0gIiB+IHRvIXN0cmluZyhzdGF0dXNDb2RlKSB+ICIpIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uIDogY29sbGVjdEV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworfQorCisvLyBNYWtlIHN1cmUgYmFzaWMgcmVhZGluZy93cml0aW5nIHdvcmtzLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKworICBpbW11dGFibGUgdWJ5dGVbXSBkYXRhID0gWzEsIDIsIDMsIDQsIDVdOworICB6bGliLndyaXRlKGRhdGEpOworICB6bGliLmZpbmlzaCgpOworCisgIGF1dG8gcmVzdWx0ID0gbmV3IHVieXRlW2RhdGEubGVuZ3RoXTsKKyAgemxpYi5yZWFkQWxsKHJlc3VsdCk7CisgIGVuZm9yY2UoZGF0YSA9PSByZXN1bHQpOworICB6bGliLnZlcmlmeUNoZWNrc3VtKCk7Cit9CisKKy8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBkYXRhIGlzIHdyaXR0ZW4gaWYgd3JpdGUoKSBpcyBuZXZlciBjYWxsZWQuCit1bml0dGVzdCB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIHsKKyAgICBzY29wZSB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1Zik7CisgIH0KKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKS5sZW5ndGggPT0gMCk7Cit9CisKKy8vIE1ha2Ugc3VyZSBjYWxsaW5nIHdyaXRlKCkvZmx1c2goKS9maW5pc2goKSBhZ2FpbiBhZnRlciBmaW5pc2goKSB0aHJvd3MuCit1bml0dGVzdCB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYpOworCisgIHpsaWIud3JpdGUoWzEsIDIsIDMsIDQsIDVdKTsKKyAgemxpYi5maW5pc2goKTsKKworICBhdXRvIGV4ID0gY29sbGVjdEV4Y2VwdGlvbiFUVHJhbnNwb3J0RXhjZXB0aW9uKHpsaWIud3JpdGUoWzZdKSk7CisgIGVuZm9yY2UoZXggJiYgZXgudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpOworCisgIGV4ID0gY29sbGVjdEV4Y2VwdGlvbiFUVHJhbnNwb3J0RXhjZXB0aW9uKHpsaWIuZmx1c2goKSk7CisgIGVuZm9yY2UoZXggJiYgZXgudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpOworCisgIGV4ID0gY29sbGVjdEV4Y2VwdGlvbiFUVHJhbnNwb3J0RXhjZXB0aW9uKHpsaWIuZmluaXNoKCkpOworICBlbmZvcmNlKGV4ICYmIGV4LnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKTsKK30KKworLy8gTWFrZSBzdXJlIHZlcmlmeWluZyB0aGUgY2hlY2tzdW0gd29ya3MgZXZlbiBpZiBpdCByZXF1aXJlcyBzdGFydGluZyBhIG5ldworLy8gcmVhZGluZyBidWZmZXIgYWZ0ZXIgcmVhZGluZyB0aGUgcGF5bG9hZCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1Zik7CisKKyAgaW1tdXRhYmxlIHVieXRlW10gZGF0YSA9IFsxLCAyLCAzLCA0LCA1XTsKKyAgemxpYi53cml0ZShkYXRhKTsKKyAgemxpYi5maW5pc2goKTsKKworICB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1ZiwgVFpsaWJUcmFuc3BvcnQuREVGQVVMVF9VUkJVRl9TSVpFLAorICAgIGJ1Zi5nZXRDb250ZW50cygpLmxlbmd0aCAtIDEpOyAvLyBUaGUgbGFzdCBieXRlIGJlbG9uZ3MgdG8gdGhlIGNoZWNrc3VtLgorCisgIGF1dG8gcmVzdWx0ID0gbmV3IHVieXRlW2RhdGEubGVuZ3RoXTsKKyAgemxpYi5yZWFkQWxsKHJlc3VsdCk7CisgIGVuZm9yY2UoZGF0YSA9PSByZXN1bHQpOworCisgIHpsaWIudmVyaWZ5Q2hlY2tzdW0oKTsKK30KKworLy8gTWFrZSBzdXJlIHZlcmlmeUNoZWNrc3VtKCkgdGhyb3dzIGlmIHdlIG1lc3NlZCB3aXRoIHRoZSBjaGVja3N1bS4KK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5zdGRpbzsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQucmFuZ2U7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1Zik7CisKKyAgaW1tdXRhYmxlIHVieXRlW10gZGF0YSA9IFsxLCAyLCAzLCA0LCA1XTsKKyAgemxpYi53cml0ZShkYXRhKTsKKyAgemxpYi5maW5pc2goKTsKKworICB2b2lkIHRlc3RDb3JydXB0ZWQoY29uc3QodWJ5dGUpW10gY29ycnVwdGVkRGF0YSkgeworICAgIGF1dG8gcmVhZGVyID0gbmV3IFRabGliVHJhbnNwb3J0KHRJbnB1dFJhbmdlVHJhbnNwb3J0KGNvcnJ1cHRlZERhdGEpKTsKKyAgICBhdXRvIHJlc3VsdCA9IG5ldyB1Ynl0ZVtkYXRhLmxlbmd0aF07CisgICAgdHJ5IHsKKyAgICAgIHJlYWRlci5yZWFkQWxsKHJlc3VsdCk7CisKKyAgICAgIC8vIElmIGl0IGRvZXMgcmVhZCB3aXRob3V0IGNvbXBsYWluaW5nLCB0aGUgcmVzdWx0IHNob3VsZCBiZSBjb3JyZWN0LgorICAgICAgZW5mb3JjZShyZXN1bHQgPT0gZGF0YSk7CisgICAgfSBjYXRjaCAoVFpsaWJFeGNlcHRpb24gZSkge30KKworICAgIGF1dG8gZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24ocmVhZGVyLnZlcmlmeUNoZWNrc3VtKCkpOworICAgIGVuZm9yY2UoZXggJiYgZXgudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICB9CisKKyAgdGVzdENvcnJ1cHRlZChidWYuZ2V0Q29udGVudHMoKVswIC4uICQgLSAxXSk7CisKKyAgYXV0byBtb2RpZmllZCA9IGJ1Zi5nZXRDb250ZW50cygpLmR1cDsKKyAgKyttb2RpZmllZFskIC0gMV07CisgIHRlc3RDb3JydXB0ZWQobW9kaWZpZWQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2F3YWl0YWJsZS5kIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2F3YWl0YWJsZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDM2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvYXdhaXRhYmxlLmQKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudXRpbC5hd2FpdGFibGU7CisKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0LysgOiBTb2NrZXQsIHNvY2tldFBhaXIrLzsgLy8gRE1EIEBAQlVHMzE0QEAKK2ltcG9ydCB0aHJpZnQuYmFzZTsKKworLy8gVG8gYXZvaWQgRE1EIEBAQlVHNjM5NUBALgoraW1wb3J0IHRocmlmdC5pbnRlcm5hbC5hbGdvcml0aG07CisKKy8qKgorICogQW4gZXZlbnQgdGhhdCBjYW4gb2NjdXIgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIGFuZCB3aGljaCBjYW4gYmUKKyAqIGF3YWl0ZWQsIGVpdGhlciBieSBibG9ja2luZyB1bnRpbCBpdCBvY2N1cnMsIG9yIGJ5IHJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sKKyAqIGRlbGVnYXRlLgorICovCitpbnRlcmZhY2UgVEF3YWl0YWJsZSB7CisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgZXZlbnQgb2NjdXJzLgorICAgKgorICAgKiBDYWxsaW5nIHdhaXQoKSBmb3IgYW4gZXZlbnQgdGhhdCBoYXMgYWxyZWFkeSBvY2N1cnJlZCBpcyBhIG5vLW9wLgorICAgKi8KKyAgdm9pZCB3YWl0KCk7CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBldmVudCBvY2N1cnMgb3IgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGV4cGlyZXMuCisgICAqCisgICAqIENhbGxpbmcgd2FpdCgpIGZvciBhbiBldmVudCB0aGF0IGhhcyBhbHJlYWR5IG9jY3VycmVkIGlzIGEgbm8tb3AuCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZWQuCisgICAqLworICBib29sIHdhaXQoRHVyYXRpb24gdGltZW91dCk7CisKKyAgLyoqCisgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBldmVudCBvY2N1cnMuCisgICAqCisgICAqIFRoZSBkZWxlZ2F0ZSB3aWxsIGxpa2VseSBiZSBpbnZva2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLCBhbmQgaXMKKyAgICogZXhwZWN0ZWQgbm90IHRvIHBlcmZvcm0gZXhwZW5zaXZlIHdvcmsgYXMgaXQgd2lsbCB1c3VhbGx5IGJlIGludm9rZWQKKyAgICogc3luY2hyb25vdXNseSBieSB0aGUgbm90aWZ5aW5nIHRocmVhZC4gVGhlIG9yZGVyIGluIHdoaWNoIHJlZ2lzdGVyZWQKKyAgICogY2FsbGJhY2tzIGFyZSBpbnZva2VkIGlzIG5vdCBzcGVjaWZpZWQuCisgICAqCisgICAqIFRoZSBjYWxsYmFjayBtdXN0IG5ldmVyIHRocm93LCBidXQgbm90aHJvdyBzZW1hbnRpY3MgYXJlIGRpZmZpY3VsdCB0bworICAgKiBlbmZvcmNlLCBzbyBjdXJyZW50bHkgZXhjZXB0aW9ucyBhcmUganVzdCBzd2FsbG93ZWQgYnkKKyAgICogVEF3YWl0YWJsZSBpbXBsZW1lbnRhdGlvbnMuCisgICAqCisgICAqIElmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZCwgdGhlIGRlbGVnYXRlIGlzIGltbWVkaWF0ZWx5IGV4ZWN1dGVkCisgICAqIGluIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICovCisgIHZvaWQgYWRkQ2FsbGJhY2sodm9pZCBkZWxlZ2F0ZSgpIGRnKTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgYWRkZWQgY2FsbGJhY2suCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIGNhbGxiYWNrIGNvdWxkIGJlIGZvdW5kIGluIHRoZSBsaXN0LCBpLmUuIHdoZXRoZXIgaXQKKyAgICogICB3YXMgcHJldmlvdXNseSBhZGRlZC4KKyAgICovCisgIGJvb2wgcmVtb3ZlQ2FsbGJhY2sodm9pZCBkZWxlZ2F0ZSgpIGRnKTsKK30KKworLyoqCisgKiBBIHNpbXBsZSBUQXdhaXRhYmxlIGV2ZW50IHRyaWdnZXJlZCBieSBqdXN0IGNhbGxpbmcgYSB0cmlnZ2VyKCkgbWV0aG9kLgorICovCitjbGFzcyBUT25lc2hvdEV2ZW50IDogVEF3YWl0YWJsZSB7CisgIHRoaXMoKSB7CisgICAgbXV0ZXhfID0gbmV3IE11dGV4OworICAgIGNvbmRpdGlvbl8gPSBuZXcgQ29uZGl0aW9uKG11dGV4Xyk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdhaXQoKSB7CisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIHdoaWxlICghdHJpZ2dlcmVkXykgY29uZGl0aW9uXy53YWl0KCk7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgYm9vbCB3YWl0KER1cmF0aW9uIHRpbWVvdXQpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgaWYgKHRyaWdnZXJlZF8pIHJldHVybiB0cnVlOworICAgICAgY29uZGl0aW9uXy53YWl0KHRpbWVvdXQpOworICAgICAgcmV0dXJuIHRyaWdnZXJlZF87CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBhZGRDYWxsYmFjayh2b2lkIGRlbGVnYXRlKCkgZGcpIHsKKyAgICBtdXRleF8ubG9jaygpOworICAgIHNjb3BlIChmYWlsdXJlKSBtdXRleF8udW5sb2NrKCk7CisKKyAgICBjYWxsYmFja3NfIH49IGRnOworCisgICAgaWYgKHRyaWdnZXJlZF8pIHsKKyAgICAgIG11dGV4Xy51bmxvY2soKTsKKyAgICAgIGRnKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXV0ZXhfLnVubG9jaygpOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCByZW1vdmVDYWxsYmFjayh2b2lkIGRlbGVnYXRlKCkgZGcpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgYXV0byBvbGRMZW5ndGggPSBjYWxsYmFja3NfLmxlbmd0aDsKKyAgICAgIGNhbGxiYWNrc18gPSByZW1vdmVFcXVhbChjYWxsYmFja3NfLCBkZyk7CisgICAgICByZXR1cm4gY2FsbGJhY2tzXy5sZW5ndGggPCBvbGRMZW5ndGg7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRyaWdnZXJzIHRoZSBldmVudC4KKyAgICoKKyAgICogQW55IHJlZ2lzdGVyZWQgZXZlbnQgY2FsbGJhY2tzIGFyZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUKKyAgICogZnVuY3Rpb24gcmV0dXJucy4KKyAgICovCisgIHZvaWQgdHJpZ2dlcigpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgaWYgKCF0cmlnZ2VyZWRfKSB7CisgICAgICAgIHRyaWdnZXJlZF8gPSB0cnVlOworICAgICAgICBjb25kaXRpb25fLm5vdGlmeUFsbCgpOworICAgICAgICBmb3JlYWNoIChjOyBjYWxsYmFja3NfKSBjKCk7CisgICAgICB9CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIGJvb2wgdHJpZ2dlcmVkXzsKKyAgTXV0ZXggbXV0ZXhfOworICBDb25kaXRpb24gY29uZGl0aW9uXzsKKyAgdm9pZCBkZWxlZ2F0ZSgpW10gY2FsbGJhY2tzXzsKK30KKworLyoqCisgKiBUcmFuc2xhdGVzIFRBd2FpdGFibGUgZXZlbnRzIGludG8gZHVtbXkgbWVzc2FnZXMgb24gYSBzb2NrZXQgdGhhdCBjYW4gYmUKKyAqIHVzZWQgZS5nLiB0byB3YWtlIHVwIGZyb20gYSBzZWxlY3QoKSBjYWxsLgorICovCitmaW5hbCBjbGFzcyBUU29ja2V0Tm90aWZpZXIgeworICB0aGlzKCkgeworICAgIGF1dG8gc29ja3MgPSBzb2NrZXRQYWlyKCk7CisgICAgZm9yZWFjaCAoczsgc29ja3MpIHMuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICBzZW5kU29ja2V0XyA9IHNvY2tzWzBdOworICAgIHJlY3ZTb2NrZXRfID0gc29ja3NbMV07CisgIH0KKworICAvKioKKyAgICogVGhlIHNvY2tldCB0aGUgbWVzc2FnZXMgd2lsbCBiZSBzZW50IHRvLgorICAgKi8KKyAgU29ja2V0IHNvY2tldCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJlY3ZTb2NrZXRfOworICB9CisKKyAgLyoqCisgICAqIEF0YXRjaGVzIHRoZSBzb2NrZXQgbm90aWZpZXIgdG8gdGhlIHNwZWNpZmllZCBhd2FpdGFibGUsIGNhdXNpbmcgaXQgdG8KKyAgICogd3JpdGUgYSBieXRlIHRvIHRoZSBub3RpZmljYXRpb24gc29ja2V0IHdoZW4gdGhlIGF3YWl0YWJsZSBjYWxsYmFja3MgYXJlCisgICAqIGludm9rZWQuCisgICAqCisgICAqIElmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBiZWVuIHRyaWdnZXJlZCwgdGhlIGR1bW15IGJ5dGUgaXMgd3JpdHRlbgorICAgKiBpbW1lZGlhdGVseSB0byB0aGUgc29ja2V0LgorICAgKgorICAgKiBBIHNvY2tldCBub3RpZmllciBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBhIHNpbmdsZSBhd2FpdGFibGUgYXQgYSB0aW1lLgorICAgKgorICAgKiBUaHJvd3M6IFRFeGNlcHRpb24gaWYgdGhlIHNvY2tldCBub3RpZmllciBpcyBhbHJlYWR5IGF0dGFjaGVkLgorICAgKi8KKyAgdm9pZCBhdHRhY2goVEF3YWl0YWJsZSBhd2FpdGFibGUpIHsKKyAgICBlbmZvcmNlKCFhd2FpdGFibGVfLCBuZXcgVEV4Y2VwdGlvbigiQWxyZWFkeSBhdHRhY2hlZC4iKSk7CisgICAgYXdhaXRhYmxlLmFkZENhbGxiYWNrKCZub3RpZnkpOworICAgIGF3YWl0YWJsZV8gPSBhd2FpdGFibGU7CisgIH0KKworICAvKioKKyAgICogRGV0YWNoZXMgdGhlIHNvY2tldCBub3RpZmllciBmcm9tIHRoZSBhd2FpdGFibGUgaXQgaXMgY3VycmVudGx5IGF0dGFjaGVkCisgICAqIHRvLgorICAgKgorICAgKiBUaHJvd3M6IFRFeGNlcHRpb24gaWYgdGhlIHNvY2tldCBub3RpZmllciBpcyBub3QgY3VycmVudGx5IGF0dGFjaGVkLgorICAgKi8KKyAgdm9pZCBkZXRhY2goKSB7CisgICAgZW5mb3JjZShhd2FpdGFibGVfLCBuZXcgVEV4Y2VwdGlvbigiTm90IGF0dGFjaGVkLiIpKTsKKworICAgIC8vIFNvYWsgdXAgYW55IG5vdCBjdXJyZW50bHkgcmVhZCBub3RpZmljYXRpb24gYnl0ZXMuCisgICAgdWJ5dGVbMV0gZHVtbXkgPSB2b2lkOworICAgIHdoaWxlIChyZWN2U29ja2V0Xy5yZWNlaXZlKGR1bW15KSAhPSBTb2NrZXQuRVJST1IpIHt9CisKKyAgICBhdXRvIGNvdWxkUmVtb3ZlID0gYXdhaXRhYmxlXy5yZW1vdmVDYWxsYmFjaygmbm90aWZ5KTsKKyAgICBhc3NlcnQoY291bGRSZW1vdmUpOworICAgIGF3YWl0YWJsZV8gPSBudWxsOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgbm90aWZ5KCkgeworICAgIHVieXRlWzFdIHplcm87CisgICAgc2VuZFNvY2tldF8uc2VuZCh6ZXJvKTsKKyAgfQorCisgIFRBd2FpdGFibGUgYXdhaXRhYmxlXzsKKyAgU29ja2V0IHNlbmRTb2NrZXRfOworICBTb2NrZXQgcmVjdlNvY2tldF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvY2FuY2VsbGF0aW9uLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvY2FuY2VsbGF0aW9uLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1NTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9jYW5jZWxsYXRpb24uZApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmF3YWl0YWJsZTsKKworLyoqCisgKiBBIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciBhc3luY2hyb25vdXMgb3IgYmxvY2tpbmcgc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KKyAqCisgKiBJdCBpcyBwYXNzZWQgdG8gdGhlIGVudGl0eSBjcmVhdGluZyBhbiBvcGVyYXRpb24sIHdoaWNoIHdpbGwgdXN1YWxseSBtb25pdG9yCisgKiBpdCBlaXRoZXIgYnkgcG9sbGluZyBvciBieSBhZGRpbmcgZXZlbnQgaGFuZGxlcnMsIGFuZCBjYW5jZWwgdGhlIG9wZXJhdGlvbgorICogaWYgaXQgaXMgdHJpZ2dlcmVkLgorICoKKyAqIEZvciBzeW5jaHJvbm91cyBvcGVyYXRpb25zLCB0aGlzIHVzdWFsbHkgbWVhbnMgZWl0aGVyIHRocm93aW5nIGEKKyAqIFRDYW5jZWxsZWRFeGNlcHRpb24gb3IgaW1tZWRpYXRlbHkgcmV0dXJuaW5nLCBkZXBlbmRpbmcgb24gd2hldGhlcgorICogY2FuY2VsbGF0aW9uIGlzIGFuIGV4cGVjdGVkIHBhcnQgb2YgdGhlIHRhc2sgb3V0Y29tZSBvciBub3QuIEZvcgorICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIGNhbmNlbGxhdGlvbiB0eXBpY2FsbHkgZW50YWlscyBzdG9wcGluZyBiYWNrZ3JvdW5kCisgKiB3b3JrIGFuZCBjYW5jZWxsaW5nIGEgcmVzdWx0IGZ1dHVyZSwgaWYgbm90IGFscmVhZHkgY29tcGxldGVkLgorICoKKyAqIEFuIG9wZXJhdGlvbiBhY2NlcHRpbmcgYSBUQ2FuY2VsbGF0aW9uIGRvZXMgbm90IG5lZWQgdG8gZ3VhcmFudGVlIHRoYXQgaXQKKyAqIHdpbGwgYWN0dWFsbHkgYmUgYWJsZSB0byByZWFjdCB0byB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuCisgKi8KK2ludGVyZmFjZSBUQ2FuY2VsbGF0aW9uIHsKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIHRyaWdnZXJlZC4KKyAgICovCisgIGJvb2wgdHJpZ2dlcmVkKCkgY29uc3QgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBUaHJvd3MgYSBUQ2FuY2VsbGVkRXhjZXB0aW9uIGlmIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuCisgICAqIHRyaWdnZXJlZC4KKyAgICovCisgIHZvaWQgdGhyb3dJZlRyaWdnZXJlZCgpIGNvbnN0OworCisgIC8qKgorICAgKiBBIFRBd2FpdGFibGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciBjYW5jZWxsYXRpb24gdHJpZ2dlcmluZy4KKyAgICovCisgIFRBd2FpdGFibGUgdHJpZ2dlcmluZygpIEBwcm9wZXJ0eTsKK30KKworLyoqCisgKiBUaGUgb3JpZ2luIG9mIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIHdoaWNoIHByb3ZpZGVzIGEgd2F5IHRvIGFjdHVhbGx5CisgKiB0cmlnZ2VyIGl0LgorICoKKyAqIFRoaXMgZGVzaWduIGFsbG93cyBvcGVyYXRpb25zIHRvIHBhc3MgdGhlIFRDYW5jZWxsYXRpb24gb24gdG8gc3ViLXRhc2tzLAorICogd2hpbGUgbWFraW5nIHN1cmUgdGhhdCB0aGUgY2FuY2VsbGF0aW9uIGNhbiBvbmx5IGJlIHRyaWdnZXJlZCBieSB0aGUKKyAqIMK7b3V0ZXJtb3N0wqsgaW5zdGFuY2Ugd2FpdGluZyBmb3IgdGhlIHJlc3VsdC4KKyAqLworZmluYWwgY2xhc3MgVENhbmNlbGxhdGlvbk9yaWdpbiA6IFRDYW5jZWxsYXRpb24geworICB0aGlzKCkgeworICAgIGV2ZW50XyA9IG5ldyBUT25lc2hvdEV2ZW50OworICB9CisKKyAgLyoqCisgICAqIFRyaWdnZXJzIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdC4KKyAgICovCisgIHZvaWQgdHJpZ2dlcigpIHsKKyAgICBhdG9taWNTdG9yZSh0cmlnZ2VyZWRfLCB0cnVlKTsKKyAgICBldmVudF8udHJpZ2dlcigpOworICB9CisKKyAgLytvdmVycmlkZSsvIGJvb2wgdHJpZ2dlcmVkKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gYXRvbWljTG9hZCh0cmlnZ2VyZWRfKTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyB2b2lkIHRocm93SWZUcmlnZ2VyZWQoKSBjb25zdCB7CisgICAgaWYgKHRyaWdnZXJlZCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgIH0KKworICAvK292ZXJyaWRlKy8gVEF3YWl0YWJsZSB0cmlnZ2VyaW5nKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gZXZlbnRfOworICB9CisKK3ByaXZhdGU6CisgIHNoYXJlZCBib29sIHRyaWdnZXJlZF87CisgIFRPbmVzaG90RXZlbnQgZXZlbnRfOworfQorCisvLy8KK2NsYXNzIFRDYW5jZWxsZWRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZyA9IG51bGwsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsCisgICkgeworICAgIHN1cGVyKG1zZyA/IG1zZyA6ICJUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4iLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2Z1dHVyZS5kIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2Z1dHVyZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzJhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudXRpbC5mdXR1cmU7CisKK2ltcG9ydCBjb3JlLmF0b21pYzsKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQsIHBvcEZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnRyYWl0cyA6IEJhc2VUeXBlVHVwbGUsIGlzU29tZUZ1bmN0aW9uLCBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIG9wZXJhdGlvbiB3aGljaCBpcyBleGVjdXRlZCBhc3luY2hyb25vdXNseSBhbmQgdGhlIHJlc3VsdCBvZgorICogd2hpY2ggd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KKyAqCisgKiBPbmNlIGEgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGNhbiBiZSBmZXRjaGVkCisgKiB2aWEgdGhlIGdldCgpIGZhbWlseSBvZiBtZXRob2RzLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6IEVpdGhlciB0aGUKKyAqIG9wZXJhdGlvbiBzdWNjZWVkZWQsIHRoZW4gaXRzIHJldHVybiB2YWx1ZSBpcyByZXR1cm5lZCwgb3IgaXQgZmFpbGVkIGJ5CisgKiB0aHJvd2luZywgaW4gd2hpY2ggY2FzZSB0aGUgZXhjZXB0aW9uIGlzIHJldGhyb3duLCBvciBpdCB3YXMgY2FuY2VsbGVkCisgKiBiZWZvcmUsIHRoZW4gYSBUQ2FuY2VsbGVkRXhjZXB0aW9uIGlzIHRocm93bi4gVGhlcmUgbWlnaHQgYmUgVEZ1dHVyZQorICogaW1wbGVtZW50YXRpb25zIHdoaWNoIG5ldmVyIHBvc3NpYmx5IGVudGVyIHRoZSBjYW5jZWxsZWQgc3RhdGUuCisgKgorICogQWxsIG1ldGhvZHMgYXJlIHRocmVhZC1zYWZlLCBidXQga2VlcCBpbiBtaW5kIHRoYXQgYW55IGV4Y2VwdGlvbiBvYmplY3Qgb3IKKyAqIHJlc3VsdCAoaWYgaXQgaXMgYSByZWZlcmVuY2UgdHlwZSwgb2YgY291cnNlKSBpcyBzaGFyZWQgYmV0d2VlbiBhbGwKKyAqIGdldCgpLWZhbWlseSBpbnZvY2F0aW9ucy4KKyAqLworaW50ZXJmYWNlIFRGdXR1cmUoUmVzdWx0VHlwZSkgeworICAvKioKKyAgICogVGhlIHN0YXR1cyB0aGUgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBpbi4KKyAgICoKKyAgICogQW4gb3BlcmF0aW9uIHN0YXJ0cyBvdXQgaW4gUlVOTklORyBzdGF0dXMsIGFuZCBjaGFuZ2VzIHN0YXRlIHRvIG9uZSBvZiB0aGUKKyAgICogb3RoZXJzIGF0IG1vc3Qgb25jZSBhZnRlcndhcmRzLgorICAgKi8KKyAgVEZ1dHVyZVN0YXR1cyBzdGF0dXMoKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIEEgVEF3YWl0YWJsZSB0cmlnZ2VyZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGxlYXZlcyB0aGUgUlVOTklORyBzdGF0dXMuCisgICAqLworICBUQXdhaXRhYmxlIGNvbXBsZXRpb24oKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Igd2FpdGluZyB1bnRpbCB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZSBhbmQgdGhlbgorICAgKiBnZXQoKWluZyBpdC4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHRoZSByZXN1bHQgaXMgaW1tZWRpYXRlbHkKKyAgICogcmV0dXJuZWQuCisgICAqCisgICAqIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgwrthbGlhcyB0aGlzwqsnZCB0byB0aGUgaW50ZXJmYWNlLCBzbyB0aGF0CisgICAqIFRGdXR1cmUgY2FuIGJlIHVzZWQgYXMgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBhIHNpbXBsZSB2YWx1ZSBpbgorICAgKiBzeW5jaHJvbm91cyBjb2RlLgorICAgKi8KKyAgZmluYWwgUmVzdWx0VHlwZSB3YWl0R2V0KCkgeworICAgIGNvbXBsZXRpb24ud2FpdCgpOworICAgIHJldHVybiBnZXQoKTsKKyAgfQorICBmaW5hbCBAcHJvcGVydHkgYXV0byB3YWl0R2V0UHJvcGVydHkoKSB7IHJldHVybiB3YWl0R2V0KCk7IH0KKyAgYWxpYXMgd2FpdEdldFByb3BlcnR5IHRoaXM7CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Igd2FpdGluZyB1bnRpbCB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZSBhbmQgdGhlbgorICAgKiBnZXQoKWluZyBpdC4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW4gdGltZSwgcmV0dXJucyBpdHMgcmVzdWx0IChyZXNwLiB0aHJvd3MgYW4KKyAgICogZXhjZXB0aW9uIGZvciB0aGUgZmFpbGVkL2NhbmNlbGxlZCBjYXNlcykuIElmIG5vdCwgdGhyb3dzIGEKKyAgICogVEZ1dHVyZUV4Y2VwdGlvbi4KKyAgICovCisgIGZpbmFsIFJlc3VsdFR5cGUgd2FpdEdldChEdXJhdGlvbiB0aW1lb3V0KSB7CisgICAgZW5mb3JjZShjb21wbGV0aW9uLndhaXQodGltZW91dCksIG5ldyBURnV0dXJlRXhjZXB0aW9uKAorICAgICAgIk9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIGluIHRpbWUuIikpOworICAgIHJldHVybiBnZXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICoKKyAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLAorICAgKiAgIFRDYW5jZWxsZWRFeGNlcHRpb24gaWYgaXQgaXMgbm90IHlldCBkb25lOyB0aGUgc2V0IGV4Y2VwdGlvbiBpZiBpdAorICAgKiAgIGZhaWxlZC4KKyAgICovCisgIFJlc3VsdFR5cGUgZ2V0KCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGNhcHR1cmVkIGV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCwgb3IgbnVsbCBvdGhlcndpc2UuCisgICAqCisgICAqIFRocm93czogVEZ1dHVyZUV4Y2VwdGlvbiBpZiBub3QgeWV0IGRvbmUsIFRDYW5jZWxsZWRFeGNlcHRpb24gaWYgdGhlCisgICAqICAgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4KKyAgICovCisgIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKTsKK30KKworLyoqCisgKiBUaGUgc3RhdGVzIHRoZSBvcGVyYXRpb24gb2ZmZXJpbmcgYSBmdXR1cmUgaW50ZXJmYWNlIGNhbiBiZSBpbi4KKyAqLworZW51bSBURnV0dXJlU3RhdHVzIDogYnl0ZSB7CisgIFJVTk5JTkcsIC8vLyBUaGUgb3BlcmF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcuCisgIFNVQ0NFRURFRCwgLy8vIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICBGQUlMRUQsIC8vLyBUaGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgIENBTkNFTExFRCAvLy8gVGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLgorfQorCisvKioKKyAqIEEgVEZ1dHVyZSBjb3ZlcmluZyB0aGUgc2ltcGxlIGJ1dCBjb21tb24gY2FzZSB3aGVyZSB0aGUgcmVzdWx0IGlzIHNpbXBseQorICogc2V0IGJ5IGEgY2FsbCB0byBzdWNjZWVkKCkvZmFpbCgpLgorICoKKyAqIEFsbCBtZXRob2RzIGFyZSB0aHJlYWQtc2FmZSwgYnV0IHVzdWFsbHksIHN1Y2NlZWQoKS9mYWlsKCkgYXJlIG9ubHkgY2FsbGVkCisgKiBmcm9tIGEgc2luZ2xlIHRocmVhZCAoZGlmZmVyZW50IGZyb20gdGhlIHRocmVhZChzKSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0CisgKiB1c2luZyB0aGUgVEZ1dHVyZSBpbnRlcmZhY2UsIHRob3VnaCkuCisgKi8KK2NsYXNzIFRQcm9taXNlKFJlc3VsdFR5cGUpIDogVEZ1dHVyZSFSZXN1bHRUeXBlIHsKKyAgdGhpcygpIHsKKyAgICBzdGF0dXNNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgY29tcGxldGlvbkV2ZW50XyA9IG5ldyBUT25lc2hvdEV2ZW50OworICB9CisKKyAgb3ZlcnJpZGUgUyBzdGF0dXMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBhdG9taWNMb2FkKHN0YXR1c18pOworICB9CisKKyAgb3ZlcnJpZGUgVEF3YWl0YWJsZSBjb21wbGV0aW9uKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gY29tcGxldGlvbkV2ZW50XzsKKyAgfQorCisgIG92ZXJyaWRlIFJlc3VsdFR5cGUgZ2V0KCkgeworICAgIGF1dG8gcyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgZW5mb3JjZShzICE9IFMuUlVOTklORywKKyAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgaWYgKHMgPT0gUy5DQU5DRUxMRUQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICAgIGlmIChzID09IFMuRkFJTEVEKSB0aHJvdyBleGNlcHRpb25fOworCisgICAgc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgICAgcmV0dXJuIHJlc3VsdF87CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICBhdXRvIHMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgIGVuZm9yY2UocyAhPSBTLlJVTk5JTkcsCisgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCB5ZXQgY29tcGxldGVkLiIpKTsKKworICAgIGlmIChzID09IFMuQ0FOQ0VMTEVEKSB0aHJvdyBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgICBpZiAocyA9PSBTLlNVQ0NFRURFRCkgcmV0dXJuIG51bGw7CisKKyAgICByZXR1cm4gZXhjZXB0aW9uXzsKKyAgfQorCisgIHN0YXRpYyBpZiAoIWlzKFJlc3VsdFR5cGUgPT0gdm9pZCkpIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiwgbWFya3MgaXQgYXMgZG9uZSwgYW5kIG5vdGlmaWVzIGFueQorICAgICAqIHdhaXRlcnMuCisgICAgICoKKyAgICAgKiBJZiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBiZWZvcmUsIG5vdGhpbmcgaGFwcGVucy4KKyAgICAgKgorICAgICAqIFRocm93czogVEZ1dHVyZUV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGVkLgorICAgICAqLworICAgIHZvaWQgc3VjY2VlZChSZXN1bHRUeXBlIHJlc3VsdCkgeworICAgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgICAgYXV0byBzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgICAgaWYgKHMgPT0gUy5DQU5DRUxMRUQpIHJldHVybjsKKworICAgICAgICBlbmZvcmNlKHMgPT0gUy5SVU5OSU5HLAorICAgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQuIikpOworICAgICAgICByZXN1bHRfID0gcmVzdWx0OworCisgICAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIFMuU1VDQ0VFREVEKTsKKyAgICAgIH0KKworICAgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHZvaWQgc3VjY2VlZCgpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoc3RhdHVzTXV0ZXhfKSB7CisgICAgICAgIGF1dG8gcyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgICAgIGlmIChzID09IFMuQ0FOQ0VMTEVEKSByZXR1cm47CisKKyAgICAgICAgZW5mb3JjZShzID09IFMuUlVOTklORywKKyAgICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIGFscmVhZHkgY29tcGxldGVkLiIpKTsKKworICAgICAgICBhdG9taWNTdG9yZShzdGF0dXNfLCBTLlNVQ0NFRURFRCk7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBNYXJrcyB0aGUgb3BlcmF0aW9uIGFzIGZhaWxlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGFuZCBub3RpZmllcworICAgKiBhbnkgd2FpdGVycy4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiB3YXMgYWxyZWFkeSBjYW5jZWxsZWQsIG5vdGhpbmcgaGFwcGVucy4KKyAgICoKKyAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgYWxyZWFkeSBjb21wbGV0ZWQuCisgICAqLworICB2b2lkIGZhaWwoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgIHN5bmNocm9uaXplZCAoc3RhdHVzTXV0ZXhfKSB7CisgICAgICBhdXRvIHN0YXR1cyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgICBpZiAoc3RhdHVzID09IFMuQ0FOQ0VMTEVEKSByZXR1cm47CisKKyAgICAgIGVuZm9yY2Uoc3RhdHVzID09IFMuUlVOTklORywKKyAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC4iKSk7CisgICAgICBleGNlcHRpb25fID0gZXhjZXB0aW9uOworCisgICAgICBhdG9taWNTdG9yZShzdGF0dXNfLCBTLkZBSUxFRCk7CisgICAgfQorCisgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworCisgIC8qKgorICAgKiBNYXJrcyB0aGlzIG9wZXJhdGlvbiBhcyBjb21wbGV0ZWQgYW5kIHRha2VzIG92ZXIgdGhlIG91dGNvbWUgb2YgYW5vdGhlcgorICAgKiBURnV0dXJlIG9mIHRoZSBzYW1lIHR5cGUuCisgICAqCisgICAqIElmIHRoaXMgb3BlcmF0aW9uIHdhcyBhbHJlYWR5IGNhbmNlbGxlZCwgbm90aGluZyBoYXBwZW5zLiBJZiB0aGUgb3RoZXIKKyAgICogb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQsIHRoaXMgb3BlcmF0aW9uIGlzIG1hcmtlZCBhcyBmYWlsZWQgd2l0aCBhCisgICAqIFRDYW5jZWxsZWRFeGNlcHRpb24uCisgICAqCisgICAqIFRocm93czogVEZ1dHVyZUV4Y2VwdGlvbiBpZiB0aGUgcGFzc2VkIGluIGZ1dHVyZSB3YXMgbm90IGNvbXBsZXRlZCBvcgorICAgKiAgIHRoaXMgb3BlcmF0aW9uIGlzIGFscmVhZHkgY29tcGxldGVkLgorICAgKi8KKyAgdm9pZCBjb21wbGV0ZShURnV0dXJlIVJlc3VsdFR5cGUgZnV0dXJlKSB7CisgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgIGF1dG8gc3RhdHVzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5DQU5DRUxMRUQpIHJldHVybjsKKyAgICAgIGVuZm9yY2Uoc3RhdHVzID09IFMuUlVOTklORywKKyAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC4iKSk7CisKKyAgICAgIGVuZm9yY2UoZnV0dXJlLnN0YXR1cyAhPSBTLlJVTk5JTkcsIG5ldyBURnV0dXJlRXhjZXB0aW9uKAorICAgICAgICAiVGhlIHBhc3NlZCBURnV0dXJlIGlzIG5vdCB5ZXQgY29tcGxldGVkLiIpKTsKKworICAgICAgc3RhdHVzID0gZnV0dXJlLnN0YXR1czsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5DQU5DRUxMRUQpIHsKKyAgICAgICAgc3RhdHVzID0gUy5GQUlMRUQ7CisgICAgICAgIGV4Y2VwdGlvbl8gPSBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IFMuRkFJTEVEKSB7CisgICAgICAgIGV4Y2VwdGlvbl8gPSBmdXR1cmUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgICAgICByZXN1bHRfID0gZnV0dXJlLmdldCgpOworICAgICAgfQorCisgICAgICBhdG9taWNTdG9yZShzdGF0dXNfLCBzdGF0dXMpOworICAgIH0KKworICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICB9CisKKyAgLyoqCisgICAqIE1hcmtzIHRoaXMgb3BlcmF0aW9uIGFzIGNhbmNlbGxlZCBhbmQgbm90aWZpZXMgYW55IHdhaXRlcnMuCisgICAqCisgICAqIElmIHRoZSBvcGVyYXRpb24gaXMgYWxyZWFkeSBjb21wbGV0ZWQsIG5vdGhpbmcgaGFwcGVucy4KKyAgICovCisgIHZvaWQgY2FuY2VsKCkgeworICAgIHN5bmNocm9uaXplZCAoc3RhdHVzTXV0ZXhfKSB7CisgICAgICBhdXRvIHN0YXR1cyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgICBpZiAoc3RhdHVzID09IFMuUlVOTklORykgYXRvbWljU3RvcmUoc3RhdHVzXywgUy5DQU5DRUxMRUQpOworICAgIH0KKworICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICB9CisKK3ByaXZhdGU6CisgIC8vIENvbnZlbmllbmNlIGFsaWFzIGJlY2F1c2UgVEZ1dHVyZVN0YXR1cyBpcyB1YmlxdWl0b3VzIGluIHRoaXMgY2xhc3MuCisgIGFsaWFzIFRGdXR1cmVTdGF0dXMgUzsKKworICAvLyBUaGUgc3RhdHVzIHRoZSBwcm9taXNlIGlzIGN1cnJlbnRseSBpbi4KKyAgc2hhcmVkIFMgc3RhdHVzXzsKKworICB1bmlvbiB7CisgICAgc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgICAgLy8gU2V0IGlmIHN0YXR1c18gaXMgU1VDQ0VFREVELgorICAgICAgUmVzdWx0VHlwZSByZXN1bHRfOworICAgIH0KKyAgICAvLyBTZXQgaWYgc3RhdHVzXyBpcyBGQUlMRUQuCisgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbl87CisgIH0KKworICAvLyBQcm90ZWN0cyBzdGF0dXNfLgorICAvLyBBcyBmb3IgcmVzdWx0XyBhbmQgZXhjZXB0aW9uXzogVGhleSBhcmUgb25seSBzZXQgb25jZSwgd2hpbGUgc3RhdHVzXyBpcworICAvLyBzdGlsbCBSVU5OSU5HLCBzbyBnaXZlbiB0aGF0IHRoZSBvcGVyYXRpb24gaGFzIGFscmVhZHkgY29tcGxldGVkLCByZWFkaW5nCisgIC8vIHRoZW0gaXMgc2FmZSB3aXRob3V0IGhvbGRpbmcgc29tZSBraW5kIG9mIGxvY2suCisgIE11dGV4IHN0YXR1c011dGV4XzsKKworICAvLyBUcmlnZ2VyZWQgd2hlbiB0aGUgZXZlbnQgY29tcGxldGVzLgorICBUT25lc2hvdEV2ZW50IGNvbXBsZXRpb25FdmVudF87Cit9CisKKy8vLworY2xhc3MgVEZ1dHVyZUV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnID0gIiIsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorfQorCisvKioKKyAqIENyZWF0ZXMgYW4gaW50ZXJmYWNlIHRoYXQgaXMgc2ltaWxhciB0byBhIGdpdmVuIG9uZSwgYnV0IGFjY2VwdHMgYW4KKyAqIGFkZGl0aW9uYWwsIG9wdGlvbmFsIFRDYW5jZWxsYXRpb24gcGFyYW1ldGVyIGVhY2ggbWV0aG9kLCBhbmQgcmV0dXJucworICogVEZ1dHVyZXMgaW5zdGVhZCBvZiBwbGFpbiByZXR1cm4gdmFsdWVzLgorICoKKyAqIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uczoKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIHZvaWQgYmFyKCk7CisgKiAgIHN0cmluZyBiYXooaW50IGEpOworICogfQorICogYWxpYXMgVEZ1dHVyZUludGVyZmFjZSFGb28gRnV0dXJlRm9vOworICogLS0tCisgKgorICogRnV0dXJlRm9vIHdvdWxkIGJlIGVxdWl2YWxlbnQgdG86CisgKiAtLS0KKyAqIGludGVyZmFjZSBGdXR1cmVGb28geworICogICBURnV0dXJlIXZvaWQgYmFyKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCk7CisgKiAgIFRGdXR1cmUhc3RyaW5nIGJheihpbnQgYSwgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKTsKKyAqIH0KKyAqIC0tLQorICovCit0ZW1wbGF0ZSBURnV0dXJlSW50ZXJmYWNlKEludGVyZmFjZSkgaWYgKGlzKEludGVyZmFjZSBfID09IGludGVyZmFjZSkpIHsKKyAgbWl4aW4oeworICAgIHN0cmluZyBjb2RlID0gImludGVyZmFjZSBURnV0dXJlSW50ZXJmYWNlIFxuIjsKKworICAgIHN0YXRpYyBpZiAoaXMoSW50ZXJmYWNlIEJhc2VzID09IHN1cGVyKSAmJiBCYXNlcy5sZW5ndGggPiAwKSB7CisgICAgICBjb2RlIH49ICI6ICI7CisgICAgICBmb3JlYWNoIChpOyAwIC4uIEJhc2VzLmxlbmd0aCkgeworICAgICAgICBpZiAoaSA+IDApIGNvZGUgfj0gIiwgIjsKKyAgICAgICAgY29kZSB+PSAiVEZ1dHVyZUludGVyZmFjZSEoQmFzZVR5cGVUdXBsZSFJbnRlcmZhY2VbIiB+IHRvIXN0cmluZyhpKSB+ICJdKSAiOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gIntcbiI7CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgSW50ZXJmYWNlKSkgeworICAgICAgZW51bSBxbiA9ICJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWU7CisgICAgICBzdGF0aWMgaWYgKGlzU29tZUZ1bmN0aW9uIShtaXhpbihxbikpKSB7CisgICAgICAgIGNvZGUgfj0gIlRGdXR1cmUhKFJldHVyblR5cGUhKCIgfiBxbiB+ICIpKSAiIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICAgIihQYXJhbWV0ZXJUeXBlVHVwbGUhKCIgfiBxbiB+ICIpLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpO1xuIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIEFuIGlucHV0IHJhbmdlIHRoYXQgYWdncmVnYXRlcyByZXN1bHRzIGZyb20gbXVsdGlwbGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsCisgKiByZXR1cm5pbmcgdGhlbSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuCisgKgorICogQWRkaXRpb25hbGx5LCBhIHRpbWVvdXQgY2FuIGJlIHNldCBhZnRlciB3aGljaCByZXN1bHRzIGZyb20gbm90IHlldCBmaW5pc2hlZAorICogZnV0dXJlcyB3aWxsIG5vIGxvbmdlciBiZSB3YWl0ZWQgZm9yLCBlLmcuIHRvIGVuc3VyZSB0aGUgdGltZSBpdCB0YWtlcyB0bworICogaXRlcmF0ZSBvdmVyIGEgc2V0IG9mIHJlc3VsdHMgaXMgbGltaXRlZC4KKyAqLworZmluYWwgY2xhc3MgVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZShUKSB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgZnV0dXJlcyA9IFRoZSBzZXQgb2YgZnV0dXJlcyB0byBjb2xsZWN0IHJlc3VsdHMgZnJvbS4KKyAgICogICB0aW1lb3V0ID0gSWYgcG9zaXRpdmUsIG5vdCB5ZXQgZmluaXNoZWQgZnV0dXJlcyB3aWxsIGJlIGNhbmNlbGxlZCBhbmQKKyAgICogICAgIHRoZWlyIHJlc3VsdHMgd2lsbCBub3QgYmUgdGFrZW4gaW50byBhY2NvdW50LgorICAgKi8KKyAgdGhpcyhURnV0dXJlIVRbXSBmdXR1cmVzLCBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uLAorICAgIER1cmF0aW9uIHRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCkKKyAgKSB7CisgICAgaWYgKHRpbWVvdXQgPiBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgIHRpbWVvdXRTeXNUaWNrXyA9IFRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljayArCisgICAgICAgIFRpY2tEdXJhdGlvbi5mcm9tISJobnNlY3MiKHRpbWVvdXQudG90YWwhImhuc2VjcyIpOworICAgIH0gZWxzZSB7CisgICAgICB0aW1lb3V0U3lzVGlja18gPSBUaWNrRHVyYXRpb24oMCk7CisgICAgfQorCisgICAgcXVldWVNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgcXVldWVOb25FbXB0eUNvbmRpdGlvbl8gPSBuZXcgQ29uZGl0aW9uKHF1ZXVlTXV0ZXhfKTsKKyAgICBmdXR1cmVzXyA9IGZ1dHVyZXM7CisgICAgY2hpbGRDYW5jZWxsYXRpb25fID0gY2hpbGRDYW5jZWxsYXRpb247CisKKyAgICBmb3JlYWNoIChmdXR1cmU7IGZ1dHVyZXNfKSB7CisgICAgICBmdXR1cmUuY29tcGxldGlvbi5hZGRDYWxsYmFjayh7CisgICAgICAgIGF1dG8gZiA9IGZ1dHVyZTsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBpZiAoZi5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHJldHVybjsKKyAgICAgICAgICBhc3NlcnQoZi5zdGF0dXMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKTsKKworICAgICAgICAgIHN5bmNocm9uaXplZCAocXVldWVNdXRleF8pIHsKKyAgICAgICAgICAgIGNvbXBsZXRlZFF1ZXVlXyB+PSBmOworCisgICAgICAgICAgICBpZiAoY29tcGxldGVkUXVldWVfLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgIHF1ZXVlTm9uRW1wdHlDb25kaXRpb25fLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0oKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgKgorICAgKiBUaGlzIGlzIHRoZSBjYXNlIGlmIHRoZSByZXN1bHRzIGZyb20gdGhlIGNvbXBsZXRlZCBmdXR1cmVzIG5vdCBoYXZpbmcKKyAgICogZmFpbGVkIGhhdmUgYWxyZWFkeSBiZWVuIHBvcHBlZCBhbmQgZWl0aGVyIGFsbCBmdXR1cmUgaGF2ZSBiZWVuIGZpbmlzaGVkCisgICAqIG9yIHRoZSB0aW1lb3V0IGhhcyBleHBpcmVkLgorICAgKgorICAgKiBQb3RlbnRpYWxseSBibG9ja3MgdW50aWwgYSBuZXcgcmVzdWx0IGlzIGF2YWlsYWJsZSBvciB0aGUgdGltZW91dCBoYXMKKyAgICogZXhwaXJlZC4KKyAgICovCisgIGJvb2wgZW1wdHkoKSBAcHJvcGVydHkgeworICAgIGlmIChmaW5pc2hlZF8pIHJldHVybiB0cnVlOworICAgIGlmIChidWZmZXJGaWxsZWRfKSByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVEZ1dHVyZSFUIGZ1dHVyZTsKKyAgICAgIHN5bmNocm9uaXplZCAocXVldWVNdXRleF8pIHsKKyAgICAgICAgLy8gVGhlIHdoaWxlIGxvb3AgaXMganVzdCBiZWluZyBjYXV0aW91cyBhYm91dCBzcHVyaW91cyB3YWtldXBzLCBpbgorICAgICAgICAvLyBjYXNlIHRoZXkgc2hvdWxkIGJlIHBvc3NpYmxlLgorICAgICAgICB3aGlsZSAoY29tcGxldGVkUXVldWVfLmVtcHR5KSB7CisgICAgICAgICAgYXV0byByZW1haW5pbmcgPSB0byFEdXJhdGlvbih0aW1lb3V0U3lzVGlja18gLQorICAgICAgICAgICAgVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrKTsKKworICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICAvLyBObyB0aW1lIGxlZnQsIGJ1dCBzdGlsbCBubyBlbGVtZW50IHJlY2VpdmVkIOKAkyB3ZSBhcmUgZW1wdHkgbm93LgorICAgICAgICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgICAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBxdWV1ZU5vbkVtcHR5Q29uZGl0aW9uXy53YWl0KHJlbWFpbmluZyk7CisgICAgICAgIH0KKworICAgICAgICBmdXR1cmUgPSBjb21wbGV0ZWRRdWV1ZV8uZnJvbnQ7CisgICAgICAgIGNvbXBsZXRlZFF1ZXVlXy5wb3BGcm9udCgpOworICAgICAgfQorCisgICAgICArK2NvbXBsZXRlZENvdW50XzsKKyAgICAgIGlmIChjb21wbGV0ZWRDb3VudF8gPT0gZnV0dXJlc18ubGVuZ3RoKSB7CisgICAgICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IGZ1dHVyZSBpbiB0aGUgbGlzdCwgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkKKyAgICAgICAgLy8gYW5vdGhlciByZXN1bHQgY291bGQgZXZlciBiZWNvbWUgYXZhaWxhYmxlLgorICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoZnV0dXJlLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkZBSUxFRCkgeworICAgICAgICAvLyBUaGlzIG9uZSBmYWlsZWQsIGxvb3AgYWdhaW4gYW5kIHRyeSBnZXR0aW5nIGFub3RoZXIgaXRlbSBmcm9tCisgICAgICAgIC8vIHRoZSBxdWV1ZS4KKyAgICAgICAgZXhjZXB0aW9uc18gfj0gZnV0dXJlLmdldEV4Y2VwdGlvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0QnVmZmVyXyA9IGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgYnVmZmVyRmlsbGVkXyA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSByYW5nZS4KKyAgICoKKyAgICogUG90ZW50aWFsbHkgYmxvY2tzIHVudGlsIGEgbmV3IHJlc3VsdCBpcyBhdmFpbGFibGUgb3IgdGhlIHRpbWVvdXQgaGFzCisgICAqIGV4cGlyZWQuCisgICAqCisgICAqIFRocm93czogVEV4Y2VwdGlvbiBpZiB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAqLworICBUIGZyb250KCkgeworICAgIGVuZm9yY2UoIWVtcHR5LCBuZXcgVEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZ2V0IGZyb250IG9mIGFuIGVtcHR5IGZ1dHVyZSBhZ2dyZWdhdG9yIHJhbmdlLiIpKTsKKyAgICByZXR1cm4gcmVzdWx0QnVmZmVyXzsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIHJhbmdlLgorICAgKgorICAgKiBQb3RlbnRpYWxseSBibG9ja3MgdW50aWwgYSBuZXcgcmVzdWx0IGlzIGF2YWlsYWJsZSBvciB0aGUgdGltZW91dCBoYXMKKyAgICogZXhwaXJlZC4KKyAgICoKKyAgICogVGhyb3dzOiBURXhjZXB0aW9uIGlmIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgICovCisgIHZvaWQgcG9wRnJvbnQoKSB7CisgICAgZW5mb3JjZSghZW1wdHksIG5ldyBURXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBwb3AgZnJvbnQgb2YgYW4gZW1wdHkgZnV0dXJlIGFnZ3JlZ2F0b3IgcmFuZ2UuIikpOworICAgIGJ1ZmZlckZpbGxlZF8gPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIGZ1dHVyZXMgdGhlIHJlc3VsdCBvZiB3aGljaCBoYXMgYmVlbiByZXR1cm5lZCBvciB3aGljaCBoYXZlCisgICAqIGZhaWxlZCBzbyBmYXIuCisgICAqLworICBzaXplX3QgY29tcGxldGVkQ291bnQoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBjb21wbGV0ZWRDb3VudF87CisgIH0KKworICAvKioKKyAgICogVGhlIGV4Y2VwdGlvbnMgY29sbGVjdGVkIGZyb20gZmFpbGVkIFRGdXR1cmVzIHNvIGZhci4KKyAgICovCisgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBleGNlcHRpb25zXzsKKyAgfQorCitwcml2YXRlOgorICBURnV0dXJlIVRbXSBmdXR1cmVzXzsKKyAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbl87CisKKyAgLy8gVGhlIHN5c3RlbSB0aWNrIHRoaXMgb3BlcmF0aW9uIHdpbGwgdGltZSBvdXQsIG9yIHplcm8gaWYgbm8gdGltZW91dCBoYXMKKyAgLy8gYmVlbiBzZXQuCisgIFRpY2tEdXJhdGlvbiB0aW1lb3V0U3lzVGlja187CisKKyAgYm9vbCBmaW5pc2hlZF87CisKKyAgYm9vbCBidWZmZXJGaWxsZWRfOworICBUIHJlc3VsdEJ1ZmZlcl87CisKKyAgRXhjZXB0aW9uW10gZXhjZXB0aW9uc187CisgIHNpemVfdCBjb21wbGV0ZWRDb3VudF87CisKKyAgLy8gVGhlIHF1ZXVlIG9mIGNvbXBsZXRlZCBmdXR1cmVzLiBUaGlzIChhbmQgdGhlIGFzc29jaWF0ZWQgY29uZGl0aW9uKSBhcmUKKyAgLy8gdGhlIG9ubHkgcGFydHMgb2YgdGhpcyBjbGFzcyB0aGF0IGFyZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLgorICBURnV0dXJlIVRbXSBjb21wbGV0ZWRRdWV1ZV87CisgIE11dGV4IHF1ZXVlTXV0ZXhfOworICBDb25kaXRpb24gcXVldWVOb25FbXB0eUNvbmRpdGlvbl87Cit9CisKKy8qKgorICogVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSB2YWx1ZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQgdXNpbmcgSUZUSQorICogKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UhVCB0RnV0dXJlQWdncmVnYXRvclJhbmdlKFQpKFRGdXR1cmUhVFtdIGZ1dHVyZXMsCisgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb24sIER1cmF0aW9uIHRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCkKKykgeworICByZXR1cm4gbmV3IFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UhVChmdXR1cmVzLCBjaGlsZENhbmNlbGxhdGlvbiwgdGltZW91dCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2hhc2hzZXQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUxMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2hhc2hzZXQuZApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC51dGlsLmhhc2hzZXQ7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogam9pbmVyLCBtYXA7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQudHJhaXRzIDogaXNJbXBsaWNpdGx5Q29udmVydGlibGUsIFBhcmFtZXRlclR5cGVUdXBsZTsKK2ltcG9ydCBzdGQucmFuZ2UgOiBFbGVtZW50VHlwZSwgaXNJbnB1dFJhbmdlOworCitzdHJ1Y3QgVm9pZCB7fQorCisvKioKKyAqIEEgcXVpY2tseSBoYWNrZWQgdG9nZXRoZXIgaGFzaCBzZXQgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IGJ1aWx0LWluCisgKiBhc3NvY2lhdGl2ZSBhcnJheXMgdG8gaGF2ZSBzb21ldGhpbmcgdG8gY29tcGlsZSBUaHJpZnQncyBzZXQ8PiB0byB1bnRpbAorICogc3RkLmNvbnRhaW5lciBnYWlucyBzb21ldGhpbmcgc3VpdGFibGUuCisgKi8KKy8vIE5vdGU6IFRoZSBmdW5reSBwb2ludGVyIGNhc3RzIChpLmUuICooY2FzdChpbW11dGFibGUoRSkqKSZlKSBpbnN0ZWFkIG9mCisvLyBqdXN0IGNhc3QoaW1tdXRhYmxlKEUpKWUpIGFyZSBhIHdvcmthcm91bmQgZm9yIExEQyAyIGNvbXBhdGliaWxpdHkuCitmaW5hbCBjbGFzcyBIYXNoU2V0KEUpIHsKKyAgLy8vCisgIHRoaXMoKSB7fQorCisgIC8vLworICB0aGlzKEVbXSBlbGVtcy4uLikgeworICAgIGluc2VydChlbGVtcyk7CisgIH0KKworICAvLy8KKyAgdm9pZCBpbnNlcnQoU3R1ZmYpKFN0dWZmIHN0dWZmKSBpZiAoaXNJbXBsaWNpdGx5Q29udmVydGlibGUhKFN0dWZmLCBFKSkgeworICAgIGFhX1sqKGNhc3QoaW1tdXRhYmxlKEUpKikmc3R1ZmYpXSA9IFZvaWQuaW5pdDsKKyAgfQorCisgIC8vLworICB2b2lkIGluc2VydChTdHVmZikoU3R1ZmYgc3R1ZmYpIGlmICgKKyAgICBpc0lucHV0UmFuZ2UhU3R1ZmYgJiYgaXNJbXBsaWNpdGx5Q29udmVydGlibGUhKEVsZW1lbnRUeXBlIVN0dWZmLCBFKQorICApIHsKKyAgICBmb3JlYWNoIChlOyBzdHVmZikgeworICAgICAgYWFfWyooY2FzdChpbW11dGFibGUoRSkqKSZlKV0gPSBWb2lkLmluaXQ7CisgICAgfQorICB9CisKKyAgLy8vCisgIHZvaWQgb3BPcEFzc2lnbihzdHJpbmcgb3AgOiAifiIsIFN0dWZmKShTdHVmZiBzdHVmZikgeworICAgIGluc2VydChzdHVmZik7CisgIH0KKworICAvLy8KKyAgdm9pZCByZW1vdmUoRSBlKSB7CisgICAgYWFfLnJlbW92ZSgqKGNhc3QoaW1tdXRhYmxlKEUpKikmZSkpOworICB9CisgIGFsaWFzIHJlbW92ZSByZW1vdmVLZXk7CisKKyAgLy8vCisgIHZvaWQgcmVtb3ZlQWxsKCkgeworICAgIGFhXyA9IG51bGw7CisgIH0KKworICAvLy8KKyAgc2l6ZV90IGxlbmd0aCgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIGFhXy5sZW5ndGg7CisgIH0KKworICAvLy8KKyAgc2l6ZV90IGVtcHR5KCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gIWFhXy5sZW5ndGg7CisgIH0KKworICAvLy8KKyAgYm9vbCBvcEJpbmFyeVJpZ2h0KHN0cmluZyBvcCA6ICJpbiIpKEUgZSkgY29uc3QgeworICAgIHJldHVybiAoZSBpbiBhYV8pICFpcyBudWxsOworICB9CisKKyAgLy8vCisgIGF1dG8gb3BTbGljZSgpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdXNpbmcgQUEga2V5IHJhbmdlIG9uY2UgYXZhaWxhYmxlIGluIHJlbGVhc2UgRE1EL2RydW50aW1lCisgICAgLy8gdG8gYXZvaWQgYWxsb2NhdGlvbi4KKyAgICByZXR1cm4gY2FzdChFW10pKGFhXy5rZXlzKTsKKyAgfQorCisgIC8vLworICBvdmVycmlkZSBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgLy8gT25seSBwcm92aWRlIHRvU3RyaW5nKCkgaWYgdG8hc3RyaW5nKCkgaXMgYXZhaWxhYmxlIGZvciBFIChleGNlcHRpb25zIGFyZQorICAgIC8vIGUuZy4gZGVsZWdhdGVzKS4KKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZih0byFzdHJpbmcoRS5pbml0KSkgOiBzdHJpbmcpKSB7CisgICAgICByZXR1cm4gInsiIH4gdG8hc3RyaW5nKGpvaW5lcihtYXAhYHRvIXN0cmluZyhhKWAoYWFfLmtleXMpLCAiLCAiKSkgfiAifSI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENhc3QgdG8gd29yayBhcm91bmQgT2JqZWN0IG5vdCBiZWluZyBjb25zdC1jb3JyZWN0LgorICAgICAgcmV0dXJuIChjYXN0KClzdXBlcikudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICAvLy8KKyAgb3ZlcnJpZGUgYm9vbCBvcEVxdWFscyhPYmplY3Qgb3RoZXIpIGNvbnN0IHsKKyAgICBhdXRvIHJocyA9IGNhc3QoY29uc3QoSGFzaFNldCkpb3RoZXI7CisgICAgaWYgKHJocykgeworICAgICAgcmV0dXJuIGFhXyA9PSByaHMuYWFfOworICAgIH0KKworICAgIC8vIENhc3QgdG8gd29yayBhcm91bmQgT2JqZWN0IG5vdCBiZWluZyBjb25zdC1jb3JyZWN0LgorICAgIHJldHVybiAoY2FzdCgpc3VwZXIpLm9wRXF1YWxzKG90aGVyKTsKKyAgfQorCitwcml2YXRlOgorICBWb2lkW2ltbXV0YWJsZShFKV0gYWFfOworfQorCisvLy8gRGl0dG8KK2F1dG8gaGFzaFNldChFKShFW10gZWxlbXMuLi4pIHsKKyAgcmV0dXJuIG5ldyBIYXNoU2V0IUUoZWxlbXMpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworCisgIGF1dG8gYSA9IGhhc2hTZXQoMSwgMiwgMiwgMyk7CisgIGVuZm9yY2UoYS5sZW5ndGggPT0gMyk7CisgIGVuZm9yY2UoMiBpbiBhKTsKKyAgZW5mb3JjZSg1ICFpbiBhKTsKKyAgZW5mb3JjZShhLnRvU3RyaW5nKCkubGVuZ3RoID09IDkpOworICBhLnJlbW92ZSgyKTsKKyAgZW5mb3JjZShhLmxlbmd0aCA9PSAyKTsKKyAgZW5mb3JjZSgyICFpbiBhKTsKKyAgYS5yZW1vdmVBbGwoKTsKKyAgZW5mb3JjZShhLmVtcHR5KTsKKyAgZW5mb3JjZShhLnRvU3RyaW5nKCkgPT0gInt9Iik7CisKKyAgdm9pZCBkZWxlZ2F0ZSgpIGRnOworICBhdXRvIGIgPSBoYXNoU2V0KGRnKTsKKyAgc3RhdGljIGFzc2VydChfX3RyYWl0cyhjb21waWxlcywgYi50b1N0cmluZygpKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2QvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYjZhNmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0FVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IHRydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtIHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KKworCisjIFRocmlmdCBjb21waWxlciBydWxlcworCitkZWJ1Z19wcm90b19nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC8sIERlYnVnUHJvdG9UZXN0X3R5cGVzLmQpCisKKyQoZGVidWdfcHJvdG9fZ2VuKTogJCh0b3Bfc3JjZGlyKS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkIC1ub3dhcm4gJDwKKworc3RyZXNzX3Rlc3RfZ2VuID0gJChhZGRwcmVmaXggZ2VuLWQvdGhyaWZ0L3Rlc3Qvc3RyZXNzLywgU2VydmljZS5kIFwKKwlTdHJlc3NUZXN0X3R5cGVzLmQpCisKKyQoc3RyZXNzX3Rlc3RfZ2VuKTogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGQgJDwKKwordGhyaWZ0X3Rlc3RfZ2VuID0gJChhZGRwcmVmaXggZ2VuLWQvdGhyaWZ0L3Rlc3QvLCBTZWNvbmRTZXJ2aWNlLmQgXAorCVRocmlmdFRlc3QuZCBUaHJpZnRUZXN0X2NvbnN0YW50cy5kIFRocmlmdFRlc3RfdHlwZXMuZCkKKworJCh0aHJpZnRfdGVzdF9nZW4pOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZCAkPAorCisKKyMgVGhlIGFjdHVhbCB0ZXN0IHRhcmdldHMuCisjIFRoZXJlIGp1c3QgbXVzdCBiZSBzb21lIHdheSB0byByZWFzc2lnbiBhIHZhcmlhYmxlIHdpdGhvdXQgd2FybmluZ3MgaW4KKyMgQXV0b21ha2UuLi4KK3RhcmdldHNfXyA9IGFzeW5jX3Rlc3QgY2xpZW50X3Bvb2xfdGVzdCBzZXJpYWxpemF0aW9uX2JlbmNobWFyayBcCisJc3RyZXNzX3Rlc3Rfc2VydmVyIHRocmlmdF90ZXN0X2NsaWVudCB0aHJpZnRfdGVzdF9zZXJ2ZXIgdHJhbnNwb3J0X3Rlc3QKK3Jhbl90ZXN0c19fID0gY2xpZW50X3Bvb2xfdGVzdCBcCisJdHJhbnNwb3J0X3Rlc3QgXAorCWFzeW5jX3Rlc3RfcnVubmVyLnNoIFwKKwl0aHJpZnRfdGVzdF9ydW5uZXIuc2gKKworbGliZXZlbnRfZGVwZW5kZW50X3RhcmdldHMgPSBhc3luY190ZXN0X2NsaWVudCBjbGllbnRfcG9vbF90ZXN0IFwKKwlzdHJlc3NfdGVzdF9zZXJ2ZXIgdGhyaWZ0X3Rlc3Rfc2VydmVyCitsaWJldmVudF9kZXBlbmRlbnRfcmFuX3Rlc3RzID0gY2xpZW50X3Bvb2xfdGVzdCBhc3luY190ZXN0X3J1bm5lci5zaCB0aHJpZnRfdGVzdF9ydW5uZXIuc2gKKworb3BlbnNzbF9kZXBlbmRlbnRfdGFyZ2V0cyA9IGFzeW5jX3Rlc3QgdGhyaWZ0X3Rlc3RfY2xpZW50IHRocmlmdF90ZXN0X3NlcnZlcgorb3BlbnNzbF9kZXBlbmRlbnRfcmFuX3Rlc3RzID0gYXN5bmNfdGVzdF9ydW5uZXIuc2ggdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCisKK2RfdGVzdF9mbGFncyA9CisKK2lmIFdJVEhfRF9FVkVOVF9URVNUUworZF90ZXN0X2ZsYWdzICs9ICQoRE1EX0xJQkVWRU5UX0ZMQUdTKSAuLi8kKERfRVZFTlRfTElCX05BTUUpCit0YXJnZXRzXyA9ICQodGFyZ2V0c19fKQorcmFuX3Rlc3RzXyA9ICQocmFuX3Rlc3RzX18pCitlbHNlCit0YXJnZXRzXyA9ICQoZmlsdGVyLW91dCAkKGxpYmV2ZW50X2RlcGVuZGVudF90YXJnZXRzKSwgJCh0YXJnZXRzX18pKQorcmFuX3Rlc3RzXyA9ICQoZmlsdGVyLW91dCAkKGxpYmV2ZW50X2RlcGVuZGVudF9yYW5fdGVzdHMpLCAkKHJhbl90ZXN0c19fKSkKK2VuZGlmCisKK2lmIFdJVEhfRF9TU0xfVEVTVFMKK2RfdGVzdF9mbGFncyArPSAkKERNRF9PUEVOU1NMX0ZMQUdTKSAuLi8kKERfU1NMX0xJQl9OQU1FKQordGFyZ2V0cyA9ICQodGFyZ2V0c18pCityYW5fdGVzdHMgPSAkKHJhbl90ZXN0c18pCitlbHNlCit0YXJnZXRzID0gJChmaWx0ZXItb3V0ICQob3BlbnNzbF9kZXBlbmRlbnRfdGFyZ2V0cyksICQodGFyZ2V0c18pKQorcmFuX3Rlc3RzID0gJChmaWx0ZXItb3V0ICQob3BlbnNzbF9kZXBlbmRlbnRfcmFuX3Rlc3RzKSwgJChyYW5fdGVzdHNfKSkKK2VuZGlmCisKK2RfdGVzdF9mbGFncyArPSAtdyAtd2kgLU8gLXJlbGVhc2UgLWlubGluZSAtSSQodG9wX3NyY2RpcikvbGliL2Qvc3JjIC1JZ2VuLWQgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvZC8kKERfTElCX05BTUUpCisKKworYXN5bmNfdGVzdCBjbGllbnRfcG9vbF90ZXN0IHRyYW5zcG9ydF90ZXN0OiAlOiAlLmQKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKK3NlcmlhbGl6YXRpb25fYmVuY2htYXJrOiAlOiAlLmQgJChkZWJ1Z19wcm90b19nZW4pCisJJChETUQpICQoZF90ZXN0X2ZsYWdzKSAtb2YkQCAkXgorCitzdHJlc3NfdGVzdF9zZXJ2ZXI6ICU6ICUuZCB0ZXN0X3V0aWxzLmQgJChzdHJlc3NfdGVzdF9nZW4pCisJJChETUQpICQoZF90ZXN0X2ZsYWdzKSAtb2YkQCAkXgorCit0aHJpZnRfdGVzdF9jbGllbnQ6ICU6ICUuZCB0aHJpZnRfdGVzdF9jb21tb24uZCAkKHRocmlmdF90ZXN0X2dlbikKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKK3RocmlmdF90ZXN0X3NlcnZlcjogJTogJS5kIHRocmlmdF90ZXN0X2NvbW1vbi5kIHRlc3RfdXRpbHMuZCAkKHRocmlmdF90ZXN0X2dlbikKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKKworIyBDZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uIHRhcmdldHMgKGZvciB0aGUgU1NMIHRlc3RzKS4KKyMgQ3VycmVudGx5LCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZSAib3BlbnNzbCIgdG9vbCBpcyBvbiB0aGUgcGF0aCwgY291bGQgYmUKKyMgcmVwbGFjZWQgYnkgYSBtb3JlIGVsYWJvcmF0ZSBtZWNoYW5pc20uCisKK3NlcnZlci1jZXJ0aWZpY2F0ZS5wZW06IG9wZW5zc2wudGVzdC5jbmYKKwlvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1ub2RlcyAtY29uZmlnIG9wZW5zc2wudGVzdC5jbmYgXAorCQktb3V0IHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KKwordHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW06IHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KKwljYXQgc2VydmVyLWNlcnRpZmljYXRlLnBlbSA+ICRACisKK2NoZWNrLWxvY2FsOiAkKHRhcmdldHMpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tZCAkKHRhcmdldHMpICQoYWRkc3VmZml4IC5vLCAkKHRhcmdldHMpKQorCisKKyMgVGVzdHMgcmFuIGFzIHBhcnQgb2YgbWFrZSBjaGVjay4KKworYXN5bmNfdGVzdF9ydW5uZXIuc2g6IGFzeW5jX3Rlc3QgdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQordGhyaWZ0X3Rlc3RfcnVubmVyLnNoOiB0aHJpZnRfdGVzdF9jbGllbnQgdGhyaWZ0X3Rlc3Rfc2VydmVyIFwKKwl0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCisKK1RFU1RTID0gJChyYW5fdGVzdHMpCisKK3ByZWNyb3NzOiAkKHRhcmdldHMpCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNzY1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZApAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyBlbmZvcmNlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIGFzeW5jX3Rlc3Q7CisKK2ltcG9ydCBjb3JlLmF0b21pYzsKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uIDogQ29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleCA6IE11dGV4OworaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBUaHJlYWQsIFRocmVhZEdyb3VwOworaW1wb3J0IHN0ZC5jb252IDogdGV4dDsKK2ltcG9ydCBzdGQuZGF0ZXRpbWU7CitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogY29sbGVjdEV4Y2VwdGlvbiwgZW5mb3JjZTsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc20gOiBUYXNrUG9vbDsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgc3RkLnN0cmluZzsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OworaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNzbDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50X3Bvb2w7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNzbDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CisKK3ZlcnNpb24gKFBvc2l4KSB7CisgIGltcG9ydCBjb3JlLnN0ZGMuc2lnbmFsOworICBpbXBvcnQgY29yZS5zeXMucG9zaXguc2lnbmFsOworCisgIC8vIERpc2FibGUgU0lHUElQRSBiZWNhdXNlIFNTTCBzZXJ2ZXIgd2lsbCB3cml0ZSB0byBicm9rZW4gc29ja2V0IGFmdGVyCisgIC8vIGNsaWVudCBkaXNjb25uZWN0ZWQgKHNlZSBUU1NMU29ja2V0IGRvY3MpLgorICBzaGFyZWQgc3RhdGljIHRoaXMoKSB7CisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICB9Cit9CisKK2ludGVyZmFjZSBBc3luY1Rlc3QgeworICBzdHJpbmcgZWNobyhzdHJpbmcgdmFsdWUpOworICBzdHJpbmcgZGVsYXllZEVjaG8oc3RyaW5nIHZhbHVlLCBsb25nIG1pbGxpc2Vjb25kcyk7CisKKyAgdm9pZCBmYWlsKHN0cmluZyByZWFzb24pOworICB2b2lkIGRlbGF5ZWRGYWlsKHN0cmluZyByZWFzb24sIGxvbmcgbWlsbGlzZWNvbmRzKTsKKworICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgICAgVE1ldGhvZE1ldGEoImZhaWwiLCBbXSwgW1RFeGNlcHRpb25NZXRhKCJhdGUiLCAxLCAiQXN5bmNUZXN0RXhjZXB0aW9uIildKSwKKyAgICBUTWV0aG9kTWV0YSgiZGVsYXllZEZhaWwiLCBbXSwgW1RFeGNlcHRpb25NZXRhKCJhdGUiLCAxLCAiQXN5bmNUZXN0RXhjZXB0aW9uIildKQorICBdOworICBhbGlhcyAuQXN5bmNUZXN0RXhjZXB0aW9uIEFzeW5jVGVzdEV4Y2VwdGlvbjsKK30KKworY2xhc3MgQXN5bmNUZXN0RXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIHN0cmluZyByZWFzb247CisgIG1peGluIFRTdHJ1Y3RIZWxwZXJzISgpOworfQorCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICB1c2hvcnQgcG9ydCA9IDkwOTA7CisgIHVzaG9ydCBtYW5hZ2VyQ291bnQgPSAyOworICB1c2hvcnQgc2VydmVyc1Blck1hbmFnZXIgPSA1OworICB1c2hvcnQgdGhyZWFkc1BlclNlcnZlciA9IDEwOworICB1aW50IGl0ZXJhdGlvbnMgPSAxMDsKKyAgYm9vbCBzc2w7CisgIGJvb2wgdHJhY2U7CisKKyAgZ2V0b3B0KGFyZ3MsCisgICAgIml0ZXJhdGlvbnMiLCAmaXRlcmF0aW9ucywKKyAgICAibWFuYWdlcnMiLCAmbWFuYWdlckNvdW50LAorICAgICJwb3J0IiwgJnBvcnQsCisgICAgInNlcnZlcnMtcGVyLW1hbmFnZXIiLCAmc2VydmVyc1Blck1hbmFnZXIsCisgICAgInNzbCIsICZzc2wsCisgICAgInRocmVhZHMtcGVyLXNlcnZlciIsICZ0aHJlYWRzUGVyU2VydmVyLAorICAgICJ0cmFjZSIsICZ0cmFjZSwKKyAgKTsKKworICBUVHJhbnNwb3J0RmFjdG9yeSBjbGllbnRUcmFuc3BvcnRGYWN0b3J5OworICBUU1NMQ29udGV4dCBzZXJ2ZXJTU0xDb250ZXh0OworICBpZiAoc3NsKSB7CisgICAgYXV0byBjbGllbnRTU0xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CisgICAgd2l0aCAoY2xpZW50U1NMQ29udGV4dCkgeworICAgICAgY2lwaGVycyA9ICJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiOworICAgICAgYXV0aGVudGljYXRlID0gdHJ1ZTsKKyAgICAgIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCIuL3RydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtIik7CisgICAgfQorICAgIGNsaWVudFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEFzeW5jU1NMU29ja2V0RmFjdG9yeShjbGllbnRTU0xDb250ZXh0KTsKKworICAgIHNlcnZlclNTTENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKKyAgICB3aXRoIChzZXJ2ZXJTU0xDb250ZXh0KSB7CisgICAgICBzZXJ2ZXJTaWRlID0gdHJ1ZTsKKyAgICAgIGxvYWRDZXJ0aWZpY2F0ZSgiLi9zZXJ2ZXItY2VydGlmaWNhdGUucGVtIik7CisgICAgICBsb2FkUHJpdmF0ZUtleSgiLi9zZXJ2ZXItcHJpdmF0ZS1rZXkucGVtIik7CisgICAgICBjaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CisgICAgfQorICB9IGVsc2UgeworICAgIGNsaWVudFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgfQorCisKKyAgYXV0byBzZXJ2ZXJDYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKyAgc2NvcGUoZXhpdCkgeworICAgIHdyaXRlbG4oIlRyaWdnZXJpbmcgc2VydmVyIHNodXRkb3duLi4uIik7CisgICAgc2VydmVyQ2FuY2VsLnRyaWdnZXIoKTsKKyAgICB3cml0ZWxuKCJkb25lLiIpOworICB9CisKKyAgYXV0byBtYW5hZ2VycyA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXJbbWFuYWdlckNvdW50XTsKKyAgc2NvcGUgKGV4aXQpIGZvcmVhY2ggKHJlZiBtOyBtYW5hZ2VycykgZGVzdHJveShtKTsKKworICBhdXRvIGNsaWVudHNUaHJlYWRzID0gbmV3IFRocmVhZEdyb3VwOworICBmb3JlYWNoIChtYW5hZ2VySW5kZXgsIHJlZiBtYW5hZ2VyOyBtYW5hZ2VycykgeworICAgIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICAgIGZvcmVhY2ggKHNlcnZlckluZGV4OyAwIC4uIHNlcnZlcnNQZXJNYW5hZ2VyKSB7CisgICAgICBhdXRvIGN1cnJlbnRQb3J0ID0gY2FzdCh1c2hvcnQpCisgICAgICAgIChwb3J0ICsgbWFuYWdlckluZGV4ICogc2VydmVyc1Blck1hbmFnZXIgKyBzZXJ2ZXJJbmRleCk7CisKKyAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgYW5kIHdhaXQgdW50aWwgaXQgaXMgdXAgYW5kIHJ1bm5pbmcuCisgICAgICBhdXRvIHNlcnZpbmdNdXRleCA9IG5ldyBNdXRleDsKKyAgICAgIGF1dG8gc2VydmluZ0NvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oc2VydmluZ011dGV4KTsKKyAgICAgIGF1dG8gaGFuZGxlciA9IG5ldyBQcmVTZXJ2ZU5vdGlmeUhhbmRsZXIoc2VydmluZ011dGV4LCBzZXJ2aW5nQ29uZGl0aW9uKTsKKyAgICAgIHN5bmNocm9uaXplZCAoc2VydmluZ011dGV4KSB7CisgICAgICAgIChuZXcgU2VydmVyVGhyZWFkIVRTaW1wbGVTZXJ2ZXIoY3VycmVudFBvcnQsIHNlcnZlclNTTENvbnRleHQsIHRyYWNlLAorICAgICAgICAgIHNlcnZlckNhbmNlbCwgaGFuZGxlcikpLnN0YXJ0KCk7CisgICAgICAgIHNlcnZpbmdDb25kaXRpb24ud2FpdCgpOworICAgICAgfQorCisgICAgICAvLyBXZSBvbmx5IHJ1biB0aGUgdGltaW5nIHRlc3RzIGZvciB0aGUgZmlyc3Qgc2VydmVyIG9uIGVhY2ggYXN5bmMKKyAgICAgIC8vIG1hbmFnZXIsIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHNwdXJpb3VzIHRpbWluZyBlcnJvcnMgYmVjYXVlIG9mCisgICAgICAvLyBvcmRlcmluZyBpc3N1ZXMuCisgICAgICBhdXRvIHJ1blRpbWluZ1Rlc3RzID0gKHNlcnZlckluZGV4ID09IDApOworCisgICAgICBhdXRvIGMgPSBuZXcgQ2xpZW50c1RocmVhZChtYW5hZ2VyLCBjdXJyZW50UG9ydCwgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgdGhyZWFkc1BlclNlcnZlciwgaXRlcmF0aW9ucywgcnVuVGltaW5nVGVzdHMsIHRyYWNlKTsKKyAgICAgIGNsaWVudHNUaHJlYWRzLmFkZChjKTsKKyAgICAgIGMuc3RhcnQoKTsKKyAgICB9CisgIH0KKyAgY2xpZW50c1RocmVhZHMuam9pbkFsbCgpOworfQorCitjbGFzcyBBc3luY1Rlc3RIYW5kbGVyIDogQXN5bmNUZXN0IHsKKyAgdGhpcyhib29sIHRyYWNlKSB7CisgICAgdHJhY2VfID0gdHJhY2U7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgZWNobyhzdHJpbmcgdmFsdWUpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgZWNobygiJXMiKWAsIHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgZGVsYXllZEVjaG8oc3RyaW5nIHZhbHVlLCBsb25nIG1pbGxpc2Vjb25kcykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZihgZGVsYXllZEVjaG8oIiVzIiwgJXMgbXMpLi4uIGAsIHZhbHVlLCBtaWxsaXNlY29uZHMpOworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIihtaWxsaXNlY29uZHMpKTsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJyZXR1cm5pbmcuIik7CisKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZhaWwoc3RyaW5nIHJlYXNvbikgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBmYWlsKCIlcyIpYCwgcmVhc29uKTsKKyAgICBhdXRvIGF0ZSA9IG5ldyBBc3luY1Rlc3RFeGNlcHRpb247CisgICAgYXRlLnJlYXNvbiA9IHJlYXNvbjsKKyAgICB0aHJvdyBhdGU7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGRlbGF5ZWRGYWlsKHN0cmluZyByZWFzb24sIGxvbmcgbWlsbGlzZWNvbmRzKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmKGBkZWxheWVkRmFpbCgiJXMiLCAlcyBtcykuLi4gYCwgcmVhc29uLCBtaWxsaXNlY29uZHMpOworICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIihtaWxsaXNlY29uZHMpKTsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJyZXR1cm5pbmcuIik7CisKKyAgICBhdXRvIGF0ZSA9IG5ldyBBc3luY1Rlc3RFeGNlcHRpb247CisgICAgYXRlLnJlYXNvbiA9IHJlYXNvbjsKKyAgICB0aHJvdyBhdGU7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCB0cmFjZV87CisgIEFzeW5jVGVzdEV4Y2VwdGlvbiBhdGVfOworfQorCitjbGFzcyBQcmVTZXJ2ZU5vdGlmeUhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgdGhpcyhNdXRleCBzZXJ2aW5nTXV0ZXgsIENvbmRpdGlvbiBzZXJ2aW5nQ29uZGl0aW9uKSB7CisgICAgc2VydmluZ011dGV4XyA9IHNlcnZpbmdNdXRleDsKKyAgICBzZXJ2aW5nQ29uZGl0aW9uXyA9IHNlcnZpbmdDb25kaXRpb247CisgIH0KKworICB2b2lkIHByZVNlcnZlKCkgeworICAgIHN5bmNocm9uaXplZCAoc2VydmluZ011dGV4XykgeworICAgICAgc2VydmluZ0NvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgfQorICB9CisgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsgcmV0dXJuIFZhcmlhbnQuaW5pdDsgfQorICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHt9CisgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7fQorCitwcml2YXRlOgorICBNdXRleCBzZXJ2aW5nTXV0ZXhfOworICBDb25kaXRpb24gc2VydmluZ0NvbmRpdGlvbl87Cit9CisKK2NsYXNzIFNlcnZlclRocmVhZChTZXJ2ZXJUeXBlKSA6IFRocmVhZCB7CisgIHRoaXModXNob3J0IHBvcnQsIFRTU0xDb250ZXh0IHNzbENvbnRleHQsIGJvb2wgdHJhY2UsCisgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24sIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyCisgICkgeworICAgIHBvcnRfID0gcG9ydDsKKyAgICBzc2xDb250ZXh0XyA9IHNzbENvbnRleHQ7CisgICAgdHJhY2VfID0gdHJhY2U7CisgICAgY2FuY2VsbGF0aW9uXyA9IGNhbmNlbGxhdGlvbjsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworCisgICAgc3VwZXIoJnJ1bik7CisgIH0KKworICB2b2lkIHJ1bigpIHsKKyAgICBUU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKyAgICBpZiAoc3NsQ29udGV4dF8pIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBUU1NMU2VydmVyU29ja2V0KHBvcnRfLCBzc2xDb250ZXh0Xyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnRfKTsKKyAgICB9CisgICAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsKKyAgICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciFBc3luY1Rlc3QobmV3IEFzeW5jVGVzdEhhbmRsZXIodHJhY2VfKSk7CisKKyAgICBhdXRvIHNlcnZlciA9IG5ldyBTZXJ2ZXJUeXBlKHByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXJ2ZXIuZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyXzsKKworICAgIHdyaXRlZmxuKCJTdGFydGluZyBzZXJ2ZXIgb24gcG9ydCAlcy4uLiIsIHBvcnRfKTsKKyAgICBzZXJ2ZXIuc2VydmUoY2FuY2VsbGF0aW9uXyk7CisgICAgd3JpdGVmbG4oIlNlcnZlciB0aHJlYWQgb24gcG9ydCAlcyBkb25lLiIsIHBvcnRfKTsKKyAgfQorCitwcml2YXRlOgorICB1c2hvcnQgcG9ydF87CisgIGJvb2wgdHJhY2VfOworICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbl87CisgIFRTU0xDb250ZXh0IHNzbENvbnRleHRfOworICBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcl87Cit9CisKK2NsYXNzIENsaWVudHNUaHJlYWQgOiBUaHJlYWQgeworICB0aGlzKFRBc3luY1NvY2tldE1hbmFnZXIgbWFuYWdlciwgdXNob3J0IHBvcnQsIFRUcmFuc3BvcnRGYWN0b3J5IHRmLAorICAgIHVzaG9ydCB0aHJlYWRzLCB1aW50IGl0ZXJhdGlvbnMsIGJvb2wgcnVuVGltaW5nVGVzdHMsIGJvb2wgdHJhY2UKKyAgKSB7CisgICAgbWFuYWdlcl8gPSBtYW5hZ2VyOworICAgIHBvcnRfID0gcG9ydDsKKyAgICB0cmFuc3BvcnRGYWN0b3J5XyA9IHRmOworICAgIHRocmVhZHNfID0gdGhyZWFkczsKKyAgICBpdGVyYXRpb25zXyA9IGl0ZXJhdGlvbnM7CisgICAgcnVuVGltaW5nVGVzdHNfID0gcnVuVGltaW5nVGVzdHM7CisgICAgdHJhY2VfID0gdHJhY2U7CisgICAgc3VwZXIoJnJ1bik7CisgIH0KKworICB2b2lkIHJ1bigpIHsKKyAgICBhdXRvIHRyYW5zcG9ydCA9IG5ldyBUQXN5bmNTb2NrZXQobWFuYWdlcl8sICJsb2NhbGhvc3QiLCBwb3J0Xyk7CisKKyAgICB7CisgICAgICBhdXRvIGNsaWVudCA9IG5ldyBUQXN5bmNDbGllbnQhQXN5bmNUZXN0KAorICAgICAgICB0cmFuc3BvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnlfLAorICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKQorICAgICAgKTsKKyAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICBhdXRvIGNsaWVudFRocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXA7CisgICAgICBmb3JlYWNoIChjbGllbnRJZDsgMCAuLiB0aHJlYWRzXykgeworICAgICAgICBjbGllbnRUaHJlYWRzLmNyZWF0ZSh7CisgICAgICAgICAgYXV0byBjID0gY2xpZW50SWQ7CisgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKGk7IDAgLi4gaXRlcmF0aW9uc18pIHsKKyAgICAgICAgICAgICAgaW1tdXRhYmxlIGlkID0gdGV4dChwb3J0XywgIjoiLCBjLCAiOiIsIGkpOworCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBlY2hvKCIlcyIpLi4uIGAsIGlkKTsKKyAgICAgICAgICAgICAgICBhdXRvIGEgPSBjbGllbnQuZWNobyhpZCk7CisgICAgICAgICAgICAgICAgZW5mb3JjZShhID09IGlkKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgZWNobygiJXMiKSBkb25lLmAsIGlkKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBmYWlsKCIlcyIpLi4uIGAsIGlkKTsKKyAgICAgICAgICAgICAgICBhdXRvIGEgPSBjYXN0KEFzeW5jVGVzdEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKGNsaWVudC5mYWlsKGlkKS53YWl0R2V0KCkpOworICAgICAgICAgICAgICAgIGVuZm9yY2UoYSAmJiBhLnJlYXNvbiA9PSBpZCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYGZhaWwoIiVzIikgZG9uZS5gLCBpZCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9KCkpOworICAgICAgfQorICAgICAgY2xpZW50VGhyZWFkcy5qb2luQWxsKCk7CisgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBpZiAocnVuVGltaW5nVGVzdHNfKSB7CisgICAgICBhdXRvIGNsaWVudCA9IG5ldyBUQXN5bmNDbGllbnQhQXN5bmNUZXN0KAorICAgICAgICB0cmFuc3BvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnlfLAorICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSFUQnVmZmVyZWRUcmFuc3BvcnQKKyAgICAgICk7CisKKyAgICAgIC8vIFRlbXBvcmFyaWx5IHJlZGlyZWN0IGVycm9yIGxvZ3MgdG8gc3Rkb3V0LCBhcyBTU0wgZXJyb3JzIG9uIHRoZSBzZXJ2ZXIKKyAgICAgIC8vIHNpZGUgYXJlIGV4cGVjdGVkIHdoZW4gdGhlIGNsaWVudCB0ZXJtaW5hdGVzIGFidXJwdGx5IChhcyBpcyB0aGUgY2FzZQorICAgICAgLy8gaW4gdGhlIHRpbWVvdXQgdGVzdCkuCisgICAgICBhdXRvIG9sZEVycm9yTG9nU2luayA9IGdfZXJyb3JMb2dTaW5rOworICAgICAgZ19lcnJvckxvZ1NpbmsgPSBnX2luZm9Mb2dTaW5rOworICAgICAgc2NvcGUgKGV4aXQpIGdfZXJyb3JMb2dTaW5rID0gb2xkRXJyb3JMb2dTaW5rOworCisgICAgICBmb3JlYWNoIChpOyAwIC4uIGl0ZXJhdGlvbnNfKSB7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICAgICAgaW1tdXRhYmxlIGlkID0gdGV4dChwb3J0XywgIjoiLCBpKTsKKworICAgICAgICB7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZGVsYXllZEVjaG8oIiVzIiwgMTAwIG1zKS4uLmAsIGlkKTsKKyAgICAgICAgICBhdXRvIGEgPSBjbGllbnQuZGVsYXllZEVjaG8oaWQsIDEwMCk7CisgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgYS5nZXQoKSwgIiwgIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBhLmdldCgpLCAiLCAiLCBpZCwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoYS5jb21wbGV0aW9uLndhaXQoZHVyISJtc2VjcyIoMjAwKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgZGlkbid0IHN1Y2NlZWQgYXMgZXhwZWN0ZWQgKCIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZShhLmdldCgpID09IGlkKTsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgLi4uIGRlbGF5ZWRFY2hvKCIlcyIpIGRvbmUuYCwgaWQpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBDYWxsaW5nIGRlbGF5ZWRGYWlsKCIlcyIsIDEwMCBtcykuLi4gYCwgaWQpOworICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5kZWxheWVkRmFpbChpZCwgMTAwKTsKKyAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBpZCwgIiwgIiwgY29sbGVjdEV4Y2VwdGlvbihhLmdldCgpKSwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGlkLCAiLCAiLCBjb2xsZWN0RXhjZXB0aW9uKGEuZ2V0KCkpLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZShhLmNvbXBsZXRpb24ud2FpdChkdXIhIm1zZWNzIigyMDApKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBkaWRuJ3Qgc3VjY2VlZCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBhdXRvIGUgPSBjYXN0KEFzeW5jVGVzdEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKGEuZ2V0KCkpOworICAgICAgICAgIGVuZm9yY2UoZSAmJiBlLnJlYXNvbiA9PSBpZCk7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYC4uLiBkZWxheWVkRmFpbCgiJXMiKSBkb25lLmAsIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICB0cmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhIm1zZWNzIig1MCk7CisKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZShgQ2FsbGluZyBkZWxheWVkRWNobygic29ja2V0VGltZW91dCIsIDEwMCBtcykuLi4gYCk7CisgICAgICAgICAgYXV0byBhID0gY2xpZW50LmRlbGF5ZWRFY2hvKCJzb2NrZXRUaW1lb3V0IiwgMTAwKTsKKyAgICAgICAgICBhdXRvIGUgPSBjYXN0KFRUcmFuc3BvcnRFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihhLndhaXRHZXQoKSk7CisgICAgICAgICAgZW5mb3JjZShlLCB0ZXh0KCJPcGVyYXRpb24gZGlkbid0IGZhaWwgYXMgZXhwZWN0ZWQgKCIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZShlLnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlRJTUVEX09VVCwKKyAgICAgICAgICAgIHRleHQoIldyb25nIHRpbWVvdXQgZXhjZXB0aW9uIHR5cGUgKCIsIGlkLCAiKTogIiwgZSkpOworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oYHRpbWVkIG91dCBhcyBleHBlY3RlZC5gKTsKKworICAgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIHNlcnZlciB0aHJlYWQgcmVzZXQgYmVmb3JlIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgICAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICAgICAgICB0cmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhImhuc2VjcyIoMCk7CisgICAgICAgIH0KKworICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZWZsbigiQ2xpZW50cyB0aHJlYWQgZm9yIHBvcnQgJXMgZG9uZS4iLCBwb3J0Xyk7CisgIH0KKworICBUQXN5bmNTb2NrZXRNYW5hZ2VyIG1hbmFnZXJfOworICB1c2hvcnQgcG9ydF87CisgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnlfOworICB1c2hvcnQgdGhyZWFkc187CisgIHVpbnQgaXRlcmF0aW9uc187CisgIGJvb2wgcnVuVGltaW5nVGVzdHNfOworICBib29sIHRyYWNlXzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2ggYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkNTA3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKworIyBSdW5zIHRoZSBhc3luYyB0ZXN0IGluIGJvdGggU1NMIGFuZCBub24tU1NMIG1vZGUuCiske0NVUn0vYXN5bmNfdGVzdCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKK2VjaG8gIk5vbi1TU0wgdGVzdHMgZG9uZS4iCiske0NVUn0vYXN5bmNfdGVzdCAtLXNzbCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKK2VjaG8gIlNTTCB0ZXN0cyBkb25lLiIKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0Yzk3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgY2xpZW50X3Bvb2xfdGVzdDsKKworaW1wb3J0IGNvcmUuc3luYy5zZW1hcGhvcmUgOiBTZW1hcGhvcmU7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworaW1wb3J0IHN0ZC5hcnJheTsKK2ltcG9ydCBzdGQuY29udjsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLnJhbmdlOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQudHlwZWNvbnM7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5saWJldmVudDsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuc29ja2V0OworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudF9wb29sOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnRfcG9vbDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKK2ltcG9ydCB0aHJpZnQudXRpbC5mdXR1cmU7CisKKy8vIFdlIHVzZSB0aGlzIGFzIG91ciBSUEMtbGF5ZXIgZXhjZXB0aW9uIGhlcmUgdG8gbWFrZSBzdXJlIHNvY2tldC/igKYgcHJvYmxlbXMKKy8vICh0aGF0IHdvdWxkIHVzdWFsbHkgY29uc2lkZXJlZCB0byBiZSBSUEMgbGF5ZXIgZmF1bHRzKSBjYXVzZSB0aGUgdGVzdHMgdG8KKy8vIGZhaWwsIGV2ZW4gdGhvdWdoIHdlIGFyZSB0ZXN0aW5nIHRoZSBSUEMgZXhjZXB0aW9uIGhhbmRsaW5nLgorY2xhc3MgVGVzdFNlcnZpY2VFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgaW50IHBvcnQ7Cit9CisKK2ludGVyZmFjZSBUZXN0U2VydmljZSB7CisgIGludCBnZXRQb3J0KCk7CisgIGFsaWFzIC5UZXN0U2VydmljZUV4Y2VwdGlvbiBUZXN0U2VydmljZUV4Y2VwdGlvbjsKKyAgZW51bSBtZXRob2RNZXRhID0gW1RNZXRob2RNZXRhKCJnZXRQb3J0IiwgW10sCisgICAgW1RFeGNlcHRpb25NZXRhKCJhIiwgMSwgIlRlc3RTZXJ2aWNlRXhjZXB0aW9uIildKV07Cit9CisKKy8vIFVzZSBzb21lIGRlcml2ZWQgc2VydmljZSwganVzdCB0byBjaGVjayB0aGF0IHRoZSBwb29scyBoYW5kbGUgaW5oZXJpdGFuY2UKKy8vIGNvcnJlY3RseS4KK2ludGVyZmFjZSBFeFRlc3RTZXJ2aWNlIDogVGVzdFNlcnZpY2UgeworICBpbnRbXSBnZXRQb3J0SW5BcnJheSgpOworICBlbnVtIG1ldGhvZE1ldGEgPSBbVE1ldGhvZE1ldGEoImdldFBvcnRJbkFycmF5IiwgW10sCisgICAgW1RFeGNlcHRpb25NZXRhKCJhIiwgMSwgIlRlc3RTZXJ2aWNlRXhjZXB0aW9uIildKV07Cit9CisKK2NsYXNzIEV4VGVzdEhhbmRsZXIgOiBFeFRlc3RTZXJ2aWNlIHsKKyAgdGhpcyh1c2hvcnQgcG9ydCwgRHVyYXRpb24gZGVsYXksIGJvb2wgZmFpbGluZywgYm9vbCB0cmFjZSkgeworICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgdGhpcy5kZWxheSA9IGRlbGF5OworICAgIHRoaXMuZmFpbGluZyA9IGZhaWxpbmc7CisgICAgdGhpcy50cmFjZSA9IHRyYWNlOworICB9CisKKyAgb3ZlcnJpZGUgaW50IGdldFBvcnQoKSB7CisgICAgaWYgKHRyYWNlKSB7CisgICAgICBzdGRlcnIud3JpdGVmbG4oImdldFBvcnQoKSBjYWxsZWQgb24gJXMgKGRlbGF5OiAlcywgZmFpbGluZzogJXMpIiwgcG9ydCwKKyAgICAgICAgZGVsYXksIGZhaWxpbmcpOworICAgIH0KKyAgICBzbGVlcCgpOworICAgIGZhaWxJZkVuYWJsZWQoKTsKKyAgICByZXR1cm4gcG9ydDsKKyAgfQorCisgIG92ZXJyaWRlIGludFtdIGdldFBvcnRJbkFycmF5KCkgeworICAgIHJldHVybiBbZ2V0UG9ydCgpXTsKKyAgfQorCisgIHVzaG9ydCBwb3J0OworICBEdXJhdGlvbiBkZWxheTsKKyAgYm9vbCBmYWlsaW5nOworICBib29sIHRyYWNlOworCitwcml2YXRlOgorICB2b2lkIHNsZWVwKCkgeworICAgIGlmIChkZWxheSA+IGR1ciEiaG5zZWNzIigwKSkgVGhyZWFkLnNsZWVwKGRlbGF5KTsKKyAgfQorCisgIHZvaWQgZmFpbElmRW5hYmxlZCgpIHsKKyAgICBpZiAoIWZhaWxpbmcpIHJldHVybjsKKworICAgIGF1dG8gZSA9IG5ldyBUZXN0U2VydmljZUV4Y2VwdGlvbjsKKyAgICBlLnBvcnQgPSBwb3J0OworICAgIHRocm93IGU7CisgIH0KK30KKworY2xhc3MgU2VydmVyUHJlU2VydmVIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIHRoaXMoU2VtYXBob3JlIHNlbSkgeworICAgIHNlbV8gPSBzZW07CisgIH0KKworICBvdmVycmlkZSB2b2lkIHByZVNlcnZlKCkgeworICAgIHNlbV8ubm90aWZ5KCk7CisgIH0KKworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7fQorICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkge30KKworcHJpdmF0ZToKKyAgU2VtYXBob3JlIHNlbV87Cit9CisKK2NsYXNzIFNlcnZlclRocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoRXhUZXN0SGFuZGxlciBoYW5kbGVyLCBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgc2VydmVySGFuZGxlciwgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24pIHsKKyAgICBzdXBlcigmcnVuKTsKKyAgICBoYW5kbGVyXyA9IGhhbmRsZXI7CisgICAgY2FuY2VsbGF0aW9uXyA9IGNhbmNlbGxhdGlvbjsKKyAgICBzZXJ2ZXJIYW5kbGVyXyA9IHNlcnZlckhhbmRsZXI7CisgIH0KK3ByaXZhdGU6CisgIHZvaWQgcnVuKCkgeworICAgIHRyeSB7CisgICAgICBhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOworICAgICAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhRXhUZXN0U2VydmljZShoYW5kbGVyXyk7CisgICAgICBhdXRvIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KGhhbmRsZXJfLnBvcnQpOworICAgICAgc2VydmVyVHJhbnNwb3J0LnJlY3ZUaW1lb3V0ID0gZHVyISJzZWNvbmRzIigzKTsKKyAgICAgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworCisgICAgICBhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgc2VydmVyLmV2ZW50SGFuZGxlciA9IHNlcnZlckhhbmRsZXJfOworICAgICAgc2VydmVyLnNlcnZlKGNhbmNlbGxhdGlvbl8pOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB3cml0ZWZsbigiU2VydmVyIHRocmVhZCBvbiBwb3J0ICVzIGZhaWxlZDogJXMiLCBoYW5kbGVyXy5wb3J0LCBlKTsKKyAgICB9CisgIH0KKworICBFeFRlc3RIYW5kbGVyIGhhbmRsZXJfOworICBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgc2VydmVySGFuZGxlcl87CisgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKK30KKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgYm9vbCB0cmFjZTsKKyAgdXNob3J0IHBvcnQgPSA5MDkwOworICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInRyYWNlIiwgJnRyYWNlKTsKKworICBhdXRvIHNlcnZlckNhbmNlbGxhdGlvbiA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworICBzY29wZSAoZXhpdCkgc2VydmVyQ2FuY2VsbGF0aW9uLnRyaWdnZXIoKTsKKworICBpbW11dGFibGUgcG9ydHMgPSBjYXN0KGltbXV0YWJsZSlhcnJheShtYXAhImNhc3QodXNob3J0KWEiKGlvdGEocG9ydCwgcG9ydCArIDYpKSk7CisKKyAgLy8gc2VtYXBob3JlIHRoYXQgd2lsbCBiZSBpbmNyZW1lbnRlZCB3aGVuZXZlciBlYWNoIHNlcnZlciB0aHJlYWQgaGFzIGJvdW5kIGFuZCBzdGFydGVkIGxpc3RlbmluZworICBTZW1hcGhvcmUgc2VtID0gbmV3IFNlbWFwaG9yZSgwKTsKKwordmVyc2lvbiAobm9uZSkgeworICAvLyBDYW5ub3QgdXNlIHRoaXMgZHVlIHRvIG11bHRpcGxlIERNRCBAQEJVR0BAczoKKyAgLy8gMS4gwrtmdW5jdGlvbiBEIG1haW4gaXMgYSBuZXN0ZWQgZnVuY3Rpb24gYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGFycmF5wqsKKyAgLy8gICAgd2hlbiBjYWxsaW5nIGFycmF5KCkgb24gdGhlIHJlc3VsdCBvZiB0aGUgb3V0ZXIgbWFwKCkg4oCTIHdvdWxkIGhhdmUgdG8KKyAgLy8gICAgbWFudWFsbHkgZG8gdGhlIGVhZ2VyIGV2YWx1YXRpb24vYXJyYXkgY29udmVyc2lvbi4KKyAgLy8gMi4gwrtaaXAub3BTbGljZSBjYW5ub3QgZ2V0IGZyYW1lIHBvaW50ZXIgdG8gbWFwwqsgZm9yIHRoZSBkZWxheSBhcmd1bWVudCwKKyAgLy8gICAgY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgY2FsbGluZyBhcnJheSgpIG9uIHRoZSBtYXAgcmVzdWx0IGZpcnN0LgorICAvLyAzLiBFdmVuIHdoZW4gdXNpbmcgdGhlIHdvcmthcm91bmRzIGZvciB0aGUgbGFzdCB0d28gcG9pbnRzLCB0aGUgRE1ELWJ1aWx0CisgIC8vICAgIGV4ZWN1dGFibGUgY3Jhc2hlcyB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgKHNpYyEpIGlubGluaW5nIGVuYWJsZWQsCisgIC8vICAgIHRoZSBiYWNrdHJhY2UgcG9pbnRzIGludG8gdGhlIGZpcnN0IGRlbGVnYXRlIGxpdGVyYWwuCisgIGF1dG8gaGFuZGxlcnMgPSBhcnJheShtYXAhKChhcmdzKXsKKyAgICByZXR1cm4gbmV3IEV4VGVzdEhhbmRsZXIoYXJncy5fMCwgYXJncy5fMSwgYXJncy5fMiwgdHJhY2UpOworICB9KSh6aXAoCisgICAgcG9ydHMsCisgICAgbWFwISgoYSl7IHJldHVybiBkdXIhYG1zZWNzYChhKTsgfSkoWzEsIDEwLCAxMDAsIDEsIDEwLCAxMDBdKSwKKyAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0KKyAgKSkpOworfSBlbHNlIHsKKyAgYXV0byBoYW5kbGVycyA9IFsKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDApLCBkdXIhIm1zZWNzIigxKSwgZmFsc2UsIHRyYWNlKSwKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDEpLCBkdXIhIm1zZWNzIigxMCksIGZhbHNlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyAyKSwgZHVyISJtc2VjcyIoMTAwKSwgZmFsc2UsIHRyYWNlKSwKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDMpLCBkdXIhIm1zZWNzIigxKSwgdHJ1ZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgNCksIGR1ciEibXNlY3MiKDEwKSwgdHJ1ZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgNSksIGR1ciEibXNlY3MiKDEwMCksIHRydWUsIHRyYWNlKQorICBdOworfQorCisgIC8vIEZpcmUgdXAgdGhlIHNlcnZlciB0aHJlYWRzLgorICBmb3JlYWNoIChoOyBoYW5kbGVycykgKG5ldyBTZXJ2ZXJUaHJlYWQoaCwgbmV3IFNlcnZlclByZVNlcnZlSGFuZGxlcihzZW0pLCBzZXJ2ZXJDYW5jZWxsYXRpb24pKS5zdGFydCgpOworCisgIC8vIHdhaXQgdW50aWwgYWxsIHRoZSBoYW5kbGVycyBzaWduYWwgdGhhdCB0aGV5J3JlIHJlYWR5IHRvIHNlcnZlCisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAoc2VtLndhaXQoZHVyIWBzZWNvbmRzYCgxKSkpOworCisgIHN5bmNDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOworICBhc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CisgIGFzeW5jRmFzdGVzdENsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CisgIGFzeW5jQWdncmVnYXRvclRlc3QocG9ydHMsIGhhbmRsZXJzKTsKK30KKworCit2b2lkIHN5bmNDbGllbnRQb29sVGVzdChjb25zdCh1c2hvcnQpW10gcG9ydHMsIEV4VGVzdEhhbmRsZXJbXSBoYW5kbGVycykgeworICBhdXRvIGNsaWVudHMgPSBhcnJheShtYXAhKChhKXsKKyAgICByZXR1cm4gY2FzdChUQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlKXRDbGllbnQhRXhUZXN0U2VydmljZSgKKyAgICAgIHRCaW5hcnlQcm90b2NvbChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgYSkpCisgICAgKTsKKyAgfSkocG9ydHMpKTsKKworICBzY29wZShleGl0KSBmb3JlYWNoIChjOyBjbGllbnRzKSBjLm91dHB1dFByb3RvY29sLnRyYW5zcG9ydC5jbG9zZSgpOworCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSB0aGUgZmlyc3QgY2xpZW50IHN1Y2NlZWRzLgorICB7CisgICAgZW5mb3JjZShtYWtlUG9vbChjbGllbnRzKS5nZXRQb3J0KCkgPT0gcG9ydHNbMF0pOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIGFsbCBjbGllbnRzIGZhaWwuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlUG9vbChjbGllbnRzWzMgLi4gJF0pOworICAgIGF1dG8gZSA9IGNhc3QoVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocG9vbC5nZXRQb3J0KCkpOworICAgIGVuZm9yY2UoZSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKWUuZXhjZXB0aW9ucyksCisgICAgICBwb3J0c1szIC4uICRdKSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGNsaWVudHMgZmFpbCwgYnV0IGEgbGF0ZXIgb25lIHN1Y2NlZWRzLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZVBvb2woY2xpZW50c1szIC4uICRdIH4gY2xpZW50c1swIC4uIDNdKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydEluQXJyYXkoKSA9PSBbcG9ydHNbMF1dKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBhIGNsaWVudCBpcyBwcm9wZXJseSBkZWFjdGl2YXRlZCB3aGVuIGl0IGhhcyBmYWlsZWQgdG9vIG9mdGVuLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZVBvb2woY2xpZW50cyk7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDE7CisgICAgcG9vbC5mYXVsdERpc2FibGVEdXJhdGlvbiA9IGR1ciEibXNlY3MiKDUwKTsKKworICAgIGhhbmRsZXJzWzBdLmZhaWxpbmcgPSB0cnVlOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0KCkgPT0gcG9ydHNbMV0pOworCisgICAgaGFuZGxlcnNbMF0uZmFpbGluZyA9IGZhbHNlOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0KCkgPT0gcG9ydHNbMV0pOworCisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDUwKSk7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1swXSk7CisgIH0KK30KKworYXV0byBtYWtlUG9vbChUQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlW10gY2xpZW50cykgeworICBhdXRvIHAgPSB0Q2xpZW50UG9vbChjbGllbnRzKTsKKyAgcC5wZXJtdXRlQ2xpZW50cyA9IGZhbHNlOworICBwLnJwY0ZhdWx0RmlsdGVyID0gKEV4Y2VwdGlvbiBlKSB7CisgICAgcmV0dXJuIChjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uKWUgIWlzIG51bGwpOworICB9OworICByZXR1cm4gcDsKK30KKworCit2b2lkIGFzeW5jQ2xpZW50UG9vbFRlc3QoY29uc3QodXNob3J0KVtdIHBvcnRzLCBFeFRlc3RIYW5kbGVyW10gaGFuZGxlcnMpIHsKKyAgYXV0byBtYW5hZ2VyID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlcjsKKyAgc2NvcGUgKGV4aXQpIG1hbmFnZXIuc3RvcChkdXIhImhuc2VjcyIoMCkpOworCisgIGF1dG8gY2xpZW50cyA9IG1ha2VBc3luY0NsaWVudHMobWFuYWdlciwgcG9ydHMpOworICBzY29wZShleGl0KSBmb3JlYWNoIChjOyBjbGllbnRzKSBjLnRyYW5zcG9ydC5jbG9zZSgpOworCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSB0aGUgZmlyc3QgY2xpZW50IHN1Y2NlZWRzLgorICB7CisgICAgZW5mb3JjZShtYWtlQXN5bmNQb29sKGNsaWVudHMpLmdldFBvcnQoKSA9PSBwb3J0c1swXSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgYWxsIGNsaWVudHMgZmFpbC4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY1Bvb2woY2xpZW50c1szIC4uICRdKTsKKyAgICBhdXRvIGUgPSBjYXN0KFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHBvb2wuZ2V0UG9ydCgpLndhaXRHZXQoKSk7CisgICAgZW5mb3JjZShlKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pZS5leGNlcHRpb25zKSwKKyAgICAgIHBvcnRzWzMgLi4gJF0pKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSB0aGUgZmlyc3QgY2xpZW50cyBmYWlsLCBidXQgYSBsYXRlciBvbmUgc3VjY2VlZHMuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlQXN5bmNQb29sKGNsaWVudHNbMyAuLiAkXSB+IGNsaWVudHNbMCAuLiAzXSk7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnRJbkFycmF5KCkgPT0gW3BvcnRzWzBdXSk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgYSBjbGllbnQgaXMgcHJvcGVybHkgZGVhY3RpdmF0ZWQgd2hlbiBpdCBoYXMgZmFpbGVkIHRvbyBvZnRlbi4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY1Bvb2woY2xpZW50cyk7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDE7CisgICAgcG9vbC5mYXVsdERpc2FibGVEdXJhdGlvbiA9IGR1ciEibXNlY3MiKDUwKTsKKworICAgIGhhbmRsZXJzWzBdLmZhaWxpbmcgPSB0cnVlOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0KCkgPT0gcG9ydHNbMV0pOworCisgICAgaGFuZGxlcnNbMF0uZmFpbGluZyA9IGZhbHNlOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0KCkgPT0gcG9ydHNbMV0pOworCisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDUwKSk7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1swXSk7CisgIH0KK30KKworYXV0byBtYWtlQXN5bmNQb29sKFRBc3luY0NsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdIGNsaWVudHMpIHsKKyAgYXV0byBwID0gdEFzeW5jQ2xpZW50UG9vbChjbGllbnRzKTsKKyAgcC5wZXJtdXRlQ2xpZW50cyA9IGZhbHNlOworICBwLnJwY0ZhdWx0RmlsdGVyID0gKEV4Y2VwdGlvbiBlKSB7CisgICAgcmV0dXJuIChjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uKWUgIWlzIG51bGwpOworICB9OworICByZXR1cm4gcDsKK30KKworYXV0byBtYWtlQXN5bmNDbGllbnRzKFRMaWJldmVudEFzeW5jTWFuYWdlciBtYW5hZ2VyLCBpbiB1c2hvcnRbXSBwb3J0cykgeworICAvLyBETUQgQEBCVUdAQCB3b3JrYXJvdW5kOiBVc2luZyBhcnJheSBvbiB0aGUgbGF6eUhhbmRsZXJzIG1hcCByZXN1bHQgbGVhZHMKKyAgLy8gdG8gwrtmdW5jdGlvbiBEIG1haW4gaXMgYSBuZXN0ZWQgZnVuY3Rpb24gYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGFycmF5wqsuCisgIC8vIFRodXMsIHdlIG1hbnVhbGx5IGRvIHRoZSBhcnJheSBjb252ZXJzaW9uLgorICBhdXRvIGxhenlDbGllbnRzID0gbWFwISgoYSl7CisgICAgcmV0dXJuIG5ldyBUQXN5bmNDbGllbnQhRXhUZXN0U2VydmljZSgKKyAgICAgIG5ldyBUQXN5bmNTb2NrZXQobWFuYWdlciwgIjEyNy4wLjAuMSIsIGEpLAorICAgICAgbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoVEJ1ZmZlcmVkVHJhbnNwb3J0KQorICAgICk7CisgIH0pKHBvcnRzKTsKKyAgVEFzeW5jQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlW10gY2xpZW50czsKKyAgZm9yZWFjaCAoYzsgbGF6eUNsaWVudHMpIGNsaWVudHMgfj0gYzsKKyAgcmV0dXJuIGNsaWVudHM7Cit9CisKKwordm9pZCBhc3luY0Zhc3Rlc3RDbGllbnRQb29sVGVzdChjb25zdCh1c2hvcnQpW10gcG9ydHMsIEV4VGVzdEhhbmRsZXJbXSBoYW5kbGVycykgeworICBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICBzY29wZSAoZXhpdCkgbWFuYWdlci5zdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgYXV0byBjbGllbnRzID0gbWFrZUFzeW5jQ2xpZW50cyhtYW5hZ2VyLCBwb3J0cyk7CisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBmYXN0ZXN0IGNsaWVudCB3aW5zLCBldmVuIGlmIHRoZXkgYXJlIGNhbGxlZCBpbiBzb21lIG90aGVyCisgIC8vIG9yZGVyLgorICB7CisgICAgYXV0byByZXN1bHQgPSBtYWtlQXN5bmNGYXN0ZXN0UG9vbChhcnJheShyZXRybyhjbGllbnRzKSkpLmdldFBvcnQoKS53YWl0R2V0KCk7CisgICAgZW5mb3JjZShyZXN1bHQgPT0gcG9ydHNbMF0pOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIGFsbCBjbGllbnRzIGZhaWwuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlQXN5bmNGYXN0ZXN0UG9vbChjbGllbnRzWzMgLi4gJF0pOworICAgIGF1dG8gZSA9IGNhc3QoVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocG9vbC5nZXRQb3J0KCkud2FpdEdldCgpKTsKKyAgICBlbmZvcmNlKGUpOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSllLmV4Y2VwdGlvbnMpLAorICAgICAgcG9ydHNbMyAuLiAkXSkpOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnRzIGZhaWwsIGJ1dCBhIGxhdGVyIG9uZSBzdWNjZWVkcy4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY0Zhc3Rlc3RQb29sKGNsaWVudHNbMSAuLiAkXSk7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnRJbkFycmF5KCkgPT0gW3BvcnRzWzFdXSk7CisgIH0KK30KKworYXV0byBtYWtlQXN5bmNGYXN0ZXN0UG9vbChUQXN5bmNDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSBjbGllbnRzKSB7CisgIGF1dG8gcCA9IHRBc3luY0Zhc3Rlc3RDbGllbnRQb29sKGNsaWVudHMpOworICBwLnJwY0ZhdWx0RmlsdGVyID0gKEV4Y2VwdGlvbiBlKSB7CisgICAgcmV0dXJuIChjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uKWUgIWlzIG51bGwpOworICB9OworICByZXR1cm4gcDsKK30KKworCit2b2lkIGFzeW5jQWdncmVnYXRvclRlc3QoY29uc3QodXNob3J0KVtdIHBvcnRzLCBFeFRlc3RIYW5kbGVyW10gaGFuZGxlcnMpIHsKKyAgYXV0byBtYW5hZ2VyID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlcjsKKyAgc2NvcGUgKGV4aXQpIG1hbmFnZXIuc3RvcChkdXIhImhuc2VjcyIoMCkpOworCisgIGF1dG8gY2xpZW50cyA9IG1ha2VBc3luY0NsaWVudHMobWFuYWdlciwgcG9ydHMpOworICBzY29wZShleGl0KSBmb3JlYWNoIChjOyBjbGllbnRzKSBjLnRyYW5zcG9ydC5jbG9zZSgpOworCisgIGF1dG8gYWdncmVnYXRvciA9IHRBc3luY0FnZ3JlZ2F0b3IoCisgICAgY2FzdChUQXN5bmNDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSljbGllbnRzKTsKKworICAvLyBUZXN0IGFnZ3JlZ2F0b3IgcmFuZ2UgaW50ZXJmYWNlLgorICB7CisgICAgYXV0byByYW5nZSA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLnJhbmdlKGR1ciEibXNlY3MiKDUwKSk7CisgICAgZW5mb3JjZShlcXVhbChyYW5nZSwgcG9ydHNbMCAuLiAyXVtdKSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKXJhbmdlLmV4Y2VwdGlvbnMpLAorICAgICAgcG9ydHNbMyAuLiAkIC0gMV0pKTsKKyAgICBlbmZvcmNlKHJhbmdlLmNvbXBsZXRlZENvdW50ID09IDQpOworICB9CisKKyAgLy8gVGVzdCBkZWZhdWx0IGFjY3VtdWxhdG9yIGZvciBzY2FsYXJzLgorICB7CisgICAgYXV0byBmdWxsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0KCkuYWNjdW11bGF0ZSgpOworICAgIGVuZm9yY2UoZnVsbFJlc3VsdC53YWl0R2V0KCkgPT0gcG9ydHNbMCAuLiAzXSk7CisKKyAgICBhdXRvIHBhcnRpYWxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnQoKS5hY2N1bXVsYXRlKCk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDIwKSk7CisgICAgZW5mb3JjZShwYXJ0aWFsUmVzdWx0LmZpbmlzaEdldCgpID09IHBvcnRzWzAgLi4gMl0pOworCisgIH0KKworICAvLyBUZXN0IGRlZmF1bHQgYWNjdW11bGF0b3IgZm9yIGFycmF5cy4KKyAgeworICAgIGF1dG8gZnVsbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydEluQXJyYXkoKS5hY2N1bXVsYXRlKCk7CisgICAgZW5mb3JjZShmdWxsUmVzdWx0LndhaXRHZXQoKSA9PSBwb3J0c1swIC4uIDNdKTsKKworICAgIGF1dG8gcGFydGlhbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydEluQXJyYXkoKS5hY2N1bXVsYXRlKCk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDIwKSk7CisgICAgZW5mb3JjZShwYXJ0aWFsUmVzdWx0LmZpbmlzaEdldCgpID09IHBvcnRzWzAgLi4gMl0pOworICB9CisKKyAgLy8gVGVzdCBjdXN0b20gYWNjdW11bGF0b3IuCisgIHsKKyAgICBhdXRvIGZ1bGxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnQoKS5hY2N1bXVsYXRlIShmdW5jdGlvbihpbnRbXSByZXN1bHRzKXsKKyAgICAgIHJldHVybiByZWR1Y2UhImEgKyBiIihyZXN1bHRzKTsKKyAgICB9KSgpOworICAgIGVuZm9yY2UoZnVsbFJlc3VsdC53YWl0R2V0KCkgPT0gcG9ydHNbMF0gKyBwb3J0c1sxXSArIHBvcnRzWzJdKTsKKworICAgIGF1dG8gcGFydGlhbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLmFjY3VtdWxhdGUhKAorICAgICAgZnVuY3Rpb24oaW50W10gcmVzdWx0cywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucykgeworICAgICAgICAvLyBSZXR1cm4gYSB0dXBsZSBvZiB0aGUgcGFyYW1ldGVycyBzbyB3ZSBjYW4gY2hlY2sgdGhlbSBvdXRzaWRlIG9mCisgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gKHRvIHZlcmlmeSB0aGUgdmFsdWVzLCB3ZSBuZWVkIGFjY2VzcyB0byDCu3BvcnRzwqssIGJ1dAorICAgICAgICAvLyBkdWUgdG8gRE1EIEBAQlVHNTcxMEBALCB3ZSBjYW4ndCB1c2UgYSBkZWxlZ2F0ZSBsaXRlcmFsKS5mCisgICAgICAgIHJldHVybiB0dXBsZShyZXN1bHRzLCBleGNlcHRpb25zKTsKKyAgICAgIH0KKyAgICApKCk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDIwKSk7CisgICAgYXV0byByZXN1bHRUdXBsZSA9IHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCk7CisgICAgZW5mb3JjZShyZXN1bHRUdXBsZVswXSA9PSBwb3J0c1swIC4uIDJdKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmVzdWx0VHVwbGVbMV0pLAorICAgICAgcG9ydHNbMyAuLiAkIC0gMV0pKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9vcGVuc3NsLnRlc3QuY25mIGIvbGliL2QvdGVzdC9vcGVuc3NsLnRlc3QuY25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGEzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L29wZW5zc2wudGVzdC5jbmYKQEAgLTAsMCArMSwxNCBAQAorWyByZXEgXQorZGVmYXVsdF9iaXRzID0gMjA0OAorZGVmYXVsdF9rZXlmaWxlID0gc2VydmVyLXByaXZhdGUta2V5LnBlbQorZGlzdGluZ3Vpc2hlZF9uYW1lID0gcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZQoreDUwOV9leHRlbnNpb25zID0gdjNfY2EKK3Byb21wdCA9IG5vCisKK1sgcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZSBdCitDTiA9IGxvY2FsaG9zdAorCitbIHYzX2NhIF0KKyMgQWRkIDo6MSB0byB0aGUgbGlzdCBvZiBhbGxvd2VkIElQcyBzbyB3ZSBjYW4gdXNlIDo6MSB0byBleHBsaWNpdGx5IGNvbm5lY3QKKyMgdG8gbG9jYWxob3N0IHZpYSBJUHY2Lgorc3ViamVjdEFsdE5hbWUgPSBJUDo6OjEKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZCBiL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQwNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1pbmkgc2VyaWFsaXphdGlvbiBiZW5jaG1hcmsgYWxzbyBhdmFpbGFibGUgZm9yCisgKiBDKysgYW5kIEphdmEuCisgKgorICogRm9yIG1lYW5pbmdmdWwgcmVzdWx0cywgeW91IG1pZ2h0IHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQKKyAqIHRoZSBUaHJpZnQgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIHJlbGVhc2UgYnVpbGQgZmxhZ3MsCisgKiBlLmcuIGJ5IGluY2x1ZGluZyB0aGUgc291cmNlIGZpbGVzIHdpdGggdGhlIGJ1aWxkIGluc3RlYWQKKyAqIG9mIGxpbmtpbmcgbGlidGhyaWZ0ZDoKKyAqCisgICBkbWQgLXcgLU8gLXJlbGVhc2UgLWlubGluZSAtSS4uL3NyYyAtSWdlbi1kIC1vZnNlcmlhbGl6YXRpb25fYmVuY2htYXJrIFwKKyAgICQoZmluZCAuLi9zcmMvdGhyaWZ0IC1uYW1lICcqLmQnIC1ub3QgLW5hbWUgaW5kZXguZCkgXAorICAgZ2VuLWQvRGVidWdQcm90b1Rlc3RfdHlwZXMuZCBzZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCisgKi8KK21vZHVsZSBzZXJpYWxpemF0aW9uX2JlbmNobWFyazsKKworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKK2ltcG9ydCBzdGQubWF0aCA6IFBJOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQucmFuZ2U7CitpbXBvcnQgRGVidWdQcm90b1Rlc3RfdHlwZXM7CisKK3ZvaWQgbWFpbigpIHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgZW51bSBJVEVSQVRJT05TID0gMTBfMDAwXzAwMDsKKworICB7CisgICAgYXV0byBvb2UgPSBPbmVPZkVhY2goKTsKKyAgICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKKyAgICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7CisgICAgb29lLmFfYml0ZSAgICA9IDB4N2Y7CisgICAgb29lLmludGVnZXIxNiA9IDI3XzAwMDsKKyAgICBvb2UuaW50ZWdlcjMyID0gMSA8PCAyNDsKKyAgICBvb2UuaW50ZWdlcjY0ID0gNl8wMDBfMDAwXzAwMDsKKyAgICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IFBJOworICAgIG9vZS5zb21lX2NoYXJhY3RlcnMgPSAiSlNPTiBUSElTISBcIlwxIjsKKyAgICBvb2Uuem9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworICAgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CisKKyAgICBhdXRvIHByb3QgPSB0QmluYXJ5UHJvdG9jb2woYnVmKTsKKyAgICBhdXRvIHN3ID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgIGZvcmVhY2ggKGk7IDAgLi4gSVRFUkFUSU9OUykgeworICAgICAgYnVmLnJlc2V0KDEyMCk7CisgICAgICBvb2Uud3JpdGUocHJvdCk7CisgICAgfQorICAgIHN3LnN0b3AoKTsKKworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKKyAgICB3cml0ZWZsbigiV3JpdGU6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CisgIH0KKworICBhdXRvIGRhdGEgPSBidWYuZ2V0Q29udGVudHMoKS5kdXA7CisKKyAgeworICAgIGF1dG8gcmVhZEJ1ZiA9IHRJbnB1dFJhbmdlVHJhbnNwb3J0KGRhdGEpOworICAgIGF1dG8gcHJvdCA9IHRCaW5hcnlQcm90b2NvbChyZWFkQnVmKTsKKyAgICBhdXRvIG9vZSA9IE9uZU9mRWFjaCgpOworCisgICAgYXV0byBzdyA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICBmb3JlYWNoIChpOyAwIC4uIElURVJBVElPTlMpIHsKKyAgICAgIHJlYWRCdWYucmVzZXQoZGF0YSk7CisgICAgICBvb2UucmVhZChwcm90KTsKKyAgICB9CisgICAgc3cuc3RvcCgpOworCisgICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS50b3RhbCEibXNlY3MiOworICAgIHdyaXRlZmxuKCIgUmVhZDogJXMgbXMgKCVzIGtIeikiLCBtc2VjcywgSVRFUkFUSU9OUyAvIG1zZWNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9zdHJlc3NfdGVzdF9zZXJ2ZXIuZCBiL2xpYi9kL3Rlc3Qvc3RyZXNzX3Rlc3Rfc2VydmVyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkYTA5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3Qvc3RyZXNzX3Rlc3Rfc2VydmVyLmQKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHN0cmVzc190ZXN0X3NlcnZlcjsKKworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLnBhcmFsbGVsaXNtIDogdG90YWxDUFVzOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQudHlwZXR1cGxlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OworaW1wb3J0IHRlc3RfdXRpbHM7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5zdHJlc3MuU2VydmljZTsKKworY2xhc3MgU2VydmljZUhhbmRsZXIgOiBTZXJ2aWNlIHsKKyAgdm9pZCBlY2hvVm9pZCgpIHsgcmV0dXJuOyB9CisgIGJ5dGUgZWNob0J5dGUoYnl0ZSBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQgZWNob0kzMihpbnQgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgbG9uZyBlY2hvSTY0KGxvbmcgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgYnl0ZVtdIGVjaG9MaXN0KGJ5dGVbXSBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBIYXNoU2V0IWJ5dGUgZWNob1NldChIYXNoU2V0IWJ5dGUgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgYnl0ZVtieXRlXSBlY2hvTWFwKGJ5dGVbYnl0ZV0gYXJnKSB7IHJldHVybiBhcmc7IH0KKworICBzdHJpbmcgZWNob1N0cmluZyhzdHJpbmcgYXJnKSB7CisgICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7CisgICAgICBzdGRlcnIud3JpdGVmbG4oYFdyb25nIHN0cmluZyByZWNlaXZlZDogJXMgaW5zdGVhZCBvZiAiaGVsbG8iYCwgYXJnKTsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldyb25nIHN0cmluZyByZWNlaXZlZC4iKTsKKyAgICB9CisgICAgcmV0dXJuIGFyZzsKKyAgfQorfQorCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICB1c2hvcnQgcG9ydCA9IDkwOTE7CisgIGF1dG8gc2VydmVyVHlwZSA9IFNlcnZlclR5cGUudGhyZWFkZWQ7CisgIFRyYW5zcG9ydFR5cGUgdHJhbnNwb3J0VHlwZTsKKyAgc2l6ZV90IG51bUlPVGhyZWFkcyA9IDE7CisgIHNpemVfdCB0YXNrUG9vbFNpemUgPSB0b3RhbENQVXM7CisKKyAgZ2V0b3B0KGFyZ3MsICJwb3J0IiwgJnBvcnQsICJzZXJ2ZXItdHlwZSIsICZzZXJ2ZXJUeXBlLAorICAgICJ0cmFuc3BvcnQtdHlwZSIsICZ0cmFuc3BvcnRUeXBlLCAidGFzay1wb29sLXNpemUiLCAmdGFza1Bvb2xTaXplLAorICAgICJudW0taW8tdGhyZWFkcyIsICZudW1JT1RocmVhZHMpOworCisgIGFsaWFzIFR5cGVUdXBsZSEoVEJ1ZmZlcmVkVHJhbnNwb3J0LCBUTWVtb3J5QnVmZmVyKSBBdmFpbGFibGVUcmFuc3BvcnRzOworCisgIGF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yIShTZXJ2aWNlLAorICAgIHN0YXRpY01hcCEoVEJpbmFyeVByb3RvY29sLCBBdmFpbGFibGVUcmFuc3BvcnRzKSkobmV3IFNlcnZpY2VIYW5kbGVyKCkpOworICBhdXRvIHNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQpOworICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBjcmVhdGVUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydFR5cGUpOworICBhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IUF2YWlsYWJsZVRyYW5zcG9ydHM7CisKKyAgYXV0byBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZSwgdGFza1Bvb2xTaXplLCBudW1JT1RocmVhZHMsCisgICAgcHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisKKyAgd3JpdGVmbG4oIlN0YXJ0aW5nICVzICVzIFN0cmVzc1Rlc3Qgc2VydmVyIG9uIHBvcnQgJXMuLi4iLCB0cmFuc3BvcnRUeXBlLAorICAgIHNlcnZlclR5cGUsIHBvcnQpOworICBzZXJ2ZXIuc2VydmUoKTsKKyAgd3JpdGVsbigiZG9uZS4iKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGVzdF91dGlscy5kIGIvbGliL2QvdGVzdC90ZXN0X3V0aWxzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0MTAwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdGVzdF91dGlscy5kCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBWYXJpb3VzIGhlbHBlcnMgdXNlZCBieSBtb3JlIHRoYW4gYSBzaW5nbGUgdGVzdC4KKyAqLworbW9kdWxlIHRlc3RfdXRpbHM7CisKK2ltcG9ydCBzdGQucGFyYWxsZWxpc20gOiBUYXNrUG9vbDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLm5vbmJsb2NraW5nOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudGFza3Bvb2w7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50aHJlYWRlZDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworCisvLyBUaGlzIGlzIGEgbGlrZWx5IHZpY3RpbSBvZiBAQEJVRzQ3NDRAQCB3aGVuIHVzZWQgd2l0aCBjb21tYW5kIGFyZ3VtZW50CisvLyBwYXJzaW5nLgorZW51bSBTZXJ2ZXJUeXBlIHsKKyAgc2ltcGxlLAorICBub25ibG9ja2luZywKKyAgcG9vbGVkTm9uYmxvY2tpbmcsCisgIHRhc2twb29sLAorICB0aHJlYWRlZAorfQorCitUU2VydmVyIGNyZWF0ZVNlcnZlcihTZXJ2ZXJUeXBlIHR5cGUsIHNpemVfdCB0YXNrUG9vbFNpemUsIHNpemVfdCBudW1JT1RocmVhZHMsCisgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyU29ja2V0IHNlcnZlclRyYW5zcG9ydCwKKyAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCit7CisgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgU2VydmVyVHlwZS5zaW1wbGU6CisgICAgICByZXR1cm4gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgY2FzZSBTZXJ2ZXJUeXBlLm5vbmJsb2NraW5nOgorICAgICAgYXV0byBuYiA9IG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQucG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIG5iLm51bUlPVGhyZWFkcyA9IG51bUlPVGhyZWFkczsKKyAgICAgIHJldHVybiBuYjsKKyAgICBjYXNlIFNlcnZlclR5cGUucG9vbGVkTm9uYmxvY2tpbmc6CisgICAgICBhdXRvIG5iID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydC5wb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIG5ldyBUYXNrUG9vbCh0YXNrUG9vbFNpemUpKTsKKyAgICAgIG5iLm51bUlPVGhyZWFkcyA9IG51bUlPVGhyZWFkczsKKyAgICAgIHJldHVybiBuYjsKKyAgICBjYXNlIFNlcnZlclR5cGUudGFza3Bvb2w6CisgICAgICBhdXRvIHRwcyA9IG5ldyBUVGFza1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgICB0cHMudGFza1Bvb2wgPSBuZXcgVGFza1Bvb2wodGFza1Bvb2xTaXplKTsKKyAgICAgIHJldHVybiB0cHM7CisgICAgY2FzZSBTZXJ2ZXJUeXBlLnRocmVhZGVkOgorICAgICAgcmV0dXJuIG5ldyBUVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KK30KKworZW51bSBUcmFuc3BvcnRUeXBlIHsKKyAgYnVmZmVyZWQsCisgIGZyYW1lZCwKKyAgaHR0cCwKKyAgcmF3Cit9CisKK1RUcmFuc3BvcnRGYWN0b3J5IGNyZWF0ZVRyYW5zcG9ydEZhY3RvcnkoVHJhbnNwb3J0VHlwZSB0eXBlKSB7CisgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5idWZmZXJlZDoKKyAgICAgIHJldHVybiBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUuZnJhbWVkOgorICAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUuaHR0cDoKKyAgICAgIHJldHVybiBuZXcgVFNlcnZlckh0dHBUcmFuc3BvcnRGYWN0b3J5OworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5yYXc6CisgICAgICByZXR1cm4gbmV3IFRUcmFuc3BvcnRGYWN0b3J5OworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQxOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdF90ZXN0X2NsaWVudDsKKworaW1wb3J0IHN0ZC5jb252OworaW1wb3J0IHN0ZC5kYXRldGltZTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQuc3RyaW5nOworaW1wb3J0IHN0ZC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmNvbXBhY3Q7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmpzb247CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CisKK2ltcG9ydCB0aHJpZnRfdGVzdF9jb21tb247CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0X3R5cGVzOworCitlbnVtIFRyYW5zcG9ydFR5cGUgeworICBidWZmZXJlZCwKKyAgZnJhbWVkLAorICBodHRwLAorICByYXcKK30KKworVFByb3RvY29sIGNyZWF0ZVByb3RvY29sKFQpKFQgdHJhbnMsIFByb3RvY29sVHlwZSB0eXBlKSB7CisgIGZpbmFsIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUHJvdG9jb2xUeXBlLmJpbmFyeToKKyAgICAgIHJldHVybiB0QmluYXJ5UHJvdG9jb2wodHJhbnMpOworICAgIGNhc2UgUHJvdG9jb2xUeXBlLmNvbXBhY3Q6CisgICAgICByZXR1cm4gdENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuanNvbjoKKyAgICAgIHJldHVybiB0SnNvblByb3RvY29sKHRyYW5zKTsKKyAgfQorfQorCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICB1c2hvcnQgcG9ydCA9IDkwOTA7CisgIHVpbnQgbnVtVGVzdHMgPSAxOworICBib29sIHNzbDsKKyAgUHJvdG9jb2xUeXBlIHByb3RvY29sVHlwZTsKKyAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOworICBib29sIHRyYWNlOworCisgIGdldG9wdChhcmdzLAorICAgICJudW1UZXN0c3xuIiwgJm51bVRlc3RzLAorICAgICJwcm90b2NvbCIsICZwcm90b2NvbFR5cGUsCisgICAgInNzbCIsICZzc2wsCisgICAgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnRUeXBlLAorICAgICJ0cmFjZSIsICZ0cmFjZSwKKyAgICAicG9ydCIsICZwb3J0LAorICAgICJob3N0IiwgKHN0cmluZyBfLCBzdHJpbmcgdmFsdWUpIHsKKyAgICAgIGF1dG8gcGFydHMgPSBzcGxpdCh2YWx1ZSwgIjoiKTsKKyAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CisgICAgICAgIC8vIElQdjYgYWRkcmVzc2VzIGNhbiBjb250YWluIGNvbG9ucywgc28gdGFrZSB0aGUgbGFzdCBwYXJ0IGZvciB0aGUKKyAgICAgICAgLy8gcG9ydC4KKyAgICAgICAgaG9zdCA9IGpvaW4ocGFydHNbMCAuLiAkIC0gMV0sICI6Iik7CisgICAgICAgIHBvcnQgPSB0byF1c2hvcnQocGFydHNbJCAtIDFdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhvc3QgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICk7CisgIHBvcnQgPSB0byF1c2hvcnQocG9ydCk7CisKKyAgVFNvY2tldCBzb2NrZXQ7CisgIGlmIChzc2wpIHsKKyAgICBhdXRvIHNzbENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKKyAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKKyAgICBzc2xDb250ZXh0LmF1dGhlbnRpY2F0ZSA9IHRydWU7CisgICAgc3NsQ29udGV4dC5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygiLi4vLi4vLi4vdGVzdC9rZXlzL0NBLnBlbSIpOworICAgIHNvY2tldCA9IG5ldyBUU1NMU29ja2V0KHNzbENvbnRleHQsIGhvc3QsIHBvcnQpOworICB9IGVsc2UgeworICAgIHNvY2tldCA9IG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpOworICB9CisKKyAgVFByb3RvY29sIHByb3RvY29sOworICBmaW5hbCBzd2l0Y2ggKHRyYW5zcG9ydFR5cGUpIHsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUuYnVmZmVyZWQ6CisgICAgICBwcm90b2NvbCA9IGNyZWF0ZVByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSwgcHJvdG9jb2xUeXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5mcmFtZWQ6CisgICAgICBwcm90b2NvbCA9IGNyZWF0ZVByb3RvY29sKG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCksIHByb3RvY29sVHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUuaHR0cDoKKyAgICAgIHByb3RvY29sID0gY3JlYXRlUHJvdG9jb2woCisgICAgICAgIG5ldyBUQ2xpZW50SHR0cFRyYW5zcG9ydChzb2NrZXQsIGhvc3QsICIvc2VydmljZSIpLCBwcm90b2NvbFR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLnJhdzoKKyAgICAgIHByb3RvY29sID0gY3JlYXRlUHJvdG9jb2woc29ja2V0LCBwcm90b2NvbFR5cGUpOworICAgICAgYnJlYWs7CisgIH0KKworICBhdXRvIGNsaWVudCA9IHRDbGllbnQhVGhyaWZ0VGVzdChwcm90b2NvbCk7CisKKyAgdWxvbmcgdGltZV9taW47CisgIHVsb25nIHRpbWVfbWF4OworICB1bG9uZyB0aW1lX3RvdDsKKworICBTdG9wV2F0Y2ggc3c7CisgIGZvcmVhY2godGVzdDsgMCAuLiBudW1UZXN0cykgeworICAgIHN3LnN0YXJ0KCk7CisKKyAgICBwcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiVGVzdCAjJXMsIGNvbm5lY3QgJXM6JXMiLCB0ZXN0ICsgMSwgaG9zdCwgcG9ydCk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0Vm9pZCgpIik7CisgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgPSB2b2lkIik7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSBcIiVzXCIiLCBzKTsKKyAgICBlbmZvcmNlKHMgPT0gIlRlc3QiKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgYnl0ZSB1OCA9IGNsaWVudC50ZXN0Qnl0ZSgxKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHU4KTsKKyAgICBlbmZvcmNlKHU4ID09IDEpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEkzMigtMSkiKTsKKyAgICBpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgaTMyKTsKKyAgICBlbmZvcmNlKGkzMiA9PSAtMSk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICBsb25nIGk2NCA9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OEwpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgaTY0KTsKKyAgICBlbmZvcmNlKGk2NCA9PSAtMzQzNTk3MzgzNjhMKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKKyAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoLTUuMjA5ODUyMyk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBkdWIpOworICAgIGVuZm9yY2UoZHViID09IC01LjIwOTg1MjMpOworCisJLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCisJCisgICAgWHRydWN0IG91dDE7CisgICAgb3V0MS5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgb3V0MS5ieXRlX3RoaW5nID0gMTsKKyAgICBvdXQxLmkzMl90aGluZyA9IC0zOworICAgIG91dDEuaTY0X3RoaW5nID0gLTU7CisgICAgaWYgKHRyYWNlKSB3cml0ZWYoInRlc3RTdHJ1Y3QoJXMpIiwgb3V0MSk7CisgICAgYXV0byBpbjEgPSBjbGllbnQudGVzdFN0cnVjdChvdXQxKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGluMSk7CisgICAgZW5mb3JjZShpbjEgPT0gb3V0MSk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iKTsKKyAgICBYdHJ1Y3QyIG91dDI7CisgICAgb3V0Mi5ieXRlX3RoaW5nID0gMTsKKyAgICBvdXQyLnN0cnVjdF90aGluZyA9IG91dDE7CisgICAgb3V0Mi5pMzJfdGhpbmcgPSA1OworICAgIGF1dG8gaW4yID0gY2xpZW50LnRlc3ROZXN0KG91dDIpOworICAgIGluMSA9IGluMi5zdHJ1Y3RfdGhpbmc7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0geyVzLCB7XCIlc1wiLCAlcywgJXMsICVzfSwgJXN9IiwgaW4yLmJ5dGVfdGhpbmcsCisgICAgICBpbjEuc3RyaW5nX3RoaW5nLCBpbjEuYnl0ZV90aGluZywgaW4xLmkzMl90aGluZywgaW4xLmk2NF90aGluZywKKyAgICAgIGluMi5pMzJfdGhpbmcpOworICAgIGVuZm9yY2UoaW4yID09IG91dDIpOworCisgICAgaW50W2ludF0gbWFwb3V0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICBtYXBvdXRbaV0gPSBpIC0gMTA7CisgICAgfQorICAgIGlmICh0cmFjZSkgd3JpdGVmKCJ0ZXN0TWFwKHslc30pIiwgbWFwb3V0KTsKKyAgICBhdXRvIG1hcGluID0gY2xpZW50LnRlc3RNYXAobWFwb3V0KTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSB7JXN9IiwgbWFwaW4pOworICAgIGVuZm9yY2UobWFwaW4gPT0gbWFwb3V0KTsKKworICAgIGF1dG8gc2V0b3V0ID0gbmV3IEhhc2hTZXQhaW50OworICAgIGZvciAoaW50IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgc2V0b3V0IH49IGk7CisgICAgfQorICAgIGlmICh0cmFjZSkgd3JpdGVmKCJ0ZXN0U2V0KCVzKSIsIHNldG91dCk7CisgICAgYXV0byBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBzZXRpbik7CisgICAgZW5mb3JjZShzZXRpbiA9PSBzZXRvdXQpOworCisgICAgaW50W10gbGlzdG91dDsKKyAgICBmb3IgKGludCBpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgIGxpc3RvdXQgfj0gaTsKKyAgICB9CisgICAgaWYgKHRyYWNlKSB3cml0ZWYoInRlc3RMaXN0KCVzKSIsIGxpc3RvdXQpOworICAgIGF1dG8gbGlzdGluID0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgbGlzdGluKTsKKyAgICBlbmZvcmNlKGxpc3RpbiA9PSBsaXN0b3V0KTsKKworICAgIHsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgIGF1dG8gcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouT05FKTsKKworICAgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouVFdPKTsKKworICAgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEVudW0oVEhSRUUpIik7CisgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHJldCk7CisgICAgICBlbmZvcmNlKHJldCA9PSBOdW1iZXJ6LlRIUkVFKTsKKworICAgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5GSVZFKTsKKworICAgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHJldCk7CisgICAgICBlbmZvcmNlKHJldCA9PSBOdW1iZXJ6LkVJR0hUKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgVXNlcklkIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHVpZCk7CisgICAgZW5mb3JjZSh1aWQgPT0gMzA5ODU4MjM1MDgyNTIzTCk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgYXV0byBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9IHslc30iLCBtbSk7CisgICAgLy8gU2ltcGx5IGRvaW5nID09IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGZvciBuZXN0ZWQgQUFzLgorICAgIGZvcmVhY2ggKGtleSwgdmFsdWU7IG1tKSB7CisgICAgICBlbmZvcmNlKHRlc3RNYXBNYXBSZXR1cm5ba2V5XSA9PSB2YWx1ZSk7CisgICAgfQorICAgIGZvcmVhY2ggKGtleSwgdmFsdWU7IHRlc3RNYXBNYXBSZXR1cm4pIHsKKyAgICAgIGVuZm9yY2UobW1ba2V5XSA9PSB2YWx1ZSk7CisgICAgfQorCisgICAgSW5zYW5pdHkgaW5zYW5lOworICAgIGluc2FuZS51c2VyTWFwW051bWJlcnouRklWRV0gPSA1MDAwOworICAgIFh0cnVjdCB0cnVjazsKKyAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgIHRydWNrLmJ5dGVfdGhpbmcgPSA4OworICAgIHRydWNrLmkzMl90aGluZyA9IDg7CisgICAgdHJ1Y2suaTY0X3RoaW5nID0gODsKKyAgICBpbnNhbmUueHRydWN0cyB+PSB0cnVjazsKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgIGF1dG8gd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHdob2EpOworCisgICAgLy8gQ29tbWVudGVkIGZvciBub3csIHRoaXMgaXMgY3VtYmVyc29tZSB0byB3cml0ZSB3aXRob3V0IG9wRXF1YWwgZ2V0dGluZworICAgIC8vIGNhbGxlZCBvbiBBQSBjb21wYXJpc29uLgorICAgIC8vIGVuZm9yY2Uod2hvYSA9PSB0ZXN0SW5zYW5pdHlSZXR1cm4pOworCisgICAgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdEV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChYY2VwdGlvbiBlKSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiAgeyVzLCBcIiVzXCJ9IiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdEV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXN9IiwgZS5tc2cpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWQiKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICBleGNlcHRpb25cbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdEV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAidGVzdCAxIik7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVsbigiICByZXN1bHRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdE11bHRpRXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXMsIFwiJXNcIn0iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHJlc3VsdFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0TXVsdGlFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfSBjYXRjaCAoWGNlcHRpb24yIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXMsIHtcIiVzXCJ9fSIsCisgICAgICAgICAgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVmKCJjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oInN1Y2Nlc3MiLCAidGVzdCAzIik7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiAge3tcIiVzXCJ9fSIsIHJlc3VsdC5zdHJpbmdfdGhpbmcpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIGV4Y2VwdGlvblxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0TXVsdGlFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIERvIG5vdCBydW4gb25ld2F5IHRlc3Qgd2hlbiBkb2luZyBtdWx0aXBsZSBpdGVyYXRpb25zLCBhcyBpdCBibG9ja3MgdGhlCisgICAgLy8gc2VydmVyIGZvciB0aHJlZSBzZWNvbmRzLgorICAgIGlmIChudW1UZXN0cyA9PSAxKSB7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZigiY2xpZW50LnRlc3RPbmV3YXkoMykgPT4iKTsKKyAgICAgIGF1dG8gb25ld2F5V2F0Y2ggPSBTdG9wV2F0Y2goQXV0b1N0YXJ0Lnllcyk7CisgICAgICBjbGllbnQudGVzdE9uZXdheSgzKTsKKyAgICAgIG9uZXdheVdhdGNoLnN0b3AoKTsKKyAgICAgIGlmIChvbmV3YXlXYXRjaC5wZWVrKCkubXNlY3MgPiAyMDApIHsKKyAgICAgICAgaWYgKHRyYWNlKSB7CisgICAgICAgICAgd3JpdGVmbG4oIiAgRkFJTFVSRSAtIHRvb2sgJXMgbXMiLCBvbmV3YXlXYXRjaC5wZWVrKCkudXNlY3MgLyAxMDAwLjApOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RPbmV3YXkgZmFpbGVkLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRyYWNlKSB7CisgICAgICAgICAgd3JpdGVmbG4oIiAgc3VjY2VzcyAtIHRvb2sgJXMgbXMiLCBvbmV3YXlXYXRjaC5wZWVrKCkudXNlY3MgLyAxMDAwLjApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieQorICAgICAgLy8gb25lIiwgd2hpY2ggd291bGQgYmUgdGhlIGNhc2UgaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSBtZXRob2RzCisgICAgICAvLyBsaWtlIG5vcm1hbCBvbmVzLgorICAgICAgaWYgKHRyYWNlKSB3cml0ZSgicmUtdGVzdCB0ZXN0STMyKC0xKSIpOworICAgICAgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBpMzIpOworICAgIH0KKworICAgIC8vIFRpbWUgbWV0ZXJpbmcuCisgICAgc3cuc3RvcCgpOworCisgICAgaW1tdXRhYmxlIHRvdCA9IHN3LnBlZWsoKS51c2VjczsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCJUb3RhbCB0aW1lOiAlcyB1c1xuIiwgdG90KTsKKworICAgIHRpbWVfdG90ICs9IHRvdDsKKyAgICBpZiAodGltZV9taW4gPT0gMCB8fCB0b3QgPCB0aW1lX21pbikgeworICAgICAgdGltZV9taW4gPSB0b3Q7CisgICAgfQorICAgIGlmICh0b3QgPiB0aW1lX21heCkgeworICAgICAgdGltZV9tYXggPSB0b3Q7CisgICAgfQorICAgIHByb3RvY29sLnRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgc3cucmVzZXQoKTsKKyAgfQorCisgIHdyaXRlbG4oIkFsbCB0ZXN0cyBkb25lLiIpOworCisgIGlmIChudW1UZXN0cyA+IDEpIHsKKyAgICBhdXRvIHRpbWVfYXZnID0gdGltZV90b3QgLyBudW1UZXN0czsKKyAgICB3cml0ZWZsbigiTWluIHRpbWU6ICVzIHVzIiwgdGltZV9taW4pOworICAgIHdyaXRlZmxuKCJNYXggdGltZTogJXMgdXMiLCB0aW1lX21heCk7CisgICAgd3JpdGVmbG4oIkF2ZyB0aW1lOiAlcyB1cyIsIHRpbWVfYXZnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jb21tb24uZCBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY29tbW9uLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhNTY4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY29tbW9uLmQKQEAgLTAsMCArMSw5MiBAQAorbW9kdWxlIHRocmlmdF90ZXN0X2NvbW1vbjsKKworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0X3R5cGVzOworCitlbnVtIFByb3RvY29sVHlwZSB7CisgIGJpbmFyeSwKKyAgY29tcGFjdCwKKyAganNvbgorfQorCit2b2lkIHdyaXRlSW5zYW5pdHlSZXR1cm4oaW4gSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSBpbnNhbmUpIHsKKyAgd3JpdGUoInsiKTsKKyAgZm9yZWFjaChrZXkxLCB2YWx1ZTE7IGluc2FuZSkgeworICAgIHdyaXRlZigiJXMgPT4geyIsIGtleTEpOworICAgIGZvcmVhY2goa2V5MiwgdmFsdWUyOyB2YWx1ZTEpIHsKKyAgICAgIHdyaXRlZigiJXMgPT4geyIsIGtleTIpOworICAgICAgd3JpdGUoInsiKTsKKyAgICAgIGZvcmVhY2goa2V5MywgdmFsdWUzOyB2YWx1ZTIudXNlck1hcCkgeworICAgICAgICB3cml0ZWYoIiVzID0+ICVzLCAiLCBrZXkzLCB2YWx1ZTMpOworICAgICAgfQorICAgICAgd3JpdGUoIn0sICIpOworCisgICAgICB3cml0ZSgieyIpOworICAgICAgZm9yZWFjaCAoeDsgdmFsdWUyLnh0cnVjdHMpIHsKKyAgICAgICAgd3JpdGVmKCJ7XCIlc1wiLCAlcywgJXMsICVzfSwgIiwKKyAgICAgICAgICB4LnN0cmluZ190aGluZywgeC5ieXRlX3RoaW5nLCB4LmkzMl90aGluZywgeC5pNjRfdGhpbmcpOworICAgICAgfQorICAgICAgd3JpdGUoIn0iKTsKKworICAgICAgd3JpdGUoIn0sICIpOworICAgIH0KKyAgICB3cml0ZSgifSwgIik7CisgIH0KKyAgd3JpdGUoIn0iKTsKK30KKworSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSB0ZXN0SW5zYW5pdHlSZXR1cm47CitpbnRbaW50XVtpbnRdIHRlc3RNYXBNYXBSZXR1cm47CisKK3N0YXRpYyB0aGlzKCkgeworICB0ZXN0SW5zYW5pdHlSZXR1cm4gPSB7CisgICAgSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSBpbnNhbmU7CisKKyAgICBYdHJ1Y3QgaGVsbG87CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgWHRydWN0IGdvb2RieWU7CisgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKKworICAgIEluc2FuaXR5IGNyYXp5OworICAgIGNyYXp5LnVzZXJNYXBbTnVtYmVyei5FSUdIVF0gPSA4OworICAgIGNyYXp5Lnh0cnVjdHMgfj0gZ29vZGJ5ZTsKKworICAgIEluc2FuaXR5IGxvb25leTsKKyAgICAvLyBUaGUgQysrIFRlc3RTZXJ2ZXIgYWxzbyBhc3NpZ25zIHRoZXNlIHRvIGNyYXp5LCBidXQgdGhhdCBpcyBwcm9iYWJseQorICAgIC8vIGFuIG92ZXJzaWdodC4KKyAgICBsb29uZXkudXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTsKKyAgICBsb29uZXkueHRydWN0cyB+PSBoZWxsbzsKKworICAgIEluc2FuaXR5W051bWJlcnpdIGZpcnN0X21hcDsKKyAgICBmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gY3Jhenk7CisgICAgZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gY3Jhenk7CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworCisgICAgSW5zYW5pdHlbTnVtYmVyel0gc2Vjb25kX21hcDsKKyAgICBzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IGxvb25leTsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworICAgIHJldHVybiBpbnNhbmU7CisgIH0oKTsKKworICB0ZXN0TWFwTWFwUmV0dXJuID0geworICAgIGludFtpbnRdIHBvczsKKyAgICBpbnRbaW50XSBuZWc7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisKKyAgICBpbnRbaW50XVtpbnRdIHJlc3VsdDsKKyAgICByZXN1bHRbNF0gPSBwb3M7CisgICAgcmVzdWx0Wy00XSA9IG5lZzsKKyAgICByZXR1cm4gcmVzdWx0OworICB9KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3J1bm5lci5zaCBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxYmZlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3J1bm5lci5zaApAQCAtMCwwICsxLDkzIEBACisjIS9iaW4vYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBSdW5zIHRoZSBEIFRocmlmdFRlc3QgY2xpZW50IGFuZCBzZXJ2ZXJzIGZvciBhbGwgY29tYmluYXRpb25zIG9mIHRyYW5zcG9ydCwKKyMgcHJvdG9jb2wsIFNTTC1tb2RlIGFuZCBzZXJ2ZXIgdHlwZS4KKyMgUGFzcyAtayB0byBrZWVwIGdvaW5nIGFmdGVyIGZhaWxlZCB0ZXN0cy4KKworQ1VSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCisKK3Byb3RvY29scz0iYmluYXJ5IGNvbXBhY3QganNvbiIKKyMgVE9ETzogZml4IGFuZCBlbmFibGUgaHR0cAorIyB0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3IGh0dHAiCit0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3Igorc2VydmVycz0ic2ltcGxlIHRhc2twb29sIHRocmVhZGVkIgorZnJhbWVkX29ubHlfc2VydmVycz0ibm9uYmxvY2tpbmcgcG9vbGVkTm9uYmxvY2tpbmciCisKKyMgRG9uJ3QgbGVhdmUgYW55IHNlcnZlciBpbnN0YW5jZXMgYmVoaW5kIHdoZW4gaW50ZXJydXB0ZWQgKGUuZy4gYnkgQ3RybCtDKQorIyBvciB0ZXJtaW5hdGVkLgordHJhcCAia2lsbCAkKGpvYnMgLXApIDI+L2Rldi9udWxsIiBJTlQgVEVSTQorCitmb3IgcHJvdG9jb2wgaW4gJHByb3RvY29sczsgZG8KKyAgZm9yIHNzbCBpbiAiIiAiIC0tc3NsIjsgZG8KKyAgICBmb3IgdHJhbnNwb3J0IGluICR0cmFuc3BvcnRzOyBkbworICAgICAgZm9yIHNlcnZlciBpbiAkc2VydmVycyAkZnJhbWVkX29ubHlfc2VydmVyczsgZG8KKyAgICAgICAgY2FzZSAkZnJhbWVkX29ubHlfc2VydmVycyBpbgorICAgICAgICAgICokc2VydmVyKikgaWYgWyAkdHJhbnNwb3J0ICE9ICJmcmFtZWQiIF0gfHwgWyAkc3NsICE9ICIiIF07IHRoZW4gY29udGludWU7IGZpOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGFyZ3M9Ii0tdHJhbnNwb3J0PSR0cmFuc3BvcnQgLS1wcm90b2NvbD0kcHJvdG9jb2wkc3NsIgorICAgICAgICAke0NVUn0vdGhyaWZ0X3Rlc3Rfc2VydmVyICRhcmdzIC0tc2VydmVyLXR5cGU9JHNlcnZlciA+IC9kZXYvbnVsbCAmCisgICAgICAgIHNlcnZlcl9waWQ9JCEKKworICAgICAgICAjIEdpdmUgdGhlIHNlcnZlciBzb21lIHRpbWUgdG8gZ2V0IHVwIGFuZCBjaGVjayBpZiBpdCBydW5zICh5ZXMsIHRoaXMKKyAgICAgICAgIyBpcyBhIGh1Z2Uga2x1ZGdlLCBzaG91bGQgYWRkIGEgY29ubmVjdCB0aW1lb3V0IHRvIHRlc3QgY2xpZW50KS4KKyAgICAgICAgY2xpZW50X3JjPS0xCisgICAgICAgIGlmIFsgIiRzZXJ2ZXIiID0gInRhc2twb29sIiBdOyB0aGVuCisgICAgICAgICAgc2xlZXAgMC41CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzbGVlcCAwLjAyCisgICAgICAgIGZpCisgICAgICAgIGtpbGwgLTAgJHNlcnZlcl9waWQgMj4vZGV2L251bGwKKyAgICAgICAgaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisgICAgICAgICAgJHtDVVJ9L3RocmlmdF90ZXN0X2NsaWVudCAkYXJncyAtLW51bVRlc3RzPTEwID4gL2Rldi9udWxsCisgICAgICAgICAgY2xpZW50X3JjPSQ/CisKKyAgICAgICAgICAjIFRlbXBvcmFyaWx5IHJlZGlyZWN0IHN0ZGVyciB0byBudWxsIHRvIGF2b2lkIGpvYiBjb250cm9sIG1lc3NhZ2VzLAorICAgICAgICAgICMgcmVzdG9yZSBpdCBhZnRlcndhcmRzLgorICAgICAgICAgIGV4ZWMgMz4mMgorICAgICAgICAgIGV4ZWMgMj4vZGV2L251bGwKKyAgICAgICAgICBraWxsICRzZXJ2ZXJfcGlkCisgICAgICAgICAgZXhlYyAzPiYyCisgICAgICAgIGZpCisKKyAgICAgICAgIyBHZXQgdGhlIHNlcnZlciBleGl0IGNvZGUgKHdhaXQgc2hvdWxkIGltbWVkaWF0ZWx5IHJldHVybikuCisgICAgICAgIHdhaXQgJHNlcnZlcl9waWQKKyAgICAgICAgc2VydmVyX3JjPSQ/CisKKyAgICAgICAgaWYgWyAkY2xpZW50X3JjIC1uZSAwIC1vICRzZXJ2ZXJfcmMgLWVxIDEgXTsgdGhlbgorICAgICAgICAgIGVjaG8gLWUgIlxuVGVzdHMgZmFpbGVkIGZvcjogJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyIgorICAgICAgICAgIGZhaWxlZD0idHJ1ZSIKKyAgICAgICAgICBpZiBbICIkMSIgIT0gIi1rIiBdOyB0aGVuCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gLW4gIi4iCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgZG9uZQorICBkb25lCitkb25lCisKK2VjaG8KK2lmIFsgLXogIiRmYWlsZWQiIF07IHRoZW4KKyAgZWNobyAiQWxsIHRlc3RzIHBhc3NlZC4iCitmaQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZCBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4MjI1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdF90ZXN0X3NlcnZlcjsKKworaW1wb3J0IGNvcmUuc3RkYy5lcnJubyA6IGVycm5vOworaW1wb3J0IGNvcmUuc3RkYy5zaWduYWwgOiBzaWduYWwsIHNpZ2ZuX3QsIFNJR0lOVCwgU0lHX0RGTCwgU0lHX0VSUjsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IGR1ciwgVGhyZWFkOworaW1wb3J0IHN0ZC5hbGdvcml0aG07CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc20gOiB0b3RhbENQVXM7CitpbXBvcnQgc3RkLnN0cmluZzsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IFR5cGVUdXBsZSwgc3RhdGljTWFwOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5jb21wYWN0OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5qc29uOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuaHR0cDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKK2ltcG9ydCB0ZXN0X3V0aWxzOworCitpbXBvcnQgdGhyaWZ0X3Rlc3RfY29tbW9uOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3RfdHlwZXM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKKworY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0IHsKKyAgdGhpcyhib29sIHRyYWNlKSB7CisgICAgdHJhY2VfID0gdHJhY2U7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHRlc3RWb2lkKCkgeworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInRlc3RWb2lkKCkiKTsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0U3RyaW5nKFwiJXNcIikiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgYnl0ZSB0ZXN0Qnl0ZShieXRlIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RCeXRlKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBpbnQgdGVzdEkzMihpbnQgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEkzMiglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEk2NCglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3REb3VibGUoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyB0ZXN0QmluYXJ5KHN0cmluZyB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0QmluYXJ5KFwiJXNcIikiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RCb29sKFwiJXNcIikiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgWHRydWN0IHRlc3RTdHJ1Y3QocmVmIGNvbnN0KFh0cnVjdCkgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdFN0cnVjdCh7XCIlc1wiLCAlcywgJXMsICVzfSkiLAorICAgICAgdGhpbmcuc3RyaW5nX3RoaW5nLCB0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgWHRydWN0MiB0ZXN0TmVzdChyZWYgY29uc3QoWHRydWN0MikgbmVzdCkgeworICAgIGF1dG8gdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE5lc3QoeyVzLCB7XCIlc1wiLCAlcywgJXMsICVzfSwgJXN9KSIsCisgICAgICBuZXN0LmJ5dGVfdGhpbmcsIHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLAorICAgICAgdGhpbmcuaTY0X3RoaW5nLCBuZXN0LmkzMl90aGluZyk7CisgICAgcmV0dXJuIG5lc3Q7CisgIH0KKworICBvdmVycmlkZSBpbnRbaW50XSB0ZXN0TWFwKGludFtpbnRdIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RNYXAoeyVzfSkiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgSGFzaFNldCFpbnQgdGVzdFNldChIYXNoU2V0IWludCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0U2V0KHslc30pIiwKKyAgICAgIGpvaW4obWFwIWB0byFzdHJpbmcoYSlgKHRoaW5nW10pLCAiLCAiKSk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgaW50W10gdGVzdExpc3QoaW50W10gdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdExpc3QoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0RW51bSglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgVXNlcklkIHRlc3RUeXBlZGVmKFVzZXJJZCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0VHlwZWRlZiglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nW3N0cmluZ10gdGVzdFN0cmluZ01hcChzdHJpbmdbc3RyaW5nXSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0U3RyaW5nTWFwKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBpbnRbaW50XVtpbnRdIHRlc3RNYXBNYXAoaW50IGhlbGxvKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RNYXBNYXAoJXMpIiwgaGVsbG8pOworICAgIHJldHVybiB0ZXN0TWFwTWFwUmV0dXJuOworICB9CisKKyAgb3ZlcnJpZGUgSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSB0ZXN0SW5zYW5pdHkocmVmIGNvbnN0KEluc2FuaXR5KSBhcmd1bWVudCkgeworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInRlc3RJbnNhbml0eSgpIik7CisgICAgSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSByZXQ7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTE7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTI7CisgICAgSW5zYW5pdHkgdG1wOworICAgIHRtcCA9IGNhc3QoSW5zYW5pdHkpYXJndW1lbnQ7CisgICAgbTFbTnVtYmVyei5UV09dID0gdG1wOworICAgIG0xW051bWJlcnouVEhSRUVdID0gdG1wOworICAgIG0yW051bWJlcnouU0lYXSA9IEluc2FuaXR5KCk7CisgICAgcmV0WzFdID0gbTE7CisgICAgcmV0WzJdID0gbTI7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBzdHJpbmdbc2hvcnRdIGFyZzMsCisgICAgTnVtYmVyeiBhcmc0LCBVc2VySWQgYXJnNSkKKyAgeworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInRlc3RNdWx0aSgpIik7CisgICAgcmV0dXJuIFh0cnVjdCgiSGVsbG8yIiwgYXJnMCwgYXJnMSwgYXJnMik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0RXhjZXB0aW9uKCVzKSIsIGFyZyk7CisgICAgaWYgKGFyZyA9PSAiWGNlcHRpb24iKSB7CisgICAgICBhdXRvIGUgPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIGUubWVzc2FnZSA9IGFyZzsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAoYXJnID09ICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihzdHJpbmcgYXJnMCwgc3RyaW5nIGFyZzEpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcykiLCBhcmcwLCBhcmcxKTsKKworICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpIHsKKyAgICAgIGF1dG8gZSA9IG5ldyBYY2VwdGlvbigpOworICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOworICAgICAgZS5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgdGhyb3cgZTsKKyAgICB9IGVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpIHsKKyAgICAgIGF1dG8gZSA9IG5ldyBYY2VwdGlvbjIoKTsKKyAgICAgIGUuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gWHRydWN0KGFyZzEpOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE9uZXdheSglcyk6IFNsZWVwaW5nLi4uIiwgc2xlZXBGb3IpOworICAgIFRocmVhZC5zbGVlcChkdXIhInNlY29uZHMiKHNsZWVwRm9yKSk7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RPbmV3YXkoJXMpOiBkb25lIHNsZWVwaW5nISIsIHNsZWVwRm9yKTsKKyAgfQorCitwcml2YXRlOgorICBib29sIHRyYWNlXzsKK30KKworc2hhcmVkKGJvb2wpIGdTaHV0ZG93biA9IGZhbHNlOworCitub3Rocm93IEBub2djIGV4dGVybihDKSB2b2lkIGhhbmRsZVNpZ25hbChpbnQgc2lnKSB7CisgIGdTaHV0ZG93biA9IHRydWU7Cit9CisKKy8vIFJ1bnMgYSB0aHJlYWQgdGhhdCB3YWl0cyBmb3Igc2h1dGRvd24gdG8gYmUKKy8vIHNpZ25hbGVkIGFuZCB0aGVuIHRyaWdnZXJzIGNhbmNlbGxhdGlvbiwKKy8vIGNhdXNpbmcgdGhlIHNlcnZlciB0byBzdG9wLiAgV2hpbGUgd2UgY291bGQKKy8vIHVzZSBhIHNpZ25hbGZkIGZvciB0aGlzIHB1cnBvc2UsIHdlIGFyZSBpbnN0ZWFkCisvLyBvcHRpbmcgZm9yIGEgYnVzeSB3YWl0aW5nIHNjaGVtZSBmb3IgbWF4aW11bQorLy8gcG9ydGFiaWxpdHkgc2luY2Ugc2lnbmFsZmQgaXMgYSBsaW51eCB0aGluZy4KKworY2xhc3MgU2h1dGRvd25UaHJlYWQgOiBUaHJlYWQgeworICB0aGlzKFRDYW5jZWxsYXRpb25PcmlnaW4gY2FuY2VsbGF0aW9uKSB7CisgICAgY2FuY2VsbGF0aW9uXyA9IGNhbmNlbGxhdGlvbjsKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorICAKK3ByaXZhdGU6CisgIHZvaWQgcnVuKCkgeworICAgIHdoaWxlICghZ1NodXRkb3duKSB7CisgICAgICBUaHJlYWQuc2xlZXAoZHVyISgibXNlY3MiKSgyNSkpOworICAgIH0KKyAgICBjYW5jZWxsYXRpb25fLnRyaWdnZXIoKTsKKyAgfQorICAKKyAgVENhbmNlbGxhdGlvbk9yaWdpbiBjYW5jZWxsYXRpb25fOworfQorCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICB1c2hvcnQgcG9ydCA9IDkwOTA7CisgIFNlcnZlclR5cGUgc2VydmVyVHlwZTsKKyAgUHJvdG9jb2xUeXBlIHByb3RvY29sVHlwZTsKKyAgc2l6ZV90IG51bUlPVGhyZWFkcyA9IDE7CisgIFRyYW5zcG9ydFR5cGUgdHJhbnNwb3J0VHlwZTsKKyAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB0cmFjZSA9IHRydWU7CisgIHNpemVfdCB0YXNrUG9vbFNpemUgPSB0b3RhbENQVXM7CisKKyAgZ2V0b3B0KGFyZ3MsICJwb3J0IiwgJnBvcnQsICJwcm90b2NvbCIsICZwcm90b2NvbFR5cGUsICJzZXJ2ZXItdHlwZSIsCisgICAgJnNlcnZlclR5cGUsICJzc2wiLCAmc3NsLCAibnVtLWlvLXRocmVhZHMiLCAmbnVtSU9UaHJlYWRzLAorICAgICJ0YXNrLXBvb2wtc2l6ZSIsICZ0YXNrUG9vbFNpemUsICJ0cmFjZSIsICZ0cmFjZSwKKyAgICAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydFR5cGUpOworCisgIGlmIChzZXJ2ZXJUeXBlID09IFNlcnZlclR5cGUubm9uYmxvY2tpbmcgfHwKKyAgICBzZXJ2ZXJUeXBlID09IFNlcnZlclR5cGUucG9vbGVkTm9uYmxvY2tpbmcKKyAgKSB7CisgICAgZW5mb3JjZSh0cmFuc3BvcnRUeXBlID09IFRyYW5zcG9ydFR5cGUuZnJhbWVkLAorICAgICAgIk5lZWQgdG8gdXNlIGZyYW1lZCB0cmFuc3BvcnQgd2l0aCBub24tYmxvY2tpbmcgc2VydmVyLiIpOworICAgIGVuZm9yY2UoIXNzbCwgIlRoZSBub24tYmxvY2tpbmcgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgU1NMIHlldC4iKTsKKworICAgIC8vIERvbid0IHdyYXAgdGhlIGNvbnRlbnRzIGludG8gYW5vdGhlciBsYXllciBvZiBmcmFtaW5nLgorICAgIHRyYW5zcG9ydFR5cGUgPSBUcmFuc3BvcnRUeXBlLnJhdzsKKyAgfQorCisgIHZlcnNpb24gKFRocmlmdFRlc3RUZW1wbGF0ZXMpIHsKKyAgICAvLyBPbmx5IGV4ZXJjaXNlIHRoZSBzcGVjaWFsaXplZCB0ZW1wbGF0ZSBjb2RlIHBhdGhzIGlmIGV4cGxpY2l0bHkgZW5hYmxlZAorICAgIC8vIHRvIHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24gb24gcmVndWxhciB0ZXN0IHN1aXRlIHJ1bnMg4oCTIHRoZXJlIHNob3VsZAorICAgIC8vIG5vdCBiZSBtdWNoIHRoYXQgY2FuIGdvIHdyb25nIHdpdGggdGhhdCBzcGVjaWZpY2FsbHkgYW55d2F5LgorICAgIGFsaWFzIFR5cGVUdXBsZSEoVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0LCBUU2VydmVySHR0cFRyYW5zcG9ydCkKKyAgICAgIEF2YWlsYWJsZVRyYW5zcG9ydHM7CisgICAgYWxpYXMgVHlwZVR1cGxlISgKKyAgICAgIHN0YXRpY01hcCEoVEJpbmFyeVByb3RvY29sLCBBdmFpbGFibGVUcmFuc3BvcnRzKSwKKyAgICAgIHN0YXRpY01hcCEoVENvbXBhY3RQcm90b2NvbCwgQXZhaWxhYmxlVHJhbnNwb3J0cykKKyAgICApIEF2YWlsYWJsZVByb3RvY29sczsKKyAgfSBlbHNlIHsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKCkgQXZhaWxhYmxlVHJhbnNwb3J0czsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKCkgQXZhaWxhYmxlUHJvdG9jb2xzOworICB9CisKKyAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisgIGZpbmFsIHN3aXRjaCAocHJvdG9jb2xUeXBlKSB7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuYmluYXJ5OgorICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhQXZhaWxhYmxlVHJhbnNwb3J0czsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUHJvdG9jb2xUeXBlLmNvbXBhY3Q6CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkhQXZhaWxhYmxlVHJhbnNwb3J0czsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUHJvdG9jb2xUeXBlLmpzb246CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbEZhY3RvcnkhQXZhaWxhYmxlVHJhbnNwb3J0czsKKyAgICAgIGJyZWFrOworICB9CisKKyAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhKFRocmlmdFRlc3QsIEF2YWlsYWJsZVByb3RvY29scykoCisgICAgbmV3IFRlc3RIYW5kbGVyKHRyYWNlKSk7CisKKyAgVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7CisgIGlmIChzc2wpIHsKKyAgICBhdXRvIHNzbENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKKyAgICBzc2xDb250ZXh0LnNlcnZlclNpZGUgPSB0cnVlOworICAgIHNzbENvbnRleHQubG9hZENlcnRpZmljYXRlKCIuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmNydCIpOworICAgIHNzbENvbnRleHQubG9hZFByaXZhdGVLZXkoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5Iik7CisgICAgc3NsQ29udGV4dC5jaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CisgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsQ29udGV4dCk7CisgIH0gZWxzZSB7CisgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCk7CisgIH0KKworICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBjcmVhdGVUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydFR5cGUpOworCisgIGF1dG8gc2VydmVyID0gY3JlYXRlU2VydmVyKHNlcnZlclR5cGUsIG51bUlPVGhyZWFkcywgdGFza1Bvb2xTaXplLAorICAgIHByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworCisgIC8vIFNldCB1cCBTSUdJTlQgc2lnbmFsIGhhbmRsaW5nCisgIHNpZ2ZuX3Qgb2xkSGFuZGxlciA9IHNpZ25hbChTSUdJTlQsICZoYW5kbGVTaWduYWwpOworICBlbmZvcmNlKG9sZEhhbmRsZXIgIT0gU0lHX0VSUiwKKyAgICAiQ291bGQgbm90IHJlcGxhY2UgdGhlIFNJR0lOVCBzaWduYWwgaGFuZGxlcjogZXJybm8gezB9Ii5mb3JtYXQoZXJybm8oKSkpOworICAKKyAgLy8gU2V0IHVwIGEgc2VydmVyIGNhbmNlbGxhdGlvbiB0cmlnZ2VyCisgIGF1dG8gY2FuY2VsID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW4oKTsKKworICAvLyBTZXQgdXAgYSBsaXN0ZW5lciBmb3IgdGhlIHNodXRkb3duIGNvbmRpdGlvbiAtIHRoaXMgd2lsbAorICAvLyB3YWtlIHVwIHdoZW4gdGhlIHNpZ25hbCBvY2N1cnMgYW5kIHRyaWdnZXIgY2FuY2VsbGF0aW9uLgorICBhdXRvIHNodXRkb3duID0gbmV3IFNodXRkb3duVGhyZWFkKGNhbmNlbCk7CisgIHNodXRkb3duLnN0YXJ0KCk7CisgIAorICAvLyBTZXJ2ZSBmcm9tIHRoaXMgdGhyZWFkOyB0aGUgc2lnbmFsIHdpbGwgc3RvcCB0aGUgc2VydmVyCisgIC8vIGFuZCBjb250cm9sIHdpbGwgcmV0dXJuIGhlcmUKKyAgd3JpdGVmbG4oIlN0YXJ0aW5nICVzLyVzICVzIFRocmlmdFRlc3Qgc2VydmVyICVzb24gcG9ydCAlcy4uLiIsIHByb3RvY29sVHlwZSwKKyAgICB0cmFuc3BvcnRUeXBlLCBzZXJ2ZXJUeXBlLCBzc2wgPyAiKHVzaW5nIFNTTCkgIjogIiIsIHBvcnQpOworICBzZXJ2ZXIuc2VydmUoY2FuY2VsKTsKKyAgc2h1dGRvd24uam9pbigpOworICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyAgICAKKyAgd3JpdGVsbigiZG9uZS4iKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZCBiL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjNlMDNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCkBAIC0wLDAgKzEsODAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogRXhlcmNpc2VzIHZhcmlvdXMgdHJhbnNwb3J0cywgY29tYmluZWQgd2l0aCB0aGUgYnVmZmVyZWQvZnJhbWVkIHdyYXBwZXJzLgorICoKKyAqIE9yaWdpbmFsbHkgcG9ydGVkIGZyb20gdGhlIEMrKyB2ZXJzaW9uLCB3aXRoIFdpbmRvd3Mgc3VwcG9ydCBjb2RlIGFkZGVkLgorICovCittb2R1bGUgdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCBjb3JlLmF0b21pYzsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbjsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5kYXRldGltZTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK3N0YXRpYyBpbXBvcnQgc3RkLmZpbGU7CitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQucmFuZG9tIDogcm5kR2VuLCB1bmlmb3JtLCB1bnByZWRpY3RhYmxlU2VlZDsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQuc3RyaW5nOworaW1wb3J0IHN0ZC50eXBldHVwbGU7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5maWxlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuaHR0cDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnpsaWI7CisKKy8qCisgKiBTaXplIGdlbmVyYXRpb24gaGVscGVycyDigJMgdXNlZCB0byBiZSBhYmxlIHRvIHJ1biB0aGUgc2FtZSB0ZXN0aW5nIGNvZGUKKyAqIHdpdGggYm90aCBjb25zdGFudCBhbmQgcmFuZG9tIHRvdGFsL2NodW5rIHNpemVzLgorICovCisKK2ludGVyZmFjZSBTaXplR2VuZXJhdG9yIHsKKyAgc2l6ZV90IG5leHRTaXplKCk7CisgIHN0cmluZyB0b1N0cmluZygpOworfQorCitjbGFzcyBDb25zdGFudFNpemVHZW5lcmF0b3IgOiBTaXplR2VuZXJhdG9yIHsKKyAgdGhpcyhzaXplX3QgdmFsdWUpIHsKKyAgICB2YWx1ZV8gPSB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCBuZXh0U2l6ZSgpIHsKKyAgICByZXR1cm4gdmFsdWVfOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiB0byFzdHJpbmcodmFsdWVfKTsKKyAgfQorCitwcml2YXRlOgorICBzaXplX3QgdmFsdWVfOworfQorCitjbGFzcyBSYW5kb21TaXplR2VuZXJhdG9yIDogU2l6ZUdlbmVyYXRvciB7CisgIHRoaXMoc2l6ZV90IG1pbiwgc2l6ZV90IG1heCkgeworICAgIG1pbl8gPSBtaW47CisgICAgbWF4XyA9IG1heDsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCBuZXh0U2l6ZSgpIHsKKyAgICByZXR1cm4gdW5pZm9ybSEiW10iKG1pbl8sIG1heF8pOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBmb3JtYXQoInJhbmQoJXMsICVzKSIsIG1pbl8sIG1heF8pOworICB9CisKKyAgc2l6ZV90IG1pbigpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG1pbl87CisgIH0KKworICBzaXplX3QgbWF4KCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbWF4XzsKKyAgfQorCitwcml2YXRlOgorICBzaXplX3QgbWluXzsKKyAgc2l6ZV90IG1heF87Cit9CisKKworLyoKKyAqIENsYXNzZXMgdG8gc2V0IHVwIGNvdXBsZWQgdHJhbnNwb3J0cworICovCisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHJlcHJlc2VudCBhIGNvdXBsZWQgcGFpciBvZiB0cmFuc3BvcnRzLgorICoKKyAqIERhdGEgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHRyYW5zcG9ydCBjYW4gYmUgcmVhZCBmcm9tIHRoZSBpbnB1dCB0cmFuc3BvcnQuCisgKgorICogVGhpcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgdmFyaW91cyBjb3VwbGVkIHRyYW5zcG9ydAorICogaW1wbGVtZW50YXRpb25zLiBJdCBzaG91bGRuJ3QgYmUgdXNlZCBkaXJlY3RseS4KKyAqLworY2xhc3MgQ291cGxlZFRyYW5zcG9ydHMoVHJhbnNwb3J0KSBpZiAoaXNUVHJhbnNwb3J0IVRyYW5zcG9ydCkgeworICBUcmFuc3BvcnQgaW5wdXQ7CisgIFRyYW5zcG9ydCBvdXRwdXQ7Cit9CisKK3RlbXBsYXRlIGlzQ291cGxlZFRyYW5zcG9ydHMoVCkgeworICBzdGF0aWMgaWYgKGlzKFQgXyA6IENvdXBsZWRUcmFuc3BvcnRzIVUsIFUpKSB7CisgICAgZW51bSBpc0NvdXBsZWRUcmFuc3BvcnRzID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzQ291cGxlZFRyYW5zcG9ydHMgPSBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSBjbGFzcyBmb3IgY3JlYXRpbmcgY291cGxlZCB0cmFuc3BvcnRzIHRoYXQgd3JhcAorICogYW5vdGhlciB0cmFuc3BvcnQuCisgKi8KK2NsYXNzIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0cyhXcmFwcGVyVHJhbnNwb3J0LCBJbm5lckNvdXBsZWRUcmFuc3BvcnRzKSBpZiAoCisgIGlzVFRyYW5zcG9ydCFXcmFwcGVyVHJhbnNwb3J0ICYmIGlzQ291cGxlZFRyYW5zcG9ydHMhSW5uZXJDb3VwbGVkVHJhbnNwb3J0cworKSA6IENvdXBsZWRUcmFuc3BvcnRzIVdyYXBwZXJUcmFuc3BvcnQgeworICB0aGlzKCkgeworICAgIGlubmVyXyA9IG5ldyBJbm5lckNvdXBsZWRUcmFuc3BvcnRzKCk7CisgICAgaWYgKGlubmVyXy5pbnB1dCkgeworICAgICAgaW5wdXQgPSBuZXcgV3JhcHBlclRyYW5zcG9ydChpbm5lcl8uaW5wdXQpOworICAgIH0KKyAgICBpZiAoaW5uZXJfLm91dHB1dCkgeworICAgICAgb3V0cHV0ID0gbmV3IFdyYXBwZXJUcmFuc3BvcnQoaW5uZXJfLm91dHB1dCk7CisgICAgfQorICB9CisKKyAgfnRoaXMoKSB7CisgICAgZGVzdHJveShpbm5lcl8pOworICB9CisKK3ByaXZhdGU6CisgIElubmVyQ291cGxlZFRyYW5zcG9ydHMgaW5uZXJfOworfQorCitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW4gOiBQQXBwbHk7CithbGlhcyBQQXBwbHkhKENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0cywgVEJ1ZmZlcmVkVHJhbnNwb3J0KSBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzOworYWxpYXMgUEFwcGx5IShDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHMsIFRGcmFtZWRUcmFuc3BvcnQpIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzOworYWxpYXMgUEFwcGx5IShDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHMsIFRabGliVHJhbnNwb3J0KSBDb3VwbGVkWmxpYlRyYW5zcG9ydHM7CisKKy8qKgorICogQ291cGxlZCBUTWVtb3J5QnVmZmVycy4KKyAqLworY2xhc3MgQ291cGxlZE1lbW9yeUJ1ZmZlcnMgOiBDb3VwbGVkVHJhbnNwb3J0cyFUTWVtb3J5QnVmZmVyIHsKKyAgdGhpcygpIHsKKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgICBpbnB1dCA9IGJ1ZjsKKyAgICBvdXRwdXQgPSBidWY7CisgIH0KKworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKK30KKworLyoqCisgKiBDb3VwbGVkIFRTb2NrZXRzLgorICovCitjbGFzcyBDb3VwbGVkU29ja2V0VHJhbnNwb3J0cyA6IENvdXBsZWRUcmFuc3BvcnRzIVRTb2NrZXQgeworICB0aGlzKCkgeworICAgIGF1dG8gc29ja2V0cyA9IHNvY2tldFBhaXIoKTsKKyAgICBpbnB1dCA9IG5ldyBUU29ja2V0KHNvY2tldHNbMF0pOworICAgIG91dHB1dCA9IG5ldyBUU29ja2V0KHNvY2tldHNbMV0pOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgaW5wdXQuY2xvc2UoKTsKKyAgICBvdXRwdXQuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIENvdXBsZWQgVEZpbGVUcmFuc3BvcnRzCisgKi8KK2NsYXNzIENvdXBsZWRGaWxlVHJhbnNwb3J0cyA6IENvdXBsZWRUcmFuc3BvcnRzIVRUcmFuc3BvcnQgeworICB0aGlzKCkgeworICAgIC8vIFdlIGFjdHVhbGx5IG5lZWQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgdGVtcCBmaWxlIGhlcmUsIHNvIHdlIGNhbid0IGp1c3QKKyAgICAvLyB1c2UgdGhlIHVzdWFsIHRlbXBmaWxlIGZhY2lsaXRpZXMuCisgICAgZG8geworICAgICAgZmlsZU5hbWVfID0gdG1wRGlyIH4gIi90aHJpZnQudHJhbnNwb3J0X3Rlc3QuIiB+IHRvIXN0cmluZyhybmRHZW4oKS5mcm9udCk7CisgICAgICBybmRHZW4oKS5wb3BGcm9udCgpOworICAgIH0gd2hpbGUgKHN0ZC5maWxlLmV4aXN0cyhmaWxlTmFtZV8pKTsKKworICAgIHdyaXRlZmxuKCJVc2luZyB0ZW1wIGZpbGU6ICVzIiwgZmlsZU5hbWVfKTsKKworICAgIGF1dG8gd3JpdGVyID0gbmV3IFRGaWxlV3JpdGVyVHJhbnNwb3J0KGZpbGVOYW1lXyk7CisgICAgd3JpdGVyLm9wZW4oKTsKKyAgICBvdXRwdXQgPSB3cml0ZXI7CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZSBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgd3JpdGVyLmZsdXNoKCk7CisKKyAgICBhdXRvIHJlYWRlciA9IG5ldyBURmlsZVJlYWRlclRyYW5zcG9ydChmaWxlTmFtZV8pOworICAgIHJlYWRlci5vcGVuKCk7CisgICAgcmVhZGVyLnJlYWRUaW1lb3V0KGR1ciEibXNlY3MiKC0xKSk7CisgICAgaW5wdXQgPSByZWFkZXI7CisgIH0KKworICB+dGhpcygpIHsKKyAgICBpbnB1dC5jbG9zZSgpOworICAgIG91dHB1dC5jbG9zZSgpOworICAgIHN0ZC5maWxlLnJlbW92ZShmaWxlTmFtZV8pOworICB9CisKKyAgc3RhdGljIHN0cmluZyB0bXBEaXI7CisKK3ByaXZhdGU6CisgIHN0cmluZyBmaWxlTmFtZV87Cit9CisKKworLyoKKyAqIFRlc3QgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBUZXN0IGludGVybGVhdmVkIHdyaXRlIGFuZCByZWFkIGNhbGxzLgorICoKKyAqIEdlbmVyYXRlcyBhIGJ1ZmZlciB0b3RhbFNpemUgYnl0ZXMgbG9uZywgdGhlbiB3cml0ZXMgaXQgdG8gdGhlIHRyYW5zcG9ydCwKKyAqIGFuZCB2ZXJpZmllcyB0aGUgd3JpdHRlbiBkYXRhIGNhbiBiZSByZWFkIGJhY2sgY29ycmVjdGx5LgorICoKKyAqIE1vZGUgb2Ygb3BlcmF0aW9uOgorICogLSBjYWxsIHdDaHVua0dlbmVyYXRvciB0byBmaWd1cmUgb3V0IGhvdyBsYXJnZSBvZiBhIGNodW5rIHRvIHdyaXRlCisgKiAgIC0gY2FsbCB3U2l6ZUdlbmVyYXRvciB0byBnZXQgdGhlIHNpemUgZm9yIGluZGl2aWR1YWwgd3JpdGUoKSBjYWxscywKKyAqICAgICBhbmQgZG8gdGhpcyByZXBlYXRlZGx5IHVudGlsIHRoZSBlbnRpcmUgY2h1bmsgaXMgd3JpdHRlbi4KKyAqIC0gY2FsbCByQ2h1bmtHZW5lcmF0b3IgdG8gZmlndXJlIG91dCBob3cgbGFyZ2Ugb2YgYSBjaHVuayB0byByZWFkCisgKiAgIC0gY2FsbCByU2l6ZUdlbmVyYXRvciB0byBnZXQgdGhlIHNpemUgZm9yIGluZGl2aWR1YWwgcmVhZCgpIGNhbGxzLAorICogICAgIGFuZCBkbyB0aGlzIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVudGlyZSBjaHVuayBpcyByZWFkLgorICogLSByZXBlYXQgdW50aWwgdGhlIGZ1bGwgYnVmZmVyIGlzIHdyaXR0ZW4gYW5kIHJlYWQgYmFjaywKKyAqICAgdGhlbiBjb21wYXJlIHRoZSBkYXRhIHJlYWQgYmFjayBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBidWZmZXIKKyAqCisgKgorICogLSBJZiBhbnkgb2YgdGhlIHNpemUgZ2VuZXJhdG9ycyByZXR1cm4gMCwgdGhpcyBtZWFucyB0byB1c2UgdGhlIG1heGltdW0KKyAqICAgcG9zc2libGUgc2l6ZS4KKyAqCisgKiAtIElmIG1heE91dHN0YW5kaW5nIGlzIG5vbi16ZXJvLCB3cml0ZSBjaHVuayBzaXplcyB3aWxsIGJlIGNob3NlbiBzdWNoIHRoYXQKKyAqICAgdGhlcmUgYXJlIG5ldmVyIG1vcmUgdGhhbiBtYXhPdXRzdGFuZGluZyBieXRlcyB3YWl0aW5nIHRvIGJlIHJlYWQgYmFjay4KKyAqLwordm9pZCB0ZXN0UmVhZFdyaXRlKENvdXBsZWRUcmFuc3BvcnRzKSgKKyAgc2l6ZV90IHRvdGFsU2l6ZSwKKyAgU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbmVyYXRvciwKKyAgU2l6ZUdlbmVyYXRvciByU2l6ZUdlbmVyYXRvciwKKyAgU2l6ZUdlbmVyYXRvciB3Q2h1bmtHZW5lcmF0b3IsCisgIFNpemVHZW5lcmF0b3IgckNodW5rR2VuZXJhdG9yLAorICBzaXplX3QgbWF4T3V0c3RhbmRpbmcKKykgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIGF1dG8gd2J1ZiA9IG5ldyB1Ynl0ZVt0b3RhbFNpemVdOworICBhdXRvIHJidWYgPSBuZXcgdWJ5dGVbdG90YWxTaXplXTsKKworICAvLyBTdG9yZSBzb21lIGRhdGEgaW4gd2J1Zi4KKyAgZm9yZWFjaCAoaSwgcmVmIGI7IHdidWYpIHsKKyAgICBiID0gaSAmIDB4ZmY7CisgIH0KKworICBzaXplX3QgdG90YWxXcml0dGVuOworICBzaXplX3QgdG90YWxSZWFkOworICB3aGlsZSAodG90YWxSZWFkIDwgdG90YWxTaXplKSB7CisgICAgLy8gRGV0ZXJtaW5lIGhvdyBsYXJnZSBhIGNodW5rIG9mIGRhdGEgdG8gd3JpdGUuCisgICAgYXV0byB3Q2h1bmtTaXplID0gd0NodW5rR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgaWYgKHdDaHVua1NpemUgPT0gMCB8fCB3Q2h1bmtTaXplID4gdG90YWxTaXplIC0gdG90YWxXcml0dGVuKSB7CisgICAgICB3Q2h1bmtTaXplID0gdG90YWxTaXplIC0gdG90YWxXcml0dGVuOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSAodG90YWxXcml0dGVuIC0gdG90YWxSZWFkKSArIHdDaHVua1NpemUgaXMgbGVzcyB0aGFuCisgICAgLy8gbWF4T3V0c3RhbmRpbmcuCisgICAgaWYgKG1heE91dHN0YW5kaW5nID4gMCAmJgorICAgICAgICB3Q2h1bmtTaXplID4gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxXcml0dGVuIC0gdG90YWxSZWFkKSkgeworICAgICAgd0NodW5rU2l6ZSA9IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsV3JpdHRlbiAtIHRvdGFsUmVhZCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIGNodW5rLgorICAgIHNpemVfdCBjaHVua1dyaXR0ZW4gPSAwOworICAgIHdoaWxlIChjaHVua1dyaXR0ZW4gPCB3Q2h1bmtTaXplKSB7CisgICAgICBhdXRvIHdyaXRlU2l6ZSA9IHdTaXplR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgICBpZiAod3JpdGVTaXplID09IDAgfHwgd3JpdGVTaXplID4gd0NodW5rU2l6ZSAtIGNodW5rV3JpdHRlbikgeworICAgICAgICB3cml0ZVNpemUgPSB3Q2h1bmtTaXplIC0gY2h1bmtXcml0dGVuOworICAgICAgfQorCisgICAgICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3YnVmW3RvdGFsV3JpdHRlbiAuLiB0b3RhbFdyaXR0ZW4gKyB3cml0ZVNpemVdKTsKKyAgICAgIGNodW5rV3JpdHRlbiArPSB3cml0ZVNpemU7CisgICAgICB0b3RhbFdyaXR0ZW4gKz0gd3JpdGVTaXplOworICAgIH0KKworICAgIC8vIEZsdXNoIHRoZSBkYXRhLCBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgcmVhZCB0cmFuc3BvcnQKKyAgICAvLyBEb24ndCBmbHVzaCBpZiB3Q2h1bmtTaXplIGlzIDAuIChUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZgorICAgIC8vIHRvdGFsV3JpdHRlbiA9PSB0b3RhbFNpemUgYWxyZWFkeSwgYW5kIHdlJ3JlIG9ubHkgcmVhZGluZyBub3cuKQorICAgIGlmICh3Q2h1bmtTaXplID4gMCkgeworICAgICAgdHJhbnNwb3J0cy5vdXRwdXQuZmx1c2goKTsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgaG93IGxhcmdlIGEgY2h1bmsgb2YgZGF0YSB0byByZWFkIGJhY2suCisgICAgYXV0byByQ2h1bmtTaXplID0gckNodW5rR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgaWYgKHJDaHVua1NpemUgPT0gMCB8fCByQ2h1bmtTaXplID4gdG90YWxXcml0dGVuIC0gdG90YWxSZWFkKSB7CisgICAgICByQ2h1bmtTaXplID0gdG90YWxXcml0dGVuIC0gdG90YWxSZWFkOworICAgIH0KKworICAgIC8vIFJlYWQgdGhlIGNodW5rLgorICAgIHNpemVfdCBjaHVua1JlYWQ7CisgICAgd2hpbGUgKGNodW5rUmVhZCA8IHJDaHVua1NpemUpIHsKKyAgICAgIGF1dG8gcmVhZFNpemUgPSByU2l6ZUdlbmVyYXRvci5uZXh0U2l6ZSgpOworICAgICAgaWYgKHJlYWRTaXplID09IDAgfHwgcmVhZFNpemUgPiByQ2h1bmtTaXplIC0gY2h1bmtSZWFkKSB7CisgICAgICAgIHJlYWRTaXplID0gckNodW5rU2l6ZSAtIGNodW5rUmVhZDsKKyAgICAgIH0KKworICAgICAgc2l6ZV90IGJ5dGVzUmVhZDsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZCgKKyAgICAgICAgICByYnVmW3RvdGFsUmVhZCAuLiB0b3RhbFJlYWQgKyByZWFkU2l6ZV0pOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZm9ybWF0KGByZWFkKHBvcyA9ICVzLCBzaXplID0gJXMpIHRocmV3IGAgfgorICAgICAgICAgIGBleGNlcHRpb24gIiVzIjsgd3JpdHRlbiBzbyBmYXI6ICVzLyVzIGJ5dGVzYCwgdG90YWxSZWFkLCByZWFkU2l6ZSwKKyAgICAgICAgICBlLm1zZywgdG90YWxXcml0dGVuLCB0b3RhbFNpemUpKTsKKyAgICAgIH0KKworICAgICAgZW5mb3JjZShieXRlc1JlYWQgPiAwLCBmb3JtYXQoYHJlYWQocG9zID0gJXMsIHNpemUgPSAlcykgcmV0dXJuZWQgJXM7IGAgfgorICAgICAgICBgd3JpdHRlbiBzbyBmYXI6ICVzLyVzIGJ5dGVzYCwgdG90YWxSZWFkLCByZWFkU2l6ZSwgYnl0ZXNSZWFkLAorICAgICAgICB0b3RhbFdyaXR0ZW4sIHRvdGFsU2l6ZSkpOworCisgICAgICBjaHVua1JlYWQgKz0gYnl0ZXNSZWFkOworICAgICAgdG90YWxSZWFkICs9IGJ5dGVzUmVhZDsKKyAgICB9CisgIH0KKworICAvLyBtYWtlIHN1cmUgdGhlIGRhdGEgcmVhZCBiYWNrIGlzIGlkZW50aWNhbCB0byB0aGUgZGF0YSB3cml0dGVuCisgIGlmIChyYnVmICE9IHdidWYpIHsKKyAgICBzdGRlcnIud3JpdGVmbG4oIiVzIHZzLiAlcyIsIHdidWZbJCAtIDQgLi4gJF0sIHJidWZbJCAtIDQgLi4gJF0pOworICAgIHN0ZGVyci53cml0ZWZsbigicmJ1ZjogJXMgdnMuIHdidWY6ICVzIiwgcmJ1Zi5sZW5ndGgsIHdidWYubGVuZ3RoKTsKKyAgfQorICBlbmZvcmNlKHJidWYgPT0gd2J1Zik7Cit9CisKK3ZvaWQgdGVzdFJlYWRQYXJ0QXZhaWxhYmxlKENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICB1Ynl0ZVsxMF0gd3JpdGVCdWYgPSAnYSc7CisgIHVieXRlWzEwXSByZWFkQnVmOworCisgIC8vIEF0dGVtcGluZyB0byByZWFkIDEwIGJ5dGVzIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUgc2hvdWxkIHJldHVybiA5CisgIC8vIGltbWVkaWF0ZWx5LgorICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3cml0ZUJ1ZlswIC4uIDldKTsKKyAgdHJhbnNwb3J0cy5vdXRwdXQuZmx1c2goKTsKKworICBhdXRvIHQgPSBUcmlnZ2VyKGR1ciEic2Vjb25kcyIoMyksIHRyYW5zcG9ydHMub3V0cHV0LCAxKTsKKyAgYXV0byBieXRlc1JlYWQgPSB0cmFuc3BvcnRzLmlucHV0LnJlYWQocmVhZEJ1Zik7CisgIGVuZm9yY2UodC5maXJlZCA9PSAwKTsKKyAgZW5mb3JjZShieXRlc1JlYWQgPT0gOSk7Cit9CisKK3ZvaWQgdGVzdFJlYWRQYXJ0aWFsTWlkZnJhbWUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIHVieXRlWzEzXSB3cml0ZUJ1ZiA9ICdhJzsKKyAgdWJ5dGVbMTRdIHJlYWRCdWY7CisKKyAgLy8gQXR0ZW1wdCB0byByZWFkIDEwIGJ5dGVzLCB3aGVuIG9ubHkgOSBhcmUgYXZhaWxhYmxlLCBidXQgYWZ0ZXIgd2UgaGF2ZQorICAvLyBhbHJlYWR5IHJlYWQgcGFydCBvZiB0aGUgZGF0YSB0aGF0IGlzIGF2YWlsYWJsZS4gIFRoaXMgZXhlcmNpc2VzIGEKKyAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aCBmb3Igc2V2ZXJhbCBvZiB0aGUgdHJhbnNwb3J0cy4KKyAgLy8KKyAgLy8gRm9yIHRyYW5zcG9ydHMgdGhhdCBhZGQgdGhlaXIgb3duIGZyYW1pbmcgKGUuZy4sIFRGcmFtZWRUcmFuc3BvcnQgYW5kCisgIC8vIFRGaWxlVHJhbnNwb3J0KSwgdGhlIHR3byBmbHVzaCBjYWxscyBicmVhayB1cCB0aGUgZGF0YSBpbiB0byBhIDEwIGJ5dGUKKyAgLy8gZnJhbWUgYW5kIGEgMyBieXRlIGZyYW1lLiAgVGhlIGZpcnN0IHJlYWQgdGhlbiBwdXRzIHVzIHBhcnR3YXkgdGhyb3VnaCB0aGUKKyAgLy8gZmlyc3QgZnJhbWUsIGFuZCB0aGVuIHdlIGF0dGVtcHQgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhhdCBmcmFtZSwgYW5kCisgIC8vIHRocm91Z2ggdGhlIG5leHQgZnJhbWUsIHRvby4KKyAgLy8KKyAgLy8gRm9yIGJ1ZmZlcmVkIHRyYW5zcG9ydHMgdGhhdCBwZXJmb3JtIHJlYWQtYWhlYWQgKGUuZy4sCisgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCksIHRoZSByZWFkLWFoZWFkIHdpbGwgbW9zdCBsaWtlbHkgc2VlIGFsbCAxMyBieXRlcworICAvLyB3cml0dGVuIG9uIHRoZSBmaXJzdCByZWFkLiAgVGhlIG5leHQgcmVhZCB3aWxsIHRoZW4gYXR0ZW1wdCB0byByZWFkIHBhc3QKKyAgLy8gdGhlIGVuZCBvZiB0aGUgcmVhZC1haGVhZCBidWZmZXIuCisgIC8vCisgIC8vIEZsdXNoIDEwIGJ5dGVzLCB0aGVuIDMgYnl0ZXMuICBUaGlzIGNyZWF0ZXMgMiBzZXBhcmF0ZSBmcmFtZXMgZm9yCisgIC8vIHRyYW5zcG9ydHMgdGhhdCB0cmFjayBmcmFtaW5nIGludGVybmFsbHkuCisgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdyaXRlQnVmWzAgLi4gMTBdKTsKKyAgdHJhbnNwb3J0cy5vdXRwdXQuZmx1c2goKTsKKyAgdHJhbnNwb3J0cy5vdXRwdXQud3JpdGUod3JpdGVCdWZbMTAgLi4gMTNdKTsKKyAgdHJhbnNwb3J0cy5vdXRwdXQuZmx1c2goKTsKKworICAvLyBOb3cgcmVhZCA0IGJ5dGVzLCBzbyB0aGF0IHdlIGFyZSBwYXJ0d2F5IHRocm91Z2ggdGhlIHdyaXR0ZW4gZGF0YS4KKyAgYXV0byBieXRlc1JlYWQgPSB0cmFuc3BvcnRzLmlucHV0LnJlYWQocmVhZEJ1ZlswIC4uIDRdKTsKKyAgZW5mb3JjZShieXRlc1JlYWQgPT0gNCk7CisKKyAgLy8gTm93IGF0dGVtcHQgdG8gcmVhZCAxMCBieXRlcy4gIE9ubHkgOSBtb3JlIGFyZSBhdmFpbGFibGUuCisgIC8vCisgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhbGwgOSBieXRlcywgYnV0IGl0IG1pZ2h0IHRha2UgbXVsdGlwbGUgcmVhZAorICAvLyBjYWxscywgc2luY2UgaXQgaXMgdmFsaWQgZm9yIHJlYWQoKSB0byByZXR1cm4gZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQuCisgIC8vIChNb3N0IHRyYW5zcG9ydHMgZG8gaW1tZWRpYXRlbHkgcmV0dXJuIDkgYnl0ZXMsIGJ1dCB0aGUgZnJhbWluZyB0cmFuc3BvcnRzCisgIC8vIHRlbmQgdG8gb25seSByZXR1cm4gdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZSwgd2hpY2ggaXMgNiBieXRlcyBpbgorICAvLyB0aGlzIGNhc2UuKQorICBzaXplX3QgdG90YWxSZWFkID0gMDsKKyAgd2hpbGUgKHRvdGFsUmVhZCA8IDkpIHsKKyAgICBhdXRvIHQgPSBUcmlnZ2VyKGR1ciEic2Vjb25kcyIoMyksIHRyYW5zcG9ydHMub3V0cHV0LCAxKTsKKyAgICBieXRlc1JlYWQgPSB0cmFuc3BvcnRzLmlucHV0LnJlYWQocmVhZEJ1Zls0ICsgdG90YWxSZWFkIC4uIDE0XSk7CisgICAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICAgIGVuZm9yY2UoYnl0ZXNSZWFkID4gMCk7CisgICAgdG90YWxSZWFkICs9IGJ5dGVzUmVhZDsKKyAgICBlbmZvcmNlKHRvdGFsUmVhZCA8PSA5KTsKKyAgfQorCisgIGVuZm9yY2UodG90YWxSZWFkID09IDkpOworfQorCit2b2lkIHRlc3RCb3Jyb3dQYXJ0QXZhaWxhYmxlKENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICB1Ynl0ZVs5XSB3cml0ZUJ1ZiA9ICdhJzsKKyAgdWJ5dGVbMTBdIHJlYWRCdWY7CisKKyAgLy8gQXR0ZW1waW5nIHRvIGJvcnJvdyAxMCBieXRlcyB3aGVuIG9ubHkgOSBhcmUgYXZhaWxhYmxlIHNob3VsZCByZXR1cm4gTlVMTAorICAvLyBpbW1lZGlhdGVseS4KKyAgdHJhbnNwb3J0cy5vdXRwdXQud3JpdGUod3JpdGVCdWYpOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworCisgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigzKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDEpOworICBhdXRvIGJvcnJvd0xlbiA9IHJlYWRCdWYubGVuZ3RoOworICBhdXRvIGJvcnJvd2VkQnVmID0gdHJhbnNwb3J0cy5pbnB1dC5ib3Jyb3cocmVhZEJ1Zi5wdHIsIGJvcnJvd0xlbik7CisgIGVuZm9yY2UodC5maXJlZCA9PSAwKTsKKyAgZW5mb3JjZShib3Jyb3dlZEJ1ZiBpcyBudWxsKTsKK30KKwordm9pZCB0ZXN0UmVhZE5vbmVBdmFpbGFibGUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIC8vIEF0dGVtcHRpbmcgdG8gcmVhZCB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlIHNob3VsZCBlaXRoZXIgYmxvY2sgdW50aWwKKyAgLy8gc29tZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgZmFpbCBpbW1lZGlhdGVseS4gIChlLmcuLCBUU29ja2V0IGJsb2NrcywKKyAgLy8gVE1lbW9yeUJ1ZmZlciBqdXN0IGZhaWxzLikKKyAgLy8KKyAgLy8gSWYgdGhlIHRyYW5zcG9ydCBibG9ja3MsIGl0IHNob3VsZCBzdWNjZWVkIG9uY2Ugc29tZSBkYXRhIGlzIGF2YWlsYWJsZSwKKyAgLy8gZXZlbiBpZiBsZXNzIHRoYW4gdGhlIGFtb3VudCByZXF1ZXN0ZWQgYmVjb21lcyBhdmFpbGFibGUuCisgIHVieXRlWzEwXSByZWFkQnVmOworCisgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigxKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDIpOworICB0LmFkZChkdXIhInNlY29uZHMiKDEpLCB0cmFuc3BvcnRzLm91dHB1dCwgOCk7CisKKyAgYXV0byBieXRlc1JlYWQgPSB0cmFuc3BvcnRzLmlucHV0LnJlYWQocmVhZEJ1Zik7CisgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgIGVuZm9yY2UodC5maXJlZCA9PSAwKTsKKyAgfSBlbHNlIHsKKyAgICBlbmZvcmNlKHQuZmlyZWQgPT0gMSk7CisgICAgZW5mb3JjZShieXRlc1JlYWQgPT0gMik7CisgIH0KK30KKwordm9pZCB0ZXN0Qm9ycm93Tm9uZUF2YWlsYWJsZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgdWJ5dGVbMTZdIHdyaXRlQnVmID0gJ2EnOworCisgIC8vIEF0dGVtcHRpbmcgdG8gYm9ycm93IHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUgc2hvdWxkIGZhaWwgaW1tZWRpYXRlbHkKKyAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDEpLCB0cmFuc3BvcnRzLm91dHB1dCwgMTApOworCisgIGF1dG8gYm9ycm93TGVuID0gMTA7CisgIGF1dG8gYm9ycm93ZWRCdWYgPSB0cmFuc3BvcnRzLmlucHV0LmJvcnJvdyhudWxsLCBib3Jyb3dMZW4pOworICBlbmZvcmNlKGJvcnJvd2VkQnVmIGlzIG51bGwpOworICBlbmZvcmNlKHQuZmlyZWQgPT0gMCk7Cit9CisKKwordm9pZCBkb1J3VGVzdChDb3VwbGVkVHJhbnNwb3J0cykoCisgIHNpemVfdCB0b3RhbFNpemUsCisgIFNpemVHZW5lcmF0b3Igd1NpemVHZW4sCisgIFNpemVHZW5lcmF0b3IgclNpemVHZW4sCisgIFNpemVHZW5lcmF0b3Igd0NodW5rU2l6ZUdlbiA9IG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMCksCisgIFNpemVHZW5lcmF0b3IgckNodW5rU2l6ZUdlbiA9IG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMCksCisgIHNpemVfdCBtYXhPdXRzdGFuZGluZyA9IDAKKykgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgdG90YWxTaXplID0gY2FzdChzaXplX3QpKHRvdGFsU2l6ZSAqIGdfc2l6ZU11bHRpcGxpZXIpOworCisgIHNjb3BlKGZhaWx1cmUpIHsKKyAgICB3cml0ZWZsbigiVGVzdCBmYWlsZWQgZm9yICVzOiB0ZXN0UmVhZFdyaXRlKCVzLCAlcywgJXMsICVzLCAlcywgJXMpIiwKKyAgICAgIENvdXBsZWRUcmFuc3BvcnRzLnN0cmluZ29mLCB0b3RhbFNpemUsIHdTaXplR2VuLCByU2l6ZUdlbiwKKyAgICAgIHdDaHVua1NpemVHZW4sIHJDaHVua1NpemVHZW4sIG1heE91dHN0YW5kaW5nKTsKKyAgfQorCisgIHRlc3RSZWFkV3JpdGUhQ291cGxlZFRyYW5zcG9ydHModG90YWxTaXplLCB3U2l6ZUdlbiwgclNpemVHZW4sCisgICAgd0NodW5rU2l6ZUdlbiwgckNodW5rU2l6ZUdlbiwgbWF4T3V0c3RhbmRpbmcpOworfQorCit2b2lkIGRvQmxvY2tpbmdUZXN0KENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHZvaWQgd3JpdGVGYWlsdXJlKHN0cmluZyBuYW1lKSB7CisgICAgd3JpdGVmbG4oIlRlc3QgZmFpbGVkIGZvciAlczogJXMoKSIsIENvdXBsZWRUcmFuc3BvcnRzLnN0cmluZ29mLCBuYW1lKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RSZWFkUGFydEF2YWlsYWJsZSIpOworICAgIHRlc3RSZWFkUGFydEF2YWlsYWJsZSFDb3VwbGVkVHJhbnNwb3J0cygpOworICB9CisKKyAgeworICAgIHNjb3BlKGZhaWx1cmUpIHdyaXRlRmFpbHVyZSgidGVzdFJlYWRQYXJ0aWFsTWlkZnJhbWUiKTsKKyAgICB0ZXN0UmVhZFBhcnRpYWxNaWRmcmFtZSFDb3VwbGVkVHJhbnNwb3J0cygpOworICB9CisKKyAgeworICAgIHNjb3BlKGZhaWx1cmUpIHdyaXRlRmFpbHVyZSgidGVzdFJlYWROb25lQXZhbGlhYmxlIik7CisgICAgdGVzdFJlYWROb25lQXZhaWxhYmxlIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0Qm9ycm93UGFydEF2YWlsYWJsZSIpOworICAgIHRlc3RCb3Jyb3dQYXJ0QXZhaWxhYmxlIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0Qm9ycm93Tm9uZUF2YWlsYWJsZSIpOworICAgIHRlc3RCb3Jyb3dOb25lQXZhaWxhYmxlIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KK30KKworU2l6ZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoVCkoVCB0KSB7CisgIHN0YXRpYyBpZiAoaXMoVCA6IFNpemVHZW5lcmF0b3IpKSB7CisgICAgcmV0dXJuIHQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IodCk7CisgIH0KK30KKwordGVtcGxhdGUgV3JhcHBlZFRyYW5zcG9ydHMoVCkgaWYgKGlzQ291cGxlZFRyYW5zcG9ydHMhVCkgeworICBhbGlhcyBUeXBlVHVwbGUhKAorICAgIFQsCisgICAgQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0cyFULAorICAgIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzIVQsCisgICAgQ291cGxlZFpsaWJUcmFuc3BvcnRzIVQKKyAgKSBXcmFwcGVkVHJhbnNwb3J0czsKK30KKwordm9pZCB0ZXN0UncoQywgUiwgUykoCisgIHNpemVfdCB0b3RhbFNpemUsCisgIFIgd1NpemUsCisgIFMgclNpemUKKykgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUMgJiYgaXModHlwZW9mKGdldEdlbmVyYXRvcih3U2l6ZSkpKSAmJgorICBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHJTaXplKSkpCispIHsKKyAgdGVzdFJ3IUModG90YWxTaXplLCB3U2l6ZSwgclNpemUsIDAsIDAsIDApOworfQorCit2b2lkIHRlc3RSdyhDLCBSLCBTLCBULCBVKSgKKyAgc2l6ZV90IHRvdGFsU2l6ZSwKKyAgUiB3U2l6ZSwKKyAgUyByU2l6ZSwKKyAgVCB3Q2h1bmtTaXplLAorICBVIHJDaHVua1NpemUsCisgIHNpemVfdCBtYXhPdXRzdGFuZGluZyA9IDAKKykgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUMgJiYgaXModHlwZW9mKGdldEdlbmVyYXRvcih3U2l6ZSkpKSAmJgorICBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHJTaXplKSkpICYmIGlzKHR5cGVvZihnZXRHZW5lcmF0b3Iod0NodW5rU2l6ZSkpKSAmJgorICBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHJDaHVua1NpemUpKSkKKykgeworICBmb3JlYWNoIChUOyBXcmFwcGVkVHJhbnNwb3J0cyFDKSB7CisgICAgZG9Sd1Rlc3QhVCgKKyAgICAgIHRvdGFsU2l6ZSwKKyAgICAgIGdldEdlbmVyYXRvcih3U2l6ZSksCisgICAgICBnZXRHZW5lcmF0b3IoclNpemUpLAorICAgICAgZ2V0R2VuZXJhdG9yKHdDaHVua1NpemUpLAorICAgICAgZ2V0R2VuZXJhdG9yKHJDaHVua1NpemUpLAorICAgICAgbWF4T3V0c3RhbmRpbmcKKyAgICApOworICB9Cit9CisKK3ZvaWQgdGVzdEJsb2NraW5nKEMpKCkgaWYgKGlzQ291cGxlZFRyYW5zcG9ydHMhQykgeworICBmb3JlYWNoIChUOyBXcmFwcGVkVHJhbnNwb3J0cyFDKSB7CisgICAgZG9CbG9ja2luZ1Rlc3QhVCgpOworICB9Cit9CisKKy8vIEEgcXVpY2sgaGFjaywgZm9yIHRoZSBzYWtlIG9mIGJyZXZpdHnigKYKK2Zsb2F0IGdfc2l6ZU11bHRpcGxpZXIgPSAxOworCit2ZXJzaW9uIChQb3NpeCkgeworICBpbW11dGFibGUgZGVmYXVsdFRlbXBEaXIgPSAiL3RtcCI7Cit9IGVsc2UgdmVyc2lvbiAoV2luZG93cykgeworICBpbXBvcnQgY29yZS5zeXMud2luZG93cy53aW5kb3dzOworICBleHRlcm4oV2luZG93cykgRFdPUkQgR2V0VGVtcFBhdGhBKERXT1JEIG5CdWZmZXJMZW5ndGgsIExQVFNUUiBscEJ1ZmZlcik7CisKKyAgc3RyaW5nIGRlZmF1bHRUZW1wRGlyKCkgQHByb3BlcnR5IHsKKyAgICBjaGFyW01BWF9QQVRIICsgMV0gZGlyOworICAgIGVuZm9yY2UoR2V0VGVtcFBhdGhBKGRpci5sZW5ndGgsIGRpci5wdHIpKTsKKyAgICByZXR1cm4gdG8hc3RyaW5nKGRpci5wdHIpWzAgLi4gJCAtIDFdOworICB9Cit9IGVsc2Ugc3RhdGljIGFzc2VydChmYWxzZSk7CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIGludCBzZWVkID0gdW5wcmVkaWN0YWJsZVNlZWQoKTsKKyAgc3RyaW5nIHRtcERpciA9IGRlZmF1bHRUZW1wRGlyOworCisgIGdldG9wdChhcmdzLCAic2VlZCIsICZzZWVkLCAic2l6ZS1tdWx0aXBsaWVyIiwgJmdfc2l6ZU11bHRpcGxpZXIsCisgICAgInRtcC1kaXIiLCAmdG1wRGlyKTsKKyAgZW5mb3JjZShnX3NpemVNdWx0aXBsaWVyID49IDAsICJTaXplIG11bHRpcGxpZXIgbXVzdCBub3QgYmUgbmVnYXRpdmUuIik7CisKKyAgd3JpdGVmbG4oIlVzaW5nIHNlZWQ6ICVzIiwgc2VlZCk7CisgIHJuZEdlbigpLnNlZWQoc2VlZCk7CisgIENvdXBsZWRGaWxlVHJhbnNwb3J0cy50bXBEaXIgPSB0bXBEaXI7CisKKyAgYXV0byByYW5kNGsgPSBuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcigxLCA0MDk2KTsKKworICAvKgorICAgKiBXZSBkbyB0aGUgYmFzaWNhbGx5IHRoZSBzYW1lIHNldCBvZiB0ZXN0cyBmb3IgZWFjaCB0cmFuc3BvcnQgdHlwZSwKKyAgICogYWx0aG91Z2ggd2UgdHdlYWsgdGhlIHBhcmFtZXRlcnMgaW4gc29tZSBwbGFjZXMuCisgICAqLworCisgIC8vIFRNZW1vcnlCdWZmZXIgdGVzdHMKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAyNTYsIDE2NywgMTYzKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAxNiwgMSwgMSk7CisKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgdGVzdEJsb2NraW5nIUNvdXBsZWRNZW1vcnlCdWZmZXJzKCk7CisKKyAgLy8gVFNvY2tldCB0ZXN0cworICBlbnVtIHNvY2tldE1heE91dHN0YW5kaW5nID0gNDA5NjsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAxMDI0LCAwLCAwLAorICAgICAgICAgIDAsIDAsIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLAorICAgICAgICAgIDAsIDAsIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDE2NywgMTYzLAorICAgICAgICAgIDAsIDAsIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgLy8gRG9oLiAgQXBwYXJlbnRseSB3cml0aW5nIHRvIGEgc29ja2V0IGhhcyBzb21lIGFkZGl0aW9uYWwgb3ZlcmhlYWQgZm9yCisgIC8vIGVhY2ggc2VuZCgpIGNhbGwuICBJZiB3ZSBoYXZlIG1vcmUgdGhhbiB+NDAwIG91dHN0YW5kaW5nIDEtYnl0ZSB3cml0ZQorICAvLyByZXF1ZXN0cywgYWRkaXRpb25hbCBzZW5kKCkgY2FsbHMgc3RhcnQgYmxvY2tpbmcuCisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMTYsIDEsIDEsCisgICAgICAgICAgMCwgMCwgMjUwKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDAsIDAsCisgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLAorICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCAxNjcsIDE2MywKKyAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDE2LCAxLCAxLAorICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCAyNTApOworCisgIHRlc3RCbG9ja2luZyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygpOworCisgIC8vIEZpbGUgdHJhbnNwb3J0IHRlc3RzLgorCisgIC8vIENhbm5vdCB3cml0ZSBtb3JlIHRoYW4gdGhlIGZyYW1lIHNpemUgYXQgb25jZS4KKyAgZW51bSBtYXhXcml0ZUF0T25jZSA9IDEwMjQgKiAxMDI0ICogMTYgLSA0OworCisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDEwMjQsIG1heFdyaXRlQXRPbmNlLCAwKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSk7CisKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgIHRlc3RCbG9ja2luZyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoKTsKK30KKworCisvKgorICogVGltZXIgaGFuZGxpbmcgY29kZSBmb3IgdXNlIGluIHRlc3RzIHRoYXQgY2hlY2sgdGhlIHRyYW5zcG9ydCBibG9ja2luZworICogc2VtYW50aWNzLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBoYWNrZWQgdG9nZXRoZXIgaW4gYSBodXJyeSBhbmQgd2FzdGVzIGEgbG90IG9mCisgKiB0aHJlYWRzLCBidXQgc3BlZWQgc2hvdWxkIG5vdCBiZSB0aGUgY29uY2VybiBoZXJlLgorICovCisKK3N0cnVjdCBUcmlnZ2VyIHsKKyAgdGhpcyhEdXJhdGlvbiB0aW1lb3V0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IHdyaXRlTGVuZ3RoKSB7CisgICAgbXV0ZXhfID0gbmV3IE11dGV4OworICAgIGNhbmNlbENvbmRpdGlvbl8gPSBuZXcgQ29uZGl0aW9uKG11dGV4Xyk7CisgICAgaW5mb18gPSBuZXcgSW5mbyh0aW1lb3V0LCB0cmFuc3BvcnQsIHdyaXRlTGVuZ3RoKTsKKyAgICBzdGFydFRocmVhZCgpOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIGluZm9fID0gbnVsbDsKKyAgICAgIGNhbmNlbENvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgfQorICAgIGlmICh0aHJlYWRfKSB0aHJlYWRfLmpvaW4oKTsKKyAgfQorCisgIEBkaXNhYmxlIHRoaXModGhpcykgeyBhc3NlcnQoMCk7IH0KKworICB2b2lkIGFkZChEdXJhdGlvbiB0aW1lb3V0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IHdyaXRlTGVuZ3RoKSB7CisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIGF1dG8gaW5mbyA9IG5ldyBJbmZvKHRpbWVvdXQsIHRyYW5zcG9ydCwgd3JpdGVMZW5ndGgpOworICAgICAgaWYgKGluZm9fKSB7CisgICAgICAgIGF1dG8gcHJldiA9IGluZm9fOworICAgICAgICB3aGlsZSAocHJldi5uZXh0KSBwcmV2ID0gcHJldi5uZXh0OworICAgICAgICBwcmV2Lm5leHQgPSBpbmZvOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mb18gPSBpbmZvOworICAgICAgICBzdGFydFRocmVhZCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBwcm9wZXJ0eSBzaG9ydCBmaXJlZCgpIHsKKyAgICByZXR1cm4gYXRvbWljTG9hZChmaXJlZF8pOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgdGltZXJUaHJlYWQoKSB7CisgICAgLy8gS0xVREdFOiBNYWtlIHN1cmUgdGhlIHN0ZC5jb25jdXJyZW5jeSBtYm94IGlzIGluaXRpYWxpemVkIG9uIHRoZSB0aW1lcgorICAgIC8vIHRocmVhZCB0byBiZSBhYmxlIHRvIHVuYmxvY2sgdGhlIGZpbGUgdHJhbnNwb3J0LgorICAgIGltcG9ydCBzdGQuY29uY3VycmVuY3k7CisgICAgdGhpc1RpZDsKKworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICB3aGlsZSAoaW5mb18pIHsKKyAgICAgICAgYXV0byBjYW5jZWxsZWQgPSBjYW5jZWxDb25kaXRpb25fLndhaXQoaW5mb18udGltZW91dCk7CisgICAgICAgIGlmIChjYW5jZWxsZWQpIHsKKyAgICAgICAgICBpbmZvXyA9IG51bGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhdG9taWNPcCEiKz0iKGZpcmVkXywgMSk7CisKKyAgICAgICAgLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSB0cmFuc3BvcnQgdG8gdW5ibG9jayBpdC4KKyAgICAgICAgYXV0byBidWYgPSBuZXcgdWJ5dGVbaW5mb18ud3JpdGVMZW5ndGhdOworICAgICAgICBidWZbXSA9ICdiJzsKKyAgICAgICAgaW5mb18udHJhbnNwb3J0LndyaXRlKGJ1Zik7CisgICAgICAgIGluZm9fLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICAgIGluZm9fID0gaW5mb18ubmV4dDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aHJlYWRfID0gbnVsbDsKKyAgfQorCisgIHZvaWQgc3RhcnRUaHJlYWQoKSB7CisgICAgdGhyZWFkXyA9IG5ldyBUaHJlYWQoJnRpbWVyVGhyZWFkKTsKKyAgICB0aHJlYWRfLnN0YXJ0KCk7CisgIH0KKworICBzdHJ1Y3QgSW5mbyB7CisgICAgdGhpcyhEdXJhdGlvbiB0aW1lb3V0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IHdyaXRlTGVuZ3RoKSB7CisgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgICB0aGlzLndyaXRlTGVuZ3RoID0gd3JpdGVMZW5ndGg7CisgICAgfQorCisgICAgRHVyYXRpb24gdGltZW91dDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICBzaXplX3Qgd3JpdGVMZW5ndGg7CisgICAgSW5mbyogbmV4dDsKKyAgfQorCisgIEluZm8qIGluZm9fOworICBUaHJlYWQgdGhyZWFkXzsKKyAgc2hhcmVkIHNob3J0IGZpcmVkXzsKKworICBpbXBvcnQgY29yZS5zeW5jLm11dGV4OworICBNdXRleCBtdXRleF87CisgIGltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworICBDb25kaXRpb24gY2FuY2VsQ29uZGl0aW9uXzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0Ly5hbmFseXNpc19vcHRpb25zIGIvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS9saWIvZGFydC9MSUNFTlNFIGIvbGliL2RhcnQvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFjYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvTElDRU5TRQpAQCAtMCwwICsxLDE2IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWIvZGFydC9NYWtlZmlsZS5hbSBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmRkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworYWxsLWxvY2FsOgorCSQoREFSVFBVQikgZ2V0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIC5wdWIKKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAicGFja2FnZXMiIHwgeGFyZ3MgJChSTSkgLXIKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGYgLW5hbWUgInB1YnNwZWMubG9jayIgfCB4YXJncyAkKFJNKQorCitjaGVjay1sb2NhbDogYWxsCisKK0VYVFJBX0RJU1QgPSBcCisJLmFuYWx5c2lzX29wdGlvbnMKKwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvUkVBRE1FLm1kIGIvbGliL2RhcnQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTE2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9SRUFETUUubWQKQEAgLTAsMCArMSwyNiBAQAorVGhyaWZ0IERhcnQgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBEYXJ0Cis9PT09PT09PT09PT09PT09PT09PQorCitEYXJ0IDEuMTIuMCBvciBuZXdlciBpcyByZXF1aXJlZApkaWZmIC0tZ2l0IGEvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9kYXJ0L2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmNjAwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw2IEBACisjIERhcnQgQ29kaW5nIFN0YW5kYXJkcworCisjIyMgUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbVXNlIGRhcnRmbXRdKGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy90b29scy9kYXJ0Zm10LykgYW5kIGZvbGxvdyB0aGUgCisgICBbRGFydCBTdHlsZSBHdWlkZV0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2FydGljbGVzL3N0eWxlLWd1aWRlLykKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY5M2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsMTMwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmJyb3dzZXI7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBDbG9zZUV2ZW50OworaW1wb3J0ICdkYXJ0Omh0bWwnIHNob3cgRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBNZXNzYWdlRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBXZWJTb2NrZXQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQSBbVFNvY2tldF0gYmFja2VkIGJ5IGEgW1dlYlNvY2tldF0gZnJvbSBkYXJ0Omh0bWwKK2NsYXNzIFRXZWJTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgVXJpIHVybDsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gX29uU3RhdGVDb250cm9sbGVyOworICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBfb25TdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBfb25FcnJvckNvbnRyb2xsZXI7CisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IF9vbkVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IF9vbk1lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IF9vbk1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBMaXN0PFVpbnQ4TGlzdD4gX3JlcXVlc3RzID0gW107CisKKyAgVFdlYlNvY2tldCh0aGlzLnVybCkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpIHsKKyAgICBpZiAodXJsID09IG51bGwgfHwgIXVybC5oYXNBdXRob3JpdHkgfHwgIXVybC5oYXNQb3J0KSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCB1cmwnKTsKKyAgICB9CisgIH0KKworICBXZWJTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsICYmIF9zb2NrZXQucmVhZHlTdGF0ZSA9PSBXZWJTb2NrZXQuT1BFTjsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PgorICAgICAgX3NvY2tldCA9PSBudWxsIHx8IF9zb2NrZXQucmVhZHlTdGF0ZSA9PSBXZWJTb2NrZXQuQ0xPU0VEOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIGlmICghaXNDbG9zZWQpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5BTFJFQURZX09QRU4sICdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnKTsKKyAgICB9CisKKyAgICBfc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwudG9TdHJpbmcoKSk7CisgICAgX3NvY2tldC5vbkVycm9yLmxpc3Rlbihfb25FcnJvcik7CisgICAgX3NvY2tldC5vbk9wZW4ubGlzdGVuKF9vbk9wZW4pOworICAgIF9zb2NrZXQub25DbG9zZS5saXN0ZW4oX29uQ2xvc2UpOworICAgIF9zb2NrZXQub25NZXNzYWdlLmxpc3Rlbihfb25NZXNzYWdlKTsKKworICAgIHJldHVybiBfc29ja2V0Lm9uT3Blbi5maXJzdDsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBfc29ja2V0LmNsb3NlKCk7CisgICAgICByZXR1cm4gX3NvY2tldC5vbkNsb3NlLmZpcnN0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIF9yZXF1ZXN0cy5hZGQoZGF0YSk7CisgICAgX3NlbmRSZXF1ZXN0cygpOworICB9CisKKyAgdm9pZCBfc2VuZFJlcXVlc3RzKCkgeworICAgIHdoaWxlIChpc09wZW4gJiYgX3JlcXVlc3RzLmlzTm90RW1wdHkpIHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0gX3JlcXVlc3RzLnJlbW92ZUF0KDApOworICAgICAgX3NvY2tldC5zZW5kU3RyaW5nKEJBU0U2NC5lbmNvZGUoZGF0YSkpOworICAgIH0KKyAgfQorCisgIHZvaWQgX29uT3BlbihFdmVudCBldmVudCkgeworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLk9QRU4pOworICAgIF9zZW5kUmVxdWVzdHMoKTsKKyAgfQorCisgIHZvaWQgX29uQ2xvc2UoQ2xvc2VFdmVudCBldmVudCkgeworICAgIF9zb2NrZXQgPSBudWxsOworCisgICAgaWYgKF9yZXF1ZXN0cy5pc05vdEVtcHR5KSB7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIKKyAgICAgICAgICAuYWRkKG5ldyBTdGF0ZUVycm9yKCdTb2NrZXQgd2FzIGNsb3NlZCB3aXRoIHBlbmRpbmcgcmVxdWVzdHMnKSk7CisgICAgfQorICAgIF9yZXF1ZXN0cy5jbGVhcigpOworCisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIHZvaWQgX29uTWVzc2FnZShNZXNzYWdlRXZlbnQgbWVzc2FnZSkgeworICAgIHRyeSB7CisgICAgICBVaW50OExpc3QgZGF0YSA9CisgICAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKG1lc3NhZ2UuZGF0YSkpOworICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKGRhdGEpOworICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICB2YXIgZXJyb3IgPSBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nLiIpOworICAgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZChlcnJvcik7CisgICAgfQorICB9CisKKyAgdm9pZCBfb25FcnJvcihFdmVudCBldmVudCkgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZChldmVudC50b1N0cmluZygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3RfdGNwX3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTQ4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQKQEAgLTAsMCArMSw4MSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnNyYy5jb25zb2xlLnRfdGNwX3NvY2tldDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQSBbVFNvY2tldF0gYmFja2VkIGJ5IGEgW1NvY2tldF0gZnJvbSBkYXJ0OmlvCitjbGFzcyBUVGNwU29ja2V0IGltcGxlbWVudHMgVFNvY2tldCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIFRUY3BTb2NrZXQoU29ja2V0IHNvY2tldCkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpIHsKKyAgICBpZiAoc29ja2V0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoJ3NvY2tldCcpOworICAgIH0KKworICAgIF9zb2NrZXQgPSBzb2NrZXQ7CisgICAgX3NvY2tldC5saXN0ZW4oX29uTWVzc2FnZSwgb25FcnJvcjogX29uRXJyb3IsIG9uRG9uZTogY2xvc2UpOworICB9CisKKyAgU29ja2V0IF9zb2NrZXQ7CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9zb2NrZXQgIT0gbnVsbDsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PiBfc29ja2V0ID09IG51bGw7CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgeworICAgICAgYXdhaXQgX3NvY2tldC5jbG9zZSgpOworICAgICAgX3NvY2tldCA9IG51bGw7CisgICAgfQorCisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIF9zb2NrZXQuYWRkKGRhdGEpOworICB9CisKKyAgdm9pZCBfb25NZXNzYWdlKExpc3Q8aW50PiBtZXNzYWdlKSB7CisgICAgVWludDhMaXN0IGRhdGEgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KG1lc3NhZ2UpOworICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChkYXRhKTsKKyAgfQorCisgIHZvaWQgX29uRXJyb3IoT2JqZWN0IGVycm9yKSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKCckZXJyb3InKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9jb25zb2xlL3Rfd2ViX3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDcyODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQKQEAgLTAsMCArMSw4OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnNyYy5jb25zb2xlLnRfd2ViX3NvY2tldDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEJBU0U2NDsKK2ltcG9ydCAnZGFydDppbyc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQSBbVFNvY2tldF0gYmFja2VkIGJ5IGEgW1dlYlNvY2tldF0gZnJvbSBkYXJ0OmlvCitjbGFzcyBUV2ViU29ja2V0IGltcGxlbWVudHMgVFNvY2tldCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIFRXZWJTb2NrZXQoV2ViU29ja2V0IHNvY2tldCkKKyAgICAgIDogX29uU3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdCgpIHsKKyAgICBpZiAoc29ja2V0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoJ3NvY2tldCcpOworICAgIH0KKworICAgIF9zb2NrZXQgPSBzb2NrZXQ7CisgICAgX3NvY2tldC5saXN0ZW4oX29uTWVzc2FnZSwgb25FcnJvcjogX29uRXJyb3IsIG9uRG9uZTogY2xvc2UpOworICB9CisKKyAgV2ViU29ja2V0IF9zb2NrZXQ7CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9zb2NrZXQgIT0gbnVsbDsKKworICBib29sIGdldCBpc0Nsb3NlZCA9PiBfc29ja2V0ID09IG51bGw7CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkgeworICAgICAgYXdhaXQgX3NvY2tldC5jbG9zZSgpOworICAgICAgX3NvY2tldCA9IG51bGw7CisgICAgfQorCisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIF9zb2NrZXQuYWRkKEJBU0U2NC5lbmNvZGUoZGF0YSkpOworICB9CisKKyAgdm9pZCBfb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0KKyAgICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUobWVzc2FnZSkpOworICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKGRhdGEpOworICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICB2YXIgZXJyb3IgPSBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nLiIpOworICAgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZChlcnJvcik7CisgICAgfQorICB9CisKKyAgdm9pZCBfb25FcnJvcihPYmplY3QgZXJyb3IpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoJyRlcnJvcicpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfYmluYXJ5X3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4NWQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDI4MSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeTxUQmluYXJ5UHJvdG9jb2w+IHsKKyAgVEJpbmFyeVByb3RvY29sRmFjdG9yeSh7dGhpcy5zdHJpY3RSZWFkOiBmYWxzZSwgdGhpcy5zdHJpY3RXcml0ZTogdHJ1ZX0pOworCisgIGZpbmFsIGJvb2wgc3RyaWN0UmVhZDsKKyAgZmluYWwgYm9vbCBzdHJpY3RXcml0ZTsKKworICBUQmluYXJ5UHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQsCisgICAgICAgIHN0cmljdFJlYWQ6IHN0cmljdFJlYWQsIHN0cmljdFdyaXRlOiBzdHJpY3RXcml0ZSk7CisgIH0KK30KKworLy8vIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgc3RhdGljIGNvbnN0IFV0ZjhDb2RlYyBfdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgZmluYWwgYm9vbCBzdHJpY3RSZWFkOworICBmaW5hbCBib29sIHN0cmljdFdyaXRlOworCisgIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwKKyAgICAgIHt0aGlzLnN0cmljdFJlYWQ6IGZhbHNlLCB0aGlzLnN0cmljdFdyaXRlOiB0cnVlfSkKKyAgICAgIDogc3VwZXIodHJhbnNwb3J0KTsKKworICAvLy8gd3JpdGUKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgaWYgKHN0cmljdFdyaXRlKSB7CisgICAgICBpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKKyAgICAgIHdyaXRlSTMyKHZlcnNpb24pOworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVCeXRlKG1lc3NhZ2UudHlwZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIHdyaXRlQnl0ZShmaWVsZC50eXBlKTsKKyAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CisgICAgd3JpdGVJMzIobWFwLmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICB3cml0ZUJ5dGUobGlzdC5lbGVtZW50VHlwZSk7CisgICAgd3JpdGVJMzIobGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIHdyaXRlQnl0ZShzZXQuZWxlbWVudFR5cGUpOworICAgIHdyaXRlSTMyKHNldC5sZW5ndGgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgYiA9IGZhbHNlOworICAgIHdyaXRlQnl0ZShiID8gMSA6IDApOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2J5dGVPdXQgPSBuZXcgQnl0ZURhdGEoMSk7CisgIHZvaWQgd3JpdGVCeXRlKGludCBieXRlKSB7CisgICAgaWYgKGJ5dGUgPT0gbnVsbCkgYnl0ZSA9IDA7CisgICAgX2J5dGVPdXQuc2V0VWludDgoMCwgYnl0ZSk7CisgICAgdHJhbnNwb3J0LndyaXRlKF9ieXRlT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCAxKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9pMTZPdXQgPSBuZXcgQnl0ZURhdGEoMik7CisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIGlmIChpMTYgPT0gbnVsbCkgaTE2ID0gMDsKKyAgICBfaTE2T3V0LnNldEludDE2KDAsIGkxNik7CisgICAgdHJhbnNwb3J0LndyaXRlKF9pMTZPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDIpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2kzMk91dCA9IG5ldyBCeXRlRGF0YSg0KTsKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgaWYgKGkzMiA9PSBudWxsKSBpMzIgPSAwOworICAgIF9pMzJPdXQuc2V0SW50MzIoMCwgaTMyKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2kzMk91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgNCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2k2NE91dCA9IG5ldyBVaW50OExpc3QoOCk7CisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIGlmIChpNjQgPT0gbnVsbCkgaTY0ID0gMDsKKyAgICB2YXIgaSA9IG5ldyBJbnQ2NChpNjQpOworICAgIHZhciBidHMgPSBpLnRvQnl0ZXMoKTsKKyAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgX2k2NE91dFtqXSA9IGJ0c1s4IC0gaiAtIDFdOworICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUoX2k2NE91dCwgMCwgOCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzKSB7CisgICAgdmFyIGJ5dGVzID0gcyAhPSBudWxsID8gX3V0ZjhDb2RlYy5lbmNvZGUocykgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICB3cml0ZUkzMihieXRlcy5sZW5ndGgpOworICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIGZpbmFsIEJ5dGVEYXRhIF9kb3VibGVPdXQgPSBuZXcgQnl0ZURhdGEoOCk7CisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBpZiAoZCA9PSBudWxsKSBkID0gMC4wOworICAgIF9kb3VibGVPdXQuc2V0RmxvYXQ2NCgwLCBkKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2RvdWJsZU91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgOCk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIHZhciBsZW5ndGggPSBieXRlcy5sZW5ndGg7CisgICAgd3JpdGVJMzIobGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGxlbmd0aCk7CisgIH0KKworICAvLy8gcmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIFN0cmluZyBuYW1lOworICAgIGludCB0eXBlOworICAgIGludCBzZXFpZDsKKworICAgIGludCBzaXplID0gcmVhZEkzMigpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgaW50IHZlcnNpb24gPSBzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJHZlcnNpb24iKTsKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBzaXplICYgMHgwMDAwMDBmZjsKKyAgICAgIG5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgICBzZXFpZCA9IHJlYWRJMzIoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0cmljdFJlYWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiIpOworICAgICAgfQorICAgICAgbmFtZSA9IF9yZWFkU3RyaW5nKHNpemUpOworICAgICAgdHlwZSA9IHJlYWRCeXRlKCk7CisgICAgICBzZXFpZCA9IHJlYWRJMzIoKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CisgIH0KKworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHt9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFN0cmluZyBuYW1lID0gIiI7CisgICAgaW50IHR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBpZCA9IHR5cGUgIT0gVFR5cGUuU1RPUCA/IHJlYWRJMTYoKSA6IDA7CisKKyAgICByZXR1cm4gbmV3IFRGaWVsZChuYW1lLCB0eXBlLCBpZCk7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgaW50IGtleVR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCB2YWx1ZVR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisKKyAgICByZXR1cm4gbmV3IFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTWFwRW5kKCkge30KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIGludCBlbGVtZW50VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVExpc3QoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBpbnQgZWxlbWVudFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisKKyAgICByZXR1cm4gbmV3IFRTZXQoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCisgIGJvb2wgcmVhZEJvb2woKSA9PiByZWFkQnl0ZSgpID09IDE7CisKKyAgZmluYWwgVWludDhMaXN0IF9ieXRlSW4gPSBuZXcgVWludDhMaXN0KDEpOworICBpbnQgcmVhZEJ5dGUoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2J5dGVJbiwgMCwgMSk7CisgICAgcmV0dXJuIF9ieXRlSW4uYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRVaW50OCgwKTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfaTE2SW4gPSBuZXcgVWludDhMaXN0KDIpOworICBpbnQgcmVhZEkxNigpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfaTE2SW4sIDAsIDIpOworICAgIHJldHVybiBfaTE2SW4uYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRJbnQxNigwKTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfaTMySW4gPSBuZXcgVWludDhMaXN0KDQpOworICBpbnQgcmVhZEkzMigpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfaTMySW4sIDAsIDQpOworICAgIHJldHVybiBfaTMySW4uYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRJbnQzMigwKTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfaTY0SW4gPSBuZXcgVWludDhMaXN0KDgpOworICBpbnQgcmVhZEk2NCgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfaTY0SW4sIDAsIDgpOworICAgIHZhciBpID0gbmV3IEludDY0LmZyb21CeXRlc0JpZ0VuZGlhbihfaTY0SW4pOworICAgIHJldHVybiBpLnRvSW50KCk7CisgIH0KKworICBmaW5hbCBVaW50OExpc3QgX2RvdWJsZUluID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoX2RvdWJsZUluLCAwLCA4KTsKKyAgICByZXR1cm4gX2RvdWJsZUluLmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0RmxvYXQ2NCgwKTsKKyAgfQorCisgIFN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIGludCBzaXplID0gcmVhZEkzMigpOworICAgIHJldHVybiBfcmVhZFN0cmluZyhzaXplKTsKKyAgfQorCisgIFN0cmluZyBfcmVhZFN0cmluZyhpbnQgc2l6ZSkgeworICAgIFVpbnQ4TGlzdCBzdHJpbmdJbiA9IG5ldyBVaW50OExpc3Qoc2l6ZSk7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwoc3RyaW5nSW4sIDAsIHNpemUpOworICAgIHJldHVybiBfdXRmOENvZGVjLmRlY29kZShzdHJpbmdJbik7CisgIH0KKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpIHsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworICAgIFVpbnQ4TGlzdCBiaW5hcnlJbiA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChiaW5hcnlJbiwgMCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gYmluYXJ5SW47CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDc2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfY29tcGFjdF9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNDcwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeTxUQ29tcGFjdFByb3RvY29sPiB7CisgIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCk7CisKKyAgVENvbXBhY3RQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICB9Cit9CisKKy8vLyBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBUaHJpZnQuCisvLy8KKy8vLyBVc2Ugb2YgZml4bnVtIGxpYnJhcnkgaXMgcmVxdWlyZWQgZHVlIHRvIGJ1Z3MgbGlrZQorLy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvc2RrL2lzc3Vlcy8xNTM2MQorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgc3RhdGljIGNvbnN0IGludCBQUk9UT0NPTF9JRCA9IDB4ODI7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTiA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl9NQVNLID0gMHgxZjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX01BU0sgPSAweEUwOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQklUUyA9IDB4MDc7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworICBzdGF0aWMgZmluYWwgVEZpZWxkIFRTVE9QID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU1RPUCwgMCk7CisKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JPT0xFQU5fVFJVRSA9IDB4MDE7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CT09MRUFOX0ZBTFNFID0gMHgwMjsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JZVEUgPSAweDAzOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTE2ID0gMHgwNDsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0kzMiA9IDB4MDU7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JNjQgPSAweDA2OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfRE9VQkxFID0gMHgwNzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JJTkFSWSA9IDB4MDg7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9MSVNUID0gMHgwOTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NFVCA9IDB4MEE7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9NQVAgPSAweDBCOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU1RSVUNUID0gMHgwQzsKKworICBzdGF0aWMgZmluYWwgTGlzdDxpbnQ+IF90eXBlTWFwID0gbmV3IExpc3QudW5tb2RpZmlhYmxlKG5ldyBMaXN0KDE2KQorICAgIC4uW1RUeXBlLlNUT1BdID0gVFR5cGUuU1RPUAorICAgIC4uW1RUeXBlLkJPT0xdID0gVFlQRV9CT09MRUFOX1RSVUUKKyAgICAuLltUVHlwZS5CWVRFXSA9IFRZUEVfQllURQorICAgIC4uW1RUeXBlLkkxNl0gPSBUWVBFX0kxNgorICAgIC4uW1RUeXBlLkkzMl0gPSBUWVBFX0kzMgorICAgIC4uW1RUeXBlLkk2NF0gPSBUWVBFX0k2NAorICAgIC4uW1RUeXBlLkRPVUJMRV0gPSBUWVBFX0RPVUJMRQorICAgIC4uW1RUeXBlLlNUUklOR10gPSBUWVBFX0JJTkFSWQorICAgIC4uW1RUeXBlLkxJU1RdID0gVFlQRV9MSVNUCisgICAgLi5bVFR5cGUuU0VUXSA9IFRZUEVfU0VUCisgICAgLi5bVFR5cGUuTUFQXSA9IFRZUEVfTUFQCisgICAgLi5bVFR5cGUuU1RSVUNUXSA9IFRZUEVfU1RSVUNUKTsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIF91dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICAvLyBQcmV0ZW5kIHRoaXMgaXMgYSBzdGFjaworICBEb3VibGVMaW5rZWRRdWV1ZTxpbnQ+IF9sYXN0RmllbGQgPSBuZXcgRG91YmxlTGlua2VkUXVldWU8aW50PigpOworICBpbnQgX2xhc3RGaWVsZElkID0gMDsKKworICBURmllbGQgX2Jvb2xlYW5GaWVsZCA9IG51bGw7CisgIGJvb2wgX2Jvb2xWYWx1ZSA9IG51bGw7CisKKyAgZmluYWwgVWludDhMaXN0IHRlbXBMaXN0ID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisgIGZpbmFsIEJ5dGVEYXRhIHRlbXBCRCA9IG5ldyBCeXRlRGF0YSgxMCk7CisKKyAgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBzdXBlcih0cmFuc3BvcnQpOworCisgIC8vLyBXcml0ZQorICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICB3cml0ZUJ5dGUoUFJPVE9DT0xfSUQpOworICAgIHdyaXRlQnl0ZSgoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfAorICAgICAgICAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKKyAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIobWVzc2FnZS5zZXFpZCkpOworICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7CisgICAgX2xhc3RGaWVsZC5hZGRMYXN0KF9sYXN0RmllbGRJZCk7CisgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5yZW1vdmVMYXN0KCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CisgICAgICBfYm9vbGVhbkZpZWxkID0gZmllbGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIF93cml0ZUZpZWxkQmVnaW4oZmllbGQsIC0xKTsKKyAgICB9CisgIH0KKworICB2b2lkIF93cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkLCBpbnQgdHlwZU92ZXJyaWRlKSB7CisgICAgaW50IHR5cGVUb1dyaXRlID0KKyAgICAgICAgdHlwZU92ZXJyaWRlID09IC0xID8gX2dldENvbXBhY3RUeXBlKGZpZWxkLnR5cGUpIDogdHlwZU92ZXJyaWRlOworCisgICAgaWYgKGZpZWxkLmlkID4gX2xhc3RGaWVsZElkICYmIGZpZWxkLmlkIC0gX2xhc3RGaWVsZElkIDw9IDE1KSB7CisgICAgICB3cml0ZUJ5dGUoKGZpZWxkLmlkIC0gX2xhc3RGaWVsZElkKSA8PCA0IHwgdHlwZVRvV3JpdGUpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUodHlwZVRvV3JpdGUpOworICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgIH0KKworICAgIF9sYXN0RmllbGRJZCA9IGZpZWxkLmlkOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIGlmIChtYXAubGVuZ3RoID09IDApIHsKKyAgICAgIHdyaXRlQnl0ZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgX3dyaXRlVmFySW50MzIobmV3IEludDMyKG1hcC5sZW5ndGgpKTsKKyAgICAgIHdyaXRlQnl0ZSgKKyAgICAgICAgICBfZ2V0Q29tcGFjdFR5cGUobWFwLmtleVR5cGUpIDw8IDQgfCBfZ2V0Q29tcGFjdFR5cGUobWFwLnZhbHVlVHlwZSkpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF93cml0ZUNvbGxlY3Rpb25CZWdpbihsaXN0LmVsZW1lbnRUeXBlLCBsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKHNldC5lbGVtZW50VHlwZSwgc2V0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgaWYgKF9ib29sZWFuRmllbGQgIT0gbnVsbCkgeworICAgICAgX3dyaXRlRmllbGRCZWdpbigKKyAgICAgICAgICBfYm9vbGVhbkZpZWxkLCBiID8gVFlQRV9CT09MRUFOX1RSVUUgOiBUWVBFX0JPT0xFQU5fRkFMU0UpOworICAgICAgX2Jvb2xlYW5GaWVsZCA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZShiID8gVFlQRV9CT09MRUFOX1RSVUUgOiBUWVBFX0JPT0xFQU5fRkFMU0UpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgYiA9IDA7CisgICAgdGVtcExpc3RbMF0gPSBiOworICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wTGlzdCwgMCwgMSk7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBpZiAoaTE2ID09IG51bGwpIGkxNiA9IDA7CisgICAgX3dyaXRlVmFySW50MzIoX2ludDMyVG9aaWdaYWcobmV3IEludDMyKGkxNikpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIGlmIChpMzIgPT0gbnVsbCkgaTMyID0gMDsKKyAgICBfd3JpdGVWYXJJbnQzMihfaW50MzJUb1ppZ1phZyhuZXcgSW50MzIoaTMyKSkpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgaWYgKGk2NCA9PSBudWxsKSBpNjQgPSAwOworICAgIF93cml0ZVZhckludDY0KF9pbnQ2NFRvWmlnWmFnKG5ldyBJbnQ2NChpNjQpKSk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgaWYgKGQgPT0gbnVsbCkgZCA9IDAuMDsKKyAgICB0ZW1wQkQuc2V0RmxvYXQ2NCgwLCBkLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4pOworICAgIHRyYW5zcG9ydC53cml0ZSh0ZW1wQkQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0KKyAgICAgICAgc3RyICE9IG51bGwgPyBfdXRmOENvZGVjLmVuY29kZShzdHIpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgd3JpdGVCaW5hcnkoYnl0ZXMpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIoYnl0ZXMubGVuZ3RoKSk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgdm9pZCBfd3JpdGVWYXJJbnQzMihJbnQzMiBuKSB7CisgICAgaW50IGlkeCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9IChuICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAoKChuICYgMHg3RikgfCAweDgwKSAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIG4gPSBuLnNoaWZ0UmlnaHRVbnNpZ25lZCg3KTsKKyAgICAgIH0KKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCBpZHgpOworICB9CisKKyAgdm9pZCBfd3JpdGVWYXJJbnQ2NChJbnQ2NCBuKSB7CisgICAgaW50IGlkeCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9IChuICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZW1wTGlzdFtpZHgrK10gPSAoKChuICYgMHg3RikgfCAweDgwKSAmIDB4RkYpLnRvSW50KCk7CisgICAgICAgIG4gPSBuLnNoaWZ0UmlnaHRVbnNpZ25lZCg3KTsKKyAgICAgIH0KKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCBpZHgpOworICB9CisKKyAgdm9pZCBfd3JpdGVDb2xsZWN0aW9uQmVnaW4oaW50IGVsZW1UeXBlLCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKGxlbmd0aCA8PCA0IHwgX2dldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSgweEYwIHwgX2dldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIobGVuZ3RoKSk7CisgICAgfQorICB9CisKKyAgSW50MzIgX2ludDMyVG9aaWdaYWcoSW50MzIgbikgeworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgfQorCisgIEludDY0IF9pbnQ2NFRvWmlnWmFnKEludDY0IG4pIHsKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIH0KKworICAvLy8gUmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIGludCBwcm90b2NvbElkID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAnRXhwZWN0ZWQgcHJvdG9jb2wgaWQgJFBST1RPQ09MX0lEIGJ1dCBnb3QgJHByb3RvY29sSWQnKTsKKyAgICB9CisgICAgaW50IHZlcnNpb25BbmRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgdmVyc2lvbiA9IHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuQkFEX1ZFUlNJT04sCisgICAgICAgICAgJ0V4cGVjdGVkIHZlcnNpb24gJFZFUlNJT04gYnV0IGdvdCAkdmVyc2lvbicpOworICAgIH0KKyAgICBpbnQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFM7CisgICAgaW50IHNlcUlkID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgU3RyaW5nIG1lc3NhZ2VOYW1lID0gcmVhZFN0cmluZygpOworICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIHR5cGUsIHNlcUlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIF9sYXN0RmllbGQuYWRkTGFzdChfbGFzdEZpZWxkSWQpOworICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgLy8gVE9ETyBtYWtlIHRoaXMgYSBjb25zdGFudD8KKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLnJlbW92ZUxhc3QoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBpbnQgdHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaWYgKHR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgcmV0dXJuIFRTVE9QOworICAgIH0KKworICAgIGludCBmaWVsZElkOworICAgIGludCBtb2RpZmllciA9ICh0eXBlICYgMHhGMCkgPj4gNDsKKyAgICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgICAgZmllbGRJZCA9IHJlYWRJMTYoKTsKKyAgICB9IGVsc2UgeworICAgICAgZmllbGRJZCA9IF9sYXN0RmllbGRJZCArIG1vZGlmaWVyOworICAgIH0KKworICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoJycsIF9nZXRUVHlwZSh0eXBlICYgMHgwRiksIGZpZWxkSWQpOworICAgIGlmIChfaXNCb29sVHlwZSh0eXBlKSkgeworICAgICAgX2Jvb2xWYWx1ZSA9ICh0eXBlICYgMHgwRikgPT0gVFlQRV9CT09MRUFOX1RSVUU7CisgICAgfQorCisgICAgX2xhc3RGaWVsZElkID0gZmllbGQuaWQ7CisgICAgcmV0dXJuIGZpZWxkOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgeworICAgIGludCBsZW5ndGggPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBfY2hlY2tOZWdSZWFkTGVuZ3RoKGxlbmd0aCk7CisKKyAgICBpbnQga2V5QW5kVmFsdWVUeXBlID0gbGVuZ3RoID09IDAgPyAwIDogcmVhZEJ5dGUoKTsKKyAgICBpbnQga2V5VHlwZSA9IF9nZXRUVHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCk7CisgICAgaW50IHZhbHVlVHlwZSA9IF9nZXRUVHlwZShrZXlBbmRWYWx1ZVR5cGUgJiAweDBGKTsKKyAgICByZXR1cm4gbmV3IFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTWFwRW5kKCkge30KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIGludCBsZW5ndGhBbmRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gKGxlbmd0aEFuZFR5cGUgPj4gNCkgJiAweDBGOworICAgIGlmIChsZW5ndGggPT0gMTUpIHsKKyAgICAgIGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIH0KKyAgICBfY2hlY2tOZWdSZWFkTGVuZ3RoKGxlbmd0aCk7CisgICAgaW50IHR5cGUgPSBfZ2V0VFR5cGUobGVuZ3RoQW5kVHlwZSk7CisgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgVExpc3QgdGxpc3QgPSByZWFkTGlzdEJlZ2luKCk7CisgICAgcmV0dXJuIG5ldyBUU2V0KHRsaXN0LmVsZW1lbnRUeXBlLCB0bGlzdC5sZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworICBib29sIHJlYWRCb29sKCkgeworICAgIGlmIChfYm9vbFZhbHVlICE9IG51bGwpIHsKKyAgICAgIGJvb2wgcmVzdWx0ID0gX2Jvb2xWYWx1ZTsKKyAgICAgIF9ib29sVmFsdWUgPSBudWxsOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gVFlQRV9CT09MRUFOX1RSVUU7CisgIH0KKworICBpbnQgcmVhZEJ5dGUoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwodGVtcExpc3QsIDAsIDEpOworICAgIHJldHVybiB0ZW1wTGlzdC5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQ4KDApOworICB9CisKKyAgaW50IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDMyKF9yZWFkVmFySW50MzIoKSkudG9JbnQoKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQzMihfcmVhZFZhckludDMyKCkpLnRvSW50KCk7CisgIH0KKworICBpbnQgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50NjQoX3JlYWRWYXJJbnQ2NCgpKS50b0ludCgpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgdHJhbnNwb3J0LnJlYWRBbGwodGVtcExpc3QsIDAsIDgpOworICAgIHJldHVybiB0ZW1wTGlzdC5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEZsb2F0NjQoMCwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOKTsKKyAgfQorCisgIFN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIGludCBsZW5ndGggPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBfY2hlY2tOZWdSZWFkTGVuZ3RoKGxlbmd0aCk7CisKKyAgICAvLyBUT0RPIGxvb2sgYXQgdXNpbmcgdGVtcCBmb3Igc21hbGwgc3RyaW5ncz8KKyAgICBVaW50OExpc3QgYnVmZiA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmLCAwLCBsZW5ndGgpOworICAgIHJldHVybiBfdXRmOENvZGVjLmRlY29kZShidWZmKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIGludCBsZW5ndGggPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBfY2hlY2tOZWdSZWFkTGVuZ3RoKGxlbmd0aCk7CisKKyAgICBVaW50OExpc3QgYnVmZiA9IG5ldyBVaW50OExpc3QobGVuZ3RoKTsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmLCAwLCBsZW5ndGgpOworICAgIHJldHVybiBidWZmOworICB9CisKKyAgSW50MzIgX3JlYWRWYXJJbnQzMigpIHsKKyAgICBJbnQzMiByZXN1bHQgPSBJbnQzMi5aRVJPOworICAgIGludCBzaGlmdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIEludDMyIGIgPSBuZXcgSW50MzIocmVhZEJ5dGUoKSk7CisgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEludDY0IF9yZWFkVmFySW50NjQoKSB7CisgICAgSW50NjQgcmVzdWx0ID0gSW50NjQuWkVSTzsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBJbnQ2NCBiID0gbmV3IEludDY0KHJlYWRCeXRlKCkpOworICAgICAgcmVzdWx0IHw9IChiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSBicmVhazsKKyAgICAgIHNoaWZ0ICs9IDc7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBJbnQzMiBfemlnemFnVG9JbnQzMihJbnQzMiBuKSB7CisgICAgcmV0dXJuIChuLnNoaWZ0UmlnaHRVbnNpZ25lZCgxKSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIEludDY0IF96aWd6YWdUb0ludDY0KEludDY0IG4pIHsKKyAgICByZXR1cm4gKG4uc2hpZnRSaWdodFVuc2lnbmVkKDEpKSBeIC0obiAmIDEpOworICB9CisKKyAgdm9pZCBfY2hlY2tOZWdSZWFkTGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5ORUdBVElWRV9TSVpFLCAnTmVnYXRpdmUgbGVuZ3RoOiAkbGVuZ3RoJyk7CisgICAgfQorICB9CisKKyAgaW50IF9nZXRDb21wYWN0VHlwZShpbnQgdHR5cGUpIHsKKyAgICByZXR1cm4gX3R5cGVNYXBbdHR5cGVdOworICB9CisKKyAgaW50IF9nZXRUVHlwZShpbnQgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSAmIDB4MEYpIHsKKyAgICAgIGNhc2UgVFR5cGUuU1RPUDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUT1A7CisgICAgICBjYXNlIFRZUEVfQk9PTEVBTl9GQUxTRToKKyAgICAgIGNhc2UgVFlQRV9CT09MRUFOX1RSVUU6CisgICAgICAgIHJldHVybiBUVHlwZS5CT09MOworICAgICAgY2FzZSBUWVBFX0JZVEU6CisgICAgICAgIHJldHVybiBUVHlwZS5CWVRFOworICAgICAgY2FzZSBUWVBFX0kxNjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgIGNhc2UgVFlQRV9JMzI6CisgICAgICAgIHJldHVybiBUVHlwZS5JMzI7CisgICAgICBjYXNlIFRZUEVfSTY0OgorICAgICAgICByZXR1cm4gVFR5cGUuSTY0OworICAgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkRPVUJMRTsKKyAgICAgIGNhc2UgVFlQRV9CSU5BUlk6CisgICAgICAgIHJldHVybiBUVHlwZS5TVFJJTkc7CisgICAgICBjYXNlIFRZUEVfTElTVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkxJU1Q7CisgICAgICBjYXNlIFRZUEVfU0VUOgorICAgICAgICByZXR1cm4gVFR5cGUuU0VUOworICAgICAgY2FzZSBUWVBFX01BUDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLk1BUDsKKyAgICAgIGNhc2UgVFlQRV9TVFJVQ1Q6CisgICAgICAgIHJldHVybiBUVHlwZS5TVFJVQ1Q7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiVW5rbm93biB0eXBlOiAke3R5cGUgJiAweDBGfSIpOworICAgIH0KKyAgfQorCisgIGJvb2wgX2lzQm9vbFR5cGUoaW50IGIpIHsKKyAgICBpbnQgbG93ZXJOaWJibGUgPSBiICYgMHgwRjsKKyAgICByZXR1cm4gbG93ZXJOaWJibGUgPT0gVFlQRV9CT09MRUFOX1RSVUUgfHwKKyAgICAgICAgbG93ZXJOaWJibGUgPT0gVFlQRV9CT09MRUFOX0ZBTFNFOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfZmllbGQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGI0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfZmllbGQuZGFydApAQCAtMCwwICsxLDI2IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRGaWVsZCB7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBpbnQgdHlwZTsKKyAgZmluYWwgaW50IGlkOworCisgIFRGaWVsZCh0aGlzLm5hbWUsIHRoaXMudHlwZSwgdGhpcy5pZCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmJiN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDc4NCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUSnNvblByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3Rvcnk8VEpzb25Qcm90b2NvbD4geworICBUSnNvblByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisgIH0KK30KKworLy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRKc29uUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fMSA9IDE7CisKKyAgc3RhdGljIGNvbnN0IFV0ZjhDb2RlYyB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBfQmFzZUNvbnRleHQgX2NvbnRleHQ7CisgIF9CYXNlQ29udGV4dCBfcm9vdENvbnRleHQ7CisgIF9Mb29rYWhlYWRSZWFkZXIgX3JlYWRlcjsKKworICBmaW5hbCBMaXN0PF9CYXNlQ29udGV4dD4gX2NvbnRleHRTdGFjayA9IFtdOworICBmaW5hbCBVaW50OExpc3QgX3RlbXBCdWZmZXIgPSBuZXcgVWludDhMaXN0KDQpOworCisgIFRKc29uUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogc3VwZXIodHJhbnNwb3J0KSB7CisgICAgX3Jvb3RDb250ZXh0ID0gbmV3IF9CYXNlQ29udGV4dCh0aGlzKTsKKyAgICBfcmVhZGVyID0gbmV3IF9Mb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgX3Jlc2V0Q29udGV4dCgpOworICB9CisKKyAgdm9pZCBfcHVzaENvbnRleHQoX0Jhc2VDb250ZXh0IGMpIHsKKyAgICBfY29udGV4dFN0YWNrLmFkZChjKTsKKyAgICBfY29udGV4dCA9IGM7CisgIH0KKworICB2b2lkIF9wb3BDb250ZXh0KCkgeworICAgIF9jb250ZXh0U3RhY2sucmVtb3ZlTGFzdCgpOworICAgIF9jb250ZXh0ID0gX2NvbnRleHRTdGFjay5pc0VtcHR5ID8gX3Jvb3RDb250ZXh0IDogX2NvbnRleHRTdGFjay5sYXN0OworICB9CisKKyAgdm9pZCBfcmVzZXRDb250ZXh0KCkgeworICAgIF9jb250ZXh0U3RhY2suY2xlYXIoKTsKKyAgICBfY29udGV4dCA9IF9yb290Q29udGV4dDsKKyAgfQorCisgIC8vLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggW2NoYXJdOyBvdGhlcndpc2UgdGhyb3cgYSBbVFByb3RvY29sRXJyb3JdLgorICB2b2lkIF9yZWFkSnNvblN5bnRheENoYXIoaW50IGNoYXJCeXRlKSB7CisgICAgaW50IGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKyAgICBpZiAoYnl0ZSAhPSBjaGFyQnl0ZSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGNoYXJhY3RlciAke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJCeXRlKX0gYnV0IGZvdW5kOiAke25ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpfSIpOworICAgIH0KKyAgfQorCisgIGludCBfaGV4VmFsKGludCBieXRlKSB7CisgICAgaWYgKGJ5dGUgPj0gX0NvbnN0YW50cy5IRVhfMF9CWVRFU1swXSAmJgorICAgICAgICBieXRlIDw9IF9Db25zdGFudHMuSEVYXzlfQllURVNbMF0pIHsKKyAgICAgIHJldHVybiBieXRlIC0gX0NvbnN0YW50cy5IRVhfMF9CWVRFU1swXTsKKyAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gX0NvbnN0YW50cy5IRVhfQV9CWVRFU1swXSAmJgorICAgICAgICBieXRlIDw9IF9Db25zdGFudHMuSEVYX0ZfQllURVNbMF0pIHsKKyAgICAgIGJ5dGUgKz0gMTA7CisgICAgICByZXR1cm4gYnl0ZSAtIF9Db25zdGFudHMuSEVYX0FfQllURVNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOworICAgIH0KKyAgfQorCisgIGludCBfaGV4Q2hhcihpbnQgYnl0ZSkgPT4gYnl0ZS50b1JhZGl4U3RyaW5nKDE2KS5jb2RlVW5pdEF0KDApOworCisgIC8vLyB3cml0ZQorCisgIC8vLyBXcml0ZSB0aGUgW2J5dGVzXSBhcyBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZC4KKyAgdm9pZCBfd3JpdGVKc29uU3RyaW5nKFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworCisgICAgaW50IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBpbnQgYnl0ZSA9IGJ5dGVzW2ldOworICAgICAgaWYgKChieXRlICYgMHgwMEZGKSA+PSAweDMwKSB7CisgICAgICAgIGlmIChieXRlID09IF9Db25zdGFudHMuQkFDS1NMQVNIX0JZVEVTWzBdKSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQkFDS1NMQVNIX0JZVEVTKTsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgaSwgMSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gX0NvbnN0YW50cy5KU09OX0NIQVJfVEFCTEVbYnl0ZV07CisgICAgICAgIGlmIChfdGVtcEJ1ZmZlclswXSA9PSAxKSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCBpLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChfdGVtcEJ1ZmZlclswXSA+IDEpIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVMpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShfdGVtcEJ1ZmZlciwgMCwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuRVNDU0VRX0JZVEVTKTsKKyAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IF9oZXhDaGFyKGJ5dGUgPj4gNCk7CisgICAgICAgICAgX3RlbXBCdWZmZXJbMV0gPSBfaGV4Q2hhcihieXRlKTsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoX3RlbXBCdWZmZXIsIDAsIDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uSW50ZWdlcihpbnQgaSkgeworICAgIGlmIChpID09IG51bGwpIGkgPSAwOworCisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICBTdHJpbmcgc3RyID0gaS50b1N0cmluZygpOworCisgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgICB9CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoc3RyKSk7CisgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgICB9CisgIH0KKworICB2b2lkIF93cml0ZUpzb25Eb3VibGUoZG91YmxlIGQpIHsKKyAgICBpZiAoZCA9PSBudWxsKSBkID0gMC4wOworCisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICBTdHJpbmcgc3RyID0gZC50b1N0cmluZygpOworICAgIGJvb2wgZXNjYXBlTnVtYmVycyA9IGQuaXNOYU4gfHwgZC5pc0luZmluaXRlIHx8IF9jb250ZXh0LmVzY2FwZU51bWJlcnM7CisKKyAgICBpZiAoZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShzdHIpKTsKKyAgICBpZiAoZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkJhc2U2NChVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKworICAgIFN0cmluZyBiYXNlNjQgPSBCQVNFNjQuZW5jb2RlKGJ5dGVzKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShiYXNlNjQpKTsKKworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlFVT1RFX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCkgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuTEJSQUNFX0JZVEVTKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9QYWlyQ29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25PYmplY3RFbmQoKSB7CisgICAgX3BvcENvbnRleHQoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5SQlJBQ0VfQllURVMpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQXJyYXlTdGFydCgpIHsKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkxCUkFDS0VUX0JZVEVTKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9MaXN0Q29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25BcnJheUVuZCgpIHsKKyAgICBfcG9wQ29udGV4dCgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlJCUkFDS0VUX0JZVEVTKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIF9yZXNldENvbnRleHQoKTsKKworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvbkludGVnZXIoVkVSU0lPTl8xKTsKKworICAgIF93cml0ZUpzb25TdHJpbmcodXRmOENvZGVjLmVuY29kZShtZXNzYWdlLm5hbWUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihtZXNzYWdlLnR5cGUpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKG1lc3NhZ2Uuc2VxaWQpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHsKKyAgICBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgX3dyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoZmllbGQuaWQpOworICAgIF93cml0ZUpzb25PYmplY3RTdGFydCgpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKGZpZWxkLnR5cGUpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHsKKyAgICBfd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKG1hcC5rZXlUeXBlKSk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobWFwLnZhbHVlVHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKG1hcC5sZW5ndGgpOworICAgIF93cml0ZUpzb25PYmplY3RTdGFydCgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHsKKyAgICBfd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlTdGFydCgpOworICAgIF93cml0ZUpzb25TdHJpbmcoX0NvbnN0YW50cy5nZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKGxpc3QuZWxlbWVudFR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQoc2V0LmVsZW1lbnRUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIoc2V0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgYiA9IGZhbHNlOworICAgIF93cml0ZUpzb25JbnRlZ2VyKGIgPyAxIDogMCk7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGIpOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTE2KTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGkzMik7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpNjQpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIF93cml0ZUpzb25Eb3VibGUoZCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzKSB7CisgICAgdmFyIGJ5dGVzID0gcyAhPSBudWxsID8gdXRmOENvZGVjLmVuY29kZShzKSA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoW10pOworICAgIF93cml0ZUpzb25TdHJpbmcoYnl0ZXMpOworICB9CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfd3JpdGVKc29uQmFzZTY0KGJ5dGVzKTsKKyAgfQorCisgIGJvb2wgX2lzSGlnaFN1cnJvZ2F0ZShpbnQgYikgPT4gYiA+PSAweEQ4MDAgJiYgYiA8PSAweERCRkY7CisKKyAgYm9vbCBfaXNMb3dTdXJyb2dhdGUoaW50IGIpID0+IGIgPj0gMHhEQzAwICYmIGIgPD0gMHhERkZGOworCisgIC8vLyByZWFkCisKKyAgVWludDhMaXN0IF9yZWFkSnNvblN0cmluZyh7Ym9vbCBza2lwQ29udGV4dDogZmFsc2V9KSB7CisgICAgTGlzdDxpbnQ+IGJ5dGVzID0gW107CisgICAgTGlzdDxpbnQ+IGNvZGV1bml0cyA9IFtdOworCisgICAgaWYgKCFza2lwQ29udGV4dCkgeworICAgICAgX2NvbnRleHQucmVhZCgpOworICAgIH0KKworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCBieXRlID0gX3JlYWRlci5yZWFkKCk7CisgICAgICBpZiAoYnl0ZSA9PSBfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBlc2NhcGVkPworICAgICAgaWYgKGJ5dGUgIT0gX0NvbnN0YW50cy5FU0NTRVFfQllURVNbMF0pIHsKKyAgICAgICAgYnl0ZXMuYWRkKGJ5dGUpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworCisgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgY29udHJvbCBjaGFycyBsaWtlIFxuCisgICAgICBpZiAoYnl0ZSAhPSBfQ29uc3RhbnRzLkVTQ1NFUV9CWVRFU1sxXSkgeworICAgICAgICBTdHJpbmcgY2hhciA9IG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpOworICAgICAgICBpbnQgb2Zmc2V0ID0gX0NvbnN0YW50cy5FU0NBUEVfQ0hBUlMuaW5kZXhPZihjaGFyKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICB9CisgICAgICAgIGJ5dGUgPSBfQ29uc3RhbnRzLkVTQ0FQRV9DSEFSX1ZBTFMuY29kZVVuaXRBdChvZmZzZXQpOworICAgICAgICBieXRlcy5hZGQoYnl0ZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBpdCdzIFx1WFhYWAorICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoX3RlbXBCdWZmZXIsIDAsIDQpOworICAgICAgYnl0ZSA9IChfaGV4VmFsKF90ZW1wQnVmZmVyWzBdKSA8PCAxMikKKyAgICAgICAgKyAoX2hleFZhbChfdGVtcEJ1ZmZlclsxXSkgPDwgOCkKKyAgICAgICAgKyAoX2hleFZhbChfdGVtcEJ1ZmZlclsyXSkgPDwgNCkKKyAgICAgICAgKyBfaGV4VmFsKF90ZW1wQnVmZmVyWzNdKTsKKyAgICAgIGlmIChfaXNIaWdoU3Vycm9nYXRlKGJ5dGUpKSB7CisgICAgICAgIGlmIChjb2RldW5pdHMuaXNOb3RFbXB0eSkgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBjb2RldW5pdHMuYWRkKGJ5dGUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoX2lzTG93U3Vycm9nYXRlKGJ5dGUpKSB7CisgICAgICAgIGlmIChjb2RldW5pdHMuaXNFbXB0eSkgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgY29kZXVuaXRzLmFkZChieXRlKTsKKyAgICAgICAgYnl0ZXMuYWRkQWxsKHV0ZjhDb2RlYy5lbmNvZGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGVzKGNvZGV1bml0cykpKTsKKyAgICAgICAgY29kZXVuaXRzLmNsZWFyKCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYnl0ZXMuYWRkQWxsKHV0ZjhDb2RlYy5lbmNvZGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29kZXVuaXRzLmlzTm90RW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KGJ5dGVzKTsKKyAgfQorCisgIFN0cmluZyBfcmVhZEpzb25OdW1lcmljQ2hhcnMoKSB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKCFfQ29uc3RhbnRzLmlzSnNvbk51bWVyaWMoX3JlYWRlci5wZWVrKCkpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnVmZmVyLndyaXRlKG5ldyBTdHJpbmcuZnJvbUNoYXJDb2RlKF9yZWFkZXIucmVhZCgpKSk7CisgICAgfQorICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgfQorCisgIGludCBfcmVhZEpzb25JbnRlZ2VyKCkgeworICAgIF9jb250ZXh0LnJlYWQoKTsKKworICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgIH0KKyAgICBTdHJpbmcgc3RyID0gX3JlYWRKc29uTnVtZXJpY0NoYXJzKCk7CisgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBpbnQucGFyc2Uoc3RyKTsKKyAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICB9CisgIH0KKworICBkb3VibGUgX3JlYWRKc29uRG91YmxlKCkgeworICAgIF9jb250ZXh0LnJlYWQoKTsKKworICAgIGlmIChfcmVhZGVyLnBlZWsoKSA9PSBfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKSB7CisgICAgICBVaW50OExpc3QgYnl0ZXMgPSBfcmVhZEpzb25TdHJpbmcoc2tpcENvbnRleHQ6IHRydWUpOworICAgICAgZG91YmxlIGQgPSBkb3VibGUucGFyc2UodXRmOENvZGVjLmRlY29kZShieXRlcyksIChfKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgIH0pOworICAgICAgaWYgKCFfY29udGV4dC5lc2NhcGVOdW1iZXJzICYmICFkLmlzTmFOICYmICFkLmlzSW5maW5pdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW1iZXJzID09IHRydWUKKyAgICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkb3VibGUucGFyc2UoX3JlYWRKc29uTnVtZXJpY0NoYXJzKCksIChfKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIFVpbnQ4TGlzdCBfcmVhZEpzb25CYXNlNjQoKSB7CisgICAgLy8gY29udmVydCBVVEYtOCBieXRlcyBvZiBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcgdG8gYmluYXJ5IGJ5dGVzCisgICAgVWludDhMaXN0IGJhc2U2NEJ5dGVzID0gX3JlYWRKc29uU3RyaW5nKCk7CisgICAgU3RyaW5nIGJhc2U2NCA9IHV0ZjhDb2RlYy5kZWNvZGUoYmFzZTY0Qnl0ZXMpOworCisgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShiYXNlNjQpKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uT2JqZWN0U3RhcnQoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5MQlJBQ0VfQllURVNbMF0pOworICAgIF9wdXNoQ29udGV4dChuZXcgX1BhaXJDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uT2JqZWN0RW5kKCkgeworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5SQlJBQ0VfQllURVNbMF0pOworICAgIF9wb3BDb250ZXh0KCk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbkFycmF5U3RhcnQoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5MQlJBQ0tFVF9CWVRFU1swXSk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfTGlzdENvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25BcnJheUVuZCgpIHsKKyAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUkJSQUNLRVRfQllURVNbMF0pOworICAgIF9wb3BDb250ZXh0KCk7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIF9yZXNldENvbnRleHQoKTsKKworICAgIF9yZWFkSnNvbkFycmF5U3RhcnQoKTsKKyAgICBpZiAoX3JlYWRKc29uSW50ZWdlcigpICE9IFZFUlNJT05fMSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgIH0KKworICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBfcmVhZEpzb25TdHJpbmcoKTsKKyAgICBTdHJpbmcgbmFtZSA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICBpbnQgdHlwZSA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICBpbnQgc2VxaWQgPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICBpbnQgdHlwZSA9IFRUeXBlLlNUT1A7CisgICAgaW50IGlkID0gMDsKKworICAgIGlmIChfcmVhZGVyLnBlZWsoKSAhPSBfQ29uc3RhbnRzLlJCUkFDRV9CWVRFU1swXSkgeworICAgICAgaWQgPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisgICAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworICAgICAgdHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVEZpZWxkKG5hbWUsIHR5cGUsIGlkKTsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkgeworICAgIF9yZWFkSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGludCBrZXlUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IHZhbHVlVHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCBsZW5ndGggPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGludCBlbGVtZW50VHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCBsZW5ndGggPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1lbnRUeXBlLCBsZW5ndGgpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGludCBlbGVtZW50VHlwZSA9IF9Db25zdGFudHMuZ2V0VHlwZUlkRm9yVHlwZU5hbWUoX3JlYWRKc29uU3RyaW5nKCkpOworICAgIGludCBsZW5ndGggPSBfcmVhZEpzb25JbnRlZ2VyKCk7CisKKyAgICByZXR1cm4gbmV3IFRTZXQoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7CisgICAgX3JlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlOworICB9CisKKyAgaW50IHJlYWRCeXRlKCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTY0KCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uRG91YmxlKCk7CisgIH0KKworICBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gdXRmOENvZGVjLmRlY29kZShfcmVhZEpzb25TdHJpbmcoKSk7CisgIH0KKworICBVaW50OExpc3QgcmVhZEJpbmFyeSgpIHsKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChfcmVhZEpzb25CYXNlNjQoKSk7CisgIH0KK30KKworY2xhc3MgX0NvbnN0YW50cyB7CisgIHN0YXRpYyBjb25zdCB1dGY4Y29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF8wX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnMCcuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfOV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzknLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYX0FfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdhJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF9GX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnZicuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBDT01NQV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJywnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgQ09MT05fQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCc6Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IExCUkFDRV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ3snLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUkJSQUNFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnfScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBMQlJBQ0tFVF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ1snLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUkJSQUNLRVRfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCddJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IFFVT1RFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnIicuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBCQUNLU0xBU0hfQllURVMgPQorICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChyJ1wnLmNvZGVVbml0cyk7CisKKyAgc3RhdGljIGZpbmFsIEVTQ1NFUV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QocidcdTAwJy5jb2RlVW5pdHMpOworCisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSlNPTl9DSEFSX1RBQkxFID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gOCBieXRlcworICAgICdiJy5jb2RlVW5pdEF0KDApLCAndCcuY29kZVVuaXRBdCgwKSwgJ24nLmNvZGVVbml0QXQoMCksIDAsIC8vIDQgYnl0ZXMKKyAgICAnZicuY29kZVVuaXRBdCgwKSwgJ3InLmNvZGVVbml0QXQoMCksIDAsIDAsIC8vIDQgYnl0ZXMKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gOCBieXRlcworICAgIDEsIDEsICciJy5jb2RlVW5pdEF0KDApLCAxLCAxLCAxLCAxLCAxLCAvLyA4IGJ5dGVzCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSAvLyA4IGJ5dGVzCisgIF0pOworCisgIHN0YXRpYyBjb25zdCBTdHJpbmcgRVNDQVBFX0NIQVJTID0gciciXC9iZm5ydCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgRVNDQVBFX0NIQVJfVkFMUyA9ICciXFwvXGJcZlxuXHJcdCc7CisKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0JPT0wgPSAndGYnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfQllURSA9ICdpOCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JMTYgPSAnaTE2JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0kzMiA9ICdpMzInOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTY0ID0gJ2k2NCc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9ET1VCTEUgPSAnZGJsJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX1NUUlVDVCA9ICdyZWMnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU1RSSU5HID0gJ3N0cic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9NQVAgPSAnbWFwJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0xJU1QgPSAnbHN0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX1NFVCA9ICdzZXQnOworCisgIHN0YXRpYyBmaW5hbCBNYXA8aW50LCBVaW50OExpc3Q+IF9UWVBFX0lEX1RPX05BTUVfQllURVMgPQorICAgICAgbmV3IE1hcC51bm1vZGlmaWFibGUoeworICAgIFRUeXBlLkJPT0w6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9CT09MLmNvZGVVbml0cyksCisgICAgVFR5cGUuQllURTogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0JZVEUuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5JMTY6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9JMTYuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5JMzI6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9JMzIuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5JNjQ6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9JNjQuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5ET1VCTEU6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9ET1VCTEUuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5TVFJJTkc6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9TVFJJTkcuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5TVFJVQ1Q6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9TVFJVQ1QuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5NQVA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9NQVAuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5TRVQ6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9TRVQuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5MSVNUOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfTElTVC5jb2RlVW5pdHMpCisgIH0pOworCisgIHN0YXRpYyBVaW50OExpc3QgZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChpbnQgdHlwZUlkKSB7CisgICAgaWYgKCFfVFlQRV9JRF9UT19OQU1FX0JZVEVTLmNvbnRhaW5zS2V5KHR5cGVJZCkpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gX1RZUEVfSURfVE9fTkFNRV9CWVRFU1t0eXBlSWRdOworICB9CisKKyAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIGludD4gX05BTUVfVE9fVFlQRV9JRCA9IG5ldyBNYXAudW5tb2RpZmlhYmxlKHsKKyAgICBOQU1FX0JPT0w6IFRUeXBlLkJPT0wsCisgICAgTkFNRV9CWVRFOiBUVHlwZS5CWVRFLAorICAgIE5BTUVfSTE2OiBUVHlwZS5JMTYsCisgICAgTkFNRV9JMzI6IFRUeXBlLkkzMiwKKyAgICBOQU1FX0k2NDogVFR5cGUuSTY0LAorICAgIE5BTUVfRE9VQkxFOiBUVHlwZS5ET1VCTEUsCisgICAgTkFNRV9TVFJJTkc6IFRUeXBlLlNUUklORywKKyAgICBOQU1FX1NUUlVDVDogVFR5cGUuU1RSVUNULAorICAgIE5BTUVfTUFQOiBUVHlwZS5NQVAsCisgICAgTkFNRV9TRVQ6IFRUeXBlLlNFVCwKKyAgICBOQU1FX0xJU1Q6IFRUeXBlLkxJU1QKKyAgfSk7CisKKyAgc3RhdGljIGludCBnZXRUeXBlSWRGb3JUeXBlTmFtZShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBTdHJpbmcgbmFtZSA9IHV0Zjhjb2RlYy5kZWNvZGUoYnl0ZXMpOworICAgIGlmICghX05BTUVfVE9fVFlQRV9JRC5jb250YWluc0tleShuYW1lKSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHJldHVybiBfTkFNRV9UT19UWVBFX0lEW25hbWVdOworICB9CisKKyAgc3RhdGljIGZpbmFsIFNldDxpbnQ+IF9KU09OX05VTUVSSUNTID0gbmV3IFNldC5mcm9tKFsKKyAgICAnKycuY29kZVVuaXRBdCgwKSwKKyAgICAnLScuY29kZVVuaXRBdCgwKSwKKyAgICAnLicuY29kZVVuaXRBdCgwKSwKKyAgICAnMCcuY29kZVVuaXRBdCgwKSwKKyAgICAnMScuY29kZVVuaXRBdCgwKSwKKyAgICAnMicuY29kZVVuaXRBdCgwKSwKKyAgICAnMycuY29kZVVuaXRBdCgwKSwKKyAgICAnNCcuY29kZVVuaXRBdCgwKSwKKyAgICAnNScuY29kZVVuaXRBdCgwKSwKKyAgICAnNicuY29kZVVuaXRBdCgwKSwKKyAgICAnNycuY29kZVVuaXRBdCgwKSwKKyAgICAnOCcuY29kZVVuaXRBdCgwKSwKKyAgICAnOScuY29kZVVuaXRBdCgwKSwKKyAgICAnRScuY29kZVVuaXRBdCgwKSwKKyAgICAnZScuY29kZVVuaXRBdCgwKQorICBdKTsKKworICBzdGF0aWMgYm9vbCBpc0pzb25OdW1lcmljKGludCBieXRlKSB7CisgICAgcmV0dXJuIF9KU09OX05VTUVSSUNTLmNvbnRhaW5zKGJ5dGUpOworICB9Cit9CisKK2NsYXNzIF9Mb29rYWhlYWRSZWFkZXIgeworICBmaW5hbCBUSnNvblByb3RvY29sIHByb3RvY29sOworCisgIF9Mb29rYWhlYWRSZWFkZXIodGhpcy5wcm90b2NvbCk7CisKKyAgYm9vbCBfaGFzRGF0YSA9IGZhbHNlOworICBmaW5hbCBVaW50OExpc3QgX2RhdGEgPSBuZXcgVWludDhMaXN0KDEpOworCisgIGludCByZWFkKCkgeworICAgIGlmIChfaGFzRGF0YSkgeworICAgICAgX2hhc0RhdGEgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LnJlYWRBbGwoX2RhdGEsIDAsIDEpOworICAgIH0KKworICAgIHJldHVybiBfZGF0YVswXTsKKyAgfQorCisgIGludCBwZWVrKCkgeworICAgIGlmICghX2hhc0RhdGEpIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC5yZWFkQWxsKF9kYXRhLCAwLCAxKTsKKyAgICB9CisgICAgX2hhc0RhdGEgPSB0cnVlOworCisgICAgcmV0dXJuIF9kYXRhWzBdOworICB9Cit9CisKK2NsYXNzIF9CYXNlQ29udGV4dCB7CisgIGZpbmFsIFRKc29uUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgX0Jhc2VDb250ZXh0KHRoaXMucHJvdG9jb2wpOworCisgIHZvaWQgd3JpdGUoKSB7fQorCisgIHZvaWQgcmVhZCgpIHt9CisKKyAgYm9vbCBnZXQgZXNjYXBlTnVtYmVycyA9PiBmYWxzZTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnQmFzZUNvbnRleHQnOworfQorCitjbGFzcyBfTGlzdENvbnRleHQgZXh0ZW5kcyBfQmFzZUNvbnRleHQgeworICBfTGlzdENvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkgOiBzdXBlcihwcm90b2NvbCk7CisKKyAgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgIHZvaWQgd3JpdGUoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkNPTU1BX0JZVEVTKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlYWQoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLl9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5DT01NQV9CWVRFU1swXSk7CisgICAgfQorICB9CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ0xpc3RDb250ZXh0JzsKK30KKworY2xhc3MgX1BhaXJDb250ZXh0IGV4dGVuZHMgX0Jhc2VDb250ZXh0IHsKKyAgX1BhaXJDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpIDogc3VwZXIocHJvdG9jb2wpOworCisgIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCBfY29sb24gPSB0cnVlOworCisgIFVpbnQ4TGlzdCBnZXQgc3ltYm9sQnl0ZXMgPT4KKyAgICAgIF9jb2xvbiA/IF9Db25zdGFudHMuQ09MT05fQllURVMgOiBfQ29uc3RhbnRzLkNPTU1BX0JZVEVTOworCisgIHZvaWQgd3JpdGUoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICBfY29sb24gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQud3JpdGVBbGwoc3ltYm9sQnl0ZXMpOworICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICB9CisgIH0KKworICB2b2lkIHJlYWQoKSB7CisgICAgaWYgKF9maXJzdCkgeworICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICBfY29sb24gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC5fcmVhZEpzb25TeW50YXhDaGFyKHN5bWJvbEJ5dGVzWzBdKTsKKyAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgfQorICB9CisKKyAgYm9vbCBnZXQgZXNjYXBlTnVtYmVycyA9PiBfY29sb247CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJ1BhaXJDb250ZXh0JzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVExpc3QgeworICBmaW5hbCBpbnQgZWxlbWVudFR5cGU7CisgIGZpbmFsIGludCBsZW5ndGg7CisKKyAgVExpc3QodGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21hcC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21hcC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGY2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQKQEAgLTAsMCArMSwyNiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTWFwIHsKKyAgZmluYWwgaW50IGtleVR5cGU7CisgIGZpbmFsIGludCB2YWx1ZVR5cGU7CisgIGZpbmFsIGludCBsZW5ndGg7CisKKyAgVE1hcCh0aGlzLmtleVR5cGUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdiODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydApAQCAtMCwwICsxLDM1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRNZXNzYWdlVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgQ0FMTCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgUkVQTFkgPSAyOworICBzdGF0aWMgY29uc3QgaW50IEVYQ0VQVElPTiA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgT05FV0FZID0gNDsKK30KKworY2xhc3MgVE1lc3NhZ2UgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgaW50IHR5cGU7CisgIGZpbmFsIGludCBzZXFpZDsKKworICBUTWVzc2FnZSh0aGlzLm5hbWUsIHRoaXMudHlwZSwgdGhpcy5zZXFpZCk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gIjxUTWVzc2FnZSBuYW1lOiAnJG5hbWUnIHR5cGU6ICR0eXBlIHNlcWlkOiAkc2VxaWQ+IjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4YTZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNDMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKyAgc3RhdGljIGNvbnN0IFNFUEFSQVRPUiA9ICc6JzsKKworICBmaW5hbCBTdHJpbmcgX3NlcnZpY2VOYW1lOworCisgIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgOiBfc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZSwKKyAgICAgICAgc3VwZXIocHJvdG9jb2wpIHsKKyAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgic2VydmljZU5hbWUiKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIHx8CisgICAgICAgIG1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IF9zZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG1lc3NhZ2UubmFtZTsKKyAgICAgIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobmFtZSwgbWVzc2FnZS50eXBlLCBtZXNzYWdlLnNlcWlkKTsKKyAgICB9CisKKyAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDljMDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw5NSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgeworICBmaW5hbCBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICBUUHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworCisgIC8vLyBXcml0ZQorICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpOworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCk7CisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOworICB2b2lkIHdyaXRlRmllbGRFbmQoKTsKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCk7CisgIHZvaWQgd3JpdGVNYXBFbmQoKTsKKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpOworICB2b2lkIHdyaXRlTGlzdEVuZCgpOworCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCk7CisgIHZvaWQgd3JpdGVTZXRFbmQoKTsKKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpOworCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKTsKKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpOworCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMik7CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KTsKKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKTsKKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpOworCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKTsKKworICAvLy8gUmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCk7CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKTsKKworICBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpOworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKTsKKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKTsKKyAgdm9pZCByZWFkRmllbGRFbmQoKTsKKworICBUTWFwIHJlYWRNYXBCZWdpbigpOworICB2b2lkIHJlYWRNYXBFbmQoKTsKKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCk7CisgIHZvaWQgcmVhZExpc3RFbmQoKTsKKworICBUU2V0IHJlYWRTZXRCZWdpbigpOworICB2b2lkIHJlYWRTZXRFbmQoKTsKKworICBib29sIHJlYWRCb29sKCk7CisKKyAgaW50IHJlYWRCeXRlKCk7CisKKyAgaW50IHJlYWRJMTYoKTsKKworICBpbnQgcmVhZEkzMigpOworCisgIGludCByZWFkSTY0KCk7CisKKyAgZG91YmxlIHJlYWREb3VibGUoKTsKKworICBTdHJpbmcgcmVhZFN0cmluZygpOworCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMDJmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydApAQCAtMCwwICsxLDE1MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gRm9yd2FyZCBhbGwgb3BlcmF0aW9ucyB0byB0aGUgd3JhcHBlZCBwcm90b2NvbC4gIFVzZWQgYXMgYSBiYXNlIGNsYXNzLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgZmluYWwgVFByb3RvY29sIF9wcm90b2NvbDsKKworICBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgOiBfcHJvdG9jb2wgPSBwcm90b2NvbCwKKyAgICAgICAgc3VwZXIocHJvdG9jb2wudHJhbnNwb3J0KTsKKworICAvLy8gV3JpdGUKKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3QpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIF9wcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oZmllbGQpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeworICAgIF9wcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWFwQmVnaW4obWFwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlTWFwRW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4obGlzdCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTZXRCZWdpbihzZXQpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTZXRFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIF9wcm90b2NvbC53cml0ZUJvb2woYik7CisgIH0KKworICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgeworICAgIF9wcm90b2NvbC53cml0ZUJ5dGUoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJMTYoaTE2KTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIF9wcm90b2NvbC53cml0ZUkzMihpMzIpOworICB9CisKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgX3Byb3RvY29sLndyaXRlSTY0KGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgX3Byb3RvY29sLndyaXRlRG91YmxlKGQpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgX3Byb3RvY29sLndyaXRlU3RyaW5nKHN0cik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9wcm90b2NvbC53cml0ZUJpbmFyeShieXRlcyk7CisgIH0KKworICAvLy8gUmVhZAorICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpID0+IF9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSA9PiBfcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpOworCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpOworICB2b2lkIHJlYWRGaWVsZEVuZCgpID0+IF9wcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKworICBUTWFwIHJlYWRNYXBCZWdpbigpID0+IF9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKyAgdm9pZCByZWFkTWFwRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKyAgdm9pZCByZWFkTGlzdEVuZCgpID0+IF9wcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRTZXRCZWdpbigpOworICB2b2lkIHJlYWRTZXRFbmQoKSA9PiBfcHJvdG9jb2wucmVhZFNldEVuZCgpOworCisgIGJvb2wgcmVhZEJvb2woKSA9PiBfcHJvdG9jb2wucmVhZEJvb2woKTsKKworICBpbnQgcmVhZEJ5dGUoKSA9PiBfcHJvdG9jb2wucmVhZEJ5dGUoKTsKKworICBpbnQgcmVhZEkxNigpID0+IF9wcm90b2NvbC5yZWFkSTE2KCk7CisKKyAgaW50IHJlYWRJMzIoKSA9PiBfcHJvdG9jb2wucmVhZEkzMigpOworCisgIGludCByZWFkSTY0KCkgPT4gX3Byb3RvY29sLnJlYWRJNjQoKTsKKworICBkb3VibGUgcmVhZERvdWJsZSgpID0+IF9wcm90b2NvbC5yZWFkRG91YmxlKCk7CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSA9PiBfcHJvdG9jb2wucmVhZFN0cmluZygpOworCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgPT4gX3Byb3RvY29sLnJlYWRCaW5hcnkoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2YmFlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFByb3RvY29sRXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOworICBzdGF0aWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOworICBzdGF0aWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOworICBzdGF0aWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICBzdGF0aWMgY29uc3QgaW50IERFUFRIX0xJTUlUID0gNjsKK30KKworY2xhc3MgVFByb3RvY29sRXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBUUHJvdG9jb2xFcnJvcihbaW50IHR5cGUgPSBUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgU3RyaW5nIG1lc3NhZ2UgPSAiIl0pCisgICAgICA6IHN1cGVyKHR5cGUsIG1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyYzZjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xGYWN0b3J5PFQgZXh0ZW5kcyBUUHJvdG9jb2w+IHsKKyAgVCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDIwMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX3V0aWwuZGFydApAQCAtMCwwICsxLDEwNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUUHJvdG9jb2xVdGlsIHsKKyAgLy8gZXF1YWwgdG8gSmF2YVNjcmlwdCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgMl41MyAtIDEKKyAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0UmVjdXJzaW9uTGltaXQgPSA5MDA3MTk5MjU0NzQwOTkxOworCisgIHN0YXRpYyBpbnQgbWF4UmVjdXJzaW9uTGltaXQgPSBkZWZhdWx0UmVjdXJzaW9uTGltaXQ7CisKKyAgc3RhdGljIHNraXAoVFByb3RvY29sIHByb3QsIGludCB0eXBlKSB7CisgICAgX3NraXAocHJvdCwgdHlwZSwgbWF4UmVjdXJzaW9uTGltaXQpOworICB9CisKKyAgc3RhdGljIF9za2lwKFRQcm90b2NvbCBwcm90LCBpbnQgdHlwZSwgaW50IHJlY3Vyc2lvbkxpbWl0KSB7CisgICAgaWYgKHJlY3Vyc2lvbkxpbWl0IDw9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICBwcm90LnJlYWRCb29sKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICBwcm90LnJlYWRJMTYoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICBwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICBwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICBwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgX3NraXAocHJvdCwgZmllbGQudHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgICBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICAgIFRNYXAgbWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBtYXAua2V5VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgICBfc2tpcChwcm90LCBtYXAudmFsdWVUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZE1hcEVuZCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICAgIFRTZXQgc2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBzZXQuZWxlbWVudFR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgIFRMaXN0IGxpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgX3NraXAocHJvdCwgbGlzdC5lbGVtZW50VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zZXQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQyNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0CkBAIC0wLDAgKzEsMjUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFNldCB7CisgIGZpbmFsIGludCBlbGVtZW50VHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUU2V0KHRoaXMuZWxlbWVudFR5cGUsIHRoaXMubGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zdHJ1Y3QuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9zdHJ1Y3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzAzZjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFN0cnVjdCB7CisgIGZpbmFsIFN0cmluZyBuYW1lOworCisgIFRTdHJ1Y3QoW3RoaXMubmFtZSA9ICIiXSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3R5cGUuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE5ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3R5cGUuZGFydApAQCAtMCwwICsxLDM0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBTVE9QID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBWT0lEID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBCT09MID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBCWVRFID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBET1VCTEUgPSA0OworICBzdGF0aWMgY29uc3QgaW50IEkxNiA9IDY7CisgIHN0YXRpYyBjb25zdCBpbnQgSTMyID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBJNjQgPSAxMDsKKyAgc3RhdGljIGNvbnN0IGludCBTVFJJTkcgPSAxMTsKKyAgc3RhdGljIGNvbnN0IGludCBTVFJVQ1QgPSAxMjsKKyAgc3RhdGljIGNvbnN0IGludCBNQVAgPSAxMzsKKyAgc3RhdGljIGNvbnN0IGludCBTRVQgPSAxNDsKKyAgc3RhdGljIGNvbnN0IGludCBMSVNUID0gMTU7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMWQxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydApAQCAtMCwwICsxLDUwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFREZXNlcmlhbGl6ZXIgeworICBmaW5hbCBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdEZXNlcmlhbGl6ZXInLCBUTWVzc2FnZVR5cGUuT05FV0FZLCAxKTsKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIFREZXNlcmlhbGl6ZXIoe1RQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5fSkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgIAorICAgIGlmIChwcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgIH0KKyAgICAKKyAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKyAgfQorCisgIHZvaWQgcmVhZChUQmFzZSBiYXNlLCBVaW50OExpc3QgZGF0YSkgeworICAgIHRyYW5zcG9ydC53cml0ZUFsbChkYXRhKTsKKyAgICAKKyAgICB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAKKyAgICBiYXNlLnJlYWQocHJvdG9jb2wpOworICB9CisKKyAgdm9pZCByZWFkU3RyaW5nKFRCYXNlIGJhc2UsIFN0cmluZyBkYXRhKSB7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKEJBU0U2NC5kZWNvZGUoZGF0YSkpOworICAgIAorICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgYmFzZS5yZWFkKHByb3RvY29sKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3Rfc2VyaWFsaXplci5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZGRiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQKQEAgLTAsMCArMSw0OCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU2VyaWFsaXplciB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ1NlcmlhbGl6ZXInLCBUTWVzc2FnZVR5cGUuT05FV0FZLCAxKTsKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIFRTZXJpYWxpemVyKHtUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeX0pIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAKKyAgICBpZiAocHJvdG9jb2xGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgfQorCisgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisgIH0KKworICBVaW50OExpc3Qgd3JpdGUoVEJhc2UgYmFzZSkgeworICAgIGJhc2Uud3JpdGUocHJvdG9jb2wpOworICAgIAorICAgIHJldHVybiB0cmFuc3BvcnQuY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgIH0KKworICBTdHJpbmcgd3JpdGVTdHJpbmcoVEJhc2UgYmFzZSkgeworICAgIGJhc2Uud3JpdGUocHJvdG9jb2wpOworICAgIAorICAgIFVpbnQ4TGlzdCBieXRlcyA9IHRyYW5zcG9ydC5jb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICAKKyAgICByZXR1cm4gQkFTRTY0LmVuY29kZShieXRlcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YWJkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9hcHBsaWNhdGlvbl9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMTA0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRBcHBsaWNhdGlvbkVycm9yVHlwZSB7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5LTk9XTl9NRVRIT0QgPSAxOworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgQkFEX1NFUVVFTkNFX0lEID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5URVJOQUxfRVJST1IgPSA2OworICBzdGF0aWMgY29uc3QgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgIHN0YXRpYyBjb25zdCBpbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKK30KKworY2xhc3MgVEFwcGxpY2F0aW9uRXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBzdGF0aWMgZmluYWwgVFN0cnVjdCBfc3RydWN0ID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkVycm9yIik7CisgIHN0YXRpYyBjb25zdCBpbnQgTUVTU0FHRSA9IDE7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX21lc3NhZ2VGaWVsZCA9CisgICAgICBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCBNRVNTQUdFKTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFID0gMjsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfdHlwZUZpZWxkID0gbmV3IFRGaWVsZCgidHlwZSIsIFRUeXBlLkkzMiwgVFlQRSk7CisKKyAgVEFwcGxpY2F0aW9uRXJyb3IoCisgICAgICBbaW50IHR5cGUgPSBUQXBwbGljYXRpb25FcnJvclR5cGUuVU5LTk9XTiwgU3RyaW5nIG1lc3NhZ2UgPSAiIl0pCisgICAgICA6IHN1cGVyKHR5cGUsIG1lc3NhZ2UpOworCisgIHN0YXRpYyBUQXBwbGljYXRpb25FcnJvciByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIFRGaWVsZCBmaWVsZDsKKworICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICBpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOOworCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FcnJvcih0eXBlLCBtZXNzYWdlKTsKKyAgfQorCisgIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeworICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oX3N0cnVjdCk7CisKKyAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmICFtZXNzYWdlLmlzRW1wdHkpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfbWVzc2FnZUZpZWxkKTsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKG1lc3NhZ2UpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfdHlwZUZpZWxkKTsKKyAgICBvcHJvdC53cml0ZUkzMih0eXBlKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfYmFzZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTcxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RfYmFzZS5kYXJ0CkBAIC0wLDAgKzEsMzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworYWJzdHJhY3QgY2xhc3MgVEJhc2UgeworICAvLy8gUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpOworCisgIC8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBbb3Byb3RdIHByb3RvY29sLgorICB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCk7CisKKyAgLy8vIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldCwgdXNpbmcgdGhlIFtmaWVsZElkXS4KKyAgYm9vbCBpc1NldChpbnQgZmllbGRJZCk7CisKKyAgLy8vIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgW2ZpZWxkSWRdLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIHRoZQorICAvLy8gYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KKyAgZ2V0RmllbGRWYWx1ZShpbnQgZmllbGRJZCk7CisKKyAgLy8vIFNldCBhIGZpZWxkJ3MgdmFsdWUgYnkgW2ZpZWxkSWRdLiBQcmltaXRpdmUgdHlwZXMgbXVzdCBiZSAiYm94ZWQiIGluIHRoZQorICAvLy8gYXBwcm9wcmlhdGUgb2JqZWN0IHdyYXBwZXIgdHlwZS4KKyAgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJZCwgT2JqZWN0IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhYjczMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9lcnJvci5kYXJ0CkBAIC0wLDAgKzEsMjcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEVycm9yIGV4dGVuZHMgRXJyb3IgeworICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKyAgZmluYWwgaW50IHR5cGU7CisKKyAgVEVycm9yKHRoaXMudHlwZSwgdGhpcy5tZXNzYWdlKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiPFRFcnJvciB0eXBlOiAkdHlwZSBtZXNzYWdlOiAnJG1lc3NhZ2UnPiI7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RfcHJvY2Vzc29yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfcHJvY2Vzc29yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmMjBmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydApAQCAtMCwwICsxLDI0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorLy8vIHdyaXRlcyB0byBzb21lIG91dHB1dCBzdHJlYW0uCithYnN0cmFjdCBjbGFzcyBUUHJvY2Vzc29yIHsKKyAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNhMzBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDk4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBCdWZmZXJlZCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgZmluYWwgTGlzdDxpbnQ+IF93cml0ZUJ1ZmZlciA9IFtdOworICBJdGVyYXRvcjxpbnQ+IF9yZWFkSXRlcmF0b3I7CisKKyAgVWludDhMaXN0IGNvbnN1bWVXcml0ZUJ1ZmZlcigpIHsKKyAgICBVaW50OExpc3QgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChfd3JpdGVCdWZmZXIpOworICAgIF93cml0ZUJ1ZmZlci5jbGVhcigpOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICB2b2lkIF9zZXRSZWFkQnVmZmVyKFVpbnQ4TGlzdCByZWFkQnVmZmVyKSB7CisgICAgX3JlYWRJdGVyYXRvciA9IHJlYWRCdWZmZXIgIT0gbnVsbCA/IHJlYWRCdWZmZXIuaXRlcmF0b3IgOiBudWxsOworICB9CisKKyAgdm9pZCBfcmVzZXQoe2Jvb2wgaXNPcGVuOiBmYWxzZX0pIHsKKyAgICBfaXNPcGVuID0gaXNPcGVuOworICAgIF93cml0ZUJ1ZmZlci5jbGVhcigpOworICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICB9CisKKyAgYm9vbCBnZXQgaGFzUmVhZERhdGEgPT4gX3JlYWRJdGVyYXRvciAhPSBudWxsOworCisgIGJvb2wgX2lzT3BlbjsKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICB9CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIGlmIChfcmVhZEl0ZXJhdG9yID09IG51bGwgfHwgbGVuZ3RoIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKKyAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IF9yZWFkSXRlcmF0b3IuY3VycmVudDsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICAvLyBjbGVhbnVwIGl0ZXJhdG9yIHdoZW4gd2UndmUgcmVhY2hlZCB0aGUgZW5kCisgICAgaWYgKF9yZWFkSXRlcmF0b3IuY3VycmVudCA9PSBudWxsKSB7CisgICAgICBfcmVhZEl0ZXJhdG9yID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIF93cml0ZUJ1ZmZlci5hZGRBbGwoYnVmZmVyLnN1Ymxpc3Qob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTsKKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBfcmVhZEl0ZXJhdG9yID0gY29uc3VtZVdyaXRlQnVmZmVyKCkuaXRlcmF0b3I7CisKKyAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjAzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDE2OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gRnJhbWVkIFtUVHJhbnNwb3J0XS4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSBGcmFtZWQgdHJhbnNwb3J0LgorY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIHN0YXRpYyBjb25zdCBpbnQgaGVhZGVyQnl0ZUNvdW50ID0gNDsKKworICBmaW5hbCBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisKKyAgZmluYWwgVWludDhMaXN0IF9oZWFkZXJCeXRlcyA9IG5ldyBVaW50OExpc3QoaGVhZGVyQnl0ZUNvdW50KTsKKyAgaW50IF9yZWNlaXZlZEhlYWRlckJ5dGVzID0gMDsKKworICBpbnQgX2JvZHlTaXplID0gMDsKKyAgVWludDhMaXN0IF9ib2R5ID0gbnVsbDsKKyAgaW50IF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisKKyAgQ29tcGxldGVyPFVpbnQ4TGlzdD4gX2ZyYW1lQ29tcGxldGVyID0gbnVsbDsKKworICBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IF90cmFuc3BvcnQgPSB0cmFuc3BvcnQgeworICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgidHJhbnNwb3J0Iik7CisgICAgfQorICB9CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF90cmFuc3BvcnQuaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICAgIHJldHVybiBfdHJhbnNwb3J0Lm9wZW4oKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgICAgcmV0dXJuIF90cmFuc3BvcnQuY2xvc2UoKTsKKyAgfQorCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoaGFzUmVhZERhdGEpIHsKKyAgICAgIGludCBnb3QgPSBzdXBlci5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgaWYgKGdvdCA+IDApIHJldHVybiBnb3Q7CisgICAgfQorCisgICAgLy8gSU1QT1JUQU5UOiBieSB0aGUgdGltZSB5b3UndmUgZ290IGhlcmUsCisgICAgLy8gYW4gZW50aXJlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworCisgICAgcmV0dXJuIHN1cGVyLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIF9yZWFkRnJhbWUoKSB7CisgICAgaWYgKF9ib2R5ID09IG51bGwpIHsKKyAgICAgIGJvb2wgZ290RnVsbEhlYWRlciA9IF9yZWFkRnJhbWVIZWFkZXIoKTsKKyAgICAgIGlmICghZ290RnVsbEhlYWRlcikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgX3JlYWRGcmFtZUJvZHkoKTsKKyAgfQorCisgIGJvb2wgX3JlYWRGcmFtZUhlYWRlcigpIHsKKyAgICB2YXIgcmVtYWluaW5nSGVhZGVyQnl0ZXMgPSBoZWFkZXJCeXRlQ291bnQgLSBfcmVjZWl2ZWRIZWFkZXJCeXRlczsKKworICAgIGludCBnb3QgPSBfdHJhbnNwb3J0LnJlYWQoX2hlYWRlckJ5dGVzLCBfcmVjZWl2ZWRIZWFkZXJCeXRlcywgcmVtYWluaW5nSGVhZGVyQnl0ZXMpOworICAgIGlmIChnb3QgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlNvY2tldCBjbG9zZWQgZHVyaW5nIGZyYW1lIGhlYWRlciByZWFkIik7CisgICAgfQorCisgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgKz0gZ290OworCisgICAgaWYgKF9yZWNlaXZlZEhlYWRlckJ5dGVzID09IGhlYWRlckJ5dGVDb3VudCkgeworICAgICAgaW50IHNpemUgPSBfaGVhZGVyQnl0ZXMuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRVaW50MzIoMCk7CisKKyAgICAgIF9yZWNlaXZlZEhlYWRlckJ5dGVzID0gMDsKKworICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZTogJHNpemUiKTsKKyAgICAgIH0KKworICAgICAgX2JvZHlTaXplID0gc2l6ZTsKKyAgICAgIF9ib2R5ID0gbmV3IFVpbnQ4TGlzdChfYm9keVNpemUpOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICB2b2lkIF9yZWFkRnJhbWVCb2R5KCkgeworICAgIHZhciByZW1haW5pbmdCb2R5Qnl0ZXMgPSBfYm9keVNpemUgLSBfcmVjZWl2ZWRCb2R5Qnl0ZXM7CisKKyAgICBpbnQgZ290ID0gX3RyYW5zcG9ydC5yZWFkKF9ib2R5LCBfcmVjZWl2ZWRCb2R5Qnl0ZXMsIHJlbWFpbmluZ0JvZHlCeXRlcyk7CisgICAgaWYgKGdvdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiU29ja2V0IGNsb3NlZCBkdXJpbmcgZnJhbWUgYm9keSByZWFkIik7CisgICAgfQorCisgICAgX3JlY2VpdmVkQm9keUJ5dGVzICs9IGdvdDsKKworICAgIGlmIChfcmVjZWl2ZWRCb2R5Qnl0ZXMgPT0gX2JvZHlTaXplKSB7CisgICAgICB2YXIgYm9keSA9IF9ib2R5OworCisgICAgICBfYm9keVNpemUgPSAwOworICAgICAgX2JvZHkgPSBudWxsOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICAgICAgX3NldFJlYWRCdWZmZXIoYm9keSk7CisKKyAgICAgIHZhciBjb21wbGV0ZXIgPSBfZnJhbWVDb21wbGV0ZXI7CisgICAgICBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKG5ldyBVaW50OExpc3QoMCkpOworICAgIH0gZWxzZSB7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgfQorICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIGlmIChfZnJhbWVDb21wbGV0ZXIgPT0gbnVsbCkgeworICAgICAgVWludDhMaXN0IGJ1ZmZlciA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7CisKKyAgICAgIF9oZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLnNldFVpbnQzMigwLCBsZW5ndGgpOworICAgICAgX3RyYW5zcG9ydC53cml0ZShfaGVhZGVyQnl0ZXMsIDAsIGhlYWRlckJ5dGVDb3VudCk7CisgICAgICBfdHJhbnNwb3J0LndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKKworICAgICAgX2ZyYW1lQ29tcGxldGVyICA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0PigpOworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgIH0KKworICAgIHJldHVybiBfZnJhbWVDb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCkgeworICAgIF90cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICBfcmVhZEZyYW1lKCk7CisgICAgfSkuY2F0Y2hFcnJvcigoZSkgeworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworICAgICAgX2JvZHlTaXplID0gMDsKKyAgICAgIF9ib2R5ID0gbnVsbDsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisgICAgICBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworCisgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlKTsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzhlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSwxMDAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgW1RUcmFuc3BvcnRdLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChuZXcgQnJvd3NlckNsaWVudCgpLAorLy8vICAgICAgICAgbmV3IFRIdHRwQ29uZmlnKHVybCwgeydYLU15LUN1c3RvbS1IZWFkZXInOiAnbXkgdmFsdWUnfSkpOworLy8vICAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpOworLy8vICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U2VydmljZUNsaWVudChwcm90b2NvbCk7CisvLy8gICAgIHZhciByZXN1bHQgPSBjbGllbnQubXlNZXRob2QoKTsKKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSlMgWEhSIEhUVFAgdHJhbnNwb3J0LgorY2xhc3MgVEh0dHBDbGllbnRUcmFuc3BvcnQgZXh0ZW5kcyBUQnVmZmVyZWRUcmFuc3BvcnQgeworICBmaW5hbCBDbGllbnQgaHR0cENsaWVudDsKKyAgZmluYWwgVEh0dHBDb25maWcgY29uZmlnOworCisgIFRIdHRwQ2xpZW50VHJhbnNwb3J0KHRoaXMuaHR0cENsaWVudCwgdGhpcy5jb25maWcpIHsKKyAgICBpZiAoaHR0cENsaWVudCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJodHRwQ2xpZW50Iik7CisgICAgfQorICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgYXN5bmMgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICBodHRwQ2xpZW50LmNsb3NlKCk7CisgIH0KKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgdmFyIHJlcXVlc3RCb2R5ID0gQkFTRTY0LmVuY29kZShjb25zdW1lV3JpdGVCdWZmZXIoKSk7CisKKyAgICAvLyBVc2UgYSBzeW5jIGNvbXBsZXRlciB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGNhbiBiZSByZWFkIGltbWVkaWF0ZWx5CisgICAgLy8gYWZ0ZXIgdGhlIHJlYWQgYnVmZmVyIGlzIHNldCwgYW5kIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYW5vdGhlcgorICAgIC8vIHJlc3BvbnNlIGNvdWxkIG92ZXJ3cml0ZSB0aGUgcmVhZCBidWZmZXIuCisgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXIuc3luYygpOworCisgICAgaHR0cENsaWVudAorICAgICAgICAucG9zdChjb25maWcudXJsLCBoZWFkZXJzOiBjb25maWcuaGVhZGVycywgYm9keTogcmVxdWVzdEJvZHkpCisgICAgICAgIC50aGVuKChyZXNwb25zZSkgeworICAgICAgVWludDhMaXN0IGRhdGE7CisgICAgICB0cnkgeworICAgICAgICBkYXRhID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgKKyAgICAgICAgICAgIEJBU0U2NC5kZWNvZGUocmVzcG9uc2UuYm9keSkpOworICAgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiRXhwZWN0ZWQgYSBCYXNlIDY0IGVuY29kZWQgc3RyaW5nLiIpOworICAgICAgfQorCisgICAgICBfc2V0UmVhZEJ1ZmZlcihkYXRhKTsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgpOworICAgIH0pOworCisgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CisgIH0KK30KKworY2xhc3MgVEh0dHBDb25maWcgeworICBmaW5hbCBVcmkgdXJsOworCisgIE1hcDxTdHJpbmcsIFN0cmluZz4gX2hlYWRlcnM7CisgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0IGhlYWRlcnMgPT4gX2hlYWRlcnM7CisKKyAgVEh0dHBDb25maWcodGhpcy51cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgeworICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhdXJsLmhhc0F1dGhvcml0eSkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkludmFsaWQgdXJsIik7CisgICAgfQorCisgICAgX2luaXRIZWFkZXJzKGhlYWRlcnMpOworICB9CisKKyAgdm9pZCBfaW5pdEhlYWRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBpbml0aWFsKSB7CisgICAgdmFyIGggPSB7fTsKKworICAgIGlmIChpbml0aWFsICE9IG51bGwpIHsKKyAgICAgIGguYWRkQWxsKGluaXRpYWwpOworICAgIH0KKworICAgIGhbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JzsKKyAgICBoWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi94LXRocmlmdCc7CisKKyAgICBfaGVhZGVycyA9IG5ldyBNYXAudW5tb2RpZmlhYmxlKGgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X21lc3NhZ2VfcmVhZGVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhMDcwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydApAQCAtMCwwICsxLDk5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBbVE1lc3NhZ2VSZWFkZXJdIGV4dHJhY3RzIGEgW1RNZXNzYWdlXSBmcm9tIGJ5dGVzLiAgVGhpcyBpcyB1c2VkIHRvIGFsbG93IGEKKy8vLyB0cmFuc3BvcnQgdG8gaW5zcGVjdCB0aGUgbWVzc2FnZSBzZXFpZCBhbmQgbWFwIHJlc3BvbnNlcyB0byByZXF1ZXN0cy4KK2NsYXNzIFRNZXNzYWdlUmVhZGVyIHsKKyAgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisKKyAgZmluYWwgaW50IGJ5dGVPZmZzZXQ7CisgIGZpbmFsIF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCBfdHJhbnNwb3J0OworCisgIC8vLyBDb25zdHJ1Y3QgYSBbTWVzc2FnZVJlYWRlcl0uICBUaGUgb3B0aW9uYWwgW2J5dGVPZmZzZXRdIHNwZWNpZmllcyB0aGUKKyAgLy8vIG51bWJlciBvZiBieXRlcyB0byBza2lwIGJlZm9yZSByZWFkaW5nIHRoZSBbVE1lc3NhZ2VdLgorICBUTWVzc2FnZVJlYWRlcih0aGlzLnByb3RvY29sRmFjdG9yeSwge2ludCBieXRlT2Zmc2V0OiAwfSkKKyAgICAgIDogX3RyYW5zcG9ydCA9IG5ldyBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQoKSwKKyAgICAgICAgdGhpcy5ieXRlT2Zmc2V0ID0gYnl0ZU9mZnNldDsKKworICBUTWVzc2FnZSByZWFkTWVzc2FnZShVaW50OExpc3QgYnl0ZXMpIHsKKyAgICBfdHJhbnNwb3J0LnJlc2V0KGJ5dGVzLCBieXRlT2Zmc2V0KTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woX3RyYW5zcG9ydCk7CisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICBfdHJhbnNwb3J0LnJlc2V0KG51bGwpOworCisgICAgcmV0dXJuIG1lc3NhZ2U7CisgIH0KK30KKworLy8vIEFuIGludGVybmFsIGNsYXNzIHVzZWQgdG8gc3VwcG9ydCBbVE1lc3NhZ2VSZWFkZXJdLgorY2xhc3MgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCgpOworCisgIEl0ZXJhdG9yPGludD4gX3JlYWRJdGVyYXRvcjsKKworICB2b2lkIHJlc2V0KFVpbnQ4TGlzdCBieXRlcywgW2ludCBvZmZzZXQgPSAwXSkgeworICAgIGlmIChieXRlcyA9PSBudWxsKSB7CisgICAgICBfcmVhZEl0ZXJhdG9yID0gbnVsbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID4gYnl0ZXMubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIG9mZnNldCBleGNlZWRzIHRoZSBieXRlcyBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBfcmVhZEl0ZXJhdG9yID0gYnl0ZXMuaXRlcmF0b3I7CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9mZnNldDsgaSsrKSB7CisgICAgICBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCk7CisgICAgfQorICB9CisKKyAgZ2V0IGlzT3BlbiA9PiB0cnVlOworCisgIEZ1dHVyZSBvcGVuKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKKworICBGdXR1cmUgY2xvc2UoKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIGludCByZWFkKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImJ1ZmZlciIpOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiVGhlIHJhbmdlIGV4Y2VlZHMgdGhlIGJ1ZmZlciBsZW5ndGgiKTsKKyAgICB9CisKKyAgICBpZiAoX3JlYWRJdGVyYXRvciA9PSBudWxsIHx8IGxlbmd0aCA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgX3JlYWRJdGVyYXRvci5tb3ZlTmV4dCgpKSB7CisgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBfcmVhZEl0ZXJhdG9yLmN1cnJlbnQ7CisgICAgICBpKys7CisgICAgfQorCisgICAgcmV0dXJuIGk7CisgIH0KKworICB2b2lkIHdyaXRlKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpID0+CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIEZ1dHVyZSBmbHVzaCgpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmViNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydApAQCAtMCwwICsxLDM4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2VudW0gVFNvY2tldFN0YXRlIHsgQ0xPU0VELCBPUEVOIH0KKworYWJzdHJhY3QgY2xhc3MgVFNvY2tldCB7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlOworCisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yOworCisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2U7CisKKyAgYm9vbCBnZXQgaXNPcGVuOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkOworCisgIEZ1dHVyZSBvcGVuKCk7CisKKyAgRnV0dXJlIGNsb3NlKCk7CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxMzc0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTc3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgW1RUcmFuc3BvcnRdLgorLy8vCisvLy8gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KG5ldyBUV2ViU29ja2V0KHVybCkpOworLy8vICAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisvLy8gICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTZXJ2aWNlQ2xpZW50KHByb3RvY29sKTsKKy8vLyAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5teU1ldGhvZCgpOworLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKUyBXZWJTb2NrZXQgdHJhbnNwb3J0LgorYWJzdHJhY3QgY2xhc3MgVFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKCd0aHJpZnQuVFNvY2tldFRyYW5zcG9ydCcpOworCisgIGZpbmFsIFRTb2NrZXQgc29ja2V0OworCisgIC8vLyBBIHRyYW5zcG9ydCB1c2luZyB0aGUgcHJvdmlkZWQgW3NvY2tldF0uCisgIFRTb2NrZXRUcmFuc3BvcnQodGhpcy5zb2NrZXQpIHsKKyAgICBpZiAoc29ja2V0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoJ3NvY2tldCcpOworICAgIH0KKworICAgIHNvY2tldC5vbkVycm9yLmxpc3RlbigoZSkgPT4gbG9nZ2VyLndhcm5pbmcoZSkpOworICAgIHNvY2tldC5vbk1lc3NhZ2UubGlzdGVuKGhhbmRsZUluY29taW5nTWVzc2FnZSk7CisgIH0KKworICBib29sIGdldCBpc09wZW4gPT4gc29ja2V0LmlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgICByZXR1cm4gc29ja2V0Lm9wZW4oKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgICAgcmV0dXJuIHNvY2tldC5jbG9zZSgpOworICB9CisKKyAgLy8vIE1ha2UgYW4gaW5jb21pbmcgbWVzc2FnZSBhdmFpbGFibGUgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQuCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBfc2V0UmVhZEJ1ZmZlcihtZXNzYWdlQnl0ZXMpOworICB9Cit9CisKKy8vLyBbVENsaWVudFNvY2tldFRyYW5zcG9ydF0gaXMgYSBiYXNpYyBjbGllbnQgc29ja2V0IHRyYW5zcG9ydC4gIEl0IHNlbmRzCisvLy8gb3V0Z29pbmcgbWVzc2FnZXMgYW5kIGV4cGVjdHMgYSByZXNwb25zZS4KKy8vLworLy8vIE5PVEU6IFRoaXMgdHJhbnNwb3J0IGV4cGVjdHMgYSBzaW5nbGUgdGhyZWFkZWQgc2VydmVyLCBhcyBpdCB3aWxsIHByb2Nlc3MKKy8vLyByZXNwb25zZXMgaW4gRklGTyBvcmRlci4KK2NsYXNzIFRDbGllbnRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgZmluYWwgTGlzdDxDb21wbGV0ZXI8VWludDhMaXN0Pj4gX2NvbXBsZXRlcnMgPSBbXTsKKworICBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KFRTb2NrZXQgc29ja2V0KSA6IHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4uc3luYygpOworICAgIF9jb21wbGV0ZXJzLmFkZChjb21wbGV0ZXIpOworCisgICAgaWYgKGJ5dGVzLmxlbmd0aEluQnl0ZXMgPiAwKSB7CisgICAgICBzb2NrZXQuc2VuZChieXRlcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgc3VwZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisKKyAgICBpZiAoX2NvbXBsZXRlcnMuaXNOb3RFbXB0eSkgeworICAgICAgdmFyIGNvbXBsZXRlciA9IF9jb21wbGV0ZXJzLnJlbW92ZUF0KDApOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfQorICB9Cit9CisKKy8vLyBbVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0XSBzZW5kcyBvdXRnb2luZyBtZXNzYWdlcyBhbmQgZXhwZWN0cyBhbgorLy8vIGFzeW5jaHJvbm91cyByZXNwb25zZS4KKy8vLworLy8vIE5PVEU6IFRoaXMgdHJhbnNwb3J0IHVzZXMgYSBbTWVzc2FnZVJlYWRlcl0gdG8gcmVhZCBhIFtUTWVzc2FnZV0gd2hlbiBhbgorLy8vIGluY29taW5nIG1lc3NhZ2UgYXJyaXZlcyB0byBjb3JyZWxhdGUgYSByZXNwb25zZSB0byBhIHJlcXVlc3QsIHVzaW5nIHRoZQorLy8vIHNlcWlkLgorY2xhc3MgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVFNvY2tldFRyYW5zcG9ydCB7CisgIHN0YXRpYyBjb25zdCBkZWZhdWx0VGltZW91dCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDMwKTsKKworICBmaW5hbCBNYXA8aW50LCBDb21wbGV0ZXI8VWludDhMaXN0Pj4gX2NvbXBsZXRlcnMgPSB7fTsKKworICBmaW5hbCBUTWVzc2FnZVJlYWRlciBtZXNzYWdlUmVhZGVyOworCisgIGZpbmFsIER1cmF0aW9uIHJlc3BvbnNlVGltZW91dDsKKworICBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQsIFRNZXNzYWdlUmVhZGVyIG1lc3NhZ2VSZWFkZXIsCisgICAgICB7RHVyYXRpb24gcmVzcG9uc2VUaW1lb3V0OiBkZWZhdWx0VGltZW91dH0pCisgICAgICA6IHRoaXMubWVzc2FnZVJlYWRlciA9IG1lc3NhZ2VSZWFkZXIsCisgICAgICAgIHRoaXMucmVzcG9uc2VUaW1lb3V0ID0gcmVzcG9uc2VUaW1lb3V0LAorICAgICAgICBzdXBlcihzb2NrZXQpOworCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZVJlYWRlci5yZWFkTWVzc2FnZShieXRlcyk7CisgICAgaW50IHNlcWlkID0gbWVzc2FnZS5zZXFpZDsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+LnN5bmMoKTsKKyAgICBfY29tcGxldGVyc1tzZXFpZF0gPSBjb21wbGV0ZXI7CisKKyAgICBpZiAocmVzcG9uc2VUaW1lb3V0ICE9IG51bGwpIHsKKyAgICAgIG5ldyBGdXR1cmUuZGVsYXllZChyZXNwb25zZVRpbWVvdXQsICgpIHsKKyAgICAgICAgdmFyIGNvbXBsZXRlciA9IF9jb21wbGV0ZXJzLnJlbW92ZShzZXFpZCk7CisgICAgICAgIGlmIChjb21wbGV0ZXIgIT0gbnVsbCkgeworICAgICAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKAorICAgICAgICAgICAgICBuZXcgVGltZW91dEV4Y2VwdGlvbigiUmVzcG9uc2UgdGltZWQgb3V0LiIsIHJlc3BvbnNlVGltZW91dCkpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisKKyAgICBzb2NrZXQuc2VuZChieXRlcyk7CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVhZGVyLnJlYWRNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisgICAgdmFyIGNvbXBsZXRlciA9IF9jb21wbGV0ZXJzLnJlbW92ZShtZXNzYWdlLnNlcWlkKTsKKyAgICBpZiAoY29tcGxldGVyICE9IG51bGwpIHsKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZSgpOworICAgIH0KKyAgfQorfQorCisvLy8gW1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRdIGxpc3RlbnMgZm9yIGluY29taW5nIG1lc3NhZ2VzLiAgV2hlbiBpdCBzZW5kcyBhCisvLy8gcmVzcG9uc2UsIGl0IGRvZXMgbm90IGV4cGVjdCBhbiBhY2tub3dsZWRnZW1lbnQuCitjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVFNvY2tldFRyYW5zcG9ydCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXIgX29uSW5jb21pbmdNZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtIGdldCBvbkluY29taW5nTWVzc2FnZSA9PiBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBUU2VydmVyU29ja2V0VHJhbnNwb3J0KFRTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgYXN5bmMgeworICAgIFVpbnQ4TGlzdCBtZXNzYWdlID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgc29ja2V0LnNlbmQobWVzc2FnZSk7CisgIH0KKworICB2b2lkIGhhbmRsZUluY29taW5nTWVzc2FnZShVaW50OExpc3QgbWVzc2FnZUJ5dGVzKSB7CisgICAgc3VwZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlKG1lc3NhZ2VCeXRlcyk7CisKKyAgICBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyLmFkZChudWxsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZDVlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSw3MCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKKyAgLy8vIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgIC8vLyBSZXR1cm5zIFt0cnVlXSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgIGJvb2wgZ2V0IGlzT3BlbjsKKworICAvLy8gT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZSB0cmFuc3BvcnQgY291bGQgbm90IGJlIG9wZW5lZC4KKyAgRnV0dXJlIG9wZW4oKTsKKworICAvLy8gQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgIEZ1dHVyZSBjbG9zZSgpOworCisgIC8vLyBSZWFkcyB1cCB0byBbbGVuZ3RoXSBieXRlcyBpbnRvIFtidWZmZXJdLCBzdGFydGluZyBhdCBbb2Zmc2V0XS4KKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgLy8vIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgW2xlbmd0aF0gYnl0ZXMgYXJlIGFjdHVhbGx5IHJlYWQgb2ZmIHRoZSB0cmFuc3BvcnQuCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0bworICAvLy8gW2xlbmd0aF0uCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICBpbnQgcmVhZEFsbChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaW50IGdvdCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgeworICAgICAgcmV0ID0gcmVhZChidWZmZXIsIG9mZnNldCArIGdvdCwgbGVuZ3RoIC0gZ290KTsKKyAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKAorICAgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLAorICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICRsZW5ndGggIgorICAgICAgICAgICAgImJ5dGVzLCBidXQgb25seSBnb3QgJGdvdCBieXRlcy4iKTsKKyAgICAgIH0KKyAgICAgIGdvdCArPSByZXQ7CisgICAgfQorICAgIHJldHVybiBnb3Q7CisgIH0KKworICAvLy8gV3JpdGVzIHVwIHRvIFtsZW5dIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBkYXRhCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisKKyAgLy8vIFdyaXRlcyB0aGUgW2J5dGVzXSB0byB0aGUgb3V0cHV0LgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgdm9pZCB3cml0ZUFsbChVaW50OExpc3QgYnVmZmVyKSB7CisgICAgd3JpdGUoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKyAgfQorCisgIC8vLyBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIHRyYW5zcG9ydCBidWZmZXIuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgIEZ1dHVyZSBmbHVzaCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MDhlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2Vycm9yLmRhcnQKQEAgLTAsMCArMSwzMSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUVHJhbnNwb3J0RXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBOT1RfT1BFTiA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgQUxSRUFEWV9PUEVOID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBUSU1FRF9PVVQgPSAzOworICBzdGF0aWMgY29uc3QgaW50IEVORF9PRl9GSUxFID0gNDsKK30KKworY2xhc3MgVFRyYW5zcG9ydEVycm9yIGV4dGVuZHMgVEVycm9yIHsKKyAgVFRyYW5zcG9ydEVycm9yKFtpbnQgdHlwZSA9IFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgU3RyaW5nIG1lc3NhZ2UgPSAiIl0pCisgICAgICA6IHN1cGVyKHR5cGUsIG1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTA0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIGEgW1RUcmFuc3BvcnRdLiBUaGlzIGlzCisvLy8gdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycy4KKy8vLworLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworICBGdXR1cmU8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA9PgorICAgICAgbmV3IEZ1dHVyZS52YWx1ZSh0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdC5kYXJ0IGIvbGliL2RhcnQvbGliL3RocmlmdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWJiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQKQEAgLTAsMCArMSw2NCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVXRmOENvZGVjLCBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBCeXRlRGF0YTsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IEVuZGlhbm5lc3M7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpmaXhudW0vZml4bnVtLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IENsaWVudDsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CisKK3BhcnQgJ3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQnOworcGFydCAnc3JjL3RfYmFzZS5kYXJ0JzsKK3BhcnQgJ3NyYy90X2Vycm9yLmRhcnQnOworcGFydCAnc3JjL3RfcHJvY2Vzc29yLmRhcnQnOworCitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfZmllbGQuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbGlzdC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X21hcC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X21lc3NhZ2UuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZGVjb3JhdG9yLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9mYWN0b3J5LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3NldC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3R5cGUuZGFydCc7CisKK3BhcnQgJ3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQnOworcGFydCAnc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQnOworCitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydC5kYXJ0JzsKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi90aHJpZnRfYnJvd3Nlci5kYXJ0IGIvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViYzI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi90aHJpZnRfYnJvd3Nlci5kYXJ0CkBAIC0wLDAgKzEsMjIgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdF9icm93c2VyOworCisvLy8gQ2xhc3NlcyB0aGF0IGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBicm93c2VyIGFwcGxpY2F0aW9ucyBnbyBoZXJlCisKK2V4cG9ydCAnc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQnIHNob3cgVFdlYlNvY2tldDsKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi90aHJpZnRfY29uc29sZS5kYXJ0IGIvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhODNkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi90aHJpZnRfY29uc29sZS5kYXJ0CkBAIC0wLDAgKzEsMjMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdF9jb25zb2xlOworCisvLy8gQ2xhc3NlcyB0aGF0IGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBjb25zb2xlIGFwcGxpY2F0aW9ucyBnbyBoZXJlCisKK2V4cG9ydCAnc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQnIHNob3cgVFRjcFNvY2tldDsKK2V4cG9ydCAnc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQnIHNob3cgVFdlYlNvY2tldDsKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3B1YnNwZWMueWFtbCBiL2xpYi9kYXJ0L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM0YTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsNDMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdGhyaWZ0Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246ID4KKyAgQSBEYXJ0IGxpYnJhcnkgZm9yIEFwYWNoZSBUaHJpZnQKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitkb2N1bWVudGF0aW9uOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBmaXhudW06IF4wLjEwLjIKKyAgaHR0cDogXjAuMTEuMworICBsb2dnaW5nOiBeMC4xMS4wCisKK2Rldl9kZXBlbmRlbmNpZXM6CisgICMgdGVzdAorICBtb2NraXRvOiBeMS4wLjAKKyAgdGVzdDogXjAuMTIuMAorCisgICMgZGFydF9kZXYgLSBodHRwczovL2dpdGh1Yi5jb20vV29ya2l2YS9kYXJ0X2RldgorICBkYXJ0X2RldjogXjEuNS4wCisgIGNvdmVyYWdlOiBeMC43LjMKKyAgZGFydF9zdHlsZTogIj49MC4yLjQgPDAuMy4wIgorICBkYXJ0ZG9jOiBeMC45LjAKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3Byb3RvY29sL3RfcHJvdG9jb2xfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmNkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3Byb3RvY29sL3RfcHJvdG9jb2xfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDA2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X2pzb25fcHJvdG9jb2xfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IFVURjg7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBmaW5hbCBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdteSBtZXNzYWdlJywgVE1lc3NhZ2VUeXBlLk9ORVdBWSwgMTIzKTsKKworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgUHJpbWl0aXZlIGdldFByaW1pdGl2ZShpbnQgdFR5cGUpIHsKKyAgICBzd2l0Y2ggKHRUeXBlKSB7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRCb29sLCBwcm90b2NvbC53cml0ZUJvb2wsIGZhbHNlKTsKKworICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZShwcm90b2NvbC5yZWFkQnl0ZSwgcHJvdG9jb2wud3JpdGVCeXRlLCAwKTsKKworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRJMTYsIHByb3RvY29sLndyaXRlSTE2LCAwKTsKKworICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRJMzIsIHByb3RvY29sLndyaXRlSTMyLCAwKTsKKworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRJNjQsIHByb3RvY29sLndyaXRlSTY0LCAwKTsKKworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWREb3VibGUsIHByb3RvY29sLndyaXRlRG91YmxlLCAwKTsKKworICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRTdHJpbmcsIHByb3RvY29sLndyaXRlU3RyaW5nLCAnJyk7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBUVHlwZSAkdFR5cGUiKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgcHJpbWl0aXZlVGVzdChQcmltaXRpdmUgcHJpbWl0aXZlLCBpbnB1dCkgYXN5bmMgeworICAgIHByaW1pdGl2ZS53cml0ZShpbnB1dCk7CisgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICB2YXIgb3V0cHV0ID0gcHJpbWl0aXZlLnJlYWQoKTsKKworICAgIGV4cGVjdChvdXRwdXQsIGlucHV0KTsKKyAgfQorCisgIEZ1dHVyZSBwcmltaXRpdmVOdWxsVGVzdChQcmltaXRpdmUgcHJpbWl0aXZlKSBhc3luYyB7CisgICAgcHJpbWl0aXZlLndyaXRlKG51bGwpOworICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgdmFyIG91dHB1dCA9IHByaW1pdGl2ZS5yZWFkKCk7CisKKyAgICBleHBlY3Qob3V0cHV0LCBwcmltaXRpdmUuZGVmYXVsdFZhbHVlKTsKKyAgfQorCisgIHZhciBzaGFyZWRUZXN0cyA9ICgpIHsKKyAgICB0ZXN0KCdUZXN0IG1lc3NhZ2UnLCAoKSBhc3luYyB7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHZhciBzdWJqZWN0ID0gcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworCisgICAgICBleHBlY3Qoc3ViamVjdC5uYW1lLCBtZXNzYWdlLm5hbWUpOworICAgICAgZXhwZWN0KHN1YmplY3QudHlwZSwgbWVzc2FnZS50eXBlKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LnNlcWlkLCBtZXNzYWdlLnNlcWlkKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RydWN0JywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRTdHJ1Y3QoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIC8vIG5hbWUgaXMgbm90IHNlcmlhbGl6ZWQsIHNlZSBDIyB2ZXJzaW9uIGZvciByZWZlcmVuY2UKKyAgICAgIGV4cGVjdChvdXRwdXQsIGlzTm90TnVsbCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGZpZWxkJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRGaWVsZCgnbXkgZmllbGQnLCBUVHlwZS5NQVAsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICAvLyBuYW1lIGlzIG5vdCBzZXJpYWxpemVkLCBzZWUgQyMgdmVyc2lvbiBmb3IgcmVmZXJlbmNlCisgICAgICBleHBlY3Qob3V0cHV0LnR5cGUsIGlucHV0LnR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5pZCwgaW5wdXQuaWQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBtYXAnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVE1hcChUVHlwZS5TVFJJTkcsIFRUeXBlLlNUUlVDVCwgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZE1hcEJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQua2V5VHlwZSwgaW5wdXQua2V5VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0LnZhbHVlVHlwZSwgaW5wdXQudmFsdWVUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBsaXN0JywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFRMaXN0KFRUeXBlLlNUUklORywgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQuZWxlbWVudFR5cGUsIGlucHV0LmVsZW1lbnRUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzZXQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVFNldChUVHlwZS5TVFJJTkcsIDEyMyk7CisKKyAgICAgIHByb3RvY29sLndyaXRlU2V0QmVnaW4oaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVTZXRFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5lbGVtZW50VHlwZSwgaW5wdXQuZWxlbWVudFR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJvb2wnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5CT09MKSwgdHJ1ZSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJvb2wgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5CT09MKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJ5dGUnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5CWVRFKSwgNjQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBieXRlIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuQllURSkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMTYnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMTYpLCAzMjc2Nyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkxNiBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkxNikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMzInLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMzIpLCAyMTQ3NDgzNjQ3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTMyIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTMyKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEk2NCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkk2NCksIDkyMjMzNzIwMzY4NTQ3NzU4MDcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJNjQgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JNjQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgZG91YmxlJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuRE9VQkxFKSwgMy4xNDE1OTI2KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgZG91YmxlIG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuRE9VQkxFKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cmluZycsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9ICdUaGVyZSBhcmUgb25seSB0d28gaGFyZCB0aGluZ3MgaW4gY29tcHV0ZXIgc2NpZW5jZTogJworICAgICAgICAgICdjYWNoZSBpbnZhbGlkYXRpb24sIG5hbWluZyB0aGluZ3MsIGFuZCBvZmYtYnktb25lIGVycm9ycy4nOworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuU1RSSU5HKSwgaW5wdXQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJpbmcgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5TVFJJTkcpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYmluYXJ5JywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChuZXcgTGlzdC5maWxsZWQoMTAwLCAxMjMpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVCaW5hcnkoaW5wdXQpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZEJpbmFyeSgpOworCisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICAgIGV4cGVjdChvdXRwdXQuZXZlcnkoKGkpID0+IGkgPT0gMTIzKSwgaXNUcnVlKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY29tcGxleCBzdHJ1Y3QnLCAoKSBhc3luYyB7CisgICAgICAvLyB7MTogezEwOiAyMH0sIDI6IHszMDogNDB9fQorICAgICAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihuZXcgVFN0cnVjdCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRCZWdpbihuZXcgVEZpZWxkKCdzdWNjZXNzJywgVFR5cGUuTUFQLCAwKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuTUFQLCAyKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMigyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC53cml0ZUkzMigyKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZUkzMigzMCk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVJMzIoNDApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBwcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkRmllbGRCZWdpbigpLnR5cGUsIFRUeXBlLk1BUCk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAyKTsKKworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMSk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxMCk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMjApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDMwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCA0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLnJlYWRGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgbmVzdGVkIG1hcHMgYW5kIGxpc3RzJywgKCkgYXN5bmMgeworICAgICAgLy8gezE6IFt7MTA6IDIwfV0sIDI6IFt7MzA6IDQwfV19CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuTElTVCwgMikpOworCisgICAgICBwcm90b2NvbC53cml0ZUkzMigxKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoVFR5cGUuTUFQLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZUkzMigxMCk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMjApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEVuZCgpOworCisgICAgICBwcm90b2NvbC53cml0ZUkzMigyKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoVFR5cGUuTUFQLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKFRUeXBlLkkzMiwgVFR5cGUuSTMyLCAxKSk7CisgICAgICBwcm90b2NvbC53cml0ZUkzMigzMCk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVJMzIoNDApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEVuZCgpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAyKTsKKworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMSk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRMaXN0QmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxMCk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMjApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZExpc3RFbmQoKTsKKworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMik7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRMaXN0QmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRNYXBCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAzMCk7IC8vIGtleQorICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgNDApOyAvLyB2YWx1ZQorICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZExpc3RFbmQoKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9KTsKKyAgfTsKKworICBncm91cCgnSlNPTicsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgZXNjYXBlZCB1bmljb2RlJywgKCkgYXN5bmMgeworICAgICAgLyoKKyAgICAgICAgIEtPUl9LQUkKKyAgICAgICAgICAgVVRGLTg6ICAweEUwIDB4QjggMHg4MQorICAgICAgICAgICBVVEYtMTY6IDB4MEUwMQorICAgICAgICAgRyBjbGVmOgorICAgICAgICAgICBVVEYtODogIDB4RjAgMHg5RCAweDg0IDB4OUUKKyAgICAgICAgICAgVVRGLTE2OiAweEQ4MzQgMHhERDFFCisgICAgICAgKi8KKyAgICAgIHZhciBidWZmZXIgPSBVVEY4LmVuY29kZShyJyJcdTAwMDFcdTBlMDEgXHVkODM0XHVkZDFlIicpOworICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChidWZmZXIpOworCisgICAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgdmFyIHN1YmplY3QgPSBwcm90b2NvbC5yZWFkU3RyaW5nKCk7CisgICAgICBleHBlY3Qoc3ViamVjdCwKKyAgICAgICAgICBVVEY4LmRlY29kZShbMHgwMSwgMHhFMCwgMHhCOCwgMHg4MSwgMHgyMCwgMHhGMCwgMHg5RCwgMHg4NCwgMHg5RV0pKTsKKyAgICB9KTsKKworICAgIGdyb3VwKCdzaGFyZWQgdGVzdHMnLCBzaGFyZWRUZXN0cyk7CisgIH0pOworCisgIGdyb3VwKCdiaW5hcnknLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKSk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICB9KTsKKworICAgIGdyb3VwKCdzaGFyZWQgdGVzdHMnLCBzaGFyZWRUZXN0cyk7CisgIH0pOworCisgIGdyb3VwKCdjb21wYWN0JywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7Cit9CisKK2NsYXNzIFByaW1pdGl2ZSB7CisgIGZpbmFsIEZ1bmN0aW9uIHJlYWQ7CisgIGZpbmFsIEZ1bmN0aW9uIHdyaXRlOworICBmaW5hbCBkZWZhdWx0VmFsdWU7CisKKyAgUHJpbWl0aXZlKHRoaXMucmVhZCwgdGhpcy53cml0ZSwgdGhpcy5kZWZhdWx0VmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzY1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbGlicmFyeSB0aHJpZnQudGVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZXJfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdzZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICB2YXIgc2VyaWFsaXplciA9ICgpIHsKKyAgICBURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplcjsKKyAgICBUU2VyaWFsaXplciBzZXJpYWxpemVyOworICAgIFRlc3RUT2JqZWN0IHRlc3RUT2JqZWN0OworCisgICAgc2V0VXAoKCkgeworICAgICAgc2VyaWFsaXplciA9IG5ldyBUU2VyaWFsaXplcigpOworICAgICAgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKyAgICAgIAorICAgICAgdGVzdFRPYmplY3QgPSBuZXcgVGVzdFRPYmplY3QoKTsKKyAgICAgIHRlc3RUT2JqZWN0LmIgPSB0cnVlOworICAgICAgdGVzdFRPYmplY3QucyA9ICJURVNUIjsKKyAgICAgIHRlc3RUT2JqZWN0LmQgPSAxNS4yNTsKKyAgICAgIHRlc3RUT2JqZWN0LmkgPSAxMDsKKyAgICAgIAorICAgICAgdmFyIHRlc3RMaXN0ID0gbmV3IExpc3Q8U3RyaW5nPigpOworICAgICAgdGVzdExpc3QuYWRkKCJURVNUIDEiKTsKKyAgICAgIHRlc3RMaXN0LmFkZCgiVEVTVCAyIik7CisgICAgICAKKyAgICAgIHRlc3RUT2JqZWN0LmwgPSB0ZXN0TGlzdDsKKyAgICB9KTsKKyAgICAKKyAgICBhc3NlcnROZXdPYmplY3RFcXVhbHNUT2JqZWN0KFRlc3RUT2JqZWN0IG5ld09iamVjdCkgeworICAgICAgZXhwZWN0KG5ld09iamVjdC5sLCBlcXVhbHModGVzdFRPYmplY3QubCkpOworICAgICAgZXhwZWN0KG5ld09iamVjdC5iLCBlcXVhbHModGVzdFRPYmplY3QuYikpOworICAgICAgZXhwZWN0KG5ld09iamVjdC5pLCBlcXVhbHModGVzdFRPYmplY3QuaSkpOworICAgICAgZXhwZWN0KG5ld09iamVjdC5kLCBlcXVhbHModGVzdFRPYmplY3QuZCkpOworICAgICAgZXhwZWN0KG5ld09iamVjdC5zLCBlcXVhbHModGVzdFRPYmplY3QucykpOworICAgIH0KKyAgICAKKyAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKSB7CisgICAgICB2YXIgcyA9IHNlcmlhbGl6ZXIud3JpdGVTdHJpbmcodGVzdFRPYmplY3QpOworCisgICAgICB2YXIgbmV3T2JqZWN0ID0gbmV3IFRlc3RUT2JqZWN0KCk7CisgICAgICBkZXNlcmlhbGl6ZXIucmVhZFN0cmluZyhuZXdPYmplY3QsIHMpOworCisgICAgICBhc3NlcnROZXdPYmplY3RFcXVhbHNUT2JqZWN0KG5ld09iamVjdCk7CisgICAgfTsKKworICAgIHJ1bldyaXRlVGVzdCgpIHsKKyAgICAgIHZhciBzID0gc2VyaWFsaXplci53cml0ZSh0ZXN0VE9iamVjdCk7CisKKyAgICAgIHZhciBuZXdPYmplY3QgPSBuZXcgVGVzdFRPYmplY3QoKTsKKyAgICAgIGRlc2VyaWFsaXplci5yZWFkKG5ld09iamVjdCwgcyk7CisKKyAgICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QobmV3T2JqZWN0KTsKKyAgICB9OworCisgICAgdGVzdCgnSlNPTiBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICAKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnSlNPTiBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdCaW5hcnkgUHJvdG9jb2wgU3RyaW5nJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdCaW5hcnkgUHJvdG9jb2wnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0NvbXBhY3QgUHJvdG9jb2wgU3RyaW5nJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0NvbXBhY3QgUHJvdG9jb2wnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworICB9OworCisgIGdyb3VwKCdTZXJpYWxpemVyJywgc2VyaWFsaXplcik7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydCBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODZmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0X2RhdGEuZGFydApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitsaWJyYXJ5IHRocmlmdC50ZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplcl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIFRlc3RUT2JqZWN0IGlzIGEgc2ltcGxlIHRlc3Qgc3RydWN0CitjbGFzcyBUZXN0VE9iamVjdCBpbXBsZW1lbnRzIFRCYXNlIHsKKyAgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgX1NUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoIlRlc3RUT2JqZWN0Iik7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0lfRklFTERfREVTQyA9IG5ldyBURmllbGQoImkiLCBUVHlwZS5JMzIsIDEpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9EX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJkIiwgVFR5cGUuRE9VQkxFLCAyKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfU19GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgicyIsIFRUeXBlLlNUUklORywgMyk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0xfRklFTERfREVTQyA9IG5ldyBURmllbGQoImwiLCBUVHlwZS5MSVNULCA0KTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfQl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiYiIsIFRUeXBlLkJPT0wsIDUpOworCisgIGludCBfaTsKKyAgc3RhdGljIGNvbnN0IGludCBJID0gMTsKKyAgZG91YmxlIF9kOworICBzdGF0aWMgY29uc3QgaW50IEQgPSAyOworICBTdHJpbmcgX3M7CisgIHN0YXRpYyBjb25zdCBpbnQgUyA9IDM7CisgIExpc3Q8U3RyaW5nPiBfbDsKKyAgc3RhdGljIGNvbnN0IGludCBMID0gNDsKKyAgYm9vbCBfYjsKKyAgc3RhdGljIGNvbnN0IGludCBCID0gNTsKKworICBib29sIF9faXNzZXRfaSA9IGZhbHNlOworICBib29sIF9faXNzZXRfZCA9IGZhbHNlOworICBib29sIF9faXNzZXRfYiA9IGZhbHNlOworCisgIFRlc3RUT2JqZWN0KCkgeworICB9CisKKyAgLy8gaQorICBpbnQgZ2V0IGkgPT4gdGhpcy5faTsKKworICBzZXQgaShpbnQgaSkgeworICAgIHRoaXMuX2kgPSBpOworICAgIHRoaXMuX19pc3NldF9pID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaXNTZXRJKCkgPT4gdGhpcy5fX2lzc2V0X2k7CisKKyAgdW5zZXRJKCkgeworICAgIHRoaXMuX19pc3NldF9pID0gZmFsc2U7CisgIH0KKworICAvLyBkCisgIGRvdWJsZSBnZXQgZCA9PiB0aGlzLl9kOworCisgIHNldCBkKGRvdWJsZSBkKSB7CisgICAgdGhpcy5fZCA9IGQ7CisgICAgdGhpcy5fX2lzc2V0X2QgPSB0cnVlOworICB9CisKKyAgYm9vbCBpc1NldEQoKSA9PiB0aGlzLl9faXNzZXRfZDsKKworICB1bnNldEQoKSB7CisgICAgdGhpcy5fX2lzc2V0X2QgPSBmYWxzZTsKKyAgfQorCisgIC8vIHMKKyAgU3RyaW5nIGdldCBzID0+IHRoaXMuX3M7CisKKyAgc2V0IHMoU3RyaW5nIHMpIHsKKyAgICB0aGlzLl9zID0gczsKKyAgfQorCisgIGJvb2wgaXNTZXRTKCkgPT4gdGhpcy5zICE9IG51bGw7CisKKyAgdW5zZXRTKCkgeworICAgIHRoaXMucyA9IG51bGw7CisgIH0KKworICAvLyBsCisgIExpc3Q8U3RyaW5nPiBnZXQgbCA9PiB0aGlzLl9sOworCisgIHNldCBsKExpc3Q8U3RyaW5nPiBsKSB7CisgICAgdGhpcy5fbCA9IGw7CisgIH0KKworICBib29sIGlzU2V0TCgpID0+IHRoaXMubCAhPSBudWxsOworCisgIHVuc2V0TCgpIHsKKyAgICB0aGlzLmwgPSBudWxsOworICB9CisKKyAgLy8gYgorICBib29sIGdldCBiID0+IHRoaXMuX2I7CisKKyAgc2V0IGIoYm9vbCBiKSB7CisgICAgdGhpcy5fYiA9IGI7CisgICAgdGhpcy5fX2lzc2V0X2IgPSB0cnVlOworICB9CisKKyAgYm9vbCBpc1NldEIoKSA9PiB0aGlzLl9faXNzZXRfYjsKKworICB1bnNldEIoKSB7CisgICAgdGhpcy5fX2lzc2V0X2IgPSBmYWxzZTsKKyAgfQorCisgIGdldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgcmV0dXJuIHRoaXMuaTsKKyAgICAgIGNhc2UgRDoKKyAgICAgICAgcmV0dXJuIHRoaXMuZDsKKyAgICAgIGNhc2UgUzoKKyAgICAgICAgcmV0dXJuIHRoaXMuczsKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgcmV0dXJuIHRoaXMubDsKKyAgICAgIGNhc2UgQjoKKyAgICAgICAgcmV0dXJuIHRoaXMuYjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIHNldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0SSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuaSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEQ6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXREKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5kID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUzoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldFMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnMgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBMOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0TCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMubCA9IHZhbHVlIGFzIExpc3Q8U3RyaW5nPjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBCOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0QigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuYiA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZQorICBib29sIGlzU2V0KGludCBmaWVsZElEKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIHJldHVybiBpc1NldEkoKTsKKyAgICAgIGNhc2UgRDoKKyAgICAgICAgcmV0dXJuIGlzU2V0RCgpOworICAgICAgY2FzZSBTOgorICAgICAgICByZXR1cm4gaXNTZXRTKCk7CisgICAgICBjYXNlIEw6CisgICAgICAgIHJldHVybiBpc1NldEwoKTsKKyAgICAgIGNhc2UgQjoKKyAgICAgICAgcmV0dXJuIGlzU2V0QigpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgcmVhZChUUHJvdG9jb2wgaXByb3QpIHsKKyAgICBURmllbGQgZmllbGQ7CisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgIGNhc2UgSToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgIHRoaXMuaSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgIHRoaXMuX19pc3NldF9pID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRDoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgIHRoaXMuZCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgIHRoaXMuX19pc3NldF9kID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUzoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIHRoaXMucyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTDoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5MSVNUKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFRMaXN0IF9saXN0NzQgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgIHRoaXMubCA9IG5ldyBMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgX2k3NSA9IDA7IF9pNzUgPCBfbGlzdDc0Lmxlbmd0aDsgKytfaTc1KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9lbGVtNzY7CisgICAgICAgICAgICAgICAgX2VsZW03NiA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmwuYWRkKF9lbGVtNzYpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEI6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkgeworICAgICAgICAgICAgdGhpcy5iID0gaXByb3QucmVhZEJvb2woKTsKKyAgICAgICAgICAgIHRoaXMuX19pc3NldF9iID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSBjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QKKyAgICB2YWxpZGF0ZSgpOworICB9CisKKyAgd3JpdGUoVFByb3RvY29sIG9wcm90KSB7CisgICAgdmFsaWRhdGUoKTsKKworICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oX1NUUlVDVF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0lfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVJMzIodGhpcy5pKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9EX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlRG91YmxlKHRoaXMuZCk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIGlmICh0aGlzLnMgIT0gbnVsbCkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9TX0ZJRUxEX0RFU0MpOworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcodGhpcy5zKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisgICAgaWYgKHRoaXMubCAhPSBudWxsKSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0xfRklFTERfREVTQyk7CisgICAgICB7CisgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5TVFJJTkcsIHRoaXMubC5sZW5ndGgpKTsKKyAgICAgICAgZm9yICh2YXIgZWxlbTc3IGluIHRoaXMubCkgeworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGVsZW03Nyk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfQl9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZUJvb2wodGhpcy5iKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICB9CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCJUZXN0VE9iamVjdCgiKTsKKworICAgIHJldC53cml0ZSgiaToiKTsKKyAgICByZXQud3JpdGUodGhpcy5pKTsKKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoImQ6Iik7CisgICAgcmV0LndyaXRlKHRoaXMuZCk7CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJzOiIpOworICAgIGlmICh0aGlzLnMgPT0gbnVsbCkgeworICAgICAgcmV0LndyaXRlKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldC53cml0ZSh0aGlzLnMpOworICAgIH0KKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoImw6Iik7CisgICAgaWYgKHRoaXMubCA9PSBudWxsKSB7CisgICAgICByZXQud3JpdGUoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0LndyaXRlKHRoaXMubCk7CisgICAgfQorCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiYjoiKTsKKyAgICByZXQud3JpdGUodGhpcy5iKTsKKworICAgIHJldC53cml0ZSgiKSIpOworCisgICAgcmV0dXJuIHJldC50b1N0cmluZygpOworICB9CisKKyAgdmFsaWRhdGUoKSB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RfYXBwbGljYXRpb25fZXJyb3JfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMWQ4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RfYXBwbGljYXRpb25fZXJyb3JfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsNDYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgVFByb3RvY29sIHByb3RvY29sOworCisgIHNldFVwKCgpIHsKKyAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgfSk7CisKKyAgdGVzdCgnV3JpdGUgYW5kIHJlYWQgYW4gYXBwbGljYXRpb24gZXJyb3InLCAoKSB7CisgICAgdmFyIGV4cGVjdGVkVHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVHlwZS5JTlRFUk5BTF9FUlJPUjsKKyAgICB2YXIgZXhwZWN0ZWRNZXNzYWdlID0gJ3Rlc3QgZXJyb3IgbWVzc2FnZSc7CisKKyAgICBUQXBwbGljYXRpb25FcnJvciBlcnJvciA9CisgICAgICAgIG5ldyBUQXBwbGljYXRpb25FcnJvcihleHBlY3RlZFR5cGUsIGV4cGVjdGVkTWVzc2FnZSk7CisgICAgZXJyb3Iud3JpdGUocHJvdG9jb2wpOworCisgICAgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBUQXBwbGljYXRpb25FcnJvciBzdWJqZWN0ID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChwcm90b2NvbCk7CisKKyAgICBleHBlY3Qoc3ViamVjdCwgaXNOb3ROdWxsKTsKKyAgICBleHBlY3Qoc3ViamVjdC50eXBlLCBleHBlY3RlZFR5cGUpOworICAgIGV4cGVjdChzdWJqZWN0Lm1lc3NhZ2UsIGV4cGVjdGVkTWVzc2FnZSk7CisgIH0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3MmU2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNzUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfZnJhbWVkX3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgZ3JvdXAoJ1RGcmFtZWRUcmFuc3BvcnQgcGFydGlhbCByZWFkcycsICgpIHsKKyAgICBmaW5hbCBmbHVzaEF3YWl0RHVyYXRpb24gPSBuZXcgRHVyYXRpb24oc2Vjb25kczogMTApOworCisgICAgRmFrZVJlYWRPbmx5U29ja2V0IHNvY2tldDsKKyAgICBUU29ja2V0VHJhbnNwb3J0IHNvY2tldFRyYW5zcG9ydDsKKyAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICB2YXIgbWVzc2FnZUF2YWlsYWJsZTsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlUmVhZE9ubHlTb2NrZXQoKTsKKyAgICAgIHNvY2tldFRyYW5zcG9ydCA9IG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXRUcmFuc3BvcnQpOworICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IGZhbHNlOworICAgIH0pOworCisgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCkgeworICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEyOCk7CisgICAgICB2YXIgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDApOworICAgICAgZXhwZWN0KG1lc3NhZ2VBdmFpbGFibGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCByZWFkcyBtZXNzYWdlcyB3aGVyZSBoZWFkZXIgYW5kIGJvZHkgYXJlIHNlbnQgc2VwYXJhdGVseScsICgpIGFzeW5jIHsKKyAgICAgIC8vIGJ1ZmZlciBpbnRvIHdoaWNoIHdlJ2xsIHJlYWQKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisgICAgICB2YXIgcmVhZEJ5dGVzOworCisgICAgICAvLyByZWdpc3RlcnMgZm9yIHJlYWRhYmxlIGJ5dGVzCisgICAgICB2YXIgZmx1c2hGdXR1cmUgPSB0cmFuc3BvcnQuZmx1c2goKS50aW1lb3V0KGZsdXNoQXdhaXREdXJhdGlvbik7CisgICAgICBmbHVzaEZ1dHVyZS50aGVuKChfKSB7CisgICAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSB0cnVlOworICAgICAgfSk7CisKKyAgICAgIC8vIHdyaXRlIGhlYWRlciBieXRlcworICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFsweDAwLCAweDAwLCAweDAwLCAweDA2XSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgaGVhZGVyIGhhcyBiZWVuIGNvbnN1bWVkIGludGVybmFsbHkKKyAgICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBmaXJzdCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoIkhlIikpKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCwKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGZyYW1lIGhhcyBiZWVuIGNvbnN1bWVkIGludGVybmFsbHkKKyAgICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBzZWNvbmQgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFVURjguZW5jb2RlKCJsbG8hIikpKTsKKworICAgICAgLy8gaGF2ZSB0byB3YWl0IGZvciB0aGUgZmx1c2ggdG8gY29tcGxldGUsCisgICAgICAvLyBiZWNhdXNlIGl0J3Mgb25seSB0aGVuIHRoYXQgdGhlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworICAgICAgYXdhaXQgZmx1c2hGdXR1cmU7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgdHJ1ZSk7CisKKyAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzIGNvbXBsZXRlLCBzbyB3ZSBleHBlY3QgdGhlIHJlYWQgdG8gY29tcGxldGUKKyAgICAgIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCA2KTsKKyAgICAgIGV4cGVjdChyZWFkQnVmZmVyLnN1Ymxpc3QoMCwgNiksIFVURjguZW5jb2RlKCJIZWxsbyEiKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCByZWFkcyBtZXNzYWdlcyB3aGVyZSBoZWFkZXIgaXMgc2VudCBpbiBwaWVjZXMgJworICAgICAgICAgJ2FuZCBib2R5IGlzIGFsc28gc2VudCBpbiBwaWVjZXMnLCAoKSBhc3luYyB7CisgICAgICAvLyBidWZmZXIgaW50byB3aGljaCB3ZSdsbCByZWFkCisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTApOworICAgICAgdmFyIHJlYWRCeXRlczsKKworICAgICAgLy8gcmVnaXN0ZXJzIGZvciByZWFkYWJsZSBieXRlcworICAgICAgdmFyIGZsdXNoRnV0dXJlID0gdHJhbnNwb3J0LmZsdXNoKCkudGltZW91dChmbHVzaEF3YWl0RHVyYXRpb24pOworICAgICAgZmx1c2hGdXR1cmUudGhlbigoXykgeworICAgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIH0pOworCisgICAgICAvLyB3cml0ZSBmaXJzdCBwYXJ0IG9mIGhlYWRlciBieXRlcworICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFsweDAwLCAweDAwXSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkCisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIHBhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDNdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQgYWdhaW4KKyAgICAgIC8vIGJlY2F1c2Ugb25seSB0aGUgaGVhZGVyIHdhcyByZWFkLCBhbmQgdGhlcmUncyBubyBmcmFtZSBib2R5CisgICAgICByZWFkQnl0ZXMgPSBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFVURjguZW5jb2RlKCJIIikpKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCwKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGZyYW1lIGhhcyBiZWVuIGNvbnN1bWVkIGludGVybmFsbHkKKyAgICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBzZWNvbmQgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFVURjguZW5jb2RlKCJpISIpKSk7CisKKyAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhlIGZsdXNoIHRvIGNvbXBsZXRlLAorICAgICAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdGhlbiB0aGF0IHRoZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKyAgICAgIGF3YWl0IGZsdXNoRnV0dXJlOworICAgICAgZXhwZWN0KG1lc3NhZ2VBdmFpbGFibGUsIHRydWUpOworCisgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyBjb21wbGV0ZSwgc28gd2UgZXhwZWN0IHRoZSByZWFkIHRvIGNvbXBsZXRlCisgICAgICByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgMyk7CisgICAgICBleHBlY3QocmVhZEJ1ZmZlci5zdWJsaXN0KDAsIDMpLCBVVEY4LmVuY29kZSgiSGkhIikpOworICAgIH0pOworICB9KTsKK30KKworCisKK2NsYXNzIEZha2VSZWFkT25seVNvY2tldCBleHRlbmRzIFRTb2NrZXQgeworCisgIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBtZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4oc3luYzogdHJ1ZSk7CisgIFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PiBlcnJvckNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+KCk7CisgIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBzdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+KCk7CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZSBjbG9zZSgpIHsKKyAgICAvLyBub29wCisgIH0KKworICBAb3ZlcnJpZGUKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gZmFsc2U7CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiB0cnVlOworCisgIEBvdmVycmlkZQorICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBlcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBTdHJlYW08VWludDhMaXN0PiBnZXQgb25NZXNzYWdlID0+IG1lc3NhZ2VDb250cm9sbGVyLnN0cmVhbTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gc3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBAb3ZlcnJpZGUKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgLy8gbm9vcAorICB9CisKKyAgQG92ZXJyaWRlCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIC8vIG5vb3AKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0X3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjNkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDE2NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBFbmNvZGluZzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IFV0ZjhDb2RlYywgQkFTRTY0OworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OworCitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgQmFzZVJlcXVlc3Q7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgQ2xpZW50OworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IFJlc3BvbnNlOworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBzaG93IFN0cmVhbWVkUmVzcG9uc2U7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgY29uc3QgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgZ3JvdXAoJ1RIdHRwQ2xpZW50VHJhbnNwb3J0JywgKCkgeworICAgIEZha2VIdHRwQ2xpZW50IGNsaWVudDsKKyAgICBUSHR0cENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBjbGllbnQgPSBuZXcgRmFrZUh0dHBDbGllbnQoc3luYzogZmFsc2UpOworICAgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyhVcmkucGFyc2UoJ2h0dHA6Ly9sb2NhbGhvc3QnKSwge30pOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGNsaWVudCwgY29uZmlnKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHNlbmRzIGJvZHknLCAoKSBhc3luYyB7CisgICAgICB2YXIgZXhwZWN0ZWRUZXh0ID0gJ215IHJlcXVlc3QnOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoZXhwZWN0ZWRUZXh0KSk7CisKKyAgICAgIGV4cGVjdChjbGllbnQucG9zdFJlcXVlc3QsIGlzRW1wdHkpOworCisgICAgICBhd2FpdCB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgZXhwZWN0KGNsaWVudC5wb3N0UmVxdWVzdCwgaXNOb3RFbXB0eSk7CisKKyAgICAgIHZhciByZXF1ZXN0VGV4dCA9CisgICAgICAgICAgdXRmOENvZGVjLmRlY29kZShCQVNFNjQuZGVjb2RlKGNsaWVudC5wb3N0UmVxdWVzdCkpOworICAgICAgZXhwZWN0KHJlcXVlc3RUZXh0LCBleHBlY3RlZFRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVjZWl2ZXMgcmVzcG9uc2UnLCAoKSBhc3luYyB7CisgICAgICB2YXIgZXhwZWN0ZWRUZXh0ID0gJ215IHJlc3BvbnNlJzsKKyAgICAgIHZhciBleHBlY3RlZEJ5dGVzID0gdXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpOworICAgICAgY2xpZW50LnBvc3RSZXNwb25zZSA9IEJBU0U2NC5lbmNvZGUoZXhwZWN0ZWRCeXRlcyk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKCdteSByZXF1ZXN0JykpOworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNGYWxzZSk7CisKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc1RydWUpOworCisgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgZXhwZWN0ZWRUZXh0KTsKKyAgICB9KTsKKyAgfSk7CisKKyAgZ3JvdXAoJ1RIdHRwQ2xpZW50VHJhbnNwb3J0IHdpdGggbXVsdGlwbGUgbWVzc2FnZXMnLCAoKSB7CisgICAgRmFrZUh0dHBDbGllbnQgY2xpZW50OworICAgIFRIdHRwQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIGNsaWVudCA9IG5ldyBGYWtlSHR0cENsaWVudChzeW5jOiB0cnVlKTsKKyAgICAgIHZhciBjb25maWcgPSBuZXcgVEh0dHBDb25maWcoVXJpLnBhcnNlKCdodHRwOi8vbG9jYWxob3N0JyksIHt9KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChjbGllbnQsIGNvbmZpZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHJlYWQgY29ycmVjdCBidWZmZXIgYWZ0ZXIgZmx1c2gnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAncmVzcG9uc2UgMSc7CisgICAgICB2YXIgZXhwZWN0ZWRCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoZXhwZWN0ZWRUZXh0KTsKKworICAgICAgLy8gcHJlcGFyZSBhIHJlc3BvbnNlCisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZSgncmVxdWVzdCAxJykpOworICAgICAgY2xpZW50LnBvc3RSZXNwb25zZSA9IEJBU0U2NC5lbmNvZGUoZXhwZWN0ZWRCeXRlcyk7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHByZXBhcmUgYSBzZWNvbmQgcmVzcG9uc2UKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKCdyZXF1ZXN0IDInKSk7CisgICAgICB2YXIgcmVzcG9uc2UyQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKCdyZXNwb25zZSAyJyk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShyZXNwb25zZTJCeXRlcyk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCBleHBlY3RlZFRleHQpOworICAgIH0pOworICB9KTsKK30KKworY2xhc3MgRmFrZUh0dHBDbGllbnQgaW1wbGVtZW50cyBDbGllbnQgeworICBTdHJpbmcgcG9zdFJlc3BvbnNlID0gJyc7CisgIFN0cmluZyBwb3N0UmVxdWVzdCA9ICcnOworCisgIGZpbmFsIGJvb2wgc3luYzsKKworICBGYWtlSHR0cENsaWVudCh7dGhpcy5zeW5jOiBmYWxzZX0pOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcG9zdCh1cmwsCisgICAgICB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBib2R5LCBFbmNvZGluZyBlbmNvZGluZ30pIHsKKyAgICBwb3N0UmVxdWVzdCA9IGJvZHk7CisgICAgdmFyIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHBvc3RSZXNwb25zZSwgMjAwKTsKKworICAgIGlmIChzeW5jKSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS5zeW5jKCgpID0+IHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBGdXR1cmUudmFsdWUocmVzcG9uc2UpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZTxSZXNwb25zZT4gaGVhZCh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gZ2V0KHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwdXQodXJsLAorICAgICAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHBhdGNoKHVybCwKKyAgICAgICAgICB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBib2R5LCBFbmNvZGluZyBlbmNvZGluZ30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBkZWxldGUodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8U3RyaW5nPiByZWFkKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFVpbnQ4TGlzdD4gcmVhZEJ5dGVzKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFN0cmVhbWVkUmVzcG9uc2U+IHNlbmQoQmFzZVJlcXVlc3QgcmVxdWVzdCkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICB2b2lkIGNsb3NlKCkgPT4gdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5YWIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3Rfc29ja2V0X3RyYW5zcG9ydF90ZXN0LmRhcnQKQEAgLTAsMCArMSwzMTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfc29ja2V0X3RyYW5zcG9ydF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVXRmOENvZGVjLCBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTptb2NraXRvL21vY2tpdG8uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKK3ZvaWQgbWFpbigpIHsKKyAgY29uc3QgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisKKyAgZmluYWwgcmVxdWVzdFRleHQgPSAnbXkgdGVzdCByZXF1ZXN0JzsKKyAgZmluYWwgcmVxdWVzdEJ5dGVzID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlcXVlc3RUZXh0KSk7CisgIGZpbmFsIHJlcXVlc3RCYXNlNjQgPSBCQVNFNjQuZW5jb2RlKHJlcXVlc3RCeXRlcyk7CisKKyAgZmluYWwgcmVzcG9uc2VUZXh0ID0gJ3Jlc3BvbnNlIDEnOworICBmaW5hbCByZXNwb25zZUJ5dGVzID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCh1dGY4Q29kZWMuZW5jb2RlKHJlc3BvbnNlVGV4dCkpOworICBmaW5hbCByZXNwb25zZUJhc2U2NCA9IEJBU0U2NC5lbmNvZGUocmVzcG9uc2VCeXRlcyk7CisKKyAgZmluYWwgZnJhbWVkUmVzcG9uc2VCYXNlNjQgPQorICAgICAgQkFTRTY0LmVuY29kZShfZ2V0RnJhbWVkUmVzcG9uc2UocmVzcG9uc2VCeXRlcykpOworCisgIGdyb3VwKCdUQ2xpZW50U29ja2V0VHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogZmFsc2UpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCBpc051bGwpOworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICAvLyBhbGxvdyBtaWNyb3Rhc2sgZXZlbnRzIHRvIGZpbmlzaAorICAgICAgYXdhaXQgbmV3IEZ1dHVyZS52YWx1ZSgpOworCisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCBpc05vdE51bGwpOworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgcmVxdWVzdEJ5dGVzKTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShyZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHZhciBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworCisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RDbGllbnRTb2NrZXRUcmFuc3BvcnQgd2l0aCBGcmFtZWRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiB0cnVlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KHNvY2tldCkpOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBjbGllbnQgc2VuZGluZyBkYXRhIG92ZXIgZnJhbWVkIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKGZyYW1lZFJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0JywgKCkgeworICAgIEZha2VTb2NrZXQgc29ja2V0OworICAgIEZha2VQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgYXN5bmMgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VTb2NrZXQoc3luYzogdHJ1ZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgRmFrZVByb3RvY29sRmFjdG9yeSgpOworICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5DQUxMLCAxMjMpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICBzb2NrZXQsIG5ldyBUTWVzc2FnZVJlYWRlcihwcm90b2NvbEZhY3RvcnkpLAorICAgICAgICAgIHJlc3BvbnNlVGltZW91dDogRHVyYXRpb24uWkVSTyk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHJlc3BvbnNlIGNvcnJlbGF0ZXMgdG8gY29ycmVjdCByZXF1ZXN0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuUkVQTFksIDEyMyk7CisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSBzZWNvbmQgcmVzcG9uc2UKKyAgICAgIHZhciByZXNwb25zZTJUZXh0ID0gJ3Jlc3BvbnNlIDInOworICAgICAgdmFyIHJlc3BvbnNlMkJ5dGVzID0KKyAgICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVzcG9uc2UyVGV4dCkpOworICAgICAgdmFyIHJlc3BvbnNlMkJhc2U2NCA9IEJBU0U2NC5lbmNvZGUocmVzcG9uc2UyQnl0ZXMpOworICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbzInLCBUTWVzc2FnZVR5cGUuUkVQTFksIDEyNCk7CisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlc3BvbnNlMkJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVzcG9uc2UgdGltZW91dCcsICgpIGFzeW5jIHsKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICBleHBlY3QocmVzcG9uc2VSZWFkeSwgdGhyb3dzQShuZXcgaXNJbnN0YW5jZU9mPFRpbWVvdXRFeGNlcHRpb24+KCkpKTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCB3aXRoIFRGcmFtZWRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgRmFrZVByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiB0cnVlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBGYWtlUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDEyMyk7CisgICAgICB2YXIgbWVzc2FnZVJlYWRlciA9IG5ldyBUTWVzc2FnZVJlYWRlcihwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgYnl0ZU9mZnNldDogVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJCeXRlQ291bnQpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydChuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgIHNvY2tldCwgbWVzc2FnZVJlYWRlciwKKyAgICAgICAgICByZXNwb25zZVRpbWVvdXQ6IER1cmF0aW9uLlpFUk8pKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYXN5bmMgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIGZyYW1lZCB0cmFuc3BvcnQnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTIzKTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UoZnJhbWVkUmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUU2VydmVyVHJhbnNwb3J0JywgKCkgeworICAgIHRlc3QoJ1Rlc3Qgc2VydmVyIHRyYW5zcG9ydCBsaXN0ZW5zIHRvIHNvY2tldCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldCgpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuaXNPcGVuLCBpc1RydWUpOworCisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzRmFsc2UpOworCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlcXVlc3RCYXNlNjQpOworCisgICAgICAvLyBhbGxvdyBtaWNyb3Rhc2sgZXZlbnRzIHRvIGZpbmlzaAorICAgICAgYXdhaXQgbmV3IEZ1dHVyZS52YWx1ZSgpOworCisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc1RydWUpOworCisgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXF1ZXN0Qnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVxdWVzdEJ5dGVzLmxlbmd0aCk7CisKKyAgICAgIHZhciBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlcXVlc3RUZXh0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc2VydmVyIHNlbmRpbmcgZGF0YSBvdmVyIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldCgpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXNwb25zZUJ5dGVzKTsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTnVsbCk7CisKKyAgICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICAvLyBhbGxvdyBtaWNyb3Rhc2sgZXZlbnRzIHRvIGZpbmlzaAorICAgICAgYXdhaXQgbmV3IEZ1dHVyZS52YWx1ZSgpOworCisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCBpc05vdE51bGwpOworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgcmVzcG9uc2VCeXRlcyk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworfQorCitjbGFzcyBGYWtlU29ja2V0IGV4dGVuZHMgVFNvY2tldCB7CisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEZha2VTb2NrZXQoe2Jvb2wgc3luYzogZmFsc2V9KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogc3luYyksCisgICAgICAgIF9vbkVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKSwKKyAgICAgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3Qoc3luYzogc3luYyk7CisKKyAgYm9vbCBfaXNPcGVuOworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfaXNPcGVuOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+ICFpc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSBhc3luYyB7CisgICAgX2lzT3BlbiA9IHRydWU7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX2lzT3BlbiA9IGZhbHNlOworICAgIF9vblN0YXRlQ29udHJvbGxlci5hZGQoVFNvY2tldFN0YXRlLkNMT1NFRCk7CisgIH0KKworICBVaW50OExpc3QgX3NlbmRQYXlsb2FkOworICBVaW50OExpc3QgZ2V0IHNlbmRQYXlsb2FkID0+IF9zZW5kUGF5bG9hZDsKKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICBpZiAoIWlzT3BlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1RoZSBzb2NrZXQgaXMgbm90IG9wZW4nKTsKKworICAgIF9zZW5kUGF5bG9hZCA9IGRhdGE7CisgIH0KKworICB2b2lkIHJlY2VpdmVGYWtlTWVzc2FnZShTdHJpbmcgYmFzZTY0KSB7CisgICAgaWYgKCFpc09wZW4pIHRocm93IG5ldyBTdGF0ZUVycm9yKCdUaGUgc29ja2V0IGlzIG5vdCBvcGVuJyk7CisKKyAgICB2YXIgbWVzc2FnZSA9CisgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShiYXNlNjQpKTsKKyAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQobWVzc2FnZSk7CisgIH0KK30KKworY2xhc3MgRmFrZVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworICBGYWtlUHJvdG9jb2xGYWN0b3J5KCk7CisKKyAgVE1lc3NhZ2UgbWVzc2FnZTsKKworICBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgPT4gbmV3IEZha2VQcm90b2NvbChtZXNzYWdlKTsKK30KKworY2xhc3MgRmFrZVByb3RvY29sIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisgIEZha2VQcm90b2NvbCh0aGlzLl9tZXNzYWdlKTsKKworICBUTWVzc2FnZSBfbWVzc2FnZTsKKworICByZWFkTWVzc2FnZUJlZ2luKCkgPT4gX21lc3NhZ2U7Cit9CisKK1VpbnQ4TGlzdCBfZ2V0RnJhbWVkUmVzcG9uc2UoVWludDhMaXN0IHJlc3BvbnNlQnl0ZXMpIHsKKyAgdmFyIGJ5dGVPZmZzZXQgPSBURnJhbWVkVHJhbnNwb3J0LmhlYWRlckJ5dGVDb3VudDsKKyAgdmFyIHJlc3BvbnNlID0gbmV3IFVpbnQ4TGlzdChieXRlT2Zmc2V0ICsgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworCisgIHJlc3BvbnNlLmJ1ZmZlci5hc0J5dGVEYXRhKCkuc2V0SW50MzIoMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICByZXNwb25zZS5zZXRBbGwoYnl0ZU9mZnNldCwgcmVzcG9uc2VCeXRlcyk7CisKKyAgcmV0dXJuIHJlc3BvbnNlOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjM4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQKQEAgLTAsMCArMSw0MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKworLy8vIENvbW1vbiB0cmFuc3BvcnQgdGVzdHMKK3ZvaWQgbWFpbigpIHsKKyAgZ3JvdXAoJ1RUcmFuc3BvcnRGYWN0b3J5JywgKCkgeworICAgIHRlc3QoJ3RyYW5zcG9ydCBpcyByZXR1cm5lZCBmcm9tIGJhc2UgZmFjdG9yeScsICgpIGFzeW5jIHsKKyAgICAgIFRUcmFuc3BvcnQgcmVzdWx0OworICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworCisgICAgICByZXN1bHQgPSBhd2FpdCBmYWN0b3J5LmdldFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgZXhwZWN0KHJlc3VsdCwgaXNOdWxsKTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgICAgcmVzdWx0ID0gYXdhaXQgZmFjdG9yeS5nZXRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKworICAgICAgZXhwZWN0KHJlc3VsdCwgdHJhbnNwb3J0KTsKKyAgICB9KTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90b29sL2Rldi5kYXJ0IGIvbGliL2RhcnQvdG9vbC9kZXYuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y4YjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdG9vbC9kZXYuZGFydApAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRvb2wuZGV2OworCitpbXBvcnQgJ3BhY2thZ2U6ZGFydF9kZXYvZGFydF9kZXYuZGFydCcgc2hvdyBkZXYsIGNvbmZpZzsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgeworICAvLyBodHRwczovL2dpdGh1Yi5jb20vV29ya2l2YS9kYXJ0X2RldgorCisgIHZhciBkaXJlY3RvcmllcyA9IFsnbGliLycsICd0ZXN0LycsICd0b29sLyddOworICBjb25maWcuYW5hbHl6ZS5lbnRyeVBvaW50cyA9IGRpcmVjdG9yaWVzOworICBjb25maWcuZm9ybWF0LmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXM7CisgIGNvbmZpZy5jb3B5TGljZW5zZQorICAgIC4ubGljZW5zZVBhdGggPSAnTElDRU5TRV9IRUFERVInCisgICAgLi5kaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzOworCisgIGF3YWl0IGRldihhcmdzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvRGVscGhpVGhyaWZ0Lmdyb3VwcHJvaiBiL2xpYi9kZWxwaGkvRGVscGhpVGhyaWZ0Lmdyb3VwcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTcyZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qCkBAIC0wLDAgKzEsMTU2IEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPns2QkQzMjdBNS03Njg4LTQyNjMtQjZBOC1CMTUyMDdDRjRFQzV9PC9Qcm9qZWN0R3VpZD4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcY2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxzZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJPC9JdGVtR3JvdXA+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlZmF1bHQuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlZmF1bHQuUGVyc29uYWxpdHkvPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwkJPFRhcmdldCBOYW1lPSJjbGllbnQiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9ImNsaWVudDpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9ImNsaWVudDpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJzZXJ2ZXIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNlcnZlcjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNlcnZlcjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9DbGllbnQiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X0NsaWVudDpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X0NsaWVudDpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJNdWx0aXBsZXhfVGVzdF9TZXJ2ZXIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X1NlcnZlcjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X1NlcnZlcjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0U2VyaWFsaXplciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RTZXJpYWxpemVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RTZXJpYWxpemVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24xOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24xOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJza2lwdGVzdF92ZXJzaW9uMiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24yOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24yOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJUZXN0VHlwZVJlZ2lzdHJ5Ij4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RUeXBlUmVnaXN0cnk6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RUeXBlUmVnaXN0cnk6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXIiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlcjpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlcjpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudDpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudDpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJSZXNlcnZlZEtleXdvcmRzIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iUmVzZXJ2ZWRLZXl3b3JkczpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJSZXNlcnZlZEtleXdvcmRzOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJCdWlsZCI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ7c2VydmVyO011bHRpcGxleF9UZXN0X0NsaWVudDtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI7VGVzdFNlcmlhbGl6ZXI7c2tpcHRlc3RfdmVyc2lvbjE7c2tpcHRlc3RfdmVyc2lvbjI7VGVzdFR5cGVSZWdpc3RyeTtEZWxwaGlTZXJ2ZXI7RGVscGhpQ2xpZW50O1Jlc2VydmVkS2V5d29yZHMiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iQ2xlYW4iPgorCQkJPENhbGxUYXJnZXQgVGFyZ2V0cz0iY2xpZW50OkNsZWFuO3NlcnZlcjpDbGVhbjtNdWx0aXBsZXhfVGVzdF9DbGllbnQ6Q2xlYW47TXVsdGlwbGV4X1Rlc3RfU2VydmVyOkNsZWFuO1Rlc3RTZXJpYWxpemVyOkNsZWFuO3NraXB0ZXN0X3ZlcnNpb24xOkNsZWFuO3NraXB0ZXN0X3ZlcnNpb24yOkNsZWFuO1Rlc3RUeXBlUmVnaXN0cnk6Q2xlYW47RGVscGhpU2VydmVyOkNsZWFuO0RlbHBoaUNsaWVudDpDbGVhbjtSZXNlcnZlZEtleXdvcmRzOkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik1ha2UiPgorCQkJPENhbGxUYXJnZXQgVGFyZ2V0cz0iY2xpZW50Ok1ha2U7c2VydmVyOk1ha2U7TXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ok1ha2U7TXVsdGlwbGV4X1Rlc3RfU2VydmVyOk1ha2U7VGVzdFNlcmlhbGl6ZXI6TWFrZTtza2lwdGVzdF92ZXJzaW9uMTpNYWtlO3NraXB0ZXN0X3ZlcnNpb24yOk1ha2U7VGVzdFR5cGVSZWdpc3RyeTpNYWtlO0RlbHBoaVNlcnZlcjpNYWtlO0RlbHBoaUNsaWVudDpNYWtlO1Jlc2VydmVkS2V5d29yZHM6TWFrZSIvPgorCQk8L1RhcmdldD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuR3JvdXAuVGFyZ2V0cyIvPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvUkVBRE1FLm1kIGIvbGliL2RlbHBoaS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3OTlkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzAgQEAKK1RocmlmdCBEZWxwaGkgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBEZWxwaGkKKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBUaHJpZnQgRGVscGhpIExpYnJhcnkgcmVxdWlyZXMgYXQgbGVhc3QgRGVscGhpIDIwMTAuCisKK0JlY2F1c2UgdGhlIExpYnJhcnkgaGVhdmlseSByZWxpZXMgb24gZ2VuZXJpY3MsIHVzaW5nIGl0Cit3aXRoIGVhcmxpZXIgdmVyc2lvbnMgKHN1Y2ggYXMgRGVscGhpIDcpIHdpbGwgKm5vdCogd29yay4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2RlbHBoaS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29sbGVjdGlvbnMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIwNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcwpAQCAtMCwwICsxLDYxOSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Db2xsZWN0aW9uczsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIEdlbmVyaWNzLkRlZmF1bHRzLCBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfQorICBUQXJyYXk8VD4gPSBhcnJheSBvZiBUOworeyRJRkVORH0KKworICBJVGhyaWZ0Q29udGFpbmVyID0gaW50ZXJmYWNlCisgICAgWyd7OTNERUY1QTAtRDE2Mi00NjFBLUFCMjItNUI0RUUwNzM0MDUwfSddCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsKKyAgZW5kOworCisgIElUaHJpZnREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQorICAgIFsnezI1RURENTA2LUY5RDEtNDAwOC1BNDBGLTU5NDAzNjRCN0U0Nn0nXQorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRQYWlyPFRLZXksVFZhbHVlPj47CisKKyAgICBmdW5jdGlvbiBHZXRLZXlzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVEtleUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0VmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbjsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworCisgICAgcHJvY2VkdXJlIEFkZChjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBSZW1vdmUoY29uc3QgS2V5OiBUS2V5KTsKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgZnVuY3Rpb24gRXh0cmFjdFBhaXIoY29uc3QgS2V5OiBUS2V5KTogVFBhaXI8VEtleSxUVmFsdWU+OworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7CisgICAgZnVuY3Rpb24gVHJ5R2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBvdXQgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIEFkZE9yU2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBDb250YWluc0tleShjb25zdCBLZXk6IFRLZXkpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIENvbnRhaW5zVmFsdWUoY29uc3QgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksVFZhbHVlPj47CisKKyAgICBwcm9wZXJ0eSBJdGVtc1tjb25zdCBLZXk6IFRLZXldOiBUVmFsdWUgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBLZXlzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVEtleUNvbGxlY3Rpb24gcmVhZCBHZXRLZXlzOworICAgIHByb3BlcnR5IFZhbHVlczogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb24gcmVhZCBHZXRWYWx1ZXM7CisgIGVuZDsKKworICBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSxUVmFsdWU+ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0RGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4pCisgIHByaXZhdGUKKyAgICBGRGljdGlvbmFseSA6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPjsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSxUVmFsdWU+PjsKKworICAgIGZ1bmN0aW9uIEdldEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbjsKKyAgICBmdW5jdGlvbiBHZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOworICAgIHByb2NlZHVyZSBTZXRJdGVtKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgQWRkKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBLZXk6IFRLZXkpOworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgICBmdW5jdGlvbiBFeHRyYWN0UGFpcihjb25zdCBLZXk6IFRLZXkpOiBUUGFpcjxUS2V5LFRWYWx1ZT47Cit7JElGRU5EfQorICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIENvbnRhaW5zS2V5KGNvbnN0IEtleTogVEtleSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gQ29udGFpbnNWYWx1ZShjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VFBhaXI8VEtleSxUVmFsdWU+PjsKKyAgICBwcm9wZXJ0eSBJdGVtc1tjb25zdCBLZXk6IFRLZXldOiBUVmFsdWUgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBLZXlzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVEtleUNvbGxlY3Rpb24gcmVhZCBHZXRLZXlzOworICAgIHByb3BlcnR5IFZhbHVlczogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb24gcmVhZCBHZXRWYWx1ZXM7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBQ2FwYWNpdHk6IEludGVnZXIgPSAwKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgSVRocmlmdExpc3Q8VD4gPSBpbnRlcmZhY2UoSVRocmlmdENvbnRhaW5lcikKKyAgICBbJ3syOUJFRUUzMS05Q0I0LTQwMUItQUEwNC01MTQ4QTc1RjQ3M0J9J10KKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsKKyAgICBmdW5jdGlvbiBHZXRDYXBhY2l0eTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2FwYWNpdHkoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb3VudChWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0SXRlbShJbmRleDogSW50ZWdlcik6IFQ7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKyAgICBmdW5jdGlvbiBBZGQoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0KEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIERlbGV0ZShJbmRleDogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIERlbGV0ZVJhbmdlKEFJbmRleCwgQUNvdW50OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBFeHRyYWN0KGNvbnN0IFZhbHVlOiBUKTogVDsKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgcHJvY2VkdXJlIEV4Y2hhbmdlKEluZGV4MSwgSW5kZXgyOiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgTW92ZShDdXJJbmRleCwgTmV3SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEZpcnN0OiBUOworICAgIGZ1bmN0aW9uIExhc3Q6IFQ7Cit7JElGRU5EfQorICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gTGFzdEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBSZXZlcnNlOworICAgIHByb2NlZHVyZSBTb3J0OyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgU29ydChjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUPjsKKyAgICBwcm9wZXJ0eSBDYXBhY2l0eTogSW50ZWdlciByZWFkIEdldENhcGFjaXR5IHdyaXRlIFNldENhcGFjaXR5OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQgd3JpdGUgU2V0Q291bnQ7CisgICAgcHJvcGVydHkgSXRlbXNbSW5kZXg6IEludGVnZXJdOiBUIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICBlbmQ7CisKKyAgVFRocmlmdExpc3RJbXBsPFQ+ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0TGlzdDxUPikKKyAgcHJpdmF0ZQorICAgIEZMaXN0IDogVExpc3Q8VD47CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFQ+OworICAgIGZ1bmN0aW9uIEdldENhcGFjaXR5OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIGZ1bmN0aW9uIEFkZChjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVtb3ZlKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgRGVsZXRlKEluZGV4OiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgRGVsZXRlUmFuZ2UoQUluZGV4LCBBQ291bnQ6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEV4dHJhY3QoY29uc3QgVmFsdWU6IFQpOiBUOworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgICBwcm9jZWR1cmUgRXhjaGFuZ2UoSW5kZXgxLCBJbmRleDI6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBNb3ZlKEN1ckluZGV4LCBOZXdJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRmlyc3Q6IFQ7CisgICAgZnVuY3Rpb24gTGFzdDogVDsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIGZ1bmN0aW9uIENvbnRhaW5zKGNvbnN0IFZhbHVlOiBUKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBMYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFJldmVyc2U7CisgICAgcHJvY2VkdXJlIFNvcnQ7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBTb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcik6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXI7IGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFQ+OworICAgIHByb3BlcnR5IENhcGFjaXR5OiBJbnRlZ2VyIHJlYWQgR2V0Q2FwYWNpdHkgd3JpdGUgU2V0Q2FwYWNpdHk7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJdGVtc1tJbmRleDogSW50ZWdlcl06IFQgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgSUhhc2hTZXQ8VFZhbHVlPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQorICAgIFsnezA5MjNBM0I1LUQ0RDQtNDhBOC05MUFELTQwMjM4RTJFQUQ2Nn0nXQorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRWYWx1ZT47CisgICAgZnVuY3Rpb24gR2V0SXNSZWFkT25seTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IElzUmVhZE9ubHk6IEJvb2xlYW4gcmVhZCBHZXRJc1JlYWRPbmx5OworICAgIHByb2NlZHVyZSBBZGQoIGNvbnN0IGl0ZW06IFRWYWx1ZSk7CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIGZ1bmN0aW9uIENvbnRhaW5zKCBjb25zdCBpdGVtOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBDb3B5VG8odmFyIEE6IFRBcnJheTxUVmFsdWU+OyBhcnJheUluZGV4OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBSZW1vdmUoIGNvbnN0IGl0ZW06IFRWYWx1ZSApOiBCb29sZWFuOworICBlbmQ7CisKKyAgVEhhc2hTZXRJbXBsPFRWYWx1ZT4gPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElIYXNoU2V0PFRWYWx1ZT4pCisgIHByaXZhdGUKKyAgICBGRGljdGlvbmFyeSA6IElUaHJpZnREaWN0aW9uYXJ5PFRWYWx1ZSxJbnRlZ2VyPjsKKyAgICBGSXNSZWFkT25seTogQm9vbGVhbjsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFZhbHVlPjsKKyAgICBmdW5jdGlvbiBHZXRJc1JlYWRPbmx5OiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgSXNSZWFkT25seTogQm9vbGVhbiByZWFkIEZJc1JlYWRPbmx5OworICAgIHByb2NlZHVyZSBBZGQoIGNvbnN0IGl0ZW06IFRWYWx1ZSk7CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIGZ1bmN0aW9uIENvbnRhaW5zKCBjb25zdCBpdGVtOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBDb3B5VG8odmFyIEE6IFRBcnJheTxUVmFsdWU+OyBhcnJheUluZGV4OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBSZW1vdmUoIGNvbnN0IGl0ZW06IFRWYWx1ZSApOiBCb29sZWFuOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworeyBUSGFzaFNldEltcGw8VFZhbHVlPiB9CisKK3Byb2NlZHVyZSBUSGFzaFNldEltcGw8VFZhbHVlPi5BZGQoIGNvbnN0IGl0ZW06IFRWYWx1ZSk7CitiZWdpbgorICBpZiBub3QgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoaXRlbSkgdGhlbgorICBiZWdpbgorICAgIEZEaWN0aW9uYXJ5LkFkZCggaXRlbSwgMCk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNsZWFyOworYmVnaW4KKyAgRkRpY3Rpb25hcnkuQ2xlYXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNvbnRhaW5zKCBjb25zdCBpdGVtOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KGl0ZW0pOworZW5kOworCitwcm9jZWR1cmUgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ29weVRvKHZhciBBOiBUQXJyYXk8VFZhbHVlPjsgYXJyYXlJbmRleDogSW50ZWdlcik7Cit2YXIKKyAgaSA6IEludGVnZXI7CisgIEVudW1sYXRvciA6IFRFbnVtZXJhdG9yPFRWYWx1ZT47CitiZWdpbgorICBFbnVtbGF0b3IgOj0gR2V0RW51bWVyYXRvcjsKKyAgd2hpbGUgRW51bWxhdG9yLk1vdmVOZXh0IGRvCisgIGJlZ2luCisgICAgQVthcnJheUluZGV4XSA6PSBFbnVtbGF0b3IuQ3VycmVudDsKKyAgICBJbmMoYXJyYXlJbmRleCk7CisgIGVuZDsKK2VuZDsKKworY29uc3RydWN0b3IgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBGRGljdGlvbmFyeSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VFZhbHVlLEludGVnZXI+LkNyZWF0ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uR2V0Q291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hcnkuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRWYWx1ZT47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hcnkuS2V5cy5HZXRFbnVtZXJhdG9yOworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRJc1JlYWRPbmx5OiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJc1JlYWRPbmx5OworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5SZW1vdmUoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRmFsc2U7CisgIGlmIEZEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KCBpdGVtICkgdGhlbgorICBiZWdpbgorICAgIEZEaWN0aW9uYXJ5LlJlbW92ZSggaXRlbSApOworICAgIFJlc3VsdCA6PSBub3QgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoIGl0ZW0gKTsKKyAgZW5kOworZW5kOworCit7IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+IH0KKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkFkZChjb25zdCBLZXk6IFRLZXk7CisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQWRkKCBLZXksIFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkFkZE9yU2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OworICBjb25zdCBWYWx1ZTogVFZhbHVlKTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkFkZE9yU2V0VmFsdWUoIEtleSwgVmFsdWUpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ2xlYXI7CitiZWdpbgorICBGRGljdGlvbmFseS5DbGVhcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ29udGFpbnNLZXkoCisgIGNvbnN0IEtleTogVEtleSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuQ29udGFpbnNLZXkoIEtleSApOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5Db250YWluc1ZhbHVlKAorICBjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5Db250YWluc1ZhbHVlKCBWYWx1ZSApOworZW5kOworCitjb25zdHJ1Y3RvciBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5DcmVhdGUoQUNhcGFjaXR5OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZEaWN0aW9uYWx5IDo9IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5DcmVhdGUoIEFDYXBhY2l0eSApOworZW5kOworCitkZXN0cnVjdG9yIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkRlc3Ryb3k7CitiZWdpbgorICBGRGljdGlvbmFseS5GcmVlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5FeHRyYWN0UGFpciggY29uc3QgS2V5OiBUS2V5KTogVFBhaXI8VEtleSwgVFZhbHVlPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5FeHRyYWN0UGFpciggS2V5KTsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldENvdW50OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvdW50OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LCBUVmFsdWU+PjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5HZXRFbnVtZXJhdG9yOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5JdGVtc1tLZXldOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRLZXlzOiBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LktleXM7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldFZhbHVlczogVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlZhbHVlczsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlJlbW92ZShjb25zdCBLZXk6IFRLZXkpOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuUmVtb3ZlKCBLZXkgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OworICBjb25zdCBWYWx1ZTogVFZhbHVlKTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkFkZE9yU2V0VmFsdWUoIEtleSwgVmFsdWUpOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5Ub0FycmF5OiBUQXJyYXk8VFBhaXI8VEtleSwgVFZhbHVlPj47Cit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9Cit2YXIKKyAgeCA6IFRQYWlyPFRLZXksIFRWYWx1ZT47CisgIGkgOiBJbnRlZ2VyOworeyRJRkVORH0KK2JlZ2luCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9CisgIFNldExlbmd0aChSZXN1bHQsIENvdW50KTsKKyAgaSA6PSAwOworICBmb3IgeCBpbiBGRGljdGlvbmFseSBkbworICBiZWdpbgorICAgIFJlc3VsdFtpXSA6PSB4OworICAgIEluYyggaSApOworICBlbmQ7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5Ub0FycmF5OworeyRJRkVORH0KK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRyaW1FeGNlc3M7CitiZWdpbgorICBGRGljdGlvbmFseS5UcmltRXhjZXNzOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5UcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7CisgIG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5UcnlHZXRWYWx1ZSggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK3sgVFRocmlmdExpc3RJbXBsPFQ+IH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkFkZChjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQWRkKCBWYWx1ZSApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0LkFkZFJhbmdlKCBDb2xsZWN0aW9uICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkUmFuZ2UoY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOworYmVnaW4KKyAgRkxpc3QuQWRkUmFuZ2UoIENvbGxlY3Rpb24gKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGRSYW5nZShjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOworYmVnaW4KKyAgRkxpc3QuQWRkUmFuZ2UoIFZhbHVlcyApOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7CisgIG91dCBJbmRleDogSW50ZWdlcik6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQmluYXJ5U2VhcmNoKCBJdGVtLCBJbmRleCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5CaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQmluYXJ5U2VhcmNoKCBJdGVtLCBJbmRleCwgQUNvbXBhcmVyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5DbGVhcjsKK2JlZ2luCisgIEZMaXN0LkNsZWFyOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQ29udGFpbnMoY29uc3QgVmFsdWU6IFQpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkNvbnRhaW5zKCBWYWx1ZSApOworZW5kOworCitjb25zdHJ1Y3RvciBUVGhyaWZ0TGlzdEltcGw8VD4uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBGTGlzdCA6PSBUTGlzdDxUPi5DcmVhdGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uRGVsZXRlKEluZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkRlbGV0ZSggSW5kZXggKQorZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkRlbGV0ZVJhbmdlKEFJbmRleCwgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkRlbGV0ZVJhbmdlKCBBSW5kZXgsIEFDb3VudCkKK2VuZDsKKworZGVzdHJ1Y3RvciBUVGhyaWZ0TGlzdEltcGw8VD4uRGVzdHJveTsKK2JlZ2luCisgIEZMaXN0LkZyZWU7CisgIGluaGVyaXRlZDsKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uRXhjaGFuZ2UoSW5kZXgxLCBJbmRleDI6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuRXhjaGFuZ2UoIEluZGV4MSwgSW5kZXgyICkKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5FeHRyYWN0KGNvbnN0IFZhbHVlOiBUKTogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5FeHRyYWN0KCBWYWx1ZSApCitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uRmlyc3Q6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuRmlyc3Q7CitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0Q2FwYWNpdHk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQ2FwYWNpdHk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5Db3VudDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFQ+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkdldEVudW1lcmF0b3I7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdFtJbmRleF07CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5JbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5JbmRleE9mKCBWYWx1ZSApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydChJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworYmVnaW4KKyAgRkxpc3QuSW5zZXJ0KCBJbmRleCwgVmFsdWUpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5JbnNlcnRSYW5nZSggSW5kZXgsIENvbGxlY3Rpb24gKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydFJhbmdlKCBJbmRleCwgVmFsdWVzKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOworYmVnaW4KKyAgRkxpc3QuSW5zZXJ0UmFuZ2UoIEluZGV4LCBDb2xsZWN0aW9uICk7CitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uTGFzdDogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5MYXN0OworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+Lkxhc3RJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5MYXN0SW5kZXhPZiggVmFsdWUgKTsKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uTW92ZShDdXJJbmRleCwgTmV3SW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuTW92ZSggQ3VySW5kZXgsICBOZXdJbmRleCk7CitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uUmVtb3ZlKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5SZW1vdmUoIFZhbHVlICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uUmV2ZXJzZTsKK2JlZ2luCisgIEZMaXN0LlJldmVyc2U7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU2V0Q2FwYWNpdHkoVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuQ2FwYWNpdHkgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuQ291bnQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU2V0SXRlbShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworYmVnaW4KKyAgRkxpc3RbSW5kZXhdIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNvcnQ7CitiZWdpbgorICBGTGlzdC5Tb3J0OworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOworYmVnaW4KKyAgRkxpc3QuU29ydDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LlRvQXJyYXk6IFRBcnJheTxUPjsKK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0KK3ZhcgorICB4IDogVDsKKyAgaSA6IEludGVnZXI7Cit7JElGRU5EfQorYmVnaW4KK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0KKyAgU2V0TGVuZ3RoKFJlc3VsdCwgQ291bnQpOworICBpIDo9IDA7CisgIGZvciB4IGluIEZMaXN0IGRvCisgIGJlZ2luCisgICAgUmVzdWx0W2ldIDo9IHg7CisgICAgSW5jKCBpICk7CisgIGVuZDsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IEZMaXN0LlRvQXJyYXk7Cit7JElGRU5EfQorZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlRyaW1FeGNlc3M7CitiZWdpbgorICBGTGlzdC5UcmltRXhjZXNzOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5Y2NhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpAQCAtMCwwICsxLDUwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKKworLy8gR29vZCBsaXN0cyBvZiBEZWxwaGkgdmVyc2lvbiBudW1iZXJzCisvLyBodHRwczovL2dpdGh1Yi5jb20vcHJvamVjdC1qZWRpL2plZGkvYmxvYi9tYXN0ZXIvamVkaS5pbmMKKy8vIGh0dHA6Ly9kb2N3aWtpLmVtYmFyY2FkZXJvLmNvbS9SQURTdHVkaW8vU2VhdHRsZS9lbi9Db21waWxlcl9WZXJzaW9ucworCisKKy8vIHN0YXJ0IHdpdGggbW9zdCBiYWNrd2FyZHMgY29tcGF0aWJsZSBkZWZhdWx0cworCit7JERFRklORSBPTERfVU5JVF9OQU1FU30KK3skREVGSU5FIE9MRF9TT0NLRVRTfSAgICAgIC8vIFRPRE86IGFkZCBzb2NrZXQgc3VwcG9ydCBmb3IgQ29tcGlsZXJWZXJzaW9uID49IDI4LjAKK3skVU5ERUYgSEFWRV9DTEFTU19DVE9SfQorCisKKy8vIGVuYWJsZSBmZWF0dXJlcyBhcyB0aGV5IGFyZSBhdmFpbGFibGUKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0gICAvLyBEZWxwaGkgMjAxMAorICB7JERFRklORSBIQVZFX0NMQVNTX0NUT1J9Cit7JElGRU5EfQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMy4wfSAgIC8vIERlbHBoaSBYRTIKKyAgeyRVTkRFRiBPTERfVU5JVF9OQU1FU30KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDI4LjB9ICAgLy8gRGVscGhpIFhFNworICB7JFVOREVGIE9MRF9TT0NLRVRTfQoreyRJRkVORH0KKworCisvLyBFT0YKKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTVjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcwpAQCAtMCwwICsxLDYyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LkV4Y2VwdGlvbjsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywgU3lzVXRpbHM7CisKK3R5cGUKKyAgLy8gYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zCisgIFRFeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBmdW5jdGlvbiBNZXNzYWdlIDogc3RyaW5nOyAgICAgICAgLy8gaGlkZSBpbmhlcml0ZWQgcHJvcGVydHk6IGFsbG93IHJlYWQsIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCisgICAgcHJvY2VkdXJlIFVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsgIC8vIHVwZGF0ZSBpbmhlcml0ZWQgbWVzc2FnZSBwcm9wZXJ0eSB3aXRoIHRvU3RyaW5nKCkKKyAgZW5kOworCisKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRFeGNlcHRpb24gfQorCitmdW5jdGlvbiBURXhjZXB0aW9uLk1lc3NhZ2U7CisvLyBhbGxvdyByZWFkIChleGNlcHRpb24gc3VtbWFyeSksIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCisvLyByZWFkIHdpbGwgcmV0dXJuIHRoZSBleGNlcHRpb24gc3VtbWFyeQorYmVnaW4KKyAgcmVzdWx0IDo9IFNlbGYuVG9TdHJpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBURXhjZXB0aW9uLlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsKKy8vIFVwZGF0ZSB0aGUgaW5oZXJpdGVkIE1lc3NhZ2UgcHJvcGVydHkgdG8gYmV0dGVyIGNvbmZvcm0gdG8gc3RhbmRhcmQgYmVoYXZpb3VyLgorLy8gTmljZSBiZW5lZml0OiBUaGUgSURFIGlzIG5vdyBhYmxlIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFnYWluLgorYmVnaW4KKyAgaW5oZXJpdGVkIE1lc3NhZ2UgOj0gU2VsZi5Ub1N0cmluZzsgIC8vIHByb2R1Y2VzIGEgc3VtbWFyeSB0ZXh0CitlbmQ7CisKKworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjIzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKQEAgLTAsMCArMSwyMzEgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleDsKKworCitpbnRlcmZhY2UKKwordXNlcworICBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4OworCit7IFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworCisgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisKKyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICAgICAgIkNhbGN1bGF0b3IiLAorICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisKKyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICAgICAgICAgbmV3IFdlYXRoZXJSZXBvcnQuUHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisKKyAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0KTsKKworICAgICBzZXJ2ZXIuc2VydmUoKTsKK30KKworCit0eXBlCisgIElNdWx0aXBsZXhlZFByb2Nlc3NvciA9IGludGVyZmFjZSggSVByb2Nlc3NvcikKKyAgICBbJ3s4MDdGOUQxOS02Q0Y0LTQ3ODktODQwRS05M0U4N0ExMkVCNjN9J10KKyAgICAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHVzCisgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOworICBlbmQ7CisKKworICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTXVsdGlwbGV4ZWRQcm9jZXNzb3IsIElQcm9jZXNzb3IpCisgIHByaXZhdGUgdHlwZQorICAgIC8vIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgICAgLy8gdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICAgIC8vIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAgICBUU3RvcmVkTWVzc2FnZVByb3RvY29sID0gY2xhc3MoIFRQcm90b2NvbERlY29yYXRvcikKKyAgICBwcml2YXRlCisgICAgICBGTWVzc2FnZUJlZ2luIDogVFRocmlmdE1lc3NhZ2U7CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhTXNnQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZSk7CisgICAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgZW5kOworCisgIHByaXZhdGUKKyAgICBGU2VydmljZVByb2Nlc3Nvck1hcCA6IFREaWN0aW9uYXJ5PFN0cmluZywgSVByb2Nlc3Nvcj47CisgICAgRkRlZmF1bHRQcm9jZXNzb3IgOiBJUHJvY2Vzc29yOworCisgICAgcHJvY2VkdXJlIEVycm9yKCBjb25zdCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgbXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgICBleHR5cGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOyBjb25zdCBldHh0IDogc3RyaW5nKTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuICBUaGlzIGFsbG93cyB1cworICAgIC8vIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAvLyB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgcHJvY2VkdXJlIFJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbiA9IEZBTFNFKTsKKworICAgIHsgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICAtIERpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLgorCisgICAgICBBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZCisgICAgICBvciBpZiB0aGUgc2VydmljZSBpcyB1bmtub3duIChvciBub3QgcHJvcGVybHkgcmVnaXN0ZXJlZCkuCisgICAgfQorICAgIGZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90LCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzID0gbmlsKTogQm9vbGVhbjsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK2NvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGNvbnN0IHByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhTXNnQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBwcm90b2NvbCk7CisgIEZNZXNzYWdlQmVnaW4gOj0gYU1zZ0JlZ2luOworZW5kOworCisKK2Z1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGTWVzc2FnZUJlZ2luOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZpY2VQcm9jZXNzb3JNYXAgOj0gVERpY3Rpb25hcnk8c3RyaW5nLElQcm9jZXNzb3I+LkNyZWF0ZTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZTZXJ2aWNlUHJvY2Vzc29yTWFwKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuKTsKK2JlZ2luCisgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZCggc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisKKyAgaWYgYXNEZWZhdWx0IHRoZW4gYmVnaW4KKyAgICBpZiBGRGVmYXVsdFByb2Nlc3NvciA9IG5pbAorICAgIHRoZW4gRkRlZmF1bHRQcm9jZXNzb3IgOj0gcHJvY2Vzc29yCisgICAgZWxzZSByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLkNyZWF0ZSgnT25seSBvbmUgZGVmYXVsdCBzZXJ2aWNlIGFsbG93ZWQnKTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkVycm9yKCBjb25zdCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgbXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0eXBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldHh0IDogc3RyaW5nKTsKK3ZhciBhcHBleCAgOiBUQXBwbGljYXRpb25FeGNlcHRpb247CisgICAgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICBhcHBleCA6PSBleHR5cGUuQ3JlYXRlKGV0eHQpOworICB0cnkKKyAgICBJbml0KCBuZXdNc2csIG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOworCisgICAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3TXNnKTsKKyAgICBhcHBleC5Xcml0ZShvcHJvdCk7CisgICAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7CisKKyAgZmluYWxseQorICAgIGFwcGV4LkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlByb2Nlc3MoY29uc3QgaXByb3QsIG9wcm90IDogSVByb3RvY29sOyBjb25zdCBldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzID0gbmlsKTogQm9vbGVhbjsKK3ZhciBtc2csIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOworICAgIGlkeCAgICAgICAgIDogSW50ZWdlcjsKKyAgICBzU2VydmljZSAgICA6IHN0cmluZzsKKyAgICBwcm9jZXNzb3IgICA6IElQcm9jZXNzb3I7CisgICAgcHJvdG9jb2wgICAgOiBJUHJvdG9jb2w7Citjb25zdAorICBFUlJPUl9JTlZBTElEX01TR1RZUEUgICA9ICdNZXNzYWdlIG11c3QgYmUgImNhbGwiIG9yICJvbmV3YXkiJzsKKyAgRVJST1JfSU5DT01QQVRJQkxFX1BST1QgPSAnTm8gc2VydmljZSBuYW1lIGZvdW5kIGluICIlcyIuIENsaWVudCBpcyBleHBlY3RlZCB0byB1c2UgVE11bHRpcGxleFByb3RvY29sLic7CisgIEVSUk9SX1VOS05PV05fU0VSVklDRSAgID0gJ1NlcnZpY2UgIiVzIiBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIE11bHRpcGxleGVkUHJvY2Vzc29yJzsKK2JlZ2luCisgIC8vIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgLy8gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgIG1zZyA6PSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIGlmIG5vdCAobXNnLlR5cGVfIGluIFtUTWVzc2FnZVR5cGUuQ2FsbCwgVE1lc3NhZ2VUeXBlLk9uZXdheV0pIHRoZW4gYmVnaW4KKyAgICBFcnJvciggb3Byb3QsIG1zZywKKyAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICBFUlJPUl9JTlZBTElEX01TR1RZUEUpOworICAgIEV4aXQoIEZBTFNFKTsKKyAgZW5kOworCisgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAvLyB1c2UgRkRlZmF1bHRQcm9jZXNzb3IgYXMgZmFsbGJhY2sgaWYgdGhlcmUgaXMgbm8gc2VwYXJhdG9yCisgIGlkeCA6PSBQb3MoIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUiwgbXNnLk5hbWUpOworICBpZiBpZHggPiAwIHRoZW4gYmVnaW4KKworICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICBzU2VydmljZSA6PSBDb3B5KCBtc2cuTmFtZSwgMSwgaWR4LTEpOworICAgIGlmIG5vdCBGU2VydmljZVByb2Nlc3Nvck1hcC5UcnlHZXRWYWx1ZSggc1NlcnZpY2UsIHByb2Nlc3NvcikKKyAgICB0aGVuIGJlZ2luCisgICAgICBFcnJvciggb3Byb3QsIG1zZywKKyAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgIEZvcm1hdChFUlJPUl9VTktOT1dOX1NFUlZJQ0UsW3NTZXJ2aWNlXSkpOworICAgICAgRXhpdCggRkFMU0UpOworICAgIGVuZDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIEluYyggaWR4LCBMZW5ndGgoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKSk7CisgICAgSW5pdCggbmV3TXNnLCBDb3B5KCBtc2cuTmFtZSwgaWR4LCBNQVhJTlQpLCBtc2cuVHlwZV8sIG1zZy5TZXFJRCk7CisKKyAgZW5kCisgIGVsc2UgaWYgRkRlZmF1bHRQcm9jZXNzb3IgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBwcm9jZXNzb3IgOj0gRkRlZmF1bHRQcm9jZXNzb3I7CisgICAgbmV3TXNnICAgIDo9IG1zZzsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCisKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBFcnJvciggb3Byb3QsIG1zZywKKyAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICBGb3JtYXQoRVJST1JfSU5DT01QQVRJQkxFX1BST1QsW21zZy5OYW1lXSkpOworICAgIEV4aXQoIEZBTFNFKTsKKyAgZW5kOworCisgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgcHJvdG9jb2wgOj0gVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGlwcm90LCBuZXdNc2cpOworICByZXN1bHQgICA6PSBwcm9jZXNzb3IucHJvY2VzcyggcHJvdG9jb2wsIG9wcm90LCBldmVudHMpOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzFiM2RhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCkBAIC0wLDAgKzEsMTExNyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit7JFNDT1BFREVOVU1TIE9OfQorCit1bml0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0OworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLAorICBTeXNVdGlscywKKyAgTWF0aCwKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlV0aWxzOworCit0eXBlCisgIElDb21wYWN0UHJvdG9jb2wgPSBpbnRlcmZhY2UoIElQcm90b2NvbCkKKyAgICBbJ3tDMDE5MjdFQy0wMjFBLTQ1RjctOTNCMS0yM0Q2QTU0MjBFRER9J10KKyAgZW5kOworCisgIC8vIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorICBUQ29tcGFjdFByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsLCBJQ29tcGFjdFByb3RvY29sKQorICBwdWJsaWMKKyAgICB0eXBlCisgICAgICBURmFjdG9yeSA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sRmFjdG9yeSkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgICAgICBlbmQ7CisKKyAgcHJpdmF0ZSBjb25zdAorCisgICAgeyBUT0RPCisgICAgc3RhdGljIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCIiKTsKKyAgICBzdGF0aWMgVEZpZWxkIFRTVE9QID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU3RvcCwgKHNob3J0KTApOworICAgIH0KKworICAgIFBST1RPQ09MX0lEICAgICAgID0gQnl0ZSggJDgyKTsKKyAgICBWRVJTSU9OICAgICAgICAgICA9IEJ5dGUoIDEpOworICAgIFZFUlNJT05fTUFTSyAgICAgID0gQnl0ZSggJDFGKTsgLy8gMDAwMSAxMTExCisgICAgVFlQRV9NQVNLICAgICAgICAgPSBCeXRlKCAkRTApOyAvLyAxMTEwIDAwMDAKKyAgICBUWVBFX0JJVFMgICAgICAgICA9IEJ5dGUoICQwNyk7IC8vIDAwMDAgMDExMQorICAgIFRZUEVfU0hJRlRfQU1PVU5UID0gQnl0ZSggNSk7CisKKyAgcHJpdmF0ZSB0eXBlCisgICAgLy8gQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCisgICAgVHlwZXMgPSAoCisgICAgICBTVE9QICAgICAgICAgID0gJDAwLAorICAgICAgQk9PTEVBTl9UUlVFICA9ICQwMSwKKyAgICAgIEJPT0xFQU5fRkFMU0UgPSAkMDIsCisgICAgICBCWVRFXyAgICAgICAgID0gJDAzLAorICAgICAgSTE2ICAgICAgICAgICA9ICQwNCwKKyAgICAgIEkzMiAgICAgICAgICAgPSAkMDUsCisgICAgICBJNjQgICAgICAgICAgID0gJDA2LAorICAgICAgRE9VQkxFXyAgICAgICA9ICQwNywKKyAgICAgIEJJTkFSWSAgICAgICAgPSAkMDgsCisgICAgICBMSVNUICAgICAgICAgID0gJDA5LAorICAgICAgU0VUXyAgICAgICAgICA9ICQwQSwKKyAgICAgIE1BUCAgICAgICAgICAgPSAkMEIsCisgICAgICBTVFJVQ1QgICAgICAgID0gJDBDCisgICAgKTsKKworICBwcml2YXRlIGNvbnN0CisgICAgdHR5cGVUb0NvbXBhY3RUeXBlIDogYXJyYXlbVFR5cGVdIG9mIFR5cGVzID0gKAorICAgICAgVHlwZXMuU1RPUCwgICAgICAgICAgIC8vIFN0b3AgICAgPSAwLAorICAgICAgVHlwZXMoLTEpLCAgICAgICAgICAgIC8vIFZvaWQgICAgPSAxLAorICAgICAgVHlwZXMuQk9PTEVBTl9UUlVFLCAgIC8vIEJvb2xfICAgPSAyLAorICAgICAgVHlwZXMuQllURV8sICAgICAgICAgIC8vIEJ5dGVfICAgPSAzLAorICAgICAgVHlwZXMuRE9VQkxFXywgICAgICAgIC8vIERvdWJsZV8gPSA0LAorICAgICAgVHlwZXMoLTUpLCAgICAgICAgICAgIC8vIHVudXNlZAorICAgICAgVHlwZXMuSTE2LCAgICAgICAgICAgIC8vIEkxNiAgICAgPSA2LAorICAgICAgVHlwZXMoLTcpLCAgICAgICAgICAgIC8vIHVudXNlZAorICAgICAgVHlwZXMuSTMyLCAgICAgICAgICAgIC8vIEkzMiAgICAgPSA4LAorICAgICAgVHlwZXMoLTkpLCAgICAgICAgICAgIC8vIHVudXNlZAorICAgICAgVHlwZXMuSTY0LCAgICAgICAgICAgIC8vIEk2NCAgICAgPSAxMCwKKyAgICAgIFR5cGVzLkJJTkFSWSwgICAgICAgICAvLyBTdHJpbmdfID0gMTEsCisgICAgICBUeXBlcy5TVFJVQ1QsICAgICAgICAgLy8gU3RydWN0ICA9IDEyLAorICAgICAgVHlwZXMuTUFQLCAgICAgICAgICAgIC8vIE1hcCAgICAgPSAxMywKKyAgICAgIFR5cGVzLlNFVF8sICAgICAgICAgICAvLyBTZXRfICAgID0gMTQsCisgICAgICBUeXBlcy5MSVNUICAgICAgICAgICAgLy8gTGlzdCAgICA9IDE1LAorICAgICk7CisKKyAgICB0Y29tcGFjdFR5cGVUb1R5cGUgOiBhcnJheVtUeXBlc10gb2YgVFR5cGUgPSAoCisgICAgICBUVHlwZS5TdG9wLCAgICAgICAvLyBTVE9QCisgICAgICBUVHlwZS5Cb29sXywgICAgICAvLyBCT09MRUFOX1RSVUUKKyAgICAgIFRUeXBlLkJvb2xfLCAgICAgIC8vIEJPT0xFQU5fRkFMU0UKKyAgICAgIFRUeXBlLkJ5dGVfLCAgICAgIC8vIEJZVEVfCisgICAgICBUVHlwZS5JMTYsICAgICAgICAvLyBJMTYKKyAgICAgIFRUeXBlLkkzMiwgICAgICAgIC8vIEkzMgorICAgICAgVFR5cGUuSTY0LCAgICAgICAgLy8gSTY0CisgICAgICBUVHlwZS5Eb3VibGVfLCAgICAvLyBET1VCTEVfCisgICAgICBUVHlwZS5TdHJpbmdfLCAgICAvLyBCSU5BUlkKKyAgICAgIFRUeXBlLkxpc3QsICAgICAgIC8vIExJU1QKKyAgICAgIFRUeXBlLlNldF8sICAgICAgIC8vIFNFVF8KKyAgICAgIFRUeXBlLk1hcCwgICAgICAgIC8vIE1BUAorICAgICAgVFR5cGUuU3RydWN0ICAgICAgLy8gU1RSVUNUCisgICAgKTsKKworICBwcml2YXRlCisgICAgLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICAvLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgIGxhc3RGaWVsZF8gOiBUU3RhY2s8SW50ZWdlcj47CisgICAgbGFzdEZpZWxkSWRfIDogSW50ZWdlcjsKKworICAgIC8vIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAgIC8vIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICBwcml2YXRlIGJvb2xlYW5GaWVsZF8gOiBUVGhyaWZ0RmllbGQ7CisKKyAgICAvLyBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAvLyB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICBwcml2YXRlICBib29sVmFsdWVfICA6ICggdW51c2VkLCBib29sX3RydWUsIGJvb2xfZmFsc2UpOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCB0cmFucyA6IElUcmFuc3BvcnQpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgICAgcHJvY2VkdXJlIFJlc2V0OworCisgIHByaXZhdGUKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7ICBvdmVybG9hZDsKKworICAgIC8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgIHByb2NlZHVyZSBXcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IG4gOiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworCisgICAgLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAvLyBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIFdyaXRlVmFyaW50NjQ/CisgICAgcHJvY2VkdXJlIFdyaXRlVmFyaW50MzIoIG4gOiBDYXJkaW5hbCk7CisKKyAgcHJpdmF0ZQorICAgIC8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhICd0eXBlIG92ZXJyaWRlJworICAgIC8vIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUgYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOworCisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZHViOiBEb3VibGUpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJsb2FkOyBvdmVycmlkZTsKKworICBwcml2YXRlCisgICAgY2xhc3MgZnVuY3Rpb24gIERvdWJsZVRvSW50NjRCaXRzKCBjb25zdCBkYiA6IERvdWJsZSkgOiBJbnQ2NDsKKyAgICBjbGFzcyBmdW5jdGlvbiAgSW50NjRCaXRzVG9Eb3VibGUoIGNvbnN0IGk2NCA6IEludDY0KSA6IERvdWJsZTsKKworICAgIC8vIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAgICAvLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgICAgcHJvY2VkdXJlIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBjb25zdCBlbGVtVHlwZSA6IFRUeXBlOyBzaXplIDogSW50ZWdlcik7CisKKyAgICBwcm9jZWR1cmUgV3JpdGVWYXJpbnQ2NCggbiA6IFVJbnQ2NCk7CisKKyAgICAvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgIGNsYXNzIGZ1bmN0aW9uICBsb25nVG9aaWd6YWcoIGNvbnN0IG4gOiBJbnQ2NCkgOiBVSW50NjQ7CisKKyAgICAvLyBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgY2xhc3MgZnVuY3Rpb24gaW50VG9aaWdaYWcoIGNvbnN0IG4gOiBJbnRlZ2VyKSA6IENhcmRpbmFsOworCisgICAgLy9Db252ZXJ0IGEgSW50NjQgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIHVudGlsIG9mZis3LgorICAgIGNsYXNzIHByb2NlZHVyZSBmaXhlZExvbmdUb0J5dGVzKCBjb25zdCBuIDogSW50NjQ7IHZhciBidWYgOiBUQnl0ZXMpOworCisgIHB1YmxpYworICAgIGZ1bmN0aW9uICBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkSTE2OiBTbWFsbEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkSTY0OiBJbnQ2NDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWREb3VibGU6RG91YmxlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEJpbmFyeTogVEJ5dGVzOyBvdmVybG9hZDsgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZQorICAgIC8vIEludGVybmFsIFJlYWRpbmcgbWV0aG9kcworCisgICAgLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgIGZ1bmN0aW9uIFJlYWRWYXJpbnQzMiA6IENhcmRpbmFsOworCisgICAgLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgIC8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgICAgZnVuY3Rpb24gUmVhZFZhcmludDY0IDogVUludDY0OworCisKKyAgICAvLyBlbmNvZGluZyBoZWxwZXJzCisKKyAgICAvLyBDb252ZXJ0IGZyb20gemlnemFnIEludGVnZXIgdG8gSW50ZWdlci4KKyAgICBjbGFzcyBmdW5jdGlvbiB6aWd6YWdUb0ludCggY29uc3QgbiA6IENhcmRpbmFsICkgOiBJbnRlZ2VyOworCisgICAgLy8gQ29udmVydCBmcm9tIHppZ3phZyBJbnQ2NCB0byBJbnQ2NC4KKyAgICBjbGFzcyBmdW5jdGlvbiB6aWd6YWdUb0xvbmcoIGNvbnN0IG4gOiBVSW50NjQpIDogSW50NjQ7CisKKyAgICAvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgSW50NjQgbGl0ZXJhbHMsCisgICAgLy8gb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gSW50ZWdlciBsZWZ0IDU2IGJpdHMsCisgICAgLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIEludGVnZXIuCisgICAgY2xhc3MgZnVuY3Rpb24gYnl0ZXNUb0xvbmcoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IEludDY0OworCisgICAgLy8gdHlwZSB0ZXN0aW5nIGFuZCBjb252ZXJ0aW5nCisgICAgY2xhc3MgZnVuY3Rpb24gaXNCb29sVHlwZSggY29uc3QgYiA6IGJ5dGUpIDogQm9vbGVhbjsKKworICAgIC8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBUVHlwZSB2YWx1ZS4KKyAgICBjbGFzcyBmdW5jdGlvbiBnZXRUVHlwZSggY29uc3QgdHlwZV8gOiBieXRlKSA6IFRUeXBlOworCisgICAgLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICBjbGFzcyBmdW5jdGlvbiBnZXRDb21wYWN0VHlwZSggY29uc3QgdHR5cGUgOiBUVHlwZSkgOiBCeXRlOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworCisKKy8vLS0tIFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5URmFjdG9yeS5HZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CitiZWdpbgorICByZXN1bHQgOj0gVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucyk7CitlbmQ7CisKKworLy8tLS0gVENvbXBhY3RQcm90b2NvbEltcGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRDb21wYWN0UHJvdG9jb2xJbXBsLkNyZWF0ZShjb25zdCB0cmFuczogSVRyYW5zcG9ydCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCB0cmFucyk7CisKKyAgbGFzdEZpZWxkSWRfIDo9IDA7CisgIGxhc3RGaWVsZF8gOj0gVFN0YWNrPEludGVnZXI+LkNyZWF0ZTsKKworICBJbml0KCBib29sZWFuRmllbGRfLCAnJywgVFR5cGUuU3RvcCwgMCk7CisgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOworZW5kOworCisKK2Rlc3RydWN0b3IgVENvbXBhY3RQcm90b2NvbEltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIGxhc3RGaWVsZF8pOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZXNldDsKK2JlZ2luCisgIGxhc3RGaWVsZF8uQ2xlYXIoKTsKKyAgbGFzdEZpZWxkSWRfIDo9IDA7CisgIEluaXQoIGJvb2xlYW5GaWVsZF8sICcnLCBUVHlwZS5TdG9wLCAwKTsKKyAgYm9vbFZhbHVlXyA6PSB1bnVzZWQ7CitlbmQ7CisKKworLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisvLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZURpcmVjdCggY29uc3QgYiA6IEJ5dGUpOworYmVnaW4KKyAgVHJhbnNwb3J0LldyaXRlKCBAYiwgU2l6ZU9mKGIpKTsKK2VuZDsKKworCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IG4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZShuKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVZhcmludDMyKCBuIDogQ2FyZGluYWwpOwordmFyIGkzMmJ1ZiA6IFRCeXRlczsKKyAgICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBpMzJidWYsIDUpOworICBpZHggOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIEFTU0VSVCggaWR4IDwgTGVuZ3RoKGkzMmJ1ZikpOworCisgICAgLy8gbGFzdCBwYXJ0PworICAgIGlmICgobiBhbmQgbm90ICQ3RikgPSAwKSB0aGVuIGJlZ2luCisgICAgICBpMzJidWZbaWR4XSA6PSBCeXRlKG4pOworICAgICAgSW5jKGlkeCk7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICBpMzJidWZbaWR4XSA6PSBCeXRlKChuIGFuZCAkN0YpIG9yICQ4MCk7CisgICAgSW5jKGlkeCk7CisgICAgbiA6PSBuIHNociA3OworICBlbmQ7CisKKyAgVHJhbnNwb3J0LldyaXRlKCBpMzJidWYsIDAsIGlkeCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwordmFyIHZlcnNpb25BbmRUeXBlIDogQnl0ZTsKK2JlZ2luCisgIFJlc2V0OworCisgIHZlcnNpb25BbmRUeXBlIDo9IEJ5dGUoIFZFUlNJT04gYW5kIFZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgb3IgQnl0ZSggKENhcmRpbmFsKG1zZy5UeXBlXykgc2hsIFRZUEVfU0hJRlRfQU1PVU5UKSBhbmQgVFlQRV9NQVNLKTsKKworICBXcml0ZUJ5dGVEaXJlY3QoIFBST1RPQ09MX0lEKTsKKyAgV3JpdGVCeXRlRGlyZWN0KCB2ZXJzaW9uQW5kVHlwZSk7CisgIFdyaXRlVmFyaW50MzIoIENhcmRpbmFsKG1zZy5TZXFJRCkpOworICBXcml0ZVN0cmluZyggbXNnLk5hbWUpOworZW5kOworCisKKy8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UgaXQgYXMgYW4KKy8vIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlCisvLyBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CitiZWdpbgorICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKKyAgbGFzdEZpZWxkSWRfIDo9IDA7CitlbmQ7CisKKworLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UgdGhpcyBhcyBhbgorLy8gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZiBvZiB0aGUgZmllbGQgc3RhY2suCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RFbmQ7CitiZWdpbgorICBsYXN0RmllbGRJZF8gOj0gbGFzdEZpZWxkXy5Qb3AoKTsKK2VuZDsKKworCisvLyBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKKy8vIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbgorLy8gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKK2JlZ2luCisgIGNhc2UgZmllbGQuVHlwZV8gb2YKKyAgICBUVHlwZS5Cb29sXyA6IGJvb2xlYW5GaWVsZF8gOj0gZmllbGQ7IC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisgIGVsc2UKKyAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChmaWVsZCwgJEZGKTsKKyAgZW5kOworZW5kOworCisKKy8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhICd0eXBlIG92ZXJyaWRlJworLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKK3ZhciB0eXBlVG9Xcml0ZSA6IEJ5dGU7CitiZWdpbgorICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgIGlmIHR5cGVPdmVycmlkZSA9ICRGRgorICB0aGVuIHR5cGVUb1dyaXRlIDo9IGdldENvbXBhY3RUeXBlKCBmaWVsZC5UeXBlXykKKyAgZWxzZSB0eXBlVG9Xcml0ZSA6PSB0eXBlT3ZlcnJpZGU7CisKKyAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZC5JRCA+IGxhc3RGaWVsZElkXykgYW5kICgoZmllbGQuSUQgLSBsYXN0RmllbGRJZF8pIDw9IDE1KQorICB0aGVuIGJlZ2luCisgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgIFdyaXRlQnl0ZURpcmVjdCggKChmaWVsZC5JRCAtIGxhc3RGaWVsZElkXykgc2hsIDQpIG9yIHR5cGVUb1dyaXRlKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgV3JpdGVCeXRlRGlyZWN0KCB0eXBlVG9Xcml0ZSk7CisgICAgV3JpdGVJMTYoIGZpZWxkLklEKTsKKyAgZW5kOworCisgIGxhc3RGaWVsZElkXyA6PSBmaWVsZC5JRDsKK2VuZDsKKworCisvLyBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUoIFR5cGVzLlNUT1ApKTsKK2VuZDsKKworCisvLyBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQorLy8gaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7Cit2YXIga2V5LCB2YWwgOiBCeXRlOworYmVnaW4KKyAgaWYgKG1hcC5Db3VudCA9IDApCisgIHRoZW4gV3JpdGVCeXRlRGlyZWN0KCAwKQorICBlbHNlIGJlZ2luCisgICAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwoIG1hcC5Db3VudCkpOworICAgIGtleSA6PSBnZXRDb21wYWN0VHlwZShtYXAuS2V5VHlwZSk7CisgICAgdmFsIDo9IGdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpOworICAgIFdyaXRlQnl0ZURpcmVjdCggKGtleSBzaGwgNCkgb3IgdmFsKTsKKyAgZW5kOworZW5kOworCisKKy8vIFdyaXRlIGEgbGlzdCBoZWFkZXIuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKK2JlZ2luCisgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBsaXN0LkVsZW1lbnRUeXBlLCBsaXN0LkNvdW50KTsKK2VuZDsKKworCisvLyBXcml0ZSBhIHNldCBoZWFkZXIuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOworYmVnaW4KKyAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIHNldF8uRWxlbWVudFR5cGUsIHNldF8uQ291bnQpOworZW5kOworCisKKy8vIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorLy8gd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKy8vIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKy8vIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUJvb2woIGI6IEJvb2xlYW4pOwordmFyIGJ0IDogVHlwZXM7CitiZWdpbgorICBpZiBiCisgIHRoZW4gYnQgOj0gVHlwZXMuQk9PTEVBTl9UUlVFCisgIGVsc2UgYnQgOj0gVHlwZXMuQk9PTEVBTl9GQUxTRTsKKworICBpZiBib29sZWFuRmllbGRfLlR5cGVfID0gVFR5cGUuQm9vbF8gdGhlbiBiZWdpbgorICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBib29sZWFuRmllbGRfLCBCeXRlKGJ0KSk7CisgICAgYm9vbGVhbkZpZWxkXy5UeXBlXyA6PSBUVHlwZS5TdG9wOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZShidCkpOworICBlbmQ7CitlbmQ7CisKKworLy8gV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZSggYjogU2hvcnRJbnQpOworYmVnaW4KKyAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKGIpKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsKK2JlZ2luCisgIFdyaXRlVmFyaW50MzIoIGludFRvWmlnWmFnKCBpMTYpKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlSTMyKCBpMzI6IEludGVnZXIpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQzMiggaW50VG9aaWdaYWcoIGkzMikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQ2NCggbG9uZ1RvWmlnemFnKCBpNjQpKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5Eb3VibGVUb0ludDY0Qml0cyggY29uc3QgZGIgOiBEb3VibGUpIDogSW50NjQ7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihkYikgPSBTaXplT2YocmVzdWx0KSk7CisgIE1vdmUoIGRiLCByZXN1bHQsIFNpemVPZihyZXN1bHQpKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5JbnQ2NEJpdHNUb0RvdWJsZSggY29uc3QgaTY0IDogSW50NjQpIDogRG91YmxlOworYmVnaW4KKyAgQVNTRVJUKCBTaXplT2YoaTY0KSA9IFNpemVPZihyZXN1bHQpKTsKKyAgTW92ZSggaTY0LCByZXN1bHQsIFNpemVPZihyZXN1bHQpKTsKK2VuZDsKKworCisvLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRG91YmxlKCBjb25zdCBkdWI6IERvdWJsZSk7Cit2YXIgZGF0YSA6IFRCeXRlczsKK2JlZ2luCisgIGZpeGVkTG9uZ1RvQnl0ZXMoIERvdWJsZVRvSW50NjRCaXRzKGR1YiksIGRhdGEpOworICBUcmFuc3BvcnQuV3JpdGUoIGRhdGEpOworZW5kOworCisKKy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwoTGVuZ3RoKGIpKSk7CisgIFRyYW5zcG9ydC5Xcml0ZSggYik7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWFwRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU2V0RW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKKy8vIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKy8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUNvbGxlY3Rpb25CZWdpbiggY29uc3QgZWxlbVR5cGUgOiBUVHlwZTsgc2l6ZSA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgc2l6ZSA8PSAxNAorICB0aGVuIFdyaXRlQnl0ZURpcmVjdCggKHNpemUgc2hsIDQpIG9yIGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkKKyAgZWxzZSBiZWdpbgorICAgIFdyaXRlQnl0ZURpcmVjdCggJEYwIG9yIGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwoc2l6ZSkpOworICBlbmQ7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVWYXJpbnQ2NCggbiA6IFVJbnQ2NCk7Cit2YXIgdmFyaW50NjRvdXQgOiBUQnl0ZXM7CisgICAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIFNldExlbmd0aCggdmFyaW50NjRvdXQsIDEwKTsKKyAgaWR4IDo9IDA7CisgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICBBU1NFUlQoIGlkeCA8IExlbmd0aCh2YXJpbnQ2NG91dCkpOworCisgICAgLy8gbGFzdCBvbmU/CisgICAgaWYgKG4gYW5kIG5vdCBVSW50NjQoJDdGKSkgPSAwIHRoZW4gYmVnaW4KKyAgICAgIHZhcmludDY0b3V0W2lkeF0gOj0gQnl0ZShuKTsKKyAgICAgIEluYyhpZHgpOworICAgICAgQnJlYWs7CisgICAgZW5kOworCisgICAgdmFyaW50NjRvdXRbaWR4XSA6PSBCeXRlKChuIGFuZCAkN0YpIG9yICQ4MCk7CisgICAgSW5jKGlkeCk7CisgICAgbiA6PSBuIHNociA3OworICBlbmQ7CisKKyAgVHJhbnNwb3J0LldyaXRlKCB2YXJpbnQ2NG91dCwgMCwgaWR4KTsKK2VuZDsKKworCisvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBJbnQ2NC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwubG9uZ1RvWmlnemFnKCBjb25zdCBuIDogSW50NjQpIDogVUludDY0OworYmVnaW4KKyAgLy8gdGhlcmUgaXMgbm8gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBpbiBEZWxwaGkKKyAgaWYgbiA+PSAwCisgIHRoZW4gcmVzdWx0IDo9IFVJbnQ2NChuIHNobCAxKQorICBlbHNlIHJlc3VsdCA6PSBVSW50NjQobiBzaGwgMSkgeG9yICRGRkZGRkZGRkZGRkZGRkZGOworZW5kOworCisKKy8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIEludGVnZXIuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKCBjb25zdCBuIDogSW50ZWdlcikgOiBDYXJkaW5hbDsKK2JlZ2luCisgIC8vIHRoZXJlIGlzIG5vIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgaW4gRGVscGhpCisgIGlmIG4gPj0gMAorICB0aGVuIHJlc3VsdCA6PSBDYXJkaW5hbChuIHNobCAxKQorICBlbHNlIHJlc3VsdCA6PSBDYXJkaW5hbChuIHNobCAxKSB4b3IgJEZGRkZGRkZGOworZW5kOworCisKKy8vIENvbnZlcnQgYSBJbnQ2NCBpbnRvIDggbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYKK2NsYXNzIHByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5maXhlZExvbmdUb0J5dGVzKCBjb25zdCBuIDogSW50NjQ7IHZhciBidWYgOiBUQnl0ZXMpOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBidWYsIDgpOworICBidWZbMF0gOj0gQnl0ZSggbiAgICAgICAgIGFuZCAkRkYpOworICBidWZbMV0gOj0gQnl0ZSgobiBzaHIgOCkgIGFuZCAkRkYpOworICBidWZbMl0gOj0gQnl0ZSgobiBzaHIgMTYpIGFuZCAkRkYpOworICBidWZbM10gOj0gQnl0ZSgobiBzaHIgMjQpIGFuZCAkRkYpOworICBidWZbNF0gOj0gQnl0ZSgobiBzaHIgMzIpIGFuZCAkRkYpOworICBidWZbNV0gOj0gQnl0ZSgobiBzaHIgNDApIGFuZCAkRkYpOworICBidWZbNl0gOj0gQnl0ZSgobiBzaHIgNDgpIGFuZCAkRkYpOworICBidWZbN10gOj0gQnl0ZSgobiBzaHIgNTYpIGFuZCAkRkYpOworZW5kOworCisKKworLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbiA6IFRUaHJpZnRNZXNzYWdlOwordmFyIHByb3RvY29sSWQsIHZlcnNpb25BbmRUeXBlLCB2ZXJzaW9uLCB0eXBlXyA6IEJ5dGU7CisgICAgc2VxaWQgOiBJbnRlZ2VyOworICAgIG1zZ05tIDogU3RyaW5nOworYmVnaW4KKyAgUmVzZXQ7CisKKyAgcHJvdG9jb2xJZCA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgIGlmIChwcm90b2NvbElkIDw+IFBST1RPQ09MX0lEKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCAnRXhwZWN0ZWQgcHJvdG9jb2wgaWQgJyArIEludFRvSGV4KFBST1RPQ09MX0lELDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYnV0IGdvdCAnICsgSW50VG9IZXgocHJvdG9jb2xJZCwyKSk7CisKKyAgdmVyc2lvbkFuZFR5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworICB2ZXJzaW9uICAgICAgICA6PSBCeXRlKCB2ZXJzaW9uQW5kVHlwZSBhbmQgVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gPD4gVkVSU0lPTikKKyAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSggJ0V4cGVjdGVkIHZlcnNpb24gJyArSW50VG9TdHIoVkVSU0lPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb1N0cih2ZXJzaW9uKSk7CisKKyAgdHlwZV8gOj0gQnl0ZSggKHZlcnNpb25BbmRUeXBlIHNociBUWVBFX1NISUZUX0FNT1VOVCkgYW5kIFRZUEVfQklUUyk7CisgIHNlcWlkIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisgIG1zZ05tIDo9IFJlYWRTdHJpbmc7CisgIEluaXQoIHJlc3VsdCwgbXNnTm0sIFRNZXNzYWdlVHlwZSh0eXBlXyksIHNlcWlkKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKy8vIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbnRvIHRoZSBmaWVsZCBzdGFjay4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKK2JlZ2luCisgIGxhc3RGaWVsZF8uUHVzaCggbGFzdEZpZWxkSWRfKTsKKyAgbGFzdEZpZWxkSWRfIDo9IDA7CisgIEluaXQoIHJlc3VsdCk7CitlbmQ7CisKKworLy8gRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKy8vIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RFbmQ7CitiZWdpbgorICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICBsYXN0RmllbGRJZF8gOj0gbGFzdEZpZWxkXy5Qb3AoKTsKK2VuZDsKKworCisvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7Cit2YXIgdHlwZV8gOiBCeXRlOworICAgIGZpZWxkSWQsIG1vZGlmaWVyIDogU2hvcnRJbnQ7CitiZWdpbgorICB0eXBlXyA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICBpZiB0eXBlXyA9IEJ5dGUoVHlwZXMuU1RPUCkgdGhlbiBiZWdpbgorICAgIEluaXQoIHJlc3VsdCwgJycsIFRUeXBlLlN0b3AsIDApOworICAgIEV4aXQ7CisgIGVuZDsKKworICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIG1vZGlmaWVyIDo9IFNob3J0SW50KCAodHlwZV8gYW5kICRGMCkgc2hyIDQpOworICBpZiAobW9kaWZpZXIgPSAwKQorICB0aGVuIGZpZWxkSWQgOj0gUmVhZEkxNiAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgIGVsc2UgZmllbGRJZCA6PSBTaG9ydEludCggbGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOyAvLyBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisKKyAgSW5pdCggcmVzdWx0LCAnJywgZ2V0VFR5cGUoQnl0ZSh0eXBlXyBhbmQgJDBGKSksIGZpZWxkSWQpOworCisgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgaWYgaXNCb29sVHlwZSh0eXBlXykgdGhlbiBiZWdpbgorICAgIGlmIEJ5dGUodHlwZV8gYW5kICQwRikgPSBCeXRlKFR5cGVzLkJPT0xFQU5fVFJVRSkKKyAgICB0aGVuIGJvb2xWYWx1ZV8gOj0gYm9vbF90cnVlCisgICAgZWxzZSBib29sVmFsdWVfIDo9IGJvb2xfZmFsc2U7CisgIGVuZDsKKworICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgbGFzdEZpZWxkSWRfIDo9IHJlc3VsdC5JRDsKK2VuZDsKKworCisvLyBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisvLyBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorLy8gImNvcnJlY3QiIHR5cGVzLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOwordmFyIHNpemUgOiBJbnRlZ2VyOworICAgIGtleUFuZFZhbHVlVHlwZSA6IEJ5dGU7CisgICAga2V5LCB2YWwgOiBUVHlwZTsKK2JlZ2luCisgIHNpemUgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKyAgaWYgc2l6ZSA9IDAKKyAgdGhlbiBrZXlBbmRWYWx1ZVR5cGUgOj0gMAorICBlbHNlIGtleUFuZFZhbHVlVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAga2V5IDo9IGdldFRUeXBlKCBCeXRlKCBrZXlBbmRWYWx1ZVR5cGUgc2hyIDQpKTsKKyAgdmFsIDo9IGdldFRUeXBlKCBCeXRlKCBrZXlBbmRWYWx1ZVR5cGUgYW5kICRGKSk7CisgIEluaXQoIHJlc3VsdCwga2V5LCB2YWwsIHNpemUpOworICBBU1NFUlQoIChyZXN1bHQuS2V5VHlwZSA9IGtleSkgYW5kIChyZXN1bHQuVmFsdWVUeXBlID0gdmFsKSk7CitlbmQ7CisKKworLy8gUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgJEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorLy8gdHJ1ZSBzaXplLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7Cit2YXIgc2l6ZV9hbmRfdHlwZSA6IEJ5dGU7CisgICAgc2l6ZSA6IEludGVnZXI7CisgICAgdHlwZV8gOiBUVHlwZTsKK2JlZ2luCisgIHNpemVfYW5kX3R5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIHNpemUgOj0gKHNpemVfYW5kX3R5cGUgc2hyIDQpIGFuZCAkMEY7CisgIGlmIChzaXplID0gMTUpCisgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworCisgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKKyAgSW5pdCggcmVzdWx0LCB0eXBlXywgc2l6ZSk7CitlbmQ7CisKKworLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgJEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorLy8gdHJ1ZSBzaXplLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OwordmFyIHNpemVfYW5kX3R5cGUgOiBCeXRlOworICAgIHNpemUgOiBJbnRlZ2VyOworICAgIHR5cGVfIDogVFR5cGU7CitiZWdpbgorICBzaXplX2FuZF90eXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICBzaXplIDo9IChzaXplX2FuZF90eXBlIHNociA0KSBhbmQgJDBGOworICBpZiAoc2l6ZSA9IDE1KQorICB0aGVuIHNpemUgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKworICB0eXBlXyA6PSBnZXRUVHlwZSggc2l6ZV9hbmRfdHlwZSk7CisgIEluaXQoIHJlc3VsdCwgdHlwZV8sIHNpemUpOworZW5kOworCisKKy8vIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKy8vIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisvLyBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEJvb2w6IEJvb2xlYW47CitiZWdpbgorICBpZiBib29sVmFsdWVfIDw+IHVudXNlZCB0aGVuIGJlZ2luCisgICAgcmVzdWx0IDo9IChib29sVmFsdWVfID0gYm9vbF90cnVlKTsKKyAgICBib29sVmFsdWVfIDo9IHVudXNlZDsKKyAgICBFeGl0OworICBlbmQ7CisKKyAgcmVzdWx0IDo9IChCeXRlKFJlYWRCeXRlKSA9IEJ5dGUoVHlwZXMuQk9PTEVBTl9UUlVFKSk7CitlbmQ7CisKKworLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEJ5dGU6IFNob3J0SW50OworYmVnaW4KKyAgVHJhbnNwb3J0LlJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKK2VuZDsKKworCisvLyBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRJMTY6IFNtYWxsSW50OworYmVnaW4KKyAgcmVzdWx0IDo9IFNtYWxsSW50KCB6aWd6YWdUb0ludCggUmVhZFZhcmludDMyKSk7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkSTMyOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IHppZ3phZ1RvSW50KCBSZWFkVmFyaW50MzIpOworZW5kOworCisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEk2NDogSW50NjQ7CitiZWdpbgorICByZXN1bHQgOj0gemlnemFnVG9Mb25nKCBSZWFkVmFyaW50NjQpOworZW5kOworCisKKy8vIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZERvdWJsZTpEb3VibGU7Cit2YXIgbG9uZ0JpdHMgOiBUQnl0ZXM7CitiZWdpbgorICBTZXRMZW5ndGgoIGxvbmdCaXRzLCA4KTsKKyAgVHJhbnNwb3J0LlJlYWRBbGwoIGxvbmdCaXRzLCAwLCA4KTsKKyAgcmVzdWx0IDo9IEludDY0Qml0c1RvRG91YmxlKCBieXRlc1RvTG9uZyggbG9uZ0JpdHMpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQmluYXJ5OiBUQnl0ZXM7Cit2YXIgbGVuZ3RoIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbmd0aCA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworICBTZXRMZW5ndGgoIHJlc3VsdCwgbGVuZ3RoKTsKKyAgaWYgKGxlbmd0aCA+IDApCisgIHRoZW4gVHJhbnNwb3J0LlJlYWRBbGwoIHJlc3VsdCwgMCwgbGVuZ3RoKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1hcEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZExpc3RFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRWYXJpbnQzMiA6IENhcmRpbmFsOwordmFyIHNoaWZ0IDogSW50ZWdlcjsKKyAgICBiIDogQnl0ZTsKK2JlZ2luCisgIHJlc3VsdCA6PSAwOworICBzaGlmdCAgOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIGIgOj0gQnl0ZSggUmVhZEJ5dGUpOworICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgKENhcmRpbmFsKGIgYW5kICQ3Rikgc2hsIHNoaWZ0KTsKKyAgICBpZiAoKGIgYW5kICQ4MCkgPD4gJDgwKQorICAgIHRoZW4gQnJlYWs7CisgICAgSW5jKCBzaGlmdCwgNyk7CisgIGVuZDsKK2VuZDsKKworCisvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFZhcmludDY0IDogVUludDY0OwordmFyIHNoaWZ0IDogSW50ZWdlcjsKKyAgICBiIDogQnl0ZTsKK2JlZ2luCisgIHJlc3VsdCA6PSAwOworICBzaGlmdCAgOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIGIgOj0gQnl0ZSggUmVhZEJ5dGUpOworICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgKFVJbnQ2NChiIGFuZCAkN0YpIHNobCBzaGlmdCk7CisgICAgaWYgKChiIGFuZCAkODApIDw+ICQ4MCkKKyAgICB0aGVuIEJyZWFrOworICAgIEluYyggc2hpZnQsIDcpOworICBlbmQ7CitlbmQ7CisKKworLy8gQ29udmVydCBmcm9tIHppZ3phZyBJbnRlZ2VyIHRvIEludGVnZXIuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCggY29uc3QgbiA6IENhcmRpbmFsICkgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IEludGVnZXIobiBzaHIgMSkgeG9yICgtSW50ZWdlcihuIGFuZCAxKSk7CitlbmQ7CisKKworLy8gQ29udmVydCBmcm9tIHppZ3phZyBJbnQ2NCB0byBJbnQ2NC4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvTG9uZyggY29uc3QgbiA6IFVJbnQ2NCkgOiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSBJbnQ2NChuIHNociAxKSB4b3IgKC1JbnQ2NChuIGFuZCAxKSk7CitlbmQ7CisKKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIEludDY0IGxpdGVyYWxzLAorLy8gb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gSW50ZWdlciBsZWZ0IDU2IGJpdHMsCisvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgSW50ZWdlci4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLmJ5dGVzVG9Mb25nKCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBJbnQ2NDsKK2JlZ2luCisgIEFTU0VSVCggTGVuZ3RoKGJ5dGVzKSA+PSA4KTsKKyAgcmVzdWx0IDo9IChJbnQ2NChieXRlc1s3XSBhbmQgJEZGKSBzaGwgNTYpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbNl0gYW5kICRGRikgc2hsIDQ4KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzVdIGFuZCAkRkYpIHNobCA0MCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1s0XSBhbmQgJEZGKSBzaGwgMzIpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbM10gYW5kICRGRikgc2hsIDI0KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzJdIGFuZCAkRkYpIHNobCAxNikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1sxXSBhbmQgJEZGKSBzaGwgIDgpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbMF0gYW5kICRGRikpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLmlzQm9vbFR5cGUoIGNvbnN0IGIgOiBieXRlKSA6IEJvb2xlYW47Cit2YXIgbG93ZXJOaWJibGUgOiBCeXRlOworYmVnaW4KKyAgbG93ZXJOaWJibGUgOj0gYiBhbmQgJDBmOworICByZXN1bHQgOj0gKFR5cGVzKGxvd2VyTmliYmxlKSBpbiBbVHlwZXMuQk9PTEVBTl9UUlVFLCBUeXBlcy5CT09MRUFOX0ZBTFNFXSk7CitlbmQ7CisKKworLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIFRUeXBlIHZhbHVlLgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuZ2V0VFR5cGUoIGNvbnN0IHR5cGVfIDogYnl0ZSkgOiBUVHlwZTsKK3ZhciB0Y3QgOiBUeXBlczsKK2JlZ2luCisgIHRjdCA6PSBUeXBlcyggdHlwZV8gYW5kICQwRik7CisgIGlmIHRjdCBpbiBbTG93KFR5cGVzKS4uSGlnaChUeXBlcyldCisgIHRoZW4gcmVzdWx0IDo9IHRjb21wYWN0VHlwZVRvVHlwZVt0Y3RdCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHRjdCkpKTsKK2VuZDsKKworCisvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuZ2V0Q29tcGFjdFR5cGUoIGNvbnN0IHR0eXBlIDogVFR5cGUpIDogQnl0ZTsKK2JlZ2luCisgIGlmIHR0eXBlIGluIFZBTElEX1RUWVBFUworICB0aGVuIHJlc3VsdCA6PSBCeXRlKCB0dHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdKQorICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnZG9uJyd0IGtub3cgd2hhdCB0eXBlOiAnK0ludFRvU3RyKE9yZCh0dHlwZSkpKTsKK2VuZDsKKworCisvLy0tLSB1bml0IHRlc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeyRJRkRFRiBEZWJ1Z30KK3Byb2NlZHVyZSBUZXN0RG91YmxlVG9JbnQ2NEJpdHM7CisKKyAgcHJvY2VkdXJlIFRlc3RQYWlyKCBjb25zdCBhIDogRG91YmxlOyBjb25zdCBiIDogSW50NjQpOworICBiZWdpbgorICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuRG91YmxlVG9JbnQ2NEJpdHMoYSkgPSBiKTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLkludDY0Qml0c1RvRG91YmxlKGIpID0gYSk7CisgIGVuZDsKKworYmVnaW4KKyAgVGVzdFBhaXIoIDEuMDAwMDAwMDAwMDAwMDAwMEUrMDAwLCAgSW50NjQoJDNGRjAwMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIDEuNTAwMDAwMDAwMDAwMDAwMEUrMDAxLCAgSW50NjQoJDQwMkUwMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIDIuNTUwMDAwMDAwMDAwMDAwMEUrMDAyLCAgSW50NjQoJDQwNkZFMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIDQuMjk0OTY3Mjk1MDAwMDAwMEUrMDA5LCAgSW50NjQoJDQxRUZGRkZGRkZFMDAwMDApKTsKKyAgVGVzdFBhaXIoIDMuOTA2MjUwMDAwMDAwMDAwMEUtMDAzLCAgSW50NjQoJDNGNzAwMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIDIuMzI4MzA2NDM2NTM4Njk2M0UtMDEwLCAgSW50NjQoJDNERjAwMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzMDAwMEUtMzAwLCAgSW50NjQoJDAxQUE3NEZFMUMxRTdFNDUpKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDUwMEUtMTUwLCAgSW50NjQoJDIwRDAyQTM2NTg2REI0QkIpKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2NUUrMDAwLCAgSW50NjQoJDNGRjNDMENBNDI4QzU5RkEpKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2N0UrMDAwLCAgSW50NjQoJDNGRjNDMENBNDI4QzU5RkIpKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMDAwLCAgSW50NjQoJDNGRjNDMENBNDI4QzU5RkMpKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMTUwLCAgSW50NjQoJDVGMTgyMzQ0Q0QzQ0RGOUYpKTsKKyAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMzAwLCAgSW50NjQoJDdFM0Q3RUU4QkNCQkQzNTIpKTsKKyAgVGVzdFBhaXIoIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgSW50NjQoJEZGRUZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdFBhaXIoIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAgSW50NjQoJDdGRUZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDY1NEUtMzI0LCAgSW50NjQoJDAwMDAwMDAwMDAwMDAwMDEpKTsKKyAgVGVzdFBhaXIoIDAuMDAwMDAwMDAwMDAwMDAwMEUrMDAwLCAgSW50NjQoJDAwMDAwMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDdFLTMyNCwgICAgSW50NjQoJDAwMDAwMDAwMDAwMDAwMDEpKTsKKyAgVGVzdFBhaXIoIDMuMjM3ODU5MjEwMDIwNjA5MkUtMzE5LCAgSW50NjQoJDAwMDAwMDAwMDAwMEZGRkYpKTsKKyAgVGVzdFBhaXIoIDEuMzkwNjcxMTYxNTY2OTk1OUUtMzA5LCAgSW50NjQoJDAwMDBGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdFBhaXIoIE5lZ0luZmluaXR5LCAgICAgICAgICAgICAgSW50NjQoJEZGRjAwMDAwMDAwMDAwMDApKTsKKyAgVGVzdFBhaXIoIEluZmluaXR5LCAgICAgICAgICAgICAgICAgSW50NjQoJDdGRjAwMDAwMDAwMDAwMDApKTsKKworICAvLyBOYU4gaXMgc3BlY2lhbAorICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRvdWJsZVRvSW50NjRCaXRzKCBOYU4pID0gSW50NjQoJEZGRjgwMDAwMDAwMDAwMDApKTsKKyAgQVNTRVJUKCBJc05hbiggVENvbXBhY3RQcm90b2NvbEltcGwuSW50NjRCaXRzVG9Eb3VibGUoIEludDY0KCRGRkY4MDAwMDAwMDAwMDAwKSkpKTsKK2VuZDsKK3skRU5ESUZ9CisKKworeyRJRkRFRiBEZWJ1Z30KK3Byb2NlZHVyZSBUZXN0WmlnWmFnOworCisgIHByb2NlZHVyZSBUZXN0MzIoIGNvbnN0IHRlc3QgOiBJbnRlZ2VyKTsKKyAgdmFyIHp6IDogQ2FyZGluYWw7CisgIGJlZ2luCisgICAgenogOj0gVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcodGVzdCk7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCh6eikgPSB0ZXN0LCBJbnRUb1N0cih0ZXN0KSk7CisgIGVuZDsKKworICBwcm9jZWR1cmUgVGVzdDY0KCBjb25zdCB0ZXN0IDogSW50NjQpOworICB2YXIgenogOiBVSW50NjQ7CisgIGJlZ2luCisgICAgenogOj0gVENvbXBhY3RQcm90b2NvbEltcGwubG9uZ1RvWmlnemFnKHRlc3QpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9Mb25nKHp6KSA9IHRlc3QsIEludFRvU3RyKHRlc3QpKTsKKyAgZW5kOworCit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygwKSAgPSAwLCAncGIgIzEgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoLTEpID0gMSwgJ3BiICMyIHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKDEpICA9IDIsICdwYiAjMyB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygtMikgPSAzLCAncGIgIzQgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoKzIxNDc0ODM2NDcpID0gNDI5NDk2NzI5NCwgJ3BiICM1IHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKC0yMTQ3NDgzNjQ4KSA9IDQyOTQ5NjcyOTUsICdwYiAjNiB0byBaaWdaYWcnKTsKKworICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCgwKSAgPSAwLCAncGIgIzEgZnJvbSBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCgxKSA9IC0xLCAncGIgIzIgZnJvbSBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCgyKSAgPSAxLCAncGIgIzMgZnJvbSBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCgzKSA9IC0yLCAncGIgIzQgZnJvbSBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCg0Mjk0OTY3Mjk0KSA9ICsyMTQ3NDgzNjQ3LCAncGIgIzUgZnJvbSBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0ludCg0Mjk0OTY3Mjk1KSA9IC0yMTQ3NDgzNjQ4LCAncGIgIzYgZnJvbSBaaWdaYWcnKTsKKworICAvLyBiYWNrIGFuZCBmb3J0aCAzMgorICBUZXN0MzIoIDApOworICBmb3IgaSA6PSAwIHRvIDMwIGRvIGJlZ2luCisgICAgVGVzdDMyKCArKEludGVnZXIoMSkgc2hsIGkpKTsKKyAgICBUZXN0MzIoIC0oSW50ZWdlcigxKSBzaGwgaSkpOworICBlbmQ7CisgIFRlc3QzMiggSW50ZWdlcigkN0ZGRkZGRkYpKTsKKyAgVGVzdDMyKCBJbnRlZ2VyKCQ4MDAwMDAwMCkpOworCisgIC8vIGJhY2sgYW5kIGZvcnRoIDY0CisgIFRlc3Q2NCggMCk7CisgIGZvciBpIDo9IDAgdG8gNjIgZG8gYmVnaW4KKyAgICBUZXN0NjQoICsoSW50NjQoMSkgc2hsIGkpKTsKKyAgICBUZXN0NjQoIC0oSW50NjQoMSkgc2hsIGkpKTsKKyAgZW5kOworICBUZXN0NjQoIEludDY0KCQ3RkZGRkZGRkZGRkZGRkZGKSk7CisgIFRlc3Q2NCggSW50NjQoJDgwMDAwMDAwMDAwMDAwMDApKTsKK2VuZDsKK3skRU5ESUZ9CisKKworeyRJRkRFRiBEZWJ1Z30KK3Byb2NlZHVyZSBUZXN0TG9uZ0J5dGVzOworCisgIHByb2NlZHVyZSBUZXN0KCBjb25zdCB0ZXN0IDogSW50NjQpOworICB2YXIgYnVmIDogVEJ5dGVzOworICBiZWdpbgorICAgIFRDb21wYWN0UHJvdG9jb2xJbXBsLmZpeGVkTG9uZ1RvQnl0ZXMoIHRlc3QsIGJ1Zik7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5ieXRlc1RvTG9uZyggYnVmKSA9IHRlc3QsIEludFRvU3RyKHRlc3QpKTsKKyAgZW5kOworCit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICBUZXN0KCAwKTsKKyAgZm9yIGkgOj0gMCB0byA2MiBkbyBiZWdpbgorICAgIFRlc3QoICsoSW50NjQoMSkgc2hsIGkpKTsKKyAgICBUZXN0KCAtKEludDY0KDEpIHNobCBpKSk7CisgIGVuZDsKKyAgVGVzdCggSW50NjQoJDdGRkZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdCggSW50NjQoJDgwMDAwMDAwMDAwMDAwMDApKTsKK2VuZDsKK3skRU5ESUZ9CisKKworeyRJRkRFRiBEZWJ1Z30KK3Byb2NlZHVyZSBVbml0VGVzdDsKK3ZhciB3IDogV09SRDsKK2NvbnN0IEZQVV9DV19ERU5PUk1BTElaRUQgPSAkMDAwMjsKK2JlZ2luCisgIHcgOj0gR2V0ODA4N0NXOworICB0cnkKKyAgICBTZXQ4MDg3Q1coIHcgb3IgRlBVX0NXX0RFTk9STUFMSVpFRCk7CisKKyAgICBUZXN0RG91YmxlVG9JbnQ2NEJpdHM7CisgICAgVGVzdFppZ1phZzsKKyAgICBUZXN0TG9uZ0J5dGVzOworCisgIGZpbmFsbHkKKyAgICBTZXQ4MDg3Q1coIHcpOworICBlbmQ7CitlbmQ7Cit7JEVORElGfQorCisKK2luaXRpYWxpemF0aW9uCisgIHskSUZERUYgRGVidWd9CisgIFVuaXRUZXN0OworICB7JEVORElGfQorCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDYwMGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCkBAIC0wLDAgKzEsMTIzNyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit7JFNDT1BFREVOVU1TIE9OfQorCit1bml0IFRocmlmdC5Qcm90b2NvbC5KU09OOworCitpbnRlcmZhY2UKKwordXNlcworICBDaGFyYWN0ZXIsCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKyAgSUpTT05Qcm90b2NvbCA9IGludGVyZmFjZSggSVByb3RvY29sKQorICAgIFsne0YwREFGREJELTY5MkEtNEI3MS05NzM2LUY1RDQ4NUEyMTc4Rn0nXQorICAgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBwcm9jZWR1cmUgUmVhZEpTT05TeW50YXhDaGFyKCBiIDogQnl0ZSk7CisgIGVuZDsKKworICAvLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgIC8vIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisgIC8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgIC8vIEFkYXB0ZWQgZnJvbSB0aGUgQyMgdmVyc2lvbi4KKyAgVEpTT05Qcm90b2NvbEltcGwgPSBjbGFzcyggVFByb3RvY29sSW1wbCwgSUpTT05Qcm90b2NvbCkKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbEZhY3RvcnkpCisgICAgICBwdWJsaWMKKyAgICAgICAgZnVuY3Rpb24gR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworICAgICAgZW5kOworCisgIHByaXZhdGUKKyAgICBjbGFzcyBmdW5jdGlvbiBHZXRUeXBlTmFtZUZvclR5cGVJRCh0eXBlSUQgOiBUVHlwZSkgOiBzdHJpbmc7CisgICAgY2xhc3MgZnVuY3Rpb24gR2V0VHlwZUlERm9yVHlwZU5hbWUoIGNvbnN0IG5hbWUgOiBzdHJpbmcpIDogVFR5cGU7CisKKyAgcHJvdGVjdGVkCisgICAgdHlwZQorICAgICAgLy8gQmFzZSBjbGFzcyBmb3IgdHJhY2tpbmcgSlNPTiBjb250ZXh0cyB0aGF0IG1heSByZXF1aXJlCisgICAgICAvLyBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMuCisgICAgICAvLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICBUSlNPTkJhc2VDb250ZXh0ID0gY2xhc3MKKyAgICAgIHByb3RlY3RlZAorICAgICAgICBGUHJvdG8gOiBQb2ludGVyOyAgLy8gd2VhayBJSlNPTlByb3RvY29sOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CisgICAgICAgIHByb2NlZHVyZSBXcml0ZTsgIHZpcnR1YWw7CisgICAgICAgIHByb2NlZHVyZSBSZWFkOyAgdmlydHVhbDsKKyAgICAgICAgZnVuY3Rpb24gRXNjYXBlTnVtYmVycyA6IEJvb2xlYW47ICB2aXJ0dWFsOworICAgICAgZW5kOworCisgICAgICAvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLgorICAgICAgLy8gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUuCisgICAgICBUSlNPTkxpc3RDb250ZXh0ID0gY2xhc3MoIFRKU09OQmFzZUNvbnRleHQpCisgICAgICBwcml2YXRlCisgICAgICAgIEZGaXJzdCA6IEJvb2xlYW47CisgICAgICBwdWJsaWMKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKKyAgICAgICAgcHJvY2VkdXJlIFdyaXRlOyAgb3ZlcnJpZGU7CisgICAgICAgIHByb2NlZHVyZSBSZWFkOyAgb3ZlcnJpZGU7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uIG9mIGVhY2ggcmVjb3JkCisgICAgICAvLyBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbiBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMKKyAgICAgIC8vIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZSBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCisgICAgICBUSlNPTlBhaXJDb250ZXh0ID0gY2xhc3MoIFRKU09OQmFzZUNvbnRleHQpCisgICAgICBwcml2YXRlCisgICAgICAgIEZGaXJzdCwgRkNvbG9uIDogQm9vbGVhbjsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworICAgICAgICBwcm9jZWR1cmUgV3JpdGU7ICBvdmVycmlkZTsKKyAgICAgICAgcHJvY2VkdXJlIFJlYWQ7ICBvdmVycmlkZTsKKyAgICAgICAgZnVuY3Rpb24gRXNjYXBlTnVtYmVycyA6IEJvb2xlYW47ICBvdmVycmlkZTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gSG9sZHMgdXAgdG8gb25lIGJ5dGUgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAgICBUTG9va2FoZWFkUmVhZGVyID0gY2xhc3MKKyAgICAgIHByb3RlY3RlZAorICAgICAgICBGUHJvdG8gOiBQb2ludGVyOyAgLy8gd2VhayBJSlNPTlByb3RvY29sOworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworCisgICAgICBwcml2YXRlCisgICAgICAgIEZIYXNEYXRhIDogQm9vbGVhbjsKKyAgICAgICAgRkRhdGEgICAgOiBCeXRlOworCisgICAgICBwdWJsaWMKKyAgICAgICAgLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQorICAgICAgICAvLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KKyAgICAgICAgZnVuY3Rpb24gUmVhZCA6IEJ5dGU7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgICAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgorICAgICAgICBmdW5jdGlvbiBQZWVrIDogQnl0ZTsKKyAgICAgIGVuZDsKKworICBwcm90ZWN0ZWQKKyAgICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgICBGQ29udGV4dFN0YWNrIDogVFN0YWNrPFRKU09OQmFzZUNvbnRleHQ+OworCisgICAgLy8gQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCisgICAgRkNvbnRleHQgOiBUSlNPTkJhc2VDb250ZXh0OworCisgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICBGUmVhZGVyIDogVExvb2thaGVhZFJlYWRlcjsKKworICAgIC8vIFB1c2gvcG9wIGEgbmV3IEpTT04gY29udGV4dCBvbnRvL2Zyb20gdGhlIHN0YWNrLgorICAgIHByb2NlZHVyZSBSZXNldENvbnRleHRTdGFjazsKKyAgICBwcm9jZWR1cmUgUHVzaENvbnRleHQoIGNvbnN0IGFDdHggOiBUSlNPTkJhc2VDb250ZXh0KTsKKyAgICBwcm9jZWR1cmUgUG9wQ29udGV4dDsKKworICBwdWJsaWMKKyAgICAvLyBUSlNPTlByb3RvY29sSW1wbCBDb25zdHJ1Y3RvcgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVRyYW5zIDogSVRyYW5zcG9ydCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgIG92ZXJyaWRlOworCisgIHByb3RlY3RlZAorICAgIC8vIElKU09OUHJvdG9jb2wKKyAgICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYjsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgcHJvY2VkdXJlIFJlYWRKU09OU3ludGF4Q2hhciggYiA6IEJ5dGUpOworCisgIHByaXZhdGUKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMgY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgICBjbGFzcyBmdW5jdGlvbiBIZXhWYWwoIGNoIDogQnl0ZSkgOiBCeXRlOworCisgICAgLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgY2xhc3MgZnVuY3Rpb24gSGV4Q2hhciggdmFsIDogQnl0ZSkgOiBCeXRlOworCisgICAgLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTlN0cmluZyggY29uc3QgYiA6IFRCeXRlcyk7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OU3RyaW5nKCBjb25zdCBzdHIgOiBzdHJpbmcpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAvLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OSW50ZWdlciggY29uc3QgbnVtIDogSW50NjQpOworCisgICAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgIC8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICBwcm9jZWR1cmUgV3JpdGVKU09ORG91YmxlKCBjb25zdCBudW0gOiBEb3VibGUpOworCisgICAgLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkIGRhdGEKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OQmFzZTY0KCBjb25zdCBiIDogVEJ5dGVzKTsKKworICAgIHByb2NlZHVyZSBXcml0ZUpTT05PYmplY3RTdGFydDsKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OT2JqZWN0RW5kOworICAgIHByb2NlZHVyZSBXcml0ZUpTT05BcnJheVN0YXJ0OworICAgIHByb2NlZHVyZSBXcml0ZUpTT05BcnJheUVuZDsKKworICBwdWJsaWMKKyAgICAvLyBJUHJvdG9jb2wKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOworICAgIC8vCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmcgOiBzdHJpbmc7ICBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJyaWRlOworCisKKyAgcHJpdmF0ZQorICAgIC8vIFJlYWRpbmcgbWV0aG9kcy4KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KKyAgICAvLyBTa2lwIFJlYWRpbmcgZnJvbSB0aGUgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgIGZ1bmN0aW9uIFJlYWRKU09OU3RyaW5nKCBza2lwQ29udGV4dCA6IEJvb2xlYW4pIDogVEJ5dGVzOworCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgZnVuY3Rpb24gSXNKU09OTnVtZXJpYyggYiA6IEJ5dGUpIDogQm9vbGVhbjsKKworICAgIC8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAvLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgZnVuY3Rpb24gUmVhZEpTT05OdW1lcmljQ2hhcnMgOiBTdHJpbmc7CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgZnVuY3Rpb24gUmVhZEpTT05JbnRlZ2VyIDogSW50NjQ7CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKKyAgICAvLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICAgIGZ1bmN0aW9uIFJlYWRKU09ORG91YmxlIDogRG91YmxlOworCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYmFzZS02NCBlbmNvZGVkIGRhdGEgYW5kIGRlY29kZSBpdC4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTkJhc2U2NCA6IFRCeXRlczsKKworICAgIHByb2NlZHVyZSBSZWFkSlNPTk9iamVjdFN0YXJ0OworICAgIHByb2NlZHVyZSBSZWFkSlNPTk9iamVjdEVuZDsKKyAgICBwcm9jZWR1cmUgUmVhZEpTT05BcnJheVN0YXJ0OworICAgIHByb2NlZHVyZSBSZWFkSlNPTkFycmF5RW5kOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKwordmFyCisgIENPTU1BICAgICA6IFRCeXRlczsKKyAgQ09MT04gICAgIDogVEJ5dGVzOworICBMQlJBQ0UgICAgOiBUQnl0ZXM7CisgIFJCUkFDRSAgICA6IFRCeXRlczsKKyAgTEJSQUNLRVQgIDogVEJ5dGVzOworICBSQlJBQ0tFVCAgOiBUQnl0ZXM7CisgIFFVT1RFICAgICA6IFRCeXRlczsKKyAgQkFDS1NMQVNIIDogVEJ5dGVzOworICBFU0NTRVEgICAgOiBUQnl0ZXM7CisKK2NvbnN0CisgIFZFUlNJT04gPSAxOworICBKU09OX0NIQVJfVEFCTEUgOiBhcnJheVswLi4kMkZdIG9mIEJ5dGUKKyAgICAgICAgICAgICAgICAgID0gKDAsMCwwLDAsIDAsMCwwLDAsIEJ5dGUoJ2InKSxCeXRlKCd0JyksQnl0ZSgnbicpLDAsIEJ5dGUoJ2YnKSxCeXRlKCdyJyksMCwwLAorICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwgIDAsMCwwLDAsCisgICAgICAgICAgICAgICAgICAgICAxLDEsQnl0ZSgnIicpLDEsICAxLDEsMSwxLCAxLDEsMSwxLCAxLDEsMSwxKTsKKworICBFU0NBUEVfQ0hBUlMgICAgID0gJyJcL2J0bmZyJzsKKyAgRVNDQVBFX0NIQVJfVkFMUyA9ICciXC8nIzgjOSMxMCMxMiMxMzsKKworICBERUZfU1RSSU5HX1NJWkUgPSAxNjsKKworICBOQU1FX0JPT0wgICA9ICd0Zic7CisgIE5BTUVfQllURSAgID0gJ2k4JzsKKyAgTkFNRV9JMTYgICAgPSAnaTE2JzsKKyAgTkFNRV9JMzIgICAgPSAnaTMyJzsKKyAgTkFNRV9JNjQgICAgPSAnaTY0JzsKKyAgTkFNRV9ET1VCTEUgPSAnZGJsJzsKKyAgTkFNRV9TVFJVQ1QgPSAncmVjJzsKKyAgTkFNRV9TVFJJTkcgPSAnc3RyJzsKKyAgTkFNRV9NQVAgICAgPSAnbWFwJzsKKyAgTkFNRV9MSVNUICAgPSAnbHN0JzsKKyAgTkFNRV9TRVQgICAgPSAnc2V0JzsKKworICBJTlZBUklBTlRfQ1VMVFVSRSA6IFRGb3JtYXRTZXR0aW5ncworICAgICAgICAgICAgICAgICAgICA9ICggVGhvdXNhbmRTZXBhcmF0b3I6ICcsJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxTZXBhcmF0b3I6ICcuJyk7CisKKworCisvLy0tLSBUSlNPTlByb3RvY29sSW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworYmVnaW4KKyAgcmVzdWx0IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSh0cmFucyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLkdldFR5cGVOYW1lRm9yVHlwZUlEKHR5cGVJRCA6IFRUeXBlKSA6IHN0cmluZzsKK2JlZ2luCisgIGNhc2UgdHlwZUlEIG9mCisgICAgVFR5cGUuQm9vbF86ICAgIHJlc3VsdCA6PSBOQU1FX0JPT0w7CisgICAgVFR5cGUuQnl0ZV86ICAgIHJlc3VsdCA6PSBOQU1FX0JZVEU7CisgICAgVFR5cGUuSTE2OiAgICAgIHJlc3VsdCA6PSBOQU1FX0kxNjsKKyAgICBUVHlwZS5JMzI6ICAgICAgcmVzdWx0IDo9IE5BTUVfSTMyOworICAgIFRUeXBlLkk2NDogICAgICByZXN1bHQgOj0gTkFNRV9JNjQ7CisgICAgVFR5cGUuRG91YmxlXzogIHJlc3VsdCA6PSBOQU1FX0RPVUJMRTsKKyAgICBUVHlwZS5TdHJpbmdfOiAgcmVzdWx0IDo9IE5BTUVfU1RSSU5HOworICAgIFRUeXBlLlN0cnVjdDogICByZXN1bHQgOj0gTkFNRV9TVFJVQ1Q7CisgICAgVFR5cGUuTWFwOiAgICAgIHJlc3VsdCA6PSBOQU1FX01BUDsKKyAgICBUVHlwZS5TZXRfOiAgICAgcmVzdWx0IDo9IE5BTUVfU0VUOworICAgIFRUeXBlLkxpc3Q6ICAgICByZXN1bHQgOj0gTkFNRV9MSVNUOworICBlbHNlCisgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQuQ3JlYXRlKCdVbnJlY29nbml6ZWQgdHlwZSAoJytJbnRUb1N0cihPcmQodHlwZUlEKSkrJyknKTsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLkdldFR5cGVJREZvclR5cGVOYW1lKCBjb25zdCBuYW1lIDogc3RyaW5nKSA6IFRUeXBlOworYmVnaW4KKyAgaWYgICAgICBuYW1lID0gTkFNRV9CT09MICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuQm9vbF8KKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9CWVRFICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuQnl0ZV8KKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9JMTYgICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuSTE2CisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfSTMyICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkkzMgorICBlbHNlIGlmIG5hbWUgPSBOQU1FX0k2NCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5JNjQKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9ET1VCTEUgdGhlbiByZXN1bHQgOj0gVFR5cGUuRG91YmxlXworICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NUUlVDVCB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TdHJ1Y3QKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9TVFJJTkcgdGhlbiByZXN1bHQgOj0gVFR5cGUuU3RyaW5nXworICBlbHNlIGlmIG5hbWUgPSBOQU1FX01BUCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5NYXAKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9MSVNUICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuTGlzdAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NFVCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TZXRfCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQuQ3JlYXRlKCdVbnJlY29nbml6ZWQgdHlwZSAoJytuYW1lKycpJyk7CitlbmQ7CisKKworY29uc3RydWN0b3IgVEpTT05Qcm90b2NvbEltcGwuVEpTT05CYXNlQ29udGV4dC5DcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlByb3RvIDo9IFBvaW50ZXIoYVByb3RvKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05CYXNlQ29udGV4dC5Xcml0ZTsKK2JlZ2luCisgIC8vIG5vdGhpbmcKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05CYXNlQ29udGV4dC5SZWFkOworYmVnaW4KKyAgLy8gbm90aGluZworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OQmFzZUNvbnRleHQuRXNjYXBlTnVtYmVycyA6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gRkFMU0U7CitlbmQ7CisKKworY29uc3RydWN0b3IgVEpTT05Qcm90b2NvbEltcGwuVEpTT05MaXN0Q29udGV4dC5DcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYVByb3RvKTsKKyAgRkZpcnN0IDo9IFRSVUU7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OTGlzdENvbnRleHQuV3JpdGU7CitiZWdpbgorICBpZiBGRmlyc3QKKyAgdGhlbiBGRmlyc3QgOj0gRkFMU0UKKyAgZWxzZSBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LldyaXRlKCBDT01NQSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OTGlzdENvbnRleHQuUmVhZDsKK2JlZ2luCisgIGlmIEZGaXJzdAorICB0aGVuIEZGaXJzdCA6PSBGQUxTRQorICBlbHNlIElKU09OUHJvdG9jb2woRlByb3RvKS5SZWFkSlNPTlN5bnRheENoYXIoIENPTU1BWzBdKTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5USlNPTlBhaXJDb250ZXh0LkNyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhUHJvdG8pOworICBGRmlyc3QgOj0gVFJVRTsKKyAgRkNvbG9uIDo9IFRSVUU7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OUGFpckNvbnRleHQuV3JpdGU7CitiZWdpbgorICBpZiBGRmlyc3QgdGhlbiBiZWdpbgorICAgIEZGaXJzdCA6PSBGQUxTRTsKKyAgICBGQ29sb24gOj0gVFJVRTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBGQ29sb24KKyAgICB0aGVuIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuV3JpdGUoIENPTE9OKQorICAgIGVsc2UgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5Xcml0ZSggQ09NTUEpOworICAgIEZDb2xvbiA6PSBub3QgRkNvbG9uOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OUGFpckNvbnRleHQuUmVhZDsKK2JlZ2luCisgIGlmIEZGaXJzdCB0aGVuIGJlZ2luCisgICAgRkZpcnN0IDo9IEZBTFNFOworICAgIEZDb2xvbiA6PSBUUlVFOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZDb2xvbgorICAgIHRoZW4gSUpTT05Qcm90b2NvbChGUHJvdG8pLlJlYWRKU09OU3ludGF4Q2hhciggQ09MT05bMF0pCisgICAgZWxzZSBJSlNPTlByb3RvY29sKEZQcm90bykuUmVhZEpTT05TeW50YXhDaGFyKCBDT01NQVswXSk7CisgICAgRkNvbG9uIDo9IG5vdCBGQ29sb247CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5USlNPTlBhaXJDb250ZXh0LkVzY2FwZU51bWJlcnMgOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IEZDb2xvbjsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5UTG9va2FoZWFkUmVhZGVyLkNyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUHJvdG8gICA6PSBQb2ludGVyKGFQcm90byk7CisgIEZIYXNEYXRhIDo9IEZBTFNFOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlRMb29rYWhlYWRSZWFkZXIuUmVhZCA6IEJ5dGU7CitiZWdpbgorICBpZiBGSGFzRGF0YQorICB0aGVuIEZIYXNEYXRhIDo9IEZBTFNFCisgIGVsc2UgYmVnaW4KKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CisgIGVuZDsKKyAgcmVzdWx0IDo9IEZEYXRhOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlRMb29rYWhlYWRSZWFkZXIuUGVlayA6IEJ5dGU7CitiZWdpbgorICBpZiBub3QgRkhhc0RhdGEgdGhlbiBiZWdpbgorICAgIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuUmVhZEFsbCggQEZEYXRhLCBTaXplT2YoRkRhdGEpLCAwLCAxKTsKKyAgICBGSGFzRGF0YSA6PSBUUlVFOworICBlbmQ7CisgIHJlc3VsdCA6PSBGRGF0YTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoIGNvbnN0IGFUcmFucyA6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYVRyYW5zKTsKKworICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgRkNvbnRleHRTdGFjayA6PSBUU3RhY2s8VEpTT05CYXNlQ29udGV4dD4uQ3JlYXRlOworCisgIEZDb250ZXh0IDo9IFRKU09OQmFzZUNvbnRleHQuQ3JlYXRlKCBTZWxmKTsKKyAgRlJlYWRlciAgOj0gVExvb2thaGVhZFJlYWRlci5DcmVhdGUoIFNlbGYpOworZW5kOworCisKK2Rlc3RydWN0b3IgVEpTT05Qcm90b2NvbEltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gZnJlZSBhbnkgY29udGVudHMKKyAgICBGcmVlQW5kTmlsKCBGUmVhZGVyKTsKKyAgICBGcmVlQW5kTmlsKCBGQ29udGV4dCk7CisgICAgRnJlZUFuZE5pbCggRkNvbnRleHRTdGFjayk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZXNldENvbnRleHRTdGFjazsKK2JlZ2luCisgIHdoaWxlIEZDb250ZXh0U3RhY2suQ291bnQgPiAwCisgIGRvIFBvcENvbnRleHQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlB1c2hDb250ZXh0KCBjb25zdCBhQ3R4IDogVEpTT05CYXNlQ29udGV4dCk7CitiZWdpbgorICBGQ29udGV4dFN0YWNrLlB1c2goIEZDb250ZXh0KTsKKyAgRkNvbnRleHQgOj0gYUN0eDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUG9wQ29udGV4dDsKK2JlZ2luCisgIEZyZWVBbmROaWwoRkNvbnRleHQpOworICBGQ29udGV4dCA6PSBGQ29udGV4dFN0YWNrLlBvcDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05TeW50YXhDaGFyKCBiIDogQnl0ZSk7Cit2YXIgY2ggOiBCeXRlOworYmVnaW4KKyAgY2ggOj0gRlJlYWRlci5SZWFkOworICBpZiAoY2ggPD4gYikKKyAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyICgnK0NoYXIoY2gpKycpJyk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuSGV4VmFsKCBjaCA6IEJ5dGUpIDogQnl0ZTsKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIGkgOj0gU3RyVG9JbnREZWYoICckMCcrQ2hhcihjaCksIC0xKTsKKyAgaWYgKDAgPD0gaSkgYW5kIChpIDwgJDEwKQorICB0aGVuIHJlc3VsdCA6PSBpCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoZXggY2hhcmFjdGVyICgnK0NoYXIoY2gpKycpJyk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuSGV4Q2hhciggdmFsIDogQnl0ZSkgOiBCeXRlOworY29uc3QgSEVYQ0hBUlMgPSAnMDEyMzQ1Njc4OUFCQ0RFRic7CitiZWdpbgorICByZXN1bHQgOj0gQnl0ZSggUENoYXIoSEVYQ0hBUlMpW3ZhbCBhbmQgJDBGXSk7CisgIEFTU0VSVCggUG9zKCBDaGFyKHJlc3VsdCksIEhFWENIQVJTKSA+IDApOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05TdHJpbmcoIGNvbnN0IHN0ciA6IHN0cmluZyk7CitiZWdpbgorICBXcml0ZUpTT05TdHJpbmcoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBzdHIpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OU3RyaW5nKCBjb25zdCBiIDogVEJ5dGVzKTsKK3ZhciBpIDogSW50ZWdlcjsKKyAgICB0bXAgOiBUQnl0ZXM7CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKyAgVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CisgIGZvciBpIDo9IDAgdG8gTGVuZ3RoKGIpLTEgZG8gYmVnaW4KKworICAgIGlmIChiW2ldIGFuZCAkMDBGRikgPj0gJDMwIHRoZW4gYmVnaW4KKworICAgICAgaWYgKGJbaV0gPSBCQUNLU0xBU0hbMF0pIHRoZW4gYmVnaW4KKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCBCQUNLU0xBU0gpOworICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEJBQ0tTTEFTSCk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCBiLCBpLCAxKTsKKyAgICAgIGVuZDsKKworICAgIGVuZAorICAgIGVsc2UgYmVnaW4KKyAgICAgIFNldExlbmd0aCggdG1wLCAyKTsKKyAgICAgIHRtcFswXSA6PSBKU09OX0NIQVJfVEFCTEVbYltpXV07CisgICAgICBpZiAodG1wWzBdID0gMSkgdGhlbiBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIGIsIGksIDEpCisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHRtcFswXSA+IDEpIHRoZW4gYmVnaW4KKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCBCQUNLU0xBU0gpOworICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIHRtcCwgMCwgMSk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgVHJhbnNwb3J0LldyaXRlKCBFU0NTRVEpOworICAgICAgICB0bXBbMF0gOj0gSGV4Q2hhciggYltpXSBkaXYgJDEwKTsKKyAgICAgICAgdG1wWzFdIDo9IEhleENoYXIoIGJbaV0pOworICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIHRtcCwgMCwgMik7CisgICAgICBlbmQ7CisgICAgZW5kOworICBlbmQ7CisgIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05JbnRlZ2VyKCBjb25zdCBudW0gOiBJbnQ2NCk7Cit2YXIgc3RyIDogU3RyaW5nOworICAgIGVzY2FwZU51bSA6IEJvb2xlYW47CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKyAgc3RyIDo9IEludFRvU3RyKG51bSk7CisKKyAgZXNjYXBlTnVtIDo9IEZDb250ZXh0LkVzY2FwZU51bWJlcnM7CisgIGlmIGVzY2FwZU51bQorICB0aGVuIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworCisgIFRyYW5zcG9ydC5Xcml0ZSggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIHN0cikpOworCisgIGlmIGVzY2FwZU51bQorICB0aGVuIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05Eb3VibGUoIGNvbnN0IG51bSA6IERvdWJsZSk7Cit2YXIgc3RyIDogc3RyaW5nOworICAgIHNwZWNpYWwgOiBCb29sZWFuOworICAgIGVzY2FwZU51bSA6IEJvb2xlYW47CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKworICBzdHIgOj0gRmxvYXRUb1N0ciggbnVtLCBJTlZBUklBTlRfQ1VMVFVSRSk7CisgIHNwZWNpYWwgOj0gRkFMU0U7CisKKyAgY2FzZSBVcENhc2Uoc3RyWzFdKSBvZgorICAgICdOJyA6IHNwZWNpYWwgOj0gVFJVRTsgIC8vIE5hTgorICAgICdJJyA6IHNwZWNpYWwgOj0gVFJVRTsgIC8vIEluZmluaXR5CisgICAgJy0nIDogc3BlY2lhbCA6PSAoVXBDYXNlKHN0clsyXSkgPSAnSScpOyAvLyAtSW5maW5pdHkKKyAgZW5kOworCisgIGVzY2FwZU51bSA6PSBzcGVjaWFsIG9yIEZDb250ZXh0LkVzY2FwZU51bWJlcnM7CisKKworICBpZiBlc2NhcGVOdW0KKyAgdGhlbiBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKKworICBUcmFuc3BvcnQuV3JpdGUoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBzdHIpKTsKKworICBpZiBlc2NhcGVOdW0KKyAgdGhlbiBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OQmFzZTY0KCBjb25zdCBiIDogVEJ5dGVzKTsKK3ZhciBsZW4sIG9mZiwgY250IDogSW50ZWdlcjsKKyAgICB0bXBCdWYgOiBUQnl0ZXM7CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKyAgVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CisKKyAgbGVuIDo9IExlbmd0aChiKTsKKyAgb2ZmIDo9IDA7CisgIFNldExlbmd0aCggdG1wQnVmLCA0KTsKKworICB3aGlsZSBsZW4gPj0gMyBkbyBiZWdpbgorICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIEJhc2U2NFV0aWxzLkVuY29kZSggYiwgb2ZmLCAzLCB0bXBCdWYsIDApOworICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wQnVmLCAwLCA0KTsKKyAgICBJbmMoIG9mZiwgMyk7CisgICAgRGVjKCBsZW4sIDMpOworICBlbmQ7CisKKyAgLy8gRW5jb2RlIHJlbWFpbmRlciwgaWYgYW55CisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIGNudCA6PSBCYXNlNjRVdGlscy5FbmNvZGUoIGIsIG9mZiwgbGVuLCB0bXBCdWYsIDApOworICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wQnVmLCAwLCBjbnQpOworICBlbmQ7CisKKyAgVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTk9iamVjdFN0YXJ0OworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisgIFRyYW5zcG9ydC5Xcml0ZSggTEJSQUNFKTsKKyAgUHVzaENvbnRleHQoIFRKU09OUGFpckNvbnRleHQuQ3JlYXRlKCBTZWxmKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTk9iamVjdEVuZDsKK2JlZ2luCisgIFBvcENvbnRleHQ7CisgIFRyYW5zcG9ydC5Xcml0ZSggUkJSQUNFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OQXJyYXlTdGFydDsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBUcmFuc3BvcnQuV3JpdGUoIExCUkFDS0VUKTsKKyAgUHVzaENvbnRleHQoIFRKU09OTGlzdENvbnRleHQuQ3JlYXRlKCBTZWxmKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkFycmF5RW5kOworYmVnaW4KKyAgUG9wQ29udGV4dDsKKyAgVHJhbnNwb3J0LldyaXRlKCBSQlJBQ0tFVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogVFRocmlmdE1lc3NhZ2UpOworYmVnaW4KKyAgUmVzZXRDb250ZXh0U3RhY2s7ICAvLyBUSFJJRlQtMTQ3MworCisgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CisgIFdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CisKKyAgV3JpdGVKU09OU3RyaW5nKCBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggYU1zZy5OYW1lKSk7CisKKyAgV3JpdGVKU09OSW50ZWdlciggTG9uZ0ludCggYU1zZy5UeXBlXykpOworICBXcml0ZUpTT05JbnRlZ2VyKCBhTXNnLlNlcUlEKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CitiZWdpbgorICBXcml0ZUpTT05PYmplY3RTdGFydDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RFbmQ7CitiZWdpbgorICBXcml0ZUpTT05PYmplY3RFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgV3JpdGVKU09OSW50ZWdlcihmaWVsZC5JRCk7CisgIFdyaXRlSlNPTk9iamVjdFN0YXJ0OworICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkLlR5cGVfKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7CitiZWdpbgorICBXcml0ZUpTT05PYmplY3RFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlRmllbGRTdG9wOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CisgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC5LZXlUeXBlKSk7CisgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC5WYWx1ZVR5cGUpKTsKKyAgV3JpdGVKU09OSW50ZWdlciggbWFwLkNvdW50KTsKKyAgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWFwRW5kOworYmVnaW4KKyAgV3JpdGVKU09OT2JqZWN0RW5kOworICBXcml0ZUpTT05BcnJheUVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CisgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIGxpc3QuRWxlbWVudFR5cGUpKTsKKyAgV3JpdGVKU09OSW50ZWdlcihsaXN0LkNvdW50KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVMaXN0RW5kOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQpOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggc2V0Xy5FbGVtZW50VHlwZSkpOworICBXcml0ZUpTT05JbnRlZ2VyKCBzZXRfLkNvdW50KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorICBXcml0ZUpTT05BcnJheUVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlQm9vbCggYjogQm9vbGVhbik7CitiZWdpbgorICBpZiBiCisgIHRoZW4gV3JpdGVKU09OSW50ZWdlciggMSkKKyAgZWxzZSBXcml0ZUpTT05JbnRlZ2VyKCAwKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlQnl0ZSggYjogU2hvcnRJbnQpOworYmVnaW4KKyAgV3JpdGVKU09OSW50ZWdlciggYik7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUkxNiggaTE2OiBTbWFsbEludCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKCBpMTYpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKCBpMzIpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOworYmVnaW4KKyAgV3JpdGVKU09OSW50ZWdlcihpNjQpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CitiZWdpbgorICBXcml0ZUpTT05Eb3VibGUoIGQpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOworYmVnaW4KKyAgV3JpdGVKU09OU3RyaW5nKCBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggcykpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBXcml0ZUpTT05CYXNlNjQoIGIpOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OU3RyaW5nKCBza2lwQ29udGV4dCA6IEJvb2xlYW4pIDogVEJ5dGVzOwordmFyIGJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CisgICAgY2ggIDogQnl0ZTsKKyAgICB3Y2ggOiBXb3JkOworICAgIGhpZ2hTdXJvZ2F0ZTogQ2hhcjsKKyAgICBzdXJyb2dhdGVQYWlyczogQXJyYXlbMC4uMV0gb2YgQ2hhcjsKKyAgICBvZmYgOiBJbnRlZ2VyOworICAgIHRtcCA6IFRCeXRlczsKK2JlZ2luCisgIGhpZ2hTdXJvZ2F0ZSA6PSAjMDsKKyAgYnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICB0cnkKKyAgICBpZiBub3Qgc2tpcENvbnRleHQKKyAgICB0aGVuIEZDb250ZXh0LlJlYWQ7CisKKyAgICBSZWFkSlNPTlN5bnRheENoYXIoIFFVT1RFWzBdKTsKKworICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgIGNoIDo9IEZSZWFkZXIuUmVhZDsKKworICAgICAgaWYgKGNoID0gUVVPVEVbMF0pCisgICAgICB0aGVuIEJyZWFrOworCisgICAgICAvLyBjaGVjayBmb3IgZXNjYXBlcworICAgICAgaWYgKGNoIDw+IEVTQ1NFUVswXSkgdGhlbiBiZWdpbgorICAgICAgICBidWZmZXIuV3JpdGUoIGNoLCAxKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIGRpc3R1aW5ndWlzaCBiZXR3ZWVuIFx1Tk5OTiBhbmQgXD8KKyAgICAgIGNoIDo9IEZSZWFkZXIuUmVhZDsKKyAgICAgIGlmIChjaCA8PiBFU0NTRVFbMV0pCisgICAgICB0aGVuIGJlZ2luCisgICAgICAgIG9mZiA6PSBQb3MoIENoYXIoY2gpLCBFU0NBUEVfQ0hBUlMpOworICAgICAgICBpZiBvZmYgPCAxCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBjb250cm9sIGNoYXInKTsKKyAgICAgICAgY2ggOj0gQnl0ZSggRVNDQVBFX0NIQVJfVkFMU1tvZmZdKTsKKyAgICAgICAgYnVmZmVyLldyaXRlKCBjaCwgMSk7CisgICAgICAgIENvbnRpbnVlOworICAgICAgZW5kOworCisgICAgICAvLyBpdCBpcyBcdVhYWFgKKyAgICAgIFNldExlbmd0aCggdG1wLCA0KTsKKyAgICAgIFRyYW5zcG9ydC5SZWFkQWxsKCB0bXAsIDAsIDQpOworICAgICAgd2NoIDo9IChIZXhWYWwodG1wWzBdKSBzaGwgMTIpCisgICAgICAgICAgICsgKEhleFZhbCh0bXBbMV0pIHNobCA4KQorICAgICAgICAgICArIChIZXhWYWwodG1wWzJdKSBzaGwgNCkKKyAgICAgICAgICAgKyAgSGV4VmFsKHRtcFszXSk7CisKKyAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBVVEY4IGJ5dGVzIGZyb20gaXQsIHRvIGJlIGRlY29kZWQgbGF0ZXIKKyAgICAgIGlmIENoYXJVdGlscy5Jc0hpZ2hTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA8PiAjMAorICAgICAgICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIGhpZ2hTdXJvZ2F0ZSA6PSBjaGFyKHdjaCk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgQ2hhclV0aWxzLklzTG93U3Vycm9nYXRlKGNoYXIod2NoKSkgdGhlbiBiZWdpbgorICAgICAgICBpZiBoaWdoU3Vyb2dhdGUgPSAjMAorICAgICAgICB0aGVuIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhcicpOworICAgICAgICBzdXJyb2dhdGVQYWlyc1swXSA6PSBoaWdoU3Vyb2dhdGU7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzFdIDo9IGNoYXIod2NoKTsKKyAgICAgICAgdG1wIDo9IFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN1cnJvZ2F0ZVBhaXJzKTsKKyAgICAgICAgYnVmZmVyLldyaXRlKCB0bXBbMF0sIExlbmd0aCh0bXApKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9ICMwOworICAgICAgZW5kCisgICAgICBlbHNlIGJlZ2luCisgICAgICAgIHRtcCA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhDaGFyKHdjaCkpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIGlmIGhpZ2hTdXJvZ2F0ZSA8PiAjMAorICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKworICAgIFNldExlbmd0aCggcmVzdWx0LCBidWZmZXIuU2l6ZSk7CisgICAgaWYgYnVmZmVyLlNpemUgPiAwIHRoZW4gTW92ZSggYnVmZmVyLk1lbW9yeV4sIHJlc3VsdFswXSwgTGVuZ3RoKHJlc3VsdCkpOworCisgIGZpbmFsbHkKKyAgICBidWZmZXIuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLklzSlNPTk51bWVyaWMoIGIgOiBCeXRlKSA6IEJvb2xlYW47Citjb25zdCBOVU1DSEFSUyA9IFsnKycsJy0nLCcuJywnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ0UnLCdlJ107CitiZWdpbgorICByZXN1bHQgOj0gQ2hhckluU2V0KCBDaGFyKGIpLCBOVU1DSEFSUyk7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05OdW1lcmljQ2hhcnMgOiBzdHJpbmc7Cit2YXIgc3RyYmxkIDogVFRocmlmdFN0cmluZ0J1aWxkZXI7CisgICAgY2ggOiBCeXRlOworYmVnaW4KKyAgc3RyYmxkIDo9IFRUaHJpZnRTdHJpbmdCdWlsZGVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgY2ggOj0gRlJlYWRlci5QZWVrOworICAgICAgaWYgSXNKU09OTnVtZXJpYyhjaCkKKyAgICAgIHRoZW4gc3RyYmxkLkFwcGVuZCggQ2hhcihGUmVhZGVyLlJlYWQpKQorICAgICAgZWxzZSBCcmVhazsKKyAgICBlbmQ7CisgICAgcmVzdWx0IDo9IHN0cmJsZC5Ub1N0cmluZzsKKworICBmaW5hbGx5CisgICAgc3RyYmxkLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTkludGVnZXIgOiBJbnQ2NDsKK3ZhciBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBGQ29udGV4dC5SZWFkOworICBpZiBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzCisgIHRoZW4gUmVhZEpTT05TeW50YXhDaGFyKCBRVU9URVswXSk7CisKKyAgc3RyIDo9IFJlYWRKU09OTnVtZXJpY0NoYXJzOworCisgIGlmIEZDb250ZXh0LkVzY2FwZU51bWJlcnMKKyAgdGhlbiBSZWFkSlNPTlN5bnRheENoYXIoIFFVT1RFWzBdKTsKKworICB0cnkKKyAgICByZXN1bHQgOj0gU3RyVG9JbnQ2NChzdHIpOworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTkRvdWJsZSA6IERvdWJsZTsKK3ZhciBkdWIgOiBEb3VibGU7CisgICAgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgRkNvbnRleHQuUmVhZDsKKworICBpZiBGUmVhZGVyLlBlZWsgPSBRVU9URVswXQorICB0aGVuIGJlZ2luCisgICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoIFRSVUUpKTsKKyAgICBkdWIgOj0gU3RyVG9GbG9hdCggc3RyLCBJTlZBUklBTlRfQ1VMVFVSRSk7CisKKyAgICBpZiBub3QgRkNvbnRleHQuRXNjYXBlTnVtYmVycygpCisgICAgYW5kIG5vdCBNYXRoLklzTmFOKGR1YikKKyAgICBhbmQgbm90IE1hdGguSXNJbmZpbml0ZShkdWIpCisgICAgdGhlbiBiZWdpbgorICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gIFNlbGYgY2FzZQorICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCcpOworICAgIGVuZDsKKyAgICByZXN1bHQgOj0gZHViOworICAgIEV4aXQ7CisgIGVuZDsKKworICAvLyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgaWYgRkNvbnRleHQuRXNjYXBlTnVtYmVycworICB0aGVuIFJlYWRKU09OU3ludGF4Q2hhciggUVVPVEVbMF0pOworCisgIHRyeQorICAgIHN0ciA6PSBSZWFkSlNPTk51bWVyaWNDaGFyczsKKyAgICByZXN1bHQgOj0gU3RyVG9GbG9hdCggc3RyLCBJTlZBUklBTlRfQ1VMVFVSRSk7CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OQmFzZTY0IDogVEJ5dGVzOwordmFyIGIgOiBUQnl0ZXM7CisgICAgbGVuLCBvZmYsIHNpemUgOiBJbnRlZ2VyOworYmVnaW4KKyAgYiA6PSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisKKyAgbGVuIDo9IExlbmd0aChiKTsKKyAgb2ZmIDo9IDA7CisgIHNpemUgOj0gMDsKKworICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgIERlYyhsZW4pOworICB3aGlsZSAobGVuID49IDApIGFuZCAoYltsZW5dID0gQnl0ZSgnPScpKSBkbyBEZWMobGVuKTsKKyAgSW5jKGxlbik7CisKKyAgLy8gcmVhZCAmIGRlY29kZSBmdWxsIGJ5dGUgdHJpcGxldHMgPSA0IHNvdXJjZSBieXRlcworICB3aGlsZSAobGVuID49IDQpIGRvIGJlZ2luCisgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgSW5jKCBzaXplLCBCYXNlNjRVdGlscy5EZWNvZGUoIGIsIG9mZiwgNCwgYiwgc2l6ZSkpOyAvLyBkZWNvZGVkIGluIHBsYWNlCisgICAgSW5jKCBvZmYsIDQpOworICAgIERlYyggbGVuLCA0KTsKKyAgZW5kOworCisgIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAorICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgIGlmIGxlbiA+IDEgdGhlbiBiZWdpbgorICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICBJbmMoIHNpemUsIEJhc2U2NFV0aWxzLkRlY29kZSggYiwgb2ZmLCBsZW4sIGIsIHNpemUpKTsgLy8gZGVjb2RlZCBpbiBwbGFjZQorICBlbmQ7CisKKyAgLy8gcmVzaXplIHRvIGZpbmFsIHNpemUgYW5kIHJldHVybiB0aGUgZGF0YQorICBTZXRMZW5ndGgoIGIsIHNpemUpOworICByZXN1bHQgOj0gYjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05PYmplY3RTdGFydDsKK2JlZ2luCisgIEZDb250ZXh0LlJlYWQ7CisgIFJlYWRKU09OU3ludGF4Q2hhciggTEJSQUNFWzBdKTsKKyAgUHVzaENvbnRleHQoIFRKU09OUGFpckNvbnRleHQuQ3JlYXRlKCBTZWxmKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OT2JqZWN0RW5kOworYmVnaW4KKyAgUmVhZEpTT05TeW50YXhDaGFyKCBSQlJBQ0VbMF0pOworICBQb3BDb250ZXh0OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTkFycmF5U3RhcnQ7CitiZWdpbgorICBGQ29udGV4dC5SZWFkOworICBSZWFkSlNPTlN5bnRheENoYXIoIExCUkFDS0VUWzBdKTsKKyAgUHVzaENvbnRleHQoIFRKU09OTGlzdENvbnRleHQuQ3JlYXRlKCBTZWxmKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OQXJyYXlFbmQ7CitiZWdpbgorICBSZWFkSlNPTlN5bnRheENoYXIoIFJCUkFDS0VUWzBdKTsKKyAgUG9wQ29udGV4dDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKKworICBJbml0KCByZXN1bHQpOworICBSZWFkSlNPTkFycmF5U3RhcnQ7CisKKyAgaWYgUmVhZEpTT05JbnRlZ2VyIDw+IFZFUlNJT04KKyAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uJyk7CisKKyAgcmVzdWx0Lk5hbWUgIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoIEZBTFNFKSk7CisgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIFJlYWRKU09OSW50ZWdlcik7CisgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlRW5kOworYmVnaW4KKyAgUmVhZEpTT05BcnJheUVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW4gOiBUVGhyaWZ0U3RydWN0IDsKK2JlZ2luCisgIFJlYWRKU09OT2JqZWN0U3RhcnQ7CisgIEluaXQoIHJlc3VsdCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RFbmQ7CitiZWdpbgorICBSZWFkSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbiA6IFRUaHJpZnRGaWVsZDsKK3ZhciBjaCA6IEJ5dGU7CisgICAgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgY2ggOj0gRlJlYWRlci5QZWVrOworICBpZiBjaCA9IFJCUkFDRVswXQorICB0aGVuIHJlc3VsdC5UeXBlXyA6PSBUVHlwZS5TdG9wCisgIGVsc2UgYmVnaW4KKyAgICByZXN1bHQuSUQgOj0gUmVhZEpTT05JbnRlZ2VyOworICAgIFJlYWRKU09OT2JqZWN0U3RhcnQ7CisKKyAgICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKKyAgICByZXN1bHQuVHlwZV8gOj0gR2V0VHlwZUlERm9yVHlwZU5hbWUoIHN0cik7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOworYmVnaW4KKyAgUmVhZEpTT05PYmplY3RFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luIDogVFRocmlmdE1hcDsKK3ZhciBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBJbml0KCByZXN1bHQpOworICBSZWFkSlNPTkFycmF5U3RhcnQ7CisKKyAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKKyAgcmVzdWx0LktleVR5cGUgOj0gR2V0VHlwZUlERm9yVHlwZU5hbWUoIHN0cik7CisKKyAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKKyAgcmVzdWx0LlZhbHVlVHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKworICByZXN1bHQuQ291bnQgOj0gUmVhZEpTT05JbnRlZ2VyOworICBSZWFkSlNPTk9iamVjdFN0YXJ0OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKyAgUmVhZEpTT05PYmplY3RFbmQ7CisgIFJlYWRKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbiA6IFRUaHJpZnRMaXN0OwordmFyIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIFJlYWRKU09OQXJyYXlTdGFydDsKKworICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOworICByZXN1bHQuRWxlbWVudFR5cGUgOj0gR2V0VHlwZUlERm9yVHlwZU5hbWUoIHN0cik7CisgIHJlc3VsdC5Db3VudCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRMaXN0RW5kOworYmVnaW4KKyAgUmVhZEpTT05BcnJheUVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW4gOiBUVGhyaWZ0U2V0OwordmFyIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIFJlYWRKU09OQXJyYXlTdGFydDsKKworICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOworICByZXN1bHQuRWxlbWVudFR5cGUgOj0gR2V0VHlwZUlERm9yVHlwZU5hbWUoIHN0cik7CisgIHJlc3VsdC5Db3VudCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTZXRFbmQ7CitiZWdpbgorICBSZWFkSlNPTkFycmF5RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRCb29sIDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSAoUmVhZEpTT05JbnRlZ2VyIDw+IDApOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRCeXRlIDogU2hvcnRJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRJMTYgOiBTbWFsbEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEkzMiA6IExvbmdJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gUmVhZEpTT05JbnRlZ2VyOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRJNjQgOiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZERvdWJsZSA6IERvdWJsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkRvdWJsZTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU3RyaW5nIDogc3RyaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoIEZBTFNFKSk7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEJpbmFyeSA6IFRCeXRlczsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkJhc2U2NDsKK2VuZDsKKworCisvLy0tLSBpbml0IGNvZGUgLS0tCisKK3Byb2NlZHVyZSBJbml0Qnl0ZXMoIHZhciBiIDogVEJ5dGVzOyBhRGF0YSA6IGFycmF5IG9mIEJ5dGUpOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBiLCBMZW5ndGgoYURhdGEpKTsKKyAgTW92ZSggYURhdGEsIGJbMF0sIExlbmd0aChiKSk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCisgIEluaXRCeXRlcyggQ09NTUEsICAgICBbQnl0ZSgnLCcpXSk7CisgIEluaXRCeXRlcyggQ09MT04sICAgICBbQnl0ZSgnOicpXSk7CisgIEluaXRCeXRlcyggTEJSQUNFLCAgICBbQnl0ZSgneycpXSk7CisgIEluaXRCeXRlcyggUkJSQUNFLCAgICBbQnl0ZSgnfScpXSk7CisgIEluaXRCeXRlcyggTEJSQUNLRVQsICBbQnl0ZSgnWycpXSk7CisgIEluaXRCeXRlcyggUkJSQUNLRVQsICBbQnl0ZSgnXScpXSk7CisgIEluaXRCeXRlcyggUVVPVEUsICAgICBbQnl0ZSgnIicpXSk7CisgIEluaXRCeXRlcyggQkFDS1NMQVNILCBbQnl0ZSgnXCcpXSk7CisgIEluaXRCeXRlcyggRVNDU0VRLCAgICBbQnl0ZSgnXCcpLEJ5dGUoJ3UnKSxCeXRlKCcwJyksQnl0ZSgnMCcpXSk7CitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTM4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwpAQCAtMCwwICsxLDEwNyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXg7CisKK2ludGVyZmFjZQorCit1c2VzIFRocmlmdC5Qcm90b2NvbDsKKworeyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorCisgIE5PVEU6IFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4KKyAgT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisKKyAgVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorCisgICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKworICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOworICAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworCit9CisKK3R5cGUKKyAgVE11bHRpcGxleGVkUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQorICBwdWJsaWMgY29uc3QKKyAgICB7ICBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lIH0KKyAgICBTRVBBUkFUT1IgPSAnOic7CisKKyAgcHJpdmF0ZQorICAgICBGU2VydmljZU5hbWUgOiBTdHJpbmc7CisKKyAgcHVibGljCisgICAgeyBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBzZXJ2ZXIuCisgICAgICBUaGUgc2VydmljZU5hbWUgaXMgcmVxdWlyZWQgYXMgaXQgaXMgcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcKKyAgICAgIHNlcnZlciBjYW4gYnJva2VyIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKworICAgICAgQXJnczoKKyAgICAgICAgcHJvdG9jb2wgLi4uLi4uLiBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbC4KKyAgICAgICAgc2VydmljZU5hbWUgLi4uLiBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhU2VydmljZU5hbWUgOiBzdHJpbmcpOworCisgICAgeyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgU0VQQVJBVE9SLgorICAgICAgQXJnczogVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgfQorICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworCitjb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm90b2NvbC5DcmVhdGUoY29uc3QgYVByb3RvY29sOiBJUHJvdG9jb2w7IGNvbnN0IGFTZXJ2aWNlTmFtZTogc3RyaW5nKTsKK2JlZ2luCisgIEFTU0VSVCggYVNlcnZpY2VOYW1lIDw+ICcnKTsKKyAgaW5oZXJpdGVkIENyZWF0ZShhUHJvdG9jb2wpOworICBGU2VydmljZU5hbWUgOj0gYVNlcnZpY2VOYW1lOworZW5kOworCisKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CisvLyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgordmFyIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgY2FzZSBtc2cuVHlwZV8gb2YKKyAgICBUTWVzc2FnZVR5cGUuQ2FsbCwKKyAgICBUTWVzc2FnZVR5cGUuT25ld2F5IDogYmVnaW4KKyAgICAgIEluaXQoIG5ld01zZywgRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKyAgICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbmV3TXNnKTsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsKKyAgZW5kOworZW5kOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MDljYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKQEAgLTAsMCArMSwxMzg5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sOworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLAorICBTeXNVdGlscywKKyAgQ29udG5ycywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKKyAgVGhyaWZ0LlN0cmVhbSwKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBUaHJpZnQuVHJhbnNwb3J0OworCit0eXBlCisKKyAgVFR5cGUgPSAoCisgICAgU3RvcCA9IDAsCisgICAgVm9pZCA9IDEsCisgICAgQm9vbF8gPSAyLAorICAgIEJ5dGVfID0gMywKKyAgICBEb3VibGVfID0gNCwKKyAgICBJMTYgPSA2LAorICAgIEkzMiA9IDgsCisgICAgSTY0ID0gMTAsCisgICAgU3RyaW5nXyA9IDExLAorICAgIFN0cnVjdCA9IDEyLAorICAgIE1hcCA9IDEzLAorICAgIFNldF8gPSAxNCwKKyAgICBMaXN0ID0gMTUKKyAgKTsKKworICBUTWVzc2FnZVR5cGUgPSAoCisgICAgQ2FsbCA9IDEsCisgICAgUmVwbHkgPSAyLAorICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgT25ld2F5ID0gNAorICApOworCitjb25zdAorICBWQUxJRF9UVFlQRVMgPSBbCisgICAgVFR5cGUuU3RvcCwgVFR5cGUuVm9pZCwKKyAgICBUVHlwZS5Cb29sXywgVFR5cGUuQnl0ZV8sIFRUeXBlLkRvdWJsZV8sIFRUeXBlLkkxNiwgVFR5cGUuSTMyLCBUVHlwZS5JNjQsIFRUeXBlLlN0cmluZ18sCisgICAgVFR5cGUuU3RydWN0LCBUVHlwZS5NYXAsIFRUeXBlLlNldF8sIFRUeXBlLkxpc3QKKyAgXTsKKworICBWQUxJRF9NRVNTQUdFVFlQRVMgPSBbTG93KFRNZXNzYWdlVHlwZSkuLkhpZ2goVE1lc3NhZ2VUeXBlKV07CisKK2NvbnN0CisgIERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gNjQ7CisKK3R5cGUKKyAgSVByb3RvY29sID0gaW50ZXJmYWNlOworCisgIFRUaHJpZnRNZXNzYWdlID0gcmVjb3JkCisgICAgTmFtZTogc3RyaW5nOworICAgIFR5cGVfOiBUTWVzc2FnZVR5cGU7CisgICAgU2VxSUQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U3RydWN0ID0gcmVjb3JkCisgICAgTmFtZTogc3RyaW5nOworICBlbmQ7CisKKyAgVFRocmlmdEZpZWxkID0gcmVjb3JkCisgICAgTmFtZTogc3RyaW5nOworICAgIFR5cGVfOiBUVHlwZTsKKyAgICBJZDogU21hbGxJbnQ7CisgIGVuZDsKKworICBUVGhyaWZ0TGlzdCA9IHJlY29yZAorICAgIEVsZW1lbnRUeXBlOiBUVHlwZTsKKyAgICBDb3VudDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRNYXAgPSByZWNvcmQKKyAgICBLZXlUeXBlOiBUVHlwZTsKKyAgICBWYWx1ZVR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdFNldCA9IHJlY29yZAorICAgIEVsZW1lbnRUeXBlOiBUVHlwZTsKKyAgICBDb3VudDogSW50ZWdlcjsKKyAgZW5kOworCisKKworICBJUHJvdG9jb2xGYWN0b3J5ID0gaW50ZXJmYWNlCisgICAgWyd7N0NENjRBMTAtNEU5Ri00RTk5LTkzQkYtNzA4QTMxRjRBNjdCfSddCisgICAgZnVuY3Rpb24gR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworICBlbmQ7CisKKyAgVFRocmlmdFN0cmluZ0J1aWxkZXIgPSBjbGFzcyggVFN0cmluZ0J1aWxkZXIpCisgIHB1YmxpYworICAgIGZ1bmN0aW9uIEFwcGVuZChjb25zdCBWYWx1ZTogVEJ5dGVzKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEFwcGVuZChjb25zdCBWYWx1ZTogSVRocmlmdENvbnRhaW5lcik6IFRTdHJpbmdCdWlsZGVyOyBvdmVybG9hZDsKKyAgZW5kOworCisgIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBjb25zdCAvLyBUT0RPKGplbnNnKTogY2hhbmdlIGludG8gZW51bQorICAgICAgVU5LTk9XTiA9IDA7CisgICAgICBJTlZBTElEX0RBVEEgPSAxOworICAgICAgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgICBTSVpFX0xJTUlUID0gMzsKKyAgICAgIEJBRF9WRVJTSU9OID0gNDsKKyAgICAgIE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgICBERVBUSF9MSU1JVCA9IDY7CisgIHByb3RlY3RlZAorICAgIGNvbnN0cnVjdG9yIEhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIHB1YmxpYworICAgIC8vIHB1cnBvc2VmdWxseSBoaWRlIGluaGVyaXRlZCBjb25zdHJ1Y3RvcgorICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGU6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIHR5cGVfOiBJbnRlZ2VyKTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggdHlwZV86IEludGVnZXI7IGNvbnN0IG1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICBlbmQ7CisKKyAgLy8gTmVlZGVkIHRvIHJlbW92ZSBkZXByZWNhdGlvbiB3YXJuaW5nCisgIFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRQcm90b2NvbEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgZW5kOworCisgIFRQcm90b2NvbEV4Y2VwdGlvblVua25vd24gPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YSA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbk5lZ2F0aXZlU2l6ZSA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvblNpemVMaW1pdCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24gPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbkRlcHRoTGltaXQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworCisKKyAgVFByb3RvY29sVXRpbCA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIHByb2NlZHVyZSBTa2lwKCBwcm90OiBJUHJvdG9jb2w7IHR5cGVfOiBUVHlwZSk7CisgIGVuZDsKKworICBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyID0gaW50ZXJmYWNlCisgICAgWyd7MjlDQTAzM0YtQkI1Ni00OUIxLTlFRTMtMzFCMUU4MkZDN0E1fSddCisgICAgLy8gbm8gbWVtYmVycyB5ZXQKKyAgZW5kOworCisgIFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsID0gY2xhc3MgYWJzdHJhY3QoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyKQorICBwcm90ZWN0ZWQKKyAgICBGUHJvdG9jb2wgOiBJUHJvdG9jb2w7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggcHJvdCA6IElQcm90b2NvbCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElQcm90b2NvbCA9IGludGVyZmFjZQorICAgIFsnezYwMkE3RkZCLTBEOUUtNENEOC04RDdGLUU1MDc2NjYwNTg4QX0nXQorICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CisKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7CisgICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmc6IHN0cmluZzsKKyAgICBmdW5jdGlvbiBSZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsKKworICAgIHByb2NlZHVyZSBTZXRSZWN1cnNpb25MaW1pdCggdmFsdWUgOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiAgR2V0UmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uICBOZXh0UmVjdXJzaW9uTGV2ZWwgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOworICAgIHByb2NlZHVyZSBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgICBwcm9jZWR1cmUgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CisKKyAgICBwcm9wZXJ0eSBUcmFuc3BvcnQ6IElUcmFuc3BvcnQgcmVhZCBHZXRUcmFuc3BvcnQ7CisgICAgcHJvcGVydHkgUmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyIHJlYWQgR2V0UmVjdXJzaW9uTGltaXQgd3JpdGUgU2V0UmVjdXJzaW9uTGltaXQ7CisgIGVuZDsKKworICBUUHJvdG9jb2xJbXBsID0gY2xhc3MgYWJzdHJhY3QoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2wpCisgIHByb3RlY3RlZAorICAgIEZUcmFucyA6IElUcmFuc3BvcnQ7CisgICAgRlJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKKyAgICBGUmVjdXJzaW9uRGVwdGggOiBJbnRlZ2VyOworCisgICAgcHJvY2VkdXJlIFNldFJlY3Vyc2lvbkxpbWl0KCB2YWx1ZSA6IEludGVnZXIpOworICAgIGZ1bmN0aW9uICBHZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CisgICAgZnVuY3Rpb24gIE5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CisgICAgcHJvY2VkdXJlIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgIHByb2NlZHVyZSBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKworICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nOiBzdHJpbmc7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7IHZpcnR1YWw7CisKKyAgICBwcm9wZXJ0eSBUcmFuc3BvcnQ6IElUcmFuc3BvcnQgcmVhZCBHZXRUcmFuc3BvcnQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIHRyYW5zOiBJVHJhbnNwb3J0ICk7CisgIGVuZDsKKworICBJQmFzZSA9IGludGVyZmFjZQorICAgIFsnezA4RDlCQUE4LTVFQUEtNDEwRi1CNTBCLUFDMkU2RTVFNDE1NX0nXQorICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7CisgICAgcHJvY2VkdXJlIFJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7CisgIGVuZDsKKworCisgIFRCaW5hcnlQcm90b2NvbEltcGwgPSBjbGFzcyggVFByb3RvY29sSW1wbCApCisgIHByb3RlY3RlZAorICAgIGNvbnN0CisgICAgICBWRVJTSU9OX01BU0sgOiBDYXJkaW5hbCA9ICRmZmZmMDAwMDsKKyAgICAgIFZFUlNJT05fMSA6IENhcmRpbmFsID0gJDgwMDEwMDAwOworICBwcm90ZWN0ZWQKKyAgICBGU3RyaWN0UmVhZCA6IEJvb2xlYW47CisgICAgRlN0cmljdFdyaXRlIDogQm9vbGVhbjsKKworICBwcml2YXRlCisgICAgZnVuY3Rpb24gUmVhZEFsbCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7ICBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZ0JvZHkoIHNpemU6IEludGVnZXIpOiBzdHJpbmc7CisKKyAgcHVibGljCisKKyAgICB0eXBlCisgICAgICBURmFjdG9yeSA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sRmFjdG9yeSkKKyAgICAgIHByb3RlY3RlZAorICAgICAgICBGU3RyaWN0UmVhZCA6IEJvb2xlYW47CisgICAgICAgIEZTdHJpY3RXcml0ZSA6IEJvb2xlYW47CisgICAgICBwdWJsaWMKKyAgICAgICAgZnVuY3Rpb24gR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFTdHJpY3RSZWFkLCBBU3RyaWN0V3JpdGU6IEJvb2xlYW4gKTsgb3ZlcmxvYWQ7CisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgICBlbmQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydDsgc3RyaWN0UmVhZDogQm9vbGVhbjsgc3RyaWN0V3JpdGU6IEJvb2xlYW4pOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJyaWRlOworCisgIGVuZDsKKworCisgIHsgVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgICAgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBUaGUgZGVjb3JhdG9yCisgICAgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90KSBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgVFByb3RvY29sCisKKyAgICBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgIH0KKyAgVFByb3RvY29sRGVjb3JhdG9yID0gY2xhc3MoIFRQcm90b2NvbEltcGwpCisgIHByaXZhdGUKKyAgICBGV3JhcHBlZFByb3RvY29sIDogSVByb3RvY29sOworCisgIHB1YmxpYworICAgIC8vIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgLy8gQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoZSBnaXZlbiBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2wpOworCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmc6IHN0cmluZzsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7IG92ZXJyaWRlOworICBlbmQ7CisKKwordHlwZQorICBJUmVxdWVzdEV2ZW50cyA9IGludGVyZmFjZQorICAgIFsne0Y5MjZBMjZBLTVCMDAtNDU2MC04NkZBLTJDQUUzQkE3M0RBRn0nXQorICAgIC8vIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCisgICAgcHJvY2VkdXJlIFByZVJlYWQ7CisgICAgLy8gQ2FsbGVkIGJldHdlZW4gcmVhZGluZyBhcmd1bWVudHMgYW5kIGNhbGxpbmcgdGhlIGhhbmRsZXIuCisgICAgcHJvY2VkdXJlIFBvc3RSZWFkOworICAgIC8vIENhbGxlZCBiZXR3ZWVuIGNhbGxpbmcgdGhlIGhhbmRsZXIgYW5kIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgIHByb2NlZHVyZSBQcmVXcml0ZTsKKyAgICAvLyBDYWxsZWQgYWZ0ZXIgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAgcHJvY2VkdXJlIFBvc3RXcml0ZTsKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBvbmV3YXkgKGFzeW5jKSBmdW5jdGlvbiBjYWxsIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCisgICAgcHJvY2VkdXJlIE9uZXdheUNvbXBsZXRlOworICAgIC8vIENhbGxlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24uCisgICAgcHJvY2VkdXJlIFVuaGFuZGxlZEVycm9yKCBjb25zdCBlIDogRXhjZXB0aW9uKTsKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBjbGVhbiB1cAorICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgZW5kOworCisKKyAgSVByb2Nlc3NvckV2ZW50cyA9IGludGVyZmFjZQorICAgIFsne0E4NjYxMTE5LTY1N0MtNDQ3RC05M0M1LTUxMkUzNjE2MkE0NX0nXQorICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KKyAgICBwcm9jZWR1cmUgUHJvY2Vzc2luZyggY29uc3QgdHJhbnNwb3J0IDogSVRyYW5zcG9ydCk7CisgICAgLy8gQ2FsbGVkIG9uIGFueSBzZXJ2aWNlIGZ1bmN0aW9uIGludm9jYXRpb24KKyAgICBmdW5jdGlvbiAgQ3JlYXRlUmVxdWVzdENvbnRleHQoIGNvbnN0IGFGdW5jdGlvbk5hbWUgOiBzdHJpbmcpIDogSVJlcXVlc3RFdmVudHM7CisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gY2xlYW4gdXAKKyAgICBwcm9jZWR1cmUgQ2xlYW51cENvbnRleHQ7CisgIGVuZDsKKworCisgIElQcm9jZXNzb3IgPSBpbnRlcmZhY2UKKyAgICBbJ3s3QkFFOTJBNS00NkRBLTRGMTMtQjZFQS0wRUFCRTIzM0VFNUZ9J10KKyAgICBmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdCA6SVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzID0gbmlsKTogQm9vbGVhbjsKKyAgZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1lc3NhZ2U7IGNvbnN0IEFOYW1lOiBzdHJpbmcgPSAnJzsgY29uc3QgQU1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUgPSBMb3coVE1lc3NhZ2VUeXBlKTsgY29uc3QgQVNlcUlEOiBJbnRlZ2VyID0gMCk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFN0cnVjdDsgIGNvbnN0IEFOYW1lOiBzdHJpbmcgPSAnJyk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdEZpZWxkOyAgIGNvbnN0IEFOYW1lOiBzdHJpbmcgPSAnJzsgY29uc3QgQVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUlEOiBTbWFsbEludCA9IDApOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNYXA7ICAgICBjb25zdCBBS2V5VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBVmFsdWVUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFNldDsgICAgIGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRMaXN0OyAgICBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworCisKK2ltcGxlbWVudGF0aW9uCisKK2Z1bmN0aW9uIENvbnZlcnRJbnQ2NFRvRG91YmxlKCBjb25zdCBuOiBJbnQ2NCk6IERvdWJsZTsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKG4pID0gU2l6ZU9mKFJlc3VsdCkpOworICBTeXN0ZW0uTW92ZSggbiwgUmVzdWx0LCBTaXplT2YoUmVzdWx0KSk7CitlbmQ7CisKK2Z1bmN0aW9uIENvbnZlcnREb3VibGVUb0ludDY0KCBjb25zdCBkOiBEb3VibGUpOiBJbnQ2NDsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKGQpID0gU2l6ZU9mKFJlc3VsdCkpOworICBTeXN0ZW0uTW92ZSggZCwgUmVzdWx0LCBTaXplT2YoUmVzdWx0KSk7CitlbmQ7CisKKworCit7IFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwuQ3JlYXRlKCBwcm90IDogSVByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisKKyAgLy8gc3RvcmluZyB0aGUgcG9pbnRlciAqYWZ0ZXIqIHRoZSAoc3VjY2Vzc2Z1bCkgaW5jcmVtZW50IGlzIGltcG9ydGFudCBoZXJlCisgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgIEZQcm90b2NvbCA6PSBwcm90OworZW5kOworCitkZXN0cnVjdG9yIFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICAvLyB3ZSBoYXZlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSBpZmYgdGhlIHBvaW50ZXIgaGFzIGJlZW4gc3RvcmVkCisgICAgaWYgRlByb3RvY29sIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgICBGUHJvdG9jb2wuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgICAgICBGUHJvdG9jb2wgOj0gbmlsOworICAgIGVuZDsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKK3sgVFByb3RvY29sSW1wbCB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbEltcGwuQ3JlYXRlKHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUcmFucyA6PSB0cmFuczsKKyAgRlJlY3Vyc2lvbkxpbWl0IDo9IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUOworICBGUmVjdXJzaW9uRGVwdGggOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuU2V0UmVjdXJzaW9uTGltaXQoIHZhbHVlIDogSW50ZWdlcik7CitiZWdpbgorICBGUmVjdXJzaW9uTGltaXQgOj0gdmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuR2V0UmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IEZSZWN1cnNpb25MaW1pdDsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5OZXh0UmVjdXJzaW9uTGV2ZWwgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsLkNyZWF0ZShTZWxmKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CitiZWdpbgorICBpZiBGUmVjdXJzaW9uRGVwdGggPCBGUmVjdXJzaW9uTGltaXQKKyAgdGhlbiBJbmMoRlJlY3Vyc2lvbkRlcHRoKQorICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkRlcHRoTGltaXQuQ3JlYXRlKCdEZXB0aCBsaW1pdCBleGNlZWRlZCcpOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKK2JlZ2luCisgIERlYyhGUmVjdXJzaW9uRGVwdGgpCitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFuczsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5SZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsKK3ZhcgorICBiIDogVEJ5dGVzOworICBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9ICcnOworICBiIDo9IFJlYWRCaW5hcnk7CisgIGxlbiA6PSBMZW5ndGgoIGIgKTsKKyAgaWYgbGVuID4gMCB0aGVuCisgIGJlZ2luCisgICAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbik7CisgICAgU3lzdGVtLk1vdmUoIGJbMF0sIFBvaW50ZXIoUmVzdWx0KV4sIGxlbiApOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuUmVhZFN0cmluZzogc3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IFRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEJpbmFyeSApOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5Xcml0ZUFuc2lTdHJpbmcoY29uc3QgczogQW5zaVN0cmluZyk7Cit2YXIKKyAgYiA6IFRCeXRlczsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSBMZW5ndGgocyk7CisgIFNldExlbmd0aCggYiwgbGVuKTsKKyAgaWYgbGVuID4gMCB0aGVuCisgIGJlZ2luCisgICAgU3lzdGVtLk1vdmUoIFBvaW50ZXIocyleLCBiWzBdLCBsZW4gKTsKKyAgZW5kOworICBXcml0ZUJpbmFyeSggYiApOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5Xcml0ZVN0cmluZyhjb25zdCBzOiBzdHJpbmcpOwordmFyCisgIGIgOiBUQnl0ZXM7CitiZWdpbgorICBiIDo9IFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpOworICBXcml0ZUJpbmFyeSggYiApOworZW5kOworCit7IFRQcm90b2NvbFV0aWwgfQorCitjbGFzcyBwcm9jZWR1cmUgVFByb3RvY29sVXRpbC5Ta2lwKCBwcm90OiBJUHJvdG9jb2w7IHR5cGVfOiBUVHlwZSk7Cit2YXIgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CisgICAgbWFwICAgOiBUVGhyaWZ0TWFwOworICAgIHNldF8gIDogVFRocmlmdFNldDsKKyAgICBsaXN0ICA6IFRUaHJpZnRMaXN0OworICAgIGkgICAgIDogSW50ZWdlcjsKKyAgICB0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKK2JlZ2luCisgIHRyYWNrZXIgOj0gcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7CisgIGNhc2UgdHlwZV8gb2YKKyAgICAvLyBzaW1wbGUgdHlwZXMKKyAgICBUVHlwZS5Cb29sXyAgIDogIHByb3QuUmVhZEJvb2woKTsKKyAgICBUVHlwZS5CeXRlXyAgIDogIHByb3QuUmVhZEJ5dGUoKTsKKyAgICBUVHlwZS5JMTYgICAgIDogIHByb3QuUmVhZEkxNigpOworICAgIFRUeXBlLkkzMiAgICAgOiAgcHJvdC5SZWFkSTMyKCk7CisgICAgVFR5cGUuSTY0ICAgICA6ICBwcm90LlJlYWRJNjQoKTsKKyAgICBUVHlwZS5Eb3VibGVfIDogIHByb3QuUmVhZERvdWJsZSgpOworICAgIFRUeXBlLlN0cmluZ18gOiAgcHJvdC5SZWFkQmluYXJ5KCk7Ly8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisKKyAgICAvLyBzdHJ1Y3R1cmVkIHR5cGVzCisgICAgVFR5cGUuU3RydWN0IDogIGJlZ2luCisgICAgICBwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgICBmaWVsZCA6PSBwcm90LlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChmaWVsZC5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4gQnJlYWs7CisgICAgICAgIFNraXAocHJvdCwgZmllbGQuVHlwZV8pOworICAgICAgICBwcm90LlJlYWRGaWVsZEVuZCgpOworICAgICAgZW5kOworICAgICAgcHJvdC5SZWFkU3RydWN0RW5kKCk7CisgICAgZW5kOworCisgICAgVFR5cGUuTWFwIDogIGJlZ2luCisgICAgICBtYXAgOj0gcHJvdC5SZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciBpIDo9IDAgdG8gbWFwLkNvdW50LTEgZG8gYmVnaW4KKyAgICAgICAgU2tpcChwcm90LCBtYXAuS2V5VHlwZSk7CisgICAgICAgIFNraXAocHJvdCwgbWFwLlZhbHVlVHlwZSk7CisgICAgICBlbmQ7CisgICAgICBwcm90LlJlYWRNYXBFbmQoKTsKKyAgICBlbmQ7CisKKyAgICBUVHlwZS5TZXRfIDogIGJlZ2luCisgICAgICBzZXRfIDo9IHByb3QuUmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgaSA6PSAwIHRvIHNldF8uQ291bnQtMQorICAgICAgZG8gU2tpcCggcHJvdCwgc2V0Xy5FbGVtZW50VHlwZSk7CisgICAgICBwcm90LlJlYWRTZXRFbmQoKTsKKyAgICBlbmQ7CisKKyAgICBUVHlwZS5MaXN0IDogIGJlZ2luCisgICAgICBsaXN0IDo9IHByb3QuUmVhZExpc3RCZWdpbigpOworICAgICAgZm9yIGkgOj0gMCB0byBsaXN0LkNvdW50LTEKKyAgICAgIGRvIFNraXAoIHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOworICAgICAgcHJvdC5SZWFkTGlzdEVuZCgpOworICAgIGVuZDsKKworICBlbHNlCisgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdVbmV4cGVjdGVkIHR5cGUgJytJbnRUb1N0cihPcmQodHlwZV8pKSk7CisgIGVuZDsKK2VuZDsKKworCit7IFRCaW5hcnlQcm90b2NvbEltcGwgfQorCitjb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQKKyAgQ3JlYXRlKCB0cmFucywgRmFsc2UsIFRydWUpOworZW5kOworCitjb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQ7IHN0cmljdFJlYWQsCisgIHN0cmljdFdyaXRlOiBCb29sZWFuKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHRyYW5zICk7CisgIEZTdHJpY3RSZWFkIDo9IHN0cmljdFJlYWQ7CisgIEZTdHJpY3RXcml0ZSA6PSBzdHJpY3RXcml0ZTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQWxsKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIgKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnMuUmVhZEFsbCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbiApOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKK3ZhcgorICBzaXplIDogSW50ZWdlcjsKKyAgYnVmIDogVEJ5dGVzOworYmVnaW4KKyAgc2l6ZSA6PSBSZWFkSTMyOworICBTZXRMZW5ndGgoIGJ1Ziwgc2l6ZSApOworICBGVHJhbnMuUmVhZEFsbCggYnVmLCAwLCBzaXplKTsKKyAgUmVzdWx0IDo9IGJ1ZjsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoUmVhZEJ5dGUgPSAxKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICBSZWFkQWxsKCBAcmVzdWx0LCBTaXplT2YocmVzdWx0KSwgMCwgMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZERvdWJsZTogRG91YmxlOworYmVnaW4KKyAgUmVzdWx0IDo9IENvbnZlcnRJbnQ2NFRvRG91YmxlKCBSZWFkSTY0ICkKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOworYmVnaW4KKyAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUoIFJlYWRCeXRlKSwgMCk7CisgIGlmICggcmVzdWx0LlR5cGVfIDw+IFRUeXBlLlN0b3AgKSB0aGVuIGJlZ2luCisgICAgcmVzdWx0LklkIDo9IFJlYWRJMTY7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMTY6IFNtYWxsSW50OwordmFyIGkxNmluIDogcGFja2VkIGFycmF5WzAuLjFdIG9mIEJ5dGU7CitiZWdpbgorICBSZWFkQWxsKCBAaTE2aW4sIFNpemVvZihpMTZpbiksIDAsIDIpOworICBSZXN1bHQgOj0gU21hbGxJbnQoKChpMTZpblswXSBhbmQgJEZGKSBzaGwgOCkgb3IgKGkxNmluWzFdIGFuZCAkRkYpKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkSTMyOiBJbnRlZ2VyOwordmFyIGkzMmluIDogcGFja2VkIGFycmF5WzAuLjNdIG9mIEJ5dGU7CitiZWdpbgorICBSZWFkQWxsKCBAaTMyaW4sIFNpemVPZihpMzJpbiksIDAsIDQpOworCisgIFJlc3VsdCA6PSBJbnRlZ2VyKAorICAgICgoaTMyaW5bMF0gYW5kICRGRikgc2hsIDI0KSBvcgorICAgICgoaTMyaW5bMV0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgICgoaTMyaW5bMl0gYW5kICRGRikgc2hsIDgpIG9yCisgICAgIChpMzJpblszXSBhbmQgJEZGKSk7CisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkSTY0OiBJbnQ2NDsKK3ZhciBpNjRpbiA6IHBhY2tlZCBhcnJheVswLi43XSBvZiBCeXRlOworYmVnaW4KKyAgUmVhZEFsbCggQGk2NGluLCBTaXplT2YoaTY0aW4pLCAwLCA4KTsKKyAgUmVzdWx0IDo9CisgICAgKEludDY0KCBpNjRpblswXSBhbmQgJEZGKSBzaGwgNTYpIG9yCisgICAgKEludDY0KCBpNjRpblsxXSBhbmQgJEZGKSBzaGwgNDgpIG9yCisgICAgKEludDY0KCBpNjRpblsyXSBhbmQgJEZGKSBzaGwgNDApIG9yCisgICAgKEludDY0KCBpNjRpblszXSBhbmQgJEZGKSBzaGwgMzIpIG9yCisgICAgKEludDY0KCBpNjRpbls0XSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgKEludDY0KCBpNjRpbls1XSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgKEludDY0KCBpNjRpbls2XSBhbmQgJEZGKSBzaGwgOCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzddIGFuZCAkRkYpKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKK2JlZ2luCisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgICA6PSBSZWFkSTMyOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CitiZWdpbgorICByZXN1bHQuS2V5VHlwZSAgIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LlZhbHVlVHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgOj0gUmVhZEkzMjsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEVuZDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKK3ZhcgorICBzaXplIDogSW50ZWdlcjsKKyAgdmVyc2lvbiA6IEludGVnZXI7CitiZWdpbgorICBJbml0KCByZXN1bHQpOworICBzaXplIDo9IFJlYWRJMzI7CisgIGlmIChzaXplIDwgMCkgdGhlbiBiZWdpbgorICAgIHZlcnNpb24gOj0gc2l6ZSBhbmQgSW50ZWdlciggVkVSU0lPTl9NQVNLKTsKKyAgICBpZiAoIHZlcnNpb24gPD4gSW50ZWdlciggVkVSU0lPTl8xKSkgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ0JhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46ICcgKyBJbnRUb1N0cih2ZXJzaW9uKSApOworICAgIGVuZDsKKyAgICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBzaXplIGFuZCAkMDAwMDAwZmYpOworICAgIHJlc3VsdC5OYW1lIDo9IFJlYWRTdHJpbmc7CisgICAgcmVzdWx0LlNlcUlEIDo9IFJlYWRJMzI7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgaWYgRlN0cmljdFJlYWQgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ01pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PycgKTsKKyAgICBlbmQ7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZ0JvZHkoIHNpemUgKTsKKyAgICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkQnl0ZSApOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlRW5kOworYmVnaW4KKyAgaW5oZXJpdGVkOworCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OworYmVnaW4KKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICAgIDo9IFJlYWRJMzI7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cmluZ0JvZHkoIHNpemU6IEludGVnZXIpOiBzdHJpbmc7Cit2YXIKKyAgYnVmIDogVEJ5dGVzOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBidWYsIHNpemUgKTsKKyAgRlRyYW5zLlJlYWRBbGwoIGJ1ZiwgMCwgc2l6ZSApOworICBSZXN1bHQgOj0gVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBidWYpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKK2JlZ2luCisgIEluaXQoIFJlc3VsdCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RFbmQ7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7Cit2YXIgaUxlbiA6IEludGVnZXI7CitiZWdpbgorICBpTGVuIDo9IExlbmd0aChiKTsKKyAgV3JpdGVJMzIoIGlMZW4pOworICBpZiBpTGVuID4gMCB0aGVuIEZUcmFucy5Xcml0ZShiLCAwLCBpTGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVCb29sKGI6IEJvb2xlYW4pOworYmVnaW4KKyAgaWYgYiB0aGVuIGJlZ2luCisgICAgV3JpdGVCeXRlKCAxICk7CisgIGVuZCBlbHNlIGJlZ2luCisgICAgV3JpdGVCeXRlKCAwICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVCeXRlKGI6IFNob3J0SW50KTsKK2JlZ2luCisgIEZUcmFucy5Xcml0ZSggQGIsIDAsIDEpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKK2JlZ2luCisgIFdyaXRlSTY0KENvbnZlcnREb3VibGVUb0ludDY0KGQpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChmaWVsZC5UeXBlXykpOworICBXcml0ZUkxNihmaWVsZC5JRCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRTdG9wOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KFRUeXBlLlN0b3ApKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMTYoaTE2OiBTbWFsbEludCk7Cit2YXIgaTE2b3V0IDogcGFja2VkIGFycmF5WzAuLjFdIG9mIEJ5dGU7CitiZWdpbgorICBpMTZvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpMTYgc2hyIDgpKTsKKyAgaTE2b3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCBpMTYpOworICBGVHJhbnMuV3JpdGUoIEBpMTZvdXQsIDAsIDIpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUkzMihpMzI6IEludGVnZXIpOwordmFyIGkzMm91dCA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOworYmVnaW4KKyAgaTMyb3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAyNCkpOworICBpMzJvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDE2KSk7CisgIGkzMm91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgOCkpOworICBpMzJvdXRbM10gOj0gQnl0ZSgkRkYgYW5kIGkzMik7CisgIEZUcmFucy5Xcml0ZSggQGkzMm91dCwgMCwgNCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKK3ZhciBpNjRvdXQgOiBwYWNrZWQgYXJyYXlbMC4uN10gb2YgQnl0ZTsKK2JlZ2luCisgIGk2NG91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNTYpKTsKKyAgaTY0b3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA0OCkpOworICBpNjRvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQwKSk7CisgIGk2NG91dFszXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMzIpKTsKKyAgaTY0b3V0WzRdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAyNCkpOworICBpNjRvdXRbNV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDE2KSk7CisgIGk2NG91dFs2XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgOCkpOworICBpNjRvdXRbN10gOj0gQnl0ZSgkRkYgYW5kIGk2NCk7CisgIEZUcmFucy5Xcml0ZSggQGk2NG91dCwgMCwgOCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQobGlzdC5FbGVtZW50VHlwZSkpOworICBXcml0ZUkzMihsaXN0LkNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVMaXN0RW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KG1hcC5LZXlUeXBlKSk7CisgIFdyaXRlQnl0ZShTaG9ydEludChtYXAuVmFsdWVUeXBlKSk7CisgIFdyaXRlSTMyKG1hcC5Db3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWFwRW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7Cit2YXIKKyAgdmVyc2lvbiA6IENhcmRpbmFsOworYmVnaW4KKyAgaWYgRlN0cmljdFdyaXRlIHRoZW4KKyAgYmVnaW4KKyAgICB2ZXJzaW9uIDo9IFZFUlNJT05fMSBvciBDYXJkaW5hbCggbXNnLlR5cGVfKTsKKyAgICBXcml0ZUkzMiggSW50ZWdlciggdmVyc2lvbikgKTsKKyAgICBXcml0ZVN0cmluZyggbXNnLk5hbWUpOworICAgIFdyaXRlSTMyKCBtc2cuU2VxSUQpOworICBlbmQgZWxzZQorICBiZWdpbgorICAgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CisgICAgV3JpdGVCeXRlKFNob3J0SW50KCBtc2cuVHlwZV8pKTsKKyAgICBXcml0ZUkzMiggbXNnLlNlcUlEKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQpOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KHNldF8uRWxlbWVudFR5cGUpKTsKKyAgV3JpdGVJMzIoc2V0Xy5Db3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU2V0RW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0RW5kOworYmVnaW4KKworZW5kOworCit7IFRQcm90b2NvbEV4Y2VwdGlvbiB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGU6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnJyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUodHlwZV86IEludGVnZXIpOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZSh0eXBlXywgJycpOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUodHlwZV86IEludGVnZXI7IGNvbnN0IG1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KKyAgY2FzZSB0eXBlXyBvZgorICAgIElOVkFMSURfREFUQTogICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZShtc2cpOworICAgIE5FR0FUSVZFX1NJWkU6ICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbk5lZ2F0aXZlU2l6ZS5DcmVhdGUobXNnKTsKKyAgICBTSVpFX0xJTUlUOiAgICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25TaXplTGltaXQuQ3JlYXRlKG1zZyk7CisgICAgQkFEX1ZFUlNJT046ICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUobXNnKTsKKyAgICBOT1RfSU1QTEVNRU5URUQ6IFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUobXNnKTsKKyAgICBERVBUSF9MSU1JVDogICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0LkNyZWF0ZShtc2cpOworICBlbHNlCisgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKG1zZyk7CisgIGVuZDsKK2VuZDsKKworeyBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRocmlmdFN0cmluZ0J1aWxkZXIgfQorCitmdW5jdGlvbiBUVGhyaWZ0U3RyaW5nQnVpbGRlci5BcHBlbmQoY29uc3QgVmFsdWU6IFRCeXRlcyk6IFRTdHJpbmdCdWlsZGVyOworYmVnaW4KKyAgUmVzdWx0IDo9IEFwcGVuZCggc3RyaW5nKCBSYXdCeXRlU3RyaW5nKFZhbHVlKSkgKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmluZ0J1aWxkZXIuQXBwZW5kKAorICBjb25zdCBWYWx1ZTogSVRocmlmdENvbnRhaW5lcik6IFRTdHJpbmdCdWlsZGVyOworYmVnaW4KKyAgUmVzdWx0IDo9IEFwcGVuZCggVmFsdWUuVG9TdHJpbmcgKTsKK2VuZDsKKworeyBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5IH0KKworY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUoQVN0cmljdFJlYWQsIEFTdHJpY3RXcml0ZTogQm9vbGVhbik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyaWN0UmVhZCA6PSBBU3RyaWN0UmVhZDsKKyAgRlN0cmljdFdyaXRlIDo9IEFTdHJpY3RXcml0ZTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBGYWxzZSwgVHJ1ZSApCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOworYmVnaW4KKyAgUmVzdWx0IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucywgRlN0cmljdFJlYWQsIEZTdHJpY3RXcml0ZSk7CitlbmQ7CisKKworeyBUUHJvdG9jb2xEZWNvcmF0b3IgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xEZWNvcmF0b3IuQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2wpOworYmVnaW4KKyAgQVNTRVJUKCBhUHJvdG9jb2wgPD4gbmlsKTsKKyAgaW5oZXJpdGVkIENyZWF0ZSggYVByb3RvY29sLlRyYW5zcG9ydCk7CisgIEZXcmFwcGVkUHJvdG9jb2wgOj0gYVByb3RvY29sOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luKCBzdHJ1Yyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW4oIGZpZWxkKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3A7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEJlZ2luKCBtYXApOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNYXBFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWFwRW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0QmVnaW4oIGxpc3QpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVMaXN0RW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEVuZCgpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEJlZ2luKCBzZXRfKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU2V0RW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kKCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUJvb2woIGI6IEJvb2xlYW4pOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUJvb2woIGIpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlQnl0ZSggYik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUkxNiggaTE2OiBTbWFsbEludCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlSTE2KCBpMTYpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlSTMyKCBpMzIpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUk2NCggaTY0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZSggZCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RyaW5nKCBzKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlQW5zaVN0cmluZyggcyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVCaW5hcnkoIGIpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWVzc2FnZUVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkU3RydWN0RW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkRmllbGRFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNYXBFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRMaXN0QmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkTGlzdEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkU2V0QmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkU2V0RW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEJvb2w6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkQm9vbDsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEJ5dGU6IFNob3J0SW50OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEJ5dGU7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRJMTY6IFNtYWxsSW50OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEkxNjsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEkzMjogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRJMzI7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRJNjQ6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEk2NDsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZERvdWJsZTpEb3VibGU7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkQmluYXJ5OiBUQnl0ZXM7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkQmluYXJ5OworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU3RyaW5nOiBzdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkU3RyaW5nOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRBbnNpU3RyaW5nOworZW5kOworCisKK3sgSW5pdCBoZWxwZXIgZnVuY3Rpb25zIH0KKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQU1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7IGNvbnN0IEFTZXFJRDogSW50ZWdlcik7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKKyAgcmVjLlR5cGVfIDo9IEFNZXNzYWdlVHlwZTsKKyAgcmVjLlNlcUlEIDo9IEFTZXFJRDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTdHJ1Y3Q7IGNvbnN0IEFOYW1lOiBzdHJpbmcgPSAnJyk7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRGaWVsZDsgY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQVR5cGU6IFRUeXBlOyBjb25zdCBBSUQ6IFNtYWxsSW50KTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworICByZWMuVHlwZV8gOj0gQVR5cGU7CisgIHJlYy5JZCA6PSBBSWQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWFwOyBjb25zdCBBS2V5VHlwZSwgQVZhbHVlVHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuVmFsdWVUeXBlIDo9IEFWYWx1ZVR5cGU7CisgIHJlYy5LZXlUeXBlIDo9IEFLZXlUeXBlOworICByZWMuQ291bnQgOj0gQUNvdW50OworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFNldDsgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CisgIHJlYy5FbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TGlzdDsgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CisgIHJlYy5FbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7CitlbmQ7CisKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOTA1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcwpAQCAtMCwwICsxLDIzMCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQordW5pdCBUaHJpZnQuU2VyaWFsaXplcjsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCisgIHskRUxTRX0KKyAgU3lzdGVtLkNsYXNzZXMsIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlN0cmVhbTsKKworCit0eXBlCisgIC8vIEdlbmVyaWMgdXRpbGl0eSBmb3IgZWFzaWx5IHNlcmlhbGl6aW5nIG9iamVjdHMgaW50byBhIGJ5dGUgYXJyYXkgb3IgU3RyZWFtLgorICBUU2VyaWFsaXplciA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBGU3RyZWFtICAgIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGUHJvdG9jb2wgIDogSVByb3RvY29sOworCisgIHB1YmxpYworICAgIC8vIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplciB0aGF0IHVzZXMgdGhlIFRCaW5hcnlQcm90b2NvbCBieSBkZWZhdWx0LgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgIG92ZXJsb2FkOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyLgorICAgIC8vIEl0IHdpbGwgdXNlIHRoZSBUUHJvdG9jb2wgc3BlY2lmaWVkIGJ5IHRoZSBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluLgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBEVE9SCisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QuCisgICAgZnVuY3Rpb24gIFNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBJQmFzZSkgOiBUQnl0ZXM7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBhU3RtIDogVFN0cmVhbSk7ICBvdmVybG9hZDsKKyAgZW5kOworCisKKyAgLy8gR2VuZXJpYyB1dGlsaXR5IGZvciBlYXNpbHkgZGVzZXJpYWxpemluZyBvYmplY3RzIGZyb20gYnl0ZSBhcnJheSBvciBTdHJlYW0uCisgIFREZXNlcmlhbGl6ZXIgPSBjbGFzcworICBwcml2YXRlCisgICAgRlN0cmVhbSAgICA6IFRNZW1vcnlTdHJlYW07CisgICAgRlRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgICAgRlByb3RvY29sICA6IElQcm90b2NvbDsKKworICBwdWJsaWMKKyAgICAvLyBDcmVhdGUgYSBuZXcgVERlc2VyaWFsaXplciB0aGF0IHVzZXMgdGhlIFRCaW5hcnlQcm90b2NvbCBieSBkZWZhdWx0LgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgIG92ZXJsb2FkOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFREZXNlcmlhbGl6ZXIuCisgICAgLy8gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKKworICAgIC8vIERUT1IKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIC8vIERlc2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGRhdGEuCisgICAgcHJvY2VkdXJlIERlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRCeXRlczsgY29uc3QgdGFyZ2V0IDogSUJhc2UpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIERlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRTdHJlYW07IGNvbnN0IHRhcmdldCA6IElCYXNlKTsgIG92ZXJsb2FkOworICBlbmQ7CisKKworCitpbXBsZW1lbnRhdGlvbgorCisKK3sgVFNlcmlhbGl6ZXIgfQorCisKK2NvbnN0cnVjdG9yIFRTZXJpYWxpemVyLkNyZWF0ZSgpOworLy8gQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CitlbmQ7CisKKworY29uc3RydWN0b3IgVFNlcmlhbGl6ZXIuQ3JlYXRlKCBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7CisvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIuCisvLyBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUgZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KK3ZhciBhZGFwdGVyIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJlYW0gICAgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIGFkYXB0ZXIgICAgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBGU3RyZWFtLCBGQUxTRSk7CisgIEZUcmFuc3BvcnQgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBuaWwsIGFkYXB0ZXIpOworICBGUHJvdG9jb2wgIDo9IGZhY3RvcnkuR2V0UHJvdG9jb2woIEZUcmFuc3BvcnQpOworZW5kOworCisKK2Rlc3RydWN0b3IgVFNlcmlhbGl6ZXIuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZQcm90b2NvbCAgOj0gbmlsOworICAgIEZUcmFuc3BvcnQgOj0gbmlsOworICAgIEZyZWVBbmROaWwoIEZTdHJlYW0pOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUU2VyaWFsaXplci5TZXJpYWxpemUoIGNvbnN0IGlucHV0IDogSUJhc2UpIDogVEJ5dGVzOworLy8gU2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGludG8gYSBieXRlIGFycmF5LiBUaGUgcHJvY2VzcyBpcyBzaW1wbGUsCisvLyBqdXN0IGNsZWFyIHRoZSBieXRlIGFycmF5IG91dHB1dCwgd3JpdGUgdGhlIG9iamVjdCBpbnRvIGl0LCBhbmQgZ3JhYiB0aGUKKy8vIHJhdyBieXRlcy4KK3ZhciBpQnl0ZXMgOiBJbnQ2NDsKK2JlZ2luCisgIHRyeQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOworICAgIGlucHV0LldyaXRlKCBGUHJvdG9jb2wpOworICAgIFNldExlbmd0aCggcmVzdWx0LCBGU3RyZWFtLlNpemUpOworICAgIGlCeXRlcyA6PSBMZW5ndGgocmVzdWx0KTsKKyAgICBpZiBpQnl0ZXMgPiAwCisgICAgdGhlbiBNb3ZlKCBGU3RyZWFtLk1lbW9yeV4sIHJlc3VsdFswXSwgaUJ5dGVzKTsKKyAgZmluYWxseQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOyAgLy8gZnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeQorICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTZXJpYWxpemVyLlNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgYVN0bSA6IFRTdHJlYW0pOworLy8gU2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGludG8gYSBieXRlIGFycmF5LiBUaGUgcHJvY2VzcyBpcyBzaW1wbGUsCisvLyBqdXN0IGNsZWFyIHRoZSBieXRlIGFycmF5IG91dHB1dCwgd3JpdGUgdGhlIG9iamVjdCBpbnRvIGl0LCBhbmQgZ3JhYiB0aGUKKy8vIHJhdyBieXRlcy4KK2NvbnN0IENPUFlfRU5USVJFX1NUUkVBTSA9IDA7CitiZWdpbgorICB0cnkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsKKyAgICBpbnB1dC5Xcml0ZSggRlByb3RvY29sKTsKKyAgICBhU3RtLkNvcHlGcm9tKCBGU3RyZWFtLCBDT1BZX0VOVElSRV9TVFJFQU0pOworICBmaW5hbGx5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7ICAvLyBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisgIGVuZDsKK2VuZDsKKworCit7IFREZXNlcmlhbGl6ZXIgfQorCisKK2NvbnN0cnVjdG9yIFREZXNlcmlhbGl6ZXIuQ3JlYXRlKCk7CisvLyBDcmVhdGUgYSBuZXcgVERlc2VyaWFsaXplciB0aGF0IHVzZXMgdGhlIFRCaW5hcnlQcm90b2NvbCBieSBkZWZhdWx0LgorYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworZW5kOworCisKK2NvbnN0cnVjdG9yIFREZXNlcmlhbGl6ZXIuQ3JlYXRlKCBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7CisvLyBDcmVhdGUgYSBuZXcgVERlc2VyaWFsaXplci4KKy8vIEl0IHdpbGwgdXNlIHRoZSBUUHJvdG9jb2wgc3BlY2lmaWVkIGJ5IHRoZSBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluLgordmFyIGFkYXB0ZXIgOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSAgICA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgYWRhcHRlciAgICA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIEZTdHJlYW0sIEZBTFNFKTsKKyAgRlRyYW5zcG9ydCA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGFkYXB0ZXIsIG5pbCk7CisgIEZQcm90b2NvbCAgOj0gZmFjdG9yeS5HZXRQcm90b2NvbCggRlRyYW5zcG9ydCk7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBURGVzZXJpYWxpemVyLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGUHJvdG9jb2wgIDo9IG5pbDsKKyAgICBGVHJhbnNwb3J0IDo9IG5pbDsKKyAgICBGcmVlQW5kTmlsKCBGU3RyZWFtKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFREZXNlcmlhbGl6ZXIuRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZSk7CisvLyBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBkYXRhIGZyb20gdGhlIGJ5dGUgYXJyYXkuCit2YXIgaUJ5dGVzIDogSW50NjQ7CitiZWdpbgorICB0cnkKKyAgICBpQnl0ZXMgOj0gTGVuZ3RoKGlucHV0KTsKKyAgICBGU3RyZWFtLlNpemUgOj0gaUJ5dGVzOworICAgIGlmIGlCeXRlcyA+IDAKKyAgICB0aGVuIE1vdmUoIGlucHV0WzBdLCBGU3RyZWFtLk1lbW9yeV4sIGlCeXRlcyk7CisKKyAgICB0YXJnZXQuUmVhZCggRlByb3RvY29sKTsKKyAgZmluYWxseQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOyAgLy8gZnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeQorICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFREZXNlcmlhbGl6ZXIuRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVFN0cmVhbTsgY29uc3QgdGFyZ2V0IDogSUJhc2UpOworLy8gRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZGF0YSBmcm9tIHRoZSBieXRlIGFycmF5LgorY29uc3QgQ09QWV9FTlRJUkVfU1RSRUFNID0gMDsKK3ZhciBiZWZvcmUgOiBJbnQ2NDsKK2JlZ2luCisgIHRyeQorICAgIGJlZm9yZSA6PSBGU3RyZWFtLlBvc2l0aW9uOworICAgIEZTdHJlYW0uQ29weUZyb20oIGlucHV0LCBDT1BZX0VOVElSRV9TVFJFQU0pOworICAgIEZTdHJlYW0uUG9zaXRpb24gOj0gYmVmb3JlOworICAgIHRhcmdldC5SZWFkKCBGUHJvdG9jb2wpOworICBmaW5hbGx5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7ICAvLyBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjNTc2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCkBAIC0wLDAgKzEsNDIzIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKKyB1bml0IFRocmlmdC5TZXJ2ZXI7CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9Cit7JEktfSAgLy8gcHJldmVudCBhbm5veWluZyBlcnJvcnMgd2l0aCBkZWZhdWx0IGxvZyBkZWxlZ2F0ZSBhbmQgbm8gY29uc29sZQorCitpbnRlcmZhY2UKKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBXaW5kb3dzLCBTeXNVdGlscywKKyAgeyRFTFNFfQorICBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLAorICB7JEVORElGfQorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlRyYW5zcG9ydDsKKwordHlwZQorICBJU2VydmVyRXZlbnRzID0gaW50ZXJmYWNlCisgICAgWyd7OUUyQTk5QzUtRUU4NS00MEIyLTlBNTItMkQxNzIyQjE4MTc2fSddCisgICAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KKyAgICBwcm9jZWR1cmUgUHJlU2VydmU7CisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIHNlcnZlciB0cmFuc3BvcnQgaXMgcmVhZHkgdG8gYWNjZXB0IHJlcXVlc3RzCisgICAgcHJvY2VkdXJlIFByZUFjY2VwdDsKKyAgICAvLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgdGhlIHNlcnZlciBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgIGZ1bmN0aW9uICBDcmVhdGVQcm9jZXNzaW5nQ29udGV4dCggY29uc3QgaW5wdXQsIG91dHB1dCA6IElQcm90b2NvbCkgOiBJUHJvY2Vzc29yRXZlbnRzOworICBlbmQ7CisKKworICBJU2VydmVyID0gaW50ZXJmYWNlCisgICAgWyd7QURDNDZGMkQtODE5OS00RDFDLTk2RDItODdGRDU0MzUxNzIzfSddCisgICAgcHJvY2VkdXJlIFNlcnZlOworICAgIHByb2NlZHVyZSBTdG9wOworCisgICAgZnVuY3Rpb24gR2V0U2VydmVyRXZlbnRzIDogSVNlcnZlckV2ZW50czsKKyAgICBwcm9jZWR1cmUgU2V0U2VydmVyRXZlbnRzKCBjb25zdCB2YWx1ZSA6IElTZXJ2ZXJFdmVudHMpOworCisgICAgcHJvcGVydHkgU2VydmVyRXZlbnRzIDogSVNlcnZlckV2ZW50cyByZWFkIEdldFNlcnZlckV2ZW50cyB3cml0ZSBTZXRTZXJ2ZXJFdmVudHM7CisgIGVuZDsKKworICBUU2VydmVySW1wbCA9IGNsYXNzIGFic3RyYWN0KCBUSW50ZXJmYWNlZE9iamVjdCwgSVNlcnZlciApCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRMb2dEZWxlZ2F0ZSA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIGNvbnN0IHN0cjogc3RyaW5nKTsKKyAgcHJvdGVjdGVkCisgICAgRlByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisgICAgRlNlcnZlclRyYW5zcG9ydCA6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgRklucHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICAgIEZPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgRklucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgICBGT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgICBGTG9nRGVsZWdhdGUgOiBUTG9nRGVsZWdhdGU7CisgICAgRlNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHM7CisKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVmYXVsdExvZ0RlbGVnYXRlKCBjb25zdCBzdHI6IHN0cmluZyk7CisKKyAgICBmdW5jdGlvbiBHZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXJFdmVudHMoIGNvbnN0IHZhbHVlIDogSVNlcnZlckV2ZW50cyk7CisKKyAgICBwcm9jZWR1cmUgU2VydmU7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBTdG9wOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICBjb25zdCBBT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICAgICAgY29uc3QgQUlucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgICAgIGNvbnN0IEFPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgICAgY29uc3QgQUxvZ0RlbGVnYXRlIDogVExvZ0RlbGVnYXRlCisgICAgICApOyBvdmVybG9hZDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgKKyAgICAgIGNvbnN0IEFQcm9jZXNzb3IgOklQcm9jZXNzb3I7CisgICAgICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0CisgICAgICApOyBvdmVybG9hZDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgKKyAgICAgIGNvbnN0IEFQcm9jZXNzb3IgOklQcm9jZXNzb3I7CisgICAgICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5CisgICAgICApOyBvdmVybG9hZDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgKKyAgICAgIGNvbnN0IEFQcm9jZXNzb3IgOklQcm9jZXNzb3I7CisgICAgICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQVRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIGNvbnN0IEFQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5CisgICAgICApOyBvdmVybG9hZDsKKyAgZW5kOworCisgIFRTaW1wbGVTZXJ2ZXIgPSBjbGFzcyggVFNlcnZlckltcGwpCisgIHByaXZhdGUKKyAgICBGU3RvcCA6IEJvb2xlYW47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIEFMb2dEZWw6IFRTZXJ2ZXJJbXBsLlRMb2dEZWxlZ2F0ZSk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeSk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeTsgY29uc3QgQVByb3RvY29sRmFjdG9yeTogSVByb3RvY29sRmFjdG9yeSk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIFNlcnZlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU3RvcDsgb3ZlcnJpZGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRTZXJ2ZXJJbXBsIH0KKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBjb25zdCBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSk7Cit2YXIKKyAgSW5wdXRGYWN0b3J5LCBPdXRwdXRGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc0ZhY3RvcnksIE91dHB1dFRyYW5zRmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworCitiZWdpbgorICBJbnB1dEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisgIE91dHB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoCisgICAgQVByb2Nlc3NvciwKKyAgICBBU2VydmVyVHJhbnNwb3J0LAorICAgIElucHV0VHJhbnNGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zRmFjdG9yeSwKKyAgICBJbnB1dEZhY3RvcnksCisgICAgT3V0cHV0RmFjdG9yeSwKKyAgICBBTG9nRGVsZWdhdGUKKyAgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQpOwordmFyCisgIElucHV0RmFjdG9yeSwgT3V0cHV0RmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIElucHV0VHJhbnNGYWN0b3J5LCBPdXRwdXRUcmFuc0ZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKworYmVnaW4KKyAgSW5wdXRGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBJbnB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICBPdXRwdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKworICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKAorICAgIEFQcm9jZXNzb3IsCisgICAgQVNlcnZlclRyYW5zcG9ydCwKKyAgICBJbnB1dFRyYW5zRmFjdG9yeSwKKyAgICBPdXRwdXRUcmFuc0ZhY3RvcnksCisgICAgSW5wdXRGYWN0b3J5LAorICAgIE91dHB1dEZhY3RvcnksCisgICAgRGVmYXVsdExvZ0RlbGVnYXRlCisgICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZShjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3RvcnkpOwordmFyCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKK2JlZ2luCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisKKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgQVRyYW5zcG9ydEZhY3RvcnksIEFUcmFuc3BvcnRGYWN0b3J5LAorICAgIElucHV0UHJvdG9jb2xGYWN0b3J5LCBPdXRwdXRQcm90b2NvbEZhY3RvcnksIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZShjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICBjb25zdCBBSW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBBT3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIGNvbnN0IEFJbnB1dFByb3RvY29sRmFjdG9yeSwgQU91dHB1dFByb3RvY29sRmFjdG9yeTogSVByb3RvY29sRmFjdG9yeTsKKyAgY29uc3QgQUxvZ0RlbGVnYXRlIDogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZQcm9jZXNzb3IgOj0gQVByb2Nlc3NvcjsKKyAgRlNlcnZlclRyYW5zcG9ydCA6PSBBU2VydmVyVHJhbnNwb3J0OworICBGSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDo9IEFJbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgIEZPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDo9IEFPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICBGSW5wdXRQcm90b2NvbEZhY3RvcnkgOj0gQUlucHV0UHJvdG9jb2xGYWN0b3J5OworICBGT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDo9IEFPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgIEZMb2dEZWxlZ2F0ZSA6PSBBTG9nRGVsZWdhdGU7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUU2VydmVySW1wbC5EZWZhdWx0TG9nRGVsZWdhdGUoIGNvbnN0IHN0cjogc3RyaW5nKTsKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oIHN0cik7CisgICAgaWYgSW9SZXN1bHQgPD4gMCB0aGVuIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKHN0cikpOworICBleGNlcHQKKyAgICBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihzdHIpKTsKKyAgZW5kOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgY29uc3QgQVByb3RvY29sRmFjdG9yeTogSVByb3RvY29sRmFjdG9yeSk7CitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIEFUcmFuc3BvcnRGYWN0b3J5LCBBVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBBUHJvdG9jb2xGYWN0b3J5LCBBUHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKKworZnVuY3Rpb24gVFNlcnZlckltcGwuR2V0U2VydmVyRXZlbnRzIDogSVNlcnZlckV2ZW50czsKK2JlZ2luCisgIHJlc3VsdCA6PSBGU2VydmVyRXZlbnRzOworZW5kOworCisKK3Byb2NlZHVyZSBUU2VydmVySW1wbC5TZXRTZXJ2ZXJFdmVudHMoIGNvbnN0IHZhbHVlIDogSVNlcnZlckV2ZW50cyk7CitiZWdpbgorICAvLyBpZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lLCBwcm92aWRlIGEgc3BlY2lhbGl6ZWQgSVNlcnZlckV2ZW50cyBpbXBsZW1lbnRhdGlvbgorICBGU2VydmVyRXZlbnRzIDo9IHZhbHVlOworZW5kOworCisKK3sgVFNpbXBsZVNlcnZlciB9CisKK2NvbnN0cnVjdG9yIFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0KTsKK3ZhcgorICBJbnB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIElucHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CitiZWdpbgorICBJbnB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworCisgIGluaGVyaXRlZCBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIElucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBJbnB1dFByb3RvY29sRmFjdG9yeSwgT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBEZWZhdWx0TG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2ltcGxlU2VydmVyLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgQUxvZ0RlbDogVFNlcnZlckltcGwuVExvZ0RlbGVnYXRlKTsKK3ZhcgorICBJbnB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIElucHV0VHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CitiZWdpbgorICBJbnB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworCisgIGluaGVyaXRlZCBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIElucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBJbnB1dFByb3RvY29sRmFjdG9yeSwgT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBBTG9nRGVsKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNpbXBsZVNlcnZlci5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LCBBVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBBVHJhbnNwb3J0RmFjdG9yeSwgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCBEZWZhdWx0TG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2ltcGxlU2VydmVyLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OworICBjb25zdCBBUHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIEFUcmFuc3BvcnRGYWN0b3J5LAorICAgIEFUcmFuc3BvcnRGYWN0b3J5LCBBUHJvdG9jb2xGYWN0b3J5LCBBUHJvdG9jb2xGYWN0b3J5LCBEZWZhdWx0TG9nRGVsZWdhdGUpOworZW5kOworCitwcm9jZWR1cmUgVFNpbXBsZVNlcnZlci5TZXJ2ZTsKK3ZhcgorICBjbGllbnQgOiBJVHJhbnNwb3J0OworICBJbnB1dFRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgIE91dHB1dFRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgIElucHV0UHJvdG9jb2wgOiBJUHJvdG9jb2w7CisgIE91dHB1dFByb3RvY29sIDogSVByb3RvY29sOworICBjb250ZXh0IDogSVByb2Nlc3NvckV2ZW50czsKK2JlZ2luCisgIHRyeQorICAgIEZTZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICBiZWdpbgorICAgICAgRkxvZ0RlbGVnYXRlKCBFLlRvU3RyaW5nKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBpZiBGU2VydmVyRXZlbnRzIDw+IG5pbAorICB0aGVuIEZTZXJ2ZXJFdmVudHMuUHJlU2VydmU7CisKKyAgY2xpZW50IDo9IG5pbDsKKyAgd2hpbGUgKG5vdCBGU3RvcCkgZG8KKyAgYmVnaW4KKyAgICB0cnkKKyAgICAgIC8vIGNsZWFuIHVwIGFueSBvbGQgaW5zdGFuY2VzIGJlZm9yZSB3YWl0aW5nIGZvciBjbGllbnRzCisgICAgICBJbnB1dFRyYW5zcG9ydCA6PSBuaWw7CisgICAgICBPdXRwdXRUcmFuc3BvcnQgOj0gbmlsOworICAgICAgSW5wdXRQcm90b2NvbCA6PSBuaWw7CisgICAgICBPdXRwdXRQcm90b2NvbCA6PSBuaWw7CisKKyAgICAgIC8vIGNsb3NlIGFueSBvbGQgY29ubmVjdGlvbnMgYmVmb3JlIGJlZm9yZSB3YWl0aW5nIGZvciBuZXcgY2xpZW50cworICAgICAgaWYgY2xpZW50IDw+IG5pbCB0aGVuIHRyeQorICAgICAgICB0cnkKKyAgICAgICAgICBjbGllbnQuQ2xvc2U7CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICBjbGllbnQgOj0gbmlsOworICAgICAgICBlbmQ7CisgICAgICBleGNlcHQKKyAgICAgICAgLy8gY2F0Y2ggYWxsLCB3ZSBjYW4ndCBkbyBtdWNoIGFib3V0IGl0IGF0IHRoaXMgcG9pbnQKKyAgICAgIGVuZDsKKworICAgICAgY2xpZW50IDo9IEZTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCBwcm9jZWR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBGU2VydmVyRXZlbnRzIDw+IG5pbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gRlNlcnZlckV2ZW50cy5QcmVBY2NlcHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCk7CisKKyAgICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIGJlZ2luCisgICAgICAgIGlmIEZTdG9wCisgICAgICAgIHRoZW4gQWJvcnQgIC8vIHNpbGVudCBleGNlcHRpb24KKyAgICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1NlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMJyk7CisgICAgICBlbmQ7CisKKyAgICAgIEZMb2dEZWxlZ2F0ZSggJ0NsaWVudCBDb25uZWN0ZWQhJyk7CisKKyAgICAgIElucHV0VHJhbnNwb3J0IDo9IEZJbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KCBjbGllbnQgKTsKKyAgICAgIE91dHB1dFRyYW5zcG9ydCA6PSBGT3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoIGNsaWVudCApOworICAgICAgSW5wdXRQcm90b2NvbCA6PSBGSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woIElucHV0VHJhbnNwb3J0ICk7CisgICAgICBPdXRwdXRQcm90b2NvbCA6PSBGT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKCBPdXRwdXRUcmFuc3BvcnQgKTsKKworICAgICAgaWYgRlNlcnZlckV2ZW50cyA8PiBuaWwKKyAgICAgIHRoZW4gY29udGV4dCA6PSBGU2VydmVyRXZlbnRzLkNyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KCBJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCkKKyAgICAgIGVsc2UgY29udGV4dCA6PSBuaWw7CisKKyAgICAgIHdoaWxlIG5vdCBGU3RvcCBkbyBiZWdpbgorICAgICAgICBpZiBjb250ZXh0IDw+IG5pbAorICAgICAgICB0aGVuIGNvbnRleHQuUHJvY2Vzc2luZyggY2xpZW50KTsKKyAgICAgICAgaWYgbm90IEZQcm9jZXNzb3IuUHJvY2VzcyggSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wsIGNvbnRleHQpCisgICAgICAgIHRoZW4gQnJlYWs7CisgICAgICBlbmQ7CisKKyAgICBleGNlcHQKKyAgICAgIG9uIEU6IFRUcmFuc3BvcnRFeGNlcHRpb24gZG8KKyAgICAgIGJlZ2luCisgICAgICAgIGlmIEZTdG9wCisgICAgICAgIHRoZW4gRkxvZ0RlbGVnYXRlKCdUU2ltcGxlU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgJyArIEUuVG9TdHJpbmcpCisgICAgICAgIGVsc2UgRkxvZ0RlbGVnYXRlKCBFLlRvU3RyaW5nKTsKKyAgICAgIGVuZDsKKyAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgYmVnaW4KKyAgICAgICAgRkxvZ0RlbGVnYXRlKCBFLlRvU3RyaW5nKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBpZiBjb250ZXh0IDw+IG5pbAorICAgIHRoZW4gYmVnaW4KKyAgICAgIGNvbnRleHQuQ2xlYW51cENvbnRleHQ7CisgICAgICBjb250ZXh0IDo9IG5pbDsKKyAgICBlbmQ7CisKKyAgICBpZiBJbnB1dFRyYW5zcG9ydCA8PiBuaWwgdGhlbgorICAgIGJlZ2luCisgICAgICBJbnB1dFRyYW5zcG9ydC5DbG9zZTsKKyAgICBlbmQ7CisgICAgaWYgT3V0cHV0VHJhbnNwb3J0IDw+IG5pbCB0aGVuCisgICAgYmVnaW4KKyAgICAgIE91dHB1dFRyYW5zcG9ydC5DbG9zZTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBpZiBGU3RvcCB0aGVuCisgIGJlZ2luCisgICAgdHJ5CisgICAgICBGU2VydmVyVHJhbnNwb3J0LkNsb3NlOworICAgIGV4Y2VwdAorICAgICAgb24gRTogVFRyYW5zcG9ydEV4Y2VwdGlvbiBkbworICAgICAgYmVnaW4KKyAgICAgICAgRkxvZ0RlbGVnYXRlKCdUU2VydmVyVHJhbnBvcnQgZmFpbGVkIG9uIGNsb3NlOiAnICsgRS5NZXNzYWdlKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgICAgRlN0b3AgOj0gRmFsc2U7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTaW1wbGVTZXJ2ZXIuU3RvcDsKK2JlZ2luCisgIEZTdG9wIDo9IFRydWU7CisgIEZTZXJ2ZXJUcmFuc3BvcnQuQ2xvc2U7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYWI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzCkBAIC0wLDAgKzEsMTYxNyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Tb2NrZXQ7CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9Cit7JEktfSAgLy8gcHJldmVudCBhbm5veWluZyBlcnJvcnMgd2l0aCBkZWZhdWx0IGxvZyBkZWxlZ2F0ZSBhbmQgbm8gY29uc29sZQorCitpbnRlcmZhY2UKK3skSUZOREVGIE9MRF9TT0NLRVRTfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCisKK3VzZXMKKyAgV2luYXBpLldpbmRvd3MsIFdpbmFwaS5XaW5zb2NrMjsKKworY29uc3QKKyAgQUlfUEFTU0lWRSAgICAgICAgICAgICAgICA9ICQwMDAwMDAwMTsgIC8vIFNvY2tldCBhZGRyZXNzIHdpbGwgYmUgdXNlZCBpbiBiaW5kKCkgY2FsbAorICBBSV9DQU5PTk5BTUUgICAgICAgICAgICAgID0gJDAwMDAwMDAyOyAgLy8gUmV0dXJuIGNhbm9uaWNhbCBuYW1lIGluIGZpcnN0IGFpX2Nhbm9ubmFtZQorICBBSV9OVU1FUklDSE9TVCAgICAgICAgICAgID0gJDAwMDAwMDA0OyAgLy8gTm9kZW5hbWUgbXVzdCBiZSBhIG51bWVyaWMgYWRkcmVzcyBzdHJpbmcKKyAgQUlfTlVNRVJJQ1NFUlYgICAgICAgICAgICA9ICQwMDAwMDAwODsgIC8vIFNlcnZpY2VuYW1lIG11c3QgYmUgYSBudW1lcmljIHBvcnQgbnVtYmVyCisKKyAgQUlfQUxMICAgICAgICAgICAgICAgICAgICA9ICQwMDAwMDEwMDsgIC8vIFF1ZXJ5IGJvdGggSVA2IGFuZCBJUDQgd2l0aCBBSV9WNE1BUFBFRAorICBBSV9BRERSQ09ORklHICAgICAgICAgICAgID0gJDAwMDAwNDAwOyAgLy8gUmVzb2x1dGlvbiBvbmx5IGlmIGdsb2JhbCBhZGRyZXNzIGNvbmZpZ3VyZWQKKyAgQUlfVjRNQVBQRUQgICAgICAgICAgICAgICA9ICQwMDAwMDgwMDsgIC8vIE9uIHY2IGZhaWx1cmUsIHF1ZXJ5IHY0IGFuZCBjb252ZXJ0IHRvIFY0TUFQUEVEIGZvcm1hdAorCisgIEFJX05PTl9BVVRIT1JJVEFUSVZFICAgICAgPSAkMDAwMDQwMDA7ICAvLyBMVVBfTk9OX0FVVEhPUklUQVRJVkUKKyAgQUlfU0VDVVJFICAgICAgICAgICAgICAgICA9ICQwMDAwODAwMDsgIC8vIExVUF9TRUNVUkUKKyAgQUlfUkVUVVJOX1BSRUZFUlJFRF9OQU1FUyA9ICQwMDAxMDAwMDsgIC8vIExVUF9SRVRVUk5fUFJFRkVSUkVEX05BTUVTCisKKyAgQUlfRlFETiAgICAgICAgICAgICAgICAgICA9ICQwMDAyMDAwMDsgIC8vIFJldHVybiB0aGUgRlFETiBpbiBhaV9jYW5vbm5hbWUKKyAgQUlfRklMRVNFUlZFUiAgICAgICAgICAgICA9ICQwMDA0MDAwMDsgIC8vIFJlc29sdmluZyBmaWxlc2VydmVyIG5hbWUgcmVzb2x1dGlvbgorCit0eXBlCisgIFBBZGRySW5mb0EgPSBeVEFkZHJJbmZvQTsKKyAgVEFkZHJJbmZvQSA9IHJlY29yZAorICAgIGFpX2ZsYWdzOiBJbnRlZ2VyOworICAgIGFpX2ZhbWlseTogSW50ZWdlcjsKKyAgICBhaV9zb2NrdHlwZTogSW50ZWdlcjsKKyAgICBhaV9wcm90b2NvbDogSW50ZWdlcjsKKyAgICBhaV9hZGRybGVuOiBOYXRpdmVVSW50OworICAgIGFpX2Nhbm9ubmFtZTogUEFuc2lDaGFyOworICAgIGFpX2FkZHI6IFBTb2NrQWRkcjsKKyAgICBhaV9uZXh0OiBQQWRkckluZm9BOworICBlbmQ7CisKKyAgUEFkZHJJbmZvVyA9IF5UQWRkckluZm9XOworICBUQWRkckluZm9XID0gcmVjb3JkCisgICAgYWlfZmxhZ3M6IEludGVnZXI7CisgICAgYWlfZmFtaWx5OiBJbnRlZ2VyOworICAgIGFpX3NvY2t0eXBlOiBJbnRlZ2VyOworICAgIGFpX3Byb3RvY29sOiBJbnRlZ2VyOworICAgIGFpX2FkZHJsZW46IE5hdGl2ZVVJbnQ7CisgICAgYWlfY2Fub25uYW1lOiBQQ2hhcjsKKyAgICBhaV9hZGRyOiBQU29ja0FkZHI7CisgICAgYWlfbmV4dDogUEFkZHJJbmZvVzsKKyAgZW5kOworCisgIFRBZGRyZXNzRmFtaWx5ID0gVVNIT1JUOworCisgIFRJbjZBZGRyID0gcmVjb3JkCisgIGNhc2UgSW50ZWdlciBvZgorICAgIDA6IChfQnl0ZTogYXJyYXlbMC4uMTVdIG9mIFVDSEFSKTsKKyAgICAxOiAoX1dvcmQ6IGFycmF5WzAuLjddIG9mIFVTSE9SVCk7CisgIGVuZDsKKworICBUU2NvcGVJZCA9IHJlY29yZAorICBwdWJsaWMKKyAgICBWYWx1ZTogVUxPTkc7CisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBHZXRCaXRGaWVsZChMb2M6IEludGVnZXIpOiBJbnRlZ2VyOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFNldEJpdEZpZWxkKExvYzogSW50ZWdlcjsgY29uc3QgYVZhbHVlOiBJbnRlZ2VyKTsgaW5saW5lOworICBwdWJsaWMKKyAgICBwcm9wZXJ0eSBab25lOiBJbnRlZ2VyIGluZGV4ICQwMDI4IHJlYWQgR2V0Qml0RmllbGQgd3JpdGUgU2V0Qml0RmllbGQ7CisgICAgcHJvcGVydHkgTGV2ZWw6IEludGVnZXIgaW5kZXggJDI4MDQgcmVhZCBHZXRCaXRGaWVsZCB3cml0ZSBTZXRCaXRGaWVsZDsKKyAgZW5kOworCisgIFRTb2NrQWRkckluNiA9IHJlY29yZAorICAgIHNpbjZfZmFtaWx5OiBUQWRkcmVzc0ZhbWlseTsKKyAgICBzaW42X3BvcnQ6IFVTSE9SVDsKKyAgICBzaW42X2Zsb3dpbmZvOiBVTE9ORzsKKyAgICBzaW42X2FkZHI6IFRJbjZBZGRyOworICBjYXNlIEludGVnZXIgb2YKKyAgICAwOiAoc2luNl9zY29wZV9pZDogVUxPTkcpOworICAgIDE6IChzaW42X3Njb3BlX3N0cnVjdDogVFNjb3BlSWQpOworICBlbmQ7CisgIFBTb2NrQWRkckluNiA9IF5UU29ja0FkZHJJbjY7CisKK2NvbnN0CisgIE5JX05PRlFETiAgICAgID0gJDAxOyAgLy8gT25seSByZXR1cm4gbm9kZW5hbWUgcG9ydGlvbiBmb3IgbG9jYWwgaG9zdHMKKyAgTklfTlVNRVJJQ0hPU1QgPSAkMDI7ICAvLyBSZXR1cm4gbnVtZXJpYyBmb3JtIG9mIHRoZSBob3N0J3MgYWRkcmVzcworICBOSV9OQU1FUkVRRCAgICA9ICQwNDsgIC8vIEVycm9yIGlmIHRoZSBob3N0J3MgbmFtZSBub3QgaW4gRE5TCisgIE5JX05VTUVSSUNTRVJWID0gJDA4OyAgLy8gUmV0dXJuIG51bWVyaWMgZm9ybSBvZiB0aGUgc2VydmljZSAocG9ydCAjKQorICBOSV9ER1JBTSAgICAgICA9ICQxMDsgIC8vIFNlcnZpY2UgaXMgYSBkYXRhZ3JhbSBzZXJ2aWNlCisKKyAgTklfTUFYSE9TVCAgICAgPSAxMDI1OyAgLy8gTWF4IHNpemUgb2YgYSBmdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUKKyAgTklfTUFYU0VSViAgICAgPSAzMjsgICAgLy8gTWF4IHNpemUgb2YgYSBzZXJ2aWNlIG5hbWUKKworZnVuY3Rpb24gZ2V0YWRkcmluZm8ocE5vZGVOYW1lLCBwU2VydmljZU5hbWU6IFBBbnNpQ2hhcjsgY29uc3QgcEhpbnRzOiBUQWRkckluZm9BOyB2YXIgcHBSZXN1bHQ6IFBBZGRySW5mb0EpOiBJbnRlZ2VyOyBzdGRjYWxsOworZnVuY3Rpb24gR2V0QWRkckluZm9XKHBOb2RlTmFtZSwgcFNlcnZpY2VOYW1lOiBQV2lkZUNoYXI7IGNvbnN0IHBIaW50czogVEFkZHJJbmZvVzsgdmFyIHBwUmVzdWx0OiBQQWRkckluZm9XKTogSW50ZWdlcjsgc3RkY2FsbDsKK3Byb2NlZHVyZSBmcmVlYWRkcmluZm8ocEFkZHJJbmZvOiBQQWRkckluZm9BKTsgc3RkY2FsbDsKK3Byb2NlZHVyZSBGcmVlQWRkckluZm9XKHBBZGRySW5mbzogUEFkZHJJbmZvVyk7IHN0ZGNhbGw7CitmdW5jdGlvbiBnZXRuYW1laW5mbyhjb25zdCBwU29ja2FkZHI6IFRTb2NrQWRkcjsgU29ja2FkZHJMZW5ndGg6IEludGVnZXI7IHBOb2RlQnVmZmVyOiBQQW5zaUNoYXI7IE5vZGVCdWZmZXJTaXplOiBEV09SRDsgcFNlcnZpY2VCdWZmZXI6IFBBbnNpQ2hhcjsKKyAgU2VydmljZUJ1ZmZlclNpemU6IERXT1JEOyBGbGFnczogSW50ZWdlcik6IEludGVnZXI7IHN0ZGNhbGw7CitmdW5jdGlvbiBHZXROYW1lSW5mb1coY29uc3QgcFNvY2thZGRyOiBUU29ja0FkZHI7IFNvY2thZGRyTGVuZ3RoOiBJbnRlZ2VyOyBwTm9kZUJ1ZmZlcjogUFdpZGVDaGFyOyBOb2RlQnVmZmVyU2l6ZTogRFdPUkQ7IHBTZXJ2aWNlQnVmZmVyOiBQV2lkZUNoYXI7CisgIFNlcnZpY2VCdWZmZXJTaXplOiBEV09SRDsgRmxhZ3M6IEludGVnZXIpOiBJbnRlZ2VyOyBzdGRjYWxsOworCit0eXBlCisgIFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKFZhbHVlOiBUKTsKKworICBJU21hcnRQb2ludGVyPFQ+ID0gcmVmZXJlbmNlIHRvIGZ1bmN0aW9uOiBUOworCisgIFRTbWFydFBvaW50ZXI8VD4gPSBjbGFzcyhUSW50ZXJmYWNlZE9iamVjdCwgSVNtYXJ0UG9pbnRlcjxUPikKKyAgcHJpdmF0ZQorICAgIEZWYWx1ZTogVDsKKyAgICBGRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVZhbHVlOiBUOyBBRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+KTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEludm9rZTogVDsKKyAgZW5kOworCisgIFRCYXNlU29ja2V0ID0gY2xhc3MgYWJzdHJhY3QKKyAgcHVibGljIHR5cGUKKyAgICBUTG9nRGVsZWdhdGUgPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBjb25zdCBzdHI6IHN0cmluZyk7CisgIHN0cmljdCBwcml2YXRlCisgICAgRlBvcnQ6IEludGVnZXI7CisgICAgRlNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgICAgRlNlbmRUaW1lb3V0LAorICAgIEZSZWN2VGltZW91dDogTG9uZ3dvcmQ7CisgICAgRktlZXBBbGl2ZTogQm9vbGVhbjsKKyAgICBGTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZTsKKyAgICBjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OworICAgIGNsYXNzIHByb2NlZHVyZSBEZWZhdWx0TG9nRGVsZWdhdGUoY29uc3QgU3RyOiBzdHJpbmcpOworICBwcm90ZWN0ZWQgdHlwZQorICAgIElHZXRBZGRySW5mb1dyYXBwZXIgPSBpbnRlcmZhY2UKKyAgICAgIGZ1bmN0aW9uIEluaXQ6IEludGVnZXI7CisgICAgICBmdW5jdGlvbiBHZXRSZXM6IFBBZGRySW5mb1c7CisgICAgICBwcm9wZXJ0eSBSZXM6IFBBZGRySW5mb1cgcmVhZCBHZXRSZXM7CisgICAgZW5kOworICAgIFRHZXRBZGRySW5mb1dyYXBwZXIgPSBjbGFzcyhUSW50ZXJmYWNlZE9iamVjdCwgSUdldEFkZHJJbmZvV3JhcHBlcikKKyAgICBzdHJpY3QgcHJpdmF0ZQorICAgICAgRk5vZGU6IHN0cmluZzsKKyAgICAgIEZTZXJ2aWNlOiBzdHJpbmc7CisgICAgICBGSGludHMsCisgICAgICBGUmVzOiBQQWRkckluZm9XOworICAgIHB1YmxpYworICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFOb2RlLCBBU2VydmljZTogc3RyaW5nOyBBSGludHM6IFBBZGRySW5mb1cpOworICAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICAgIGZ1bmN0aW9uIEluaXQ6IEludGVnZXI7CisgICAgICBmdW5jdGlvbiBHZXRSZXM6IFBBZGRySW5mb1c7CisgICAgICBwcm9wZXJ0eSBSZXM6IFBBZGRySW5mb1cgcmVhZCBHZXRSZXM7CisgICAgZW5kOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0KEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyKTogSUdldEFkZHJJbmZvV3JhcHBlcjsKKyAgICBwcm9jZWR1cmUgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFNvY2tldChBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisgICAgcHJvcGVydHkgTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSByZWFkIEZMb2dEZWxlZ2F0ZTsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIERlc3Ryb3lzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICAvLworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisKKyAgICAvLworICAgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldAorICAgIC8vCisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOworCisgICAgLy8gVGhlIHBvcnQgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IFBvcnQ6IEludGVnZXIgcmVhZCBGUG9ydCB3cml0ZSBGUG9ydDsKKworICAgIC8vIFRoZSByZWNlaXZlIHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBSZWN2VGltZW91dDogTG9uZ3dvcmQgcmVhZCBGUmVjdlRpbWVvdXQgd3JpdGUgU2V0UmVjdlRpbWVvdXQ7CisKKyAgICAvLyBUaGUgc2VuZCB0aW1lb3V0CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRlNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OworCisgICAgLy8gU2V0IFNPX0tFRVBBTElWRQorICAgIHByb3BlcnR5IEtlZXBBbGl2ZTogQm9vbGVhbiByZWFkIEZLZWVwQWxpdmUgd3JpdGUgU2V0S2VlcEFsaXZlOworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgc29ja2V0IGRlc2NyaXB0b3IKKyAgICBwcm9wZXJ0eSBTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0IHJlYWQgRlNvY2tldCB3cml0ZSBTZXRTb2NrZXQ7CisgIGVuZDsKKworICBUU29ja2V0ID0gY2xhc3MoVEJhc2VTb2NrZXQpCisgIHN0cmljdCBwcml2YXRlIHR5cGUKKyAgICBUQ2FjaGVkUGVlckFkZHIgPSByZWNvcmQKKyAgICBjYXNlIEludGVnZXIgb2YKKyAgICAgIDA6IChpcHY0OiBUU29ja0FkZHJJbik7CisgICAgICAxOiAoaXB2NjogVFNvY2tBZGRySW42KTsKKyAgICBlbmQ7CisgIHN0cmljdCBwcml2YXRlCisgICAgRkhvc3Q6IHN0cmluZzsKKyAgICBGUGVlckhvc3Q6IHN0cmluZzsKKyAgICBGUGVlckFkZHJlc3M6IHN0cmluZzsKKyAgICBGUGVlclBvcnQ6IEludGVnZXI7CisgICAgRkludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgICBGQ29ublRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZMaW5nZXJPbjogQm9vbGVhbjsKKyAgICBGTGluZ2VyVmFsOiBJbnRlZ2VyOworICAgIEZOb0RlbGF5OiBCb29sZWFuOworICAgIEZNYXhSZWN2UmV0cmllczogTG9uZ3dvcmQ7CisgICAgRkNhY2hlZFBlZXJBZGRyOiBUQ2FjaGVkUGVlckFkZHI7CisgICAgcHJvY2VkdXJlIEluaXRQZWVySW5mbzsKKyAgICBwcm9jZWR1cmUgT3BlbkNvbm5lY3Rpb24oUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyKTsKKyAgICBwcm9jZWR1cmUgTG9jYWxPcGVuOworICAgIHByb2NlZHVyZSBTZXRHZW5lcmljVGltZW91dChTOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgVGltZW91dDogTG9uZ3dvcmQ7IE9wdE5hbWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgU2V0Tm9EZWxheShBTm9EZWxheTogQm9vbGVhbik7CisgICAgZnVuY3Rpb24gR2V0U29ja2V0SW5mbzogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJIb3N0OiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlckFkZHJlc3M6IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVyUG9ydDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRPcmlnaW46IHN0cmluZzsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIC8vIEBwYXJhbSBob3N0IEFuIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgdG8gY29ubmVjdCB0bworICAgIC8vIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHNvY2tldCBkZXNjcmlwdG9yLgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gc29ja2V0IGRlc2NyaXB0b3IgdGhhdAorICAgIC8vIGNhbiBiZSBpbnRlcnJ1cHRlZCBzYWZlbHkuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgICAgICBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgc29ja2V0CisgICAgLy8KKyAgICAvLyBAdGhyb3dzIEVUcmFuc3BvcnRhdGlvbkV4Y2VwdGlvbiBJZiB0aGUgc29ja2V0IGNvdWxkIG5vdCBjb25uZWN0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgT3BlbjsKKworICAgIC8vCisgICAgLy8gU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyBSZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICAvLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpbmRpY2F0ZXMgRU9GCisgICAgLy8gXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgorICAgIC8vICAgICAgICAgIEludGVycnVwdGVkIG1lYW5zIHRoZSBzb2NrZXQgd2FzIGludGVycnVwdGVkCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgb3V0IG9mIGEgYmxvY2tpbmcgY2FsbAorICAgIC8vICAgICAgICAgIE5vdE9wZW4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICAvLyAgICAgICAgICBUaW1lZE91dCBtZWFucyB0aGUgcmVjZWl2ZSB0aW1lb3V0IGV4cGlyZWQKKyAgICAvLyAgICAgICAgICBVbmtub3duIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAgLy8KKyAgICBmdW5jdGlvbiBSZWFkKHZhciBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7CisKKyAgICAvLworICAgIC8vIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBMb29wcyB1bnRpbCBkb25lIG9yIGZhaWwuCisgICAgLy8KKyAgICBwcm9jZWR1cmUgV3JpdGUoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgRG9lcyBzaW5nbGUgc2VuZCgpIGFuZCByZXR1cm5zIHJlc3VsdC4KKyAgICAvLworICAgIGZ1bmN0aW9uIFdyaXRlUGFydGlhbChjb25zdCBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7CisKKyAgICAvLworICAgIC8vIFJldHVybnMgYSBjYWNoZWQgY29weSBvZiB0aGUgcGVlciBhZGRyZXNzLgorICAgIC8vCisgICAgZnVuY3Rpb24gR2V0Q2FjaGVkQWRkcmVzcyhvdXQgTGVuOiBJbnRlZ2VyKTogUFNvY2tBZGRyOworCisgICAgLy8KKyAgICAvLyBTZXQgYSBjYWNoZSBvZiB0aGUgcGVlciBhZGRyZXNzICh1c2VkIHdoZW4gdHJpdmlhbGx5IGF2YWlsYWJsZTogZS5nLgorICAgIC8vIGFjY2VwdCgpIG9yIGNvbm5lY3QoKSkuIE9ubHkgY2FjaGVzIElQVjQgYW5kIElQVjY7IHVuc2V0IGZvciBvdGhlcnMuCisgICAgLy8KKyAgICBwcm9jZWR1cmUgU2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBBZGRyOiBUU29ja0FkZHI7IExlbjogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpbmdlciBvcHRpb24gaXMgc2V0IG9uIHRoZSBzb2NrZXQuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gb24gICAgICBXaGV0aGVyIFNPX0xJTkdFUiBpcyBvbgorICAgIC8vIEBwYXJhbSBsaW5nZXIgIElmIGxpbmdlciBpcyBhY3RpdmUsIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBsaW5nZXIgZm9yCisgICAgLy8KKyAgICBwcm9jZWR1cmUgU2V0TGluZ2VyKExpbmdlck9uOiBCb29sZWFuOyBMaW5nZXJWYWw6IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBDYWxscyBzZWxlY3QoKSBvbiB0aGUgc29ja2V0IHRvIHNlZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlLgorICAgIC8vCisgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsKKworICAgIC8vIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBhbGl2ZQorICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKworICAgIC8vIFRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBIb3N0OiBzdHJpbmcgcmVhZCBGSG9zdCB3cml0ZSBGSG9zdDsKKworICAgIC8vIFdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgTmFnbGUncyBhbGdvcml0aG0KKyAgICBwcm9wZXJ0eSBOb0RlbGF5OiBCb29sZWFuIHJlYWQgRk5vRGVsYXkgd3JpdGUgU2V0Tm9EZWxheTsKKworICAgIC8vIENvbm5lY3QgdGltZW91dAorICAgIHByb3BlcnR5IENvbm5UaW1lb3V0OiBMb25nd29yZCByZWFkIEZDb25uVGltZW91dCB3cml0ZSBGQ29ublRpbWVvdXQ7CisKKyAgICAvLyBUaGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gdGhlIGNhc2Ugb2YgYSBXU0FFV09VTERCTE9DSworICAgIHByb3BlcnR5IE1heFJlY3ZSZXRyaWVzOiBMb25nd29yZCByZWFkIEZNYXhSZWN2UmV0cmllcyB3cml0ZSBGTWF4UmVjdlJldHJpZXM7CisKKyAgICAvLyBTb2NrZXQgaW5mb3JtYXRpb24gZm9ybWF0dGVkIGFzIGEgc3RyaW5nIDxIb3N0OiB4IFBvcnQ6IHg+CisgICAgcHJvcGVydHkgU29ja2V0SW5mbzogc3RyaW5nIHJlYWQgR2V0U29ja2V0SW5mbzsKKworICAgIC8vIFRoZSBETlMgbmFtZSBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJIb3N0OiBzdHJpbmcgcmVhZCBHZXRQZWVySG9zdDsKKworICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlckFkZHJlc3M6IHN0cmluZyByZWFkIEdldFBlZXJBZGRyZXNzOworCisgICAgLy8gVGhlIHBvcnQgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVyUG9ydDogSW50ZWdlciByZWFkIEdldFBlZXJQb3J0OworCisgICAgLy8gVGhlIG9yaWdpbiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IE9yaWdpbjogc3RyaW5nIHJlYWQgR2V0T3JpZ2luOworICBlbmQ7CisKKyAgVFNlcnZlclNvY2tldEZ1bmMgPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKHNvY2s6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKworICBUU2VydmVyU29ja2V0ID0gY2xhc3MoVEJhc2VTb2NrZXQpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkFkZHJlc3M6IHN0cmluZzsKKyAgICBGQWNjZXB0QmFja2xvZywKKyAgICBGUmV0cnlMaW1pdCwKKyAgICBGUmV0cnlEZWxheSwKKyAgICBGVGNwU2VuZEJ1ZmZlciwKKyAgICBGVGNwUmVjdkJ1ZmZlcjogSW50ZWdlcjsKKyAgICBGQWNjZXB0VGltZW91dDogTG9uZ3dvcmQ7CisgICAgRkxpc3RlbmluZywKKyAgICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuOiBCb29sZWFuOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gSW50ZXJydXB0KCkKKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVzZWQgaW4gc2VsZWN0IHdpdGggRlNvY2tldCBmb3IgaW50ZXJydXB0YWJpbGl0eQorICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gSW50ZXJydXB0Q2hpbGRyZW4oKQorICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OyAgLy8gaWYgRm50ZXJydXB0YWJsZUNoaWxkcmVuIHRoaXMgaXMgc2hhcmVkIHdpdGggY2hpbGQgVFNvY2tldHMKKyAgICBGTGlzdGVuQ2FsbGJhY2ssCisgICAgRkFjY2VwdENhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYzsKKyAgICBmdW5jdGlvbiBDcmVhdGVTb2NrZXRPYmooQ2xpZW50OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IFRTb2NrZXQ7CisgICAgcHJvY2VkdXJlIE5vdGlmeShOb3RpZnlTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKyAgICBwcm9jZWR1cmUgU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKEFWYWx1ZTogQm9vbGVhbik7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgb3ZlcnJpZGU7CisgIHB1YmxpYyBjb25zdAorICAgIERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLyBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAorICAgIC8vIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFTZW5kVGltZW91dCwgQVJlY3ZUaW1lb3V0OiBMb25nd29yZDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgTGlzdGVuOworICAgIGZ1bmN0aW9uIEFjY2VwdDogVFNvY2tldDsKKyAgICBwcm9jZWR1cmUgSW50ZXJydXB0OworICAgIHByb2NlZHVyZSBJbnRlcnJ1cHRDaGlsZHJlbjsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworCisgICAgcHJvcGVydHkgQWNjZXB0QmFja2xvZzogSW50ZWdlciByZWFkIEZBY2NlcHRCYWNrbG9nIHdyaXRlIEZBY2NlcHRCYWNrbG9nOworICAgIHByb3BlcnR5IEFjY2VwdFRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRkFjY2VwdFRpbWVvdXQgd3JpdGUgRkFjY2VwdFRpbWVvdXQ7CisgICAgcHJvcGVydHkgUmV0cnlMaW1pdDogSW50ZWdlciByZWFkIEZSZXRyeUxpbWl0IHdyaXRlIEZSZXRyeUxpbWl0OworICAgIHByb3BlcnR5IFJldHJ5RGVsYXk6IEludGVnZXIgcmVhZCBGUmV0cnlEZWxheSB3cml0ZSBGUmV0cnlEZWxheTsKKyAgICBwcm9wZXJ0eSBUY3BTZW5kQnVmZmVyOiBJbnRlZ2VyIHJlYWQgRlRjcFNlbmRCdWZmZXIgd3JpdGUgRlRjcFNlbmRCdWZmZXI7CisgICAgcHJvcGVydHkgVGNwUmVjdkJ1ZmZlcjogSW50ZWdlciByZWFkIEZUY3BSZWN2QnVmZmVyIHdyaXRlIEZUY3BSZWN2QnVmZmVyOworCisgICAgLy8gV2hlbiBlbmFibGVkICh0aGUgZGVmYXVsdCksIG5ldyBjaGlsZHJlbiBUU29ja2V0cyB3aWxsIGJlIGNvbnN0cnVjdGVkIHNvCisgICAgLy8gdGhleSBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgVFNlcnZlclRyYW5zcG9ydC5JbnRlcnJ1cHRDaGlsZHJlbigpLgorICAgIC8vIFRoaXMgaXMgbW9yZSBleHBlbnNpdmUgaW4gdGVybXMgb2Ygc3lzdGVtIGNhbGxzIChwb2xsICsgcmVjdikgaG93ZXZlcgorICAgIC8vIGVuc3VyZXMgYSBjb25uZWN0ZWQgY2xpZW50IGNhbm5vdCBpbnRlcmZlcmUgd2l0aCBUU2VydmVyLlN0b3AoKS4KKyAgICAvLworICAgIC8vIFdoZW4gZGlzYWJsZWQsIFRTb2NrZXQgY2hpbGRyZW4gZG8gbm90IGluY3VyIGFuIGFkZGl0aW9uYWwgcG9sbCgpIGNhbGwuCisgICAgLy8gU2VydmVyLXNpZGUgcmVhZHMgYXJlIG1vcmUgZWZmaWNpZW50LCBob3dldmVyIGEgY2xpZW50IGNhbiBpbnRlcmZlcmUgd2l0aAorICAgIC8vIHRoZSBzZXJ2ZXIncyBhYmlsaXR5IHRvIHNodXRkb3duIHByb3Blcmx5IGJ5IHN0YXlpbmcgY29ubmVjdGVkLgorICAgIC8vCisgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxpc3RlbigpOyBtb2RlIGNhbm5vdCBiZSBzd2l0Y2hlZCBhZnRlciB0aGF0LgorICAgIC8vIFx0aHJvd3MgRVByb3BlcnR5RXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCisgICAgcHJvcGVydHkgSW50ZXJydXB0YWJsZUNoaWxkcmVuOiBCb29sZWFuIHJlYWQgRkludGVycnVwdGFibGVDaGlsZHJlbiB3cml0ZSBTZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW47CisKKyAgICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgICAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgICAgLy8gdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICAgIHByb3BlcnR5IExpc3RlbkNhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYyByZWFkIEZMaXN0ZW5DYWxsYmFjayB3cml0ZSBGTGlzdGVuQ2FsbGJhY2s7CisKKyAgICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgICAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgICAgLy8gY3VzdG9tIHNldHNvY2tvcHQgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gb24gdGhlIGFjY2VwdGVkCisgICAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgICBwcm9wZXJ0eSBBY2NlcHRDYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmMgcmVhZCBGQWNjZXB0Q2FsbGJhY2sgd3JpdGUgRkFjY2VwdENhbGxiYWNrOworICBlbmQ7CisKK3skRU5ESUZ9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKK2ltcGxlbWVudGF0aW9uCit7JElGTkRFRiBPTERfU09DS0VUU30gLy8gbm90IGZvciBPTERfU09DS0VUUworCit1c2VzCisgIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLk1hdGgsIFN5c3RlbS5EYXRlVXRpbHMsIFRocmlmdC5UcmFuc3BvcnQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuQ3JlYXRlKEFOb2RlLCBBU2VydmljZTogc3RyaW5nOyBBSGludHM6IFBBZGRySW5mb1cpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRk5vZGUgOj0gQU5vZGU7CisgIEZTZXJ2aWNlIDo9IEFTZXJ2aWNlOworICBGSGludHMgOj0gQUhpbnRzOworICBGUmVzIDo9IG5pbDsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkRlc3Ryb3k7CitiZWdpbgorICBpZiBBc3NpZ25lZChGUmVzKSB0aGVuCisgICAgRnJlZUFkZHJJbmZvVyhGUmVzKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuSW5pdDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZSZXMgPSBuaWwgdGhlbgorICAgIEV4aXQoR2V0QWRkckluZm9XKEBGTm9kZVsxXSwgQEZTZXJ2aWNlWzFdLCBGSGludHNeLCBGUmVzKSk7CisgIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkdldFJlczogUEFkZHJJbmZvVzsKK2JlZ2luCisgIFJlc3VsdCA6PSBGUmVzOworZW5kOworCitwcm9jZWR1cmUgRGVzdHJveWVyT2ZGaW5lU29ja2V0cyhzc29jazogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworYmVnaW4KKyAgY2xvc2Vzb2NrZXQoc3NvY2spOworZW5kOworCitmdW5jdGlvbiBUU2NvcGVJZC5HZXRCaXRGaWVsZChMb2M6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IChWYWx1ZSBzaHIgKExvYyBzaHIgOCkpIGFuZCAoKDEgc2hsIChMb2MgYW5kICRGRikpIC0gMSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2NvcGVJZC5TZXRCaXRGaWVsZChMb2M6IEludGVnZXI7IGNvbnN0IGFWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBWYWx1ZSA6PSAoVmFsdWUgYW5kIFVMT05HKChub3QgKCgxIHNobCAoTG9jIGFuZCAkRkYpKSAtIDEpKSkpIG9yIFVMT05HKGFWYWx1ZSBzaGwgKExvYyBzaHIgOCkpOworZW5kOworCitmdW5jdGlvbiBnZXRhZGRyaW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2dldGFkZHJpbmZvJzsKK2Z1bmN0aW9uIEdldEFkZHJJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0dldEFkZHJJbmZvVyc7Citwcm9jZWR1cmUgZnJlZWFkZHJpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZnJlZWFkZHJpbmZvJzsKK3Byb2NlZHVyZSBGcmVlQWRkckluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnRnJlZUFkZHJJbmZvVyc7CitmdW5jdGlvbiBnZXRuYW1laW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2dldG5hbWVpbmZvJzsKK2Z1bmN0aW9uIEdldE5hbWVJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0dldE5hbWVJbmZvVyc7CisKK2NvbnN0cnVjdG9yIFRTbWFydFBvaW50ZXI8VD4uQ3JlYXRlKEFWYWx1ZTogVDsgQURlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVmFsdWUgOj0gQVZhbHVlOworICBGRGVzdHJveWVyIDo9IEFEZXN0cm95ZXI7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFNtYXJ0UG9pbnRlcjxUPi5EZXN0cm95OworYmVnaW4KKyAgaWYgQXNzaWduZWQoRkRlc3Ryb3llcikgdGhlbiBGRGVzdHJveWVyKEZWYWx1ZSk7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitmdW5jdGlvbiBUU21hcnRQb2ludGVyPFQ+Lkludm9rZTogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVmFsdWU7CitlbmQ7CisKK2NsYXNzIGNvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZTsKK3ZhcgorICBWZXJzaW9uOiBXT1JEOworICBEYXRhOiBXU0FEYXRhOworICBFcnJvcjogSW50ZWdlcjsKK2JlZ2luCisgIFZlcnNpb24gOj0gJDAyMDI7CisgIEZpbGxDaGFyKERhdGEsIFNpemVPZihEYXRhKSwgMCk7CisgIEVycm9yIDo9IFdTQVN0YXJ0dXAoVmVyc2lvbiwgRGF0YSk7CisgIGlmIEVycm9yIDw+IDAgdGhlbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFdpbnNvY2suJyk7CitlbmQ7CisKK2NsYXNzIGRlc3RydWN0b3IgVEJhc2VTb2NrZXQuRGVzdHJveTsKK2JlZ2luCisgIFdTQUNsZWFudXA7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUQmFzZVNvY2tldC5EZWZhdWx0TG9nRGVsZWdhdGUoY29uc3QgU3RyOiBzdHJpbmcpOwordmFyCisgIE91dFN0cjogc3RyaW5nOworYmVnaW4KKyAgT3V0U3RyIDo9IEZvcm1hdCgnVGhyaWZ0OiAlcyAlcycsIFtEYXRlVGltZVRvU3RyKE5vdywgVEZvcm1hdFNldHRpbmdzLkNyZWF0ZSksIFN0cl0pOworICB0cnkKKyAgICBXcml0ZWxuKE91dFN0cik7CisgICAgaWYgSW9SZXN1bHQgPD4gMCB0aGVuIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKE91dFN0cikpOworICBleGNlcHQKKyAgICBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihPdXRTdHIpKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIEZTb2NrZXQgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZQb3J0IDo9IDA7CisgIEZTZW5kVGltZW91dCA6PSAwOworICBGUmVjdlRpbWVvdXQgOj0gMDsKKyAgRktlZXBBbGl2ZSA6PSBGYWxzZTsKKyAgRkxvZ0RlbGVnYXRlIDo9IERlZmF1bHRMb2dEZWxlZ2F0ZTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuQ3JlYXRlU29ja2V0KEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyKTogSUdldEFkZHJJbmZvV3JhcHBlcjsKK3ZhcgorICBIaW50czogVEFkZHJJbmZvVzsKKyAgUmVzOiBQQWRkckluZm9XOworICBUaGVQb3J0OiBhcnJheVswLi41XSBvZiBDaGFyOworICBFcnJvcjogSW50ZWdlcjsKK2JlZ2luCisgIEZpbGxDaGFyKEhpbnRzLCBTaXplT2YoSGludHMpLCAwKTsKKyAgSGludHMuYWlfZmFtaWx5IDo9IFBGX1VOU1BFQzsKKyAgSGludHMuYWlfc29ja3R5cGUgOj0gU09DS19TVFJFQU07CisgIEhpbnRzLmFpX2ZsYWdzIDo9IEFJX1BBU1NJVkUgb3IgQUlfQUREUkNPTkZJRzsKKyAgU3RyRm10KFRoZVBvcnQsICclZCcsIFtGUG9ydF0pOworCisgIFJlc3VsdCA6PSBUR2V0QWRkckluZm9XcmFwcGVyLkNyZWF0ZShBQWRkcmVzcywgVGhlUG9ydCwgQEhpbnRzKTsKKyAgRXJyb3IgOj0gUmVzdWx0LkluaXQ7CisgIGlmIEVycm9yIDw+IDAgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnR2V0QWRkckluZm9XICVkOiAlcycsIFtFcnJvciwgU3lzRXJyb3JNZXNzYWdlKEVycm9yKV0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuJyk7CisgIGVuZDsKKworICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAorICAvLyBpbnRvIGlwdjYgc3BhY2UuCisgIFJlcyA6PSBSZXN1bHQuUmVzOworICB3aGlsZSBBc3NpZ25lZChSZXMpIGRvIGJlZ2luCisgICAgaWYgKFJlc14uYWlfZmFtaWx5ID0gQUZfSU5FVDYpIG9yIChub3QgQXNzaWduZWQoUmVzXi5haV9uZXh0KSkgdGhlbgorICAgICAgQnJlYWs7CisgICAgUmVzIDo9IFJlc14uYWlfbmV4dDsKKyAgZW5kOworCisgIEZTb2NrZXQgOj0gV2luYXBpLldpbnNvY2syLnNvY2tldChSZXNeLmFpX2ZhbWlseSwgUmVzXi5haV9zb2NrdHlwZSwgUmVzXi5haV9wcm90b2NvbCk7CisgIGlmIEZTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgRXJyb3IgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVEJhc2VTb2NrZXQuQ3JlYXRlU29ja2V0KCkgc29ja2V0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm9yKV0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzb2NrZXQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm9yKV0pKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBGUmVjdlRpbWVvdXQgOj0gQVJlY3ZUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBGU2VuZFRpbWVvdXQgOj0gQVNlbmRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOworYmVnaW4KKyAgRktlZXBBbGl2ZSA6PSBBS2VlcEFsaXZlOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuU2V0U29ja2V0KEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK2JlZ2luCisgIGlmIEZTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIENsb3NlOworICBGU29ja2V0IDo9IEFTb2NrZXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZShBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBDb21tb25Jbml0OworICBpZiBBc3NpZ25lZChBTG9nRGVsZWdhdGUpIHRoZW4gRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBDb21tb25Jbml0OworICBGUG9ydCA6PSBBUG9ydDsKKyAgaWYgQXNzaWduZWQoQUxvZ0RlbGVnYXRlKSB0aGVuIEZMb2dEZWxlZ2F0ZSA6PSBBTG9nRGVsZWdhdGU7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEJhc2VTb2NrZXQuRGVzdHJveTsKK2JlZ2luCisgIENsb3NlOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaWYgRlNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgc2h1dGRvd24oRlNvY2tldCwgU0RfQk9USCk7CisgICAgY2xvc2Vzb2NrZXQoRlNvY2tldCk7CisgIGVuZDsKKyAgRlNvY2tldCA6PSBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuSW5pdFBlZXJJbmZvOworYmVnaW4KKyAgRkNhY2hlZFBlZXJBZGRyLmlwdjQuc2luX2ZhbWlseSA6PSBBRl9VTlNQRUM7CisgIEZQZWVySG9zdCA6PSAnJzsKKyAgRlBlZXJBZGRyZXNzIDo9ICcnOworICBGUGVlclBvcnQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIGluaGVyaXRlZCBDb21tb25Jbml0OworICBGSG9zdCA6PSAnJzsKKyAgRkludGVycnVwdExpc3RlbmVyIDo9IG5pbDsKKyAgRkNvbm5UaW1lb3V0IDo9IDA7CisgIEZMaW5nZXJPbiA6PSBUcnVlOworICBGTGluZ2VyVmFsIDo9IDA7CisgIEZOb0RlbGF5IDo9IFRydWU7CisgIEZNYXhSZWN2UmV0cmllcyA6PSA1OworICBJbml0UGVlckluZm87CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0Lk9wZW5Db25uZWN0aW9uKFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcik7CitsYWJlbAorICBEb25lOwordmFyCisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgUmV0LAorICBSZXQyOiBJbnRlZ2VyOworICBGZHM6IFRGZFNldDsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgVmFsLAorICBMb246IEludGVnZXI7CisgIE9uZSwKKyAgWmVybzogQ2FyZGluYWw7CitiZWdpbgorICBpZiBTZW5kVGltZW91dCA+IDAgdGhlbiBTZXRTZW5kVGltZW91dChTZW5kVGltZW91dCk7CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIFNldFJlY3ZUaW1lb3V0KFJlY3ZUaW1lb3V0KTsKKyAgaWYgS2VlcEFsaXZlIHRoZW4gU2V0S2VlcEFsaXZlKEtlZXBBbGl2ZSk7CisgIFNldExpbmdlcihGTGluZ2VyT24sIEZMaW5nZXJWYWwpOworICBTZXROb0RlbGF5KEZOb0RlbGF5KTsKKworICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cworICBaZXJvIDo9IDA7CisgIGlmIEZDb25uVGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgIE9uZSA6PSAxOworICAgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgT25lKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgaW9jdGxzb2NrZXQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgaW9jdGxzb2NrZXQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBSZXQgOj0gY29ubmVjdChTb2NrZXQsIFJlcy5SZXNeLmFpX2FkZHJeLCBSZXMuUmVzXi5haV9hZGRybGVuKTsKKyAgaWYgUmV0ID0gMCB0aGVuIGdvdG8gRG9uZTsKKworICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICBpZiAoRXJybm9Db3B5IDw+IFdTQUVJTlBST0dSRVNTKSBhbmQgKEVycm5vQ29weSA8PiBXU0FFV09VTERCTE9DSykgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGNvbm5lY3QoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnY29ubmVjdCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBGRF9aRVJPKEZkcyk7CisgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICBpZiBGQ29ublRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICBUVmFsLnR2X3NlYyA6PSBGQ29ublRpbWVvdXQgZGl2IDEwMDA7CisgICAgVFZhbC50dl91c2VjIDo9IChGQ29ublRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICBQVFZhbCA6PSBAVFZhbDsKKyAgZW5kCisgIGVsc2UKKyAgICBQVFZhbCA6PSBuaWw7CisgIFJldCA6PSBzZWxlY3QoMSwgbmlsLCBARmRzLCBuaWwsIFBUVmFsKTsKKworICBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAvLyBFbnN1cmUgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9ycyBzZXQKKyAgICBMb24gOj0gU2l6ZU9mKFZhbCk7CisgICAgUmV0MiA6PSBnZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIEBWYWwsIExvbik7CisgICAgaWYgUmV0MiA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgZ2V0c29ja29wdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2dldHNvY2tvcHQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICAgIC8vIG5vIGVycm9ycyBvbiBzb2NrZXQsIGdvIHRvIHRvd24KKyAgICBpZiBWYWwgPSAwIHRoZW4gZ290byBEb25lOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGVycm9yIG9uIHNvY2tldCAoYWZ0ZXIgc2VsZWN0KCkpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzb2NrZXQgT3BlbkNvbm5lY3Rpb24oKSBlcnJvcjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFZhbCldKSk7CisgIGVuZAorICBlbHNlIGlmIFJldCA9IDAgdGhlbiBiZWdpbgorICAgIC8vIHNvY2tldCB0aW1lZCBvdXQKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSB0aW1lZCBvdXQgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnT3BlbkNvbm5lY3Rpb24oKSB0aW1lZCBvdXQnKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICAvLyBlcnJvciBvbiBzZWxlY3QoKQorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgc2VsZWN0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NlbGVjdCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworRG9uZToKKyAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKKyAgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKTsKKyAgU2V0Q2FjaGVkQWRkcmVzcyhSZXMuUmVzXi5haV9hZGRyXiwgUmVzLlJlc14uYWlfYWRkcmxlbik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkxvY2FsT3BlbjsKK3ZhcgorICBSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXI7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBFeGl0OworCisgIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCisgIGlmIChQb3J0IDwgMCkgb3IgKFBvcnQgPiAkRkZGRikgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzLkNyZWF0ZSgnU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCcpOworCisgIFJlcyA6PSBDcmVhdGVTb2NrZXQoSG9zdCwgUG9ydCk7CisKKyAgT3BlbkNvbm5lY3Rpb24oUmVzKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0R2VuZXJpY1RpbWVvdXQoUzogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IFRpbWVvdXQ6IExvbmd3b3JkOyBPcHROYW1lOiBJbnRlZ2VyKTsKK3ZhcgorICBUaW1lOiBEV09SRDsKK2JlZ2luCisgIGlmIFMgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBUaW1lIDo9IFRpbWVvdXQ7CisKKyAgaWYgc2V0c29ja29wdChTLCBTT0xfU09DS0VULCBPcHROYW1lLCBAVGltZSwgU2l6ZU9mKFRpbWUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdTZXRHZW5lcmljVGltZW91dCgpIHNldHNvY2tvcHQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gU29ja2V0IDw+IElOVkFMSURfU09DS0VUOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXROb0RlbGF5KEFOb0RlbGF5OiBCb29sZWFuKTsKK3ZhcgorICBWOiBJbnRlZ2VyOworYmVnaW4KKyAgRk5vRGVsYXkgOj0gQU5vRGVsYXk7CisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIFYgOj0gSWZUaGVuKEZOb0RlbGF5LCAxLCAwKTsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgQFYsIFNpemVPZihWKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXROb0RlbGF5KCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFNvY2tldEluZm86IHN0cmluZzsKK2JlZ2luCisgIGlmIChGSG9zdCA9ICcnKSBvciAoUG9ydCA9IDApIHRoZW4KKyAgICBSZXN1bHQgOj0gJzxIb3N0OiAnICsgR2V0UGVlckFkZHJlc3MgKyAnIFBvcnQ6ICcgKyBHZXRQZWVyUG9ydC5Ub1N0cmluZyArICc+JworICBlbHNlCisgICAgUmVzdWx0IDo9ICc8SG9zdDogJyArIEZIb3N0ICsgJyBQb3J0OiAnICsgUG9ydC5Ub1N0cmluZyArICc+JzsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVySG9zdDogc3RyaW5nOwordmFyCisgIEFkZHI6IFRTb2NrQWRkclN0b3JhZ2U7CisgIEFkZHJQdHI6IFBTb2NrQWRkcjsKKyAgQWRkckxlbjogSW50ZWdlcjsKKyAgQ2xpZW50SG9zdDogYXJyYXlbMC4uTklfTUFYSE9TVC0xXSBvZiBDaGFyOworICBDbGllbnRTZXJ2aWNlOiBhcnJheVswLi5OSV9NQVhTRVJWLTFdIG9mIENoYXI7CitiZWdpbgorICBpZiBGUGVlckhvc3QgPSAnJyB0aGVuIGJlZ2luCisgICAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChGUGVlckhvc3QpOworCisgICAgQWRkclB0ciA6PSBHZXRDYWNoZWRBZGRyZXNzKEFkZHJMZW4pOworICAgIGlmIEFkZHJQdHIgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgQWRkckxlbiA6PSBTaXplT2YoQWRkcik7CisgICAgICBpZiBnZXRwZWVybmFtZShTb2NrZXQsIFBTb2NrQWRkcihAQWRkcileLCBBZGRyTGVuKSA8PiAwIHRoZW4KKyAgICAgICAgRXhpdChGUGVlckhvc3QpOworICAgICAgQWRkclB0ciA6PSBQU29ja0FkZHIoQEFkZHIpOworICAgICAgU2V0Q2FjaGVkQWRkcmVzcyhBZGRyUHRyXiwgQWRkckxlbik7CisgICAgZW5kOworCisgICAgR2V0TmFtZUluZm9XKEFkZHJQdHJeLCBBZGRyTGVuLCBDbGllbnRIb3N0LCBOSV9NQVhIT1NULCBDbGllbnRTZXJ2aWNlLCBOSV9NQVhTRVJWLCAwKTsKKyAgICBGUGVlckhvc3QgOj0gQ2xpZW50SG9zdDsKKyAgZW5kOworICBSZXN1bHQgOj0gRlBlZXJIb3N0OworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJBZGRyZXNzOiBzdHJpbmc7Cit2YXIKKyAgQWRkcjogVFNvY2tBZGRyU3RvcmFnZTsKKyAgQWRkclB0cjogUFNvY2tBZGRyOworICBBZGRyTGVuOiBJbnRlZ2VyOworICBDbGllbnRIb3N0OiBhcnJheVswLi5OSV9NQVhIT1NULTFdIG9mIENoYXI7CisgIENsaWVudFNlcnZpY2U6IGFycmF5WzAuLk5JX01BWFNFUlYtMV0gb2YgQ2hhcjsKK2JlZ2luCisgIGlmIEZQZWVyQWRkcmVzcyA9ICcnIHRoZW4gYmVnaW4KKyAgICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KEZQZWVyQWRkcmVzcyk7CisKKyAgICBBZGRyUHRyIDo9IEdldENhY2hlZEFkZHJlc3MoQWRkckxlbik7CisgICAgaWYgQWRkclB0ciA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBBZGRyTGVuIDo9IFNpemVPZihBZGRyKTsKKyAgICAgIGlmIGdldHBlZXJuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBBZGRyKV4sIEFkZHJMZW4pIDw+IDAgdGhlbgorICAgICAgICBFeGl0KEZQZWVySG9zdCk7CisgICAgICBBZGRyUHRyIDo9IFBTb2NrQWRkcihAQWRkcik7CisgICAgICBTZXRDYWNoZWRBZGRyZXNzKEFkZHJQdHJeLCBBZGRyTGVuKTsKKyAgICBlbmQ7CisKKyAgICBHZXROYW1lSW5mb1coQWRkclB0cl4sIEFkZHJMZW4sIENsaWVudEhvc3QsIE5JX01BWEhPU1QsIENsaWVudFNlcnZpY2UsIE5JX01BWFNFUlYsIE5JX05VTUVSSUNIT1NUIG9yIE5JX05VTUVSSUNTRVJWKTsKKyAgICBGUGVlckFkZHJlc3MgOj0gQ2xpZW50SG9zdDsKKyAgICBUcnlTdHJUb0ludChDbGllbnRTZXJ2aWNlLCBGUGVlclBvcnQpOworICBlbmQ7CisgIFJlc3VsdCA6PSBGUGVlckFkZHJlc3MKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVyUG9ydDogSW50ZWdlcjsKK2JlZ2luCisgIEdldFBlZXJBZGRyZXNzOworICBSZXN1bHQgOj0gRlBlZXJQb3J0OworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldE9yaWdpbjogc3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFBlZXJIb3N0ICsgJzonICsgR2V0UGVlclBvcnQuVG9TdHJpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dCk7CisgIFNldEdlbmVyaWNUaW1lb3V0KFNvY2tldCwgQVJlY3ZUaW1lb3V0LCBTT19SQ1ZUSU1FTyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dCk7CisgIFNldEdlbmVyaWNUaW1lb3V0KFNvY2tldCwgQVNlbmRUaW1lb3V0LCBTT19TTkRUSU1FTyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsKK3ZhcgorICBWYWx1ZTogSW50ZWdlcjsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZSk7CisKKyAgVmFsdWUgOj0gSWZUaGVuKEtlZXBBbGl2ZSwgMSwgMCk7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIEBWYWx1ZSwgU2l6ZU9mKFZhbHVlKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXRLZWVwQWxpdmUoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsKK2JlZ2luCisgIC8vIE5vdCBuZWVkZWQsIGJ1dCBqdXN0IGEgcGxhY2Vob2xkZXIKKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgRkhvc3QgOj0gQUhvc3Q7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CisgIFNvY2tldCA6PSBBU29ja2V0OworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworICBTb2NrZXQgOj0gQVNvY2tldDsKKyAgRkludGVycnVwdExpc3RlbmVyIDo9IEFJbnRlcnJ1cHRMaXN0ZW5lcjsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuT3BlbjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIEV4aXQ7CisgIExvY2FsT3BlbjsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpbmhlcml0ZWQgQ2xvc2U7CisgIEluaXRQZWVySW5mbzsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5SZWFkKHZhciBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7CitsYWJlbAorICBUcnlBZ2FpbjsKK3ZhcgorICBSZXRyaWVzOiBMb25nd29yZDsKKyAgRUFnYWluVGhyZXNob2xkLAorICBSZWFkRWxhcHNlZDogVUludDY0OworICBTdGFydDogVERhdGVUaW1lOworICBHb3Q6IEludGVnZXI7CisgIEZkczogVEZkU2V0OworICBFcnJub0NvcHk6IEludGVnZXI7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFJldDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHNvY2tldCcpOworCisgIFJldHJpZXMgOj0gMDsKKworICAvLyBUSFJJRlRfRUFHQUlOIGNhbiBiZSBzaWduYWxsZWQgYm90aCB3aGVuIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgYW5kIHdoZW4KKyAgLy8gdGhlIHN5c3RlbSBpcyBvdXQgb2YgcmVzb3VyY2VzIChhbiBhd2Vzb21lIHVuZG9jdW1lbnRlZCBmZWF0dXJlKS4KKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIGludGVydmFsIHVuZGVyIHdoaWNoCisgIC8vIFRIUklGVF9FQUdBSU4gaXMgdGFrZW4gdG8gaW5kaWNhdGUgYW4gb3V0IG9mIHJlc291cmNlcyBlcnJvci4KKyAgRUFnYWluVGhyZXNob2xkIDo9IDA7CisgIGlmIFJlY3ZUaW1lb3V0IDw+IDAgdGhlbgorICAgIC8vIGlmIGEgcmVhZFRpbWVvdXQgaXMgc3BlY2lmaWVkIGFsb25nIHdpdGggYSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcywgdGhlbgorICAgIC8vIHRoZSB0aHJlc2hvbGQgd2lsbCBlbnN1cmUgdGhhdCB0aGUgcmVhZCB0aW1lb3V0IGlzIG5vdCBleGNlZWRlZCBldmVuIGluIHRoZQorICAgIC8vIGNhc2Ugb2YgcmVzb3VyY2UgZXJyb3JzCisgICAgRUFnYWluVGhyZXNob2xkIDo9IFJlY3ZUaW1lb3V0IGRpdiBJZlRoZW4oRk1heFJlY3ZSZXRyaWVzID4gMCwgRk1heFJlY3ZSZXRyaWVzLCAyKTsKKworVHJ5QWdhaW46CisgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuCisgICAgU3RhcnQgOj0gTm93CisgIGVsc2UKKyAgICAvLyBpZiB0aGVyZSBpcyBubyByZWFkIHRpbWVvdXQgd2UgZG9uJ3QgbmVlZCB0aGUgVE9EIHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgLy8gYW4gVEhSSUZUX0VBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCisgICAgU3RhcnQgOj0gMDsKKworICBpZiBBc3NpZ25lZChGSW50ZXJydXB0TGlzdGVuZXIpIHRoZW4gYmVnaW4KKyAgICBGRF9aRVJPKEZkcyk7CisgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgX0ZEX1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcyk7CisgICAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIFRWYWwudHZfc2VjIDo9IFJlY3ZUaW1lb3V0IGRpdiAxMDAwOworICAgICAgVFZhbC50dl91c2VjIDo9IChSZWN2VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgUmV0IDwgMCB0aGVuIGJlZ2luCisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICBnb3RvIFRyeUFnYWluOworICAgICAgZW5kOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlJlYWQoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZAorICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgIGlmIEZEX0lTU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKSB0aGVuCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUoJ0ludGVycnVwdGVkJyk7CisgICAgZW5kCisgICAgZWxzZSAvLyBSZXQgPSAwCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodGltZWQgb3V0KScpOworCisgICAgLy8gZmFsbGluZyB0aHJvdWdoIG1lYW5zIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWN2IGFuZCBpdCBjYW5ub3QgYmxvY2sKKyAgZW5kOworCisgIEdvdCA6PSByZWN2KFNvY2tldCwgQnVmLCBMZW4sIDApOworICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAorICBpZiBHb3QgPCAwIHRoZW4gYmVnaW4KKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFV09VTERCTE9DSyB0aGVuIGJlZ2luCisgICAgICAvLyBpZiBubyB0aW1lb3V0IHdlIGNhbiBhc3N1bWUgdGhhdCByZXNvdXJjZSBleGhhdXN0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgIGlmIFJlY3ZUaW1lb3V0ID0gMCB0aGVuCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpJyk7CisgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYWNrIG9mIHJlc291cmNlcyBvciB0aW1lb3V0IGNhc2UKKyAgICAgIFJlYWRFbGFwc2VkIDo9IE1pbGxpU2Vjb25kc0JldHdlZW4oTm93LCBTdGFydCk7CisgICAgICBpZiAoRUFnYWluVGhyZXNob2xkID0gMCkgb3IgKFJlYWRFbGFwc2VkIDwgRUFnYWluVGhyZXNob2xkKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMgdGhlbiBiZWdpbgorICAgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgICBTbGVlcCgxKTsKKyAgICAgICAgICBnb3RvIFRyeUFnYWluOworICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gaW5mZXIgdGhhdCB0aW1lb3V0IGhhcyBiZWVuIGhpdAorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodGltZWQgb3V0KScpOworICAgIGVuZDsKKworICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KKyAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgSW5jKFJldHJpZXMpOworICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICBlbmQ7CisKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUIHRoZW4KKyAgICAgIEV4aXQoMCk7CisKKyAgICAvLyBUaGlzIGlzaCBpc24ndCBvcGVuCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRU5PVENPTk4gdGhlbgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXU0FFTk9UQ09OTicpOworCisgICAgLy8gVGltZWQgb3V0IQorICAgIGlmIEVycm5vQ29weSA9IFdTQUVUSU1FRE9VVCB0aGVuCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dTQUVUSU1FRE9VVCcpOworCisgICAgLy8gTm93IGl0J3Mgbm90IGEgdHJ5IGFnYWluIGNhc2UsIGJ1dCBhIHJlYWwgcHJvYmJsZXoKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUmVhZCgpIHJlY3YoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKworICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIFJlc3VsdCA6PSBHb3Q7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LldyaXRlKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTsKK3ZhcgorICBTZW50LCBCOiBJbnRlZ2VyOworYmVnaW4KKyAgU2VudCA6PSAwOworICB3aGlsZSBTZW50IDwgTGVuIGRvIGJlZ2luCisgICAgQiA6PSBXcml0ZVBhcnRpYWwoKFBCeXRlKEBCdWYpICsgU2VudCleLCBMZW4gLSBTZW50KTsKKyAgICBpZiBCID0gMCB0aGVuCisgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgdGltZW91dCBzZXQgd2l0aCBTT19TTkRUSU1FTyBleHBpcmVkLgorICAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnc2VuZCB0aW1lb3V0IGV4cGlyZWQnKTsKKyAgICBJbmMoU2VudCwgQik7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5Xcml0ZVBhcnRpYWwoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyCisgIEI6IEludGVnZXI7CisgIEVycm5vQ29weTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBzb2NrZXQnKTsKKworICBCIDo9IHNlbmQoU29ja2V0LCBCdWYsIExlbiwgMCk7CisKKyAgaWYgQiA8IDAgdGhlbiBiZWdpbgorICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFV09VTERCTE9DSyB0aGVuCisgICAgICBFeGl0KDApOworCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LldyaXRlUGFydGlhbCgpIHNlbmQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKworICAgIGlmIChFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUKSBvciAoRXJybm9Db3B5ID0gV1NBRU5PVENPTk4pIHRoZW4gYmVnaW4KKyAgICAgIENsb3NlOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnd3JpdGUoKSBzZW5kKCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ3dyaXRlKCkgc2VuZCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIEZhaWwgb24gYmxvY2tlZCBzZW5kCisgIGlmIEIgPSAwIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1NvY2tldCBzZW5kIHJldHVybmVkIDAuJyk7CisKKyAgUmVzdWx0IDo9IEI7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0Q2FjaGVkQWRkcmVzcyhvdXQgTGVuOiBJbnRlZ2VyKTogUFNvY2tBZGRyOworYmVnaW4KKyAgY2FzZSBGQ2FjaGVkUGVlckFkZHIuaXB2NC5zaW5fZmFtaWx5IG9mCisgICAgQUZfSU5FVDogYmVnaW4KKyAgICAgIExlbiA6PSBTaXplT2YoVFNvY2tBZGRySW4pOworICAgICAgUmVzdWx0IDo9IFBTb2NrQWRkcihARkNhY2hlZFBlZXJBZGRyLmlwdjQpOworICAgIGVuZDsKKyAgICBBRl9JTkVUNjogYmVnaW4KKyAgICAgIExlbiA6PSBTaXplT2YoVFNvY2tBZGRySW42KTsKKyAgICAgIFJlc3VsdCA6PSBQU29ja0FkZHIoQEZDYWNoZWRQZWVyQWRkci5pcHY2KTsKKyAgICBlbmQ7CisgIGVsc2UKKyAgICBMZW4gOj0gMDsKKyAgICBSZXN1bHQgOj0gbmlsOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldENhY2hlZEFkZHJlc3MoY29uc3QgQWRkcjogVFNvY2tBZGRyOyBMZW46IEludGVnZXIpOworYmVnaW4KKyAgY2FzZSBBZGRyLnNhX2ZhbWlseSBvZgorICAgIEFGX0lORVQ6IGlmIExlbiA9IFNpemVPZihUU29ja0FkZHJJbikgdGhlbiBGQ2FjaGVkUGVlckFkZHIuaXB2NCA6PSBQU29ja0FkZHJJbihAQWRkcileOworICAgIEFGX0lORVQ2OiBpZiBMZW4gPSBTaXplT2YoVFNvY2tBZGRySW42KSB0aGVuIEZDYWNoZWRQZWVyQWRkci5pcHY2IDo9IFBTb2NrQWRkckluNihAQWRkcileOworICBlbmQ7CisgIEZQZWVyQWRkcmVzcyA6PSAnJzsKKyAgRlBlZXJIb3N0IDo9ICcnOworICBGUGVlclBvcnQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0TGluZ2VyKExpbmdlck9uOiBCb29sZWFuOyBMaW5nZXJWYWw6IEludGVnZXIpOwordmFyCisgIEw6IFRMaW5nZXI7CitiZWdpbgorICBGTGluZ2VyT24gOj0gTGluZ2VyT247CisgIEZMaW5nZXJWYWwgOj0gTGluZ2VyVmFsOworICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBMLmxfb25vZmYgOj0gSWZUaGVuKEZMaW5nZXJPbiwgMSwgMCk7CisgIEwubF9saW5nZXIgOj0gTGluZ2VyVmFsOworCisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIEBMLCBTaXplT2YoTCkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0TGluZ2VyKCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LlBlZWs6IEJvb2xlYW47Cit2YXIKKyAgUmV0cmllczogTG9uZ3dvcmQ7CisgIEZkczogVEZkU2V0OworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBSZXQ6IEludGVnZXI7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgQnVmOiBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbiB0aGVuIEV4aXQoRmFsc2UpOworCisgIGlmIEFzc2lnbmVkKEZJbnRlcnJ1cHRMaXN0ZW5lcikgdGhlbiBiZWdpbgorICAgIFJldHJpZXMgOj0gMDsKKyAgICB3aGlsZSB0cnVlIGRvIGJlZ2luCisgICAgICBGRF9aRVJPKEZkcyk7CisgICAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICAgIF9GRF9TRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpOworICAgICAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgVFZhbC50dl9zZWMgOj0gUmVjdlRpbWVvdXQgZGl2IDEwMDA7CisgICAgICAgIFRWYWwudHZfdXNlYyA6PSAoUmVjdlRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgaWYgUmV0IDwgMCB0aGVuIGJlZ2luCisgICAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICAgIENvbnRpbnVlOworICAgICAgICBlbmQ7CisgICAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5QZWVrKCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgICAgaWYgRkRfSVNTRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpIHRoZW4KKyAgICAgICAgICBFeGl0KEZhbHNlKTsKKyAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBkYXRhIG9yIGEgZGlzY29ubmVjdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSBQRUVLCisgICAgICAgIEJyZWFrOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIC8vIHRpbWVvdXQKKyAgICAgICAgRXhpdChGYWxzZSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBjbG9zZWQKKyAgUmV0IDo9IHJlY3YoU29ja2V0LCBCdWYsIDEsIE1TR19QRUVLKTsKKyAgaWYgUmV0ID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQgdGhlbiBiZWdpbgorICAgICAgQ2xvc2U7CisgICAgICBFeGl0KEZhbHNlKTsKKyAgICBlbmQ7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlBlZWsoKSByZWN2KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgncmVjdigpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworICBSZXN1bHQgOj0gUmV0ID4gMDsKK2VuZDsKKworZnVuY3Rpb24gVFNlcnZlclNvY2tldC5DcmVhdGVTb2NrZXRPYmooQ2xpZW50OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IFRTb2NrZXQ7CitiZWdpbgorICBpZiBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIHRoZW4KKyAgICBSZXN1bHQgOj0gVFNvY2tldC5DcmVhdGUoQ2xpZW50LCBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyKQorICBlbHNlCisgICAgUmVzdWx0IDo9IFRTb2NrZXQuQ3JlYXRlKENsaWVudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0Lk5vdGlmeShOb3RpZnlTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK3ZhcgorICBCeXQ6IEJ5dGU7CitiZWdpbgorICBpZiBOb3RpZnlTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEJ5dCA6PSAwOworICAgIGlmIHNlbmQoTm90aWZ5U29ja2V0LCBCeXQsIFNpemVPZihCeXQpLCAwKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTm90aWZ5KCkgc2VuZCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LlNldEludGVycnVwdGFibGVDaGlsZHJlbihBVmFsdWU6IEJvb2xlYW4pOworYmVnaW4KKyAgaWYgRkxpc3RlbmluZyB0aGVuCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnSW50ZXJydXB0YWJsZUNoaWxkcmVuIGNhbm5vdCBiZSBzZXQgYWZ0ZXIgbGlzdGVuKCknKTsKKyAgRkludGVycnVwdGFibGVDaGlsZHJlbiA6PSBBVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBpbmhlcml0ZWQgQ29tbW9uSW5pdDsKKyAgRkludGVycnVwdGFibGVDaGlsZHJlbiA6PSBUcnVlOworICBGQWNjZXB0QmFja2xvZyA6PSBERUZBVUxUX0JBQ0tMT0c7CisgIEZBY2NlcHRUaW1lb3V0IDo9IDA7CisgIEZSZXRyeUxpbWl0IDo9IDA7CisgIEZSZXRyeURlbGF5IDo9IDA7CisgIEZUY3BTZW5kQnVmZmVyIDo9IDA7CisgIEZUY3BSZWN2QnVmZmVyIDo9IDA7CisgIEZMaXN0ZW5pbmcgOj0gRmFsc2U7CisgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsKK2JlZ2luCisgIC8vIFVubmVjZXNzYXJ5LCBidXQgaGVyZSBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcworICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQVNlbmRUaW1lb3V0LCBBUmVjdlRpbWVvdXQ6IExvbmd3b3JkOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBTZW5kVGltZW91dCA6PSBBU2VuZFRpbWVvdXQ7CisgIFJlY3ZUaW1lb3V0IDo9IEFSZWN2VGltZW91dDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIEZBZGRyZXNzIDo9IEFBZGRyZXNzOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5MaXN0ZW47CisKKyAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0UGFpcih2YXIgUmVhZGVyLCBXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogSW50ZWdlcjsKKyAgbGFiZWwKKyAgICBFcnJvcjsKKyAgdHlwZQorICAgIFRTQVVuaW9uID0gcmVjb3JkCisgICAgY2FzZSBJbnRlZ2VyIG9mCisgICAgICAwOiAoaW5hZGRyOiBUU29ja0FkZHJJbik7CisgICAgICAxOiAoYWRkcjogVFNvY2tBZGRyKTsKKyAgICBlbmQ7CisgIHZhcgorICAgIGE6IFRTQVVuaW9uOworICAgIGxpc3RlbmVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgICBlOiBJbnRlZ2VyOworICAgIGFkZHJsZW46IEludGVnZXI7CisgICAgZmxhZ3M6IERXT1JEOworICAgIHJldXNlOiBJbnRlZ2VyOworICBiZWdpbgorICAgIGFkZHJsZW4gOj0gU2l6ZU9mKGEuaW5hZGRyKTsKKyAgICBmbGFncyA6PSAwOworICAgIHJldXNlIDo9IDE7CisKKyAgICBsaXN0ZW5lciA6PSBXaW5hcGkuV2luc29jazIuc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisgICAgaWYgbGlzdGVuZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KFNPQ0tFVF9FUlJPUik7CisKKyAgICBGaWxsQ2hhcihhLCBTaXplT2YoYSksIDApOworICAgIGEuaW5hZGRyLnNpbl9mYW1pbHkgOj0gQUZfSU5FVDsKKyAgICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgOj0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKyAgICBhLmluYWRkci5zaW5fcG9ydCA6PSAwOworICAgIFJlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgICBXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisKKyAgICAvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0LiAgVGhpcyBpcyBiZWNhdXNlCisgICAgLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKyAgICAvLyB3YW50IHRvIGZvcmNlIHNvY2tldCBwYWlycyB0byBiZSBhbiBhZG1pbi4KKyAgICBzZXRzb2Nrb3B0KGxpc3RlbmVyLCBTT0xfU09DS0VULCBJbnRlZ2VyKFNPX0VYQ0xVU0lWRUFERFJVU0UpLCBAcmV1c2UsIFNpemVPZihyZXVzZSkpOworICAgIGlmIGJpbmQobGlzdGVuZXIsIGEuYWRkciwgU2l6ZU9mKGEuaW5hZGRyKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIGdldHNvY2tuYW1lKGxpc3RlbmVyLCBhLmFkZHIsIGFkZHJsZW4pID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBXaW5hcGkuV2luc29jazIubGlzdGVuKGxpc3RlbmVyLCAxKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgUmVhZGVyIDo9IFdTQVNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCwgbmlsLCAwLCBmbGFncyk7CisgICAgaWYgUmVhZGVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIGNvbm5lY3QoUmVhZGVyLCBhLmFkZHIsIFNpemVPZihhLmluYWRkcikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBXcml0ZXIgOj0gV2luYXBpLldpbnNvY2syLmFjY2VwdChsaXN0ZW5lciwgbmlsLCBuaWwpOworICAgIGlmIFdyaXRlciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7CisgICAgRXhpdCgwKTsKKworICBFcnJvcjoKKyAgICBlIDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7CisgICAgY2xvc2Vzb2NrZXQoUmVhZGVyKTsKKyAgICBjbG9zZXNvY2tldChXcml0ZXIpOworICAgIFdTQVNldExhc3RFcnJvcihlKTsKKyAgICBSZXN1bHQgOj0gU09DS0VUX0VSUk9SOworICBlbmQ7CisKK3ZhcgorICBUZW1wSW50UmVhZGVyLAorICBUZW1wSW50V3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgT25lOiBDYXJkaW5hbDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBMaW5nOiBUTGluZ2VyOworICBSZXRyaWVzOiBJbnRlZ2VyOworICBBZGRySW5mbzogSUdldEFkZHJJbmZvV3JhcHBlcjsKKyAgU0E6IFRTb2NrQWRkclN0b3JhZ2U7CisgIExlbjogSW50ZWdlcjsKK2JlZ2luCisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQKKyAgaWYgQ3JlYXRlU29ja2V0UGFpcihUZW1wSW50UmVhZGVyLCBUZW1wSW50V3JpdGVyKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIENyZWF0ZVNvY2tldFBhaXIoKSBJbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gVGVtcEludFJlYWRlcjsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBUZW1wSW50V3JpdGVyOworICBlbmQ7CisKKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdCBhbGwgY2xpZW50cworICBpZiBDcmVhdGVTb2NrZXRQYWlyKFRlbXBJbnRSZWFkZXIsIFRlbXBJbnRXcml0ZXIpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQ3JlYXRlU29ja2V0UGFpcigpIENoaWxkSW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKElOVkFMSURfU09DS0VULCBuaWwpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoVGVtcEludFJlYWRlciwgRGVzdHJveWVyT2ZGaW5lU29ja2V0cyk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBUZW1wSW50V3JpdGVyOworICBlbmQ7CisKKyAgaWYgKFBvcnQgPCAwKSBvciAoUG9ydCA+ICRGRkZGKSB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MuQ3JlYXRlKCdTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkJyk7CisKKyAgQWRkckluZm8gOj0gQ3JlYXRlU29ja2V0KEZBZGRyZXNzLCBQb3J0KTsKKworICAvLyBTZXQgU09fRVhDTFVTSVZFQUREUlVTRSB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0CisgIE9uZSA6PSAxOworICBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgSW50ZWdlcihTT19FWENMVVNJVkVBRERSVVNFKSwgQG9uZSwgU2l6ZU9mKE9uZSkpOworICAvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0IG9uIFdpbmRvd3MuICBUaGlzIGlzIGJlY2F1c2UKKyAgLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKyAgLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorCisgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzCisgIGlmIEZUY3BTZW5kQnVmZmVyID4gMCB0aGVuIGJlZ2luCisgICAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgQEZUY3BTZW5kQnVmZmVyLCBTaXplT2YoRlRjcFNlbmRCdWZmZXIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX1NOREJVRjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgaWYgRlRjcFJlY3ZCdWZmZXIgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCBARlRjcFJlY3ZCdWZmZXIsIFNpemVPZihGVGNwUmVjdkJ1ZmZlcikpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fUkNWQlVGOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBUdXJuIGxpbmdlciBvZmYsIGRvbid0IHdhbnQgdG8gYmxvY2sgb24gY2FsbHMgdG8gY2xvc2UKKyAgTGluZy5sX29ub2ZmIDo9IDA7CisgIExpbmcubF9saW5nZXIgOj0gMDsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgQExpbmcsIFNpemVPZihMaW5nKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19MSU5HRVI6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gVENQIE5vZGVsYXksIHNwZWVkIG92ZXIgYmFuZHdpZHRoCisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIEBPbmUsIFNpemVPZihPbmUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9OT0RFTEFZICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgVENQX05PREVMQVk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgT25lKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgaW9jdGxzb2NrZXQoKSBGSU9OQklPICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCkgRklPTkJJTzogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgUmV0cmllcyA6PSAwOworICB3aGlsZSBUcnVlIGRvIGJlZ2luCisgICAgaWYgYmluZChTb2NrZXQsIEFkZHJJbmZvLlJlc14uYWlfYWRkcl4sIEFkZHJJbmZvLlJlc14uYWlfYWRkcmxlbikgPSAwIHRoZW4KKyAgICAgIEJyZWFrOworICAgIEluYyhSZXRyaWVzKTsKKyAgICBpZiBSZXRyaWVzID4gRlJldHJ5TGltaXQgdGhlbgorICAgICAgQnJlYWs7CisgICAgU2xlZXAoRlJldHJ5RGVsYXkgKiAxMDAwKTsKKyAgZW5kOworCisgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICBpZiAoUG9ydCA9IDApIGFuZCAoUmV0cmllcyA8IEZSZXRyeUxpbWl0KSB0aGVuIGJlZ2luCisgICAgTGVuIDo9IFNpemVPZihTQSk7CisgICAgRmlsbENoYXIoU0EsIExlbiwgMCk7CisgICAgaWYgZ2V0c29ja25hbWUoU29ja2V0LCBQU29ja0FkZHIoQFNBKV4sIExlbikgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGdldHNvY2tuYW1lKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSkKKyAgICBlbHNlIGJlZ2luCisgICAgICBpZiBTQS5zc19mYW1pbHkgPSBBRl9JTkVUNiB0aGVuCisgICAgICAgIFBvcnQgOj0gbnRvaHMoUFNvY2tBZGRySW42KEBTQSleLnNpbjZfcG9ydCkKKyAgICAgIGVsc2UKKyAgICAgICAgUG9ydCA6PSBudG9ocyhQU29ja0FkZHJJbihAU0EpXi5zaW5fcG9ydCk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKKyAgaWYgKFJldHJpZXMgPiBGUmV0cnlMaW1pdCkgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBCSU5EICVkJywgW1BvcnRdKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IGJpbmQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoRkxpc3RlbkNhbGxiYWNrKSB0aGVuCisgICAgRkxpc3RlbkNhbGxiYWNrKFNvY2tldCk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgV2luYXBpLldpbnNvY2syLmxpc3RlbihTb2NrZXQsIEZBY2NlcHRCYWNrbG9nKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgbGlzdGVuKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IGxpc3RlbjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQuQWNjZXB0OiBUU29ja2V0OwordmFyCisgIEZkczogVEZkU2V0OworICBNYXhFSW50ZXJzLAorICBOdW1FSW50ZXJzOiBJbnRlZ2VyOworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIEJ1ZjogQnl0ZTsKKyAgQ2xpZW50QWRkcmVzczogVFNvY2tBZGRyU3RvcmFnZTsKKyAgU2l6ZTogSW50ZWdlcjsKKyAgQ2xpZW50U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgWmVybzogQ2FyZGluYWw7CisgIENsaWVudDogVFNvY2tldDsKKyAgUmV0OiBJbnRlZ2VyOworYmVnaW4KKyAgTWF4RUludGVycyA6PSA1OworICBOdW1FSW50ZXJzIDo9IDA7CisKKyAgd2hpbGUgVHJ1ZSBkbyBiZWdpbgorICAgIEZEX1pFUk8oRmRzKTsKKyAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICBfRkRfU0VUKEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBGZHMpOworICAgIGlmIEZBY2NlcHRUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICBUVmFsLnR2X3NlYyA6PSBGQWNjZXB0VGltZW91dCBkaXYgMTAwMDsKKyAgICAgIFRWYWwudHZfdXNlYyA6PSAoRkFjY2VwdFRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgIC8vIFRPRE86IGlmIFdTQUVJTlRSIGlzIHJlY2VpdmVkLCB3ZSdsbCByZXN0YXJ0IHRoZSB0aW1lb3V0LgorICAgIC8vIFRvIGJlIGFjY3VyYXRlLCB3ZSBuZWVkIHRvIGZpeCB0aGlzIGluIHRoZSBmdXR1cmUuCisgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworCisgICAgaWYgUmV0IDwgMCB0aGVuIGJlZ2luCisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKFdTQUdldExhc3RFcnJvciA9IFdTQUVJTlRSKSBhbmQgKE51bUVJbnRlcnMgPCBNYXhFSW50ZXJzKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICBJbmMoTnVtRUludGVycyk7CisgICAgICAgIENvbnRpbnVlOworICAgICAgZW5kOworICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZAorICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAvLyBDaGVjayBmb3IgYW4gaW50ZXJydXB0IHNpZ25hbAorICAgICAgaWYgKEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDw+IElOVkFMSURfU09DS0VUKSBhbmQgRkRfSVNTRVQoRkludGVycnVwdFNvY2tSZWFkZXIsIEZkcykgdGhlbiBiZWdpbgorICAgICAgICBpZiByZWN2KEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBCdWYsIFNpemVPZihCdWYpLCAwKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHJlY3YoKSBpbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUoJ2ludGVycnVwdGVkJyk7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgYmVpbmcgcmVhZHkKKyAgICAgIGlmIEZEX0lTU0VUKFNvY2tldCwgRmRzKSB0aGVuCisgICAgICAgIEJyZWFrOworICAgIGVuZAorICAgIGVsc2UgYmVnaW4KKyAgICAgIExvZ0RlbGVnYXRlKCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHNlbGVjdCgpIDAnKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworICAgIGVuZDsKKyAgZW5kOworCisgIFNpemUgOj0gU2l6ZU9mKENsaWVudEFkZHJlc3MpOworICBDbGllbnRTb2NrZXQgOj0gV2luYXBpLldpbnNvY2syLmFjY2VwdChTb2NrZXQsIEBDbGllbnRBZGRyZXNzLCBAU2l6ZSk7CisgIGlmIENsaWVudFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBhY2NlcHQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdhY2NlcHQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBNYWtlIHN1cmUgY2xpZW50IHNvY2tldCBpcyBibG9ja2luZworICBaZXJvIDo9IDA7CisgIGlmIGlvY3Rsc29ja2V0KENsaWVudFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgY2xvc2Vzb2NrZXQoQ2xpZW50U29ja2V0KTsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgaW9jdGxzb2NrZXQoKSBGSU9OQklPICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ2lvY3Rsc29ja2V0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgQ2xpZW50IDo9IENyZWF0ZVNvY2tldE9iaihDbGllbnRTb2NrZXQpOworICBpZiBTZW5kVGltZW91dCA+IDAgdGhlbgorICAgIENsaWVudC5TZW5kVGltZW91dCA6PSBTZW5kVGltZW91dDsKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4KKyAgICBDbGllbnQuUmVjdlRpbWVvdXQgOj0gUmVjdlRpbWVvdXQ7CisgIGlmIEtlZXBBbGl2ZSB0aGVuCisgICAgQ2xpZW50LktlZXBBbGl2ZSA6PSBLZWVwQWxpdmU7CisgIENsaWVudC5TZXRDYWNoZWRBZGRyZXNzKFBTb2NrQWRkcihAQ2xpZW50QWRkcmVzcyleLCBTaXplKTsKKworICBpZiBBc3NpZ25lZChGQWNjZXB0Q2FsbGJhY2spIHRoZW4KKyAgICBGQWNjZXB0Q2FsbGJhY2soQ2xpZW50U29ja2V0KTsKKworICBSZXN1bHQgOj0gQ2xpZW50OworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5JbnRlcnJ1cHQ7CitiZWdpbgorICBOb3RpZnkoRkludGVycnVwdFNvY2tXcml0ZXIpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5JbnRlcnJ1cHRDaGlsZHJlbjsKK2JlZ2luCisgIE5vdGlmeShGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpbmhlcml0ZWQgQ2xvc2U7CisgIGlmIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGSW50ZXJydXB0U29ja1dyaXRlcik7CisgIGlmIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGSW50ZXJydXB0U29ja1JlYWRlcik7CisgIGlmIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIpOworICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShJTlZBTElEX1NPQ0tFVCwgbmlsKTsKKyAgRkxpc3RlbmluZyA6PSBGYWxzZTsKK2VuZDsKKworeyRFTkRJRn0gLy8gbm90IGZvciBPTERfU09DS0VUUworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA4YzUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKQEAgLTAsMCArMSwzMTkgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuU3RyZWFtOworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLAorICBTeXNVdGlscywKKyAgU3lzQ29uc3QsCisgIFJUTENvbnN0cywKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgQWN0aXZlWCwKKyAgeyRFTFNFfQorICBXaW5hcGkuQWN0aXZlWCwKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LlV0aWxzOworCit0eXBlCisKKyAgSVRocmlmdFN0cmVhbSA9IGludGVyZmFjZQorICAgIFsnezJBNzdEOTE2LTc0NDYtNDZDMS04NTQ1LTBBRUMwMDA4REJDQX0nXQorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIE9wZW47CisgICAgcHJvY2VkdXJlIENsb3NlOworICAgIHByb2NlZHVyZSBGbHVzaDsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOworICBlbmQ7CisKKyAgVFRocmlmdFN0cmVhbUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnRTdHJlYW0pCisgIHByaXZhdGUKKyAgICBwcm9jZWR1cmUgQ2hlY2tTaXplQW5kT2Zmc2V0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIE9wZW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIEZsdXNoOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgdmlydHVhbDsgYWJzdHJhY3Q7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApCisgIHByaXZhdGUKKyAgICBGU3RyZWFtIDogVFN0cmVhbTsKKyAgICBGT3duc1N0cmVhbSA6IEJvb2xlYW47CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTdHJlYW06IFRTdHJlYW07IEFPd25zU3RyZWFtIDogQm9vbGVhbik7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQorICBwcml2YXRlCisgICAgRlN0cmVhbSA6IElTdHJlYW07CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTdHJlYW06IElTdHJlYW0pOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3sgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00gfQorCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uQ2xvc2U7CitiZWdpbgorICBGU3RyZWFtIDo9IG5pbDsKK2VuZDsKKworY29uc3RydWN0b3IgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJU3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJlYW0gOj0gQVN0cmVhbTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkZsdXNoOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgICBGU3RyZWFtLkNvbW1pdCggU1RHQ19ERUZBVUxUICk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RyZWFtIDw+IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLk9wZW47CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgY291bnQgPj0gYnVmbGVuLW9mZnNldAorICB0aGVuIGNvdW50IDo9IGJ1Zmxlbi1vZmZzZXQ7CisKKyAgUmVzdWx0IDo9IDA7CisgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5SZWFkKCBwVG1wLCBjb3VudCwgQFJlc3VsdCk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLlRvQXJyYXk6IFRCeXRlczsKK3ZhcgorICBzdGF0c3RnOiBUU3RhdFN0ZzsKKyAgbGVuIDogSW50ZWdlcjsKKyAgTmV3UG9zIDogeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjkuMH0gVUludDY0IHskRUxTRX0gSW50NjQgIHskSUZFTkR9OworICBjYlJlYWQgOiBJbnRlZ2VyOworYmVnaW4KKyAgRmlsbENoYXIoIHN0YXRzdGcsIFNpemVPZiggc3RhdHN0ZyksIDApOworICBsZW4gOj0gMDsKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU3RhdCggc3RhdHN0ZywgU1RBVEZMQUdfTk9OQU1FICkpIHRoZW4gYmVnaW4KKyAgICAgIGxlbiA6PSBzdGF0c3RnLmNiU2l6ZTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CisKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgaWYgU3VjY2VlZGVkKCBGU3RyZWFtLlNlZWsoIDAsIFNUUkVBTV9TRUVLX1NFVCwgTmV3UG9zKSApIHRoZW4gYmVnaW4KKyAgICAgIEZTdHJlYW0uUmVhZCggQFJlc3VsdFswXSwgbGVuLCBAY2JSZWFkKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLldyaXRlKCBjb25zdCBwQnVmOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBuV3JpdHRlbiA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGU3RyZWFtLldyaXRlKCBwVG1wLCBjb3VudCwgQG5Xcml0dGVuKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworeyBUVGhyaWZ0U3RyZWFtSW1wbCB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5DaGVja1NpemVBbmRPZmZzZXQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgaWYgKG9mZnNldCA8IDApIG9yICggb2Zmc2V0ID49IGJ1ZmxlbikgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgRVJhbmdlRXJyb3IuQ3JlYXRlKCBTQml0c0luZGV4RXJyb3IgKTsKKyAgICBlbmQ7CisgICAgaWYgY291bnQgPiBidWZsZW4gdGhlbiBiZWdpbgorICAgICAgcmFpc2UgRVJhbmdlRXJyb3IuQ3JlYXRlKCBTQml0c0luZGV4RXJyb3IgKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUltcGwuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZmZlcikgPiAwCisgIHRoZW4gUmVzdWx0IDo9IFJlYWQoIEBidWZmZXJbMF0sIExlbmd0aChidWZmZXIpLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gMDsKKyAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIExlbmd0aChidWZmZXIpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmZmVyWzBdLCBvZmZzZXQsIGNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CitiZWdpbgorICBDaGVja1NpemVBbmRPZmZzZXQoIHBCdWYsIG9mZnNldCtjb3VudCwgb2Zmc2V0LCBjb3VudCk7CitlbmQ7CisKK3sgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkgfQorCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ2xvc2U7CitiZWdpbgorICBGU3RyZWFtLkZyZWU7CisgIEZTdHJlYW0gOj0gbmlsOworICBGT3duc1N0cmVhbSA6PSBGYWxzZTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBUU3RyZWFtOyBBT3duc1N0cmVhbTogQm9vbGVhbik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtIDo9IEFTdHJlYW07CisgIEZPd25zU3RyZWFtIDo9IEFPd25zU3RyZWFtOworZW5kOworCitkZXN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkRlc3Ryb3k7CitiZWdpbgorICBpZiBGT3duc1N0cmVhbSAKKyAgdGhlbiBDbG9zZTsKKyAgCisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkZsdXNoOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Jc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRlN0cmVhbSA8PiBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5PcGVuOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5SZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgY291bnQgPj0gYnVmbGVuLW9mZnNldAorICB0aGVuIGNvdW50IDo9IGJ1Zmxlbi1vZmZzZXQ7CisKKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBwVG1wIDo9IHBCdWY7CisgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgIFJlc3VsdCA6PSBGU3RyZWFtLlJlYWQoIHBUbXBeLCBjb3VudCkKKyAgZW5kCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlRvQXJyYXk6IFRCeXRlczsKK3ZhcgorICBPcmdQb3MgOiBJbnRlZ2VyOworICBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4KKyAgYmVnaW4KKyAgICBsZW4gOj0gRlN0cmVhbS5TaXplOworICBlbmQ7CisKKyAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbiApOworCisgIGlmIGxlbiA+IDAgdGhlbgorICBiZWdpbgorICAgIE9yZ1BvcyA6PSBGU3RyZWFtLlBvc2l0aW9uOworICAgIHRyeQorICAgICAgRlN0cmVhbS5Qb3NpdGlvbiA6PSAwOworICAgICAgRlN0cmVhbS5SZWFkQnVmZmVyKCBQb2ludGVyKEBSZXN1bHRbMF0pXiwgbGVuICk7CisgICAgZmluYWxseQorICAgICAgRlN0cmVhbS5Qb3NpdGlvbiA6PSBPcmdQb3M7CisgICAgZW5kOworICBlbmQKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLldyaXRlKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICBGU3RyZWFtLldyaXRlKCBwVG1wXiwgY291bnQpCisgIGVuZDsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2EzNDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKQEAgLTAsMCArMSwxMDQ0IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCit1bml0IFRocmlmdC5UcmFuc3BvcnQuUGlwZXM7CisKK3skV0FSTiBTWU1CT0xfUExBVEZPUk0gT0ZGfQoreyRJIFRocmlmdC5EZWZpbmVzLmluY30KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgV2luZG93cywgU3lzVXRpbHMsIE1hdGgsIEFjY0N0cmwsIEFjbEFQSSwgU3luY09ianMsCisgIHskRUxTRX0KKyAgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLk1hdGgsIFdpbmFwaS5BY2NDdHJsLCBXaW5hcGkuQWNsQVBJLCBTeXN0ZW0uU3luY09ianMsCisgIHskRU5ESUZ9CisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LlN0cmVhbTsKKworY29uc3QKKyAgREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQgPSAxMDsgIC8vIGRlZmF1bHQ6IGZhaWwgZmFzdCBvbiBvcGVuCisKKwordHlwZQorICAvLy0tLSBQaXBlIFN0cmVhbXMgLS0tCisKKworICBUUGlwZVN0cmVhbUJhc2UgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwpCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBGUGlwZSAgICA6IFRIYW5kbGU7CisgICAgRlRpbWVvdXQgOiBEV09SRDsKKyAgICBGT3BlblRpbWVPdXQgOiBEV09SRDsgIC8vIHNlcGFyYXRlIHZhbHVlIHRvIGFsbG93IGZvciBmYWlsLWZhc3Qtb24tb3BlbiBzY2VuYXJpb3MKKyAgICBGT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50IDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIC8vcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOyAtIHNlZSBkZXJpdmVkIGNsYXNzZXMKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiAgUmVhZERpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uICBSZWFkT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgVE5hbWVkUGlwZVN0cmVhbUltcGwgPSBjbGFzcyBzZWFsZWQoIFRQaXBlU3RyZWFtQmFzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUGlwZU5hbWUgIDogc3RyaW5nOworICAgIEZTaGFyZU1vZGUgOiBEV09SRDsKKyAgICBGU2VjdXJpdHlBdHRyaWJzIDogUFNlY3VyaXR5QXR0cmlidXRlczsKKworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlcyA9IG5pbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU9wZW5UaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCk7ICBvdmVybG9hZDsKKyAgZW5kOworCisKKyAgVEhhbmRsZVBpcGVTdHJlYW1JbXBsID0gY2xhc3Mgc2VhbGVkKCBUUGlwZVN0cmVhbUJhc2UpCisgIHN0cmljdCBwcml2YXRlCisgICAgRlNyY0hhbmRsZSA6IFRIYW5kbGU7CisKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlSGFuZGxlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPd25zSGFuZGxlLCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7ICBvdmVybG9hZDsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgLy8tLS0gUGlwZSBUcmFuc3BvcnRzIC0tLQorCisKKyAgSVBpcGVUcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElTdHJlYW1UcmFuc3BvcnQpCisgICAgWyd7NUUwNUNDODUtNDM0Ri00MjhGLUJGQjItODU2QTE2OEI1NTU4fSddCisgIGVuZDsKKworCisgIFRQaXBlVHJhbnNwb3J0QmFzZSA9IGNsYXNzKCBUU3RyZWFtVHJhbnNwb3J0SW1wbCwgSVBpcGVUcmFuc3BvcnQpCisgIHB1YmxpYworICAgIC8vIElUcmFuc3BvcnQKKyAgICBmdW5jdGlvbiAgR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwgPSBjbGFzcyggVFBpcGVUcmFuc3BvcnRCYXNlKQorICBwdWJsaWMKKyAgICAvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9ycworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZSA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzID0gbmlsOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsgIG92ZXJsb2FkOworICBlbmQ7CisKKworICBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbCA9IGNsYXNzKCBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSGFuZGxlIDogVEhhbmRsZTsKKyAgcHVibGljCisgICAgLy8gSVRyYW5zcG9ydAorICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgcmVpbnRyb2R1Y2U7CisgIGVuZDsKKworCisgIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUUGlwZVRyYW5zcG9ydEJhc2UpCisgIHB1YmxpYworICAgIC8vIEFub255bW91cyBwaXBlIGNvbnN0cnVjdG9yCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgIGFPd25zSGFuZGxlcyA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisgIC8vLS0tIFNlcnZlciBUcmFuc3BvcnRzIC0tLQorCisKKyAgSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElTZXJ2ZXJUcmFuc3BvcnQpCisgICAgWyd7N0FFRTY3OTMtNDdCOS00RTQ5LTk4MUEtQzM5RTkxMDhFOUFEfSddCisgICAgLy8gU2VydmVyIHNpZGUgYW5vbnltb3VzIHBpcGUgZW5kcworICAgIGZ1bmN0aW9uIFJlYWRIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIFdyaXRlSGFuZGxlIDogVEhhbmRsZTsKKyAgICAvLyBDbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBlbmRzCisgICAgZnVuY3Rpb24gQ2xpZW50QW5vblJlYWQgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIENsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOworICBlbmQ7CisKKworICBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0ID0gaW50ZXJmYWNlKCBJU2VydmVyVHJhbnNwb3J0KQorICAgIFsnezlERjlFRTQ4LUQwNjUtNDBBRi04RjY3LUQzMzAzN0QzRDk2MH0nXQorICAgIGZ1bmN0aW9uIEhhbmRsZSA6IFRIYW5kbGU7CisgIGVuZDsKKworCisgIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZSA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZTdG9wU2VydmVyIDogVEV2ZW50OworICAgIHByb2NlZHVyZSBJbnRlcm5hbENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBRdWVyeVN0b3BTZXJ2ZXIgOiBCb29sZWFuOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIExpc3Rlbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZSwgSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkJ1ZlNpemUgICAgICA6IERXT1JEOworCisgICAgLy8gU2VydmVyIHNpZGUgYW5vbnltb3VzIHBpcGUgaGFuZGxlcworICAgIEZSZWFkSGFuZGxlLAorICAgIEZXcml0ZUhhbmRsZSA6IFRIYW5kbGU7CisKKyAgICAvL0NsaWVudCBzaWRlIGFub255bW91cyBwaXBlIGhhbmRsZXMKKyAgICBGQ2xpZW50QW5vblJlYWQsCisgICAgRkNsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOworCisgICAgRlRpbWVPdXQ6IERXT1JEOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBBY2NlcHQoY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBDcmVhdGVBbm9uUGlwZSA6IEJvb2xlYW47CisKKyAgICAvLyBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydAorICAgIGZ1bmN0aW9uIFJlYWRIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIFdyaXRlSGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBDbGllbnRBbm9uUmVhZCA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ2xpZW50QW5vbldyaXRlICA6IFRIYW5kbGU7CisKKyAgICBwcm9jZWR1cmUgSW50ZXJuYWxDbG9zZTsgb3ZlcnJpZGU7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWwgPSA0MDk2OyBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CisgIGVuZDsKKworCisgIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZSwgSU5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUGlwZU5hbWUgICAgIDogc3RyaW5nOworICAgIEZNYXhDb25ucyAgICAgOiBEV09SRDsKKyAgICBGQnVmU2l6ZSAgICAgIDogRFdPUkQ7CisgICAgRlRpbWVvdXQgICAgICA6IERXT1JEOworICAgIEZIYW5kbGUgICAgICAgOiBUSGFuZGxlOworICAgIEZDb25uZWN0ZWQgICAgOiBCb29sZWFuOworCisKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBDcmVhdGVOYW1lZFBpcGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIENyZWF0ZVRyYW5zcG9ydEluc3RhbmNlIDogSVRyYW5zcG9ydDsKKworICAgIC8vIElOYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQKKyAgICBmdW5jdGlvbiBIYW5kbGUgOiBUSGFuZGxlOworICAgIHByb2NlZHVyZSBJbnRlcm5hbENsb3NlOyBvdmVycmlkZTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFQaXBlbmFtZSA6IHN0cmluZzsgYUJ1ZnNpemUgOiBDYXJkaW5hbCA9IDQwOTY7CisgICAgICAgICAgICAgICAgICAgICAgICBhTWF4Q29ubnMgOiBDYXJkaW5hbCA9IFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFUaW1lT3V0IDogQ2FyZGluYWwgPSBJTkZJTklURSk7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK3Byb2NlZHVyZSBDbG9zZVBpcGVIYW5kbGUoIHZhciBoUGlwZSA6IFRIYW5kbGUpOworYmVnaW4KKyAgaWYgaFBpcGUgPD4gSU5WQUxJRF9IQU5ETEVfVkFMVUUKKyAgdGhlbiB0cnkKKyAgICBDbG9zZUhhbmRsZSggaFBpcGUpOworICBmaW5hbGx5CisgICAgaFBpcGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBEdXBsaWNhdGVQaXBlSGFuZGxlKCBjb25zdCBoU291cmNlIDogVEhhbmRsZSkgOiBUSGFuZGxlOworYmVnaW4KKyAgaWYgbm90IER1cGxpY2F0ZUhhbmRsZSggR2V0Q3VycmVudFByb2Nlc3MsIGhTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzLCBAcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnRHVwbGljYXRlSGFuZGxlOiAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKK2VuZDsKKworCisKK3sgVFBpcGVTdHJlYW1CYXNlIH0KKworCitjb25zdHJ1Y3RvciBUUGlwZVN0cmVhbUJhc2UuQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCwgYU9wZW5UaW1lT3V0IDogRFdPUkQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQVNTRVJUKCBhVGltZW91dCA+IDApOyAgLy8gYU9wZW5UaW1lb3V0IG1heSBiZSAwCisgIEZQaXBlICAgICAgICA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRlRpbWVvdXQgICAgIDo9IGFUaW1lT3V0OworICBGT3BlblRpbWVPdXQgOj0gYU9wZW5UaW1lT3V0OworICBGT3ZlcmxhcHBlZCAgOj0gYUVuYWJsZU92ZXJsYXBwZWQ7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUUGlwZVN0cmVhbUJhc2UuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIENsb3NlOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkNsb3NlOworYmVnaW4KKyAgQ2xvc2VQaXBlSGFuZGxlKCBGUGlwZSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5GbHVzaDsKK2JlZ2luCisgIEZsdXNoRmlsZUJ1ZmZlcnMoIEZQaXBlKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChGUGlwZSA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIEZPdmVybGFwcGVkCisgIHRoZW4gV3JpdGVPdmVybGFwcGVkKCBwQnVmLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIFdyaXRlRGlyZWN0KCBwQnVmLCBvZmZzZXQsIGNvdW50KTsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRk92ZXJsYXBwZWQKKyAgdGhlbiByZXN1bHQgOj0gUmVhZE92ZXJsYXBwZWQoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCkKKyAgZWxzZSByZXN1bHQgOj0gUmVhZERpcmVjdCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlRGlyZWN0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgY2JXcml0dGVuLCBuQnl0ZXMgOiBEV09SRDsKKyAgICBwRGF0YSA6IFBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUnKTsKKworICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgbkJ5dGVzIDo9IE1pbiggMTUqNDA5NiwgY291bnQpOyAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgIHBEYXRhICA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuQnl0ZXMgPiAwIGRvIGJlZ2luCisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG5pbCkKKyAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV3JpdGUgdG8gcGlwZSBmYWlsZWQnKTsKKworICAgIEluYyggcERhdGEsIGNiV3JpdHRlbik7CisgICAgRGVjKCBjb3VudCwgY2JXcml0dGVuKTsKKyAgICBuQnl0ZXMgOj0gTWluKCBuQnl0ZXMsIGNvdW50KTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGVPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgY2JXcml0dGVuLCBkd1dhaXQsIGR3RXJyb3IsIG5CeXRlcyA6IERXT1JEOworICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSA6IFBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUnKTsKKworICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgbkJ5dGVzIDo9IE1pbiggMTUqNDA5NiwgY291bnQpOyAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgIHBEYXRhICA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuQnl0ZXMgPiAwIGRvIGJlZ2luCisgICAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworICAgIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBwRGF0YV4sIG5CeXRlcywgY2JXcml0dGVuLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpCisgICAgdGhlbiBiZWdpbgorICAgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgICAgZHdXYWl0IDo9IG92ZXJsYXBwZWQuV2FpdEZvcihGVGltZW91dCk7CisKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSB3cml0ZSB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiV3JpdHRlbiwgVFJVRSkKKyAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnUGlwZSB3cml0ZSBlcnJvcicpOworICAgICAgICBlbmQ7CisKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShkd0Vycm9yKSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgQVNTRVJUKCBEV09SRChuQnl0ZXMpID0gY2JXcml0dGVuKTsKKworICAgIEluYyggcERhdGEsIGNiV3JpdHRlbik7CisgICAgRGVjKCBjb3VudCwgY2JXcml0dGVuKTsKKyAgICBuQnl0ZXMgOj0gTWluKCBuQnl0ZXMsIGNvdW50KTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIGNiUmVhZCwgZHdFcnIsIG5SZW1haW5pbmcgIDogRFdPUkQ7CisgICAgYnl0ZXMsIHJldHJpZXMgIDogTG9uZ0ludDsKKyAgICBiT2sgICAgIDogQm9vbGVhbjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAgLy8gbXMKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKKworICAvLyBNU0ROOiBIYW5kbGUgY2FuIGJlIGEgaGFuZGxlIHRvIGEgbmFtZWQgcGlwZSBpbnN0YW5jZSwKKyAgLy8gb3IgaXQgY2FuIGJlIGEgaGFuZGxlIHRvIHRoZSByZWFkIGVuZCBvZiBhbiBhbm9ueW1vdXMgcGlwZSwKKyAgLy8gVGhlIGhhbmRsZSBtdXN0IGhhdmUgR0VORVJJQ19SRUFEIGFjY2VzcyB0byB0aGUgcGlwZS4KKyAgaWYgRlRpbWVPdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgorICAgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRlRpbWVPdXQgLyBJTlRFUlZBTCkpOworICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgIGlmIG5vdCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKSB0aGVuIGJlZ2luCisgICAgICAgIGR3RXJyIDo9IEdldExhc3RFcnJvcjsKKyAgICAgICAgaWYgKGR3RXJyID0gRVJST1JfSU5WQUxJRF9IQU5ETEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX0JST0tFTl9QSVBFKQorICAgICAgICBvciAoZHdFcnIgPSBFUlJPUl9QSVBFX05PVF9DT05ORUNURUQpCisgICAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgICByZXN1bHQgOj0gMDsgIC8vIG90aGVyIHNpZGUgY2xvc2VkIHRoZSBwaXBlCisgICAgICAgICAgRXhpdDsKKyAgICAgICAgZW5kOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIGJ5dGVzID4gMCB0aGVuIGJlZ2luCisgICAgICAgIEJyZWFrOyAgLy8gdGhlcmUgYXJlIGRhdGEKKyAgICAgIGVuZDsKKworICAgICAgRGVjKCByZXRyaWVzKTsKKyAgICAgIGlmIHJldHJpZXMgPiAwCisgICAgICB0aGVuIFNsZWVwKCBJTlRFUlZBTCkKKyAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgIGVuZDsKKyAgZW5kOworCisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIC8vIHJlYWQgdGhlIGRhdGEgKG9yIGJsb2NrIElORklOSVRFLWx5KQorICAgIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIHBEYXRhXiwgblJlbWFpbmluZywgY2JSZWFkLCBuaWwpOworICAgIGlmIChub3QgYk9rKSBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKKyAgICB0aGVuIEJyZWFrOyAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KKworICAgIERlYyggblJlbWFpbmluZywgY2JSZWFkKTsKKyAgICBJbmMoIHBEYXRhLCBjYlJlYWQpOworICAgIEluYyggcmVzdWx0LCBjYlJlYWQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWRPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd1dhaXQsIGR3RXJyb3IsIG5SZW1haW5pbmcgOiBEV09SRDsKKyAgICBiT2sgICAgIDogQm9vbGVhbjsKKyAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7CisgICAgcERhdGEgICA6IFBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOworCisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKworICAgICAvLyByZWFkIHRoZSBkYXRhCisgICAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgcERhdGFeLCBuUmVtYWluaW5nLCBjYlJlYWQsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cik7CisgICAgaWYgbm90IGJPayB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgICAgICAgZW5kOworCisgICAgICAgICAgaWYgKGR3V2FpdCA8PiBXQUlUX09CSkVDVF8wKQorICAgICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYlJlYWQsIFRSVUUpCisgICAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1BpcGUgcmVhZCBlcnJvcicpOworICAgICAgICBlbmQ7CisKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShkd0Vycm9yKSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgQVNTRVJUKCBjYlJlYWQgPiAwKTsgIC8vIHNlZSBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKCkKKyAgICBBU1NFUlQoIGNiUmVhZCA8PSBEV09SRChuUmVtYWluaW5nKSk7CisgICAgRGVjKCBuUmVtYWluaW5nLCBjYlJlYWQpOworICAgIEluYyggcERhdGEsIGNiUmVhZCk7CisgICAgSW5jKCByZXN1bHQsIGNiUmVhZCk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuVG9BcnJheTogVEJ5dGVzOwordmFyIGJ5dGVzIDogTG9uZ0ludDsKK2JlZ2luCisgIFNldExlbmd0aCggcmVzdWx0LCAwKTsKKyAgYnl0ZXMgOj0gMDsKKworICBpZiAgSXNPcGVuCisgIGFuZCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKQorICBhbmQgKGJ5dGVzID4gMCkKKyAgdGhlbiBiZWdpbgorICAgIFNldExlbmd0aCggcmVzdWx0LCBieXRlcyk7CisgICAgUmVhZCggcmVzdWx0LCAwLCBieXRlcyk7CisgIGVuZDsKK2VuZDsKKworCit7IFROYW1lZFBpcGVTdHJlYW1JbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCwgYU9wZW5UaW1lT3V0KTsKKworICBGUGlwZU5hbWUgICAgICAgIDo9IGFQaXBlTmFtZTsKKyAgRlNoYXJlTW9kZSAgICAgICA6PSBhU2hhcmVNb2RlOworICBGU2VjdXJpdHlBdHRyaWJzIDo9IGFTZWN1cml0eUF0dHJpYnV0ZXM7CisKKyAgaWYgQ29weShGUGlwZU5hbWUsMSwyKSA8PiAnXFwnCisgIHRoZW4gRlBpcGVOYW1lIDo9ICdcXC5ccGlwZVwnICsgRlBpcGVOYW1lOyAgLy8gYXNzdW1lIGxvY2FsaG9zdAorZW5kOworCisKK3Byb2NlZHVyZSBUTmFtZWRQaXBlU3RyZWFtSW1wbC5PcGVuOwordmFyIGhQaXBlICAgIDogVEhhbmRsZTsKKyAgICByZXRyaWVzLCB0aW1lb3V0LCBkd0VyciA6IERXT1JEOworY29uc3QgSU5URVJWQUwgPSAxMDsgLy8gbXMKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIEV4aXQ7CisKKyAgcmV0cmllcyA6PSBNYXgoIDEsIFJvdW5kKCAxLjAgKiBGT3BlblRpbWVPdXQgLyBJTlRFUlZBTCkpOworICB0aW1lb3V0IDo9IEZPcGVuVGltZU91dDsKKworICAvLyBpZiB0aGUgc2VydmVyIGhhc24ndCBnb3R0ZW4gdG8gdGhlIHBvaW50IHdoZXJlIHRoZSBwaXBlIGhhcyBiZWVuIGNyZWF0ZWQsIGF0IGxlYXN0IHdhaXQgdGhlIHRpbWVvdXQKKyAgLy8gQWNjb3JkaW5nIHRvIE1TRE4sIGlmIG5vIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG5hbWVkIHBpcGUgZXhpc3QsIHRoZSBXYWl0TmFtZWRQaXBlIGZ1bmN0aW9uCisgIC8vIHJldHVybnMgSU1NRURJQVRFTFksIHJlZ2FyZGxlc3Mgb2YgdGhlIHRpbWUtb3V0IHZhbHVlLgorICAvLyBBbHdheXMgdXNlIElOVEVSVkFMLCBzaW5jZSBXYWl0TmFtZWRQaXBlKDApIGRlZmF1bHRzIHRvIHNvbWUgb3RoZXIgdmFsdWUKKyAgd2hpbGUgbm90IFdhaXROYW1lZFBpcGUoIFBDaGFyKEZQaXBlTmFtZSksIElOVEVSVkFMKSBkbyBiZWdpbgorICAgIGR3RXJyIDo9IEdldExhc3RFcnJvcjsKKyAgICBpZiBkd0VyciA8PiBFUlJPUl9GSUxFX05PVF9GT1VORAorICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdVbmFibGUgdG8gb3BlbiBwaXBlLCAnK1N5c0Vycm9yTWVzc2FnZShkd0VycikpOworCisgICAgaWYgdGltZW91dCA8PiBJTkZJTklURSB0aGVuIGJlZ2luCisgICAgICBpZiAocmV0cmllcyA+IDApCisgICAgICB0aGVuIERlYyhyZXRyaWVzKQorICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsIHRpbWVkIG91dCcpOworICAgIGVuZDsKKworICAgIFNsZWVwKElOVEVSVkFMKQorICBlbmQ7CisKKyAgLy8gb3BlbiB0aGF0IHRoaW5neQorICBoUGlwZSA6PSBDcmVhdGVGaWxlKCBQQ2hhciggRlBpcGVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIG9yIEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgIEZTaGFyZU1vZGUsICAgICAgICAvLyBzaGFyaW5nCisgICAgICAgICAgICAgICAgICAgICAgIEZTZWN1cml0eUF0dHJpYnMsICAvLyBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsICAgICAvLyBvcGVucyBleGlzdGluZyBwaXBlCisgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVEIG9yIEZJTEVfRkxBR19XUklURV9USFJPVUdILCAvLyBhc3luYytmYXN0LCBwbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgIC8vIG5vIHRlbXBsYXRlIGZpbGUKKworICBpZiBoUGlwZSA9IElOVkFMSURfSEFORExFX1ZBTFVFCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdVbmFibGUgdG8gb3BlbiBwaXBlLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKKworICAvLyBldmVyeXRoaW5nIGZpbmUKKyAgRlBpcGUgOj0gaFBpcGU7CitlbmQ7CisKKworeyBUSGFuZGxlUGlwZVN0cmVhbUltcGwgfQorCisKK2NvbnN0cnVjdG9yIFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlSGFuZGxlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPd25zSGFuZGxlLCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZU91dCk7CisKKyAgaWYgYU93bnNIYW5kbGUKKyAgdGhlbiBGU3JjSGFuZGxlIDo9IGFQaXBlSGFuZGxlCisgIGVsc2UgRlNyY0hhbmRsZSA6PSBEdXBsaWNhdGVQaXBlSGFuZGxlKCBhUGlwZUhhbmRsZSk7CisKKyAgT3BlbjsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2VQaXBlSGFuZGxlKCBGU3JjSGFuZGxlKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5PcGVuOworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIEZQaXBlIDo9IER1cGxpY2F0ZVBpcGVIYW5kbGUoIEZTcmNIYW5kbGUpOworZW5kOworCisKK3sgVFBpcGVUcmFuc3BvcnRCYXNlIH0KKworCitmdW5jdGlvbiBUUGlwZVRyYW5zcG9ydEJhc2UuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChGSW5wdXRTdHJlYW0gPD4gbmlsKSAgYW5kIChGSW5wdXRTdHJlYW0uSXNPcGVuKQorICAgICAgICBhbmQgKEZPdXRwdXRTdHJlYW0gPD4gbmlsKSBhbmQgKEZPdXRwdXRTdHJlYW0uSXNPcGVuKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVUcmFuc3BvcnRCYXNlLk9wZW47CitiZWdpbgorICBGSW5wdXRTdHJlYW0uT3BlbjsKKyAgRk91dHB1dFN0cmVhbS5PcGVuOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVRyYW5zcG9ydEJhc2UuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0uQ2xvc2U7CisgIEZPdXRwdXRTdHJlYW0uQ2xvc2U7CitlbmQ7CisKKworeyBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbCB9CisKKworY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7IGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCwgYU9wZW5UaW1lT3V0IDogRFdPUkQpOworLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcgorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOworICBGSW5wdXRTdHJlYW0gIDo9IFROYW1lZFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVOYW1lLCBUUlVFLCBhU2hhcmVNb2RlLCBhU2VjdXJpdHlBdHRyaWJ1dGVzLCBhVGltZU91dCwgYU9wZW5UaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07ICAvLyB0cnVlIGZvciBuYW1lZCBwaXBlcworZW5kOworCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsLkNyZWF0ZSggYVBpcGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZSA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOworLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcgorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOworICBGSW5wdXRTdHJlYW0gIDo9IFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlLCBUUlVFLCBhT3duc0hhbmRsZSwgYVRpbWVPdXQpOworICBGT3V0cHV0U3RyZWFtIDo9IEZJbnB1dFN0cmVhbTsgIC8vIHRydWUgZm9yIG5hbWVkIHBpcGVzCitlbmQ7CisKKworeyBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbCB9CisKKworY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwuQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCk7CisvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBGSGFuZGxlIDo9IER1cGxpY2F0ZVBpcGVIYW5kbGUoIGFQaXBlKTsKKyAgaW5oZXJpdGVkIENyZWF0ZSggYVBpcGUsIGFPd25zSGFuZGxlLCBhVGltZU91dCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsLkNsb3NlOworYmVnaW4KKyAgRmx1c2hGaWxlQnVmZmVycyggRkhhbmRsZSk7CisgIERpc2Nvbm5lY3ROYW1lZFBpcGUoIEZIYW5kbGUpOyAgLy8gZm9yY2UgY2xpZW50IG9mZiB0aGUgcGlwZQorICBDbG9zZVBpcGVIYW5kbGUoIEZIYW5kbGUpOworCisgIGluaGVyaXRlZCBDbG9zZTsKK2VuZDsKKworCit7IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbCB9CisKKworY29uc3RydWN0b3IgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFPd25zSGFuZGxlcyA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CisvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOworICAvLyBvdmVybGFwcGVkIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBBbm9uUGlwZXMsIHNlZSBNU0ROCisgIEZJbnB1dFN0cmVhbSAgOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVSZWFkLCBhT3duc0hhbmRsZXMsIEZBTFNFLCBhVGltZU91dCk7CisgIEZPdXRwdXRTdHJlYW0gOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVXcml0ZSwgYU93bnNIYW5kbGVzLCBGQUxTRSwgYVRpbWVPdXQpOworZW5kOworCisKK3sgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlIH0KKworCitjb25zdHJ1Y3RvciBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0b3BTZXJ2ZXIgOj0gVEV2ZW50LkNyZWF0ZShuaWwsVFJVRSxGQUxTRSwnJyk7ICAvLyBtYW51YWwgcmVzZXQKK2VuZDsKKworCitkZXN0cnVjdG9yIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRlN0b3BTZXJ2ZXIpOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuUXVlcnlTdG9wU2VydmVyIDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSAoRlN0b3BTZXJ2ZXIgPSBuaWwpCisgICAgICAgICBvciAoRlN0b3BTZXJ2ZXIuV2FpdEZvcigwKSA8PiB3clRpbWVvdXQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuTGlzdGVuOworYmVnaW4KKyAgRlN0b3BTZXJ2ZXIuUmVzZXRFdmVudDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkNsb3NlOworYmVnaW4KKyAgRlN0b3BTZXJ2ZXIuU2V0RXZlbnQ7CisgIEludGVybmFsQ2xvc2U7CitlbmQ7CisKKworeyBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGUoYUJ1ZnNpemUgOiBDYXJkaW5hbDsgYVRpbWVPdXQgOiBEV09SRCk7CisvLyBBbm9ueW1vdXMgcGlwZSBDVE9SCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGQnVmc2l6ZSAgOj0gYUJ1ZlNpemU7CisgIEZSZWFkSGFuZGxlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGV3JpdGVIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZDbGllbnRBbm9uUmVhZCA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRkNsaWVudEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRlRpbWVPdXQgOj0gYVRpbWVPdXQ7CisKKyAgLy8gVGhlIGFub255bW91cyBwaXBlIG5lZWRzIHRvIGJlIGNyZWF0ZWQgZmlyc3Qgc28gdGhhdCB0aGUgc2VydmVyIGNhbgorICAvLyBwYXNzIHRoZSBoYW5kbGVzIG9uIHRvIHRoZSBjbGllbnQgYmVmb3JlIHRoZSBzZXJ2ZSAoYWNjZXB0SW1wbCkKKyAgLy8gYmxvY2tpbmcgY2FsbC4KKyAgaWYgbm90IENyZWF0ZUFub25QaXBlCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKENsYXNzTmFtZSsnLkNyZWF0ZSgpIGZhaWxlZCcpOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5BY2NlcHQoY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhciBidWYgICAgOiBCeXRlOworICAgIGJyICAgICA6IERXT1JEOworYmVnaW4KKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICAvLyBUaGlzIDAtYnl0ZSByZWFkIHNlcnZlcyBtZXJlbHkgYXMgYSBibG9ja2luZyBjYWxsLgorICBpZiBub3QgUmVhZEZpbGUoIEZSZWFkSGFuZGxlLCBidWYsIDAsIGJyLCBuaWwpCisgIGFuZCAoR2V0TGFzdEVycm9yKCkgPD4gRVJST1JfTU9SRV9EQVRBKQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOworCisgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKKyAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFLCBGVGltZU91dCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5JbnRlcm5hbENsb3NlOworYmVnaW4KKyAgQ2xvc2VQaXBlSGFuZGxlKCBGUmVhZEhhbmRsZSk7CisgIENsb3NlUGlwZUhhbmRsZSggRldyaXRlSGFuZGxlKTsKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGQ2xpZW50QW5vblJlYWQpOworICBDbG9zZVBpcGVIYW5kbGUoIEZDbGllbnRBbm9uV3JpdGUpOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5SZWFkSGFuZGxlIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGUmVhZEhhbmRsZTsKK2VuZDsKKworCitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuV3JpdGVIYW5kbGUgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcml0ZUhhbmRsZTsKK2VuZDsKKworCitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ2xpZW50QW5vblJlYWQgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZDbGllbnRBbm9uUmVhZDsKK2VuZDsKKworCitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ2xpZW50QW5vbldyaXRlICA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRkNsaWVudEFub25Xcml0ZTsKK2VuZDsKKworCitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlQW5vblBpcGUgOiBCb29sZWFuOwordmFyIHNkICAgICAgICAgICA6IFBTRUNVUklUWV9ERVNDUklQVE9SOworICAgIHNhICAgICAgICAgICA6IFNFQ1VSSVRZX0FUVFJJQlVURVM7IC8vVFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICBoQ0FSLCBoUGlwZVcsIGhDQVcsIGhQaXBlIDogVEhhbmRsZTsKK2JlZ2luCisgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOworICB0cnkKKyAgICBXaW4zMkNoZWNrKCBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpOworICAgIFdpbjMyQ2hlY2soIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woIHNkLCBUUlVFLCBuaWwsIEZBTFNFKSk7CisKKyAgICBzYS5uTGVuZ3RoIDo9IHNpemVvZiggc2EpOworICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yIDo9IHNkOworICAgIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IFRSVUU7IC8vYWxsb3cgcGFzc2luZyBoYW5kbGUgdG8gY2hpbGQKKworICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoQ0FSLCBoUGlwZVcsIEBzYSwgRkJ1ZlNpemUpOyAvL2NyZWF0ZSBzdGRpbiBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaFBpcGUsIGhDQVcsIEBzYSwgRkJ1ZlNpemUpOyAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgLy9jcmVhdGUgc3Rkb3V0IHBpcGUKKyAgICAgIENsb3NlSGFuZGxlKCBoQ0FSKTsKKyAgICAgIENsb3NlSGFuZGxlKCBoUGlwZVcpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICBGQ2xpZW50QW5vblJlYWQgIDo9IGhDQVI7CisgICAgRkNsaWVudEFub25Xcml0ZSA6PSBoQ0FXOworICAgIEZSZWFkSGFuZGxlICAgICAgOj0gaFBpcGU7CisgICAgRldyaXRlSGFuZGxlICAgICA6PSBoUGlwZVc7CisgIGZpbmFsbHkKKyAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKHNkKSk7CisgIGVuZDsKK2VuZDsKKworCit7IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGFQaXBlbmFtZSA6IHN0cmluZzsgYUJ1ZnNpemUsIGFNYXhDb25ucywgYVRpbWVPdXQgOiBDYXJkaW5hbCk7CisvLyBOYW1lZCBQaXBlIENUT1IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEFTU0VSVCggYVRpbWVvdXQgPiAwKTsKKyAgRlBpcGVOYW1lICA6PSBhUGlwZW5hbWU7CisgIEZCdWZzaXplICAgOj0gYUJ1ZlNpemU7CisgIEZNYXhDb25ucyAgOj0gTWF4KCAxLCBNaW4oIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUywgYU1heENvbm5zKSk7CisgIEZIYW5kbGUgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lb3V0ICAgOj0gYVRpbWVPdXQ7CisgIEZDb25uZWN0ZWQgOj0gRkFMU0U7CisKKyAgaWYgQ29weShGUGlwZU5hbWUsMSwyKSA8PiAnXFwnCisgIHRoZW4gRlBpcGVOYW1lIDo9ICdcXC5ccGlwZVwnICsgRlBpcGVOYW1lOyAgLy8gYXNzdW1lIGxvY2FsaG9zdAorZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwordmFyIGR3RXJyb3IsIGR3V2FpdCwgZHdEdW1teSA6IERXT1JEOworICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBoYW5kbGVzIDogYXJyYXlbMC4uMV0gb2YgVEhhbmRsZTsKK2JlZ2luCisgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKworICBBU1NFUlQoIG5vdCBGQ29ubmVjdGVkKTsKKyAgQ3JlYXRlTmFtZWRQaXBlOworICB3aGlsZSBub3QgRkNvbm5lY3RlZCBkbyBiZWdpbgorCisgICAgaWYgUXVlcnlTdG9wU2VydmVyIHRoZW4gYmVnaW4KKyAgICAgIEludGVybmFsQ2xvc2U7CisgICAgICBBYm9ydDsKKyAgICBlbmQ7CisKKyAgICBpZiBBc3NpZ25lZChmbkFjY2VwdGluZykKKyAgICB0aGVuIGZuQWNjZXB0aW5nKCk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgY2xpZW50IHRvIGNvbm5lY3Q7IGlmIGl0IHN1Y2NlZWRzLCB0aGUKKyAgICAvLyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgICAvLyB6ZXJvLCBHZXRMYXN0RXJyb3Igc2hvdWxkIHJldHVybiBFUlJPUl9QSVBFX0NPTk5FQ1RFRC4KKyAgICBpZiBDb25uZWN0TmFtZWRQaXBlKCBIYW5kbGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikgdGhlbiBiZWdpbgorICAgICAgRkNvbm5lY3RlZCA6PSBUUlVFOworICAgICAgQnJlYWs7CisgICAgZW5kOworCisgICAgLy8gQ29ubmVjdE5hbWVkUGlwZSgpIHJldHVybnMgRkFMU0UgZm9yIE92ZXJsYXBwZWRJTywgZXZlbiBpZiBjb25uZWN0ZWQuCisgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBHZXRMYXN0RXJyb3IoKSBleHBsaWNpdGx5IHRvIGZpbmQgb3V0CisgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgY2FzZSBkd0Vycm9yIG9mCisgICAgICBFUlJPUl9QSVBFX0NPTk5FQ1RFRCA6IGJlZ2luCisgICAgICAgIEZDb25uZWN0ZWQgOj0gbm90IFF1ZXJ5U3RvcFNlcnZlcjsgIC8vIHNwZWNpYWwgY2FzZTogcGlwZSBpbW1lZGlhdGVseSBjb25uZWN0ZWQKKyAgICAgIGVuZDsKKworICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgIGhhbmRsZXNbMF0gOj0gb3ZlcmxhcHBlZC5XYWl0SGFuZGxlOworICAgICAgICBoYW5kbGVzWzFdIDo9IEZTdG9wU2VydmVyLkhhbmRsZTsKKyAgICAgICAgZHdXYWl0IDo9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoIDIsIEBoYW5kbGVzLCBGQUxTRSwgRlRpbWVvdXQpOworICAgICAgICBGQ29ubmVjdGVkIDo9IChkd1dhaXQgPSBXQUlUX09CSkVDVF8wKQorICAgICAgICAgICAgICAgICAgYW5kIEdldE92ZXJsYXBwZWRSZXN1bHQoIEhhbmRsZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBkd0R1bW15LCBUUlVFKQorICAgICAgICAgICAgICAgICAgYW5kIG5vdCBRdWVyeVN0b3BTZXJ2ZXI7CisgICAgICBlbmQ7CisKKyAgICBlbHNlCisgICAgICBJbnRlcm5hbENsb3NlOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDbGllbnQgY29ubmVjdGlvbiBmYWlsZWQnKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBjcmVhdGUgdGhlIHRyYW5zcG9ydCBpbXBsCisgIHJlc3VsdCA6PSBDcmVhdGVUcmFuc3BvcnRJbnN0YW5jZTsKK2VuZDsKKworCitmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGVUcmFuc3BvcnRJbnN0YW5jZSA6IElUcmFuc3BvcnQ7CisvLyBjcmVhdGUgdGhlIHRyYW5zcG9ydCBpbXBsCit2YXIgaFBpcGUgOiBUSGFuZGxlOworYmVnaW4KKyAgaFBpcGUgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoIFBvaW50ZXIoRkhhbmRsZSksIFBvaW50ZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgIHRyeQorICAgIEZDb25uZWN0ZWQgOj0gRkFMU0U7CisgICAgcmVzdWx0IDo9IFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsLkNyZWF0ZSggaFBpcGUsIFRSVUUsIEZUaW1lb3V0KTsKKyAgZXhjZXB0CisgICAgQ2xvc2VQaXBlSGFuZGxlKGhQaXBlKTsKKyAgICByYWlzZTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5JbnRlcm5hbENsb3NlOwordmFyIGhQaXBlIDogVEhhbmRsZTsKK2JlZ2luCisgIGhQaXBlIDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKCBQb2ludGVyKEZIYW5kbGUpLCBQb2ludGVyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICBpZiBoUGlwZSA9IElOVkFMSURfSEFORExFX1ZBTFVFIHRoZW4gRXhpdDsKKworICB0cnkKKyAgICBpZiBGQ29ubmVjdGVkCisgICAgdGhlbiBGbHVzaEZpbGVCdWZmZXJzKCBoUGlwZSkKKyAgICBlbHNlIENhbmNlbElvKCBoUGlwZSk7CisgICAgRGlzY29ubmVjdE5hbWVkUGlwZSggaFBpcGUpOworICBmaW5hbGx5CisgICAgQ2xvc2VQaXBlSGFuZGxlKCBoUGlwZSk7CisgICAgRkNvbm5lY3RlZCA6PSBGQUxTRTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkhhbmRsZSA6IFRIYW5kbGU7CitiZWdpbgorICB7JElGREVGIFdJTjY0fQorICByZXN1bHQgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBJbnQ2NChGSGFuZGxlKSwgMCkpOworICB7JEVMU0V9CisgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCBJbnRlZ2VyKEZIYW5kbGUpLCAwKSk7CisgIHskRU5ESUZ9CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlTmFtZWRQaXBlIDogVEhhbmRsZTsKK3ZhciBTSURBdXRoV29ybGQgOiBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgOworICAgIGV2ZXJ5b25lX3NpZCA6IFBTSUQ7CisgICAgZWEgICAgICAgICAgIDogRVhQTElDSVRfQUNDRVNTOworICAgIGFjbCAgICAgICAgICA6IFBBQ0w7CisgICAgc2QgICAgICAgICAgIDogUFNFQ1VSSVRZX0RFU0NSSVBUT1I7CisgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsKK2NvbnN0CisgIFNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFkgIDogVFNJRElkZW50aWZpZXJBdXRob3JpdHkgPSAoVmFsdWUgOiAoMCwwLDAsMCwwLDEpKTsKKyAgU0VDVVJJVFlfV09STERfUklEID0gJDAwMDAwMDAwOworYmVnaW4KKyAgc2QgOj0gbmlsOworICBldmVyeW9uZV9zaWQgOj0gbmlsOworICB0cnkKKyAgICBBU1NFUlQoIChGSGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIGFuZCBub3QgRkNvbm5lY3RlZCk7CisKKyAgICAvLyBXaW5kb3dzIC0gc2V0IHNlY3VyaXR5IHRvIGFsbG93IG5vbi1lbGV2YXRlZCBhcHBzCisgICAgLy8gdG8gYWNjZXNzIHBpcGVzIGNyZWF0ZWQgYnkgZWxldmF0ZWQgYXBwcy4KKyAgICBTSURBdXRoV29ybGQgOj0gU0VDVVJJVFlfV09STERfU0lEX0FVVEhPUklUWTsKKyAgICBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoIFNJREF1dGhXb3JsZCwgMSwgU0VDVVJJVFlfV09STERfUklELCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBldmVyeW9uZV9zaWQpOworCisgICAgWmVyb01lbW9yeSggQGVhLCBTaXplT2YoZWEpKTsKKyAgICBlYS5ncmZBY2Nlc3NQZXJtaXNzaW9ucyA6PSBHRU5FUklDX0FMTDsgLy9TUEVDSUZJQ19SSUdIVFNfQUxMIG9yIFNUQU5EQVJEX1JJR0hUU19BTEw7CisgICAgZWEuZ3JmQWNjZXNzTW9kZSAgICAgICAgOj0gU0VUX0FDQ0VTUzsKKyAgICBlYS5ncmZJbmhlcml0YW5jZSAgICAgICA6PSBOT19JTkhFUklUQU5DRTsKKyAgICBlYS5UcnVzdGVlLlRydXN0ZWVGb3JtICA6PSBUUlVTVEVFX0lTX1NJRDsKKyAgICBlYS5UcnVzdGVlLlRydXN0ZWVUeXBlICA6PSBUUlVTVEVFX0lTX1dFTExfS05PV05fR1JPVVA7CisgICAgZWEuVHJ1c3RlZS5wdHN0ck5hbWUgICAgOj0gUENoYXIoZXZlcnlvbmVfc2lkKTsKKworICAgIGFjbCA6PSBuaWw7CisgICAgU2V0RW50cmllc0luQWNsKCAxLCBAZWEsIG5pbCwgYWNsKTsKKworICAgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOworICAgIFdpbjMyQ2hlY2soIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoIHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKSk7CisgICAgV2luMzJDaGVjayggU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCggc2QsIFRSVUUsIGFjbCwgRkFMU0UpKTsKKworICAgIHNhLm5MZW5ndGggOj0gU2l6ZU9mKHNhKTsKKyAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA6PSBzZDsKKyAgICBzYS5iSW5oZXJpdEhhbmRsZSAgICAgICA6PSBGQUxTRTsKKworICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgcGlwZQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IFdpbmRvd3MuQ3JlYXRlTmFtZWRQaXBlKAorICAgIHskRUxTRX0KKyAgICByZXN1bHQgOj0gV2luYXBpLldpbmRvd3MuQ3JlYXRlTmFtZWRQaXBlKAorICAgIHskRU5ESUZ9CisgICAgICAgIFBDaGFyKCBGUGlwZU5hbWUpLCAgICAgICAgLy8gcGlwZSBuYW1lCisgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCBvciAgICAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKKyAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQsICAgICAvLyBhc3luYyBtb2RlCisgICAgICAgIFBJUEVfVFlQRV9CWVRFIG9yICAgICAgICAgLy8gYnl0ZSB0eXBlIHBpcGUKKyAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgICAgICAvLyBieXRlIHJlYWQgbW9kZQorICAgICAgICBGTWF4Q29ubnMsICAgICAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCisgICAgICAgIEZCdWZTaXplLCAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICAgIEZCdWZTaXplLCAgICAgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKKyAgICAgICAgRlRpbWVvdXQsICAgICAgICAgICAgICAgICAvLyB0aW1lLW91dCwgc2VlIE1TRE4KKyAgICAgICAgQHNhICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHNlY3VyaXR5IGF0dHJpYnV0ZQorICAgICk7CisKKyAgICBpZiggcmVzdWx0IDw+IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHRoZW4gSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoIFBvaW50ZXIoRkhhbmRsZSksIFBvaW50ZXIocmVzdWx0KSkKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkICcgKyBJbnRUb1N0cihHZXRMYXN0RXJyb3IpKTsKKworICBmaW5hbGx5CisgICAgaWYgc2QgPD4gbmlsIHRoZW4gTG9jYWxGcmVlKCBDYXJkaW5hbCggc2QpKTsKKyAgICBpZiBhY2wgPD4gbmlsIHRoZW4gTG9jYWxGcmVlKCBDYXJkaW5hbCggYWNsKSk7CisgICAgaWYgZXZlcnlvbmVfc2lkIDw+IG5pbCB0aGVuIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKKyAgZW5kOworZW5kOworCisKKworZW5kLgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ5YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKQEAgLTAsMCArMSwxNzE1IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCit1bml0IFRocmlmdC5UcmFuc3BvcnQ7CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9Cit7JFNDT1BFREVOVU1TIE9OfQorCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLAorICBTeXNVdGlscywKKyAgTWF0aCwKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgQWN0aXZlWCwgbXN4bWwsIFdpblNvY2ssIFNvY2tldHMsCisgIHskRUxTRX0KKyAgICBXaW5hcGkuQWN0aXZlWCwgV2luYXBpLm1zeG1sLCBXaW5hcGkuV2luU29jaywKKyAgICB7JElGREVGIE9MRF9TT0NLRVRTfQorICAgICAgV2ViLldpbi5Tb2NrZXRzLAorICAgIHskRUxTRX0KKyAgICAgIFRocmlmdC5Tb2NrZXQsCisgICAgeyRFTkRJRn0KKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBUaHJpZnQuRXhjZXB0aW9uLAorICBUaHJpZnQuVXRpbHMsCisgIFRocmlmdC5TdHJlYW07CisKK3R5cGUKKyAgSVRyYW5zcG9ydCA9IGludGVyZmFjZQorICAgIFsne0RCODQ5NjFFLThCQjMtNDUzMi05OUUxLUE4QzdBQzIzMDBGN30nXQorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsKKyAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CisgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgT3BlbjsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgRmx1c2g7CisgIGVuZDsKKworICBUVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CisgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgT3BlbigpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIEZsdXNoOyB2aXJ0dWFsOworICBlbmQ7CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICB0eXBlCisgICAgICBURXhjZXB0aW9uVHlwZSA9ICgKKyAgICAgICAgVW5rbm93biwKKyAgICAgICAgTm90T3BlbiwKKyAgICAgICAgQWxyZWFkeU9wZW4sCisgICAgICAgIFRpbWVkT3V0LAorICAgICAgICBFbmRPZkZpbGUsCisgICAgICAgIEJhZEFyZ3MsCisgICAgICAgIEludGVycnVwdGVkCisgICAgICApOworICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CisgIHByb3RlY3RlZAorICAgIGNvbnN0cnVjdG9yIEhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247IHJlaW50cm9kdWNlOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRUcmFuc3BvcnRFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRUcmFuc3BvcnRFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBwcm9wZXJ0eSBUeXBlXzogVEV4Y2VwdGlvblR5cGUgcmVhZCBHZXRUeXBlOworICBlbmQ7CisKKyAgLy8gTmVlZGVkIHRvIHJlbW92ZSBkZXByZWNhdGlvbiB3YXJuaW5nCisgIFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCA9IGNsYXNzIGFic3RyYWN0IChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBlbmQ7CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24gPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4gPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dCA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uRW5kT2ZGaWxlID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZCA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworCisgIElIVFRQQ2xpZW50ID0gaW50ZXJmYWNlKCBJVHJhbnNwb3J0ICkKKyAgICBbJ3tCQTE0MkQxMi04QUU2LTRCNTAtOUUzMy02Qjc4NDNCMjFENzN9J10KKyAgICBwcm9jZWR1cmUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRTZW5kVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworICAgIHByb2NlZHVyZSBTZW5kUmVxdWVzdDsKKworICAgIHByb3BlcnR5IERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0RG5zUmVzb2x2ZVRpbWVvdXQgd3JpdGUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogSW50ZWdlciByZWFkIEdldFNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OworICAgIHByb3BlcnR5IFJlYWRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0UmVhZFRpbWVvdXQgd3JpdGUgU2V0UmVhZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOworICBlbmQ7CisKKyAgVEhUVFBDbGllbnRJbXBsID0gY2xhc3MoIFRUcmFuc3BvcnRJbXBsLCBJSFRUUENsaWVudCkKKyAgcHJpdmF0ZQorICAgIEZVcmkgOiBzdHJpbmc7CisgICAgRklucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGRG5zUmVzb2x2ZVRpbWVvdXQgOiBJbnRlZ2VyOworICAgIEZDb25uZWN0aW9uVGltZW91dCA6IEludGVnZXI7CisgICAgRlNlbmRUaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGUmVhZFRpbWVvdXQgOiBJbnRlZ2VyOworICAgIEZDdXN0b21IZWFkZXJzIDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisKKyAgICBmdW5jdGlvbiBDcmVhdGVSZXF1ZXN0OiBJWE1MSFRUUFJlcXVlc3Q7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW4oKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworCisgICAgcHJvY2VkdXJlIFNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0U2VuZFRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsKKworICAgIGZ1bmN0aW9uIEdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworICAgIHByb2NlZHVyZSBTZW5kUmVxdWVzdDsKKyAgICBwcm9wZXJ0eSBEbnNSZXNvbHZlVGltZW91dDogSW50ZWdlciByZWFkIEdldERuc1Jlc29sdmVUaW1lb3V0IHdyaXRlIFNldERuc1Jlc29sdmVUaW1lb3V0OworICAgIHByb3BlcnR5IENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0Q29ubmVjdGlvblRpbWVvdXQgd3JpdGUgU2V0Q29ubmVjdGlvblRpbWVvdXQ7CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKKyAgICBwcm9wZXJ0eSBSZWFkVGltZW91dDogSW50ZWdlciByZWFkIEdldFJlYWRUaW1lb3V0IHdyaXRlIFNldFJlYWRUaW1lb3V0OworICAgIHByb3BlcnR5IEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+IHJlYWQgR2V0Q3VzdG9tSGVhZGVyczsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVXJpOiBzdHJpbmcpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJU2VydmVyVHJhbnNwb3J0ID0gaW50ZXJmYWNlCisgICAgWyd7QzQzQjg3RUQtNjlFQS00N0M0LUI3N0MtMTVFMjg4MjUyOTAwfSddCisgICAgcHJvY2VkdXJlIExpc3RlbjsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7CisgICAgZnVuY3Rpb24gQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OworICBlbmQ7CisKKyAgVFNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTZXJ2ZXJUcmFuc3BvcnQpCisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBMaXN0ZW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OyAgdmlydHVhbDsgYWJzdHJhY3Q7CisgIGVuZDsKKworICBJVHJhbnNwb3J0RmFjdG9yeSA9IGludGVyZmFjZQorICAgIFsne0REODA5NDQ2LTAwMEYtNDlFMS05QkZGLUUwRDBEQzc2QTlEN30nXQorICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRGYWN0b3J5SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRyYW5zcG9ydEZhY3RvcnkpCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OyB2aXJ0dWFsOworICBlbmQ7CisKKyAgVFRjcFNvY2tldFN0cmVhbUltcGwgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwgKQoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgcHJpdmF0ZSB0eXBlCisgICAgVFdhaXRGb3JEYXRhID0gKCB3ZmRfSGF2ZURhdGEsIHdmZF9UaW1lb3V0LCB3ZmRfRXJyb3IpOworICBwcml2YXRlCisgICAgRlRjcENsaWVudCA6IFRDdXN0b21JcENsaWVudDsKKyAgICBGVGltZW91dCA6IEludGVnZXI7CisgICAgZnVuY3Rpb24gU2VsZWN0KCBSZWFkUmVhZHksIFdyaXRlUmVhZHksIEV4Y2VwdEZsYWc6IFBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgVGltZU91dDogSW50ZWdlcjsgdmFyIHdzYUVycm9yIDogSW50ZWdlcik6IEludGVnZXI7CisgICAgZnVuY3Rpb24gV2FpdEZvckRhdGEoIFRpbWVPdXQgOiBJbnRlZ2VyOyBwQnVmIDogUG9pbnRlcjsgRGVzaXJlZEJ5dGVzOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3NhRXJyb3IsIGJ5dGVzUmVhZHkgOiBJbnRlZ2VyKTogVFdhaXRGb3JEYXRhOworeyRFTFNFfQorICAgIEZUY3BDbGllbnQ6IFRTb2NrZXQ7CisgIHByb3RlY3RlZCBjb25zdAorICAgIFNMRUVQX1RJTUUgPSAyMDA7Cit7JEVORElGfQorICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOworICBwdWJsaWMKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlciA9IDApOworeyRFTFNFfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVFNvY2tldDsgY29uc3QgYVRpbWVvdXQgOiBMb25nd29yZCA9IDApOworeyRFTkRJRn0KKyAgZW5kOworCisgIElTdHJlYW1UcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQorICAgIFsne0E4NDc5QjQ3LTJBM0UtNDQyMS1BOUEwLUQ1QTlFRENDNjM0QX0nXQorICAgIGZ1bmN0aW9uIEdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIGZ1bmN0aW9uIEdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKKyAgICBwcm9wZXJ0eSBJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRJbnB1dFN0cmVhbTsKKyAgICBwcm9wZXJ0eSBPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0T3V0cHV0U3RyZWFtOworICBlbmQ7CisKKyAgVFN0cmVhbVRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwsIElTdHJlYW1UcmFuc3BvcnQpCisgIHByb3RlY3RlZAorICAgIEZJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgICAgRk91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBHZXRJbnB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKKyAgICBmdW5jdGlvbiBHZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CisgIHB1YmxpYworICAgIHByb3BlcnR5IElucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldElucHV0U3RyZWFtOworICAgIHByb3BlcnR5IE91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRPdXRwdXRTdHJlYW07CisKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVEJ1ZmZlcmVkU3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCkKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZCdWZTaXplIDogSW50ZWdlcjsKKyAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CisgICAgRldyaXRlQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTdHJlYW06IElUaHJpZnRTdHJlYW07IEFCdWZTaXplOiBJbnRlZ2VyKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFNlcnZlclNvY2tldEltcGwgPSBjbGFzcyggVFNlcnZlclRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgRlNlcnZlciA6IFRUY3BTZXJ2ZXI7CisgICAgRlBvcnQgOiBJbnRlZ2VyOworICAgIEZDbGllbnRUaW1lb3V0IDogSW50ZWdlcjsKK3skRUxTRX0KKyAgICBGU2VydmVyOiBUU2VydmVyU29ja2V0OworeyRFTkRJRn0KKyAgICBGVXNlQnVmZmVyZWRTb2NrZXQgOiBCb29sZWFuOworICAgIEZPd25zU2VydmVyIDogQm9vbGVhbjsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpIDogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgIHB1YmxpYworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRUY3BTZXJ2ZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyID0gMDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbiA9IEZBTFNFKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU2VydmVyOiBUU2VydmVyU29ja2V0OyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IExvbmd3b3JkID0gMDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbiA9IEZBTFNFKTsgb3ZlcmxvYWQ7Cit7JEVORElGfQorICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIExpc3Rlbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwgKQorICBwcml2YXRlCisgICAgRklucHV0QnVmZmVyIDogSVRocmlmdFN0cmVhbTsKKyAgICBGT3V0cHV0QnVmZmVyIDogSVRocmlmdFN0cmVhbTsKKyAgICBGVHJhbnNwb3J0IDogSVN0cmVhbVRyYW5zcG9ydDsKKyAgICBGQnVmU2l6ZSA6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgSW5pdEJ1ZmZlcnM7CisgICAgZnVuY3Rpb24gR2V0VW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQgKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0IDogSVN0cmVhbVRyYW5zcG9ydDsgQUJ1ZlNpemU6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9wZXJ0eSBVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0IHJlYWQgR2V0VW5kZXJseWluZ1RyYW5zcG9ydDsKKyAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CisgIGVuZDsKKworICBUU29ja2V0SW1wbCA9IGNsYXNzKFRTdHJlYW1UcmFuc3BvcnRJbXBsKQorICBwcml2YXRlCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIEZDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7Cit7JEVMU0V9CisgICAgRkNsaWVudDogVFNvY2tldDsKK3skRU5ESUZ9CisgICAgRk93bnNDbGllbnQgOiBCb29sZWFuOworICAgIEZIb3N0IDogc3RyaW5nOworICAgIEZQb3J0IDogSW50ZWdlcjsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgRlRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZUaW1lb3V0IDogTG9uZ3dvcmQ7Cit7JEVORElGfQorCisgICAgcHJvY2VkdXJlIEluaXRTb2NrZXQ7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OyBhT3duc0NsaWVudCA6IEJvb2xlYW47IEFUaW1lb3V0OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFUaW1lb3V0OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOworeyRFTFNFfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKK3skRU5ESUZ9CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudCByZWFkIEZDbGllbnQ7Cit7JEVMU0V9CisgICAgcHJvcGVydHkgVGNwQ2xpZW50OiBUU29ja2V0IHJlYWQgRkNsaWVudDsKK3skRU5ESUZ9CisgICAgcHJvcGVydHkgSG9zdCA6IHN0cmluZyByZWFkIEZIb3N0OworICAgIHByb3BlcnR5IFBvcnQ6IEludGVnZXIgcmVhZCBGUG9ydDsKKyAgZW5kOworCisgIFRGcmFtZWRUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRUcmFuc3BvcnRJbXBsKQorICBwcml2YXRlIGNvbnN0CisgICAgRkhlYWRlclNpemUgOiBJbnRlZ2VyID0gNDsKKyAgcHJpdmF0ZSBjbGFzcyB2YXIKKyAgICBGSGVhZGVyX0R1bW15IDogYXJyYXkgb2YgQnl0ZTsKKyAgcHJvdGVjdGVkCisgICAgRlRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgICAgRldyaXRlQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CisKKyAgICBwcm9jZWR1cmUgSW5pdFdyaXRlQnVmZmVyOworICAgIHByb2NlZHVyZSBSZWFkRnJhbWU7CisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRUcmFuc3BvcnRGYWN0b3J5SW1wbCApCisgICAgICBwdWJsaWMKKyAgICAgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKyAgICAgIGVuZDsKKworICAgIHskSUZERUYgSEFWRV9DTEFTU19DVE9SfQorICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICB7JEVORElGfQorCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworCisgICAgcHJvY2VkdXJlIENsb3NlKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICBlbmQ7CisKK3skSUZOREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOworeyRFTkRJRn0KKworY29uc3QKKyAgREVGQVVMVF9USFJJRlRfVElNRU9VVCA9IDUgKiAxMDAwOyAvLyBtcworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVFRyYW5zcG9ydEltcGwgfQorCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlBlZWs6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gSXNPcGVuOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWQoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIHJlc3VsdCA6PSBSZWFkQWxsKCBAYnVmWzBdLCBMZW5ndGgoYnVmKSwgb2ZmLCBsZW4pCisgIGVsc2UgcmVzdWx0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZbMF0sIDAsIExlbmd0aChidWYpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZbMF0sIG9mZiwgbGVuKTsKK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZEFsbChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHJldCA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gMDsKKyAgd2hpbGUgcmVzdWx0IDwgbGVuIGRvIGJlZ2luCisgICAgcmV0IDo9IFJlYWQoIHBCdWYsIGJ1Zmxlbiwgb2ZmICsgcmVzdWx0LCBsZW4gLSByZXN1bHQpOworICAgIGlmIHJldCA+IDAKKyAgICB0aGVuIEluYyggcmVzdWx0LCByZXQpCisgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoICdDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCcgKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBsZW4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFNlbGYuV3JpdGUoIHBCdWYsIDAsIGxlbik7CitlbmQ7CisKK3sgVEhUVFBDbGllbnRJbXBsIH0KKworY29uc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkNyZWF0ZShjb25zdCBBVXJpOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlVyaSA6PSBBVXJpOworCisgIC8vIGRlZmF1bHRzIGFjY29yZGluZyB0byBNU0ROCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSAwOyAvLyBubyB0aW1lb3V0CisgIEZDb25uZWN0aW9uVGltZW91dCA6PSA2MCAqIDEwMDA7CisgIEZTZW5kVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisgIEZSZWFkVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisKKyAgRkN1c3RvbUhlYWRlcnMgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZyxzdHJpbmc+LkNyZWF0ZTsKKyAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkNyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsKK3ZhcgorICBwYWlyIDogVFBhaXI8c3RyaW5nLHN0cmluZz47CisgIHNydkh0dHAgOiBJU2VydmVyWE1MSFRUUFJlcXVlc3Q7CitiZWdpbgorICB7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICBSZXN1bHQgOj0gQ29TZXJ2ZXJYTUxIVFRQLkNyZWF0ZTsKKyAgeyRFTFNFfQorICBSZXN1bHQgOj0gQ29YTUxIVFRQUmVxdWVzdC5DcmVhdGU7CisgIHskSUZFTkR9CisKKyAgLy8gc2V0dGluZyBhIHRpbWVvdXQgdmFsdWUgdG8gMCAoemVybykgbWVhbnMgIm5vIHRpbWVvdXQiIGZvciB0aGF0IHNldHRpbmcKKyAgaWYgU3VwcG9ydHMoIHJlc3VsdCwgSVNlcnZlclhNTEhUVFBSZXF1ZXN0LCBzcnZIdHRwKQorICB0aGVuIHNydkh0dHAuc2V0VGltZW91dHMoIERuc1Jlc29sdmVUaW1lb3V0LCBDb25uZWN0aW9uVGltZW91dCwgU2VuZFRpbWVvdXQsIFJlYWRUaW1lb3V0KTsKKworICBSZXN1bHQub3BlbignUE9TVCcsIEZVcmksIEZhbHNlLCAnJywgJycpOworICBSZXN1bHQuc2V0UmVxdWVzdEhlYWRlciggJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOworICBSZXN1bHQuc2V0UmVxdWVzdEhlYWRlciggJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOworICBSZXN1bHQuc2V0UmVxdWVzdEhlYWRlciggJ1VzZXItQWdlbnQnLCAnRGVscGhpL0lIVFRQQ2xpZW50Jyk7CisKKyAgZm9yIHBhaXIgaW4gRkN1c3RvbUhlYWRlcnMgZG8gYmVnaW4KKyAgICBSZXN1bHQuc2V0UmVxdWVzdEhlYWRlciggcGFpci5LZXksIHBhaXIuVmFsdWUgKTsKKyAgZW5kOworZW5kOworCitkZXN0cnVjdG9yIFRIVFRQQ2xpZW50SW1wbC5EZXN0cm95OworYmVnaW4KKyAgQ2xvc2U7CisgIGluaGVyaXRlZDsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEbnNSZXNvbHZlVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGRG5zUmVzb2x2ZVRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ29ubmVjdGlvblRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkNvbm5lY3Rpb25UaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0U2VuZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlNlbmRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFNlbmRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZTZW5kVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZSZWFkVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGUmVhZFRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ3VzdG9tSGVhZGVyczsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUcnVlOworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLk9wZW47CitiZWdpbgorICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuRmx1c2g7CitiZWdpbgorICB0cnkKKyAgICBTZW5kUmVxdWVzdDsKKyAgZmluYWxseQorICAgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworICAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CisgICAgQVNTRVJUKCBGT3V0cHV0U3RyZWFtIDw+IG5pbCk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBGSW5wdXRTdHJlYW0gPSBuaWwgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Jyk7CisgIGVuZDsKKworICB0cnkKKyAgICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsIGJ1Zmxlbiwgb2ZmLCBsZW4pCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2VuZFJlcXVlc3Q7Cit2YXIKKyAgeG1saHR0cCA6IElYTUxIVFRQUmVxdWVzdDsKKyAgbXMgOiBUTWVtb3J5U3RyZWFtOworICBhIDogVEJ5dGVzOworICBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgeG1saHR0cCA6PSBDcmVhdGVSZXF1ZXN0OworCisgIG1zIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICB0cnkKKyAgICBhIDo9IEZPdXRwdXRTdHJlYW0uVG9BcnJheTsKKyAgICBsZW4gOj0gTGVuZ3RoKGEpOworICAgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgICAgbXMuV3JpdGVCdWZmZXIoIFBvaW50ZXIoQGFbMF0pXiwgbGVuKTsKKyAgICBlbmQ7CisgICAgbXMuUG9zaXRpb24gOj0gMDsKKyAgICB4bWxodHRwLnNlbmQoIElVbmtub3duKCBUU3RyZWFtQWRhcHRlci5DcmVhdGUoIG1zLCBzb1JlZmVyZW5jZSApKSk7CisgICAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgICBGSW5wdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uQ3JlYXRlKCBJVW5rbm93biggeG1saHR0cC5yZXNwb25zZVN0cmVhbSkgYXMgSVN0cmVhbSk7CisgIGZpbmFsbHkKKyAgICBtcy5GcmVlOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4pOworZW5kOworCit7IFRUcmFuc3BvcnRFeGNlcHRpb24gfQorCitmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworYmVnaW4KKyAgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3BlbiB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Ob3RPcGVuCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4KKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5UaW1lZE91dAorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkVuZE9mRmlsZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGUKKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkJhZEFyZ3MKKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZAorICBlbHNlIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duOworZW5kOworCitjb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUoQVR5cGUsICcnKQoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgY29uc3QgbXNnOiBzdHJpbmcpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOworYmVnaW4KKyAgY2FzZSBBVHlwZSBvZgorICAgIFRFeGNlcHRpb25UeXBlLk5vdE9wZW46ICAgICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW46IFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4uQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQ6ICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlOiAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uRW5kT2ZGaWxlLkNyZWF0ZShtc2cpOworICAgIFRFeGNlcHRpb25UeXBlLkJhZEFyZ3M6ICAgICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQ6IFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKG1zZyk7CisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKG1zZyk7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgbXNnOiBzdHJpbmcpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOworZW5kOworCit7IFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCB9CisKK2NvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOworZW5kOworCit7IFRUcmFuc3BvcnRGYWN0b3J5SW1wbCB9CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5HZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gQVRyYW5zOworZW5kOworCit7IFRTZXJ2ZXJTb2NrZXQgfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCBjb25zdCBBU2VydmVyOiBUVGNwU2VydmVyOyBBQ2xpZW50VGltZW91dDogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZDbGllbnRUaW1lb3V0IDo9IEFDbGllbnRUaW1lb3V0OworZW5kOworeyRFTFNFfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCBjb25zdCBBU2VydmVyOiBUU2VydmVyU29ja2V0OyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZlciA6PSBBU2VydmVyOworICBGU2VydmVyLlJlY3ZUaW1lb3V0IDo9IEFDbGllbnRUaW1lb3V0OworICBGU2VydmVyLlNlbmRUaW1lb3V0IDo9IEFDbGllbnRUaW1lb3V0OworZW5kOworeyRFTkRJRn0KKworeyRJRkRFRiBPTERfU09DS0VUU30KK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZShBUG9ydCwgQUNsaWVudFRpbWVvdXQ6IEludGVnZXI7IEFVc2VCdWZmZXJlZFNvY2tldHM6IEJvb2xlYW4pOworeyRFTFNFfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQ7IEFVc2VCdWZmZXJlZFNvY2tldHM6IEJvb2xlYW4pOworeyRFTkRJRn0KK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorICBGUG9ydCA6PSBBUG9ydDsKKyAgRkNsaWVudFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIgOj0gVFRjcFNlcnZlci5DcmVhdGUoIG5pbCApOworICBGU2VydmVyLkJsb2NrTW9kZSA6PSBibUJsb2NraW5nOworICB7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICBGU2VydmVyLkxvY2FsUG9ydCA6PSBBbnNpU3RyaW5nKCBJbnRUb1N0ciggRlBvcnQpKTsKKyAgeyRFTFNFfQorICBGU2VydmVyLkxvY2FsUG9ydCA6PSBJbnRUb1N0ciggRlBvcnQpOworICB7JElGRU5EfQoreyRFTFNFfQorICBGU2VydmVyIDo9IFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dCwgQUNsaWVudFRpbWVvdXQpOworeyRFTkRJRn0KKyAgRlVzZUJ1ZmZlcmVkU29ja2V0IDo9IEFVc2VCdWZmZXJlZFNvY2tldHM7CisgIEZPd25zU2VydmVyIDo9IFRydWU7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuRGVzdHJveTsKK2JlZ2luCisgIGlmIEZPd25zU2VydmVyIHRoZW4gYmVnaW4KKyAgICBGU2VydmVyLkZyZWU7CisgICAgRlNlcnZlciA6PSBuaWw7CisgIGVuZDsKKyAgaW5oZXJpdGVkOworZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0SW1wbC5BY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7Cit2YXIKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIGNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgY2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KKyAgdHJhbnMgIDogSVN0cmVhbVRyYW5zcG9ydDsKK2JlZ2luCisgIGlmIEZTZXJ2ZXIgPSBuaWwgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LicpOworICBlbmQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIGNsaWVudCA6PSBuaWw7CisgIHRyeQorICAgIGNsaWVudCA6PSBUQ3VzdG9tSXBDbGllbnQuQ3JlYXRlKG5pbCk7CisKKyAgICBpZiBBc3NpZ25lZChmbkFjY2VwdGluZykKKyAgICB0aGVuIGZuQWNjZXB0aW5nKCk7CisKKyAgICBpZiBub3QgRlNlcnZlci5BY2NlcHQoIGNsaWVudCkgdGhlbiBiZWdpbgorICAgICAgY2xpZW50LkZyZWU7CisgICAgICBSZXN1bHQgOj0gbmlsOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgUmVzdWx0IDo9IG5pbDsKKyAgICAgIEV4aXQ7CisgICAgZW5kOworCisgICAgdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBjbGllbnQsIFRSVUUsIEZDbGllbnRUaW1lb3V0KTsKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gdHJhbnMgb3ducyBpdCBub3cKKworICAgIGlmIEZVc2VCdWZmZXJlZFNvY2tldAorICAgIHRoZW4gcmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCB0cmFucykKKyAgICBlbHNlIHJlc3VsdCA6PSB0cmFuczsKKworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIGNsaWVudC5GcmVlOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuVG9TdHJpbmcpOworICAgIGVuZDsKKyAgZW5kOworeyRFTFNFfQorICBpZiBBc3NpZ25lZChmbkFjY2VwdGluZykgdGhlbgorICAgIGZuQWNjZXB0aW5nKCk7CisKKyAgY2xpZW50IDo9IEZTZXJ2ZXIuQWNjZXB0OworICB0cnkKKyAgICB0cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoY2xpZW50LCBUcnVlKTsKKyAgICBjbGllbnQgOj0gbmlsOworCisgICAgaWYgRlVzZUJ1ZmZlcmVkU29ja2V0IHRoZW4KKyAgICAgIFJlc3VsdCA6PSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSh0cmFucykKKyAgICBlbHNlCisgICAgICBSZXN1bHQgOj0gdHJhbnM7CisgIGV4Y2VwdAorICAgIGNsaWVudC5GcmVlOworICAgIHJhaXNlOworICBlbmQ7Cit7JEVORElGfQorZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldEltcGwuTGlzdGVuOworYmVnaW4KKyAgaWYgRlNlcnZlciA8PiBuaWwgdGhlbgorICBiZWdpbgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICB0cnkKKyAgICAgIEZTZXJ2ZXIuQWN0aXZlIDo9IFRydWU7CisgICAgZXhjZXB0CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAnICsgRS5NZXNzYWdlKTsKKyAgICBlbmQ7Cit7JEVMU0V9CisgICAgRlNlcnZlci5MaXN0ZW47Cit7JEVORElGfQorICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGlmIEZTZXJ2ZXIgPD4gbmlsIHRoZW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgdHJ5CisgICAgICBGU2VydmVyLkFjdGl2ZSA6PSBGYWxzZTsKKyAgICBleGNlcHQKKyAgICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdFcnJvciBvbiBjbG9zaW5nIHNvY2tldCA6ICcgKyBFLk1lc3NhZ2UpOworICAgIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkNsb3NlOworeyRFTkRJRn0KK2VuZDsKKworeyBUU29ja2V0IH0KKworeyRJRkRFRiBPTERfU09DS0VUU30KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQUNsaWVudCA6IFRDdXN0b21JcENsaWVudDsgYU93bnNDbGllbnQgOiBCb29sZWFuOyBBVGltZW91dDogSW50ZWdlciA9IDApOwordmFyIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBGQ2xpZW50IDo9IEFDbGllbnQ7CisgIEZUaW1lb3V0IDo9IEFUaW1lb3V0OworICBGT3duc0NsaWVudCA6PSBhT3duc0NsaWVudDsKKyAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBzdHJlYW0sIHN0cmVhbSk7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUNsaWVudDogVFNvY2tldDsgYU93bnNDbGllbnQ6IEJvb2xlYW4pOwordmFyIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBGQ2xpZW50IDo9IEFDbGllbnQ7CisgIEZUaW1lb3V0IDo9IEFDbGllbnQuUmVjdlRpbWVvdXQ7CisgIEZPd25zQ2xpZW50IDo9IGFPd25zQ2xpZW50OworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKEZDbGllbnQsIEZUaW1lb3V0KTsKKyAgaW5oZXJpdGVkIENyZWF0ZShzdHJlYW0sIHN0cmVhbSk7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNvY2tldEltcGwuQ3JlYXRlKGNvbnN0IEFIb3N0OiBzdHJpbmc7IEFQb3J0LCBBVGltZW91dDogSW50ZWdlcik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFUaW1lb3V0OiBMb25nd29yZCk7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShuaWwsbmlsKTsKKyAgRkhvc3QgOj0gQUhvc3Q7CisgIEZQb3J0IDo9IEFQb3J0OworICBGVGltZW91dCA6PSBBVGltZW91dDsKKyAgSW5pdFNvY2tldDsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU29ja2V0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgaWYgRk93bnNDbGllbnQKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KTsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldEltcGwuQ2xvc2U7CitiZWdpbgorICBpbmhlcml0ZWQgQ2xvc2U7CisKKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisKKyAgaWYgRk93bnNDbGllbnQKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KQorICBlbHNlIEZDbGllbnQgOj0gbmlsOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgUmVzdWx0IDo9IChGQ2xpZW50IDw+IG5pbCkgYW5kIEZDbGllbnQuQ29ubmVjdGVkOworeyRFTFNFfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Jc09wZW4KK3skRU5ESUZ9CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0SW1wbC5Jbml0U29ja2V0OwordmFyCisgIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCisgIGVsc2UgRkNsaWVudCA6PSBuaWw7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZDbGllbnQgOj0gVFRjcENsaWVudC5DcmVhdGUoIG5pbCk7Cit7JEVMU0V9CisgIEZDbGllbnQgOj0gVFNvY2tldC5DcmVhdGUoRkhvc3QsIEZQb3J0KTsKK3skRU5ESUZ9CisgIEZPd25zQ2xpZW50IDo9IFRydWU7CisKKyAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCwgRlRpbWVvdXQpOworICBGSW5wdXRTdHJlYW0gOj0gc3RyZWFtOworICBGT3V0cHV0U3RyZWFtIDo9IHN0cmVhbTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXRJbXBsLk9wZW47CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUoJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICBlbmQ7CisKKyAgaWYgRkhvc3QgPSAnJyB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgb3BlbiBudWxsIGhvc3QnKTsKKyAgZW5kOworCisgIGlmIFBvcnQgPD0gMCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnKTsKKyAgZW5kOworCisgIGlmIEZDbGllbnQgPSBuaWwKKyAgdGhlbiBJbml0U29ja2V0OworCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBGQ2xpZW50LlJlbW90ZUhvc3QgOj0gVFNvY2tldEhvc3QoIEhvc3QpOworICBGQ2xpZW50LlJlbW90ZVBvcnQgOj0gVFNvY2tldFBvcnQoIEludFRvU3RyKCBQb3J0KSk7CisgIEZDbGllbnQuQ29ubmVjdDsKK3skRUxTRX0KKyAgRkNsaWVudC5PcGVuOworeyRFTkRJRn0KKworICBGSW5wdXRTdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIEZPdXRwdXRTdHJlYW0gOj0gRklucHV0U3RyZWFtOworZW5kOworCit7IFRCdWZmZXJlZFN0cmVhbSB9CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNsb3NlOworYmVnaW4KKyAgRmx1c2g7CisgIEZTdHJlYW0gOj0gbmlsOworCisgIEZSZWFkQnVmZmVyLkZyZWU7CisgIEZSZWFkQnVmZmVyIDo9IG5pbDsKKworICBGV3JpdGVCdWZmZXIuRnJlZTsKKyAgRldyaXRlQnVmZmVyIDo9IG5pbDsKK2VuZDsKKworY29uc3RydWN0b3IgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFTdHJlYW06IElUaHJpZnRTdHJlYW07IEFCdWZTaXplOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJlYW0gOj0gQVN0cmVhbTsKKyAgRkJ1ZlNpemUgOj0gQUJ1ZlNpemU7CisgIEZSZWFkQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBGV3JpdGVCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5EZXN0cm95OworYmVnaW4KKyAgQ2xvc2U7CisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuRmx1c2g7Cit2YXIKKyAgYnVmIDogVEJ5dGVzOworICBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBsZW4gOj0gRldyaXRlQnVmZmVyLlNpemU7CisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgICBTZXRMZW5ndGgoIGJ1ZiwgbGVuICk7CisgICAgICBGV3JpdGVCdWZmZXIuUG9zaXRpb24gOj0gMDsKKyAgICAgIEZXcml0ZUJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbMF0pXiwgbGVuICk7CisgICAgICBGU3RyZWFtLldyaXRlKCBidWYsIDAsIGxlbiApOworICAgIGVuZDsKKyAgICBGV3JpdGVCdWZmZXIuQ2xlYXI7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Jc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gKEZXcml0ZUJ1ZmZlciA8PiBuaWwpCisgICAgICAgIGFuZCAoRlJlYWRCdWZmZXIgPD4gbmlsKQorICAgICAgICBhbmQgKEZTdHJlYW0gPD4gbmlsKQorICAgICAgICBhbmQgRlN0cmVhbS5Jc09wZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLk9wZW47CitiZWdpbgorICBGU3RyZWFtLk9wZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyCisgIG5SZWFkIDogSW50ZWdlcjsKKyAgdGVtcGJ1ZiA6IFRCeXRlczsKKyAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBSZXN1bHQgOj0gMDsKKworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgorCisgICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA+PSBGUmVhZEJ1ZmZlci5TaXplIHRoZW4gYmVnaW4KKyAgICAgICAgRlJlYWRCdWZmZXIuQ2xlYXI7CisgICAgICAgIFNldExlbmd0aCggdGVtcGJ1ZiwgRkJ1ZlNpemUpOworICAgICAgICBuUmVhZCA6PSBGU3RyZWFtLlJlYWQoIHRlbXBidWYsIDAsIEZCdWZTaXplICk7CisgICAgICAgIGlmIG5SZWFkID0gMCB0aGVuIEJyZWFrOyAvLyBhdm9pZCBpbmZpbml0ZSBsb29wCisKKyAgICAgICAgRlJlYWRCdWZmZXIuV3JpdGVCdWZmZXIoIFBvaW50ZXIoQHRlbXBidWZbMF0pXiwgblJlYWQgKTsKKyAgICAgICAgRlJlYWRCdWZmZXIuUG9zaXRpb24gOj0gMDsKKyAgICAgIGVuZDsKKworICAgICAgaWYgRlJlYWRCdWZmZXIuUG9zaXRpb24gPCBGUmVhZEJ1ZmZlci5TaXplIHRoZW4gYmVnaW4KKyAgICAgICAgblJlYWQgOj0gTWluKCBGUmVhZEJ1ZmZlci5TaXplIC0gRlJlYWRCdWZmZXIuUG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgcFRtcCAgOj0gcEJ1ZjsKKyAgICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgICBJbmMoIFJlc3VsdCwgRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIG5SZWFkKSk7CisgICAgICAgIERlYyggY291bnQsIG5SZWFkKTsKKyAgICAgICAgSW5jKCBvZmZzZXQsIG5SZWFkKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgbGVuIDo9IEZSZWFkQnVmZmVyLlNpemU7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuKTsKKworICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgIEZSZWFkQnVmZmVyLlJlYWQoIFBvaW50ZXIoQFJlc3VsdFswXSleLCBsZW4gKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRldyaXRlQnVmZmVyLldyaXRlKCBwVG1wXiwgY291bnQgKTsKKyAgICAgIGlmIEZXcml0ZUJ1ZmZlci5TaXplID4gRkJ1ZlNpemUgdGhlbiBiZWdpbgorICAgICAgICBGbHVzaDsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworeyBUU3RyZWFtVHJhbnNwb3J0SW1wbCB9CisKK2NvbnN0cnVjdG9yIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQUlucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsgY29uc3QgQU91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRklucHV0U3RyZWFtIDo9IEFJbnB1dFN0cmVhbTsKKyAgRk91dHB1dFN0cmVhbSA6PSBBT3V0cHV0U3RyZWFtOworZW5kOworCitkZXN0cnVjdG9yIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkZsdXNoOworYmVnaW4KKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBGT3V0cHV0U3RyZWFtLkZsdXNoOworZW5kOworCitmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRJbnB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW07CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUcnVlOworZW5kOworCitmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gRk91dHB1dFN0cmVhbTsKK2VuZDsKKworcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLk9wZW47CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBGSW5wdXRTdHJlYW0gPSBuaWwgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0c3RyZWFtJyApOworICBlbmQ7CisKKyAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBwQnVmLGJ1Zmxlbiwgb2ZmLCBsZW4gKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIEZPdXRwdXRTdHJlYW0gPSBuaWwgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtJyApOworICBlbmQ7CisKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4gKTsKK2VuZDsKKworeyBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsIH0KKworY29uc3RydWN0b3IgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElTdHJlYW1UcmFuc3BvcnQpOworYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggQVRyYW5zcG9ydCwgMTAyNCApOworZW5kOworCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydDsgIEFCdWZTaXplOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUcmFuc3BvcnQgOj0gQVRyYW5zcG9ydDsKKyAgRkJ1ZlNpemUgOj0gQUJ1ZlNpemU7CisgIEluaXRCdWZmZXJzOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUcmFuc3BvcnQuQ2xvc2U7CisgIEZJbnB1dEJ1ZmZlciA6PSBuaWw7CisgIEZPdXRwdXRCdWZmZXIgOj0gbmlsOyAgCitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkZsdXNoOworYmVnaW4KKyAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZPdXRwdXRCdWZmZXIuRmx1c2g7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zcG9ydC5Jc09wZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuR2V0VW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0OworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5Jbml0QnVmZmVyczsKK2JlZ2luCisgIGlmIEZUcmFuc3BvcnQuSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGSW5wdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuSW5wdXRTdHJlYW0sIEZCdWZTaXplICk7CisgIGVuZDsKKyAgaWYgRlRyYW5zcG9ydC5PdXRwdXRTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyIDo9IFRCdWZmZXJlZFN0cmVhbUltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5PcGVuOworYmVnaW4KKyAgRlRyYW5zcG9ydC5PcGVuOworICBJbml0QnVmZmVyczsgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBidWZmZXJzIHRvIG1hdGNoIEZUcmFuc3BvcnQgc3Vic3RyZWFtcyBhZ2FpbgorZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gMDsKKyAgaWYgRklucHV0QnVmZmVyIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgUmVzdWx0IDo9IEZJbnB1dEJ1ZmZlci5SZWFkKCBwQnVmLGJ1Zmxlbiwgb2ZmLCBsZW4gKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBpZiBGT3V0cHV0QnVmZmVyIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRk91dHB1dEJ1ZmZlci5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4gKTsKKyAgZW5kOworZW5kOworCit7IFRGcmFtZWRUcmFuc3BvcnRJbXBsIH0KKworeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CitjbGFzcyBjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7CitiZWdpbgorICBTZXRMZW5ndGgoIEZIZWFkZXJfRHVtbXksIEZIZWFkZXJTaXplKTsKKyAgRmlsbENoYXIoIEZIZWFkZXJfRHVtbXlbMF0sIExlbmd0aCggRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CitlbmQ7Cit7JEVMU0V9Citwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKK2JlZ2luCisgIFNldExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSwgVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teVswXSwKKyAgICBMZW5ndGgoIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkZIZWFkZXJfRHVtbXkpICogU2l6ZU9mKCBCeXRlICksIDApOworZW5kOworeyRFTkRJRn0KKworY29uc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgSW5pdFdyaXRlQnVmZmVyOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGVHJhbnNwb3J0LkNsb3NlOworZW5kOworCitjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBJbml0V3JpdGVCdWZmZXI7CisgIEZUcmFuc3BvcnQgOj0gQVRyYW5zOworZW5kOworCitkZXN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBGV3JpdGVCdWZmZXIuRnJlZTsKKyAgRlJlYWRCdWZmZXIuRnJlZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuRmx1c2g7Cit2YXIKKyAgYnVmIDogVEJ5dGVzOworICBsZW4gOiBJbnRlZ2VyOworICBkYXRhX2xlbiA6IEludGVnZXI7CisKK2JlZ2luCisgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKKyAgU2V0TGVuZ3RoKCBidWYsIGxlbik7CisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIFN5c3RlbS5Nb3ZlKCBGV3JpdGVCdWZmZXIuTWVtb3J5XiwgYnVmWzBdLCBsZW4gKTsKKyAgZW5kOworCisgIGRhdGFfbGVuIDo9IGxlbiAtIEZIZWFkZXJTaXplOworICBpZiAoZGF0YV9sZW4gPCAwKSB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdURnJhbWVkVHJhbnNwb3J0LkZsdXNoOiBkYXRhX2xlbiA8IDAnICk7CisgIGVuZDsKKworICBJbml0V3JpdGVCdWZmZXI7CisKKyAgYnVmWzBdIDo9IEJ5dGUoJEZGIGFuZCAoZGF0YV9sZW4gc2hyIDI0KSk7CisgIGJ1ZlsxXSA6PSBCeXRlKCRGRiBhbmQgKGRhdGFfbGVuIHNociAxNikpOworICBidWZbMl0gOj0gQnl0ZSgkRkYgYW5kIChkYXRhX2xlbiBzaHIgOCkpOworICBidWZbM10gOj0gQnl0ZSgkRkYgYW5kIGRhdGFfbGVuKTsKKworICBGVHJhbnNwb3J0LldyaXRlKCBidWYsIDAsIGxlbiApOworICBGVHJhbnNwb3J0LkZsdXNoOworZW5kOworCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zcG9ydC5Jc09wZW47CitlbmQ7CisKK3R5cGUKKyAgVEFjY2Vzc01lbW9yeVN0cmVhbSA9IGNsYXNzKFRNZW1vcnlTdHJlYW0pCisgIGVuZDsKKworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkluaXRXcml0ZUJ1ZmZlcjsKK2JlZ2luCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGV3JpdGVCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIFRBY2Nlc3NNZW1vcnlTdHJlYW0oRldyaXRlQnVmZmVyKS5DYXBhY2l0eSA6PSAxMDI0OworICBGV3JpdGVCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQEZIZWFkZXJfRHVtbXlbMF0pXiwgRkhlYWRlclNpemUpOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisgIEZUcmFuc3BvcnQuT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpZiBsZW4gPiAoYnVmbGVuLW9mZikKKyAgdGhlbiBsZW4gOj0gYnVmbGVuLW9mZjsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2ZmKTsKKworICBpZiAoRlJlYWRCdWZmZXIgPD4gbmlsKSBhbmQgKGxlbiA+IDApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQgOj0gRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIGxlbik7CisgICAgaWYgcmVzdWx0ID4gMCB0aGVuIGJlZ2luCisgICAgICBFeGl0OworICAgIGVuZDsKKyAgZW5kOworCisgIFJlYWRGcmFtZTsKKyAgaWYgbGVuID4gMAorICB0aGVuIFJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKQorICBlbHNlIFJlc3VsdCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuUmVhZEZyYW1lOwordmFyCisgIGkzMnJkIDogVEJ5dGVzOworICBzaXplIDogSW50ZWdlcjsKKyAgYnVmZiA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggaTMycmQsIEZIZWFkZXJTaXplICk7CisgIEZUcmFuc3BvcnQuUmVhZEFsbCggaTMycmQsIDAsIEZIZWFkZXJTaXplKTsKKyAgc2l6ZSA6PQorICAgICgoaTMycmRbMF0gYW5kICRGRikgc2hsIDI0KSBvcgorICAgICgoaTMycmRbMV0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgICgoaTMycmRbMl0gYW5kICRGRikgc2hsIDgpIG9yCisgICAgIChpMzJyZFszXSBhbmQgJEZGKTsKKyAgU2V0TGVuZ3RoKCBidWZmLCBzaXplICk7CisgIEZUcmFuc3BvcnQuUmVhZEFsbCggYnVmZiwgMCwgc2l6ZSApOworICBGUmVhZEJ1ZmZlci5GcmVlOworICBGUmVhZEJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgaWYgTGVuZ3RoKGJ1ZmYpID4gMAorICB0aGVuIEZSZWFkQnVmZmVyLldyaXRlKCBQb2ludGVyKEBidWZmWzBdKV4sIHNpemUgKTsKKyAgRlJlYWRCdWZmZXIuUG9zaXRpb24gOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK3ZhciBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBwVG1wIDo9IHBCdWY7CisgICAgSW5jKCBwVG1wLCBvZmYpOworCisgICAgRldyaXRlQnVmZmVyLldyaXRlKCBwVG1wXiwgbGVuICk7CisgIGVuZDsKK2VuZDsKKworeyBURnJhbWVkVHJhbnNwb3J0LlRGYWN0b3J5IH0KKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydEltcGwuVEZhY3RvcnkuR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OworYmVnaW4KKyAgUmVzdWx0IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggQVRyYW5zICk7CitlbmQ7CisKK3sgVFRjcFNvY2tldFN0cmVhbUltcGwgfQorCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuQ2xvc2U7CitiZWdpbgorICBGVGNwQ2xpZW50LkNsb3NlOworZW5kOworCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVGNwQ2xpZW50IDo9IEFUY3BDbGllbnQ7CisgIEZUaW1lb3V0IDo9IGFUaW1lb3V0OworZW5kOworeyRFTFNFfQorY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgaWYgYVRpbWVvdXQgPSAwIHRoZW4KKyAgICBGVGNwQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFNMRUVQX1RJTUUKKyAgZWxzZQorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gYVRpbWVvdXQ7CisgIEZUY3BDbGllbnQuU2VuZFRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuRmx1c2g7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBSZXN1bHQgOj0gRlRjcENsaWVudC5BY3RpdmU7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LklzT3BlbjsKK3skRU5ESUZ9CitlbmQ7CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5PcGVuOworYmVnaW4KKyAgRlRjcENsaWVudC5PcGVuOworZW5kOworCisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5TZWxlY3QoIFJlYWRSZWFkeSwgV3JpdGVSZWFkeSwgRXhjZXB0RmxhZzogUEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVPdXQ6IEludGVnZXI7IHZhciB3c2FFcnJvciA6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyCisgIFJlYWRGZHM6IFRGRHNldDsKKyAgUmVhZEZkc3B0cjogUEZEc2V0OworICBXcml0ZUZkczogVEZEc2V0OworICBXcml0ZUZkc3B0cjogUEZEc2V0OworICBFeGNlcHRGZHM6IFRGRHNldDsKKyAgRXhjZXB0RmRzcHRyOiBQRkRzZXQ7CisgIHR2OiB0aW1ldmFsOworICBUaW1lcHRyOiBQVGltZXZhbDsKKyAgc29ja2V0IDogVFNvY2tldDsKK2JlZ2luCisgIGlmIG5vdCBGVGNwQ2xpZW50LkFjdGl2ZSB0aGVuIGJlZ2luCisgICAgd3NhRXJyb3IgOj0gV1NBRUlOVkFMOworICAgIEV4aXQoIFNPQ0tFVF9FUlJPUik7CisgIGVuZDsKKworICBzb2NrZXQgOj0gRlRjcENsaWVudC5IYW5kbGU7CisKKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuIGJlZ2luCisgICAgUmVhZEZkc3B0ciA6PSBAUmVhZEZkczsKKyAgICBGRF9aRVJPKFJlYWRGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIFJlYWRGZHMpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIFJlYWRGZHNwdHIgOj0gbmlsOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbiBiZWdpbgorICAgIFdyaXRlRmRzcHRyIDo9IEBXcml0ZUZkczsKKyAgICBGRF9aRVJPKFdyaXRlRmRzKTsKKyAgICBGRF9TRVQoc29ja2V0LCBXcml0ZUZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgV3JpdGVGZHNwdHIgOj0gbmlsOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbiBiZWdpbgorICAgIEV4Y2VwdEZkc3B0ciA6PSBARXhjZXB0RmRzOworICAgIEZEX1pFUk8oRXhjZXB0RmRzKTsKKyAgICBGRF9TRVQoc29ja2V0LCBFeGNlcHRGZHMpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEV4Y2VwdEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBUaW1lT3V0ID49IDAgdGhlbiBiZWdpbgorICAgIHR2LnR2X3NlYyA6PSBUaW1lT3V0IGRpdiAxMDAwOworICAgIHR2LnR2X3VzZWMgOj0gIDEwMDAgKiAoVGltZU91dCBtb2QgMTAwMCk7CisgICAgVGltZXB0ciA6PSBAdHY7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgVGltZXB0ciA6PSBuaWw7ICAvLyB3YWl0IGZvcmV2ZXIKKyAgZW5kOworCisgIHdzYUVycm9yIDo9IDA7CisgIHRyeQorICAgIHskSUZERUYgTVNXSU5ET1dTfQorICAgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICAgIHJlc3VsdCA6PSBXaW5Tb2NrLnNlbGVjdCggICAgICAgIHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOworICAgICAgeyRFTFNFfQorICAgICAgcmVzdWx0IDo9IFdpbmFwaS5XaW5Tb2NrLnNlbGVjdCggc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgICB7JEVORElGfQorICAgIHskRU5ESUZ9CisgICAgeyRJRkRFRiBMSU5VWH0KKyAgICAgIHJlc3VsdCA6PSBMaWJjLnNlbGVjdCggICAgICAgICAgIHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOworICAgIHskRU5ESUZ9CisJCisgICAgaWYgcmVzdWx0ID0gU09DS0VUX0VSUk9SCisgICAgdGhlbiB3c2FFcnJvciA6PSBXU0FHZXRMYXN0RXJyb3I7CisKKyAgZXhjZXB0CisgICAgcmVzdWx0IDo9IFNPQ0tFVF9FUlJPUjsKKyAgZW5kOworCisgIGlmIEFzc2lnbmVkKFJlYWRSZWFkeSkgdGhlbgorICAgUmVhZFJlYWR5XiA6PSBGRF9JU1NFVChzb2NrZXQsIFJlYWRGZHMpOworICAgCisgIGlmIEFzc2lnbmVkKFdyaXRlUmVhZHkpIHRoZW4KKyAgICBXcml0ZVJlYWR5XiA6PSBGRF9JU1NFVChzb2NrZXQsIFdyaXRlRmRzKTsKKyAgCisgIGlmIEFzc2lnbmVkKEV4Y2VwdEZsYWcpIHRoZW4KKyAgICBFeGNlcHRGbGFnXiA6PSBGRF9JU1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuV2FpdEZvckRhdGEoIFRpbWVPdXQgOiBJbnRlZ2VyOyBwQnVmIDogUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNpcmVkQnl0ZXMgOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3c2FFcnJvciwgYnl0ZXNSZWFkeSA6IEludGVnZXIpOiBUV2FpdEZvckRhdGE7Cit2YXIgYkNhblJlYWQsIGJFcnJvciA6IEJvb2xlYW47CisgICAgcmV0dmFsIDogSW50ZWdlcjsKK2NvbnN0IAorICBNU0dfUEVFSyA9IHskSUZERUYgT0xEX1VOSVRfTkFNRVN9IFdpblNvY2suTVNHX1BFRUsgIHskRUxTRX0gV2luYXBpLldpblNvY2suTVNHX1BFRUsgIHskRU5ESUZ9OworYmVnaW4KKyAgYnl0ZXNSZWFkeSA6PSAwOworCisgIC8vIFRoZSBzZWxlY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNvY2tldCBoYW5kbGVzIHRoYXQgYXJlIHJlYWR5CisgIC8vIGFuZCBjb250YWluZWQgaW4gdGhlIGZkX3NldCBzdHJ1Y3R1cmVzLCB6ZXJvIGlmIHRoZSB0aW1lIGxpbWl0IGV4cGlyZWQsCisgIC8vIG9yIFNPQ0tFVF9FUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBTT0NLRVRfRVJST1IsCisgIC8vIFdTQUdldExhc3RFcnJvciBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIGVycm9yIGNvZGUuCisgIHJldHZhbCA6PSBTZWxmLlNlbGVjdCggQGJDYW5SZWFkLCBuaWwsIEBiRXJyb3IsIFRpbWVPdXQsIHdzYUVycm9yKTsKKyAgaWYgcmV0dmFsID0gU09DS0VUX0VSUk9SCisgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9FcnJvcik7CisgIGlmIChyZXR2YWwgPSAwKSBvciBub3QgYkNhblJlYWQKKyAgdGhlbiBFeGl0KCBUV2FpdEZvckRhdGEud2ZkX1RpbWVvdXQpOworCisgIC8vIHJlY3YoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAvLyBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgMCB3aGVuIHRoZSBwZWVyIGhhcyBwZXJmb3JtZWQgYW4gb3JkZXJseSBzaHV0ZG93bi4KKyAgCisgIHJldHZhbCA6PSByZWN2KCBGVGNwQ2xpZW50LkhhbmRsZSwgcEJ1Zl4sIERlc2lyZWRCeXRlcywgTVNHX1BFRUspOworICBpZiByZXR2YWwgPD0gMAorICB0aGVuIEV4aXQoIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IpOworCisgIC8vIGF0IGxlYXN0IHdlIGhhdmUgc29tZSBkYXRhCisgIGJ5dGVzUmVhZHkgOj0gTWluKCByZXR2YWwsIERlc2lyZWRCeXRlcyk7CisgIHJlc3VsdCA6PSBUV2FpdEZvckRhdGEud2ZkX0hhdmVEYXRhOworZW5kOworeyRFTkRJRn0KKworeyRJRkRFRiBPTERfU09DS0VUU30KK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKKy8vIG9sZCBzb2NrZXRzIHZlcnNpb24KK3ZhciB3ZmQgOiBUV2FpdEZvckRhdGE7CisgICAgd3NhRXJyb3IsCisgICAgbXNlY3MgOiBJbnRlZ2VyOworICAgIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIEZUaW1lb3V0ID4gMAorICB0aGVuIG1zZWNzIDo9IEZUaW1lb3V0CisgIGVsc2UgbXNlY3MgOj0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKworICByZXN1bHQgOj0gMDsKKyAgcFRtcCAgIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCisKKyAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICB3ZmQgOj0gV2FpdEZvckRhdGEoIG1zZWNzLCBwVG1wLCBjb3VudCwgd3NhRXJyb3IsIG5CeXRlcyk7CisgICAgICBjYXNlIHdmZCBvZgorICAgICAgICBUV2FpdEZvckRhdGEud2ZkX0Vycm9yICAgIDogIEV4aXQ7CisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGEgOiAgQnJlYWs7CisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfVGltZW91dCAgOiAgYmVnaW4KKyAgICAgICAgICBpZiAoRlRpbWVvdXQgPSAwKQorICAgICAgICAgIHRoZW4gRXhpdAorICAgICAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOworCisgICAgICAgICAgZW5kOworICAgICAgICBlbmQ7CisgICAgICBlbHNlCisgICAgICAgIEFTU0VSVCggRkFMU0UpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIC8vIHJlZHVjZSB0aGUgdGltZW91dCBvbmNlIHdlIGdvdCBkYXRhCisgICAgaWYgRlRpbWVvdXQgPiAwCisgICAgdGhlbiBtc2VjcyA6PSBGVGltZW91dCBkaXYgMTAKKyAgICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgZGl2IDEwOworICAgIG1zZWNzIDo9IE1heCggbXNlY3MsIDIwMCk7CisKKyAgICBBU1NFUlQoIG5CeXRlcyA8PSBjb3VudCk7CisgICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggcFRtcF4sIG5CeXRlcyk7CisgICAgSW5jKCBwVG1wLCBuQnl0ZXMpOworICAgIERlYyggY291bnQsIG5CeXRlcyk7CisgICAgSW5jKCByZXN1bHQsIG5CeXRlcyk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgordmFyIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gMDsKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBsZW4gOj0gRlRjcENsaWVudC5CeXRlc1JlY2VpdmVkOworICBlbmQ7CisKKyAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbiApOworCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbik7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgYkNhbldyaXRlLCBiRXJyb3IgOiBCb29sZWFuOworICAgIHJldHZhbCwgd3NhRXJyb3IgOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBub3QgRlRjcENsaWVudC5BY3RpdmUKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ25vdCBvcGVuJyk7CisKKyAgLy8gVGhlIHNlbGVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygc29ja2V0IGhhbmRsZXMgdGhhdCBhcmUgcmVhZHkKKyAgLy8gYW5kIGNvbnRhaW5lZCBpbiB0aGUgZmRfc2V0IHN0cnVjdHVyZXMsIHplcm8gaWYgdGhlIHRpbWUgbGltaXQgZXhwaXJlZCwKKyAgLy8gb3IgU09DS0VUX0VSUk9SIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIFNPQ0tFVF9FUlJPUiwKKyAgLy8gV1NBR2V0TGFzdEVycm9yIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgZXJyb3IgY29kZS4KKyAgcmV0dmFsIDo9IFNlbGYuU2VsZWN0KCBuaWwsIEBiQ2FuV3JpdGUsIEBiRXJyb3IsIEZUaW1lT3V0LCB3c2FFcnJvcik7CisgIGlmIHJldHZhbCA9IFNPQ0tFVF9FUlJPUgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7CisKKyAgaWYgKHJldHZhbCA9IDApCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgndGltZWQgb3V0Jyk7CisKKyAgaWYgYkVycm9yIG9yIG5vdCBiQ2FuV3JpdGUKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ3Vua25vd24gZXJyb3InKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5TZW5kQnVmKCBwVG1wXiwgY291bnQpOworZW5kOworCit7JEVMU0V9CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBuQnl0ZXMgOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICByZXN1bHQgOj0gMDsKKyAgcFRtcCAgIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCisgICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVhZCggcFRtcF4sIGNvdW50KTsKKyAgICBpZiBuQnl0ZXMgPSAwIHRoZW4gRXhpdDsKKyAgICBJbmMoIHBUbXAsIG5CeXRlcyk7CisgICAgRGVjKCBjb3VudCwgbkJ5dGVzKTsKKyAgICBJbmMoIHJlc3VsdCwgbkJ5dGVzKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Ub0FycmF5OiBUQnl0ZXM7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworICB0cnkKKyAgICBpZiBGVGNwQ2xpZW50LlBlZWsgdGhlbgorICAgICAgcmVwZWF0CisgICAgICAgIFNldExlbmd0aChSZXN1bHQsIExlbmd0aChSZXN1bHQpICsgMTAyNCk7CisgICAgICAgIGxlbiA6PSBGVGNwQ2xpZW50LlJlYWQoUmVzdWx0W0xlbmd0aChSZXN1bHQpIC0gMTAyNF0sIDEwMjQpOworICAgICAgdW50aWwgbGVuIDwgMTAyNDsKKyAgZXhjZXB0CisgICAgb24gVFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBiZWdpbiB7IGRvbid0IGFsbG93IGRlZmF1bHQgZXhjZXB0aW9ucyB9IGVuZDsKKyAgICBlbHNlIHJhaXNlOworICBlbmQ7CisgIGlmIGxlbiA+IDAgdGhlbgorICAgIFNldExlbmd0aChSZXN1bHQsIExlbmd0aChSZXN1bHQpIC0gMTAyNCArIGxlbik7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBub3QgRlRjcENsaWVudC5Jc09wZW4KKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ25vdCBvcGVuJyk7CisKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIEZUY3BDbGllbnQuV3JpdGUoIHBUbXBeLCBjb3VudCk7CitlbmQ7CisKK3skRU5ESUZ9CisKKworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfQoraW5pdGlhbGl6YXRpb24KK2JlZ2luCisgIFRGcmFtZWRUcmFuc3BvcnRJbXBsX0luaXRpYWxpemU7CitlbmQ7Cit7JElGRU5EfQorCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UeXBlUmVnaXN0cnkucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4ZTk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UeXBlUmVnaXN0cnkucGFzCkBAIC0wLDAgKzEsOTUgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuVHlwZVJlZ2lzdHJ5OworCitpbnRlcmZhY2UKKwordXNlcworICBHZW5lcmljcy5Db2xsZWN0aW9ucywgVHlwSW5mbywKKyAgVGhyaWZ0LlByb3RvY29sOworCit0eXBlCisgIFRGYWN0b3J5TWV0aG9kPFQ+ID0gZnVuY3Rpb246VDsKKworICBUeXBlUmVnaXN0cnkgPSBjbGFzcworICBwcml2YXRlCisgICAgY2xhc3MgdmFyIEZUeXBlSW5mb1RvRmFjdG9yeUxvb2t1cCA6IFREaWN0aW9uYXJ5PFBvaW50ZXIsIFBvaW50ZXI+OworICBwdWJsaWMKKyAgICBjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OworICAgIGNsYXNzIHByb2NlZHVyZSBSZWdpc3RlclR5cGVGYWN0b3J5PEY+KGNvbnN0IGFGYWN0b3J5TWV0aG9kOiBURmFjdG9yeU1ldGhvZDxGPik7CisgICAgY2xhc3MgZnVuY3Rpb24gIENvbnN0cnVjdDxGPjogRjsKKyAgICBjbGFzcyBmdW5jdGlvbiAgQ29uc3RydWN0RnJvbVR5cGVJbmZvKGNvbnN0IGFUeXBlSW5mbzogUFR5cGVJbmZvKTogSUJhc2U7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworCit7IFR5cGVSZWdpc3RyYXRpb24gfQorCitjbGFzcyBjb25zdHJ1Y3RvciBUeXBlUmVnaXN0cnkuQ3JlYXRlOworYmVnaW4KKyAgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwIDo9IFREaWN0aW9uYXJ5PFBvaW50ZXIsIFBvaW50ZXI+LkNyZWF0ZTsKK2VuZDsKKworY2xhc3MgZGVzdHJ1Y3RvciBUeXBlUmVnaXN0cnkuRGVzdHJveTsKK2JlZ2luCisgIEZUeXBlSW5mb1RvRmFjdG9yeUxvb2t1cC5GcmVlOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVHlwZVJlZ2lzdHJ5LlJlZ2lzdGVyVHlwZUZhY3Rvcnk8Rj4oY29uc3QgYUZhY3RvcnlNZXRob2Q6IFRGYWN0b3J5TWV0aG9kPEY+KTsKK3ZhcgorICBUeXBlSW5mbyAgICAgOiBQb2ludGVyOworYmVnaW4KKyAgVHlwZUluZm8gOj0gU3lzdGVtLlR5cGVJbmZvKEYpOworCisgIGlmIChUeXBlSW5mbyA8PiBuaWwpIGFuZCAoUFR5cGVJbmZvKFR5cGVJbmZvKS5LaW5kID0gdGtJbnRlcmZhY2UpCisgIHRoZW4gRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLkFkZE9yU2V0VmFsdWUoVHlwZUluZm8sIEBhRmFjdG9yeU1ldGhvZCk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFR5cGVSZWdpc3RyeS5Db25zdHJ1Y3Q8Rj46IEY7Cit2YXIKKyAgVHlwZUluZm8gICAgIDogUFR5cGVJbmZvOworICBGYWN0b3J5ICAgICAgOiBQb2ludGVyOworYmVnaW4KKyAgUmVzdWx0IDo9IGRlZmF1bHQoRik7CisKKyAgVHlwZUluZm8gOj0gU3lzdGVtLlR5cGVJbmZvKEYpOworCisgIGlmIEFzc2lnbmVkKFR5cGVJbmZvKSBhbmQgKFR5cGVJbmZvLktpbmQgPSB0a0ludGVyZmFjZSkKKyAgdGhlbiBiZWdpbgorICAgIGlmIEZUeXBlSW5mb1RvRmFjdG9yeUxvb2t1cC5UcnlHZXRWYWx1ZShUeXBlSW5mbywgRmFjdG9yeSkKKyAgICB0aGVuIFJlc3VsdCA6PSBURmFjdG9yeU1ldGhvZDxGPihGYWN0b3J5KSgpOworICBlbmQ7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFR5cGVSZWdpc3RyeS5Db25zdHJ1Y3RGcm9tVHlwZUluZm8oY29uc3QgYVR5cGVJbmZvOiBQVHlwZUluZm8pOiBJQmFzZTsKK3ZhcgorICBGYWN0b3J5ICAgICAgOiBQb2ludGVyOworYmVnaW4KKyAgUmVzdWx0IDo9IG5pbDsKKyAgaWYgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLlRyeUdldFZhbHVlKGFUeXBlSW5mbywgRmFjdG9yeSkKKyAgdGhlbiBSZXN1bHQgOj0gSUJhc2UoVEZhY3RvcnlNZXRob2Q8SUJhc2U+KEZhY3RvcnkpKCkpOworZW5kOworCisKKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU3ODYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwpAQCAtMCwwICsxLDI1OSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5VdGlsczsKKworaW50ZXJmYWNlCisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKK3VzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIENoYXJhY3RlciwgU3luY09ianM7CisgIHskRUxTRX0KKyAgU3lzdGVtLkNsYXNzZXMsIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5DaGFyYWN0ZXIsIFN5c3RlbS5TeW5jT2JqczsKKyAgeyRFTkRJRn0KKwordHlwZQorICBJT3ZlcmxhcHBlZEhlbHBlciA9IGludGVyZmFjZQorICAgIFsne0ExODMyRUZBLTJFMDItNDg4NC04RjA5LUYwQTAyNzcxNTdGQX0nXQorICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBPdmVybGFwcGVkUHRyIDogUE92ZXJsYXBwZWQ7CisgICAgZnVuY3Rpb24gV2FpdEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV2FpdEZvcihkd1RpbWVvdXQ6IERXT1JEKSA6IERXT1JEOworICBlbmQ7CisKKyAgVE92ZXJsYXBwZWRIZWxwZXJJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJT3ZlcmxhcHBlZEhlbHBlcikKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZPdmVybGFwcGVkIDogVE92ZXJsYXBwZWQ7CisgICAgRkV2ZW50ICAgICAgOiBURXZlbnQ7CisKKyAgICAvLyBJT3ZlcmxhcHBlZEhlbHBlcgorICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBPdmVybGFwcGVkUHRyIDogUE92ZXJsYXBwZWQ7CisgICAgZnVuY3Rpb24gV2FpdEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV2FpdEZvcihkd1RpbWVvdXQ6IERXT1JEKSA6IERXT1JEOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIEJhc2U2NFV0aWxzID0gY2xhc3Mgc2VhbGVkCisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIEVuY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOyBzdGF0aWM7CisgICAgY2xhc3MgZnVuY3Rpb24gRGVjb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7IHN0YXRpYzsKKyAgZW5kOworCisKKyAgQ2hhclV0aWxzID0gY2xhc3Mgc2VhbGVkCisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIElzSGlnaFN1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsgc3RhdGljOyBpbmxpbmU7CisgICAgY2xhc3MgZnVuY3Rpb24gSXNMb3dTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47IHN0YXRpYzsgaW5saW5lOworICBlbmQ7CisKKworeyRJRkRFRiBXaW42NH0KK2Z1bmN0aW9uIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggdmFyIEFkZGVuZCA6IEludDY0OyBWYWx1ZSA6IEludDY0KSA6IEludDY0OyAgCit7JEVORElGfQorCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVE92ZXJsYXBwZWRIZWxwZXJJbXBsIH0KKworY29uc3RydWN0b3IgVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZpbGxDaGFyKCBGT3ZlcmxhcHBlZCwgU2l6ZU9mKEZPdmVybGFwcGVkKSwgMCk7CisgIEZFdmVudCA6PSBURXZlbnQuQ3JlYXRlKCBuaWwsIFRSVUUsIEZBTFNFLCAnJyk7ICAvLyBhbHdheXMgTWFudWFsUmVzZXQsIHNlZSBNU0ROCisgIEZPdmVybGFwcGVkLmhFdmVudCA6PSBGRXZlbnQuSGFuZGxlOworZW5kOworCisKKworZGVzdHJ1Y3RvciBUT3ZlcmxhcHBlZEhlbHBlckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZPdmVybGFwcGVkLmhFdmVudCA6PSAwOworICAgIEZyZWVBbmROaWwoIEZFdmVudCk7CisKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CisKK2VuZDsKKworCitmdW5jdGlvbiBUT3ZlcmxhcHBlZEhlbHBlckltcGwuT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworYmVnaW4KKyAgcmVzdWx0IDo9IEZPdmVybGFwcGVkOworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5PdmVybGFwcGVkUHRyIDogUE92ZXJsYXBwZWQ7CitiZWdpbgorICByZXN1bHQgOj0gQEZPdmVybGFwcGVkOworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5XYWl0SGFuZGxlIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGT3ZlcmxhcHBlZC5oRXZlbnQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLldhaXRGb3IoIGR3VGltZW91dCA6IERXT1JEKSA6IERXT1JEOworYmVnaW4KKyAgcmVzdWx0IDo9IFdhaXRGb3JTaW5nbGVPYmplY3QoIEZPdmVybGFwcGVkLmhFdmVudCwgZHdUaW1lb3V0KTsKK2VuZDsKKworCit7IEJhc2U2NFV0aWxzIH0KKworY2xhc3MgZnVuY3Rpb24gQmFzZTY0VXRpbHMuRW5jb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7Citjb25zdCBFTkNPREVfVEFCTEUgOiBQQW5zaUNoYXIgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CitiZWdpbgorICBBU1NFUlQoIGxlbiBpbiBbMS4uM10pOworICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIChzcmNbc3JjT2ZmXSBzaHIgMikgYW5kICQzRl0pOworICBjYXNlIGxlbiBvZgorICAgIDMgOiBiZWdpbgorICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZl0gc2hsIDQpIGFuZCAkMzApIG9yICgoc3JjW3NyY09mZiArIDFdIHNociA0KSBhbmQgJDBGKV0pOworICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZiArIDFdIHNobCAyKSBhbmQgJDNDKSBvciAoKHNyY1tzcmNPZmYgKyAyXSBzaHIgNikgYW5kICQwMyldKTsKKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyBzcmNbc3JjT2ZmICsgMl0gYW5kICQzRl0pOworICAgICAgcmVzdWx0IDo9IDQ7CisgICAgZW5kOworCisgICAgMiA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmXSBzaGwgNCkgYW5kICQzMCkgb3IgKChzcmNbc3JjT2ZmICsgMV0gc2hyIDQpIGFuZCAkMEYpXSk7CisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmYgKyAxXSBzaGwgMikgYW5kICQzQ10pOworICAgICAgcmVzdWx0IDo9IDM7CisgICAgZW5kOworCisgICAgMSA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmZdIHNobCA0KSBhbmQgJDMwXSk7CisgICAgICByZXN1bHQgOj0gMjsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIEFTU0VSVCggRkFMU0UpOworICAgIHJlc3VsdCA6PSAwOyAgLy8gYmVjYXVzZSBpbnZhbGlkIGNhbGwKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEJhc2U2NFV0aWxzLkRlY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOworY29uc3QgREVDT0RFX1RBQkxFIDogYXJyYXlbMC4uJEZGXSBvZiBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgPSAoIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCisgICAgICAgICAgICAgICAgICAgICAgIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAorICAgICAgICAgICAgICAgICAgICAgICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xICApOworYmVnaW4KKyAgQVNTRVJUKCBsZW4gaW4gWzEuLjRdKTsKKyAgcmVzdWx0IDo9IDE7CisgIGRzdFtkc3RPZmZdIDo9ICgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICAgICBhbmQgJDBGRl0gc2hsIDIpCisgICAgICAgICAgICAgIG9yICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSBhbmQgJDBGRl0gc2hyIDQpKTsKKworICBpZiAobGVuID4gMikgdGhlbiBiZWdpbgorICAgIEluYyggcmVzdWx0KTsKKyAgICBJbmMoIGRzdE9mZik7CisgICAgZHN0W2RzdE9mZl0gOj0gKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSBhbmQgJDBGRl0gc2hsIDQpIGFuZCAkRjApCisgICAgICAgICAgICAgICAgb3IgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSBhbmQgJDBGRl0gc2hyIDIpKTsKKworICAgIGlmIChsZW4gPiAzKSB0aGVuIGJlZ2luCisgICAgICBJbmMoIHJlc3VsdCk7CisgICAgICBJbmMoIGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdIGFuZCAkMEZGXSBzaGwgNikgYW5kICRDMCkKKyAgICAgICAgICAgICAgICAgIG9yICAgIERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgM10gYW5kICQwRkZdKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBDaGFyVXRpbHMuSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0hpZ2hTdXJyb2dhdGUoYyk7CisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBTeXN0ZW0uQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVORElGfQorICB7JEVMU0V9CisgIHJlc3VsdCA6PSBjLklzSGlnaFN1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjUuMH0KKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBDaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBTeXN0ZW0uQ2hhcmFjdGVyLklzTG93U3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNMb3dTdXJyb2dhdGUoKTsKKyAgeyRJRkVORH0KK2VuZDsKKworCit7JElGREVGIFdpbjY0fQorCitmdW5jdGlvbiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCB2YXIgVGFyZ2V0IDogSW50NjQ7IEV4Y2hhbmdlLCBDb21wYXJhbmQgOiBJbnQ2NCkgOiBJbnQ2NDsgIGlubGluZTsKK2JlZ2luCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIHJlc3VsdCA6PSBXaW5kb3dzLkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIFRhcmdldCwgRXhjaGFuZ2UsIENvbXBhcmFuZCk7CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IFdpbkFwaS5XaW5kb3dzLkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIFRhcmdldCwgRXhjaGFuZ2UsIENvbXBhcmFuZCk7CisgIHskRU5ESUZ9CitlbmQ7CisKKworZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7Cit2YXIgb2xkIDogSW50NjQ7CitiZWdpbgorICByZXBlYXQKKyAgICBPbGQgOj0gQWRkZW5kOworICB1bnRpbCAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggQWRkZW5kLCBPbGQgKyBWYWx1ZSwgT2xkKSA9IE9sZCk7CisgIHJlc3VsdCA6PSBPbGQ7CitlbmQ7CisKK3skRU5ESUZ9CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ODFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKQEAgLTAsMCArMSwyMzkgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQ7CisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUaHJpZnQuRXhjZXB0aW9uLAorICBUaHJpZnQuUHJvdG9jb2w7CisKK2NvbnN0CisgIFZlcnNpb24gPSAnMS4wLjAnOworCit0eXBlCisgIFRFeGNlcHRpb24gPSBUaHJpZnQuRXhjZXB0aW9uLlRFeGNlcHRpb247IC8vIGNvbXBhdGliaWxpdHkgYWxpYXMKKworICBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzID0gY2xhc3Mgb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQ7CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIHR5cGUKK3skU0NPUEVERU5VTVMgT059CisgICAgICBURXhjZXB0aW9uVHlwZSA9ICgKKyAgICAgICAgVW5rbm93biwKKyAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICBXcm9uZ01ldGhvZE5hbWUsCisgICAgICAgIEJhZFNlcXVlbmNlSUQsCisgICAgICAgIE1pc3NpbmdSZXN1bHQsCisgICAgICAgIEludGVybmFsRXJyb3IsCisgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgIEludmFsaWRUcmFuc2Zvcm0sCisgICAgICAgIEludmFsaWRQcm90b2NvbCwKKyAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICApOworeyRTQ09QRURFTlVNUyBPRkZ9CisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBHZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgcHVibGljCisgICAgLy8gcHVycG9zZWZ1bGx5IGhpZGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9yCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKworICAgIGNsYXNzIGZ1bmN0aW9uIEdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworCisgICAgY2xhc3MgZnVuY3Rpb24gUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wgKTsKKyAgZW5kOworCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCA9IGNsYXNzIGFic3RyYWN0IChUQXBwbGljYXRpb25FeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0ID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvciA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3IgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5HZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKK2JlZ2luCisgIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuV3JvbmdNZXRob2ROYW1lCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkJhZFNlcXVlbmNlSUQKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvciB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlByb3RvY29sRXJyb3IKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm0gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZFRyYW5zZm9ybQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICBlbHNlIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duOworZW5kOworCitjb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZShBVHlwZSwgJycpOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlKS5DcmVhdGUobXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworYmVnaW4KKyAgY2FzZSBBVHlwZSBvZgorICAgIFRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2Q6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2Q7CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlOiAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlOworICAgIFRFeGNlcHRpb25UeXBlLldyb25nTWV0aG9kTmFtZTogICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZTsKKyAgICBURXhjZXB0aW9uVHlwZS5CYWRTZXF1ZW5jZUlEOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEOworICAgIFRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQ6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQ7CisgICAgVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcjogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvcjsKKyAgICBURXhjZXB0aW9uVHlwZS5Qcm90b2NvbEVycm9yOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRUcmFuc2Zvcm06ICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm07CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sOiAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sOworICAgIFRFeGNlcHRpb25UeXBlLlVuc3VwcG9ydGVkQ2xpZW50VHlwZTogUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duOworICBlbmQ7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwordmFyCisgIGZpZWxkIDogVFRocmlmdEZpZWxkOworICBtc2cgOiBzdHJpbmc7CisgIHR5cCA6IFRFeGNlcHRpb25UeXBlOworICBzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7CitiZWdpbgorICBtc2cgOj0gJyc7CisgIHR5cCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duOworICBzdHJ1YyA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW47CisgIHdoaWxlICggVHJ1ZSApIGRvCisgIGJlZ2luCisgICAgZmllbGQgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW47CisgICAgaWYgKCBmaWVsZC5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4KKyAgICBiZWdpbgorICAgICAgQnJlYWs7CisgICAgZW5kOworCisgICAgY2FzZSBmaWVsZC5JZCBvZgorICAgICAgMSA6IGJlZ2luCisgICAgICAgIGlmICggZmllbGQuVHlwZV8gPSBUVHlwZS5TdHJpbmdfKSB0aGVuCisgICAgICAgIGJlZ2luCisgICAgICAgICAgbXNnIDo9IGlwcm90LlJlYWRTdHJpbmc7CisgICAgICAgIGVuZCBlbHNlCisgICAgICAgIGJlZ2luCisgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKCBpcHJvdCwgZmllbGQuVHlwZV8gKTsKKyAgICAgICAgZW5kOworICAgICAgZW5kOworCisgICAgICAyIDogYmVnaW4KKyAgICAgICAgaWYgKCBmaWVsZC5UeXBlXyA9IFRUeXBlLkkzMikgdGhlbgorICAgICAgICBiZWdpbgorICAgICAgICAgIHR5cCA6PSBURXhjZXB0aW9uVHlwZSggaXByb3QuUmVhZEkzMiApOworICAgICAgICBlbmQgZWxzZQorICAgICAgICBiZWdpbgorICAgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcCggaXByb3QsIGZpZWxkLlR5cGVfICk7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZCBlbHNlCisgICAgICBiZWdpbgorICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoIGlwcm90LCBmaWVsZC5UeXBlXyk7CisgICAgICBlbmQ7CisgICAgZW5kOworICAgIGlwcm90LlJlYWRGaWVsZEVuZDsKKyAgZW5kOworICBpcHJvdC5SZWFkU3RydWN0RW5kOworICBSZXN1bHQgOj0gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKHR5cCkuQ3JlYXRlKG1zZyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQXBwbGljYXRpb25FeGNlcHRpb24uV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOwordmFyCisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKKyAgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CitiZWdpbgorICBJbml0KHN0cnVjLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgIEluaXQoZmllbGQpOworCisgIG9wcm90LldyaXRlU3RydWN0QmVnaW4oIHN0cnVjICk7CisgIGlmIE1lc3NhZ2UgPD4gJycgdGhlbgorICBiZWdpbgorICAgIGZpZWxkLk5hbWUgOj0gJ21lc3NhZ2UnOworICAgIGZpZWxkLlR5cGVfIDo9IFRUeXBlLlN0cmluZ187CisgICAgZmllbGQuSWQgOj0gMTsKKyAgICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIGZpZWxkICk7CisgICAgb3Byb3QuV3JpdGVTdHJpbmcoIE1lc3NhZ2UgKTsKKyAgICBvcHJvdC5Xcml0ZUZpZWxkRW5kOworICBlbmQ7CisKKyAgZmllbGQuTmFtZSA6PSAndHlwZSc7CisgIGZpZWxkLlR5cGVfIDo9IFRUeXBlLkkzMjsKKyAgZmllbGQuSWQgOj0gMjsKKyAgb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKKyAgb3Byb3QuV3JpdGVJMzIoSW50ZWdlcihHZXRUeXBlKSk7CisgIG9wcm90LldyaXRlRmllbGRFbmQoKTsKKyAgb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsKKyAgb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsKK2VuZDsKKworeyBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCB9CisKK2NvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9Db25zb2xlSGVscGVyLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9Db25zb2xlSGVscGVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThkZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCkBAIC0wLDAgKzEsMTMyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgQ29uc29sZUhlbHBlcjsKKworaW50ZXJmYWNlCisKK3VzZXMgQ2xhc3NlczsKKwordHlwZQorICBUVGhyaWZ0Q29uc29sZSA9IGNsYXNzCisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICBlbmQ7CisKKyAgVEdVSUNvbnNvbGUgPSBjbGFzcyggVFRocmlmdENvbnNvbGUgKQorICBwcml2YXRlCisgICAgRkxpbmVCcmVhayA6IEJvb2xlYW47CisgICAgRk1lbW8gOiBUU3RyaW5nczsKKworICAgIHByb2NlZHVyZSBJbnRlcm5hbFdyaXRlKCBjb25zdCBTOiBzdHJpbmc7IGJXcml0ZUxpbmU6IEJvb2xlYW4pOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKKyAgZW5kOworCitmdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsKK3Byb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKKworaW1wbGVtZW50YXRpb24KKwordmFyCisgIEZEZWZhdWx0Q29uc29sZSA6IFRUaHJpZnRDb25zb2xlOworICBGQ29uc29sZSA6IFRUaHJpZnRDb25zb2xlOworCitmdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ29uc29sZTsKK2VuZDsKKworeyBUVGhyaWZ0Q29uc29sZSB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlKCBTICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIFN5c3RlbS5Xcml0ZWxuKCBTICk7CitlbmQ7CisKK3Byb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEFDb25zb2xlOworZW5kOworCitwcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7CitiZWdpbgorICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK3sgVEdVSUNvbnNvbGUgfQorCitjb25zdHJ1Y3RvciBUR1VJQ29uc29sZS5DcmVhdGUoIEFNZW1vOiBUU3RyaW5ncyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTWVtbyA6PSBBTWVtbzsKKyAgRkxpbmVCcmVhayA6PSBUcnVlOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuSW50ZXJuYWxXcml0ZShjb25zdCBTOiBzdHJpbmc7IGJXcml0ZUxpbmU6IEJvb2xlYW4pOwordmFyCisgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBpZiBGTGluZUJyZWFrIHRoZW4KKyAgYmVnaW4KKyAgICBGTWVtby5BZGQoIFMgKTsKKyAgZW5kIGVsc2UKKyAgYmVnaW4KKyAgICBpZHggOj0gRk1lbW8uQ291bnQgLSAxOworICAgIGlmIGlkeCA8IDAgdGhlbgorICAgICAgRk1lbW8uQWRkKCBTICkKKyAgICBlbHNlCisgICAgICBGTWVtb1tpZHhdIDo9IEZNZW1vW2lkeF0gKyBTOworICBlbmQ7CisgIEZMaW5lQnJlYWsgOj0gYldyaXRlTGluZTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBJbnRlcm5hbFdyaXRlKCBTLCBGYWxzZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIFRydWUpOworZW5kOworCitpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlIDo9IFRUaHJpZnRDb25zb2xlLkNyZWF0ZTsKKyAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOworZW5kOworCitmaW5hbGl6YXRpb24KK2JlZ2luCisgIEZEZWZhdWx0Q29uc29sZS5GcmVlOworZW5kOworCitlbmQuCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYTQzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKQEAgLTAsMCArMSwxNDU1IEBACivvu78oKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdENsaWVudDsKKworeyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9CisKK3suJERFRklORSBTdHJlc3NUZXN0fSAgIC8vIGFjdGl2YXRlIHRvIHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgd2l0aCBmcmVxdWVudCBjb25uZWN0cy9kaXNjb25uZWN0cworey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKK3skREVGSU5FIEV4Y2VwdGlvbnN9ICAgIC8vIGFjdGl2YXRlIHRoZSBleGNlcHRpb25zIHRlc3QgKG9yIGRpc2FibGUgd2hpbGUgZGVidWdnaW5nKQorCit7JGlmIENvbXBpbGVyVmVyc2lvbiA+PSAyOH0KK3skREVGSU5FIFN1cHBvcnRzQXN5bmN9Cit7JGlmZW5kfQorCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywgQ2xhc3NlcywgTWF0aCwgQ29tT2JqLCBBY3RpdmVYLAorICB7JElGREVGIFN1cHBvcnRzQXN5bmN9IFN5c3RlbS5UaHJlYWRpbmcsIHskRU5ESUZ9CisgIERhdGVVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRlc3RDb25zdGFudHMsCisgIENvbnNvbGVIZWxwZXIsCisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5TdHJlYW0sCisgIFRocmlmdC5UZXN0LAorICBUaHJpZnQuVXRpbHMsCisgIFRocmlmdC5Db2xsZWN0aW9uczsKKwordHlwZQorICBUVGhyZWFkQ29uc29sZSA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBGVGhyZWFkIDogVFRocmVhZDsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTIDogc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTIDogc3RyaW5nKTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUaHJlYWQ6IFRUaHJlYWQpOworICBlbmQ7CisKKyAgVFRlc3RTZXR1cCA9IHJlY29yZAorICAgIHByb3RUeXBlICA6IFRLbm93blByb3RvY29sOworICAgIGVuZHBvaW50ICA6IFRFbmRwb2ludFRyYW5zcG9ydDsKKyAgICBsYXllcmVkICAgOiBUTGF5ZXJlZFRyYW5zcG9ydHM7CisgICAgdXNlU1NMICAgIDogQm9vbGVhbjsgLy8gaW5jbHVkZSB3aGVyZSBhcHByb3ByaWF0ZSAoVExheWVyZWRUcmFuc3BvcnQ/KQorICAgIGhvc3QgICAgICA6IHN0cmluZzsKKyAgICBwb3J0ICAgICAgOiBJbnRlZ2VyOworICAgIHNQaXBlTmFtZSA6IHN0cmluZzsKKyAgICBoQW5vblJlYWQsIGhBbm9uV3JpdGUgOiBUSGFuZGxlOworICBlbmQ7CisKKyAgVENsaWVudFRocmVhZCA9IGNsYXNzKCBUVGhyZWFkICkKKyAgcHJpdmF0ZSB0eXBlCisgICAgVFRlc3RHcm91cCA9ICgKKyAgICAgIHRlc3RfVW5rbm93biwKKyAgICAgIHRlc3RfQmFzZVR5cGVzLAorICAgICAgdGVzdF9TdHJ1Y3RzLAorICAgICAgdGVzdF9Db250YWluZXJzLAorICAgICAgdGVzdF9FeGNlcHRpb25zCisgICAgICAvLyBuZXcgdmFsdWVzIGhlcmUKKyAgICApOworICAgIFRUZXN0R3JvdXBzID0gc2V0IG9mIFRUZXN0R3JvdXA7CisKKyAgICBUVGVzdFNpemUgPSAoCisgICAgICBFbXB0eSwgICAgICAgICAgIC8vIEVkZ2UgY2FzZTogdGhlIHplcm8tbGVuZ3RoIGVtcHR5IGJpbmFyeQorICAgICAgTm9ybWFsLCAgICAgICAgICAvLyBGYWlybHkgc21hbGwgYXJyYXkgb2YgdXN1YWwgc2l6ZSAoMjU2IGJ5dGVzKQorICAgICAgQnl0ZUFycmF5VGVzdCwgICAvLyBUSFJJRlQtNDQ1NCBMYXJnZSB3cml0ZXMvcmVhZHMgbWF5IGNhdXNlIHJhbmdlIGNoZWNrIGVycm9ycyBpbiBkZWJ1ZyBtb2RlCisgICAgICBQaXBlV3JpdGVMaW1pdCAgIC8vIFRIUklGVC00MzcyIFBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuCisgICAgKTsKKworICBwcml2YXRlCisgICAgRlNldHVwIDogVFRlc3RTZXR1cDsKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGUHJvdG9jb2wgOiBJUHJvdG9jb2w7CisgICAgRk51bUl0ZXJhdGlvbiA6IEludGVnZXI7CisgICAgRkNvbnNvbGUgOiBUVGhyZWFkQ29uc29sZTsKKworICAgIC8vIHRlc3QgcmVwb3J0aW5nLCB3aWxsIGJlIHJlZmFjdG9yZWQgb3V0IGludG8gc2VwYXJhdGUgY2xhc3MgbGF0ZXIKKyAgICBGVGVzdEdyb3VwIDogc3RyaW5nOworICAgIEZDdXJyZW50VGVzdCA6IFRUZXN0R3JvdXA7CisgICAgRlN1Y2Nlc3NlcyA6IEludGVnZXI7CisgICAgRkVycm9ycyA6IFRTdHJpbmdMaXN0OworICAgIEZGYWlsZWQgOiBUVGVzdEdyb3VwczsKKyAgICBGRXhlY3V0ZWQgOiBUVGVzdEdyb3VwczsKKyAgICBwcm9jZWR1cmUgU3RhcnRUZXN0R3JvdXAoIGNvbnN0IGFHcm91cCA6IHN0cmluZzsgY29uc3QgYVRlc3QgOiBUVGVzdEdyb3VwKTsKKyAgICBwcm9jZWR1cmUgRXhwZWN0KCBhVGVzdFJlc3VsdCA6IEJvb2xlYW47IGNvbnN0IGFUZXN0SW5mbyA6IHN0cmluZyk7CisgICAgcHJvY2VkdXJlIFJlcG9ydFJlc3VsdHM7CisgICAgZnVuY3Rpb24gIENhbGN1bGF0ZUV4aXRDb2RlIDogQnl0ZTsKKworICAgIHByb2NlZHVyZSBDbGllbnRUZXN0OworICAgIHskSUZERUYgU3VwcG9ydHNBc3luY30KKyAgICBwcm9jZWR1cmUgQ2xpZW50QXN5bmNUZXN0OworICAgIHskRU5ESUZ9CisKKyAgICBwcm9jZWR1cmUgSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisgICAgcHJvY2VkdXJlIFNodXRkb3duUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKworICAgIHByb2NlZHVyZSBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OworICAgIGZ1bmN0aW9uICBQcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuOyBhU2l6ZSA6IFRUZXN0U2l6ZSkgOiBUQnl0ZXM7CisgICAgeyRJRkRFRiBTdHJlc3NUZXN0fQorICAgIHByb2NlZHVyZSBTdHJlc3NUZXN0KGNvbnN0IGNsaWVudCA6IFRUaHJpZnRUZXN0LklmYWNlKTsKKyAgICB7JEVORElGfQorICAgIHskSUZERUYgV2luNjR9CisgICAgcHJvY2VkdXJlIFVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKKyAgICB7JEVORElGfQorICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgRXhlY3V0ZTsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRUZXN0Q2xpZW50ID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIGNsYXNzIHZhcgorICAgICAgRk51bUl0ZXJhdGlvbiA6IEludGVnZXI7CisgICAgICBGTnVtVGhyZWFkIDogSW50ZWdlcjsKKworICAgIGNsYXNzIHByb2NlZHVyZSBQcmludENtZExpbmVIZWxwOworICAgIGNsYXNzIHByb2NlZHVyZSBJbnZhbGlkQXJnczsKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKSA6IEJ5dGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCitjb25zdAorICAgRVhJVENPREVfU1VDQ0VTUyAgICAgICAgICAgPSAkMDA7ICAvLyBubyBlcnJvcnMgYml0cyBzZXQKKyAgIC8vCisgICBFWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyAgPSAkMDE7CisgICBFWElUQ09ERV9GQUlMQklUX1NUUlVDVFMgICAgPSAkMDI7CisgICBFWElUQ09ERV9GQUlMQklUX0NPTlRBSU5FUlMgPSAkMDQ7CisgICBFWElUQ09ERV9GQUlMQklUX0VYQ0VQVElPTlMgPSAkMDg7CisKKyAgIE1BUF9GQUlMVVJFU19UT19FWElUQ09ERV9CSVRTIDogYXJyYXlbVENsaWVudFRocmVhZC5UVGVzdEdyb3VwXSBvZiBCeXRlID0gKAorICAgICBFWElUQ09ERV9TVUNDRVNTLCAgLy8gbm8gYml0cyBoZXJlCisgICAgIEVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTLAorICAgICBFWElUQ09ERV9GQUlMQklUX1NUUlVDVFMsCisgICAgIEVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUywKKyAgICAgRVhJVENPREVfRkFJTEJJVF9FWENFUFRJT05TCisgICApOworCisKKworZnVuY3Rpb24gQm9vbFRvU3RyaW5nKCBiIDogQm9vbGVhbikgOiBzdHJpbmc7CisvLyBvdmVycmlkZXMgZ2xvYmFsIEJvb2xUb1N0cmluZygpCitiZWdpbgorICBpZiBiCisgIHRoZW4gcmVzdWx0IDo9ICd0cnVlJworICBlbHNlIHJlc3VsdCA6PSAnZmFsc2UnOworZW5kOworCisvLyBub3QgYXZhaWxhYmxlIGluIGFsbCB2ZXJzaW9ucywgc28gbWFrZSBzdXJlIHdlIGhhdmUgdGhpcyBvbmUgaW1wb3J0ZWQKK2Z1bmN0aW9uIElzRGVidWdnZXJQcmVzZW50OiBCT09MOyBzdGRjYWxsOyBleHRlcm5hbCBLRVJORUwzMiBuYW1lICdJc0RlYnVnZ2VyUHJlc2VudCc7CisKK3sgVFRlc3RDbGllbnQgfQorCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RDbGllbnQuUHJpbnRDbWRMaW5lSGVscDsKK2NvbnN0IEhFTFBURVhUID0gJyBbb3B0aW9uc10nIzEwCisgICAgICAgICAgICAgICArICMxMAorICAgICAgICAgICAgICAgKyAnQWxsb3dlZCBvcHRpb25zOicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0JyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksJyMxMAorICAgICAgICAgICAgICAgKyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0JyMxMAorICAgICAgICAgICAgICAgKyAnICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSknIzEwCisgICAgICAgICAgICAgICArICcgIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMJyMxMAorICAgICAgICAgICAgICAgKyAnICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzJyMxMAorICAgICAgICAgICAgICAgKyAnICAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkcycjMTAKKyAgICAgICAgICAgICAgIDsKK2JlZ2luCisgIFdyaXRlbG4oIENoYW5nZUZpbGVFeHQoRXh0cmFjdEZpbGVOYW1lKFBhcmFtU3RyKDApKSwnJykgKyBIRUxQVEVYVCk7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdENsaWVudC5JbnZhbGlkQXJnczsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBhcmdzLicpOworICBDb25zb2xlLldyaXRlTGluZSggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArICcgLWggZm9yIG1vcmUgaW5mb3JtYXRpb24nKTsKKyAgQWJvcnQ7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRUZXN0Q2xpZW50LkV4ZWN1dGUoY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKSA6IEJ5dGU7Cit2YXIKKyAgaSA6IEludGVnZXI7CisgIHRocmVhZEV4aXRDb2RlIDogQnl0ZTsKKyAgcyA6IHN0cmluZzsKKyAgdGhyZWFkcyA6IGFycmF5IG9mIFRUaHJlYWQ7CisgIGR0U3RhcnQgOiBURGF0ZVRpbWU7CisgIHRlc3QgOiBJbnRlZ2VyOworICB0aHJlYWQgOiBUVGhyZWFkOworICBzZXR1cCA6IFRUZXN0U2V0dXA7CitiZWdpbgorICAvLyBpbml0IHJlY29yZAorICB3aXRoIHNldHVwIGRvIGJlZ2luCisgICAgcHJvdFR5cGUgICA6PSBwcm90X0JpbmFyeTsKKyAgICBlbmRwb2ludCAgIDo9IHRybnNfU29ja2V0czsKKyAgICBsYXllcmVkICAgIDo9IFtdOworICAgIHVzZVNTTCAgICAgOj0gRkFMU0U7CisgICAgaG9zdCAgICAgICA6PSAnbG9jYWxob3N0JzsKKyAgICBwb3J0ICAgICAgIDo9IDkwOTA7CisgICAgc1BpcGVOYW1lICA6PSAnJzsKKyAgICBoQW5vblJlYWQgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIGhBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIGVuZDsKKworICB0cnkKKyAgICBpIDo9IDA7CisgICAgd2hpbGUgKCBpIDwgTGVuZ3RoKGFyZ3MpICkgZG8gYmVnaW4KKyAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgIEluYyggaSk7CisKKyAgICAgIGlmIChzID0gJy1oJykgb3IgKHMgPSAnLS1oZWxwJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgICAgUHJpbnRDbWRMaW5lSGVscDsKKyAgICAgICAgcmVzdWx0IDo9ICRGRjsgICAvLyBhbGwgdGVzdHMgZmFpbGVkCisgICAgICAgIEV4aXQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWhvc3QnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdAorICAgICAgICBzZXR1cC5ob3N0IDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXBvcnQnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOworICAgICAgICBzZXR1cC5wb3J0IDo9IFN0clRvSW50RGVmKHMsMCk7CisgICAgICAgIGlmIHNldHVwLnBvcnQgPD0gMCB0aGVuIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1kb21haW4tc29ja2V0JyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnZG9tYWluLXNvY2tldCBub3Qgc3VwcG9ydGVkJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLW5hbWVkLXBpcGUnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKKyAgICAgICAgc2V0dXAuc1BpcGVOYW1lIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBuYW1lZCBwaXBlICgnK3NldHVwLnNQaXBlTmFtZSsnKScpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1hbm9uLXBpcGVzJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQorICAgICAgICBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlczsKKyAgICAgICAgc2V0dXAuaEFub25SZWFkIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICAgICAgICBJbmMoIGkpOworICAgICAgICBzZXR1cC5oQW5vbldyaXRlIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICAgICAgICBJbmMoIGkpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYW5vbnltb3VzIHBpcGVzICgnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25SZWFkKSkrJyBhbmQgJytJbnRUb1N0cihJbnRlZ2VyKHNldHVwLmhBbm9uV3JpdGUpKSsnKScpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS10cmFuc3BvcnQnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIHNldHVwLmxheWVyZWQsIHRybnNfRnJhbWVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19IdHRwCisgICAgICAgIGVsc2UgaWYgcyA9ICdldmh0dHAnICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0V2SHR0cAorICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1wcm90b2NvbCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbgorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisKKyAgICAgICAgaWYgICAgICBzID0gJ2JpbmFyeScgICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfQmluYXJ5CisgICAgICAgIGVsc2UgaWYgcyA9ICdjb21wYWN0JyAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0NvbXBhY3QKKyAgICAgICAgZWxzZSBpZiBzID0gJ2pzb24nICAgICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfSlNPTgorICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIHMgPSAnLS1zc2wnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAgIHNldHVwLnVzZVNTTCA6PSBUUlVFOworCisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLW4nKSBvciAocyA9ICctLXRlc3Rsb29wcycpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cworICAgICAgICBGTnVtSXRlcmF0aW9uIDo9IFN0clRvSW50RGVmKCBhcmdzW2ldLCAwKTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgaWYgRk51bUl0ZXJhdGlvbiA8PSAwCisgICAgICAgIHRoZW4gSW52YWxpZEFyZ3M7CisKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctdCcpIG9yIChzID0gJy0tdGhyZWFkcycpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHMKKyAgICAgICAgRk51bVRocmVhZCA6PSBTdHJUb0ludERlZiggYXJnc1tpXSwgMCk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIGlmIEZOdW1UaHJlYWQgPD0gMAorICAgICAgICB0aGVuIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGJlZ2luCisgICAgICAgIEludmFsaWRBcmdzOworICAgICAgZW5kOworICAgIGVuZDsKKworCisgICAgLy8gSW4gdGhlIGFub255bW91cyBwaXBlcyBtb2RlIHRoZSBjbGllbnQgaXMgbGF1bmNoZWQgYnkgdGhlIHRlc3Qgc2VydmVyCisgICAgLy8gLT4gYmVoYXZlIG5pY2VseSBhbmQgYWxsb3cgZm9yIGF0dGFjaGluZyBhIGRlYnVnZ2VyIHRvIHRoaXMgcHJvY2VzcworICAgIGlmIChzZXR1cC5lbmRwb2ludCA9IHRybnNfQW5vblBpcGVzKSBhbmQgbm90IElzRGVidWdnZXJQcmVzZW50CisgICAgdGhlbiBNZXNzYWdlQm94KCAwLCAnQXR0YWNoIERlYnVnZ2VyIGFuZC9vciBjbGljayBPSyB0byBjb250aW51ZS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RocmlmdCBUZXN0Q2xpZW50IChEZWxwaGkpJywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CX09LIG9yIE1CX0lDT05FWENMQU1BVElPTik7CisKKyAgICBTZXRMZW5ndGgoIHRocmVhZHMsIEZOdW1UaHJlYWQpOworICAgIGR0U3RhcnQgOj0gTm93OworCisgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnRzIGFyZSBub3QgcmVhbGx5IG1lYW50IHRvIGJlIHN0YWNrZWQgdXBvbiBlYWNoIG90aGVyCisgICAgaWYgKHRybnNfRnJhbWVkIGluIHNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBmcmFtZWQgdHJhbnNwb3J0Jyk7CisgICAgZW5kCisgICAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBzZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYnVmZmVyZWQgdHJhbnNwb3J0Jyk7CisgICAgZW5kOworCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoVEhSSUZUX1BST1RPQ09MU1tzZXR1cC5wcm90VHlwZV0rJyBwcm90b2NvbCcpOworCisgICAgZm9yIHRlc3QgOj0gMCB0byBGTnVtVGhyZWFkIC0gMSBkbyBiZWdpbgorICAgICAgdGhyZWFkIDo9IFRDbGllbnRUaHJlYWQuQ3JlYXRlKCBzZXR1cCwgRk51bUl0ZXJhdGlvbik7CisgICAgICB0aHJlYWRzW3Rlc3RdIDo9IHRocmVhZDsKKyAgICAgIHRocmVhZC5TdGFydDsKKyAgICBlbmQ7CisKKyAgICByZXN1bHQgOj0gMDsKKyAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCisgICAgICB0aHJlYWRFeGl0Q29kZSA6PSB0aHJlYWRzW3Rlc3RdLldhaXRGb3I7CisgICAgICByZXN1bHQgOj0gcmVzdWx0IG9yIHRocmVhZEV4aXRDb2RlOworICAgICAgdGhyZWFkc1t0ZXN0XS5GcmVlOworICAgICAgdGhyZWFkc1t0ZXN0XSA6PSBuaWw7CisgICAgZW5kOworCisgICAgQ29uc29sZS5Xcml0ZSgnVG90YWwgdGltZTogJyArIEludFRvU3RyKCBNaWxsaVNlY29uZHNCZXR3ZWVuKE5vdywgZHRTdGFydCkpKTsKKworICBleGNlcHQKKyAgICBvbiBFOiBFQWJvcnQgZG8gcmFpc2U7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggRS5NZXNzYWdlICsgIzEwICsgRS5TdGFja1RyYWNlKTsKKyAgICAgIHJhaXNlOworICAgIGVuZDsKKyAgZW5kOworCisgIENvbnNvbGUuV3JpdGVMaW5lKCcnKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ2RvbmUhJyk7CitlbmQ7CisKK3sgVENsaWVudFRocmVhZCB9CisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkNsaWVudFRlc3Q7Cit2YXIKKyAgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2U7CisgIHMgOiBzdHJpbmc7CisgIGk4IDogU2hvcnRJbnQ7CisgIGkzMiA6IEludGVnZXI7CisgIGk2NCA6IEludDY0OworICBiaW5PdXQsYmluSW4gOiBUQnl0ZXM7CisgIGR1YiA6IERvdWJsZTsKKyAgbyA6IElYdHJ1Y3Q7CisgIG8yIDogSVh0cnVjdDI7CisgIGkgOiBJWHRydWN0OworICBpMiA6IElYdHJ1Y3QyOworICBtYXBvdXQgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLEludGVnZXI+OworICBtYXBpbiA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsSW50ZWdlcj47CisgIHN0cm1hcG91dCA6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworICBzdHJtYXBpbiA6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworICBqIDogSW50ZWdlcjsKKyAgZmlyc3QgOiBCb29sZWFuOworICBrZXkgOiBJbnRlZ2VyOworICBzdHJrZXkgOiBzdHJpbmc7CisgIGxpc3RvdXQgOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKyAgbGlzdGluIDogSVRocmlmdExpc3Q8SW50ZWdlcj47CisgIHNldG91dCA6IElIYXNoU2V0PEludGVnZXI+OworICBzZXRpbiA6IElIYXNoU2V0PEludGVnZXI+OworICByZXQgOiBUTnVtYmVyejsKKyAgdWlkIDogSW50NjQ7CisgIG1tIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4+OworICBwb3MgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgbmVnIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgIG0yIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgIGsyIDogSW50ZWdlcjsKKyAgaW5zYW5lIDogSUluc2FuaXR5OworICB0cnVjayA6IElYdHJ1Y3Q7CisgIHdob2EgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OworICBrZXk2NCA6IEludDY0OworICB2YWwgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgazJfMiA6IFROdW1iZXJ6OworICBrMyA6IFROdW1iZXJ6OworICB2MiA6IElJbnNhbml0eTsKKyAgdXNlck1hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJbnQ2ND47CisgIHh0cnVjdHMgOiBJVGhyaWZ0TGlzdDxJWHRydWN0PjsKKyAgeCA6IElYdHJ1Y3Q7CisgIGFyZzAgOiBTaG9ydEludDsKKyAgYXJnMSA6IEludGVnZXI7CisgIGFyZzIgOiBJbnQ2NDsKKyAgYXJnMyA6IElUaHJpZnREaWN0aW9uYXJ5PFNtYWxsSW50LCBzdHJpbmc+OworICBhcmc0IDogVE51bWJlcno7CisgIGFyZzUgOiBJbnQ2NDsKKyAgeyRJRkRFRiBQZXJmVGVzdH0KKyAgU3RhcnRUaWNrIDogQ2FyZGluYWw7CisgIGsgOiBJbnRlZ2VyOworICB7JEVORElGfQorICBoZWxsbywgZ29vZGJ5ZSA6IElYdHJ1Y3Q7CisgIGNyYXp5IDogSUluc2FuaXR5OworICBsb29uZXkgOiBJSW5zYW5pdHk7CisgIGZpcnN0X21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBzZWNvbmRfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CisgIHBhaXIgOiBUUGFpcjxUTnVtYmVyeiwgVFVzZXJJZD47CisgIHRlc3RzaXplIDogVFRlc3RTaXplOworYmVnaW4KKyAgY2xpZW50IDo9IFRUaHJpZnRUZXN0LlRDbGllbnQuQ3JlYXRlKCBGUHJvdG9jb2wpOworICBGVHJhbnNwb3J0Lk9wZW47CisKKyAgeyRJRkRFRiBTdHJlc3NUZXN0fQorICBTdHJlc3NUZXN0KCBjbGllbnQpOworICB7JEVORElGIFN0cmVzc1Rlc3R9CisKKyAgeyRJRkRFRiBFeGNlcHRpb25zfQorICAvLyBpbi1kZXB0aCBleGNlcHRpb24gdGVzdAorICAvLyAoMSkgZG8gd2UgZ2V0IGFuIGV4Y2VwdGlvbiBhdCBhbGw/CisgIC8vICgyKSBkbyB3ZSBnZXQgdGhlIHJpZ2h0IGV4Y2VwdGlvbj8KKyAgLy8gKDMpIGRvZXMgdGhlIGV4Y2VwdGlvbiBjb250YWluIHRoZSBleHBlY3RlZCBkYXRhPworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RFeGNlcHRpb24nLCB0ZXN0X0V4Y2VwdGlvbnMpOworICAvLyBjYXNlIDE6IGV4Y2VwdGlvbiB0eXBlIGRlY2xhcmVkIGluIElETCBhdCB0aGUgZnVuY3Rpb24gY2FsbAorICB0cnkKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICBFeHBlY3QoIEZBTFNFLCAndGVzdEV4Y2VwdGlvbignJ1hjZXB0aW9uJycpOiBtdXN0IHRyb3cgYW4gZXhjZXB0aW9uJyk7CisgIGV4Y2VwdAorICAgIG9uIGU6VFhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIGUuRXJyb3JDb2RlID0gMTAwMSwgICAgICAgJ2Vycm9yIGNvZGUnKTsKKyAgICAgIEV4cGVjdCggZS5NZXNzYWdlXyAgPSAnWGNlcHRpb24nLCAnZXJyb3IgbWVzc2FnZScpOworICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICcgPSAnICsgSW50VG9TdHIoZS5FcnJvckNvZGUpICsgJywgJyArIGUuTWVzc2FnZV8gKTsKKyAgICBlbmQ7CisgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIDogIicrZS5Ub1N0cmluZysnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKyAgLy8gY2FzZSAyOiBleGNlcHRpb24gdHlwZSBOT1QgZGVjbGFyZWQgaW4gSURMIGF0IHRoZSBmdW5jdGlvbiBjYWxsCisgIC8vIHRoaXMgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbgorICB0cnkKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgIEV4cGVjdCggRkFMU0UsICd0ZXN0RXhjZXB0aW9uKCcnVEV4Y2VwdGlvbicnKTogbXVzdCB0cm93IGFuIGV4Y2VwdGlvbicpOworICBleGNlcHQKKyAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnID0gJytlLk1lc3NhZ2UpOyAvLyB0aGlzIGlzIHdoYXQgd2UgZ2V0CisgICAgZW5kOworICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5DbGFzc05hbWUrJyA9ICcrZS5NZXNzYWdlKTsgLy8gdGhpcyBpcyB3aGF0IHdlIGdldAorICAgIGVuZDsKKyAgICBvbiBlOlRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKworCisgIGlmIEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5DbG9zZTsKKyAgRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAorCisKKyAgLy8gY2FzZSAzOiBubyBleGNlcHRpb24KKyAgdHJ5CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ3NvbWV0aGluZycpOworICAgIEV4cGVjdCggVFJVRSwgJ3Rlc3RFeGNlcHRpb24oJydzb21ldGhpbmcnJyk6IG11c3Qgbm90IHRyb3cgYW4gZXhjZXB0aW9uJyk7CisgIGV4Y2VwdAorICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCA6ICInK2UuVG9TdHJpbmcrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworICB7JEVORElGIEV4Y2VwdGlvbnN9CisKKworICAvLyBzaW1wbGUgdGhpbmdzCisgIFN0YXJ0VGVzdEdyb3VwKCAnc2ltcGxlIFRocmlmdCBjYWxscycsIHRlc3RfQmFzZVR5cGVzKTsKKyAgY2xpZW50LnRlc3RWb2lkKCk7CisgIEV4cGVjdCggVFJVRSwgJ3Rlc3RWb2lkKCknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgcyA6PSBCb29sVG9TdHJpbmcoIGNsaWVudC50ZXN0Qm9vbChUUlVFKSk7CisgIEV4cGVjdCggcyA9IEJvb2xUb1N0cmluZyhUUlVFKSwgICd0ZXN0Qm9vbChUUlVFKSA9ICcrcyk7CisgIHMgOj0gQm9vbFRvU3RyaW5nKCBjbGllbnQudGVzdEJvb2woRkFMU0UpKTsKKyAgRXhwZWN0KCBzID0gQm9vbFRvU3RyaW5nKEZBTFNFKSwgICd0ZXN0Qm9vbChGQUxTRSkgPSAnK3MpOworCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoJ1Rlc3QnKTsKKyAgRXhwZWN0KCBzID0gJ1Rlc3QnLCAndGVzdFN0cmluZygnJ1Rlc3QnJykgPSAiJytzKyciJyk7CisKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZygnJyk7ICAvLyBlbXB0eSBzdHJpbmcKKyAgRXhwZWN0KCBzID0gJycsICd0ZXN0U3RyaW5nKCcnJycpID0gIicrcysnIicpOworCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoSFVHRV9URVNUX1NUUklORyk7CisgIEV4cGVjdCggbGVuZ3RoKHMpID0gbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpLAorICAgICAgICAgICd0ZXN0U3RyaW5nKCBsZW5ndGgoSFVHRV9URVNUX1NUUklORykgPSAnK0ludFRvU3RyKExlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSkrJykgJworICAgICAgICAgKyc9PiBsZW5ndGgocmVzdWx0KSA9ICcrSW50VG9TdHIoTGVuZ3RoKHMpKSk7CisKKyAgaTggOj0gY2xpZW50LnRlc3RCeXRlKDEpOworICBFeHBlY3QoIGk4ID0gMSwgJ3Rlc3RCeXRlKDEpID0gJyArIEludFRvU3RyKCBpOCApKTsKKworICBpMzIgOj0gY2xpZW50LnRlc3RJMzIoLTEpOworICBFeHBlY3QoIGkzMiA9IC0xLCAndGVzdEkzMigtMSkgPSAnICsgSW50VG9TdHIoaTMyKSk7CisKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KScpOworICBpNjQgOj0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKKyAgRXhwZWN0KCBpNjQgPSAtMzQzNTk3MzgzNjgsICd0ZXN0STY0KC0zNDM1OTczODM2OCkgPSAnICsgSW50VG9TdHIoIGk2NCkpOworCisgIC8vIHJhbmRvbSBiaW5hcnkgc21hbGwKKyAgZm9yIHRlc3RzaXplIDo9IExvdyhUVGVzdFNpemUpIHRvIEhpZ2goVFRlc3RTaXplKSBkbyBiZWdpbgorICAgIGJpbk91dCA6PSBQcmVwYXJlQmluYXJ5RGF0YSggVFJVRSwgdGVzdHNpemUpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpJyk7CisgICAgdHJ5CisgICAgICBiaW5JbiA6PSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOworICAgICAgRXhwZWN0KCBMZW5ndGgoYmluT3V0KSA9IExlbmd0aChiaW5JbiksICd0ZXN0QmluYXJ5KCk6IGxlbmd0aCAnK0ludFRvU3RyKExlbmd0aChiaW5PdXQpKSsnID0gJytJbnRUb1N0cihMZW5ndGgoYmluSW4pKSk7CisgICAgICBpMzIgOj0gTWluKCBMZW5ndGgoYmluT3V0KSwgTGVuZ3RoKGJpbkluKSk7CisgICAgICBFeHBlY3QoIENvbXBhcmVNZW0oIGJpbk91dCwgYmluSW4sIGkzMiksICd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpID0gJytCeXRlc1RvSGV4KGJpbkluKSk7CisgICAgZXhjZXB0CisgICAgICBvbiBlOlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbyBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgpOiAnK2UuTWVzc2FnZSk7CisgICAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAndGVzdEJpbmFyeSgpOiBVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICAgIGVuZDsKKyAgZW5kOworCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KScpOworICBkdWIgOj0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICBFeHBlY3QoIGFicyhkdWItNS4zMjUwOTgyMzUpIDwgMWUtMTQsICd0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KSA9ICcgKyBGbG9hdFRvU3RyKCBkdWIpKTsKKworICAvLyBzdHJ1Y3RzCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdFN0cnVjdCcsIHRlc3RfU3RydWN0cyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0U3RydWN0KHsnJ1plcm8nJywgMSwgLTMsIC01fSknKTsKKyAgbyA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CisgIG8uU3RyaW5nX3RoaW5nIDo9ICdaZXJvJzsKKyAgby5CeXRlX3RoaW5nIDo9IDE7CisgIG8uSTMyX3RoaW5nIDo9IC0zOworICBvLkk2NF90aGluZyA6PSAtNTsKKyAgaSA6PSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgRXhwZWN0KCBpLlN0cmluZ190aGluZyA9ICdaZXJvJywgJ2kuU3RyaW5nX3RoaW5nID0gIicraS5TdHJpbmdfdGhpbmcrJyInKTsKKyAgRXhwZWN0KCBpLkJ5dGVfdGhpbmcgPSAxLCAnaS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihpLkJ5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkkzMl90aGluZyA9IC0zLCAnaS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JNjRfdGhpbmcgPSAtNSwgJ2kuSTY0X3RoaW5nID0gJytJbnRUb1N0cihpLkk2NF90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICdpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9CeXRlX3RoaW5nLCAnaS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9JMzJfdGhpbmcsICdpLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0kzMl90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9JNjRfdGhpbmcsICdpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOworCisgIC8vIG5lc3RlZCBzdHJ1Y3RzCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE5lc3QnLCB0ZXN0X1N0cnVjdHMpOworICBDb25zb2xlLldyaXRlTGluZSgndGVzdE5lc3QoezEsIHsnJ1plcm8nJywgMSwgLTMsIC01fSwgNX0pJyk7CisgIG8yIDo9IFRYdHJ1Y3QySW1wbC5DcmVhdGU7CisgIG8yLkJ5dGVfdGhpbmcgOj0gMTsKKyAgbzIuU3RydWN0X3RoaW5nIDo9IG87CisgIG8yLkkzMl90aGluZyA6PSA1OworICBpMiA6PSBjbGllbnQudGVzdE5lc3QobzIpOworICBpIDo9IGkyLlN0cnVjdF90aGluZzsKKyAgRXhwZWN0KCBpLlN0cmluZ190aGluZyA9ICdaZXJvJywgJ2kuU3RyaW5nX3RoaW5nID0gIicraS5TdHJpbmdfdGhpbmcrJyInKTsKKyAgRXhwZWN0KCBpLkJ5dGVfdGhpbmcgPSAxLCAgJ2kuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaS5CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JMzJfdGhpbmcgPSAtMywgICdpLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaS5JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkk2NF90aGluZyA9IC01LCAgJ2kuSTY0X3RoaW5nID0gJytJbnRUb1N0cihpLkk2NF90aGluZykpOworICBFeHBlY3QoIGkyLkJ5dGVfdGhpbmcgPSAxLCAnaTIuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaTIuQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkyLkkzMl90aGluZyA9IDUsICAnaTIuSTMyX3RoaW5nID0gJytJbnRUb1N0cihpMi5JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnaS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfQnl0ZV90aGluZywgICdpLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0kzMl90aGluZywgICdpLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0kzMl90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9JNjRfdGhpbmcsICAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgRXhwZWN0KCBpMi5fX2lzc2V0X0J5dGVfdGhpbmcsICdpMi5fX2lzc2V0X0J5dGVfdGhpbmcnKTsKKyAgRXhwZWN0KCBpMi5fX2lzc2V0X0kzMl90aGluZywgICdpMi5fX2lzc2V0X0kzMl90aGluZycpOworCisgIC8vIG1hcDx0eXBlMSx0eXBlMj46IEEgbWFwIG9mIHN0cmljdGx5IHVuaXF1ZSBrZXlzIHRvIHZhbHVlcy4KKyAgLy8gVHJhbnNsYXRlcyB0byBhbiBTVEwgbWFwLCBKYXZhIEhhc2hNYXAsIFBIUCBhc3NvY2lhdGl2ZSBhcnJheSwgUHl0aG9uL1J1YnkgZGljdGlvbmFyeSwgZXRjLgorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNYXAnLCB0ZXN0X0NvbnRhaW5lcnMpOworICBtYXBvdXQgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludGVnZXIsSW50ZWdlcj4uQ3JlYXRlOworICBmb3IgaiA6PSAwIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBtYXBvdXQuQWRkT3JTZXRWYWx1ZSggaiwgaiAtIDEwKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlKCd0ZXN0TWFwKHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGtleSBpbiBtYXBvdXQuS2V5cyBkbworICBiZWdpbgorICAgIGlmIGZpcnN0CisgICAgdGhlbiBmaXJzdCA6PSBGYWxzZQorICAgIGVsc2UgQ29uc29sZS5Xcml0ZSggJywgJyApOworICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBrZXkpICsgJyA9PiAnICsgSW50VG9TdHIoIG1hcG91dFtrZXldKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisKKyAgbWFwaW4gOj0gY2xpZW50LnRlc3RNYXAoIG1hcG91dCApOworICBFeHBlY3QoIG1hcGluLkNvdW50ID0gbWFwb3V0LkNvdW50LCAndGVzdE1hcDogbWFwaW4uQ291bnQgPSBtYXBvdXQuQ291bnQnKTsKKyAgZm9yIGogOj0gMCB0byA0IGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBtYXBvdXQuQ29udGFpbnNLZXkoaiksICd0ZXN0TWFwOiBtYXBvdXQuQ29udGFpbnNLZXkoJytJbnRUb1N0cihqKSsnKSA9ICcrQm9vbFRvU3RyaW5nKG1hcG91dC5Db250YWluc0tleShqKSkpOworICBlbmQ7CisgIGZvciBrZXkgaW4gbWFwaW4uS2V5cyBkbworICBiZWdpbgorICAgIEV4cGVjdCggbWFwaW5ba2V5XSA9IG1hcG91dFtrZXldLCAndGVzdE1hcDogJytJbnRUb1N0cihrZXkpICsgJyA9PiAnICsgSW50VG9TdHIoIG1hcGluW2tleV0pKTsKKyAgICBFeHBlY3QoIG1hcGluW2tleV0gPSBrZXkgLSAxMCwgJ3Rlc3RNYXA6IG1hcGluWycrSW50VG9TdHIoa2V5KSsnXSA9ICcrSW50VG9TdHIoIG1hcGluW2tleV0pKTsKKyAgZW5kOworCisKKyAgLy8gbWFwPHR5cGUxLHR5cGUyPjogQSBtYXAgb2Ygc3RyaWN0bHkgdW5pcXVlIGtleXMgdG8gdmFsdWVzLgorICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCBtYXAsIEphdmEgSGFzaE1hcCwgUEhQIGFzc29jaWF0aXZlIGFycmF5LCBQeXRob24vUnVieSBkaWN0aW9uYXJ5LCBldGMuCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdFN0cmluZ01hcCcsIHRlc3RfQ29udGFpbmVycyk7CisgIHN0cm1hcG91dCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLHN0cmluZz4uQ3JlYXRlOworICBmb3IgaiA6PSAwIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBzdHJtYXBvdXQuQWRkT3JTZXRWYWx1ZSggSW50VG9TdHIoaiksIEludFRvU3RyKGogLSAxMCkpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RTdHJpbmdNYXAoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3Igc3Rya2V5IGluIHN0cm1hcG91dC5LZXlzIGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QKKyAgICB0aGVuIGZpcnN0IDo9IEZhbHNlCisgICAgZWxzZSBDb25zb2xlLldyaXRlKCAnLCAnICk7CisgICAgQ29uc29sZS5Xcml0ZSggc3Rya2V5ICsgJyA9PiAnICsgc3RybWFwb3V0W3N0cmtleV0pOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworCisgIHN0cm1hcGluIDo9IGNsaWVudC50ZXN0U3RyaW5nTWFwKCBzdHJtYXBvdXQgKTsKKyAgRXhwZWN0KCBzdHJtYXBpbi5Db3VudCA9IHN0cm1hcG91dC5Db3VudCwgJ3Rlc3RTdHJpbmdNYXA6IHN0cm1hcGluLkNvdW50ID0gc3RybWFwb3V0LkNvdW50Jyk7CisgIGZvciBqIDo9IDAgdG8gNCBkbworICBiZWdpbgorICAgIEV4cGVjdCggc3RybWFwb3V0LkNvbnRhaW5zS2V5KEludFRvU3RyKGopKSwKKyAgICAgICAgICAgICd0ZXN0U3RyaW5nTWFwOiBzdHJtYXBvdXQuQ29udGFpbnNLZXkoJytJbnRUb1N0cihqKSsnKSA9ICcKKyAgICAgICAgICAgICsgQm9vbFRvU3RyaW5nKHN0cm1hcG91dC5Db250YWluc0tleShJbnRUb1N0cihqKSkpKTsKKyAgZW5kOworICBmb3Igc3Rya2V5IGluIHN0cm1hcGluLktleXMgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIHN0cm1hcGluW3N0cmtleV0gPSBzdHJtYXBvdXRbc3Rya2V5XSwgJ3Rlc3RTdHJpbmdNYXA6ICcrc3Rya2V5ICsgJyA9PiAnICsgc3RybWFwaW5bc3Rya2V5XSk7CisgICAgRXhwZWN0KCBzdHJtYXBpbltzdHJrZXldID0gSW50VG9TdHIoIFN0clRvSW50KHN0cmtleSkgLSAxMCksICd0ZXN0U3RyaW5nTWFwOiBzdHJtYXBpblsnK3N0cmtleSsnXSA9ICcrc3RybWFwaW5bc3Rya2V5XSk7CisgIGVuZDsKKworCisgIC8vIHNldDx0eXBlPjogQW4gdW5vcmRlcmVkIHNldCBvZiB1bmlxdWUgZWxlbWVudHMuCisgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIHNldCwgSmF2YSBIYXNoU2V0LCBzZXQgaW4gUHl0aG9uLCBldGMuCisgIC8vIE5vdGU6IFBIUCBkb2VzIG5vdCBzdXBwb3J0IHNldHMsIHNvIGl0IGlzIHRyZWF0ZWQgc2ltaWxhciB0byBhIExpc3QKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U2V0JywgdGVzdF9Db250YWluZXJzKTsKKyAgc2V0b3V0IDo9IFRIYXNoU2V0SW1wbDxJbnRlZ2VyPi5DcmVhdGU7CisgIGZvciBqIDo9IC0yIHRvIDIgZG8KKyAgYmVnaW4KKyAgICBzZXRvdXQuQWRkKCBqICk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZSgndGVzdFNldCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBqIGluIHNldG91dCBkbworICBiZWdpbgorICAgIGlmIGZpcnN0CisgICAgdGhlbiBmaXJzdCA6PSBGYWxzZQorICAgIGVsc2UgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBDb25zb2xlLldyaXRlKEludFRvU3RyKCBqKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisKKyAgc2V0aW4gOj0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKyAgRXhwZWN0KCBzZXRpbi5Db3VudCA9IHNldG91dC5Db3VudCwgJ3Rlc3RTZXQ6IHNldGluLkNvdW50ID0gc2V0b3V0LkNvdW50Jyk7CisgIEV4cGVjdCggc2V0aW4uQ291bnQgPSA1LCAndGVzdFNldDogc2V0aW4uQ291bnQgPSAnK0ludFRvU3RyKHNldGluLkNvdW50KSk7CisgIGZvciBqIDo9IC0yIHRvIDIgZG8gLy8gdW5vcmRlcmVkLCB3ZSBjYW4ndCByZWx5IG9uIHRoZSBvcmRlciA9PiB0ZXN0IGZvciBrbm93biBlbGVtZW50cyBvbmx5CisgIGJlZ2luCisgICAgRXhwZWN0KCBzZXRpbi5Db250YWlucyhqKSwgJ3Rlc3RTZXQ6IHNldGluLkNvbnRhaW5zKCcrSW50VG9TdHIoaikrJykgPT4gJytCb29sVG9TdHJpbmcoc2V0aW4uQ29udGFpbnMoaikpKTsKKyAgZW5kOworCisgIC8vIGxpc3Q8dHlwZT46IEFuIG9yZGVyZWQgbGlzdCBvZiBlbGVtZW50cy4KKyAgLy8gVHJhbnNsYXRlcyB0byBhbiBTVEwgdmVjdG9yLCBKYXZhIEFycmF5TGlzdCwgbmF0aXZlIGFycmF5cyBpbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCBldGMuCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdExpc3QnLCB0ZXN0X0NvbnRhaW5lcnMpOworICBsaXN0b3V0IDo9IFRUaHJpZnRMaXN0SW1wbDxJbnRlZ2VyPi5DcmVhdGU7CisgIGxpc3RvdXQuQWRkKCArMSk7CisgIGxpc3RvdXQuQWRkKCAtMik7CisgIGxpc3RvdXQuQWRkKCArMyk7CisgIGxpc3RvdXQuQWRkKCAtNCk7CisgIGxpc3RvdXQuQWRkKCAwKTsKKyAgQ29uc29sZS5Xcml0ZSgndGVzdExpc3QoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3IgaiBpbiBsaXN0b3V0IGRvCisgICAgYmVnaW4KKyAgICBpZiBmaXJzdAorICAgIHRoZW4gZmlyc3QgOj0gRmFsc2UKKyAgICBlbHNlIENvbnNvbGUuV3JpdGUoJywgJyk7CisgICAgQ29uc29sZS5Xcml0ZShJbnRUb1N0ciggaikpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworCisgIGxpc3RpbiA6PSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7CisgIEV4cGVjdCggbGlzdGluLkNvdW50ID0gbGlzdG91dC5Db3VudCwgJ3Rlc3RMaXN0OiBsaXN0aW4uQ291bnQgPSBsaXN0b3V0LkNvdW50Jyk7CisgIEV4cGVjdCggbGlzdGluLkNvdW50ID0gNSwgJ3Rlc3RMaXN0OiBsaXN0aW4uQ291bnQgPSAnK0ludFRvU3RyKGxpc3Rpbi5Db3VudCkpOworICBFeHBlY3QoIGxpc3RpblswXSA9ICsxLCAnbGlzdGluWzBdID0gJytJbnRUb1N0ciggbGlzdGluWzBdKSk7CisgIEV4cGVjdCggbGlzdGluWzFdID0gLTIsICdsaXN0aW5bMV0gPSAnK0ludFRvU3RyKCBsaXN0aW5bMV0pKTsKKyAgRXhwZWN0KCBsaXN0aW5bMl0gPSArMywgJ2xpc3RpblsyXSA9ICcrSW50VG9TdHIoIGxpc3RpblsyXSkpOworICBFeHBlY3QoIGxpc3RpblszXSA9IC00LCAnbGlzdGluWzNdID0gJytJbnRUb1N0ciggbGlzdGluWzNdKSk7CisgIEV4cGVjdCggbGlzdGluWzRdID0gMCwgICdsaXN0aW5bNF0gPSAnK0ludFRvU3RyKCBsaXN0aW5bNF0pKTsKKworICAvLyBlbnVtcworICByZXQgOj0gY2xpZW50LnRlc3RFbnVtKFROdW1iZXJ6Lk9ORSk7CisgIEV4cGVjdCggcmV0ID0gVE51bWJlcnouT05FLCAndGVzdEVudW0oT05FKSA9ICcrSW50VG9TdHIoT3JkKHJldCkpKTsKKworICByZXQgOj0gY2xpZW50LnRlc3RFbnVtKFROdW1iZXJ6LlRXTyk7CisgIEV4cGVjdCggcmV0ID0gVE51bWJlcnouVFdPLCAndGVzdEVudW0oVFdPKSA9ICcrSW50VG9TdHIoT3JkKHJldCkpKTsKKworICByZXQgOj0gY2xpZW50LnRlc3RFbnVtKFROdW1iZXJ6LlRIUkVFKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5USFJFRSwgJ3Rlc3RFbnVtKFRIUkVFKSA9ICcrSW50VG9TdHIoT3JkKHJldCkpKTsKKworICByZXQgOj0gY2xpZW50LnRlc3RFbnVtKFROdW1iZXJ6LkZJVkUpOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6LkZJVkUsICd0ZXN0RW51bShGSVZFKSA9ICcrSW50VG9TdHIoT3JkKHJldCkpKTsKKworICByZXQgOj0gY2xpZW50LnRlc3RFbnVtKFROdW1iZXJ6LkVJR0hUKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5FSUdIVCwgJ3Rlc3RFbnVtKEVJR0hUKSA9ICcrSW50VG9TdHIoT3JkKHJldCkpKTsKKworCisgIC8vIHR5cGVkZWYKKyAgdWlkIDo9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpOworICBFeHBlY3QoIHVpZCA9IDMwOTg1ODIzNTA4MjUyMywgJ3Rlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykgPSAnK0ludFRvU3RyKHVpZCkpOworCisKKyAgLy8gbWFwcyBvZiBtYXBzCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE1hcE1hcCgxKScsIHRlc3RfQ29udGFpbmVycyk7CisgIG1tIDo9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICBDb25zb2xlLldyaXRlKCcgPSB7Jyk7CisgIGZvciBrZXkgaW4gbW0uS2V5cyBkbworICBiZWdpbgorICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBrZXkpICsgJyA9PiB7Jyk7CisgICAgbTIgOj0gbW1ba2V5XTsKKyAgICBmb3IgIGsyIGluIG0yLktleXMgZG8KKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGsyKSArICcgPT4gJyArIEludFRvU3RyKCBtMltrMl0pICsgJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoJ30sICcpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9Jyk7CisKKyAgLy8gdmVyaWZ5IHJlc3VsdCBkYXRhCisgIEV4cGVjdCggbW0uQ291bnQgPSAyLCAnbW0uQ291bnQgPSAnK0ludFRvU3RyKG1tLkNvdW50KSk7CisgIHBvcyA6PSBtbVs0XTsKKyAgbmVnIDo9IG1tWy00XTsKKyAgZm9yIGogOj0gMSB0byA0IGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBwb3Nbal0gID0gaiwgICdwb3Nbal0gID0gJytJbnRUb1N0cihwb3Nbal0pKTsKKyAgICBFeHBlY3QoIG5lZ1stal0gPSAtaiwgJ25lZ1stal0gPSAnK0ludFRvU3RyKG5lZ1stal0pKTsKKyAgZW5kOworCisKKworICAvLyBpbnNhbml0eQorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RJbnNhbml0eScsIHRlc3RfU3RydWN0cyk7CisgIGluc2FuZSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKKyAgaW5zYW5lLlVzZXJNYXAgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFROdW1iZXJ6LCBJbnQ2ND4uQ3JlYXRlOworICBpbnNhbmUuVXNlck1hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5GSVZFLCA1MDAwKTsKKyAgdHJ1Y2sgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICB0cnVjay5TdHJpbmdfdGhpbmcgOj0gJ1RydWNrJzsKKyAgdHJ1Y2suQnl0ZV90aGluZyA6PSAtODsgIC8vIGJ5dGUgaXMgc2lnbmVkCisgIHRydWNrLkkzMl90aGluZyA6PSAzMjsKKyAgdHJ1Y2suSTY0X3RoaW5nIDo9IDY0OworICBpbnNhbmUuWHRydWN0cyA6PSBUVGhyaWZ0TGlzdEltcGw8SVh0cnVjdD4uQ3JlYXRlOworICBpbnNhbmUuWHRydWN0cy5BZGQoIHRydWNrICk7CisgIHdob2EgOj0gY2xpZW50LnRlc3RJbnNhbml0eSggaW5zYW5lICk7CisgIENvbnNvbGUuV3JpdGUoJyA9IHsnKTsKKyAgZm9yIGtleTY0IGluIHdob2EuS2V5cyBkbworICBiZWdpbgorICAgIHZhbCA6PSB3aG9hW2tleTY0XTsKKyAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0cigga2V5NjQpICsgJyA9PiB7Jyk7CisgICAgZm9yIGsyXzIgaW4gdmFsLktleXMgZG8KKyAgICBiZWdpbgorICAgICAgdjIgOj0gdmFsW2syXzJdOworICAgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIEludGVnZXIoIGsyXzIpKSArICcgPT4geycpOworICAgICAgdXNlck1hcCA6PSB2Mi5Vc2VyTWFwOworICAgICAgQ29uc29sZS5Xcml0ZSgneycpOworICAgICAgaWYgdXNlck1hcCA8PiBuaWwgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgZm9yIGszIGluIHVzZXJNYXAuS2V5cyBkbworICAgICAgICBiZWdpbgorICAgICAgICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBJbnRlZ2VyKCBrMykpICsgJyA9PiAnICsgSW50VG9TdHIoIHVzZXJNYXBbazNdKSArICcsICcpOworICAgICAgICBlbmQ7CisgICAgICBlbmQgZWxzZQorICAgICAgYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZSgnbnVsbCcpOworICAgICAgZW5kOworICAgICAgQ29uc29sZS5Xcml0ZSgnfSwgJyk7CisgICAgICB4dHJ1Y3RzIDo9IHYyLlh0cnVjdHM7CisgICAgICBDb25zb2xlLldyaXRlKCd7Jyk7CisKKyAgICAgIGlmIHh0cnVjdHMgPD4gbmlsIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIGZvciB4IGluIHh0cnVjdHMgZG8KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBDb25zb2xlLldyaXRlKCd7IicgKyB4LlN0cmluZ190aGluZyArICciLCAnICsKKyAgICAgICAgICAgIEludFRvU3RyKCB4LkJ5dGVfdGhpbmcpICsgJywgJyArCisgICAgICAgICAgICBJbnRUb1N0ciggeC5JMzJfdGhpbmcpICsgJywgJyArCisgICAgICAgICAgICBJbnRUb1N0ciggeC5JMzJfdGhpbmcpICsgJ30sICcpOworICAgICAgICBlbmQ7CisgICAgICBlbmQgZWxzZQorICAgICAgYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZSgnbnVsbCcpOworICAgICAgZW5kOworICAgICAgQ29uc29sZS5Xcml0ZSgnfScpOworICAgICAgQ29uc29sZS5Xcml0ZSgnfSwgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoJ30sICcpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9Jyk7CisKKyAgKCoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKikKKworICAvLyB2ZXJpZnkgcmVzdWx0IGRhdGEKKyAgRXhwZWN0KCB3aG9hLkNvdW50ID0gMiwgJ3dob2EuQ291bnQgPSAnK0ludFRvU3RyKHdob2EuQ291bnQpKTsKKyAgLy8KKyAgZmlyc3RfbWFwICA6PSB3aG9hWzFdOworICBzZWNvbmRfbWFwIDo9IHdob2FbMl07CisgIEV4cGVjdCggZmlyc3RfbWFwLkNvdW50ID0gMiwgJ2ZpcnN0X21hcC5Db3VudCA9ICcrSW50VG9TdHIoZmlyc3RfbWFwLkNvdW50KSk7CisgIEV4cGVjdCggc2Vjb25kX21hcC5Db3VudCA9IDEsICdzZWNvbmRfbWFwLkNvdW50ID0gJytJbnRUb1N0cihzZWNvbmRfbWFwLkNvdW50KSk7CisgIC8vCisgIGxvb25leSA6PSBzZWNvbmRfbWFwW1ROdW1iZXJ6LlNJWF07CisgIEV4cGVjdCggQXNzaWduZWQobG9vbmV5KSwgJ0Fzc2lnbmVkKGxvb25leSkgPSAnK0Jvb2xUb1N0cmluZyhBc3NpZ25lZChsb29uZXkpKSk7CisgIEV4cGVjdCggbm90IGxvb25leS5fX2lzc2V0X1VzZXJNYXAsICdsb29uZXkuX19pc3NldF9Vc2VyTWFwID0gJytCb29sVG9TdHJpbmcobG9vbmV5Ll9faXNzZXRfVXNlck1hcCkpOworICBFeHBlY3QoIG5vdCBsb29uZXkuX19pc3NldF9YdHJ1Y3RzLCAnbG9vbmV5Ll9faXNzZXRfWHRydWN0cyA9ICcrQm9vbFRvU3RyaW5nKGxvb25leS5fX2lzc2V0X1h0cnVjdHMpKTsKKyAgLy8KKyAgZm9yIHJldCBpbiBbVE51bWJlcnouVFdPLCBUTnVtYmVyei5USFJFRV0gZG8gYmVnaW4KKyAgICBjcmF6eSA6PSBmaXJzdF9tYXBbcmV0XTsKKyAgICBDb25zb2xlLldyaXRlTGluZSgnZmlyc3RfbWFwWycraW50VG9TdHIoT3JkKHJldCkpKyddJyk7CisKKyAgICBFeHBlY3QoIGNyYXp5Ll9faXNzZXRfVXNlck1hcCwgJ2NyYXp5Ll9faXNzZXRfVXNlck1hcCA9ICcrQm9vbFRvU3RyaW5nKGNyYXp5Ll9faXNzZXRfVXNlck1hcCkpOworICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9YdHJ1Y3RzLCAnY3JhenkuX19pc3NldF9YdHJ1Y3RzID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9YdHJ1Y3RzKSk7CisKKyAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXAuQ291bnQgPSBpbnNhbmUuVXNlck1hcC5Db3VudCwgJ2NyYXp5LlVzZXJNYXAuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXAuQ291bnQpKTsKKyAgICBmb3IgcGFpciBpbiBpbnNhbmUuVXNlck1hcCBkbyBiZWdpbgorICAgICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwW3BhaXIuS2V5XSA9IHBhaXIuVmFsdWUsICdjcmF6eS5Vc2VyTWFwWycrSW50VG9TdHIoT3JkKHBhaXIua2V5KSkrJ10gPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXBbcGFpci5LZXldKSk7CisgICAgZW5kOworCisgICAgRXhwZWN0KCBjcmF6eS5YdHJ1Y3RzLkNvdW50ID0gaW5zYW5lLlh0cnVjdHMuQ291bnQsICdjcmF6eS5YdHJ1Y3RzLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5YdHJ1Y3RzLkNvdW50KSk7CisgICAgZm9yIGFyZzAgOj0gMCB0byBpbnNhbmUuWHRydWN0cy5Db3VudC0xIGRvIGJlZ2luCisgICAgICBoZWxsbyAgIDo9IGluc2FuZS5YdHJ1Y3RzW2FyZzBdOworICAgICAgZ29vZGJ5ZSA6PSBjcmF6eS5YdHJ1Y3RzW2FyZzBdOworICAgICAgRXhwZWN0KCBnb29kYnllLlN0cmluZ190aGluZyA9IGhlbGxvLlN0cmluZ190aGluZywgJ2dvb2RieWUuU3RyaW5nX3RoaW5nID0gJytnb29kYnllLlN0cmluZ190aGluZyk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuQnl0ZV90aGluZyA9IGhlbGxvLkJ5dGVfdGhpbmcsICdnb29kYnllLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuQnl0ZV90aGluZykpOworICAgICAgRXhwZWN0KCBnb29kYnllLkkzMl90aGluZyA9IGhlbGxvLkkzMl90aGluZywgJ2dvb2RieWUuSTMyX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkkzMl90aGluZykpOworICAgICAgRXhwZWN0KCBnb29kYnllLkk2NF90aGluZyA9IGhlbGxvLkk2NF90aGluZywgJ2dvb2RieWUuSTY0X3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkk2NF90aGluZykpOworICAgIGVuZDsKKyAgZW5kOworCisKKyAgLy8gbXVsdGkgYXJncworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aScsIHRlc3RfQmFzZVR5cGVzKTsKKyAgYXJnMCA6PSAxOworICBhcmcxIDo9IDI7CisgIGFyZzIgOj0gSGlnaChJbnQ2NCk7CisgIGFyZzMgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFNtYWxsSW50LCBzdHJpbmc+LkNyZWF0ZTsKKyAgYXJnMy5BZGRPclNldFZhbHVlKCAxLCAnb25lJyk7CisgIGFyZzQgOj0gVE51bWJlcnouRklWRTsKKyAgYXJnNSA6PSA1MDAwMDAwOworICBDb25zb2xlLldyaXRlTGluZSgnVGVzdCBNdWx0aSgnICsgSW50VG9TdHIoIGFyZzApICsgJywnICsKKyAgICBJbnRUb1N0ciggYXJnMSkgKyAnLCcgKyBJbnRUb1N0ciggYXJnMikgKyAnLCcgKworICAgIGFyZzMuVG9TdHJpbmcgKyAnLCcgKyBJbnRUb1N0ciggSW50ZWdlciggYXJnNCkpICsgJywnICsKKyAgICAgIEludFRvU3RyKCBhcmc1KSArICcpJyk7CisKKyAgaSA6PSBjbGllbnQudGVzdE11bHRpKCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgRXhwZWN0KCBpLlN0cmluZ190aGluZyA9ICdIZWxsbzInLCAndGVzdE11bHRpOiBpLlN0cmluZ190aGluZyA9ICInK2kuU3RyaW5nX3RoaW5nKyciJyk7CisgIEV4cGVjdCggaS5CeXRlX3RoaW5nID0gYXJnMCwgJ3Rlc3RNdWx0aTogaS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihpLkJ5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkkzMl90aGluZyA9IGFyZzEsICd0ZXN0TXVsdGk6IGkuSTMyX3RoaW5nID0gJytJbnRUb1N0cihpLkkzMl90aGluZykpOworICBFeHBlY3QoIGkuSTY0X3RoaW5nID0gYXJnMiwgJ3Rlc3RNdWx0aTogaS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTY0X3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X1N0cmluZ190aGluZywgJ3Rlc3RNdWx0aTogaS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfQnl0ZV90aGluZywgJ3Rlc3RNdWx0aTogaS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9JMzJfdGhpbmcsICd0ZXN0TXVsdGk6IGkuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0k2NF90aGluZywgJ3Rlc3RNdWx0aTogaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKKworICAvLyBtdWx0aSBleGNlcHRpb24KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oMSknLCB0ZXN0X0V4Y2VwdGlvbnMpOworICB0cnkKKyAgICBpIDo9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oICduZWVkIG1vcmUgcGl6emEnLCAncnVuIG91dCBvZiBiZWVyJyk7CisgICAgRXhwZWN0KCBpLlN0cmluZ190aGluZyA9ICdydW4gb3V0IG9mIGJlZXInLCAnaS5TdHJpbmdfdGhpbmcgPSAiJyAraS5TdHJpbmdfdGhpbmcrICciJyk7CisgICAgRXhwZWN0KCBpLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnaS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKKyAgICB7IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUsIHRoZXNlIGZpZWxkcyBhcmUgZGVmYXVsdC1zZXJpYWxpemVkCisgICAgRXhwZWN0KCBub3QgaS5fX2lzc2V0X0J5dGVfdGhpbmcsICdpLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgICAgRXhwZWN0KCBub3QgaS5fX2lzc2V0X0kzMl90aGluZywgJ2kuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgICAgRXhwZWN0KCBub3QgaS5fX2lzc2V0X0k2NF90aGluZywgJ2kuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTY0X3RoaW5nKSk7CisgICAgfQorICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKFhjZXB0aW9uKScsIHRlc3RfRXhjZXB0aW9ucyk7CisgIHRyeQorICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ1hjZXB0aW9uJywgJ3NlY29uZCB0ZXN0Jyk7CisgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RNdWx0aUV4Y2VwdGlvbignJ1hjZXB0aW9uJycpOiBtdXN0IHRyb3cgYW4gZXhjZXB0aW9uJyk7CisgIGV4Y2VwdAorICAgIG9uIHg6VFhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIHguX19pc3NldF9FcnJvckNvZGUsICd4Ll9faXNzZXRfRXJyb3JDb2RlID0gJytCb29sVG9TdHJpbmcoeC5fX2lzc2V0X0Vycm9yQ29kZSkpOworICAgICAgRXhwZWN0KCB4Ll9faXNzZXRfTWVzc2FnZV8sICAneC5fX2lzc2V0X01lc3NhZ2VfID0gJytCb29sVG9TdHJpbmcoeC5fX2lzc2V0X01lc3NhZ2VfKSk7CisgICAgICBFeHBlY3QoIHguRXJyb3JDb2RlID0gMTAwMSwgJ3guRXJyb3JDb2RlID0gJytJbnRUb1N0cih4LkVycm9yQ29kZSkpOworICAgICAgRXhwZWN0KCB4Lk1lc3NhZ2VfID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nLCAneC5NZXNzYWdlID0gIicreC5NZXNzYWdlXysnIicpOworICAgIGVuZDsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKFhjZXB0aW9uMiknLCB0ZXN0X0V4Y2VwdGlvbnMpOworICB0cnkKKyAgICBpIDo9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oICdYY2VwdGlvbjInLCAndGhpcmQgdGVzdCcpOworICAgIEV4cGVjdCggRkFMU0UsICd0ZXN0TXVsdGlFeGNlcHRpb24oJydYY2VwdGlvbjInJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24geDpUWGNlcHRpb24yIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIHguX19pc3NldF9FcnJvckNvZGUsICd4Ll9faXNzZXRfRXJyb3JDb2RlID0gJytCb29sVG9TdHJpbmcoeC5fX2lzc2V0X0Vycm9yQ29kZSkpOworICAgICAgRXhwZWN0KCB4Ll9faXNzZXRfU3RydWN0X3RoaW5nLCAgJ3guX19pc3NldF9TdHJ1Y3RfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfU3RydWN0X3RoaW5nKSk7CisgICAgICBFeHBlY3QoIHguRXJyb3JDb2RlID0gMjAwMiwgJ3guRXJyb3JDb2RlID0gJytJbnRUb1N0cih4LkVycm9yQ29kZSkpOworICAgICAgRXhwZWN0KCB4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInLCAneC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gIicreC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nKyciJyk7CisgICAgICBFeHBlY3QoIHguU3RydWN0X3RoaW5nLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAneC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X1N0cmluZ190aGluZykpOworICAgICAgeyB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlLCB0aGVzZSBmaWVsZHMgYXJlIGRlZmF1bHQtc2VyaWFsaXplZAorICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9CeXRlX3RoaW5nLCAneC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIG5vdCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X0kzMl90aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggbm90IHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nLCAneC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZykpOworICAgICAgfQorICAgIGVuZDsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworCisKKyAgLy8gb25ld2F5IGZ1bmN0aW9ucworICBTdGFydFRlc3RHcm91cCggJ1Rlc3QgT25ld2F5KDEpJywgdGVzdF9Vbmtub3duKTsKKyAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CisgIEV4cGVjdCggVFJVRSwgJ1Rlc3QgT25ld2F5KDEpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgorCisgIC8vIGNhbGwgdGltZQorICB7JElGREVGIFBlcmZUZXN0fQorICBTdGFydFRlc3RHcm91cCggJ1Rlc3QgQ2FsbHRpbWUoKScpOworICBTdGFydFRpY2sgOj0gR2V0VGlja0NvdW50OworICBmb3IgayA6PSAwIHRvIDEwMDAgLSAxIGRvCisgIGJlZ2luCisgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJyA9ICcgKyBGbG9hdFRvU3RyKCAoR2V0VGlja0NvdW50IC0gU3RhcnRUaWNrKSAvIDEwMDAgKSArICcgbXMgYSB0ZXN0Vm9pZCgpIGNhbGwnICk7CisgIHskRU5ESUYgUGVyZlRlc3R9CisKKyAgLy8gbm8gbW9yZSB0ZXN0cyBoZXJlCisgIFN0YXJ0VGVzdEdyb3VwKCAnJywgdGVzdF9Vbmtub3duKTsKK2VuZDsKKworCit7JElGREVGIFN1cHBvcnRzQXN5bmN9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5DbGllbnRBc3luY1Rlc3Q7Cit2YXIKKyAgY2xpZW50IDogVFRocmlmdFRlc3QuSUFzeW5jOworICBzIDogc3RyaW5nOworICBpOCA6IFNob3J0SW50OworYmVnaW4KKyAgU3RhcnRUZXN0R3JvdXAoICdBc3luYyBUZXN0cycsIHRlc3RfVW5rbm93bik7CisgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKKyAgRlRyYW5zcG9ydC5PcGVuOworCisgIC8vIG9uZXdheSB2b2lkIGZ1bmN0aW9ucworICBjbGllbnQudGVzdE9uZXdheUFzeW5jKDEpLldhaXQ7CisgIEV4cGVjdCggVFJVRSwgJ1Rlc3QgT25ld2F5KDEpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgorCisgIC8vIG5vcm1hbCBmdW5jdGlvbnMKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZ0FzeW5jKEhVR0VfVEVTVF9TVFJJTkcpLlZhbHVlOworICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKKyAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKKyAgICAgICAgICsnPT4gbGVuZ3RoKHJlc3VsdCkgPSAnK0ludFRvU3RyKExlbmd0aChzKSkpOworCisgIGk4IDo9IGNsaWVudC50ZXN0Qnl0ZSgxKS5WYWx1ZTsKKyAgRXhwZWN0KCBpOCA9IDEsICd0ZXN0Qnl0ZSgxKSA9ICcgKyBJbnRUb1N0ciggaTggKSk7CitlbmQ7Cit7JEVORElGfQorCisKK3skSUZERUYgU3RyZXNzVGVzdH0KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOworYmVnaW4KKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIHRyeQorICAgICAgaWYgbm90IEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAorICAgICAgdHJ5CisgICAgICAgIGNsaWVudC50ZXN0U3RyaW5nKCdUZXN0Jyk7CisgICAgICAgIFdyaXRlKCcuJyk7CisgICAgICBmaW5hbGx5CisgICAgICAgIGlmIEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5DbG9zZTsKKyAgICAgIGVuZDsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIFdyaXRlbG4oIzEwK2UubWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7Cit7JEVORElGfQorCisKK2Z1bmN0aW9uIFRDbGllbnRUaHJlYWQuUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbjsgYVNpemUgOiBUVGVzdFNpemUpIDogVEJ5dGVzOwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgY2FzZSBhU2l6ZSBvZgorICAgIEVtcHR5ICAgICAgICAgIDogU2V0TGVuZ3RoKCByZXN1bHQsIDApOworICAgIE5vcm1hbCAgICAgICAgIDogU2V0TGVuZ3RoKCByZXN1bHQsICQxMDApOworICAgIEJ5dGVBcnJheVRlc3QgIDogU2V0TGVuZ3RoKCByZXN1bHQsIFNpemVPZihUQnl0ZUFycmF5KSArIDEyOCk7CisgICAgUGlwZVdyaXRlTGltaXQgOiBTZXRMZW5ndGgoIHJlc3VsdCwgNjU1MzUgKyAxMjgpOworICBlbHNlCisgICAgcmFpc2UgRUFyZ3VtZW50RXhjZXB0aW9uLkNyZWF0ZSgnYVNpemUnKTsKKyAgZW5kOworCisgIEFTU0VSVCggTG93KHJlc3VsdCkgPSAwKTsKKyAgaWYgTGVuZ3RoKHJlc3VsdCkgPSAwIHRoZW4gRXhpdDsKKworICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICBpZiBub3QgYVJhbmRvbURpc3QgdGhlbiBiZWdpbgorICAgIGZvciBpIDo9IExvdyhyZXN1bHQpIHRvIEhpZ2gocmVzdWx0KSBkbyBiZWdpbgorICAgICAgcmVzdWx0W2ldIDo9IGkgbW9kICQxMDA7CisgICAgZW5kOworICAgIEV4aXQ7CisgIGVuZDsKKworICAvLyByYW5kb20gZGlzdHJpYnV0aW9uIG9mIGFsbCAyNTYgdmFsdWVzCisgIEZpbGxDaGFyKCByZXN1bHRbMF0sIExlbmd0aChyZXN1bHQpICogU2l6ZU9mKHJlc3VsdFswXSksICQwKTsKKyAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCisgICAgcmVzdWx0W2ldIDo9IEJ5dGUoIFJhbmRvbSgkMTAwKSk7CisgIGVuZDsKK2VuZDsKKworCit7JElGREVGIFdpbjY0fQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OwordmFyIGEsYiA6IEludDY0OworYmVnaW4KKyAgYSA6PSAxOworICBiIDo9IDI7CisgIFRocmlmdC5VdGlscy5JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIGEsYik7CisgIEV4cGVjdCggYSA9IDMsICdJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKKy8vIFRlc3RzIG9ubHkgdGhlbiByZWFkL3dyaXRlIHByb2NlZHVyZXMgb2YgdGhlIEpTT04gcHJvdG9jb2wKKy8vIEFsbCB0ZXN0cyBzdWNjZWVkLCBpZiB3ZSBjYW4gcmVhZCB3aGF0IHdlIHdyb3RlIGJlZm9yZQorLy8gTm90ZSB0aGF0IHBhc3NpbmcgdGhpcyB0ZXN0IGRvZXMgbm90IGltcGx5LCB0aGF0IG91ciBKU09OIGlzIHJlYWxseSBjb21wYXRpYmxlIHRvIHdoYXQKKy8vIG90aGVyIGNsaWVudHMgb3Igc2VydmVycyBleHBlY3QgYXMgdGhlIHJlYWwgSlNPTi4gVGhpcyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgdGVzdC4KK3ZhciBwcm90ICAgOiBJUHJvdG9jb2w7CisgICAgc3RtICAgIDogVFN0cmluZ1N0cmVhbTsKKyAgICBsaXN0ICAgOiBUVGhyaWZ0TGlzdDsKKyAgICBiaW5hcnksIGJpblJlYWQsIGVtcHR5QmluYXJ5IDogVEJ5dGVzOworICAgIGksaUVyciA6IEludGVnZXI7Citjb25zdAorICBURVNUX1NIT1JUICAgPSBTaG9ydEludCggJEZFKTsKKyAgVEVTVF9TTUFMTCAgID0gU21hbGxJbnQoICRGRURDKTsKKyAgVEVTVF9MT05HICAgID0gTG9uZ0ludCggJEZFRENCQTk4KTsKKyAgVEVTVF9JNjQgICAgID0gSW50NjQoICRGRURDQkE5ODc2NTQzMjEwKTsKKyAgVEVTVF9ET1VCTEUgID0gLTEuMjM0ZS01NjsKKyAgREVMVEFfRE9VQkxFID0gVEVTVF9ET1VCTEUgKiAxZS0xNDsKKyAgVEVTVF9TVFJJTkcgID0gJ2FiYy0nIyQwMEU0IyQwMGY2IyQwMGZjOyAvLyBnZXJtYW4gdW1sYXV0cyAoZW4tdXM6ICJmdW5ueSBjaGFycyIpCisgIC8vIFRlc3QgVEhSSUZULTIzMzYgYW5kIFRIUklGVC0zNDA0IHdpdGggVSsxRDExRSAoRyBDbGVmIHN5bWJvbCkgYW5kICfQoNGD0YHRgdC60L7QtSDQndCw0LfQstCw0L3QuNC1JzsKKyAgR19DTEVGX0FORF9DWVJJTExJQ19URVhUID0gIyQxZDExZScgJyMkMDQyMCMkMDQ0MyMkMDQ0MSMkMDQ0MSMkMDQzYSMkMDQzZSMkMDQzNScgJyMkMDQxZCMkMDQzMCMkMDQzNyMkMDQzMiMkMDQzMCMkMDQzZCMkMDQzOCMkMDQzNTsKKyAgR19DTEVGX0FORF9DWVJJTExJQ19KU09OID0gJyJcdWQ4MzRcdWRkMWUgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDNlXHUwNDM1IFx1MDQxZFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzZFx1MDQzOFx1MDQzNSInOworICAvLyB0ZXN0IGJvdGggcG9zc2libGUgc29saWR1cyBlbmNvZGluZ3MKKyAgU09MSURVU19KU09OX0RBVEEgPSAnIm9uZS90d29cL3RocmVlIic7CisgIFNPTElEVVNfRVhDUEVDVEVEID0gJ29uZS90d28vdGhyZWUnOworYmVnaW4KKyAgc3RtICA6PSBUU3RyaW5nU3RyZWFtLkNyZWF0ZTsKKyAgdHJ5CisgICAgU3RhcnRUZXN0R3JvdXAoICdKc29uUHJvdG9jb2xUZXN0JywgdGVzdF9Vbmtub3duKTsKKworICAgIC8vIHByZXBhcmUgYmluYXJ5IGRhdGEKKyAgICBiaW5hcnkgOj0gUHJlcGFyZUJpbmFyeURhdGEoIEZBTFNFLCBOb3JtYWwpOworICAgIFNldExlbmd0aCggZW1wdHlCaW5hcnksIDApOyAvLyBlbXB0eSBiaW5hcnkgZGF0YSBibG9jaworCisgICAgLy8gb3V0cHV0IHNldHVwCisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBuaWwsIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSkpKTsKKworICAgIC8vIHdyaXRlCisgICAgSW5pdCggbGlzdCwgVFR5cGUuU3RyaW5nXywgOSk7CisgICAgcHJvdC5Xcml0ZUxpc3RCZWdpbiggbGlzdCk7CisgICAgcHJvdC5Xcml0ZUJvb2woIFRSVUUpOworICAgIHByb3QuV3JpdGVCb29sKCBGQUxTRSk7CisgICAgcHJvdC5Xcml0ZUJ5dGUoIFRFU1RfU0hPUlQpOworICAgIHByb3QuV3JpdGVJMTYoIFRFU1RfU01BTEwpOworICAgIHByb3QuV3JpdGVJMzIoIFRFU1RfTE9ORyk7CisgICAgcHJvdC5Xcml0ZUk2NCggVEVTVF9JNjQpOworICAgIHByb3QuV3JpdGVEb3VibGUoIFRFU1RfRE9VQkxFKTsKKyAgICBwcm90LldyaXRlU3RyaW5nKCBURVNUX1NUUklORyk7CisgICAgcHJvdC5Xcml0ZUJpbmFyeSggYmluYXJ5KTsKKyAgICBwcm90LldyaXRlU3RyaW5nKCAnJyk7ICAvLyBlbXB0eSBzdHJpbmcKKyAgICBwcm90LldyaXRlQmluYXJ5KCBlbXB0eUJpbmFyeSk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCisgICAgcHJvdC5Xcml0ZUxpc3RFbmQ7CisKKyAgICAvLyBpbnB1dCBzZXR1cAorICAgIEV4cGVjdCggc3RtLlBvc2l0aW9uID0gc3RtLlNpemUsICdTdHJlYW0gcG9zaXRpb24vbGVuZ3RoIGFmdGVyIHdyaXRlJyk7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKworICAgIC8vIHJlYWQgYW5kIGNvbXBhcmUKKyAgICBsaXN0IDo9IHByb3QuUmVhZExpc3RCZWdpbjsKKyAgICBFeHBlY3QoIGxpc3QuRWxlbWVudFR5cGUgPSBUVHlwZS5TdHJpbmdfLCAnbGlzdCBlbGVtZW50IHR5cGUnKTsKKyAgICBFeHBlY3QoIGxpc3QuQ291bnQgPSA5LCAnbGlzdCBlbGVtZW50IGNvdW50Jyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRCb29sLCAnV3JpdGVCb29sL1JlYWRCb29sOiBUUlVFJyk7CisgICAgRXhwZWN0KCBub3QgcHJvdC5SZWFkQm9vbCwgJ1dyaXRlQm9vbC9SZWFkQm9vbDogRkFMU0UnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEJ5dGUgICA9IFRFU1RfU0hPUlQsICAnV3JpdGVCeXRlL1JlYWRCeXRlJyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRJMTYgICAgPSBURVNUX1NNQUxMLCAgJ1dyaXRlSTE2L1JlYWRJMTYnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEkzMiAgICA9IFRFU1RfTE9ORywgICAnV3JpdGVJMzIvUmVhZEkzMicpOworICAgIEV4cGVjdCggcHJvdC5SZWFkSTY0ICAgID0gVEVTVF9JNjQsICAgICdXcml0ZUk2NC9SZWFkSTY0Jyk7CisgICAgRXhwZWN0KCBhYnMocHJvdC5SZWFkRG91YmxlLVRFU1RfRE9VQkxFKSA8IGFicyhERUxUQV9ET1VCTEUpLCAnV3JpdGVEb3VibGUvUmVhZERvdWJsZScpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gVEVTVF9TVFJJTkcsICdXcml0ZVN0cmluZy9SZWFkU3RyaW5nJyk7CisgICAgYmluUmVhZCA6PSBwcm90LlJlYWRCaW5hcnk7CisgICAgRXhwZWN0KCBMZW5ndGgocHJvdC5SZWFkU3RyaW5nKSA9IDAsICdXcml0ZVN0cmluZy9SZWFkU3RyaW5nIChlbXB0eSBzdHJpbmcpJyk7CisgICAgRXhwZWN0KCBMZW5ndGgocHJvdC5SZWFkQmluYXJ5KSA9IDAsICdlbXB0eSBXcml0ZUJpbmFyeS9SZWFkQmluYXJ5IChlbXB0eSBkYXRhIGJsb2NrKScpOworICAgIHByb3QuUmVhZExpc3RFbmQ7CisKKyAgICAvLyB0ZXN0IGJpbmFyeSBkYXRhCisgICAgRXhwZWN0KCBMZW5ndGgoYmluYXJ5KSA9IExlbmd0aChiaW5SZWFkKSwgJ0JpbmFyeSBkYXRhIGxlbmd0aCBjaGVjaycpOworICAgIGlFcnIgOj0gLTE7CisgICAgZm9yIGkgOj0gTG93KGJpbmFyeSkgdG8gSGlnaChiaW5hcnkpIGRvIGJlZ2luCisgICAgICBpZiBiaW5hcnlbaV0gPD4gYmluUmVhZFtpXSB0aGVuIGJlZ2luCisgICAgICAgIGlFcnIgOj0gaTsKKyAgICAgICAgQnJlYWs7CisgICAgICBlbmQ7CisgICAgZW5kOworICAgIGlmIGlFcnIgPCAwCisgICAgdGhlbiBFeHBlY3QoIFRSVUUsICAnQmluYXJ5IGRhdGEgY2hlY2sgKCcrSW50VG9TdHIoTGVuZ3RoKGJpbmFyeSkpKycgQnl0ZXMpJykKKyAgICBlbHNlIEV4cGVjdCggRkFMU0UsICdCaW5hcnkgZGF0YSBjaGVjayBhdCBvZmZzZXQgJytJbnRUb1N0cihpRXJyKSk7CisKKyAgICBFeHBlY3QoIHN0bS5Qb3NpdGlvbiA9IHN0bS5TaXplLCAnU3RyZWFtIHBvc2l0aW9uIGFmdGVyIHJlYWQnKTsKKworCisgICAgLy8gU29saWR1cyBjYW4gYmUgZW5jb2RlZCBpbiB0d28gd2F5cy4gTWFrZSBzdXJlIHdlIGNhbiByZWFkIGJvdGgKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBzdG0uU2l6ZSAgICAgOj0gMDsKKyAgICBzdG0uV3JpdGVTdHJpbmcoU09MSURVU19KU09OX0RBVEEpOworICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBTT0xJRFVTX0VYQ1BFQ1RFRCwgJ1NvbGlkdXMgZW5jb2RpbmcnKTsKKworCisgICAgLy8gV2lkZWNoYXJzIHNob3VsZCB3b3JrIHRvby4gRG8gdGhleT8KKyAgICAvLyBBZnRlciB3cml0aW5nLCB3ZSBlbnN1cmUgdGhhdCB3ZSBhcmUgYWJsZSB0byByZWFkIGl0IGJhY2sKKyAgICAvLyBXZSBjYW4ndCBhc3N1bWUgaGV4LWVuY29kaW5nLCBzaW5jZSAobmVhcmx5KSBhbnkgVW5pY29kZSBjaGFyIGlzIHZhbGlkIEpTT04KKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBzdG0uU2l6ZSAgICAgOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIG5pbCwgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSkpOworICAgIHByb3QuV3JpdGVTdHJpbmcoIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCk7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCwgJ1dyaXRpbmcgSlNPTiB3aXRoIGNoYXJzID4gOCBiaXQnKTsKKworICAgIC8vIFdpZGVjaGFycyBzaG91bGQgd29yayB3aXRoIGhleC1lbmNvZGluZyB0b28uIERvIHRoZXk/CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgc3RtLlNpemUgICAgIDo9IDA7CisgICAgc3RtLldyaXRlU3RyaW5nKCBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04pOworICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQsICdSZWFkaW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CisKKworICBmaW5hbGx5CisgICAgc3RtLkZyZWU7CisgICAgcHJvdCA6PSBuaWw7ICAvLy0+IFJlbGVhc2UKKyAgICBTdGFydFRlc3RHcm91cCggJycsIHRlc3RfVW5rbm93bik7ICAvLyBubyBtb3JlIHRlc3RzIGhlcmUKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlN0YXJ0VGVzdEdyb3VwKCBjb25zdCBhR3JvdXAgOiBzdHJpbmc7IGNvbnN0IGFUZXN0IDogVFRlc3RHcm91cCk7CitiZWdpbgorICBGVGVzdEdyb3VwIDo9IGFHcm91cDsKKyAgRkN1cnJlbnRUZXN0IDo9IGFUZXN0OworCisgIEluY2x1ZGUoIEZFeGVjdXRlZCwgYVRlc3QpOworCisgIGlmIEZUZXN0R3JvdXAgPD4gJycgdGhlbiBiZWdpbgorICAgIENvbnNvbGUuV3JpdGVMaW5lKCcnKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSggYUdyb3VwKycgdGVzdHMnKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSggU3RyaW5nT2ZDaGFyKCctJyw2MCkpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuRXhwZWN0KCBhVGVzdFJlc3VsdCA6IEJvb2xlYW47IGNvbnN0IGFUZXN0SW5mbyA6IHN0cmluZyk7CitiZWdpbgorICBpZiBhVGVzdFJlc3VsdCAgdGhlbiBiZWdpbgorICAgIEluYyhGU3VjY2Vzc2VzKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSggYVRlc3RJbmZvKyc6IHBhc3NlZCcpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZFcnJvcnMuQWRkKCBGVGVzdEdyb3VwKyc6ICcrYVRlc3RJbmZvKTsKKyAgICBJbmNsdWRlKCBGRmFpbGVkLCBGQ3VycmVudFRlc3QpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBhVGVzdEluZm8rJzogKioqIEZBSUxFRCAqKionKTsKKworICAgIC8vIFdlIGhhdmUgYSBmYWlsZWQgdGVzdCEKKyAgICAvLyAtPiBpc3N1ZSBEZWJ1Z0JyZWFrIE9OTFkgaWYgYSBkZWJ1Z2dlciBpcyBhdHRhY2hlZCwKKyAgICAvLyAtPiB1bmhhbmRsZWQgRGVidWdCcmVha3Mgd291bGQgY2F1c2UgV2luZG93cyB0byB0ZXJtaW5hdGUgdGhlIGFwcCBvdGhlcndpc2UKKyAgICBpZiBJc0RlYnVnZ2VyUHJlc2VudAorICAgIHRoZW4geyRJRkRFRiBDUFVYNjR9IERlYnVnQnJlYWsgeyRFTFNFfSBhc20gaW50IDMgZW5kIHskRU5ESUZ9OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuUmVwb3J0UmVzdWx0czsKK3ZhciBuVG90YWwgOiBJbnRlZ2VyOworICAgIHNMaW5lIDogc3RyaW5nOworYmVnaW4KKyAgLy8gcHJldmVudCB1cyBmcm9tIHN0dXBpZCBESVYvMCBlcnJvcnMKKyAgblRvdGFsIDo9IEZTdWNjZXNzZXMgKyBGRXJyb3JzLkNvdW50OworICBpZiBuVG90YWwgPSAwIHRoZW4gYmVnaW4KKyAgICBDb25zb2xlLldyaXRlTGluZSgnTm8gcmVzdWx0cyBsb2dnZWQnKTsKKyAgICBFeGl0OworICBlbmQ7CisKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworICBDb25zb2xlLldyaXRlTGluZSggU3RyaW5nT2ZDaGFyKCc9Jyw2MCkpOworICBDb25zb2xlLldyaXRlTGluZSggSW50VG9TdHIoblRvdGFsKSsnIHRlc3RzIHBlcmZvcm1lZCcpOworICBDb25zb2xlLldyaXRlTGluZSggSW50VG9TdHIoRlN1Y2Nlc3NlcykrJyB0ZXN0cyBzdWNjZWVkZWQgKCcrSW50VG9TdHIocm91bmQoMTAwKkZTdWNjZXNzZXMvblRvdGFsKSkrJyUpJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBJbnRUb1N0cihGRXJyb3JzLkNvdW50KSsnIHRlc3RzIGZhaWxlZCAoJytJbnRUb1N0cihyb3VuZCgxMDAqRkVycm9ycy5Db3VudC9uVG90YWwpKSsnJSknKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIFN0cmluZ09mQ2hhcignPScsNjApKTsKKyAgaWYgRkVycm9ycy5Db3VudCA+IDAgdGhlbiBiZWdpbgorICAgIENvbnNvbGUuV3JpdGVMaW5lKCdGQUlMRUQgVEVTVFM6Jyk7CisgICAgZm9yIHNMaW5lIGluIEZFcnJvcnMgZG8gQ29uc29sZS5Xcml0ZUxpbmUoJy0gJytzTGluZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIFN0cmluZ09mQ2hhcignPScsNjApKTsKKyAgICBJbnRlcmxvY2tlZEluY3JlbWVudCggRXhpdENvZGUpOyAgLy8gcmV0dXJuIDw+IDAgb24gZXJyb3JzCisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworZW5kOworCisKK2Z1bmN0aW9uIFRDbGllbnRUaHJlYWQuQ2FsY3VsYXRlRXhpdENvZGUgOiBCeXRlOwordmFyIHRlc3QgOiBUVGVzdEdyb3VwOworYmVnaW4KKyAgcmVzdWx0IDo9IEVYSVRDT0RFX1NVQ0NFU1M7CisgIGZvciB0ZXN0IDo9IExvdyhUVGVzdEdyb3VwKSB0byBIaWdoKFRUZXN0R3JvdXApIGRvIGJlZ2luCisgICAgaWYgKHRlc3QgaW4gRkZhaWxlZCkgb3Igbm90ICh0ZXN0IGluIEZFeGVjdXRlZCkKKyAgICB0aGVuIHJlc3VsdCA6PSByZXN1bHQgb3IgTUFQX0ZBSUxVUkVTX1RPX0VYSVRDT0RFX0JJVFNbdGVzdF07CisgIGVuZDsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CitiZWdpbgorICBGU2V0dXAgOj0gYVNldHVwOworICBGTnVtSXRlcmF0aW9uIDo9IEFOdW1JdGVyYXRpb247CisKKyAgRkNvbnNvbGUgOj0gVFRocmVhZENvbnNvbGUuQ3JlYXRlKCBTZWxmICk7CisgIEZDdXJyZW50VGVzdCA6PSB0ZXN0X1Vua25vd247CisKKyAgLy8gZXJyb3IgbGlzdDoga2VlcCBjb3JyZWN0IG9yZGVyLCBhbGxvdyBmb3IgZHVwbGljYXRlcworICBGRXJyb3JzIDo9IFRTdHJpbmdMaXN0LkNyZWF0ZTsKKyAgRkVycm9ycy5Tb3J0ZWQgOj0gRkFMU0U7CisgIEZFcnJvcnMuRHVwbGljYXRlcyA6PSBkdXBBY2NlcHQ7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggVFJVRSk7CitlbmQ7CisKK2Rlc3RydWN0b3IgVENsaWVudFRocmVhZC5EZXN0cm95OworYmVnaW4KKyAgRnJlZUFuZE5pbCggRkNvbnNvbGUpOworICBGcmVlQW5kTmlsKCBGRXJyb3JzKTsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5FeGVjdXRlOwordmFyCisgIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gcGVyZm9ybSBhbGwgdGVzdHMKKyAgdHJ5CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KKyAgICBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OworCisgICAgLy8gbXVzdCBiZSBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRocmVhZAorICAgIEluaXRpYWxpemVQcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIHRyeQorICAgICAgZm9yIGkgOj0gMCB0byBGTnVtSXRlcmF0aW9uIC0gMSBkbyBiZWdpbgorICAgICAgICBDbGllbnRUZXN0OworICAgICAgICB7JElGREVGIFN1cHBvcnRzQXN5bmN9CisgICAgICAgIENsaWVudEFzeW5jVGVzdDsKKyAgICAgICAgeyRFTkRJRn0KKyAgICAgIGVuZDsKKworICAgICAgLy8gcmVwb3J0IHRoZSBvdXRjb21lCisgICAgICBSZXBvcnRSZXN1bHRzOworICAgICAgU2V0UmV0dXJuVmFsdWUoIENhbGN1bGF0ZUV4aXRDb2RlKTsKKworICAgIGZpbmFsbHkKKyAgICAgIFNodXRkb3duUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICBlbmQ7CisKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ3VuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiJytlLm1lc3NhZ2UrJyInKTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkluaXRpYWxpemVQcm90b2NvbFRyYW5zcG9ydFN0YWNrOwordmFyCisgIHN0cmVhbXRyYW5zIDogSVN0cmVhbVRyYW5zcG9ydDsKKyAgaHR0cCA6IElIVFRQQ2xpZW50OworICBzVXJsIDogc3RyaW5nOworY29uc3QKKyAgREVCVUdfVElNRU9VVCAgID0gMzAgKiAxMDAwOworICBSRUxFQVNFX1RJTUVPVVQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICBQSVBFX1RJTUVPVVQgICAgPSBSRUxFQVNFX1RJTUVPVVQ7CisgIEhUVFBfVElNRU9VVFMgICA9IDEwICogMTAwMDsKK2JlZ2luCisgIC8vIG5lZWRlZCBmb3IgSFRUUCBjbGllbnRzIGFzIHRoZXkgdXRpbGl6ZSB0aGUgTVNYTUwgQ09NIGNvbXBvbmVudHMKKyAgT2xlQ2hlY2soIENvSW5pdGlhbGl6ZSggbmlsKSk7CisKKyAgY2FzZSBGU2V0dXAuZW5kcG9pbnQgb2YKKyAgICB0cm5zX1NvY2tldHM6IGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgc29ja2V0cyAoJytGU2V0dXAuaG9zdCsnIHBvcnQgJytJbnRUb1N0cihGU2V0dXAucG9ydCkrJyknKTsKKyAgICAgIHN0cmVhbXRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZSggRlNldHVwLmhvc3QsIEZTZXR1cC5wb3J0ICk7CisgICAgICBGVHJhbnNwb3J0IDo9IHN0cmVhbXRyYW5zOworICAgIGVuZDsKKworICAgIHRybnNfSHR0cDogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBIVFRQQ2xpZW50Jyk7CisgICAgICBpZiBGU2V0dXAudXNlU1NMCisgICAgICB0aGVuIHNVcmwgOj0gJ2h0dHA6Ly8nCisgICAgICBlbHNlIHNVcmwgOj0gJ2h0dHBzOi8vJzsKKyAgICAgIHNVcmwgOj0gc1VybCArIEZTZXR1cC5ob3N0OworICAgICAgY2FzZSBGU2V0dXAucG9ydCBvZgorICAgICAgICA4MCAgOiBpZiBGU2V0dXAudXNlU1NMIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICAgIDQ0MyA6IGlmIG5vdCBGU2V0dXAudXNlU1NMIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbHNlCisgICAgICAgIGlmIEZTZXR1cC5wb3J0ID4gMCB0aGVuIHNVcmwgOj0gc1VybCArICc6JysgSW50VG9TdHIoRlNldHVwLnBvcnQpOworICAgICAgZW5kOworICAgICAgaHR0cCA6PSBUSFRUUENsaWVudEltcGwuQ3JlYXRlKCBzVXJsKTsKKyAgICAgIGh0dHAuRG5zUmVzb2x2ZVRpbWVvdXQgOj0gSFRUUF9USU1FT1VUUzsKKyAgICAgIGh0dHAuQ29ubmVjdGlvblRpbWVvdXQgOj0gSFRUUF9USU1FT1VUUzsKKyAgICAgIGh0dHAuU2VuZFRpbWVvdXQgICAgICAgOj0gSFRUUF9USU1FT1VUUzsKKyAgICAgIGh0dHAuUmVhZFRpbWVvdXQgICAgICAgOj0gSFRUUF9USU1FT1VUUzsKKyAgICAgIEZUcmFuc3BvcnQgOj0gaHR0cDsKKyAgICBlbmQ7CisKKyAgICB0cm5zX0V2SHR0cDogYmVnaW4KKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoRU5EUE9JTlRfVFJBTlNQT1JUU1tGU2V0dXAuZW5kcG9pbnRdKycgdHJhbnNwb3J0IG5vdCBpbXBsZW1lbnRlZCcpOworICAgIGVuZDsKKworICAgIHRybnNfTmFtZWRQaXBlczogYmVnaW4KKyAgICAgIHN0cmVhbXRyYW5zIDo9IFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsLkNyZWF0ZSggRlNldHVwLnNQaXBlTmFtZSwgMCwgbmlsLCBQSVBFX1RJTUVPVVQsIFBJUEVfVElNRU9VVCk7CisgICAgICBGVHJhbnNwb3J0IDo9IHN0cmVhbXRyYW5zOworICAgIGVuZDsKKworICAgIHRybnNfQW5vblBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggRlNldHVwLmhBbm9uUmVhZCwgRlNldHVwLmhBbm9uV3JpdGUsIEZBTFNFKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgIGVsc2UKKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgZW5kcG9pbnQgdHJhbnNwb3J0Jyk7CisgIGVuZDsKKyAgQVNTRVJUKCBGVHJhbnNwb3J0IDw+IG5pbCk7CisKKyAgLy8gbGF5ZXJlZCB0cmFuc3BvcnRzIGFyZSBub3QgcmVhbGx5IG1lYW50IHRvIGJlIHN0YWNrZWQgdXBvbiBlYWNoIG90aGVyCisgIGlmICh0cm5zX0ZyYW1lZCBpbiBGU2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgIEZUcmFuc3BvcnQgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0KTsKKyAgZW5kCisgIGVsc2UgaWYgKHRybnNfQnVmZmVyZWQgaW4gRlNldHVwLmxheWVyZWQpIGFuZCAoc3RyZWFtdHJhbnMgPD4gbmlsKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggc3RyZWFtdHJhbnMsIDMyKTsgIC8vIHNtYWxsIGJ1ZmZlciB0byB0ZXN0IHJlYWQoKQorICBlbmQ7CisKKyAgaWYgRlNldHVwLnVzZVNTTCB0aGVuIGJlZ2luCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnU1NML1RMUyBub3QgaW1wbGVtZW50ZWQnKTsKKyAgZW5kOworCisgIC8vIGNyZWF0ZSBwcm90b2NvbCBpbnN0YW5jZSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAorICBjYXNlIEZTZXR1cC5wcm90VHlwZSBvZgorICAgIHByb3RfQmluYXJ5ICA6ICBGUHJvdG9jb2wgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQsIEJJTkFSWV9TVFJJQ1RfUkVBRCwgQklOQVJZX1NUUklDVF9XUklURSk7CisgICAgcHJvdF9KU09OICAgIDogIEZQcm90b2NvbCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICAgIHByb3RfQ29tcGFjdCA6ICBGUHJvdG9jb2wgOj0gVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0KTsKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBwcm90b2NvbCcpOworICBlbmQ7CisKKyAgQVNTRVJUKCAoRlRyYW5zcG9ydCA8PiBuaWwpIGFuZCAoRlByb3RvY29sIDw+IG5pbCkpOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlNodXRkb3duUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKK2JlZ2luCisgIHRyeQorICAgIEZQcm90b2NvbCA6PSBuaWw7CisKKyAgICBpZiBGVHJhbnNwb3J0IDw+IG5pbCB0aGVuIGJlZ2luCisgICAgICBGVHJhbnNwb3J0LkNsb3NlOworICAgICAgRlRyYW5zcG9ydCA6PSBuaWw7CisgICAgZW5kOworCisgIGZpbmFsbHkKKyAgICBDb1VuaW5pdGlhbGl6ZTsKKyAgZW5kOworZW5kOworCisKK3sgVFRocmVhZENvbnNvbGUgfQorCitjb25zdHJ1Y3RvciBUVGhyZWFkQ29uc29sZS5DcmVhdGUoQVRocmVhZDogVFRocmVhZCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVGhyZWFkIDo9IEFUaHJlYWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyZWFkQ29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOwordmFyCisgIHByb2MgOiBUVGhyZWFkUHJvY2VkdXJlOworYmVnaW4KKyAgcHJvYyA6PSBwcm9jZWR1cmUKKyAgYmVnaW4KKyAgICBDb25zb2xlLldyaXRlKCBTICk7CisgIGVuZDsKKyAgVFRocmVhZC5TeW5jaHJvbml6ZSggRlRocmVhZCwgcHJvYyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyZWFkQ29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKK3ZhcgorICBwcm9jIDogVFRocmVhZFByb2NlZHVyZTsKK2JlZ2luCisgIHByb2MgOj0gcHJvY2VkdXJlCisgIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIFMgKTsKKyAgZW5kOworICBUVGhyZWFkLlN5bmNocm9uaXplKCBGVGhyZWFkLCBwcm9jKTsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KK2JlZ2luCisgIFRUZXN0Q2xpZW50LkZOdW1JdGVyYXRpb24gOj0gMTsKKyAgVFRlc3RDbGllbnQuRk51bVRocmVhZCA6PSAxOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NjlkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcwpAQCAtMCwwICsxLDE2MiBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRlc3RDb25zdGFudHM7CisKK2ludGVyZmFjZQorCit1c2VzIFN5c1V0aWxzOworCit0eXBlCisgIFRLbm93blByb3RvY29sID0gKAorICAgIHByb3RfQmluYXJ5LCAgLy8gZGVmYXVsdCBiaW5hcnkgcHJvdG9jb2wKKyAgICBwcm90X0pTT04sICAgIC8vIEpTT04gcHJvdG9jb2wKKyAgICBwcm90X0NvbXBhY3QKKyAgKTsKKworICBUU2VydmVyVHlwZSA9ICgKKyAgICBzcnZfU2ltcGxlLAorICAgIHNydl9Ob25ibG9ja2luZywKKyAgICBzcnZfVGhyZWFkcG9vbCwKKyAgICBzcnZfVGhyZWFkZWQKKyAgKTsKKworICBURW5kcG9pbnRUcmFuc3BvcnQgPSAoCisgICAgdHJuc19Tb2NrZXRzLAorICAgIHRybnNfSHR0cCwKKyAgICB0cm5zX05hbWVkUGlwZXMsCisgICAgdHJuc19Bbm9uUGlwZXMsCisgICAgdHJuc19Fdkh0dHAgIC8vIGFzIGxpc3RlZCBvbiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvdGVzdAorICApOworCisgIFRMYXllcmVkVHJhbnNwb3J0ID0gKAorICAgIHRybnNfQnVmZmVyZWQsCisgICAgdHJuc19GcmFtZWQKKyAgKTsKKworICBUTGF5ZXJlZFRyYW5zcG9ydHMgPSBzZXQgb2YgVExheWVyZWRUcmFuc3BvcnQ7CisKK2NvbnN0CisgIFNFUlZFUl9UWVBFUyA6IGFycmF5W1RTZXJ2ZXJUeXBlXSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdTaW1wbGUnLCAnTm9uYmxvY2tpbmcnLCAnVGhyZWFkcG9vbCcsICdUaHJlYWRlZCcpOworCisgIFRIUklGVF9QUk9UT0NPTFMgOiBhcnJheVtUS25vd25Qcm90b2NvbF0gb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICA9ICgnQmluYXJ5JywgJ0pTT04nLCAnQ29tcGFjdCcpOworCisgIExBWUVSRURfVFJBTlNQT1JUUyA6IGFycmF5W1RMYXllcmVkVHJhbnNwb3J0XSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdCdWZmZXJlZCcsICdGcmFtZWQnKTsKKworICBFTkRQT0lOVF9UUkFOU1BPUlRTIDogYXJyYXlbVEVuZHBvaW50VHJhbnNwb3J0XSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdTb2NrZXRzJywgJ0h0dHAnLCAnTmFtZWQgUGlwZXMnLCdBbm9uIFBpcGVzJywgJ0V2SHR0cCcpOworCisgIC8vIGRlZmF1bHRzIGFyZTogcmVhZD1mYWxzZSwgd3JpdGU9dHJ1ZQorICBCSU5BUllfU1RSSUNUX1JFQUQgID0gRkFMU0U7CisgIEJJTkFSWV9TVFJJQ1RfV1JJVEUgPSBGQUxTRTsKKworICBIVUdFX1RFU1RfU1RSSU5HID0gJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJzsKKworCitmdW5jdGlvbiBCeXRlc1RvSGV4KCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBzdHJpbmc7CisKKworaW1wbGVtZW50YXRpb24KKworCitmdW5jdGlvbiBCeXRlc1RvSGV4KCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBzdHJpbmc7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gJyc7CisgIGZvciBpIDo9IExvdyhieXRlcykgdG8gSGlnaChieXRlcykgZG8gYmVnaW4KKyAgICByZXN1bHQgOj0gcmVzdWx0ICsgSW50VG9IZXgoYnl0ZXNbaV0sMik7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljYjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpAQCAtMCwwICsxLDc0NSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRlc3RTZXJ2ZXI7CisKK3skSSAuLi9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9CisKK3suJERFRklORSBSdW5FbmRsZXNzfSAgIC8vIGFjdGl2YXRlIHRvIGludGVyYWN0aXZlbHkgc3RyZXNzLXRlc3QgdGhlIHNlcnZlciBzdG9wIHJvdXRpbmVzIHZpYSBDdHJsK0MKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgV2luZG93cywgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQuU2VydmVyLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBUaHJpZnQuVXRpbHMsCisgIFRocmlmdC5UZXN0LAorICBUaHJpZnQsCisgIFRlc3RDb25zdGFudHMsCisgIFRlc3RTZXJ2ZXJFdmVudHMsCisgIENvbnNvbGVIZWxwZXIsCisgIENvbnRucnM7CisKK3R5cGUKKyAgVFRlc3RTZXJ2ZXIgPSBjbGFzcworICBwdWJsaWMKKyAgICB0eXBlCisKKyAgICAgIElUZXN0SGFuZGxlciA9IGludGVyZmFjZSggVFRocmlmdFRlc3QuSWZhY2UgKQorICAgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworICAgICAgICBwcm9jZWR1cmUgVGVzdFN0b3A7CisgICAgICBlbmQ7CisKKyAgICAgIFRUZXN0SGFuZGxlckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUZXN0SGFuZGxlciApCisgICAgICBwcml2YXRlCisgICAgICAgIEZTZXJ2ZXIgOiBJU2VydmVyOworICAgICAgcHJvdGVjdGVkCisgICAgICAgIHByb2NlZHVyZSB0ZXN0Vm9pZCgpOworICAgICAgICBmdW5jdGlvbiB0ZXN0Qm9vbCh0aGluZzogQm9vbGVhbik6IEJvb2xlYW47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmcoY29uc3QgdGhpbmc6IHN0cmluZyk6IHN0cmluZzsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEJ5dGUodGhpbmc6IFNob3J0SW50KTogU2hvcnRJbnQ7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RJMzIodGhpbmc6IEludGVnZXIpOiBJbnRlZ2VyOworICAgICAgICBmdW5jdGlvbiB0ZXN0STY0KGNvbnN0IHRoaW5nOiBJbnQ2NCk6IEludDY0OworICAgICAgICBmdW5jdGlvbiB0ZXN0RG91YmxlKGNvbnN0IHRoaW5nOiBEb3VibGUpOiBEb3VibGU7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RCaW5hcnkoY29uc3QgdGhpbmc6IFRCeXRlcyk6IFRCeXRlczsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFN0cnVjdChjb25zdCB0aGluZzogSVh0cnVjdCk6IElYdHJ1Y3Q7CisgICAgICAgIGZ1bmN0aW9uIHRlc3ROZXN0KGNvbnN0IHRoaW5nOiBJWHRydWN0Mik6IElYdHJ1Y3QyOworICAgICAgICBmdW5jdGlvbiB0ZXN0TWFwKGNvbnN0IHRoaW5nOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPik6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICAgICAgICBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwKGNvbnN0IHRoaW5nOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4pOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RTZXQoY29uc3QgdGhpbmc6IElIYXNoU2V0PEludGVnZXI+KTogSUhhc2hTZXQ8SW50ZWdlcj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RMaXN0KGNvbnN0IHRoaW5nOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPik6IElUaHJpZnRMaXN0PEludGVnZXI+OworICAgICAgICBmdW5jdGlvbiB0ZXN0RW51bSh0aGluZzogVE51bWJlcnopOiBUTnVtYmVyejsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFR5cGVkZWYoY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RNYXBNYXAoaGVsbG86IEludGVnZXIpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RJbnNhbml0eShjb25zdCBhcmd1bWVudDogSUluc2FuaXR5KTogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE11bHRpKGFyZzA6IFNob3J0SW50OyBhcmcxOiBJbnRlZ2VyOyBjb25zdCBhcmcyOiBJbnQ2NDsgY29uc3QgYXJnMzogSVRocmlmdERpY3Rpb25hcnk8U21hbGxJbnQsIHN0cmluZz47IGFyZzQ6IFROdW1iZXJ6OyBjb25zdCBhcmc1OiBJbnQ2NCk6IElYdHJ1Y3Q7CisgICAgICAgIHByb2NlZHVyZSB0ZXN0RXhjZXB0aW9uKGNvbnN0IGFyZzogc3RyaW5nKTsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGNvbnN0IGFyZzA6IHN0cmluZzsgY29uc3QgYXJnMTogc3RyaW5nKTogSVh0cnVjdDsKKyAgICAgICAgcHJvY2VkdXJlIHRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXA6IEludGVnZXIpOworCisgICAgICAgIHByb2NlZHVyZSBUZXN0U3RvcDsKKyAgICAgICAgcHJvY2VkdXJlIFNldFNlcnZlciggY29uc3QgQVNlcnZlciA6IElTZXJ2ZXIgKTsKKyAgICAgIGVuZDsKKworICAgICAgY2xhc3MgcHJvY2VkdXJlIFByaW50Q21kTGluZUhlbHA7CisgICAgICBjbGFzcyBwcm9jZWR1cmUgSW52YWxpZEFyZ3M7CisKKyAgICAgIGNsYXNzIHByb2NlZHVyZSBMYXVuY2hBbm9uUGlwZUNoaWxkKCBjb25zdCBhcHAgOiBzdHJpbmc7IGNvbnN0IHRyYW5zcG9ydCA6IElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0KTsKKyAgICAgIGNsYXNzIHByb2NlZHVyZSBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKKwordmFyIGdfSGFuZGxlciA6IFRUZXN0U2VydmVyLklUZXN0SGFuZGxlciA9IG5pbDsKKworCitmdW5jdGlvbiBNeUNvbnNvbGVFdmVudEhhbmRsZXIoIGR3Q3RybFR5cGUgOiBEV09SRCkgOiBCT09MOyAgc3RkY2FsbDsKKy8vIE5vdGUgdGhhdCB0aGlzIEhhbmRsZXIgcHJvY2VkdXJlIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkCit2YXIgaGFuZGxlciA6IFRUZXN0U2VydmVyLklUZXN0SGFuZGxlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUlVFOworICB0cnkKKyAgICBjYXNlIGR3Q3RybFR5cGUgb2YKKyAgICAgIENUUkxfQ19FVkVOVCAgICAgICAgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdDdHJsK0MgcHJlc3NlZCcpOworICAgICAgQ1RSTF9CUkVBS19FVkVOVCAgICA6ICBDb25zb2xlLldyaXRlTGluZSggJ0N0cmwrQnJlYWsgcHJlc3NlZCcpOworICAgICAgQ1RSTF9DTE9TRV9FVkVOVCAgICA6ICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIENsb3NlVGFzayBzaWduYWwnKTsKKyAgICAgIENUUkxfTE9HT0ZGX0VWRU5UICAgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZWNlaXZlZCBMb2dPZmYgc2lnbmFsJyk7CisgICAgICBDVFJMX1NIVVRET1dOX0VWRU5UIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgU2h1dGRvd24gc2lnbmFsJyk7CisgICAgZWxzZQorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZWNlaXZlZCBjb25zb2xlIGV2ZW50ICMnK0ludFRvU3RyKEludGVnZXIoZHdDdHJsVHlwZSkpKTsKKyAgICBlbmQ7CisKKyAgICBoYW5kbGVyIDo9IGdfSGFuZGxlcjsKKyAgICBpZiBoYW5kbGVyIDw+IG5pbCB0aGVuIGhhbmRsZXIuVGVzdFN0b3A7CisKKyAgZXhjZXB0CisgICAgLy8gY2F0Y2ggYWxsCisgIGVuZDsKK2VuZDsKKworCit7IFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwgfQorCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC5TZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXI6IElTZXJ2ZXIpOworYmVnaW4KKyAgRlNlcnZlciA6PSBBU2VydmVyOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RCeXRlKHRoaW5nOiBTaG9ydEludCk6IFNob3J0SW50OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCeXRlKCInICsgSW50VG9TdHIoIHRoaW5nKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdERvdWJsZSggY29uc3QgdGhpbmc6IERvdWJsZSk6IERvdWJsZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0RG91YmxlKCInICsgRmxvYXRUb1N0ciggdGhpbmcgKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEJpbmFyeShjb25zdCB0aGluZzogVEJ5dGVzKTogVEJ5dGVzOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoIicgKyBCeXRlc1RvSGV4KCB0aGluZyApICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0RW51bSh0aGluZzogVE51bWJlcnopOiBUTnVtYmVyejsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0RW51bSgnICsgSW50VG9TdHIoIEludGVnZXIoIHRoaW5nKSkgKyAnKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RFeGNlcHRpb24oY29uc3QgYXJnOiBzdHJpbmcpOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RFeGNlcHRpb24oJyArIGFyZyArICcpJyk7CisgIGlmICggYXJnID0gJ1hjZXB0aW9uJykgdGhlbgorICBiZWdpbgorICAgIHJhaXNlIFRYY2VwdGlvbi5DcmVhdGUoIDEwMDEsIGFyZyk7CisgIGVuZDsKKworICBpZiAoYXJnID0gJ1RFeGNlcHRpb24nKSB0aGVuCisgIGJlZ2luCisgICAgcmFpc2UgVEV4Y2VwdGlvbi5DcmVhdGUoJ1RFeGNlcHRpb24nKTsKKyAgZW5kOworCisgIC8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEkzMih0aGluZzogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEkzMigiJyArIEludFRvU3RyKCB0aGluZykgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RJNjQoIGNvbnN0IHRoaW5nOiBJbnQ2NCk6IEludDY0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RJNjQoIicgKyBJbnRUb1N0ciggdGhpbmcpICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0SW5zYW5pdHkoCisgIGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OwordmFyCisgIGxvb25leSA6IElJbnNhbml0eTsKKyAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CisgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgaW5zYW5lIDogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKKworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RJbnNhbml0eSgpJyk7CisKKyAgKCoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKikKKworICBmaXJzdF9tYXAgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFROdW1iZXJ6LCBJSW5zYW5pdHk+LkNyZWF0ZTsKKyAgc2Vjb25kX21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOworCisgIGZpcnN0X21hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CisKKyAgbG9vbmV5IDo9IFRJbnNhbml0eUltcGwuQ3JlYXRlOworICBzZWNvbmRfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlNJWCwgbG9vbmV5KTsKKworICBpbnNhbmUgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj4uQ3JlYXRlOworCisgIGluc2FuZS5BZGRPclNldFZhbHVlKCAxLCBmaXJzdF9tYXApOworICBpbnNhbmUuQWRkT3JTZXRWYWx1ZSggMiwgc2Vjb25kX21hcCk7CisKKyAgUmVzdWx0IDo9IGluc2FuZTsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0TGlzdCgKKyAgY29uc3QgdGhpbmc6IElUaHJpZnRMaXN0PEludGVnZXI+KTogSVRocmlmdExpc3Q8SW50ZWdlcj47Cit2YXIKKyAgZmlyc3QgOiBCb29sZWFuOworICBlbGVtIDogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RMaXN0KHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGVsZW0gaW4gdGhpbmcgZG8KKyAgYmVnaW4KKyAgICBpZiBmaXJzdCB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZpcnN0IDo9IEZhbHNlOworICAgIGVuZCBlbHNlCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBlbGVtKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0TWFwKAorICBjb25zdCB0aGluZzogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4pOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKK3ZhcgorICBmaXJzdCA6IEJvb2xlYW47CisgIGtleSA6IEludGVnZXI7CitiZWdpbgorICBDb25zb2xlLldyaXRlKCd0ZXN0TWFwKHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGtleSBpbiB0aGluZy5LZXlzIGRvCisgIGJlZ2luCisgICAgaWYgKGZpcnN0KSB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZpcnN0IDo9IGZhbHNlOworICAgIGVuZCBlbHNlCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoSW50VG9TdHIoa2V5KSArICcgPT4gJyArIEludFRvU3RyKCB0aGluZ1trZXldKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC5UZXN0TWFwTWFwKAorICBoZWxsbzogSW50ZWdlcik6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+PjsKK3ZhcgorICBtYXBtYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj47CisgIHBvcyA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBuZWcgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgaSA6IEludGVnZXI7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdE1hcE1hcCgnICsgSW50VG9TdHIoIGhlbGxvKSArICcpJyk7CisgIG1hcG1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50ZWdlciwgSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4+LkNyZWF0ZTsKKyAgcG9zIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnRlZ2VyLCBJbnRlZ2VyPi5DcmVhdGU7CisgIG5lZyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50ZWdlciwgSW50ZWdlcj4uQ3JlYXRlOworCisgIGZvciBpIDo9IDEgdG8gNCBkbworICBiZWdpbgorICAgIHBvcy5BZGRPclNldFZhbHVlKCBpLCBpKTsKKyAgICBuZWcuQWRkT3JTZXRWYWx1ZSggLWksIC1pKTsKKyAgZW5kOworCisgIG1hcG1hcC5BZGRPclNldFZhbHVlKDQsIHBvcyk7CisgIG1hcG1hcC5BZGRPclNldFZhbHVlKCAtNCwgbmVnKTsKKworICBSZXN1bHQgOj0gbWFwbWFwOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RNdWx0aShhcmcwOiBTaG9ydEludDsgYXJnMTogSW50ZWdlcjsKKyAgY29uc3QgYXJnMjogSW50NjQ7IGNvbnN0IGFyZzM6IElUaHJpZnREaWN0aW9uYXJ5PFNtYWxsSW50LCBzdHJpbmc+OworICBhcmc0OiBUTnVtYmVyejsgY29uc3QgYXJnNTogSW50NjQpOiBJWHRydWN0OwordmFyCisgIGhlbGxvIDogSVh0cnVjdDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TXVsdGkoKScpOworICBoZWxsbyA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CisgIGhlbGxvLlN0cmluZ190aGluZyA6PSAnSGVsbG8yJzsKKyAgaGVsbG8uQnl0ZV90aGluZyA6PSBhcmcwOworICBoZWxsby5JMzJfdGhpbmcgOj0gYXJnMTsKKyAgaGVsbG8uSTY0X3RoaW5nIDo9IGFyZzI7CisgIFJlc3VsdCA6PSBoZWxsbzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0TXVsdGlFeGNlcHRpb24oIGNvbnN0IGFyZzAsIGFyZzE6IHN0cmluZyk6IElYdHJ1Y3Q7Cit2YXIKKyAgeDIgOiBUWGNlcHRpb24yOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgaWYgKCBhcmcwID0gJ1hjZXB0aW9uJykgdGhlbgorICBiZWdpbgorICAgIHJhaXNlIFRYY2VwdGlvbi5DcmVhdGUoIDEwMDEsICdUaGlzIGlzIGFuIFhjZXB0aW9uJyk7ICAvLyB0ZXN0IHRoZSBuZXcgcmljaCBDVE9SCisgIGVuZCBlbHNlCisgIGlmICggYXJnMCA9ICdYY2VwdGlvbjInKSB0aGVuCisgIGJlZ2luCisgICAgeDIgOj0gVFhjZXB0aW9uMi5DcmVhdGU7ICAvLyB0aGUgb2xkIHdheSBzdGlsbCB3b3JrcyB0b28/CisgICAgeDIuRXJyb3JDb2RlIDo9IDIwMDI7CisgICAgeDIuU3RydWN0X3RoaW5nIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgICB4Mi5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nIDo9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgeDIuVXBkYXRlTWVzc2FnZVByb3BlcnR5OworICAgIHJhaXNlIHgyOworICBlbmQ7CisKKyAgUmVzdWx0IDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgUmVzdWx0LlN0cmluZ190aGluZyA6PSBhcmcxOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3ROZXN0KCBjb25zdCB0aGluZzogSVh0cnVjdDIpOiBJWHRydWN0MjsKK3ZhcgorICB0ZW1wIDogSVh0cnVjdDsKK2JlZ2luCisgIHRlbXAgOj0gdGhpbmcuU3RydWN0X3RoaW5nOworICBDb25zb2xlLldyaXRlTGluZSgndGVzdE5lc3QoeycgKworICAgICAgICAgSW50VG9TdHIoIHRoaW5nLkJ5dGVfdGhpbmcpICsgJywgeycgKworICAgICAgICAgJyInICsgdGVtcC5TdHJpbmdfdGhpbmcgKyAnIiwgJyArCisgICAgICAgICBJbnRUb1N0ciggdGVtcC5CeXRlX3RoaW5nKSArICcsICcgKworICAgICAgICAgSW50VG9TdHIoIHRlbXAuSTMyX3RoaW5nKSArICcsICcgKworICAgICAgICAgSW50VG9TdHIoIHRlbXAuSTY0X3RoaW5nKSArICd9LCAnICsKKyAgICAgICAgIEludFRvU3RyKCB0ZW1wLkkzMl90aGluZykgKyAnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwOiBJbnRlZ2VyKTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0T25ld2F5KCcgKyBJbnRUb1N0ciggc2Vjb25kc1RvU2xlZXAgKSsgJyksIHNsZWVwaW5nLi4uJyk7CisgIFNsZWVwKHNlY29uZHNUb1NsZWVwICogMTAwMCk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0T25ld2F5IGZpbmlzaGVkJyk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFNldCgKKyAgY29uc3QgdGhpbmc6IElIYXNoU2V0PEludGVnZXI+KTpJSGFzaFNldDxJbnRlZ2VyPjsKK3ZhcgorICBmaXJzdCA6IEJvb2xlYW47CisgIGVsZW0gOiBJbnRlZ2VyOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZSgndGVzdFNldCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisKKyAgZm9yIGVsZW0gaW4gdGhpbmcgZG8KKyAgYmVnaW4KKyAgICBpZiBmaXJzdCB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZpcnN0IDo9IEZhbHNlOworICAgIGVuZCBlbHNlCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoICcsICcpOworICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggZWxlbSkpOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RTdG9wOworYmVnaW4KKyAgaWYgRlNlcnZlciA8PiBuaWwgdGhlbgorICBiZWdpbgorICAgIEZTZXJ2ZXIuU3RvcDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RCb29sKHRoaW5nOiBCb29sZWFuKTogQm9vbGVhbjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0Qm9vbCgnICsgQm9vbFRvU3RyKHRoaW5nLHRydWUpICsgJyknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RTdHJpbmcoIGNvbnN0IHRoaW5nOiBzdHJpbmcpOiBzdHJpbmc7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdHN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RyaW5nTWFwKAorICBjb25zdCB0aGluZzogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KTogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+OwordmFyCisgIGZpcnN0IDogQm9vbGVhbjsKKyAga2V5IDogc3RyaW5nOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZSgndGVzdFN0cmluZ01hcCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBrZXkgaW4gdGhpbmcuS2V5cyBkbworICBiZWdpbgorICAgIGlmIChmaXJzdCkgdGhlbgorICAgIGJlZ2luCisgICAgICBmaXJzdCA6PSBmYWxzZTsKKyAgICBlbmQgZWxzZQorICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCcsICcpOworICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlKGtleSArICcgPT4gJyArIHRoaW5nW2tleV0pOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd9KScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFR5cGVkZWYoIGNvbnN0IHRoaW5nOiBJbnQ2NCk6IEludDY0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RUeXBlZGVmKCcgKyBJbnRUb1N0ciggdGhpbmcpICsgJyknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC5UZXN0Vm9pZDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0Vm9pZCgpJyk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFN0cnVjdCggY29uc3QgdGhpbmc6IElYdHJ1Y3QpOiBJWHRydWN0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RTdHJ1Y3QoeycgKworICAgICciJyArIHRoaW5nLlN0cmluZ190aGluZyArICciLCAnICsKKyAgICAgIEludFRvU3RyKCB0aGluZy5CeXRlX3RoaW5nKSArICcsICcgKworICAgICAgSW50VG9TdHIoIHRoaW5nLkkzMl90aGluZykgKyAnLCAnICsKKyAgICAgIEludFRvU3RyKCB0aGluZy5JNjRfdGhpbmcpKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCisKK3sgVFRlc3RTZXJ2ZXIgfQorCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5QcmludENtZExpbmVIZWxwOworY29uc3QgSEVMUFRFWFQgPSAnIFtvcHRpb25zXScjMTAKKyAgICAgICAgICAgICAgICsgIzEwCisgICAgICAgICAgICAgICArICdBbGxvd2VkIG9wdGlvbnM6JyMxMAorICAgICAgICAgICAgICAgKyAnICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4nIzEwCisgICAgICAgICAgICAgICArICcgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCknIzEwCisgICAgICAgICAgICAgICArICcgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCAic2ltcGxlIiwgInRocmVhZC1wb29sIiwnIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXQpICAgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24nIzEwCisgICAgICAgICAgICAgICArICcgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHMnIzEwCisgICAgICAgICAgICAgICArICcgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yJyMxMAorICAgICAgICAgICAgICAgKyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUnIzEwCisgICAgICAgICAgICAgICA7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArIEhFTFBURVhUKTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkludmFsaWRBcmdzOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIGFyZ3MuJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgJyAtaCBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOworICBBYm9ydDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkxhdW5jaEFub25QaXBlQ2hpbGQoIGNvbnN0IGFwcCA6IHN0cmluZzsgY29uc3QgdHJhbnNwb3J0IDogSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQpOworLy9MYXVuY2ggY2hpbGQgcHJvY2VzcyBhbmQgcGFzcyBSL1cgYW5vbnltb3VzIHBpcGUgaGFuZGxlcyBvbiBjbWQgbGluZS4KKy8vVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGVsZXZhdGlvbiBvciBvdGhlcgorLy9hZHZhbmNlZCBmZWF0dXJlcy4KK3ZhciBwaSA6IFBST0NFU1NfSU5GT1JNQVRJT047CisgICAgICAgIHNpIDogU1RBUlRVUElORk87CisgICAgICAgIHNBcmcsIHNIYW5kbGVzLCBzQ21kTGluZSA6IHN0cmluZzsKKyAgICBpIDogSW50ZWdlcjsKK2JlZ2luCisgIEdldFN0YXJ0dXBJbmZvKCBzaSk7ICAvL3NldCBzdGFydHVwaW5mbyBmb3IgdGhlIHNwYXduZWQgcHJvY2VzcworCisgIC8vIHByZWZvcm1hdCBoYW5kbGVzIGFyZ3MKKyAgc0hhbmRsZXMgOj0gRm9ybWF0KCAnJWQgJWQnLAorICAgICAgICAgICAgICAgICAgICBbIEludGVnZXIodHJhbnNwb3J0LkNsaWVudEFub25SZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyKHRyYW5zcG9ydC5DbGllbnRBbm9uV3JpdGUpXSk7CisKKyAgLy8gcGFzcyBhbGwgc2V0dGluZ3MgdG8gY2xpZW50CisgIHNDbWRMaW5lIDo9IGFwcDsKKyAgZm9yIGkgOj0gMSB0byBQYXJhbUNvdW50IGRvIGJlZ2luCisgICAgc0FyZyA6PSBQYXJhbVN0cihpKTsKKworICAgIC8vIGFkZCBhbm9ueW1vdXMgaGFuZGxlcyBhbmQgcXVvdGUgc3RyaW5ncyB3aGVyZSBhcHByb3ByaWF0ZQorICAgIGlmIHNBcmcgPSAnLWFub24nCisgICAgdGhlbiBzQXJnIDo9IHNBcmcgKycgJysgc0hhbmRsZXMKKyAgICBlbHNlIGJlZ2luCisgICAgICBpZiBQb3MoJyAnLHNBcmcpID4gMAorICAgICAgdGhlbiBzQXJnIDo9ICciJytzQXJnKyciJzsKKyAgICBlbmQ7OworCisgICAgc0NtZExpbmUgOj0gc0NtZExpbmUgKycgJysgc0FyZzsKKyAgZW5kOworCisgIC8vIHNwYXduIHRoZSBjaGlsZCBwcm9jZXNzCisgIENvbnNvbGUuV3JpdGVMaW5lKCdTdGFydGluZyBjbGllbnQgJytzQ21kTGluZSk7CisgIFdpbjMyQ2hlY2soIENyZWF0ZVByb2Nlc3MoIG5pbCwgUENoYXIoc0NtZExpbmUpLCBuaWwsbmlsLFRSVUUsMCxuaWwsbmlsLHNpLHBpKSk7CisKKyAgQ2xvc2VIYW5kbGUoIHBpLmhUaHJlYWQpOworICAgIENsb3NlSGFuZGxlKCBwaS5oUHJvY2Vzcyk7CitlbmQ7CisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7Cit2YXIKKyAgUG9ydCA6IEludGVnZXI7CisgIFNlcnZlckV2ZW50cyA6IEJvb2xlYW47CisgIHNQaXBlTmFtZSA6IHN0cmluZzsKKyAgdGVzdEhhbmRsZXIgOiBJVGVzdEhhbmRsZXI7CisgIHRlc3RQcm9jZXNzb3IgOiBJUHJvY2Vzc29yOworICBTZXJ2ZXJUcmFucyA6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgIFNlcnZlckVuZ2luZSA6IElTZXJ2ZXI7CisgIGFub255bW91c3BpcGUgOiBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydDsKKyAgbmFtZWRwaXBlIDogSU5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydDsKKyAgVHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICBQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBpLCBudW1Xb3JrZXIgOiBJbnRlZ2VyOworICBzIDogc3RyaW5nOworICBwcm90VHlwZSA6IFRLbm93blByb3RvY29sOworICBzZXJ2ZXJ0eXBlIDogVFNlcnZlclR5cGU7CisgIGVuZHBvaW50IDogVEVuZHBvaW50VHJhbnNwb3J0OworICBsYXllcmVkIDogVExheWVyZWRUcmFuc3BvcnRzOworICBVc2VTU0wgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCitiZWdpbgorICB0cnkKKyAgICBTZXJ2ZXJFdmVudHMgOj0gRkFMU0U7CisgICAgcHJvdFR5cGUgOj0gcHJvdF9CaW5hcnk7CisgICAgc2VydmVydHlwZSA6PSBzcnZfU2ltcGxlOworICAgIGVuZHBvaW50IDo9IHRybnNfU29ja2V0czsKKyAgICBsYXllcmVkIDo9IFtdOworICAgIFVzZVNTTCA6PSBGQUxTRTsKKyAgICBQb3J0IDo9IDkwOTA7CisgICAgc1BpcGVOYW1lIDo9ICcnOworICAgIG51bVdvcmtlciA6PSA0OworCisgICAgaSA6PSAwOworICAgIHdoaWxlICggaSA8IExlbmd0aChhcmdzKSApIGRvIGJlZ2luCisgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICBJbmMoaSk7CisKKyAgICAgIC8vIEFsbG93ZWQgb3B0aW9uczoKKyAgICAgIGlmIChzID0gJy1oJykgb3IgKHMgPSAnLS1oZWxwJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgICAgUHJpbnRDbWRMaW5lSGVscDsKKyAgICAgICAgRXhpdDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXBvcnQnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4KKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoaSk7CisgICAgICAgIFBvcnQgOj0gU3RyVG9JbnREZWYoIHMsIFBvcnQpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tZG9tYWluLXNvY2tldCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KQorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdkb21haW4tc29ja2V0IG5vdCBzdXBwb3J0ZWQnKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLW5hbWVkLXBpcGUnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgICBlbmRwb2ludCA6PSB0cm5zX05hbWVkUGlwZXM7CisgICAgICAgIHNQaXBlTmFtZSA6PSBhcmdzW2ldOyAgLy8gLXBpcGUgPG5hbWU+CisgICAgICAgIEluYyggaSApOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tc2VydmVyLXR5cGUnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwKKyAgICAgICAgLy8gYXJnID0gInNpbXBsZSIsICJ0aHJlYWQtcG9vbCIsICJ0aHJlYWRlZCIsIG9yICJub25ibG9ja2luZyIKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoaSk7CisKKyAgICAgICAgaWYgICAgICBzID0gJ3NpbXBsZScgICAgICB0aGVuIHNlcnZlcnR5cGUgOj0gc3J2X1NpbXBsZQorICAgICAgICBlbHNlIGlmIHMgPSAndGhyZWFkLXBvb2wnIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfVGhyZWFkcG9vbAorICAgICAgICBlbHNlIGlmIHMgPSAndGhyZWFkZWQnICAgIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfVGhyZWFkZWQKKyAgICAgICAgZWxzZSBpZiBzID0gJ25vbmJsb2NraW5nJyB0aGVuIHNlcnZlcnR5cGUgOj0gc3J2X05vbmJsb2NraW5nCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS10cmFuc3BvcnQnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoaSk7CisKKyAgICAgICAgaWYgICAgICBzID0gJ2J1ZmZlcmVkJyB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfQnVmZmVyZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdmcmFtZWQnICAgdGhlbiBJbmNsdWRlKCBsYXllcmVkLCB0cm5zX0ZyYW1lZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2h0dHAnICAgICB0aGVuIGVuZHBvaW50IDo9IHRybnNfSHR0cAorICAgICAgICBlbHNlIGlmIHMgPSAnYW5vbnBpcGUnIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19Bbm9uUGlwZXMKKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXByb3RvY29sJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbgorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYmluYXJ5JyAgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9CaW5hcnkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2NvbXBhY3QnICB0aGVuIHByb3RUeXBlIDo9IHByb3RfQ29tcGFjdAorICAgICAgICBlbHNlIGlmIHMgPSAnanNvbicgICAgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9KU09OCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1zc2wnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tc3NsICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgICBVc2VTU0wgOj0gVFJVRTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXByb2Nlc3Nvci1ldmVudHMnKSB0aGVuIGJlZ2luCisgICAgICAgICAvLyAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50cworICAgICAgICBTZXJ2ZXJFdmVudHMgOj0gVFJVRTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctbicpIG9yIChzID0gJy0td29ya2VycycpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4KKyAgICAgICAgLy8gT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBudW1Xb3JrZXIgOj0gU3RyVG9JbnREZWYocywwKTsKKyAgICAgICAgaWYgbnVtV29ya2VyID4gMAorICAgICAgICB0aGVuIEluYyhpKQorICAgICAgICBlbHNlIG51bVdvcmtlciA6PSA0OworICAgICAgZW5kCisgICAgICBlbHNlIGJlZ2luCisgICAgICAgIEludmFsaWRBcmdzOworICAgICAgZW5kOworICAgIGVuZDsKKworCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1NlcnZlciBjb25maWd1cmF0aW9uOiAnKTsKKworICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgICAgY2FzZSBwcm90VHlwZSBvZgorICAgICAgcHJvdF9CaW5hcnkgIDogIFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSggQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICAgIHByb3RfSlNPTiAgICA6ICBQcm90b2NvbEZhY3RvcnkgOj0gVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICAgICAgcHJvdF9Db21wYWN0IDogIFByb3RvY29sRmFjdG9yeSA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgICAgZWxzZQorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgICAgZW5kOworICAgIEFTU0VSVCggUHJvdG9jb2xGYWN0b3J5IDw+IG5pbCk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gJytUSFJJRlRfUFJPVE9DT0xTW3Byb3RUeXBlXSsnIHByb3RvY29sJyk7CisKKyAgICBjYXNlIGVuZHBvaW50IG9mCisKKyAgICAgIHRybnNfU29ja2V0cyA6IGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIHNvY2tldHMgKHBvcnQgJytJbnRUb1N0cihwb3J0KSsnKScpOworICAgICAgICBpZiAodHJuc19CdWZmZXJlZCBpbiBsYXllcmVkKSB0aGVuIENvbnNvbGUuV3JpdGVMaW5lKCctIGJ1ZmZlcmVkJyk7CisgICAgICAgIHNlcnZlcnRyYW5zIDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggUG9ydCwgMCwgKHRybnNfQnVmZmVyZWQgaW4gbGF5ZXJlZCkpOworICAgICAgZW5kOworCisgICAgICB0cm5zX0h0dHAgOiBiZWdpbgorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKEVORFBPSU5UX1RSQU5TUE9SVFNbZW5kcG9pbnRdKycgc2VydmVyIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgdHJuc19OYW1lZFBpcGVzIDogYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gbmFtZWQgcGlwZSAoJytzUGlwZU5hbWUrJyknKTsKKyAgICAgICAgbmFtZWRwaXBlICAgOj0gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzUGlwZU5hbWUsIDQwOTYsIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUyk7CisgICAgICAgIHNlcnZlcnRyYW5zIDo9IG5hbWVkcGlwZTsKKyAgICAgIGVuZDsKKworICAgICAgdHJuc19Bbm9uUGlwZXMgOiBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBhbm9ueW1vdXMgcGlwZXMnKTsKKyAgICAgICAgYW5vbnltb3VzcGlwZSA6PSBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlOworICAgICAgICBzZXJ2ZXJ0cmFucyAgIDo9IGFub255bW91c3BpcGU7CisgICAgICBlbmQKKworICAgIGVsc2UKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgICBlbmQ7CisgICAgQVNTRVJUKCBzZXJ2ZXJ0cmFucyA8PiBuaWwpOworCisgICAgaWYgVXNlU1NMIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1NTTCBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICBlbmQ7CisKKyAgICBpZiAodHJuc19GcmFtZWQgaW4gbGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gZnJhbWVkIHRyYW5zcG9ydCcpOworICAgICAgVHJhbnNwb3J0RmFjdG9yeSA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5URmFjdG9yeS5DcmVhdGUKKyAgICBlbmQKKyAgICBlbHNlIGJlZ2luCisgICAgICBUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisgICAgZW5kOworICAgIEFTU0VSVCggVHJhbnNwb3J0RmFjdG9yeSA8PiBuaWwpOworCisgICAgdGVzdEhhbmRsZXIgICA6PSBUVGVzdEhhbmRsZXJJbXBsLkNyZWF0ZTsKKyAgICB0ZXN0UHJvY2Vzc29yIDo9IFRUaHJpZnRUZXN0LlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggdGVzdEhhbmRsZXIgKTsKKworICAgIGNhc2Ugc2VydmVydHlwZSBvZgorICAgICAgc3J2X1NpbXBsZSAgICAgIDogYmVnaW4KKyAgICAgICAgU2VydmVyRW5naW5lIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCB0ZXN0UHJvY2Vzc29yLCBTZXJ2ZXJUcmFucywgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGVuZDsKKworICAgICAgc3J2X05vbmJsb2NraW5nIDogYmVnaW4KKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShTRVJWRVJfVFlQRVNbc2VydmVydHlwZV0rJyBzZXJ2ZXIgbm90IGltcGxlbWVudGVkJyk7CisgICAgICBlbmQ7CisKKyAgICAgIHNydl9UaHJlYWRwb29sLAorICAgICAgc3J2X1RocmVhZGVkOiBiZWdpbgorICAgICAgICBpZiBudW1Xb3JrZXIgPiAxIHRoZW4ge3VzZSBoZXJlfTsKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShTRVJWRVJfVFlQRVNbc2VydmVydHlwZV0rJyBzZXJ2ZXIgbm90IGltcGxlbWVudGVkJyk7CisgICAgICBlbmQ7CisKKyAgICBlbHNlCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgc2VydmVyIHR5cGUnKTsKKyAgICBlbmQ7CisgICAgQVNTRVJUKCBTZXJ2ZXJFbmdpbmUgPD4gbmlsKTsKKworICAgIHRlc3RIYW5kbGVyLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKKworICAgIC8vIHRlc3QgZXZlbnRzPworICAgIGlmIFNlcnZlckV2ZW50cyB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBzZXJ2ZXIgZXZlbnRzIHRlc3QgZW5hYmxlZCcpOworICAgICAgU2VydmVyRW5naW5lLlNlcnZlckV2ZW50cyA6PSBUU2VydmVyRXZlbnRzSW1wbC5DcmVhdGU7CisgICAgZW5kOworCisgICAgLy8gc3RhcnQgdGhlIGNsaWVudCBub3cgd2hlbiB3ZSBoYXZlIHRoZSBhbm9uIGhhbmRsZXMsIGJ1dCBiZWZvcmUgdGhlIHNlcnZlciBzdGFydHMKKyAgICBpZiBlbmRwb2ludCA9IHRybnNfQW5vblBpcGVzCisgICAgdGhlbiBMYXVuY2hBbm9uUGlwZUNoaWxkKCBFeHRyYWN0RmlsZVBhdGgoUGFyYW1TdHIoMCkpKydjbGllbnQuZXhlJywgYW5vbnltb3VzcGlwZSk7CisKKyAgICAvLyBpbnN0YWxsIEN0cmwrQyBoYW5kbGVyIGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cworICAgIGdfSGFuZGxlciA6PSB0ZXN0SGFuZGxlcjsKKyAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIoIEBNeUNvbnNvbGVFdmVudEhhbmRsZXIsIFRSVUUpOworCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworICAgIHJlcGVhdAorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uJyk7CisgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmU7CisgICAgdW50aWwgeyRJRkRFRiBSdW5FbmRsZXNzfSBGQUxTRSB7JEVMU0V9IFRSVUUgeyRFTkRJRn07CisKKyAgICB0ZXN0SGFuZGxlci5TZXRTZXJ2ZXIoIG5pbCk7CisgICAgZ19IYW5kbGVyIDo9IG5pbDsKKworICBleGNlcHQKKyAgICBvbiBFOiBFQWJvcnQgZG8gcmFpc2U7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggRS5NZXNzYWdlICsgIzEwICsgRS5TdGFja1RyYWNlICk7CisgICAgZW5kOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGVMaW5lKCAnZG9uZS4nKTsKK2VuZDsKKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwOGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwpAQCAtMCwwICsxLDE3NCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRlc3RTZXJ2ZXJFdmVudHM7CisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlNlcnZlciwKKyAgQ29uc29sZUhlbHBlcjsKKwordHlwZQorICBUUmVxdWVzdEV2ZW50c0ltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElSZXF1ZXN0RXZlbnRzKQorICBwcm90ZWN0ZWQKKyAgICBGU3RhcnQgOiBURGF0ZVRpbWU7CisgICAgLy8gSVJlcXVlc3RQcm9jZXNzaW5nRXZlbnRzCisgICAgcHJvY2VkdXJlIFByZVJlYWQ7CisgICAgcHJvY2VkdXJlIFBvc3RSZWFkOworICAgIHByb2NlZHVyZSBQcmVXcml0ZTsKKyAgICBwcm9jZWR1cmUgUG9zdFdyaXRlOworICAgIHByb2NlZHVyZSBPbmV3YXlDb21wbGV0ZTsKKyAgICBwcm9jZWR1cmUgVW5oYW5kbGVkRXJyb3IoIGNvbnN0IGUgOiBFeGNlcHRpb24pOworICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKKworICBUUHJvY2Vzc29yRXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb2Nlc3NvckV2ZW50cykKKyAgcHJvdGVjdGVkCisgICAgRlJlcXMgOiBJbnRlZ2VyOworICAgIC8vIElQcm9jZXNzb3JFdmVudHMKKyAgICBwcm9jZWR1cmUgUHJvY2Vzc2luZyggY29uc3QgdHJhbnNwb3J0IDogSVRyYW5zcG9ydCk7CisgICAgZnVuY3Rpb24gIENyZWF0ZVJlcXVlc3RDb250ZXh0KCBjb25zdCBhRnVuY3Rpb25OYW1lIDogc3RyaW5nKSA6IElSZXF1ZXN0RXZlbnRzOworICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKKworICBUU2VydmVyRXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVNlcnZlckV2ZW50cykKKyAgcHJvdGVjdGVkCisgICAgLy8gSVNlcnZlckV2ZW50cworICAgIHByb2NlZHVyZSBQcmVTZXJ2ZTsKKyAgICBwcm9jZWR1cmUgUHJlQWNjZXB0OworICAgIGZ1bmN0aW9uICBDcmVhdGVQcm9jZXNzaW5nQ29udGV4dCggY29uc3QgaW5wdXQsIG91dHB1dCA6IElQcm90b2NvbCkgOiBJUHJvY2Vzc29yRXZlbnRzOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworeyBUU2VydmVyRXZlbnRzSW1wbCB9CisKK3Byb2NlZHVyZSBUU2VydmVyRXZlbnRzSW1wbC5QcmVTZXJ2ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdTZXJ2ZXJFdmVudHM6IFNlcnZlciBzdGFydGluZyB0byBzZXJ2ZSByZXF1ZXN0cycpOworZW5kOworCisKK3Byb2NlZHVyZSBUU2VydmVyRXZlbnRzSW1wbC5QcmVBY2NlcHQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnU2VydmVyRXZlbnRzOiBTZXJ2ZXIgdHJhbnNwb3J0IGlzIHJlYWR5IHRvIGFjY2VwdCBpbmNvbWluZyBjYWxscycpOworZW5kOworCisKK2Z1bmN0aW9uIFRTZXJ2ZXJFdmVudHNJbXBsLkNyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KGNvbnN0IGlucHV0LCBvdXRwdXQ6IElQcm90b2NvbCk6IElQcm9jZXNzb3JFdmVudHM7CitiZWdpbgorICByZXN1bHQgOj0gVFByb2Nlc3NvckV2ZW50c0ltcGwuQ3JlYXRlOworZW5kOworCisKK3sgVFByb2Nlc3NvckV2ZW50c0ltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUmVxcyA6PSAwOworICBDb25zb2xlLldyaXRlTGluZSgnUHJvY2Vzc29yRXZlbnRzOiBDbGllbnQgY29ubmVjdGVkLCBwcm9jZXNzaW5nIGJlZ2lucycpOworZW5kOworCitwcm9jZWR1cmUgVFByb2Nlc3NvckV2ZW50c0ltcGwuUHJvY2Vzc2luZyhjb25zdCB0cmFuc3BvcnQ6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1Byb2Nlc3NvckV2ZW50czogUHJvY2Vzc2luZyBvZiBpbmNvbWluZyByZXF1ZXN0IGJlZ2lucycpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm9jZXNzb3JFdmVudHNJbXBsLkNyZWF0ZVJlcXVlc3RDb250ZXh0KCBjb25zdCBhRnVuY3Rpb25OYW1lOiBzdHJpbmcpOiBJUmVxdWVzdEV2ZW50czsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUmVxdWVzdEV2ZW50c0ltcGwuQ3JlYXRlOworICBJbmMoIEZSZXFzKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb2Nlc3NvckV2ZW50c0ltcGwuQ2xlYW51cENvbnRleHQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggJ1Byb2Nlc3NvckV2ZW50czogY29tcGxldGVkIGFmdGVyIGhhbmRsaW5nICcrSW50VG9TdHIoRlJlcXMpKycgcmVxdWVzdHMuJyk7CitlbmQ7CisKKworeyBUUmVxdWVzdEV2ZW50c0ltcGwgfQorCisKK2NvbnN0cnVjdG9yIFRSZXF1ZXN0RXZlbnRzSW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RhcnQgOj0gTm93OworICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogTmV3IHJlcXVlc3QnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlByZVJlYWQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogUmVhZGluZyByZXF1ZXN0IG1lc3NhZ2UgLi4uJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5Qb3N0UmVhZDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBSZWFkaW5nIHJlcXVlc3QgbWVzc2FnZSBjb21wbGV0ZWQnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5QcmVXcml0ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBXcml0aW5nIHJlc3BvbnNlIG1lc3NhZ2UgLi4uJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5Qb3N0V3JpdGU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogV3JpdGluZyByZXNwb25zZSBtZXNzYWdlIGNvbXBsZXRlZCcpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuT25ld2F5Q29tcGxldGU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogT25ld2F5IG1lc3NhZ2UgcHJvY2Vzc2VkJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5VbmhhbmRsZWRFcnJvcihjb25zdCBlOiBFeGNlcHRpb24pOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFVuaGFuZGxlZCBleGNlcHRpb24gb2YgdHlwZSAnK2UuY2xhc3NuYW1lKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLkNsZWFudXBDb250ZXh0OwordmFyIG1pbGxpcyA6IERvdWJsZTsKK2JlZ2luCisgIG1pbGxpcyA6PSAoTm93IC0gRlN0YXJ0KSAqICgyNCo2MCo2MCoxMDAwKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZXF1ZXN0IHByb2Nlc3NpbmcgY29tcGxldGVkIGluICcrSW50VG9TdHIoUm91bmQobWlsbGlzKSkrJyBtcycpOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYmQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCkBAIC0wLDAgKzEsNzIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCitwcm9ncmFtIGNsaWVudDsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRlc3RDbGllbnQgaW4gJ1Rlc3RDbGllbnQucGFzJywKKyAgVGhyaWZ0LlRlc3QsIC8vIGluICdnZW4tZGVscGhpXFRocmlmdC5UZXN0LnBhcycsCisgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKKwordmFyCisgIG5QYXJhbUNvdW50IDogSW50ZWdlcjsKKyAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKKyAgaSA6IEludGVnZXI7CisgIGFyZyA6IHN0cmluZzsKKworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ0RlbHBoaSBUZXN0Q2xpZW50ICcrVGhyaWZ0LlZlcnNpb24pOworICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CisgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7CisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbyBiZWdpbgorICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CisgICAgICBhcmdzW2ktMV0gOj0gYXJnOworICAgIGVuZDsKKworICAgIEV4aXRDb2RlIDo9IFRUZXN0Q2xpZW50LkV4ZWN1dGUoIGFyZ3MpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyBiZWdpbgorICAgICAgRXhpdENvZGUgOj0gJEZGOworICAgIGVuZDsKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgICAgICBFeGl0Q29kZSA6PSAkRkY7CisgICAgZW5kOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1JFQURNRS5tZCBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE0NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjggQEAKK0hvdyB0byB1c2UgdGhlIHRlc3QgY2FzZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0gY29weSBhbmQgdGhlIHRlbXBsYXRlIGJhdGNoIGZpbGUKKy0gb3BlbiB0aGUgYmF0Y2ggZmlsZSBhbmQgYWRqdXN0IGNvbmZpZ3VyYXRpb24gYXMgbmVjZXNzYXJ5CistIHJ1biB0aGUgYmF0Y2gKKworCitDb25maWd1cmF0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU1ZOV09SS0RJUgorc2hvdWxkIHBvaW50IHRvIHRoZSBUaHJpZnQgd29ya2luZyBjb3B5IHJvb3QKKworTVlfVEhSSUZUX0ZJTEVTCitjYW4gYmUgc2V0IHRvIHBvaW50IHRvIGEgZm9sZGVyIHdpdGggbW9yZSB0aHJpZnQgSURMIGZpbGVzLgorSWYgeW91IGRvbid0IGhhdmUgYW55IHN1Y2ggZmlsZXMsIGp1c3QgbGVhdmUgdGhlIHNldHRpbmcgYmxhbmsuCisKK0JJTgorTG9jYWwgTVNZUyBiaW5hcnkgZm9sZGVyLiBZb3VyIFRIUklGVC5FWEUgaXMgaW5zdGFsbGVkIGhlcmUuCisKK01JTkdXX0JJTgorTG9jYWwgTWluR1cgYmluIGZvbGRlci4gQ29udGFpbnMgRExMIGZpbGVzIHJlcXVpcmVkIGJ5IFRIUklGVC5FWEUKKworRENDCitJZGVudGlmaWVzIHRoZSBEZWxwaGkgQ29tbWFuZCBMaW5lIGNvbXBpbGVyIChkY2MzMi5leGUpCitUbyBiZSBjb25maWd1aXJlZCBvbmx5LCBpZiB0aGUgZGVmYXVsdCBpcyBub3Qgc3VpdGFibGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKypFT0YqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vcnVuLVBhc2NhbC1Db2RlZ2VuLVRlc3RzLmJhdC50bXBsIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vcnVuLVBhc2NhbC1Db2RlZ2VuLVRlc3RzLmJhdC50bXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWIwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwKQEAgLTAsMCArMSwxNzMgQEAKK1JFTSAvKgorUkVNICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorUkVNICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK1JFTSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitSRU0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK1JFTSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK1JFTSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK1JFTSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorUkVNICoKK1JFTSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitSRU0gKgorUkVNICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorUkVNICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK1JFTSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorUkVNICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK1JFTSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK1JFTSAqIHVuZGVyIHRoZSBMaWNlbnNlLgorUkVNICovCitAZWNobyBvZmYKK2lmICIiPT0iJTEiIGdvdG8gQ09ORklHCitnb3RvIEhBTkRMRURJUgorCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpDT05GSUcKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gKiBDT05GSUdVUkFUSU9OIEJFR0lOCityZW0gKiBjb25maWd1cmF0aW9uIHNldHRpbmdzLCBhZGp1c3QgYXMgbmVjZXNzYXJ5IHRvIG1lZXQgeW91ciBzeXN0ZW0gc2V0dXAKK3NldCBTVk5XT1JLRElSPQorc2V0IE1ZX1RIUklGVF9GSUxFUz0KK3NldCBCSU49QzpcTVN5czEwXGxvY2FsXGJpbgorc2V0IE1JTkdXX0JJTj1DOlxNaW5HV1xiaW4KK3NldCBEQ0M9CitzZXQgU1VCRElSPWdlbi1kZWxwaGkKK3JlbSAqIENPTkZJR1VSQVRJT04gRU5ECisKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6U1RBUlQKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gKiBjb25maWd1cmVkPworaWYgIiVTVk5XT1JLRElSJSI9PSIiIGdvdG8gQ09ORklHX0VSUk9SCisKK3JlbSAqIHRyeSB0byBmaW5kIGRjYzMyLmV4ZQorZWNobyBMb29raW5nIGZvciBkY2MzMi5leGUgLi4uCitpZiBub3QgZXhpc3QgIiVEQ0MlIiBzZXQgRENDPSVQcm9ncmFtRmlsZXMlXEVtYmFyY2FkZXJvXFJBRCBTdHVkaW9cOC4wXGJpblxkY2MzMi5leGUKK2lmIG5vdCBleGlzdCAiJURDQyUiIHNldCBEQ0M9JVByb2dyYW1GaWxlcyh4ODYpJVxFbWJhcmNhZGVyb1xSQUQgU3R1ZGlvXDguMFxiaW5cZGNjMzIuZXhlCitpZiBub3QgZXhpc3QgIiVEQ0MlIiBnb3RvIENPTkZJR19FUlJPUgorZWNobyBGb3VuZCAlRENDJQorZWNoby4KKworcmVtICogc29tZSBoZWxwZXJzCitzZXQgUEFUSD0lQklOJTslTUlOR1dfQklOJTslUEFUSCUKK3NldCBUQVJHRVQ9JVNWTldPUktESVIlXC4uXHRocmlmdC10ZXN0aW5nCitzZXQgU09VUkNFPSVTVk5XT1JLRElSJQorc2V0IFRFU1RBUFA9VGVzdFByb2plY3QKK3NldCBVTklUU0VBUkNIPSVTT1VSQ0UlXGxpYlxwYXNcc3JjOyVTT1VSQ0UlXGxpYlxkZWxwaGlcc3JjCitzZXQgT1VURENVPSIlVEFSR0VUJVxkY3UiCitzZXQgTE9HRklMRT0lVEFSR0VUJVwlU1VCRElSJVxjb2RlZ2VuLmxvZworCityZW0gKiBjcmVhdGUgYW5kL29yIGVtcHR5IHRhcmdldCBkaXJzCitpZiBub3QgZXhpc3QgIiVUQVJHRVQlIiAgICAgICAgICAgbWQgIiVUQVJHRVQlIgoraWYgbm90IGV4aXN0ICIlVEFSR0VUJVwlU1VCRElSJSIgIG1kICIlVEFSR0VUJVwlU1VCRElSJSIKK2lmIG5vdCBleGlzdCAiJU9VVERDVSUiICAgICAgICAgICBtZCAiJU9VVERDVSUiCitpZiBleGlzdCAiJVRBUkdFVCVcKi50aHJpZnQiICAgICAgZGVsICIlVEFSR0VUJVwqLnRocmlmdCIgICAgICAgL1EKK2lmIGV4aXN0ICIlVEFSR0VUJVwlU1VCRElSJVwqLioiICBkZWwgIiVUQVJHRVQlXCVTVUJESVIlXCouKiIgICAvUQoraWYgZXhpc3QgIiVPVVREQ1UlXCouKiIgICAgICAgICAgIGRlbCAiJU9VVERDVSVcKi4qIiAgICAgICAgICAgIC9RCisKK3JlbSAqIHJlY3Vyc2UgdGhyb3VnaCB0aHJpZnQgV0MgYW5kICJteSB0aHJpZnQgZmlsZXMiIGZvbGRlcgorcmVtICogY29waWVzIGFsbCAudGhyaWZ0IGZpbGVzIGludG8gdGhyaWZ0LXRlc3RpbmcKK2NhbGwgJTAgJVNPVVJDRSUKK2lmIG5vdCAiJU1ZX1RIUklGVF9GSUxFUyUiPT0iIiBjYWxsICUwICVNWV9USFJJRlRfRklMRVMlCisKK3JlbSAqIGNvbXBpbGUgYWxsIHRocmlmdCBmaWxlcywgZ2VuZXJhdGUgUEFTIGFuZCBDKysgY29kZQorZWNoby4KK2VjaG8gR2VuZXJhdGluZyBjb2RlLCBwbGVhc2Ugd2FpdCAuLi4KK2NkICIlVEFSR0VUJSIKK2ZvciAlJWEgaW4gKCoudGhyaWZ0KSBkbyAiJUJJTiVcdGhyaWZ0LmV4ZSIgLXYgLS1nZW4gZGVscGhpOnJlZ2lzdGVyX3R5cGVzLGNvbnN0cHJlZml4LGV2ZW50cyx4bWxkb2MgIiUlYSIgMj4+ICIlTE9HRklMRSUiCitSRU0gKiBmb3IgJSVhIGluICgqLnRocmlmdCkgZG8gIiVCSU4lXHRocmlmdC5leGUiIC12IC0tZ2VuIGNwcCAiJSVhIiA+PiBOVUw6CitjbWQgL2Mgc3RhcnQgbm90ZXBhZCAiJUxPR0ZJTEUlIgorY2QgLi4KKworcmVtICogY2hlY2sgZm9yIHNwZWNpYWwgRGVscGhpIHRlc3RjYXNlcyBiZWluZyBwcm9jZXNzZWQKK2lmIG5vdCBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiVcUmVzZXJ2ZWRLZXl3b3Jkcy5wYXMiIGdvdG8gVEVTVENBU0VfTUlTU0lORworCisKK3JlbSAqIGdlbmVyYXRlIGEgbWluaW1hbCBEUFIgZmlsZSB0aGF0IHVzZXMgYWxsIGdlbmVyYXRlZCBwYXNjYWwgdW5pdHMKK2NkICIlVEFSR0VUJVwlU1VCRElSJVwiCitpZiBleGlzdCBpbmhlcml0ZWQuKiAgcmVuIGluaGVyaXRlZC4qICBfaW5oZXJpdGVkLioKK2VjaG8gcHJvZ3JhbSAlVEVTVEFQUCU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJVRFU1RBUFAlLmRwcgorZWNobyB7JEFQUFRZUEUgQ09OU09MRX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gdXNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZm9yICUlYSBpbiAoKi5wYXMpIGRvIGVjaG8gICAlJX5uYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV2luZG93cywgQ2xhc3NlcywgU3lzVXRpbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV3JpdGVsbignU3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIScpOyAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXcml0ZWxuKCdMaXN0IG9mIHVuaXRzOicpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZm9yICUlYSBpbiAoKi5wYXMpIGRvIGVjaG8gICBXcml0ZSgnJSV+bmEnOjMwLCcnOjEwKTsgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV3JpdGVsbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gZW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNoby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitjZCAuLlwuLgorCityZW0gKiB0cnkgdG8gY29tcGlsZSB0aGUgRFBSCityZW0gKiB0aGlzIHNob3VsZCBub3QgdGhyb3cgYW55IGVycm9ycywgd2FybmluZ3Mgb3IgaGludHMKKyIlRENDJSIgIC1CICIlVEFSR0VUJVwlU1VCRElSJVwlVEVTVEFQUCUiIC1VIiVVTklUU0VBUkNIJSIgLUkiJVVOSVRTRUFSQ0glIiAtTiIlT1VURENVJSIgLUUiJVRBUkdFVCVcJVNVQkRJUiUiCitkaXIgIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJS5leGUiCitpZiBub3QgZXhpc3QgIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJS5leGUiICBnb3RvIENPREVHRU5fRkFJTEVECitlY2hvLgorZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBUaGUgY29tcGlsZWQgcHJvZ3JhbSBpcyBub3cgZXhlY3V0ZWQuIElmIGl0IGhhbmdzIG9yIGNyYXNoZXMsIHdlCitlY2hvIGhhdmUgYSBzZXJpb3VzIHByb2JsZW0gd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGUuIEV4cGVjdGVkIG91dHB1dAorZWNobyBpcyAiU3VjY2Vzc2Z1bGx5IGNvbXBpbGVkOiIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIGdlbmVyYXRlZCB1bml0cy4KK2VjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyIlVEFSR0VUJVwlU1VCRElSJVwlVEVTVEFQUCUuZXhlIgorZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNoby4KK3BhdXNlCitHT1RPIEVPRgorCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpEWEVfTk9UX0ZPVU5ECitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gRGVscGhpIENvbXBpbGVyIChkY2MzMi5leGUpIG5vdCBmb3VuZC4KK2VjaG8gUGxlYXNlIGNoZWNrIHRoZSAiRENDIiBzZXR0aW5nIGluIHRoaXMgYmF0Y2guCitlY2hvLgorY21kIC9jIHN0YXJ0IG5vdGVwYWQgUkVBRE1FLk1ECitjbWQgL2Mgc3RhcnQgbm90ZXBhZCAlMAorcGF1c2UKK0dPVE8gRU9GCisKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6Q09ORklHX0VSUk9SCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gTWlzc2luZywgaW5jb21wbGV0ZSBvciB3cm9uZyBjb25maWd1cmF0aW9uIHNldHRpbmdzIQorY21kIC9jIHN0YXJ0IG5vdGVwYWQgUkVBRE1FLk1ECitjbWQgL2Mgc3RhcnQgbm90ZXBhZCAlMAorcGF1c2UKK0dPVE8gRU9GCisKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6VEVTVENBU0VfTUlTU0lORworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIE1pc3NpbmcgYW4gZXhwZWN0ZWQgRGVscGhpIHRlc3RjYXNlIQorcGF1c2UKK0dPVE8gRU9GCisKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6Q09ERUdFTl9GQUlMRUQKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBDb2RlIGdlbmVyYXRpb24gRkFJTEVEIQorcGF1c2UKK0dPVE8gRU9GCisKKworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6SEFORExFRElSCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFTSBlY2hvICUxCitmb3IgL0QgJSVhIGluICglMVwqKSBkbyBjYWxsICUwICUlYQoraWYgZXhpc3QgIiUxXCoudGhyaWZ0IiAgIGNvcHkgL2IgIiUxXCoudGhyaWZ0IiAiJVRBUkdFVCVcKi4qIgorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpFT0YKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDdhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtYWtlIHN1cmUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcHJvZHVjZSBuYW1lIGNvbGxpc2lvbnMgd2l0aCBwcmVkZWZpbmVkIGtleXdvcmRzCituYW1lc3BhY2UgZGVscGhpIFN5c1V0aWxzCisKK2NvbnN0IGkzMiBpbnRlZ2VyID0gNDIKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiYzhjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcgpAQCAtMCwwICsxLDE1IEBACitwcm9ncmFtIFJlc2VydmVkS2V5d29yZHM7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLCBTeXN0ZW1fOworCitiZWdpbgorICB0cnkKKyAgICB7IFRPRE8gLW9Vc2VyIC1jQ29uc29sZSBNYWluIDogQ29kZSBoaWVyIGVpbmb8Z2VuIH0KKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDk1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvagpAQCAtMCwwICsxLDExMiBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57RjJFOUI2RkMtQTkzMS00MjcxLThFMzAtNUE0RTQwMjQ4MUI0fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5SZXNlcnZlZEtleXdvcmRzLmRwcjwvTWFpblNvdXJjZT4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4zPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxCYXNpcz5UcnVlPC9CYXNpcz4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorCQkJPEFwcFR5cGU+Q29uc29sZTwvQXBwVHlwZT4KKwkJCTxGcmFtZXdvcmtUeXBlPk5vbmU8L0ZyYW1ld29ya1R5cGU+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2lzJyBvciAnJChCYXNlKSchPScnIj4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4KKwkJCTxDZmdfMj50cnVlPC9DZmdfMj4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPgorCQkJPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+CisJCQk8RENDX0RjdU91dHB1dD4uXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+Z2VuLWRlbHBoaTsuLlwuLlxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgorCQkJPERDQ19FeGVPdXRwdXQ+LlwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+CisJCQk8RENDX04+ZmFsc2U8L0RDQ19OPgorCQkJPERDQ19TPmZhbHNlPC9EQ0NfUz4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCQk8RENDX0U+ZmFsc2U8L0RDQ19FPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKwkJCTxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+CisJCQk8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisJCQk8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+CisJCQk8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+CisJCQk8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJSZXNlcnZlZEtleXdvcmRzLmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByZUJ1aWxkRXZlbnQ+PCFbQ0RBVEFbdGhyaWZ0IC1yICAtZ2VuIGRlbHBoaSBSZXNlcnZlZEtleXdvcmRzLnRocmlmdF1dPjwvUHJlQnVpbGRFdmVudD4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQkJPFZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzE8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KKwkJCQkJPC9WZXJzaW9uSW5mbz4KKwkJCQkJPFZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+UmVzZXJ2ZWRLZXl3b3Jkcy5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ5ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0CkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKK25hbWVzcGFjZSBkZWxwaGkgU3lzdGVtCisKK2luY2x1ZGUgIlJlc2VydmVkSW5jbHVkZWQudGhyaWZ0IgorCisKK3R5cGVkZWYgaTMyIENhcmRpbmFsCit0eXBlZGVmIHN0cmluZyBtZXNzYWdlCit0eXBlZGVmIGxpc3Q8IG1hcDwgQ2FyZGluYWwsIG1lc3NhZ2U+PiBwcm9ncmFtCisKK3N0cnVjdCB1bml0IHsKKyAgMTogQ2FyZGluYWwgZG93bnRvOworICAyOiBwcm9ncmFtIHByb2NlZHVyZTsKK30KKwordHlwZWRlZiBzZXQ8IHVuaXQ+IHVuaXRzCisKK2V4Y2VwdGlvbiBleGNlcHRpb24xIHsKKyAgMTogcHJvZ3JhbSBtZXNzYWdlOworICAyOiB1bml0IGFycmF5OworfQorCitzZXJ2aWNlIGNvbnN0cnVjdG9yIHsKKyAgdW5pdCBDcmVhdGUoMTogQ2FyZGluYWwgYXNtOyAyOiBtZXNzYWdlIGluaGVyaXRlZCkgdGhyb3dzICgxOiBleGNlcHRpb24xIGxhYmVsKTsKKyAgdW5pdHMgRGVzdHJveSgpOworfQorCitjb25zdCBDYXJkaW5hbCBkb3dudG8gPSArMQorY29uc3QgQ2FyZGluYWwgcHVibGlzaGVkID0gLTEKKworZW51bSBrZXl3b3JkcyB7CisgIHJlY29yZCA9IDEsCisgIHJlcGVhdCA9IDIsCisgIGRlcHJlY2F0ZWQgPSAzCit9CisKKworc3RydWN0IFN0cnVjdF9saXN0cyB7CisgIDE6IGxpc3Q8U3RydWN0X3NpbXBsZT4gaW5pdDsKKyAgMjogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBzdHJ1YzsKKyAgMzogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBmaWVsZDsKKyAgNDogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBmaWVsZF87CisgIDU6IGxpc3Q8U3RydWN0X3NpbXBsZT4gdHJhY2tlcjsKKyAgNjogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3N0cnVjdHMgeworICAxOiBTdHJ1Y3Rfc2ltcGxlIGluaXQ7CisgIDI6IFN0cnVjdF9zaW1wbGUgc3RydWM7CisgIDM6IFN0cnVjdF9zaW1wbGUgZmllbGQ7CisgIDQ6IFN0cnVjdF9zaW1wbGUgZmllbGRfOworICA1OiBTdHJ1Y3Rfc2ltcGxlIHRyYWNrZXI7CisgIDY6IFN0cnVjdF9zaW1wbGUgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zaW1wbGUgeworICAxOiBib29sIGluaXQ7CisgIDI6IGJvb2wgc3RydWM7CisgIDM6IGJvb2wgZmllbGQ7CisgIDQ6IGJvb2wgZmllbGRfOworICA1OiBib29sIHRyYWNrZXI7CisgIDY6IGJvb2wgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zdHJpbmdzIHsKKyAgMTogc3RyaW5nIGluaXQ7CisgIDI6IHN0cmluZyBzdHJ1YzsKKyAgMzogc3RyaW5nIGZpZWxkOworICA0OiBzdHJpbmcgZmllbGRfOworICA1OiBzdHJpbmcgdHJhY2tlcjsKKyAgNjogc3RyaW5nIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3RfYmluYXJ5IHsKKyAgMTogYmluYXJ5IGluaXQ7CisgIDI6IGJpbmFyeSBzdHJ1YzsKKyAgMzogYmluYXJ5IGZpZWxkOworICA0OiBiaW5hcnkgZmllbGRfOworICA1OiBiaW5hcnkgdHJhY2tlcjsKKyAgNjogYmluYXJ5IFNlbGY7Cit9CisKKwordHlwZWRlZiBpMzIgSVByb3RvY29sIAordHlwZWRlZiBpMzIgSVRyYW5zcG9ydAordHlwZWRlZiBpMzIgSUZhY2UKK3R5cGVkZWYgaTMyIElBc3luYwordHlwZWRlZiBpMzIgU3lzdGVtCit0eXBlZGVmIGkzMiBTeXNVdGlscwordHlwZWRlZiBpMzIgR2VuZXJpY3MKK3R5cGVkZWYgaTMyIFRocmlmdAorCitzdHJ1Y3QgU3RydWN0X1RocmlmdF9OYW1lcyB7CisgIDE6IElQcm90b2NvbCAgIElQcm90b2NvbAorICAyOiBJVHJhbnNwb3J0ICBJVHJhbnNwb3J0CisgIDM6IElGYWNlICAgICAgIElGYWNlCisgIDQ6IElBc3luYyAgICAgIElBc3luYworICA1OiBTeXN0ZW0gICAgICBTeXN0ZW0KKyAgNjogU3lzVXRpbHMgICAgU3lzVXRpbHMKKyAgNzogR2VuZXJpY3MgICAgR2VuZXJpY3MKKyAgODogVGhyaWZ0ICAgICAgVGhyaWZ0Cit9CisKKworZW51bSBUaHJpZnQ0NTU0X0VudW0geworICBGb28gPSAwLAorICBCYXIgPSAxLAorICBCYXogPSAyLAorfQorCitzdHJ1Y3QgVGhyaWZ0NDU1NF9TdHJ1Y3QgeworICAxIDogb3B0aW9uYWwgZG91YmxlIE1pblZhbHVlCisgIDIgOiBvcHRpb25hbCBkb3VibGUgTWF4VmFsdWUKKyAgMyA6IG9wdGlvbmFsIGJvb2wgSW50ZWdlciAgLy8gY2F1c2VzIGlzc3VlCisgIDQgOiBvcHRpb25hbCBUaHJpZnQ0NTU0X0VudW0gRm9vCit9CisKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbWFrZXRlc3Quc2ggYi9saWIvZGVscGhpL3Rlc3QvbWFrZXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGYwNjM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gZGVscGhpIC1vIC4gLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmRmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcwpAQCAtMCwwICsxLDEzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IE11bHRpcGxleC5DbGllbnQuTWFpbjsKKworey4kREVGSU5FIFN0cmVzc1Rlc3R9ICAgLy8gYWN0aXZhdGUgdG8gc3RyZXNzLXRlc3QgdGhlIHNlcnZlciB3aXRoIGZyZXF1ZW50IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzCit7LiRERUZJTkUgUGVyZlRlc3R9ICAgICAvLyBhY3RpdmF0ZSB0byBhY3RpdmF0ZSB0aGUgcGVyZm9ybWFuY2UgdGVzdAorCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywgQ2xhc3NlcywKKyAgRGF0ZVV0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5TdHJlYW0sCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgQmVuY2htYXJrLCAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgQWdnciwgICAgICAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgTXVsdGlwbGV4LlRlc3QuQ29tbW9uOworCit0eXBlCisgIFRUZXN0Q2xpZW50ID0gY2xhc3MKKyAgcHJvdGVjdGVkCisgICAgRlByb3RvY29sIDogSVByb3RvY29sOworCisgICAgcHJvY2VkdXJlIFBhcnNlQXJncyggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgU2V0dXA7CisgICAgcHJvY2VkdXJlIFJ1bjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICAgIGNsYXNzIHByb2NlZHVyZSBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKKwordHlwZQorICBJU2VydmljZUNsaWVudCA9IGludGVyZmFjZQorICAgIFsnezc3NDVDMUMyLUFCMjAtNDNCQS1CNkYwLTA4QkY5MkRFMEJBQ30nXQorICAgIHByb2NlZHVyZSBUZXN0OworICBlbmQ7CisKKy8vLS0tIFRUZXN0Q2xpZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RDbGllbnQuRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK3ZhciBjbGllbnQgOiBUVGVzdENsaWVudDsKK2JlZ2luCisgIGNsaWVudCA6PSBUVGVzdENsaWVudC5DcmVhdGUoYXJncyk7CisgIHRyeQorICAgIGNsaWVudC5SdW47CisgIGZpbmFsbHkKKyAgICBjbGllbnQuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRUZXN0Q2xpZW50LkNyZWF0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIFBhcnNlQXJncyhhcmdzKTsKKyAgU2V0dXA7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0Q2xpZW50LlBhcnNlQXJncyggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK2JlZ2luCisgIGlmIExlbmd0aChhcmdzKSA8PiAwCisgIHRoZW4gcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnTm8gYXJncyBhY2NlcHRlZCBzbyBmYXInKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RDbGllbnQuU2V0dXA7Cit2YXIgdHJhbnMgOiBJVHJhbnNwb3J0OworYmVnaW4KKyAgdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCAnbG9jYWxob3N0JywgOTA5MCk7CisgIHRyYW5zIDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggdHJhbnMpOworICB0cmFucy5PcGVuOworICBGUHJvdG9jb2wgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zLCBUUlVFLCBUUlVFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RDbGllbnQuUnVuOwordmFyIGJlbmNoIDogVEJlbmNobWFya1NlcnZpY2UuSWZhY2U7CisgICAgYWdnciAgOiBUQWdnci5JZmFjZTsKKyAgICBtdWx0aXBsZXggOiBJUHJvdG9jb2w7CisgICAgaSAgICAgICAgIDogSW50ZWdlcjsKK2JlZ2luCisgIHRyeQorICAgIG11bHRpcGxleCA6PSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5DcmVhdGUoIEZQcm90b2NvbCwgTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICBiZW5jaCAgICAgOj0gVEJlbmNobWFya1NlcnZpY2UuVENsaWVudC5DcmVhdGUoIG11bHRpcGxleCk7CisKKyAgICBtdWx0aXBsZXggOj0gVE11bHRpcGxleGVkUHJvdG9jb2wuQ3JlYXRlKCBGUHJvdG9jb2wsIE5BTUVfQUdHUik7CisgICAgYWdnciAgICAgIDo9IFRBZ2dyLlRDbGllbnQuQ3JlYXRlKCBtdWx0aXBsZXgpOworCisgICAgZm9yIGkgOj0gMSB0byAxMAorICAgIGRvIGFnZ3IuYWRkVmFsdWUoIGJlbmNoLmZpYm9uYWNjaShpKSk7CisKKyAgICBmb3IgaSBpbiBhZ2dyLmdldFZhbHVlcworICAgIGRvIFdyaXRlKEludFRvU3RyKGkpKycgJyk7CisgICAgV3JpdGVMbjsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gV3JpdGVsbigjMTArZS5NZXNzYWdlKTsKKyAgZW5kOworZW5kOworCisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjBmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwpAQCAtMCwwICsxLDIwMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IE11bHRpcGxleC5TZXJ2ZXIuTWFpbjsKKworeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9CisKK3suJERFRklORSBSdW5FbmRsZXNzfSAgIC8vIGFjdGl2YXRlIHRvIGludGVyYWN0aXZlbHkgc3RyZXNzLXRlc3QgdGhlIHNlcnZlciBzdG9wIHJvdXRpbmVzIHZpYSBDdHJsK0MKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgV2luZG93cywgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQuU2VydmVyLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LAorICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBNdWx0aXBsZXguVGVzdC5Db21tb24sCisgIENvbnNvbGVIZWxwZXIsCisgIENvbnRucnM7CisKK3R5cGUKKyAgVFRlc3RTZXJ2ZXIgPSBjbGFzcworICBwdWJsaWMgdHlwZQorICAgIElUZXN0SGFuZGxlciA9IGludGVyZmFjZQorICAgICAgWyd7Q0FFMDlBQUItODBGQi00OEU5LUIzQTgtN0Y5Qjk2RjU0MTlBfSddCisgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworICAgIGVuZDsKKworICBwcm90ZWN0ZWQgdHlwZQorICAgIFRUZXN0SGFuZGxlckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUZXN0SGFuZGxlcikKKyAgICBwcml2YXRlCisgICAgICBGU2VydmVyIDogSVNlcnZlcjsKKyAgICBwcm90ZWN0ZWQKKyAgICAgIC8vIElUZXN0SGFuZGxlcgorICAgICAgcHJvY2VkdXJlIFNldFNlcnZlciggY29uc3QgQVNlcnZlciA6IElTZXJ2ZXIgKTsKKworICAgICAgcHJvcGVydHkgU2VydmVyIDogSVNlcnZlciByZWFkIEZTZXJ2ZXIgd3JpdGUgU2V0U2VydmVyOworICAgIGVuZDsKKworICAgIFRCZW5jaG1hcmtTZXJ2aWNlSW1wbCA9IGNsYXNzKCBUVGVzdEhhbmRsZXJJbXBsLCBUQmVuY2htYXJrU2VydmljZS5JZmFjZSkKKyAgICBwcm90ZWN0ZWQKKyAgICAgIC8vIFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlCisgICAgICBmdW5jdGlvbiBmaWJvbmFjY2kobjogU2hvcnRJbnQpOiBJbnRlZ2VyOworICAgIGVuZDsKKworCisgICAgVEFnZ3JJbXBsID0gY2xhc3MoIFRUZXN0SGFuZGxlckltcGwsIFRBZ2dyLklmYWNlKQorICAgIHByb3RlY3RlZAorICAgICAgRkxpc3QgOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKworICAgICAgLy8gVEFnZ3IuSWZhY2UKKyAgICAgIHByb2NlZHVyZSBhZGRWYWx1ZSh2YWx1ZTogSW50ZWdlcik7CisgICAgICBmdW5jdGlvbiBnZXRWYWx1ZXMoKTogSVRocmlmdExpc3Q8SW50ZWdlcj47CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgICBlbmQ7CisKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK3sgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbCB9CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlNldFNlcnZlciggY29uc3QgQVNlcnZlcjogSVNlcnZlcik7CitiZWdpbgorICBGU2VydmVyIDo9IEFTZXJ2ZXI7CitlbmQ7CisKKworeyBUVGVzdFNlcnZlci5UQmVuY2htYXJrU2VydmljZUltcGwgfQorCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UQmVuY2htYXJrU2VydmljZUltcGwuZmlib25hY2NpKG46IFNob3J0SW50KTogSW50ZWdlcjsKK3ZhciBwcmV2LCBuZXh0IDogSW50ZWdlcjsKK2JlZ2luCisgIHByZXYgICA6PSAwOworICByZXN1bHQgOj0gMTsKKyAgd2hpbGUgbiA+IDAgZG8gYmVnaW4KKyAgICBuZXh0ICAgOj0gcmVzdWx0ICsgcHJldjsKKyAgICBwcmV2ICAgOj0gcmVzdWx0OworICAgIHJlc3VsdCA6PSBuZXh0OworICAgIERlYyhuKTsKKyAgZW5kOworZW5kOworCit7IFRUZXN0U2VydmVyLlRBZ2dySW1wbCB9CisKK2NvbnN0cnVjdG9yIFRUZXN0U2VydmVyLlRBZ2dySW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTGlzdCA6PSBUVGhyaWZ0TGlzdEltcGw8SW50ZWdlcj4uQ3JlYXRlOworZW5kOworCisKK2Rlc3RydWN0b3IgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGTGlzdCk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UQWdnckltcGwuYWRkVmFsdWUodmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuQWRkKCB2YWx1ZSk7CitlbmQ7CisKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLmdldFZhbHVlcygpOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGTGlzdDsKK2VuZDsKKworCit7IFRUZXN0U2VydmVyIH0KKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7Cit2YXIKKyAgVHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICBQcm90b2NvbEZhY3RvcnkgIDogSVByb3RvY29sRmFjdG9yeTsKKyAgU2VydmVyVHJhbnMgICAgICA6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgIGJlbmNoSGFuZGxlciAgICAgOiBUQmVuY2htYXJrU2VydmljZS5JZmFjZTsKKyAgYWdnckhhbmRsZXIgICAgICA6IFRBZ2dyLklmYWNlOworICBiZW5jaFByb2Nlc3NvciAgIDogSVByb2Nlc3NvcjsKKyAgYWdnclByb2Nlc3NvciAgICA6IElQcm9jZXNzb3I7CisgIG11bHRpcGxleCAgICAgICAgOiBJTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisgIFNlcnZlckVuZ2luZSAgICAgOiBJU2VydmVyOworYmVnaW4KKyAgdHJ5CisgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICBQcm90b2NvbEZhY3RvcnkgIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKCBUUlVFLCBUUlVFKTsKKyAgICBzZXJ2ZXJ0cmFucyAgICAgIDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggOTA5MCwgMCwgRkFMU0UpOworICAgIFRyYW5zcG9ydEZhY3RvcnkgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuVEZhY3RvcnkuQ3JlYXRlOworCisgICAgYmVuY2hIYW5kbGVyICAgICA6PSBUQmVuY2htYXJrU2VydmljZUltcGwuQ3JlYXRlOworICAgIGJlbmNoUHJvY2Vzc29yICAgOj0gVEJlbmNobWFya1NlcnZpY2UuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBiZW5jaEhhbmRsZXIpOworCisgICAgYWdnckhhbmRsZXIgICAgICA6PSBUQWdnckltcGwuQ3JlYXRlOworICAgIGFnZ3JQcm9jZXNzb3IgICAgOj0gVEFnZ3IuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBhZ2dySGFuZGxlcik7CisKKyAgICBtdWx0aXBsZXggICAgICAgIDo9IFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuQ3JlYXRlOworICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvciggTkFNRV9CRU5DSE1BUktTRVJWSUNFLCBiZW5jaFByb2Nlc3Nvcik7CisgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0FHR1IsICBhZ2dyUHJvY2Vzc29yKTsKKworICAgIFNlcnZlckVuZ2luZSA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggbXVsdGlwbGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyVHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xGYWN0b3J5KTsKKworICAgIChiZW5jaEhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIFNlcnZlckVuZ2luZSk7CisgICAgKGFnZ3JIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOworCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uJyk7CisgICAgU2VydmVyRW5naW5lLnNlcnZlKCk7CisKKyAgICAoYmVuY2hIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBuaWwpOworICAgIChhZ2dySGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggbmlsKTsKKworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSggRS5NZXNzYWdlKTsKKyAgICBlbmQ7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdkb25lLicpOworZW5kOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc4ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKQEAgLTAsMCArMSw2NyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCisKK3Byb2dyYW0gTXVsdGlwbGV4LlRlc3QuQ2xpZW50OworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgTXVsdGlwbGV4LkNsaWVudC5NYWluIGluICdNdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzJywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CisKK3ZhcgorICBuUGFyYW1Db3VudCA6IEludGVnZXI7CisgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CisgIGkgOiBJbnRlZ2VyOworICBhcmcgOiBzdHJpbmc7CisgIHMgOiBzdHJpbmc7CisKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdNdWx0aXBsZXggVGVzdENsaWVudCAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OworICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOworICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8KKyAgICBiZWdpbgorICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CisgICAgICBhcmdzW2ktMV0gOj0gYXJnOworICAgIGVuZDsKKyAgICBUVGVzdENsaWVudC5FeGVjdXRlKCBhcmdzICk7CisgICAgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgICAgICBFeGl0Q29kZSA6PSAkRkZGRjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNvbW1vbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FmMDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNvbW1vbi5wYXMKQEAgLTAsMCArMSwzNSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IE11bHRpcGxleC5UZXN0LkNvbW1vbjsKKworaW50ZXJmYWNlCisKK2NvbnN0CisgIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICdCZW5jaG1hcmtTZXJ2aWNlJzsKKyAgTkFNRV9BR0dSICAgICAgICAgICAgID0gJ0FnZ3InOworCisKK2ltcGxlbWVudGF0aW9uCisKKy8vIG5peAorCitlbmQuCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA0NjJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIKQEAgLTAsMCArMSw2OCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIE11bHRpcGxleC5UZXN0LlNlcnZlcjsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIE11bHRpcGxleC5TZXJ2ZXIuTWFpbiBpbiAnTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcycsCisgIENvbnNvbGVIZWxwZXIgaW4gJy4uXENvbnNvbGVIZWxwZXIucGFzJywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKKwordmFyCisgIG5QYXJhbUNvdW50IDogSW50ZWdlcjsKKyAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKKyAgaSA6IEludGVnZXI7CisgIGFyZyA6IHN0cmluZzsKKyAgcyA6IHN0cmluZzsKKworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ011bHRpcGxleCBUZXN0U2VydmVyICcrVGhyaWZ0LlZlcnNpb24pOworICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CisgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7CisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbworICAgIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworICAgIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGFyZ3MgKTsKKyAgICBXcml0ZWxuKCdQcmVzcyBFTlRFUiB0byBjbG9zZSAuLi4gJyk7IFJlYWRsbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCisKKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzAwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcwpAQCAtMCwwICsxLDM1MCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRlc3RTZXJpYWxpemVyLkRhdGE7CisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIERlYnVnUHJvdG9UZXN0OworCisKK3R5cGUKKyAgRml4dHVyZXMgPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGVPbmVPZkVhY2ggOiBJT25lT2ZFYWNoOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZU5lc3RpbmcgOiBJTmVzdGluZzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGVIb2x5TW9sZXkgOiBJSG9seU1vbGV5OworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZUNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgOiBJQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKKworICAvLyBUaGVzZSBieXRlIGFycmF5cyBhcmUgc2VyaWFsaXplZCB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgc3RydWN0cy4KKyAgLy8gVGhleSB3ZXJlIHNlcmlhbGl6ZWQgaW4gYmluYXJ5IHByb3RvY29sIHVzaW5nIHRocmlmdCAwLjYueCBhbmQgYXJlIHVzZWQgdG8KKyAgLy8gdGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YW5kYXJkIHNjaGVtZS4KKyAgKCoKKyAgICAgICAgICBhbGwgZGF0YSBjb3BpZWQgZnJvbSBKQVZBIHZlcnNpb24sCisgICAgICAgICAgdG8gYmUgdXNlZCBsYXRlcgorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc09uZU9mRWFjaCA9IG5ldyBieXRlW10geworICAgICQwMiwgJDAwLCAkMDEsICQwMSwgJDAyLCAkMDAsICQwMiwgJDAwLCAkMDMsICQwMCwKKyAgICAkMDMsICRENiwgJDA2LCAkMDAsICQwNCwgJDY5LCAkNzgsICQwOCwgJDAwLCAkMDUsCisgICAgJDAxLCAkMDAsICQwMCwgJDAwLCAkMEEsICQwMCwgJDA2LCAkMDAsICQwMCwgJDAwLAorICAgICQwMSwgJDY1LCAkQTAsICRCQywgJDAwLCAkMDQsICQwMCwgJDA3LCAkNDAsICQwOSwKKyAgICAkMjEsICRGQiwgJDU0LCAkNDQsICQyRCwgJDE4LCAkMEIsICQwMCwgJDA4LCAkMDAsCisgICAgJDAwLCAkMDAsICQwRCwgJDRBLCAkNTMsICQ0RiwgJDRFLCAkMjAsICQ1NCwgJDQ4LAorICAgICQ0OSwgJDUzLCAkMjEsICQyMCwgJDIyLCAkMDEsICQwQiwgJDAwLCAkMDksICQwMCwKKyAgICAkMDAsICQwMCwgJDJFLCAkRDMsICQ4MCwgJEUyLCAkODUsICRBRSwgJENFLCAkOUQsCisgICAgJDIwLCAkRDAsICQ5RCwgJENFLCAkQkYsICRFMiwgJDg1LCAkQkYsICREMCwgJEJFLAorICAgICRDOSwgJEExLCAkRDAsICRCMywgJEQwLCAkQjAsICRDRiwgJDgxLCAkRTIsICQ4NCwKKyAgICAkOEUsICQyMCwgJENFLCAkOTEsICQ3NCwgJDc0LCAkQ0UsICRCMSwgJEUyLCAkODUsCisgICAgJEJELCAkQ0UsICRCQSwgJEVGLCAkQkYsICRCRCwgJEUyLCAkODAsICRCQywgJDAyLAorICAgICQwMCwgJDBBLCAkMDAsICQwQiwgJDAwLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwNiwKKyAgICAkNjIsICQ2MSwgJDczLCAkNjUsICQzNiwgJDM0LCAkMEYsICQwMCwgJDBDLCAkMDMsCisgICAgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDEsICQwMiwgJDAzLCAkMEYsICQwMCwgJDBELAorICAgICQwNiwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsICQwMSwgJDAwLCAkMDIsICQwMCwKKyAgICAkMDMsICQwRiwgJDAwLCAkMEUsICQwQSwgJDAwLCAkMDAsICQwMCwgJDAzLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAxLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAzLCAkMDAgfTsKKworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc05lc3RpbmcgPSBuZXcgYnl0ZVtdIHsKKyAgICAkMEMsICQwMCwgJDAxLCAkMDgsICQwMCwgJDAxLCAkMDAsICQwMCwgJDdBLCAkNjksCisgICAgJDBCLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDEzLCAkNDksICQyMCwgJDYxLAorICAgICQ2RCwgJDIwLCAkNjEsICQyMCwgJDYyLCAkNkYsICQ2RSwgJDZCLCAkMkUsICQyRSwKKyAgICAkMkUsICQyMCwgJDc4LCAkNkYsICQ3MiwgJDIxLCAkMDAsICQwQywgJDAwLCAkMDIsCisgICAgJDAyLCAkMDAsICQwMSwgJDAxLCAkMDIsICQwMCwgJDAyLCAkMDAsICQwMywgJDAwLAorICAgICQwMywgJEQ2LCAkMDYsICQwMCwgJDA0LCAkNjksICQ3OCwgJDA4LCAkMDAsICQwNSwKKyAgICAkMDEsICQwMCwgJDAwLCAkMDAsICQwQSwgJDAwLCAkMDYsICQwMCwgJDAwLCAkMDAsCisgICAgJDAxLCAkNjUsICRBMCwgJEJDLCAkMDAsICQwNCwgJDAwLCAkMDcsICQ0MCwgJDA5LAorICAgICQyMSwgJEZCLCAkNTQsICQ0NCwgJDJELCAkMTgsICQwQiwgJDAwLCAkMDgsICQwMCwKKyAgICAkMDAsICQwMCwgJDBELCAkNEEsICQ1MywgJDRGLCAkNEUsICQyMCwgJDU0LCAkNDgsCisgICAgJDQ5LCAkNTMsICQyMSwgJDIwLCAkMjIsICQwMSwgJDBCLCAkMDAsICQwOSwgJDAwLAorICAgICQwMCwgJDAwLCAkMkUsICREMywgJDgwLCAkRTIsICQ4NSwgJEFFLCAkQ0UsICQ5RCwKKyAgICAkMjAsICREMCwgJDlELCAkQ0UsICRCRiwgJEUyLCAkODUsICRCRiwgJEQwLCAkQkUsCisgICAgJEM5LCAkQTEsICREMCwgJEIzLCAkRDAsICRCMCwgJENGLCAkODEsICRFMiwgJDg0LAorICAgICQ4RSwgJDIwLCAkQ0UsICQ5MSwgJDc0LCAkNzQsICRDRSwgJEIxLCAkRTIsICQ4NSwKKyAgICAkQkQsICRDRSwgJEJBLCAkRUYsICRCRiwgJEJELCAkRTIsICQ4MCwgJEJDLCAkMDIsCisgICAgJDAwLCAkMEEsICQwMCwgJDBCLCAkMDAsICQwQiwgJDAwLCAkMDAsICQwMCwgJDA2LAorICAgICQ2MiwgJDYxLCAkNzMsICQ2NSwgJDM2LCAkMzQsICQwRiwgJDAwLCAkMEMsICQwMywKKyAgICAkMDAsICQwMCwgJDAwLCAkMDMsICQwMSwgJDAyLCAkMDMsICQwRiwgJDAwLCAkMEQsCisgICAgJDA2LCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDAxLCAkMDAsICQwMiwgJDAwLAorICAgICQwMywgJDBGLCAkMDAsICQwRSwgJDBBLCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDEsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDMsICQwMCwgJDAwIH07CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzSG9seU1vbGV5ID0gbmV3IGJ5dGVbXSB7CisgICAgJDBGLCAkMDAsICQwMSwgJDBDLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwMiwgJDAwLAorICAgICQwMSwgJDAxLCAkMDIsICQwMCwgJDAyLCAkMDAsICQwMywgJDAwLCAkMDMsICQyMywKKyAgICAkMDYsICQwMCwgJDA0LCAkNjksICQ3OCwgJDA4LCAkMDAsICQwNSwgJDAxLCAkMDAsCisgICAgJDAwLCAkMDAsICQwQSwgJDAwLCAkMDYsICQwMCwgJDAwLCAkMDAsICQwMSwgJDY1LAorICAgICRBMCwgJEJDLCAkMDAsICQwNCwgJDAwLCAkMDcsICQ0MCwgJDA5LCAkMjEsICRGQiwKKyAgICAkNTQsICQ0NCwgJDJELCAkMTgsICQwQiwgJDAwLCAkMDgsICQwMCwgJDAwLCAkMDAsCisgICAgJDBELCAkNEEsICQ1MywgJDRGLCAkNEUsICQyMCwgJDU0LCAkNDgsICQ0OSwgJDUzLAorICAgICQyMSwgJDIwLCAkMjIsICQwMSwgJDBCLCAkMDAsICQwOSwgJDAwLCAkMDAsICQwMCwKKyAgICAkMkUsICREMywgJDgwLCAkRTIsICQ4NSwgJEFFLCAkQ0UsICQ5RCwgJDIwLCAkRDAsCisgICAgJDlELCAkQ0UsICRCRiwgJEUyLCAkODUsICRCRiwgJEQwLCAkQkUsICRDOSwgJEExLAorICAgICREMCwgJEIzLCAkRDAsICRCMCwgJENGLCAkODEsICRFMiwgJDg0LCAkOEUsICQyMCwKKyAgICAkQ0UsICQ5MSwgJDc0LCAkNzQsICRDRSwgJEIxLCAkRTIsICQ4NSwgJEJELCAkQ0UsCisgICAgJEJBLCAkRUYsICRCRiwgJEJELCAkRTIsICQ4MCwgJEJDLCAkMDIsICQwMCwgJDBBLAorICAgICQwMCwgJDBCLCAkMDAsICQwQiwgJDAwLCAkMDAsICQwMCwgJDA2LCAkNjIsICQ2MSwKKyAgICAkNzMsICQ2NSwgJDM2LCAkMzQsICQwRiwgJDAwLCAkMEMsICQwMywgJDAwLCAkMDAsCisgICAgJDAwLCAkMDMsICQwMSwgJDAyLCAkMDMsICQwRiwgJDAwLCAkMEQsICQwNiwgJDAwLAorICAgICQwMCwgJDAwLCAkMDMsICQwMCwgJDAxLCAkMDAsICQwMiwgJDAwLCAkMDMsICQwRiwKKyAgICAkMDAsICQwRSwgJDBBLCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDEsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDMsICQwMCwgJDAyLCAkMDAsICQwMSwgJDAxLCAkMDIsICQwMCwgJDAyLCAkMDAsCisgICAgJDAzLCAkMDAsICQwMywgJEQ2LCAkMDYsICQwMCwgJDA0LCAkNjksICQ3OCwgJDA4LAorICAgICQwMCwgJDA1LCAkMDEsICQwMCwgJDAwLCAkMDAsICQwQSwgJDAwLCAkMDYsICQwMCwKKyAgICAkMDAsICQwMCwgJDAxLCAkNjUsICRBMCwgJEJDLCAkMDAsICQwNCwgJDAwLCAkMDcsCisgICAgJDQwLCAkMDksICQyMSwgJEZCLCAkNTQsICQ0NCwgJDJELCAkMTgsICQwQiwgJDAwLAorICAgICQwOCwgJDAwLCAkMDAsICQwMCwgJDBELCAkNEEsICQ1MywgJDRGLCAkNEUsICQyMCwKKyAgICAkNTQsICQ0OCwgJDQ5LCAkNTMsICQyMSwgJDIwLCAkMjIsICQwMSwgJDBCLCAkMDAsCisgICAgJDA5LCAkMDAsICQwMCwgJDAwLCAkMkUsICREMywgJDgwLCAkRTIsICQ4NSwgJEFFLAorICAgICRDRSwgJDlELCAkMjAsICREMCwgJDlELCAkQ0UsICRCRiwgJEUyLCAkODUsICRCRiwKKyAgICAkRDAsICRCRSwgJEM5LCAkQTEsICREMCwgJEIzLCAkRDAsICRCMCwgJENGLCAkODEsCisgICAgJEUyLCAkODQsICQ4RSwgJDIwLCAkQ0UsICQ5MSwgJDc0LCAkNzQsICRDRSwgJEIxLAorICAgICRFMiwgJDg1LCAkQkQsICRDRSwgJEJBLCAkRUYsICRCRiwgJEJELCAkRTIsICQ4MCwKKyAgICAkQkMsICQwMiwgJDAwLCAkMEEsICQwMCwgJDBCLCAkMDAsICQwQiwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDYsICQ2MiwgJDYxLCAkNzMsICQ2NSwgJDM2LCAkMzQsICQwRiwgJDAwLAorICAgICQwQywgJDAzLCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMSwgJDAyLCAkMDMsICQwRiwKKyAgICAkMDAsICQwRCwgJDA2LCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDAxLCAkMDAsCisgICAgJDAyLCAkMDAsICQwMywgJDBGLCAkMDAsICQwRSwgJDBBLCAkMDAsICQwMCwgJDAwLAorICAgICQwMywgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDEsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDBFLCAkMDAsICQwMiwgJDBGLAorICAgICQwMCwgJDAwLCAkMDAsICQwMywgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwQiwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDAwLCAkMDAsICQwRiwgJDc0LCAkNjgsCisgICAgJDY1LCAkNkUsICQyMCwgJDYxLCAkMjAsICQ2RiwgJDZFLCAkNjUsICQyQywgJDIwLAorICAgICQ3NCwgJDc3LCAkNkYsICQwMCwgJDAwLCAkMDAsICQwNiwgJDc0LCAkNjgsICQ3MiwKKyAgICAkNjUsICQ2NSwgJDIxLCAkMDAsICQwMCwgJDAwLCAkMDYsICQ0NiwgJDRGLCAkNTUsCisgICAgJDUyLCAkMjEsICQyMSwgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwMCwgJDAwLAorICAgICQwMCwgJDA5LCAkNjEsICQ2RSwgJDY0LCAkMjAsICQ2MSwgJDIwLCAkNkYsICQ2RSwKKyAgICAkNjUsICQwMCwgJDAwLCAkMDAsICQwOSwgJDYxLCAkNkUsICQ2NCwgJDIwLCAkNjEsCisgICAgJDIwLCAkNzQsICQ3NywgJDZGLCAkMEQsICQwMCwgJDAzLCAkMEIsICQwRiwgJDAwLAorICAgICQwMCwgJDAwLCAkMDMsICQwMCwgJDAwLCAkMDAsICQwMywgJDc0LCAkNzcsICQ2RiwKKyAgICAkMEMsICQwMCwgJDAwLCAkMDAsICQwMiwgJDA4LCAkMDAsICQwMSwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDEsICQwQiwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQwNSwgJDU3LAorICAgICQ2MSwgJDY5LCAkNzQsICQyRSwgJDAwLCAkMDgsICQwMCwgJDAxLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMiwgJDBCLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDA1LCAkNTcsCisgICAgJDY4LCAkNjEsICQ3NCwgJDNGLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwNSwgJDc0LAorICAgICQ2OCwgJDcyLCAkNjUsICQ2NSwgJDBDLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDA0LCAkN0EsICQ2NSwgJDcyLCAkNkYsICQwQywgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCB9OworCisKKyopCisKKyAgcHJpdmF0ZQorICAgIGNvbnN0CisgICAgICBrVW5pY29kZUJ5dGVzIDogcGFja2VkIGFycmF5WzAuLjQzXSBvZiBCeXRlCisgICAgICAgICAgICAgICAgICAgID0gKCAkZDMsICQ4MCwgJGUyLCAkODUsICRhZSwgJGNlLCAkOWQsICQyMCwgJGQwLCAkOWQsCisgICAgICAgICAgICAgICAgICAgICAgICAkY2UsICRiZiwgJGUyLCAkODUsICRiZiwgJGQwLCAkYmUsICRjOSwgJGExLCAkZDAsCisgICAgICAgICAgICAgICAgICAgICAgICAkYjMsICRkMCwgJGIwLCAkY2YsICQ4MSwgJGUyLCAkODQsICQ4ZSwgJDIwLCAkY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAkOTEsICQ3NCwgJDc0LCAkY2UsICRiMSwgJGUyLCAkODUsICRiZCwgJGNlLCAkYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAkODMsICRlMiwgJDgwLCAkYmMpOworCisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK2NsYXNzIGZ1bmN0aW9uIEZpeHR1cmVzLkNyZWF0ZU9uZU9mRWFjaCA6IElPbmVPZkVhY2g7Cit2YXIgZGIgOiBEb3VibGU7CisgICAgdXMgOiBVdGY4U3RyaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IFRPbmVPZkVhY2hJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0LnNldEltX3RydWUoIFRSVUUpOworICByZXN1bHQuc2V0SW1fZmFsc2UoIEZBTFNFKTsKKyAgcmVzdWx0LnNldEFfYml0ZSggU2hvcnRJbnQoJEQ2KSk7CisgIHJlc3VsdC5zZXRJbnRlZ2VyMTYoIDI3MDAwKTsKKyAgcmVzdWx0LnNldEludGVnZXIzMiggMSBzaGwgMjQpOworICByZXN1bHQuc2V0SW50ZWdlcjY0KCBJbnQ2NCg2MDAwKSAqIEludDY0KDEwMDApICogSW50NjQoMTAwMCkpOworICBkYiA6PSBQaTsKKyAgcmVzdWx0LnNldERvdWJsZV9wcmVjaXNpb24oIGRiKTsKKyAgcmVzdWx0LnNldFNvbWVfY2hhcmFjdGVycyggJ0pTT04gVEhJUyEgXCJcMScpOworCisgIC8vID8/CisgIFNldExlbmd0aCggdXMsIExlbmd0aChrVW5pY29kZUJ5dGVzKSk7CisgIE1vdmUoIGtVbmljb2RlQnl0ZXNbMF0sIHVzWzFdLCBMZW5ndGgoa1VuaWNvZGVCeXRlcykpOworICAvLyA/PworICBTZXRTdHJpbmcoIHVzLCBQQ2hhcihAa1VuaWNvZGVCeXRlc1swXSksIExlbmd0aChrVW5pY29kZUJ5dGVzKSk7CisgIC8vICEhCisgIHJlc3VsdC5zZXRab21nX3VuaWNvZGUoIFVuaWNvZGVTdHJpbmcoIHVzKSk7CisKKyAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQorICByZXN1bHQuU2V0QmFzZTY0KCdiYXNlNjQnKTsKKyAgeyRFTFNFfQorICByZXN1bHQuU2V0QmFzZTY0KCBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcygnYmFzZTY0JykpOworICB7JElGRU5EfQorCisgIC8vIGJ5dGUsIGkxNiwgYW5kIGk2NCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJ5IGRlZmF1bHQgY29uc3RydWN0b3IKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBGaXh0dXJlcy5DcmVhdGVOZXN0aW5nIDogSU5lc3Rpbmc7Cit2YXIgYm9uayA6IElCb25rOworYmVnaW4KKyAgYm9uayA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBib25rLlR5cGVfICAgOj0gMzEzMzc7CisgIGJvbmsuTWVzc2FnZSA6PSAnSSBhbSBhIGJvbmsuLi4geG9yISc7CisKKyAgcmVzdWx0IDo9IFROZXN0aW5nSW1wbC5DcmVhdGU7CisgIHJlc3VsdC5NeV9ib25rIDo9IGJvbms7CisgIHJlc3VsdC5NeV9vb2UgOj0gQ3JlYXRlT25lT2ZFYWNoOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEZpeHR1cmVzLkNyZWF0ZUhvbHlNb2xleSA6IElIb2x5TW9sZXk7Cit2YXIgYmlnIDogSVRocmlmdExpc3Q8SU9uZU9mRWFjaD47CisgICAgc3RhZ2UxIDogSVRocmlmdExpc3Q8U3RyaW5nPjsKKyAgICBzdGFnZTIgOiBJVGhyaWZ0TGlzdDxJQm9uaz47CisgICAgYiAgICAgIDogSUJvbms7CitiZWdpbgorICByZXN1bHQgOj0gVEhvbHlNb2xleUltcGwuQ3JlYXRlOworCisgIGJpZyA6PSBUVGhyaWZ0TGlzdEltcGw8SU9uZU9mRWFjaD4uQ3JlYXRlOworICBiaWcuYWRkKCBDcmVhdGVPbmVPZkVhY2gpOworICBiaWcuYWRkKCBDcmVhdGVOZXN0aW5nLm15X29vZSk7CisgIHJlc3VsdC5CaWcgOj0gYmlnOworICByZXN1bHQuQmlnWzBdLnNldEFfYml0ZSggJDIyKTsKKyAgcmVzdWx0LkJpZ1swXS5zZXRBX2JpdGUoICQyMyk7CisKKyAgcmVzdWx0LkNvbnRhaW4gOj0gVEhhc2hTZXRJbXBsPCBJVGhyaWZ0TGlzdDxzdHJpbmc+Pi5DcmVhdGU7CisgIHN0YWdlMSA6PSBUVGhyaWZ0TGlzdEltcGw8U3RyaW5nPi5DcmVhdGU7CisgIHN0YWdlMS5hZGQoICdhbmQgYSBvbmUnKTsKKyAgc3RhZ2UxLmFkZCggJ2FuZCBhIHR3bycpOworICByZXN1bHQuQ29udGFpbi5hZGQoIHN0YWdlMSk7CisKKyAgc3RhZ2UxIDo9IFRUaHJpZnRMaXN0SW1wbDxTdHJpbmc+LkNyZWF0ZTsKKyAgc3RhZ2UxLmFkZCggJ3RoZW4gYSBvbmUsIHR3bycpOworICBzdGFnZTEuYWRkKCAndGhyZWUhJyk7CisgIHN0YWdlMS5hZGQoICdGT1VSISEnKTsKKyAgcmVzdWx0LkNvbnRhaW4uYWRkKCBzdGFnZTEpOworCisgIHN0YWdlMSA6PSBUVGhyaWZ0TGlzdEltcGw8U3RyaW5nPi5DcmVhdGU7CisgIHJlc3VsdC5Db250YWluLmFkZCggc3RhZ2UxKTsKKworICBzdGFnZTIgOj0gVFRocmlmdExpc3RJbXBsPElCb25rPi5DcmVhdGU7CisgIHJlc3VsdC5Cb25rcyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8IFN0cmluZywgSVRocmlmdExpc3Q8IElCb25rPj4uQ3JlYXRlOworICAvLyBvbmUgZW1wdHkKKyAgcmVzdWx0LkJvbmtzLkFkZCggJ3plcm8nLCBzdGFnZTIpOworCisgIC8vIG9uZSB3aXRoIHR3bworICBzdGFnZTIgOj0gVFRocmlmdExpc3RJbXBsPElCb25rPi5DcmVhdGU7CisgIGIgOj0gVEJvbmtJbXBsLkNyZWF0ZTsKKyAgYi50eXBlXyA6PSAxOworICBiLm1lc3NhZ2UgOj0gJ1dhaXQuJzsKKyAgc3RhZ2UyLkFkZCggYik7CisgIGIgOj0gVEJvbmtJbXBsLkNyZWF0ZTsKKyAgYi50eXBlXyA6PSAyOworICBiLm1lc3NhZ2UgOj0gJ1doYXQ/JzsKKyAgc3RhZ2UyLkFkZCggYik7CisgIHJlc3VsdC5Cb25rcy5BZGQoICd0d28nLCBzdGFnZTIpOworCisgIC8vIG9uZSB3aXRoIHRocmVlCisgIHN0YWdlMiA6PSBUVGhyaWZ0TGlzdEltcGw8SUJvbms+LkNyZWF0ZTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDM7CisgIGIubWVzc2FnZSA6PSAncXVvdGgnOworICBzdGFnZTIuQWRkKCBiKTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDQ7CisgIGIubWVzc2FnZSA6PSAndGhlIHJhdmVuJzsKKyAgc3RhZ2UyLkFkZCggYik7CisgIGIgOj0gVEJvbmtJbXBsLkNyZWF0ZTsKKyAgYi50eXBlXyA6PSA1OworICBiLm1lc3NhZ2UgOj0gJ25ldmVybW9yZSc7CisgIHN0YWdlMi5BZGQoIGIpOworICByZXN1bHQuYm9ua3MuQWRkKCAndGhyZWUnLCBzdGFnZTIpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEZpeHR1cmVzLkNyZWF0ZUNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgOiBJQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKKy8vIHN1cGVyaHVnZSBjb21wYWN0IHByb3RvIHRlc3Qgc3RydWN0CitiZWdpbgorICByZXN1bHQgOj0gVENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0LkFfYnl0ZSA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfYnl0ZTsKKyAgcmVzdWx0LkFfaTE2IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9pMTY7CisgIHJlc3VsdC5BX2kzMiA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfaTMyOworICByZXN1bHQuQV9pNjQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2k2NDsKKyAgcmVzdWx0LkFfZG91YmxlIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9kb3VibGU7CisgIHJlc3VsdC5BX3N0cmluZyA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfc3RyaW5nOworICByZXN1bHQuQV9iaW5hcnkgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2JpbmFyeTsKKyAgcmVzdWx0LlRydWVfZmllbGQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5UcnVlX2ZpZWxkOworICByZXN1bHQuRmFsc2VfZmllbGQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5GYWxzZV9maWVsZDsKKyAgcmVzdWx0LkVtcHR5X3N0cnVjdF9maWVsZCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkVtcHR5X3N0cnVjdF9maWVsZDsKKyAgcmVzdWx0LkJ5dGVfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfbGlzdDsKKyAgcmVzdWx0LkkxNl9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTE2X2xpc3Q7CisgIHJlc3VsdC5JMzJfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkzMl9saXN0OworICByZXN1bHQuSTY0X2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JNjRfbGlzdDsKKyAgcmVzdWx0LkRvdWJsZV9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRG91YmxlX2xpc3Q7CisgIHJlc3VsdC5TdHJpbmdfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19saXN0OworICByZXN1bHQuQmluYXJ5X2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CaW5hcnlfbGlzdDsKKyAgcmVzdWx0LkJvb2xlYW5fbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJvb2xlYW5fbGlzdDsKKyAgcmVzdWx0LlN0cnVjdF9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RydWN0X2xpc3Q7CisgIHJlc3VsdC5CeXRlX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfc2V0OworICByZXN1bHQuSTE2X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkxNl9zZXQ7CisgIHJlc3VsdC5JMzJfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTMyX3NldDsKKyAgcmVzdWx0Lkk2NF9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JNjRfc2V0OworICByZXN1bHQuRG91YmxlX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkRvdWJsZV9zZXQ7CisgIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX3NldDsKKyAgcmVzdWx0LlN0cmluZ19zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfc2V0OworICByZXN1bHQuU3RyaW5nX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7CisgIHJlc3VsdC5CaW5hcnlfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQmluYXJ5X3NldDsKKyAgcmVzdWx0LkJvb2xlYW5fc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQm9vbGVhbl9zZXQ7CisgIHJlc3VsdC5TdHJ1Y3Rfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RydWN0X3NldDsKKyAgcmVzdWx0LkJ5dGVfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2J5dGVfbWFwOworICByZXN1bHQuSTE2X2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTE2X2J5dGVfbWFwOworICByZXN1bHQuSTMyX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTMyX2J5dGVfbWFwOworICByZXN1bHQuSTY0X2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTY0X2J5dGVfbWFwOworICByZXN1bHQuRG91YmxlX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRG91YmxlX2J5dGVfbWFwOworICByZXN1bHQuU3RyaW5nX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX2J5dGVfbWFwOworICByZXN1bHQuQmluYXJ5X2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQmluYXJ5X2J5dGVfbWFwOworICByZXN1bHQuQm9vbGVhbl9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJvb2xlYW5fYnl0ZV9tYXA7CisgIHJlc3VsdC5CeXRlX2kxNl9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2kxNl9tYXA7CisgIHJlc3VsdC5CeXRlX2kzMl9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2kzMl9tYXA7CisgIHJlc3VsdC5CeXRlX2k2NF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2k2NF9tYXA7CisgIHJlc3VsdC5CeXRlX2RvdWJsZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2RvdWJsZV9tYXA7CisgIHJlc3VsdC5CeXRlX3N0cmluZ19tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX3N0cmluZ19tYXA7CisgIHJlc3VsdC5CeXRlX2JpbmFyeV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2JpbmFyeV9tYXA7CisgIHJlc3VsdC5CeXRlX2Jvb2xlYW5fbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9ib29sZWFuX21hcDsKKyAgcmVzdWx0Lkxpc3RfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5MaXN0X2J5dGVfbWFwOworICByZXN1bHQuU2V0X2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU2V0X2J5dGVfbWFwOworICByZXN1bHQuTWFwX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuTWFwX2J5dGVfbWFwOworICByZXN1bHQuQnl0ZV9tYXBfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9tYXBfbWFwOworICByZXN1bHQuQnl0ZV9zZXRfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zZXRfbWFwOworICByZXN1bHQuQnl0ZV9saXN0X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfbGlzdF9tYXA7CisKKyAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQorICByZXN1bHQuQV9iaW5hcnkgOj0gQW5zaVN0cmluZyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKKyAgeyRFTFNFfQorICByZXN1bHQuQV9iaW5hcnkgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoICMwIzEjMiMzIzQjNSM2IzcjOCk7CisgIHskSUZFTkR9CitlbmQ7CisKKworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTIyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKQEAgLTAsMCArMSwyMzEgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworcHJvZ3JhbSBUZXN0U2VyaWFsaXplcjsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFN5c3RlbV8sCisgIERlYnVnUHJvdG9UZXN0LAorICBUZXN0U2VyaWFsaXplci5EYXRhOworCisKKwordHlwZQorICBUVGVzdFNlcmlhbGl6ZXIgPSBjbGFzcyAvL2V4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlCisgICAgRlByb3RvY29scyA6IFRMaXN0PCBJUHJvdG9jb2xGYWN0b3J5PjsKKworICAgIGNsYXNzIGZ1bmN0aW9uICBTZXJpYWxpemUoY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpIDogVEJ5dGVzOyAgb3ZlcmxvYWQ7CisgICAgY2xhc3MgcHJvY2VkdXJlIFNlcmlhbGl6ZShjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsgY29uc3QgYVN0cmVhbSA6IFRTdHJlYW0pOyAgb3ZlcmxvYWQ7CisgICAgY2xhc3MgcHJvY2VkdXJlIERlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRCeXRlczsgY29uc3QgdGFyZ2V0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsgIG92ZXJsb2FkOworICAgIGNsYXNzIHByb2NlZHVyZSBEZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUU3RyZWFtOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOyAgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgVGVzdF9TZXJpYWxpemVyX0Rlc2VyaWFsaXplcjsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgUnVuVGVzdHM7CisgIGVuZDsKKworCisKK3sgVFRlc3RTZXJpYWxpemVyIH0KKworY29uc3RydWN0b3IgVFRlc3RTZXJpYWxpemVyLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZQcm90b2NvbHMgOj0gVExpc3Q8IElQcm90b2NvbEZhY3Rvcnk+LkNyZWF0ZTsKKyAgRlByb3RvY29scy5BZGQoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKKyAgLy9GUHJvdG9jb2xzLkFkZCggVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKKyAgRlByb3RvY29scy5BZGQoIFRKU09OUHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUVGVzdFNlcmlhbGl6ZXIuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZQcm90b2NvbHMpOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKwordHlwZSBUTWV0aG9kID0gKG10X0J5dGVzLCBtdF9TdHJlYW0pOworCisKK3Byb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuVGVzdF9TZXJpYWxpemVyX0Rlc2VyaWFsaXplcjsKK3ZhciBsZXZlbDNvb2UsIGNvcnJlY3QgOiBJT25lT2ZFYWNoOworICAgIGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgIGJ5dGVzICAgOiBUQnl0ZXM7CisgICAgc3RyZWFtICA6IFRGaWxlU3RyZWFtOworICAgIGkgICAgICAgOiBJbnRlZ2VyOworICAgIG1ldGhvZCAgOiBUTWV0aG9kOworYmVnaW4KKyAgY29ycmVjdCA6PSBGaXh0dXJlcy5DcmVhdGVPbmVPZkVhY2g7CisgIHN0cmVhbSAgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCAnVGVzdFNlcmlhbGl6ZXIuZGF0JywgZm1DcmVhdGUpOworICB0cnkKKworICAgIGZvciBtZXRob2QgaW4gW0xvdyhUTWV0aG9kKS4uSGlnaChUTWV0aG9kKV0gZG8gYmVnaW4KKyAgICAgIGZvciBmYWN0b3J5IGluIEZQcm90b2NvbHMgZG8gYmVnaW4KKworICAgICAgICAvLyB3cml0ZQorICAgICAgICBsZXZlbDNvb2UgOj0gRml4dHVyZXMuQ3JlYXRlT25lT2ZFYWNoOworICAgICAgICBjYXNlIG1ldGhvZCBvZgorICAgICAgICAgIG10X0J5dGVzOiAgYnl0ZXMgOj0gU2VyaWFsaXplKCBsZXZlbDNvb2UsIGZhY3RvcnkpOworICAgICAgICAgIG10X1N0cmVhbTogYmVnaW4KKyAgICAgICAgICAgIHN0cmVhbS5TaXplIDo9IDA7CisgICAgICAgICAgICBTZXJpYWxpemUoIGxldmVsM29vZSwgZmFjdG9yeSwgc3RyZWFtKTsKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFTU0VSVCggRkFMU0UpOworICAgICAgICBlbmQ7CisKKyAgICAgICAgLy8gaW5pdCArIHJlYWQKKyAgICAgICAgbGV2ZWwzb29lIDo9IFRPbmVPZkVhY2hJbXBsLkNyZWF0ZTsKKyAgICAgICAgY2FzZSBtZXRob2Qgb2YKKyAgICAgICAgICBtdF9CeXRlczogIERlc2VyaWFsaXplKCBieXRlcywgbGV2ZWwzb29lLCBmYWN0b3J5KTsKKyAgICAgICAgICBtdF9TdHJlYW06IGJlZ2luCisgICAgICAgICAgICBzdHJlYW0uUG9zaXRpb24gOj0gMDsKKyAgICAgICAgICAgIERlc2VyaWFsaXplKCBzdHJlYW0sIGxldmVsM29vZSwgZmFjdG9yeSk7CisgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICBBU1NFUlQoIEZBTFNFKTsKKyAgICAgICAgZW5kOworCisKKyAgICAgICAgLy8gY2hlY2sKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW1fdHJ1ZSA9IGNvcnJlY3QuSW1fdHJ1ZSk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkltX2ZhbHNlID0gY29ycmVjdC5JbV9mYWxzZSk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkFfYml0ZSA9IGNvcnJlY3QuQV9iaXRlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW50ZWdlcjE2ID0gY29ycmVjdC5JbnRlZ2VyMTYpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbnRlZ2VyMzIgPSBjb3JyZWN0LkludGVnZXIzMik7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkludGVnZXI2NCA9IGNvcnJlY3QuSW50ZWdlcjY0KTsKKyAgICAgICAgQVNTRVJUKCBBYnMoIGxldmVsM29vZS5Eb3VibGVfcHJlY2lzaW9uIC0gY29ycmVjdC5Eb3VibGVfcHJlY2lzaW9uKSA8IDFFLTEyKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuU29tZV9jaGFyYWN0ZXJzID0gY29ycmVjdC5Tb21lX2NoYXJhY3RlcnMpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5ab21nX3VuaWNvZGUgPSBjb3JyZWN0LlpvbWdfdW5pY29kZSk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLldoYXRfd2hvID0gY29ycmVjdC5XaGF0X3dobyk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkJhc2U2NCA9IGNvcnJlY3QuQmFzZTY0KTsKKworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5CeXRlX2xpc3QuQ291bnQgPSBjb3JyZWN0LkJ5dGVfbGlzdC5Db3VudCk7CisgICAgICAgIGZvciBpIDo9IDAgdG8gbGV2ZWwzb29lLkJ5dGVfbGlzdC5Db3VudC0xCisgICAgICAgIGRvIEFTU0VSVCggbGV2ZWwzb29lLkJ5dGVfbGlzdFtpXSA9IGNvcnJlY3QuQnl0ZV9saXN0W2ldKTsKKworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JMTZfbGlzdC5Db3VudCA9IGNvcnJlY3QuSTE2X2xpc3QuQ291bnQpOworICAgICAgICBmb3IgaSA6PSAwIHRvIGxldmVsM29vZS5JMTZfbGlzdC5Db3VudC0xCisgICAgICAgIGRvIEFTU0VSVCggbGV2ZWwzb29lLkkxNl9saXN0W2ldID0gY29ycmVjdC5JMTZfbGlzdFtpXSk7CisKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSTY0X2xpc3QuQ291bnQgPSBjb3JyZWN0Lkk2NF9saXN0LkNvdW50KTsKKyAgICAgICAgZm9yIGkgOj0gMCB0byBsZXZlbDNvb2UuSTY0X2xpc3QuQ291bnQtMQorICAgICAgICBkbyBBU1NFUlQoIGxldmVsM29vZS5JNjRfbGlzdFtpXSA9IGNvcnJlY3QuSTY0X2xpc3RbaV0pOworICAgICAgZW5kOworICAgIGVuZDsKKworICBmaW5hbGx5CisgICAgc3RyZWFtLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RTZXJpYWxpemVyLlJ1blRlc3RzOworYmVnaW4KKyAgdHJ5CisgICAgVGVzdF9TZXJpYWxpemVyX0Rlc2VyaWFsaXplcjsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIFdyaXRlbG4oIGUuTWVzc2FnZSk7CisgICAgICBXcml0ZSgnSGl0IEVOVEVSIHRvIGNsb3NlIC4uLiAnKTsgUmVhZGxuOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRUZXN0U2VyaWFsaXplci5TZXJpYWxpemUoY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpIDogVEJ5dGVzOwordmFyIHNlcmlhbCA6IFRTZXJpYWxpemVyOworYmVnaW4KKyAgc2VyaWFsIDo9IFRTZXJpYWxpemVyLkNyZWF0ZSggZmFjdG9yeSk7CisgIHRyeQorICAgIHJlc3VsdCA6PSBzZXJpYWwuU2VyaWFsaXplKCBpbnB1dCk7CisgIGZpbmFsbHkKKyAgICBzZXJpYWwuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuU2VyaWFsaXplKGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OyBjb25zdCBhU3RyZWFtIDogVFN0cmVhbSk7Cit2YXIgc2VyaWFsIDogVFNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVFNlcmlhbGl6ZXIuQ3JlYXRlKCBmYWN0b3J5KTsKKyAgdHJ5CisgICAgc2VyaWFsLlNlcmlhbGl6ZSggaW5wdXQsIGFTdHJlYW0pOworICBmaW5hbGx5CisgICAgc2VyaWFsLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJpYWxpemVyLkRlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRCeXRlczsgY29uc3QgdGFyZ2V0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsKK3ZhciBzZXJpYWwgOiBURGVzZXJpYWxpemVyOworYmVnaW4KKyAgc2VyaWFsIDo9IFREZXNlcmlhbGl6ZXIuQ3JlYXRlKCBmYWN0b3J5KTsKKyAgdHJ5CisgICAgc2VyaWFsLkRlc2VyaWFsaXplKCBpbnB1dCwgdGFyZ2V0KTsKKyAgZmluYWxseQorICAgIHNlcmlhbC5GcmVlOworICBlbmQ7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVFN0cmVhbTsgY29uc3QgdGFyZ2V0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsKK3ZhciBzZXJpYWwgOiBURGVzZXJpYWxpemVyOworYmVnaW4KKyAgc2VyaWFsIDo9IFREZXNlcmlhbGl6ZXIuQ3JlYXRlKCBmYWN0b3J5KTsKKyAgdHJ5CisgICAgc2VyaWFsLkRlc2VyaWFsaXplKCBpbnB1dCwgdGFyZ2V0KTsKKyAgZmluYWxseQorICAgIHNlcmlhbC5GcmVlOworICBlbmQ7CitlbmQ7CisKKwordmFyIHRlc3QgOiBUVGVzdFNlcmlhbGl6ZXI7CitiZWdpbgorICB0ZXN0IDo9IFRUZXN0U2VyaWFsaXplci5DcmVhdGU7CisgIHRyeQorICAgIHRlc3QuUnVuVGVzdHM7CisgIGZpbmFsbHkKKyAgICB0ZXN0LkZyZWU7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NlcnZlci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU0OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcnZlci5kcHIKQEAgLTAsMCArMSw3MyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIHNlcnZlcjsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRlc3RTZXJ2ZXIgaW4gJ1Rlc3RTZXJ2ZXIucGFzJywKKyAgVGVzdFNlcnZlckV2ZW50cyBpbiAnVGVzdFNlcnZlckV2ZW50cy5wYXMnLAorICBUaHJpZnQuVGVzdCwgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOworCit2YXIKKyAgblBhcmFtQ291bnQgOiBJbnRlZ2VyOworICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOworICBpIDogSW50ZWdlcjsKKyAgYXJnIDogc3RyaW5nOworCitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnRGVscGhpIFRlc3RTZXJ2ZXIgJytUaHJpZnQuVmVyc2lvbik7CisgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKKyAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworCisgICAgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggYXJncyApOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyBiZWdpbgorICAgICAgRXhpdENvZGUgOj0gJEZGOworICAgIGVuZDsKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgICAgICBFeGl0Q29kZSA6PSAkRkY7CisgICAgZW5kOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS5tZCBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ5MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTEgQEAKK1RoZXNlIHR3byBwcm9qZWN0cyBiZWxvbmcgdG9nZXRoZXIuIEJvdGggcHJvZ3JhbXMKK3NpbXVsYXRlIHNlcnZlciBhbmQgY2xpZW50IGZvciBkaWZmZXJlbnQgdmVyc2lvbnMKK29mIHRoZSBzYW1lIHByb3RvY29sLgorCitUaGUgaW50ZW50aW9uIG9mIHRoaXMgdGVzdCBpcyB0byBlbnN1cmUgZnVsbHkKK3dvcmtpbmcgY29tcGF0aWJpbGl0eSBmZWF0dXJlcyBvZiB0aGUgRGVscGhpIFRocmlmdAoraW1wbGVtZW50YXRpb24uCisKK1RoZSBleHBlY3RlZCB0ZXN0IHJlc3VsdCBpcywgdGhhdCBubyBlcnJvcnMgb2NjdXIKK3dpdGggYm90aCBwcm9ncmFtcywgcmVnYXJkbGVzcyBpbiB3aGljaCBvcmRlciB0aGV5CittaWdodCBiZSBzdGFydGVkLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMS50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8xLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUzYzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMS50aHJpZnQKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vIHZlcnNpb24gMSBvZiB0aGUgaW50ZXJmYWNlCisKK25hbWVzcGFjZSAqIFNraXB0ZXN0Lk9uZQorCitjb25zdCBpMzIgU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04gPSAxCisKK3N0cnVjdCBQb25nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorfQorCitzdHJ1Y3QgUGluZyB7CisgIDEgOiBvcHRpb25hbCBpMzIgdmVyc2lvbjEKK30KKworZXhjZXB0aW9uIFBvbmdGYWlsZWQgeworICAyMjIgOiBvcHRpb25hbCBpMzIgcG9uZ0Vycm9yQ29kZQorfQorCisKK3NlcnZpY2UgU2tpcFRlc3RTZXJ2aWNlIHsKKyAgdm9pZCBQaW5nUG9uZyggMTogUGluZyBwb25nKSB0aHJvd3MgKDQ0NDogUG9uZ0ZhaWxlZCBwb2YpOworfQorCisKKy8vIEVPRgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzIudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzNTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzIudGhyaWZ0CkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvLyB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZQorCituYW1lc3BhY2UgKiBTa2lwdGVzdC5Ud28KKworY29uc3QgaTMyIFNLSVBURVNUU0VSVklDRV9WRVJTSU9OID0gMgorCitzdHJ1Y3QgUG9uZyB7CisgIDEgOiBvcHRpb25hbCBpMzIgdmVyc2lvbjEKKyAgMiA6IG9wdGlvbmFsIGkxNiB2ZXJzaW9uMgorfQorCitzdHJ1Y3QgUGluZyB7CisgIDEgOiBvcHRpb25hbCBpMzIgdmVyc2lvbjEKKyAgMTAgOiBvcHRpb25hbCBib29sIGJvb2xWYWwKKyAgMTEgOiBvcHRpb25hbCBieXRlIGJ5dGVWYWwKKyAgMTIgOiBvcHRpb25hbCBkb3VibGUgZGJWYWwKKyAgMTMgOiBvcHRpb25hbCBpMTYgaTE2VmFsCisgIDE0IDogb3B0aW9uYWwgaTMyIGkzMlZhbAorICAxNSA6IG9wdGlvbmFsIGk2NCBpNjRWYWwKKyAgMTYgOiBvcHRpb25hbCBzdHJpbmcgc3RyVmFsCisgIDE3IDogb3B0aW9uYWwgUG9uZyBzdHJ1Y3RWYWwKKyAgMTggOiBvcHRpb25hbCBtYXA8IGxpc3Q8IFBvbmc+LCBzZXQ8IHN0cmluZz4+IG1hcFZhbAorfQorCitleGNlcHRpb24gUGluZ0ZhaWxlZCB7CisgIDEgOiBvcHRpb25hbCBpMzIgcGluZ0Vycm9yQ29kZQorfQorCitleGNlcHRpb24gUG9uZ0ZhaWxlZCB7CisgIDIyMiA6IG9wdGlvbmFsIGkzMiBwb25nRXJyb3JDb2RlCisgIDEwIDogb3B0aW9uYWwgYm9vbCBib29sVmFsCisgIDExIDogb3B0aW9uYWwgYnl0ZSBieXRlVmFsCisgIDEyIDogb3B0aW9uYWwgZG91YmxlIGRiVmFsCisgIDEzIDogb3B0aW9uYWwgaTE2IGkxNlZhbAorICAxNCA6IG9wdGlvbmFsIGkzMiBpMzJWYWwKKyAgMTUgOiBvcHRpb25hbCBpNjQgaTY0VmFsCisgIDE2IDogb3B0aW9uYWwgc3RyaW5nIHN0clZhbAorICAxNyA6IG9wdGlvbmFsIFBvbmcgc3RydWN0VmFsCisgIDE4IDogb3B0aW9uYWwgbWFwPCBsaXN0PCBQb25nPiwgc2V0PCBzdHJpbmc+PiBtYXBWYWwKK30KKworCitzZXJ2aWNlIFNraXBUZXN0U2VydmljZSB7CisgIFBpbmcgUGluZ1BvbmcoIDE6IFBpbmcgcGluZywgMzogUG9uZyBwb25nKSB0aHJvd3MgKDE6IFBpbmdGYWlsZWQgcGlmLCA0NDQ6IFBvbmdGYWlsZWQgcG9mKTsKK30KKworCisvLyBFT0YKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwM2Q2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKQEAgLTAsMCArMSwyMDEgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworcHJvZ3JhbSBza2lwdGVzdF92ZXJzaW9uMTsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCisgIFNraXB0ZXN0Lk9uZSwKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKKworY29uc3QKKyAgUkVRVUVTVF9FWFQgID0gJy5yZXF1ZXN0JzsKKyAgUkVTUE9OU0VfRVhUID0gJy5yZXNwb25zZSc7CisKKworZnVuY3Rpb24gQ3JlYXRlUGluZyA6IElQaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IFRQaW5nSW1wbC5DcmVhdGU7CisgIHJlc3VsdC5WZXJzaW9uMSAgOj0gVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKK2VuZDsKKworCit0eXBlCisgIFREdW1teVNlcnZlciA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgVFNraXBUZXN0U2VydmljZS5JZmFjZSkKKyAgcHJvdGVjdGVkCisgICAgLy8gVFNraXBUZXN0U2VydmljZS5JZmFjZQorICAgIHByb2NlZHVyZSBQaW5nUG9uZyhjb25zdCBwaW5nOiBJUGluZyk7CisgIGVuZDsKKworCitwcm9jZWR1cmUgVER1bW15U2VydmVyLlBpbmdQb25nKGNvbnN0IHBpbmc6IElQaW5nKTsKKy8vIFRTa2lwVGVzdFNlcnZpY2UuSWZhY2UKK2JlZ2luCisgIFdyaXRlbG4oJy0gcGVyZm9ybWluZyByZXF1ZXN0IGZyb20gdmVyc2lvbiAnK0ludFRvU3RyKHBpbmcuVmVyc2lvbjEpKycgY2xpZW50Jyk7CitlbmQ7CisKKworZnVuY3Rpb24gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgc3RtIDogVFN0cmVhbTsgYUZvcklucHV0IDogQm9vbGVhbikgOiBJUHJvdG9jb2w7Cit2YXIgYWRhcHQgIDogSVRocmlmdFN0cmVhbTsKKyAgICB0cmFucyAgOiBJVHJhbnNwb3J0OworYmVnaW4KKyAgYWRhcHQgIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSk7CisgIGlmIGFGb3JJbnB1dAorICB0aGVuIHRyYW5zIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggYWRhcHQsIG5pbCkKKyAgZWxzZSB0cmFucyA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIG5pbCwgYWRhcHQpOworICByZXN1bHQgOj0gcHJvdGZhY3QuR2V0UHJvdG9jb2woIHRyYW5zKTsKK2VuZDsKKworCitwcm9jZWR1cmUgQ3JlYXRlUmVxdWVzdCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtICAgIDogVEZpbGVTdHJlYW07CisgICAgcGluZyAgIDogSVBpbmc7CisgICAgcHJvdG8gIDogSVByb3RvY29sOworICAgIGNsaWVudCA6IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudDsgICAvLyB3ZSBuZWVkIGFjY2VzcyB0byBzZW5kL3JlY3ZfcGluZ3BvbmcoKQorICAgIGNsaVJlZiA6IElVbmtub3duOyAgICAgICAgICAgICAgICAgICAvLyBob2xkcyB0aGUgcmVmY291bnQKK2JlZ2luCisgIFdyaXRlbG4oJy0gY3JlYXRpbmcgbmV3IHJlcXVlc3QnKTsKKyAgc3RtIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVRVUVTVF9FWFQrJy50bXAnLCBmbUNyZWF0ZSk7CisgIHRyeQorICAgIHBpbmcgOj0gQ3JlYXRlUGluZzsKKworICAgIC8vIHNhdmUgcmVxdWVzdCBkYXRhCisgICAgcHJvdG8gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtLCBGQUxTRSk7CisgICAgY2xpZW50IDo9IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudC5DcmVhdGUoIG5pbCwgcHJvdG8pOworICAgIGNsaVJlZiA6PSBjbGllbnQgYXMgSVVua25vd247CisgICAgY2xpZW50LnNlbmRfUGluZ1BvbmcoIHBpbmcpOworCisgIGZpbmFsbHkKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgY2xpUmVmIDo9IG5pbDsKKyAgICBzdG0uRnJlZTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworCisgIERlbGV0ZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKTsKKyAgUmVuYW1lRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQrJy50bXAnLCBmbmFtZStSRVFVRVNUX0VYVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFJlYWRSZXNwb25zZSggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtICAgIDogVEZpbGVTdHJlYW07CisgICAgcHJvdG8gIDogSVByb3RvY29sOworICAgIGNsaWVudCA6IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudDsgICAvLyB3ZSBuZWVkIGFjY2VzcyB0byBzZW5kL3JlY3ZfcGluZ3BvbmcoKQorICAgIGNsaVJlZiA6IElVbmtub3duOyAgICAgICAgICAgICAgICAgICAvLyBob2xkcyB0aGUgcmVmY291bnQKK2JlZ2luCisgIFdyaXRlbG4oJy0gcmVhZGluZyByZXNwb25zZScpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVNQT05TRV9FWFQsIGZtT3BlblJlYWQpOworICB0cnkKKyAgICAvLyBzYXZlIHJlcXVlc3QgZGF0YQorICAgIHByb3RvICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bSwgVFJVRSk7CisgICAgY2xpZW50IDo9IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudC5DcmVhdGUoIHByb3RvLCBuaWwpOworICAgIGNsaVJlZiA6PSBjbGllbnQgYXMgSVVua25vd247CisgICAgY2xpZW50LnJlY3ZfUGluZ1Bvbmc7CisKKyAgZmluYWxseQorICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBjbGlSZWYgOj0gbmlsOworICAgIHN0bS5GcmVlOworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG1Jbiwgc3RtT3V0ICAgOiBURmlsZVN0cmVhbTsKKyAgICBwcm90SW4sIHByb3RPdXQgOiBJUHJvdG9jb2w7CisgICAgc2VydmVyIDogSVByb2Nlc3NvcjsKK2JlZ2luCisgIFdyaXRlbG4oJy0gcHJvY2Vzc2luZyByZXF1ZXN0Jyk7CisgIHN0bU91dCA6PSBuaWw7CisgIHN0bUluICA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFUVVFU1RfRVhULCBmbU9wZW5SZWFkKTsKKyAgdHJ5CisgICAgc3RtT3V0IDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVTUE9OU0VfRVhUKycudG1wJywgZm1DcmVhdGUpOworCisgICAgLy8gcHJvY2VzcyByZXF1ZXN0IGFuZCB3cml0ZSByZXNwb25zZSBkYXRhCisgICAgcHJvdEluICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bUluLCAgVFJVRSk7CisgICAgcHJvdE91dCA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bU91dCwgRkFMU0UpOworCisgICAgc2VydmVyIDo9IFRTa2lwVGVzdFNlcnZpY2UuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBURHVtbXlTZXJ2ZXIuQ3JlYXRlKTsKKyAgICBzZXJ2ZXIuUHJvY2VzcyggcHJvdEluLCBwcm90T3V0KTsKKworICBmaW5hbGx5CisgICAgc2VydmVyIDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIHN0bUluLkZyZWU7CisgICAgc3RtT3V0LkZyZWU7CisgICAgaWYgc2VydmVyID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKKworICBEZWxldGVGaWxlKCBmbmFtZStSRVNQT05TRV9FWFQpOworICBSZW5hbWVGaWxlKCBmbmFtZStSRVNQT05TRV9FWFQrJy50bXAnLCBmbmFtZStSRVNQT05TRV9FWFQpOworZW5kOworCisKK3Byb2NlZHVyZSBUZXN0KCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK2JlZ2luCisgIC8vIHRyeSB0byByZWFkIGFuIGV4aXN0aW5nIHJlcXVlc3QKKyAgaWYgRmlsZUV4aXN0cyggZm5hbWUgKyBSRVFVRVNUX0VYVCkgdGhlbiBiZWdpbgorICAgIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCwgZm5hbWUpOworICAgIFJlYWRSZXNwb25zZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgZW5kOworCisgIC8vIGNyZWF0ZSBhIG5ldyByZXF1ZXN0IGFuZCB0cnkgdG8gcHJvY2VzcworICBDcmVhdGVSZXF1ZXN0KCBwcm90ZmFjdCwgZm5hbWUpOworICBQcm9jZXNzRmlsZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCwgZm5hbWUpOworZW5kOworCisKK2NvbnN0CisgIEZJTEVfQklOQVJZID0gJ3Bpbmdwb25nLmJpbic7CisgIEZJTEVfSlNPTiAgID0gJ3Bpbmdwb25nLmpzb24nOworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ0RlbHBoaSBTa2lwVGVzdCAnK0ludFRvU3RyKFRza2lwdGVzdF92ZXJzaW9uXzFDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04pKycgdXNpbmcgJytUaHJpZnQuVmVyc2lvbik7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ0JpbmFyeSBwcm90b2NvbCcpOworICAgIFRlc3QoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCBGSUxFX0JJTkFSWSk7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ0pTT04gcHJvdG9jb2wnKTsKKyAgICBUZXN0KCBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsICAgRklMRV9KU09OKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignVGVzdCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvcnMuJyk7CisgICAgV3JpdGVsbjsKKyAgICBXcml0ZSgnUHJlc3MgRU5URVIgdG8gY2xvc2UgLi4uJyk7ICBSZWFkbG47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzYjI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgpAQCAtMCwwICsxLDIyOCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIHNraXB0ZXN0X3ZlcnNpb24yOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKKyAgU2tpcHRlc3QuVHdvLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOworCitjb25zdAorICBSRVFVRVNUX0VYVCAgPSAnLnJlcXVlc3QnOworICBSRVNQT05TRV9FWFQgPSAnLnJlc3BvbnNlJzsKKworZnVuY3Rpb24gQ3JlYXRlUGluZyA6IElQaW5nOwordmFyIGxpc3QgOiBJVGhyaWZ0TGlzdDxJUG9uZz47CisgICAgc2V0XyA6IElIYXNoU2V0PHN0cmluZz47CitiZWdpbgorICByZXN1bHQgOj0gVFBpbmdJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0LlZlcnNpb24xICA6PSBUc2tpcHRlc3RfdmVyc2lvbl8yQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworICByZXN1bHQuQm9vbFZhbCAgIDo9IFRSVUU7CisgIHJlc3VsdC5CeXRlVmFsICAgOj0gMjsKKyAgcmVzdWx0LkRiVmFsICAgICA6PSAzOworICByZXN1bHQuSTE2VmFsICAgIDo9IDQ7CisgIHJlc3VsdC5JMzJWYWwgICAgOj0gNTsKKyAgcmVzdWx0Lkk2NFZhbCAgICA6PSA2OworICByZXN1bHQuU3RyVmFsICAgIDo9ICdzZXZlbic7CisKKyAgcmVzdWx0LlN0cnVjdFZhbCA6PSBUUG9uZ0ltcGwuQ3JlYXRlOworICByZXN1bHQuU3RydWN0VmFsLlZlcnNpb24xIDo9IC0xOworICByZXN1bHQuU3RydWN0VmFsLlZlcnNpb24yIDo9IC0yOworCisgIGxpc3QgOj0gVFRocmlmdExpc3RJbXBsPElQb25nPi5DcmVhdGU7CisgIGxpc3QuQWRkKCByZXN1bHQuU3RydWN0VmFsKTsKKyAgbGlzdC5BZGQoIHJlc3VsdC5TdHJ1Y3RWYWwpOworCisgIHNldF8gOj0gVEhhc2hTZXRJbXBsPHN0cmluZz4uQ3JlYXRlOworICBzZXRfLkFkZCggJ29uZScpOworICBzZXRfLkFkZCggJ3VubycpOworICBzZXRfLkFkZCggJ2VpbnMnKTsKKyAgc2V0Xy5BZGQoICdlZW4nKTsKKworICByZXN1bHQuTWFwVmFsIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDwgSVRocmlmdExpc3Q8SVBvbmc+LCBJSGFzaFNldDxzdHJpbmc+Pi5DcmVhdGU7CisgIHJlc3VsdC5NYXBWYWwuQWRkKCBsaXN0LCBzZXRfKTsKK2VuZDsKKworCit0eXBlCisgIFREdW1teVNlcnZlciA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgVFNraXBUZXN0U2VydmljZS5JZmFjZSkKKyAgcHJvdGVjdGVkCisgICAgLy8gVFNraXBUZXN0U2VydmljZS5JZmFjZQorICAgIGZ1bmN0aW9uIFBpbmdQb25nKGNvbnN0IHBpbmc6IElQaW5nOyBjb25zdCBwb25nOiBJUG9uZyk6IElQaW5nOworICBlbmQ7CisKKworZnVuY3Rpb24gVER1bW15U2VydmVyLlBpbmdQb25nKGNvbnN0IHBpbmc6IElQaW5nOyBjb25zdCBwb25nOiBJUG9uZyk6IElQaW5nOworLy8gVFNraXBUZXN0U2VydmljZS5JZmFjZQorYmVnaW4KKyAgV3JpdGVsbignLSBwZXJmb3JtaW5nIHJlcXVlc3QgZnJvbSB2ZXJzaW9uICcrSW50VG9TdHIocGluZy5WZXJzaW9uMSkrJyBjbGllbnQnKTsKKyAgcmVzdWx0IDo9IENyZWF0ZVBpbmc7CitlbmQ7CisKKworZnVuY3Rpb24gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgc3RtIDogVFN0cmVhbTsgYUZvcklucHV0IDogQm9vbGVhbikgOiBJUHJvdG9jb2w7Cit2YXIgYWRhcHQgIDogSVRocmlmdFN0cmVhbTsKKyAgICB0cmFucyAgOiBJVHJhbnNwb3J0OworYmVnaW4KKyAgYWRhcHQgIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSk7CisgIGlmIGFGb3JJbnB1dAorICB0aGVuIHRyYW5zIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggYWRhcHQsIG5pbCkKKyAgZWxzZSB0cmFucyA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIG5pbCwgYWRhcHQpOworICByZXN1bHQgOj0gcHJvdGZhY3QuR2V0UHJvdG9jb2woIHRyYW5zKTsKK2VuZDsKKworCitwcm9jZWR1cmUgQ3JlYXRlUmVxdWVzdCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtICAgIDogVEZpbGVTdHJlYW07CisgICAgcGluZyAgIDogSVBpbmc7CisgICAgcHJvdG8gIDogSVByb3RvY29sOworICAgIGNsaWVudCA6IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudDsgICAvLyB3ZSBuZWVkIGFjY2VzcyB0byBzZW5kL3JlY3ZfcGluZ3BvbmcoKQorICAgIGNsaVJlZiA6IElVbmtub3duOyAgICAgICAgICAgICAgICAgICAvLyBob2xkcyB0aGUgcmVmY291bnQKK2JlZ2luCisgIFdyaXRlbG4oJy0gY3JlYXRpbmcgbmV3IHJlcXVlc3QnKTsKKyAgc3RtIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVRVUVTVF9FWFQrJy50bXAnLCBmbUNyZWF0ZSk7CisgIHRyeQorICAgIHBpbmcgOj0gQ3JlYXRlUGluZzsKKworICAgIC8vIHNhdmUgcmVxdWVzdCBkYXRhCisgICAgcHJvdG8gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtLCBGQUxTRSk7CisgICAgY2xpZW50IDo9IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudC5DcmVhdGUoIG5pbCwgcHJvdG8pOworICAgIGNsaVJlZiA6PSBjbGllbnQgYXMgSVVua25vd247CisgICAgY2xpZW50LnNlbmRfUGluZ1BvbmcoIHBpbmcsIHBpbmcuU3RydWN0VmFsKTsKKworICBmaW5hbGx5CisgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIGNsaVJlZiA6PSBuaWw7CisgICAgc3RtLkZyZWU7CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKKworICBEZWxldGVGaWxlKCBmbmFtZStSRVFVRVNUX0VYVCk7CisgIFJlbmFtZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKycudG1wJywgZm5hbWUrUkVRVUVTVF9FWFQpOworZW5kOworCisKK3Byb2NlZHVyZSBSZWFkUmVzcG9uc2UoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bSAgICA6IFRGaWxlU3RyZWFtOworICAgIHBpbmcgICA6IElQaW5nOworICAgIHByb3RvICA6IElQcm90b2NvbDsKKyAgICBjbGllbnQgOiBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQ7ICAgLy8gd2UgbmVlZCBhY2Nlc3MgdG8gc2VuZC9yZWN2X3Bpbmdwb25nKCkKKyAgICBjbGlSZWYgOiBJVW5rbm93bjsgICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIHJlZmNvdW50CitiZWdpbgorICBXcml0ZWxuKCctIHJlYWRpbmcgcmVzcG9uc2UnKTsKKyAgc3RtIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVTUE9OU0VfRVhULCBmbU9wZW5SZWFkKTsKKyAgdHJ5CisgICAgLy8gc2F2ZSByZXF1ZXN0IGRhdGEKKyAgICBwcm90byAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG0sIFRSVUUpOworICAgIGNsaWVudCA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRDbGllbnQuQ3JlYXRlKCBwcm90bywgbmlsKTsKKyAgICBjbGlSZWYgOj0gY2xpZW50IGFzIElVbmtub3duOworICAgIHBpbmcgICA6PSBjbGllbnQucmVjdl9QaW5nUG9uZzsKKworICBmaW5hbGx5CisgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIGNsaVJlZiA6PSBuaWw7CisgICAgc3RtLkZyZWU7CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bUluLCBzdG1PdXQgICA6IFRGaWxlU3RyZWFtOworICAgIHByb3RJbiwgcHJvdE91dCA6IElQcm90b2NvbDsKKyAgICBzZXJ2ZXIgOiBJUHJvY2Vzc29yOworYmVnaW4KKyAgV3JpdGVsbignLSBwcm9jZXNzaW5nIHJlcXVlc3QnKTsKKyAgc3RtT3V0IDo9IG5pbDsKKyAgc3RtSW4gIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVRVUVTVF9FWFQsIGZtT3BlblJlYWQpOworICB0cnkKKyAgICBzdG1PdXQgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVNQT05TRV9FWFQrJy50bXAnLCBmbUNyZWF0ZSk7CisKKyAgICAvLyBwcm9jZXNzIHJlcXVlc3QgYW5kIHdyaXRlIHJlc3BvbnNlIGRhdGEKKyAgICBwcm90SW4gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtSW4sICBUUlVFKTsKKyAgICBwcm90T3V0IDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtT3V0LCBGQUxTRSk7CisKKyAgICBzZXJ2ZXIgOj0gVFNraXBUZXN0U2VydmljZS5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIFREdW1teVNlcnZlci5DcmVhdGUpOworICAgIHNlcnZlci5Qcm9jZXNzKCBwcm90SW4sIHByb3RPdXQpOworCisgIGZpbmFsbHkKKyAgICBzZXJ2ZXIgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgc3RtSW4uRnJlZTsKKyAgICBzdG1PdXQuRnJlZTsKKyAgICBpZiBzZXJ2ZXIgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworCisgIERlbGV0ZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCk7CisgIFJlbmFtZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCsnLnRtcCcsIGZuYW1lK1JFU1BPTlNFX0VYVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRlc3QoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOworYmVnaW4KKyAgLy8gdHJ5IHRvIHJlYWQgYW4gZXhpc3RpbmcgcmVxdWVzdAorICBpZiBGaWxlRXhpc3RzKCBmbmFtZSArIFJFUVVFU1RfRVhUKSB0aGVuIGJlZ2luCisgICAgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0LCBmbmFtZSk7CisgICAgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCwgZm5hbWUpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIGEgbmV3IHJlcXVlc3QgYW5kIHRyeSB0byBwcm9jZXNzCisgIENyZWF0ZVJlcXVlc3QoIHByb3RmYWN0LCBmbmFtZSk7CisgIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCwgZm5hbWUpOworICBSZWFkUmVzcG9uc2UoIHByb3RmYWN0LCBmbmFtZSk7CitlbmQ7CisKKworY29uc3QKKyAgRklMRV9CSU5BUlkgPSAncGluZ3BvbmcuYmluJzsKKyAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMkNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CisgICAgVGVzdCggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsIEZJTEVfQklOQVJZKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignSlNPTiBwcm90b2NvbCcpOworICAgIFRlc3QoIFRKU09OUHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgICBGSUxFX0pTT04pOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdUZXN0IGNvbXBsZXRlZCB3aXRob3V0IGVycm9ycy4nKTsKKyAgICBXcml0ZWxuOworICAgIFdyaXRlKCdQcmVzcyBFTlRFUiB0byBjbG9zZSAuLi4nKTsgIFJlYWRsbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIgYi9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTdjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByCkBAIC0wLDAgKzEsOTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworcHJvZ3JhbSBUZXN0VHlwZVJlZ2lzdHJ5OworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFR5cEluZm8sCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TZXJpYWxpemVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcmlhbGl6ZXIucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgRGVidWdQcm90b1Rlc3Q7CisKK3R5cGUKKyAgVGVzdGVyPFQgOiBJSW50ZXJmYWNlPiA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIHByb2NlZHVyZSBUZXN0OworICBlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUZXN0ZXI8VD4uVGVzdDsKK3ZhciBpbnN0YW5jZSA6IFQ7CisgICAgbmFtZSA6IHN0cmluZzsKK2JlZ2luCisgIGluc3RhbmNlIDo9IFR5cGVSZWdpc3RyeS5Db25zdHJ1Y3Q8VD47CisgIG5hbWUgOj0gR2V0VHlwZU5hbWUoVHlwZUluZm8oVCkpOworICBpZiBpbnN0YW5jZSA8PiBuaWwKKyAgdGhlbiBXcml0ZWxuKCBuYW1lLCAnID0gb2snKQorICBlbHNlIGJlZ2luCisgICAgV3JpdGVsbiggbmFtZSwgJyA9IGZhaWxlZCcpOworICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoICdUZXN0IHdpdGggJytuYW1lKycgZmFpbGVkIScpOworICBlbmQ7CitlbmQ7CisKK2JlZ2luCisgIFdyaXRlbG4oJ1Rlc3RpbmcgLi4uJyk7CisgIFRlc3RlcjxJRG91Ymxlcz4uVGVzdDsKKyAgVGVzdGVyPElPbmVPZkVhY2g+LlRlc3Q7CisgIFRlc3RlcjxJQm9uaz4uVGVzdDsKKyAgVGVzdGVyPElOZXN0aW5nPi5UZXN0OworICBUZXN0ZXI8SUhvbHlNb2xleT4uVGVzdDsKKyAgVGVzdGVyPElCYWNrd2FyZHM+LlRlc3Q7CisgIFRlc3RlcjxJRW1wdHk+LlRlc3Q7CisgIFRlc3RlcjxJV3JhcHBlcj4uVGVzdDsKKyAgVGVzdGVyPElSYW5kb21TdHVmZj4uVGVzdDsKKyAgVGVzdGVyPElCYXNlNjQ+LlRlc3Q7CisgIFRlc3RlcjxJQ29tcGFjdFByb3RvVGVzdFN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElTaW5nbGVNYXBUZXN0U3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SUJsb3dVcD4uVGVzdDsKKyAgVGVzdGVyPElSZXZlcnNlT3JkZXJTdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJU3RydWN0V2l0aFNvbWVFbnVtPi5UZXN0OworICBUZXN0ZXI8SVRlc3RVbmlvbj4uVGVzdDsKKyAgVGVzdGVyPElUZXN0VW5pb25NaW51c1N0cmluZ0ZpZWxkPi5UZXN0OworICBUZXN0ZXI8SUNvbXBhcmFibGVVbmlvbj4uVGVzdDsKKyAgVGVzdGVyPElTdHJ1Y3RXaXRoQVVuaW9uPi5UZXN0OworICBUZXN0ZXI8SVByaW1pdGl2ZVRoZW5TdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJU3RydWN0V2l0aEFTb21lbWFwPi5UZXN0OworICBUZXN0ZXI8SUJpZ0ZpZWxkSWRTdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJQnJlYWtzUnVieUNvbXBhY3RQcm90b2NvbD4uVGVzdDsKKyAgVGVzdGVyPElUdXBsZVByb3RvY29sVGVzdFN0cnVjdD4uVGVzdDsKKyAgV3JpdGVsbignQ29tcGxldGVkLicpOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9NYWtlZmlsZS5hbSBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KaW5kZXggMDcyMmYxMi4uMDYzMjNiNCAxMDA2NDQKLS0tIGEvbGliL2VybC9NYWtlZmlsZS5hbQorKysgYi9saWIvZXJsL01ha2VmaWxlLmFtCkBAIC0xNyw3ICsxNyw0NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9IHNyYworVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAorVEhSSUZUX09NSVRfRklMRSA9IHRlc3QvVGhyaWZ0X29taXRfd2l0aG91dC50aHJpZnQKK1RIUklGVF9GSUxFUyA9ICQod2lsZGNhcmQgdGVzdC8qLnRocmlmdCkgXAorCQkgICQoVEhSSUZUX09NSVRfRklMRSkgXAorCQkgIC4uLy4uL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworaWYgRVJMQU5HX09UUDE2CitFUkxfRkxBRyA9IGVybDpvdHAxNgorRVJMX0ZMQUdfTEVHQUNZID0gZXJsOm90cDE2LGxlZ2FjeW5hbWVzCisjIG90cDE2ICsgbWFwcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiBXZSBuZWVkIHRvIGdlbmVyYXRlIGl0IGFueXdheSB0byBhdm9pZCBpbmNsdWRlIGVycm9yLgorRVJMX0ZMQUdfTUFQUyA9IGVybDpvdHAxNgorZWxzZQorRVJMX0ZMQUcgPSBlcmwKK0VSTF9GTEFHX0xFR0FDWSA9IGVybDpsZWdhY3luYW1lcworRVJMX0ZMQUdfTUFQUyA9IGVybDptYXBzCitlbmRpZgorCiskKFRIUklGVF9PTUlUX0ZJTEUpOiB0ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0CisJZ3JlcCAtdiBvbWl0ICQ8ID4kQAorCisuZ2VuZXJhdGVkOiAkKFRIUklGVCkgJChUSFJJRlRfRklMRVMpCisJZm9yIGYgaW4gJChUSFJJRlRfRklMRVMpIDsgZG8gXAorCQkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gdGVzdCAkJGYgOyBcCisJZG9uZQorCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHX0xFR0FDWSkgLW8gdGVzdCB0ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHX01BUFMpIC1vIHRlc3QgdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdAorCXRvdWNoIC5nZW5lcmF0ZWQKKworYWxsOiAuZ2VuZXJhdGVkCisJJChSRUJBUikgZ2V0LWRlcHMKKwkkKFJFQkFSKSBjb21waWxlCisKK2NoZWNrOiAuZ2VuZXJhdGVkCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgZ2V0LWRlcHMKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBjb21waWxlCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgc2tpcF9kZXBzPXRydWUgZXVuaXQKIAogaW5zdGFsbDogYWxsCiAJbWtkaXIgLXAgJChERVNURElSKSQoRVJMQU5HX0lOU1RBTExfTElCX0RJUl90aHJpZnQpIDsgXApAQCAtMzEsMTAgKzY5LDIzIEBACiB1bmluc3RhbGw6CiAJcm0gLXJmICQoREVTVERJUikkKEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfdGhyaWZ0KQogCitjbGVhbjoKKwlybSAtZiAuZ2VuZXJhdGVkCisJcm0gLXJmIHRlc3QvZ2VuLWVybC8KKwlybSAtZiAkKFRIUklGVF9PTUlUX0ZJTEUpCisJJChSRUJBUikgY2xlYW4KIAogbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKIAlybSAtcmYgZWJpbgogCi1FWFRSQV9ESVNUID0gaW5jbHVkZSBzcmMKK0VYVFJBX0RJU1QgPSBcCisJaW5jbHVkZSBcCisJc3JjIFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlyZWJhci5jb25maWcgXAorCXJlYmFyLmNvbmZpZy5zY3JpcHQgXAorCXJlYmFyLnRlc3QuY29uZmlnIFwKKwl0ZXN0IFwKKwlSRUFETUUubWQKIAogTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL2VybC9SRUFETUUgYi9saWIvZXJsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3YzU0OS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVRocmlmdCBFcmxhbmcgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1FeGFtcGxlCi09PT09PT09Ci0KLUV4YW1wbGUgc2Vzc2lvbiB1c2luZyB0aHJpZnRfY2xpZW50OgotCi0xPiB7b2ssIEMwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoImxvY2FsaG9zdCIsIDkwOTAsIHRocmlmdFRlc3RfdGhyaWZ0LCBbXSksIG9rLgotb2sKLTI+IHtDMSwgUjF9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMwLCB0ZXN0Vm9pZCwgW10pLCBSMS4KLXtvayxva30KLTM+IHtDMiwgUjJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMxLCB0ZXN0Vm9pZCwgW2FzZGZdKSwgUjIuCi17ZXJyb3Ise2JhZF9hcmdzLHRlc3RWb2lkLFthc2RmXX19Ci00PiB7QzMsIFIzfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMiwgdGVzdEkzMiwgWzEyM10pLCBSMy4KLXtvaywxMjN9Ci01PiB7QzQsIFI0fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMywgdGVzdE9uZXdheSwgWzFdKSwgUjQuCi17b2ssb2t9Ci02PiB7QzUsIFI1fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDNCwgdGVzdFhjZXB0aW9uLCBbImZvbyJdKSwgUjUuCi17ZXJyb3Ise25vX2Z1bmN0aW9uLHRlc3RYY2VwdGlvbn19Ci03PiB7QzYsIFI2fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDNSwgdGVzdEV4Y2VwdGlvbiwgWyJmb28iXSksIFI2Lgote29rLG9rfQotOD4ge0M3LCBSN30gPSAoY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEM2LCB0ZXN0RXhjZXB0aW9uLCBbIlhjZXB0aW9uIl0pKSwgUjcuCi17ZXhjZXB0aW9uLHt4Y2VwdGlvbiwxMDAxLDw8IlhjZXB0aW9uIj4+fX0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvUkVBRE1FLm1kIGIvbGliL2VybC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzZDA1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTEgQEAKKyMgVGhyaWZ0IEVybGFuZyBTb2Z0d2FyZSBMaWJyYXJ5ICMKKworIyMgTGljZW5zZSAjIworCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgUmVsZWFzZSBOb3RlcyAjIworCisjIyMgMC45LjIgIyMjCisKK2FzIG9mIDAuOS4yIHN0cnVjdCBhbmQgZnVuY3Rpb24gbmFtaW5nIGNvbnZlbnRpb25zIGhhdmUgY2hhbmdlZC4gdG8gcmV0YWluIHRoZQorb2xkIG5hbWluZyBjb252ZW50aW9ucyAoZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSB1c2UgdGhlIGNvbXBpbGVyIG9wdGlvbgorYGxlZ2FjeW5hbWVzYAorCisjIyBFeGFtcGxlICMjCisKK0V4YW1wbGUgc2Vzc2lvbiB1c2luZyB0aHJpZnRfY2xpZW50OgorCitgYGBlcmwKKzE+IHtvaywgQzB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygibG9jYWxob3N0IiwgOTA5MCwgdGhyaWZ0X3Rlc3RfdGhyaWZ0LCBbXSksIG9rLgorb2sKKzI+IHtDMSwgUjF9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMwLCB0ZXN0Vm9pZCwgW10pLCBSMS4KK3tvayxva30KKzM+IHtDMiwgUjJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMxLCB0ZXN0Vm9pZCwgW2FzZGZdKSwgUjIuCit7ZXJyb3Ise2JhZF9hcmdzLHRlc3RWb2lkLFthc2RmXX19Cis0PiB7QzMsIFIzfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMiwgdGVzdEkzMiwgWzEyM10pLCBSMy4KK3tvaywxMjN9Cis1PiB7QzQsIFI0fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMywgdGVzdE9uZXdheSwgWzFdKSwgUjQuCit7b2ssb2t9Cis2PiB7QzUsIFI1fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDNCwgdGVzdFhjZXB0aW9uLCBbImZvbyJdKSwgUjUuCit7ZXJyb3Ise25vX2Z1bmN0aW9uLHRlc3RYY2VwdGlvbn19Cis3PiB7QzYsIFI2fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDNSwgdGVzdEV4Y2VwdGlvbiwgWyJmb28iXSksIFI2Lgore29rLG9rfQorOD4ge0M3LCBSN30gPSAoY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEM2LCB0ZXN0RXhjZXB0aW9uLCBbIlhjZXB0aW9uIl0pKSwgUjcuCit7ZXhjZXB0aW9uLHt4Y2VwdGlvbiwxMDAxLDw8IlhjZXB0aW9uIj4+fX0KK2BgYApkaWZmIC0tZ2l0IGEvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzdkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSwzIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworUGFydGljdWxhcmx5IGZvciBFcmxhbmcgcGxlYXNlIGZvbGxvdyB0aGUgRXJsYW5nIFtQcm9ncmFtbWluZyBSdWxlcyBhbmQgQ29udmVudGlvbnNdKGh0dHA6Ly93d3cuZXJsYW5nLnNlL2RvYy9wcm9ncmFtbWluZ19ydWxlcy5zaHRtbCkuIApkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCmluZGV4IDM2ZWI0OWIuLjdjYjI5ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKQEAgLTIyLDYgKzIyLDcgQEAKIC1kZWZpbmUodFR5cGVfVk9JRCwgMSkuCiAtZGVmaW5lKHRUeXBlX0JPT0wsIDIpLgogLWRlZmluZSh0VHlwZV9CWVRFLCAzKS4KKy1kZWZpbmUodFR5cGVfSTgsIDMpLgogLWRlZmluZSh0VHlwZV9ET1VCTEUsIDQpLgogLWRlZmluZSh0VHlwZV9JMTYsIDYpLgogLWRlZmluZSh0VHlwZV9JMzIsIDgpLgpAQCAtNTEsNCArNTIsMTEgQEAKIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FLCAzKS4KIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0JBRF9TRVFVRU5DRV9JRCwgNCkuCiAtZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCwgNSkuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlRFUk5BTF9FUlJPUiwgNikuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9QUk9UT0NPTF9FUlJPUiwgNykuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1RSQU5TRk9STSwgOCkuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1BST1RPQ09MLCA5KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFLCAxMCkuCiAKKy1kZWZpbmUgKE1VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SLCAiOiIpLgorLWRlZmluZSAoTVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksICJlcnJvcl9oYW5kbGVyIikuCmRpZmYgLS1naXQgYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCmluZGV4IGY4NWY0NTUuLmJjMGFjYzggMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCisrKyBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCkBAIC0yMCwxMiArMjAsMTIgQEAKIC1pZm5kZWYoVEhSSUZUX1BST1RPQ09MX0lOQ0xVREVEKS4KIC1kZWZpbmUoVEhSSUZUX1BST1RPQ09MX0lOQ0xVREVELCB0cnVlKS4KIAotLXJlY29yZChwcm90b2NvbF9tZXNzYWdlX2JlZ2luLCB7bmFtZSwgdHlwZSwgc2VxaWR9KS4KLS1yZWNvcmQocHJvdG9jb2xfc3RydWN0X2JlZ2luLCB7bmFtZX0pLgotLXJlY29yZChwcm90b2NvbF9maWVsZF9iZWdpbiwge25hbWUsIHR5cGUsIGlkfSkuCi0tcmVjb3JkKHByb3RvY29sX21hcF9iZWdpbiwge2t0eXBlLCB2dHlwZSwgc2l6ZX0pLgotLXJlY29yZChwcm90b2NvbF9saXN0X2JlZ2luLCB7ZXR5cGUsIHNpemV9KS4KLS1yZWNvcmQocHJvdG9jb2xfc2V0X2JlZ2luLCB7ZXR5cGUsIHNpemV9KS4KKy1yZWNvcmQocHJvdG9jb2xfbWVzc2FnZV9iZWdpbiwge25hbWUgOjogc3RyaW5nKCksIHR5cGUgOjogaW50ZWdlcigpLCBzZXFpZCA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfc3RydWN0X2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKX0pLgorLXJlY29yZChwcm90b2NvbF9maWVsZF9iZWdpbiwge25hbWUgOjogc3RyaW5nKCksIHR5cGUgOjogaW50ZWdlcigpLCBpZCA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfbWFwX2JlZ2luLCB7a3R5cGUgOjogaW50ZWdlcigpLCB2dHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX2xpc3RfYmVnaW4sIHtldHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX3NldF9iZWdpbiwge2V0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KIAogLXR5cGUgdHByb3RfaGVhZGVyX3ZhbCgpIDo6ICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue30KICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnIGIvbGliL2VybC9yZWJhci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMThhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvcmViYXIuY29uZmlnCkBAIC0wLDAgKzEgQEAKK3tlcmxfb3B0cywgW3twbGF0Zm9ybV9kZWZpbmUsICJeUi4qIiwgb3RwMTZfb3JfbGVzc30sIGRlYnVnX2luZm9dfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdCBiL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMzODIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorRGVmMCA9IGNhc2Ugbm90IGVybGFuZzppc19idWlsdGluKGVybGFuZywgbW9ub3RvbmljX3RpbWUsIDApIG9mCisgICAgICAgICAgIHRydWUgLT4gW107CisgICAgICAgICAgIGZhbHNlIC0+IFt7ZCwgdGltZV9jb3JyZWN0aW9ufV0KKyAgICAgICBlbmQsCitEZWZzID0gRGVmMCwKK2xpc3RzOmtleXN0b3JlKGVybF9vcHRzLCAxLCBDT05GSUcsCisgICAgICAgICAgICAgICB7ZXJsX29wdHMsIHByb3BsaXN0czpnZXRfdmFsdWUoZXJsX29wdHMsIENPTkZJRywgW10pICsrIERlZnN9KS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCkBAIC0wLDAgKzEsNSBAQAore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgorCit7ZGVwcywgWworICB7bWVjaywgIiIsIHtnaXQsICJodHRwczovL2dpdGh1Yi5jb20vZXByb3h1cy9tZWNrLmdpdCIsIHt0YWcsICIwLjguOSJ9fX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvTWFrZWZpbGUuYW0gYi9saWIvZXJsL3NyYy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2ZmNkYi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3NyYy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBcHBsaWNhdGlvbiB2ZXJzaW9uCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQVBQX05BTUU9JChQQUNLQUdFX05BTUUpCi1WU049JChQQUNLQUdFX1ZFUlNJT04pCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGTEFHUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVSTF9GTEFHUyA9Ci1FUkxfSU5DTFVERSA9IC1JLi4vaW5jbHVkZQotRVJMX0JFSEFWX1BBVEggPSAtcHogLi4vZWJpbgotRVJMX0NPTVBJTEVfRkxBR1MgPSAkKEVSTF9JTkNMVURFKSAkKEVSTF9CRUhBVl9QQVRIKQotCi1FQklOID89IC4uL2ViaW4KLUVTUkMgPz0gLgotRU1VTEFUT1IgPSBiZWFtCi0KLUVSTENfV0ZMQUdTID0gLVcKLUVSTEMgPSBlcmxjICQoRVJMQ19XRkxBR1MpICQoRVJMQ19GTEFHUykKLUVSTCA9IGVybCAtYm9vdCBzdGFydF9jbGVhbgotCi0kKEVCSU4pLyUuYmVhbTogJChFU1JDKS8lLmVybAotCUBlY2hvICIgICBFUkxDICAkPCIKLQlAJChFUkxDKSAkKEVSTF9GTEFHUykgJChFUkxfQ09NUElMRV9GTEFHUykgLW8kKEVCSU4pICQ8Ci0KLS5lcmwuYmVhbToKLQkkKEVSTEMpICQoRVJMX0ZMQUdTKSAkKEVSTF9DT01QSUxFX0ZMQUdTKSAtbyQoZGlyICRAKSAkPAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0IFNwZWNzCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTU9EVUxFUyA9ICQoc2hlbGwgZmluZCAuIC1uYW1lIFwqLmVybCB8IHNlZCAnczpeXC4vOjonIHwgc2VkICdzL1wuZXJsLy8nKQotTU9EVUxFU19TVFJJTkdfTElTVCA9ICQoc2hlbGwgZmluZCAuIC1uYW1lIFwqLmVybCB8IHNlZCAnczpeXC4vOjonIHwgc2VkICdzL1wuZXJsLywvJykKLUJFSEFWX01PRFVMRVMgPSAkKHNoZWxsIGZpbmQgLiAtbmFtZSBcKi5lcmwgfCB4YXJncyBncmVwIC1sIGJlaGF2aW91cl9pbmZvIHwgc2VkICdzOl5cLi86OicgfCBzZWQgJ3MvXC5lcmwvLycpCi0KLUVSTF9GSUxFUz0gJChNT0RVTEVTOiU9JS5lcmwpCi1ET0NfRklMRVM9JChFUkxfRklMRVMpCi0KLUFQUF9GSUxFPSAkKEFQUF9OQU1FKS5hcHAKLUFQUF9TUkM9ICQoQVBQX0ZJTEUpLnNyYwotQVBQX1RBUkdFVD0gJChFQklOKS8kKEFQUF9GSUxFKQotCi1CRUFNUz0gJChNT0RVTEVTOiU9JChFQklOKS8lLiQoRU1VTEFUT1IpKQotQkVIQVZfQkVBTVM9ICQoQkVIQVZfTU9EVUxFUzolPSQoRUJJTikvJS4kKEVNVUxBVE9SKSkKLVRBUkdFVF9GSUxFUz0gJChCRUhBVl9CRUFNUykgJChCRUFNUykgJChBUFBfVEFSR0VUKSAkKEFQUFVQX1RBUkdFVCkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRhcmdldHMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hbGwgZGVidWcgb3B0OiAkKEVCSU4pICQoVEFSR0VUX0ZJTEVTKQotCi0jIE5vdGU6IEluIHRoZSBvcGVuLXNvdXJjZSBidWlsZCBjbGVhbiBtdXN0IG5vdCBkZXN0cm95IHRoZSBwcmVsb2FkZWQKLSMgYmVhbSBmaWxlcy4KLWNsZWFuOgotCXJtIC1mICQoVEFSR0VUX0ZJTEVTKQotCXJtIC1mICp+Ci0Jcm0gLWYgY29yZQotCXJtIC1yZiAkKEVCSU4pCi0Jcm0gLXJmICpodG1sCi0KLSQoRUJJTik6Ci0JbWtkaXIgJChFQklOKQotCi1kaWFseXplcjogJChUQVJHRVRfRklMRVMpCi0JZGlhbHl6ZXIgLS1zcmMgLXIgLiAkKEVSTF9JTkNMVURFKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU3BlY2lhbCBCdWlsZCBUYXJnZXRzCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJChBUFBfVEFSR0VUKTogJChBUFBfU1JDKSAkKEJFQU1TKQotCXNlZCAtZSAnczslVlNOJTskKFZTTik7JyBcCi0JCS1lICdzOyVBUFBfTkFNRSU7JChBUFBfTkFNRSk7JyBcCi0JCS1lICdzOyVNT0RVTEVTJTslTU9EVUxFUyUkKE1PRFVMRVNfU1RSSU5HX0xJU1QpOycgXAotCQkkPCA+ICQ8Ii50bXAiCi0Jc2VkIC1lICdzLyVNT0RVTEVTJVwoLipcKSwvXDEvJyBcCi0JCSQ8Ii50bXAiID4gJEAKLQlybSAkPCIudG1wIgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwppbmRleCBlYmUzOGQzLi5iM2IyMjVmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYworKysgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwpAQCAtMTcsMTggKzE3LDM4IEBACiAlJSB1bmRlciB0aGUgTGljZW5zZS4KICUlCiAlJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQote2FwcGxpY2F0aW9uLCAlQVBQX05BTUUlLAotIFsKK3thcHBsaWNhdGlvbiwgdGhyaWZ0LCBbCiAgICUgQSBxdWljayBkZXNjcmlwdGlvbiBvZiB0aGUgYXBwbGljYXRpb24uCiAgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBiaW5kaW5ncyJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIiVWU04lIn0sCisgIHt2c24sICIxLjAuMCJ9LAogCiAgICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCiAgIHttb2R1bGVzLCBbCi0gICAgICAgJU1PRFVMRVMlCi0gICBdfSwKKyAgICB0aHJpZnRfYmFzZTY0X3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLAorICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2NsaWVudF91dGlsLAorICAgIHRocmlmdF9jbGllbnQsCisgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfZmlsZV90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LAorICAgIHRocmlmdF9qc29uX3BhcnNlciwKKyAgICB0aHJpZnRfanNvbl9wcm90b2NvbCwKKyAgICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfbWVtb3J5X2J1ZmZlciwKKyAgICB0aHJpZnRfcHJvY2Vzc29yLAorICAgIHRocmlmdF9wcm90b2NvbCwKKyAgICB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCwKKyAgICB0aHJpZnRfc2VydmVyLAorICAgIHRocmlmdF9zZXJ2aWNlLAorICAgIHRocmlmdF9zb2NrZXRfc2VydmVyLAorICAgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LAorICAgIHRocmlmdF90cmFuc3BvcnRfc3RhdGVfdGVzdCwKKyAgICB0aHJpZnRfdHJhbnNwb3J0CisgIF19LAogCiAgICUgQWxsIG9mIHRoZSByZWdpc3RlcmVkIG5hbWVzIHRoZSBhcHBsaWNhdGlvbiB1c2VzLiBUaGlzIGNhbiBiZSBpZ25vcmVkLgogICB7cmVnaXN0ZXJlZCwgW119LApAQCAtMzYsMTEgKzU2LDcgQEAKICAgJSBBcHBsaWNhdGlvbnMgdGhhdCBhcmUgdG8gYmUgc3RhcnRlZCBwcmlvciB0byB0aGlzIG9uZS4gVGhpcyBjYW4gYmUgaWdub3JlZAogICAlIGxlYXZlIGl0IGFsb25lIHVubGVzcyB5b3UgdW5kZXJzdGFuZCBpdCB3ZWxsIGFuZCBsZXQgdGhlIC5yZWwgZmlsZXMgaW4KICAgJSB5b3VyIHJlbGVhc2UgaGFuZGxlIHRoaXMuCi0gIHthcHBsaWNhdGlvbnMsCi0gICBbCi0gICAga2VybmVsLAotICAgIHN0ZGxpYgotICAgXX0sCisgIHthcHBsaWNhdGlvbnMsIFtrZXJuZWwsIHN0ZGxpYl19LAogCiAgICUgT1RQIGFwcGxpY2F0aW9uIGxvYWRlciB3aWxsIGxvYWQsIGJ1dCBub3Qgc3RhcnQsIGluY2x1ZGVkIGFwcHMuIEFnYWluCiAgICUgdGhpcyBjYW4gYmUgaWdub3JlZCBhcyB3ZWxsLiAgVG8gbG9hZCBidXQgbm90IHN0YXJ0IGFuIGFwcGxpY2F0aW9uIGl0CkBAIC01MCwxMCArNjYsOSBAQAogICAlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzaW1pbGFyIHRvIHRob3NlIGluIHRoZSBjb25maWcgZmlsZSBzcGVjaWZpZWQKICAgJSBvbiB0aGUgY29tbWFuZCBsaW5lLiBjYW4gYmUgZmV0Y2hlZCB3aXRoIGdhczpnZXRfZW52CiAgIHtlbnYsIFsKLSAgICAgICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCi0gICAgICAgICAlIHNob3VsZCB0aGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHNlcmlhbGl6ZWQgYmFjayB0byB0aGUgY2xpZW50Ci0gICAgICAgICAlIGluY2x1ZGUgdGhlIGVybGFuZyBiYWNrdHJhY2U/Ci0gICAgICAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KKyAgICAlIElmIGFuIGVycm9yL2NyYXNoIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyBvZiBhIGZ1bmN0aW9uLAorICAgICUgc2hvdWxkIHRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gc2VyaWFsaXplZCBiYWNrIHRvIHRoZSBjbGllbnQKKyAgICAlIGluY2x1ZGUgdGhlIGVybGFuZyBiYWNrdHJhY2U/CisgICAge2V4Y2VwdGlvbnNfaW5jbHVkZV90cmFjZXMsIHRydWV9CiAgIF19Ci0gXQotfS4KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybAppbmRleCA4MDBmZDhlLi44NWFiYjYyIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybApAQCAtMzMzLDExICszMzMsMTUgQEAKIG5ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIE9wdGlvbnMpIC0+CiAgICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjdGJwX29wdHN7fSksCiAgICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KAotICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgW3tzdHJpY3RfcmVhZCwgIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3JlYWR9LAotICAgICAgICAgICAgICAgICAgIHtzdHJpY3Rfd3JpdGUsIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3dyaXRlfV0pCisgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydEZhY3RvcnkoKSBvZgorICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3N0cmljdF9yZWFkLCAgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3RfcmVhZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpY3Rfd3JpdGUsIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3dyaXRlfV0pOworICAgICAgICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgZW5kLAogICAgIHtvaywgRn0uCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKaW5kZXggZDRkNjE0ZS4uZTlkM2ZmZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKQEAgLTIxLDU3ICsyMSw3OCBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKLS1leHBvcnQoW25ldy8xLCBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMV0pLgorJSUgY29uc3RydWN0b3IKKy1leHBvcnQoW25ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvMV0pLgogCi0lJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwotLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1yZWNvcmQoYnVmZmVyZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLS10eXBlIHN0YXRlKCkgOjogI2J1ZmZlcmVkX3RyYW5zcG9ydHt9LgorLXJlY29yZCh0X2J1ZmZlcmVkLCB7CisgIHdyYXBwZWQsCisgIHdyaXRlX2J1ZmZlcgorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfYnVmZmVyZWR7fS4KKworCistc3BlYyBuZXcoVHJhbnNwb3J0Ojp0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFdyYXBwZWQpIC0+CisgIFN0YXRlID0gI3RfYnVmZmVyZWR7CisgICAgd3JhcHBlZCA9IFdyYXBwZWQsCisgICAgd3JpdGVfYnVmZmVyID0gW10KKyAgfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCisKIC1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCi1uZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KLSAgICBTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWQoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19LCBva30uCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKLSUlIEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotZmx1c2goU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIFdCdWYpLAotICAgIHtXcmFwcGVkMiwgX30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQxKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZDJ9LAotICAgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9LgogCi0lJSBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1jbG9zZShTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQwKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDF9LAotICAgIHtOZXdTdGF0ZSwgUmVzdWx0fS4KK3dyaXRlKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlIFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotcmVhZChTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIHtXcmFwcGVkMSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCBMZW4pLAotICAgIE5ld1N0YXRlID0gU3RhdGUjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMX0sCi0gICAge05ld1N0YXRlLCBSZXNwb25zZX0uCisKK2ZsdXNoKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHdyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgXyAtPgorICAgICAge1dyaXR0ZW4sIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgQnVmZmVyKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KKworCitjbG9zZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgorCiAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKIG5ld190cmFuc3BvcnRfZmFjdG9yeShXcmFwRmFjdG9yeSkgLT4KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFdyYXBwZWR9ID0gV3JhcEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBuZXcoV3JhcHBlZCkKLSAgICAgICAgZW5kLAotICAgIHtvaywgRn0uCisgIEYgPSBmdW4oKSAtPgorICAgIHtvaywgV3JhcHBlZH0gPSBXcmFwRmFjdG9yeSgpLAorICAgIG5ldyhXcmFwcGVkKQorICBlbmQsCisgIHtvaywgRn0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKaW5kZXggNWM3NGFkYy4uMWE5Y2I1MCAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKQEAgLTM2LDEzICszNiwxMiBAQAogCiAtc3BlYyBjYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwge29rLCBhbnkoKX0gfCB7ZXJyb3IsIGFueSgpfX0uCiBjYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQotICB3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+Ci0gICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKLSAgICAgICAge0NsaWVudDEsIG9rfSAtPgotICAgICAgICAgICAgcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOwotICAgICAgICBFbHNlIC0+Ci0gICAgICAgICAgICBFbHNlCi0gICAgZW5kLgord2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgorICBjYXNlIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKSBvZgorICAgIHtvaywgQ2xpZW50MX0gLT4gcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50MSwgRnVuY3Rpb24pOworICAgIHt7ZXJyb3IsIFh9LCBDbGllbnQxfSAtPiB7Q2xpZW50MSwge2Vycm9yLCBYfX07CisgICAgRWxzZSAtPiBFbHNlCisgIGVuZC4KIAogCiAlJSBTZW5kcyBhIGZ1bmN0aW9uIGNhbGwgYnV0IGRvZXMgbm90IHJlYWQgdGhlIHJlc3VsdC4gVGhpcyBpcyB1c2VmdWwKQEAgLTUxLDcgKzUwLDEwIEBACiAtc3BlYyBzZW5kX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHsjdGNsaWVudHt9LCBva30uCiBzZW5kX2NhbGwoQ2xpZW50ID0gI3RjbGllbnR7fSwgRnVuY3Rpb24sIEFyZ3MpCiAgIHdoZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KLSAgICBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykuCisgICAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICAgIHtvaywgQ2xpZW50MX0gLT4ge0NsaWVudDEsIG9rfTsKKyAgICAgIEVsc2UgLT4gRWxzZQorICAgIGVuZC4KIAogLXNwZWMgY2xvc2UoI3RjbGllbnR7fSkgLT4gb2suCiBjbG9zZSgjdGNsaWVudHtwcm90b2NvbD1Qcm90b2NvbH0pIC0+CkBAIC02MSwyOCArNjMsNDAgQEAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS1zcGVjIHNlbmRfZnVuY3Rpb25fY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIG9rIHwge2Vycm9yLCBhbnkoKX19Lgotc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCA9ICN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgID0gU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKLSAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICBBcmdzKSAtPgotICAgIFBhcmFtcyA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLAotICAgIGNhc2UgUGFyYW1zIG9mCi0gICAgICAgIG5vX2Z1bmN0aW9uIC0+Ci0gICAgICAgICAgICB7Q2xpZW50LCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgRnVuY3Rpb259fX07Ci0gICAgICAgIHtzdHJ1Y3QsIFBMaXN0fSB3aGVuIGxlbmd0aChQTGlzdCkgPS89IGxlbmd0aChBcmdzKSAtPgotICAgICAgICAgICAge0NsaWVudCwge2Vycm9yLCB7YmFkX2FyZ3MsIEZ1bmN0aW9uLCBBcmdzfX19OwotICAgICAgICB7c3RydWN0LCBfUExpc3R9IC0+Ci0gICAgICAgICAgICBCZWdpbiA9ICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfSwKLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzAsIEJlZ2luKSwKLSAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzEsIHtQYXJhbXMsIGxpc3RfdG9fdHVwbGUoW0Z1bmN0aW9uIHwgQXJnc10pfSksCi0gICAgICAgICAgICB7UHJvdG8zLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8yLCBtZXNzYWdlX2VuZCksCi0gICAgICAgICAgICB7UHJvdG80LCBva30gPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFByb3RvMyksCi0gICAgICAgICAgICB7Q2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzR9LCBva30KLSAgICBlbmQuCistc3BlYyBzZW5kX2Z1bmN0aW9uX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHtvayB8IHtlcnJvciwgYW55KCl9LCAjdGNsaWVudHt9fS4KK3NlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQgPSAjdGNsaWVudHtzZXJ2aWNlID0gU2VydmljZX0sIEZ1bmN0aW9uLCBBcmdzKSAtPgorICB7UGFyYW1zLCBSZXBseX0gPSB0cnkKKyAgICB7U2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSksIFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSl9CisgIGNhdGNoIGVycm9yOmZ1bmN0aW9uX2NsYXVzZSAtPiB7bm9fZnVuY3Rpb24sIDB9CisgIGVuZCwKKyAgTXNnVHlwZSA9IGNhc2UgUmVwbHkgb2YKKyAgICBvbmV3YXlfdm9pZCAtPiA/dE1lc3NhZ2VUeXBlX09ORVdBWTsKKyAgICBfIC0+ID90TWVzc2FnZVR5cGVfQ0FMTAorICBlbmQsCisgIGNhc2UgUGFyYW1zIG9mCisgICAgbm9fZnVuY3Rpb24gLT4KKyAgICAgIHt7ZXJyb3IsIHtub19mdW5jdGlvbiwgRnVuY3Rpb259fSwgQ2xpZW50fTsKKyAgICB7c3RydWN0LCBQTGlzdH0gd2hlbiBsZW5ndGgoUExpc3QpID0vPSBsZW5ndGgoQXJncykgLT4KKyAgICAgIHt7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fSwgQ2xpZW50fTsKKyAgICB7c3RydWN0LCBfUExpc3R9IC0+IHdyaXRlX21lc3NhZ2UoQ2xpZW50LCBGdW5jdGlvbiwgQXJncywgUGFyYW1zLCBNc2dUeXBlKQorICBlbmQuCisKKy1zcGVjIHdyaXRlX21lc3NhZ2UoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCksIHtzdHJ1Y3QsIGxpc3QoKX0sIGludGVnZXIoKSkgLT4KKyAge29rIHwge2Vycm9yLCBhbnkoKX0sICN0Y2xpZW50e319Lgord3JpdGVfbWVzc2FnZShDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFAwLCBzZXFpZCA9IFNlcX0sIEZ1bmN0aW9uLCBBcmdzLCBQYXJhbXMsIE1zZ1R5cGUpIC0+CisgIHRyeQorICAgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAorICAgICAgdHlwZSA9IE1zZ1R5cGUsCisgICAgICBzZXFpZCA9IFNlcQorICAgIH0pLAorICAgIHtQMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAxLCB7UGFyYW1zLCBsaXN0X3RvX3R1cGxlKFtGdW5jdGlvbnxBcmdzXSl9KSwKKyAgICB7UDMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMiwgbWVzc2FnZV9lbmQpLAorICAgIHtQNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQMyksCisgICAge29rLCBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFA0fX0KKyAgY2F0Y2gKKyAgICBlcnJvcjp7YmFkbWF0Y2gsIHtfLCB7ZXJyb3IsIF99ID0gRXJyb3J9fSAtPiB7RXJyb3IsIENsaWVudH0KKyAgZW5kLgogCiAtc3BlYyByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdCgjdGNsaWVudHt9LCBhdG9tKCkpIC0+IHsjdGNsaWVudHt9LCB7b2ssIGFueSgpfSB8IHtlcnJvciwgYW55KCl9fS4KIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudCA9ICN0Y2xpZW50e3NlcnZpY2UgPSBTZXJ2aWNlfSwgRnVuY3Rpb24pIC0+CkBAIC05NiwxNyArMTEwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKICAgICAgICAgICAgIEZ1bmN0aW9uLAogICAgICAgICAgICAgUmVwbHlUeXBlKSAtPgotICAgIHtQcm90bzEsIE1lc3NhZ2VCZWdpbn0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsIG1lc3NhZ2VfYmVnaW4pLAotICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8xfSwKLSAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgotICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntzZXFpZCA9IFJldFNlcUlkfSB3aGVuIFJldFNlcUlkID0vPSBTZXFJZCAtPgotICAgICAgICAgICAge05ld0NsaWVudCwge2Vycm9yLCB7YmFkX3NlcV9pZCwgU2VxSWR9fX07Ci0KLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfRVhDRVBUSU9OfSAtPgotICAgICAgICAgICAgaGFuZGxlX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbihOZXdDbGllbnQpOwotCi0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX1JFUExZfSAtPgotICAgICAgICAgICAgaGFuZGxlX3JlcGx5KE5ld0NsaWVudCwgRnVuY3Rpb24sIFJlcGx5VHlwZSkKKyAgICBjYXNlIHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgbWVzc2FnZV9iZWdpbikgb2YKKyAgICAgICAgIHtQcm90bzEsIHtlcnJvciwgUmVhc29ufX0gLT4KKyAgICAgICAgICAgICBOZXdDbGllbnQgPSBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMX0sCisgICAgICAgICAgICAge05ld0NsaWVudCwge2Vycm9yLCBSZWFzb259fTsKKyAgICAgICAgIHtQcm90bzEsIE1lc3NhZ2VCZWdpbn0gLT4KKyAgICAgICAgICAgICBOZXdDbGllbnQgPSBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMX0sCisgICAgICAgICAgICAgY2FzZSBNZXNzYWdlQmVnaW4gb2YKKyAgICAgICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57c2VxaWQgPSBSZXRTZXFJZH0gd2hlbiBSZXRTZXFJZCA9Lz0gU2VxSWQgLT4KKyAgICAgICAgICAgICAgICAgICAgIHtOZXdDbGllbnQsIHtlcnJvciwge2JhZF9zZXFfaWQsIFNlcUlkfX19OworICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt0eXBlID0gP3RNZXNzYWdlVHlwZV9FWENFUFRJT059IC0+CisgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfYXBwbGljYXRpb25fZXhjZXB0aW9uKE5ld0NsaWVudCk7CisgICAgICAgICAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX1JFUExZfSAtPgorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3JlcGx5KE5ld0NsaWVudCwgRnVuY3Rpb24sIFJlcGx5VHlwZSkKKyAgICAgICAgICAgICBlbmQKICAgICBlbmQuCiAKIApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKaW5kZXggYzUyYmI4Yi4uMWRiZTUxZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCkBAIC0yMCw2ICsyMCwxMSBAQAogLW1vZHVsZSh0aHJpZnRfY2xpZW50X3V0aWwpLgogCiAtZXhwb3J0KFtuZXcvNF0pLgorLWV4cG9ydChbbmV3X211bHRpcGxleGVkLzMsIG5ld19tdWx0aXBsZXhlZC80XSkuCisKKy10eXBlIHNlcnZpY2VfbmFtZSgpICAgICAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCkuCistdHlwZSBzZXJ2aWNlX21vZHVsZSgpICAgICAgICAgIDo6IGF0b20oKS4KKy10eXBlIG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCkgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFNlcnZpY2VNb2R1bGU6OnNlcnZpY2VfbW9kdWxlKCl9XS4KIAogJSUKICUlIFNwbGl0cyBjbGllbnQgb3B0aW9ucyBpbnRvIGNsaWVudCwgcHJvdG9jb2wsIGFuZCB0cmFuc3BvcnQgb3B0aW9ucwpAQCAtMzQsMjggKzM5LDc0IEBACiAKIHNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCiAgIHdoZW4gT3B0S2V5ID06PSBzdHJpY3RfcmVhZDsKLSAgICAgICBPcHRLZXkgPTo9IHN0cmljdF93cml0ZSAtPgorICAgICAgIE9wdEtleSA9Oj0gc3RyaWN0X3dyaXRlOworICAgICAgIE9wdEtleSA9Oj0gcHJvdG9jb2wgLT4KICAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFtPcHQgfCBQcm90b0luXSwgVHJhbnNJbik7CiAKIHNwbGl0X29wdGlvbnMoW09wdCA9IHtPcHRLZXksIF99IHwgUmVzdF0sIFByb3RvSW4sIFRyYW5zSW4pCiAgIHdoZW4gT3B0S2V5ID06PSBmcmFtZWQ7CiAgICAgICAgT3B0S2V5ID06PSBjb25uZWN0X3RpbWVvdXQ7Ci0gICAgICAgT3B0S2V5ID06PSBzb2Nrb3B0cyAtPgorICAgICAgIE9wdEtleSA9Oj0gcmVjdl90aW1lb3V0OworICAgICAgIE9wdEtleSA9Oj0gc29ja29wdHM7CisgICAgICAgT3B0S2V5ID06PSBzc2x0cmFuc3BvcnQ7CisgICAgICAgT3B0S2V5ID06PSBzc2xvcHRpb25zLT4KICAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFByb3RvSW4sIFtPcHQgfCBUcmFuc0luXSkuCiAKIAogJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgY29tbW9uLWNhc2Ugb2Ygc29ja2V0IHRyYW5zcG9ydHMKLSUlIHdpdGggdGhlIGJpbmFyeSBwcm90b2NvbAogbmV3KEhvc3QsIFBvcnQsIFNlcnZpY2UsIE9wdGlvbnMpCiAgIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwgaXNfYXRvbShTZXJ2aWNlKSwgaXNfbGlzdChPcHRpb25zKSAtPgotICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorICAgIHtQcm90b09wdHMsIFRyYW5zT3B0czB9ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKIAorICAgIHtUcmFuc3BvcnRNb2R1bGUsIFRyYW5zT3B0czJ9ID0gY2FzZSBsaXN0czprZXl0YWtlKHNzbHRyYW5zcG9ydCwgMSwgVHJhbnNPcHRzMCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCB0cnVlfSwgVHJhbnNPcHRzMX0gLT4ge3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LCBUcmFuc09wdHMxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB7dGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIFRyYW5zT3B0czB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisKKyAgICB7UHJvdG9jb2xNb2R1bGUsIFByb3RvT3B0czF9ID0gY2FzZSBsaXN0czprZXl0YWtlKHByb3RvY29sLCAxLCBQcm90b09wdHMpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgY29tcGFjdH0sIE9wdHN9IC0+IHt0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywganNvbn0sIE9wdHN9IC0+IHt0aHJpZnRfanNvbl9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgYmluYXJ5fSwgT3B0c30gLT4ge3RocmlmdF9iaW5hcnlfcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHt0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBQcm90b09wdHN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0cyksCisgICAgICAgIFRyYW5zcG9ydE1vZHVsZTpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgVHJhbnNPcHRzMiksCiAKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSBQcm90b2NvbE1vZHVsZTpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0czEpLAorCisgICAgY2FzZSBQcm90b2NvbEZhY3RvcnkoKSBvZgorICAgICAgICB7b2ssIFByb3RvY29sfSAtPgorICAgICAgICAgICAgdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG9jb2wsIFNlcnZpY2UpOworICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICBlbmQuCisKKy1zcGVjIG5ld19tdWx0aXBsZXhlZChIb3N0LCBQb3J0LCBTZXJ2aWNlcywgT3B0aW9ucykgLT4ge29rLCBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdH0gd2hlbgorICAgIEhvc3QgICAgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLAorICAgIFBvcnQgICAgICAgIDo6IG5vbl9uZWdfaW50ZWdlcigpLAorICAgIFNlcnZpY2VzICAgIDo6IG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCksCisgICAgT3B0aW9ucyAgICAgOjogbGlzdCgpLAorICAgIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0IDo6IFt7U2VydmljZU5hbWU6Omxpc3QoKSwgVGhyaWZ0Q2xpZW50Ojp0ZXJtKCl9XS4KK25ld19tdWx0aXBsZXhlZChIb3N0LCBQb3J0LCBTZXJ2aWNlcywgT3B0aW9ucykgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoU2VydmljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoT3B0aW9ucykgLT4KKyAgICBuZXdfbXVsdGlwbGV4ZWQodGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpLCBTZXJ2aWNlcywgT3B0aW9ucykuCisKKy1zcGVjIG5ld19tdWx0aXBsZXhlZChUcmFuc3BvcnRGYWN0b3J5VHVwbGUsIFNlcnZpY2VzLCBPcHRpb25zKSAtPiB7b2ssIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0fSB3aGVuCisgICAgVHJhbnNwb3J0RmFjdG9yeVR1cGxlICAgOjoge29rLCBUcmFuc3BvcnRGYWN0b3J5Ojp0ZXJtKCl9LAorICAgIFNlcnZpY2VzICAgICAgICAgICAgICAgIDo6IG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCksCisgICAgT3B0aW9ucyAgICAgICAgICAgICAgICAgOjogbGlzdCgpLAorICAgIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0IDo6IFt7U2VydmljZU5hbWU6OnNlcnZpY2VfbmFtZSgpLCBUaHJpZnRDbGllbnQ6OnRlcm0oKX1dLgorbmV3X211bHRpcGxleGVkKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwgU2VydmljZXMsIE9wdGlvbnMpIHdoZW4gaXNfbGlzdChTZXJ2aWNlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KE9wdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdHVwbGUoVHJhbnNwb3J0RmFjdG9yeVR1cGxlKSAtPgorICAgIHtQcm90b09wdHMsIF99ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKKworICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPSBUcmFuc3BvcnRGYWN0b3J5VHVwbGUsCisKKyAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0cyksCiAKICAgICB7b2ssIFByb3RvY29sfSA9IFByb3RvY29sRmFjdG9yeSgpLAogCi0gICAgdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG9jb2wsIFNlcnZpY2UpLgorICAgIHtvaywgW3tTZXJ2aWNlTmFtZSwgZWxlbWVudCgyLCB0aHJpZnRfY2xpZW50Om5ldyhlbGVtZW50KDIsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbDpuZXcoUHJvdG9jb2wsIFNlcnZpY2VOYW1lKSksIFNlcnZpY2UpKX0gfHwge1NlcnZpY2VOYW1lLCBTZXJ2aWNlfSA8LSBTZXJ2aWNlc119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTQyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSwzOTAgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1leHBvcnQoW25ldy8xLCBuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xLAorICAgICAgICAgbmV3X3Byb3RvY29sX2ZhY3RvcnkvMgorICAgICAgICBdKS4KKworLWRlZmluZShJRF9OT05FLCAxNiMxMDAwMCkuCistZGVmaW5lKENCT09MX05PTkUsIDApLgorLWRlZmluZShDQk9PTF9UUlVFLCAxKS4KKy1kZWZpbmUoQ0JPT0xfRkFMU0UsIDIpLgorCistcmVjb3JkKHRfY29tcGFjdCwge3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RhdGUgZm9yIHBlbmRpbmcgYm9vbGVhbiBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3ZhbHVlPT9DQk9PTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9pZD0/SURfTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KKy10eXBlIHN0YXRlKCkgOjogI3RfY29tcGFjdHt9LgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbF9iZWhhdmlvdXIuaHJsIikuCisKKy1kZWZpbmUoUFJPVE9DT0xfSUQsIDE2IzgyKS4KKy1kZWZpbmUoVkVSU0lPTl9NQVNLLCAxNiMxZikuCistZGVmaW5lKFZFUlNJT05fMSwgMTYjMDEpLgorLWRlZmluZShUWVBFX01BU0ssIDE2I0UwKS4KKy1kZWZpbmUoVFlQRV9CSVRTLCAxNiMwNykuCistZGVmaW5lKFRZUEVfU0hJRlRfQU1PVU5ULCA1KS4KKwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUT1ApIC0+IDE2IzA7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfQk9PTCkgLT4gMTYjMjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JOCkgLT4gMTYjMzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JMTYpIC0+IDE2IzQ7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTMyKSAtPiAxNiM1OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0k2NCkgLT4gMTYjNjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9ET1VCTEUpIC0+IDE2Izc7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RSSU5HKSAtPiAxNiM4OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUUlVDVCkgLT4gMTYjQzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9NQVApIC0+IDE2I0I7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU0VUKSAtPiAxNiNBOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0xJU1QpIC0+IDE2IzkuCisKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzApIC0+ICA/dFR5cGVfU1RPUDsKK2NvbXBhY3RfdG9fdHlwZWlkKD9DQk9PTF9GQUxTRSkgLT4gID90VHlwZV9CT09MOworY29tcGFjdF90b190eXBlaWQoP0NCT09MX1RSVUUpIC0+ICA/dFR5cGVfQk9PTDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzcpIC0+ICA/dFR5cGVfRE9VQkxFOworY29tcGFjdF90b190eXBlaWQoMTYjMykgLT4gID90VHlwZV9JODsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzQpIC0+ICA/dFR5cGVfSTE2OworY29tcGFjdF90b190eXBlaWQoMTYjNSkgLT4gID90VHlwZV9JMzI7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM2KSAtPiAgP3RUeXBlX0k2NDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzgpIC0+ICA/dFR5cGVfU1RSSU5HOworY29tcGFjdF90b190eXBlaWQoMTYjQykgLT4gID90VHlwZV9TVFJVQ1Q7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNCKSAtPiAgP3RUeXBlX01BUDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0EpIC0+ICA/dFR5cGVfU0VUOworY29tcGFjdF90b190eXBlaWQoMTYjOSkgLT4gID90VHlwZV9MSVNULgorCitib29sX3RvX2Nib29sKFZhbHVlKSB3aGVuIFZhbHVlIC0+ID9DQk9PTF9UUlVFOworYm9vbF90b19jYm9vbChfKSAtPiA/Q0JPT0xfRkFMU0UuCitjYm9vbF90b19ib29sKFZhbHVlKSAtPiBWYWx1ZSA9Oj0gP0NCT09MX1RSVUUuCisKK25ldyhUcmFuc3BvcnQpIC0+IG5ldyhUcmFuc3BvcnQsIF9PcHRpb25zID0gW10pLgorCituZXcoVHJhbnNwb3J0LCBfT3B0aW9ucykgLT4KKyAgU3RhdGUgID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9LAorICB0aHJpZnRfcHJvdG9jb2w6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworZmx1c2hfdHJhbnNwb3J0KFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCitjbG9zZV90cmFuc3BvcnQoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKyUlJQorJSUlIGluc3RhbmNlIG1ldGhvZHMKKyUlJQorCit3cml0ZV9maWVsZF9iZWdpbihUaGlzMCA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2s9W0xhc3RJZHxUXX0sIENvbXBhY3RUeXBlLCBJZCkgLT4KKyAgSWREaWZmID0gSWQgLSBMYXN0SWQsCisgIFRoaXMxID0gVGhpczAjdF9jb21wYWN0e3dyaXRlX3N0YWNrPVtJZHxUXX0sCisgIGNhc2UgKElkRGlmZiA+IDApIGFuZCAoSWREaWZmIDwgMTYpIG9mCisgICAgdHJ1ZSAtPiB3cml0ZShUaGlzMSwge2J5dGUsIChJZERpZmYgYnNsIDQpIGJvciBDb21wYWN0VHlwZX0pOworICAgIGZhbHNlIC0+CisgICAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgQ29tcGFjdFR5cGV9KSwKKyAgICAgIHdyaXRlKFRoaXMyLCB7aTE2LCBJZH0pCisgIGVuZC4KKworLXNwZWMgdG9femlnemFnKGludGVnZXIoKSkgLT4gbm9uX25lZ19pbnRlZ2VyKCkuCit0b196aWd6YWcoVmFsdWUpIC0+IDE2I0ZGRkZGRkZGRkZGRkZGRkYgYmFuZCAoKFZhbHVlIGJzbCAxKSBieG9yIChWYWx1ZSBic3IgNjMpKS4KKworLXNwZWMgZnJvbV96aWd6YWcobm9uX25lZ19pbnRlZ2VyKCkpIC0+IGludGVnZXIoKS4KK2Zyb21femlnemFnKFZhbHVlKSAtPiAoVmFsdWUgYnNyIDEpIGJ4b3IgLShWYWx1ZSBiYW5kIDEpLgorCistc3BlYyB0b192YXJpbnQobm9uX25lZ19pbnRlZ2VyKCksIGlvbGlzdCgpKSAtPiBpb2xpc3QoKS4KK3RvX3ZhcmludChWYWx1ZSwgQWNjKSB3aGVuIChWYWx1ZSA8IDE2IzgwKSAtPiBbQWNjLCBWYWx1ZV07Cit0b192YXJpbnQoVmFsdWUsIEFjYykgLT4KKyAgdG9fdmFyaW50KFZhbHVlIGJzciA3LCBbQWNjLCAoKFZhbHVlIGJhbmQgMTYjN0YpIGJvciAxNiM4MCldKS4KKworLXNwZWMgcmVhZF92YXJpbnQoI3RfY29tcGFjdHt9LCBub25fbmVnX2ludGVnZXIoKSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+IG5vbl9uZWdfaW50ZWdlcigpLgorcmVhZF92YXJpbnQoVGhpczAsIEFjYywgQ291bnQpIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgY2FzZSAoQnl0ZSBiYW5kIDE2IzgwKSBvZgorICAgIDAgLT4ge1RoaXMxLCB7b2ssIChCeXRlIGJzbCAoNyAqIENvdW50KSkgKyBBY2N9fTsKKyAgICBfIC0+IHJlYWRfdmFyaW50KFRoaXMxLCAoKEJ5dGUgYmFuZCAxNiM3ZikgYnNsICg3ICogQ291bnQpKSArIEFjYywgQ291bnQgKyAxKQorICBlbmQuCisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgICAgbmFtZSA9IE5hbWUsCisgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICBzZXFpZCA9IFNlcWlkfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsID9QUk9UT0NPTF9JRH0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKD9WRVJTSU9OXzEgYmFuZCA/VkVSU0lPTl9NQVNLKSBib3IgKFR5cGUgYnNsID9UWVBFX1NISUZUX0FNT1VOVCl9KSwKKyAge1RoaXMzLCBva30gPSB3cml0ZShUaGlzMiwge3VpMzIsIFNlcWlkfSksCisgIHtUaGlzNCwgb2t9ID0gd3JpdGUoVGhpczMsIHtzdHJpbmcsIE5hbWV9KSwKKyAge1RoaXM0LCBva307CisKK3dyaXRlKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgIG5hbWUgPSBfTmFtZSwKKyAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICBpZCA9IElkfSkKK3doZW4gKFR5cGUgPTo9ID90VHlwZV9CT09MKSAtPiB7VGhpczAjdF9jb21wYWN0e3dyaXRlX2lkID0gSWR9LCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgbmFtZSA9IF9OYW1lLAorICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgIGlkID0gSWR9KSAtPgorICB3cml0ZV9maWVsZF9iZWdpbihUaGlzMCwgdHlwZWlkX3RvX2NvbXBhY3QoVHlwZSksIElkKTsKKword3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4gd3JpdGUoVGhpcywge2J5dGUsID90VHlwZV9TVE9QfSk7CisKK3dyaXRlKFRoaXMsIGZpZWxkX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tYXBfYmVnaW57CisgICAgICBrdHlwZSA9IF9LdHlwZSwKKyAgICAgIHZ0eXBlID0gX1Z0eXBlLAorICAgICAgc2l6ZSA9IFNpemV9KQord2hlbiBTaXplID06PSAwIC0+CisgIHdyaXRlKFRoaXMwLCB7Ynl0ZSwgMH0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21hcF9iZWdpbnsKKyAgICAgICBrdHlwZSA9IEt0eXBlLAorICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgU2l6ZX0pLAorICB3cml0ZShUaGlzMSwge2J5dGUsICh0eXBlaWRfdG9fY29tcGFjdChLdHlwZSkgYnNsIDQpIGJvciB0eXBlaWRfdG9fY29tcGFjdChWdHlwZSl9KTsKKword3JpdGUoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pCit3aGVuIFNpemUgPCAxNiNmIC0+CisgIHdyaXRlKFRoaXMwLCB7Ynl0ZSwgKFNpemUgYnNsIDQpIGJvciB0eXBlaWRfdG9fY29tcGFjdChFdHlwZSl9KTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCAxNiNmMCBib3IgdHlwZWlkX3RvX2NvbXBhY3QoRXR5cGUpfSksCisgIHdyaXRlKFRoaXMxLCB7dWkzMiwgU2l6ZX0pOworCit3cml0ZShUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9zZXRfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgd3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gRXR5cGUsIHNpemUgPSAgU2l6ZX0pOworCit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFN0YWNrfSwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSAtPgorICB7VGhpcyN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBbMHxTdGFja119LCBva307Cit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFtffFRdfSwgc3RydWN0X2VuZCkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gVH0sIG9rfTsKKword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfaWQgPSA/SURfTk9ORX0sIHtib29sLCBWYWx1ZX0pIC0+CisgIHdyaXRlKFRoaXMsIHtieXRlLCBib29sX3RvX2Nib29sKFZhbHVlKX0pOworCit3cml0ZShUaGlzMCA9ICN0X2NvbXBhY3R7d3JpdGVfaWQgPSBJZH0sIHtib29sLCBWYWx1ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGVfZmllbGRfYmVnaW4oVGhpczAsIGJvb2xfdG9fY2Jvb2woVmFsdWUpLCBJZCksCisgIHtUaGlzMSN0X2NvbXBhY3R7d3JpdGVfaWQgPSA/SURfTk9ORX0sIG9rfTsKKword3JpdGUoVGhpcywge2J5dGUsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPgorICB3cml0ZShUaGlzLCA8PFZhbHVlOjgvYmlnLXNpZ25lZD4+KTsKKword3JpdGUoVGhpcywge2kxNiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOword3JpdGUoVGhpcywge3VpMzIsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQoVmFsdWUsIFtdKSk7Cit3cml0ZShUaGlzLCB7aTMyLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4KKyAgd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7Cit3cml0ZShUaGlzLCB7aTY0LCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7CisKK3dyaXRlKFRoaXMsIHtkb3VibGUsIERvdWJsZX0pIC0+CisgIHdyaXRlKFRoaXMsIDw8RG91YmxlOjY0L2Zsb2F0LXNpZ25lZC1saXR0bGU+Pik7CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBTdHJ9KSB3aGVuIGlzX2xpc3QoU3RyKSAtPgorICAlIFRPRE86IGxpbWl0IGxlbmd0aAorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgbGVuZ3RoKFN0cil9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwgbGlzdF90b19iaW5hcnkoU3RyKSksCisgIHtUaGlzMiwgb2t9OworCit3cml0ZShUaGlzMCwge3N0cmluZywgQmlufSkgd2hlbiBpc19iaW5hcnkoQmluKSAtPgorICAlIFRPRE86IGxpbWl0IGxlbmd0aAorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgc2l6ZShCaW4pfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIEJpbiksCisgIHtUaGlzMiwgb2t9OworCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc30sIERhdGEpIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFRyYW5zLCBEYXRhKSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKyUlCislJQorCityZWFkKFRoaXMwLCBtZXNzYWdlX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgP1BST1RPQ09MX0lEfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBWZXJBbmRUeXBlfX0gPSByZWFkKFRoaXMxLCB1Ynl0ZSksCisgID9WRVJTSU9OXzEgPSBWZXJBbmRUeXBlIGJhbmQgP1ZFUlNJT05fTUFTSywKKyAge1RoaXMzLCB7b2ssIFNlcUlkfX0gPSByZWFkKFRoaXMyLCB1aTMyKSwKKyAge1RoaXM0LCB7b2ssIE5hbWV9fSA9IHJlYWQoVGhpczMsIHN0cmluZyksCisgIHtUaGlzNCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgICAgICAgbmFtZSAgPSBiaW5hcnlfdG9fbGlzdChOYW1lKSwKKyAgICAgICAgICAgICB0eXBlICA9IChWZXJBbmRUeXBlIGJzciA/VFlQRV9TSElGVF9BTU9VTlQpIGJhbmQgP1RZUEVfQklUUywKKyAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfX07CisKK3JlYWQoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpcyA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFN0YWNrfSwgc3RydWN0X2JlZ2luKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFswfFN0YWNrXX0sIG9rfTsKK3JlYWQoVGhpcyA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtfSHxUXX0sIHN0cnVjdF9lbmQpIC0+CisgIHtUaGlzI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gVH0sIG9rfTsKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtMYXN0SWR8VF19LCBmaWVsZF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAgY2FzZSBCeXRlIGJhbmQgMTYjZiBvZgorICAgIENvbXBhY3RUeXBlID0gP3RUeXBlX1NUT1AgLT4KKyAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBDb21wYWN0VHlwZX19OworICAgIENvbXBhY3RUeXBlIC0+CisgICAgICB7VGhpczIsIHtvaywgSWR9fSA9IGNhc2UgQnl0ZSBic3IgNCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4gcmVhZChUaGlzMSwgaTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZERpZmYgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtUaGlzMSwge29rLCBMYXN0SWQgKyBJZERpZmZ9fQorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICBjYXNlIGNvbXBhY3RfdG9fdHlwZWlkKENvbXBhY3RUeXBlKSBvZgorICAgICAgICA/dFR5cGVfQk9PTCAtPgorICAgICAgICAgIHtUaGlzMiN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtJZHxUXSwgcmVhZF92YWx1ZSA9IGNib29sX3RvX2Jvb2woQ29tcGFjdFR5cGUpfSwKKyAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSBJZH19OworICAgICAgICBUeXBlIC0+CisgICAgICAgICAge1RoaXMyI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0lkfFRdfSwKKyAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlLCBpZCA9IElkfX0KKyAgICAgIGVuZAorICBlbmQ7CisKK3JlYWQoVGhpcywgZmllbGRfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBtYXBfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplfX0gID0gcmVhZChUaGlzMCwgdWkzMiksCisgIHtUaGlzMiwge29rLCBLVn19ID0gY2FzZSBTaXplIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAwIC0+IHtUaGlzMSwge29rLCAwfX07CisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHJlYWQoVGhpczEsIHVieXRlKQorICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gY29tcGFjdF90b190eXBlaWQoS1YgYnNyIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChLViBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKK3JlYWQoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgbGlzdF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemVBbmRUeXBlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBTaXplfX0gPSBjYXNlIChTaXplQW5kVHlwZSBic3IgNCkgYmFuZCAxNiNmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE2I2YgLT4gcmVhZChUaGlzMSwgdWkzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsc2UgLT4ge1RoaXMxLCB7b2ssIEVsc2V9fQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gY29tcGFjdF90b190eXBlaWQoU2l6ZUFuZFR5cGUgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworCityZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplQW5kVHlwZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgU2l6ZX19ID0gY2FzZSAoU2l6ZUFuZFR5cGUgYnNyIDQpIGJhbmQgMTYjZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAxNiNmIC0+IHJlYWQoVGhpczEsIHVpMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBFbHNlIC0+IHtUaGlzMSwge29rLCBFbHNlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gY29tcGFjdF90b190eXBlaWQoU2l6ZUFuZFR5cGUgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworCityZWFkKFRoaXMsIHNldF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIGZpZWxkX3N0b3ApIC0+CisgIHtUaGlzMSwge29rLCA/dFR5cGVfU1RPUH19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczEsIG9rfTsKKworJSUKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9ID9DQk9PTF9OT05FfSwgYm9vbCkgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMxLCB7b2ssIGNib29sX3RvX2Jvb2woQnl0ZSl9fTsKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9IEJvb2x9LCBib29sKSAtPgorICB7VGhpczAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSA/Q0JPT0xfTk9ORX0sIHtvaywgQm9vbH19OworCityZWFkKFRoaXMwLCB1Ynl0ZSkgLT4KKyAge1RoaXMxLCB7b2ssIDw8VmFsOjgvaW50ZWdlci11bnNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59fSA9IHJlYWRfZGF0YShUaGlzMCwgMSksCisgIHtUaGlzMSwge29rLCBWYWx9fTsKKworcmVhZChUaGlzMCwgYnl0ZSkgLT4KKyAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDEpLAorICBjYXNlIEJ5dGVzIG9mCisgICAge29rLCA8PFZhbDo4L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQorICBlbmQ7CisKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCB1aTMyKSAtPiByZWFkX3ZhcmludChUaGlzMCwgMCwgMCk7CisKK3JlYWQoVGhpczAsIGkzMikgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCBpNjQpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgZG91YmxlKSAtPgorICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgOCksCisgIGNhc2UgQnl0ZXMgb2YKKyAgICB7b2ssIDw8VmFsOjY0L2Zsb2F0LXNpZ25lZC1saXR0bGUsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KKyAgZW5kOworCislIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgIHtUaGlzMSwge29rLCBTen19ICA9IHJlYWQoVGhpczAsIHVpMzIpLAorICByZWFkX2RhdGEoVGhpczEsIFN6KS4KKworLXNwZWMgcmVhZF9kYXRhKCN0X2NvbXBhY3R7fSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+CisgICAgeyN0X2NvbXBhY3R7fSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KK3JlYWRfZGF0YShUaGlzLCAwKSAtPiB7VGhpcywge29rLCA8PD4+fX07CityZWFkX2RhdGEoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnN9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIGFuZGFsc28gTGVuID4gMCAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnMsIExlbiksCisgICAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJSByZXR1cm5zIGEgKGZ1bigpIC0+IHRocmlmdF9wcm90b2NvbCgpKQorbmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgX09wdGlvbnMpIC0+CisgIEYgPSBmdW4oKSAtPgorICAgICAgICAgIGNhc2UgVHJhbnNwb3J0RmFjdG9yeSgpIG9mCisgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gLT4KKyAgICAgICAgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KAorICAgICAgICAgICAgICAgIFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICBbXSk7CisgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQorICAgICAgICAgIGVuZAorICAgICAgZW5kLAorICB7b2ssIEZ9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKaW5kZXggYmEzYWE4OS4uMDcxMTUyYiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCkBAIC0yMSw2OSArMjEsOTUgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotLWV4cG9ydChbbmV3X3JlYWRlci8xLAotICAgICAgICAgbmV3LzEsCi0gICAgICAgICBuZXcvMiwKLSAgICAgICAgIHdyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMSwgbmV3LzJdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld19yZWFkZXIvMV0pLgogCi0tcmVjb3JkKHRfZmlsZV90cmFuc3BvcnQsIHtkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfY2xvc2UgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IHdyaXRlfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICN0X2ZpbGVfdHJhbnNwb3J0e30uCi0taW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKLSUlJSUgQ09OU1RSVUNUSU9OICAgJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorLXJlY29yZCh0X2ZpbGUsIHsKKyAgZGV2aWNlLAorICBzaG91bGRfY2xvc2UgPSB0cnVlLAorICBtb2RlID0gd3JpdGUKK30pLgogCi1uZXdfcmVhZGVyKEZpbGVuYW1lKSAtPgotICAgIGNhc2UgZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmVhZCwgYmluYXJ5LCB7cmVhZF9haGVhZCwgMTAyNCoxMDI0fV0pIG9mCi0gICAgICAgIHtvaywgSU9EZXZpY2V9IC0+Ci0gICAgICAgICAgICBuZXcoSU9EZXZpY2UsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfSwge21vZGUsIHJlYWR9XSk7Ci0gICAgICAgIEVycm9yIC0+IEVycm9yCi0gICAgZW5kLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9maWxle30uCiAKLW5ldyhEZXZpY2UpIC0+Ci0gICAgbmV3KERldmljZSwgW10pLgogCi0lJSBEZXZpY2UgOjogaW9fZGV2aWNlKCkKLSUlCistc3BlYyBuZXcoRGV2aWNlOjpmaWxlOmlvX2RldmljZSgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhEZXZpY2UpIC0+IG5ldyhEZXZpY2UsIFtdKS4KKworLXNwZWMgbmV3KERldmljZTo6ZmlsZTppb19kZXZpY2UoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKICUlIERldmljZSBzaG91bGQgYmUgb3BlbmVkIGluIHJhdyBhbmQgYmluYXJ5IG1vZGUuCiBuZXcoRGV2aWNlLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0cykgLT4KLSAgICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlfSksCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2V9KSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCiAKLSUlIFBhcnNlIG9wdGlvbnMKLXBhcnNlX29wdHMoW3tzaG91bGRfY2xvc2UsIEJvb2x9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KLSAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZV90cmFuc3BvcnR7c2hvdWxkX2Nsb3NlID0gQm9vbH0pOwotcGFyc2Vfb3B0cyhbe21vZGUsIE1vZGV9IHwgUmVzdF0sIFN0YXRlKQotICB3aGVuIE1vZGUgPTo9IHdyaXRlOwotICAgICAgIE1vZGUgPTo9IHJlYWQgLT4KLSAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZV90cmFuc3BvcnR7bW9kZSA9IE1vZGV9KTsKK3BhcnNlX29wdHMoW3tzaG91bGRfY2xvc2UsIEJvb2x9fFJlc3RdLCBTdGF0ZSkKK3doZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZXtzaG91bGRfY2xvc2UgPSBCb29sfSk7CitwYXJzZV9vcHRzKFt7bW9kZSwgTW9kZX18UmVzdF0sIFN0YXRlKQord2hlbiBNb2RlID06PSB3cml0ZTsgTW9kZSA9Oj0gcmVhZCAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZXttb2RlID0gTW9kZX0pOwogcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+Ci0gICAgIFN0YXRlLgorICBTdGF0ZS4KIAogCi0lJSUlIFRSQU5TUE9SVCBJTVBMICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLQotd3JpdGUoVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSwgRGF0YSkgLT4KLSAgICB7VGhpcywgZmlsZTp3cml0ZShEZXZpY2UsIERhdGEpfTsKLXdyaXRlKFRoaXMsIF9EKSAtPgotICAgIHtUaGlzLCB7ZXJyb3IsIHJlYWRfbW9kZX19LgorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCiAKLXJlYWQoVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHJlYWR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIHtUaGlzLCBmaWxlOnJlYWQoRGV2aWNlLCBMZW4pfTsKLXJlYWQoVGhpcywgX0QpIC0+Ci0gICAge1RoaXMsIHtlcnJvciwgcmVhZF9tb2RlfX0uCityZWFkKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgZmlsZTpyZWFkKERldmljZSwgTGVuKSBvZgorICAgIGVvZiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAge29rLCBSZXN1bHR9IC0+IHtTdGF0ZSwge29rLCBpb2xpc3RfdG9fYmluYXJ5KFJlc3VsdCl9fQorICBlbmQ7CityZWFkKFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgd3JpdGVfbW9kZX19LgogCi1mbHVzaChUaGlzID0gI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9KSAtPgotICAgIHtUaGlzLCBmaWxlOnN5bmMoRGV2aWNlKX0uCiAKLWNsb3NlKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIHNob3VsZF9jbG9zZSA9IFNDfSkgLT4KLSAgICBjYXNlIFNDIG9mCi0gICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIHtUaGlzLCBmaWxlOmNsb3NlKERldmljZSl9OwotICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAge1RoaXMsIG9rfQotICAgIGVuZC4KK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHJlYWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgY2FzZSBmaWxlOnJlYWQoRGV2aWNlLCBMZW4pIG9mCisgICAgZW9mIC0+IHtTdGF0ZSwge2Vycm9yLCBlb2Z9fTsKKyAgICB7b2ssIFJlc3VsdH0gLT4KKyAgICAgIGNhc2UgaW9saXN0X3NpemUoUmVzdWx0KSBvZgorICAgICAgICBYIHdoZW4gWCA8IExlbiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAgICAgIF8gLT4ge1N0YXRlLCB7b2ssIGlvbGlzdF90b19iaW5hcnkoUmVzdWx0KX19CisgICAgICBlbmQKKyAgZW5kOworcmVhZF9leGFjdChTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHdyaXRlX21vZGV9fS4KKworCit3cml0ZShTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9LCBEYXRhKSAtPgorICB7U3RhdGUsIGZpbGU6d3JpdGUoRGV2aWNlLCBEYXRhKX07Cit3cml0ZShTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHJlYWRfbW9kZX19LgorCisKK2ZsdXNoKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0pIC0+CisgIHtTdGF0ZSwgZmlsZTpzeW5jKERldmljZSl9LgorCisKK2Nsb3NlKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIHNob3VsZF9jbG9zZSA9IFNDfSkgLT4KKyAgY2FzZSBTQyBvZgorICAgIHRydWUgLT4ge1N0YXRlLCBmaWxlOmNsb3NlKERldmljZSl9OworICAgIGZhbHNlIC0+IHtTdGF0ZSwgb2t9CisgIGVuZC4KKworCislJSBsZWdhY3kgYXBpLiBsZWZ0IGZvciBjb21wYXRpYmlsaXR5CituZXdfcmVhZGVyKEZpbGVuYW1lKSAtPgorICBjYXNlIGZpbGU6b3BlbihGaWxlbmFtZSwgW3JlYWQsIGJpbmFyeSwge3JlYWRfYWhlYWQsIDEwMjQqMTAyNH1dKSBvZgorICAgIHtvaywgSU9EZXZpY2V9IC0+IG5ldyhJT0RldmljZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9LCB7bW9kZSwgcmVhZH1dKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybAppbmRleCAyYzU1MzFhLi45YTVkNmFmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0yMSw5MSArMjEsMTA2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLSUlIEFQSQorJSUgY29uc3RydWN0b3IKIC1leHBvcnQoW25ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChmcmFtZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyLCAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLS10eXBlIHN0YXRlKCkgOjogI2ZyYW1lZF90cmFuc3BvcnR7fS4KKy1yZWNvcmQodF9mcmFtZWQsIHsKKyAgd3JhcHBlZCwKKyAgcmVhZF9idWZmZXIsCisgIHdyaXRlX2J1ZmZlcgorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfZnJhbWVke30uCisKKworLXNwZWMgbmV3KFRyYW5zcG9ydDo6dGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhXcmFwcGVkKSAtPgorICBTdGF0ZSA9ICN0X2ZyYW1lZHsKKyAgICB3cmFwcGVkID0gV3JhcHBlZCwKKyAgICByZWFkX2J1ZmZlciA9IFtdLAorICAgIHdyaXRlX2J1ZmZlciA9IFtdCisgIH0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCiAtaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKLW5ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgotICAgIFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119LAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9LCBEYXRhKSAtPgotICAgIHtTdGF0ZSNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFtXQnVmLCBEYXRhXX0sIG9rfS4KK3JlYWQoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBCaW5hcnkgb2YKKyAgICA8PD4+IHdoZW4gTGVuID4gMCAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgTmV3QmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQmluYXJ5LCBGcmFtZV0pLAorICAgICAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoTmV3QmluYXJ5KSwgTGVuKSwKKyAgICAgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KE5ld0JpbmFyeSwgR2l2ZSksCisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICAgICB7TmV3U3RhdGUsIEVycm9yfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBFcnJvcn0KKyAgICAgIGVuZDsKKyAgICAlJSByZWFkIG9mIHplcm8gYnl0ZXMKKyAgICA8PD4+IC0+IHtTdGF0ZSwge29rLCA8PD4+fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgbm9uZW1wdHkKKyAgICBfIC0+CisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19CisgIGVuZC4KIAotJSUgRmx1c2hlcyB0aGUgYnVmZmVyIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1mbHVzaChTdGF0ZTAgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAgRnJhbWVMZW4gPSBpb2xpc3Rfc2l6ZShCdWZmZXIpLAotICAgIERhdGEgICAgID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCiAKLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIERhdGEpLAorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZCwgcmVhZF9idWZmZXIgPSBCdWZmZXJ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWZmZXIpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICAlJSByZWFkIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgWCB3aGVuIFggPj0gTGVuIC0+CisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgTGVuKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHtyZWFkX2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgJSUgcmVhZCBidWZmZXIgaXMgaW5zdWZmaWNpZW50IGZvciByZXF1ZXN0ZWQgcmVhZCBzaXplCisgICAgXyAtPgorICAgICAgY2FzZSBuZXh0X2ZyYW1lKFdyYXBwZWQpIG9mCisgICAgICAgIHtOZXdTdGF0ZSwge29rLCBGcmFtZX19IC0+CisgICAgICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAgICAgIFN0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZSwgcmVhZF9idWZmZXIgPSBbQnVmZmVyLCBGcmFtZV19LAorICAgICAgICAgICAgTGVuCisgICAgICAgICAgKTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQKKyAgZW5kLgogCi0gICAge1dyYXBwZWQyLCBffSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZDEpLAorbmV4dF9mcmFtZShUcmFuc3BvcnQpIC0+CisgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFRyYW5zcG9ydCwgNCkgb2YKKyAgICB7TmV3U3RhdGUsIHtvaywgPDxGcmFtZUxlbmd0aDozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+Pn19IC0+CisgICAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTmV3U3RhdGUsIEZyYW1lTGVuZ3RoKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCiAKLSAgICBTdGF0ZTEgPSBTdGF0ZTAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDIsIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB7U3RhdGUxLCBSZXNwb25zZX0uCiAKLSUlIENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWNsb3NlKFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQwKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxfSwKLSAgICB7TmV3U3RhdGUsIFJlc3VsdH0uCit3cml0ZShTdGF0ZSA9ICN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBCdWZmZXJ9LCBEYXRhKSAtPgorICB7U3RhdGUjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gW0J1ZmZlciwgRGF0YV19LCBva30uCiAKLSUlIFJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotcmVhZChTdGF0ZTAgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDAsIHJlYWRfYnVmZmVyID0gUkJ1Zn0sCi0gICAgIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICB7V3JhcHBlZDEsIHtSQnVmMSwgUkJ1ZjFTaXplfX0gPQotICAgICAgICAlJSBpZiB0aGUgcmVhZCBidWZmZXIgaXMgZW1wdHksIHJlYWQgYW5vdGhlciBmcmFtZQotICAgICAgICAlJSBvdGhlcndpc2UsIGp1c3QgcmVhZCBmcm9tIHdoYXQncyBsZWZ0IGluIHRoZSBidWZmZXIKLSAgICAgICAgY2FzZSBpb2xpc3Rfc2l6ZShSQnVmKSBvZgotICAgICAgICAgICAgMCAtPgotICAgICAgICAgICAgICAgICUlIHJlYWQgdGhlIGZyYW1lIGxlbmd0aAotICAgICAgICAgICAgICAgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCA0KSBvZgotICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwKLSAgICAgICAgICAgICAgICAgICAge29rLCA8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn19IC0+Ci0gICAgICAgICAgICAgICAgICAgICUlIHRoZW4gcmVhZCB0aGUgZGF0YQotICAgICAgICAgICAgICAgICAgICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkUzEsIEZyYW1lTGVuKSBvZgotICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtvaywgQmlufX0gLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtCaW4sIGVybGFuZzpieXRlX3NpemUoQmluKX19OwotICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtlcnJvciwgUmVhc29uMX19IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7ZXJyb3IsIFJlYXNvbjF9fQotICAgICAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLCB7ZXJyb3IsIFJlYXNvbjJ9fSAtPgotICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLCB7ZXJyb3IsIFJlYXNvbjJ9fQotICAgICAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICAgIFN6IC0+Ci0gICAgICAgICAgICAgICAge1dyYXBwZWQwLCB7UkJ1ZiwgU3p9fQotICAgICAgICBlbmQsCiAKLSAgICAlJSBwdWxsIG9mZiBHaXZlIGJ5dGVzLCByZXR1cm4gdGhlbSB0byB0aGUgdXNlciwgbGVhdmUgdGhlIHJlc3QgaW4gdGhlIGJ1ZmZlcgotICAgIGNhc2UgUkJ1ZjEgb2YKLSAgICAgIGVycm9yIC0+Ci0gICAgICAgIHsgU3RhdGUwI2ZyYW1lZF90cmFuc3BvcnQge3dyYXBwZWQgPSBXcmFwcGVkMSwgcmVhZF9idWZmZXIgPSBbXSB9LAotICAgICAgICAgIHtSQnVmMSwgUkJ1ZjFTaXplfSB9OwotICAgICAgXyAtPgotICAgICAgICBHaXZlID0gbWluKFJCdWYxU2l6ZSwgTGVuKSwKLSAgICAgICAgPDxEYXRhOkdpdmUvYmluYXJ5LCBSQnVmMi9iaW5hcnk+PiA9IGlvbGlzdF90b19iaW5hcnkoUkJ1ZjEpLAorZmx1c2goU3RhdGUgPSAjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyLCB3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgRnJhbWVMZW4gLT4KKyAgICAgIERhdGEgPSBbPDxGcmFtZUxlbjozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+PiwgQnVmZmVyXSwKKyAgICAgIHtXcml0dGVuLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIERhdGEpLAorICAgICAge0ZsdXNoZWQsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JpdHRlbiksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KIAotICAgICAgICB7IFN0YXRlMCNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMSwgcmVhZF9idWZmZXI9UkJ1ZjJ9LAotICAgICAgICAgIHtvaywgRGF0YX0gfQotICAgIGVuZC4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW1pbihBLEIpIHdoZW4gQTxCIC0+IEE7Ci1taW4oXyxCKSAgICAgICAgICAtPiBCLgorY2xvc2UoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICB7Q2xvc2VkLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKKyAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgogCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfaHR0cF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LmVybAppbmRleCA3ZDAyMjZmLi40NmJjZWRlIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfaHR0cF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9odHRwX3RyYW5zcG9ydC5lcmwKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgIHtTdGF0ZSwgb2t9OwogICAgICAgICBXQmluYXJ5IC0+CiAgICAgICAgICAgICB7b2ssIHt7X1ZlcnNpb24sIDIwMCwgX1JlYXNvblBocmFzZX0sIF9IZWFkZXJzLCBCb2R5fX0gPQotICAgICAgICAgICAgICBodHRwOnJlcXVlc3QocG9zdCwKKyAgICAgICAgICAgICAgaHR0cGM6cmVxdWVzdChwb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJodHRwOi8vIiArKyBIb3N0ICsrIFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3siVXNlci1BZ2VudCIsICJFcmxhbmcvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0In0gfCBFeHRyYUhlYWRlcnNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXRocmlmdCIsCkBAIC0xMTQsNiArMTE0LDMgQEAKICAgICAgICAgXyAtPgogICAgICAgICAgICAge1N0YXRlLCB7ZXJyb3IsICdFT0YnfX0KICAgICBlbmQuCi0KLW1pbihBLEIpIHdoZW4gQTxCIC0+IEE7Ci1taW4oXyxCKSAgICAgICAgICAtPiBCLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcGFyc2VyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0N2YxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKQEAgLTAsMCArMSw0MTkgQEAKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSBUaGUganNvbiBwYXJzZXIgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIGFsaXNkYWlyIHN1bGxpdmFuIDxhbGlzZGFpckBoYXJ0YnJha2UuY29tPiBiYXNlZCBvbgorJSUgdGhlIGpzeCBqc29uIGxpYnJhcnkKKworLW1vZHVsZSh0aHJpZnRfanNvbl9wYXJzZXIpLgorLWV4cG9ydChbcGFyc2VyLzAsIGhhbmRsZV9ldmVudC8yXSkuCisKKworLXJlY29yZChjb25maWcsIHtzdHJpY3RfdXRmOCA9IGZhbHNlIDo6IGJvb2xlYW4oKX0pLgorCisKK3BhcnNlcigpIC0+IGZ1bihKU09OKSAtPiBzdGFydChKU09OLCB7P01PRFVMRSwgW119LCBbXSwgI2NvbmZpZ3t9KSBlbmQuCisKKworaGFuZGxlX2V2ZW50KEV2ZW50LCB7SGFuZGxlciwgU3RhdGV9LCBfQ29uZmlnKSAtPiB7SGFuZGxlciwgSGFuZGxlcjpoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKX0uCisKK2hhbmRsZV9ldmVudChlbmRfanNvbiwgU3RhdGUpIC0+IGxpc3RzOnJldmVyc2UoW2VuZF9qc29uXSArKyBTdGF0ZSk7CitoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKSAtPiBbRXZlbnRdICsrIFN0YXRlLgorCisKKyUlIHdoaXRlc3BhY2UKKy1kZWZpbmUoc3BhY2UsIDE2IzIwKS4KKy1kZWZpbmUodGFiLCAxNiMwOSkuCistZGVmaW5lKGNyLCAxNiMwRCkuCistZGVmaW5lKG5ld2xpbmUsIDE2IzBBKS4KKworJSUgb2JqZWN0IGRlbGltaXRlcnMKKy1kZWZpbmUoc3RhcnRfb2JqZWN0LCAxNiM3QikuCistZGVmaW5lKGVuZF9vYmplY3QsIDE2IzdEKS4KKworJSUgYXJyYXkgZGVsaW1pdGVycworLWRlZmluZShzdGFydF9hcnJheSwgMTYjNUIpLgorLWRlZmluZShlbmRfYXJyYXksIDE2IzVEKS4KKworJSUga3Ygc2VwZXJhdG9yCistZGVmaW5lKGNvbW1hLCAxNiMyQykuCistZGVmaW5lKGRvdWJsZXF1b3RlLCAxNiMyMikuCistZGVmaW5lKHNpbmdsZXF1b3RlLCAxNiMyNykuCistZGVmaW5lKGNvbG9uLCAxNiMzQSkuCisKKyUlIHN0cmluZyBlc2NhcGUgc2VxdWVuY2VzCistZGVmaW5lKHJzb2xpZHVzLCAxNiM1QykuCistZGVmaW5lKHNvbGlkdXMsIDE2IzJGKS4KKworJSUgbWF0aAorLWRlZmluZSh6ZXJvLCAxNiMzMCkuCistZGVmaW5lKGRlY2ltYWxwb2ludCwgMTYjMkUpLgorLWRlZmluZShuZWdhdGl2ZSwgMTYjMkQpLgorLWRlZmluZShwb3NpdGl2ZSwgMTYjMkIpLgorCislJSBjb21tZW50cworLWRlZmluZShzdGFyLCAxNiMyQSkuCisKKworJSUgc29tZSB1c2VmdWwgZ3VhcmRzCistZGVmaW5lKGlzX2hleChTeW1ib2wpLAorICAgIChTeW1ib2wgPj0gJGEgYW5kYWxzbyBTeW1ib2wgPTwgJGYpIG9yZWxzZQorICAgIChTeW1ib2wgPj0gJEEgYW5kYWxzbyBTeW1ib2wgPTwgJEYpIG9yZWxzZQorICAgIChTeW1ib2wgPj0gJDAgYW5kYWxzbyBTeW1ib2wgPTwgJDkpCispLgorCistZGVmaW5lKGlzX25vbnplcm8oU3ltYm9sKSwKKyAgICBTeW1ib2wgPj0gJDEgYW5kYWxzbyBTeW1ib2wgPTwgJDkKKykuCisKKy1kZWZpbmUoaXNfd2hpdGVzcGFjZShTeW1ib2wpLAorICAgIFN5bWJvbCA9Oj0gP3NwYWNlOyBTeW1ib2wgPTo9ID90YWI7IFN5bWJvbCA9Oj0gP2NyOyBTeW1ib2wgPTo9ID9uZXdsaW5lCispLgorCisKKyUlIGxpc3RzIGFyZSBiZW5jaG1hcmtlZCB0byBiZSBmYXN0ZXIgKHRobyBoaWdoZXIgaW4gbWVtb3J5IHVzYWdlKSB0aGFuIGJpbmFyaWVzCituZXdfc2VxKCkgLT4gW10uCituZXdfc2VxKEMpIC0+IFtDXS4KKworYWNjX3NlcShTZXEsIEMpIHdoZW4gaXNfbGlzdChDKSAtPiBsaXN0czpyZXZlcnNlKEMpICsrIFNlcTsKK2FjY19zZXEoU2VxLCBDKSAtPiBbQ10gKysgU2VxLgorCitlbmRfc2VxKFNlcSkgLT4gdW5pY29kZTpjaGFyYWN0ZXJzX3RvX2JpbmFyeShsaXN0czpyZXZlcnNlKFNlcSkpLgorCitlbmRfc2VxKFNlcSwgXykgLT4gZW5kX3NlcShTZXEpLgorCisKK3N0YXJ0KDw8MTYjZWYsIDE2I2JiLCAxNiNiZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3N0YXJ0KEJpbiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpLgorCisKK3ZhbHVlKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB0cnVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmYWxzZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8JG4sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbnVsbChSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P25lZ2F0aXZlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG5lZ2F0aXZlKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoJC0pLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P3plcm8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgemVybyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCQwKSwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoUyksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDw/c3RhcnRfb2JqZWN0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG9iamVjdChSZXN0LCBoYW5kbGVfZXZlbnQoc3RhcnRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBba2V5fFN0YWNrXSwgQ29uZmlnKTsKK3ZhbHVlKDw8P3N0YXJ0X2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGFycmF5KFJlc3QsIGhhbmRsZV9ldmVudChzdGFydF9hcnJheSwgSGFuZGxlciwgQ29uZmlnKSwgW2FycmF5fFN0YWNrXSwgQ29uZmlnKTsKK3ZhbHVlKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIHZhbHVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitvYmplY3QoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoPDw/ZW5kX29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK29iamVjdCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBvYmplY3QoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCithcnJheSg8PD9lbmRfYXJyYXksIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFthcnJheXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfYXJyYXksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworYXJyYXkoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgYXJyYXkoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CithcnJheShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdmFsdWUoQmluLCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKS4KKworCitjb2xvbig8PD9jb2xvbiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBbb2JqZWN0fFN0YWNrXSwgQ29uZmlnKTsKK2NvbG9uKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGNvbG9uKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworY29sb24oX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitrZXkoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7CitrZXkoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAga2V5KFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwora2V5KF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworJSUgbm90ZSB0aGF0IGlmIHlvdSBlbmNvdW50ZXIgYW4gZXJyb3IgZnJvbSBzdHJpbmcgYW5kIHlvdSBjYW4ndCBmaW5kIHRoZSBjbGF1c2UgdGhhdAorJSUgIGNhdXNlZCBpdCBoZXJlLCBpdCBtaWdodCBiZSBpbiB1bmVzY2FwZSBiZWxvdworc3RyaW5nKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PD9zb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCA/c29saWR1cyksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8P3Jzb2xpZHVzL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICB1bmVzY2FwZShSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMyMCwgWCA8IDE2IzIwMjggLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPT0gMTYjMjAyODsgWCA9PSAxNiMyMDI5IC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID4gMTYjMjAyOSwgWCA8IDE2I2Q4MDAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPiAxNiNkZmZmLCBYIDwgMTYjZmRkMCAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+IDE2I2ZkZWYsIFggPCAxNiNmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzEwMDAwLCBYIDwgMTYjMWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMjAwMDAsIFggPCAxNiMyZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMzMDAwMCwgWCA8IDE2IzNmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzQwMDAwLCBYIDwgMTYjNGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjNTAwMDAsIFggPCAxNiM1ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM2MDAwMCwgWCA8IDE2IzZmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzcwMDAwLCBYIDwgMTYjN2ZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjODAwMDAsIFggPCAxNiM4ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM5MDAwMCwgWCA8IDE2IzlmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2EwMDAwLCBYIDwgMTYjYWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjYjAwMDAsIFggPCAxNiNiZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNjMDAwMCwgWCA8IDE2I2NmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2QwMDAwLCBYIDwgMTYjZGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjZTAwMDAsIFggPCAxNiNlZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNmMDAwMCwgWCA8IDE2I2ZmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzEwMDAwMCwgWCA8IDE2IzEwZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworJSUgc3Vycm9nYXRlcworc3RyaW5nKDw8MjM3LCBYLCBfLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAxNjAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIHUreGZmZmUsIHUreGZmZmYsIGNvbnRyb2wgY29kZXMgYW5kIG90aGVyIG5vbmNoYXJhY3RlcnMKK3N0cmluZyg8PF8vdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworJSUgdStmZmZlIGFuZCB1K2ZmZmYgZm9yIFIxNEJYWCAoc3Vic2VxdWVudCBydW50aW1lcyB3aWxsIGhhcHBpbHkgbWF0Y2ggdGhlCislJSAgcHJlY2VkaW5nIGNsYXVzZQorc3RyaW5nKDw8MjM5LCAxOTEsIFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID09IDE5MDsgWCA9PSAxOTEgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIG92ZXJsb25nIGVuY29kaW5ncyBhbmQgbWlzc2luZyBjb250aW51YXRpb25zIG9mIGEgMiBieXRlIHNlcXVlbmNlCitzdHJpbmcoPDxYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAxOTIsIFggPTwgMjIzIC0+CisgICAgc3RyaXBfY29udGludWF0aW9ucyhSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIDEpOworJSUgb3ZlcmxvbmcgZW5jb2RpbmdzIGFuZCBtaXNzaW5nIGNvbnRpbnVhdGlvbnMgb2YgYSAzIGJ5dGUgc2VxdWVuY2UKK3N0cmluZyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID49IDIyNCwgWCA9PCAyMzkgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgMik7CislJSBvdmVybG9uZyBlbmNvZGluZ3MgYW5kIG1pc3NpbmcgY29udGludWF0aW9ucyBvZiBhIDQgYnl0ZSBzZXF1ZW5jZQorc3RyaW5nKDw8WCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPj0gMjQwLCBYID08IDI0NyAtPgorICAgIHN0cmlwX2NvbnRpbnVhdGlvbnMoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAzKTsKKyUlIGluY29tcGxldGVzIGFuZCB1bmV4cGVjdGVkIGJ5dGVzLCBpbmNsdWRpbmcgb3JwaGFuIGNvbnRpbnVhdGlvbnMKK3N0cmluZyg8PF8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyhfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkb3VibGVxdW90ZShSZXN0LCBIYW5kbGVyLCBBY2MsIFtrZXl8X10gPSBTdGFjaywgQ29uZmlnKSAtPgorICAgIGNvbG9uKFJlc3QsIGhhbmRsZV9ldmVudCh7a2V5LCBlbmRfc2VxKEFjYywgQ29uZmlnKX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtzdHJpbmcsIGVuZF9zZXEoQWNjLCBDb25maWcpfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZykuCisKKworJSUgc3RyaXBzIGNvbnRpbnVhdGlvbiBieXRlcyBhZnRlciBiYWQgdXRmIGJ5dGVzLCBndWFyZHMgYWdhaW5zdCBib3RoIHRvbyBzaG9ydAorJSUgIGFuZCBvdmVybG9uZyBzZXF1ZW5jZXMuIE4gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0cmlwCitzdHJpcF9jb250aW51YXRpb25zKDw8UmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAwKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworc3RyaXBfY29udGludWF0aW9ucyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgTikgd2hlbiBYID49IDEyOCwgWCA9PCAxOTEgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgTiAtIDEpOworJSUgbm90IGEgY29udGludWF0aW9uIGJ5dGUsIGluc2VydCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBmb3Igc2VxdWVuY2UgdGh1cworJSUgIGZhciBhbmQgZGlzcGF0Y2ggYmFjayB0byBzdHJpbmcKK3N0cmlwX2NvbnRpbnVhdGlvbnMoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIF8pIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZykuCisKKworJSUgdGhpcyBhbGwgZ2V0cyByZWFsbHkgZ3Jvc3MgYW5kIHNob3VsZCBwcm9iYWJseSBldmVudHVhbGx5IGJlIGZvbGRlZCBpbnRvCislJSAgYnV0IGZvciBub3cgaXQgZmFrZXMgYmVpbmcgcGFydCBvZiBzdHJpbmcgb24gaW5jb21wbGV0ZXMgYW5kIGVycm9ycwordW5lc2NhcGUoPDwkYiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxiKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCRmLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXGYpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JG4sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcbiksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkciwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxyKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXHQpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXCIpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P3Jzb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXFwpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P3NvbGlkdXMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICQvKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCAkZCwgQSwgQiwgQywgP3Jzb2xpZHVzLCAkdSwgJGQsIFgsIFksIFosIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiAoQSA9PSAkOCBvcmVsc2UgQSA9PSAkOSBvcmVsc2UgQSA9PSAkYSBvcmVsc2UgQSA9PSAkYiksCisgICAgICAgICAgICAgKFggPT0gJGMgb3JlbHNlIFggPT0gJGQgb3JlbHNlIFggPT0gJGUgb3JlbHNlIFggPT0gJGYpLAorICAgICAgICAgICAgID9pc19oZXgoQiksID9pc19oZXgoQyksID9pc19oZXgoWSksID9pc19oZXgoWikKKyAgICAgICAgLT4KKyAgICBIaWdoID0gZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbJGQsIEEsIEIsIENdLCAxNiksCisgICAgTG93ID0gZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbJGQsIFgsIFksIFpdLCAxNiksCisgICAgQ29kZXBvaW50ID0gKEhpZ2ggLSAxNiNkODAwKSAqIDE2IzQwMCArIChMb3cgLSAxNiNkYzAwKSArIDE2IzEwMDAwLAorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgQ29kZXBvaW50KSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCAkZCwgQSwgQiwgQywgP3Jzb2xpZHVzLCAkdSwgVywgWCwgWSwgWiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKQorICAgICAgICB3aGVuIChBID09ICQ4IG9yZWxzZSBBID09ICQ5IG9yZWxzZSBBID09ICRhIG9yZWxzZSBBID09ICRiKSwKKyAgICAgICAgICAgICA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KFcpLCA/aXNfaGV4KFgpLCA/aXNfaGV4KFkpLCA/aXNfaGV4KFopCisgICAgICAgIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBbMTYjZmZmZCwgMTYjZmZmZF0pLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHUsIEEsIEIsIEMsIEQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiA/aXNfaGV4KEEpLCA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KEQpIC0+CisgICAgY2FzZSBlcmxhbmc6bGlzdF90b19pbnRlZ2VyKFtBLCBCLCBDLCBEXSwgMTYpIG9mCisgICAgICAgIENvZGVwb2ludCB3aGVuIENvZGVwb2ludCA8IDE2I2Q4MDA7IENvZGVwb2ludCA+IDE2I2RmZmYgLT4KKyAgICAgICAgICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgQ29kZXBvaW50KSwgU3RhY2ssIENvbmZpZyk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpCisgICAgZW5kOwordW5lc2NhcGUoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCislJSBsaWtlIGluIHN0cmluZ3MsIHRoZXJlJ3Mgc29tZSBwc2V1ZG8gc3RhdGVzIGluIGhlcmUgdGhhdCB3aWxsIG5ldmVyCislJSAgc2hvdyB1cCBpbiBlcnJvcnMgb3IgaW5jb21wbGV0ZXMuIHNvbWUgc2hvdyB1cCBpbiB2YWx1ZSwgc29tZSBzaG93CislJSAgdXAgaW4gaW50ZWdlciwgZGVjaW1hbCBvciBleHAKK25lZ2F0aXZlKDw8JDAsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICB6ZXJvKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkMCksIFN0YWNrLCBDb25maWcpOworbmVnYXRpdmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CituZWdhdGl2ZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK3plcm8oPDw/ZGVjaW1hbHBvaW50LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP2RlY2ltYWxwb2ludCksIFN0YWNrLCBDb25maWcpOworemVybyg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAiLjBlIiksIFN0YWNrLCBDb25maWcpOworemVybyhCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge3plcm8sIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2ludGVnZXIoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgaW50ZWdlcihSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcig8PD9kZWNpbWFscG9pbnQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBpbml0aWFsZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP2RlY2ltYWxwb2ludCksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcig8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAiLjBlIiksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcihCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge2ludGVnZXIsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2luaXRpYWxkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGRlY2ltYWwoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2luaXRpYWxkZWNpbWFsKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZGVjaW1hbCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBkZWNpbWFsKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ICRlOyBTID06PSAkRSAtPgorICAgIGUoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRlKSwgU3RhY2ssIENvbmZpZyk7CitkZWNpbWFsKEJpbiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZpbmlzaF9udW1iZXIoQmluLCBIYW5kbGVyLCB7ZGVjaW1hbCwgQWNjfSwgU3RhY2ssIENvbmZpZykuCisKKworZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBleHAoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2UoPDxTaWduLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gU2lnbiA9Oj0gP3Bvc2l0aXZlOyBTaWduID06PSA/bmVnYXRpdmUgLT4KKyAgICBleChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgU2lnbiksIFN0YWNrLCBDb25maWcpOworZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2V4KDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGV4cChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworZXgoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitleHAoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZXhwKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitleHAoQmluLCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmluaXNoX251bWJlcihCaW4sIEhhbmRsZXIsIHtleHAsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2ZpbmlzaF9udW1iZXIoUmVzdCwgSGFuZGxlciwgQWNjLCBbXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGZvcm1hdF9udW1iZXIoQWNjKSwgSGFuZGxlciwgQ29uZmlnKSwgW10sIENvbmZpZyk7CitmaW5pc2hfbnVtYmVyKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChmb3JtYXRfbnVtYmVyKEFjYyksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpLgorCisKK2Zvcm1hdF9udW1iZXIoe3plcm8sIEFjY30pIC0+IHtpbnRlZ2VyLCBsaXN0X3RvX2ludGVnZXIobGlzdHM6cmV2ZXJzZShBY2MpKX07Citmb3JtYXRfbnVtYmVyKHtpbnRlZ2VyLCBBY2N9KSAtPiB7aW50ZWdlciwgbGlzdF90b19pbnRlZ2VyKGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7ZGVjaW1hbCwgQWNjfSkgLT4ge2Zsb2F0LCBsaXN0X3RvX2Zsb2F0KGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7ZXhwLCBBY2N9KSAtPiB7ZmxvYXQsIGxpc3RfdG9fZmxvYXQobGlzdHM6cmV2ZXJzZShBY2MpKX0uCisKKwordHJ1ZSg8PCRyLCAkdSwgJGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoe2xpdGVyYWwsIHRydWV9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK3RydWUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitmYWxzZSg8PCRhLCAkbCwgJHMsICRlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtsaXRlcmFsLCBmYWxzZX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworZmFsc2UoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitudWxsKDw8JHUsICRsLCAkbCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudCh7bGl0ZXJhbCwgbnVsbH0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworbnVsbChfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK21heWJlX2RvbmUoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbXSwgQ29uZmlnKSAtPgorICAgIGRvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9qc29uLCBIYW5kbGVyLCBDb25maWcpLCBbXSwgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/ZW5kX29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW29iamVjdHxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/ZW5kX2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbYXJyYXl8U3RhY2tdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX2FycmF5LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/Y29tbWEsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtvYmplY3R8U3RhY2tdLCBDb25maWcpIC0+CisgICAga2V5KFJlc3QsIEhhbmRsZXIsIFtrZXl8U3RhY2tdLCBDb25maWcpOworbWF5YmVfZG9uZSg8PD9jb21tYSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2FycmF5fF9dID0gU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkb25lKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW10sIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGRvbmUoUmVzdCwgSGFuZGxlciwgW10sIENvbmZpZyk7Citkb25lKDw8Pj4sIHtfSGFuZGxlciwgU3RhdGV9LCBbXSwgX0NvbmZpZykgLT4gU3RhdGU7Citkb25lKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+IGVybGFuZzplcnJvcihiYWRhcmcpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjNkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSw1NjcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIFBldGVyIE5ldW1hcmsgPG5ldW1hcmsucGV0ZXJAZ21haWwuY29tPiBiYXNlZCBvbgorJSUgdGhlIGJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKworLW1vZHVsZSh0aHJpZnRfanNvbl9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistZXhwb3J0KFtuZXcvMSwgbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMSwKKyAgICAgICAgIG5ld19wcm90b2NvbF9mYWN0b3J5LzIKKyAgICAgICAgXSkuCisKKy1yZWNvcmQoanNvbl9jb250ZXh0LCB7CisgICAgJSB0aGUgdHlwZSBvZiBqc29uX2NvbnRleHQ6IGFycmF5IG9yIG9iamVjdAorICAgIHR5cGUsCisgICAgJSBmaWVsZHMgcmVhZCBvciB3cml0dGVuCisgICAgZmllbGRzX3Byb2Nlc3NlZCA9IDAKK30pLgorCistcmVjb3JkKGpzb25fcHJvdG9jb2wsIHsKKyAgICB0cmFuc3BvcnQsCisgICAgY29udGV4dF9zdGFjayA9IFtdLAorICAgIGpzeAorfSkuCistdHlwZSBzdGF0ZSgpIDo6ICNqc29uX3Byb3RvY29se30uCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWRlZmluZShWRVJTSU9OXzEsIDEpLgorLWRlZmluZShKU09OX0RPVUJMRV9QUkVDSVNJT04sIDE2KS4KKwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0JPT0wpIC0+ICJ0ZiI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfQllURSkgLT4gImk4IjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9ET1VCTEUpIC0+ICJkYmwiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0k4KSAtPiAiaTgiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0kxNikgLT4gImkxNiI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfSTMyKSAtPiAiaTMyIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9JNjQpIC0+ICJpNjQiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX1NUUklORykgLT4gInN0ciI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfU1RSVUNUKSAtPiAicmVjIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9NQVApIC0+ICJtYXAiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX1NFVCkgLT4gInNldCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfTElTVCkgLT4gImxzdCIuCisKK2pzb25fdG9fdHlwZWlkKCJ0ZiIpIC0+ID90VHlwZV9CT09MOworanNvbl90b190eXBlaWQoImRibCIpIC0+ID90VHlwZV9ET1VCTEU7Citqc29uX3RvX3R5cGVpZCgiaTgiKSAtPiA/dFR5cGVfSTg7Citqc29uX3RvX3R5cGVpZCgiaTE2IikgLT4gP3RUeXBlX0kxNjsKK2pzb25fdG9fdHlwZWlkKCJpMzIiKSAtPiA/dFR5cGVfSTMyOworanNvbl90b190eXBlaWQoImk2NCIpIC0+ID90VHlwZV9JNjQ7Citqc29uX3RvX3R5cGVpZCgic3RyIikgLT4gP3RUeXBlX1NUUklORzsKK2pzb25fdG9fdHlwZWlkKCJyZWMiKSAtPiA/dFR5cGVfU1RSVUNUOworanNvbl90b190eXBlaWQoIm1hcCIpIC0+ID90VHlwZV9NQVA7Citqc29uX3RvX3R5cGVpZCgic2V0IikgLT4gP3RUeXBlX1NFVDsKK2pzb25fdG9fdHlwZWlkKCJsc3QiKSAtPiA/dFR5cGVfTElTVC4KKworc3RhcnRfY29udGV4dChvYmplY3QpIC0+ICJ7IjsKK3N0YXJ0X2NvbnRleHQoYXJyYXkpIC0+ICJbIi4KKworZW5kX2NvbnRleHQob2JqZWN0KSAtPiAifSI7CitlbmRfY29udGV4dChhcnJheSkgLT4gIl0iLgorCisKK25ldyhUcmFuc3BvcnQpIC0+CisgICAgbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMgPSBbXSkuCisKK25ldyhUcmFuc3BvcnQsIF9PcHRpb25zKSAtPgorICAgIFN0YXRlICA9ICNqc29uX3Byb3RvY29se3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0sCisgICAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChUaGlzID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLAorICAgIHtUaGlzI2pzb25fcHJvdG9jb2x7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnQsCisgICAgICAgICAgICBjb250ZXh0X3N0YWNrID0gW10KKyAgICAgICAgfSwgUmVzdWx0fS4KKworY2xvc2VfdHJhbnNwb3J0KFRoaXMgPSAjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydCwKKyAgICAgICAgICAgIGNvbnRleHRfc3RhY2sgPSBbXSwKKyAgICAgICAgICAgIGpzeCA9IHVuZGVmaW5lZAorICAgICAgICB9LCBSZXN1bHR9LgorCislJSUKKyUlJSBpbnN0YW5jZSBtZXRob2RzCislJSUKKyUgcGxhY2VzIGEgbmV3IGNvbnRleHQgb24gdGhlIHN0YWNrOgord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFN0YWNrfSA9IFN0YXRlMCwge2VudGVyX2NvbnRleHQsIFR5cGV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IHdyaXRlX3ZhbHVlcyhTdGF0ZTAsIFt7Y29udGV4dF9wcmVfaXRlbSwgZmFsc2V9XSksCisgICAgU3RhdGUyID0gU3RhdGUxI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFsKKyAgICAgICAgI2pzb25fY29udGV4dHt0eXBlPVR5cGV9fFN0YWNrXX0sCisgICAgd3JpdGVfdmFsdWVzKFN0YXRlMiwgIFtsaXN0X3RvX2JpbmFyeShzdGFydF9jb250ZXh0KFR5cGUpKV0pOworCislIHJlbW92ZXMgdGhlIHRvcG1vc3QgY29udGV4dCBmcm9tIHN0YWNrICAgIAord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDdXJyQ3R4dHxTdGFja119ID0gU3RhdGUwLCB7ZXhpdF9jb250ZXh0fSkgLT4KKyAgICBUeXBlID0gQ3VyckN0eHQjanNvbl9jb250ZXh0LnR5cGUsCisgICAgU3RhdGUxID0gU3RhdGUwI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFN0YWNrfSwKKyAgICB3cml0ZV92YWx1ZXMoU3RhdGUxLCBbCisgICAgICAgICAgICBsaXN0X3RvX2JpbmFyeShlbmRfY29udGV4dChUeXBlKSksCisgICAgICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIGZhbHNlfQorICAgICAgICBdKTsKKworJSB3cml0ZXMgbmVjZXNzYXJ5IHByZWx1ZGUgdG8gZmllbGQgb3IgY29udGFpbmVyIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHQgICAKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wcmVfaXRlbSwgX30pIC0+IHtUaGlzMCwgb2t9Oword3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDb250ZXh0fF9DdHh0VGFpbF19ID0gVGhpczAsCisgICAge2NvbnRleHRfcHJlX2l0ZW0sIE1heU5lZWRRdW90ZXN9KSAtPgorICAgIEZpZWxkTm8gPSBDb250ZXh0I2pzb25fY29udGV4dC5maWVsZHNfcHJvY2Vzc2VkLAorICAgIEN0eHRUeXBlID0gQ29udGV4dCNqc29uX2NvbnRleHQudHlwZSwKKyAgICBSZW0gPSBGaWVsZE5vIHJlbSAyLAorICAgIGNhc2Uge0N0eHRUeXBlLCBGaWVsZE5vLCBSZW0sIE1heU5lZWRRdW90ZXN9IG9mCisgICAgICAgIHthcnJheSwgTiwgXywgX30gd2hlbiBOID4gMCAtPiAgJSBhcnJheSBlbGVtZW50IChub3QgZmlyc3QpCisgICAgICAgICAgICB3cml0ZShUaGlzMCwgPDwiLCI+Pik7CisgICAgICAgIHtvYmplY3QsIDAsIF8sIHRydWV9IC0+ICUgbm9uLXN0cmluZyBvYmplY3Qga2V5IChmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCJcIiI+Pik7CisgICAgICAgIHtvYmplY3QsIE4sIDAsIHRydWV9IHdoZW4gTiA+IDAgLT4gJSBub24tc3RyaW5nIG9iamVjdCBrZXkgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsXCIiPj4pOworICAgICAgICB7b2JqZWN0LCBOLCAwLCBmYWxzZX0gd2hlbiBOID4gMC0+ICUgc3RyaW5nIG9iamVjdCBrZXkgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsIj4+KTsKKyAgICAgICAgXyAtPiAlIG5vIHByZS1maWVsZCBuZWNlc3NhcnkKKyAgICAgICAgICAgIHtUaGlzMCwgb2t9CisgICAgZW5kOworCislIHdyaXRlcyBuZWNlc3NhcnkgcG9zdGx1ZGUgdG8gZmllbGQgb3IgY29udGFpbmVyIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHQgICAKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIF99KSAtPiB7VGhpczAsIG9rfTsKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbQ29udGV4dHxDdHh0VGFpbF19ID0gVGhpczAsCisgICAge2NvbnRleHRfcG9zdF9pdGVtLCBNYXlOZWVkUXVvdGVzfSkgLT4KKyAgICBGaWVsZE5vID0gQ29udGV4dCNqc29uX2NvbnRleHQuZmllbGRzX3Byb2Nlc3NlZCwKKyAgICBDdHh0VHlwZSA9IENvbnRleHQjanNvbl9jb250ZXh0LnR5cGUsCisgICAgUmVtID0gRmllbGRObyByZW0gMiwKKyAgICB7VGhpczEsIG9rfSA9IGNhc2Uge0N0eHRUeXBlLCBSZW0sIE1heU5lZWRRdW90ZXN9IG9mCisgICAgICAgIHtvYmplY3QsIDAsIHRydWV9IC0+ICUgbm9uLXN0cmluZyBvYmplY3Qga2V5IAorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IlwiOiI+Pik7CisgICAgICAgIHtvYmplY3QsIDAsIGZhbHNlfSAtPiAlIHN0cmluZyBvYmplY3Qga2V5IAorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IjoiPj4pOworICAgICAgICBfIC0+ICUgbm8gcHJlLWZpZWxkIG5lY2Vzc2FyeQorICAgICAgICAgICAge1RoaXMwLCBva30KKyAgICBlbmQsCisgICAgTmV3Q29udGV4dCA9IENvbnRleHQjanNvbl9jb250ZXh0e2ZpZWxkc19wcm9jZXNzZWQgPSBGaWVsZE5vICsgMX0sCisgICAge1RoaXMxI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjaz1bTmV3Q29udGV4dHxDdHh0VGFpbF19LCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICBuYW1lID0gTmFtZSwKKyAgICB0eXBlID0gVHlwZSwKKyAgICBzZXFpZCA9IFNlcWlkfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge2kzMiwgP1ZFUlNJT05fMX0sCisgICAgICAgIHtzdHJpbmcsIE5hbWV9LAorICAgICAgICB7aTMyLCBUeXBlfSwKKyAgICAgICAge2kzMiwgU2VxaWR9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiAgCisgICAgd3JpdGVfdmFsdWVzKFRoaXMsIFt7ZXhpdF9jb250ZXh0fV0pOworCislIEV4YW1wbGUgZmllbGQgZXhwcmVzc2lvbjogIjEiOnsiZGJsIjozLjE0fQord3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgICUgZW50ZXJpbmcgJ291dGVyJyBvYmplY3QKKyAgICAgICAge2kxNiwgSWR9LAorICAgICAgICAlIGVudGVyaW5nICdvdXRlcicgb2JqZWN0CisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihUeXBlKX0KKyAgICBdKTsKKword3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4gCisgICAge1RoaXMsIG9rfTsKKword3JpdGUoVGhpcywgZmllbGRfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbe2V4aXRfY29udGV4dH1dKTsKKworJSBFeGFtcGxlIG1lc3NhZ2Ugd2l0aCBtYXA6IFsxLCJ0ZXN0TWFwIiwxLDAseyIxIjp7Im1hcCI6WyJpMzIiLCJpMzIiLDMseyI3Ijo3NywiOCI6ODgsIjkiOjk5fV19fV0KK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAgIGt0eXBlID0gS3R5cGUsCisgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBhcnJheX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKEt0eXBlKX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKFZ0eXBlKX0sCisgICAgICAgIHtpMzIsIFNpemV9LAorICAgICAgICB7ZW50ZXJfY29udGV4dCwgb2JqZWN0fQorICAgIF0pOworCit3cml0ZShUaGlzLCBtYXBfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbCisgICAgICAgIHtleGl0X2NvbnRleHR9LAorICAgICAgICB7ZXhpdF9jb250ZXh0fQorICAgIF0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge3N0cmluZywgdHlwZWlkX3RvX2pzb24oRXR5cGUpfSwKKyAgICAgICAge2kzMiwgU2l6ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywgbGlzdF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKworJSBleGFtcGxlIG1lc3NhZ2Ugd2l0aCBzZXQ6IFsxLCJ0ZXN0U2V0IiwxLDAseyIxIjp7InNldCI6WyJpMzIiLDMsMSwyLDNdfX1dCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICAgIHdyaXRlX3ZhbHVlcyhUaGlzMCwgWworICAgICAgICB7ZW50ZXJfY29udGV4dCwgYXJyYXl9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihFdHlwZSl9LAorICAgICAgICB7aTMyLCBTaXplfQorICAgIF0pOworCit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbCisgICAgICAgIHtleGl0X2NvbnRleHR9CisgICAgXSk7CislIGV4YW1wbGUgbWVzc2FnZSB3aXRoIHN0cnVjdDogWzEsInRlc3RTdHJ1Y3QiLDEsMCx7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX1dCit3cml0ZShUaGlzLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHN0cnVjdF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2Jvb2wsIHRydWV9KSAgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICA8PCJ0cnVlIj4+LAorICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIHRydWV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHtib29sLCBmYWxzZX0pIC0+IHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtjb250ZXh0X3ByZV9pdGVtLCB0cnVlfSwKKyAgICAgICAgPDwiZmFsc2UiPj4sCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2J5dGUsIEJ5dGV9KSAtPiB3cml0ZV92YWx1ZXMoVGhpcywgWworICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgdHJ1ZX0sCisgICAgICAgIGxpc3RfdG9fYmluYXJ5KGludGVnZXJfdG9fbGlzdChCeXRlKSksCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2kxNiwgSTE2fSkgLT4KKyAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgSTE2fSk7CisKK3dyaXRlKFRoaXMsIHtpMzIsIEkzMn0pIC0+CisgICAgd3JpdGUoVGhpcywge2J5dGUsIEkzMn0pOworCit3cml0ZShUaGlzLCB7aTY0LCBJNjR9KSAtPgorICAgIHdyaXRlKFRoaXMsIHtieXRlLCBJNjR9KTsKKword3JpdGUoVGhpcywge2RvdWJsZSwgRG91YmxlfSkgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICBsaXN0X3RvX2JpbmFyeShpb19saWI6Zm9ybWF0KCJ+LipmIiwgWz9KU09OX0RPVUJMRV9QUkVDSVNJT04sRG91YmxlXSkpLAorICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIHRydWV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBTdHJ9KSAtPiB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIGZhbHNlfSwKKyAgICAgICAgY2FzZSBpc19iaW5hcnkoU3RyKSBvZgorICAgICAgICAgICAgdHJ1ZSAtPiBTdHI7CisgICAgICAgICAgICBmYWxzZSAtPiA8PCJcIiIsIChsaXN0X3RvX2JpbmFyeShTdHIpKS9iaW5hcnksICJcIiI+PgorICAgICAgICBlbmQsCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgZmFsc2V9CisgICAgXSk7CisKKyUlIFRPRE86IGJpbmFyeSBmaWVsZHMgc2hvdWxkIGJlIGJhc2U2NCBlbmNvZGVkPworCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnN9LCBEYXRhKSAtPgorICAgICVpbzpmb3JtYXQoIkRhdGEgfnAgQ3R4dCB+cH5ufm4iLCBbRGF0YSwgVGhpcyNqc29uX3Byb3RvY29sLmNvbnRleHRfc3RhY2tdKSwKKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShUcmFucywgRGF0YSksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCit3cml0ZV92YWx1ZXMoVGhpczAsIFZhbHVlTGlzdCkgLT4KKyAgICBGaW5hbFN0YXRlID0gbGlzdHM6Zm9sZGwoCisgICAgICAgIGZ1bihWYWwsIFRoaXNJbikgLT4KKyAgICAgICAgICAgIHtUaGlzT3V0LCBva30gPSB3cml0ZShUaGlzSW4sIFZhbCksCisgICAgICAgICAgICBUaGlzT3V0CisgICAgICAgIGVuZCwKKyAgICAgICAgVGhpczAsCisgICAgICAgIFZhbHVlTGlzdCksCisgICAge0ZpbmFsU3RhdGUsIG9rfS4KKworJSUgSSB3aXNoIHRoZSBlcmxhbmcgdmVyc2lvbiBvZiB0aGUgdHJhbnNwb3J0IGludGVyZmFjZSBpbmNsdWRlZCBhIAorJSUgcmVhZF9hbGwgZnVuY3Rpb24gKGxpa2UgZWcuIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uKS4gU2luY2UgaXQgZG9lc24ndCwKKyUlIGhlcmUncyBteSB2ZXJzaW9uIChldmVuIHRob3VnaCBpdCBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaW4gdGhpcyBmaWxlKS4KKyUlCislJSBUaGUgcmVzdWx0aW5nIGJpbmFyeSBpcyBpbW1lZGlhdGVseSBzZW5kIHRvIHRoZSBKU1ggc3RyZWFtIHBhcnNlci4KKyUlIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZCBhY3R1YWxseSBvcGVyYXRlIG9uIHRoZSBldmVudHMgcmV0dXJuZWQgYnkgSlNYLgorcmVhZF9hbGwoI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0MH0gPSBTdGF0ZSkgLT4KKyAgICB7VHJhbnNwb3J0MSwgQmlufSA9IHJlYWRfYWxsXzEoVHJhbnNwb3J0MCwgW10pLAorICAgIFAgPSB0aHJpZnRfanNvbl9wYXJzZXI6cGFyc2VyKCksCisgICAgW0ZpcnN0fFJlc3RdID0gUChCaW4pLAorICAgIFN0YXRlI2pzb25fcHJvdG9jb2x7CisgICAgICAgIHRyYW5zcG9ydCA9IFRyYW5zcG9ydDEsCisgICAgICAgIGpzeCA9IHtldmVudCwgRmlyc3QsIFJlc3R9CisgICAgfS4KKworcmVhZF9hbGxfMShUcmFuc3BvcnQwLCBJb0xpc3QpIC0+CisgICAge1RyYW5zcG9ydDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnNwb3J0MCwgMSksCisgICAgY2FzZSBSZXN1bHQgb2YKKyAgICAgICAge29rLCA8PD4+fSAtPiAlIG5vdGhpbmcgcmVhZDogYXNzdW1lIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgIHtUcmFuc3BvcnQxLCBpb2xpc3RfdG9fYmluYXJ5KGxpc3RzOnJldmVyc2UoSW9MaXN0KSl9OworICAgICAgICB7b2ssIERhdGF9IC0+ICUgY2hhcmFjdGVyIHN1Y2Nlc3NmdWxseSByZWFkOyByZWFkIG1vcmUKKyAgICAgICAgICAgIHJlYWRfYWxsXzEoVHJhbnNwb3J0MSwgW0RhdGF8SW9MaXN0XSk7CisgICAgICAgIHtlcnJvciwgJ0VPRid9IC0+ICUgd2UncmUgZG9uZQorICAgICAgICAgICAge1RyYW5zcG9ydDEsIGlvbGlzdF90b19iaW5hcnkobGlzdHM6cmV2ZXJzZShJb0xpc3QpKX0KKyAgICBlbmQuCisKKyUgRXhwZWN0IHJlYWRzIGFuIGV2ZW50IGZyb20gdGhlIEpTWCBldmVudCBzdHJlYW0uIEl0IHJlY2VpdmVzIGFuIGV2ZW50IG9yIGRhdGEKKyUgdHlwZSBhcyBpbnB1dC4gQ29tcGFyaW5nIHRoZSByZWFkIGV2ZW50IGZyb20gdGhlIG9uZSBpcyB3YXMgcGFzc2VkLCBpdAorJSByZXR1cm5zIGFuIGVycm9yIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBlbmNvdW50ZXJlZC4KKyUgRXhwZWN0IGFsc28gbWFpbnRhaW5zIHRoZSBjb250ZXh0IHN0YWNrIGluICNqc29uX3Byb3RvY29sLgorZXhwZWN0KCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIHtUeXBlLCBEYXRhfT1FdiwgW05leHR8UmVzdF19fT1TdGF0ZSwgRXhwZWN0ZWRUeXBlKSAtPgorICAgIE5leHRTdGF0ZSA9IFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgTmV4dCwgUmVzdH19LAorICAgIGNhc2UgVHlwZSA9PSBFeHBlY3RlZFR5cGUgb2YKKyAgICAgICAgdHJ1ZSAtPiAKKyAgICAgICAgICAgIHtOZXh0U3RhdGUsIHtvaywgY29udmVydF9kYXRhKFR5cGUsIERhdGEpfX07CisgICAgICAgIGZhbHNlIC0+CisgICAgICAgICAgICB7TmV4dFN0YXRlLCB7ZXJyb3IsIHt1bmV4cGVjdGVkX2pzb25fZXZlbnQsIEV2fX19CisgICAgZW5kOworCitleHBlY3QoI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgRXZlbnQsIE5leHR9fT1TdGF0ZSwgRXhwZWN0ZWRFdmVudCkgLT4KKyAgICAgZXhwZWN0KFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwge0V2ZW50LCBub25lfSwgTmV4dH19LCBFeHBlY3RlZEV2ZW50KS4KKworY29udmVydF9kYXRhKGludGVnZXIsIEkpIC0+IGxpc3RfdG9faW50ZWdlcihJKTsKK2NvbnZlcnRfZGF0YShmbG9hdCwgRikgLT4gbGlzdF90b19mbG9hdChGKTsKK2NvbnZlcnRfZGF0YShfLCBEKSAtPiBELgorCitleHBlY3RfbWFueShTdGF0ZSwgRXhwZWN0ZWRMaXN0KSAtPgorICAgIGV4cGVjdF9tYW55XzEoU3RhdGUsIEV4cGVjdGVkTGlzdCwgW10sIG9rKS4KKworZXhwZWN0X21hbnlfMShTdGF0ZSwgW10sIFJlc3VsdExpc3QsIFN0YXR1cykgLT4KKyAgICB7U3RhdGUsIHtTdGF0dXMsIGxpc3RzOnJldmVyc2UoUmVzdWx0TGlzdCl9fTsKK2V4cGVjdF9tYW55XzEoU3RhdGUsIFtFeHBlY3RlZHxFeHBUYWlsXSwgUmVzdWx0TGlzdCwgX1ByZXZTdGF0dXMpIC0+CisgICAge1N0YXRlMSwge1N0YXR1cywgRGF0YX19ID0gZXhwZWN0KFN0YXRlLCBFeHBlY3RlZCksCisgICAgTmV3UmVzdWx0TGlzdCA9IFtEYXRhfFJlc3VsdExpc3RdLAorICAgIGNhc2UgU3RhdHVzIG9mCisgICAgICAgICUgaW4gY2FzZSBvZiBlcnJvciwgZW5kIHByZW1hdHVyZWx5CisgICAgICAgIGVycm9yIC0+IGV4cGVjdF9tYW55XzEoU3RhdGUxLCBbXSwgTmV3UmVzdWx0TGlzdCwgU3RhdHVzKTsKKyAgICAgICAgb2sgLT4gZXhwZWN0X21hbnlfMShTdGF0ZTEsIEV4cFRhaWwsIE5ld1Jlc3VsdExpc3QsIFN0YXR1cykKKyAgICBlbmQuCisKKyUgd3JhcHBlciBhcm91bmQgZXhwZWN0IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGNvbnRhaW5lciBvcGVuaW5nL2Nsb3NpbmcgZnVuY3Rpb25zCitleHBlY3Rfbm9kYXRhKFRoaXMsIEV4cGVjdGVkTGlzdCkgLT4KKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMsIEV4cGVjdGVkTGlzdCkgb2YKKyAgICAgICAge1N0YXRlLCB7b2ssIF99fSAtPiAKKyAgICAgICAgICAgIHtTdGF0ZSwgb2t9OworICAgICAgICBFcnJvciAtPiAKKyAgICAgICAgICAgIEVycm9yCisgICAgZW5kLgorCityZWFkX2ZpZWxkKCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIEZpZWxkLCBbTmV4dHxSZXN0XX19ID0gU3RhdGUpIC0+CisgICAgTmV3U3RhdGUgPSBTdGF0ZSNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIE5leHQsIFJlc3R9fSwKKyAgICB7TmV3U3RhdGUsIEZpZWxkfS4KKworcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KKyAgICAlIGNhbGwgcmVhZF9hbGwgdG8gZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgdHJhbnNwb3J0IGJ1ZmZlciBpbnRvIEpTWC4KKyAgICBUaGlzMSA9IHJlYWRfYWxsKFRoaXMwKSwKKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMxLCAKKyAgICAgICAgICAgIFtzdGFydF9hcnJheSwgaW50ZWdlciwgc3RyaW5nLCBpbnRlZ2VyLCBpbnRlZ2VyXSkgb2YKKyAgICAgICAge1RoaXMyLCB7b2ssIFtfLCBWZXJzaW9uLCBOYW1lLCBUeXBlLCBTZXFJZF19fSAtPgorICAgICAgICAgICAgY2FzZSBWZXJzaW9uID06PSA/VkVSU0lPTl8xIG9mCisgICAgICAgICAgICAgICAgdHJ1ZSAtPgorICAgICAgICAgICAgICAgICAgICB7VGhpczIsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgID0gTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OworICAgICAgICAgICAgICAgIGZhbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIHtUaGlzMiwge2Vycm9yLCBub19qc29uX3Byb3RvY29sX3ZlcnNpb259fQorICAgICAgICAgICAgZW5kOworICAgICAgICBPdGhlciAtPiBPdGhlcgorICAgIGVuZDsKKworcmVhZChUaGlzLCBtZXNzYWdlX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX2FycmF5XSk7CisKK3JlYWQoVGhpcywgc3RydWN0X2JlZ2luKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtzdGFydF9vYmplY3RdKTsKKworcmVhZChUaGlzLCBzdHJ1Y3RfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfb2JqZWN0XSk7CisKK3JlYWQoVGhpczAsIGZpZWxkX2JlZ2luKSAtPgorICAgIHtUaGlzMSwgUmVhZH0gPSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbJWZpZWxkIGlkCisgICAgICAgICAgICAga2V5LCAKKyAgICAgICAgICAgICAlIHt9IHN1cnJvdW5kaW5nIGZpZWxkCisgICAgICAgICAgICAgc3RhcnRfb2JqZWN0LCAKKyAgICAgICAgICAgICAlIHR5cGUgb2YgZmllbGQKKyAgICAgICAgICAgICBrZXldKSwKKyAgICBjYXNlIFJlYWQgb2YKKyAgICAgICAge29rLCBbRmllbGRJZFN0ciwgXywgRmllbGRUeXBlXX0gLT4KKyAgICAgICAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgICAgICAgICAgIHR5cGUgPSBqc29uX3RvX3R5cGVpZChGaWVsZFR5cGUpLCAKKyAgICAgICAgICAgICAgICBpZCA9IGxpc3RfdG9faW50ZWdlcihGaWVsZElkU3RyKX19OyAlIFRPRE86IGRvIHdlIG5lZWQgdG8gd3JhcCB0aGlzIGluIGEgdHJ5L2NhdGNoPworICAgICAgICB7ZXJyb3IsW3t1bmV4cGVjdGVkX2pzb25fZXZlbnQsIHtlbmRfb2JqZWN0LG5vbmV9fV19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gP3RUeXBlX1NUT1B9fTsKKyAgICAgICAgT3RoZXIgLT4gCisgICAgICAgICAgICBpbzpmb3JtYXQoIioqKiogT1RIRVIgYnJhbmNoIHNlbGVjdGVkICoqKioiKSwKKyAgICAgICAgICAgIHtUaGlzMSwgT3RoZXJ9CisgICAgZW5kOworCityZWFkKFRoaXMsIGZpZWxkX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX29iamVjdF0pOworCislIEV4YW1wbGUgbWVzc2FnZSB3aXRoIG1hcDogWzEsInRlc3RNYXAiLDEsMCx7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19XQorcmVhZChUaGlzMCwgbWFwX2JlZ2luKSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczAsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICUga2V5IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgdmFsdWUgdHlwZQorICAgICAgICAgICAgIHN0cmluZywgCisgICAgICAgICAgICAgJSBzaXplCisgICAgICAgICAgICAgaW50ZWdlciwKKyAgICAgICAgICAgICAlIHRoZSBmb2xsb3dpbmcgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXAKKyAgICAgICAgICAgICBzdGFydF9vYmplY3RdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEt0eXBlLCBWdHlwZSwgU2l6ZSwgX119fSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gS3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIG1hcF9lbmQpIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW2VuZF9vYmplY3QsIGVuZF9hcnJheV0pOworCityZWFkKFRoaXMwLCBsaXN0X2JlZ2luKSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczAsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICUgZWxlbWVudCB0eXBlCisgICAgICAgICAgICAgc3RyaW5nLCAKKyAgICAgICAgICAgICAlIHNpemUKKyAgICAgICAgICAgICBpbnRlZ2VyXSkgb2YKKyAgICAgICAge1RoaXMxLCB7b2ssIFtfLCBFdHlwZSwgU2l6ZV19fSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworJSBleGFtcGxlIG1lc3NhZ2Ugd2l0aCBzZXQ6IFsxLCJ0ZXN0U2V0IiwxLDAseyIxIjp7InNldCI6WyJpMzIiLDMsMSwyLDNdfX1dCityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgICAgY2FzZSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbc3RhcnRfYXJyYXksCisgICAgICAgICAgICAgJSBlbGVtZW50IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgc2l6ZQorICAgICAgICAgICAgIGludGVnZXJdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEV0eXBlLCBTaXplXX19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9zZXRfYmVnaW57CisgICAgICAgICAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworICAgICAgICBPdGhlciAtPiBPdGhlcgorICAgIGVuZDsKKworcmVhZChUaGlzLCBzZXRfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworcmVhZChUaGlzMCwgZmllbGRfc3RvcCkgLT4KKyAgICB7VGhpczAsIG9rfTsKKyUlCisKK3JlYWQoVGhpczAsIGJvb2wpIC0+CisgICAge1RoaXMxLCBGaWVsZH0gPSByZWFkX2ZpZWxkKFRoaXMwKSwKKyAgICBWYWx1ZSA9IGNhc2UgRmllbGQgb2YKKyAgICAgICAge2xpdGVyYWwsIEl9IC0+IAorICAgICAgICAgICAge29rLCBJfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9ib29sZWFufQorICAgIGVuZCwKKyAgICB7VGhpczEsIFZhbHVlfTsKKworcmVhZChUaGlzMCwgYnl0ZSkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7a2V5LCBLfSAtPgorICAgICAgICAgICAge29rLCBsaXN0X3RvX2ludGVnZXIoSyl9OworICAgICAgICB7aW50ZWdlciwgSX0gLT4gCisgICAgICAgICAgICB7b2ssIGxpc3RfdG9faW50ZWdlcihJKX07IAorICAgICAgICBfT3RoZXIgLT4KKyAgICAgICAgICAgIHtlcnJvciwgdW5leHBlY3RlZF9ldmVudF9mb3JfaW50ZWdlcn0KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX07CisKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAgICByZWFkKFRoaXMwLCBieXRlKTsKKworcmVhZChUaGlzMCwgaTMyKSAtPgorICAgIHJlYWQoVGhpczAsIGJ5dGUpOworCityZWFkKFRoaXMwLCBpNjQpIC0+CisgICAgcmVhZChUaGlzMCwgYnl0ZSk7CisKK3JlYWQoVGhpczAsIGRvdWJsZSkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7ZmxvYXQsIEl9IC0+IAorICAgICAgICAgICAge29rLCBsaXN0X3RvX2Zsb2F0KEkpfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9kb3VibGV9CisgICAgZW5kLAorICAgIHtUaGlzMSwgVmFsdWV9OworCislIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgICAge1RoaXMxLCBGaWVsZH0gPSByZWFkX2ZpZWxkKFRoaXMwKSwKKyAgICBWYWx1ZSA9IGNhc2UgRmllbGQgb2YKKyAgICAgICAge3N0cmluZywgSX0gLT4gCisgICAgICAgICAgICB7b2ssIEl9OyAKKyAgICAgICAge2tleSwgSn0gLT4gCisgICAgICAgICAgICB7b2ssIEp9OyAKKyAgICAgICAgX090aGVyIC0+CisgICAgICAgICAgICB7ZXJyb3IsIHVuZXhwZWN0ZWRfZXZlbnRfZm9yX3N0cmluZ30KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX0uCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUgcmV0dXJucyBhIChmdW4oKSAtPiB0aHJpZnRfcHJvdG9jb2woKSkKK25ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIF9PcHRpb25zKSAtPgorICAgICUgT25seSBzdHJpY2UgcmVhZC93cml0ZSBhcmUgaW1wbGVtZW50ZWQKKyAgICBGID0gZnVuKCkgLT4KKyAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSBUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgICAgdGhyaWZ0X2pzb25fcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCwgW10pCisgICAgICAgIGVuZCwKKyAgICB7b2ssIEZ9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorCisKKy1yZWNvcmQodF9tZW1idWZmZXIsIHsKKyAgYnVmZmVyID0gW10KK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X21lbWJ1ZmZlcnt9LgorCisKKy1zcGVjIG5ldygpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KCkgLT4gbmV3KFtdKS4KKworLXNwZWMgbmV3KEJ1Zjo6aW9kYXRhKCkpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KEJ1Zikgd2hlbiBpc19saXN0KEJ1ZikgLT4KKyAgU3RhdGUgPSAjdF9tZW1idWZmZXJ7YnVmZmVyID0gQnVmfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpOworbmV3KEJ1Zikgd2hlbiBpc19iaW5hcnkoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBbQnVmXX0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0uCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPgorICAgICAge1N0YXRlLCB7ZXJyb3IsIGVvZn19CisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBEYXRhKQord2hlbiBpc19saXN0KERhdGEpOyBpc19iaW5hcnkoRGF0YSkgLT4KKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWYsIERhdGFdfSwgb2t9LgorCisKK2ZsdXNoKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKworCitjbG9zZShTdGF0ZSkgLT4ge1N0YXRlLCBva30uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAppbmRleCBjNDQ0NDllLi42YTU5ZWE1IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCkBAIC0yMSw0MiArMjEsMjcgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMCwgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzBdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzAsIG5ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzBdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tcmVjb3JkKG1lbW9yeV9idWZmZXIsIHtidWZmZXJ9KS4KLS10eXBlIHN0YXRlKCkgOjogI21lbW9yeV9idWZmZXJ7fS4KLS1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKyUlIHdyYXBwZXIgYXJvdW5kIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0IGZvciBsZWdhY3kgcmVhc29ucwogCi1uZXcoKSAtPgotICAgIFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW119LAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KK25ldygpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLgogCi1uZXdfdHJhbnNwb3J0X2ZhY3RvcnkoKSAtPgotICAgIHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KK25ldyhTdGF0ZSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KFN0YXRlKS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW0J1ZiwgRGF0YV19LCBva30uCituZXdfdHJhbnNwb3J0X2ZhY3RvcnkoKSAtPiB7b2ssIGZ1bigpIC0+IG5ldygpIGVuZH0uCiAKLWZsdXNoKFN0YXRlKSAtPgotICAgIHtTdGF0ZSwgb2t9Lgord3JpdGUoU3RhdGUsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OndyaXRlKFN0YXRlLCBEYXRhKS4KIAotY2xvc2UoU3RhdGUpIC0+Ci0gICAge1N0YXRlLCBva30uCityZWFkKFN0YXRlLCBEYXRhKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpyZWFkKFN0YXRlLCBEYXRhKS4KIAotcmVhZChTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCi0gICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAotICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKLSAgICB7U3RhdGUjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19LgorZmx1c2goU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmZsdXNoKFN0YXRlKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1taW4oQSxCKSB3aGVuIEE8QiAtPiBBOwotbWluKF8sQikgICAgICAgICAgLT4gQi4KK2Nsb3NlKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpjbG9zZShTdGF0ZSkuCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzVlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcikuCisKKy1leHBvcnQoWworICAgICAgICAgIG5ldy8wCisgICAgICAgICAsc3RvcmUvMworICAgICAgICAgLGZpbmQvMgorICAgICAgICAgLGZldGNoLzIKKyAgICAgICAgXSkuCisKKy10eXBlIHNlcnZpY2VfaGFuZGxlcigpICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIG1vZHVsZV8oKSAgICAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkgOjogW3tTZXJ2aWNlSGFuZGxlcjo6c2VydmljZV9oYW5kbGVyKCksIE1vZHVsZTo6bW9kdWxlXygpfV0uCisKKy1zcGVjIG5ldygpIC0+IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK25ldygpIC0+CisgICAgb3JkZGljdDpuZXcoKS4KKworLXNwZWMgc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPiBOZXdNYXAgd2hlbgorICAgIFNlcnZpY2VIYW5kbGVyIDo6IHNlcnZpY2VfaGFuZGxlcigpLAorICAgIE1vZHVsZSAgICAgICAgIDo6IG1vZHVsZV8oKSwKKyAgICBNYXAgICAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCksCisgICAgTmV3TWFwICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPgorICAgIG9yZGRpY3Q6c3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKS4KKworLXNwZWMgZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPiB7b2ssIE1vZHVsZX0gfCBlcnJvciB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkuCisKKy1zcGVjIGZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IE1vZHVsZSB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+CisgICAgb3JkZGljdDpmZXRjaChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2I3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsODMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWV4cG9ydChbbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMQorICAgICAgICBdKS4KKworLXJlY29yZChwcm90b2NvbCwge21vZHVsZSwgZGF0YX0pLgorLXR5cGUgcHJvdG9jb2woKSA6OiAjcHJvdG9jb2x7fS4KKworLXJlY29yZCAobXVsdGlwbGV4ZWRfcHJvdG9jb2wsIHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGU6OmF0b20oKSwKKwkJCQkJCQkJcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZTo6dGVybSgpLAorCQkJCQkJCQlzZXJ2aWNlX25hbWU6Om5vbmVtcHR5X3N0cmluZygpfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI211bHRpcGxleGVkX3Byb3RvY29se30uCisKKy1zcGVjIG5ldyhQcm90b2NvbFRvRGVjb3JhdGU6OnByb3RvY29sKCksIFNlcnZpY2VOYW1lOjpub25lbXB0eV9zdHJpbmcoKSkgLT4ge29rLCBQcm90b2NvbDo6cHJvdG9jb2woKX0uCituZXcoUHJvdG9jb2xUb0RlY29yYXRlLCBTZXJ2aWNlTmFtZSkgd2hlbiBpc19yZWNvcmQoUHJvdG9jb2xUb0RlY29yYXRlLCBwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VOYW1lKSAtPgorICAgIFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sVG9EZWNvcmF0ZSNwcm90b2NvbC5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID0gU2VydmljZU5hbWV9LAorICAgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmZsdXNoX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCitjbG9zZV90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmNsb3NlX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCit3cml0ZShTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgICBNZXNzYWdlID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IE5hbWV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lPVNlcnZpY2VOYW1lICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9NVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lfSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva307CisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0sCisgICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCityZWFkKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgTWVzc2FnZSkgLT4KKyAgICB7U3RhdGUxLCBSZXN1bHR9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOnJlYWQoU3RhdGUwLCBNZXNzYWdlKSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIFJlc3VsdH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCmluZGV4IDQzMTU1MDUuLjVjOWYyNmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCkBAIC0zMiwyMyArMzIsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXJ9KS4KIAotbG9vcChTdGF0ZTAgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCAgPSBQcm90bzB9KSAtPgorbG9vcChTdGF0ZTAgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCAgPSBQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0pIC0+CisKICAgICB7UHJvdG8xLCBNZXNzYWdlQmVnaW59ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBtZXNzYWdlX2JlZ2luKSwKICAgICBTdGF0ZTEgPSBTdGF0ZTAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMX0sCisKKyAgICBFcnJvckhhbmRsZXIgPSBmdW4KKyAgICAgICAgKEhhbmRsZXJNb2R1bGVzKSB3aGVuIGlzX2xpc3QoSGFuZGxlck1vZHVsZXMpIC0+IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaCg/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksIEhhbmRsZXJNb2R1bGVzKTsKKyAgICAgICAgKEhhbmRsZXJNb2R1bGUpIC0+IEhhbmRsZXJNb2R1bGUKKyAgICBlbmQsCisKICAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgorCiAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfQ0FMTH0gLT4KLSAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSA9IGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEsIGxpc3RfdG9fYXRvbShGdW5jdGlvbikpLAotICAgICAgICAgICAgbG9vcChTdGF0ZTIpOwotICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lID0gRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSA/dE1lc3NhZ2VUeXBlX09ORVdBWX0gLT4KLSAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSA9IGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEsIGxpc3RfdG9fYXRvbShGdW5jdGlvbikpLAotICAgICAgICAgICAgbG9vcChTdGF0ZTIpOwotICAgICAgICB7ZXJyb3IsIHRpbWVvdXR9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSB3aGVuIFR5cGUgPTo9ID90TWVzc2FnZVR5cGVfQ0FMTDsgVHlwZSA9Oj0gP3RNZXNzYWdlVHlwZV9PTkVXQVkgLT4KKyAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRva2VucyhGdW5jdGlvbiwgP01VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SKSBvZgorICAgICAgICAgICAgICAgIFtTZXJ2aWNlTmFtZSwgRnVuY3Rpb25OYW1lXSAtPgorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTW9kdWxlICA9IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaChTZXJ2aWNlTmFtZSwgU2VydmljZSksCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIYW5kbGVyID0gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKFNlcnZpY2VOYW1lLCBIYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlTW9kdWxlLCBoYW5kbGVyPVNlcnZpY2VIYW5kbGVyfSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uTmFtZSksIFNlcWlkKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlLCBoYW5kbGVyPUhhbmRsZXJ9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisJCQkJCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFtsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgICAgIF8gLT4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxLCBsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBTZXFpZCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSAtPiBsb29wKFN0YXRlMik7CisgICAgICAgICAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgorCQkJCQkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgUmVhc29uXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgZW5kOworICAgICAgICB7ZXJyb3IsIHRpbWVvdXQgPSBSZWFzb259IC0+CisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCiAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBvazsKLSAgICAgICAge2Vycm9yLCBjbG9zZWR9IC0+CisgICAgICAgIHtlcnJvciwgY2xvc2VkID0gUmVhc29ufSAtPgogICAgICAgICAgICAgJSUgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJDbGllbnQgZGlzY29ubmVjdGVkfm4iKSwKKwkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbdW5kZWZpbmVkLCBSZWFzb25dKSwKKyAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKKyAgICAgICAgICAgIGV4aXQoc2h1dGRvd24pOworICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gLT4KKwkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbdW5kZWZpbmVkLCBSZWFzb25dKSwKICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKICAgICAgICAgICAgIGV4aXQoc2h1dGRvd24pCiAgICAgZW5kLgpAQCAtNTYsNyArODcsOCBAQAogaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMD0jdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSwKLSAgICAgICAgICAgICAgICBGdW5jdGlvbikgLT4KKyAgICAgICAgICAgICAgICBGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICBTZXFpZCkgLT4KICAgICBJblBhcmFtcyA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLAogCiAgICAge1Byb3RvMSwge29rLCBQYXJhbXN9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgSW5QYXJhbXMpLApAQCAtNjcsMTQgKzk5LDE0IEBACiAgICAgICAgICUlIHtNaWNybywgUmVzdWx0fSA9IGJldHRlcl90aW1lcihIYW5kbGVyLCBoYW5kbGVfZnVuY3Rpb24sIFtGdW5jdGlvbiwgUGFyYW1zXSksCiAgICAgICAgICUlIGVycm9yX2xvZ2dlcjppbmZvX21zZygiUHJvY2Vzc2VkIH5wKH5wKSBpbiB+LjRmbXN+biIsCiAgICAgICAgICUlICAgICAgICAgICAgICAgICAgICAgICBbRnVuY3Rpb24sIFBhcmFtcywgTWljcm8vMTAwMC4wXSksCi0gICAgICAgIGhhbmRsZV9zdWNjZXNzKFN0YXRlMSwgRnVuY3Rpb24sIFJlc3VsdCkKKyAgICAgICAgaGFuZGxlX3N1Y2Nlc3MoU3RhdGUxLCBGdW5jdGlvbiwgUmVzdWx0LCBTZXFpZCkKICAgICBjYXRjaAogICAgICAgICBUeXBlOkRhdGEgd2hlbiBUeXBlID06PSB0aHJvdyBvcmVsc2UgVHlwZSA9Oj0gZXJyb3IgLT4KLSAgICAgICAgICAgIGhhbmRsZV9mdW5jdGlvbl9jYXRjaChTdGF0ZTEsIEZ1bmN0aW9uLCBUeXBlLCBEYXRhKQorICAgICAgICAgICAgaGFuZGxlX2Z1bmN0aW9uX2NhdGNoKFN0YXRlMSwgRnVuY3Rpb24sIFR5cGUsIERhdGEsIFNlcWlkKQogICAgIGVuZC4KIAogaGFuZGxlX2Z1bmN0aW9uX2NhdGNoKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZSA9IFNlcnZpY2V9LAotICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLCBFcnJUeXBlLCBFcnJEYXRhKSAtPgorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLCBFcnJUeXBlLCBFcnJEYXRhLCBTZXFpZCkgLT4KICAgICBJc09uZXdheSA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSkgPTo9IG9uZXdheV92b2lkLAogCiAgICAgY2FzZSB7RXJyVHlwZSwgRXJyRGF0YX0gb2YKQEAgLTg3LDI2ICsxMTksMjcgQEAKIAogICAgICAgICB7dGhyb3csIEV4Y2VwdGlvbn0gd2hlbiBpc190dXBsZShFeGNlcHRpb24pLCBzaXplKEV4Y2VwdGlvbikgPiAwIC0+CiAgICAgICAgICAgICAlZXJyb3JfbG9nZ2VyOndhcm5pbmdfbXNnKCJ+cCB0aHJldyBleGNlcHRpb246IH5wfm4iLCBbRnVuY3Rpb24sIEV4Y2VwdGlvbl0pLAotICAgICAgICAgICAgaGFuZGxlX2V4Y2VwdGlvbihTdGF0ZSwgRnVuY3Rpb24sIEV4Y2VwdGlvbik7CisgICAgICAgICAgICBoYW5kbGVfZXhjZXB0aW9uKFN0YXRlLCBGdW5jdGlvbiwgRXhjZXB0aW9uLCBTZXFpZCk7CiAgICAgICAgICAgICAlIHdlIHN0aWxsIHdhbnQgdG8gYWNjZXB0IG1vcmUgcmVxdWVzdHMgZnJvbSB0aGlzIGNsaWVudAogCiAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+Ci0gICAgICAgICAgICBoYW5kbGVfZXJyb3IoU3RhdGUsIEZ1bmN0aW9uLCBFcnJvcikKKyAgICAgICAgICAgIGhhbmRsZV9lcnJvcihTdGF0ZSwgRnVuY3Rpb24sIEVycm9yLCBTZXFpZCkKICAgICBlbmQuCiAKIGhhbmRsZV9zdWNjZXNzKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZSA9IFNlcnZpY2V9LAogICAgICAgICAgICAgICAgRnVuY3Rpb24sCi0gICAgICAgICAgICAgICBSZXN1bHQpIC0+CisgICAgICAgICAgICAgICBSZXN1bHQsCisgICAgICAgICAgICAgICBTZXFpZCkgLT4KICAgICBSZXBseVR5cGUgID0gU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKSwKICAgICBTdHJ1Y3ROYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSArKyAiX3Jlc3VsdCIsCiAKICAgICBjYXNlIFJlc3VsdCBvZgogICAgICAgICB7cmVwbHksIFJlcGx5RGF0YX0gLT4KICAgICAgICAgICAgIFJlcGx5ID0ge3tzdHJ1Y3QsIFt7MCwgUmVwbHlUeXBlfV19LCB7U3RydWN0TmFtZSwgUmVwbHlEYXRhfX0sCi0gICAgICAgICAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwgUmVwbHkpOworICAgICAgICAgICAgc2VuZF9yZXBseShTdGF0ZSwgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfUkVQTFksIFJlcGx5LCBTZXFpZCk7CiAKICAgICAgICAgb2sgd2hlbiBSZXBseVR5cGUgPT0ge3N0cnVjdCwgW119IC0+Ci0gICAgICAgICAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwge1JlcGx5VHlwZSwge1N0cnVjdE5hbWV9fSk7CisgICAgICAgICAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwge1JlcGx5VHlwZSwge1N0cnVjdE5hbWV9fSwgU2VxaWQpOwogCiAgICAgICAgIG9rIHdoZW4gUmVwbHlUeXBlID09IG9uZXdheV92b2lkIC0+CiAgICAgICAgICAgICAlJSBubyByZXBseSBmb3Igb25ld2F5IHZvaWQKQEAgLTExNSw3ICsxNDgsOCBAQAogCiBoYW5kbGVfZXhjZXB0aW9uKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZSA9IFNlcnZpY2V9LAogICAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgRXhjZXB0aW9uKSAtPgorICAgICAgICAgICAgICAgICBFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgIFNlcWlkKSAtPgogICAgIEV4Y2VwdGlvblR5cGUgPSBlbGVtZW50KDEsIEV4Y2VwdGlvbiksCiAgICAgJSUgRmV0Y2ggYSBzdHJ1Y3R1cmUgbGlrZSB7c3RydWN0LCBbey0yLCB7c3RydWN0LCB7TW9kdWxlLCBUeXBlfX19LAogICAgICUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMywge3N0cnVjdCwge01vZHVsZSwgVHlwZX19fV19CkBAIC0xMzgsMjAgKzE3MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBNYWtlIHN1cmUgd2UgZ290IGF0IGxlYXN0IG9uZSBkZWZpbmVkCiAgICAgY2FzZSBsaXN0czphbGwoZnVuKFgpIC0+IFggPTo9IHVuZGVmaW5lZCBlbmQsIEV4Y2VwdGlvbkxpc3QpIG9mCiAgICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIGhhbmRsZV91bmtub3duX2V4Y2VwdGlvbihTdGF0ZSwgRnVuY3Rpb24sIEV4Y2VwdGlvbik7CisgICAgICAgICAgICBoYW5kbGVfdW5rbm93bl9leGNlcHRpb24oU3RhdGUsIEZ1bmN0aW9uLCBFeGNlcHRpb24sIFNlcWlkKTsKICAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIHNlbmRfcmVwbHkoU3RhdGUsIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX1JFUExZLCB7UmVwbHlTcGVjLCBFeGNlcHRpb25UdXBsZX0pCisgICAgICAgICAgICBzZW5kX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwge1JlcGx5U3BlYywgRXhjZXB0aW9uVHVwbGV9LCBTZXFpZCkKICAgICBlbmQuCiAKICUlCiAlJSBDYWxsZWQgd2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gZXhwbGljaXRseSB0aHJvd24gYnkgdGhlIHNlcnZpY2UsIGJ1dCBpdCB3YXMKICUlIG5vdCBvbmUgb2YgdGhlIGV4Y2VwdGlvbnMgdGhhdCB3YXMgZGVmaW5lZCBmb3IgdGhlIGZ1bmN0aW9uLgogJSUKLWhhbmRsZV91bmtub3duX2V4Y2VwdGlvbihTdGF0ZSwgRnVuY3Rpb24sIEV4Y2VwdGlvbikgLT4KK2hhbmRsZV91bmtub3duX2V4Y2VwdGlvbihTdGF0ZSwgRnVuY3Rpb24sIEV4Y2VwdGlvbiwgU2VxaWQpIC0+CiAgICAgaGFuZGxlX2Vycm9yKFN0YXRlLCBGdW5jdGlvbiwge2V4Y2VwdGlvbl9ub3RfZGVjbGFyZWRfYXNfdGhyb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb259KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9ufSwgU2VxaWQpLgogCi1oYW5kbGVfZXJyb3IoU3RhdGUsIEZ1bmN0aW9uLCBFcnJvcikgLT4KK2hhbmRsZV9lcnJvcihTdGF0ZSwgRnVuY3Rpb24sIEVycm9yLCBTZXFpZCkgLT4KICAgICBTdGFjayA9IGVybGFuZzpnZXRfc3RhY2t0cmFjZSgpLAogICAgIGVycm9yX2xvZ2dlcjplcnJvcl9tc2coIn5wIGhhZCBhbiBlcnJvcjogfnB+biIsIFtGdW5jdGlvbiwge0Vycm9yLCBTdGFja31dKSwKIApAQCAtMTY3LDE0ICsyMDEsMTkgQEAKICAgICAgICAgICAgICAjJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbid7CiAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgdHlwZSA9ID9UQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTn19LAotICAgIHNlbmRfcmVwbHkoU3RhdGUsIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiwgUmVwbHkpLgorICAgIHNlbmRfcmVwbHkoU3RhdGUsIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiwgUmVwbHksIFNlcWlkKS4KIAotc2VuZF9yZXBseShTdGF0ZSA9ICN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8wfSwgRnVuY3Rpb24sIFJlcGx5TWVzc2FnZVR5cGUsIFJlcGx5KSAtPgotICAgIHtQcm90bzEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2luewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBSZXBseU1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gMH0pLAotICAgIHtQcm90bzIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzEsIFJlcGx5KSwKLSAgICB7UHJvdG8zLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8yLCBtZXNzYWdlX2VuZCksCi0gICAge1Byb3RvNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQcm90bzMpLAotICAgIHtTdGF0ZSN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG80fSwgb2t9Lgorc2VuZF9yZXBseShTdGF0ZSA9ICN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8wfSwgRnVuY3Rpb24sIFJlcGx5TWVzc2FnZVR5cGUsIFJlcGx5LCBTZXFpZCkgLT4KKyAgICB0cnkKKyAgICAgICAge1Byb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdG9tX3RvX2xpc3QoRnVuY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUmVwbHlNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0pLAorICAgICAgICB7UHJvdG8yLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8xLCBSZXBseSksCisgICAgICAgIHtQcm90bzMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzIsIG1lc3NhZ2VfZW5kKSwKKyAgICAgICAge1Byb3RvNCwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQcm90bzMpLAorICAgICAgICB7U3RhdGUjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvNH0sIG9rfQorICAgIGNhdGNoCisgICAgICAgIGVycm9yOntiYWRtYXRjaCwge18sIHtlcnJvciwgX30gPSBFcnJvcn19IC0+CisgICAgICAgICAgICB7U3RhdGUsIEVycm9yfQorICAgIGVuZC4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCmluZGV4IDRjMzM0MTIuLjJmZTEwZDYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybApAQCAtNjMsOCArNjMsOCBAQAogdHlwZWlkX3RvX2F0b20oP3RUeXBlX1NUT1ApIC0+IGZpZWxkX3N0b3A7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfVk9JRCkgLT4gdm9pZDsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9CT09MKSAtPiBib29sOwotdHlwZWlkX3RvX2F0b20oP3RUeXBlX0JZVEUpIC0+IGJ5dGU7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfRE9VQkxFKSAtPiBkb3VibGU7Cit0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTgpIC0+IGJ5dGU7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTE2KSAtPiBpMTY7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTMyKSAtPiBpMzI7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfSTY0KSAtPiBpNjQ7CkBAIC03Niw4ICs3Niw5IEBACiAKIHRlcm1fdG9fdHlwZWlkKHZvaWQpIC0+ID90VHlwZV9WT0lEOwogdGVybV90b190eXBlaWQoYm9vbCkgLT4gP3RUeXBlX0JPT0w7Ci10ZXJtX3RvX3R5cGVpZChieXRlKSAtPiA/dFR5cGVfQllURTsKK3Rlcm1fdG9fdHlwZWlkKGJ5dGUpIC0+ID90VHlwZV9JODsKIHRlcm1fdG9fdHlwZWlkKGRvdWJsZSkgLT4gP3RUeXBlX0RPVUJMRTsKK3Rlcm1fdG9fdHlwZWlkKGk4KSAtPiA/dFR5cGVfSTg7CiB0ZXJtX3RvX3R5cGVpZChpMTYpIC0+ID90VHlwZV9JMTY7CiB0ZXJtX3RvX3R5cGVpZChpMzIpIC0+ID90VHlwZV9JMzI7CiB0ZXJtX3RvX3R5cGVpZChpNjQpIC0+ID90VHlwZV9JNjQ7CkBAIC0xNDgsOCArMTQ5LDEyIEBACiByZWFkKElQcm90bzAsIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9KSAtPgogICAgIHtJUHJvdG8xLCAjcHJvdG9jb2xfbWFwX2JlZ2lue3NpemUgPSBTaXplLCBrdHlwZSA9IEtUeXBlLCB2dHlwZSA9IFZUeXBlfX0gPQogICAgICAgICByZWFkKElQcm90bzAsIG1hcF9iZWdpbiksCi0gICAge0tUeXBlLCBLVHlwZX0gPSB7dGVybV90b190eXBlaWQoS2V5VHlwZSksIEtUeXBlfSwKLSAgICB7VlR5cGUsIFZUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChWYWxUeXBlKSwgVlR5cGV9LAorICAgIF8gPSBjYXNlIFNpemUgb2YKKyAgICAgIDAgLT4gMDsKKyAgICAgIF8gLT4KKyAgICAgICAge0tUeXBlLCBLVHlwZX0gPSB7dGVybV90b190eXBlaWQoS2V5VHlwZSksIEtUeXBlfSwKKyAgICAgICAge1ZUeXBlLCBWVHlwZX0gPSB7dGVybV90b190eXBlaWQoVmFsVHlwZSksIFZUeXBlfQorICAgIGVuZCwKICAgICB7TGlzdCwgSVByb3RvMn0gPSBsaXN0czptYXBmb2xkbChmdW4oXywgUHJvdG9TMCkgLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MxLCB7b2ssIEtleX19ID0gcmVhZChQcm90b1MwLCBLZXlUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MyLCB7b2ssIFZhbH19ID0gcmVhZChQcm90b1MxLCBWYWxUeXBlKSwKQEAgLTE5MSw3ICsxOTYsOCBAQAogICAgICAgICB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8wLCBmaWVsZF9iZWdpbiksCiAgICAgY2FzZSB7RlR5cGUsIEZpZH0gb2YKICAgICAgICAgez90VHlwZV9TVE9QLCBffSAtPgotICAgICAgICAgICAge0lQcm90bzEsIFJUdXBsZX07CisgICAgICAgICAgICB7SVByb3RvMiwgb2t9ID0gcmVhZChJUHJvdG8xLCBzdHJ1Y3RfZW5kKSwKKyAgICAgICAgICAgIHtJUHJvdG8yLCBSVHVwbGV9OwogICAgICAgICBfRWxzZSAtPgogICAgICAgICAgICAgY2FzZSBkaWN0OmZpbmQoRmlkLCBTRGljdCkgb2YKICAgICAgICAgICAgICAgICB7b2ssIHtUeXBlLCBJbmRleH19IC0+CkBAIC0yMDgsMTggKzIxNCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzEsIFNEaWN0LCBSVHVwbGUpCiAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgICBfRWxzZTIgLT4KLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJTa2lwcGluZyBmaWVsZCB+cCB3aXRoIHVua25vd24gZmlkfm4iLCBbRmlkXSksCiAgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzEsIFNEaWN0LCBSVHVwbGUpCiAgICAgICAgICAgICBlbmQKICAgICBlbmQuCiAKIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzAsIFNEaWN0LCBSVHVwbGUpIC0+Ci0gICAgRlR5cGVBdG9tID0gdGhyaWZ0X3Byb3RvY29sOnR5cGVpZF90b19hdG9tKEZUeXBlKSwKLSAgICB7SVByb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOnNraXAoSVByb3RvMCwgRlR5cGVBdG9tKSwKKyAgICB7SVByb3RvMSwgb2t9ID0gc2tpcChJUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShGVHlwZSkpLAogICAgIHtJUHJvdG8yLCBva30gPSByZWFkKElQcm90bzEsIGZpZWxkX2VuZCksCiAgICAgcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8yLCBTRGljdCwgUlR1cGxlKS4KIAotLXNwZWMgc2tpcCgjcHJvdG9jb2x7fSwgYW55KCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgorLXNwZWMgc2tpcCgjcHJvdG9jb2x7fSwgYXRvbSgpKSAtPiB7I3Byb3RvY29se30sIG9rfS4KIAogc2tpcChQcm90bzAsIHN0cnVjdCkgLT4KICAgICB7UHJvdG8xLCBva30gPSByZWFkKFByb3RvMCwgc3RydWN0X2JlZ2luKSwKQEAgLTI1Niw3ICsyNjAsNyBAQAogICAgICAgICA/dFR5cGVfU1RPUCAtPgogICAgICAgICAgICAge1Byb3RvMSwgb2t9OwogICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIFR5cGUpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFR5cGUpKSwKICAgICAgICAgICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBmaWVsZF9lbmQpLAogICAgICAgICAgICAgc2tpcF9zdHJ1Y3RfbG9vcChQcm90bzMpCiAgICAgZW5kLgpAQCAtMjY2LDggKzI3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEt0eXBlKSwKLSAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCBWdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oS3R5cGUpKSwKKyAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCB0eXBlaWRfdG9fYXRvbShWdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9tYXBfbG9vcChQcm90bzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCNwcm90b2NvbF9tYXBfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CkBAIC0yNzcsNyArMjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgRXR5cGUpLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEV0eXBlKSksCiAgICAgICAgICAgICBza2lwX3NldF9sb29wKFByb3RvMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX3NldF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KQEAgLTI4Nyw3ICsyOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEV0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShFdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9saXN0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX2xpc3RfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CkBAIC0zMjksNiArMzMzLDEyIEBACiAgICAgICAgZWxlbWVudCgxLCBEYXRhKSA9Oj0gU3RydWN0dXJlTmFtZSAtPgogICAgIHdyaXRlKFByb3RvLCB7TW9kdWxlOnN0cnVjdF9pbmZvKFN0cnVjdHVyZU5hbWUpLCBEYXRhfSk7CiAKK3dyaXRlKF8sIHt7c3RydWN0LCB7TW9kdWxlLCBTdHJ1Y3R1cmVOYW1lfX0sIERhdGF9KQorICB3aGVuIGlzX2F0b20oTW9kdWxlKSwKKyAgICAgICBpc19hdG9tKFN0cnVjdHVyZU5hbWUpIC0+CisgICAgZXJsYW5nOmVycm9yKHN0cnVjdF91bm1hdGNoZWQsIHt7cHJvdmlkZWQsIGVsZW1lbnQoMSwgRGF0YSl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZXhwZWN0ZWQsIFN0cnVjdHVyZU5hbWV9fSk7CisKIHdyaXRlKFByb3RvMCwge3tsaXN0LCBUeXBlfSwgRGF0YX0pCiAgIHdoZW4gaXNfbGlzdChEYXRhKSAtPgogICAgIHtQcm90bzEsIG9rfSA9IHdyaXRlKFByb3RvMCwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhmZDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCkBAIC0wLDAgKzEsMjU4IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCkuCisKKy1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCisKKyUlIEFQSQorLWV4cG9ydChbIGNhbGwvMywKKyAgICAgICAgICBnZXRfc3RhdHMvMSwKKyAgICAgICAgICBnZXRfYW5kX3Jlc2V0X3N0YXRzLzEgXSkuCisKKy1leHBvcnQoWyBzdGFydF9saW5rLzYgXSkuCisKKyUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCistZXhwb3J0KFsgaW5pdC8xLAorICAgICAgICAgIGhhbmRsZV9jYWxsLzMsCisgICAgICAgICAgaGFuZGxlX2Nhc3QvMiwKKyAgICAgICAgICBoYW5kbGVfaW5mby8yLAorICAgICAgICAgIHRlcm1pbmF0ZS8yLAorICAgICAgICAgIGNvZGVfY2hhbmdlLzMgXSkuCisKKy1yZWNvcmQoIHN0YXRlLCB7IGNsaWVudCA9IG5pbCwKKyAgICAgICAgICAgICAgICAgIGhvc3QsCisgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgdGhyaWZ0X3N2YywKKyAgICAgICAgICAgICAgICAgIHRocmlmdF9vcHRzLAorICAgICAgICAgICAgICAgICAgcmVjb25uX21pbiwKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9tYXgsCisgICAgICAgICAgICAgICAgICByZWNvbm5fdGltZSA9IDAsCisgICAgICAgICAgICAgICAgICBvcF9jbnRfZGljdCwKKyAgICAgICAgICAgICAgICAgIG9wX3RpbWVfZGljdCB9ICkuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIEFQSQorJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IHN0YXJ0X2xpbmsoKSAtPiB7b2ssUGlkfSB8IGlnbm9yZSB8IHtlcnJvcixFcnJvcn0KKyUlIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIHNlcnZlcgorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhcnRfbGluayggSG9zdCwgUG9ydCwKKyAgICAgICAgICAgIFRocmlmdFN2YywgVGhyaWZ0T3B0cywKKyAgICAgICAgICAgIFJlY29ubk1pbiwgUmVjb25uTWF4ICkgLT4KKyAgZ2VuX3NlcnZlcjpzdGFydF9saW5rKCA/TU9EVUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsgSG9zdCwgUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFN2YywgVGhyaWZ0T3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29ubk1pbiwgUmVjb25uTWF4IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW10gKS4KKworY2FsbCggUGlkLCBPcCwgQXJncyApIC0+CisgIGdlbl9zZXJ2ZXI6Y2FsbCggUGlkLCB7IGNhbGwsIE9wLCBBcmdzIH0gKS4KKworZ2V0X3N0YXRzKCBQaWQgKSAtPgorICBnZW5fc2VydmVyOmNhbGwoIFBpZCwgZ2V0X3N0YXRzICkuCisKK2dldF9hbmRfcmVzZXRfc3RhdHMoIFBpZCApIC0+CisgIGdlbl9zZXJ2ZXI6Y2FsbCggUGlkLCBnZXRfYW5kX3Jlc2V0X3N0YXRzICkuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmN0aW9uOiBpbml0KEFyZ3MpIC0+IHtvaywgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb259CislJSBEZXNjcmlwdGlvbjogU3RhcnQgdGhlIHNlcnZlci4KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luaXQoIFsgSG9zdCwgUG9ydCwgVFN2YywgVE9wdHMsIFJlY29ubk1pbiwgUmVjb25uTWF4IF0gKSAtPgorICBwcm9jZXNzX2ZsYWcoIHRyYXBfZXhpdCwgdHJ1ZSApLAorCisgIFN0YXRlID0gI3N0YXRleyBob3N0ICAgICAgICAgPSBIb3N0LAorICAgICAgICAgICAgICAgICAgcG9ydCAgICAgICAgID0gUG9ydCwKKyAgICAgICAgICAgICAgICAgIHRocmlmdF9zdmMgICA9IFRTdmMsCisgICAgICAgICAgICAgICAgICB0aHJpZnRfb3B0cyAgPSBUT3B0cywKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9taW4gICA9IFJlY29ubk1pbiwKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9tYXggICA9IFJlY29ubk1heCwKKyAgICAgICAgICAgICAgICAgIG9wX2NudF9kaWN0ICA9IGRpY3Q6bmV3KCksCisgICAgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBkaWN0Om5ldygpIH0sCisKKyAgeyBvaywgdHJ5X2Nvbm5lY3QoIFN0YXRlICkgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246ICUlIGhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVwbHksIFJlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYWxsIG1lc3NhZ2VzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfY2FsbCggeyBjYWxsLCBPcCwgXyB9LAorICAgICAgICAgICAgIF9Gcm9tLAorICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRleyBjbGllbnQgPSBuaWwgfSApIC0+CisgIHsgcmVwbHksIHsgZXJyb3IsIG5vY29ubiB9LCBpbmNyX3N0YXRzKCBPcCwgImZhaWxmYXN0IiwgMSwgU3RhdGUgKSB9OworCitoYW5kbGVfY2FsbCggeyBjYWxsLCBPcCwgQXJncyB9LAorICAgICAgICAgICAgIF9Gcm9tLAorICAgICAgICAgICAgIFN0YXRlPSNzdGF0ZXsgY2xpZW50ID0gQ2xpZW50IH0gKSAtPgorCisgIFRpbWVyID0gdGltZXJfZnVuKCksCisgIFJlc3VsdCA9ICggY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKCBDbGllbnQsIE9wLCBBcmdzKSApLAorICBUaW1lID0gVGltZXIoKSwKKworICBjYXNlIFJlc3VsdCBvZgorICAgIHsgQywgeyBvaywgUmVwbHkgfSB9IC0+CisgICAgICBTID0gaW5jcl9zdGF0cyggT3AsICJzdWNjZXNzIiwgVGltZSwgU3RhdGUjc3RhdGV7IGNsaWVudCA9IEMgfSApLAorICAgICAgeyByZXBseSwge29rLCBSZXBseSB9LCBTIH07CisgICAgeyBfLCB7IEUsIE1zZyB9IH0gd2hlbiBFID09IGVycm9yOyBFID09IGV4Y2VwdGlvbiAtPgorICAgICAgUyA9IGluY3Jfc3RhdHMoIE9wLCAiZXJyb3IiLCBUaW1lLCB0cnlfY29ubmVjdCggU3RhdGUgKSApLAorICAgICAgeyByZXBseSwgeyBFLCBNc2cgfSwgUyB9OworICAgIE90aGVyIC0+CisgICAgICBTID0gaW5jcl9zdGF0cyggT3AsICJlcnJvciIsIFRpbWUsIHRyeV9jb25uZWN0KCBTdGF0ZSApICksCisgICAgICB7IHJlcGx5LCBPdGhlciwgUyB9CisgIGVuZDsKKworaGFuZGxlX2NhbGwoIGdldF9zdGF0cywKKyAgICAgICAgICAgICBfRnJvbSwKKyAgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXt9ICkgLT4KKyAgeyByZXBseSwgc3RhdHMoIFN0YXRlICksIFN0YXRlIH07CisKK2hhbmRsZV9jYWxsKCBnZXRfYW5kX3Jlc2V0X3N0YXRzLAorICAgICAgICAgICAgIF9Gcm9tLAorICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRle30gKSAtPgorICB7IHJlcGx5LCBzdGF0cyggU3RhdGUgKSwgcmVzZXRfc3RhdHMoIFN0YXRlICkgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQorJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhc3QgbWVzc2FnZXMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2hhbmRsZV9jYXN0KCBfTXNnLCBTdGF0ZSApIC0+CisgIHsgbm9yZXBseSwgU3RhdGUgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQorJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfaW5mbyggdHJ5X2Nvbm5lY3QsIFN0YXRlICkgLT4KKyAgeyBub3JlcGx5LCB0cnlfY29ubmVjdCggU3RhdGUgKSB9OworCitoYW5kbGVfaW5mbyggX0luZm8sIFN0YXRlICkgLT4KKyAgeyBub3JlcGx5LCBTdGF0ZSB9LgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBGdW5jdGlvbjogdGVybWluYXRlKFJlYXNvbiwgU3RhdGUpIC0+IHZvaWQoKQorJSUgRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgZ2VuX3NlcnZlciB3aGVuIGl0IGlzIGFib3V0IHRvCislJSB0ZXJtaW5hdGUuIEl0IHNob3VsZCBiZSB0aGUgb3Bwb3NpdGUgb2YgTW9kdWxlOmluaXQvMSBhbmQgZG8gYW55IG5lY2Vzc2FyeQorJSUgY2xlYW5pbmcgdXAuIFdoZW4gaXQgcmV0dXJucywgdGhlIGdlbl9zZXJ2ZXIgdGVybWluYXRlcyB3aXRoIFJlYXNvbi4KKyUlIFRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Rlcm1pbmF0ZSggX1JlYXNvbiwgI3N0YXRleyBjbGllbnQgPSBDbGllbnQgfSApIC0+CisgIHRocmlmdF9jbGllbnQ6Y2xvc2UoIENsaWVudCApLAorICBvay4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuYzogY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IHtvaywgTmV3U3RhdGV9CislJSBEZXNjcmlwdGlvbjogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjb2RlX2NoYW5nZSggX09sZFZzbiwgU3RhdGUsIF9FeHRyYSApIC0+CisgIHsgb2ssIFN0YXRlIH0uCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RyeV9jb25uZWN0KCBTdGF0ZSA9ICNzdGF0ZXsgY2xpZW50ICAgICAgPSBPbGRDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgICAgICAgID0gSG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAgICAgICAgPSBQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc3ZjICA9IFRTdmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9vcHRzID0gVE9wdHMgfSApIC0+CisKKyAgY2FzZSBPbGRDbGllbnQgb2YKKyAgICBuaWwgLT4gb2s7CisgICAgXyAgIC0+ICggY2F0Y2ggdGhyaWZ0X2NsaWVudDpjbG9zZSggT2xkQ2xpZW50ICkgKQorICBlbmQsCisKKyAgY2FzZSBjYXRjaCB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCBIb3N0LCBQb3J0LCBUU3ZjLCBUT3B0cyApIG9mCisgICAgeyBvaywgQ2xpZW50IH0gLT4KKyAgICAgIFN0YXRlI3N0YXRleyBjbGllbnQgPSBDbGllbnQsIHJlY29ubl90aW1lID0gMCB9OworICAgIHsgRSwgTXNnIH0gd2hlbiBFID09IGVycm9yOyBFID09IGV4Y2VwdGlvbiAtPgorICAgICAgUmVjb25uVGltZSA9IHJlY29ubl90aW1lKCBTdGF0ZSApLAorICAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX21zZyggIlt+d10gfncgY29ubmVjdCBmYWlsZWQgKH53KSwgdHJ5aW5nIGFnYWluIGluIH53IG1zfm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBzZWxmKCksIFRTdmMsIE1zZywgUmVjb25uVGltZSBdICksCisgICAgICBlcmxhbmc6c2VuZF9hZnRlciggUmVjb25uVGltZSwgc2VsZigpLCB0cnlfY29ubmVjdCApLAorICAgICAgU3RhdGUjc3RhdGV7IGNsaWVudCA9IG5pbCwgcmVjb25uX3RpbWUgPSBSZWNvbm5UaW1lIH0KKyAgZW5kLgorCisKK3JlY29ubl90aW1lKCAjc3RhdGV7IHJlY29ubl9taW4gPSBSZWNvbm5NaW4sIHJlY29ubl90aW1lID0gMCB9ICkgLT4KKyAgUmVjb25uTWluOworcmVjb25uX3RpbWUoICNzdGF0ZXsgcmVjb25uX21heCA9IFJlY29ubk1heCwgcmVjb25uX3RpbWUgPSBSZWNvbm5NYXggfSApIC0+CisgIFJlY29ubk1heDsKK3JlY29ubl90aW1lKCAjc3RhdGV7IHJlY29ubl9tYXggPSBSZWNvbm5NYXgsIHJlY29ubl90aW1lID0gUiB9ICkgLT4KKyAgQmFja29mZiA9IDIgKiBSLAorICBjYXNlIEJhY2tvZmYgPiBSZWNvbm5NYXggb2YKKyAgICB0cnVlICAtPiBSZWNvbm5NYXg7CisgICAgZmFsc2UgLT4gQmFja29mZgorICBlbmQuCisKKy1pZmRlZih0aW1lX2NvcnJlY3Rpb24pLgordGltZXJfZnVuKCkgLT4KKyAgVDEgPSBlcmxhbmc6bW9ub3RvbmljX3RpbWUoKSwKKyAgZnVuKCkgLT4KKyAgICBUMiA9IGVybGFuZzptb25vdG9uaWNfdGltZSgpLAorICAgIGVybGFuZzpjb252ZXJ0X3RpbWVfdW5pdChUMiAtIFQxLCBuYXRpdmUsIG1pY3JvX3NlY29uZHMpCisgIGVuZC4KKy1lbHNlLgordGltZXJfZnVuKCkgLT4KKyAgVDEgPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGZ1bigpIC0+CisgICAgVDIgPSBlcmxhbmc6dGltZXN0YW1wKCksCisgICAgdGltZXI6bm93X2RpZmYoVDIsIFQxKQorICBlbmQuCistZW5kaWYuCisKK2luY3Jfc3RhdHMoIE9wLCBSZXN1bHQsIFRpbWUsCisgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXsgb3BfY250X2RpY3QgID0gT3BDbnREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3RpbWVfZGljdCA9IE9wVGltZURpY3QgfSApIC0+CisgIEtleSA9IGxpc3RzOmZsYXR0ZW4oIFsgYXRvbV90b19saXN0KCBPcCApLCBbICJfIiB8IFJlc3VsdCBdIF0gKSwKKyAgU3RhdGUjc3RhdGV7IG9wX2NudF9kaWN0ICA9IGRpY3Q6dXBkYXRlX2NvdW50ZXIoIEtleSwgMSwgT3BDbnREaWN0ICksCisgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBkaWN0OnVwZGF0ZV9jb3VudGVyKCBLZXksIFRpbWUsIE9wVGltZURpY3QgKSB9LgorCisKK3N0YXRzKCAjc3RhdGV7IHRocmlmdF9zdmMgICA9IFRTdmMsCisgICAgICAgICAgICAgICBvcF9jbnRfZGljdCAgPSBPcENudERpY3QsCisgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBPcFRpbWVEaWN0IH0gKSAtPgorICBTdmMgPSBhdG9tX3RvX2xpc3QoVFN2YyksCisKKyAgRiA9IGZ1biggS2V5LCBDb3VudCwgU3RhdHMgKSAtPgorICAgICAgICBOYW1lID0gbGlzdHM6ZmxhdHRlbiggWyBTdmMsIFsgIl8iIHwgS2V5IF0gXSApLAorICAgICAgICBNaWNyb3MgPSBkaWN0OmZldGNoKCBLZXksIE9wVGltZURpY3QgKSwKKyAgICAgICAgWyB7IE5hbWUsIENvdW50LCBNaWNyb3MgfSB8IFN0YXRzIF0KKyAgICAgIGVuZCwKKworICBkaWN0OmZvbGQoIEYsIFtdLCBPcENudERpY3QgKS4KKworcmVzZXRfc3RhdHMoIFN0YXRlID0gI3N0YXRle30gKSAtPgorICBTdGF0ZSNzdGF0ZXsgb3BfY250X2RpY3QgPSBkaWN0Om5ldygpLCBvcF90aW1lX2RpY3QgPSBkaWN0Om5ldygpIH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKaW5kZXggZjdjN2EwMi4uNGUzYzA1MiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybApAQCAtMjEsMTIgKzIxLDE5IEBACiAKIC1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAKLS1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgorLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAotICAgICAgICAgaGFuZGxlX2luZm8vMl0pLgorLWlmZGVmKFRFU1QpLgorICAgIC1jb21waWxlKGV4cG9ydF9hbGwpLgorICAgIC1leHBvcnRfcmVjb3JkcyhbdGhyaWZ0X3NvY2tldF9zZXJ2ZXJdKS4KKy1lbHNlLgorICAgIC1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgogCi0tZXhwb3J0KFthY2NlcHRvcl9sb29wLzFdKS4KKyAgICAtZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAorICAgICAgICAgICAgIGhhbmRsZV9pbmZvLzJdKS4KKworICAgIC1leHBvcnQoW2FjY2VwdG9yX2xvb3AvMV0pLgorLWVuZGlmLgogCiAtcmVjb3JkKHRocmlmdF9zb2NrZXRfc2VydmVyLAogICAgICAgICB7cG9ydCwKQEAgLTM4LDcgKzQ1LDEwIEBACiAgICAgICAgICBsaXN0ZW49bnVsbCwKICAgICAgICAgIGFjY2VwdG9yPW51bGwsCiAgICAgICAgICBzb2NrZXRfb3B0cz1be3JlY3ZfdGltZW91dCwgNTAwfV0sCi0gICAgICAgICBmcmFtZWQ9ZmFsc2UKKyAgICAgICAgIHByb3RvY29sPWJpbmFyeSwKKyAgICAgICAgIGZyYW1lZD1mYWxzZSwKKyAgICAgICAgIHNzbHRyYW5zcG9ydD1mYWxzZSwKKyAgICAgICAgIHNzbG9wdGlvbnM9W10KICAgICAgICAgfSkuCiAKIHN0YXJ0KFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnt9KSAtPgpAQCAtOTEsMTAgKzEwMSw0NiBAQAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aXA9UGFyc2VkSXB9KTsKIHBhcnNlX29wdGlvbnMoW3tzb2NrZXRfb3B0cywgTH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChMKSwgbGVuZ3RoKEwpID4gMCAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c29ja2V0X29wdHM9TH0pOwotcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIEhhbmRsZXJ9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IGFuIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBkZWZpbmVkLiIpOworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VIYW5kbGVyTWFwID0KKyAgICBjYXNlIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLmhhbmRsZXIgb2YKKyAgICAgICAgdW5kZWZpbmVkIC0+CisgICAgICAgICAgICBsaXN0czpmb2xkbCgKKyAgICAgICAgICAgICAgICBmdW4gKHtTZXJ2aWNlTmFtZSwgU2VydmljZUhhbmRsZXJ9LCBBY2MpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTmFtZSksIGlzX2F0b20oU2VydmljZUhhbmRsZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VIYW5kbGVyLCBBY2MpOworICAgICAgICAgICAgICAgICAgICAoXywgX0FjYykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICAgICAgICAgICAgICBlbmQsIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpuZXcoKSwgU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3QpOworICAgICAgICBfIC0+IHRocm93KCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBoYW5kbGVyIG9wdGlvbi4iKQorICAgIGVuZCwKKyAgICBjYXNlIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgU2VydmljZUhhbmRsZXJNYXApIG9mCisgICAgICAgIHtvaywgX0Vycm9ySGFuZGxlcn0gLT4gcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntoYW5kbGVyPVNlcnZpY2VIYW5kbGVyTWFwfSk7CisgICAgICAgIGVycm9yIC0+IHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICBlbmQ7CitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgSGFuZGxlcn0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuaGFuZGxlciA9PSB1bmRlZmluZWQsIGlzX2F0b20oSGFuZGxlcikgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2hhbmRsZXI9SGFuZGxlcn0pOwotcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2V9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG1vZHVsZSBtdXN0IGJlIGRlZmluZWQuIik7CitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VNb2R1bGVNYXAgPQorICAgIGNhc2UgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuc2VydmljZSBvZgorICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgIGxpc3RzOmZvbGRsKAorICAgICAgICAgICAgICAgIGZ1biAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSwgQWNjKSB3aGVuIGlzX2xpc3QoU2VydmljZU5hbWUpLCBpc19hdG9tKFNlcnZpY2VNb2R1bGUpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGUsIEFjYyk7CisgICAgICAgICAgICAgICAgICAgIChfLCBfQWNjKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRoZSBzZXJ2aWNlIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tTZXJpY2VOYW1lOjpsaXN0KCksIFNlcnZpY2VNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgICAgICAgICAgICAgIGVuZCwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOm5ldygpLCBTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KTsKKyAgICAgICAgXyAtPiB0aHJvdygiRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgc2VydmljZSBvcHRpb24uIikKKyAgICBlbmQsCisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGVNYXB9KTsKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5zZXJ2aWNlID09IHVuZGVmaW5lZCwgaXNfYXRvbShTZXJ2aWNlKSAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c2VydmljZT1TZXJ2aWNlfSk7CisKIHBhcnNlX29wdGlvbnMoW3ttYXgsIE1heH0gfCBSZXN0XSwgU3RhdGUpIC0+CiAgICAgTWF4SW50ID0gY2FzZSBNYXggb2YKICAgICAgICAgICAgICAgICAgTWF4IHdoZW4gaXNfbGlzdChNYXgpIC0+CkBAIC0xMDMsOCArMTQ5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICBNYXgKICAgICAgICAgICAgICBlbmQsCiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnttYXg9TWF4SW50fSk7CisKK3BhcnNlX29wdGlvbnMoW3twcm90b2NvbCwgUHJvdG99IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2F0b20oUHJvdG8pIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntwcm90b2NvbD1Qcm90b30pOworCiBwYXJzZV9vcHRpb25zKFt7ZnJhbWVkLCBGcmFtZWR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oRnJhbWVkKSAtPgotICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pLgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pOworCitwYXJzZV9vcHRpb25zKFt7c3NsdHJhbnNwb3J0LCBTU0xUcmFuc3BvcnR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oU1NMVHJhbnNwb3J0KSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c3NsdHJhbnNwb3J0PVNTTFRyYW5zcG9ydH0pOworcGFyc2Vfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNTTE9wdGlvbnN9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU1NMT3B0aW9ucykgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NzbG9wdGlvbnM9U1NMT3B0aW9uc30pLgogCiBzdGFydF9zZXJ2ZXIoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye25hbWU9TmFtZX0pIC0+CiAgICAgY2FzZSBOYW1lIG9mCkBAIC0xNjgsMjUgKzIyMywzMiBAQAogICAgIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2FjY2VwdG9yPW51bGx9OwogbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X29wdHM9T3B0cywgZnJhbWVkPUZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfb3B0cz1PcHRzLCBmcmFtZWQ9RnJhbWVkLCBwcm90b2NvbD1Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsdHJhbnNwb3J0PVNzbFRyYW5zcG9ydCwgc3Nsb3B0aW9ucz1Tc2xPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgLT4KICAgICBQaWQgPSBwcm9jX2xpYjpzcGF3bl9saW5rKD9NT0RVTEUsIGFjY2VwdG9yX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWR9XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWQsIFNzbFRyYW5zcG9ydCwgU3NsT3B0aW9ucywgUHJvdG99XSksCiAgICAgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7YWNjZXB0b3I9UGlkfS4KIAotYWNjZXB0b3JfbG9vcCh7U2VydmVyLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIFNvY2tldE9wdHMsIEZyYW1lZH0pCithY2NlcHRvcl9sb29wKHtTZXJ2ZXIsIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgU29ja2V0T3B0cywgRnJhbWVkLCBTc2xUcmFuc3BvcnQsIFNzbE9wdGlvbnMsIFByb3RvfSkKICAgd2hlbiBpc19waWQoU2VydmVyKSwgaXNfbGlzdChTb2NrZXRPcHRzKSAtPgogICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDphY2NlcHQoTGlzdGVuKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKICAgICAgICAge29rLCBTb2NrZXR9IC0+CiAgICAgICAgICAgICBnZW5fc2VydmVyOmNhc3QoU2VydmVyLCB7YWNjZXB0ZWQsIHNlbGYoKX0pLAogICAgICAgICAgICAgUHJvdG9HZW4gPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSAgID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSAgICAgICAgICA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrZXRUcmFuc3BvcnR9ID0gY2FzZSBTc2xUcmFuc3BvcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cywgU3NsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAgICAgICA9IGNhc2UgRnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ICAgICAgICA9IGNhc2UgUHJvdG8gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uIC0+IHRocmlmdF9qc29uX3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgIHRocmlmdF9wcm9jZXNzb3I6aW5pdCh7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn0pOwpAQCAtMjE0LDggKzI3NiwxMSBAQAogaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+CiAgICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9LgogCi10ZXJtaW5hdGUoX1JlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+Cit0ZXJtaW5hdGUoUmVhc29uLCAjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bGlzdGVuPUxpc3RlbiwgcG9ydD1Qb3J0fSkgLT4KICAgICBnZW5fdGNwOmNsb3NlKExpc3RlbiksCisgICAge2JhY2t0cmFjZSwgQnR9ID0gZXJsYW5nOnByb2Nlc3NfaW5mbyhzZWxmKCksIGJhY2t0cmFjZSksCisgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCh7P01PRFVMRSwgP0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NoaWxkX2Vycm9yLCBSZWFzb24sIEJ0fX0pLAogICAgIGNhc2UgUG9ydCA8IDEwMjQgb2YKICAgICAgICAgdHJ1ZSAtPgogICAgICAgICAgICAgY2F0Y2ggZmRzcnY6c3RvcCgpLApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCmluZGV4IDVlMWVmMDIuLmZhMTBlZDAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTIxLDEwMiArMjEsMTU2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLSAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLS1yZWNvcmQoZGF0YSwge3NvY2tldCwKLSAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgotLXR5cGUgc3RhdGUoKSA6OiAjZGF0YXt9LgotLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorLXJlY29yZCh0X3NvY2tldCwgeworICBzb2NrZXQsCisgIHJlY3ZfdGltZW91dD02MDAwMCwKKyAgYnVmZmVyID0gW10KK30pLgogCi1uZXcoU29ja2V0KSAtPgotICAgIG5ldyhTb2NrZXQsIFtdKS4KKy10eXBlIHN0YXRlKCkgOjogI3Rfc29ja2V0e30uCisKKworLXNwZWMgbmV3KFNvY2tldDo6YW55KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFNvY2tldCkgLT4gbmV3KFNvY2tldCwgW10pLgorCistc3BlYyBuZXcoU29ja2V0OjphbnkoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCiAKIG5ldyhTb2NrZXQsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBPcHRzKSBvZgotICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KLSAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KLSAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07Ci0gICAgICAgICAgICBfIC0+Ci0gICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNvY2tldH0KLSAgICAgICAgZW5kLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KLQotJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+Ci0gICAge1RoaXMsIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpfS4KLQotcmVhZChUaGlzID0gI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIGNhc2UgZ2VuX3RjcDpyZWN2KFNvY2tldCwgTGVuLCBUaW1lb3V0KSBvZgotICAgICAgICBFcnIgPSB7ZXJyb3IsIHRpbWVvdXR9IC0+Ci0gICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInJlYWQgdGltZW91dDogcGVlciBjb25uIH5wIiwgW2luZXQ6cGVlcm5hbWUoU29ja2V0KV0pLAotICAgICAgICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAotICAgICAgICAgICAge1RoaXMsIEVycn07Ci0gICAgICAgIERhdGEgLT4KLSAgICAgICAgICAgIHtUaGlzLCBEYXRhfQotICAgIGVuZC4KLQotJSUgV2UgY2FuJ3QgcmVhbGx5IGZsdXNoIC0gZXZlcnl0aGluZyBpcyBmbHVzaGVkIHdoZW4gd2Ugd3JpdGUKLWZsdXNoKFRoaXMpIC0+Ci0gICAge1RoaXMsIG9rfS4KLQotY2xvc2UoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0pIC0+Ci0gICAge1RoaXMsIGdlbl90Y3A6Y2xvc2UoU29ja2V0KX0uCisgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSksCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAogCi0lJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCitwYXJzZV9vcHRzKFt7cmVjdl90aW1lb3V0LCBUaW1lb3V0fXxSZXN0XSwgU3RhdGUpCit3aGVuIGlzX2ludGVnZXIoVGltZW91dCksIFRpbWVvdXQgPiAwIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9zb2NrZXR7cmVjdl90aW1lb3V0ID0gVGltZW91dH0pOworcGFyc2Vfb3B0cyhbe3JlY3ZfdGltZW91dCwgaW5maW5pdHl9fFJlc3RdLCBTdGF0ZSkgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X3NvY2tldHtyZWN2X3RpbWVvdXQgPSBpbmZpbml0eX0pOworcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+CisgIFN0YXRlLgogCiAKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFN0YXRlID0gI3Rfc29ja2V0e2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICBfIC0+IHJlY3YoU3RhdGUsIExlbikKKyAgZW5kLgorCityZWN2KFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldCwgYnVmZmVyID0gQnVmfSwgTGVuKSAtPgorICBjYXNlIGdlbl90Y3A6cmVjdihTb2NrZXQsIDAsIFN0YXRlI3Rfc29ja2V0LnJlY3ZfdGltZW91dCkgb2YKKyAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAorICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAge29rLCBEYXRhfSAtPgorICAgICAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQnVmLCBEYXRhXSksCisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fQorICBlbmQuCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X3NvY2tldHtidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4gcmVhZChTdGF0ZSwgTGVuKTsKKyAgICBYIC0+CisgICAgICBjYXNlIGdlbl90Y3A6cmVjdihTdGF0ZSN0X3NvY2tldC5zb2NrZXQsIExlbiAtIFgsIFN0YXRlI3Rfc29ja2V0LnJlY3ZfdGltZW91dCkgb2YKKyAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgICAgICBnZW5fdGNwOmNsb3NlKFN0YXRlI3Rfc29ja2V0LnNvY2tldCksCisgICAgICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAgICAgIHtvaywgRGF0YX0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gW119LCB7b2ssIDw8QmluYXJ5L2JpbmFyeSwgRGF0YS9iaW5hcnk+Pn19CisgICAgICBlbmQKKyAgZW5kLgorCisKK3dyaXRlKFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+CisgIGNhc2UgZ2VuX3RjcDpzZW5kKFNvY2tldCwgRGF0YSkgb2YKKyAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAorICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAgb2sgLT4ge1N0YXRlLCBva30KKyAgZW5kLgorCisKK2ZsdXNoKFN0YXRlKSAtPgorICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gW119LCBva30uCisKKworY2xvc2UoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSkgLT4KKyAge1N0YXRlLCBnZW5fdGNwOmNsb3NlKFNvY2tldCl9LgorCisKKyUlIGxlZ2FjeSBhcGkuIGxlZnQgZm9yIGNvbXBhdGliaWxpdHkKKwogJSUgVGhlIGZvbGxvd2luZyAibG9jYWwiIHJlY29yZCBpcyBmaWxsZWQgaW4gYnkgcGFyc2VfZmFjdG9yeV9vcHRpb25zLzIKICUlIGJlbG93LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gbmV3X3Byb3RvY29sX2ZhY3RvcnkvMyBpbiBhCiAlJSBwcm9wbGlzdHMtc3R5bGUgb3B0aW9uIGxpc3QuIFRoZXkncmUgcGFyc2VkIGxpa2UgdGhpcyBzbyBpdCBpcyBhbiBPKG4pCiAlJSBvcGVyYXRpb24gaW5zdGVhZCBvZiBPKG5eMikKLS1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7Y29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCi0gICAgICAgICAgICAgICAgICAgICAgIHNvY2tvcHRzID0gW10sCi0gICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IGZhbHNlfSkuCistcmVjb3JkKGZhY3Rvcnlfb3B0cywgeworICBjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKKyAgc29ja29wdHMgPSBbXSwKKyAgZnJhbWVkID0gZmFsc2UKK30pLgogCi1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIE9wdHMpIC0+Ci0gICAgT3B0czsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZD1Cb29sfSk7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KE9wdExpc3QpIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzPU9wdExpc3R9KTsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99IHwgUmVzdF0sIE9wdHMpIHdoZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQ9VE99KS4KK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykgLT4ge0ZhY3RvcnlPcHRzLCBUcmFuc09wdHN9OworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZCA9IEJvb2x9LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBpc19saXN0KE9wdExpc3QpIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHMgPSBPcHRMaXN0fSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0ID0gVE99LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7cmVjdl90aW1lb3V0LCBUT318UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzLCBbe3JlY3ZfdGltZW91dCwgVE99XSArKyBUcmFuc09wdHMpLgogCiAKLSUlCiAlJSBHZW5lcmF0ZXMgYSAidHJhbnNwb3J0IGZhY3RvcnkiIGZ1bmN0aW9uIC0gYSBmdW4gd2hpY2ggcmV0dXJucyBhIHRocmlmdF90cmFuc3BvcnQoKQogJSUgaW5zdGFuY2UuCi0lJSBUaGlzIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKKyUlIFN0YXRlIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKICUlIHRocmlmdCBzZXJ2ZXIgb3ZlciBhIHNvY2tldC4KLSUlCiBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucykgLT4KLSAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSksCi0KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICBTb2NrT3B0cyA9IFtiaW5hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhY2tldCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge2FjdGl2ZSwgZmFsc2V9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlbGF5LCB0cnVlfSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHNdLAotICAgICAgICAgICAgICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KEhvc3QsIFBvcnQsIFNvY2tPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKLSAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrfSAtPgotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2spLAotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKLSAgICAgICAgICAgICAgICAgICAgRXJyb3IgIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgotICAgICAgICAgICAgICAgIGVuZAorICB7RmFjdG9yeU9wdHMsIFRyYW5zT3B0c30gPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9LCBbXSksCisgIHtvaywgZnVuKCkgLT4gU29ja09wdHMgPSBbYmluYXJ5LAorICAgICAge3BhY2tldCwgMH0sCisgICAgICB7YWN0aXZlLCBmYWxzZX0sCisgICAgICB7bm9kZWxheSwgdHJ1ZX18RmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzCisgICAgXSwKKyAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdCgKKyAgICAgIEhvc3QsCisgICAgICBQb3J0LAorICAgICAgU29ja09wdHMsCisgICAgICBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0CisgICAgKSBvZgorICAgICAge29rLCBTb2NrfSAtPgorICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29jaywgVHJhbnNPcHRzKSwKKyAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0gY2FzZSBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCisgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQogICAgICAgICBlbmQsCi0gICAge29rLCBGfS4KKyAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OworICAgICAgRXJyb3IgIC0+IEVycm9yCisgICAgZW5kCisgIGVuZH0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTExNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMTQ3IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKy1tb2R1bGUodGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQpLgorCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCisKKy1leHBvcnQoW25ldy8zLAorICAgICAgICAgd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xLAorCisgICAgICAgICBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvM10pLgorCislJSBFeHBvcnQgb25seSBmb3IgdGhlIHRyYW5zcG9ydCBmYWN0b3J5CistZXhwb3J0KFtuZXcvMl0pLgorCistcmVjb3JkKGRhdGEsIHtzb2NrZXQsCisgICAgICAgICAgICAgICByZWN2X3RpbWVvdXQ9aW5maW5pdHl9KS4KKy10eXBlIHN0YXRlKCkgOjogI2RhdGF7fS4KKworJSUgVGhlIGZvbGxvd2luZyAibG9jYWwiIHJlY29yZCBpcyBmaWxsZWQgaW4gYnkgcGFyc2VfZmFjdG9yeV9vcHRpb25zLzIKKyUlIGJlbG93LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gbmV3X3Byb3RvY29sX2ZhY3RvcnkvMyBpbiBhCislJSBwcm9wbGlzdHMtc3R5bGUgb3B0aW9uIGxpc3QuIFRoZXkncmUgcGFyc2VkIGxpa2UgdGhpcyBzbyBpdCBpcyBhbiBPKG4pCislJSBvcGVyYXRpb24gaW5zdGVhZCBvZiBPKG5eMikKKy1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7Y29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tvcHRzID0gW10sCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBzc2xvcHRpb25zID0gW119KS4KKworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBPcHRzKSAtPgorICAgIE9wdHM7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQ9Qm9vbH0pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRMaXN0KSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cz1PcHRMaXN0fSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfSB8IFJlc3RdLCBPcHRzKSB3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0PVRPfSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzc2xvcHRpb25zLCBTc2xPcHRpb25zfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoU3NsT3B0aW9ucykgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c3Nsb3B0aW9ucz1Tc2xPcHRpb25zfSkuCisKK25ldyhTb2NrZXQsIFNvY2tPcHRzLCBTc2xPcHRpb25zKSB3aGVuIGlzX2xpc3QoU29ja09wdHMpLCBpc19saXN0KFNzbE9wdGlvbnMpIC0+CisgICAgaW5ldDpzZXRvcHRzKFNvY2tldCwgW3thY3RpdmUsIGZhbHNlfV0pLCAlJSA9PiBwcmV2ZW50IHRoZSBzc2wgaGFuZHNoYWtlIG1lc3NhZ2VzIGdldCBsb3N0CisKKyAgICAlJSB1cGdyYWRlIHRvIGFuIHNzbCBzb2NrZXQKKyAgICBjYXNlIGNhdGNoIHNzbDpzc2xfYWNjZXB0KFNvY2tldCwgU3NsT3B0aW9ucykgb2YgJSBpbmZpbml0ZSB0aW1lb3V0CisgICAgICAgIHtvaywgU3NsU29ja2V0fSAtPgorICAgICAgICAgICAgbmV3KFNzbFNvY2tldCwgU29ja09wdHMpOworICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gLT4KKyAgICAgICAgICAgIGV4aXQoe2Vycm9yLCBSZWFzb259KTsKKyAgICAgICAgT3RoZXIgLT4KKyAgICAgICAgICAgIGVycm9yX2xvZ2dlcjplcnJvcl9yZXBvcnQoCisgICAgICAgICAgICAgIFt7YXBwbGljYXRpb24sIHRocmlmdH0sCisgICAgICAgICAgICAgICAiU1NMIGFjY2VwdCBmYWlsZWQgZXJyb3IiLAorICAgICAgICAgICAgICAgbGlzdHM6ZmxhdHRlbihpb19saWI6Zm9ybWF0KCJ+cCIsIFtPdGhlcl0pKV0pLAorICAgICAgICAgICAgZXhpdCh7ZXJyb3IsIHNzbF9hY2NlcHRfZmFpbGVkfSkKKyAgICBlbmQuCisKK25ldyhTc2xTb2NrZXQsIFNvY2tPcHRzKSAtPgorICAgIFN0YXRlID0KKyAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBTb2NrT3B0cykgb2YKKyAgICAgICAgICAgIHt2YWx1ZSwge3JlY3ZfdGltZW91dCwgVGltZW91dH19CisgICAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KKyAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U3NsU29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07CisgICAgICAgICAgICBfIC0+CisgICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNzbFNvY2tldH0KKyAgICAgICAgZW5kLAorICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworJSUgRGF0YSA6OiBpb2xpc3QoKQord3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+CisgICAge1RoaXMsIHNzbDpzZW5kKFNvY2tldCwgRGF0YSl9LgorCityZWFkKFRoaXMgPSAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH0sIExlbikKKyAgd2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgICAgY2FzZSBzc2w6cmVjdihTb2NrZXQsIExlbiwgVGltZW91dCkgb2YKKyAgICAgICAgRXJyID0ge2Vycm9yLCB0aW1lb3V0fSAtPgorICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJyZWFkIHRpbWVvdXQ6IHBlZXIgY29ubiB+cCIsIFtpbmV0OnBlZXJuYW1lKFNvY2tldCldKSwKKyAgICAgICAgICAgIHNzbDpjbG9zZShTb2NrZXQpLAorICAgICAgICAgICAge1RoaXMsIEVycn07CisgICAgICAgIERhdGEgLT4KKyAgICAgICAgICAgIHtUaGlzLCBEYXRhfQorICAgIGVuZC4KKworJSUgV2UgY2FuJ3QgcmVhbGx5IGZsdXNoIC0gZXZlcnl0aGluZyBpcyBmbHVzaGVkIHdoZW4gd2Ugd3JpdGUKK2ZsdXNoKFRoaXMpIC0+CisgICAge1RoaXMsIG9rfS4KKworY2xvc2UoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0pIC0+CisgICAge1RoaXMsIHNzbDpjbG9zZShTb2NrZXQpfS4KKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJQorJSUgR2VuZXJhdGVzIGEgInRyYW5zcG9ydCBmYWN0b3J5IiBmdW5jdGlvbiAtIGEgZnVuIHdoaWNoIHJldHVybnMgYSB0aHJpZnRfdHJhbnNwb3J0KCkKKyUlIGluc3RhbmNlLgorJSUgVGhpcyBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCislJSB0aHJpZnQgc2VydmVyIG92ZXIgYSBzb2NrZXQuCislJQorbmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpIC0+CisgICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30pLAorCisgICAgRiA9IGZ1bigpIC0+CisgICAgICAgICAgICAgICAgU29ja09wdHMgPSBbYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYWNrZXQsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmUsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9kZWxheSwgdHJ1ZX0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzXSwKKyAgICAgICAgICAgICAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdChIb3N0LCBQb3J0LCBTb2NrT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCisgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja30gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNzbFNvY2sgPSBjYXNlIGNhdGNoIHNzbDpjb25uZWN0KFNvY2ssIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNzbG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3NsU29ja2V0fSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsU29ja2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJlcnJvciB3aGlsZSBjb25uZWN0aW5nIG92ZXIgc3NsIC0gcmVhc29uOiB+cH5uIiwgW090aGVyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCBnZW5fdGNwOmNsb3NlKFNvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydDpuZXcoU3NsU29jaywgU29ja09wdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKKyAgICAgICAgICAgICAgICAgICAgRXJyb3IgIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQsCisgICAge29rLCBGfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCmluZGV4IDM5ZjhjMDUuLjI0MTRiZGUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCkBAIC0yMCw1OSArMjAsMTA3IEBACiAtbW9kdWxlKHRocmlmdF90cmFuc3BvcnQpLgogCiAtZXhwb3J0KFtiZWhhdmlvdXJfaW5mby8xXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLWV4cG9ydChbbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLAotICAgICAgICAgcmVhZC8yLAotICAgICAgICAgZmx1c2gvMSwKLSAgICAgICAgIGNsb3NlLzEKLSAgICAgICAgXSkuCistZXhwb3J0X3R5cGUoW3RfdHJhbnNwb3J0LzBdKS4KKwogCiBiZWhhdmlvdXJfaW5mbyhjYWxsYmFja3MpIC0+Ci0gICAgW3tyZWFkLCAyfSwKLSAgICAge3dyaXRlLCAyfSwKLSAgICAge2ZsdXNoLCAxfSwKLSAgICAge2Nsb3NlLCAxfQotICAgIF0uCisgIFt7cmVhZCwgMn0sIHt3cml0ZSwgMn0sIHtmbHVzaCwgMX0sIHtjbG9zZSwgMX1dLgogCi0tcmVjb3JkKHRyYW5zcG9ydCwge21vZHVsZSwgZGF0YX0pLgorCistcmVjb3JkKHRfdHJhbnNwb3J0LCB7CisgIG1vZHVsZSwKKyAgc3RhdGUKK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X3RyYW5zcG9ydHt9LgorLXR5cGUgdF90cmFuc3BvcnQoKSA6OiAjdF90cmFuc3BvcnR7fS4KKwogCiAtaWZkZWYodHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlKS4KIC1kZWZpbmUoZGVidWdfd3JhcChUcmFuc3BvcnQpLAotICAgICAgICBjYXNlIFRyYW5zcG9ydCN0cmFuc3BvcnQubW9kdWxlIG9mCi0gICAgICAgICAgICA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlIC0+Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFJlc3VsdH0gPSA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlOm5ldyhUcmFuc3BvcnQpLAotICAgICAgICAgICAgICAgIFJlc3VsdAotICAgICAgICBlbmQpLgorICBjYXNlIFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5tb2R1bGUgb2YKKyAgICA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlIC0+IFRyYW5zcG9ydDsKKyAgICBfRWxzZSAtPgorICAgICAge29rLCBSZXN1bHR9ID0gP3RyYW5zcG9ydF93cmFwcGVyX21vZHVsZTpuZXcoVHJhbnNwb3J0KSwKKyAgICAgIFJlc3VsdAorICBlbmQKKykuCiAtZWxzZS4KIC1kZWZpbmUoZGVidWdfd3JhcChUcmFuc3BvcnQpLCBUcmFuc3BvcnQpLgogLWVuZGlmLgogCi1uZXcoTW9kdWxlLCBEYXRhKSB3aGVuIGlzX2F0b20oTW9kdWxlKSAtPgotICAgIFRyYW5zcG9ydDAgPSAjdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgZGF0YSA9IERhdGF9LAotICAgIFRyYW5zcG9ydDEgPSA/ZGVidWdfd3JhcChUcmFuc3BvcnQwKSwKLSAgICB7b2ssIFRyYW5zcG9ydDF9LgogCi0tc3BlYyB3cml0ZSgjdHJhbnNwb3J0e30sIGlvbGlzdCgpIHwgYmluYXJ5KCkpIC0+IHsjdHJhbnNwb3J0e30sIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCi13cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+Ci0gICAgTW9kdWxlID0gVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUsCi0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTp3cml0ZShUcmFuc3BvcnQjdHJhbnNwb3J0LmRhdGEsIERhdGEpLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorLXR5cGUgd3JhcHBhYmxlKCkgOjoKKyAgYmluYXJ5KCkgfAorICBsaXN0KCkgfAorICB7bWVtYnVmZmVyLCBiaW5hcnkoKSB8IGxpc3QoKX0gfAorICB7dGNwLCBwb3J0KCl9IHwKKyAge3RjcCwgcG9ydCgpLCBsaXN0KCl9IHwKKyAge2ZpbGUsIGZpbGU6aW9fZGV2aWNlKCl9IHwKKyAge2ZpbGUsIGZpbGU6aW9fZGV2aWNlKCksIGxpc3QoKX0gfAorICB7ZmlsZSwgZmlsZTpmaWxlbmFtZSgpfSB8CisgIHtmaWxlLCBmaWxlOmZpbGVuYW1lKCksIGxpc3QoKX0uCiAKLS1zcGVjIHJlYWQoI3RyYW5zcG9ydHt9LCBub25fbmVnX2ludGVnZXIoKSkgLT4geyN0cmFuc3BvcnR7fSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgTW9kdWxlID0gVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUsCi0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkKFRyYW5zcG9ydCN0cmFuc3BvcnQuZGF0YSwgTGVuKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KKy1zcGVjIG5ldyh3cmFwcGFibGUoKSkgLT4ge29rLCAjdF90cmFuc3BvcnR7fX0uCiAKLS1zcGVjIGZsdXNoKCN0cmFuc3BvcnR7fSkgLT4geyN0cmFuc3BvcnR7fSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KLWZsdXNoKFRyYW5zcG9ydCA9ICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0pIC0+Ci0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpmbHVzaChEYXRhKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KK25ldyh7bWVtYnVmZmVyLCBNZW1idWZmZXJ9KSB3aGVuIGlzX2JpbmFyeShNZW1idWZmZXIpOyBpc19saXN0KE1lbWJ1ZmZlcikgLT4KKyAgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KE1lbWJ1ZmZlcik7CituZXcoe21lbWJ1ZmZlciwgTWVtYnVmZmVyLCBbXX0pIHdoZW4gaXNfYmluYXJ5KE1lbWJ1ZmZlcik7IGlzX2xpc3QoTWVtYnVmZmVyKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoTWVtYnVmZmVyKTsKK25ldyh7dGNwLCBTb2NrZXR9KSB3aGVuIGlzX3BvcnQoU29ja2V0KSAtPgorICBuZXcoe3RjcCwgU29ja2V0LCBbXX0pOworbmV3KHt0Y3AsIFNvY2tldCwgT3B0c30pIHdoZW4gaXNfcG9ydChTb2NrZXQpIC0+CisgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIE9wdHMpOworbmV3KHtmaWxlLCBGaWxlbmFtZX0pIHdoZW4gaXNfbGlzdChGaWxlbmFtZSk7IGlzX2JpbmFyeShGaWxlbmFtZSkgLT4KKyAgbmV3KHtmaWxlLCBGaWxlbmFtZSwgW119KTsKK25ldyh7ZmlsZSwgRmlsZW5hbWUsIE9wdHN9KSB3aGVuIGlzX2xpc3QoRmlsZW5hbWUpOyBpc19iaW5hcnkoRmlsZW5hbWUpIC0+CisgIHtvaywgRmlsZX0gPSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyYXcsIGJpbmFyeV0pLAorICBuZXcoe2ZpbGUsIEZpbGUsIE9wdHN9KTsKK25ldyh7ZmlsZSwgRmlsZSwgT3B0c30pIC0+CisgIHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCiAKLS1zcGVjIGNsb3NlKCN0cmFuc3BvcnR7fSkgLT4geyN0cmFuc3BvcnR7fSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KLWNsb3NlKFRyYW5zcG9ydCA9ICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0pIC0+Ci0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpjbG9zZShEYXRhKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KKy1zcGVjIG5ldyhNb2R1bGU6Om1vZHVsZSgpLCBTdGF0ZTo6YW55KCkpIC0+IHtvaywgI3RfdHJhbnNwb3J0e319LgorCituZXcoTW9kdWxlLCBTdGF0ZSkgd2hlbiBpc19hdG9tKE1vZHVsZSkgLT4KKyAge29rLCA/ZGVidWdfd3JhcCgjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBzdGF0ZSA9IFN0YXRlfSl9LgorCisKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWQoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlLCBMZW4pLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK3JlYWRfZXhhY3QoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGxpc3RzOmtleWZpbmQocmVhZF9leGFjdCwgMSwgTW9kdWxlOm1vZHVsZV9pbmZvKGV4cG9ydHMpKSBvZgorICAgIHtyZWFkX2V4YWN0LCAyfSAtPgorICAgICAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWRfZXhhY3QoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlLCBMZW4pLAorICAgICAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fTsKKyAgICBfIC0+CisgICAgICByZWFkKFRyYW5zcG9ydCwgTGVuKQorICBlbmQuCisKKword3JpdGUoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIERhdGEpIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTp3cml0ZShUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIERhdGEpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK2ZsdXNoKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9KSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6Zmx1c2goVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKworCitjbG9zZShUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOmNsb3NlKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9UaHJpZnQxMTUxLnRocmlmdCBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxMTUxLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjkzNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L1RocmlmdDExNTEudGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IFN0cnVjdEEgeyAxOiBpMTYgeDsgfQorc3RydWN0IFN0cnVjdEIgeyAxOiBpMzIgeDsgfQorc3RydWN0IFN0cnVjdEMgeyAxOiBTdHJ1Y3RBIHg7IH0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9UaHJpZnQxNDc1LnRocmlmdCBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxNDc1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWRlYjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L1RocmlmdDE0NzUudGhyaWZ0CkBAIC0wLDAgKzEsMzQgQEAKK3N0cnVjdCBTdHJ1Y3RCCit7CisgIDE6IHN0cmluZyB4Cit9CisKK3N0cnVjdCBTdHJ1Y3RBCit7CisgIDE6IHN0cmluZyBhLAorICAyOiBiaW5hcnkgYiwKKyAgMzogb3B0aW9uYWwgc3RyaW5nIGMsCisgIDQ6IG9wdGlvbmFsIGJpbmFyeSBkLAorICA1OiByZXF1aXJlZCBzdHJpbmcgZSwKKyAgNjogcmVxdWlyZWQgYmluYXJ5IGYsCisgIDc6IHN0cmluZyBnID0gImZvbyIsCisgIDg6IGkzMiBoLAorICA5OiBvcHRpb25hbCBpMzIgaSwKKyAgMTA6IHJlcXVpcmVkIGkzMiBqLAorICAxMTogcmVxdWlyZWQgaTMyIGsgPSA1LAorICAxMjogZG91YmxlIGwsCisgIDEzOiBvcHRpb25hbCBkb3VibGUgbSwKKyAgMTQ6IHJlcXVpcmVkIGRvdWJsZSBuLAorICAxNTogZG91YmxlIG8gPSAzLjE0MTU5LAorICAxNjogbGlzdDxzdHJpbmc+IHN0cmluZ19saXN0LAorICAxNzogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDE4OiByZXF1aXJlZCBsaXN0PHN0cmluZz4gcnNsLAorICAxOTogb3B0aW9uYWwgbGlzdDxzdHJpbmc+IG9zbCwKKyAgMjA6IHNldDxzdHJpbmc+IHN0cmluZ19zZXQsCisgIDIxOiByZXF1aXJlZCBzZXQ8c3RyaW5nPiByc3MsCisgIDIyOiBvcHRpb25hbCBzZXQ8c3RyaW5nPiBvc3MsCisgIDIzOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHN0cmluZ19tYXAsCisgIDI0OiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IHJzbSwKKyAgMjU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gb3NtLAorICAyNjogU3RydWN0QiBzdHJ1Y3RiCit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZmM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdApAQCAtMCwwICsxLDIyIEBACitzdHJ1Y3QgdGVzdDEgeworICAxOiBpMzIgb25lCisgIDI6IGkzMiB0d28gICAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MiB7CisgIDE6IGkzMiBvbmUKKyAgMjogdGVzdDIgdHdvICAgICAgICAgICAgICAgICAgLy8gb21pdAorICAzOiBpMzIgdGhyZWUKK30KKworc3RydWN0IHRlc3QzIHsKKyAgMTogaTMyIG9uZQorICAyOiBsaXN0PHRlc3QxPiB0d28gICAgICAgICAgICAvLyBvbWl0Cit9CisKK3N0cnVjdCB0ZXN0NCB7CisgIDE6IGkzMiBvbmUKKyAgMjogbWFwPGkzMix0ZXN0MT4gdHdvICAgICAgICAgLy8gb21pdAorfQorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0IGIvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYyNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdApAQCAtMCwwICsxLDMzIEBACitlbnVtIE51bWJlcnoKK3sKKyAgT05FID0gMSwKKyAgVFdPLAorICBUSFJFRSwKKyAgRklWRSA9IDUsCisgIFNJWCwKKyAgRUlHSFQgPSA4Cit9CisKK2NvbnN0IE51bWJlcnogbXlOdW1iZXJ6ID0gTnVtYmVyei5PTkU7CisKK3N0cnVjdCBDYXBpdGFsaXplZFN0cnVjdAoreworICAxOiBpMzIgSWQsCisgIDI6IGJpbmFyeSBtZXNzYWdlCit9CisKK3N0cnVjdCBMaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzCit7CisgIDE6IGxpc3Q8Q2FwaXRhbGl6ZWRTdHJ1Y3Q+IHN0cnVjdHMKK30KKworZXhjZXB0aW9uIFhjZXB0aW9uIHsKKyAgMTogaTMyIGVycm9yQ29kZSwKKyAgMjogYmluYXJ5IG1lc3NhZ2UKK30KKworc2VydmljZSBMZWdhY3lOYW1lcworeworICBMaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzIE5hbWVzKDE6IENhcGl0YWxpemVkU3RydWN0IGZvbywgMjogQ2FwaXRhbGl6ZWRTdHJ1Y3QgYmFyKQorICAgIHRocm93cygxOiBYY2VwdGlvbiBlcnIpCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0IGIvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTEwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzdHJ1Y3QgU3RyaW5nTWFwCit7CisgIDE6IG1hcDxpMzIsIHN0cmluZz4gZGF0YSA9IHsxOiAiYSIsIDI6ICJiIn07Cit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbGVnYWN5X25hbWVzX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZhYTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApAQCAtMCwwICsxLDY5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9sZWdhY3lOYW1lc19jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtjYXBpdGFsaXplZFN0cnVjdCwgXywgX30sCisgICAgICAjY2FwaXRhbGl6ZWRTdHJ1Y3R7aWQ9bnVsbCxtZXNzYWdlPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJjYXBpdGFsaXplZFN0cnVjdCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCAnaWQnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsICdtZXNzYWdlJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQoY2FwaXRhbGl6ZWRTdHJ1Y3QpCisgICAgKX0sCisgICAgeyJsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sICdzdHJ1Y3RzJywgW119CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3R5cGVzOnN0cnVjdF9pbmZvX2V4dChsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5hbWVzIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnbGlzdENhcGl0YWxpemVkU3RydWN0cyd9fSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsibmFtZXMgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAneGNlcHRpb24nfX19XX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc5OTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIE11bHRpcGxleGluZ19DYWxjdWxhdG9yIHsKKyAgICBpMzIgYWRkKDE6IGkzMiB4LCAyOiBpMzIgeSkKK30KKworc2VydmljZSBNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCB7CisgICAgZG91YmxlIGdldFRlbXBlcmF0dXJlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmdfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmQ2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKy1tb2R1bGUobXVsdGlwbGV4aW5nX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1leHBvcnQoWworICAgICBoYW5kbGVfZnVuY3Rpb24vMgorICAgICxoYW5kbGVfZXJyb3IvMgorXSkuCisKK3N0YXJ0X211bHRpcGxleGVkX3NlcnZlcl90ZXN0KCkgLT4KKworICAgIFBvcnQgPSA5MDkwLAorICAgIFNlcnZpY2VzID0gWworICAgICAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IiLCAgICBtdWx0aXBsZXhpbmdfX2NhbGN1bGF0b3JfdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgbXVsdGlwbGV4aW5nX193ZWF0aGVyX3JlcG9ydF90aHJpZnR9CisgICAgICAgICAgICAgICBdLAorCisgICAge29rLCBQaWR9ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoWworICAgICAgICB7aXAsICIxMjcuMC4wLjEifSwKKyAgICAgICAge3BvcnQsIFBvcnR9LAorICAgICAgICB7bmFtZSwgP01PRFVMRX0sCisgICAgICAgIHtzZXJ2aWNlLCBTZXJ2aWNlc30sCisgICAgICAgIHtoYW5kbGVyLCBbCisgICAgICAgICAgICB7ImVycm9yX2hhbmRsZXIiLCAgICAgICAgICAgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgP01PRFVMRX0KKyAgICAgICAgXX0KKyAgICAgXSksCisKKyAgICB7b2ssIFt7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgQ2FsY3VsYXRvckNsaWVudDB9LAorICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQiLCBXZWF0aGVyUmVwb3J0Q2xpZW50MH1dfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXdfbXVsdGlwbGV4ZWQoIjEyNy4wLjAuMSIsIFBvcnQsIFNlcnZpY2VzLCBbXSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxLDEsMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mn19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzQxLCAxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mi4wfX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisKKyAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdG9wKFBpZCkuCisKKyUlIEhBTkRMRSBGVU5DVElPTlMKKworJSUgQ2FsY3VsYXRvciBoYW5kbGVzCitoYW5kbGVfZnVuY3Rpb24oYWRkLCB7WCwgWX0pIC0+CisgICAge3JlcGx5LCBYICsgWX07CisKKyUlIFdlYXRoZXJSZXBvcnQgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGdldFRlbXBlcmF0dXJlLCB7fSkgLT4KKyAgICB7cmVwbHksIDQyLjB9LgorCitoYW5kbGVfZXJyb3IoX0YsIF9SZWFzb24pIC0+CislJSAgICAgP2RlYnVnSGVyZSwgP2RlYnVnVmFsKHtfRiwgX1JlYXNvbn0pLAorICAgIG9rLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L25hbWVfY29uZmxpY3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCkBAIC0wLDAgKzEsMjk5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShuYW1lX2NvbmZsaWN0X3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3VzaW5nLCBfLCBffSwKKyAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9CisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2RlbGVnYXRlLCBfLCBffSwKKyAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KKyAgICApfSwKKyAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2dldCwgX30sCisgICAgICAjZ2V0e3NieXRlPW51bGx9CisgICAgKX0sCisgICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7cGFydGlhbCwgXywgXywgX30sCisgICAgICAjcGFydGlhbHt1c2luZz1udWxsfQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAorICAgICAgIydDbGFzc0FuZFByb3AneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKKyAgICAgICNzZWNvbmRfY2hhbmNleworICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnTk9XX0VBVF9USElTJ3sKKyAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ1RoZUVkZ2VDYXNlJ3sKKyAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKKyAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUcmlja3lfJywgXywgX30sCisgICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ05lc3RlZCd7CisgICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCisgICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKKyAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKKyAgICAgICAgJ05lc3RlZCc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKKyAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHN0cmluZ30sCisgICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX19LAorICAgICAgICB7MiwgYm9vbH0sCisgICAgICAgIHszLCBib29sfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8ocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQ2xhc3NBbmRQcm9wJykKKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTk9XX0VBVF9USElTJykKKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfSx7NSwgYm9vbH0sezYsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RoZUVkZ2VDYXNlJykKKyAgICApfSwKKyAgICB7IlRyaWNreV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdDbGFzc0FuZFByb3AnfX19LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgc2Vjb25kX2NoYW5jZX19fSwKKyAgICAgICAgezMsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOT1dfRUFUX1RISVMnfX19LAorICAgICAgICB7NCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RoZUVkZ2VDYXNlJ319fSwKKyAgICAgICAgezUsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUcmlja3lfJ319fSwKKyAgICAgICAgezYsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnUHJvYmxlbV8nKQorICAgICl9LAorICAgIHsidXNpbmcgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGRvdWJsZSwgc2luZ2xlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBkb3VibGUsIGludGVnZXIsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCh1c2luZykKKyAgICApfSwKKyAgICB7ImRlbGVnYXRlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHBhcnRpYWwsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sIGRlbGVnYXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHVuZGVmaW5lZCwgYm9vbCwgc2J5dGUsIHVuZGVmaW5lZH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fSwgdXNpbmcsICN1c2luZ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgcmVhZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgd3JpdGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChwYXJ0aWFsKQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wZXInLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRScsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRVMnLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX2FuZF90aGlzLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV9fJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0cmlja3ksIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdUcmlja3knLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RyaWNreV8nKQorICAgICl9LAorICAgIHsiTmVzdGVkIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdDbGFzc0FuZFByb3AnCisgICAgICAgIH19LCAnQ2xhc3NBbmRQcm9wJywgIydDbGFzc0FuZFByb3Ane319LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgIHNlY29uZF9jaGFuY2UKKyAgICAgICAgfX0sIHNlY29uZF9jaGFuY2UsICNzZWNvbmRfY2hhbmNle319LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOT1dfRUFUX1RISVMnCisgICAgICAgIH19LCAnTk9XX0VBVF9USElTJywgIydOT1dfRUFUX1RISVMne319LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUaGVFZGdlQ2FzZScKKyAgICAgICAgfX0sICdUaGVFZGdlQ2FzZScsICMnVGhlRWRnZUNhc2Une319LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUcmlja3lfJworICAgICAgICB9fSwgJ1RyaWNreV8nLCAjJ1RyaWNreV8ne319LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOZXN0ZWQnCisgICAgICAgIH19LCAnTmVzdGVkJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWQnKQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHByb2JsZW0sIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdQcm9ibGVtJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdQcm9ibGVtXycpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZXZlbnQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgcGFydGlhbH19fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7ImV2ZW50IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7IkZvbyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7IkZvbyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdQcm9ibGVtXyd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3N0cmVzc19zZXJ2ZXIuZXJsIGIvbGliL2VybC90ZXN0L3N0cmVzc19zZXJ2ZXIuZXJsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2VybC9zcmMvc3RyZXNzX3NlcnZlci5lcmwKcmVuYW1lIHRvIGxpYi9lcmwvdGVzdC9zdHJlc3Nfc2VydmVyLmVybApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfZGlza2xvZy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9kaXNrbG9nLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I2ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfZGlza2xvZy5lcmwKQEAgLTAsMCArMSw5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9kaXNrbG9nKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCitkaXNrbG9nX3Rlc3QoKSAtPgorICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKKyAgICAgIHRlc3RfZGlza2xvZywKKyAgICAgIFt7ZmlsZSwgIi4vdGVzdF9sb2cifSwKKyAgICAgICB7c2l6ZSwgezEwMjQqMTAyNCwgMTB9fV0pLAorICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPQorICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoIFRyYW5zcG9ydEZhY3RvcnksIFtdKSwKKyAge29rLCBQcm90b30gPSBQcm90b2NvbEZhY3RvcnkoKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRfdGVzdF90aHJpZnQpLAorCisgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAorCisgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlIGl0CisgICUgd2lsbCB0cnkgdG8gcmVhZCBmcm9tIHRoZSBkaXNrbG9nIGFuZCBnbyBib29tLgorICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RPbmV3YXksIFsxNiNkZWFkYmVlZl0pLAorICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCisKKyAgJSBVc2UgdGhlIHNlbmRfY2FsbCBtZXRob2QgdG8gd3JpdGUgYSBub24tb25ld2F5IGNhbGwgaW50byB0aGUgbG9nCisgIHtDbGllbnQyLCBva30gPQorICAgIHRocmlmdF9jbGllbnQ6c2VuZF9jYWxsKENsaWVudDEsIHRlc3RTdHJpbmcsIFs8PCJoZWxsbyB3b3JsZCI+Pl0pLAorICBpbzpmb3JtYXQoIk5vbi1vbmV3YXkgY2FsbCBzZW50fm4iKSwKKworICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCisgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCisgIAorICBsaXN0czpmb3JlYWNoKGZ1bihGaWxlKSAtPiBmaWxlOmRlbGV0ZShGaWxlKSBlbmQsIFsKKyAgICAiLi90ZXN0X2xvZy4xIiwKKyAgICAiLi90ZXN0X2xvZy5pZHgiLAorICAgICIuL3Rlc3RfbG9nLnNpeiIKKyAgXSksCisgIGlvOmZvcm1hdCgiQ2xlYW5pbmcgdXAgdGVzdCBmaWxlc35uIiksCisKKyAgb2suCisKK2Rpc2tsb2dfYmFzZTY0X3Rlc3QoKSAtPgorICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKKyAgICAgIHRlc3RfZGlza2xvZywKKyAgICAgIFt7ZmlsZSwgIi4vdGVzdF9iNjRfbG9nIn0sCisgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKKyAge29rLCBCNjRGYWN0b3J5fSA9CisgICAgdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnkpLAorICB7b2ssIEJ1ZkZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShCNjRGYWN0b3J5KSwKKyAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KEJ1ZkZhY3RvcnksIFtdKSwKKyAge29rLCBQcm90b30gPSBQcm90b2NvbEZhY3RvcnkoKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRfdGVzdF90aHJpZnQpLAorCisgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAorCisgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlCisgICUgaXQgd2lsbCB0cnkgdG8gcmVhZCBmcm9tIHRoZSBkaXNrbG9nIGFuZCBnbyBib29tLgorICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RPbmV3YXksIFsxNiNkZWFkYmVlZl0pLAorICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCisKKyAgJSBVc2UgdGhlIHNlbmRfY2FsbCBtZXRob2QgdG8gd3JpdGUgYSBub24tb25ld2F5IGNhbGwgaW50byB0aGUgbG9nCisgIHtDbGllbnQyLCBva30gPQorICAgIHRocmlmdF9jbGllbnQ6c2VuZF9jYWxsKENsaWVudDEsIHRlc3RTdHJpbmcsIFs8PCJoZWxsbyB3b3JsZCI+Pl0pLAorICBpbzpmb3JtYXQoIk5vbi1vbmV3YXkgY2FsbCBzZW50fm4iKSwKKworICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCisgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCisKKyAgbGlzdHM6Zm9yZWFjaChmdW4oRmlsZSkgLT4gZmlsZTpkZWxldGUoRmlsZSkgZW5kLCBbCisgICAgIi4vdGVzdF9iNjRfbG9nLjEiLAorICAgICIuL3Rlc3RfYjY0X2xvZy5pZHgiLAorICAgICIuL3Rlc3RfYjY0X2xvZy5zaXoiCisgIF0pLAorICBpbzpmb3JtYXQoIkNsZWFuaW5nIHVwIHRlc3QgZmlsZXN+biIpLAorCisgIG9rLgorCistZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X29taXQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODQxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApAQCAtMCwwICsxLDc5IEBACistbW9kdWxlKHRlc3Rfb21pdCkuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF9vbWl0X3dpdGhfdHlwZXMuaHJsIikuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworb21pdF9zdHJ1Y3QxX3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBiYXNpYyB0eXBlIChhbiBpMzIpLgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDF7b25lID0gMSwgdHdvID0gMiwgdGhyZWUgPSAzfSwKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9zdHJ1Y3QyX3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBzdHJ1Y3QuCisgIEEgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0aHJlZSA9IDMwfSwgdGhyZWUgPSAzfSwKKyAgQiA9ICN0ZXN0MntvbmUgPSAxLCB0d28gPSAjdGVzdDJ7b25lID0gMTAsIHR3byA9ICN0ZXN0MntvbmUgPSAxMDB9LCB0aHJlZSA9IDMwfSwgdGhyZWUgPSAzfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSwgQX0pLAorICB7UDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzApKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzApKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzApKSwKKworICB7UDMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMiwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEIpfX0sIEJ9KSwKKyAge19QNCwge29rLCBPMX19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDMsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMSkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMSkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMSkpLAorCisgIG9rLgorCitvbWl0X2xpc3RfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIGxpc3QuCisgIEEgPSAjdGVzdDF7b25lID0gMSwgdHdvID0gMiwgdGhyZWUgPSAzfSwKKyAgQiA9ICN0ZXN0M3tvbmUgPSAxLCB0d28gPSBbIEEgXX0sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEIpfX0sIEJ9KSwKKyAge19QMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEIpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBCKSwgZWxlbWVudCgyLCBPMCkpLAorCisgIG9rLgorCitvbWl0X21hcF90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgbWFwLgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDR7b25lID0gMSwgdHdvID0gZGljdDpmcm9tX2xpc3QoWyB7MiwgQX0gXSl9LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworLWVuZGlmLiAlJSBURVNUCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApAQCAtMCwwICsxLDY4IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL2RvdWJsZV9jb25zdGFudHNfdGVzdF9jb25zdGFudHMuaHJsIikuCisKKy1kZWZpbmUoRVBTSUxPTiwgMC4wMDAwMDAxKS4KKworcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50c190ZXN0KCkgLT4KKyAgP2Fzc2VydChhYnMoMS4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxMDAwMDAwLjEgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEuN2UrMzA4IC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoOTIyMzM3MjAzNjg1NDc3NTgxNi40MyAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEuN2UrMzA4IC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKS4KKworcmVuZGVyZWRfZG91YmxlX2xpc3RfdGVzdCgpIC0+CisgID9hc3NlcnRFcXVhbCgxMiwgbGVuZ3RoKD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpLAorICA/YXNzZXJ0KGFicygxLjAgLSBsaXN0czpudGgoMSwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwLjAgLSBsaXN0czpudGgoMiwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxMDAuMCAtIGxpc3RzOm50aCgzLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtIGxpc3RzOm50aCg0LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNSwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygzLjE0MTU5MjY1MzU5IC0gbGlzdHM6bnRoKDYsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gbGlzdHM6bnRoKDcsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMDAwMDAuMSAtIGxpc3RzOm50aCg4LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEuN2UrMzA4IC0gbGlzdHM6bnRoKDksID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEuN2UrMzA4IC0gbGlzdHM6bnRoKDEwLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSBsaXN0czpudGgoMTEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSBsaXN0czpudGgoMTIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKS4KKworLWVuZGlmLiAlJSBURVNUClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTkxMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMTE1MS5lcmwKQEAgLTAsMCArMSwzNCBAQAorLW1vZHVsZSh0ZXN0X3RocmlmdF8xMTUxKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0MTE1MV90eXBlcy5ocmwiKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCit1bm1hdGNoZWRfc3RydWN0X3Rlc3QoKSAtPgorICBTMSA9ICMnU3RydWN0Qyd7eD0jJ1N0cnVjdEIne3g9MX19LAorICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKKyAge29rLCBQcm90b2NvbH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorICA/YXNzZXJ0RXhjZXB0aW9uKAorICAgIGVycm9yLAorICAgIHN0cnVjdF91bm1hdGNoZWQsCisgICAgdGhyaWZ0X3Byb3RvY29sOndyaXRlKAorICAgICAgUHJvdG9jb2wsCisgICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdTdHJ1Y3RDJykpfSwgUzF9CisgICAgKQorICApLgorCitiYWRhcmdfdGVzdCgpIC0+CisgIFMyID0gIydTdHJ1Y3RDJ3t4PSMnU3RydWN0QSd7eD0iMSJ9fSwKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCisgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKyAgP2Fzc2VydEV4Y2VwdGlvbigKKyAgICBlcnJvciwKKyAgICBiYWRhcmcsCisgICAgdGhyaWZ0X3Byb3RvY29sOndyaXRlKAorICAgICAgUHJvdG9jb2wsCisgICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdTdHJ1Y3RDJykpfSwgUzJ9CisgICAgKQorICApLgorCistZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5NTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8zMjE0LmVybApAQCAtMCwwICsxLDYwIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF8zMjE0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnQzMjE0X3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaWZuZGVmKG90cDE2X29yX2xlc3MpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7IlN0cmluZ01hcCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydTdHJpbmdNYXAnLCBffSwKKyAgICAgICMnU3RyaW5nTWFwJ3tkYXRhPSN7NTAgPT4gImZvbyJ9fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBkZWZhdWx0cyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsICN7MSA9PiAiYSIsIDIgPT4gImIifX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBkaWN0IGZyb20gbGlzdCIsID9fYXNzZXJ0Tm90RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsIGRpY3Q6ZnJvbV9saXN0KFt7MSwgImEifSwgezIsICJiIn1dKX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9LAorICAgIHsiU3RyaW5nTWFwIHJlY29yZCBtYXAgZnJvbSBsaXN0IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHsnU3RyaW5nTWFwJywgbWFwczpmcm9tX2xpc3QoW3sxLCAiYSJ9LCB7MiwgImIifV0pfSwKKyAgICAgICMnU3RyaW5nTWFwJ3t9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJTdHJpbmdNYXAgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgc3RyaW5nfSwgJ2RhdGEnLCAjezEgPT4gImEiLCAyID0+ICJiIn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdDMyMTRfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdTdHJpbmdNYXAnKQorICAgICl9CisgIF0uCisKKy1lbmRpZi4KKy1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMzU5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZChGcmFtZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpyZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCit3cml0ZShGcmFtZWQsIERhdGEpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCA8PCJoYWxsbyB3b3JsZCI+Pl0KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0sCisgICAgICBvaworICAgIH0sCisgICAgY2xvc2Uoe3RfYnVmZmVyZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdCisgICAgfSkKKyAgKX0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMjE5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KK25ldygpIC0+CisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3QoKSAtPgorICBuZXcodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkpLgorCit3cml0ZShUaGlzLCBWYWx1ZSkgLT4gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFRoaXMsIFZhbHVlKS4KK3JlYWQoVGhpcywgVHlwZSkgLT4gdGhyaWZ0X3Byb3RvY29sOnJlYWQoVGhpcywgVHlwZSkuCisKK3N0cihUaGlzMCwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7c3RyaW5nLCBWYWx1ZTB9KSwKKyAge1RoaXMyLCB7b2ssIFZhbHVlMX19ID0gcmVhZChUaGlzMSwgc3RyaW5nKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgYmluYXJ5X3RvX2xpc3QoVmFsdWUxKSksCisgIHtUaGlzMiwgb2t9Lgorc3RyaW5nX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IHN0cihUaGlzMCwgImFhYSIpLAorICB7VGhpczIsIG9rfSA9IHN0cihUaGlzMSwgIiIpLAorICB7VGhpczIsIG9rfS4KKworcm91bmRfdHJpcChUaGlzMCwgVHlwZSwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7VHlwZSwgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIFR5cGUpLAorICA/YXNzZXJ0RXF1YWwoVmFsdWUwLCBWYWx1ZTEpLAorICB7VGhpczIsIG9rfS4KKworYm9vbF90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSByb3VuZF90cmlwKFRoaXMwLCBib29sLCB0cnVlKSwKKyAge1RoaXMyLCBva30gPSByb3VuZF90cmlwKFRoaXMxLCBib29sLCBmYWxzZSksCisgIHtUaGlzMiwgb2t9LgorCitieXRlKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGJ5dGUsIFZhbHVlMCkuCitieXRlX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGJ5dGUoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGJ5dGUoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBieXRlKFRoaXMyLCAtMSksCisgIHtUaGlzNCwgb2t9ID0gYnl0ZShUaGlzMywgLTEyOCksCisgIHtUaGlzNCwgb2t9LgorCitpMTYoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTE2LCBWYWx1ZTApLgoraTE2X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkxNihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTE2KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTE2KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTE2KFRoaXMzLCAtMSksCisgIHtUaGlzNSwgb2t9ID0gaTE2KFRoaXM0LCAtMTI4KSwKKyAge1RoaXM2LCBva30gPSBpMTYoVGhpczUsIC0zMDAwMCksCisgIHtUaGlzNiwgb2t9LgorCitpMzIoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTMyLCBWYWx1ZTApLgoraTMyX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkzMihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTMyKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTMyKFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTMyKFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpMzIoVGhpczQsIC0xKSwKKyAge1RoaXM2LCBva30gPSBpMzIoVGhpczUsIC0xMjgpLAorICB7VGhpczcsIG9rfSA9IGkzMihUaGlzNiwgLTMwMDAwKSwKKyAge1RoaXM4LCBva30gPSBpMzIoVGhpczcsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXM4LCBva30uCisKK2k2NChUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBpNjQsIFZhbHVlMCkuCitpNjRfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gaTY0KFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBpNjQoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBpNjQoVGhpczIsIDMwMDAwKSwKKyAge1RoaXM0LCBva30gPSBpNjQoVGhpczMsIDIwMDAwMDAwMDIpLAorICB7VGhpczUsIG9rfSA9IGk2NChUaGlzNCwgMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXM2LCBva30gPSBpNjQoVGhpczUsIC0xKSwKKyAge1RoaXM3LCBva30gPSBpNjQoVGhpczYsIC0xMjgpLAorICB7VGhpczgsIG9rfSA9IGk2NChUaGlzNywgLTMwMDAwKSwKKyAge1RoaXM5LCBva30gPSBpNjQoVGhpczgsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXMxMCwgb2t9ID0gaTY0KFRoaXM5LCAtMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXMxMCwgb2t9LgorCitzdHJ1Y3RfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2J5dGUsIDQyfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisgIHtQNiwgb2t9ID0gd3JpdGUoUDUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDIiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtieXRlLCAzfSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsIGZpZWxkX2VuZCksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ynl0ZSwgOH0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgNDJ9fSA9IHJlYWQoUDE3LCBieXRlKSwKKyAge1AxOSwgb2t9ID0gcmVhZChQMTgsIGZpZWxkX2VuZCksCisgIHtQMjAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgM319ID0gcmVhZChQMjAsIGJ5dGUpLAorICB7UDIyLCBva30gPSByZWFkKFAyMSwgZmllbGRfZW5kKSwKKyAge1AyMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCA4fX0gPSByZWFkKFAyMywgYnl0ZSksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK2Jvb2xfZmllbGRfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMX0pLAorICB7UDQsIG9rfSA9IHdyaXRlKFAzLCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtib29sLCBmYWxzZX0pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxIH19ID0gcmVhZChQMTYsIGZpZWxkX2JlZ2luKSwKKyAge1AxOCwge29rLCB0cnVlfX0gPSByZWFkKFAxNywgYm9vbCksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgZmFsc2V9fSA9IHJlYWQoUDIwLCBib29sKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCB0cnVlfX0gPSByZWFkKFAyMywgYm9vbCksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK25lc3RpbmdfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTR9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKworICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjh9KSwKKyAge1A3LCBva30gPSB3cml0ZShQNiwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMl8xIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwfSksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsIHtib29sLCBmYWxzZX0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwgZmllbGRfZW5kKSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9zdG9wKSwKKyAge1AxMiwgb2t9ID0gd3JpdGUoUDExLCBzdHJ1Y3RfZW5kKSwKKyAge1AxMywgb2t9ID0gd3JpdGUoUDEyLCBmaWVsZF9lbmQpLAorCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDE1LCBva30gPSB3cml0ZShQMTQsIHtib29sLCB0cnVlfSksCisgIHtQMTYsIG9rfSA9IHdyaXRlKFAxNSwgZmllbGRfZW5kKSwKKyAge1AxNywgb2t9ID0gd3JpdGUoUDE2LCBmaWVsZF9zdG9wKSwKKyAge1AxOCwgb2t9ID0gd3JpdGUoUDE3LCBzdHJ1Y3RfZW5kKSwKKyAge1AxOSwgb2t9ID0gd3JpdGUoUDE4LCBtZXNzYWdlX2VuZCksCisKKyAge1AyMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57IG5hbWUgPSAiTWVzc2FnZTEiLCB0eXBlID0gP3RUeXBlX0k4LCBzZXFpZCA9IDN9fSA9IHJlYWQoUDE5LCBtZXNzYWdlX2JlZ2luKSwKKyAge1AyMSwgb2t9ID0gcmVhZChQMjAsIHN0cnVjdF9iZWdpbiksCisgIHtQMjIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0IH19ID0gcmVhZChQMjEsIGZpZWxkX2JlZ2luKSwKKyAge1AyMywge29rLCB0cnVlfX0gPSByZWFkKFAyMiwgYm9vbCksCisgIHtQMjQsIG9rfSA9IHJlYWQoUDIzLCBmaWVsZF9lbmQpLAorCisgIHtQMjUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjggfX0gPSByZWFkKFAyNCwgZmllbGRfYmVnaW4pLAorICB7UDI2LCBva30gPSByZWFkKFAyNSwgc3RydWN0X2JlZ2luKSwKKyAge1AyNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMzAwMDAgfX0gPSByZWFkKFAyNiwgZmllbGRfYmVnaW4pLAorICB7UDI4LCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyNywgYm9vbCksCisgIHtQMjksIG9rfSA9IHJlYWQoUDI4LCBmaWVsZF9lbmQpLAorICB7UDMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDI5LCBmaWVsZF9iZWdpbiksCisgIHtQMzEsIG9rfSA9IHJlYWQoUDMwLCBzdHJ1Y3RfZW5kKSwKKyAge1AzMiwgb2t9ID0gcmVhZChQMzEsIGZpZWxkX2VuZCksCisKKyAge1AzMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDIgfX0gPSByZWFkKFAzMiwgZmllbGRfYmVnaW4pLAorICB7UDM0LCB7b2ssIHRydWV9fSA9IHJlYWQoUDMzLCBib29sKSwKKyAge1AzNSwgb2t9ID0gcmVhZChQMzQsIGZpZWxkX2VuZCksCisgIHtQMzYsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVE9QIH19ID0gcmVhZChQMzUsIGZpZWxkX2JlZ2luKSwKKyAge1AzNywgb2t9ID0gcmVhZChQMzYsIHN0cnVjdF9lbmQpLAorICB7UDM4LCBva30gPSByZWFkKFAzNywgbWVzc2FnZV9lbmQpLAorICB7UDM4LCBva30uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDIxMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhGaWxlKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUpLgorbmV3KEZpbGUsIE9wdHMpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gcmVhZCBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgcmVhZH1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3ttb2RlLCB3cml0ZX1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gc2hvdWxkX2Nsb3NlIHRydWUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSBmYWxzZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIGZhbHNlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIGZhbHNlfV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZChGaWxlLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZF9leGFjdChGaWxlLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKEZpbGUsIERhdGEpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDp3cml0ZShGaWxlLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgd3JpdGUsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIHdyaXRlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZmlsZSwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChmaWxlLCBzeW5jLCBmdW4oX0ZpbGUpIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7ImZsdXNoIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICBmbHVzaCh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsNDA0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCB7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sPDwiaGFsbG8gd29ybGQiPj5dLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtlcnJvciwgZW9mfQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDp3cml0ZShGcmFtZWQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIFsKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCBbPDwwLCAwLCAwLCAxMT4+LCA8PCJoYWxsbyB3b3JsZCI+Pl1dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICBbXSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICB7e3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2ZyYW1lZCwKKyAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgW10sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE2NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkuCituZXcoRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KERhdGEpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgW119fX0sCisgICAgICBuZXcoKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8Pj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDw+Pl19fX0sCisgICAgICBuZXcoPDw+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBbXSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KFtdKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8XCJoYWxsbyB3b3JsZFwiPj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfX19LAorICAgICAgbmV3KDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIFwiaGFsbG8gd29ybGRcIiIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9fX0sCisgICAgICBuZXcoImhhbGxvIHdvcmxkIikKKyAgICApfQorICBdLgorCisKK3JlYWQoTWVtYnVmZmVyLCBCeXRlcykgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChNZW1idWZmZXIsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCA2NTUzNikKKyAgICApfQorICBdLgorCisKK3dyaXRlKE1lbWJ1ZmZlciwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoTWVtYnVmZmVyLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIFtdXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFsiaGFsbG8gd29ybGQiLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PD4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sICJoYWxsbyB3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgIndvcmxkIikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIDw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sIDw8IndvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgWyJoYWxsbyIsICIgIl19LCA8PCJ3b3JsZCI+PikKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9tZW1idWZmZXIsIFtdfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X21lbWJ1ZmZlciwgX30sIG9rfSwKKyAgICBjbG9zZSh7dF9tZW1idWZmZXIsIFtdfSkKKyAgKX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzBmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxOTkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhTb2NrZXQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQpLgorbmV3KFNvY2tldCwgT3B0cykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQpCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggbm8gb3B0aW9ucyIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW10pCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggaW50ZWdlciB0aW1lb3V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDUwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFt7cmVjdl90aW1lb3V0LCA1MDAwfV0pCisgICAgKX0sCisgICAgeyJuZXcgc29ja2V0IHdpdGggaW5maW5pdHkgdGltZW91dCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCBpbmZpbml0eSwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW3tyZWN2X3RpbWVvdXQsIGluZmluaXR5fV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKFNvY2tldCwgQnl0ZXMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OnJlYWQoU29ja2V0LCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgcmVjdiwgZnVuKEJpbiwgMCwgXykgLT4ge29rLCBCaW59IGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIF99LCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PD4+fSwge29rLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCA2IGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8IndvcmxkIj4+fSwge29rLCA8PCJoYWxsbyAiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNjU1MzYpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KFNvY2tldCwgQnl0ZXMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoU29ja2V0LCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgcmVjdiwgZnVuKEJpbiwgTiwgXykgLT4KKyAgICAgICAgY2FzZSBOIG9mCisgICAgICAgICAgMCAtPiB7b2ssIEJpbn07CisgICAgICAgICAgMSAtPiB7b2ssIDw8ImgiPj59OworICAgICAgICAgIE4gd2hlbiBOID4gMiAtPiB7ZXJyb3IsIHRpbWVvdXR9CisgICAgICAgIGVuZAorICAgICAgZW5kKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsicmVhZF9leGFjdCB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBffSwge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge2Vycm9yLCB0aW1lb3V0fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCAxIGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8iPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDYgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7b2ssIDw8Im1vcmUgaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8iPj4sIDYwMDAwLCA8PCJtb3JlICI+Pn0sIDYpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCBhIHppbGxpb24gYnl0ZXMgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImhhbGxvIj4+fSwge2Vycm9yLCB0aW1lb3V0fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDY1NTM2KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKword3JpdGUoU29ja2V0LCBEYXRhKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDp3cml0ZShTb2NrZXQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBzZW5kLCBmdW4oXywgXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgW10pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCA8PD4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgImhhbGxvIHdvcmxkIikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgIGZsdXNoKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIGNsb3NlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE4Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNDkgQEAKKy1tb2R1bGUgKHRocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlICgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKworcGFyc2VfaGFuZGxlcl9vcHRpb25zX3Rlc3RfKCkgLT4KKyAgICBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0ID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgTWlzc2luZ0Vycm9ySGFuZGxlck9wdGlvbkxpc3QgICA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgV3JvbmdTZXJ2aWNlMkhhbmRsZXJPcHRpb25MaXN0ICA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgIk1vZHVsZSJ9XSwKKyAgICBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0ICAgICAgID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7J3NlcnZpY2UxJywgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgQ29ycmVjdEhhbmRsZXJUZXN0RnVuY3Rpb24gPSBmdW4oKSAtPgorICAgICAgICA/YXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSksCisgICAgICAgIHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sIEhhbmRsZXJMaXN0LF8sXyxfLF8sXyxfLF8sXyxfLF99ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSksCisgICAgICAgIGxpc3RzOmZvcmVhY2goZnVuCisgICAgICAgICAgICAoe1NlcnZpY2VOYW1lLCBIYW5kbGVyTW9kdWxlfSkgLT4KKyAgICAgICAgICAgICAgICA/YXNzZXJ0TWF0Y2goe29rLCBIYW5kbGVyTW9kdWxlfSB3aGVuIGlzX2F0b20oSGFuZGxlck1vZHVsZSksIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKFNlcnZpY2VOYW1lLCBIYW5kbGVyTGlzdCkpCisgICAgICAgIGVuZCwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdCkKKyAgICBlbmQsCisgICAgWworICAgICB7IkJhZCBhcmd1bWVudCBmb3IgdGhlIGhhbmRsZXIgb3B0aW9uIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgdGhlIGhhbmRsZXIgb3B0aW9uIHR3aWNlIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgP01PRFVMRX0sIHtoYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiUGFyc2UgdGhlIGhhbmRsZXIgb3B0aW9uIGFzIGEgbm9uIG11bHRpcGxleGVkIHNlcnZpY2UgaGFuZGxlciIsID9fYXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyw/TU9EVUxFLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgP01PRFVMRX1dKSl9LAorICAgICB7Ik5vIGVycm9yIGhhbmRsZXIgd2FzIGRlZmluZWQiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBNaXNzaW5nRXJyb3JIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBoYW5kbGVyIG1vZHVsZSBmb3IgU2VydmljZTIiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBXcm9uZ1NlcnZpY2UySGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBrZXkgZm9yIFNlcnZpY2UxIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSBhIGNvcnJlY3QgaGFuZGxlciBvcHRpb24gbGlzdCIsIENvcnJlY3RIYW5kbGVyVGVzdEZ1bmN0aW9ufQorICAgIF0uCisKK3BhcnNlX3NlcnZpY2Vfb3B0aW9uc190ZXN0XygpIC0+CisgICAgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0ID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBXcm9uZ1NlcnZpY2UyTW9kdWxlT3B0aW9uTGlzdCAgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgInRocmlmdF9zZXJ2aWNlX21vZHVsZSJ9XSwKKyAgICBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0ICAgICAgID0gW3snc2VydmljZTEnLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBDb3JyZWN0U2VydmljZU1vZHVsZVRlc3RGdW5jdGlvbiA9IGZ1bigpIC0+CisgICAgICAgID9hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSkpLAorICAgICAgICB7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXywgU2VydmljZU1vZHVsZUxpc3QsXyxfLF8sXyxfLF8sXyxfLF8sXyxffSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSksCisgICAgICAgIGxpc3RzOmZvcmVhY2goZnVuCisgICAgICAgICAgICAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSkgLT4KKyAgICAgICAgICAgICAgICA/YXNzZXJ0TWF0Y2goe29rLCBTZXJ2aWNlTW9kdWxlfSB3aGVuIGlzX2F0b20oU2VydmljZU1vZHVsZSksIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKFNlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlTGlzdCkpCisgICAgICAgIGVuZCwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0KQorICAgIGVuZCwKKyAgICBbCisgICAgIHsiQmFkIGFyZ3VtZW50IGZvciB0aGUgc2VydmljZSBvcHRpb24iLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBbXX1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSB0aGUgc2VydmljZSBvcHRpb24gdHdpY2UiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCA/TU9EVUxFfSwge3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlBhcnNlIGEgc2VydmljZSBtb2R1bGUgZm9yIGEgbm9uIG11bHRpcGxleGVkIHNlcnZpY2UiLCA/X2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLD9NT0RVTEUsXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsID9NT0RVTEV9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBtb2R1bGUgZm9yIFNlcnZpY2UyIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgV3JvbmdTZXJ2aWNlMk1vZHVsZU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgc2VydmljZSBrZXkgZm9yIFNlcnZpY2UxIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSBhIGNvcnJlY3Qgc2VydmljZSBvcHRpb24gbGlzdCIsIENvcnJlY3RTZXJ2aWNlTW9kdWxlVGVzdEZ1bmN0aW9ufQorICAgIF0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybApAQCAtMCwwICsxLDY0MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKyUgZG9uJ3QgcmVuYW1lIHRoaXMgdGhyaWZ0X3Rlc3QsIGl0IGNsb2JiZXJzIGdlbmVyYXRlZCBmaWxlcworLW1vZHVsZSh0aHJpZnRfdGVzdF90ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworY29uc3RhbnRfdGVzdF8oKSAtPgorICBbCisgICAgeyJteU51bWJlcnogZXF1YWxzIDEiLCA/X2Fzc2VydEVxdWFsKDEsID9USFJJRlRfVEVTVF9NWU5VTUJFUlopfQorICBdLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7IkJvbmsgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9uaycsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb25rJ3ttZXNzYWdlPW51bGwsdHlwZT1udWxsfQorICAgICl9LAorICAgIHsiQm9vbHMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9vbHMnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9vbHMne2ltX3RydWU9bnVsbCxpbV9mYWxzZT1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdCcsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZz1udWxsLGJ5dGVfdGhpbmc9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0MicsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3QyJ3tieXRlX3RoaW5nPW51bGwsc3RydWN0X3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdDMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0Myd7c3RyaW5nX3RoaW5nPW51bGwsY2hhbmdlZD1udWxsLGkzMl90aGluZz1udWxsLGk2NF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiSW5zYW5pdHkgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuSW5zYW5pdHknLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkne3VzZXJNYXA9bnVsbCx4dHJ1Y3RzPW51bGx9CisgICAgKX0sCisgICAgeyJDcmF6eU5lc3RpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZyd7CisgICAgICAgIHN0cmluZ19maWVsZD1udWxsLAorICAgICAgICBzZXRfZmllbGQ9bnVsbCwKKyAgICAgICAgbGlzdF9maWVsZD1udWxsLAorICAgICAgICBiaW5hcnlfZmllbGQ9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiWGNlcHRpb24gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWGNlcHRpb24nLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZT1udWxsLG1lc3NhZ2U9bnVsbH0KKyAgICApfSwKKyAgICB7IlhjZXB0aW9uMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YY2VwdGlvbjInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGU9bnVsbCxzdHJ1Y3RfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7IkVtcHR5U3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd9LCAjJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J3t9KX0sCisgICAgeyJPbmVGaWVsZCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuT25lRmllbGQnLCBffSwgIyd0aHJpZnQudGVzdC5PbmVGaWVsZCd7ZmllbGQ9bnVsbH0pfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMScsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJ3tiZWdpbl9pbl9ib3RoPW51bGwsb2xkX3N0cmluZz1udWxsLGVuZF9pbl9ib3RoPW51bGx9CisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7CisgICAgICAgIGJlZ2luX2luX2JvdGg9bnVsbCwKKyAgICAgICAgbmV3aW50PW51bGwsCisgICAgICAgIG5ld2J5dGU9bnVsbCwKKyAgICAgICAgbmV3c2hvcnQ9bnVsbCwKKyAgICAgICAgbmV3bG9uZz1udWxsLAorICAgICAgICBuZXdkb3VibGU9bnVsbCwKKyAgICAgICAgbmV3c3RydWN0PW51bGwsCisgICAgICAgIG5ld2xpc3Q9bnVsbCwKKyAgICAgICAgbmV3c2V0PW51bGwsCisgICAgICAgIG5ld21hcD1udWxsLAorICAgICAgICBuZXdzdHJpbmc9bnVsbCwKKyAgICAgICAgZW5kX2luX2JvdGg9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEne215aW50cz1udWxsLGhlbGxvPW51bGx9CisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMid7c3RyaW5ncz1udWxsLGhlbGxvPW51bGx9CisgICAgKX0sCisgICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3QnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCd7bWFwX2ZpZWxkPW51bGx9CisgICAgKX0sCisgICAgeyJMYXJnZURlbHRhcyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MYXJnZURlbHRhcycsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MYXJnZURlbHRhcyd7CisgICAgICAgIGIxPW51bGwsCisgICAgICAgIGIxMD1udWxsLAorICAgICAgICBiMTAwPW51bGwsCisgICAgICAgIGNoZWNrX3RydWU9bnVsbCwKKyAgICAgICAgYjEwMDA9bnVsbCwKKyAgICAgICAgY2hlY2tfZmFsc2U9bnVsbCwKKyAgICAgICAgdmVydHdvMjAwMD1udWxsLAorICAgICAgICBhX3NldDI1MDA9bnVsbCwKKyAgICAgICAgdmVydHdvMzAwMD1udWxsLAorICAgICAgICBiaWdfbnVtYmVycz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDInLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4Mid7aW50ZWdlcmxpc3Q9bnVsbH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MycsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJ3tpbnRlZ2VybGlzdD1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkTWl4ZWR4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDIneworICAgICAgICBpbnRfc2V0X2xpc3Q9bnVsbCwKKyAgICAgICAgbWFwX2ludF9zdHJzZXQ9bnVsbCwKKyAgICAgICAgbWFwX2ludF9zdHJzZXRfbGlzdD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJMaXN0Qm9ua3MgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0Lkxpc3RCb25rcycsIF99LCAjJ3RocmlmdC50ZXN0Lkxpc3RCb25rcyd7Ym9uaz1udWxsfSl9LAorICAgIHsiTmVzdGVkTGlzdHNCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uaycsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0Jvbmsne2Jvbms9bnVsbH0KKyAgICApfSwKKyAgICB7IkJvb2xUZXN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvb2xUZXN0JywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvb2xUZXN0J3tiPW51bGwscz1udWxsfQorICAgICl9LAorICAgIHsiU3RydWN0QSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuU3RydWN0QScsIF99LCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne3M9bnVsbH0pfSwKKyAgICB7IlN0cnVjdEIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuU3RydWN0QicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5TdHJ1Y3RCJ3thYT1udWxsLGFiPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJCb25rIGRlZmluaXRpb24gKHNob3J0IHZlcnNpb24pIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd0aHJpZnQudGVzdC5Cb25rJykKKyAgICApfSwKKyAgICB7IkJvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCB0eXBlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9uaycpCisgICAgKX0sCisgICAgeyJCb29scyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgaW1fdHJ1ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgaW1fZmFsc2UsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb29scycpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0JykKKyAgICApfSwKKyAgICB7Ilh0cnVjdDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJ5dGUsIGJ5dGVfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMndGhyaWZ0LnRlc3QuWHRydWN0J3t9fSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QyJykKKyAgICApfSwKKyAgICB7Ilh0cnVjdDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMzIsIGNoYW5nZWQsIHVuZGVmaW5lZH0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgaTY0LCBpNjRfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QzJykKKyAgICApfSwKKyAgICB7Ikluc2FuaXR5IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGk2NH0sIHVzZXJNYXAsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX19LCB4dHJ1Y3RzLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5JbnNhbml0eScpCisgICAgKX0sCisgICAgeyJDcmF6eU5lc3RpbmcgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX2ZpZWxkLCB1bmRlZmluZWR9LAorICAgICAgICB7Miwgb3B0aW9uYWwsIHtzZXQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19LCBzZXRfZmllbGQsIHNldHM6bmV3KCl9LAorICAgICAgICB7MywgcmVxdWlyZWQsIHtsaXN0LCB7bWFwLAorICAgICAgICAgIHtzZXQsIGkzMn0sCisgICAgICAgICAge21hcCwgaTMyLCB7c2V0LCB7bGlzdCwge21hcCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fSwgc3RyaW5nfX19fQorICAgICAgICB9fSwgbGlzdF9maWVsZCwgW119LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBzdHJpbmcsIGJpbmFyeV9maWVsZCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZycpCisgICAgKX0sCisgICAgeyJYY2VwdGlvbiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBlcnJvckNvZGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlhjZXB0aW9uJykKKyAgICApfSwKKyAgICB7IlhjZXB0aW9uMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBlcnJvckNvZGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMndGhyaWZ0LnRlc3QuWHRydWN0J3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlhjZXB0aW9uMicpCisgICAgKX0sCisgICAgeyJFbXB0eVN0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnKQorICAgICl9LAorICAgIHsiT25lRmllbGQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnfX0sIGZpZWxkLCAjJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk9uZUZpZWxkJykKKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgYmVnaW5faW5fYm90aCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgc3RyaW5nLCBvbGRfc3RyaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTIsIHVuZGVmaW5lZCwgaTMyLCBlbmRfaW5fYm90aCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEnKQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBpMzIsIG5ld2ludCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYnl0ZSwgbmV3Ynl0ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgaTE2LCBuZXdzaG9ydCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgaTY0LCBuZXdsb25nLCB1bmRlZmluZWR9LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCBkb3VibGUsIG5ld2RvdWJsZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezcsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fSwgbmV3c3RydWN0LCAjJ3RocmlmdC50ZXN0LkJvbmsne319LAorICAgICAgICB7OCwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbmV3bGlzdCwgW119LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCB7c2V0LCBpMzJ9LCBuZXdzZXQsIHNldHM6bmV3KCl9LAorICAgICAgICB7MTAsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpMzJ9LCBuZXdtYXAsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgc3RyaW5nLCBuZXdzdHJpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMicpCisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIG15aW50cywgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIGhlbGxvLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjEnKQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCBzdHJpbmd9LCBzdHJpbmdzLCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMicpCisgICAgKX0sCisgICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7NywgdW5kZWZpbmVkLCB7bWFwLCBzdHJpbmcsIHN0cmluZ30sIG1hcF9maWVsZCwgZGljdDpuZXcoKX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0JykKKyAgICApfSwKKyAgICB7IkxhcmdlRGVsdGFzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMDAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7NTAwLCB1bmRlZmluZWQsIGJvb2wsIGNoZWNrX3RydWUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAwMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxNTAwLCB1bmRlZmluZWQsIGJvb2wsIGNoZWNrX2ZhbHNlLCB1bmRlZmluZWR9LAorICAgICAgICB7MjAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ319LCB2ZXJ0d28yMDAwLCAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIne319LAorICAgICAgICB7MjUwMCwgdW5kZWZpbmVkLCB7c2V0LCBzdHJpbmd9LCBhX3NldDI1MDAsIHNldHM6bmV3KCl9LAorICAgICAgICB7MzAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ319LCB2ZXJ0d28zMDAwLCAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIne319LAorICAgICAgICB7NDAwMCwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgYmlnX251bWJlcnMsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwgaTMyfX0sIGludGVnZXJsaXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwge2xpc3QsIGkzMn19fSwgaW50ZWdlcmxpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMnKQorICAgICl9LAorICAgIHsiTmVzdGVkTWl4ZWR4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzZXQsIGkzMn19LCBpbnRfc2V0X2xpc3QsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge21hcCwgaTMyLCB7c2V0LCBzdHJpbmd9fSwgbWFwX2ludF9zdHJzZXQsIGRpY3Q6bmV3KCl9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7bGlzdCwge21hcCwgaTMyLCB7c2V0LCBzdHJpbmd9fX0sIG1hcF9pbnRfc3Ryc2V0X2xpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDInKQorICAgICl9LAorICAgIHsiTGlzdEJvbmtzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fX0sIGJvbmssIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RCb25rcycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0JvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7bGlzdCwge2xpc3QsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX19fX0sIGJvbmssIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uaycpCisgICAgKX0sCisgICAgeyJCb29sVGVzdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIG9wdGlvbmFsLCBib29sLCBiLCB0cnVlfSwKKyAgICAgICAgezIsIG9wdGlvbmFsLCBzdHJpbmcsIHMsICJ0cnVlIn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb29sVGVzdCcpCisgICAgKX0sCisgICAgeyJTdHJ1Y3RBIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCByZXF1aXJlZCwgc3RyaW5nLCBzLCB1bmRlZmluZWR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlN0cnVjdEEnKQorICAgICl9LAorICAgIHsiU3RydWN0QiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIG9wdGlvbmFsLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5TdHJ1Y3RBJ319LCBhYSwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3t9fSwKKyAgICAgICAgezIsIHJlcXVpcmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5TdHJ1Y3RBJ319LCBhYiwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3t9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlN0cnVjdEInKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InRlc3RWb2lkIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Vm9pZCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RWb2lkIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBzdHJpbmcsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBieXRlfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgYnl0ZSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJMzIgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGkzMiwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJNjQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTY0fV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGk2NCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgZG91YmxlfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGRvdWJsZSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJ319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE1hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge21hcCwgaTMyLCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTMyLCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge21hcCwgc3RyaW5nLCBzdHJpbmd9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgc3RyaW5nLCBzdHJpbmd9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFNldCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3NldCwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzZXQsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFNldCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge2xpc3QsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtsaXN0LCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEVudW0gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGkzMn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEVudW0gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTMyLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTY0fV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTY0LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgaTMyfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTMyLCB7bWFwLCBpMzIsaTMyfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGk2NCwge21hcCwgaTMyLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0SW5zYW5pdHksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGJ5dGV9LAorICAgICAgICB7MiwgaTMyfSwKKyAgICAgICAgezMsIGk2NH0sCisgICAgICAgIHs0LCB7bWFwLCBpMTYsIHN0cmluZ319LAorICAgICAgICB7NSwgaTMyfSwKKyAgICAgICAgezYsIGk2NH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgb25ld2F5X3ZvaWQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ31dfSwKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBzdHJpbmcsCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9nby9NYWtlZmlsZS5hbSBiL2xpYi9nby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZhNWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK2luc3RhbGw6CisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnVGhlIEdvIGNsaWVudCBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgdmlhICJnbyBnZXQiLCBwbGVhc2Ugc2VlIC9saWIvZ28vUkVBRE1FLm1kJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKK2NoZWNrLWxvY2FsOgorCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC1yYWNlIC4vdGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBwa2cKKworYWxsLWxvY2FsOgorCUdPUEFUSD1gcHdkYCAkKEdPKSBidWlsZCAuL3RocmlmdAorCitFWFRSQV9ESVNUID0gXAorCXRocmlmdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvZ28vUkVBRE1FLm1kIGIvbGliL2dvL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZkNWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL1JFQURNRS5tZApAQCAtMCwwICsxLDgzIEBACitUaHJpZnQgR28gU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKK1VzaW5nIFRocmlmdCB3aXRoIEdvCis9PT09PT09PT09PT09PT09PT09PQorCitUaHJpZnQgc3VwcG9ydHMgR28gMS43KworCitJbiBmb2xsb3dpbmcgR28gY29udmVudGlvbnMsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZSAnZ28nIHRvb2wgdG8gaW5zdGFsbAorVGhyaWZ0IGZvciBnby4KKworICAgICQgZ28gZ2V0IGdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0Ly4uLgorCitXaWxsIHJldHJpZXZlIGFuZCBpbnN0YWxsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLgorCisKK0Egbm90ZSBhYm91dCBvcHRpb25hbCBmaWVsZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHRocmlmdC10by1HbyBjb21waWxlciB0cmllcyB0byByZXByZXNlbnQgdGhyaWZ0IElETCBzdHJ1Y3RzIGFzIEdvIHN0cnVjdHMuCitXZSBtdXN0IGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgc2V0IHRvIHRoZWlyCitkZWZhdWx0IHZhbHVlIGFuZCBvcHRpb25hbCB2YWx1ZXMgd2hpY2ggYXJlIGFjdHVhbGx5IHVuc2V0LCBzbyB0aGUgZ2VuZXJhdGVkCitjb2RlIHJlcHJlc2VudHMgb3B0aW9uYWwgZmllbGRzIHZpYSBwb2ludGVycy4KKworVGhpcyBpcyBnZW5lcmFsbHkgaW50dWl0aXZlIGFuZCB3b3JrcyB3ZWxsIG11Y2ggb2YgdGhlIHRpbWUsIGJ1dCBHbyBkb2VzIG5vdAoraGF2ZSBhIHN5bnRheCBmb3IgY3JlYXRpbmcgYSBwb2ludGVyIHRvIGEgY29uc3RhbnQgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbi4gVGhhdAoraXMsIGdpdmVuIGEgc3RydWN0IGxpa2UKKworICAgIHN0cnVjdCBTb21lSURMVHlwZSB7CisgICAgCU9wdGlvbmFsRmllbGQgKmludDMyCisgICAgfQorCissIHRoZSBmb2xsb3dpbmcgd2lsbCBub3QgY29tcGlsZToKKworICAgIHggOj0gJlNvbWVJRExUeXBleworICAgIAlPcHRpb25hbEZpZWxkOiAmKDMpLAorICAgIH0KKworKE5vciBpcyB0aGVyZSBhbnkgb3RoZXIgc3ludGF4IHRoYXQncyBidWlsdCBpbiB0byB0aGUgbGFuZ3VhZ2UpCisKK0FzIHN1Y2gsIHdlIHByb3ZpZGUgc29tZSBoZWxwZXJzIHRoYXQgZG8ganVzdCB0aGlzIHVuZGVyIGxpYi9nby90aHJpZnQvLiBFLmcuLAorCisgICAgeCA6PSAmU29tZUlETFR5cGV7CisgICAgCU9wdGlvbmFsRmllbGQ6IHRocmlmdC5JbnQzMlB0cigzKSwKKyAgICB9CisKK0FuZCBzbyBvbi4gVGhlIGNvZGUgZ2VuZXJhdG9yIGFsc28gY3JlYXRlcyBhbmFsb2dvdXMgaGVscGVycyBmb3IgdXNlci1kZWZpbmVkCit0eXBlZGVmcyBhbmQgZW51bXMuCisKK0FkZGluZyBjdXN0b20gdGFncyB0byBnZW5lcmF0ZWQgVGhyaWZ0IHN0cnVjdHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiBhZGQgdGFncyB0byB0aGUgYXV0by1nZW5lcmF0ZWQgdGhyaWZ0IHN0cnVjdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICBzdHJ1Y3QgZm9vIHsKKyAgICAgIDE6IHJlcXVpcmVkIHN0cmluZyBCYXIgKGdvLnRhZyA9ICJzb21lX3RhZzpcInNvbWVfdGFnX3ZhbHVlXCIiKQorICAgIH0KKyAgICAKK3doaWNoIHdpbGwgZ2VuZXJhdGU6CisKKyAgICB0eXBlIEZvbyBzdHJ1Y3QgeworICAgICAgQmFyIHN0cmluZyBgdGhyaWZ0OiJiYXIsMSxyZXF1aXJlZCIgc29tZV90YWc6InNvbWVfdGFnX3ZhbHVlImAKKyAgICB9CmRpZmYgLS1naXQgYS9saWIvZ28vY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9nby9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0JpbmFyeUtleVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvQmluYXJ5S2V5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjYjYxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0JpbmFyeUtleVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGF0IHRocmlmdCBwcm9kdWNlIGNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IGtleQorc3RydWN0IHRlc3RTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBtYXA8YmluYXJ5LHN0cmluZz4gYmluX3RvX3N0cmluZworfQorCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdApAQCAtMCwwICsxLDI3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IElubmVyU3RydWN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkCit9CisKK3N0cnVjdCBUZXN0U3RydWN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkCisgIDI6IHJlcXVpcmVkIElubmVyU3RydWN0IGlubmVyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I2NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdApAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworc3RydWN0IFRlc3RTdHJ1Y3QgCit7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gbSwKKyAgMjogbGlzdDxzdHJpbmc+IGwsCisgIDM6IHNldDxzdHJpbmc+IHMsCisgIDQ6IGkzMiBpCit9CisKK3NlcnZpY2UgRXJyb3JUZXN0IAoreworICBUZXN0U3RydWN0ICAgICAgICAgdGVzdFN0cnVjdCgxOiBUZXN0U3RydWN0IHRoaW5nKQorICBzdHJpbmcgICAgICAgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgcykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGIzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgdGFnZ2VkIHsKKyAgICAxOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAgIDI6IGk2NCBpbnRfdGhpbmcgKGdvLnRhZyA9ICJqc29uOlwiaW50X3RoaW5nLHN0cmluZ1wiIiksCisgICAgMzogb3B0aW9uYWwgaTY0IG9wdGlvbmFsX2ludF90aGluZworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0lnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMGU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0lnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBJZ25vcmVJbml0aWFsaXNtc1Rlc3QgeworICAgIDE6IGk2NCBpZCwKKyAgICAyOiBpNjQgbXlfaWQsCisgICAgMzogaTY0IG51bV9jcHUsCisgICAgNDogaTY0IG51bV9ncHUsCisgICAgNTogaTY0IG15X0lELAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvSW5jbHVkZXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0luY2x1ZGVzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2MDMyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0luY2x1ZGVzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgoraW5jbHVkZSAiTmFtZXNwYWNlZFRlc3QudGhyaWZ0IgorCitjb25zdCBUaHJpZnRUZXN0LlVzZXJJZCBVU0VSSUQgPSA0MgorY29uc3QgTmFtZXNwYWNlZFRlc3QuVXNlcklkIFVTRVJJRDEgPSA0MQorY29uc3QgVGhyaWZ0VGVzdC5NYXBUeXBlIE1BUENPTlNUQU5UID0geydoZWxsbyc6e30sICdnb29kbmlnaHQnOnt9fQorCitjb25zdCBpMzIgVFdPID0gTmFtZXNwYWNlZFRlc3QuU3R1ZmYuVFdPCitjb25zdCBpMzIgVEhSRUUgPSBOYW1lc3BhY2VkVGVzdC5USFJFRQorCitzdHJ1Y3QgdGVzdFN0cnVjdCB7CisgIDE6IGxpc3Q8VGhyaWZ0VGVzdC5OdW1iZXJ6PiBsaXN0TnVtYmVycworfQorCitzdHJ1Y3QgVGVzdFN0cnVjdDIgeworICAxOiB0ZXN0U3RydWN0IGJsYWgsCisgIDI6IFRocmlmdFRlc3QuVXNlcklkIGlkLAorICAzOiBOYW1lc3BhY2VkVGVzdC5TdHVmZiBzdHVmZiwKK30KKworc2VydmljZSB0ZXN0U2VydmljZSBleHRlbmRzIFRocmlmdFRlc3QuU2Vjb25kU2VydmljZSB7CisgIFRocmlmdFRlc3QuQ3JhenlOZXN0aW5nIGdldENyYXp5TmVzdGluZygKKyAgICAxOiBUaHJpZnRUZXN0LlN0cnVjdEEgYSwKKyAgICAyOiBUaHJpZnRUZXN0Lk51bWJlcnogbnVtYmVycworICApIHRocm93cygxOiBUaHJpZnRUZXN0LlhjZXB0aW9uIGVycjEpLAorCisgIHZvaWQgZ2V0U29tZVZhbHVlX0RPX05PVF9DQUxMKCksCit9CisKK3NlcnZpY2UgRXh0ZW5kZWRTZXJ2aWNlIGV4dGVuZHMgdGVzdFNlcnZpY2UgeworICB2b2lkIGV4dGVuZGVkTWV0aG9kKCksCisgIE5hbWVzcGFjZWRUZXN0LlN0dWZmU3RydWN0IGV4dGVuZGVkTWV0aG9kMigpLAorfQorCitzZXJ2aWNlIEV4dGVuZGVkMlNlcnZpY2UgZXh0ZW5kcyBOYW1lc3BhY2VkVGVzdC5OYW1lc3BhY2VkU2VydmljZSB7CisgIHZvaWQgZXh0ZW5kZWRNZXRob2QzKCksCit9CisKK3R5cGVkZWYgbWFwPFRocmlmdFRlc3QuVXNlcklkLCBtYXA8TmFtZXNwYWNlZFRlc3QuVXNlcklkLCBsaXN0PFRlc3RTdHJ1Y3QyPiA+ID4gQ29tcGxleE1hcFR5cGUKKworc3RydWN0IENvbXBsZXhNYXBTdHJ1Y3QgeworICAxOiBDb21wbGV4TWFwVHlwZSBjb21wbGV4LAorfQorCitzZXJ2aWNlIENvbXBsZXhNYXBTZXJ2aWNlIHsKKyAgQ29tcGxleE1hcFN0cnVjdCB0cmFuc2Zvcm1NYXAoMTogQ29tcGxleE1hcFN0cnVjdCBpbnB1dCksCit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODZhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSW5pdGlhbGlzbXNUZXN0IHsKKyAgICAxOiBzdHJpbmcgdXNlcl9pZCwKKyAgICAyOiBzdHJpbmcgc2VydmVyX3VybCwKKyAgICAzOiBzdHJpbmcgaWQsIAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQ0NjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRBUkdTID0gLW91dCBnb3BhdGgvc3JjLyAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdCQoQ09NUElMRVJfRVhUUkFGTEFHKQorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCisjIFRocmlmdCBmb3IgR08gaGFzIHByb2JsZW1zIHdpdGggY29tcGxleCBtYXAga2V5czogVEhSSUZULTIwNjMKK2dvcGF0aDogJChUSFJJRlQpICQoVEhSSUZUVEVTVCkgXAorCQkJCUluY2x1ZGVzVGVzdC50aHJpZnQgXAorCQkJCU5hbWVzcGFjZWRUZXN0LnRocmlmdCBcCisJCQkJTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IFwKKwkJCQlPbmV3YXlUZXN0LnRocmlmdCBcCisJCQkJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJCQkJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKKwkJCQlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKKwkJCQlHb1RhZ1Rlc3QudGhyaWZ0IFwKKwkJCQlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCisJCQkJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKKwkJCQlFcnJvclRlc3QudGhyaWZ0IFwKKwkJCQlOYW1lc1Rlc3QudGhyaWZ0IFwKKwkJCQlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKKwkJCQlEb250RXhwb3J0UldUZXN0LnRocmlmdCBcCisJCQkJZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gXAorCQkJCUlnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKKwlta2RpciAtcCBnb3BhdGgvc3JjCisJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpIHwgZ3JlcCAtdiAnc2V0PEluc2FuaXR5PicgPiBUaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIC1yIEluY2x1ZGVzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBCaW5hcnlLZXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE9uZXdheVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlcXVpcmVkRmllbGRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFNlcnZpY2VzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBHb1RhZ1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVW5pb25CaW5hcnlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEVycm9yVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBOYW1lc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgSW5pdGlhbGlzbXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLHJlYWRfd3JpdGVfcHJpdmF0ZSBEb250RXhwb3J0UldUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLGlnbm9yZV9pbml0aWFsaXNtcyBJZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIGdvcGF0aC9zcmMvZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2svY29udHJvbGxlci5nbyB8fCB0cnVlCisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKKwlsbiAtbmZzIC4uLy4uLy4uL3RocmlmdCBnb3BhdGgvc3JjL3RocmlmdAorCWxuIC1uZnMgLi4vLi4vdGVzdHMgZ29wYXRoL3NyYy90ZXN0cworCWNwIC1yIC4vZG9udGV4cG9ydHJ3dGVzdCBnb3BhdGgvc3JjCisJdG91Y2ggZ29wYXRoCisKK2NoZWNrOiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGJ1aWxkIFwKKwkJCQlpbmNsdWRlc3Rlc3QgXAorCQkJCWJpbmFyeWtleXRlc3QgXAorCQkJCXNlcnZpY2VzdGVzdCBcCisJCQkJdHlwZWRlZmZpZWxkdGVzdCBcCisJCQkJcmVmYW5ub3RhdGlvbmZpZWxkc3Rlc3QgXAorCQkJCWVycm9ydGVzdAlcCisJCQkJbmFtZXN0ZXN0IFwKKwkJCQlpbml0aWFsaXNtc3Rlc3QgXAorCQkJCWRvbnRleHBvcnRyd3Rlc3QgXAorCQkJCWlnbm9yZWluaXRpYWxpc21zdGVzdCBcCisJCQkJdW5pb25iaW5hcnl0ZXN0CisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSB0ZXN0IHRocmlmdCB0ZXN0cyBkb250ZXhwb3J0cnd0ZXN0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdvcGF0aCBUaHJpZnRUZXN0LnRocmlmdCBnZW4tZ28KKworY2xpZW50OiBzdHVicworCSQoR08pIHJ1biBUZXN0Q2xpZW50LmdvCisKK0VYVFJBX0RJU1QgPSBcCisJZG9udGV4cG9ydHJ3dGVzdCBcCisJdGVzdHMgXAorCUJpbmFyeUtleVRlc3QudGhyaWZ0IFwKKwlHb1RhZ1Rlc3QudGhyaWZ0IFwKKwlJbmNsdWRlc1Rlc3QudGhyaWZ0IFwKKwlNdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQgXAorCU5hbWVzcGFjZWRUZXN0LnRocmlmdCBcCisJT25ld2F5VGVzdC50aHJpZnQgXAorCU9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQgXAorCVJlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBcCisJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKKwlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKKwlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKKwlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCisJRXJyb3JUZXN0LnRocmlmdCBcCisJTmFtZXNUZXN0LnRocmlmdCBcCisJSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBcCisJRG9udEV4cG9ydFJXVGVzdC50aHJpZnQgXAorCUlnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L011bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L011bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYzZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXJ2aWNlIEZpcnN0IHsKKyAgICBpNjQgcmV0dXJuT25lKCk7Cit9CisKK3NlcnZpY2UgU2Vjb25kIHsKKyAgICBpNjQgcmV0dXJuVHdvKCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTk1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgTmFtZXNUZXN0IHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgdHlwZQorfQorCitzZXJ2aWNlIE5hbWVDb2xsaXNpb25PbmUKK3sKKyAgICB2b2lkIGJsYWhCbGFoKCkKK30KKworc2VydmljZSBOYW1lQ29sbGlzaW9uVHdvCit7CisgICAgdm9pZCBibGFoQmxhaCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9OYW1lc3BhY2VkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9OYW1lc3BhY2VkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMDM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L05hbWVzcGFjZWRUZXN0LnRocmlmdApAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCisKK25hbWVzcGFjZSBnbyBsaWIuZ28udGVzdC5uYW1lc3BhY2VkdGVzdAorCitlbnVtIFN0dWZmIHsKKyAgT05FID0gMSwKKyAgVFdPID0gMiwKK30KKworY29uc3QgaTMyIFRIUkVFID0gMzsKKwordHlwZWRlZiBpNjQgVXNlcklkCisKK3N0cnVjdCBTdHVmZlN0cnVjdCB7CisgIDI6IFN0dWZmIHN0dWZmLAorfQorCitzZXJ2aWNlIE5hbWVzcGFjZWRTZXJ2aWNlIHsKKyAgVGhyaWZ0VGVzdC5Vc2VySWQgZ2V0VXNlcklEKCksCit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L09uZXdheVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvT25ld2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MmY4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L09uZXdheVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXJ2aWNlIE9uZVdheSB7CisgICAgb25ld2F5IHZvaWQgaGkoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIHZvaWQgZW1wdHlmdW5jKCkKKyAgICBpNjQgZWNob19pbnQoMTogaTY0IHBhcmFtKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L09wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmYzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L09wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw1MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBzdHJ1Y3RBIHsKKyAxOiByZXF1aXJlZCBpNjQgc2FfaQorfQorCitzdHJ1Y3QgYWxsX29wdGlvbmFsIHsKKyAxOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJERUZBVUxUIiwKKyAyOiBvcHRpb25hbCBpNjQgaSA9IDQyLAorIDM6IG9wdGlvbmFsIGJvb2wgYiA9IGZhbHNlLAorIDQ6IG9wdGlvbmFsIHN0cmluZyBzMiwKKyA1OiBvcHRpb25hbCBpNjQgaTIsCisgNjogb3B0aW9uYWwgYm9vbCBiMiwKKyA3OiBvcHRpb25hbCBzdHJ1Y3RBIGFhLAorIDk6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsLAorIDEwOiBvcHRpb25hbCBsaXN0PGk2ND4gbDIgPSBbMSwgMl0sCisgMTE6IG9wdGlvbmFsIG1hcDxpNjQsIGk2ND4gbSwKKyAxMjogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtMiA9IHsxOjIsIDM6NH0sCisgMTM6IG9wdGlvbmFsIGJpbmFyeSBiaW4sCisgMTQ6IG9wdGlvbmFsIGJpbmFyeSBiaW4yID0gImFzZGYiLAorfQorCitzdHJ1Y3Qgc3RydWN0QiB7CisgMTogcmVxdWlyZWQgc3RydWN0QSByZXF1aXJlZF9zdHJ1Y3RfdGhpbmcKKyAyOiBvcHRpb25hbCBzdHJ1Y3RBIG9wdGlvbmFsX3N0cnVjdF90aGluZworfQorCitzdHJ1Y3Qgc3RydWN0QyB7CisgMTogc3RyaW5nIHMsCisgMjogcmVxdWlyZWQgaTMyIGksCisgMzogb3B0aW9uYWwgYm9vbCBiLAorIDQ6IHJlcXVpcmVkIHN0cmluZyBzMiwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1JlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1JlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YyOGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3Qgc3RydWN0QSB7CisgMTogcmVxdWlyZWQgaTY0IHNhX2kKK30KKworc3RydWN0IGFsbF9yZWZlcmVuY2VkIHsKKyAxOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJERUZBVUxUIiAoY3BwLnJlZiA9ICIiKSwKKyAyOiBvcHRpb25hbCBpNjQgaSA9IDQyIChjcHAucmVmID0gIiIpLAorIDM6IG9wdGlvbmFsIGJvb2wgYiA9IGZhbHNlIChjcHAucmVmID0gIiIpLAorIDQ6IG9wdGlvbmFsIHN0cmluZyBzMiAoY3BwLnJlZiA9ICIiKSwKKyA1OiBvcHRpb25hbCBpNjQgaTIgKGNwcC5yZWYgPSAiIiksCisgNjogb3B0aW9uYWwgYm9vbCBiMiAoY3BwLnJlZiA9ICIiKSwKKyA3OiBvcHRpb25hbCBzdHJ1Y3RBIGFhIChjcHAucmVmID0gIiIpLAorIDk6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsIChjcHAucmVmID0gIiIpLAorIDEwOiBvcHRpb25hbCBsaXN0PGk2ND4gbDIgPSBbMSwgMl0gKGNwcC5yZWYgPSAiIiksCisgMTE6IG9wdGlvbmFsIG1hcDxpNjQsIGk2ND4gbSAoY3BwLnJlZiA9ICIiKSwKKyAxMjogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtMiA9IHsxOjIsIDM6NH0gKGNwcC5yZWYgPSAiIiksCisgMTM6IG9wdGlvbmFsIGJpbmFyeSBiaW4gKGNwcC5yZWYgPSAiIiksCisgMTQ6IG9wdGlvbmFsIGJpbmFyeSBiaW4yID0gImFzZGYiIChjcHAucmVmID0gIiIpLAorCisgMTU6IHJlcXVpcmVkIHN0cmluZyByZWZfcyA9ICJERUZBVUxUIiAoY3BwLnJlZiA9ICIiKSwKKyAxNjogcmVxdWlyZWQgaTY0IHJlZl9pID0gNDIgKGNwcC5yZWYgPSAiIiksCisgMTc6IHJlcXVpcmVkIGJvb2wgcmVmX2IgPSBmYWxzZSAoY3BwLnJlZiA9ICIiKSwKKyAxODogcmVxdWlyZWQgc3RyaW5nIHJlZl9zMiAoY3BwLnJlZiA9ICIiKSwKKyAxOTogcmVxdWlyZWQgaTY0IHJlZl9pMiAoY3BwLnJlZiA9ICIiKSwKKyAyMDogcmVxdWlyZWQgYm9vbCByZWZfYjIgKGNwcC5yZWYgPSAiIiksCisgMjE6IHJlcXVpcmVkIHN0cnVjdEEgcmVmX2FhIChjcHAucmVmID0gIiIpLAorIDIyOiByZXF1aXJlZCBsaXN0PGk2ND4gcmVmX2wgKGNwcC5yZWYgPSAiIiksCisgMjM6IHJlcXVpcmVkIGxpc3Q8aTY0PiByZWZfbDIgPSBbMSwgMl0gKGNwcC5yZWYgPSAiIiksCisgMjQ6IHJlcXVpcmVkIG1hcDxpNjQsIGk2ND4gcmVmX20gKGNwcC5yZWYgPSAiIiksCisgMjU6IHJlcXVpcmVkIG1hcDxpNjQsIGk2ND4gcmVmX20yID0gezE6MiwgMzo0fSAoY3BwLnJlZiA9ICIiKSwKKyAyNjogcmVxdWlyZWQgYmluYXJ5IHJlZl9iaW4gKGNwcC5yZWYgPSAiIiksCisgMjc6IHJlcXVpcmVkIGJpbmFyeSByZWZfYmluMiA9ICJhc2RmIiAoY3BwLnJlZiA9ICIiKSwKKworfQorCitzdHJ1Y3Qgc3RydWN0QiB7CisgMTogcmVxdWlyZWQgc3RydWN0QSByZXF1aXJlZF9zdHJ1Y3RfdGhpbmcKKyAyOiBvcHRpb25hbCBzdHJ1Y3RBIG9wdGlvbmFsX3N0cnVjdF90aGluZworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKQEAgLTAsMCArMSw3IEBACitzdHJ1Y3QgUmVxdWlyZWRGaWVsZCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCit9CisKK3N0cnVjdCBPdGhlclRoaW5nIHsKKyAgMTogcmVxdWlyZWQgaTE2IHZhbHVlCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9TZXJ2aWNlc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvU2VydmljZXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJiMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvU2VydmljZXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDExMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgV2UgYXJlIG9ubHkgdGVzdGluZyB0aGF0IGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBubyBjb3JyZWN0bmVzcyBjaGVja2luZyBpcyBkb25lCisKK2V4Y2VwdGlvbiBtb2RlcmF0ZV9kaXNhc3RlciB7CisgIDE6IGkzMiBlcnJvckNvZGUsCisgIDI6IHN0cmluZyBtZXNzYWdlCit9CisKK2V4Y2VwdGlvbiB0b3RhbF9kaXNhc3RlciB7CisgIDE6IHN0cmluZyBtZXNzYWdlCisgIDI6IG9wdGlvbmFsIGJvb2wgcHJlc2lkZW50X3dhc193b2tlbl91cCA9IGZhbHNlCit9CisKK3N0cnVjdCBzdHJ1Y3RfYSB7CisgIDE6IHJlcXVpcmVkIGk2NCB3aGF0ZXZlcgorfQorCitzZXJ2aWNlIGFfc2VydiB7CisgICAgdm9pZCB2b2lkZnVuYygpLAorICAgIHZvaWQgdm9pZF93aXRoXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHZvaWQgdm9pZF93aXRoXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJpbmcgc3RyaW5nZnVuYygpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGk2NCBpNjRmdW5jKCkKKyAgICBpNjQgaTY0ZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBpNjQgaTY0ZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jKCkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmMoKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmMoKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgdm9pZCB2b2lkZnVuY18xaW50KDE6IGk2NCBpKSwKKyAgICB2b2lkIHZvaWRfd2l0aF8xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgdm9pZCB2b2lkX3dpdGhfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xaW50KDE6IGk2NCBpKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGk2NCBpNjRmdW5jXzFpbnQoMTogaTY0IGkpCisgICAgaTY0IGk2NGZ1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGk2NCBpNjRmdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFpbnQoMTogaTY0IGkpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgdm9pZCB2b2lkZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcyksCisgICAgdm9pZCB2b2lkX3dpdGhfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICB2b2lkIHZvaWRfd2l0aF8yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGk2NCBpNjRmdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIGk2NCBpNjRmdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgaTY0IGk2NGZ1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xc3RydWN0X2EoMTogc3RydWN0X2Egc3QpCisKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1R5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwZThjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1R5cGVkZWZGaWVsZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFdlIGFyZSBvbmx5IHRlc3RpbmcgdGhhdCBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgbm8gY29ycmVjdG5lc3MgY2hlY2tpbmcgaXMgZG9uZQorCitlbnVtIERldGFpbHMgeworICBFdmVyeXRoaW5nID0gMAorICBTdGF0ZU9ubHkgPSAxCisgIFN0YXRlQW5kT3B0aW9ucyA9IDIKKyAgU29tZXRoaW5nRWxzZSA9IDMKK30KKwordHlwZWRlZiBsaXN0PCBEZXRhaWxzPiAgRGV0YWlsc1dhbnRlZAorCitzdHJ1Y3QgQmFzZVJlcXVlc3QgeworICAxIDogb3B0aW9uYWwgc3RyaW5nIFJlcXVlc3RJRAorfQorCitzdHJ1Y3QgR2V0TXlEZXRhaWxzIHsKKyAgMSA6IHJlcXVpcmVkIEJhc2VSZXF1ZXN0IGJhc2VfCisgIDIgOiByZXF1aXJlZCBzdHJpbmcgT2JqZWN0SUQKKyAgMyA6IG9wdGlvbmFsIERldGFpbHNXYW50ZWQgRGV0YWlsc1dhbnRlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK3VuaW9uIFNhbXBsZSB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdTEsCisgIDI6IGJpbmFyeSB1MiwKKyAgMzogbGlzdDxzdHJpbmc+IHUzCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkzNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdApAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IE9wdGlvbjEgeworfQorCitzdHJ1Y3QgT3B0aW9uMiB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyBuYW1lCit9CisKK3VuaW9uIERlc2NlbmRhbnQgeworICAxOiBPcHRpb24xIG9wdGlvbjEKKyAgMjogT3B0aW9uMiBvcHRpb24yCit9CisKK3N0cnVjdCBUZXN0U3RydWN0IHsKKyAgMTogb3B0aW9uYWwgRGVzY2VuZGFudCBkZXNjZW5kYW50ID0geyAib3B0aW9uMSI6IHt9fQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY3NjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28KQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRvbnRleHBvcnRyd3Rlc3QKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworLy8gTWFrZSBzdXJlIHRoYXQgdGhyaWZ0IGdlbmVyYXRlcyBub24tZXhwb3J0ZWQgcmVhZC93cml0ZSBtZXRob2RzIGlmCisvLyByZWFkX3dyaXRlX3ByaXZhdGUgb3B0aW9uIGlzIHNwZWNpZmllZAorZnVuYyBUZXN0UmVhZFdyaXRlTWV0aG9kc0FyZVByaXZhdGUodCAqdGVzdGluZy5UKSB7CisJLy8gVGhpcyB3aWxsIG9ubHkgY29tcGlsZSBpZiByZWFkL3dyaXRlIG1ldGhvZHMgZXhpc3QKKwlzIDo9IE5ld1Rlc3RTdHJ1Y3QoKQorCV8gPSBzLnJlYWQKKwlfID0gcy53cml0ZQorCisJaXMgOj0gTmV3SW5uZXJTdHJ1Y3QoKQorCV8gPSBpcy5yZWFkCisJXyA9IGlzLndyaXRlCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9iaW5hcnlfa2V5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9iaW5hcnlfa2V5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5NjE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2JpbmFyeV9rZXlfdGVzdC5nbwpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiYmluYXJ5a2V5dGVzdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0QmluYXJ5TWFwS2V5R2VuZXJhdGVzU3RyaW5nKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gYmluYXJ5a2V5dGVzdC5OZXdUZXN0U3RydWN0KCkKKwkvL1RoaXMgd2lsbCBvbmx5IGNvbXBpbGUgaWYgQmluVG9TdHJpbmcgaGFzIHR5cGUgb2YgbWFwW3N0cmluZ11zdHJpbmcKKwlzLkJpblRvU3RyaW5nID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlYzRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCkBAIC0wLDAgKzEsODczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJlcnJvcnRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKworCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKykKKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIFNldHVwIG1vY2sgdG8gZmFpbCBhdCBhIGNlcnRhaW4gcG9zaXRpb24uIFJldHVybiB0cnVlIGlmIHBvc2l0aW9uIGV4aXN0cyBvdGhlcndpc2UgZmFsc2UuCitmdW5jIHByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wgKk1vY2tUUHJvdG9jb2wsIGZhaWxBdCBpbnQsIGZhaWxXaXRoIGVycm9yKSBib29sIHsKKwl2YXIgZXJyIGVycm9yID0gbmlsCisKKwlpZiBmYWlsQXQgPT0gMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgOj0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJ1Y3QiLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLlJldHVybihlcnIpCisJaWYgZmFpbEF0ID09IDAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RydWN0X2FyZ3MiKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJ0aGluZyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSVUNUKSwgaW50MTYoMSkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJUZXN0U3RydWN0IikuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigibSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTUFQKSwgaW50MTYoMSkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1hcEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNYXBFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImwiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkxJU1QpLCBpbnQxNigyKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTGlzdEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUxpc3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKworCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNFVCksIGludDE2KDMpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVNldEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTZXRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNig0KSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVJMzIoaW50MzIoMykpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cnVjdCIsIHRocmlmdC5SRVBMWSwgaW50MzIoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RydWN0X2FyZ3MiLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJVQ1QpLCBpbnQxNigwKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlRlc3RTdHJ1Y3QiLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJtIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5NQVApLCBpbnQxNigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWFwQmVnaW4oKS5SZXR1cm4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDAsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1hcEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJsIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5MSVNUKSwgaW50MTYoMiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZExpc3RCZWdpbigpLlJldHVybih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDAsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZExpc3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU0VUKSwgaW50MTYoMyksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFNldEJlZ2luKCkuUmV0dXJuKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU2V0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDQpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMyksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNig1KSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0OCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0OSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNTAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA1MCB7CisJCXJldHVybiB0cnVlCisJfQorCXJldHVybiBmYWxzZQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUcmFuc3BvcnRFcnJvciBvbiBmYWlsLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9ycyh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYXNwb3J0RXhjZXB0aW9uIikKKwkJfQorCisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUcmFuc3BvcnRFcnJvciBvbiBmYWlsLgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYXNwb3J0RXhjZXB0aW9uIikKKwkJfQorCisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycyh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoInRlc3QiKSkKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKKwkJfQorCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9EQVRBIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVFByb3RvY29sRXJyb3JzIG9uIGZhaWwuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnMsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKKwkJfQorCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9EQVRBIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTZXR1cCBtb2NrIHRvIGZhaWwgYXQgYSBjZXJ0YWluIHBvc2l0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBwb3NpdGlvbiBleGlzdHMgb3RoZXJ3aXNlIGZhbHNlLgorZnVuYyBwcmVwYXJlQ2xpZW50Q2FsbEV4Y2VwdGlvbihwcm90b2NvbCAqTW9ja1RQcm90b2NvbCwgZmFpbEF0IGludCwgZmFpbFdpdGggZXJyb3IpIGJvb2wgeworCXZhciBlcnIgZXJyb3IgPSBuaWwKKworCS8vIE5vIG5lZWQgdG8gdGVzdCBmYWlsdXJlIGluIHRoaXMgYmxvY2ssIGJlY2F1c2UgaXQgaXMgY292ZXJlZCBpbiBvdGhlciB0ZXN0IGNhc2VzCisJbGFzdCA6PSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIikuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKS5BZnRlcihsYXN0KQorCisJLy8gUmVhZGluZyB0aGUgZXhjZXB0aW9uLCBtaWdodCBmYWlsLgorCWlmIGZhaWxBdCA9PSAwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuRVhDRVBUSU9OLCBpbnQzMigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJUQXBwbGljYXRpb25FeGNlcHRpb24iLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigibWVzc2FnZSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJpbmcoKS5SZXR1cm4oInRlc3QiLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oInR5cGUiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDIpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKHRocmlmdC5QUk9UT0NPTF9FUlJPUiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDIpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisKKwlyZXR1cm4gZmFsc2UKK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJd2lsbENvbXBsZXRlIDo9ICFwcmVwYXJlQ2xpZW50Q2FsbEV4Y2VwdGlvbihwcm90b2NvbCwgaSwgZXJyKQorCisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJCWlmICF3aWxsQ29tcGxldGUgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuUFJPVE9DT0xfRVJST1IgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFBST1RPQ09MX0VSUk9SIGVycm9yIikKKwkJCX0KKwkJCWJyZWFrCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBjYWxsIGFuZCByZXBseSB3aXRoIGV4Y2VwdGlvbiB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50Q2FsbEV4Y2VwdGlvbiwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJd2lsbENvbXBsZXRlIDo9ICFwcmVwYXJlQ2xpZW50Q2FsbEV4Y2VwdGlvbihwcm90b2NvbCwgaSwgZXJyKQorCisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCQlpZiAhd2lsbENvbXBsZXRlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCQl9CisJCX0gZWxzZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlBST1RPQ09MX0VSUk9SIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBQUk9UT0NPTF9FUlJPUiBlcnJvciIpCisJCQl9CisJCQlicmVhaworCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogTWlzbWF0Y2hpbmcgc2VxdWVuY2UgaWQgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2godCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigyKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuQkFEX1NFUVVFTkNFX0lEIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgQkFEX1NFUVVFTkNFX0lEIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoTGVnZWFjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInVua25vd24iLCB0aHJpZnQuUkVQTFksIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LklOVkFMSURfVE1FU1NBR0VfVFlQRSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2E4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9lbmNvZGluZ19qc29uX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9lbmNvZGluZ19qc29uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNDU2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2VuY29kaW5nX2pzb25fdGVzdC5nbwpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiZW5jb2RpbmciCisJImVuY29kaW5nL2pzb24iCisJInRlc3RpbmciCisJInRocmlmdHRlc3QiCispCisKK2Z1bmMgVGVzdEVudW1Jc1RleHRNYXJzaGFsbGVyKHQgKnRlc3RpbmcuVCkgeworCW9uZSA6PSB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FCisJdmFyIHRtIGVuY29kaW5nLlRleHRNYXJzaGFsZXIgPSBvbmUKKwliLCBlcnIgOj0gdG0uTWFyc2hhbFRleHQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIE1hcnNoYWxUZXh0OiAlcyIsIGVycikKKwl9CisJaWYgc3RyaW5nKGIpICE9IG9uZS5TdHJpbmcoKSB7CisJCXQuRXJyb3JmKCJNYXJzaGFsVGV4dCglcykgPSAlcywgZXhwZWN0ZWQgPSAlcyIsIG9uZSwgYiwgb25lKQorCX0KK30KKworZnVuYyBUZXN0RW51bUlzVGV4dFVubWFyc2hhbGxlcih0ICp0ZXN0aW5nLlQpIHsKKwl2YXIgdG0gZW5jb2RpbmcuVGV4dFVubWFyc2hhbGVyID0gdGhyaWZ0dGVzdC5OdW1iZXJ6UHRyKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJyIDo9IHRtLlVubWFyc2hhbFRleHQoW11ieXRlKCJUV08iKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBVbm1hcnNoYWxUZXh0KFRXTyk6ICVzIiwgZXJyKQorCX0KKwlpZiAqKHRtLigqdGhyaWZ0dGVzdC5OdW1iZXJ6KSkgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTyB7CisJCXQuRXJyb3JmKCJVbm1hcnNoYWxUZXh0KFRXTykgPSAlcyIsIHRtKQorCX0KKworCWVyciA9IHRtLlVubWFyc2hhbFRleHQoW11ieXRlKCJOQU4iKSkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIkVycm9yIGZyb20gVW5tYXJzaGFsVGV4dChOQU4pIikKKwl9Cit9CisKK2Z1bmMgVGVzdEpTT05NYXJzaGFsVW5tYXJzaGFsKHQgKnRlc3RpbmcuVCkgeworCXMxIDo9IHRocmlmdHRlc3QuU3RydWN0QnsKKwkJQWE6ICZ0aHJpZnR0ZXN0LlN0cnVjdEF7UzogIkFhIn0sCisJCUFiOiAmdGhyaWZ0dGVzdC5TdHJ1Y3RBe1M6ICJBYiJ9LAorCX0KKworCWIsIGVyciA6PSBqc29uLk1hcnNoYWwoczEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20ganNvbi5NYXJzaGFsOiAlcyIsIGVycikKKwl9CisKKwlzMiA6PSB0aHJpZnR0ZXN0LlN0cnVjdEJ7fQorCWVyciA9IGpzb24uVW5tYXJzaGFsKGIsICZzMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBqc29uLlVubWFyc2hhbDogJXMiLCBlcnIpCisJfQorCisJaWYgKnMxLkFhICE9ICpzMi5BYSB8fCAqczEuQWIgIT0gKnMyLkFiIHsKKwkJdC5Mb2dmKCJzMSA9ICUrdiIsIHMxKQorCQl0LkxvZ2YoInMyID0gJSt2IiwgczIpCisJCXQuRXJyb3JmKCJqc29uOiBVbm1hcnNoYWwoTWFyc2hhbChzKSkgIT0gcyIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMDU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28KQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImdvdGFndGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0RGVmYXVsdFRhZyh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGdvdGFndGVzdC5UYWdnZWR7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJZmllbGQsIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJTdHJpbmdUaGluZyIpCisJaWYgIW9rIHx8IGZpZWxkLlRhZy5HZXQoImpzb24iKSAhPSAic3RyaW5nX3RoaW5nIiB7CisJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgZGVmYXVsdCB0YWcgdmFsdWUiKQorCX0KK30KKworZnVuYyBUZXN0Q3VzdG9tVGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIkludFRoaW5nIikKKwlpZiAhb2sgfHwgZmllbGQuVGFnLkdldCgianNvbiIpICE9ICJpbnRfdGhpbmcsc3RyaW5nIiB7CisJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgY3VzdG9tIHRhZyB2YWx1ZSIpCisJfQorfQorCitmdW5jIFRlc3RPcHRpb25hbFRhZyh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGdvdGFndGVzdC5UYWdnZWR7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJZmllbGQsIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJPcHRpb25hbEludFRoaW5nIikKKwlpZiAhb2sgfHwgZmllbGQuVGFnLkdldCgianNvbiIpICE9ICJvcHRpb25hbF9pbnRfdGhpbmcsb21pdGVtcHR5IiB7CisJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgZGVmYXVsdCB0YWcgdmFsdWUgZm9yIG9wdGlvbmFsIGZpZWxkIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvaWdub3JlaW5pdGlhbGlzbXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q1ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvaWdub3JlaW5pdGlhbGlzbXNfdGVzdC5nbwpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiaWdub3JlaW5pdGlhbGlzbXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RJZ25vcmVJbml0aWFsaXNtc0ZsYWdJc0hvbm91cmVkKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gaWdub3JlaW5pdGlhbGlzbXN0ZXN0Lklnbm9yZUluaXRpYWxpc21zVGVzdHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlfLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiSWQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIklkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIk15SWQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk15SWQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTnVtQ3B1IikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJOdW1DcHUgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTnVtR3B1IikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJOdW1HcHUgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTXlfSUQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk15X0lEIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2luaXRpYWxpc21zX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5MjNkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2luaXRpYWxpc21zX3Rlc3QuZ28KQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImluaXRpYWxpc21zdGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VGhhdENvbW1vbkluaXRpYWxpc21zQXJlRml4ZWQodCAqdGVzdGluZy5UKSB7CisJcyA6PSBpbml0aWFsaXNtc3Rlc3QuSW5pdGlhbGlzbXNUZXN0e30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCV8sIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJVc2VySUQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIlVzZXJJRCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJTZXJ2ZXJVUkwiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIlNlcnZlclVSTCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJJRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiSUQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFjNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJIm11bHRpcGxleGVkcHJvdG9jb2x0ZXN0IgorCSJuZXQiCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGltZSIKKykKKworZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpIG5ldC5BZGRyIHsKKwlpZiBsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgIjEyNy4wLjAuMTowIik7IGVyciAhPSBuaWwgeworCQlwYW5pYygiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKKwl9IGVsc2UgeworCQlkZWZlciBsLkNsb3NlKCkKKwkJcmV0dXJuIGwuQWRkcigpCisJfQorfQorCit0eXBlIEZpcnN0SW1wbCBzdHJ1Y3R7fQorCitmdW5jIChmICpGaXJzdEltcGwpIFJldHVybk9uZShjdHggY29udGV4dC5Db250ZXh0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIDEsIG5pbAorfQorCit0eXBlIFNlY29uZEltcGwgc3RydWN0e30KKworZnVuYyAocyAqU2Vjb25kSW1wbCkgUmV0dXJuVHdvKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gMiwgbmlsCit9CisKK2Z1bmMgY3JlYXRlVHJhbnNwb3J0KGFkZHIgbmV0LkFkZHIpICh0aHJpZnQuVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQorCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gdHJhbnNwb3J0LCBuaWwKK30KKworZnVuYyBUZXN0TXVsdGlwbGV4ZWRQcm90b2NvbEZpcnN0KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KSwgIkZpcnN0U2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgOj0gY2xpZW50LlJldHVybk9uZShkZWZhdWx0Q3R4KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY2FsbCBmaXJzdCBzZXJ2ZXI6IiwgZXJyKQorCX0gZWxzZSBpZiByZXQgIT0gMSB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCisJfQorfQorCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sU2Vjb25kKHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KSwgIlNlY29uZFNlcnZpY2UiKQorCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIHNlY29uZCBzZXJ2ZXI6IiwgZXJyKQorCX0gZWxzZSBpZiByZXQgIT0gMiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCisJfQorfQorCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCisJLy9leHBlY3QgZXJyb3Igc2luY2UgZGVmYXVsdCBwcm9jZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0aW5nIGVycm9yIikKKwl9CisKKwkvL3JlZ2lzdGVyIGRlZmF1bHQgcHJvY2Vzc29yIGFuZCBjYWxsIGFnYWluCisJcHJvY2Vzc29yLlJlZ2lzdGVyRGVmYXVsdChtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkpCisJdHJhbnNwb3J0LCBlcnIgPSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKwljbGllbnQgPSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgPSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGxlZ2FjeSBzZXJ2ZXI6IiwgZXJyKQorCX0KKwlpZiByZXQgIT0gMiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL25hbWVzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiNjNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL25hbWVzX3Rlc3QuZ28KQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJIm5hbWVzdGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VGhhdEF0dHJpYnV0ZU5hbWVTdWJzdGl0dWlvbkRvZXNOb3RPY2N1cih0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IG5hbWVzdGVzdC5OYW1lc1Rlc3R7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJXywgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlR5cGUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIlR5cGUgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMGJiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm9uZXdheXRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGltZSIKKykKKworZnVuYyBmaW5kUG9ydCgpIG5ldC5BZGRyIHsKKwlpZiBsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgIjEyNy4wLjAuMTowIik7IGVyciAhPSBuaWwgeworCQlwYW5pYygiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKKwl9IGVsc2UgeworCQlkZWZlciBsLkNsb3NlKCkKKwkJcmV0dXJuIGwuQWRkcigpCisJfQorfQorCit0eXBlIGltcGwgc3RydWN0e30KKworZnVuYyAoaSAqaW1wbCkgSGkoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4gaW50NjQsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSAgICAgICAgeyBmbXQuUHJpbnRsbigiSGkhIik7IHJldHVybiB9CitmdW5jIChpICppbXBsKSBFbXB0eWZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB9CitmdW5jIChpICppbXBsKSBFY2hvSW50KGN0eCBjb250ZXh0LkNvbnRleHQsIHBhcmFtIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7IHJldHVybiBwYXJhbSwgbmlsIH0KKworY29uc3QgVElNRU9VVCA9IHRpbWUuU2Vjb25kCisKK3ZhciBhZGRyIG5ldC5BZGRyCit2YXIgc2VydmVyICp0aHJpZnQuVFNpbXBsZVNlcnZlcgordmFyIGNsaWVudCAqb25ld2F5dGVzdC5PbmVXYXlDbGllbnQKKworZnVuYyBUZXN0SW5pdE9uZXdheSh0ICp0ZXN0aW5nLlQpIHsKKwl2YXIgZXJyIGVycm9yCisJYWRkciA9IGZpbmRQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlwcm9jZXNzb3IgOj0gb25ld2F5dGVzdC5OZXdPbmVXYXlQcm9jZXNzb3IoJmltcGx7fSkKKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQorfQorCitmdW5jIFRlc3RJbml0T25ld2F5Q2xpZW50KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXByb3RvY29sIDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG9uZXdheXRlc3QuTmV3T25lV2F5Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0Q2FsbE9uZXdheVNlcnZlcih0ICp0ZXN0aW5nLlQpIHsKKwkvL2NhbGwgb25ld2F5IGZ1bmN0aW9uCisJZXJyIDo9IGNsaWVudC5IaShkZWZhdWx0Q3R4LCAxLCAiIikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQorCX0KKwkvL1RoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgcHJvdG9jb2wgcHJvYmxlbXMgd2l0aCBzaW5nbGUgb25ld2F5IGNhbGwgc28gd2UgY2FsbCBpdCBzZWNvbmQgdGltZQorCWksIGVyciA6PSBjbGllbnQuRWNob0ludChkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQorCX0KKwlpZiBpICE9IDQyIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXR1cm5lZCB2YWx1ZTogIiwgaSkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9vcHRpb25hbF9maWVsZHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YWQ2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9vcHRpb25hbF9maWVsZHNfdGVzdC5nbwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImJ5dGVzIgorCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJIm9wdGlvbmFsZmllbGRzdGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorKQorCitmdW5jIFRlc3RJc1NldFJldHVybkZhbHNlT25DcmVhdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWlmIGFvLklzU2V0UygpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIFMgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRJKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgSSBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBCIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0UzIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBTMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEkyKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgSTIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRCMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEIyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QWEoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBBYSBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEwoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBMIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TDIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBMMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldE0oKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBNIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TTIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBNMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEJpbigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEJpbiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEJpbjIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBCaW4yIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorfQorCitmdW5jIFRlc3REZWZhdWx0VmFsdWVzT25DcmVhdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWlmIGFvLkdldFMoKSAhPSAiREVGQVVMVCIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgUyIsIGFvLkdldFMoKSkKKwl9CisJaWYgYW8uR2V0SSgpICE9IDQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkiLCBhby5HZXRJKCkpCisJfQorCWlmIGFvLkdldEIoKSAhPSBmYWxzZSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCIiwgYW8uR2V0QigpKQorCX0KKwlpZiBhby5HZXRTMigpICE9ICIiIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMyIiwgYW8uR2V0UzIoKSkKKwl9CisJaWYgYW8uR2V0STIoKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkyIiwgYW8uR2V0STIoKSkKKwl9CisJaWYgYW8uR2V0QjIoKSAhPSBmYWxzZSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCMiIsIGFvLkdldEIyKCkpCisJfQorCWlmIGwgOj0gYW8uR2V0TCgpOyBsZW4obCkgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBMIiwgbCkKKwl9CisJaWYgbCA6PSBhby5HZXRMMigpOyBsZW4obCkgIT0gMiB8fCBsWzBdICE9IDEgfHwgbFsxXSAhPSAyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwyIiwgbCkKKwl9CisJLy9GSVhNRTogc2hvdWxkIHdlIHJldHVybiBlbXB0eSBtYXAgaGVyZT8KKwlpZiBtIDo9IGFvLkdldE0oKTsgbSAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgTSIsIG0pCisJfQorCWlmIG0gOj0gYW8uR2V0TTIoKTsgbGVuKG0pICE9IDIgfHwgbVsxXSAhPSAyIHx8IG1bM10gIT0gNCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBNMiIsIG0pCisJfQorCWlmIGJ2IDo9IGFvLkdldEJpbigpOyBidiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgQmluIiwgYnYpCisJfQorCWlmIGJ2IDo9IGFvLkdldEJpbjIoKTsgIWJ5dGVzLkVxdWFsKGJ2LCBbXWJ5dGUoImFzZGYiKSkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgQmluMiIsIGJ2KQorCX0KK30KKworZnVuYyBUZXN0SW5pdGlhbFZhbHVlc09uQ3JlYXRpb24odCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlpZiBhby5TICE9ICJERUZBVUxUIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBTIiwgYW8uUykKKwl9CisJaWYgYW8uSSAhPSA0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBJIiwgYW8uSSkKKwl9CisJaWYgYW8uQiAhPSBmYWxzZSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCIiwgYW8uQikKKwl9CisJaWYgYW8uUzIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMyIiwgYW8uUzIpCisJfQorCWlmIGFvLkkyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBJMiIsIGFvLkkyKQorCX0KKwlpZiBhby5CMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgQjIiLCBhby5CMikKKwl9CisJaWYgYW8uTCAhPSBuaWwgfHwgbGVuKGFvLkwpICE9IDAgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgTCIsIGFvLkwpCisJfQorCWlmIGFvLkwyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBMMiIsIGFvLkwyKQorCX0KKwlpZiBhby5NICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBNIiwgYW8uTSkKKwl9CisJaWYgYW8uTTIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0yIiwgYW8uTTIpCisJfQorCWlmIGFvLkJpbiAhPSBuaWwgfHwgbGVuKGFvLkJpbikgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4iLCBhby5CaW4pCisJfQorCWlmICFieXRlcy5FcXVhbChhby5CaW4yLCBbXWJ5dGUoImFzZGYiKSkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgQmluMiIsIGFvLkJpbjIpCisJfQorfQorCitmdW5jIFRlc3RJc1NldFJldHVyblRydWVBZnRlclVwZGF0ZSh0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLlMgPSAic29tZXZhbHVlIgorCWFvLkkgPSAxMjMKKwlhby5CID0gdHJ1ZQorCWFvLkFhID0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld1N0cnVjdEEoKQorCWlmICFhby5Jc1NldFMoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBTIHNob3VsZCBiZSBzZXQiKQorCX0KKwlpZiAhYW8uSXNTZXRJKCkgeworCQl0LkVycm9yZigiRmllbGQgSSBzaG91bGQgYmUgc2V0IikKKwl9CisJaWYgIWFvLklzU2V0QigpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIEIgc2hvdWxkIGJlIHNldCIpCisJfQorCWlmICFhby5Jc1NldEFhKCkgeworCQl0LkVycm9yZigiRmllbGQgYWEgc2hvdWxkIGJlIHNldCIpCisJfQorfQorCitmdW5jIFRlc3RMaXN0Tm90RW1wdHkodCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5MID0gW11pbnQ2NHsxLCAyLCAzfQorCWlmICFhby5Jc1NldEwoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBMIHNob3VsZCBiZSBzZXQiKQorCX0KK30KKworLy9NYWtlIHN1cmUgdGhhdCBvcHRpb25hbCBmaWVsZHMgYXJlIG5vdCBiZWluZyBzZXJpYWxpemVkCitmdW5jIFRlc3ROb09wdGlvbmFsVW5zZXRGaWVsZHNPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3ROb1NldFRvRGVmYXVsdEZpZWxkc09uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uSSA9IDQyCisJYW8uV3JpdGUocHJvdG8pCit9CisKKy8vTWFrZSBzdXJlIHRoYXQgb25seSBvbmUgZmllbGQgaXMgYmVpbmcgc2VyaWFsaXplZCB3aGVuIHNldCB0byBub24tZGVmYXVsdAorZnVuYyBUZXN0T25lSVNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JNjQpLCBpbnQxNigyKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlSTY0KGludDY0KDEyMykpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uSSA9IDEyMworCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3RPbmVMU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImwiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkxJU1QpLCBpbnQxNig5KSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlTGlzdEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuSTY0KSwgMikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlSTY0KGludDY0KDEpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVJNjQoaW50NjQoMikpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUxpc3RFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkwgPSBbXWludDY0ezEsIDJ9CisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE9uZUJpblNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEzKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlQmluYXJ5KFtdYnl0ZSgic29tZWJ5dGVzdHJpbmciKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5CaW4gPSBbXWJ5dGUoInNvbWVieXRlc3RyaW5nIikKKwlhby5Xcml0ZShwcm90bykKK30KKworZnVuYyBUZXN0T25lRW1wdHlCaW5TZXRGaWVsZE9uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigiYmluIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxMykpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUJpbmFyeShbXWJ5dGV7fSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5CaW4gPSBbXWJ5dGV7fQorCWFvLldyaXRlKHByb3RvKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkN2EwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTW9ja0dlbi4gRE8gTk9UIEVESVQhCisvLyBTb3VyY2U6IHRocmlmdCAoaW50ZXJmYWNlczogVFByb3RvY29sKQorCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJdGhyaWZ0ICJ0aHJpZnQiCisKKwlnb21vY2sgImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorKQorCisvLyBNb2NrIG9mIFRQcm90b2NvbCBpbnRlcmZhY2UKK3R5cGUgTW9ja1RQcm90b2NvbCBzdHJ1Y3QgeworCWN0cmwgICAgICpnb21vY2suQ29udHJvbGxlcgorCXJlY29yZGVyICpfTW9ja1RQcm90b2NvbFJlY29yZGVyCit9CisKKy8vIFJlY29yZGVyIGZvciBNb2NrVFByb3RvY29sIChub3QgZXhwb3J0ZWQpCit0eXBlIF9Nb2NrVFByb3RvY29sUmVjb3JkZXIgc3RydWN0IHsKKwltb2NrICpNb2NrVFByb3RvY29sCit9CisKK2Z1bmMgTmV3TW9ja1RQcm90b2NvbChjdHJsICpnb21vY2suQ29udHJvbGxlcikgKk1vY2tUUHJvdG9jb2wgeworCW1vY2sgOj0gJk1vY2tUUHJvdG9jb2x7Y3RybDogY3RybH0KKwltb2NrLnJlY29yZGVyID0gJl9Nb2NrVFByb3RvY29sUmVjb3JkZXJ7bW9ja30KKwlyZXR1cm4gbW9jaworfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRVhQRUNUKCkgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIgeworCXJldHVybiBfbS5yZWNvcmRlcgorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJGbHVzaCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiRmx1c2giKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRCaW5hcnkiKQorCXJldDAsIF8gOj0gcmV0WzBdLihbXWJ5dGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEJpbmFyeSgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRCaW5hcnkiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEJvb2wiKQorCXJldDAsIF8gOj0gcmV0WzBdLihib29sKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRCb29sKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEJvb2wiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEJ5dGUiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ4KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRCeXRlKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEJ5dGUiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZERvdWJsZSgpIChmbG9hdDY0LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkRG91YmxlIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZmxvYXQ2NCkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkRG91YmxlKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZERvdWJsZSIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChzdHJpbmcsIHRocmlmdC5UVHlwZSwgaW50MTYsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRGaWVsZEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4oc3RyaW5nKQorCXJldDEsIF8gOj0gcmV0WzFdLih0aHJpZnQuVFR5cGUpCisJcmV0MiwgXyA6PSByZXRbMl0uKGludDE2KQorCXJldDMsIF8gOj0gcmV0WzNdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MiwgcmV0MworfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRGaWVsZEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEZpZWxkQmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkRmllbGRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRGaWVsZEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRGaWVsZEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkSTE2KCkgKGludDE2LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkSTE2IikKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50MTYpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEkxNigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRJMTYiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEkzMiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDMyKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRJMzIoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkSTMyIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRJNjQoKSAoaW50NjQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRJNjQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ2NCkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkSTY0KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEk2NCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKHRocmlmdC5UVHlwZSwgaW50LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTGlzdEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUeXBlKQorCXJldDEsIF8gOj0gcmV0WzFdLihpbnQpCisJcmV0MiwgXyA6PSByZXRbMl0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZExpc3RCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRMaXN0QmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRMaXN0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTGlzdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRMaXN0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpICh0aHJpZnQuVFR5cGUsIHRocmlmdC5UVHlwZSwgaW50LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWFwQmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFR5cGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKHRocmlmdC5UVHlwZSkKKwlyZXQyLCBfIDo9IHJldFsyXS4oaW50KQorCXJldDMsIF8gOj0gcmV0WzNdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MiwgcmV0MworfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNYXBCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNYXBCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWFwRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTWFwRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZE1hcEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKHN0cmluZywgdGhyaWZ0LlRNZXNzYWdlVHlwZSwgaW50MzIsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNZXNzYWdlQmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKHRocmlmdC5UTWVzc2FnZVR5cGUpCisJcmV0MiwgXyA6PSByZXRbMl0uKGludDMyKQorCXJldDMsIF8gOj0gcmV0WzNdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MiwgcmV0MworfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNZXNzYWdlQmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWVzc2FnZUJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWVzc2FnZUVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1lc3NhZ2VFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWVzc2FnZUVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAodGhyaWZ0LlRUeXBlLCBpbnQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTZXRCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdC5UVHlwZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4oaW50KQorCXJldDIsIF8gOj0gcmV0WzJdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MgorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTZXRCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTZXRCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU2V0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU2V0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFNldEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFN0cmluZyIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU3RyaW5nKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFN0cmluZyIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAoc3RyaW5nLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU3RydWN0QmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFN0cnVjdEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFN0cnVjdEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTdHJ1Y3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTdHJ1Y3RFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU3RydWN0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFNraXAoX3BhcmFtMCB0aHJpZnQuVFR5cGUpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiU2tpcCIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgU2tpcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJTa2lwIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFRyYW5zcG9ydCgpIHRocmlmdC5UVHJhbnNwb3J0IHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVHJhbnNwb3J0IikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUcmFuc3BvcnQpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBUcmFuc3BvcnQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUcmFuc3BvcnQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCaW5hcnkoX3BhcmFtMCBbXWJ5dGUpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCaW5hcnkiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlQmluYXJ5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlQmluYXJ5IiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlQm9vbChfcGFyYW0wIGJvb2wpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCb29sIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUJvb2woYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVCb29sIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlQnl0ZShfcGFyYW0wIGludDgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCeXRlIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUJ5dGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVCeXRlIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlRG91YmxlKF9wYXJhbTAgZmxvYXQ2NCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZURvdWJsZSIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVEb3VibGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVEb3VibGUiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKF9wYXJhbTAgc3RyaW5nLCBfcGFyYW0xIHRocmlmdC5UVHlwZSwgX3BhcmFtMiBpbnQxNikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUZpZWxkQmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlRmllbGRCZWdpbihhcmcwLCBhcmcxLCBhcmcyIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUZpZWxkQmVnaW4iLCBhcmcwLCBhcmcxLCBhcmcyKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVGaWVsZEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVGaWVsZEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRmllbGRFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRmllbGRTdG9wIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUZpZWxkU3RvcCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRmllbGRTdG9wIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlSTE2KF9wYXJhbTAgaW50MTYpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVJMTYiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlSTE2KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlSTE2IiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlSTMyKF9wYXJhbTAgaW50MzIpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVJMzIiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlSTMyKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlSTMyIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlSTY0KF9wYXJhbTAgaW50NjQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVJNjQiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlSTY0KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlSTY0IiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKF9wYXJhbTAgdGhyaWZ0LlRUeXBlLCBfcGFyYW0xIGludCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUxpc3RCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVMaXN0QmVnaW4oYXJnMCwgYXJnMSBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVMaXN0QmVnaW4iLCBhcmcwLCBhcmcxKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUxpc3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTGlzdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTGlzdEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1hcEJlZ2luKF9wYXJhbTAgdGhyaWZ0LlRUeXBlLCBfcGFyYW0xIHRocmlmdC5UVHlwZSwgX3BhcmFtMiBpbnQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNYXBCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEsIF9wYXJhbTIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNYXBCZWdpbihhcmcwLCBhcmcxLCBhcmcyIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1hcEJlZ2luIiwgYXJnMCwgYXJnMSwgYXJnMikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZU1hcEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNYXBFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1hcEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihfcGFyYW0wIHN0cmluZywgX3BhcmFtMSB0aHJpZnQuVE1lc3NhZ2VUeXBlLCBfcGFyYW0yIGludDMyKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWVzc2FnZUJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSwgX3BhcmFtMikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1lc3NhZ2VCZWdpbihhcmcwLCBhcmcxLCBhcmcyIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1lc3NhZ2VCZWdpbiIsIGFyZzAsIGFyZzEsIGFyZzIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWVzc2FnZUVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNZXNzYWdlRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVNZXNzYWdlRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oX3BhcmFtMCB0aHJpZnQuVFR5cGUsIF9wYXJhbTEgaW50KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU2V0QmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU2V0QmVnaW4oYXJnMCwgYXJnMSBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTZXRCZWdpbiIsIGFyZzAsIGFyZzEpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTZXRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU2V0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTZXRFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTdHJpbmcoX3BhcmFtMCBzdHJpbmcpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTdHJpbmciLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU3RyaW5nKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU3RyaW5nIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4oX3BhcmFtMCBzdHJpbmcpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTdHJ1Y3RCZWdpbiIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTdHJ1Y3RCZWdpbihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVN0cnVjdEJlZ2luIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVN0cnVjdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTdHJ1Y3RFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVN0cnVjdEVuZCIpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmQ5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbHNfdGVzdC5nbwpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aHJpZnR0ZXN0IgorKQorCitmdW5jIFJ1blNvY2tldFRlc3RTdWl0ZSh0ICp0ZXN0aW5nLlQsIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwKKwl0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSkgeworCS8vIHNlcnZlcgorCXZhciBlcnIgZXJyb3IKKwlhZGRyID0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXByb2Nlc3NvciA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RQcm9jZXNzb3IoTmV3VGhyaWZ0VGVzdEhhbmRsZXIoKSkKKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwlzZXJ2ZXIuTGlzdGVuKCkKKworCWdvIHNlcnZlci5TZXJ2ZSgpCisKKwkvLyBjbGllbnQKKwl2YXIgdHJhbnNwb3J0IHRocmlmdC5UVHJhbnNwb3J0ID0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKKwl0cmFuc3BvcnQsIGVyciA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCXZhciBwcm90b2NvbCB0aHJpZnQuVFByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwl0aHJpZnRUZXN0Q2xpZW50IDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJZXJyID0gdHJhbnNwb3J0Lk9wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCX0KKworCWRyaXZlciA6PSBOZXdUaHJpZnRUZXN0RHJpdmVyKHQsIHRocmlmdFRlc3RDbGllbnQpCisJZHJpdmVyLlN0YXJ0KCkKK30KKworLy8gUnVuIHRlc3Qgc3VpdGUgdXNpbmcgVEpTT05Qcm90b2NvbAorZnVuYyBUZXN0VEpTT05Qcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODkxMikpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUQmluYXJ5UHJvdG9jb2wKK2Z1bmMgVGVzdFRCaW5hcnlQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCXRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODkxMikpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQl0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUQ29tcGFjdEJpbmFyeVByb3RvY29sCitmdW5jIFRlc3RUQ29tcGFjdFByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTQxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorCSJvcHRpb25hbGZpZWxkc3Rlc3QiCisJInJlcXVpcmVkZmllbGR0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCispCisKK2Z1bmMgVGVzdFJlcXVpcmVkRmllbGRfU3VjZWNzc1doZW5TZXQodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IFJlcXVpcmVkRmllbGQgaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWlyZWQgZmllbGQgc2V0CisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke05hbWU6ICJ0aGlzIGlzIGEgdGVzdCJ9CisJc291cmNlRGF0YSwgZXJyIDo9IHRocmlmdC5OZXdUU2VyaWFsaXplcigpLldyaXRlKGNvbnRleHQuQmFja2dyb3VuZCgpLCBzb3VyY2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJmYWlsZWQgdG8gc2VyaWFsaXplICVUOiAldiIsIHNvdXJjZSwgZXJyKQorCX0KKworCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRGlkIG5vdCBleHBlY3QgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVzZXJpYWxpemUgdGhlIHJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGQ6ICV2IiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9FcnJvcldoZW5NaXNzaW5nKHQgKnRlc3RpbmcuVCkgeworCS8vIGNyZWF0ZSBhIG5ldyBPdGhlclRoaW5nIGluc3RhbmNlLCB3aXRob3V0IHNldHRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkCisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5PdGhlclRoaW5ne30KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJLy8gYXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSBpbnRvIGEgZGlmZmVyZW50IHR5cGUgKHdoaWNoIHNob3VsZCBmYWlsKQorCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSBhbiBvYmplY3Qgd2hpY2ggaXMgbWlzc2luZyBhIHJlcXVpcmVkIGZpZWxkIikKKwl9Cit9CisKK2Z1bmMgVGVzdFN0cnVjdFJlYWRSZXF1aXJlZEZpZWxkcyh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJdGVzdFN0cnVjdCA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3U3RydWN0QygpCisKKwkvLyBOb25lIG9mIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0CisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiU3RydWN0QyIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisKKwllcnIgOj0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQorCX0KKwllcnIyLCBvayA6PSBlcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisKKwkvLyBPbmUgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcyBpcyBzZXQKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJTdHJ1Y3RDIiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIkkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDIpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKKwltb2NrQ3RybC5GaW5pc2goKQorCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBmYWlsIikKKwl9CisJZXJyMiwgb2sgPSBlcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisKKwkvLyBCb3RoIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMgYXJlIHNldAorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlN0cnVjdEMiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiczIiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDQpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RyaW5nKCkuUmV0dXJuKCJ0ZXN0IiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisKKwllcnIgPSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBzdWNjZWVkIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwlzdCAic2VydmljZXN0ZXN0IgorKQorCisvL3RoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkLCBpdCB3aWxsIGZhaWwgdG8gY29tcGlsZSBpZiBjaGVjayBpcyBmYWlsZWQKK2Z1bmMgc3RhdGljQ2hlY2tTdHJ1Y3RBcmdzUmVzdWx0cygpIHsKKwkvL0NoZWNrIHRoYXQgc3RydWN0IGFyZ3MgYW5kIHJlc3VsdHMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UKKwl2YXIgc2EgKnN0LlN0cnVjdEEgPSAmc3QuU3RydWN0QXt9CisJdmFyIGlmYWNlIHN0LkFTZXJ2CisJdmFyIGVyciBlcnJvcgorCisJc2EsIGVyciA9IGlmYWNlLlN0cnVjdEFGdW5jXzFzdHJ1Y3RBKGRlZmF1bHRDdHgsIHNhKQorCV8gPSBlcnIKKwlfID0gc2EKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1NGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0dGVzdCIKKykKKwordHlwZSBUaHJpZnRUZXN0RHJpdmVyIHN0cnVjdCB7CisJY2xpZW50IHRocmlmdHRlc3QuVGhyaWZ0VGVzdAorCXQgICAgICAqdGVzdGluZy5UCit9CisKK2Z1bmMgTmV3VGhyaWZ0VGVzdERyaXZlcih0ICp0ZXN0aW5nLlQsIGNsaWVudCB0aHJpZnR0ZXN0LlRocmlmdFRlc3QpICpUaHJpZnRUZXN0RHJpdmVyIHsKKwlyZXR1cm4gJlRocmlmdFRlc3REcml2ZXJ7Y2xpZW50LCB0fQorfQorCitmdW5jIChwICpUaHJpZnRUZXN0RHJpdmVyKSBTdGFydCgpIHsKKwljbGllbnQgOj0gcC5jbGllbnQKKwl0IDo9IHAudAorCisJaWYgY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RWb2lkIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJUZXN0Iik7IHIgIT0gIlRlc3QiIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggc2ltcGxlIHRleHQgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIiIpOyByICE9ICIiIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggZW1wdHkgdGV4dCBmYWlsZWQiKQorCX0KKworCXN0cmluZ1Rlc3QgOj0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKwkJIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKwkJItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisJCSLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworCQkiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKwkJIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisJCSJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworCQkiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKwkJIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworCQkiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisJCSJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworCQki4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKwkJIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisJCSJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKwkJIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKwkJIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworCQkiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKwkJIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKwkJIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKwkJItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisJCSJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworCQkiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKwkJIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworCQkiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisJCSJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3RyaW5nVGVzdCk7IHIgIT0gc3RyaW5nVGVzdCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGFsbCBsYW5ndWFnZXMgZmFpbGVkIikKKwl9CisKKwlzcGVjaWFsQ2hhcmFjdGVycyA6PSAicXVvdGU6IFwiIGJhY2tzbGFzaDoiICsKKwkJIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiArCisJCSIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAnXFxcYlxuXHJcdCciICsKKwkJIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCisJCSIgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXFwiIH19fXsgW1tbICIKKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCBzcGVjaWFsQ2hhcmFjdGVycyk7IHIgIT0gc3BlY2lhbENoYXJhY3RlcnMgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBzcGVjaWFsQ2hhcmFjdGVycyBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoMSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAwKTsgciAhPSAwIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgwKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoLTEpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgLTEyNyk7IHIgIT0gLTEyNyB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoLTEyNykgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgLTEpOyByICE9IC0xIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STMyKC0xKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEkzMigxKSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtNSk7IHIgIT0gLTUgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJNjQoLTUpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA1KTsgciAhPSA1IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STY0KDUpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtMzQzNTk3MzgzNjgpOyByICE9IC0zNDM1OTczODM2OCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEk2NCgtMzQzNTk3MzgzNjgpIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIC01LjIwOTg1MjMpOyByICE9IC01LjIwOTg1MjMgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3REb3VibGUoLTUuMjA5ODUyMykgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIC03LjAxMjA1MjE3NTIxNTA0NCk7IHIgIT0gLTcuMDEyMDUyMTc1MjE1MDQ0IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RG91YmxlKC03LjAxMjA1MjE3NTIxNTA0NCkgZmFpbGVkIikKKwl9CisKKwkvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworCW91dCA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJb3V0LlN0cmluZ1RoaW5nID0gIlplcm8iCisJb3V0LkJ5dGVUaGluZyA9IDEKKwlvdXQuSTMyVGhpbmcgPSAtMworCW91dC5JNjRUaGluZyA9IDEwMDAwMDAKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJ1Y3QgZmFpbGVkIikKKwl9CisKKwlvdXQyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCisJb3V0Mi5CeXRlVGhpbmcgPSAxCisJb3V0Mi5TdHJ1Y3RUaGluZyA9IG91dAorCW91dDIuSTMyVGhpbmcgPSA1CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCBvdXQyKTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dDIpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TmVzdCBmYWlsZWQiKQorCX0KKworCW1hcG91dCA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKKwlmb3IgaSA6PSBpbnQzMigwKTsgaSA8IDU7IGkrKyB7CisJCW1hcG91dFtpXSA9IGkgLSAxMAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbWFwb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcG91dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RNYXAgZmFpbGVkIikKKwl9CisKKwltYXBUZXN0SW5wdXQgOj0gbWFwW3N0cmluZ11zdHJpbmd7CisJCSJhIjogIjEyMyIsICJhIGIiOiAid2l0aCBzcGFjZXMgIiwgInNhbWUiOiAic2FtZSIsICIwIjogIm51bWVyaWMga2V5IiwKKwkJImxvbmdWYWx1ZSI6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICJsb25nIGtleSIsCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBtYXBUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwVGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZ01hcCBmYWlsZWQiKQorCX0KKworCXNldFRlc3RJbnB1dCA6PSBbXWludDMyezEsIDIsIDN9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KGRlZmF1bHRDdHgsIHNldFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBzZXRUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U2V0IGZhaWxlZCIpCisJfQorCisJbGlzdFRlc3QgOj0gW11pbnQzMnsxLCAyLCAzfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdExpc3QoZGVmYXVsdEN0eCwgbGlzdFRlc3QpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbGlzdFRlc3QpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TGlzdCBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEVudW0oZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORSk7IHIgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEVudW0gZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RUeXBlZGVmKGRlZmF1bHRDdHgsIDY5KTsgciAhPSA2OSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFR5cGVkZWYgZmFpbGVkIikKKwl9CisKKwltYXBNYXBUZXN0IDo9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJCTQ6ICB7MTogMSwgMjogMiwgMzogMywgNDogNH0sCisJCS00OiB7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDEpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwTWFwVGVzdCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RNYXBNYXAgZmFpbGVkIikKKwl9CisKKwljcmF6eVgxIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwljcmF6eVgxLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgorCWNyYXp5WDEuQnl0ZVRoaW5nID0gNAorCWNyYXp5WDEuSTMyVGhpbmcgPSA0CisJY3JhenlYMS5JNjRUaGluZyA9IDQKKworCWNyYXp5WDIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWNyYXp5WDIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCWNyYXp5WDIuQnl0ZVRoaW5nID0gMgorCWNyYXp5WDIuSTMyVGhpbmcgPSAyCisJY3JhenlYMi5JNjRUaGluZyA9IDIKKworCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkezU6IDUsIDg6IDh9CisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0e2NyYXp5WDEsIGNyYXp5WDJ9CisKKwljcmF6eUVtcHR5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5RW1wdHkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWR7fQorCWNyYXp5RW1wdHkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0e30KKworCWluc2FuaXR5IDo9IG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5eworCQkxOiB7dGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTzogY3JhenksIHRocmlmdHRlc3QuTnVtYmVyel9USFJFRTogY3Jhenl9LAorCQkyOiB7dGhyaWZ0dGVzdC5OdW1iZXJ6X1NJWDogY3JhenlFbXB0eX0sCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGluc2FuaXR5KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEluc2FuaXR5IGZhaWxlZCIpCisJfQorCisJaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJURXhjZXB0aW9uIik7IGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFRFeGNlcHRpb24gZmFpbGVkIikKKwl9CisKKwlpZiBlcnIsIG9rIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpLigqdGhyaWZ0dGVzdC5YY2VwdGlvbik7IG9rID09IGZhbHNlIHx8IGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCisJfSBlbHNlIGlmIGVyci5FcnJvckNvZGUgIT0gMTAwMSB8fCBlcnIuTWVzc2FnZSAhPSAiWGNlcHRpb24iIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBYY2VwdGlvbiBmYWlsZWQiKQorCX0KKworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAibm8gRXhjZXB0aW9uIik7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIG5vIEV4Y2VwdGlvbiBmYWlsZWQiKQorCX0KKworCWlmIGVyciA6PSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAwKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RPbmV3YXkgZmFpbGVkIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOWVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkidGhyaWZ0IgorCSJ0aHJpZnR0ZXN0IgorCSJ0aW1lIgorKQorCit0eXBlIFNlY29uZFNlcnZpY2VIYW5kbGVyIHN0cnVjdCB7Cit9CisKK2Z1bmMgTmV3U2Vjb25kU2VydmljZUhhbmRsZXIoKSAqU2Vjb25kU2VydmljZUhhbmRsZXIgeworCXJldHVybiAmU2Vjb25kU2VydmljZUhhbmRsZXJ7fQorfQorCitmdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgQmxhaEJsYWgoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqU2Vjb25kU2VydmljZUhhbmRsZXIpIFNlY29uZHRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK3R5cGUgVGhyaWZ0VGVzdEhhbmRsZXIgc3RydWN0IHsKK30KKworZnVuYyBOZXdUaHJpZnRUZXN0SGFuZGxlcigpICpUaHJpZnRUZXN0SGFuZGxlciB7CisJcmV0dXJuICZUaHJpZnRUZXN0SGFuZGxlcnt9Cit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Vm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEkzMihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0STY0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCaW5hcnkoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RydWN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE5lc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKnRocmlmdHRlc3QuWHRydWN0MikgKHIgKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RW51bShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyB0aHJpZnR0ZXN0Lk51bWJlcnopIChyIHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RUeXBlZGVmKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHRocmlmdHRlc3QuVXNlcklkKSAociB0aHJpZnR0ZXN0LlVzZXJJZCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXBNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCXIgPSBtYWtlKG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIpCisJcG9zIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQorCW5lZyA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKKworCWZvciBpIDo9IGludDMyKDEpOyBpIDwgNTsgaSsrIHsKKwkJcG9zW2ldID0gaQorCQluZWdbLWldID0gLWkKKwl9CisJcls0XSA9IHBvcworCXJbLTRdID0gbmVnCisKKwlyZXR1cm4gciwgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0SW5zYW5pdHkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJndW1lbnQgKnRocmlmdHRlc3QuSW5zYW5pdHkpIChyIG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5LCBlcnIgZXJyb3IpIHsKKwloZWxsbyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJaGVsbG8uU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCWhlbGxvLkJ5dGVUaGluZyA9IDIKKwloZWxsby5JMzJUaGluZyA9IDIKKwloZWxsby5JNjRUaGluZyA9IDIKKworCWdvb2RieWUgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWdvb2RieWUuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJZ29vZGJ5ZS5CeXRlVGhpbmcgPSA0CisJZ29vZGJ5ZS5JMzJUaGluZyA9IDQKKwlnb29kYnllLkk2NFRoaW5nID0gNAorCisJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenkuVXNlck1hcCA9IG1ha2UobWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZCkKKwljcmF6eS5Vc2VyTWFwW3RocmlmdHRlc3QuTnVtYmVyel9FSUdIVF0gPSA4CisJY3JhenkuVXNlck1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRV0gPSA1CisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0e2dvb2RieWUsIGhlbGxvfQorCisJZmlyc3RfbWFwIDo9IG1ha2UobWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKKwlzZWNvbmRfbWFwIDo9IG1ha2UobWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKKworCWZpcnN0X21hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPXSA9IGNyYXp5CisJZmlyc3RfbWFwW3RocmlmdHRlc3QuTnVtYmVyel9USFJFRV0gPSBjcmF6eQorCisJbG9vbmV5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCXNlY29uZF9tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X1NJWF0gPSBsb29uZXkKKworCXZhciBpbnNhbmUgPSBtYWtlKG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5KQorCWluc2FuZVsxXSA9IGZpcnN0X21hcAorCWluc2FuZVsyXSA9IHNlY29uZF9tYXAKKworCXJldHVybiBpbnNhbmUsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgaW50OCwgYXJnMSBpbnQzMiwgYXJnMiBpbnQ2NCwgYXJnMyBtYXBbaW50MTZdc3RyaW5nLCBhcmc0IHRocmlmdHRlc3QuTnVtYmVyeiwgYXJnNSB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyID0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCXIuQnl0ZVRoaW5nID0gYXJnMAorCXIuSTMyVGhpbmcgPSBhcmcxCisJci5JNjRUaGluZyA9IGFyZzIKKwlyZXR1cm4gciwgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwlpZiBhcmcgPT0gIlhjZXB0aW9uIiB7CisJCXggOj0gdGhyaWZ0dGVzdC5OZXdYY2VwdGlvbigpCisJCXguRXJyb3JDb2RlID0gMTAwMQorCQl4Lk1lc3NhZ2UgPSBhcmcKKwkJcmV0dXJuIHgKKwl9IGVsc2UgaWYgYXJnID09ICJURXhjZXB0aW9uIiB7CisJCXJldHVybiB0aHJpZnQuVEV4Y2VwdGlvbihlcnJvcnMuTmV3KGFyZykpCisJfSBlbHNlIHsKKwkJcmV0dXJuIG5pbAorCX0KK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CisJaWYgYXJnMCA9PSAiWGNlcHRpb24iIHsKKwkJeCA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uKCkKKwkJeC5FcnJvckNvZGUgPSAxMDAxCisJCXguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorCQlyZXR1cm4gbmlsLCB4CisJfSBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgeworCQl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uMigpCisJCXgyLkVycm9yQ29kZSA9IDIwMDIKKwkJeDIuU3RydWN0VGhpbmcgPSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJCXgyLlN0cnVjdFRoaW5nLlN0cmluZ1RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorCQlyZXR1cm4gbmlsLCB4MgorCX0KKworCXJlcyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJcmVzLlN0cmluZ1RoaW5nID0gYXJnMQorCXJldHVybiByZXMsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE9uZXdheShjdHggY29udGV4dC5Db250ZXh0LCBzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworCXRpbWUuU2xlZXAodGltZS5TZWNvbmQgKiB0aW1lLkR1cmF0aW9uKHNlY29uZHNUb1NsZWVwKSkKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWUyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkidW5pb25iaW5hcnl0ZXN0IgorKQorCisKKy8vIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTczCitmdW5jIFRlc3RVbmlvbkJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IHVuaW9uYmluYXJ5dGVzdC5OZXdTYW1wbGUoKQorCXMuVTEgPSBtYXBbc3RyaW5nXXN0cmluZ3t9CisJcy5VMiA9IFtdYnl0ZXt9CisJaWYgbiA6PSBzLkNvdW50U2V0RmllbGRzU2FtcGxlKCk7IG4gIT0gMiB7CisJCXQuRXJyb3JmKCJFeHBlY3RlZCAyIHNldCBmaWVsZHMsIGdvdCAlZCEiLCBuKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2RlZmF1bHRfdmFsdWVfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2RlZmF1bHRfdmFsdWVfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNiZjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fZGVmYXVsdF92YWx1ZV90ZXN0LmdvCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ1bmlvbmRlZmF1bHR2YWx1ZXRlc3QiCispCisKK2Z1bmMgVGVzdFVuaW9uRGVmYXVsdFZhbHVlKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gdW5pb25kZWZhdWx0dmFsdWV0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCWQgOj0gcy5HZXREZXNjZW5kYW50KCkKKwlpZiBkID09IG5pbCB7CisJCXQuRXJyb3IoIkRlZmF1bHQgVW5pb24gdmFsdWUgbm90IHNldCEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkN2VlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2NvbnN0ICgKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAgPSAwCisJVU5LTk9XTl9NRVRIT0QgICAgICAgICAgICAgICAgID0gMQorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiA9IDIKKwlXUk9OR19NRVRIT0RfTkFNRSAgICAgICAgICAgICAgPSAzCisJQkFEX1NFUVVFTkNFX0lEICAgICAgICAgICAgICAgID0gNAorCU1JU1NJTkdfUkVTVUxUICAgICAgICAgICAgICAgICA9IDUKKwlJTlRFUk5BTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA2CisJUFJPVE9DT0xfRVJST1IgICAgICAgICAgICAgICAgID0gNworKQorCit2YXIgZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT046ICAidW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iLAorCVVOS05PV05fTUVUSE9EOiAgICAgICAgICAgICAgICAgInVua25vd24gbWV0aG9kIiwKKwlJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT046ICJpbnZhbGlkIG1lc3NhZ2UgdHlwZSIsCisJV1JPTkdfTUVUSE9EX05BTUU6ICAgICAgICAgICAgICAid3JvbmcgbWV0aG9kIG5hbWUiLAorCUJBRF9TRVFVRU5DRV9JRDogICAgICAgICAgICAgICAgImJhZCBzZXF1ZW5jZSBJRCIsCisJTUlTU0lOR19SRVNVTFQ6ICAgICAgICAgICAgICAgICAibWlzc2luZyByZXN1bHQiLAorCUlOVEVSTkFMX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gaW50ZXJuYWwgZXJyb3IiLAorCVBST1RPQ09MX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgZXJyb3IiLAorfQorCisvLyBBcHBsaWNhdGlvbiBsZXZlbCBUaHJpZnQgZXhjZXB0aW9uCit0eXBlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQzMgorCVJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvcgorCVdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IKK30KKwordHlwZSB0QXBwbGljYXRpb25FeGNlcHRpb24gc3RydWN0IHsKKwltZXNzYWdlIHN0cmluZworCXR5cGVfICAgaW50MzIKK30KKworZnVuYyAoZSB0QXBwbGljYXRpb25FeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlpZiBlLm1lc3NhZ2UgIT0gIiIgeworCQlyZXR1cm4gZS5tZXNzYWdlCisJfQorCXJldHVybiBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlW2UudHlwZV9dCit9CisKK2Z1bmMgTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGVfIGludDMyLCBtZXNzYWdlIHN0cmluZykgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKwlyZXR1cm4gJnRBcHBsaWNhdGlvbkV4Y2VwdGlvbnttZXNzYWdlLCB0eXBlX30KK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQzMiB7CisJcmV0dXJuIHAudHlwZV8KK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCS8vIFRPRE86IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyCisJXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwltZXNzYWdlIDo9ICIiCisJdHlwZV8gOj0gaW50MzIoVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04pCisKKwlmb3IgeworCQlfLCB0dHlwZSwgaWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIHR0eXBlID09IFNUT1AgeworCQkJYnJlYWsKKwkJfQorCQlzd2l0Y2ggaWQgeworCQljYXNlIDE6CisJCQlpZiB0dHlwZSA9PSBTVFJJTkcgeworCQkJCWlmIG1lc3NhZ2UsIGVyciA9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9CisJCWNhc2UgMjoKKwkJCWlmIHR0eXBlID09IEkzMiB7CisJCQkJaWYgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9CisJCWRlZmF1bHQ6CisJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlpZiBlcnIgPSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlwLm1lc3NhZ2UgPSBtZXNzYWdlCisJcC50eXBlXyA9IHR5cGVfCisKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwlpZiBsZW4ocC5FcnJvcigpKSA+IDAgeworCQllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm1lc3NhZ2UiLCBTVFJJTkcsIDEpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZXJyID0gb3Byb3QuV3JpdGVTdHJpbmcocC5FcnJvcigpKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJCWVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigidHlwZSIsIEkzMiwgMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlSTMyKHAudHlwZV8pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlU3RydWN0RW5kKCkKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgeworCWV4YyA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04sICIiKQorCWlmIGV4Yy5FcnJvcigpICE9IGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2VbVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT05dIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIGVtcHR5IHN0cmluZyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCisJfQorCWlmIGV4Yy5UeXBlSWQoKSAhPSBVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFVOS05PV04gZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyV2JyIsIGV4Yy5UeXBlSWQoKSkKKwl9CisJZXhjID0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFdST05HX01FVEhPRF9OQU1FLCAianVua19tZXRob2QiKQorCWlmIGV4Yy5FcnJvcigpICE9ICJqdW5rX21ldGhvZCIgeworCQl0LkZhdGFsZigiRXhwZWN0ZWQgJ2p1bmtfbWV0aG9kJyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCisJfQorCWlmIGV4Yy5UeXBlSWQoKSAhPSBXUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFdST05HX01FVEhPRF9OQU1FIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjkwYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImVuY29kaW5nL2JpbmFyeSIKKwkiZXJyb3JzIgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorKQorCit0eXBlIFRCaW5hcnlQcm90b2NvbCBzdHJ1Y3QgeworCXRyYW5zICAgICAgICAgVFJpY2hUcmFuc3BvcnQKKwlvcmlnVHJhbnNwb3J0IFRUcmFuc3BvcnQKKwlyZWFkZXIgICAgICAgIGlvLlJlYWRlcgorCXdyaXRlciAgICAgICAgaW8uV3JpdGVyCisJc3RyaWN0UmVhZCAgICBib29sCisJc3RyaWN0V3JpdGUgICBib29sCisJYnVmZmVyICAgICAgICBbNjRdYnl0ZQorfQorCit0eXBlIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkgc3RydWN0IHsKKwlzdHJpY3RSZWFkICBib29sCisJc3RyaWN0V3JpdGUgYm9vbAorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0IFRUcmFuc3BvcnQpICpUQmluYXJ5UHJvdG9jb2wgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2wodCwgZmFsc2UsIHRydWUpCit9CisKK2Z1bmMgTmV3VEJpbmFyeVByb3RvY29sKHQgVFRyYW5zcG9ydCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbCB7CisJcCA6PSAmVEJpbmFyeVByb3RvY29se29yaWdUcmFuc3BvcnQ6IHQsIHN0cmljdFJlYWQ6IHN0cmljdFJlYWQsIHN0cmljdFdyaXRlOiBzdHJpY3RXcml0ZX0KKwlpZiBldCwgb2sgOj0gdC4oVFJpY2hUcmFuc3BvcnQpOyBvayB7CisJCXAudHJhbnMgPSBldAorCX0gZWxzZSB7CisJCXAudHJhbnMgPSBOZXdUUmljaFRyYW5zcG9ydCh0KQorCX0KKwlwLnJlYWRlciA9IHAudHJhbnMKKwlwLndyaXRlciA9IHAudHJhbnMKKwlyZXR1cm4gcAorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KGZhbHNlLCB0cnVlKQorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3Rvcnkoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVEJpbmFyeVByb3RvY29sRmFjdG9yeXtzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGV9Cit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHQgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sKHQsIHAuc3RyaWN0UmVhZCwgcC5zdHJpY3RXcml0ZSkKK30KKworLyoqCisgKiBXcml0aW5nIE1ldGhvZHMKKyAqLworCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgZXJyb3IgeworCWlmIHAuc3RyaWN0V3JpdGUgeworCQl2ZXJzaW9uIDo9IHVpbnQzMihWRVJTSU9OXzEpIHwgdWludDMyKHR5cGVJZCkKKwkJZSA6PSBwLldyaXRlSTMyKGludDMyKHZlcnNpb24pKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gZQorCQl9CisJCWUgPSBwLldyaXRlU3RyaW5nKG5hbWUpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVJMzIoc2VxSWQpCisJCXJldHVybiBlCisJfSBlbHNlIHsKKwkJZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIGUKKwkJfQorCQllID0gcC5Xcml0ZUkzMihzZXFJZCkKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkxNihpZCkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoU1RPUCkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OChrZXlUeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlQnl0ZShpbnQ4KHZhbHVlVHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGVsZW1UeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJaWYgdmFsdWUgeworCQlyZXR1cm4gcC5Xcml0ZUJ5dGUoMSkKKwl9CisJcmV0dXJuIHAuV3JpdGVCeXRlKDApCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllIDo9IHAudHJhbnMuV3JpdGVCeXRlKGJ5dGUodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDoyXQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDE2KHYsIHVpbnQxNih2YWx1ZSkpCisJXywgZSA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUkzMih2YWx1ZSBpbnQzMikgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDo0XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKHYsIHVpbnQzMih2YWx1ZSkpCisJXywgZSA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDo4XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDY0KHYsIHVpbnQ2NCh2YWx1ZSkpCisJXywgZXJyIDo9IHAud3JpdGVyLldyaXRlKHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTY0KGludDY0KG1hdGguRmxvYXQ2NGJpdHModmFsdWUpKSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVJMzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlfLCBlcnIgOj0gcC50cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVJMzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlfLCBlcnIgOj0gcC53cml0ZXIuV3JpdGUodmFsdWUpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8qKgorICogUmVhZGluZyBtZXRob2RzCisgKi8KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJc2l6ZSwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCB0eXBlSWQsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBzaXplIDwgMCB7CisJCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShzaXplICYgMHgwZmYpCisJCXZlcnNpb24gOj0gaW50NjQoaW50NjQoc2l6ZSkgJiBWRVJTSU9OX01BU0spCisJCWlmIHZlcnNpb24gIT0gVkVSU0lPTl8xIHsKKwkJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZm10LkVycm9yZigiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiIpKQorCQl9CisJCW5hbWUsIGUgPSBwLlJlYWRTdHJpbmcoKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJc2VxSWQsIGUgPSBwLlJlYWRJMzIoKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorCX0KKwlpZiBwLnN0cmljdFJlYWQgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoQkFEX1ZFUlNJT04sIGZtdC5FcnJvcmYoIk1pc3NpbmcgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luIikpCisJfQorCW5hbWUsIGUyIDo9IHAucmVhZFN0cmluZ0JvZHkoc2l6ZSkKKwlpZiBlMiAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTIKKwl9CisJYiwgZTMgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZTMgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUzCisJfQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiKQorCXNlcUlkLCBlNCA6PSBwLlJlYWRJMzIoKQorCWlmIGU0ICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlNAorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgc2VxSWQgaW50MTYsIGVyciBlcnJvcikgeworCXQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUVHlwZSh0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHQgIT0gU1RPUCB7CisJCXNlcUlkLCBlcnIgPSBwLlJlYWRJMTYoKQorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKwordmFyIGludmFsaWREYXRhTGVuZ3RoID0gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJJbnZhbGlkIGRhdGEgbGVuZ3RoIikpCisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtUeXBlLCB2VHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWssIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWtUeXBlID0gVFR5cGUoaykKKwl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwl2VHlwZSA9IFRUeXBlKHYpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisJcmV0dXJuIGtUeXBlLCB2VHlwZSwgc2l6ZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWVsZW1UeXBlID0gVFR5cGUoYikKKwlzaXplMzIsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKworCXJldHVybgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwliLCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwllbGVtVHlwZSA9IFRUeXBlKGIpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJdiA6PSB0cnVlCisJaWYgYiAhPSAxIHsKKwkJdiA9IGZhbHNlCisJfQorCXJldHVybiB2LCBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC50cmFucy5SZWFkQnl0ZSgpCisJcmV0dXJuIGludDgodiksIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjJdCisJZXJyID0gcC5yZWFkQWxsKGJ1ZikKKwl2YWx1ZSA9IGludDE2KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGJ1ZikpCisJcmV0dXJuIHZhbHVlLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbMDo0XQorCWVyciA9IHAucmVhZEFsbChidWYpCisJdmFsdWUgPSBpbnQzMihiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpKQorCXJldHVybiB2YWx1ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gaW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gbWF0aC5GbG9hdDY0ZnJvbWJpdHMoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlzaXplLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIGUKKwl9CisJaWYgc2l6ZSA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisKKwlyZXR1cm4gcC5yZWFkU3RyaW5nQm9keShzaXplKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXNpemUsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGUKKwl9CisJaWYgc2l6ZSA8IDAgeworCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWlzaXplIDo9IGludChzaXplKQorCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgaXNpemUpCisJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goY3R4KSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5vcmlnVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZEFsbChidWYgW11ieXRlKSBlcnJvciB7CisJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2NvbnN0IHJlYWRMaW1pdCA9IDMyNzY4CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZFN0cmluZ0JvZHkoc2l6ZSBpbnQzMikgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJaWYgc2l6ZSA8IDAgeworCQlyZXR1cm4gIiIsIG5pbAorCX0KKworCXZhciAoCisJCWJ1ZiBieXRlcy5CdWZmZXIKKwkJZSAgIGVycm9yCisJCWIgICBbXWJ5dGUKKwkpCisKKwlzd2l0Y2ggeworCWNhc2UgaW50KHNpemUpIDw9IGxlbihwLmJ1ZmZlcik6CisJCWIgPSBwLmJ1ZmZlcls6c2l6ZV0gLy8gYXZvaWRzIGFsbG9jYXRpb24gZm9yIHNtYWxsIHJlYWRzCisJY2FzZSBpbnQoc2l6ZSkgPCByZWFkTGltaXQ6CisJCWIgPSBtYWtlKFtdYnl0ZSwgc2l6ZSkKKwlkZWZhdWx0OgorCQliID0gbWFrZShbXWJ5dGUsIHJlYWRMaW1pdCkKKwl9CisKKwlmb3Igc2l6ZSA+IDAgeworCQlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYikKKwkJYnVmLldyaXRlKGIpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWJyZWFrCisJCX0KKwkJc2l6ZSAtPSByZWFkTGltaXQKKwkJaWYgc2l6ZSA8IHJlYWRMaW1pdCAmJiBzaXplID4gMCB7CisJCQliID0gYls6c2l6ZV0KKwkJfQorCX0KKwlyZXR1cm4gYnVmLlN0cmluZygpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjJjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UmVhZFdyaXRlQmluYXJ5UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzAyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJjb250ZXh0IgorKQorCit0eXBlIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlzaXplIGludAorfQorCit0eXBlIFRCdWZmZXJlZFRyYW5zcG9ydCBzdHJ1Y3QgeworCWJ1ZmlvLlJlYWRXcml0ZXIKKwl0cCBUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCBwLnNpemUpLCBuaWwKK30KKworZnVuYyBOZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5e3NpemU6IGJ1ZmZlclNpemV9Cit9CisKK2Z1bmMgTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQsIGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlRCdWZmZXJlZFRyYW5zcG9ydHsKKwkJUmVhZFdyaXRlcjogYnVmaW8uUmVhZFdyaXRlcnsKKwkJCVJlYWRlcjogYnVmaW8uTmV3UmVhZGVyU2l6ZSh0cmFucywgYnVmZmVyU2l6ZSksCisJCQlXcml0ZXI6IGJ1ZmlvLk5ld1dyaXRlclNpemUodHJhbnMsIGJ1ZmZlclNpemUpLAorCQl9LAorCQl0cDogdHJhbnMsCisJfQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIElzT3BlbigpIGJvb2wgeworCXJldHVybiBwLnRwLklzT3BlbigpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgT3BlbigpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC50cC5PcGVuKCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBDbG9zZSgpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC50cC5DbG9zZSgpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVhZChiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5SZWFkV3JpdGVyLlJlYWQoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLlJlYWRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuV3JpdGVyLlJlc2V0KHAudHApCisJfQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgZXJyIDo9IHAuUmVhZFdyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQorCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiBwLnRwLkZsdXNoKGN0eCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHAudHAuUmVtYWluaW5nQnl0ZXMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RCdWZmZXJlZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdUQnVmZmVyZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCAxMDI0MCkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3OTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKykKKwordHlwZSBUQ2xpZW50IGludGVyZmFjZSB7CisJQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IKK30KKwordHlwZSBUU3RhbmRhcmRDbGllbnQgc3RydWN0IHsKKwlzZXFJZCAgICAgICAgaW50MzIKKwlpcHJvdCwgb3Byb3QgVFByb3RvY29sCit9CisKKy8vIFRTdGFuZGFyZENsaWVudCBpbXBsZW1lbnRzIFRDbGllbnQsIGFuZCB1c2VzIHRoZSBzdGFuZGFyZCBtZXNzYWdlIGZvcm1hdCBmb3IgVGhyaWZ0LgorLy8gSXQgaXMgbm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgdXNlLgorZnVuYyBOZXdUU3RhbmRhcmRDbGllbnQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgVFByb3RvY29sKSAqVFN0YW5kYXJkQ2xpZW50IHsKKwlyZXR1cm4gJlRTdGFuZGFyZENsaWVudHsKKwkJaXByb3Q6IGlucHV0UHJvdG9jb2wsCisJCW9wcm90OiBvdXRwdXRQcm90b2NvbCwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgU2VuZChjdHggY29udGV4dC5Db250ZXh0LCBvcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCBhcmdzIFRTdHJ1Y3QpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kLCBDQUxMLCBzZXFJZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gb3Byb3QuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFJlY3YoaXByb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlyTWV0aG9kLCByVHlwZUlkLCByU2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCWlmIG1ldGhvZCAhPSByTWV0aG9kIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgZm10LlNwcmludGYoIiVzOiB3cm9uZyBtZXRob2QgbmFtZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHNlcUlkICE9IHJTZXFJZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oQkFEX1NFUVVFTkNFX0lELCBmbXQuU3ByaW50ZigiJXM6IG91dCBvZiBvcmRlciBzZXF1ZW5jZSByZXNwb25zZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHJUeXBlSWQgPT0gRVhDRVBUSU9OIHsKKwkJdmFyIGV4Y2VwdGlvbiB0QXBwbGljYXRpb25FeGNlcHRpb24KKwkJaWYgZXJyIDo9IGV4Y2VwdGlvbi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlpZiBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlyZXR1cm4gJmV4Y2VwdGlvbgorCX0gZWxzZSBpZiByVHlwZUlkICE9IFJFUExZIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCIlczogaW52YWxpZCBtZXNzYWdlIHR5cGUiLCBtZXRob2QpKQorCX0KKworCWlmIGVyciA6PSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcmV0dXJuIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJcC5zZXFJZCsrCisJc2VxSWQgOj0gcC5zZXFJZAorCisJaWYgZXJyIDo9IHAuU2VuZChjdHgsIHAub3Byb3QsIHNlcUlkLCBtZXRob2QsIGFyZ3MpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCS8vIG1ldGhvZCBpcyBvbmV3YXkKKwlpZiByZXN1bHQgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCXJldHVybiBwLlJlY3YocC5pcHJvdCwgc2VxSWQsIG1ldGhvZCwgcmVzdWx0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3R5cGUgbW9ja1Byb2Nlc3NvciBzdHJ1Y3QgeworCVByb2Nlc3NGdW5jIGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCitmdW5jIChtICptb2NrUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCXJldHVybiBtLlByb2Nlc3NGdW5jKGluLCBvdXQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMGQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDgxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iaW5hcnkiCisJImZtdCIKKwkiaW8iCisJIm1hdGgiCispCisKK2NvbnN0ICgKKwlDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHgwODIKKwlDT01QQUNUX1ZFUlNJT04gICAgICAgICAgID0gMQorCUNPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmCisJQ09NUEFDVF9UWVBFX01BU0sgICAgICAgICA9IDB4MEUwCisJQ09NUEFDVF9UWVBFX0JJVFMgICAgICAgICA9IDB4MDcKKwlDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNQorKQorCit0eXBlIHRDb21wYWN0VHlwZSBieXRlCisKK2NvbnN0ICgKKwlDT01QQUNUX0JPT0xFQU5fVFJVRSAgPSAweDAxCisJQ09NUEFDVF9CT09MRUFOX0ZBTFNFID0gMHgwMgorCUNPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMKKwlDT01QQUNUX0kxNiAgICAgICAgICAgPSAweDA0CisJQ09NUEFDVF9JMzIgICAgICAgICAgID0gMHgwNQorCUNPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYKKwlDT01QQUNUX0RPVUJMRSAgICAgICAgPSAweDA3CisJQ09NUEFDVF9CSU5BUlkgICAgICAgID0gMHgwOAorCUNPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDkKKwlDT01QQUNUX1NFVCAgICAgICAgICAgPSAweDBBCisJQ09NUEFDVF9NQVAgICAgICAgICAgID0gMHgwQgorCUNPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKKykKKwordmFyICgKKwl0dHlwZVRvQ29tcGFjdFR5cGUgbWFwW1RUeXBlXXRDb21wYWN0VHlwZQorKQorCitmdW5jIGluaXQoKSB7CisJdHR5cGVUb0NvbXBhY3RUeXBlID0gbWFwW1RUeXBlXXRDb21wYWN0VHlwZXsKKwkJU1RPUDogICBTVE9QLAorCQlCT09MOiAgIENPTVBBQ1RfQk9PTEVBTl9UUlVFLAorCQlCWVRFOiAgIENPTVBBQ1RfQllURSwKKwkJSTE2OiAgICBDT01QQUNUX0kxNiwKKwkJSTMyOiAgICBDT01QQUNUX0kzMiwKKwkJSTY0OiAgICBDT01QQUNUX0k2NCwKKwkJRE9VQkxFOiBDT01QQUNUX0RPVUJMRSwKKwkJU1RSSU5HOiBDT01QQUNUX0JJTkFSWSwKKwkJTElTVDogICBDT01QQUNUX0xJU1QsCisJCVNFVDogICAgQ09NUEFDVF9TRVQsCisJCU1BUDogICAgQ09NUEFDVF9NQVAsCisJCVNUUlVDVDogQ09NUEFDVF9TVFJVQ1QsCisJfQorfQorCit0eXBlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSAqVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVENvbXBhY3RQcm90b2NvbEZhY3Rvcnl7fQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKK30KKwordHlwZSBUQ29tcGFjdFByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgICAgICAgICBUUmljaFRyYW5zcG9ydAorCW9yaWdUcmFuc3BvcnQgVFRyYW5zcG9ydAorCisJLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKwkvLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorCWxhc3RGaWVsZCAgIFtdaW50CisJbGFzdEZpZWxkSWQgaW50CisKKwkvLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKwkvLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisJYm9vbGVhbkZpZWxkTmFtZSAgICBzdHJpbmcKKwlib29sZWFuRmllbGRJZCAgICAgIGludDE2CisJYm9vbGVhbkZpZWxkUGVuZGluZyBib29sCisKKwkvLyBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKwkvLyB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KKwlib29sVmFsdWUgICAgICAgICAgYm9vbAorCWJvb2xWYWx1ZUlzTm90TnVsbCBib29sCisJYnVmZmVyICAgICAgICAgICAgIFs2NF1ieXRlCit9CisKKy8vIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wgZ2l2ZW4gYSBUVHJhbnNwb3J0CitmdW5jIE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgKlRDb21wYWN0UHJvdG9jb2wgeworCXAgOj0gJlRDb21wYWN0UHJvdG9jb2x7b3JpZ1RyYW5zcG9ydDogdHJhbnMsIGxhc3RGaWVsZDogW11pbnR7fX0KKwlpZiBldCwgb2sgOj0gdHJhbnMuKFRSaWNoVHJhbnNwb3J0KTsgb2sgeworCQlwLnRyYW5zID0gZXQKKwl9IGVsc2UgeworCQlwLnRyYW5zID0gTmV3VFJpY2hUcmFuc3BvcnQodHJhbnMpCisJfQorCisJcmV0dXJuIHAKKworfQorCisvLworLy8gUHVibGljIFdyaXRpbmcgbWV0aG9kcy4KKy8vCisKKy8vIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKKy8vIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KENPTVBBQ1RfUFJPVE9DT0xfSUQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllcnIgPSBwLndyaXRlQnl0ZURpcmVjdCgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwgKChieXRlKHR5cGVJZCkgPDwgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCkgJiBDT01QQUNUX1RZUEVfTUFTSykpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlfLCBlcnIgPSBwLndyaXRlVmFyaW50MzIoc2VxaWQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllIDo9IHAuV3JpdGVTdHJpbmcobmFtZSkKKwlyZXR1cm4gZQorCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorLy8gdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisvLyBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwlwLmxhc3RGaWVsZCA9IGFwcGVuZChwLmxhc3RGaWVsZCwgcC5sYXN0RmllbGRJZCkKKwlwLmxhc3RGaWVsZElkID0gMAorCXJldHVybiBuaWwKK30KKworLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkW2xlbihwLmxhc3RGaWVsZCktMV0KKwlwLmxhc3RGaWVsZCA9IHAubGFzdEZpZWxkWzpsZW4ocC5sYXN0RmllbGQpLTFdCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwlpZiB0eXBlSWQgPT0gQk9PTCB7CisJCS8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisJCXAuYm9vbGVhbkZpZWxkTmFtZSwgcC5ib29sZWFuRmllbGRJZCwgcC5ib29sZWFuRmllbGRQZW5kaW5nID0gbmFtZSwgaWQsIHRydWUKKwkJcmV0dXJuIG5pbAorCX0KKwlfLCBlcnIgOj0gcC53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlSWQsIGlkLCAweEZGKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorLy8gJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKy8vIGJvb2xlYW4gZmllbGQgY2FzZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCB0eXBlT3ZlcnJpZGUgYnl0ZSkgKGludCwgZXJyb3IpIHsKKwkvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLnBvcCgpOworCisJLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorCXZhciB0eXBlVG9Xcml0ZSBieXRlCisJaWYgdHlwZU92ZXJyaWRlID09IDB4RkYgeworCQl0eXBlVG9Xcml0ZSA9IGJ5dGUocC5nZXRDb21wYWN0VHlwZSh0eXBlSWQpKQorCX0gZWxzZSB7CisJCXR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlCisJfQorCS8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorCWZpZWxkSWQgOj0gaW50KGlkKQorCXdyaXR0ZW4gOj0gMAorCWlmIGZpZWxkSWQgPiBwLmxhc3RGaWVsZElkICYmIGZpZWxkSWQtcC5sYXN0RmllbGRJZCA8PSAxNSB7CisJCS8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKKwkJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoKGZpZWxkSWQtcC5sYXN0RmllbGRJZCk8PDQpIHwgdHlwZVRvV3JpdGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJfSBlbHNlIHsKKwkJLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQorCQllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJCWVyciA9IHAuV3JpdGVJMTYoaWQpCisJCXdyaXR0ZW4gPSAxICsgMgorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCX0KKworCXAubGFzdEZpZWxkSWQgPSBmaWVsZElkCisJLy8gcC5sYXN0RmllbGQuUHVzaChmaWVsZC5pZCk7CisJcmV0dXJuIHdyaXR0ZW4sIG5pbAorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KFNUT1ApCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIHNpemUgPT0gMCB7CisJCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCgwKQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJXywgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihzaXplKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWVyciA9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUocC5nZXRDb21wYWN0VHlwZShrZXlUeXBlKSk8PDQgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUodmFsdWVUeXBlKSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBXcml0ZSBhIHNldCBoZWFkZXIuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJdiA6PSBieXRlKENPTVBBQ1RfQk9PTEVBTl9GQUxTRSkKKwlpZiB2YWx1ZSB7CisJCXYgPSBieXRlKENPTVBBQ1RfQk9PTEVBTl9UUlVFKQorCX0KKwlpZiBwLmJvb2xlYW5GaWVsZFBlbmRpbmcgeworCQkvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKwkJXywgZXJyIDo9IHAud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwocC5ib29sZWFuRmllbGROYW1lLCBCT09MLCBwLmJvb2xlYW5GaWVsZElkLCB2KQorCQlwLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyhpbnQzMih2YWx1ZSkpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyh2YWx1ZSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlVmFyaW50NjQocC5pbnQ2NFRvWmlnemFnKHZhbHVlKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlidWYgOj0gcC5idWZmZXJbMDo4XQorCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgbWF0aC5GbG9hdDY0Yml0cyh2YWx1ZSkpCisJXywgZXJyIDo9IHAudHJhbnMuV3JpdGUoYnVmKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbih2YWx1ZSkgPiAwIHsKKwl9CisJXywgZSA9IHAudHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJcmV0dXJuIGUKK30KKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJpbmFyeShiaW4gW11ieXRlKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKGJpbikpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW4oYmluKSA+IDAgeworCQlfLCBlID0gcC50cmFucy5Xcml0ZShiaW4pCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIG5pbAorfQorCisvLworLy8gUmVhZGluZyBtZXRob2RzLgorLy8KKworLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCisJcHJvdG9jb2xJZCwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlpZiBwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHByb3RvY29sIGlkICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9QUk9UT0NPTF9JRCwgcHJvdG9jb2xJZCkKKwkJcmV0dXJuICIiLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZSkKKwl9CisKKwl2ZXJzaW9uQW5kVHlwZSwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwl2ZXJzaW9uIDo9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0sKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFMpCisJaWYgdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04geworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHZlcnNpb24gJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1ZFUlNJT04sIHZlcnNpb24pCisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBlKQorCQlyZXR1cm4KKwl9CisJc2VxSWQsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwluYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKQorCXJldHVybgorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlwLmxhc3RGaWVsZCA9IGFwcGVuZChwLmxhc3RGaWVsZCwgcC5sYXN0RmllbGRJZCkKKwlwLmxhc3RGaWVsZElkID0gMAorCXJldHVybgorfQorCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCS8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgcmVhZCBvZmYgdGhlIHdpcmUuCisJcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkW2xlbihwLmxhc3RGaWVsZCktMV0KKwlwLmxhc3RGaWVsZCA9IHAubGFzdEZpZWxkWzpsZW4ocC5sYXN0RmllbGQpLTFdCisJcmV0dXJuIG5pbAorfQorCisvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwl0LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCS8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKwlpZiAodCAmIDB4MGYpID09IFNUT1AgeworCQlyZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAorCX0KKworCS8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKwltb2RpZmllciA6PSBpbnQxNigodCAmIDB4ZjApID4+IDQpCisJaWYgbW9kaWZpZXIgPT0gMCB7CisJCS8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKwkJaWQsIGVyciA9IHAuUmVhZEkxNigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9IGVsc2UgeworCQkvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCByZWFkIGZpZWxkIGlkLgorCQlpZCA9IGludDE2KHAubGFzdEZpZWxkSWQpICsgbW9kaWZpZXIKKwl9CisJdHlwZUlkLCBlIDo9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKHQgJiAweDBmKSkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisKKwkvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorCWlmIHAuaXNCb29sVHlwZSh0KSB7CisJCS8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorCQlwLmJvb2xWYWx1ZSA9IChieXRlKHQpJjB4MGYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUpCisJCXAuYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorCX0KKworCS8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorCXAubGFzdEZpZWxkSWQgPSBpbnQoaWQpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJc2l6ZTMyLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKworCWtleUFuZFZhbHVlVHlwZSA6PSBieXRlKFNUT1ApCisJaWYgc2l6ZSAhPSAwIHsKKwkJa2V5QW5kVmFsdWVUeXBlLCBlcnIgPSBwLnJlYWRCeXRlRGlyZWN0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0KKwlrZXlUeXBlLCBfID0gcC5nZXRUVHlwZSh0Q29tcGFjdFR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpKQorCXZhbHVlVHlwZSwgXyA9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorLy8gdHJ1ZSBzaXplLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXNpemVfYW5kX3R5cGUsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmKQorCWlmIHNpemUgPT0gMTUgeworCQlzaXplMiwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJcmV0dXJuCisJCX0KKwkJaWYgc2l6ZTIgPCAwIHsKKwkJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCQlyZXR1cm4KKwkJfQorCQlzaXplID0gaW50KHNpemUyKQorCX0KKwllbGVtVHlwZSwgZSA6PSBwLmdldFRUeXBlKHRDb21wYWN0VHlwZShzaXplX2FuZF90eXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKy8vIHRydWUgc2l6ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLlJlYWRMaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBkdXJpbmcgcmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgcmVhZCBhIGJ5dGUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpIHsKKwlpZiBwLmJvb2xWYWx1ZUlzTm90TnVsbCB7CisJCXAuYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UKKwkJcmV0dXJuIHAuYm9vbFZhbHVlLCBuaWwKKwl9CisJdiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCXJldHVybiB2ID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFLCBlcnIKK30KKworLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEkzMigpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwl2LCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJdmFsdWUgPSBwLnppZ3phZ1RvSW50MzIodikKKwlyZXR1cm4gdmFsdWUsIG5pbAorfQorCisvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikgeworCXYsIGUgOj0gcC5yZWFkVmFyaW50NjQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwl2YWx1ZSA9IHAuemlnemFnVG9JbnQ2NCh2KQorCXJldHVybiB2YWx1ZSwgbmlsCit9CisKKy8vIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlsb25nQml0cyA6PSBwLmJ1ZmZlclswOjhdCisJXywgZSA6PSBpby5SZWFkRnVsbChwLnRyYW5zLCBsb25nQml0cykKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLjAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gbWF0aC5GbG9hdDY0ZnJvbWJpdHMocC5ieXRlc1RvVWludDY0KGxvbmdCaXRzKSksIG5pbAorfQorCisvLyBSZWFkcyBhIFtdYnl0ZSAodmlhIHJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgeworCWxlbmd0aCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW5ndGggPCAwIHsKKwkJcmV0dXJuICIiLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWlmIGxlbmd0aCA9PSAwIHsKKwkJcmV0dXJuICIiLCBuaWwKKwl9CisJdmFyIGJ1ZiBbXWJ5dGUKKwlpZiBsZW5ndGggPD0gaW50MzIobGVuKHAuYnVmZmVyKSkgeworCQlidWYgPSBwLmJ1ZmZlclswOmxlbmd0aF0KKwl9IGVsc2UgeworCQlidWYgPSBtYWtlKFtdYnl0ZSwgbGVuZ3RoKQorCX0KKwlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYnVmKQorCXJldHVybiBzdHJpbmcoYnVmKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKKy8vIFJlYWQgYSBbXWJ5dGUgZnJvbSB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlsZW5ndGgsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbmd0aCA9PSAwIHsKKwkJcmV0dXJuIFtdYnl0ZXt9LCBuaWwKKwl9CisJaWYgbGVuZ3RoIDwgMCB7CisJCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCisJfQorCisJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW5ndGgpCisJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAub3JpZ1RyYW5zcG9ydAorfQorCisvLworLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisvLworCisvLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisvLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIChpbnQsIGVycm9yKSB7CisJaWYgc2l6ZSA8PSAxNCB7CisJCXJldHVybiAxLCBwLndyaXRlQnl0ZURpcmVjdChieXRlKGludDMyKHNpemU8PDQpIHwgaW50MzIocC5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpKSkKKwl9CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KDB4ZjAgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwltLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKGludDMyKHNpemUpKQorCXJldHVybiAxICsgbSwgZXJyCit9CisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisvLyBUT0RPKHBvbWFjayk6IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50MzIobiBpbnQzMikgKGludCwgZXJyb3IpIHsKKwlpMzJidWYgOj0gcC5idWZmZXJbMDo1XQorCWlkeCA6PSAwCisJZm9yIHsKKwkJaWYgKG4gJiBeMHg3RikgPT0gMCB7CisJCQlpMzJidWZbaWR4XSA9IGJ5dGUobikKKwkJCWlkeCsrCisJCQkvLyBwLndyaXRlQnl0ZURpcmVjdChieXRlKG4pKTsKKwkJCWJyZWFrCisJCQkvLyByZXR1cm47CisJCX0gZWxzZSB7CisJCQlpMzJidWZbaWR4XSA9IGJ5dGUoKG4gJiAweDdGKSB8IDB4ODApCisJCQlpZHgrKworCQkJLy8gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSgoKG4gJiAweDdGKSB8IDB4ODApKSk7CisJCQl1IDo9IHVpbnQzMihuKQorCQkJbiA9IGludDMyKHUgPj4gNykKKwkJfQorCX0KKwlyZXR1cm4gcC50cmFucy5Xcml0ZShpMzJidWZbMDppZHhdKQorfQorCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50NjQobiBpbnQ2NCkgKGludCwgZXJyb3IpIHsKKwl2YXJpbnQ2NG91dCA6PSBwLmJ1ZmZlclswOjEwXQorCWlkeCA6PSAwCisJZm9yIHsKKwkJaWYgKG4gJiBeMHg3RikgPT0gMCB7CisJCQl2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZShuKQorCQkJaWR4KysKKwkJCWJyZWFrCisJCX0gZWxzZSB7CisJCQl2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZSgobiAmIDB4N0YpIHwgMHg4MCkKKwkJCWlkeCsrCisJCQl1IDo9IHVpbnQ2NChuKQorCQkJbiA9IGludDY0KHUgPj4gNykKKwkJfQorCX0KKwlyZXR1cm4gcC50cmFucy5Xcml0ZSh2YXJpbnQ2NG91dFswOmlkeF0pCit9CisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGludDY0VG9aaWd6YWcobCBpbnQ2NCkgaW50NjQgeworCXJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKQorfQorCisvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpbnQzMlRvWmlnemFnKG4gaW50MzIpIGludDMyIHsKKwlyZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZml4ZWRVaW50NjRUb0J5dGVzKG4gdWludDY0LCBidWYgW11ieXRlKSB7CisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCBuKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBmaXhlZEludDY0VG9CeXRlcyhuIGludDY0LCBidWYgW11ieXRlKSB7CisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCB1aW50NjQobikpCit9CisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlQnl0ZURpcmVjdChiIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC50cmFucy5Xcml0ZUJ5dGUoYikKK30KKworLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUludEFzQnl0ZURpcmVjdChuIGludCkgKGludCwgZXJyb3IpIHsKKwlyZXR1cm4gMSwgcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShuKSkKK30KKworLy8KKy8vIEludGVybmFsIHJlYWRpbmcgbWV0aG9kcworLy8KKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkVmFyaW50MzIoKSAoaW50MzIsIGVycm9yKSB7CisJLy8gaWYgdGhlIHdpcmUgY29udGFpbnMgdGhlIHJpZ2h0IHN0dWZmLCB0aGlzIHdpbGwganVzdCB0cnVuY2F0ZSB0aGUgaTY0IHdlCisJLy8gcmVhZCBhbmQgZ2V0IHVzIHRoZSByaWdodCBzaWduLgorCXYsIGVyciA6PSBwLnJlYWRWYXJpbnQ2NCgpCisJcmV0dXJuIGludDMyKHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRWYXJpbnQ2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwlzaGlmdCA6PSB1aW50KDApCisJcmVzdWx0IDo9IGludDY0KDApCisJZm9yIHsKKwkJYiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCQlyZXN1bHQgfD0gaW50NjQoYiYweDdmKSA8PCBzaGlmdAorCQlpZiAoYiAmIDB4ODApICE9IDB4ODAgeworCQkJYnJlYWsKKwkJfQorCQlzaGlmdCArPSA3CisJfQorCXJldHVybiByZXN1bHQsIG5pbAorfQorCisvLyBSZWFkIGEgYnl0ZSwgdW5saWtlIFJlYWRCeXRlIHRoYXQgcmVhZHMgVGhyaWZ0LWJ5dGUgdGhhdCBpcyBpOC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRCeXRlRGlyZWN0KCkgKGJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIHAudHJhbnMuUmVhZEJ5dGUoKQorfQorCisvLworLy8gZW5jb2RpbmcgaGVscGVycworLy8KKworLy8gQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgemlnemFnVG9JbnQzMihuIGludDMyKSBpbnQzMiB7CisJdSA6PSB1aW50MzIobikKKwlyZXR1cm4gaW50MzIodT4+MSkgXiAtKG4gJiAxKQorfQorCisvLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHppZ3phZ1RvSW50NjQobiBpbnQ2NCkgaW50NjQgeworCXUgOj0gdWludDY0KG4pCisJcmV0dXJuIGludDY0KHU+PjEpIF4gLShuICYgMSkKK30KKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9JbnQ2NChiIFtdYnl0ZSkgaW50NjQgeworCXJldHVybiBpbnQ2NChiaW5hcnkuTGl0dGxlRW5kaWFuLlVpbnQ2NChiKSkKK30KKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9VaW50NjQoYiBbXWJ5dGUpIHVpbnQ2NCB7CisJcmV0dXJuIGJpbmFyeS5MaXR0bGVFbmRpYW4uVWludDY0KGIpCit9CisKKy8vCisvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKy8vCisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGlzQm9vbFR5cGUoYiBieXRlKSBib29sIHsKKwlyZXR1cm4gKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUgfHwgKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX0ZBTFNFCit9CisKKy8vIEdpdmVuIGEgdENvbXBhY3RUeXBlIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCisvLyBUVHlwZSB2YWx1ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGdldFRUeXBlKHQgdENvbXBhY3RUeXBlKSAoVFR5cGUsIGVycm9yKSB7CisJc3dpdGNoIGJ5dGUodCkgJiAweDBmIHsKKwljYXNlIFNUT1A6CisJCXJldHVybiBTVE9QLCBuaWwKKwljYXNlIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSwgQ09NUEFDVF9CT09MRUFOX1RSVUU6CisJCXJldHVybiBCT09MLCBuaWwKKwljYXNlIENPTVBBQ1RfQllURToKKwkJcmV0dXJuIEJZVEUsIG5pbAorCWNhc2UgQ09NUEFDVF9JMTY6CisJCXJldHVybiBJMTYsIG5pbAorCWNhc2UgQ09NUEFDVF9JMzI6CisJCXJldHVybiBJMzIsIG5pbAorCWNhc2UgQ09NUEFDVF9JNjQ6CisJCXJldHVybiBJNjQsIG5pbAorCWNhc2UgQ09NUEFDVF9ET1VCTEU6CisJCXJldHVybiBET1VCTEUsIG5pbAorCWNhc2UgQ09NUEFDVF9CSU5BUlk6CisJCXJldHVybiBTVFJJTkcsIG5pbAorCWNhc2UgQ09NUEFDVF9MSVNUOgorCQlyZXR1cm4gTElTVCwgbmlsCisJY2FzZSBDT01QQUNUX1NFVDoKKwkJcmV0dXJuIFNFVCwgbmlsCisJY2FzZSBDT01QQUNUX01BUDoKKwkJcmV0dXJuIE1BUCwgbmlsCisJY2FzZSBDT01QQUNUX1NUUlVDVDoKKwkJcmV0dXJuIFNUUlVDVCwgbmlsCisJfQorCXJldHVybiBTVE9QLCBURXhjZXB0aW9uKGZtdC5FcnJvcmYoImRvbid0IGtub3cgd2hhdCB0eXBlOiAldiIsIHQmMHgwZikpCit9CisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBnZXRDb21wYWN0VHlwZSh0IFRUeXBlKSB0Q29tcGFjdFR5cGUgeworCXJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbdF0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmNzdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFJlYWRXcml0ZUNvbXBhY3RQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKworCXRyYW5zcG9ydHMgOj0gW11UVHJhbnNwb3J0eworCQlOZXdUTWVtb3J5QnVmZmVyKCksCisJCU5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTYzODQpKSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwKKwl9CisKKwl6bGliMCwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDApCisJemxpYjYsIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCA2KQorCXpsaWI5LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwgOSkKKwl0cmFuc3BvcnRzID0gYXBwZW5kKHRyYW5zcG9ydHMsIHpsaWIwLCB6bGliNiwgemxpYjkpCisKKwlmb3IgXywgdHJhbnMgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXAgOj0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1YzFiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29udGV4dC5nbwpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiY29udGV4dCIKKwordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5NDNlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkibG9nIgorKQorCit0eXBlIFREZWJ1Z1Byb3RvY29sIHN0cnVjdCB7CisJRGVsZWdhdGUgIFRQcm90b2NvbAorCUxvZ1ByZWZpeCBzdHJpbmcKK30KKwordHlwZSBURGVidWdQcm90b2NvbEZhY3Rvcnkgc3RydWN0IHsKKwlVbmRlcmx5aW5nIFRQcm90b2NvbEZhY3RvcnkKKwlMb2dQcmVmaXggIHN0cmluZworfQorCitmdW5jIE5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeSh1bmRlcmx5aW5nIFRQcm90b2NvbEZhY3RvcnksIGxvZ1ByZWZpeCBzdHJpbmcpICpURGVidWdQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVERlYnVnUHJvdG9jb2xGYWN0b3J5eworCQlVbmRlcmx5aW5nOiB1bmRlcmx5aW5nLAorCQlMb2dQcmVmaXg6ICBsb2dQcmVmaXgsCisJfQorfQorCitmdW5jICh0ICpURGVidWdQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuICZURGVidWdQcm90b2NvbHsKKwkJRGVsZWdhdGU6ICB0LlVuZGVybHlpbmcuR2V0UHJvdG9jb2wodHJhbnMpLAorCQlMb2dQcmVmaXg6IHQuTG9nUHJlZml4LAorCX0KK30KKworZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlSWQsIHNlcWlkKQorCWxvZy5QcmludGYoIiVzV3JpdGVNZXNzYWdlQmVnaW4obmFtZT0lI3YsIHR5cGVJZD0lI3YsIHNlcWlkPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWVzc2FnZUVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZU1lc3NhZ2VFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJ1Y3RCZWdpbihuYW1lPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJ1Y3RFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJ1Y3RFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUZpZWxkQmVnaW4obmFtZSwgdHlwZUlkLCBpZCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRmllbGRCZWdpbihuYW1lPSUjdiwgdHlwZUlkPSUjdiwgaWQlI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgaWQsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUZpZWxkRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZFN0b3AoKQorCWxvZy5QcmludGYoIiVzV3JpdGVGaWVsZFN0b3AoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWFwQmVnaW4oa2V5VHlwZT0lI3YsIHZhbHVlVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWFwRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWFwRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZUxpc3RCZWdpbihlbGVtVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlbGVtVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTGlzdEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUxpc3RFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZVNldEJlZ2luKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVNldEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZVNldEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCb29sKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCb29sKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJ5dGUodmFsdWUgaW50OCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCeXRlKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCeXRlKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVJMTYodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUkxNih2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlSTMyKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVJMzIodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUk2NCh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlSTY0KHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZURvdWJsZSh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRG91YmxlKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU3RyaW5nKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJpbmcodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCaW5hcnkodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUJpbmFyeSh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNZXNzYWdlQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lPSUjdiwgdHlwZUlkPSUjdiwgc2VxaWQ9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgc2VxaWQsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTWVzc2FnZUVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTWVzc2FnZUVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCW5hbWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RydWN0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUlI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFN0cnVjdEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkU3RydWN0RW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwluYW1lLCB0eXBlSWQsIGlkLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEZpZWxkQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZEZpZWxkQmVnaW4oKSAobmFtZT0lI3YsIHR5cGVJZD0lI3YsIGlkPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCB0eXBlSWQsIGlkLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkRmllbGRFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRGaWVsZEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkRmllbGRFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNYXBCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZT0lI3YsIHZhbHVlVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1hcEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZE1hcEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTWFwRW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwllbGVtVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRMaXN0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTGlzdEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZExpc3RFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZExpc3RFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJZWxlbVR5cGUsIHNpemUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU2V0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZWxlbVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTZXRFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZFNldEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRCb29sKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCb29sKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEJ5dGUoKSAodmFsdWUgaW50OCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQnl0ZSgpCisJbG9nLlByaW50ZigiJXNSZWFkQnl0ZSgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEkxNigpCisJbG9nLlByaW50ZigiJXNSZWFkSTE2KCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkSTMyKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRJMzIoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRJNjQoKQorCWxvZy5QcmludGYoIiVzUmVhZEk2NCgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkRG91YmxlKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWREb3VibGUoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RyaW5nKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTdHJpbmcoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQmluYXJ5KCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCaW5hcnkoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5Ta2lwKGZpZWxkVHlwZSkKKwlsb2cuUHJpbnRmKCIlc1NraXAoZmllbGRUeXBlPSUjdikgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZmllbGRUeXBlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLkZsdXNoKGN0eCkKKwlsb2cuUHJpbnRmKCIlc0ZsdXNoKCkgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gdGRwLkRlbGVnYXRlLlRyYW5zcG9ydCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbyBiL2xpYi9nby90aHJpZnQvZGVzZXJpYWxpemVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTA5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbwpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK3R5cGUgVERlc2VyaWFsaXplciBzdHJ1Y3QgeworCVRyYW5zcG9ydCBUVHJhbnNwb3J0CisJUHJvdG9jb2wgIFRQcm90b2NvbAorfQorCitmdW5jIE5ld1REZXNlcmlhbGl6ZXIoKSAqVERlc2VyaWFsaXplciB7CisJdmFyIHRyYW5zcG9ydCBUVHJhbnNwb3J0CisJdHJhbnNwb3J0ID0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCisJcHJvdG9jb2wgOj0gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKwlyZXR1cm4gJlREZXNlcmlhbGl6ZXJ7CisJCXRyYW5zcG9ydCwKKwkJcHJvdG9jb2x9Cit9CisKK2Z1bmMgKHQgKlREZXNlcmlhbGl6ZXIpIFJlYWRTdHJpbmcobXNnIFRTdHJ1Y3QsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJZXJyID0gbmlsCisJaWYgXywgZXJyID0gdC5UcmFuc3BvcnQuV3JpdGUoW11ieXRlKHMpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSBtc2cuUmVhZCh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KKworZnVuYyAodCAqVERlc2VyaWFsaXplcikgUmVhZChtc2cgVFN0cnVjdCwgYiBbXWJ5dGUpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBuaWwKKwlpZiBfLCBlcnIgPSB0LlRyYW5zcG9ydC5Xcml0ZShiKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSBtc2cuUmVhZCh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ZDZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZXJyb3JzIgorKQorCisvLyBHZW5lcmljIFRocmlmdCBleGNlcHRpb24KK3R5cGUgVEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCWVycm9yCit9CisKKy8vIFByZXBlbmRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYW4gZXJyb3Igd2l0aG91dCBsb3NpbmcgdGhlIFRocmlmdCBleGNlcHRpb24gaW50ZXJmYWNlCitmdW5jIFByZXBlbmRFcnJvcihwcmVwZW5kIHN0cmluZywgZXJyIGVycm9yKSBlcnJvciB7CisJaWYgdCwgb2sgOj0gZXJyLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0LlR5cGVJZCgpLCBwcmVwZW5kK3QuRXJyb3IoKSkKKwl9CisJaWYgdCwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0LlR5cGVJZCgpLCBlcnJvcnMuTmV3KHByZXBlbmQrZXJyLkVycm9yKCkpKQorCX0KKwlpZiB0LCBvayA6PSBlcnIuKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0LlR5cGVJZCgpLCBwcmVwZW5kK3QuRXJyb3IoKSkKKwl9CisKKwlyZXR1cm4gZXJyb3JzLk5ldyhwcmVwZW5kICsgZXJyLkVycm9yKCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY1ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UHJlcGVuZEVycm9yKHQgKnRlc3RpbmcuVCkgeworCWVyciA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oSU5URVJOQUxfRVJST1IsICJvcmlnaW5hbCBlcnJvciIpCisJZXJyMiwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnIpLihUQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9CisJaWYgZXJyMi5UeXBlSWQoKSAhPSBJTlRFUk5BTF9FUlJPUiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyMyA6PSBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoIm9yaWdpbmFsIGVycm9yIikpCisJZXJyNCwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnIzKS4oVFByb3RvY29sRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyNC5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjQuVHlwZUlkKCkgIT0gSU5WQUxJRF9EQVRBIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnI1IDo9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVElNRURfT1VULCAib3JpZ2luYWwgZXJyb3IiKQorCWVycjYsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyNSkuKFRUcmFuc3BvcnRFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwl9CisJaWYgZXJyNi5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjYuVHlwZUlkKCkgIT0gVElNRURfT1VUIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnI3IDo9IGVycm9ycy5OZXcoIm9yaWdpbmFsIGVycm9yIikKKwllcnI4IDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyNykKKwlpZiBlcnI4LkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZpZWxkLmdvIGIvbGliL2dvL3RocmlmdC9maWVsZC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY2NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9maWVsZC5nbwpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBmaWVsZCBtZXRhZGF0YS4KK3R5cGUgZmllbGQgc3RydWN0IHsKKwluYW1lICAgc3RyaW5nCisJdHlwZUlkIFRUeXBlCisJaWQgICAgIGludAorfQorCitmdW5jIG5ld0ZpZWxkKG4gc3RyaW5nLCB0IFRUeXBlLCBpIGludCkgKmZpZWxkIHsKKwlyZXR1cm4gJmZpZWxke25hbWU6IG4sIHR5cGVJZDogdCwgaWQ6IGl9Cit9CisKK2Z1bmMgKHAgKmZpZWxkKSBOYW1lKCkgc3RyaW5nIHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiAiIgorCX0KKwlyZXR1cm4gcC5uYW1lCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBUeXBlSWQoKSBUVHlwZSB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gVFR5cGUoVk9JRCkKKwl9CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBJZCgpIGludCB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gLTEKKwl9CisJcmV0dXJuIHAuaWQKK30KKworZnVuYyAocCAqZmllbGQpIFN0cmluZygpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIjxuaWw+IgorCX0KKwlyZXR1cm4gIjxURmllbGQgbmFtZTonIiArIHAubmFtZSArICInIHR5cGU6IiArIHN0cmluZyhwLnR5cGVJZCkgKyAiIGZpZWxkLWlkOiIgKyBzdHJpbmcocC5pZCkgKyAiPiIKK30KKwordmFyIEFOT05ZTU9VU19GSUVMRCAqZmllbGQKKwordHlwZSBmaWVsZFNsaWNlIFtdZmllbGQKKworZnVuYyAocCBmaWVsZFNsaWNlKSBMZW4oKSBpbnQgeworCXJldHVybiBsZW4ocCkKK30KKworZnVuYyAocCBmaWVsZFNsaWNlKSBMZXNzKGksIGogaW50KSBib29sIHsKKwlyZXR1cm4gcFtpXS5JZCgpIDwgcFtqXS5JZCgpCit9CisKK2Z1bmMgKHAgZmllbGRTbGljZSkgU3dhcChpLCBqIGludCkgeworCXBbaV0sIHBbal0gPSBwW2pdLCBwW2ldCit9CisKK2Z1bmMgaW5pdCgpIHsKKwlBTk9OWU1PVVNfRklFTEQgPSBuZXdGaWVsZCgiIiwgU1RPUCwgMCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZhNjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmluYXJ5IgorCSJmbXQiCisJImlvIgorKQorCitjb25zdCBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMAorCit0eXBlIFRGcmFtZWRUcmFuc3BvcnQgc3RydWN0IHsKKwl0cmFuc3BvcnQgVFRyYW5zcG9ydAorCWJ1ZiAgICAgICBieXRlcy5CdWZmZXIKKwlyZWFkZXIgICAgKmJ1ZmlvLlJlYWRlcgorCWZyYW1lU2l6ZSB1aW50MzIgLy9DdXJyZW50IHJlbWFpbmluZyBzaXplIG9mIHRoZSBmcmFtZS4gaWYgPT0wIHJlYWQgbmV4dCBmcmFtZSBoZWFkZXIKKwlidWZmZXIgICAgWzRdYnl0ZQorCW1heExlbmd0aCB1aW50MzIKK30KKwordHlwZSB0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCWZhY3RvcnkgICBUVHJhbnNwb3J0RmFjdG9yeQorCW1heExlbmd0aCB1aW50MzIKK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5KSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IERFRkFVTFRfTUFYX0xFTkdUSH0KK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeU1heExlbmd0aChmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBtYXhMZW5ndGggdWludDMyKSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IG1heExlbmd0aH0KK30KKworZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXR0LCBlcnIgOj0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHQsIHAubWF4TGVuZ3RoKSwgbmlsCit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQgVFRyYW5zcG9ydCkgKlRGcmFtZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBERUZBVUxUX01BWF9MRU5HVEh9Cit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aCh0cmFuc3BvcnQgVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIHVpbnQzMikgKlRGcmFtZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9Cit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnNwb3J0Lk9wZW4oKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC50cmFuc3BvcnQuSXNPcGVuKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnNwb3J0LkNsb3NlKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVhZChidWYgW11ieXRlKSAobCBpbnQsIGVyciBlcnJvcikgeworCWlmIHAuZnJhbWVTaXplID09IDAgeworCQlwLmZyYW1lU2l6ZSwgZXJyID0gcC5yZWFkRnJhbWVIZWFkZXIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWlmIHAuZnJhbWVTaXplIDwgdWludDMyKGxlbihidWYpKSB7CisJCWZyYW1lU2l6ZSA6PSBwLmZyYW1lU2l6ZQorCQl0bXAgOj0gbWFrZShbXWJ5dGUsIHAuZnJhbWVTaXplKQorCQlsLCBlcnIgPSBwLlJlYWQodG1wKQorCQljb3B5KGJ1ZiwgdG1wKQorCQlpZiBlcnIgPT0gbmlsIHsKKwkJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZm10LkVycm9yZigiTm90IGVub3VnaCBmcmFtZSBzaXplICVkIHRvIHJlYWQgJWQgYnl0ZXMiLCBmcmFtZVNpemUsIGxlbihidWYpKSkKKwkJCXJldHVybgorCQl9CisJfQorCWdvdCwgZXJyIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCXAuZnJhbWVTaXplID0gcC5mcmFtZVNpemUgLSB1aW50MzIoZ290KQorCS8vc2FuaXR5IGNoZWNrCisJaWYgcC5mcmFtZVNpemUgPCAwIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiTmVnYXRpdmUgZnJhbWUgc2l6ZSIpCisJfQorCXJldHVybiBnb3QsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCWlmIHAuZnJhbWVTaXplID09IDAgeworCQlwLmZyYW1lU2l6ZSwgZXJyID0gcC5yZWFkRnJhbWVIZWFkZXIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWlmIHAuZnJhbWVTaXplIDwgMSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGZtdC5FcnJvcmYoIk5vdCBlbm91Z2ggZnJhbWUgc2l6ZSAlZCB0byByZWFkICVkIGJ5dGVzIiwgcC5mcmFtZVNpemUsIDEpKQorCX0KKwljLCBlcnIgPSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJaWYgZXJyID09IG5pbCB7CisJCXAuZnJhbWVTaXplLS0KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuYnVmLldyaXRlKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC5idWYuV3JpdGVCeXRlKGMpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLmJ1Zi5Xcml0ZVN0cmluZyhzKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJc2l6ZSA6PSBwLmJ1Zi5MZW4oKQorCWJ1ZiA6PSBwLmJ1ZmZlcls6NF0KKwliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihidWYsIHVpbnQzMihzaXplKSkKKwlfLCBlcnIgOj0gcC50cmFuc3BvcnQuV3JpdGUoYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQlwLmJ1Zi5UcnVuY2F0ZSgwKQorCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCWlmIHNpemUgPiAwIHsKKwkJaWYgbiwgZXJyIDo9IHAuYnVmLldyaXRlVG8ocC50cmFuc3BvcnQpOyBlcnIgIT0gbmlsIHsKKwkJCXByaW50KCJFcnJvciB3aGlsZSBmbHVzaGluZyB3cml0ZSBidWZmZXIgb2Ygc2l6ZSAiLCBzaXplLCAiIHRvIHRyYW5zcG9ydCwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuRXJyb3IoKSwgIlxuIikKKwkJCXAuYnVmLlRydW5jYXRlKDApCisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwl9CisJZXJyID0gcC50cmFuc3BvcnQuRmx1c2goY3R4KQorCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgcmVhZEZyYW1lSGVhZGVyKCkgKHVpbnQzMiwgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbOjRdCisJaWYgXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlzaXplIDo9IGJpbmFyeS5CaWdFbmRpYW4uVWludDMyKGJ1ZikKKwlpZiBzaXplIDwgMCB8fCBzaXplID4gcC5tYXhMZW5ndGggeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCJJbmNvcnJlY3QgZnJhbWUgc2l6ZSAoJWQpIiwgc2l6ZSkpCisJfQorCXJldHVybiBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiB1aW50NjQocC5mcmFtZVNpemUpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjgzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEZyYW1lZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODJiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJpbyIKKwkiaW8vaW91dGlsIgorCSJuZXQvaHR0cCIKKwkibmV0L3VybCIKKwkic3RyY29udiIKKykKKworLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgc2hhcmVkIGh0dHAgY2xpZW50LiBMaWJyYXJ5IHVzZXJzIGFyZQorLy8gZnJlZSB0byBjaGFuZ2UgdGhpcyBnbG9iYWwgY2xpZW50IG9yIHNwZWNpZnkgb25lIHRocm91Z2gKKy8vIFRIdHRwQ2xpZW50T3B0aW9ucy4KK3ZhciBEZWZhdWx0SHR0cENsaWVudCAqaHR0cC5DbGllbnQgPSBodHRwLkRlZmF1bHRDbGllbnQKKwordHlwZSBUSHR0cENsaWVudCBzdHJ1Y3QgeworCWNsaWVudCAgICAgICAgICAgICAqaHR0cC5DbGllbnQKKwlyZXNwb25zZSAgICAgICAgICAgKmh0dHAuUmVzcG9uc2UKKwl1cmwgICAgICAgICAgICAgICAgKnVybC5VUkwKKwlyZXF1ZXN0QnVmZmVyICAgICAgKmJ5dGVzLkJ1ZmZlcgorCWhlYWRlciAgICAgICAgICAgICBodHRwLkhlYWRlcgorCW5zZWNDb25uZWN0VGltZW91dCBpbnQ2NAorCW5zZWNSZWFkVGltZW91dCAgICBpbnQ2NAorfQorCit0eXBlIFRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCW9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zCisJdXJsICAgICBzdHJpbmcKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpUSHR0cENsaWVudCkKKwkJaWYgb2sgJiYgdC51cmwgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHQudXJsLlN0cmluZygpLCBwLm9wdGlvbnMpCisJCX0KKwl9CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMocC51cmwsIHAub3B0aW9ucykKK30KKwordHlwZSBUSHR0cENsaWVudE9wdGlvbnMgc3RydWN0IHsKKwkvLyBJZiBuaWwsIERlZmF1bHRIdHRwQ2xpZW50IGlzIHVzZWQKKwlDbGllbnQgKmh0dHAuQ2xpZW50Cit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgb3B0aW9uczogb3B0aW9uc30KK30KKworZnVuYyBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlwYXJzZWRVUkwsIGVyciA6PSB1cmwuUGFyc2UodXJsc3RyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQorCWNsaWVudCA6PSBvcHRpb25zLkNsaWVudAorCWlmIGNsaWVudCA9PSBuaWwgeworCQljbGllbnQgPSBEZWZhdWx0SHR0cENsaWVudAorCX0KKwlodHRwSGVhZGVyIDo9IG1hcFtzdHJpbmddW11zdHJpbmd7IkNvbnRlbnQtVHlwZSI6IHsiYXBwbGljYXRpb24veC10aHJpZnQifX0KKwlyZXR1cm4gJlRIdHRwQ2xpZW50e2NsaWVudDogY2xpZW50LCB1cmw6IHBhcnNlZFVSTCwgcmVxdWVzdEJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKGJ1ZiksIGhlYWRlcjogaHR0cEhlYWRlcn0sIG5pbAorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CisKKy8vIFNldCB0aGUgSFRUUCBIZWFkZXIgZm9yIHRoaXMgc3BlY2lmaWMgVGhyaWZ0IFRyYW5zcG9ydAorLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGZpcnN0IGFzc2VydCB0aGUgVFRyYW5zcG9ydCBhcyBhIFRIdHRwQ2xpZW50IHR5cGUKKy8vIGxpa2Ugc286CisvLworLy8gaHR0cFRyYW5zIDo9IHRyYW5zLihUSHR0cENsaWVudCkKKy8vIGh0dHBUcmFucy5TZXRIZWFkZXIoIlVzZXItQWdlbnQiLCJUaHJpZnQgQ2xpZW50IDEuMCIpCitmdW5jIChwICpUSHR0cENsaWVudCkgU2V0SGVhZGVyKGtleSBzdHJpbmcsIHZhbHVlIHN0cmluZykgeworCXAuaGVhZGVyLkFkZChrZXksIHZhbHVlKQorfQorCisvLyBHZXQgdGhlIEhUVFAgSGVhZGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdXBwbGllZCBIZWFkZXIgS2V5IGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBoZHJWYWx1ZSA6PSBodHRwVHJhbnMuR2V0SGVhZGVyKCJVc2VyLUFnZW50IikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBHZXRIZWFkZXIoa2V5IHN0cmluZykgc3RyaW5nIHsKKwlyZXR1cm4gcC5oZWFkZXIuR2V0KGtleSkKK30KKworLy8gRGVsZXRlcyB0aGUgSFRUUCBIZWFkZXIgZ2l2ZW4gYSBIZWFkZXIgS2V5IGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBodHRwVHJhbnMuRGVsSGVhZGVyKCJVc2VyLUFnZW50IikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBEZWxIZWFkZXIoa2V5IHN0cmluZykgeworCXAuaGVhZGVyLkRlbChrZXkpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBPcGVuKCkgZXJyb3IgeworCS8vIGRvIG5vdGhpbmcKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC5yZXNwb25zZSAhPSBuaWwgfHwgcC5yZXF1ZXN0QnVmZmVyICE9IG5pbAorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgY2xvc2VSZXNwb25zZSgpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJaWYgcC5yZXNwb25zZSAhPSBuaWwgJiYgcC5yZXNwb25zZS5Cb2R5ICE9IG5pbCB7CisJCS8vIFRoZSBkb2NzIHNwZWNpZnkgdGhhdCBpZiBrZWVwYWxpdmUgaXMgZW5hYmxlZCBhbmQgdGhlIHJlc3BvbnNlIGJvZHkgaXMgbm90CisJCS8vIHJlYWQgdG8gY29tcGxldGlvbiB0aGUgY29ubmVjdGlvbiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIHRvIHRoZSBwb29sIGFuZAorCQkvLyByZXVzZWQuIEVycm9ycyBhcmUgYmVpbmcgaWdub3JlZCBoZXJlIGJlY2F1c2UgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW52YWxpZAorCQkvLyBhbmQgdGhpcyBmYWlscyBmb3Igc29tZSByZWFzb24sIHRoZSBDbG9zZSgpIG1ldGhvZCB3aWxsIGRvIGFueSByZW1haW5pbmcKKwkJLy8gY2xlYW51cC4KKwkJaW8uQ29weShpb3V0aWwuRGlzY2FyZCwgcC5yZXNwb25zZS5Cb2R5KQorCisJCWVyciA9IHAucmVzcG9uc2UuQm9keS5DbG9zZSgpCisJfQorCisJcC5yZXNwb25zZSA9IG5pbAorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIENsb3NlKCkgZXJyb3IgeworCWlmIHAucmVxdWVzdEJ1ZmZlciAhPSBuaWwgeworCQlwLnJlcXVlc3RCdWZmZXIuUmVzZXQoKQorCQlwLnJlcXVlc3RCdWZmZXIgPSBuaWwKKwl9CisJcmV0dXJuIHAuY2xvc2VSZXNwb25zZSgpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgcC5yZXNwb25zZSA9PSBuaWwgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKQorCX0KKwluLCBlcnIgOj0gcC5yZXNwb25zZS5Cb2R5LlJlYWQoYnVmKQorCWlmIG4gPiAwICYmIChlcnIgPT0gbmlsIHx8IGVyciA9PSBpby5FT0YpIHsKKwkJcmV0dXJuIG4sIG5pbAorCX0KKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiByZWFkQnl0ZShwLnJlc3BvbnNlLkJvZHkpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLnJlcXVlc3RCdWZmZXIuV3JpdGUoYnVmKQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC5yZXF1ZXN0QnVmZmVyLldyaXRlQnl0ZShjKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHAucmVxdWVzdEJ1ZmZlci5Xcml0ZVN0cmluZyhzKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCS8vIENsb3NlIGFueSBwcmV2aW91cyByZXNwb25zZSBib2R5IHRvIGF2b2lkIGxlYWtpbmcgY29ubmVjdGlvbnMuCisJcC5jbG9zZVJlc3BvbnNlKCkKKworCXJlcSwgZXJyIDo9IGh0dHAuTmV3UmVxdWVzdCgiUE9TVCIsIHAudXJsLlN0cmluZygpLCBwLnJlcXVlc3RCdWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmVxLkhlYWRlciA9IHAuaGVhZGVyCisJaWYgY3R4ICE9IG5pbCB7CisJCXJlcSA9IHJlcS5XaXRoQ29udGV4dChjdHgpCisJfQorCXJlc3BvbnNlLCBlcnIgOj0gcC5jbGllbnQuRG8ocmVxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCWlmIHJlc3BvbnNlLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7CisJCS8vIENsb3NlIHRoZSByZXNwb25zZSB0byBhdm9pZCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMuIGNsb3NlUmVzcG9uc2UgZG9lcworCQkvLyBtb3JlIHRoYW4ganVzdCBjYWxsIENsb3NlKCksIHNvIHRlbXBvcmFyaWx5IGFzc2lnbiBpdCBhbmQgcmV1c2UgdGhlIGxvZ2ljLgorCQlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwkJcC5jbG9zZVJlc3BvbnNlKCkKKworCQkvLyBUT0RPKHBvbWFjaykgbG9nIGJhZCByZXNwb25zZQorCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJIVFRQIFJlc3BvbnNlIGNvZGU6ICIrc3RyY29udi5JdG9hKHJlc3BvbnNlLlN0YXR1c0NvZGUpKQorCX0KKwlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJbGVuIDo9IHAucmVzcG9uc2UuQ29udGVudExlbmd0aAorCWlmIGxlbiA+PSAwIHsKKwkJcmV0dXJuIHVpbnQ2NChsZW4pCisJfQorCisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSh1cmwgc3RyaW5nKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zIGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnModXJsc3RyIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50IGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkibmV0L2h0dHAiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEh0dHBDbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RIdHRwQ2xpZW50SGVhZGVycyh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisKKwlodHRwVHJhbnNwb3J0IDo9ICZjdXN0b21IdHRwVHJhbnNwb3J0e30KKworCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoImh0dHA6Ly8iK2FkZHIuU3RyaW5nKCksIFRIdHRwQ2xpZW50T3B0aW9uc3sKKwkJQ2xpZW50OiAmaHR0cC5DbGllbnR7CisJCQlUcmFuc3BvcnQ6IGh0dHBUcmFuc3BvcnQsCisJCX0sCisJfSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorCisJaWYgIWh0dHBUcmFuc3BvcnQuaGl0IHsKKwkJdC5GYXRhbGYoIkN1c3RvbSBjbGllbnQgd2FzIG5vdCB1c2VkIikKKwl9Cit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnRQYWNrYWdlU2NvcGUodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJaHR0cFRyYW5zcG9ydCA6PSAmY3VzdG9tSHR0cFRyYW5zcG9ydHt9CisJRGVmYXVsdEh0dHBDbGllbnQgPSAmaHR0cC5DbGllbnR7CisJCVRyYW5zcG9ydDogaHR0cFRyYW5zcG9ydCwKKwl9CisKKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCisKKwlpZiAhaHR0cFRyYW5zcG9ydC5oaXQgeworCQl0LkZhdGFsZigiQ3VzdG9tIGNsaWVudCB3YXMgbm90IHVzZWQiKQorCX0KK30KKwordHlwZSBjdXN0b21IdHRwVHJhbnNwb3J0IHN0cnVjdCB7CisJaGl0IGJvb2wKK30KKworZnVuYyAoYyAqY3VzdG9tSHR0cFRyYW5zcG9ydCkgUm91bmRUcmlwKHJlcSAqaHR0cC5SZXF1ZXN0KSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKSB7CisJYy5oaXQgPSB0cnVlCisJcmV0dXJuIGh0dHAuRGVmYXVsdFRyYW5zcG9ydC5Sb3VuZFRyaXAocmVxKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMGYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy9nemlwIgorCSJpbyIKKwkibmV0L2h0dHAiCisJInN0cmluZ3MiCispCisKKy8vIE5ld1RocmlmdEhhbmRsZXJGdW5jIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGUgYSByZWFkeSB0byB1c2UgQXBhY2hlIFRocmlmdCBIYW5kbGVyIGZ1bmN0aW9uCitmdW5jIE5ld1RocmlmdEhhbmRsZXJGdW5jKHByb2Nlc3NvciBUUHJvY2Vzc29yLAorCWluUGZhY3RvcnksIG91dFBmYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKworCXJldHVybiBneihmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCXcuSGVhZGVyKCkuQWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisJCXRyYW5zcG9ydCA6PSBOZXdTdHJlYW1UcmFuc3BvcnQoci5Cb2R5LCB3KQorCQlwcm9jZXNzb3IuUHJvY2VzcyhyLkNvbnRleHQoKSwgaW5QZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpLCBvdXRQZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCX0pCit9CisKKy8vIGd6IHRyYW5zcGFyZW50bHkgY29tcHJlc3NlcyB0aGUgSFRUUCByZXNwb25zZSBpZiB0aGUgY2xpZW50IHN1cHBvcnRzIGl0LgorZnVuYyBneihoYW5kbGVyIGh0dHAuSGFuZGxlckZ1bmMpIGh0dHAuSGFuZGxlckZ1bmMgeworCXJldHVybiBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCWlmICFzdHJpbmdzLkNvbnRhaW5zKHIuSGVhZGVyLkdldCgiQWNjZXB0LUVuY29kaW5nIiksICJnemlwIikgeworCQkJaGFuZGxlcih3LCByKQorCQkJcmV0dXJuCisJCX0KKwkJdy5IZWFkZXIoKS5TZXQoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpCisJCWd6IDo9IGd6aXAuTmV3V3JpdGVyKHcpCisJCWRlZmVyIGd6LkNsb3NlKCkKKwkJZ3p3IDo9IGd6aXBSZXNwb25zZVdyaXRlcntXcml0ZXI6IGd6LCBSZXNwb25zZVdyaXRlcjogd30KKwkJaGFuZGxlcihnencsIHIpCisJfQorfQorCit0eXBlIGd6aXBSZXNwb25zZVdyaXRlciBzdHJ1Y3QgeworCWlvLldyaXRlcgorCWh0dHAuUmVzcG9uc2VXcml0ZXIKK30KKworZnVuYyAodyBnemlwUmVzcG9uc2VXcml0ZXIpIFdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB3LldyaXRlci5Xcml0ZShiKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE5M2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnVmaW8iCisJImNvbnRleHQiCisJImlvIgorKQorCisvLyBTdHJlYW1UcmFuc3BvcnQgaXMgYSBUcmFuc3BvcnQgbWFkZSBvZiBhbiBpby5SZWFkZXIgYW5kL29yIGFuIGlvLldyaXRlcgordHlwZSBTdHJlYW1UcmFuc3BvcnQgc3RydWN0IHsKKwlpby5SZWFkZXIKKwlpby5Xcml0ZXIKKwlpc1JlYWRXcml0ZXIgYm9vbAorCWNsb3NlZCAgICAgICBib29sCit9CisKK3R5cGUgU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCVJlYWRlciAgICAgICBpby5SZWFkZXIKKwlXcml0ZXIgICAgICAgaW8uV3JpdGVyCisJaXNSZWFkV3JpdGVyIGJvb2wKK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHRyYW5zICE9IG5pbCB7CisJCXQsIG9rIDo9IHRyYW5zLigqU3RyZWFtVHJhbnNwb3J0KQorCQlpZiBvayB7CisJCQlpZiB0LmlzUmVhZFdyaXRlciB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHQuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAorCQkJfQorCQkJaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydCh0LlJlYWRlciwgdC5Xcml0ZXIpLCBuaWwKKwkJCX0KKwkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciA9PSBuaWwgeworCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHQuUmVhZGVyKSwgbmlsCisJCQl9CisJCQlpZiB0LlJlYWRlciA9PSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Vyh0LldyaXRlciksIG5pbAorCQkJfQorCQkJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCisJCX0KKwl9CisJaWYgcC5pc1JlYWRXcml0ZXIgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcocC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKSwgbmlsCisJfQorCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHAuUmVhZGVyLCBwLldyaXRlciksIG5pbAorCX0KKwlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpLCBuaWwKKwl9CisJaWYgcC5SZWFkZXIgPT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7CisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHAuV3JpdGVyKSwgbmlsCisJfQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkocmVhZGVyIGlvLlJlYWRlciwgd3JpdGVyIGlvLldyaXRlciwgaXNSZWFkV3JpdGVyIGJvb2wpICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydEZhY3Rvcnl7UmVhZGVyOiByZWFkZXIsIFdyaXRlcjogd3JpdGVyLCBpc1JlYWRXcml0ZXI6IGlzUmVhZFdyaXRlcn0KK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnQociBpby5SZWFkZXIsIHcgaW8uV3JpdGVyKSAqU3RyZWFtVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcihyKSwgV3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0UihyIGlvLlJlYWRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZpby5OZXdSZWFkZXIocil9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0Vyh3IGlvLldyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7V3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0UlcocncgaW8uUmVhZFdyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJYnVmcncgOj0gYnVmaW8uTmV3UmVhZFdyaXRlcihidWZpby5OZXdSZWFkZXIocncpLCBidWZpby5OZXdXcml0ZXIocncpKQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmcncsIFdyaXRlcjogYnVmcncsIGlzUmVhZFdyaXRlcjogdHJ1ZX0KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gIXAuY2xvc2VkCit9CisKKy8vIGltcGxpY2l0bHkgb3BlbmVkIG9uIGNyZWF0aW9uLCBjYW4ndCBiZSByZW9wZW5lZCBvbmNlIGNsb3NlZAorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBPcGVuKCkgZXJyb3IgeworCWlmICFwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlN0cmVhbVRyYW5zcG9ydCBhbHJlYWR5IG9wZW4uIikKKwl9IGVsc2UgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgImNhbm5vdCByZW9wZW4gU3RyZWFtVHJhbnNwb3J0LiIpCisJfQorfQorCisvLyBDbG9zZXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiBwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiU3RyZWFtVHJhbnNwb3J0IGFscmVhZHkgY2xvc2VkLiIpCisJfQorCXAuY2xvc2VkID0gdHJ1ZQorCWNsb3NlZFJlYWRlciA6PSBmYWxzZQorCWlmIHAuUmVhZGVyICE9IG5pbCB7CisJCWMsIG9rIDo9IHAuUmVhZGVyLihpby5DbG9zZXIpCisJCWlmIG9rIHsKKwkJCWUgOj0gYy5DbG9zZSgpCisJCQljbG9zZWRSZWFkZXIgPSB0cnVlCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGUKKwkJCX0KKwkJfQorCQlwLlJlYWRlciA9IG5pbAorCX0KKwlpZiBwLldyaXRlciAhPSBuaWwgJiYgKCFjbG9zZWRSZWFkZXIgfHwgIXAuaXNSZWFkV3JpdGVyKSB7CisJCWMsIG9rIDo9IHAuV3JpdGVyLihpby5DbG9zZXIpCisJCWlmIG9rIHsKKwkJCWUgOj0gYy5DbG9zZSgpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGUKKwkJCX0KKwkJfQorCQlwLldyaXRlciA9IG5pbAorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCWlmIHAuV3JpdGVyID09IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIikKKwl9CisJZiwgb2sgOj0gcC5Xcml0ZXIuKEZsdXNoZXIpCisJaWYgb2sgeworCQllcnIgOj0gZi5GbHVzaCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBSZWFkKGMgW11ieXRlKSAobiBpbnQsIGVyciBlcnJvcikgeworCW4sIGVyciA9IHAuUmVhZGVyLlJlYWQoYykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFJlYWRCeXRlKCkgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5SZWFkZXIuKGlvLkJ5dGVSZWFkZXIpCisJaWYgb2sgeworCQljLCBlcnIgPSBmLlJlYWRCeXRlKCkKKwl9IGVsc2UgeworCQljLCBlcnIgPSByZWFkQnl0ZShwLlJlYWRlcikKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBXcml0ZShjIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwluLCBlcnIgPSBwLldyaXRlci5Xcml0ZShjKQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGVCeXRlKGMgYnl0ZSkgKGVyciBlcnJvcikgeworCWYsIG9rIDo9IHAuV3JpdGVyLihpby5CeXRlV3JpdGVyKQorCWlmIG9rIHsKKwkJZXJyID0gZi5Xcml0ZUJ5dGUoYykKKwl9IGVsc2UgeworCQllcnIgPSB3cml0ZUJ5dGUocC5Xcml0ZXIsIGMpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5Xcml0ZXIuKHN0cmluZ1dyaXRlcikKKwlpZiBvayB7CisJCW4sIGVyciA9IGYuV3JpdGVTdHJpbmcocykKKwl9IGVsc2UgeworCQluLCBlcnIgPSBwLldyaXRlci5Xcml0ZShbXWJ5dGUocykpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhNjExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0U3RyZWFtVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpKQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RTdHJlYW1UcmFuc3BvcnRPcGVuQ2xvc2UodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkpCisJaWYgIXRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBiZSBhbHJlYWR5IG9wZW4iKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCByZXR1cm4gZXJyb3Igd2hlbiBvcGVuIHR3aWNlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSAhPSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCByZXR1cm4gZXJyb3Igd2hlbiBjbG9zaW5nIG9wZW4gdHJhbnNwb3J0IikKKwl9CisJaWYgdHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCBiZSBvcGVuIGFmdGVyIGNsb3NlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSA9PSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGNsb3NpbmcgYSBub24gb3BlbiB0cmFuc3BvcnQiKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBub3QgYmUgYWJsZSB0byByZW9wZW4iKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZm10IgorKQorCitjb25zdCAoCisJVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiA9IDEKKykKKworLy8gZm9yIHJlZmVyZW5jZXMgdG8gX1BhcnNlQ29udGV4dCBzZWUgdHNpbXBsZWpzb25fcHJvdG9jb2wuZ28KKworLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorLy8KKy8vIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAorLy8gc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKKy8vIGNvbmZ1c2VkIHdpdGggdGhlIGZ1bGwtZmVhdHVyZWQgVEpTT05Qcm90b2NvbC4KKy8vCit0eXBlIFRKU09OUHJvdG9jb2wgc3RydWN0IHsKKwkqVFNpbXBsZUpTT05Qcm90b2NvbAorfQorCisvLyBDb25zdHJ1Y3RvcgorZnVuYyBOZXdUSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRKU09OUHJvdG9jb2wgeworCXYgOj0gJlRKU09OUHJvdG9jb2x7VFNpbXBsZUpTT05Qcm90b2NvbDogTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0KX0KKwl2LnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHYucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCisJdi5kdW1wQ29udGV4dCA9IGFwcGVuZCh2LmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXJldHVybiB2Cit9CisKKy8vIEZhY3RvcnkKK3R5cGUgVEpTT05Qcm90b2NvbEZhY3Rvcnkgc3RydWN0e30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCit9CisKK2Z1bmMgTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSAqVEpTT05Qcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVEpTT05Qcm90b2NvbEZhY3Rvcnl7fQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgZSA6PSBwLldyaXRlSTE2KGlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKHR5cGVJZCkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGtleVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA9IHAuVHlwZUlkVG9TdHJpbmcodmFsdWVUeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RFbmQoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJvb2woYiBib29sKSBlcnJvciB7CisJaWYgYiB7CisJCXJldHVybiBwLldyaXRlSTMyKDEpCisJfQorCXJldHVybiBwLldyaXRlSTMyKDApCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRGNjQodikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywKKwkvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKKwkvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKKwkvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKKy8vIFJlYWRpbmcgbWV0aG9kcy4KK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwl2ZXJzaW9uLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiB2ZXJzaW9uICE9IFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04geworCQllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gUHJvdG9jb2wgdmVyc2lvbiAlZCwgZXhwZWN0ZWQgdmVyc2lvbiAlZCIsIHZlcnNpb24sIFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pCisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisKKwl9CisJaWYgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWJUeXBlSWQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYlR5cGVJZCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBzZXFJZCwgZXJyID0gcC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJZXJyIDo9IHAuUGFyc2VMaXN0RW5kKCkKKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKKwlyZXR1cm4gIiIsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAoc3RyaW5nLCBUVHlwZSwgaW50MTYsIGVycm9yKSB7CisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGIpIDwgMSB8fCBiWzBdID09IEpTT05fUkJSQUNFWzBdIHx8IGJbMF0gPT0gSlNPTl9SQlJBQ0tFVFswXSB7CisJCXJldHVybiAiIiwgU1RPUCwgLTEsIG5pbAorCX0KKwlmaWVsZElkLCBlcnIgOj0gcC5SZWFkSTE2KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKKwl9CisJaWYgXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIFNUT1AsIGZpZWxkSWQsIGVycgorCX0KKwlzVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCisJfQorCWZUeXBlLCBlcnIgOj0gcC5TdHJpbmdUb1R5cGVJZChzVHlwZSkKKwlyZXR1cm4gIiIsIGZUeXBlLCBmaWVsZElkLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgVk9JRCwgMCwgZQorCX0KKworCS8vIHJlYWQga2V5VHlwZQorCXNLZXlUeXBlLCBlIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCWtleVR5cGUsIGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNLZXlUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgdmFsdWVUeXBlCisJc1ZhbHVlVHlwZSwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKwl2YWx1ZVR5cGUsIGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNWYWx1ZVR5cGUpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCisJLy8gcmVhZCBzaXplCisJaVNpemUsIGUgOj0gcC5SZWFkSTY0KCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisJc2l6ZSA9IGludChpU2l6ZSkKKworCV8sIGUgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQorCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwllIDo9IHAuUGFyc2VPYmplY3RFbmQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlyZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlyZXR1cm4gKHZhbHVlICE9IDApLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlSTY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUY2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwl2YXIgdiBzdHJpbmcKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdiwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXZhciB2IFtdYnl0ZQorCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZXJyID0gcC53cml0ZXIuRmx1c2goKQorCWlmIGVyciA9PSBuaWwgeworCQllcnIgPSBwLnRyYW5zLkZsdXNoKGN0eCkKKwl9CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC50cmFucworfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGVsZW1UeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwlzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgc2l6ZSwgZXJyCisJfQorCWVsZW1UeXBlLCBlcnIgPSBwLlN0cmluZ1RvVHlwZUlkKHNFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSByZWFkRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwlzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgc2l6ZSwgZXJyCisJfQorCWVsZW1UeXBlLCBlcnIgPSBwLlN0cmluZ1RvVHlwZUlkKHNFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSB3cml0ZUVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxIDo9IHAuVHlwZUlkVG9TdHJpbmcoZWxlbVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLk91dHB1dEk2NChpbnQ2NChzaXplKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBUeXBlSWRUb1N0cmluZyhmaWVsZFR5cGUgVFR5cGUpIChzdHJpbmcsIGVycm9yKSB7CisJc3dpdGNoIGJ5dGUoZmllbGRUeXBlKSB7CisJY2FzZSBCT09MOgorCQlyZXR1cm4gInRmIiwgbmlsCisJY2FzZSBCWVRFOgorCQlyZXR1cm4gImk4IiwgbmlsCisJY2FzZSBJMTY6CisJCXJldHVybiAiaTE2IiwgbmlsCisJY2FzZSBJMzI6CisJCXJldHVybiAiaTMyIiwgbmlsCisJY2FzZSBJNjQ6CisJCXJldHVybiAiaTY0IiwgbmlsCisJY2FzZSBET1VCTEU6CisJCXJldHVybiAiZGJsIiwgbmlsCisJY2FzZSBTVFJJTkc6CisJCXJldHVybiAic3RyIiwgbmlsCisJY2FzZSBTVFJVQ1Q6CisJCXJldHVybiAicmVjIiwgbmlsCisJY2FzZSBNQVA6CisJCXJldHVybiAibWFwIiwgbmlsCisJY2FzZSBTRVQ6CisJCXJldHVybiAic2V0IiwgbmlsCisJY2FzZSBMSVNUOgorCQlyZXR1cm4gImxzdCIsIG5pbAorCX0KKworCWUgOj0gZm10LkVycm9yZigiVW5rbm93biBmaWVsZFR5cGU6ICVkIiwgaW50KGZpZWxkVHlwZSkpCisJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFN0cmluZ1RvVHlwZUlkKGZpZWxkVHlwZSBzdHJpbmcpIChUVHlwZSwgZXJyb3IpIHsKKwlzd2l0Y2ggZmllbGRUeXBlIHsKKwljYXNlICJ0ZiI6CisJCXJldHVybiBUVHlwZShCT09MKSwgbmlsCisJY2FzZSAiaTgiOgorCQlyZXR1cm4gVFR5cGUoQllURSksIG5pbAorCWNhc2UgImkxNiI6CisJCXJldHVybiBUVHlwZShJMTYpLCBuaWwKKwljYXNlICJpMzIiOgorCQlyZXR1cm4gVFR5cGUoSTMyKSwgbmlsCisJY2FzZSAiaTY0IjoKKwkJcmV0dXJuIFRUeXBlKEk2NCksIG5pbAorCWNhc2UgImRibCI6CisJCXJldHVybiBUVHlwZShET1VCTEUpLCBuaWwKKwljYXNlICJzdHIiOgorCQlyZXR1cm4gVFR5cGUoU1RSSU5HKSwgbmlsCisJY2FzZSAicmVjIjoKKwkJcmV0dXJuIFRUeXBlKFNUUlVDVCksIG5pbAorCWNhc2UgIm1hcCI6CisJCXJldHVybiBUVHlwZShNQVApLCBuaWwKKwljYXNlICJzZXQiOgorCQlyZXR1cm4gVFR5cGUoU0VUKSwgbmlsCisJY2FzZSAibHN0IjoKKwkJcmV0dXJuIFRUeXBlKExJU1QpLCBuaWwKKwl9CisKKwllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gdHlwZSBpZGVudGlmaWVyOiAlcyIsIGZpZWxkVHlwZSkKKwlyZXR1cm4gVFR5cGUoU1RPUCksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZm10IgorCSJtYXRoIgorCSJzdHJjb252IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWV4cGVjdGVkIDo9ICIiCisJCWlmIHZhbHVlIHsKKwkJCWV4cGVjdGVkID0gIjEiCisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9ICIwIgorCQl9CisJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIGV4cGVjdGVkIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSAtMQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgKHYgIT0gMCkgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQlpZiB2YWx1ZSB7CisJCQl0cmFucy5Xcml0ZShbXWJ5dGV7JzEnfSkgLy8gbm90IEpTT05fVFJVRQorCQl9IGVsc2UgeworCQkJdHJhbnMuV3JpdGUoW11ieXRleycwJ30pIC8vIG5vdCBKU09OX0ZBTFNFCisJCX0KKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRCb29sKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdnYgOj0gLTEKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnZ2KTsgZXJyICE9IG5pbCB8fCAodnYgIT0gMCkgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdnYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ4KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MTYoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkxNigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQzMigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDY0KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKKwkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIC0xKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTih2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCisJCX0KKwkJdiA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXYxIDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9IHByb3RvY29sX2JkYXRhCisJYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQorCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQorCWI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlzIDo9IHRyYW5zLlN0cmluZygpCisJZXhwZWN0ZWRTdHJpbmcgOj0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpCisJaWYgcyAhPSBleHBlY3RlZFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2XG4gIHdyb3RlOiAgXCIldlwiXG5leHBlY3RlZDogXCIldlwiIiwgdGhldHlwZSwgdmFsdWUsIHMsIGV4cGVjdGVkU3RyaW5nKQorCX0KKwl2MSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgZXJyLkVycm9yKCkpCisJfQorCWlmIGxlbih2MSkgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnlcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIHZhbHVlLCB2MSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgdmFsdWUgeworCQlpZiB2MVtrXSAhPSB2IHsKKwkJCXQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnkgYXQgJXZcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIGssIHYsIHYxW2tdKQorCQl9CisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKKwliNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCisJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCisJYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSBsZW5ndGggJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQgbGVuZ3RoOiAldiIsIHRoZXR5cGUsIGxlbih2YWx1ZSksIHMsIGxlbih2KSkKKwl9CisJZm9yIGkgOj0gMDsgaSA8IGxlbih2KTsgaSsrIHsKKwkJaWYgdltpXSAhPSB2YWx1ZVtpXSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAlZCB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCBpLCB2YWx1ZVtpXSwgcywgdltpXSkKKwkJfQorCX0KKwl2MSA6PSBuZXcoc3RyaW5nKQorCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKKwkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibGlzdCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBsWzBdICE9ICJkYmwiIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBsaXN0LCBleHBlY3RlZDogIiwgU1RSSU5HLCAiLCBidXQgd2FzOiAiLCBsWzBdKQorCX0KKwlpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBsaXN0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sU2V0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInNldCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZVNldEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZVNldEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCXN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQorCX0KKwlsIDo9ICpzdHIxCisJaWYgbGVuKGwpIDwgMiB7CisJCXQuRmF0YWxmKCJTZXQgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBsWzBdICE9ICJkYmwiIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCisJfQorCWlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbE1hcCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJtYXAiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVNYXBCZWdpbihUVHlwZShJMzIpLCBUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMzIoaW50MzIoaykpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGtleSBpbnQzMiB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgZmxvYXQ2NCB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlTWFwRW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAldiwgaW4gZ286ICV2IiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCX0KKwlleHBlY3RlZEtleVR5cGUsIGV4cGVjdGVkVmFsdWVUeXBlLCBleHBlY3RlZFNpemUsIGVyciA6PSBwLlJlYWRNYXBCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciB3aGlsZSByZWFkaW5nIG1hcCBiZWdpbjogJXMiLCBlcnIuRXJyb3IoKSkKKwl9CisJaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRLZXlUeXBlKQorCX0KKwlpZiBleHBlY3RlZFZhbHVlVHlwZSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgdmFsdWUgdHlwZSAiLCBET1VCTEUsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRWYWx1ZVR5cGUpCisJfQorCWlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgc2l6ZSBvZiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRTaXplKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlrLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIGtleSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2LCBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBpaywgc3RyaW5nKGspLCBlcnIuRXJyb3IoKSkKKwkJfQorCQlpZiBpbnQoaWspICE9IGsgeworCQkJdC5GYXRhbGYoIkJhZCBrZXkgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIGlrLCBrKQorCQl9CisJCWR2LCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGR2LCB2YWx1ZSwgZXJyLkVycm9yKCkpCisJCX0KKwkJcyA6PSBzdHJjb252LkZvcm1hdEZsb2F0KGR2LCAnZycsIDEwLCA2NCkKKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYoZHYsIDEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgIW1hdGguSXNJbmYoZHYsIDApIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgIW1hdGguSXNOYU4oZHYpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA6PSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIDEwLCA2NCkKKwkJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCX0KKwllcnIgPSBwLlJlYWRNYXBFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3Igd2hpbGUgcmVhZGluZyBtYXAgZW5kOiAlcyIsIGVyci5FcnJvcigpKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzM2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbwpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKwordmFyIGJpbmFyeVByb3RvRiA9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKK3ZhciBjb21wYWN0UHJvdG9GID0gTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCit2YXIgYnVmID0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkKKwordmFyIHRmdiA9IFtdVFRyYW5zcG9ydEZhY3Rvcnl7CisJTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCksCisJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5STY0XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkzMl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlJNjRfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5RG91YmxlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeVN0cmluZ18xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlCaW5hcnlfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCb29sXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STE2XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STMyXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcwKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcxKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcyKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzZkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKKykKKworLy8gTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCit0eXBlIFRNZW1vcnlCdWZmZXIgc3RydWN0IHsKKwkqYnl0ZXMuQnVmZmVyCisJc2l6ZSBpbnQKK30KKwordHlwZSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCXNpemUgaW50Cit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpUTWVtb3J5QnVmZmVyKQorCQlpZiBvayAmJiB0LnNpemUgPiAwIHsKKwkJCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHQuc2l6ZSksIG5pbAorCQl9CisJfQorCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHAuc2l6ZSksIG5pbAorfQorCitmdW5jIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnl7c2l6ZTogc2l6ZX0KK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyKCkgKlRNZW1vcnlCdWZmZXIgeworCXJldHVybiAmVE1lbW9yeUJ1ZmZlcntCdWZmZXI6ICZieXRlcy5CdWZmZXJ7fSwgc2l6ZTogMH0KK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyTGVuKHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlciB7CisJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCBzaXplKQorCXJldHVybiAmVE1lbW9yeUJ1ZmZlcntCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBzaXplOiBzaXplfQorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gdHJ1ZQorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBPcGVuKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgQ2xvc2UoKSBlcnJvciB7CisJcC5CdWZmZXIuUmVzZXQoKQorCXJldHVybiBuaWwKK30KKworLy8gRmx1c2hpbmcgYSBtZW1vcnkgYnVmZmVyIGlzIGEgbm8tb3AKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlyZXR1cm4gdWludDY0KHAuQnVmZmVyLkxlbigpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJlOGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RNZW1vcnlCdWZmZXIodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZXNzYWdldHlwZS5nbyBiL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhYjJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28KQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBNZXNzYWdlIHR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCit0eXBlIFRNZXNzYWdlVHlwZSBpbnQzMgorCitjb25zdCAoCisJSU5WQUxJRF9UTUVTU0FHRV9UWVBFIFRNZXNzYWdlVHlwZSA9IDAKKwlDQUxMICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMQorCVJFUExZICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgPSAyCisJRVhDRVBUSU9OICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDMKKwlPTkVXQVkgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gNAorKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyOGEzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJzdHJpbmdzIgorKQorCisvKgorVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKK3RoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCitieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorCitOT1RFOiBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuICBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0Citmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKworVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorCitzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKK3RyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCitwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKworbXAgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpCitzZXJ2aWNlIDo9IENhbGN1bGF0b3IuTmV3Q2FsY3VsYXRvckNsaWVudChtcCkKKworbXAyIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKQorc2VydmljZTIgOj0gV2VhdGhlclJlcG9ydC5OZXdXZWF0aGVyUmVwb3J0Q2xpZW50KG1wMikKKworZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKK2lmIGVyciAhPSBuaWwgeworCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCit9CisKK2ZtdC5QcmludGxuKHNlcnZpY2UuQWRkKDIsMikpCitmbXQuUHJpbnRsbihzZXJ2aWNlMi5HZXRUZW1wZXJhdHVyZSgpKQorKi8KKwordHlwZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCBzdHJ1Y3QgeworCVRQcm90b2NvbAorCXNlcnZpY2VOYW1lIHN0cmluZworfQorCitjb25zdCBNVUxUSVBMRVhFRF9TRVBBUkFUT1IgPSAiOiIKKworZnVuYyBOZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCBUUHJvdG9jb2wsIHNlcnZpY2VOYW1lIHN0cmluZykgKlRNdWx0aXBsZXhlZFByb3RvY29sIHsKKwlyZXR1cm4gJlRNdWx0aXBsZXhlZFByb3RvY29seworCQlUUHJvdG9jb2w6ICAgcHJvdG9jb2wsCisJCXNlcnZpY2VOYW1lOiBzZXJ2aWNlTmFtZSwKKwl9Cit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yIHsKKwlpZiB0eXBlSWQgPT0gQ0FMTCB8fCB0eXBlSWQgPT0gT05FV0FZIHsKKwkJcmV0dXJuIHQuVFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKHQuc2VydmljZU5hbWUrTVVMVElQTEVYRURfU0VQQVJBVE9SK25hbWUsIHR5cGVJZCwgc2VxaWQpCisJfSBlbHNlIHsKKwkJcmV0dXJuIHQuVFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGVJZCwgc2VxaWQpCisJfQorfQorCisvKgorVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZworYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorCitUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKK3ZhciBwcm9jZXNzb3IgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKworZmlyc3RQcm9jZXNzb3IgOj0KK3Byb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKK3Byb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgIkNhbGN1bGF0b3IiLAorICBDYWxjdWxhdG9yLk5ld0NhbGN1bGF0b3JQcm9jZXNzb3IoJkNhbGN1bGF0b3JIYW5kbGVye30pLAorKQorCitwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICJXZWF0aGVyUmVwb3J0IiwKKyAgV2VhdGhlclJlcG9ydC5OZXdXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKCZXZWF0aGVyUmVwb3J0SGFuZGxlcnt9KSwKKykKKworc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCitpZiBlcnIgIT0gbmlsIHsKKyAgdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorfQorc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKK3NlcnZlci5TZXJ2ZSgpOworKi8KKwordHlwZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3Igc3RydWN0IHsKKwlzZXJ2aWNlUHJvY2Vzc29yTWFwIG1hcFtzdHJpbmddVFByb2Nlc3NvcgorCURlZmF1bHRQcm9jZXNzb3IgICAgVFByb2Nlc3NvcgorfQorCitmdW5jIE5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworCXJldHVybiAmVE11bHRpcGxleGVkUHJvY2Vzc29yeworCQlzZXJ2aWNlUHJvY2Vzc29yTWFwOiBtYWtlKG1hcFtzdHJpbmddVFByb2Nlc3NvciksCisJfQorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFJlZ2lzdGVyRGVmYXVsdChwcm9jZXNzb3IgVFByb2Nlc3NvcikgeworCXQuRGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcgorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFJlZ2lzdGVyUHJvY2Vzc29yKG5hbWUgc3RyaW5nLCBwcm9jZXNzb3IgVFByb2Nlc3NvcikgeworCWlmIHQuc2VydmljZVByb2Nlc3Nvck1hcCA9PSBuaWwgeworCQl0LnNlcnZpY2VQcm9jZXNzb3JNYXAgPSBtYWtlKG1hcFtzdHJpbmddVFByb2Nlc3NvcikKKwl9CisJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW25hbWVdID0gcHJvY2Vzc29yCit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgOj0gaW4uUmVhZE1lc3NhZ2VCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQorCWlmIHR5cGVJZCAhPSBDQUxMICYmIHR5cGVJZCAhPSBPTkVXQVkgeworCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlICV2IiwgdHlwZUlkKQorCX0KKwkvL2V4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorCXYgOj0gc3RyaW5ncy5TcGxpdE4obmFtZSwgTVVMVElQTEVYRURfU0VQQVJBVE9SLCAyKQorCWlmIGxlbih2KSAhPSAyIHsKKwkJaWYgdC5EZWZhdWx0UHJvY2Vzc29yICE9IG5pbCB7CisJCQlzbWIgOj0gTmV3U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCBuYW1lLCB0eXBlSWQsIHNlcWlkKQorCQkJcmV0dXJuIHQuRGVmYXVsdFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCisJCX0KKwkJcmV0dXJuIGZhbHNlLCBmbXQuRXJyb3JmKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogJXMuICBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwgbmFtZSkKKwl9CisJYWN0dWFsUHJvY2Vzc29yLCBvayA6PSB0LnNlcnZpY2VQcm9jZXNzb3JNYXBbdlswXV0KKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIsIHZbMF0pCisJfQorCXNtYiA6PSBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHZbMV0sIHR5cGVJZCwgc2VxaWQpCisJcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCit9CisKKy8vUHJvdG9jb2wgdGhhdCB1c2Ugc3RvcmVkIG1lc3NhZ2UgZm9yIFJlYWRNZXNzYWdlQmVnaW4KK3R5cGUgc3RvcmVkTWVzc2FnZVByb3RvY29sIHN0cnVjdCB7CisJVFByb3RvY29sCisJbmFtZSAgIHN0cmluZworCXR5cGVJZCBUTWVzc2FnZVR5cGUKKwlzZXFpZCAgaW50MzIKK30KKworZnVuYyBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2wocHJvdG9jb2wgVFByb3RvY29sLCBuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpICpzdG9yZWRNZXNzYWdlUHJvdG9jb2wgeworCXJldHVybiAmc3RvcmVkTWVzc2FnZVByb3RvY29se3Byb3RvY29sLCBuYW1lLCB0eXBlSWQsIHNlcWlkfQorfQorCitmdW5jIChzICpzdG9yZWRNZXNzYWdlUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcy5uYW1lLCBzLnR5cGVJZCwgcy5zZXFpZCwgbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28gYi9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZGFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbnVtZXJpYy5nbwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJtYXRoIgorCSJzdHJjb252IgorKQorCit0eXBlIE51bWVyaWMgaW50ZXJmYWNlIHsKKwlJbnQ2NCgpIGludDY0CisJSW50MzIoKSBpbnQzMgorCUludDE2KCkgaW50MTYKKwlCeXRlKCkgYnl0ZQorCUludCgpIGludAorCUZsb2F0NjQoKSBmbG9hdDY0CisJRmxvYXQzMigpIGZsb2F0MzIKKwlTdHJpbmcoKSBzdHJpbmcKKwlpc051bGwoKSBib29sCit9CisKK3R5cGUgbnVtZXJpYyBzdHJ1Y3QgeworCWlWYWx1ZSBpbnQ2NAorCWRWYWx1ZSBmbG9hdDY0CisJc1ZhbHVlIHN0cmluZworCWlzTmlsICBib29sCit9CisKK3ZhciAoCisJSU5GSU5JVFkgICAgICAgICAgTnVtZXJpYworCU5FR0FUSVZFX0lORklOSVRZIE51bWVyaWMKKwlOQU4gICAgICAgICAgICAgICBOdW1lcmljCisJWkVSTyAgICAgICAgICAgICAgTnVtZXJpYworCU5VTUVSSUNfTlVMTCAgICAgIE51bWVyaWMKKykKKworZnVuYyBOZXdOdW1lcmljRnJvbURvdWJsZShkVmFsdWUgZmxvYXQ2NCkgTnVtZXJpYyB7CisJaWYgbWF0aC5Jc0luZihkVmFsdWUsIDEpIHsKKwkJcmV0dXJuIElORklOSVRZCisJfQorCWlmIG1hdGguSXNJbmYoZFZhbHVlLCAtMSkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgbWF0aC5Jc05hTihkVmFsdWUpIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUgOj0gaW50NjQoZFZhbHVlKQorCXNWYWx1ZSA6PSBzdHJjb252LkZvcm1hdEZsb2F0KGRWYWx1ZSwgJ2cnLCAxMCwgNjQpCisJaXNOaWwgOj0gZmFsc2UKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSTY0KGlWYWx1ZSBpbnQ2NCkgTnVtZXJpYyB7CisJZFZhbHVlIDo9IGZsb2F0NjQoaVZhbHVlKQorCXNWYWx1ZSA6PSBzdHJpbmcoaVZhbHVlKQorCWlzTmlsIDo9IGZhbHNlCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KK30KKworZnVuYyBOZXdOdW1lcmljRnJvbUkzMihpVmFsdWUgaW50MzIpIE51bWVyaWMgeworCWRWYWx1ZSA6PSBmbG9hdDY0KGlWYWx1ZSkKKwlzVmFsdWUgOj0gc3RyaW5nKGlWYWx1ZSkKKwlpc05pbCA6PSBmYWxzZQorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGludDY0KGlWYWx1ZSksIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tU3RyaW5nKHNWYWx1ZSBzdHJpbmcpIE51bWVyaWMgeworCWlmIHNWYWx1ZSA9PSBJTkZJTklUWS5TdHJpbmcoKSB7CisJCXJldHVybiBJTkZJTklUWQorCX0KKwlpZiBzVmFsdWUgPT0gTkVHQVRJVkVfSU5GSU5JVFkuU3RyaW5nKCkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IE5BTi5TdHJpbmcoKSB7CisJCXJldHVybiBOQU4KKwl9CisJaVZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoc1ZhbHVlLCAxMCwgNjQpCisJZFZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VGbG9hdChzVmFsdWUsIDY0KQorCWlzTmlsIDo9IGxlbihzVmFsdWUpID09IDAKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSlNPTlN0cmluZyhzVmFsdWUgc3RyaW5nLCBpc051bGwgYm9vbCkgTnVtZXJpYyB7CisJaWYgaXNOdWxsIHsKKwkJcmV0dXJuIE5ld051bGxOdW1lcmljKCkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fSU5GSU5JVFkgeworCQlyZXR1cm4gSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fTkFOIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUludChzVmFsdWUsIDEwLCA2NCkKKwlkVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUZsb2F0KHNWYWx1ZSwgNjQpCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc051bGx9Cit9CisKK2Z1bmMgTmV3TnVsbE51bWVyaWMoKSBOdW1lcmljIHsKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAuMCwgc1ZhbHVlOiAiIiwgaXNOaWw6IHRydWV9Cit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDY0KCkgaW50NjQgeworCXJldHVybiBwLmlWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQzMigpIGludDMyIHsKKwlyZXR1cm4gaW50MzIocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDE2KCkgaW50MTYgeworCXJldHVybiBpbnQxNihwLmlWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgQnl0ZSgpIGJ5dGUgeworCXJldHVybiBieXRlKHAuaVZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQoKSBpbnQgeworCXJldHVybiBpbnQocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEZsb2F0NjQoKSBmbG9hdDY0IHsKKwlyZXR1cm4gcC5kVmFsdWUKK30KKworZnVuYyAocCAqbnVtZXJpYykgRmxvYXQzMigpIGZsb2F0MzIgeworCXJldHVybiBmbG9hdDMyKHAuZFZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwLnNWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBpc051bGwoKSBib29sIHsKKwlyZXR1cm4gcC5pc05pbAorfQorCitmdW5jIGluaXQoKSB7CisJSU5GSU5JVFkgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5JbmYoMSksIHNWYWx1ZTogIkluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQorCU5FR0FUSVZFX0lORklOSVRZID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguSW5mKC0xKSwgc1ZhbHVlOiAiLUluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQorCU5BTiA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLk5hTigpLCBzVmFsdWU6ICJOYU4iLCBpc05pbDogZmFsc2V9CisJWkVSTyA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IGZhbHNlfQorCU5VTUVSSUNfTlVMTCA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IHRydWV9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28gYi9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2YjJjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcG9pbnRlcml6ZS5nbwpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgZmlsZSBpcyBob21lIHRvIGhlbHBlcnMgdGhhdCBjb252ZXJ0IGZyb20gdmFyaW91cyBiYXNlIHR5cGVzIHRvCisvLyByZXNwZWN0aXZlIHBvaW50ZXIgdHlwZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgR28gZG9lcyBub3QgcGVybWl0CisvLyByZWZlcmVuY2VzIHRvIGNvbnN0YW50cywgbm9yIGNhbiBhIHBvaW50ZXIgdHlwZSB0byBiYXNlIHR5cGUgYmUgYWxsb2NhdGVkCisvLyBhbmQgaW5pdGlhbGl6ZWQgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbi4KKy8vCisvLyBFLmcuLCB0aGlzIGlzIG5vdCBhbGxvd2VkOgorLy8KKy8vICAgIHZhciBpcCAqaW50ID0gJjUKKy8vCisvLyBCdXQgdGhpcyAqaXMqIGFsbG93ZWQ6CisvLworLy8gICAgZnVuYyBJbnRQdHIoaSBpbnQpICppbnQgeyByZXR1cm4gJmkgfQorLy8gICAgdmFyIGlwICppbnQgPSBJbnRQdHIoNSkKKy8vCisvLyBTaW5jZSBwb2ludGVycyB0byBiYXNlIHR5cGVzIGFyZSBjb21tb25wbGFjZSBhcyBbb3B0aW9uYWxdIGZpZWxkcyBpbgorLy8gZXhwb3J0ZWQgdGhyaWZ0IHN0cnVjdHMsIHdlIGZhY3RvciBzdWNoIGhlbHBlcnMgaGVyZS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZnVuYyBGbG9hdDMyUHRyKHYgZmxvYXQzMikgKmZsb2F0MzIgeyByZXR1cm4gJnYgfQorZnVuYyBGbG9hdDY0UHRyKHYgZmxvYXQ2NCkgKmZsb2F0NjQgeyByZXR1cm4gJnYgfQorZnVuYyBJbnRQdHIodiBpbnQpICppbnQgICAgICAgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBJbnQzMlB0cih2IGludDMyKSAqaW50MzIgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBJbnQ2NFB0cih2IGludDY0KSAqaW50NjQgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBTdHJpbmdQdHIodiBzdHJpbmcpICpzdHJpbmcgICAgeyByZXR1cm4gJnYgfQorZnVuYyBVaW50MzJQdHIodiB1aW50MzIpICp1aW50MzIgICAgeyByZXR1cm4gJnYgfQorZnVuYyBVaW50NjRQdHIodiB1aW50NjQpICp1aW50NjQgICAgeyByZXR1cm4gJnYgfQorZnVuYyBCb29sUHRyKHYgYm9vbCkgKmJvb2wgICAgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBCeXRlU2xpY2VQdHIodiBbXWJ5dGUpICpbXWJ5dGUgeyByZXR1cm4gJnYgfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiMTMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKKy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgordHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCisvLyBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KKy8vIGluc3RhbmNlLgordHlwZSBUUHJvY2Vzc29yRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb2Nlc3Nvcih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yCit9CisKK3R5cGUgdFByb2Nlc3NvckZhY3Rvcnkgc3RydWN0IHsKKwlwcm9jZXNzb3IgVFByb2Nlc3NvcgorfQorCitmdW5jIE5ld1RQcm9jZXNzb3JGYWN0b3J5KHAgVFByb2Nlc3NvcikgVFByb2Nlc3NvckZhY3RvcnkgeworCXJldHVybiAmdFByb2Nlc3NvckZhY3Rvcnl7cHJvY2Vzc29yOiBwfQorfQorCitmdW5jIChwICp0UHJvY2Vzc29yRmFjdG9yeSkgR2V0UHJvY2Vzc29yKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3IgeworCXJldHVybiBwLnByb2Nlc3NvcgorfQorCisvKioKKyAqIFRoZSBkZWZhdWx0IHByb2Nlc3NvciBmYWN0b3J5IGp1c3QgcmV0dXJucyBhIHNpbmdsZXRvbgorICogaW5zdGFuY2UuCisgKi8KK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb2Nlc3NvckZ1bmN0aW9uKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3JGdW5jdGlvbgorfQorCit0eXBlIHRQcm9jZXNzb3JGdW5jdGlvbkZhY3Rvcnkgc3RydWN0IHsKKwlwcm9jZXNzb3IgVFByb2Nlc3NvckZ1bmN0aW9uCit9CisKK2Z1bmMgTmV3VFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeShwIFRQcm9jZXNzb3JGdW5jdGlvbikgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSB7CisJcmV0dXJuICZ0UHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5e3Byb2Nlc3NvcjogcH0KK30KKworZnVuYyAocCAqdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSkgR2V0UHJvY2Vzc29yRnVuY3Rpb24odHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvckZ1bmN0aW9uIHsKKwlyZXR1cm4gcC5wcm9jZXNzb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWI3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZm10IgorKQorCitjb25zdCAoCisJVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAorCVZFUlNJT05fMSAgICA9IDB4ODAwMTAwMDAKKykKKwordHlwZSBUUHJvdG9jb2wgaW50ZXJmYWNlIHsKKwlXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yCisJV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IKKwlXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvcgorCVdyaXRlU3RydWN0RW5kKCkgZXJyb3IKKwlXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yCisJV3JpdGVGaWVsZEVuZCgpIGVycm9yCisJV3JpdGVGaWVsZFN0b3AoKSBlcnJvcgorCVdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IKKwlXcml0ZU1hcEVuZCgpIGVycm9yCisJV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvcgorCVdyaXRlTGlzdEVuZCgpIGVycm9yCisJV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yCisJV3JpdGVTZXRFbmQoKSBlcnJvcgorCVdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvcgorCVdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvcgorCVdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvcgorCVdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvcgorCVdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvcgorCVdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yCisJV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvcgorCVdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IKKworCVJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpCisJUmVhZE1lc3NhZ2VFbmQoKSBlcnJvcgorCVJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKQorCVJlYWRTdHJ1Y3RFbmQoKSBlcnJvcgorCVJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpCisJUmVhZEZpZWxkRW5kKCkgZXJyb3IKKwlSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKQorCVJlYWRNYXBFbmQoKSBlcnJvcgorCVJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpCisJUmVhZExpc3RFbmQoKSBlcnJvcgorCVJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikKKwlSZWFkU2V0RW5kKCkgZXJyb3IKKwlSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpCisJUmVhZEJ5dGUoKSAodmFsdWUgaW50OCwgZXJyIGVycm9yKQorCVJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikKKwlSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpCisJUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKQorCVJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKQorCVJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpCisJUmVhZEJpbmFyeSgpICh2YWx1ZSBbXWJ5dGUsIGVyciBlcnJvcikKKworCVNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKQorCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCisKKwlUcmFuc3BvcnQoKSBUVHJhbnNwb3J0Cit9CisKKy8vIFRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aCB0aGUgc2tpcCgpIGZ1bmN0aW9uIHdpbGwgdHJhdmVyc2UKK2NvbnN0IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIID0gNjQKKworLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KK2Z1bmMgU2tpcERlZmF1bHREZXB0aChwcm90IFRQcm90b2NvbCwgdHlwZUlkIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXAocHJvdCwgdHlwZUlkLCBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCkKK30KKworLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KK2Z1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgZXJyb3IpIHsKKworCWlmIG1heERlcHRoIDw9IDAgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoREVQVEhfTElNSVQsIGVycm9ycy5OZXcoIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIikpCisJfQorCisJc3dpdGNoIGZpZWxkVHlwZSB7CisJY2FzZSBTVE9QOgorCQlyZXR1cm4KKwljYXNlIEJPT0w6CisJCV8sIGVyciA9IHNlbGYuUmVhZEJvb2woKQorCQlyZXR1cm4KKwljYXNlIEJZVEU6CisJCV8sIGVyciA9IHNlbGYuUmVhZEJ5dGUoKQorCQlyZXR1cm4KKwljYXNlIEkxNjoKKwkJXywgZXJyID0gc2VsZi5SZWFkSTE2KCkKKwkJcmV0dXJuCisJY2FzZSBJMzI6CisJCV8sIGVyciA9IHNlbGYuUmVhZEkzMigpCisJCXJldHVybgorCWNhc2UgSTY0OgorCQlfLCBlcnIgPSBzZWxmLlJlYWRJNjQoKQorCQlyZXR1cm4KKwljYXNlIERPVUJMRToKKwkJXywgZXJyID0gc2VsZi5SZWFkRG91YmxlKCkKKwkJcmV0dXJuCisJY2FzZSBTVFJJTkc6CisJCV8sIGVyciA9IHNlbGYuUmVhZFN0cmluZygpCisJCXJldHVybgorCWNhc2UgU1RSVUNUOgorCQlpZiBfLCBlcnIgPSBzZWxmLlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlmb3IgeworCQkJXywgdHlwZUlkLCBfLCBfIDo9IHNlbGYuUmVhZEZpZWxkQmVnaW4oKQorCQkJaWYgdHlwZUlkID09IFNUT1AgeworCQkJCWJyZWFrCisJCQl9CisJCQllcnIgOj0gU2tpcChzZWxmLCB0eXBlSWQsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCQlzZWxmLlJlYWRGaWVsZEVuZCgpCisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZFN0cnVjdEVuZCgpCisJY2FzZSBNQVA6CisJCWtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZE1hcEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCQllcnIgOj0gU2tpcChzZWxmLCBrZXlUeXBlLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQkJc2VsZi5Ta2lwKHZhbHVlVHlwZSkKKwkJfQorCQlyZXR1cm4gc2VsZi5SZWFkTWFwRW5kKCkKKwljYXNlIFNFVDoKKwkJZWxlbVR5cGUsIHNpemUsIGVyciA6PSBzZWxmLlJlYWRTZXRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZFNldEVuZCgpCisJY2FzZSBMSVNUOgorCQllbGVtVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZExpc3RCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZExpc3RFbmQoKQorCWRlZmF1bHQ6CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVua25vd24gZGF0YSB0eXBlICVkIiwgZmllbGRUeXBlKSkpCisJfQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhYjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZW5jb2RpbmcvYmFzZTY0IgorKQorCisvLyBUaHJpZnQgUHJvdG9jb2wgZXhjZXB0aW9uCit0eXBlIFRQcm90b2NvbEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQKK30KKworY29uc3QgKAorCVVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OID0gMAorCUlOVkFMSURfREFUQSAgICAgICAgICAgICAgID0gMQorCU5FR0FUSVZFX1NJWkUgICAgICAgICAgICAgID0gMgorCVNJWkVfTElNSVQgICAgICAgICAgICAgICAgID0gMworCUJBRF9WRVJTSU9OICAgICAgICAgICAgICAgID0gNAorCU5PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgID0gNQorCURFUFRIX0xJTUlUICAgICAgICAgICAgICAgID0gNgorKQorCit0eXBlIHRQcm90b2NvbEV4Y2VwdGlvbiBzdHJ1Y3QgeworCXR5cGVJZCAgaW50CisJbWVzc2FnZSBzdHJpbmcKK30KKworZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQgeworCXJldHVybiBwLnR5cGVJZAorfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHAubWVzc2FnZQorfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5tZXNzYWdlCit9CisKK2Z1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVyciBlcnJvcikgVFByb3RvY29sRXhjZXB0aW9uIHsKKwlpZiBlcnIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlpZiBlLCBvayA6PSBlcnIuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgb2sgOj0gZXJyLihiYXNlNjQuQ29ycnVwdElucHV0RXJyb3IpOyBvayB7CisJCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue0lOVkFMSURfREFUQSwgZXJyLkVycm9yKCl9CisJfQorCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue1VOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OLCBlcnIuRXJyb3IoKX0KK30KKworZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShlcnJUeXBlIGludCwgZXJyIGVycm9yKSBUUHJvdG9jb2xFeGNlcHRpb24geworCWlmIGVyciA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue2VyclR5cGUsIGVyci5FcnJvcigpfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2ZhY3RvcnkuZ28KQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIHByb3RvY29sIGluc3RhbmNlcy4KK3R5cGUgVFByb3RvY29sRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDA1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImlvL2lvdXRpbCIKKwkibWF0aCIKKwkibmV0IgorCSJuZXQvaHR0cCIKKwkidGVzdGluZyIKKykKKworY29uc3QgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSA9IDE1NQorCit2YXIgKAorCXByb3RvY29sX2JkYXRhIFtdYnl0ZSAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmc7IHNhbWUgYXMgZGF0YQorCUJPT0xfVkFMVUVTICAgIFtdYm9vbAorCUJZVEVfVkFMVUVTICAgIFtdaW50OAorCUlOVDE2X1ZBTFVFUyAgIFtdaW50MTYKKwlJTlQzMl9WQUxVRVMgICBbXWludDMyCisJSU5UNjRfVkFMVUVTICAgW11pbnQ2NAorCURPVUJMRV9WQUxVRVMgIFtdZmxvYXQ2NAorCVNUUklOR19WQUxVRVMgIFtdc3RyaW5nCispCisKK2Z1bmMgaW5pdCgpIHsKKwlwcm90b2NvbF9iZGF0YSA9IG1ha2UoW11ieXRlLCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFKQorCWZvciBpIDo9IDA7IGkgPCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFOyBpKysgeworCQlwcm90b2NvbF9iZGF0YVtpXSA9IGJ5dGUoKGkgKyAnYScpICUgMjU1KQorCX0KKwlCT09MX1ZBTFVFUyA9IFtdYm9vbHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlfQorCUJZVEVfVkFMVUVTID0gW11pbnQ4ezExNywgMCwgMSwgMzIsIDEyNywgLTEyOCwgLTF9CisJSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9CisJSU5UMzJfVkFMVUVTID0gW11pbnQzMns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNX0KKwlJTlQ2NF9WQUxVRVMgPSBbXWludDY0ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNTM1LCAzNDM1OTczODQ4MSwgLTM1MTg0MzcyMDg4NzE5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgOTIyMzM3MjAzNjg1NDc3NTgwN30KKwlET1VCTEVfVkFMVUVTID0gW11mbG9hdDY0ezQ1OS4zLCAwLjAsIC0xLjAsIDEuMCwgMC41LCAwLjMzMzMsIDMuMTQxNTksIDEuNTM3ZS0zOCwgMS42NzNlMjUsIDYuMDIyMTQxNzllMjMsIC02LjAyMjE0MTc5ZTIzLCBJTkZJTklUWS5GbG9hdDY0KCksIE5FR0FUSVZFX0lORklOSVRZLkZsb2F0NjQoKSwgTkFOLkZsb2F0NjQoKX0KKwlTVFJJTkdfVkFMVUVTID0gW11zdHJpbmd7IiIsICJhIiwgInN0W3VmXWYiLCAic3QsdTpmZiB3aXRoIHNwYWNlcyIsICJzdHVmZlx0d2l0aFxuZXNjYXBlXFxjaGFyYWN0ZXJzJy4uLlwibG90c3tvZn1mdW48L3htbD4ifQorfQorCit0eXBlIEhUVFBFY2hvU2VydmVyIHN0cnVjdHt9Cit0eXBlIEhUVFBIZWFkZXJFY2hvU2VydmVyIHN0cnVjdHt9CisKK2Z1bmMgKHAgKkhUVFBFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgeworCWJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkQWxsKHJlcS5Cb2R5KQorCWlmIGVyciAhPSBuaWwgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzQmFkUmVxdWVzdCkKKwkJdy5Xcml0ZShidWYpCisJfSBlbHNlIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQorCQl3LldyaXRlKGJ1ZikKKwl9Cit9CisKK2Z1bmMgKHAgKkhUVFBIZWFkZXJFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgeworCWJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkQWxsKHJlcS5Cb2R5KQorCWlmIGVyciAhPSBuaWwgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzQmFkUmVxdWVzdCkKKwkJdy5Xcml0ZShidWYpCisJfSBlbHNlIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQorCQl3LldyaXRlKGJ1ZikKKwl9Cit9CisKK2Z1bmMgSHR0cENsaWVudFNldHVwRm9yVGVzdCh0ICp0ZXN0aW5nLlQpIChuZXQuTGlzdGVuZXIsIG5ldC5BZGRyKSB7CisJYWRkciwgZXJyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KDQwMDAwKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIHRjcCBwb3J0IGFkZHI6ICVzIiwgZXJyKQorCQlyZXR1cm4gbmlsLCBhZGRyCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKGFkZHIuTmV0d29yaygpLCBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIHRjcCBsaXN0ZW5lciBvbiAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJCXJldHVybiBsLCBhZGRyCisJfQorCWdvIGh0dHAuU2VydmUobCwgJkhUVFBFY2hvU2VydmVye30pCisJcmV0dXJuIGwsIGFkZHIKK30KKworZnVuYyBIdHRwQ2xpZW50U2V0dXBGb3JIZWFkZXJUZXN0KHQgKnRlc3RpbmcuVCkgKG5ldC5MaXN0ZW5lciwgbmV0LkFkZHIpIHsKKwlhZGRyLCBlcnIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoNDAwMDApCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZmluZCBhdmFpbGFibGUgdGNwIHBvcnQgYWRkcjogJXMiLCBlcnIpCisJCXJldHVybiBuaWwsIGFkZHIKKwl9CisJbCwgZXJyIDo9IG5ldC5MaXN0ZW4oYWRkci5OZXR3b3JrKCksIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgdGNwIGxpc3RlbmVyIG9uICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwkJcmV0dXJuIGwsIGFkZHIKKwl9CisJZ28gaHR0cC5TZXJ2ZShsLCAmSFRUUEhlYWRlckVjaG9TZXJ2ZXJ7fSkKKwlyZXR1cm4gbCwgYWRkcgorfQorCitmdW5jIFJlYWRXcml0ZVByb3RvY29sVGVzdCh0ICp0ZXN0aW5nLlQsIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSB7CisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpCisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJZGVmZXIgbC5DbG9zZSgpCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoMCwgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSg2LCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDksIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSksCisJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSksCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJvb2wodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoQk9PTCkKKwl0aGVsZW4gOj0gbGVuKEJPT0xfVkFMVUVTKQorCWVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWVyciA9IHAuV3JpdGVCb29sKHYpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKKwl9CisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJvb2woKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogaW5kZXggJXYgJXYgJXYgJXYgIT0gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwllcnIgPSBwLlJlYWRMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJ5dGUodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoQllURSkKKwl0aGVsZW4gOj0gbGVuKEJZVEVfVkFMVUVTKQorCWVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCWVyciA9IHAuV3JpdGVCeXRlKHYpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJ5dGUgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwl9CisJZXJyID0gcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJZXJyID0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciBmbHVzaGluZyBsaXN0IG9mIGJ5dGVzOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCisJfQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGJ5dGUgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlSTE2KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEkxNikKKwl0aGVsZW4gOj0gbGVuKElOVDE2X1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlwLldyaXRlSTE2KHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIsIElOVDE2X1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRJMTYoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQxNiBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVJMzIodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoSTMyKQorCXRoZWxlbiA6PSBsZW4oSU5UMzJfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCXAuV3JpdGVJMzIodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgSU5UMzJfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEkzMigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGludDMyIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUk2NCh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShJNjQpCisJdGhlbGVuIDo9IGxlbihJTlQ2NF9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJcC5Xcml0ZUk2NCh2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBJTlQ2NF9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50NjQgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxICE9ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlRG91YmxlKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKERPVUJMRSkKKwl0aGVsZW4gOj0gbGVuKERPVUJMRV9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXAuV3JpdGVEb3VibGUodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgRE9VQkxFX1ZBTFVFUykKKwl9CisJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwl9CisJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgZG91YmxlIGF0IGluZGV4ICVkOiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIG1hdGguSXNOYU4odikgeworCQkJaWYgIW1hdGguSXNOYU4odmFsdWUpIHsKKwkJCQl0LkVycm9yZigiJXM6ICVUICVUIG1hdGguSXNOYU4oJXYpICE9IG1hdGguSXNOYU4oJXYpIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCX0KKwkJfSBlbHNlIGlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJZXJyID0gcC5SZWFkTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZVN0cmluZyh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShTVFJJTkcpCisJdGhlbGVuIDo9IGxlbihTVFJJTkdfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQlwLldyaXRlU3RyaW5nKHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIFNUUklOR19WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIHN0cmluZyBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVCaW5hcnkodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXYgOj0gcHJvdG9jb2xfYmRhdGEKKwlwLldyaXRlQmluYXJ5KHYpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgYmluYXJ5OiAlcyIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgZXJyLkVycm9yKCkpCisJfQorCWlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4odikgIT0gbGVuKHZhbHVlKS4uLiAlZCAhPSAlZCIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgbGVuKHYpLCBsZW4odmFsdWUpKQorCX0gZWxzZSB7CisJCWZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7CisJCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCQl0LkVycm9yZigiJXM6ICVUICVUICVzICE9ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjViZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJpbyIKKwordHlwZSBSaWNoVHJhbnNwb3J0IHN0cnVjdCB7CisJVFRyYW5zcG9ydAorfQorCisvLyBXcmFwcyBUcmFuc3BvcnQgdG8gcHJvdmlkZSBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UKK2Z1bmMgTmV3VFJpY2hUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKlJpY2hUcmFuc3BvcnQgeworCXJldHVybiAmUmljaFRyYW5zcG9ydHt0cmFuc30KK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVhZEJ5dGUoKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcmVhZEJ5dGUoci5UVHJhbnNwb3J0KQorfQorCitmdW5jIChyICpSaWNoVHJhbnNwb3J0KSBXcml0ZUJ5dGUoYyBieXRlKSBlcnJvciB7CisJcmV0dXJuIHdyaXRlQnl0ZShyLlRUcmFuc3BvcnQsIGMpCit9CisKK2Z1bmMgKHIgKlJpY2hUcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiByLldyaXRlKFtdYnl0ZShzKSkKK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiByLlRUcmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCitmdW5jIHJlYWRCeXRlKHIgaW8uUmVhZGVyKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwl2IDo9IFsxXWJ5dGV7MH0KKwluLCBlcnIgOj0gci5SZWFkKHZbMDoxXSkKKwlpZiBuID4gMCAmJiAoZXJyID09IG5pbCB8fCBlcnIgPT0gaW8uRU9GKSB7CisJCXJldHVybiB2WzBdLCBuaWwKKwl9CisJaWYgbiA+IDAgJiYgZXJyICE9IG5pbCB7CisJCXJldHVybiB2WzBdLCBlcnIKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBlcnIKKwl9CisJcmV0dXJuIHZbMF0sIG5pbAorfQorCitmdW5jIHdyaXRlQnl0ZSh3IGlvLldyaXRlciwgYyBieXRlKSBlcnJvciB7CisJdiA6PSBbMV1ieXRle2N9CisJXywgZXJyIDo9IHcuV3JpdGUodlswOjFdKQorCXJldHVybiBlcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMzZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImVycm9ycyIKKwkiaW8iCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEVuc3VyZVRyYW5zcG9ydHNBcmVSaWNoKHQgKnRlc3RpbmcuVCkgeworCWJ1ZiA6PSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKQorCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSgiaHR0cDovLzEyNy4wLjAuMSIpLAorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJXywgb2sgOj0gdHJhbnMuKFRSaWNoVHJhbnNwb3J0KQorCQlpZiAhb2sgeworCQkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlcyBkb2VzIG5vdCBpbXBsZW1lbnQgVFJpY2hUcmFuc3BvcnQgaW50ZXJmYWNlIiwgcmVmbGVjdC5WYWx1ZU9mKHRyYW5zKSkKKwkJfQorCX0KK30KKworLy8gVGVzdFJlYWRCeXRlIHRlc3RzIHdoZXRoZXIgcmVhZEJ5dGUgaGFuZGxlcyBlcnJvciBjYXNlcyBjb3JyZWN0bHkuCitmdW5jIFRlc3RSZWFkQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwlmb3IgaSwgdGVzdCA6PSByYW5nZSByZWFkQnl0ZVRlc3RzIHsKKwkJdiwgZXJyIDo9IHJlYWRCeXRlKHRlc3QucikKKwkJaWYgdiAhPSB0ZXN0LnYgeworCQkJdC5GYXRhbGYoIlRlc3RSZWFkQnl0ZSAlZDogdmFsdWUgZGlmZmVycy4gRXhwZWN0ZWQgJWQsIGdvdCAlZCIsIGksIHRlc3QudiwgdGVzdC5yLnYpCisJCX0KKwkJaWYgZXJyICE9IHRlc3QuZXJyIHsKKwkJCXQuRmF0YWxmKCJUZXN0UmVhZEJ5dGUgJWQ6IGVycm9yIGRpZmZlcnMuIEV4cGVjdGVkICVzLCBnb3QgJXMiLCBpLCB0ZXN0LmVyciwgdGVzdC5yLmVycikKKwkJfQorCX0KK30KKwordmFyIHNvbWVFcnJvciA9IGVycm9ycy5OZXcoIlNvbWUgZXJyb3IiKQordmFyIHJlYWRCeXRlVGVzdHMgPSBbXXN0cnVjdCB7CisJciAgICptb2NrUmVhZGVyCisJdiAgIGJ5dGUKKwllcnIgZXJyb3IKK317CisJeyZtb2NrUmVhZGVyezAsIDU1LCBpby5FT0Z9LCAwLCBpby5FT0Z9LCAgICAgICAgLy8gcmVhZGVyIHNlbmRzIEVPRiB3L28gZGF0YQorCXsmbW9ja1JlYWRlcnswLCA1NSwgc29tZUVycm9yfSwgMCwgc29tZUVycm9yfSwgIC8vIHJlYWRlciBzZW5kcyBzb21lIG90aGVyIGVycm9yCisJeyZtb2NrUmVhZGVyezEsIDU1LCBuaWx9LCA1NSwgbmlsfSwgICAgICAgICAgICAgLy8gcmVhZGVyIHNlbmRzIGRhdGEgdy9vIGVycm9yCisJeyZtb2NrUmVhZGVyezEsIDU1LCBpby5FT0Z9LCA1NSwgbmlsfSwgICAgICAgICAgLy8gcmVhZGVyIHNlbmRzIGRhdGEgd2l0aCBFT0YKKwl7Jm1vY2tSZWFkZXJ7MSwgNTUsIHNvbWVFcnJvcn0sIDU1LCBzb21lRXJyb3J9LCAvLyByZWFkZXIgc2VuZHMgZGF0YSB3aXRoc29tZSBlcnJvcgorfQorCit0eXBlIG1vY2tSZWFkZXIgc3RydWN0IHsKKwluICAgaW50CisJdiAgIGJ5dGUKKwllcnIgZXJyb3IKK30KKworZnVuYyAociAqbW9ja1JlYWRlcikgUmVhZChwIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlpZiByLm4gPiAwIHsKKwkJcFswXSA9IHIudgorCX0KKwlyZXR1cm4gci5uLCByLmVycgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjRkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit0eXBlIFRTZXJpYWxpemVyIHN0cnVjdCB7CisJVHJhbnNwb3J0ICpUTWVtb3J5QnVmZmVyCisJUHJvdG9jb2wgIFRQcm90b2NvbAorfQorCit0eXBlIFRTdHJ1Y3QgaW50ZXJmYWNlIHsKKwlXcml0ZShwIFRQcm90b2NvbCkgZXJyb3IKKwlSZWFkKHAgVFByb3RvY29sKSBlcnJvcgorfQorCitmdW5jIE5ld1RTZXJpYWxpemVyKCkgKlRTZXJpYWxpemVyIHsKKwl0cmFuc3BvcnQgOj0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCXByb3RvY29sIDo9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisJcmV0dXJuICZUU2VyaWFsaXplcnsKKwkJdHJhbnNwb3J0LAorCQlwcm90b2NvbH0KK30KKworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlU3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAocyBzdHJpbmcsIGVyciBlcnJvcikgeworCXQuVHJhbnNwb3J0LlJlc2V0KCkKKworCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuIHQuVHJhbnNwb3J0LlN0cmluZygpLCBuaWwKK30KKworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgeworCXQuVHJhbnNwb3J0LlJlc2V0KCkKKworCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuVHJhbnNwb3J0LkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwliID0gYXBwZW5kKGIsIHQuVHJhbnNwb3J0LkJ5dGVzKCkuLi4pCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImZtdCIKKwkidGVzdGluZyIKKykKKwordHlwZSBQcm90b2NvbEZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRQcm90b2NvbCh0IFRUcmFuc3BvcnQpIFRQcm90b2NvbAorfQorCitmdW5jIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xIE15VGVzdFN0cnVjdCkgKGJvb2wsIGVycm9yKSB7CisJc3dpdGNoIHsKKwljYXNlIG0uT24gIT0gbTEuT246CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQm9vbGVhbiBub3QgZXF1YWwiKQorCWNhc2UgbS5CICE9IG0xLkI6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQnl0ZSBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQxNiAhPSBtMS5JbnQxNjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQxNiBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQzMiAhPSBtMS5JbnQzMjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQzMiBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQ2NCAhPSBtMS5JbnQ2NDoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQ2NCBub3QgZXF1YWwiKQorCWNhc2UgbS5EICE9IG0xLkQ6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiRG91YmxlIG5vdCBlcXVhbCIpCisJY2FzZSBtLlN0ICE9IG0xLlN0OgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIlN0cmluZyBub3QgZXF1YWwiKQorCisJY2FzZSBsZW4obS5CaW4pICE9IGxlbihtMS5CaW4pOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkJpbmFyeSBzaXplIG5vdCBlcXVhbCIpCisJY2FzZSBsZW4obS5CaW4pID09IGxlbihtMS5CaW4pOgorCQlmb3IgaSA6PSByYW5nZSBtLkJpbiB7CisJCQlpZiBtLkJpbltpXSAhPSBtMS5CaW5baV0geworCQkJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQmluYXJ5IG5vdCBlcXVhbCIpCisJCQl9CisJCX0KKwljYXNlIGxlbihtLlN0cmluZ01hcCkgIT0gbGVuKG0xLlN0cmluZ01hcCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nTWFwIHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLlN0cmluZ0xpc3QpICE9IGxlbihtMS5TdHJpbmdMaXN0KToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJTdHJpbmdMaXN0IHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLlN0cmluZ1NldCkgIT0gbGVuKG0xLlN0cmluZ1NldCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nU2V0IHNpemUgbm90IGVxdWFsIikKKworCWNhc2UgbS5FICE9IG0xLkU6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiTXlUZXN0RW51bSBub3QgZXF1YWwiKQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWUsIG5pbAorCisJfQorCXJldHVybiB0cnVlLCBuaWwKK30KKworZnVuYyBQcm90b2NvbFRlc3QxKHRlc3QgKnRlc3RpbmcuVCwgcGYgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpIHsKKwl0IDo9IE5ld1RTZXJpYWxpemVyKCkKKwl0LlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodC5UcmFuc3BvcnQpCisJdmFyIG0gPSBNeVRlc3RTdHJ1Y3R7fQorCW0uT24gPSB0cnVlCisJbS5CID0gaW50OCgwKQorCW0uSW50MTYgPSAxCisJbS5JbnQzMiA9IDIKKwltLkludDY0ID0gMworCW0uRCA9IDQuMQorCW0uU3QgPSAiVGVzdCIKKwltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKKwltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCisJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKKwltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgNSkKKwltLkUgPSAyCisKKwlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZyhjb250ZXh0LkJhY2tncm91bmQoKSwgJm0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIFNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKwl9CisKKwl0MSA6PSBOZXdURGVzZXJpYWxpemVyKCkKKwl0MS5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQxLlRyYW5zcG9ydCkKKwl2YXIgbTEgPSBNeVRlc3RTdHJ1Y3R7fQorCWlmIGVyciA9IHQxLlJlYWRTdHJpbmcoJm0xLCBzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIERlc2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJcmV0dXJuIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xKQorCit9CisKK2Z1bmMgUHJvdG9jb2xUZXN0Mih0ZXN0ICp0ZXN0aW5nLlQsIHBmIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKSB7CisJdCA6PSBOZXdUU2VyaWFsaXplcigpCisJdC5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQuVHJhbnNwb3J0KQorCXZhciBtID0gTXlUZXN0U3RydWN0e30KKwltLk9uID0gZmFsc2UKKwltLkIgPSBpbnQ4KDApCisJbS5JbnQxNiA9IDEKKwltLkludDMyID0gMgorCW0uSW50NjQgPSAzCisJbS5EID0gNC4xCisJbS5TdCA9ICJUZXN0IgorCW0uQmluID0gbWFrZShbXWJ5dGUsIDEwKQorCW0uU3RyaW5nTWFwID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgNSkKKwltLlN0cmluZ0xpc3QgPSBtYWtlKFtdc3RyaW5nLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQorCW0uRSA9IDIKKworCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJdDEgOj0gTmV3VERlc2VyaWFsaXplcigpCisJdDEuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0MS5UcmFuc3BvcnQpCisJdmFyIG0xID0gTXlUZXN0U3RydWN0e30KKwlpZiBlcnIgPSB0MS5SZWFkU3RyaW5nKCZtMSwgcyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBEZXNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKworCX0KKworCXJldHVybiBjb21wYXJlU3RydWN0cyhtLCBtMSkKKworfQorCitmdW5jIFRlc3RTZXJpYWxpemVyKHQgKnRlc3RpbmcuVCkgeworCisJdmFyIHByb3RvY29sX2ZhY3RvcmllcyBtYXBbc3RyaW5nXVByb3RvY29sRmFjdG9yeQorCXByb3RvY29sX2ZhY3RvcmllcyA9IG1ha2UobWFwW3N0cmluZ11Qcm90b2NvbEZhY3RvcnkpCisJcHJvdG9jb2xfZmFjdG9yaWVzWyJCaW5hcnkiXSA9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlwcm90b2NvbF9mYWN0b3JpZXNbIkNvbXBhY3QiXSA9IE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwkvL3Byb3RvY29sX2ZhY3Rvcmllc1siU2ltcGxlSlNPTiJdID0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSAtIHdyaXRlIG9ubHksIGNhbid0IGJlIHJlYWQgYmFjayBieSBkZXNpZ24KKwlwcm90b2NvbF9mYWN0b3JpZXNbIkpTT04iXSA9IE5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKworCXZhciB0ZXN0cyBtYXBbc3RyaW5nXWZ1bmMoKnRlc3RpbmcuVCwgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpCisJdGVzdHMgPSBtYWtlKG1hcFtzdHJpbmddZnVuYygqdGVzdGluZy5ULCBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikpCisJdGVzdHNbIlRlc3QgMSJdID0gUHJvdG9jb2xUZXN0MQorCXRlc3RzWyJUZXN0IDIiXSA9IFByb3RvY29sVGVzdDIKKwkvL3Rlc3RzWyJUZXN0IDMiXSA9IFByb3RvY29sVGVzdDMgLy8gRXhhbXBsZSBvZiBob3cgdG8gYWRkIGFkZGl0aW9uYWwgdGVzdHMKKworCWZvciBuYW1lLCBwZiA6PSByYW5nZSBwcm90b2NvbF9mYWN0b3JpZXMgeworCisJCWZvciB0ZXN0LCBmIDo9IHJhbmdlIHRlc3RzIHsKKworCQkJaWYgcywgZXJyIDo9IGYodCwgcGYpOyAhcyB8fCBlcnIgIT0gbmlsIHsKKwkJCQl0LkVycm9yZigiJXMgRmFpbGVkIGZvciAlcyBwcm90b2NvbFxuXHQgJXMiLCB0ZXN0LCBuYW1lLCBlcnIpCisJCQl9CisKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ3MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KQEAgLTAsMCArMSw2MzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKEZJWE1FKQorLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworCisvKiBUSEUgRk9MTE9XSU5HIFRIUklGVCBGSUxFIFdBUyBVU0VEIFRPIENSRUFURSBUSElTCisKK2VudW0gTXlUZXN0RW51bSB7CisJRklSU1QgPSAxLAorCVNFQ09ORCA9IDIsCisJVEhJUkQgPSAzLAorCUZPVVJUSCA9IDQsCit9CisKK3N0cnVjdCBNeVRlc3RTdHJ1Y3QgeworCTE6IGJvb2wgb24sCisJMjogYnl0ZSBiLAorCTM6IGkxNiBpbnQxNiwKKwk0OiBpMzIgaW50MzIsCisJNTogaTY0IGludDY0LAorCTY6IGRvdWJsZSBkLAorCTc6IHN0cmluZyBzdCwKKwk4OiBiaW5hcnkgYmluLAorCTk6IG1hcDxzdHJpbmcsIHN0cmluZz4gc3RyaW5nTWFwLAorCTEwOiBsaXN0PHN0cmluZz4gc3RyaW5nTGlzdCwKKwkxMTogc2V0PHN0cmluZz4gc3RyaW5nU2V0LAorCTEyOiBNeVRlc3RFbnVtIGUsCit9CisqLworCitpbXBvcnQgKAorCSJmbXQiCispCisKKy8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pCit2YXIgXyA9IFpFUk8KK3ZhciBfID0gZm10LlByaW50ZgorCit2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50CisKK3R5cGUgTXlUZXN0RW51bSBpbnQ2NAorCitjb25zdCAoCisJTXlUZXN0RW51bV9GSVJTVCAgTXlUZXN0RW51bSA9IDEKKwlNeVRlc3RFbnVtX1NFQ09ORCBNeVRlc3RFbnVtID0gMgorCU15VGVzdEVudW1fVEhJUkQgIE15VGVzdEVudW0gPSAzCisJTXlUZXN0RW51bV9GT1VSVEggTXlUZXN0RW51bSA9IDQKKykKKworZnVuYyAocCBNeVRlc3RFbnVtKSBTdHJpbmcoKSBzdHJpbmcgeworCXN3aXRjaCBwIHsKKwljYXNlIE15VGVzdEVudW1fRklSU1Q6CisJCXJldHVybiAiRklSU1QiCisJY2FzZSBNeVRlc3RFbnVtX1NFQ09ORDoKKwkJcmV0dXJuICJTRUNPTkQiCisJY2FzZSBNeVRlc3RFbnVtX1RISVJEOgorCQlyZXR1cm4gIlRISVJEIgorCWNhc2UgTXlUZXN0RW51bV9GT1VSVEg6CisJCXJldHVybiAiRk9VUlRIIgorCX0KKwlyZXR1cm4gIjxVTlNFVD4iCit9CisKK2Z1bmMgTXlUZXN0RW51bUZyb21TdHJpbmcocyBzdHJpbmcpIChNeVRlc3RFbnVtLCBlcnJvcikgeworCXN3aXRjaCBzIHsKKwljYXNlICJGSVJTVCI6CisJCXJldHVybiBNeVRlc3RFbnVtX0ZJUlNULCBuaWwKKwljYXNlICJTRUNPTkQiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9TRUNPTkQsIG5pbAorCWNhc2UgIlRISVJEIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fVEhJUkQsIG5pbAorCWNhc2UgIkZPVVJUSCI6CisJCXJldHVybiBNeVRlc3RFbnVtX0ZPVVJUSCwgbmlsCisJfQorCXJldHVybiBNeVRlc3RFbnVtKDApLCBmbXQuRXJyb3JmKCJub3QgYSB2YWxpZCBNeVRlc3RFbnVtIHN0cmluZyIpCit9CisKK2Z1bmMgTXlUZXN0RW51bVB0cih2IE15VGVzdEVudW0pICpNeVRlc3RFbnVtIHsgcmV0dXJuICZ2IH0KKwordHlwZSBNeVRlc3RTdHJ1Y3Qgc3RydWN0IHsKKwlPbiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgYHRocmlmdDoib24sMSIganNvbjoib24iYAorCUIgICAgICAgICAgaW50OCAgICAgICAgICAgICAgICBgdGhyaWZ0OiJiLDIiIGpzb246ImIiYAorCUludDE2ICAgICAgaW50MTYgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQxNiwzIiBqc29uOiJpbnQxNiJgCisJSW50MzIgICAgICBpbnQzMiAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDMyLDQiIGpzb246ImludDMyImAKKwlJbnQ2NCAgICAgIGludDY0ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50NjQsNSIganNvbjoiaW50NjQiYAorCUQgICAgICAgICAgZmxvYXQ2NCAgICAgICAgICAgICBgdGhyaWZ0OiJkLDYiIGpzb246ImQiYAorCVN0ICAgICAgICAgc3RyaW5nICAgICAgICAgICAgICBgdGhyaWZ0OiJzdCw3IiBqc29uOiJzdCJgCisJQmluICAgICAgICBbXWJ5dGUgICAgICAgICAgICAgIGB0aHJpZnQ6ImJpbiw4IiBqc29uOiJiaW4iYAorCVN0cmluZ01hcCAgbWFwW3N0cmluZ11zdHJpbmcgICBgdGhyaWZ0OiJzdHJpbmdNYXAsOSIganNvbjoic3RyaW5nTWFwImAKKwlTdHJpbmdMaXN0IFtdc3RyaW5nICAgICAgICAgICAgYHRocmlmdDoic3RyaW5nTGlzdCwxMCIganNvbjoic3RyaW5nTGlzdCJgCisJU3RyaW5nU2V0ICBtYXBbc3RyaW5nXXN0cnVjdHt9IGB0aHJpZnQ6InN0cmluZ1NldCwxMSIganNvbjoic3RyaW5nU2V0ImAKKwlFICAgICAgICAgIE15VGVzdEVudW0gICAgICAgICAgYHRocmlmdDoiZSwxMiIganNvbjoiZSJgCit9CisKK2Z1bmMgTmV3TXlUZXN0U3RydWN0KCkgKk15VGVzdFN0cnVjdCB7CisJcmV0dXJuICZNeVRlc3RTdHJ1Y3R7fQorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldE9uKCkgYm9vbCB7CisJcmV0dXJuIHAuT24KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRCKCkgaW50OCB7CisJcmV0dXJuIHAuQgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEludDE2KCkgaW50MTYgeworCXJldHVybiBwLkludDE2Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0SW50MzIoKSBpbnQzMiB7CisJcmV0dXJuIHAuSW50MzIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRJbnQ2NCgpIGludDY0IHsKKwlyZXR1cm4gcC5JbnQ2NAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEQoKSBmbG9hdDY0IHsKKwlyZXR1cm4gcC5ECit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3QoKSBzdHJpbmcgeworCXJldHVybiBwLlN0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0QmluKCkgW11ieXRlIHsKKwlyZXR1cm4gcC5CaW4KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRTdHJpbmdNYXAoKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJcmV0dXJuIHAuU3RyaW5nTWFwCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nTGlzdCgpIFtdc3RyaW5nIHsKKwlyZXR1cm4gcC5TdHJpbmdMaXN0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nU2V0KCkgbWFwW3N0cmluZ11zdHJ1Y3R7fSB7CisJcmV0dXJuIHAuU3RyaW5nU2V0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0RSgpIE15VGVzdEVudW0geworCXJldHVybiBwLkUKK30KK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgUmVhZChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiBfLCBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCByZWFkIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlmb3IgeworCQlfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiAiLCBwLCBmaWVsZElkKSwgZXJyKQorCQl9CisJCWlmIGZpZWxkVHlwZUlkID09IFNUT1AgeworCQkJYnJlYWsKKwkJfQorCQlzd2l0Y2ggZmllbGRJZCB7CisJCWNhc2UgMToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDIoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMzoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDMoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNDoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDQoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDUoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDYoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNzoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDcoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgODoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDgoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgOToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDkoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMTA6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMChpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAxMToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDExKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDEyOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTIoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWRlZmF1bHQ6CisJCQlpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQm9vbCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAxOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5PbiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDIoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCeXRlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDI6ICIsIGVycikKKwl9IGVsc2UgeworCQl0ZW1wIDo9IGludDgodikKKwkJcC5CID0gdGVtcAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkxNigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAzOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5JbnQxNiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNDogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuSW50MzIgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ1KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTY0KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDU6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkludDY0ID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZERvdWJsZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA2OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5EID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA3OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5TdCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDgoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCaW5hcnkoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgODogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuQmluID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkOShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBtYXAgYmVnaW46ICIsIGVycikKKwl9CisJdE1hcCA6PSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCBzaXplKQorCXAuU3RyaW5nTWFwID0gdE1hcAorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2tleTAgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfa2V5MCA9IHYKKwkJfQorCQl2YXIgX3ZhbDEgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfdmFsMSA9IHYKKwkJfQorCQlwLlN0cmluZ01hcFtfa2V5MF0gPSBfdmFsMQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBtYXAgZW5kOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxMChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbGlzdCBiZWdpbjogIiwgZXJyKQorCX0KKwl0U2xpY2UgOj0gbWFrZShbXXN0cmluZywgMCwgc2l6ZSkKKwlwLlN0cmluZ0xpc3QgPSB0U2xpY2UKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9lbGVtMiBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV9lbGVtMiA9IHYKKwkJfQorCQlwLlN0cmluZ0xpc3QgPSBhcHBlbmQocC5TdHJpbmdMaXN0LCBfZWxlbTIpCisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMTEoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCisJfQorCXRTZXQgOj0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCBzaXplKQorCXAuU3RyaW5nU2V0ID0gdFNldAorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2VsZW0zIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX2VsZW0zID0gdgorCQl9CisJCXAuU3RyaW5nU2V0W19lbGVtM10gPSBzdHJ1Y3R7fXt9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU2V0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBlbmQ6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDEyKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDEyOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJdGVtcCA6PSBNeVRlc3RFbnVtKHYpCisJCXAuRSA9IHRlbXAKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJNeVRlc3RTdHJ1Y3QiKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQzKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDQob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ2KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDcob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkOChvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ5KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEwKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDExKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEyKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJ3cml0ZSBmaWVsZCBzdG9wIGVycm9yOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm9uIiwgQk9PTCwgMSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxOm9uOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCb29sKGJvb2wocC5PbikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQub24gKDEpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDE6b246ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJiIiwgQllURSwgMik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAyOmI6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJ5dGUoaW50OChwLkIpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmIgKDIpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDI6YjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQzKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDE2IiwgSTE2LCAzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDM6aW50MTY6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkxNihpbnQxNihwLkludDE2KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQxNiAoMykgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMzppbnQxNjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ0KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDMyIiwgSTMyLCA0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDQ6aW50MzI6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkludDMyKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQzMiAoNCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNDppbnQzMjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ1KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDY0IiwgSTY0LCA1KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDU6aW50NjQ6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUk2NChpbnQ2NChwLkludDY0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQ2NCAoNSkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNTppbnQ2NDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ2KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImQiLCBET1VCTEUsIDYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNjpkOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVEb3VibGUoZmxvYXQ2NChwLkQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmQgKDYpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDY6ZDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ3KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0IiwgU1RSSU5HLCA3KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDc6c3Q6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcocC5TdCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuc3QgKDcpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDc6c3Q6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkOChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCBTVFJJTkcsIDgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgODpiaW46ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJpbmFyeShwLkJpbik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5iaW4gKDgpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDg6YmluOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDkob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nTWFwIiwgTUFQLCA5KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDk6c3RyaW5nTWFwOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbihTVFJJTkcsIFNUUklORywgbGVuKHAuU3RyaW5nTWFwKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIG1hcCBiZWdpbjogIiwgZXJyKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBwLlN0cmluZ01hcCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcoaykpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgbWFwIGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDk6c3RyaW5nTWFwOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDEwKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0cmluZ0xpc3QiLCBMSVNULCAxMCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMDpzdHJpbmdMaXN0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdMaXN0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICIsIGVycikKKwl9CisJZm9yIF8sIHYgOj0gcmFuZ2UgcC5TdHJpbmdMaXN0IHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIGxpc3QgZW5kOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTA6c3RyaW5nTGlzdDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdHJpbmdTZXQiLCBTRVQsIDExKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDExOnN0cmluZ1NldDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdTZXQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCisJfQorCWZvciB2IDo9IHJhbmdlIHAuU3RyaW5nU2V0IHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDExOnN0cmluZ1NldDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJlIiwgSTMyLCAxMik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMjplOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5FKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5lICgxMikgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTI6ZTogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFN0cmluZygpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIjxuaWw+IgorCX0KKwlyZXR1cm4gZm10LlNwcmludGYoIk15VGVzdFN0cnVjdCglK3YpIiwgKnApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTNmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbwpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK3R5cGUgVFNlcnZlciBpbnRlcmZhY2UgeworCVByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeQorCVNlcnZlclRyYW5zcG9ydCgpIFRTZXJ2ZXJUcmFuc3BvcnQKKwlJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQorCU91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQorCUlucHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeQorCU91dHB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkKKworCS8vIFN0YXJ0cyB0aGUgc2VydmVyCisJU2VydmUoKSBlcnJvcgorCS8vIFN0b3BzIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgb3B0aW9uYWwgb24gYSBwZXItaW1wbGVtZW50YXRpb24gYmFzaXMuIE5vdAorCS8vIGFsbCBzZXJ2ZXJzIGFyZSByZXF1aXJlZCB0byBiZSBjbGVhbmx5IHN0b3BwYWJsZS4KKwlTdG9wKCkgZXJyb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQyNGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJIm5ldCIKKwkic3luYyIKKwkidGltZSIKKykKKwordHlwZSBUU2VydmVyU29ja2V0IHN0cnVjdCB7CisJbGlzdGVuZXIgICAgICBuZXQuTGlzdGVuZXIKKwlhZGRyICAgICAgICAgIG5ldC5BZGRyCisJY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uCisKKwkvLyBQcm90ZWN0cyB0aGUgaW50ZXJydXB0ZWQgdmFsdWUgdG8gbWFrZSBpdCB0aHJlYWQgc2FmZS4KKwltdSAgICAgICAgICBzeW5jLlJXTXV0ZXgKKwlpbnRlcnJ1cHRlZCBib29sCit9CisKK2Z1bmMgTmV3VFNlcnZlclNvY2tldChsaXN0ZW5BZGRyIHN0cmluZykgKCpUU2VydmVyU29ja2V0LCBlcnJvcikgeworCXJldHVybiBOZXdUU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyLCAwKQorfQorCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIgc3RyaW5nLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBsaXN0ZW5BZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9LCBuaWwKK30KKworLy8gQ3JlYXRlcyBhIFRTZXJ2ZXJTb2NrZXQgZnJvbSBhIG5ldC5BZGRyCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNlcnZlclNvY2tldCB7CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9Cit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIExpc3RlbigpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gbmlsCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLmxpc3RlbmVyID0gbAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcC5tdS5STG9jaygpCisJaW50ZXJydXB0ZWQgOj0gcC5pbnRlcnJ1cHRlZAorCXAubXUuUlVubG9jaygpCisKKwlpZiBpbnRlcnJ1cHRlZCB7CisJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCisJfQorCisJcC5tdS5Mb2NrKCkKKwlsaXN0ZW5lciA6PSBwLmxpc3RlbmVyCisJcC5tdS5VbmxvY2soKQorCWlmIGxpc3RlbmVyID09IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQorCX0KKworCWNvbm4sIGVyciA6PSBsaXN0ZW5lci5BY2NlcHQoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiwgcC5jbGllbnRUaW1lb3V0KSwgbmlsCit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgorZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSXNMaXN0ZW5pbmcoKSBib29sIHsKKwlyZXR1cm4gcC5saXN0ZW5lciAhPSBuaWwKK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgbCwgZXJyIDo9IG5ldC5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlwLmxpc3RlbmVyID0gbAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7CisJaWYgcC5saXN0ZW5lciAhPSBuaWwgeworCQlyZXR1cm4gcC5saXN0ZW5lci5BZGRyKCkKKwl9CisJcmV0dXJuIHAuYWRkcgorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJcC5tdS5Mb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQllcnIgPSBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJcC5saXN0ZW5lciA9IG5pbAorCX0KKwlwLm11LlVubG9jaygpCisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlwLmludGVycnVwdGVkID0gdHJ1ZQorCXAubXUuVW5sb2NrKCkKKwlwLkNsb3NlKCkKKworCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZm10IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RTb2NrZXRJc250TGlzdGVuaW5nQWZ0ZXJJbnRlcnJ1cHQodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlzb2NrZXQuTGlzdGVuKCkKKwlzb2NrZXQuSW50ZXJydXB0KCkKKworCW5ld1NvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwllcnIgOj0gbmV3U29ja2V0Lkxpc3RlbigpCisJZGVmZXIgbmV3U29ja2V0LkludGVycnVwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gcmViaW5kczogJXMiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RTb2NrZXRDb25jdXJyZW5jeSh0ICp0ZXN0aW5nLlQpIHsKKwlob3N0IDo9ICIxMjcuMC4wLjEiCisJcG9ydCA6PSA5MDkwCisJYWRkciA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJc29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCWdvIGZ1bmMoKSB7IHNvY2tldC5MaXN0ZW4oKSB9KCkKKwlnbyBmdW5jKCkgeyBzb2NrZXQuSW50ZXJydXB0KCkgfSgpCit9CisKK2Z1bmMgQ3JlYXRlU2VydmVyU29ja2V0KHQgKnRlc3RpbmcuVCwgYWRkciBzdHJpbmcpICpUU2VydmVyU29ja2V0IHsKKwlzb2NrZXQsIGVyciA6PSBOZXdUU2VydmVyU29ja2V0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQ6ICVzIiwgZXJyKQorCX0KKwlyZXR1cm4gc29ja2V0Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFmNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdE5vdGhpbmcodCAqdGVzdGluZy5UKSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM0MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gU2VydmVyIHRyYW5zcG9ydC4gT2JqZWN0IHdoaWNoIHByb3ZpZGVzIGNsaWVudCB0cmFuc3BvcnRzLgordHlwZSBUU2VydmVyVHJhbnNwb3J0IGludGVyZmFjZSB7CisJTGlzdGVuKCkgZXJyb3IKKwlBY2NlcHQoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2UoKSBlcnJvcgorCisJLy8gT3B0aW9uYWwgbWV0aG9kIGltcGxlbWVudGF0aW9uLiBUaGlzIHNpZ25hbHMgdG8gdGhlIHNlcnZlciB0cmFuc3BvcnQKKwkvLyB0aGF0IGl0IHNob3VsZCBicmVhayBvdXQgb2YgYW55IGFjY2VwdCgpIG9yIGxpc3RlbigpIHRoYXQgaXQgaXMgY3VycmVudGx5CisJLy8gYmxvY2tlZCBvbi4gVGhpcyBtZXRob2QsIGlmIGltcGxlbWVudGVkLCBNVVNUIGJlIHRocmVhZCBzYWZlLCBhcyBpdCBtYXkKKwkvLyBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgY29udGV4dCB0aGFuIHRoZSBvdGhlciBUU2VydmVyVHJhbnNwb3J0CisJLy8gbWV0aG9kcy4KKwlJbnRlcnJ1cHQoKSBlcnJvcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxMzM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJlbmNvZGluZy9qc29uIgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorCSJzdHJjb252IgorKQorCit0eXBlIF9QYXJzZUNvbnRleHQgaW50CisKK2NvbnN0ICgKKwlfQ09OVEVYVF9JTl9UT1BMRVZFTCAgICAgICAgICBfUGFyc2VDb250ZXh0ID0gMQorCV9DT05URVhUX0lOX0xJU1RfRklSU1QgICAgICAgIF9QYXJzZUNvbnRleHQgPSAyCisJX0NPTlRFWFRfSU5fTElTVCAgICAgICAgICAgICAgX1BhcnNlQ29udGV4dCA9IDMKKwlfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QgICAgICBfUGFyc2VDb250ZXh0ID0gNAorCV9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSAgIF9QYXJzZUNvbnRleHQgPSA1CisJX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUgX1BhcnNlQ29udGV4dCA9IDYKKykKKworZnVuYyAocCBfUGFyc2VDb250ZXh0KSBTdHJpbmcoKSBzdHJpbmcgeworCXN3aXRjaCBwIHsKKwljYXNlIF9DT05URVhUX0lOX1RPUExFVkVMOgorCQlyZXR1cm4gIlRPUExFVkVMIgorCWNhc2UgX0NPTlRFWFRfSU5fTElTVF9GSVJTVDoKKwkJcmV0dXJuICJMSVNULUZJUlNUIgorCWNhc2UgX0NPTlRFWFRfSU5fTElTVDoKKwkJcmV0dXJuICJMSVNUIgorCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgorCQlyZXR1cm4gIk9CSkVDVC1GSVJTVCIKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcmV0dXJuICJPQkpFQ1QtTkVYVC1LRVkiCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcmV0dXJuICJPQkpFQ1QtTkVYVC1WQUxVRSIKKwl9CisJcmV0dXJuICJVTktOT1dOLVBBUlNFLUNPTlRFWFQiCit9CisKKy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKy8vCisvLyBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKKy8vIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCisvLyBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCisvLwordHlwZSBUU2ltcGxlSlNPTlByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgVFRyYW5zcG9ydAorCisJcGFyc2VDb250ZXh0U3RhY2sgW11pbnQKKwlkdW1wQ29udGV4dCAgICAgICBbXWludAorCisJd3JpdGVyICpidWZpby5Xcml0ZXIKKwlyZWFkZXIgKmJ1ZmlvLlJlYWRlcgorfQorCisvLyBDb25zdHJ1Y3RvcgorZnVuYyBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRTaW1wbGVKU09OUHJvdG9jb2wgeworCXYgOj0gJlRTaW1wbGVKU09OUHJvdG9jb2x7dHJhbnM6IHQsCisJCXdyaXRlcjogYnVmaW8uTmV3V3JpdGVyKHQpLAorCQlyZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcih0KSwKKwl9CisJdi5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZCh2LnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXYuZHVtcENvbnRleHQgPSBhcHBlbmQodi5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKKwlyZXR1cm4gdgorfQorCisvLyBGYWN0b3J5Cit0eXBlIFRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorfQorCitmdW5jIE5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5e30KK30KKwordmFyICgKKwlKU09OX0NPTU1BICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fQ09MT04gICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9MQlJBQ0UgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1JCUkFDRSAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTEJSQUNLRVQgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9SQlJBQ0tFVCAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1FVT1RFICAgICAgICAgICAgICAgICAgIGJ5dGUKKwlKU09OX1FVT1RFX0JZVEVTICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTlVMTCAgICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9UUlVFICAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0ZBTFNFICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fSU5GSU5JVFkgICAgICAgICAgICAgICAgc3RyaW5nCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWSAgICAgICBzdHJpbmcKKwlKU09OX05BTiAgICAgICAgICAgICAgICAgICAgIHN0cmluZworCUpTT05fSU5GSU5JVFlfQllURVMgICAgICAgICAgW11ieXRlCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWV9CWVRFUyBbXWJ5dGUKKwlKU09OX05BTl9CWVRFUyAgICAgICAgICAgICAgIFtdYnl0ZQorCWpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyAgW11ieXRlCispCisKK2Z1bmMgaW5pdCgpIHsKKwlKU09OX0NPTU1BID0gW11ieXRleycsJ30KKwlKU09OX0NPTE9OID0gW11ieXRleyc6J30KKwlKU09OX0xCUkFDRSA9IFtdYnl0ZXsneyd9CisJSlNPTl9SQlJBQ0UgPSBbXWJ5dGV7J30nfQorCUpTT05fTEJSQUNLRVQgPSBbXWJ5dGV7J1snfQorCUpTT05fUkJSQUNLRVQgPSBbXWJ5dGV7J10nfQorCUpTT05fUVVPVEUgPSAnIicKKwlKU09OX1FVT1RFX0JZVEVTID0gW11ieXRleyciJ30KKwlKU09OX05VTEwgPSBbXWJ5dGV7J24nLCAndScsICdsJywgJ2wnfQorCUpTT05fVFJVRSA9IFtdYnl0ZXsndCcsICdyJywgJ3UnLCAnZSd9CisJSlNPTl9GQUxTRSA9IFtdYnl0ZXsnZicsICdhJywgJ2wnLCAncycsICdlJ30KKwlKU09OX0lORklOSVRZID0gIkluZmluaXR5IgorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFkgPSAiLUluZmluaXR5IgorCUpTT05fTkFOID0gIk5hTiIKKwlKU09OX0lORklOSVRZX0JZVEVTID0gW11ieXRleydJJywgJ24nLCAnZicsICdpJywgJ24nLCAnaScsICd0JywgJ3knfQorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFlfQllURVMgPSBbXWJ5dGV7Jy0nLCAnSScsICduJywgJ2YnLCAnaScsICduJywgJ2knLCAndCcsICd5J30KKwlKU09OX05BTl9CWVRFUyA9IFtdYnl0ZXsnTicsICdhJywgJ04nfQorCWpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyA9IFtdYnl0ZXsnXScsICcsJywgJ1snfQorfQorCitmdW5jIGpzb25RdW90ZShzIHN0cmluZykgc3RyaW5nIHsKKwliLCBfIDo9IGpzb24uTWFyc2hhbChzKQorCXMxIDo9IHN0cmluZyhiKQorCXJldHVybiBzMQorfQorCitmdW5jIGpzb25VbnF1b3RlKHMgc3RyaW5nKSAoc3RyaW5nLCBib29sKSB7CisJczEgOj0gbmV3KHN0cmluZykKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCBzMSkKKwlyZXR1cm4gKnMxLCBlcnIgPT0gbmlsCit9CisKK2Z1bmMgbWlzbWF0Y2goZXhwZWN0ZWQsIGFjdHVhbCBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gZm10LkVycm9yZigiRXhwZWN0ZWQgJyVzJyBidXQgZm91bmQgJyVzJyB3aGlsZSBwYXJzaW5nIEpTT04uIiwgZXhwZWN0ZWQsIGFjdHVhbCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwkvL3JldHVybiBwLk91dHB1dExpc3RFbmQoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGtleVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodmFsdWVUeXBlKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQm9vbChiIGJvb2wpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRCb29sKGIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRGNjQodikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywKKwkvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKKwkvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKKwkvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKKy8vIFJlYWRpbmcgbWV0aG9kcy4KK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBuYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJYlR5cGVJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiVHlwZUlkKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHNlcUlkLCBlcnIgPSBwLlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCV8sIGVyciA9IHAuUGFyc2VPYmplY3RTdGFydCgpCisJcmV0dXJuICIiLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgVFR5cGUsIGludDE2LCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgMCwgZXJyCisJfQorCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgeworCQlzd2l0Y2ggYlswXSB7CisJCWNhc2UgSlNPTl9SQlJBQ0VbMF06CisJCQlyZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAorCQljYXNlIEpTT05fUVVPVEU6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQluYW1lLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQorCQkJLy8gc2ltcGxlanNvbiBpcyBub3QgbWVhbnQgdG8gYmUgcmVhZCBiYWNrIGludG8gdGhyaWZ0CisJCQkvLyAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKwkJCS8vIC0gdXNlIEpTT04gaW5zdGVhZAorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJfQorCQkJcmV0dXJuIG5hbWUsIFNUT1AsIC0xLCBwLlBhcnNlUG9zdFZhbHVlKCkKKwkJCS8qCisJCQkgICBpZiBlcnIgPSBwLlBhcnNlUG9zdFZhbHVlKCk7IGVyciAhPSBuaWwgeworCQkJICAgICByZXR1cm4gbmFtZSwgU1RPUCwgMCwgZXJyCisJCQkgICB9CisJCQkgICBpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJICAgfQorCQkJICAgYlR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwkJCSAgIHRoZXR5cGUgOj0gVFR5cGUoYlR5cGUpCisJCQkgICBpZiBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIDAsIGVycgorCQkJICAgfQorCQkJICAgaWQsIGVyciA6PSBwLlJlYWRJMTYoKQorCQkJICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIGlkLCBlcnIKKwkJCSovCisJCX0KKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIn1cIiBvciAnXCInLCBidXQgZm91bmQ6ICclcyciLCBzdHJpbmcoYikpCisJCXJldHVybiAiIiwgU1RPUCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gIiIsIFNUT1AsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihpby5FT0YpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCisJLy9yZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCBWT0lELCAwLCBlCisJfQorCisJLy8gcmVhZCBrZXlUeXBlCisJYktleVR5cGUsIGUgOj0gcC5SZWFkQnl0ZSgpCisJa2V5VHlwZSA9IFRUeXBlKGJLZXlUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgdmFsdWVUeXBlCisJYlZhbHVlVHlwZSwgZSA6PSBwLlJlYWRCeXRlKCkKKwl2YWx1ZVR5cGUgPSBUVHlwZShiVmFsdWVUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgc2l6ZQorCWlTaXplLCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KGlTaXplKQorCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCXJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwl2YXIgdmFsdWUgYm9vbAorCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIHZhbHVlLCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCB7CisJCXN3aXRjaCBmWzBdIHsKKwkJY2FzZSBKU09OX1RSVUVbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9UUlVFKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fVFJVRSkgeworCQkJCXZhbHVlID0gdHJ1ZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwidHJ1ZVwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlicmVhaworCQljYXNlIEpTT05fRkFMU0VbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9GQUxTRSkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQorCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX0ZBTFNFKSB7CisJCQkJdmFsdWUgPSBmYWxzZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwiZmFsc2VcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnJlYWsKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJCXZhbHVlID0gZmFsc2UKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIm51bGxcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcInRydWVcIiwgXCJmYWxzZVwiLCBvciBcIm51bGxcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGYpKQorCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJcmV0dXJuIHZhbHVlLCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlSTY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUY2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwl2YXIgdiBzdHJpbmcKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdiwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXZhciB2IFtdYnl0ZQorCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLndyaXRlci5GbHVzaCgpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAudHJhbnMKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0UHJlVmFsdWUoKSBlcnJvciB7CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0NPTU1BKTsgZSAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fQ09MT04pOyBlICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRQb3N0VmFsdWUoKSBlcnJvciB7CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX0xJU1QpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXZhciB2IHN0cmluZworCWlmIHZhbHVlIHsKKwkJdiA9IHN0cmluZyhKU09OX1RSVUUpCisJfSBlbHNlIHsKKwkJdiA9IHN0cmluZyhKU09OX0ZBTFNFKQorCX0KKwlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXYgPSBqc29uUXVvdGUodikKKwlkZWZhdWx0OgorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXROdWxsKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX05VTEwpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0RjY0KHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2YXIgdiBzdHJpbmcKKwlpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX05BTiArIHN0cmluZyhKU09OX1FVT1RFKQorCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX0lORklOSVRZICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX05FR0FUSVZFX0lORklOSVRZICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIHsKKwkJdiA9IHN0cmNvbnYuRm9ybWF0RmxvYXQodmFsdWUsICdnJywgLTEsIDY0KQorCQlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCQljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQkJdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIHYgKyBzdHJpbmcoSlNPTl9RVU9URSkKKwkJZGVmYXVsdDoKKwkJfQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRJNjQodmFsdWUgaW50NjQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2IDo9IHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkKKwlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXYgPSBqc29uUXVvdGUodikKKwlkZWZhdWx0OgorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRTdHJpbmcocyBzdHJpbmcpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YShqc29uUXVvdGUocykpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZ0RhdGEocyBzdHJpbmcpIGVycm9yIHsKKwlfLCBlIDo9IHAud3JpdGUoW11ieXRlKHMpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0QmVnaW4oKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNFKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RFbmQoKSBlcnJvciB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUkJSQUNFKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwlpZiBlIDo9IHAuT3V0cHV0UG9zdFZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0QmVnaW4oKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNLRVQpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0RW5kKCkgZXJyb3IgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwlpZiBlIDo9IHAuT3V0cHV0UG9zdFZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VQcmVWYWx1ZSgpIGVycm9yIHsKKwlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pCisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUOgorCQlpZiBsZW4oYikgPiAwIHsKKwkJCXN3aXRjaCBiWzBdIHsKKwkJCWNhc2UgSlNPTl9SQlJBQ0tFVFswXToKKwkJCQlyZXR1cm4gbmlsCisJCQljYXNlIEpTT05fQ09NTUFbMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJdXCIgb3IgXCIsXCIgaW4gbGlzdCBjb250ZXh0LCBidXQgZm91bmQgXCIlc1wiIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCX0KKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fUkJSQUNFWzBdOgorCQkJCXJldHVybiBuaWwKKwkJCWNhc2UgSlNPTl9DT01NQVswXToKKwkJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQkJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCXJldHVybiBuaWwKKwkJCWRlZmF1bHQ6CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIn1cIiBvciBcIixcIiBpbiBvYmplY3QgY29udGV4dCwgYnV0IGZvdW5kIFwiJXNcIiIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fQ09MT05bMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCI6XCIgaW4gb2JqZWN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiVzXCIiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUG9zdFZhbHVlKCkgZXJyb3IgeworCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlzd2l0Y2ggY3h0IHsKKwljYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6CisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fTElTVCkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKSBlcnJvciB7CisJZm9yIHsKKwkJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJCWlmIGxlbihiKSA8IDEgeworCQkJcmV0dXJuIG5pbAorCQl9CisJCXN3aXRjaCBiWzBdIHsKKwkJY2FzZSAnICcsICdccicsICdcbicsICdcdCc6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQljb250aW51ZQorCQlkZWZhdWx0OgorCQkJYnJlYWsKKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlU3RyaW5nQm9keSgpIChzdHJpbmcsIGVycm9yKSB7CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9RVU9URSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsIDo9IGxlbihsaW5lKQorCS8vIGNvdW50IG51bWJlciBvZiBlc2NhcGVzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGtlZXAgZ29pbmcKKwlpIDo9IDEKKwlmb3IgOyBpIDwgbDsgaSsrIHsKKwkJaWYgbGluZVtsLWktMV0gIT0gJ1xcJyB7CisJCQlicmVhaworCQl9CisJfQorCWlmIGkmMHgwMSA9PSAxIHsKKwkJdiwgb2sgOj0ganNvblVucXVvdGUoc3RyaW5nKEpTT05fUVVPVEUpICsgbGluZSkKKwkJaWYgIW9rIHsKKwkJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlyZXR1cm4gdiwgbmlsCisJfQorCXMsIGVyciA6PSBwLlBhcnNlUXVvdGVkU3RyaW5nQm9keSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJc3RyIDo9IHN0cmluZyhKU09OX1FVT1RFKSArIGxpbmUgKyBzCisJdiwgb2sgOj0ganNvblVucXVvdGUoc3RyKQorCWlmICFvayB7CisJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIGFzIEpTT04gc3RyaW5nICVzIiwgc3RyKQorCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVF1b3RlZFN0cmluZ0JvZHkoKSAoc3RyaW5nLCBlcnJvcikgeworCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJbCA6PSBsZW4obGluZSkKKwkvLyBjb3VudCBudW1iZXIgb2YgZXNjYXBlcyB0byBzZWUgaWYgd2UgbmVlZCB0byBrZWVwIGdvaW5nCisJaSA6PSAxCisJZm9yIDsgaSA8IGw7IGkrKyB7CisJCWlmIGxpbmVbbC1pLTFdICE9ICdcXCcgeworCQkJYnJlYWsKKwkJfQorCX0KKwlpZiBpJjB4MDEgPT0gMSB7CisJCXJldHVybiBsaW5lLCBuaWwKKwl9CisJcywgZXJyIDo9IHAuUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwl2IDo9IGxpbmUgKyBzCisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZEJ5dGVzKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBsaW5lLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsaW5lMiA6PSBsaW5lWzAgOiBsZW4obGluZSktMV0KKwlsIDo9IGxlbihsaW5lMikKKwlpZiAobCAlIDQpICE9IDAgeworCQlwYWQgOj0gNCAtIChsICUgNCkKKwkJZmlsbCA6PSBbLi4uXWJ5dGV7Jz0nLCAnPScsICc9J30KKwkJbGluZTIgPSBhcHBlbmQobGluZTIsIGZpbGxbOnBhZF0uLi4pCisJCWwgPSBsZW4obGluZTIpCisJfQorCW91dHB1dCA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZWRMZW4obCkpCisJbiwgZXJyIDo9IGJhc2U2NC5TdGRFbmNvZGluZy5EZWNvZGUob3V0cHV0LCBsaW5lMikKKwlyZXR1cm4gb3V0cHV0WzA6bl0sIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlSTY0KCkgKGludDY0LCBib29sLCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBmYWxzZSwgZXJyCisJfQorCXZhciB2YWx1ZSBpbnQ2NAorCXZhciBpc251bGwgYm9vbAorCWlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcC5yZWFkZXIuUmVhZChtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpKQorCQlpc251bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJbnVtLCBlcnIgOj0gcC5yZWFkTnVtZXJpYygpCisJCWlzbnVsbCA9IChudW0gPT0gbmlsKQorCQlpZiAhaXNudWxsIHsKKwkJCXZhbHVlID0gbnVtLkludDY0KCkKKwkJfQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRjY0KCkgKGZsb2F0NjQsIGJvb2wsIGVycm9yKSB7CisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGZhbHNlLCBlcnIKKwl9CisJdmFyIHZhbHVlIGZsb2F0NjQKKwl2YXIgaXNudWxsIGJvb2wKKwlpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXAucmVhZGVyLlJlYWQobWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKSkKKwkJaXNudWxsID0gdHJ1ZQorCX0gZWxzZSB7CisJCW51bSwgZXJyIDo9IHAucmVhZE51bWVyaWMoKQorCQlpc251bGwgPSAobnVtID09IG5pbCkKKwkJaWYgIWlzbnVsbCB7CisJCQl2YWx1ZSA9IG51bS5GbG9hdDY0KCkKKwkJfQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlT2JqZWN0U3RhcnQoKSAoYm9vbCwgZXJyb3IpIHsKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwl2YXIgYiBbXWJ5dGUKKwliLCBlcnIgOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwlpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9MQlJBQ0VbMF0geworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCisJCXJldHVybiBmYWxzZSwgbmlsCisJfSBlbHNlIGlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcmV0dXJuIHRydWUsIG5pbAorCX0KKwllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkICd7JyBvciBudWxsLCBidXQgZm91bmQgJyVzJyIsIHN0cmluZyhiKSkKKwlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VPYmplY3RFbmQoKSBlcnJvciB7CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiAoY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkgJiYgKGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCB0byBiZSBpbiB0aGUgT2JqZWN0IENvbnRleHQsIGJ1dCBub3QgaW4gT2JqZWN0IENvbnRleHQgKCVkKSIsIGN4dCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0VbMF0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlmb3IgXywgY2hhciA6PSByYW5nZSBsaW5lIHsKKwkJc3dpdGNoIGNoYXIgeworCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RpbmcgZW5kIG9mIG9iamVjdCBcIn1cIiwgYnV0IGZvdW5kOiBcIiVzXCIiLCBsaW5lKQorCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCcsICd9JzoKKwkJCWJyZWFrCisJCX0KKwl9CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCXJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VMaXN0QmVnaW4oKSAoaXNOdWxsIGJvb2wsIGVyciBlcnJvcikgeworCWlmIGUgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlCisJfQorCXZhciBiIFtdYnl0ZQorCWIsIGVyciA9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnIKKwl9CisJaWYgbGVuKGIpID49IDEgJiYgYlswXSA9PSBKU09OX0xCUkFDS0VUWzBdIHsKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJaXNOdWxsID0gZmFsc2UKKwl9IGVsc2UgaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlpc051bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJZXJyID0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJudWxsXCIgb3IgXCJbXCIsIHJlY2VpdmVkICVxIiwgYikKKwl9CisJcmV0dXJuIGlzTnVsbCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwliRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwllbGVtVHlwZSA9IFRUeXBlKGJFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUxpc3RFbmQoKSBlcnJvciB7CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiBjeHQgIT0gX0NPTlRFWFRfSU5fTElTVCB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIExpc3QgQ29udGV4dCwgYnV0IG5vdCBpbiBMaXN0IENvbnRleHQgKCVkKSIsIGN4dCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0tFVFswXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWZvciBfLCBjaGFyIDo9IHJhbmdlIGxpbmUgeworCQlzd2l0Y2ggY2hhciB7CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGluZyBlbmQgb2YgbGlzdCBcIl1cIiwgYnV0IGZvdW5kOiBcIiV2XCIiLCBsaW5lKQorCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCcsIHJ1bmUoSlNPTl9SQlJBQ0tFVFswXSk6CisJCQlicmVhaworCQl9CisJfQorCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwlpZiBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKSA9PSBfQ09OVEVYVF9JTl9UT1BMRVZFTCB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkU2luZ2xlVmFsdWUoKSAoaW50ZXJmYWNle30sIFRUeXBlLCBlcnJvcikgeworCWUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwliLCBlIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oYikgPiAwIHsKKwkJYyA6PSBiWzBdCisJCXN3aXRjaCBjIHsKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX05VTEwpICE9IHN0cmluZyhidWYpIHsKKwkJCQllID0gbWlzbWF0Y2goc3RyaW5nKEpTT05fTlVMTCksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCXJldHVybiBuaWwsIFZPSUQsIG5pbAorCQljYXNlIEpTT05fUVVPVEU6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQl2LCBlIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gdiwgVVRGOCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQl9CisJCQlpZiB2ID09IEpTT05fSU5GSU5JVFkgeworCQkJCXJldHVybiBJTkZJTklUWSwgRE9VQkxFLCBuaWwKKwkJCX0gZWxzZSBpZiB2ID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXJldHVybiBORUdBVElWRV9JTkZJTklUWSwgRE9VQkxFLCBuaWwKKwkJCX0gZWxzZSBpZiB2ID09IEpTT05fTkFOIHsKKwkJCQlyZXR1cm4gTkFOLCBET1VCTEUsIG5pbAorCQkJfQorCQkJcmV0dXJuIHYsIFVURjgsIG5pbAorCQljYXNlIEpTT05fVFJVRVswXToKKwkJCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fVFJVRSkpCisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiB0cnVlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX1RSVUUpICE9IHN0cmluZyhidWYpIHsKKwkJCQllIDo9IG1pc21hdGNoKHN0cmluZyhKU09OX1RSVUUpLCBzdHJpbmcoYnVmKSkKKwkJCQlyZXR1cm4gdHJ1ZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIHRydWUsIEJPT0wsIG5pbAorCQljYXNlIEpTT05fRkFMU0VbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0ZBTFNFKSkKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWYpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX0ZBTFNFKSAhPSBzdHJpbmcoYnVmKSB7CisJCQkJZSA6PSBtaXNtYXRjaChzdHJpbmcoSlNPTl9GQUxTRSksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiBmYWxzZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBuaWwKKwkJY2FzZSBKU09OX0xCUkFDS0VUWzBdOgorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQlyZXR1cm4gbWFrZShbXWludGVyZmFjZXt9LCAwKSwgTElTVCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCWNhc2UgSlNPTl9MQlJBQ0VbMF06CisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCXJldHVybiBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pLCBTVFJVQ1QsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQljYXNlICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2UnLCAnRScsICcuJywgJysnLCAnLScsIEpTT05fSU5GSU5JVFlbMF0sIEpTT05fTkFOWzBdOgorCQkJLy8gYXNzdW1lIG51bWVyaWMKKwkJCXYsIGUgOj0gcC5yZWFkTnVtZXJpYygpCisJCQlyZXR1cm4gdiwgRE9VQkxFLCBlCisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGVsZW1lbnQgaW4gbGlzdCBidXQgZm91bmQgJyVzJyB3aGlsZSBwYXJzaW5nIEpTT04uIiwgc3RyaW5nKGMpKQorCQkJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfQorCWUgPSBmbXQuRXJyb3JmKCJDYW5ub3QgcmVhZCBhIHNpbmdsZSBlbGVtZW50IHdoaWxlIHBhcnNpbmcgSlNPTi4iKQorCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKworfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkSWZOdWxsKCkgKGJvb2wsIGVycm9yKSB7CisJY29udCA6PSB0cnVlCisJZm9yIGNvbnQgeworCQliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwkJaWYgbGVuKGIpIDwgMSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9CisJCXN3aXRjaCBiWzBdIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCWNhc2UgSlNPTl9OVUxMWzBdOgorCQkJY29udCA9IGZhbHNlCisJCQlicmVhaworCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JzoKKwkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlwLnJlYWRlci5SZWFkKG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkpCisJCXJldHVybiB0cnVlLCBuaWwKKwl9CisJcmV0dXJuIGZhbHNlLCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZFF1b3RlSWZOZXh0KCkgeworCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZE51bWVyaWMoKSAoTnVtZXJpYywgZXJyb3IpIHsKKwlpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKQorCWlmIGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgZXJyCisJfQorCWhhc0RlY2ltYWxQb2ludCA6PSBmYWxzZQorCW5leHRDYW5CZVNpZ24gOj0gdHJ1ZQorCWhhc0UgOj0gZmFsc2UKKwlNQVhfTEVOIDo9IDQwCisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgTUFYX0xFTikpCisJY29udGludWVGb3IgOj0gdHJ1ZQorCWluUXVvdGVzIDo9IGZhbHNlCisJZm9yIGNvbnRpbnVlRm9yIHsKKwkJYywgZXJyIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlpZiBlcnIgPT0gaW8uRU9GIHsKKwkJCQlicmVhaworCQkJfQorCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlzd2l0Y2ggYyB7CisJCWNhc2UgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknOgorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJbmV4dENhbkJlU2lnbiA9IGZhbHNlCisJCWNhc2UgJy4nOgorCQkJaWYgaGFzRGVjaW1hbFBvaW50IHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBtdWx0aXBsZSBkZWNpbWFsIHBvaW50cyAnJXMuJyIsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlpZiBoYXNFIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBkZWNpbWFsIHBvaW50cyBpbiB0aGUgZXhwb25lbnQgJyVzLiciLCBidWYuU3RyaW5nKCkpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJaGFzRGVjaW1hbFBvaW50LCBuZXh0Q2FuQmVTaWduID0gdHJ1ZSwgZmFsc2UKKwkJY2FzZSAnZScsICdFJzoKKwkJCWlmIGhhc0UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciB3aXRoIG11bHRpcGxlIGV4cG9uZW50cyAnJXMlYyciLCBidWYuU3RyaW5nKCksIGMpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJaGFzRSwgbmV4dENhbkJlU2lnbiA9IHRydWUsIHRydWUKKwkJY2FzZSAnLScsICcrJzoKKwkJCWlmICFuZXh0Q2FuQmVTaWduIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIk5lZ2F0aXZlIHNpZ24gd2l0aGluIG51bWJlciIpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJbmV4dENhbkJlU2lnbiA9IGZhbHNlCisJCWNhc2UgJyAnLCAwLCAnXHQnLCAnXG4nLCAnXHInLCBKU09OX1JCUkFDRVswXSwgSlNPTl9SQlJBQ0tFVFswXSwgSlNPTl9DT01NQVswXSwgSlNPTl9DT0xPTlswXToKKwkJCXAucmVhZGVyLlVucmVhZEJ5dGUoKQorCQkJY29udGludWVGb3IgPSBmYWxzZQorCQljYXNlIEpTT05fTkFOWzBdOgorCQkJaWYgYnVmLkxlbigpID09IDAgeworCQkJCWJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTkFOKSkKKwkJCQlidWZmZXJbMF0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9OQU4gIT0gc3RyaW5nKGJ1ZmZlcikgeworCQkJCQllIDo9IG1pc21hdGNoKEpTT05fTkFOLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIE5BTiwgbmlsCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBzdGFydGluZyB3aXRoIGNoYXJhY3RlciAnJWMnIiwgYykKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWNhc2UgSlNPTl9JTkZJTklUWVswXToKKwkJCWlmIGJ1Zi5MZW4oKSA9PSAwIHx8IChidWYuTGVuKCkgPT0gMSAmJiBidWYuQnl0ZXMoKVswXSA9PSAnKycpIHsKKwkJCQlidWZmZXIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0lORklOSVRZKSkKKwkJCQlidWZmZXJbMF0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9JTkZJTklUWSAhPSBzdHJpbmcoYnVmZmVyKSB7CisJCQkJCWUgOj0gbWlzbWF0Y2goSlNPTl9JTkZJTklUWSwgc3RyaW5nKGJ1ZmZlcikpCisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCQl9CisJCQkJaWYgaW5RdW90ZXMgeworCQkJCQlwLnJlYWRRdW90ZUlmTmV4dCgpCisJCQkJfQorCQkJCXJldHVybiBJTkZJTklUWSwgbmlsCisJCQl9IGVsc2UgaWYgYnVmLkxlbigpID09IDEgJiYgYnVmLkJ5dGVzKClbMF0gPT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXSB7CisJCQkJYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQkJYnVmZmVyWzBdID0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXQorCQkJCWJ1ZmZlclsxXSA9IGMKKwkJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmZmVyWzI6XSkKKwkJCQlpZiBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlpZiBKU09OX05FR0FUSVZFX0lORklOSVRZICE9IHN0cmluZyhidWZmZXIpIHsKKwkJCQkJZSA6PSBtaXNtYXRjaChKU09OX05FR0FUSVZFX0lORklOSVRZLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZLCBuaWwKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYycgZHVlIHRvIGV4aXN0aW5nIGJ1ZmZlciAlcyIsIGMsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWNhc2UgSlNPTl9RVU9URToKKwkJCWlmICFpblF1b3RlcyB7CisJCQkJaW5RdW90ZXMgPSB0cnVlCisJCQl9IGVsc2UgeworCQkJCWJyZWFrCisJCQl9CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyIsIGMpCisJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJaWYgYnVmLkxlbigpID09IDAgeworCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgZnJvbSBlbXB0eSBzdHJpbmcgJyciKQorCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiBOZXdOdW1lcmljRnJvbUpTT05TdHJpbmcoYnVmLlN0cmluZygpLCBmYWxzZSksIG5pbAorfQorCisvLyBTYWZlbHkgcGVla3MgaW50byB0aGUgYnVmZmVyLCByZWFkaW5nIG9ubHkgd2hhdCBpcyBuZWNlc3NhcnkKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHNhZmVQZWVrQ29udGFpbnMoYiBbXWJ5dGUpIGJvb2wgeworCWZvciBpIDo9IDA7IGkgPCBsZW4oYik7IGkrKyB7CisJCWEsIF8gOj0gcC5yZWFkZXIuUGVlayhpICsgMSkKKwkJaWYgbGVuKGEpID09IDAgfHwgYVtpXSAhPSBiW2ldIHsKKwkJCXJldHVybiBmYWxzZQorCQl9CisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVzZXRDb250ZXh0U3RhY2soKSB7CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9CisJcC5kdW1wQ29udGV4dCA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLndyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODA4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iYXNlNjQiCisJImVuY29kaW5nL2pzb24iCisJImZtdCIKKwkibWF0aCIKKwkic3RyY29udiIKKwkic3RyaW5ncyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJvb2xlYW4iCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gZmFsc2UKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQlpZiB2YWx1ZSB7CisJCQl0cmFucy5Xcml0ZShKU09OX1RSVUUpCisJCX0gZWxzZSB7CisJCQl0cmFucy5Xcml0ZShKU09OX0ZBTFNFKQorCQl9CisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ4KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MTYoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkxNigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQzMigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMzJOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEkzMigpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAwIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDY0KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjROdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEk2NCgpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAwIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKKwkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIC0xKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTih2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCisJCX0KKwkJdiA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXYxIDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmdOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiB2ICE9ICIiIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJcyA6PSB0cmFucy5TdHJpbmcoKQorCWlmIHMgIT0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXZcbiAgd3JvdGU6ICV2XG5leHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgIlwiIitiNjRTdHJpbmcrIlwiIikKKwl9CisJdjEgOj0gbmV3KHN0cmluZykKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IGI2NFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiBsZW4odikgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlIGxlbmd0aCAldiwgd3JvdGU6ICV2LCByZWNlaXZlZCBsZW5ndGg6ICV2IiwgdGhldHlwZSwgbGVuKHZhbHVlKSwgcywgbGVuKHYpKQorCX0KKwlmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgeworCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICVkIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIGksIHZhbHVlW2ldLCBzLCB2W2ldKQorCQl9CisJfQorCXYxIDo9IG5ldyhzdHJpbmcpCisJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgeworCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnlOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJYiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCXYgOj0gc3RyaW5nKGIpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAiIiB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibGlzdCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7CisJCXQuRmF0YWwoIkludmFsaWQgdHlwZSBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFNldCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzZXQiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVTZXRCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVTZXRFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKKwl9CisJbCA6PSAqc3RyMQorCWlmIGxlbihsKSA8IDIgeworCQl0LkZhdGFsZigiU2V0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKKwl9CisJaWYgaW50KGxbMF0uKGZsb2F0NjQpKSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3Igc2V0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTWFwKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gIm1hcCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZU1hcEJlZ2luKFRUeXBlKEkzMiksIFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihrKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMga2V5IGludDMyIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSBmbG9hdDY0IHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVNYXBFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCisJfQorCWwgOj0gc3RyaW5ncy5TcGxpdChzdHJbMTpsZW4oc3RyKS0xXSwgIiwiKQorCWlmIGxlbihsKSA8IDMgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBsaXN0IG9mIGF0IGxlYXN0IGxlbmd0aCAzIGZvciBtYXAgZm9yIG1ldGFkYXRhLCBidXQgd2FzIG9mIGxlbmd0aCAiLCBsZW4obCkpCisJfQorCWV4cGVjdGVkS2V5VHlwZSwgXyA6PSBzdHJjb252LkF0b2kobFswXSkKKwlleHBlY3RlZFZhbHVlVHlwZSwgXyA6PSBzdHJjb252LkF0b2kobFsxXSkKKwlleHBlY3RlZFNpemUsIF8gOj0gc3RyY29udi5BdG9pKGxbMl0pCisJaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgbFswXSkKKwl9CisJaWYgZXhwZWN0ZWRWYWx1ZVR5cGUgIT0gRE9VQkxFIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHZhbHVlIHR5cGUgIiwgRE9VQkxFLCAiLCBidXQgd2FzICIsIGxbMV0pCisJfQorCWlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgc2l6ZSBvZiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXMgIiwgbFsyXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzdHJrIDo9IGxbayoyKzNdCisJCXN0cnYgOj0gbFtrKjIrNF0KKwkJaWssIGVyciA6PSBzdHJjb252LkF0b2koc3RyaykKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIHN0cmssIHN0cmluZyhrKSwgZXJyLkVycm9yKCkpCisJCX0KKwkJaWYgaWsgIT0gayB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCBzdHJrLCBrKQorCQl9CisJCXMgOj0gc3RydgorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9OQU4pIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA6PSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIDEwLCA2NCkKKwkJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDM1ODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImxvZyIKKwkicnVudGltZS9kZWJ1ZyIKKwkic3luYyIKKwkic3luYy9hdG9taWMiCispCisKKy8qCisgKiBUaGlzIGlzIG5vdCBhIHR5cGljYWwgVFNpbXBsZVNlcnZlciBhcyBpdCBpcyBub3QgYmxvY2tlZCBhZnRlciBhY2NlcHQgYSBzb2NrZXQuCisgKiBJdCBpcyBtb3JlIGxpa2UgYSBUVGhyZWFkZWRTZXJ2ZXIgdGhhdCBjYW4gaGFuZGxlIGRpZmZlcmVudCBjb25uZWN0aW9ucyBpbiBkaWZmZXJlbnQgZ29yb3V0aW5lcy4KKyAqIFRoaXMgd2lsbCB3b3JrIGlmIGdvbGFuZyB1c2VyIGltcGxlbWVudHMgYSBjb25uLXBvb2wgbGlrZSB0aGluZyBpbiBjbGllbnQgc2lkZS4KKyAqLwordHlwZSBUU2ltcGxlU2VydmVyIHN0cnVjdCB7CisJY2xvc2VkIGludDMyCisJd2cgICAgIHN5bmMuV2FpdEdyb3VwCisJbXUgICAgIHN5bmMuTXV0ZXgKKworCXByb2Nlc3NvckZhY3RvcnkgICAgICAgVFByb2Nlc3NvckZhY3RvcnkKKwlzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKKwlpbnB1dFRyYW5zcG9ydEZhY3RvcnkgIFRUcmFuc3BvcnRGYWN0b3J5CisJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQorCWlucHV0UHJvdG9jb2xGYWN0b3J5ICAgVFByb3RvY29sRmFjdG9yeQorCW91dHB1dFByb3RvY29sRmFjdG9yeSAgVFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0KQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJdHJhbnNwb3J0RmFjdG9yeSwKKwkJcHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyNihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlpbnB1dFByb3RvY29sRmFjdG9yeSwKKwkJb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKKwkJTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKKwkJTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSwKKwkJc2VydmVyVHJhbnNwb3J0LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQlwcm90b2NvbEZhY3RvcnksCisJCXByb3RvY29sRmFjdG9yeSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuICZUU2ltcGxlU2VydmVyeworCQlwcm9jZXNzb3JGYWN0b3J5OiAgICAgICBwcm9jZXNzb3JGYWN0b3J5LAorCQlzZXJ2ZXJUcmFuc3BvcnQ6ICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisJCWlucHV0VHJhbnNwb3J0RmFjdG9yeTogIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJaW5wdXRQcm90b2NvbEZhY3Rvcnk6ICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisJCW91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeSB7CisJcmV0dXJuIHAucHJvY2Vzc29yRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5zZXJ2ZXJUcmFuc3BvcnQKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gcC5pbnB1dFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgTGlzdGVuKCkgZXJyb3IgeworCXJldHVybiBwLnNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBpbm5lckFjY2VwdCgpIChpbnQzMiwgZXJyb3IpIHsKKwljbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWNsb3NlZCA6PSBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkKKwlpZiBjbG9zZWQgIT0gMCB7CisJCXJldHVybiBjbG9zZWQsIG5pbAorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlpZiBjbGllbnQgIT0gbmlsIHsKKwkJcC53Zy5BZGQoMSkKKwkJZ28gZnVuYygpIHsKKwkJCWRlZmVyIHAud2cuRG9uZSgpCisJCQlpZiBlcnIgOj0gcC5wcm9jZXNzUmVxdWVzdHMoY2xpZW50KTsgZXJyICE9IG5pbCB7CisJCQkJbG9nLlByaW50bG4oImVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDoiLCBlcnIpCisJCQl9CisJCX0oKQorCX0KKwlyZXR1cm4gMCwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIEFjY2VwdExvb3AoKSBlcnJvciB7CisJZm9yIHsKKwkJY2xvc2VkLCBlcnIgOj0gcC5pbm5lckFjY2VwdCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIGNsb3NlZCAhPSAwIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU2VydmUoKSBlcnJvciB7CisJZXJyIDo9IHAuTGlzdGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLkFjY2VwdExvb3AoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU3RvcCgpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCXJldHVybiBuaWwKKwl9CisJYXRvbWljLlN0b3JlSW50MzIoJnAuY2xvc2VkLCAxKQorCXAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCisJcC53Zy5XYWl0KCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIHByb2Nlc3NSZXF1ZXN0cyhjbGllbnQgVFRyYW5zcG9ydCkgZXJyb3IgeworCXByb2Nlc3NvciA6PSBwLnByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCkKKwlpbnB1dFRyYW5zcG9ydCwgZXJyIDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJb3V0cHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaW5wdXRQcm90b2NvbCA6PSBwLmlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KQorCW91dHB1dFByb3RvY29sIDo9IHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkKKwlkZWZlciBmdW5jKCkgeworCQlpZiBlIDo9IHJlY292ZXIoKTsgZSAhPSBuaWwgeworCQkJbG9nLlByaW50ZigicGFuaWMgaW4gcHJvY2Vzc29yOiAlczogJXMiLCBlLCBkZWJ1Zy5TdGFjaygpKQorCQl9CisJfSgpCisKKwlpZiBpbnB1dFRyYW5zcG9ydCAhPSBuaWwgeworCQlkZWZlciBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpCisJfQorCWlmIG91dHB1dFRyYW5zcG9ydCAhPSBuaWwgeworCQlkZWZlciBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKQorCX0KKwlmb3IgeworCQlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCQlyZXR1cm4gbmlsCisJCX0KKworCQlvaywgZXJyIDo9IHByb2Nlc3Nvci5Qcm9jZXNzKGRlZmF1bHRDdHgsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rICYmIGVyci5UeXBlSWQoKSA9PSBFTkRfT0ZfRklMRSB7CisJCQlyZXR1cm4gbmlsCisJCX0gZWxzZSBpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IFVOS05PV05fTUVUSE9EIHsKKwkJCWNvbnRpbnVlCisJCX0KKwkJaWYgIW9rIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE0OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkiZXJyb3JzIgorCSJydW50aW1lIgorKQorCit0eXBlIG1vY2tTZXJ2ZXJUcmFuc3BvcnQgc3RydWN0IHsKKwlMaXN0ZW5GdW5jICAgIGZ1bmMoKSBlcnJvcgorCUFjY2VwdEZ1bmMgICAgZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikKKwlDbG9zZUZ1bmMgICAgIGZ1bmMoKSBlcnJvcgorCUludGVycnVwdEZ1bmMgZnVuYygpIGVycm9yCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIExpc3RlbigpIGVycm9yIHsKKwlyZXR1cm4gbS5MaXN0ZW5GdW5jKCkKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIG0uQWNjZXB0RnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBtLkNsb3NlRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEludGVycnVwdCgpIGVycm9yIHsKKwlyZXR1cm4gbS5JbnRlcnJ1cHRGdW5jKCkKK30KKwordHlwZSBtb2NrVFRyYW5zcG9ydCBzdHJ1Y3QgeworCVRUcmFuc3BvcnQKK30KKworZnVuYyAobSAqbW9ja1RUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyBUZXN0TXVsdGlwbGVTdG9wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl2YXIgaW50ZXJydXB0Q2FsbGVkIGJvb2wKKwljIDo9IG1ha2UoY2hhbiBzdHJ1Y3R7fSkKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJPC1jCisJCQlyZXR1cm4gbmlsLCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJYyA8LSBzdHJ1Y3R7fXt9CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlpbnRlcnJ1cHRDYWxsZWQgPSB0cnVlCisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJmaXJzdCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KKworCXNlcnYgPSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlpbnRlcnJ1cHRDYWxsZWQgPSBmYWxzZQorCWdvIHNlcnYuU2VydmUoKQorCXNlcnYuU3RvcCgpCisJaWYgIWludGVycnVwdENhbGxlZCB7CisJCXQuRXJyb3IoInNlY29uZCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KK30KKworZnVuYyBUZXN0V2FpdFJhY2UodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gJm1vY2tUVHJhbnNwb3J0e30sIG5pbAorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CisKK2Z1bmMgVGVzdE5vSGFuZ0R1cmluZ1N0b3BGcm9tRGFuZ2xpbmdMb2NrQWNxdWlyZUR1cmluZ0FjY2VwdExvb3AodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KCJubyBzaXIiKQorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTQyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNvY2tldCBzdHJ1Y3QgeworCWNvbm4gICAgbmV0LkNvbm4KKwlhZGRyICAgIG5ldC5BZGRyCisJdGltZW91dCB0aW1lLkR1cmF0aW9uCit9CisKKy8vIE5ld1RTb2NrZXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vCisvLyBFeGFtcGxlOgorLy8gCXRyYW5zLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTb2NrZXQoImxvY2FsaG9zdDo5MDkwIikKK2Z1bmMgTmV3VFNvY2tldChob3N0UG9ydCBzdHJpbmcpICgqVFNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIDApCit9CisKKy8vIE5ld1RTb2NrZXRUaW1lb3V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0CisvLyBpdCBhbHNvIGFjY2VwdHMgYSB0aW1lb3V0IGFzIGEgdGltZS5EdXJhdGlvbgorZnVuYyBOZXdUU29ja2V0VGltZW91dChob3N0UG9ydCBzdHJpbmcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU29ja2V0LCBlcnJvcikgeworCS8vY29ubiwgZXJyIDo9IG5ldC5EaWFsVGltZW91dChuZXR3b3JrLCBhZGRyZXNzLCB0aW1lb3V0KQorCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGhvc3RQb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgdGltZW91dCksIG5pbAorfQorCisvLyBDcmVhdGVzIGEgVFNvY2tldCBmcm9tIGEgbmV0LkFkZHIKK2Z1bmMgTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU29ja2V0IHsKKwlyZXR1cm4gJlRTb2NrZXR7YWRkcjogYWRkciwgdGltZW91dDogdGltZW91dH0KK30KKworLy8gQ3JlYXRlcyBhIFRTb2NrZXQgZnJvbSBhbiBleGlzdGluZyBuZXQuQ29ubgorZnVuYyBOZXdUU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4gbmV0LkNvbm4sIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTb2NrZXQgeworCXJldHVybiAmVFNvY2tldHtjb25uOiBjb25uLCBhZGRyOiBjb25uLlJlbW90ZUFkZHIoKSwgdGltZW91dDogdGltZW91dH0KK30KKworLy8gU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKK2Z1bmMgKHAgKlRTb2NrZXQpIFNldFRpbWVvdXQodGltZW91dCB0aW1lLkR1cmF0aW9uKSBlcnJvciB7CisJcC50aW1lb3V0ID0gdGltZW91dAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNvY2tldCkgcHVzaERlYWRsaW5lKHJlYWQsIHdyaXRlIGJvb2wpIHsKKwl2YXIgdCB0aW1lLlRpbWUKKwlpZiBwLnRpbWVvdXQgPiAwIHsKKwkJdCA9IHRpbWUuTm93KCkuQWRkKHRpbWUuRHVyYXRpb24ocC50aW1lb3V0KSkKKwl9CisJaWYgcmVhZCAmJiB3cml0ZSB7CisJCXAuY29ubi5TZXREZWFkbGluZSh0KQorCX0gZWxzZSBpZiByZWFkIHsKKwkJcC5jb25uLlNldFJlYWREZWFkbGluZSh0KQorCX0gZWxzZSBpZiB3cml0ZSB7CisJCXAuY29ubi5TZXRXcml0ZURlYWRsaW5lKHQpCisJfQorfQorCisvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KK2Z1bmMgKHAgKlRTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJaWYgcC5Jc09wZW4oKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKQorCX0KKwlpZiBwLmFkZHIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBuaWwgYWRkcmVzcy4iKQorCX0KKwlpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQorCX0KKwlpZiBsZW4ocC5hZGRyLlN0cmluZygpKSA9PSAwIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQorCX0KKwl2YXIgZXJyIGVycm9yCisJaWYgcC5jb25uLCBlcnIgPSBuZXQuRGlhbFRpbWVvdXQocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLnRpbWVvdXQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIG5ldC5Db25uCitmdW5jIChwICpUU29ja2V0KSBDb25uKCkgbmV0LkNvbm4geworCXJldHVybiBwLmNvbm4KK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4KK2Z1bmMgKHAgKlRTb2NrZXQpIElzT3BlbigpIGJvb2wgeworCWlmIHAuY29ubiA9PSBuaWwgeworCQlyZXR1cm4gZmFsc2UKKwl9CisJcmV0dXJuIHRydWUKK30KKworLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwkvLyBDbG9zZSB0aGUgc29ja2V0CisJaWYgcC5jb25uICE9IG5pbCB7CisJCWVyciA6PSBwLmNvbm4uQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlwLmNvbm4gPSBuaWwKKwl9CisJcmV0dXJuIG5pbAorfQorCisvL1JldHVybnMgdGhlIHJlbW90ZSBhZGRyZXNzIG9mIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUodHJ1ZSwgZmFsc2UpCisJbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZShmYWxzZSwgdHJ1ZSkKKwlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKK30KKworZnVuYyAocCAqVFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5jb25uLkNsb3NlKCkKK30KKworZnVuYyAocCAqVFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3YWZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY3J5cHRvL3RscyIKKwkibmV0IgorCSJ0aW1lIgorKQorCit0eXBlIFRTU0xTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKKwlsaXN0ZW5lciAgICAgIG5ldC5MaXN0ZW5lcgorCWFkZHIgICAgICAgICAgbmV0LkFkZHIKKwljbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24KKwlpbnRlcnJ1cHRlZCAgIGJvb2wKKwljZmcgICAgICAgICAgICp0bHMuQ29uZmlnCit9CisKK2Z1bmMgTmV3VFNTTFNlcnZlclNvY2tldChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnKSAoKlRTU0xTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RTU0xTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIsIGNmZywgMCkKK30KKworZnVuYyBOZXdUU1NMU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQorCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGxpc3RlbkFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gJlRTU0xTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dCwgY2ZnOiBjZmd9LCBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgTGlzdGVuKCkgZXJyb3IgeworCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBuaWwKKwl9CisJbCwgZXJyIDo9IHRscy5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLmxpc3RlbmVyID0gbAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5pbnRlcnJ1cHRlZCB7CisJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCisJfQorCWlmIHAubGlzdGVuZXIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCisJfQorCWNvbm4sIGVyciA6PSBwLmxpc3RlbmVyLkFjY2VwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4gTmV3VFNTTFNvY2tldEZyb21Db25uVGltZW91dChjb25uLCBwLmNmZywgcC5jbGllbnRUaW1lb3V0KSwgbmlsCit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgorZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgSXNMaXN0ZW5pbmcoKSBib29sIHsKKwlyZXR1cm4gcC5saXN0ZW5lciAhPSBuaWwKK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgbCwgZXJyIDo9IHRscy5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJcC5saXN0ZW5lciA9IGwKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJZGVmZXIgZnVuYygpIHsKKwkJcC5saXN0ZW5lciA9IG5pbAorCX0oKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBwLmxpc3RlbmVyLkNsb3NlKCkKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcC5pbnRlcnJ1cHRlZCA9IHRydWUKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2MzM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNTTFNvY2tldCBzdHJ1Y3QgeworCWNvbm4gbmV0LkNvbm4KKwkvLyBob3N0UG9ydCBjb250YWlucyBob3N0OnBvcnQgKGUuZy4gImFzZGYuY29tOjEyMzQ1IikuIFRoZSBmaWVsZCBpcworCS8vIG9ubHkgdmFsaWQgaWYgYWRkciBpcyBuaWwuCisJaG9zdFBvcnQgc3RyaW5nCisJLy8gYWRkciBpcyBuaWwgd2hlbiBob3N0UG9ydCBpcyBub3QgIiIsIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUKKwkvLyBUU1NMU29ja2V0IGlzIGNvbnN0cnVjdGVkIGZyb20gYSBuZXQuQWRkci4KKwlhZGRyICAgIG5ldC5BZGRyCisJdGltZW91dCB0aW1lLkR1cmF0aW9uCisJY2ZnICAgICAqdGxzLkNvbmZpZworfQorCisvLyBOZXdUU1NMU29ja2V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0IGFuZCB0bHMgQ29uZmlndXJhdGlvbgorLy8KKy8vIEV4YW1wbGU6CisvLyAJdHJhbnMsIGVyciA6PSB0aHJpZnQuTmV3VFNTTFNvY2tldCgibG9jYWxob3N0OjkwOTAiLCBuaWwpCitmdW5jIE5ld1RTU0xTb2NrZXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcpICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIGNmZywgMCkKK30KKworLy8gTmV3VFNTTFNvY2tldFRpbWVvdXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vIGl0IGFsc28gYWNjZXB0cyBhIHRscyBDb25maWd1cmF0aW9uIGFuZCBhIHRpbWVvdXQgYXMgYSB0aW1lLkR1cmF0aW9uCitmdW5jIE5ld1RTU0xTb2NrZXRUaW1lb3V0KGhvc3RQb3J0IHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQorCXJldHVybiAmVFNTTFNvY2tldHtob3N0UG9ydDogaG9zdFBvcnQsIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfSwgbmlsCit9CisKKy8vIENyZWF0ZXMgYSBUU1NMU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU1NMU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIGNmZyAqdGxzLkNvbmZpZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNTTFNvY2tldCB7CisJcmV0dXJuICZUU1NMU29ja2V0e2FkZHI6IGFkZHIsIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfQorfQorCisvLyBDcmVhdGVzIGEgVFNTTFNvY2tldCBmcm9tIGFuIGV4aXN0aW5nIG5ldC5Db25uCitmdW5jIE5ld1RTU0xTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiBuZXQuQ29ubiwgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU1NMU29ja2V0IHsKKwlyZXR1cm4gJlRTU0xTb2NrZXR7Y29ubjogY29ubiwgYWRkcjogY29ubi5SZW1vdGVBZGRyKCksIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfQorfQorCisvLyBTZXRzIHRoZSBzb2NrZXQgdGltZW91dAorZnVuYyAocCAqVFNTTFNvY2tldCkgU2V0VGltZW91dCh0aW1lb3V0IHRpbWUuRHVyYXRpb24pIGVycm9yIHsKKwlwLnRpbWVvdXQgPSB0aW1lb3V0CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBwdXNoRGVhZGxpbmUocmVhZCwgd3JpdGUgYm9vbCkgeworCXZhciB0IHRpbWUuVGltZQorCWlmIHAudGltZW91dCA+IDAgeworCQl0ID0gdGltZS5Ob3coKS5BZGQodGltZS5EdXJhdGlvbihwLnRpbWVvdXQpKQorCX0KKwlpZiByZWFkICYmIHdyaXRlIHsKKwkJcC5jb25uLlNldERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHJlYWQgeworCQlwLmNvbm4uU2V0UmVhZERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHdyaXRlIHsKKwkJcC5jb25uLlNldFdyaXRlRGVhZGxpbmUodCkKKwl9Cit9CisKKy8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgorZnVuYyAocCAqVFNTTFNvY2tldCkgT3BlbigpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJLy8gSWYgd2UgaGF2ZSBhIGhvc3RuYW1lLCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGhvc3RuYW1lIHRvIHRscy5EaWFsIGZvcgorCS8vIGNlcnRpZmljYXRlIGhvc3RuYW1lIGNoZWNrcy4KKwlpZiBwLmhvc3RQb3J0ICE9ICIiIHsKKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCAidGNwIiwgcC5ob3N0UG9ydCwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwkJfQorCX0gZWxzZSB7CisJCWlmIHAuSXNPcGVuKCkgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpCisJCX0KKwkJaWYgcC5hZGRyID09IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCisJCX0KKwkJaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgbmV0d29yayBuYW1lLiIpCisJCX0KKwkJaWYgbGVuKHAuYWRkci5TdHJpbmcoKSkgPT0gMCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBhZGRyZXNzLiIpCisJCX0KKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCBwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBuZXQuQ29ubgorZnVuYyAocCAqVFNTTFNvY2tldCkgQ29ubigpIG5ldC5Db25uIHsKKwlyZXR1cm4gcC5jb25uCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBvcGVuCitmdW5jIChwICpUU1NMU29ja2V0KSBJc09wZW4oKSBib29sIHsKKwlpZiBwLmNvbm4gPT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIENsb3NlcyB0aGUgc29ja2V0LgorZnVuYyAocCAqVFNTTFNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJLy8gQ2xvc2UgdGhlIHNvY2tldAorCWlmIHAuY29ubiAhPSBuaWwgeworCQllcnIgOj0gcC5jb25uLkNsb3NlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJcC5jb25uID0gbmlsCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUodHJ1ZSwgZmFsc2UpCisJbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZShmYWxzZSwgdHJ1ZSkKKwlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5jb25uLkNsb3NlKCkKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI3MzhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImlvIgorKQorCit2YXIgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQgPSBlcnJvcnMuTmV3KCJUcmFuc3BvcnQgSW50ZXJydXB0ZWQiKQorCit0eXBlIEZsdXNoZXIgaW50ZXJmYWNlIHsKKwlGbHVzaCgpIChlcnIgZXJyb3IpCit9CisKK3R5cGUgQ29udGV4dEZsdXNoZXIgaW50ZXJmYWNlIHsKKwlGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKQorfQorCit0eXBlIFJlYWRTaXplUHJvdmlkZXIgaW50ZXJmYWNlIHsKKwlSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KQorfQorCisvLyBFbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllcgordHlwZSBUVHJhbnNwb3J0IGludGVyZmFjZSB7CisJaW8uUmVhZFdyaXRlQ2xvc2VyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCisKKwkvLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCisJT3BlbigpIGVycm9yCisKKwkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisJSXNPcGVuKCkgYm9vbAorfQorCit0eXBlIHN0cmluZ1dyaXRlciBpbnRlcmZhY2UgeworCVdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikKK30KKworLy8gVGhpcyBpcyAiZW5jaGFuY2VkIiB0cmFuc3BvcnQgd2l0aCBleHRyYSBjYXBhYmlsaXRpZXMuIFlvdSBuZWVkIHRvIHVzZSBvbmUgb2YgdGhlc2UKKy8vIHRvIGNvbnN0cnVjdCBwcm90b2NvbC4KKy8vIE5vdGFibHksIFRTb2NrZXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgaXQgaXMgYWx3YXlzIGEgbWlzdGFrZSB0byB1c2UKKy8vIFRTb2NrZXQgZGlyZWN0bHkgaW4gcHJvdG9jb2wuCit0eXBlIFRSaWNoVHJhbnNwb3J0IGludGVyZmFjZSB7CisJaW8uUmVhZFdyaXRlcgorCWlvLkJ5dGVSZWFkZXIKKwlpby5CeXRlV3JpdGVyCisJc3RyaW5nV3JpdGVyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNWI0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbi5nbwpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkiaW8iCispCisKK3R5cGUgdGltZW91dGFibGUgaW50ZXJmYWNlIHsKKwlUaW1lb3V0KCkgYm9vbAorfQorCisvLyBUaHJpZnQgVHJhbnNwb3J0IGV4Y2VwdGlvbgordHlwZSBUVHJhbnNwb3J0RXhjZXB0aW9uIGludGVyZmFjZSB7CisJVEV4Y2VwdGlvbgorCVR5cGVJZCgpIGludAorCUVycigpIGVycm9yCit9CisKK2NvbnN0ICgKKwlVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04gPSAwCisJTk9UX09QRU4gICAgICAgICAgICAgICAgICAgID0gMQorCUFMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICA9IDIKKwlUSU1FRF9PVVQgICAgICAgICAgICAgICAgICAgPSAzCisJRU5EX09GX0ZJTEUgICAgICAgICAgICAgICAgID0gNAorKQorCit0eXBlIHRUcmFuc3BvcnRFeGNlcHRpb24gc3RydWN0IHsKKwl0eXBlSWQgaW50CisJZXJyICAgIGVycm9yCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5lcnIuRXJyb3IoKQorfQorCitmdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBFcnIoKSBlcnJvciB7CisJcmV0dXJuIHAuZXJyCit9CisKK2Z1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0IGludCwgZSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24geworCXJldHVybiAmdFRyYW5zcG9ydEV4Y2VwdGlvbnt0eXBlSWQ6IHQsIGVycjogZXJyb3JzLk5ldyhlKX0KK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGUgZXJyb3IpIFRUcmFuc3BvcnRFeGNlcHRpb24geworCWlmIGUgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCWlmIHQsIG9rIDo9IGUuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiB0CisJfQorCisJc3dpdGNoIHYgOj0gZS4odHlwZSkgeworCWNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKwkJcmV0dXJuIHYKKwljYXNlIHRpbWVvdXRhYmxlOgorCQlpZiB2LlRpbWVvdXQoKSB7CisJCQlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBUSU1FRF9PVVQsIGVycjogZX0KKwkJfQorCX0KKworCWlmIGUgPT0gaW8uRU9GIHsKKwkJcmV0dXJuICZ0VHJhbnNwb3J0RXhjZXB0aW9ue3R5cGVJZDogRU5EX09GX0ZJTEUsIGVycjogZX0KKwl9CisKKwlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIGVycjogZX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0MzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZm10IgorCSJpbyIKKworCSJ0ZXN0aW5nIgorKQorCit0eXBlIHRpbWVvdXQgc3RydWN0eyB0aW1lZG91dCBib29sIH0KKworZnVuYyAodCAqdGltZW91dCkgVGltZW91dCgpIGJvb2wgeworCXJldHVybiB0LnRpbWVkb3V0Cit9CisKK2Z1bmMgKHQgKnRpbWVvdXQpIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gZm10LlNwcmludGYoIlRpbWVvdXQ6ICV2IiwgdC50aW1lZG91dCkKK30KKworZnVuYyBUZXN0VEV4Y2VwdGlvblRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJdGltZW91dCA6PSAmdGltZW91dHt0cnVlfQorCWV4Y2VwdGlvbiA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKHRpbWVvdXQpCisJaWYgdGltZW91dC5FcnJvcigpICE9IGV4Y2VwdGlvbi5FcnJvcigpIHsKKwkJdC5GYXRhbGYoIkVycm9yIGRpZCBub3QgbWF0Y2g6IGV4cGVjdGVkICVxLCBnb3QgJXEiLCB0aW1lb3V0LkVycm9yKCksIGV4Y2VwdGlvbi5FcnJvcigpKQorCX0KKworCWlmIGV4Y2VwdGlvbi5UeXBlSWQoKSAhPSBUSU1FRF9PVVQgeworCQl0LkZhdGFsZigiVHlwZUlkIHdhcyBub3QgVElNRURfT1VUOiBleHBlY3RlZCAldiwgZ290ICV2IiwgVElNRURfT1VULCBleGNlcHRpb24uVHlwZUlkKCkpCisJfQorfQorCitmdW5jIFRlc3RURXhjZXB0aW9uRU9GKHQgKnRlc3RpbmcuVCkgeworCWV4Y2VwdGlvbiA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGlvLkVPRikKKwlpZiBpby5FT0YuRXJyb3IoKSAhPSBleGNlcHRpb24uRXJyb3IoKSB7CisJCXQuRmF0YWxmKCJFcnJvciBkaWQgbm90IG1hdGNoOiBleHBlY3RlZCAlcSwgZ290ICVxIiwgaW8uRU9GLkVycm9yKCksIGV4Y2VwdGlvbi5FcnJvcigpKQorCX0KKworCWlmIGV4Y2VwdGlvbi5UeXBlSWQoKSAhPSBFTkRfT0ZfRklMRSB7CisJCXQuRmF0YWxmKCJUeXBlSWQgd2FzIG5vdCBFTkRfT0ZfRklMRTogZXhwZWN0ZWQgJXYsIGdvdCAldiIsIEVORF9PRl9GSUxFLCBleGNlcHRpb24uVHlwZUlkKCkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwNTgwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KKy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisvLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCit0eXBlIFRUcmFuc3BvcnRGYWN0b3J5IGludGVyZmFjZSB7CisJR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikKK30KKwordHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCisvLyBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KK2Z1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIHRyYW5zLCBuaWwKK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJnRUcmFuc3BvcnRGYWN0b3J5e30KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjc4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImlvIgorCSJuZXQiCisJInN0cmNvbnYiCisJInRlc3RpbmciCispCisKK2NvbnN0IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFID0gNDA5NgorCit2YXIgKAorCXRyYW5zcG9ydF9iZGF0YSAgW11ieXRlIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZzsgc2FtZSBhcyBkYXRhCisJdHJhbnNwb3J0X2hlYWRlciBtYXBbc3RyaW5nXXN0cmluZworKQorCitmdW5jIGluaXQoKSB7CisJdHJhbnNwb3J0X2JkYXRhID0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWZvciBpIDo9IDA7IGkgPCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKKwkJdHJhbnNwb3J0X2JkYXRhW2ldID0gYnl0ZSgoaSArICdhJykgJSAyNTUpCisJfQorCXRyYW5zcG9ydF9oZWFkZXIgPSBtYXBbc3RyaW5nXXN0cmluZ3sia2V5IjogIlVzZXItQWdlbnQiLAorCQkidmFsdWUiOiAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4yOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMzIuMC4xNjY3LjAgU2FmYXJpLzUzNy4zNiJ9Cit9CisKK2Z1bmMgVHJhbnNwb3J0VGVzdCh0ICp0ZXN0aW5nLlQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQpIHsKKwlidWYgOj0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWlmICF3cml0ZVRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCB3cml0ZVRyYW5zLCB3cml0ZVRyYW5zKQorCX0KKwlpZiAhcmVhZFRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCByZWFkVHJhbnMsIHJlYWRUcmFucykKKwl9CisJXywgZXJyIDo9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwluLCBlcnIgOj0gaW8uUmVhZEZ1bGwocmVhZFRyYW5zLCBidWYpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIGVycikKKwl9CisJaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgcmVhZCBvbmx5ICVkIGluc3RlYWQgb2YgJWQgYnl0ZXMgb2YgYmluYXJ5IGRhdGEiLCByZWFkVHJhbnMsIG4sIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBidWYgeworCQlpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7CisJCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQorCQl9CisJfQorCV8sIGVyciA9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSAyIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQorCX0KKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBiaW5hcnkgZGF0YSAyOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKKwl9CisJYnVmID0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCXJlYWQgOj0gMQorCWZvciBuID0gMDsgbiA8IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFICYmIHJlYWQgIT0gMDsgeworCQlyZWFkLCBlcnIgPSByZWFkVHJhbnMuUmVhZChidWZbbjpdKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgMiBvZiB0b3RhbCBsZW5ndGggJWQgZnJvbSBvZmZzZXQgJWQ6ICVzIiwgcmVhZFRyYW5zLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSwgbiwgZXJyKQorCQl9CisJCW4gKz0gcmVhZAorCX0KKwlpZiBuICE9IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KK30KKworZnVuYyBUcmFuc3BvcnRIZWFkZXJUZXN0KHQgKnRlc3RpbmcuVCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0LCByZWFkVHJhbnMgVFRyYW5zcG9ydCkgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJaWYgIXdyaXRlVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHdyaXRlVHJhbnMsIHdyaXRlVHJhbnMpCisJfQorCWlmICFyZWFkVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHJlYWRUcmFucywgcmVhZFRyYW5zKQorCX0KKwkvLyBOZWVkIHRvIGFzc2VydCB0eXBlIG9mIFRUcmFuc3BvcnQgdG8gVEh0dHBDbGllbnQgdG8gZXhwb3NlIHRoZSBTZXR0ZXIKKwlodHRwV1Bvc3RUcmFucyA6PSB3cml0ZVRyYW5zLigqVEh0dHBDbGllbnQpCisJaHR0cFdQb3N0VHJhbnMuU2V0SGVhZGVyKHRyYW5zcG9ydF9oZWFkZXJbImtleSJdLCB0cmFuc3BvcnRfaGVhZGVyWyJ2YWx1ZSJdKQorCisJXywgZXJyIDo9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwkvLyBOZWVkIHRvIGFzc2VydCB0eXBlIG9mIFRUcmFuc3BvcnQgdG8gVEh0dHBDbGllbnQgdG8gZXhwb3NlIHRoZSBHZXR0ZXIKKwlodHRwUlBvc3RUcmFucyA6PSByZWFkVHJhbnMuKCpUSHR0cENsaWVudCkKKwlyZWFkSGVhZGVyIDo9IGh0dHBSUG9zdFRyYW5zLkdldEhlYWRlcih0cmFuc3BvcnRfaGVhZGVyWyJrZXkiXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgcmVhZCBIVFRQIEhlYWRlciBWYWx1ZSIsIGh0dHBSUG9zdFRyYW5zKQorCX0KKworCWlmIHRyYW5zcG9ydF9oZWFkZXJbInZhbHVlIl0gIT0gcmVhZEhlYWRlciB7CisJCXQuRXJyb3JmKCJFeHBlY3RlZCBIVFRQIEhlYWRlciBWYWx1ZSAlcywgZ290ICVzIiwgdHJhbnNwb3J0X2hlYWRlclsidmFsdWUiXSwgcmVhZEhlYWRlcikKKwl9CisJbiwgZXJyIDo9IGlvLlJlYWRGdWxsKHJlYWRUcmFucywgYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBlcnIpCisJfQorCWlmIG4gIT0gVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIHJlYWQgb25seSAlZCBpbnN0ZWFkIG9mICVkIGJ5dGVzIG9mIGJpbmFyeSBkYXRhIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KK30KKworZnVuYyBDbG9zZVRyYW5zcG9ydHModCAqdGVzdGluZy5ULCByZWFkVHJhbnMgVFRyYW5zcG9ydCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0KSB7CisJZXJyIDo9IHJlYWRUcmFucy5DbG9zZSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGNsb3NlIHJlYWQgdHJhbnNwb3J0OiAlcyIsIHJlYWRUcmFucywgZXJyKQorCX0KKwlpZiB3cml0ZVRyYW5zICE9IHJlYWRUcmFucyB7CisJCWVyciA9IHdyaXRlVHJhbnMuQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGNsb3NlIHdyaXRlIHRyYW5zcG9ydDogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCisJCX0KKwl9Cit9CisKK2Z1bmMgRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoc3RhcnRQb3J0IGludCkgKG5ldC5BZGRyLCBlcnJvcikgeworCWZvciBpIDo9IHN0YXJ0UG9ydDsgaSA8IDY1NTM1OyBpKysgeworCQlzIDo9ICIxMjcuMC4wLjE6IiArIHN0cmNvbnYuSXRvYShpKQorCQlsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgcykKKwkJaWYgZXJyID09IG5pbCB7CisJCQlsLkNsb3NlKCkKKwkJCXJldHVybiBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIHMpCisJCX0KKwl9CisJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorfQorCitmdW5jIHZhbHVlSW5TbGljZSh2YWx1ZSBzdHJpbmcsIHNsaWNlIFtdc3RyaW5nKSBib29sIHsKKwlmb3IgXywgdiA6PSByYW5nZSBzbGljZSB7CisJCWlmIHZhbHVlID09IHYgeworCQkJcmV0dXJuIHRydWUKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2UKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHlwZS5nbyBiL2xpYi9nby90aHJpZnQvdHlwZS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkyZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gVHlwZSBjb25zdGFudHMgaW4gdGhlIFRocmlmdCBwcm90b2NvbAordHlwZSBUVHlwZSBieXRlCisKK2NvbnN0ICgKKwlTVE9QICAgPSAwCisJVk9JRCAgID0gMQorCUJPT0wgICA9IDIKKwlCWVRFICAgPSAzCisJSTA4ICAgID0gMworCURPVUJMRSA9IDQKKwlJMTYgICAgPSA2CisJSTMyICAgID0gOAorCUk2NCAgICA9IDEwCisJU1RSSU5HID0gMTEKKwlVVEY3ICAgPSAxMQorCVNUUlVDVCA9IDEyCisJTUFQICAgID0gMTMKKwlTRVQgICAgPSAxNAorCUxJU1QgICA9IDE1CisJVVRGOCAgID0gMTYKKwlVVEYxNiAgPSAxNworCS8vQklOQVJZID0gMTggICB3cm9uZyBhbmQgdW51c3VlZAorKQorCit2YXIgdHlwZU5hbWVzID0gbWFwW2ludF1zdHJpbmd7CisJU1RPUDogICAiU1RPUCIsCisJVk9JRDogICAiVk9JRCIsCisJQk9PTDogICAiQk9PTCIsCisJQllURTogICAiQllURSIsCisJRE9VQkxFOiAiRE9VQkxFIiwKKwlJMTY6ICAgICJJMTYiLAorCUkzMjogICAgIkkzMiIsCisJSTY0OiAgICAiSTY0IiwKKwlTVFJJTkc6ICJTVFJJTkciLAorCVNUUlVDVDogIlNUUlVDVCIsCisJTUFQOiAgICAiTUFQIiwKKwlTRVQ6ICAgICJTRVQiLAorCUxJU1Q6ICAgIkxJU1QiLAorCVVURjg6ICAgIlVURjgiLAorCVVURjE2OiAgIlVURjE2IiwKK30KKworZnVuYyAocCBUVHlwZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlpZiBzLCBvayA6PSB0eXBlTmFtZXNbaW50KHApXTsgb2sgeworCQlyZXR1cm4gcworCX0KKwlyZXR1cm4gIlVua25vd24iCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q0MjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJImNvbnRleHQiCisJImlvIgorCSJsb2ciCispCisKKy8vIFRabGliVHJhbnNwb3J0RmFjdG9yeSBpcyBhIGZhY3RvcnkgZm9yIFRabGliVHJhbnNwb3J0IGluc3RhbmNlcwordHlwZSBUWmxpYlRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlsZXZlbCAgIGludAorCWZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKK30KKworLy8gVFpsaWJUcmFuc3BvcnQgaXMgYSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRoYXQgbWFrZXMgdXNlIG9mIHpsaWIgY29tcHJlc3Npb24uCit0eXBlIFRabGliVHJhbnNwb3J0IHN0cnVjdCB7CisJcmVhZGVyICAgIGlvLlJlYWRDbG9zZXIKKwl0cmFuc3BvcnQgVFRyYW5zcG9ydAorCXdyaXRlciAgICAqemxpYi5Xcml0ZXIKK30KKworLy8gR2V0VHJhbnNwb3J0IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnQKK2Z1bmMgKHAgKlRabGliVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHAuZmFjdG9yeSAhPSBuaWwgeworCQkvLyB3cmFwIG90aGVyIGZhY3RvcnkKKwkJdmFyIGVyciBlcnJvcgorCQl0cmFucywgZXJyID0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFucykKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gbmlsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gTmV3VFpsaWJUcmFuc3BvcnQodHJhbnMsIHAubGV2ZWwpCit9CisKKy8vIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeSBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkobGV2ZWwgaW50KSAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRabGliVHJhbnNwb3J0RmFjdG9yeXtsZXZlbDogbGV2ZWwsIGZhY3Rvcnk6IG5pbH0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgVFpsaWJUcmFuc3BvcnRGYWN0b3J5CisvLyBhcyBhIHdyYXBwZXIgb3ZlciBleGlzdGluZyB0cmFuc3BvcnQgZmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeShsZXZlbCBpbnQsIGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogZmFjdG9yeX0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydAorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0LCBsZXZlbCBpbnQpICgqVFpsaWJUcmFuc3BvcnQsIGVycm9yKSB7CisJdywgZXJyIDo9IHpsaWIuTmV3V3JpdGVyTGV2ZWwodHJhbnMsIGxldmVsKQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuUHJpbnRsbihlcnIpCisJCXJldHVybiBuaWwsIGVycgorCX0KKworCXJldHVybiAmVFpsaWJUcmFuc3BvcnR7CisJCXdyaXRlcjogICAgdywKKwkJdHJhbnNwb3J0OiB0cmFucywKKwl9LCBuaWwKK30KKworLy8gQ2xvc2UgY2xvc2VzIHRoZSByZWFkZXIgYW5kIHdyaXRlciAoZmx1c2hpbmcgYW55IHVud3JpdHRlbiBkYXRhKSBhbmQgY2xvc2VzCisvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJaWYgei5yZWFkZXIgIT0gbmlsIHsKKwkJaWYgZXJyIDo9IHoucmVhZGVyLkNsb3NlKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSB6LndyaXRlci5DbG9zZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gei50cmFuc3BvcnQuQ2xvc2UoKQorfQorCisvLyBGbHVzaCBmbHVzaGVzIHRoZSB3cml0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgZXJyIDo9IHoud3JpdGVyLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiB6LnRyYW5zcG9ydC5GbHVzaChjdHgpCit9CisKKy8vIElzT3BlbiByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHoudHJhbnNwb3J0LklzT3BlbigpCit9CisKKy8vIE9wZW4gb3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIHoudHJhbnNwb3J0Lk9wZW4oKQorfQorCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgUmVhZChwIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiB6LnJlYWRlciA9PSBuaWwgeworCQlyLCBlcnIgOj0gemxpYi5OZXdSZWFkZXIoei50cmFuc3BvcnQpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJCXoucmVhZGVyID0gcgorCX0KKworCXJldHVybiB6LnJlYWRlci5SZWFkKHApCit9CisKKy8vIFJlbWFpbmluZ0J5dGVzIHJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdGhhdCBpcyBzdGlsbCB0byBiZQorLy8gcmVhZC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIHVpbnQ2NCB7CisJcmV0dXJuIHoudHJhbnNwb3J0LlJlbWFpbmluZ0J5dGVzKCkKK30KKworZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIFdyaXRlKHAgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB6LndyaXRlci5Xcml0ZShwKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RabGliVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zLCBlcnIgOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCB6bGliLkJlc3RDb21wcmVzc2lvbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCit0eXBlIER1bW15VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIChwICpEdW1teVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlcigpLCBuaWwKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRoRmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KAorCQl6bGliLkJlc3RDb21wcmVzc2lvbiwKKwkJJkR1bW15VHJhbnNwb3J0RmFjdG9yeXt9LAorCSkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRob3V0RmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KHpsaWIuQmVzdENvbXByZXNzaW9uLCBuaWwpCisJYnVmZmVyIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXRyYW5zLCBlcnIgOj0gZmFjdG9yeS5HZXRUcmFuc3BvcnQoYnVmZmVyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9SRUFETUUubWQgYi9saWIvaGF4ZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0Yjc3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL1JFQURNRS5tZApAQCAtMCwwICsxLDE2NCBAQAorVGhyaWZ0IEhheGUgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBIYXhlCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworSGF4ZSBzZXR1cAorLS0tLS0tLS0tLS0tLS0tCisKK1RocmlmdCByZXF1aXJlcyBIYXhlIDMuMS4zLiBJbnN0YWxsZXJzIGZvciBXaW5kb3dzIGFuZCBPU1gKK3BsYXRmb3JtcyBhcmUgYXZhaWxhYmxlIGF0IGBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWRgLiAKKworRGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIHRhcmdldHMsIHlvdSBtYXkgaGF2ZSB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZSBIYXhlTGlicyAKK2FmdGVyIGluc3RhbGxpbmcgSGF4ZSBpdHNlbGYuIEZvciBleGFtcGxlLCBpZiB5b3UgcGxhbiB0byB0YXJnZXQgQyMsIEphdmEgYW5kIEMrKywKK2VudGVyIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWZ0ZXIgaW5zdGFsbGluZyBIYXhlOgorCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4amF2YQorICAgIGhheGVsaWIgaW5zdGFsbCBoeGNzCisKK0ZvciBvdGhlciB0YXJnZXRzLCBwbGVhc2UgY29uc3VsdCB0aGUgSGF4ZSBkb2N1bWVudGF0aW9uIHdoZXRoZXIgb3Igbm90IGFueSBhZGRpdGlvbmFsCit0YXJnZXQgbGlicmFyaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkIGFuZCBob3cgdG8gYWNoaWV2ZSB0aGlzLgorCisKK0hheGUgb24gTGludXggCistLS0tLS0tLS0tLS0tLS0KKworRm9yIExpbnV4IHBsYXRmb3JtcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRpc3Ryby1zcGVjaWZpYyBwYWNrYWdlCittYW5hZ2VyLCB3aGVyZSBwb3NzaWJsZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhlIAorSGF4ZSBMaW51eCBkb3dubG9hZCBzZWN0aW9uOiBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgKKworSWYgeW91IHJ1biBpbnRvIHRoZSBlcnJvciBtZXNzYWdlIAorCisgICAgVW5jYXVnaHQgZXhjZXB0aW9uIC0gbG9hZC5jKDIzNykgOiBGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5IDogL3Vzci9saWIvbmVrby9yZWdleHAubmRsbCAgCisJKGxpYnBjcmUuc28uMzogY2Fubm90IG9wZW4gc2hhcmVkIG9iamVjdCBmaWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5KQorCit0aGlzIGNhbiBiZSBzb2x2ZWQgZGVwZW5kaW5nIG9uIHlvdXIgT1NlcyBiaXRuZXNzIGJ5IGVpdGhlcgorCisgICAgc3VkbyBsbiAtc2YgL3Vzci9saWIvbGlicGNyZS5zby4xIC91c3IvbGliL2xpYnBjcmUuc28uMworICAgIHN1ZG8gbGRjb25maWcKKwkKK29yCisKKyAgICBzdWRvIGxuIC1zZiAvdXNyL2xpYjY0L2xpYnBjcmUuc28uMSAvdXNyL2xpYjY0L2xpYnBjcmUuc28uMworICAgIHN1ZG8gbGRjb25maWcKKworVGhyaWZ0IEhheGUgYmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKwkKK1RocmlmdCBIYXhlIGJpbmRpbmdzIGNhbiBiZSBzZXQgdXAgdmlhIHRoZSBgaGF4ZWxpYmAgdG9vbCAgCitlaXRoZXIgZnJvbSB0aGUgb2ZmaWNpYWwgQVNGIHJlcG8sIG9yIHZpYSB0aGUgZ2l0aHViIG1pcnJvci4KKworLSBUbyBzZXQgdXAgYW55ICoqc3RhYmxlIHZlcnNpb24qKiwgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBicmFuY2ggKGUuZy4gYDEuMC4wYCwgZXRjLik6CisKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IDEuMC4wIGxpYi9oYXhlYAorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCisKKy0gVG8gc2V0IHVwIHRoZSBjdXJyZW50ICoqZGV2ZWxvcG1lbnQgdmVyc2lvbioqLCB1c2UgdGhlIGBtYXN0ZXJgIGJyYW5jaDoKKyAgCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdCBtYXN0ZXIgbGliL2hheGVgCQorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgbWFzdGVyIGxpYi9oYXhlYAorCitBcyB1c3VhbCwgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGNhbiBiZSB1cGRhdGVkIHVzaW5nIGBoYXhlbGliIHVwZ3JhZGVgIAorb3IgYGhheGVsaWIgdXBkYXRlIHRocmlmdGAuCisKK0luIG9yZGVyIHRvIHdvcmsgd2l0aCBUaHJpZnQsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgVGhyaWZ0IGNvbXBpbGVyIAorb3IgYnVpbGQgZnJvbSBzb3VyY2UsIGRlcGVuZGluZyBvbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIEFwcHJvcHJpYXRlIAorZG93bmxvYWRzIGFuZCBtb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKwkKK1RvIGdldCBzdGFydGVkLCB2aXNpdCB0aGUgL3R1dG9yaWFsL2hheGUgYW5kIC90ZXN0L2hheGUgZGlycyBmb3IgZXhhbXBsZXMuIAorSWYgeW91IGFyZSB1c2luZyBISURFIG9yIHRoZSBGbGFzaERldmVsb3AgSURFLCB5b3UnbGwgZmluZCBhcHByb3ByaWF0ZSAKK3Byb2plY3QgZmlsZXMgaW4gdGhlc2UgZm9sZGVycy4KKworCitDdXJyZW50IHN0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09CistIHRlc3RlZCB3aXRoIEhheGUgQysrIHRhcmdldAorLSB0ZXN0ZWQgd2l0aCBIYXhlIFBIUCB0YXJnZXQgKGNvbnNvbGUvd2ViIHNlcnZlciwgYmluYXJ5IHByb3RvY29scykKKy0gdHJhbnNwb3J0czogU29ja2V0LCBIVFRQIChzZXJ2ZXJzIHJ1biBpbnNpZGUgUEhQIHNlcnZlci9QSFAgdGFyZ2V0IG9ubHkpLCBTdHJlYW0KKy0gcHJvdG9jb2xzOiBCaW5hcnksIEpTT04sIE11bHRpcGxleCwgQ29tcGFjdAorLSB0dXRvcmlhbCBjbGllbnQgYW5kIHNlcnZlciBhdmFpbGFibGUKKy0gY3Jvc3MtdGVzdCBjbGllbnQgYW5kIHNlcnZlciBhdmFpbGFibGUgCisKKworRnVydGhlciBkZXZlbG9wbWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PQorLSBpbXByb3ZlIHRvIHdvcmsgd2l0aCBDIywgSmF2YSBhbmQgSmF2YVNjcmlwdCBIYXhlL09wZW5GTCB0YXJnZXRzCistIGltcHJvdmUgdG8gd29yayB3aXRoIG1vcmUgKGlkZWFsbHkgYWxsKSBIYXhlL09wZW5GTCB0YXJnZXRzCistIGFkZCBIVFRQIHNlcnZlciwgdXBkYXRlIHR1dG9yaWFsIGFuZCB0ZXN0cyBhY2NvcmRpbmdseQorCisKK0tub3duIHJlc3RyaWN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09CisKK0FsdGhvdWdoIGRlc2lnbmVkIHdpdGggbWF4aW11bSBwb3J0YWJpbGl0eSBpbiBtaW5kLCBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgc29tZSBwbGF0Zm9ybXMKK21heSBvbmx5IHN1cHBvcnQgcGFydHMgb2YgdGhlIGxpYnJhcnksIG9yIG5vdCBiZSBjb21wYXRpYmxlIGF0IGFsbC4KKworSmF2YXNjcmlwdDoKKy0gdHV0b3JpYWwgZmFpbHMgdG8gYnVpbGQgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCBTeXMuYXJncworCitQSFAgSFRUUCBTZXJ2ZXIgbm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCistIHlvdSBoYXZlIHRvIGltcG9ydCBQSFAgZmlsZXMgZ2VuZXJhdGVkIGJ5IGhheGUgaW50byBQSFAKK2BgYHBocAorcmVxdWlyZV9vbmNlICBkaXJuYW1lKF9fRklMRV9fKSAuICcvYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwJzsKK2BgYAorCistIHRyYWNlKCkgYnkgZGVmYXVsdCBvdXRwdXRzIGludG8gc3Rkb3V0IChodHRwIHJlc3BvbnNlKSwgc28geW91IGhhdmUgdG8gcmVkaXJlY3QgaXQgdG8gc3RkZXJyIG9yIHlvdSBvd24gbG9ncywgc29tZXRoaW5nIGxpa2UKK2BgYGhheGUKKy8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCitoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpIAoreyAKKwkvL3NpbXVsYXRlIG5vcm1hbCB0cmFjZSBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9ibG9iL2RldmVsb3BtZW50L3N0ZC9oYXhlL0xvZy5oeAorCXZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisJaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisJCXZhciBleHRyYTpTdHJpbmcgPSAiIjsKKwkJZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisJCQlleHRyYSArPSAiLCIgKyB2OworCQluZXdWYWx1ZSA9IHYgKyBleHRyYTsKKwl9CisJZWxzZSB7CisJCW5ld1ZhbHVlID0gdjsKKwl9CisJdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisJU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7Cit9CitgYGAKKworLSB0byBhbGxvdyB0aHJpZnQgc2VydmVyIHRvIHJlYWQvd3JpdGUgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLCBpdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdG8gcGhwIHN0cmVhbXMKK2BgYGhheGUKK3RyYW5zcG9ydCA9CW5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisJCQkJbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisJCQkJCW5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9vdXRwdXQiLCBBcHBlbmQpCisJCQkJCSkKKwkJCQkpOworYGBgCisKKy0gVFNpbXBsZVNlcnZlciBkb2Vzbid0IHN0b3AgYWZ0ZXIgZmlyc3QgY2FsbCwgc28gcHJvY2Vzc29yLnByb2Nlc3MoKSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQsIG9yIHVzZSBydW5PbmNlIHByb3BlcnR5IAorYGBgaGF4ZQordmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CitzZXJ2ZXIucnVuT25jZSA9IHRydWU7CitgYGAKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9oYXhlL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9oYXhlbGliLmpzb24gYi9saWIvaGF4ZS9oYXhlbGliLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyYWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisJIm5hbWUiOiAidGhyaWZ0IiwKKwkidXJsIiA6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorCSJsaWNlbnNlIjogIkFwYWNoZSIsCisJInRhZ3MiOiBbInRocmlmdCIsICJycGMiLCAic2VyaWFsaXphdGlvbiIsICJjcm9zcyIsICJmcmFtZXdvcmsiXSwKKwkiZGVzY3JpcHRpb24iOiAiSGF4ZSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yayIsCisJInZlcnNpb24iOiAiMS4wLjAiLAorCSJyZWxlYXNlbm90ZSI6ICJMaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LiIsCisJImNvbnRyaWJ1dG9ycyI6IFsiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiXSwKKwkiZGVwZW5kZW5jaWVzIjogeyB9LAorCSJjbGFzc1BhdGgiOiAic3JjIgorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0Fic3RyYWN0TWV0aG9kRXJyb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGI4MTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0Fic3RyYWN0TWV0aG9kRXJyb3IuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisjaWYgZmxhc2gKK2ltcG9ydCBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yOworI2Vsc2UKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworI2VuZAorCitjbGFzcyBBYnN0cmFjdE1ldGhvZEVycm9yCisjaWYgZmxhc2gKK2V4dGVuZHMgSWxsZWdhbE9wZXJhdGlvbkVycm9yCisjZWxzZQorZXh0ZW5kcyBURXhjZXB0aW9uCisjZW5kCit7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG1lc3NhZ2UgOiBTdHJpbmc9IiIpIHsKKyAgICAgICAgICBzdXBlcigiQXR0ZW1wdCB0byBjYWxsIGFuIGFic3RyYWN0IG1ldGhvZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FyZ3VtZW50RXJyb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2EwNGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FyZ3VtZW50RXJyb3IuaHgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisjaWYgISBmbGFzaAorLy8gcHJlZGVmaW5lZCBmb3IgZmxhc2ggb25seQorY2xhc3MgQXJndW1lbnRFcnJvciBleHRlbmRzIFRFeGNlcHRpb24geworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobXNnIDogU3RyaW5nID0gIiIpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CisjZW5kCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0xpbWl0cy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVlYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0xpbWl0cy5oeApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2NsYXNzIExpbWl0cyB7CisKKyAgICAvLyBIYXhlIGxpbWl0cyBhcmUgbm90IGZpeGVkIHZhbHVlcywgdGhleSBkZXBlbmQgb24gdGhlIHRhcmdldCBwbGF0Zm9ybQorICAgIC8vIEZvciBleGFtcGxlLCBuZWtvIGxpbWl0cyBhbiBpbnQgdG8gMzEgYml0cyBpbnN0ZWFkIG9mIDMyLiBTbyB3ZSBkZXRlY3QKKyAgICAvLyB0aGUgdmFsdWVzIG9uY2UgZHVyaW5nIGludGlhbGlzYXRpb24gaW4gb3JkZXIgdG8KKyAgICAvLyAoYSkgZ2V0IHRoZSByaWdodCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50ICBwbGF0Zm9ybSwgYW5kCisgICAgLy8gKGIpIHByZXZlbnQgdXMgZnJvbSBkZXBlbmRlY2llcyB0byBhIGJ1bmNoIG9mIGRlZmluZXMKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEkzMl9NQVggPSB7CisgICAgICAgIHZhciBsYXN0IDogSW50ID0gMDsKKyAgICAgICAgdmFyIG5leHQgOiBJbnQgPSAwOworICAgICAgICBmb3IoYml0IGluIDAgLi4uIDMyKSB7CisgICAgICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgICAgICAgIG5leHQgPSBsYXN0IHwgKDEgPDwgYml0KTsKKyAgICAgICAgICAgIGlmKG5leHQgPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGFzdDsgLy8gZmluYWwgdmFsdWUKKyAgICB9CisKKyAgICAvLyBhZGQgd2hhdGV2ZXIgeW91IG5lZWQKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU4NDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oeApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CisKKyAgLyoqCisgICAqIEFwcGxpY2F0aW9uIGxldmVsIGV4Y2VwdGlvbgorICAgKi8KK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRBUFBMSUNBVElPTl9FWENFUFRJT05fU1RSVUNUID0geyBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7IH07CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIE1FU1NBR0VfRklFTEQgPSB7IG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIDEpOyB9OworICAgIHByaXZhdGUgc3RhdGljIHZhciBUWVBFX0ZJRUxEID0geyBuZXcgVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCAyKTsgfTsKKworICAgIC8vIFdBUk5JTkc6IFRoZXNlIGFyZSBzdWJqZWN0IHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIHNvIHdlIGNhbid0IHVzZSBlbnVtcworICAgIC8vIHdpdGggSGF4ZSAzLjEuMyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjQ5CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV04gOiBJbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOX01FVEhPRCA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfTUVTU0FHRV9UWVBFIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgV1JPTkdfTUVUSE9EX05BTUUgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCQURfU0VRVUVOQ0VfSUQgOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNSVNTSU5HX1JFU1VMVCA6IEludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVEVSTkFMX0VSUk9SIDogSW50ID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUFJPVE9DT0xfRVJST1IgOiBJbnQgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJTlZBTElEX1RSQU5TRk9STSA6IEludCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfUFJPVE9DT0wgOiBJbnQgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA6IEludCA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0eXBlIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICBzdXBlcihtZXNzYWdlLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB2YXIgZmllbGQ6VEZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIHZhciBtZXNzYWdlIDogU3RyaW5nID0gbnVsbDsKKyAgICAgIHZhciB0eXBlIDogSW50ID0gVU5LTk9XTjsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOworICAgICAgICBpZiAoZXJyb3JNc2cgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihNRVNTQUdFX0ZJRUxEKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhlcnJvck1zZyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihUWVBFX0ZJRUxEKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoZXJyb3JJRCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUwYmViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4CkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLy8gTWFrZSBzdXJlIHdlIHVzZSBhdCBsZWFzdCAzLjEuMworLy8gU29tZSBMaW51eCBwbGF0Zm9ybXMgaGF2ZSB3YWFhYXkgdG9vIG9sZCBwYWNrYWdlcyBpbiB0aGVpciByZXBvcworLy8gUHJvIFRpcDogTG9vayBhdCBodHRwOi8vb3BlbmZsLmNvbSBmb3IgYSBnb29kIExpbnV4IGluc3RhbGwgc2NyaXB0CisjaWYoIGhheGVfdmVyIDwgMy4xMDMpCisjZXJyb3IgSGF4ZSAzLjEuMyBvciBuZXdlciByZXF1aXJlZCwgc29ycnkhCisjZW5kCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisKKyAgLyoqCisgICAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAgICoKKyAgICovCitpbnRlcmZhY2UgVEJhc2UgeworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZDsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgorICAgICAqLworICAgIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSWQgOiBJbnQpIDogQm9vbDsKKworICAgIC8qKgorICAgICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgaWQuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlCisgICAgICogYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJZCA6IEludCkgOiBEeW5hbWljOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElkIDogSW50LCB2YWx1ZSA6IER5bmFtaWMpIDogVm9pZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmYTFmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworY2xhc3MgVEV4Y2VwdGlvbiB7CisKKyAgICBAOmlzVmFyCisgICAgcHVibGljIHZhciBlcnJvcklEKGRlZmF1bHQsbnVsbCkgOiBJbnQ7CisgICAgQDppc1ZhcgorICAgIHB1YmxpYyB2YXIgZXJyb3JNc2coZGVmYXVsdCxudWxsKSA6IFN0cmluZzsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtc2cgOiBTdHJpbmcgPSAiIiwgaWQgOiBJbnQgPSAwKSB7CisgICAgICAgIGVycm9ySUQgPSBpZDsKKyAgICAgICAgZXJyb3JNc2cgPSBtc2c7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5YTJjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuaHgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisgIC8qKgorICAgKiBSZXF1aXJlbWVudCB0eXBlIGNvbnN0YW50cy4KKyAgICoKKyAgICovCitAOmVudW0KK2Fic3RyYWN0IFRGaWVsZFJlcXVpcmVtZW50VHlwZShJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUkVRVUlSRUQgOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBPUFRJT05BTCA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFRkFVTFQgIDogSW50ID0gMzsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiNmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KKyAqLworaW50ZXJmYWNlIFRQcm9jZXNzb3IgeworICAgIGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXQ6VFByb3RvY29sLCBvdXRwdXQ6VFByb3RvY29sKSA6IEJvb2w7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0JpdENvbnZlcnRlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGFhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0JpdENvbnZlcnRlci5oeApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworCitjbGFzcyBCaXRDb252ZXJ0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEb3VibGVUb0ludDY0Qml0cyggZGIgOiBGbG9hdCkgOiBJbnQ2NCB7CisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFkZERvdWJsZSggZGIpOworICAgICAgICByZXR1cm4gYnl0ZXNUb0xvbmcoIGJ1Zi5nZXRCeXRlcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSW50NjRCaXRzVG9Eb3VibGUoIGk2NCA6IEludDY0KSA6IEZsb2F0IHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBidWYuYWRkKCBmaXhlZExvbmdUb0J5dGVzKCBpNjQpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXRCeXRlcygpLmdldERvdWJsZSgwKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nCisgICAgICogdW50aWwgb2ZmKzcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaXhlZExvbmdUb0J5dGVzKCBuIDogSW50NjQpICA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGJ1ZiA9IEJ5dGVzLmFsbG9jKDgpOworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICBidWYuc2V0KCAwLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggbiwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggMSwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgOCksICBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCAyLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAxNiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDMsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDI0KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNCwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgMzIpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA1LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0MCksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDYsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQ4KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNywgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgNTYpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICAjZWxzZQorICAgICAgICBidWYuc2V0KCAwLCBJbnQ2NC5hbmQoIG4sIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDEsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA4KSwgIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDIsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAxNiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDMsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAyNCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDQsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAzMiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDUsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0MCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDYsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0OCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDcsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA1NiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgICNlbmQKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKyAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBieXRlc1RvTG9uZyggYnl0ZXMgOiBCeXRlcykgOiBJbnQ2NCB7CisgICAgICAgIHZhciByZXN1bHQgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwgMCk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg3KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoNikpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDUpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg0KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMykpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDIpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgxKSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMCkpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3RCVEwoIHRlc3QgOiBJbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA6IEJ5dGVzID0gZml4ZWRMb25nVG9CeXRlcyggdGVzdCk7CisgICAgICAgIHZhciBlcmcgPSBieXRlc1RvTG9uZyhidWYpOworICAgICAgICBpZiAoIEludDY0LmNvbXBhcmUoIGVyZywgdGVzdCkgIT0gMCkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIuYnl0ZXNUb0xvbmdUZXN0KCR0ZXN0KSBmYWlsZWQ6ICRlcmcnOworICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3RQYWlyKCBhIDogRmxvYXQsIGIgOiBJbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ4ID0gRG91YmxlVG9JbnQ2NEJpdHMoYSk7CisgICAgICAgIGlmICggSW50NjQuY29tcGFyZSggYngsIGIpICE9IDApCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyLlRlc3RQYWlyOiBEb3VibGVUb0ludDY0Qml0cygkYSk6IGV4cGVjdGVkICRiLCBnb3QgJGJ4JzsKKyAgICAgICAgdmFyIGF4ID0gSW50NjRCaXRzVG9Eb3VibGUoYik7CisgICAgICAgIGlmKCBheCAhPSBhKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlci5UZXN0UGFpcjogSW50NjRCaXRzVG9Eb3VibGUoJGI6IGV4cGVjdGVkICRhLCBnb3QgICRheCc7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVbml0VGVzdCgpIDogVm9pZCB7CisKKyAgICAgICAgLy8gYnl0ZXNUb0xvbmcoKQorICAgICAgICB2YXIgaSA6IEludDsKKyAgICAgICAgVGVzdEJUTCggSW50NjQubWFrZSgwLDApKTsKKyAgICAgICAgZm9yICggaSBpbiAwIC4uLiA2MikgeworICAgICAgICAgICAgVGVzdEJUTCggSW50NjQuc2hsKCBJbnQ2NC5tYWtlKDAsMSksIGkpKTsKKyAgICAgICAgICAgIFRlc3RCVEwoIEludDY0LnN1YiggSW50NjQubWFrZSgwLDApLCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKDB4N0ZGRkZGRkYsMHhGRkZGRkZGRikpOworICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKGNhc3QoMHg4MDAwMDAwMCxJbnQpLDB4MDAwMDAwMDApKTsKKworICAgICAgICAvLyBEb3VibGVUb0ludDY0Qml0czsKKyAgICAgICAgVGVzdFBhaXIoIDEuMDAwMDAwMDAwMDAwMDAwMEUrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NC5tYWtlKGNhc3QoMHg0MDJFMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAyLjU1MDAwMDAwMDAwMDAwMDBFKzAwMiwgIEludDY0Lm1ha2UoY2FzdCgweDQwNkZFMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuMjk0OTY3Mjk1MDAwMDAwMEUrMDA5LCAgSW50NjQubWFrZShjYXN0KDB4NDFFRkZGRkYsSW50KSxjYXN0KDB4RkZFMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRjcwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAyLjMyODMwNjQzNjUzODY5NjNFLTAxMCwgIEludDY0Lm1ha2UoY2FzdCgweDNERjAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzMDAwMEUtMzAwLCAgSW50NjQubWFrZShjYXN0KDB4MDFBQTc0RkUsSW50KSxjYXN0KDB4MUMxRTdFNDUsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NC5tYWtlKGNhc3QoMHgyMEQwMkEzNixJbnQpLGNhc3QoMHg1ODZEQjRCQixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjVFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDNGRjNDMENBLEludCksY2FzdCgweDQyOEM1OUZBLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2N0UrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGM0MwQ0EsSW50KSxjYXN0KDB4NDI4QzU5RkIsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYzQzBDQSxJbnQpLGNhc3QoMHg0MjhDNTlGQyxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzE1MCwgIEludDY0Lm1ha2UoY2FzdCgweDVGMTgyMzQ0LEludCksY2FzdCgweENEM0NERjlGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMzAwLCAgSW50NjQubWFrZShjYXN0KDB4N0UzRDdFRTgsSW50KSxjYXN0KDB4QkNCQkQzNTIsSW50KSkpOworICAgICAgICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NC5tYWtlKGNhc3QoMHhGRkVGRkZGRixJbnQpLGNhc3QoMHhGRkZGRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgIEludDY0Lm1ha2UoY2FzdCgweDdGRUZGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDY1NEUtMzI0LCAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCA0Ljk0MDY1NjQ1ODQxMjQ3RS0zMjQsICAgIEludDY0Lm1ha2UoY2FzdCgweDAwMDAwMDAwLEludCksY2FzdCgweDAwMDAwMDAxLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDMuMjM3ODU5MjEwMDIwNjA5MkUtMzE5LCAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMEZGRkYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwRkZGRixJbnQpLGNhc3QoMHhGRkZGRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCBNYXRoLk5FR0FUSVZFX0lORklOSVRZLCAgIEludDY0Lm1ha2UoY2FzdCgweEZGRjAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIE1hdGguUE9TSVRJVkVfSU5GSU5JVFksICAgSW50NjQubWFrZShjYXN0KDB4N0ZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworCisgICAgICAgIC8vIE5hTiBpcyBzcGVjaWFsCisgICAgICAgIHZhciBpNjRuYW4gPSBEb3VibGVUb0ludDY0Qml0cyggTWF0aC5OYU4pOworICAgICAgICB2YXIgaTY0Y21wID0gSW50NjQubWFrZShjYXN0KDB4RkZGODAwMDAsIEludCksIGNhc3QoMHgwMDAwMDAwMCwgSW50KSk7CisgICAgICAgIGlmICggISBNYXRoLmlzTmFOKCBJbnQ2NEJpdHNUb0RvdWJsZSggaTY0Y21wKSkpCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyIE5hTi1UZXN0ICMxOiBleHBlY3RlZCBOYU4nOworCisgICAgICAgIC8vIEZvciBkb3VibGVzLCBhIHF1aWV0IE5hTiBpcyBhIGJpdCBwYXR0ZXJuCisgICAgICAgIC8vIGJldHdlZW4gN0ZGODAwMDAwMDAwMDAwMCBhbmQgN0ZGRkZGRkZGRkZGRkZGRgorICAgICAgICAvLyAgICAgIG9yIEZGRjgwMDAwMDAwMDAwMDAgYW5kIEZGRkZGRkZGRkZGRkZGRkYKKyAgICAgICAgdmFyIG1pbjEgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4N0ZGODAwMDAsIEludCksIGNhc3QoMHgwMDAwMDAwMCwgSW50KSk7CisgICAgICAgIHZhciBtYXgxID0gSW50NjQubWFrZSggY2FzdCgweDdGRkZGRkZGLCBJbnQpLCBjYXN0KDB4RkZGRkZGRkYsIEludCkpOworICAgICAgICB2YXIgbWluMiA9IEludDY0Lm1ha2UoIGNhc3QoMHhGRkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgdmFyIG1heDIgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4RkZGRkZGRkYsIEludCksIGNhc3QoMHhGRkZGRkZGRiwgSW50KSk7CisgICAgICAgIHZhciBvazEgPSAgKEludDY0LmNvbXBhcmUoIG1pbjEsIGk2NG5hbikgPD0gMCkgJiYgKEludDY0LmNvbXBhcmUoIGk2NG5hbiwgbWF4MSkgPD0gMCk7CisgICAgICAgIHZhciBvazIgPSAgKEludDY0LmNvbXBhcmUoIG1pbjIsIGk2NG5hbikgPD0gMCkgJiYgKEludDY0LmNvbXBhcmUoIGk2NG5hbiwgbWF4MikgPD0gMCk7CisgICAgICAgIGlmKCAhIChvazEgfHwgb2syKSkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIgTmFOLVRlc3QgIzI6IGZhaWxlZCc7CisgICAgfQorICAgICNlbmQKKworfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludDY0TWFwLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludDY0TWFwLmh4CkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7CisKKworLy8gSW50NjRNYXAgYWxsb3dzIG1hcHBpbmcgb2YgSW50NjQga2V5cyB0byBhcmJpdHJhcnkgdmFsdWVzLgorLy8gT2JqZWN0TWFwPD4gY2Fubm90IGJlIHVzZWQsIHNpbmNlIHdlIHdhbnQgdG8gY29tcGFyZSBieSB2YWx1ZSwgbm90IGFkZHJlc3MKKworY2xhc3MgSW50NjRNYXA8VD4gaW1wbGVtZW50cyBJTWFwPCBJbnQ2NCwgVD4geworCisgICAgcHJpdmF0ZSB2YXIgU3ViTWFwcyA6IEludE1hcDwgSW50TWFwPCBUPj47ICAvLyBIaSAtPiBMbyAtPiBWYWx1ZQorCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIDogVm9pZCB7CisgICAgICAgIFN1Yk1hcHMgPSBuZXcgSW50TWFwPCBJbnRNYXA8IFQ+PigpOworICAgIH07CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldFN1Yk1hcCggaGkgOiBoYXhlLkludDMyLCBjYW5DcmVhdGUgOiBCb29sKSA6IEludE1hcDwgVD4geworICAgICAgICBpZiggU3ViTWFwcy5leGlzdHMoaGkpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ViTWFwcy5nZXQoaGkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEgY2FuQ3JlYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IG5ldyBJbnRNYXA8IFQ+KCk7CisgICAgICAgIFN1Yk1hcHMuc2V0KCBoaSwgbG9tYXApOworICAgICAgICByZXR1cm4gbG9tYXA7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldExvd01hcCgga2V5IDogaGF4ZS5JbnQ2NCwgY2FuQ3JlYXRlIDogQm9vbCkgOiBJbnRNYXA8IFQ+IHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIEdldFN1Yk1hcCggSW50NjQuZ2V0SGlnaChrZXkpLCBjYW5DcmVhdGUpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4gR2V0U3ViTWFwKCBrZXkuaGlnaCwgY2FuQ3JlYXRlKTsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBHZXRMb3dJbmRleCgga2V5IDogaGF4ZS5JbnQ2NCkgOiBoYXhlLkludDMyIHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIEludDY0LmdldExvdyhrZXkpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4ga2V5LmxvdzsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBOdWxsQ2hlY2soIGtleSA6IGhheGUuSW50NjQpIDogQm9vbCB7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEludDY0IGlzIG5vdCBudWxsYWJsZSBhbnltb3JlIChpdCBuZXZlciByZWFsbHkgd2FzKQorICAgICAgICAjZW5kCisgICAgfTsKKworCisKKyAgICAvKioKKyAgICAgICAgTWFwcyBga2V5YCB0byBgdmFsdWVgLgorICAgICAgICBJZiBga2V5YCBhbHJlYWR5IGhhcyBhIG1hcHBpbmcsIHRoZSBwcmV2aW91cyB2YWx1ZSBkaXNhcHBlYXJzLgorICAgICAgICBJZiBga2V5YCBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoIGtleSA6IEludDY0LCB2YWx1ZSA6IFQgKSA6IFZvaWQgeworICAgICAgICBpZiggISBOdWxsQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBsb21hcC5zZXQoIEdldExvd0luZGV4KGtleSksIHZhbHVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgYGtleWAuCisgICAgICAgIElmIG5vIHN1Y2ggbWFwcGluZyBleGlzdHMsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisKKyAgICAgICAgTm90ZSB0aGF0IGEgY2hlY2sgbGlrZSBgbWFwLmdldChrZXkpID09IG51bGxgIGNhbiBob2xkIGZvciB0d28gcmVhc29uczoKKworICAgICAgICAgICAgMS4gdGhlIG1hcCBoYXMgbm8gbWFwcGluZyBmb3IgYGtleWAKKyAgICAgICAgICAgIDIuIHRoZSBtYXAgaGFzIGEgbWFwcGluZyB3aXRoIGEgdmFsdWUgb2YgYG51bGxgCisKKyAgICAgICAgSWYgaXQgaXMgaW1wb3J0YW50IHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzLCBgZXhpc3RzKClgIHNob3VsZCBiZQorICAgICAgICB1c2VkLgorCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldCgga2V5IDogSW50NjQpIDogTnVsbDxUPiB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvbWFwLmdldCggR2V0TG93SW5kZXgoa2V5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBga2V5YCBoYXMgYSBtYXBwaW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGV4aXN0cygga2V5IDogSW50NjQpIDogQm9vbCB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbG9tYXAgPSBHZXRMb3dNYXAoIGtleSwgdHJ1ZSk7CisgICAgICAgIGlmKCBsb21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9tYXAuZXhpc3RzKCBHZXRMb3dJbmRleChrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmVtb3ZlcyB0aGUgbWFwcGluZyBvZiBga2V5YCBhbmQgcmV0dXJucyB0cnVlIGlmIHN1Y2ggYSBtYXBwaW5nIGV4aXN0ZWQsCisgICAgICAgIGZhbHNlIG90aGVyd2lzZS4gSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCBrZXkgOiBJbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb21hcC5yZW1vdmUoIEdldExvd0luZGV4KGtleSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgYW4gSXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBgdGhpc2AgTWFwLgorICAgICAgICBUaGUgb3JkZXIgb2Yga2V5cyBpcyB1bmRlZmluZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGtleXMoKSA6IEl0ZXJhdG9yPEludDY0PiB7CisgICAgICAgIHJldHVybiBuZXcgSW50NjRLZXlJdGVyYXRvcjxUPihTdWJNYXBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYHRoaXNgIE1hcC4KKyAgICAgICAgVGhlIG9yZGVyIG9mIHZhbHVlcyBpcyB1bmRlZmluZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCkgOiBJdGVyYXRvcjxUPiB7CisgICAgICAgIHJldHVybiBuZXcgSW50NjRWYWx1ZUl0ZXJhdG9yPFQ+KFN1Yk1hcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGB0aGlzYCBNYXAuCisgICAgICAgIFRoZSBleGFjdCByZXByZXNlbnRhdGlvbiBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybSBhbmQga2V5LXR5cGUuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgcmVzdWx0IDogU3RyaW5nID0gInsiOworCisgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvcigga2V5IGluIHRoaXMua2V5cygpKSB7CisgICAgICAgICAgICBpZiggZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiwiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSBJbnQ2NC50b1N0cihrZXkpICsgJyA9PiAkdmFsdWUnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKKyAgICB9CisKK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHJpdmF0ZSB2YXIgU3ViTWFwcyA6IEludE1hcDwgSW50TWFwPCBUPj47ICAvLyBIaSAtPiBMbyAtPiBWYWx1ZQorCisgICAgcHJpdmF0ZSB2YXIgSGlJdGVyYXRvciA6IEl0ZXJhdG9yPCBJbnQ+ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBMb0l0ZXJhdG9yIDogSXRlcmF0b3I8IEludD4gPSBudWxsOworICAgIHByaXZhdGUgdmFyIEN1cnJlbnRIaSA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBkYXRhIDogSW50TWFwPCBJbnRNYXA8IFQ+PikgOiBWb2lkIHsKKyAgICAgICAgU3ViTWFwcyA9IGRhdGE7CisgICAgICAgIEhpSXRlcmF0b3IgPSBTdWJNYXBzLmtleXMoKTsKKyAgICAgICAgTG9JdGVyYXRvciA9IG51bGw7CisgICAgICAgIEN1cnJlbnRIaSA9IDA7CisgICAgfTsKKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBpdGVyYXRpb24gaXMgY29tcGxldGUsIHRydWUgb3RoZXJ3aXNlLgorCisgICAgICAgIFVzdWFsbHkgaXRlcmF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUgY29tcGxldGUgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZQorICAgICAgICB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIHdlcmUgaGFuZGxlZCB0aHJvdWdoIGNhbGxzIHRvIG5leHQoKS4gSG93ZXZlciwKKyAgICAgICAgaW4gY3VzdG9tIGl0ZXJhdG9ycyBhbnkgbG9naWMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb21wbGV0aW9uCisgICAgICAgIHN0YXRlLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNOZXh0KCkgOiBCb29sIHsKKworICAgICAgICBpZiggKExvSXRlcmF0b3IgIT0gbnVsbCkgJiYgTG9JdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoIChIaUl0ZXJhdG9yICE9IG51bGwpICYmIEhpSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBDdXJyZW50SGkgPSBIaUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIExvSXRlcmF0b3IgPSBTdWJNYXBzLmdldChDdXJyZW50SGkpLmtleXMoKTsKKyAgICAgICAgICAgIGlmKCAoTG9JdGVyYXRvciAhPSBudWxsKSAmJiBMb0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSGlJdGVyYXRvciA9IG51bGw7CisgICAgICAgIExvSXRlcmF0b3IgPSBudWxsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CisKKworLy8gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBJbnQ2NE1hcDxUPgorLy8gYWxsIGNsYXNzIHdpdGggbWF0Y2hpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBpdGVyYXRvciAoZHVjayB0eXBpbmcpCitwcml2YXRlIGNsYXNzIEludDY0S2V5SXRlcmF0b3I8VD5leHRlbmRzIEludDY0TWFwSXRlcmF0b3JCYXNlPFQ+IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBzdXBlcihkYXRhKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgaXRlbSBvZiB0aGUgSXRlcmF0b3IgYW5kIGFkdmFuY2VzIHRvIHRoZSBuZXh0IG9uZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gY2hlY2sgaGFzTmV4dCgpIGZpcnN0LiBBIGNhbGwgdG8gdGhpcworICAgICAgICBtZXRob2Qgd2hpbGUgaGFzTmV4dCgpIGlzIGZhbHNlIHlpZWxkcyB1bnNwZWNpZmllZCBiZWhhdmlvci4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIDogSW50NjQgeworICAgICAgICBpZiggaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSW50NjQubWFrZSggQ3VycmVudEhpLCBMb0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAibm8gbW9yZSBlbGVtZW50cyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBJbnQ2NE1hcDxUPgorLy8gYWxsIGNsYXNzIHdpdGggbWF0Y2hpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBpdGVyYXRvciAoZHVjayB0eXBpbmcpCitwcml2YXRlIGNsYXNzIEludDY0VmFsdWVJdGVyYXRvcjxUPiBleHRlbmRzIEludDY0TWFwSXRlcmF0b3JCYXNlPFQ+IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBzdXBlcihkYXRhKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgaXRlbSBvZiB0aGUgSXRlcmF0b3IgYW5kIGFkdmFuY2VzIHRvIHRoZSBuZXh0IG9uZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gY2hlY2sgaGFzTmV4dCgpIGZpcnN0LiBBIGNhbGwgdG8gdGhpcworICAgICAgICBtZXRob2Qgd2hpbGUgaGFzTmV4dCgpIGlzIGZhbHNlIHlpZWxkcyB1bnNwZWNpZmllZCBiZWhhdmlvci4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIDogVCB7CisgICAgICAgIGlmKCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJNYXBzLmdldChDdXJyZW50SGkpLmdldChMb0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAibm8gbW9yZSBlbGVtZW50cyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludFNldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTVkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludFNldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIEludFNldCB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5JbnRNYXA8SW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PEludD4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8SW50PiB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0cmFjZUFsbCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCckX3NpemUgZW50cmllcycpOworICAgICAgICBmb3IoZW50cnkgaW4gdGhpcykgeworICAgICAgICAgICAgdmFyIHllcyA9IGNvbnRhaW5zKGVudHJ5KTsKKyAgICAgICAgICAgIHRyYWNlKCctICRlbnRyeSwgY29udGFpbnMoKSA9ICR5ZXMnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobyA6IEludCkgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogSW50KSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IEludCkgOiBCb29sIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKG8pKSB7CisgICAgICAgICAgICBfZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSA6IEFycmF5PEludD4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8SW50PiA9IG5ldyBBcnJheTxJbnQ+KCk7CisgICAgICAgIGZvciAoa2V5IGluIF9lbGVtZW50cy5rZXlzKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpemUoKSA6IEludCB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9PYmplY3RTZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Y3MmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9PYmplY3RTZXQuaHgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IE1hcDsKKworCitjbGFzcyBPYmplY3RTZXQ8Sz4geworCisgICAgcHJpdmF0ZSB2YXIgX2VsZW1lbnRzID0gbmV3IGhheGUuZHMuT2JqZWN0TWFwPEssSW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PEs+ID0gbnVsbCkgeworICAgICAgICBpZiAoIHZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKCB2YWx1ZSBpbiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpdGVyYXRvcigpOkl0ZXJhdG9yPEs+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogSykgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogSykgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5leGlzdHMobyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX3NpemUgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKG8gOiBLKSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8Sz4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8Sz4gPSBuZXcgQXJyYXk8Sz4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1N0cmluZ1NldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzBkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1N0cmluZ1NldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIFN0cmluZ1NldCB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5TdHJpbmdNYXA8SW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PFN0cmluZz4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8U3RyaW5nPiB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0cmFjZUFsbCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCckX3NpemUgZW50cmllcycpOworICAgICAgICBmb3IoZW50cnkgaW4gdGhpcykgeworICAgICAgICAgICAgdmFyIHllcyA9IGNvbnRhaW5zKGVudHJ5KTsKKyAgICAgICAgICAgIHRyYWNlKCctICRlbnRyeSwgY29udGFpbnMoKSA9ICR5ZXMnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobyA6IFN0cmluZykgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IFN0cmluZykgOiBCb29sIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKG8pKSB7CisgICAgICAgICAgICBfZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSA6IEFycmF5PFN0cmluZz4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8U3RyaW5nPiA9IG5ldyBBcnJheTxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoa2V5IGluIF9lbGVtZW50cy5rZXlzKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpemUoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9aaWdaYWcuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2MDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9aaWdaYWcuaHgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuSW50MzI7CisKK2NsYXNzIFppZ1phZyB7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGcm9tSW50KCBuIDogSW50KSA6IFVJbnQgICAgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgcmV0dXJuIGNhc3QoY2FzdChjYXN0KG4sSW50MzIpIDw8IDEsSW50MzIpIF4gY2FzdChjYXN0KG4sSW50MzIpID4+IDMxLEludDMyKSxVSW50KTsKKworICAgICAgICAjZWxzZQorCisgICAgICAgIHJldHVybiBjYXN0KG4gPDwgMSxVSW50KSBeIGNhc3QobiA+PiAzMSxVSW50KTsKKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUb0ludCggbiA6IFVJbnQpIDogSW50IHsKKyAgICAgICAgI2lmIHBocAorCisgICAgICAgIHZhciBhID0gKDB4N0ZGRkZGRkYgJiBjYXN0KG4gPj4gMSxJbnQpKTsKKyAgICAgICAgdmFyIGIgPSAoY2FzdChuICYgMSxJbnQpKTsKKyAgICAgICAgYiA9IC1iOyAgLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzUyODgKKyAgICAgICAgcmV0dXJuIGEgXiBiOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuICgweDdGRkZGRkZGICYgY2FzdChuID4+IDEsSW50KSkgXiAoLWNhc3QobiAmIDEsSW50KSk7CisKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZyb21Mb25nKCBuIDogSW50NjQpIDogSW50NjQgeworICAgICAgICByZXR1cm4gSW50NjQueG9yKCBJbnQ2NC5zaGwobiwgMSksIEludDY0LnNocihuLCA2MykpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUb0xvbmcoIG4gOiBJbnQ2NCkgOiBJbnQ2NCB7CisgICAgICAgIHJldHVybiBJbnQ2NC54b3IoCisgICAgICAgICAgICBJbnQ2NC5hbmQoCisgICAgICAgICAgICAgICAgSW50NjQuc2hyKG4sIDEpLAorICAgICAgICAgICAgICAgIEludDY0Lm1ha2UoMHg3RkZGRkZGRiwgMHhGRkZGRkZGRikpLAorICAgICAgICAgICAgSW50NjQuc3ViKAorICAgICAgICAgICAgICAgIEludDY0Lm1ha2UoMCwgMCksCisgICAgICAgICAgICAgICAgSW50NjQuYW5kKG4sIEludDY0Lm1ha2UoMCwxKSkpKTsKKyAgICB9CisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3QzMiggdGVzdCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGEgOiBVSW50ID0gWmlnWmFnLkZyb21JbnQoIHRlc3QpOworICAgICAgICB2YXIgYiA6IEludCA9IFppZ1phZy5Ub0ludChhKTsKKyAgICAgICAgI2lmIHBocAorICAgICAgICB0ZXN0ID0gdGVzdCAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgICAjZW5kCisgICAgICAgIGlmKCB0ZXN0ICE9IGIpCisgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3QzMigkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CisgICAgfQorICAgICNlbmQKKworCisKKyAgICAjaWYgZGVidWcKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBUZXN0NjQoIHRlc3QgOiBoYXhlLkludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYSA6IEludDY0ID0gWmlnWmFnLkZyb21Mb25nKCB0ZXN0KTsKKyAgICAgICAgdmFyIGIgOiBJbnQ2NCA9IFppZ1phZy5Ub0xvbmcoYSk7CisgICAgICAgIGlmKCBJbnQ2NC5jb21wYXJlKCB0ZXN0LCBiKSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgJ1ppZ1phZy5UZXN0NjQoJHRlc3QpIGZhaWxlZDogYSA9ICRhLCBiID0gJGInOworICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiBkZWJ1ZworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVW5pdFRlc3QoKSA6IFZvaWQgeworICAgICAgdmFyIHUxIDogVUludCA9IDB4RkZGRkZGRkU7CisgICAgICB2YXIgdTIgOiBVSW50ID0gMHhGRkZGRkZGRjsKKyAgICAgIHZhciBpMSA6IEludCA9IDIxNDc0ODM2NDc7CisgICAgICB2YXIgaTIgOiBJbnQgPSAtMjE0NzQ4MzY0ODsKKworICAgICAgI2lmIHBocAorICAgICAgaTIgPSBpMiAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgI2VuZAorCisgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgICAgIGlmKCBGcm9tSW50KDApICAhPSAwKSB0aHJvdyAncGIgIzEgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KC0xKSAhPSAxKSB0aHJvdyAncGIgIzIgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KDEpICAhPSAyKSB0aHJvdyAncGIgIzMgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KC0yKSAhPSAzKSB0aHJvdyAncGIgIzQgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KGkxKSAhPSB1MSkgdGhyb3cgJ3BiICM1IHRvIFppZ1phZyc7CisgICAgICBpZiggRnJvbUludChpMikgIT0gdTIpIHRocm93ICdwYiAjNiB0byBaaWdaYWcnOworCisgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgICAgIGlmKCBUb0ludCgwKSAhPSAwKSB0aHJvdyAncGIgIzEgZnJvbSBaaWdaYWcnOworICAgICAgaWYoIFRvSW50KDEpICE9IC0xKSB0aHJvdyAncGIgIzIgZnJvbSBaaWdaYWcnOworICAgICAgaWYoIFRvSW50KDIpICE9IDEpIHRocm93ICdwYiAjMyBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMykgIT0gLTIpIHRocm93ICdwYiAjNCBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQodTEpICE9IGkxKSB0aHJvdyAncGIgIzUgZnJvbSBaaWdaYWcsIGdvdCAke1RvSW50KHUxKX0gZXhwZWN0ZWQgJGkxJzsKKyAgICAgIGlmKCBUb0ludCh1MikgIT0gaTIpIHRocm93ICdwYiAjNiBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTIpfSBleHBlY3RlZCAkaTInOworCisgICAgICAvLyBiYWNrIGFuZCBmb3J0aCAzMgorICAgICAgVGVzdDMyKCAwKTsKKyAgICAgIGZvciggaSBpbiAwIC4uLiAzMCkgeworICAgICAgICBUZXN0MzIoIDEgPDwgaSk7CisgICAgICAgIFRlc3QzMiggLSgxICA8PCBpKSk7CisgICAgICB9CisgICAgICBUZXN0MzIoIDB4N0ZGRkZGRkYpOworICAgICAgVGVzdDMyKCBjYXN0KDB4ODAwMDAwMDAsSW50KSk7CisKKyAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDY0CisgICAgICBUZXN0NjQoIEludDY0Lm1ha2UoMCwwKSk7CisgICAgICBmb3IoIGkgaW4gMCAuLi4gNjIpIHsKKyAgICAgICAgVGVzdDY0KCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpOworICAgICAgICBUZXN0NjQoIEludDY0LnN1YiggSW50NjQubWFrZSgwLDApLCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpKTsKKyAgICAgIH0KKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZSgweDdGRkZGRkZGLDB4RkZGRkZGRkYpKTsKKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZShjYXN0KDB4ODAwMDAwMDAsSW50KSwweDAwMDAwMDAwKSk7CisgICAgfQorICAgICNlbmQKK30KKworICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7CisKKy8qKgorKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgbWV0YSBkYXRhIGFib3V0IHRocmlmdCBmaWVsZHMuIEV2ZXJ5IGZpZWxkIGluIGEKKyogYSBzdHJ1Y3Qgc2hvdWxkIGhhdmUgYSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZGVzY3JpYmluZyBpdC4KKyoKKyovCitjbGFzcyBGaWVsZE1ldGFEYXRhIHsKKworICBwdWJsaWMgdmFyIGZpZWxkTmFtZSA6IFN0cmluZzsKKyAgcHVibGljIHZhciByZXF1aXJlbWVudFR5cGUgOiBJbnQ7CisgIHB1YmxpYyB2YXIgdmFsdWVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgcHJpdmF0ZSBzdGF0aWMgdmFyIHN0cnVjdE1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsKKworICBwdWJsaWMgZnVuY3Rpb24gRmllbGRNZXRhRGF0YShuYW1lIDogU3RyaW5nLCByZXEgOiBJbnQsIHZNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICB0aGlzLmZpZWxkTmFtZSA9IG5hbWU7CisgICAgdGhpcy5yZXF1aXJlbWVudFR5cGUgPSByZXE7CisgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChzQ2xhc3M6Q2xhc3MsIG1hcDpEaWN0aW9uYXJ5KSA6IFZvaWR7CisgICAgc3RydWN0TWFwW3NDbGFzc10gPSBtYXA7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG1hcCB3aXRoIG1ldGFkYXRhIChpLmUuIGluc3RhbmNlcyBvZiBGaWVsZE1ldGFEYXRhKSB0aGF0CisgICAqIGRlc2NyaWJlIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3RydWN0TWV0YURhdGFNYXAoc0NsYXNzOkNsYXNzKTpEaWN0aW9uYXJ5IHsKKyAgICByZXR1cm4gc3RydWN0TWFwW3NDbGFzc107CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3OWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworLyoqCisgKiBGaWVsZFZhbHVlTWV0YURhdGEgYW5kIGNvbGxlY3Rpb24gb2Ygc3ViY2xhc3NlcyB0byBzdG9yZSBtZXRhZGF0YSBhYm91dAorICogdGhlIHZhbHVlKHMpIG9mIGEgZmllbGQKKyAqLworY2xhc3MgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisKKyAgcHVibGljIGZ1bmN0aW9uIEZpZWxkVmFsdWVNZXRhRGF0YSh0eXBlIDogSW50KSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cnVjdCgpIDogQm9vbCB7CisgICAgcmV0dXJuIHR5cGUgPT0gVFR5cGUuU1RSVUNUOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGlzQ29udGFpbmVyKCkgOiBCb29sIHsKKyAgICByZXR1cm4gdHlwZSA9PSBUVHlwZS5MSVNUIHx8IHR5cGUgPT0gVFR5cGUuTUFQIHx8IHR5cGUgPT0gVFR5cGUuU0VUOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2EzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBMaXN0TWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworCisgICAgcHVibGljIHZhciBlbGVtTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworCisgICAgcHVibGljIGZ1bmN0aW9uIExpc3RNZXRhRGF0YSh0eXBlIDogSW50LCBlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICAgIH0KK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYzZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBNYXBNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGtleU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKyAgICBwdWJsaWMgdmFyIHZhbHVlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworCisgICAgcHVibGljIGZ1bmN0aW9uIE1hcE1ldGFEYXRhKHR5cGUgOiBJbnQsIGtNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEsIHZNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUpOworICAgICAgdGhpcy5rZXlNZXRhRGF0YSA9IGtNZXRhRGF0YTsKKyAgICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKKyAgICB9Cit9CisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM2N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBTZXRNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1NZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU2V0TWV0YURhdGEodHlwZSA6IEludCwgZU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLmVsZW1NZXRhRGF0YSA9IGVNZXRhRGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBTdHJ1Y3RNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIHN0cnVjdENsYXNzOkNsYXNzOworCisgICAgcHVibGljIGZ1bmN0aW9uIFN0cnVjdE1ldGFEYXRhKHR5cGUgOiBJbnQsIHNDbGFzczpDbGFzcykgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLnN0cnVjdENsYXNzID0gc0NsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjI5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmh4CkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorKiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgQU5PTllNT1VTX1NUUlVDVDpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVkVSU0lPTl9NQVNLIDogaGF4ZS5JbnQzMiA9IDB4ZmZmZjAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OXzEgOiBoYXhlLkludDMyID0gMHg4MDAxMDAwMDsKKworICAgIHByaXZhdGUgdmFyIHN0cmljdFJlYWRfIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgdmFyIHN0cmljdFdyaXRlXyA6IEJvb2wgPSB0cnVlOworICAgIHByaXZhdGUgdmFyIHRyYW5zXyA6IFRUcmFuc3BvcnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcodHJhbnM6VFRyYW5zcG9ydCwgc3RyaWN0UmVhZCA6IEJvb2w9ZmFsc2UsIHN0cmljdFdyaXRlIDogQm9vbD10cnVlKSB7CisgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKTpUVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiB0cmFuc187CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICB2YXIgdmVyc2lvbiA6IEludCA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKKyAgICAgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICAgICAgd3JpdGVCeXRlKG1lc3NhZ2UudHlwZSk7CisgICAgICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3Q6VFN0cnVjdCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICAgIHdyaXRlSTMyKG1hcC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQgeworICAgICAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CisgICAgICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOworICAgICAgICB3cml0ZUkzMihzZXQuc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoYiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlQnl0ZShiKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoaTE2IDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVJbnQxNihpMTYpOworICAgICAgICB0cmFuc18ud3JpdGUob3V0LmdldEJ5dGVzKCksIDAsIDIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIG91dC53cml0ZUludDMyKGkzMik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIHZhciBoaSA9IEludDY0LmdldEhpZ2goaTY0KTsKKyAgICAgICAgdmFyIGxvID0gSW50NjQuZ2V0TG93KGk2NCk7CisgICAgICAgIG91dC53cml0ZUludDMyKGhpKTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIobG8pOworICAgICAgICAjZWxzZQorICAgICAgICBvdXQud3JpdGVJbnQzMihpNjQuaGlnaCk7CisgICAgICAgIG91dC53cml0ZUludDMyKGk2NC5sb3cpOworICAgICAgICAjZW5kCisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGR1YjpGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlRG91YmxlKGR1Yik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nKHN0cik7CisgICAgICAgIHZhciBieXRlcyA9IG91dC5nZXRCeXRlcygpOworICAgICAgICB3cml0ZUkzMiggYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkoYmluOkJ5dGVzKSA6IFZvaWQgeworICAgICAgICB3cml0ZUkzMihiaW4ubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKGJpbiwgMCwgYmluLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqLworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZSB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gcmVhZEkzMigpOworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShyZWFkU3RyaW5nKCksIHNpemUgJiAweDAwMDAwMGZmLCByZWFkSTMyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0cmljdFJlYWRfKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UocmVhZFN0cmluZ0JvZHkoc2l6ZSksIHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0IHsKKyAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgdmFyIHR5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICB2YXIgaWQgOiBJbnQgPSAwOworICAgICAgICBpZiAodHlwZSAhPSBUVHlwZS5TVE9QKQorICAgICAgICB7CisgICAgICAgICAgICBpZCA9IHJlYWRJMTYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oKSA6IFRNYXAgeworICAgICAgICByZXR1cm4gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKTpUTGlzdCB7CisgICAgICAgIHJldHVybiBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgcmV0dXJuIG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgMSk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDEpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGlucC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCAyKTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgMik7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQxNigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA0KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgOCk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDgpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgdmFyIGhpID0gaW5wLnJlYWRJbnQzMigpOworICAgICAgICB2YXIgbG8gPSBpbnAucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBJbnQ2NC5tYWtlKGhpLGxvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgpOkZsb2F0IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgOCk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDgpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGlucC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiByZWFkU3RyaW5nQm9keSggcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZ0JvZHkobGVuIDogSW50KSA6IFN0cmluZyB7CisgICAgICAgIGlmKCBsZW4gPiAwKSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgbGVuKTsKKyAgICAgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGlucC5yZWFkU3RyaW5nKGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICB2YXIgbGVuIDogSW50ID0gcmVhZEkzMigpOworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBidWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE5YmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CisqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZF8gOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGVfIDogQm9vbCA9IHRydWU7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBzdHJpY3RSZWFkIDogQm9vbCA9IGZhbHNlLCBzdHJpY3RXcml0ZSA6IEJvb2wgPSB0cnVlKSB7CisgICAgICAgIHN0cmljdFJlYWRfICA9IHN0cmljdFJlYWQ7CisgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCggdHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgIH0KK30KKworCisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjEzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oeApAQCAtMCwwICsxLDcxOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmRzLkdlbmVyaWNTdGFjazsKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5VdGY4OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuWmlnWmFnOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci5CaXRDb252ZXJ0ZXI7CisKKworLyoqCisqIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFJlY3Vyc2lvblRyYWNrZXIgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIEFOT05ZTU9VU19TVFJVQ1QgOiBUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHByaXZhdGUgc3RhdGljIHZhciBUU1RPUCA6IFRGaWVsZCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlNUT1AsIDApOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBQUk9UT0NPTF9JRCA6IEludCA9IDB4ODI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OIDogSW50ID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT05fTUFTSyA6IEludCA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVFlQRV9NQVNLIDogSW50ID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBUWVBFX0JJVFMgOiBJbnQgPSAweDA3OyAvLyAwMDAwIDAxMTEKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFRZUEVfU0hJRlRfQU1PVU5UIDogSW50ID0gNTsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHR0eXBlVG9Db21wYWN0VHlwZSA9IFsKKyAgICAgICAgVFR5cGUuU1RPUCAgICA9PiBUQ29tcGFjdFR5cGVzLlNUT1AsCisgICAgICAgIFRUeXBlLkJPT0wgICAgPT4gVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsCisgICAgICAgIFRUeXBlLkJZVEUgICAgPT4gVENvbXBhY3RUeXBlcy5CWVRFLAorICAgICAgICBUVHlwZS5ET1VCTEUgID0+IFRDb21wYWN0VHlwZXMuRE9VQkxFLAorICAgICAgICBUVHlwZS5JMTYgICAgID0+IFRDb21wYWN0VHlwZXMuSTE2LAorICAgICAgICBUVHlwZS5JMzIgICAgID0+IFRDb21wYWN0VHlwZXMuSTMyLAorICAgICAgICBUVHlwZS5JNjQgICAgID0+IFRDb21wYWN0VHlwZXMuSTY0LAorICAgICAgICBUVHlwZS5TVFJJTkcgID0+IFRDb21wYWN0VHlwZXMuQklOQVJZLAorICAgICAgICBUVHlwZS5TVFJVQ1QgID0+IFRDb21wYWN0VHlwZXMuU1RSVUNULAorICAgICAgICBUVHlwZS5NQVAgICAgID0+IFRDb21wYWN0VHlwZXMuTUFQLAorICAgICAgICBUVHlwZS5TRVQgICAgID0+IFRDb21wYWN0VHlwZXMuU0VULAorICAgICAgICBUVHlwZS5MSVNUICAgID0+IFRDb21wYWN0VHlwZXMuTElTVAorICAgIF07CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGNvbXBhY3RUeXBlVG9UeXBlID0gWworICAgICAgICBUQ29tcGFjdFR5cGVzLlNUT1AgICAgICAgICAgPT4gVFR5cGUuU1RPUCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUgID0+IFRUeXBlLkJPT0wsCisgICAgICAgIFRDb21wYWN0VHlwZXMuQk9PTEVBTl9GQUxTRSA9PiBUVHlwZS5CT09MLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJZVEUgICAgICAgICAgPT4gVFR5cGUuQllURSwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JMTYgICAgICAgICAgID0+IFRUeXBlLkkxNiwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JMzIgICAgICAgICAgID0+IFRUeXBlLkkzMiwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JNjQgICAgICAgICAgID0+IFRUeXBlLkk2NCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5ET1VCTEUgICAgICAgID0+IFRUeXBlLkRPVUJMRSwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CSU5BUlkgICAgICAgID0+IFRUeXBlLlNUUklORywKKyAgICAgICAgVENvbXBhY3RUeXBlcy5MSVNUICAgICAgICAgID0+IFRUeXBlLkxJU1QsCisgICAgICAgIFRDb21wYWN0VHlwZXMuU0VUICAgICAgICAgICA9PiBUVHlwZS5TRVQsCisgICAgICAgIFRDb21wYWN0VHlwZXMuTUFQICAgICAgICAgICA9PiBUVHlwZS5NQVAsCisgICAgICAgIFRDb21wYWN0VHlwZXMuU1RSVUNUICAgICAgICA9PiBUVHlwZS5TVFJVQ1QKKyAgICBdOworCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICovCisgICAgcHJpdmF0ZSB2YXIgbGFzdEZpZWxkXyA6IEdlbmVyaWNTdGFjazxJbnQ+ID0gbmV3IEdlbmVyaWNTdGFjazxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgbGFzdEZpZWxkSWRfIDogSW50ID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAgICAqIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBib29sZWFuRmllbGRfIDogTnVsbDxURmllbGQ+OworCisgICAgLyoqCisgICAgICogSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2YXIgYm9vbFZhbHVlXyA6IE51bGw8Qm9vbD47CisKKworICAgIC8vIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGhvbGRzIFN0cmluZ3MgYXMgVVRGLTgKKyAgICAvLyBodHRwOi8vb2xkLmhheGUub3JnL21hbnVhbC9lbmNvZGluZworICAgIHByaXZhdGUgc3RhdGljIHZhciB1dGY4U3RyaW5ncyA9IGhheGUuVXRmOC52YWxpZGF0ZSgiw4ctw58tw4Yt0K4t0KgiKTsKKworICAgIC8vIHRoZSB0cmFuc3BvcnQgdXNlZAorICAgIHB1YmxpYyB2YXIgdHJhbnMoZGVmYXVsdCxudWxsKSA6IFRUcmFuc3BvcnQ7CisKKworICAgIC8vIFRDb21wYWN0UHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFucyA6IFRUcmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHRyYW5zOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIFJlc2V0KCkgOiBWb2lkeworICAgICAgICB3aGlsZSAoICEgbGFzdEZpZWxkXy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8ucG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUJ5dGVEaXJlY3QoIGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBidWYgPSBCeXRlcy5hbGxvYygxKTsKKyAgICAgICAgYnVmLnNldCggMCwgYik7CisgICAgICAgIHRyYW5zLndyaXRlKCBidWYsIDAsIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZVZhcmludDMyKCBuIDogVUludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGkzMmJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaTMyYnVmLmFkZEJ5dGUoIG4gJiAweEZGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpMzJidWYuYWRkQnl0ZSggKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gaTMyYnVmLmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oIG1lc3NhZ2UgOiBUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgUmVzZXQoKTsKKworICAgICAgICB2YXIgdmVyc2lvbkFuZFR5cGUgOiBJbnQgPSAgKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBQUk9UT0NPTF9JRCk7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggdmVyc2lvbkFuZFR5cGUpOworICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KCBtZXNzYWdlLnNlcWlkLCBVSW50KSk7CisgICAgICAgIHdyaXRlU3RyaW5nKCBtZXNzYWdlLm5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorICAgICAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQgeworICAgICAgICBsYXN0RmllbGRfLmFkZCggbGFzdEZpZWxkSWRfKTsKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICAgICAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAqIG9mIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnBvcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgICAgICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQorICAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpCisgICAgICAgICAgICBib29sZWFuRmllbGRfID0gZmllbGQ7IC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgICAgICogYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGZpZWxkIDogVEZpZWxkLCB0eXBlT3ZlcnJpZGUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgdmFyIHR5cGVUb1dyaXRlIDogSW50OworICAgICAgICBpZiAoIHR5cGVPdmVycmlkZSA9PSAweEZGKQorICAgICAgICAgICAgdHlwZVRvV3JpdGUgPSBnZXRDb21wYWN0VHlwZSggZmllbGQudHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlOworCisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICBpZiAoZmllbGQuaWQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGQuaWQgLSBsYXN0RmllbGRJZF8gPD0gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpOworICAgICAgICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggY2FzdChUQ29tcGFjdFR5cGVzLlNUT1AsIEludCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgICBpZiAobWFwLnNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGt2dHlwZSA9IChnZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCkgfCBnZXRDb21wYWN0VHlwZShtYXAudmFsdWVUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoIGNhc3QoIG1hcC5zaXplLCBVSW50KSk7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIGt2dHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbiggbGlzdCA6IFRMaXN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggbGlzdC5lbGVtVHlwZSwgbGlzdC5zaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNldCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oIHNldCA6IFRTZXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBzZXQuZWxlbVR5cGUsIHNldC5zaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgKiBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbChiIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJjdCA6IEludCA9IGIgPyBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSA6IFRDb21wYWN0VHlwZXMuQk9PTEVBTl9GQUxTRTsKKworICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBib29sZWFuRmllbGRfLCBiY3QpOworICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggYmN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCBiIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCBpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIFppZ1phZy5Gcm9tSW50KCBpMTYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMiggaTMyIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZVZhcmludDMyKCBaaWdaYWcuRnJvbUludCggaTMyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoIGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50NjQoICBaaWdaYWcuRnJvbUxvbmcoIGk2NCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCBkdWIgOiBGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGRhdGEgPSBCaXRDb252ZXJ0ZXIuZml4ZWRMb25nVG9CeXRlcyggQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGR1YikpOworICAgICAgICB0cmFucy53cml0ZSggZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBzdHIpOyAgLy8gbm8gbmVlZCB0byBlbmNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBVdGY4LmVuY29kZSggc3RyKSk7CisgICAgICAgIHZhciB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgd3JpdGVCaW5hcnkoIHRtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KCBiaW4gOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdChiaW4ubGVuZ3RoLFVJbnQpKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIGJpbiwgMCwgYmluLmxlbmd0aCk7CisgICAgfQorCisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKKyAgICAvLyBvdXRwdXQgb3IgcHVycG9zZS4KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7IH0KKworICAgIC8vCisgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAgICAgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUNvbGxlY3Rpb25CZWdpbiggZWxlbVR5cGUgOiBJbnQsIHNpemUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmIChzaXplIDw9IDE0KSAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIHNpemUgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdChzaXplLCBVSW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlVmFyaW50NjQobiA6IGhheGUuSW50NjQpIDogVm9pZCAgICB7CisgICAgICAgIHZhciB2YXJpbnQ2NG91dCA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIEludDY0LmlzWmVybyggSW50NjQuYW5kKCBuLCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDB4N0YpKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggSW50NjQuZ2V0TG93KG4pKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHZhcmludDY0b3V0LmFkZEJ5dGUoIG4ubG93KTsKKyAgICAgICAgICAgICAgICAjZW5kCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmICggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggKEludDY0LmdldExvdyhuKSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCAobi5sb3cgJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBuID0gSW50NjQuc2hyKCBuLCA3KTsKKyAgICAgICAgICAgICAgICBuID0gSW50NjQuYW5kKCBuLCBJbnQ2NC5tYWtlKDB4MDFGRkZGRkYsMHhGRkZGRkZGRikpOyAgLy8gY2xlYW4gb3V0IHRoZSBzaGlmdGVkIDcgYml0cworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZhciB0bXAgPSB2YXJpbnQ2NG91dC5nZXRCeXRlcygpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlIHsKKyAgICAgICAgUmVzZXQoKTsKKworICAgICAgICB2YXIgcHJvdG9jb2xJZCA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgIiArIFN0cmluZ1Rvb2xzLmhleChQUk9UT0NPTF9JRCwyKSArICIgYnV0IGdvdCAiICsgU3RyaW5nVG9vbHMuaGV4KHByb3RvY29sSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIHZlcnNpb24gIiArIFZFUlNJT04gKyAiIGJ1dCBnb3QgIiArIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgOiBJbnQgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgICAgICAgIHZhciBzZXFpZCA6IEludCA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB2YXIgbXNnTm0gOiBTdHJpbmcgPSByZWFkU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UoIG1zZ05tLCB0eXBlLCBzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0IHsKKyAgICAgICAgbGFzdEZpZWxkXy5hZGQobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8ucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCkgOiBURmllbGQgeworICAgICAgICB2YXIgdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICBpZiAodHlwZSA9PSBjYXN0KFRDb21wYWN0VHlwZXMuU1RPUCxJbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gVFNUT1A7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmllbGRJZCA6IEludDsKKworICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgIHZhciBtb2RpZmllciA6IEludCA9ICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIGZpZWxkSWQgPSByZWFkSTE2KCk7ICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkSWQgPSBsYXN0RmllbGRJZF8gKyBtb2RpZmllcjsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorCisgICAgICAgIHZhciBmaWVsZCA6IFRGaWVsZCAgPSBuZXcgVEZpZWxkKCAiIiwgY2FzdChnZXRUVHlwZSh0eXBlICYgMHgwZiksSW50KSwgZmllbGRJZCk7CisKKyAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpIHsKKyAgICAgICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICAgICAgICAgYm9vbFZhbHVlXyA9ICgodHlwZSAmIDB4MGYpID09IGNhc3QoVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsSW50KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgKiAiY29ycmVjdCIgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIHZhciBrZXlBbmRWYWx1ZVR5cGUgOiBJbnQgPSAoKHNpemUgPT0gMCkgID8gIDAgIDogIHJlYWRCeXRlKCkpOworICAgICAgICB2YXIga2V5IDogSW50ID0gY2FzdCggZ2V0VFR5cGUoIChrZXlBbmRWYWx1ZVR5cGUgJiAweEYwKSA+PiA0KSwgSW50KTsKKyAgICAgICAgdmFyIHZhbCA6IEludCA9IGNhc3QoIGdldFRUeXBlKCBrZXlBbmRWYWx1ZVR5cGUgJiAweDBGKSwgSW50KTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTWFwKCBrZXksIHZhbCwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAqIHRydWUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgdmFyIHNpemVfYW5kX3R5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworCisgICAgICAgIHZhciBzaXplIDogSW50ID0gKChzaXplX2FuZF90eXBlICYgMHhGMCkgPj4gNCkgJiAweDBGOworICAgICAgICBpZiAoc2l6ZSA9PSAxNSkgeworICAgICAgICAgICAgc2l6ZSA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTGlzdCggdHlwZSwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAqIHRydWUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgdmFyIHNpemVfYW5kX3R5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworCisgICAgICAgIHZhciBzaXplIDogSW50ID0gKChzaXplX2FuZF90eXBlICYgMHhGMCkgPj4gNCkgJiAweDBGOworICAgICAgICBpZiAoc2l6ZSA9PSAxNSkgeworICAgICAgICAgICAgc2l6ZSA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUU2V0KCB0eXBlLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgICAgICogYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbCB7CisgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgOiBCb29sID0gYm9vbFZhbHVlXzsKKyAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSBjYXN0KFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFLEludCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHZhciBieXRlUmF3QnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ5dGVSYXdCdWYsIDAsIDEpOworICAgICAgICByZXR1cm4gYnl0ZVJhd0J1Zi5nZXRCeXRlcygpLmdldCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFppZ1phZy5Ub0ludCggUmVhZFZhcmludDMyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvSW50KCBSZWFkVmFyaW50MzIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvTG9uZyggUmVhZFZhcmludDY0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICB2YXIgbG9uZ0JpdHMgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKCBCaXRDb252ZXJ0ZXIuYnl0ZXNUb0xvbmcoIGxvbmdCaXRzLmdldEJ5dGVzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgbGVuZ3RoIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ1ZiwgMCwgbGVuZ3RoKTsKKworICAgICAgICBsZW5ndGggPSBidWYubGVuZ3RoOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1Zi5nZXRCeXRlcygpKTsKKyAgICAgICAgdmFyIHN0ciA9IGlucC5yZWFkU3RyaW5nKCBsZW5ndGgpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICByZXR1cm4gc3RyOyAgLy8gbm8gbmVlZCB0byBkZWNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVXRmOC5kZWNvZGUoIHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHZhciBsZW5ndGggOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZXMuYWxsb2MoMCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXRCeXRlcygpOworICAgIH0KKworCisgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQorICAgIC8vIGVuY29kaW5nLgorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7IH0KKworICAgIC8vCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRWYXJpbnQzMigpIDogVUludCB7CisgICAgICAgIHZhciByZXN1bHQgOiBVSW50ID0gMDsKKyAgICAgICAgdmFyIHNoaWZ0IDogSW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHZhciBiIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCB8PSBjYXN0KChiICYgMHg3ZikgPDwgc2hpZnQsIFVJbnQpOworICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZFZhcmludDY0KCkgOiBJbnQ2NCB7CisgICAgICAgIHZhciBzaGlmdCA6IEludCA9IDA7CisgICAgICAgIHZhciByZXN1bHQgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHZhciBiIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCByZXN1bHQsIEludDY0LnNobCggSW50NjQubWFrZSgwLGIgJiAweDdmKSwgc2hpZnQpKTsKKyAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLy8KKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICAvLworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBiIDogSW50KSA6IEJvb2wgeworICAgICAgICB2YXIgbG93ZXJOaWJibGUgOiBJbnQgPSBiICYgMHgwZjsKKyAgICAgICAgc3dpdGNoKGxvd2VyTmliYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0VHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBUVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFRUeXBlKCB0eXBlIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGNvbXBhY3RUeXBlVG9UeXBlW3R5cGVdOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0dCA6IEludCA9ICh0eXBlICYgMHgwZik7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgJ2RvblwndCBrbm93IHdoYXQgdHlwZTogJHR0ICgkZSknKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RUeXBlcyBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCB0dHlwZSA6IEludCkgOiBJbnQKKyAgICB7CisgICAgICAgIHJldHVybiBjYXN0KCB0dHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdLCBJbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY3M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUUHJvdG9jb2wgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCB0cmFucyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFR5cGVzLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkM2Q4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFR5cGVzLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCisgKi8KK0A6ZW51bQorYWJzdHJhY3QgVENvbXBhY3RUeXBlcyhJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RPUCAgICAgICAgICA9IDB4MDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0xFQU5fVFJVRSAgPSAweDAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCT09MRUFOX0ZBTFNFID0gMHgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQllURSAgICAgICAgICA9IDB4MDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkxNiAgICAgICAgICAgPSAweDA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMzIgICAgICAgICAgID0gMHgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSTY0ICAgICAgICAgICA9IDB4MDY7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERPVUJMRSAgICAgICAgPSAweDA3OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCSU5BUlkgICAgICAgID0gMHgwODsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTElTVCAgICAgICAgICA9IDB4MDk7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNFVCAgICAgICAgICAgPSAweDBBOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNQVAgICAgICAgICAgID0gMHgwQjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSVUNUICAgICAgICA9IDB4MEM7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmh4CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVEZpZWxkIHsKKworICAgIHB1YmxpYyB2YXIgbmFtZSA6IFN0cmluZzsKKyAgICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBpZCA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobiA6IFN0cmluZyA9ICIiLCB0IDogSW50ID0gMCwgaSA6IEludCA9IDApIHsKKyAgICAgIG5hbWUgPSBuOworICAgICAgdHlwZSA9IHQ7CisgICAgICBpZCA9IGk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgcmV0dXJuICc8VEZpZWxkIG5hbWU6IiRuYW1lIiB0eXBlOiIkdHlwZSIgZmllbGQtaWQ6IiRpZCI+JzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKCBvdGhlckZpZWxkIDogVEZpZWxkKSA6IEJvb2wgeworICAgICAgcmV0dXJuICh0eXBlID09IG90aGVyRmllbGQudHlwZSkKKyAgICAgICAgICAmJiAoaWQgPT0gb3RoZXJGaWVsZC5pZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGZmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oeApAQCAtMCwwICsxLDEwNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmRzLkdlbmVyaWNTdGFjazsKK2ltcG9ydCBoYXhlLlV0Zjg7CitpbXBvcnQgaGF4ZS5jcnlwdG8uQmFzZTY0OworaW1wb3J0IGhheGUuSW50NjQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworCisvKiBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisqICBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorKgorKiAgUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgd2lyZSBmb3JtYXQuCisqCisqICBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KKyovCitjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFJlY3Vyc2lvblRyYWNrZXIgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworCisgICAgcHVibGljIHZhciB0cmFucyhkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgIHByaXZhdGUgdmFyIGNvbnRleHRTdGFjayA6IEdlbmVyaWNTdGFjazxKU09OQmFzZUNvbnRleHQ+ID0gbmV3IEdlbmVyaWNTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisKKyAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICBwcml2YXRlIHZhciBjb250ZXh0IDogSlNPTkJhc2VDb250ZXh0OworCisgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICBwcml2YXRlIHZhciByZWFkZXIgOiBMb29rYWhlYWRSZWFkZXI7CisKKyAgICAvLyB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBob2xkcyBTdHJpbmdzIGFzIFVURi04CisgICAgLy8gaHR0cDovL29sZC5oYXhlLm9yZy9tYW51YWwvZW5jb2RpbmcKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdXRmOFN0cmluZ3MgPSBoYXhlLlV0ZjgudmFsaWRhdGUoIsOHLcOfLcOGLdCuLdCoIik7CisKKyAgICAvLyBUSlNPTlByb3RvY29sIENvbnN0cnVjdG9yCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnMgOiBUVHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOworICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gdHJhbnM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggSlNPTkNvbnN0YW50cy5WRVJTSU9OKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcobWVzc2FnZS5uYW1lKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1lc3NhZ2UudHlwZSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBmaWVsZC5pZCApOworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggZmllbGQudHlwZSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7IH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAua2V5VHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC52YWx1ZVR5cGUpKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1hcC5zaXplKTsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4obGlzdDpUTGlzdCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggbGlzdC5lbGVtVHlwZSApKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGxpc3Quc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldC5lbGVtVHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggc2V0LnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbChiIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIGIpCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlciggMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZShiIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoaTE2IDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludDY0KCBpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZShkdWI6RmxvYXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkRvdWJsZShkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHIgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKHN0cikpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW46Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkJhc2U2NChiaW4pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCk6VE1lc3NhZ2UgeworICAgICAgICB2YXIgbWVzc2FnZSA6IFRNZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICBpZiAoUmVhZEpTT05JbnRlZ2VyKCkgIT0gSlNPTkNvbnN0YW50cy5WRVJTSU9OKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICB9CisKKyAgICAgICAgbWVzc2FnZS5uYW1lID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICBtZXNzYWdlLnR5cGUgPSBSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgbWVzc2FnZS5zZXFpZCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHZhciBmaWVsZCA6IFRGaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgdmFyIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgPT0gSlNPTkNvbnN0YW50cy5SQlJBQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpZWxkLnR5cGUgPSBUVHlwZS5TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmllbGQuaWQgPSBSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIGZpZWxkLnR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBLZXlUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIFZhbHVlVHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisKKyAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwKCBLZXlUeXBlLCBWYWx1ZVR5cGUsIENvdW50KTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBFbGVtZW50VHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCBFbGVtZW50VHlwZSwgQ291bnQpOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigpIDogVFNldCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICB2YXIgRWxlbWVudFR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB2YXIgQ291bnQgOiBJbnQgPSBSZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoIEVsZW1lbnRUeXBlLCBDb3VudCk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIChSZWFkSlNPTkludGVnZXIoKSAhPSAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludGVnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OSW50ZWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnQ2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05Eb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICByZXR1cm4gUmVhZEpTT05CYXNlNjQoKTsKKyAgICB9CisKKyAgICAvLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICBwcml2YXRlIGZ1bmN0aW9uICBQdXNoQ29udGV4dChjIDogSlNPTkJhc2VDb250ZXh0KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0U3RhY2suYWRkKGNvbnRleHQpOworICAgICAgICBjb250ZXh0ID0gYzsKKyAgICB9CisKKyAgICAvLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICBwcml2YXRlIGZ1bmN0aW9uICBQb3BDb250ZXh0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dCA9IGNvbnRleHRTdGFjay5wb3AoKTsKKyAgICB9CisKKworICAgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OU3RyaW5nKCBiIDogQnl0ZXMpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpIGluIDAgLi4uIGIubGVuZ3RoKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBiLmdldChpKTsKKworICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSkgPT0gSlNPTkNvbnN0YW50cy5CQUNLU0xBU0guY2hhckF0KDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkJBQ0tTTEFTSCArIEpTT05Db25zdGFudHMuQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCBiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG51bSA9IEpTT05Db25zdGFudHMuSlNPTl9DSEFSX1RBQkxFW3ZhbHVlXTsKKyAgICAgICAgICAgICAgICBpZiAobnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggYiwgaSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bSA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIG51bSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBKU09OQ29uc3RhbnRzLkVTQ1NFUSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoICh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDEyKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHgwMDAwRkYwMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBIZXhDaGFyKCB2YWx1ZSAmIDB4MDAwMDAwRkYpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywKKyAgICAvLyBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OSW50ZWdlciggbnVtIDogSW50KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9IFN0ZC5zdHJpbmcobnVtKTsKKworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywKKyAgICAvLyBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OSW50NjQoIG51bSA6IEludDY0KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9IFN0ZC5zdHJpbmcobnVtKTsKKworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05Eb3VibGUobnVtIDogRmxvYXQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworCisgICAgICAgIHZhciBzcGVjaWFsIDogQm9vbCA9IGZhbHNlOworICAgICAgICB2YXIgcmVuZGVyZWQgOiBTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYoIE1hdGguaXNOYU4obnVtKSkgeworICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICByZW5kZXJlZCA9IEpTT05Db25zdGFudHMuRkxPQVRfSVNfTkFOOworICAgICAgICB9IGVsc2UgaWYgKCEgTWF0aC5pc0Zpbml0ZShudW0pKSB7CisgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKCBudW0gPiAwKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQgPSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX1BPU19JTkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbmRlcmVkID0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19ORUdfSU5GOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVuZGVyZWQgPSBTdGQuc3RyaW5nKG51bSk7ICAvLyBwbGFpbiBhbmQgc2ltcGxlIGZsb2F0IG51bWJlcgorICAgICAgICB9CisKKyAgICAgICAgLy8gY29tcG9zZSBvdXRwdXQKKyAgICAgICAgdmFyIGVzY2FwZU51bSA6IEJvb2wgPSBzcGVjaWFsIHx8IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisgICAgICAgIHN0ciArPSByZW5kZXJlZDsKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBzdHIpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQgZGF0YQorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OQmFzZTY0KCBiIDogQnl0ZXMpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICBidWYuYWRkU3RyaW5nKCBCYXNlNjQuZW5jb2RlKGIpKTsKKyAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisKKyAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkxCUkFDRSk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICBQdXNoQ29udGV4dCggbmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05PYmplY3RFbmQoKSA6IFZvaWQgeworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUkJSQUNFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05BcnJheVN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkxCUkFDS0VUKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIFB1c2hDb250ZXh0KCBuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkFycmF5RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlJCUkFDS0VUKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisKKyAgICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggY2hhciwgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWRKU09OU3ludGF4Q2hhciggY2hhciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGIgPSBCeXRlc0Zyb21TdHJpbmcoIGNoYXIpOworCisgICAgICAgIHZhciBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgIGlmIChjaC5nZXQoMCkgIT0gYi5nZXQoMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiAkY2gnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KKyAgICAvLyBTa2lwIFJlYWRpbmcgZnJvbSB0aGUgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05TdHJpbmcoc2tpcENvbnRleHQgOiBCb29sKSA6IFN0cmluZworICAgIHsKKyAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmZmVyIDogQnl0ZXNCdWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoID0gcmVhZGVyLlJlYWQoKTsKKworICAgICAgICAgICAgLy8gZW5kIG9mIHN0cmluZz8KKyAgICAgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMoY2gpID09IEpTT05Db25zdGFudHMuUVVPVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSAhPSBKU09OQ29uc3RhbnRzLkVTQ1NFUS5jaGFyQXQoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFkZEJ5dGUoIGNoLmdldCgwKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gXHVYWFhYIChoZXggdW5pY29kZSkgYW5kIFxYIChjb250cm9sIGNoYXJzKQorICAgICAgICAgICAgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgIT0gSlNPTkNvbnN0YW50cy5FU0NTRVEuY2hhckF0KDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IEpTT05Db25zdGFudHMuRVNDQVBFX0NIQVJTX1RPX1ZBTFVFU1tjaC5nZXQoMCldOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkQnl0ZSggdmFsdWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICAgICAgICB2YXIgaGV4YnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgaGV4bGVuID0gdHJhbnMucmVhZEFsbCggaGV4YnVmLCAwLCA0KTsKKyAgICAgICAgICAgIGlmKCBoZXhsZW4gIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiTm90IGVub3VnaCBkYXRhIGZvciBcXHVOTk5OIHNlcXVlbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoZXhkaWdpdHMgPSBoZXhidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIHZhciBjaGFyY29kZSA9IDA7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDApKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDEpKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDIpKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDMpKSk7CisgICAgICAgICAgICBidWZmZXIuYWRkU3RyaW5nKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJjb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3RyaW5nRnJvbUJ5dGVzKCBidWZmZXIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBJc0pTT05OdW1lcmljKGIgOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAiKyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiLSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiLiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiOCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiOSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiRSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiZSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgICAgLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05OdW1lcmljQ2hhcnMoKSA6IFN0cmluZworICAgIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA6IEJ5dGVzQnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICAgICAgaWYoICEgSXNKU09OTnVtZXJpYyggY2guZ2V0KDApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hZGRCeXRlKCByZWFkZXIuUmVhZCgpLmdldCgwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ0Zyb21CeXRlcyggYnVmZmVyLmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OSW50ZWdlcigpIDogSW50IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZhbHVlID0gU3RkLnBhcnNlSW50KHN0cik7CisgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05JbnQ2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworCisgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzdHIgOiBTdHJpbmcgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOworICAgICAgICBpZiggc3RyLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHNpZ24KKyAgICAgICAgdmFyIGJNaW51cyA9IGZhbHNlOworICAgICAgICB2YXIgc3RhcnRBdCA9IDA7CisgICAgICAgIGlmKCAoc3RyLmNoYXJBdCgwKSA9PSAiKyIpIHx8IChzdHIuY2hhckF0KDApID09ICItIikpIHsKKyAgICAgICAgICAgIGJNaW51cyA9IChzdHIuY2hhckF0KDApID09ICItIik7CisgICAgICAgICAgICBzdGFydEF0Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGRpZ2l0cworICAgICAgICB2YXIgdmFsdWUgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgdmFyIGJHb3REaWdpdHMgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBpIGluIHN0YXJ0QXQgLi4uIHN0ci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7CisgICAgICAgICAgICB2YXIgZGlnaXQgPSBKU09OQ29uc3RhbnRzLkRFQ0lNQUxfRElHSVRTW2NoXTsKKyAgICAgICAgICAgIGlmKCBkaWdpdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnQmFkIG51bWVyaWMgZGF0YTogJHN0cicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYkdvdERpZ2l0cyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBkZWNpbWFsIGRpZ2l0cworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5tdWwoIHZhbHVlLCBJbnQ2NC5tYWtlKDAsMTApKTsKKyAgICAgICAgICAgIHZhbHVlID0gSW50NjQuYWRkKCB2YWx1ZSwgSW50NjQubWFrZSgwLGRpZ2l0KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHBlbmRpbmcgbWludXMgc2lnbiwgaWYgYXBwbGljYWJsZQorICAgICAgICAvLyB0aGlzIHNob3VsZCBhbHNvIGhhbmRsZSB0aGUgZWRnZSBjYXNlIE1JTl9JTlQ2NCBjb3JyZWN0bHkKKyAgICAgICAgaWYoIGJNaW51cyAmJiAoSW50NjQuY29tcGFyZSh2YWx1ZSxJbnQ2NC5tYWtlKDAsMCkpID4gMCkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gSW50NjQubmVnKCB2YWx1ZSk7CisgICAgICAgICAgICBiTWludXMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhIGJHb3REaWdpdHMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKKyAgICAvLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05Eb3VibGUoKSA6IEZsb2F0IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKHJlYWRlci5QZWVrKCkpID09IEpTT05Db25zdGFudHMuUVVPVEUpIHsKKyAgICAgICAgICAgIHN0ciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOworCisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCisgICAgICAgICAgICBpZiggc3RyID09IEpTT05Db25zdGFudHMuRkxPQVRfSVNfTkFOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguTmFOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHN0ciA9PSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX1BPU19JTkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBzdHIgPT0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19ORUdfSU5GKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhIGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhyb3cgLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBFc2NhcGVOdW1iZXJzKCkgPT0gdHJ1ZQorICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sgLSB3ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgdmFsaWQgZGlnaXQKKyAgICAgICAgdmFyIGR1YiA9IFN0ZC5wYXJzZUZsb2F0KCBzdHIpOworICAgICAgICBpZiggKHN0ci5sZW5ndGggPT0gMCkgfHwgTWF0aC5pc05hTihkdWIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZHViOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkJhc2U2NCgpIDogQnl0ZXMKKyAgICB7CisgICAgICAgIHZhciBzdHIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKCBzdHIpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05PYmplY3RTdGFydCgpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuTEJSQUNFKTsKKyAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk9iamVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5SQlJBQ0UpOworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkFycmF5U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLkxCUkFDS0VUKTsKKyAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkFycmF5RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlJCUkFDS0VUKTsKKyAgICAgICAgUG9wQ29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBCeXRlc0Zyb21TdHJpbmcoIHN0ciA6IFN0cmluZykgOiBCeXRlcyB7CisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgaWYoIHV0ZjhTdHJpbmdzKQorICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggc3RyKTsgIC8vIG5vIG5lZWQgdG8gZW5jb2RlIG9uIFVURjggdGFyZ2V0cywgdGhlIHN0cmluZyBpcyBqdXN0IGZpbmUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggVXRmOC5lbmNvZGUoIHN0cikpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTdHJpbmdGcm9tQnl0ZXMoIGJ1ZiA6IEJ5dGVzKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmKTsKKyAgICAgICAgaWYoIGJ1Zi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAiIjsgIC8vIHJlYWRTdHJpbmcoKSB3b3VsZCByZXR1cm4gbnVsbCBpbiB0aGF0IGNhc2UsIHdoaWNoIGlzIHdyb25nCisgICAgICAgIHZhciBzdHIgPSBpbnAucmVhZFN0cmluZyggYnVmLmxlbmd0aCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIHJldHVybiBzdHI7ICAvLyBubyBuZWVkIHRvIGRlY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVdGY4LmRlY29kZSggc3RyKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMgY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBIZXhWYWwoY2hhciA6IFN0cmluZykgOiBJbnQgeworICAgICAgICB2YXIgdmFsdWUgPSBKU09OQ29uc3RhbnRzLkhFWF9ESUdJVFNbY2hhcl07CisgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdFeHBlY3RlZCBoZXggY2hhcmFjdGVyOiAkY2hhcicpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IG5pYmJsZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gSGV4Q2hhcihuaWJibGUgOiBJbnQpIDogU3RyaW5nCisgICAgeworICAgICAgICByZXR1cm4gIjAxMjM0NTY3ODlhYmNkZWYiLmNoYXJBdChuaWJibGUgJiAweDBGKTsKKyAgICB9CisKKworfQorCisKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIEpTT05Db25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgdmFyIENPTU1BID0gIiwiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIENPTE9OID0gIjoiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIExCUkFDRSA9ICJ7IjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBSQlJBQ0UgPSAifSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTEJSQUNLRVQgPSAiWyI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgUkJSQUNLRVQgPSAiXSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgUVVPVEUgPSAiXCIiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEJBQ0tTTEFTSCA9ICJcXCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NTRVEgPSAiXFx1IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX05BTiA9ICJOYU4iOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX1BPU19JTkYgPSAiSW5maW5pdHkiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX05FR19JTkYgPSAiLUluZmluaXR5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIFZFUlNJT04gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEpTT05fQ0hBUl9UQUJMRSA9IFsKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgICJiIi5jb2RlLCAidCIuY29kZSwgIm4iLmNvZGUsICAwLCAiZiIuY29kZSwgInIiLmNvZGUsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAxLCAgMSwgIlwiIi5jb2RlLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NBUEVfQ0hBUlMgICAgID0gWyciJywnXFwnLCcvJywnYicsJ2YnLCduJywncicsJ3QnXTsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NBUEVfQ0hBUlNfVE9fVkFMVUVTID0gWworICAgICAgICAiXCIiLmNvZGUgPT4gMHgyMiwKKyAgICAgICAgIlxcIi5jb2RlID0+IDB4NUMsCisgICAgICAgICIvIi5jb2RlICA9PiAweDJGLAorICAgICAgICAiYiIuY29kZSAgPT4gMHgwOCwKKyAgICAgICAgImYiLmNvZGUgID0+IDB4MEMsCisgICAgICAgICJuIi5jb2RlICA9PiAweDBBLAorICAgICAgICAiciIuY29kZSAgPT4gMHgwRCwKKyAgICAgICAgInQiLmNvZGUgID0+IDB4MDkKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgREVDSU1BTF9ESUdJVFMgPSBbCisgICAgICAgICIwIiA9PiAwLAorICAgICAgICAiMSIgPT4gMSwKKyAgICAgICAgIjIiID0+IDIsCisgICAgICAgICIzIiA9PiAzLAorICAgICAgICAiNCIgPT4gNCwKKyAgICAgICAgIjUiID0+IDUsCisgICAgICAgICI2IiA9PiA2LAorICAgICAgICAiNyIgPT4gNywKKyAgICAgICAgIjgiID0+IDgsCisgICAgICAgICI5IiA9PiA5CisgICAgXTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEhFWF9ESUdJVFMgPSBbCisgICAgICAgICIwIiA9PiAwLAorICAgICAgICAiMSIgPT4gMSwKKyAgICAgICAgIjIiID0+IDIsCisgICAgICAgICIzIiA9PiAzLAorICAgICAgICAiNCIgPT4gNCwKKyAgICAgICAgIjUiID0+IDUsCisgICAgICAgICI2IiA9PiA2LAorICAgICAgICAiNyIgPT4gNywKKyAgICAgICAgIjgiID0+IDgsCisgICAgICAgICI5IiA9PiA5LAorICAgICAgICAiQSIgPT4gMTAsCisgICAgICAgICJhIiA9PiAxMCwKKyAgICAgICAgIkIiID0+IDExLAorICAgICAgICAiYiIgPT4gMTEsCisgICAgICAgICJDIiA9PiAxMiwKKyAgICAgICAgImMiID0+IDEyLAorICAgICAgICAiRCIgPT4gMTMsCisgICAgICAgICJkIiA9PiAxMywKKyAgICAgICAgIkUiID0+IDE0LAorICAgICAgICAiZSIgPT4gMTQsCisgICAgICAgICJGIiA9PiAxNSwKKyAgICAgICAgImYiID0+IDE1CisgICAgXTsKKworCisgICAgcHVibGljIHN0YXRpYyB2YXIgREVGX1NUUklOR19TSVpFID0gMTY7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0JPT0wgICA9ICd0Zic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9CWVRFICAgPSAnaTgnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfSTE2ICAgID0gJ2kxNic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9JMzIgICAgPSAnaTMyJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0k2NCAgICA9ICdpNjQnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfRE9VQkxFID0gJ2RibCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9TVFJVQ1QgPSAncmVjJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NUUklORyA9ICdzdHInOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfTUFQICAgID0gJ21hcCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9MSVNUICAgPSAnbHN0JzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NFVCAgICA9ICdzZXQnOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRUeXBlTmFtZUZvclR5cGVJRCh0eXBlSUQgOiBJbnQpIDogU3RyaW5nIHsKKyAgICAgICAgc3dpdGNoICh0eXBlSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDogICAgIHJldHVybiBOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6ICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6ICAgICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6ICAgICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6ICAgICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgICAgICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6ICAgICByZXR1cm4gTkFNRV9ET1VCTEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzogICAgIHJldHVybiBOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOiAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgICAgICAgICAgY2FzZSBUVHlwZS5NQVA6ICAgICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZS5TRVQ6ICAgICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgICAgICAgICAgY2FzZSBUVHlwZS5MSVNUOiAgICAgcmV0dXJuIE5BTUVfTElTVDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZhciBOQU1FU19UT19UWVBFUyA9IFsKKyAgICAgICAgTkFNRV9CT09MICAgPT4gVFR5cGUuQk9PTCwKKyAgICAgICAgTkFNRV9CWVRFICAgPT4gVFR5cGUuQllURSwKKyAgICAgICAgTkFNRV9JMTYgICAgPT4gVFR5cGUuSTE2LAorICAgICAgICBOQU1FX0kzMiAgICA9PiBUVHlwZS5JMzIsCisgICAgICAgIE5BTUVfSTY0ICAgID0+IFRUeXBlLkk2NCwKKyAgICAgICAgTkFNRV9ET1VCTEUgPT4gVFR5cGUuRE9VQkxFLAorICAgICAgICBOQU1FX1NUUklORyA9PiBUVHlwZS5TVFJJTkcsCisgICAgICAgIE5BTUVfU1RSVUNUID0+IFRUeXBlLlNUUlVDVCwKKyAgICAgICAgTkFNRV9NQVAgICAgPT4gVFR5cGUuTUFQLAorICAgICAgICBOQU1FX1NFVCAgICA9PiBUVHlwZS5TRVQsCisgICAgICAgIE5BTUVfTElTVCAgID0+IFRUeXBlLkxJU1QKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRUeXBlSURGb3JUeXBlTmFtZShuYW1lIDogU3RyaW5nKSA6IEludAorICAgIHsKKyAgICAgICAgdmFyIHR5cGUgPSBOQU1FU19UT19UWVBFU1tuYW1lXTsKKyAgICAgICAgaWYoIG51bGwgIT0gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKK30KKworCisvLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUgaW5zZXJ0aW5nL1JlYWRpbmcKKy8vIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycy4gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSB2YXIgcHJvdG8gOiBUSlNPTlByb3RvY29sOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhwcm90byA6IFRKU09OUHJvdG9jb2wgKQorICAgIHsKKyAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7IH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworCisvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLgorLy8gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIEpTT05MaXN0Q29udGV4dCBleHRlbmRzIEpTT05CYXNlQ29udGV4dAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb3RvIDogVEpTT05Qcm90b2NvbCkgeworICAgICAgICBzdXBlcihwcm90byk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuQ09NTUEpOworICAgICAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgcHJvdG8udHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLgorLy8gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uIG9mIGVhY2ggcmVjb3JkCisvLyBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbiBhZGRpdGlvbiwKKy8vIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZSBlc2NhcGVkCisvLyBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTlBhaXJDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sICkgeworICAgICAgICBzdXBlciggcHJvdG8pOworICAgIH0KKworICAgIHByaXZhdGUgdmFyIGZpcnN0IDogQm9vbCA9IHRydWU7CisgICAgcHJpdmF0ZSB2YXIgY29sb24gOiBCb29sICA9IHRydWU7CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gV3JpdGUoKSA6IFZvaWQgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBjb2xvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBjb2xvbiA/IEpTT05Db25zdGFudHMuQ09MT04gOiBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgICAgIHZhciB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIHByb3RvLnRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgY29sb24gPSAhY29sb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhciggY29sb24gPyBKU09OQ29uc3RhbnRzLkNPTE9OIDogSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzKCkgOiBCb29sCisgICAgeworICAgICAgICByZXR1cm4gY29sb247CisgICAgfQorfQorCisvLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIExvb2thaGVhZFJlYWRlciB7CisKKyAgICBwcml2YXRlIHZhciBwcm90byA6IFRKU09OUHJvdG9jb2w7CisgICAgcHJpdmF0ZSB2YXIgZGF0YSA6IEJ5dGVzOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sICkgeworICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgIGRhdGEgPSBudWxsOworICAgIH0KKworCisgICAgLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQorICAgIC8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCkgOiBCeXRlcyB7CisgICAgICAgIHZhciByZXR2YWwgPSBQZWVrKCk7CisgICAgICAgIGRhdGEgPSBudWxsOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgorICAgIHB1YmxpYyBmdW5jdGlvbiBQZWVrKCkgOiBCeXRlcyB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHByb3RvLnRyYW5zLnJlYWRBbGwoYnVmLCAwLCAxKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM1NThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorKiBKU09OIFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUUHJvdG9jb2wgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFmYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVExpc3QgeworCisgICAgcHVibGljIHZhciBlbGVtVHlwZSA6IEludDsKKyAgICBwdWJsaWMgdmFyIHNpemUgOiBJbnQ7CisKKyAgICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcodCA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICAgIGVsZW1UeXBlID0gdDsKKyAgICAgICAgc2l6ZSA9IHM7CisgICAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTYyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5oeApAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRNYXAgeworCisgICAgcHVibGljIHZhciBrZXlUeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgdmFsdWVUeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoayA6IEludCA9IDAsIHYgOiBJbnQgPSAwLCBzIDogSW50ID0gMCkgeworICAgICAga2V5VHlwZSA9IGs7CisgICAgICB2YWx1ZVR5cGUgPSB2OworICAgICAgc2l6ZSA9IHM7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTI2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUTWVzc2FnZSB7CisKKyAgICBwdWJsaWMgdmFyIG5hbWUgOiBTdHJpbmc7CisgICAgcHVibGljIHZhciB0eXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2VxaWQgOiBJbnQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG4gOiBTdHJpbmcgPSAiIiwgdCA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICBuYW1lID0gbjsKKyAgICAgIHR5cGUgPSB0OworICAgICAgc2VxaWQgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpIDogU3RyaW5nIHsKKyAgICAgIHJldHVybiAiPFRNZXNzYWdlIG5hbWU6JyIgKyBuYW1lICsgIicgdHlwZTogIiArIHR5cGUgKyAiIHNlcWlkOiIgKyBzZXFpZCArICI+IjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG90aGVyOlRNZXNzYWdlKSA6IEJvb2wgeworICAgICAgcmV0dXJuIG5hbWUgPT0gb3RoZXIubmFtZSAmJiB0eXBlID09IG90aGVyLnR5cGUgJiYgc2VxaWQgPT0gb3RoZXIuc2VxaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZDMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuaHgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitAOmVudW0KK2Fic3RyYWN0IFRNZXNzYWdlVHlwZShJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQ0FMTCAgICAgIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUkVQTFkgICAgIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgRVhDRVBUSU9OIDogSW50ID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgT05FV0FZICAgIDogSW50ID0gNDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWEzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmh4CkBAIC0wLDAgKzEsMTc3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICogVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICogYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudHMgVFByb2Nlc3NvcgoreworICAgIHByaXZhdGUgdmFyIHNlcnZpY2VQcm9jZXNzb3JNYXAgOiBTdHJpbmdNYXA8VFByb2Nlc3Nvcj4gPSBuZXcgU3RyaW5nTWFwPFRQcm9jZXNzb3I+KCk7CisgICAgcHJpdmF0ZSB2YXIgZGVmYXVsdFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgKiByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQXJnczoKKyAgICAgKiAtIHNlcnZpY2VOYW1lICAgIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICogLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIFJlZ2lzdGVyUHJvY2Vzc29yKHNlcnZpY2VOYW1lIDogU3RyaW5nLCBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yLCBhc0RlZmF1bHQgOiBCb29sID0gZmFsc2UpIDogVm9pZCB7CisgICAgICAgIHNlcnZpY2VQcm9jZXNzb3JNYXAuc2V0KHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgICAgICBpZiAoIGFzRGVmYXVsdCkgeworICAgICAgICAgICAgaWYoIGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOLCAiQ2FuJ3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0IHByb2Nlc3NvcnMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBGYWlsKCBvcHJvdCA6IFRQcm90b2NvbCwgbWVzc2FnZSA6IFRNZXNzYWdlLCBleHR5cGUgOiBJbnQsIGV0eHQgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHZhciBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtZXNzYWdlLnNlcWlkKTsKKworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXdNZXNzYWdlKTsKKyAgICAgICAgYXBwZXgud3JpdGUoIG9wcm90KTsKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAqIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICogLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAqIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgKiAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgKgorICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgKiAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvcgorICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCB7CisgICAgICAgIC8qICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLiAqLworCisgICAgICAgIHZhciBtZXNzYWdlIDogVE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIHZhciBtZXRob2ROYW1lIDogU3RyaW5nID0gIiI7CisKKyAgICAgICAgaWYgKChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwpICYmIChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgdmFyIGFjdHVhbFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworICAgICAgICB2YXIgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHByb2Nlc3NvcgorICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1lc3NhZ2UubmFtZTsKKyAgICAgICAgICAgIGFjdHVhbFByb2Nlc3NvciA9IGRlZmF1bHRQcm9jZXNzb3I7CisgICAgICAgICAgICBpZiggYWN0dWFsUHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UubmFtZSArICIgYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIGRlZmluZWQuICIgKworICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXJ2aWNlIG5hbWUgZ2l2ZW4KKyAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoIHNlcnZpY2VOYW1lLmxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5sZW5ndGgpOworICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yID0gc2VydmljZVByb2Nlc3Nvck1hcC5nZXQoIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmKCBhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKCBtZXRob2ROYW1lLCBtZXNzYWdlLnR5cGUsIG1lc3NhZ2Uuc2VxaWQpOworICAgICAgICB2YXIgc3RvcmVkTXNnID0gbmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbCggaXByb3QsIG5ld01lc3NhZ2UpOworICAgICAgICByZXR1cm4gYWN0dWFsUHJvY2Vzc29yLnByb2Nlc3MoIHN0b3JlZE1zZywgb3Byb3QpOworICAgIH0KK30KKworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgdmFyIG1lc3NhZ2VCZWdpbiA6IFRNZXNzYWdlOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wsIG1lc3NhZ2VCZWdpbiA6IFRNZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKCBwcm90b2NvbCk7CisgICAgICAgIHRoaXMubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCkgOiBUTWVzc2FnZSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQmVnaW47CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjZDFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAqICAgICB0cmFuc3BvcnQub3BlbigpOworICoKKyAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAqCisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAqCisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKworICAgIC8qKiBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNFUEFSQVRPUiA6IFN0cmluZyA9ICI6IjsKKworICAgIHByaXZhdGUgdmFyIHNlcnZpY2UgOiBTdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEFyZ3M6CisgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb3RvY29sIDogVFByb3RvY29sLCBzZXJ2aWNlTmFtZSA6IFN0cmluZykgICAgeworICAgICAgICBzdXBlciggcHJvdG9jb2wpOworICAgICAgICBzZXJ2aWNlID0gc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgKiBBcmdzOgorICAgICAqICAgdE1lc3NhZ2UgICAgIFRoZSBvcmlnaW5hbCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbiggbWVzc2FnZSA6IFRNZXNzYWdlKSA6IFZvaWQgeworICAgICAgICBzd2l0Y2goIG1lc3NhZ2UudHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ0FMTDoKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZCkpOworCisgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PTkVXQVk6CisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlICsgU0VQQVJBVE9SICsgbWVzc2FnZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxaWQpKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmMzg0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyogUHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb24KKyovCitpbnRlcmZhY2UgVFByb3RvY29sIHsKKworICAgIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlOlRNZXNzYWdlKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4obGlzdDpUTGlzdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKHNldDpUU2V0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVCeXRlKGIgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUk2NChpNjQgOiBoYXhlLkludDY0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVEb3VibGUoZHViIDogRmxvYXQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHIgOiBTdHJpbmcpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW4gOiBCeXRlcykgOiBWb2lkOworCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqLworICAgIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZTsKKyAgICBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0OworICAgIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKTpURmllbGQ7CisgICAgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpOlRNYXA7CisgICAgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3Q7CisgICAgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCk6VFNldDsKKyAgICBmdW5jdGlvbiByZWFkU2V0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sOworICAgIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50OworICAgIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludDsKKyAgICBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0OworICAgIGZ1bmN0aW9uIHJlYWREb3VibGUoKSA6IEZsb2F0OworICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZzsKKyAgICBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlczsKKworICAgIC8vIHJlY3Vyc2lvbiB0cmFja2luZworICAgIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ZTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKQEAgLTAsMCArMSwyMjYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuSW50NjQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAorICogcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiAgV2hpbGUgaXQgaGFzCisgKiBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAqIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgKgorICogU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICogU2VlIFRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciBpbXBsZW1lbnRzIFRQcm90b2NvbAoreworICAgIHByaXZhdGUgdmFyIHdyYXBwZWQgOiBUUHJvdG9jb2w7CisKKyAgICAvKioKKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXcoIHByb3RvY29sIDogVFByb3RvY29sKSAgLy8gbm90IHRvIGJlIGluc3RhbnRpYXRlZCwgbXVzdCBkZXJpdmUgYSBjbGFzcworICAgIHsKKyAgICAgICAgd3JhcHBlZCA9IHByb3RvY29sOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHJhbnNwb3J0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCB2YWx1ZSA6IFRNZXNzYWdlKSA6IFZvaWQgICAgeworICAgICAgICB3cmFwcGVkLndyaXRlTWVzc2FnZUJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4odmFsdWUgOiBUU3RydWN0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RydWN0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbih2YWx1ZSA6IFRGaWVsZCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbiggdmFsdWUgOiBUTWFwKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTWFwQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCB2YWx1ZSA6IFRMaXN0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTGlzdEJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oIHZhbHVlIDogVFNldCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZVNldEJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2wodmFsdWUgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlQm9vbCggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCeXRlKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KHZhbHVlIDogSW50KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTE2KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKHZhbHVlIDogSW50KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTMyKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KHZhbHVlIDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUk2NCggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSh2YWx1ZSA6IEZsb2F0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlRG91YmxlKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHZhbHVlIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RyaW5nKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KHZhbHVlIDogQnl0ZXMgKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlQmluYXJ5KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKSA6IFRNZXNzYWdlIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCkgOiBUU3RydWN0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRNYXBCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKSA6IFRMaXN0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZExpc3RCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFNldEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCb29sKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkSTE2KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJMzIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJNjQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgpIDogRmxvYXQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkQmluYXJ5KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjM3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgICAgLy8gV0FSTklORzogVGhlc2UgYXJlIHN1YmplY3QgdG8gYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgc28gd2UgY2FuJ3QgdXNlIGVudW1zCisgICAgLy8gd2l0aCBIYXhlIDMuMS4zIGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2NDkKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgVU5LTk9XTiA6IEludCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfREFUQSA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE5FR0FUSVZFX1NJWkUgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTSVpFX0xJTUlUIDogSW50ID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQkFEX1ZFUlNJT04gOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBOT1RfSU1QTEVNRU5URUQgOiBJbnQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERVBUSF9MSU1JVCA6IEludCA9IDY7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGVycm9yIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvcik7CisgICAgfQorCisKK30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJkNjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKK2ludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgZnVuY3Rpb24gZ2V0UHJvdG9jb2wodHJhbnM6VFRyYW5zcG9ydCk6VFByb3RvY29sOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxZTQwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworCisgIC8qKgorICAgKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvdG9jb2wgZGF0YQorICAgKiBzdHJlYW1zLgorICAgKgorICAgKi8KK2NsYXNzIFRQcm90b2NvbFV0aWwgeworCisgICAgLyoqCisgICAgICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXAocHJvdDpUUHJvdG9jb2wsIHR5cGUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQm9vbCgpOworCisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTE2KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTMyKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTY0KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZDpURmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hcDpUTWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIDAgLi4uIG1hcC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIG1hcC5rZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLnZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNldDpUU2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqIGluIDAgLi4uIHNldC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIHNldC5lbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0OlRMaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayBpbiAwIC4uLiBsaXN0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgIlVua25vd24gZmllbGQgdHlwZSAke3R5cGV9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlOkR5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAyMTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CisKKworY2xhc3MgVFJlY3Vyc2lvblRyYWNrZXIgeworCisgICAgLy8gZGVmYXVsdAorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsKKworICAgIC8vIGxpbWl0IGFuZCBhY3R1YWwgdmFsdWUKKyAgICBwdWJsaWMgdmFyIHJlY3Vyc2lvbkxpbWl0IDogSW50ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgcHJpdmF0ZSB2YXIgcmVjdXJzaW9uRGVwdGggOiBJbnQgPSAwOworCisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkCisgICAgeworICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYWIzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0Lmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVFNldCB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1UeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgICAgZWxlbVR5cGUgPSB0OworICAgICAgICBzaXplID0gczsKKyAgICAgIH0KKworfSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGI3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRTdHJ1Y3QgeworCisgICAgcHVibGljIHZhciBuYW1lIDogU3RyaW5nOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhuIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIG5hbWUgPSBuOworICAgIH0KKworfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmJjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitAOmVudW0KK2Fic3RyYWN0IFRUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVE9QIDogSW50ICAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBWT0lEIDogSW50ICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCT09MIDogSW50ICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCWVRFIDogSW50ICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBET1VCTEUgOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMTYgOiBJbnQgICAgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMzIgOiBJbnQgICAgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJNjQgOiBJbnQgICAgPSAxMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSSU5HIDogSW50ID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNUUlVDVCA6IEludCA9IDEyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNQVAgOiBJbnQgICAgPSAxMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VUIDogSW50ICAgID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIExJU1QgOiBJbnQgICA9IDE1OworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZWVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2NsYXNzIFRTZXJ2ZXIKK3sKKyAgICBwcml2YXRlIHZhciBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBpbnB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworCisgICAgLy8gc2VydmVyIGV2ZW50cworICAgIHB1YmxpYyB2YXIgc2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciA9IG51bGw7CisKKyAgICAvLyBMb2cgZGVsZWdhdGlvbgorICAgIHByaXZhdGUgdmFyIF9sb2dEZWxlZ2F0ZSA6IER5bmFtaWMtPlZvaWQgID0gbnVsbDsKKyAgICBwdWJsaWMgdmFyIGxvZ0RlbGVnYXRlKGdldCxzZXQpIDogRHluYW1pYy0+Vm9pZDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlIDogRHluYW1pYy0+Vm9pZCA9IG51bGwpCisgICAgeworICAgICAgdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IGxvZ0RlbGVnYXRlOworCisgICAgICBBcHBseU1pc3NpbmdEZWZhdWx0cygpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gQXBwbHlNaXNzaW5nRGVmYXVsdHMoKSB7CisgICAgICAgIGlmKCBwcm9jZXNzb3IgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHNlcnZlciBjb25maWd1cmF0aW9uOiBwcm9jZXNzb3IgbWlzc2luZyI7CisgICAgICAgIGlmKCBzZXJ2ZXJUcmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHNlcnZlciBjb25maWd1cmF0aW9uOiBzZXJ2ZXJUcmFuc3BvcnQgbWlzc2luZyI7CisgICAgICAgIGlmKCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICBpZiggb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSAgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgaWYoIGlucHV0UHJvdG9jb2xGYWN0b3J5ICA9PSBudWxsKQorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICBpZiggb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID09IG51bGwpCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGlmKCBsb2dEZWxlZ2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgbG9nRGVsZWdhdGUgPSBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHNldF9sb2dEZWxlZ2F0ZSh2YWx1ZSA6IER5bmFtaWMtPlZvaWQpIDogRHluYW1pYy0+Vm9pZCB7CisgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9sb2dEZWxlZ2F0ZSA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX2xvZ0RlbGVnYXRlID0gRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9sb2dEZWxlZ2F0ZSgpIDogRHluYW1pYy0+Vm9pZCB7CisgICAgICAgIHJldHVybiBfbG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIERlZmF1bHRMb2dEZWxlZ2F0ZSh2YWx1ZSA6IER5bmFtaWMpIDogVm9pZCAgeworICAgICAgICB0cmFjZSggdmFsdWUpOworICAgIH0KKworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU2VydmUoKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIFN0b3AoKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM5OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CisKKworLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgoraW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworCisgICAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucworICAgIGZ1bmN0aW9uIHByZVNlcnZlKCkgOiBWb2lkOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcKKyAgICBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KCBpbnB1dCA6IFRQcm90b2NvbCwgb3V0cHV0IDogVFByb3RvY29sKSA6IER5bmFtaWM7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQKKyAgICBmdW5jdGlvbiBkZWxldGVDb250ZXh0KCBzZXJ2ZXJDb250ZXh0IDogRHluYW1pYywgaW5wdXQgOiBUUHJvdG9jb2wsIG91dHB1dCA6IFRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yCisgICAgZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHQoIHNlcnZlckNvbnRleHQgOiBEeW5hbWljLCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0KSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwMDc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyICB7CisKKyAgICBwcml2YXRlIHZhciBzdG9wIDogQm9vbCA9IGZhbHNlOworCisgICAgLy9zdG9wcyBqdXN0IGFmdGVyIGlucHV0IHRyYW5zcG9ydCByZXR1cm5zIEVPRgorICAgIC8vdXNlZnVsIGZvciBsaW1pdGVkIHNjZW5hcmlvcywgbGlrZSBlbWJlZGluZyBpbnRvIHBocCBzZXJ2ZXIKKyAgICBwdWJsaWMgdmFyIHJ1bk9uY2UgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCkgeworICAgICAgc3VwZXIoIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbG9nZ2VyKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBTZXJ2ZSgpIDogVm9pZAorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAodHR4IDogVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCwKKyAgICAgICAgLy8gYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSggISBzdG9wKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50IDogVFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICB2YXIgaW5wdXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBvdXRwdXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBpbnB1dFByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBvdXRwdXRQcm90b2NvbCA6IFRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICB2YXIgY29ubmVjdGlvbkNvbnRleHQgOiBEeW5hbWljID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KCBjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydCggY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKCBvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0CisgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHByb2Nlc3Nvci5wcm9jZXNzKCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCB0dHggOiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBpZihydW5PbmNlICYmIHR0eC5lcnJvcklEID09IFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICAgIC8vaW5wdXQgcmV0dXJucyBlb2YsIGV4aXQKKyAgICAgICAgICAgICAgICAgIC8vZm9sbG93cyBsaWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCisgICAgICAgICAgICAgICAgICBTdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHBleCA6IFRQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgnJHBleCAke3BleC5lcnJvcklEfSAke3BleC5lcnJvck1zZ30nKTsgLy8gVW5leHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKGUpOyAvLyBVbmV4cGVjdGVkCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGNsaWVudCAhPSBudWxsICYmICFydW5PbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBTdG9wKCkgOiBWb2lkCisgICAgeworICAgICAgc3RvcCA9IHRydWU7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzNmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvLyBjb25zdGFudHMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9CVUZTSVpFIDogSW50ID0gMHgxMDAwOyAgICAvLyA0MDk2IEJ5dGVzCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1JTl9CVUZTSVpFIDogSW50ID0gMHgxMDA7ICAgICAgICAgLy8gMjU2IEJ5dGVzCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BWF9CVUZTSVpFIDogSW50ID0gMHgxMDAwMDA7ICAgICAgLy8gMSBNQgorCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICBwdWJsaWMgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogIFRUcmFuc3BvcnQgPSBudWxsOworCisgICAgLy8gQnVmZmVyIGZvciBpbnB1dC9vdXRwdXQKKyAgICBwcml2YXRlIHZhciByZWFkQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHdyaXRlQnVmZmVyXyA6IEJ5dGVzT3V0cHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBidWZTaXplIDogSW50OworCisgICAgLy8gQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgYnVmU2l6ZSA6IEludCA9IERFRkFVTFRfQlVGU0laRSkgeworCisgICAgICAgIC8vIGVuc3VyZSBidWZmZXIgc2l6ZSBpcyBpbiB0aGUgcmFuZ2UKKyAgICAgICAgaWYgKCBidWZTaXplIDwgTUlOX0JVRlNJWkUpCisgICAgICAgICAgICBidWZTaXplID0gTUlOX0JVRlNJWkU7CisgICAgICAgIGVsc2UgaWYoIGJ1ZlNpemUgPiBNQVhfQlVGU0laRSkKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBNQVhfQlVGU0laRTsKKworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpIDogQm9vbCB7CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQuaXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZWFkQnVmZmVyXyAhPSBudWxsKSAmJiAocmVhZEJ1ZmZlcl8ucG9zaXRpb24gPCByZWFkQnVmZmVyXy5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBnb3QgPSByZWFkQnVmZmVyXy5yZWFkQnl0ZXMoZGF0YSwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLCAwLCBnb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHBvaW50IGluIGJ1ZmZlcmluZyB3aGVuZXZlciB0aGUKKyAgICAgICAgICAgICAgICAvLyByZW1haW5pbmcgbGVuZ3RoIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplCisgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gYnVmU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB2YXIgZ290ID0gdHJhbnNwb3J0LnJlYWQoIGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgaWYgKCByZWFkQ2h1bmsoKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWFkQ2h1bmsoKSA6IEludCB7CisgICAgICAgIHZhciBzaXplID0gYnVmU2l6ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemUgPSB0cmFuc3BvcnQucmVhZCggYnVmZmVyLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkc2l6ZSBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVDaHVuayhmb3JjZVdyaXRlIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIHdyaXRlQnVmZmVyXy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpZiAoIGZvcmNlV3JpdGUgfHwgKHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gYnVmU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB2YXIgYnVmID0gd3JpdGVCdWZmZXJfLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXJfID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXJfLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgaGFsZlNpemUgOiBJbnQgPSBTdGQuaW50KGJ1ZlNpemUgLyAyKTsKKworICAgICAgICAvLyBObyBwb2ludCBpbiBidWZmZXJpbmcgaWYgbGVuIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplLgorICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYnVmZmVyIGlzIGxlc3MgdGhhbiBoYWxmIGZ1bGwgd2Ugc2hvdWxkIHN0aWxsIGNvbnNpZGVyCisgICAgICAgIC8vIHNxdWFzaGluZyBhbGwgaW50byBvbmUgd3JpdGUsIGV4Y2VwdCB3aGVuIHRoZSBhY3R1YWwgd3JpdGUgbGVuIGlzIHZlcnkgbGFyZ2UuCisgICAgICAgIHZhciBodWdlX3dyaXRlIDogQm9vbCA9IChsZW4gPj0gKDIgKiBidWZTaXplKSk7CisgICAgICAgIHZhciBleGNlZWRzX2J1ZiA6IEJvb2wgPSBodWdlX3dyaXRlIHx8IChsZW4gPj0gYnVmU2l6ZSk7CisgICAgICAgIHZhciB3cml0ZV90aHJ1IDogQm9vbCA9IGV4Y2VlZHNfYnVmICYmICh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID49IGhhbGZTaXplKTsKKyAgICAgICAgaWYgKCB3cml0ZV90aHJ1KSB7CisgICAgICAgICAgICB3cml0ZUNodW5rKHRydWUpOyAvLyBmb3JjZSBzZW5kIHdoYXRldmVyIHdlIGhhdmUgaW4gdGhlcmUKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShidWYsIG9mZiwgbGVuKTsgIC8vIHdyaXRlIHRocnUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyXy53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgd3JpdGVDaHVuayhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goIGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVDaHVuayh0cnVlKTsKKyAgICAgICAgdHJhbnNwb3J0LmZsdXNoKGNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5ZTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHByaXZhdGUgdmFyIGJ1ZlNpemUgOiBJbnQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGJ1ZlNpemUgOiBJbnQgPSBUQnVmZmVyZWRUcmFuc3BvcnQuREVGQVVMVF9CVUZTSVpFKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChiYXNlIDogVFRyYW5zcG9ydCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoYmFzZSwgYnVmU2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVTdHJlYW0uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4YWQxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVTdHJlYW0uaHgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5JbnB1dDsKK2ltcG9ydCBoYXhlLmlvLk91dHB1dDsKKworCitlbnVtIFRGaWxlTW9kZSB7CisgICAgQ3JlYXRlTmV3OworICAgIEFwcGVuZDsKKyAgICBSZWFkOworfQorCisKK2NsYXNzIFRGaWxlU3RyZWFtIGltcGxlbWVudHMgVFN0cmVhbSB7CisKKyAgICBwdWJsaWMgdmFyIEZpbGVOYW1lKGRlZmF1bHQsbnVsbCkgOiBTdHJpbmc7CisKKyAgICBwcml2YXRlIHZhciBJbnB1dCAgOiBzeXMuaW8uRmlsZUlucHV0OworICAgIHByaXZhdGUgdmFyIE91dHB1dCA6IHN5cy5pby5GaWxlT3V0cHV0OworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBmbmFtZSA6IFN0cmluZywgbW9kZSA6IFRGaWxlTW9kZSkgeworICAgICAgICBGaWxlTmFtZSA9IGZuYW1lOworICAgICAgICBzd2l0Y2ggKCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5DcmVhdGVOZXc6CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gc3lzLmlvLkZpbGUud3JpdGUoIGZuYW1lLCB0cnVlKTsKKworICAgICAgICAgICAgY2FzZSBURmlsZU1vZGUuQXBwZW5kOgorICAgICAgICAgICAgICAgIE91dHB1dCA9IHN5cy5pby5GaWxlLmFwcGVuZCggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5SZWFkOgorICAgICAgICAgICAgICAgIElucHV0ID0gc3lzLmlvLkZpbGUucmVhZCggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtb2RlIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZCB7CisgICAgICAgIGlmKCBJbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnB1dC5jbG9zZSgpOworICAgICAgICAgICAgSW5wdXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmKCBPdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgT3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFBlZWsoKSA6IEJvb2wgeworICAgICAgICBpZiggSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3IgaW5wdXQiKTsKKworICAgICAgICByZXR1cm4gKCEgSW5wdXQuZW9mKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBJbnQgeworICAgICAgICBpZiggSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3IgaW5wdXQiKTsKKworICAgICAgICByZXR1cm4gSW5wdXQucmVhZEJ5dGVzKCBidWYsIG9mZnNldCwgY291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBXcml0ZSggYnVmIDogQnl0ZXMsIG9mZnNldCA6IEludCwgY291bnQgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmKCBPdXRwdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3Igb3V0cHV0Iik7CisKKyAgICAgICAgT3V0cHV0LndyaXRlQnl0ZXMoIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEZsdXNoKCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIE91dHB1dCAhPSBudWxsKQorICAgICAgICAgICAgT3V0cHV0LmZsdXNoKCk7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjgyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworaW1wb3J0IGhheGUuaW8uRW9mOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworCisvKioKKyAqIFRGcmFtZWRUcmFuc3BvcnQgaXMgYSBidWZmZXJlZCBUVHJhbnNwb3J0IHRoYXQgZW5zdXJlcyBhIGZ1bGx5IHJlYWQgbWVzc2FnZQorICogZXZlcnkgdGltZSBieSBwcmVjZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMDsKKworICAgIHZhciBtYXhMZW5ndGhfIDogIEludDsKKworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgdmFyIHRyYW5zcG9ydF8gOiAgVFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIG91dHB1dAorICAgICAqLworICAgIHZhciB3cml0ZUJ1ZmZlcl8gOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBpbnB1dAorICAgICAqLworICAgIHZhciByZWFkQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIDogSW50ID0gREVGQVVMVF9NQVhfTEVOR1RIKSB7CisgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGRhdGEgPSBCeXRlcy5hbGxvYyhsZW4pOworCisgICAgICAgICAgICBpZiAoKHJlYWRCdWZmZXJfICE9IG51bGwpICYmIChyZWFkQnVmZmVyXy5wb3NpdGlvbiA8IHJlYWRCdWZmZXJfLmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICB2YXIgZ290IDogSW50ID0gcmVhZEJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwwLGdvdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgICAgICAgICByZWFkRnJhbWUoKTsKKworICAgICAgICAgICAgdmFyIGdvdCA9IHJlYWRCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCBvZmYsIGxlbik7CisgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwwLGdvdCk7CisgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkbGVuIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBmdW5jdGlvbiByZWFkRnJhbWVTaXplKCkgOiBJbnQgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgdmFyIGxlbiA9IHRyYW5zcG9ydF8ucmVhZEFsbCggYnVmZmVyLCAwLCA0KTsKKyAgICAgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDQpOworICAgICAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkIDQgYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHJlYWRGcmFtZSgpIDogVm9pZCB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gcmVhZEZyYW1lU2l6ZSgpOworCisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCRzaXplKSEnKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGhfKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdGcmFtZSBzaXplICgkc2l6ZSkgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoJG1heExlbmd0aF8pIScpOworICAgICAgICB9OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICBzaXplID0gdHJhbnNwb3J0Xy5yZWFkQWxsKCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkc2l6ZSBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWYgOiBCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnVmZmVyXy53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIGZ1bmN0aW9uIHdyaXRlRnJhbWVTaXplKGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIobGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKCBjYWxsYmFjayA6IER5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIHZhciBidWYgOiBCeXRlcyA9IHdyaXRlQnVmZmVyXy5nZXRCeXRlcygpOworICAgICAgICB2YXIgbGVuIDogSW50ID0gYnVmLmxlbmd0aDsKKyAgICAgICAgd3JpdGVCdWZmZXJfID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKyAgICAgICAgd3JpdGVGcmFtZVNpemUobGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgIHRyYW5zcG9ydF8uZmx1c2goY2FsbGJhY2spOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ1YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKKworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgICB2YXIgbWF4TGVuZ3RoXyA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobWF4TGVuZ3RoIDogSW50ID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KGJhc2UgOiBUVHJhbnNwb3J0KSA6IFRUcmFuc3BvcnQgeworICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYmFzZSwgbWF4TGVuZ3RoXyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTcyODUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuaHgKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBmbGFzaC5lcnJvcnMuRU9GRXJyb3I7CitpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OworaW1wb3J0IGZsYXNoLmV2ZW50cy5JT0Vycm9yRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLlByb2dyZXNzRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLlNlY3VyaXR5RXJyb3JFdmVudDsKK2ltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyOworaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXJEYXRhRm9ybWF0OworaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0OworaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhSW5wdXQ7CitpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7CisKKworICAgIC8qKgorICAgICAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgICAqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisgICAgICogVW5saWtlIEh0dHAgQ2xpZW50LCBpdCB1c2VzIGEgc2luZ2xlIFBPU1QsIGFuZCBjaHVuay1lbmNvZGluZyB0byB0cmFuc2ZlciBhbGwgbWVzc2FnZXMuCisgICAgICovCisKKyAgICBwdWJsaWMgY2xhc3MgVEZ1bGxEdXBsZXhIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSB2YXIgc29ja2V0IDogU29ja2V0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgU3RyaW5nOworICAgICAgICBwcml2YXRlIHZhciBwb3J0ICA6ICBJbnQ7CisgICAgICAgIHByaXZhdGUgdmFyIHJlc291cmNlICA6ICBTdHJpbmc7CisgICAgICAgIHByaXZhdGUgdmFyIHN0cmlwcGVkICA6ICBCb29sID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgdmFyIG9idWZmZXIgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworICAgICAgICBwcml2YXRlIHZhciBpbnB1dCA6IElEYXRhSW5wdXQ7CisgICAgICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IElEYXRhT3V0cHV0OworICAgICAgICBwcml2YXRlIHZhciBieXRlc0luQ2h1bmsgIDogIEludCA9IDA7CisgICAgICAgIHByaXZhdGUgdmFyIENSTEYgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworICAgICAgICBwcml2YXRlIHZhciBpb0NhbGxiYWNrIDogVEV4Y2VwdGlvbi0+Vm9pZCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgdmFyIGV2ZW50RGlzcGF0Y2hlciA6IEV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoKTsKKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGhvc3QgIDogIFN0cmluZywgcG9ydCAgOiAgSW50LCByZXNvdXJjZSAgOiAgU3RyaW5nKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICBDUkxGLndyaXRlQnl0ZSgxMyk7CisgICAgICAgICAgICBDUkxGLndyaXRlQnl0ZSgxMCk7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zdHJpcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgc29ja2V0LmNsb3NlKCkKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCkgIDogIEJvb2wKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc29ja2V0LmNvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiQnl0ZXMgcmVtYWluZWQ6IiArIHNvY2tldC5ieXRlc0F2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5ieXRlc0F2YWlsYWJsZT4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIEludAorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbjEgIDogIEludCA9IDAsIG4yICA6ICBJbnQgPSAwLCBuMyAgOiAgSW50ID0gMCwgbjQgIDogIEludCA9IDAsIGNpZHggIDogIEludCA9IDI7CisgICAgICAgICAgICB2YXIgY2h1bmtTaXplIDogQnl0ZXMgPSBuZXcgQnl0ZXMoKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFzdHJpcHBlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gbjI7CisgICAgICAgICAgICAgICAgICAgIG4yID0gbjM7CisgICAgICAgICAgICAgICAgICAgIG4zID0gbjQ7CisgICAgICAgICAgICAgICAgICAgIG40ID0gaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChuMSA9PSAxMykgJiYgKG4yID09IDEwKSAmJiAobjMgPT0gMTMpICYmIChuNCA9PSAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlYWQgY2h1bmsgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChieXRlc0luQ2h1bmsgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBpbnB1dC5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZS53cml0ZUJ5dGUobjEpOworICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUud3JpdGVCeXRlKG4yKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoISgobjEgPT0gMTMpICYmIChuMiA9PSAxMCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuMSA9IG4yOworICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplLndyaXRlQnl0ZShuMik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBieXRlc0luQ2h1bmsgPSBwYXJzZUludChjaHVua1NpemUudG9TdHJpbmcoKSwgMTYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlucHV0LnJlYWRCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBkZWJ1Z0J1ZmZlcihidWYpOworICAgICAgICAgICAgICAgIGJ5dGVzSW5DaHVuayAtPSBsZW47CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNJbkNodW5rID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSAgOiAgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgIGlucHV0LnJlYWRVVEZCeXRlcygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRU9GRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZScpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoZSA6IEVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvcjogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdCYWQgSU8gZXJyb3I6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1Z0J1ZmZlcihidWYgOiBCeXRlcykgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRlYnVnICA6ICBTdHJpbmcgPSAiQlVGRkVSID4+IjsKKyAgICAgICAgICAgIHZhciBpICA6ICBJbnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlYnVnICs9IGJ1ZltpXSBhcyBpbnQ7CisgICAgICAgICAgICAgICAgZGVidWcgKz0gIiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZShkZWJ1ZyArICI8PCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgIDogIEludCwgbGVuICA6ICBJbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUgIDogIFN0cmluZywgbGlzdGVuZXIgOiBGdW5jdGlvbiwgdXNlQ2FwdHVyZSAgOiAgQm9vbCA9IGZhbHNlLCBwcmlvcml0eSAgOiAgSW50ID0gMCwgdXNlV2Vha1JlZmVyZW5jZSAgOiAgQm9vbCA9IGZhbHNlKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT05ORUNULCBzb2NrZXRDb25uZWN0ZWQpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihJT0Vycm9yRXZlbnQuSU9fRVJST1IsIHNvY2tldEVycm9yKTsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoU2VjdXJpdHlFcnJvckV2ZW50LlNFQ1VSSVRZX0VSUk9SLCBzb2NrZXRTZWN1cml0eUVycm9yKTsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoUHJvZ3Jlc3NFdmVudC5TT0NLRVRfREFUQSwgc29ja2V0RGF0YUhhbmRsZXIpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXRDb25uZWN0ZWQoZXZlbnQgOiBFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCAiQ09OTkVDVCAiICsgcmVzb3VyY2UgKyAiIEhUVFAvMS4xXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkhvc3QgOiAgIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZXItQWdlbnQgOiAgVGhyaWZ0L0hheGVcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUcmFuc2Zlci1FbmNvZGluZyA6ICBjaHVua2VkXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29udGVudC10eXBlIDogIGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWNjZXB0IDogICovKlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxyXG4iKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldEVycm9yKGV2ZW50IDogSU9FcnJvckV2ZW50KSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgiRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGlvQ2FsbGJhY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIklPRXJyb3IgOiAgIiArIGV2ZW50LnRleHQpKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldFNlY3VyaXR5RXJyb3IoZXZlbnQgOiBTZWN1cml0eUVycm9yRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJTZWN1cml0eSBFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXREYXRhSGFuZGxlcihldmVudCA6IFByb2dyZXNzRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJHb3QgRGF0YSBjYWxsOiIgK2lvQ2FsbGJhY2spOworICAgICAgICAgICAgaWYgKGlvQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrIDogRXJyb3ItPlZvaWQgPSBudWxsKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgic2V0IGNhbGxiYWNrOiIgKyBjYWxsYmFjayk7CisgICAgICAgICAgICB0aGlzLmlvQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKHRoaXMub2J1ZmZlci5sZW5ndGgudG9TdHJpbmcoMTYpKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXMoQ1JMRik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKHRoaXMub2J1ZmZlcik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKENSTEYpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuZmx1c2goKTsKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yICBuZXcgRmxleCBzZGsgMy41CisgICAgICAgICAgICAvL3RoaXMub2J1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgdGhpcy5vYnVmZmVyID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgIDogIEJvb2wKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh0aGlzLnNvY2tldCA9PSBudWxsID8gZmFsc2UgIDogIHRoaXMuc29ja2V0LmNvbm5lY3RlZCk7CisgICAgICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Zjg2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmh4CkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CisKK2ltcG9ydCBoYXhlLkh0dHA7CisKKworCisvKioKKyogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisqLworCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdEJ1ZmZlcl8gIDogQnl0ZXNPdXRwdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICBwcml2YXRlIHZhciByZXNwb25zZUJ1ZmZlcl8gOiBCeXRlc0lucHV0ID0gbnVsbDsKKworICAgIHByaXZhdGUgdmFyIHJlcXVlc3RfICAgICAgICA6IEh0dHAgPSBudWxsOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCByZXF1ZXN0VXJsIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICAgIHJlcXVlc3RfID0gbmV3IEh0dHAocmVxdWVzdFVybCk7CisgICAgICAgIHJlcXVlc3RfLmFkZEhlYWRlciggImNvbnRlbnRUeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZjpCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgaWYgKHJlc3BvbnNlQnVmZmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA9Qnl0ZXMuYWxsb2MobGVuKTsKKyAgICAgICAgbGVuID0gcmVzcG9uc2VCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCBvZmYsIGxlbik7CisgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RHluYW1pYy0+Vm9pZCA9IG51bGwpIDogVm9pZCB7CisgICAgICAgIHZhciBidWZmZXIgPSByZXF1ZXN0QnVmZmVyXzsKKyAgICAgICAgcmVxdWVzdEJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbnVsbDsKKworICAgICAgICByZXF1ZXN0Xy5vbkRhdGEgPSBmdW5jdGlvbihkYXRhIDogU3RyaW5nKSB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB0bXAuYWRkU3RyaW5nKGRhdGEpOworICAgICAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbmV3IEJ5dGVzSW5wdXQodG1wLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgaWYoIGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0Xy5vbkVycm9yID0gZnVuY3Rpb24obXNnIDogU3RyaW5nKSB7CisgICAgICAgICAgICBpZiggY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIklPRXJyb3I6ICIgKyBtc2cpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0Xy5zZXRQb3N0RGF0YShidWZmZXIuZ2V0Qnl0ZXMoKS50b1N0cmluZygpKTsKKyAgICAgICAgcmVxdWVzdF8ucmVxdWVzdCh0cnVlLypQT1NUKi8pOworICAgIH0KKworfQorCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYWRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLnJlbW90aW5nLlNvY2tldFByb3RvY29sOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworaW1wb3J0IGhheGUuaW8uRW9mOworCisvL2ltcG9ydCBmbGFzaC5uZXQuU2VydmVyU29ja2V0OyAtIG5vdCB5ZXQgYXZhaWxhYmxlIG9uIEhheGUgMy4xLjMKKyNpZiAhIChmbGFzaCB8fCBodG1sNSkKKworaW1wb3J0IHN5cy5uZXQuSG9zdDsKKworCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgICAvLyBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldAorICAgIHByaXZhdGUgdmFyIF9zb2NrZXQgOiBTb2NrZXQ9IG51bGw7CisKKyAgICAvLyBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAorICAgIHByaXZhdGUgdmFyIF9jbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1OworCisgICAgLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCisgICAgcHJpdmF0ZSB2YXIgX3VzZUJ1ZmZlcmVkU29ja2V0cyA6IEJvb2wgPSBmYWxzZTsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyg/YWRkcmVzcyA6IFN0cmluZyA9ICdsb2NhbGhvc3QnLCAgcG9ydCA6IEludCwgY2xpZW50VGltZW91dCA6IEZsb2F0ID0gNSwgdXNlQnVmZmVyZWRTb2NrZXRzIDogQm9vbCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBfc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgX3NvY2tldC5iaW5kKCBuZXcgSG9zdChhZGRyZXNzKSwgcG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICRwb3J0OiAkZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gTGlzdGVuKCkgOiBWb2lkCisgICAgeworICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICBpZiAoX3NvY2tldCAhPSBudWxsKSAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgIXBocAorICAgICAgICAgICAgICAgIF9zb2NrZXQubGlzdGVuKDEpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRXJyb3IgJGUnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAkZScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBvdmVycmlkZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBpZiAoX3NvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWNjZXB0ZWQgPSBfc29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRTb2NrZXQuZnJvbVNvY2tldChhY2NlcHRlZCk7CisgICAgICAgICAgICByZXN1bHQuc2V0VGltZW91dCggX2NsaWVudFRpbWVvdXQpOworCisgICAgICAgICAgICBpZiggX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiYnVmZmVyZWQgdHJhbnNwb3J0IG5vdCB5ZXQgc3VwcG9ydGVkIjsgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAvL3Jlc3VsdCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJyRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIGlmIChfc29ja2V0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRXJyb3IgJGUnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZApkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODk5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gQWNjZXB0KCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IEFjY2VwdEltcGwoKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MWFiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworI2lmIGZsYXNoCitpbXBvcnQgZmxhc2gubmV0LlNvY2tldDsKKyNlbHNlaWYganMKK2ltcG9ydCBqcy5odG1sLldlYlNvY2tldDsKKyNlbHNlCitpbXBvcnQgaGF4ZS5yZW1vdGluZy5Tb2NrZXRQcm90b2NvbDsKKyNlbmQKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworaW1wb3J0IGhheGUuaW8uRW9mOworCisKKyNpZiAhIChmbGFzaCB8fCBqcykKK2ltcG9ydCBzeXMubmV0Lkhvc3Q7CisjZW5kCisKKworICAvKioKKyAgICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyAgICogVGhyaWZ0IFNvY2tldCBTZXJ2ZXIgYmFzZWQgaW1wbGVtZW50YXRpb25zLgorICAgKi8KKworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQgIHsKKworICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgU3RyaW5nOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgSG9zdDsKKyAgICAjZW5kCisKKyAgICBwcml2YXRlIHZhciBwb3J0ICA6ICBJbnQ7CisKKyAgICAjaWYganMKKyAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBXZWJTb2NrZXQgPSBudWxsOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgc29ja2V0IDogU29ja2V0ID0gbnVsbDsKKyAgICAjZW5kCisKKyAgICAjaWYganMKKyAgICBwcml2YXRlIHZhciBpbnB1dCA6IER5bmFtaWMgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IFdlYlNvY2tldCA9IG51bGw7CisgICAgI2Vsc2VpZiBmbGFzaAorICAgIHByaXZhdGUgdmFyIGlucHV0IDogU29ja2V0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXQgOiBTb2NrZXQgPSBudWxsOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQgOiBJbnB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogT3V0cHV0ID0gbnVsbDsKKyAgICAjZW5kCisKKyAgICBwcml2YXRlIHZhciB0aW1lb3V0IDogRmxvYXQgPSAzMDsKKworICAgIHByaXZhdGUgdmFyIG9idWZmZXIgOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2sgOiBURXhjZXB0aW9uLT5Wb2lkID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciByZWFkQ291bnQgOiBJbnQgPSAwOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhob3N0IDogU3RyaW5nLCBwb3J0ICA6ICBJbnQpICA6ICBWb2lkICB7CisgICAgICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICNlbHNlCisgICAgICAgIHRoaXMuaG9zdCA9IG5ldyBIb3N0KGhvc3QpOworICAgICAgICAjZW5kCisKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICAjaWYgISAoZmxhc2ggfHwganMpCisgICAgLy8gdXNlZCBieSBUU29ja2V0U2VydmVyCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU29ja2V0KCBzb2NrZXQgOiBTb2NrZXQpIDogVFNvY2tldCAgeworICAgICAgICB2YXIgc29ja2V0SG9zdCA9IHNvY2tldC5ob3N0KCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVFNvY2tldChzb2NrZXRIb3N0Lmhvc3QudG9TdHJpbmcoKSwgc29ja2V0SG9zdC5wb3J0KTsKKyAgICAgICAgcmVzdWx0LmFzc2lnblNvY2tldChzb2NrZXQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAjZW5kCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSAgOiAgVm9pZCAgeworICAgICAgICBpbnB1dCA9IG51bGw7CisgICAgICAgIG91dHB1dCA9IG51bGw7CisgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCkgIDogIEJvb2wgIHsKKyAgICAgICAgaWYoIChpbnB1dCA9PSBudWxsKSB8fCAoc29ja2V0ID09IG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjaWYgZmxhc2gKKyAgICAgICAgICAgIHJldHVybiAoaW5wdXQuYnl0ZXNBdmFpbGFibGUgPiAwKTsKKyAgICAgICAgICAgICNlbHNlaWYganMKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHZhciByZWFkeSA9IFNvY2tldC5zZWxlY3QoIFtzb2NrZXRdLCBudWxsLCBudWxsLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAocmVhZHkucmVhZC5sZW5ndGggPiAwKTsKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0dCBvZmZzZXQgb2ZmLgorICAgIC8vIE1heSByZXR1cm4gbGVzcyBieXRlcyB0aGFuIGxlbiByZXF1aXJlZAorICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50ICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmIGZsYXNoCisKKyAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBsZW47CisgICAgICAgICAgICB3aGlsZSggcmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlKCBpbnB1dC5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgICAgICAtLXJlbWFpbmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW47CisKKyAgICAgICAgICAgICNlbHNlaWYganMKKworICAgICAgICAgICAgaWYoIGlucHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJTdGlsbCBubyBkYXRhICIpOyAgLy8gZG9uJ3QgYmxvY2sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuciA9IGxlbjsKKyAgICAgICAgICAgIHdoaWxlKCBuciA8IGxlbikgeworICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlKCBpbnB1dC5nZXQob2ZmK25yKSk7CisgICAgICAgICAgICAgICAgKytucjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW47CisKKyAgICAgICAgICAgICNlbHNlCisKKyAgICAgICAgICAgIC8vc29ja2V0LndhaXRGb3JSZWFkKCk7ICAtICBubywgdGhpcyBpZ25vcmVzIHRpbWVvdXQgYW5kIGJsb2NrcyBpbmZpbml0ZWx5CisgICAgICAgICAgICBpZihyZWFkQ291bnQgPCBvZmYpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5yZWFkKG9mZi1yZWFkQ291bnQpOworICAgICAgICAgICAgICAgIHJlYWRDb3VudCA9IG9mZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBCeXRlcy5hbGxvYyhsZW4pOworICAgICAgICAgICAgdmFyIGdvdCA9IGlucHV0LnJlYWRCeXRlcyhkYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKCBkYXRhLCAwLCBnb3QpOworICAgICAgICAgICAgcmVhZENvdW50ICs9IGdvdDsKKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IEVvZikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0VvZiAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZScpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yIDogJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgIDogIEludCwgbGVuICA6ICBJbnQpICA6ICBWb2lkCisgICAgeworICAgICAgICBvYnVmZmVyLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjayA6IER5bmFtaWMtPlZvaWQgPSBudWxsKSAgOiAgVm9pZAorICAgIHsKKyAgICAgICAgaWYoICEgaXNPcGVuKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgbm90IG9wZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgICNpZiBmbGFzaAorCisgICAgICAgIHZhciBieXRlcyA9IG5ldyBmbGFzaC51dGlscy5CeXRlQXJyYXkoKTsKKyAgICAgICAgdmFyIGRhdGEgPSBvYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBsZW4gPSAwOworICAgICAgICB3aGlsZSggbGVuIDwgZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ5dGVzLndyaXRlQnl0ZShkYXRhLmdldChsZW4pKTsKKyAgICAgICAgICAgICsrbGVuOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiBqcworCisgICAgICAgIHZhciBkYXRhID0gb2J1ZmZlci5nZXRCeXRlcygpOworICAgICAgICB2YXIgb3V0YnVmID0gbmV3IGpzLmh0bWwuSW50OEFycmF5KGRhdGEubGVuZ3RoKTsKKyAgICAgICAgdmFyIGxlbiA9IDA7CisgICAgICAgIHdoaWxlKCBsZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgb3V0YnVmLnNldCggW2RhdGEuZ2V0KGxlbildLCBsZW4pOworICAgICAgICAgICAgKytsZW47CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJ5dGVzID0gb3V0YnVmLmJ1ZmZlcjsKKworICAgICAgICAjZWxzZQorCisgICAgICAgIHZhciBieXRlcyA9IG9idWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aDsKKworICAgICAgICAjZW5kCisKKyAgICAgICAgb2J1ZmZlciA9IG5ldyBCeXRlc091dHB1dCgpOworCisKKyAgICAgICAgaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZENvdW50ID0gMDsKKworICAgICAgICAgICAgI2lmIGpzCisgICAgICAgICAgICBvdXRwdXQuc2VuZCggYnl0ZXMpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVzKCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICNlbmQKKworICAgICAgICAgICAgaWYoaW9DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW9DYWxsYmFjayhudWxsKTsgIC8vIHN1Y2Nlc3MgY2FsbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ1RFeGNlcHRpb24gJGUsIG1lc3NhZ2UgOiAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvciA6ICRlJykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpICA6ICBCb29sCisgICAgeworICAgICAgICByZXR1cm4gKHNvY2tldCAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpICA6ICBWb2lkCisgICAgeworICAgICAgICAjaWYganMKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCBldmVudCA6IGpzLmh0bWwuTWVzc2FnZUV2ZW50KSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gZXZlbnQuZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgICNlbHNlaWYgZmxhc2gKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisKKyAgICAgICAgI2Vsc2VpZiBwaHAKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgIHNvY2tldC5zZXRCbG9ja2luZyh0cnVlKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LnNldEJsb2NraW5nKHRydWUpOworICAgICAgICBzb2NrZXQuc2V0RmFzdFNlbmQodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAjZW5kCisKKyAgICAgICAgYXNzaWduU29ja2V0KCBzb2NrZXQpOworICAgIH0KKworICAgICNpZiBqcworICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzaWduU29ja2V0KCBzb2NrZXQgOiBXZWJTb2NrZXQpICA6ICBWb2lkCisgICAgI2Vsc2UKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGFzc2lnblNvY2tldCggc29ja2V0IDogU29ja2V0KSAgOiAgVm9pZAorICAgICNlbmQKKyAgICB7CisgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OworCisgICAgICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgICAgIG91dHB1dCA9IHNvY2tldDsKKyAgICAgICAgaW5wdXQgPSBzb2NrZXQ7CisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgb3V0cHV0ID0gc29ja2V0Lm91dHB1dDsKKyAgICAgICAgaW5wdXQgPSBzb2NrZXQuaW5wdXQ7CisKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KCB0aW1lb3V0IDogRmxvYXQgKSA6IFZvaWQgeworICAgICAgICBpZihpc09wZW4oKSkgeworICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIzZWQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CisKKworaW50ZXJmYWNlIFRTdHJlYW0geworICAgIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIFBlZWsoKSA6IEJvb2w7CisgICAgZnVuY3Rpb24gUmVhZCggYnVmIDogQnl0ZXMsIG9mZnNldCA6IEludCwgY291bnQgOiBJbnQpIDogSW50OworICAgIGZ1bmN0aW9uIFdyaXRlKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIEZsdXNoKCkgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTdjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworCitjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBwdWJsaWMgdmFyIElucHV0U3RyZWFtKGRlZmF1bHQsbnVsbCkgOiBUU3RyZWFtOworICAgIHB1YmxpYyB2YXIgT3V0cHV0U3RyZWFtKGRlZmF1bHQsbnVsbCkgOiBUU3RyZWFtOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBpbnB1dCA6IFRTdHJlYW0sIG91dHB1dCA6IFRTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5JbnB1dFN0cmVhbSA9IGlucHV0OworICAgICAgICB0aGlzLk91dHB1dFN0cmVhbSA9IG91dHB1dDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gKElucHV0U3RyZWFtICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBJbnB1dFN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGEgOiBCeXRlcyA9ICBCeXRlcy5hbGxvYyhsZW4pOworICAgICAgICB2YXIgc2l6ZSA9IElucHV0U3RyZWFtLlJlYWQoIGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgYnVmLmFkZEJ5dGVzKCBkYXRhLCAwLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZjpCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byBudWxsIE91dHB1dFN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgT3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpEeW5hbWljLT5Wb2lkID1udWxsKSA6IFZvaWQgeworICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBmbHVzaCBudWxsIE91dHB1dFN0cmVhbSIpOworICAgICAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorCisgICAgICAgIE91dHB1dFN0cmVhbS5GbHVzaCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjMxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkVvZjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuQWJzdHJhY3RNZXRob2RFcnJvcjsKKworY2xhc3MgVFRyYW5zcG9ydCB7CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZXJlIG1vcmUgZGF0YSB0byBiZSByZWFkPworICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbCBhbGl2ZSBhbmQgZmVlZGluZyB1cworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwZWVrKCkgOiBCb29sIHsKKyAgICAgICAgICByZXR1cm4gaXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSB0cmFuc3BvcnQgY291bGQgbm90IGJlIG9wZW5lZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIDogVm9pZCB7CisgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIGJ5dGVzIGNvdW50IGFjdHVhbGx5IHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICAgICAqLworICAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCggYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIGFjdHVhbGx5IHJlYWQgb2ZmIHRoZSB0cmFuc3BvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHZhciBnb3QgOiBJbnQgPSAwOworICAgICAgICB2YXIgcmV0IDogSW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGdvdCA8IGxlbikgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXQgPSByZWFkKGJ1Ziwgb2ZmK2dvdCwgbGVuLWdvdCk7CisgICAgICAgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlbiArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgZ290ICsgIiBieXRlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgICAgfQorICAgICAgICAgIGdvdCArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUFsbChidWY6Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHVwIHRvIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBmcm9tCisgICAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIHRyYW5zcG9ydCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkR5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIGlmKGNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICBjYWxsYmFjayhuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDAyOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICAvLyBXQVJOSU5HOiBUaGVzZSBhcmUgc3ViamVjdCB0byBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBjYW4ndCB1c2UgZW51bXMKKyAgICAvLyB3aXRoIEhheGUgMy4xLjMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzY0OQorICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOIDogSW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTk9UX09QRU4gOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBBTFJFQURZX09QRU4gOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBUSU1FRF9PVVQgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBFTkRfT0ZfRklMRSA6IEludCA9IDQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGVycm9yIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFmMzVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICogVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgKiBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAqIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgKiBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KKyAgICAqCisgICAgKiBAcGFyYW0gdHJhbnMgVGhlIGJhc2UgdHJhbnNwb3J0CisgICAgKiBAcmV0dXJuIFdyYXBwZWQgVHJhbnNwb3J0CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCB0cmFucyA6IFRUcmFuc3BvcnQpIDogVFRyYW5zcG9ydCB7CisgICAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyNzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKworLyoKKyAgIHdyYXBzIHJlYWwgdHJhbnNwb3J0LCBwcm92aWRlZCBieSBjb25zdHJ1Y3RvcgorKi8KK2NsYXNzIFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCBleHRlbmRzIFRTZXJ2ZXJUcmFuc3BvcnQgeworCisgIHByaXZhdGUgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworICBwdWJsaWMgZnVuY3Rpb24gbmV3KHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQpIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQKKyAgeworICB9CisKKyAgcHJpdmF0ZSBvdmVycmlkZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0CisgIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkCisgIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L0hheGVUZXN0cy5oeHByb2ogYi9saWIvaGF4ZS90ZXN0L0hheGVUZXN0cy5oeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlZWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvagpAQCAtMCwwICsxLDY5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iMiI+CisgIDwhLS0gT3V0cHV0IFNXRiBvcHRpb25zIC0tPgorICA8b3V0cHV0PgorICAgIDxtb3ZpZSBvdXRwdXRUeXBlPSJBcHBsaWNhdGlvbiIgLz4KKyAgICA8bW92aWUgaW5wdXQ9IiIgLz4KKyAgICA8bW92aWUgcGF0aD0iYmluL0hheGVUZXN0cyIgLz4KKyAgICA8bW92aWUgZnBzPSIzMCIgLz4KKyAgICA8bW92aWUgd2lkdGg9IjgwMCIgLz4KKyAgICA8bW92aWUgaGVpZ2h0PSI2MDAiIC8+CisgICAgPG1vdmllIHZlcnNpb249IjEiIC8+CisgICAgPG1vdmllIG1pbm9yVmVyc2lvbj0iMCIgLz4KKyAgICA8bW92aWUgcGxhdGZvcm09IkMrKyIgLz4KKyAgICA8bW92aWUgYmFja2dyb3VuZD0iI0ZGRkZGRiIgLz4KKyAgPC9vdXRwdXQ+CisgIDwhLS0gT3RoZXIgY2xhc3NlcyB0byBiZSBjb21waWxlZCBpbnRvIHlvdXIgU1dGIC0tPgorICA8Y2xhc3NwYXRocz4KKyAgICA8Y2xhc3MgcGF0aD0ic3JjIiAvPgorICAgIDxjbGFzcyBwYXRoPSJnZW4taGF4ZSIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iLi4vc3JjIiAvPgorICA8L2NsYXNzcGF0aHM+CisgIDwhLS0gQnVpbGQgb3B0aW9ucyAtLT4KKyAgPGJ1aWxkPgorICAgIDxvcHRpb24gZGlyZWN0aXZlcz0iIiAvPgorICAgIDxvcHRpb24gZmxhc2hTdHJpY3Q9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbm9JbmxpbmVPbkRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG1haW5DbGFzcz0iTWFpbiIgLz4KKyAgICA8b3B0aW9uIGVuYWJsZWRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIGFkZGl0aW9uYWw9IiIgLz4KKyAgPC9idWlsZD4KKyAgPCEtLSBoYXhlbGliIGxpYnJhcmllcyAtLT4KKyAgPGhheGVsaWI+CisgICAgPCEtLSBleGFtcGxlOiA8bGlicmFyeSBuYW1lPSIuLi4iIC8+IC0tPgorICA8L2hheGVsaWI+CisgIDwhLS0gQ2xhc3MgZmlsZXMgdG8gY29tcGlsZSAob3RoZXIgcmVmZXJlbmNlZCBjbGFzc2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCkgLS0+CisgIDxjb21waWxlVGFyZ2V0cz4KKyAgICA8IS0tIGV4YW1wbGU6IDxjb21waWxlIHBhdGg9Ii4uLiIgLz4gLS0+CisgIDwvY29tcGlsZVRhcmdldHM+CisgIDwhLS0gUGF0aHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHRyZWUgLS0+CisgIDxoaWRkZW5QYXRocz4KKyAgICA8aGlkZGVuIHBhdGg9Im9iaiIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNwcC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3NoYXJwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJmbGFzaC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YS5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YXNjcmlwdC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuYmF0IiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuc2giIC8+CisgICAgPGhpZGRlbiBwYXRoPSJNYWtlZmlsZS5hbSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im5la28uaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InBocC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHJvamVjdC5oaWRlIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHl0aG9uLmh4bWwiIC8+CisgIDwvaGlkZGVuUGF0aHM+CisgIDwhLS0gRXhlY3V0ZWQgYmVmb3JlIGJ1aWxkIC0tPgorICA8cHJlQnVpbGRDb21tYW5kPnRocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0PC9wcmVCdWlsZENvbW1hbmQ+CisgIDwhLS0gRXhlY3V0ZWQgYWZ0ZXIgYnVpbGQgLS0+CisgIDxwb3N0QnVpbGRDb21tYW5kIGFsd2F5c1J1bj0iRmFsc2UiIC8+CisgIDwhLS0gT3RoZXIgcHJvamVjdCBvcHRpb25zIC0tPgorICA8b3B0aW9ucz4KKyAgICA8b3B0aW9uIHNob3dIaWRkZW5QYXRocz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiB0ZXN0TW92aWU9IkN1c3RvbSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9ImJpbi9IYXhlVGVzdHMvTWFpbi5leGUgc2VydmVyIG11bHRpcGxleCIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOGIyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRDTUQgPSAkKFRIUklGVCkgLS1nZW4gaGF4ZSAtcgorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorQUdHUiA9ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CitCRU5DSE1BUksgPSAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKKwkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4OiAkKEFHR1IpCisJJChUSFJJRlRDTUQpICQoQUdHUikKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeDogJChCRU5DSE1BUkspCisJJChUSFJJRlRDTUQpICQoQkVOQ0hNQVJLKQorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKQorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQWdnci5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0JlbmNobWFya1NlcnZpY2UuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIGNwcC5oeG1sCisKKyQoQklOX1BIUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworCisjVE9ETzogb3RoZXIgaGF4ZSB0YXJnZXRzCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGNzaGFycAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBmbGFzaAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmFzY3JpcHQKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgbmVrbworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBweXRob24gICMgbmVlZHMgSGF4ZSAzLjIuMAorCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCitjaGVjazogJChCSU5fQ1BQKSAkKEJJTl9QSFApCisJJChCSU5fQ1BQKQorCXBocCAtZiAkKEJJTl9QSFApCisKK0VYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgc3JjIFwKKyAgICAgICAgICAgICBjcHAuaHhtbCBcCisgICAgICAgICAgICAgY3NoYXJwLmh4bWwgXAorICAgICAgICAgICAgIGZsYXNoLmh4bWwgXAorICAgICAgICAgICAgIGphdmEuaHhtbCBcCisgICAgICAgICAgICAgamF2YXNjcmlwdC5oeG1sIFwKKyAgICAgICAgICAgICBuZWtvLmh4bWwgXAorICAgICAgICAgICAgIHBocC5oeG1sIFwKKyAgICAgICAgICAgICBweXRob24uaHhtbCBcCisgICAgICAgICAgICAgcHJvamVjdC5oaWRlIFwKKyAgICAgICAgICAgICBIYXhlVGVzdHMuaHhwcm9qIFwKKyAgICAgICAgICAgICBtYWtlX2FsbC5iYXQgXAorICAgICAgICAgICAgIG1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sIGIvbGliL2hheGUvdGVzdC9jcHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzg0OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9jcHAuaHhtbApAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1BQIHRhcmdldAorLWNwcCBiaW4KKworI1RvIHByb2R1Y2UgNjQgYml0IGJpbmFyaWVzIHRoZSBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIEhYQ1BQX002NCBjb21waWxlIHZhcmlhYmxlOgorIy1EIEhYQ1BQX002NAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvY3NoYXJwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzNGIwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvY3NoYXJwLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NTSEFSUCB0YXJnZXQKKy1jcyBiaW4vVGVzdC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvZmxhc2guaHhtbCBiL2xpYi9oYXhlL3Rlc3QvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE3NjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1Rlc3Quc3dmCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2phdmEuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDcxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2phdmEuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UZXN0LmphcgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9qYXZhc2NyaXB0Lmh4bWwgYi9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ5OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9qYXZhc2NyaXB0Lmh4bWwKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmFTY3JpcHQgdGFyZ2V0CistanMgYmluL1Rlc3QuanMKKworI1lvdSBjYW4gdXNlIC1EIHNvdXJjZS1tYXAtY29udGVudCAocmVxdWlyZXMgSGF4ZSAzLjErKSB0byBoYXZlIHRoZSAuaHggCisjZmlsZXMgZGlyZWN0bHkgZW1iZWRkZWQgaW50byB0aGUgbWFwIGZpbGUsIHRoaXMgd2F5IHlvdSBvbmx5IGhhdmUgdG8gCisjdXBsb2FkIGl0LCBhbmQgaXQgd2lsbCBiZSBhbHdheXMgaW4gc3luYyB3aXRoIHRoZSBjb21waWxlZCAuanMgZXZlbiBpZiAKKyN5b3UgbW9kaWZ5IHlvdXIgLmh4IGZpbGVzLgorLUQgc291cmNlLW1hcC1jb250ZW50CisKKyNHZW5lcmF0ZSBzb3VyY2UgbWFwIGFuZCBhZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLmJhdCBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTRlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLmJhdApAQCAtMCwwICsxLDcwIEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKK2lmICIlSE9NRURSSVZFJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSE9NRVBBVEglIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIQVhFUEFUSCUiPT0iIiBnb3RvIE5PVElOU1RBTExFRAorCitzZXQgcGF0aD0lSEFYRVBBVEglOyVIQVhFUEFUSCVcLi5cbmVrbzslcGF0aCUKKworcmVtICMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uXC4uXC4uXHRlc3RcVGhyaWZ0VGVzdC50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uXC4uXC4uXGNvbnRyaWJcYXN5bmMtdGVzdFxhZ2dyLnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cbGliXHJiXGJlbmNobWFya1xCZW5jaG1hcmsudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaCBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyZjVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKKworIyBvdXRwdXQgZm9sZGVyCitpZiBbICEgLWQgYmluIF07IHRoZW4KKyAgbWtkaXIgIGJpbgorZmkKKworIyBpbnZva2UgSGF4ZSBjb21waWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9uZWtvLmh4bWwgYi9saWIvaGF4ZS90ZXN0L25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI3MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVGVzdC5uCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3BocC5oeG1sIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGYyYjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9wcm9qZWN0LmhpZGUgYi9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVmOThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9wcm9qZWN0LmhpZGUKQEAgLTAsMCArMSw2NyBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiVGVzdCIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIiIKKyAgICAsImxpY2Vuc2UiIDogIiIKKyAgICAsInVybCIgOiAiIgorICAgICwidGFyZ2V0RGF0YSIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImZsYXNoLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vVGVzdC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1Rlc3QubiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJwaHAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjcHAuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9NYWluLWRlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3NoYXJwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1Rlc3QucHkiCisgICAgICAgIH0KKyAgICBdCisgICAgLCJmaWxlcyIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcTWFpbi5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDEzCisgICAgICAgIH0KKyAgICBdCisgICAgLCJhY3RpdmVGaWxlIiA6ICJzcmNcXE1haW4uaHgiCisgICAgLCJvcGVuRkxUYXJnZXQiIDogbnVsbAorICAgICwib3BlbkZMQnVpbGRNb2RlIiA6ICJEZWJ1ZyIKKyAgICAsInJ1bkFjdGlvblR5cGUiIDogbnVsbAorICAgICwicnVuQWN0aW9uVGV4dCIgOiBudWxsCisgICAgLCJidWlsZEFjdGlvbkNvbW1hbmQiIDogbnVsbAorICAgICwiaGlkZGVuSXRlbXMiIDogWworCisgICAgXQorICAgICwic2hvd0hpZGRlbkl0ZW1zIiA6IGZhbHNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9weXRob24uaHhtbCBiL2xpYi9oYXhlL3Rlc3QvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2YTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvcHl0aG9uLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1B5dGhvbiB0YXJnZXQKKy1weXRob24gYmluL1Rlc3QucHkKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjYyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2VudW0gV2hhdFRlc3RzIHsKKyAgICBOb3JtYWw7CisgICAgTXVsdGlwbGV4OworfQorCitjbGFzcyBNYWluCit7CisgICAgc3RhdGljIHByaXZhdGUgdmFyIHRlc3RzIDogV2hhdFRlc3RzID0gTm9ybWFsOworICAgIHN0YXRpYyBwcml2YXRlIHZhciBzZXJ2ZXIgOiBCb29sID0gZmFsc2U7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBpbmxpbmUgdmFyIENNRExJTkVIRUxQIDogU3RyaW5nCisgICAgICAgID0gIlxuSGF4ZVRlc3RzICBbY2xpZW50fHNlcnZlcl0gIFttdWx0aXBsZXhdXG4iCisgICAgICAgICsgIiAgY2xpZW50fHNlcnZlciAgLi4uIGRldGVybWluZXMgcnVuIG1vZGUgZm9yIHNvbWUgdGVzdHMsIGRlZmF1bHQgaXMgY2xpZW50XG4iCisgICAgICAgICsgIiAgbXVsdGlwbGV4IC4uLi4uLi4uIHJ1biBtdWx0aXBsZXggdGVzdCBzZXJ2ZXIgb3IgY2xpZW50XG4iOworCisgICAgc3RhdGljIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VBcmdzKCkgeworICAgICAgICAjaWYgc3lzCisKKyAgICAgICAgdmFyIGFyZ3MgPSBTeXMuYXJncygpOworICAgICAgICBpZiAoIGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggYXJnIGluIGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goYXJnLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2xpZW50IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjYXNlICJzZXJ2ZXIiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIm11bHRpcGxleCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBNdWx0aXBsZXg7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgYXJndW1lbnQgIiRhcmciXG4nK0NNRExJTkVIRUxQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmQKKyAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIGZ1bmN0aW9uIG1haW4oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlQXJncygpOworCisgICAgICAgICAgICBzd2l0Y2goIHRlc3RzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRlc3QuUnVuKHNlcnZlcik7CisgICAgICAgICAgICAgICAgY2FzZSBNdWx0aXBsZXg6CisgICAgICAgICAgICAgICAgICAgIE11bHRpcGxleFRlc3QuUnVuKHNlcnZlcik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0ZXN0IG1vZGUgJHRlc3RzIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhY2UoIkFsbCB0ZXN0cyBjb21wbGV0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGU6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCckZScpOworICAgICAgICAgICAgI2lmIHN5cworICAgICAgICAgICAgU3lzLmV4aXQoMSk7ICAvLyBpbmRpY2F0ZSBlcnJvcgorICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9NdWx0aXBsZXhUZXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MThiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9NdWx0aXBsZXhUZXN0Lmh4CkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuSW50MzI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKy8vIGRlYnVnIG9ubHkKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvY2Vzc29yOworCisvLyBnZW5lcmF0ZWQgY29kZSBpbXBvcnRzCitpbXBvcnQgQWdncjsKK2ltcG9ydCBBZ2dySW1wbDsKK2ltcG9ydCBBZ2dyUHJvY2Vzc29yOworaW1wb3J0IEJlbmNobWFya1NlcnZpY2U7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZUltcGw7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZVByb2Nlc3NvcjsKK2ltcG9ydCBFcnJvcjsKKworCitjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIEJlbmNobWFya1NlcnZpY2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmaWJvbmFjY2kobiA6IGhheGUuSW50MzIpIDogaGF4ZS5JbnQzMiB7CisgICAgICAgIHRyYWNlKCdCZW5jaG1hcmsuZmlib25hY2NpKCRuKScpOworICAgICAgICB2YXIgbmV4dCA6IEludDsKKyAgICAgICAgdmFyIHByZXYgICA9IDA7CisgICAgICAgIHZhciByZXN1bHQgPSAxOworICAgICAgICB3aGlsZSggbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CisgICAgICAgICAgICBwcmV2ICAgPSByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBuZXh0OworICAgICAgICAgICAgLS1uOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCisKK2NsYXNzIEFnZ3JTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIEFnZ3IKK3sKKyAgICBwcml2YXRlIHZhciB2YWx1ZXMgOiBMaXN0PGhheGUuSW50MzI+ID0gbmV3IExpc3Q8aGF4ZS5JbnQzMj4oKTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZFZhbHVlKHZhbHVlIDogaGF4ZS5JbnQzMikgOiBWb2lkICAgIHsKKyAgICAgICAgdHJhY2UoJ0FnZ3IuYWRkVmFsdWUoJHZhbHVlKScpOworICAgICAgICB2YWx1ZXMuYWRkKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpIDogTGlzdDwgaGF4ZS5JbnQzMj4geworICAgICAgICB0cmFjZSgnQWdnci5nZXRWYWx1ZXMoKScpOworICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KK30KKworCisKK2NsYXNzIE11bHRpcGxleFRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA6IFN0cmluZyA9ICJCZW5jaG1hcmtTZXJ2aWNlIjsKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIE5BTUVfQUdHUiAgICAgICAgICAgICA6IFN0cmluZyAgPSAiQWdnciI7CisKKworICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuKHNlcnZlciA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIGlmICggc2VydmVyKSB7CisgICAgICAgICAgICBSdW5NdWx0aXBsZXhTZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJ1bk11bHRpcGxleENsaWVudCgpOworICAgICAgICAgICAgUnVuRGVmYXVsdENsaWVudCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gdGhlIG11bHRpcGxleCBzZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bk11bHRpcGxleFNlcnZlcigpIDogVm9pZCAgeworICAgICAgIHRyeQorICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiZW5jaEhhbmRsZXIgOiBCZW5jaG1hcmtTZXJ2aWNlID0gbmV3IEJlbmNobWFya1NlcnZpY2VIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgYmVuY2hQcm9jZXNzb3IgOiBUUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2VQcm9jZXNzb3IoIGJlbmNoSGFuZGxlcik7CisKKyAgICAgICAgICAgIHZhciBhZ2dySGFuZGxlciA6IEFnZ3IgPSBuZXcgQWdnclNlcnZpY2VIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgYWdnclByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBuZXcgQWdnclByb2Nlc3NvciggYWdnckhhbmRsZXIpOworCisgICAgICAgICAgICB2YXIgbXVsdGlwbGV4IDogVE11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yLCB0cnVlKTsgIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvciggTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgLy8gcHJvdG9jb2wrdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgcHJvdGZhY3QgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJ0cmFucyA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggOTA5MCwgNSwgZmFsc2UpOworICAgICAgICAgICAgdmFyIHRyYW5zZmFjdCA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIHZhciBzZXJ2ZXIgOiBUU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIG11bHRpcGxleCwgc2VydmVydHJhbnMsIHRyYW5zZmFjdCwgcHJvdGZhY3QpOworCisgICAgICAgICAgICB0cmFjZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJHtlLmVycm9ySUR9ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcnVuIG11bHRpcGxleCBjbGllbnQgYWdhaW5zdCBtdWx0aXBsZXggc2VydmVyCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW5NdWx0aXBsZXhDbGllbnQoKSA6IFZvaWQgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQ7CisgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgdHJhbnMub3BlbigpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLHRydWUsdHJ1ZSk7CisgICAgICAgICAgICB2YXIgbXVsdGlwbGV4IDogVE11bHRpcGxleGVkUHJvdG9jb2w7CisKKyAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggcHJvdG9jb2wsIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgICAgICAgICB2YXIgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoIG11bHRpcGxleCk7CisKKyAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggcHJvdG9jb2wsIE5BTUVfQUdHUik7CisgICAgICAgICAgICB2YXIgYWdnciA9IG5ldyBBZ2dySW1wbCggbXVsdGlwbGV4KTsKKworICAgICAgICAgICAgdHJhY2UoJ2NhbGxpbmcgYWdnci5hZGQoIGJlbmNoLmZpYm8oKSkuLi4nKTsKKyAgICAgICAgICAgIGZvciggaSBpbiAxIC4uLiAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnJGknKTsKKyAgICAgICAgICAgICAgICBhZ2dyLmFkZFZhbHVlKCBiZW5jaC5maWJvbmFjY2koaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZSgnY2FsbGluZyBhZ2dyIC4uLicpOworICAgICAgICAgICAgdmFyIGkgPSAxOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGFnZ3IuZ2V0VmFsdWVzKCk7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QodmFsdWVzICE9IG51bGwsJ2FnZ3IuZ2V0VmFsdWVzKCkgPT0gbnVsbCcpOworICAgICAgICAgICAgZm9yKCBrIGluIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnZmliKCRpKSA9ICRrJyk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpOworICAgICAgICAgICAgdHJhY2UoJ2RvbmUuJyk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gbm9uLW11bHRpcGxleCBjbGllbnQgYWdhaW5zdCBtdWx0aXBsZXggc2VydmVyIHRvIHRlc3QgZGVmYXVsdCBmYWxsYmFjaworICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuRGVmYXVsdENsaWVudCgpIDogVm9pZCAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB0cmFucy5vcGVuKCk7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsdHJ1ZSx0cnVlKTsKKworICAgICAgICAgICAgdmFyIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCBwcm90b2NvbCk7CisKKyAgICAgICAgICAgIHRyYWNlKCdjYWxsaW5nIGJlbmNoICh2aWEgZGVmYXVsdCkgLi4uJyk7CisgICAgICAgICAgICBmb3IoIGkgaW4gMSAuLi4gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGsgPSBiZW5jaC5maWJvbmFjY2koaSk7CisgICAgICAgICAgICAgICAgdHJhY2UoJ2ZpYigkaSkgPSAkaycpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpOworICAgICAgICAgICAgdHJhY2UoJ2RvbmUuJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJHtlLmVycm9ySUR9ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9TdHJlYW1UZXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGYxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9TdHJlYW1UZXN0Lmh4CkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgc3lzLkZpbGVTeXN0ZW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdEJhc2UgeworCisKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIHRtcGZpbGUgOiBTdHJpbmcgPSAiZGF0YS50bXAiOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBNYWtlVGVzdERhdGEoKSA6IFh0cnVjdCB7CisgICAgICAgIHZhciBkYXRhIDogWHRydWN0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBkYXRhLnN0cmluZ190aGluZyA9ICJTdHJlYW10ZXN0IjsKKyAgICAgICAgZGF0YS5ieXRlX3RoaW5nID0gLTEyODsKKyAgICAgICAgZGF0YS5pMzJfdGhpbmcgPSA0NzExOworICAgICAgICBkYXRhLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMHgxMjM0NTY3OCwweDlBQkNERUYwKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBXcml0ZURhdGEoKSA6IFh0cnVjdAorICAgIHsKKyAgICAgICAgdmFyIHN0cmVhbSA6IFRTdHJlYW0gPSBuZXcgVEZpbGVTdHJlYW0oIHRtcGZpbGUsIENyZWF0ZU5ldyk7CisgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydCggbnVsbCwgc3RyZWFtKTsKKyAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnMpOworCisgICAgICAgIHZhciBkYXRhID0gTWFrZVRlc3REYXRhKCk7CisgICAgICAgIGRhdGEud3JpdGUocHJvdCk7CisgICAgICAgIHRyYW5zLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSZWFkRGF0YSgpIDogWHRydWN0CisgICAgeworICAgICAgICB2YXIgc3RyZWFtIDogVFN0cmVhbSA9IG5ldyBURmlsZVN0cmVhbSggdG1wZmlsZSwgUmVhZCk7CisgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydCggc3RyZWFtLCBudWxsKTsKKyAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnMpOworCisgICAgICAgIHZhciBkYXRhIDogWHRydWN0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBkYXRhLnJlYWQocHJvdCk7CisgICAgICAgIHRyYW5zLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHdyaXR0ZW4gPSBXcml0ZURhdGEoKTsKKyAgICAgICAgICAgIHZhciByZWFkID0gUmVhZERhdGEoKTsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW0uZGVsZXRlRmlsZSh0bXBmaWxlKTsKKworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCByZWFkLnN0cmluZ190aGluZyA9PSB3cml0dGVuLnN0cmluZ190aGluZywgInN0cmluZyBkYXRhIik7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIHJlYWQuYnl0ZV90aGluZyA9PSB3cml0dGVuLmJ5dGVfdGhpbmcsICJieXRlIGRhdGEiKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCggcmVhZC5pMzJfdGhpbmcgPT0gd3JpdHRlbi5pMzJfdGhpbmcsICJpMzIgZGF0YSIpOworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCByZWFkLmk2NF90aGluZywgd3JpdHRlbi5pNjRfdGhpbmcpID09IDAsICJpNjQgZGF0YSIpOworCisgICAgICAgIH0gY2F0Y2goZTpEeW5hbWljKSB7CisgICAgICAgICAgICBGaWxlU3lzdGVtLmRlbGV0ZUZpbGUodG1wZmlsZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvVGVzdEJhc2UuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMyNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9zcmMvVGVzdEJhc2UuaHgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisKK2NsYXNzIFRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gbmV3KCkgeworICAgICAgICAvLyBvdmVycmlkZSwgaWYgbmVjZXNzYXJ5CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhwZWN0KCBleHByIDogQm9vbCwgaW5mbyA6IFN0cmluZywgP3BvcyA6IGhheGUuUG9zSW5mb3MpIDogVm9pZCB7CisgICAgICAgIGlmKCAhIGV4cHIpIHsKKyAgICAgICAgICAgIHRocm93ICgnVGVzdCAiJGluZm8iIGZhaWxlZCBhdCAnK3Bvcy5tZXRob2ROYW1lKycgaW4gJytwb3MuZmlsZU5hbWUrJzonK3Bvcy5saW5lTnVtYmVyKTsKKyAgICAgICAgfQorICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9ocy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9ocy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBhMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFJlYnVpbGQgd2hlbiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlcworc2V0KGhhc2tlbGxfc291cmNlcworICAgIHNyYy9UaHJpZnQuaHMKKyAgICBzcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCisgICAgc3JjL1RocmlmdC9TZXJ2ZXIuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCisgICAgc3JjL1RocmlmdC9UeXBlcy5ocworICAgIHRocmlmdC5jYWJhbAorKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGxpc3QoQVBQRU5EIGhhc2tlbGxfc29ydWNlcworICAgICAgICB0ZXN0L1NwZWMuaHMKKyAgICAgICAgdGVzdC9CaW5hcnlTcGVjLmhzCisgICAgICAgIHRlc3QvQ29tcGFjdFNwZWMuaHMKKyAgICAgICAgdGVzdC9KU09OU3BlYy5ocworICAgICkKKyAgICBzZXQoaHNfZW5hYmxlX3Rlc3QgIi0tZW5hYmxlLXRlc3RzIikKK2VuZGlmKCkKKworc2V0KGhhc2tlbGxfYXJ0aWZhY3RzIHRocmlmdF9jYWJhbC5zdGFtcCkKKyMgQWRkaW5nICouaGkgZmlsZXMgc28gdGhhdCBhbnkgbWlzc2luZyBmaWxlIHRyaWdnZXJzIHRoZSBidWlsZAorZm9yZWFjaChTUkMgJHtoYXNrZWxsX3NvdXJjZXN9KQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRVggJHtTUkN9IEVYVCkKKyAgICBpZigke0VYfSBTVFJFUVVBTCAiLmhzIikKKyAgICAgICAgZmlsZShSRUxBVElWRV9QQVRIIFJFTCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke1NSQ30pCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRElSICR7UkVMfSBESVJFQ1RPUlkpCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQkFTRSAke1JFTH0gTkFNRV9XRSkKKyAgICAgICAgbGlzdChBUFBFTkQgaGFza2VsbF9hcnRpZmFjdHMgZGlzdC9idWlsZC8ke0RJUn0vJHtCQVNFfS5oaSkKKyAgICBlbmRpZigpCitlbmRmb3JlYWNoKCkKKworaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICAgIHNldChoc19vcHRpbWl6ZSAtTzApCitlbHNlaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiUmVsZWFzZSIpCisgICAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hhc2tlbGxfYXJ0aWZhY3RzfQorICAgIENPTU1BTkQgJHtDQUJBTH0gdXBkYXRlCisgICAgIyBCdWlsZCBkZXBlbmRlbmNpZXMgZmlyc3Qgd2l0aG91dCAtLWJ1aWxkZGlyLCBvdGhlcndpc2UgaXQgZmFpbHMuCisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgJHtoc19lbmFibGVfdGVzdH0KKyAgICBDT01NQU5EICR7Q0FCQUx9IGNvbmZpZ3VyZSAke2hzX29wdGltaXplfSAke2hzX2VuYWJsZV90ZXN0fSAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBidWlsZCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdF9jYWJhbC5zdGFtcAorICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgIERFUEVORFMgJHtoYXNrZWxsX3NvdXJjZXN9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgSGFza2VsbCBsaWJyYXJ5IikKKworYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF9saWJyYXJ5IEFMTAorICAgIERFUEVORFMgJHtoYXNrZWxsX2FydGlmYWN0c30pCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxDaGVjaworICAgICAgICAgICAgQ09NTUFORCAke0NBQkFMfSBjaGVjaworICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbENhYmFsVGVzdAorICAgICAgICAgICAgIyBDYWJhbCBmYWlscyB0byBmaW5kIGJ1aWx0IGV4ZWN1dGFibGUgd2hlbiAtLWJ1aWxkZGlyIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgICMgU28gd2UgaW52b2tlIHRoZSBleGVjdXRhYmxlIGRpcmVjdGx5LgorICAgICAgICAgICAgIyBDT01NQU5EICR7Q0FCQUx9IHRlc3QgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgICAgICAgICAgIyBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgICAgICAgICBDT01NQU5EIGRpc3QvYnVpbGQvc3BlYy9zcGVjKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2hzL01ha2VmaWxlLmFtIGIvbGliL2hzL01ha2VmaWxlLmFtCmluZGV4IDM0NjRhNGYuLjNjZDhiNTcgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9NYWtlZmlsZS5hbQorKysgYi9saWIvaHMvTWFrZWZpbGUuYW0KQEAgLTE4LDI2ICsxOCwzMyBAQAogIwogCiBFWFRSQV9ESVNUID0gXAotICBMSUNFTlNFIFwKLSAgUkVBRE1FIFwKLSAgU2V0dXAubGhzIFwKLSAgVE9ETyBcCi0gIFRocmlmdC5jYWJhbCBcCi0gIHNyYworCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCUNNYWtlTGlzdHMudHh0IFwKKwlMSUNFTlNFIFwKKwlSRUFETUUubWQgXAorCVNldHVwLmxocyBcCisJVE9ETyBcCisJdGhyaWZ0LmNhYmFsIFwKKwlzcmMgXAorCXRlc3QKIAogYWxsLWxvY2FsOgotCSQoUlVOSEFTS0VMTCkgU2V0dXAubGhzIGNvbmZpZ3VyZSAkKENBQkFMX0NPTkZJR1VSRV9GTEFHUykKLQkkKFJVTkhBU0tFTEwpIFNldHVwLmxocyBidWlsZAorCSQoQ0FCQUwpIHVwZGF0ZQorCSQoQ0FCQUwpIGluc3RhbGwKIAogaW5zdGFsbC1leGVjLWhvb2s6Ci0JJChSVU5IQVNLRUxMKSBTZXR1cC5saHMgaW5zdGFsbAorCSQoQ0FCQUwpIGluc3RhbGwKIAogIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgSGFza2VsbCBpcyBub3QgY29uZmlndXJlZC4KIGNsZWFuLWxvY2FsOgotCSQoUlVOSEFTS0VMTCkgU2V0dXAubGhzIGNsZWFuCisJJChDQUJBTCkgY2xlYW4KIAogbWFpbnRhaW5lci1jbGVhbi1sb2NhbDoKLQkkKFJVTkhBU0tFTEwpIFNldHVwLmxocyBjbGVhbgorCSQoQ0FCQUwpIGNsZWFuCiAKIGNoZWNrLWxvY2FsOgogCSQoQ0FCQUwpIGNoZWNrCisJJChDQUJBTCkgaW5zdGFsbCAtLW9ubHktZGVwZW5kZW5jaWVzIC0tZW5hYmxlLXRlc3RzCisJJChDQUJBTCkgY29uZmlndXJlIC0tZW5hYmxlLXRlc3RzCisJJChDQUJBTCkgYnVpbGQKKwkkKENBQkFMKSB0ZXN0CmRpZmYgLS1naXQgYS9saWIvaHMvUkVBRE1FIGIvbGliL2hzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmZTY5OS4uMDAwMDAwMAotLS0gYS9saWIvaHMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotSGFza2VsbCBUaHJpZnQgQmluZGluZ3MKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotQ29tcGlsZQotPT09PT09PQotCi1Vc2UgQ2FiYWwgdG8gY29tcGlsZSBhbmQgaW5zdGFsbDsgLi9jb25maWd1cmUgdXNlcyBDYWJhbCB1bmRlcm5lYXRoLCBhbmQgdGhhdAotcGF0aCBpcyBub3QgeWV0IHdlbGwgdGVzdGVkLiBUaHJpZnQncyBsaWJyYXJ5IGFuZCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgY29tcGlsZQotd2l0aCBwcmV0dHkgbXVjaCBhbnkgR0hDIGV4dGVuc2lvbnMgb3Igd2FybmluZ3MgeW91IGVuYWJsZSAob3IgZGlzYWJsZSkuCi1QbGVhc2UgcmVwb3J0IHRoaXMgbm90IGJlaW5nIHRoZSBjYXNlIGFzIGEgYnVnIG9uCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL0NyZWF0ZUlzc3VlIWRlZmF1bHQuanNwYQotCi1DaGFuY2VzIHlvdSdsbCBuZWVkIHRvIG11Y2sgYSBiaXQgd2l0aCBDYWJhbCBmbGFncyB0byBpbnN0YWxsIFRocmlmdDoKLQotQ0FCQUxfQ09ORklHVVJFX0ZMQUdTPSItLXVzZXIiIC4vY29uZmlndXJlCi0KLUJhc2UgVHlwZXMKLT09PT09PT09PT0KLQotVGhlIG1hcHBpbmcgZnJvbSBUaHJpZnQgdHlwZXMgdG8gSGFza2VsbCdzIGlzOgotCi0gKiBkb3VibGUgLT4gRG91YmxlCi0gKiBieXRlIC0+IERhdGEuV29yZC5Xb3JkOAotICogaTE2IC0+IERhdGEuSW50LkludDE2Ci0gKiBpMzIgLT4gRGF0YS5JbnQuSW50MzIKLSAqIGk2NCAtPiBEYXRhLkludC5JbnQ2NAotICogc3RyaW5nIC0+IFN0cmluZwotICogYmluYXJ5IC0+IERhdGEuQnl0ZVN0cmluZy5MYXp5Ci0gKiBib29sIC0+IEJvb2xlYW4KLQotRW51bXMKLT09PT09Ci0KLUJlY29tZSBIYXNrZWxsICdkYXRhJyB0eXBlcy4gVXNlIGZyb21FbnVtIHRvIGdldCBvdXQgdGhlIGludCB2YWx1ZS4KLQotU3RydWN0cwotPT09PT09PQotCi1CZWNvbWUgcmVjb3Jkcy4gRmllbGQgbGFiZWxzIGFyZSB1Z2x5LCBvZiB0aGUgZm9ybSBmX1NUUlVDVE5BTUVfRklFTEROQU1FLiBBbGwKLWZpZWxkcyBhcmUgTWF5YmUgdHlwZXMuCi0KLUV4Y2VwdGlvbnMKLT09PT09PT09PT0KLQotSWRlbnRpY2FsIHRvIHN0cnVjdHMuIFRocm93IHRoZW0gd2l0aCB0aHJvd0R5bi4gQ2F0Y2ggdGhlbSB3aXRoIGNhdGNoRHluLgotCi1DbGllbnQKLT09PT09PQotCi1KdXN0IGEgYnVuY2ggb2YgZnVuY3Rpb25zLiBZb3UgbWF5IGhhdmUgdG8gaW1wb3J0IGEgYnVuY2ggb2YgY2xpZW50IGZpbGVzIHRvCi1kZWFsIHdpdGggaW5oZXJpdGFuY2UuCi0KLUludGVyZmFjZQotPT09PT09PT09Ci0KLVlvdSBzaG91bGQgb25seSBoYXZlIHRvIGltcG9ydCB0aGUgbGFzdCBvbmUgaW4gdGhlIGNoYWluIG9mIGluaGVyaXRvcnMuIFRvIG1ha2UKLWFuIGludGVyZmFjZSwgZGVjbGFyZSBhIGxhYmVsOgotCi0gIGRhdGEgTXlJZmFjZSA9IE15SWZhY2UKLQotYW5kIHRoZW4gZGVjbGFyZSBpdCBhbiBpbnN0YW5jZSBvZiBlYWNoIGlmYWNlIGNsYXNzLCBzdGFydGluZyB3aXRoIHRoZSBzdXBlcmVzdAotY2xhc3MgYW5kIHByb2NlZGluZyBkb3duIChhbGwgdGhlIHdoaWxlIGRlZmluaW5nIHRoZSBtZXRob2RzKS4gIFRoZW4gcGFzcyB5b3VyCi1sYWJlbCB0byBwcm9jZXNzIGFzIHRoZSBoYW5kbGVyLgotCi1Qcm9jZXNzb3IKLT09PT09PT09PQotCi1KdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGhhbmRsZXIgbGFiZWwsIHByb3RvY29scy4gSXQgY2FsbHMgdGhlCi1zdXBlcmNsYXNzZXMgcHJvY2VzcyBpZiB0aGVyZSBpcyBhIHN1cGVyY2xhc3MuCi0KZGlmZiAtLWdpdCBhL2xpYi9ocy9SRUFETUUubWQgYi9saWIvaHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTBhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsOTkgQEAKK0hhc2tlbGwgVGhyaWZ0IEJpbmRpbmdzCisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK0NvbXBpbGUKKz09PT09PT0KKworVXNlIENhYmFsIHRvIGNvbXBpbGUgYW5kIGluc3RhbGw7IC4vY29uZmlndXJlIHVzZXMgQ2FiYWwgdW5kZXJuZWF0aCwgYW5kIHRoYXQKK3BhdGggaXMgbm90IHlldCB3ZWxsIHRlc3RlZC4gVGhyaWZ0J3MgbGlicmFyeSBhbmQgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGNvbXBpbGUKK3dpdGggcHJldHR5IG11Y2ggYW55IEdIQyBleHRlbnNpb25zIG9yIHdhcm5pbmdzIHlvdSBlbmFibGUgKG9yIGRpc2FibGUpLgorUGxlYXNlIHJlcG9ydCB0aGlzIG5vdCBiZWluZyB0aGUgY2FzZSBhcyBhIGJ1ZyBvbgoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9DcmVhdGVJc3N1ZSFkZWZhdWx0LmpzcGEKKworQ2hhbmNlcyB5b3UnbGwgbmVlZCB0byBtdWNrIGEgYml0IHdpdGggQ2FiYWwgZmxhZ3MgdG8gaW5zdGFsbCBUaHJpZnQ6CisKK0NBQkFMX0NPTkZJR1VSRV9GTEFHUz0iLS11c2VyIiAuL2NvbmZpZ3VyZQorCitCYXNlIFR5cGVzCis9PT09PT09PT09CisKK1RoZSBtYXBwaW5nIGZyb20gVGhyaWZ0IHR5cGVzIHRvIEhhc2tlbGwncyBpczoKKworICogZG91YmxlIC0+IERvdWJsZQorICogYnl0ZSAtPiBEYXRhLkludC5JbnQ4CisgKiBpMTYgLT4gRGF0YS5JbnQuSW50MTYKKyAqIGkzMiAtPiBEYXRhLkludC5JbnQzMgorICogaTY0IC0+IERhdGEuSW50LkludDY0CisgKiBzdHJpbmcgLT4gVGV4dAorICogYmluYXJ5IC0+IERhdGEuQnl0ZVN0cmluZy5MYXp5CisgKiBib29sIC0+IEJvb2xlYW4KKworRW51bXMKKz09PT09CisKK0JlY29tZSBIYXNrZWxsICdkYXRhJyB0eXBlcy4gVXNlIGZyb21FbnVtIHRvIGdldCBvdXQgdGhlIGludCB2YWx1ZS4KKworTGlzdHMKKz09PT09CisKK0JlY29tZSBEYXRhLlZlY3Rvci5WZWN0b3IgZnJvbSB0aGUgdmVjdG9yIHBhY2thZ2UuCisKK01hcHMgYW5kIFNldHMKKz09PT09PT09PT09PT0KKworQmVjb21lIERhdGEuSGFzaE1hcC5TdHJpY3QuTWFwIGFuZCBEYXRhLkhhc2hTZXQuU2V0IGZyb20gdGhlCit1bm9yZGVyZWQtY29udGFpbmVycyBwYWNrYWdlLgorCitTdHJ1Y3RzCis9PT09PT09CisKK0JlY29tZSByZWNvcmRzLiBGaWVsZCBsYWJlbHMgYXJlIHVnbHksIG9mIHRoZSBmb3JtIGZfU1RSVUNUTkFNRV9GSUVMRE5BTUUuIEFsbAorZmllbGRzIGFyZSBNYXliZSB0eXBlcy4KKworRXhjZXB0aW9ucworPT09PT09PT09PQorCitJZGVudGljYWwgdG8gc3RydWN0cy4gVXNlIHRoZW0gd2l0aCB0aHJvdyBhbmQgY2F0Y2ggZnJvbSBDb250cm9sLkV4Y2VwdGlvbi4KKworQ2xpZW50Cis9PT09PT0KKworSnVzdCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gWW91IG1heSBoYXZlIHRvIGltcG9ydCBhIGJ1bmNoIG9mIGNsaWVudCBmaWxlcyB0bworZGVhbCB3aXRoIGluaGVyaXRhbmNlLgorCitJbnRlcmZhY2UKKz09PT09PT09PQorCitZb3Ugc2hvdWxkIG9ubHkgaGF2ZSB0byBpbXBvcnQgdGhlIGxhc3Qgb25lIGluIHRoZSBjaGFpbiBvZiBpbmhlcml0b3JzLiBUbyBtYWtlCithbiBpbnRlcmZhY2UsIGRlY2xhcmUgYSBsYWJlbDoKKworICBkYXRhIE15SWZhY2UgPSBNeUlmYWNlCisKK2FuZCB0aGVuIGRlY2xhcmUgaXQgYW4gaW5zdGFuY2Ugb2YgZWFjaCBpZmFjZSBjbGFzcywgc3RhcnRpbmcgd2l0aCB0aGUgc3VwZXJlc3QKK2NsYXNzIGFuZCBwcm9jZWVkaW5nIGRvd24gKGFsbCB0aGUgd2hpbGUgZGVmaW5pbmcgdGhlIG1ldGhvZHMpLiAgVGhlbiBwYXNzIHlvdXIKK2xhYmVsIHRvIHByb2Nlc3MgYXMgdGhlIGhhbmRsZXIuCisKK1Byb2Nlc3NvcgorPT09PT09PT09CisKK0p1c3QgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgaGFuZGxlciBsYWJlbCwgcHJvdG9jb2xzLiBJdCBjYWxscyB0aGUKK3N1cGVyY2xhc3NlcyBwcm9jZXNzIGlmIHRoZXJlIGlzIGEgc3VwZXJjbGFzcy4KZGlmZiAtLWdpdCBhL2xpYi9ocy9TZXR1cC5saHMgYi9saWIvaHMvU2V0dXAubGhzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL2xpYi9ocy9UaHJpZnQuY2FiYWwgYi9saWIvaHMvVGhyaWZ0LmNhYmFsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjJkYTlhLi4wMDAwMDAwCi0tLSBhL2xpYi9ocy9UaHJpZnQuY2FiYWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0tLQotLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLS0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0tLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLS0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLS0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLS0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLS0KLS0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0tLQotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLS0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLS0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLS0tIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0KLQotTmFtZTogICAgICAgICAgIHRocmlmdAotVmVyc2lvbjogICAgICAgIDAuNi4xCi1DYWJhbC1WZXJzaW9uOiAgPj0gMS40Ci1MaWNlbnNlOiAgICAgICAgT3RoZXJMaWNlbnNlCi1DYXRlZ29yeTogICAgICAgRm9yZWlnbgotQnVpbGQtVHlwZTogICAgIFNpbXBsZQotU3lub3BzaXM6ICAgICAgIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KLUhvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKLUJ1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAotTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZwotTGljZW5zZS1GaWxlOiAgIExJQ0VOU0UKLQotRGVzY3JpcHRpb246Ci0gIEhhc2tlbGwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uIFJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHRocmlmdCBjb2RlIGdlbmVyYXRvci4KLQotTGlicmFyeQotICBIcy1Tb3VyY2UtRGlyczoKLSAgICBzcmMKLSAgQnVpbGQtRGVwZW5kczoKLSAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBuZXR3b3JrLCBnaGMtcHJpbSwgYmluYXJ5LCBieXRlc3RyaW5nLCBIVFRQCi0gIEV4cG9zZWQtTW9kdWxlczoKLSAgICBUaHJpZnQsIFRocmlmdC5Qcm90b2NvbCwgVGhyaWZ0LlRyYW5zcG9ydCwgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQotICAgIFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlLCBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQsIFRocmlmdC5TZXJ2ZXIKLSAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUsIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sIEZsZXhpYmxlSW5zdGFuY2VzLAotICAgIEtpbmRTaWduYXR1cmVzLCBNYWdpY0hhc2gsIFJhbmtOVHlwZXMsCi0gICAgU2NvcGVkVHlwZVZhcmlhYmxlcywgVHlwZVN5bm9ueW1JbnN0YW5jZXMKLQpkaWZmIC0tZ2l0IGEvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvaHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCmluZGV4IDliNGQ0MWUuLjY1ODAyMDkgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCkBAIC0xLDUgKzEsNSBAQAogey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX0KLXstIyBMQU5HVUFHRSBLaW5kU2lnbmF0dXJlcyAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KIHstIyBMQU5HVUFHRSBSYW5rTlR5cGVzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTMwLDE0ICszMCwxNyBAQAogICAgICwgVGhyaWZ0RXhjZXB0aW9uKC4uKQogICAgICkgd2hlcmUKIAotaW1wb3J0IENvbnRyb2wuTW9uYWQgKCB3aGVuICkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbgogCitpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLlRleHQuTGF6eSAoIFRleHQsIHBhY2ssIHVucGFjayApCitpbXBvcnQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcKIGltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAogCi1pbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAogaW1wb3J0IFRocmlmdC5Qcm90b2NvbAotCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UeXBlcwogCiBkYXRhIFRocmlmdEV4Y2VwdGlvbiA9IFRocmlmdEV4Y2VwdGlvbgogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKQEAgLTUwLDYgKzUzLDExIEBACiAgICAgfCBBRV9XUk9OR19NRVRIT0RfTkFNRQogICAgIHwgQUVfQkFEX1NFUVVFTkNFX0lECiAgICAgfCBBRV9NSVNTSU5HX1JFU1VMVAorICAgIHwgQUVfSU5URVJOQUxfRVJST1IKKyAgICB8IEFFX1BST1RPQ09MX0VSUk9SCisgICAgfCBBRV9JTlZBTElEX1RSQU5TRk9STQorICAgIHwgQUVfSU5WQUxJRF9QUk9UT0NPTAorICAgIHwgQUVfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKICAgICAgIGRlcml2aW5nICggRXEsIFNob3csIFR5cGVhYmxlICkKIAogaW5zdGFuY2UgRW51bSBBcHBFeG5UeXBlIHdoZXJlCkBAIC01OSw2ICs2NywxMSBAQAogICAgIHRvRW51bSAzID0gQUVfV1JPTkdfTUVUSE9EX05BTUUKICAgICB0b0VudW0gNCA9IEFFX0JBRF9TRVFVRU5DRV9JRAogICAgIHRvRW51bSA1ID0gQUVfTUlTU0lOR19SRVNVTFQKKyAgICB0b0VudW0gNiA9IEFFX0lOVEVSTkFMX0VSUk9SCisgICAgdG9FbnVtIDcgPSBBRV9QUk9UT0NPTF9FUlJPUgorICAgIHRvRW51bSA4ID0gQUVfSU5WQUxJRF9UUkFOU0ZPUk0KKyAgICB0b0VudW0gOSA9IEFFX0lOVkFMSURfUFJPVE9DT0wKKyAgICB0b0VudW0gMTAgPSBBRV9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogICAgIHRvRW51bSB0ID0gZXJyb3IgJCAiSW52YWxpZCBBcHBFeG5UeXBlICIgKysgc2hvdyB0CiAKICAgICBmcm9tRW51bSBBRV9VTktOT1dOID0gMApAQCAtNjcsNTAgKzgwLDM1IEBACiAgICAgZnJvbUVudW0gQUVfV1JPTkdfTUVUSE9EX05BTUUgPSAzCiAgICAgZnJvbUVudW0gQUVfQkFEX1NFUVVFTkNFX0lEID0gNAogICAgIGZyb21FbnVtIEFFX01JU1NJTkdfUkVTVUxUID0gNQorICAgIGZyb21FbnVtIEFFX0lOVEVSTkFMX0VSUk9SID0gNgorICAgIGZyb21FbnVtIEFFX1BST1RPQ09MX0VSUk9SID0gNworICAgIGZyb21FbnVtIEFFX0lOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIGZyb21FbnVtIEFFX0lOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgZnJvbUVudW0gQUVfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCiBkYXRhIEFwcEV4biA9IEFwcEV4biB7IGFlX3R5cGUgOjogQXBwRXhuVHlwZSwgYWVfbWVzc2FnZSA6OiBTdHJpbmcgfQogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKIGluc3RhbmNlIEV4Y2VwdGlvbiBBcHBFeG4KIAotd3JpdGVBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gQXBwRXhuIC0+IElPICgpCi13cml0ZUFwcEV4biBwdCBhZSA9IGRvCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiBwdCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgord3JpdGVBcHBFeG4gOjogUHJvdG9jb2wgcCA9PiBwIC0+IEFwcEV4biAtPiBJTyAoKQord3JpdGVBcHBFeG4gcHQgYWUgPSB3cml0ZVZhbCBwdCAkIFRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QKKyAgICAgICAgICAgICAgICAgICAgWyAoMSwgKCJtZXNzYWdlIiwgVFN0cmluZyAkIGVuY29kZVV0ZjggJCBwYWNrICQgYWVfbWVzc2FnZSBhZSkpCisgICAgICAgICAgICAgICAgICAgICwgKDIsICgidHlwZSIsIFRJMzIgJCBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAoYWVfdHlwZSBhZSkpKQorICAgICAgICAgICAgICAgICAgICBdCiAKLSAgICB3aGVuIChhZV9tZXNzYWdlIGFlIC89ICIiKSAkIGRvCi0gICAgICAgIHdyaXRlRmllbGRCZWdpbiBwdCAoIm1lc3NhZ2UiLCBUX1NUUklORyAsIDEpCi0gICAgICAgIHdyaXRlU3RyaW5nIHB0IChhZV9tZXNzYWdlIGFlKQotICAgICAgICB3cml0ZUZpZWxkRW5kIHB0Ci0KLSAgICB3cml0ZUZpZWxkQmVnaW4gcHQgKCJ0eXBlIiwgVF9JMzIsIDIpOwotICAgIHdyaXRlSTMyIHB0IChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAoYWVfdHlwZSBhZSkpCi0gICAgd3JpdGVGaWVsZEVuZCBwdAotICAgIHdyaXRlRmllbGRTdG9wIHB0Ci0gICAgd3JpdGVTdHJ1Y3RFbmQgcHQKLQotcmVhZEFwcEV4biA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyBBcHBFeG4KK3JlYWRBcHBFeG4gOjogUHJvdG9jb2wgcCA9PiBwIC0+IElPIEFwcEV4bgogcmVhZEFwcEV4biBwdCA9IGRvCi0gICAgXyA8LSByZWFkU3RydWN0QmVnaW4gcHQKLSAgICByZWNvcmQgPC0gcmVhZEFwcEV4bkZpZWxkcyBwdCAoQXBwRXhuIHthZV90eXBlID0gdW5kZWZpbmVkLCBhZV9tZXNzYWdlID0gdW5kZWZpbmVkfSkKLSAgICByZWFkU3RydWN0RW5kIHB0Ci0gICAgcmV0dXJuIHJlY29yZAorICAgIGxldCB0eXBlbWFwID0gTWFwLmZyb21MaXN0IFsoMSwoIm1lc3NhZ2UiLFRfU1RSSU5HKSksKDIsKCJ0eXBlIixUX0kzMikpXQorICAgIFRTdHJ1Y3QgZmllbGRzIDwtIHJlYWRWYWwgcHQgJCBUX1NUUlVDVCB0eXBlbWFwCisgICAgcmV0dXJuICQgcmVhZEFwcEV4bkZpZWxkcyBmaWVsZHMKIAotcmVhZEFwcEV4bkZpZWxkcyA6OiBmb3JhbGwgKGEgOjogKiAtPiAqKSB0LiAoUHJvdG9jb2wgYSwgVHJhbnNwb3J0IHQpID0+IGEgdCAtPiBBcHBFeG4gLT4gSU8gQXBwRXhuIAotcmVhZEFwcEV4bkZpZWxkcyBwdCByZWNvcmQgPSBkbwotICAgIChfLCBmdCwgdGFnKSA8LSByZWFkRmllbGRCZWdpbiBwdAotICAgIGlmIGZ0ID09IFRfU1RPUAotICAgICAgICB0aGVuIHJldHVybiByZWNvcmQKLSAgICAgICAgZWxzZSBjYXNlIHRhZyBvZgotICAgICAgICAgICAgICAgICAxIC0+IGlmIGZ0ID09IFRfU1RSSU5HIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gcyA8LSByZWFkU3RyaW5nIHB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3Jke2FlX21lc3NhZ2UgPSBzfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRvIHNraXAgcHQgZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY29yZAotICAgICAgICAgICAgICAgICAyIC0+IGlmIGZ0ID09IFRfSTMyIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gaSA8LSByZWFkSTMyIHB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3Jke2FlX3R5cGUgPSAodG9FbnVtICQgZnJvbUludGVncmFsIGkpfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRvIHNraXAgcHQgZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY29yZAotICAgICAgICAgICAgICAgICBfIC0+IGRvIHNraXAgcHQgZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRmllbGRFbmQgcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY29yZAotCityZWFkQXBwRXhuRmllbGRzIDo6IE1hcC5IYXNoTWFwIEludDE2IChUZXh0LCBUaHJpZnRWYWwpIC0+IEFwcEV4bgorcmVhZEFwcEV4bkZpZWxkcyBmaWVsZHMgPSBBcHBFeG57CisgIGFlX21lc3NhZ2UgPSBtYXliZSB1bmRlZmluZWQgdW53cmFwTWVzc2FnZSAkIE1hcC5sb29rdXAgMSBmaWVsZHMsCisgIGFlX3R5cGUgICAgPSBtYXliZSB1bmRlZmluZWQgdW53cmFwVHlwZSAkIE1hcC5sb29rdXAgMiBmaWVsZHMKKyAgfQorICB3aGVyZQorICAgIHVud3JhcE1lc3NhZ2UgKF8sIFRTdHJpbmcgcykgPSB1bnBhY2sgJCBkZWNvZGVVdGY4IHMKKyAgICB1bndyYXBNZXNzYWdlIF8gPSB1bmRlZmluZWQKKyAgICB1bndyYXBUeXBlIChfLCBUSTMyIGkpID0gdG9FbnVtICQgZnJvbUludGVncmFsIGkKKyAgICB1bndyYXBUeXBlIF8gPSB1bmRlZmluZWQKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljMGZjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzCkBAIC0wLDAgKzEsNTUgQEAKK3stIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tb3JwaGFucyAjLX0KKworbW9kdWxlIFRocmlmdC5BcmJpdHJhcmllcyB3aGVyZQorCitpbXBvcnQgRGF0YS5CaXRzKCkKKworaW1wb3J0IFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkKKworaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUgKCg8JD4pKQoraW1wb3J0IERhdGEuTWFwIChNYXApCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWFwIGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIFRleHQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIEhTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBITWFwCitpbXBvcnQgRGF0YS5IYXNoYWJsZSAoSGFzaGFibGUpCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSAoQnl0ZVN0cmluZykKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgQlMKKworLS0gU3RyaW5nIGhhcyBhbiBBcmJpdHJhcnkgaW5zdGFuY2UgYWxyZWFkeQorLS0gQm9vbCBoYXMgYW4gQXJiaXRyYXJ5IGluc3RhbmNlIGFscmVhZHkKKy0tIEEgVGhyaWZ0ICdsaXN0JyBpcyBhIFZlY3Rvci4KKworaW5zdGFuY2UgQXJiaXRyYXJ5IEJ5dGVTdHJpbmcgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gQlMucGFjayAuIGZpbHRlciAoLz0gMCkgPCQ+IGFyYml0cmFyeQorCitpbnN0YW5jZSAoQXJiaXRyYXJ5IGspID0+IEFyYml0cmFyeSAoVmVjdG9yLlZlY3RvciBrKSB3aGVyZQorICBhcmJpdHJhcnkgPSBWZWN0b3IuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQorCitpbnN0YW5jZSBBcmJpdHJhcnkgVGV4dC5UZXh0IHdoZXJlCisgIGFyYml0cmFyeSA9IFRleHQucGFjayAuIGZpbHRlciAoLz0gJ1wwJykgPCQ+IGFyYml0cmFyeQorCitpbnN0YW5jZSAoRXEgaywgSGFzaGFibGUgaywgQXJiaXRyYXJ5IGspID0+IEFyYml0cmFyeSAoSFNldC5IYXNoU2V0IGspIHdoZXJlCisgIGFyYml0cmFyeSA9IEhTZXQuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQorCitpbnN0YW5jZSAoRXEgaywgSGFzaGFibGUgaywgQXJiaXRyYXJ5IGssIEFyYml0cmFyeSB2KSA9PgorICAgIEFyYml0cmFyeSAoSE1hcC5IYXNoTWFwIGsgdikgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gSE1hcC5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5CisKK3stCisgICBUbyBoYW5kbGUgVGhyaWZ0ICdlbnVtJyB3ZSB3b3VsZCBpZGVhbGx5IHVzZSBzb21ldGhpbmcgbGlrZToKKworaW5zdGFuY2UgKEVudW0gYSwgQm91bmRlZCBhKSA9PiBBcmJpdHJhcnkgYQorICAgIHdoZXJlIGFyYml0cmFyeSA9IGVsZW1lbnRzIChlbnVtRnJvbVRvIG1pbkJvdW5kIG1heEJvdW5kKQorCitVbmZvcnR1bmF0ZWx5IHRoaXMgZG9lc24ndCBwbGF5IG5pY2VseSB3aXRoIHRoZSB0eXBlIHN5c3RlbS4KK0luc3RlYWQgd2UnbGwgZ2VuZXJhdGUgYW4gYXJiaXRyYXJ5IGluc3RhbmNlIGFsb25nIHdpdGggdGhlIGNvZGUuCistfQorCit7LQorICAgIFRoZXJlIG1pZ2h0IGJlIHNvbWUgd2F5IHRvIGludHJvc3BlY3Qgb24gdGhlIEhhc2tlbGwgc3RydWN0dXJlIG9mIGEKKyAgICBUaHJpZnQgJ3N0cnVjdCcgb3IgJ2V4Y2VwdGlvbicgYnV0IGdlbmVyYXRpbmcgdGhlIGNvZGUgZGlyZWN0bHkgaXMgc2ltcGxlci4KKy19CmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCmluZGV4IDFhMzE5MzIuLjY3YTkxNzUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCkBAIC0xLDQgKzEsNiBAQAorey0jIExBTkdVQUdFIENQUCAjLX0KIHstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CiAtLQogLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIwLDE2NiArMjIsNDYgQEAKIAogbW9kdWxlIFRocmlmdC5Qcm90b2NvbAogICAgICggUHJvdG9jb2woLi4pCi0gICAgLCBza2lwCi0gICAgLCBNZXNzYWdlVHlwZSguLikKLSAgICAsIFRocmlmdFR5cGUoLi4pCisgICAgLCBTdGF0ZWxlc3NQcm90b2NvbCguLikKICAgICAsIFByb3RvY29sRXhuKC4uKQogICAgICwgUHJvdG9jb2xFeG5UeXBlKC4uKQorICAgICwgZ2V0VHlwZU9mCisgICAgLCBydW5QYXJzZXIKKyAgICAsIGJzVG9Eb3VibGUKKyAgICAsIGJzVG9Eb3VibGVMRQogICAgICkgd2hlcmUKIAotaW1wb3J0IENvbnRyb2wuTW9uYWQgKCByZXBsaWNhdGVNXywgdW5sZXNzICkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbgoraW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nCitpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLlVuc2FmZQoraW1wb3J0IERhdGEuRnVuY3RvciAoKDwkPikpCiBpbXBvcnQgRGF0YS5JbnQKLWltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQotaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5CitpbXBvcnQgRGF0YS5Nb25vaWQgKG1lbXB0eSkKK2ltcG9ydCBEYXRhLlRleHQuTGF6eSAoVGV4dCkKK2ltcG9ydCBEYXRhLlR5cGVhYmxlIChUeXBlYWJsZSkKK2ltcG9ydCBEYXRhLldvcmQKK2ltcG9ydCBGb3JlaWduLlB0ciAoY2FzdFB0cikKK2ltcG9ydCBGb3JlaWduLlN0b3JhYmxlIChwZWVrLCBwb2tlKQoraW1wb3J0IFN5c3RlbS5JTy5VbnNhZmUKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAotCi0KLWRhdGEgVGhyaWZ0VHlwZQotICAgID0gVF9TVE9QCi0gICAgfCBUX1ZPSUQKLSAgICB8IFRfQk9PTAotICAgIHwgVF9CWVRFCi0gICAgfCBUX0RPVUJMRQotICAgIHwgVF9JMTYKLSAgICB8IFRfSTMyCi0gICAgfCBUX0k2NAotICAgIHwgVF9TVFJJTkcKLSAgICB8IFRfU1RSVUNUCi0gICAgfCBUX01BUAotICAgIHwgVF9TRVQKLSAgICB8IFRfTElTVAotICAgICAgZGVyaXZpbmcgKCBFcSApCi0KLWluc3RhbmNlIEVudW0gVGhyaWZ0VHlwZSB3aGVyZQotICAgIGZyb21FbnVtIFRfU1RPUCAgID0gMAotICAgIGZyb21FbnVtIFRfVk9JRCAgID0gMQotICAgIGZyb21FbnVtIFRfQk9PTCAgID0gMgotICAgIGZyb21FbnVtIFRfQllURSAgID0gMwotICAgIGZyb21FbnVtIFRfRE9VQkxFID0gNAotICAgIGZyb21FbnVtIFRfSTE2ICAgID0gNgotICAgIGZyb21FbnVtIFRfSTMyICAgID0gOAotICAgIGZyb21FbnVtIFRfSTY0ICAgID0gMTAKLSAgICBmcm9tRW51bSBUX1NUUklORyA9IDExCi0gICAgZnJvbUVudW0gVF9TVFJVQ1QgPSAxMgotICAgIGZyb21FbnVtIFRfTUFQICAgID0gMTMKLSAgICBmcm9tRW51bSBUX1NFVCAgICA9IDE0Ci0gICAgZnJvbUVudW0gVF9MSVNUICAgPSAxNQotCi0gICAgdG9FbnVtIDAgID0gVF9TVE9QCi0gICAgdG9FbnVtIDEgID0gVF9WT0lECi0gICAgdG9FbnVtIDIgID0gVF9CT09MCi0gICAgdG9FbnVtIDMgID0gVF9CWVRFCi0gICAgdG9FbnVtIDQgID0gVF9ET1VCTEUKLSAgICB0b0VudW0gNiAgPSBUX0kxNgotICAgIHRvRW51bSA4ICA9IFRfSTMyCi0gICAgdG9FbnVtIDEwID0gVF9JNjQKLSAgICB0b0VudW0gMTEgPSBUX1NUUklORwotICAgIHRvRW51bSAxMiA9IFRfU1RSVUNUCi0gICAgdG9FbnVtIDEzID0gVF9NQVAKLSAgICB0b0VudW0gMTQgPSBUX1NFVAotICAgIHRvRW51bSAxNSA9IFRfTElTVAotICAgIHRvRW51bSB0ID0gZXJyb3IgJCAiSW52YWxpZCBUaHJpZnRUeXBlICIgKysgc2hvdyB0Ci0KLWRhdGEgTWVzc2FnZVR5cGUKLSAgICA9IE1fQ0FMTAotICAgIHwgTV9SRVBMWQotICAgIHwgTV9FWENFUFRJT04KLSAgICAgIGRlcml2aW5nICggRXEgKQotCi1pbnN0YW5jZSBFbnVtIE1lc3NhZ2VUeXBlIHdoZXJlCi0gICAgZnJvbUVudW0gTV9DQUxMICAgICAgPSAgMQotICAgIGZyb21FbnVtIE1fUkVQTFkgICAgID0gIDIKLSAgICBmcm9tRW51bSBNX0VYQ0VQVElPTiA9ICAzCi0KLSAgICB0b0VudW0gMSA9IE1fQ0FMTAotICAgIHRvRW51bSAyID0gTV9SRVBMWQotICAgIHRvRW51bSAzID0gTV9FWENFUFRJT04KLSAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgTWVzc2FnZVR5cGUgIiArKyBzaG93IHQKLQoraW1wb3J0IFRocmlmdC5UeXBlcwogCiBjbGFzcyBQcm90b2NvbCBhIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiB0CisgIHJlYWRCeXRlIDo6IGEgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKKyAgcmVhZFZhbCA6OiBhIC0+IFRocmlmdFR5cGUgLT4gSU8gVGhyaWZ0VmFsCisgIHJlYWRNZXNzYWdlIDo6IGEgLT4gKChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPIGIpIC0+IElPIGIKIAotICAgIHdyaXRlTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoU3RyaW5nLCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPICgpCi0gICAgd3JpdGVNZXNzYWdlRW5kICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCisgIHdyaXRlVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IElPICgpCisgIHdyaXRlTWVzc2FnZSA6OiBhIC0+IChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPICgpIC0+IElPICgpCiAKLSAgICB3cml0ZVN0cnVjdEJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBTdHJpbmcgLT4gSU8gKCkKLSAgICB3cml0ZVN0cnVjdEVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRCZWdpbiAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChTdHJpbmcsIFRocmlmdFR5cGUsIEludDE2KSAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRFbmQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVGaWVsZFN0b3AgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZU1hcEJlZ2luICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGhyaWZ0VHlwZSwgVGhyaWZ0VHlwZSwgSW50MzIpIC0+IElPICgpCi0gICAgd3JpdGVNYXBFbmQgICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZUxpc3RCZWdpbiAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGhyaWZ0VHlwZSwgSW50MzIpIC0+IElPICgpCi0gICAgd3JpdGVMaXN0RW5kICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZVNldEJlZ2luICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGhyaWZ0VHlwZSwgSW50MzIpIC0+IElPICgpCi0gICAgd3JpdGVTZXRFbmQgICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLQotICAgIHdyaXRlQm9vbCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBCb29sIC0+IElPICgpCi0gICAgd3JpdGVCeXRlICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDggLT4gSU8gKCkKLSAgICB3cml0ZUkxNiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSW50MTYgLT4gSU8gKCkKLSAgICB3cml0ZUkzMiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSW50MzIgLT4gSU8gKCkKLSAgICB3cml0ZUk2NCAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSW50NjQgLT4gSU8gKCkKLSAgICB3cml0ZURvdWJsZSA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gRG91YmxlIC0+IElPICgpCi0gICAgd3JpdGVTdHJpbmcgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFN0cmluZyAtPiBJTyAoKQotICAgIHdyaXRlQmluYXJ5IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBCeXRlU3RyaW5nIC0+IElPICgpCi0KLQotICAgIHJlYWRNZXNzYWdlQmVnaW4gOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChTdHJpbmcsIE1lc3NhZ2VUeXBlLCBJbnQzMikKLSAgICByZWFkTWVzc2FnZUVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotCi0gICAgcmVhZFN0cnVjdEJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBTdHJpbmcKLSAgICByZWFkU3RydWN0RW5kICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZEZpZWxkQmVnaW4gIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoU3RyaW5nLCBUaHJpZnRUeXBlLCBJbnQxNikKLSAgICByZWFkRmllbGRFbmQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZE1hcEJlZ2luICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGhyaWZ0VHlwZSwgVGhyaWZ0VHlwZSwgSW50MzIpCi0gICAgcmVhZE1hcEVuZCAgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRMaXN0QmVnaW4gICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRocmlmdFR5cGUsIEludDMyKQotICAgIHJlYWRMaXN0RW5kICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICByZWFkU2V0QmVnaW4gICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChUaHJpZnRUeXBlLCBJbnQzMikKLSAgICByZWFkU2V0RW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0KLSAgICByZWFkQm9vbCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBCb29sCi0gICAgcmVhZEJ5dGUgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50OAotICAgIHJlYWRJMTYgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludDE2Ci0gICAgcmVhZEkzMiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50MzIKLSAgICByZWFkSTY0ICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBJbnQ2NAotICAgIHJlYWREb3VibGUgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIERvdWJsZQotICAgIHJlYWRTdHJpbmcgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIFN0cmluZwotICAgIHJlYWRCaW5hcnkgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEJ5dGVTdHJpbmcKLQotCi1za2lwIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IFRocmlmdFR5cGUgLT4gSU8gKCkKLXNraXAgXyBUX1NUT1AgPSByZXR1cm4gKCkKLXNraXAgXyBUX1ZPSUQgPSByZXR1cm4gKCkKLXNraXAgcCBUX0JPT0wgPSByZWFkQm9vbCBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfQllURSA9IHJlYWRCeXRlIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JMTYgPSByZWFkSTE2IHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JMzIgPSByZWFkSTMyIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JNjQgPSByZWFkSTY0IHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9ET1VCTEUgPSByZWFkRG91YmxlIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9TVFJJTkcgPSByZWFkU3RyaW5nIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9TVFJVQ1QgPSBkbyBfIDwtIHJlYWRTdHJ1Y3RCZWdpbiBwCi0gICAgICAgICAgICAgICAgICAgICBza2lwRmllbGRzIHAKLSAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJ1Y3RFbmQgcAotc2tpcCBwIFRfTUFQID0gZG8gKGssIHYsIHMpIDwtIHJlYWRNYXBCZWdpbiBwCi0gICAgICAgICAgICAgICAgICByZXBsaWNhdGVNXyAoZnJvbUludGVncmFsIHMpIChza2lwIHAgayA+PiBza2lwIHAgdikKLSAgICAgICAgICAgICAgICAgIHJlYWRNYXBFbmQgcAotc2tpcCBwIFRfU0VUID0gZG8gKHQsIG4pIDwtIHJlYWRTZXRCZWdpbiBwCi0gICAgICAgICAgICAgICAgICByZXBsaWNhdGVNXyAoZnJvbUludGVncmFsIG4pIChza2lwIHAgdCkKLSAgICAgICAgICAgICAgICAgIHJlYWRTZXRFbmQgcAotc2tpcCBwIFRfTElTVCA9IGRvICh0LCBuKSA8LSByZWFkTGlzdEJlZ2luIHAKLSAgICAgICAgICAgICAgICAgICByZXBsaWNhdGVNXyAoZnJvbUludGVncmFsIG4pIChza2lwIHAgdCkKLSAgICAgICAgICAgICAgICAgICByZWFkTGlzdEVuZCBwCi0KLQotc2tpcEZpZWxkcyA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyAoKQotc2tpcEZpZWxkcyBwID0gZG8KLSAgICAoXywgdCwgXykgPC0gcmVhZEZpZWxkQmVnaW4gcAotICAgIHVubGVzcyAodCA9PSBUX1NUT1ApIChza2lwIHAgdCA+PiByZWFkRmllbGRFbmQgcCA+PiBza2lwRmllbGRzIHApCi0KK2NsYXNzIFByb3RvY29sIGEgPT4gU3RhdGVsZXNzUHJvdG9jb2wgYSB3aGVyZQorICBzZXJpYWxpemVWYWwgOjogYSAtPiBUaHJpZnRWYWwgLT4gTEJTLkJ5dGVTdHJpbmcKKyAgZGVzZXJpYWxpemVWYWwgOjogYSAtPiBUaHJpZnRUeXBlIC0+IExCUy5CeXRlU3RyaW5nIC0+IFRocmlmdFZhbAogCiBkYXRhIFByb3RvY29sRXhuVHlwZQogICAgID0gUEVfVU5LTk9XTgpAQCAtMTg3LDggKzY5LDY4IEBACiAgICAgfCBQRV9ORUdBVElWRV9TSVpFCiAgICAgfCBQRV9TSVpFX0xJTUlUCiAgICAgfCBQRV9CQURfVkVSU0lPTgorICAgIHwgUEVfTk9UX0lNUExFTUVOVEVECisgICAgfCBQRV9NSVNTSU5HX1JFUVVJUkVEX0ZJRUxECiAgICAgICBkZXJpdmluZyAoIEVxLCBTaG93LCBUeXBlYWJsZSApCiAKIGRhdGEgUHJvdG9jb2xFeG4gPSBQcm90b2NvbEV4biBQcm90b2NvbEV4blR5cGUgU3RyaW5nCiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQogaW5zdGFuY2UgRXhjZXB0aW9uIFByb3RvY29sRXhuCisKK2dldFR5cGVPZiA6OiBUaHJpZnRWYWwgLT4gVGhyaWZ0VHlwZQorZ2V0VHlwZU9mIHYgPSAgY2FzZSB2IG9mCisgIFRTdHJ1Y3R7fSAtPiBUX1NUUlVDVCBNYXAuZW1wdHkKKyAgVE1hcHt9IC0+IFRfTUFQIFRfVk9JRCBUX1ZPSUQKKyAgVExpc3R7fSAtPiBUX0xJU1QgVF9WT0lECisgIFRTZXR7fSAtPiBUX1NFVCBUX1ZPSUQKKyAgVEJvb2x7fSAtPiBUX0JPT0wKKyAgVEJ5dGV7fSAtPiBUX0JZVEUKKyAgVEkxNnt9IC0+IFRfSTE2CisgIFRJMzJ7fSAtPiBUX0kzMgorICBUSTY0e30gLT4gVF9JNjQKKyAgVFN0cmluZ3t9IC0+IFRfU1RSSU5HCisgIFRCaW5hcnl7fSAtPiBUX0JJTkFSWQorICBURG91Ymxle30gLT4gVF9ET1VCTEUKKworcnVuUGFyc2VyIDo6IChQcm90b2NvbCBwLCBTaG93IGEpID0+IHAgLT4gUGFyc2VyIGEgLT4gSU8gYQorcnVuUGFyc2VyIHByb3QgcCA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gcGFyc2UgcAorICB3aGVyZQorICAgIHJlZmlsbCA9IGhhbmRsZSBoYW5kbGVFT0YgJCBMQlMudG9TdHJpY3QgPCQ+IHJlYWRCeXRlIHByb3QKKyAgICBnZXRSZXN1bHQgKERvbmUgXyBhKSA9IHJldHVybiBhCisgICAgZ2V0UmVzdWx0IChQYXJ0aWFsIGspID0gcmVmaWxsID4+PSBnZXRSZXN1bHQgLiBrCisgICAgZ2V0UmVzdWx0IGYgPSB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0lOVkFMSURfREFUQSAoc2hvdyBmKQorCitoYW5kbGVFT0YgOjogU29tZUV4Y2VwdGlvbiAtPiBJTyBCUy5CeXRlU3RyaW5nCitoYW5kbGVFT0YgPSBjb25zdCAkIHJldHVybiBtZW1wdHkKKworLS0gfCBDb252ZXJ0cyBhIEJ5dGVTdHJpbmcgdG8gYSBGbG9hdGluZyBwb2ludCBudW1iZXIKKy0tIFRoZSBCeXRlU3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCBpbiBuZXR3b3JrIG9yZGVyIChCaWcgRW5kaWFuKQorLS0gdGhlcmVmb3JlIHRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIHZhcmllcyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBsb2NhbAorLS0gbWFjaGluZSBpcyBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4uCitic1RvRG91YmxlIDo6IEJTLkJ5dGVTdHJpbmcgLT4gRG91YmxlCitic1RvRG91YmxlTEUgOjogQlMuQnl0ZVN0cmluZyAtPiBEb3VibGUKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCitic1RvRG91YmxlIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCitic1RvRG91YmxlTEUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcworI2Vsc2UKK2JzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcworYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCisjZW5kaWYKKworCitjYXN0QnNTd2FwcGVkIGNoclB0ciA9IGRvCisgIHcgPC0gcGVlayAoY2FzdFB0ciBjaHJQdHIpCisgIHBva2UgKGNhc3RQdHIgY2hyUHRyKSAoYnl0ZVN3YXAgdykKKyAgcGVlayAoY2FzdFB0ciBjaHJQdHIpCitjYXN0QnMgPSBwZWVrIC4gY2FzdFB0cgorCistLSB8IFN3YXAgZW5kaWFubmVzcyBvZiBhIDY0LWJpdCB3b3JkCitieXRlU3dhcCA6OiBXb3JkNjQgLT4gV29yZDY0CitieXRlU3dhcCB3ID0gKHcgYHNoaWZ0TGAgNTYgLiYuIDB4RkYwMDAwMDAwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0TGAgNDAgLiYuIDB4MDBGRjAwMDAwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0TGAgMjQgLiYuIDB4MDAwMEZGMDAwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0TGAgOCAgLiYuIDB4MDAwMDAwRkYwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgOCAgLiYuIDB4MDAwMDAwMDBGRjAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgMjQgLiYuIDB4MDAwMDAwMDAwMEZGMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNDAgLiYuIDB4MDAwMDAwMDAwMDAwRkYwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNTYgLiYuIDB4MDAwMDAwMDAwMDAwMDBGRikKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocwppbmRleCBjNTVlYTVhLi43YjBhY2Q5IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCkBAIC0xLDUgKzEsMyBAQAotey0jIExBTkdVQUdFIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24gIy19Ci17LSMgTEFOR1VBR0UgTWFnaWNIYXNoICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwxNDMgKzE3LDE5NiBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgQ1BQICMtfQorey0jIExBTkdVQUdFIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24gIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19Cit7LSMgTEFOR1VBR0UgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KKwogbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIEJpbmFyeVByb3RvY29sKC4uKQorICAgICwgdmVyc2lvbk1hc2sKKyAgICAsIHZlcnNpb24xCiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIGxpZnRNICkKLQotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeQoraW1wb3J0IENvbnRyb2wuTW9uYWQKIGltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCiBpbXBvcnQgRGF0YS5JbnQKLQotaW1wb3J0IEdIQy5FeHRzCi1pbXBvcnQgR0hDLldvcmQKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZy5MYXp5IGFzIExQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEJpbmFyeQogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTQ2hhcjgKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKIAotdmVyc2lvbl9tYXNrIDo6IEludDMyCi12ZXJzaW9uX21hc2sgPSAweGZmZmYwMDAwCit2ZXJzaW9uTWFzayA6OiBJbnQzMgordmVyc2lvbk1hc2sgPSBmcm9tSW50ZWdyYWwgKDB4ZmZmZjAwMDAgOjogV29yZDMyKQogCi12ZXJzaW9uXzEgOjogSW50MzIKLXZlcnNpb25fMSAgICA9IDB4ODAwMTAwMDAKK3ZlcnNpb24xIDo6IEludDMyCit2ZXJzaW9uMSA9IGZyb21JbnRlZ3JhbCAoMHg4MDAxMDAwMCA6OiBXb3JkMzIpCiAKIGRhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IFRyYW5zcG9ydCBhID0+IEJpbmFyeVByb3RvY29sIGEKIAorZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEJpbmFyeVByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKIAotaW5zdGFuY2UgUHJvdG9jb2wgQmluYXJ5UHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKEJpbmFyeVByb3RvY29sIHQpID0gdAorLS0gTk9URTogUmVhZGluZyBhbmQgV3JpdGluZyBmdW5jdGlvbnMgcmVseSBvbiBCdWlsZGVycyBhbmQgRGF0YS5CaW5hcnkgdG8KKy0tIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEuICBEYXRhLkJpbmFyeSBhc3N1bWVzIHRoYXQgdGhlIGJpbmFyeSB2YWx1ZXMgaXQgaXMKKy0tIGVuY29kaW5nIHRvIGFuZCBkZWNvZGluZyBmcm9tIGFyZSBpbiBCSUcgRU5ESUFOIGZvcm1hdCwgYW5kIGNvbnZlcnRzIHRoZQorLS0gZW5kaWFubmVzcyBhcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIGxvY2FsIG1hY2hpbmUuCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgLS0gZmx1c2hUcmFuc3BvcnQgcCA9IHRGbHVzaCAoZ2V0VHJhbnNwb3J0IHApCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiAodmVyc2lvbjEgLnwuIGZyb21JbnRlZ3JhbCAoZnJvbUVudW0gdCkpKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSBkbwotICAgICAgICB3cml0ZUkzMiBwICh2ZXJzaW9uXzEgLnwuIChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSkKLSAgICAgICAgd3JpdGVTdHJpbmcgcCBuCi0gICAgICAgIHdyaXRlSTMyIHAgcwotICAgIHdyaXRlTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCi0KLSAgICB3cml0ZVN0cnVjdEJlZ2luIF8gXyA9IHJldHVybiAoKQotICAgIHdyaXRlU3RydWN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUZpZWxkQmVnaW4gcCAoXywgdCwgaSkgPSB3cml0ZVR5cGUgcCB0ID4+IHdyaXRlSTE2IHAgaQotICAgIHdyaXRlRmllbGRFbmQgXyA9IHJldHVybiAoKQotICAgIHdyaXRlRmllbGRTdG9wIHAgPSB3cml0ZVR5cGUgcCBUX1NUT1AKLSAgICB3cml0ZU1hcEJlZ2luIHAgKGssIHYsIG4pID0gd3JpdGVUeXBlIHAgayA+PiB3cml0ZVR5cGUgcCB2ID4+IHdyaXRlSTMyIHAgbgotICAgIHdyaXRlTWFwRW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUxpc3RCZWdpbiBwICh0LCBuKSA9IHdyaXRlVHlwZSBwIHQgPj4gd3JpdGVJMzIgcCBuCi0gICAgd3JpdGVMaXN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZVNldEJlZ2luIHAgKHQsIG4pID0gd3JpdGVUeXBlIHAgdCA+PiB3cml0ZUkzMiBwIG4KLSAgICB3cml0ZVNldEVuZCBfID0gcmV0dXJuICgpCi0KLSAgICB3cml0ZUJvb2wgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgJCBMQlMuc2luZ2xldG9uICQgdG9FbnVtICQgaWYgYiB0aGVuIDEgZWxzZSAwCi0gICAgd3JpdGVCeXRlIHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgRGF0YS5CaW5hcnkuZW5jb2RlIGIKLSAgICB3cml0ZUkxNiBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIERhdGEuQmluYXJ5LmVuY29kZSBiCi0gICAgd3JpdGVJMzIgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgJCBEYXRhLkJpbmFyeS5lbmNvZGUgYgotICAgIHdyaXRlSTY0IHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgRGF0YS5CaW5hcnkuZW5jb2RlIGIKLSAgICB3cml0ZURvdWJsZSBwIGQgPSB3cml0ZUk2NCBwIChmcm9tSW50ZWdyYWwgJCBmbG9hdEJpdHMgZCkKLSAgICB3cml0ZVN0cmluZyBwIHMgPSB3cml0ZUkzMiBwIChmcm9tSW50ZWdyYWwgJCBsZW5ndGggcykgPj4gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgKExCU0NoYXI4LnBhY2sgcykKLSAgICB3cml0ZUJpbmFyeSBwIHMgPSB3cml0ZUkzMiBwIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHMpID4+IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIHMKLQotICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IGRvCi0gICAgICAgIHZlciA8LSByZWFkSTMyIHAKLSAgICAgICAgaWYgKHZlciAuJi4gdmVyc2lvbl9tYXNrIC89IHZlcnNpb25fMSkKKyAgICByZWFkTWVzc2FnZSBwID0gKHJlYWRNZXNzYWdlQmVnaW4gcCA+Pj0pCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIGRvCisgICAgICAgICAgVEkzMiB2ZXIgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgIGlmIHZlciAuJi4gdmVyc2lvbk1hc2sgLz0gdmVyc2lvbjEKICAgICAgICAgICAgIHRoZW4gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9CQURfVkVSU0lPTiAiTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXIiCiAgICAgICAgICAgICBlbHNlIGRvCi0gICAgICAgICAgICAgIHMgPC0gcmVhZFN0cmluZyBwCi0gICAgICAgICAgICAgIHN6IDwtIHJlYWRJMzIgcAotICAgICAgICAgICAgICByZXR1cm4gKHMsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHZlciAuJi4gMHhGRiwgc3opCi0gICAgcmVhZE1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRTdHJ1Y3RCZWdpbiBfID0gcmV0dXJuICIiCi0gICAgcmVhZFN0cnVjdEVuZCBfID0gcmV0dXJuICgpCi0gICAgcmVhZEZpZWxkQmVnaW4gcCA9IGRvCi0gICAgICAgIHQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIGlmIHQgLz0gVF9TVE9QIHRoZW4gcmVhZEkxNiBwIGVsc2UgcmV0dXJuIDAKLSAgICAgICAgcmV0dXJuICgiIiwgdCwgbikKLSAgICByZWFkRmllbGRFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRNYXBCZWdpbiBwID0gZG8KLSAgICAgICAga3QgPC0gcmVhZFR5cGUgcAotICAgICAgICB2dCA8LSByZWFkVHlwZSBwCi0gICAgICAgIG4gPC0gcmVhZEkzMiBwCi0gICAgICAgIHJldHVybiAoa3QsIHZ0LCBuKQotICAgIHJlYWRNYXBFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRMaXN0QmVnaW4gcCA9IGRvCi0gICAgICAgIHQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIHJlYWRJMzIgcAotICAgICAgICByZXR1cm4gKHQsIG4pCi0gICAgcmVhZExpc3RFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRTZXRCZWdpbiBwID0gZG8KLSAgICAgICAgdCA8LSByZWFkVHlwZSBwCi0gICAgICAgIG4gPC0gcmVhZEkzMiBwCi0gICAgICAgIHJldHVybiAodCwgbikKLSAgICByZWFkU2V0RW5kIF8gPSByZXR1cm4gKCkKKyAgICAgICAgICAgICAgVFN0cmluZyBzIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcKKyAgICAgICAgICAgICAgVEkzMiBzeiA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBzLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB2ZXIgLiYuIDB4RkYsIHN6KQogCi0gICAgcmVhZEJvb2wgcCA9ICg9PSAxKSBgZm1hcGAgcmVhZEJ5dGUgcAorICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEJpbmFyeVZhbHVlCisgICAgcmVhZFZhbCBwID0gcnVuUGFyc2VyIHAgLiBwYXJzZUJpbmFyeVZhbHVlCiAKLSAgICByZWFkQnl0ZSBwID0gZG8KLSAgICAgICAgYnMgPC0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCi0gICAgICAgIHJldHVybiAkIERhdGEuQmluYXJ5LmRlY29kZSBicworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gU3RhdGVsZXNzUHJvdG9jb2wgKEJpbmFyeVByb3RvY29sIHQpIHdoZXJlCisgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VCaW5hcnlWYWx1ZSB0eSkgYnMgb2YKKyAgICAgICAgTGVmdCBzIC0+IGVycm9yIHMKKyAgICAgICAgUmlnaHQgdmFsIC0+IHZhbAogCi0gICAgcmVhZEkxNiBwID0gZG8KLSAgICAgICAgYnMgPC0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAyCi0gICAgICAgIHJldHVybiAkIERhdGEuQmluYXJ5LmRlY29kZSBicworLS0gfCBXcml0aW5nIEZ1bmN0aW9ucworYnVpbGRCaW5hcnlWYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgorYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRCaW5hcnlTdHJ1Y3QgZmllbGRzIDw+IGJ1aWxkVHlwZSBUX1NUT1AKK2J1aWxkQmluYXJ5VmFsdWUgKFRNYXAga3kgdnQgZW50cmllcykgPQorICBidWlsZFR5cGUga3kgPD4KKyAgYnVpbGRUeXBlIHZ0IDw+CisgIGludDMyQkUgKGZyb21JbnRlZ3JhbCAobGVuZ3RoIGVudHJpZXMpKSA8PgorICBidWlsZEJpbmFyeU1hcCBlbnRyaWVzCitidWlsZEJpbmFyeVZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKSA9CisgIGJ1aWxkVHlwZSB0eSA8PgorICBpbnQzMkJFIChmcm9tSW50ZWdyYWwgKGxlbmd0aCBlbnRyaWVzKSkgPD4KKyAgYnVpbGRCaW5hcnlMaXN0IGVudHJpZXMKK2J1aWxkQmluYXJ5VmFsdWUgKFRTZXQgdHkgZW50cmllcykgPQorICBidWlsZFR5cGUgdHkgPD4KKyAgaW50MzJCRSAoZnJvbUludGVncmFsIChsZW5ndGggZW50cmllcykpIDw+CisgIGJ1aWxkQmluYXJ5TGlzdCBlbnRyaWVzCitidWlsZEJpbmFyeVZhbHVlIChUQm9vbCBiKSA9CisgIHdvcmQ4ICQgdG9FbnVtICQgaWYgYiB0aGVuIDEgZWxzZSAwCitidWlsZEJpbmFyeVZhbHVlIChUQnl0ZSBiKSA9IGludDggYgorYnVpbGRCaW5hcnlWYWx1ZSAoVEkxNiBpKSA9IGludDE2QkUgaQorYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBpKSA9IGludDMyQkUgaQorYnVpbGRCaW5hcnlWYWx1ZSAoVEk2NCBpKSA9IGludDY0QkUgaQorYnVpbGRCaW5hcnlWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUJFIGQKK2J1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgcykgPSBpbnQzMkJFIGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCisgIHdoZXJlCisgICAgbGVuIDo6IEludDMyID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpCitidWlsZEJpbmFyeVZhbHVlIChUQmluYXJ5IHMpID0gYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyBzKQogCi0gICAgcmVhZEkzMiBwID0gZG8KLSAgICAgICAgYnMgPC0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSA0Ci0gICAgICAgIHJldHVybiAkIERhdGEuQmluYXJ5LmRlY29kZSBicworYnVpbGRCaW5hcnlTdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgorYnVpbGRCaW5hcnlTdHJ1Y3QgPSBNYXAuZm9sZHJXaXRoS2V5IGNvbWJpbmUgbWVtcHR5CisgIHdoZXJlCisgICAgY29tYmluZSBmaWQgKF8sdmFsKSBzID0KKyAgICAgIGJ1aWxkVHlwZU9mIHZhbCA8PiBpbnQxNkJFIGZpZCA8PiBidWlsZEJpbmFyeVZhbHVlIHZhbCA8PiBzCiAKLSAgICByZWFkSTY0IHAgPSBkbwotICAgICAgICBicyA8LSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDgKLSAgICAgICAgcmV0dXJuICQgRGF0YS5CaW5hcnkuZGVjb2RlIGJzCitidWlsZEJpbmFyeU1hcCA6OiBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0gLT4gQnVpbGRlcgorYnVpbGRCaW5hcnlNYXAgPSBmb2xkbCBjb21iaW5lIG1lbXB0eQorICB3aGVyZQorICAgIGNvbWJpbmUgcyAoa2V5LCB2YWwpID0gcyA8PiBidWlsZEJpbmFyeVZhbHVlIGtleSA8PiBidWlsZEJpbmFyeVZhbHVlIHZhbAogCi0gICAgcmVhZERvdWJsZSBwID0gZG8KLSAgICAgICAgYnMgPC0gcmVhZEk2NCBwCi0gICAgICAgIHJldHVybiAkIGZsb2F0T2ZCaXRzICQgZnJvbUludGVncmFsIGJzCitidWlsZEJpbmFyeUxpc3QgOjogW1RocmlmdFZhbF0gLT4gQnVpbGRlcgorYnVpbGRCaW5hcnlMaXN0ID0gZm9sZHIgKG1hcHBlbmQgLiBidWlsZEJpbmFyeVZhbHVlKSBtZW1wdHkKIAotICAgIHJlYWRTdHJpbmcgcCA9IGRvCi0gICAgICAgIGkgPC0gcmVhZEkzMiBwCi0gICAgICAgIExCU0NoYXI4LnVucGFjayBgbGlmdE1gIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgKGZyb21JbnRlZ3JhbCBpKQorLS0gfCBSZWFkaW5nIEZ1bmN0aW9ucworcGFyc2VCaW5hcnlWYWx1ZSA6OiBUaHJpZnRUeXBlIC0+IFAuUGFyc2VyIFRocmlmdFZhbAorcGFyc2VCaW5hcnlWYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPSBUU3RydWN0IDwkPiBwYXJzZUJpbmFyeVN0cnVjdCB0bWFwCitwYXJzZUJpbmFyeVZhbHVlIChUX01BUCBfIF8pID0gZG8KKyAga3QgPC0gcGFyc2VUeXBlCisgIHZ0IDwtIHBhcnNlVHlwZQorICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgVE1hcCBrdCB2dCA8JD4gcGFyc2VCaW5hcnlNYXAga3QgdnQgbgorcGFyc2VCaW5hcnlWYWx1ZSAoVF9MSVNUIF8pID0gZG8KKyAgdCA8LSBwYXJzZVR5cGUKKyAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIFRMaXN0IHQgPCQ+IHBhcnNlQmluYXJ5TGlzdCB0IG4KK3BhcnNlQmluYXJ5VmFsdWUgKFRfU0VUIF8pID0gZG8KKyAgdCA8LSBwYXJzZVR5cGUKKyAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIFRTZXQgdCA8JD4gcGFyc2VCaW5hcnlMaXN0IHQgbgorcGFyc2VCaW5hcnlWYWx1ZSBUX0JPT0wgPSBUQm9vbCAuICgvPTApIDwkPiBQLmFueVdvcmQ4CitwYXJzZUJpbmFyeVZhbHVlIFRfQllURSA9IFRCeXRlIC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMQorcGFyc2VCaW5hcnlWYWx1ZSBUX0kxNiA9IFRJMTYgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCitwYXJzZUJpbmFyeVZhbHVlIFRfSTMyID0gVEkzMiAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKK3BhcnNlQmluYXJ5VmFsdWUgVF9JNjQgPSBUSTY0IC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgOAorcGFyc2VCaW5hcnlWYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgLiBic1RvRG91YmxlIDwkPiBQLnRha2UgOAorcGFyc2VCaW5hcnlWYWx1ZSBUX1NUUklORyA9IHBhcnNlQmluYXJ5U3RyaW5nIFRTdHJpbmcKK3BhcnNlQmluYXJ5VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUJpbmFyeVN0cmluZyBUQmluYXJ5CitwYXJzZUJpbmFyeVZhbHVlIHR5ID0gZXJyb3IgJCAiQ2Fubm90IHJlYWQgdmFsdWUgb2YgdHlwZSAiICsrIHNob3cgdHkKIAotICAgIHJlYWRCaW5hcnkgcCA9IGRvCi0gICAgICAgIGkgPC0gcmVhZEkzMiBwCi0gICAgICAgIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgKGZyb21JbnRlZ3JhbCBpKQorcGFyc2VCaW5hcnlTdHJpbmcgdHkgPSBkbworICBpIDo6IEludDMyICA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIHR5IC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAoZnJvbUludGVncmFsIGkpCisKK3BhcnNlQmluYXJ5U3RydWN0IDo6IFR5cGVNYXAgLT4gUC5QYXJzZXIgKE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpKQorcGFyc2VCaW5hcnlTdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCA8JD4gUC5tYW55VGlsbCBwYXJzZUZpZWxkIChtYXRjaFR5cGUgVF9TVE9QKQorICB3aGVyZQorICAgIHBhcnNlRmllbGQgPSBkbworICAgICAgdCA8LSBwYXJzZVR5cGUKKyAgICAgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorICAgICAgdiA8LSBjYXNlICh0LCBNYXAubG9va3VwIG4gdG1hcCkgb2YKKyAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VCaW5hcnlWYWx1ZSBUX0JJTkFSWQorICAgICAgICAgICAgIF8gLT4gcGFyc2VCaW5hcnlWYWx1ZSB0CisgICAgICByZXR1cm4gKG4sICgiIiwgdikpCisKK3BhcnNlQmluYXJ5TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQLlBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KK3BhcnNlQmluYXJ5TWFwIGt0IHZ0IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBkbworICBrIDwtIHBhcnNlQmluYXJ5VmFsdWUga3QKKyAgdiA8LSBwYXJzZUJpbmFyeVZhbHVlIHZ0CisgICgoayx2KSA6KSA8JD4gcGFyc2VCaW5hcnlNYXAga3QgdnQgKG4tMSkKKworcGFyc2VCaW5hcnlMaXN0IDo6IFRocmlmdFR5cGUgLT4gSW50MzIgLT4gUC5QYXJzZXIgW1RocmlmdFZhbF0KK3BhcnNlQmluYXJ5TGlzdCB0eSBuIHwgbiA8PSAwID0gcmV0dXJuIFtdCisgICAgICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGxpZnRNMiAoOikgKHBhcnNlQmluYXJ5VmFsdWUgdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJzZUJpbmFyeUxpc3QgdHkgKG4tMSkpCisKIAogCiAtLSB8IFdyaXRlIGEgdHlwZSBhcyBhIGJ5dGUKLXdyaXRlVHlwZSA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBUaHJpZnRUeXBlIC0+IElPICgpCi13cml0ZVR5cGUgcCB0ID0gd3JpdGVCeXRlIHAgKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpCitidWlsZFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBCdWlsZGVyCitidWlsZFR5cGUgdCA9IHdvcmQ4ICQgZnJvbUludGVncmFsICQgZnJvbUVudW0gdAorCistLSB8IFdyaXRlIHR5cGUgb2YgYSBUaHJpZnRWYWwgYXMgYSBieXRlCitidWlsZFR5cGVPZiA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgorYnVpbGRUeXBlT2YgPSBidWlsZFR5cGUgLiBnZXRUeXBlT2YKIAogLS0gfCBSZWFkIGEgYnl0ZSBhcyB0aG91Z2ggaXQgd2VyZSBhIFRocmlmdFR5cGUKLXJlYWRUeXBlIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IElPIFRocmlmdFR5cGUKLXJlYWRUeXBlIHAgPSBkbwotICAgIGIgPC0gcmVhZEJ5dGUgcAotICAgIHJldHVybiAkIHRvRW51bSAkIGZyb21JbnRlZ3JhbCBiCitwYXJzZVR5cGUgOjogUC5QYXJzZXIgVGhyaWZ0VHlwZQorcGFyc2VUeXBlID0gdG9FbnVtIC4gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CiAKLWZsb2F0Qml0cyA6OiBEb3VibGUgLT4gV29yZDY0Ci1mbG9hdEJpdHMgKEQjIGQjKSA9IFc2NCMgKHVuc2FmZUNvZXJjZSMgZCMpCi0KLWZsb2F0T2ZCaXRzIDo6IFdvcmQ2NCAtPiBEb3VibGUKLWZsb2F0T2ZCaXRzIChXNjQjIGIjKSA9IEQjICh1bnNhZmVDb2VyY2UjIGIjKQotCittYXRjaFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBQLlBhcnNlciBUaHJpZnRUeXBlCittYXRjaFR5cGUgdCA9IHQgPCQgUC53b3JkOCAoZnJvbUludGVncmFsICQgZnJvbUVudW0gdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzk3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCkBAIC0wLDAgKzEsMzExIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgQ29tcGFjdFByb3RvY29sKC4uKQorICAgICwgcGFyc2VWYXJpbnQKKyAgICAsIGJ1aWxkVmFyaW50CisgICAgKSB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5MaXN0IGFzIExpc3QKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAorCistLSB8IHRoZSBDb21wYWN0IFByb3RvY29sIGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIFRocmlmdCAnVENvbXBhY3RQcm9jb3RvbCcKKy0tIHdoaWNoIGlzIHNpbWlsYXIgdG8gdGhlICdUQmluYXJ5UHJvdG9jb2wnLCBidXQgdGFrZXMgbGVzcyBzcGFjZSBvbiB0aGUgd2lyZS4KKy0tIEludGVncmFsIHR5cGVzIGFyZSBlbmNvZGVkIHVzaW5nIGFzIHZhcmludHMuCitkYXRhIENvbXBhY3RQcm90b2NvbCBhID0gQ29tcGFjdFByb3RvY29sIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0dWN0IGEgJ0NvbXBhY3RQcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCisKK3Byb3RvY29sSUQsIHZlcnNpb24sIHZlcnNpb25NYXNrLCB0eXBlTWFzaywgdHlwZUJpdHMgOjogV29yZDgKK3Byb3RvY29sSUQgID0gMHg4MiAtLSAxMDAwIDAwMTAKK3ZlcnNpb24gICAgID0gMHgwMQordmVyc2lvbk1hc2sgPSAweDFmIC0tIDAwMDEgMTExMQordHlwZU1hc2sgICAgPSAweGUwIC0tIDExMTAgMDAwMAordHlwZUJpdHMgICAgPSAweDA3IC0tIDAwMDAgMDExMQordHlwZVNoaWZ0QW1vdW50IDo6IEludAordHlwZVNoaWZ0QW1vdW50ID0gNQorCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gQ29tcGFjdFByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChDb21wYWN0UHJvdG9jb2wgdCkgPSB0CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi53b3JkOCBwcm90b2NvbElEIDw+CisgICAgICAgICAgQi53b3JkOCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KKyAgICAgICAgICAgICAgICAgICgoKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpIGBzaGlmdExgCisgICAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+CisgICAgICAgICAgYnVpbGRWYXJpbnQgKGkzMlRvWmlnWmFnIHMpIDw+CisgICAgICAgICAgYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pCisKKyAgICByZWFkTWVzc2FnZSBwIGYgPSByZWFkTWVzc2FnZUJlZ2luID4+PSBmCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKKyAgICAgICAgICB3aGVuIChwaWQgLz0gcHJvdG9jb2xJRCkgJCBlcnJvciAiQmFkIFByb3RvY29sIElEIgorICAgICAgICAgIHcgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrCisgICAgICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgorICAgICAgICAgIGxldCB0eXAgPSAodyBgc2hpZnRSYCB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlQml0cworICAgICAgICAgIHNlcUlkIDwtIHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCisgICAgICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IG5hbWUsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHR5cCwgc2VxSWQpCisKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHBhcnNlQ29tcGFjdFZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZENvbXBhY3RWYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VDb21wYWN0VmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gfCBXcml0aW5nIEZ1bmN0aW9ucworYnVpbGRDb21wYWN0VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkQ29tcGFjdFZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBidWlsZENvbXBhY3RTdHJ1Y3QgZmllbGRzCitidWlsZENvbXBhY3RWYWx1ZSAoVE1hcCBrdCB2dCBlbnRyaWVzKSA9CisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBsZW5ndGggZW50cmllcyA6OiBXb3JkMzIgaW4KKyAgaWYgbGVuID09IDAKKyAgdGhlbiBCLndvcmQ4IDB4MDAKKyAgZWxzZSBidWlsZFZhcmludCBsZW4gPD4KKyAgICAgICBCLndvcmQ4IChmcm9tVFR5cGUga3QgYHNoaWZ0TGAgNCAufC4gZnJvbVRUeXBlIHZ0KSA8PgorICAgICAgIGJ1aWxkQ29tcGFjdE1hcCBlbnRyaWVzCitidWlsZENvbXBhY3RWYWx1ZSAoVExpc3QgdHkgZW50cmllcykgPQorICBsZXQgbGVuID0gbGVuZ3RoIGVudHJpZXMgaW4KKyAgKGlmIGxlbiA8IDE1CisgICB0aGVuIEIud29yZDggJCAoZnJvbUludGVncmFsIGxlbiBgc2hpZnRMYCA0KSAufC4gZnJvbVRUeXBlIHR5CisgICBlbHNlIEIud29yZDggKDB4RjAgLnwuIGZyb21UVHlwZSB0eSkgPD4KKyAgICAgICAgYnVpbGRWYXJpbnQgKGZyb21JbnRlZ3JhbCBsZW4gOjogV29yZDMyKSkgPD4KKyAgYnVpbGRDb21wYWN0TGlzdCBlbnRyaWVzCitidWlsZENvbXBhY3RWYWx1ZSAoVFNldCB0eSBlbnRyaWVzKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKQorYnVpbGRDb21wYWN0VmFsdWUgKFRCb29sIGIpID0KKyAgQi53b3JkOCAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAorYnVpbGRDb21wYWN0VmFsdWUgKFRCeXRlIGIpID0gaW50OCBiCitidWlsZENvbXBhY3RWYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkVmFyaW50ICQgaTE2VG9aaWdaYWcgaQorYnVpbGRDb21wYWN0VmFsdWUgKFRJMzIgaSkgPSBidWlsZFZhcmludCAkIGkzMlRvWmlnWmFnIGkKK2J1aWxkQ29tcGFjdFZhbHVlIChUSTY0IGkpID0gYnVpbGRWYXJpbnQgJCBpNjRUb1ppZ1phZyBpCitidWlsZENvbXBhY3RWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUxFIGQKK2J1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nIHMpID0gYnVpbGRWYXJpbnQgbGVuIDw+IGxhenlCeXRlU3RyaW5nIHMKKyAgd2hlcmUKKyAgICBsZW4gPSBmcm9tSW50ZWdyYWwgKExCUy5sZW5ndGggcykgOjogV29yZDMyCitidWlsZENvbXBhY3RWYWx1ZSAoVEJpbmFyeSBzKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nIHMpCisKK2J1aWxkQ29tcGFjdFN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RTdHJ1Y3QgPSBmbGlwIChsb29wIDApIG1lbXB0eSAuIE1hcC50b0xpc3QKKyAgd2hlcmUKKyAgICBsb29wIF8gW10gYWNjID0gYWNjIDw+IEIud29yZDggKGZyb21UVHlwZSBUX1NUT1ApCisgICAgbG9vcCBsYXN0SWQgKChmaWQsIChfLHZhbCkpIDogZmllbGRzKSBhY2MgPSBsb29wIGZpZCBmaWVsZHMgJCBhY2MgPD4KKyAgICAgIChpZiBmaWQgPiBsYXN0SWQgJiYgZmlkIC0gbGFzdElkIDw9IDE1CisgICAgICAgdGhlbiBCLndvcmQ4ICQgZnJvbUludGVncmFsICgoZmlkIC0gbGFzdElkKSBgc2hpZnRMYCA0KSAufC4gdHlwZU9mIHZhbAorICAgICAgIGVsc2UgQi53b3JkOCAodHlwZU9mIHZhbCkgPD4gYnVpbGRWYXJpbnQgKGkxNlRvWmlnWmFnIGZpZCkpIDw+CisgICAgICAoaWYgdHlwZU9mIHZhbCA+IDB4MDIgLS0gTm90IGEgVF9CT09MCisgICAgICAgdGhlbiBidWlsZENvbXBhY3RWYWx1ZSB2YWwKKyAgICAgICBlbHNlIG1lbXB0eSkgLS0gVF9CT09McyBhcmUgZW5jb2RlZCBpbiB0aGUgdHlwZQorYnVpbGRDb21wYWN0TWFwIDo6IFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXSAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RNYXAgPSBmb2xkbCBjb21iaW5lIG1lbXB0eQorICB3aGVyZQorICAgIGNvbWJpbmUgcyAoa2V5LCB2YWwpID0gYnVpbGRDb21wYWN0VmFsdWUga2V5IDw+IGJ1aWxkQ29tcGFjdFZhbHVlIHZhbCA8PiBzCisKK2J1aWxkQ29tcGFjdExpc3QgOjogW1RocmlmdFZhbF0gLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0TGlzdCA9IGZvbGRyIChtYXBwZW5kIC4gYnVpbGRDb21wYWN0VmFsdWUpIG1lbXB0eQorCistLSB8IFJlYWRpbmcgRnVuY3Rpb25zCitwYXJzZUNvbXBhY3RWYWx1ZSA6OiBUaHJpZnRUeXBlIC0+IFBhcnNlciBUaHJpZnRWYWwKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQ29tcGFjdFN0cnVjdCB0bWFwCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9NQVAga3QnIHZ0JykgPSBkbworICBuIDwtIHBhcnNlVmFyaW50IGlkCisgIGlmIG4gPT0gMAorICAgIHRoZW4gcmV0dXJuICQgVE1hcCBrdCcgdnQnIFtdCisgICAgZWxzZSBkbworICAgIHcgPC0gUC5hbnlXb3JkOAorICAgIGxldCBrdCA9IHR5cGVGcm9tICQgdyBgc2hpZnRSYCA0CisgICAgICAgIHZ0ID0gdHlwZUZyb20gJCB3IC4mLiAweDBGCisgICAgVE1hcCBrdCB2dCA8JD4gcGFyc2VDb21wYWN0TWFwIGt0IHZ0IG4KK3BhcnNlQ29tcGFjdFZhbHVlIChUX0xJU1QgdHkpID0gVExpc3QgdHkgPCQ+IHBhcnNlQ29tcGFjdExpc3QKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NFVCB0eSkgPSBUU2V0IHR5IDwkPiBwYXJzZUNvbXBhY3RMaXN0CitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JPT0wgPSBUQm9vbCAuICgvPTApIDwkPiBQLmFueVdvcmQ4CitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JZVEUgPSBUQnl0ZSAuIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0VmFsdWUgVF9JMTYgPSBUSTE2IDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0kxNgorcGFyc2VDb21wYWN0VmFsdWUgVF9JMzIgPSBUSTMyIDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgorcGFyc2VDb21wYWN0VmFsdWUgVF9JNjQgPSBUSTY0IDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0k2NAorcGFyc2VDb21wYWN0VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZUxFIDwkPiBQLnRha2UgOAorcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVFN0cmluZworcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVEJpbmFyeQorcGFyc2VDb21wYWN0VmFsdWUgdHkgPSBlcnJvciAkICJDYW5ub3QgcmVhZCB2YWx1ZSBvZiB0eXBlICIgKysgc2hvdyB0eQorCitwYXJzZUNvbXBhY3RTdHJpbmcgdHkgPSBkbworICBsZW4gOjogV29yZDMyIDwtIHBhcnNlVmFyaW50IGlkCisgIHR5IC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAoZnJvbUludGVncmFsIGxlbikKKworcGFyc2VDb21wYWN0U3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQ29tcGFjdFN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBwYXJzZUZpZWxkcyAwCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZHMgOjogSW50MTYgLT4gUGFyc2VyIFsoSW50MTYsIChMVC5UZXh0LCBUaHJpZnRWYWwpKV0KKyAgICBwYXJzZUZpZWxkcyBsYXN0SWQgPSBkbworICAgICAgdyA8LSBQLmFueVdvcmQ4CisgICAgICBpZiB3ID09IDB4MDAKKyAgICAgICAgdGhlbiByZXR1cm4gW10KKyAgICAgICAgZWxzZSBkbworICAgICAgICAgIGxldCB0eSA9IHR5cGVGcm9tICh3IC4mLiAweDBGKQorICAgICAgICAgICAgICBtb2RpZmllciA9ICh3IC4mLiAweEYwKSBgc2hpZnRSYCA0CisgICAgICAgICAgZmlkIDwtIGlmIG1vZGlmaWVyIC89IDAKKyAgICAgICAgICAgICAgICAgdGhlbiByZXR1cm4gKGxhc3RJZCArIGZyb21JbnRlZ3JhbCBtb2RpZmllcikKKyAgICAgICAgICAgICAgICAgZWxzZSBwYXJzZVZhcmludCB6aWdaYWdUb0kxNgorICAgICAgICAgIHZhbCA8LSBpZiB0eSA9PSBUX0JPT0wKKyAgICAgICAgICAgICAgICAgdGhlbiByZXR1cm4gKFRCb29sICQgKHcgLiYuIDB4MEYpID09IDB4MDEpCisgICAgICAgICAgICAgICAgIGVsc2UgY2FzZSAodHksIE1hcC5sb29rdXAgZmlkIHRtYXApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gcGFyc2VDb21wYWN0VmFsdWUgdHkKKyAgICAgICAgICAoKGZpZCwgKExULmVtcHR5LCB2YWwpKSA6ICkgPCQ+IHBhcnNlRmllbGRzIGZpZAorCitwYXJzZUNvbXBhY3RNYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IEludDMyIC0+CisgICAgICAgICAgICAgICAgICAgUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VDb21wYWN0TWFwIGt0IHZ0IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gZG8KKyAgayA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBrdAorICB2IDwtIHBhcnNlQ29tcGFjdFZhbHVlIHZ0CisgICgoayx2KSA6KSA8JD4gcGFyc2VDb21wYWN0TWFwIGt0IHZ0IChuLTEpCisKK3BhcnNlQ29tcGFjdExpc3QgOjogUGFyc2VyIFtUaHJpZnRWYWxdCitwYXJzZUNvbXBhY3RMaXN0ID0gZG8KKyAgdyA8LSBQLmFueVdvcmQ4CisgIGxldCB0eSA9IHR5cGVGcm9tICQgdyAuJi4gMHgwRgorICAgICAgbHNpemUgPSB3IGBzaGlmdFJgIDQKKyAgc2l6ZSA8LSBpZiBsc2l6ZSA9PSAweEYKKyAgICAgICAgICB0aGVuIHBhcnNlVmFyaW50IGlkCisgICAgICAgICAgZWxzZSByZXR1cm4gJCBmcm9tSW50ZWdyYWwgbHNpemUKKyAgbG9vcCB0eSBzaXplCisgIHdoZXJlCisgICAgbG9vcCA6OiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFBhcnNlciBbVGhyaWZ0VmFsXQorICAgIGxvb3AgdHkgbiB8IG4gPD0gMCA9IHJldHVybiBbXQorICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGxpZnRNMiAoOikgKHBhcnNlQ29tcGFjdFZhbHVlIHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIHR5IChuLTEpKQorCistLSBTaWduZWQgbnVtYmVycyBtdXN0IGJlIGNvbnZlcnRlZCB0byAiWmlnIFphZyIgZm9ybWF0IGJlZm9yZSB0aGV5IGNhbiBiZQorLS0gc2VyaWFsaXplZCBpbiB0aGUgVmFyaW50IGZvcm1hdAoraTE2VG9aaWdaYWcgOjogSW50MTYgLT4gV29yZDE2CitpMTZUb1ppZ1phZyBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0TGAgMSkgYHhvcmAgKG4gYHNoaWZ0UmAgMTUpCisKK3ppZ1phZ1RvSTE2IDo6IFdvcmQxNiAtPiBJbnQxNgoremlnWmFnVG9JMTYgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdFJgIDEpIGB4b3JgIG5lZ2F0ZSAobiAuJi4gMHgxKQorCitpMzJUb1ppZ1phZyA6OiBJbnQzMiAtPiBXb3JkMzIKK2kzMlRvWmlnWmFnIG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRMYCAxKSBgeG9yYCAobiBgc2hpZnRSYCAzMSkKKworemlnWmFnVG9JMzIgOjogV29yZDMyIC0+IEludDMyCit6aWdaYWdUb0kzMiBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0UmAgMSkgYHhvcmAgbmVnYXRlIChuIC4mLiAweDEpCisKK2k2NFRvWmlnWmFnIDo6IEludDY0IC0+IFdvcmQ2NAoraTY0VG9aaWdaYWcgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdExgIDEpIGB4b3JgIChuIGBzaGlmdFJgIDYzKQorCit6aWdaYWdUb0k2NCA6OiBXb3JkNjQgLT4gSW50NjQKK3ppZ1phZ1RvSTY0IG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRSYCAxKSBgeG9yYCBuZWdhdGUgKG4gLiYuIDB4MSkKKworYnVpbGRWYXJpbnQgOjogKEJpdHMgYSwgSW50ZWdyYWwgYSkgID0+IGEgLT4gQnVpbGRlcgorYnVpbGRWYXJpbnQgbiB8IG4gLiYuIGNvbXBsZW1lbnQgMHg3RiA9PSAwID0gQi53b3JkOCAkIGZyb21JbnRlZ3JhbCBuCisgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gQi53b3JkOCAoMHg4MCAufC4gKGZyb21JbnRlZ3JhbCBuIC4mLiAweDdGKSkgPD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFZhcmludCAobiBgc2hpZnRSYCA3KQorCitwYXJzZVZhcmludCA6OiAoQml0cyBhLCBJbnRlZ3JhbCBhLCBPcmQgYSkgPT4gKGEgLT4gYikgLT4gUGFyc2VyIGIKK3BhcnNlVmFyaW50IGZyb21aaWdaYWcgPSBkbworICBieXRlc3RlbXAgPC0gQlMudW5wYWNrIDwkPiBQLnRha2VUaWxsIChub3QgLiBmbGlwIHRlc3RCaXQgNykKKyAgbHNiIDwtIFAuYW55V29yZDgKKyAgbGV0IGJ5dGVzID0gbHNiIDogTGlzdC5yZXZlcnNlIGJ5dGVzdGVtcAorICByZXR1cm4gJCBmcm9tWmlnWmFnICQgTGlzdC5mb2xkbCcgY29tYmluZSAweDAwIGJ5dGVzCisgIHdoZXJlIGNvbWJpbmUgYSBiID0gKGEgYHNoaWZ0TGAgNykgLnwuIChmcm9tSW50ZWdyYWwgYiAuJi4gMHg3ZikKKworLS0gfCBDb21wdXRlIHRoZSBDb21wYWN0IFR5cGUKK2Zyb21UVHlwZSA6OiBUaHJpZnRUeXBlIC0+IFdvcmQ4Citmcm9tVFR5cGUgdHkgPSBjYXNlIHR5IG9mCisgIFRfU1RPUCAtPiAweDAwCisgIFRfQk9PTCAtPiAweDAxCisgIFRfQllURSAtPiAweDAzCisgIFRfSTE2IC0+IDB4MDQKKyAgVF9JMzIgLT4gMHgwNQorICBUX0k2NCAtPiAweDA2CisgIFRfRE9VQkxFIC0+IDB4MDcKKyAgVF9TVFJJTkcgLT4gMHgwOAorICBUX0JJTkFSWSAtPiAweDA4CisgIFRfTElTVHt9IC0+IDB4MDkKKyAgVF9TRVR7fSAtPiAweDBBCisgIFRfTUFQe30gLT4gMHgwQgorICBUX1NUUlVDVHt9IC0+IDB4MEMKKyAgVF9WT0lEIC0+IGVycm9yICJObyBDb21wYWN0IHR5cGUgZm9yIFRfVk9JRCIKKwordHlwZU9mIDo6IFRocmlmdFZhbCAtPiBXb3JkOAordHlwZU9mIHYgPSBjYXNlIHYgb2YKKyAgVEJvb2wgVHJ1ZSAtPiAweDAxCisgIFRCb29sIEZhbHNlIC0+IDB4MDIKKyAgVEJ5dGUgXyAtPiAweDAzCisgIFRJMTYgXyAtPiAweDA0CisgIFRJMzIgXyAtPiAweDA1CisgIFRJNjQgXyAtPiAweDA2CisgIFREb3VibGUgXyAtPiAweDA3CisgIFRTdHJpbmcgXyAtPiAweDA4CisgIFRCaW5hcnkgXyAtPiAweDA4CisgIFRMaXN0e30gLT4gMHgwOQorICBUU2V0e30gLT4gMHgwQQorICBUTWFwe30gLT4gMHgwQgorICBUU3RydWN0e30gLT4gMHgwQworCit0eXBlRnJvbSA6OiBXb3JkOCAtPiBUaHJpZnRUeXBlCit0eXBlRnJvbSB3ID0gY2FzZSB3IG9mCisgIDB4MDEgLT4gVF9CT09MCisgIDB4MDIgLT4gVF9CT09MCisgIDB4MDMgLT4gVF9CWVRFCisgIDB4MDQgLT4gVF9JMTYKKyAgMHgwNSAtPiBUX0kzMgorICAweDA2IC0+IFRfSTY0CisgIDB4MDcgLT4gVF9ET1VCTEUKKyAgMHgwOCAtPiBUX1NUUklORworICAweDA5IC0+IFRfTElTVCBUX1ZPSUQKKyAgMHgwQSAtPiBUX1NFVCBUX1ZPSUQKKyAgMHgwQiAtPiBUX01BUCBUX1ZPSUQgVF9WT0lECisgIDB4MEMgLT4gVF9TVFJVQ1QgTWFwLmVtcHR5CisgIG4gLT4gZXJyb3IgJCAidHlwZUZyb206ICIgKysgc2hvdyBuICsrICIgaXMgbm90IGEgY29tcGFjdCB0eXBlIgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9IZWFkZXIuaHMKQEAgLTAsMCArMSwxNDEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBIZWFkZXJQcm90b2NvbCguLikKKyAgICAsIGdldFByb3RvY29sVHlwZQorICAgICwgc2V0UHJvdG9jb2xUeXBlCisgICAgLCBnZXRIZWFkZXJzCisgICAgLCBnZXRXcml0ZUhlYWRlcnMKKyAgICAsIHNldEhlYWRlcgorICAgICwgc2V0SGVhZGVycworICAgICwgY3JlYXRlSGVhZGVyUHJvdG9jb2wKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sMQorICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFdyYXAgPSBmb3JhbGwgYS4gKFByb3RvY29sIGEpID0+IFByb3RvY29sV3JhcChhKQorCitpbnN0YW5jZSBQcm90b2NvbCBQcm90b2NvbFdyYXAgd2hlcmUKKyAgcmVhZEJ5dGUgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRCeXRlIHAKKyAgcmVhZFZhbCAoUHJvdG9jb2xXcmFwIHApID0gcmVhZFZhbCBwCisgIHJlYWRNZXNzYWdlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkTWVzc2FnZSBwCisgIHdyaXRlVmFsIChQcm90b2NvbFdyYXAgcCkgPSB3cml0ZVZhbCBwCisgIHdyaXRlTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVNZXNzYWdlIHAKKworZGF0YSBIZWFkZXJQcm90b2NvbCBpIG8gPSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCB7CisgICAgdHJhbnMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbywKKyAgICB3cmFwcGVkUHJvdG8gOjogSU9SZWYgUHJvdG9jb2xXcmFwCisgIH0KKworY3JlYXRlUHJvdG9jb2xXcmFwIDo6IFRyYW5zcG9ydCB0ID0+IFByb3RvY29sVHlwZSAtPiB0IC0+IFByb3RvY29sV3JhcAorY3JlYXRlUHJvdG9jb2xXcmFwIHR5cCB0ID0KKyAgY2FzZSB0eXAgb2YKKyAgICBUQmluYXJ5IC0+IFByb3RvY29sV3JhcCAkIEJpbmFyeVByb3RvY29sIHQKKyAgICBUQ29tcGFjdCAtPiBQcm90b2NvbFdyYXAgJCBDb21wYWN0UHJvdG9jb2wgdAorICAgIFRKU09OIC0+IFByb3RvY29sV3JhcCAkIEpTT05Qcm90b2NvbCB0CisKK2NyZWF0ZUhlYWRlclByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyhIZWFkZXJQcm90b2NvbCBpIG8pCitjcmVhdGVIZWFkZXJQcm90b2NvbCBpIG8gPSBkbworICB0IDwtIG9wZW5IZWFkZXJUcmFuc3BvcnQgaSBvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBwcm90byA8LSBuZXdJT1JlZiAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgdAorICByZXR1cm4gJCBIZWFkZXJQcm90b2NvbCB7IHRyYW5zID0gdCwgd3JhcHBlZFByb3RvID0gcHJvdG8gfQorCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgOjogVHJhbnNwb3J0IHQgPT4gdCAtPiBJTyhIZWFkZXJQcm90b2NvbCB0IHQpCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgdCA9IGNyZWF0ZUhlYWRlclByb3RvY29sIHQgdAorCityZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBJTyAoKQorcmVzZXRQcm90b2NvbCBwID0gZG8KKyAgcGlkIDwtIHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKyAgd3JpdGVJT1JlZiAod3JhcHBlZFByb3RvIHApICQgY3JlYXRlUHJvdG9jb2xXcmFwIHBpZCAkIHRyYW5zIHAKKworZ2V0V3JhcHBlZCA9IHJlYWRJT1JlZiAuIHdyYXBwZWRQcm90bworCitzZXRUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc3BvcnQgcCB0ID0gcCB7IHRyYW5zID0gdCB9CisKK3VwZGF0ZVRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gKEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyVHJhbnNwb3J0IGkgbyktPiBIZWFkZXJQcm90b2NvbCBpIG8KK3VwZGF0ZVRyYW5zcG9ydCBwIGYgPSBzZXRUcmFuc3BvcnQgcCAoZiAkIHRyYW5zIHApCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCistLSBUT0RPOiB3ZSB3YW50IHRvIHNldCBoZWFkZXJzIHdpdGhvdXQgcmVjcmVhdGluZyBjbGllbnQuLi4KK3NldEhlYWRlciA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gU3RyaW5nIC0+IFN0cmluZyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlciBwIGsgdiA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlSGVhZGVycyA9IE1hcC5pbnNlcnQgayB2ICQgd3JpdGVIZWFkZXJzIHQgfQorCitzZXRIZWFkZXJzIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJzIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0SGVhZGVycyBwIGggPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBoIH0KKworLS0gVE9ETzogbWFrZSBpdCBwdWJsaWMgb25jZSB3ZSBoYXZlIGZpcnN0IHRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiBmb3IgSGFza2VsbAorc2V0VHJhbnNmb3JtcyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gW1RyYW5zZm9ybVR5cGVdIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNmb3JtcyBwIHRycyA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRycyB9CisKK3NldFRyYW5zZm9ybSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gVHJhbnNmb3JtVHlwZSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybSBwIHRyID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVUcmFuc2Zvcm1zID0gdHI6KHdyaXRlVHJhbnNmb3JtcyB0KSB9CisKK2dldFdyaXRlSGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycworZ2V0V3JpdGVIZWFkZXJzID0gd3JpdGVIZWFkZXJzIC4gdHJhbnMKKworZ2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gWyhTdHJpbmcsIFN0cmluZyldCitnZXRIZWFkZXJzID0gcmVhZElPUmVmIC4gaGVhZGVycyAuIHRyYW5zCisKK2dldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbFR5cGUgcCA9IHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKworc2V0UHJvdG9jb2xUeXBlIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3NldFByb3RvY29sVHlwZSBwIHR5cCA9IGRvCisgIHR5cDAgPC0gZ2V0UHJvdG9jb2xUeXBlIHAKKyAgaWYgdHlwID09IHR5cDAKKyAgICB0aGVuIHJldHVybiAoKQorICAgIGVsc2UgZG8KKyAgICAgIHRTZXRQcm90b2NvbCAodHJhbnMgcCkgdHlwCisgICAgICByZXNldFByb3RvY29sIHAKKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gUHJvdG9jb2wgKEhlYWRlclByb3RvY29sIGkgbykgd2hlcmUKKyAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsICh0cmFucyBwKSAxCisKKyAgcmVhZFZhbCBwIHRwID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkVmFsIHByb3RvIHRwCisKKyAgcmVhZE1lc3NhZ2UgcCBmID0gZG8KKyAgICB0UmVzZXRQcm90b2NvbCAodHJhbnMgcCkKKyAgICByZXNldFByb3RvY29sIHAKKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkTWVzc2FnZSBwcm90byBmCisKKyAgd3JpdGVWYWwgcCB2ID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZVZhbCBwcm90byB2CisKKyAgd3JpdGVNZXNzYWdlIHAgeCBmID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZU1lc3NhZ2UgcHJvdG8geCBmCisKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWVkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCkBAIC0wLDAgKzEsMzYyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19Cit7LSMgTEFOR1VBR0UgVHVwbGVTZWN0aW9ucyAjLX0KKworbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5KU09OCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBKU09OUHJvdG9jb2woLi4pCisgICAgKSB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uIChicmFja2V0KQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuQ2hhcjggYXMgUEMKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZy5MYXp5IGFzIExQCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkJhc2U2NC5MYXp5IGFzIEI2NEMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydywgdzJjKQoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5MaXN0CitpbXBvcnQgRGF0YS5NYXliZSAoY2F0TWF5YmVzKQoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcKK2ltcG9ydCBEYXRhLldvcmQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHlwZXMKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTQworaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAorCistLSB8IFRoZSBKU09OIFByb3RvY29sIGRhdGEgdXNlcyB0aGUgc3RhbmRhcmQgJ1RKU09OUHJvdG9jb2wnLiAgRGF0YSBpcworLS0gZW5jb2RlZCBhcyBhIEpTT04gJ0J5dGVTdHJpbmcnCitkYXRhIEpTT05Qcm90b2NvbCB0ID0gSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0cnVjdCBhICdKU09OUHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEpTT05Qcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoSlNPTlByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorCisgICAgd3JpdGVNZXNzYWdlIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQgLiBjb25zdAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHRXcml0ZSB0ICQgdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KKyAgICAgICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGZyb21FbnVtIHR5KSA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJworICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gZG8KKyAgICAgICAgICB0V3JpdGUgdCAiXSIKKyAgICAgICAgICB0Rmx1c2ggdAorCisgICAgcmVhZE1lc3NhZ2UgcCA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IGRvCisgICAgICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKKyAgICAgICAgICBjYXNlIGRlY29kZVV0ZjgnIGJzIG9mCisgICAgICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKKyAgICAgICAgICAgIFJpZ2h0IHN0ciAtPiBkbworICAgICAgICAgICAgICB0eSA8LSB0b0VudW0gPCQ+IChsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkpCisgICAgICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHIsIHR5LCBzZXFOdW0pCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKworICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VKU09OVmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gV3JpdGluZyBGdW5jdGlvbnMKKworYnVpbGRKU09OVmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkSlNPTlZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBCLmNoYXI4ICd7JyA8PiBidWlsZEpTT05TdHJ1Y3QgZmllbGRzIDw+IEIuY2hhcjggJ30nCitidWlsZEpTT05WYWx1ZSAoVE1hcCBrdCB2dCBlbnRyaWVzKSA9CisgIEIuY2hhcjggJ1snIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIGt0IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIHZ0IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGxlbmd0aCBlbnRyaWVzKSA8PgorICBCLmNoYXI4ICcsJyA8PiBCLmNoYXI4ICd7JyA8PiBidWlsZEpTT05NYXAgZW50cmllcyA8PiBCLmNoYXI4ICd9JyA8PgorICBCLmNoYXI4ICddJworYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpID0KKyAgQi5jaGFyOCAnWycgPD4gQi5jaGFyOCAnIicgPD4gZ2V0VHlwZU5hbWUgdHkgPD4gQi5jaGFyOCAnIicgPD4KKyAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAobGVuZ3RoIGVudHJpZXMpIDw+CisgIChpZiBsZW5ndGggZW50cmllcyA+IDAKKyAgIHRoZW4gQi5jaGFyOCAnLCcgPD4gYnVpbGRKU09OTGlzdCBlbnRyaWVzCisgICBlbHNlIG1lbXB0eSkgPD4KKyAgQi5jaGFyOCAnXScKK2J1aWxkSlNPTlZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0gYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpCitidWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5jaGFyOCAnMScgZWxzZSBCLmNoYXI4ICcwJworYnVpbGRKU09OVmFsdWUgKFRCeXRlIGIpID0gYnVpbGRTaG93YWJsZSBiCitidWlsZEpTT05WYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkU2hvd2FibGUgaQorYnVpbGRKU09OVmFsdWUgKFRJMzIgaSkgPSBidWlsZFNob3dhYmxlIGkKK2J1aWxkSlNPTlZhbHVlIChUSTY0IGkpID0gYnVpbGRTaG93YWJsZSBpCitidWlsZEpTT05WYWx1ZSAoVERvdWJsZSBkKSA9IGJ1aWxkU2hvd2FibGUgZAorYnVpbGRKU09OVmFsdWUgKFRTdHJpbmcgcykgPSBCLmNoYXI4ICdcIicgPD4gZXNjYXBlIHMgPD4gQi5jaGFyOCAnXCInCitidWlsZEpTT05WYWx1ZSAoVEJpbmFyeSBzKSA9IEIuY2hhcjggJ1wiJyA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAuIEI2NEMuZW5jb2RlICQgcykgPD4gQi5jaGFyOCAnXCInCisKK2J1aWxkSlNPTlN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZEpTT05TdHJ1Y3QgPSBtY29uY2F0IC4gaW50ZXJzcGVyc2UgKEIuY2hhcjggJywnKSAuIE1hcC5mb2xkcldpdGhLZXkgYnVpbGRGaWVsZCBbXQorICB3aGVyZSAKKyAgICBidWlsZEZpZWxkIGZpZCAoXyx2YWwpID0gKDopICQKKyAgICAgIEIuY2hhcjggJyInIDw+IGJ1aWxkU2hvd2FibGUgZmlkIDw+IEIuc3RyaW5nOCAiXCI6IiA8PiAKKyAgICAgIEIuY2hhcjggJ3snIDw+CisgICAgICBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSAoZ2V0VHlwZU9mIHZhbCkgPD4gQi5zdHJpbmc4ICJcIjoiIDw+CisgICAgICBidWlsZEpTT05WYWx1ZSB2YWwgPD4KKyAgICAgIEIuY2hhcjggJ30nCisKK2J1aWxkSlNPTk1hcCA6OiBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0gLT4gQnVpbGRlcgorYnVpbGRKU09OTWFwID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBtYXAgYnVpbGRLVgorICB3aGVyZQorICAgIGJ1aWxkS1YgKGtleUAoVFN0cmluZyBfKSwgdmFsKSA9CisgICAgICBidWlsZEpTT05WYWx1ZSBrZXkgPD4gQi5jaGFyOCAnOicgPD4gYnVpbGRKU09OVmFsdWUgdmFsCisgICAgYnVpbGRLViAoa2V5LCB2YWwpID0KKyAgICAgIEIuY2hhcjggJ1wiJyA8PiBidWlsZEpTT05WYWx1ZSBrZXkgPD4gQi5zdHJpbmc4ICJcIjoiIDw+IGJ1aWxkSlNPTlZhbHVlIHZhbAorYnVpbGRKU09OTGlzdCA6OiBbVGhyaWZ0VmFsXSAtPiBCdWlsZGVyCitidWlsZEpTT05MaXN0ID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBtYXAgYnVpbGRKU09OVmFsdWUKKworYnVpbGRTaG93YWJsZSA6OiBTaG93IGEgPT4gYSAtPiAgQnVpbGRlcgorYnVpbGRTaG93YWJsZSA9IEIuc3RyaW5nOCAuIHNob3cKKworLS0gUmVhZGluZyBGdW5jdGlvbnMKKworcGFyc2VKU09OVmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgVGhyaWZ0VmFsCitwYXJzZUpTT05WYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPQorICBUU3RydWN0IDwkPiAobGV4ZW1lIChQQy5jaGFyOCAneycpICo+IHBhcnNlSlNPTlN0cnVjdCB0bWFwIDwqIFBDLmNoYXI4ICd9JykKK3BhcnNlSlNPTlZhbHVlIChUX01BUCBrdCB2dCkgPSBmbWFwIChUTWFwIGt0IHZ0KSAkCisgIGJldHdlZW4gJ1snICddJyAkCisgICAgbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgbGV4ZW1lIGRlY2ltYWwgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgYmV0d2VlbiAneycgJ30nIChwYXJzZUpTT05NYXAga3QgdnQpCitwYXJzZUpTT05WYWx1ZSAoVF9MSVNUIHR5KSA9IGZtYXAgKFRMaXN0IHR5KSAkCisgIGJldHdlZW4gJ1snICddJyAkIGRvCisgICAgbGVuIDwtIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZGVjaW1hbAorICAgIGlmIGxlbiA+IDAKKyAgICAgIHRoZW4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCitwYXJzZUpTT05WYWx1ZSAoVF9TRVQgdHkpID0gZm1hcCAoVFNldCB0eSkgJAorICBiZXR3ZWVuICdbJyAnXScgJCBkbworICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGRlY2ltYWwKKyAgICBpZiBsZW4gPiAwCisgICAgICB0aGVuICBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gcGFyc2VKU09OTGlzdCB0eQorICAgICAgZWxzZSByZXR1cm4gW10KK3BhcnNlSlNPTlZhbHVlIFRfQk9PTCA9CisgIChUQm9vbCBUcnVlIDwkIFBDLmNoYXI4ICcxJykgPHw+IChUQm9vbCBGYWxzZSA8JCBQQy5jaGFyOCAnMCcpCitwYXJzZUpTT05WYWx1ZSBUX0JZVEUgPSBUQnl0ZSA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTMyID0gVEkzMiA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSA8JD4gZG91YmxlCitwYXJzZUpTT05WYWx1ZSBUX1NUUklORyA9IFRTdHJpbmcgPCQ+IGVzY2FwZWRTdHJpbmcKK3BhcnNlSlNPTlZhbHVlIFRfQklOQVJZID0gVEJpbmFyeSA8JD4gYmFzZTY0U3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX1NUT1AgPSBmYWlsICJwYXJzZUpTT05WYWx1ZTogY2Fubm90IHBhcnNlIHR5cGUgVF9TVE9QIgorcGFyc2VKU09OVmFsdWUgVF9WT0lEID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfVk9JRCIKKworcGFyc2VBbnlWYWx1ZSA6OiBQYXJzZXIgKCkKK3BhcnNlQW55VmFsdWUgPSBjaG9pY2UgJAorICAgICAgICAgICAgICAgIHNraXBCZXR3ZWVuICd7JyAnfScgOgorICAgICAgICAgICAgICAgIHNraXBCZXR3ZWVuICdbJyAnXScgOgorICAgICAgICAgICAgICAgIG1hcCAodm9pZCAuIHBhcnNlSlNPTlZhbHVlKQorICAgICAgICAgICAgICAgICAgWyBUX0JPT0wKKyAgICAgICAgICAgICAgICAgICwgVF9JMTYKKyAgICAgICAgICAgICAgICAgICwgVF9JMzIKKyAgICAgICAgICAgICAgICAgICwgVF9JNjQKKyAgICAgICAgICAgICAgICAgICwgVF9ET1VCTEUKKyAgICAgICAgICAgICAgICAgICwgVF9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICwgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgIF0KKyAgd2hlcmUKKyAgICBza2lwQmV0d2VlbiA6OiBDaGFyIC0+IENoYXIgLT4gUGFyc2VyICgpCisgICAgc2tpcEJldHdlZW4gYSBiID0gYmV0d2VlbiBhIGIgJCB2b2lkIChQQy5zYXRpc2Z5IChcYyAtPiBjIC89IGEgJiYgYyAvPSBiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx8PiBza2lwQmV0d2VlbiBhIGIKKworcGFyc2VKU09OU3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlSlNPTlN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IC4gY2F0TWF5YmVzIDwkPiBwYXJzZUZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgIGBzZXBCeWAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZCA9IGRvCisgICAgICBmaWQgPC0gbGV4ZW1lIChiZXR3ZWVuICciJyAnIicgZGVjaW1hbCkgPCogbGV4ZW1lIChQQy5jaGFyOCAnOicpCisgICAgICBjYXNlIE1hcC5sb29rdXAgZmlkIHRtYXAgb2YKKyAgICAgICAgSnVzdCAoc3RyLCBmdHlwZSkgLT4gYmV0d2VlbiAneycgJ30nICQgZG8KKyAgICAgICAgICBfIDwtIGxleGVtZSAoZXNjYXBlZFN0cmluZykgKj4gbGV4ZW1lIChQQy5jaGFyOCAnOicpCisgICAgICAgICAgdmFsIDwtIGxleGVtZSAocGFyc2VKU09OVmFsdWUgZnR5cGUpCisgICAgICAgICAgcmV0dXJuICQgSnVzdCAoZmlkLCAoc3RyLCB2YWwpKQorICAgICAgICBOb3RoaW5nIC0+IGxleGVtZSBwYXJzZUFueVZhbHVlICo+IHJldHVybiBOb3RoaW5nCisKK3BhcnNlSlNPTk1hcCA6OiBUaHJpZnRUeXBlIC0+IFRocmlmdFR5cGUgLT4gUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VKU09OTWFwIGt0IHZ0ID0KKyAgKCgsKSA8JD4gbGV4ZW1lIChwYXJzZUpTT05LZXkga3QpIDwqPgorICAgKGxleGVtZSAoUEMuY2hhcjggJzonKSAqPiBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIHZ0KSkpIGBzZXBCeWAKKyAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisgIHdoZXJlCisgICAgcGFyc2VKU09OS2V5IFRfU1RSSU5HID0gcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcKKyAgICBwYXJzZUpTT05LZXkgVF9CSU5BUlkgPSBwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWQorICAgIHBhcnNlSlNPTktleSBrdCA9IFBDLmNoYXI4ICciJyAqPiBwYXJzZUpTT05WYWx1ZSBrdCA8KiBQQy5jaGFyOCAnIicKKworcGFyc2VKU09OTGlzdCA6OiBUaHJpZnRUeXBlIC0+IFBhcnNlciBbVGhyaWZ0VmFsXQorcGFyc2VKU09OTGlzdCB0eSA9IGxleGVtZSAocGFyc2VKU09OVmFsdWUgdHkpIGBzZXBCeWAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisKK2VzY2FwZWRTdHJpbmcgOjogUGFyc2VyIExCUy5CeXRlU3RyaW5nCitlc2NhcGVkU3RyaW5nID0gUEMuY2hhcjggJyInICo+CisgICAgICAgICAgICAgICAgKExCUy5wYWNrIDwkPiBQLm1hbnknIChlc2NhcGVkQ2hhciA8fD4gbm90Q2hhcjggJyInKSkgPCoKKyAgICAgICAgICAgICAgICBQQy5jaGFyOCAnIicKKworYmFzZTY0U3RyaW5nIDo6IFBhcnNlciBMQlMuQnl0ZVN0cmluZworYmFzZTY0U3RyaW5nID0gUEMuY2hhcjggJyInICo+CisgICAgICAgICAgICAgICAoZGVjb2RlQmFzZTY0IC4gTEJTQy5wYWNrIDwkPiBQLm1hbnknIChQQy5ub3RDaGFyICciJykpIDwqCisgICAgICAgICAgICAgICBQQy5jaGFyOCAnIicKKyAgICAgICAgICAgICAgIHdoZXJlCisgICAgICAgICAgICAgICAgIGRlY29kZUJhc2U2NCBiID0KKyAgICAgICAgICAgICAgICAgICBsZXQgcGFkZGVkID0gY2FzZSAoTEJTLmxlbmd0aCBiKSBgbW9kYCA0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtPiBMQlMuYXBwZW5kIGIgIj09IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLT4gTEJTLmFwcGVuZCBiICI9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gYiBpbgorICAgICAgICAgICAgICAgICAgIGNhc2UgQjY0Qy5kZWNvZGUgcGFkZGVkIG9mCisgICAgICAgICAgICAgICAgICAgICBSaWdodCBzIC0+IHMKKyAgICAgICAgICAgICAgICAgICAgIExlZnQgeCAtPiBlcnJvciB4CisKK2VzY2FwZWRDaGFyIDo6IFBhcnNlciBXb3JkOAorZXNjYXBlZENoYXIgPSBQQy5jaGFyOCAnXFwnICo+IChjMncgPCQ+IGNob2ljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICdcU09IJyA8JCBQLnN0cmluZyAidTAwMDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTVFgnIDwkIFAuc3RyaW5nICJ1MDAwMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVUWCcgPCQgUC5zdHJpbmcgInUwMDAzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU9UJyA8JCBQLnN0cmluZyAidTAwMDQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFTlEnIDwkIFAuc3RyaW5nICJ1MDAwNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEFDSycgPCQgUC5zdHJpbmcgInUwMDA2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQkVMJyA8JCBQLnN0cmluZyAidTAwMDciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xCUycgIDwkIFAuc3RyaW5nICJ1MDAwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFZUJyAgPCQgUC5zdHJpbmcgInUwMDBiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRkYnICA8JCBQLnN0cmluZyAidTAwMGMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xDUicgIDwkIFAuc3RyaW5nICJ1MDAwZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNPJyAgPCQgUC5zdHJpbmcgInUwMDBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU0knICA8JCBQLnN0cmluZyAidTAwMGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xETEUnIDwkIFAuc3RyaW5nICJ1MDAxMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDMScgPCQgUC5zdHJpbmcgInUwMDExIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcREMyJyA8JCBQLnN0cmluZyAidTAwMTIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzMnIDwkIFAuc3RyaW5nICJ1MDAxMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDNCcgPCQgUC5zdHJpbmcgInUwMDE0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcTkFLJyA8JCBQLnN0cmluZyAidTAwMTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTWU4nIDwkIFAuc3RyaW5nICJ1MDAxNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVUQicgPCQgUC5zdHJpbmcgInUwMDE3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQ0FOJyA8JCBQLnN0cmluZyAidTAwMTgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFTScgIDwkIFAuc3RyaW5nICJ1MDAxOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNVQicgPCQgUC5zdHJpbmcgInUwMDFhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRVNDJyA8JCBQLnN0cmluZyAidTAwMWIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xGUycgIDwkIFAuc3RyaW5nICJ1MDAxYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEdTJyAgPCQgUC5zdHJpbmcgInUwMDFkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcUlMnICA8JCBQLnN0cmluZyAidTAwMWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xVUycgIDwkIFAuc3RyaW5nICJ1MDAxZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERFTCcgPCQgUC5zdHJpbmcgInUwMDdmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcMCcgPCQgUEMuY2hhciAnMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXGEnIDwkIFBDLmNoYXIgJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xiJyA8JCBQQy5jaGFyICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcZicgPCQgUEMuY2hhciAnZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXG4nIDwkIFBDLmNoYXIgJ24nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xyJyA8JCBQQy5jaGFyICdyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcdCcgPCQgUEMuY2hhciAndCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXHYnIDwkIFBDLmNoYXIgJ3YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1wiJyA8JCBQQy5jaGFyICciJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcJycgPCQgUEMuY2hhciAnXCcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xcJyA8JCBQQy5jaGFyICdcXCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnLycgIDwkIFBDLmNoYXIgJy8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKK2VzY2FwZSA6OiBMQlMuQnl0ZVN0cmluZyAtPiBCdWlsZGVyCitlc2NhcGUgPSBMQlMuZm9sZGwnIGVzY2FwZUNoYXIgbWVtcHR5CisgIHdoZXJlCisgICAgZXNjYXBlQ2hhciBiIHcgPSBiIDw+IChCLmxhenlCeXRlU3RyaW5nICQgY2FzZSB3MmMgdyBvZgorICAgICAgJ1wwJyAtPiAiXFwwIgorICAgICAgJ1xiJyAtPiAiXFxiIgorICAgICAgJ1xmJyAtPiAiXFxmIgorICAgICAgJ1xuJyAtPiAiXFxuIgorICAgICAgJ1xyJyAtPiAiXFxyIgorICAgICAgJ1x0JyAtPiAiXFx0IgorICAgICAgJ1wiJyAtPiAiXFxcIiIKKyAgICAgICdcXCcgLT4gIlxcXFwiCisgICAgICAnXFNPSCcgLT4gIlxcdTAwMDEiCisgICAgICAnXFNUWCcgLT4gIlxcdTAwMDIiCisgICAgICAnXEVUWCcgLT4gIlxcdTAwMDMiCisgICAgICAnXEVPVCcgLT4gIlxcdTAwMDQiCisgICAgICAnXEVOUScgLT4gIlxcdTAwMDUiCisgICAgICAnXEFDSycgLT4gIlxcdTAwMDYiCisgICAgICAnXEJFTCcgLT4gIlxcdTAwMDciCisgICAgICAnXFZUJyAgLT4gIlxcdTAwMGIiCisgICAgICAnXFNPJyAgLT4gIlxcdTAwMGUiCisgICAgICAnXFNJJyAgLT4gIlxcdTAwMGYiCisgICAgICAnXERMRScgLT4gIlxcdTAwMTAiCisgICAgICAnXERDMScgLT4gIlxcdTAwMTEiCisgICAgICAnXERDMicgLT4gIlxcdTAwMTIiCisgICAgICAnXERDMycgLT4gIlxcdTAwMTMiCisgICAgICAnXERDNCcgLT4gIlxcdTAwMTQiCisgICAgICAnXE5BSycgLT4gIlxcdTAwMTUiCisgICAgICAnXFNZTicgLT4gIlxcdTAwMTYiCisgICAgICAnXEVUQicgLT4gIlxcdTAwMTciCisgICAgICAnXENBTicgLT4gIlxcdTAwMTgiCisgICAgICAnXEVNJyAgLT4gIlxcdTAwMTkiCisgICAgICAnXFNVQicgLT4gIlxcdTAwMWEiCisgICAgICAnXEVTQycgLT4gIlxcdTAwMWIiCisgICAgICAnXEZTJyAgLT4gIlxcdTAwMWMiCisgICAgICAnXEdTJyAgLT4gIlxcdTAwMWQiCisgICAgICAnXFJTJyAgLT4gIlxcdTAwMWUiCisgICAgICAnXFVTJyAgLT4gIlxcdTAwMWYiCisgICAgICAnXERFTCcgLT4gIlxcdTAwN2YiCisgICAgICBfIC0+IExCUy5zaW5nbGV0b24gdykKKworbGV4ZW1lIDo6IFBhcnNlciBhIC0+IFBhcnNlciBhCitsZXhlbWUgPSAoPCogc2tpcFNwYWNlKQorCitub3RDaGFyOCA6OiBDaGFyIC0+IFBhcnNlciBXb3JkOAorbm90Q2hhcjggYyA9IFAuc2F0aXNmeSAoLz0gYzJ3IGMpCisKK2JldHdlZW4gOjogQ2hhciAtPiBDaGFyIC0+IFBhcnNlciBhIC0+IFBhcnNlciBhCitiZXR3ZWVuIGEgYiBwID0gbGV4ZW1lIChQQy5jaGFyOCBhKSAqPiBsZXhlbWUgcCA8KiBsZXhlbWUgKFBDLmNoYXI4IGIpCisKK2dldFR5cGVOYW1lIDo6IFRocmlmdFR5cGUgLT4gQnVpbGRlcgorZ2V0VHlwZU5hbWUgdHkgPSBCLnN0cmluZzggJCBjYXNlIHR5IG9mCisgIFRfU1RSVUNUIF8gLT4gInJlYyIKKyAgVF9NQVAgXyBfICAtPiAibWFwIgorICBUX0xJU1QgXyAgIC0+ICJsc3QiCisgIFRfU0VUIF8gICAgLT4gInNldCIKKyAgVF9CT09MICAgICAtPiAidGYiCisgIFRfQllURSAgICAgLT4gImk4IgorICBUX0kxNiAgICAgIC0+ICJpMTYiCisgIFRfSTMyICAgICAgLT4gImkzMiIKKyAgVF9JNjQgICAgICAtPiAiaTY0IgorICBUX0RPVUJMRSAgIC0+ICJkYmwiCisgIFRfU1RSSU5HICAgLT4gInN0ciIKKyAgVF9CSU5BUlkgICAtPiAic3RyIgorICBfIC0+IGVycm9yICJVbnJlY29nbml6ZWQgVHlwZSIKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCmluZGV4IGVkNzRjZWIuLjU0M2YzMzggMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKQEAgLTM4LDEwICszOCwxMCBAQAogCiAtLSB8IEEgdGhyZWFkZWQgc2V2ZXIgdGhhdCBpcyBjYXBhYmxlIG9mIHVzaW5nIGFueSBUcmFuc3BvcnQgb3IgUHJvdG9jb2wKIC0tIGluc3RhbmNlcy4KLXJ1blRocmVhZGVkU2VydmVyIDo6IChUcmFuc3BvcnQgdCwgUHJvdG9jb2wgaSwgUHJvdG9jb2wgbykKLSAgICAgICAgICAgICAgICAgID0+IChTb2NrZXQgLT4gSU8gKGkgdCwgbyB0KSkKK3J1blRocmVhZGVkU2VydmVyIDo6IChQcm90b2NvbCBpLCBQcm90b2NvbCBvKQorICAgICAgICAgICAgICAgICAgPT4gKFNvY2tldCAtPiBJTyAoaSwgbykpCiAgICAgICAgICAgICAgICAgICAtPiBoCi0gICAgICAgICAgICAgICAgICAtPiAoaCAtPiAoaSB0LCBvIHQpIC0+IElPIEJvb2wpCisgICAgICAgICAgICAgICAgICAtPiAoaCAtPiAoaSwgbykgLT4gSU8gQm9vbCkKICAgICAgICAgICAgICAgICAgIC0+IFBvcnRJRAogICAgICAgICAgICAgICAgICAgLT4gSU8gYQogcnVuVGhyZWFkZWRTZXJ2ZXIgYWNjZXB0ZXIgaGFuZCBwcm9jXyBwb3J0ID0gZG8KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocwppbmRleCAzZTVmMThiLi4zMDZlZGMyIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCkBAIC0xLDQgKzEsNSBAQAogey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX0KK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19CiAtLQogLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTI2LDggKzI3LDkgQEAKIAogaW1wb3J0IENvbnRyb2wuTW9uYWQgKCB3aGVuICkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIEV4Y2VwdGlvbiwgdGhyb3cgKQotCitpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKQogaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiBpbXBvcnQgRGF0YS5Nb25vaWQKQEAgLTM2LDYgKzM4LDcgQEAKICAgICB0SXNPcGVuIDo6IGEgLT4gSU8gQm9vbAogICAgIHRDbG9zZSAgOjogYSAtPiBJTyAoKQogICAgIHRSZWFkICAgOjogYSAtPiBJbnQgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKKyAgICB0UGVlayAgIDo6IGEgLT4gSU8gKE1heWJlIFdvcmQ4KQogICAgIHRXcml0ZSAgOjogYSAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQogICAgIHRGbHVzaCAgOjogYSAtPiBJTyAoKQogICAgIHRSZWFkQWxsIDo6IGEgLT4gSW50IC0+IElPIExCUy5CeXRlU3RyaW5nCkBAIC00Niw4ICs0OSw4IEBACiAgICAgICAgIGxldCBybGVuID0gZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCByZXN1bHQKICAgICAgICAgd2hlbiAocmxlbiA9PSAwKSAodGhyb3cgJCBUcmFuc3BvcnRFeG4gIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiIgVEVfVU5LTk9XTikKICAgICAgICAgaWYgbGVuIDw9IHJsZW4KLSAgICAgICAgICAgIHRoZW4gcmV0dXJuIHJlc3VsdAotICAgICAgICAgICAgZWxzZSAocmVzdWx0IGBtYXBwZW5kYCkgYGZtYXBgICh0UmVhZEFsbCBhIChsZW4gLSBybGVuKSkKKyAgICAgICAgICB0aGVuIHJldHVybiByZXN1bHQKKyAgICAgICAgICBlbHNlIChyZXN1bHQgYG1hcHBlbmRgKSA8JD4gdFJlYWRBbGwgYSAobGVuIC0gcmxlbikKIAogZGF0YSBUcmFuc3BvcnRFeG4gPSBUcmFuc3BvcnRFeG4gU3RyaW5nIFRyYW5zcG9ydEV4blR5cGUKICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCkBAIC02MCw0ICs2MywzIEBACiAgICAgfCBURV9USU1FRF9PVVQKICAgICB8IFRFX0VORF9PRl9GSUxFCiAgICAgICBkZXJpdmluZyAoIEVxLCBTaG93LCBUeXBlYWJsZSApCi0KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FmNWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzCkBAIC0wLDAgKzEsMzYgQEAKK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuRW1wdHkKKyAgICAgICAoIEVtcHR5VHJhbnNwb3J0KC4uKQorICAgICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKKworZGF0YSBFbXB0eVRyYW5zcG9ydCA9IEVtcHR5VHJhbnNwb3J0CisKK2luc3RhbmNlIFRyYW5zcG9ydCBFbXB0eVRyYW5zcG9ydCB3aGVyZQorICAgIHRJc09wZW4gPSBjb25zdCAkIHJldHVybiBGYWxzZQorICAgIHRDbG9zZSAgPSBjb25zdCAkIHJldHVybiAoKQorICAgIHRSZWFkIF8gXyA9IHJldHVybiAiIgorICAgIHRQZWVrID0gY29uc3QgJCByZXR1cm4gTm90aGluZworICAgIHRXcml0ZSBfIF8gPSByZXR1cm4gKCkKKyAgICB0Rmx1c2ggPSBjb25zdCQgcmV0dXJuICgpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmZjNDNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocwpAQCAtMCwwICsxLDk5IEBACit7LSMgTEFOR1VBR0UgRmxleGlibGVJbnN0YW5jZXMgIy19Cit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZAorICAgICggbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQKKyAgICAsIEZyYW1lZFRyYW5zcG9ydAorICAgICwgb3BlbkZyYW1lZFRyYW5zcG9ydAorICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyCisKK2ltcG9ydCBEYXRhLkludCAoSW50MzIpCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEIKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKKworLS0gfCBGcmFtZWRUcmFuc3BvcnQgd3JhcHMgYSBnaXZlbiB0cmFuc3BvcnQgaW4gZnJhbWVkIG1vZGUuCitkYXRhIEZyYW1lZFRyYW5zcG9ydCB0ID0gRnJhbWVkVHJhbnNwb3J0IHsKKyAgICAgIHdyYXBwZWRUcmFucyA6OiB0LCAgICAgICAgICAgLS0gXiBVbmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgIHdyaXRlQnVmZmVyICA6OiBXcml0ZUJ1ZmZlciwgLS0gXiBXcml0ZSBidWZmZXIuCisgICAgICByZWFkQnVmZmVyICAgOjogUmVhZEJ1ZmZlciAgIC0tIF4gUmVhZCBidWZmZXIuCisgICAgfQorCistLSB8IENyZWF0ZSBhIG5ldyBmcmFtZWQgdHJhbnNwb3J0IHdoaWNoIHdyYXBzIHRoZSBnaXZlbiB0cmFuc3BvcnQuCitvcGVuRnJhbWVkVHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IHQgLT4gSU8gKEZyYW1lZFRyYW5zcG9ydCB0KQorb3BlbkZyYW1lZFRyYW5zcG9ydCB0cmFucyA9IGRvCisgIHdidWYgPC0gbmV3V3JpdGVCdWZmZXIKKyAgcmJ1ZiA8LSBuZXdSZWFkQnVmZmVyCisgIHJldHVybiBGcmFtZWRUcmFuc3BvcnR7IHdyYXBwZWRUcmFucyA9IHRyYW5zLCB3cml0ZUJ1ZmZlciA9IHdidWYsIHJlYWRCdWZmZXIgPSByYnVmIH0KKworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gVHJhbnNwb3J0IChGcmFtZWRUcmFuc3BvcnQgdCkgd2hlcmUKKworICAgIHRDbG9zZSA9IHRDbG9zZSAuIHdyYXBwZWRUcmFucworCisgICAgdFJlYWQgdHJhbnMgbiA9IGRvCisgICAgICAtLSBGaXJzdCwgY2hlY2sgdGhlIHJlYWQgYnVmZmVyIGZvciBhbnkgZGF0YS4KKyAgICAgIGJzIDwtIHJlYWRCdWYgKHJlYWRCdWZmZXIgdHJhbnMpIG4KKyAgICAgIGlmIExCUy5udWxsIGJzCisgICAgICAgICB0aGVuCisgICAgICAgICAtLSBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdHksIHJlYWQgYW5vdGhlciBmcmFtZSBmcm9tIHRoZQorICAgICAgICAgLS0gdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICAgICAgIGRvIGxlbiA8LSByZWFkRnJhbWUgdHJhbnMKKyAgICAgICAgICAgICAgaWYgbGVuID4gMAorICAgICAgICAgICAgICAgICB0aGVuIHRSZWFkIHRyYW5zIG4KKyAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYnMKKyAgICAgICAgIGVsc2UgcmV0dXJuIGJzCisgICAgdFBlZWsgdHJhbnMgPSBkbworICAgICAgbXcgPC0gcGVla0J1ZiAocmVhZEJ1ZmZlciB0cmFucykKKyAgICAgIGNhc2UgbXcgb2YKKyAgICAgICAgSnVzdCBfIC0+IHJldHVybiBtdworICAgICAgICBOb3RoaW5nIC0+IGRvCisgICAgICAgICAgbGVuIDwtIHJlYWRGcmFtZSB0cmFucworICAgICAgICAgIGlmIGxlbiA+IDAKKyAgICAgICAgICAgICB0aGVuIHRQZWVrIHRyYW5zCisgICAgICAgICAgICAgZWxzZSByZXR1cm4gTm90aGluZworCisgICAgdFdyaXRlID0gd3JpdGVCdWYgLiB3cml0ZUJ1ZmZlcgorCisgICAgdEZsdXNoIHRyYW5zID0gZG8KKyAgICAgIGJzIDwtIGZsdXNoQnVmICh3cml0ZUJ1ZmZlciB0cmFucykKKyAgICAgIGxldCBzekJzID0gQi5lbmNvZGUgJCAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCBicyA6OiBJbnQzMikKKyAgICAgIHRXcml0ZSAod3JhcHBlZFRyYW5zIHRyYW5zKSBzekJzCisgICAgICB0V3JpdGUgKHdyYXBwZWRUcmFucyB0cmFucykgYnMKKyAgICAgIHRGbHVzaCAod3JhcHBlZFRyYW5zIHRyYW5zKQorCisgICAgdElzT3BlbiA9IHRJc09wZW4gLiB3cmFwcGVkVHJhbnMKKworcmVhZEZyYW1lIDo6IFRyYW5zcG9ydCB0ID0+IEZyYW1lZFRyYW5zcG9ydCB0IC0+IElPIEludAorcmVhZEZyYW1lIHRyYW5zID0gZG8KKyAgLS0gUmVhZCBhbmQgZGVjb2RlIHRoZSBmcmFtZSBzaXplLgorICBzekJzIDwtIHRSZWFkICh3cmFwcGVkVHJhbnMgdHJhbnMpIDQKKyAgbGV0IHN6ID0gZnJvbUludGVncmFsIChCLmRlY29kZSBzekJzIDo6IEludDMyKQorCisgIC0tIFJlYWQgdGhlIGZyYW1lIGFuZCBzdHVmZiBpdCBpbnRvIHRoZSByZWFkIGJ1ZmZlci4KKyAgYnMgPC0gdFJlYWQgKHdyYXBwZWRUcmFucyB0cmFucykgc3oKKyAgZmlsbEJ1ZiAocmVhZEJ1ZmZlciB0cmFucykgYnMKKworICAtLSBSZXR1cm4gdGhlIGZyYW1lIHNpemUgc28gdGhhdCB0aGUgY2FsbGVyIGtub3dzIHdoZXRoZXIgdG8gZXhwZWN0CisgIC0tIHNvbWV0aGluZyBpbiB0aGUgcmVhZCBidWZmZXIgb3Igbm90LgorICByZXR1cm4gc3oKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCmluZGV4IDcwZDM5ZTcuLmZmNjI5NWIgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocwpAQCAtMSw1ICsxLDUgQEAKIHstIyBMQU5HVUFHRSBGbGV4aWJsZUluc3RhbmNlcyAjLX0KLXstIyBMQU5HVUFHRSBLaW5kU2lnbmF0dXJlcyAjLX0KK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19CiB7LSMgTEFOR1VBR0UgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KIHstIyBMQU5HVUFHRSBUeXBlU3lub255bUluc3RhbmNlcyAjLX0KIHstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tb3JwaGFucyAjLX0KQEAgLTI3LDggKzI3LDkgQEAKICAgICAsIEhhbmRsZVNvdXJjZSguLikKICAgICApIHdoZXJlCiAKLWltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKLWltcG9ydCBDb250cm9sLk1vbmFkICgpCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCBjYXRjaCwgdGhyb3cgKQoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5JbnRlcm5hbCAoYzJ3KQoraW1wb3J0IERhdGEuRnVuY3RvcgogCiBpbXBvcnQgTmV0d29yawogCkBAIC00Miw5ICs0MywxNiBAQAogCiBpbnN0YW5jZSBUcmFuc3BvcnQgSGFuZGxlIHdoZXJlCiAgICAgdElzT3BlbiA9IGhJc09wZW4KLSAgICB0Q2xvc2UgaCAgICA9IGhDbG9zZSBoCi0gICAgdFJlYWQgIGggbiAgPSBMQlMuaEdldCBoIG4gYGNhdGNoYCBoYW5kbGVFT0YKLSAgICB0V3JpdGUgaCBzICA9IExCUy5oUHV0IGggcworICAgIHRDbG9zZSA9IGhDbG9zZQorICAgIHRSZWFkIGggbiA9IHJlYWQgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgbWVtcHR5CisgICAgICB3aGVyZQorICAgICAgICByZWFkID0gZG8KKyAgICAgICAgICBoTG9va0FoZWFkIGgKKyAgICAgICAgICBMQlMuaEdldE5vbkJsb2NraW5nIGggbgorICAgIHRSZWFkQWxsIF8gMCA9IHJldHVybiBtZW1wdHkKKyAgICB0UmVhZEFsbCBoIG4gPSBMQlMuaEdldCBoIG4gYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0aHJvd1RyYW5zcG9ydEV4bgorICAgIHRQZWVrIGggPSAoSnVzdCAuIGMydyA8JD4gaExvb2tBaGVhZCBoKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBOb3RoaW5nCisgICAgdFdyaXRlID0gTEJTLmhQdXQKICAgICB0Rmx1c2ggPSBoRmx1c2gKIAogCkBAIC01OSw4ICs2NywxMiBAQAogaW5zdGFuY2UgSGFuZGxlU291cmNlIChIb3N0TmFtZSwgUG9ydElEKSB3aGVyZQogICAgIGhPcGVuID0gdW5jdXJyeSBjb25uZWN0VG8KIAordGhyb3dUcmFuc3BvcnRFeG4gOjogSU9FcnJvciAtPiBJTyBhCit0aHJvd1RyYW5zcG9ydEV4biBlID0gaWYgaXNFT0ZFcnJvciBlCisgICAgdGhlbiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIiBURV9VTktOT1dOCisgICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGFuZGxlIHRSZWFkQWxsOiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgogCi1oYW5kbGVFT0YgOjogZm9yYWxsIGEgKG0gOjogKiAtPiAqKS4oTW9ub2lkIGEsIE1vbmFkIG0pID0+IElPRXJyb3IgLT4gbSBhCi1oYW5kbGVFT0YgZSA9IGlmIGlzRU9GRXJyb3IgZQotICAgIHRoZW4gcmV0dXJuIG1lbXB0eQotICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIlRDaGFubmVsVHJhbnNwb3J0OiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgoraGFuZGxlRU9GIDo6IGEgLT4gSU9FcnJvciAtPiBJTyBhCitoYW5kbGVFT0YgYSBlID0gaWYgaXNFT0ZFcnJvciBlCisgICAgdGhlbiByZXR1cm4gYQorICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhhbmRsZTogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWNhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMzU0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCisgICggbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQKKyAgLCBIZWFkZXJUcmFuc3BvcnQoLi4pCisgICwgb3BlbkhlYWRlclRyYW5zcG9ydAorICAsIFByb3RvY29sVHlwZSguLikKKyAgLCBUcmFuc2Zvcm1UeXBlKC4uKQorICAsIENsaWVudFR5cGUoLi4pCisgICwgdFJlc2V0UHJvdG9jb2wKKyAgLCB0U2V0UHJvdG9jb2wKKyAgKSB3aGVyZQorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLklPUmVmCitpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nIGFzIFAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkgYXMgQmluYXJ5CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuQ2hhcjggYXMgQworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWFwIGFzIE1hcAorCitkYXRhIFByb3RvY29sVHlwZSA9IFRCaW5hcnkgfCBUQ29tcGFjdCB8IFRKU09OIGRlcml2aW5nIChFbnVtLCBFcSkKK2RhdGEgQ2xpZW50VHlwZSA9IEhlYWRlckNsaWVudCB8IEZyYW1lZCB8IFVuZnJhbWVkIGRlcml2aW5nIChFbnVtLCBFcSkKKworaW5mb0lkS2V5VmFsdWUgPSAxCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCitkYXRhIFRyYW5zZm9ybVR5cGUgPSBabGliVHJhbnNmb3JtIGRlcml2aW5nIChFbnVtLCBFcSkKKworZnJvbVRyYW5zcG9ydFR5cGUgOjogVHJhbnNmb3JtVHlwZSAtPiBJbnQxNgorZnJvbVRyYW5zcG9ydFR5cGUgWmxpYlRyYW5zZm9ybSA9IDEKKwordG9UcmFuc3BvcnRUeXBlIDo6IEludDE2IC0+IFRyYW5zZm9ybVR5cGUKK3RvVHJhbnNwb3J0VHlwZSAxID0gWmxpYlRyYW5zZm9ybQordG9UcmFuc3BvcnRUeXBlIF8gPSAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0gSUQiIFRFX1VOS05PV04KKworZGF0YSBIZWFkZXJUcmFuc3BvcnQgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0CisgICAgeyByZWFkQnVmZmVyIDo6IElPUmVmIExCUy5CeXRlU3RyaW5nCisgICAgLCB3cml0ZUJ1ZmZlciA6OiBJT1JlZiBCLkJ1aWxkZXIKKyAgICAsIGluVHJhbnMgOjogaQorICAgICwgb3V0VHJhbnMgOjogbworICAgICwgY2xpZW50VHlwZSA6OiBJT1JlZiBDbGllbnRUeXBlCisgICAgLCBwcm90b2NvbFR5cGUgOjogSU9SZWYgUHJvdG9jb2xUeXBlCisgICAgLCBoZWFkZXJzIDo6IElPUmVmIFsoU3RyaW5nLCBTdHJpbmcpXQorICAgICwgd3JpdGVIZWFkZXJzIDo6IEhlYWRlcnMKKyAgICAsIHRyYW5zZm9ybXMgOjogSU9SZWYgW1RyYW5zZm9ybVR5cGVdCisgICAgLCB3cml0ZVRyYW5zZm9ybXMgOjogW1RyYW5zZm9ybVR5cGVdCisgICAgfQorCitvcGVuSGVhZGVyVHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyAoSGVhZGVyVHJhbnNwb3J0IGkgbykKK29wZW5IZWFkZXJUcmFuc3BvcnQgaSBvID0gZG8KKyAgcGlkIDwtIG5ld0lPUmVmIFRDb21wYWN0CisgIHJCdWYgPC0gbmV3SU9SZWYgTEJTLmVtcHR5CisgIHdCdWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIGNUeXBlIDwtIG5ld0lPUmVmIEhlYWRlckNsaWVudAorICBoIDwtIG5ld0lPUmVmIFtdCisgIHRyYW5zIDwtIG5ld0lPUmVmIFtdCisgIHJldHVybiBIZWFkZXJUcmFuc3BvcnQKKyAgICAgIHsgcmVhZEJ1ZmZlciA9IHJCdWYKKyAgICAgICwgd3JpdGVCdWZmZXIgPSB3QnVmCisgICAgICAsIGluVHJhbnMgPSBpCisgICAgICAsIG91dFRyYW5zID0gbworICAgICAgLCBjbGllbnRUeXBlID0gY1R5cGUKKyAgICAgICwgcHJvdG9jb2xUeXBlID0gcGlkCisgICAgICAsIGhlYWRlcnMgPSBoCisgICAgICAsIHdyaXRlSGVhZGVycyA9IE1hcC5lbXB0eQorICAgICAgLCB0cmFuc2Zvcm1zID0gdHJhbnMKKyAgICAgICwgd3JpdGVUcmFuc2Zvcm1zID0gW10KKyAgICAgIH0KKworaXNGcmFtZWQgdCA9ICgvPSBVbmZyYW1lZCkgPCQ+IHJlYWRJT1JlZiAoY2xpZW50VHlwZSB0KQorCityZWFkRnJhbWUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCb29sCityZWFkRnJhbWUgdCA9IGRvCisgIGxldCBpbnB1dCA9IGluVHJhbnMgdAorICBsZXQgckJ1ZiA9IHJlYWRCdWZmZXIgdAorICBsZXQgY1R5cGUgPSBjbGllbnRUeXBlIHQKKyAgbHN6IDwtIHRSZWFkIGlucHV0IDQKKyAgbGV0IHN6ID0gTEJTLnRvU3RyaWN0IGxzegorICBjYXNlIFAucGFyc2VPbmx5IFAuZW5kT2ZJbnB1dCBzeiBvZgorICAgIFJpZ2h0IF8gLT4gZG8gcmV0dXJuIEZhbHNlCisgICAgTGVmdCBfIC0+IGRvCisgICAgICBjYXNlIHBhcnNlQmluYXJ5TWFnaWMgc3ogb2YKKyAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgVW5mcmFtZWQKKyAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgIGNhc2UgcGFyc2VDb21wYWN0TWFnaWMgc3ogb2YKKyAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgbHN6CisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgVW5mcmFtZWQKKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRDb21wYWN0CisgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgbGV0IGxlbiA9IEJpbmFyeS5kZWNvZGUgbHN6IDo6IEludDMyCisgICAgICAgICAgICAgIGxidWYgPC0gdFJlYWRBbGwgaW5wdXQgJCBmcm9tSW50ZWdyYWwgbGVuCisgICAgICAgICAgICAgIGxldCBidWYgPSBMQlMudG9TdHJpY3QgbGJ1ZgorICAgICAgICAgICAgICBjYXNlIHBhcnNlQmluYXJ5TWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQmluYXJ5CisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VDb21wYWN0TWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiBsYnVmCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZUhlYWRlck1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgZmxhZ3MgLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIGJvZHkpID0gZXh0cmFjdEhlYWRlciBidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBIZWFkZXJDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSGVhZGVyIHQgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPC0gdW50cmFuc2Zvcm0gdCBib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIExCUy5mcm9tU3RyaWN0ICQgcGF5bG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgTGVmdCBfIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IHVua29ud24gY2xpZW50IHR5cGUiIFRFX1VOS05PV04KKworcGFyc2VCaW5hcnlNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDgwICo+IFAud29yZDggMHgwMSAqPiBQLndvcmQ4IDB4MDAgKj4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MiAqPiBQLnNhdGlzZnkgKFxiIC0+IGIgLiYuIDB4MWYgPT0gMHgwMSkKK3BhcnNlSGVhZGVyTWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHgwZiAqPiBQLndvcmQ4IDB4ZmYgKj4gKFAuY291bnQgMiBQLmFueVdvcmQ4KQorCitwYXJzZUkzMiA6OiBQLlBhcnNlciBJbnQzMgorcGFyc2VJMzIgPSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CitwYXJzZUkxNiA6OiBQLlBhcnNlciBJbnQxNgorcGFyc2VJMTYgPSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCisKK2V4dHJhY3RIZWFkZXIgOjogQlMuQnl0ZVN0cmluZyAtPiAoSW50MTYsIEludDMyLCBCUy5CeXRlU3RyaW5nLCBCUy5CeXRlU3RyaW5nKQorZXh0cmFjdEhlYWRlciBicyA9CisgIGNhc2UgUC5wYXJzZSBleHRyYWN0SGVhZGVyXyBicyBvZgorICAgIFAuRG9uZSByZW1haW4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlcikgLT4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlciwgcmVtYWluKQorICAgIF8gLT4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogSW52YWxpZCBoZWFkZXIiIFRFX1VOS05PV04KKyAgd2hlcmUKKyAgICBleHRyYWN0SGVhZGVyXyA9IGRvCisgICAgICBtYWdpYyA8LSBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmCisgICAgICBmbGFncyA8LSBwYXJzZUkxNgorICAgICAgc2VxTnVtIDwtIHBhcnNlSTMyCisgICAgICAoaGVhZGVyU2l6ZSA6OiBJbnQpIDwtICgqIDQpIC4gZnJvbUludGVncmFsIDwkPiBwYXJzZUkxNgorICAgICAgaGVhZGVyIDwtIFAudGFrZSBoZWFkZXJTaXplCisgICAgICByZXR1cm4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlcikKKworaGFuZGxlSGVhZGVyIHQgaGVhZGVyID0KKyAgY2FzZSBQLnBhcnNlT25seSBwYXJzZUhlYWRlciBoZWFkZXIgb2YKKyAgICBSaWdodCAocFR5cGUsIHRyYW5zLCBpbmZvKSAtPiBkbworICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIHBUeXBlCisgICAgICB3cml0ZUlPUmVmICh0cmFuc2Zvcm1zIHQpIHRyYW5zCisgICAgICB3cml0ZUlPUmVmIChoZWFkZXJzIHQpIGluZm8KKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisKKworaXcxNiA6OiBJbnQxNiAtPiBXb3JkMTYKK2l3MTYgPSBmcm9tSW50ZWdyYWwKK2l3MzIgOjogSW50MzIgLT4gV29yZDMyCitpdzMyID0gZnJvbUludGVncmFsCit3aTE2IDo6IFdvcmQxNiAtPiBJbnQxNgord2kxNiA9IGZyb21JbnRlZ3JhbAord2kzMiA6OiBXb3JkMzIgLT4gSW50MzIKK3dpMzIgPSBmcm9tSW50ZWdyYWwKKworcGFyc2VIZWFkZXIgOjogUC5QYXJzZXIgKFByb3RvY29sVHlwZSwgW1RyYW5zZm9ybVR5cGVdLCBbKFN0cmluZywgU3RyaW5nKV0pCitwYXJzZUhlYWRlciA9IGRvCisgIHByb3RvY29sVHlwZSA8LSB0b1Byb3RvY29sVHlwZSA8JD4gcGFyc2VWYXJpbnQgd2kxNgorICBudW1UcmFucyA8LSBmcm9tSW50ZWdyYWwgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgdHJhbnMgPC0gcmVwbGljYXRlTSBudW1UcmFucyBwYXJzZVRyYW5zZm9ybQorICBpbmZvIDwtIHBhcnNlSW5mbworICByZXR1cm4gKHByb3RvY29sVHlwZSwgdHJhbnMsIGluZm8pCisKK3RvUHJvdG9jb2xUeXBlIDo6IEludDE2IC0+IFByb3RvY29sVHlwZQordG9Qcm90b2NvbFR5cGUgMCA9IFRCaW5hcnkKK3RvUHJvdG9jb2xUeXBlIDEgPSBUSlNPTgordG9Qcm90b2NvbFR5cGUgMiA9IFRDb21wYWN0CisKK2Zyb21Qcm90b2NvbFR5cGUgOjogUHJvdG9jb2xUeXBlIC0+IEludDE2Citmcm9tUHJvdG9jb2xUeXBlIFRCaW5hcnkgPSAwCitmcm9tUHJvdG9jb2xUeXBlIFRKU09OID0gMQorZnJvbVByb3RvY29sVHlwZSBUQ29tcGFjdCA9IDIKKworcGFyc2VUcmFuc2Zvcm0gOjogUC5QYXJzZXIgVHJhbnNmb3JtVHlwZQorcGFyc2VUcmFuc2Zvcm0gPSB0b1RyYW5zcG9ydFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKworcGFyc2VJbmZvIDo6IFAuUGFyc2VyIFsoU3RyaW5nLCBTdHJpbmcpXQorcGFyc2VJbmZvID0gZG8KKyAgbiA8LSBQLmVpdGhlclAgUC5lbmRPZklucHV0IChwYXJzZVZhcmludCB3aTMyKQorICBjYXNlIG4gb2YKKyAgICBMZWZ0IF8gLT4gcmV0dXJuIFtdCisgICAgUmlnaHQgbjAgLT4KKyAgICAgIHJlcGxpY2F0ZU0gKGZyb21JbnRlZ3JhbCBuMCkgJCBkbworICAgICAgICBrbGVuIDwtIHBhcnNlVmFyaW50IHdpMTYKKyAgICAgICAgayA8LSBQLnRha2UgJCBmcm9tSW50ZWdyYWwga2xlbgorICAgICAgICB2bGVuIDwtIHBhcnNlVmFyaW50IHdpMTYKKyAgICAgICAgdiA8LSBQLnRha2UgJCBmcm9tSW50ZWdyYWwgdmxlbgorICAgICAgICByZXR1cm4gKEMudW5wYWNrIGssIEMudW5wYWNrIHYpCisKK3BhcnNlU3RyaW5nIDo6IFAuUGFyc2VyIEJTLkJ5dGVTdHJpbmcKK3BhcnNlU3RyaW5nID0gcGFyc2VWYXJpbnQgd2kzMiA+Pj0gKFAudGFrZSAuIGZyb21JbnRlZ3JhbCkKKworYnVpbGRIZWFkZXIgOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCLkJ1aWxkZXIKK2J1aWxkSGVhZGVyIHQgPSBkbworICBwVHlwZSA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBsZXQgcElkID0gYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbVByb3RvY29sVHlwZSBwVHlwZQorICBsZXQgaGVhZGVyQ29udGVudCA9IHBJZCA8PiAoYnVpbGRUcmFuc2Zvcm1zIHQpIDw+IChidWlsZEluZm8gdCkKKyAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggJCBCLnRvTGF6eUJ5dGVTdHJpbmcgaGVhZGVyQ29udGVudAorICAtLSBUT0RPOiBsZW5ndGggbGltaXQgY2hlY2sKKyAgbGV0IHBhZGRpbmcgPSBtY29uY2F0ICQgcmVwbGljYXRlIChtb2QgbGVuIDQpICQgQi53b3JkOCAwCisgIGxldCBjb2RlZExlbiA9IEIuaW50MTZCRSAoZnJvbUludGVncmFsICQgKHF1b3QgKGxlbiAtIDEpIDQpICsgMSkKKyAgbGV0IGZsYWdzID0gMAorICBsZXQgc2VxTnVtID0gMAorICByZXR1cm4gJCBCLmludDE2QkUgMHgwZmZmIDw+IEIuaW50MTZCRSBmbGFncyA8PiBCLmludDMyQkUgc2VxTnVtIDw+IGNvZGVkTGVuIDw+IGhlYWRlckNvbnRlbnQgPD4gcGFkZGluZworCitidWlsZFRyYW5zZm9ybXMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCLkJ1aWxkZXIKKy0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorYnVpbGRUcmFuc2Zvcm1zIHQgPQorICBsZXQgdHJhbnMgPSB3cml0ZVRyYW5zZm9ybXMgdCBpbgorICAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuZ3RoIHRyYW5zKSA8PgorICAobWNvbmNhdCAkIG1hcCAoYnVpbGRWYXJpbnQgLiBpdzE2IC4gZnJvbVRyYW5zcG9ydFR5cGUpIHRyYW5zKQorCitidWlsZEluZm8gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCLkJ1aWxkZXIKK2J1aWxkSW5mbyB0ID0KKyAgbGV0IGggPSBNYXAuYXNzb2NzICQgd3JpdGVIZWFkZXJzIHQgaW4KKyAgLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CisgIGNhc2UgbGVuZ3RoIGggb2YKKyAgICAwIC0+IG1lbXB0eQorICAgIGxlbiAtPiAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuKSA8PiAobWNvbmNhdCAkIG1hcCBidWlsZEluZm9FbnRyeSBoKQorICB3aGVyZQorICAgIGJ1aWxkSW5mb0VudHJ5IChrLCB2KSA9IGJ1aWxkVmFyU3RyIGsgPD4gYnVpbGRWYXJTdHIgdgorICAgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICAgIGJ1aWxkVmFyU3RyIHMgPSAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuZ3RoIHMpIDw+IEIuc3RyaW5nOCBzCisKK3RSZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAordFJlc2V0UHJvdG9jb2wgdCA9IGRvCisgIHJCdWYgPC0gcmVhZElPUmVmICQgcmVhZEJ1ZmZlciB0CisgIHdyaXRlSU9SZWYgKGNsaWVudFR5cGUgdCkgSGVhZGVyQ2xpZW50CisgIHJlYWRGcmFtZSB0CisKK3RTZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IFByb3RvY29sVHlwZSAtPiBJTyAoKQordFNldFByb3RvY29sIHQgPSB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkKKwordHJhbnNmb3JtIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gTEJTLkJ5dGVTdHJpbmcgLT4gTEJTLkJ5dGVTdHJpbmcKK3RyYW5zZm9ybSB0IGJzID0KKyAgZm9sZHIgYXBwbHlUcmFuc2Zvcm0gYnMgJCB3cml0ZVRyYW5zZm9ybXMgdAorICB3aGVyZQorICAgIC0tIGFwcGx5VHJhbnNmb3JtIGJzIFpsaWJUcmFuc2Zvcm0gPQorICAgIC0tICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogbm90IGltcGxlbWVudGVkOiBabGliVHJhbnNmb3JtICAiIFRFX1VOS05PV04KKyAgICBhcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK3VudHJhbnNmb3JtIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQlMuQnl0ZVN0cmluZyAtPiBJTyBCUy5CeXRlU3RyaW5nCit1bnRyYW5zZm9ybSB0IGJzID0gZG8KKyAgdHJhbnMgPC0gcmVhZElPUmVmICQgdHJhbnNmb3JtcyB0CisgIHJldHVybiAkIGZvbGRsIHVuYXBwbHlUcmFuc2Zvcm0gYnMgdHJhbnMKKyAgd2hlcmUKKyAgICAtLSB1bmFwcGx5VHJhbnNmb3JtIGJzIFpsaWJUcmFuc2Zvcm0gPQorICAgIC0tICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogbm90IGltcGxlbWVudGVkOiBabGliVHJhbnNmb3JtICAiIFRFX1VOS05PV04KKyAgICB1bmFwcGx5VHJhbnNmb3JtIGJzIF8gPQorICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0iIFRFX1VOS05PV04KKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gVHJhbnNwb3J0IChIZWFkZXJUcmFuc3BvcnQgaSBvKSB3aGVyZQorICB0SXNPcGVuIHQgPSBkbworICAgIHRJc09wZW4gKGluVHJhbnMgdCkKKyAgICB0SXNPcGVuIChvdXRUcmFucyB0KQorCisgIHRDbG9zZSB0ID0gZG8KKyAgICB0Q2xvc2Uob3V0VHJhbnMgdCkKKyAgICB0Q2xvc2UoaW5UcmFucyB0KQorCisgIHRSZWFkIHQgbGVuID0gZG8KKyAgICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICAgIGlmIG5vdCAkIExCUy5udWxsIHJCdWYKKyAgICAgIHRoZW4gZG8KKyAgICAgICAgbGV0IChjb25zdW1lZCwgcmVtYWluKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbGVuKSByQnVmCisgICAgICAgIHdyaXRlSU9SZWYgKHJlYWRCdWZmZXIgdCkgcmVtYWluCisgICAgICAgIHJldHVybiBjb25zdW1lZAorICAgICAgZWxzZSBkbworICAgICAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgICAgICBpZiBub3QgZnJhbWVkCisgICAgICAgICAgdGhlbiB0UmVhZCAoaW5UcmFucyB0KSBsZW4KKyAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICBvayA8LSByZWFkRnJhbWUgdAorICAgICAgICAgICAgaWYgb2sKKyAgICAgICAgICAgICAgdGhlbiB0UmVhZCB0IGxlbgorICAgICAgICAgICAgICBlbHNlIHJldHVybiBMQlMuZW1wdHkKKworICB0UGVlayB0ID0gZG8KKyAgICByQnVmIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0KQorICAgIGlmIG5vdCAkIExCUy5udWxsIHJCdWYKKyAgICAgIHRoZW4gcmV0dXJuICQgSnVzdCAkIExCUy5oZWFkIHJCdWYKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFBlZWsgKGluVHJhbnMgdCkKKyAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICBvayA8LSByZWFkRnJhbWUgdAorICAgICAgICAgICAgaWYgb2sKKyAgICAgICAgICAgICAgdGhlbiB0UGVlayB0CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIE5vdGhpbmcKKworICB0V3JpdGUgdCBidWYgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdAorICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgaWYgZnJhbWVkCisgICAgICB0aGVuIG1vZGlmeUlPUmVmIHdCdWYgKDw+IEIubGF6eUJ5dGVTdHJpbmcgYnVmKQorICAgICAgZWxzZQorICAgICAgICAtLSBUT0RPOiB3aGF0IHNob3VsZCB3ZSBkbyB3aGVuIHN3aXRjaGVkIHRvIHVuZnJhbWVkIGluIHRoZSBtaWRkbGUgPworICAgICAgICB0V3JpdGUob3V0VHJhbnMgdCkgYnVmCisKKyAgdEZsdXNoIHQgPSBkbworICAgIGNUeXBlIDwtIHJlYWRJT1JlZiAkIGNsaWVudFR5cGUgdAorICAgIGNhc2UgY1R5cGUgb2YKKyAgICAgIFVuZnJhbWVkIC0+IHRGbHVzaCAkIG91dFRyYW5zIHQKKyAgICAgIEZyYW1lZCAtPiBmbHVzaEJ1ZmZlciB0IGlkIG1lbXB0eQorICAgICAgSGVhZGVyQ2xpZW50IC0+IGJ1aWxkSGVhZGVyIHQgPj49IGZsdXNoQnVmZmVyIHQgKHRyYW5zZm9ybSB0KQorICAgIHdoZXJlCisgICAgICBmbHVzaEJ1ZmZlciB0IGYgaGVhZGVyID0gZG8KKyAgICAgICAgd0J1ZiA8LSByZWFkSU9SZWYgJCB3cml0ZUJ1ZmZlciB0CisgICAgICAgIHdyaXRlSU9SZWYgKHdyaXRlQnVmZmVyIHQpIG1lbXB0eQorICAgICAgICBsZXQgcGF5bG9hZCA9IEIudG9MYXp5Qnl0ZVN0cmluZyAoaGVhZGVyIDw+IHdCdWYpCisgICAgICAgIHRXcml0ZSAob3V0VHJhbnMgdCkgJCBCaW5hcnkuZW5jb2RlIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHBheWxvYWQgOjogSW50MzIpCisgICAgICAgIHRXcml0ZSAob3V0VHJhbnMgdCkgJCBmIHBheWxvYWQKKyAgICAgICAgdEZsdXNoIChvdXRUcmFucyB0KQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocwppbmRleCBiMWIwOTgyLi5lZGViMzIwIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocwpAQCAtMjIsMTggKzIyLDE2IEBACiAgICAgKCBtb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydAogICAgICwgSHR0cENsaWVudCAoLi4pCiAgICAgLCBvcGVuSHR0cENsaWVudAotICAgICkgd2hlcmUKKykgd2hlcmUKIAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyCiBpbXBvcnQgTmV0d29yay5VUkkKIGltcG9ydCBOZXR3b3JrLkhUVFAgaGlkaW5nIChwb3J0LCBob3N0KQogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAobGlmdE0pCiBpbXBvcnQgRGF0YS5NYXliZSAoZnJvbUp1c3QpCi1pbXBvcnQgRGF0YS5Nb25vaWQgKG1hcHBlbmQsIG1lbXB0eSkKK2ltcG9ydCBEYXRhLk1vbm9pZCAobWVtcHR5KQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICh0aHJvdykKLWltcG9ydCBDb250cm9sLkNvbmN1cnJlbnQuTVZhcgotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeS5CdWlsZGVyIGFzIEIKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiAKIApAQCAtNzMsMTEgKzcxLDEzIEBACiAKIGluc3RhbmNlIFRyYW5zcG9ydCBIdHRwQ2xpZW50IHdoZXJlCiAKLSAgICB0Q2xvc2UgID0gY2xvc2UgLiBoc3RyZWFtCisgICAgdENsb3NlID0gY2xvc2UgLiBoc3RyZWFtCiAKLSAgICB0UmVhZCBoY2xpZW50IG4gPSByZWFkQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIG4KKyAgICB0UGVlayA9IHBlZWtCdWYgLiByZWFkQnVmZmVyCiAKLSAgICB0V3JpdGUgaGNsaWVudCA9IHdyaXRlQnVmICh3cml0ZUJ1ZmZlciBoY2xpZW50KQorICAgIHRSZWFkID0gcmVhZEJ1ZiAuIHJlYWRCdWZmZXIKKworICAgIHRXcml0ZSA9IHdyaXRlQnVmIC4gd3JpdGVCdWZmZXIKIAogICAgIHRGbHVzaCBoY2xpZW50ID0gZG8KICAgICAgIGJvZHkgPC0gZmx1c2hCdWYgJCB3cml0ZUJ1ZmZlciBoY2xpZW50CkBAIC05MiwzNiArOTIsMTAgQEAKIAogICAgICAgcmVzIDwtIHNlbmRIVFRQIChoc3RyZWFtIGhjbGllbnQpIHJlcXVlc3QKICAgICAgIGNhc2UgcmVzIG9mCi0gICAgICAgIFJpZ2h0IHJlc3BvbnNlIC0+IGRvCi0gICAgICAgICAgICBmaWxsQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIChyc3BCb2R5IHJlc3BvbnNlKQotICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgUmlnaHQgcmVzcG9uc2UgLT4KKyAgICAgICAgICBmaWxsQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIChyc3BCb2R5IHJlc3BvbnNlKQorICAgICAgICBMZWZ0IF8gLT4KICAgICAgICAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJUSHR0cENvbm5lY3Rpb246IEhUVFAgZmFpbHVyZSBmcm9tIHNlcnZlciIgVEVfVU5LTk9XTgogICAgICAgcmV0dXJuICgpCiAKICAgICB0SXNPcGVuIF8gPSByZXR1cm4gVHJ1ZQotLS0gTWluaSBJTyBidWZmZXJzCi0KLXR5cGUgV3JpdGVCdWZmZXIgPSBNVmFyIChCLkJ1aWxkZXIpCi0KLW5ld1dyaXRlQnVmZmVyIDo6IElPIFdyaXRlQnVmZmVyCi1uZXdXcml0ZUJ1ZmZlciA9IG5ld01WYXIgbWVtcHR5Ci0KLXdyaXRlQnVmIDo6IFdyaXRlQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCi13cml0ZUJ1ZiB3IHMgPSBtb2RpZnlNVmFyXyB3ICQgcmV0dXJuIC4gKFxidWlsZGVyIC0+Ci0gICAgICAgICAgICAgICAgIGJ1aWxkZXIgYG1hcHBlbmRgIChCLmZyb21MYXp5Qnl0ZVN0cmluZyBzKSkKLQotZmx1c2hCdWYgOjogV3JpdGVCdWZmZXIgLT4gSU8gKExCUy5CeXRlU3RyaW5nKQotZmx1c2hCdWYgdyA9IEIudG9MYXp5Qnl0ZVN0cmluZyBgbGlmdE1gIHN3YXBNVmFyIHcgbWVtcHR5Ci0KLQotdHlwZSBSZWFkQnVmZmVyID0gTVZhciAoTEJTLkJ5dGVTdHJpbmcpCi0KLW5ld1JlYWRCdWZmZXIgOjogSU8gUmVhZEJ1ZmZlcgotbmV3UmVhZEJ1ZmZlciA9IG5ld01WYXIgbWVtcHR5Ci0KLWZpbGxCdWYgOjogUmVhZEJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQotZmlsbEJ1ZiByIHMgPSBzd2FwTVZhciByIHMgPj4gcmV0dXJuICgpCi0KLXJlYWRCdWYgOjogUmVhZEJ1ZmZlciAtPiBJbnQgLT4gSU8gKExCUy5CeXRlU3RyaW5nKQotcmVhZEJ1ZiByIG4gPSBtb2RpZnlNVmFyIHIgJCByZXR1cm4gLiBmbGlwUGFpciAuIExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikKLSAgICB3aGVyZSBmbGlwUGFpciAoYSwgYikgPSAoYiwgYSkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJkN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCkBAIC0wLDAgKzEsNjkgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlcgorICAgICAgICggV3JpdGVCdWZmZXIKKyAgICAgICAsIG5ld1dyaXRlQnVmZmVyCisgICAgICAgLCB3cml0ZUJ1ZgorICAgICAgICwgZmx1c2hCdWYKKyAgICAgICAsIFJlYWRCdWZmZXIKKyAgICAgICAsIG5ld1JlYWRCdWZmZXIKKyAgICAgICAsIGZpbGxCdWYKKyAgICAgICAsIHJlYWRCdWYKKyAgICAgICAsIHBlZWtCdWYKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5Xb3JkCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK3R5cGUgV3JpdGVCdWZmZXIgPSBJT1JlZiBCdWlsZGVyCit0eXBlIFJlYWRCdWZmZXIgPSBJT1JlZiBMQlMuQnl0ZVN0cmluZworCituZXdXcml0ZUJ1ZmZlciA6OiBJTyBXcml0ZUJ1ZmZlcgorbmV3V3JpdGVCdWZmZXIgPSBuZXdJT1JlZiBtZW1wdHkKKword3JpdGVCdWYgOjogV3JpdGVCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKK3dyaXRlQnVmIHcgcyA9IG1vZGlmeUlPUmVmIHcgKCA8PiBsYXp5Qnl0ZVN0cmluZyBzKQorCitmbHVzaEJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBJTyBMQlMuQnl0ZVN0cmluZworZmx1c2hCdWYgdyA9IGRvCisgIGJ1ZiA8LSByZWFkSU9SZWYgdworICB3cml0ZUlPUmVmIHcgbWVtcHR5CisgIHJldHVybiAkIHRvTGF6eUJ5dGVTdHJpbmcgYnVmCisKK25ld1JlYWRCdWZmZXIgOjogSU8gUmVhZEJ1ZmZlcgorbmV3UmVhZEJ1ZmZlciA9IG5ld0lPUmVmIG1lbXB0eQorCitmaWxsQnVmIDo6IFJlYWRCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKK2ZpbGxCdWYgPSB3cml0ZUlPUmVmCisKK3JlYWRCdWYgOjogUmVhZEJ1ZmZlciAtPiBJbnQgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKK3JlYWRCdWYgciBuID0gZG8KKyAgYnMgPC0gcmVhZElPUmVmIHIKKyAgbGV0IChoZCwgdGwpID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKSBicworICB3cml0ZUlPUmVmIHIgdGwKKyAgcmV0dXJuIGhkCisKK3BlZWtCdWYgOjogUmVhZEJ1ZmZlciAtPiBJTyAoTWF5YmUgV29yZDgpCitwZWVrQnVmIHIgPSAoZm1hcCBmc3QgLiBMQlMudW5jb25zKSA8JD4gcmVhZElPUmVmIHIKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCkBAIC0wLDAgKzEsNzcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKKyAgICAgICAoIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAsIE1lbW9yeUJ1ZmZlciguLikKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAorCisKK2RhdGEgTWVtb3J5QnVmZmVyID0gTWVtb3J5QnVmZmVyIHsKKyAgd3JpdGVCdWZmZXIgOjogSU9SZWYgQnVpbGRlciwKKyAgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworfQorCitvcGVuTWVtb3J5QnVmZmVyIDo6IElPIE1lbW9yeUJ1ZmZlcgorb3Blbk1lbW9yeUJ1ZmZlciA9IGRvCisgIHdidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJldHVybiBNZW1vcnlCdWZmZXIgeworICAgIHdyaXRlQnVmZmVyID0gd2J1ZiwKKyAgICByZWFkQnVmZmVyID0gcmJ1ZgorICB9CisKK2luc3RhbmNlIFRyYW5zcG9ydCBNZW1vcnlCdWZmZXIgd2hlcmUKKyAgdElzT3BlbiA9IGNvbnN0ICQgcmV0dXJuIEZhbHNlCisgIHRDbG9zZSAgPSBjb25zdCAkIHJldHVybiAoKQorICB0Rmx1c2ggdHJhbnMgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdHJhbnMKKyAgICB3YiA8LSByZWFkSU9SZWYgd0J1ZgorICAgIG1vZGlmeUlPUmVmIChyZWFkQnVmZmVyIHRyYW5zKSAkIFxyYiAtPiBtYXBwZW5kIHJiICQgdG9MYXp5Qnl0ZVN0cmluZyB3YgorICAgIHdyaXRlSU9SZWYgd0J1ZiBtZW1wdHkKKworICB0UmVhZCBfIDAgPSByZXR1cm4gbWVtcHR5CisgIHRSZWFkIHRyYW5zIG4gPSBkbworICAgIGxldCByYnVmID0gcmVhZEJ1ZmZlciB0cmFucworICAgIHJiIDwtIHJlYWRJT1JlZiByYnVmCisgICAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIKKyAgICBpZiBsZW4gPT0gMAorICAgICAgdGhlbiBkbworICAgICAgICB0Rmx1c2ggdHJhbnMKKyAgICAgICAgcmIyIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykKKyAgICAgICAgaWYgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIyKSA9PSAwCisgICAgICAgICAgdGhlbiByZXR1cm4gbWVtcHR5CisgICAgICAgICAgZWxzZSB0UmVhZCB0cmFucyBuCisgICAgICBlbHNlIGRvCisgICAgICAgIGxldCAocmV0LCByZW1haW4pID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKSByYgorICAgICAgICB3cml0ZUlPUmVmIHJidWYgcmVtYWluCisgICAgICAgIHJldHVybiByZXQKKworICB0UGVlayB0cmFucyA9IChmbWFwIGZzdCAuIExCUy51bmNvbnMpIDwkPiByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpCisKKyAgdFdyaXRlIHRyYW5zIHYgPSBkbworICAgIG1vZGlmeUlPUmVmICh3cml0ZUJ1ZmZlciB0cmFucykgKDw+IGxhenlCeXRlU3RyaW5nIHYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjAwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocwpAQCAtMCwwICsxLDEzMCBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1vcnBoYW5zICMtfQorCittb2R1bGUgVGhyaWZ0LlR5cGVzIHdoZXJlCisKK2ltcG9ydCBEYXRhLkZvbGRhYmxlIChmb2xkbCcpCitpbXBvcnQgRGF0YS5IYXNoYWJsZSAoIEhhc2hhYmxlLCBoYXNoV2l0aFNhbHQgKQoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeQoraW1wb3J0IFRlc3QuUXVpY2tDaGVjay5HZW4gKGVsZW1lbnRzKQoraW1wb3J0IERhdGEuVGV4dC5MYXp5IChUZXh0KQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKKworaW5zdGFuY2UgKEhhc2hhYmxlIGEpID0+IEhhc2hhYmxlIChWZWN0b3IuVmVjdG9yIGEpIHdoZXJlCisgIGhhc2hXaXRoU2FsdCA9IFZlY3Rvci5mb2xkbCcgaGFzaFdpdGhTYWx0CisKKwordHlwZSBUeXBlTWFwID0gTWFwLkhhc2hNYXAgSW50MTYgKFRleHQsIFRocmlmdFR5cGUpCisKK2RhdGEgVGhyaWZ0VmFsID0gVFN0cnVjdCAoTWFwLkhhc2hNYXAgSW50MTYgKFRleHQsIFRocmlmdFZhbCkpCisgICAgICAgICAgICAgICB8IFRNYXAgVGhyaWZ0VHlwZSBUaHJpZnRUeXBlIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorICAgICAgICAgICAgICAgfCBUTGlzdCBUaHJpZnRUeXBlIFtUaHJpZnRWYWxdCisgICAgICAgICAgICAgICB8IFRTZXQgVGhyaWZ0VHlwZSBbVGhyaWZ0VmFsXQorICAgICAgICAgICAgICAgfCBUQm9vbCBCb29sCisgICAgICAgICAgICAgICB8IFRCeXRlIEludDgKKyAgICAgICAgICAgICAgIHwgVEkxNiBJbnQxNgorICAgICAgICAgICAgICAgfCBUSTMyIEludDMyCisgICAgICAgICAgICAgICB8IFRJNjQgSW50NjQKKyAgICAgICAgICAgICAgIHwgVFN0cmluZyBMQlMuQnl0ZVN0cmluZworICAgICAgICAgICAgICAgfCBUQmluYXJ5IExCUy5CeXRlU3RyaW5nCisgICAgICAgICAgICAgICB8IFREb3VibGUgRG91YmxlCisgICAgICAgICAgICAgICAgIGRlcml2aW5nIChFcSwgU2hvdykKKworLS0gSW5mb3JtYXRpb24gaXMgbmVlZGVkIGhlcmUgZm9yIGNvbGxlY3Rpb24gdHlwZXMgKGllIFRfU1RSVUNULCBUX01BUCwKKy0tIFRfTElTVCwgYW5kIFRfU0VUKSBzbyB0aGF0IHdlIGtub3cgd2hhdCB0eXBlcyB0aG9zZSBjb2xsZWN0aW9ucyBhcmUKKy0tIHBhcmFtZXRlcml6ZWQgYnkuICBJbiBtb3N0IHByb3RvY29scywgdGhpcyBjYW5ub3QgYmUgZGlzY2VybmVkIGRpcmVjdGx5CistLSBmcm9tIHRoZSBkYXRhIGJlaW5nIHJlYWQuCitkYXRhIFRocmlmdFR5cGUKKyAgICA9IFRfU1RPUAorICAgIHwgVF9WT0lECisgICAgfCBUX0JPT0wKKyAgICB8IFRfQllURQorICAgIHwgVF9ET1VCTEUKKyAgICB8IFRfSTE2CisgICAgfCBUX0kzMgorICAgIHwgVF9JNjQKKyAgICB8IFRfU1RSSU5HCisgICAgfCBUX0JJTkFSWQorICAgIHwgVF9TVFJVQ1QgVHlwZU1hcAorICAgIHwgVF9NQVAgVGhyaWZ0VHlwZSBUaHJpZnRUeXBlCisgICAgfCBUX1NFVCBUaHJpZnRUeXBlCisgICAgfCBUX0xJU1QgVGhyaWZ0VHlwZQorICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdyApCisKKy0tIE5PVEU6IHdoZW4gdXNpbmcgdG9FbnVtIGluZm9ybWF0aW9uIGFib3V0IHBhcmFtZXRpemVkIHR5cGVzIGlzIE5PVCBwcmVzZXJ2ZWQuCistLSBUaGlzIGRlc2lnbiBjaG9pY2UgaXMgY29uc2lzdGVudCB3b3RoIHRoZSBUaHJpZnQgaW1wbGVtZW50YXRpb24gaW4gb3RoZXIKKy0tIGxhbmd1YWdlcworaW5zdGFuY2UgRW51bSBUaHJpZnRUeXBlIHdoZXJlCisgICAgZnJvbUVudW0gVF9TVE9QICAgICAgID0gMAorICAgIGZyb21FbnVtIFRfVk9JRCAgICAgICA9IDEKKyAgICBmcm9tRW51bSBUX0JPT0wgICAgICAgPSAyCisgICAgZnJvbUVudW0gVF9CWVRFICAgICAgID0gMworICAgIGZyb21FbnVtIFRfRE9VQkxFICAgICA9IDQKKyAgICBmcm9tRW51bSBUX0kxNiAgICAgICAgPSA2CisgICAgZnJvbUVudW0gVF9JMzIgICAgICAgID0gOAorICAgIGZyb21FbnVtIFRfSTY0ICAgICAgICA9IDEwCisgICAgZnJvbUVudW0gVF9TVFJJTkcgICAgID0gMTEKKyAgICBmcm9tRW51bSBUX0JJTkFSWSAgICAgPSAxMQorICAgIGZyb21FbnVtIChUX1NUUlVDVCBfKSA9IDEyCisgICAgZnJvbUVudW0gKFRfTUFQIF8gXykgID0gMTMKKyAgICBmcm9tRW51bSAoVF9TRVQgXykgICAgPSAxNAorICAgIGZyb21FbnVtIChUX0xJU1QgXykgICA9IDE1CisKKyAgICB0b0VudW0gMCAgPSBUX1NUT1AKKyAgICB0b0VudW0gMSAgPSBUX1ZPSUQKKyAgICB0b0VudW0gMiAgPSBUX0JPT0wKKyAgICB0b0VudW0gMyAgPSBUX0JZVEUKKyAgICB0b0VudW0gNCAgPSBUX0RPVUJMRQorICAgIHRvRW51bSA2ICA9IFRfSTE2CisgICAgdG9FbnVtIDggID0gVF9JMzIKKyAgICB0b0VudW0gMTAgPSBUX0k2NAorICAgIHRvRW51bSAxMSA9IFRfU1RSSU5HCisgICAgLS0gdG9FbnVtIDExID0gVF9CSU5BUlkKKyAgICB0b0VudW0gMTIgPSBUX1NUUlVDVCBNYXAuZW1wdHkKKyAgICB0b0VudW0gMTMgPSBUX01BUCBUX1ZPSUQgVF9WT0lECisgICAgdG9FbnVtIDE0ID0gVF9TRVQgVF9WT0lECisgICAgdG9FbnVtIDE1ID0gVF9MSVNUIFRfVk9JRAorICAgIHRvRW51bSB0ID0gZXJyb3IgJCAiSW52YWxpZCBUaHJpZnRUeXBlICIgKysgc2hvdyB0CisKK2RhdGEgTWVzc2FnZVR5cGUKKyAgICA9IE1fQ0FMTAorICAgIHwgTV9SRVBMWQorICAgIHwgTV9FWENFUFRJT04KKyAgICB8IE1fT05FV0FZCisgICAgICBkZXJpdmluZyAoIEVxLCBTaG93ICkKKworaW5zdGFuY2UgRW51bSBNZXNzYWdlVHlwZSB3aGVyZQorICAgIGZyb21FbnVtIE1fQ0FMTCAgICAgID0gIDEKKyAgICBmcm9tRW51bSBNX1JFUExZICAgICA9ICAyCisgICAgZnJvbUVudW0gTV9FWENFUFRJT04gPSAgMworICAgIGZyb21FbnVtIE1fT05FV0FZICAgID0gIDQKKworICAgIHRvRW51bSAxID0gTV9DQUxMCisgICAgdG9FbnVtIDIgPSBNX1JFUExZCisgICAgdG9FbnVtIDMgPSBNX0VYQ0VQVElPTgorICAgIHRvRW51bSA0ID0gTV9PTkVXQVkKKyAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgTWVzc2FnZVR5cGUgIiArKyBzaG93IHQKKworaW5zdGFuY2UgQXJiaXRyYXJ5IE1lc3NhZ2VUeXBlIHdoZXJlCisgIGFyYml0cmFyeSA9IGVsZW1lbnRzIFtNX0NBTEwsIE1fUkVQTFksIE1fRVhDRVBUSU9OLCBNX09ORVdBWV0KZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMgYi9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTJmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzCkBAIC0wLDAgKzEsOTEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgQmluYXJ5U3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgQworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQorCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQmluYXJ5UHJvdG9jb2wiICQgZG8KKyAgICBkZXNjcmliZSAiZG91YmxlIiAkIGRvCisgICAgICBpdCAid3JpdGVzIGluIGJpZyBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IDIgKiogNTMKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVERvdWJsZSB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyA4CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYFs2NywgNjQsIDAsIDAsIDAsIDAsIDAsIDBdCisKKyAgICAgIGl0ICJyZWFkcyBpbiBiaWcgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSBMQlMucGFjayBbNjcsIDY0LCAwLCAwLCAwLCAwLCAwLCAwXQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyBiaW4KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFREb3VibGUgJCAyICoqIDUzKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFREb3VibGUgdmFsCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFREb3VibGUgdmFsKQorCisgICAgZGVzY3JpYmUgInN0cmluZyIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICBsZXQgdmFsID0gQy5wYWNrICJhYWEiCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgNworICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzAsIDAsIDAsIDMsIDk3LCA5NywgOTddCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFswLCAwLCAwLCAzLCA0MiwgNDMsIDQ0XQorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBMQlMucGFjayBbMCwgMCwgMCwgMywgNDIsIDQzLCA0NF0KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMgYi9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQwZTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMKQEAgLTAsMCArMSw4MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBDb21wYWN0U3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJDb21wYWN0UHJvdG9jb2wiICQgZG8KKyAgICBkZXNjcmliZSAiZG91YmxlIiAkIGRvCisgICAgICBpdCAid3JpdGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IDIgKiogNTMKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFREb3VibGUgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWRBbGwgdHJhbnMgOAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWBbMCwgMCwgMCwgMCwgMCwgMCwgNjQsIDY3XQorCisgICAgICBpdCAicmVhZHMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgYmluID0gTEJTLnBhY2sgWzAsIDAsIDAsIDAsIDAsIDAsIDY0LCA2N10KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIGJpbgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVERvdWJsZSAkIDIgKiogNTMpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFREb3VibGUgdmFsCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFREb3VibGUgdmFsKQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzMsIDQyLCA0MywgNDRdCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBMQlMucGFjayBbMywgNDIsIDQzLCA0NF0KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzIGIvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyYzgyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzCkBAIC0wLDAgKzEsMjI1IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIEpTT05TcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBDCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgorCit0U3RyaW5nIDo6IFtDaGFyXSAtPiBUaHJpZnRWYWwKK3RTdHJpbmcgPSBUU3RyaW5nIC4gQy5wYWNrCisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJKU09OUHJvdG9jb2wiICQgZG8KKyAgICBkZXNjcmliZSAiYm9vbCIgJCBkbworICAgICAgaXQgIndyaXRlcyB0cnVlIGFzIDEiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IFRydWUKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCb29sIHZhbCkKKyAgICAgICAgYmluIDwtdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWycxJ10KKworICAgICAgaXQgIndyaXRlcyBmYWxzZSBhcyAwIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBGYWxzZQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJvb2wgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWycwJ10KKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVEJvb2wgdmFsCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byBUX0JPT0wKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQm9vbCB2YWwpCisKKyAgICBkZXNjcmliZSAic3RyaW5nIiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nICQgQy5wYWNrICJcImEiKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIlwiXFxcImFcIiIKKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJcXFwiYVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TVFJJTkcpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU3RyaW5nICQgQy5wYWNrICJcImEiKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgJCBDLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfU1RSSU5HKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRTdHJpbmcgJCBDLnBhY2sgdmFsKQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyB3aXRoIHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiXCJBUT09XCIiCisKKyAgICAgIGl0ICJyZWFkcyB3aXRoIHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIkFRPT1cIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKworICAgICAgaXQgInJlYWRzIHdpdGhvdXQgcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiQVFcIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKKyAgICBkZXNjcmliZSAibGlzdCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSBsaXN0IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTGlzdCBUX0JZVEUgW10pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiW1wiaThcIiwwXSIKKworICAgICAgaXQgInJlYWRzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJ3cml0ZXMgc2luZ2xlIGVsZW1lbnQiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRMaXN0IFRfQllURSBbVEJ5dGUgMF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiW1wiaThcIiwxLDBdIgorCisgICAgICBpdCAicmVhZHMgc2luZ2xlIGVsZW1lbnQiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMSwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtUQnl0ZSAwXSkKKworICAgICAgaXQgInJlYWRzIGVsZW1lbnRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDIsNDIsIDQzXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtUQnl0ZSA0MiwgVEJ5dGUgNDNdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVExpc3QgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfTElTVCBUX1NUUklORworICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRMaXN0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorCisgICAgZGVzY3JpYmUgInNldCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFNldCBUX0JZVEUgW10pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiW1wiaThcIiwwXSIKKworICAgICAgaXQgInJlYWRzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtdKQorCisgICAgICBpdCAicmVhZHMgc2luZ2xlIGVsZW1lbnQiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMSwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbVEJ5dGUgMF0pCisKKyAgICAgIGl0ICJyZWFkcyBlbGVtZW50cyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwyLDQyLCA0M10iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW1RCeXRlIDQyLCBUQnl0ZSA0M10pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUU2V0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX1NFVCBUX1NUUklORworICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRTZXQgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisKKyAgICBkZXNjcmliZSAibWFwIiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTWFwIFRfQllURSBUX0JZVEUgW10pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCJbXCJpOFwiLFwiaThcIiwwLHt9XSIKKworICAgICAgaXQgInJlYWRzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLFwiaThcIiwwLHt9XSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX01BUCBUX0JZVEUgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVE1hcCBUX0JZVEUgVF9CWVRFIFtdKQorCisgICAgICBpdCAicmVhZHMgc3RyaW5nLXN0cmluZyIgJCBkbworICAgICAgICBsZXQgYmluID0gIltcInN0clwiLFwic3RyXCIsMix7XCJhXCI6XCIyXCIsXCJiXCI6XCJibGFoXCJ9XSIKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgYmluKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9NQVAgVF9TVFJJTkcgVF9TVFJJTkcpCisgICAgICAgIHZhbGBzaG91bGRCZWAgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgWyh0U3RyaW5nICJhIiwgdFN0cmluZyAiMiIpLCAodFN0cmluZyAiYiIsIHRTdHJpbmcgImJsYWgiKV0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HICQgbWFwIHRvS1YgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX01BUCBUX1NUUklORyBUX1NUUklORworICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgJCBtYXAgdG9LViB2YWwpCisgICAgICAgIHdoZXJlCisgICAgICAgICAgdG9LViB2ID0gKHRTdHJpbmcgdiwgdFN0cmluZyB2KQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9TcGVjLmhzIGIvbGliL2hzL3Rlc3QvU3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM5YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvU3BlYy5ocwpAQCAtMCwwICsxLDM4IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworLS0gT3VyIENJIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGF1dG8gZGlzY292ZXIuCistLSBOZWVkIHRvIGFkZCBidWlsZC10aW1lIFBBVEggdmFyaWFibGUgdG8gaHNwZWMtZGlzY292ZXIgZGlyIGZyb20gQ01ha2UKKy0tIG9yIGluc3RhbGwgaHNwZWMgc3lzdGVtLXdpZGUgZm9yIHRoZSBmb2xsb3dpbmcgdG8gd29yay4KKy0tIHstIyBPUFRJT05TX0dIQyAtRiAtcGdtRiBoc3BlYy1kaXNjb3ZlciAjLX0KKworaW1wb3J0IFRlc3QuSHNwZWMKKworaW1wb3J0IHF1YWxpZmllZCBCaW5hcnlTcGVjCitpbXBvcnQgcXVhbGlmaWVkIENvbXBhY3RTcGVjCitpbXBvcnQgcXVhbGlmaWVkIEpTT05TcGVjCisKK21haW4gOjogSU8gKCkKK21haW4gPSBoc3BlYyBzcGVjCisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJCaW5hcnkiIEJpbmFyeVNwZWMuc3BlYworICBkZXNjcmliZSAiQ29tcGFjdCIgQ29tcGFjdFNwZWMuc3BlYworICBkZXNjcmliZSAiSlNPTiIgSlNPTlNwZWMuc3BlYwpkaWZmIC0tZ2l0IGEvbGliL2hzL3RocmlmdC5jYWJhbCBiL2xpYi9ocy90aHJpZnQuY2FiYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxNTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90aHJpZnQuY2FiYWwKQEAgLTAsMCArMSw4NCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK05hbWU6ICAgICAgICAgICB0aHJpZnQKK1ZlcnNpb246ICAgICAgICAxLjAuMAorQ2FiYWwtVmVyc2lvbjogIDEuMjQKK0xpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKK0NhdGVnb3J5OiAgICAgICBGb3JlaWduCitCdWlsZC1UeXBlOiAgICAgU2ltcGxlCitTeW5vcHNpczogICAgICAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQorSG9tZXBhZ2U6ICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworQnVnLVJlcG9ydHM6ICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUCitNYWludGFpbmVyOiAgICAgZGV2QHRocmlmdC5hcGFjaGUub3JnCitMaWNlbnNlLUZpbGU6ICAgTElDRU5TRQorCitEZXNjcmlwdGlvbjoKKyAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgorCitmbGFnIG5ldHdvcmstdXJpCisgICBkZXNjcmlwdGlvbjogR2V0IE5ldHdvcmsuVVJJIGZyb20gdGhlIG5ldHdvcmstdXJpIHBhY2thZ2UKKyAgIGRlZmF1bHQ6IFRydWUKKworTGlicmFyeQorICBIcy1Tb3VyY2UtRGlyczoKKyAgICBzcmMKKyAgQnVpbGQtRGVwZW5kczoKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBjb250YWluZXJzLCBnaGMtcHJpbSwgYXR0b3BhcnNlYywgYmluYXJ5LCBieXRlc3RyaW5nID49IDAuMTAsIGJhc2U2NC1ieXRlc3RyaW5nLCBoYXNoYWJsZSwgSFRUUCwgdGV4dCwgaHNwZWMtY29yZSA+IDIuNC4wLCB1bm9yZGVyZWQtY29udGFpbmVycyA+PSAwLjIuNiwgdmVjdG9yID49IDAuMTAuMTIuMiwgUXVpY2tDaGVjayA+PSAyLjguMiwgc3BsaXQKKyAgaWYgZmxhZyhuZXR3b3JrLXVyaSkKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNgorICBlbHNlCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgPCAyLjYKKyAgRXhwb3NlZC1Nb2R1bGVzOgorICAgIFRocmlmdCwKKyAgICBUaHJpZnQuQXJiaXRyYXJpZXMKKyAgICBUaHJpZnQuUHJvdG9jb2wsCisgICAgVGhyaWZ0LlByb3RvY29sLkhlYWRlciwKKyAgICBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5LAorICAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAorICAgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICAgIFRocmlmdC5TZXJ2ZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkVtcHR5LAorICAgIFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5LAorICAgIFRocmlmdC5UeXBlcworICBEZWZhdWx0LUxhbmd1YWdlOiBIYXNrZWxsMjAxMAorICBEZWZhdWx0LUV4dGVuc2lvbnM6CisgICAgRGVyaXZlRGF0YVR5cGVhYmxlLAorICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCisgICAgRmxleGlibGVJbnN0YW5jZXMsCisgICAgS2luZFNpZ25hdHVyZXMsCisgICAgTWFnaWNIYXNoLAorICAgIFJhbmtOVHlwZXMsCisgICAgUmVjb3JkV2lsZENhcmRzLAorICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCisgICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKKworVGVzdC1TdWl0ZSBzcGVjCisgIFR5cGU6IGV4aXRjb2RlLXN0ZGlvLTEuMAorICBIcy1Tb3VyY2UtRGlyczogdGVzdAorICBHaGMtT3B0aW9uczogLVdhbGwKKyAgbWFpbi1pczogU3BlYy5ocworICBCdWlsZC1EZXBlbmRzOiBiYXNlLCB0aHJpZnQsIGhzcGVjLCBRdWlja0NoZWNrID49IDIuOC4yLCBieXRlc3RyaW5nID49IDAuMTAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42CisgIERlZmF1bHQtTGFuZ3VhZ2U6IEhhc2tlbGwyMDEwCmRpZmYgLS1naXQgYS9saWIvamF2YS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDY0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWYoQU5EUk9JRCkKKyAgICBzZXQoVEhSSUZUX0FBUiBvdXRwdXRzL2Fhci90aHJpZnQtZGVidWcuYWFyIG91dHB1dHMvYWFyL3RocmlmdC1yZWxlYXNlLmFhcikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAke1RIUklGVF9BQVJ9CisgICAgICAgIENPTU1BTkQgJHtHUkFETEVfRVhFQ1VUQUJMRX0KKyAgICAgICAgICAgIC1wICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYW5kcm9pZCIKKyAgICAgICAgICAgICItUGJ1aWxkRGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9hbmRyb2lkL2J1aWxkIiBhc3NlbWJsZQorICAgICkKKyAgICBhZGRfY3VzdG9tX3RhcmdldCh0aHJpZnRfYWFyIEFMTCBERVBFTkRTICR7VEhSSUZUX0FBUn0pCisKK2Vsc2UoQU5EUk9JRCkKKworICAgIGlmKElTX0FCU09MVVRFICIke0xJQl9JTlNUQUxMX0RJUn0iKQorICAgICAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKKworICAgIGlmKElTX0FCU09MVVRFICIke0RPQ19JTlNUQUxMX0RJUn0iKQorICAgICAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZW5kaWYoKQorCisgICAgYWRkX2N1c3RvbV90YXJnZXQoVGhyaWZ0SmF2YSBBTEwKKyAgICAgICAgQ09NTUVOVCAiQnVpbGRpbmcgSmF2YSBsaWJyYXJ5IHVzaW5nIEdyYWRsZSBXcmFwcGVyIgorICAgICAgICBDT01NQU5EICR7R1JBRExFV19FWEVDVVRBQkxFfSAke0dSQURMRV9PUFRTfSBhc3NlbWJsZQorICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAtUHJlbGVhc2U9dHJ1ZQorICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgKQorCisgICAgIyBFbmFibGUgcHVibGlzaGluZyBmcm9tIENNYWtlIGlmIHRoZSBwdWJsaXNoaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkCisgICAgYWRkX2N1c3RvbV90YXJnZXQoTWF2ZW5QdWJsaXNoCisgICAgICAgIENPTU1FTlQgIlB1Ymxpc2hpbmcgSmF2YSBMaWJyYXJ5IHRvIEFwYWNoZSBNYXZlbiBzdGFnaW5nIgorICAgICAgICBDT01NQU5EICR7R1JBRExFV19FWEVDVVRBQkxFfSAke0dSQURMRV9PUFRTfSBjbGVhbiB1cGxvYWRBcmNoaXZlcworICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAtUHJlbGVhc2U9dHJ1ZQorICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgKQorCisgICAgIyBIb29rIHRoZSBDTWFrZSBpbnN0YWxsIHByb2Nlc3MgdG8gdGhlIHJlc3VsdHMgZnJvbSBtYWtlIEFMTC4KKyAgICAjIFRoaXMgd29ya3MgYmVzdCB3aGVuICdtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0JyBpcyB1c2VkLgorICAgICMgVXNpbmcgc2xhc2ggdG8gZW5kIHRoZSBzb3VyY2UgbG9jYXRpb24gdG8gYXZvaWQgY29weWluZyB0aGUgZGlyZWN0b3J5IHBhdGguCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2xpYnMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICJsaWJ0aHJpZnQtJHt0aHJpZnRfVkVSU0lPTn0uamFyIikKKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvZGVwcy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9JTlNUQUxMX0RJUn0KKyAgICAgICAgICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouamFyIikKKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvZG9jcy9qYXZhZG9jLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0RPQ19JTlNUQUxMX0RJUn0pCisKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfdGVzdChOQU1FIEphdmFUZXN0CisgICAgICAgICAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gdGVzdAorICAgICAgICAgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgICAgICAgICAgICAgICAiLVB0aHJpZnQuY29tcGlsZXI9JHtUSFJJRlRfQ09NUElMRVJ9IgorICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICBlbmRpZigpCitlbmRpZihBTkRST0lEKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvTWFrZWZpbGUuYW0gYi9saWIvamF2YS9NYWtlZmlsZS5hbQppbmRleCBlYTAxOTc4Li42NTk4MWNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9NYWtlZmlsZS5hbQorKysgYi9saWIvamF2YS9NYWtlZmlsZS5hbQpAQCAtMTcsMjIgKzE3LDU2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1FWFRSQV9ESVNUID0gYnVpbGQueG1sIGJ1aWxkLnByb3BlcnRpZXMgc3JjIHRlc3QKLQogZXhwb3J0IENMQVNTUEFUSAogCiBhbGwtbG9jYWw6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBhc3NlbWJsZSBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAogaW5zdGFsbC1leGVjLWhvb2s6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKSBpbnN0YWxsIC1EaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCi0JCS1EaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGluc3RhbGwgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCisJCS1QaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAotIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgogY2xlYW4tbG9jYWw6Ci0JQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKLQkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgY2xlYW4gLS1jb25zb2xlPXBsYWluCiAKLWNoZWNrLWxvY2FsOiBhbGwKLQkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKK3ByZWNyb3NzOiAkKFRIUklGVCkKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgc2hhZG93SmFyIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgogCitjaGVjay1sb2NhbDogJChUSFJJRlQpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHRlc3QgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLVB0aHJpZnQuY29tcGlsZXI9JChUSFJJRlQpIFwKKwkJLS1jb25zb2xlPXBsYWluCisKK21hdmVuLXB1Ymxpc2g6CisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHVwbG9hZEFyY2hpdmVzIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgorCitFWFRSQV9ESVNUID0gXAorCWJ1aWxkLmdyYWRsZSBcCisJZ3JhZGxlLnByb3BlcnRpZXMgXAorCXNldHRpbmdzLmdyYWRsZSBcCisJZ3JhZGxlIFwKKwlncmFkbGV3IFwKKwlncmFkbGV3LmJhdCBcCisJQ01ha2VMaXN0cy50eHQgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWFuZHJvaWQgXAorCXNyYyBcCisJdGVzdCBcCisJY29kZV9xdWFsaXR5X3Rvb2xzIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL1JFQURNRSBiL2xpYi9qYXZhL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4ZDM1MS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1UaHJpZnQgSmF2YSBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIEphdmEKLT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIFRocmlmdCBKYXZhIHNvdXJjZSBpcyBub3QgYnVpbGQgdXNpbmcgdGhlIEdOVSB0b29scywgYnV0IHJhdGhlciB1c2VzCi10aGUgQXBhY2hlIEFudCBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQotZGV2ZWxvcGVycy4KLQotVG8gY29tcGlsZSB0aGUgSmF2YSBUaHJpZnQgbGlicmFyaWVzLCBzaW1wbHkgZG8gdGhlIGZvbGxvd2luZzoKLQotYW50Ci0KLVllcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC5qYXIgaW4gdGhlIGJhc2UgZGlyZWN0b3J5LgotCi1UbyBpbmNsdWRlIFRocmlmdCBpbiB5b3VyIGFwcGxpY2F0aW9ucyBzaW1wbHkgYWRkIGxpYnRocmlmdC5qYXIgdG8geW91cgotY2xhc3NwYXRoLCBvciBpbnN0YWxsIGlmIGluIHlvdXIgZGVmYXVsdCBzeXN0ZW0gY2xhc3NwYXRoIG9mIGNob2ljZS4KLQotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KLQotQXBhY2hlIEFudAotaHR0cDovL2FudC5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvUkVBRE1FLm1kIGIvbGliL2phdmEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWYwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9SRUFETUUubWQKQEAgLTAsMCArMSwxNzYgQEAKK1RocmlmdCBKYXZhIFNvZnR3YXJlIExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworQnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgZnJvbSBzb3VyY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1doZW4gdXNpbmcgYSBDTWFrZSBidWlsZCBmcm9tIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9uIExpbnV4IHRoZQorZWFzaWVzdCB3YXkgdG8gYnVpbGQgYW5kIGluc3RhbGwgaXMgdGhpcyBzaW1wbGUgY29tbWFuZCBsaW5lOgorCisgICAgbWFrZSBhbGwgJiYgc3VkbyBtYWtlIGluc3RhbGwvZmFzdAorCitJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBpbnN0YWxsL2Zhc3Qgb3B0aW9uIHRvIGVsaW1pbmF0ZQordGhlIGF1dG9tYXRpYyByZWJ1aWxkIGJ5IGRlcGVuZGVuY3kgdGhhdCBjYXVzZXMgaXNzdWVzIGJlY2F1c2UKK3RoZSBidWlsZCB0b29saW5nIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBjYWNoZWQgZmlsZXMgaW4gdGhlCit1c2VyIGhvbWUgZGlyZWN0b3J5IGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gSW5zdGVhZCB0aGlzIGJ1aWxkcwordGhlIGNvZGUgaW4gdGhlIGV4cGVjdGVkIGxvY2FsIGJ1aWxkIHRyZWUgYW5kIHRoZW4gdXNlcyBDTWFrZQoraW5zdGFsbCBjb2RlIHRvIGNvcHkgdG8gdGhlIHRhcmdldCBkZXN0aW5hdGlvbi4KKworQnVpbGRpbmcgVGhyaWZ0IHdpdGggR3JhZGxlIHdpdGhvdXQgQ01ha2UvQXV0b2NvbmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBUaHJpZnQgSmF2YSBzb3VyY2UgaXMgbm90IGJ1aWxkIHVzaW5nIHRoZSBHTlUgdG9vbHMsIGJ1dCByYXRoZXIgdXNlcwordGhlIEdyYWRsZSBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQorZGV2ZWxvcGVycy4KKworVG8gY29tcGlsZSB0aGUgSmF2YSBUaHJpZnQgbGlicmFyaWVzLCBzaW1wbHkgZG8gdGhlIGZvbGxvd2luZzoKKworICAgIC4vZ3JhZGxldworCitZZXAsIHRoYXQncyBlYXN5LiBMb29rIGZvciBsaWJ0aHJpZnQtPHZlcnNpb24+LmphciBpbiB0aGUgYnVpbGQvbGlicyBkaXJlY3RvcnkuCisKK1RoZSBkZWZhdWx0IGJ1aWxkIHdpbGwgcnVuIHRoZSB1bml0IHRlc3RzIHdoaWNoIGV4cGVjdCBhIHVzYWJsZQorVGhyaWZ0IGNvbXBpbGVyIHRvIGV4aXN0IG9uIHRoZSBzeXN0ZW0uIFlvdSBoYXZlIHR3byBjaG9pY2VzIGZvcgordGhhdC4KKworKiBCdWlsZCB0aGUgVGhyaWZ0IGV4ZWN1dGFibGUgZnJvbSBzb3VyY2UgYXQgdGhlIGRlZmF1bHQKKyAgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSB0cmVlLiBUaGUgcHJvamVjdCBpcyBjb25maWd1cmVkCisgIHRvIGxvb2sgZm9yIGl0IHRoZXJlLgorKiBJbnN0YWxsIHRoZSBwdWJsaXNoZWQgYmluYXJ5IGRpc3RyaWJ1dGlvbiB0byBoYXZlIFRocmlmdAorICBleGVjdXRhYmxlIGluIGEga25vd24gbG9jYXRpb24gYW5kIGFkZCB0aGUgcGF0aCB0byB0aGUKKyAgfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIGZpbGUgdXNpbmcgdGhlIHByb3BlcnR5IG5hbWUKKyAgInRocmlmdC5jb21waWxlciIuIEZvciBleGFtcGxlIHRoaXMgd291bGQgc2V0IHRoZSBwYXRoIGluCisgIGEgV2luZG93cyBib3ggaWYgVGhyaWZ0IHdhcyBpbnN0YWxsZWQgdW5kZXIgQzpcVGhyaWZ0CisKKyAgICB0aHJpZnQuY29tcGlsZXI9QzovVGhyaWZ0L3RocmlmdC5leGUKKworVG8ganVzdCBidWlsZCB0aGUgbGlicmFyeSB3aXRob3V0IHJ1bm5pbmcgdW5pdCB0ZXN0cyB5b3Ugc2ltcGx5IGRvIHRoaXMuCisKKyAgICAuL2dyYWRsZXcgYXNzZW1ibGUKKworVG8gaW5zdGFsbCB0aGUgbGlicmFyeSBpbiB0aGUgbG9jYWwgTWF2ZW4gcmVwb3NpdG9yeSBsb2NhdGlvbgord2hlcmUgb3RoZXIgTWF2ZW4gb3IgR3JhZGxlIGJ1aWxkcyBjYW4gcmVmZXJlbmNlIGl0IHNpbXBseSBkbyB0aGlzLgorCisgICAgLi9ncmFkbGV3IGluc3RhbGwKKworVGhlIGxpYnJhcnkgd2lsbCBiZSBwbGFjZWQgaW4geW91ciBob21lIGRpcmVjdG9yeSB1bmRlciAubTIvcmVwb3NpdG9yeQorCitUbyBpbmNsdWRlIFRocmlmdCBpbiB5b3VyIGFwcGxpY2F0aW9ucyBzaW1wbHkgYWRkIGxpYnRocmlmdC5qYXIgdG8geW91cgorY2xhc3NwYXRoLCBvciBpbnN0YWxsIGlmIGluIHlvdXIgZGVmYXVsdCBzeXN0ZW0gY2xhc3NwYXRoIG9mIGNob2ljZS4KKworCitCdWlsZCBUaHJpZnQgYmVoaW5kIGEgcHJveHk6CisKKyAgICAuL2dyYWRsZXcgLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldAorCitvciB2aWEKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1qYXZhIEdSQURMRV9PUFRTPSctRGh0dHAucHJveHlIb3N0PW15cHJveHlob3N0IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCAtRGh0dHAucHJveHlVc2VyPXRocmlmdHVzZXIgLURodHRwLnByb3h5UGFzc3dvcmQ9dG9wc2VjcmV0JworCisKK1VuaXQgVGVzdCBIVE1MIFJlcG9ydHMKKz09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGJ1aWxkIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhbiBIVE1MIFVuaXQgVGVzdCByZXBvcnQuIFRoaXMgY2FuIGJlIGZvdW5kCit1bmRlciBidWlsZC9yZXBvcnRzL3Rlc3RzL3Rlc3QvaW5kZXguaHRtbC4gSXQgY2FuIGJlIHZpZXdlZCB3aXRoIGEgYnJvd3NlcgorZGlyZWN0bHkgZnJvbSB0aGF0IGxvY2F0aW9uLgorCisKK0Nsb3ZlciBDb2RlIENvdmVyYWdlIGZvciBUaHJpZnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGJ1aWxkIHdpbGwgb3B0aW9uYWxseSBnZW5lcmF0ZSBDbG92ZXIgQ29kZSBjb3ZlcmFnZSBpZiB0aGUgR3JhZGxlIHByb3BlcnR5CitgY2xvdmVyRW5hYmxlZD10cnVlYCBpcyBzZXQgaW4gfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUKK3ZpYSBgLVBjbG92ZXJFbmFibGVkPXRydWVgLiBUaGUgZ2VuZXJhdGVkIHJlcG9ydCBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIGxvY2F0aW9uCitidWlsZC9yZXBvcnRzL2Nsb3Zlci9odG1sL2luZGV4Lmh0bWwuIEl0IGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGJyb3dzZXIKK2RpcmVjdGx5IGZyb20gdGhhdCBsb2NhdGlvbi4gQWRkaXRpb25hbGx5LCBhIFBERiByZXBvcnQgaXMgZ2VuZXJhdGVkIGFuZCBpcyBmb3VuZAordW5kZXIgdGhlIGxvY2F0aW9uIGJ1aWxkL3JlcG9ydHMvY2xvdmVyL2Nsb3Zlci5wZGYuCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCB3aWxsIGJ1aWxkLCB1bml0IHRlc3QsIGFuZCBnZW5lcmF0ZSBDbG92ZXIgcmVwb3J0czoKKworICAgIC4vZ3JhZGxldyAtUGNsb3ZlckVuYWJsZWQ9dHJ1ZQorCisKK1B1Ymxpc2hpbmcgTWF2ZW4gQXJ0aWZhY3RzIHRvIE1hdmVuIENlbnRyYWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIEF1dG9tYWtlIGJ1aWxkIGdlbmVyYXRlcyBhIE1ha2VmaWxlIHRoYXQgcHJvdmlkZXMgdGhlIGNvcnJlY3QgcGFyYW1ldGVycword2hlbiB5b3UgcnVuIHRoZSBidWlsZCBwcm92aWRlZCB0aGUgY29uZmlndXJlLmFjIGhhcyBiZWVuIHNldCB3aXRoIHRoZSBjb3JyZWN0Cit2ZXJzaW9uIG51bWJlci4gVGhlIEdyYWRsZSBidWlsZCB3aWxsIHJlY2VpdmUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBidWlsZC4KK1RoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIENNYWtlIGJ1aWxkLCB0aGUgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlLmFjIGZpbGUgd2lsbAorYmUgdXNlZCBpZiB5b3UgZXhlY3V0ZSB0aGVzZSBjb21tYW5kczoKKworICAgIG1ha2UgbWF2ZW4tcHVibGlzaCAgIC0tIFRoaXMgaXMgZm9yIGFuIEF1dG9tYWtlIExpbnV4IGJ1aWxkCisgICAgbWFrZSBNYXZlblB1Ymxpc2ggICAgLS0gVGhpcyBpcyBmb3IgYSBDTWFrZSBnZW5lcmF0ZWQgYnVpbGQKKworVGhlIHVwbG9hZEFyY2hpdmVzIHRhc2sgaW4gR3JhZGxlIGlzIHByZWNvbmZpZ3VyZWQgd2l0aCBhbGwgbmVjZXNzYXJ5IGRldGFpbHMKK3RvIHNpZ24gYW5kIHB1Ymxpc2ggdGhlIGFydGlmYWN0cyBmcm9tIHRoZSBidWlsZCB0byB0aGUgQXBhY2hlIE1hdmVuIHN0YWdpbmcKK3JlcG9zaXRvcnkuIFRoZSB0YXNrIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgZXh0ZXJuYWxseSBwcm92aWRlZCBwcm9wZXJ0aWVzIHRvCithdXRoZW50aWNhdGUgdG8gdGhlIHJlcG9zaXRvcnkgYW5kIHNpZ24gdGhlIGFydGlmYWN0cy4gVGhlIHByZWZlcnJlZCBhcHByb2FjaAoraXMgdG8gY3JlYXRlIG9yIGVkaXQgdGhlIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlIGFuZCBhZGQgdGhlIGZvbGxvd2luZworcHJvcGVydGllcyB0byBpdC4KKworICAgICMgU2lnbmluZyBrZXkgaW5mb3JtYXRpb24gZm9yIGFydGlmYWN0cyBQR1Agc2lnbmF0dXJlICh2YWx1ZXMgYXJlIGV4YW1wbGVzKQorICAgIHNpZ25pbmcua2V5SWQ9MjQ4NzVENzMKKyAgICBzaWduaW5nLnBhc3N3b3JkPXNlY3JldAorICAgIHNpZ25pbmcuc2VjcmV0S2V5UmluZ0ZpbGU9L1VzZXJzL21lLy5nbnVwZy9zZWNyaW5nLmdwZworCisgICAgIyBBcGFjaGUgTWF2ZW4gc3RhZ2luZyByZXBvc2l0b3J5IHVzZXIgY3JlZGVudGlhbHMKKyAgICBtYXZlblVzZXI9bWVNeXNlbGZBbmRJCisgICAgbWF2ZW5QYXNzd29yZD1NeVN1cGVyQXdlc29tZVNlY3JldFBhc3N3b3JkCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gbWFudWFsbHkgcHVibGlzaCB1c2luZyB0aGUgR3JhZGxlIGJ1aWxkIGRpcmVjdGx5LgorV2l0aCB0aGUga2V5IGluZm9ybWF0aW9uIGFuZCBjcmVkZW50aWFscyBpbiBwbGFjZSB0aGUgZm9sbG93aW5nIHdpbGwgZ2VuZXJhdGUKK2lmIG5lZWRlZCB0aGUgYnVpbGQgYXJ0aWZhY3RzIGFuZCBwcm9jZWVkIHRvIHB1Ymxpc2ggdGhlIHJlc3VsdHMuCisKKyAgICAuL2dyYWRsZXcgLVByZWxlYXNlPXRydWUgLVB0aHJpZnQudmVyc2lvbj0wLjExLjAgdXBsb2FkQXJjaGl2ZXMKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkgZm9yIHRoZSBNYXZlbiBQdWJsaWNhdGlvbgorYnkgdXNpbmcgYSBHcmFkbGUgcHJvcGVydHksIGZvciBleGFtcGxlIHlvdSBjYW4gcHVibGlzaCBzaWduZWQgSkFSIGZpbGVzIHRvIHlvdXIKK2NvbXBhbnkgaW50ZXJuYWwgc2VydmVyIGlmIHlvdSBhZGQgdGhpcyB0byB0aGUgY29tbWFuZCBsaW5lIG9yIGluIHRoZQorfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIGZpbGUuIFRoZSBVUkwgYmVsb3cgYXNzdW1lcyBhIE5leHVzIFJlcG9zaXRvcnkuCisKKyAgICBtYXZlbi1yZXBvc2l0b3J5LXVybD1odHRwczovL215LmNvbXBhbnkuY29tL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCisKK09yIHRoZSBzYW1lIG9uIHRoZSBjb21tYW5kIGxpbmU6CisKKyAgICAuL2dyYWRsZXcgLVBtYXZlbi1yZXBvc2l0b3J5LXVybD1odHRwczovL215LmNvbXBhbnkuY29tL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yIC1QcmVsZWFzZT10cnVlIC1QdGhyaWZ0LnZlcnNpb249MC4xMS4wIHVwbG9hZEFyY2hpdmVzCisKKworRGVwZW5kZW5jaWVzCis9PT09PT09PT09PT0KKworR3JhZGxlCitodHRwOi8vZ3JhZGxlLm9yZy8KKworIyBCcmVha2luZyBDaGFuZ2VzCisKKyMjIDAuMTIuMAorCitUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBBdXRvRXhwYW5kaW5nQnVmZmVyIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorcHVibGljIHRvIGRlZmF1bHQgKHBhY2thZ2UpIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoaXJkLXBhcnR5CitsaWJyYXJpZXMuCisKK1RoZSBhY2Nlc3MgbW9kaWZpZXIgb2YgdGhlIFNob3J0U3RhY2sgY2xhc3MgaGFzIGJlZW4gY2hhbmdlZCBmcm9tCitwdWJsaWMgdG8gZGVmYXVsdCAocGFja2FnZSkgYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIGFjY2Vzc2libGUgYnkgdGhpcmQtcGFydHkKK2xpYnJhcmllcy4KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUgYi9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTk4NDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCithcHBseSBwbHVnaW46ICdjb20uYW5kcm9pZC5saWJyYXJ5JworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAyMworICAgIGJ1aWxkVG9vbHNWZXJzaW9uICIyMy4wLjEiCisgICAgdXNlTGlicmFyeSAnb3JnLmFwYWNoZS5odHRwLmxlZ2FjeScKKyAgICBzb3VyY2VTZXRzLm1haW4uamF2YSB7CisgICAgICAgIHNyY0RpciAnLi4vc3JjJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YScKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhJworICAgIH0KK30KKworcmVwb3NpdG9yaWVzIHsKKyAgICBtYXZlbkNlbnRyYWwoKQorfQorZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICdvcmcuc2xmNGo6c2xmNGotYXBpOjEuNy4xMycKKyAgICBjb21waWxlICdqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpOjIuNScKKyAgICBjb21waWxlICdvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjb3JlOjQuNC40JworfQorCitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgbWF2ZW5DZW50cmFsKCkKKyAgICB9CisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYW5kcm9pZC50b29scy5idWlsZDpncmFkbGU6MS41LjAnCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUgYi9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWU5N2JlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSBAQAorcm9vdFByb2plY3QubmFtZT0ndGhyaWZ0JwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGliL2phdmEvYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYWJkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHBhY2thZ2U9Im9yZy5hcGFjaGUudGhyaWZ0Ij4KKyAgPGFwcGxpY2F0aW9uIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYnVpbGQuZ3JhZGxlIGIvbGliL2phdmEvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9idWlsZC5ncmFkbGUKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVc2luZyB0aGUgbGVnYWN5IHBsdWdpbiBjbGFzc3BhdGggZm9yIENsb3ZlciBzbyBpdCBjYW4gYmUgbG9hZGVkIG9wdGlvbmFsbHkKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBnb29nbGUoKQorICAgICAgICBqY2VudGVyKCkKKyAgICAgICAgZ3JhZGxlUGx1Z2luUG9ydGFsKCkKKyAgICB9CisKKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5ibXVzY2hrbzpncmFkbGUtY2xvdmVyLXBsdWdpbjoyLjIuMCcKKyAgICB9Cit9CisKK3BsdWdpbnMgeworICAgIGlkICdqYXZhJworICAgIGlkICdtYXZlbicKKyAgICBpZCAnc2lnbmluZycKKyAgICBpZCAnY29tLmdpdGh1Yi5qb2hucmVuZ2VsbWFuLnNoYWRvdycgdmVyc2lvbiAnMi4wLjInCit9CisKK2Rlc2NyaXB0aW9uID0gJ0FwYWNoZSBUaHJpZnQgSmF2YSBMaWJyYXJ5JworCitkZWZhdWx0VGFza3MgJ2J1aWxkJworCisvLyBWZXJzaW9uIGNvbXBvbmVudHMgZm9yIHRoaXMgcHJvamVjdAorZ3JvdXAgPSBwcm9wZXJ0eSgndGhyaWZ0Lmdyb3VwaWQnKQorCisvLyBEcm9wIHRoZSAtZGV2IHN1ZmZpeCwgd2UgdXNlIHRoZSBTTkFQU0hPVCBzdWZmaXggZm9yIG5vbi1yZWxlYXNlIHZlcnNpb25zCitkZWYgcGFyc2VkVmVyc2lvbiA9IHByb3BlcnR5KCd0aHJpZnQudmVyc2lvbicpLnRvU3RyaW5nKCkucmVwbGFjZSgnLWRldicsICcnKQoraWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb2plY3QucmVsZWFzZSkpIHsKKyAgICB2ZXJzaW9uID0gcGFyc2VkVmVyc2lvbgorfSBlbHNlIHsKKyAgICB2ZXJzaW9uID0gcGFyc2VkVmVyc2lvbiArICctU05BUFNIT1QnCit9CisKKy8vIEtlZXBpbmcgdGhlIHJlc3Qgb2YgdGhlIGJ1aWxkIGxvZ2ljIGluIGZ1bmN0aW9uYWwgbmFtZWQgc2NyaXB0cyBmb3IgY2xhcml0eQorYXBwbHkgZnJvbTogJ2dyYWRsZS9lbnZpcm9ubWVudC5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvZ2VuZXJhdGVUZXN0VGhyaWZ0LmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvdW5pdFRlc3RzLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlJwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYnVpbGQucHJvcGVydGllcyBiL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzUwMDUuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXRocmlmdC52ZXJzaW9uPTAuNi4xCi10aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KLSMgTG9jYWwgSW5zdGFsbCBwYXRocwotaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCi1pbnN0YWxsLmphdmFkb2MucGF0aD0ke2luc3RhbGwucGF0aH0KLQotIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucwotbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKLWFwYWNoZS5yZXBvPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3JlbGVhc2VzCi1tdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Ci1tdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKLQotIyBBcGFjaGUgTWF2ZW4gcHVibGlzaCAKLWxpY2Vuc2U9aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIKLW1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCi1tYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcwotCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC54bWwgYi9saWIvamF2YS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZGYwMTQuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLTxwcm9qZWN0IG5hbWU9ImxpYnRocmlmdCIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLiIKLSAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCI+Ci0gIAotICA8ZGVzY3JpcHRpb24+VGhyaWZ0IEJ1aWxkIEZpbGU8L2Rlc2NyaXB0aW9uPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIuLi8uLi8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5hcnRpZmFjdGlkIiB2YWx1ZT0ibGlidGhyaWZ0Ii8+Ci0KLSAgPCEtLSBJbmNsdWRlIHRoZSBiYXNlIHByb3BlcnRpZXMgZmlsZSAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KLQotICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgotCi0gIDxjb25kaXRpb24gcHJvcGVydHk9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufSI+Ci0gICAgPGlzc2V0IHByb3BlcnR5PSJyZWxlYXNlIi8+Ci0gIDwvY29uZGl0aW9uPgotICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LXNuYXBzaG90Ii8+IAotCi0gIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iJHt0aHJpZnQuYXJ0aWZhY3RpZH0tJHt2ZXJzaW9ufSIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9idWlsZCIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9saWIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS90b29scyIvPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLnRlc3QiIGxvY2F0aW9uPSJ0ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9qYXZhZG9jIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50ZXN0LmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS90ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnRocmlmdC5ob21lIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vdGVzdCIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSJnZW4tamF2YSIvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuYmVhbiIgbG9jYXRpb249Imdlbi1qYXZhYmVhbiIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LmphciIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXRlc3QuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tamF2YWRvYy5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS50YXIuZ3oiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS1zcmMudGFyLmd6Ii8+Ci0KLSAgPCEtLSBKdW5pdCBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0IiB2YWx1ZT0icGxhaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGltZW91dCIgdmFsdWU9IjIwMDAwMDAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0vbG9nIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnBvcnQiIHZhbHVlPSI5MDkwIi8+IAotCi0gIDwhLS0gbWF2ZW4gcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBvbS54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iLz4KLQotICA8cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSI+IAotICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLQotICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgIDxwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2Vudi5DTEFTU1BBVEh9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLnRlc3QuZGlyfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXIuZmlsZX0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5qYXIuZmlsZX0iLz4KLSAgPC9wYXRoPgotCi0gIDwhLS0gVGFza3MgLS0+IAotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmluaXQiIHVubGVzcz0iaW5pdC5maW5pc2hlZCI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluaXQuZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic2V0dXAuaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWIuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkLmRpcn0iIHNvdXJjZT0iMS41IiB0YXJnZXQ9IjEuNSIgCi0gICAgZGVidWc9InRydWUiIGNsYXNzcGF0aHJlZj0iY29tcGlsZS5jbGFzc3BhdGgiIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjfSIgZGVzdGRpcj0iJHtqYXZhZG9jLmRpcn0iCi0gICAgICB2ZXJzaW9uPSJ0cnVlIiB3aW5kb3d0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIiBkb2N0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPC9qYXZhZG9jPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXZhZG9jLmphci5maWxlfSIgYmFzZWRpcj0iJHtqYXZhZG9jLmRpcn0iPgotICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICA8L21hbmlmZXN0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9NRVRBLUlORiIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L0xJQ0VOU0UiIHRvZmlsZT0iJHtidWlsZC5kaXJ9L01FVEEtSU5GL0xJQ0VOU0UudHh0Ii8+Ci0gICAgPGNvcHkgZmlsZT0iJHt0aHJpZnQucm9vdH0vTk9USUNFIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9NRVRBLUlORi9OT1RJQ0UudHh0Ii8+Ci0gICAgPGphciBqYXJmaWxlPSIke2phci5maWxlfSI+Ci0gICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdGhyaWZ0LyoqLyouY2xhc3MiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKi50eHQiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICAgIDxmaWxlc2V0IGRpcj0ic3JjIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icGFjay5zcmMiPgotICAgIDx0YXIgZGVzdGZpbGU9IiR7c291cmNlLnRhci5nen0iIGJhc2VkaXI9IiR7c3JjfSIgY29tcHJlc3Npb249Imd6aXAiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJkaXN0LGphdmFkb2MiPgotICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGwucGF0aH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIuIj48aW5jbHVkZSBuYW1lPSIqLmphciIvPjwvZmlsZXNldD4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbC5qYXZhZG9jLnBhdGh9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhZG9jLmRpcn0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbmJlYW59Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0IiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIHRlc3Qgc3VpdGUgY2xhc3NlcyIgZGVwZW5kcz0iZ2VuZXJhdGUsZGlzdCI+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIvPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmJlYW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIi8+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7c3JjLnRlc3R9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIi8+Ci0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMudGVzdH0iIGluY2x1ZGVzPSJsb2c0ai5wcm9wZXJ0aWVzIi8+Ci0gICAgPC9jb3B5PgotICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0Lmphci5maWxlfSIgYmFzZWRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJqdW5pdC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBKVW5pdCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxta2RpciBkaXI9IiR7dGVzdC5sb2cuZGlyfSIvPgotICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InRydWUiIHNob3dvdXRwdXQ9IiR7dGVzdC5vdXRwdXR9IiB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iIAotICAgICAgaGFsdG9uZmFpbHVyZT0idHJ1ZSIgZXJyb3JQcm9wZXJ0eT0idGVzdHMuZmFpbGVkIiBmYWlsdXJlUHJvcGVydHk9InRlc3RzLmZhaWxlZCIKLSAgICAgIGZvcms9InRydWUiIGZvcmttb2RlPSJwZXJUZXN0IiBtYXhtZW1vcnk9IjUxMm0iCi0gICAgPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZXN0LnBvcnQiIHZhbHVlPSIke3Rlc3QucG9ydH0iLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly50cnVzdHN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly5rZXlzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSIke3Rlc3QuanVuaXQub3V0cHV0LmZvcm1hdH0iLz4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdENsaWVudC5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdFNlcnZlci5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QubG9nLmRpcn0iIGlmPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiBpbmNsdWRlcz0iKiovJHt0ZXN0Y2FzZX0uamF2YSIvPgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgICA8ZmFpbCBpZj0idGVzdHMuZmFpbGVkIj5UZXN0cyBmYWlsZWQhPC9mYWlsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcHJlY2F0ZWQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkVxdWFsaXR5VGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuSmF2YUJlYW5zVGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUiIGRlcGVuZHM9Imp1bml0LXRlc3QsZGVwcmVjYXRlZC10ZXN0Ii8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0Y2xpZW50IiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBjbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IHNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdFNlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdG5vbmJsb2NraW5nc2VydmVyIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBub25ibG9ja2luZyBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3ROb25ibG9ja2luZ1NlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgotICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UgLS0+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vVGhyaWZ0VGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vRGVidWdQcm90b1Rlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6YmVhbnMsbm9jYW1lbCAke3Rlc3QudGhyaWZ0LmhvbWV9L0phdmFCZWFuc1Rlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQiIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgotICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgPC90YXJnZXQ+IAotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KLSAgICA8IS0tIERvd25sb2FkIG12biBhbnQgdGFza3MsIGRvd25sb2FkIGRlcGVuZGVuY2llcywgYW5kIHNldHVwIHBvbSBmaWxlIC0tPgotICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9Ii8+Ci0KLSAgICA8IS0tIHJlbW90ZSByZXBvc2l0b3JpZXMgdXNlZCB0byBkb3dubG9hZCBkZXBlbmRlbmNpZXMgZnJvbSAtLT4KLSAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iY2VudHJhbCIgdXJsPSIke212bi5yZXBvfSIvPgotICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KLQotICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKLSAgICAgIGFydGlmYWN0SWQ9IiR7dGhyaWZ0LmFydGlmYWN0aWR9IgotICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIgCi0gICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKLSAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCi0gICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKLSAgICA+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgotICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+Ci0gICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIiAKLSAgICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iCi0gICAgICAgIHVybD0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3RocmlmdCIKLSAgICAgIC8+Ci0gICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgotICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImRyZWlzcyIgbmFtZT0iRGF2aWQgUmVpc3MiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImFkaXR5YSIgbmFtZT0iQWRpdHlhIEFnYXJ3YWwiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1hcmNrIiBuYW1lPSJNYXJjIEt3aWF0a293c2tpIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqd2FuZyIgbmFtZT0iSmFtZXMgV2FuZyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iY3Bpcm8iIG5hbWU9IkNocmlzIFBpcm8iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImJtYXVyZXIiIG5hbWU9IkJlbiBNYXVyZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImtjbGFyayIgbmFtZT0iS2V2aW4gQ2xhcmsiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Impha2UiIG5hbWU9Ikpha2UgTHVjaWFuaSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYnJ5YW5kdXhidXJ5IiBuYW1lPSJCcnlhbiBEdXhidXJ5Ii8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJlc3RldmUiIG5hbWU9IkVzdGV2ZSBGZXJuYW5kZXoiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9InRvZGQiIG5hbWU9IlRvZGQgTGlwY29uIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJnZWVjaG9yYW1hIiBuYW1lPSJBbmRyZXcgTWNHZWFjaGllIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+Ci0KLSAgICAgIDwhLS0gVGhyaWZ0IGRlcGVuZGVuY2llcyBsaXN0IC0tPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiIHZlcnNpb249IjEuNS44Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWxvZzRqMTIiIHZlcnNpb249IjEuNS44Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb21tb25zLWxhbmciIGFydGlmYWN0SWQ9ImNvbW1vbnMtbGFuZyIgdmVyc2lvbj0iMi41Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQiIHZlcnNpb249IjQuNCIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iamF2YXguc2VydmxldCIgYXJ0aWZhY3RJZD0ic2VydmxldC1hcGkiIHZlcnNpb249IjIuNSIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNsaWVudCIgdmVyc2lvbj0iNC4wLjEiLz4KLSAgICA8L2FydGlmYWN0OnBvbT4KLQotICAgIDwhLS0gR2VuZXJhdGUgdGhlIHBvbSBmaWxlIC0tPgotICAgIDxhcnRpZmFjdDp3cml0ZXBvbSBwb21SZWZJZD0icG9tIiBmaWxlPSIke3BvbS54bWx9Ii8+Ci0KLSAgICA8IS0tIERvd25sb2FkIHRoZSBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9ImJ1aWxkLWRlcGVuZGVuY3ktamFycyIgcG9tUmVmSWQ9InBvbSIvPgotCi0gICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9saWIiPgotICAgICAgPGZpbGVzZXQgcmVmaWQ9ImJ1aWxkLWRlcGVuZGVuY3ktamFycyIvPgotICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+Ci0gICAgPC9jb3B5PgotCi0gICAgPHByb3BlcnR5IG5hbWU9Im12bi5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPG1hY3JvZGVmIG5hbWU9InNpZ25BbmREZXBsb3kiPgotICAgIDwhLS0gU2lnbiBhbmQgZGVwbG95IGphcnMgdG8gYXBhY2hlIHJlcG8gLS0+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc2lmaWVyIiBkZWZhdWx0PSIiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2luZyIgZGVmYXVsdD0iamFyIi8+Ci0gICAgPHNlcXVlbnRpYWw+Ci0gICAgICA8YXJ0aWZhY3Q6bXZuIGZvcms9InRydWUiPgotICAgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZ3BnLXBsdWdpbjoxLjE6c2lnbi1hbmQtZGVwbG95LWZpbGUiLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURyZXBvc2l0b3J5SWQ9JHttYXZlbi1yZXBvc2l0b3J5LWlkfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHVybD0ke21hdmVuLXJlcG9zaXRvcnktdXJsfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9JHtwb20ueG1sfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRGZpbGU9QHtmaWxlfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRGNsYXNzaWZpZXI9QHtjbGFzc2lmaWVyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHBhY2thZ2luZz1Ae3BhY2thZ2luZ30iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLVBncGciLz4KLSAgICAgIDwvYXJ0aWZhY3Q6bXZuPgotICAgIDwvc2VxdWVudGlhbD4KLSAgPC9tYWNyb2RlZj4KLQotICA8dGFyZ2V0IG5hbWU9InB1Ymxpc2giIGRlcGVuZHM9ImNsZWFuLGluaXQsdGVzdCxkaXN0LGphdmFkb2MscGFjay5zcmMiPgotICAgIDwhLS0gQ29tcGlsZSwgcGFja2FnZSwgdGVzdCBhbmQgdGhlbiBzZW5kIHJlbGVhc2UgdG8gYXBhY2hlIG1hdmVuIHJlcG8gLS0+Ci0gICAgPCEtLSBydW4gd2l0aDogYW50IC1EcmVsZWFzZT10cnVlIHB1Ymxpc2gtLT4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke3BvbS54bWx9IiBwYWNrYWdpbmc9InBvbSIgY2xhc3NpZmllcj0iIi8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtqYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSIiLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2phdmFkb2MuamFyLmZpbGV9IiBwYWNrYWdpbmc9ImphciIgY2xhc3NpZmllcj0iamF2YWRvYyIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7c291cmNlLnRhci5nen0iIHBhY2thZ2luZz0ic3JjIiBjbGFzc2lmaWVyPSJ0YXIuZ3oiLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCBiL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTNiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApAQCAtMCwwICsxLDUxIEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPCEtLQorICAgICAgICBUaGlzIGZpbGUgY29udHJvbHMgZmlsdGVyaW5nIHNvbWUgb2YgdGhlIG1vcmUgb2Jub3hpb3VzIGZpbmRidWdzIHJlcG9ydHMuCisgICAgICAgIFNvbWUgbWF5IGJlIHdvcnRoeSBvZiBleGFtaW5hdGlvbiBhbmQgcmVzb2x1dGlvbiwgb3RoZXJzIGFyZSB0b28gbml0LXBpY2t5LgorICAgIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPE9yPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgdGhlIG1pc3Npbmcgc2VyaWFsVmVyc2lvblVJRCBlcnJvcnMgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNuVkkiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBNYWxpY2lvdXMgY29kZSB2dWxuZXJhYmlsaXR5IFdhcm5pbmdzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJFSSxFSTIiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBVbmNoZWNrZWQvdW5jb25maXJtZWQgY2FzdCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iQkMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTaG91bGQgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkgcmF0aGVyIHRoYW4gbnVsbD8gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlBaTEEiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBSZWR1bmRhbnQgbnVsbGNoZWNrIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSQ04iIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBFeGNlcHRpb24gaXMgY2F1Z2h0IHdoZW4gRXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlJFQyIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFN3aXRjaCBzdGF0ZW1lbnQgZm91bmQgd2hlcmUgZGVmYXVsdCBjYXNlIGlzIG1pc3NpbmcgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNGIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5yZWFkIHB1YmxpYy9wcm90ZWN0ZWQgZmllbGQgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlVyRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIEZpZWxkIG5vdCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBhbmQgZGVyZWZlcmVuY2VkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVd0YiIC8+CisgICAgICAgIDwvT3I+CisgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgaW52b2tlcyBTeXN0ZW0uZXhpdCguLi4pLCB3aGljaCBzaHV0cyBkb3duIHRoZSBlbnRpcmUgdmlydHVhbCBtYWNoaW5lIC0tPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgICA8TWV0aG9kIG5hbWU9InByaW50VXNhZ2UiIC8+CisgICAgICAgIDxCdWcgY29kZT0iRG0iIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIG1pZ2h0IGlnbm9yZSBqYXZhLmxhbmcuRXhjZXB0aW9uIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNpbXBsZUZpbGVUcmFuc3BvcnQiIC8+CisgICAgICAgPE1ldGhvZCBuYW1lPSJjbG9zZSIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQuVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCRNdWx0aUZldGNoIiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0icnVuIiAvPgorICAgICAgIDxCdWcgY29kZT0iREUiIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgQ2xhc3MgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmxldCIgLz4KKyAgICAgICA8QnVnIGNvZGU9IlNlIiAvPgorICAgICA8L01hdGNoPgorPC9GaW5kQnVnc0ZpbHRlcj4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZhOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyBUaGlzIGZpbGUgaXMgc2hhcmVkIGN1cnJlbnRseSBiZXR3ZWVuIHRoaXMgR3JhZGxlIGJ1aWxkIGFuZCB0aGUKKyMgQW50IGJ1aWxkcyBmb3IgZmQzMDMgYW5kIEphdmFTY3JpcHQuIEtlZXAgdGhlIGRvdHRlZCBub3RhdGlvbiBmb3IKKyMgdGhlIHByb3BlcnRpZXMgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgaW4gdGhlIGRlcGVuZGVuY2llcy4KK3RocmlmdC52ZXJzaW9uPTEuMC4wCit0aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAorcmVsZWFzZT10cnVlCisKKyMgTG9jYWwgSW5zdGFsbCBwYXRocworaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCitpbnN0YWxsLmphdmFkb2MucGF0aD0vdXNyL2xvY2FsL2xpYgorCisjIFRlc3QgZXhlY3V0aW9uIHByb3BlcnRpZXMKK3Rlc3RQb3J0PTkwOTAKKworIyBUZXN0IHdpdGggQ2xvdmVyIENvZGUgY292ZXJhZ2UgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCitjbG92ZXJFbmFibGVkPWZhbHNlCisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCithcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcworCisjIEFwYWNoZSBNYXZlbiBwdWJsaXNoCitsaWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKK21hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCittYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2h0dHBjbGllbnQudmVyc2lvbj00LjQuMQoraHR0cGNvcmUudmVyc2lvbj00LjQuMQorc2xmNGoudmVyc2lvbj0xLjcuMTIKK3NlcnZsZXQudmVyc2lvbj0yLjUKK2p1bml0LnZlcnNpb249NC4xMgorbW9ja2l0by52ZXJzaW9uPTEuOS41CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBtYWluIEphdmEgc291cmNlcy4nCisKKyAgICBjbGFzc2lmaWVyICdzb3VyY2VzJworICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgSmF2YURvYy4nCisKKyAgICBjbGFzc2lmaWVyICdqYXZhZG9jJworICAgIGZyb20gamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKKyAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBLZWVwIHRoaXMgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBmb3Igbm93LCBkaXNhYmxlZCBieSBkZWZhdWx0CitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5jbG92ZXJFbmFibGVkKSkgeworICAgIGFwcGx5IHBsdWdpbjogJ2NvbS5ibXVzY2hrby5jbG92ZXInCisKKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbG92ZXIgJ29yZy5vcGVuY2xvdmVyOmNsb3Zlcjo0LjIuKycKKyAgICB9CisKKyAgICBjbG92ZXIgeworCisgICAgICAgIHRlc3RJbmNsdWRlcyA9IFsnKiovVGVzdCouamF2YSddCisgICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGdlbmVyYXRlZCB0ZXN0IGNvZGUgZnJvbSBjb2RlIGNvdmVyYWdlCisgICAgICAgIHRlc3RFeGNsdWRlcyA9IFsndGhyaWZ0L3Rlc3QvVGVzdCouamF2YSddCisKKyAgICAgICAgY29tcGlsZXIgeworICAgICAgICAgICAgZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgICAgICAgICBkZWJ1ZyA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydCB7CisgICAgICAgICAgICBodG1sID0gdHJ1ZQorICAgICAgICAgICAgcGRmID0gdHJ1ZQorICAgICAgICB9CisgICAgfQorCisgICAgYnVpbGQuZGVwZW5kc09uIGNsb3ZlckdlbmVyYXRlUmVwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYxYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpAQCAtMCwwICsxLDM5IEBACisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25maWd1cmUgdGhlIEdyYWRsZSBjb2RlIHF1YWxpdHkgcGx1Z2lucyBoZXJlLgorLy8KKworYXBwbHkgcGx1Z2luOiAnZmluZGJ1Z3MnCisKK2ZpbmRidWdzIHsKKyAgICBpZ25vcmVGYWlsdXJlcyA9IHRydWUKKyAgICB0b29sVmVyc2lvbiA9ICczLjAuMScKKyAgICBzb3VyY2VTZXRzID0gWyBzb3VyY2VTZXRzLm1haW4gXQorICAgIGVmZm9ydCA9ICdtYXgnCisgICAgcmVwb3J0TGV2ZWwgPSAnbG93JworICAgIGV4Y2x1ZGVGaWx0ZXIgPSBmaWxlKCdjb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCcpCit9CisKK3Rhc2tzLndpdGhUeXBlKEZpbmRCdWdzKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIHRleHQuZW5hYmxlZCA9IGZhbHNlCisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAncG1kJworCitwbWQgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzYuMC4wJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgcnVsZVNldHMgPSBbICdqYXZhLWJhc2ljJyBdCit9CisKK3Rhc2tzLndpdGhUeXBlKFBtZCkgeworICAgIHJlcG9ydHMgeworICAgICAgICBodG1sLmVuYWJsZWQgPSB0cnVlCisgICAgICAgIHhtbC5lbmFibGVkID0gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdlYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gT3ZlcnJpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpZiBDTWFrZSBpcyB1c2VkIChhbGxvd3MgZm9yIG91dC1vZi10cmVlLWJ1aWxkcykKK2lmIChoYXNQcm9wZXJ0eSgnYnVpbGQuZGlyJykpIHsKKyAgICBidWlsZERpciA9IGZpbGUocHJvcGVydHkoJ2J1aWxkLmRpcicpKQorfQorCisvLyBJbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG90aGVyIEFudCBiYXNlZCBidWlsZHMgaW4gdGhlIHN5c3RlbQorLy8gd2UgY29udmVydCB0aGUgZ3JhZGxlLnByb3BlcnRpZXMgaW50byBEU0wgZnJpZW5kbHkgY2FtZWxDYXNlZCBwcm9wZXJ0aWVzCitleHQuaW5zdGFsbFBhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5wYXRoJykKK2V4dC5pbnN0YWxsSmF2YWRvY1BhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5qYXZhZG9jLnBhdGgnKQorCitleHQudGhyaWZ0Um9vdCA9IGZpbGUoJy4uLy4uJykKKworaWYgKGhhc1Byb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKSkgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9IHByb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKQorfSBlbHNlIHsKKyAgICBleHQudGhyaWZ0Q29tcGlsZXIgPSAiJHRocmlmdFJvb3QvY29tcGlsZXIvY3BwL3RocmlmdCIKK30KKworZXh0Lm12blJlcG8gPSBwcm9wZXJ0eSgnbXZuLnJlcG8nKQorZXh0LmFwYWNoZVJlcG8gPSBwcm9wZXJ0eSgnYXBhY2hlLnJlcG8nKQorZXh0Lm1hdmVuUmVwb3NpdG9yeVVybCA9IHByb3BlcnR5KCdtYXZlbi1yZXBvc2l0b3J5LXVybCcpCisKKy8vIFZlcnNpb25zIHVzZWQgaW4gdGhpcyBwcm9qZWN0CitleHQuaHR0cGNsaWVudFZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNsaWVudC52ZXJzaW9uJykKK2V4dC5odHRwY29yZVZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNvcmUudmVyc2lvbicpCitleHQuc2VydmxldFZlcnNpb24gPSBwcm9wZXJ0eSgnc2VydmxldC52ZXJzaW9uJykKK2V4dC5zbGY0alZlcnNpb24gPSBwcm9wZXJ0eSgnc2xmNGoudmVyc2lvbicpCitleHQuanVuaXRWZXJzaW9uID0gcHJvcGVydHkoJ2p1bml0LnZlcnNpb24nKQorZXh0Lm1vY2tpdG9WZXJzaW9uID0gcHJvcGVydHkoJ21vY2tpdG8udmVyc2lvbicpCisKKy8vIEluIHRoaXMgc2VjdGlvbiB5b3UgZGVjbGFyZSB3aGVyZSB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0CityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnTWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5JworICAgICAgICB1cmwgbXZuUmVwbworICAgIH0KKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBNYXZlbiBSZXBvc2l0b3J5JworICAgICAgICB1cmwgYXBhY2hlUmVwbworICAgIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICJvcmcuc2xmNGo6c2xmNGotYXBpOiR7c2xmNGpWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6JHtodHRwY2xpZW50VmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZToke2h0dHBjb3JlVmVyc2lvbn0iCisgICAgY29tcGlsZSAiamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToke3NlcnZsZXRWZXJzaW9ufSIKKworICAgIHRlc3RDb21waWxlICJqdW5pdDpqdW5pdDoke2p1bml0VmVyc2lvbn0iCisgICAgdGVzdENvbXBpbGUgIm9yZy5tb2NraXRvOm1vY2tpdG8tYWxsOiR7bW9ja2l0b1ZlcnNpb259IgorICAgIHRlc3RSdW50aW1lICJvcmcuc2xmNGo6c2xmNGotbG9nNGoxMjoke3NsZjRqVmVyc2lvbn0iCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uYWwgdGVzdGluZyBoYXJuZXNzIGNyZWF0aW9uLiBUaGlzIGhlbHBzIHJ1biB0aGUgY3Jvc3MtY2hlY2sgdGVzdHMuCisvLyBUaGUgTWFrZWZpbGUgcHJlY3Jvc3MgdGFyZ2V0IGludm9rZXMgdGhlIHNoYWRvd0phciB0YXNrIGFuZCB0aGUgdGVzdHMuanNvbgorLy8gY29kZSBpcyBjaGFuZ2VkIHRvIGNhbGwgcnVuY2xpZW50IG9yIHJ1bnNlcnZlciBhcyBuZWVkZWQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3NzIFRlc3Qgc291cmNlcyBhcmUgc2VwYXJhdGVkIGluIHRoZWlyIG93biBzb3VyY2VTZXQKKy8vCitzb3VyY2VTZXRzIHsKKyAgICBjcm9zc1Rlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdENsaWVudC5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0U2VydmVyLmphdmEnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhJworICAgICAgICB9CisgICAgfQorfQorCitjb25maWd1cmF0aW9ucyB7CisgICAgY3Jvc3NUZXN0Q29tcGlsZSB7IGV4dGVuZHNGcm9tIHRlc3RDb21waWxlIH0KKyAgICBjcm9zc1Rlc3RSdW50aW1lIHsgZXh0ZW5kc0Zyb20gY3Jvc3NUZXN0Q29tcGlsZSwgdGVzdFJ1bnRpbWUgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy5tYWluLm91dHB1dAorICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyBJIGFtIHVzaW5nIHNoYWRvdyBwbHVnaW4gdG8gbWFrZSBhIHNlbGYgY29udGFpbmVkIGZ1bmN0aW9uYWwgdGVzdCBVYmVyIEpBUiB0aGF0CisvLyBlbGltaW5hdGVzIHN0YXJ0dXAgcHJvYmxlbXMgd2l0aCB3cmFwcGluZyB0aGUgY3Jvc3MtY2hlY2sgaGFybmVzcyBpbiBHcmFkbGUuCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHJ1bm5lciBzY3JpcHRzIGFzIHRoZSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IHdoaWNoCisvLyBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gYmUgYXMgbGlnaHR3ZWlnaHQgYXMgaXQgY2FuLgorc2hhZG93SmFyIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZSBhIHRlc3QgSkFSIGZpbGUgZm9yIGNyb3NzLWNoZWNrIGV4ZWN1dGlvbicKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5lcnMgYXJlIGNyZWF0ZWQgd2hlbiB0aGlzIHJ1bnMKKyAgICBkZXBlbmRzT24gJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yQ2xpZW50JywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yU2VydmVyJywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXInCisKKyAgICBiYXNlTmFtZSA9ICdmdW5jdGlvbmFsVGVzdCcKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiRidWlsZERpci9mdW5jdGlvbmFsVGVzdEphciIpCisgICAgY2xhc3NpZmllciA9IG51bGwKKworICAgIC8vIFdlIGRvIG5vdCBuZWVkIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgaW50ZXJuYWwgamFyCisgICAgdmVyc2lvbiA9IG51bGwKKworICAgIC8vIEJ1bmRsZSB0aGUgY29tcGxldGUgc2V0IG9mIHVuaXQgdGVzdCBjbGFzc2VzIGluY2x1ZGluZyBnZW5lcmF0ZWQgY29kZQorICAgIC8vIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gb25lIEpBUiB0byBleHBlZGl0ZSBleGVjdXRpb24uCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0CisgICAgZnJvbSBzb3VyY2VTZXRzLmNyb3NzVGVzdC5vdXRwdXQKKyAgICBjb25maWd1cmF0aW9ucyA9IFtwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnRlc3RSdW50aW1lXQorfQorCisvLyBDb21tb24gc2NyaXB0IHJ1bm5lciBjb25maWd1cmF0aW9uIGVsZW1lbnRzCitkZWYgc2NyaXB0RXh0ID0gJycKK2RlZiBleGVjRXh0ID0gJycKK2RlZiBzY3JpcHRIZWFkID0gJyMhL2Jpbi9iYXNoJworZGVmIGFyZ3MgPSAnJConCisKKy8vIEFsdGhvdWdoIHRoaXMgaXMgbWFya2VkIGludGVybmFsIGl0IGlzIGFuIGF2YWlsYWJsZSBhbmQgc3RhYmxlIGludGVyZmFjZQoraWYgKG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS53aW5kb3dzKSB7CisgICAgc2NyaXB0RXh0ID0gJy5iYXQnCisgICAgZXhlY0V4dCA9ICcuZXhlJworICAgIHNjcmlwdEhlYWQgPSAnQGVjaG8gb2ZmJworICAgIGFyZ3MgPSAnJSonCit9CisKKy8vIFRoZSBKYXZhIGV4ZWN1dGFibGUgdG8gdXNlIHdpdGggdGhlIHJ1bm5lciBzY3JpcHRzCitkZWYgamF2YUV4ZSA9IGZpbGUoIiR7U3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnKX0vYmluL2phdmEke2V4ZWNFeHR9IikuY2Fub25pY2FsUGF0aAorLy8gVGhlIGNvbW1vbiBVYmVyIGphciBwYXRoCitkZWYgamFyUGF0aCA9IHNoYWRvd0phci5hcmNoaXZlUGF0aC5jYW5vbmljYWxQYXRoCitkZWYgdHJ1c3RTdG9yZSA9IGZpbGUoJ3Rlc3QvLnRydXN0c3RvcmUnKS5jYW5vbmljYWxQYXRoCitkZWYga2V5U3RvcmUgPSBmaWxlKCd0ZXN0Ly5rZXlzdG9yZScpLmNhbm9uaWNhbFBhdGgKKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudChncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0Q2xpZW50JworCisgICAgZGVmIGNsaWVudEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuY2xpZW50JHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5DbGllbnRUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPSR0cnVzdFN0b3JlIiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQgJGFyZ3MKKyIiIgorICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuQ2xpZW50VGV4dCcsIHJ1bkNsaWVudFRleHQKKyAgICBvdXRwdXRzLmZpbGUgY2xpZW50RmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgY2xpZW50RmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIGNsaWVudEZpbGUudGV4dCA9IHJ1bkNsaWVudFRleHQKKyAgICAgICAgY2xpZW50RmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcihncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0U2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIgJGFyZ3MKKyIiIgorCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5TZXJ2ZXJUZXh0JywgcnVuU2VydmVyVGV4dAorICAgIG91dHB1dHMuZmlsZSBzZXJ2ZXJGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBzZXJ2ZXJGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgc2VydmVyRmlsZS50ZXh0ID0gcnVuU2VydmVyVGV4dAorICAgICAgICBzZXJ2ZXJGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdE5vbmJsb2NraW5nU2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVubm9uYmxvY2tpbmdzZXJ2ZXIke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1blNlcnZlclRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSRrZXlTdG9yZSIgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1MzczOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gR2VuZXJhdGVkIGNvZGUgbG9jYXRpb25zIGZvciBVbml0IHRlc3RzCitleHQuZ2VuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhIikKK2V4dC5nZW5CZWFuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhYmVhbiIpCitleHQuZ2VuUmV1c2VTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmFyZXVzZSIpCitleHQuZ2VuRnVsbENhbWVsU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1mdWxsY2FtZWwiKQorZXh0LmdlblVuc2FmZVNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tdW5zYWZlIikKKworLy8gQWRkIHRoZSBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcyB0byB0aGUgdGVzdCBzb3VyY2Ugc2V0Citzb3VyY2VTZXRzIHsKKyAgICB0ZXN0LmphdmEuc3JjRGlycyBnZW5TcmMsIGdlbkJlYW5TcmMsIGdlblJldXNlU3JjLCBnZW5GdWxsQ2FtZWxTcmMsIGdlblVuc2FmZVNyYworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGdlbmVyYXRpb24gZm9yIFVuaXQgVGVzdGluZworCisvLyBBIGNhbGxhYmxlIGNsb3N1cmUgdG8gbWFrZSB0aGlzIGVhc2llcgorZXh0LnRocmlmdENvbXBpbGUgPSB7IFRhc2sgdGFzaywgU3RyaW5nIHRocmlmdEZpbGVOYW1lLCBTdHJpbmcgZ2VuZXJhdG9yID0gJ2phdmEnLCBGaWxlIG91dHB1dERpciA9IGdlblNyYyAtPgorICAgIGRlZiB0aHJpZnRGaWxlID0gZmlsZSgiJHRocmlmdFJvb3QvdGVzdC8kdGhyaWZ0RmlsZU5hbWUiKQorICAgIGFzc2VydCB0aHJpZnRGaWxlLmV4aXN0cygpCisKKyAgICB0YXNrLmlucHV0cy5maWxlIHRocmlmdEZpbGUKKyAgICB0YXNrLm91dHB1dHMuZGlyIG91dHB1dERpcgorCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBvdXRwdXREaXIubWtkaXJzKCkKKyAgICAgICAgZGVmIHJlc3VsdCA9IGV4ZWMgeworICAgICAgICAgICAgZXhlY3V0YWJsZSBmaWxlKHRocmlmdENvbXBpbGVyKQorICAgICAgICAgICAgYXJncyAnLS1nZW4nLCBnZW5lcmF0b3IKKyAgICAgICAgICAgIGFyZ3MgJy1vdXQnLCBvdXRwdXREaXIKKyAgICAgICAgICAgIGFyZ3MgdGhyaWZ0RmlsZQorICAgICAgICAgICAgc3RhbmRhcmRPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgZXJyb3JPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgaWdub3JlRXhpdFZhbHVlID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZXhpdFZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgVGhyaWZ0IGNvbXBpbGVyIG91dHB1dCBvbiBmYWlsdXJlcywgY3V0cyBkb3duIG9uIG5vaXNlIQorICAgICAgICAgICAgcHJpbnRsbiB0YXNrLm91dHB1dEJ1ZmZlci50b1N0cmluZygpCisgICAgICAgICAgICByZXN1bHQucmV0aHJvd0ZhaWx1cmUoKQorICAgICAgICB9CisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYWxsIHVuaXQgdGVzdCBUaHJpZnQgc291cmNlcycKKyAgICBjb21waWxlVGVzdEphdmEuZGVwZW5kc09uIGl0Cit9CisKK3Rhc2sgZ2VuZXJhdGVKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVGhyaWZ0VGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhVHlwZXMudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRGVidWdQcm90b1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdNYW55T3B0aW9uYWxzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFEZWVwQ29weVRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCcpCit9CisKK3Rhc2sgZ2VuZXJhdGVCZWFuSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFiZWFuIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhQmVhbnNUZXN0LnRocmlmdCcsICdqYXZhOmJlYW5zLG5vY2FtZWwnLCBnZW5CZWFuU3JjKQorfQorCit0YXNrIGdlbmVyYXRlUmV1c2VKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YXJldXNlIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdGdWxsQ2FtZWxUZXN0LnRocmlmdCcsICdqYXZhOmZ1bGxjYW1lbCcsIGdlbkZ1bGxDYW1lbFNyYykKK30KKwordGFzayBnZW5lcmF0ZUZ1bGxDYW1lbEphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1mdWxsY2FtZWwgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1JldXNlT2JqZWN0cy50aHJpZnQnLCAnamF2YTpyZXVzZS1vYmplY3RzJywgZ2VuUmV1c2VTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVVbnNhZmVCaW5hcmllc0phdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi11bnNhZmViaW5hcmllcyBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVW5zYWZlVHlwZXMudGhyaWZ0JywgJ2phdmE6dW5zYWZlX2JpbmFyaWVzJywgZ2VuVW5zYWZlU3JjKQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnN0YWxsYXRpb24gc3VidGFza3MsIG5vdCB1c2VkIGN1cnJlbnRseSwgd2UgdXNlICJtYWtlIGluc3RhbGwvZmFzdCIKK3Rhc2sgaW5zdGFsbERpc3QodHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJykgeworICAgIGRlc2NyaXB0aW9uID0gIkNvcHkgVGhyaWZ0IEpBUiBhbmQgZGVwZW5kZW5jaWVzIGludG8gJGluc3RhbGxQYXRoIGxvY2F0aW9uIgorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKGluc3RhbGxQYXRoKQorCisgICAgZnJvbSBqYXIKKyAgICBmcm9tIGNvbmZpZ3VyYXRpb25zLmNvbXBpbGUKK30KKwordGFzayBpbnN0YWxsSmF2YWRvYyh0eXBlOiBDb3B5LCBncm91cDogJ0luc3RhbGwnLCBkZXBlbmRzT246IGphdmFkb2MpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIFRocmlmdCBKYXZhRG9jIGludG8gJGluc3RhbGxKYXZhZG9jUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsSmF2YWRvY1BhdGgpCisKKyAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKK30KKworLy8gVGhpcyBpcyBub3QgbmVlZGVkIGJ5IEdyYWRsZSBidWlsZHMgYnV0IHRoZSByZW1haW5pbmcgQW50IGJ1aWxkcyBzZWVtIHRvCisvLyBuZWVkIGFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIHRlc3QgY2xhc3NlcyBmb3IgVGhyaWZ0IHVuaXQgdGVzdHMgc28gd2UKKy8vIGFzc2lzdCB0aGVtIHRvIHVzZSBpdCB0aGlzIHdheS4KK3Rhc2sgY29weURlcGVuZGVuY2llcyh0eXBlOiBDb3B5LCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0NvcHkgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gYSBjb21tb24gbG9jYXRpb24gZm9yIG90aGVyIEFudCBiYXNlZCBwcm9qZWN0cycKKyAgICBwcm9qZWN0LmFzc2VtYmxlLmRlcGVuZHNPbiBpdAorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZGVwcyIpCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy50ZXN0UnVudGltZQorICAgIC8vIGV4Y2x1ZGUgc29tZSB2ZXJ5IHNwZWNpZmljIHVuaXQgdGVzdCBkZXBlbmRlbmNpZXMKKyAgICBleGNsdWRlICcqKi9qdW5pdCouamFyJywgJyoqL21vY2tpdG8qLmphcicsICcqKi9oYW1jcmVzdCouamFyJworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvdyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gaW5zdGFsbCBhbmQgdXBsb2FkQXJjaGl2ZXMgdGFza3MKK2RlZiBjb25maWd1cmVQb20ocG9tKSB7CisgICAgcG9tLnByb2plY3QgeworICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0JworICAgICAgICBkZXNjcmlwdGlvbiAnVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nCisgICAgICAgIHBhY2thZ2luZyAnamFyJworICAgICAgICB1cmwgJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKKworICAgICAgICBzY20geworICAgICAgICAgICAgdXJsICdodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICB9CisKKyAgICAgICAgbGljZW5zZXMgeworICAgICAgICAgICAgbGljZW5zZSB7CisgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcKKyAgICAgICAgICAgICAgICB1cmwgIiR7cHJvamVjdC5saWNlbnNlfSIKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZXZlbG9wZXJzIHsKKyAgICAgICAgICAgIGRldmVsb3BlciB7CisgICAgICAgICAgICAgICAgaWQgJ2RldicKKyAgICAgICAgICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnCisgICAgICAgICAgICAgICAgZW1haWwgJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBvbS53aGVuQ29uZmlndXJlZCB7CisgICAgICAgIC8vIEZpeHVwIHRoZSBzY29wZSBmb3Igc2VydmxldC1hcGkgdG8gYmUgJ3Byb3ZpZGVkJyBpbnN0ZWFkIG9mICdjb21waWxlJworICAgICAgICBkZXBlbmRlbmNpZXMuZmluZCB7IGRlcCAtPiBkZXAuZ3JvdXBJZCA9PSAnamF2YXguc2VydmxldCcgJiYgZGVwLmFydGlmYWN0SWQgPT0gJ3NlcnZsZXQtYXBpJyB9LndpdGggeworICAgICAgICAgICAgLy8gaXQub3B0aW9uYWwgPSB0cnVlCisgICAgICAgICAgICBpdC5zY29wZSA9ICdwcm92aWRlZCcKKyAgICAgICAgfQorICAgIH0KK30KKworaW5zdGFsbCB7CisgICAgcmVwb3NpdG9yaWVzLm1hdmVuSW5zdGFsbGVyIHsKKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKK3VwbG9hZEFyY2hpdmVzIHsKKyAgICBkZXBlbmRzT24gdGVzdCAvLyBtYWtlIHN1cmUgd2UgcnVuIHVuaXQgdGVzdHMgd2hlbiBwdWJsaXNoaW5nCisgICAgcmVwb3NpdG9yaWVzLm1hdmVuRGVwbG95ZXIgeworICAgICAgICAvLyBzaWduUG9tIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyB3aGVuIG5vIHNpZ25pbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+IHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KSB9CisgICAgICAgIHJlcG9zaXRvcnkodXJsOiBwcm9qZWN0Lm1hdmVuUmVwb3NpdG9yeVVybCkgeworICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuVXNlcicpICYmIHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuUGFzc3dvcmQnKSkgeworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBtYXZlblVzZXIsIHBhc3N3b3JkOiBtYXZlblBhc3N3b3JkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZVBvbShwb20pCisgICAgfQorfQorCisvLyBTaWduaW5nIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsLCBvbmx5IHdoZW4gcmVsZWFzZSBhbmQgdXBsb2FkQXJjaGl2ZXMgaXMgYWN0aXZhdGVkCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7ICF2ZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpICYmIGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9CisgICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNvdXJjZSBzZXRzIGZvciBtYWluIGFuZCB0ZXN0IHNvdXJjZXMKK3NvdXJjZVNldHMgeworICAgIG1haW4geworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAnc3JjJworICAgICAgICB9CisgICAgfQorICAgIHRlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIC8vIHNlZSBmdW5jdGlvbmFsVGVzdHMuZ3JhZGxlIGZvciB0aGVzZSBmaWxlcworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Q2xpZW50LmphdmEnCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RTZXJ2ZXIuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEnCisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJ2xvZzRqLnByb3BlcnRpZXMnCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCitzb3VyY2VDb21wYXRpYmlsaXR5ID0gJzEuOCcKK3RhcmdldENvbXBhdGliaWxpdHkgPSAnMS44JworCit0YXNrcy53aXRoVHlwZShKYXZhQ29tcGlsZSkgeworICAgIG9wdGlvbnMuZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgb3B0aW9ucy5kZWJ1ZyA9IHRydWUKKyAgICBvcHRpb25zLmRlcHJlY2F0aW9uID0gdHJ1ZQorICAgIC8vIG9wdGlvbnMuY29tcGlsZXJBcmdzLmFkZEFsbCgnLVhsaW50OnVuY2hlY2tlZCcpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphciBwYWNrYWdpbmcgZGV0YWlscworcHJvY2Vzc1Jlc291cmNlcyB7CisgICAgaW50bygnTUVUQS1JTkYnKSB7CisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L0xJQ0VOU0UiCisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L05PVElDRSIKKyAgICAgICAgcmVuYW1lKCcoLispJywgJyQxLnR4dCcpCisgICAgfQorfQorCitqYXIgeworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKyAgICBtYW5pZmVzdCB7CisgICAgICAgIGF0dHJpYnV0ZXMoWworICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIjogIjIiLAorICAgICAgICAgICAgIkJ1bmRsZS1TeW1ib2xpY05hbWUiOiAiJHtwcm9qZWN0Lmdyb3VwfSIsCisgICAgICAgICAgICAiQnVuZGxlLU5hbWUiOiAiQXBhY2hlIFRocmlmdCIsCisgICAgICAgICAgICAiQnVuZGxlLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtRGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJCdW5kbGUtTGljZW5zZSI6ICIke3Byb2plY3QubGljZW5zZX0iLAorICAgICAgICAgICAgIkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IjogImxhenkiLAorICAgICAgICAgICAgIkV4cG9ydC1QYWNrYWdlIjogIiR7cHJvamVjdC5ncm91cH0uYXN5bmM7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsJHtwcm9qZWN0Lmdyb3VwfSwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXI7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydDt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2tcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH07dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0uYXN5bmMsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXIsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWVcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ubWV0YV9kYXRhO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWU7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiIiwKKyAgICAgICAgICAgICJJbXBvcnQtUGFja2FnZSI6ICJqYXZheC5uZXQsamF2YXgubmV0LnNzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VydmxldDtyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5zZXJ2bGV0Lmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLnNsZjRqO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249XCJbMS40LDIpXCIsb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIKKyAgICAgICAgXSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gQnVuZGxlIHRoZSB0ZXN0IGNsYXNzZXMgaW4gYSBKQVIgZm9yIG90aGVyIEFudCBiYXNlZCBidWlsZHMKK3Rhc2sgdGVzdEphcih0eXBlOiBKYXIsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgdGVzdCBjbGFzc2VzLicKKyAgICBwcm9qZWN0LnRlc3QuZGVwZW5kc09uIGl0CisKKyAgICBjbGFzc2lmaWVyICd0ZXN0JworICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbml0IHRlc3QgdGFza3MgYW5kIGNvbmZpZ3VyYXRpb25zCisKKy8vIEhlbHAgdGhlIHVwIHRvIGRhdGUgYWxnb3JpdGhtIHRvIG1ha2UgdGhlc2UgdGVzdHMgZG9uZQorZXh0Lm1hcmtUYXNrRG9uZSA9IHsgdGFzayAtPgorICAgIGRlZiBidWlsZEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvJHt0YXNrLm5hbWV9LmZsYWciKQorICAgIHRhc2suaW5wdXRzLmZpbGVzIHRhc2suY2xhc3NwYXRoCisgICAgdGFzay5vdXRwdXRzLmZpbGUgYnVpbGRGaWxlCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBidWlsZEZpbGUudGV4dCA9ICdQYXNzZWQhJworICAgIH0KK30KKwordGFzayBkZXByZWNhdGVkRXF1YWxpdHlUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0JworICAgIG1hcmtUYXNrRG9uZShpdCkKK30KKwordGFzayBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdCh0eXBlOiBKYXZhRXhlYywgZ3JvdXA6ICdWZXJpZmljYXRpb24nKSB7CisgICAgZGVzY3JpcHRpb24gPSAnUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSAnCisgICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy50ZXN0LnJ1bnRpbWVDbGFzc3BhdGgKKyAgICBtYWluICdvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCisvLyBNYWluIFVuaXQgVGVzdCB0YXNrIGNvbmZpZ3VyYXRpb24KK3Rlc3QgeworICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSIKKyAgICBkZXBlbmRzT24gZGVwcmVjYXRlZEVxdWFsaXR5VGVzdCwgZGVwcmVjYXRlZEphdmFCZWFuc1Rlc3QKKworICAgIC8vIEFsbG93IHJlcGVhdGluZyB0ZXN0cyBldmVuIGFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uCisgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ3JlcnVuVGVzdHMnKSkgeworICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KKyAgICB9CisKKyAgICBpbmNsdWRlICcqKi9UZXN0Ki5jbGFzcycKKyAgICBleGNsdWRlICcqKi9UZXN0KlwkKi5jbGFzcycKKworICAgIG1heEhlYXBTaXplID0gJzUxMm0nCisgICAgZm9ya0V2ZXJ5ID0gMQorCisgICAgc3lzdGVtUHJvcGVydGllcyA9IFsKKyAgICAgICAgJ2J1aWxkLnRlc3QnOiAiJHtjb21waWxlVGVzdEphdmEuZGVzdGluYXRpb25EaXJ9IiwKKyAgICAgICAgJ3Rlc3QucG9ydCc6ICIke3Rlc3RQb3J0fSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly50cnVzdHN0b3JlIiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlJzogIiR7cHJvamVjdERpcn0vdGVzdC8ua2V5c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcKKyAgICBdCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDBiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJiYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuNC4xLWJpbi56aXAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcgYi9saWIvamF2YS9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjY2RkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcuYmF0IGIvbGliL2phdmEvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnbGlidGhyaWZ0JwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNjOGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlLCBSPiB7CisgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgICBwdWJsaWMgQXN5bmNQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc09uZXdheSgpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoSSBpZmFjZSwgVCBhcmdzLCBBc3luY01ldGhvZENhbGxiYWNrPFI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uOworCisgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrPFI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBUU2VyaWFsaXphYmxlIHJlc3VsdCwgZmluYWwgYnl0ZSB0eXBlLCBmaW5hbCBpbnQgc2VxaWQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgVFByb3RvY29sIG9wcm90ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKKworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCB0eXBlLCBzZXFpZCkpOworICAgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKworICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0VuY29kaW5nVXRpbHMuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9FbmNvZGluZ1V0aWxzLmphdmEKaW5kZXggMDcyZGU5My4uYmYxNGVmNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0VuY29kaW5nVXRpbHMuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvRW5jb2RpbmdVdGlscy5qYXZhCkBAIC04Miw0ICs4Miw2NyBAQAogICAgICAgICB8ICgoYnVmW29mZnNldCArIDJdICYgMHhmZikgPDwgOCkgfCAoKGJ1ZltvZmZzZXQgKyAzXSAmIDB4ZmYpKTsKICAgfQogCisgIC8qKgorICAgKiBCaXRmaWVsZCB1dGlsaXRpZXMuCisgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0IGF0IHBvc2l0aW9uIGlzIHNldCBpbiB2LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQoYnl0ZSB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gdGVzdEJpdCgoaW50KXYsIHBvc2l0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0ZXN0Qml0KHNob3J0IHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiB0ZXN0Qml0KChpbnQpdiwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQoaW50IHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiAodiAmICgxIDw8IHBvc2l0aW9uKSkgIT0gMDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB0ZXN0Qml0KGxvbmcgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuICh2ICYgKDFMIDw8IHBvc2l0aW9uKSkgIT0gMEw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB2LCB3aXRoIHRoZSBiaXQgYXQgcG9zaXRpb24gc2V0IHRvIHplcm8uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgY2xlYXJCaXQoYnl0ZSB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gKGJ5dGUpY2xlYXJCaXQoKGludCl2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IGNsZWFyQml0KHNob3J0IHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiAoc2hvcnQpY2xlYXJCaXQoKGludCl2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjbGVhckJpdChpbnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHYgJiB+KDEgPDwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGNsZWFyQml0KGxvbmcgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHYgJiB+KDFMIDw8IHBvc2l0aW9uKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHYsIHdpdGggdGhlIGJpdCBhdCBwb3NpdGlvbiBzZXQgdG8gMSBvciAwIGRlcGVuZGluZyBvbiB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBzZXRCaXQoYnl0ZSB2LCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gdmFsdWUpIHsKKyAgICByZXR1cm4gKGJ5dGUpc2V0Qml0KChpbnQpdiwgcG9zaXRpb24sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgc2V0Qml0KHNob3J0IHYsIGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgIHJldHVybiAoc2hvcnQpc2V0Qml0KChpbnQpdiwgcG9zaXRpb24sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNldEJpdChpbnQgdiwgaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgaWYodmFsdWUpCisgICAgICByZXR1cm4gdiB8ICgxIDw8IHBvc2l0aW9uKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gY2xlYXJCaXQodiwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIHNldEJpdChsb25nIHYsIGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmKHZhbHVlKQorICAgICAgcmV0dXJuIHYgfCAoMUwgPDwgcG9zaXRpb24pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBjbGVhckJpdCh2LCBwb3NpdGlvbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNkMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIE9wdGlvbiB0eXBlIHBhdHRlcm4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbjxUPiB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbiBOT05FID0gbmV3IE5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIG9yIG5vdAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIE9wdGlvbiBpcyBkZWZpbmVkIChvZiB0eXBlIFNvbWUpCisgICAgICogICAgICAgICBmYWxzZSBpZiB0aGUgT3B0aW9uIGlzIG5vdCBkZWZpbmVkIChvZiB0eXBlIE5vbmUpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNEZWZpbmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBPcHRpb24gKGlmIGl0IGlzIGRlZmluZWQpCisgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgb24gYSBOb25lCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRhaW5lZCB2YWx1ZSAoaWYgZGVmaW5lZCkgb3IgZWxzZSByZXR1cm4gYSBkZWZhdWx0IHZhbHVlCisgICAgICogQHBhcmFtIG90aGVyIHdoYXQgdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZCAoYSBOb25lKQorICAgICAqIEByZXR1cm4gZWl0aGVyIHRoZSB2YWx1ZSwgb3Igb3RoZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkCisgICAgICovCisgICAgcHVibGljIFQgb3IoVCBvdGhlcikgeworICAgICAgICBpZiAoaXNEZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgTm9uZSB0eXBlLCByZXByZXNlbnRpbmcgYW4gYWJzZW50IHZhbHVlIChpbnN0ZWFkIG9mICJudWxsIikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmU8VD4gZXh0ZW5kcyBPcHRpb248VD4geworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmluZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY2FsbCBnZXQoKSBvbiBOb25lIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBTb21lIHR5cGUsIHJlcHJlc2VudGluZyBhbiBleGlzdGVuY2Ugb2Ygc29tZSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gVGhlIHR5cGUgb2YgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNvbWU8VD4gZXh0ZW5kcyBPcHRpb248VD4geworICAgICAgICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisgICAgICAgIHB1YmxpYyBTb21lKFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiU29tZSgiICsgdmFsdWUgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcyB2YWx1ZSBpbiBhbiBPcHRpb24gdHlwZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdmFsdWUKKyAgICAgKiBAcmV0dXJuIFNvbWUodmFsdWUpIGlmIHZhbHVlIGlzIG5vdCBudWxsLCBOb25lIGlmIHZhbHVlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBPcHRpb248VD4gZnJvbU51bGxhYmxlKFQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzb21lKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBub25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHZhbHVlIGluIGEgU29tZSB0eXBlIChOQiEgdmFsdWUgbXVzdCBub3QgYmUgbnVsbCEpCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHZhbHVlCisgICAgICogQHJldHVybiBhIG5ldyBTb21lKHZhbHVlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNvbWU8VD4gc29tZShUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgU29tZTxUPih2YWx1ZSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gTm9uZTxUPiBub25lKCkgeworICAgICAgICByZXR1cm4gKE5vbmU8VD4pIE5PTkU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjIxM2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc0Z1bmN0aW9uPEksIFQgZXh0ZW5kcyBUQmFzZT4geworICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzRnVuY3Rpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgUHJvY2Vzc0Z1bmN0aW9uKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgSSBpZmFjZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFQgYXJncyA9IGdldEVtcHR5QXJnc0luc3RhbmNlKCk7CisgICAgdHJ5IHsKKyAgICAgIGFyZ3MucmVhZChpcHJvdCk7CisgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOworICAgICAgeC53cml0ZShvcHJvdCk7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgVFNlcmlhbGl6YWJsZSByZXN1bHQgPSBudWxsOworICAgIGJ5dGUgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWTsKKworICAgIHRyeSB7CisgICAgICByZXN1bHQgPSBnZXRSZXN1bHQoaWZhY2UsIGFyZ3MpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiVHJhbnNwb3J0IGVycm9yIHdoaWxlIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSwgZXgpOworICAgICAgdGhyb3cgZXg7CisgICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0dHRVIuZXJyb3IoIkludGVybmFsIGFwcGxpY2F0aW9uIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSwgZXgpOworICAgICAgcmVzdWx0ID0gZXg7CisgICAgICBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICBpZihyZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsKKyAgICAgIGlmKCFpc09uZXdheSgpKSB7CisgICAgICAgIHJlc3VsdCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAorICAgICAgICAgICAgIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgICAgfQorICAgIH0KKworICAgIGlmKCFpc09uZXdheSgpKSB7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBtc2dUeXBlLCBzZXFpZCkpOworICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09uZXdheSgpKSB7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAorICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7CisgICAgICB4LndyaXRlKG9wcm90KTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgYm9vbGVhbiByZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzT25ld2F5KCk7CisKKyAgcHVibGljIGFic3RyYWN0IFRCYXNlIGdldFJlc3VsdChJIGlmYWNlLCBUIGFyZ3MpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBUIGdldEVtcHR5QXJnc0luc3RhbmNlKCk7CisKKyAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgIHJldHVybiBtZXRob2ROYW1lOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Nob3J0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1N2QxYy4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKLQotLyoqCi0gKiBTaG9ydFN0YWNrIGlzIGEgc2hvcnQtc3BlY2lmaWMgU3RhY2sgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmb3IgdGhlIGV4cHJlc3MKLSAqIHB1cnBvc2Ugb2YgdmVyeSBmYXN0IG9wZXJhdGlvbnMgb24gVENvbXBhY3RQcm90b2NvbCdzIGZpZWxkIGlkIHN0YWNrLiBUaGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhdCBsZWFzdCAxMHggZmFzdGVyIHRoYW4gamF2YS51dGlsLlN0YWNrLgotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRTdGFjayB7Ci0KLSAgcHJpdmF0ZSBzaG9ydFtdIHZlY3RvcjsKLSAgcHJpdmF0ZSBpbnQgdG9wID0gLTE7Ci0KLSAgcHVibGljIFNob3J0U3RhY2soaW50IGluaXRpYWxDYXBhY2l0eSkgewotICAgIHZlY3RvciA9IG5ldyBzaG9ydFtpbml0aWFsQ2FwYWNpdHldOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBvcCgpIHsKLSAgICByZXR1cm4gdmVjdG9yW3RvcC0tXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHB1c2goc2hvcnQgcHVzaGVkKSB7Ci0gICAgaWYgKHZlY3Rvci5sZW5ndGggPT0gdG9wICsgMSkgewotICAgICAgZ3JvdygpOwotICAgIH0KLSAgICB2ZWN0b3JbKyt0b3BdID0gcHVzaGVkOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7Ci0gICAgc2hvcnRbXSBuZXdWZWN0b3IgPSBuZXcgc2hvcnRbdmVjdG9yLmxlbmd0aCAqIDJdOwotICAgIFN5c3RlbS5hcnJheWNvcHkodmVjdG9yLCAwLCBuZXdWZWN0b3IsIDAsIHZlY3Rvci5sZW5ndGgpOwotICAgIHZlY3RvciA9IG5ld1ZlY3RvcjsKLSAgfQotCi0gIHB1YmxpYyBzaG9ydCBwZWVrKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIHRvcCA9IC0xOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgc2IuYXBwZW5kKCI8U2hvcnRTdGFjayB2ZWN0b3I6WyIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgfQotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI+PiIpOwotICAgICAgfQotCi0gICAgICBzYi5hcHBlbmQodmVjdG9yW2ldKTsKLQotICAgICAgaWYgKGkgPT0gdG9wKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiPDwiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2IuYXBwZW5kKCJdPiIpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggYzI5NGZjMy4uNGQ2OTNkOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMjksNyArMjksNyBAQAogICogQXBwbGljYXRpb24gbGV2ZWwgZXhjZXB0aW9uCiAgKgogICovCi1wdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CitwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFRTZXJpYWxpemFibGUgewogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCBNRVNTQUdFX0ZJRUxEID0gbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgKHNob3J0KTEpOwpAQCAtNDUsOCArNDUsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKIAogICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKKyAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZV8gPSBudWxsOwogCiAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKSB7CiAgICAgc3VwZXIoKTsKQEAgLTcwLDcgKzc0LDE4IEBACiAgICAgcmV0dXJuIHR5cGVfOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAobWVzc2FnZV8gPT0gbnVsbCkgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV87CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uCisgIHsKICAgICBURmllbGQgZmllbGQ7CiAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CiAKQEAgLTgzLDMyICs5OCw0MyBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgbWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgbWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgewotICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CiAgICAgfQogICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgIHR5cGVfID0gdHlwZTsKKyAgICBtZXNzYWdlXyA9IG1lc3NhZ2U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIGZhY3RvcnkgbWV0aG9kIGZvciBjb25zdHJ1Y3RpbmcgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gZ2l2ZW4gYSBUUHJvdG9jb2wgaW5wdXQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlYWRGcm9tKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgeworICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZXN1bHQgPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgcmVzdWx0LnJlYWQoaXByb3QpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uCisgIHsKICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFRBUFBMSUNBVElPTl9FWENFUFRJT05fU1RSVUNUKTsKICAgICBpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihNRVNTQUdFX0ZJRUxEKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzNlNzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyOworCitwdWJsaWMgaW50ZXJmYWNlIFRBc3luY1Byb2Nlc3NvciB7CisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCBmYi5yZXNwb25zZVJlYWR5KCkgb25jZSBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiKSB0aHJvd3MgVEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEKaW5kZXggZWUzMmNjYS4uZTE0ODlkNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEKQEAgLTI3LDIxICsyNyw3IEBACiAgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCiAgKgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFRCYXNlPFQgZXh0ZW5kcyBUQmFzZSwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgU2VyaWFsaXphYmxlIHsKLQotICAvKioKLSAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCi0gICAqCi0gICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAotICAgKgotICAgKiBAcGFyYW0gb3Byb3QgT3V0cHV0IHByb3RvY29sCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworcHVibGljIGludGVyZmFjZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgVFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlIHsKIAogICAvKioKICAgICogR2V0IHRoZSBGIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGRJZC4KQEAgLTU2LDcgKzQyLDcgQEAKICAgcHVibGljIGJvb2xlYW4gaXNTZXQoRiBmaWVsZCk7CiAKICAgLyoqCi0gICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gCisgICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4KICAgICogdGhlIGFwcHJvcHJpYXRlICJib3hlZCIgdHlwZXMuCiAgICAqCiAgICAqIEBwYXJhbSBmaWVsZApAQCAtNzEsNyArNTcsNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShGIGZpZWxkLCBPYmplY3QgdmFsdWUpOwogCi0gIHB1YmxpYyBUQmFzZTxULCBGPiBkZWVwQ29weSgpOworICBwdWJsaWMgVCBkZWVwQ29weSgpOwogCiAgIC8qKgogICAgKiBSZXR1cm4gdG8gdGhlIHN0YXRlIG9mIGhhdmluZyBqdXN0IGJlZW4gaW5pdGlhbGl6ZWQsIGFzIHRob3VnaCB5b3UgaGFkIGp1c3QKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjE4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUQmFzZUFzeW5jUHJvY2Vzc29yPEk+IGltcGxlbWVudHMgVEFzeW5jUHJvY2Vzc29yLCBUUHJvY2Vzc29yIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgIGZpbmFsIEkgaWZhY2U7CisgICAgZmluYWwgTWFwPFN0cmluZyxBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2UsPz4+IHByb2Nlc3NNYXA7CisKKyAgICBwdWJsaWMgVEJhc2VBc3luY1Byb2Nlc3NvcihJIGlmYWNlLCBNYXA8U3RyaW5nLCBBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2UsPz4+IHByb2Nlc3NNYXApIHsKKyAgICAgICAgdGhpcy5pZmFjZSA9IGlmYWNlOworICAgICAgICB0aGlzLnByb2Nlc3NNYXAgPSBwcm9jZXNzTWFwOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZSw/Pj4gZ2V0UHJvY2Vzc01hcFZpZXcoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvY2Vzc01hcCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgVFByb3RvY29sIGluID0gZmIuZ2V0SW5wdXRQcm90b2NvbCgpOworICAgICAgICBmaW5hbCBUUHJvdG9jb2wgb3V0ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKKworICAgICAgICAvL0ZpbmQgcHJvY2Vzc2luZyBmdW5jdGlvbgorICAgICAgICBmaW5hbCBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZuID0gcHJvY2Vzc01hcC5nZXQobXNnLm5hbWUpOworICAgICAgICBpZiAoZm4gPT0gbnVsbCkgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGluLCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBtZXRob2QgbmFtZTogJyIgKyBtc2cubmFtZSArICInIik7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkludmFsaWQgbWV0aG9kIG5hbWUiLCB4KTsKKworICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpdCBpcyBhIHR3by13YXkgcmVxdWVzdCwgc28gd2UgY2FuIHNlbmQgYSByZXBseQorICAgICAgICAgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vR2V0IEFyZ3MKKyAgICAgICAgVEJhc2UgYXJncyA9IGZuLmdldEVtcHR5QXJnc0luc3RhbmNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFyZ3MucmVhZChpbik7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiQ291bGQgbm90IHJldHJpZXZlIGZ1bmN0aW9uIGFyZ3VtZW50cyIsIHgpOworCisgICAgICAgICAgICBpZiAoIWZuLmlzT25ld2F5KCkpIHsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CisgICAgICAgICAgICAgIHgud3JpdGUob3V0KTsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZiLnJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgaWYgKGZuLmlzT25ld2F5KCkpIHsKKyAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvL3N0YXJ0IG9mZiBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgICAgICAgIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlciA9IGZuLmdldFJlc3VsdEhhbmRsZXIoZmIsIG1zZy5zZXFpZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm4uc3RhcnQoaWZhY2UsIGFyZ3MsIHJlc3VsdEhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5kZWJ1ZygiRXhjZXB0aW9uIGhhbmRsaW5nIGZ1bmN0aW9uIiwgZSk7CisgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkVycm9yKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCmluZGV4IDU4OThkNWIuLjZmNmM2ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTI0LDkgKzI1LDExIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgVEJhc2VIZWxwZXIgewogCkBAIC01MSw1NyArNTQsMjcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhib29sZWFuIGEsIGJvb2xlYW4gYikgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoYSkuY29tcGFyZVRvKGIpOworICAgIHJldHVybiBCb29sZWFuLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZSBhLCBieXRlIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBCeXRlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oc2hvcnQgYSwgc2hvcnQgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIFNob3J0LmNvbXBhcmUoYSxiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhpbnQgYSwgaW50IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8obG9uZyBhLCBsb25nIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBMb25nLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oZG91YmxlIGEsIGRvdWJsZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU3RyaW5nIGEsIFN0cmluZyBiKSB7CkBAIC0xMDksMTcgKzgyLDE2IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0gICAgaW50IHNpemVDb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7Ci0gICAgaWYgKHNpemVDb21wYXJlICE9IDApIHsKLSAgICAgIHJldHVybiBzaXplQ29tcGFyZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnQgYnl0ZUNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7Ci0gICAgICBpZiAoYnl0ZUNvbXBhcmUgIT0gMCkgewotICAgICAgICByZXR1cm4gYnl0ZUNvbXBhcmU7CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmVUbyhhW2ldLCBiW2ldKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKENvbXBhcmFibGUgYSwgQ29tcGFyYWJsZSBiKSB7CkBAIC0xMjcsNDEgKzk5LDM5IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTGlzdCBhLCBMaXN0IGIpIHsKLSAgICBpbnQgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKLSAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlKGEuZ2V0KGkpLCBiLmdldChpKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU2V0IGEsIFNldCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgU29ydGVkU2V0IHNvcnRlZEEgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRBLmFkZEFsbChhKTsKLSAgICBTb3J0ZWRTZXQgc29ydGVkQiA9IG5ldyBUcmVlU2V0KGNvbXBhcmF0b3IpOwotICAgIHNvcnRlZEIuYWRkQWxsKGIpOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgQXJyYXlMaXN0IHNvcnRlZEEgPSBuZXcgQXJyYXlMaXN0KGEpOworICAgICAgQXJyYXlMaXN0IHNvcnRlZEIgPSBuZXcgQXJyYXlMaXN0KGIpOwogCi0gICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXRlckIgPSBzb3J0ZWRCLml0ZXJhdG9yKCk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEEsIGNvbXBhcmF0b3IpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRCLCBjb21wYXJhdG9yKTsKIAotICAgIC8vIENvbXBhcmUgZWFjaCBpdGVtLgotICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShpdGVyQS5uZXh0KCksIGl0ZXJCLm5leHQoKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICBJdGVyYXRvciBpdGVyQSA9IHNvcnRlZEEuaXRlcmF0b3IoKTsKKyAgICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworCisgICAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KKyAgICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhNYXAgYSwgTWFwIGIpIHsKQEAgLTE5OCw3ICsxNjgsNyBAQAogICAvKioKICAgICogQ29tcGFyYXRvciB0byBjb21wYXJlIGl0ZW1zIGluc2lkZSBhIHN0cnVjdHVyZSAoZS5nLiBhIGxpc3QsIHNldCwgb3IgbWFwKS4KICAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZFN0cnVjdHVyZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmVzdGVkU3RydWN0dXJlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IsIFNlcmlhbGl6YWJsZSB7CiAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvQSwgT2JqZWN0IG9CKSB7CiAgICAgICBpZiAob0EgPT0gbnVsbCAmJiBvQiA9PSBudWxsKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMjIwLDE1ICsxOTAsMzUgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TdHJpbmcoQ29sbGVjdGlvbjxCeXRlQnVmZmVyPiBiYnMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKKyAgICBJdGVyYXRvcjxCeXRlQnVmZmVyPiBpdCA9IGJicy5pdGVyYXRvcigpOworICAgIGlmICghaXQuaGFzTmV4dCgpKSB7CisgICAgICBzYi5hcHBlbmQoIltdIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCgiWyIpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGl0Lm5leHQoKTsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcoYmIsIHNiKTsKKyAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKICAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKEJ5dGVCdWZmZXIgYmIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKICAgICBieXRlW10gYnVmID0gYmIuYXJyYXkoKTsKIAogICAgIGludCBhcnJheU9mZnNldCA9IGJiLmFycmF5T2Zmc2V0KCk7Ci0gICAgaW50IG9yaWdMaW1pdCA9IGJiLmxpbWl0KCk7Ci0gICAgaW50IGxpbWl0ID0gKG9yaWdMaW1pdCAtIGFycmF5T2Zmc2V0ID4gMTI4KSA/IGFycmF5T2Zmc2V0ICsgMTI4IDogb3JpZ0xpbWl0OworICAgIGludCBvZmZzZXQgPSBhcnJheU9mZnNldCArIGJiLnBvc2l0aW9uKCk7CisgICAgaW50IG9yaWdMaW1pdCA9IGFycmF5T2Zmc2V0ICsgYmIubGltaXQoKTsKKyAgICBpbnQgbGltaXQgPSAob3JpZ0xpbWl0IC0gb2Zmc2V0ID4gMTI4KSA/IG9mZnNldCArIDEyOCA6IG9yaWdMaW1pdDsKIAotICAgIGZvciAoaW50IGkgPSBhcnJheU9mZnNldDsgaSA8IGxpbWl0OyBpKyspIHsKLSAgICAgIGlmIChpID4gYXJyYXlPZmZzZXQpIHsKKyAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGltaXQ7IGkrKykgeworICAgICAgaWYgKGkgPiBvZmZzZXQpIHsKICAgICAgICAgc2IuYXBwZW5kKCIgIik7CiAgICAgICB9CiAgICAgICBzYi5hcHBlbmQocGFkZGVkQnl0ZVN0cmluZyhidWZbaV0pKTsKQEAgLTI5NCwxMiArMjg0LDE0IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjb3B5QmluYXJ5KGZpbmFsIGJ5dGVbXSBvcmlnKSB7Ci0gICAgaWYgKG9yaWcgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorICAgIHJldHVybiAob3JpZyA9PSBudWxsKSA/IG51bGwgOiBBcnJheXMuY29weU9mKG9yaWcsIG9yaWcubGVuZ3RoKTsKKyAgfQogCi0gICAgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtvcmlnLmxlbmd0aF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCAwLCBjb3B5LCAwLCBvcmlnLmxlbmd0aCk7Ci0gICAgcmV0dXJuIGNvcHk7CisgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gTG9uZy5oYXNoQ29kZSh2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShkb3VibGUgdmFsdWUpIHsKKyAgICByZXR1cm4gRG91YmxlLmhhc2hDb2RlKHZhbHVlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE5YTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEJhc2VQcm9jZXNzb3I8ST4gaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKKyAgcHJpdmF0ZSBmaW5hbCBJIGlmYWNlOworICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZT4+IHByb2Nlc3NNYXA7CisKKyAgcHJvdGVjdGVkIFRCYXNlUHJvY2Vzc29yKEkgaWZhY2UsIE1hcDxTdHJpbmcsIFByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2U+PiBwcm9jZXNzRnVuY3Rpb25NYXApIHsKKyAgICB0aGlzLmlmYWNlID0gaWZhY2U7CisgICAgdGhpcy5wcm9jZXNzTWFwID0gcHJvY2Vzc0Z1bmN0aW9uTWFwOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZT4+IGdldFByb2Nlc3NNYXBWaWV3KCkgeworICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvY2Vzc01hcCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgUHJvY2Vzc0Z1bmN0aW9uIGZuID0gcHJvY2Vzc01hcC5nZXQobXNnLm5hbWUpOworICAgIGlmIChmbiA9PSBudWxsKSB7CisgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaW4sIFRUeXBlLlNUUlVDVCk7CisgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgIkludmFsaWQgbWV0aG9kIG5hbWU6ICciK21zZy5uYW1lKyInIik7CisgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKKyAgICAgIHgud3JpdGUob3V0KTsKKyAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGZuLnByb2Nlc3MobXNnLnNlcWlkLCBpbiwgb3V0LCBpZmFjZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDllZDgzYzAuLjNhMmQ1NmMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBDbGFzcyB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgYnVmIHdpdGhvdXQgZG9pbmcgZGVlcApAQCAtMjcsMTkgKzI4LDM0IEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbFNpemU7CisKICAgcHVibGljIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW50IHNpemUpIHsKICAgICBzdXBlcihzaXplKTsKKyAgICB0aGlzLmluaXRpYWxTaXplID0gc2l6ZTsKICAgfQogCiAgIHB1YmxpYyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgewotICAgIHN1cGVyKCk7CisgICAgdGhpcygzMik7CiAgIH0KIAogICBwdWJsaWMgYnl0ZVtdIGdldCgpIHsKICAgICByZXR1cm4gYnVmOwogICB9CiAKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgc3VwZXIucmVzZXQoKTsKKyAgICBpZiAoYnVmLmxlbmd0aCA+IGluaXRpYWxTaXplKSB7CisgICAgICBidWYgPSBuZXcgYnl0ZVtpbml0aWFsU2l6ZV07CisgICAgfQorICB9CisKICAgcHVibGljIGludCBsZW4oKSB7CiAgICAgcmV0dXJuIGNvdW50OwogICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGNvdW50LCBjaGFyc2V0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKaW5kZXggZGJlZmNkOC4uZDFkMzk2NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCkBAIC02NCwxMCArNjQsMjMgQEAKICAgICogQHBhcmFtIGJ5dGVzIFRoZSBhcnJheSB0byByZWFkIGZyb20KICAgICovCiAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFRCYXNlIGJhc2UsIGJ5dGVbXSBieXRlcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgZGVzZXJpYWxpemUoYmFzZSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZnJvbSBhIGJ5dGUgYXJyYXkuCisgICAqCisgICAqIEBwYXJhbSBiYXNlIFRoZSBvYmplY3QgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHtAY29kZSBieXRlc30KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIHRvIHJlYWQgZnJvbSB7QGNvZGUgYnl0ZXN9CisgICAqLworICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShUQmFzZSBiYXNlLCBieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgdHJhbnNfLnJlc2V0KGJ5dGVzKTsKKyAgICAgIHRyYW5zXy5yZXNldChieXRlcywgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgYmFzZS5yZWFkKHByb3RvY29sXyk7CiAgICAgfSBmaW5hbGx5IHsKKyAgICAgIHRyYW5zXy5jbGVhcigpOwogICAgICAgcHJvdG9jb2xfLnJlc2V0KCk7CiAgICAgfQogICB9CkBAIC0xMDgsNiArMTIxLDcgQEAKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oZSk7CiAgICAgfSBmaW5hbGx5IHsKKyAgICAgIHRyYW5zXy5jbGVhcigpOwogICAgICAgcHJvdG9jb2xfLnJlc2V0KCk7CiAgICAgfQogICB9CkBAIC0yMjgsNiArMjQyLDcgQEAKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oZSk7CiAgICAgfSBmaW5hbGx5IHsKKyAgICAgIHRyYW5zXy5jbGVhcigpOwogICAgICAgcHJvdG9jb2xfLnJlc2V0KCk7CiAgICAgfQogICB9CkBAIC0yMzYsNTQgKzI1MSwzOCBAQAogICAgIHRyeSB7CiAgICAgICBURmllbGQgZmllbGQgPSBsb2NhdGVGaWVsZChieXRlcywgZmllbGRJZFBhdGhGaXJzdCwgZmllbGRJZFBhdGhSZXN0KTsKICAgICAgIGlmIChmaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZmllbGQuCi0gICAgICAgIHN3aXRjaCh0dHlwZSl7CisgICAgICAgIGlmICh0dHlwZSA9PSBmaWVsZC50eXBlKSB7CisgICAgICAgICAgLy8gaWYgdGhpcyBwb2ludCBpcyByZWFjaGVkLCBpcHJvdCB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mCisgICAgICAgICAgLy8gdGhlIGZpZWxkCisgICAgICAgICAgc3dpdGNoICh0dHlwZSkgewogICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJvb2woKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CWVRFKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQnl0ZSgpOwogICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuRE9VQkxFKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkxNikgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMTYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTY0KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEk2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTAwOiAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJpbmFyeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5CisgICAgICAgIGlmICh0dHlwZSA9PSAxMDAgJiYgZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgcmV0dXJuIG51bGw7CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGUpOwogICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKICAgICAgIHByb3RvY29sXy5yZXNldCgpOwogICAgIH0KICAgfQpAQCAtMjkxLDExICsyOTAsOSBAQAogICBwcml2YXRlIFRGaWVsZCBsb2NhdGVGaWVsZChieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyYW5zXy5yZXNldChieXRlcyk7CiAKLSAgICBURmllbGRJZEVudW1bXSBmaWVsZElkUGF0aD0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CisgICAgVEZpZWxkSWRFbnVtW10gZmllbGRJZFBhdGggPSBuZXcgVEZpZWxkSWRFbnVtW2ZpZWxkSWRQYXRoUmVzdC5sZW5ndGggKyAxXTsKICAgICBmaWVsZElkUGF0aFswXSA9IGZpZWxkSWRQYXRoRmlyc3Q7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZElkUGF0aFJlc3QubGVuZ3RoOyBpKyspewotICAgICAgZmllbGRJZFBhdGhbaSArIDFdID0gZmllbGRJZFBhdGhSZXN0W2ldOwotICAgIH0KKyAgICBTeXN0ZW0uYXJyYXljb3B5KGZpZWxkSWRQYXRoUmVzdCwgMCwgZmllbGRJZFBhdGgsIDEsIGZpZWxkSWRQYXRoUmVzdC5sZW5ndGgpOwogCiAgICAgLy8gaW5kZXggaW50byBmaWVsZCBJRCBwYXRoIGJlaW5nIGN1cnJlbnRseSBzZWFyY2hlZCBmb3IKICAgICBpbnQgY3VyUGF0aEluZGV4ID0gMDsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKaW5kZXggYzE3ZDY2MS4uZmJjNzc4NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAotaW1wb3J0IGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgPGNvZGU+VFByb2Nlc3NvcjwvY29kZT4gYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KK3B1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZyxUUHJvY2Vzc29yPiBTRVJWSUNFX1BST0NFU1NPUl9NQVAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRQcm9jZXNzb3I+KCk7CisgICAgcHJpdmF0ZSBUUHJvY2Vzc29yIGRlZmF1bHRQcm9jZXNzb3I7CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKKyAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bworICAgICAqIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoU3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgICBTRVJWSUNFX1BST0NFU1NPUl9NQVAucHV0KHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBxdWVyaWVzIHdpdGhvdXQgc2VydmljZSBuYW1lCisgICAgICogQHBhcmFtIHByb2Nlc3NvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdChUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS48L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksIGlmCisgICAgICogdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuICBZb3UgY2FsbGVkIHtAbGluayAjcmVnaXN0ZXJQcm9jZXNzb3IoU3RyaW5nLCBUUHJvY2Vzc29yKSByZWdpc3RlclByb2Nlc3Nvcn0KKyAgICAgKiBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHJpZ2h0PyA6KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgICovCisgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCAmJiBtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgaWYgKGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3Nvci5wcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG1lc3NhZ2UpLCBvcHJvdCk7CisgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIi4gIERpZCB5b3UgIiArCisgICAgICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBtZXNzYWdlLm5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgVFByb2Nlc3NvciBhY3R1YWxQcm9jZXNzb3IgPSBTRVJWSUNFX1BST0NFU1NPUl9NQVAuZ2V0KHNlcnZpY2VOYW1lKTsKKyAgICAgICAgaWYgKGFjdHVhbFByb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gIERpZCB5b3UgZm9yZ2V0ICIgKworICAgICAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIFRNZXNzYWdlIHN0YW5kYXJkTWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUuc3Vic3RyaW5nKHNlcnZpY2VOYW1lLmxlbmd0aCgpK1RNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxaWQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IucHJvY2VzcyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgICAgICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAgICAgKiAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7CisgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikgeworICAgICAgICAgICAgc3VwZXIocHJvdG9jb2wpOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDk3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKKworLyoqCisgKiBUaGlzIGNsYXNzIHVzZXMgYSBzaW5nbGUgdGhyZWFkIHRvIHNldCB1cCBub24tYmxvY2tpbmcgc29ja2V0cyB0byBhIHNldAorICogb2YgcmVtb3RlIHNlcnZlcnMgKGhvc3RuYW1lIGFuZCBwb3J0IHBhaXJzKSwgYW5kIHNlbmRzIGEgc2FtZSByZXF1ZXN0IHRvCisgKiBhbGwgdGhlc2Ugc2VydmVycy4gSXQgdGhlbiBmZXRjaGVzIHJlc3BvbnNlcyBmcm9tIHNlcnZlcnMuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgaW50IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciAtIGFuIHVwcGVyIGxpbWl0IGZvciByZWNlaXZlIGJ1ZmZlciBzaXplCisgKiBwZXIgc2VydmVyIChpbiBieXRlKS4gSWYgYSByZXNwb25zZSBmcm9tIGEgc2VydmVyIGV4Y2VlZHMgdGhpcyBsaW1pdCwgdGhlCisgKiBjbGllbnQgd2lsbCBub3QgYWxsb2NhdGUgbWVtb3J5IG9yIHJlYWQgcmVzcG9uc2UgZGF0YSBmb3IgaXQuCisgKgorICogICBpbnQgZmV0Y2hUaW1lb3V0U2Vjb25kcyAtIHRpbWUgbGltaXQgZm9yIGZldGNoaW5nIHJlc3BvbnNlcyBmcm9tIGFsbAorICogc2VydmVycyAoaW4gc2Vjb25kKS4gQWZ0ZXIgdGhlIHRpbWVvdXQsIHRoZSBmZXRjaCBqb2IgaXMgc3RvcHBlZCBhbmQKKyAqIGF2YWlsYWJsZSByZXNwb25zZXMgYXJlIHJldHVybmVkLgorICoKKyAqICAgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmIC0gcmVxdWVzdCBtZXNzYWdlIHRoYXQgaXMgc2VudCB0byBhbGwgc2VydmVycy4KKyAqCisgKiBPdXRwdXQ6CisgKiAgIFJlc3BvbnNlcyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IG9mIEJ5dGVCdWZmZXJzLiBJbmRleCBvZiBlbGVtZW50cyBpbgorICogdGhpcyBhcnJheSBjb3JyZXNwb25kcyB0byBpbmRleCBvZiBzZXJ2ZXJzIGluIHRoZSBzZXJ2ZXIgbGlzdC4gQ29udGVudCBpbgorICogYSBCeXRlQnVmZmVyIG1heSBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAqICAgMS4gRmlyc3QgNCBieXRlcyBmb3JtIGFuIGludGVnZXIgaW5kaWNhdGluZyBsZW5ndGggb2YgZm9sbG93aW5nIGRhdGEsCisgKiB0aGVuIGZvbGxvd2VkIGJ5IHRoZSBkYXRhLgorICogICAyLiBGaXJzdCA0IGJ5dGVzIGZvcm0gYW4gaW50ZWdlciBpbmRpY2F0aW5nIGxlbmd0aCBvZiBmb2xsb3dpbmcgZGF0YSwKKyAqIHRoZW4gZm9sbG93ZWQgYnkgbm90aGluZyAtIHRoaXMgaGFwcGVucyB3aGVuIHRoZSByZXNwb25zZSBkYXRhIHNpemUKKyAqIGV4Y2VlZHMgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyLCBhbmQgdGhlIGNsaWVudCB3aWxsIG5vdCByZWFkIGFueQorICogcmVzcG9uc2UgZGF0YS4KKyAqICAgMy4gTm8gZGF0YSBpbiB0aGUgQnl0ZUJ1ZmZlciAtIHRoaXMgaGFwcGVucyB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3QKKyAqIHJldHVybiBhbnkgcmVzcG9uc2Ugd2l0aGluIGZldGNoVGltZW91dFNlY29uZHMuCisgKgorICogICBJbiBzb21lIHNwZWNpYWwgY2FzZXMgKG5vIHNlcnZlcnMgYXJlIGdpdmVuLCBmZXRjaFRpbWVvdXRTZWNvbmRzIGxlc3MKKyAqIHRoYW4gb3IgZXF1YWwgdG8gMCwgcmVxdWVzdEJ1ZiBpcyBudWxsKSwgdGhlIHJldHVybiBpcyBudWxsLgorICoKKyAqIE5vdGU6CisgKiAgIEl0IGFzc3VtZXMgYWxsIHJlbW90ZSBzZXJ2ZXJzIGFyZSBUTm9uYmxvY2tpbmdTZXJ2ZXJzIGFuZCB1c2UKKyAqIFRGcmFtZWRUcmFuc3BvcnQuCisgKgorICovCitwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCB7CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoCisgICAgVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5jbGFzcy5nZXROYW1lKCkKKyAgKTsKKworICAvLyBpZiB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgbXNnIGV4Y2VlZHMgdGhpcyBsaW1pdCAoaW4gYnl0ZSksIHdlIHdpbGwKKyAgLy8gbm90IHJlYWQgdGhlIG1zZworICBwcml2YXRlIGludCBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXI7CisKKyAgLy8gdGltZSBsaW1pdCBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIGFsbCBzZXJ2ZXJzIChpbiBzZWNvbmQpCisgIHByaXZhdGUgaW50IGZldGNoVGltZW91dFNlY29uZHM7CisKKyAgLy8gc3RvcmUgcmVxdWVzdCB0aGF0IHdpbGwgYmUgc2VudCB0byBzZXJ2ZXJzICAKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJlcXVlc3RCdWY7CisgIHByaXZhdGUgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmRHVwbGljYXRpb247CisKKyAgLy8gYSBsaXN0IG9mIHJlbW90ZSBzZXJ2ZXJzCisgIHByaXZhdGUgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gc2VydmVyczsKKworICAvLyBzdG9yZSBmZXRjaCByZXN1bHRzCisgIHByaXZhdGUgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzIHN0YXRzOworICBwcml2YXRlIEJ5dGVCdWZmZXJbXSByZWN2QnVmOworCisgIHB1YmxpYyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50KGludCBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIsCisgICAgaW50IGZldGNoVGltZW91dFNlY29uZHMsIEJ5dGVCdWZmZXIgcmVxdWVzdEJ1ZiwKKyAgICBMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBzZXJ2ZXJzKSB7CisgICAgdGhpcy5tYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIgPSBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXI7CisgICAgdGhpcy5mZXRjaFRpbWVvdXRTZWNvbmRzID0gZmV0Y2hUaW1lb3V0U2Vjb25kczsKKyAgICB0aGlzLnJlcXVlc3RCdWYgPSByZXF1ZXN0QnVmOworICAgIHRoaXMuc2VydmVycyA9IHNlcnZlcnM7CisgICAgICAKKyAgICBzdGF0cyA9IG5ldyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMoKTsKKyAgICByZWN2QnVmID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcigpIHsKKyAgICByZXR1cm4gbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0RmV0Y2hUaW1lb3V0U2Vjb25kcygpIHsKKyAgICByZXR1cm4gZmV0Y2hUaW1lb3V0U2Vjb25kczsKKyAgfQorCisgIC8qKgorICAgKiByZXR1cm4gYSBkdXBsaWNhdGlvbiBvZiByZXF1ZXN0QnVmLCBzbyB0aGF0IHJlcXVlc3RCdWYgd2lsbCBub3QKKyAgICogYmUgbW9kaWZpZWQgYnkgb3RoZXJzLgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBCeXRlQnVmZmVyIGdldFJlcXVlc3RCdWYoKSB7CisgICAgaWYgKHJlcXVlc3RCdWYgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZXF1ZXN0QnVmRHVwbGljYXRpb24gPT0gbnVsbCkgeworICAgICAgICByZXF1ZXN0QnVmRHVwbGljYXRpb24gPSByZXF1ZXN0QnVmLmR1cGxpY2F0ZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlcXVlc3RCdWZEdXBsaWNhdGlvbjsgIAorICAgIH0KKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gZ2V0U2VydmVyTGlzdCgpIHsKKyAgICBpZiAoc2VydmVycyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc2VydmVycyk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cyBnZXRGZXRjaFN0YXRzKCkgeworICAgIHJldHVybiBzdGF0czsKKyAgfQorCisgIC8qKgorICAgKiBtYWluIGVudHJ5IGZ1bmN0aW9uIGZvciBmZXRjaGluZyBmcm9tIHNlcnZlcnMKKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQnl0ZUJ1ZmZlcltdIGZldGNoKCkgeworICAgIC8vIGNsZWFyIHByZXZpb3VzIHJlc3VsdHMKKyAgICByZWN2QnVmID0gbnVsbDsKKyAgICBzdGF0cy5jbGVhcigpOworCisgICAgaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBzZXJ2ZXJzLnNpemUoKSA9PSAwIHx8CisgICAgICAgIHJlcXVlc3RCdWYgPT0gbnVsbCB8fCBmZXRjaFRpbWVvdXRTZWNvbmRzIDw9IDApIHsKKyAgICAgIHJldHVybiByZWN2QnVmOworICAgIH0KKworICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgIE11bHRpRmV0Y2ggbXVsdGlGZXRjaCA9IG5ldyBNdWx0aUZldGNoKCk7CisgICAgRnV0dXJlVGFzazw/PiB0YXNrID0gbmV3IEZ1dHVyZVRhc2sobXVsdGlGZXRjaCwgbnVsbCk7CisgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YXNrKTsKKyAgICB0cnkgeworICAgICAgdGFzay5nZXQoZmV0Y2hUaW1lb3V0U2Vjb25kcywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwgZXhlY3V0aW9uIG9mIHRoZSB0YXNrLgorICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICBMT0dHRVIuZXJyb3IoImludGVycnVwdGVkIGR1cmluZyBmZXRjaDogIitpZS50b1N0cmluZygpKTsKKyAgICB9IGNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgeworICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwgZXhlY3V0aW9uIG9mIHRoZSB0YXNrLgorICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICBMT0dHRVIuZXJyb3IoImV4Y2VwdGlvbiBkdXJpbmcgZmV0Y2g6ICIrZWUudG9TdHJpbmcoKSk7CisgICAgfSBjYXRjaChUaW1lb3V0RXhjZXB0aW9uIHRlKSB7CisgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCBleGVjdXRpb24gb2YgdGhlIHRhc2suICAKKyAgICAgIHRhc2suY2FuY2VsKHRydWUpOworICAgICAgTE9HR0VSLmVycm9yKCJ0aW1lb3V0IGZvciBmZXRjaDogIit0ZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgIG11bHRpRmV0Y2guY2xvc2UoKTsKKyAgICByZXR1cm4gcmVjdkJ1ZjsKKyAgfQorCisgIC8qKgorICAgKiBQcml2YXRlIGNsYXNzIHRoYXQgZG9lcyByZWFsIGZldGNoIGpvYi4KKyAgICogVXNlcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGRpcmVjdGx5IHVzZSB0aGlzIGNsYXNzLCBhcyBpdHMgcnVuKCkKKyAgICogZnVuY3Rpb24gbWF5IHJ1biBmb3JldmVyLgorICAgKi8KKyAgcHJpdmF0ZSBjbGFzcyBNdWx0aUZldGNoIGltcGxlbWVudHMgUnVubmFibGUgeworICAgIHByaXZhdGUgU2VsZWN0b3Igc2VsZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBtYWluIGVudHJ5IGZ1bmN0aW9uIGZvciBmZXRjaGluZy4KKyAgICAgKgorICAgICAqIFNlcnZlciByZXNwb25zZXMgYXJlIHN0b3JlZCBpbiBUTm9uYmxvY2luZ011bHRpRmV0Y2hDbGllbnQucmVjdkJ1ZiwKKyAgICAgKiBhbmQgZmV0Y2ggc3RhdGlzdGljcyBpcyBpbiBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LnN0YXRzLgorICAgICAqCisgICAgICogU2FuaXR5IGNoZWNrIGZvciBwYXJhbWV0ZXJzIGhhcyBiZWVuIGRvbmUgaW4KKyAgICAgKiBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICBpbnQgbnVtVG90YWxTZXJ2ZXJzID0gc2VydmVycy5zaXplKCk7CisgICAgICBzdGF0cy5zZXROdW1Ub3RhbFNlcnZlcnMobnVtVG90YWxTZXJ2ZXJzKTsKKworICAgICAgLy8gYnVmZmVyIGZvciByZWNlaXZpbmcgcmVzcG9uc2UgZnJvbSBzZXJ2ZXJzCisgICAgICByZWN2QnVmICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQnl0ZUJ1ZmZlcltudW1Ub3RhbFNlcnZlcnNdOworICAgICAgLy8gYnVmZmVyIGZvciBzZW5kaW5nIHJlcXVlc3QKKyAgICAgIEJ5dGVCdWZmZXIgc2VuZEJ1ZltdICAgICAgICA9IG5ldyBCeXRlQnVmZmVyW251bVRvdGFsU2VydmVyc107CisgICAgICBsb25nIG51bUJ5dGVzUmVhZFtdICAgICAgICAgPSBuZXcgbG9uZ1tudW1Ub3RhbFNlcnZlcnNdOworICAgICAgaW50IGZyYW1lU2l6ZVtdICAgICAgICAgICAgID0gbmV3IGludFtudW1Ub3RhbFNlcnZlcnNdOworICAgICAgYm9vbGVhbiBoYXNSZWFkRnJhbWVTaXplW10gID0gbmV3IGJvb2xlYW5bbnVtVG90YWxTZXJ2ZXJzXTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VsZWN0b3IgPSBTZWxlY3Rvci5vcGVuKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigic2VsZWN0b3Igb3BlbnMgZXJyb3I6ICIrZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRvdGFsU2VydmVyczsgaSsrKSB7CisgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgdG8gc2VuZCByZXF1ZXN0IHRvIHNlcnZlci4KKyAgICAgICAgc2VuZEJ1ZltpXSA9IHJlcXVlc3RCdWYuZHVwbGljYXRlKCk7CisgICAgICAgIC8vIGNyZWF0ZSBidWZmZXIgdG8gcmVhZCByZXNwb25zZSdzIGZyYW1lIHNpemUgZnJvbSBzZXJ2ZXIKKyAgICAgICAgcmVjdkJ1ZltpXSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisgICAgICAgIHN0YXRzLmluY1RvdGFsUmVjdkJ1ZkJ5dGVzKDQpOworCisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNlcnZlciA9IHNlcnZlcnMuZ2V0KGkpOworICAgICAgICBTb2NrZXRDaGFubmVsIHMgPSBudWxsOworICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgICAgcy5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgICAgICAgLy8gbm93IHRoaXMgbWV0aG9kIGlzIG5vbi1ibG9ja2luZworICAgICAgICAgIHMuY29ubmVjdChzZXJ2ZXIpOworICAgICAgICAgIGtleSA9IHMucmVnaXN0ZXIoc2VsZWN0b3IsIHMudmFsaWRPcHMoKSk7CisgICAgICAgICAgLy8gYXR0YWNoIGluZGV4IG9mIHRoZSBrZXkKKyAgICAgICAgICBrZXkuYXR0YWNoKGkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHN0YXRzLmluY051bUNvbm5lY3RFcnJvclNlcnZlcnMoKTsgIAorICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzZXQgdXAgc29ja2V0IHRvIHNlcnZlciAlcyBlcnJvcjogJXMiLAorICAgICAgICAgICAgc2VydmVyLnRvU3RyaW5nKCksIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZQorICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7cy5jbG9zZSgpO30gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KKyAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7CisgICAgICAgICAgICAga2V5LmNhbmNlbCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyB3YWl0IGZvciBldmVudHMKKyAgICAgIHdoaWxlIChzdGF0cy5nZXROdW1SZWFkQ29tcGxldGVkU2VydmVycygpICsKKyAgICAgICAgc3RhdHMuZ2V0TnVtQ29ubmVjdEVycm9yU2VydmVycygpIDwgc3RhdHMuZ2V0TnVtVG90YWxTZXJ2ZXJzKCkpIHsKKyAgICAgICAgLy8gaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCAoZS5nLiwgdGFzayBpcyBjYW5jZWxsZWQpICAKKyAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5eworICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigic2VsZWN0b3Igc2VsZWN0cyBlcnJvcjogIitlLnRvU3RyaW5nKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBpdCA9IHNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBTZWxlY3Rpb25LZXkgc2VsS2V5ID0gaXQubmV4dCgpOworICAgICAgICAgIGl0LnJlbW92ZSgpOworCisgICAgICAgICAgLy8gZ2V0IHByZXZpb3VzbHkgYXR0YWNoZWQgaW5kZXgKKyAgICAgICAgICBpbnQgaW5kZXggPSAoSW50ZWdlcilzZWxLZXkuYXR0YWNobWVudCgpOworCisgICAgICAgICAgaWYgKHNlbEtleS5pc1ZhbGlkKCkgJiYgc2VsS2V5LmlzQ29ubmVjdGFibGUoKSkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBzb2NrZXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiAoZS5nLiwgY29ubmVjdGlvbiByZWZ1c2VkKSwKKyAgICAgICAgICAgIC8vIHByaW50IGVycm9yIG1zZyBhbmQgc2tpcCBpdC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgICBzQ2hhbm5lbC5maW5pc2hDb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBzdGF0cy5pbmNOdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCk7CisgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzb2NrZXQgJWQgY29ubmVjdHMgdG8gc2VydmVyICVzICIgKworICAgICAgICAgICAgICAgICJlcnJvcjogJXMiLAorICAgICAgICAgICAgICAgIGluZGV4LCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlbEtleS5pc1ZhbGlkKCkgJiYgc2VsS2V5LmlzV3JpdGFibGUoKSkgeworICAgICAgICAgICAgaWYgKHNlbmRCdWZbaW5kZXhdLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgIC8vIGlmIHRoaXMgc29ja2V0IHRocm93cyBhbiBleGNlcHRpb24sIHByaW50IGVycm9yIG1zZyBhbmQKKyAgICAgICAgICAgICAgLy8gc2tpcCBpdC4KKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNDaGFubmVsID0gKFNvY2tldENoYW5uZWwpc2VsS2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICBzQ2hhbm5lbC53cml0ZShzZW5kQnVmW2luZGV4XSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNvY2tldCAlZCB3cml0ZXMgdG8gc2VydmVyICVzICIgKworICAgICAgICAgICAgICAgICAgImVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgICBpbmRleCwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCksIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VsS2V5LmlzVmFsaWQoKSAmJiBzZWxLZXkuaXNSZWFkYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIHNvY2tldCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBwcmludCBlcnJvciBtc2cgYW5kCisgICAgICAgICAgICAvLyBza2lwIGl0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBzQ2hhbm5lbC5yZWFkKHJlY3ZCdWZbaW5kZXhdKTsKKworICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgICAgICAgICAgIG51bUJ5dGVzUmVhZFtpbmRleF0gKz0gYnl0ZXNSZWFkOworCisgICAgICAgICAgICAgICAgaWYgKCFoYXNSZWFkRnJhbWVTaXplW2luZGV4XSAmJgorICAgICAgICAgICAgICAgICAgICByZWN2QnVmW2luZGV4XS5yZW1haW5pbmcoKT09MCkgeworICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZyYW1lIHNpemUgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LCB0aGVuIHByZXBhcmUKKyAgICAgICAgICAgICAgICAgIC8vIHRvIHJlYWQgdGhlIGFjdHVhbCBmcmFtZS4KKyAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVtpbmRleF0gPSByZWN2QnVmW2luZGV4XS5nZXRJbnQoMCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemVbaW5kZXhdIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtSW52YWxpZEZyYW1lU2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgiUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgJWQiCisgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gJXMuIERvZXMgdGhlIHNlcnZlciB1c2UgVEZyYW1lZFRyYW5zcG9ydD8gIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemVbaW5kZXhdLCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZVtpbmRleF0gKyA0ID4gc3RhdHMuZ2V0TWF4UmVzcG9uc2VCeXRlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLnNldE1heFJlc3BvbnNlQnl0ZXMoZnJhbWVTaXplW2luZGV4XSs0KTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZVtpbmRleF0gKyA0ID4gbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLmluY051bU92ZXJmbG93ZWRSZWN2QnVmKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJSZWFkIGZyYW1lIHNpemUgJWQgZnJvbSAlcywiCisgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvdGFsIGJ1ZmZlciBzaXplIHdvdWxkIGV4Y2VlZCBsaW1pdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplW2luZGV4XSwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBidWZmZXIgZm9yIGFjdHVhbCBmcmFtZSBkYXRhCisgICAgICAgICAgICAgICAgICByZWN2QnVmW2luZGV4XSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZnJhbWVTaXplW2luZGV4XSArIDQpOworICAgICAgICAgICAgICAgICAgcmVjdkJ1ZltpbmRleF0ucHV0SW50KGZyYW1lU2l6ZVtpbmRleF0pOworCisgICAgICAgICAgICAgICAgICBzdGF0cy5pbmNUb3RhbFJlY3ZCdWZCeXRlcyhmcmFtZVNpemVbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgIGhhc1JlYWRGcmFtZVNpemVbaW5kZXhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGFzUmVhZEZyYW1lU2l6ZVtpbmRleF0gJiYKKyAgICAgICAgICAgICAgICAgIG51bUJ5dGVzUmVhZFtpbmRleF0gPj0gZnJhbWVTaXplW2luZGV4XSs0KSB7CisgICAgICAgICAgICAgICAgICAvLyBoYXMgcmVhZCBhbGwgZGF0YQorICAgICAgICAgICAgICAgICAgc0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHN0YXRzLmluY051bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCk7CisgICAgICAgICAgICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgICBzdGF0cy5zZXRSZWFkVGltZSh0Mi10MSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgic29ja2V0ICVkIHJlYWRzIGZyb20gc2VydmVyICVzICIgKworICAgICAgICAgICAgICAgICJlcnJvcjogJXMiLAorICAgICAgICAgICAgICAgIGluZGV4LCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZGlzcG9zZSBhbnkgcmVzb3VyY2UgYWxsb2NhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VsZWN0b3IuaXNPcGVuKCkpIHsKKyAgICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGl0ID0gc2VsZWN0b3Iua2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU2VsZWN0aW9uS2V5IHNlbEtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgc0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiZnJlZSByZXNvdXJjZSBlcnJvcjogIitlLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI4NjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIHN0YXRpc3RpY3MgZm9yIFROb25ibG9ja2luTXVsdGlGZXRjaENsaWVudC4KKyAqLworcHVibGljIGNsYXNzIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cyB7CisgIHByaXZhdGUgaW50ICAgIG51bVRvdGFsU2VydmVyczsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtUmVhZENvbXBsZXRlZFNlcnZlcnM7CisgIHByaXZhdGUgaW50ICAgIG51bUNvbm5lY3RFcnJvclNlcnZlcnM7CisgIHByaXZhdGUgaW50ICAgIHRvdGFsUmVjdkJ1ZkJ5dGVzOworICBwcml2YXRlIGludCAgICBtYXhSZXNwb25zZUJ5dGVzOworICBwcml2YXRlIGludCAgICBudW1PdmVyZmxvd2VkUmVjdkJ1ZjsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtSW52YWxpZEZyYW1lU2l6ZTsKKyAgLy8gdGltZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZmV0Y2goKSBmdW5jdGlvbiB0byB0aGUgcmVhZGluZyBmaW5pc2gKKyAgLy8gdGltZSBvZiB0aGUgbGFzdCBzb2NrZXQgKGluIG1pbGxpLXNlY29uZCkKKyAgcHJpdmF0ZSBsb25nICAgcmVhZFRpbWU7CisKKyAgcHVibGljIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cygpIHsKKyAgICBjbGVhcigpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgbnVtVG90YWxTZXJ2ZXJzID0gMDsKKyAgICBudW1SZWFkQ29tcGxldGVkU2VydmVycyA9IDA7CisgICAgbnVtQ29ubmVjdEVycm9yU2VydmVycyA9IDA7CisgICAgdG90YWxSZWN2QnVmQnl0ZXMgPSAwOworICAgIG1heFJlc3BvbnNlQnl0ZXMgPSAwOworICAgIG51bU92ZXJmbG93ZWRSZWN2QnVmID0gMDsKKyAgICBudW1JbnZhbGlkRnJhbWVTaXplID0gMDsKKyAgICByZWFkVGltZSA9IDA7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZyBzdGF0cyA9IFN0cmluZy5mb3JtYXQoIm51bVRvdGFsU2VydmVycz0lZCwgIiArCisgICAgICAibnVtUmVhZENvbXBsZXRlZFNlcnZlcnM9JWQsIG51bUNvbm5lY3RFcnJvclNlcnZlcnM9JWQsICIgKworICAgICAgIm51bVVucmVzcG9uc2l2ZVNlcnZlcnM9JWQsIHRvdGFsUmVjdkJ1ZkJ5dGVzPSVmTSwgIiArCisgICAgICAibWF4UmVzcG9uc2VCeXRlcz0lZCwgbnVtT3ZlcmZsb3dlZFJlY3ZCdWY9JWQsICIgKworICAgICAgIm51bUludmFsaWRGcmFtZVNpemU9JWQsIHJlYWRUaW1lPSVkbXMiLAorICAgICAgbnVtVG90YWxTZXJ2ZXJzLCBudW1SZWFkQ29tcGxldGVkU2VydmVycywgbnVtQ29ubmVjdEVycm9yU2VydmVycywKKyAgICAgIChudW1Ub3RhbFNlcnZlcnMtbnVtUmVhZENvbXBsZXRlZFNlcnZlcnMtbnVtQ29ubmVjdEVycm9yU2VydmVycyksCisgICAgICB0b3RhbFJlY3ZCdWZCeXRlcy8xMDI0LjAvMTAyNCwgbWF4UmVzcG9uc2VCeXRlcywgbnVtT3ZlcmZsb3dlZFJlY3ZCdWYsCisgICAgICBudW1JbnZhbGlkRnJhbWVTaXplLCByZWFkVGltZSk7CisgICAgcmV0dXJuIHN0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TnVtVG90YWxTZXJ2ZXJzKGludCB2YWwpICAgIHsgbnVtVG90YWxTZXJ2ZXJzID0gdmFsOyB9CisgIHB1YmxpYyB2b2lkIHNldE1heFJlc3BvbnNlQnl0ZXMoaW50IHZhbCkgICB7IG1heFJlc3BvbnNlQnl0ZXMgPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWUobG9uZyB2YWwpICAgICAgICAgIHsgcmVhZFRpbWUgPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtUmVhZENvbXBsZXRlZFNlcnZlcnMoKSAgIHsgbnVtUmVhZENvbXBsZXRlZFNlcnZlcnMrKzsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCkgICAgeyBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzKys7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtT3ZlcmZsb3dlZFJlY3ZCdWYoKSAgICAgIHsgbnVtT3ZlcmZsb3dlZFJlY3ZCdWYrKzsgfQorICBwdWJsaWMgdm9pZCBpbmNUb3RhbFJlY3ZCdWZCeXRlcyhpbnQgdmFsKSAgeyB0b3RhbFJlY3ZCdWZCeXRlcyArPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtSW52YWxpZEZyYW1lU2l6ZSgpICAgICAgIHsgbnVtSW52YWxpZEZyYW1lU2l6ZSsrOyB9CisKKyAgcHVibGljIGludCBnZXRNYXhSZXNwb25zZUJ5dGVzKCkgICAgICAgIHsgcmV0dXJuIG1heFJlc3BvbnNlQnl0ZXM7IH0KKyAgcHVibGljIGludCBnZXROdW1SZWFkQ29tcGxldGVkU2VydmVycygpIHsgcmV0dXJuIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzOyB9CisgIHB1YmxpYyBpbnQgZ2V0TnVtQ29ubmVjdEVycm9yU2VydmVycygpICB7IHJldHVybiBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzOyB9CisgIHB1YmxpYyBpbnQgZ2V0TnVtVG90YWxTZXJ2ZXJzKCkgICAgICAgICB7IHJldHVybiBudW1Ub3RhbFNlcnZlcnM7IH0KKyAgcHVibGljIGludCBnZXROdW1PdmVyZmxvd2VkUmVjdkJ1ZigpICAgIHsgcmV0dXJuIG51bU92ZXJmbG93ZWRSZWN2QnVmO30KKyAgcHVibGljIGludCBnZXRUb3RhbFJlY3ZCdWZCeXRlcygpICAgICAgIHsgcmV0dXJuIHRvdGFsUmVjdkJ1ZkJ5dGVzO30KKyAgcHVibGljIGludCBnZXROdW1JbnZhbGlkRnJhbWVTaXplKCkgICAgIHsgcmV0dXJuIG51bUludmFsaWRGcmFtZVNpemU7IH0KKyAgcHVibGljIGxvbmcgZ2V0UmVhZFRpbWUoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHJlYWRUaW1lOyB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhCmluZGV4IGJjZDhhMzguLjgxOTMzYTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhCkBAIC0zNiw0ICszNiw4IEBACiAgIHB1YmxpYyBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcihUVHJhbnNwb3J0IHRyYW5zKSB7CiAgICAgcmV0dXJuIHByb2Nlc3Nvcl87CiAgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0FzeW5jUHJvY2Vzc29yKCkgeworICAgICAgcmV0dXJuIHByb2Nlc3Nvcl8gaW5zdGFuY2VvZiBUQXN5bmNQcm9jZXNzb3I7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRTZXJpYWxpemFibGUgeworCisgIC8qKgorICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICoKKyAgICogQHBhcmFtIGlwcm90IElucHV0IHByb3RvY29sCisgICAqLworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCisgICAqCisgICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKaW5kZXggZWUwN2I3OC4uMDBhMzZlZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKQEAgLTE5LDIxICsxOSw3MyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIAogLyoqCiAgKiBBIFRTZXJ2aWNlQ2xpZW50IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIFRTZXJ2aWNlIGltcGxlbWVudGF0aW9uCiAgKiBhY3Jvc3MgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFRTZXJ2aWNlQ2xpZW50IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmljZUNsaWVudCB7CisgIHB1YmxpYyBUU2VydmljZUNsaWVudChUUHJvdG9jb2wgcHJvdCkgeworICAgIHRoaXMocHJvdCwgcHJvdCk7CisgIH0KKworICBwdWJsaWMgVFNlcnZpY2VDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHsKKyAgICBpcHJvdF8gPSBpcHJvdDsKKyAgICBvcHJvdF8gPSBvcHJvdDsKKyAgfQorCisgIHByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOworICBwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsKKworICBwcm90ZWN0ZWQgaW50IHNlcWlkXzsKKwogICAvKioKICAgICogR2V0IHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgaW5wdXQgKHJlYWQpIHByb3RvY29sLgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBpbnB1dCAocmVhZCkgcHJvdG9jb2wuCiAgICAqLwotICBwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKTsKKyAgcHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkgeworICAgIHJldHVybiB0aGlzLmlwcm90XzsKKyAgfQorCiAgIC8qKgogICAgKiBHZXQgdGhlIFRQcm90b2NvbCBiZWluZyB1c2VkIGFzIHRoZSBvdXRwdXQgKHdyaXRlKSBwcm90b2NvbC4KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgb3V0cHV0ICh3cml0ZSkgcHJvdG9jb2wuCiAgICAqLwotICBwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCk7CisgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSB7CisgICAgcmV0dXJuIHRoaXMub3Byb3RfOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2VuZEJhc2UoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlPD8sPz4gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHNlbmRCYXNlKG1ldGhvZE5hbWUsIGFyZ3MsIFRNZXNzYWdlVHlwZS5DQUxMKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNlbmRCYXNlT25ld2F5KFN0cmluZyBtZXRob2ROYW1lLCBUQmFzZTw/LD8+IGFyZ3MpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBzZW5kQmFzZShtZXRob2ROYW1lLCBhcmdzLCBUTWVzc2FnZVR5cGUuT05FV0FZKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZW5kQmFzZShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2U8Pyw/PiBhcmdzLCBieXRlIHR5cGUpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1ldGhvZE5hbWUsIHR5cGUsICsrc2VxaWRfKSk7CisgICAgYXJncy53cml0ZShvcHJvdF8pOworICAgIG9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHJlY2VpdmVCYXNlKFRCYXNlPD8sPz4gcmVzdWx0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgeC5yZWFkKGlwcm90Xyk7CisgICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgIHRocm93IHg7CisgICAgfQorICAgIGlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7CisgICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsCisgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2U6IGV4cGVjdGVkICVkIGJ1dCBnb3QgJWQiLCBtZXRob2ROYW1lLCBzZXFpZF8sIG1zZy5zZXFpZCkpOworICAgIH0KKyAgICByZXN1bHQucmVhZChpcHJvdF8pOworICAgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnRGYWN0b3J5LmphdmEKaW5kZXggODA4ZDVlNi4uOTg4ZTY1NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudEZhY3RvcnkuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICAvKioKICAgICogR2V0IGEgYnJhbmQtbmV3IFQgdXNpbmcgPGk+cHJvdDwvaT4gYXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbC4KICAgICogQHBhcmFtIHByb3QKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIEEgYnJhbmQtbmV3IFQgdXNpbmcgPGk+cHJvdDwvaT4gYXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbC4KICAgICovCiAgIHB1YmxpYyBUIGdldENsaWVudChUUHJvdG9jb2wgcHJvdCk7CiAKQEAgLTM5LDcgKzM5LDcgQEAKICAgICogaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMgbWF5IGJlIHRoZSBzYW1lIGluc3RhbmNlLgogICAgKiBAcGFyYW0gaXByb3QKICAgICogQHBhcmFtIG9wcm90Ci0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiBhIGJyYW5kIG5ldyBUIHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKICAgICovCiAgIHB1YmxpYyBUIGdldENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKaW5kZXggY2ZlOTEwYi4uMWVmMTFkZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQpAQCAtMTcsMjAgKzE3LDI0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVW5pb248VCBleHRlbmRzIFRVbmlvbiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb248VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CiAKICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZV87CiAgIHByb3RlY3RlZCBGIHNldEZpZWxkXzsKQEAgLTM5LDYgKzQzLDEyIEBACiAgICAgc2V0RmllbGRfID0gbnVsbDsKICAgICB2YWx1ZV8gPSBudWxsOwogICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgVFVuaW9uU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgVFVuaW9uVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CiAKICAgcHJvdGVjdGVkIFRVbmlvbihGIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsKICAgICBzZXRGaWVsZFZhbHVlKHNldEZpZWxkLCB2YWx1ZSk7CkBAIC02OSw3ICs3OSw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBNYXAgZGVlcENvcHlNYXAoTWFwPE9iamVjdCwgT2JqZWN0PiBtYXApIHsKLSAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKCk7CisgICAgTWFwIGNvcHkgPSBuZXcgSGFzaE1hcChtYXAuc2l6ZSgpKTsKICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewogICAgICAgY29weS5wdXQoZGVlcENvcHlPYmplY3QoZW50cnkuZ2V0S2V5KCkpLCBkZWVwQ29weU9iamVjdChlbnRyeS5nZXRWYWx1ZSgpKSk7CiAgICAgfQpAQCAtNzcsNyArODcsNyBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGRlZXBDb3B5U2V0KFNldCBzZXQpIHsKLSAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KCk7CisgICAgU2V0IGNvcHkgPSBuZXcgSGFzaFNldChzZXQuc2l6ZSgpKTsKICAgICBmb3IgKE9iamVjdCBvIDogc2V0KSB7CiAgICAgICBjb3B5LmFkZChkZWVwQ29weU9iamVjdChvKSk7CiAgICAgfQpAQCAtMTI1LDI0ICsxMzUsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBzZXRGaWVsZF8gPSBudWxsOwotICAgIHZhbHVlXyA9IG51bGw7Ci0KLSAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKLQotICAgIFRGaWVsZCBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7Ci0KLSAgICB2YWx1ZV8gPSByZWFkVmFsdWUoaXByb3QsIGZpZWxkKTsKLSAgICBpZiAodmFsdWVfICE9IG51bGwpIHsKLSAgICAgIHNldEZpZWxkXyA9IGVudW1Gb3JJZChmaWVsZC5pZCk7Ci0gICAgfQotCi0gICAgaXByb3QucmVhZEZpZWxkRW5kKCk7Ci0gICAgLy8gdGhpcyBpcyBzbyB0aGF0IHdlIHdpbGwgZWF0IHRoZSBzdG9wIGJ5dGUuIHdlIGNvdWxkIHB1dCBhIGNoZWNrIGhlcmUgdG8KLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBpdCBhY3R1YWxseSAqaXMqIHRoZSBzdG9wIGJ5dGUsIGJ1dCBpdCdzIGZhc3RlciB0byBkbyBpdAotICAgIC8vIHRoaXMgd2F5LgotICAgIGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7Ci0gICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoRiBmaWVsZElkLCBPYmplY3QgdmFsdWUpIHsKQEAgLTE1NiwxNSArMTQ5LDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGlmIChnZXRTZXRGaWVsZCgpID09IG51bGwgfHwgZ2V0RmllbGRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSBhIFRVbmlvbiB3aXRoIG5vIHNldCB2YWx1ZSEiKTsKLSAgICB9Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihnZXRTdHJ1Y3REZXNjKCkpOwotICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihnZXRGaWVsZERlc2Moc2V0RmllbGRfKSk7Ci0gICAgd3JpdGVWYWx1ZShvcHJvdCk7Ci0gICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOwotICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOwogICB9CiAKICAgLyoqCkBAIC0xNzksMTEgKzE2NCwxMyBAQAogICAgKiBJbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIHJlYWQgdGhlIHJpZ2h0IHN0dWZmIGZyb20gdGhlIHdpcmUgCiAgICAqIGJhc2VkIG9uIHRoZSBmaWVsZCBoZWFkZXIuIAogICAgKiBAcGFyYW0gZmllbGQKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHJlYWQgT2JqZWN0IGJhc2VkIG9uIHRoZSBmaWVsZCBoZWFkZXIsIGFzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQuCiAgICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb247Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisgIAorICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIFRFeGNlcHRpb247CisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHR1cGxlU2NoZW1lV3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOwogCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBUU3RydWN0IGdldFN0cnVjdERlc2MoKTsKIApAQCAtMjE2LDQgKzIwMyw3NyBAQAogICAgIHRoaXMuc2V0RmllbGRfID0gbnVsbDsKICAgICB0aGlzLnZhbHVlXyA9IG51bGw7CiAgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRVbmlvblN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBUVW5pb25TdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IFRVbmlvblN0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUVW5pb25TdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPFRVbmlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QsIFRVbmlvbiBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC5zZXRGaWVsZF8gPSBudWxsOworICAgICAgc3RydWN0LnZhbHVlXyA9IG51bGw7CisKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICBURmllbGQgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICBzdHJ1Y3QudmFsdWVfID0gc3RydWN0LnN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKGlwcm90LCBmaWVsZCk7CisgICAgICBpZiAoc3RydWN0LnZhbHVlXyAhPSBudWxsKSB7CisgICAgICAgIHN0cnVjdC5zZXRGaWVsZF8gPSBzdHJ1Y3QuZW51bUZvcklkKGZpZWxkLmlkKTsKKyAgICAgIH0KKworICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAvLyB0aGlzIGlzIHNvIHRoYXQgd2Ugd2lsbCBlYXQgdGhlIHN0b3AgYnl0ZS4gd2UgY291bGQgcHV0IGEgY2hlY2sgaGVyZSB0bworICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgaXQgYWN0dWFsbHkgKmlzKiB0aGUgc3RvcCBieXRlLCBidXQgaXQncyBmYXN0ZXIgdG8gZG8gaXQKKyAgICAgIC8vIHRoaXMgd2F5LgorICAgICAgaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QsIFRVbmlvbiBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChzdHJ1Y3QuZ2V0U2V0RmllbGQoKSA9PSBudWxsIHx8IHN0cnVjdC5nZXRGaWVsZFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgYSBUVW5pb24gd2l0aCBubyBzZXQgdmFsdWUhIik7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKHN0cnVjdC5nZXRTdHJ1Y3REZXNjKCkpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKHN0cnVjdC5nZXRGaWVsZERlc2Moc3RydWN0LnNldEZpZWxkXykpOworICAgICAgc3RydWN0LnN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShvcHJvdCk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRVbmlvblR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBUVW5pb25UdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IFRVbmlvblR1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUVW5pb25UdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPFRVbmlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QsIFRVbmlvbiBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC5zZXRGaWVsZF8gPSBudWxsOworICAgICAgc3RydWN0LnZhbHVlXyA9IG51bGw7CisgICAgICBzaG9ydCBmaWVsZElEID0gaXByb3QucmVhZEkxNigpOworICAgICAgc3RydWN0LnZhbHVlXyA9IHN0cnVjdC50dXBsZVNjaGVtZVJlYWRWYWx1ZShpcHJvdCwgZmllbGRJRCk7CisgICAgICBpZiAoc3RydWN0LnZhbHVlXyAhPSBudWxsKSB7CisgICAgICAgIHN0cnVjdC5zZXRGaWVsZF8gPSBzdHJ1Y3QuZW51bUZvcklkKGZpZWxkSUQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCwgVFVuaW9uIHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKHN0cnVjdC5nZXRTZXRGaWVsZCgpID09IG51bGwgfHwgc3RydWN0LmdldEZpZWxkVmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSBhIFRVbmlvbiB3aXRoIG5vIHNldCB2YWx1ZSEiKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlSTE2KHN0cnVjdC5zZXRGaWVsZF8uZ2V0VGhyaWZ0RmllbGRJZCgpKTsKKyAgICAgIHN0cnVjdC50dXBsZVNjaGVtZVdyaXRlVmFsdWUob3Byb3QpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0YjAxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogQW5ub3RhdGlvbiBpbmRpY2F0aW5nIGEgZmllbGQsIG1ldGhvZCByZXR1cm4sIG9yIG1ldGhvZCBwYXJhbWV0ZXIgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAqIFdlIHBhY2thZ2Ugb3VyIG93biBhbm5vdGF0aW9uIHRvIGF2b2lkIGEgbWFuZGF0b3J5IHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LkNMQVNTKQorcHVibGljIEBpbnRlcmZhY2UgTnVsbGFibGUgeworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQppbmRleCAwMDAwNGI3Li40ZWJkZTA3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKQEAgLTE4LDIyICsxOCwzNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jOwogCi0KKy8qKgorICogQSBoYW5kbGVyIGludGVyZmFjZSBhc3luY2hyb25vdXMgY2xpZW50cyBjYW4gaW1wbGVtZW50IHRvIHJlY2VpdmUgZnV0dXJlCisgKiBub3RpY2Ugb2YgdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBjYWxsLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBhc3luY2hyb25vdXNseSBpbnZva2VkIG1ldGhvZC4KKyAqLwogcHVibGljIGludGVyZmFjZSBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKICAgLyoqCiAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlbW90ZSBzaWRlIGhhcyBjb21wbGV0ZWQgaW52b2tpbmcKLSAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Igb25ld2F5IG1ldGhvZCBjYWxscywKLSAgICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB3ZSBoYXZlIGNvbXBsZXRlZCB3cml0aW5nIG91dCB0aGUKLSAgICogcmVxdWVzdC4KLSAgICogQHBhcmFtIHJlc3BvbnNlCisgICAqIHlvdXIgbWV0aG9kIGNhbGwgYW5kIHRoZSByZXN1bHQgaXMgZnVsbHkgcmVhZC4gRm9yIHtAY29kZSBvbmV3YXl9IG1ldGhvZAorICAgKiBjYWxscywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB3ZSBoYXZlIGNvbXBsZXRlZCB3cml0aW5nIG91dAorICAgKiB0aGUgcmVxdWVzdC4KKyAgICoKKyAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFzeW5jaHJvbm91c2x5IGludm9rZWQgbWV0aG9kOworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IGZvciB2b2lkIG1ldGhvZHMgd2hpY2ggaW5jbHVkZXMKKyAgICogICAgICAgICAgICAgICAgIHtAY29kZSBvbmV3YXl9IG1ldGhvZHMuCiAgICAqLwotICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFQgcmVzcG9uc2UpOworICB2b2lkIG9uQ29tcGxldGUoVCByZXNwb25zZSk7CiAKICAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gdW5leHBlY3RlZCBjbGllbnRzaWRlCi0gICAqIGV4Y2VwdGlvbi4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFwcGxpY2F0aW9uLWRlZmluZWQgZXhjZXB0aW9ucyB0aGF0Ci0gICAqIGFwcGVhciBpbiB0aGUgSURMLCBidXQgcmF0aGVyIHRoaW5ncyBsaWtlIElPRXhjZXB0aW9ucy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGVpdGhlciBhbiB1bmV4cGVjdGVkIGNsaWVudC1zaWRlCisgICAqIGV4Y2VwdGlvbiBsaWtlIGFuIElPRXhjZXB0aW9uIG9yIGVsc2Ugd2hlbiB0aGUgcmVtb3RlIG1ldGhvZCByYWlzZXMgYW4KKyAgICogZXhjZXB0aW9uLCBlaXRoZXIgZGVjbGFyZWQgaW4gdGhlIElETCBvciBkdWUgdG8gYW4gdW5leHBlY3RlZCBzZXJ2ZXItc2lkZQorICAgKiBlcnJvci4KKyAgICoKKyAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgdGhlIHRoZSBhc3luY2hyb25vdXMKKyAgICogICAgICAgICAgICAgICAgICBtZXRob2QgY2FsbCwgbWF5IGJlIGEgbG9jYWwgZXhjZXB0aW9uIG9yIGFuIHVubWFyc2hhbGxlZAorICAgKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBleGNlcHRpb24uCiAgICAqLwotICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pOworICB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbik7CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKaW5kZXggNDY4YmM2ZS4uMDA1MDE4YSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQpAQCAtMjIsNjUgKzIyLDY1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFRBc3luY0NsaWVudCB7Ci0gIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKLSAgcHJvdGVjdGVkIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQ7Ci0gIHByb3RlY3RlZCBmaW5hbCBUQXN5bmNDbGllbnRNYW5hZ2VyIG1hbmFnZXI7Ci0gIHByb3RlY3RlZCBUQXN5bmNNZXRob2RDYWxsIGN1cnJlbnRNZXRob2Q7Ci0gIHByaXZhdGUgRXhjZXB0aW9uIGVycm9yOwotICBwcml2YXRlIGxvbmcgdGltZW91dDsKKyAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgX19fcHJvdG9jb2xGYWN0b3J5OworICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IF9fX3RyYW5zcG9ydDsKKyAgcHJvdGVjdGVkIGZpbmFsIFRBc3luY0NsaWVudE1hbmFnZXIgX19fbWFuYWdlcjsKKyAgcHJvdGVjdGVkIFRBc3luY01ldGhvZENhbGwgX19fY3VycmVudE1ldGhvZDsKKyAgcHJpdmF0ZSBFeGNlcHRpb24gX19fZXJyb3I7CisgIHByaXZhdGUgbG9uZyBfX190aW1lb3V0OwogCiAgIHB1YmxpYyBUQXN5bmNDbGllbnQoVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFRBc3luY0NsaWVudE1hbmFnZXIgbWFuYWdlciwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgIHRoaXMocHJvdG9jb2xGYWN0b3J5LCBtYW5hZ2VyLCB0cmFuc3BvcnQsIDApOwogICB9CiAKICAgcHVibGljIFRBc3luY0NsaWVudChUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgVEFzeW5jQ2xpZW50TWFuYWdlciBtYW5hZ2VyLCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0LCBsb25nIHRpbWVvdXQpIHsKLSAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsKLSAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgdGhpcy5fX19wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7CisgICAgdGhpcy5fX19tYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB0aGlzLl9fX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB0aGlzLl9fX3RpbWVvdXQgPSB0aW1lb3V0OwogICB9CiAKICAgcHVibGljIFRQcm90b2NvbEZhY3RvcnkgZ2V0UHJvdG9jb2xGYWN0b3J5KCkgewotICAgIHJldHVybiBwcm90b2NvbEZhY3Rvcnk7CisgICAgcmV0dXJuIF9fX3Byb3RvY29sRmFjdG9yeTsKICAgfQogCiAgIHB1YmxpYyBsb25nIGdldFRpbWVvdXQoKSB7Ci0gICAgcmV0dXJuIHRpbWVvdXQ7CisgICAgcmV0dXJuIF9fX3RpbWVvdXQ7CiAgIH0KIAogICBwdWJsaWMgYm9vbGVhbiBoYXNUaW1lb3V0KCkgewotICAgIHJldHVybiB0aW1lb3V0ID4gMDsKKyAgICByZXR1cm4gX19fdGltZW91dCA+IDA7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGxvbmcgdGltZW91dCkgewotICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgdGhpcy5fX190aW1lb3V0ID0gdGltZW91dDsKICAgfQogCiAgIC8qKgogICAgKiBJcyB0aGUgY2xpZW50IGluIGFuIGVycm9yIHN0YXRlPwotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gSWYgY2xpZW50IGluIGFuIGVycm9yIHN0YXRlPwogICAgKi8KICAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0gICAgcmV0dXJuIGVycm9yICE9IG51bGw7CisgICAgcmV0dXJuIF9fX2Vycm9yICE9IG51bGw7CiAgIH0KIAogICAvKioKICAgICogR2V0IHRoZSBjbGllbnQncyBlcnJvciAtIHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gR2V0IHRoZSBjbGllbnQncyBlcnJvci4gPHA+IHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgogICAgKi8KICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFcnJvcigpIHsKLSAgICByZXR1cm4gZXJyb3I7CisgICAgcmV0dXJuIF9fX2Vycm9yOwogICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZWFkeSgpIHsKICAgICAvLyBFbnN1cmUgd2UgYXJlIG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nIGEgbWV0aG9kCi0gICAgaWYgKGN1cnJlbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IGlzIGN1cnJlbnRseSBleGVjdXRpbmcgYW5vdGhlciBtZXRob2Q6ICIgKyBjdXJyZW50TWV0aG9kLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICBpZiAoX19fY3VycmVudE1ldGhvZCAhPSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbGllbnQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBhbm90aGVyIG1ldGhvZDogIiArIF9fX2N1cnJlbnRNZXRob2QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogICAgIH0KIAogICAgIC8vIEVuc3VyZSB3ZSdyZSBub3QgaW4gYW4gZXJyb3Igc3RhdGUKLSAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IGhhcyBhbiBlcnJvciEiLCBlcnJvcik7CisgICAgaWYgKF9fX2Vycm9yICE9IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsaWVudCBoYXMgYW4gZXJyb3IhIiwgX19fZXJyb3IpOwogICAgIH0KICAgfQogCkBAIC04OCwxNSArODgsMTUgQEAKICAgICogQ2FsbGVkIGJ5IGRlbGVnYXRlIG1ldGhvZCB3aGVuIGZpbmlzaGVkCiAgICAqLwogICBwcm90ZWN0ZWQgdm9pZCBvbkNvbXBsZXRlKCkgewotICAgIGN1cnJlbnRNZXRob2QgPSBudWxsOworICAgIF9fX2N1cnJlbnRNZXRob2QgPSBudWxsOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCBieSBkZWxlZ2F0ZSBtZXRob2Qgb24gZXJyb3IKICAgICovCiAgIHByb3RlY3RlZCB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgIHRyYW5zcG9ydC5jbG9zZSgpOwotICAgIGN1cnJlbnRNZXRob2QgPSBudWxsOwotICAgIGVycm9yID0gZXhjZXB0aW9uOworICAgIF9fX3RyYW5zcG9ydC5jbG9zZSgpOworICAgIF9fX2N1cnJlbnRNZXRob2QgPSBudWxsOworICAgIF9fX2Vycm9yID0gZXhjZXB0aW9uOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudE1hbmFnZXIuamF2YQppbmRleCA5OGY3MTk0Li5jMDdjY2Q1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZFNlbGVjdG9yRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKQEAgLTExNiw2ICsxMTcsMTIgQEAKICAgICAgICAgICBMT0dHRVIuZXJyb3IoIklnbm9yaW5nIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBTZWxlY3RUaHJlYWQiLCBleGNlcHRpb24pOwogICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IGNsb3NlIHNlbGVjdG9yLiBUaGlzIG1heSByZXN1bHQgaW4gbGVha2VkIHJlc291cmNlcyEiLCBleCk7CisgICAgICB9CiAgICAgfQogCiAgICAgLy8gVHJhbnNpdGlvbiBtZXRob2RzIGZvciByZWFkeSBrZXlzCkBAIC0xODIsNyArMTg5LDcgQEAKICAgfQogCiAgIC8qKiBDb21wYXJhdG9yIHVzZWQgaW4gVHJlZVNldCAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUQXN5bmNNZXRob2RDYWxsVGltZW91dENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFRBc3luY01ldGhvZENhbGw+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbFRpbWVvdXRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxUQXN5bmNNZXRob2RDYWxsPiwgU2VyaWFsaXphYmxlIHsKICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVEFzeW5jTWV0aG9kQ2FsbCBsZWZ0LCBUQXN5bmNNZXRob2RDYWxsIHJpZ2h0KSB7CiAgICAgICBpZiAobGVmdC5nZXRUaW1lb3V0VGltZXN0YW1wKCkgPT0gcmlnaHQuZ2V0VGltZW91dFRpbWVzdGFtcCgpKSB7CiAgICAgICAgIHJldHVybiAoaW50KShsZWZ0LmdldFNlcXVlbmNlSWQoKSAtIHJpZ2h0LmdldFNlcXVlbmNlSWQoKSk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQppbmRleCBmY2Q1MGVhLi4zYmYxNzQ3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKQEAgLTMzLDExICszMywxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCiAvKioKLSAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbAorICogRW5jYXBzdWxhdGVzIGFuIGFzeW5jIG1ldGhvZCBjYWxsLgorICogPHA+CiAgKiBOZWVkIHRvIGdlbmVyYXRlOgotICogICAtIHByaXZhdGUgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkKLSAqICAgLSBwdWJsaWMgVCBnZXRSZXN1bHQoKSB0aHJvd3MgPEV4Y2VwdGlvbl8xPiwgPEV4Y2VwdGlvbl8yPiwgLi4uCi0gKiBAcGFyYW0gPFQ+CisgKiA8dWw+CisgKiAgIDxsaT5wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCk8L2xpPgorICogICA8bGk+cHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzICZsdDtFeGNlcHRpb25fMSZndDssICZsdDtFeGNlcHRpb25fMiZndDssIC4uLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBlbmNhcHN1bGF0ZWQgbWV0aG9kIGNhbGwuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQXN5bmNNZXRob2RDYWxsPFQ+IHsKIApAQCAtNjUsNyArNjksOCBAQAogICBwcml2YXRlIGZpbmFsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gY2FsbGJhY2s7CiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc09uZXdheTsKICAgcHJpdmF0ZSBsb25nIHNlcXVlbmNlSWQ7Ci0gIAorICBwcml2YXRlIGZpbmFsIGxvbmcgdGltZW91dDsKKwogICBwcml2YXRlIEJ5dGVCdWZmZXIgc2l6ZUJ1ZmZlcjsKICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gc2l6ZUJ1ZmZlckFycmF5ID0gbmV3IGJ5dGVbNF07CiAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBmcmFtZUJ1ZmZlcjsKQEAgLTc5LDYgKzg0LDcgQEAKICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKICAgICB0aGlzLmlzT25ld2F5ID0gaXNPbmV3YXk7CiAgICAgdGhpcy5zZXF1ZW5jZUlkID0gVEFzeW5jTWV0aG9kQ2FsbC5zZXF1ZW5jZUlkQ291bnRlci5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICB0aGlzLnRpbWVvdXQgPSBjbGllbnQuZ2V0VGltZW91dCgpOwogICB9CiAKICAgcHJvdGVjdGVkIFN0YXRlIGdldFN0YXRlKCkgewpAQCAtMTAyLDE1ICsxMDgsMTcgQEAKICAgfQogICAKICAgcHVibGljIGJvb2xlYW4gaGFzVGltZW91dCgpIHsKLSAgICByZXR1cm4gY2xpZW50Lmhhc1RpbWVvdXQoKTsKKyAgICByZXR1cm4gdGltZW91dCA+IDA7CiAgIH0KICAgCiAgIHB1YmxpYyBsb25nIGdldFRpbWVvdXRUaW1lc3RhbXAoKSB7Ci0gICAgcmV0dXJuIGNsaWVudC5nZXRUaW1lb3V0KCkgKyBzdGFydFRpbWU7CisgICAgcmV0dXJuIHRpbWVvdXQgKyBzdGFydFRpbWU7CiAgIH0KIAogICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFRFeGNlcHRpb247CiAKKyAgcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKwogICAvKioKICAgICogSW5pdGlhbGl6ZSBidWZmZXJzLgogICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gaWYgYnVmZmVyIGluaXRpYWxpemF0aW9uIGZhaWxzCkBAIC0xNjUsNyArMTczLDcgQEAKICAgICogc2VsZWN0IGludGVyZXN0cyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGNvbmN1cnJlbmN5LgogICAgKiBAcGFyYW0ga2V5CiAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0cmFuc2l0aW9uKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgdm9pZCB0cmFuc2l0aW9uKFNlbGVjdGlvbktleSBrZXkpIHsKICAgICAvLyBFbnN1cmUga2V5IGlzIHZhbGlkCiAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSB7CiAgICAgICBrZXkuY2FuY2VsKCk7CkBAIC0yMjMsOCArMjMxLDE0IEBACiAgICAga2V5LmludGVyZXN0T3BzKDApOwogICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBUQXN5bmNNZXRob2QgaW5zdGFuY2UgZG9lc24ndCBoYW5nIGFyb3VuZAogICAgIGtleS5hdHRhY2gobnVsbCk7Ci0gICAgY2xpZW50Lm9uQ29tcGxldGUoKTsKLSAgICBjYWxsYmFjay5vbkNvbXBsZXRlKChUKXRoaXMpOworICAgIHRyeSB7CisgICAgICBUIHJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7CisgICAgICBjbGllbnQub25Db21wbGV0ZSgpOworICAgICAgY2FsbGJhY2sub25Db21wbGV0ZShyZXN1bHQpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICBvbkVycm9yKGUpOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgdm9pZCBkb1JlYWRpbmdSZXNwb25zZVNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCBiNjM0MjkxLi40NDVmN2U0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKICAgfQogICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzLCBNYXA8PyBleHRlbmRzIFRGaWVsZElkRW51bSwgRmllbGRNZXRhRGF0YT4gbWFwKXsKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcywgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNTUsNyArNTUsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzKXsKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzKXsKICAgICBpZiAoIXN0cnVjdE1hcC5jb250YWluc0tleShzQ2xhc3MpKXsgLy8gTG9hZCBjbGFzcyBpZiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQKICAgICAgIHRyeXsKICAgICAgICAgc0NsYXNzLm5ld0luc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Nob3J0U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY1OTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Nob3J0U3RhY2suamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBTaG9ydFN0YWNrIGlzIGEgc2hvcnQtc3BlY2lmaWMgU3RhY2sgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmb3IgdGhlIGV4cHJlc3MKKyAqIHB1cnBvc2Ugb2YgdmVyeSBmYXN0IG9wZXJhdGlvbnMgb24gVENvbXBhY3RQcm90b2NvbCdzIGZpZWxkIGlkIHN0YWNrLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhdCBsZWFzdCAxMHggZmFzdGVyIHRoYW4gamF2YS51dGlsLlN0YWNrLgorICovCitjbGFzcyBTaG9ydFN0YWNrIHsKKworICBwcml2YXRlIHNob3J0W10gdmVjdG9yOworCisgIC8qKiBBbHdheXMgcG9pbnRzIHRvIHRoZSBuZXh0IGxvY2F0aW9uICovCisgIHByaXZhdGUgaW50IHRvcCA9IDA7CisKKyAgcHVibGljIFNob3J0U3RhY2soaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHZlY3RvciA9IG5ldyBzaG9ydFtpbml0aWFsQ2FwYWNpdHldOworICB9CisKKyAgcHVibGljIHNob3J0IHBvcCgpIHsKKyAgICByZXR1cm4gdmVjdG9yWy0tdG9wXTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1c2goc2hvcnQgcHVzaGVkKSB7CisgICAgaWYgKHZlY3Rvci5sZW5ndGggPT0gdG9wKSB7CisgICAgICBncm93KCk7CisgICAgfQorICAgIHZlY3Rvclt0b3ArK10gPSBwdXNoZWQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKKyAgICB2ZWN0b3IgPSBBcnJheXMuY29weU9mKHZlY3RvciwgdmVjdG9yLmxlbmd0aCA8PCAxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHRvcCA9IDA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJvb2xlYW4gaXNUb3AgPSAoaSA9PSAodG9wIC0gMSkpOworICAgICAgc2hvcnQgdmFsdWUgPSB2ZWN0b3JbaV07CisgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgfQorICAgICAgaWYgKGlzVG9wKSB7CisgICAgICAgIHNiLmFwcGVuZCgiPj4iKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiPDwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIHNiLmFwcGVuZCgiXT4iKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhCmluZGV4IDM3YTlmZDkuLmFiZmM5NjUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKQEAgLTU2LDI0ICs1NiwyMyBAQAogICAgIGlmIChsZW4gPT0gMykgewogICAgICAgZHN0W2RzdE9mZiArIDFdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICsgKHNyY1tzcmNPZmYrMV0gPj4gNCkpICYgMHgzRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOwogICAgICAgZHN0W2RzdE9mZiArIDJdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYrMV0gPDwgMikgKyAoc3JjW3NyY09mZisyXSA+PiA2KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYrMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZisyXSA+PiA2KSAmIDB4MDMpKTsKICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9CiAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoc3JjW3NyY09mZisyXSAmIDB4M0YpOwogICAgIH0KICAgICBlbHNlIGlmIChsZW4gPT0gMikgewogICAgICAgZHN0W2RzdE9mZisxXSA9CiAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZisxXSA+PiA0KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOwogICAgICAgZHN0W2RzdE9mZiArIDJdID0KLSAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0YpOwotCisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmYrMV0gPDwgMikgJiAweDNDKTsKICAgICB9CiAgICAgZWxzZSB7IC8vIGxlbiA9PSAxKSB7CiAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQotICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4M0YpOworICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKaW5kZXggOTEzNTczYi4uNzkyNGUyZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKQEAgLTMxLDQ0ICszMSw1OSBAQAogICovCiBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBOT19MRU5HVEhfTElNSVQgPSAtMTsKIAogICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwogICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwogCi0gIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXyA9IHRydWU7CisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgZm9yCisgICAqIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMgKHN1Y2ggYXMgc3RyaW5ncyBvciBiaW5hcnkpIG9yIHtAbGluayAjTk9fTEVOR1RIX0xJTUlUfSBmb3IKKyAgICogdW5saW1pdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKIAotICBwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1JlYWRMZW5ndGhfID0gZmFsc2U7CisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZCBmcm9tIHRoZSBuZXR3b3JrIGZvcgorICAgKiBjb250YWluZXJzIChtYXBzLCBzZXRzLCBsaXN0cyksIG9yIHtAbGluayAjTk9fTEVOR1RIX0xJTUlUfSBmb3IgdW5saW1pdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RSZWFkXzsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfOworCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGlub3V0VGVtcCA9IG5ldyBieXRlWzhdOwogCiAgIC8qKgogICAgKiBGYWN0b3J5CiAgICAqLwogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RSZWFkXyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXyA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoXzsKKyAgICBwcm90ZWN0ZWQgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdF87CisgICAgcHJvdGVjdGVkIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOworICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfOworICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXzsKIAogICAgIHB1YmxpYyBGYWN0b3J5KCkgewogICAgICAgdGhpcyhmYWxzZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgcHVibGljIEZhY3RvcnkoYm9vbGVhbiBzdHJpY3RSZWFkLCBib29sZWFuIHN0cmljdFdyaXRlKSB7Ci0gICAgICB0aGlzKHN0cmljdFJlYWQsIHN0cmljdFdyaXRlLCAwKTsKKyAgICAgIHRoaXMoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUsIGludCByZWFkTGVuZ3RoKSB7CisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcyhmYWxzZSwgdHJ1ZSwgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQpIHsKKyAgICAgIHN0cmluZ0xlbmd0aExpbWl0XyA9IHN0cmluZ0xlbmd0aExpbWl0OworICAgICAgY29udGFpbmVyTGVuZ3RoTGltaXRfID0gY29udGFpbmVyTGVuZ3RoTGltaXQ7CiAgICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CiAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKLSAgICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKICAgICB9CiAKICAgICBwdWJsaWMgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKLSAgICAgIFRCaW5hcnlQcm90b2NvbCBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOwotICAgICAgaWYgKHJlYWRMZW5ndGhfICE9IDApIHsKLSAgICAgICAgcHJvdG8uc2V0UmVhZExlbmd0aChyZWFkTGVuZ3RoXyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcHJvdG87CisgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaW5nTGVuZ3RoTGltaXRfLCBjb250YWluZXJMZW5ndGhMaW1pdF8sIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOwogICAgIH0KICAgfQogCkBAIC04MCwxMSArOTUsMjIgQEAKICAgfQogCiAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbGVhbiBzdHJpY3RSZWFkLCBib29sZWFuIHN0cmljdFdyaXRlKSB7CisgICAgdGhpcyh0cmFucywgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKKyAgfQorCisgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgIHRoaXModHJhbnMsIHN0cmluZ0xlbmd0aExpbWl0LCBjb250YWluZXJMZW5ndGhMaW1pdCwgZmFsc2UsIHRydWUpOworICB9CisKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0LCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKICAgICBzdXBlcih0cmFucyk7CisgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgY29udGFpbmVyTGVuZ3RoTGltaXRfID0gY29udGFpbmVyTGVuZ3RoTGltaXQ7CiAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwogICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoc3RyaWN0V3JpdGVfKSB7CiAgICAgICBpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKQEAgLTk4LDEwMCArMTI0LDExMiBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShmaWVsZC50eXBlKTsKICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShtYXAua2V5VHlwZSk7CiAgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOwogICAgIHdyaXRlSTMyKG1hcC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKICAgICB3cml0ZUkzMihsaXN0LnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoc2V0LmVsZW1UeXBlKTsKICAgICB3cml0ZUkzMihzZXQuc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoYiA/IChieXRlKTEgOiAoYnl0ZSkwKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZSBbXSBib3V0ID0gbmV3IGJ5dGVbMV07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYm91dFswXSA9IGI7Ci0gICAgdHJhbnNfLndyaXRlKGJvdXQsIDAsIDEpOworICAgIGlub3V0VGVtcFswXSA9IGI7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgMSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMTZvdXQgPSBuZXcgYnl0ZVsyXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGkxNm91dFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7Ci0gICAgaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7Ci0gICAgdHJhbnNfLndyaXRlKGkxNm91dCwgMCwgMik7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2ID4+IDgpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMTYpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCAyKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkzMm91dCA9IG5ldyBieXRlWzRdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOwotICAgIGkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOwotICAgIGkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7Ci0gICAgaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyKSk7Ci0gICAgdHJhbnNfLndyaXRlKGkzMm91dCwgMCwgNCk7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7CisgICAgaW5vdXRUZW1wWzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKKyAgICBpbm91dFRlbXBbM10gPSAoYnl0ZSkoMHhmZiAmIChpMzIpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCA0KTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGk2NG91dCA9IG5ldyBieXRlWzhdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKLSAgICBpNjRvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKLSAgICBpNjRvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKLSAgICBpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKLSAgICBpNjRvdXRbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKLSAgICBpNjRvdXRbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKLSAgICBpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOwotICAgIGk2NG91dFs3XSA9IChieXRlKSgweGZmICYgKGk2NCkpOwotICAgIHRyYW5zXy53cml0ZShpNjRvdXQsIDAsIDgpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOworICAgIGlub3V0VGVtcFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOworICAgIGlub3V0VGVtcFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOworICAgIGlub3V0VGVtcFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOworICAgIGlub3V0VGVtcFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOworICAgIGlub3V0VGVtcFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzddID0gKGJ5dGUpKDB4ZmYgJiAoaTY0KSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgOCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTY0KERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YikpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGRhdCA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSTMyKGRhdC5sZW5ndGgpOwotICAgICAgdHJhbnNfLndyaXRlKGRhdCwgMCwgZGF0Lmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSTMyKGRhdC5sZW5ndGgpOworICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaW50IGxlbmd0aCA9IGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKTsKKyAgICBpbnQgbGVuZ3RoID0gYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKTsKICAgICB3cml0ZUkzMihsZW5ndGgpOwogICAgIHRyYW5zXy53cml0ZShiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwgbGVuZ3RoKTsKICAgfQpAQCAtMjAwLDYgKzIzOCw3IEBACiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogICAgIGlmIChzaXplIDwgMCkgewpAQCAtMjE2LDU4ICsyNTUsNzYgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHR5cGUgPSByZWFkQnl0ZSgpOwogICAgIHNob3J0IGlkID0gdHlwZSA9PSBUVHlwZS5TVE9QID8gMCA6IHJlYWRJMTYoKTsKICAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBUTWFwIG1hcCA9IG5ldyBUTWFwKHJlYWRCeXRlKCksIHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKG1hcC5zaXplKTsKKyAgICByZXR1cm4gbWFwOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobGlzdC5zaXplKTsKKyAgICByZXR1cm4gbGlzdDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgVFNldChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRTZXQgc2V0ID0gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2V0LnNpemUpOworICAgIHJldHVybiBzZXQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gKHJlYWRCeXRlKCkgPT0gMSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDEpIHsKICAgICAgIGJ5dGUgYiA9IHRyYW5zXy5nZXRCdWZmZXIoKVt0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKV07CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigxKTsKICAgICAgIHJldHVybiBiOwogICAgIH0KLSAgICByZWFkQWxsKGJpbiwgMCwgMSk7Ci0gICAgcmV0dXJuIGJpblswXTsKKyAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgMSk7CisgICAgcmV0dXJuIGlub3V0VGVtcFswXTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkxNnJkID0gbmV3IGJ5dGVbMl07CisgIEBPdmVycmlkZQogICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTE2cmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDIpIHsKQEAgLTI3NSw3ICszMzIsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigyKTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpMTZyZCwgMCwgMik7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgMik7CiAgICAgfQogCiAgICAgcmV0dXJuCkBAIC0yODQsOSArMzQxLDkgQEAKICAgICAgICAoKGJ1ZltvZmYrMV0gJiAweGZmKSkpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTMycmQgPSBuZXcgYnl0ZVs0XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTMycmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDQpIHsKQEAgLTI5NCw3ICszNTEsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcig0KTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpMzJyZCwgMCwgNCk7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgNCk7CiAgICAgfQogICAgIHJldHVybgogICAgICAgKChidWZbb2ZmXSAmIDB4ZmYpIDw8IDI0KSB8CkBAIC0zMDMsOSArMzYwLDkgQEAKICAgICAgICgoYnVmW29mZiszXSAmIDB4ZmYpKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGk2NHJkID0gbmV3IGJ5dGVbOF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpNjRyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gOCkgewpAQCAtMzEzLDcgKzM3MCw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDgpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGk2NHJkLCAwLCA4KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA4KTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTMyNyw0MCArMzg0LDM5IEBACiAgICAgICAoKGxvbmcpKGJ1ZltvZmYrN10gJiAweGZmKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkSTY0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKIAorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKwogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IHNpemUpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIHJldHVybiBzOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgICAgfQorICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksCisgICAgICAgICAgc2l6ZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKKyAgICAgIHJldHVybiBzOwogICAgIH0KIAogICAgIHJldHVybiByZWFkU3RyaW5nQm9keShzaXplKTsKICAgfQogCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZ0JvZHkoaW50IHNpemUpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOwotICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotICAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgoc2l6ZSk7CisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwotICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKKworICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IHNpemUpIHsKICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgc2l6ZSk7CkBAIC0zNzMsMjYgKzQyOSwyOSBAQAogICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnVmKTsKICAgfQogCisgIHByaXZhdGUgdm9pZCBjaGVja1N0cmluZ1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgICBpZiAoc3RyaW5nTGVuZ3RoTGltaXRfICE9IE5PX0xFTkdUSF9MSU1JVCAmJiBsZW5ndGggPiBzdHJpbmdMZW5ndGhMaW1pdF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgICBpZiAoY29udGFpbmVyTGVuZ3RoTGltaXRfICE9IE5PX0xFTkdUSF9MSU1JVCAmJiBsZW5ndGggPiBjb250YWluZXJMZW5ndGhMaW1pdF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgfQorCiAgIHByaXZhdGUgaW50IHJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGNoZWNrUmVhZExlbmd0aChsZW4pOwogICAgIHJldHVybiB0cmFuc18ucmVhZEFsbChidWYsIG9mZiwgbGVuKTsKICAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlYWRMZW5ndGgoaW50IHJlYWRMZW5ndGgpIHsKLSAgICByZWFkTGVuZ3RoXyA9IHJlYWRMZW5ndGg7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoXyA9IHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGVja1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTmVnYXRpdmUgbGVuZ3RoOiAiICsgbGVuZ3RoKTsKLSAgICB9Ci0gICAgaWYgKGNoZWNrUmVhZExlbmd0aF8pIHsKLSAgICAgIHJlYWRMZW5ndGhfIC09IGxlbmd0aDsKLSAgICAgIGlmIChyZWFkTGVuZ3RoXyA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0YzJjZmMwLi5lZTA1ODY5Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQpAQCAtMjIsMjEgKzIyLDI1IEBACiAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TaG9ydFN0YWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiAKIC8qKgogICogVENvbXBhY3RQcm90b2NvbDIgaXMgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXBhY3QgcHJvdG9jb2wgc3BlY2lmaWVkCi0gKiBpbiBUSFJJRlQtMTEwLiBUaGUgZnVuZGFtZW50YWwgYXBwcm9hY2ggdG8gcmVkdWNpbmcgdGhlIG92ZXJoZWFkIG9mIAorICogaW4gVEhSSUZULTExMC4gVGhlIGZ1bmRhbWVudGFsIGFwcHJvYWNoIHRvIHJlZHVjaW5nIHRoZSBvdmVyaGVhZCBvZgogICogc3RydWN0dXJlcyBpcyBhKSB1c2UgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgYikgbWFrZQotICogdXNlIG9mIHVudXNlZCBiaXRzIHdoZXJldmVyIHBvc3NpYmxlLiBZb3VyIHNhdmluZ3Mgd2lsbCBvYnZpb3VzbHkgdmFyeSAKLSAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyBtYWtldXAgb2YgeW91ciBzdHJ1Y3RzLCBidXQgaW4gZ2VuZXJhbCwgdGhlIG1vcmUgCisgKiB1c2Ugb2YgdW51c2VkIGJpdHMgd2hlcmV2ZXIgcG9zc2libGUuIFlvdXIgc2F2aW5ncyB3aWxsIG9idmlvdXNseSB2YXJ5CisgKiBiYXNlZCBvbiB0aGUgc3BlY2lmaWMgbWFrZXVwIG9mIHlvdXIgc3RydWN0cywgYnV0IGluIGdlbmVyYWwsIHRoZSBtb3JlCiAgKiBmaWVsZHMsIG5lc3RlZCBzdHJ1Y3R1cmVzLCBzaG9ydCBzdHJpbmdzIGFuZCBjb2xsZWN0aW9ucywgYW5kIGxvdy12YWx1ZSBpMzIKICAqIGFuZCBpNjQgZmllbGRzIHlvdSBoYXZlLCB0aGUgbW9yZSBiZW5lZml0IHlvdSdsbCBzZWUuCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKK3B1YmxpYyBjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZVtdIEVNUFRZX0JZVEVTID0gbmV3IGJ5dGVbMF07CisgIHByaXZhdGUgZmluYWwgc3RhdGljIEJ5dGVCdWZmZXIgRU1QVFlfQlVGRkVSID0gQnl0ZUJ1ZmZlci53cmFwKEVNUFRZX0JZVEVTKTsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIE5PX0xFTkdUSF9MSU1JVCA9IC0xOwogCiAgIHByaXZhdGUgZmluYWwgc3RhdGljIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCIiKTsKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVEZpZWxkIFRTVE9QID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU1RPUCwgKHNob3J0KTApOwpAQCAtNjIsMTAgKzY2LDI0IEBACiAgICAqIFRQcm90b2NvbEZhY3RvcnkgdGhhdCBwcm9kdWNlcyBUQ29tcGFjdFByb3RvY29scy4KICAgICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICAgIHB1YmxpYyBGYWN0b3J5KCkge30KKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisKKyAgICBwdWJsaWMgRmFjdG9yeSgpIHsKKyAgICAgIHRoaXMoTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQpIHsKKyAgICAgIHRoaXMoc3RyaW5nTGVuZ3RoTGltaXQsIE5PX0xFTkdUSF9MSU1JVCk7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcy5jb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKKyAgICAgIHRoaXMuc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgfQogCiAgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdF8sIGNvbnRhaW5lckxlbmd0aExpbWl0Xyk7CiAgICAgfQogICB9CiAKQEAgLTczLDYgKzkxLDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OID0gMTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFX01BU0sgPSAoYnl0ZSkweEUwOyAvLyAxMTEwIDAwMDAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CiAKICAgLyoqCkBAIC05Myw3ICsxMTIsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFJVQ1QgICAgICAgICA9IDB4MEM7CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAogICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgogICAgKi8KQEAgLTEwMiwyNCArMTIxLDcxIEBACiAgIHByaXZhdGUgc2hvcnQgbGFzdEZpZWxkSWRfID0gMDsKIAogICAvKioKLSAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuIAorICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgogICAgKi8KICAgcHJpdmF0ZSBURmllbGQgYm9vbGVhbkZpZWxkXyA9IG51bGw7CiAKICAgLyoqCi0gICAqIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbiAKKyAgICogSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCiAgICAqIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgogICAgKi8KICAgcHJpdmF0ZSBCb29sZWFuIGJvb2xWYWx1ZV8gPSBudWxsOwogCiAgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgZm9yCisgICAqIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMgKHN1Y2ggYXMgc3RyaW5ncyBvciBiaW5hcnkpIG9yIHtAbGluayAjTk9fTEVOR1RIX0xJTUlUfSBmb3IKKyAgICogdW5saW1pdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQgZnJvbSB0aGUgbmV0d29yayBmb3IKKyAgICogY29udGFpbmVycyAobWFwcywgc2V0cywgbGlzdHMpLCBvciB7QGxpbmsgI05PX0xFTkdUSF9MSU1JVH0gZm9yIHVubGltaXRlZC4KKyAgICovCisgIHByaXZhdGUgZmluYWwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisKKyAgLyoqCisgICAqIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgdmFyaW91cyBvcGVyYXRpb25zIHRoYXQgd291bGQgb3RoZXJ3aXNlIHJlcXVpcmUgYQorICAgKiBzbWFsbCBhbGxvY2F0aW9uLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcCA9IG5ldyBieXRlWzEwXTsKKworICAvKioKKyAgICogQ3JlYXRlIGEgVENvbXBhY3RQcm90b2NvbC4KKyAgICoKKyAgICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgVFRyYW5zcG9ydCBvYmplY3QgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvLgorICAgKiBAcGFyYW0gc3RyaW5nTGVuZ3RoTGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZm9yCisgICAqICAgICB2YXJpYWJsZS1sZW5ndGggZmllbGRzLgorICAgKiBAcGFyYW0gY29udGFpbmVyTGVuZ3RoTGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQKKyAgICogICAgIGZvciBjb250YWluZXJzLgorICAgKi8KKyAgcHVibGljIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIHRoaXMuc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgdGhpcy5jb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCisgICAqIEBwYXJhbSBzdHJpbmdMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmb3IKKyAgICogICAgIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuCisgICAqIEBkZXByZWNhdGVkIFVzZSBjb25zdHJ1Y3RvciBzcGVjaWZ5aW5nIGJvdGggc3RyaW5nIGxpbWl0IGFuZCBjb250YWluZXIgbGltaXQgaW5zdGVhZAorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQpIHsKKyAgICB0aGlzKHRyYW5zcG9ydCwgc3RyaW5nTGVuZ3RoTGltaXQsIE5PX0xFTkdUSF9MSU1JVCk7CisgIH0KKworICAvKioKICAgICogQ3JlYXRlIGEgVENvbXBhY3RQcm90b2NvbC4KICAgICoKICAgICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgVFRyYW5zcG9ydCBvYmplY3QgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvLgogICAgKi8KICAgcHVibGljIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKLSAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIHRoaXModHJhbnNwb3J0LCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTEzNiw2ICsyMDIsNyBAQAogICAgKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCiAgICAqIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGVEaXJlY3QoUFJPVE9DT0xfSUQpOwogICAgIHdyaXRlQnl0ZURpcmVjdCgoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKQEAgLTE0NCwxMCArMjExLDExIEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIAorICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCiAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBsYXN0RmllbGRfLnB1c2gobGFzdEZpZWxkSWRfKTsKICAgICBsYXN0RmllbGRJZF8gPSAwOwpAQCAtMTY0LDEwICsyMzIsMTAgQEAKIAogICAvKioKICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKICAgICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQogICAgKiBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgKi8gCisgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkgewogICAgICAgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KQEAgLTE3OCw4ICsyNDYsOCBAQAogICB9CiAKICAgLyoqCi0gICAqIFRoZSB3b3JraG9yc2Ugb2Ygd3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhIAotICAgKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSAKKyAgICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKKyAgICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKICAgICogYm9vbGVhbiBmaWVsZCBjYXNlLgogICAgKi8KICAgcHJpdmF0ZSB2b2lkIHdyaXRlRmllbGRCZWdpbkludGVybmFsKFRGaWVsZCBmaWVsZCwgYnl0ZSB0eXBlT3ZlcnJpZGUpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTIxMCw3ICsyNzgsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlIAorICAgKiBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQogICAgKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yMjEsOCArMjg5LDggQEAKICAgICAgIHdyaXRlQnl0ZURpcmVjdChnZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpKTsKICAgICB9CiAgIH0KLSAgCi0gIC8qKiAKKworICAvKioKICAgICogV3JpdGUgYSBsaXN0IGhlYWRlci4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTIzNyw5ICszMDUsOSBAQAogICB9CiAKICAgLyoqCi0gICAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbiAKKyAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCiAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCi0gICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gd3JpdGUgdGhlIGZpZWxkIGhlYWRlci4gCisgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gd3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KICAgICogT3RoZXJ3aXNlLCB3cml0ZSBhIHNpbmdsZSBieXRlLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjUzLDcgKzMyMSw3IEBACiAgICAgfQogICB9CiAKLSAgLyoqIAorICAvKioKICAgICogV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjgzLDMwICszNTEsMjUgQEAKIAogICAvKioKICAgICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KLSAgICovIAorICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLSAgICBmaXhlZExvbmdUb0J5dGVzKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YiksIGRhdGEsIDApOwotICAgIHRyYW5zXy53cml0ZShkYXRhKTsKKyAgICBmaXhlZExvbmdUb0J5dGVzKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YiksIHRlbXAsIDApOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCA4KTsKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VlZGluZy4KKyAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGJ5dGVzID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVCaW5hcnkoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCEiKTsKLSAgICB9CisgICAgYnl0ZVtdIGJ5dGVzID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICB9CiAKICAgLyoqCi0gICAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLiAKKyAgICogV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJpbikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGludCBsZW5ndGggPSBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpIC0gYmluLmFycmF5T2Zmc2V0KCk7CisgICAgaW50IGxlbmd0aCA9IGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCk7CiAgICAgd3JpdGVCaW5hcnkoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGxlbmd0aCk7CiAgIH0KIApAQCAtMzE2LDkgKzM3OSw5IEBACiAgIH0KIAogICAvLwotICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUgCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZQogICAvLyBvdXRwdXQgb3IgcHVycG9zZS4KLSAgLy8gCisgIC8vCiAKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQpAQCAtMzMxLDcgKzM5NCw3IEBACiAgIC8vCiAKICAgLyoqCi0gICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24gCisgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KICAgICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgogICAgKi8KICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDb2xsZWN0aW9uQmVnaW4oYnl0ZSBlbGVtVHlwZSwgaW50IHNpemUpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTM0Nyw0NCArNDEwLDQyIEBACiAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCiAgICAqIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KICAgICovCi0gIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlVmFyaW50MzIoaW50IG4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgaWR4ID0gMDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKLSAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKW47CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpbjsKICAgICAgICAgLy8gd3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICAgICAgICBicmVhazsKICAgICAgICAgLy8gcmV0dXJuOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKICAgICAgICAgLy8gd3JpdGVCeXRlRGlyZWN0KChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOwogICAgICAgICBuID4+Pj0gNzsKICAgICAgIH0KICAgICB9Ci0gICAgdHJhbnNfLndyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgaWR4KTsKICAgfQogCiAgIC8qKgogICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KICAgICovCi0gIGJ5dGVbXSB2YXJpbnQ2NG91dCA9IG5ldyBieXRlWzEwXTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlVmFyaW50NjQobG9uZyBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGlkeCA9IDA7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgewotICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoYnl0ZSluOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKW47CiAgICAgICAgIGJyZWFrOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOworICAgICAgICB0ZW1wW2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKICAgICAgICAgbiA+Pj49IDc7CiAgICAgICB9CiAgICAgfQotICAgIHRyYW5zXy53cml0ZSh2YXJpbnQ2NG91dCwgMCwgaWR4KTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgaWR4KTsKICAgfQogCiAgIC8qKgotICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAorICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCiAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KICAgICovCiAgIHByaXZhdGUgbG9uZyBsb25nVG9aaWd6YWcobG9uZyBsKSB7CkBAIC0zOTIsNyArNDUzLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgCisgICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQogICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCiAgICAqLwogICBwcml2YXRlIGludCBpbnRUb1ppZ1phZyhpbnQgbikgewpAQCAtNDAwLDcgKzQ2MSw3IEBACiAgIH0KIAogICAvKioKLSAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIAorICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKICAgICogdW50aWwgb2ZmKzcuCiAgICAqLwogICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpIHsKQEAgLTQxNCwzMCArNDc1LDI5IEBACiAgICAgYnVmW29mZis3XSA9IChieXRlKSgobiA+PiA1NikgJiAweGZmKTsKICAgfQogCi0gIC8qKiAKLSAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4gCisgIC8qKgorICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KICAgICovCi0gIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlQnl0ZURpcmVjdChieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlRGlyZWN0QnVmZmVyWzBdID0gYjsKLSAgICB0cmFuc18ud3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CisgICAgdGVtcFswXSA9IGI7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDEpOwogICB9CiAKLSAgLyoqIAotICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAvKioKKyAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCiAgICAqLwogICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlRGlyZWN0KGludCBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICB9CiAKIAotICAvLyAKKyAgLy8KICAgLy8gUmVhZGluZyBtZXRob2RzLgotICAvLyAKKyAgLy8KIAogICAvKioKLSAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLiAKKyAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgogICAgKi8KICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSBwcm90b2NvbElkID0gcmVhZEJ5dGUoKTsKQEAgLTQ0OSw3ICs1MDksNyBAQAogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pIHsKICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIHZlcnNpb24gIiArIFZFUlNJT04gKyAiIGJ1dCBnb3QgIiArIHZlcnNpb24pOwogICAgIH0KLSAgICBieXRlIHR5cGUgPSAoYnl0ZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDMpOworICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKICAgICBpbnQgc2VxaWQgPSByZWFkVmFyaW50MzIoKTsKICAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSByZWFkU3RyaW5nKCk7CiAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgdHlwZSwgc2VxaWQpOwpAQCAtNDY2LDE2ICs1MjYsMTYgQEAKICAgfQogCiAgIC8qKgotICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvciAKKyAgICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKICAgICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCiAgICAqLwogICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgcmVhZCBvZmYgdGhlIHdpcmUuCiAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5wb3AoKTsKICAgfQotICAKKwogICAvKioKLSAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuIAorICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KICAgICovCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSB0eXBlID0gcmVhZEJ5dGUoKTsKQEAgLTUwMywyNiArNTYzLDI3IEBACiAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpIHsKICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgogICAgICAgYm9vbFZhbHVlXyA9IChieXRlKSh0eXBlICYgMHgwZikgPT0gVHlwZXMuQk9PTEVBTl9UUlVFID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICB9IAorICAgIH0KIAogICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgogICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLmlkOwogICAgIHJldHVybiBmaWVsZDsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKICAgICogImNvcnJlY3QiIHR5cGVzLgogICAgKi8KICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKHNpemUpOwogICAgIGJ5dGUga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gMCA6IHJlYWRCeXRlKCk7CiAgICAgcmV0dXJuIG5ldyBUTWFwKGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOwogICB9CiAKICAgLyoqCi0gICAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbCAKKyAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCiAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgogICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAgICAqIHRydWUgc2l6ZS4KQEAgLTUzMywxMiArNTk0LDEzIEBACiAgICAgaWYgKHNpemUgPT0gMTUpIHsKICAgICAgIHNpemUgPSByZWFkVmFyaW50MzIoKTsKICAgICB9CisgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKHNpemUpOwogICAgIGJ5dGUgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOwogICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbCAKKyAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAogICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgogICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAgICAqIHRydWUgc2l6ZS4KQEAgLTU2MSw3ICs2MjMsNiBAQAogICAgIHJldHVybiByZWFkQnl0ZSgpID09IFR5cGVzLkJPT0xFQU5fVFJVRTsKICAgfQogCi0gIGJ5dGVbXSBieXRlUmF3QnVmID0gbmV3IGJ5dGVbMV07CiAgIC8qKgogICAgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCiAgICAqLwpAQCAtNTcxLDggKzYzMiw4IEBACiAgICAgICBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgIH0gZWxzZSB7Ci0gICAgICB0cmFuc18ucmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKLSAgICAgIGIgPSBieXRlUmF3QnVmWzBdOworICAgICAgdHJhbnNfLnJlYWRBbGwodGVtcCwgMCwgMSk7CisgICAgICBiID0gdGVtcFswXTsKICAgICB9CiAgICAgcmV0dXJuIGI7CiAgIH0KQEAgLTYwMiw5ICs2NjMsOCBAQAogICAgKiBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KICAgICovCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKLSAgICB0cmFuc18ucmVhZEFsbChsb25nQml0cywgMCwgOCk7Ci0gICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgdHJhbnNfLnJlYWRBbGwodGVtcCwgMCwgOCk7CisgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKHRlbXApKTsKICAgfQogCiAgIC8qKgpAQCAtNjEyLDMwICs2NzIsMzYgQEAKICAgICovCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7CisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKGxlbmd0aCk7CiAKICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICB0cnkgewotICAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIGxlbmd0aCwgIlVURi04Iik7Ci0gICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksICJVVEYtOCIpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7CisgICAgZmluYWwgU3RyaW5nIHN0cjsKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBsZW5ndGgsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyID0gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIH0KKyAgICByZXR1cm4gc3RyOwogICB9CiAKICAgLyoqCi0gICAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4gCisgICAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KICAgICovCiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGxlbmd0aCA9IHJlYWRWYXJpbnQzMigpOwotICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVswXSk7CisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKGxlbmd0aCk7CisgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSOworCisgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7CisgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIGxlbmd0aCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihsZW5ndGgpOworICAgICAgcmV0dXJuIGJiOworICAgIH0KIAogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwogICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKQEAgLTY0MywxOCArNzA5LDQwIEBACiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGJ5dGVbXSBvZiBhIGtub3duIGxlbmd0aCBmcm9tIHRoZSB3aXJlLiAKKyAgICogUmVhZCBhIGJ5dGVbXSBvZiBhIGtub3duIGxlbmd0aCBmcm9tIHRoZSB3aXJlLgogICAgKi8KICAgcHJpdmF0ZSBieXRlW10gcmVhZEJpbmFyeShpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gRU1QVFlfQllURVM7CiAKICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CiAgICAgcmV0dXJuIGJ1ZjsKICAgfQogCisgIHByaXZhdGUgdm9pZCBjaGVja1N0cmluZ1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgICBpZiAoc3RyaW5nTGVuZ3RoTGltaXRfICE9IE5PX0xFTkdUSF9MSU1JVCAmJiBsZW5ndGggPiBzdHJpbmdMZW5ndGhMaW1pdF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgICBpZiAoY29udGFpbmVyTGVuZ3RoTGltaXRfICE9IE5PX0xFTkdUSF9MSU1JVCAmJiBsZW5ndGggPiBjb250YWluZXJMZW5ndGhMaW1pdF8pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICIgKyBsZW5ndGgpOworICAgIH0KKyAgfQorCiAgIC8vCi0gIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUgCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUKICAgLy8gZW5jb2RpbmcuCiAgIC8vCiAgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KQEAgLTY5OCw3ICs3ODYsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQgCisgICAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKICAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KICAgICovCiAgIHByaXZhdGUgbG9uZyByZWFkVmFyaW50NjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC03MzgsNyArODI2LDcgQEAKICAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KICAgICovCiAgIHByaXZhdGUgbG9uZyB6aWd6YWdUb0xvbmcobG9uZyBuKSB7CkBAIC03NDYsNyArODM0LDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywgCisgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAogICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAogICAgKiB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgogICAgKi8KQEAgLTc3Miw3ICs4NjAsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyAKKyAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCiAgICAqIFRUeXBlIHZhbHVlLgogICAgKi8KICAgcHJpdmF0ZSBieXRlIGdldFRUeXBlKGJ5dGUgdHlwZSkgdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEKaW5kZXggMDNhZmZkYS4uMzEzMzFiYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQpAQCAtNDIsNyArNDIsMjUgQEAKICAgICByZXR1cm4gIjxURmllbGQgbmFtZTonIiArIG5hbWUgKyAiJyB0eXBlOiIgKyB0eXBlICsgIiBmaWVsZC1pZDoiICsgaWQgKyAiPiI7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVEZpZWxkIG90aGVyRmllbGQpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgaW50IHJlc3VsdCA9IDE7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBpZDsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdHlwZTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFRGaWVsZCBvdGhlckZpZWxkID0gKFRGaWVsZCkgb2JqOwogICAgIHJldHVybiB0eXBlID09IG90aGVyRmllbGQudHlwZSAmJiBpZCA9PSBvdGhlckZpZWxkLmlkOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQppbmRleCAxMGFmNWM3Li5kMzdjNDkzIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDggKzE5LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC00Miw5ICs0NCwxNiBAQAogICAgKiBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworICAgIHByb3RlY3RlZCBib29sZWFuIGZpZWxkTmFtZXNBc1N0cmluZ18gPSBmYWxzZTsKKworICAgIHB1YmxpYyBGYWN0b3J5KCkge30KKworICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nKSB7CisgICAgICBmaWVsZE5hbWVzQXNTdHJpbmdfID0gZmllbGROYW1lc0FzU3RyaW5nOworICAgIH0KIAogICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFucywgZmllbGROYW1lc0FzU3RyaW5nXyk7CiAgICAgfQogCiAgIH0KQEAgLTcwLDEwICs3OSwxMCBAQAogICAgIDEsICAxLCciJywgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIC8vIDIKICAgfTsKIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFX0NIQVJTID0gIlwiXFxiZm5ydCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVfQ0hBUlMgPSAiXCJcXC9iZm5ydCI7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7Ci0gICAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAorICAgICciJywgJ1xcJywgJy8nLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAogICB9OwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgREVGX1NUUklOR19TSVpFID0gMTY7CkBAIC0yODUsNiArMjk0LDkgQEAKICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKICAgcHJpdmF0ZSBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIoKTsKIAorICAvLyBXcml0ZSBvdXQgdGhlIFRGaWVsZCBuYW1lcyBhcyBhIHN0cmluZyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGludGVnZXIgdmFsdWUKKyAgcHJpdmF0ZSBib29sZWFuIGZpZWxkTmFtZXNBc1N0cmluZ18gPSBmYWxzZTsKKwogICAvLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KICAgcHJpdmF0ZSB2b2lkIHB1c2hDb250ZXh0KEpTT05CYXNlQ29udGV4dCBjKSB7CiAgICAgY29udGV4dFN0YWNrXy5wdXNoKGNvbnRleHRfKTsKQEAgLTI5Niw2ICszMDgsMTMgQEAKICAgICBjb250ZXh0XyA9IGNvbnRleHRTdGFja18ucG9wKCk7CiAgIH0KIAorICAvLyBSZXNldCB0aGUgY29udGV4dCBzdGFjayB0byBpdHMgaW5pdGlhbCBzdGF0ZQorICBwcml2YXRlIHZvaWQgcmVzZXRDb250ZXh0KCkgeworICAgIHdoaWxlICghY29udGV4dFN0YWNrXy5pc0VtcHR5KCkpIHsKKyAgICAgIHBvcENvbnRleHQoKTsKKyAgICB9CisgIH0KKwogICAvKioKICAgICogQ29uc3RydWN0b3IKICAgICovCkBAIC0zMDMsNiArMzIyLDExIEBACiAgICAgc3VwZXIodHJhbnMpOwogICB9CiAKKyAgcHVibGljIFRKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbGVhbiBmaWVsZE5hbWVzQXNTdHJpbmcpIHsKKyAgICBzdXBlcih0cmFucyk7CisgICAgZmllbGROYW1lc0FzU3RyaW5nXyA9IGZpZWxkTmFtZXNBc1N0cmluZzsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICBjb250ZXh0U3RhY2tfLmNsZWFyKCk7CkBAIC0zMzEsNyArMzU1LDcgQEAKICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnMCcpOwogICAgIH0KICAgICBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgewotICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyk7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnICsgMTApOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKQEAgLTM0Niw3ICszNzAsNyBAQAogICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpKHZhbCAtIDEwKSArICdhJyk7CiAgICAgfQogICB9CiAKQEAgLTM5NCwxMiArNDE4LDggQEAKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShidWYpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYnVmKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KQEAgLTQyMSwxOCArNDQxLDE2IEBACiAgICAgICAgIHNwZWNpYWwgPSB0cnVlOwogICAgICAgfQogICAgICAgYnJlYWs7Ci0gICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogCiAgICAgYm9vbGVhbiBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLmVzY2FwZU51bSgpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNDg0LDE0ICs1MDIsMTEgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOwotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKICAgfQpAQCAtNTEzLDcgKzUyOCwxMSBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVKU09OSW50ZWdlcihmaWVsZC5pZCk7CisgICAgaWYgKGZpZWxkTmFtZXNBc1N0cmluZ18pIHsKKyAgICAgIHdyaXRlU3RyaW5nKGZpZWxkLm5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB9CiAgICAgd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKICAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQudHlwZSkpOwogICB9CkBAIC01OTcsMTIgKzYxNiw4IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUpTT05TdHJpbmcoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUpTT05TdHJpbmcoYik7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTYxOSw2ICs2MzQsNyBAQAogICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVhZEpTT05TdHJpbmcoYm9vbGVhbiBza2lwQ29udGV4dCkKICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShERUZfU1RSSU5HX1NJWkUpOworICAgIEFycmF5TGlzdDxDaGFyYWN0ZXI+IGNvZGV1bml0cyA9IG5ldyBBcnJheUxpc3Q8Q2hhcmFjdGVyPigpOwogICAgIGlmICghc2tpcENvbnRleHQpIHsKICAgICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICB9CkBAIC02MzEsMTAgKzY0Nyw0MSBAQAogICAgICAgaWYgKGNoID09IEVTQ1NFUVswXSkgewogICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzFdKSB7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCAyKTsKLSAgICAgICAgICBjaCA9IChieXRlKSgoaGV4VmFsKChieXRlKXRtcGJ1Zl9bMF0pIDw8IDQpICsgaGV4VmFsKHRtcGJ1Zl9bMV0pKTsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCA0KTsKKyAgICAgICAgICBzaG9ydCBjdSA9IChzaG9ydCkoCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1syXSkgPDwgNCkgKworICAgICAgICAgICAgICAoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bM10pKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvZGV1bml0cy5hZGQoKGNoYXIpY3UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTG93U3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29kZXVuaXRzLmFkZCgoY2hhciljdSk7CisgICAgICAgICAgICAgIGFyci53cml0ZSgKKyAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGNvZGV1bml0cy5nZXQoMCksIGNvZGV1bml0cy5nZXQoMSkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyKSkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBhcnIud3JpdGUoKG5ldyBTdHJpbmcobmV3IGludFtdIHsgY3UgfSwgMCwgMSkpCisgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CkBAIC03MTIsMTkgKzc1OSwxNCBAQAogICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKICAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICB0cnkgewotICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKTsKLSAgICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikgJiYKLSAgICAgICAgICAgICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7Ci0gICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikKKyAgICAgICAgICAmJiAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgeworICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CiAgICAgICB9Ci0gICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICAgIH0KKyAgICAgIHJldHVybiBkdWI7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CkBAIC03NDgsNiArNzkwLDExIEBACiAgICAgaW50IGxlbiA9IGFyci5sZW4oKTsKICAgICBpbnQgb2ZmID0gMDsKICAgICBpbnQgc2l6ZSA9IDA7CisgICAgLy8gSWdub3JlIHBhZGRpbmcKKyAgICBpbnQgYm91bmQgPSBsZW4gPj0gMiA/IGxlbiAtIDIgOiAwOworICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KICAgICB3aGlsZSAobGVuID49IDQpIHsKICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQogICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIDQsIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQpAQCAtNzkyLDE4ICs4MzksMTMgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CiAgICAgaWYgKHJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT04pIHsKICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CiAgICAgfQotICAgIFN0cmluZyBuYW1lOwotICAgIHRyeSB7Ci0gICAgICBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIFN0cmluZyBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIGJ5dGUgdHlwZSA9IChieXRlKSByZWFkSlNPTkludGVnZXIoKTsKICAgICBpbnQgc2VxaWQgPSAoaW50KSByZWFkSlNPTkludGVnZXIoKTsKICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKQEAgLTkyMCwxMiArOTYyLDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEKaW5kZXggMTQzOGIxMS4uZjEzYjhjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEKQEAgLTQ0LDE0ICs0NCwzMyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLSAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBUTWVzc2FnZSkgewotICAgICAgcmV0dXJuIGVxdWFscygoVE1lc3NhZ2UpIG90aGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBzZXFpZDsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHR5cGU7CisgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhUTWVzc2FnZSBvdGhlcikgewotICAgIHJldHVybiBuYW1lLmVxdWFscyhvdGhlci5uYW1lKSAmJiB0eXBlID09IG90aGVyLnR5cGUgJiYgc2VxaWQgPT0gb3RoZXIuc2VxaWQ7CisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBUTWVzc2FnZSBvdGhlciA9IChUTWVzc2FnZSkgb2JqOworICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5uYW1lICE9IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc2VxaWQgIT0gb3RoZXIuc2VxaWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE1NjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKKyAqIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgKiBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICoKKyAqIDxwPk5PVEU6IFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4gIE9uIHRoZSBzZXJ2ZXIsIHVzZSB7QGxpbmsgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yIFRNdWx0aXBsZXhlZFByb2Nlc3Nvcn0gdG8gaGFuZGxlIHJlcXVlc3RzCisgKiBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAqCisgKiA8cD5UaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgKgorICogPHByZT4KKyAqIHtAY29kZQorICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgKgorICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICoKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICogfQorICogPC9wcmU+CisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xEZWNvcmF0b3IKKyAqLworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKworICAgIC8qKiBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIjoiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FOworCisgICAgLyoqCisgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgKiB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgWW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8Y29kZT5UQmluYXJ5UHJvdG9jb2w8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIHN1cGVyKHByb3RvY29sKTsKKyAgICAgICAgU0VSVklDRV9OQU1FID0gc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0TWVzc2FnZSBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gUGFzc2VkIHRocm91Z2ggZnJvbSB3cmFwcGVkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRNZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgfHwgdE1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfTkFNRSArIFNFUEFSQVRPUiArIHRNZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLnNlcWlkCisgICAgICAgICAgICApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKHRNZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YQppbmRleCAxNmZhYzY0Li4wZTk2MzY4IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5qYXZhCkBAIC0yMiw2ICsyMiw4IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogCiAvKioKQEAgLTE1MCw0ICsxNTIsMTEgQEAKICAgICogYmUgaW1wbGVtZW50ZWQgZm9yIHN0YXRlZnVsIHByb3RvY29scy4KICAgICovCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkge30KKyAgCisgIC8qKgorICAgKiBTY2hlbWUgYWNjZXNzb3IKKyAgICovCisgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4gZ2V0U2NoZW1lKCkgeworICAgIHJldHVybiBTdGFuZGFyZFNjaGVtZS5jbGFzczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjljZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCisgKiA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLCBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UKKyAqIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiAgV2hpbGUgaXQgaGFzIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0CisgKiBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwgaXQgZG9lcyBub3QgbW9kaWZ5CisgKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+LgorICoKKyAqIDxwPlNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLik8L3A+CisgKiAKKyAqIEBzZWUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbERlY29yYXRvciBleHRlbmRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFRQcm90b2NvbCBjb25jcmV0ZVByb3RvY29sOworCisgICAgLyoqCisgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqLworICAgIHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKSB7CisgICAgICAgIHN1cGVyKHByb3RvY29sLmdldFRyYW5zcG9ydCgpKTsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbCA9IHByb3RvY29sOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QgdFN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0QmVnaW4odFN0cnVjdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIHRGaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRCZWdpbih0RmllbGQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIHRNYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEJlZ2luKHRNYXApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgdExpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RCZWdpbih0TGlzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCB0U2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRCZWdpbih0U2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUJvb2woYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlQnl0ZShiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVJMTYoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUkzMihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGwpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUk2NChsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgdikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlRG91YmxlKHYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTdHJpbmcocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBidWYpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUJpbmFyeShidWYpOworICAgIH0KKworICAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZFNldEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRCb29sKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRJMTYoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRJMzIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkSTY0KCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEJpbmFyeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YQppbmRleCAyNDg4MTViLi44NzBmMWI5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfTElNSVQgPSAzOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfVkVSU0lPTiA9IDQ7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFUFRIX0xJTUlUID0gNjsKIAogICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKaW5kZXggZDk1N2RlYy4uY2RhYTMwYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiAgICAqIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCiAgICAqCiAgICAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQotICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCisgICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCiAgICAqLwogICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcChUUHJvdG9jb2wgcHJvdCwgYnl0ZSB0eXBlKQogICAgIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTY0LDcgKzY0LDcgQEAKICAgICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KICAgICoKICAgICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCi0gICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KKyAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KICAgICogQHBhcmFtIG1heERlcHRoICB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBza2lwIGNvbXBsZXggb2JqZWN0cyB0byB0aGlzCiAgICAqICAgcmVjdXJzaXZlIGRlcHRoLCB0byBwcmV2ZW50IEphdmEgc3RhY2sgb3ZlcmZsb3cuCiAgICAqLwpAQCAtMTQxLDcgKzE0MSw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUgIiArIHR5cGUpOwogICAgIH0KICAgfQogCkBAIC0xNTIsNyArMTUzLDcgQEAKICAgICogSW4gc29tZSBjYXNlcywgbm8gZ3Vlc3MgY2FuIGJlIGRvbmUsIGluIHRoYXQgY2FzZSB3ZSByZXR1cm4gdGhlCiAgICAqIGZhbGxiYWNrIFRQcm90b2NvbEZhY3RvcnkuCiAgICAqIFRvIGJlIGNlcnRhaW4gdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgcHJvdG9jb2wsIHRoZSBmaXJzdCBlbmNvZGVkCi0gICAqIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQgPCAyNTYKKyAgICogZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCAmbHQ7IDI1NgogICAgKgogICAgKiBAcGFyYW0gZGF0YSBUaGUgc2VyaWFsaXplZCBkYXRhIHRvIGd1ZXNzIHRoZSBwcm90b2NvbCBmb3IuCiAgICAqIEBwYXJhbSBmYWxsYmFjayBUaGUgVFByb3RvY29sIHRvIHJldHVybiBpZiBubyBndWVzcyBjYW4gYmUgbWFkZS4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCmluZGV4IDgzYTI1MzIuLmViN2UyM2IgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC00NSwxMyArNDUsMTMgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT01NQSA9IG5ldyBieXRlW10geycsJ307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7JzonfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNFID0gbmV3IGJ5dGVbXSB7J3snfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNFID0gbmV3IGJ5dGVbXSB7J30nfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnWyd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBSQlJBQ0tFVCA9IG5ldyBieXRlW10geyddJ307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7JywnfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7JzonfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyd7J307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsnfSd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnWyd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnXSd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJyInOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCBBTk9OWU1PVVNfRklFTEQgPSBuZXcgVEZpZWxkKCk7CkBAIC01OSw5ICs1OSwxNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU2V0IEVNUFRZX1NFVCA9IG5ldyBUU2V0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRMaXN0IEVNUFRZX0xJU1QgPSBuZXcgVExpc3QoKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVE1hcCBFTVBUWV9NQVAgPSBuZXcgVE1hcCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVCA9ICJsaXN0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQID0gIm1hcCI7CiAKICAgcHJvdGVjdGVkIGNsYXNzIENvbnRleHQgewogICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGtleSBpbiBhIG1hcAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWFwS2V5KCkgeyByZXR1cm4gIGZhbHNlOyB9CiAgIH0KIAogICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHsKQEAgLTkxLDYgKzk5LDIyIEBACiAgICAgfQogICB9CiAKKyAgcHJvdGVjdGVkIGNsYXNzIE1hcENvbnRleHQgZXh0ZW5kcyBTdHJ1Y3RDb250ZXh0IHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleSA9IHRydWU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLndyaXRlKCk7CisgICAgICBpc0tleSA9ICFpc0tleTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcEtleSgpIHsKKyAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAvLyBvZiB0aGVpciB0eXBlCisgICAgICByZXR1cm4gaXNLZXk7CisgICAgfQorICB9CisKICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgQkFTRV9DT05URVhUID0gbmV3IENvbnRleHQoKTsKIAogICAvKioKQEAgLTExOSwxMyArMTQzLDMzIEBACiAgIH0KIAogICAvKioKKyAgICogUmVzZXQgdGhlIHdyaXRlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCByZXNldFdyaXRlQ29udGV4dCgpIHsKKyAgICB3aGlsZSAoIXdyaXRlQ29udGV4dFN0YWNrXy5pc0VtcHR5KCkpIHsKKyAgICAgIHBvcFdyaXRlQ29udGV4dCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZW5jb3VudGVyaW5nIGEgbWFwIHdob3NlIGtleXMgYXJlIGNvbnRhaW5lcnMKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTdHJpbmcgaW52YWxpZEtleVR5cGUpIHRocm93cyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIHsKKyAgICBpZiAod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CisgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiICsgaW52YWxpZEtleVR5cGUpOworICAgIH0KKyAgfQorCisgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KICAgcHVibGljIFRTaW1wbGVKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewogICAgIHN1cGVyKHRyYW5zKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRXcml0ZUNvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOwogICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CkBAIC0xMzMsMTAzICsxNzcsMTMzIEBACiAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBOb3RlIHRoYXQgZXh0cmEgdHlwZSBpbmZvcm1hdGlvbiBpcyBvbWl0dGVkIGluIEpTT04hCiAgICAgd3JpdGVTdHJpbmcoZmllbGQubmFtZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShNQVApOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKLSAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOworICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShMSVNUKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KFNFVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGIpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGkxNik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKLSAgICBfd3JpdGVTdHJpbmdEYXRhKEludGVnZXIudG9TdHJpbmcoaTMyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBfd3JpdGVTdHJpbmdEYXRhKFN0cmluZyBzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgaWYod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CisgICAgICB3cml0ZVN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CisgICAgICBfd3JpdGVTdHJpbmdEYXRhKEludGVnZXIudG9TdHJpbmcoaTMyKSk7CiAgICAgfQogICB9CiAKKyAgcHVibGljIHZvaWQgX3dyaXRlU3RyaW5nRGF0YShTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYik7CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7Ci0gICAgX3dyaXRlU3RyaW5nRGF0YShMb25nLnRvU3RyaW5nKGk2NCkpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShMb25nLnRvU3RyaW5nKGk2NCkpOworICAgIH0KICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwotICAgIF93cml0ZVN0cmluZ0RhdGEoRG91YmxlLnRvU3RyaW5nKGR1YikpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoRG91YmxlLnRvU3RyaW5nKGR1YikpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CisgICAgICBfd3JpdGVTdHJpbmdEYXRhKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwpAQCAtMjY0LDcgKzMzOCw3IEBACiAgICAgICAgIGVzY2FwZS5hcHBlbmQoJ3QnKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICAvLyBDb250cm9sIGNoYXJhY2V0ZXJzISBBY2NvcmRpbmcgdG8gSlNPTiBSRkMgdTAwMjAgKHNwYWNlKQorICAgICAgICAvLyBDb250cm9sIGNoYXJhY3RlcnMhIEFjY29yZGluZyB0byBKU09OIFJGQyB1MDAyMCAoc3BhY2UpCiAgICAgICAgIGlmIChjIDwgJyAnKSB7CiAgICAgICAgICAgU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoYyk7CiAgICAgICAgICAgZXNjYXBlLmFwcGVuZCgnXFwnKTsKQEAgLTI4Myw5MCArMzU3LDEwOCBAQAogICAgIF93cml0ZVN0cmluZ0RhdGEoZXNjYXBlLnRvU3RyaW5nKCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFRPRE8obWNzbGVlKTogRml4IHRoaXMKLSAgICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwgIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcworICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksCisgICAgICAgIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICB9CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX01FU1NBR0U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUFQOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTElTVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX1NFVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAiIjsKQEAgLTM3Nyw5ICs0NjksMTUgQEAKICAgICByZXR1cm4gIiI7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMF0pOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUdXBsZVByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR1cGxlUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY1MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUdXBsZVByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworcHVibGljIGZpbmFsIGNsYXNzIFRUdXBsZVByb3RvY29sIGV4dGVuZHMgVENvbXBhY3RQcm90b2NvbCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworICAgIHB1YmxpYyBGYWN0b3J5KCkge30KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUVHVwbGVQcm90b2NvbCh0cmFucyk7CisgICAgfQorICB9CisKKyAgcHVibGljIFRUdXBsZVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElTY2hlbWU+IGdldFNjaGVtZSgpIHsKKyAgICByZXR1cm4gVHVwbGVTY2hlbWUuY2xhc3M7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJpdFNldChCaXRTZXQgYnMsIGludCB2ZWN0b3JXaWR0aCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IHRvQnl0ZUFycmF5KGJzLCB2ZWN0b3JXaWR0aCk7CisgICAgZm9yIChieXRlIGIgOiBieXRlcykgeworICAgICAgd3JpdGVCeXRlKGIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBCaXRTZXQgcmVhZEJpdFNldChpbnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBsZW5ndGggPSAoaW50KSBNYXRoLmNlaWwoaS84LjApOworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgYnl0ZXNbal0gPSByZWFkQnl0ZSgpOworICAgIH0KKyAgICBCaXRTZXQgYnMgPSBmcm9tQnl0ZUFycmF5KGJ5dGVzKTsKKyAgICByZXR1cm4gYnM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGJpdHNldCBjb250YWluaW5nIHRoZSB2YWx1ZXMgaW4gYnl0ZXMuIFRoZSBieXRlLW9yZGVyaW5nIG11c3QgYmUKKyAgICogYmlnLWVuZGlhbi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQml0U2V0IGZyb21CeXRlQXJyYXkoYnl0ZVtdIGJ5dGVzKSB7CisgICAgQml0U2V0IGJpdHMgPSBuZXcgQml0U2V0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggKiA4OyBpKyspIHsKKyAgICAgIGlmICgoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAvIDggLSAxXSAmICgxIDw8IChpICUgOCkpKSA+IDApIHsKKyAgICAgICAgYml0cy5zZXQoaSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaXRzOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IGxlbmd0aCAxLiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW4gdGhlCisgICAqIHJlc3VsdCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBhIDEgKHNpbmNlIEJpdFNldCBkb2VzIG5vdCBzdXBwb3J0IHNpZ24KKyAgICogZXh0ZW5zaW9uKS4gVGhlIGJ5dGUtb3JkZXJpbmcgb2YgdGhlIHJlc3VsdCBpcyBiaWctZW5kaWFuIHdoaWNoIG1lYW5zIHRoZQorICAgKiBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBpbiBlbGVtZW50IDAuIFRoZSBiaXQgYXQgaW5kZXggMCBvZiB0aGUgYml0IHNldCBpcworICAgKiBhc3N1bWVkIHRvIGJlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuCisgICAqIAorICAgKiBAcGFyYW0gYml0cworICAgKiBAcGFyYW0gdmVjdG9yV2lkdGggCisgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IGxlbmd0aCAxCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b0J5dGVBcnJheShCaXRTZXQgYml0cywgaW50IHZlY3RvcldpZHRoKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbKGludCkgTWF0aC5jZWlsKHZlY3RvcldpZHRoLzguMCldOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBpZiAoYml0cy5nZXQoaSkpIHsKKyAgICAgICAgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAvIDggLSAxXSB8PSAxIDw8IChpICUgOCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBieXRlczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL0lTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvSVNjaGVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzU1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL0lTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgaW50ZXJmYWNlIElTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiB7CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3RvLCBUIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90bywgVCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1NjaGVtZUZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU2NoZW1lRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmE2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1NjaGVtZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworcHVibGljIGludGVyZmFjZSBTY2hlbWVGYWN0b3J5IHsKKworICBwdWJsaWMgPFMgZXh0ZW5kcyBJU2NoZW1lPiBTIGdldFNjaGVtZSgpOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1N0YW5kYXJkU2NoZW1lLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1N0YW5kYXJkU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU3RhbmRhcmRTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhbmRhcmRTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiBpbXBsZW1lbnRzIElTY2hlbWU8VD4geworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1R1cGxlU2NoZW1lLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1R1cGxlU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MjQyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVHVwbGVTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHVwbGVTY2hlbWU8VCBleHRlbmRzIFRCYXNlPiBpbXBsZW1lbnRzIElTY2hlbWU8VD4geworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjA2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworLyoqCisgKiBQcm92aWRlcyBjb21tb24gbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5IG5vbmJsb2NraW5nIFRTZXJ2ZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKKyAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VD4+IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+IHsKKyAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworICAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgICAgdHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHdlIHdpbGwgYWxsb2NhdGUgdG8gY2xpZW50IElPIGJ1ZmZlcnMgYXQgYQorICAgKiB0aW1lLiBXaXRob3V0IHRoaXMgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBnbGFkbHkgYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMKKyAgICogcmlnaHQgaW50byBhbiBvdXQgb2YgbWVtb3J5IGV4Y2VwdGlvbiwgcmF0aGVyIHRoYW4gd2FpdGluZy4KKyAgICovCisgIGZpbmFsIGxvbmcgTUFYX1JFQURfQlVGRkVSX0JZVEVTOworCisgIC8qKgorICAgKiBIb3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMuCisgICAqLworICBmaW5hbCBBdG9taWNMb25nIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCA9IG5ldyBBdG9taWNMb25nKDApOworCisgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyKEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICBNQVhfUkVBRF9CVUZGRVJfQllURVMgPSBhcmdzLm1heFJlYWRCdWZmZXJCeXRlczsKKyAgfQorCisgIC8qKgorICAgKiBCZWdpbiBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHByb2Nlc3NpbmcgaW52b2NhdGlvbnMuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgICAvLyBzdGFydCBhbnkgSU8gdGhyZWFkcworICAgIGlmICghc3RhcnRUaHJlYWRzKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKKyAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRTZXJ2aW5nKHRydWUpOworCisgICAgLy8gdGhpcyB3aWxsIGJsb2NrIHdoaWxlIHdlIHNlcnZlCisgICAgd2FpdEZvclNodXRkb3duKCk7CisKKyAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKKworICAgIC8vIGRvIGEgbGl0dGxlIGNsZWFudXAKKyAgICBzdG9wTGlzdGVuaW5nKCk7CisgIH0KKworICAvKioKKyAgICogU3RhcnRzIGFueSB0aHJlYWRzIHJlcXVpcmVkIGZvciBzZXJ2aW5nLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB0aHJlYWRzIGNvdWxkIG5vdCBiZSBzdGFydGVkLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRUaHJlYWRzKCk7CisKKyAgLyoqCisgICAqIEEgbWV0aG9kIHRoYXQgd2lsbCBibG9jayB1bnRpbCB3aGVuIHRocmVhZHMgaGFuZGxpbmcgdGhlIHNlcnZpbmcgaGF2ZSBiZWVuCisgICAqIHNodXQgZG93bi4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpOworCisgIC8qKgorICAgKiBIYXZlIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHdlIHN0YXJ0ZWQgbGlzdGVuaW5nIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQKKyAgICogICAgICAgICB3cm9uZy4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0TGlzdGVuaW5nKCkgeworICAgIHRyeSB7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IGxpc3RlbmluZyBvbiBzZXJ2ZXIgc29ja2V0ISIsIHR0eCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0b3AgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucy4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7CisgICAgc2VydmVyVHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm0gYW4gaW52b2NhdGlvbi4gVGhpcyBtZXRob2QgY291bGQgYmVoYXZlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgLQorICAgKiBpbnZva2UgaW1tZWRpYXRlbHkgaW5saW5lLCBxdWV1ZSBmb3Igc2VwYXJhdGUgZXhlY3V0aW9uLCBldGMuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnZvY2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkLCB3aGljaCBpcyBub3QgYQorICAgKiAgICAgICAgIGd1YXJhbnRlZSB0aGF0IGludm9jYXRpb24gaGFzIGNvbXBsZXRlZC4gRmFsc2UgaWYgdGhlIHJlcXVlc3QKKyAgICogICAgICAgICBmYWlsZWQuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKTsKKworICAvKioKKyAgICogQW4gYWJzdHJhY3QgdGhyZWFkIHRoYXQgaGFuZGxlcyBzZWxlY3Rpbmcgb24gYSBzZXQgb2YgdHJhbnNwb3J0cyBhbmQKKyAgICoge0BsaW5rIEZyYW1lQnVmZmVyIEZyYW1lQnVmZmVyc30gYXNzb2NpYXRlZCB3aXRoIHNlbGVjdGVkIGtleXMKKyAgICogY29ycmVzcG9uZGluZyB0byByZXF1ZXN0cy4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgcHJvdGVjdGVkIFNlbGVjdG9yIHNlbGVjdG9yOworCisgICAgLy8gTGlzdCBvZiBGcmFtZUJ1ZmZlcnMgdGhhdCB3YW50IHRvIGNoYW5nZSB0aGVpciBzZWxlY3Rpb24gaW50ZXJlc3RzLgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8RnJhbWVCdWZmZXI+IHNlbGVjdEludGVyZXN0Q2hhbmdlcyA9IG5ldyBIYXNoU2V0PEZyYW1lQnVmZmVyPigpOworCisgICAgcHVibGljIEFic3RyYWN0U2VsZWN0VGhyZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuc2VsZWN0b3IgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHNlbGVjdG9yIGlzIGJsb2NrZWQsIHdha2UgaXQgdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FrZXVwU2VsZWN0b3IoKSB7CisgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgRnJhbWVCdWZmZXIgdG8gdGhlIGxpc3Qgb2Ygc2VsZWN0IGludGVyZXN0IGNoYW5nZXMgYW5kIHdha2UgdXAgdGhlCisgICAgICogc2VsZWN0b3IgaWYgaXQncyBibG9ja2VkLiBXaGVuIHRoZSBzZWxlY3QoKSBjYWxsIGV4aXRzLCBpdCdsbCBnaXZlIHRoZQorICAgICAqIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIGNoYW5nZSBpdHMgaW50ZXJlc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgICAgc3luY2hyb25pemVkIChzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgc2VsZWN0SW50ZXJlc3RDaGFuZ2VzLmFkZChmcmFtZUJ1ZmZlcik7CisgICAgICB9CisgICAgICAvLyB3YWtldXAgdGhlIHNlbGVjdG9yLCBpZiBpdCdzIGN1cnJlbnRseSBibG9ja2VkLgorICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgRnJhbWVCdWZmZXJzIHRoYXQgaGF2ZSBzd2l0Y2hlZCB0aGVpcgorICAgICAqIGludGVyZXN0IHR5cGUgZnJvbSByZWFkIHRvIHdyaXRlIG9yIHZpY2UgdmVyc2EuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpIHsKKyAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7CisgICAgICAgIGZvciAoRnJhbWVCdWZmZXIgZmIgOiBzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgICBmYi5jaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKKyAgICAgICAgfQorICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yayByZXF1aXJlZCB0byByZWFkIGZyb20gYSByZWFkYWJsZSBjbGllbnQuIElmIHRoZSBmcmFtZSBpcworICAgICAqIGZ1bGx5IHJlYWQsIHRoZW4gaW52b2tlIHRoZSBtZXRob2QgY2FsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWFkKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcikga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghYnVmZmVyLnJlYWQoKSkgeworICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gaWYgdGhlIGJ1ZmZlcidzIGZyYW1lIHJlYWQgaXMgY29tcGxldGUsIGludm9rZSB0aGUgbWV0aG9kLgorICAgICAgaWYgKGJ1ZmZlci5pc0ZyYW1lRnVsbHlSZWFkKCkpIHsKKyAgICAgICAgaWYgKCFyZXF1ZXN0SW52b2tlKGJ1ZmZlcikpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZXQgYSB3cml0YWJsZSBjbGllbnQgZ2V0IHdyaXR0ZW4sIGlmIHRoZXJlJ3MgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVdyaXRlKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcikga2V5LmF0dGFjaG1lbnQoKTsKKyAgICAgIGlmICghYnVmZmVyLndyaXRlKCkpIHsKKyAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShrZXkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIGNvbm5lY3Rpb24tY2xvc2UgY2xlYW51cCBvbiBhIGdpdmVuIFNlbGVjdGlvbktleS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICAgIC8vIHJlbW92ZSB0aGUgcmVjb3JkcyBmcm9tIHRoZSB0d28gbWFwcworICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKSBrZXkuYXR0YWNobWVudCgpOworICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgIC8vIGNsb3NlIHRoZSBidWZmZXIKKyAgICAgICAgYnVmZmVyLmNsb3NlKCk7CisgICAgICB9CisgICAgICAvLyBjYW5jZWwgdGhlIHNlbGVjdGlvbiBrZXkKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICB9CisgIH0gLy8gU2VsZWN0VGhyZWFkCisKKyAgLyoqCisgICAqIFBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIEZyYW1lQnVmZmVyIHN0YXRlIG1hY2hpbmUuCisgICAqLworICBwcml2YXRlIGVudW0gRnJhbWVCdWZmZXJTdGF0ZSB7CisgICAgLy8gaW4gdGhlIG1pZHN0IG9mIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgb2ZmIHRoZSB3aXJlCisgICAgUkVBRElOR19GUkFNRV9TSVpFLAorICAgIC8vIHJlYWRpbmcgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIG5vdywgYnV0IG5vdCBhbGwgdGhlIHdheSBkb25lIHlldAorICAgIFJFQURJTkdfRlJBTUUsCisgICAgLy8gY29tcGxldGVseSByZWFkIHRoZSBmcmFtZSwgc28gYW4gaW52b2NhdGlvbiBjYW4gbm93IGhhcHBlbgorICAgIFJFQURfRlJBTUVfQ09NUExFVEUsCisgICAgLy8gd2FpdGluZyB0byBnZXQgc3dpdGNoZWQgdG8gbGlzdGVuaW5nIGZvciB3cml0ZSBldmVudHMKKyAgICBBV0FJVElOR19SRUdJU1RFUl9XUklURSwKKyAgICAvLyBzdGFydGVkIHdyaXRpbmcgcmVzcG9uc2UgZGF0YSwgbm90IGZ1bGx5IGNvbXBsZXRlIHlldAorICAgIFdSSVRJTkcsCisgICAgLy8gYW5vdGhlciB0aHJlYWQgd2FudHMgdGhpcyBmcmFtZWJ1ZmZlciB0byBnbyBiYWNrIHRvIHJlYWRpbmcKKyAgICBBV0FJVElOR19SRUdJU1RFUl9SRUFELAorICAgIC8vIHdlIHdhbnQgb3VyIHRyYW5zcG9ydCBhbmQgc2VsZWN0aW9uIGtleSBpbnZhbGlkYXRlZCBpbiB0aGUgc2VsZWN0b3IKKyAgICAvLyB0aHJlYWQKKyAgICBBV0FJVElOR19DTE9TRQorICB9CisKKyAgLyoqCisgICAqIENsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNvcnQgb2Ygc3RhdGUgbWFjaGluZSBhcm91bmQgdGhlIGludGVyYWN0aW9uIHdpdGggYQorICAgKiBjbGllbnQgYW5kIGFuIGludm9rZXIuIEl0IG1hbmFnZXMgcmVhZGluZyB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YSwKKyAgICogZ2V0dGluZyBpdCBoYW5kZWQgb2ZmIGFzIHdyYXBwZWQgdHJhbnNwb3J0cywgYW5kIHRoZW4gdGhlIHdyaXRpbmcgb2YKKyAgICogcmVzcG9uc2UgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuIEluIHRoZSBwcm9jZXNzIGl0IG1hbmFnZXMgZmxpcHBpbmcgdGhlCisgICAqIHJlYWQgYW5kIHdyaXRlIGJpdHMgb24gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIGl0cyBjbGllbnQuCisgICAqLworICAgcHVibGljIGNsYXNzIEZyYW1lQnVmZmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAvLyB0aGUgYWN0dWFsIHRyYW5zcG9ydCBob29rZWQgdXAgdG8gdGhlIGNsaWVudC4KKyAgICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zXzsKKworICAgIC8vIHRoZSBTZWxlY3Rpb25LZXkgdGhhdCBjb3JyZXNwb25kcyB0byBvdXIgdHJhbnNwb3J0CisgICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXlfOworCisgICAgLy8gdGhlIFNlbGVjdFRocmVhZCB0aGF0IG93bnMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBvdXIgdHJhbnNwb3J0CisgICAgcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZF87CisKKyAgICAvLyB3aGVyZSBpbiB0aGUgcHJvY2VzcyBvZiByZWFkaW5nL3dyaXRpbmcgYXJlIHdlPworICAgIHByb3RlY3RlZCBGcmFtZUJ1ZmZlclN0YXRlIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFOworCisgICAgLy8gdGhlIEJ5dGVCdWZmZXIgd2UnbGwgYmUgdXNpbmcgdG8gd3JpdGUgYW5kIHJlYWQsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXJfOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2VfOworCisgICAgLy8gdGhlIGZyYW1lIHRoYXQgdGhlIFRUcmFuc3BvcnQgc2hvdWxkIHdyYXAuCisgICAgcHJvdGVjdGVkIGZpbmFsIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBmcmFtZVRyYW5zXzsKKworICAgIC8vIHRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb25uZWN0IHRvIGNsaWVudHMKKyAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBpblRyYW5zXzsKKworICAgIHByb3RlY3RlZCBmaW5hbCBUVHJhbnNwb3J0IG91dFRyYW5zXzsKKworICAgIC8vIHRoZSBpbnB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBpblByb3RfOworCisgICAgLy8gdGhlIG91dHB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBvdXRQcm90XzsKKworICAgIC8vIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgorICAgIHByb3RlY3RlZCBmaW5hbCBTZXJ2ZXJDb250ZXh0IGNvbnRleHRfOworCisgICAgcHVibGljIEZyYW1lQnVmZmVyKGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKKyAgICAgICAgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSwKKyAgICAgICAgZmluYWwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkKSB7CisgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIHNlbGVjdGlvbktleV8gPSBzZWxlY3Rpb25LZXk7CisgICAgICBzZWxlY3RUaHJlYWRfID0gc2VsZWN0VGhyZWFkOworICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisKKyAgICAgIGZyYW1lVHJhbnNfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydCgpOworICAgICAgcmVzcG9uc2VfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIGluVHJhbnNfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoZnJhbWVUcmFuc18pOworICAgICAgb3V0VHJhbnNfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQocmVzcG9uc2VfKSk7CisgICAgICBpblByb3RfID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGluVHJhbnNfKTsKKyAgICAgIG91dFByb3RfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRUcmFuc18pOworCisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGNvbnRleHRfID0gZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGluUHJvdF8sIG91dFByb3RfKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRleHRfICA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHJlYWQuIFRoZSBzZWxlY3RvciBsb29wIHNob3VsZCBoYXZlCisgICAgICogcmVjZWl2ZWQgYSByZWFkIGV2ZW50IGZvciB0aGlzIEZyYW1lQnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBsaXZlIG9uLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlYWQoKSB7CisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFKSB7CisgICAgICAgIC8vIHRyeSB0byByZWFkIHRoZSBmcmFtZSBzaXplIGNvbXBsZXRlbHkKKyAgICAgICAgaWYgKCFpbnRlcm5hbFJlYWQoKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBmcmFtZSBzaXplIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgdGhlbiBwcmVwYXJlIHRvIHJlYWQgdGhlCisgICAgICAgIC8vIGFjdHVhbCBmcmFtZS4KKyAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgIC8vIHB1bGwgb3V0IHRoZSBmcmFtZSBzaXplIGFzIGFuIGludGVnZXIuCisgICAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZmZlcl8uZ2V0SW50KDApOworICAgICAgICAgIGlmIChmcmFtZVNpemUgPD0gMCkgeworICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCisgICAgICAgICAgICAgICAgKyAiLiBBcmUgeW91IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQgb24gdGhlIGNsaWVudCBzaWRlPyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBhbHdheXMgYmUgdG9vIGxhcmdlIGZvciB0aGlzIHNlcnZlciwgbG9nIHRoZQorICAgICAgICAgIC8vIGVycm9yIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBpZiAoZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7CisgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgYSBmcmFtZSBzaXplIG9mICIgKyBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICArICIsIHdoaWNoIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBidWZmZXIgc2l6ZSBmb3IgQUxMIGNvbm5lY3Rpb25zLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGlmIHRoaXMgZnJhbWUgd2lsbCBwdXNoIHVzIG92ZXIgdGhlIG1lbW9yeSBsaW1pdCwgdGhlbiByZXR1cm4uCisgICAgICAgICAgLy8gd2l0aCBsdWNrLCBtb3JlIG1lbW9yeSB3aWxsIGZyZWUgdXAgdGhlIG5leHQgdGltZSBhcm91bmQuCisgICAgICAgICAgaWYgKHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5nZXQoKSArIGZyYW1lU2l6ZSA+IE1BWF9SRUFEX0JVRkZFUl9CWVRFUykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMKKyAgICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KGZyYW1lU2l6ZSArIDQpOworCisgICAgICAgICAgLy8gcmVhbGxvY2F0ZSB0aGUgcmVhZGJ1ZmZlciBhcyBhIGZyYW1lLXNpemVkIGJ1ZmZlcgorICAgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGZyYW1lU2l6ZSArIDQpOworICAgICAgICAgIGJ1ZmZlcl8ucHV0SW50KGZyYW1lU2l6ZSk7CisKKyAgICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gdGhpcyBza2lwcyB0aGUgY2hlY2sgb2YgUkVBRElOR19GUkFNRSBzdGF0ZSBiZWxvdywgc2luY2Ugd2UgY2FuJ3QKKyAgICAgICAgICAvLyBwb3NzaWJseSBnbyBvbiB0byB0aGF0IHN0YXRlIGlmIHRoZXJlJ3MgZGF0YSBsZWZ0IHRvIGJlIHJlYWQgYXQKKyAgICAgICAgICAvLyB0aGlzIG9uZS4KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0byBmYWxsIHRocm91Z2ggZnJvbSB0aGUgUkVBRElOR19GUkFNRV9TSVpFIHNlY3Rpb24KKyAgICAgIC8vIHRvIFJFQURJTkdfRlJBTUUgaWYgdGhlcmUncyBhbHJlYWR5IHNvbWUgZnJhbWUgZGF0YSBhdmFpbGFibGUgb25jZQorICAgICAgLy8gUkVBRElOR19GUkFNRV9TSVpFIGlzIGNvbXBsZXRlLgorCisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRSkgeworICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2luY2Ugd2UncmUgYWxyZWFkeSBpbiB0aGUgc2VsZWN0IGxvb3AgaGVyZSBmb3Igc3VyZSwgd2UgY2FuIGp1c3QKKyAgICAgICAgLy8gbW9kaWZ5IG91ciBzZWxlY3Rpb24ga2V5IGRpcmVjdGx5LgorICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgLy8gZ2V0IHJpZCBvZiB0aGUgcmVhZCBzZWxlY3QgaW50ZXJlc3RzCisgICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcygwKTsKKyAgICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURfRlJBTUVfQ09NUExFVEU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgLy8gaWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoaXMgcG9pbnQsIHRoZW4gdGhlIHN0YXRlIG11c3QgYmUgaW52YWxpZC4KKyAgICAgIExPR0dFUi5lcnJvcigiUmVhZCB3YXMgY2FsbGVkIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gd3JpdGUgaXRzIG91dHB1dCB0byB0aGUgZmluYWwgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKCkgeworICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLldSSVRJTkcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAodHJhbnNfLndyaXRlKGJ1ZmZlcl8pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gZHVyaW5nIHdyaXRlISIsIGUpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlJ3JlIGRvbmUgd3JpdGluZy4gbm93IHdlIG5lZWQgdG8gc3dpdGNoIGJhY2sgdG8gcmVhZGluZy4KKyAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgeworICAgICAgICAgIHByZXBhcmVSZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIExPR0dFUi5lcnJvcigiV3JpdGUgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byBzZXQgaXRzIGludGVyZXN0IHRvIHdyaXRlLCBvbmNlIGRhdGEKKyAgICAgKiBoYXMgY29tZSBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKSB7CisgICAgICBzd2l0Y2ggKHN0YXRlXykgeworICAgICAgY2FzZSBBV0FJVElOR19SRUdJU1RFUl9XUklURToKKyAgICAgICAgLy8gc2V0IHRoZSBPUF9XUklURSBpbnRlcmVzdAorICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgICAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuV1JJVElORzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ6CisgICAgICAgIHByZXBhcmVSZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19DTE9TRToKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgc2VsZWN0aW9uS2V5Xy5jYW5jZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0dHRVIuZXJyb3IoCisgICAgICAgICAgICAiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKHt9KSIsCisgICAgICAgICAgICBzdGF0ZV8pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXQgdGhlIGNvbm5lY3Rpb24gZG93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgIC8vIGlmIHdlJ3JlIGJlaW5nIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYWxsb2NhdGVkIGEKKyAgICAgIC8vIGJ1ZmZlciB0aGF0IHdlIG5lZWQgdG8gc3VidHJhY3QgZm9yIG91ciBtZW1vcnkgYWNjb3VudGluZy4KKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FIHx8CisgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURSB8fAorICAgICAgICAgIHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CisgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOworICAgICAgfQorICAgICAgdHJhbnNfLmNsb3NlKCk7CisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGV2ZW50SGFuZGxlcl8uZGVsZXRlQ29udGV4dChjb250ZXh0XywgaW5Qcm90Xywgb3V0UHJvdF8pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgRnJhbWVCdWZmZXIgaGFzIGEgZnVsbCBmcmFtZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRnJhbWVGdWxseVJlYWQoKSB7CisgICAgICByZXR1cm4gc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZnRlciB0aGUgcHJvY2Vzc29yIGhhcyBwcm9jZXNzZWQgdGhlIGludm9jYXRpb24sIHdoYXRldmVyIHRocmVhZCBpcworICAgICAqIG1hbmFnaW5nIGludm9jYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uIHRoaXMgRnJhbWVCdWZmZXIgc28gd2UKKyAgICAgKiBrbm93IGl0J3MgdGltZSB0byBzdGFydCB0cnlpbmcgdG8gd3JpdGUgYWdhaW4uIEFsc28sIGlmIGl0IHR1cm5zIG91dCB0aGF0CisgICAgICogdGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55IGRhdGEgaW4gdGhlIHJlc3BvbnNlIGJ1ZmZlciwgd2UnbGwgc2tpcCB0cnlpbmcKKyAgICAgKiB0byB3cml0ZSBhbmQgaW5zdGVhZCBnbyBiYWNrIHRvIHJlYWRpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzcG9uc2VSZWFkeSgpIHsKKyAgICAgIC8vIHRoZSByZWFkIGJ1ZmZlciBpcyBkZWZpbml0ZWx5IG5vIGxvbmdlciBpbiB1c2UsIHNvIHdlIHdpbGwgZGVjcmVtZW50CisgICAgICAvLyBvdXIgcmVhZCBidWZmZXIgY291bnQuIHdlIGRvIHRoaXMgaGVyZSBhcyB3ZWxsIGFzIGluIGNsb3NlIGJlY2F1c2UKKyAgICAgIC8vIHdlJ2QgbGlrZSB0byBmcmVlIHRoaXMgcmVhZCBtZW1vcnkgdXAgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSBmb3Igb3RoZXIKKyAgICAgIC8vIGNsaWVudHMuCisgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQuYWRkQW5kR2V0KC1idWZmZXJfLmFycmF5KCkubGVuZ3RoKTsKKworICAgICAgaWYgKHJlc3BvbnNlXy5sZW4oKSA9PSAwKSB7CisgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHJlYWRpbmcgYWdhaW4uIHRoaXMgd2FzIHByb2JhYmx5IGFuIG9uZXdheSBtZXRob2QKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9SRUFEOworICAgICAgICBidWZmZXJfID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLndyYXAocmVzcG9uc2VfLmdldCgpLCAwLCByZXNwb25zZV8ubGVuKCkpOworCisgICAgICAgIC8vIHNldCBzdGF0ZSB0aGF0IHdlJ3JlIHdhaXRpbmcgdG8gYmUgc3dpdGNoZWQgdG8gd3JpdGUuIHdlIGRvIHRoaXMKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgdGhyb3VnaCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSBiZWNhdXNlIHRoZXJlIGlzCisgICAgICAgIC8vIGEgcG9zc2liaWxpdHkgdGhhdCB3ZSdyZSBub3QgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGh1cyBjdXJyZW50bHkKKyAgICAgICAgLy8gYmxvY2tlZCBpbiBzZWxlY3QoKS4gKHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbiBwbGFjZSBmb3IgdGhlIHNha2Ugb2YKKyAgICAgICAgLy8gdGhlIEhzSGEgc2VydmVyLikKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9XUklURTsKKyAgICAgIH0KKyAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgbWV0aG9kIHNpZ25pZmllZCBieSB0aGlzIEZyYW1lQnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKKyAgICAgIGZyYW1lVHJhbnNfLnJlc2V0KGJ1ZmZlcl8uYXJyYXkoKSk7CisgICAgICByZXNwb25zZV8ucmVzZXQoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpblRyYW5zXykucHJvY2VzcyhpblByb3RfLCBvdXRQcm90Xyk7CisgICAgICAgIHJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoaWxlIGludm9raW5nISIsIHRlKTsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiVW5leHBlY3RlZCB0aHJvd2FibGUgd2hpbGUgaW52b2tpbmchIiwgdCk7CisgICAgICB9CisgICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlcmUgaXMgYSB0aHJvd2FibGUuCisgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFOworICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCisgICAgICogICAgICAgICBjb25uZWN0aW9uIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxSZWFkKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYW5zXy5yZWFkKGJ1ZmZlcl8pIDwgMCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBpbiBpbnRlcm5hbFJlYWQhIiwgZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSdyZSBkb25lIHdyaXRpbmcsIHNvIHJlc2V0IG91ciBpbnRlcmVzdCBvcHMgYW5kIGNoYW5nZSBzdGF0ZQorICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlUmVhZCgpIHsKKyAgICAgIC8vIHdlIGNhbiBzZXQgb3VyIGludGVyZXN0IGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIHF1ZXVlIGJlY2F1c2UKKyAgICAgIC8vIHdlJ3JlIGluIHRoZSBzZWxlY3QgdGhyZWFkLgorICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgICAvLyBnZXQgcmVhZHkgZm9yIGFub3RoZXIgZ28tYXJvdW5kCisgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRV9TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhpcyBGcmFtZUJ1ZmZlciBuZWVkcyB0byBjaGFuZ2UgaXRzIHNlbGVjdCBpbnRlcmVzdHMgYW5kIGV4ZWN1dGlvbgorICAgICAqIG1pZ2h0IG5vdCBiZSBpbiBpdHMgc2VsZWN0IHRocmVhZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG1ha2Ugc3VyZSB0aGUKKyAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgZ2V0cyBkb25lIHdoZW4gdGhlIHNlbGVjdCB0aHJlYWQgd2FrZXMgYmFjayB1cC4gV2hlbiB0aGUKKyAgICAgKiBjdXJyZW50IHRocmVhZCBpcyB0aGlzIEZyYW1lQnVmZmVyJ3Mgc2VsZWN0IHRocmVhZCwgdGhlbiBpdCBqdXN0IGRvZXMgdGhlCisgICAgICogaW50ZXJlc3QgY2hhbmdlIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIHsKKyAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2VsZWN0VGhyZWFkXykgeworICAgICAgICBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2VsZWN0VGhyZWFkXy5yZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgfQorICB9IC8vIEZyYW1lQnVmZmVyCisKKyAgcHVibGljIGNsYXNzIEFzeW5jRnJhbWVCdWZmZXIgZXh0ZW5kcyBGcmFtZUJ1ZmZlciB7CisgICAgcHVibGljIEFzeW5jRnJhbWVCdWZmZXIoVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgIHN1cGVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCk7CisgICAgfQorCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkgeworICAgICAgcmV0dXJuICBpblByb3RfOworICAgIH0KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSB7CisgICAgICByZXR1cm4gb3V0UHJvdF87CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoKSB7CisgICAgICBmcmFtZVRyYW5zXy5yZXNldChidWZmZXJfLmFycmF5KCkpOworICAgICAgcmVzcG9uc2VfLnJlc2V0KCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbnRleHRfLCBpblRyYW5zXywgb3V0VHJhbnNfKTsKKyAgICAgICAgfQorICAgICAgICAoKFRBc3luY1Byb2Nlc3Nvcilwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoaW5UcmFuc18pKS5wcm9jZXNzKHRoaXMpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIHRocm93YWJsZSB3aGlsZSBpbnZva2luZyEiLCB0KTsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB0aGVyZSBpcyBhIHRocm93YWJsZS4KKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0U7CisgICAgICByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvSW52b2NhdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9JbnZvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvSW52b2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXI7CisKKy8qKgorICogQW4gSW52b2NhdGlvbiByZXByZXNlbnRzIGEgbWV0aG9kIGNhbGwgdGhhdCBpcyBwcmVwYXJlZCB0byBleGVjdXRlLCBnaXZlbgorICogYW4gaWRsZSB3b3JrZXIgdGhyZWFkLiBJdCBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMgdGhlCisgKiB0aHJlYWQncyBwcm9jZXNzb3Igc2hvdWxkIHVzZSB0byBwZXJmb3JtIHRoZSB1c3VhbCBUaHJpZnQgaW52b2NhdGlvbi4KKyAqLworY2xhc3MgSW52b2NhdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgcHJpdmF0ZSBmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcjsKKworICBwdWJsaWMgSW52b2NhdGlvbihmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBmcmFtZUJ1ZmZlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBmcmFtZUJ1ZmZlci5pbnZva2UoKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyQ29udGV4dC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwYjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHN0b3Jpbmcgc2VydmVyJ3MgY29ubmVjdGlvbiBjb250ZXh0CisgKi8KKyAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZlckNvbnRleHQge30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDgyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgVGhyaWZ0U2VydmVyLCB0aGF0IGFsbG93cyB7QGxpbmsgVFByb2Nlc3Nvcn0gYW5kCisgKiB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0gdG8gYmUgc3VwcGxpZWQgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QgaGFzCisgKiBmaW5pc2hlZC4gPGJyPgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYWJzdHJhY3QgbWV0aG9kcyB0aGF0IHJldHVybiB0aGUgVFByb2Nlc3NvciBhbmQKKyAqIHR3byBUUHJvdG9jb2xGYWN0b3J5LiBUaG9zZSBtZXRob2RzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UsCisgKiBhbmQgdGhhdCB7QGxpbmsgU2VydmxldENvbnRleHR9IGlzIGF2YWlsYWJsZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRFeHRlbnNpYmxlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKKworICBwcml2YXRlIFRQcm90b2NvbEZhY3RvcnkgaW5GYWN0b3J5OworCisgIHByaXZhdGUgVFByb3RvY29sRmFjdG9yeSBvdXRGYWN0b3J5OworCisgIHByaXZhdGUgQ29sbGVjdGlvbjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBjdXN0b21IZWFkZXJzOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0uIFRoaXMgd2lsbCBiZSBjYWxsZWQgPGI+b25jZTwvYj4ganVzdAorICAgKiBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAorICAgKiAKKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIFRQcm9jZXNzb3J9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCisgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKKyAgICogCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgb3V0IHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fS4gVGhpcyB3aWxsIGJlIGNhbGxlZAorICAgKiA8Yj5vbmNlPC9iPiBqdXN0IGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIHN1cGVyLmluaXQoY29uZmlnKTsgLy9uby1hcmdzIGluaXQoKSBoYXBwZW5zIGhlcmUKKyAgICB0aGlzLnByb2Nlc3NvciA9IGdldFByb2Nlc3NvcigpOworICAgIHRoaXMuaW5GYWN0b3J5ID0gZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKKyAgICB0aGlzLm91dEZhY3RvcnkgPSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCk7CisKKyAgICBpZiAocHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJwcm9jZXNzb3IgbXVzdCBiZSBzZXQiKTsKKyAgICB9CisgICAgaWYgKGluRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiaW5GYWN0b3J5IG11c3QgYmUgc2V0Iik7CisgICAgfQorICAgIGlmIChvdXRGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJvdXRGYWN0b3J5IG11c3QgYmUgc2V0Iik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBzZWUgSHR0cFNlcnZsZXQjZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlCisgICAqICAgICAgcmVzcG9uc2UpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBUVHJhbnNwb3J0IGluVHJhbnNwb3J0ID0gbnVsbDsKKyAgICBUVHJhbnNwb3J0IG91dFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisKKyAgICAgIGlmIChudWxsICE9IHRoaXMuY3VzdG9tSGVhZGVycykgeworCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiB0aGlzLmN1c3RvbUhlYWRlcnMpIHsKKwkgIHJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIuZ2V0S2V5KCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKwl9CisgICAgICB9CisKKyAgICAgIElucHV0U3RyZWFtIGluID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQoaW4sIG91dCk7CisgICAgICBpblRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIG91dFRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKworICAgICAgVFByb3RvY29sIGluUHJvdG9jb2wgPSBpbkZhY3RvcnkuZ2V0UHJvdG9jb2woaW5UcmFuc3BvcnQpOworICAgICAgVFByb3RvY29sIG91dFByb3RvY29sID0gaW5GYWN0b3J5LmdldFByb3RvY29sKG91dFRyYW5zcG9ydCk7CisKKyAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGluUHJvdG9jb2wsIG91dFByb3RvY29sKTsKKyAgICAgIG91dC5mbHVzaCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHNlZSBIdHRwU2VydmxldCNkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZQorICAgKiAgICAgIHJlc3BvbnNlKQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZG9Qb3N0KHJlcSwgcmVzcCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRDdXN0b21IZWFkZXIoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzLmFkZChuZXcgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPigpIHsKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCXJldHVybiBrZXk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCXJldHVybiBudWxsOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q3VzdG9tSGVhZGVycyhDb2xsZWN0aW9uPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGhlYWRlcnMpIHsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuY2xlYXIoKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuYWRkQWxsKGhlYWRlcnMpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKaW5kZXggZjNkZmQwYS4uNGM1ZDdiNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQpAQCAtMjcsMTkgKzI3LDE2IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIC8qKgogICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBUTm9uYmxvY2tpbmdTZXJ2ZXIgdG8gYSBIYWxmLVN5bmMvSGFsZi1Bc3luYyBzZXJ2ZXIuCiAgKiBMaWtlIFROb25ibG9ja2luZ1NlcnZlciwgaXQgcmVsaWVzIG9uIHRoZSB1c2Ugb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwogcHVibGljIGNsYXNzIFRIc0hhU2VydmVyIGV4dGVuZHMgVE5vbmJsb2NraW5nU2VydmVyIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9Ci0gICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVEhzSGFTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7Ci0gICAgcHJpdmF0ZSBpbnQgd29ya2VyVGhyZWFkcyA9IDU7CisgICAgcHVibGljIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gNTsKKyAgICBwdWJsaWMgaW50IG1heFdvcmtlclRocmVhZHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIGludCBzdG9wVGltZW91dFZhbCA9IDYwOwogICAgIHByaXZhdGUgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKICAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBudWxsOwpAQCAtNDgsMTMgKzQ1LDQ0IEBACiAgICAgICBzdXBlcih0cmFuc3BvcnQpOwogICAgIH0KIAotICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IGkpIHsKLSAgICAgIHdvcmtlclRocmVhZHMgPSBpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWluIGFuZCBtYXggdGhyZWFkcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI21pbldvcmtlclRocmVhZHMoaW50KX0gYW5kIHtAbGluayAjbWF4V29ya2VyVGhyZWFkcyhpbnQpfSAgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoYXQgdGhlIG1pbiB0aHJlYWRzIHdhcyBzZXQgdG8uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0TWluV29ya2VyVGhyZWFkcygpfSBhbmQge0BsaW5rICNnZXRNYXhXb3JrZXJUaHJlYWRzKCl9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZHMoKSB7Ci0gICAgICByZXR1cm4gd29ya2VyVGhyZWFkczsKKyAgICAgIHJldHVybiBtaW5Xb3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIG1pbldvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgbWF4V29ya2VyVGhyZWFkcyhpbnQgbikgeworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pbldvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWluV29ya2VyVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFdvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWF4V29ya2VyVGhyZWFkczsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFN0b3BUaW1lb3V0VmFsKCkgewpAQCAtODUsNjMgKzExMyw1MiBAQAogICAgIH0KICAgfQogCisKICAgLy8gVGhpcyB3cmFwcyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgcXVldWVpbmcgYW5kIHRocmVhZCBwb29sIG1hbmFnZW1lbnQKICAgLy8gZm9yIHRoZSBwYXNzaW5nIG9mIEludm9jYXRpb25zIGZyb20gdGhlIFNlbGVjdG9yIHRvIHdvcmtlcnMuCi0gIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisKKyAgcHJpdmF0ZSBmaW5hbCBBcmdzIGFyZ3M7CiAKICAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBldmVyeSBvcHRpb24gZnVsbHkgc3BlY2lmaWVkLCBhbmQgd2l0aCBhbiBpbmplY3RlZAotICAgKiBFeGVjdXRvclNlcnZpY2UKKyAgICogQ3JlYXRlIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIEFyZ3MgY29uZmlndXJhdGlvbgogICAgKi8KICAgcHVibGljIFRIc0hhU2VydmVyKEFyZ3MgYXJncykgewogICAgIHN1cGVyKGFyZ3MpOwogCiAgICAgaW52b2tlciA9IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlID09IG51bGwgPyBjcmVhdGVJbnZva2VyUG9vbChhcmdzKSA6IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlOworICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgIH0KIAotICAvKiogQGluaGVyaXREb2MgKi8KKyAgLyoqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0U2VsZWN0b3JUaHJlYWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNldFNlcnZpbmcodHJ1ZSk7Ci0KLSAgICAvLyB0aGlzIHdpbGwgYmxvY2sgd2hpbGUgd2Ugc2VydmUKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgewogICAgIGpvaW5TZWxlY3RvcigpOwotCiAgICAgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKTsKLQotICAgIHNldFNlcnZpbmcoZmFsc2UpOwotCi0gICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAotICAgIHN0b3BMaXN0ZW5pbmcoKTsKLQotICAgIC8vIHVuZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGludm9rZXIgcG9vbD8KICAgfQogCiAgIC8qKgogICAgKiBIZWxwZXIgdG8gY3JlYXRlIGFuIGludm9rZXIgcG9vbAogICAgKi8KICAgcHJvdGVjdGVkIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgY3JlYXRlSW52b2tlclBvb2woQXJncyBvcHRpb25zKSB7Ci0gICAgaW50IHdvcmtlclRocmVhZHMgPSBvcHRpb25zLndvcmtlclRocmVhZHM7CisgICAgaW50IG1pbldvcmtlclRocmVhZHMgPSBvcHRpb25zLm1pbldvcmtlclRocmVhZHM7CisgICAgaW50IG1heFdvcmtlclRocmVhZHMgPSBvcHRpb25zLm1heFdvcmtlclRocmVhZHM7CiAgICAgaW50IHN0b3BUaW1lb3V0VmFsID0gb3B0aW9ucy5zdG9wVGltZW91dFZhbDsKICAgICBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBvcHRpb25zLnN0b3BUaW1lb3V0VW5pdDsKIAogICAgIExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+IHF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCk7Ci0gICAgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKHdvcmtlclRocmVhZHMsIHdvcmtlclRocmVhZHMsCi0gICAgICBzdG9wVGltZW91dFZhbCwgc3RvcFRpbWVvdXRVbml0LCBxdWV1ZSk7CisgICAgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKG1pbldvcmtlclRocmVhZHMsCisgICAgICBtYXhXb3JrZXJUaHJlYWRzLCBzdG9wVGltZW91dFZhbCwgc3RvcFRpbWVvdXRVbml0LCBxdWV1ZSk7CiAKICAgICByZXR1cm4gaW52b2tlcjsKICAgfQogCisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0SW52b2tlcigpIHsKKyAgICByZXR1cm4gaW52b2tlcjsKKyAgfQorCiAgIHByb3RlY3RlZCB2b2lkIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCkgewogICAgIC8vIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZQogICAgIGludm9rZXIuc2h1dGRvd24oKTsKQEAgLTE1MCw3ICsxNjcsNyBAQAogICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKICAgICAvLyB0byBsZXQgdGhlIGV4ZWN1dG9yU2VydmljZSBjbGVhciBpdCdzIHRhc2sgcXVldWUsIGNsb3NpbmcgY2xpZW50IHNvY2tldHMKICAgICAvLyBhcHByb3ByaWF0ZWx5LgotICAgIGxvbmcgdGltZW91dE1TID0gMTAwMDA7CisgICAgbG9uZyB0aW1lb3V0TVMgPSBhcmdzLnN0b3BUaW1lb3V0VW5pdC50b01pbGxpcyhhcmdzLnN0b3BUaW1lb3V0VmFsKTsKICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIHdoaWxlICh0aW1lb3V0TVMgPj0gMCkgewogICAgICAgdHJ5IHsKQEAgLTE2Niw3ICsxODMsOCBAQAogCiAgIC8qKgogICAgKiBXZSBvdmVycmlkZSB0aGUgc3RhbmRhcmQgaW52b2tlIG1ldGhvZCBoZXJlIHRvIHF1ZXVlIHRoZSBpbnZvY2F0aW9uIGZvcgotICAgKiBpbnZva2VyIHNlcnZpY2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBpbnZva2luZy4gVGhlIHRocmVhZCBwb29sIHRha2VzIGNhcmUgb2YgdGhlIHJlc3QuCisgICAqIGludm9rZXIgc2VydmljZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGludm9raW5nLiBUaGUgdGhyZWFkIHBvb2wgdGFrZXMgY2FyZQorICAgKiBvZiB0aGUgcmVzdC4KICAgICovCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CkBAIC0xODEsMjQgKzE5OSw2IEBACiAgIH0KIAogICBwcm90ZWN0ZWQgUnVubmFibGUgZ2V0UnVubmFibGUoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpewotCXJldHVybiBuZXcgSW52b2NhdGlvbihmcmFtZUJ1ZmZlcik7Ci0gIH0KLQotICAvKioKLSAgICogQW4gSW52b2NhdGlvbiByZXByZXNlbnRzIGEgbWV0aG9kIGNhbGwgdGhhdCBpcyBwcmVwYXJlZCB0byBleGVjdXRlLCBnaXZlbgotICAgKiBhbiBpZGxlIHdvcmtlciB0aHJlYWQuIEl0IGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scyB0aGUKLSAgICogdGhyZWFkJ3MgcHJvY2Vzc29yIHNob3VsZCB1c2UgdG8gcGVyZm9ybSB0aGUgdXN1YWwgVGhyaWZ0IGludm9jYXRpb24uCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEludm9jYXRpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyOwotCi0gICAgcHVibGljIEludm9jYXRpb24oZmluYWwgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBmcmFtZUJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICBmcmFtZUJ1ZmZlci5pbnZva2UoKTsKLSAgICB9CisgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uKGZyYW1lQnVmZmVyKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggMzU4N2JmNy4uZmUwMzY1YSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0yMCwyNyArMjAsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKIC8qKgogICogQSBub25ibG9ja2luZyBUU2VydmVyIGltcGxlbWVudGF0aW9uLiBUaGlzIGFsbG93cyBmb3IgZmFpcm5lc3MgYW1vbmdzdCBhbGwKQEAgLTUzLDkgKzM5LDcgQEAKICAqIHRyYW5zcG9ydCwgb3RoZXJ3aXNlIHRoaXMgc2VydmVyIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB3aGVuIGEgd2hvbGUKICAqIG1ldGhvZCBjYWxsIGhhcyBiZWVuIHJlYWQgb2ZmIHRoZSB3aXJlLiBDbGllbnRzIG11c3QgYWxzbyB1c2UgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwotcHVibGljIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0KLSAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUTm9uYmxvY2tpbmdTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKK3B1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7CiAgICAgcHVibGljIEFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgewpAQCAtNjMsOTcgKzQ3LDI1IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VD4+IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+IHsKLSAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSBMb25nLk1BWF9WQUxVRTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7Ci0gICAgICBzdXBlcih0cmFuc3BvcnQpOwotICAgICAgdHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOwotICAgIH0KLSAgfQotCi0gIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gdHJ1ZTsKLQotICBwcml2YXRlIFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWRfOwotCi0gIC8qKgotICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHdlIHdpbGwgYWxsb2NhdGUgdG8gY2xpZW50IElPIGJ1ZmZlcnMgYXQgYQotICAgKiB0aW1lLiBXaXRob3V0IHRoaXMgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBnbGFkbHkgYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMKLSAgICogcmlnaHQgaW50byBhbiBvdXQgb2YgbWVtb3J5IGV4Y2VwdGlvbiwgcmF0aGVyIHRoYW4gd2FpdGluZy4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgbG9uZyBNQVhfUkVBRF9CVUZGRVJfQllURVM7Ci0KLSAgLyoqCi0gICAqIEhvdyBtYW55IGJ5dGVzIGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkIHRvIHJlYWQgYnVmZmVycy4KLSAgICovCi0gIHByaXZhdGUgbG9uZyByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgPSAwOworICBwcml2YXRlIFNlbGVjdEFjY2VwdFRocmVhZCBzZWxlY3RBY2NlcHRUaHJlYWRfOwogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3MgYXJncykgewogICAgIHN1cGVyKGFyZ3MpOwotICAgIE1BWF9SRUFEX0JVRkZFUl9CWVRFUyA9IGFyZ3MubWF4UmVhZEJ1ZmZlckJ5dGVzOwogICB9CiAKLSAgLyoqCi0gICAqIEJlZ2luIGFjY2VwdGluZyBjb25uZWN0aW9ucyBhbmQgcHJvY2Vzc2luZyBpbnZvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlcnZlKCkgewotICAgIC8vIHN0YXJ0IGxpc3RlbmluZywgb3IgZXhpdAotICAgIGlmICghc3RhcnRMaXN0ZW5pbmcoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHN0YXJ0IHRoZSBzZWxlY3Rvciwgb3IgZXhpdAotICAgIGlmICghc3RhcnRTZWxlY3RvclRocmVhZCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2V0U2VydmluZyh0cnVlKTsKLQotICAgIC8vIHRoaXMgd2lsbCBibG9jayB3aGlsZSB3ZSBzZXJ2ZQotICAgIGpvaW5TZWxlY3RvcigpOwotCi0gICAgc2V0U2VydmluZyhmYWxzZSk7Ci0KLSAgICAvLyBkbyBhIGxpdHRsZSBjbGVhbnVwCi0gICAgc3RvcExpc3RlbmluZygpOwotICB9CiAKICAgLyoqCi0gICAqIEhhdmUgdGhlIHNlcnZlciB0cmFuc3BvcnQgc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc3RhcnRlZCBsaXN0ZW5pbmcgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBzb21ldGhpbmcgd2VudAotICAgKiB3cm9uZy4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0TGlzdGVuaW5nKCkgewotICAgIHRyeSB7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IGxpc3RlbmluZyBvbiBzZXJ2ZXIgc29ja2V0ISIsIHR0eCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgbGlzdGVuaW5nIGZvciBjb25lY3Rpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnQgdGhlIHNlbGVjdG9yIHRocmVhZCBydW5uaW5nIHRvIGRlYWwgd2l0aCBjbGllbnRzLgorICAgKiBTdGFydCB0aGUgc2VsZWN0b3IgdGhyZWFkIHRvIGRlYWwgd2l0aCBhY2NlcHRzIGFuZCBjbGllbnQgbWVzc2FnZXMuCiAgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGZhbHNlIGlmIHdlIGNvdWxkbid0IHN0YXJ0IGZvciBzb21lCiAgICAqIHJlYXNvbi4KICAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0U2VsZWN0b3JUaHJlYWQoKSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydFRocmVhZHMoKSB7CiAgICAgLy8gc3RhcnQgdGhlIHNlbGVjdG9yCiAgICAgdHJ5IHsKLSAgICAgIHNlbGVjdFRocmVhZF8gPSBuZXcgU2VsZWN0VGhyZWFkKChUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQpc2VydmVyVHJhbnNwb3J0Xyk7Ci0gICAgICBzdG9wcGVkXyA9IGZhbHNlOwotICAgICAgc2VsZWN0VGhyZWFkXy5zdGFydCgpOworICAgICAgc2VsZWN0QWNjZXB0VGhyZWFkXyA9IG5ldyBTZWxlY3RBY2NlcHRUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydClzZXJ2ZXJUcmFuc3BvcnRfKTsKKyAgICAgIHNlbGVjdEFjY2VwdFRocmVhZF8uc3RhcnQoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IHNlbGVjdG9yIHRocmVhZCEiLCBlKTsKQEAgLTE2MSwxMyArNzMsMTggQEAKICAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgeworICAgIGpvaW5TZWxlY3RvcigpOworICB9CisKICAgLyoqCi0gICAqIEJsb2NrIHVudGlsIHRoZSBzZWxlY3RvciBleGl0cy4KKyAgICogQmxvY2sgdW50aWwgdGhlIHNlbGVjdG9yIHRocmVhZCBleGl0cy4KICAgICovCiAgIHByb3RlY3RlZCB2b2lkIGpvaW5TZWxlY3RvcigpIHsKICAgICAvLyB3YWl0IHVudGlsIHRoZSBzZWxlY3RvciB0aHJlYWQgZXhpdHMKICAgICB0cnkgewotICAgICAgc2VsZWN0VGhyZWFkXy5qb2luKCk7CisgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfLmpvaW4oKTsKICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAvLyBmb3Igbm93LCBqdXN0IHNpbGVudGx5IGlnbm9yZS4gdGVjaG5pY2FsbHkgdGhpcyBtZWFucyB3ZSdsbCBoYXZlIGxlc3Mgb2YKICAgICAgIC8vIGEgZ3JhY2VmdWwgc2h1dGRvd24gYXMgYSByZXN1bHQuCkBAIC0xNzcsMTAgKzk0LDExIEBACiAgIC8qKgogICAgKiBTdG9wIHNlcnZpbmcgYW5kIHNodXQgZXZlcnl0aGluZyBkb3duLgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CiAgICAgc3RvcHBlZF8gPSB0cnVlOwotICAgIGlmIChzZWxlY3RUaHJlYWRfICE9IG51bGwpIHsKLSAgICAgIHNlbGVjdFRocmVhZF8ud2FrZXVwU2VsZWN0b3IoKTsKKyAgICBpZiAoc2VsZWN0QWNjZXB0VGhyZWFkXyAhPSBudWxsKSB7CisgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfLndha2V1cFNlbGVjdG9yKCk7CiAgICAgfQogICB9CiAKQEAgLTE4OCw0MyArMTA2LDMzIEBACiAgICAqIFBlcmZvcm0gYW4gaW52b2NhdGlvbi4gVGhpcyBtZXRob2QgY291bGQgYmVoYXZlIHNldmVyYWwgZGlmZmVyZW50IHdheXMKICAgICogLSBpbnZva2UgaW1tZWRpYXRlbHkgaW5saW5lLCBxdWV1ZSBmb3Igc2VwYXJhdGUgZXhlY3V0aW9uLCBldGMuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdEludm9rZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgewogICAgIGZyYW1lQnVmZmVyLmludm9rZSgpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqCi0gICAqIEEgRnJhbWVCdWZmZXIgd2FudHMgdG8gY2hhbmdlIGl0cyBzZWxlY3Rpb24gcHJlZmVyZW5jZXMsIGJ1dCBtaWdodCBub3QgYmUKLSAgICogaW4gdGhlIHNlbGVjdCB0aHJlYWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICBzZWxlY3RUaHJlYWRfLnJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShmcmFtZUJ1ZmZlcik7Ci0gIH0KIAogICBwdWJsaWMgYm9vbGVhbiBpc1N0b3BwZWQoKSB7Ci0gICAgcmV0dXJuIHNlbGVjdFRocmVhZF8uaXNTdG9wcGVkKCk7CisgICAgcmV0dXJuIHNlbGVjdEFjY2VwdFRocmVhZF8uaXNTdG9wcGVkKCk7CiAgIH0KIAogICAvKioKICAgICogVGhlIHRocmVhZCB0aGF0IHdpbGwgYmUgZG9pbmcgYWxsIHRoZSBzZWxlY3RpbmcsIG1hbmFnaW5nIG5ldyBjb25uZWN0aW9ucwogICAgKiBhbmQgdGhvc2UgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHJlYWQuCiAgICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgU2VsZWN0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgcHJvdGVjdGVkIGNsYXNzIFNlbGVjdEFjY2VwdFRocmVhZCBleHRlbmRzIEFic3RyYWN0U2VsZWN0VGhyZWFkIHsKIAorICAgIC8vIFRoZSBzZXJ2ZXIgdHJhbnNwb3J0IG9uIHdoaWNoIG5ldyBjbGllbnQgdHJhbnNwb3J0cyB3aWxsIGJlIGFjY2VwdGVkCiAgICAgcHJpdmF0ZSBmaW5hbCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0OwotICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7Ci0KLSAgICAvLyBMaXN0IG9mIEZyYW1lQnVmZmVycyB0aGF0IHdhbnQgdG8gY2hhbmdlIHRoZWlyIHNlbGVjdGlvbiBpbnRlcmVzdHMuCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8RnJhbWVCdWZmZXI+IHNlbGVjdEludGVyZXN0Q2hhbmdlcyA9Ci0gICAgICBuZXcgSGFzaFNldDxGcmFtZUJ1ZmZlcj4oKTsKIAogICAgIC8qKgotICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQuCisgICAgICogU2V0IHVwIHRoZSB0aHJlYWQgdGhhdCB3aWxsIGhhbmRsZSB0aGUgbm9uLWJsb2NraW5nIGFjY2VwdHMsIHJlYWRzLCBhbmQKKyAgICAgKiB3cml0ZXMuCiAgICAgICovCi0gICAgcHVibGljIFNlbGVjdFRocmVhZChmaW5hbCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgIHB1YmxpYyBTZWxlY3RBY2NlcHRUaHJlYWQoZmluYWwgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgICB0aGlzLnNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOwogICAgICAgc2VydmVyVHJhbnNwb3J0LnJlZ2lzdGVyU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KIApAQCAtMjM4LDQyICsxNDYsMzQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgICAgICB9CisKICAgICAgICAgd2hpbGUgKCFzdG9wcGVkXykgewogICAgICAgICAgIHNlbGVjdCgpOwogICAgICAgICAgIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKTsKICAgICAgICAgfQorICAgICAgICBmb3IgKFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkgOiBzZWxlY3Rvci5rZXlzKCkpIHsKKyAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KHNlbGVjdGlvbktleSk7CisgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKICAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3Npbmcgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KICAgICAgICAgc3RvcHBlZF8gPSB0cnVlOwogICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIElmIHRoZSBzZWxlY3RvciBpcyBibG9ja2VkLCB3YWtlIGl0IHVwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdha2V1cFNlbGVjdG9yKCkgewotICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIEZyYW1lQnVmZmVyIHRvIHRoZSBsaXN0IG9mIHNlbGVjdCBpbnRlcmVzdCBjaGFuZ2VzIGFuZCB3YWtlIHVwIHRoZQotICAgICAqIHNlbGVjdG9yIGlmIGl0J3MgYmxvY2tlZC4gV2hlbiB0aGUgc2VsZWN0KCkgY2FsbCBleGl0cywgaXQnbGwgZ2l2ZSB0aGUKLSAgICAgKiBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byBjaGFuZ2UgaXRzIGludGVyZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7Ci0gICAgICAgIHNlbGVjdEludGVyZXN0Q2hhbmdlcy5hZGQoZnJhbWVCdWZmZXIpOwotICAgICAgfQotICAgICAgLy8gd2FrZXVwIHRoZSBzZWxlY3RvciwgaWYgaXQncyBjdXJyZW50bHkgYmxvY2tlZC4KLSAgICAgIHNlbGVjdG9yLndha2V1cCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFNlbGVjdCBhbmQgcHJvY2VzcyBJTyBldmVudHMgYXBwcm9wcmlhdGVseToKICAgICAgKiBJZiB0aGVyZSBhcmUgY29ubmVjdGlvbnMgdG8gYmUgYWNjZXB0ZWQsIGFjY2VwdCB0aGVtLgogICAgICAqIElmIHRoZXJlIGFyZSBleGlzdGluZyBjb25uZWN0aW9ucyB3aXRoIGRhdGEgd2FpdGluZyB0byBiZSByZWFkLCByZWFkIGl0LAotICAgICAqIGJ1ZmZlcnJpbmcgdW50aWwgYSB3aG9sZSBmcmFtZSBoYXMgYmVlbiByZWFkLgorICAgICAqIGJ1ZmZlcmluZyB1bnRpbCBhIHdob2xlIGZyYW1lIGhhcyBiZWVuIHJlYWQuCiAgICAgICogSWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIHJlc3BvbnNlcywgYnVmZmVyIHRoZW0gdW50aWwgdGhlaXIgdGFyZ2V0IGNsaWVudAogICAgICAqIGlzIGF2YWlsYWJsZSwgYW5kIHRoZW4gc2VuZCB0aGUgZGF0YS4KICAgICAgKi8KQEAgLTI5MCw3ICsxOTAsNyBAQAogCiAgICAgICAgICAgLy8gc2tpcCBpZiBub3QgdmFsaWQKICAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25rZXkoa2V5KTsKKyAgICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoa2V5KTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KIApAQCAtMzEzLDE3ICsyMTMsMTIgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBGcmFtZUJ1ZmZlcnMgdGhhdCBoYXZlIHN3aXRjaGVkIHRoZWlyCi0gICAgICogaW50ZXJlc3QgdHlwZSBmcm9tIHJlYWQgdG8gd3JpdGUgb3IgdmljZSB2ZXJzYS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpIHsKLSAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7Ci0gICAgICAgIGZvciAoRnJhbWVCdWZmZXIgZmIgOiBzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKLSAgICAgICAgICBmYi5jaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKTsKLSAgICAgICAgfQotICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuY2xlYXIoKTsKLSAgICAgIH0KKyAgICBwcm90ZWN0ZWQgRnJhbWVCdWZmZXIgY3JlYXRlRnJhbWVCdWZmZXIoZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAorICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LAorICAgICAgICBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfLmlzQXN5bmNQcm9jZXNzb3IoKSA/CisgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpIDoKKyAgICAgICAgICAgICAgICAgIG5ldyBGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzM4LDM2OCArMjMzLDE2IEBACiAgICAgICAgIGNsaWVudEtleSA9IGNsaWVudC5yZWdpc3RlclNlbGVjdG9yKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CiAKICAgICAgICAgLy8gYWRkIHRoaXMga2V5IHRvIHRoZSBtYXAKLSAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoY2xpZW50LCBjbGllbnRLZXkpOwotICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKKyAgICAgICAgICBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyKGNsaWVudCwgY2xpZW50S2V5LCBTZWxlY3RBY2NlcHRUaHJlYWQudGhpcyk7CisKKyAgICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CiAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIGFjY2VwdGluZy4KICAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gYWNjZXB0ISIsIHR0ZSk7CiAgICAgICAgIHR0ZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgaWYgKGNsaWVudEtleSAhPSBudWxsKSBjbGVhbnVwU2VsZWN0aW9ua2V5KGNsaWVudEtleSk7CisgICAgICAgIGlmIChjbGllbnRLZXkgIT0gbnVsbCkgY2xlYW51cFNlbGVjdGlvbktleShjbGllbnRLZXkpOwogICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIGNsaWVudC5jbG9zZSgpOwogICAgICAgfQogICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHJlYWQgZnJvbSBhIHJlYWRhYmxlIGNsaWVudC4gSWYgdGhlIGZyYW1lIGlzCi0gICAgICogZnVsbHkgcmVhZCwgdGhlbiBpbnZva2UgdGhlIG1ldGhvZCBjYWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZWFkKFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcilrZXkuYXR0YWNobWVudCgpOwotICAgICAgaWYgKCFidWZmZXIucmVhZCgpKSB7Ci0gICAgICAgIGNsZWFudXBTZWxlY3Rpb25rZXkoa2V5KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBpZiB0aGUgYnVmZmVyJ3MgZnJhbWUgcmVhZCBpcyBjb21wbGV0ZSwgaW52b2tlIHRoZSBtZXRob2QuCi0gICAgICBpZiAoYnVmZmVyLmlzRnJhbWVGdWxseVJlYWQoKSkgewotICAgICAgICBpZiAoIXJlcXVlc3RJbnZva2UoYnVmZmVyKSkgewotICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25rZXkoa2V5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExldCBhIHdyaXRhYmxlIGNsaWVudCBnZXQgd3JpdHRlbiwgaWYgdGhlcmUncyBkYXRhIHRvIGJlIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdyaXRlKFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgIEZyYW1lQnVmZmVyIGJ1ZmZlciA9IChGcmFtZUJ1ZmZlcilrZXkuYXR0YWNobWVudCgpOwotICAgICAgaWYgKCFidWZmZXIud3JpdGUoKSkgewotICAgICAgICBjbGVhbnVwU2VsZWN0aW9ua2V5KGtleSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gY29ubmVjdGlvbi1jbG9zZSBjbGVhbnVwIG9uIGEgZ2l2ZW4gU2VsZWN0aW9uS2V5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwU2VsZWN0aW9ua2V5KFNlbGVjdGlvbktleSBrZXkpIHsKLSAgICAgIC8vIHJlbW92ZSB0aGUgcmVjb3JkcyBmcm9tIHRoZSB0d28gbWFwcwotICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKWtleS5hdHRhY2htZW50KCk7Ci0gICAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKLSAgICAgICAgLy8gY2xvc2UgdGhlIGJ1ZmZlcgotICAgICAgICBidWZmZXIuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIC8vIGNhbmNlbCB0aGUgc2VsZWN0aW9uIGtleQotICAgICAga2V5LmNhbmNlbCgpOwotICAgIH0KLSAgfSAvLyBTZWxlY3RvclRocmVhZAotCi0gIC8qKgotICAgKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgYSBzb3J0IG9mIHN0YXRlIG1hY2hpbmUgYXJvdW5kIHRoZSBpbnRlcmFjdGlvbiB3aXRoCi0gICAqIGEgY2xpZW50IGFuZCBhbiBpbnZva2VyLiBJdCBtYW5hZ2VzIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgYW5kIGZyYW1lIGRhdGEsCi0gICAqIGdldHRpbmcgaXQgaGFuZGVkIG9mZiBhcyB3cmFwcGVkIHRyYW5zcG9ydHMsIGFuZCB0aGVuIHRoZSB3cml0aW5nIG9mCi0gICAqIHJlcG9uc2UgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuIEluIHRoZSBwcm9jZXNzIGl0IG1hbmFnZXMgZmxpcHBpbmcgdGhlCi0gICAqIHJlYWQgYW5kIHdyaXRlIGJpdHMgb24gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIGl0cyBjbGllbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgRnJhbWVCdWZmZXIgewotICAgIC8vCi0gICAgLy8gUG9zc2libGUgc3RhdGVzIGZvciB0aGUgRnJhbWVCdWZmZXIgc3RhdGUgbWFjaGluZS4KLSAgICAvLwotICAgIC8vIGluIHRoZSBtaWRzdCBvZiByZWFkaW5nIHRoZSBmcmFtZSBzaXplIG9mZiB0aGUgd2lyZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFESU5HX0ZSQU1FX1NJWkUgPSAxOwotICAgIC8vIHJlYWRpbmcgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIG5vdywgYnV0IG5vdCBhbGwgdGhlIHdheSBkb25lIHlldAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFESU5HX0ZSQU1FID0gMjsKLSAgICAvLyBjb21wbGV0ZWx5IHJlYWQgdGhlIGZyYW1lLCBzbyBhbiBpbnZvY2F0aW9uIGNhbiBub3cgaGFwcGVuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfRlJBTUVfQ09NUExFVEUgPSAzOwotICAgIC8vIHdhaXRpbmcgdG8gZ2V0IHN3aXRjaGVkIHRvIGxpc3RlbmluZyBmb3Igd3JpdGUgZXZlbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFID0gNDsKLSAgICAvLyBzdGFydGVkIHdyaXRpbmcgcmVzcG9uc2UgZGF0YSwgbm90IGZ1bGx5IGNvbXBsZXRlIHlldAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklUSU5HID0gNjsKLSAgICAvLyBhbm90aGVyIHRocmVhZCB3YW50cyB0aGlzIGZyYW1lYnVmZmVyIHRvIGdvIGJhY2sgdG8gcmVhZGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBV0FJVElOR19SRUdJU1RFUl9SRUFEID0gNzsKLSAgICAvLyB3ZSB3YW50IG91ciB0cmFuc3BvcnQgYW5kIHNlbGVjdGlvbiBrZXkgaW52YWxpZGF0ZWQgaW4gdGhlIHNlbGVjdG9yIHRocmVhZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBV0FJVElOR19DTE9TRSA9IDg7Ci0KLSAgICAvLwotICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcwotICAgIC8vCi0KLSAgICAvLyB0aGUgYWN0dWFsIHRyYW5zcG9ydCBob29rZWQgdXAgdG8gdGhlIGNsaWVudC4KLSAgICBwdWJsaWMgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zXzsKLQotICAgIC8vIHRoZSBTZWxlY3Rpb25LZXkgdGhhdCBjb3JyZXNwb25kcyB0byBvdXIgdHJhbnNwb3J0Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5XzsKLQotICAgIC8vIHdoZXJlIGluIHRoZSBwcm9jZXNzIG9mIHJlYWRpbmcvd3JpdGluZyBhcmUgd2U/Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdGVfID0gUkVBRElOR19GUkFNRV9TSVpFOwotCi0gICAgLy8gdGhlIEJ5dGVCdWZmZXIgd2UnbGwgYmUgdXNpbmcgdG8gd3JpdGUgYW5kIHJlYWQsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgYnVmZmVyXzsKLQotICAgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXNwb25zZV87Ci0KLSAgICBwdWJsaWMgRnJhbWVCdWZmZXIoIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkpIHsKLSAgICAgIHRyYW5zXyA9IHRyYW5zOwotICAgICAgc2VsZWN0aW9uS2V5XyA9IHNlbGVjdGlvbktleTsKLSAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byByZWFkLiBUaGUgc2VsZWN0b3IgbG9vcCBzaG91bGQgaGF2ZQotICAgICAqIHJlY2VpdmVkIGEgcmVhZCBldmVudCBmb3IgdGhpcyBGcmFtZUJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgbGl2ZSBvbiwgZmFsc2UgaWYgaXQgc2hvdWxkIGJlCi0gICAgICogY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhZCgpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gUkVBRElOR19GUkFNRV9TSVpFKSB7Ci0gICAgICAgIC8vIHRyeSB0byByZWFkIHRoZSBmcmFtZSBzaXplIGNvbXBsZXRlbHkKLSAgICAgICAgaWYgKCFpbnRlcm5hbFJlYWQoKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoZSBmcmFtZSBzaXplIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgdGhlbiBwcmVwYXJlIHRvIHJlYWQgdGhlCi0gICAgICAgIC8vIGFjdHVhbCBmcmFtZS4KLSAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgewotICAgICAgICAgIC8vIHB1bGwgb3V0IHRoZSBmcmFtZSBzaXplIGFzIGFuIGludGVnZXIuCi0gICAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZmZlcl8uZ2V0SW50KDApOwotICAgICAgICAgIGlmIChmcmFtZVNpemUgPD0gMCkgewotICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCi0gICAgICAgICAgICAgICsgIi4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBpZiB0aGlzIGZyYW1lIHdpbGwgYWx3YXlzIGJlIHRvbyBsYXJnZSBmb3IgdGhpcyBzZXJ2ZXIsIGxvZyB0aGUKLSAgICAgICAgICAvLyBlcnJvciBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgICAgaWYgKGZyYW1lU2l6ZSA+IE1BWF9SRUFEX0JVRkZFUl9CWVRFUykgewotICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGEgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCi0gICAgICAgICAgICAgICsgIiwgd2hpY2ggaXMgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dhYmxlIGJ1ZmZlciBzaXplIGZvciBBTEwgY29ubmVjdGlvbnMuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gaWYgdGhpcyBmcmFtZSB3aWxsIHB1c2ggdXMgb3ZlciB0aGUgbWVtb3J5IGxpbWl0LCB0aGVuIHJldHVybi4KLSAgICAgICAgICAvLyB3aXRoIGx1Y2ssIG1vcmUgbWVtb3J5IHdpbGwgZnJlZSB1cCB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KLSAgICAgICAgICBpZiAocmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkICsgZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBpbmNyZW1lbWVudCB0aGUgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgdG8gcmVhZCBidWZmZXJzCi0gICAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkICs9IGZyYW1lU2l6ZTsKLQotICAgICAgICAgIC8vIHJlYWxsb2NhdGUgdGhlIHJlYWRidWZmZXIgYXMgYSBmcmFtZS1zaXplZCBidWZmZXIKLSAgICAgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShmcmFtZVNpemUpOwotCi0gICAgICAgICAgc3RhdGVfID0gUkVBRElOR19GUkFNRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyB0aGlzIHNraXBzIHRoZSBjaGVjayBvZiBSRUFESU5HX0ZSQU1FIHN0YXRlIGJlbG93LCBzaW5jZSB3ZSBjYW4ndAotICAgICAgICAgIC8vIHBvc3NpYmx5IGdvIG9uIHRvIHRoYXQgc3RhdGUgaWYgdGhlcmUncyBkYXRhIGxlZnQgdG8gYmUgcmVhZCBhdAotICAgICAgICAgIC8vIHRoaXMgb25lLgotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHRoZSBSRUFESU5HX0ZSQU1FX1NJWkUgc2VjdGlvbgotICAgICAgLy8gdG8gUkVBRElOR19GUkFNRSBpZiB0aGVyZSdzIGFscmVhZHkgc29tZSBmcmFtZSBkYXRhIGF2YWlsYWJsZSBvbmNlCi0gICAgICAvLyBSRUFESU5HX0ZSQU1FX1NJWkUgaXMgY29tcGxldGUuCi0KLSAgICAgIGlmIChzdGF0ZV8gPT0gUkVBRElOR19GUkFNRSkgewotICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2luY2Ugd2UncmUgYWxyZWFkeSBpbiB0aGUgc2VsZWN0IGxvb3AgaGVyZSBmb3Igc3VyZSwgd2UgY2FuIGp1c3QKLSAgICAgICAgLy8gbW9kaWZ5IG91ciBzZWxlY3Rpb24ga2V5IGRpcmVjdGx5LgotICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7Ci0gICAgICAgICAgLy8gZ2V0IHJpZCBvZiB0aGUgcmVhZCBzZWxlY3QgaW50ZXJlc3RzCi0gICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcygwKTsKLSAgICAgICAgICBzdGF0ZV8gPSBSRUFEX0ZSQU1FX0NPTVBMRVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGlmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGlzIHBvaW50LCB0aGVuIHRoZSBzdGF0ZSBtdXN0IGJlIGludmFsaWQuCi0gICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgd2FzIGNhbGxlZCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIiArIHN0YXRlXyArICIpIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHdyaXRlIGl0cyBvdXRwdXQgdG8gdGhlIGZpbmFsIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZSgpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gV1JJVElORykgewotICAgICAgICB0cnkgewotICAgICAgICAgIGlmICh0cmFuc18ud3JpdGUoYnVmZmVyXykgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBkdXJpbmcgd3JpdGUhIiwgZSk7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UncmUgZG9uZSB3cml0aW5nLiBub3cgd2UgbmVlZCB0byBzd2l0Y2ggYmFjayB0byByZWFkaW5nLgotICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7Ci0gICAgICAgICAgcHJlcGFyZVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgTE9HR0VSLmVycm9yKCJXcml0ZSB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIiArIHN0YXRlXyArICIpIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHNldCBpdHMgaW50ZXJlc3QgdG8gd3JpdGUsIG9uY2UgZGF0YQotICAgICAqIGhhcyBjb21lIGluLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYW5nZVNlbGVjdEludGVyZXN0cygpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gQVdBSVRJTkdfUkVHSVNURVJfV1JJVEUpIHsKLSAgICAgICAgLy8gc2V0IHRoZSBPUF9XUklURSBpbnRlcmVzdAotICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7Ci0gICAgICAgIHN0YXRlXyA9IFdSSVRJTkc7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBBV0FJVElOR19SRUdJU1RFUl9SRUFEKSB7Ci0gICAgICAgIHByZXBhcmVSZWFkKCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBBV0FJVElOR19DTE9TRSl7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHNlbGVjdGlvbktleV8uY2FuY2VsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dHRVIuZXJyb3IoCi0gICAgICAgICAgImNoYW5nZVNlbGVjdEludGVyZXN0IHdhcyBjYWxsZWQsIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiCi0gICAgICAgICAgKyBzdGF0ZV8gKyAiKSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNodXQgdGhlIGNvbm5lY3Rpb24gZG93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgIC8vIGlmIHdlJ3JlIGJlaW5nIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYWxsb2NhdGVkIGEKLSAgICAgIC8vIGJ1ZmZlciB0aGF0IHdlIG5lZWQgdG8gc3VidHJhY3QgZm9yIG91ciBtZW1vcnkgYWNjb3VudGluZy4KLSAgICAgIGlmIChzdGF0ZV8gPT0gUkVBRElOR19GUkFNRSB8fCBzdGF0ZV8gPT0gUkVBRF9GUkFNRV9DT01QTEVURSkgewotICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgLT0gYnVmZmVyXy5hcnJheSgpLmxlbmd0aDsKLSAgICAgIH0KLSAgICAgIHRyYW5zXy5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoaXMgRnJhbWVCdWZmZXIgaGFzIGEgZnVsbCBmcmFtZSByZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRnJhbWVGdWxseVJlYWQoKSB7Ci0gICAgICByZXR1cm4gc3RhdGVfID09IFJFQURfRlJBTUVfQ09NUExFVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWZ0ZXIgdGhlIHByb2Nlc3NvciBoYXMgcHJvY2Vzc2VkIHRoZSBpbnZvY2F0aW9uLCB3aGF0ZXZlciB0aHJlYWQgaXMKLSAgICAgKiBtYW5hZ2luZyBpbnZvY2F0aW9ucyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbiB0aGlzIEZyYW1lQnVmZmVyIHNvIHdlCi0gICAgICoga25vdyBpdCdzIHRpbWUgdG8gc3RhcnQgdHJ5aW5nIHRvIHdyaXRlIGFnYWluLiBBbHNvLCBpZiBpdCB0dXJucyBvdXQKLSAgICAgKiB0aGF0IHRoZXJlIGFjdHVhbGx5IGlzbid0IGFueSBkYXRhIGluIHRoZSByZXNwb25zZSBidWZmZXIsIHdlJ2xsIHNraXAKLSAgICAgKiB0cnlpbmcgdG8gd3JpdGUgYW5kIGluc3RlYWQgZ28gYmFjayB0byByZWFkaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3BvbnNlUmVhZHkoKSB7Ci0gICAgICAvLyB0aGUgcmVhZCBidWZmZXIgaXMgZGVmaW5pdGVseSBubyBsb25nZXIgaW4gdXNlLCBzbyB3ZSB3aWxsIGRlY3JlbWVudAotICAgICAgLy8gb3VyIHJlYWQgYnVmZmVyIGNvdW50LiB3ZSBkbyB0aGlzIGhlcmUgYXMgd2VsbCBhcyBpbiBjbG9zZSBiZWNhdXNlCi0gICAgICAvLyB3ZSdkIGxpa2UgdG8gZnJlZSB0aGlzIHJlYWQgbWVtb3J5IHVwIGFzIHF1aWNrbHkgYXMgcG9zc2libGUgZm9yIG90aGVyCi0gICAgICAvLyBjbGllbnRzLgotICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkIC09IGJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGg7Ci0KLSAgICAgIGlmIChyZXNwb25zZV8ubGVuKCkgPT0gMCkgewotICAgICAgICAvLyBnbyBzdHJhaWdodCB0byByZWFkaW5nIGFnYWluLiB0aGlzIHdhcyBwcm9iYWJseSBhbiBvbmV3YXkgbWV0aG9kCi0gICAgICAgIHN0YXRlXyA9IEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ7Ci0gICAgICAgIGJ1ZmZlcl8gPSBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIud3JhcChyZXNwb25zZV8uZ2V0KCksIDAsIHJlc3BvbnNlXy5sZW4oKSk7Ci0KLSAgICAgICAgLy8gc2V0IHN0YXRlIHRoYXQgd2UncmUgd2FpdGluZyB0byBiZSBzd2l0Y2hlZCB0byB3cml0ZS4gd2UgZG8gdGhpcwotICAgICAgICAvLyBhc3luY2hyb25vdXNseSB0aHJvdWdoIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIGJlY2F1c2UgdGhlcmUgaXMgYQotICAgICAgICAvLyBwb3NzaWJpbGl0eSB0aGF0IHdlJ3JlIG5vdCBpbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCB0aHVzIGN1cnJlbnRseQotICAgICAgICAvLyBibG9ja2VkIGluIHNlbGVjdCgpLiAodGhpcyBmdW5jdGlvbmFsaXR5IGlzIGluIHBsYWNlIGZvciB0aGUgc2FrZSBvZgotICAgICAgICAvLyB0aGUgSHNIYSBzZXJ2ZXIuKQotICAgICAgICBzdGF0ZV8gPSBBV0FJVElOR19SRUdJU1RFUl9XUklURTsKLSAgICAgIH0KLSAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgbWV0aG9kIHNpZ25pZmllZCBieSB0aGlzIEZyYW1lQnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKLSAgICAgIFRUcmFuc3BvcnQgaW5UcmFucyA9IGdldElucHV0VHJhbnNwb3J0KCk7Ci0gICAgICBUUHJvdG9jb2wgaW5Qcm90ID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGluVHJhbnMpOwotICAgICAgVFByb3RvY29sIG91dFByb3QgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGdldE91dHB1dFRyYW5zcG9ydCgpKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluVHJhbnMpLnByb2Nlc3MoaW5Qcm90LCBvdXRQcm90KTsKLSAgICAgICAgcmVzcG9uc2VSZWFkeSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGlsZSBpbnZva2luZyEiLCBlKTsKLSAgICAgIH0KLSAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB0aGVyZSBpcyBhbiBleGNlcHRpb24uCi0gICAgICBzdGF0ZV8gPSBBV0FJVElOR19DTE9TRTsKLSAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyYXAgdGhlIHJlYWQgYnVmZmVyIGluIGEgbWVtb3J5LWJhc2VkIHRyYW5zcG9ydCBzbyBhIHByb2Nlc3NvciBjYW4gcmVhZAotICAgICAqIHRoZSBkYXRhIGl0IG5lZWRzIHRvIGhhbmRsZSBhbiBpbnZvY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgVFRyYW5zcG9ydCBnZXRJbnB1dFRyYW5zcG9ydCgpIHsKLSAgICAgIHJldHVybiBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KGJ1ZmZlcl8uYXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgaW52b2tlciBmb3IgcmVzcG9uZGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRUcmFuc3BvcnQgZ2V0T3V0cHV0VHJhbnNwb3J0KCkgewotICAgICAgcmVzcG9uc2VfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChyZXNwb25zZV8pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgcmVhZCBpbnRvIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZCBzdWNjZWVkZWQsIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvciB0aGUKLSAgICAgKiBjb25uZWN0aW9uIGNsb3NlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxSZWFkKCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKHRyYW5zXy5yZWFkKGJ1ZmZlcl8pIDwgMCkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBpbiBpbnRlcm5hbFJlYWQhIiwgZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSdyZSBkb25lIHdyaXRpbmcsIHNvIHJlc2V0IG91ciBpbnRlcmVzdCBvcHMgYW5kIGNoYW5nZSBzdGF0ZSBhY2NvcmRpbmdseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZVJlYWQoKSB7Ci0gICAgICAvLyB3ZSBjYW4gc2V0IG91ciBpbnRlcmVzdCBkaXJlY3RseSB3aXRob3V0IHVzaW5nIHRoZSBxdWV1ZSBiZWNhdXNlCi0gICAgICAvLyB3ZSdyZSBpbiB0aGUgc2VsZWN0IHRocmVhZC4KLSAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1JFQUQpOwotICAgICAgLy8gZ2V0IHJlYWR5IGZvciBhbm90aGVyIGdvLWFyb3VuZAotICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7Ci0gICAgICBzdGF0ZV8gPSBSRUFESU5HX0ZSQU1FX1NJWkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiB0aGlzIEZyYW1lQnVmZmVyIG5lZWRzIHRvIGNoYW5nZSBpdCdzIHNlbGVjdCBpbnRlcmVzdHMgYW5kIGV4ZWN1dGlvbgotICAgICAqIG1pZ2h0IG5vdCBiZSBpbiB0aGUgc2VsZWN0IHRocmVhZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG1ha2Ugc3VyZSB0aGUKLSAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgZ2V0cyBkb25lIHdoZW4gdGhlIHNlbGVjdCB0aHJlYWQgd2FrZXMgYmFjayB1cC4gV2hlbiB0aGUKLSAgICAgKiBjdXJyZW50IHRocmVhZCBpcyB0aGUgc2VsZWN0IHRocmVhZCwgdGhlbiBpdCBqdXN0IGRvZXMgdGhlIGludGVyZXN0IGNoYW5nZQotICAgICAqIGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSB7Ci0gICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBzZWxlY3RUaHJlYWRfKSB7Ci0gICAgICAgIGNoYW5nZVNlbGVjdEludGVyZXN0cygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyLnRoaXMucmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKHRoaXMpOwotICAgICAgfQotICAgIH0KLSAgfSAvLyBGcmFtZUJ1ZmZlcgorICB9IC8vIFNlbGVjdEFjY2VwdFRocmVhZAogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQppbmRleCAwYWY2NmQzLi5iYWMwNmIyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQpAQCAtMTIzLDcgKzEyMywxMyBAQAogICAgKi8KICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKIAotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aW5nOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNTZXJ2aW5nOworCisgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcl87CisKKyAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgorICAvLyBQbGVhc2Ugc2VlIFRIUklGVC0xNzk1IGZvciB0aGUgdXNhZ2Ugb2YgdGhpcyBmbGFnCisgIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gZmFsc2U7CiAKICAgcHJvdGVjdGVkIFRTZXJ2ZXIoQWJzdHJhY3RTZXJ2ZXJBcmdzIGFyZ3MpIHsKICAgICBwcm9jZXNzb3JGYWN0b3J5XyA9IGFyZ3MucHJvY2Vzc29yRmFjdG9yeTsKQEAgLTE1Miw0ICsxNTgsMjAgQEAKICAgcHJvdGVjdGVkIHZvaWQgc2V0U2VydmluZyhib29sZWFuIHNlcnZpbmcpIHsKICAgICBpc1NlcnZpbmcgPSBzZXJ2aW5nOwogICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKSB7CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKyAgfQorCisgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpIHsKKyAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFNob3VsZFN0b3AoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RvcHBlZF87CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTaG91bGRTdG9wKGJvb2xlYW4gc2hvdWxkU3RvcCkgeworICAgIHRoaXMuc3RvcHBlZF8gPSBzaG91bGRTdG9wOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjliOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIEludGVyZmFjZSB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlciBjb3JlLiBUbworICogdXNlIHRoaXMgeW91IHNob3VsZCBzdWJjbGFzcyBpdCBhbmQgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IGNhcmUKKyAqIGFib3V0LiBZb3VyIHN1YmNsYXNzIGNhbiBhbHNvIHN0b3JlIGxvY2FsIGRhdGEgdGhhdCB5b3UgbWF5IGNhcmUgYWJvdXQsCisgKiBzdWNoIGFzIGFkZGl0aW9uYWwgImFyZ3VtZW50cyIgdG8gdGhlc2UgbWV0aG9kcyAoc3RvcmVkIGluIHRoZSBvYmplY3QKKyAqIGluc3RhbmNlJ3Mgc3RhdGUpLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworCisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgKi8KKyAgdm9pZCBwcmVTZXJ2ZSgpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICovCisgIFNlcnZlckNvbnRleHQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0KTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlcgorICAgKiBjb250ZXh0LgorICAgKi8KKyAgdm9pZCBkZWxldGVDb250ZXh0KFNlcnZlckNvbnRleHQgc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0KTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgKi8KKyAgdm9pZCBwcm9jZXNzQ29udGV4dChTZXJ2ZXJDb250ZXh0IHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0LCBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCmluZGV4IGVmMWIxMGEuLmU4MTViMmMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCkBAIC0zNSwxNCArMzUsMTEgQEAKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNpbXBsZVNlcnZlci5jbGFzcy5nZXROYW1lKCkpOwogCi0gIHByaXZhdGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwotCiAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKEFic3RyYWN0U2VydmVyQXJncyBhcmdzKSB7CiAgICAgc3VwZXIoYXJncyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICBzdG9wcGVkXyA9IGZhbHNlOwogICAgIHRyeSB7CiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CkBAIC01MCw2ICs0NywxMSBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKKyAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CisgICAgfQorCiAgICAgc2V0U2VydmluZyh0cnVlKTsKIAogICAgIHdoaWxlICghc3RvcHBlZF8pIHsKQEAgLTU5LDYgKzYxLDcgQEAKICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICBTZXJ2ZXJDb250ZXh0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKICAgICAgIHRyeSB7CiAgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KCk7CiAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewpAQCAtNjcsNyArNzAsMTcgQEAKICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICB3aGlsZSAocHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7fQorICAgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgpAQCAtODEsNiArOTQsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogCisgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgIGV2ZW50SGFuZGxlcl8uZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgfQorCiAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkgewogICAgICAgICBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCmluZGV4IDg1NTM3YmYuLjE2OTdhZDYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKQEAgLTE5LDcgKzE5LDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTI3LDYgKzI5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKQEAgLTQ1LDggKzQ4LDEzIEBACiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJncyBleHRlbmRzIEFic3RyYWN0U2VydmVyQXJnczxBcmdzPiB7CiAgICAgcHVibGljIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gNTsKICAgICBwdWJsaWMgaW50IG1heFdvcmtlclRocmVhZHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZTsKICAgICBwdWJsaWMgaW50IHN0b3BUaW1lb3V0VmFsID0gNjA7CiAgICAgcHVibGljIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgICAgcHVibGljIGludCByZXF1ZXN0VGltZW91dCA9IDIwOworICAgIHB1YmxpYyBUaW1lVW5pdCByZXF1ZXN0VGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIHB1YmxpYyBpbnQgYmVCYWNrb2ZmU2xvdExlbmd0aCA9IDEwMDsKKyAgICBwdWJsaWMgVGltZVVuaXQgYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiAKICAgICBwdWJsaWMgQXJncyhUU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgICAgc3VwZXIodHJhbnNwb3J0KTsKQEAgLTYxLDUxICs2OSwxNjEgQEAKICAgICAgIG1heFdvcmtlclRocmVhZHMgPSBuOwogICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRWYWwoaW50IG4pIHsKKyAgICAgIHN0b3BUaW1lb3V0VmFsID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHN0b3BUaW1lb3V0VW5pdChUaW1lVW5pdCB0dSkgeworICAgICAgc3RvcFRpbWVvdXRVbml0ID0gdHU7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyByZXF1ZXN0VGltZW91dChpbnQgbikgeworICAgICAgcmVxdWVzdFRpbWVvdXQgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgcmVxdWVzdFRpbWVvdXRVbml0KFRpbWVVbml0IHR1KSB7CisgICAgICByZXF1ZXN0VGltZW91dFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAvL0JpbmFyeSBleHBvbmVudGlhbCBiYWNrb2ZmIHNsb3QgbGVuZ3RoCisgICAgcHVibGljIEFyZ3MgYmVCYWNrb2ZmU2xvdExlbmd0aChpbnQgbikgeworICAgICAgYmVCYWNrb2ZmU2xvdExlbmd0aCA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvL0JpbmFyeSBleHBvbmVudGlhbCBiYWNrb2ZmIHNsb3QgdGltZSB1bml0CisgICAgcHVibGljIEFyZ3MgYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIGJlQmFja29mZlNsb3RMZW5ndGhVbml0ID0gdHU7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBleGVjdXRvclNlcnZpY2UoRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CiAgIH0KIAogICAvLyBFeGVjdXRvciBzZXJ2aWNlIGZvciBoYW5kbGluZyBjbGllbnQgY29ubmVjdGlvbnMKICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlXzsKIAotICAvLyBGbGFnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXzsKLQogICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdDsKIAogICBwcml2YXRlIGZpbmFsIGxvbmcgc3RvcFRpbWVvdXRWYWw7CiAKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCByZXF1ZXN0VGltZW91dFVuaXQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlcXVlc3RUaW1lb3V0OworCisgIHByaXZhdGUgZmluYWwgbG9uZyBiZUJhY2tvZmZTbG90SW5NaWxsaXM7CisKKyAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKEFyZ3MgYXJncykgewogICAgIHN1cGVyKGFyZ3MpOwogCi0gICAgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4gZXhlY3V0b3JRdWV1ZSA9Ci0gICAgICBuZXcgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4oKTsKLQogICAgIHN0b3BUaW1lb3V0VW5pdCA9IGFyZ3Muc3RvcFRpbWVvdXRVbml0OwogICAgIHN0b3BUaW1lb3V0VmFsID0gYXJncy5zdG9wVGltZW91dFZhbDsKKyAgICByZXF1ZXN0VGltZW91dFVuaXQgPSBhcmdzLnJlcXVlc3RUaW1lb3V0VW5pdDsKKyAgICByZXF1ZXN0VGltZW91dCA9IGFyZ3MucmVxdWVzdFRpbWVvdXQ7CisgICAgYmVCYWNrb2ZmU2xvdEluTWlsbGlzID0gYXJncy5iZUJhY2tvZmZTbG90TGVuZ3RoVW5pdC50b01pbGxpcyhhcmdzLmJlQmFja29mZlNsb3RMZW5ndGgpOwogCi0gICAgZXhlY3V0b3JTZXJ2aWNlXyA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoYXJncy5taW5Xb3JrZXJUaHJlYWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MubWF4V29ya2VyVGhyZWFkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yUXVldWUpOworICAgIGV4ZWN1dG9yU2VydmljZV8gPSBhcmdzLmV4ZWN1dG9yU2VydmljZSAhPSBudWxsID8KKyAgICAgICAgYXJncy5leGVjdXRvclNlcnZpY2UgOiBjcmVhdGVEZWZhdWx0RXhlY3V0b3JTZXJ2aWNlKGFyZ3MpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGNyZWF0ZURlZmF1bHRFeGVjdXRvclNlcnZpY2UoQXJncyBhcmdzKSB7CisgICAgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4gZXhlY3V0b3JRdWV1ZSA9CisgICAgICBuZXcgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4oKTsKKyAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihhcmdzLm1pbldvcmtlclRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5tYXhXb3JrZXJUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdG9wVGltZW91dFVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JRdWV1ZSk7CisgIH0KIAotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICB0cnkgeworICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlXzsKKyAgfQorICAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlU2VydmUoKSB7CisgIAl0cnkgewogICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgbGlzdGVuaW5nLiIsIHR0eCk7Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAorICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKKyAgICB9CiAgICAgc3RvcHBlZF8gPSBmYWxzZTsKICAgICBzZXRTZXJ2aW5nKHRydWUpOworICAgIAorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2VydmUoKSB7CisgIAlpZiAoIXByZVNlcnZlKCkpIHsKKyAgCQlyZXR1cm47CisgIAl9CisKKyAgCWV4ZWN1dGUoKTsKKyAgCXdhaXRGb3JTaHV0ZG93bigpOworICAgIAorICAgIHNldFNlcnZpbmcoZmFsc2UpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgeworICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwogICAgIHdoaWxlICghc3RvcHBlZF8pIHsKLSAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwogICAgICAgdHJ5IHsKICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLmFjY2VwdCgpOwogICAgICAgICBXb3JrZXJQcm9jZXNzIHdwID0gbmV3IFdvcmtlclByb2Nlc3MoY2xpZW50KTsKLSAgICAgICAgZXhlY3V0b3JTZXJ2aWNlXy5leGVjdXRlKHdwKTsKKworICAgICAgICBpbnQgcmV0cnlDb3VudCA9IDA7CisgICAgICAgIGxvbmcgcmVtYWluVGltZUluTWlsbGlzID0gcmVxdWVzdFRpbWVvdXRVbml0LnRvTWlsbGlzKHJlcXVlc3RUaW1lb3V0KTsKKyAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2VfLmV4ZWN1dGUod3ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICByZXRyeUNvdW50Kys7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpblRpbWVJbk1pbGxpcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgIC8vZG8gYSB0cnVuY2F0ZWQgMjAgYmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xlZXAKKyAgICAgICAgICAgICAgICAgIGxvbmcgc2xlZXBUaW1lSW5NaWxsaXMgPSAoKGxvbmcpIChyYW5kb20ubmV4dERvdWJsZSgpICoKKyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgTWF0aC5taW4ocmV0cnlDb3VudCwgMjApKSkpICogYmVCYWNrb2ZmU2xvdEluTWlsbGlzOworICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lSW5NaWxsaXMgPSBNYXRoLm1pbihzbGVlcFRpbWVJbk1pbGxpcywgcmVtYWluVGltZUluTWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcChzbGVlcFRpbWVJbk1pbGxpcyk7CisgICAgICAgICAgICAgICAgICByZW1haW5UaW1lSW5NaWxsaXMgPSByZW1haW5UaW1lSW5NaWxsaXMgLSBzbGVlcFRpbWVJbk1pbGxpczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICB3cCA9IG51bGw7CisgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybigiVGFzayBoYXMgYmVlbiByZWplY3RlZCBieSBFeGVjdXRvclNlcnZpY2UgIiArIHJldHJ5Q291bnQKKyAgICAgICAgICAgICAgICAgICAgICArICIgdGltZXMgdGlsbCB0aW1lZG91dCwgcmVhc29uOiAiICsgdCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIud2FybigiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyB0byBwbGFjZSBjbGllbnQgb24gZXhlY3V0b3IgcXVldWUuIik7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGVjdXRvclNlcnZpY2UgdGhyZXcgZXJyb3I6ICIgKyB0LCB0KTsKKyAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvL2ZvciBvdGhlciBwb3NzaWJsZSBydW50aW1lIGVycm9ycyBmcm9tIEV4ZWN1dG9yU2VydmljZSwgc2hvdWxkIGFsc28gbm90IGtpbGwgc2VydmUKKyAgICAgICAgICAgICAgTE9HR0VSLndhcm4oIkV4ZWN1dG9yU2VydmljZSB0aHJldyBlcnJvcjogIiArIHQsIHQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CiAgICAgICAgIGlmICghc3RvcHBlZF8pIHsKICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKQEAgLTExMyw4ICsyMzEsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLQotICAgIGV4ZWN1dG9yU2VydmljZV8uc2h1dGRvd24oKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgeworICAJZXhlY3V0b3JTZXJ2aWNlXy5zaHV0ZG93bigpOwogCiAgICAgLy8gTG9vcCB1bnRpbCBhd2FpdFRlcm1pbmF0aW9uIGZpbmFsbHkgZG9lcyByZXR1cm4gd2l0aG91dCBhIGludGVycnVwdGVkCiAgICAgLy8gZXhjZXB0aW9uLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHdlJ2xsIHNodXQgZG93biBwcmVtYXR1cmVseS4gV2Ugd2FudApAQCAtMTMyLDcgKzI1Miw2IEBACiAgICAgICAgIG5vdyA9IG5ld25vdzsKICAgICAgIH0KICAgICB9Ci0gICAgc2V0U2VydmluZyhmYWxzZSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzdG9wKCkgewpAQCAtMTY1LDI5ICsyODQsNjIgQEAKICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisKKyAgICAgIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyID0gbnVsbDsKKyAgICAgIFNlcnZlckNvbnRleHQgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworCiAgICAgICB0cnkgewogICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5Xy5nZXRQcm9jZXNzb3IoY2xpZW50Xyk7CiAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50Xyk7CiAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnRfKTsKICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CiAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgIGV2ZW50SGFuZGxlciA9IGdldEV2ZW50SGFuZGxlcigpOworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgfQogICAgICAgICAvLyB3ZSBjaGVjayBzdG9wcGVkXyBmaXJzdCB0byBtYWtlIHN1cmUgd2UncmUgbm90IHN1cHBvc2VkIHRvIGJlIHNodXR0aW5nCiAgICAgICAgIC8vIGRvd24uIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBncmFjZWZ1bCBzaHV0ZG93bi4KLSAgICAgICAgd2hpbGUgKCFzdG9wcGVkXyAmJiBwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHt9Ci0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICAvLyBBc3N1bWUgdGhlIGNsaWVudCBkaWVkIGFuZCBjb250aW51ZSBzaWxlbnRseQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoc3RvcHBlZF8gfHwgIXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgewogICAgICAgICBMT0dHRVIuZXJyb3IoIlRocmlmdCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHR4KTsKICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgICAvLyBXZSdsbCB1c3VhbGx5IHJlY2VpdmUgUnVudGltZUV4Y2VwdGlvbiB0eXBlcyBoZXJlCisgICAgICAgIC8vIE5lZWQgdG8gdW53cmFwIHRvIGFzY2VydGFpbiByZWFsIGNhdXNpbmcgZXhjZXB0aW9uIGJlZm9yZSB3ZSBjaG9vc2UgdG8gaWdub3JlCisgICAgICAgIFRocm93YWJsZSByZWFsQ2F1c2UgPSB4LmdldENhdXNlKCk7CisgICAgICAgIC8vIElnbm9yZSBlcnItbG9nZ2luZyBhbGwgdHJhbnNwb3J0LWxldmVsL3R5cGUgZXhjZXB0aW9ucworICAgICAgICBpZiAoKHJlYWxDYXVzZSAhPSBudWxsICYmIHJlYWxDYXVzZSBpbnN0YW5jZW9mIFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB8fCAoeCBpbnN0YW5jZW9mIFRUcmFuc3BvcnRFeGNlcHRpb24pKSB7CisgICAgICAgICAgTE9HR0VSLmRlYnVnKAorICAgICAgICAgICAgICAiUmVjZWl2ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiBJZ25vcmluZy4iLAorICAgICAgICAgICAgICB4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBMb2cgdGhlIGV4Y2VwdGlvbiBhdCBlcnJvciBsZXZlbCBhbmQgY29udGludWUKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIiwgeCk7CisgICAgICAgIH0KKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRfLmlzT3BlbigpKSB7CisgICAgICAgICAgY2xpZW50Xy5jbG9zZSgpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDc0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQSBIYWxmLVN5bmMvSGFsZi1Bc3luYyBzZXJ2ZXIgd2l0aCBhIHNlcGFyYXRlIHBvb2wgb2YgdGhyZWFkcyB0byBoYW5kbGUKKyAqIG5vbi1ibG9ja2luZyBJL08uIEFjY2VwdHMgYXJlIGhhbmRsZWQgb24gYSBzaW5nbGUgdGhyZWFkLCBhbmQgYSBjb25maWd1cmFibGUKKyAqIG51bWJlciBvZiBub25ibG9ja2luZyBzZWxlY3RvciB0aHJlYWRzIG1hbmFnZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIGNsaWVudAorICogY29ubmVjdGlvbnMuIEEgc3luY2hyb25vdXMgd29ya2VyIHRocmVhZCBwb29sIGhhbmRsZXMgcHJvY2Vzc2luZyBvZiByZXF1ZXN0cy4KKyAqCisgKiBQZXJmb3JtcyBiZXR0ZXIgdGhhbiBUTm9uYmxvY2tpbmdTZXJ2ZXIvVEhzSGFTZXJ2ZXIgaW4gbXVsdGktY29yZQorICogZW52aXJvbm1lbnRzIHdoZW4gdGhlIHRoZSBib3R0bGVuZWNrIGlzIENQVSBvbiB0aGUgc2luZ2xlIHNlbGVjdG9yIHRocmVhZAorICogaGFuZGxpbmcgSS9PLiBJbiBhZGRpdGlvbiwgYmVjYXVzZSB0aGUgYWNjZXB0IGhhbmRsaW5nIGlzIGRlY291cGxlZCBmcm9tCisgKiByZWFkcy93cml0ZXMgYW5kIGludm9jYXRpb24sIHRoZSBzZXJ2ZXIgaGFzIGJldHRlciBhYmlsaXR5IHRvIGhhbmRsZSBiYWNrLQorICogcHJlc3N1cmUgZnJvbSBuZXcgY29ubmVjdGlvbnMgKGUuZy4gc3RvcCBhY2NlcHRpbmcgd2hlbiBidXN5KS4KKyAqCisgKiBMaWtlIFROb25ibG9ja2luZ1NlcnZlciwgaXQgcmVsaWVzIG9uIHRoZSB1c2Ugb2YgVEZyYW1lZFRyYW5zcG9ydC4KKyAqLworcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5jbGFzcy5nZXROYW1lKCkpOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJncyBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPEFyZ3M+IHsKKworICAgIC8qKiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHNlbGVjdGluZyBvbiBhbHJlYWR5LWFjY2VwdGVkIGNvbm5lY3Rpb25zICovCisgICAgcHVibGljIGludCBzZWxlY3RvclRocmVhZHMgPSAyOworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBleGVjdXRvciBzZXJ2aWNlIChpZiBub25lIGlzIHNwZWNpZmllZCkgdGhhdCB3aWxsIGhhbmRsZQorICAgICAqIGludm9jYXRpb25zLiBUaGlzIG1heSBiZSBzZXQgdG8gMCwgaW4gd2hpY2ggY2FzZSBpbnZvY2F0aW9ucyB3aWxsIGJlCisgICAgICogaGFuZGxlZCBkaXJlY3RseSBvbiB0aGUgc2VsZWN0b3IgdGhyZWFkcyAoYXMgaXMgaW4gVE5vbmJsb2NraW5nU2VydmVyKQorICAgICAqLworICAgIHByaXZhdGUgaW50IHdvcmtlclRocmVhZHMgPSA1OworICAgIC8qKiBUaW1lIHRvIHdhaXQgZm9yIHNlcnZlciB0byBzdG9wIGdyYWNlZnVsbHkgKi8KKyAgICBwcml2YXRlIGludCBzdG9wVGltZW91dFZhbCA9IDYwOworICAgIHByaXZhdGUgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgICAvKiogVGhlIEV4ZWN1dG9yU2VydmljZSBmb3IgaGFuZGxpbmcgZGlzcGF0Y2hlZCByZXF1ZXN0cyAqLworICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IG51bGw7CisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgdGhlIGJsb2NraW5nIHF1ZXVlIHBlciBzZWxlY3RvciB0aHJlYWQgZm9yIHBhc3NpbmcgYWNjZXB0ZWQKKyAgICAgKiBjb25uZWN0aW9ucyB0byB0aGUgc2VsZWN0b3IgdGhyZWFkCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkID0gNDsKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIHN0cmF0ZWd5IGZvciBoYW5kbGluZyBuZXcgYWNjZXB0ZWQgY29ubmVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBlbnVtIEFjY2VwdFBvbGljeSB7CisgICAgICAvKioKKyAgICAgICAqIFJlcXVpcmUgYWNjZXB0ZWQgY29ubmVjdGlvbiByZWdpc3RyYXRpb24gdG8gYmUgaGFuZGxlZCBieSB0aGUgZXhlY3V0b3IuCisgICAgICAgKiBJZiB0aGUgd29ya2VyIHBvb2wgaXMgc2F0dXJhdGVkLCBmdXJ0aGVyIGFjY2VwdHMgd2lsbCBiZSBjbG9zZWQKKyAgICAgICAqIGltbWVkaWF0ZWx5LiBTbGlnaHRseSBpbmNyZWFzZXMgbGF0ZW5jeSBkdWUgdG8gYW4gZXh0cmEgc2NoZWR1bGluZy4KKyAgICAgICAqLworICAgICAgRkFJUl9BQ0NFUFQsCisgICAgICAvKioKKyAgICAgICAqIEhhbmRsZSB0aGUgYWNjZXB0cyBhcyBmYXN0IGFzIHBvc3NpYmxlLCBkaXNyZWdhcmRpbmcgdGhlIHN0YXR1cyBvZiB0aGUKKyAgICAgICAqIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICAgKi8KKyAgICAgIEZBU1RfQUNDRVBUCisgICAgfQorCisgICAgcHJpdmF0ZSBBY2NlcHRQb2xpY3kgYWNjZXB0UG9saWN5ID0gQWNjZXB0UG9saWN5LkZBU1RfQUNDRVBUOworCisgICAgcHVibGljIEFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzZWxlY3RvclRocmVhZHMoaW50IGkpIHsKKyAgICAgIHNlbGVjdG9yVGhyZWFkcyA9IGk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNlbGVjdG9yVGhyZWFkcygpIHsKKyAgICAgIHJldHVybiBzZWxlY3RvclRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgd29ya2VyVGhyZWFkcyhpbnQgaSkgeworICAgICAgd29ya2VyVGhyZWFkcyA9IGk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gd29ya2VyVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0b3BUaW1lb3V0VmFsKCkgeworICAgICAgcmV0dXJuIHN0b3BUaW1lb3V0VmFsOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHN0b3BUaW1lb3V0VmFsKGludCBzdG9wVGltZW91dFZhbCkgeworICAgICAgdGhpcy5zdG9wVGltZW91dFZhbCA9IHN0b3BUaW1lb3V0VmFsOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFRpbWVVbml0IGdldFN0b3BUaW1lb3V0VW5pdCgpIHsKKyAgICAgIHJldHVybiBzdG9wVGltZW91dFVuaXQ7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRVbml0KFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCkgeworICAgICAgdGhpcy5zdG9wVGltZW91dFVuaXQgPSBzdG9wVGltZW91dFVuaXQ7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgIHJldHVybiBleGVjdXRvclNlcnZpY2U7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgZXhlY3V0b3JTZXJ2aWNlKEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgIHRoaXMuZXhlY3V0b3JTZXJ2aWNlID0gZXhlY3V0b3JTZXJ2aWNlOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQoKSB7CisgICAgICByZXR1cm4gYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZChpbnQgYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkKSB7CisgICAgICB0aGlzLmFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCA9IGFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBY2NlcHRQb2xpY3kgZ2V0QWNjZXB0UG9saWN5KCkgeworICAgICAgcmV0dXJuIGFjY2VwdFBvbGljeTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBhY2NlcHRQb2xpY3koQWNjZXB0UG9saWN5IGFjY2VwdFBvbGljeSkgeworICAgICAgdGhpcy5hY2NlcHRQb2xpY3kgPSBhY2NlcHRQb2xpY3k7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgIGlmIChzZWxlY3RvclRocmVhZHMgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvclRocmVhZHMgbXVzdCBiZSBwb3NpdGl2ZS4iKTsKKyAgICAgIH0KKyAgICAgIGlmICh3b3JrZXJUaHJlYWRzIDwgMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3b3JrZXJUaHJlYWRzIG11c3QgYmUgbm9uLW5lZ2F0aXZlLiIpOworICAgICAgfQorICAgICAgaWYgKGFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCBtdXN0IGJlIHBvc2l0aXZlLiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFRoZSB0aHJlYWQgaGFuZGxpbmcgYWxsIGFjY2VwdHMKKyAgcHJpdmF0ZSBBY2NlcHRUaHJlYWQgYWNjZXB0VGhyZWFkOworCisgIC8vIFRocmVhZHMgaGFuZGxpbmcgZXZlbnRzIG9uIGNsaWVudCB0cmFuc3BvcnRzCisgIHByaXZhdGUgZmluYWwgU2V0PFNlbGVjdG9yVGhyZWFkPiBzZWxlY3RvclRocmVhZHMgPSBuZXcgSGFzaFNldDxTZWxlY3RvclRocmVhZD4oKTsKKworICAvLyBUaGlzIHdyYXBzIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBxdWV1ZWluZyBhbmQgdGhyZWFkIHBvb2wgbWFuYWdlbWVudAorICAvLyBmb3IgdGhlIHBhc3Npbmcgb2YgSW52b2NhdGlvbnMgZnJvbSB0aGUgc2VsZWN0b3IgdGhyZWFkKHMpIHRvIHRoZSB3b3JrZXJzCisgIC8vIChpZiBhbnkpLgorICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBpbnZva2VyOworCisgIHByaXZhdGUgZmluYWwgQXJncyBhcmdzOworCisgIC8qKgorICAgKiBDcmVhdGUgdGhlIHNlcnZlciB3aXRoIHRoZSBzcGVjaWZpZWQgQXJncyBjb25maWd1cmF0aW9uCisgICAqLworICBwdWJsaWMgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIoQXJncyBhcmdzKSB7CisgICAgc3VwZXIoYXJncyk7CisgICAgYXJncy52YWxpZGF0ZSgpOworICAgIGludm9rZXIgPSBhcmdzLmV4ZWN1dG9yU2VydmljZSA9PSBudWxsID8gY3JlYXRlRGVmYXVsdEV4ZWN1dG9yKGFyZ3MpIDogYXJncy5leGVjdXRvclNlcnZpY2U7CisgICAgdGhpcy5hcmdzID0gYXJnczsKKyAgfQorCisgIC8qKgorICAgKiBTdGFydCB0aGUgYWNjZXB0IGFuZCBzZWxlY3RvciB0aHJlYWRzIHJ1bm5pbmcgdG8gZGVhbCB3aXRoIGNsaWVudHMuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGZhbHNlIGlmIHdlIGNvdWxkbid0IHN0YXJ0IGZvciBzb21lCisgICAqICAgICAgICAgcmVhc29uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0VGhyZWFkcygpIHsKKyAgICB0cnkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNlbGVjdG9yVGhyZWFkczsgKytpKSB7CisgICAgICAgIHNlbGVjdG9yVGhyZWFkcy5hZGQobmV3IFNlbGVjdG9yVGhyZWFkKGFyZ3MuYWNjZXB0UXVldWVTaXplUGVyVGhyZWFkKSk7CisgICAgICB9CisgICAgICBhY2NlcHRUaHJlYWQgPSBuZXcgQWNjZXB0VGhyZWFkKChUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQpIHNlcnZlclRyYW5zcG9ydF8sCisgICAgICAgIGNyZWF0ZVNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyKHNlbGVjdG9yVGhyZWFkcykpOworICAgICAgZm9yIChTZWxlY3RvclRocmVhZCB0aHJlYWQgOiBzZWxlY3RvclRocmVhZHMpIHsKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICB9CisgICAgICBhY2NlcHRUaHJlYWQuc3RhcnQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IHRocmVhZHMhIiwgZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEpvaW5zIHRoZSBhY2NlcHQgYW5kIHNlbGVjdG9yIHRocmVhZHMgYW5kIHNodXRzIGRvd24gdGhlIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgeworICAgIHRyeSB7CisgICAgICBqb2luVGhyZWFkcygpOworICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIE5vbi1ncmFjZWZ1bCBzaHV0ZG93biBvY2N1cnJlZAorICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcnJ1cHRlZCB3aGlsZSBqb2luaW5nIHRocmVhZHMhIiwgZSk7CisgICAgfQorICAgIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBqb2luVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgaW8gdGhyZWFkcyBleGl0CisgICAgYWNjZXB0VGhyZWFkLmpvaW4oKTsKKyAgICBmb3IgKFNlbGVjdG9yVGhyZWFkIHRocmVhZCA6IHNlbGVjdG9yVGhyZWFkcykgeworICAgICAgdGhyZWFkLmpvaW4oKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU3RvcCBzZXJ2aW5nIGFuZCBzaHV0IGV2ZXJ5dGhpbmcgZG93bi4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgIHN0b3BwZWRfID0gdHJ1ZTsKKworICAgIC8vIFN0b3AgcXVldWluZyBjb25uZWN0IGF0dGVtcHRzIGFzYXAKKyAgICBzdG9wTGlzdGVuaW5nKCk7CisKKyAgICBpZiAoYWNjZXB0VGhyZWFkICE9IG51bGwpIHsKKyAgICAgIGFjY2VwdFRocmVhZC53YWtldXBTZWxlY3RvcigpOworICAgIH0KKyAgICBpZiAoc2VsZWN0b3JUaHJlYWRzICE9IG51bGwpIHsKKyAgICAgIGZvciAoU2VsZWN0b3JUaHJlYWQgdGhyZWFkIDogc2VsZWN0b3JUaHJlYWRzKSB7CisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbCkKKyAgICAgICAgICB0aHJlYWQud2FrZXVwU2VsZWN0b3IoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBncmFjZWZ1bGx5U2h1dGRvd25JbnZva2VyUG9vbCgpIHsKKyAgICAvLyB0cnkgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGV4ZWN1dG9yIHNlcnZpY2UKKyAgICBpbnZva2VyLnNodXRkb3duKCk7CisKKyAgICAvLyBMb29wIHVudGlsIGF3YWl0VGVybWluYXRpb24gZmluYWxseSBkb2VzIHJldHVybiB3aXRob3V0IGEgaW50ZXJydXB0ZWQKKyAgICAvLyBleGNlcHRpb24uIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gd2UnbGwgc2h1dCBkb3duIHByZW1hdHVyZWx5LiBXZSB3YW50CisgICAgLy8gdG8gbGV0IHRoZSBleGVjdXRvclNlcnZpY2UgY2xlYXIgaXQncyB0YXNrIHF1ZXVlLCBjbG9zaW5nIGNsaWVudCBzb2NrZXRzCisgICAgLy8gYXBwcm9wcmlhdGVseS4KKyAgICBsb25nIHRpbWVvdXRNUyA9IGFyZ3Muc3RvcFRpbWVvdXRVbml0LnRvTWlsbGlzKGFyZ3Muc3RvcFRpbWVvdXRWYWwpOworICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgd2hpbGUgKHRpbWVvdXRNUyA+PSAwKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnZva2VyLmF3YWl0VGVybWluYXRpb24odGltZW91dE1TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGl4KSB7CisgICAgICAgIGxvbmcgbmV3bm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHRpbWVvdXRNUyAtPSAobmV3bm93IC0gbm93KTsKKyAgICAgICAgbm93ID0gbmV3bm93OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXZSBvdmVycmlkZSB0aGUgc3RhbmRhcmQgaW52b2tlIG1ldGhvZCBoZXJlIHRvIHF1ZXVlIHRoZSBpbnZvY2F0aW9uIGZvcgorICAgKiBpbnZva2VyIHNlcnZpY2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSBpbnZva2luZy4gSWYgdGhlcmUgaXMgbm8gdGhyZWFkCisgICAqIHBvb2wsIGhhbmRsZSB0aGUgaW52b2NhdGlvbiBpbmxpbmUgb24gdGhpcyB0aHJlYWQKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CisgICAgUnVubmFibGUgaW52b2NhdGlvbiA9IGdldFJ1bm5hYmxlKGZyYW1lQnVmZmVyKTsKKyAgICBpZiAoaW52b2tlciAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnZva2VyLmV4ZWN1dGUoaW52b2NhdGlvbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBjYXRjaCAoUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gcngpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkV4ZWN1dG9yU2VydmljZSByZWplY3RlZCBleGVjdXRpb24hIiwgcngpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEludm9rZSBvbiB0aGUgY2FsbGVyJ3MgdGhyZWFkCisgICAgICBpbnZvY2F0aW9uLnJ1bigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIFJ1bm5hYmxlIGdldFJ1bm5hYmxlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CisgICAgcmV0dXJuIG5ldyBJbnZvY2F0aW9uKGZyYW1lQnVmZmVyKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgdG8gY3JlYXRlIHRoZSBpbnZva2VyIGlmIG9uZSBpcyBub3Qgc3BlY2lmaWVkCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBjcmVhdGVEZWZhdWx0RXhlY3V0b3IoQXJncyBvcHRpb25zKSB7CisgICAgcmV0dXJuIChvcHRpb25zLndvcmtlclRocmVhZHMgPiAwKSA/IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wob3B0aW9ucy53b3JrZXJUaHJlYWRzKSA6IG51bGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4gY3JlYXRlRGVmYXVsdEFjY2VwdFF1ZXVlKGludCBxdWV1ZVNpemUpIHsKKyAgICBpZiAocXVldWVTaXplID09IDApIHsKKyAgICAgIC8vIFVuYm91bmRlZCBxdWV1ZQorICAgICAgcmV0dXJuIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4oKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBcnJheUJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PihxdWV1ZVNpemUpOworICB9CisKKyAgLyoqCisgICAqIFRoZSB0aHJlYWQgdGhhdCBzZWxlY3RzIG9uIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IChsaXN0ZW4gc29ja2V0KSBhbmQgYWNjZXB0cworICAgKiBuZXcgY29ubmVjdGlvbnMgdG8gaGFuZCBvZmYgdG8gdGhlIElPIHNlbGVjdG9yIHRocmVhZHMKKyAgICovCisgIHByb3RlY3RlZCBjbGFzcyBBY2NlcHRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgLy8gVGhlIGxpc3RlbiBzb2NrZXQgdG8gYWNjZXB0IG9uCisgICAgcHJpdmF0ZSBmaW5hbCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0OworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3IgYWNjZXB0U2VsZWN0b3I7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHRocmVhZENob29zZXI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIEFjY2VwdFRoZWFkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIEFjY2VwdFRocmVhZChUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciB0aHJlYWRDaG9vc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICB0aGlzLnRocmVhZENob29zZXIgPSB0aHJlYWRDaG9vc2VyOworICAgICAgdGhpcy5hY2NlcHRTZWxlY3RvciA9IFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5vcGVuU2VsZWN0b3IoKTsKKyAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0LnJlZ2lzdGVyU2VsZWN0b3IoYWNjZXB0U2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3b3JrIGxvb3AuIFNlbGVjdHMgb24gdGhlIHNlcnZlciB0cmFuc3BvcnQgYW5kIGFjY2VwdHMuIElmIHRoZXJlIHdhcworICAgICAqIGEgc2VydmVyIHRyYW5zcG9ydCB0aGF0IGhhZCBibG9ja2luZyBhY2NlcHRzLCBhbmQgcmV0dXJuZWQgb24gYmxvY2tpbmcKKyAgICAgKiBjbGllbnQgdHJhbnNwb3J0cywgdGhhdCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghc3RvcHBlZF8pIHsKKyAgICAgICAgICBzZWxlY3QoKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBvbiBBY2NlcHRUaHJlYWQgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYWNjZXB0U2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3NpbmcgYWNjZXB0IHNlbGVjdG9yISIsIGUpOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgd2lsbCB3YWtlIHVwIHRoZSBzZWxlY3RvciB0aHJlYWRzCisgICAgICAgIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLnRoaXMuc3RvcCgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBzZWxlY3RvciBpcyBibG9ja2VkLCB3YWtlIGl0IHVwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdha2V1cFNlbGVjdG9yKCkgeworICAgICAgYWNjZXB0U2VsZWN0b3Iud2FrZXVwKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuZCBwcm9jZXNzIElPIGV2ZW50cyBhcHByb3ByaWF0ZWx5OiBJZiB0aGVyZSBhcmUgY29ubmVjdGlvbnMgdG8KKyAgICAgKiBiZSBhY2NlcHRlZCwgYWNjZXB0IHRoZW0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdCgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIHdhaXQgZm9yIGNvbm5lY3QgZXZlbnRzLgorICAgICAgICBhY2NlcHRTZWxlY3Rvci5zZWxlY3QoKTsKKworICAgICAgICAvLyBwcm9jZXNzIHRoZSBpbyBldmVudHMgd2UgcmVjZWl2ZWQKKyAgICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBzZWxlY3RlZEtleXMgPSBhY2NlcHRTZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoIXN0b3BwZWRfICYmIHNlbGVjdGVkS2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gc2VsZWN0ZWRLZXlzLm5leHQoKTsKKyAgICAgICAgICBzZWxlY3RlZEtleXMucmVtb3ZlKCk7CisKKyAgICAgICAgICAvLyBza2lwIGlmIG5vdCB2YWxpZAorICAgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGtleS5pc0FjY2VwdGFibGUoKSkgeworICAgICAgICAgICAgaGFuZGxlQWNjZXB0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuKCJVbmV4cGVjdGVkIHN0YXRlIGluIHNlbGVjdCEgIiArIGtleS5pbnRlcmVzdE9wcygpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiB3aGlsZSBzZWxlY3RpbmchIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0IGEgbmV3IGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFjY2VwdCgpIHsKKyAgICAgIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCBjbGllbnQgPSBkb0FjY2VwdCgpOworICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgIC8vIFBhc3MgdGhpcyBjb25uZWN0aW9uIHRvIGEgc2VsZWN0b3IgdGhyZWFkCisgICAgICAgIGZpbmFsIFNlbGVjdG9yVGhyZWFkIHRhcmdldFRocmVhZCA9IHRocmVhZENob29zZXIubmV4dFRocmVhZCgpOworCisgICAgICAgIGlmIChhcmdzLmFjY2VwdFBvbGljeSA9PSBBcmdzLkFjY2VwdFBvbGljeS5GQVNUX0FDQ0VQVCB8fCBpbnZva2VyID09IG51bGwpIHsKKyAgICAgICAgICBkb0FkZEFjY2VwdCh0YXJnZXRUaHJlYWQsIGNsaWVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRkFJUl9BQ0NFUFQKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaW52b2tlci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZG9BZGRBY2NlcHQodGFyZ2V0VGhyZWFkLCBjbGllbnQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiByeCkgeworICAgICAgICAgICAgTE9HR0VSLndhcm4oIkV4ZWN1dG9yU2VydmljZSByZWplY3RlZCBhY2NlcHQgcmVnaXN0cmF0aW9uISIsIHJ4KTsKKyAgICAgICAgICAgIC8vIGNsb3NlIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFROb25ibG9ja2luZ1RyYW5zcG9ydCBkb0FjY2VwdCgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiAoVE5vbmJsb2NraW5nVHJhbnNwb3J0KSBzZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0ZSkgeworICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZyBhY2NlcHRpbmcuCisgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGFjY2VwdCEiLCB0dGUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9BZGRBY2NlcHQoU2VsZWN0b3JUaHJlYWQgdGhyZWFkLCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgY2xpZW50KSB7CisgICAgICBpZiAoIXRocmVhZC5hZGRBY2NlcHRlZENvbm5lY3Rpb24oY2xpZW50KSkgeworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0gLy8gQWNjZXB0VGhyZWFkCisKKyAgLyoqCisgICAqIFRoZSBTZWxlY3RvclRocmVhZChzKSB3aWxsIGJlIGRvaW5nIGFsbCB0aGUgc2VsZWN0aW5nIG9uIGFjY2VwdGVkIGFjdGl2ZQorICAgKiBjb25uZWN0aW9ucy4KKyAgICovCisgIHByb3RlY3RlZCBjbGFzcyBTZWxlY3RvclRocmVhZCBleHRlbmRzIEFic3RyYWN0U2VsZWN0VGhyZWFkIHsKKworICAgIC8vIEFjY2VwdGVkIGNvbm5lY3Rpb25zIGFkZGVkIGJ5IHRoZSBhY2NlcHQgdGhyZWFkLgorICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+IGFjY2VwdGVkUXVldWU7CisgICAgcHJpdmF0ZSBpbnQgU0VMRUNUT1JfQVVUT19SRUJVSUxEX1RIUkVTSE9MRCA9IDUxMjsKKyAgICBwcml2YXRlIGxvbmcgTU9OSVRPUl9QRVJJT0QgPSAxMDAwTDsKKyAgICBwcml2YXRlIGludCBqdm1CdWcgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIHVuYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBTZWxlY3RvclRocmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzKG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIGJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0b3JUaHJlYWQoaW50IG1heFBlbmRpbmdBY2NlcHRzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdGhpcyhjcmVhdGVEZWZhdWx0QWNjZXB0UXVldWUobWF4UGVuZGluZ0FjY2VwdHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYSBzcGVjaWZpZWQgcXVldWUgZm9yIGNvbm5lY3Rpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2VwdGVkUXVldWUKKyAgICAgKiAgICAgICAgICBUaGUgQmxvY2tpbmdRdWV1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgaG9sZGluZyBpbmNvbWluZyBhY2NlcHRlZAorICAgICAqICAgICAgICAgIGNvbm5lY3Rpb25zLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0b3JUaHJlYWQoQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+IGFjY2VwdGVkUXVldWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzLmFjY2VwdGVkUXVldWUgPSBhY2NlcHRlZFF1ZXVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRzIG9mZiBhbiBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIGJlIGhhbmRsZWQgYnkgdGhpcyB0aHJlYWQuIFRoaXMKKyAgICAgKiBtZXRob2Qgd2lsbCBibG9jayBpZiB0aGUgcXVldWUgZm9yIG5ldyBjb25uZWN0aW9ucyBpcyBhdCBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2NlcHRlZAorICAgICAqICAgICAgICAgIFRoZSBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gYWNjZXB0ZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBY2NlcHRlZENvbm5lY3Rpb24oVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2VwdGVkKSB7CisgICAgICB0cnkgeworICAgICAgICBhY2NlcHRlZFF1ZXVlLnB1dChhY2NlcHRlZCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJJbnRlcnJ1cHRlZCB3aGlsZSBhZGRpbmcgYWNjZXB0ZWQgY29ubmVjdGlvbiEiLCBlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd29yayBsb29wLiBIYW5kbGVzIHNlbGVjdGluZyAocmVhZC93cml0ZSBJTyksIGRpc3BhdGNoaW5nLCBhbmQKKyAgICAgKiBtYW5hZ2luZyB0aGUgc2VsZWN0aW9uIHByZWZlcmVuY2VzIG9mIGFsbCBleGlzdGluZyBjb25uZWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CisgICAgICAgICAgc2VsZWN0KCk7CisgICAgICAgICAgcHJvY2Vzc0FjY2VwdGVkQ29ubmVjdGlvbnMoKTsKKyAgICAgICAgICBwcm9jZXNzSW50ZXJlc3RDaGFuZ2VzKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5IDogc2VsZWN0b3Iua2V5cygpKSB7CisgICAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShzZWxlY3Rpb25LZXkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICBMT0dHRVIuZXJyb3IoInJ1bigpIG9uIFNlbGVjdG9yVGhyZWFkIGV4aXRpbmcgZHVlIHRvIHVuY2F1Z2h0IGVycm9yIiwgdCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIkdvdCBhbiBJT0V4Y2VwdGlvbiB3aGlsZSBjbG9zaW5nIHNlbGVjdG9yISIsIGUpOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgd2lsbCB3YWtlIHVwIHRoZSBhY2NlcHQgdGhyZWFkIGFuZCB0aGUgb3RoZXIgc2VsZWN0b3IgdGhyZWFkcworICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci50aGlzLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW5kIHByb2Nlc3MgSU8gZXZlbnRzIGFwcHJvcHJpYXRlbHk6IElmIHRoZXJlIGFyZSBleGlzdGluZworICAgICAqIGNvbm5lY3Rpb25zIHdpdGggZGF0YSB3YWl0aW5nIHRvIGJlIHJlYWQsIHJlYWQgaXQsIGJ1ZmZlcmluZyB1bnRpbCBhCisgICAgICogd2hvbGUgZnJhbWUgaGFzIGJlZW4gcmVhZC4gSWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIHJlc3BvbnNlcywgYnVmZmVyCisgICAgICogdGhlbSB1bnRpbCB0aGVpciB0YXJnZXQgY2xpZW50IGlzIGF2YWlsYWJsZSwgYW5kIHRoZW4gc2VuZCB0aGUgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VsZWN0KCkgeworICAgICAgdHJ5IHsKKworICAgICAgICBkb1NlbGVjdCgpOworCisgICAgICAgIC8vIHByb2Nlc3MgdGhlIGlvIGV2ZW50cyB3ZSByZWNlaXZlZAorICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IHNlbGVjdGVkS2V5cyA9IHNlbGVjdG9yLnNlbGVjdGVkS2V5cygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlICghc3RvcHBlZF8gJiYgc2VsZWN0ZWRLZXlzLmhhc05leHQoKSkgeworICAgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSBzZWxlY3RlZEtleXMubmV4dCgpOworICAgICAgICAgIHNlbGVjdGVkS2V5cy5yZW1vdmUoKTsKKworICAgICAgICAgIC8vIHNraXAgaWYgbm90IHZhbGlkCisgICAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoa2V5LmlzUmVhZGFibGUoKSkgeworICAgICAgICAgICAgLy8gZGVhbCB3aXRoIHJlYWRzCisgICAgICAgICAgICBoYW5kbGVSZWFkKGtleSk7CisgICAgICAgICAgfSBlbHNlIGlmIChrZXkuaXNXcml0YWJsZSgpKSB7CisgICAgICAgICAgICAvLyBkZWFsIHdpdGggd3JpdGVzCisgICAgICAgICAgICBoYW5kbGVXcml0ZShrZXkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dHRVIud2FybigiVW5leHBlY3RlZCBzdGF0ZSBpbiBzZWxlY3QhICIgKyBrZXkuaW50ZXJlc3RPcHMoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgc2VsZWN0aW5nISIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHNlbGVjdCBhbmQganVkZ2UgZXBvbGwgYnVnIGhhcHBlbi4KKyAgICAgKiBTZWUgOiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00MjUxCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGxvbmcgYmVmb3JlU2VsZWN0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICBpbnQgc2VsZWN0ZWROdW1zID0gc2VsZWN0b3Iuc2VsZWN0KCk7CisgICAgICBsb25nIGFmdGVyU2VsZWN0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgIGlmIChzZWxlY3RlZE51bXMgPT0gMCkgeworICAgICAgICBqdm1CdWcrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGp2bUJ1ZyA9IDA7CisgICAgICB9CisKKyAgICAgIGxvbmcgc2VsZWN0ZWRUaW1lID0gYWZ0ZXJTZWxlY3QgLSBiZWZvcmVTZWxlY3Q7CisgICAgICBpZiAoc2VsZWN0ZWRUaW1lID49IE1PTklUT1JfUEVSSU9EKSB7CisgICAgICAgIGp2bUJ1ZyA9IDA7CisgICAgICB9IGVsc2UgaWYgKGp2bUJ1ZyA+IFNFTEVDVE9SX0FVVE9fUkVCVUlMRF9USFJFU0hPTEQpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkluIHt9IG1zIGhhcHBlbiB7fSB0aW1lcyBqdm0gYnVnOyByZWJ1aWxkaW5nIHNlbGVjdG9yLiIsIE1PTklUT1JfUEVSSU9ELCBqdm1CdWcpOworICAgICAgICByZWJ1aWxkU2VsZWN0b3IoKTsKKyAgICAgICAgc2VsZWN0b3Iuc2VsZWN0Tm93KCk7CisgICAgICAgIGp2bUJ1ZyA9IDA7CisgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBTZWxlY3RvciBvZiB0aGlzIFNlbGVjdG9yVGhyZWFkIHdpdGggbmV3bHkgY3JlYXRlZCBTZWxlY3RvciB0byB3b3JrCisgICAgICogYXJvdW5kIHRoZSBpbmZhbW91cyBlcG9sbCAxMDAlIENQVSBidWcuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkU2VsZWN0b3IoKSB7CisgICAgICBmaW5hbCBTZWxlY3RvciBvbGRTZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgaWYgKG9sZFNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgU2VsZWN0b3IgbmV3U2VsZWN0b3IgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgbmV3U2VsZWN0b3IgPSBTZWxlY3Rvci5vcGVuKCk7CisgICAgICAgIExPR0dFUi53YXJuKCJDcmVhdGVkIG5ldyBTZWxlY3Rvci4iKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJDcmVhdGUgbmV3IFNlbGVjdG9yIGVycm9yLiIsIGUpOworICAgICAgfQorCisgICAgICBmb3IgKFNlbGVjdGlvbktleSBrZXkgOiBvbGRTZWxlY3Rvci5zZWxlY3RlZEtleXMoKSkgeworICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkgJiYga2V5LnJlYWR5T3BzKCkgPT0gMCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IGtleS5jaGFubmVsKCk7CisgICAgICAgIE9iamVjdCBhdHRhY2htZW50ID0ga2V5LmF0dGFjaG1lbnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIobmV3U2VsZWN0b3IsIGtleS5yZWFkeU9wcygpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbC5yZWdpc3RlcihuZXdTZWxlY3Rvciwga2V5LnJlYWR5T3BzKCksIGF0dGFjaG1lbnQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWdpc3RlciBuZXcgc2VsZWN0b3Iga2V5IGVycm9yLiIsIGUpOworICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgc2VsZWN0b3IgPSBuZXdTZWxlY3RvcjsKKyAgICAgIHRyeSB7CisgICAgICAgIG9sZFNlbGVjdG9yLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiQ2xvc2Ugb2xkIHNlbGVjdG9yIGVycm9yLiIsIGUpOworICAgICAgfQorICAgICAgTE9HR0VSLndhcm4oIlJlcGxhY2UgbmV3IHNlbGVjdG9yIHN1Y2Nlc3MuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY2NlcHRlZENvbm5lY3Rpb25zKCkgeworICAgICAgLy8gUmVnaXN0ZXIgYWNjZXB0ZWQgY29ubmVjdGlvbnMKKyAgICAgIHdoaWxlICghc3RvcHBlZF8pIHsKKyAgICAgICAgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2VwdGVkID0gYWNjZXB0ZWRRdWV1ZS5wb2xsKCk7CisgICAgICAgIGlmIChhY2NlcHRlZCA9PSBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVnaXN0ZXJBY2NlcHRlZChhY2NlcHRlZCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZyYW1lQnVmZmVyIGNyZWF0ZUZyYW1lQnVmZmVyKGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKKyAgICAgICAgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSwKKyAgICAgICAgZmluYWwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5Xy5pc0FzeW5jUHJvY2Vzc29yKCkgPworICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jRnJhbWVCdWZmZXIodHJhbnMsIHNlbGVjdGlvbktleSwgc2VsZWN0VGhyZWFkKSA6CisgICAgICAgICAgICAgICAgICBuZXcgRnJhbWVCdWZmZXIodHJhbnMsIHNlbGVjdGlvbktleSwgc2VsZWN0VGhyZWFkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJBY2NlcHRlZChUTm9uYmxvY2tpbmdUcmFuc3BvcnQgYWNjZXB0ZWQpIHsKKyAgICAgIFNlbGVjdGlvbktleSBjbGllbnRLZXkgPSBudWxsOworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50S2V5ID0gYWNjZXB0ZWQucmVnaXN0ZXJTZWxlY3RvcihzZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQpOworCisgICAgICAgIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyID0gY3JlYXRlRnJhbWVCdWZmZXIoYWNjZXB0ZWQsIGNsaWVudEtleSwgU2VsZWN0b3JUaHJlYWQudGhpcyk7CisKKyAgICAgICAgY2xpZW50S2V5LmF0dGFjaChmcmFtZUJ1ZmZlcik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJGYWlsZWQgdG8gcmVnaXN0ZXIgYWNjZXB0ZWQgY29ubmVjdGlvbiB0byBzZWxlY3RvciEiLCBlKTsKKyAgICAgICAgaWYgKGNsaWVudEtleSAhPSBudWxsKSB7CisgICAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShjbGllbnRLZXkpOworICAgICAgICB9CisgICAgICAgIGFjY2VwdGVkLmNsb3NlKCk7CisgICAgICB9CisgICAgfQorICB9IC8vIFNlbGVjdG9yVGhyZWFkCisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciB0byBiZSB1c2VkIGJ5IHRoZSBhY2NlcHQgdGhyZWFkIGZvcgorICAgKiBhc3NpZ25pbmcgbmV3bHkgYWNjZXB0ZWQgY29ubmVjdGlvbnMgYWNyb3NzIHRoZSB0aHJlYWRzLgorICAgKi8KKyAgcHJvdGVjdGVkIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIGNyZWF0ZVNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyKENvbGxlY3Rpb248PyBleHRlbmRzIFNlbGVjdG9yVGhyZWFkPiB0aHJlYWRzKSB7CisgICAgcmV0dXJuIG5ldyBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlcih0aHJlYWRzKTsKKyAgfQorCisgIC8qKgorICAgKiBBIHJvdW5kIHJvYmluIGxvYWQgYmFsYW5jZXIgZm9yIGNob29zaW5nIHNlbGVjdG9yIHRocmVhZHMgZm9yIG5ldworICAgKiBjb25uZWN0aW9ucy4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgeworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VsZWN0b3JUaHJlYWQ+IHRocmVhZHM7CisgICAgcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgU2VsZWN0b3JUaHJlYWQ+IG5leHRUaHJlYWRJdGVyYXRvcjsKKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFNlbGVjdG9yVGhyZWFkPiBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlcihDb2xsZWN0aW9uPFQ+IHRocmVhZHMpIHsKKyAgICAgIGlmICh0aHJlYWRzLmlzRW1wdHkoKSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgc2VsZWN0b3IgdGhyZWFkIGlzIHJlcXVpcmVkIik7CisgICAgICB9CisgICAgICB0aGlzLnRocmVhZHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8VD4odGhyZWFkcykpOworICAgICAgbmV4dFRocmVhZEl0ZXJhdG9yID0gdGhpcy50aHJlYWRzLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIFNlbGVjdG9yVGhyZWFkIG5leHRUaHJlYWQoKSB7CisgICAgICAvLyBDaG9vc2UgYSBzZWxlY3RvciB0aHJlYWQgKHJvdW5kIHJvYmluKQorICAgICAgaWYgKCFuZXh0VGhyZWFkSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgIG5leHRUaHJlYWRJdGVyYXRvciA9IHRocmVhZHMuaXRlcmF0b3IoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXh0VGhyZWFkSXRlcmF0b3IubmV4dCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCBiMDI5MDVmLi5mYzNhYTkyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgogICogSGVscGVyIGNsYXNzIHRoYXQgd3JhcHMgYSBieXRlW10gc28gdGhhdCBpdCBjYW4gZXhwYW5kIGFuZCBiZSByZXVzZWQuIFVzZXJzCiAgKiBzaG91bGQgY2FsbCByZXNpemVJZk5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhlIGJ1ZmZlciBoYXMgc3VpdGFibGUgY2FwYWNpdHksCkBAIC0yNSwyOCArMjcsMjQgQEAKICAqIHJhdGUgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdGhlIHJlcXVlc3RlZCBjYXBhY2l0eSB3aXRoIHRoZSAodW50ZXN0ZWQpCiAgKiBvYmplY3RpdmUgb2YgYXZvaWRpbmcgZXhwZW5zaXZlIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgY29waWVzLgogICovCi1wdWJsaWMgY2xhc3MgQXV0b0V4cGFuZGluZ0J1ZmZlciB7CitjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKICAgcHJpdmF0ZSBieXRlW10gYXJyYXk7CiAKLSAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQ7Ci0KLSAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXIoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgaWYgKGdyb3d0aENvZWZmaWNpZW50IDwgMS4wKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHcm93dGggY29lZmZpY2llbnQgbXVzdCBiZSA+PSAxLjAiKTsKLSAgICB9Ci0gICAgYXJyYXkgPSBuZXcgYnl0ZVtpbml0aWFsQ2FwYWNpdHldOwotICAgIHRoaXMuZ3Jvd3RoQ29lZmZpY2llbnQgPSBncm93dGhDb2VmZmljaWVudDsKKyAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXIoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHRoaXMuYXJyYXkgPSBuZXcgYnl0ZVtpbml0aWFsQ2FwYWNpdHldOwogICB9CiAKICAgcHVibGljIHZvaWQgcmVzaXplSWZOZWNlc3NhcnkoaW50IHNpemUpIHsKLSAgICBpZiAoYXJyYXkubGVuZ3RoIDwgc2l6ZSkgewotICAgICAgYnl0ZVtdIG5ld0J1ZiA9IG5ldyBieXRlWyhpbnQpKHNpemUgKiBncm93dGhDb2VmZmljaWVudCldOwotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgbmV3QnVmLCAwLCBhcnJheS5sZW5ndGgpOwotICAgICAgYXJyYXkgPSBuZXdCdWY7CisgICAgZmluYWwgaW50IGN1cnJlbnRDYXBhY2l0eSA9IHRoaXMuYXJyYXkubGVuZ3RoOworICAgIGlmIChjdXJyZW50Q2FwYWNpdHkgPCBzaXplKSB7CisgICAgICAvLyBJbmNyZWFzZSBieSBhIGZhY3RvciBvZiAxLjV4CisgICAgICBpbnQgZ3Jvd0NhcGFjaXR5ID0gY3VycmVudENhcGFjaXR5ICsgKGN1cnJlbnRDYXBhY2l0eSA+PiAxKTsKKyAgICAgIGludCBuZXdDYXBhY2l0eSA9IE1hdGgubWF4KGdyb3dDYXBhY2l0eSwgc2l6ZSk7CisgICAgICB0aGlzLmFycmF5ID0gQXJyYXlzLmNvcHlPZihhcnJheSwgbmV3Q2FwYWNpdHkpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyBieXRlW10gYXJyYXkoKSB7Ci0gICAgcmV0dXJuIGFycmF5OworICAgIHJldHVybiB0aGlzLmFycmF5OwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggZDI5ZDYwYi4uYTI4ZDI1NCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQpAQCAtMTgsOCArMTgsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotCiAvKioKICAqIFRUcmFuc3BvcnQgZm9yIHJlYWRpbmcgZnJvbSBhbiBBdXRvRXhwYW5kaW5nQnVmZmVyLgogICovCkBAIC0zMCw4ICsyOCw4IEBACiAgIHByaXZhdGUgaW50IHBvcyA9IDA7CiAgIHByaXZhdGUgaW50IGxpbWl0ID0gMDsKIAotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIG92ZXJncm93dGhDb2VmZmljaWVudCkgewotICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5LCBvdmVyZ3Jvd3RoQ29lZmZpY2llbnQpOworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGZpbGwoVFRyYW5zcG9ydCBpblRyYW5zLCBpbnQgbGVuZ3RoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC02MCw3ICs1OCw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggMjM3NmNmMy4uZWM3ZTdkNCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KIC8qKgogICogVFRyYW5zcG9ydCBmb3Igd3JpdGluZyB0byBhbiBBdXRvRXhwYW5kaW5nQnVmZmVyLgogICovCkBAIC0yNywxMCArMjUsMjkgQEAKIAogICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXIgYnVmOwogICBwcml2YXRlIGludCBwb3M7CisgIHByaXZhdGUgaW50IHJlczsKIAotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KGludCBpbml0aWFsQ2FwYWNpdHksIGRvdWJsZSBncm93dGhDb2VmZmljaWVudCkgewotICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5LCBncm93dGhDb2VmZmljaWVudCk7Ci0gICAgdGhpcy5wb3MgPSAwOworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlcgorICAgKiBAcGFyYW0gZnJvbnRSZXNlcnZlIHNwYWNlLCBpZiBhbnksIHRvIHJlc2VydmUgYXQgdGhlIGJlZ2lubmluZyBzdWNoCisgICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgZmlyc3Qgd3JpdGUgaXMgYWZ0ZXIgdGhpcyByZXNlcnZlLgorICAgKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIGZyYW1lZCB0cmFuc3BvcnQgdG8gcmVzZXJ2ZSBzcGFjZQorICAgKiAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgZnJhbWUgYnVmZmVyIGxlbmd0aC4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaW5pdGlhbENhcGFjaXR5IGlzIGxlc3MgdGhhbiBvbmUKKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGxlc3MgdGhhbiB6ZXJvCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGZyb250UmVzZXJ2ZSBpcyBncmVhdGVyIHRoYW4gaW5pdGlhbENhcGFjaXR5CisgICAqLworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KGludCBpbml0aWFsQ2FwYWNpdHksIGludCBmcm9udFJlc2VydmUpIHsKKyAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5pdGlhbENhcGFjaXR5Iik7CisgICAgfQorICAgIGlmIChmcm9udFJlc2VydmUgPCAwIHx8IGluaXRpYWxDYXBhY2l0eSA8IGZyb250UmVzZXJ2ZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnJvbnRSZXNlcnZlIik7CisgICAgfQorICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsKKyAgICB0aGlzLnBvcyA9IGZyb250UmVzZXJ2ZTsKKyAgICB0aGlzLnJlcyA9IGZyb250UmVzZXJ2ZTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNDQsNyArNjEsNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC01OCwxMSArNzUsMTQgQEAKICAgICByZXR1cm4gYnVmOwogICB9CiAKLSAgcHVibGljIGludCBnZXRQb3MoKSB7CisgIC8qKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgYW55IGZyb250IHJlc2VydmUKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewogICAgIHJldHVybiBwb3M7CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICBwb3MgPSAwOworICAgIHBvcyA9IHJlczsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjA2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBCeXRlQnVmZmVyLWJhY2tlZCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVEJ5dGVCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXI7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgVEJ5dGVCdWZmZXIgd3JhcHBpbmcgYSBnaXZlbiBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKKyAgICB0aGlzLmJ5dGVCdWZmZXIgPSBieXRlQnVmZmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IG4gPSBNYXRoLm1pbihieXRlQnVmZmVyLnJlbWFpbmluZygpLCBsZW4pOworICAgIGlmIChuID4gMCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnVmLCBvZmYsIG4pOworICAgICAgfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGJ1ZmZlciIsIGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVCdWZmZXIucHV0KGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOb3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIuCisgICAqLworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlQnVmZmVyKCkgeworICAgIHJldHVybiBieXRlQnVmZmVyOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjYWxsIGNsZWFyKCkgb24gdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIuCisgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIgY2xlYXIoKSB7CisgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjYWxsIGZsaXAoKSBvbiB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyIGZsaXAoKSB7CisgICAgYnl0ZUJ1ZmZlci5mbGlwKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIgdG8gYQorICAgKiBwbGFpbiBvbGQgYnl0ZSBhcnJheS4KKyAgICovCisgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKKyAgICBieXRlQnVmZmVyLnNsaWNlKCkuZ2V0KGRhdGEpOworICAgIHJldHVybiBkYXRhOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggMmExZjFkYS4uYTFmZDI0OSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMTksMTIgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogLyoqCi0gKiBUaGlzIHRyYW5zcG9ydCBpcyB3aXJlIGNvbXBhdGlibGUgd2l0aCB7QGxpbmsgVEZyYW1lZFRyYW5zcG9ydH0sIGJ1dCBtYWtlcyAKKyAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzCiAgKiB1c2Ugb2YgcmV1c2FibGUsIGV4cGFuZGluZyByZWFkIGFuZCB3cml0ZSBidWZmZXJzIGluIG9yZGVyIHRvIGF2b2lkCiAgKiBhbGxvY2F0aW5nIG5ldyBieXRlW11zIGFsbCB0aGUgdGltZS4gU2luY2UgdGhlIGJ1ZmZlcnMgb25seSBleHBhbmQsIHlvdQogICogc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIHRoaXMgdHJhbnNwb3J0IGlmIHlvdXIgbWVzc2FnZXMgYXJlIG5vdCB0b28gdmFyaWFibHkKICAqIGxhcmdlLCB1bmxlc3MgdGhlIHBlcnNpc3RlbnQgbWVtb3J5IGNvc3QgaXMgbm90IGFuIGlzc3VlLgotICogCisgKgogICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBOT1QgdGhyZWFkc2FmZS4KICAqLwogcHVibGljIGNsYXNzIFRGYXN0RnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CkBAIC01OSwxMyArNTksMTQgQEAKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGX0NBUEFDSVRZID0gMTAyNDsKICAgLyoqCi0gICAqIEhvdyBiaWcgaXMgdGhlIGxhcmdlc3QgYWxsb3dhYmxlIGZyYW1lPyBEZWZhdWx0cyB0byBJbnRlZ2VyLk1BWF9WQUxVRS4KKyAgICogSG93IGJpZyBpcyB0aGUgbGFyZ2VzdCBhbGxvd2FibGUgZnJhbWU/IERlZmF1bHRzIHRvIDE2TUIuCiAgICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9MRU5HVEggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfTEVOR1RIID0gMTYzODQwMDA7CiAKICAgcHJpdmF0ZSBmaW5hbCBUVHJhbnNwb3J0IHVuZGVybHlpbmc7CiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHdyaXRlQnVmZmVyOwotICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHJlYWRCdWZmZXI7CisgIHByaXZhdGUgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbEJ1ZmZlckNhcGFjaXR5OwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs0XTsKICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGVuZ3RoOwogCkBAIC05MSw3ICs5Miw3IEBACiAgIH0KIAogICAvKioKLSAgICogCisgICAqCiAgICAqIEBwYXJhbSB1bmRlcmx5aW5nIFRyYW5zcG9ydCB0aGF0IHJlYWwgcmVhZHMgYW5kIHdyaXRlcyB3aWxsIGdvIHRocm91Z2ggdG8uCiAgICAqIEBwYXJhbSBpbml0aWFsQnVmZmVyQ2FwYWNpdHkgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KICAgICogSW4gcHJhY3RpY2UsIGl0J3Mgbm90IGNyaXRpY2FsIHRvIHNldCB0aGlzIHVubGVzcyB5b3Uga25vdyBpbiBhZHZhbmNlIHRoYXQKQEAgLTEwNCw4ICsxMDUsOSBAQAogICBwdWJsaWMgVEZhc3RGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCBpbnQgbWF4TGVuZ3RoKSB7CiAgICAgdGhpcy51bmRlcmx5aW5nID0gdW5kZXJseWluZzsKICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDsKLSAgICB3cml0ZUJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCAxLjUpOwotICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCAxLjUpOworICAgIHRoaXMuaW5pdGlhbEJ1ZmZlckNhcGFjaXR5ID0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5OworICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KTsKKyAgICB3cml0ZUJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCA0KTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTQxLDExICsxNDMsMTQgQEAKICAgICBpbnQgc2l6ZSA9IFRGcmFtZWRUcmFuc3BvcnQuZGVjb2RlRnJhbWVTaXplKGkzMmJ1Zik7CiAKICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGgpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGggKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGggKyAiKSEiKTsKICAgICB9CiAKICAgICByZWFkQnVmZmVyLmZpbGwodW5kZXJseWluZywgc2l6ZSk7CkBAIC0xNjEsMTIgKzE2NiwxOSBAQAogICAgIHJlYWRCdWZmZXIuY29uc3VtZUJ1ZmZlcihsZW4pOwogICB9CiAKKyAgLyoqCisgICAqIE9ubHkgY2xlYXJzIHRoZSByZWFkIGJ1ZmZlciEKKyAgICovCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpbnQgbGVuZ3RoID0gd3JpdGVCdWZmZXIuZ2V0UG9zKCk7Ci0gICAgVEZyYW1lZFRyYW5zcG9ydC5lbmNvZGVGcmFtZVNpemUobGVuZ3RoLCBpMzJidWYpOwotICAgIHVuZGVybHlpbmcud3JpdGUoaTMyYnVmLCAwLCA0KTsKLSAgICB1bmRlcmx5aW5nLndyaXRlKHdyaXRlQnVmZmVyLmdldEJ1ZigpLmFycmF5KCksIDAsIGxlbmd0aCk7CisgICAgaW50IHBheWxvYWRMZW5ndGggPSB3cml0ZUJ1ZmZlci5nZXRMZW5ndGgoKSAtIDQ7ICAgICAgICAKKyAgICBieXRlW10gZGF0YSA9IHdyaXRlQnVmZmVyLmdldEJ1ZigpLmFycmF5KCk7CisgICAgVEZyYW1lZFRyYW5zcG9ydC5lbmNvZGVGcmFtZVNpemUocGF5bG9hZExlbmd0aCwgZGF0YSk7CisgICAgdW5kZXJseWluZy53cml0ZShkYXRhLCAwLCBwYXlsb2FkTGVuZ3RoICsgNCk7CiAgICAgd3JpdGVCdWZmZXIucmVzZXQoKTsKICAgICB1bmRlcmx5aW5nLmZsdXNoKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YQppbmRleCA3YTU4ZWVhLi45NjA4N2QxIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCkBAIC0yNCwyMSArMjQsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OwogCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQogLyoqCiAgKiBGaWxlUHJvY2Vzc29yOiBoZWxwcyBpbiBwcm9jZXNzaW5nIGZpbGVzIGdlbmVyYXRlZCBieSBURmlsZVRyYW5zcG9ydC4KICAqIFBvcnQgb2Ygb3JpZ2luYWwgY3BwIGltcGxlbWVudGF0aW9uCi0gKgotICogQGF1dGhvciBKb3lkZWVwIFNlbiBTYXJtYSA8anNzYXJtYUBmYWNlYm9vay5jb20+CiAgKi8KIHB1YmxpYyBjbGFzcyBURmlsZVByb2Nlc3NvciB7CiAKQEAgLTk1LDcgKzgzLDcgQEAKICAgICogUHJvY2VzcyBmcm9tIHN0YXJ0IHRvIGxhc3QgY2h1bmsgYm90aCBpbmNsdXNpdmUgd2hlcmUgY2h1bmtzIGJlZ2luIGZyb20gMAogCiAgICAqIEBwYXJhbSBzdGFydENodW5rTnVtIGZpcnN0IGNodW5rIHRvIGJlIHByb2Nlc3NlZAotICAgKiBAcGFyYW0gbGFzdENodW5rTnVtIGxhc3QgY2h1bmsgdG8gYmUgcHJvY2Vzc2VkCisgICAqIEBwYXJhbSBlbmRDaHVua051bSBsYXN0IGNodW5rIHRvIGJlIHByb2Nlc3NlZAogICAgKi8KICAgcHVibGljIHZvaWQgcHJvY2Vzc0NodW5rKGludCBzdGFydENodW5rTnVtLCBpbnQgZW5kQ2h1bmtOdW0pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbnVtQ2h1bmtzID0gaW5wdXRUcmFuc3BvcnRfLmdldE51bUNodW5rcygpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCmluZGV4IDYzMGZiOTkuLmMwMTFjNTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTMzLDE5ICszMywxNyBAQAogICogSXQgbWF5IG1ha2UgYmV0dGVyIHNlbnNlIHRvIHByb3ZpZGUgYSBiYXNpYyBzdHJlYW0gYWNjZXNzIG9uIHRvcCBvZiB0aGUgZnJhbWVkIGZpbGUgZm9ybWF0CiAgKiBUaGUgRmlsZVRyYW5zcG9ydCBjYW4gdGhlbiBiZSBhIHVzZXIgb2YgdGhpcyBmcmFtZWQgZmlsZSBmb3JtYXQgd2l0aCBzb21lIGFkZGl0aW9uYWwgbG9naWMKICAqIGZvciBjaHVua2luZy4KLSAqCi0gKiBAYXV0aG9yIEpveWRlZXAgU2VuIFNhcm1hIDxqc3Nhcm1hQGZhY2Vib29rLmNvbT4KICAqLwogcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyB0cnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewogICAgIHB1YmxpYyB2b2lkIHRydW5jKCkgewogICAgICAgcG9zID0gY291bnQgPSAwOwogICAgIH0gICAgICAgIAotICAgIHB1YmxpYyB0cnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKICAgICAgIHN1cGVyKGluKTsKICAgICB9Ci0gICAgcHVibGljIHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBzaXplKSB7CisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBzaXplKSB7CiAgICAgICBzdXBlcihpbiwgc2l6ZSk7CiAgICAgfQogICB9CkBAIC04Nyw3ICs4NSw3IEBACiAgICAgfQogICB9OwogCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgY2h1bmtTdGF0ZSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2h1bmtTdGF0ZSB7CiAgICAgLyoqCiAgICAgICogQ2h1bmsgU2l6ZS4gTXVzdCBiZSBzYW1lIGFjcm9zcyBhbGwgaW1wbGVtZW50YXRpb25zCiAgICAgICovCkBAIC05Niw4ICs5NCw4IEBACiAgICAgcHJpdmF0ZSBpbnQgY2h1bmtfc2l6ZV8gPSBERUZBVUxUX0NIVU5LX1NJWkU7CiAgICAgcHJpdmF0ZSBsb25nIG9mZnNldF8gPSAwOwogCi0gICAgcHVibGljIGNodW5rU3RhdGUoKSB7fQotICAgIHB1YmxpYyBjaHVua1N0YXRlKGludCBjaHVua19zaXplKSB7IGNodW5rX3NpemVfID0gY2h1bmtfc2l6ZTsgfQorICAgIHB1YmxpYyBDaHVua1N0YXRlKCkge30KKyAgICBwdWJsaWMgQ2h1bmtTdGF0ZShpbnQgY2h1bmtfc2l6ZSkgeyBjaHVua19zaXplXyA9IGNodW5rX3NpemU7IH0KIAogICAgIHB1YmxpYyB2b2lkIHNraXAoaW50IHNpemUpIHtvZmZzZXRfICs9IHNpemU7IH0KICAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB7b2Zmc2V0XyA9IG9mZnNldDt9CkBAIC0xMDgsNyArMTA2LDcgQEAKICAgICBwdWJsaWMgbG9uZyBnZXRPZmZzZXQoKSB7IHJldHVybiAob2Zmc2V0Xyk7fQogICB9CiAKLSAgcHVibGljIHN0YXRpYyBlbnVtIHRhaWxQb2xpY3kgeworICBwdWJsaWMgc3RhdGljIGVudW0gVGFpbFBvbGljeSB7CiAKICAgICBOT1dBSVQoMCwgMCksCiAgICAgICBXQUlUX0ZPUkVWRVIoNTAwLCAtMSk7CkBAIC0xMzMsNyArMTMxLDcgQEAKICAgICAgKiBAcGFyYW0gcmV0cmllcyBudW1iZXIgb2YgcmV0cmllcwogICAgICAqLwogCi0gICAgdGFpbFBvbGljeShpbnQgdGltZW91dCwgaW50IHJldHJpZXMpIHsKKyAgICBUYWlsUG9saWN5KGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykgewogICAgICAgdGltZW91dF8gPSB0aW1lb3V0OwogICAgICAgcmV0cmllc18gPSByZXRyaWVzOwogICAgIH0KQEAgLTE0Miw3ICsxNDAsNyBAQAogICAvKioKICAgICogQ3VycmVudCB0YWlsaW5nIHBvbGljeQogICAgKi8KLSAgdGFpbFBvbGljeSBjdXJyZW50UG9saWN5XyA9IHRhaWxQb2xpY3kuTk9XQUlUOworICBUYWlsUG9saWN5IGN1cnJlbnRQb2xpY3lfID0gVGFpbFBvbGljeS5OT1dBSVQ7CiAKIAogICAvKiogCkBAIC0xNjksMTIgKzE2Nyw3IEBACiAgIC8qKgogICAgKiBjdXJyZW50IENodW5rIHN0YXRlCiAgICAqLwotICBjaHVua1N0YXRlIGNzID0gbnVsbDsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0Ci0gICAqLwotICBwcml2YXRlIGludCByZWFkVGltZW91dF8gPSAwOworICBDaHVua1N0YXRlIGNzID0gbnVsbDsKIAogICAvKioKICAgICogaXMgcmVhZCBvbmx5PwpAQCAtMTg2LDcgKzE3OSw3IEBACiAgICAqIAogICAgKiBAcmV0dXJuIGN1cnJlbnQgcmVhZCBwb2xpY3kKICAgICovCi0gIHB1YmxpYyB0YWlsUG9saWN5IGdldFRhaWxQb2xpY3koKSB7CisgIHB1YmxpYyBUYWlsUG9saWN5IGdldFRhaWxQb2xpY3koKSB7CiAgICAgcmV0dXJuIChjdXJyZW50UG9saWN5Xyk7CiAgIH0KIApAQCAtMTk2LDggKzE4OSw4IEBACiAgICAqIEBwYXJhbSBwb2xpY3kgTmV3IHBvbGljeSB0byBzZXQKICAgICogQHJldHVybiBPbGQgcG9saWN5CiAgICAqLwotICBwdWJsaWMgdGFpbFBvbGljeSBzZXRUYWlsUG9saWN5KHRhaWxQb2xpY3kgcG9saWN5KSB7Ci0gICAgdGFpbFBvbGljeSBvbGQgPSBjdXJyZW50UG9saWN5XzsKKyAgcHVibGljIFRhaWxQb2xpY3kgc2V0VGFpbFBvbGljeShUYWlsUG9saWN5IHBvbGljeSkgeworICAgIFRhaWxQb2xpY3kgb2xkID0gY3VycmVudFBvbGljeV87CiAgICAgY3VycmVudFBvbGljeV8gPSBwb2xpY3k7CiAgICAgcmV0dXJuIChvbGQpOwogICB9CkBAIC0yMTIsMTAgKzIwNSwxMCBAQAogICAgIElucHV0U3RyZWFtIGlzOwogICAgIHRyeSB7CiAgICAgICBpZihpbnB1dFN0cmVhbV8gIT0gbnVsbCkgewotICAgICAgICAoKHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0paW5wdXRTdHJlYW1fKS50cnVuYygpOworICAgICAgICAoKFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0paW5wdXRTdHJlYW1fKS50cnVuYygpOwogICAgICAgICBpcyA9IGlucHV0U3RyZWFtXzsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzID0gbmV3IHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgaXMgPSBuZXcgVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dEZpbGVfLmdldElucHV0U3RyZWFtKCkpOwogICAgICAgfQogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjcmVhdGVJbnB1dFN0cmVhbTogIitpb3guZ2V0TWVzc2FnZSgpKTsKQEAgLTIzNiw3ICsyMjksNyBAQAogICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAqLwogICBwcml2YXRlIGludCB0YWlsUmVhZChJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBvZmYsIGludCBsZW4sIHRhaWxQb2xpY3kgdHApIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZiwgaW50IGxlbiwgVGFpbFBvbGljeSB0cCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIGludCBvcmlnX2xlbiA9IGxlbjsKICAgICB0cnkgewogICAgICAgaW50IHJldHJpZXMgPSAwOwpAQCAtMzY5LDExICszNjIsMTEgQEAKIAogICAgIHRyeSB7CiAgICAgICBpbnB1dFN0cmVhbV8gPSBjcmVhdGVJbnB1dFN0cmVhbSgpOwotICAgICAgY3MgPSBuZXcgY2h1bmtTdGF0ZSgpOworICAgICAgY3MgPSBuZXcgQ2h1bmtTdGF0ZSgpOwogICAgICAgY3VycmVudEV2ZW50XyA9IG5ldyBFdmVudChuZXcgYnl0ZSBbMjU2XSk7CiAKICAgICAgIGlmKCFyZWFkT25seV8pCi0gICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRPdXRwdXRTdHJlYW0oKSwgODE5Mik7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwogICAgIH0KQEAgLTQxOCw3ICs0MTEsNyBAQAogICAvKioKICAgICogRmlsZSBUcmFuc3BvcnQgY3RvcgogICAgKgotICAgKiBAcGFyYW0gaW5wdXRGaWxlXyBvcGVuIFRTZWVrYWJsZUZpbGUgdG8gcmVhZC93cml0ZSBmcm9tCisgICAqIEBwYXJhbSBpbnB1dEZpbGUgb3BlbiBUU2Vla2FibGVGaWxlIHRvIHJlYWQvd3JpdGUgZnJvbQogICAgKiBAcGFyYW0gcmVhZE9ubHkgV2hldGhlciB0aGlzIGlzIGEgcmVhZC1vbmx5IHRyYW5zcG9ydAogICAgKi8KICAgcHVibGljIFRGaWxlVHJhbnNwb3J0KFRTZWVrYWJsZUZpbGUgaW5wdXRGaWxlLCBib29sZWFuIHJlYWRPbmx5KSB7CkBAIC00NTEsNyArNDQ0LDcgQEAKIAogCiAgIC8qKgotICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgaW50byBidWZmZXIgYnVmLCBzdGFydGluZyBhdHQgb2Zmc2V0IG9mZi4KKyAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXQgb2Zmc2V0IG9mZi4KICAgICoKICAgICogQHBhcmFtIGJ1ZiBBcnJheSB0byByZWFkIGludG8KICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CkBAIC01MTUsNyArNTA4LDcgQEAKICAgICAgIGNodW5rICs9IG51bUNodW5rczsKICAgICB9CiAKLSAgICAvLyB0b28gbGFyZ2UgYSB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLCBqdXN0IHNlZWsgdG8gYmVnaW5uaW4KKyAgICAvLyB0b28gbGFyZ2UgYSB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLCBqdXN0IHNlZWsgdG8gYmVnaW5uaW5nCiAgICAgaWYgKGNodW5rIDwgMCkgewogICAgICAgY2h1bmsgPSAwOwogICAgIH0KQEAgLTU0NSw3ICs1MzgsNyBAQAogICAgIGlmKHNlZWtUb0VuZCkgewogICAgICAgLy8gd2FpdGluZyBmb3JldmVyIGhlcmUgLSBvdGhlcndpc2Ugd2UgY2FuIGhpdCBFT0YgYW5kIGVuZCB1cAogICAgICAgLy8gaGF2aW5nIGNvbnN1bWVkIHBhcnRpYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHN0cmVhbS4KLSAgICAgIHRhaWxQb2xpY3kgb2xkID0gc2V0VGFpbFBvbGljeSh0YWlsUG9saWN5LldBSVRfRk9SRVZFUik7CisgICAgICBUYWlsUG9saWN5IG9sZCA9IHNldFRhaWxQb2xpY3koVGFpbFBvbGljeS5XQUlUX0ZPUkVWRVIpOwogICAgICAgd2hpbGUoY3MuZ2V0T2Zmc2V0KCkgPCBlb2ZPZmZzZXQpIHsgcmVhZEV2ZW50KCk7IH0KICAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOwogICAgICAgc2V0VGFpbFBvbGljeShvbGQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCAzMjQ4M2VlLi5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMjMsMTEgKzIzLDExIEBACiAKIC8qKgogICogVEZyYW1lZFRyYW5zcG9ydCBpcyBhIGJ1ZmZlcmVkIFRUcmFuc3BvcnQgdGhhdCBlbnN1cmVzIGEgZnVsbHkgcmVhZCBtZXNzYWdlCi0gKiBldmVyeSB0aW1lIGJ5IHByZWNlZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgorICogZXZlcnkgdGltZSBieSBwcmVjZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgogICovCiBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDB4N0ZGRkZGRkY7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOwogCiAgIHByaXZhdGUgaW50IG1heExlbmd0aF87CiAKQEAgLTQ1LDcgKzQ1LDggQEAKICAgLyoqCiAgICAqIEJ1ZmZlciBmb3IgaW5wdXQKICAgICovCi0gIHByaXZhdGUgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChuZXcgYnl0ZVswXSk7CisgIHByaXZhdGUgZmluYWwgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXJfID0KKyAgICBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CiAgICAgcHJpdmF0ZSBpbnQgbWF4TGVuZ3RoXzsKQEAgLTY1LDE2ICs2NiwyNSBAQAogICB9CiAKICAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5wc29ydAorICAgKiBTb21ldGhpbmcgdG8gZmlsbCBpbiB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgYnVmZmVyCisgICAqIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGZyYW1lIHNpemUuICBUaGlzIGFsbG93cyB0aGUKKyAgICogaW1wbGVtZW50YXRpb24gdG8gd3JpdGUgb25jZSBpbnN0ZWFkIG9mIHR3aWNlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHNpemVGaWxsZXJfID0gbmV3IGJ5dGVbXSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CiAgICAqLwogICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IG1heExlbmd0aCkgewogICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CiAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOwogICB9CiAKICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBURnJhbWVkVHJhbnNwb3J0LkRFRkFVTFRfTUFYX0xFTkdUSDsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOwogICB9CiAKICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTkwLDExICsxMDAsOSBAQAogICB9CiAKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpZiAocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgewotICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7Ci0gICAgICBpZiAoZ290ID4gMCkgewotICAgICAgICByZXR1cm4gZ290OwotICAgICAgfQorICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIGlmIChnb3QgPiAwKSB7CisgICAgICByZXR1cm4gZ290OwogICAgIH0KIAogICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCkBAIC0xMjMsNiArMTMxLDEwIEBACiAgICAgcmVhZEJ1ZmZlcl8uY29uc3VtZUJ1ZmZlcihsZW4pOwogICB9CiAKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlcl8uY2xlYXIoKTsKKyAgfQorCiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogCiAgIHByaXZhdGUgdm9pZCByZWFkRnJhbWUoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC0xMzAsMTEgKzE0MiwxNCBAQAogICAgIGludCBzaXplID0gZGVjb2RlRnJhbWVTaXplKGkzMmJ1Zik7CiAKICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGhfKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoXyArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aF8gKyAiKSEiKTsKICAgICB9CiAKICAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlW3NpemVdOwpAQCAtMTQ5LDEyICsxNjQsMTIgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0KCk7Ci0gICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKTsKKyAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpIC0gNDsgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHByZXBlbmRlZCBmcmFtZSBzaXplCiAgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsgIC8vIG1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgZnJhbWUncyBzaXplIGRhdGEKIAotICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGkzMmJ1Zik7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4pOworICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGJ1Zik7ICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBmcmFtZSBsZW5ndGggd2l0aG91dCB0aGUgZmlsbGVyCisgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbiArIDQpOyAgICAgIC8vIHdlIGhhdmUgdG8gd3JpdGUgdGhlIGZyYW1lIHNpemUgYW5kIGZyYW1lIGRhdGEKICAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CiAgIH0KIApAQCAtMTY2LDcgKzE4MSw3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWNvZGVGcmFtZVNpemUoZmluYWwgYnl0ZVtdIGJ1ZikgewotICAgIHJldHVybiAKKyAgICByZXR1cm4KICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgIDgpIHwKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQppbmRleCAwZDM5ZmYwLi5jMzA2M2ZlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKIGltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOwpAQCAtMTk2LDYgKzE5NywyMiBAQAogICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICB9CiAKKyAgLyoqCisgICAqIGNvcHkgZnJvbSBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlscyNjb25zdW1lLiBBbmRyb2lkIGhhcyBpdCdzIG93biBodHRwY29yZQorICAgKiB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN1bWUuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnN1bWUoZmluYWwgSHR0cEVudGl0eSBlbnRpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoZW50aXR5LmlzU3RyZWFtaW5nKCkpIHsKKyAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGVudGl0eS5nZXRDb250ZW50KCk7CisgICAgICAgICAgaWYgKGluc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKwogICBwcml2YXRlIHZvaWQgZmx1c2hVc2luZ0h0dHBDbGllbnQoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgCiAgICAgaWYgKG51bGwgPT0gdGhpcy5jbGllbnQpIHsKQEAgLTIzMyw2ICsyNTAsMTMgQEAKICAgICAgIAogICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gdGhpcy5jbGllbnQuZXhlY3V0ZSh0aGlzLmhvc3QsIHBvc3QpOwogICAgICAgaW50IHJlc3BvbnNlQ29kZSA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisKKyAgICAgIC8vICAgICAgCisgICAgICAvLyBSZXRyaWV2ZSB0aGUgaW5wdXRzdHJlYW0gQkVGT1JFIGNoZWNraW5nIHRoZSBzdGF0dXMgY29kZSBzbworICAgICAgLy8gcmVzb3VyY2VzIGdldCBmcmVlZCBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisgICAgICAvLworCisgICAgICBpcyA9IHJlc3BvbnNlLmdldEVudGl0eSgpLmdldENvbnRlbnQoKTsKICAgICAgIAogICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CiAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOwpAQCAtMjQwLDEzICsyNjQsMTEgQEAKIAogICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2VzIGludG8gYSBieXRlIGFycmF5IHNvIHdlIGNhbiByZWxlYXNlIHRoZSBjb25uZWN0aW9uCiAgICAgICAvLyBlYXJseS4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdob2xlIGNvbnRlbnQgd2lsbCBoYXZlIHRvIGJlIHJlYWQgaW4KLSAgICAgIC8vIG1lbW9yeSwgYW5kIHRoYXQgbW9tZW50YXJseSB3ZSBtaWdodCB1c2UgdXAgdHdpY2UgdGhlIG1lbW9yeSAod2hpbGUgdGhlCisgICAgICAvLyBtZW1vcnksIGFuZCB0aGF0IG1vbWVudGFyaWx5IHdlIG1pZ2h0IHVzZSB1cCB0d2ljZSB0aGUgbWVtb3J5ICh3aGlsZSB0aGUKICAgICAgIC8vIHRocmlmdCBzdHJ1Y3QgaXMgYmVpbmcgcmVhZCB1cCB0aGUgY2hhaW4pLgogICAgICAgLy8gUHJvY2VlZGluZyBkaWZmZXJlbnRseSBtaWdodCBsZWFkIHRvIGV4aGF1c3Rpb24gb2YgY29ubmVjdGlvbnMgYW5kIHRodXMKICAgICAgIC8vIHRvIGFwcCBmYWlsdXJlLgogICAgICAgCi0gICAgICBpcyA9IHJlc3BvbnNlLmdldEVudGl0eSgpLmdldENvbnRlbnQoKTsKLSAgICAgIAogICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwogICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAKQEAgLTI2MCw3ICsyODIsNyBAQAogICAgICAgCiAgICAgICB0cnkgewogICAgICAgICAvLyBJbmRpY2F0ZSB3ZSdyZSBkb25lIHdpdGggdGhlIGNvbnRlbnQuCi0gICAgICAgIHJlc3BvbnNlLmdldEVudGl0eSgpLmNvbnN1bWVDb250ZW50KCk7CisgICAgICAgIGNvbnN1bWUocmVzcG9uc2UuZ2V0RW50aXR5KCkpOwogICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgIC8vIFdlIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiwgaXQgbWlnaHQgb25seSBtZWFuIHRoZSBzZXJ2ZXIgaGFzIG5vCiAgICAgICAgIC8vIGtlZXAtYWxpdmUgY2FwYWJpbGl0eS4KQEAgLTI4Miw2ICszMDQsOSBAQAogICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlvZSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGlmIChwb3N0ICE9IG51bGwpIHsKKyAgICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCmluZGV4IDliOTA2ZGIuLmIxOWFjODYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KQEAgLTI4LDggKzI4LDEwIEBACiBwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgewogICAvKioKICAgICogQ3JlYXRlIGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgYnVmZmVyIHNpemUgb2YgPGk+c2l6ZTwvaT4uIFRoZQotICAgKiBpbnRlcm5hbCBidWZmZXIgd2lsbCBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW9kYXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhCisgICAqIGludGVybmFsIGJ1ZmZlciB3aWxsIGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhCiAgICAqIGJlaW5nIHdyaXR0ZW4gdG8gaXQuCisgICAqCisgICAqIEBwYXJhbSBzaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgKi8KICAgcHVibGljIFRNZW1vcnlCdWZmZXIoaW50IHNpemUpIHsKICAgICBhcnJfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc2l6ZSk7CkBAIC02OSwyMCArNzEsMjAgQEAKICAgLyoqCiAgICAqIE91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcsIHVzaW5nIHRoZSBzdXBwbGllZAogICAgKiBlbmNvZGluZwotICAgKiBAcGFyYW0gZW5jICB0aGUgZW5jb2RpbmcgdG8gdXNlCisgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBlbmNvZGluZyB0byB1c2UKICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcKICAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGVuYyk7CisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIGFycl8udG9TdHJpbmcoY2hhcnNldCk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7Ci0gICAgU3RyaW5nIGJ1ZiA9ICIiOworICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICBieXRlW10gYnl0ZXMgPSBhcnJfLnRvQnl0ZUFycmF5KCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgYnVmICs9IChwb3NfID09IGkgPyAiPT0+IiA6ICIiICkgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhmZikgKyAiICI7CisgICAgICBidWYuYXBwZW5kKHBvc18gPT0gaSA/ICI9PT4iIDogIiIgKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4ZmYpKS5hcHBlbmQoIiAiKTsKICAgICB9Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgIH0KIAogICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5SW5wdXRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUlucHV0VHJhbnNwb3J0LmphdmEKaW5kZXggMTNiNWY4My4uMjUzMGRjYyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5SW5wdXRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlJbnB1dFRyYW5zcG9ydC5qYXZhCkBAIC00NSw2ICs0NSwxMCBAQAogICAgIGVuZFBvc18gPSBvZmZzZXQgKyBsZW5ndGg7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICBidWZfID0gbnVsbDsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCmluZGV4IDNlOGIzNTIuLmVmODJhYzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogICogV3JhcHBlciBhcm91bmQgU2VydmVyU29ja2V0Q2hhbm5lbAogICovCiBwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IGV4dGVuZHMgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5jbGFzcy5nZXROYW1lKCkpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNsYXNzLmdldE5hbWUoKSk7CiAKICAgLyoqCiAgICAqIFRoaXMgY2hhbm5lbCBpcyB3aGVyZSBhbGwgdGhlIG5vbmJsb2NraW5nIG1hZ2ljIGhhcHBlbnMuCkBAIC00NSw3ICs0NSw3IEBACiAgIHByaXZhdGUgU2VydmVyU29ja2V0Q2hhbm5lbCBzZXJ2ZXJTb2NrZXRDaGFubmVsID0gbnVsbDsKIAogICAvKioKLSAgICogVW5kZXJseWluZyBzZXJ2ZXJzb2NrZXQgb2JqZWN0CisgICAqIFVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9iamVjdAogICAgKi8KICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0XyA9IG51bGw7CiAKQEAgLTU0LDYgKzU0LDkgQEAKICAgICovCiAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXRfID0gMDsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzIGV4dGVuZHMKKyAgICAgIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncz4ge30KKwogICAvKioKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAogICAgKi8KQEAgLTY1LDcgKzY4LDcgQEAKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAogICAgKi8KICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0aGlzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwb3J0KSwgY2xpZW50VGltZW91dCk7CisgICAgdGhpcyhuZXcgTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOwogICB9CiAKICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtNzMsNyArNzYsMTEgQEAKICAgfQogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIsIGludCBjbGllbnRUaW1lb3V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICAgIHRoaXMobmV3IE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkuYmluZEFkZHIoYmluZEFkZHIpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOworICB9CisKKyAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncyBhcmdzKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgY2xpZW50VGltZW91dF8gPSBhcmdzLmNsaWVudFRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtODMsMTAgKzkwLDEwIEBACiAgICAgICAvLyBQcmV2ZW50IDJNU0wgZGVsYXkgcHJvYmxlbSBvbiBzZXJ2ZXIgcmVzdGFydHMKICAgICAgIHNlcnZlclNvY2tldF8uc2V0UmV1c2VBZGRyZXNzKHRydWUpOwogICAgICAgLy8gQmluZCB0byBsaXN0ZW5pbmcgcG9ydAotICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGJpbmRBZGRyKTsKKyAgICAgIHNlcnZlclNvY2tldF8uYmluZChhcmdzLmJpbmRBZGRyLCBhcmdzLmJhY2tsb2cpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgc2VydmVyU29ja2V0XyA9IG51bGw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCkBAIC0xNDcsNCArMTU0LDEwIEBACiAgICAgY2xvc2UoKTsKICAgfQogCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICBpZiAoc2VydmVyU29ja2V0XyA9PSBudWxsKQorICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzZXJ2ZXJTb2NrZXRfLmdldExvY2FsUG9ydCgpOworICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCmluZGV4IDQ4MmJkMTQuLmY4NmE0OGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQpAQCAtNTUsNyArNTUsNiBAQAogICAgKiBDcmVhdGUgYSBuZXcgbm9uYmxvY2tpbmcgc29ja2V0IHRyYW5zcG9ydCB0aGF0IHdpbGwgYmUgY29ubmVjdGVkIHRvIGhvc3Q6cG9ydC4KICAgICogQHBhcmFtIGhvc3QKICAgICogQHBhcmFtIHBvcnQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg1LDYgKzg0LDcgQEAKICAgICBTb2NrZXQgc29ja2V0ID0gc29ja2V0Q2hhbm5lbC5zb2NrZXQoKTsKICAgICBzb2NrZXQuc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7CiAgICAgc2V0VGltZW91dCh0aW1lb3V0KTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggMWUxYzRjOS4uMjIzMmEzMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMjAsOCArMjAsMTQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeTsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CkBAIC0zMiw3ICszOCw3IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5OwogCiAvKioKLSAqICBBIEZhY3RvcnkgZm9yIHByb3ZpZGluZyBhbmQgc2V0dGluZyB1cCBDbGllbnQgYW5kIFNlcnZlciBTU0wgd3JhcHBlZCAKKyAqICBBIEZhY3RvcnkgZm9yIHByb3ZpZGluZyBhbmQgc2V0dGluZyB1cCBDbGllbnQgYW5kIFNlcnZlciBTU0wgd3JhcHBlZAogICogIFRTb2NrZXQgYW5kIFRTZXJ2ZXJTb2NrZXQKICAqLwogcHVibGljIGNsYXNzIFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKQEAgLTQxLDI0ICs0NywyNCBAQAogICAgKiBHZXQgYSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4gSW4gdGhpcwogICAgKiBjb25maWd1cmF0aW9uIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSB1c2VkLiBEZWZhdWx0IHNldHRpbmdzIGFyZSByZXRyaWV2ZWQKICAgICogZnJvbSBTeXN0ZW0gcHJvcGVydGllcyB0aGF0IGFyZSBzZXQuCi0gICAqIAorICAgKgogICAgKiBFeGFtcGxlIHN5c3RlbSBwcm9wZXJ0aWVzOgotICAgKiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT08dHJ1c3RzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Jmx0O3RydXN0c3RvcmUgbG9jYXRpb24mZ3Q7CiAgICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSZsdDtrZXlzdG9yZSBsb2NhdGlvbiZndDsKICAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogCisgICAqCiAgICAqIEBwYXJhbSBwb3J0CiAgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0CiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHN0YXRpYyBUU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldChpbnQgcG9ydCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7IAorICAgIHJldHVybiBnZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7CiAgIH0KIAogICAvKioKICAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydAotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHBvcnQKICAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKICAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKQEAgLTcwLDcgKzc2LDcgQEAKIAogICAvKioKICAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gY2xpZW50VGltZW91dAogICAgKiBAcGFyYW0gaWZBZGRyZXNzCkBAIC03OSwxNCArODUsMTQgQEAKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sZWFuIGNsaWVudEF1dGgsIEluZXRBZGRyZXNzIGlmQWRkcmVzcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICByZXR1cm4gY3JlYXRlU2VydmVyKGZhY3RvcnksIHBvcnQsIGNsaWVudFRpbWVvdXQsIGNsaWVudEF1dGgsIGlmQWRkcmVzcywgbnVsbCk7IAorICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIoZmFjdG9yeSwgcG9ydCwgY2xpZW50VGltZW91dCwgY2xpZW50QXV0aCwgaWZBZGRyZXNzLCBudWxsKTsKICAgfQogCiAgIC8qKgotICAgKiBHZXQgYSBjb25maWd1cmVkIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBpbnRlcmZhY2UuIAotICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLCAKKyAgICogR2V0IGEgY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlLgorICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLAogICAgKiB0cnVzdHN0b3JlIGFuZCBvdGhlciBzZXR0aW5ncwotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHBvcnQKICAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKICAgICogQHBhcmFtIGlmQWRkcmVzcwpAQCAtMTEyLDcgKzExOCw4IEBACiAgICAgICBpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmNpcGhlclN1aXRlcyAhPSBudWxsKSB7CiAgICAgICAgIHNlcnZlclNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKHBhcmFtcy5jaXBoZXJTdWl0ZXMpOwogICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBUU2VydmVyU29ja2V0KHNlcnZlclNvY2tldCk7CisgICAgICByZXR1cm4gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLgorICAgICAgICBzZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KS5jbGllbnRUaW1lb3V0KHRpbWVvdXQpKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBiaW5kIHRvIHBvcnQgIiArIHBvcnQsIGUpOwogICAgIH0KQEAgLTEyMCw5ICsxMjcsOSBAQAogCiAgIC8qKgogICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4gQWxsCi0gICAqIHRoZSBjbGllbnQgbWV0aG9kcyByZXR1cm4gYSBib3VuZCBjb25uZWN0aW9uLiBTbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgb3BlbigpIG9uIHRoZSAKKyAgICogdGhlIGNsaWVudCBtZXRob2RzIHJldHVybiBhIGJvdW5kIGNvbm5lY3Rpb24uIFNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBvcGVuKCkgb24gdGhlCiAgICAqIFRUcmFuc3BvcnQuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gdGltZW91dApAQCAtMTM2LDcgKzE0Myw3IEBACiAKICAgLyoqCiAgICAqIEdldCBhIGRlZmF1bHQgU1NMIHdyYXBwZWQgVFNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIGhvc3QKICAgICogQHBhcmFtIHBvcnQKICAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKQEAgLTE0Nyw5ICsxNTQsOSBAQAogICB9CiAKICAgLyoqCi0gICAqIEdldCBhIGN1c3RvbSBjb25maWd1cmVkIFNTTCB3cmFwcGVkIFRTb2NrZXQuIFRoZSBTU0wgc2V0dGluZ3MgYXJlIG9idGFpbmVkIGZyb20gdGhlIAorICAgKiBHZXQgYSBjdXN0b20gY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU29ja2V0LiBUaGUgU1NMIHNldHRpbmdzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZQogICAgKiBwYXNzZWQgaW4gVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gdGltZW91dApAQCAtMTY4LDYgKzE3NSw5IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBjcmVhdGVTU0xDb250ZXh0KFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTENvbnRleHQgY3R4OworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKICAgICB0cnkgewogICAgICAgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShwYXJhbXMucHJvdG9jb2wpOwogICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBudWxsOwpAQCAtMTc2LDE0ICsxODYsMjUgQEAKICAgICAgIGlmIChwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSB7CiAgICAgICAgIHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0TWFuYWdlclR5cGUpOwogICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy50cnVzdFN0b3JlVHlwZSk7Ci0gICAgICAgIHRzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSksIHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSk7CisgICAgICAgIGlmIChwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgaW4gPSBwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbiA9IGdldFN0b3JlQXNTdHJlYW0ocGFyYW1zLnRydXN0U3RvcmUpOworICAgICAgICB9CisgICAgICAgIHRzLmxvYWQoaW4sCisgICAgICAgICAgICAgICAgKHBhcmFtcy50cnVzdFBhc3MgIT0gbnVsbCA/IHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSA6IG51bGwpKTsKICAgICAgICAgdG1mLmluaXQodHMpOwogICAgICAgfQogCiAgICAgICBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKICAgICAgICAga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLmtleU1hbmFnZXJUeXBlKTsKICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShwYXJhbXMua2V5U3RvcmVUeXBlKTsKLSAgICAgICAga3MubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHBhcmFtcy5rZXlTdG9yZSksIHBhcmFtcy5rZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CiAgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgIH0KIApAQCAtMTk5LDEwICsyMjAsNTAgQEAKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGhlIHRyYW5zcG9ydCIsIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIGN0eDsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFN0b3JlQXNTdHJlYW0oU3RyaW5nIHN0b3JlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShzdG9yZSk7CisgICAgfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgIH0KKworICAgIElucHV0U3RyZWFtIHN0b3JlU3RyZWFtID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgc3RvcmVTdHJlYW0gPSBuZXcgVVJMKHN0b3JlKS5vcGVuU3RyZWFtKCk7CisgICAgICBpZiAoc3RvcmVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gc3RvcmVTdHJlYW07CisgICAgICB9CisgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgIH0KKworICAgIHN0b3JlU3RyZWFtID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHN0b3JlKTsKKworICAgIGlmIChzdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gc3RvcmVTdHJlYW07CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgZmlsZTogIiArIHN0b3JlKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBUU29ja2V0IGNyZWF0ZUNsaWVudChTU0xTb2NrZXRGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewogICAgICAgU1NMU29ja2V0IHNvY2tldCA9IChTU0xTb2NrZXQpIGZhY3RvcnkuY3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOwpAQCAtMjIwLDEyICsyODEsMTQgQEAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyB7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9ICJUTFMiOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5UGFzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleU1hbmFnZXJUeXBlID0gIlN1blg1MDkiOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5TWFuYWdlclR5cGUgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCk7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlTdG9yZVR5cGUgPSAiSktTIjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW07CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFBhc3M7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlID0gIlN1blg1MDkiOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUgPSAiSktTIjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gY2lwaGVyU3VpdGVzOwogICAgIHByb3RlY3RlZCBib29sZWFuIGNsaWVudEF1dGggPSBmYWxzZTsKQEAgLTIzNiw3ICsyOTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIHBhcmFtZXRlcnMgc3BlY2lmeWluZyB0aGUgcHJvdG9jb2wgYW5kIGNpcGhlciBzdWl0ZXMKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgc3BlY2lmaWMgcHJvdG9jb2wgKFRMUy9TU0wpIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB2ZXJzaW9ucwogICAgICAqIEBwYXJhbSBjaXBoZXJTdWl0ZXMKICAgICAgKi8KQEAgLTI0Nyw3ICszMTAsNyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIHByb3RvY29sLCBjaXBoZXIgc3VpdGVzIGFuZCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24KICAgICAgKiBpcyByZXF1aXJlZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByb3RvY29sIFRoZSBzcGVjaWZpYyBwcm90b2NvbCAoVExTL1NTTCkgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHZlcnNpb25zCiAgICAgICogQHBhcmFtIGNpcGhlclN1aXRlcwogICAgICAqIEBwYXJhbSBjbGllbnRBdXRoCkBAIC0yNTYsMTMgKzMxOSwxMyBAQAogICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwogICAgICAgfQotICAgICAgdGhpcy5jaXBoZXJTdWl0ZXMgPSBjaXBoZXJTdWl0ZXM7CisgICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IGNpcGhlclN1aXRlcyAhPSBudWxsID8gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpIDogbnVsbDsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5U3RvcmUgTG9jYXRpb24gb2YgdGhlIEtleXN0b3JlIG9uIGRpc2sKICAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAogICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CkBAIC0yNzksMjAgKzM0Miw0MyBAQAogICAgICAgfQogICAgICAgaXNLZXlTdG9yZVNldCA9IHRydWU7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MsIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSwgU3RyaW5nIGtleVN0b3JlVHlwZSkgeworICAgIAl0aGlzLmtleVN0b3JlU3RyZWFtID0ga2V5U3RvcmVTdHJlYW07CisgICAgCXNldEtleVN0b3JlKCIiLCBrZXlQYXNzLCBrZXlNYW5hZ2VyVHlwZSwga2V5U3RvcmVUeXBlKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXlTdG9yZSBMb2NhdGlvbiBvZiB0aGUgS2V5c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoU3RyaW5nIGtleVN0b3JlLCBTdHJpbmcga2V5UGFzcykgewogICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmUsIGtleVBhc3MsIG51bGwsIG51bGwpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlKElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtLCBTdHJpbmcga2V5UGFzcykgeworICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmVTdHJlYW0sIGtleVBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRydXN0U3RvcmUgTG9jYXRpb24gb2YgdGhlIFRydXN0c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAogICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKQEAgLTMwOSwyNCArMzk1LDQ3IEBACiAgICAgICB9CiAgICAgICBpc1RydXN0U3RvcmVTZXQgPSB0cnVlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVR5cGUgVGhlIGRlZmF1bHQgaXMgSktTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzLCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSwgU3RyaW5nIHRydXN0U3RvcmVUeXBlKSB7CisgICAgICB0aGlzLnRydXN0U3RvcmVTdHJlYW0gPSB0cnVzdFN0b3JlU3RyZWFtOworICAgICAgc2V0VHJ1c3RTdG9yZSgiIiwgdHJ1c3RQYXNzLCB0cnVzdE1hbmFnZXJUeXBlLCB0cnVzdFN0b3JlVHlwZSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRydXN0U3RvcmUgTG9jYXRpb24gb2YgdGhlIFRydXN0c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoU3RyaW5nIHRydXN0U3RvcmUsIFN0cmluZyB0cnVzdFBhc3MpIHsKICAgICAgIHNldFRydXN0U3RvcmUodHJ1c3RTdG9yZSwgdHJ1c3RQYXNzLCBudWxsLCBudWxsKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbSwgU3RyaW5nIHRydXN0UGFzcykgeworICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlU3RyZWFtLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXV0aAorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudEF1dGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1aXJlQ2xpZW50QXV0aChib29sZWFuIGNsaWVudEF1dGgpIHsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7Ci0gICAgfQotICB9CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKaW5kZXggNWFhMGNjZC4uNGIxY2EwYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQpAQCAtMTksNiArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CkBAIC05Niw3ICs5Nyw3IEBACiAgICAgTE9HR0VSLmRlYnVnKCJTZW5kaW5nIG1lY2hhbmlzbSBuYW1lIHt9IGFuZCBpbml0aWFsIHJlc3BvbnNlIG9mIGxlbmd0aCB7fSIsIG1lY2hhbmlzbSwKICAgICAgICAgaW5pdGlhbFJlc3BvbnNlLmxlbmd0aCk7CiAKLSAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoKTsKKyAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgc2VuZFNhc2xNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLlNUQVJULAogICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc21CeXRlcyk7CiAgICAgLy8gU2VuZCBpbml0aWFsIHJlc3BvbnNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggOGFiY2YzNi4uMzliODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQpAQCAtMTksNiArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xMjUsMTYgKzEyNywxNiBAQAogCiAgICAgTE9HR0VSLmRlYnVnKCJSZWNlaXZlZCBzdGFydCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IiwgbWVzc2FnZS5zdGF0dXMpOwogICAgIGlmIChtZXNzYWdlLnN0YXR1cyAhPSBOZWdvdGlhdGlvblN0YXR1cy5TVEFSVCkgewotICAgICAgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5FUlJPUiwgIkV4cGVjdGluZyBTVEFSVCBzdGF0dXMsIHJlY2VpdmVkICIgKyBtZXNzYWdlLnN0YXR1cyk7CisgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiRXhwZWN0aW5nIFNUQVJUIHN0YXR1cywgcmVjZWl2ZWQgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKICAgICB9CiAKICAgICAvLyBHZXQgdGhlIG1lY2hhbmlzbSBuYW1lLgotICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQpOworICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIFRTYXNsU2VydmVyRGVmaW5pdGlvbiBzZXJ2ZXJEZWZpbml0aW9uID0gc2VydmVyRGVmaW5pdGlvbk1hcC5nZXQobWVjaGFuaXNtTmFtZSk7CiAgICAgTE9HR0VSLmRlYnVnKCJSZWNlaXZlZCBtZWNoYW5pc20gbmFtZSAne30nIiwgbWVjaGFuaXNtTmFtZSk7CiAKICAgICBpZiAoc2VydmVyRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkJBRCwgIlVuc3VwcG9ydGVkIG1lY2hhbmlzbSB0eXBlICIgKyBtZWNoYW5pc21OYW1lKTsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuQkFELCAiVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgIiArIG1lY2hhbmlzbU5hbWUpOwogICAgIH0KICAgICBTYXNsU2VydmVyIHNhc2xTZXJ2ZXIgPSBTYXNsLmNyZWF0ZVNhc2xTZXJ2ZXIoc2VydmVyRGVmaW5pdGlvbi5tZWNoYW5pc20sCiAgICAgICAgIHNlcnZlckRlZmluaXRpb24ucHJvdG9jb2wsIHNlcnZlckRlZmluaXRpb24uc2VydmVyTmFtZSwgc2VydmVyRGVmaW5pdGlvbi5wcm9wcywKQEAgLTE0NCw3ICsxNDYsNyBAQAogCiAgIC8qKgogICAgKiA8Y29kZT5UVHJhbnNwb3J0RmFjdG9yeTwvY29kZT4gdG8gY3JlYXRlCi0gICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0czxjL29kZT4uIEVuc3VyZXMgdGhhdCBhIGdpdmVuCisgICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0czwvY29kZT4uIEVuc3VyZXMgdGhhdCBhIGdpdmVuCiAgICAqIHVuZGVybHlpbmcgPGNvZGU+VFRyYW5zcG9ydDwvY29kZT4gaW5zdGFuY2UgcmVjZWl2ZXMgdGhlIHNhbWUKICAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ8L2NvZGU+LiBUaGlzIGlzIGtpbmQgb2YgYW4gYXdmdWwgaGFjayB0byB3b3JrCiAgICAqIGFyb3VuZCB0aGUgZmFjdCB0aGF0IFRocmlmdCBpcyBkZXNpZ25lZCBhc3N1bWluZyB0aGF0CkBAIC0xNTgsOCArMTYwLDggQEAKICAgICAgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXdmdWwgaGFjayBkZXNjcmliZWQgYWJvdmUuCiAgICAgICogPGNvZGU+V2Vha0hhc2hNYXA8L2NvZGU+IGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgbGVhayBtZW1vcnkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFRUcmFuc3BvcnQsIFRTYXNsU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnRNYXAgPQotICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDxUVHJhbnNwb3J0LCBUU2FzbFNlcnZlclRyYW5zcG9ydD4oKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFRUcmFuc3BvcnQsIFdlYWtSZWZlcmVuY2U8VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ+PiB0cmFuc3BvcnRNYXAgPQorICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDxUVHJhbnNwb3J0LCBXZWFrUmVmZXJlbmNlPFRTYXNsU2VydmVyVHJhbnNwb3J0Pj4oKSk7CiAKICAgICAvKioKICAgICAgKiBNYXBwaW5nIGZyb20gU0FTTCBtZWNoYW5pc20gbmFtZSAtPiBhbGwgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgdG8KQEAgLTIwNywyMSArMjA5LDIyIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgYmFzZSkgewotICAgICAgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQgcmV0ID0gdHJhbnNwb3J0TWFwLmdldChiYXNlKTsKLSAgICAgIGlmIChyZXQgPT0gbnVsbCkgeworICAgICAgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4gcmV0ID0gdHJhbnNwb3J0TWFwLmdldChiYXNlKTsKKyAgICAgIGlmIChyZXQgPT0gbnVsbCB8fCByZXQuZ2V0KCkgPT0gbnVsbCkgewogICAgICAgICBMT0dHRVIuZGVidWcoInRyYW5zcG9ydCBtYXAgZG9lcyBub3QgY29udGFpbiBrZXkiLCBiYXNlKTsKLSAgICAgICAgcmV0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KHNlcnZlckRlZmluaXRpb25NYXAsIGJhc2UpOworICAgICAgICByZXQgPSBuZXcgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4obmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KHNlcnZlckRlZmluaXRpb25NYXAsIGJhc2UpKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXQub3BlbigpOworICAgICAgICAgIHJldC5nZXQoKS5vcGVuKCk7CiAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgewogICAgICAgICAgIExPR0dFUi5kZWJ1ZygiZmFpbGVkIHRvIG9wZW4gc2VydmVyIHRyYW5zcG9ydCIsIGUpOwogICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9Ci0gICAgICAgIHRyYW5zcG9ydE1hcC5wdXQoYmFzZSwgcmV0KTsKKyAgICAgICAgdHJhbnNwb3J0TWFwLnB1dChiYXNlLCByZXQpOyAvLyBObyBuZWVkIGZvciBwdXRJZkFic2VudCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgY2FsbHMgdG8gZ2V0VHJhbnNwb3J0KCkgd2lsbCBwYXNzIGluIGRpZmZlcmVudCBUVHJhbnNwb3J0cy4KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0dFUi5kZWJ1ZygidHJhbnNwb3J0IG1hcCBkb2VzIGNvbnRhaW4ga2V5IHt9IiwgYmFzZSk7CiAgICAgICB9Ci0gICAgICByZXR1cm4gcmV0OworICAgICAgcmV0dXJuIHJldC5nZXQoKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQppbmRleCA4MzQ4MjM0Li5iZWQzYjM5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zNSw3ICszNSw3IEBACiAKIC8qKgogICogQSBzdXBlcmNsYXNzIGZvciBTQVNMIGNsaWVudC9zZXJ2ZXIgdGhyaWZ0IHRyYW5zcG9ydHMuIEEgc3ViY2xhc3MgbmVlZCBvbmx5Ci0gKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L29wZW4+IG1ldGhvZC4KKyAqIGltcGxlbWVudCB0aGUgPGNvZGU+b3BlbjwvY29kZT4gbWV0aG9kLgogICovCiBhYnN0cmFjdCBjbGFzcyBUU2FzbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRTYXNsVHJhbnNwb3J0LiBJdCdzIGFzc3VtZWQgdGhhdCBzZXRTYXNsU2VydmVyIHdpbGwgYmUgY2FsbGVkCiAgICAqIGxhdGVyIHRvIGluaXRpYWxpemUgdGhlIFNBU0wgZW5kcG9pbnQgdW5kZXJseWluZyB0aGlzIHRyYW5zcG9ydC4KLSAgICogCisgICAqCiAgICAqIEBwYXJhbSB1bmRlcmx5aW5nVHJhbnNwb3J0CiAgICAqICAgICAgICAgIFRoZSB0aHJpZnQgdHJhbnNwb3J0IHdoaWNoIHRoaXMgdHJhbnNwb3J0IGlzIHdyYXBwaW5nLgogICAgKi8KQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAgIC8qKgogICAgKiBDcmVhdGUgYSBUU2FzbFRyYW5zcG9ydCB3aGljaCBhY3RzIGFzIGEgY2xpZW50LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHNhc2xDbGllbnQKICAgICogICAgICAgICAgVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+IHdoaWNoIHRoaXMgdHJhbnNwb3J0IHdpbGwgdXNlIGZvciBTQVNMCiAgICAqICAgICAgICAgIG5lZ290aWF0aW9uLgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgLyoqCiAgICAqIFNlbmQgYSBjb21wbGV0ZSBUaHJpZnQgU0FTTCBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHN0YXR1cwogICAgKiAgICAgICAgICBUaGUgc3RhdHVzIHRvIHNlbmQuCiAgICAqIEBwYXJhbSBwYXlsb2FkCkBAIC0xNTgsOSArMTU4LDkgQEAKICAgICBtZXNzYWdlSGVhZGVyWzBdID0gc3RhdHVzLmdldFZhbHVlKCk7CiAgICAgRW5jb2RpbmdVdGlscy5lbmNvZGVCaWdFbmRpYW4ocGF5bG9hZC5sZW5ndGgsIG1lc3NhZ2VIZWFkZXIsIFNUQVRVU19CWVRFUyk7CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKG1lc3NhZ2VIZWFkZXIpOwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQud3JpdGUocGF5bG9hZCk7CiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5mbHVzaCgpOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAKICAgLyoqCiAgICAqIFJlYWQgYSBjb21wbGV0ZSBUaHJpZnQgU0FTTCBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiBUaGUgU0FTTCBzdGF0dXMgYW5kIHBheWxvYWQgZnJvbSB0aGlzIG1lc3NhZ2UuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcKQEAgLTE3OCw0MiArMTc4LDQ3IEBACiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5yZWFkQWxsKG1lc3NhZ2VIZWFkZXIsIDAsIG1lc3NhZ2VIZWFkZXIubGVuZ3RoKTsKIAogICAgIGJ5dGUgc3RhdHVzQnl0ZSA9IG1lc3NhZ2VIZWFkZXJbMF07Ci0gICAgYnl0ZVtdIHBheWxvYWQgPSBuZXcgYnl0ZVtFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpXTsKLSAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOwogCiAgICAgTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzID0gTmVnb3RpYXRpb25TdGF0dXMuYnlWYWx1ZShzdGF0dXNCeXRlKTsKICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuRVJST1IsICJJbnZhbGlkIHN0YXR1cyAiICsgc3RhdHVzQnl0ZSk7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQkFEIHx8IHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5FUlJPUikgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHJlbW90ZU1lc3NhZ2UgPSBuZXcgU3RyaW5nKHBheWxvYWQsICJVVEYtOCIpOwotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotICAgICAgfQorICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5FUlJPUiwgIkludmFsaWQgc3RhdHVzICIgKyBzdGF0dXNCeXRlKTsKICAgICB9CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAotICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworICAgIGludCBwYXlsb2FkQnl0ZXMgPSBFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpOworICAgIGlmIChwYXlsb2FkQnl0ZXMgPCAwIHx8IHBheWxvYWRCeXRlcyA+IDEwNDg1NzYwMCAvKiAxMDAgTUIgKi8pIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoCisgICAgICAgIE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6ICIgKyBwYXlsb2FkQnl0ZXMpOworICAgIH0KKworICAgIGJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbcGF5bG9hZEJ5dGVzXTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOworCisgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoInt9OiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CiAgICAgcmV0dXJuIG5ldyBTYXNsUmVzcG9uc2Uoc3RhdHVzLCBwYXlsb2FkKTsKICAgfQogCiAgIC8qKgotICAgKiBTZW5kIGEgVGhyaWZ0IFNBU0wgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgKHVzYXVsbHkgQkFEIG9yIEVSUk9SKSBhbmQKKyAgICogU2VuZCBhIFRocmlmdCBTQVNMIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzICh1c3VhbGx5IEJBRCBvciBFUlJPUikgYW5kCiAgICAqIHN0cmluZyBtZXNzYWdlLCBhbmQgdGhlbiB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4KICAgICogbWVzc2FnZS4KLSAgICogCisgICAqCiAgICAqIEBwYXJhbSBzdGF0dXMKICAgICogICAgICAgICAgVGhlIFRocmlmdCBTQVNMIHN0YXR1cyBjb2RlIHRvIHNlbmQuIFVzdWFsbHkgQkFEIG9yIEVSUk9SLgogICAgKiBAcGFyYW0gbWVzc2FnZQogICAgKiAgICAgICAgICBUaGUgb3B0aW9uYWwgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBvdGhlciBzaWRlLgogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogICAgICAgICAgIEFsd2F5cyB0aHJvd24gd2l0aCB0aGUgbWVzc2FnZSBwcm92aWRlZC4KKyAgICogQHJldHVybiBhbHdheXMgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gYnV0IGRlY2xhcmVzIHJldHVybiB0eXBlIHRvIGFsbG93CisgICAqICAgICAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoLi4uKSB0byBpbmZvcm0gY29tcGlsZXIgY29udHJvbCBmbG93CiAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnRFeGNlcHRpb24gc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKLSAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoKSk7CisgICAgICBzZW5kU2FzbE1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBzZW5kIGZhaWx1cmUgcmVzcG9uc2UiLCBlKTsKICAgICAgIG1lc3NhZ2UgKz0gIlxuQWxzbywgY291bGQgbm90IHNlbmQgcmVzcG9uc2U6ICIgKyBlLnRvU3RyaW5nKCk7CkBAIC0yMjUsNyArMjMwLDcgQEAKICAgICogSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBzdGFydCB0aGUgVGhyaWZ0IFNBU0wgaGFuZHNoYWtlIHByb2Nlc3MuIFdoZW4KICAgICogdGhpcyBtZXRob2QgY29tcGxldGVzLCB0aGUgPGNvZGU+U2FzbFBhcnRpY2lwYW50PC9jb2RlPiBpbiB0aGlzIGNsYXNzIGlzCiAgICAqIGFzc3VtZWQgdG8gYmUgaW5pdGlhbGl6ZWQuCi0gICAqIAorICAgKgogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogQHRocm93cyBTYXNsRXhjZXB0aW9uCiAgICAqLwpAQCAtMjM1LDExICsyNDAsMTggQEAKIAogICAvKioKICAgICogT3BlbnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlmIGl0J3Mgbm90IGFscmVhZHkgb3BlbiBhbmQgdGhlbiBwZXJmb3JtcwotICAgKiBTQVNMIG5lZ290aWF0aW9uLiBJZiBhIFFPUCBpcyBuZWdvaWF0ZWQgZHVyaW5nIHRoaXMgU0FTTCBoYW5kc2hha2UsIGl0IHVzZWQKKyAgICogU0FTTCBuZWdvdGlhdGlvbi4gSWYgYSBRT1AgaXMgbmVnb3RpYXRlZCBkdXJpbmcgdGhpcyBTQVNMIGhhbmRzaGFrZSwgaXQgdXNlZAogICAgKiBmb3IgYWxsIGNvbW11bmljYXRpb24gb24gdGhpcyB0cmFuc3BvcnQgYWZ0ZXIgdGhpcyBjYWxsIGlzIGNvbXBsZXRlLgogICAgKi8KICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgLyoKKyAgICAgKiByZWFkU2FzbEhlYWRlciBpcyB1c2VkIHRvIHRhZyB3aGV0aGVyIHRoZSBTQVNMIGhlYWRlciBoYXMgYmVlbiByZWFkIHByb3Blcmx5LgorICAgICAqIElmIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiByZWFkaW5nIHRoZSBoZWFkZXIsIHRoZXJlIG1pZ2h0IG5vdCBiZSBhbnkKKyAgICAgKiBkYXRhIGluIHRoZSBzdHJlYW0sIHBvc3NpYmx5IGEgVENQIGhlYWx0aCBjaGVjayBmcm9tIGxvYWQgYmFsYW5jZXIuCisgICAgICovCisgICAgYm9vbGVhbiByZWFkU2FzbEhlYWRlciA9IGZhbHNlOworCiAgICAgTE9HR0VSLmRlYnVnKCJvcGVuaW5nIHRyYW5zcG9ydCB7fSIsIHRoaXMpOwogICAgIGlmIChzYXNsICE9IG51bGwgJiYgc2FzbC5pc0NvbXBsZXRlKCkpCiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU0FTTCB0cmFuc3BvcnQgYWxyZWFkeSBvcGVuIik7CkBAIC0yNTEsNiArMjYzLDcgQEAKICAgICAgIC8vIE5lZ290aWF0ZSBhIFNBU0wgbWVjaGFuaXNtLiBUaGUgY2xpZW50IGFsc28gc2VuZHMgaXRzCiAgICAgICAvLyBpbml0aWFsIHJlc3BvbnNlLCBvciBhbiBlbXB0eSBvbmUuCiAgICAgICBoYW5kbGVTYXNsU3RhcnRNZXNzYWdlKCk7CisgICAgICByZWFkU2FzbEhlYWRlciA9IHRydWU7CiAgICAgICBMT0dHRVIuZGVidWcoInt9OiBTdGFydCBtZXNzYWdlIGhhbmRsZWQiLCBnZXRSb2xlKCkpOwogCiAgICAgICBTYXNsUmVzcG9uc2UgbWVzc2FnZSA9IG51bGw7CkBAIC0yNjgsNyArMjgxLDcgQEAKICAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkNPTVBMRVRFICYmCiAgICAgICAgICAgICBnZXRSb2xlKCkgPT0gU2FzbFJvbGUuQ0xJRU5UKSB7CiAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJ7fTogQWxsIGRvbmUhIiwgZ2V0Um9sZSgpKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIHNlbmRTYXNsTWVzc2FnZShzYXNsLmlzQ29tcGxldGUoKSA/IE5lZ290aWF0aW9uU3RhdHVzLkNPTVBMRVRFIDogTmVnb3RpYXRpb25TdGF0dXMuT0ssCkBAIC0yNzYsOCArMjg5LDYgQEAKICAgICAgIH0KICAgICAgIExPR0dFUi5kZWJ1Zygie306IE1haW4gbmVnb3RpYXRpb24gbG9vcCBjb21wbGV0ZSIsIGdldFJvbGUoKSk7CiAKLSAgICAgIGFzc2VydCBzYXNsLmlzQ29tcGxldGUoKTsKLQogICAgICAgLy8gSWYgd2UncmUgdGhlIGNsaWVudCwgYW5kIHdlJ3JlIGNvbXBsZXRlLCBidXQgdGhlIHNlcnZlciBpc24ndAogICAgICAgLy8gY29tcGxldGUgeWV0LCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGl0cyByZXNwb25zZS4gVGhpcyB3aWxsIG9jY3VyCiAgICAgICAvLyB3aXRoIEFOT05ZTU9VUyBhdXRoLCBmb3IgZXhhbXBsZSwgd2hlcmUgd2Ugc2VuZCBhbiBpbml0aWFsIHJlc3BvbnNlCkBAIC0yOTMsMTAgKzMwNCwyMiBAQAogICAgICAgfQogICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgewogICAgICAgdHJ5IHsKLSAgICAgICAgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5CQUQsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJTQVNMIG5lZ290aWF0aW9uIGZhaWx1cmUiLCBlKTsKKyAgICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5CQUQsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKICAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8qCisgICAgICAgKiBJZiB0aGVyZSBpcyBuby1kYXRhIG9yIG5vLXNhc2wgaGVhZGVyIGluIHRoZSBzdHJlYW0sIHRocm93IGEgZGlmZmVyZW50CisgICAgICAgKiB0eXBlIG9mIGV4Y2VwdGlvbiBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgc2NlbmFyaW8gZGlmZmVyZW50bHkuCisgICAgICAgKi8KKyAgICAgIGlmICghcmVhZFNhc2xIZWFkZXIgJiYgZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgeworICAgICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIExPR0dFUi5kZWJ1ZygiTm8gZGF0YSBvciBubyBzYXNsIGRhdGEgaW4gdGhlIHN0cmVhbSIpOworICAgICAgICB0aHJvdyBuZXcgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oIk5vIGRhdGEgb3Igbm8gc2FzbCBkYXRhIGluIHRoZSBzdHJlYW0iKTsKKyAgICAgIH0KKyAgICAgIHRocm93IGU7CiAgICAgfQogCiAgICAgU3RyaW5nIHFvcCA9IChTdHJpbmcpIHNhc2wuZ2V0TmVnb3RpYXRlZFByb3BlcnR5KFNhc2wuUU9QKTsKQEAgLTMwNiw3ICszMjksNyBAQAogCiAgIC8qKgogICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+U2FzbENsaWVudDwvY29kZT4uCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0cmFuc3BvcnQKICAgICogICAgICAgICBpcyBiYWNrZWQgYnkgYSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPi4KICAgICovCkBAIC0zMTUsOCArMzM4LDE2IEBACiAgIH0KIAogICAvKioKKyAgICogR2V0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0aGF0IFNhc2wgaXMgdXNpbmcuCisgICAqIEByZXR1cm4gVGhlIDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+IHRyYW5zcG9ydAorICAgKi8KKyAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7CisgICAgIHJldHVybiB1bmRlcmx5aW5nVHJhbnNwb3J0OworICAgfQorCisgIC8qKgogICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+U2FzbFNlcnZlcjwvY29kZT4uCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0cmFuc3BvcnQKICAgICogICAgICAgICBpcyBiYWNrZWQgYnkgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KICAgICovCkBAIC0zMjcsNyArMzU4LDcgQEAKICAgLyoqCiAgICAqIFJlYWQgYSA0LWJ5dGUgd29yZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhbmQgaW50ZXJwcmV0IGl0IGFzIGFuCiAgICAqIGludGVnZXIuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggcHJlZml4IG9mIHRoZSBuZXh0IFNBU0wgbWVzc2FnZSB0byByZWFkLgogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogICAgICAgICAgIFRocm93biBpZiByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgpAQCAtMzQwLDcgKzM3MSw3IEBACiAKICAgLyoqCiAgICAqIFdyaXRlIHRoZSBnaXZlbiBpbnRlZ2VyIGFzIDQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIGxlbmd0aAogICAgKiAgICAgICAgICBUaGUgbGVuZ3RoIHByZWZpeCBvZiB0aGUgbmV4dCBTQVNMIG1lc3NhZ2UgdG8gd3JpdGUuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgpAQCAtNDA0LDcgKzQzNSw3IEBACiAgIC8qKgogICAgKiBSZWFkIGEgc2luZ2xlIGZyYW1lIG9mIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHVud3JhcHBpbmcgaWYKICAgICogbmVjZXNzYXJ5LgotICAgKiAKKyAgICoKICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCiAgICAqICAgICAgICAgICBUaHJvd24gaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgogICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDE4OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIHRvIHRyYWNrIGV4Y2VwdGlvbnMgaW4gVFNhc2xUcmFuc3BvcnQKKyAqIHRoYXQgZG9lcyBub3QgaGF2ZSBTYXNsIHNpZ25hdHVyZSBpbiB0aGVpciBzdHJlYW0uCisgKi8KK3B1YmxpYyBjbGFzcyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRUcmFuc3BvcnRFeGNlcHRpb24geworCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKaW5kZXggOWRhZDM2ZC4uNzlmN2I3ZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRTZXJ2ZXJTb2NrZXQuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAvKioKLSAgICogVW5kZXJseWluZyBzZXJ2ZXJzb2NrZXQgb2JqZWN0CisgICAqIFVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9iamVjdAogICAgKi8KICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0XyA9IG51bGw7CiAKQEAgLTQ2LDE5ICs0NiwyNyBAQAogICAgKi8KICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dF8gPSAwOwogCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncyBleHRlbmRzIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzPiB7CisgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKworICAgIHB1YmxpYyBTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzIHNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldCA9IHNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAogICAgKi8KLSAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgeworICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdGhpcyhzZXJ2ZXJTb2NrZXQsIDApOwogICB9CiAKICAgLyoqCiAgICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0CiAgICAqLwotICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBpbnQgY2xpZW50VGltZW91dCkgewotICAgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJTb2NrZXQ7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBpbnQgY2xpZW50VGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRoaXMobmV3IFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS5zZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKICAgfQogCiAgIC8qKgpAQCAtODAsMjIgKzg4LDMwIEBACiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkciwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7CisgICAgdGhpcyhuZXcgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLmJpbmRBZGRyKGJpbmRBZGRyKS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKKyAgfQorCisgIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgYXJncykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGNsaWVudFRpbWVvdXRfID0gYXJncy5jbGllbnRUaW1lb3V0OworICAgIGlmIChhcmdzLnNlcnZlclNvY2tldCAhPSBudWxsKSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldF8gPSBhcmdzLnNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgdHJ5IHsKICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAogICAgICAgc2VydmVyU29ja2V0XyA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKICAgICAgIC8vIFByZXZlbnQgMk1TTCBkZWxheSBwcm9ibGVtIG9uIHNlcnZlciByZXN0YXJ0cwogICAgICAgc2VydmVyU29ja2V0Xy5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7CiAgICAgICAvLyBCaW5kIHRvIGxpc3RlbmluZyBwb3J0Ci0gICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYmluZEFkZHIpOworICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBiaW5kQWRkci50b1N0cmluZygpICsgIi4iKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggMTdmZjg2Yi4uNDI0ZTRmYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTE5LDExICsxOSw0MCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworCiAvKioKICAqIFNlcnZlciB0cmFuc3BvcnQuIE9iamVjdCB3aGljaCBwcm92aWRlcyBjbGllbnQgdHJhbnNwb3J0cy4KICAqCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxUIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJUcmFuc3BvcnRBcmdzPFQ+PiB7CisgICAgaW50IGJhY2tsb2cgPSAwOyAvLyBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkIChjdXJyZW50bHkgc2V0IGF0IDUwKQorICAgIGludCBjbGllbnRUaW1lb3V0ID0gMDsKKyAgICBJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcjsKKworICAgIHB1YmxpYyBUIGJhY2tsb2coaW50IGJhY2tsb2cpIHsKKyAgICAgIHRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgY2xpZW50VGltZW91dChpbnQgY2xpZW50VGltZW91dCkgeworICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBwb3J0KGludCBwb3J0KSB7CisgICAgICB0aGlzLmJpbmRBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpOworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIGJpbmRBZGRyKEluZXRTb2NrZXRBZGRyZXNzIGJpbmRBZGRyKSB7CisgICAgICB0aGlzLmJpbmRBZGRyID0gYmluZEFkZHI7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorICB9CiAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgbGlzdGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjEwMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworCisKKy8qKgorICogQmFzaWMgZmlsZSBzdXBwb3J0IGZvciB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBudWxsOyAgIAorICBwcml2YXRlIGJvb2xlYW4gcmVhZGFibGU7ICAgICAgICAgICAgICAgCisgIHByaXZhdGUgYm9vbGVhbiB3cml0YWJsZTsgICAgICAgICAgICAgICAKKyAgcHJpdmF0ZSBTdHJpbmcgcGF0aF87ICAgICAgICAgICAgICAgCisKKworICAvKioKKyAgICogQ3JlYXRlIGEgdHJhbnNwb3J0IGJhY2tlZCBieSBhIHNpbXBsZSBmaWxlIAorICAgKiAKKyAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gb3Blbi9jcmVhdGUKKyAgICogQHBhcmFtIHJlYWQgdHJ1ZSB0byBzdXBwb3J0IHJlYWQgb3BlcmF0aW9ucworICAgKiBAcGFyYW0gd3JpdGUgdHJ1ZSB0byBzdXBwb3J0IHdyaXRlIG9wZXJhdGlvbnMKKyAgICogQHBhcmFtIG9wZW5GaWxlIHRydWUgdG8gb3BlbiB0aGUgZmlsZSBvbiBjb25zdHJ1Y3Rpb24KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgb3BlbiBmYWlscworICAgKi8KKyAgcHVibGljIFRTaW1wbGVGaWxlVHJhbnNwb3J0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlYWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3cml0ZSwgYm9vbGVhbiBvcGVuRmlsZSkKKyAgICAgICAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKHBhdGgubGVuZ3RoKCkgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vIHBhdGggc3BlY2lmaWVkIik7CisgICAgfQorICAgIGlmICghcmVhZCAmJiAhd3JpdGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOZWl0aGVyIFJFQUQgbm9yIFdSSVRFIHNwZWNpZmllZCIpOworICAgIH0KKyAgICByZWFkYWJsZSA9IHJlYWQ7CisgICAgd3JpdGFibGUgPSB3cml0ZTsKKyAgICBwYXRoXyA9IHBhdGg7CisgICAgaWYgKG9wZW5GaWxlKSB7CisgICAgICBvcGVuKCk7CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlIGEgdHJhbnNwb3J0IGJhY2tlZCBieSBhIHNpbXBsZSBmaWxlIAorICAgKiBJbXBsaWNpdGx5IG9wZW5zIGZpbGUgdG8gY29uZm9ybSB0byBDKysgYmVoYXZpb3IuCisgICAqIAorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAcGFyYW0gcmVhZCB0cnVlIHRvIHN1cHBvcnQgcmVhZCBvcGVyYXRpb25zCisgICAqIEBwYXJhbSB3cml0ZSB0cnVlIHRvIHN1cHBvcnQgd3JpdGUgb3BlcmF0aW9ucworICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVhZCwgYm9vbGVhbiB3cml0ZSkKKyAgICAgICAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhpcyhwYXRoLCByZWFkLCB3cml0ZSwgdHJ1ZSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIHJlYWQgb25seSBkaXNrIGZpbGUgKGltcGxpY2l0bHkgb3BlbnMKKyAgICogZmlsZSkKKyAgICoKKyAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gb3Blbi9jcmVhdGUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgb3BlbiBmYWlscworICAgKi8KKyAgcHVibGljIFRTaW1wbGVGaWxlVHJhbnNwb3J0KFN0cmluZyBwYXRoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhpcyhwYXRoLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvKioKKyAgICogVGVzdCBmaWxlIHN0YXR1cworICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgb3Blbiwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiAoZmlsZSAhPSBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBPcGVuIGZpbGUgaWYgbm90IHByZXZpb3VzbHkgb3BlbmVkLiAKKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW4gZmFpbHMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmIChmaWxlID09IG51bGwpeworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIGFjY2VzcyA9ICJyIjsgICAgICAgLy9SYW5kb21BY2Nlc3NGaWxlIG9iamVjdHMgbXVzdCBiZSByZWFkYWJsZQorICAgICAgICBpZiAod3JpdGFibGUpIHsKKyAgICAgICAgICBhY2Nlc3MgKz0gInciOworICAgICAgICB9CisgICAgICAgIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwYXRoXywgYWNjZXNzKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICBmaWxlID0gbnVsbDsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICB9ICAgICAgCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENsb3NlIGZpbGUsIHN1YnNlcXVlbnQgcmVhZC93cml0ZSBhY3Rpdml0eSB3aWxsIHRocm93IGV4Y2VwdGlvbnMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBmaWxlLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAvL05vdGhpbmcgdG8gZG8KKyAgICAgIH0KKyAgICAgIGZpbGUgPSBudWxsOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWFkIHVwIHRvIGxlbiBtYW55IGJ5dGVzIGludG8gYnVmIGF0IG9mZnNldCAKKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBob3VzZXMgYnl0ZXMgcmVhZAorICAgKiBAcGFyYW0gb2ZmIG9mZnNldCBpbnRvIGJ1ZmYgdG8gYmVnaW4gd3JpdGluZyB0bworICAgKiBAcGFyYW0gbGVuIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb24gcmVhZCBmYWlsdXJlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIXJlYWRhYmxlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVhZCBvcGVyYXRpb24gb24gd3JpdGUgb25seSBmaWxlIik7CisgICAgfQorICAgIGludCBpQnl0ZXNSZWFkID0gMDsKKyAgICB0cnkgeworICAgICAgaUJ5dGVzUmVhZCA9IGZpbGUucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGZpbGUgPSBudWxsOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiBpQnl0ZXNSZWFkOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGxlbiBtYW55IGJ5dGVzIGZyb20gYnVmZiBzdGFydGluZyBhdCBvZmZzZXQgCisgICAqCisgICAqIEBwYXJhbSBidWYgYnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXMgdG8gd3JpdGUKKyAgICogQHBhcmFtIG9mZiBvZmZzZXQgaW50byBidWZmZXIgdG8gYmVnaW4gd3JpdGluZyBmcm9tCisgICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvbiB3cml0ZSBmYWlsdXJlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBmaWxlLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgZmlsZSA9IG51bGw7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTW92ZSBmaWxlIHBvaW50ZXIgdG8gc3BlY2lmaWVkIG9mZnNldCwgbmV3IHJlYWQvd3JpdGUgY2FsbHMgd2lsbCBhY3QgaGVyZQorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0IGJ5dGVzIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgdG8gbW92ZSBwb2ludGVyIHRvCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBzZWVrIGZhaWxzCisgICAqLworICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbGUuc2VlayhvZmZzZXQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBhY2Nlc3MgZmFpbHMKKyAgICovCisgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybiBjdXJyZW50IGZpbGUgcG9pbnRlciBwb3NpdGlvbiBpbiBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBmaWxlCisgICAqCisgICAqIEByZXR1cm4gZmlsZSBwb2ludGVyIHBvc2l0aW9uCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIGFjY2VzcyBmYWlscworICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQppbmRleCA2ZGQ5ZWZhLi5iMjBiMzJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQpAQCAtMTksMTQgKzE5LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIC8qKgogICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCiAgKgpAQCAtMzgsMjIgKzQwLDI3IEBACiAgIC8qKgogICAgKiBXcmFwcGVkIFNvY2tldCBvYmplY3QKICAgICovCi0gIHByaXZhdGUgU29ja2V0IHNvY2tldF8gPSBudWxsOworICBwcml2YXRlIFNvY2tldCBzb2NrZXRfOwogCiAgIC8qKgogICAgKiBSZW1vdGUgaG9zdAogICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgaG9zdF8gID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgaG9zdF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBwb3J0CiAgICAqLwotICBwcml2YXRlIGludCBwb3J0XyA9IDA7CisgIHByaXZhdGUgaW50IHBvcnRfOwogCiAgIC8qKgotICAgKiBTb2NrZXQgdGltZW91dAorICAgKiBTb2NrZXQgdGltZW91dCAtIHJlYWQgdGltZW91dCBvbiB0aGUgc29ja2V0CiAgICAqLwotICBwcml2YXRlIGludCB0aW1lb3V0XyA9IDA7CisgIHByaXZhdGUgaW50IHNvY2tldFRpbWVvdXRfOworCisgIC8qKgorICAgKiBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0XzsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQgc29ja2V0LgpAQCAtNjYsMTQgKzczLDE1IEBACiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgICAgc29ja2V0Xy5zZXRLZWVwQWxpdmUodHJ1ZSk7CiAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KSB7CiAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KIAogICAgIGlmIChpc09wZW4oKSkgewogICAgICAgdHJ5IHsKLSAgICAgICAgaW5wdXRTdHJlYW1fID0gc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBvdXRwdXRTdHJlYW1fID0gc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgICBjbG9zZSgpOwogICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwpAQCAtOTgsMTIgKzEwNiwyNyBAQAogICAgKgogICAgKiBAcGFyYW0gaG9zdCAgICBSZW1vdGUgaG9zdAogICAgKiBAcGFyYW0gcG9ydCAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dAorICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0CiAgICAqLwogICBwdWJsaWMgVFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KSB7CisgICAgdGhpcyhob3N0LCBwb3J0LCB0aW1lb3V0LCB0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydCwgd2l0aCBhIHNwZWNpZmljIGNvbm5lY3Rpb24gdGltZW91dCBhbmQgYQorICAgKiBzcGVjaWZpYyBzb2NrZXQgdGltZW91dC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgICAgICAgICAgICBSZW1vdGUgaG9zdAorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICAgIFJlbW90ZSBwb3J0CisgICAqIEBwYXJhbSBzb2NrZXRUaW1lb3V0ICAgU29ja2V0IHRpbWVvdXQKKyAgICogQHBhcmFtIGNvbm5lY3RUaW1lb3V0ICBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHB1YmxpYyBUU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHNvY2tldFRpbWVvdXQsIGludCBjb25uZWN0VGltZW91dCkgewogICAgIGhvc3RfID0gaG9zdDsKICAgICBwb3J0XyA9IHBvcnQ7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OworICAgIHNvY2tldFRpbWVvdXRfID0gc29ja2V0VGltZW91dDsKKyAgICBjb25uZWN0VGltZW91dF8gPSBjb25uZWN0VGltZW91dDsKICAgICBpbml0U29ja2V0KCk7CiAgIH0KIApAQCAtMTE1LDE5ICsxMzgsMzkgQEAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0gICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0Xyk7CisgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKKyAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHNvY2tldFRpbWVvdXRfKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi5lcnJvcigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgorICAgKiBTZXRzIHRoZSBzb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBNaWxsaXNlY29uZHMgdGltZW91dAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIHRoaXMuc2V0Q29ubmVjdFRpbWVvdXQodGltZW91dCk7CisgICAgdGhpcy5zZXRTb2NrZXRUaW1lb3V0KHRpbWVvdXQpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIHRpbWUgb3V0CisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIGNvbm5lY3RUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICAvKioKICAgICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKICAgICoKICAgICogQHBhcmFtIHRpbWVvdXQgTWlsbGlzZWNvbmRzIHRpbWVvdXQKICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgIHB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBzb2NrZXRUaW1lb3V0XyA9IHRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHRpbWVvdXQpOwogICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewpAQCAtMTYzLDExICsyMDYsMTEgQEAKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpOwogICAgIH0KIAotICAgIGlmIChob3N0Xy5sZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGhvc3RfID09IG51bGwgfHwgaG9zdF8ubGVuZ3RoKCkgPT0gMCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iKTsKICAgICB9Ci0gICAgaWYgKHBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQuIik7CisgICAgaWYgKHBvcnRfIDw9IDAgfHwgcG9ydF8gPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkludmFsaWQgcG9ydCAiICsgcG9ydF8pOwogICAgIH0KIAogICAgIGlmIChzb2NrZXRfID09IG51bGwpIHsKQEAgLTE3NSw5ICsyMTgsOSBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RfLCBwb3J0XyksIHRpbWVvdXRfKTsKLSAgICAgIGlucHV0U3RyZWFtXyA9IHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIG91dHB1dFN0cmVhbV8gPSBzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCBjb25uZWN0VGltZW91dF8pOworICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKaW5kZXggYzQwODZiYS4uNzNhZDczMCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEKQEAgLTE5LDEyICsxOSwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworCiAvKioKICAqIEdlbmVyaWMgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllci4gVGhpcyBpcyBiYXNpY2FsbHkgYSB0aGluCiAgKiB3cmFwcGVyIGFyb3VuZCB0aGUgY29tYmluZWQgZnVuY3Rpb25hbGl0eSBvZiBKYXZhIGlucHV0L291dHB1dCBzdHJlYW1zLgogICoKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgaW1wbGVtZW50cyBDbG9zZWFibGUgewogCiAgIC8qKgogICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgpAQCAtNTYsNyArNTgsNyBAQAogICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbG9zZSgpOwogCiAgIC8qKgotICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgaW50byBidWZmZXIgYnVmLCBzdGFydGluZyBhdHQgb2Zmc2V0IG9mZi4KKyAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXQgb2Zmc2V0IG9mZi4KICAgICoKICAgICogQHBhcmFtIGJ1ZiBBcnJheSB0byByZWFkIGludG8KICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CkBAIC0xMjcsNyArMTI5LDcgQEAKICAgLyoqCiAgICAqIEFjY2VzcyB0aGUgcHJvdG9jb2wncyB1bmRlcmx5aW5nIGJ1ZmZlciBkaXJlY3RseS4gSWYgdGhpcyBpcyBub3QgYQogICAgKiBidWZmZXJlZCB0cmFuc3BvcnQsIHJldHVybiBudWxsLgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gcHJvdG9jb2wncyBVbmRlcmx5aW5nIGJ1ZmZlcgogICAgKi8KICAgcHVibGljIGJ5dGVbXSBnZXRCdWZmZXIoKSB7CiAgICAgcmV0dXJuIG51bGw7CkBAIC0xMzYsNyArMTM4LDggQEAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgaW5kZXggd2l0aGluIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciB0aGF0IHNwZWNpZmllcyB0aGUgbmV4dCBzcG90CiAgICAqIHRoYXQgc2hvdWxkIGJlIHJlYWQgZnJvbS4KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIGluZGV4IHdpdGhpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5leHQgc3BvdAorICAgKiB0aGF0IHNob3VsZCBiZSByZWFkIGZyb20KICAgICovCiAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyUG9zaXRpb24oKSB7CiAgICAgcmV0dXJuIDA7CkBAIC0xNDUsNyArMTQ4LDggQEAKICAgLyoqCiAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgdW5kZXJseWluZyBidWZmZXIuIFJldHVybnMgLTEgaWYKICAgICogdGhpcyBpcyBhIG5vbi1idWZmZXJlZCB0cmFuc3BvcnQuCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgdW5kZXJseWluZyBidWZmZXIuIDxicj4gUmV0dXJucyAtMSBpZgorICAgKiB0aGlzIGlzIGEgbm9uLWJ1ZmZlcmVkIHRyYW5zcG9ydC4KICAgICovCiAgIHB1YmxpYyBpbnQgZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpIHsKICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCmluZGV4IGQwOGYzYjAuLmI4ODZiYzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUkVBRFlfT1BFTiA9IDI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVEX09VVCA9IDM7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9GSUxFID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09SUlVQVEVEX0RBVEEgPSA1OwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1NWFhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOworCisvKioKKyAqIFRabGliVHJhbnNwb3J0IGRlZmxhdGVzIG9uIHdyaXRlIGFuZCBpbmZsYXRlcyBvbiByZWFkLgorICovCitwdWJsaWMgY2xhc3MgVFpsaWJUcmFuc3BvcnQgZXh0ZW5kcyBUSU9TdHJlYW1UcmFuc3BvcnQgeworCisgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydF8gPSBudWxsOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBwdWJsaWMgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCBiYXNlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRabGliVHJhbnNwb3J0KGJhc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBUWmxpYlRyYW5zcG9ydCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gIHRyYW5zcG9ydCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0bworICAgICAqLworICAgIHB1YmxpYyBUWmxpYlRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzKHRyYW5zcG9ydCwgRGVmbGF0ZXIuQkVTVF9DT01QUkVTU0lPTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBUWmxpYlRyYW5zcG9ydCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gIHRyYW5zcG9ydCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0bworICAgICAqIEBwYXJhbSAgY29tcHJlc3Npb25MZXZlbCAwIGZvciBubyBjb21wcmVzc2lvbiwgOSBmb3IgbWF4aW11bSBjb21wcmVzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBUWmxpYlRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGNvbXByZXNzaW9uTGV2ZWwpIHsKKyAgICAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEluZmxhdGVySW5wdXRTdHJlYW0obmV3IFRUcmFuc3BvcnRJbnB1dFN0cmVhbSh0cmFuc3BvcnRfKSwgbmV3IEluZmxhdGVyKCkpOworICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IERlZmxhdGVyT3V0cHV0U3RyZWFtKG5ldyBUVHJhbnNwb3J0T3V0cHV0U3RyZWFtKHRyYW5zcG9ydF8pLCBuZXcgRGVmbGF0ZXIoY29tcHJlc3Npb25MZXZlbCwgZmFsc2UpLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgICAgIHJldHVybiB0cmFuc3BvcnRfLmlzT3BlbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgICAgIHRyYW5zcG9ydF8ub3BlbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICBpZiAodHJhbnNwb3J0Xy5pc09wZW4oKSkgeworICAgICAgICAgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBUVHJhbnNwb3J0SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKKworICAgIHB1YmxpYyBUVHJhbnNwb3J0SW5wdXRTdHJlYW0oVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5yZWFkKGJ1ZiwgMCwgMSk7CisgICAgICAgICAgICByZXR1cm4gYnVmWzBdOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBUVHJhbnNwb3J0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgcHVibGljIFRUcmFuc3BvcnRPdXRwdXRTdHJlYW0oVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc3BvcnQud3JpdGUobmV3IGJ5dGVbXXsoYnl0ZSkgYn0pOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlIGIvbGliL2phdmEvdGVzdC8ua2V5c3RvcmUKaW5kZXggMGM4NTExMS4uNGRkNjZhYyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC8ua2V5c3RvcmUKKysrIGIvbGliL2phdmEvdGVzdC8ua2V5c3RvcmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSBiL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUKaW5kZXggYzI0YjRhMi4uMjZmYmQxOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQorKysgYi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcyBiL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcwppbmRleCA4NzhiMmZjLi5hYjliZWJhIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMKKysrIGIvbGliL2phdmEvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0xLDYgKzEsNiBAQAogIyBsb2c0aiBjb25maWd1cmF0aW9uIHVzZWQgZHVyaW5nIGJ1aWxkIGFuZCB1bml0IHRlc3RzCiBsb2c0ai5yb290TG9nZ2VyPWRlYnVnLHN0ZG91dAotbG9nNGoudGhyZXNoaG9sZD1BTEwKK2xvZzRqLnRocmVzaG9sZD1BTEwKIGxvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgogbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKIGxvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCAlY3syfSAoJUY6JU0oJUwpKSAtICVtJW4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQppbmRleCBkNzU5YmIwLi42MWY0MGE1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCkBAIC0xNywxMCArMTcsMTAgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zNyw5NCArMzcsMzA0IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmVzdGluZyBuZXN0aW5nOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIEhvbHlNb2xleSBob2x5TW9sZXk7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCBjb21wYWN0UHJvdG9UZXN0U3RydWN0OwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGtVbmljb2RlQnl0ZXMgPSB7Ci0gICAgKGJ5dGUpMHhkMywgKGJ5dGUpMHg4MCwgKGJ5dGUpMHhlMiwgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhhZSwgKGJ5dGUpMHhjZSwKLSAgICAoYnl0ZSkweDlkLCAoYnl0ZSkweDIwLCAoYnl0ZSkweGQwLCAoYnl0ZSkweDlkLCAoYnl0ZSkweGNlLCAoYnl0ZSkweGJmLAotICAgIChieXRlKTB4ZTIsIChieXRlKTB4ODUsIChieXRlKTB4YmYsIChieXRlKTB4ZDAsIChieXRlKTB4YmUsIChieXRlKTB4YzksCi0gICAgKGJ5dGUpMHhhMSwgKGJ5dGUpMHhkMCwgKGJ5dGUpMHhiMywgKGJ5dGUpMHhkMCwgKGJ5dGUpMHhiMCwgKGJ5dGUpMHhjZiwKLSAgICAoYnl0ZSkweDgxLCAoYnl0ZSkweGUyLCAoYnl0ZSkweDg0LCAoYnl0ZSkweDhlLCAoYnl0ZSkweDIwLCAoYnl0ZSkweGNlLAotICAgIChieXRlKTB4OTEsIChieXRlKTB4NzQsIChieXRlKTB4NzQsIChieXRlKTB4Y2UsIChieXRlKTB4YjEsIChieXRlKTB4ZTIsCi0gICAgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhiZCwgKGJ5dGUpMHhjZSwgKGJ5dGUpMHhiYSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhlMiwKLSAgICAoYnl0ZSkweDgwLCAoYnl0ZSkweGJjCi0gIH07CisKKyAgLy8gVGhlc2UgYnl0ZSBhcnJheXMgYXJlIHNlcmlhbGl6ZWQgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIHN0cnVjdHMuCisgIC8vIFRoZXkgd2VyZSBzZXJpYWxpemVkIGluIGJpbmFyeSBwcm90b2NvbCB1c2luZyB0aHJpZnQgMC42LnggYW5kIGFyZSB1c2VkIHRvCisgIC8vIHRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFuZGFyZCBzY2hlbWUuCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc09uZU9mRWFjaCA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHhENiwKKyAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsCisgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsCisgICAgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwKKyAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsCisgICAgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLAorICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwKKyAgICAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAgfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzTmVzdGluZyA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHg3QSwgKGJ5dGUpIDB4NjksIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MTMsCisgICAgKGJ5dGUpIDB4NDksIChieXRlKSAweDIwLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NkQsIChieXRlKSAweDIwLAorICAgIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDZGLCAoYnl0ZSkgMHg2RSwKKyAgICAoYnl0ZSkgMHg2QiwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDJFLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4MjAsCisgICAgKGJ5dGUpIDB4NzgsIChieXRlKSAweDZGLCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4MjEsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweEQ2LAorICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg3OCwKKyAgICAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHg2NSwKKyAgICAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDcsIChieXRlKSAweDQwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MjEsIChieXRlKSAweEZCLAorICAgIChieXRlKSAweDU0LCAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4MkQsIChieXRlKSAweDE4LCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MEQsIChieXRlKSAweDRBLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NEYsIChieXRlKSAweDRFLAorICAgIChieXRlKSAweDIwLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg1MywKKyAgICAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIyLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDJFLCAoYnl0ZSkgMHhEMywgKGJ5dGUpIDB4ODAsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhBRSwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDlELCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4RDAsCisgICAgKGJ5dGUpIDB4OUQsIChieXRlKSAweENFLCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LAorICAgIChieXRlKSAweEJGLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QkUsIChieXRlKSAweEM5LCAoYnl0ZSkgMHhBMSwKKyAgICAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjMsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4Q0YsCisgICAgKGJ5dGUpIDB4ODEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4OEUsIChieXRlKSAweDIwLAorICAgIChieXRlKSAweENFLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc0LCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHhCMSwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QkEsIChieXRlKSAweEVGLCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4QkQsIChieXRlKSAweEUyLAorICAgIChieXRlKSAweDgwLCAoYnl0ZSkgMHhCQywgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYxLAorICAgIChieXRlKSAweDczLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM0LCAoYnl0ZSkgMHgwRiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBGLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAgfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzSG9seU1vbGV5ID0gbmV3IGJ5dGVbXSB7IChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDIzLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDY5LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA1LCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwKKyAgICAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MjEsIChieXRlKSAweEZCLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsCisgICAgKGJ5dGUpIDB4MkQsIChieXRlKSAweDE4LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwKKyAgICAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4NEYsIChieXRlKSAweDRFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsCisgICAgKGJ5dGUpIDB4NDgsIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLAorICAgIChieXRlKSAweDIyLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsCisgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLAorICAgIChieXRlKSAweDlELCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4RDAsIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsCisgICAgKGJ5dGUpIDB4QkUsIChieXRlKSAweEM5LCAoYnl0ZSkgMHhBMSwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLAorICAgIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4Q0YsIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4NCwgKGJ5dGUpIDB4OEUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc0LCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLAorICAgIChieXRlKSAweDg1LCAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwKKyAgICAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4QkQsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsCisgICAgKGJ5dGUpIDB4MzYsIChieXRlKSAweDM0LCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLAorICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MEQsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsCisgICAgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4RDYsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsCisgICAgKGJ5dGUpIDB4NjksIChieXRlKSAweDc4LCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA1LAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDY1LCAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDcsIChieXRlKSAweDQwLCAoYnl0ZSkgMHgwOSwKKyAgICAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4RkIsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg0NCwgKGJ5dGUpIDB4MkQsCisgICAgKGJ5dGUpIDB4MTgsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEQsIChieXRlKSAweDRBLCAoYnl0ZSkgMHg1MywKKyAgICAoYnl0ZSkgMHg0RiwgKGJ5dGUpIDB4NEUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDgsCisgICAgKGJ5dGUpIDB4NDksIChieXRlKSAweDUzLCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDIyLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDJFLCAoYnl0ZSkgMHhEMywgKGJ5dGUpIDB4ODAsCisgICAgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhBRSwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDlELAorICAgIChieXRlKSAweDIwLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4OUQsIChieXRlKSAweENFLCAoYnl0ZSkgMHhCRiwKKyAgICAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QkUsCisgICAgKGJ5dGUpIDB4QzksIChieXRlKSAweEExLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjMsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweEIwLCAoYnl0ZSkgMHhDRiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NCwKKyAgICAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4NzQsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweENFLCAoYnl0ZSkgMHhCMSwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LAorICAgIChieXRlKSAweEJELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkEsIChieXRlKSAweEVGLCAoYnl0ZSkgMHhCRiwKKyAgICAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDgwLCAoYnl0ZSkgMHhCQywgKGJ5dGUpIDB4MDIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDczLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MzYsCisgICAgKGJ5dGUpIDB4MzQsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEQsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRSwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBGLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjgsIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2RSwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4NjUsIChieXRlKSAweDJDLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc3LAorICAgIChieXRlKSAweDZGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjgsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjUsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LAorICAgIChieXRlKSAweDQ2LCAoYnl0ZSkgMHg0RiwgKGJ5dGUpIDB4NTUsIChieXRlKSAweDUyLCAoYnl0ZSkgMHgyMSwKKyAgICAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA5LAorICAgIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4NjQsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg2MSwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NkYsIChieXRlKSAweDZFLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDZFLAorICAgIChieXRlKSAweDY0LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHg3NCwKKyAgICAoYnl0ZSkgMHg3NywgKGJ5dGUpIDB4NkYsIChieXRlKSAweDBELCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzcsIChieXRlKSAweDZGLCAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA1LCAoYnl0ZSkgMHg1NywgKGJ5dGUpIDB4NjEsIChieXRlKSAweDY5LAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsCisgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2MSwKKyAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4M0YsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA1LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NjgsIChieXRlKSAweDcyLAorICAgIChieXRlKSAweDY1LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDdBLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDZGLAorICAgIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBrVW5pY29kZUJ5dGVzID0geyAoYnl0ZSkgMHhkMywgKGJ5dGUpIDB4ODAsCisgICAgICAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweGFlLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4OWQsCisgICAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweDlkLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4YmYsCisgICAgICAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweGJmLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4YmUsCisgICAgICAoYnl0ZSkgMHhjOSwgKGJ5dGUpIDB4YTEsIChieXRlKSAweGQwLCAoYnl0ZSkgMHhiMywgKGJ5dGUpIDB4ZDAsCisgICAgICAoYnl0ZSkgMHhiMCwgKGJ5dGUpIDB4Y2YsIChieXRlKSAweDgxLCAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ODQsCisgICAgICAoYnl0ZSkgMHg4ZSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweGNlLCAoYnl0ZSkgMHg5MSwgKGJ5dGUpIDB4NzQsCisgICAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGIxLCAoYnl0ZSkgMHhlMiwgKGJ5dGUpIDB4ODUsCisgICAgICAoYnl0ZSkgMHhiZCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGJhLCAoYnl0ZSkgMHg4MywgKGJ5dGUpIDB4ZTIsCisgICAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4YmMgfTsKIAogICBzdGF0aWMgewogICAgIHRyeSB7CiAgICAgICBvbmVPZkVhY2ggPSBuZXcgT25lT2ZFYWNoKCk7Ci0gICAgICBvbmVPZkVhY2guaW1fdHJ1ZSA9IHRydWU7Ci0gICAgICBvbmVPZkVhY2guaW1fZmFsc2UgPSBmYWxzZTsKLSAgICAgIG9uZU9mRWFjaC5hX2JpdGUgPSAoYnl0ZSkgMHhkNjsKLSAgICAgIG9uZU9mRWFjaC5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgICAgIG9uZU9mRWFjaC5pbnRlZ2VyMzIgPSAxIDw8IDI0OwotICAgICAgb25lT2ZFYWNoLmludGVnZXI2NCA9IChsb25nKSA2MDAwICogMTAwMCAqIDEwMDA7Ci0gICAgICBvbmVPZkVhY2guZG91YmxlX3ByZWNpc2lvbiA9IE1hdGguUEk7Ci0gICAgICBvbmVPZkVhY2guc29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7Ci0gICAgICBvbmVPZkVhY2guem9tZ191bmljb2RlID0gbmV3IFN0cmluZyhrVW5pY29kZUJ5dGVzLCAiVVRGLTgiKTsKLSAgICAgIG9uZU9mRWFjaC5iYXNlNjQgPSBCeXRlQnVmZmVyLndyYXAoImJhc2U2NCIuZ2V0Qnl0ZXMoKSk7CisgICAgICBvbmVPZkVhY2guc2V0SW1fdHJ1ZSh0cnVlKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRJbV9mYWxzZShmYWxzZSk7CisgICAgICBvbmVPZkVhY2guc2V0QV9iaXRlKChieXRlKSAweGQ2KTsKKyAgICAgIG9uZU9mRWFjaC5zZXRJbnRlZ2VyMTYoKHNob3J0KSAyNzAwMCk7CisgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjMyKDEgPDwgMjQpOworICAgICAgb25lT2ZFYWNoLnNldEludGVnZXI2NCgobG9uZykgNjAwMCAqIDEwMDAgKiAxMDAwKTsKKyAgICAgIG9uZU9mRWFjaC5zZXREb3VibGVfcHJlY2lzaW9uKE1hdGguUEkpOworICAgICAgb25lT2ZFYWNoLnNldFNvbWVfY2hhcmFjdGVycygiSlNPTiBUSElTISBcIlwxIik7CisgICAgICBvbmVPZkVhY2guc2V0Wm9tZ191bmljb2RlKG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgb25lT2ZFYWNoLnNldEJhc2U2NChCeXRlQnVmZmVyLndyYXAoImJhc2U2NCIuZ2V0Qnl0ZXMoKSkpOwogICAgICAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgogCiAgICAgICBCb25rIGJvbmsgPSBuZXcgQm9uaygpOwotICAgICAgYm9uay50eXBlID0gMzEzMzc7Ci0gICAgICBib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7CisgICAgICBib25rLnNldFR5cGUoMzEzMzcpOworICAgICAgYm9uay5zZXRNZXNzYWdlKCJJIGFtIGEgYm9uay4uLiB4b3IhIik7CiAgICAgICBuZXN0aW5nID0gbmV3IE5lc3RpbmcoYm9uaywgb25lT2ZFYWNoKTsKIAogICAgICAgaG9seU1vbGV5ID0gbmV3IEhvbHlNb2xleSgpOwotICAgICAgaG9seU1vbGV5LmJpZyA9IG5ldyBBcnJheUxpc3Q8T25lT2ZFYWNoPigpOwotICAgICAgaG9seU1vbGV5LmJpZy5hZGQobmV3IE9uZU9mRWFjaChvbmVPZkVhY2gpKTsKLSAgICAgIGhvbHlNb2xleS5iaWcuYWRkKG5lc3RpbmcubXlfb29lKTsKLSAgICAgIGhvbHlNb2xleS5iaWcuZ2V0KDApLmFfYml0ZSA9IChieXRlKSAweDIyOwotICAgICAgaG9seU1vbGV5LmJpZy5nZXQoMSkuYV9iaXRlID0gKGJ5dGUpIDB4MjM7CisgICAgICBMaXN0PE9uZU9mRWFjaD4gYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CisgICAgICBiaWcuYWRkKG5ldyBPbmVPZkVhY2gob25lT2ZFYWNoKSk7CisgICAgICBiaWcuYWRkKG5lc3RpbmcubXlfb29lKTsKKyAgICAgIGhvbHlNb2xleS5zZXRCaWcoYmlnKTsKKyAgICAgIGhvbHlNb2xleS5nZXRCaWcoKS5nZXQoMCkuc2V0QV9iaXRlKChieXRlKSAweDIyKTsKKyAgICAgIGhvbHlNb2xleS5nZXRCaWcoKS5nZXQoMCkuc2V0QV9iaXRlKChieXRlKSAweDIzKTsKIAotICAgICAgaG9seU1vbGV5LmNvbnRhaW4gPSBuZXcgSGFzaFNldDxMaXN0PFN0cmluZz4+KCk7CisgICAgICBob2x5TW9sZXkuc2V0Q29udGFpbihuZXcgSGFzaFNldDxMaXN0PFN0cmluZz4+KCkpOwogICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3RhZ2UxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDIpOwogICAgICAgc3RhZ2UxLmFkZCgiYW5kIGEgb25lIik7CiAgICAgICBzdGFnZTEuYWRkKCJhbmQgYSB0d28iKTsKLSAgICAgIGhvbHlNb2xleS5jb250YWluLmFkZChzdGFnZTEpOworICAgICAgaG9seU1vbGV5LmdldENvbnRhaW4oKS5hZGQoc3RhZ2UxKTsKICAgICAgIHN0YWdlMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKICAgICAgIHN0YWdlMS5hZGQoInRoZW4gYSBvbmUsIHR3byIpOwogICAgICAgc3RhZ2UxLmFkZCgidGhyZWUhIik7CiAgICAgICBzdGFnZTEuYWRkKCJGT1VSISEiKTsKLSAgICAgIGhvbHlNb2xleS5jb250YWluLmFkZChzdGFnZTEpOworICAgICAgaG9seU1vbGV5LmdldENvbnRhaW4oKS5hZGQoc3RhZ2UxKTsKICAgICAgIHN0YWdlMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigwKTsKLSAgICAgIGhvbHlNb2xleS5jb250YWluLmFkZChzdGFnZTEpOworICAgICAgaG9seU1vbGV5LmdldENvbnRhaW4oKS5hZGQoc3RhZ2UxKTsKIAogICAgICAgQXJyYXlMaXN0PEJvbms+IHN0YWdlMiA9IG5ldyBBcnJheUxpc3Q8Qm9uaz4oKTsKLSAgICAgIGhvbHlNb2xleS5ib25rcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxCb25rPj4oKTsKKyAgICAgIGhvbHlNb2xleS5zZXRCb25rcyhuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Qm9uaz4+KCkpOwogICAgICAgLy8gb25lIGVtcHR5Ci0gICAgICBob2x5TW9sZXkuYm9ua3MucHV0KCJ6ZXJvIiwgc3RhZ2UyKTsKLSAgICAgIAorICAgICAgaG9seU1vbGV5LmdldEJvbmtzKCkucHV0KCJ6ZXJvIiwgc3RhZ2UyKTsKKwogICAgICAgLy8gb25lIHdpdGggdHdvCiAgICAgICBzdGFnZTIgPSBuZXcgQXJyYXlMaXN0PEJvbms+KCk7CiAgICAgICBCb25rIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gMTsKLSAgICAgIGIubWVzc2FnZSA9ICJXYWl0LiI7CisgICAgICBiLnNldFR5cGUoMSk7CisgICAgICBiLnNldE1lc3NhZ2UoIldhaXQuIik7CiAgICAgICBzdGFnZTIuYWRkKGIpOwogICAgICAgYiA9IG5ldyBCb25rKCk7Ci0gICAgICBiLnR5cGUgPSAyOwotICAgICAgYi5tZXNzYWdlID0gIldoYXQ/IjsKLSAgICAgIHN0YWdlMi5hZGQoYik7ICAgICAgCi0gICAgICBob2x5TW9sZXkuYm9ua3MucHV0KCJ0d28iLCBzdGFnZTIpOwotICAgICAgCisgICAgICBiLnNldFR5cGUoMik7CisgICAgICBiLnNldE1lc3NhZ2UoIldoYXQ/Iik7CisgICAgICBzdGFnZTIuYWRkKGIpOworICAgICAgaG9seU1vbGV5LmdldEJvbmtzKCkucHV0KCJ0d28iLCBzdGFnZTIpOworCiAgICAgICAvLyBvbmUgd2l0aCB0aHJlZQogICAgICAgc3RhZ2UyID0gbmV3IEFycmF5TGlzdDxCb25rPigpOwogICAgICAgYiA9IG5ldyBCb25rKCk7Ci0gICAgICBiLnR5cGUgPSAzOwotICAgICAgYi5tZXNzYWdlID0gInF1b3RoIjsKKyAgICAgIGIuc2V0VHlwZSgzKTsKKyAgICAgIGIuc2V0TWVzc2FnZSgicXVvdGgiKTsKICAgICAgIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gNDsKLSAgICAgIGIubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOworICAgICAgYi5zZXRUeXBlKDQpOworICAgICAgYi5zZXRNZXNzYWdlKCJ0aGUgcmF2ZW4iKTsKICAgICAgIGIgPSBuZXcgQm9uaygpOwotICAgICAgYi50eXBlID0gNTsKLSAgICAgIGIubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICAgICAgaG9seU1vbGV5LmJvbmtzLnB1dCgidGhyZWUiLCBzdGFnZTIpOworICAgICAgYi5zZXRUeXBlKDUpOworICAgICAgYi5zZXRNZXNzYWdlKCJuZXZlcm1vcmUiKTsKKyAgICAgIGhvbHlNb2xleS5nZXRCb25rcygpLnB1dCgidGhyZWUiLCBzdGFnZTIpOwogCiAgICAgICAvLyBzdXBlcmh1Z2UgY29tcGFjdCBwcm90byB0ZXN0IHN0cnVjdAotICAgICAgY29tcGFjdFByb3RvVGVzdFN0cnVjdCA9IG5ldyBDb21wYWN0UHJvdG9UZXN0U3RydWN0KHRocmlmdC50ZXN0LkNvbnN0YW50cy5DT01QQUNUX1RFU1QpOwotICAgICAgY29tcGFjdFByb3RvVGVzdFN0cnVjdC5hX2JpbmFyeSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezAsMSwyLDMsNCw1LDYsNyw4fSk7CisgICAgICBjb21wYWN0UHJvdG9UZXN0U3RydWN0ID0gbmV3IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgdGhyaWZ0LnRlc3QuRGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNUKTsKKyAgICAgIGNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Quc2V0QV9iaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyAwLCAxLCAyLAorICAgICAgICAgIDMsIDQsIDUsIDYsIDcsIDggfSkpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICB9CiAgIH0KLSAgCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FmYWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHRocmlmdC50ZXN0LkRlZXBDb3B5QmFyOworaW1wb3J0IHRocmlmdC50ZXN0LkRlZXBDb3B5Rm9vOworCitwdWJsaWMgY2xhc3MgVGVzdERlZXBDb3B5IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3REZWVwQ29weSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIERlZXBDb3B5Rm9vIGZvbyA9IG5ldyBEZWVwQ29weUZvbygpOworCisgICAgZm9vLmFkZFRvTChuZXcgRGVlcENvcHlCYXIoKSk7CisgICAgZm9vLmFkZFRvUyhuZXcgRGVlcENvcHlCYXIoKSk7CisgICAgZm9vLnB1dFRvTSgidGVzdCAzIiwgbmV3IERlZXBDb3B5QmFyKCkpOworCisgICAgZm9vLmFkZFRvTGkobmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKyAgICBmb28uYWRkVG9TaShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworICAgIGZvby5wdXRUb01pKCJ0ZXN0IDMiLCBuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworCisgICAgZm9vLnNldEJhcihuZXcgRGVlcENvcHlCYXIoKSk7CisKKyAgICBmaW5hbCBEZWVwQ29weUZvbyBkZWVwQ29weUZvbyA9IGZvby5kZWVwQ29weSgpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0QmFyKCksIGRlZXBDb3B5Rm9vLmdldEJhcigpKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldEwoKS5nZXQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRMKCkuZ2V0KDApKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRTKCkudG9BcnJheShuZXcgRGVlcENvcHlCYXJbMF0pWzBdLCAgZGVlcENvcHlGb28uZ2V0UygpLnRvQXJyYXkobmV3IERlZXBDb3B5QmFyWzBdKVswXSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TSgpLmdldCgidGVzdCAzIiksICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldE0oKS5nZXQoInRlc3QgMyIpKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldExpKCkuZ2V0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldExpKCkuZ2V0KDApKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRTaSgpLnRvQXJyYXkobmV3IHRocmlmdC50ZXN0Lk9iamVjdFswXSlbMF0sICBkZWVwQ29weUZvby5nZXRTaSgpLnRvQXJyYXkobmV3IHRocmlmdC50ZXN0Lk9iamVjdFswXSlbMF0pOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldE1pKCkuZ2V0KCJ0ZXN0IDMiKSwgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldE1pKCkuZ2V0KCJ0ZXN0IDMiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzI0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5FbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuR29kQmVhbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5HcmVla0dvZEdvZGRlc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworcHVibGljIGNsYXNzIFRlc3RFbnVtQ29udGFpbmVycyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29udGFpbmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBHb2RCZWFuIGIxID0gbmV3IEdvZEJlYW4oKTsKKyAgICAgICAgYjEuYWRkVG9Hb2RkZXNzKEdyZWVrR29kR29kZGVzcy5IRVJBKTsKKyAgICAgICAgYjEuZ2V0R29kZGVzcygpLmFkZChHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFKTsKKyAgICAgICAgYjEucHV0VG9Qb3dlcihHcmVla0dvZEdvZGRlc3MuWkVVUywgMTAwMCk7CisgICAgICAgIGIxLmdldFBvd2VyKCkucHV0KEdyZWVrR29kR29kZGVzcy5IRVJBLCAzMzMpOworICAgICAgICBiMS5wdXRUb0J5QWxpYXMoIk1yLiBaIiwgR3JlZWtHb2RHb2RkZXNzLlpFVVMpOworICAgICAgICBiMS5hZGRUb0ltYWdlcygiQmF0aHMgb2YgQXBocm9kaXRlIDAxLmpwZWciKTsKKworICAgICAgICBmaW5hbCBHb2RCZWFuIGIyID0gbmV3IEdvZEJlYW4oYjEpOworCisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjMgPSBuZXcgR29kQmVhbigpOworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBUU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICAgICAgICBmaW5hbCBURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGIxKTsKKyAgICAgICAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShiMywgYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRHb2RkZXNzKCkgIT0gYjIuZ2V0R29kZGVzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRQb3dlcigpICE9IGIyLmdldFBvd2VyKCkpOworCisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0R29kZGVzcygpICE9IGIzLmdldEdvZGRlc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0UG93ZXIoKSAhPSBiMy5nZXRQb3dlcigpKTsKKworICAgICAgICBmb3IgKEdvZEJlYW4gZWFjaCA6IG5ldyBHb2RCZWFuW117YjEsIGIyLCBiM30pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRHb2RkZXNzKCkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLkhFUkEpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGVhY2guZ2V0R29kZGVzcygpLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5QT1NFSURPTikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEdvZGRlc3MoKSBpbnN0YW5jZW9mIEVudW1TZXQpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMDApLCBlYWNoLmdldFBvd2VyKCkuZ2V0KEdyZWVrR29kR29kZGVzcy5aRVVTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDMzMyksIGVhY2guZ2V0UG93ZXIoKS5nZXQoR3JlZWtHb2RHb2RkZXNzLkhFUkEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRQb3dlcigpIGluc3RhbmNlb2YgRW51bU1hcCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRCeUFsaWFzKCkgaW5zdGFuY2VvZiBIYXNoTWFwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRJbWFnZXMoKSBpbnN0YW5jZW9mIEhhc2hTZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVudW1Db25zdGFudHMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygibGlnaHRuaW5nIGJvbHQiLCBFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQVRUUklCVVRFUy5nZXQoR3JlZWtHb2RHb2RkZXNzLlpFVVMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQVRUUklCVVRFUyBpbnN0YW5jZW9mIEVudW1NYXApOworCisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkJFQVVUWS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFKSk7CisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkJFQVVUWSBpbnN0YW5jZW9mIEVudW1TZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5ODg5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsLk9uZU9mRWFjaFpaOworaW1wb3J0IHRocmlmdC50ZXN0LmZ1bGxjYW1lbC5VbmRlcnNjb3JlU3J2OworCisvLyBTYW5pdHkgY2hlY2sgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSAnZnVsbGNhbWVsJy4KKy8vCitwdWJsaWMgY2xhc3MgVGVzdEZ1bGxDYW1lbCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZWxDYXNlU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNlcmlhbGl6ZXIgICBiaW5hcnlTZXJpYWxpemVyICAgPSBuZXcgICBUU2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgVERlc2VyaWFsaXplciBiaW5hcnlEZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisKKyAgICBPbmVPZkVhY2haWiBvYmogPSBuZXcgT25lT2ZFYWNoWlooKTsKKyAgICBvYmouc2V0QUJpdGUoKGJ5dGUpIDB4YWUpOworICAgIG9iai5zZXRJbUZhbHNlKHRydWUpOworICAgIGJ5dGVbXSBzZXJCeXRlcyA9IGJpbmFyeVNlcmlhbGl6ZXIuc2VyaWFsaXplKG9iaik7CisgICAgYmluYXJ5RGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKG9iaiwgc2VyQnl0ZXMpOworICAgIGFzc2VydFRydWUoIG9iai5nZXRBQml0ZSgpID09IChieXRlKSAweGFlICk7CisgICAgYXNzZXJ0VHJ1ZSggb2JqLmlzSW1GYWxzZSgpID09IHRydWUgKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDYW1lbENhc2VScGNNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVW5kZXJzY29yZVNydi5JZmFjZSBzcnYgPSBuZXcgVW5kZXJzY29yZVNydi5JZmFjZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGxvbmcgc29tZVJwY0NhbGwoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIDFsOworICAgICAgfQorICAgIH07CisgICAgYXNzZXJ0VHJ1ZSgxbCA9PSBzcnYuc29tZVJwY0NhbGwoInRlc3QiKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NzZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgcHJpdmF0ZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXA7CisgIHByaXZhdGUgVFByb3RvY29sIGlwcm90OworICBwcml2YXRlIFRQcm90b2NvbCBvcHJvdDsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgaXByb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgICAgb3Byb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ01lc3NhZ2VUeXBlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4gKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgU3R1YlByb2Nlc3NvciBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBpZiAoISJmdW5jIi5lcXVhbHMobXNnLm5hbWUpIHx8IG1zZy50eXBlIT1UTWVzc2FnZVR5cGUuQ0FMTCB8fCBtc2cuc2VxaWQhPTQyKSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJpbmNvcnJlY3QgcGFyYW1ldGVycyIpOworICAgICAgfQorICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFeGlzdGluZ1NlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlclByb2Nlc3Nvcigic2VydmljZSIsIG5ldyBTdHViUHJvY2Vzc29yKCkpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgICB2ZXJpZnkob3Byb3QpLndyaXRlTWVzc2FnZUJlZ2luKGFueShUTWVzc2FnZS5jbGFzcykpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworICAgIG1wLnJlZ2lzdGVyRGVmYXVsdChuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25UeXBlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwMjg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uOworCisvLyBUZXN0cyBhbmQgZG9jdW1lbnRzIGJlaGF2aW9yIGZvciB0aGUgIk9wdGlvbjxUPiIgdHlwZQorcHVibGljIGNsYXNzIFRlc3RPcHRpb25UeXBlIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RTb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gIkNodWNrIE5vcnJpcyI7CisgICAgICAgIE9wdGlvbjxTdHJpbmc+IG9wdGlvbiA9IE9wdGlvbi5mcm9tTnVsbGFibGUobmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcHRpb24gaW5zdGFuY2VvZiBPcHRpb24uU29tZSk7CisgICAgICAgIGFzc2VydFRydWUob3B0aW9uLmlzRGVmaW5lZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTb21lKENodWNrIE5vcnJpcykiLCBvcHRpb24udG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24ub3IoImRlZmF1bHQgdmFsdWUiKSwgIkNodWNrIE5vcnJpcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMob3B0aW9uLmdldCgpLCJDaHVjayBOb3JyaXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIE9wdGlvbjxTdHJpbmc+IG9wdGlvbiA9IE9wdGlvbi5mcm9tTnVsbGFibGUobmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcHRpb24gaW5zdGFuY2VvZiBPcHRpb24uTm9uZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG9wdGlvbi5pc0RlZmluZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTm9uZSIsIG9wdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbi5vcigiZGVmYXVsdCB2YWx1ZSIpLCAiZGVmYXVsdCB2YWx1ZSIpOworICAgICAgICAvLyBFeHBlY3QgZXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvcHRpb24uZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIGdvdCBubyBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgZ290IHNvbWUgb3RoZXIgZXhjZXB0aW9uOiAiK2V4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VTb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9wdGlvbjxTdHJpbmc+IHNvbWUgPSBPcHRpb24uc29tZSgid2VlIik7CisgICAgICAgIGFzc2VydFRydWUoc29tZSBpbnN0YW5jZW9mIE9wdGlvbi5Tb21lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9uPEludGVnZXI+IG5vbmUgPSBPcHRpb24ubm9uZSgpOworICAgICAgICBhc3NlcnRUcnVlKG5vbmUgaW5zdGFuY2VvZiBPcHRpb24uTm9uZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uYWxzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25hbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTU5MWVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uYWxzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0NDsKK2ltcG9ydCB0aHJpZnQudGVzdC5PcHQzMDsKK2ltcG9ydCB0aHJpZnQudGVzdC5PcHQ2NDsKK2ltcG9ydCB0aHJpZnQudGVzdC5PcHQ4MDsKKworLy8gRXhlcmNpc2VzIHRoZSBpc1NldCBtZXRob2RzIHVzaW5nIHN0cnVjdHMgZnJvbSBmcm9tIE1hbnlPcHRpb25hbHMudGhyaWZ0CitwdWJsaWMgY2xhc3MgVGVzdE9wdGlvbmFscyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEVuY29kaW5nVXRpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTB4OCwgRW5jb2RpbmdVdGlscy5zZXRCaXQoKHNob3J0KTAsIDMsIHRydWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTAsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydCkweDgsIDMsIGZhbHNlKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIEVuY29kaW5nVXRpbHMudGVzdEJpdCgoc2hvcnQpMHg4LCAzKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoKHNob3J0KTB4OCwgNCkpOworCisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydClTaG9ydC5NSU5fVkFMVUUsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydCkwLCAxNSwgdHJ1ZSkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMCwgRW5jb2RpbmdVdGlscy5zZXRCaXQoKHNob3J0KVNob3J0Lk1JTl9WQUxVRSwgMTUsIGZhbHNlKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIEVuY29kaW5nVXRpbHMudGVzdEJpdChTaG9ydC5NSU5fVkFMVUUsIDE1KSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoU2hvcnQuTUlOX1ZBTFVFLCAxNCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQ0IHggPSBuZXcgT3B0NCgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjEoKSk7CisgICAgeC5zZXREZWYxKDMpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYyKCkpOworCisgICAgT3B0NCBjb3B5ID0gbmV3IE9wdDQoeCk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvcHkuaXNTZXREZWYxKCkpOworICAgIGNvcHkudW5zZXREZWYxKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb3B5LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0MzAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQzMCB4ID0gbmV3IE9wdDMwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICB4LnNldERlZjEoMyk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjIoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0NjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQ2NCB4ID0gbmV3IE9wdDY0KCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICB4LnNldERlZjEoMyk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjIoKSk7CisgICAgeC5zZXREZWY2NCgyMik7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWY2NCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWY2MygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHQ4MCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9wdDgwIHggPSBuZXcgT3B0ODAoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYxKCkpOworICAgIHguc2V0RGVmMSgzKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMigpKTsKKworICAgIE9wdDgwIGNvcHkgPSBuZXcgT3B0ODAoeCk7CisgICAgY29weS51bnNldERlZjEoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNvcHkuaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LkRvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVQU0lMT04gPSAwLjAwMDAwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgPQorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0KKyAgICAgICAgInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIjsKKworICAgIC8vIHRvIG1ha2Ugc3VyZSBsaXN0cyBjb250YWluaW5nIGRvdWJsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZVtdIEVYUEVDVEVEX0xJU1QgPQorICAgICAgICAgICAgezFkLC0xMDBkLDEwMGQsOTIyMzM3MjAzNjg1NDc3NTgwN2QsLTkyMjMzNzIwMzY4NTQ3NzU4MDdkLDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsCisgICAgICAgICAgICAgLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfTElTVC5sZW5ndGgsIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVYUEVDVEVEX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCwKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSksCisgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgLy9hc3NlcnRUcnVlKAorICAgICAgICAvLyAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpLAorICAgICAgICAvLyAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRhYmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKworaW1wb3J0IHRocmlmdC50ZXN0LlJldXNlOworCisvLyBUZXN0cyByZXVzaW5nIG9iamVjdHMgZm9yIGRlc2VyaWFsaXphdGlvbi4KKy8vCitwdWJsaWMgY2xhc3MgVGVzdFJldXNlIGV4dGVuZHMgVGVzdFN0cnVjdCB7CisKKyAgcHVibGljIHZvaWQgdGVzdFJldXNlT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNlcmlhbGl6ZXIgICBiaW5hcnlTZXJpYWxpemVyICAgPSBuZXcgICBUU2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgVERlc2VyaWFsaXplciBiaW5hcnlEZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisKKyAgICBSZXVzZSBydTEgPSBuZXcgUmV1c2UoKTsKKyAgICBIYXNoU2V0PFN0cmluZz4gaHMxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGJ5dGVbXSBzZXJCeXRlczsgICAgCisgICAgU3RyaW5nIHN0MSA9IG5ldyBTdHJpbmcoInN0cmluZzEiKTsKKyAgICBTdHJpbmcgc3QyID0gbmV3IFN0cmluZygic3RyaW5nMiIpOworCisgICAgcnUxLnNldFZhbDEoMTEpOworICAgIHJ1MS5zZXRWYWwyKGhzMSk7CisgICAgcnUxLmFkZFRvVmFsMihzdDEpOworICAgIAorICAgIHNlckJ5dGVzID0gYmluYXJ5U2VyaWFsaXplci5zZXJpYWxpemUocnUxKTsKKworICAgIC8vIHVwZGF0ZSBoYXNoIHNldCBhZnRlciBzZXJpYWxpemF0aW9uCisgICAgaHMxLmFkZChzdDIpOworCisgICAgYmluYXJ5RGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKHJ1MSwgc2VyQnl0ZXMpOworICAgCisgICAgYXNzZXJ0VHJ1ZSggcnUxLmdldFZhbDIoKSA9PSBoczEgKTsKKyAgICBhc3NlcnRUcnVlKCBoczEuc2l6ZSgpID09IDIgKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODMxZTUuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9UUklBTFMgPSA1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDAwMDsKLQotICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7Ci0gICAgcy5wdXNoKChzaG9ydCk0MCk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKLSAgICB0cnkgewotICAgICAgcy5wZWVrKCk7Ci0gICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyB5YXkKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgcy5wb3AoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHcm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgdHJpYWwgPSAwOyB0cmlhbCA8IE5VTV9UUklBTFM7IHRyaWFsKyspIHsKLSAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEwKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzLnB1c2goKHNob3J0KTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgIH0KLSAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNob3J0U3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0KLSAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTdGFjazxTaG9ydD4gc3RkU3RhY2sgPSBuZXcgU3RhY2s8U2hvcnQ+KCk7Ci0gICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMik7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjExMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgfQotICAgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWx0LWluIHN0YWNrOiAiICsgKGVuZC1zdGFydCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQppbmRleCA2MTE2MmQ5Li4zMzc5ZWQxIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci0KIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC00NSw2ICs0NCw4IEBACiBpbXBvcnQgdGhyaWZ0LnRlc3QuTmVzdGluZzsKIGltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OwogaW1wb3J0IHRocmlmdC50ZXN0Lk9uZU9mRWFjaDsKK2ltcG9ydCB0aHJpZnQudGVzdC5TdHJ1Y3RBOworaW1wb3J0IHRocmlmdC50ZXN0LlN0cnVjdEI7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFN0cnVjdCBleHRlbmRzIFRlc3RDYXNlIHsKQEAgLTMwNywxMiArMzA4LDQwIEBACiAgICAgICAgIG9iamVjdC50b1N0cmluZygpKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoYnl0ZVtdIGV4cGVjdGVkLCBieXRlW10gYWN0dWFsKSB7CisgICAgaWYgKCFqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgICAgZmFpbCgiRXhwZWN0ZWQgYnl0ZSBhcnJheSBkaWQgbm90IG1hdGNoIGFjdHVhbC4iKTsKKyAgICB9CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNCdWZmZXJGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEphdmFUZXN0SGVscGVyIG8gPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKKyAgICAKKyAgICBmaW5hbCBTdHJpbmcgdGVzdFN0cmluZyA9ICJ0ZXN0Qnl0ZXNCdWZmZXJGZWF0dXJlcyI7CisgICAgZmluYWwgSmF2YVRlc3RIZWxwZXIgbyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOworCiAgICAgby5zZXRSZXFfYmluKChCeXRlQnVmZmVyKW51bGwpOwogICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRSZXFfYmluKEJ5dGVCdWZmZXIud3JhcCh0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKwogICAgIG8uc2V0UmVxX2JpbigoYnl0ZVtdKW51bGwpOwogICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRSZXFfYmluKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBudWxsKTsKKyAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBudWxsKTsKKyAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIEJ5dGVCdWZmZXIud3JhcCh0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhU2VyaWFsaXphYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zMzIsNCArMzYxLDM2IEBACiAKICAgICBhc3NlcnRFcXVhbHMob29lLCBvb2UyKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTdWJTdHJ1Y3RWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RydWN0QSB2YWxpZCA9IG5ldyBTdHJ1Y3RBKCJ2YWxpZCIpOworICAgIFN0cnVjdEEgaW52YWxpZCA9IG5ldyBTdHJ1Y3RBKCk7CisKKyAgICBTdHJ1Y3RCIGIgPSBuZXcgU3RydWN0QigpOworICAgIHRyeSB7CisgICAgICBiLnZhbGlkYXRlKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKworICAgIGIgPSBuZXcgU3RydWN0QigpLnNldEFiKHZhbGlkKTsKKyAgICBiLnZhbGlkYXRlKCk7CisKKyAgICBiID0gbmV3IFN0cnVjdEIoKS5zZXRBYihpbnZhbGlkKTsKKyAgICB0cnkgeworICAgICAgYi52YWxpZGF0ZSgpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgLy8gZXhwZWN0ZWQKKyAgICB9CisKKyAgICBiID0gbmV3IFN0cnVjdEIoKS5zZXRBYih2YWxpZCkuc2V0QWEoaW52YWxpZCk7CisgICAgdHJ5IHsKKyAgICAgIGIudmFsaWRhdGUoKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIGV4cGVjdGVkCisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEJhc2VIZWxwZXIuamF2YQppbmRleCA2Mzc4NTI0Li44YjA4NTU1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUQmFzZUhlbHBlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRCYXNlSGVscGVyLmphdmEKQEAgLTE1NSw2ICsxNTUsMjMgQEAKICAgICBhc3NlcnROdWxsKFRCYXNlSGVscGVyLnJpZ2h0U2l6ZShudWxsKSk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUJ1ZmZlclRvU3RyaW5nKCkgeworICAgIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlW117MSwgMiwgM307CisgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcChhcnJheSwgMSwgMik7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgVEJhc2VIZWxwZXIudG9TdHJpbmcoYmIsIHNiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjAyIDAzIiwgc2IudG9TdHJpbmcoKSk7CisgICAgYmIgPSBCeXRlQnVmZmVyLndyYXAoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7CisgICAgYmIucG9zaXRpb24oMSk7CisgICAgYmIgPSBiYi5zbGljZSgpOworICAgIGFzc2VydEVxdWFscygxLCBiYi5hcnJheU9mZnNldCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYmIucG9zaXRpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJiLmxpbWl0KCkpOworICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBUQmFzZUhlbHBlci50b1N0cmluZyhiYiwgc2IpOworICAgIGFzc2VydEVxdWFscygiMDIgMDMiLCBzYi50b1N0cmluZygpKTsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5QmluYXJ5V2l0aEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtdezAsIDEsIDIsIDMsIDQsIDV9OwogICAgIEJ5dGVCdWZmZXIgYiA9IEJ5dGVCdWZmZXIud3JhcChieXRlcyk7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUVW5pb24uamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRVbmlvbi5qYXZhCmluZGV4IGEwNDQxMDEuLmYxZTZmMGUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRVbmlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRVbmlvbi5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzMsNiArMzQsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKIAogaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhcmFibGVVbmlvbjsKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICBUZXN0VW5pb24gdW5pb24gPSBuZXcgVGVzdFVuaW9uKCk7CiAKICAgICBhc3NlcnRGYWxzZSh1bmlvbi5pc1NldCgpKTsKKyAgICBhc3NlcnRGYWxzZSh1bmlvbi5pc1NldEkzMl9maWVsZCgpKTsKICAgICBhc3NlcnROdWxsKHVuaW9uLmdldEZpZWxkVmFsdWUoKSk7CiAKICAgICB1bmlvbiA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuSTMyX0ZJRUxELCAyNSk7CkBAIC01Niw2ICs1OSw4IEBACiAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNSksIHVuaW9uLmdldEZpZWxkVmFsdWUoKSk7CiAgIAogICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjUpLCB1bmlvbi5nZXRGaWVsZFZhbHVlKFRlc3RVbmlvbi5fRmllbGRzLkkzMl9GSUVMRCkpOworICAgIAorICAgIGFzc2VydFRydWUodW5pb24uaXNTZXRJMzJfZmllbGQoKSk7CiAgIAogICAgIHRyeSB7CiAgICAgICB1bmlvbi5nZXRGaWVsZFZhbHVlKFRlc3RVbmlvbi5fRmllbGRzLlNUUklOR19GSUVMRCk7CkBAIC03Myw2ICs3OCw4IEBACiAgICAgYXNzZXJ0RXF1YWxzKDEsIHVuaW9uLmdldEkzMl9maWVsZCgpKTsKICAgICB1bmlvbi5oYXNoQ29kZSgpOwogCisgICAgYXNzZXJ0RmFsc2UodW5pb24uaXNTZXRTdHJpbmdfZmllbGQoKSk7CisgICAgCiAgICAgdHJ5IHsKICAgICAgIHVuaW9uLmdldFN0cmluZ19maWVsZCgpOwogICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwpAQCAtMTQ3LDYgKzE1NCw3IEBACiAKICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBUZXN0VW5pb24gdW5pb24gPSBuZXcgVGVzdFVuaW9uKFRlc3RVbmlvbi5fRmllbGRzLkkzMl9GSUVMRCwgMjUpOworICAgIHVuaW9uLnNldEkzMl9zZXQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKDQyKSk7CiAKICAgICBUTWVtb3J5QnVmZmVyIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOwogICAgIFRQcm90b2NvbCBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKTsKQEAgLTE3OCw2ICsxODYsNDEgQEAKICAgICBzd2F1LndyaXRlKHByb3RvKTsKICAgICBuZXcgRW1wdHkoKS5yZWFkKHByb3RvKTsKICAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdFR1cGxlUHJvdG9jb2xTZXJpYWxpemF0aW9uICgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RVbmlvbiB1bmlvbiA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuSTMyX0ZJRUxELCAyNSk7CisgICAgdW5pb24uc2V0STMyX3NldChDb2xsZWN0aW9ucy5zaW5nbGV0b24oNDIpKTsKKworICAgIFRNZW1vcnlCdWZmZXIgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgVFByb3RvY29sIHByb3RvID0gbmV3IFRUdXBsZVByb3RvY29sKGJ1Zik7CisKKyAgICB1bmlvbi53cml0ZShwcm90byk7CisKKyAgICBUZXN0VW5pb24gdTIgPSBuZXcgVGVzdFVuaW9uKCk7CisKKyAgICB1Mi5yZWFkKHByb3RvKTsKKworICAgIGFzc2VydEVxdWFscyh1MiwgdW5pb24pOworCisgICAgU3RydWN0V2l0aEFVbmlvbiBzd2F1ID0gbmV3IFN0cnVjdFdpdGhBVW5pb24odTIpOworCisgICAgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sKGJ1Zik7CisKKyAgICBzd2F1LndyaXRlKHByb3RvKTsKKworICAgIFN0cnVjdFdpdGhBVW5pb24gc3dhdTIgPSBuZXcgU3RydWN0V2l0aEFVbmlvbigpOworICAgIGFzc2VydEZhbHNlKHN3YXUyLmVxdWFscyhzd2F1KSk7CisgICAgc3dhdTIucmVhZChwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKHN3YXUyLCBzd2F1KTsKKworICAgIC8vIHRoaXMgc2hvdWxkIE5PVCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgcHJvdG8gPSBuZXcgVFR1cGxlUHJvdG9jb2woYnVmKTsKKworICAgIHN3YXUud3JpdGUocHJvdG8pOworICAgIG5ldyBFbXB0eSgpLnJlYWQocHJvdG8pOworICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFNraXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBUZXN0VW5pb24gdHUgPSBUZXN0VW5pb24uc3RyaW5nX2ZpZWxkKCJzdHJpbmciKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmMyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5TYWZlQnl0ZXM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVW5zYWZlQnl0ZXM7CisKKy8vICB0ZXN0IGdlbmVyYXRpbmcgdHlwZXMgd2l0aCB1bi1jb3BpZWQgYnl0ZVtdL0J5dGVCdWZmZXIgaW5wdXQvb3V0cHV0CisvLworcHVibGljIGNsYXNzIFRlc3RVbnNhZmVCaW5hcmllcyBleHRlbmRzIFRlc3RTdHJ1Y3QgeworCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBpbnB1dCgpIHsKKyAgICByZXR1cm4gbmV3IGJ5dGVbXXsxLCAxfTsKKyAgfQorCisgIC8vCisgIC8vICB2ZXJpZnkgdGhhdCB0aGUgdW5zYWZlX2JpbmFyaWVzIG9wdGlvbiBtb2RpZmllcyBiZWhhdmlvcgorICAvLworCisgIC8vICBjb25zdHJ1Y3RvciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIGdldHRlciBkb2Vzbid0IGNvcHkKKyAgLy8gIG5vdGU6IHRoaXMgYmVoYXZpb3IgaXMgdGhlIHNhbWUgd2l0aC93aXRob3V0IHRoZSBmbGFnLCBidXQgaWYgdGhpcyBkZWZhdWx0IGV2ZXIgY2hhbmdlcywgdGhlIGN1cnJlbnQgYmVoYXZpb3IKKyAgLy8gICAgICAgIHNob3VsZCBiZSByZXRhaW5lZCB3aGVuIHVzaW5nIHRoaXMgZmxhZworICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlR2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBieXRlW10gdmFsID0gc3RydWN0LmdldEJ5dGVzKCk7CisgICAgdmFsWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIHNldHRlciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZVNldHRlcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcygpOworCisgICAgYnl0ZVtdIHZhbCA9IGlucHV0KCk7CisgICAgc3RydWN0LnNldEJ5dGVzKHZhbCk7CisKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgYnVmZmVyIGRvZW5zJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQnVmZmVyRm9yKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IGdlbmVyYXRvciBkb2VzIG5vdCBjaGFuZ2UgYmVoYXZpb3IKKyAgLy8KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUNvbnN0cnVjdG9yKCkgeworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVTZXR0ZXIoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUJ1ZmZlckZvcigpeworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQppbmRleCBkODhiOGE1Li5jNDgzY2YyIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0yMiwxMSArMjIsMTMgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCkBAIC0zOSwxMiArNDEsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTb2NrZXQ7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkV4Y2VwdGlvbldpdGhBTWFwOwogaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKIGltcG9ydCB0aHJpZnQudGVzdC5TcnYuSWZhY2U7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50Lkphbmt5X2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50Lm9uZXdheU1ldGhvZF9jYWxsOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudC5wcmltaXRpdmVNZXRob2RfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQudm9pZE1ldGhvZF9jYWxsOwogCiBwdWJsaWMgY2xhc3MgVGVzdFRBc3luY0NsaWVudE1hbmFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKQEAgLTUzLDcgKzUyLDkgQEAKICAgcHJpdmF0ZSBUQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXJfOwogCiAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgc2VydmVyXyA9IG5ldyBUSHNIYVNlcnZlcihuZXcgQXJncyhuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KFNlcnZlclRlc3RCYXNlLlBPUlQpKS5wcm9jZXNzb3IobmV3IFNydi5Qcm9jZXNzb3IobmV3IFNydkhhbmRsZXIoKSkpKTsKKyAgICBzZXJ2ZXJfID0gbmV3IFRIc0hhU2VydmVyKG5ldyBBcmdzKG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoCisgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChTZXJ2ZXJUZXN0QmFzZS5QT1JUKSkpLgorICAgICAgcHJvY2Vzc29yKG5ldyBTcnYuUHJvY2Vzc29yKG5ldyBTcnZIYW5kbGVyKCkpKSk7CiAgICAgc2VydmVyVGhyZWFkXyA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICBzZXJ2ZXJfLnNlcnZlKCk7CkBAIC03OSw4MiArODAsMTM2IEBACiAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwogICAgIGNsaWVudC5zZXRUaW1lb3V0KDUwMDApOwogICAgIGJhc2ljQ2FsbChjbGllbnQpOwotICB9IAotICAKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVycm9yQ2FsbFRlc3Q8QyBleHRlbmRzIFRBc3luY0NsaWVudCwgUj4geworICAgIGZpbmFsIHZvaWQgcnVuVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8RXhjZXB0aW9uPiBlcnJvciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8RXhjZXB0aW9uPigpOworICAgICAgQyBjbGllbnQgPSBleGVjdXRlRXJyb3JpbmdDYWxsKG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFI+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShSIHJlc3BvbnNlKSB7CisgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgZXJyb3Iuc2V0KGV4Y2VwdGlvbik7CisgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgbGF0Y2guYXdhaXQoMiwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICBhc3NlcnRUcnVlKGNsaWVudC5oYXNFcnJvcigpKTsKKyAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBlcnJvci5nZXQoKTsKKyAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsKKyAgICAgIGFzc2VydFNhbWUoZXhjZXB0aW9uLCBjbGllbnQuZ2V0RXJyb3IoKSk7CisgICAgICB2YWxpZGF0ZUVycm9yKGNsaWVudCwgZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhIGNhbGwgdGhhdCBpcyBleHBlY3RlZCB0byByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHRlc3RpbmcgY2FsbGJhY2sgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkLgorICAgICAqIEByZXR1cm4gVGhlIGNsaWVudCB0aGUgY2FsbCB3YXMgbWFkZSBhZ2FpbnN0LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gc2V0dGluZyB1cCB0aGUgY2xpZW50IG9yIG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBDIGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxSPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEZ1cnRoZXIgdmFsaWRhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBlcnJvciByYWlzZWQgaW4gdGhlIHJlbW90ZSBjYWxsIGFuZCB0aGUgc3RhdGUgb2YgdGhlCisgICAgICogY2xpZW50IGFmdGVyIHRoYXQgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCByZXR1cm5lZCBmcm9tIHtAbGluayAjZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrKX0uCisgICAgICogQHBhcmFtIGVycm9yIFRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoZSByZW1vdGUgY2FsbC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlRXJyb3IoQyBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5leHBlY3RlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoZmFsc2UsIGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydEZhbHNlKGNsaWVudC5oYXNUaW1lb3V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGVycm9yIGluc3RhbmNlb2YgVEV4Y2VwdGlvbik7CisgICAgICB9CisgICAgfS5ydW5UZXN0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RGVjbGFyZWRSZW1vdGVFeGNlcHRpb25DYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbmV3IEVycm9yQ2FsbFRlc3Q8U3J2LkFzeW5jQ2xpZW50LCBCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgU3J2LkFzeW5jQ2xpZW50IGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxCb29sZWFuPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LmRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKHRydWUsIGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydEZhbHNlKGNsaWVudC5oYXNUaW1lb3V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRXhjZXB0aW9uV2l0aEFNYXAuY2xhc3MsIGVycm9yLmdldENsYXNzKCkpOworICAgICAgICBFeGNlcHRpb25XaXRoQU1hcCBleGNlcHRpb25XaXRoQU1hcCA9IChFeGNlcHRpb25XaXRoQU1hcCkgZXJyb3I7CisgICAgICAgIGFzc2VydEVxdWFscygiYmxhaCIsIGV4Y2VwdGlvbldpdGhBTWFwLmdldEJsYWgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSwgZXhjZXB0aW9uV2l0aEFNYXAuZ2V0TWFwX2ZpZWxkKCkpOworICAgICAgfQorICAgIH0ucnVuVGVzdCgpOworICB9CisKICAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC5zZXRUaW1lb3V0KDEwMCk7Ci0gICAgY2xpZW50LnByaW1pdGl2ZU1ldGhvZChuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxwcmltaXRpdmVNZXRob2RfY2FsbD4oKSB7CisgICAgbmV3IEVycm9yQ2FsbFRlc3Q8U3J2LkFzeW5jQ2xpZW50LCBJbnRlZ2VyPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgVGltZW91dEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzaW5rID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc2luaywgdHJ1ZSkpOwotICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgVGltZW91dEV4Y2VwdGlvbiBidXQgZ290ICIgKyBzaW5rLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgU3J2LkFzeW5jQ2xpZW50IGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxJbnRlZ2VyPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnNldFRpbWVvdXQoMTAwKTsKKyAgICAgICAgY2xpZW50LnByaW1pdGl2ZU1ldGhvZChjYWxsYmFjayk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKHByaW1pdGl2ZU1ldGhvZF9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGZpbmlzaGVkIHRpbWVkIG91dCBjYWxsLiIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKICAgICAgIH0KLSAgICB9KTsKLSAgICBsYXRjaC5hd2FpdCgyLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICBhc3NlcnRUcnVlKGNsaWVudC5oYXNFcnJvcigpKTsKLSAgICBhc3NlcnRUcnVlKGNsaWVudC5nZXRFcnJvcigpIGluc3RhbmNlb2YgVGltZW91dEV4Y2VwdGlvbik7Ci0gIH0gCi0gIAorICAgIH0ucnVuVGVzdCgpOworICB9CisKICAgcHVibGljIHZvaWQgdGVzdFZvaWRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50LnZvaWRNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8U3J2LkFzeW5jQ2xpZW50LnZvaWRNZXRob2RfY2FsbD4oKSB7CisgICAgY2xpZW50LnZvaWRNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8Vm9pZD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUodm9pZE1ldGhvZF9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcmVzcG9uc2UuZ2V0UmVzdWx0KCk7Ci0gICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBmYWlsKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFZvaWQgcmVzcG9uc2UpIHsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgIH0KICAgICB9KTsKICAgICBsYXRjaC5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICBhc3NlcnRUcnVlKHJldHVybmVkLmdldCgpKTsKLSAgfSAKLSAgCisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5Q2FsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8b25ld2F5TWV0aG9kX2NhbGw+KCkgeworICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8Vm9pZD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUob25ld2F5TWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVm9pZCByZXNwb25zZSkgeworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgfQogICAgIH0pOwogICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgIGFzc2VydFRydWUocmV0dXJuZWQuZ2V0KCkpOwotICB9IAotICAKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbENhbGxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgLy8gbWFrZSBtdWx0aXBsZSBjYWxscyB3aXRoIGRlc2VyaWFsaXphdGlvbiBpbiB0aGUgc2VsZWN0b3IgdGhyZWFkIChyZXBybyBFcmljJ3MgaXNzdWUpCiAgICAgaW50IG51bVRocmVhZHMgPSA1MDsKQEAgLTE3NiwyOSArMjMxLDI0IEBACiAgICAgICBudW1TdWNjZXNzZXMgKz0gcnVubmFibGUuZ2V0TnVtU3VjY2Vzc2VzKCk7CiAgICAgfQogICAgIGFzc2VydEVxdWFscyhudW1UaHJlYWRzICogbnVtQ2FsbHNQZXJUaHJlYWQsIG51bVN1Y2Nlc3Nlcyk7Ci0gIH0gIAotICAKKyAgfQorCiAgIHByaXZhdGUgU3J2LkFzeW5jQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgVE5vbmJsb2NraW5nU29ja2V0IGNsaWVudFNvY2tldCA9IG5ldyBUTm9uYmxvY2tpbmdTb2NrZXQoU2VydmVyVGVzdEJhc2UuSE9TVCwgU2VydmVyVGVzdEJhc2UuUE9SVCk7CiAgICAgcmV0dXJuIG5ldyBTcnYuQXN5bmNDbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGNsaWVudE1hbmFnZXJfLCBjbGllbnRTb2NrZXQpOwogICB9Ci0gIAorCiAgIHByaXZhdGUgdm9pZCBiYXNpY0NhbGwoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICBjbGllbnQuSmFua3koMSwgbmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8U3J2LkFzeW5jQ2xpZW50Lkphbmt5X2NhbGw+KCkgeworICAgIGNsaWVudC5KYW5reSgxLCBuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxJbnRlZ2VyPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShKYW5reV9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3BvbnNlLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSW50ZWdlciByZXNwb25zZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuaW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKICAgICAgICAgdHJ5IHsKQEAgLTIxMyw3ICsyNjMsNyBAQAogICAgIGxhdGNoLmF3YWl0KDEwMCwgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5lZC5nZXQoKSk7CiAgIH0KLSAgCisKICAgcHVibGljIGNsYXNzIFNydkhhbmRsZXIgaW1wbGVtZW50cyBJZmFjZSB7CiAgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGZvciBhIHN0YW5kYXJkIGNhbGwgdGVzdGluZwogICAgIEBPdmVycmlkZQpAQCAtMjMyLDcgKzI4Miw3IEBACiAgICAgICB9CiAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoaW50IHNvbWV0aGluZykgdGhyb3dzIFRFeGNlcHRpb24geyB9CiAKQEAgLTI0OCwyMSArMjk4LDMwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25ld2F5TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGJvb2xlYW4gc2hvdWxkVGhyb3dEZWNsYXJlZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKHNob3VsZFRocm93RGVjbGFyZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbldpdGhBTWFwKCJibGFoIiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQhIik7CisgICAgICB9CisgICAgfQogICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWlsdXJlTGVzc0NhbGxiYWNrPFQgZXh0ZW5kcyBUQXN5bmNNZXRob2RDYWxsPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4geworCisgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhaWx1cmVMZXNzQ2FsbGJhY2s8VD4gaW1wbGVtZW50cyBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKICAgICAgIGZhaWwoZXhjZXB0aW9uKTsKICAgICB9CiAgIH0KLSAgCisKICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKICAgICBTdHJpbmdXcml0ZXIgc2luayA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7CiAgICAgZmFpbCgidW5leHBlY3RlZCBlcnJvciAiICsgc2luay50b1N0cmluZygpKTsKICAgfQotICAKKwogICBwcml2YXRlIGNsYXNzIEphbmt5UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAgICAgcHJpdmF0ZSBpbnQgbnVtQ2FsbHNfOwogICAgIHByaXZhdGUgaW50IG51bVN1Y2Nlc3Nlc18gPSAwOwpAQCAtMjg1LDE4ICszNDQsMTMgQEAKICAgICAgICAgICAvLyBjb25uZWN0IGFuIGFzeW5jIGNsaWVudAogICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgY2xpZW50Xy5KYW5reSgxLCBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7Ci0gICAgICAgICAgICAKKyAgICAgICAgICBjbGllbnRfLkphbmt5KDEsIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+KCkgeworCiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSmFua3lfY2FsbCByZXNwb25zZSkgewotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5nZXRSZXN1bHQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOwotICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgICAgICBmYWlsKGUpOwotICAgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEludGVnZXIgcmVzdWx0KSB7CisgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMzIxLDQgKzM3NSw0IEBACiAgICAgICB9CiAgICAgfQogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvQmVuY2htYXJrUHJvdG9jb2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvQmVuY2htYXJrUHJvdG9jb2xzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBCZW5jaG1hcmtQcm90b2NvbHMgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxUUHJvdG9jb2xGYWN0b3J5PiBGQUNUT1JJRVMgPSBuZXcgTGlua2VkSGFzaFNldDxUUHJvdG9jb2xGYWN0b3J5Pigpe3sKKyAgICBhZGQobmV3IFRUdXBsZVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgYWRkKG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgYWRkKG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgfX07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9SRVBTID0gMTAwMDAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RSSUFMUyA9IDEwOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBNYXA8VFByb3RvY29sRmFjdG9yeSwgTGlzdDxMb25nPj4gdGltZXNCeUZhY3RvcnkgPSBuZXcgSGFzaE1hcDxUUHJvdG9jb2xGYWN0b3J5LCBMaXN0PExvbmc+PigpOworCisgICAgZm9yIChpbnQgdHJpYWwgPSAwOyB0cmlhbCA8IE5VTV9UUklBTFM7IHRyaWFsKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgIH0KKy8vICAgICAgVFByb3RvY29sIHByb3RvID0gZmFjdG9yeS5nZXRQcm90b2NvbChuZXcgVFRyYW5zcG9ydCgpIHsKKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworLy8gICAgICAgICAgcmV0dXJuIDA7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgQE92ZXJyaWRlCisvLyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworLy8gICAgICAgICAgcmV0dXJuIHRydWU7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKy8vICAgICAgICB9CisvLyAgICAgIH0pOworCisKKyAgICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5IDogRkFDVE9SSUVTKSB7CisgICAgICAgIGlmICh0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSkgPT0gbnVsbCkgeworICAgICAgICAgIHRpbWVzQnlGYWN0b3J5LnB1dChmYWN0b3J5LCBuZXcgQXJyYXlMaXN0PExvbmc+KCkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKKyAgICAgICAgICBUUHJvdG9jb2wgcHJvdG8gPSBmYWN0b3J5LmdldFByb3RvY29sKG5ldyBUTWVtb3J5QnVmZmVyKDEyOCoxMDI0KSk7CisgICAgICAgICAgRml4dHVyZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdC53cml0ZShwcm90byk7CisgICAgICAgICAgRml4dHVyZXMubmVzdGluZy53cml0ZShwcm90byk7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgdGltZXNCeUZhY3RvcnkuZ2V0KGZhY3RvcnkpLmFkZChlbmQtc3RhcnQpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5IDogRkFDVE9SSUVTKSB7CisgICAgICBMaXN0PExvbmc+IHRpbWVzID0gdGltZXNCeUZhY3RvcnkuZ2V0KGZhY3RvcnkpOworLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJhdyB0aW1lcyBwcmUtZHJvcDogIiArIHRpbWVzICk7CisgICAgICB0aW1lcy5yZW1vdmUoQ29sbGVjdGlvbnMubWF4KHRpbWVzKSk7CisgICAgICBsb25nIHRvdGFsID0gMDsKKyAgICAgIGZvciAobG9uZyB0IDogdGltZXMpIHsKKyAgICAgICAgdG90YWwgKz0gdDsKKyAgICAgIH0KKyAgICAgIENvbGxlY3Rpb25zLnNvcnQodGltZXMpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGF2ZXJhZ2UgdGltZTogIiArICh0b3RhbCAvIHRpbWVzLnNpemUoKSkgKyAibXMiKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmF3IHRpbWVzOiAiICsgdGltZXMpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Byb3RvY29sVGVzdEJhc2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhCmluZGV4IDVmMjJjZmMuLjAzODZkODMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhCkBAIC03NCwxMiArNzQsMjkgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKGJ5dGVbXSBiIDogQXJyYXlzLmFzTGlzdChuZXcgYnl0ZVswXSwgbmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOCw5LDEwfSwgbmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwgbmV3IGJ5dGVbMTI4XSkpIHsKKyAgICBmb3IgKGJ5dGVbXSBiIDogQXJyYXlzLmFzTGlzdChuZXcgYnl0ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdezAsMSwyLDMsNCw1LDYsNyw4LDksMTB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXsweDVEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdeyhieXRlKTB4RDUsKGJ5dGUpMHg1RH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXsoYnl0ZSkweEZGLChieXRlKTB4RDUsKGJ5dGUpMHg1RH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbMTI4XSkpIHsKICAgICAgIGlmIChjYW5CZVVzZWROYWtlZCgpKSB7CiAgICAgICAgIGludGVybmFsVGVzdE5ha2VkQmluYXJ5KGIpOwogICAgICAgfQogICAgICAgaW50ZXJuYWxUZXN0QmluYXJ5RmllbGQoYik7CiAgICAgfQorCisgICAgaWYgKGNhbkJlVXNlZE5ha2VkKCkpIHsKKyAgICAgIGJ5dGVbXSBkYXRhID0gezEsIDIsIDMsIDQsIDUsIDZ9OworCisgICAgICBUTWVtb3J5QnVmZmVyIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgICAgVFByb3RvY29sIHByb3RvID0gZ2V0RmFjdG9yeSgpLmdldFByb3RvY29sKGJ1Zik7CisgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGRhdGEpOworICAgICAgYmIuZ2V0KCk7CisgICAgICBwcm90by53cml0ZUJpbmFyeShiYi5zbGljZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoZGF0YSwgMSwgNSksIHByb3RvLnJlYWRCaW5hcnkoKSk7CisgICAgfQogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzEwLDYgKzMyNywxMSBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvdykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2hvdWxkVGhyb3c7CisgICAgICB9CiAgICAgfTsKIAogICAgIFNydi5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBTcnYuUHJvY2Vzc29yKGhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTc4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RTaG9ydFN0YWNrIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxKTsKKyAgICBzLnB1c2goKHNob3J0KTEwKTsKKyAgICBzLnB1c2goKHNob3J0KTExKTsKKyAgICBzLnB1c2goKHNob3J0KTEyKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBvcCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTExLCBzLnBvcCgpKTsKKyAgICBzLnB1c2goKHNob3J0KTQwKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBvcCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKKyAgICB0cnkgeworICAgICAgcy5wb3AoKTsKKyAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHlheQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEJpbmFyeVByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQmluYXJ5UHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmZDkzNy4uMDAwMDAwMAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQmluYXJ5UHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKLQotcHVibGljIGNsYXNzIFRlc3RUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmMGQ3ODk1Li5iNGMwODg4Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URGVzZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2ltcG9ydCB0aHJpZnQudGVzdC5Cb25rOwogCiBwdWJsaWMgY2xhc3MgVGVzdFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKICAgQE92ZXJyaWRlCkBAIC0zMiw2ICszNiwyMCBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdE9PTURlbmlhbE9mU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFN0cnVjdCBoZWFkZXIsIEludGVnZXIuTUFYX1ZBTFVFIGxlbmd0aCwgYW5kIG9ubHkgb25lIHJlYWwKKyAgICAvLyBieXRlIG9mIGRhdGEKKyAgICBieXRlIFtdIGJ5dGVzID0gezI0LCAtMSwgLTEsIC0xLCAtMTcsIDQ5fTsKKyAgICBURGVzZXJpYWxpemVyIGRlc2VyID0gbmV3IFREZXNlcmlhbGl6ZXIobmV3IFRDb21wYWN0UHJvdG9jb2wKKwkJCQkJICAgIC5GYWN0b3J5KDEwMDApKTsKKyAgICBCb25rIGJvbmsgPSBuZXcgQm9uaygpOworICAgIHRyeSB7CisJZGVzZXIuZGVzZXJpYWxpemUoYm9uaywgYnl0ZXMpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworCS8vIElnbm9yZSBhcyB3ZSBhcmUgb25seSBjaGVja2luZyBmb3IgT09NIGluIHRoZSBmYWlsdXJlIGNhc2UKKyAgICB9CisgIH0KKwogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBuZXcgVGVzdFRDb21wYWN0UHJvdG9jb2woKS5iZW5jaG1hcmsoKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGQ3Mzc2YWMuLmMyY2ExZmEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKQEAgLTE4LDYgKzE4LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CisKIHB1YmxpYyBjbGFzcyBUZXN0VEpTT05Qcm90b2NvbCBleHRlbmRzIFByb3RvY29sVGVzdEJhc2UgewogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKQEAgLTI4LDQgKzM0LDE1IEBACiAgIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkVW5pY29kZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBTdHJpbmcganNvblN0cmluZyA9ICJcImhlbGxvIHVuaWNvZGUgXFx1MGUwMVxcdWQ4MzRcXHVkZDFlIHdvcmxkXCIiOworICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJoZWxsbyB1bmljb2RlIFx1MGUwMVx1ZDgzNFx1ZGQxZSB3b3JsZCI7CisKKyAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKDEwMDApOworICAgIFRKU09OUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpOworICAgIGJ1ZmZlci53cml0ZShqc29uU3RyaW5nLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgcHJvdG9jb2wucmVhZFN0cmluZygpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCmluZGV4IDE5OWM3MDcuLjg5Y2Y1MzYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKQEAgLTE4LDI0ICsxOCwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOwogCi1pbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKLWltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuTmVzdGluZzsKLWltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OwogaW1wb3J0IHRocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3Q7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VFByb3RvY29sVXRpbCBleHRlbmRzIFRlc3RDYXNlIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDEyNWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5GaXh0dXJlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgcHJpdmF0ZSBUU2ltcGxlSlNPTlByb3RvY29sIHByb3RvOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDEwMDApOworICAgIHByb3RvID0gbmV3IFRTaW1wbGVKU09OUHJvdG9jb2woYnVmKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGJ1ZlRvU3RyaW5nKCkgeworICAgIHJldHVybiBidWYudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SG9seU1vbGV5KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGZpbmFsIEhvbHlNb2xleSBob2x5TW9sZXkgPSBGaXh0dXJlcy5ob2x5TW9sZXkuZGVlcENvcHkoKTsKKyAgICAvLyB1bnNldCBzZXRzIHRoYXQgcHJvZHVjZSBpbmNvbnNpc3RlbnQgb3JkZXJpbmcgYmV0d2VlbiBKREs3LzgKKyAgICBob2x5TW9sZXkudW5zZXRCb25rcygpOworICAgIGhvbHlNb2xleS51bnNldENvbnRhaW4oKTsKKyAgICBob2x5TW9sZXkud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wiYmlnXCI6W3tcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6MzUsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX0se1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjotNDIsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX1dfSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgRml4dHVyZXMubmVzdGluZy53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJteV9ib25rXCI6e1widHlwZVwiOjMxMzM3LFwibWVzc2FnZVwiOlwiSSBhbSBhIGJvbmsuLi4geG9yIVwifSxcIm15X29vZVwiOntcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119fSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9uZU9mRWFjaCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBGaXh0dXJlcy5vbmVPZkVhY2gud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjotNDIsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYW5lUGFydHNPZkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgLy8gdW5zZXQgYWxsIHRoZSBtYXBzIHdpdGggY29udGFpbmVyIGtleXMKKyAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0IHN0cnVjdCA9IEZpeHR1cmVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QuZGVlcENvcHkoKTsKKyAgICBzdHJ1Y3QudW5zZXRMaXN0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0U2V0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0TWFwX2J5dGVfbWFwKCk7CisgICAgLy8gdW5zZXQgc2V0cyBhbmQgbWFwcyB0aGF0IHByb2R1Y2UgaW5jb25zaXN0ZW50IG9yZGVyaW5nIGJldHdlZW4gSkRLNy84CisgICAgc3RydWN0LnVuc2V0Qnl0ZV9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRJMTZfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STY0X3NldCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRTdHJpbmdfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0STMyX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0STY0X2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0RG91YmxlX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX2J5dGVfbWFwKCk7CisgICAgc3RydWN0LndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImFfYnl0ZVwiOjEyNyxcImFfaTE2XCI6MzIwMDAsXCJhX2kzMlwiOjEwMDAwMDAwMDAsXCJhX2k2NFwiOjEwOTk1MTE2Mjc3NzUsXCJhX2RvdWJsZVwiOjUuNjc4OSxcImFfc3RyaW5nXCI6XCJteSBzdHJpbmdcIixcImFfYmluYXJ5XCI6XCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlwiLFwidHJ1ZV9maWVsZFwiOjEsXCJmYWxzZV9maWVsZFwiOjAsXCJlbXB0eV9zdHJ1Y3RfZmllbGRcIjp7fSxcImJ5dGVfbGlzdFwiOlstMTI3LC0xLDAsMSwxMjddLFwiaTE2X2xpc3RcIjpbLTEsMCwxLDMyNzY3XSxcImkzMl9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDIxNDc0ODM2NDddLFwiaTY0X2xpc3RcIjpbLTEsMCwyNTUsNjU1MzUsMTY3NzcyMTUsNDI5NDk2NzI5NSwxMDk5NTExNjI3Nzc1LDI4MTQ3NDk3NjcxMDY1NSw3MjA1NzU5NDAzNzkyNzkzNSw5MjIzMzcyMDM2ODU0Nzc1ODA3XSxcImRvdWJsZV9saXN0XCI6WzAuMSwwLjIsMC4zXSxcInN0cmluZ19saXN0XCI6W1wiZmlyc3RcIixcInNlY29uZFwiLFwidGhpcmRcIl0sXCJib29sZWFuX2xpc3RcIjpbMSwxLDEsMCwwLDBdLFwic3RydWN0X2xpc3RcIjpbe30se31dLFwiaTMyX3NldFwiOlsxLDIsM10sXCJib29sZWFuX3NldFwiOlswLDFdLFwic3RydWN0X3NldFwiOlt7fV0sXCJieXRlX2J5dGVfbWFwXCI6e1wiMVwiOjJ9LFwiYm9vbGVhbl9ieXRlX21hcFwiOntcIjBcIjowLFwiMVwiOjF9LFwiYnl0ZV9pMTZfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6MzI3Njd9LFwiYnl0ZV9pMzJfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6MjE0NzQ4MzY0N30sXCJieXRlX2k2NF9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjo5MjIzMzcyMDM2ODU0Nzc1ODA3fSxcImJ5dGVfZG91YmxlX21hcFwiOntcIjFcIjowLjEsXCIyXCI6LTAuMSxcIjNcIjoxMDAwMDAwLjF9LFwiYnl0ZV9zdHJpbmdfbWFwXCI6e1wiMVwiOlwiXCIsXCIyXCI6XCJibGFoXCIsXCIzXCI6XCJsb29vb29vb29vb29vb29uZyBzdHJpbmdcIn0sXCJieXRlX2Jvb2xlYW5fbWFwXCI6e1wiMVwiOjEsXCIyXCI6MH0sXCJieXRlX21hcF9tYXBcIjp7XCIwXCI6e30sXCIxXCI6e1wiMVwiOjF9LFwiMlwiOntcIjFcIjoxLFwiMlwiOjJ9fSxcImJ5dGVfc2V0X21hcFwiOntcIjBcIjpbXSxcIjFcIjpbMV0sXCIyXCI6WzEsMl19LFwiYnl0ZV9saXN0X21hcFwiOntcIjBcIjpbXSxcIjFcIjpbMV0sXCIyXCI6WzEsMl19fSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRocm93c09uQ29sbGVjdGlvbktleXMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIEZpeHR1cmVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qud3JpdGUocHJvdG8pOworICAgICAgZmFpbCgidGhpcyBzaG91bGQgdGhyb3cgYSBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFNpbXBsZUpTT05Qcm90b2NvbC5Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUVHVwbGVQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFR1cGxlUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU0ZGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFR1cGxlUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKKworaW1wb3J0IHRocmlmdC50ZXN0LlR1cGxlUHJvdG9jb2xUZXN0U3RydWN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0VFR1cGxlUHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVVc2VkTmFrZWQoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBUVHVwbGVQcm90b2NvbC5GYWN0b3J5KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Qml0c2V0TGVuZ3RoSXNzdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUdXBsZVByb3RvY29sVGVzdFN0cnVjdCB0MSA9IG5ldyBUdXBsZVByb3RvY29sVGVzdFN0cnVjdCgpOworICAgIHQxLnNldEZpZWxkMSgwKTsKKyAgICB0MS5zZXRGaWVsZDIoMTIpOworICAgIG5ldyBURGVzZXJpYWxpemVyKG5ldyBUVHVwbGVQcm90b2NvbC5GYWN0b3J5KCkpLmRlc2VyaWFsaXplKG5ldyBUdXBsZVByb3RvY29sVGVzdFN0cnVjdCgpLCBuZXcgVFNlcmlhbGl6ZXIobmV3IFRUdXBsZVByb3RvY29sLkZhY3RvcnkoKSkuc2VyaWFsaXplKHQxKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1Rlc3RTdGFuZGFyZFNjaGVtZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVGVzdFN0YW5kYXJkU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMjI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1Rlc3RTdGFuZGFyZFNjaGVtZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7CitpbXBvcnQgdGhyaWZ0LnRlc3QuTmVzdGluZzsKK2ltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworCisgIC8qKgorICAgKiBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIFN0YW5kYXJkIFNjaGVtZSBwcm9wZXJseSByZWFkcyBzdHJ1Y3RzIHNlcmlhbGl6ZWQKKyAgICogdXNpbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiB0aHJpZnQuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVudFN0cnVjdHMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEFuZENvbXBhcmUobmV3IE9uZU9mRWFjaCgpLCBGaXh0dXJlcy5vbmVPZkVhY2gsIEZpeHR1cmVzLnBlcnNpc3RlbnRCeXRlc09uZU9mRWFjaCk7CisgICAgcmVhZEFuZENvbXBhcmUobmV3IEhvbHlNb2xleSgpLCBGaXh0dXJlcy5ob2x5TW9sZXksIEZpeHR1cmVzLnBlcnNpc3RlbnRCeXRlc0hvbHlNb2xleSk7CisgICAgcmVhZEFuZENvbXBhcmUobmV3IE5lc3RpbmcoKSwgRml4dHVyZXMubmVzdGluZywgRml4dHVyZXMucGVyc2lzdGVudEJ5dGVzTmVzdGluZyk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkQW5kQ29tcGFyZShUQmFzZSBzdHJ1Y3QsIFRCYXNlIGZpeHR1cmUsIGJ5dGVbXSBpbnB1dEJ5dGVzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIHRyYW5zLndyaXRlKGlucHV0Qnl0ZXMsIDAsIGlucHV0Qnl0ZXMubGVuZ3RoKTsKKyAgICBUUHJvdG9jb2wgaXByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zKTsKKyAgICBzdHJ1Y3QucmVhZChpcHJvdCk7CisgICAgYXNzZXJ0RXF1YWxzKGZpeHR1cmUsIHN0cnVjdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCmluZGV4IDk1NDI1MjAuLjFkZWUyMmQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQpAQCAtMjYsMTYgKzI2LDIyIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5OwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKQEAgLTQ4LDM4ICs1NCw1NCBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclRlc3RCYXNlIGV4dGVuZHMgVGVzdENhc2UgewogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEhhbmRsZXIgaW1wbGVtZW50cyBUaHJpZnRUZXN0LklmYWNlIHsKLSAgCisKICAgICBwdWJsaWMgVGVzdEhhbmRsZXIoKSB7fQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKCkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFZvaWQoKVxuIik7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCisgICAgcHVibGljIGJvb2xlYW4gdGVzdEJvb2woYm9vbGVhbiB0aGluZykgeworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJvb2woIiArIHRoaW5nICsgIilcbiIpOworICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKwogICAgIHB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCeXRlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEkzMigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEk2NCgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3REb3VibGUoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB0ZXN0QmluYXJ5KEJ5dGVCdWZmZXIgdGhpbmcpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih0aGluZy5yZW1haW5pbmcoKSAqIDMpOworICAgICAgdGhpbmcubWFyaygpOworICAgICAgd2hpbGUgKHRoaW5nLnJlbWFpbmluZygpID4gMCkgeworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTAyWCAiLCB0aGluZy5nZXQoKSkpOworICAgICAgfQorICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgiICsgc2IudG9TdHJpbmcoKSArICIpXG4iKTsKKyAgICAgIHRoaW5nLnJlc2V0KCk7CisgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cnVjdCh7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKwpAQCAtODgsNyArMTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuaTY0X3RoaW5nICsgIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KSB7CiAgICAgICBYdHJ1Y3QgdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3ROZXN0KHsiICsKQEAgLTEwMCwyMiArMTIyLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nICsgIn0pXG4iKTsKICAgICAgIHJldHVybiBuZXN0OwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsSW50ZWdlcj4gdGVzdE1hcChNYXA8SW50ZWdlcixJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcCh7Iik7Ci0gICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoaW50IGtleSA6IHRoaW5nLmtleVNldCgpKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHRoaW5nLmdldChrZXkpKTsKLSAgICAgIH0KKyAgICAgIFN5c3RlbS5vdXQucHJpbnQodGhpbmcpOwogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKKyAgICBwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZyxTdHJpbmc+IHRoaW5nKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nTWFwKHsiKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQodGhpbmcpOworICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOworICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKwogICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTZXQoeyIpOwogICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CkBAIC0xMzAsNyArMTUxLDcgQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdExpc3QoeyIpOwogICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CkBAIC0xNDUsODAgKzE2Niw1OCBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKVxuIik7CiAgICAgICBNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4gbWFwbWFwID0KICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4oKTsKLSAgCisKICAgICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gbmVnID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgICAgbmVnLnB1dCgtaSwgLWkpOwogICAgICAgfQotICAKKwogICAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgICAgbWFwbWFwLnB1dCgtNCwgbmVnKTsKLSAgCisKICAgICAgIHJldHVybiBtYXBtYXA7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpXG4iKTsKLSAgCi0gICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0gICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLSAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0gIAotICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSAoYnl0ZSk0OwotICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSAobG9uZyk0OwotICAKLSAgICAgIEluc2FuaXR5IGNyYXp5ID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICBjcmF6eS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKLSAgCi0gICAgICBjcmF6eS51c2VyTWFwLnB1dChOdW1iZXJ6LkVJR0hULCAobG9uZyk4KTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGdvb2RieWUpOwotICAKLSAgICAgIEluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgY3JhenkudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1KTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGhlbGxvKTsKLSAgCisKICAgICAgIEhhc2hNYXA8TnVtYmVyeixJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CiAgICAgICBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4oKTs7Ci0gIAotICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRXTywgY3JhenkpOwotICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRIUkVFLCBjcmF6eSk7Ci0gIAorCisgICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVFdPLCBhcmd1bWVudCk7CisgICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKKworICAgICAgSW5zYW5pdHkgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7CiAgICAgICBzZWNvbmRfbWFwLnB1dChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKLSAgCisKICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gaW5zYW5lID0KICAgICAgICAgbmV3IEhhc2hNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+PigpOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykxLCBmaXJzdF9tYXApOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykyLCBzZWNvbmRfbWFwKTsKLSAgCisKICAgICAgIHJldHVybiBpbnNhbmU7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aSgpXG4iKTsKLSAgCisKICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTs7CiAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOwpAQCAtMjI2LDE4ICsyMjUsMjQgQEAKICAgICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CiAgICAgICByZXR1cm4gaGVsbG87CiAgICAgfQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcpIHRocm93cyBYY2VwdGlvbiB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcpIHRocm93cyBYY2VwdGlvbiwgVEV4Y2VwdGlvbiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RXhjZXB0aW9uKCIrYXJnKyIpXG4iKTsKLSAgICAgIGlmIChhcmcuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgewogICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CiAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKLSAgICAgICAgeC5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgICAgIHRocm93IHg7CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnOwogICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYY2VwdGlvbiwgWGNlcHRpb24yIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIilcbiIpOwogICAgICAgaWYgKGFyZzAuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CkBAIC0yNTIsMTcgKzI1NywxNyBAQAogICAgICAgICB4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgICAgICB0aHJvdyB4OwogICAgICAgfQotICAKKwogICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdE9uZXdheSgiICsgSW50ZWdlci50b1N0cmluZyhzbGVlcEZvcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICIpID0+IHNsZWVwaW5nLi4uIik7CiAgICAgICB0cnkgewotICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBGb3IgKiAxMDAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogU0xFRVBfREVMQVkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgc2xlZXBpbmchIik7CiAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CkBAIC0yNzcsMTYgKzI4MiwyOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImxvY2FsaG9zdCI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSBJbnRlZ2VyLnZhbHVlT2YoCiAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnBvcnQiLCAiOTA5MCIpKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSAxMDAwOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTTEVFUF9ERUxBWSA9IDEwMDA7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gMTUwMDsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWHRydWN0IFhTVFJVQ1QgPSBuZXcgWHRydWN0KCJaZXJvIiwgKGJ5dGUpIDEsIC0zLCAtNSk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFh0cnVjdDIgWFNUUlVDVDIgPSBuZXcgWHRydWN0MigoYnl0ZSkxLCBYU1RSVUNULCA1KTsKIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnksIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBFeGNlcHRpb247CiAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcFNlcnZlcigpIHRocm93cyBFeGNlcHRpb247CiAKICAgcHVibGljIGFic3RyYWN0IFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbjsKIAorICBwcml2YXRlIHZvaWQgdGVzdEJvb2woVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJvb2xlYW4gdCA9IHRlc3RDbGllbnQudGVzdEJvb2wodHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHQpOworICAgIGJvb2xlYW4gZiA9IHRlc3RDbGllbnQudGVzdEJvb2woZmFsc2UpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZik7CisgIH0KKwogICBwcml2YXRlIHZvaWQgdGVzdEJ5dGUoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgaTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwogICAgIGFzc2VydEVxdWFscygxLCBpOCk7CkBAIC0zMTgsNyArMzM1LDcgQEAKICAgLy8gdG9kbzogYWRkIGFzc2VydGlvbnMKICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnNhbml0eShUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgSW5zYW5pdHkgaW5zYW5lOwotICAKKwogICAgIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwogICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1MDAwKTsKQEAgLTMzNiw3ICszNTMsNyBAQAogICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CiAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7Ci0gIAorCiAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWwuZ2V0KGsyKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOwpAQCAtMzQ4LDcgKzM2NSw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwotICAKKwogICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgewpAQCAtMzU3LDcgKzM3NCw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKLSAgCisKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICB9CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKQEAgLTM2NSwxMSArMzgyLDE0IEBACiAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CiAgIH0KIAorICBwdWJsaWMgYm9vbGVhbiB1c2VBc3luY1Byb2Nlc3NvcigpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7Ci0gICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHVzZUFzeW5jUHJvY2Vzc29yKCkgPyBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3NvcjxBc3luY1Rlc3RIYW5kbGVyPihuZXcgQXN5bmNUZXN0SGFuZGxlcigpKSA6IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4obmV3IFRlc3RIYW5kbGVyKCkpOwogCiAgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSk7CiAKQEAgLTM4Myw2ICs0MDMsNyBAQAogICAgICAgb3Blbih0cmFuc3BvcnQpOwogICAgICAgdGVzdFZvaWQodGVzdENsaWVudCk7CiAgICAgICB0ZXN0U3RyaW5nKHRlc3RDbGllbnQpOworICAgICAgdGVzdEJvb2wodGVzdENsaWVudCk7CiAgICAgICB0ZXN0Qnl0ZSh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RJMzIodGVzdENsaWVudCk7CiAgICAgICB0ZXN0STY0KHRlc3RDbGllbnQpOwpAQCAtMzkwLDE0ICs0MTEsMTggQEAKICAgICAgIHRlc3RTdHJ1Y3QodGVzdENsaWVudCk7CiAgICAgICB0ZXN0TmVzdGVkU3RydWN0KHRlc3RDbGllbnQpOwogICAgICAgdGVzdE1hcCh0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RTdHJpbmdNYXAodGVzdENsaWVudCk7CiAgICAgICB0ZXN0U2V0KHRlc3RDbGllbnQpOwogICAgICAgdGVzdExpc3QodGVzdENsaWVudCk7CiAgICAgICB0ZXN0RW51bSh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RUeXBlZGVmKHRlc3RDbGllbnQpOwogICAgICAgdGVzdE5lc3RlZE1hcCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RJbnNhbml0eSh0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RFeGNlcHRpb24odGVzdENsaWVudCk7CiAgICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOworICAgICAgdGVzdEkzMih0ZXN0Q2xpZW50KTsKICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc29ja2V0LmNsb3NlKCk7CiAKICAgICAgIHN0b3BTZXJ2ZXIoKTsKICAgICB9CkBAIC00MDgsNyArNDMzLDcgQEAKICAgfQogCiAgIHB1YmxpYyBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IGdldFByb3RvY29scygpIHsKLSAgICByZXR1cm4gUFJPVE9DT0xTOyAgCisgICAgcmV0dXJuIFBST1RPQ09MUzsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0TGlzdChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC00MjksMTkgKzQ1NCwyOSBAQAogICAgIGFzc2VydEVxdWFscyhtYXBvdXQsIG1hcGluKTsKICAgfQogCisgIHByaXZhdGUgdm9pZCB0ZXN0U3RyaW5nTWFwKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLFN0cmluZz4gbWFwb3V0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKKyAgICBtYXBvdXQucHV0KCJhIiwgIjEyMyIpOworICAgIG1hcG91dC5wdXQoIiB4IHkgIiwgIiB3aXRoIHNwYWNlcyAiKTsKKyAgICBtYXBvdXQucHV0KCJzYW1lIiwgInNhbWUiKTsKKyAgICBtYXBvdXQucHV0KCIwIiwgIm51bWVyaWMga2V5Iik7CisgICAgTWFwPFN0cmluZyxTdHJpbmc+IG1hcGluID0gdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKG1hcG91dCk7CisgICAgYXNzZXJ0RXF1YWxzKG1hcG91dCwgbWFwaW4pOworICB9CisKICAgcHJpdmF0ZSB2b2lkIHRlc3ROZXN0ZWRNYXAoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtbSA9CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNYXBNYXAoMSk7CiAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICB9Ci0gIAorCiAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7CiAgICAgYXNzZXJ0RXF1YWxzKG1hcG1hcCwgbW0pOwpAQCAtNDUzLDcgKzQ4OCwxMCBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RPbmV3YXkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOworICAgIGxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbjsKKyAgICBhc3NlcnRUcnVlKGVsYXBzZWQgPCA1MDApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXQoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNDgyLDQgKzUyMCwxOTIgQEAKICAgICB0ZXN0Q2xpZW50LnRlc3RWb2lkKCk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YmxpYyBpbnQgY291bnQgPSAwOworICAgIHByaXZhdGUgZmluYWwgRmFjdG9yeSBmYWN0b3J5OworCisgICAgcHVibGljIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkoRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICBjb3VudCsrOworICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgeworICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+IHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4oaGFuZGxlcik7CisKKyAgICAgIGZpbmFsIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSk7CisKKyAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5LCBmYWN0b3J5KTsKKyAgICAgIGFzc2VydEVxdWFscygwLCBmYWN0b3J5LmNvdW50KTsKKworICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBQT1JUKTsKKyAgICAgIHNvY2tldC5zZXRUaW1lb3V0KFNPQ0tFVF9USU1FT1VUKTsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0Q2xpZW50VHJhbnNwb3J0KHNvY2tldCk7CisgICAgICBvcGVuKHRyYW5zcG9ydCk7CisKKyAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkgMCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZhY3RvcnkuY291bnQpOworICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICBzdG9wU2VydmVyKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RFeGNlcHRpb24oVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24sIFhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOworICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7CisgICAgICBhc3NlcnRFcXVhbHMoZS5lcnJvckNvZGUsIDEwMDEpOworICAgIH0KKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfSBjYXRjaChURXhjZXB0aW9uIGUpIHsKKyAgICB9CisgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKKyAgfQorCisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Rlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5Bc3luY0lmYWNlIHsKKworICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPFN0cmluZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFN0cmluZyh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJvb2wodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZShieXRlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJ5dGU+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCeXRlKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEkzMihpbnQgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEkzMih0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJNjQobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMb25nPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0STY0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZShkb3VibGUgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8RG91YmxlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0RG91YmxlKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJpbmFyeShCeXRlQnVmZmVyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJ5dGVCdWZmZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCaW5hcnkodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3Q+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJ1Y3QodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPFh0cnVjdDI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3ROZXN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsIEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ01hcChNYXA8U3RyaW5nLCBTdHJpbmc+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxTdHJpbmcsIFN0cmluZz4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmdNYXAodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0KFNldDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTZXQ8SW50ZWdlcj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTZXQodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdChMaXN0PEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExpc3Q8SW50ZWdlcj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RMaXN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEVudW0oTnVtYmVyeiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxOdW1iZXJ6PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0RW51bSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFR5cGVkZWYodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwTWFwKGludCBoZWxsbywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNYXBNYXAoaGVsbG8pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJbnNhbml0eShhcmd1bWVudCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIE1hcDxTaG9ydCwgU3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSwgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3Q+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNdWx0aShhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZywgQXN5bmNNZXRob2RDYWxsYmFjazxWb2lkPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RXhjZXB0aW9uKCIrYXJnKyIpXG4iKTsKKyAgICAgIGlmICgiWGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CisgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICAgIC8vIHRocm93IGFuZCBvbkVycm9yIHlpZWxkIHRoZSBzYW1lIHJlc3VsdC4KKyAgICAgICAgLy8gdGhyb3cgeDsKKyAgICAgICAgcmVzdWx0SGFuZGxlci5vbkVycm9yKHgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHJlc3VsdEhhbmRsZXIub25FcnJvcihuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CisgICAgICB9CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3Q+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIC8vVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2Vjb25kc1RvU2xlZXAsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaGFuZGxlci50ZXN0T25ld2F5KHNlY29uZHNUb1NsZWVwKTsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKKyAgICB9CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEFzeW5jU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0QXN5bmNTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM1NGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEFzeW5jU2VydmVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0QXN5bmNTZXJ2ZXIgZXh0ZW5kcyBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgeworCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIHVzZUFzeW5jUHJvY2Vzc29yKCl7CisgICAgICAgcmV0dXJuIHRydWU7CisgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggNTJiNjJjMy4uM2RmM2JkOCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKQEAgLTIwLDMxICsyMCw0MiBAQAogCiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXIuQXJnczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBTZXJ2ZXJUZXN0QmFzZSB7CiAKICAgcHJpdmF0ZSBUaHJlYWQgc2VydmVyVGhyZWFkOwogICBwcml2YXRlIFRTZXJ2ZXIgc2VydmVyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1FVRVJJRVMgPSAxMDAwOwogCi0gIHByb3RlY3RlZCBUU2VydmVyIGdldFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHNvY2tldCwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHsKLSAgICByZXR1cm4gbmV3IFROb25ibG9ja2luZ1NlcnZlcihuZXcgQXJncyhzb2NrZXQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpLnByb3RvY29sRmFjdG9yeShwcm90b0ZhY3RvcnkpKTsKKyAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgeworICAgIGZpbmFsIEFyZ3MgYXJncyA9IG5ldyBBcmdzKHNvY2tldCkucHJvY2Vzc29yKHByb2Nlc3NvcikucHJvdG9jb2xGYWN0b3J5KHByb3RvRmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgYXJncy50cmFuc3BvcnRGYWN0b3J5KGZhY3RvcnkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFROb25ibG9ja2luZ1NlcnZlcihhcmdzKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb24geworICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnksIGZpbmFsIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBFeGNlcHRpb24gewogICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgLy8gVHJhbnNwb3J0CiAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQoUE9SVCkpOwogCi0gICAgICAgICAgc2VydmVyID0gZ2V0U2VydmVyKHByb2Nlc3NvciwgdFNlcnZlclNvY2tldCwgcHJvdG9GYWN0b3J5KTsKKyAgICAgICAgICBzZXJ2ZXIgPSBnZXRTZXJ2ZXIocHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBwcm90b0ZhY3RvcnksIGZhY3RvcnkpOwogCiAgICAgICAgICAgLy8gUnVuIGl0CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIFBPUlQgKyAiLi4uIik7CkBAIC03MSw0ICs4Miw0MiBAQAogICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZ1RyYW5zcG9ydCk7CiAgIH0KKworCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhbnVwQWxsU2VsZWN0aW9uS2V5cygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgeworICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpOworCisgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSk7CisKKyAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7CisgICAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldENsaWVudFRyYW5zcG9ydChzb2NrZXQpOworCisgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b0ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpOworCisgICAgICBvcGVuKHRyYW5zcG9ydCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1FVRVJJRVM7ICsraSkgeworICAgICAgICB0ZXN0Q2xpZW50LnRlc3RJMzIoMSk7CisgICAgICB9CisgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUVVFUklFUzsgKytpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0STMyKDEpOworICAgICAgICB9IGNhdGNoKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmYWlsKCJ0aW1lZCBvdXQgd2hlbiBpdCBzaG91bGQgaGF2ZSB0aHJvd24gYW5vdGhlciBraW5kIG9mIGVycm9yISIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIHN0b3BTZXJ2ZXIoKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0VGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0VGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VGhyZWFkZWRTZWxlY3RvclNlcnZlciBleHRlbmRzIFRlc3ROb25ibG9ja2luZ1NlcnZlciB7CisgIHByb3RlY3RlZCBUU2VydmVyIGdldFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHNvY2tldCwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHsKKyAgICByZXR1cm4gbmV3IFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyKG5ldyBBcmdzKHNvY2tldCkucHJvY2Vzc29yKHByb2Nlc3NvcikucHJvdG9jb2xGYWN0b3J5KHByb3RvRmFjdG9yeSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQppbmRleCBhZWUzYmJmLi5mZWFhOTcyIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKQEAgLTE5LDI1ICsxOSw0MCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRlc3Q7CiAKLS8vIEdlbmVyYXRlZCBjb2RlCi1pbXBvcnQgdGhyaWZ0LnRlc3QuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTaW1wbGVKU09OUHJvdG9jb2w7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CiAKIC8qKgogICogVGVzdCBKYXZhIGNsaWVudCBmb3IgdGhyaWZ0LiBFc3NlbnRpYWxseSBqdXN0IGEgY29weSBvZiB0aGUgQysrIHZlcnNpb24sCkBAIC00Niw3MCArNjEsMTUxIEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgVGVzdENsaWVudCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9CQVNFVFlQRVMgPSAxOworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1NUUlVDVFMgPSAyOworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1BST1RPQ09MUyA9IDE2OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1VOS05PV04gPSA2NDsKKwogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgIFN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgaW50IHBvcnQgPSA5MDkwOworICAgIGludCBudW1UZXN0cyA9IDE7CisgICAgU3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKKyAgICBTdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOworICAgIGJvb2xlYW4gc3NsID0gZmFsc2U7CisKKyAgICBpbnQgc29ja2V0VGltZW91dCA9IDEwMDA7CisKICAgICB0cnkgewotICAgICAgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKLSAgICAgIGludCBwb3J0ID0gOTA5MDsKLSAgICAgIFN0cmluZyB1cmwgPSBudWxsOwotICAgICAgaW50IG51bVRlc3RzID0gMTsKLSAgICAgIGJvb2xlYW4gZnJhbWVkID0gZmFsc2U7Ci0KLSAgICAgIGludCBzb2NrZXRUaW1lb3V0ID0gMTAwMDsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItaCIpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBob3N0cG9ydCA9IChhcmdzWysraV0pLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICBob3N0ID0gaG9zdHBvcnRbMF07Ci0gICAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGhvc3Rwb3J0WzFdKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZiIpIHx8IGFyZ3NbaV0uZXF1YWxzKCItZnJhbWVkIikpIHsKLSAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7Ci0gICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXUiKSkgewotICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOwotICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1uIikpIHsKLSAgICAgICAgICAgIG51bVRlc3RzID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXRpbWVvdXQiKSkgewotICAgICAgICAgICAgc29ja2V0VGltZW91dCA9IEludGVnZXIudmFsdWVPZihhcmdzWysraV0pOwotICAgICAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgeworICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLWhvc3QiKSkgeworICAgICAgICAgIGhvc3QgPSBhcmdzW2ldLnNwbGl0KCI9IilbMV07CisgICAgICAgICAgaG9zdC50cmltKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXBvcnQiKSkgeworICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tbiIpIHx8CisgICAgICAgICAgICBhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tdGVzdGxvb3BzIikpeworICAgICAgICAgIG51bVRlc3RzID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tdGltZW91dCIpKSB7CisgICAgICAgICAgc29ja2V0VGltZW91dCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wcm90b2NvbCIpKSB7CisgICAgICAgICAgcHJvdG9jb2xfdHlwZSA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICBwcm90b2NvbF90eXBlLnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tdHJhbnNwb3J0IikpIHsKKyAgICAgICAgICB0cmFuc3BvcnRfdHlwZSA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICB0cmFuc3BvcnRfdHlwZS50cmltKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tc3NsIikpIHsKKyAgICAgICAgICBzc2wgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhvc3Q9YXJnICg9IiArIGhvc3QgKyAiKVx0SG9zdCB0byBjb25uZWN0Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcG9ydD1hcmcgKD0iICsgcG9ydCArICIpXHRQb3J0IG51bWJlciB0byBjb25uZWN0Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tdHJhbnNwb3J0PWFyZyAoPSIgKyB0cmFuc3BvcnRfdHlwZSArICIpXG5cdFx0XHRcdFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgZmFzdGZyYW1lZCwgaHR0cCIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByb3RvY29sPWFyZyAoPSIgKyBwcm90b2NvbF90eXBlICsgIilcdFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNzbFx0XHRcdEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tdGVzdGxvb3BzWy0tbl09YXJnICg9IiArIG51bVRlc3RzICsgIilcdE51bWJlciBvZiBUZXN0cyIpOworICAgICAgICAgIFN5c3RlbS5leGl0KDApOwogICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbiBub3QgcGFyc2UgYXJndW1lbnRzISBTZWUgLS1oZWxwIik7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQogCi0gICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICB0cnkgeworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJiaW5hcnkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBwcm90b2NvbCB0eXBlISAiICsgcHJvdG9jb2xfdHlwZSk7CisgICAgICB9CisgICAgICBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJidWZmZXJlZCIpKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZnJhbWVkIikpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJodHRwIikpIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gdHJhbnNwb3J0IHR5cGUhICIgKyB0cmFuc3BvcnRfdHlwZSk7CisgICAgICB9CisgICAgICBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJodHRwIikgJiYgc3NsID09IHRydWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU1NMIGlzIG5vdCBzdXBwb3J0ZWQgb3ZlciBodHRwLiIpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOworICAgIH0KIAotICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly8iICsgaG9zdCArICI6IiArIHBvcnQgKyAiL3NlcnZpY2UiOwogICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJsKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgaWYgKHNzbCA9PSB0cnVlKSB7CisgICAgICAgICAgc29ja2V0ID0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KGhvc3QsIHBvcnQsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNvY2tldCA9IG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpOworICAgICAgICB9CiAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHNvY2tldFRpbWVvdXQpOwogICAgICAgICB0cmFuc3BvcnQgPSBzb2NrZXQ7Ci0gICAgICAgIGlmIChmcmFtZWQpIHsKKyAgICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiYnVmZmVyZWQiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZnJhbWVkIikpIHsKICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZmFzdGZyYW1lZCIpKSB7CisgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKKyAgICB9CiAKLSAgICAgIFRCaW5hcnlQcm90b2NvbCBiaW5hcnlQcm90b2NvbCA9Ci0gICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPQotICAgICAgICBuZXcgVGhyaWZ0VGVzdC5DbGllbnQoYmluYXJ5UHJvdG9jb2wpOwotICAgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgVFByb3RvY29sIHRQcm90b2NvbCA9IG51bGw7CisgICAgVFByb3RvY29sIHRQcm90b2NvbDIgPSBudWxsOworICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgdFByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIH0gZWxzZSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgfQogCi0gICAgICBsb25nIHRpbWVNaW4gPSAwOwotICAgICAgbG9uZyB0aW1lTWF4ID0gMDsKLSAgICAgIGxvbmcgdGltZVRvdCA9IDA7CisgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgdFByb3RvY29sMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wodFByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICAgIH0KIAotICAgICAgZm9yIChpbnQgdGVzdCA9IDA7IHRlc3QgPCBudW1UZXN0czsgKyt0ZXN0KSB7CisgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudCh0UHJvdG9jb2wpOworICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwogCisgICAgbG9uZyB0aW1lTWluID0gMDsKKyAgICBsb25nIHRpbWVNYXggPSAwOworICAgIGxvbmcgdGltZVRvdCA9IDA7CisKKyAgICBpbnQgcmV0dXJuQ29kZSA9IDA7CisgICAgZm9yIChpbnQgdGVzdCA9IDA7IHRlc3QgPCBudW1UZXN0czsgKyt0ZXN0KSB7CisgICAgICB0cnkgewogICAgICAgICAvKioKICAgICAgICAgICogQ09OTkVDVCBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgIyIgKyAodGVzdCsxKSArICIsICIgKyAiY29ubmVjdCAiICsgaG9zdCArICI6IiArIHBvcnQpOwotICAgICAgICB0cnkgewotICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0IGZhaWxlZDogIiArIHR0eC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICh0cmFuc3BvcnQuaXNPcGVuKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICAgICAgdHR4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0IGZhaWxlZDogIiArIHR0eC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOworICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKQEAgLTEyMyw2ICsyMTksNyBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHZvaWRcbiIpOwogICAgICAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gdGF4KSB7CiAgICAgICAgICAgdGF4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTMxLDEzICsyMjgsMzQgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKICAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CisgICAgICAgIGlmICghcy5lcXVhbHMoIlRlc3QiKSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogTXVsdGlwbGV4ZWQgdGVzdAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgICAgIFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZENsaWVudCA9IG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudCh0UHJvdG9jb2wyKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJzZWNvbmR0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICBzID0gc2Vjb25kQ2xpZW50LnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CisgICAgICAgICAgaWYgKCFzLmVxdWFscygidGVzdFN0cmluZyhcIlRlc3QyXCIpIikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1BST1RPQ09MUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqCiAgICAgICAgICAqIEJZVEUgVEVTVAogICAgICAgICAgKi8KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJ5dGUoMSkiKTsKICAgICAgICAgYnl0ZSBpOCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpMSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpOCArICJcbiIpOworICAgICAgICBpZiAoaTggIT0gMSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogSTMyIFRFU1QKQEAgLTE0NSw2ICsyNjMsMTAgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEkzMigtMSkiKTsKICAgICAgICAgaW50IGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpMzIgKyAiXG4iKTsKKyAgICAgICAgaWYgKGkzMiAhPSAtMSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogSTY0IFRFU1QKQEAgLTE1MiwxMyArMjc0LDUyIEBACiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOwogICAgICAgICBsb25nIGk2NCA9IHRlc3RDbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjhMKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGk2NCArICJcbiIpOworICAgICAgICBpZiAoaTY0ICE9IC0zNDM1OTczODM2OEwpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIERPVUJMRSBURVNUCiAgICAgICAgICAqLwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KSIpOwotICAgICAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKDUuMzI1MDk4MjM1KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdERvdWJsZSgtNS4zMjUwOTgyMzUpIik7CisgICAgICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoLTUuMzI1MDk4MjM1KTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGR1YiArICJcbiIpOworICAgICAgICBpZiAoTWF0aC5hYnMoZHViIC0gKC01LjMyNTA5ODIzNSkpID4gMC4wMDEpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJJTkFSWSBURVNUCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoLTEyOC4uLjEyNykgPSAiKTsKKyAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwgLTk4LCAtOTcsIC05NiwgLTk1LCAtOTQsIC05MywgLTkyLCAtOTEsIC05MCwgLTg5LCAtODgsIC04NywgLTg2LCAtODUsIC04NCwgLTgzLCAtODIsIC04MSwgLTgwLCAtNzksIC03OCwgLTc3LCAtNzYsIC03NSwgLTc0LCAtNzMsIC03MiwgLTcxLCAtNzAsIC02OSwgLTY4LCAtNjcsIC02NiwgLTY1LCAtNjQsIC02MywgLTYyLCAtNjEsIC02MCwgLTU5LCAtNTgsIC01NywgLTU2LCAtNTUsIC01NCwgLTUzLCAtNTIsIC01MSwgLTUwLCAtNDksIC00OCwgLTQ3LCAtNDYsIC00NSwgLTQ0LCAtNDMsIC00MiwgLTQxLCAtNDAsIC0zOSwgLTM4LCAtMzcsIC0zNiwgLTM1LCAtMzQsIC0zMywgLTMyLCAtMzEsIC0zMCwgLTI5LCAtMjgsIC0yNywgLTI2LCAtMjUsIC0yNCwgLTIzLCAtMjIsIC0yMSwgLTIwLCAtMTksIC0xOCwgLTE3LCAtMTYsIC0xNSwgLTE0LCAtMTMsIC0xMiwgLTExLCAtMTAsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyN307CisgICAgICAgICAgQnl0ZUJ1ZmZlciBiaW4gPSB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICAgICAgICBiaW4ubWFyaygpOworICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2Jpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCldOworICAgICAgICAgIGJpbi5nZXQoYnl0ZXMpOworICAgICAgICAgIGJpbi5yZXNldCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGJ5dGVzW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLndyYXAoZGF0YSkuZXF1YWxzKGJpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU1RSVUNUIFRFU1QKQEAgLTE3MCw3ICszMzEsMTUgQEAKICAgICAgICAgb3V0LmkzMl90aGluZyA9IC0zOwogICAgICAgICBvdXQuaTY0X3RoaW5nID0gLTU7CiAgICAgICAgIFh0cnVjdCBpbiA9IHRlc3RDbGllbnQudGVzdFN0cnVjdChvdXQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArICJcIiIgKyBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpbi5ieXRlX3RoaW5nICsgIiwgIiArIGluLmkzMl90aGluZyArICIsICIgKyBpbi5pNjRfdGhpbmcgKyAifVxuIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pNjRfdGhpbmcgKyAifVxuIik7CisgICAgICAgIGlmICghaW4uZXF1YWxzKG91dCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKQEAgLTE4Miw3ICszNTEsMTYgQEAKICAgICAgICAgb3V0Mi5pMzJfdGhpbmcgPSA1OwogICAgICAgICBYdHJ1Y3QyIGluMiA9IHRlc3RDbGllbnQudGVzdE5lc3Qob3V0Mik7CiAgICAgICAgIGluID0gaW4yLnN0cnVjdF90aGluZzsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyBpbjIuYnl0ZV90aGluZyArICIsIHsiICsgIlwiIiArIGluLnN0cmluZ190aGluZyArICJcIiwgIiArIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsgaW4uaTMyX3RoaW5nICsgIiwgIiArIGluLmk2NF90aGluZyArICJ9LCAiICsgaW4yLmkzMl90aGluZyArICJ9XG4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyBpbjIuYnl0ZV90aGluZyArICIsIHsiICsgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5ieXRlX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTMyX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uaTY0X3RoaW5nICsgIn0sICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluMi5pMzJfdGhpbmcgKyAifVxuIik7CisgICAgICAgIGlmICghaW4yLmVxdWFscyhvdXQyKSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE1BUCBURVNUCkBAIC0yMTQsNiArMzkyLDQ5IEBACiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+ICIgKyBtYXBvdXQuZ2V0KGtleSkpOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIW1hcG91dC5lcXVhbHMobWFwaW4pKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU1RSSU5HIE1BUCBURVNUCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc21hcG91dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJhIiwgIjIiKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgiYiIsICJibGFoIik7CisgICAgICAgICAgc21hcG91dC5wdXQoInNvbWUiLCAidGhpbmciKTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzbWFwb3V0LmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHNtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc21hcGluID0gdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKHNtYXBvdXQpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKKyAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc21hcGluLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHNtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgICBpZiAoIXNtYXBvdXQuZXF1YWxzKHNtYXBpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU0VUIFRFU1QKQEAgLTI0NSw2ICs0NjYsMTAgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIXNldG91dC5lcXVhbHMoc2V0aW4pKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogTElTVCBURVNUCkBAIC0yNzYsNiArNTAxLDEwIEBACiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChlbGVtKTsKICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgaWYgKCFsaXN0b3V0LmVxdWFscyhsaXN0aW4pKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogRU5VTSBURVNUCkBAIC0yODMsMjIgKzUxMiw0MiBAQAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShPTkUpIik7CiAgICAgICAgIE51bWJlcnogcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyByZXQgKyAiXG4iKTsKKyAgICAgICAgaWYgKHJldCAhPSBOdW1iZXJ6Lk9ORSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oVFdPKSIpOwogICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouVFdPKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShUSFJFRSkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouVEhSRUUpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKEZJVkUpIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRklWRSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oRUlHSFQpIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyByZXQgKyAiXG4iKTsKKyAgICAgICAgaWYgKHJldCAhPSBOdW1iZXJ6LkVJR0hUKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogVFlQRURFRiBURVNUCkBAIC0zMDYsNiArNTU1LDEwIEBACiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKICAgICAgICAgbG9uZyB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgdWlkICsgIlxuIik7CisgICAgICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogTkVTVEVEIE1BUCBURVNUCkBAIC0zMjMsNjQgKzU3NiwxODcgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgaWYgKG1tLnNpemUoKSAhPSAyIHx8ICFtbS5jb250YWluc0tleSg0KSB8fCAhbW0uY29udGFpbnNLZXkoLTQpKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0xID0gbW0uZ2V0KDQpOworICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtMiA9IG1tLmdldCgtNCk7CisgICAgICAgICAgaWYgKG0xLmdldCgxKSAhPSAxIHx8IG0xLmdldCgyKSAhPSAyIHx8IG0xLmdldCgzKSAhPSAzIHx8IG0xLmdldCg0KSAhPSA0IHx8CisgICAgICAgICAgICAgIG0yLmdldCgtMSkgIT0gLTEgfHwgbTIuZ2V0KC0yKSAhPSAtMiB8fCBtMi5nZXQoLTMpICE9IC0zIHx8IG0yLmdldCgtNCkgIT0gLTQpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIElOU0FOSVRZIFRFU1QKICAgICAgICAgICovCi0gICAgICAgIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICBpbnNhbmUudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7Ci0gICAgICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUwMDApOwotICAgICAgICBYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7Ci0gICAgICAgIHRydWNrLmJ5dGVfdGhpbmcgPSAoYnl0ZSk4OwotICAgICAgICB0cnVjay5pMzJfdGhpbmcgPSA4OwotICAgICAgICB0cnVjay5pNjRfdGhpbmcgPSA4OwotICAgICAgICBpbnNhbmUueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOwotICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQodHJ1Y2spOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IHdob2EgPQotICAgICAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKLSAgICAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKLSAgICAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4geyIpOwogCi0gICAgICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOwotICAgICAgICAgICAgTWFwPE51bWJlcnosIExvbmc+IHVzZXJNYXAgPSB2Mi51c2VyTWFwOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwotICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICBmb3IgKE51bWJlcnogazMgOiB1c2VyTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICBib29sZWFuIGluc2FuaXR5RmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgICAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7CisgICAgICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgICAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKKworICAgICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7CisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoZ29vZGJ5ZSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKGhlbGxvKTsKKworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiB3aG9hID0KKyAgICAgICAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CisgICAgICAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBMb25nPiB1c2VyTWFwID0gdjIudXNlck1hcDsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGszIDogdXNlck1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogCi0gICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7Ci0gICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIgKyAiXCIiICsgeC5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LmJ5dGVfdGhpbmcgKyAiLCAiICsgeC5pMzJfdGhpbmcgKyAiLCAiKyB4Lmk2NF90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi54dHJ1Y3RzOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CisgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFh0cnVjdCB4IDogeHRydWN0cykgeworICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIgKyAiXCIiICsgeC5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LmJ5dGVfdGhpbmcgKyAiLCAiICsgeC5pMzJfdGhpbmcgKyAiLCAiKyB4Lmk2NF90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOwogCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICAgIGlmICh3aG9hLnNpemUoKSA9PSAyICYmIHdob2EuY29udGFpbnNLZXkoMUwpICYmIHdob2EuY29udGFpbnNLZXkoMkwpKSB7CisgICAgICAgICAgICBNYXA8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IHdob2EuZ2V0KDFMKTsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gc2Vjb25kX21hcCA9IHdob2EuZ2V0KDJMKTsKKyAgICAgICAgICAgIGlmIChmaXJzdF9tYXAuc2l6ZSgpID09IDIgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5UV08pICYmCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwLmNvbnRhaW5zS2V5KE51bWJlcnouVEhSRUUpICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgIHNlY29uZF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5TSVgpICYmCisgICAgICAgICAgICAgICAgaW5zYW5lLmVxdWFscyhmaXJzdF9tYXAuZ2V0KE51bWJlcnouVFdPKSkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5USFJFRSkpKSB7CisgICAgICAgICAgICAgIEluc2FuaXR5IHNpeCA9c2Vjb25kX21hcC5nZXQoTnVtYmVyei5TSVgpOworICAgICAgICAgICAgICAvLyBDYW5ub3QgdXNlICJuZXcgSW5zYW5pdHkoKS5lcXVhbHMoc2l4KSIgYmVjYXVzZSBhcyBvZiBub3csIHN0cnVjdC9jb250YWluZXIKKyAgICAgICAgICAgICAgLy8gZmllbGRzIHdpdGggZGVmYXVsdCByZXF1aXJlZG5lc3MgaGF2ZSBpc3NldD1mYWxzZSBmb3IgbG9jYWwgaW5zdGFuY2VzIGFuZCB5ZXQKKyAgICAgICAgICAgICAgLy8gcmVjZWl2ZWQgZW1wdHkgdmFsdWVzIGZyb20gb3RoZXIgbGFuZ3VhZ2VzIGxpa2UgQysrIGhhdmUgaXNzZXQ9dHJ1ZSAuCisgICAgICAgICAgICAgIGlmIChzaXguZ2V0VXNlck1hcFNpemUoKSA9PSAwICYmIHNpeC5nZXRYdHJ1Y3RzU2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICBpbnNhbml0eUZhaWxlZCA9IGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoaW5zYW5pdHlGYWlsZWQpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIFRlc3Qgb25ld2F5CisgICAgICAgIC8qKgorICAgICAgICAgKiBFWEVDUFRJT04gVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOworICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyVkLCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9IGNhdGNoKFRFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHtcIiVzXCJ9XG4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbiIpOworICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1VTFRJIEVYQ0VQVElPTiBURVNUCisgICAgICAgICAqLworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAidGVzdCAxIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyVkLCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9IGNhdGNoKFhjZXB0aW9uMiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyVkLCB7XCIlc1wifX1cbiIsIGUuZXJyb3JDb2RlLCBlLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKKyAgICAgICAgICBYdHJ1Y3QgcmVzdWx0OworICAgICAgICAgIHJlc3VsdCA9IHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgInRlc3QgMyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHt7XCIlc1wifX1cbiIsIHJlc3VsdC5zdHJpbmdfdGhpbmcpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9ORVdBWSBURVNUCisgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0T25ld2F5KDMpLi4uIik7CiAgICAgICAgIGxvbmcgc3RhcnRPbmV3YXkgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOwogICAgICAgICBsb25nIG9uZXdheUVsYXBzZWRNaWxsaXMgPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydE9uZXdheSkgLyAxMDAwMDAwOwogICAgICAgICBpZiAob25ld2F5RWxhcHNlZE1pbGxpcyA+IDIwMCkgewotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk9uZXdheSB0ZXN0IGZhaWxlZDogdG9vayAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcob25ld2F5RWxhcHNlZE1pbGxpcykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPbmV3YXkgdGVzdCBmYWlsZWQ6IHRvb2sgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcob25ld2F5RWxhcHNlZE1pbGxpcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXMiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZXNzIC0gdG9vayAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCkBAIC00MDIsMjIgKzc3OCwyOSBAQAogICAgICAgICB0aW1lVG90ICs9IHRvdDsKIAogICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9VTktOT1dOOwogICAgICAgfQotCi0gICAgICBsb25nIHRpbWVBdmcgPSB0aW1lVG90IC8gbnVtVGVzdHM7Ci0KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluIHRpbWU6ICIgKyB0aW1lTWluLzEwMDAgKyAidXMiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4IHRpbWU6ICIgKyB0aW1lTWF4LzEwMDAgKyAidXMiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXZnIHRpbWU6ICIgKyB0aW1lQXZnLzEwMDAgKyAidXMiKTsKLQotICAgICAgU3RyaW5nIGpzb24gPSAobmV3IFRTZXJpYWxpemVyKG5ldyBUU2ltcGxlSlNPTlByb3RvY29sLkZhY3RvcnkoKSkpLnRvU3RyaW5nKGluc2FuZSk7Ci0KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Gb3IgZ29vZCBtZWF1c3JlIGhlcmUgaXMgc29tZSBKU09OOlxuIiArIGpzb24pOwotCi0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKLSAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgfQogCi0gIH0KKyAgICBsb25nIHRpbWVBdmcgPSB0aW1lVG90IC8gbnVtVGVzdHM7CiAKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1pbiB0aW1lOiAiICsgdGltZU1pbi8xMDAwICsgInVzIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXggdGltZTogIiArIHRpbWVNYXgvMTAwMCArICJ1cyIpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXZnIHRpbWU6ICIgKyB0aW1lQXZnLzEwMDAgKyAidXMiKTsKKworICAgIHRyeSB7CisgICAgICBTdHJpbmcganNvbiA9IChuZXcgVFNlcmlhbGl6ZXIobmV3IFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSgpKSkudG9TdHJpbmcoaW5zYW5lKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TYW1wbGUgVFNpbXBsZUpTT05Qcm90b2NvbCBvdXRwdXQ6XG4iICsganNvbik7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB4KSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKiIpOworICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKworICAgIFN5c3RlbS5leGl0KHJldHVybkNvZGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggMTgzNDNiMC4uNDFjNGI2NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgICAvLyBUcmFuc3BvcnQKICAgICAgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB0U2VydmVyU29ja2V0ID0KLSAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KTsKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChwb3J0KSk7CiAKICAgICAgIFRTZXJ2ZXIgc2VydmVyRW5naW5lOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQppbmRleCBlNjU3NTZkLi4xZjNlNTU1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKQEAgLTI2LDE2ICsyNiwzMiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5TZXJ2ZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyLkFyZ3M7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTaW1wbGVTZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRUaHJlYWRQb29sU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2VydmVyU29ja2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5TZXJ2ZXJUZXN0QmFzZS5UZXN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZlckV2ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlROb25ibG9ja2luZ1NlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKIAogaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OwogaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZTsKIGltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uOwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uMjsKQEAgLTQ0LDM4ICs2MCwyNDYgQEAKIAogcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIgewogCisgIC8vIE11bHRpcGxleGVkIFByb3RvY29sIFN1cHBvcnQgRGV0YWlsczoKKyAgLy8KKyAgLy8gRm9yIG11bHRpcGxleGVkIHRlc3Rpbmcgd2UgYWx3YXlzIHVzZSBiaW5hcnkgcHJvdG9jb2wgdW5kZXJuZWF0aC4KKyAgLy8KKyAgLy8gIlRocmlmdFRlc3QiIG5hbWVkIHNlcnZpY2UgaW1wbGVtZW50cyAiVGhyaWZ0VGVzdCIgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorICAvLyAiU2Vjb25kU2VydmljZSIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJTZWNvbmRTZXJ2aWNlIiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vIEluIGFkZGl0aW9uLCB0byBzdXBwb3J0IG9sZGVyIG5vbi1tdWx0aXBsZXhlZCBjbGllbnRzIHVzaW5nIHRoZSBzYW1lIGNvbmNyZXRlIHByb3RvY29sCisgIC8vIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaXMgdGF1Z2h0IHRvIHVzZSAiVGhyaWZ0VGVzdCIgaWYgdGhlIGluY29taW5nIHJlcXVlc3QgaGFzIG5vCisgIC8vIG11bHRpcGxleGVkIGNhbGwgbmFtZSBkZWNvcmF0aW9uLgorCisgIHN0YXRpYyBjbGFzcyBTZWNvbmRIYW5kbGVyIGltcGxlbWVudHMgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZS5JZmFjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdGhpbmcpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeyByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsgfQorCisgIH0KKworICBzdGF0aWMgY2xhc3MgVGVzdFNlcnZlckNvbnRleHQgaW1wbGVtZW50cyBTZXJ2ZXJDb250ZXh0IHsKKworICAgICAgICBpbnQgY29ubmVjdGlvbklkOworCisgICAgICAgIHB1YmxpYyBUZXN0U2VydmVyQ29udGV4dChpbnQgY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25JZChpbnQgY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgfQorCisgIH0KKworICBzdGF0aWMgY2xhc3MgVGVzdFNlcnZlckV2ZW50SGFuZGxlciBpbXBsZW1lbnRzIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG5leHRDb25uZWN0aW9uSWQgPSAxOworCisgICAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUU2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlIC0gY2FsbGVkIG9ubHkgb25jZSBiZWZvcmUgc2VydmVyIHN0YXJ0cyBhY2NlcHRpbmcgY29ubmVjdGlvbnMiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXJ2ZXJDb250ZXh0IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7CisgICAgICAgICAgICAvL3dlIGNhbiBjcmVhdGUgc29tZSBjb25uZWN0aW9uIGxldmVsIGRhdGEgd2hpY2ggaXMgc3RvcmVkIHdoaWxlIGNvbm5lY3Rpb24gaXMgYWxpdmUgJiBzZXJ2ZWQKKyAgICAgICAgICAgIFRlc3RTZXJ2ZXJDb250ZXh0IGN0eCA9IG5ldyBUZXN0U2VydmVyQ29udGV4dChuZXh0Q29ubmVjdGlvbklkKyspOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUU2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQgLSBjb25uZWN0aW9uICMiK2N0eC5nZXRDb25uZWN0aW9uSWQoKSsiIGVzdGFibGlzaGVkIik7CisgICAgICAgICAgICByZXR1cm4gY3R4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGV4dChTZXJ2ZXJDb250ZXh0IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkgeworICAgICAgICAgICAgVGVzdFNlcnZlckNvbnRleHQgY3R4ID0gKFRlc3RTZXJ2ZXJDb250ZXh0KXNlcnZlckNvbnRleHQ7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgdGVybWluYXRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoU2VydmVyQ29udGV4dCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0LCBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCkgeworICAgICAgICAgICAgVGVzdFNlcnZlckNvbnRleHQgY3R4ID0gKFRlc3RTZXJ2ZXJDb250ZXh0KXNlcnZlckNvbnRleHQ7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQgLSBjb25uZWN0aW9uICMiK2N0eC5nZXRDb25uZWN0aW9uSWQoKSsiIGlzIHJlYWR5IHRvIHByb2Nlc3MgbmV4dCByZXF1ZXN0Iik7CisgICAgICAgIH0KKworICB9CisKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKICAgICB0cnkgewogICAgICAgaW50IHBvcnQgPSA5MDkwOwotICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgewotICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbMF0pOworICAgICAgYm9vbGVhbiBzc2wgPSBmYWxzZTsKKyAgICAgIFN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CisgICAgICBTdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOworICAgICAgU3RyaW5nIHNlcnZlcl90eXBlID0gInRocmVhZC1wb29sIjsKKyAgICAgIFN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgICAgICBpbnQgc3RyaW5nX2xpbWl0ID0gLTE7CisgICAgICBpbnQgY29udGFpbmVyX2xpbWl0ID0gLTE7CisgICAgICB0cnkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXBvcnQiKSkgeworICAgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXNlcnZlci10eXBlIikpIHsKKyAgICAgICAgICAgIHNlcnZlcl90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgc2VydmVyX3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXBvcnQiKSkgeworICAgICAgICAgICAgcG9ydD1JbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcHJvdG9jb2wiKSkgeworICAgICAgICAgICAgcHJvdG9jb2xfdHlwZSA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICAgIHByb3RvY29sX3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXRyYW5zcG9ydCIpKSB7CisgICAgICAgICAgICB0cmFuc3BvcnRfdHlwZSA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXNzbCIpKSB7CisgICAgICAgICAgICBzc2wgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXN0cmluZy1saW1pdCIpKSB7CisgICAgICAgICAgICBzdHJpbmdfbGltaXQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1jb250YWluZXItbGltaXQiKSkgeworICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1oZWxwIikpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRyYW5zcG9ydD1hcmcgKD0iICsgdHJhbnNwb3J0X3R5cGUgKyAiKVxuXHRcdFx0XHRUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGZhc3RmcmFtZWQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByb3RvY29sPWFyZyAoPSIgKyBwcm90b2NvbF90eXBlICsgIilcdFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNlcnZlci10eXBlPWFyZyAoPSIgKyBzZXJ2ZXJfdHlwZSArIilcblx0XHRcdFx0VHlwZSBvZiBzZXJ2ZXI6IHNpbXBsZSwgdGhyZWFkLXBvb2wsIG5vbmJsb2NraW5nLCB0aHJlYWRlZC1zZWxlY3RvciIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3RyaW5nLWxpbWl0PWFyZyAoPSIgKyBzdHJpbmdfbGltaXQgKyAiKVx0U3RyaW5nIHJlYWQgbGVuZ3RoIGxpbWl0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1jb250YWluZXItbGltaXQ9YXJnICg9IiArIGNvbnRhaW5lcl9saW1pdCArICIpXHRDb250YWluZXIgcmVhZCBsZW5ndGggbGltaXQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW4gbm90IHBhcnNlIGFyZ3VtZW50cyEgU2VlIC0taGVscCIpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgIH0KLSAgICAgIC8vQFRPRE8gYWRkIG90aGVyIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgdHlwZXMKIAotICAgICAgLy8gUHJvY2Vzc29yCi0gICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9Ci0gICAgICAgIG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJzaW1wbGUiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkLXBvb2wiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIGlmIChzc2wgPT0gdHJ1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU1NMIGlzIG5vdCBzdXBwb3J0ZWQgb3ZlciBub25ibG9ja2luZyBzZXJ2ZXJzISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikpIHsKKyAgICAgICAgICBpZiAoc3NsID09IHRydWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNTTCBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgbm9uYmxvY2tpbmcgc2VydmVycyEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBzZXJ2ZXIgdHlwZSEgIiArIHNlcnZlcl90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHRyYW5zcG9ydCB0eXBlISAiICsgdHJhbnNwb3J0X3R5cGUpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIH0KIAotICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICBUU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICBuZXcgVFNlcnZlclNvY2tldChwb3J0KTsKKyAgICAgIC8vIFByb2Nlc3NvcnMKKyAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKworICAgICAgU2Vjb25kSGFuZGxlciBzZWNvbmRIYW5kbGVyID0gbmV3IFNlY29uZEhhbmRsZXIoKTsKKyAgICAgIFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yIHNlY29uZFByb2Nlc3NvciA9IG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKTsKIAogICAgICAgLy8gUHJvdG9jb2wgZmFjdG9yeQotICAgICAgVFByb3RvY29sRmFjdG9yeSB0UHJvdG9jb2xGYWN0b3J5ID0KLSAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICBUUHJvdG9jb2xGYWN0b3J5IHRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KHN0cmluZ19saW1pdCwgY29udGFpbmVyX2xpbWl0KTsKKyAgICAgIH0gZWxzZSB7IC8vIGFsc28gY292ZXJzIG11bHRpCisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfQogCi0gICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKyAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKIAotICAgICAgLy8gU2ltcGxlIFNlcnZlcgotICAgICAgLy9zZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcihuZXcgQXJncyh0U2VydmVyU29ja2V0KS5wcm9jZXNzb3IodGVzdFByb2Nlc3NvcikpOworICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZnJhbWVkIikpIHsKKyAgICAgICAgdFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZmFzdGZyYW1lZCIpKSB7CisgICAgICAgIHRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgIH0gZWxzZSB7IC8vIC5lcXVhbHMoImJ1ZmZlcmVkIikgPT4gZGVmYXVsdCB2YWx1ZQorICAgICAgICB0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgfQogCi0gICAgICAvLyBUaHJlYWRQb29sIFNlcnZlcgotICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKG5ldyBUVGhyZWFkUG9vbFNlcnZlci5BcmdzKHRTZXJ2ZXJTb2NrZXQpLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSkpOworICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOworCisgICAgICAvLyBJZiB3ZSBhcmUgbXVsdGlwbGV4aW5nIHNlcnZpY2VzIGluIG9uZSBzZXJ2ZXIuLi4KKyAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdCAgKHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKKworICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSB8fAorICAgICAgICAgIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgeworICAgICAgICAvLyBOb25ibG9ja2luZyBzZXJ2ZXJzCisgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB0Tm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgPQorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQocG9ydCkpOworCisgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5jb250YWlucygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIC8vIE5vbmJsb2NraW5nIFNlcnZlcgorICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlci5BcmdzIHROb25ibG9ja2luZ1NlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyLkFyZ3ModE5vbmJsb2NraW5nU2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcih0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpCisgICAgICAgICAgLy8gVGhyZWFkZWRTZWxlY3RvciBTZXJ2ZXIKKyAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncworICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlcih0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBCbG9ja2luZyBzZXJ2ZXJzCisKKyAgICAgICAgLy8gU1NMIHNvY2tldAorICAgICAgICBUU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPSBudWxsOworICAgICAgICBpZiAoc3NsKSB7CisgICAgICAgICAgdFNlcnZlclNvY2tldCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChwb3J0LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0U2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLnBvcnQocG9ydCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygic2ltcGxlIikpIHsKKyAgICAgICAgICAvLyBTaW1wbGUgU2VydmVyCisgICAgICAgICAgVFNlcnZlci5BcmdzIHRTZXJ2ZXJBcmdzID0gbmV3IFRTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0U2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0U2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodFNlcnZlckFyZ3MpOworICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZHBvb2wiKQorICAgICAgICAgIC8vIFRocmVhZFBvb2wgU2VydmVyCisgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyB0VGhyZWFkUG9vbFNlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHRUaHJlYWRQb29sU2VydmVyQXJncyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU2V0IHNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICBzZXJ2ZXJFbmdpbmUuc2V0U2VydmVyRXZlbnRIYW5kbGVyKG5ldyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyKCkpOwogCiAgICAgICAvLyBSdW4gaXQKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgKyBwb3J0ICsgIi4uLiIpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgIiArIChzc2wgPyAic3NsIHNlcnZlciIgOiAic2VydmVyIikgKworICAgICAgICAiIFsiICsgcHJvdG9jb2xfdHlwZSArICIvIiArIHRyYW5zcG9ydF90eXBlICsgIi8iICsgc2VydmVyX3R5cGUgKyAiXSBvbiAiICsKKyAgICAgICAgKChkb21haW5fc29ja2V0ID09ICIiKSA/ICgicG9ydCAiICsgcG9ydCkgOiAoInVuaXggc29ja2V0ICIgKyBkb21haW5fc29ja2V0KSkpOwogICAgICAgc2VydmVyRW5naW5lLnNlcnZlKCk7CiAKICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YQppbmRleCA4NDc0MTg4Li4zYzc0OWY5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YQpAQCAtMjIsMjYgKzIyLDQwIEBACiBwdWJsaWMgY2xhc3MgUmVhZENvdW50aW5nVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAgIHB1YmxpYyBpbnQgcmVhZENvdW50ID0gMDsKICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zOworICBwcml2YXRlIGJvb2xlYW4gb3BlbiA9IHRydWU7CiAKICAgcHVibGljIFJlYWRDb3VudGluZ1RyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKICAgICB0cmFucyA9IHVuZGVybHlpbmc7CiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBvcGVuID0gZmFsc2U7CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkge3JldHVybiB0cnVlO30KKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiBvcGVuOworICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIG9wZW4gPSB0cnVlOworICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBpcyBjbG9zZWQiKTsKKyAgICB9CiAgICAgcmVhZENvdW50Kys7CiAgICAgcmV0dXJuIHRyYW5zLnJlYWQoYnVmLCBvZmYsIGxlbik7CiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiVHJhbnNwb3J0IGlzIGNsb3NlZCIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKaW5kZXggMzM3ZGNmOC4uYzM1MzQ4OSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiBwdWJsaWMgY2xhc3MgVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgLy8gaGFzIGV4cGVjdGVkIGluaXRpYWwgY2FwYWNpdHkKLSAgICBBdXRvRXhwYW5kaW5nQnVmZmVyIGIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcigxMCwgMS41KTsKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyIGIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcigxMCk7CiAgICAgYXNzZXJ0RXF1YWxzKDEwLCBiLmFycmF5KCkubGVuZ3RoKTsKIAogICAgIC8vIGRvZXNuJ3Qgc2hyaW5rCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCmluZGV4IDJlMWY5NDcuLjgzZWJjMmQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCB0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KDE1MCwgMS41KTsKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCB0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KDE1MCk7CiAKICAgICBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtYnVmID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChIVU5EUkVEX0JZVEVTKTsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCmluZGV4IGQ1ZjIzOWQuLjg2YjViMGQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTE5LDI2ICsxOSw1MSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitwdWJsaWMgY2xhc3MgVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCB7CiAKLXB1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IGV4dGVuZHMgVGVzdENhc2UgewotCisgIEBUZXN0CiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCB0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgxLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCB0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgxLCAwKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEsIHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGgpOwogICAgIGJ5dGVbXSBiMSA9IG5ldyBieXRlW117MSwyLDN9OwogICAgIHQud3JpdGUoYjEpOwotICAgIGFzc2VydEVxdWFscygzLCB0LmdldFBvcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOwogICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjEpLCBCeXRlQnVmZmVyLndyYXAodC5nZXRCdWYoKS5hcnJheSgpLCAwLCAzKSk7CiAKICAgICB0LnJlc2V0KCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydFRydWUodC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCA+PSAzKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRQb3MoKSk7CiAgICAgYnl0ZVtdIGIyID0gbmV3IGJ5dGVbXXs0LDV9OwogICAgIHQud3JpdGUoYjIpOwotICAgIGFzc2VydEVxdWFscygyLCB0LmdldFBvcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMiksIEJ5dGVCdWZmZXIud3JhcCh0LmdldEJ1ZigpLmFycmF5KCksIDAsIDIpKTsKKworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCB1dXQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDgsIDQpOworICAgIGFzc2VydEVxdWFscyg0LCB1dXQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydEVxdWFscyg4LCB1dXQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGgpOworICAgIHV1dC53cml0ZShiMSk7CisgICAgYXNzZXJ0RXF1YWxzKDcsIHV1dC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDgsIHV1dC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSksIEJ5dGVCdWZmZXIud3JhcCh1dXQuZ2V0QnVmKCkuYXJyYXkoKSwgNCwgMykpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RCYWRJbml0aWFsU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoMCwgMCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJhZEZyb250UmVzZXJ2ZVNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDQsIC0xKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0VG9vU21hbGxGcm9udFJlc2VydmVTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg0LCA1KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRCeXRlQnVmZmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzMwNzViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRCeXRlQnVmZmVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkNoYXJzZXRzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitwdWJsaWMgY2xhc3MgVGVzdFRCeXRlQnVmZmVyIGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG5ldyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDE2KSk7CisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiSGVsbG8gV29ybGQiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXVzZVJlYWRXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxNikpOworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisKKyAgICBieXRlQnVmZmVyLmNsZWFyKCk7CisKKyAgICBieXRlQnVmZmVyLndyaXRlKCJHb29kYnllIEhvcnNlcyIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkdvb2RieWUgSG9yc2VzIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE92ZXJmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG5ldyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDQpKTsKKyAgICB0cnkgeworICAgICAgYnl0ZUJ1ZmZlci53cml0ZSgiSGVsbG8gV29ybGQiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgICBmYWlsKCJFeHBlY3RlZCB3cml0ZSBvcGVyYXRpb24gdG8gZmFpbCB3aXRoIFRUcmFuc3BvcnRFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygiTm90IGVub3VnaCByb29tIGluIG91dHB1dCBidWZmZXIiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IGUwMjQwNDkuLjA2ZWUyMDYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw4ICsxOSwxNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0VEZyYW1lZFRyYW5zcG9ydCB7CisgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElOSVRJQUxfQ0FQQUNJVFkgPSA1MDsKKwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewotICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgNTAsIDEwICogMTAyNCAqIDEwMjQpOworICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgSU5JVElBTF9DQVBBQ0lUWSwgMTAgKiAxMDI0ICogMTAyNCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IG1heExlbmd0aCkgeworICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgSU5JVElBTF9DQVBBQ0lUWSwgbWF4TGVuZ3RoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggNzhmNThlYy4uZTMwZDc0YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0zNCw2ICszNCwxMCBAQAogICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nKTsKICAgfQogCisgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBtYXhMZW5ndGgpIHsKKyAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgbWF4TGVuZ3RoKTsKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJ5dGVTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZW5kLXN0YXJ0KzFdOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IChlbmQtc3RhcnQpOyBpKyspIHsKQEAgLTc1LDYgKzc5LDQwIEBACiAgICAgYXNzZXJ0RXF1YWxzKDQsIGNvdW50VHJhbnMucmVhZENvdW50KTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRnJhbWVTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpbnQgbWF4TGVuZ3RoID0gMTI4OworCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBkb3Mud3JpdGVJbnQoMTMwKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDEyOSkpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucywgbWF4TGVuZ3RoKTsKKworICAgIGJ5dGVbXSByZWFkQnVmID0gbmV3IGJ5dGVbMTBdOworICAgIHRyeSB7CisgICAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDQpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24gYmVjYXVzZSB0aGUgZnJhbWUgd2UncmUgdHJ5aW5nIHRvIHJlYWQgaXMgbGFyZ2VyIHRoYW4gb3VyIG1heCBmcmFtZSBsZW5ndGgKKyAgICAgIGFzc2VydEVxdWFscyhUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCBlLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgYXNzZXJ0RmFsc2UodHJhbnMuaXNPcGVuKCkpOworCisgICAgdHJ5IHsKKyAgICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgNCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRoaXMgdGltZSB3ZSBnZXQgYW4gZXhjZXB0aW9uIGluZGljYXRpbmcgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZAorICAgICAgYXNzZXJ0RXF1YWxzKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGUuZ2V0VHlwZSgpKTsKKyAgICB9CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGUoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgIFdyaXRlQ291bnRpbmdUcmFuc3BvcnQgY291bnRpbmdUcmFucyA9IG5ldyBXcml0ZUNvdW50aW5nVHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJhb3MpKSk7CkBAIC04NywxMSArMTI1LDExIEBACiAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CiAKICAgICB0cmFucy5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFscygyLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDI0NSkpOwogICAgIHRyYW5zLmZsdXNoKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CiAKICAgICBEYXRhSW5wdXRTdHJlYW0gZGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDI1NiwgZGluLnJlYWRJbnQoKSk7CkBAIC0xNDUsNCArMTgzLDMyIEBACiAgICAgYXNzZXJ0RXF1YWxzKDY1LCB0cmFucy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOwogICAgIGFzc2VydEVxdWFscygxMCwgdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgZG9zLndyaXRlSW50KDIyMCk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyMTkpKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsyMjBdOworICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMjIwKTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDAsMjE5KSkpOworCisgICAgYXNzZXJ0VHJ1ZSh0cmFucyBpbnN0YW5jZW9mIFRGcmFtZWRUcmFuc3BvcnQgfHwgdHJhbnMgaW5zdGFuY2VvZiBURmFzdEZyYW1lZFRyYW5zcG9ydCk7CisgICAgaWYgKHRyYW5zIGluc3RhbmNlb2YgVEZyYW1lZFRyYW5zcG9ydCkgeworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKSAhPSBudWxsICYmIHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA+IDApOworICAgICAgKChURnJhbWVkVHJhbnNwb3J0KSB0cmFucykuY2xlYXIoKTsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkgPT0gbnVsbCk7CisgICAgfSBlbHNlIGlmICh0cmFucyBpbnN0YW5jZW9mIFRGYXN0RnJhbWVkVHJhbnNwb3J0KSB7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA+IFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5JTklUSUFMX0NBUEFDSVRZKTsKKyAgICAgICgoVEZhc3RGcmFtZWRUcmFuc3BvcnQpIHRyYW5zKS5jbGVhcigpOworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPT0gVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LklOSVRJQUxfQ0FQQUNJVFkpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQppbmRleCA0YmJhNDUxLi4wMzJjMmViIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtNDUsMTcgKzQ1LDIyIEBACiAgIHRocm93cyBFeGNlcHRpb24gewogICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgIH0KKyAgCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5KQorICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnksIGZpbmFsIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpCiAgIHRocm93cyBFeGNlcHRpb24gewogICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7Ci0gICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIobmV3IEFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKSk7CisgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBnZXRTZXJ2ZXJUcmFuc3BvcnQoKTsKKyAgICAgICAgICBmaW5hbCBBcmdzIGFyZ3MgPSBuZXcgQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpOworICAgICAgICAgIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKGFyZ3MpOwogICAgICAgICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgIGFzc2VydCBmYWxzZTsKICAgICAgICAgfQpAQCAtNjMsNyArNjgsNyBAQAogICAgIH07CiAKICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKLSAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgVGhyZWFkLnNsZWVwKFNMRUVQX0RFTEFZKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNzksNCArODQsOSBAQAogICBwdWJsaWMgTGlzdDxUUHJvdG9jb2xGYWN0b3J5PiBnZXRQcm90b2NvbHMoKSB7CiAgICAgcmV0dXJuIHByb3RvY29sczsKICAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIHRoaXMgdGVzdCBkb2Vzbid0IHJlYWxseSBhcHBseSB0byB0aGlzIHN1aXRlLCBzbyBsZXQncyBza2lwIGl0LgorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDEuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50MSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiksCisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldENsaWVudFNvY2tldChIT1NULCBQT1JULCAwLyp0aW1lb3V0Ki8sIHBhcmFtcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50Mi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQyIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkKKyAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3CisgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworCisgICAgcGFyYW1zLnNldFRydXN0U3RvcmUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiKSwgbnVsbCk7CisKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpOworICAKKyAgcHVibGljIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUoKSB7CisgICAgc3VwZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAgT3ZlcnJpZGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgYWJsZSB0byB0ZXN0IHBhc3NpbmcKKyAgICAgKiAgdGhlIHRydXN0U3RvcmUgYW5kIGtleVN0b3JlIGFzIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgIiIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsICIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIpKTsKKyAgICAKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKyAgICAKKyAgICBwYXJhbXMuc2V0S2V5U3RvcmUobmV3IEZpbGVJbnB1dFN0cmVhbShrZXlTdG9yZUxvY2F0aW9uKSwgCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCwgMC8qdGltZW91dCovLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCksIHBhcmFtcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKaW5kZXggZGZkMDg3Zi4uMzZhMDZlOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC03Myw3ICs3NCw3IEBACiAgICAgICArICJzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdvIG91ciBmYXRoZXJzIGJyb3VnaHQgZm9ydGggb24gdGhpcyAiCiAgICAgICArICJjb250aW5lbnQgYSBuZXcgbmF0aW9uLCBjb25jZWl2ZWQgaW4gbGliZXJ0eSwgYW5kIGRlZGljYXRlZCB0byB0aGUgIgogICAgICAgKyAicHJvcG9zaXRpb24gdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiI7Ci0gIAorCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0TWVzc2FnZTIgPSAiSSBoYXZlIGEgZHJlYW0gdGhhdCBvbmUgZGF5ICIKICAgICAgICsgInRoaXMgbmF0aW9uIHdpbGwgcmlzZSB1cCBhbmQgbGl2ZSBvdXQgdGhlIHRydWUgbWVhbmluZyBvZiBpdHMgY3JlZWQ6ICIKICAgICAgICsgIidXZSBob2xkIHRoZXNlIHRydXRocyB0byBiZSBzZWxmLWV2aWRlbnQsIHRoYXQgYWxsIG1lbiBhcmUgY3JlYXRlZCBlcXVhbC4nIjsKQEAgLTEyMyw3ICsxMjQsOSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChTZXJ2ZXJUZXN0QmFzZS5QT1JUKTsKKyAgICAgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoCisgICAgICAgIG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS4KKyAgICAgICAgICBwb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKTsKICAgICAgIHRyeSB7CiAgICAgICAgIGFjY2VwdEFuZFdyaXRlKHNlcnZlclNvY2tldCk7CiAgICAgICB9IGZpbmFsbHkgewpAQCAtMjc1LDEyICsyNzgsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgewogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFRyYW5zcG9ydAotICAgICAgICAgICAgVFNlcnZlclNvY2tldCBzb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICAgIFRTZXJ2ZXJTb2NrZXQgc29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLnBvcnQoUE9SVCkpOwogCiAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0LkZhY3RvcnkoCiAgICAgICAgICAgICAgIFdSQVBQRURfTUVDSEFOSVNNLCBTRVJWSUNFLCBIT1NULCBXUkFQUEVEX1BST1BTLApAQCAtMzEzLDcgKzMxNiw3IEBACiAKICAgLyoqCiAgICAqIEltcGxlbWVudGF0aW9uIG9mIFNBU0wgQU5PTllNT1VTLCB1c2VkIGZvciB0ZXN0aW5nIGNsaWVudC1zaWRlCi0gICAqIGludGlhbCByZXNwb25zZXMuCisgICAqIGluaXRpYWwgcmVzcG9uc2VzLgogICAgKi8KICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5vbnltb3VzQ2xpZW50IGltcGxlbWVudHMgU2FzbENsaWVudCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlcm5hbWU7CkBAIC0zMzAsMTIgKzMzMyw4IEBACiAgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOwogICAgICAgfQogCi0gICAgICB0cnkgewotICAgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgIH0KKyAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlOyB9CiAgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CkBAIC0zNTIsMTEgKzM1MSw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lY2hhbmlzbU5hbWUoKSB7IHJldHVybiAiQU5PTllNT1VTIjsgfQogICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHRoaXMudXNlciA9IG5ldyBTdHJpbmcocmVzcG9uc2UsICJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIHVzZXIgIT0gbnVsbDsgfQpAQCAtNDEwLDQgKzQwNSw2NyBAQAogICAgICAgcHV0KCJTYXNsU2VydmVyRmFjdG9yeS5BTk9OWU1PVVMiLCBTYXNsQW5vbnltb3VzRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwogICAgIH0KICAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2tUVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBieXRlW10gYmFkSGVhZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydCgpOworCisgICAgcHVibGljIE1vY2tUVHJhbnNwb3J0KGludCBtb2RlKSB7CisgICAgICBpZiAobW9kZT09MSkgeworICAgICAgICAvLyBJbnZhbGlkIHN0YXR1cyBieXRlCisgICAgICAgIGJhZEhlYWRlciA9IG5ldyBieXRlW10geyAoYnl0ZSkweEZGLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDA1IH07CisgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMikgeworICAgICAgICAvLyBWYWxpZCBzdGF0dXMgYnl0ZSwgbmVnYXRpdmUgcGF5bG9hZCBsZW5ndGgKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4MDEsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYgfTsKKyAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAzKSB7CisgICAgICAgIC8vIFZhbGlkIHN0YXR1cyBieXRlLCBleGNlc3NpdmVseSBsYXJnZSwgYm9ndXMgcGF5bG9hZCBsZW5ndGgKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4MDEsIChieXRlKTB4NjQsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAgfTsKKyAgICAgIH0KKyAgICAgIHJlYWRCdWZmZXIucmVzZXQoYmFkSGVhZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gcmVhZEJ1ZmZlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QmFkSGVhZGVyKCkgeworICAgIFRTYXNsVHJhbnNwb3J0IHNhc2xUcmFuc3BvcnQgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQobmV3IE1vY2tUVHJhbnNwb3J0KDEpKTsKKyAgICB0cnkgeworICAgICAgc2FzbFRyYW5zcG9ydC5yZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBlcnJvciBkdWUgdG8gaW5jb3JyZWN0IHN0YXR1cyBieXRlIHZhbHVlLiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAiSW52YWxpZCBzdGF0dXMgLTEiKTsKKyAgICB9CisgICAgc2FzbFRyYW5zcG9ydCA9IG5ldyBUU2FzbFNlcnZlclRyYW5zcG9ydChuZXcgTW9ja1RUcmFuc3BvcnQoMikpOworICAgIHRyeSB7CisgICAgICBzYXNsVHJhbnNwb3J0LnJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIGR1ZSB0byBuZWdhdGl2ZSBwYXlsb2FkIGxlbmd0aC4iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgIkludmFsaWQgcGF5bG9hZCBoZWFkZXIgbGVuZ3RoOiAtMSIpOworICAgIH0KKyAgICBzYXNsVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KG5ldyBNb2NrVFRyYW5zcG9ydCgzKSk7CisgICAgdHJ5IHsKKyAgICAgIHNhc2xUcmFuc3BvcnQucmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3IgZHVlIHRvIGJvZ3VzIChsYXJnZSkgcGF5bG9hZCBsZW5ndGguIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJJbnZhbGlkIHBheWxvYWQgaGVhZGVyIGxlbmd0aDogMTY3NzcyMTYwMCIpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg4MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy9UZXN0IHdyaXRlIHNpZGUKKyAgICBQYXRoIHRlbXBGaWxlUGF0aE5hbWUgPSBGaWxlcy5jcmVhdGVUZW1wRmlsZSgiVFNpbXBsZUZpbGVUcmFuc3BvcnRUZXN0IiwgbnVsbCk7CisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOworICAgIGJ5dGVbXSBpbnB1dF9idWYgPSBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKKyAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFuc193cml0ZSA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICBhc3NlcnQgKCF0cmFuc193cml0ZS5pc09wZW4oKSk7CisgICAgdHJhbnNfd3JpdGUub3BlbigpOworICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7CisgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmKTsKKyAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYsMiwyKTsKKyAgICB0cmFuc193cml0ZS5mbHVzaCgpOworICAgIHRyYW5zX3dyaXRlLmNsb3NlKCk7CisKKyAgICAvL1Rlc3QgcmVhZCBzaWRlCisgICAgVFNpbXBsZUZpbGVUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVFNpbXBsZUZpbGVUcmFuc3BvcnQodGVtcEZpbGVQYXRoTmFtZS50b1N0cmluZygpLHRydWUsIGZhbHNlKTsKKyAgICBhc3NlcnQodHJhbnMuaXNPcGVuKCkpOworCisgICAgLy9TaW1wbGUgZmlsZSB0cmFucyBwcm92aWRlcyBubyBidWZmZXIgYWNjZXNzCisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CisgICAgYXNzZXJ0KG51bGwgPT0gdHJhbnMuZ2V0QnVmZmVyKCkpOworICAgIGFzc2VydCgtMSA9PSB0cmFucy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOworCisgICAgLy9UZXN0IGZpbGUgcG9pbnRlciBvcGVyYXRpb25zCisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgYXNzZXJ0KDEyID09IHRyYW5zLmxlbmd0aCgpKTsKKworICAgIGZpbmFsIGludCBCVUZTSVogPSA0OworICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbQlVGU0laXTsKKyAgICB0cmFucy5yZWFkQWxsKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KEJVRlNJWiA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICBhc3NlcnQoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdezEsIDIsIDMsIDR9LCBidWYxKSk7CisKKyAgICBpbnQgYnl0ZXNSZWFkID0gdHJhbnMucmVhZChidWYxLCAwLCBCVUZTSVopOworICAgIGFzc2VydChieXRlc1JlYWQgPiAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzUmVhZDsgKytpKSB7CisgICAgICBhc3NlcnQoYnVmMVtpXSA9PSBpKzUpOworICAgIH0KKworICAgIHRyYW5zLnNlZWsoMCk7CisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOworICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKKyAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOworICAgIHRyYW5zLmNsb3NlKCk7CisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2Y5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRhdGFGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFpsaWJUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgeworICAgIHJldHVybiBuZXcgVFpsaWJUcmFuc3BvcnQodW5kZXJseWluZyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuZC1zdGFydCsxXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSAoZW5kLXN0YXJ0KTsgaSsrKSB7CisgICAgICByZXN1bHRbaV0gPSAoYnl0ZSkoc3RhcnQraSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0KKyAgICAgICAgKGJhb3MpKSk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudGluZ1RyYW5zKTsKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CisgICAgY291bnRpbmdUcmFucy5jbG9zZSgpOworICAgIHRyYW5zLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VPcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChiYW9zKSk7CisgICAgYnl0ZVtdIHVuY29tcHJlc3NlZCA9IGJ5dGVTZXF1ZW5jZSgwLCAyNDUpOworICAgIHRyYW5zLndyaXRlKHVuY29tcHJlc3NlZCk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgICBmaW5hbCBieXRlW10gY29tcHJlc3NlZCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKworICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTVdOworICAgIFRUcmFuc3BvcnQgdHJhbnNSZWFkID0gZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbXByZXNzZWQpKSk7CisgICAgaW50IHJlYWRCeXRlcyA9IHRyYW5zUmVhZC5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKHVuY29tcHJlc3NlZC5sZW5ndGgsIHJlYWRCeXRlcyk7CisgICAgdHJhbnNSZWFkLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gZGVmbGF0ZXJPdXRwdXRTdHJlYW0gPSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShkZWZsYXRlck91dHB1dFN0cmVhbSk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCA0OSkpOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKKyAgICBkZWZsYXRlck91dHB1dFN0cmVhbS5maW5pc2goKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAxMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLDkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMTApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMTAsMTkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIGFzc2VydEVxdWFscygzMCwgdHJhbnMucmVhZChuZXcgYnl0ZVszMF0sIDAsIDMwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIHJlYWRCdWYgPSBuZXcgYnl0ZVsyMjBdOworICAgIGFzc2VydEVxdWFscygyMjAsIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMjIwKSk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLCAyMTkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50aW5nVHJhbnMpOworCisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDEwMCkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgxMDEsIDIwMCkpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgyMDEsIDI1NSkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgdHJhbnMuZmx1c2goKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKKyAgICB0cmFucy5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygzLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgRGF0YUlucHV0U3RyZWFtIGRpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEluZmxhdGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU2XTsKKyAgICBpbnQgbiA9IGRpbi5yZWFkKGJ1ZiwgMCwgMjU2KTsKKyAgICBhc3NlcnRFcXVhbHMobiwgMjU2KTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZVNlcXVlbmNlKDAsIDI1NSksIGJ1ZikpOworCisgICAgYnVmID0gbmV3IGJ5dGVbMjQ2XTsKKyAgICBuID0gZGluLnJlYWQoYnVmLCAwLCAyNDYpOworICAgIGFzc2VydEVxdWFscyhuLCAyNDYpOworICAgIGZvciAoaW50IGkgPSAwOyBpPGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKCJmb3IgIitpLCBieXRlU2VxdWVuY2UoMCwyNDUpW2ldLCBidWZbaV0pOworICAgIH0KKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhieXRlU2VxdWVuY2UoMCwyNDUpLCBidWYpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggZGU5YTE2Mi4uMmY4NjEyYSAxMDA2NDQKLS0tIGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTQxLDcgKzQxLDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKLQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQppbmRleCA1ZWM4OTkyLi4yZjMxZDMxIDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlT2JqZWN0cyhPYmplY3QgYSwgT2JqZWN0IGIpIHsKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oT2JqZWN0IGEsIE9iamVjdCBiKSB7CiAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgVmVjdG9yKSB7CiAgICAgICAgICAgICByZXR1cm4gY29tcGFyZVRvKChWZWN0b3IpYSwgKFZlY3RvciliKTsKICAgICAgICAgfSBpZiAoYSBpbnN0YW5jZW9mIEhhc2h0YWJsZSkgewpAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgT2JqZWN0IG9BID0gYS5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBPYmplY3Qgb0IgPSBiLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZU9iamVjdHMob0EsIG9CKTsKKyAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKG9BLCBvQik7CiAgICAgICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKICAgICAgICAgICAgIH0KQEAgLTE0OSw5ICsxNDksOSBAQAogICAgICAgICB3aGlsZSAobGFzdENvbXBhcmlzb24gPT0gMCAmJiBlbnVtQS5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICAgT2JqZWN0IGtleUEgPSBlbnVtQS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgT2JqZWN0IGtleUIgPSBlbnVtQi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlT2JqZWN0cyhrZXlBLCBrZXlCKTsKKyAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGtleUEsIGtleUIpOwogICAgICAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVPYmplY3RzKGEuZ2V0KGtleUEpLCBiLmdldChrZXlCKSk7CisgICAgICAgICAgICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5nZXQoa2V5QSksIGIuZ2V0KGtleUIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCAxMWE1YTA4Li5iY2UwMmM3IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MsIEhhc2h0YWJsZSBtYXApeworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcywgSGFzaHRhYmxlIG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNzMsNyArNzMsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcyl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEhhc2h0YWJsZSBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MpewogICAgIGlmICghc3RydWN0TWFwLmNvbnRhaW5zS2V5KHNDbGFzcykpeyAvLyBMb2FkIGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuIGxvYWRlZAogICAgICAgdHJ5ewogICAgICAgICBzQ2xhc3MubmV3SW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKaW5kZXggMzdhOWZkOS4uYWJmYzk2NSAxMDA2NDQKLS0tIGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKQEAgLTU2LDI0ICs1NiwyMyBAQAogICAgIGlmIChsZW4gPT0gMykgewogICAgICAgZHN0W2RzdE9mZiArIDFdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICsgKHNyY1tzcmNPZmYrMV0gPj4gNCkpICYgMHgzRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOwogICAgICAgZHN0W2RzdE9mZiArIDJdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYrMV0gPDwgMikgKyAoc3JjW3NyY09mZisyXSA+PiA2KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmYrMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZisyXSA+PiA2KSAmIDB4MDMpKTsKICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9CiAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoc3JjW3NyY09mZisyXSAmIDB4M0YpOwogICAgIH0KICAgICBlbHNlIGlmIChsZW4gPT0gMikgewogICAgICAgZHN0W2RzdE9mZisxXSA9CiAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZisxXSA+PiA0KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOwogICAgICAgZHN0W2RzdE9mZiArIDJdID0KLSAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0YpOwotCisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmYrMV0gPDwgMikgJiAweDNDKTsKICAgICB9CiAgICAgZWxzZSB7IC8vIGxlbiA9PSAxKSB7CiAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQotICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4M0YpOworICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCmluZGV4IDFkMTY4ODkuLmY2ZmU3NjUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLyoKKyAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0zNiw5ICszNiw2IEBACiAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7CiAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLSAgcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoXzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tSZWFkTGVuZ3RoXyA9IGZhbHNlOwotCiAgIC8qKgogICAgKiBGYWN0b3J5CiAgICAqLwpAQCAtMzExLDcgKzMwOCw2IEBACiAKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICBjaGVja1JlYWRMZW5ndGgoc2l6ZSk7CiAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CiAgICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwogICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAiVVRGLTgiKTsKQEAgLTMyMiwyOSArMzE4LDEyIEBACiAKICAgcHVibGljIGJ5dGVbXSByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwotICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CiAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKICAgICByZXR1cm4gYnVmOwogICB9CiAKICAgcHJpdmF0ZSBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgcmV0dXJuIHRyYW5zXy5yZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkgewotICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLSAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGNoZWNrUmVhZExlbmd0aF8pIHsKLSAgICAgIHJlYWRMZW5ndGhfIC09IGxlbmd0aDsKLSAgICAgIGlmIChyZWFkTGVuZ3RoXyA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTE2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisgKiBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIHdyaXRlIGFuZCByZWFkLgorICogUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKKyAqIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgKi8KK3B1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sIHsKKworICAvKioKKyAgICogRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgQ09NTUEgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnLCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBDT0xPTiAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICc6JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIExCUkFDRSAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3snIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUkJSQUNFICAgICAgICAgICA9IG5ldyBieXRlW10geyAnfScgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBMQlJBQ0tFVCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdbJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIFJCUkFDS0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ10nIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUVVPVEUgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnIicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBCQUNLU0xBU0ggICAgICAgID0gbmV3IGJ5dGVbXSB7ICdcXCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBaRVJPICAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICcwJyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgRVNDU0VRICAgICAgICAgICA9IG5ldyBieXRlW10geyAnXFwnLCAndScsICcwJywgJzAnIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyAgICBWRVJTSU9OICAgICAgICAgID0gMTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEpTT05fQ0hBUl9UQUJMRSAgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIDEgMiAzIDQgNSA2IDcgOCA5IEEgQiBDIEQgRSBGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQorICAgICAgMSwgMSwgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgRVNDQVBFX0NIQVJTICAgICA9ICJcIlxcL2JmbnJ0IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEVTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIicsICdcXCcsICcvJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICAgICBERUZfU1RSSU5HX1NJWkUgID0gMTY7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0JPT0wgICAgICAgID0gbmV3IGJ5dGVbXSB7ICd0JywgJ2YnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9CWVRFICAgICAgICA9IG5ldyBieXRlW10geyAnaScsICc4JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTE2ICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnMScsICc2JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTMyICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnMycsICcyJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfSTY0ICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnNicsICc0JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfRE9VQkxFICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2QnLCAnYicsICdsJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU1RSVUNUICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3InLCAnZScsICdjJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU1RSSU5HICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3MnLCAndCcsICdyJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfTUFQICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ20nLCAnYScsICdwJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfTElTVCAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2wnLCAncycsICd0JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfU0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3MnLCAnZScsICd0JyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGdldFR5cGVOYW1lRm9yVHlwZUlEKGJ5dGUgdHlwZUlEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHN3aXRjaCAodHlwZUlEKSB7CisgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgcmV0dXJuIE5BTUVfRE9VQkxFOworICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgIHJldHVybiBOQU1FX0xJU1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGdldFR5cGVJREZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIHJlc3VsdCA9IFRUeXBlLlNUT1A7CisgICAgaWYgKG5hbWUubGVuZ3RoID4gMSkgeworICAgICAgc3dpdGNoIChuYW1lWzBdKSB7CisgICAgICBjYXNlICdkJzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuRE9VQkxFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2knOgorICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQllURTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2wnOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5MSVNUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ20nOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5NQVA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncic6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNUUlVDVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzoKKyAgICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSSU5HOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU0VUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAndCc6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJPT0w7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZSBpbnNlcnRpbmcvcmVhZGluZworICAvLyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkJhc2VDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHt9CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIHByb3RlY3RlZCBib29sZWFuIGVzY2FwZU51bSgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9yZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAvLyBmb3IgdGhlIGZpcnN0IG9uZQorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RfID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZShDT01NQSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoQ09NTUEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvcmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgIC8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCisgIC8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKKyAgLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29sb25fID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zXy53cml0ZShjb2xvbl8gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgY29sb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihjb2xvbl8gPyBDT0xPTiA6IENPTU1BKTsKKyAgICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlc2NhcGVOdW0oKSB7CisgICAgICByZXR1cm4gY29sb25fOworICAgIH0KKyAgfQorCisgIC8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYXRhXzsKKyAgICBwcml2YXRlIGJ5dGVbXSAgZGF0YV8gPSBuZXcgYnl0ZVsxXTsKKworICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIHJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAvLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KKyAgICBwcm90ZWN0ZWQgYnl0ZSByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGhhc0RhdGFfKSB7CisgICAgICAgIGhhc0RhdGFfID0gZmFsc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8sIDAsIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIGRhdGFfWzBdOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIHJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbHJlYWR5LgorICAgIHByb3RlY3RlZCBieXRlIHBlZWsoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoIWhhc0RhdGFfKSB7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfLCAwLCAxKTsKKyAgICAgIH0KKyAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKKyAgICAgIHJldHVybiBkYXRhX1swXTsKKyAgICB9CisgIH0KKworICAvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgb2YgdHlwZSBKU09OQmFzZUNvbnRleHQgdGhhdCB3ZSBtYXkgYmUgaW4KKyAgcHJpdmF0ZSBTdGFjayAgICAgICAgICAgY29udGV4dFN0YWNrXyA9IG5ldyBTdGFjaygpOworCisgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICBwcml2YXRlIEpTT05CYXNlQ29udGV4dCBjb250ZXh0XyAgICAgID0gbmV3IEpTT05CYXNlQ29udGV4dCgpOworCisgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgIHByaXZhdGUgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl8gICAgICAgPSBuZXcgTG9va2FoZWFkUmVhZGVyKCk7CisKKyAgLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgIHByaXZhdGUgdm9pZCBwdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykgeworICAgIGNvbnRleHRTdGFja18ucHVzaChjb250ZXh0Xyk7CisgICAgY29udGV4dF8gPSBjOworICB9CisKKyAgLy8gUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCisgIHByaXZhdGUgdm9pZCBwb3BDb250ZXh0KCkgeworICAgIGNvbnRleHRfID0gKEpTT05CYXNlQ29udGV4dCljb250ZXh0U3RhY2tfLnBvcCgpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yCisgICAqLworICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgc3VwZXIodHJhbnMpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgY29udGV4dFN0YWNrXy5jbGVhcigpOworICAgIGNvbnRleHRfID0gbmV3IEpTT05CYXNlQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCk7CisgIH0KKworICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCisgIHByaXZhdGUgYnl0ZVtdIHRtcGJ1Zl8gPSBuZXcgYnl0ZVs0XTsKKworICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgIC8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5yZWFkCisgIC8vIGFuZCBKU09OUGFpckNvbnRleHQucmVhZAorICBwcm90ZWN0ZWQgdm9pZCByZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgaWYgKGNoICE9IGJbMF0pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXI6IiArIChjaGFyKWNoKTsKKyAgICB9CisgIH0KKworICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgLy8gY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBoZXhWYWwoYnl0ZSBjaCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgeworICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgfQorICAgIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnICsgMTApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOworICAgIH0KKyAgfQorCisgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGhleENoYXIoYnl0ZSB2YWwpIHsKKyAgICB2YWwgJj0gMHgwRjsKKyAgICBpZiAodmFsIDwgMTApIHsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKSh2YWwgLSAxMCkgKyAnYScpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdUQ4MDAnICYmIGMgPD0gJ1x1REJGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdURDMDAnICYmIGMgPD0gJ1x1REZGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBjb2RlcG9pbnQpIHsKKyAgICBmaW5hbCBpbnRbXSBGSVJTVF9CWVRFX01BU0sgPSB7IDAsIDB4YzAsIDB4ZTAsIDB4ZjAgfTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpZiAoY29kZXBvaW50IDw9IDB4N2YpIGxlbmd0aCA9IDE7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSBsZW5ndGggPSAyOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIGxlbmd0aCA9IDM7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4MWZmZmZmKSBsZW5ndGggPSA0OworICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvZGUgcG9pbnQgb3ZlciBVKzFGRkZGRiBpcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIHN3aXRjaCAobGVuZ3RoKSB7CisgICAgY2FzZSA0OgorICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAzOgorICAgICAgYnl0ZXNbMl0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAyOgorICAgICAgYnl0ZXNbMV0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAxOgorICAgICAgYnl0ZXNbMF0gPSAoYnl0ZSkoY29kZXBvaW50IHwgRklSU1RfQllURV9NQVNLW2xlbmd0aCAtIDFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBoaWdoLCBpbnQgbG93KSB7CisgICAgaW50IGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCk7CisgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmOworICAgIHJldHVybiB0b1VURjgoY29kZXBvaW50KTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICBwcml2YXRlIHZvaWQgd3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIGludCBsZW4gPSBiLmxlbmd0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoKGJbaV0gJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJbaV0gPT0gQkFDS1NMQVNIWzBdKSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKGIsIGksIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdG1wYnVmX1swXSA9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKKyAgICAgICAgaWYgKHRtcGJ1Zl9bMF0gPT0gMSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShiLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0bXBidWZfWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICAgIHRyYW5zXy53cml0ZSh0bXBidWZfLCAwLCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoRVNDU0VRKTsKKyAgICAgICAgICB0bXBidWZfWzBdID0gaGV4Q2hhcigoYnl0ZSkoYltpXSA+PiA0KSk7CisgICAgICAgICAgdG1wYnVmX1sxXSA9IGhleENoYXIoYltpXSk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKHRtcGJ1Zl8sIDAsIDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgIH0KKworICAvLyBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05JbnRlZ2VyKGxvbmcgbnVtKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICBTdHJpbmcgc3RyID0gTG9uZy50b1N0cmluZyhudW0pOworICAgIGJvb2xlYW4gZXNjYXBlTnVtID0gY29udGV4dF8uZXNjYXBlTnVtKCk7CisgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB0cmFuc18ud3JpdGUoYnVmKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCB3cml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IERvdWJsZS50b1N0cmluZyhudW0pOworICAgIGJvb2xlYW4gc3BlY2lhbCA9IGZhbHNlOworICAgIHN3aXRjaCAoc3RyLmNoYXJBdCgwKSkgeworICAgIGNhc2UgJ04nOiAvLyBOYU4KKyAgICBjYXNlICdJJzogLy8gSW5maW5pdHkKKyAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnLSc6CisgICAgICBpZiAoc3RyLmNoYXJBdCgxKSA9PSAnSScpIHsgLy8gLUluZmluaXR5CisgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbGVhbiBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLmVzY2FwZU51bSgpOworICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAvLyBkYXRhCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgaW50IGxlbiA9IGxlbmd0aDsKKyAgICBpbnQgb2ZmID0gb2Zmc2V0OworICAgIHdoaWxlIChsZW4gPj0gMykgeworICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdG1wYnVmXywgMCk7CisgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgNCk7CisgICAgICBvZmYgKz0gMzsKKyAgICAgIGxlbiAtPSAzOworICAgIH0KKyAgICBpZiAobGVuID4gMCkgeworICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdG1wYnVmXywgMCk7CisgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgbGVuICsgMSk7CisgICAgfQorICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OT2JqZWN0U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTk9iamVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OQXJyYXlTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CisgICAgcHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05BcnJheUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwb3BDb250ZXh0KCk7CisgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUpTT05TdHJpbmcoYik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CisgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC50eXBlKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdEVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5rZXlUeXBlKSk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC52YWx1ZVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1hcC5zaXplKTsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGxpc3Quc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5lbGVtVHlwZSkpOworICAgIHdyaXRlSlNPTkludGVnZXIoc2V0LnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGIgPyAobG9uZykxIDogKGxvbmcpMCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihiKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGkzMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05Eb3VibGUoZHViKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB3cml0ZUpTT05TdHJpbmcoYik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05CYXNlNjQoYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgcmVhZGluZyBmcm9tIHRoZQorICAvLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWFkSlNPTlN0cmluZyhib29sZWFuIHNraXBDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShERUZfU1RSSU5HX1NJWkUpOworICAgIGludCBoaWdoU3Vycm9nYXRlID0gMDsKKyAgICBpZiAoIXNraXBDb250ZXh0KSB7CisgICAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgfQorICAgIHJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGJ5dGUgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgIGlmIChjaCA9PSBRVU9URVswXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChjaCA9PSBFU0NTRVFbMF0pIHsKKyAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgICAgaWYgKGNoID09IEVTQ1NFUVsxXSkgeworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGN1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChoaWdoU3Vycm9nYXRlID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGhpZ2hTdXJyb2dhdGUsIGN1KSk7CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSh0b1VURjgoY3UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJKVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CisgICAgICAgICAgaWYgKG9mZiA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2ggPSBFU0NBUEVfQ0hBUl9WQUxTW29mZl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGFyci53cml0ZShjaCk7CisgICAgfQorCisgICAgaWYgKGhpZ2hTdXJyb2dhdGUgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICB9CisgICAgcmV0dXJuIGFycjsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICBwcml2YXRlIGJvb2xlYW4gaXNKU09OTnVtZXJpYyhieXRlIGIpIHsKKyAgICBzd2l0Y2ggKGIpIHsKKyAgICBjYXNlICcrJzoKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcuJzoKKyAgICBjYXNlICcwJzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBjYXNlICc4JzoKKyAgICBjYXNlICc5JzoKKyAgICBjYXNlICdFJzoKKyAgICBjYXNlICdlJzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgIC8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgcHJpdmF0ZSBTdHJpbmcgcmVhZEpTT05OdW1lcmljQ2hhcnMoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYnl0ZSBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgICAgaWYgKCFpc0pTT05OdW1lcmljKGNoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN0cmJ1Zi5hcHBlbmQoKGNoYXIpcmVhZGVyXy5yZWFkKCkpOworICAgIH0KKyAgICByZXR1cm4gc3RyYnVmLnRvU3RyaW5nKCk7CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCByZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgIHByaXZhdGUgbG9uZyByZWFkSlNPTkludGVnZXIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IHJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihzdHIpLmxvbmdWYWx1ZSgpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgIHByaXZhdGUgZG91YmxlIHJlYWRKU09ORG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKKyAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7CisgICAgICB0cnkgeworICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKS5kb3VibGVWYWx1ZSgpOworICAgICAgICBpZiAoIWNvbnRleHRfLmVzY2FwZU51bSgpICYmICFEb3VibGUuaXNOYU4oZHViKSAmJgorICAgICAgICAgICAgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKKyAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkdWI7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHJlYWRKU09OTnVtZXJpY0NoYXJzKCkpLmRvdWJsZVZhbHVlKCk7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICBwcml2YXRlIGJ5dGVbXSByZWFkSlNPTkJhc2U2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICBieXRlW10gYiA9IGFyci5nZXQoKTsKKyAgICBpbnQgbGVuID0gYXJyLmxlbigpOworICAgIGludCBvZmYgPSAwOworICAgIGludCBzaXplID0gMDsKKyAgICAvLyBJZ25vcmUgcGFkZGluZworICAgIGludCBib3VuZCA9IGxlbiA+PSAyID8gbGVuIC0gMiA6IDA7CisgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICBvZmYgKz0gNDsKKyAgICAgIGxlbiAtPSA0OworICAgICAgc2l6ZSArPSAzOworICAgIH0KKyAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgICAgaWYgKGxlbiA+IDEpIHsKKyAgICAgIC8vIERlY29kZSByZW1haW5kZXIKKyAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCBsZW4sIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgc2l6ZSArPSBsZW4gLSAxOworICAgIH0KKyAgICAvLyBTYWRseSB3ZSBtdXN0IGNvcHkgdGhlIGJ5dGVbXSAoYW55IHdheSBhcm91bmQgdGhpcz8pCisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OT2JqZWN0U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIHJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0UpOworICAgIHB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEpTT05PYmplY3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OQXJyYXlTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKExCUkFDS0VUKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OQXJyYXlFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKTsKKyAgICBwb3BDb250ZXh0KCk7CisgIH0KKworICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBpZiAocmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgIH0KKyAgICBTdHJpbmcgbmFtZTsKKyAgICB0cnkgeworICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgICAgYnl0ZSB0eXBlID0gKGJ5dGUpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgaW50IHNlcWlkID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OT2JqZWN0RW5kKCk7CisgIH0KKworICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGUgY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICBieXRlIHR5cGU7CisgICAgc2hvcnQgaWQgPSAwOworICAgIGlmIChjaCA9PSBSQlJBQ0VbMF0pIHsKKyAgICAgIHR5cGUgPSBUVHlwZS5TVE9QOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlkID0gKHNob3J0KXJlYWRKU09OSW50ZWdlcigpOworICAgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgdHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGtleVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGJ5dGUgdmFsdWVUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdEVuZCgpOworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOworICAgIGJ5dGUgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGludCBzaXplID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRMaXN0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmV0dXJuIG5ldyBUU2V0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChyZWFkSlNPTkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlKTsKKyAgfQorCisgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoYnl0ZSlyZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoc2hvcnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiByZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZEpTT05Eb3VibGUoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQppbmRleCA0NTFhMmU1Li5lNmZmYmE0IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogCiAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1fID0gbnVsbDsKIAorICBwcml2YXRlIEh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOworCiAgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0XyA9IDA7CiAKICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXRfID0gMDsKQEAgLTQ5LDcgKzUxLDcgQEAKICAgcHJpdmF0ZSBIYXNodGFibGUgY3VzdG9tSGVhZGVyc18gPSBudWxsOwogCiAgIHB1YmxpYyBUSHR0cENsaWVudChTdHJpbmcgdXJsKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgdXJsXyA9IHVybDsKKyAgICB1cmxfID0gdXJsOwogICB9CiAKICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKQEAgLTgxLDYgKzgzLDE0IEBACiAgICAgICB9CiAgICAgICBpbnB1dFN0cmVhbV8gPSBudWxsOwogICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgfQorICAgICAgY29ubmVjdGlvbiA9IG51bGw7CisgICAgfQogICB9CiAKICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewpAQCAtMTA2LDYyICsxMTYsNDggQEAKICAgICByZXF1ZXN0QnVmZmVyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKICAgfQogICAKLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKLSAgICAgICAgYnl0ZVtdIGRhdGEgPSByZXF1ZXN0QnVmZmVyXy50b0J5dGVBcnJheSgpOwotICAgICAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOworICAgIGJ5dGVbXSBkYXRhID0gcmVxdWVzdEJ1ZmZlcl8udG9CeXRlQXJyYXkoKTsKKyAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbiBvYmplY3QKLSAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cENvbm5lY3Rpb24pQ29ubmVjdG9yLm9wZW4odXJsXyk7Ci0gICAgCi0gICAgICAgICAgICAvLyBUaW1lb3V0cywgb25seSBpZiBleHBsaWNpdGx5IHNldAotICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0XyA+IDApIHsKLSAgICAgICAgICAgIC8vICBYWFg6IG5vdCBhdmFpbGFibGUKLSAgICAgICAgICAgIC8vICBjb25uZWN0aW9uLnNldENvbm5lY3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0Xyk7Ci0gICAgICAgICAgICB9ICAgCi0gICAgICAgICAgICBpZiAocmVhZFRpbWVvdXRfID4gMCkgewotICAgICAgICAgICAgLy8gIFhYWDogbm90IGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gIGNvbm5lY3Rpb24uc2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXRfKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3QKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOwotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiSmF2YU1FL1RIdHRwQ2xpZW50Iik7CisgICAgdHJ5IHsKKyAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uIG9iamVjdAorICAgICAgY29ubmVjdGlvbiA9IChIdHRwQ29ubmVjdGlvbilDb25uZWN0b3Iub3Blbih1cmxfKTsKKyAgCisgICAgICAvLyBNYWtlIHRoZSByZXF1ZXN0CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgIkphdmFNRS9USHR0cENsaWVudCIpOwogCi0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29ubmVjdGlvbiIsICJLZWVwLUFsaXZlIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiS2VlcC1BbGl2ZSIsICI1MDAwIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiSHR0cC12ZXJzaW9uIiwgIkhUVFAvMS4xIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ2FjaGUtQ29udHJvbCIsICJuby10cmFuc2Zvcm0iKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb25uZWN0aW9uIiwgIktlZXAtQWxpdmUiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJLZWVwLUFsaXZlIiwgIjUwMDAiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJIdHRwLXZlcnNpb24iLCAiSFRUUC8xLjEiKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDYWNoZS1Db250cm9sIiwgIm5vLXRyYW5zZm9ybSIpOwogCi0KLSAgICAgICAgICAgIGlmIChjdXN0b21IZWFkZXJzXyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY3VzdG9tSGVhZGVyc18ua2V5cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyljdXN0b21IZWFkZXJzXy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKLSAgICAgICAgICAgIC8vICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKLSAgICAKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IGNvbm5lY3Rpb24ub3Blbk91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgb3Mud3JpdGUoZGF0YSk7Ci0gICAgICAgICAgICBvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBpbnQgcmVzcG9uc2VDb2RlID0gY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZUNvZGUgIT0gSHR0cENvbm5lY3Rpb24uSFRUUF9PSykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMKLSAgICAgICAgICAgIGlucHV0U3RyZWFtXyA9IGNvbm5lY3Rpb24ub3BlbklucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW94LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKKyAgICAgIGlmIChjdXN0b21IZWFkZXJzXyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGN1c3RvbUhlYWRlcnNfLmtleXMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCkgOykgeworICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWN1c3RvbUhlYWRlcnNfLmdldChrZXkpOworICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOwogICAgICAgICB9CisgICAgICB9CisgIAorICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29ubmVjdGlvbi5vcGVuT3V0cHV0U3RyZWFtKCk7CisgICAgICBvcy53cml0ZShkYXRhKTsKKyAgICAgIG9zLmNsb3NlKCk7CisKKyAgICAgIGludCByZXNwb25zZUNvZGUgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwQ29ubmVjdGlvbi5IVFRQX09LKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOworICAgICAgfQorCisgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMKKyAgICAgIGlucHV0U3RyZWFtXyA9IGNvbm5lY3Rpb24ub3BlbklucHV0U3RyZWFtKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW94LnRvU3RyaW5nKCkpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTFhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqLworcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhbiBpbml0aWFsIGJ1ZmZlciBzaXplIG9mIDxpPnNpemU8L2k+LiBUaGUKKyAgICogaW50ZXJuYWwgYnVmZmVyIHdpbGwgZ3JvdyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEKKyAgICogYmVpbmcgd3JpdHRlbiB0byBpdC4KKyAgICovCisgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGludCBzaXplKSB7CisgICAgYXJyXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHNpemUpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKworICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgIGJ5dGVbXSBzcmMgPSBhcnJfLmdldCgpOworICAgIGludCBhbXRUb1JlYWQgPSAobGVuID4gYXJyXy5sZW4oKSAtIHBvc18gPyBhcnJfLmxlbigpIC0gcG9zXyA6IGxlbik7CisgICAgaWYgKGFtdFRvUmVhZCA+IDApIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCBwb3NfLCBidWYsIG9mZiwgYW10VG9SZWFkKTsKKyAgICAgIHBvc18gKz0gYW10VG9SZWFkOworICAgIH0KKyAgICByZXR1cm4gYW10VG9SZWFkOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgIGFycl8ud3JpdGUoYnVmLCBvZmYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZywgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAqIGVuY29kaW5nCisgICAqIAorICAgKiBAcGFyYW0gZW5jIHRoZSBlbmNvZGluZyB0byB1c2UKKyAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGVuYyk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7CisgICAgU3RyaW5nIGJ1ZiA9ICIiOworICAgIGJ5dGVbXSBieXRlcyA9IGFycl8udG9CeXRlQXJyYXkoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBidWYgKz0gKHBvc18gPT0gaSA/ICI9PT4iIDogIiIpICsgSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4ZmYpICsgIiAiOworICAgIH0KKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgLy8gVGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIKKyAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFycl87CisKKyAgLy8gUG9zaXRpb24gdG8gcmVhZCBuZXh0IGJ5dGUgZnJvbQorICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgcG9zXzsKKworICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICByZXR1cm4gYXJyXy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIGdldEFycmF5KCkgeworICAgIHJldHVybiBhcnJfLmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvanMvR3J1bnRmaWxlLmpzIGIvbGliL2pzL0dydW50ZmlsZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJhMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL0dydW50ZmlsZS5qcwpAQCAtMCwwICsxLDI5MyBAQAorLy9UbyBidWlsZCBkaXN0L3RocmlmdC5qcywgZGlzdC90aHJpZnQubWluLmpzIGFuZCBkb2MvKgorLy9ydW4gZ3J1bnQgYXQgdGhlIGNvbW1hbmQgbGluZSBpbiB0aGlzIGRpcmVjdG9yeS4KKy8vUHJlcmVxdWlzaXRlczoKKy8vIE5vZGUgU2V0dXAgLSAgIG5vZGVqcy5vcmcKKy8vIEdydW50IFNldHVwIC0gIG5wbSBpbnN0YWxsICAvL3JlYWRzIHRoZSAuL3BhY2thZ2UuanNvbiBhbmQgaW5zdGFsbHMgcHJvamVjdCBkZXBlbmRlbmNpZXMKKy8vIFJ1biBncnVudCAtICAgIG5weCBncnVudCAgLy8gdXNlcyBwcm9qZWN0LWxvY2FsIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGdydW50IChmcm9tIHBhY2thZ2UuanNvbikKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihncnVudCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZ3J1bnQuaW5pdENvbmZpZyh7CisgICAgcGtnOiBncnVudC5maWxlLnJlYWRKU09OKCdwYWNrYWdlLmpzb24nKSwKKyAgICBjb25jYXQ6IHsKKyAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgc2VwYXJhdG9yOiAnOycKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIHNyYzogWydzcmMvKiovKi5qcyddLAorICAgICAgICBkZXN0OiAnZGlzdC88JT0gcGtnLm5hbWUgJT4uanMnCisgICAgICB9CisgICAgfSwKKyAgICBqc2RvYyA6IHsKKyAgICAgICAgZGlzdCA6IHsKKyAgICAgICAgICAgIHNyYzogWydzcmMvKi5qcycsICcuL1JFQURNRS5tZCddLAorICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogJ2RvYycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgdWdsaWZ5OiB7CisgICAgICBvcHRpb25zOiB7CisgICAgICAgIGJhbm5lcjogJy8qISA8JT0gcGtnLm5hbWUgJT4gPCU9IGdydW50LnRlbXBsYXRlLnRvZGF5KCJkZC1tbS15eXl5IikgJT4gKi9cbicKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgJ2Rpc3QvPCU9IHBrZy5uYW1lICU+Lm1pbi5qcyc6IFsnPCU9IGNvbmNhdC5kaXN0LmRlc3QgJT4nXQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBzaGVsbDogeworICAgICAgSW5zdGFsbFRocmlmdEpTOiB7CisgICAgICAgIGNvbW1hbmQ6ICdta2RpciAtcCB0ZXN0L2J1aWxkL2pzL2xpYjsgY3Agc3JjL3RocmlmdC5qcyB0ZXN0L2J1aWxkL2pzL3RocmlmdC5qcycKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCAuLi8uLjsgbnBtIGluc3RhbGwnCisgICAgICB9LAorICAgICAgSW5zdGFsbFRlc3RMaWJzOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCB0ZXN0OyBhbnQgZG93bmxvYWRfanNsaWJzJworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbjogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtanF1ZXJ5JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtLW91dCB0ZXN0L2dlbi1qcy1qcXVlcnkgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcycsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlIC0tb3V0IHRlc3QvZ2VuLW5vZGVqcyAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtZXM2JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmVzNiAtLW91dCB0ZXN0L2dlbi1qcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSxlczYgLS1vdXQgLi90ZXN0L2dlbi1ub2RlanMtZXM2IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICBdLmpvaW4oJyAmJiAnKQorICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkpROiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuRG91YmxlQ29uc3RhbnRzOiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXI6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHAuanMiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHAuanMgLS1lczYiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNl9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHBzLmpzIC0tZXM2IiwKKyAgICAgIH0sCisgICAgfSwKKyAgICBxdW5pdDogeworICAgICAgVGhyaWZ0SlM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1ub2pxLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNKUTogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1M6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdHdzLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdEpTSlFfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRXU19UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0RGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdFdTRVM2OiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QtZXM2Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBqc2hpbnQ6IHsKKyAgICAgIC8vIFRoZSBtYWluIHRocmlmdCBsaWJyYXJ5IGZpbGUuIG5vdCBlczYgeWV0IDooCisgICAgICBsaWI6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICB9LAorICAgICAgLy8gVGhlIHRlc3QgZmlsZXMgdXNlIGVzNgorICAgICAgdGVzdDogeworICAgICAgICBzcmM6IFsnR3J1bnRmaWxlLmpzJywgJ3Rlc3QvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX2pzX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLyouanMnLCAndGVzdC9nZW4tanMtanF1ZXJ5LyouanMnXSwKKyAgICAgIH0sCisgICAgICBnZW5fZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLWVzNi8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fbm9kZV9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2VzNl9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgfSk7CisKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLXVnbGlmeScpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItanNoaW50Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1xdW5pdCcpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItY29uY2F0Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtanNkb2MnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbC1zcGF3bicpOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnd2FpdCcsICdXYWl0IGp1c3Qgb25lIHNlY29uZCBmb3Igc2VydmVyIHRvIHN0YXJ0JywgZnVuY3Rpb24gKCkgeworICAgIHZhciBkb25lID0gdGhpcy5hc3luYygpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICBkb25lKHRydWUpOworICAgIH0sIDEwMDApOworICB9KTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ2luc3RhbGxBbmRHZW5lcmF0ZScsIFsKKyAgICAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywgJ3NoZWxsOlRocmlmdEdlbkRvdWJsZUNvbnN0YW50cycsCisgICAgJ3NoZWxsOkluc3RhbGxUZXN0TGlicycsCisgIF0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsKKyAgICAnaW5zdGFsbEFuZEdlbmVyYXRlJywKKyAgICAnanNoaW50JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUycsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzYnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNl9UTFMnLAorICAgICd3YWl0JywKKyAgICAncXVuaXQ6VGhyaWZ0RGVlcENvbnN0cnVjdG9yJywKKyAgICAncXVuaXQ6VGhyaWZ0SlMnLCAncXVuaXQ6VGhyaWZ0SlNfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nJywKKyAgICAncXVuaXQ6VGhyaWZ0V1MnLAorICAgICdxdW5pdDpUaHJpZnRKU0pRJywgJ3F1bml0OlRocmlmdEpTSlFfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0V1NFUzYnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyOmtpbGwnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcl9UTFM6a2lsbCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzY6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCcsICdjb25jYXQnLCAndWdsaWZ5JywgJ2pzZG9jJ10pOworfTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9NYWtlZmlsZS5hbSBiL2xpYi9qcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEyMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCisjIFdlIGNhbGwgaW5zdGFsbCB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisjCitpZiBIQVZFX05QTQorU1VCRElSUyA9IHRlc3QKKworY2hlY2stbG9jYWw6IGFsbAorCSQoTlBNKSBpbnN0YWxsIHx8ICQoTlBNKSBpbnN0YWxsCisJJChOUE0pIGxpc3QKKwkuL25vZGVfbW9kdWxlcy8uYmluL2dydW50CitlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2pzL1JFQURNRSBiL2xpYi9qcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmRjNDMuLjAwMDAwMDAKLS0tIGEvbGliL2pzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLVRocmlmdCBKYXZhc2NyaXB0IExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggSmF2YXNjcmlwdAotPT09PT09PT09PT09PT09PT09PT09Ci0KLUFsbG93cyBqYXZhc2NyaXB0IGNsaWVudCBpbnRlcmZhY2VzIHRvIFRocmlmdCBzZXJ2aWNlcy4KLVRoaXMgaXMgZ2VhcmVkIGZvciB1c2UgaW4gYSB3ZWIgYnJvd3Nlci4KLQotVGhpcyBjbGllbnQgY2FuIG9ubHkgc3BlYWsgdGhlIEpTT04gUHJvdG9jb2wgYW5kIHRoZSBvbmx5IHN1cHBvcnRlZAotdHJhbnNwb3J0IGlzIEFKQVguCi0KLVRoZXJlIGlzIGEgdGVzdCBodHRwZCBzZXJ2aWNlIGluIHRoZSB0ZXN0IGRpciB0aGF0IHJlcXVpcmVzCi1odHRwOi8vaGMuYXBhY2hlLm9yZyB1bmRlciB0ZXN0IGRpcgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotQSBKYXZhU2NyaXB0IGVuYWJsZWQgYnJvd3Nlci4gVGVzdGVkIHdpdGg6Ci0gKklFIDYsNyw4Ci0gKkZGIDIsMwotICpTYWZhcmkgMyAmIDQKZGlmZiAtLWdpdCBhL2xpYi9qcy9SRUFETUUubWQgYi9saWIvanMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTFlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQwIEBACitUaHJpZnQgSmF2YXNjcmlwdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cworUlBDIGNsaWVudHMgdXNpbmcgdGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIdHRwW3NdIHdpdGggWEhSCithbmQgV2ViU29ja2V0LgorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworR3J1bnQgQnVpbGQKKy0tLS0tLS0tLS0tLQorVGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQKK2xpYnJhcnkuIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgR3J1bnRmaWxlLmpzIGFuZCBhCitwYWNrYWdlLmpzb24uIE1hbnkgb2YgdGhlIGJ1aWxkIGFuZCB0ZXN0IHRvb2xzIHVzZWQgaGVyZQorcmVxdWlyZSBhIHJlY2VudCB2ZXJzaW9uIG9mIE5vZGUuanMgdG8gYmUgaW5zdGFsbGVkLiBUbyAKK2luc3RhbGwgdGhlIHN1cHBvcnQgZmlsZXMgZm9yIHRoZSBHcnVudCBidWlsZCB0b29sIGV4ZWN1dGUKK3RoZSBjb21tYW5kOgorCisgICAgbnBtIGluc3RhbGwKKyAgICAKK1RoaXMgcmVhZHMgdGhlIHBhY2thZ2UuanNvbiBhbmQgcHVsbHMgaW4gdGhlIGFwcHJvcHJpYXRlCitzb3VyY2VzIGZyb20gdGhlIGludGVybmV0LiBUbyBidWlsZCB0aGUgSmF2YVNjcmlwdCBicmFuY2gKK29mIEFwYWNoZSBUaHJpZnQgZXhlY3V0ZSB0aGUgY29tbWFuZDoKKworICAgIG5weCBncnVudAorICAgIAorVGhpcyBydW5zIHRoZSBncnVudCBidWlsZCB0b29sIChmcm9tIHdpdGhpbiBgLi9ub2RlX21vZHVsZXMvLmJpbi9gKSwKK2xpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMsIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGhlCit0ZXN0cywgY29uY2F0ZW5hdGluZyBhbmQgbWluaWZ5aW5nIHRoZSBtYWluIGxpYnJhcmllcyBhbmQKK2dlbmVyYXRpbmcgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbi4KKworVHJlZQorLS0tLQorVGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyBhcmUgcHJlc2VudCAoc29tZSBvbmx5IGFmdGVyIHRoZQorZ3J1bnQgYnVpbGQpOgorICAvc3JjICAtIFRoZSBKYXZhU2NyaXB0IEFwYWNoZSBUaHJpZnQgc291cmNlCisgIC9kb2MgIC0gSFRNTCBkb2N1bWVudGF0aW9uCisgIC9kaXN0IC0gRGlzdHJpYnV0aW9uIGZpbGVzICh0aHJpZnQuanMgYW5kIHRocmlmdC5taW4uanMpCisgIC90ZXN0IC0gVmFyaW91cyB0ZXN0cywgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gbG9vayBmb3IKKyAgICAgICAgICBleGFtcGxlIGNvZGUKKyAgL25vZGVfbW9kdWxlcyAtIEJ1aWxkIHN1cHBvcnQgZmlsZXMgaW5zdGFsbGVkIGJ5IG5wbQorCisKK0V4YW1wbGUgSmF2YVNjcmlwdCBDbGllbnQgYW5kIFNlcnZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbGlzdGluZyBiZWxvdyBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CitUaHJpZnQgY2xpZW50IGFuZCBOb2RlLmpzIEphdmFTY3JpcHQgc2VydmVyIGZvciB0aGUgaGVsbG9fc3ZjIAorc2VydmljZS4gCisKKyMjIyBoZWxsby50aHJpZnQgLSBTZXJ2aWNlIElETCAKKyMjIyBidWlsZCB3aXRoOiAkIHRocmlmdCAtZ2VuIGpzIC1nZW4ganM6bm9kZSBoZWxsby50aHJpZnQKKyAgICBzZXJ2aWNlIGhlbGxvX3N2YyB7CisgICAgICBzdHJpbmcgZ2V0X21lc3NhZ2UoMTogc3RyaW5nIG5hbWUpCisgICAgfQorCisjIyMgaGVsbG8uaHRtbCAtIEJyb3dzZXIgQ2xpZW50CisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICAgICAgPHRpdGxlPkhlbGxvIFRocmlmdDwvdGl0bGU+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIGlkPSJuYW1lX2luIj4KKyAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImdldF9tc2ciIHZhbHVlPSJHZXQgTWVzc2FnZSIgPgorICAgICAgICA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PgorICAKKyAgICAgICAgPHNjcmlwdCBzcmM9InRocmlmdC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvaGVsbG9fc3ZjLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSVHJhbnNwb3J0KCIvaGVsbG8iKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgICAgPSBuZXcgaGVsbG9fc3ZjQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgIHZhciBuYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYW1lX2luIik7CisgICAgICAgICAgICB2YXIgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnZXRfbXNnIikKKyAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBjbGllbnQuZ2V0X21lc3NhZ2UobmFtZUVsZW1lbnQudmFsdWUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgIH0pKCk7CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworIyMjIGhlbGxvLmpzIC0gTm9kZSBTZXJ2ZXIKKyAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgICAgdmFyIGhlbGxvX3N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9oZWxsb19zdmMuanMnKTsKKyAgICAKKyAgICB2YXIgaGVsbG9faGFuZGxlciA9IHsKKyAgICAgIGdldF9tZXNzYWdlOiBmdW5jdGlvbihuYW1lLCByZXN1bHQpIHsKKyAgICAgICAgdmFyIG1zZyA9ICJIZWxsbyAiICsgbmFtZSArICIhIjsKKyAgICAgICAgcmVzdWx0KG51bGwsIG1zZyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHZhciBoZWxsb19zdmNfb3B0ID0geworICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorICAgICAgcHJvY2Vzc29yOiBoZWxsb19zdmMsCisgICAgICBoYW5kbGVyOiBoZWxsb19oYW5kbGVyCisgICAgfTsKKyAgICAKKyAgICB2YXIgc2VydmVyX29wdCA9IHsKKyAgICAgIHN0YXRpY0ZpbGVQYXRoOiAiLiIsCisgICAgICBzZXJ2aWNlczogeworICAgICAgICAiL2hlbGxvIjogaGVsbG9fc3ZjX29wdAorICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2YXIgc2VydmVyID0gVGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihzZXJ2ZXJfb3B0KTsKKyAgICB2YXIgcG9ydCA9IDkwOTk7CisgICAgc2VydmVyLmxpc3Rlbihwb3J0KTsKKyAgICBjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworCisKK1R5cGVTY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZpbGVzIGNhbiBhbHNvIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nOgorCisgICAgdGhyaWZ0IC0tZ2VuIGpzOnRzIGZpbGUudGhyaWZ0CisKZGlmZiAtLWdpdCBhL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uIGIvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDgxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwzNzc3IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5uZTkvSWlRL2h6SWhZNnBkRG5iQnR6N0RqUFRLclkwMFAvenZQU201cE9Ga2w2eHVHckduWG4vVnRUTk5mTnRBZlo5LzFSdGVoa3N6VTlxY1RpaTBRPT0iCisgICAgfSwKKyAgICAiYWdlbnQtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hZ2VudC1iYXNlLy0vYWdlbnQtYmFzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlZ3WE1yOW5IWVRVWHNCRktVcWhKd3ZsY1lVL2JscmVPRVVraE5SMmVYWkl2d2QrYytvNVY0TWdEUEtXbk1TLzU2YXdOM1RSeklQK0tvUG4rcm9RdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNpZnkiOiAiXjUuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jN1h1eWorclpUNDlQNVFpczBHdFFpQmR5V1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvIjogIl40LjYuMCIsCisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjEuMC4wIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWxpZ24tdGV4dCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbGlnbi10ZXh0Ly0vYWxpZ24tdGV4dC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUROa0tWaENUODEwS21TVnNJcmNHbERQNjBSYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIsCisgICAgICAgICJsb25nZXN0IjogIl4xLjAuMSIsCisgICAgICAgICJyZXBlYXQtc3RyaW5nIjogIl4xLjUuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13N002dGU0MkRZYmc1aWp3Um9ybjd5ZldWTjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFyci1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci1kaWZmLy0vYXJyLWRpZmYtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xa1lRZFA2LzdISG40VkkxZGhveW1sM0h4U0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLWZsYXR0ZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWZsYXR0ZW4vLS9hcnItZmxhdHRlbi0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTDNoS1Y1Ui9wNW84MVI3TzAySUdud3BEbWtwNkU5ODJYaHRidXdTZTNPNHFPdE1NTXRvZGljQVNBMUNueTJVK2FDWGNOcG1sK200ZFBzdnNKM2phdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyci11bmlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItdW5pb24vLS9hcnItdW5pb24tMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00NXNKcnFuZStHYW84Z2JpaUs5amtadXVPY1E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1lYWNoLy0vYXJyYXktZWFjaC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA1U3ZEQVdyRjFLRWJ1ZFRvZklSb0Z1Z3hFOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1maW5kLWluZGV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbmQtaW5kZXgvLS9hcnJheS1maW5kLWluZGV4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3dFS29TaCtGa3U5cHZseU93cVdvZXhCaDZFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXNsaWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXNsaWNlLy0vYXJyYXktc2xpY2UtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUIxcU1EM1JCUDdPOG8wSDJLYnJYRHlCMEljY2VqTUYxNSs4N0x2bG9yMTJPTlBSSFA2Z1RqWE1Oa3QvZDNadU9HYkFlNjZoRm1hQ2ZFQ0kyNFVmcDZ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS11bmlxdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pcXVlLy0vYXJyYXktdW5pcXVlLTAuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUpTM1hVdkU5czFubnZNa1NwL1k5R3JpMUNnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzbjEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNuMS8tL2FzbjEtMC4yLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp4d3pRcExRalNtV1hnd2FDWkU5TnorZ2xBRzAxeUYxUW5XZ2JoR3dISTVBNkZSSUVZNklWcXRIaEllcEhxSTcva3lFeVFFYWdCQzVtQkVGbElZdmRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIn4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhc3NlcnQtcGx1cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3NlcnQtcGx1cy8tL2Fzc2VydC1wbHVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOFM0UFBGMTNzTEhOMlJScFF1VHBiQjVOMVNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzc2lnbi1zeW1ib2xzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2lnbi1zeW1ib2xzLy0vYXNzaWduLXN5bWJvbHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XV1ovUWZyZFR5RE12Q3U1YTQxUGYzanNBMmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luY2tpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luY2tpdC8tL2FzeW5ja2l0LTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteDU3WmYzODB5NDhyb2J5WGtMekRaa2RMUzNrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhdG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F0b2IvLS9hdG9iLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1XbTZ1a29hT0dKaS83M3AvY2wyR3ZMalRJNUpNMWsvTzE0aXNENzNZTUw4U3RySC83L2xSRmdtZzhuSUNaZ0QzYlpadmp3Q0d4dE1PRDN3V05BdThjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzLXNpZ24yIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3cy1zaWduMi8tL2F3cy1zaWduMi0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRHNkpDVFNwV1I4dEwyK0cxK2FwOGJQK2RxZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzNCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hd3M0Ly0vYXdzNC0xLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmVaeHZOSElPdjg4RmxUN3J4Y1hJSUMwZlB0NEtacVpiT2xpdnlXdFhMdDhFU3g4NHpkM2tNQzZpSzVqVmVTMnF0K2c3ZnRTN3llNGZpMDZYNXJ0UlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIKKyAgICB9LAorICAgICJiYWxhbmNlZC1tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWJUUm1hc3I3a25lRms2Z0s0bk9SaTF4dDJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjExLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jhc2UvLS9iYXNlLTAuMTEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNVQ2UDR4UGdwcDBZREZ2U1d3RVo0Tm9FM2FNNFFCUVhEem1WYnJhQ2tGajh6SE0rbWJhOFN5cUI1RGJaV3lSN21ZSG82WTdCZFFvM01vQTRtMFRlUWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhY2hlLWJhc2UiOiAiXjEuMC4xIiwKKyAgICAgICAgImNsYXNzLXV0aWxzIjogIl4wLjMuNSIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAibWl4aW4tZGVlcCI6ICJeMS4yLjAiLAorICAgICAgICAicGFzY2FsY2FzZSI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImJjcnlwdC1wYmtkZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iY3J5cHQtcGJrZGYvLS9iY3J5cHQtcGJrZGYtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wREFkT0p0cVEvbTJmL1BLRWFQMlkzNDJEcDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJeMC4xNC4zIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRoSFRXTUk3a014NXdoTVFudGw3VnI5QzZCdlYxMGxGWERBYXNucW5yTVloWFZDenprNklPOUZvMkw3NWpYSFQwN1dyT25nTDFXRFhPcCt5WVM5MVlnPT0iCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJhY2VzIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlcy8tL2JyYWNlcy0yLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYU5kYm5qOVA4UGpkWFU0eWJhV0xLMklGM2pjL0VvRFliQzdBYXpXNnRvM1RSc2ZYeHNjQzlVWE9CNWlEaUVRcmt5SWJXcDJTTFFkYTQrUUFhN25jM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1mbGF0dGVuIjogIl4xLjEuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJmaWxsLXJhbmdlIjogIl40LjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAicmVwZWF0LWVsZW1lbnQiOiAiXjEuMS4yIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInNuYXBkcmFnb24tbm9kZSI6ICJeMi4wLjEiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMiIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS16bGliIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktemxpYi8tL2Jyb3dzZXJpZnktemxpYi0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXV6WDRwUm4yQU9ENmE0U0ZKQnlYblFGQit5MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYWtvIjogIn4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItZnJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZnJvbS8tL2J1ZmZlci1mcm9tLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NUWNYRVViQ0t0RW83YmhxRXM2NTYwSHlkNFhhb3ZabE8vazlWM2hqVlVGL3p3VzdLQlZkU0s0Z0l0L2J6d1M5TWJSNXFvYitGNWp1c1pzYjBZUUsyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLXNoaW1zIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1zaGltcy8tL2J1ZmZlci1zaGltcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Yak9NWE9JeGttdGg1TUNqRFIzN3dSS2kxRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWlsdGluLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVpbHRpbi1tb2R1bGVzLy0vYnVpbHRpbi1tb2R1bGVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnc4SGJGcHl3QzliWmFSOStVeGY0Nko0aVM4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhY2hlLWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FjaGUtYmFzZS8tL2NhY2hlLWJhc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFLY2RUbkZTV0FUZDUvR0NQUnhyMkNod0lKODVDZXlyRXlqUkhsS3hRNTZkNFhKTUd5bTB1QWlLbjB4YkxPR09sMyt5UnBPVGk0ODRkVkNFYzVBVXpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xsZWN0aW9uLXZpc2l0IjogIl4xLjAuMCIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJzZXQtdmFsdWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIsCisgICAgICAgICJ1bmlvbi12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAidW5zZXQtdmFsdWUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mQjBXMW5taHUrV2NvQ3lzN1BzQkhpQWZXaDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FtZWxjYXNlLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2Uta2V5cy8tL2NhbWVsY2FzZS1rZXlzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUl2dXIvM3lnUmtGSHZvZGt5SVR5UnVQa3VjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMi4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FzZWxlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nhc2VsZXNzLy0vY2FzZWxlc3MtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJnY0lmK0VBenlDWlVNSkJvbENEUmh4VWR3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNlbnRlci1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jZW50ZXItYWxpZ24vLS9jZW50ZXItYWxpZ24tMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZzB5WXB0dTZYSWdCQkhMMUVZY2tIdkN0NjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWxpZ24tdGV4dCI6ICJeMC4xLjMiLAorICAgICAgICAibGF6eS1jYWNoZSI6ICJeMS4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsYXNzLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsYXNzLXV0aWxzLy0vY2xhc3MtdXRpbHMtMC4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFPaFBhL0ZqN3M2VFk4SDhlc0d1NVFOcE1NUXh6NzloK3VyenJOWU42bW4rOUJueGxER2Y1UVorWGVDRHN4U2pQcXNTUjU2WE9aT0ptcGV1cm5MTWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0YXRpYy1leHRlbmQiOiAiXjAuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGkvLS9jbGktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Jb0YxTlBKTCtrbFF3MDFUTFVqc3ZHSWJqQlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICIwLjEuMiIsCisgICAgICAgICJnbG9iIjogIl43LjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpdWkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpdWkvLS9jbGl1aS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVMwZFhZUCtBSmt4MkxEb1hHUU11a2NmK29ORT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjZW50ZXItYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgInJpZ2h0LWFsaWduIjogIl4wLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICIwLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jby8tL2NvLTQuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYnFhOTg5aFRybFRNdU9SNytndnorUU1mc1lRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjb2ZmZWVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZmZlZXNjcmlwdC8tL2NvZmZlZXNjcmlwdC0xLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01NnFEQVpGKzlpR3pYWW81ODBqYzNSMjM0ejQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sbGVjdGlvbi12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xsZWN0aW9uLXZpc2l0Ly0vY29sbGVjdGlvbi12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVM4QTNQQlpMd3lrYlRUYU1ncHp4cUFwWjNLQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRm9wSEFYVnJhbjlSb1N6Z3lYdjZLTUNFN1dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbWJpbmVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lZC1zdHJlYW0vLS9jb21iaW5lZC1zdHJlYW0tMS4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJyV2w5eTZ2T0IxeFlQWmNwWmRlM045ekRCeVhUb3NBZU1EbzRwMXd6bzZVTU9YNHZ1bUIrVFAxUlo3NnNmRTZNZDY4UTBOSlNyRS9nYmV6ZDRVbCt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxheWVkLXN0cmVhbSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tcG9uZW50LWVtaXR0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tcG9uZW50LWVtaXR0ZXIvLS9jb21wb25lbnQtZW1pdHRlci0xLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUUza1kxdGVDZy9mZmVtdDhXbVBoUU9hVUplWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25jYXQtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbmNhdC1tYXAvLS9jb25jYXQtbWFwLTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMktscjEzL1dqZmQ1T25NRGFqdWcxVUJkUjNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LXN0cmVhbS8tL2NvbmNhdC1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTI3SEJnaEp4amladElrM1ljdm4vNGtiSmsvMXVadUpGZnVQRW5zNkxhRXZwdkcxZjBoVGVhOGxpbHJvdXlvOW1WYzJHV2RjRVo4T0xvR21TQURsckN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItZnJvbSI6ICJeMS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4zIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4yLjIiLAorICAgICAgICAidHlwZWRhcnJheSI6ICJeMC4wLjYiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zb2xlLWJyb3dzZXJpZnkvLS9jb25zb2xlLWJyb3dzZXJpZnktMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Q1FjUlhNS244WXlPeUJ0dnpqdHgwSFF1eEE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGF0ZS1ub3ciOiAiXjAuMS40IgorICAgICAgfQorICAgIH0sCisgICAgImNvcHktZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3B5LWRlc2NyaXB0b3IvLS9jb3B5LWRlc2NyaXB0b3ItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aMjl1czhPWmw4THVHc09wSlAxaEpIU1BWNDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29yZS11dGlsLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcmUtdXRpbC1pcy8tL2NvcmUtdXRpbC1pcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmMVVJZ3FpdkZxMWVxdHhRTWxBZFVVRHdhYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjcm9zcy1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcm9zcy1zcGF3bi8tL2Nyb3NzLXNwYXduLTYuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lVFZMckJTdDdmamJEeWd6ODA1cE1uc3RJczJWVEJOa1JtMHF4WmQrTTdBNVhEZHhWUldPNU14R0JYWmhqWTRjcUxZTGR0ckdxUmY4bUJQbXp3U3BXUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibmljZS10cnkiOiAiXjEuMC40IiwKKyAgICAgICAgInBhdGgta2V5IjogIl4yLjAuMSIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4wIiwKKyAgICAgICAgInNoZWJhbmctY29tbWFuZCI6ICJeMS4yLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMi45IgorICAgICAgfQorICAgIH0sCisgICAgImN1cnJlbnRseS11bmhhbmRsZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3VycmVudGx5LXVuaGFuZGxlZC8tL2N1cnJlbnRseS11bmhhbmRsZWQtMC40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tSTN6UCtxeGtlOTVtbUUybmRkc0Y2MzVWK289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZmluZC1pbmRleCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY3ljbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3ljbGUvLS9jeWNsZS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUllZ0xLK2hZRDVpMGFQTjVRd1ppc0ViRFN0ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZGFzaGRhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE0LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Rhc2hkYXNoLy0vZGFzaGRhc2gtMS4xNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFR6NkQzeStMKzFkNGdNbXVOMVlFRFgyNHZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGF0ZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGF0ZS1ub3cvLS9kYXRlLW5vdy0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZ2UTUvVTFJU0sxMDVjeDl2dklBWnl1ZU5Gcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkYXRlZm9ybWF0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlZm9ybWF0Ly0vZGF0ZWZvcm1hdC0xLjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ueEpMWjFsTWszLzNCcE11U21Rc3lvMjcvdWs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl40LjAuMSIsCisgICAgICAgICJtZW93IjogIl4zLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWJ1ZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTIuNi45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibXMiOiAiMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVjYW1lbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNhbWVsaXplLy0vZGVjYW1lbGl6ZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlsTk5GUlNDYWJJRFV1ZSs0bTlRSDVvWkVwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWNvZGUtdXJpLWNvbXBvbmVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNvZGUtdXJpLWNvbXBvbmVudC8tL2RlY29kZS11cmktY29tcG9uZW50LTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnprVE16UllkMXk0VE5HaCt1QmlFR3U0ZFVVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp3SzJVVjRjblBwYmNHNytWUkFSS1RaUFVXb3d3WEE4YnpINU5QNnVkMG9lQXh5WVB1R1pVQUM3aE11Z3BDZHo0QmVTWmwyRGw5azY2Q0hKLzQ2WllRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMiIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkZWxheWVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxheWVkLXN0cmVhbS8tL2RlbGF5ZWQtc3RyZWFtLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3pyaG1heXQrMzFFQ3FyZ3NwNGljckpPeGhrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdC1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1maWxlLy0vZGV0ZWN0LWZpbGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Tlp0QTJjcWdseXh0enZiUCtZakVNamxVcmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9tLXNlcmlhbGl6ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tLXNlcmlhbGl6ZXIvLS9kb20tc2VyaWFsaXplci0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJ6eHBkVWJPQjRET0k3NUtLT0tUNUF2RERJST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICJ+MS4xLjEiLAorICAgICAgICAiZW50aXRpZXMiOiAifjEuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWVsZW1lbnR0eXBlLy0vZG9tZWxlbWVudHR5cGUtMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdlNoM1BpWkNpQnJzVVZSSkpDbWNYTmdpR0ZzPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVudGl0aWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW50aXRpZXMvLS9lbnRpdGllcy0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ibHd0Q2xZaHRkcmE3TytBdVE3ZnRjMTNjdkE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZG9tZWxlbWVudHR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNYcnRndWlyV2VVdDJjR2JGMWJnL0JoeUJNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb21oYW5kbGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWhhbmRsZXIvLS9kb21oYW5kbGVyLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTGVXYUNDTFZBbityLzI4RExDc2xvcWlyNXpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZG9tdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tdXRpbHMvLS9kb211dGlscy0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTNOaElpaWIxWTlZUWVlU01uM3QrTWpjMmdzOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb20tc2VyaWFsaXplciI6ICIwIiwKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZWNjLWpzYm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWNjLWpzYm4vLS9lY2MtanNibi0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9vT3BCT1ZEVXloNGRNVmt0MVNUaG9TYW1Naz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnRpdGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc3BoNm80SVRSL3plWkNzay9meWVUN2NTdnlZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVycm9yLWV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Vycm9yLWV4Ly0vZXJyb3ItZXgtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdkRkhObXFlRlNFdDJaQnNDcmlvcktubjNaMnBqK2ZkOWttSTZRb1d3NC8vREwraWNFQmZjMFU3cUpDaXNxclRzS1RqdzRmTkZ5MnBXOU9xU3REODRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hcnJheWlzaCI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXM2LXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXM2LXByb21pc2UvLS9lczYtcHJvbWlzZS00LjIuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbjZ3dnBkRTQzVkZ0SnErbFVEWURCRlV3VjhUWmJ1R1hMVjRENndLYWZnMTNsZHpuS3N5RXZhdHVibm1VZTMxemN2ZWxTek9IRitYYmFUK0JsOU9iRGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzNi1wcm9taXNpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzaWZ5Ly0vZXM2LXByb21pc2lmeS01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVRbldMejVXNnBaOFMyTlFXdThJS1J5S1VnTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlczYtcHJvbWlzZSI6ICJeNC4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcySEFWaUdRcU4vMnJqdXl6d0lBeWhNTGh0UT0iCisgICAgfSwKKyAgICAiZXNwcmltYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTAuNC4xNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWoyRzNYTjRCS3k2ZXNvVFVWRldEdFdRN1lhcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleGl0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4aXQvLS9leGl0LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQmpKamo0MkhmTWdoQjlNS0QvOGFGOHVoelF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC1icmFja2V0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtYnJhY2tldHMvLS9leHBhbmQtYnJhY2tldHMtMi4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10M2MxNHhYT01QYTI3L0Q0T3dRVkdpSkVsaUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiXjIuMy4zIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogIl4wLjEuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4cGFuZC10aWxkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGlsZGUvLS9leHBhbmQtdGlsZGUtMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sK2dCcWdVdDhDUlUza2F3Sy9ZaFpDemNoUUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC8tL2V4dGVuZC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmpxdUM1OWNEN0N5VzZ1ck5YSzBGQnVma1pjb2lHRzgwd1R1UHVqWDU5MGNCNVR0bG4yMEUyVUI0Uy9XQVJWcWhYZmZabDJMTmdTK2dRZFBJSWltL2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KcWNhcndjN09mc2hKeGNuUmhNY0p3UUNqYmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzaWduLXN5bWJvbHMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjEuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hcm5YTXhUMWhob0tvOWsxTFpkbWxOeUpkRERmeTJ2MGZYakZsbW9rNCtpOHVsLzZXbGJWZ2U5YmhNNzRPcE5QUVBNR1VUb0R0eitLWGExUG5lSnhPQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGdsb2IvLS9leHRnbG9iLTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ObWI2UVhrRUxzdUJyMjRDSlNraWxvNlVISGdiZWtLNVVpWmdmRTZVSEQzRWIyN1lDNm9EK2JoY1QrdEo2Y2w4ZG1zZ2RReG5XbGNyeThrc0JJQkxwdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImV4cGFuZC1icmFja2V0cyI6ICJeMi4xLjQiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRyYWN0LXppcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRyYWN0LXppcC8tL2V4dHJhY3QtemlwLTEuNi43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVDMHVLOWtBeVpNamJWL1R4cDBNejc0SCtrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiMS42LjIiLAorICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAibWtkaXJwIjogIjAuNS4xIiwKKyAgICAgICAgInlhdXpsIjogIjIuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImV4dHNwcmludGYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0c3ByaW50Zi8tL2V4dHNwcmludGYtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1scEdFUU9NRUducEJUNHhTNDhWMDZ6dytIZ1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leWVzLy0vZXllcy0wLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlzOFNBalRHZzNoZGtDTklxQUR2UGd6Q0M4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGVlcC1lcXVhbC8tL2Zhc3QtZGVlcC1lcXVhbC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdGTkhlQmZJYTFIYXFGUElIZ1diY3owQ05oUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFSUXNESzdtc1JpZmg5T25ZUkVHVDRiSXUvST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmQtc2xpY2VyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZkLXNsaWNlci8tL2ZkLXNsaWNlci0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWkxdkwyZXd5ZkZCQnY1cXdJLzFuVVBFWGZtVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwZW5kIjogIn4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTEuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteStIanIvenh6VVM0REszKzBvM0hrNmx3SFM0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxsLXJhbmdlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGwtcmFuZ2UvLS9maWxsLXJhbmdlLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVVTQkhVS1BtT3NHcGozRUF0SkFQREtNT1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIiwKKyAgICAgICAgInRvLXJlZ2V4LXJhbmdlIjogIl4yLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmQtdXAvLS9maW5kLXVwLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYXk2WUlyR2l6Z3BncTJUV0VPeksxVHl5VFE4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtZXhpc3RzIjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU41TUtwZGdXdDNmQU5FWGhsbXpHZVFwTUN4WT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIn41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMTUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi01LjAuMTUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzhrMnVlQXZTbUEvekNJdXozWXowd3VMazdFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIjIgfHwgMyIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmVkLy0vZmluZWQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMzNJUkxkcUwxNXdnZWlFOThDdU5FOFZOSFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4zIiwKKyAgICAgICAgIm9iamVjdC5kZWZhdWx0cyI6ICJeMS4xLjAiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMi4wIiwKKyAgICAgICAgInBhcnNlLWZpbGVwYXRoIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGFnZ2VkLXJlc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmxhZ2dlZC1yZXNwYXduLy0vZmxhZ2dlZC1yZXNwYXduLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVG5tdW15NnppL2hyTzdWcjgrQ2xhcVg4cTljPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZvci1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3ItaW4vLS9mb3ItaW4tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nUWFOS1ZxQlF1d0t4eWJHNGlBTU1QdHRYb0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLW93biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3Itb3duLy0vZm9yLW93bi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhqTXk5QlhPM0VzRTIvNXd6NE5rbE1VOHRFcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmb3ItaW4iOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZvcmV2ZXItYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yZXZlci1hZ2VudC8tL2ZvcmV2ZXItYWdlbnQtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rOGNmREVHdDZ6ZjViRmQ2MGUxQzJQMnN5cEU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImZvcm0tZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JtLWRhdGEvLS9mb3JtLWRhdGEtMi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFsTEtCMk11M2FHUDFRLzJlQ094MGZOYlJNZTdYZHdrdHdPcnVoZnFxZDBySUpXd040RGgrRTNoclBTbERDWG5TUjdVdFoxTjM4clZYbSs2K01FaEpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmNraXQiOiAiXjAuNC4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJeMS4wLjYiLAorICAgICAgICAibWltZS10eXBlcyI6ICJeMi4xLjEyIgorICAgICAgfQorICAgIH0sCisgICAgImZyYWdtZW50LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZyYWdtZW50LWNhY2hlLy0vZnJhZ21lbnQtY2FjaGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RcEQ2MG44VDZKdm44emVaeHJ4YUNyLy9EUms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1leHRyYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy1leHRyYS8tL2ZzLWV4dHJhLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtelR6bDkrZkxZVVdJUDhyakdSNllkL2hZZVZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAianNvbmZpbGUiOiAiXjIuMS4wIiwKKyAgICAgICAgImtsYXciOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJrbGF3IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMS4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUUloRE8wYXpzYm9sblhoNFhZNlc5enVnSkRrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS45IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZzLnJlYWxwYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLnJlYWxwYXRoLy0vZnMucmVhbHBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GUVN0SlNNVmpLcEEyMG9uaDhzQlFSbVU2azg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LXN0ZGluIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1zdGRpbi8tL2dldC1zdGRpbi00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVXakdzS0JEaERKSkF1aS9HbDN6Slhta1VQND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXZhbHVlLy0vZ2V0LXZhbHVlLTIuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM0JYS0hHY2poOHAydlRlc0NqbGJvZ1FxTENnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldG9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXRvYmplY3QvLS9nZXRvYmplY3QtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CSHBFbDRuNkZnMEJqMVNHN1pFeUMyN0hpRnc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0cGFzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXRwYXNzLy0vZ2V0cGFzcy0wLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVh2K09QbWhOVnBya3l5c1NnbUJPaTZZaFNmbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUnV2cjBubEpiak5reVlORktzVFlWS3o5WG89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjIiLAorICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYmFsLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLW1vZHVsZXMvLS9nbG9iYWwtbW9kdWxlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItc0t6cEVrZjExR3BPRnV3MFp6anptdDRCNFVad2pPY0c3NTdQUHZyZmh4Y0xGYnEwd3BzZ3BPcXhweHR4RmlDRzREdEc5M002WFJWYkYyb0dkZXY3Ymc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2JhbC1wcmVmaXgiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtcHJlZml4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbC1wcmVmaXgvLS9nbG9iYWwtcHJlZml4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMi9kRHhzRkprbGs4WlZWb3kyYnRNc0FTTHI0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4cGFuZC10aWxkZSI6ICJeMi4wLjIiLAorICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiLAorICAgICAgICAiaW5pIjogIl4xLjMuNCIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjE0IgorICAgICAgfQorICAgIH0sCisgICAgImdyYWNlZnVsLWZzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncmFjZWZ1bC1mcy8tL2dyYWNlZnVsLWZzLTQuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURvdmY1TkhkdUlWTlpPQk9wOEFPS2dKdVZsZz0iCisgICAgfSwKKyAgICAiZ3J1bnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQvLS9ncnVudC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItL0p6bVpOUGZLb3JsQ3JybXhXcVFPNEpWb2RPK0RWZDVYWDREa29jTC8xV2xMbEtWTEU5K1NkRUllbXBPQXhEaFdQeXNMbGU2YWZ2bi9oZzdDazJrOWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvZmZlZXNjcmlwdCI6ICJ+MS4xMC4wIiwKKyAgICAgICAgImRhdGVmb3JtYXQiOiAifjEuMC4xMiIsCisgICAgICAgICJldmVudGVtaXR0ZXIyIjogIn4wLjQuMTMiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAifjAuMy4wIiwKKyAgICAgICAgImdsb2IiOiAifjcuMC4wIiwKKyAgICAgICAgImdydW50LWNsaSI6ICJ+MS4yLjAiLAorICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6ICJ+Mi4wLjAiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LXV0aWwiOiAifjEuMS4xIiwKKyAgICAgICAgImljb252LWxpdGUiOiAifjAuNC4xMyIsCisgICAgICAgICJqcy15YW1sIjogIn4zLjUuMiIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjYiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJ+MS4wLjAiLAorICAgICAgICAicmltcmFmIjogIn4yLjYuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ3J1bnQtY2xpIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY2xpLy0vZ3J1bnQtY2xpLTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVZpc1JucnNHbmR0R1NzNG9SVkFiNlhzMXRxZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAgICAgImdydW50LWtub3duLW9wdGlvbnMiOiAifjEuMS4wIiwKKyAgICAgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICAgICAicmVzb2x2ZSI6ICJ+MS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jbGkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY2xpLy0vZ3J1bnQtY2xpLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Vd0JSdS9RcEFqRGM1M0RSTEVreWlsRmRMMHplbnB4dStmZGRUSWxzRi9LSnFkTmNIYVFtdnl1MVczY0Rlc1o5cnFxWmRLSzVBOCtRREl5TFVFV29aUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAiaW50ZXJwcmV0IjogIn4xLjEuMCIsCisgICAgICAgICJsaWZ0b2ZmIjogIn4yLjUuMCIsCisgICAgICAgICJub3B0IjogIn40LjAuMSIsCisgICAgICAgICJ2OGZsYWdzIjogIn4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWNvbmNhdC8tL2dydW50LWNvbnRyaWItY29uY2F0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVZDWVl3aE9oeDEraHQ1SXdCVWxudGwzUmIwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItanNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi1qc2hpbnQvLS9ncnVudC1jb250cmliLWpzaGludC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5wMlFteVdUeEE2TDU1bEFzaE5BaFF4NU9hdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4xLjEiLAorICAgICAgICAiaG9va2VyIjogIl4wLjIuMyIsCisgICAgICAgICJqc2hpbnQiOiAifjIuOS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLXF1bml0Ly0vZ3J1bnQtY29udHJpYi1xdW5pdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczk5NCtpcEt3YytvVVVJV2FHSXcxc295SUQ0cEV4U0dNZC9jSFFONWgwcDhLYklqUjFMZTNaQzNnaVNEREtYdFpGRTBpK09iZjB1SWpOdmpmdFgyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAiXjUuMC4xIiwKKyAgICAgICAgInAtZWFjaC1zZXJpZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgInB1cHBldGVlciI6ICIxLjcuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTUuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVlaZWdsZFg3YTFmb2xDOXYxK3F0WTZDY2xGST0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItdWdsaWZ5Ly0vZ3J1bnQtY29udHJpYi11Z2xpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ybWVrYjVGVDdkVExFWUU2VmV0cHh3MTlzdnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4wLjEiLAorICAgICAgICAibWF4bWluIjogIl4xLjEuMCIsCisgICAgICAgICJ1Z2xpZnktanMiOiAifjIuNi4yIiwKKyAgICAgICAgInVyaS1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWpzZG9jLy0vZ3J1bnQtanNkb2MtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWdDNjZUQ1JYZVFNajNISXlxVlNCSm04emRVejQzZTV2YUcvUExPLzYyN0ExZWRiSm56eGhKVjduRjBLcUx3TU0wUkROdTFpc3RDNmZ2Zm5ZcUZLaTN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAianNkb2MiOiAifjMuNS41IiwKKyAgICAgICAgIm1hcmtlZCI6ICJeMC41LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1hcmtlZCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjUuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjUuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlVa0JaZWdDWm91NEFkd2JLVHdTVy9sTkRjejVPdVJTbDNxZGNsMzFJYTBCMlFQRzBKbit0S2JsaC85L2VQOS82KzRoMjd2cG9oOHdlbC92UU9WMHZ3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1rbm93bi1vcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWtub3duLW9wdGlvbnMvLS9ncnVudC1rbm93bi1vcHRpb25zLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jSHdzTHFvaWdocHU3VHVZajVSb25uRXV4R1ZGbnp0Y1VxVHFwNXJYRkdZTDRPdVBGb2Z3QzRZY2c3bjlmWXd2SzZGNVdiWWdlVk93cGg5Q3JzMmZzUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktbG9nLy0vZ3J1bnQtbGVnYWN5LWxvZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW0zKzVRdkRZZlIxbHRyOGhqaWFpTmpkZHhHZFFXY0gwcncxaUtLaVFuRjAreHRnVGF6aXJTVEd1NjhSY2hQeWgxT0JuZzFiQlVqTG1YOHE5TnBvQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9ycyI6ICJ+MS4xLjIiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZy11dGlscyI6ICJ+Mi4wLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMvLS9ncnVudC1sZWdhY3ktbG9nLXV0aWxzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vN3VIeU8vSitpMnRYRzhyMmJaTmxWazIwdmxJRko5SUVZeUhNQ1FHZldZcnU4SnYzd1RxS1p6dlYzMFlXOXJXRWpxMGVQM2NmbFExcVdvakllOVZGQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAifjIuNC4xIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktdXRpbC8tL2dydW50LWxlZ2FjeS11dGlsLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05enlBMjl3L2ZCZTZCSWZqR0VObmR3b2UxVXkzMUJJWHhUSDNzOG1nYTBaNUJ6MlNwNFVDamtleXYydEk0NDl5bWt4M3gyNkIrNDZGVjRmWEVkZGw1QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAifjEuNS4yIiwKKyAgICAgICAgImV4aXQiOiAifjAuMS4xIiwKKyAgICAgICAgImdldG9iamVjdCI6ICJ+MC4xLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuMTAiLAorICAgICAgICAidW5kZXJzY29yZS5zdHJpbmciOiAifjMuMy40IiwKKyAgICAgICAgIndoaWNoIjogIn4xLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1zaGVsbC1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtc2hlbGwtc3Bhd24vLS9ncnVudC1zaGVsbC1zcGF3bi0wLjMuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nYnVOUlg3RWZUR0NxSDFqQ08rRVhkKzVTSTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQiOiAiPj0wLjQueCIsCisgICAgICAgICJzeW5jLWV4ZWMiOiAifjAuNi4yIgorICAgICAgfQorICAgIH0sCisgICAgImd6aXAtc2l6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nemlwLXNpemUvLS9nemlwLXNpemUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1acytMRUJCSEludVZ1czV1b2RvTUYzN1Z3aTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJvd3NlcmlmeS16bGliIjogIl4wLjEuNCIsCisgICAgICAgICJjb25jYXQtc3RyZWFtIjogIl4xLjQuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXItc2NoZW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci1zY2hlbWEvLS9oYXItc2NoZW1hLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcVV3aUpPdkt3RWVDb05rRFZTSHlSelczN0pJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJoYXItdmFsaWRhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci12YWxpZGF0b3IvLS9oYXItdmFsaWRhdG9yLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rcW5tTmpJNE9mSDJpcFE5VlFPdzIzYkJkL2lidGZiVmRLMmZZYlk0YWNURHFLVFcvWURwOU1jaW1aZERiRzhpVjlmWml6VXFRTUQ1eHZyaUIxNDZUQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFqdiI6ICJeNS4zLjAiLAorICAgICAgICAiaGFyLXNjaGVtYSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWFuc2kvLS9oYXMtYW5zaS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5QVUVuT0hzM3lzR1NhOCs4azVGN1RWQmJaRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGRSVTNDR1pyaUpXbWZOR2Zsb0g4N2xWdXYwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTEtCMmxoYkhGeFIzdkpNa3c3U21ndm1zWGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWVzIjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLXZhbHVlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxiQzJQK3doUm1HYWIrVi81MVlvMWFPZS9rOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjQuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNC4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUlFOTg5Y1Nrb3NnYzNocEdrVUdiNjV5M1ZjPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaGFzaGEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzaGEvLS9oYXNoYS0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVOZkwvQjV0WmpBLzU1ZzNObG1FVVhzdmJ1RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtc3RyZWFtIjogIl4xLjAuMSIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9tZWRpci1wb2x5ZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob21lZGlyLXBvbHlmaWxsLy0vaG9tZWRpci1wb2x5ZmlsbC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRDdThpbldKbVA3cjllMW9XQTkyMUdkb3RMdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXJzZS1wYXNzd2QiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhvb2tlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob29rZXIvLS9ob29rZXItMC4yLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11RFQzSTh4S0pDcW1XV05GbmZiWmhNWFQyVms9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaG9zdGVkLWdpdC1pbmZvIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvc3RlZC1naXQtaW5mby8tL2hvc3RlZC1naXQtaW5mby0yLjcuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN1QvQnhIMTl6YmNDVGE4WGtNbGJLNWxUbzFXdGdrRmkzR3ZkV0V5TnVjNFZleDcvOURxYm5wc2Y0Sk15ZGNmajlIQ2c0elVXRlRMM1phNmxhcGc1L3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImh0bWxwYXJzZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMy44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0bWxwYXJzZXIyLy0vaHRtbHBhcnNlcjItMy44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tV3dvc1pGUmFvdm9aUUduMTVkWDVjY01FR2c9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIsCisgICAgICAgICJkb21oYW5kbGVyIjogIjIuMyIsCisgICAgICAgICJkb211dGlscyI6ICIxLjUiLAorICAgICAgICAiZW50aXRpZXMiOiAiMS4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICIxLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cC1zaWduYXR1cmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cC1zaWduYXR1cmUvLS9odHRwLXNpZ25hdHVyZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW11elpKUkZIY3ZQWlcyV21DcnVQZkJqN3JPRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImpzcHJpbSI6ICJeMS4yLjIiLAorICAgICAgICAic3NocGsiOiAiXjEuNy4wIgorICAgICAgfQorICAgIH0sCisgICAgImh0dHBzLXByb3h5LWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0dHBzLXByb3h5LWFnZW50Ly0vaHR0cHMtcHJveHktYWdlbnQtMi4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhQQ1RTMUxXNTFiY3lNWWJ4VUlPTzRIRU9sUTEvMXFSYUZXY3l4dndhcVVTOVRZODhhb0V1SFVZMzNrdUFoMVloVlZhRFFoTFpzblBkK1hOQVJXWmxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhZ2VudC1iYXNlIjogIl40LjEuMCIsCisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5kZW50LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmRlbnQtc3RyaW5nLy0vaW5kZW50LXN0cmluZy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWppMUlOSWRDRWh0S2doaTNvVGZwcFNCSjNJQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXBlYXRpbmciOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImluZmxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TYjFqTWRmUUxRd0p2SkVLRUhXNmdXVzFiZms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5oZXJpdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl6d3NnK1BhUXFVQzlTUm1BaVNBOUNDQ1lkND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5pLy0vaW5pLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlk1aHVJS0NNUldEVXFabEVpNzJmL2xtWEtNdnVzemNNQmR1bGlRM25uV2J4OVgvWkJRTzdEaWpNRVlTOUVoSEJiMnFhY1JVTXRDN3N2THdlMGxjdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW50ZXJwcmV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ludGVycHJldC8tL2ludGVycHJldC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZ0R3hRUXhxRGc5NHo1WFR1RVFNWS9lTGhoUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hYnNvbHV0ZS8tL2lzLWFic29sdXRlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kT1dvcWZsdmN5ZEFSYTM2MEd2djE4RFovZ1J1SEtpMk5VL3dVNVgxWkZ6ZFlmSDI5bmtpTlpzRjNtcDRPSjNINHlvOU14OEEvdUFHTnpwelBOM3lCQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcmVsYXRpdmUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMC4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZUVzczY2TmgyY243dTg0US9pZ2lYdGNtTlk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1hcnJheWlzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hcnJheWlzaC8tL2lzLWFycmF5aXNoLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZDhtWVFGSjZxT3l4cUxwcGU0QmtXbnFTYXAwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1idWZmZXIvLS9pcy1idWZmZXItMS4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5jZEFMd3BYa1RtNVp2dmJrN293T1VTdlZ2QktEZ0tQNS9ld2ZYRXpubVFGZnM0WlJtYW5PZUtCVGpSVmprYTNRRm9ONlhKKzlGM1VTcWZIcVRhVTV3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1idWlsdGluLW1vZHVsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1aWx0aW4tbW9kdWxlLy0vaXMtYnVpbHRpbi1tb2R1bGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WQVZ5MDA5Nnd4R2ZqM2JEREx3YkhnTjYvNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVpbHRpbi1tb2R1bGVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQzE3bVNEaU9MSVlDZ3VlVDhZVnY3RDh3RzFZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXZEWXIwU0IzRHdPOXpzTW92MGdLQ0VTRllxQ25FNGhxLzR6M1RkVWx1a0V5NXQ5QzBZUnE3SExyc041Mk5BY3FYS2FlcGVDRDBuK0IwYXJuVkczSGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjAuMS42IiwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMC4xLjQiLAorICAgICAgICAia2luZC1vZiI6ICJeNS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi01LjEuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5HRUVybkg2RjJ2VXVYRGgrT2xiY0tXNy93T2NmZFJIYVo3Vld0cUN6dGZIcmkvKytZS21QNTFPZFdlR1B1cUNPYmE2a2syT1RlNWQwMlZtVEI4MFB3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXJFUTRvbWtjVUdPUHNOcVlYMUhMakFkL0lrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0Z2xvYi8tL2lzLWV4dGdsb2ItMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSXdDVTFlUjhDN1RmSGFodWVxWGM4Z3orTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZmluaXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZpbml0ZS8tL2lzLWZpbml0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXpHWjNhVllDdmxVTzhSNkxTcVl3VTBLMjBLbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJudW1iZXItaXMtbmFuIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1nbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWdsb2IvLS9pcy1nbG9iLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZTZXdUpDRjRCS3h3Y0h1V2tpVm5TR3pENkVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWV4dGdsb2IiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLW51bWJlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1udW1iZXIvLS9pcy1udW1iZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KUDFpQWFSNExQVUZZY2dRSjJyOGZSTFhFWlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wbGFpbi1vYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGxhaW4tb2JqZWN0Ly0vaXMtcGxhaW4tb2JqZWN0LTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oNVBwZ1hrV2l0YzM4QkJNWWF3VFlNV0pIRlpKVm5CcXVGRTU3eEZwakI4cEpGaUY2Z1orYlUrV3lJL3lxWGlGUjVtZExzZ1lOYVBlOHVhbzZVdjlPZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXJlbGF0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlbGF0aXZlLy0vaXMtcmVsYXRpdmUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUt3L1JlSzBpcXdLZXUwTUlUTEZ1ajBqYlBBbUVpT3NJd3lJWHZ2YmZhNlFmbU45cGtEMU0rOHBkazdSbC9kVEtiSDM0L1hCRk1iZ0Q0aU1KaExRYkdBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy11bmMtcGF0aCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXN0cmVhbS8tL2lzLXN0cmVhbS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUV0U2ozVTVvNExlYzY0MjhoQmM2NkEyUnlrUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdHlwZWRhcnJheSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy10eXBlZGFycmF5Ly0vaXMtdHlwZWRhcnJheS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTVIbklDRmpmREJzUjNkcHBRUGxnRWZ6YVNwbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdW5jLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdW5jLXBhdGgvLS9pcy11bmMtcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbXJHcFZkMGZzN1dXTGZWc1N0dmdGNmlFSm5iakRGWmg5L2VtaFJEY0dXVGR1VGZOSGQ5Q0hlVXdIM2dZSWpkYndvNE9uNmh1bmt6dHdPYUF3MHlsbFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuYy1wYXRoLXJlZ2V4IjogIl4wLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy11dGY4IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXV0ZjgvLS9pcy11dGY4LTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU3cyaFJDRUUwYk0yTkE2QWVYNkdYUE9mZlhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXdpbmRvd3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtd2luZG93cy8tL2lzLXdpbmRvd3MtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVYSzFVSW5xMmJQbWp5WDZlM1ZISXpNTG9iYzRKOTRpNEFXbitIcHEzT1U1S2tyUkM5Nk9BY1IzUFJKL3BHdTZtOFRSbkJIUDlka1hRVnNUL0NPVklBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNvYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRrTWVrckVhbHpGamFxSDV5TkhNdlAycmVOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3N0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3N0cmVhbS8tL2lzc3RyZWFtLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUitZL2V2VmErbStTNFZBT2FRNjR1RktjQ1pvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzLXlhbWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM2ZEZ0JmS3ZITWlzTkg3elNXa2tXUWZMNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC4yIiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNi4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInhtbGNyZWF0ZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAianNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2JuLy0vanNibi0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBlWlV3dVdpM3JYeUFkbHM3N3lvREE3eTlSTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzaGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2hpbnQvLS9qc2hpbnQtMi45LjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtPOVNJQUtUbEpRT000bEU2NEdRVXRHQlJwVE91dmJyUnJTWnczQWhVeE1ORzI2Nm5YOWhLMmNLQTRTQmhYT2owaXJKR3lOeUdTTFQ2MkhHT1ZERU9BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjbGkiOiAifjEuMC4wIiwKKyAgICAgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6ICIxLjEueCIsCisgICAgICAgICJleGl0IjogIjAuMS54IiwKKyAgICAgICAgImh0bWxwYXJzZXIyIjogIjMuOC54IiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgInBoYW50b20iOiAifjQuMC4xIiwKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJ+Mi4xLjciLAorICAgICAgICAic2hlbGxqcyI6ICIwLjMueCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIjEuMC54IiwKKyAgICAgICAgInVuaWNvZGUtNS4yLjAiOiAiXjAuNy41IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMS4wLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSGhYN3lzbDlQdW1iOHRjN1RHVnJDQ3U2KzVFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImpzbGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNsaW50Ly0vanNsaW50LTAuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUm9Dc3lJQ2NLQSs2VEZzYnlzOURwS1RmUFZhQzcxTW01UVNqdnJXQTBsRFZOK0xJdng2YXBhNDJGRmlzTXFtQ1R2SjhEeGtjb1FHSjBqN20za1RWb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4aXQiOiAifjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAifjcuMS4yIiwKKyAgICAgICAgIm5vcHQiOiAifjMuMC4xIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJ+Mi4xLjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNy4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm5vcHQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9jZXNzLW5leHRpY2stYXJncy8tL3Byb2Nlc3MtbmV4dGljay1hcmdzLTEuMC43LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUZRNGd0MVpaQ3RQNUVKUHlXazhxMkwvekM2TT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjEuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1adnFMY2c0VU9MTmthQjhxMGFZOFlZUkl5ZEE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYnVmZmVyLXNoaW1zIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjEuMC42IiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IiwKKyAgICAgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEvLS9qc29uLXNjaGVtYS0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRJRElrdVdhTHdXVlRPY252VDhxVG9ndm5oTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5KcHRSTVU2VWQ2SnRBZ0Z4ZFhsbTBGOU0wQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0cmluZ2lmeS1zYWZlLy0vanNvbi1zdHJpbmdpZnktc2FmZS01LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUVwYWkxWS9VWHhtZzlzNEIxbGNCNHNjMXR1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbmZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uZmlsZS8tL2pzb25maWxlLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnphaXRDaTRlNzJneklPMVA2UFdNNk5jS3VnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAianNwcmltIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzcHJpbS8tL2pzcHJpbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1UNW12QjVjd0c1RGk4RzNTWnd1WEZhc3RxST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiMS4wLjAiLAorICAgICAgICAiZXh0c3ByaW50ZiI6ICIxLjMuMCIsCisgICAgICAgICJqc29uLXNjaGVtYSI6ICIwLjIuMyIsCisgICAgICAgICJ2ZXJyb3IiOiAiMS4xMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImtldyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rZXcvLS9rZXctMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lZGs5TFRNMlBXL2RLWEN6TmRrVUd0V1IxNXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImtpbmQtb2YiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXM1a0xPY25IMFhxRE8rRnZ1YUxYOEREaloxOENHRms3VnlnSDQwUW9LUFVRaFc0ZTJydk0wcndVcTB0OElRRE93WVNlTEswMVU5ME9qekJUbWUyUXFBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGF6eS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sYXp5LWNhY2hlLy0vbGF6eS1jYWNoZS0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW9kZVB3NlVFZE11QWhGMDdPMjRkcEpwRWJvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsaWZ0b2ZmIjogeworICAgICAgInZlcnNpb24iOiAiMi41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZnRvZmYvLS9saWZ0b2ZmLTIuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUFrcEc3TWM2b1lidnhDbndWb295dmRjTWV3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZCI6ICJeMy4wLjAiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAiXjIuMC4wIiwKKyAgICAgICAgImZpbmVkIjogIl4xLjAuMSIsCisgICAgICAgICJmbGFnZ2VkLXJlc3Bhd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiLAorICAgICAgICAib2JqZWN0Lm1hcCI6ICJeMS4wLjAiLAorICAgICAgICAicmVjaG9pciI6ICJeMC42LjIiLAorICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjciCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImZpbmR1cC1zeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1reWF4U0l3aTBhWUlobENvYVFHeTJha0tMTHc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZGV0ZWN0LWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1nbG9iIjogIl4zLjEuMCIsCisgICAgICAgICAgICAibWljcm9tYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJsb2FkLWpzb24tZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2xvYWQtanNvbi1maWxlLy0vbG9hZC1qc29uLWZpbGUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sV2tGY0kxWXRMcTB3aVliQlBXZk1jbVRkTUE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgInBhcnNlLWpzb24iOiAiXjIuMi4wIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1ib20iOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibG9uZ2VzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb25nZXN0Ly0vbG9uZ2VzdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1LQ3kyamozTjNEb0tVb05JdVppWHRkOUFKYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb3VkLXJlamVjdGlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb3VkLXJlamVjdGlvbi8tL2xvdWQtcmVqZWN0aW9uLTEuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVzBiNEFVZnQ3bGVJY1BDRzBFZ2h6NW1PVlI4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImN1cnJlbnRseS11bmhhbmRsZWQiOiAiXjAuNC4xIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYWtlLWl0ZXJhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21ha2UtaXRlcmF0b3IvLS9tYWtlLWl0ZXJhdG9yLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1weGl1WGgwaVZFcTdWTTdLTUloczVneHNmeEN1eDJVUnB0VVFhWG80aVpaSnhCQXpUUE9MRTJCdW1PNWRiZlZZcS9oQkpGQlIvYTFtRkRtT3g1QUdtdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWFwLWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC1jYWNoZS8tL21hcC1jYWNoZS0wLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXd5cTlDOVpTWFpzRkZrVzdUeWFzWGNtS0RiOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXAtb2JqIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC1vYmovLS9tYXAtb2JqLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMlRQT3VTQmRncjNQU0liMmRDdmNLMDNxRkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtdmlzaXQvLS9tYXAtdmlzaXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03TnlvOFRGRTVtRHh0YjFCOFM4MGVkbU4rNDg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXJrZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuMy4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZWEyZUdXT3FOeFBjWHY4ZHlFUmRTci82Rm16dld3empNeHBmR0Ivc2JNY2NYb2N0K3hZK1l1a1BEK1FUVVp3eXZLN0Jad2NyNG0yMVdCT1c0MXBBa2c9PSIKKyAgICB9LAorICAgICJtYXhtaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWF4bWluLy0vbWF4bWluLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY1RaZWhLbWQyUGl6OTlYOTR2QU5Ibjl6dm1FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJmaWd1cmVzIjogIl4xLjAuMSIsCisgICAgICAgICJnemlwLXNpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgInByZXR0eS1ieXRlcyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJtZW93IjogeworICAgICAgInZlcnNpb24iOiAiMy43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWVvdy8tL21lb3ctMy43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jc3RtaTBKU0tDa0t1L3FGYUpKWWN3aW9BZnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlLWtleXMiOiAiXjIuMC4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMS4yIiwKKyAgICAgICAgImxvdWQtcmVqZWN0aW9uIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMSIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4xLjMiLAorICAgICAgICAibm9ybWFsaXplLXBhY2thZ2UtZGF0YSI6ICJeMi4zLjQiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicmVhZC1wa2ctdXAiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlZGVudCI6ICJeMS4wLjAiLAorICAgICAgICAidHJpbS1uZXdsaW5lcyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJtaWNyb21hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taWNyb21hdGNoLy0vbWljcm9tYXRjaC0zLjEuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1XaWtnbDluOU0zdyticHNZM0hlOEwrdzllRjkzMzh4Umw4SUFPNXZpRGl6d1N6emlGRXlVem8yeHJybG9CNjRBRGJUZjh1QTh2UnFxdHREVE9tY2NnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJicmFjZXMiOiAiXjIuMy4xIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImV4dGdsb2IiOiAiXjIuMC40IiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJuYW5vbWF0Y2giOiAiXjEuMi45IiwKKyAgICAgICAgIm9iamVjdC5waWNrIjogIl4xLjMuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWUvLS9taW1lLTIuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRVVsbGNWb3lkQkhHTjF6ODR5ZlFEaW1uNThwWk5OTlhnWmxIWFNib3hNbEZ2Z0k2TVhTV3BXS3BGUnJhN0gxSHhwVmhIVGtyZ2hmUlc0OWs2eWplZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS1kYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMzcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS1kYi8tL21pbWUtZGItMS4zNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SM0M0ZGI2YmdRaGxJaFBVNDhmVXRkVm1LbmZscStoUmRhZDdJeUtodEZqMDZWUE5WZGsyUmhpWUwzVWpRSWxzbzhMK1l4QXRGa29iVDBWSytTL3liZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS10eXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS10eXBlcy8tL21pbWUtdHlwZXMtMi4xLjIxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zaUw2RGJ3cHlMempSM3hIU0ZORmViOU56L004V0RrWDMzdDFHRlFuRk9sbFdrOHBPcmgvTFNyQjVPWGxubFc1UDlMSDczWDZsb1cvZW9nYytGNWxKZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltZS1kYiI6ICJ+MS4zNy4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iCisgICAgfSwKKyAgICAibWl4aW4tZGVlcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taXhpbi1kZWVwLy0vbWl4aW4tZGVlcC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOFpJdExIZUVnYXFFdmQ1bFlCWGZtNEVaU0ZDWDI5SmI5SytsQUhoREt6UmVLQlFLajNSKzdOT0Y2dGpxWWk5dDRvSThWVWZhV0lUSlFtODZ3blhHTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjIiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZnaXVyZndBdm13cEFkOWZtR0Y0amVEVmw4Zz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW5vbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMTMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hbm9tYXRjaC8tL25hbm9tYXRjaC0xLjIuMTMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZwb2UyVDBSYkh3QlRCVU9mdEFmQlBhREVpMDZ1ZmFVYWkwbUU2WW4xa2FjYzNTblRFcmZiL2grWDk0Vlh6STY0cktGSFlJbVhTdmR3R0dDbXdPcUNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjIuMC4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMiIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjIiLAorICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5pY2UtdHJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25pY2UtdHJ5Ly0vbmljZS10cnktMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFuaDQ1ZGVlYjVvbE5ZN2VYODJCa1BPN1NTeFI1U1NZSmlQVHJUZEZVVll3QWw4Q0tNQTVOOVBqVFlrSGlSamlzVmN4Y1ExSFhkTGh4MnF4eEp6TE5RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub3B0IjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtME5Sb1d2MVVGUms4akhVRllDME5GODFrUjAwPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIsCisgICAgICAgICJvc2VudiI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAibm9ybWFsaXplLXBhY2thZ2UtZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3JtYWxpemUtcGFja2FnZS1kYXRhLy0vbm9ybWFsaXplLXBhY2thZ2UtZGF0YS0yLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOWpqVUZiVFBmRXkzUi9hZC8yb05iS3RXOUhnb3ZsNU8xRnZGV0trS2JsTlhvTi9Pb3U2KzkrS0tvaFBLMTNZYzMvVHl1bnlXaEpwNmd2Uk5SL1BQQXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvc3RlZC1naXQtaW5mbyI6ICJeMi4xLjQiLAorICAgICAgICAiaXMtYnVpbHRpbi1tb2R1bGUiOiAiXjEuMC4wIiwKKyAgICAgICAgInNlbXZlciI6ICIyIHx8IDMgfHwgNCB8fCA1IiwKKyAgICAgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2F1dGgtc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYXV0aC1zaWduLy0vb2F1dGgtc2lnbi0wLjkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmV4aFVGRlBUR1Y4eWJBdFNJR2JWNmdPa1N2OFV0UmJEQm5BeUxRdzRRUEtrZ05sc0gyQnlQR3RNVXFkV2tvczZZQ1JtQXFWaXdnWnJKYy9tUkR6WlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtYXNzaWduIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1hc3NpZ24vLS9vYmplY3QtYXNzaWduLTQuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVFtdHg1WlloOC9BWEx2VVFzckl2N3MyQ0dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1jb3B5IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1jb3B5Ly0vb2JqZWN0LWNvcHktMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mbjJGaTNnYjE4bVJwQnVwZGUwNEVuVk9tWXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29weS1kZXNjcmlwdG9yIjogIl4wLjEuMCIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QtdmlzaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LXZpc2l0Ly0vb2JqZWN0LXZpc2l0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOTV4RWs2OE1VM2UxbitPZE9WNUJCQzNRUmJzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QuZGVmYXVsdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LmRlZmF1bHRzLy0vb2JqZWN0LmRlZmF1bHRzLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT24rR2d6UzBCOTZnYmFGdGlOWE5LZVExL3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LWVhY2giOiAiXjEuMC4xIiwKKyAgICAgICAgImFycmF5LXNsaWNlIjogIl4xLjAuMCIsCisgICAgICAgICJmb3Itb3duIjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0Lm1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QubWFwLy0vb2JqZWN0Lm1hcC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo0UGxuY2o4d0sxZlFsRGg5NHM3Z2IyQUhUYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmb3Itb3duIjogIl4xLjAuMCIsCisgICAgICAgICJtYWtlLWl0ZXJhdG9yIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QucGljayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QucGljay8tL29iamVjdC5waWNrLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaDZFS3hNRnBTOUxoeS9VMWthWmhRZnRkMTBjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmNlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uY2UvLS9vbmNlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0RzYXAzV1dIVXNST3NGOW5GQzY3NTNYYTlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm9zLWhvbWVkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtaG9tZWRpci8tL29zLWhvbWVkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vN3hKaUROdURvTTk0TUZveCs4VklTR3FmN009IgorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IgorICAgIH0sCisgICAgIm9zZW52IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zZW52Ly0vb3NlbnYtMC4xLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTBDV2NDRUNkTVZjMlJ3M1U1dzlaanFYNmdhNnViazF4RFZLeHRCUVBLN3dpcy8wRjJyOVQ2azR5ZEdZaGVjbDdZVUJ4QlZ4aEw1b2lzUHNOeEFQZTJnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjAiLAorICAgICAgICAib3MtdG1wZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLWVhY2gtc2VyaWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtZWFjaC1zZXJpZXMvLS9wLWVhY2gtc2VyaWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta3c4OUV0MGZVT2REUkZlaUxOYndTc2F0ZjNFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInAtcmVkdWNlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLXJlZHVjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wLXJlZHVjZS8tL3AtcmVkdWNlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR01LdzNaTnFScENsS2ZnakgxaWcvYmFrZmZvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBha28iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFrby8tL3Bha28tMC4yLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04L2RTTDA3M2dqU05xQlliclo3UDFSdjRPblU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyc2UtZmlsZXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtZmlsZXBhdGgvLS9wYXJzZS1maWxlcGF0aC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBqSVNmMU9xODlGWWR2V0hMei82eDJQV3lKRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hYnNvbHV0ZSI6ICJeMS4wLjAiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMCIsCisgICAgICAgICJwYXRoLXJvb3QiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLWpzb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtanNvbi8tL3BhcnNlLWpzb24tMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05SUQwQkRUdmdIUWZoR2tKbjQzcUdQVmFUY2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXJyb3ItZXgiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLXBhc3N3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1wYXNzd2QvLS9wYXJzZS1wYXNzd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iVnVUU2tWcGs3STlOL1FLT0MxdkZtYW81Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFzY2FsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXNjYWxjYXNlLy0vcGFzY2FsY2FzZS0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyUGxYb0FHeW0vaUY0VFMyeUs5RmRlUmZ4UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWV4aXN0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWV4aXN0cy8tL3BhdGgtZXhpc3RzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRCt0c1pQRDhVWTJhZFUzVjc3WXNjQ0oySDBzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwYXRoLWlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRjB1U2FITlZOUCs4ZXM1cjlUcGFuaHRjWDE4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgta2V5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RUnl0dFhURm9VRFRwTEdSRFVEWURNbjBDMEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1yb290IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC8tL3BhdGgtcm9vdC0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1rcG9GTXJCd00xek5ncVY4eUNEeU9wSFJiYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLXJvb3QtcmVnZXgiOiAiXjAuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtcm9vdC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLXJvb3QtcmVnZXgvLS9wYXRoLXJvb3QtcmVnZXgtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12OHpjamZXeExjVXNpMFBzT05HTmNzQkxxVzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC10eXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtdHlwZS8tL3BhdGgtdHlwZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjUlBmdVNSMm5CTnBCWGFXa0J3dWsrUDVFRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVuZC8tL3BlbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lbGZyVlFwbmcva1JVekg4OUdZOVhJNEFlbEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGVyZm9ybWFuY2Utbm93IjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BlcmZvcm1hbmNlLW5vdy8tL3BlcmZvcm1hbmNlLW5vdy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl3bjA0T1g2a1Q3QnhwTUhyalpMU3pkOG5ucz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicGhhbnRvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbS8tL3BoYW50b20tNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UejgyWGh0UG13Q2sxRkZQbWVjeTd5UkdaRzJidHB6WTJLSTlmY29QVDd6VDlkZXQwQ2NNeWZCRlBwMVM4RHF6c25Rbm04WllFZmR5NTI4bXdWdGtzQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJeMi4xLjE2IiwKKyAgICAgICAgInNwbGl0IjogIl4xLjAuMSIsCisgICAgICAgICJ3aW5zdG9uIjogIl4yLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaGFudG9tanMtcHJlYnVpbHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMTYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BoYW50b21qcy1wcmVidWlsdC8tL3BoYW50b21qcy1wcmVidWlsdC0yLjEuMTYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03OUlTcEtPV2JUWkhhRTZvdW5pRlNiNHE3Kzg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjUiLAorICAgICAgICAiZnMtZXh0cmEiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhc2hhIjogIl4yLjIuMCIsCisgICAgICAgICJrZXciOiAiXjAuNy4wIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4xLjEuOCIsCisgICAgICAgICJyZXF1ZXN0IjogIl4yLjgxLjAiLAorICAgICAgICAicmVxdWVzdC1wcm9ncmVzcyI6ICJeMi4wLjEiLAorICAgICAgICAid2hpY2giOiAiXjEuMi4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc2l4LWNoYXJhY3Rlci1jbGFzc2VzLy0vcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BZXJBL2p0YTl4b3FiQUwrcTdqQi92ZmdEcXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHR5LWJ5dGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0eS1ieXRlcy8tL3ByZXR0eS1ieXRlcy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNpTG9JUVlKclRWVUw0eU5YU0Zaci9CMUhJUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMS4xLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00bURIajJGaHpkbXc1V3pENEtoZDRYeDZWNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInByb3h5LWZyb20tZW52IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb3h5LWZyb20tZW52Ly0vcHJveHktZnJvbS1lbnYtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NOFVEbVBjT3ArdVcwaDk3Z1hZd3BWZVJ4KzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHNsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjI5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wc2wvLS9wc2wtMS4xLjI5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BZVVtUTBvTE4wMmZsVkhYV2g5c1NKRjdtY2RGcTBwcGlkL0prRXJ1ZmMzaEdJVi9BTWE4Rm85VmdEby9jVDJqRmRPV29GdkhwOTBxcUJINTRXK2dqUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13TldtT3ljWWdBclk0ZXNQcFNhY2hOMUJoRjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1cHBldGVlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdXBwZXRlZXIvLS9wdXBwZXRlZXItMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWYrMUR4S0hQcWNlNkNYVUJ6MmVWTzJXY0FUZVZlUVNPUEc5R1lhR09iRVpEQ2lDRVV3Rytnb2dqTXNydm43aGUyd0hUcU5WYjVwNlJVcndtcjhYRkJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiLAorICAgICAgICAiZXh0cmFjdC16aXAiOiAiXjEuNi42IiwKKyAgICAgICAgImh0dHBzLXByb3h5LWFnZW50IjogIl4yLjIuMSIsCisgICAgICAgICJtaW1lIjogIl4yLjAuMyIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMi4wLjAiLAorICAgICAgICAicHJveHktZnJvbS1lbnYiOiAiXjEuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJeMi42LjEiLAorICAgICAgICAid3MiOiAiXjUuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMy4yLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tZWwramY3bnJ0RWw1UG4xUXg0NnpBUlhLRHBCYnZ6ZXpzZTdwN0xxSU5tZG9JazhQWVA1U3lTYXhFbVl2NlRaMEp5RUtBMWhzQ0lkNkRJaGdJVHRXUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicXMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXMvLS9xcy02LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTjVaQVg0L0x4Sm1GKzd3Tjc0cFVENnFBaDkvd252ZFFjanE5VFpqZXZ2WHpTVW83YmZtdzkxc2FxTWp6R1MyeHE5MS9vZE4yZFcvV09sN3FRSE5ER0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJyZWFkLXBrZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkLXBrZy8tL3JlYWQtcGtnLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWYrcVhzMHB5ekhBUjB2S2ZYVnJhN0tlUHlnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImxvYWQtanNvbi1maWxlIjogIl4xLjAuMCIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuMiIsCisgICAgICAgICJwYXRoLXR5cGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWQtcGtnLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLXVwLy0vcmVhZC1wa2ctdXAtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uV1BCTW5iQVpaR05WL0FDcFg5QW9iWkQrd0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmluZC11cCI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZC1wa2ciOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMS4xLjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZlBURlR2Wkk0NEV3aE1ZMjNTQjU0V2JBZ2RrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgImlzYXJyYXkiOiAiMC4wLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjAuMTAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXNhcnJheSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTAuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWloaXMvS21vOUJkK0NhdjhZRGlUbXdYUjd0OD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZWNob2lyIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlY2hvaXIvLS9yZWNob2lyLTAuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFNCTFZOdW9MVmRDNG95V2RXNzBPdlVPTTRRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlc29sdmUiOiAiXjEuMS42IgorICAgICAgfQorICAgIH0sCisgICAgInJlZGVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWRlbnQvLS9yZWRlbnQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16NUZxc2YxZkh4YmZzZ2dpM1c3SDl6RENyOTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5kZW50LXN0cmluZyI6ICJeMi4xLjAiLAorICAgICAgICAic3RyaXAtaW5kZW50IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWdleC1ub3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVnZXgtbm90Ly0vcmVnZXgtbm90LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KNlNEalVnRHhRajVOdXNuT3RkRnhEd04vK0hXeWtSOEdFTHdjdEo3bWRxaGN5eTF4RWM0U1JGSFVYdnhUcDY2MVlhVktBamZSTFo5Y0NxUzZ0bjMyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInNhZmUtcmVnZXgiOiAiXjEuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcGVhdC1lbGVtZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdC1lbGVtZW50Ly0vcmVwZWF0LWVsZW1lbnQtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFoR3EwWm5WNW01WHRaTE1iK3ZQNzZrY0FNNW5rTHFrMGxwcUF1b2pTS0dnUXRuNGVSaTRaWkdtMm9sbzJ6S0ZIK3NNc1dhcU9DVzFkcUFuT3J1NzJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXBlYXQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdC1zdHJpbmcvLS9yZXBlYXQtc3RyaW5nLTEuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamNya2NPSElpcnd0WUEvL1NuZGlodHAxNWpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdGluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXBlYXRpbmcvLS9yZXBlYXRpbmctMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VaFRGT3BKdE5WSndkU2Y3cTBGZHZBalFiZG89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZmluaXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMi44OC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1ZXN0Ly0vcmVxdWVzdC0yLjg4LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5BcUJTcmlqR0xaZE0wV1pOc0luTEpwa0pva0w3MlhZalVwbkIwaXdzUmd4aDdkQjZDT3JIblRCTndOMEUrbEhEQUp6dTdrTEFrRGVZMDh6Mi9BMGhnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXdzLXNpZ24yIjogIn4wLjcuMCIsCisgICAgICAgICJhd3M0IjogIl4xLjguMCIsCisgICAgICAgICJjYXNlbGVzcyI6ICJ+MC4xMi4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJ+MS4wLjYiLAorICAgICAgICAiZXh0ZW5kIjogIn4zLjAuMiIsCisgICAgICAgICJmb3JldmVyLWFnZW50IjogIn4wLjYuMSIsCisgICAgICAgICJmb3JtLWRhdGEiOiAifjIuMy4yIiwKKyAgICAgICAgImhhci12YWxpZGF0b3IiOiAifjUuMS4wIiwKKyAgICAgICAgImh0dHAtc2lnbmF0dXJlIjogIn4xLjIuMCIsCisgICAgICAgICJpcy10eXBlZGFycmF5IjogIn4xLjAuMCIsCisgICAgICAgICJpc3N0cmVhbSI6ICJ+MC4xLjIiLAorICAgICAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6ICJ+NS4wLjEiLAorICAgICAgICAibWltZS10eXBlcyI6ICJ+Mi4xLjE5IiwKKyAgICAgICAgIm9hdXRoLXNpZ24iOiAifjAuOS4wIiwKKyAgICAgICAgInBlcmZvcm1hbmNlLW5vdyI6ICJeMi4xLjAiLAorICAgICAgICAicXMiOiAifjYuNS4yIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMiIsCisgICAgICAgICJ0b3VnaC1jb29raWUiOiAifjIuNC4zIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAidXVpZCI6ICJeMy4zLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWVzdC1wcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1ZXN0LXByb2dyZXNzLy0vcmVxdWVzdC1wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhUYTdWNVljWnpxbHQ0amJ5QlFmM3lPMFRnZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3R0bGVpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWl6emxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpenpsZS8tL3JlcXVpenpsZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFVUERVd3hObW41RzhjM2RVY0ZZL0djTTI5ND0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlERVUyQ3JTeGUyZWpnUVJzNU1vZGVpSjZYcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXNvbHZlLWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLWRpci8tL3Jlc29sdmUtZGlyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZWFRR1JNTml2b0x5YnYvbk9jbTdVNElFYjBNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4cGFuZC10aWxkZSI6ICJeMi4wLjAiLAorICAgICAgICAiZ2xvYmFsLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUtdXJsIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtdXJsLy0vcmVzb2x2ZS11cmwtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MR04vNTN5Sk92MHFaai9pR3FrSUFHamlCU289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmV0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjE1IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXQvLS9yZXQtMC4xLjE1LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UVGxZcGErT0wrdk1NTkcyNHhTbFFHRUozQi9SekVmVWxMY3Q3YjVHL3l0YXYrd1BycGxDcFZNRnV3elhia2VjSnJiNklZbzFpRmIwUzl2Mzc3NTRtZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmlnaHQtYWxpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmlnaHQtYWxpZ24vLS9yaWdodC1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlUT2JjaS9tbzFGV2lTRU5KT0ZNbGhTR0UrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaW1yYWYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmltcmFmLy0vcmltcmFmLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1scmVld0xLL0JsZ2hteHRmSDM2WVlWZzFpOElBY2U0VEk3b2FvNzVJMWcyNDUrNkJjdHFUVlFpQlAzWVVKOUM2RFFPWEpta1lSOVg5ZkNMdENPSmM1dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYiI6ICJeNy4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmUtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1yZWdleC8tL3NhZmUtcmVnZXgtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RS05tbnpzSGZSNlVQVVJpbmhWOTFJQWp2eTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmV0IjogIn4wLjEuMTAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1odzB5eGs5R1QvSHI1eUpFWW5ITktZWGtJQThtVkpnZDlkaXRZWkNlMTZaY3pjYUVMWVljZnZhWGVzTkFDazJPOE8wblRpUFFjUWhHVVFqOEpMemVlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2hlbGxqcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGVsbGpzLy0vc2hlbGxqcy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5aYm1NSHA0RlVUMWtmTjlwaGcyRHpIYlY3RT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNuYXBkcmFnb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi8tL3NuYXBkcmFnb24tMC44LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZ0eU9uV04vd0NIVFZYT013dlN2MjZkK2tvNXZXbElERDZ6b1VKN0xXOHZoK1pCQzhRZGxqdmVSUCtjck5ydEJ3aW9FVVd5LzRkTXRiQmpBNGlvTmxnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYXNlIjogIl4wLjExLjEiLAorICAgICAgICAiZGVidWciOiAiXjIuMi4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgIm1hcC1jYWNoZSI6ICJeMC4yLjIiLAorICAgICAgICAic291cmNlLW1hcCI6ICJeMC41LjYiLAorICAgICAgICAic291cmNlLW1hcC1yZXNvbHZlIjogIl4wLjUuMCIsCisgICAgICAgICJ1c2UiOiAiXjMuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi1ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tbm9kZS8tL3NuYXBkcmFnb24tbm9kZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTzI3bDR4YU1ZdC9SU1E1VFIzdnBXQ0FCNUtiL2N6SWNxVUZPTS9DNGZZY0xuYlpVYzFQa2pUQU1qb2YycEJXYVNUd09VZDZxVUhjRkdWR2o3YUl3bnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24tdXRpbCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNuYXBkcmFnb24tdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLXV0aWwvLS9zbmFwZHJhZ29uLXV0aWwtMy4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1iS2tNZFFLc2pYNEJBTDRiUllUajIxZWRPZjhjTjdYSGRZVUpFZStabjk5aFZFWWNNdktQY3QxSXFOZTcrQVpQaXJuOEJDRE9RQkhRWmtucW1LbFpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC41LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pZ09kTFJBaDBpMGVvVXlBMk9wR2k2THZQOHc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic291cmNlLW1hcC1yZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAtcmVzb2x2ZS8tL3NvdXJjZS1tYXAtcmVzb2x2ZS0wLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTWpxc3ZOd3l6MXMwazgxR296Lzl2UkJlOVNaZEIwOUJkdysvell5TyszQ3VQazZmb3VUYXhzY0hrZ3RFOGpLdmYwMWtWZmw4cmlIekVSUS9rZWZhU0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImF0b2IiOiAiXjIuMS4xIiwKKyAgICAgICAgImRlY29kZS11cmktY29tcG9uZW50IjogIl4wLjIuMCIsCisgICAgICAgICJyZXNvbHZlLXVybCI6ICJeMC4yLjEiLAorICAgICAgICAic291cmNlLW1hcC11cmwiOiAiXjAuNC4wIiwKKyAgICAgICAgInVyaXgiOiAiXjAuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAtdXJsIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAtdXJsLy0vc291cmNlLW1hcC11cmwtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QcE5kZmQxell4dVhaWmxXMVZFbzZIdFFoS009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1jb3JyZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtY29ycmVjdC8tL3NwZHgtY29ycmVjdC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcTloZWR0enlYSHI1UzBBMXZFUG9LLzdsOE5wZmtGWVRxNmlDWStQbm8yWmJkWlI2V2V4WkZ0cWVWR2tHeFczVEVKTU45MTRaNTVFbkFHTW1lbmxJUVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1leGNlcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhjZXB0aW9ucy8tL3NwZHgtZXhjZXB0aW9ucy0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMlhRQUNmRWxLaTlTbFZiMUNZYWRLRFh2b2FqUGdCVlBuL2dPUUxyVHZIZEVsYVZocjdaRWJxSmFSbkpMVk5lYUk0Y01FQWdWQ2VCTUtGNk1XUkRDUkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWV4cHJlc3Npb24tcGFyc2UvLS9zcGR4LWV4cHJlc3Npb24tcGFyc2UtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlnNkQzWHBSRDRra09tVHBkZ2JVaUVKRktnaEpIMDNmaUMxT1BsbDVoLzBzTzZuZWgyanFSRFZIT1E0by9MTWVhMHRnQ2tiTWdlYTVpcC9lK01rV3lnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWV4Y2VwdGlvbnMiOiAiXjIuMS4wIiwKKyAgICAgICAgInNwZHgtbGljZW5zZS1pZHMiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwZHgtbGljZW5zZS1pZHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1saWNlbnNlLWlkcy8tL3NwZHgtbGljZW5zZS1pZHMtMy4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRmT2ZQY1lHQkI1c0R1UG4zZGVCeXhQaG1mZWdBaHBEWUtTT1haUU44MU95cnJpZjhaQ29kT0x6SzNBZXNFTG5DeDAza2lraHlEd2gwcGZ2dlF2Rjh3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGxpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC8tL3NwbGl0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tVHlPb1Bicml2dFhud25JeFpSRllSclBOdEVGS2xwQjJmdmpTbkNRVWlBQTZxQVp6cXduYTVlbnZLNHVrNk9JZVAxN0NzZEYzclNCR1lWQnNVMFRrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAiMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGxpdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BsaXQtc3RyaW5nLy0vc3BsaXQtc3RyaW5nLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Oek5WaEpEWXB3Y2VWVmlpOC9IdTZES2ZEMkcrTnJRSGxTL1YvcWd2NzYzRVl1ZFZ3RWNNUU54ZDJsaCswVnJVQnlYTi9vSmtsNWdyT2hZV3ZRVVlpdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwcmludGYtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OcjU0TWdyK1dBSDJ6cVB1ZUxibHFybEE2Z3c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3NocGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE1LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NzaHBrLy0vc3NocGstMS4xNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tU2RnTlVhaWRrK2RSVTVNaFl0Tjl6ZWJkekYyaUcwY05QV3k4SEcrVzh5K2ZUMUpuU2toMGZ6enBqT2EwTDdQOGkxUnNjejM4dDBoNGdQY0t6NDN4QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzbjEiOiAifjAuMi4zIiwKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIsCisgICAgICAgICJiY3J5cHQtcGJrZGYiOiAiXjEuMC4wIiwKKyAgICAgICAgImRhc2hkYXNoIjogIl4xLjEyLjAiLAorICAgICAgICAiZWNjLWpzYm4iOiAifjAuMS4xIiwKKyAgICAgICAgImdldHBhc3MiOiAiXjAuMS4xIiwKKyAgICAgICAgImpzYm4iOiAifjAuMS4wIiwKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICJeMi4wLjIiLAorICAgICAgICAidHdlZXRuYWNsIjogIn4wLjE0LjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RhY2stdHJhY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YWNrLXRyYWNlLy0vc3RhY2stdHJhY2UtMC4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVkh4d3MwZm8weXRPRUk2aG9xRlo1ZjNlR2NBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJzdGF0aWMtZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXRpYy1leHRlbmQvLS9zdGF0aWMtZXh0ZW5kLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWUlDY09jdi9WVE55SnYxZUMxSVBOQjhmdGNZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAib2JqZWN0LWNvcHkiOiAiXjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMC4zMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0wLjEwLjMxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXVJRHZFRjJiR3dveWZ5RU1CMnJIRk1RK3BRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFqaGZ1SVU5bFMxZjhGME9pcStVSjQzR1BjOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1ib20iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYm9tLy0vc3RyaXAtYm9tLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWWhtb1ZoWlNCSkh6VjRpOXZ4UkhxWngrYXc0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXV0ZjgiOiAiXjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWluZGVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1pbmRlbnQvLS9zdHJpcC1pbmRlbnQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ESGxpcHEzdnA3dlVyRFprWUtZNFZTcmhvS0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUEZNWlF1a0l3bWw4RHNORWhZd29iSHlncGdvPSIKKyAgICB9LAorICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTUuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RalZqd2RYSXQ0MDhNSWlBcUNYNG9VS3NnVTJFcUFHenMyUHBrbTRhUVliam0rWkVXRWNXNFNmRk5UcjR1TU5abWEwZXk0ZjVsZ0xya0IwYVgwUU1vdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLWZsYWciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN5bmMtZXhlYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zeW5jLWV4ZWMvLS9zeW5jLWV4ZWMtMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jWDBpekZQd3poM3ZWWlEyTHpxSm91dTVFUVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFmZnlkYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWZmeWRiLy0vdGFmZnlkYi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZMeTJTMW9VRzJvdS9DeGRMR2UwNFZDeW9tZz0iCisgICAgfSwKKyAgICAidGhyb3R0bGVpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdHRsZWl0Ly0vdGhyb3R0bGVpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5uaFlOdHIwWjBNVVdsbUV0aWFOZ29Vb3JHdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gvLS90aHJvdWdoLTIuMy44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGRUSi82cThOWGxnc2Jja0VWMStEb2FpNGZVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0by1vYmplY3QtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1vYmplY3QtcGF0aC8tL3RvLW9iamVjdC1wYXRoLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtS1hXSXQ3RG40S3dJNEU1bkw0WEI5Sm1lRjY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgvLS90by1yZWdleC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRld0bGVOQXRaL0tpMnF0cWVqMkNYVE9heU9IOWJIRFFGK1E0OFZwV3lEWGpiWXhBNFl6OGlEQjMxelhPQlVsT0hIS2lkRGJxR1ZyVFV2UU1QbUJHQnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgtcmFuZ2UvLS90by1yZWdleC1yYW5nZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZJREJlNTMrdmxtZUp6WitEVTNWV1FGQjJ6Zz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIgorICAgICAgfQorICAgIH0sCisgICAgInRvdWdoLWNvb2tpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90b3VnaC1jb29raWUvLS90b3VnaC1jb29raWUtMi40LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVE1c3JrLzR2RE01NFdKc0ppbzNYTm42SzJzQ0crQ1E4RzVXejZiWmhSWm9BZS8rVHhqV0IvR2xGQW5ZRWJrWVZsT045Rk1rL2ZFM2gyUkxwUFhvNGxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHNsIjogIl4xLjEuMjQiLAorICAgICAgICAicHVueWNvZGUiOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgInRyaW0tbmV3bGluZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHJpbS1uZXdsaW5lcy8tL3RyaW0tbmV3bGluZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSWVXYTdXQ3BGQTZRZXRTVDMwMUFSZ1ZwaE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR3ZWV0bmFjbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHdlZXRuYWNsLy0vdHdlZXRuYWNsLTAuMTQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVd1YUJkL0dTMUVWaWFkRUlyNmsvK0hRL1QyUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVkYXJyYXkvLS90eXBlZGFycmF5LTAuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaG5ySFRqaGtHSHNkUFVmWmxxZU94Y2lEQjNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS1qcy8tL3VnbGlmeS1qcy0yLjYuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVplb3Zzd1djazVScEx4WCsySHdyTnNGcm10OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MC4yLjYiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC41LjEiLAorICAgICAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiAifjEuMC4wIiwKKyAgICAgICAgInlhcmdzIjogIn4zLjEwLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi4xMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0wLjIuMTAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdHJ2Z3NHZExuWEdYQ01vNDNvd2pmTFVtdzlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVnbGlmeS10by1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS10by1icm93c2VyaWZ5Ly0vdWdsaWZ5LXRvLWJyb3dzZXJpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iZ2trMXIybXRhL2pTZU9hYldNb1VLRDRncmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5jLXBhdGgtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5jLXBhdGgtcmVnZXgvLS91bmMtcGF0aC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTV6M1QxN0RYeGUyRys2eHJDdWZZeHFhZFVQbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVHorMU94QnVZSmY4K2N0QkNmS2w2YjM2VUNJPSIKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUuc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUuc3RyaW5nLy0vdW5kZXJzY29yZS5zdHJpbmctMy4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWcrZHBtZ24rWEJuZUxtWFhvK3NHbFc1eFFFdDRFcmtTM21nZU4yR0ZicmVtWWVNQlNKS3I5V2YyS0pwbFFWYWlQWS9mN0ZONmF0b3NXWU5tOW92cllnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIl4xLjAuMyIsCisgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidW5pY29kZS01LjIuMCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmljb2RlLTUuMi4wLy0vdW5pY29kZS01LjIuMC0wLjcuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1ZHTFcxQnJpMzB4MDB5djRITk04a0J4b3FGWHIwU2JvNTU3MzVudnJsc3g0UFlCWm9sM1V0b1dnTzQ5MmZTd21zZXR6UEVaenk3M3JiVThPR1hKY0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuaW9uLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaW9uLXZhbHVlLy0vdW5pb24tdmFsdWUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YSEhEVExXNjFkenI0K29NMElJSHVscWhycVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLXVuaW9uIjogIl4zLjEuMCIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMC40LjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic2V0LXZhbHVlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTAuNC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWZiQ1BuVDBpM0g5NDVUcnp3NzlHWnV6ZnpQRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4xIiwKKyAgICAgICAgICAgICJ0by1vYmplY3QtcGF0aCI6ICJeMC4zLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5zZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5zZXQtdmFsdWUvLS91bnNldC12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWczYUhQMzBqTlJlZit4NXZ3Nmp0RGZ5S3RWaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiAiXjAuMy4xIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaGFzLXZhbHVlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlLy0vaGFzLXZhbHVlLTAuMy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWV4OVl1dHBpeW9KK3dLSUhnQ1ZsU0VXWlhoOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC4zIiwKKyAgICAgICAgICAgICJoYXMtdmFsdWVzIjogIl4wLjEuNCIsCisgICAgICAgICAgICAiaXNvYmplY3QiOiAiXjIuMC4wIgorICAgICAgICAgIH0sCisgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgICAgICJpc29iamVjdCI6IHsKKyAgICAgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0yLjEuMC50Z3oiLAorICAgICAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOEdWV0VKYWo4ZG91OUdKeStCWElRTmgrRElrPSIsCisgICAgICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAgICAgImlzYXJyYXkiOiAiMS4wLjAiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJoYXMtdmFsdWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlcy8tL2hhcy12YWx1ZXMtMC4xLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYldIZWxka2QvS201b0NDSnJUaEwvNDlpdDNFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVyaS1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1wYXRoLy0vdXJpLXBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sMGZ3R0RXSk04TWQ0UHpQMkMwVGptY21Makk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXJpeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91cml4Ly0vdXJpeC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJwTi9lbUxpSCt3ZjBZMUpzMXdwTlFaNmJIST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1c2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXNlLy0vdXNlLTMuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jd0VTVlhsTzN1cmw5WVdsRlcvVEE5Y3NoQ0VodHU3SUtKL3A1c29KL2dHcGo3dmJ2RnJBWS9lSWlvUTZEdzIzS2paaFlnaUlvOEhPczFuUTJ2ci9vUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dWlkIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V1aWQvLS91dWlkLTMuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15WEptZU5hdzNEbm5LQU9LSkU1MXNML1phWWZXSlJsMXBLOWRyMTlZRkN1ME9iUzIzMUFCMS9MYnFUS1JBUTVrdzhBOTByQTZmcjRyaU9VcFRadlFaQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInY4ZmxhZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdjhmbGFncy8tL3Y4ZmxhZ3MtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZzZ1NLb0Z3MVVwVVBkM2NGZEY3UUduckg2dERlQmdXMUYzdjlneThnTFkwbWxiaUJYcThzb3k4YVFwWTZ4ZWVDakg1SytKdkM2MkFjcDdndGw3d1dBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UvLS92YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcEttMlVpL3hONy9IUUtDdHBaeG9SV0JoWjlaMGtxdHlnRzhYQ2dOUThabERueHVRbVdoajU2Nmo4Zk40Q3UzL0ptYmhzRG83ZmNBSnE0czloMjdFdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1jb3JyZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInZlcnJvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVycm9yLy0vdmVycm9yLTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9oQmNvWEJUcjFYVzRuREIrQ2lHZ3VHTnBBQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICIxLjAuMiIsCisgICAgICAgICJleHRzcHJpbnRmIjogIl4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3aGljaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IeEpkWVdxMU1USVFiSjNudzBjcXNzSG9UTlUyNjdLbHJEdUdaMVdZbHhEU3RVdEtVaE9hSm1oMTEyL1RabUh4eFVmdUpxUFhTT203dER5YXMwT1NJUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIndpbmRvdy1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbmRvdy1zaXplLy0vd2luZG93LXNpemUtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WRGpOTHFrN0lDNzZPaG4raUlldTU4bFBuSjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2luc3RvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aW5zdG9uLy0vd2luc3Rvbi0yLjQuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkJvMlBlcG40aEs0VjAxVWZjV2NEbG1pVlRzN1ZUQjFoN2JnbkIwcmdQMTQ2YlloTXhYMHlwQ3ozbEJPZk54Q080WnVlazd5ZVQreS96TTFPZk13NFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS4wLjAiLAorICAgICAgICAiY29sb3JzIjogIjEuMC54IiwKKyAgICAgICAgImN5Y2xlIjogIjEuMC54IiwKKyAgICAgICAgImV5ZXMiOiAiMC4xLngiLAorICAgICAgICAiaXNzdHJlYW0iOiAiMC4xLngiLAorICAgICAgICAic3RhY2stdHJhY2UiOiAiMC4wLngiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLStQd0V5am9UZUVyZW5oWkJyNWhYalB2V1I2az0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNvbG9ycyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9ycy8tL2NvbG9ycy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CRFAwVFlDV2dQM3JZTzBtRHhzTUppNkNwQXM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdDVacHUwTHN0QW40UFZnOHJWTEtGK3FoWkQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyYXBweSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cmFwcHkvLS93cmFwcHktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jLWxpbWl0ZXIiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInhtbGNyZWF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWxjcmVhdGUvLS94bWxjcmVhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rbXYzWXFZS1FUK3ozWTlMQThXeWFTT05NSTg9IgorICAgIH0sCisgICAgInlhcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3lhcmdzLy0veWFyZ3MtMy4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOSs1NzJGZmRmQjB0T01EblR2dldnZEZESDlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMS4wLjIiLAorICAgICAgICAiY2xpdWkiOiAiXjIuMS4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgIndpbmRvdy1zaXplIjogIjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMS4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbTdVd1RTNExWbW1MTEhXTENLUHFxZHFsaWprPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInlhdXpsIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3lhdXpsLy0veWF1emwtMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sU2owUXRxeHNpaE9XTFEzbTdHVTRpNE1RQVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmQtc2xpY2VyIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9wYWNrYWdlLmpzb24gYi9saWIvanMvcGFja2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWNkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsMTkgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAiZGV2RGVwZW5kZW5jaWVzIjogeworICAgICJncnVudCI6ICJeMS4wLjIiLAorICAgICJncnVudC1jbGkiOiAiXjEuMi4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAiXjEuMC4xIiwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAiXjEuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJeMy4wLjEiLAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJeMS4wLjEiLAorICAgICJncnVudC1qc2RvYyI6ICJeMi4yLjEiLAorICAgICJncnVudC1zaGVsbC1zcGF3biI6ICJeMC4zLjEwIiwKKyAgICAianNsaW50IjogIl4wLjEyLjAiCisgIH0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvanMvc3JjL3RocmlmdC5qcyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjgxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvc3JjL3RocmlmdC5qcwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLypqc2hpbnQgZXZpbDp0cnVlKi8KKworLyoqCisgKiBUaGUgVGhyaWZ0IG5hbWVzcGFjZSBob3VzZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5CisgKiBlbGVtZW50cyBwcm92aWRpbmcgSmF2YVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDCisgKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZQorICogVHJhbnNwb3J0IChUWEhSVHJhbnNwb3J0L1RXZWJTb2NrZXRUcmFuc3BvcnQpIGFuZCBQcm90b2NvbAorICogKFRKU09OUFJvdG9jb2wvVEJpbmFyeVByb3RvY29sKSBjb25zdHJ1Y3RvcnMuCisgKgorICogT2JqZWN0IG1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYSBfXyAoZS5nLiBfX29uT3BlbigpKSBhcmUgaW50ZXJuYWwKKyAqIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBvYmplY3QncyBvd24gbWV0aG9kcy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgY3JlYXRlcyBvbmUgZ2xvYmFsIG9iamVjdDogVGhyaWZ0CisgKiBDb2RlIGluIHRoaXMgbGlicmFyeSBtdXN0IG5ldmVyIGNyZWF0ZSBhZGRpdGlvbmFsIGdsb2JhbCBpZGVudGlmaWVycywKKyAqIGFsbCBmZWF0dXJlcyBtdXN0IGJlIHNjb3BlZCB3aXRoaW4gdGhlIFRocmlmdCBuYW1lc3BhY2UuCisgKiBAbmFtZXNwYWNlCisgKiBAZXhhbXBsZQorICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDo4NTg1Jyk7CisgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U3ZjQ2xpZW50KHByb3RvY29sKTsKKyAqICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lk15TWV0aG9kKCk7CisgKi8KK3ZhciBUaHJpZnQgPSB7CisgICAgLyoqCisgICAgICogVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSB2ZXJzaW9uLgorICAgICAqIEByZWFkb25seQorICAgICAqIEBjb25zdCB7c3RyaW5nfSBWZXJzaW9uCisgICAgICogQG1lbWJlcm9mIFRocmlmdAorICAgICAqLworICAgIFZlcnNpb246ICcxLjAuMCcsCisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVE9QICAgLSBFbmQgb2YgYSBzZXQgb2YgZmllbGRzLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVk9JRCAgIC0gTm8gdmFsdWUgKG9ubHkgbGVnYWwgZm9yIHJldHVybiB0eXBlcykuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCT09MICAgLSBUcnVlL0ZhbHNlIGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCWVRFICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRE9VQkxFIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTE2ICAgIC0gU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTMyICAgIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTY0ICAgIC0gU2lnbmVkIDY0IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU1RSSU5HIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEY3ICAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGNyBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJVQ1QgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIE1BUCAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTRVQgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBMSVNUICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjggICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY4IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjE2ICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEYxNiBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgVHlwZTogeworICAgICAgICBTVE9QOiAwLAorICAgICAgICBWT0lEOiAxLAorICAgICAgICBCT09MOiAyLAorICAgICAgICBCWVRFOiAzLAorICAgICAgICBJMDg6IDMsCisgICAgICAgIERPVUJMRTogNCwKKyAgICAgICAgSTE2OiA2LAorICAgICAgICBJMzI6IDgsCisgICAgICAgIEk2NDogMTAsCisgICAgICAgIFNUUklORzogMTEsCisgICAgICAgIFVURjc6IDExLAorICAgICAgICBTVFJVQ1Q6IDEyLAorICAgICAgICBNQVA6IDEzLAorICAgICAgICBTRVQ6IDE0LAorICAgICAgICBMSVNUOiAxNSwKKyAgICAgICAgVVRGODogMTYsCisgICAgICAgIFVURjE2OiAxNworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgUlBDIG1lc3NhZ2UgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIENBTEwgICAgICAtIFJQQyBjYWxsIHNlbnQgZnJvbSBjbGllbnQgdG8gc2VydmVyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgUkVQTFkgICAgIC0gUlBDIGNhbGwgbm9ybWFsIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEVYQ0VQVElPTiAtIFJQQyBjYWxsIGV4Y2VwdGlvbiByZXNwb25zZSBmcm9tIHNlcnZlciB0byBjbGllbnQuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCisgICAgICovCisgICAgTWVzc2FnZVR5cGU6IHsKKyAgICAgICAgQ0FMTDogMSwKKyAgICAgICAgUkVQTFk6IDIsCisgICAgICAgIEVYQ0VQVElPTjogMywKKyAgICAgICAgT05FV0FZOiA0CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3VudCBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gT2JqZWN0IHRvIHRlc3QuCisgICAgICogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzCisgICAgICovCisgICAgb2JqZWN0TGVuZ3RoOiBmdW5jdGlvbihvYmopIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IDA7CisgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBlc3RhYmxpc2ggcHJvdG90eXBlIGluaGVyaXRhbmNlLgorICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vcHJvdG90eXBhbC5odG1sfFByb3RvdHlwYWwgSW5oZXJpdGFuY2V9CisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3IgLSBDb250c3RydWN0b3IgZnVuY3Rpb24gdG8gc2V0IGFzIGRlcml2ZWQuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgYmFzZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVHlwZSBuYW1lIHRvIHNldCBhcyBuYW1lIHByb3BlcnR5IGluIGRlcml2ZWQgcHJvdG90eXBlLgorICAgICAqLworICAgIGluaGVyaXRzOiBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgbmFtZSkgeworICAgICAgZnVuY3Rpb24gRigpIHt9CisgICAgICBGLnByb3RvdHlwZSA9IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlOworICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IEYoKTsKKyAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAnJzsKKyAgICB9Cit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRFeGNlcHRpb24gaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBhdWdtZW50cyBFcnJvcgorICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgVEV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAqIEBjbGFzc2Rlc2MgVEV4Y2VwdGlvbiBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zIHR5cGVzLgorICovCitUaHJpZnQuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVEV4Y2VwdGlvbiwgRXJyb3IsICdURXhjZXB0aW9uJyk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbWVzc2FnZSBzZXQgb24gdGhlIGV4Y2VwdGlvbi4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gZXhjZXB0aW9uIG1lc3NhZ2UKKyAqLworVGhyaWZ0LlRFeGNlcHRpb24ucHJvdG90eXBlLmdldE1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlOworfTsKKworLyoqCisgKiBUaHJpZnQgQXBwbGljYXRpb24gRXhjZXB0aW9uIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTiAgICAgICAgICAgICAgICAgLSBVbmtub3duL3VuZGVmaW5lZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgLSBDbGllbnQgYXR0ZW1wdGVkIHRvIGNhbGwgYSBtZXRob2QgdW5rbm93biB0byB0aGUgc2VydmVyLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX01FU1NBR0VfVFlQRSAgICAtIENsaWVudCBwYXNzZWQgYW4gdW5rbm93bi91bnN1cHBvcnRlZCBNZXNzYWdlVHlwZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgLSBVbnVzZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgIC0gVW51c2VkIGluIFRocmlmdCBSUEMsIHVzZWQgdG8gZmxhZyBwcm9wcmlldGFyeSBzZXF1ZW5jZSBudW1iZXIgZXJyb3JzLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBNSVNTSU5HX1JFU1VMVCAgICAgICAgICAtIFJhaXNlZCBieSBhIHNlcnZlciBwcm9jZXNzb3IgaWYgYSBoYW5kbGVyIGZhaWxzIHRvIHN1cHBseSB0aGUgcmVxdWlyZWQgcmV0dXJuIHJlc3VsdC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5URVJOQUxfRVJST1IgICAgICAgICAgLSBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICAtIFRoZSBwcm90b2NvbCBsYXllciBmYWlsZWQgdG8gc2VyaWFsaXplIG9yIGRlc2VyaWFsaXplIGRhdGEuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfVFJBTlNGT1JNICAgICAgIC0gVW51c2VkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX1BST1RPQ09MICAgICAgICAtIFRoZSBwcm90b2NvbCAob3IgdmVyc2lvbikgaXMgbm90IHN1cHBvcnRlZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgLSBVbnVzZWQuCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0geworICAgIFVOS05PV046IDAsCisgICAgVU5LTk9XTl9NRVRIT0Q6IDEsCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEU6IDIsCisgICAgV1JPTkdfTUVUSE9EX05BTUU6IDMsCisgICAgQkFEX1NFUVVFTkNFX0lEOiA0LAorICAgIE1JU1NJTkdfUkVTVUxUOiA1LAorICAgIElOVEVSTkFMX0VSUk9SOiA2LAorICAgIFBST1RPQ09MX0VSUk9SOiA3LAorICAgIElOVkFMSURfVFJBTlNGT1JNOiA4LAorICAgIElOVkFMSURfUFJPVE9DT0w6IDksCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6IDEwCit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQGF1Z21lbnRzIFRocmlmdC5URXhjZXB0aW9uCisgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gbWVzc2FnZSAoZGlzdGluY3QgZnJvbSB0aGUgRXJyb3IgbWVzc2FnZSkuCisgKiBAcGFyYW0ge1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlfSBbY29kZV0gLSBUaGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBjb2RlLgorICogQGNsYXNzZGVzYyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIHRvIHByb3BhZ2F0ZSBleGNlcHRpb25zIGZyb20gYW4gUlBDIHNlcnZlciBiYWNrIHRvIGEgY2FsbGluZyBjbGllbnQuCisqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGNvZGUpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMuY29kZSA9IHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJyA/IGNvZGUgOiAwOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisvKioKKyAqIFJlYWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gZnJvbSB0aGUgc3VwcGxpZWQgcHJvdG9jb2wuCisgKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgcHJvdG9jb2wgdG8gcmVhZCBmcm9tLgorICovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZpZCA9IHJldC5maWQ7CisKKyAgICAgICAgc3dpdGNoIChmaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldC52YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuSTMyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlID0gcmV0LnZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworfTsKKworLyoqCisgKiBXaXRlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRvIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBvdXRwdXQgLSBUaGUgb3V0cHV0IHByb3RvY29sIHRvIHdyaXRlIHRvLgorICovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeworICAgIG91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICh0aGlzLm1lc3NhZ2UpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdC5UeXBlLlNUUklORywgMSk7CisgICAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuY29kZSkgeworICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0LlR5cGUuSTMyLCAyKTsKKyAgICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSk7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBjb2RlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IGV4Y2VwdGlvbiBjb2RlCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5jb2RlOworfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgICAgVU5LTk9XTjogMCwKKyAgICBJTlZBTElEX0RBVEE6IDEsCisgICAgTkVHQVRJVkVfU0laRTogMiwKKyAgICBTSVpFX0xJTUlUOiAzLAorICAgIEJBRF9WRVJTSU9OOiA0LAorICAgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgICBERVBUSF9MSU1JVDogNgorfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgICAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RQcm90b2NvbEV4Y2VwdGlvbicpOworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgWEhSIHRyYW5zcG9ydC4KKyAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBYSFIgb3BlcmF0aW9ucyBvbgorICogeW91ciBvd24uIFRoaXMgdHlwZSBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgVHJhbnNwb3J0IGFsaWFzCisgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRYSFJUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIEh0dHBbc10vWEhSLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCB0aGUgaHR0cFtzXSB0cmFuc3BvcnQKKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NSIpOworICovCitUaHJpZnQuVHJhbnNwb3J0ID0gVGhyaWZ0LlRYSFJUcmFuc3BvcnQgPSBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLnVybCA9IHVybDsKKyAgICB0aGlzLndwb3MgPSAwOworICAgIHRoaXMucnBvcyA9IDA7CisgICAgdGhpcy51c2VDT1JTID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VDT1JTKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBvcHRpb25zID8gKG9wdGlvbnMuY3VzdG9tSGVhZGVycyA/IG9wdGlvbnMuY3VzdG9tSGVhZGVycyA6IHt9KToge307CisgICAgdGhpcy5zZW5kX2J1ZiA9ICcnOworICAgIHRoaXMucmVjdl9idWYgPSAnJzsKK307CisKK1RocmlmdC5UWEhSVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdC4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorICAgICAqLworICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9IGNhdGNoIChlMSkgeyB9CisgICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaCAoZTIpIHsgfQorICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUzKSB7IH0KKworICAgICAgICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYSFIuIjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMCisgICAgICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAgICAgKiBhIFVSTCwgb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIGFuZCBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgb3IKKyAgICAgKiB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBPcHRpb25hbCBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCisgICAgICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgICAgICovCisgICAgZmx1c2g6IGZ1bmN0aW9uKGFzeW5jLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgIGlmICgoYXN5bmMgJiYgIWNhbGxiYWNrKSB8fCB0aGlzLnVybCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudXJsID09PSAnJykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICAgICAgICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgICAgICAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICAgICAgLy9JZ25vcmUgWEhSIGNhbGxiYWNrcyB1bnRpbCB0aGUgZGF0YSBhcnJpdmVzLCB0aGVuIGNhbGwgdGhlCisgICAgICAgICAgICAvLyAgY2xpZW50J3MgY2FsbGJhY2sKKyAgICAgICAgICAgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0KKyAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKHRoaXMucmVzcG9uc2VUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KCkpOworCisgICAgICAgICAgICAvLyBkZXRlY3QgbmV0OjpFUlJfQ09OTkVDVElPTl9SRUZVU0VEIGFuZCBjYWxsIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgIHhyZXEub25lcnJvciA9CisgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSgpKTsKKworICAgICAgICB9CisKKyAgICAgICAgeHJlcS5vcGVuKCdQT1NUJywgdGhpcy51cmwsICEhYXN5bmMpOworCisgICAgICAgIC8vIGFkZCBjdXN0b20gaGVhZGVycworICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmN1c3RvbUhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkgeworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKHByb3AsIHNlbGYuY3VzdG9tSGVhZGVyc1twcm9wXSk7CisgICAgICAgIH0pOworCisgICAgICAgIGlmICh4cmVxLnNldFJlcXVlc3RIZWFkZXIpIHsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgfQorCisgICAgICAgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHJlcS5yZWFkeVN0YXRlICE9IDQpIHsKKyAgICAgICAgICAgIHRocm93ICdlbmNvdW50ZXJlZCBhbiB1bmtub3duIGFqYXggcmVhZHkgc3RhdGU6ICcgKyB4cmVxLnJlYWR5U3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHJlcS5zdGF0dXMgIT0gMjAwKSB7CisgICAgICAgICAgICB0aHJvdyAnZW5jb3VudGVyZWQgYSB1bmtub3duIHJlcXVlc3Qgc3RhdHVzOiAnICsgeHJlcS5zdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlY3ZfYnVmID0geHJlcS5yZXNwb25zZVRleHQ7CisgICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMucnBvcyA9IDA7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBqUXVlcnkgWEhSIG9iamVjdCB0byBiZSB1c2VkIGZvciBhIFRocmlmdCBzZXJ2ZXIgY2FsbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2xpZW50IC0gVGhlIFRocmlmdCBTZXJ2aWNlIGNsaWVudCBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRoZSBJREwgY29tcGlsZXIuCisgICAgICogQHBhcmFtIHtvYmplY3R9IHBvc3REYXRhIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgc2VydmVyLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGFyZ3MgLSBUaGUgb3JpZ2luYWwgY2FsbCBhcmd1bWVudHMgd2l0aCB0aGUgc3VjY2VzcyBjYWxsIGJhY2sgYXQgdGhlIGVuZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZWN2X21ldGhvZCAtIFRoZSBUaHJpZnQgU2VydmljZSBDbGllbnQgcmVjZWl2ZSBtZXRob2QgZm9yIHRoZSBjYWxsLgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEEgbmV3IGpRdWVyeSBYSFIgb2JqZWN0LgorICAgICAqIEB0aHJvd3Mge3N0cmluZ30gSWYgdGhlIGpRdWVyeSB2ZXJzaW9uIGlzIHByaW9yIHRvIDEuNSBvciBpZiBqUXVlcnkgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIGpxUmVxdWVzdDogZnVuY3Rpb24oY2xpZW50LCBwb3N0RGF0YSwgYXJncywgcmVjdl9tZXRob2QpIHsKKyAgICAgICAgaWYgKHR5cGVvZiBqUXVlcnkgPT09ICd1bmRlZmluZWQnIHx8CisgICAgICAgICAgICB0eXBlb2YgalF1ZXJ5LkRlZmVycmVkID09PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgdGhyb3cgJ1RocmlmdC5qcyByZXF1aXJlcyBqUXVlcnkgMS41KyB0byB1c2UgYXN5bmNocm9ub3VzIHJlcXVlc3RzJzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0aHJpZnRUcmFuc3BvcnQgPSB0aGlzOworCisgICAgICAgIHZhciBqcVhIUiA9IGpRdWVyeS5hamF4KHsKKyAgICAgICAgICAgIHVybDogdGhpcy51cmwsCisgICAgICAgICAgICBkYXRhOiBwb3N0RGF0YSwKKyAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcsCisgICAgICAgICAgICBkYXRhVHlwZTogJ3RleHQgdGhyaWZ0JywKKyAgICAgICAgICAgIGNvbnZlcnRlcnM6IHsKKyAgICAgICAgICAgICAgICAndGV4dCB0aHJpZnQnIDogZnVuY3Rpb24ocmVzcG9uc2VEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmlmdFRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHJlc3BvbnNlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlY3ZfbWV0aG9kLmNhbGwoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBjb250ZXh0OiBjbGllbnQsCisgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkubWFrZUFycmF5KGFyZ3MpLnBvcCgpCisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBqcVhIUjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHByb3ZpZGUgdGhlIHByb3RvY29sIHdoZW4gZGVzZXJpYWxpemluZy4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXI6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLnJwb3MgPSAwOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBYSFIgYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgICAgICovCisgICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBvcGVuOiBmdW5jdGlvbigpIHt9LAorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkOiBmdW5jdGlvbihsZW4pIHsKKyAgICAgICAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgICAgICAgIGlmIChhdmFpbCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICcnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdpdmUgPSBsZW47CisKKyAgICAgICAgaWYgKGF2YWlsIDwgbGVuKSB7CisgICAgICAgICAgICBnaXZlID0gYXZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgICAgICAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICB9CisKK307CisKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PCisgKiBiZXR3ZWVuIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUV2ViU29ja2V0VHJhbnNwb3J0IG9iamVjdAorICogdXNlcyB0aGUgV2ViU29ja2V0IHByb3RvY29sLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCBXZWJTb2NrZXQuCisgKiAoc2VlOiBub2RlLmpzIGV4YW1wbGUgc2VydmVyX2h0dHAuanMpLgorICogQGV4YW1wbGUKKyAqICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKi8KK1RocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24odXJsKSB7CisgICAgdGhpcy5fX3Jlc2V0KHVybCk7Cit9OworCitUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUgPSB7CisgICAgX19yZXNldDogZnVuY3Rpb24odXJsKSB7CisgICAgICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgICAgICB0aGlzLnNvY2tldCA9IG51bGw7ICAgICAgICAgLy9UaGUgd2ViIHNvY2tldAorICAgICAgdGhpcy5jYWxsYmFja3MgPSBbXTsgICAgICAgIC8vUGVuZGluZyBjYWxsYmFja3MKKyAgICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgICAgICB0aGlzLnNlbmRfYnVmID0gJyc7ICAgICAgICAgLy9PdXRib3VuZCBkYXRhLCBpbW11dGFibGUgdW50aWwgc2VudAorICAgICAgdGhpcy5yZWN2X2J1ZiA9ICcnOyAgICAgICAgIC8vSW5ib3VuZCBkYXRhCisgICAgICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgICB0aGlzLnJiX3Jwb3MgPSAwOyAgICAgICAgICAgLy9DbGllbnQgcmVhZCBwb3NpdGlvbiBpbiByZWNlaXZlIGJ1ZmZlcgorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYworICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKKyAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAgICAgKi8KKyAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CisgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgICAgICAvL1NlbmQgZGF0YSBhbmQgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBpbnZva2UgdGhlIGNsaWVudCBjYWxsYmFjaworICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgICAgICBidWY6IHRoaXMuc2VuZF9idWYsCisgICAgICAgICAgY2I6IGNhbGxiYWNrCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBfX29uT3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKKyAgICAgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKGVsZW0uYnVmKTsKKyAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgIH0oKSkpOworICAgICAgICAgIH0pOworICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgICAgICAgfQorICAgIH0sCisKKyAgICBfX29uQ2xvc2U6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdGhpcy5fX3Jlc2V0KHRoaXMudXJsKTsKKyAgICB9LAorCisgICAgX19vbk1lc3NhZ2U6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgICAgICB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpKGV2dC5kYXRhKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX19vbkVycm9yOiBmdW5jdGlvbihldnQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAnICsgZXZ0LnRvU3RyaW5nKCkpOworICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5yZWN2X2J1ZiA9IGJ1ZjsKKyAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy5ycG9zID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtib29sZWFufQorICAgICAqLworICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIG9wZW46IGZ1bmN0aW9uKCkgeworICAgICAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX19vbk1lc3NhZ2UuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBjbG9zZTogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAgICAgKiBidWZmZXIuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbiAtIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXR1cm4uCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZDogZnVuY3Rpb24obGVuKSB7CisgICAgICAgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICAgICAgICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnaXZlID0gbGVuOworCisgICAgICAgIGlmIChhdmFpbCA8IGxlbikgeworICAgICAgICAgICAgZ2l2ZSA9IGF2YWlsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJldCA9IHRoaXMucmVhZF9idWYuc3Vic3RyKHRoaXMucnBvcywgZ2l2ZSk7CisgICAgICAgIHRoaXMucnBvcyArPSBnaXZlOworCisgICAgICAgIC8vY2xlYXIgYnVmIHdoZW4gY29tcGxldGU/CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGlyZSByZXNwb25zZSBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZEFsbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKi8KKyAgICB3cml0ZTogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRoaXMuc2VuZF9idWYgPSBidWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBnZXRTZW5kQnVmZmVyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgICAgfQorCit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAqIEBjbGFzc2Rlc2MgQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MKKyAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqLworVGhyaWZ0LlRKU09OUHJvdG9jb2wgPSBUaHJpZnQuUHJvdG9jb2wgPSBmdW5jdGlvbih0cmFuc3BvcnQpIHsKKyAgICB0aGlzLnRzdGFjayA9IFtdOworICAgIHRoaXMudHBvcyA9IFtdOworICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworfTsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgSWQgdG8gc3RyaW5nIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUaHJpZnQuUHJvdG9jb2wuVHlwZSA9IHt9OworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuQk9PTF0gPSAnInRmIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5CWVRFXSA9ICciaTgiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkxNl0gPSAnImkxNiInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTMyXSA9ICciaTMyIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JNjRdID0gJyJpNjQiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkRPVUJMRV0gPSAnImRibCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU1RSVUNUXSA9ICcicmVjIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLk1BUF0gPSAnIm1hcCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuTElTVF0gPSAnImxzdCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU0VUXSA9ICcic2V0Iic7CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVGhyaWZ0LlByb3RvY29sLlJUeXBlID0ge307CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUudGYgPSBUaHJpZnQuVHlwZS5CT09MOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk4ID0gVGhyaWZ0LlR5cGUuQllURTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5pMTYgPSBUaHJpZnQuVHlwZS5JMTY7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTMyID0gVGhyaWZ0LlR5cGUuSTMyOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk2NCA9IFRocmlmdC5UeXBlLkk2NDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5kYmwgPSBUaHJpZnQuVHlwZS5ET1VCTEU7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUucmVjID0gVGhyaWZ0LlR5cGUuU1RSVUNUOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLnN0ciA9IFRocmlmdC5UeXBlLlNUUklORzsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5tYXAgPSBUaHJpZnQuVHlwZS5NQVA7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUubHN0ID0gVGhyaWZ0LlR5cGUuTElTVDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5zZXQgPSBUaHJpZnQuVHlwZS5TRVQ7CisKKy8qKgorICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgKiBAcmVhZG9ubHkKKyAqIEBjb25zdCB7bnVtYmVyfSBWZXJzaW9uCisgKiBAbWVtYmVyb2YgVGhyaWZ0LlByb3RvY29sCisgKi8KKyBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiA9IDE7CisKK1RocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUgPSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzZXJ2aWNlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VCZWdpbjogZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7CisgICAgICAgIHRoaXMudHN0YWNrID0gW107CisgICAgICAgIHRoaXMudHBvcyA9IFtdOworCisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5WZXJzaW9uLCAnIicgKworICAgICAgICAgICAgbmFtZSArICciJywgbWVzc2FnZVR5cGUsIHNlcWlkXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgICAgICAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgIHRoaXMud29iai5wdXNoKG9iaik7CisKKyAgICAgICAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKKworICAgICAgICB0aGlzLnRyYW5zcG9ydC53cml0ZSh0aGlzLndidWYpOworICAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7fSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZVN0cnVjdEVuZDogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisgICAgICAgIHZhciBzdHJ1Y3QgPSB0aGlzLnRzdGFja1twXTsKKyAgICAgICAgdmFyIHN0ciA9ICd7JzsKKyAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIHN0cnVjdCkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyICs9ICcsJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9ICd9JzsKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5Qcm90b2NvbC5UeXBlfSBmaWVsZFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICAqLworICAgIHdyaXRlRmllbGRCZWdpbjogZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7CisgICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCisgICAgICAgICAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVGhyaWZ0LlByb3RvY29sLlR5cGVbZmllbGRUeXBlXQorICAgICAgICB9KTsKKworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkRW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgIHZhciBmaWVsZEluZm8gPSB0aGlzLnRzdGFjay5wb3AoKTsKKworICAgICAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOworICAgICAgICB0aGlzLnRwb3MucG9wKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVGaWVsZFN0b3A6IGZ1bmN0aW9uKCkgeworICAgICAgICAvL25hCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGtleVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICAgICAqLworICAgIHdyaXRlTWFwQmVnaW46IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVba2V5VHlwZV0sCisgICAgICAgICAgICBUaHJpZnQuUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwgMF0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgICovCisgICAgd3JpdGVNYXBFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgeworICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnJyk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgLyAyOworCisgICAgICAgIHRoaXMudHN0YWNrW3BdW3RoaXMudHN0YWNrW3BdLmxlbmd0aCAtIDFdID0gc2l6ZTsKKworICAgICAgICB2YXIgbWFwID0gJ30nOworICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgICAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFwID0gJywnICsgbWFwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncworICAgICAgICAgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7CisgICAgICAgIH0KKyAgICAgICAgbWFwID0gJ3snICsgbWFwOworCisgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RCZWdpbjogZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLCBzaXplXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgICovCisgICAgd3JpdGVMaXN0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZVNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICAgICAqLworICAgIHdyaXRlU2V0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KKyAgICB3cml0ZUJvb2w6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2godmFsdWUgPyAxIDogMCk7CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVCeXRlOiBmdW5jdGlvbihpOCkgeworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk4KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkxNjogZnVuY3Rpb24oaTE2KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkzMjogZnVuY3Rpb24oaTMyKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTMyKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUk2NDogZnVuY3Rpb24oaTY0KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24oZGJsKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goZGJsKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7CisgICAgICAgIC8vIFdlIGRvIG5vdCBlbmNvZGUgdXJpIGNvbXBvbmVudHMgZm9yIHdpcmUgdHJhbnNmZXI6CisgICAgICAgIGlmIChzdHIgPT09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2gobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKKyAgICAgICAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2gKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhcyBkb3VibGUgYmFja3NsYXNoCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCisgICAgd3JpdGVCaW5hcnk6IGZ1bmN0aW9uKGJpbmFyeSkgeworICAgICAgICB2YXIgc3RyID0gJyc7CisgICAgICAgIGlmICh0eXBlb2YgYmluYXJ5ID09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICBzdHIgPSBiaW5hcnk7CisgICAgICAgIH0gZWxzZSBpZiAoYmluYXJ5IGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgICAgICAgICAgdmFyIGFyciA9IGJpbmFyeTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dyaXRlQmluYXJ5IG9ubHkgYWNjZXB0cyBTdHJpbmcgb3IgVWludDhBcnJheS4nKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ0b2Eoc3RyKSArICciJyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNZXNzYWdlQmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJzdGFjayA9IFtdOworICAgICAgICB0aGlzLnJwb3MgPSBbXTsKKworICAgICAgICBpZiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBKU09OLnBhcnNlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICB0aGlzLnJvYmogPSBKU09OLnBhcnNlKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpRdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGpRdWVyeS5wYXJzZUpTT04odGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGV2YWwodGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHZhciB2ZXJzaW9uID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVGhyaWZ0LlByb3RvY29sLlZlcnNpb24pIHsKKyAgICAgICAgICAgIHRocm93ICdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisgICAgICAgIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgICAgICAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKKworCisgICAgICAgIC8vZ2V0IHRvIHRoZSBtYWluIG9iagorICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KKyAgICByZWFkTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IChpZ25vcmVkKQorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5CisgICAgICovCisgICAgcmVhZFN0cnVjdEJlZ2luOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIuZm5hbWUgPSAnJzsKKworICAgICAgICAvL2luY2FzZSB0aGlzIGlzIGFuIGFycmF5IG9mIHN0cnVjdHMKKyAgICAgICAgaWYgKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworICAgIHJlYWRTdHJ1Y3RFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMl0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIChhbHdheXMgJycpLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRGaWVsZEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRGaWVsZEJlZ2luOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICB2YXIgZmlkID0gLTE7CisgICAgICAgIHZhciBmdHlwZSA9IFRocmlmdC5UeXBlLlNUT1A7CisKKyAgICAgICAgLy9nZXQgYSBmaWVsZElkCisgICAgICAgIGZvciAodmFyIGYgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgICAgICAgICAgaWYgKGYgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpZCA9IHBhcnNlSW50KGYsIDEwKTsKKyAgICAgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAgICAgICAgIC8vcmVtb3ZlIHNvIHdlIGRvbid0IHNlZSBpdCBhZ2FpbgorICAgICAgICAgICAgZGVsZXRlIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZmllbGQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWQgIT0gLTEpIHsKKworICAgICAgICAgICAgLy9zaG91bGQgb25seSBiZSAxIG9mIHRoZXNlIGJ1dCB0aGlzIGlzIHRoZSBvbmx5CisgICAgICAgICAgICAvL3dheSB0byBtYXRjaCBhIGtleQorICAgICAgICAgICAgZm9yICh2YXIgaSBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgICAgICAgICAgICAgaWYgKFRocmlmdC5Qcm90b2NvbC5SVHlwZVtpXSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmdHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtpXTsKKyAgICAgICAgICAgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSA9CisgICAgICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgci5mbmFtZSA9ICcnOworICAgICAgICByLmZ0eXBlID0gZnR5cGU7CisgICAgICAgIHIuZmlkID0gZmlkOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4gKi8KKyAgICByZWFkRmllbGRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpOworCisgICAgICAgIC8vZ2V0IGJhY2sgdG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBzdGFjaworICAgICAgICB3aGlsZSAodGhpcy5yc3RhY2subGVuZ3RoID4gcG9zKSB7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorCisgICAgfSwKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBrdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICAgICAqLworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1hcEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNYXBCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgdmFyIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXApOworICAgICAgICAgIG1hcCA9IGZpcnN0OworICAgICAgICAgIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgciA9IHt9OworICAgICAgICByLmt0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZpcnN0XTsKKyAgICAgICAgci52dHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07CisgICAgICAgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOworCisKKyAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KKyAgICByZWFkTWFwRW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGV0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRMaXN0QmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbGlzdCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIuZXR5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKKyAgICAgICAgci5zaXplID0gbGlzdC5zaGlmdCgpOworCisgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMucnN0YWNrLnB1c2gobGlzdC5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KKyAgICByZWFkTGlzdEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCkgLSAyOworICAgICAgICB2YXIgc3QgPSB0aGlzLnJzdGFjazsKKyAgICAgICAgc3QucG9wKCk7CisgICAgICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5ICYmIHN0Lmxlbmd0aCA+IHBvcyAmJiBzdFtwb3NdLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBzdC5wdXNoKHN0W3Bvc10uc2hpZnQoKSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LiAqLworICAgIHJlYWRTZXRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEVuZCgpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0bworICAgICAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIKKyAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZSAqLworICAgIHJlYWRCb29sOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKworICAgICAgICBpZiAociAhPT0gbnVsbCAmJiByLnZhbHVlID09ICcxJykgeworICAgICAgICAgICAgci52YWx1ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnZhbHVlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkQnl0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkSTE2OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJMzI6IGZ1bmN0aW9uKGYpIHsKKyAgICAgICAgaWYgKGYgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNSZXZlcnNlZCkgeworICAgICAgICAgICAgICAgICAgICBmLnJldmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5pc1JldmVyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci52YWx1ZSA9IGYucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgICAgICAgICBmb3IgKHZhciBpIGluIGYpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGZbaV07CisKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci52YWx1ZSA9IGY7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJNjQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEJpbmFyeTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCk7CisgICAgICAgIHIudmFsdWUgPSBhdG9iKHIudmFsdWUpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhICovCisgICAgc2tpcDogZnVuY3Rpb24odHlwZSkgeworICAgICAgICB2YXIgcmV0LCBpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5CT09MOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRCb29sKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTE2KCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuSTMyOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEk2NCgpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRG91YmxlKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLk1BUDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHRoaXMucnBvc1t0aGlzLnJwb3MubGVuZ3RoIC0gMV0gKyAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC5rdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQudnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TRVQ6CisgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV0LnNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmV0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV0LnNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmV0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBNdXRpbHBsZXhQcm90b2NvbCBJbXBsZW1lbnRhdGlvbiBhcyBhIFdyYXBwZXIgZm9yIFRocmlmdC5Qcm90b2NvbAorICogQGNvbnN0cnVjdG9yCisgKi8KK1RocmlmdC5NdWx0aXBsZXhQcm90b2NvbCA9IGZ1bmN0aW9uKHNydk5hbWUsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgeworICAgIFRocmlmdC5Qcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CisgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNydk5hbWU7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbCwgVGhyaWZ0LlByb3RvY29sLCAnbXVsdGlwbGV4UHJvdG9jb2wnKTsKKworLyoqIE92ZXJyaWRlIHdyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZCBvZiBwcm90b3R5cGUqLworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisKKyAgICBpZiAodHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgdGhpcy5zZXJ2aWNlTmFtZSArICc6JyArIG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0KK307CisKK1RocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2VxaWQgPSAwOworfTsKKworLyoqIEluc3RhbnRpYXRlcyBhIG11bHRpcGxleGVkIGNsaWVudCBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlTmFtZSAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhyaWZ0LlRyYW5zcG9ydCBpbnN0YW5jZSB3aGljaCBwcm92aWRlcyByZW1vdGUgaG9zdDpwb3J0CisgKiBAZXhhbXBsZQorICogICAgdmFyIG1wID0gbmV3IFRocmlmdC5NdWx0aXBsZXhlcigpOworICogICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0OjkwOTAvZm9vLnRocmlmdCIpOworICogICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICogICAgdmFyIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgnQXV0aFNlcnZpY2UnLCBBdXRoU2VydmljZUNsaWVudCwgdHJhbnNwb3J0KTsKKyovCitUaHJpZnQuTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBTQ2wsIHRyYW5zcG9ydCkgeworICAgIGlmIChTQ2wuQ2xpZW50KSB7CisgICAgICAgIFNDbCA9IFNDbC5DbGllbnQ7CisgICAgfQorICAgIHZhciBzZWxmID0gdGhpczsKKyAgICBTQ2wucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBzZWxmLnNlcWlkICs9IDE7CisgICAgICAgIHJldHVybiBzZWxmLnNlcWlkOworICAgIH07CisgICAgdmFyIGNsaWVudCA9IG5ldyBTQ2wobmV3IFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbChzZXJ2aWNlTmFtZSwgdHJhbnNwb3J0KSk7CisKKyAgICByZXR1cm4gY2xpZW50OworfTsKKworCisKK3ZhciBjb3B5TGlzdCwgY29weU1hcDsKKworY29weUxpc3QgPSBmdW5jdGlvbihsc3QsIHR5cGVzKSB7CisKKyAgaWYgKCFsc3QpIHtyZXR1cm4gbHN0OyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgbGVuID0gbHN0Lmxlbmd0aCwgcmVzdWx0ID0gW10sIGksIHZhbDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmFsID0gbHN0W2ldOworICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICByZXN1bHQucHVzaCh2YWwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICByZXN1bHQucHVzaCh0eXBlKHZhbCwgdHlwZXMuc2xpY2UoMSkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQucHVzaChuZXcgVHlwZSh2YWwpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK2NvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKSB7CisKKyAgaWYgKCFvYmopIHtyZXR1cm4gb2JqOyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgcmVzdWx0ID0ge30sIHZhbDsKKyAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICB2YWwgPSBvYmpbcHJvcF07CisgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gbmV3IFR5cGUodmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK1RocmlmdC5jb3B5TWFwID0gY29weU1hcDsKK1RocmlmdC5jb3B5TGlzdCA9IGNvcHlMaXN0OwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvanMvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDkyN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2V4cG9ydCBDTEFTU1BBVEgKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKworY2hlY2stbG9jYWw6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9SRUFETUUubWQgYi9saWIvanMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMTQwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDY4IEBACitUaHJpZnQgSmF2YXNjcmlwdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cworUlBDIGNsaWVudHMgdXNpbmcgdGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIdHRwW3NdIHdpdGggWEhSCithbmQgV2ViU29ja2V0LgorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVGVzdCBTZXJ2ZXJzCistLS0tLS0tLS0tLS0KK2Ryd3hyLXhyLXggMiByYW5keSByYW5keSAgNDA5NiBGZWIgIDggMTU6NDQgc2VjCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDIxODMgRmViICA5IDA0OjAxIHNlcnZlcl9odHRwLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDIzODYgRmViICA5IDA1OjM5IHNlcnZlcl9odHRwcy5qcworCitzZXJ2ZXJfaHR0cC5qcyBpcyBhIE5vZGUuanMgd2ViIHNlcnZlciB3aGljaCBzdXBwb3J0IHRoZQorc3RhbmRhcmQgQXBhY2hlIFRocmlmdCB0ZXN0IHN1aXRlICh0aHJpZnQvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCkuCitUaGUgc2VydmVyIHN1cHBvcnRzIEFwYWNoZSBUaHJpZnQgWEhSIGFuZCBXZWJTb2NrZXQgY2xpZW50cy4KKworc2VydmVyX2h0dHBzLmpzIGlzIHRoZSBzYW1lIGJ1dCB1c2VzIFNTTC9UTFMuIFRoZSBzZXJ2ZXIga2V5IAorYW5kIGNlcnQgYXJlIHB1bGxlZCBmcm9tIHRoZSB0aHJpZnQvdGVzdC9rZXlzIGZvbGRlci4KKworQm90aCBvZiB0aGVzZSBzZXJ2ZXJzIHN1cHBvcnQgV2ViU29ja2V0ICh0aGUgaHR0cDogc3VwcG9ydHMgd3M6LAorYW5kIHRoZSBodHRwczogc3VwcG9ydCB3c3M6KS4KKworVG8gcnVuIHRoZSBjbGllbnQgdGVzdCB3aXRoIHRoZSBKYXZhIHRlc3Qgc2VydmVyIHVzZTogCiskIG1ha2UgY2hlY2sgKHJlcXVpcmVzIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmEgYnJhbmNoIAorYW5kIG1ha2UgY2hlY2sgbXVzdCBoYXZlIGJlZW4gcnVuIGluIHRocmlmdC9saWIvamF2YSAKK3ByZXZpb3VzbHkpLgorCitUbyBydW4gdGhlIGNsaWVudCB0ZXN0cyB3aXRoIHRoZSBOb2RlIHNlcnZlcnMgcnVuIHRoZSBncnVudAorIGJ1aWxkIGluIHRoZSBwYXJlbnQganMgZGlyZWN0b3J5IChzZWUgUkVBRE1FIHRoZXJlKS4KKyAKK1Rlc3QgQ2xpZW50cworLS0tLS0tLS0tLS0tCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgMTM1NTggRmViICA5IDA3OjE4IHRlc3QtYXN5bmMuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgNTcyNCBGZWIgIDkgMDM6NDUgdGVzdF9oYW5kbGVyLmpzCistcnd4ci14ci14IDEgcmFuZHkgcmFuZHkgIDI3MTkgRmViICA5IDA2OjA0IHRlc3QuaHRtbAorLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICA0NjExIEZlYiAgOSAwNjowNSB0ZXN0LWpxLmpzCistcnd4ci14ci14IDEgcmFuZHkgcmFuZHkgMTIxNTMgRmViICA5IDA2OjA0IHRlc3QuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMjU5MyBGZWIgIDkgMDY6MTYgdGVzdC1ub2pxLmh0bWwKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMTQ1MCBGZWIgIDkgMDY6MTQgdGVzdC1ub2pxLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDI4NDcgRmViICA5IDA2OjMxIHRlc3R3cy5odG1sCisKK1RoZXJlIGFyZSB0aHJlZSBodG1sIHRlc3QgZHJpdmVyIGZpbGVzLCBhbGwgb2Ygd2hpY2ggYXJlCitRVW5pdCBiYXNlZC4gdGVzdC5odG1sIHRlc3RzIHRoZSBBcGFjaGUgVGhyaWZ0IGpRdWVyeQorZ2VuZXJhdGVkIGNvZGUgKHRocmlmdCAtZ2VuIGpzOmpxdWVyeSkuIFRoZSB0ZXN0LW5vanEuaHRtbAorcnVucyBhbG1vc3QgaWRlbnRpY2FsIHRlc3RzIGFnYWluc3Qgbm9ybWFsIEphdmFTY3JpcHQgYnVpbGRzCisodGhyaWZ0IC1nZW4ganMpLiBCb3RoIG9mIHRoZSBwcmV2aW91cyB0ZXN0cyB1c2UgdGhlIFhIUiAKK3RyYW5zcG9ydC4gVGhlIHRlc3R3cy5odG1sIHJ1bnMgc2ltaWxhciB0ZXN0cyB1c2luZyB0aGUKK1dlYlNvY2tldCB0cmFuc3BvcnQuIFRoZSB0ZXN0Ki5qcyBmaWxlcyBhcmUgbG9hZGVkIGJ5IHRoZQoraHRtbCBkcml2ZXJzIGFuZCBjb250YWluIHRoZSBhY3R1YWwgQXBhY2hlIFRocmlmdCB0ZXN0cy4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC54bWwgYi9saWIvanMvdGVzdC9idWlsZC54bWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiZDJmYWYyLi4wNGMxMzYwCi0tLSBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbAorKysgYi9saWIvanMvdGVzdC9idWlsZC54bWwKQEAgLTI2LDIyICsyNiwyNiBAQAogICA8cHJvcGVydHkgbmFtZT0iZ2VuamF2YSIgbG9jYXRpb249Imdlbi1qYXZhIiAvPgogICA8cHJvcGVydHkgbmFtZT0iZ2VuanMiIGxvY2F0aW9uPSJnZW4tanMiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgotICA8cHJvcGVydHkgbmFtZT0iamFyLmZpbGUiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2pzdGVzdC5qYXIiIC8+IAorICA8cHJvcGVydHkgbmFtZT0iamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkfS9qc3Rlc3QuamFyIiAvPgogCiAgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CiAKICAgPCEtLSBJbmNsdWRlIHRoZSBiYXNlIGphdmEgcHJvcGVydGllcyBmaWxlIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KIAogICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLyI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgogICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZH0vbGliIj4KQEAgLTU5LDEyICs2MywxNiBAQAogICAgICAgPGNvbmRpdGlvbj4KICAgICAgICAgPG5vdD4KICAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkIiBpbmNsdWRlcz0ibGlidGhyaWZ0Ki5qYXIiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CiAgICAgICAgIDwvbm90PgogICAgICAgPC9jb25kaXRpb24+CiAgICAgICBZb3UgbmVlZCBsaWJ0aHJpZnQqLmphciBhbmQgbGlidGhyaWZ0KnRlc3QuamFyIGxvY2F0ZWQgYXQKLSAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZAorICAgICAgJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMKICAgICAgIERpZCB5b3UgY29tcGlsZSBUaHJpZnQgSmF2YSBsaWJyYXJ5IGFuZCBpdHMgdGVzdCBzdWl0ZSBieSAiYW50IGNvbXBpbGUtdGVzdCI/CiAgICAgPC9mYWlsPgogICAgIDxmYWlsPgpAQCAtODEsMjYgKzg5LDgwIEBACiAKICAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJkZXBlbmRlbmNpZXMiPgogICAgIDx0c3RhbXAgLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2pzL2xpYiIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xvZyIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L3Rlc3QiLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0L2xvZyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkX2pzbGlicyI+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuMTEuMy5taW4uanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9qcXVlcnkuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmNzcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmNzcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianNsaWJzIiBkZXBlbmRzPSJpbml0LCBwcm94eSwgZG93bmxvYWRfanNsaWJzIj4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0iY29tcGlsZSB0aGUgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUsIHJlc29sdmUiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPCEtLSAvL1RPRE8gZW5hYmxlIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50Ii8+LS0+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbmphdmF9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqc3Rlc3QiIGRlc2NyaXB0aW9uPSIiIGRlcGVuZHM9ImNvbXBpbGUsIGxpbnQiPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZmlsZX0iIGJhc2VkaXI9IiR7YnVpbGR9Ii8+CisgIDx0YXJnZXQgbmFtZT0ianN0ZXN0IiBkZXNjcmlwdGlvbj0iY3JlYXRlIHRoZSB0ZXN0IHN1aXRlIGphciBmaWxlIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8amFyIGphcmZpbGU9IiR7amFyLmZpbGV9IiBiYXNlZGlyPSIke2J1aWxkfS90ZXN0Ii8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249InJ1biB0aGUgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9ImpzdGVzdCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249InJ1biB0aGUgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9ImpzdGVzdCwganNsaWJzIj4KICAgICA8amF2YSBjbGFzc25hbWU9InRlc3QuSHR0cGQiIGZvcms9InRydWUiCiAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICA8YXJnIHZhbHVlPSIuLi8iIC8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9InByb3h5IiBpZj0icHJveHkuZW5hYmxlZCI+CisgICAgPHNldHByb3h5IHByb3h5aG9zdD0iJHtwcm94eS5ob3N0fSIgcHJveHlwb3J0PSIke3Byb3h5LnBvcnR9IgorICAgICAgcHJveHl1c2VyPSIke3Byb3h5LnVzZXJ9IiBwcm94eXBhc3N3b3JkPSIke3Byb3h5LnBhc3N9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieHZmYiI+CisgICAgPGVjaG8+Y2hlY2sgaWYgWHZmYiBpcyBhdmFpbGFibGU6PC9lY2hvPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ilh2ZmIiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJubyIgcmVzdWx0cHJvcGVydHk9Inh2ZmIucHJlc2VudCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy94dmZiLmxvZyI+CisgICAgICA8YXJnIGxpbmU9Ii0tdmVyc2lvbiIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwaGFudG9tanMiIGRlcGVuZHM9Inh2ZmIiIGlmPSJ4dmZiLnByZXNlbnQiPgorICAgIDxlY2hvPmNoZWNrIGlmIHBoYW50b21qcyBpcyBhdmFpbGFibGU6PC9lY2hvPgorICAgIDxleGVjIGV4ZWN1dGFibGU9InBoYW50b21qcyIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9Im5vIiByZXN1bHRwcm9wZXJ0eT0icGhhbnRvbWpzLnByZXNlbnQiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvcGhhbnRvbWpzLmxvZyI+CisgICAgICA8YXJnIGxpbmU9Ii0tdmVyc2lvbiIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ1bml0dGVzdCIgZGVzY3JpcHRpb249ImRvIHVuaXQgdGVzdHMgd2l0aCBoZWFkbGVzcyBicm93c2VyIHBoYW50b21qcyIgZGVwZW5kcz0iaW5pdCwgcGhhbnRvbWpzLCBqc3Rlc3QsIGpzbGlicyIgaWY9InBoYW50b21qcy5wcmVzZW50Ij4KKyAgICA8cGFyYWxsZWw+CisgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJYdmZiIiBzcGF3bj0idHJ1ZSIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KKyAgICAgICAgPGFyZyBsaW5lPSI6OTkiIC8+CisgICAgICA8L2V4ZWM+CisgICAgICA8amF2YSBjbGFzc25hbWU9InRlc3QuSHR0cGQiIGZvcms9InRydWUiIHRpbWVvdXQ9IjEwMDAwIgorICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3VuaXR0ZXN0LmxvZyI+CisgICAgICAgIDxhcmcgdmFsdWU9Ii4uLyIgLz4KKyAgICAgIDwvamF2YT4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgICAgICA8ZWNobz5SdW5uaW5nIFVuaXQgVGVzdHMgd2l0aCBoZWFkbGVzcyBicm93c2VyITwvZWNobz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0icGhhbnRvbWpzIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGVudiBrZXk9IkRJU1BMQVkiIHZhbHVlPSI6OTkiLz4KKyAgICAgICAgICA8YXJnIGxpbmU9InBoYW50b21qcy1xdW5pdC5qcyBodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC90ZXN0Lmh0bWwiIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L3BhcmFsbGVsPgorICA8L3RhcmdldD4KKwogICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YSAke3RocmlmdC5kaXJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CkBAIC0xMDgsMjMgKzE3MCwyOCBAQAogICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyBsaW5lPSItLWdlbiBqczpqcXVlcnkgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgogICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCIgLz4KKyAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgogCi0gIDwhLS0gQFRPRE8gUVVuaXQgdGVzdHMgYXMgcGFydCBvZiB0aGUgdGVzdHN1aXRlLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSwgcmVzb2x2ZSwgbGludCIvPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGVzdCBzdWl0ZSAobGludCwgdW5pdHRlc3QpIiBkZXBlbmRzPSJsaW50LCB1bml0dGVzdCIvPgogCi0gIDx0YXJnZXQgbmFtZT0ibGludCIgZGVzY3JpcHRpb249ImNvZGUgcXVhbGl0eSBjaGVja3MiIGRlcGVuZHM9ImdlbmVyYXRlLCBnanNsaW50LCBqc2xpbnQiLz4KKyAgPHRhcmdldCBuYW1lPSJsaW50IiBkZXNjcmlwdGlvbj0iY29kZSBxdWFsaXR5IGNoZWNrcyAoanNsaW50IGFuZCBnanNsaW50IGlmIGF2YWlsYWJsZSkiIGRlcGVuZHM9ImdlbmVyYXRlLCBnanNsaW50LCBqc2xpbnQiLz4KIAotICA8dGFyZ2V0IG5hbWU9ImpzbGludCI+CisgIDx0YXJnZXQgbmFtZT0ianNsaW50IiBkZXBlbmRzPSJyZXNvbHZlIj4KICAgICA8dGFza2RlZiB1cmk9ImFudGxpYjpjb20uZ29vZ2xlY29kZS5qc2xpbnQ0amF2YSIgcmVzb3VyY2U9ImNvbS9nb29nbGVjb2RlL2pzbGludDRqYXZhL2FudGxpYi54bWwiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CiAgICAgPCEtLQogICAgICAgICAgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdvdWxkIHByb2JhYmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIGZ1dHVyZToKICAgICAgICAgIGJyb3dzZXIsdW5kZWYsZXFlcWVxLHBsdXNwbHVzLGJpdHdpc2UscmVnZXhwLHN0cmljdCxuZXdjYXAsaW1tZWQKICAgICAtLT4KLSAgICA8anNsOmpzbGludCBvcHRpb25zPSJldmlsLGZvcmluLGJyb3dzZXIsYml0d2lzZSxyZWdleHAsbmV3Y2FwLGltbWVkIj4KKyAgICA8anNsOmpzbGludCBvcHRpb25zPSJldmlsLGZvcmluLGJyb3dzZXIsYml0d2lzZSxyZWdleHAsbmV3Y2FwLGltbWVkIiBlbmNvZGluZz0iVVRGLTgiPgogICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgLz4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtnZW5qc30iIGluY2x1ZGVzPSIqKi8qLmpzIiAvPgotICAgICAgPGZpbGVzZXQgZGlyPSIuLiIgaW5jbHVkZXM9InRocmlmdC5qcyIgLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLi4vc3JjIiBpbmNsdWRlcz0idGhyaWZ0LmpzIiAvPgorCisgICAgICA8IS0tIGlzc3VlcyB3aXRoIHVuc2FmZSBjaGFyYWN0ZXIgLS0+CisgICAgICA8IS0tIGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKnRlc3QqLmpzIiAvPiAtLT4KICAgICA8L2pzbDpqc2xpbnQ+CiAgIDwvdGFyZ2V0PgogCkBAIC0xMzksNyArMjA2LDEwIEBACiAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iZ2pzbGludCIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9Im5vIj4KICAgICAgIDxhcmcgbGluZT0iLS1ub2pzZG9jIi8+CiAgICAgICA8YXJnIGxpbmU9IiR7Z2VuanN9LyouanMiLz4KLSAgICAgIDxhcmcgbGluZT0iLi4vdGhyaWZ0LmpzIi8+CisgICAgICA8YXJnIGxpbmU9Ii4uL3NyYy90aHJpZnQuanMiLz4KKworICAgICAgPCEtLSBpc3N1ZXMgd2l0aCB1bnNhZmUgY2hhcmFjdGVyLCBldGMuIC0tPgorICAgICAgPCEtLSA8YXJnIGxpbmU9Iip0ZXN0Ki5qcyIvPiAtLT4KICAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgogCkBAIC0xNDcsMTUgKzIxNywyNSBAQAogICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KICAgICA8ZGVsZXRlIGRpcj0iJHtnZW5qYXZhfSIgLz4KICAgICA8ZGVsZXRlIGRpcj0iJHtnZW5qc30iIC8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2phci5maWxlfSIgLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0iaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgogICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8ke212bi5hbnQudGFzay5qYXJ9Ii8+CiAKICAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNsaWVudCIgdmVyc2lvbj0iNC4wLjEiLz4KICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGVjb2RlLmpzbGludDRqYXZhIiBhcnRpZmFjdElkPSJqc2xpbnQ0amF2YS1hbnQiIHZlcnNpb249IjEuNC42Ii8+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJldS5tZWRzZWEubWltZXV0aWwiIGFydGlmYWN0SWQ9Im1pbWUtdXRpbCIgdmVyc2lvbj0iMi4xLjMiLz4KICAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KIAogICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgpAQCAtMTYzLDggKzI0Myw3IEBACiAgICAgICA8ZmlsZXNldCByZWZpZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiLz4KICAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgogICAgIDwvY29weT4KLSAgICAKKwogICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CiAgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgYi9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkM2ExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpAQCAtMCwwICsxLDIxMyBAQAorZnVuY3Rpb24gc2VyaWFsaXplKGRhdGEpIHsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbignJywgMCwgMCk7CisgIGRhdGEud3JpdGUocHJvdG9jb2wpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgcmV0dXJuIHRyYW5zcG9ydC5zZW5kX2J1ZjsKK30KKworZnVuY3Rpb24gZGVzZXJpYWxpemUoc2VyaWFsaXplZCwgdHlwZSkgeworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKKyAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoc2VyaWFsaXplZCk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOworICBkYXRhLnJlYWQocHJvdG9jb2wpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICByZXR1cm4gZGF0YTsKK30KKworCitmdW5jdGlvbiBjcmVhdGVUaHJpZnRPYmooKSB7CisKKyAgcmV0dXJuIG5ldyBDb21wbGV4KHsKKworICAgIHN0cnVjdF9maWVsZDogbmV3IFNpbXBsZSh7dmFsdWU6ICdhJ30pLAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYid9KSwKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYyd9KQorICAgIF0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2QnfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2UnfSkKKyAgICBdLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQTogbmV3IFNpbXBsZSh7dmFsdWU6ICdmJ30pLAorICAgICAgQjogbmV3IFNpbXBsZSh7dmFsdWU6ICdnJ30pCisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogWworICAgICAgICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdoJ30pLAorICAgICAgICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdpJ30pCisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnaid9KQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnayd9KQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgIFsnZml2ZScsICdzaXgnXQorICAgIF0KKyAgfQorICApOworfQorCisKK2Z1bmN0aW9uIGNyZWF0ZUpzT2JqKCkgeworCisgIHJldHVybiB7CisKKyAgICBzdHJ1Y3RfZmllbGQ6IHt2YWx1ZTogJ2EnfSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCisgICAgICB7dmFsdWU6ICdiJ30sCisgICAgICB7dmFsdWU6ICdjJ30KKyAgICBdLAorCisgICAgc3RydWN0X3NldF9maWVsZDogWworICAgICAge3ZhbHVlOiAnZCd9LAorICAgICAge3ZhbHVlOiAnZSd9CisgICAgXSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IHt2YWx1ZTogJ2YnfSwKKyAgICAgIEI6IHt2YWx1ZTogJ2cnfQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFsKKyAgICAgICAgICAgIHt2YWx1ZTogJ2gnfSwKKyAgICAgICAgICAgIHt2YWx1ZTogJ2knfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQToge3ZhbHVlOiAnaid9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjoge3ZhbHVlOiAnayd9CisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbJ29uZScsICd0d28nXSwKKyAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgWydmaXZlJywgJ3NpeCddCisgICBdCisgIH07Cit9CisKKworZnVuY3Rpb24gYXNzZXJ0VmFsdWVzKG9iaiwgYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfZmllbGQudmFsdWUsICdhJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSwgJ2InKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlLCAnYycpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSwgJ2QnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUsICdlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUsICdmJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUsICdnJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXS52YWx1ZSwgJ2gnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAnaScpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAnaicpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAnaycpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAnb25lJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICd0d28nKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgJ3RocmVlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICdmb3VyJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMF0sICdmaXZlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICdzaXgnKTsKK30KKworY29uc3QgY2FzZXMgPSB7CisKKyAgJ1NlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaW1wbGUgc3RydWN0IHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IG5ldyBTaW1wbGUoe3ZhbHVlOiAnYSd9KTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgU2ltcGxlKTsKKyAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgIGFzc2VydC5kZWVwRXF1YWwocmVjZWl2ZWQsIHRPYmopOworICB9LAorCisKKyAgJ1NlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CisgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKKyAgfSwKKworICAnTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzJzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iajEgPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCB0T2JqMiA9IG5ldyBDb21wbGV4KGNyZWF0ZUpzT2JqKCkpOworICAgIGFzc2VydFZhbHVlcyh0T2JqMiwgYXNzZXJ0KTsKKyAgICBhc3NlcnQuZXF1YWwoc2VyaWFsaXplKHRPYmoyKSwgc2VyaWFsaXplKHRPYmoxKSk7CisgIH0sCisKKyAgJ01vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CisgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CisKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoYXJncyk7CisgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisKKyAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0gPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQiA9ICdaWlonOworCisgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisgIH0sCisKKyAgJ251bGxzIGFyZSBvayc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBuZXcgQ29tcGxleCh7CisgICAgICBzdHJ1Y3RfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9zZXRfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogbnVsbAorICAgIH0pOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOworICB9CisKK307CisKK09iamVjdC5rZXlzKGNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGNhc2VOYW1lKSB7CisgIFFVbml0LnRlc3QoY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mIGIvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWIxNTg4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCkBAIC0wLDAgKzEsMTggQEAKK3NlcnZlcjogaHR0cDovL2xvY2FsaG9zdDo5ODc2CisKK2xvYWQ6CisjIFF1bml0IGFkYXB0ZXIKKyAgLSBidWlsZC9qcy9saWIvZXF1aXYuanMKKyAgLSBidWlsZC9qcy9saWIvUVVuaXRBZGFwdGVyLmpzCisjIGRlcGVuZGVuY2llcworICAtIGJ1aWxkL2pzL2xpYi9qcXVlcnkuanMKKyAgLSBidWlsZC9qcy90aHJpZnQuanMKKyAgLSBnZW4tanMvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuanMKKyAgLSBnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcworICAtIGdlbi1qcy9UaHJpZnRUZXN0LmpzCisjIHRoZSB0ZXN0IHN1aXRlCisgIC0gdGVzdC5qcworCisjIHJlZGlyZWN0IHRvIHRoZSBKYXZhIGJhc2VkIFRocmlmdCB0ZXN0c2VydmVyCitwcm94eToKKyAtIHttYXRjaGVyOiAiKiIsIHNlcnZlcjogIiBodHRwOi8vbG9jYWxob3N0OjgwODgifQpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvanNvbjIuanMgYi9saWIvanMvdGVzdC9qc29uMi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhM2IxNy4uMDAwMDAwMAotLS0gYS9saWIvanMvdGVzdC9qc29uMi5qcworKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKgotICAgIGh0dHA6Ly93d3cuSlNPTi5vcmcvanNvbjIuanMKLSAgICAyMDEwLTAzLTIwCi0KLSAgICBQdWJsaWMgRG9tYWluLgotCi0gICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgotCi0gICAgU2VlIGh0dHA6Ly93d3cuSlNPTi5vcmcvanMuaHRtbAotCi0KLSAgICBUaGlzIGNvZGUgc2hvdWxkIGJlIG1pbmlmaWVkIGJlZm9yZSBkZXBsb3ltZW50LgotICAgIFNlZSBodHRwOi8vamF2YXNjcmlwdC5jcm9ja2ZvcmQuY29tL2pzbWluLmh0bWwKLQotICAgIFVTRSBZT1VSIE9XTiBDT1BZLiBJVCBJUyBFWFRSRU1FTFkgVU5XSVNFIFRPIExPQUQgQ09ERSBGUk9NIFNFUlZFUlMgWU9VIERPCi0gICAgTk9UIENPTlRST0wuCi0KLQotICAgIFRoaXMgZmlsZSBjcmVhdGVzIGEgZ2xvYmFsIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIG1ldGhvZHM6IHN0cmluZ2lmeQotICAgIGFuZCBwYXJzZS4KLQotICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlKQotICAgICAgICAgICAgdmFsdWUgICAgICAgYW55IEphdmFTY3JpcHQgdmFsdWUsIHVzdWFsbHkgYW4gb2JqZWN0IG9yIGFycmF5LgotCi0gICAgICAgICAgICByZXBsYWNlciAgICBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBkZXRlcm1pbmVzIGhvdyBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgc3RyaW5naWZpZWQgZm9yIG9iamVjdHMuIEl0IGNhbiBiZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgotCi0gICAgICAgICAgICBzcGFjZSAgICAgICBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBuZXN0ZWQgc3RydWN0dXJlcy4gSWYgaXQgaXMgb21pdHRlZCwgdGhlIHRleHQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgcGFja2VkIHdpdGhvdXQgZXh0cmEgd2hpdGVzcGFjZS4gSWYgaXQgaXMgYSBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIHNwZWNpZnkgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGF0IGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLiBJZiBpdCBpcyBhIHN0cmluZyAoc3VjaCBhcyAnXHQnIG9yICcmbmJzcDsnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gaW5kZW50IGF0IGVhY2ggbGV2ZWwuCi0KLSAgICAgICAgICAgIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgSlNPTiB0ZXh0IGZyb20gYSBKYXZhU2NyaXB0IHZhbHVlLgotCi0gICAgICAgICAgICBXaGVuIGFuIG9iamVjdCB2YWx1ZSBpcyBmb3VuZCwgaWYgdGhlIG9iamVjdCBjb250YWlucyBhIHRvSlNPTgotICAgICAgICAgICAgbWV0aG9kLCBpdHMgdG9KU09OIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICAgICAgICBzdHJpbmdpZmllZC4gQSB0b0pTT04gbWV0aG9kIGRvZXMgbm90IHNlcmlhbGl6ZTogaXQgcmV0dXJucyB0aGUKLSAgICAgICAgICAgIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBuYW1lL3ZhbHVlIHBhaXIgdGhhdCBzaG91bGQgYmUgc2VyaWFsaXplZCwKLSAgICAgICAgICAgIG9yIHVuZGVmaW5lZCBpZiBub3RoaW5nIHNob3VsZCBiZSBzZXJpYWxpemVkLiBUaGUgdG9KU09OIG1ldGhvZAotICAgICAgICAgICAgd2lsbCBiZSBwYXNzZWQgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlLCBhbmQgdGhpcyB3aWxsIGJlCi0gICAgICAgICAgICBib3VuZCB0byB0aGUgdmFsdWUKLQotICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgc2VyaWFsaXplIERhdGVzIGFzIElTTyBzdHJpbmdzLgotCi0gICAgICAgICAgICAgICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKGtleSkgewotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKG4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBpbnRlZ2VycyB0byBoYXZlIGF0IGxlYXN0IHR3byBkaWdpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6IG47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRVVENGdWxsWWVhcigpICAgKyAnLScgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENEYXRlKCkpICAgICAgKyAnVCcgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENIb3VycygpKSAgICAgKyAnOicgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENNaW51dGVzKCkpICAgKyAnOicgKwotICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENTZWNvbmRzKCkpICAgKyAnWic7Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIHJlcGxhY2VyIG1ldGhvZC4gSXQgd2lsbCBiZSBwYXNzZWQgdGhlCi0gICAgICAgICAgICBrZXkgYW5kIHZhbHVlIG9mIGVhY2ggbWVtYmVyLCB3aXRoIHRoaXMgYm91bmQgdG8gdGhlIGNvbnRhaW5pbmcKLSAgICAgICAgICAgIG9iamVjdC4gVGhlIHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB5b3VyIG1ldGhvZCB3aWxsIGJlCi0gICAgICAgICAgICBzZXJpYWxpemVkLiBJZiB5b3VyIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZCwgdGhlbiB0aGUgbWVtYmVyIHdpbGwKLSAgICAgICAgICAgIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNlcmlhbGl6YXRpb24uCi0KLSAgICAgICAgICAgIElmIHRoZSByZXBsYWNlciBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgdGhlbiBpdCB3aWxsIGJlCi0gICAgICAgICAgICB1c2VkIHRvIHNlbGVjdCB0aGUgbWVtYmVycyB0byBiZSBzZXJpYWxpemVkLiBJdCBmaWx0ZXJzIHRoZSByZXN1bHRzCi0gICAgICAgICAgICBzdWNoIHRoYXQgb25seSBtZW1iZXJzIHdpdGgga2V5cyBsaXN0ZWQgaW4gdGhlIHJlcGxhY2VyIGFycmF5IGFyZQotICAgICAgICAgICAgc3RyaW5naWZpZWQuCi0KLSAgICAgICAgICAgIFZhbHVlcyB0aGF0IGRvIG5vdCBoYXZlIEpTT04gcmVwcmVzZW50YXRpb25zLCBzdWNoIGFzIHVuZGVmaW5lZCBvcgotICAgICAgICAgICAgZnVuY3Rpb25zLCB3aWxsIG5vdCBiZSBzZXJpYWxpemVkLiBTdWNoIHZhbHVlcyBpbiBvYmplY3RzIHdpbGwgYmUKLSAgICAgICAgICAgIGRyb3BwZWQ7IGluIGFycmF5cyB0aGV5IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBudWxsLiBZb3UgY2FuIHVzZQotICAgICAgICAgICAgYSByZXBsYWNlciBmdW5jdGlvbiB0byByZXBsYWNlIHRob3NlIHdpdGggSlNPTiB2YWx1ZXMuCi0gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh1bmRlZmluZWQpIHJldHVybnMgdW5kZWZpbmVkLgotCi0gICAgICAgICAgICBUaGUgb3B0aW9uYWwgc3BhY2UgcGFyYW1ldGVyIHByb2R1Y2VzIGEgc3RyaW5naWZpY2F0aW9uIG9mIHRoZQotICAgICAgICAgICAgdmFsdWUgdGhhdCBpcyBmaWxsZWQgd2l0aCBsaW5lIGJyZWFrcyBhbmQgaW5kZW50YXRpb24gdG8gbWFrZSBpdAotICAgICAgICAgICAgZWFzaWVyIHRvIHJlYWQuCi0KLSAgICAgICAgICAgIElmIHRoZSBzcGFjZSBwYXJhbWV0ZXIgaXMgYSBub24tZW1wdHkgc3RyaW5nLCB0aGVuIHRoYXQgc3RyaW5nIHdpbGwKLSAgICAgICAgICAgIGJlIHVzZWQgZm9yIGluZGVudGF0aW9uLiBJZiB0aGUgc3BhY2UgcGFyYW1ldGVyIGlzIGEgbnVtYmVyLCB0aGVuCi0gICAgICAgICAgICB0aGUgaW5kZW50YXRpb24gd2lsbCBiZSB0aGF0IG1hbnkgc3BhY2VzLgotCi0gICAgICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICB0ZXh0ID0gSlNPTi5zdHJpbmdpZnkoWydlJywge3BsdXJpYnVzOiAndW51bSd9XSk7Ci0gICAgICAgICAgICAvLyB0ZXh0IGlzICdbImUiLHsicGx1cmlidXMiOiJ1bnVtIn1dJwotCi0KLSAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShbJ2UnLCB7cGx1cmlidXM6ICd1bnVtJ31dLCBudWxsLCAnXHQnKTsKLSAgICAgICAgICAgIC8vIHRleHQgaXMgJ1tcblx0ImUiLFxuXHR7XG5cdFx0InBsdXJpYnVzIjogInVudW0iXG5cdH1cbl0nCi0KLSAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShbbmV3IERhdGUoKV0sIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba2V5XSBpbnN0YW5jZW9mIERhdGUgPwotICAgICAgICAgICAgICAgICAgICAnRGF0ZSgnICsgdGhpc1trZXldICsgJyknIDogdmFsdWU7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIC8vIHRleHQgaXMgJ1siRGF0ZSgtLS1jdXJyZW50IHRpbWUtLS0pIl0nCi0KLQotICAgICAgICBKU09OLnBhcnNlKHRleHQsIHJldml2ZXIpCi0gICAgICAgICAgICBUaGlzIG1ldGhvZCBwYXJzZXMgYSBKU09OIHRleHQgdG8gcHJvZHVjZSBhbiBvYmplY3Qgb3IgYXJyYXkuCi0gICAgICAgICAgICBJdCBjYW4gdGhyb3cgYSBTeW50YXhFcnJvciBleGNlcHRpb24uCi0KLSAgICAgICAgICAgIFRoZSBvcHRpb25hbCByZXZpdmVyIHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGZpbHRlciBhbmQKLSAgICAgICAgICAgIHRyYW5zZm9ybSB0aGUgcmVzdWx0cy4gSXQgcmVjZWl2ZXMgZWFjaCBvZiB0aGUga2V5cyBhbmQgdmFsdWVzLAotICAgICAgICAgICAgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4KLSAgICAgICAgICAgIElmIGl0IHJldHVybnMgd2hhdCBpdCByZWNlaXZlZCwgdGhlbiB0aGUgc3RydWN0dXJlIGlzIG5vdCBtb2RpZmllZC4KLSAgICAgICAgICAgIElmIGl0IHJldHVybnMgdW5kZWZpbmVkIHRoZW4gdGhlIG1lbWJlciBpcyBkZWxldGVkLgotCi0gICAgICAgICAgICBFeGFtcGxlOgotCi0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgdGV4dC4gVmFsdWVzIHRoYXQgbG9vayBsaWtlIElTTyBkYXRlIHN0cmluZ3Mgd2lsbAotICAgICAgICAgICAgLy8gYmUgY29udmVydGVkIHRvIERhdGUgb2JqZWN0cy4KLQotICAgICAgICAgICAgbXlEYXRhID0gSlNPTi5wYXJzZSh0ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewotICAgICAgICAgICAgICAgIHZhciBhOwotICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGEgPQotL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KVQoXGR7Mn0pOihcZHsyfSk6KFxkezJ9KD86XC5cZCopPylaJC8uZXhlYyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoK2FbMV0sICthWzJdIC0gMSwgK2FbM10sICthWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICthWzVdLCArYVs2XSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBteURhdGEgPSBKU09OLnBhcnNlKCdbIkRhdGUoMDkvMDkvMjAwMSkiXScsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGQ7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKDAsIDUpID09PSAnRGF0ZSgnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgtMSkgPT09ICcpJykgewotICAgICAgICAgICAgICAgICAgICBkID0gbmV3IERhdGUodmFsdWUuc2xpY2UoNSwgLTEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0pOwotCi0KLSAgICBUaGlzIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiBZb3UgYXJlIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBvcgotICAgIHJlZGlzdHJpYnV0ZS4KLSovCi0KLS8qanNsaW50IGV2aWw6IHRydWUsIHN0cmljdDogZmFsc2UgKi8KLQotLyptZW1iZXJzICIiLCAiXGIiLCAiXHQiLCAiXG4iLCAiXGYiLCAiXHIiLCAiXCIiLCBKU09OLCAiXFwiLCBhcHBseSwKLSAgICBjYWxsLCBjaGFyQ29kZUF0LCBnZXRVVENEYXRlLCBnZXRVVENGdWxsWWVhciwgZ2V0VVRDSG91cnMsCi0gICAgZ2V0VVRDTWludXRlcywgZ2V0VVRDTW9udGgsIGdldFVUQ1NlY29uZHMsIGhhc093blByb3BlcnR5LCBqb2luLAotICAgIGxhc3RJbmRleCwgbGVuZ3RoLCBwYXJzZSwgcHJvdG90eXBlLCBwdXNoLCByZXBsYWNlLCBzbGljZSwgc3RyaW5naWZ5LAotICAgIHRlc3QsIHRvSlNPTiwgdG9TdHJpbmcsIHZhbHVlT2YKLSovCi0KLQotLy8gQ3JlYXRlIGEgSlNPTiBvYmplY3Qgb25seSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gV2UgY3JlYXRlIHRoZQotLy8gbWV0aG9kcyBpbiBhIGNsb3N1cmUgdG8gYXZvaWQgY3JlYXRpbmcgZ2xvYmFsIHZhcmlhYmxlcy4KLQotaWYgKCF0aGlzLkpTT04pIHsKLSAgICB0aGlzLkpTT04gPSB7fTsKLX0KLQotKGZ1bmN0aW9uICgpIHsKLQotICAgIGZ1bmN0aW9uIGYobikgewotICAgICAgICAvLyBGb3JtYXQgaW50ZWdlcnMgdG8gaGF2ZSBhdCBsZWFzdCB0d28gZGlnaXRzLgotICAgICAgICByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6IG47Ci0gICAgfQotCi0gICAgaWYgKHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0pTT04gIT09ICdmdW5jdGlvbicpIHsKLQotICAgICAgICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoa2V5KSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZSh0aGlzLnZhbHVlT2YoKSkgPwotICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VVRDRnVsbFllYXIoKSAgICsgJy0nICsKLSAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArCi0gICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENEYXRlKCkpICAgICAgKyAnVCcgKwotICAgICAgICAgICAgICAgICBmKHRoaXMuZ2V0VVRDSG91cnMoKSkgICAgICsgJzonICsKLSAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01pbnV0ZXMoKSkgICArICc6JyArCi0gICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENTZWNvbmRzKCkpICAgKyAnWicgOiBudWxsOwotICAgICAgICB9OwotCi0gICAgICAgIFN0cmluZy5wcm90b3R5cGUudG9KU09OID0KLSAgICAgICAgTnVtYmVyLnByb3RvdHlwZS50b0pTT04gPQotICAgICAgICBCb29sZWFuLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoa2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCk7Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgdmFyIGN4ID0gL1tcdTAwMDBcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZywKLSAgICAgICAgZXNjYXBhYmxlID0gL1tcXFwiXHgwMC1ceDFmXHg3Zi1ceDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csCi0gICAgICAgIGdhcCwKLSAgICAgICAgaW5kZW50LAotICAgICAgICBtZXRhID0geyAgICAvLyB0YWJsZSBvZiBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9ucwotICAgICAgICAgICAgJ1xiJzogJ1xcYicsCi0gICAgICAgICAgICAnXHQnOiAnXFx0JywKLSAgICAgICAgICAgICdcbic6ICdcXG4nLAotICAgICAgICAgICAgJ1xmJzogJ1xcZicsCi0gICAgICAgICAgICAnXHInOiAnXFxyJywKLSAgICAgICAgICAgICciJyA6ICdcXCInLAotICAgICAgICAgICAgJ1xcJzogJ1xcXFwnCi0gICAgICAgIH0sCi0gICAgICAgIHJlcDsKLQotCi0gICAgZnVuY3Rpb24gcXVvdGUoc3RyaW5nKSB7Ci0KLS8vIElmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gY29udHJvbCBjaGFyYWN0ZXJzLCBubyBxdW90ZSBjaGFyYWN0ZXJzLCBhbmQgbm8KLS8vIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLCB0aGVuIHdlIGNhbiBzYWZlbHkgc2xhcCBzb21lIHF1b3RlcyBhcm91bmQgaXQuCi0vLyBPdGhlcndpc2Ugd2UgbXVzdCBhbHNvIHJlcGxhY2UgdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXJzIHdpdGggc2FmZSBlc2NhcGUKLS8vIHNlcXVlbmNlcy4KLQotICAgICAgICBlc2NhcGFibGUubGFzdEluZGV4ID0gMDsKLSAgICAgICAgcmV0dXJuIGVzY2FwYWJsZS50ZXN0KHN0cmluZykgPwotICAgICAgICAgICAgJyInICsgc3RyaW5nLnJlcGxhY2UoZXNjYXBhYmxlLCBmdW5jdGlvbiAoYSkgewotICAgICAgICAgICAgICAgIHZhciBjID0gbWV0YVthXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6Ci0gICAgICAgICAgICAgICAgICAgICdcXHUnICsgKCcwMDAwJyArIGEuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsKLSAgICAgICAgICAgIH0pICsgJyInIDoKLSAgICAgICAgICAgICciJyArIHN0cmluZyArICciJzsKLSAgICB9Ci0KLQotICAgIGZ1bmN0aW9uIHN0cihrZXksIGhvbGRlcikgewotCi0vLyBQcm9kdWNlIGEgc3RyaW5nIGZyb20gaG9sZGVyW2tleV0uCi0KLSAgICAgICAgdmFyIGksICAgICAgICAgIC8vIFRoZSBsb29wIGNvdW50ZXIuCi0gICAgICAgICAgICBrLCAgICAgICAgICAvLyBUaGUgbWVtYmVyIGtleS4KLSAgICAgICAgICAgIHYsICAgICAgICAgIC8vIFRoZSBtZW1iZXIgdmFsdWUuCi0gICAgICAgICAgICBsZW5ndGgsCi0gICAgICAgICAgICBtaW5kID0gZ2FwLAotICAgICAgICAgICAgcGFydGlhbCwKLSAgICAgICAgICAgIHZhbHVlID0gaG9sZGVyW2tleV07Ci0KLS8vIElmIHRoZSB2YWx1ZSBoYXMgYSB0b0pTT04gbWV0aG9kLCBjYWxsIGl0IHRvIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLgotCi0gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmCi0gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgewotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oa2V5KTsKLSAgICAgICAgfQotCi0vLyBJZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGEgcmVwbGFjZXIgZnVuY3Rpb24sIHRoZW4gY2FsbCB0aGUgcmVwbGFjZXIgdG8KLS8vIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLgotCi0gICAgICAgIGlmICh0eXBlb2YgcmVwID09PSAnZnVuY3Rpb24nKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IHJlcC5jYWxsKGhvbGRlciwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotLy8gV2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBvbiB0aGUgdmFsdWUncyB0eXBlLgotCi0gICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7Ci0gICAgICAgIGNhc2UgJ3N0cmluZyc6Ci0gICAgICAgICAgICByZXR1cm4gcXVvdGUodmFsdWUpOwotCi0gICAgICAgIGNhc2UgJ251bWJlcic6Ci0KLS8vIEpTT04gbnVtYmVycyBtdXN0IGJlIGZpbml0ZS4gRW5jb2RlIG5vbi1maW5pdGUgbnVtYmVycyBhcyBudWxsLgotCi0gICAgICAgICAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6ICdudWxsJzsKLQotICAgICAgICBjYXNlICdib29sZWFuJzoKLSAgICAgICAgY2FzZSAnbnVsbCc6Ci0KLS8vIElmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW4gb3IgbnVsbCwgY29udmVydCBpdCB0byBhIHN0cmluZy4gTm90ZToKLS8vIHR5cGVvZiBudWxsIGRvZXMgbm90IHByb2R1Y2UgJ251bGwnLiBUaGUgY2FzZSBpcyBpbmNsdWRlZCBoZXJlIGluCi0vLyB0aGUgcmVtb3RlIGNoYW5jZSB0aGF0IHRoaXMgZ2V0cyBmaXhlZCBzb21lZGF5LgotCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsKLQotLy8gSWYgdGhlIHR5cGUgaXMgJ29iamVjdCcsIHdlIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aCBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgb3IKLS8vIG51bGwuCi0KLSAgICAgICAgY2FzZSAnb2JqZWN0JzoKLQotLy8gRHVlIHRvIGEgc3BlY2lmaWNhdGlvbiBibHVuZGVyIGluIEVDTUFTY3JpcHQsIHR5cGVvZiBudWxsIGlzICdvYmplY3QnLAotLy8gc28gd2F0Y2ggb3V0IGZvciB0aGF0IGNhc2UuCi0KLSAgICAgICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnOwotICAgICAgICAgICAgfQotCi0vLyBNYWtlIGFuIGFycmF5IHRvIGhvbGQgdGhlIHBhcnRpYWwgcmVzdWx0cyBvZiBzdHJpbmdpZnlpbmcgdGhpcyBvYmplY3QgdmFsdWUuCi0KLSAgICAgICAgICAgIGdhcCArPSBpbmRlbnQ7Ci0gICAgICAgICAgICBwYXJ0aWFsID0gW107Ci0KLS8vIElzIHRoZSB2YWx1ZSBhbiBhcnJheT8KLQotICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nKSB7Ci0KLS8vIFRoZSB2YWx1ZSBpcyBhbiBhcnJheS4gU3RyaW5naWZ5IGV2ZXJ5IGVsZW1lbnQuIFVzZSBudWxsIGFzIGEgcGxhY2Vob2xkZXIKLS8vIGZvciBub24tSlNPTiB2YWx1ZXMuCi0KLSAgICAgICAgICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxbaV0gPSBzdHIoaSwgdmFsdWUpIHx8ICdudWxsJzsKLSAgICAgICAgICAgICAgICB9Ci0KLS8vIEpvaW4gYWxsIG9mIHRoZSBlbGVtZW50cyB0b2dldGhlciwgc2VwYXJhdGVkIHdpdGggY29tbWFzLCBhbmQgd3JhcCB0aGVtIGluCi0vLyBicmFja2V0cy4KLQotICAgICAgICAgICAgICAgIHYgPSBwYXJ0aWFsLmxlbmd0aCA9PT0gMCA/ICdbXScgOgotICAgICAgICAgICAgICAgICAgICBnYXAgPyAnW1xuJyArIGdhcCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5qb2luKCcsXG4nICsgZ2FwKSArICdcbicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5kICsgJ10nIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snICsgcGFydGlhbC5qb2luKCcsJykgKyAnXSc7Ci0gICAgICAgICAgICAgICAgZ2FwID0gbWluZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgICAgIH0KLQotLy8gSWYgdGhlIHJlcGxhY2VyIGlzIGFuIGFycmF5LCB1c2UgaXQgdG8gc2VsZWN0IHRoZSBtZW1iZXJzIHRvIGJlIHN0cmluZ2lmaWVkLgotCi0gICAgICAgICAgICBpZiAocmVwICYmIHR5cGVvZiByZXAgPT09ICdvYmplY3QnKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gcmVwLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgayA9IHJlcFtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrID09PSAnc3RyaW5nJykgewotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHN0cihrLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWwucHVzaChxdW90ZShrKSArIChnYXAgPyAnOiAnIDogJzonKSArIHYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLQotLy8gT3RoZXJ3aXNlLCBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBrZXlzIGluIHRoZSBvYmplY3QuCi0KLSAgICAgICAgICAgICAgICBmb3IgKGsgaW4gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHN0cihrLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWwucHVzaChxdW90ZShrKSArIChnYXAgPyAnOiAnIDogJzonKSArIHYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0vLyBKb2luIGFsbCBvZiB0aGUgbWVtYmVyIHRleHRzIHRvZ2V0aGVyLCBzZXBhcmF0ZWQgd2l0aCBjb21tYXMsCi0vLyBhbmQgd3JhcCB0aGVtIGluIGJyYWNlcy4KLQotICAgICAgICAgICAgdiA9IHBhcnRpYWwubGVuZ3RoID09PSAwID8gJ3t9JyA6Ci0gICAgICAgICAgICAgICAgZ2FwID8gJ3tcbicgKyBnYXAgKyBwYXJ0aWFsLmpvaW4oJyxcbicgKyBnYXApICsgJ1xuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5kICsgJ30nIDogJ3snICsgcGFydGlhbC5qb2luKCcsJykgKyAnfSc7Ci0gICAgICAgICAgICBnYXAgPSBtaW5kOwotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8vIElmIHRoZSBKU09OIG9iamVjdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHN0cmluZ2lmeSBtZXRob2QsIGdpdmUgaXQgb25lLgotCi0gICAgaWYgKHR5cGVvZiBKU09OLnN0cmluZ2lmeSAhPT0gJ2Z1bmN0aW9uJykgewotICAgICAgICBKU09OLnN0cmluZ2lmeSA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlKSB7Ci0KLS8vIFRoZSBzdHJpbmdpZnkgbWV0aG9kIHRha2VzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHJlcGxhY2VyLCBhbmQgYW4gb3B0aW9uYWwKLS8vIHNwYWNlIHBhcmFtZXRlciwgYW5kIHJldHVybnMgYSBKU09OIHRleHQuIFRoZSByZXBsYWNlciBjYW4gYmUgYSBmdW5jdGlvbgotLy8gdGhhdCBjYW4gcmVwbGFjZSB2YWx1ZXMsIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCB3aWxsIHNlbGVjdCB0aGUga2V5cy4KLS8vIEEgZGVmYXVsdCByZXBsYWNlciBtZXRob2QgY2FuIGJlIHByb3ZpZGVkLiBVc2Ugb2YgdGhlIHNwYWNlIHBhcmFtZXRlciBjYW4KLS8vIHByb2R1Y2UgdGV4dCB0aGF0IGlzIG1vcmUgZWFzaWx5IHJlYWRhYmxlLgotCi0gICAgICAgICAgICB2YXIgaTsKLSAgICAgICAgICAgIGdhcCA9ICcnOwotICAgICAgICAgICAgaW5kZW50ID0gJyc7Ci0KLS8vIElmIHRoZSBzcGFjZSBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIG1ha2UgYW4gaW5kZW50IHN0cmluZyBjb250YWluaW5nIHRoYXQKLS8vIG1hbnkgc3BhY2VzLgotCi0gICAgICAgICAgICBpZiAodHlwZW9mIHNwYWNlID09PSAnbnVtYmVyJykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGFjZTsgaSArPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAnICc7Ci0gICAgICAgICAgICAgICAgfQotCi0vLyBJZiB0aGUgc3BhY2UgcGFyYW1ldGVyIGlzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGluZGVudCBzdHJpbmcuCi0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwYWNlID09PSAnc3RyaW5nJykgewotICAgICAgICAgICAgICAgIGluZGVudCA9IHNwYWNlOwotICAgICAgICAgICAgfQotCi0vLyBJZiB0aGVyZSBpcyBhIHJlcGxhY2VyLCBpdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gYXJyYXkuCi0vLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yLgotCi0gICAgICAgICAgICByZXAgPSByZXBsYWNlcjsKLSAgICAgICAgICAgIGlmIChyZXBsYWNlciAmJiB0eXBlb2YgcmVwbGFjZXIgIT09ICdmdW5jdGlvbicgJiYKLSAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiByZXBsYWNlciAhPT0gJ29iamVjdCcgfHwKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXBsYWNlci5sZW5ndGggIT09ICdudW1iZXInKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSlNPTi5zdHJpbmdpZnknKTsKLSAgICAgICAgICAgIH0KLQotLy8gTWFrZSBhIGZha2Ugcm9vdCBvYmplY3QgY29udGFpbmluZyBvdXIgdmFsdWUgdW5kZXIgdGhlIGtleSBvZiAnJy4KLS8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHN0cmluZ2lmeWluZyB0aGUgdmFsdWUuCi0KLSAgICAgICAgICAgIHJldHVybiBzdHIoJycsIHsnJzogdmFsdWV9KTsKLSAgICAgICAgfTsKLSAgICB9Ci0KLQotLy8gSWYgdGhlIEpTT04gb2JqZWN0IGRvZXMgbm90IHlldCBoYXZlIGEgcGFyc2UgbWV0aG9kLCBnaXZlIGl0IG9uZS4KLQotICAgIGlmICh0eXBlb2YgSlNPTi5wYXJzZSAhPT0gJ2Z1bmN0aW9uJykgewotICAgICAgICBKU09OLnBhcnNlID0gZnVuY3Rpb24gKHRleHQsIHJldml2ZXIpIHsKLQotLy8gVGhlIHBhcnNlIG1ldGhvZCB0YWtlcyBhIHRleHQgYW5kIGFuIG9wdGlvbmFsIHJldml2ZXIgZnVuY3Rpb24sIGFuZCByZXR1cm5zCi0vLyBhIEphdmFTY3JpcHQgdmFsdWUgaWYgdGhlIHRleHQgaXMgYSB2YWxpZCBKU09OIHRleHQuCi0KLSAgICAgICAgICAgIHZhciBqOwotCi0gICAgICAgICAgICBmdW5jdGlvbiB3YWxrKGhvbGRlciwga2V5KSB7Ci0KLS8vIFRoZSB3YWxrIG1ldGhvZCBpcyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmUgc28KLS8vIHRoYXQgbW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZS4KLQotICAgICAgICAgICAgICAgIHZhciBrLCB2LCB2YWx1ZSA9IGhvbGRlcltrZXldOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB3YWxrKHZhbHVlLCBrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2tdID0gdjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWVba107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXZpdmVyLmNhbGwoaG9sZGVyLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotCi0vLyBQYXJzaW5nIGhhcHBlbnMgaW4gZm91ciBzdGFnZXMuIEluIHRoZSBmaXJzdCBzdGFnZSwgd2UgcmVwbGFjZSBjZXJ0YWluCi0vLyBVbmljb2RlIGNoYXJhY3RlcnMgd2l0aCBlc2NhcGUgc2VxdWVuY2VzLiBKYXZhU2NyaXB0IGhhbmRsZXMgbWFueSBjaGFyYWN0ZXJzCi0vLyBpbmNvcnJlY3RseSwgZWl0aGVyIHNpbGVudGx5IGRlbGV0aW5nIHRoZW0sIG9yIHRyZWF0aW5nIHRoZW0gYXMgbGluZSBlbmRpbmdzLgotCi0gICAgICAgICAgICB0ZXh0ID0gU3RyaW5nKHRleHQpOwotICAgICAgICAgICAgY3gubGFzdEluZGV4ID0gMDsKLSAgICAgICAgICAgIGlmIChjeC50ZXN0KHRleHQpKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShjeCwgZnVuY3Rpb24gKGEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcXHUnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICgnMDAwMCcgKyBhLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0KLS8vIEluIHRoZSBzZWNvbmQgc3RhZ2UsIHdlIHJ1biB0aGUgdGV4dCBhZ2FpbnN0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBsb29rCi0vLyBmb3Igbm9uLUpTT04gcGF0dGVybnMuIFdlIGFyZSBlc3BlY2lhbGx5IGNvbmNlcm5lZCB3aXRoICcoKScgYW5kICduZXcnCi0vLyBiZWNhdXNlIHRoZXkgY2FuIGNhdXNlIGludm9jYXRpb24sIGFuZCAnPScgYmVjYXVzZSBpdCBjYW4gY2F1c2UgbXV0YXRpb24uCi0vLyBCdXQganVzdCB0byBiZSBzYWZlLCB3ZSB3YW50IHRvIHJlamVjdCBhbGwgdW5leHBlY3RlZCBmb3Jtcy4KLQotLy8gV2Ugc3BsaXQgdGhlIHNlY29uZCBzdGFnZSBpbnRvIDQgcmVnZXhwIG9wZXJhdGlvbnMgaW4gb3JkZXIgdG8gd29yayBhcm91bmQKLS8vIGNyaXBwbGluZyBpbmVmZmljaWVuY2llcyBpbiBJRSdzIGFuZCBTYWZhcmkncyByZWdleHAgZW5naW5lcy4gRmlyc3Qgd2UKLS8vIHJlcGxhY2UgdGhlIEpTT04gYmFja3NsYXNoIHBhaXJzIHdpdGggJ0AnIChhIG5vbi1KU09OIGNoYXJhY3RlcikuIFNlY29uZCwgd2UKLS8vIHJlcGxhY2UgYWxsIHNpbXBsZSB2YWx1ZSB0b2tlbnMgd2l0aCAnXScgY2hhcmFjdGVycy4gVGhpcmQsIHdlIGRlbGV0ZSBhbGwKLS8vIG9wZW4gYnJhY2tldHMgdGhhdCBmb2xsb3cgYSBjb2xvbiBvciBjb21tYSBvciB0aGF0IGJlZ2luIHRoZSB0ZXh0LiBGaW5hbGx5LAotLy8gd2UgbG9vayB0byBzZWUgdGhhdCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG9ubHkgd2hpdGVzcGFjZSBvciAnXScgb3IKLS8vICcsJyBvciAnOicgb3IgJ3snIG9yICd9Jy4gSWYgdGhhdCBpcyBzbywgdGhlbiB0aGUgdGV4dCBpcyBzYWZlIGZvciBldmFsLgotCi0gICAgICAgICAgICBpZiAoL15bXF0sOnt9XHNdKiQvLgotdGVzdCh0ZXh0LnJlcGxhY2UoL1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZywgJ0AnKS4KLXJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCAnXScpLgotcmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCAnJykpKSB7Ci0KLS8vIEluIHRoZSB0aGlyZCBzdGFnZSB3ZSB1c2UgdGhlIGV2YWwgZnVuY3Rpb24gdG8gY29tcGlsZSB0aGUgdGV4dCBpbnRvIGEKLS8vIEphdmFTY3JpcHQgc3RydWN0dXJlLiBUaGUgJ3snIG9wZXJhdG9yIGlzIHN1YmplY3QgdG8gYSBzeW50YWN0aWMgYW1iaWd1aXR5Ci0vLyBpbiBKYXZhU2NyaXB0OiBpdCBjYW4gYmVnaW4gYSBibG9jayBvciBhbiBvYmplY3QgbGl0ZXJhbC4gV2Ugd3JhcCB0aGUgdGV4dAotLy8gaW4gcGFyZW5zIHRvIGVsaW1pbmF0ZSB0aGUgYW1iaWd1aXR5LgotCi0gICAgICAgICAgICAgICAgaiA9IGV2YWwoJygnICsgdGV4dCArICcpJyk7Ci0KLS8vIEluIHRoZSBvcHRpb25hbCBmb3VydGggc3RhZ2UsIHdlIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIG5ldyBzdHJ1Y3R1cmUsIHBhc3NpbmcKLS8vIGVhY2ggbmFtZS92YWx1ZSBwYWlyIHRvIGEgcmV2aXZlciBmdW5jdGlvbiBmb3IgcG9zc2libGUgdHJhbnNmb3JtYXRpb24uCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicgPwotICAgICAgICAgICAgICAgICAgICB3YWxrKHsnJzogan0sICcnKSA6IGo7Ci0gICAgICAgICAgICB9Ci0KLS8vIElmIHRoZSB0ZXh0IGlzIG5vdCBKU09OIHBhcnNlYWJsZSwgdGhlbiBhIFN5bnRheEVycm9yIGlzIHRocm93bi4KLQotICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdKU09OLnBhcnNlJyk7Ci0gICAgICAgIH07Ci0gICAgfQotfSgpKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxN2U3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKyhmdW5jdGlvbigpIHsKKyAgJ3VzZSBzdHJpY3QnOworCisgIC8vIFJ1ZGltZW50YXJ5IHRlc3QgaGVscGVyIGZ1bmN0aW9ucworICAvLyBUT0RPOiBSZXR1cm4gZXJyb3IgY29kZSBiYXNlZCBvbiBraW5kIG9mIGVycm9ycyByYXRoZXIgdGhhbiB0aHJvdworICB2YXIgb2sgPSBmdW5jdGlvbih0LCBtc2cpIHsKKyAgICBpZiAoIXQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CisgICAgfQorICB9OworICB2YXIgZXF1YWwgPSBmdW5jdGlvbihhLCBiKSB7CisgICAgaWYgKGEgIT09IGIpIHsKKyAgICAgIGNvbnNvbGUubG9nKCcqKiogRkFJTEVEICoqKicpOworICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CisgICAgfQorICB9OworICB2YXIgdGVzdCA9IGZ1bmN0aW9uKG5hbWUsIGYpIHsKKyAgICBjb25zb2xlLmxvZygnVEVTVCA6ICcgKyBuYW1lKTsKKyAgICBmKCk7CisgICAgY29uc29sZS5sb2coJ09LXG4nKTsKKyAgfTsKKworICB2YXIgcGFyc2VBcmdzID0gZnVuY3Rpb24oYXJncykgeworICAgIHZhciBza2lwcyA9IFsKKyAgICAgICctLXRyYW5zcG9ydD1odHRwJywKKyAgICAgICctLXByb3RvY29sPWpzb24nCisgICAgXTsKKyAgICB2YXIgb3B0cyA9IHsKKyAgICAgIHBvcnQ6ICc5MDkwJworICAgICAgLy8gcHJvdG9jb2w6ICdqc29uJywKKyAgICB9OworICAgIHZhciBrZXlzID0ge307CisgICAgZm9yICh2YXIga2V5IGluIG9wdHMpIHsKKyAgICAgIGtleXNbJy0tJyArIGtleSArICc9J10gPSBrZXk7CisgICAgfQorICAgIGZvciAodmFyIGkgaW4gYXJncykgeworICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07CisgICAgICBpZiAoc2tpcHMuaW5kZXhPZihhcmcpICE9IC0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIGhpdCA9IGZhbHNlOworICAgICAgZm9yICh2YXIgayBpbiBrZXlzKSB7CisgICAgICAgIGlmIChhcmcuc2xpY2UoMCwgay5sZW5ndGgpID09PSBrKSB7CisgICAgICAgICAgb3B0c1trZXlzW2tdXSA9IGFyZy5zbGljZShrLmxlbmd0aCk7CisgICAgICAgICAgaGl0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFoaXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3B0cy5wb3J0ID0gcGFyc2VJbnQob3B0cy5wb3J0LCAxMCk7CisgICAgaWYgKCFvcHRzLnBvcnQgfHwgb3B0cy5wb3J0IDwgMSB8fCBvcHRzLnBvcnQgPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBvcnQgbnVtYmVyJyk7CisgICAgfQorICAgIHJldHVybiBvcHRzOworICB9OworCisgIHZhciBleGVjdXRlID0gZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coJyMjIyBBcGFjaGUgVGhyaWZ0IEphdmFzY3JpcHQgc3RhbmRhbG9uZSB0ZXN0IGNsaWVudCcpOworICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKKworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygnc3JjL3RocmlmdC5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcycpOworICAgIHBoYW50b20ucGFnZS5pbmplY3RKcygndGVzdC9nZW4tanMvVGhyaWZ0VGVzdC5qcycpOworCisgICAgdmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworICAgIHZhciBvcHRzID0gcGFyc2VBcmdzKHN5c3RlbS5hcmdzLnNsaWNlKDEpKTsKKyAgICB2YXIgcG9ydCA9IG9wdHMucG9ydDsKKyAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIHBvcnQgKyAnL3NlcnZpY2UnKTsKKyAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgZHVwbGljYXRlIGNvZGUgd2l0aCB0ZXN0LmpzLgorICAgIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKyAgICB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgeworICAgICAgICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RWb2lkKCksIHVuZGVmaW5lZCk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYmluYXJ5ID0gJyc7CisgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgIH0KKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgICAgfSk7CisgICAgdGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJpbmFyeSA9ICcnOworICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICB9CisgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgICBhcnJbaV0gPSBiaW5hcnlbaV0uY2hhckNvZGVBdCgpOworICAgICAgfQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICB0ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgICAgICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdEb3VibGUnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCb29sJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2wodHJ1ZSksIHRydWUpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpOworICAgIH0pOworICAgIHRlc3QoJ0k4JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJMzInLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CisgICAgfSk7CisgICAgdGVzdCgnSTY0JywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSksIC1NYXRoLnBvdygyLCA1MikpOworICAgIH0pOworCisgICAgdGVzdCgnU3RydWN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKworICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIH0pOworCisgICAgdGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworCisgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgICAgfTsKKworICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1NldCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdMaXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdFbnVtJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgIH0pOworCisgICAgdGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICAgIH0pOworCisgICAgdGVzdCgnU2tpcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgdmFyIG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgICAgdmFyIHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CisKKyAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgICAvLyByZWFkIFh0cnVjdCBkYXRhIHdpdGggWHRydWN0MworICAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICB4dHJ1Y3QzLnJlYWQoaW5wdXQpOworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgLy8gcmVhZCBUaHJpZnQuVHlwZS5TVE9QIG1lc3NhZ2UKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisKKyAgICAgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgIHJldHVybiB4dHJ1Y3QzOworICAgICAgfTsKKworICAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICAgIH07CisKKyAgICAgIHZhciBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgICBlcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBlcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJyk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgICAgIG9rKGZhbHNlKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgb2sob2spOworICAgICAgfQorICAgIH0pOworCisgICAgdmFyIGNyYXp5ID0geworICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgfV0KKyAgICB9OworICAgIHRlc3QoJ0luc2FuaXR5JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgaW5zYW5pdHkgPSB7CisgICAgICAgICcxJzogeworICAgICAgICAgICcyJzogY3JhenksCisgICAgICAgICAgJzMnOiBjcmF6eQorICAgICAgICB9LAorICAgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgICAgfTsKKyAgICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkocmVzLCBpbnNhbml0eSk7CisgICAgfSk7CisKKyAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisgICAgY29uc29sZS5sb2coJyMjIyBBbGwgdGVzdHMgc3VjY2VlZGVkLicpOworICAgIHJldHVybiAwOworICB9OworCisgIHRyeSB7CisgICAgdmFyIHJldCA9IGV4ZWN1dGUoKTsKKyAgICBwaGFudG9tLmV4aXQocmV0KTsKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgLy8gQ2F0Y2ggYWxsIGFuZCBleGl0IHRvIGF2b2lkIGhhbmcuCisgICAgY29uc29sZS5lcnJvcihlcnIpOworICAgIHBoYW50b20uZXhpdCgxKTsKKyAgfQorfSkoKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcyBiL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMWQ3YTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCkBAIC0wLDAgKzEsOTEgQEAKKy8qanNoaW50IGV2aWw6dHJ1ZSovCisKKy8qIFRoaXMgZmlsZSBpcyBvbmx5IHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUuCisgKgorICogT3JpZ2luOiAgaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9ibG9iL21hc3Rlci9leGFtcGxlcy9ydW4tcXVuaXQuanMKKyAqIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5CU0QKKyAqCisgKiBJbmNsdXNpb24gaW50byBBcGFjaGUgcHJvZHVjdHMgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xlZ2FsLzNwYXJ0eS5odG1sCisgKi8KKwordmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworCisKKy8qKgorICogV2FpdCB1bnRpbCB0aGUgdGVzdCBjb25kaXRpb24gaXMgdHJ1ZSBvciBhIHRpbWVvdXQgb2NjdXJzLiBVc2VmdWwgZm9yIHdhaXRpbmcKKyAqIG9uIGEgc2VydmVyIHJlc3BvbnNlIG9yIGZvciBhIHVpIGNoYW5nZSAoZmFkZUluLCBldGMuKSB0byBvY2N1ci4KKyAqCisgKiBAcGFyYW0gdGVzdEZ4IGphdmFzY3JpcHQgY29uZGl0aW9uIHRoYXQgZXZhbHVhdGVzIHRvIGEgYm9vbGVhbiwKKyAqIGl0IGNhbiBiZSBwYXNzZWQgaW4gYXMgYSBzdHJpbmcgKGUuZy46ICIxID09IDEiIG9yICIkKCcjYmFyJykuaXMoJzp2aXNpYmxlJykiIG9yCisgKiBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogQHBhcmFtIG9uUmVhZHkgd2hhdCB0byBkbyB3aGVuIHRlc3RGeCBjb25kaXRpb24gaXMgZnVsZmlsbGVkLAorICogaXQgY2FuIGJlIHBhc3NlZCBpbiBhcyBhIHN0cmluZyAoZS5nLjogIjEgPT0gMSIgb3IgIiQoJyNiYXInKS5pcygnOnZpc2libGUnKSIgb3IKKyAqIGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24uCisgKiBAcGFyYW0gdGltZU91dE1pbGxpcyB0aGUgbWF4IGFtb3VudCBvZiB0aW1lIHRvIHdhaXQuIElmIG5vdCBzcGVjaWZpZWQsIDMgc2VjIGlzIHVzZWQuCisgKi8KK2Z1bmN0aW9uIHdhaXRGb3IodGVzdEZ4LCBvblJlYWR5LCB0aW1lT3V0TWlsbGlzKSB7CisgICAgdmFyIG1heHRpbWVPdXRNaWxsaXMgPSB0aW1lT3V0TWlsbGlzID8gdGltZU91dE1pbGxpcyA6IDMwMDEsIC8vPCBEZWZhdWx0IE1heCBUaW1vdXQgaXMgM3MKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKKyAgICAgICAgY29uZGl0aW9uID0gZmFsc2UsCisgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQgPCBtYXh0aW1lT3V0TWlsbGlzKSAmJiAhY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbm90IHRpbWUtb3V0IHlldCBhbmQgY29uZGl0aW9uIG5vdCB5ZXQgZnVsZmlsbGVkCisgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gKHR5cGVvZih0ZXN0RngpID09PSAnc3RyaW5nJyA/IGV2YWwodGVzdEZ4KSA6IHRlc3RGeCgpKTsgLy88IGRlZmVuc2l2ZSBjb2RlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGNvbmRpdGlvbiBzdGlsbCBub3QgZnVsZmlsbGVkICh0aW1lb3V0IGJ1dCBjb25kaXRpb24gaXMgJ2ZhbHNlJykKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIHRpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcGhhbnRvbS5leGl0KDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbiBmdWxmaWxsZWQgKHRpbWVvdXQgYW5kL29yIGNvbmRpdGlvbiBpcyAndHJ1ZScpCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgJ21zLicpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChvblJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHkoKTsgLy88IERvIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyBvbmNlIHRoZSBjb25kaXRpb24gaXMgZnVsZmlsbGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IC8vPCBTdG9wIHRoaXMgaW50ZXJ2YWwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIDEwMCk7IC8vPCByZXBlYXQgY2hlY2sgZXZlcnkgMjUwbXMKK30KKworCitpZiAoc3lzdGVtLmFyZ3MubGVuZ3RoID09PSAxIHx8IHN5c3RlbS5hcmdzLmxlbmd0aCA+IDMpIHsKKyAgICBjb25zb2xlLmxvZygnVXNhZ2U6IHBoYW50b21qcyBwaGFudG9tanMtcXVuaXQuanMgVVJMJyk7CisgICAgcGhhbnRvbS5leGl0KDEpOworfQorCit2YXIgcGFnZSA9IG5ldyBXZWJQYWdlKCk7CisKKy8vIFJvdXRlICJjb25zb2xlLmxvZygpIiBjYWxscyBmcm9tIHdpdGhpbiB0aGUgUGFnZSBjb250ZXh0IHRvIHRoZSBtYWluIFBoYW50b20gY29udGV4dCAoaS5lLiBjdXJyZW50ICJ0aGlzIikKK3BhZ2Uub25Db25zb2xlTWVzc2FnZSA9IGZ1bmN0aW9uKG1zZykgeworICAgIGNvbnNvbGUubG9nKG1zZyk7Cit9OworCitwYWdlLm9wZW4oc3lzdGVtLmFyZ3NbMV0sIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgeworICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrJyk7CisgICAgICAgIHBoYW50b20uZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKKyAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWwuaW5uZXJUZXh0Lm1hdGNoKCdjb21wbGV0ZWQnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0sIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGZhaWxlZE51bSA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKKyAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlbC5pbm5lclRleHQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmYWlsZWQnKVswXS5pbm5lckhUTUw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwaGFudG9tLmV4aXQoKHBhcnNlSW50KGZhaWxlZE51bSwgMTApID4gMCkgPyAxIDogMCk7CisgICAgICAgIH0pOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgwYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAgVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZSB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKKy8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKKy8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKKy8vICByZXNwZWN0aXZlbHkpLgorLy8KKy8vICBVc2luZyB0aGUgY29tbWFuZCBmbGFnIC0tZXM2LCB0aGlzIHNlcnZlciBjYW4gYmUgcnVuIHVzaW5nIG5vZGVqcyBjb2RlIGJ1aWx0CisvLyAgZm9yIHRoZSBlczYgZW52aXJvbm1lbnQgb3IgZm9yIHByZS1lczYgZW52aXJvbm1lbnQuCisvLworCitjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKKworY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKKwl0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisJcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorCXByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKKwloYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgorfTsKKworY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogX19kaXJuYW1lLAorCXNlcnZpY2VzOiB7CisJCScvc2VydmljZSc6IFRocmlmdFRlc3RTdmNPcHQKKwl9Cit9OworCitjb25zdCBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOworY29uc3QgcG9ydCA9IGVzNk1vZGUgPyA4MDg4IDogODA4OTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZyhgU2VydmluZyBmaWxlcyBmcm9tOiAke19fZGlybmFtZX1gKTsKK2NvbnNvbGUubG9nKGBIdHRwL1RocmlmdCBTZXJ2ZXIgKEVTNiBtb2RlICR7ZXM2TW9kZX0pIHJ1bm5pbmcgb24gcG9ydDogJHtwb3J0fWApOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTcxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmVyIHRoZSB0ZXN0Lmh0bWwgYnJvd3NlcgorLy8gIGJhc2VkIEphdmFTY3JpcHQgdGVzdCBwYWdlICh3aGljaCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuCisvLyAgVGhpcyBzZXJ2ZXIgYWxzbyBzdXBwbGllcyB0aGUgVGhyaWZ0IGJhc2VkIHRlc3Qgc2VydmljZSwgd2hpY2ggZGVwZW5kcworLy8gIG9uIHRoZSBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBJREwgc2VydmljZSAod2hpY2ggbXVzdCBiZSBjb21waWxlZAorLy8gIGZvciBOb2RlIGFuZCBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQgaW4gLi9nZW4tbm9kZWpzIGFuZCAuL2dlbi1qcworLy8gIHJlc3BlY3RpdmVseSkuIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBtdXN0IGFsc28gaW5jbHVkZSB0aGUgYnJvd3NlcgorLy8gIHN1cHBvcnQgbGlicmFyaWVzIGZvciB0ZXN0Lmh0bWwgKGpxdWVyeS5qcywgcXVuaXQuanMgYW5kIHF1bml0LmNzcworLy8gIGluIC4vYnVpbGQvanMvbGliKS4KKworY29uc3QgZnMgPSByZXF1aXJlKCdmcycpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0LmpzYCk7Citjb25zdCBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7CisKKy8vU2V0dXAgdGhlIEkvTyBzdGFjayBvcHRpb25zIGZvciB0aGUgVGhyaWZ0VGVzdCBzZXJ2aWNlCitjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0geworICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAgcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAorICBoYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgorfTsKKworY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKyAgZmlsZXM6IF9fZGlybmFtZSwKKyAgdGxzOiB7CisgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKCcuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleScpLAorICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0JykKKyAgfSwKKyAgc2VydmljZXM6IHsKKyAgICAnL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CisgIH0KK307CisKK2NvbnN0IHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyk7Citjb25zdCBwb3J0ID0gZXM2TW9kZSA/IDgwOTAgOiA4MDkxOworc2VydmVyLmxpc3Rlbihwb3J0KTsKK2NvbnNvbGUubG9nKGBTZXJ2aW5nIGZpbGVzIGZyb206ICR7X19kaXJuYW1lfWApOworY29uc29sZS5sb2coYEh0dHAvVGhyaWZ0IFNlcnZlciAoRVM2IG1vZGUgJHtlczZNb2RlfSkgcnVubmluZyBvbiBwb3J0OiAke3BvcnR9YCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhIGIvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YQppbmRleCBlM2FhZDdkLi5lNGZjMGNjIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhCisrKyBiL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEKQEAgLTcyLDYgKzcyLDEyIEBACiBpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2UuVGVzdEhhbmRsZXI7CiAKK2ltcG9ydCBldS5tZWRzZWEubWltZXV0aWwuZGV0ZWN0b3IuRXh0ZW5zaW9uTWltZURldGVjdG9yOworaW1wb3J0IGV1Lm1lZHNlYS5taW1ldXRpbC5NaW1lVXRpbDI7CitpbXBvcnQgZXUubWVkc2VhLm1pbWV1dGlsLk1pbWVUeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKwogLyoqCiAgKiBCYXNpYywgeWV0IGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHNwZWMgY29tcGxpYW50LCBIVFRQLzEuMSBmaWxlIHNlcnZlci4KICAqIDxwPgpAQCAtMTMxLDggKzEzNywxMiBAQAogICAgICAgICAgICAgICAgIGJvZHkuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOwogICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYodGFyZ2V0LmluZGV4T2YoIj8iKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc3Vic3RyaW5nKDEsIHRhcmdldC5pbmRleE9mKCI/IikpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZG9jUm9vdCwgVVJMRGVjb2Rlci5kZWNvZGUodGFyZ2V0KSk7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5kb2NSb290LCBVUkxEZWNvZGVyLmRlY29kZSh0YXJnZXQsICJVVEYtOCIpKTsKKwogICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewogCiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQpOwpAQCAtMTczLDggKzE4MywyMiBAQAogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKIAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgICAgICAgICAgICAgICAgICAgTWltZVV0aWwyIG1pbWVVdGlsID0gbmV3IE1pbWVVdGlsMigpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVVdGlsLnJlZ2lzdGVyTWltZURldGVjdG9yKEV4dGVuc2lvbk1pbWVEZXRlY3Rvci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248TWltZVR5cGU+IGNvbGxlY3Rpb24gPSBtaW1lVXRpbC5nZXRNaW1lVHlwZXMoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1pbWVUeXBlPiBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZSBtdCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gIG10LmdldE1lZGlhVHlwZSgpICsgIi8iICsgbXQuZ2V0U3ViVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgICAgICBGaWxlRW50aXR5IGJvZHkgPSBuZXcgRmlsZUVudGl0eShmaWxlLCAidGV4dC9odG1sIik7CisgICAgICAgICAgICAgICAgICAgIEZpbGVFbnRpdHkgYm9keSA9IG5ldyBGaWxlRW50aXR5KGZpbGUsIG1pbWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCBtaW1lVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eShib2R5KTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aW5nIGZpbGUgIiArIGZpbGUuZ2V0UGF0aCgpKTsKIApkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcyBiL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2YjEzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuCisgKiBUaGVzZSB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gZXhlcmNpc2UgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQKKyAqICh3aGljaCBpcyBleGNsdXNpdmVseSBhc3luYykuCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAorICovCisKKworCisvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Citjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsZXQga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0Vm9pZChmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAnJyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHN0cmluZ1Rlc3QpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIGNvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgtMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLTEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgzLjE0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA2MCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICBjbGllbnQudGVzdEJ5dGUoMCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJMzIoMCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDMwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKKworCitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDUpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDcpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICBjb25zdCBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CisgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CisKKyAgICBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICB9OworCisgICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgc2V0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0VHlwZWRlZig2OSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCA2OSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOworCisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMTYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgIH07CisKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgZm9yIChsZXQga2V5MiBpbiByZXN1bHRba2V5XSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzdWx0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOworCisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0Lm9rKCFlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKKworICBRVW5pdC50ZXN0KCd0ZXN0SW5zYW5pdHknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDI0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0sCisgICAgICAgICczJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgJzInOiB7ICc2JzogeyAndXNlck1hcCc6IG51bGwsICd4dHJ1Y3RzJzogbnVsbCB9IH0KKyAgICB9OworICAgIGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoKSwgZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnT25ld2F5Jyk7CisKKyAgUVVuaXQudGVzdCgndGVzdE9uZXdheScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0T25ld2F5KDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmYzBkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbApAQCAtMCwwICsxLDQ5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPCEtLSBqUXVlcnkgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImRlZXAtY29uc3RydWN0b3IudGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogRGVlcCBDb25zdHJ1Y3RvciBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQiPkpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQzMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwKQEAgLTAsMCArMSw1NSBAQAorKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgICAgIDx0aXRsZT5SZW5kZXJpbmcgRG91YmxlIENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC90aXRsZT4KKworICAgICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPCEtLSBkb3VibGUgY29uc3RhbnRzIHRvIGNoZWNrIC0tPgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9Eb3VibGVDb25zdGFudHNUZXN0X3R5cGVzLmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgICAgICA8IS0tIGpRdWVyeSAtLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICAgICAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgICAgICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICA8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlJlbmRlcmluZyBEb3VibGUgQ29uc3RhbnRzIGluIEpTOiBVbml0IFRlc3Q8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzkwYzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIGRvdWJsZSBjb25zdGFudHMgaW5zaWRlCisgKiBEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMgd2lsbCBydW4gYWdhaW5zdCBOb3JtYWwgKC1nZW4ganMpCisgKiBBcGFjaGUgVGhyaWZ0IGludGVyZmFjZXMuCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdAorICovCisKKy8vIGRvdWJsZSBhc3NlcnRpb24gdGhyZXNob2xkCitjb25zdCBFUFNJTE9OID0gMC4wMDAwMDAxOworCisvLyBXb3JrIGFyb3VuZCBmb3Igb2xkIEFQSSB1c2VkIGJ5IFFVbml0QWRhcHRlciBvZiBqc1Rlc3REcml2ZXIKK2lmICh0eXBlb2YgUVVuaXQubG9nID09ICdmdW5jdGlvbicpIHsKKyAgLy8gV2hlbiB1c2luZyByZWFsIFFVbml0IChmcm9uIFBoYW50b21KUykgbG9nIGZhaWx1cmVzIHRvIGNvbnNvbGUKKyAgUVVuaXQubG9nKGZ1bmN0aW9uKGRldGFpbHMpIHsKKyAgICBpZiAoIWRldGFpbHMucmVzdWx0KSB7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT0gRkFJTCA9PT09PT09PScpOworICAgICAgY29uc29sZS5sb2coJ1Rlc3ROYW1lOiAnICsgZGV0YWlscy5uYW1lKTsKKyAgICAgIGlmIChkZXRhaWxzLm1lc3NhZ2UpIGNvbnNvbGUubG9nKGRldGFpbHMubWVzc2FnZSk7CisgICAgICBjb25zb2xlLmxvZygnRXhwZWN0ZWQ6ICcgKyBkZXRhaWxzLmV4cGVjdGVkKTsKKyAgICAgIGNvbnNvbGUubG9nKCdBY3R1YWwgIDogJyArIGRldGFpbHMuYWN0dWFsKTsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgfQorICB9KTsKK30KKworUVVuaXQubW9kdWxlKCdEb3VibGUgcmVuZGVyaW5nJyk7CisKKyAgUVVuaXQudGVzdCgnRG91YmxlIChyZW5kZXJpbmcpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc29sZS5sb2coJ0RvdWJsZSByZW5kZXJpbmcgdGVzdCAtLSBzdGFydHMnKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMDsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwODsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicyhFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UIC0gRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfTElTVCA9CisgICAgICAgIFsxLC0xMDAsMTAwLDkyMjMzNzIwMzY4NTQ3NzU4MDcsLTkyMjMzNzIwMzY4NTQ3NzU4MDcsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsCisgICAgICAgICAgICA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXTsKKyAgICBhc3NlcnQuZXF1YWwoRE9VQkxFX0xJU1RfVEVTVC5sZW5ndGgsIEVYUEVDVEVEX0RPVUJMRV9MSVNULmxlbmd0aCk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICBhc3NlcnQub2soTWF0aC5hYnMoRVhQRUNURURfRE9VQkxFX0xJU1RbaV0gLSBET1VCTEVfTElTVF9URVNUW2ldKSA8PSBFUFNJTE9OKTsKKyAgICB9CisgICAgY29uc29sZS5sb2coJ0RvdWJsZSByZW5kZXJpbmcgdGVzdCAtLSBlbmRzJyk7CisgIH0pOworCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWVzNi5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA0OTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbApAQCAtMCwwICsxLDYyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtZXM2L1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWVzNi9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0PgorICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCisgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KHdzX3VyaSk7CisgICAgY29uc3QgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWVzNi5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWVzNi5qcyBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NTE3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5qcwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KKyAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAorICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzOmVzNiBUaHJpZnRUZXN0LnRocmlmdAorICovCisKKworCisvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04CisKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxLCBtYXAyKSB7CisgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitRVW5pdC5tb2R1bGUoJ0Jhc2UgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFZvaWQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoJycpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgJycpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHN0cmluZ1Rlc3QpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoNCk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoLTEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLTEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgzLjE0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNjApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpCisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICBjbGllbnQudGVzdEJ5dGUoMCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMHgwMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJMzIoMCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDMwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJNjQoMCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCA1MikpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdTdHJ1Y3R1cmVkIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnU3RydWN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDUpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOworICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdNYXAnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CisKKyAgICBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgIH07CisKKyAgICBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgc2V0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBsaXN0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RUeXBlZGVmKDY5KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgNjkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ2RlZXBlciEnKTsKKworICBRVW5pdC50ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMTYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICB9OworCisgICAgY2xpZW50LnRlc3RNYXBNYXAoMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgZm9yICh2YXIga2V5MiBpbiByZXN1bHRba2V5XSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzdWx0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOworCisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKS50aGVuKGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9KS5jYXRjaChmdW5jdGlvbihlKSB7CisKKyAgICAgIGNvbnNvbGUubG9nKGBFeGNlcHRpb24gZXhjZXB0aW9uIGVgKTsKKyAgICAgIGNvbnNvbGUubG9nKGUpOworICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZSwgbnVsbCwgMikpOworCisgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicpLnRoZW4oZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0Lm9rKCFlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKKworICBRVW5pdC50ZXN0KCd0ZXN0SW5zYW5pdHknLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMjQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0sCisgICAgICAgICczJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgJzInOiB7ICc2JzogeyAndXNlck1hcCc6IG51bGwsICd4dHJ1Y3RzJzogbnVsbCB9IH0KKyAgICB9OworICAgIGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoKSkudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdPbmV3YXknKTsKKyAgUVVuaXQudGVzdCgndGVzdE9uZXdheScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RPbmV3YXkoMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcyBiL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyYmI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMKQEAgLTAsMCArMSwxNTkgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzCisgKiB3aWxsIHJ1biBvbmx5IHdpdGggalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkgQXBhY2hlIFRocmlmdAorICogaW50ZXJmYWNlcy4gVG8gY3JlYXRlIGNsaWVudCBjb2RlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzOmpxdWVyeSBUaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIFNlZSBhbHNvOgorICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cworICogKysgdGVzdC1ub2pxLmpzIGZvciAiLWdlbiBqcyIgb25seSB0ZXN0cworICovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9qUXVlcnkgYXN5bmNocm9ub3VzIHRlc3RzCitqUXVlcnkuYWpheFNldHVwKHsgdGltZW91dDogMCB9KTsKKworUVVuaXQubW9kdWxlKCdqUSBBc3luYyBNYW51YWwnKTsKKworICBRVW5pdC50ZXN0KCd0ZXN0STMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworCisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICAgIGNvbnN0IGpxeGhyID0galF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwgMzEpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IGFzc2VydC5vayhmYWxzZSk7IH0sCisgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfQorICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCd0ZXN0STY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworCisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICAgIGpRdWVyeS5hamF4KHsKKyAgICAgIHVybDogJy9zZXJ2aWNlJywKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSksCisgICAgICB0eXBlOiAnUE9TVCcsCisgICAgICBjYWNoZTogZmFsc2UsCisgICAgICBkYXRhVHlwZTogJ3RleHQnLAorICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7CisgICAgICAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHJlcyk7CisgICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0sCisgICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IGFzc2VydC5vayhmYWxzZSk7IH0sCisgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfQorICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jJyk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgY29uc3QganF4aHIgPSBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAganF4aHIuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDQpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KQorICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeyBhc3NlcnQub2soZmFsc2UsIGUubWVzc2FnZSk7IH0pCisgICAgLnN1Y2Nlc3MoZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KQorICAgIC5jb21wbGV0ZShmdW5jdGlvbigpIHsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKworICAgIGNvbnN0IGRmZCA9IGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KQorICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgICAgJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgZG9uZSgpOyB9ICk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg0MjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwKQEAgLTAsMCArMSw1MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3Qtbm9qcS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjgwMWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzCisgKiB3aWxsIHJ1biBvbmx5IHdpdGggbm9ybWFsICItZ2VuIGpzIiBBcGFjaGUgVGhyaWZ0IGludGVyZmFjZXMuCisgKiBUbyBjcmVhdGUgY2xpZW50IGNvZGU6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBTZWUgYWxzbzoKKyAqICsrIHRlc3QuanMgZm9yIGdlbmVyaWMgdGVzdHMKKyAqICsrIHRlc3QtanEuanMgZm9yICItZ2VuIGpzOmpxdWVyeSIgb25seSB0ZXN0cworICovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9Bc3luYyBleGNlcHRpb24gdGVzdHMKKworUVVuaXQubW9kdWxlKCdOb2pRIEFzeW5jJyk7CisKK1FVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhNjlkY2RhLi44YjY3MDE0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKQEAgLTIyLDI3MiArMjIsMzMgQEAKICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KIAotICA8c2NyaXB0IHNyYz0iL3RocmlmdC5qcyIgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCiAgIDwhLS0galF1ZXJ5IC0tPgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNC4yL2pxdWVyeS5taW4uanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgCi0gIDwhLS0ganNvbjIgIC0tPgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqc29uMi5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAKICAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vZ2l0aHViLmNvbS9qcXVlcnkvcXVuaXQvcmF3L21hc3Rlci9xdW5pdC9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9xdW5pdC9yYXcvbWFzdGVyL3F1bml0L3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgogCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+Ci0gIC8vPCFbQ0RBVEFbCi0gICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7Ci0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpCi0gICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KQotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQotCi0KLSAgICBtb2R1bGUoIkJhc2UgVHlwZXMiKTsKLSAgICAKLSAgICB0ZXN0KCJWb2lkIiwgZnVuY3Rpb24oKSB7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3RWb2lkKCksIHVuZGVmaW5lZCk7Ci0gICAgfSk7Ci0gICAgdGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Ci0gICAgICB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7Ci0KLSAgICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKwotICAgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCi0gICAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKLSAgICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCi0gICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOwotICAgICAgZXF1YWxzKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSxzcGVjaWFsQ2hhcmFjdGVycyk7Ci0gICAgfSk7Ci0gICAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgICBlcXVhbHMoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOwotICAgIH0pOwotICAgIHRlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOwotICAgIH0pOwotICAgIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgICAgZXF1YWxzKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApKSwgTWF0aC5wb3coMiwzMCkpOwotICAgICAgCi0gICAgICAvKgotICAgICAgICBob3cgdG8gdGVzdCB0aGluZ3MgbGlrZSB0aGF0PwotICAgICAgICBlcXVhbHMoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiw2MCkpLCBNYXRoLnBvdygyLDYwKSk7Ci0gICAgICAqLwotICAgIH0pOwotICAgIHRlc3QoIkk2NCIsIGZ1bmN0aW9uKCkgewotICAgICAgZXF1YWxzKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNjApKSwgTWF0aC5wb3coMiw2MCkpOwotICAgIH0pOwotCi0KLSAgICBtb2R1bGUoIlN0cnVjdHVyZWQgVHlwZXMiKTsKLQotICAgIHRlc3QoIlN0cnVjdCIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpCi0gICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCcKLSAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMQotICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApCi0gICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw2MCkKLQotICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOwotCi0gICAgICBlcXVhbHMoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOwotICAgICAgZXF1YWxzKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgICAgZXF1YWxzKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICAgIGVxdWFscyhzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7Ci0gICAgICAKLSAgICAgIGVxdWFscyhKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSkKLSAgICB9KTsKLSAgICAKLSAgICB0ZXN0KCJOZXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCkKLSAgICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJwotICAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxCi0gICAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwzMCkKLSAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDYwKQotICAgICAgCi0gICAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKQotICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMgotICAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQKLSAgICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwxNSkKLSAgICAgIAotICAgICAgdmFyIG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOwotICAgICAgCi0gICAgICBlcXVhbHMobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFscyhuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOwotICAgICAgZXF1YWxzKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFscyhuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOwotICAgICAgZXF1YWxzKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7Ci0gICAgICBlcXVhbHMobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgICAKLSAgICAgIGVxdWFscyhKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKQotICAgIH0pOwotICAgIAotICAgIHRlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3Ojc3LCA4Ojg4LCA5Ojk5fTsKLQotICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpCi0gICAgICAKLSAgICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICAgIGVxdWFscyhtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKLSAgICAgIH0KLQotICAgICAgZXF1YWxzKEpTT04uc3RyaW5naWZ5KG1hcFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShtYXBUZXN0SW5wdXQpKQotICAgIH0pOwotICAgIAotICAgIHRlc3QoIlNldCIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHNldFRlc3RJbnB1dCA9IG5ldyBBcnJheSgxLDIsMykKLSAgICAgIG9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7Ci0gICAgfSk7Ci0gICAgCi0gICAgdGVzdCgiTGlzdCIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBuZXcgQXJyYXkoMSwyLDMpCi0gICAgICBvayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOwotICAgIH0pOwotICAgIAotICAgIHRlc3QoIkVudW0iLCBmdW5jdGlvbigpIHsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwotICAgIH0pOwotICAgIAotICAgIHRlc3QoIlR5cGVEZWYiLCBmdW5jdGlvbigpIHsKLSAgICAgIGVxdWFscyhjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7Ci0gICAgfSk7Ci0KLSAgICBtb2R1bGUoImRlZXBlciEiKTsKLSAgICAKLSAgICB0ZXN0KCJNYXBNYXAiLCBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiLTQiOnsiLTQiOi00LCAiLTMiOi0zLCAiLTIiOi0yLCAiLTEiOi0xfSwgCi0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fQotICAgICAgfTsKLQotICAgICAgdmFyIG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKLSAgICAgIAotICAgICAgZXF1YWxzKEpTT04uc3RyaW5naWZ5KG1hcE1hcFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpKQotICAgIH0pOwotICAgIAotICAgIHRlc3QoInRlc3RJbnNhbml0eSIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGluc2FuaXR5VGVzdE91dHB1dDsKLSAgICAgIHZhciBpbnNhbml0eVRlc3RJbnB1dDsKLSAgICAgIAotICAgICAgIC8vICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IHRlc3RJbnNhbml0eSgxOiBJbnNhbml0eSBhcmd1bWVudCksCi0KLSAgICAgIHZhciBpbnNhbml0eSAgPSBuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpCi0gICAgICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5PTkVdID0gMQotICAgICAgaW5zYW5pdHkudXNlck1hcFtUaHJpZnRUZXN0Lk51bWJlcnouVFdPXSA9IDIKLQotCi0gICAgICBpbnNhbml0eVRlc3RPdXRwdXQgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuaXR5KTsKLSAgICAgIGVxdWFscyhKU09OLnN0cmluZ2lmeShpbnNhbml0eVRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShpbnNhbml0eVRlc3RJbnB1dCkpCi0gICAgICAvKgotICAgICAgICByZXF1ZXN0OgotICAgICAgICBbMSwidGVzdEluc2FuaXR5IiwxLDAseyIxIjp7InJlYyI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyIxIjoxLCIyIjoyfV19LCIyIjp7ImxzdCI6WyJyZWMiLDBdfX19fV0KLSAgICAgICAgcmVzcG9uc2U6Ci0gICAgICAgIFsxLCJ0ZXN0SW5zYW5pdHkiLDIsMCx7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDAse31dfSwiMiI6eyJsc3QiOlsicmVjIiwwXX19fV19XX19XQotICAgICAgKi8KLSAgICAgIC8vZXF1YWxzKHJlc1siMSJdWyIxIl0ueHRydWN0c1swXS5zdHJpbmdfdGhpbmcsICJ3b3JrZWQiKTsKLSAgICB9KTsKLSAgICB0ZXN0KCJ0ZXN0TXVsdGkiLCBmdW5jdGlvbigpIHsKLSAgICAgIC8vdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5pdHkpOwotICAgICAgLy9lcXVhbHMocmVzWyIxIl1bIjEiXS54dHJ1Y3RzWzBdLnN0cmluZ190aGluZywgIndvcmtlZCIpOwotICAgIH0pOwotCi0KLSAgICBtb2R1bGUoIkV4Y2VwdGlvbiIpOwotCi0gICAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICAgIGV4cGVjdCgyKTsKLSAgICAgIHRyeXsKLSAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7Ci0gICAgICB9Y2F0Y2goZSl7Ci0gICAgICAgIGVxdWFscyhlLmVycm9yQ29kZSwgMTAwMSk7Ci0gICAgICAgIGVxdWFscyhlLm1lc3NhZ2UsICJUaGlzIGlzIGFuIFhjZXB0aW9uIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0ZXN0KCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICAgIGV4cGVjdCgxKTsKLSAgICAgIHRyeXsKLSAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwotICAgICAgfWNhdGNoKGUpewotICAgICAgICBlcXVhbHMoZS5tZXNzYWdlLCAibm8gRXhjZXB0aW9uIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLQotICAgIG1vZHVsZSgiSW5zYW5pdHkiKTsKLQotICAgIHRlc3QoInRlc3RJbnNhbml0eSIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5pdHkpOwotICAgICAgZXF1YWxzKHJlc1siMSJdWyIxIl0ueHRydWN0c1swXS5zdHJpbmdfdGhpbmcsICJ3b3JrZWQiKTsKLSAgICB9KTsKLQotICB9KTsKLSAgLy9dXT4KLSAgPC9zY3JpcHQ+Ci0KKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotCi0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+Ci0gIC8vPCFbQ0RBVEFbCi0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvL1J1biBzYW1lIHRlc3RzIGFzeW5jaHJvbm91c2x5Ci0vKgotICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKQotICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpCi0gIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQotCi0gIGRvY3VtZW50LndyaXRlKCI8aDI+QXN5bmNocm9ub3VzIEV4YW1wbGU8XC9oMj4iKQotICBqUXVlcnkuYWpheCh7Ci0gICAgIHVybDogIi9zZXJ2aWNlIiwKLSAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygyLDMwKSksCi0gICAgIHR5cGU6ICJQT1NUIiwKLSAgICAgY2FjaGU6IGZhbHNlLAotICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpewotICAgICAgICAgICAgdmFyIF90cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpCi0gICAgICAgICAgICB2YXIgX3Byb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2woX3RyYW5zcG9ydCkKLSAgICAgICAgICAgIHZhciBfY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChfcHJvdG9jb2wpCi0KLSAgICAgICAgICAgIF90cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICkKLQotICAgICAgICAgICAgdmFyIHYgPSAgX2NsaWVudC5yZWN2X3Rlc3RJMzIoKQotICAgICAgICAgICAgJCgiI2JvZHkiKS5hcHBlbmQoImNsaWVudC50ZXN0STMyKCkgICAgPT4gIisodiA9PSBNYXRoLnBvdygyLDMwKSkrIjxici8+IikKLQotICAgICB9Ci0gIH0pCi0KLSAgalF1ZXJ5LmFqYXgoewotICAgICB1cmw6ICIvc2VydmljZSIsCi0gICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coMiw2MCkpLAotICAgICB0eXBlOiAiUE9TVCIsCi0gICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKLSAgICAgICAgICAgIHZhciBfdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKQotICAgICAgICAgICAgdmFyIF9wcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKF90cmFuc3BvcnQpCi0gICAgICAgICAgICB2YXIgX2NsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQoX3Byb3RvY29sKQotCi0gICAgICAgICAgICBfdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoIHJlcyApCi0KLSAgICAgICAgICAgIHZhciB2ID0gIF9jbGllbnQucmVjdl90ZXN0STY0KCkKLSAgICAgICAgICAgICQoIiNib2R5IikuYXBwZW5kKCJjbGllbnQudGVzdEk2NCgpICAgID0+ICIrKHYgPT0gTWF0aC5wb3coMiw2MCkpKyI8YnIvPiIpCi0KLSAgICAgfQotICB9KQotKi8KLQotICAvL11dPgotICA8L3NjcmlwdD4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgogICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KLSAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4gCisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgogICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCiAgIDxwPgogICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZwogICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKICAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CiAgIDwvcD4KKyAgLS0+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODZhNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKSBhbmQgalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkKKyAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqCisgKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGgKKyAqIE5vcm1hbCBhbmQgalF1ZXJ5IGludGVyZmFjZXMuIEFsbCBzeW5jaHJvbm91cyB0ZXN0cyBiZWxvbmcKKyAqIGhlcmUuCisgKgorICogQXN5bmNocm9ub3VzIHN1Y2Nlc3MgY2FsbGJhY2tzIHBhc3NlZCBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAqIG9mIGFuIFJQQyBjYWxsIHNob3VsZCBiZSBpZGVudGljYWwgaW4gYm90aCBOb3JtYWwgYW5kIGpRdWVyeQorICogaW50ZXJmYWNlcy4gQXN5bmMgc3VjY2VzcyB0ZXN0cyBiZWxvbmcgaGVyZS4KKyAqCisgKiBBc3luY2hyb25vdXMgZXhjZXB0aW9uIHByb2Nlc3NpbmcgaXMgZGlmZmVyZW50IGluIE5vcm1hbAorICogYW5kIGpRdWVyeSBpbnRlcmZhY2VzLiBTdWNoIHRlc3RzIGJlbG9uZyBpbiB0aGUgdGVzdC1ub2pxLmpzCisgKiBvciB0ZXN0LWpxLmpzIGZpbGVzIHJlc3BlY3RpdmVseS4galF1ZXJ5IHNwZWNpZmljIFhIUiBvYmplY3QKKyAqIHRlc3RzIGFsc28gYmVsb25nIGluIHRlc3QtanEuanMuIERvIG5vdCBjcmVhdGUgYW55IGpRdWVyeQorICogZGVwZW5kZW5jaWVzIGluIHRoaXMgZmlsZSBvciBpbiB0ZXN0LW5vanEuanMKKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKiAgICAgIC0tIG9yIC0tCisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IFRocmlmdFRlc3QudGhyaWZ0CisgKgorICogU2VlIGFsc286CisgKiArKyB0ZXN0LW5vanEuanMgZm9yICItZ2VuIGpzIiBvbmx5IHRlc3RzCisgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKKyAqLworCitjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKK2NvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworY29uc3QgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKy8vIFdvcmsgYXJvdW5kIGZvciBvbGQgQVBJIHVzZWQgYnkgUVVuaXRBZGFwdGVyIG9mIGpzVGVzdERyaXZlcgoraWYgKHR5cGVvZiBRVW5pdC5sb2cgPT0gJ2Z1bmN0aW9uJykgeworICAvLyBXaGVuIHVzaW5nIHJlYWwgUVVuaXQgKGZyb24gUGhhbnRvbUpTKSBsb2cgZmFpbHVyZXMgdG8gY29uc29sZQorICBRVW5pdC5sb2coZnVuY3Rpb24oZGV0YWlscykgeworICAgIGlmICghZGV0YWlscy5yZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CisgICAgICBjb25zb2xlLmxvZygnVGVzdE5hbWU6ICcgKyBkZXRhaWxzLm5hbWUpOworICAgICAgaWYgKGRldGFpbHMubWVzc2FnZSkgY29uc29sZS5sb2coZGV0YWlscy5tZXNzYWdlKTsKKyAgICAgIGNvbnNvbGUubG9nKCdFeHBlY3RlZDogJyArIGRldGFpbHMuZXhwZWN0ZWQpOworICAgICAgY29uc29sZS5sb2coJ0FjdHVhbCAgOiAnICsgZGV0YWlscy5hY3R1YWwpOworICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICB9CisgIH0pOworfQorCisvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Citjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChsZXQga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFZvaWQoKSwgdW5kZWZpbmVkKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoU3RyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGxldCBiaW5hcnkgPSAnJzsKKyAgICBmb3IgKGxldCB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgfQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShiaW5hcnkpLCBiaW5hcnkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnQmluYXJ5IChVaW50OEFycmF5KScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGxldCBiaW5hcnkgPSAnJzsKKyAgICBmb3IgKGxldCB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgfQorICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgKytpKSB7CisgICAgICBhcnJbaV0gPSBiaW5hcnlbaV0uY2hhckNvZGVBdCgpOworICAgIH0KKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZygnJyksICcnKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOworICB9KTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSksIE1hdGgucG93KDIsIDMwKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKSwgLU1hdGgucG93KDIsIDUyKSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworCisgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNvbnN0IG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQpOworCisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgfTsKKworICAgIGNvbnN0IG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOworCisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBhc3NlcnQub2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTGlzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgYXNzZXJ0Lm9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NraXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBjb25zdCBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgbW9kaWZpZWRDbGllbnQucmVjdl90ZXN0U3RydWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICBjb25zdCBpbnB1dCA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OworICAgICAgY29uc3QgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKKworICAgICAgaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIC8vIHJlYWQgWHRydWN0IGRhdGEgd2l0aCBYdHJ1Y3QzCisgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgeHRydWN0My5yZWFkKGlucHV0KTsKKyAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworICAgICAgLy8gcmVhZCBUaHJpZnQuVHlwZS5TVE9QIG1lc3NhZ2UKKyAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKworICAgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworICAgICAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgcmV0dXJuIHh0cnVjdDM7CisgICAgfTsKKworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3Qgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICctNCc6IHsnLTQnOiAtNCwgJy0zJzogLTMsICctMic6IC0yLCAnLTEnOiAtMX0KKyAgICB9OworCisgICAgY29uc3QgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworCisKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgZm9yIChsZXQga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgfQorICAgIH0KKworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOworCisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfQorICB9KTsKKworICBRVW5pdC50ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgLy9UaHJpZnRUZXN0IGRvZXMgbm90IGxpc3QgVEV4Y2VwdGlvbiBhcyBhIGxlZ2FsIGV4Y2VwdGlvbiBzbyBpdCB3aWxsCisgICAgLy8gZ2VuZXJhdGUgYW4gZXhjZXB0aW9uIG9uIHRoZSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBwcm9wYWdhdGUgYmFjayB0bworICAgIC8vIHRoZSBjbGllbnQuIFRoaXMgdGVzdCBoYXMgYmVlbiBtb2RpZmllZCB0byBlcXVhdGUgdG8gIm5vIGV4Y2VwdGlvbiIKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIHRyeSB7CisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIC8vYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9CisgICAgYXNzZXJ0Lm9rKHRydWUpOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgY29uc3QgY3JhenkgPSB7CisgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgJ3h0cnVjdHMnOiBbeworICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgfSwKKyAgICB7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgfV0KKyAgfTsKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiBjcmF6eSwKKyAgICAgICAgJzMnOiBjcmF6eQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjb25zdCByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworCisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOworICB9KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL1J1biBzYW1lIHRlc3RzIGFzeW5jaHJvbm91c2x5CisKK1FVbml0Lm1vZHVsZSgnQXN5bmMnKTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQxNTkyNjUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNDE1OTI2NSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworCisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLCAzMSksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjVmN2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorCitjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBURXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKS5URXhjZXB0aW9uOworCitleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0geworICB0ZXN0Vm9pZDogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0sCisgIHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0Qnl0ZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0Qnl0ZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJMzI6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEkzMignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RJNjQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEk2NCgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3REb3VibGU6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdERvdWJsZSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCaW5hcnk6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEJpbmFyeShcJycgKyB0aGluZyArICdcJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U3RydWN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJ1Y3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE5lc3Q6IGZ1bmN0aW9uKG5lc3QsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TmVzdCgnKTsKKyAgICBjb25zb2xlLmxvZyhuZXN0KTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCBuZXN0KTsKKyAgfSwKKyAgdGVzdE1hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJpbmdNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZ01hcCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0U2V0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RTZXQoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdExpc3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdExpc3QoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEVudW06IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEVudW0oJyArIHRoaW5nICsgJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0VHlwZWRlZjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0VHlwZWRlZignICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RNYXBNYXA6IGZ1bmN0aW9uKGhlbGxvLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOworCisgICAgY29uc3QgbWFwbWFwID0gW107CisgICAgY29uc3QgcG9zID0gW107CisgICAgY29uc3QgbmVnID0gW107CisgICAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmVzdWx0KG51bGwsIG1hcG1hcCk7CisgIH0sCisgIHRlc3RJbnNhbml0eTogZnVuY3Rpb24oYXJndW1lbnQsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoJyk7CisgICAgY29uc29sZS5sb2coYXJndW1lbnQpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgY29uc3QgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOworICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKKworICAgIGNvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIGNyYXp5LnVzZXJNYXAgPSBbXTsKKyAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkVJR0hUXSA9IDg7CisgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5GSVZFXSA9IDU7CisgICAgY3JhenkueHRydWN0cyA9IFtnb29kYnllLCBoZWxsb107CisKKyAgICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwID0gW107CisKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGNyYXp5OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKKworICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisKKyAgICBjb25zdCBpbnNhbmUgPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIGNvbnNvbGUubG9nKCdpbnNhbmUgcmVzdWx0OicpOworICAgIGNvbnNvbGUubG9nKGluc2FuZSk7CisgICAgcmVzdWx0KG51bGwsIGluc2FuZSk7CisgIH0sCisgIHRlc3RNdWx0aTogZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aSgpJyk7CisKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgIHJlc3VsdChudWxsLCBoZWxsbyk7CisgIH0sCisgIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJyArIGFyZyArICcpJyk7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdChudWxsKTsKKyAgICB9CisgIH0sCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnMCwgYXJnMSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHJlc3VsdCh4Mik7CisgICAgfQorCisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXN1bHQobnVsbCwgcmVzKTsKKyAgfSwKKyAgdGVzdE9uZXdheTogZnVuY3Rpb24oc2xlZXBGb3IsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworICB9Cit9OyAgIC8vVGhyaWZ0VGVzdFN2Y0hhbmRsZXIKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0NTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCkBAIC0wLDAgKzEsNjIgQEAKK++7vzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0PgorICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCisgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KHdzX3VyaSk7CisgICAgY29uc3QgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWFzeW5jLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90aHJpZnQuanMgYi9saWIvanMvdGhyaWZ0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZlMjdhLi4wMDAwMDAwCi0tLSBhL2xpYi9qcy90aHJpZnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIFRocmlmdCA9IHsKLQotICAgIFR5cGUgOiB7Ci0gICAgICAgICJTVE9QIiAgIDogMCwKLSAgICAgICAgIlZPSUQiICAgOiAxLAotICAgICAgICAiQk9PTCIgICA6IDIsCi0gICAgICAgICJCWVRFIiAgIDogMywKLSAgICAgICAgIkkwOCIgICAgOiAzLAotICAgICAgICAiRE9VQkxFIiA6IDQsCi0gICAgICAgICJJMTYiICAgIDogNiwKLSAgICAgICAgIkkzMiIgICAgOiA4LAotICAgICAgICAiSTY0IiAgICA6IDEwLAotICAgICAgICAiU1RSSU5HIiA6IDExLAotICAgICAgICAiVVRGNyIgICA6IDExLAotICAgICAgICAiU1RSVUNUIiA6IDEyLAotICAgICAgICAiTUFQIiAgICA6IDEzLAotICAgICAgICAiU0VUIiAgICA6IDE0LAotICAgICAgICAiTElTVCIgICA6IDE1LAotICAgICAgICAiVVRGOCIgICA6IDE2LAotICAgICAgICAiVVRGMTYiICA6IDE3Ci0gICAgfSwKLQotICAgIE1lc3NhZ2VUeXBlIDogewotICAgICAgICAiQ0FMTCIgICAgICA6IDEsCi0gICAgICAgICJSRVBMWSIgICAgIDogMiwKLSAgICAgICAgIkVYQ0VQVElPTiIgOiAzCi0gICAgfQotfQotCi1UaHJpZnQuVEV4Y2VwdGlvbiA9IHt9Ci1UaHJpZnQuVEV4Y2VwdGlvbi5wcm90b3R5cGUgPSB7IAotICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCBtZXNzYWdlLCBjb2RlICkgewotICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHRoaXMuY29kZSAgICA9IChjb2RlID09IG51bGwpID8gMCA6IGNvZGU7Ci0gICAgfQotfQotCi0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gewotICAgICJVTktOT1dOIiAgICAgICAgICAgICAgOiAwLAotICAgICJVTktOT1dOX01FVEhPRCIgICAgICAgOiAxLAotICAgICJJTlZBTElEX01FU1NBR0VfVFlQRSIgOiAyLAotICAgICJXUk9OR19NRVRIT0RfTkFNRSIgICAgOiAzLAotICAgICJCQURfU0VRVUVOQ0VfSUQiICAgICAgOiA0LAotICAgICJNSVNTSU5HX1JFU1VMVCIgICAgICAgOiA1ICAgICAgIAotfQotCi1UaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSl7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZQotICAgIHRoaXMuY29kZSAgICA9IChjb2RlID09IG51bGwpID8gMCA6IGNvZGUKLX0KLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUgPSB7IAotICAgICAgIAotICAgIHJlYWQgOiBmdW5jdGlvbihpbnB1dCl7Ci0gICAgICAgIAotICAgICAgICB2YXIgZnR5cGUKLSAgICAgICAgdmFyIGZpZAotICAgICAgICB2YXIgcmV0ID0gaW5wdXQucmVhZFN0cnVjdEJlZ2luKGZuYW1lKSAKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZm5hbWUgPSByZXQuZm5hbWUgICAgICAKLSAgICAgICAgCi0gICAgICAgIHdoaWxlKDEpewotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKHJldC5mdHlwZSA9PSBUVHlwZS5TVE9QKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBmaWQgPSByZXQuZmlkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN3aXRjaChmaWQpewotICAgICAgICAgICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5TVFJJTkcgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gcmV0LnZhbHVlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5JMzIgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlID0gcmV0LnZhbHVlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgICA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKQotICAgICAgICAKLSAgICB9LAotICAgIAotICAgIHdyaXRlOiBmdW5jdGlvbihvdXRwdXQpewotICAgICAgICB2YXIgeGZlciAgID0gMDsKLSAgICAgICAgCi0gICAgICAgIG91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLm1lc3NhZ2UpIHsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUeXBlLlNUUklORywgMSkKLSAgICAgICAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLmdldE1lc3NhZ2UoKSkKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCkKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMuY29kZSkgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbigndHlwZScsIFR5cGUuSTMyLCAyKQotICAgICAgICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSkKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCkKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCkKLSAgICAgICAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCkKLSAgICAgICAKLSAgICB9LAotICAgIAotICAgIGdldENvZGUgOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29kZQotICAgIH0sCi0gICAgCi0gICAgZ2V0TWVzc2FnZSA6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlCi0gICAgfQotfQotCi0KLQotLyoqCi0gKklmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBhamF4IG9uIHlvdXIgb3duLgotICpUaGlzIGlzIGhvdyB0byB1c2UganMgYmluZGluZ3MgaW4gYSBhc3luYyBmYXNoaW9uLgotICovCi1UaHJpZnQuVHJhbnNwb3J0ID0gZnVuY3Rpb24odXJsKXsKLSAgICB0aGlzLnVybCAgICAgID0gdXJsCi0gICAgdGhpcy53cG9zICAgICA9IDAKLSAgICB0aGlzLnJwb3MgICAgID0gMAotCi0gICAgdGhpcy5zZW5kX2J1ZiA9ICcnCi0gICAgdGhpcy5yZWN2X2J1ZiA9ICcnCi19Ci0KLVRocmlmdC5UcmFuc3BvcnQucHJvdG90eXBlID0gewotCi0gICAgLy9HZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdAotICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0IDogZnVuY3Rpb24oKSB7Ci0gICAgCi0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKSB9IGNhdGNoKGUpIHt9Ci0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAiKSB9IGNhdGNoIChlKSB7fQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikgfSBjYXRjaCAoZSkge30KLQotICAgICAgICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgWG1sSHR0cFJlcXVlc3Qgb2JqZWN0LiAgVHJ5IHVwZ3JhZGluZyB0byBGaXJlZm94LiIKLSAgICAKLSAgICB9LAotCi0gICAgZmx1c2ggOiBmdW5jdGlvbigpewotCi0gICAgICAgIC8vYXN5bmMgbW9kZQotICAgICAgICBpZih0aGlzLnVybCA9PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT0gJycpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKLQotICAgICAgICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKQotICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKQotICAgICAgICAgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCJhcHBsaWNhdGlvbi9qc29uIikKLSAgICAgICAgCi0gICAgICAgIHhyZXEub3BlbigiUE9TVCIsIHRoaXMudXJsLCBmYWxzZSkKLSAgICAgICAgeHJlcS5zZW5kKHRoaXMuc2VuZF9idWYpCi0gICAgICAgIAotICAgICAgICBpZiAoeHJlcS5yZWFkeVN0YXRlICE9IDQpCi0gICAgICAgICAgICB0aHJvdyAiZW5jb3VudGVyZWQgYW4gdW5rbm93biBhamF4IHJlYWR5IHN0YXRlOiAiK3hyZXEucmVhZHlTdGF0ZQotICAgICAgICAKLSAgICAgICAgaWYgKHhyZXEuc3RhdHVzICE9IDIwMCkKLSAgICAgICAgICAgIHRocm93ICJlbmNvdW50ZXJlZCBhIHVua25vd24gcmVxdWVzdCBzdGF0dXM6ICIreHJlcS5zdGF0dXMKLQotICAgICAgICB0aGlzLnJlY3ZfYnVmICAgID0geHJlcS5yZXNwb25zZVRleHQKLSAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoCi0gICAgICAgIHRoaXMud3BvcyAgICAgICAgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aAotICAgICAgICB0aGlzLnJwb3MgICAgICAgID0gMAotICAgIH0sCi0KLSAgICBzZXRSZWN2QnVmZmVyIDogZnVuY3Rpb24oYnVmKXsKLSAgICAgICAgdGhpcy5yZWN2X2J1ZiAgICA9IGJ1ZgotICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGgKLSAgICAgICAgdGhpcy53cG9zICAgICAgICA9IHRoaXMucmVjdl9idWYubGVuZ3RoCi0gICAgICAgIHRoaXMucnBvcyAgICAgICAgPSAwCi0gICAgfSwKLQotICAgIGlzT3BlbiA6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdHJ1ZQotICAgIH0sCi0KLSAgICBvcGVuIDogZnVuY3Rpb24oKSB7fSwKLQotICAgIGNsb3NlOiBmdW5jdGlvbigpIHt9LAotCi0gICAgcmVhZCA6IGZ1bmN0aW9uKGxlbikgewotICAgICAgICB2YXIgYXZhaWwgPSB0aGlzLndwb3MgLSB0aGlzLnJwb3MKLSAgICAgICAKLSAgICAgICAgaWYoYXZhaWwgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAnJwotCi0gICAgICAgIHZhciBnaXZlID0gbGVuCi0KLSAgICAgICAgaWYoYXZhaWwgPCBsZW4pCi0gICAgICAgICAgICBnaXZlID0gYXZhaWwKLQotICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLGdpdmUpCi0gICAgICAgIHRoaXMucnBvcyArPSBnaXZlCi0KLSAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KLSAgICAgICAgcmV0dXJuIHJldAotICAgIH0sCi0KLSAgICByZWFkQWxsIDogZnVuY3Rpb24oKSB7Ci0gICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWYKLSAgICB9LAotCi0gICAgd3JpdGUgOiBmdW5jdGlvbihidWYpewotICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmCi0gICAgfSwKLQotICAgIGdldFNlbmRCdWZmZXIgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZgotICAgIH0KLQotfQotCi0KLQotVGhyaWZ0LlByb3RvY29sID0gZnVuY3Rpb24odHJhbnNwb3J0KXsKLSAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAotfQotCi1UaHJpZnQuUHJvdG9jb2wuVHlwZSA9IHt9Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVsgVGhyaWZ0LlR5cGUuQk9PTCAgIF0gPSAnInRmIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5CWVRFICAgXSA9ICciaTgiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkkxNiAgICBdID0gJyJpMTYiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkkzMiAgICBdID0gJyJpMzIiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkk2NCAgICBdID0gJyJpNjQiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkRPVUJMRSBdID0gJyJkYmwiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLlNUUlVDVCBdID0gJyJyZWMiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLlNUUklORyBdID0gJyJzdHIiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLk1BUCAgICBdID0gJyJtYXAiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkxJU1QgICBdID0gJyJsc3QiJwotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLlNFVCAgICBdID0gJyJzZXQiJwotCi0KLVRocmlmdC5Qcm90b2NvbC5SVHlwZSA9IHt9Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJ0ZiIgXSA9IFRocmlmdC5UeXBlLkJPT0wKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImk4IiBdID0gVGhyaWZ0LlR5cGUuQllURQotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAiaTE2Il0gPSBUaHJpZnQuVHlwZS5JMTYKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImkzMiJdID0gVGhyaWZ0LlR5cGUuSTMyCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJpNjQiXSA9IFRocmlmdC5UeXBlLkk2NCAKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImRibCJdID0gVGhyaWZ0LlR5cGUuRE9VQkxFIAotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAicmVjIl0gPSBUaHJpZnQuVHlwZS5TVFJVQ1QgCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJzdHIiXSA9IFRocmlmdC5UeXBlLlNUUklORwotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAibWFwIl0gPSBUaHJpZnQuVHlwZS5NQVAgCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJsc3QiXSA9IFRocmlmdC5UeXBlLkxJU1QKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgInNldCJdID0gVGhyaWZ0LlR5cGUuU0VUIAotCi1UaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiA9IDEKLQotVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZSA9IHsKLSAgICAKLSAgICBnZXRUcmFuc3BvcnQgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQKLSAgICB9LAotCi0gICAgLy9Xcml0ZSBmdW5jdGlvbnMKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiA6IGZ1bmN0aW9uKG5hbWUsbWVzc2FnZVR5cGUsc2VxaWQpewotICAgICAgICB0aGlzLnRzdGFjayA9IG5ldyBBcnJheSgpCi0gICAgICAgIHRoaXMudHBvcyAgID0gbmV3IEFycmF5KCk7Ci0gICAgICAgICAgIAotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiwnIicrbmFtZSsnIicsbWVzc2FnZVR5cGUsc2VxaWRdKTsKLSAgICB9LAotCi0gICAgd3JpdGVNZXNzYWdlRW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIG9iaiA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgIAotICAgICAgICB0aGlzLndvYmogPSB0aGlzLnRzdGFjay5wb3AoKQotICAgICAgICB0aGlzLndvYmoucHVzaChvYmopCi0gCi0gICAgICAgIHRoaXMud2J1ZiA9ICJbIit0aGlzLndvYmouam9pbigiLCIpKyJdIjsKLQotICAgICAgICB0aGlzLnRyYW5zcG9ydC53cml0ZSh0aGlzLndidWYpOyAgICAgICAKLSAgICAgfSwKLQotCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiA6IGZ1bmN0aW9uKG5hbWUpewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goe30pCi0gICAgfSwKLQotICAgIHdyaXRlU3RydWN0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgCi0gICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpCi0gICAgICAgIHZhciBzdHJ1Y3QgPSB0aGlzLnRzdGFja1twXQotICAgICAgICB2YXIgc3RyID0gInsiCi0gICAgICAgIHZhciBmaXJzdCA9IHRydWUKLSAgICAgICAgZm9yKCB2YXIga2V5IGluIHN0cnVjdCApewotICAgICAgICAgICAgaWYoZmlyc3QpIAotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RyICs9ICIsIjsKLQotICAgICAgICAgICAgc3RyICs9IGtleSsiOiIrc3RydWN0W2tleV0KLSAgICAgICAgfSAKLQotICAgICAgICBzdHIgKz0gIn0iCi0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gc3RyOwotICAgIH0sCi0KLSAgICB3cml0ZUZpZWxkQmVnaW4gOiBmdW5jdGlvbihuYW1lLGZpZWxkVHlwZSxmaWVsZElkKXsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKQotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKHsiZmllbGRJZCIgOiAnIicrZmllbGRJZCsnIicsICJmaWVsZFR5cGUiIDogVGhyaWZ0LlByb3RvY29sLlR5cGVbZmllbGRUeXBlXX0pOwotICAgICAgIAotICAgIH0sCi0KLSAgICB3cml0ZUZpZWxkRW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHZhbHVlICAgICA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgIHZhciBmaWVsZEluZm8gPSB0aGlzLnRzdGFjay5wb3AoKSAKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHN0YWNrW3RoaXMudHN0YWNrLmxlbmd0aC0xXVtmaWVsZEluZm8uZmllbGRJZF0gPSAieyIrZmllbGRJbmZvLmZpZWxkVHlwZSsiOiIrdmFsdWUrIn0iIAotICAgICAgICB0aGlzLnRwb3MucG9wKCkKLSAgICB9LAotCi0gICAgd3JpdGVGaWVsZFN0b3AgOiBmdW5jdGlvbigpewotICAgICAgICAvL25hCi0gICAgfSwKLQotICAgIHdyaXRlTWFwQmVnaW4gOiBmdW5jdGlvbihrZXlUeXBlLHZhbFR5cGUsc2l6ZSl7Ci0gICAgICAgIC8vc2l6ZSBpcyBpbnZhbGlkLCB3ZSdsbCBzZXQgaXQgb24gZW5kLgotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2tleVR5cGVdLFRocmlmdC5Qcm90b2NvbC5UeXBlW3ZhbFR5cGVdLDBdKSAKLSAgICB9LAotCi0gICAgd3JpdGVNYXBFbmQgOiBmdW5jdGlvbigpewotICAgICAgICB2YXIgcCAgID0gdGhpcy50cG9zLnBvcCgpCi0gICAgICAgIAotICAgICAgICBpZihwID09IHRoaXMudHN0YWNrLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGlmKCh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgJSAyICE9IDApCi0gICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCIiKTsKLQotICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkvMgotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdW3RoaXMudHN0YWNrW3BdLmxlbmd0aC0xXSA9IHNpemU7Ci0gICAgICAgIAotICAgICAgICB2YXIgbWFwICAgPSAieyIKLSAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZQotICAgICAgICB3aGlsZSggdGhpcy50c3RhY2subGVuZ3RoID4gcCsxICl7Ci0gICAgICAgICAgICB2YXIgdiA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgICAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpCi0gICAgICAgICAgICBpZihmaXJzdCl7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZQotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgbWFwICs9ICIsIgotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBtYXAgICs9ICciJytrKyciOicrdgotICAgICAgICB9Ci0gICAgICAgIG1hcCArPSAifSIKLSAgICAgICAgCi0gICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKQotICAgICAgICB0aGlzLnRzdGFja1twXSA9ICJbIit0aGlzLnRzdGFja1twXS5qb2luKCIsIikrIl0iCi0gICAgfSwKLQotICAgIHdyaXRlTGlzdEJlZ2luIDogZnVuY3Rpb24oZWxlbVR5cGUsc2l6ZSl7Ci0gICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCkKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLHNpemVdKTsKLSAgICB9LAotCi0gICAgd3JpdGVMaXN0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCkKLQotICAgICAgICB3aGlsZSggdGhpcy50c3RhY2subGVuZ3RoID4gcCsxICl7Ci0gICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCsxXQotICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHArMSwgMSkKLSAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycrdGhpcy50c3RhY2tbcF0uam9pbigiLCIpKyddJzsKLSAgICB9LAotCi0gICAgd3JpdGVTZXRCZWdpbiA6IGZ1bmN0aW9uKGVsZW1UeXBlLHNpemUpewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSxzaXplXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlU2V0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCkKLQotICAgICAgICB3aGlsZSggdGhpcy50c3RhY2subGVuZ3RoID4gcCsxICl7Ci0gICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCsxXQotICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHArMSwgMSkKLSAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycrdGhpcy50c3RhY2tbcF0uam9pbigiLCIpKyddJzsKLSAgICB9LAotCi0gICAgd3JpdGVCb29sIDogZnVuY3Rpb24odmFsdWUpewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCB2YWx1ZSA/IDEgOiAwICk7Ci0gICAgfSwKLQotICAgIHdyaXRlQnl0ZSA6IGZ1bmN0aW9uKGk4KXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpOCk7Ci0gICAgfSwKLQotICAgIHdyaXRlSTE2IDogZnVuY3Rpb24oaTE2KXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMTYpOwotICAgIH0sCi0KLSAgICB3cml0ZUkzMiA6IGZ1bmN0aW9uKGkzMil7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTMyKTsKLSAgICB9LAotCi0gICAgd3JpdGVJNjQgOiBmdW5jdGlvbihpNjQpewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7Ci0gICAgfSwKLQotICAgIHdyaXRlRG91YmxlIDogZnVuY3Rpb24oZGJsKXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChkYmwpOwotICAgIH0sCi0KLSAgICB3cml0ZVN0cmluZyA6IGZ1bmN0aW9uKHN0cil7Ci0gICAgICAgIC8vIFdlIGRvIG5vdCBlbmNvZGUgdXJpIGNvbXBvbmVudHMgZm9yIHdpcmUgdHJhbnNmZXI6IAotICAgICAgICBpZihzdHIgPT09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2gobnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKLSAgICAgICAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCi0gICAgICAgICAgICAgICAgaWYoY2ggPT09ICdcIicpIHsKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7ICAgICAvLyB3cml0ZSBvdXQgYXM6IFwiCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGNoID09PSAnXFwnKSB7ICAgICAgICAgLy8gYSBzaW5nbGUgYmFja3NsYXNoOiBcCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXFwnOyAgICAgLy8gd3JpdGUgb3V0IGFzOiBcXAotICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBlc2NhcGVkIGZvcndhcmQgc2xhc2hlcyBicmVhayBUSlNPTlByb3RvY29sLgotICAgICAgICAgICAgICAgICAqIEFzIGl0IHN0YW5kcywgd2UgY2FuIHNpbXBseSBwYXNzIGZvcndhcmQgc2xhc2hlcyBpbnRvIG91ciBzdHJpbmdzCi0gICAgICAgICAgICAgICAgICogYWNyb3NzIHRoZSB3aXJlIHdpdGhvdXQgYmVpbmcgZXNjYXBlZC4KLSAgICAgICAgICAgICAgICAgKiBJIHRoaW5rIHRoaXMgaXMgdGhlIHByb3RvY29sJ3MgYnVnLCBub3QgdGhyaWZ0LmpzCi0gICAgICAgICAgICAgICAgICogfSBlbHNlIGlmKGNoID09PSAnLycpIHsgICAgICAgLy8gYSBzaW5nbGUgZm9yd2FyZCBzbGFzaDogLwotICAgICAgICAgICAgICAgICAqICBlc2NhcGVkU3RyaW5nICs9ICdcXC8nOyAgICAgIC8vIHdyaXRlIG91dCBhcyBcLwotICAgICAgICAgICAgICAgICAqIH0gCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGNoID09PSAnXGInKSB7ICAgICAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgICAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY2ggPT09ICdcZicpIHsgICAgICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgICAgIC8vIHdyaXRlIG91dCBhczogXGYiCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGNoID09PSAnXG4nKSB7ICAgICAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgICAgIC8vIHdyaXRlIG91dCBhczogXG4iCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGNoID09PSAnXHInKSB7ICAgICAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgICAgLy8gd3JpdGUgb3V0IGFzOiBcciIKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY2ggPT09ICdcdCcpIHsgICAgICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAgICAvLyB3cml0ZSBvdXQgYXM6IFx0IgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOwotICAgICAgICB9Ci0gICAgfSwKLQotICAgIHdyaXRlQmluYXJ5IDogZnVuY3Rpb24oc3RyKXsKLSAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpOwotICAgIH0sCi0KLQotICAgIAotICAgIC8vIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiA6IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCl7Ci0gICAgICAgIHRoaXMucnN0YWNrID0gbmV3IEFycmF5KCkKLSAgICAgICAgdGhpcy5ycG9zICAgPSBuZXcgQXJyYXkoKQotICAgICAgIAotICAgICAgICB0aGlzLnJvYmogPSBldmFsKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSkKLSAgICAgICAgCi0gICAgICAgIHZhciByID0ge30gICAgIAotICAgICAgICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpCi0gICAgICAgIAotICAgICAgICBpZih2ZXJzaW9uICE9IFRocmlmdC5Qcm90b2NvbC5WZXJzaW9uKXsKLSAgICAgICAgICAgIHRocm93ICJXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogIit2ZXJzaW9uCi0gICAgICAgIH0KLQotICAgICAgICByWyJmbmFtZSJdICA9IHRoaXMucm9iai5zaGlmdCgpCi0gICAgICAgIHJbIm10eXBlIl0gID0gdGhpcy5yb2JqLnNoaWZ0KCkKLSAgICAgICAgclsicnNlcWlkIl0gPSB0aGlzLnJvYmouc2hpZnQoKQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vZ2V0IHRvIHRoZSBtYWluIG9iagotICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKQotICAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAKLSAgICByZWFkTWVzc2FnZUVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgfSwKLQotICAgIHJlYWRTdHJ1Y3RCZWdpbiA6IGZ1bmN0aW9uKG5hbWUpewotICAgICAgICB2YXIgciA9IHt9Ci0gICAgICAgIHJbImZuYW1lIl0gPSAnJwotICAgICAgICAKLSAgICAgICAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCi0gICAgICAgIGlmKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0xXSBpbnN0YW5jZW9mIEFycmF5KQotICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV0uc2hpZnQoKSkKLSAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRTdHJ1Y3RFbmQgOiBmdW5jdGlvbigpewotICAgICAgICBpZih0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMl0gaW5zdGFuY2VvZiBBcnJheSkKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpCi0gICAgfSwKLQotICAgIHJlYWRGaWVsZEJlZ2luIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgCi0gICAgICAgIHZhciBmaWQgICA9IC0xCi0gICAgICAgIHZhciBmdHlwZSA9IFRocmlmdC5UeXBlLlNUT1AgCi0gICAgICAgIAotICAgICAgICAvL2dldCBhIGZpZWxkSWQKLSAgICAgICAgZm9yKHZhciBmIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV0pKXsKLSAgICAgICAgICAgIGlmKGYgPT0gbnVsbCkgY29udGludWUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmlkID0gcGFyc2VJbnQoZikKLSAgICAgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdW2ZpZF0KLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV1bZmlkXQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGZpZWxkKSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYoZmlkICE9IC0xKXsgICAgICAKLSAgICAgICAKLSAgICAgICAgICAgIC8vc2hvdWxkIG9ubHkgYmUgMSBvZiB0aGVzZSBidXQgdGhpcyBpcyB0aGUgb25seQotICAgICAgICAgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKLSAgICAgICAgICAgIGZvcih2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdKSl7Ci0gICAgICAgICAgICAgICAgaWYoVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZdID09IG51bGwgKSBjb250aW51ZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZdCi0gICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdW2ZdCi0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgclsiZm5hbWUiXSA9ICcnCi0gICAgICAgIHJbImZ0eXBlIl0gPSBmdHlwZQotICAgICAgICByWyJmaWQiXSAgID0gZmlkCi0gICAgICAgIAotCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRGaWVsZEVuZCA6IGZ1bmN0aW9uKCl7ICAKLSAgICAgICAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKQotICAgICAgICAKLSAgICAgICAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCi0gICAgICAgIHdoaWxlKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAKLSAgICB9LAotCi0gICAgcmVhZE1hcEJlZ2luIDogZnVuY3Rpb24oa2V5VHlwZSx2YWxUeXBlLHNpemUpewotICAgICAgICAKLSAgICAgICAgdmFyIG1hcCA9IHRoaXMucnN0YWNrLnBvcCgpCi0gICAgICAgIAotICAgICAgICB2YXIgciA9IHt9OwotICAgICAgICByWyJrdHlwZSJdID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXQotICAgICAgICByWyJ2dHlwZSJdID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXQotICAgICAgICByWyJzaXplIl0gID0gbWFwLnNoaWZ0KCkKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMucnN0YWNrLnB1c2gobWFwLnNoaWZ0KCkpCi0gICAgICAgIAotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZE1hcEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCkKLSAgICB9LAotCi0gICAgcmVhZExpc3RCZWdpbiA6IGZ1bmN0aW9uKGVsZW1UeXBlLHNpemUpewotICAgICAgCi0gICAgICAgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdCi0gICAgICAKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgclsiZXR5cGUiXSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOwotICAgICAgICByWyJzaXplIiBdID0gbGlzdC5zaGlmdCgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7Ci0gICAgICAgIHRoaXMucnN0YWNrLnB1c2gobGlzdCkKLSAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRMaXN0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKQotICAgIH0sCi0KLSAgICByZWFkU2V0QmVnaW4gOiBmdW5jdGlvbihlbGVtVHlwZSxzaXplKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RCZWdpbihlbGVtVHlwZSxzaXplKQotICAgIH0sCi0KLSAgICByZWFkU2V0RW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKQotICAgIH0sCi0KLSAgICByZWFkQm9vbCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCkKLSAgICAKLSAgICAgICAgaWYoIHIgIT0gbnVsbCAmJiByWyJ2YWx1ZSJdID09ICIxIiApewotICAgICAgICAgICAgclsidmFsdWUiXSA9IHRydWUKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByWyJ2YWx1ZSJdID0gZmFsc2UKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHIKLSAgICB9LAotCi0gICAgcmVhZEJ5dGUgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCkKLSAgICB9LAotCi0gICAgcmVhZEkxNiA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKQotICAgIH0sCi0gICAKLQotICAgIHJlYWRJMzIgOiBmdW5jdGlvbihmKXsKLSAgICAgICAgaWYoZiA9PSB1bmRlZmluZWQpCi0gICAgICAgICAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdCi0gICAgICAgIAotICAgICAgICB2YXIgciA9IHt9ICAgIAotICAgICAgICAgICAgCi0gICAgICAgIGlmKGYgaW5zdGFuY2VvZiBBcnJheSl7Ci0gICAgICAgICAgICBpZihmLmxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJbInZhbHVlIl0gPSB1bmRlZmluZWQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByWyJ2YWx1ZSJdID0gZi5zaGlmdCgpCi0KLSAgICAgICAgfWVsc2UgaWYoZiBpbnN0YW5jZW9mIE9iamVjdCl7Ci0gICAgICAgICAgIGZvcih2YXIgaSBpbiBmKXsKLSAgICAgICAgICAgICAgICBpZihpID09IG51bGwpIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmW2ldKQotICAgICAgICAgICAgICAgIGRlbGV0ZSBmW2ldICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByWyJ2YWx1ZSJdID0gaQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJbInZhbHVlIl0gPSBmCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRJNjQgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCkKLSAgICB9LAotCi0gICAgcmVhZERvdWJsZSA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKQotICAgIH0sCi0KLSAgICByZWFkU3RyaW5nIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKQotICAgICAgICByZXR1cm4gcgotICAgIH0sCi0KLSAgICByZWFkQmluYXJ5IDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpCi0gICAgfSwKLQotICAgIAotICAgIC8vTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhLgotICAgIHNraXAgOiBmdW5jdGlvbih0eXBlKXsKLSAgICAgICAgdGhyb3cgInNraXAgbm90IHN1cHBvcnRlZCB5ZXQiCi0gICAgfQotICAgCi19Ci0KLVRocmlmdC5vYmplY3RMZW5ndGggPSBmdW5jdGlvbihvYmopIHsKLSAgdmFyIGxlbmd0aCA9IDA7Ci0gIGZvciAoayBpbiBvYmopIHsKLSAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7Ci0gICAgICBsZW5ndGgrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotVGhpcmZ0LmluaGVyaXRzID0gZnVuY3Rpb24oY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IpIHsKLSAgLy8gUHJvdG90eXBhbCBJbmhlcml0YW5jZQotICAvLyBodHRwOi8vamF2YXNjcmlwdC5jcm9ja2ZvcmQuY29tL3Byb3RvdHlwYWwuaHRtbAotICBmdW5jdGlvbiBGKCkge30KLSAgRi5wcm90b3R5cGUgPSBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZTsKLSAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IEYoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9qc29uL01ha2VmaWxlLmFtIGIvbGliL2pzb24vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1MWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgV0lUSF9KQVZBCisjIFNjaGVtYSB2YWxpZGF0aW9uIHRlc3QgZGVwZW5kcyBvbiBqYXZhCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBcCisgICAgc2NoZW1hLmpzb24gXAorICAgIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi9qc29uL3NjaGVtYS5qc29uIGIvbGliL2pzb24vc2NoZW1hLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1OGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3NjaGVtYS5qc29uCkBAIC0wLDAgKzEsMzQ0IEBACit7CisgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCisKKyAgImlkIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9zY2hlbWEuanNvbiMiLAorICAiZGVzY3JpcHRpb24iOiAiU2NoZW1hIGZvciBBcGFjaGUgVGhyaWZ0IHByb3RvY29sIGRlc2NyaXB0b3JzIiwKKworICAiZGVmaW5pdGlvbnMiOiB7CisgICAgInR5cGUtaWQiOiB7CisgICAgICAidGl0bGUiOiAiQW55IHR5cGUgaWQgKG5hbWUpIiwKKyAgICAgICJlbnVtIjogWworICAgICAgICAidm9pZCIsCisgICAgICAgICJzdHJpbmciLAorICAgICAgICAiYm9vbCIsCisgICAgICAgICJieXRlIiwKKyAgICAgICAgImk4IiwKKyAgICAgICAgImkxNiIsCisgICAgICAgICJpMzIiLAorICAgICAgICAiaTY0IiwKKyAgICAgICAgImRvdWJsZSIsCisgICAgICAgICJsaXN0IiwKKyAgICAgICAgInNldCIsCisgICAgICAgICJtYXAiLAorICAgICAgICAidW5pb24iLAorICAgICAgICAic3RydWN0IiwKKyAgICAgICAgImJpbmFyeSIKKyAgICAgIF0KKyAgICB9LAorICAgICJiYXNlLXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiQmFzZSB0eXBlIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbInZvaWQiLCAic3RyaW5nIiwgImJvb2wiLCAiYnl0ZSIsICJpOCIsICJpMTYiLCAiaTMyIiwgImk2NCIsICJkb3VibGUiLCAiYmluYXJ5IiBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJsaXN0LXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiTGlzdCBhbmQgc2V0IHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJsaXN0IiwgInNldCIgXQorICAgICAgICB9LAorICAgICAgICAiZWxlbVR5cGVJZCI6ICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgImVsZW1UeXBlIjogICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJlbGVtVHlwZUlkIiBdCisgICAgfSwKKyAgICAibWFwLXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJtYXAiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImtleVR5cGVJZCI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJrZXlUeXBlIjogICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgICJ2YWx1ZVR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAidmFsdWVUeXBlIjogICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImtleVR5cGVJZCIsICJ2YWx1ZVR5cGVJZCIgXQorICAgIH0sCisgICAgInN0cnVjdC10eXBlIjogeworICAgICAgInRpdGxlIjogIlN0cnVjdCwgdW5pb24gYW5kIGV4Y2VwdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAidW5pb24iLCAic3RydWN0IiwgImV4Y2VwdGlvbiIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImNsYXNzIiBdCisgICAgfSwKKyAgICAidHlwZS1kZXNjIjogeworICAgICAgInRpdGxlIjogIlR5cGUgZGVzY3JpcHRvciBzY2hlbWEiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7CisgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGVJZCI6ICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgImNsYXNzIjogICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJvbmVPZiI6CisgICAgICAgICAgWworICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Jhc2UtdHlwZSIgfSwKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9saXN0LXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbWFwLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJuYW1lLWFuZC1kb2MiOiB7CisgICAgICAidGl0bGUiOiAiTmFtZSBhbmQgZG9jdW1lbnRhdGlvbiBzdWItc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgImRvYyI6IHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIgXQorICAgIH0sCisgICAgImVudW0iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0ICdlbnVtJyBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInJlcXVpcmVkIjogWyAibWVtYmVycyIgXSwKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJtZW1iZXJzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2YWx1ZSIgXQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidHlwZWRlZiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgdHlwZWRlZiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidHlwZUlkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiY29uc3RhbnQiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGNvbnN0YW50IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IHsKKyAgICAgICAgICAgICAgIm9uZU9mIjogWworICAgICAgICAgICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAibnVtYmVyIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYXJyYXkiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJvYmplY3QiIH0KKyAgICAgICAgICAgICAgXQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAidmFsdWUiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImZpZWxkIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzdHJ1Y3QgZmllbGQgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgICAgICJtaW5pbXVtIjogMSwKKyAgICAgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXF1aXJlZCI6IHsKKyAgICAgICAgICAgICAgImVudW0iOiBbICJyZXF1aXJlZCIsICJvcHRpb25hbCIsICJyZXFfb3V0IiBdCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAgICAgImRlZmF1bHQiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJyZXF1aXJlZCIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAic3RydWN0IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzdHJ1Y3QgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImlzRXhjZXB0aW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImlzVW5pb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCisgICAgICAgICAgICAiZmllbGRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJpc0V4Y2VwdGlvbiIsICJpc1VuaW9uIiwgImZpZWxkcyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAidW5pb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHVuaW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0IgorICAgIH0sCisgICAgImV4Y2VwdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgZXhjZXB0aW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgImtleSI6IHsKKyAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQorICAgICAgICB9LAorICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAidHlwZUlkIjogeyAiZW51bSI6IFsgImV4Y2VwdGlvbiIgXSB9LAorICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QtdHlwZSIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJuYW1lIiwgInR5cGVJZCIgXQorICAgIH0sCisgICAgImZ1bmN0aW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGZ1bmN0aW9uIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJvbmV3YXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJldHVyblR5cGUiOiB7CisgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJhcmd1bWVudHMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZmllbGQiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZXhjZXB0aW9ucyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhjZXB0aW9uIiB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJvbmV3YXkiLCAiYXJndW1lbnRzIiwgImV4Y2VwdGlvbnMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInNlcnZpY2UiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHNlcnZpY2UgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgImZ1bmN0aW9ucyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9mdW5jdGlvbiIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiZnVuY3Rpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJhbm5vdGF0aW9ucyI6IHsKKyAgICAgICJ0aXRsZSI6ICJNYXAgb2YgYW5ub3RhdGlvbiBuYW1lcyB0byB2YWx1ZXMiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfQorICAgIH0KKyAgfSwKKworICAidHlwZSI6ICJvYmplY3QiLAorICAicmVxdWlyZWQiOiBbCisgICAgIm5hbWUiLAorICAgICJlbnVtcyIsCisgICAgInR5cGVkZWZzIiwKKyAgICAic3RydWN0cyIsCisgICAgImNvbnN0YW50cyIsCisgICAgInNlcnZpY2VzIgorICBdLAorICAicHJvcGVydGllcyI6IHsKKyAgICAibmFtZSI6IHsKKyAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICB9LAorICAgICJpbmNsdWRlcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfSwKKyAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKKyAgICB9LAorICAgICJuYW1lc3BhY2VzIjogeworICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgICAgfQorICAgIH0sCisgICAgImVudW1zIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2VudW0iCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZWRlZnMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZWRlZiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJ1Y3RzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zdGFudHMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29uc3RhbnQiCisgICAgICB9CisgICAgfSwKKyAgICAic2VydmljZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2VydmljZSIKKyAgICAgIH0KKyAgICB9CisgIH0sCisgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCit9CmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg3YTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY2hlY2s6CisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1ZjY0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDEwIEBACisjIEphciB2ZXJzaW9ucworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKKworIyBEZXBlbmRlbmN5IHZlcnNpb25zCitqc29uLXNjaGVtYS12YWxpZGF0b3IudmVyc2lvbj0yLjIuNgorCisjIE1hdmVuIGRlcGVuZGVuY3kgZG93bmxvYWQgbG9jYXRpb25zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanNvbi90ZXN0L2J1aWxkLnhtbCBiL2xpYi9qc29uL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmEyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDE0NCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IkpTT04gU2NoZW1hIFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iCisgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgorCisgIDxkZXNjcmlwdGlvbj5KU09OIFNjaGVtYSBWYWxpZGF0aW9uIFRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2J1aWxkIiAvPgorICA8cHJvcGVydHkgbmFtZT0ianNvbi5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLmpzb24uZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2dlbi1qc29uIiAvPgorICA8cHJvcGVydHkgbmFtZT0ianNvbi5zY2hlbWEiIGxvY2F0aW9uPSIke2pzb24uZGlyfS9zY2hlbWEuanNvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS90b29scyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9saWIiLz4KKworICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnRlc3QuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS90ZXN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmNvbXBpbGVyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9jb21waWxlci9jcHAvdGhyaWZ0IiAvPgorCisgIDwhLS0gR2V0IG1hdmVuIGRlcGVuZGVuY3kgdmVyc2lvbnMgZnJvbSBoZXJlIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCisgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZXIuY2hlY2siPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGZpbGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iY29tcGlsZXIuY2hlY2ssIG1rZGlycywgbXZuLmluaXQiPgorICAgIDx0c3RhbXAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJta2RpcnMiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGliLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2dlbi5qc29uLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzb24iLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi5qc29uLmRpcn0iLz4KKyAgICAgIDxhcmcgbGluZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1RocmlmdFRlc3QudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqc29uOm1lcmdlIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4uanNvbi5kaXJ9Ii8+CisgICAgICA8YXJnIGxpbmU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9JbmNsdWRlLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHNjaGVtYSB2YWxpZGF0aW9uIgorICAgICAgICAgIGRlcGVuZHM9InZhbGlkYXRlLXNjaGVtYSwgdmFsaWRhdGUtZ2VuZXJhdGVkLWpzb24iLz4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLXNjaGVtYSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uZ2l0aHViLmZnZS5qc29uc2NoZW1hLm1haW4uY2xpLk1haW4iCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLS1zeW50YXgiLz4KKyAgICAgIDxhcmcgdmFsdWU9IiR7anNvbi5zY2hlbWF9Ii8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWdlbmVyYXRlZC1qc29uIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPHZhbGlkYXRlLWpzb24gZmlsZT0iJHtnZW4uanNvbi5kaXJ9L1RocmlmdFRlc3QuanNvbiIvPgorICAgIDx2YWxpZGF0ZS1qc29uIGZpbGU9IiR7Z2VuLmpzb24uZGlyfS9JbmNsdWRlLmpzb24iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW4uanNvbi5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9Im1rZGlycyxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmluaXQiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KKyAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgorCisgICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9InRlc3QuZGVwZW5kZW5jeS5qYXJzIj4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuZmdlIiBhcnRpZmFjdElkPSJqc29uLXNjaGVtYS12YWxpZGF0b3IiIHZlcnNpb249IiR7anNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb259Ii8+CisgICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+CisKKyAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5saWIuZGlyfSI+CisgICAgICA8ZmlsZXNldCByZWZpZD0idGVzdC5kZXBlbmRlbmN5LmphcnMiLz4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorICAgIDwvY29weT4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJ2YWxpZGF0ZS1qc29uIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIGRlZmF1bHQ9IiIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGphdmEgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICAgZGlyPSIke2pzb24uZGlyfSIKKyAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmdpdGh1Yi5mZ2UuanNvbnNjaGVtYS5tYWluLmNsaS5NYWluIgorICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCI+CisgICAgICAgIDxhcmcgbGluZT0iLS1mYWtlcm9vdCBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIi8+CisgICAgICAgIDxhcmcgdmFsdWU9IiR7anNvbi5zY2hlbWF9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9IkB7ZmlsZX0iLz4KKyAgICAgIDwvamF2YT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9sdWEvTWFrZWZpbGUuYW0gYi9saWIvbHVhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworU1VCRElSUyA9IC4KKworbGliX0xUTElCUkFSSUVTID0gXAorCQkJbGlibHVhc29ja2V0LmxhIFwKKwkJCWxpYmx1YWxvbmdudW1iZXIubGEgXAorCQkJbGlibHVhYnBhY2subGEgXAorCQkJbGlibHVhYml0d2lzZS5sYQorCitsaWJsdWFzb2NrZXRfbGFfU09VUkNFUyA9IFwKKwkJCXNyYy9sdWFzb2NrZXQuYyBcCisJCQlzcmMvdXNvY2tldC5jCisKK25vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSBzcmMvc29ja2V0LmgKKworbGlibHVhc29ja2V0X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhc29ja2V0X2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFzb2NrZXRfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KKworbGlibHVhYnBhY2tfbGFfU09VUkNFUyA9IHNyYy9sdWFicGFjay5jCisKK2xpYmx1YWJwYWNrX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhYnBhY2tfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWJwYWNrX2xhX0xJQkFERCA9IGxpYmx1YWxvbmdudW1iZXIubGEgJChMVUFfTElCKSAtbG0KKworbGlibHVhYml0d2lzZV9sYV9TT1VSQ0VTID0gc3JjL2x1YWJpdHdpc2UuYworCitsaWJsdWFiaXR3aXNlX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhYml0d2lzZV9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKQorbGlibHVhYml0d2lzZV9sYV9MSUJBREQgPSAkKExVQV9MSUIpIC1sbQorCitsaWJsdWFsb25nbnVtYmVyX2xhX1NPVVJDRVMgPSBcCisJCXNyYy9sdWFsb25nbnVtYmVyLmMgXAorCQlzcmMvbG9uZ251bWJlcnV0aWxzLmMKKworbGlibHVhbG9uZ251bWJlcl9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWxvbmdudW1iZXJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWxvbmdudW1iZXJfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KKworRVhUUkFfRElTVCA9IFwKKwkJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJCVRCaW5hcnlQcm90b2NvbC5sdWEgXAorCQlUQnVmZmVyZWRUcmFuc3BvcnQubHVhIFwKKwkJVENvbXBhY3RQcm90b2NvbC5sdWEgXAorCQlURnJhbWVkVHJhbnNwb3J0Lmx1YSBcCisJCVRocmlmdC5sdWEgXAorCQlUSHR0cFRyYW5zcG9ydC5sdWEgXAorCQlUSnNvblByb3RvY29sLmx1YSBcCisJCVRNZW1vcnlCdWZmZXIubHVhIFwKKwkJVFByb3RvY29sLmx1YSBcCisJCVRTZXJ2ZXIubHVhIFwKKwkJVFNvY2tldC5sdWEgXAorCQlUVHJhbnNwb3J0Lmx1YQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhIGIvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGU5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RCaW5hcnlQcm90b2NvbC5sdWEKQEAgLTAsMCArMSwyNjQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCisKK1RCaW5hcnlQcm90b2NvbCA9IF9fVE9iamVjdC5uZXcoVFByb3RvY29sQmFzZSwgeworICBfX3R5cGUgPSAnVEJpbmFyeVByb3RvY29sJywKKyAgVkVSU0lPTl9NQVNLID0gLTY1NTM2LCAtLSAweGZmZmYwMDAwCisgIFZFUlNJT05fMSAgICA9IC0yMTQ3NDE4MTEyLCAtLSAweDgwMDEwMDAwCisgIFRZUEVfTUFTSyAgICA9IDB4MDAwMDAwZmYsCisgIHN0cmljdFJlYWQgICA9IGZhbHNlLAorICBzdHJpY3RXcml0ZSAgPSB0cnVlCit9KQorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBpZiBzZWxmLnN0cmljdFdyaXRlIHRoZW4KKyAgICBzZWxmOndyaXRlSTMyKGxpYmx1YWJpdHdpc2UuYm9yKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEsIHR0eXBlKSkKKyAgICBzZWxmOndyaXRlU3RyaW5nKG5hbWUpCisgICAgc2VsZjp3cml0ZUkzMihzZXFpZCkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVTdHJpbmcobmFtZSkKKyAgICBzZWxmOndyaXRlQnl0ZSh0dHlwZSkKKyAgICBzZWxmOndyaXRlSTMyKHNlcWlkKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIHNlbGY6d3JpdGVCeXRlKHR0eXBlKQorICBzZWxmOndyaXRlSTE2KGlkKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUZpZWxkRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVGaWVsZFN0b3AoKQorICBzZWxmOndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVCeXRlKGt0eXBlKQorICBzZWxmOndyaXRlQnl0ZSh2dHlwZSkKKyAgc2VsZjp3cml0ZUkzMihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZU1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQnl0ZShldHlwZSkKKyAgc2VsZjp3cml0ZUkzMihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUxpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQnl0ZShldHlwZSkKKyAgc2VsZjp3cml0ZUkzMihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlQm9vbChib29sKQorICBpZiBib29sIHRoZW4KKyAgICBzZWxmOndyaXRlQnl0ZSgxKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUoMCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdzJywgaTE2KQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdpJywgaTMyKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdsJywgaTY0KQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdkJywgZHViKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVJMzIoc3RyaW5nLmxlbihzdHIpKQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIGxvY2FsIHN6LCB0dHlwZSwgbmFtZSwgc2VxaWQgPSBzZWxmOnJlYWRJMzIoKQorICBpZiBzeiA8IDAgdGhlbgorICAgIGxvY2FsIHZlcnNpb24gPSBsaWJsdWFiaXR3aXNlLmJhbmQoc3osIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0spCisgICAgaWYgdmVyc2lvbiB+PSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xIHRoZW4KKyAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgICBtZXNzYWdlID0gJ0JhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICcgLi4gc3oKKyAgICAgIH0pCisgICAgZW5kCisgICAgdHR5cGUgPSBsaWJsdWFiaXR3aXNlLmJhbmQoc3osIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0spCisgICAgbmFtZSA9IHNlbGY6cmVhZFN0cmluZygpCisgICAgc2VxaWQgPSBzZWxmOnJlYWRJMzIoKQorICBlbHNlCisgICAgaWYgc2VsZi5zdHJpY3RSZWFkIHRoZW4KKyAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAnTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInfSkKKyAgICBlbmQKKyAgICBuYW1lID0gc2VsZi50cmFuczpyZWFkQWxsKHN6KQorICAgIHR0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgc2VxaWQgPSBzZWxmOnJlYWRJMzIoKQorICBlbmQKKyAgcmV0dXJuIG5hbWUsIHR0eXBlLCBzZXFpZAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZFN0cnVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOnJlYWRCeXRlKCkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuIG5pbCwgdHR5cGUsIDAKKyAgZW5kCisgIGxvY2FsIGlkID0gc2VsZjpyZWFkSTE2KCkKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIGxvY2FsIGt0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHZ0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRJMzIoKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgbG9jYWwgZXR5cGUgPSBzZWxmOnJlYWRCeXRlKCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZEkzMigpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIGxvY2FsIGV0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRJMzIoKQorICByZXR1cm4gZXR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZFNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRCb29sKCkKKyAgbG9jYWwgYnl0ZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBpZiBieXRlID09IDAgdGhlbgorICAgIHJldHVybiBmYWxzZQorICBlbmQKKyAgcmV0dXJuIHRydWUKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRJMTYoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDIpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ3MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRJMzIoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDQpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2knLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDgpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2wnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWREb3VibGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDgpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2QnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTdHJpbmcoKQorICBsb2NhbCBsZW4gPSBzZWxmOnJlYWRJMzIoKQorICBsb2NhbCBzdHIgPSBzZWxmLnRyYW5zOnJlYWRBbGwobGVuKQorICByZXR1cm4gc3RyCitlbmQKKworVEJpbmFyeVByb3RvY29sRmFjdG9yeSA9IFRQcm90b2NvbEZhY3Rvcnk6bmV3eworICBfX3R5cGUgPSAnVEJpbmFyeVByb3RvY29sRmFjdG9yeScsCisgIHN0cmljdFJlYWQgPSBmYWxzZQorfQorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucywKKyAgICBzdHJpY3RSZWFkID0gc2VsZi5zdHJpY3RSZWFkLAorICAgIHN0cmljdFdyaXRlID0gdHJ1ZQorICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YSBiL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVmNGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsOTEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUQnVmZmVyZWRUcmFuc3BvcnQgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUQnVmZmVyZWRUcmFuc3BvcnQnLAorICByQnVmU2l6ZSA9IDIwNDgsCisgIHdCdWZTaXplID0gMjA0OCwKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycKK30KKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6aXNPcGVuKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6aXNPcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6cmVhZChsZW4pCisgIHJldHVybiBzZWxmLnRyYW5zOnJlYWQobGVuKQorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZEFsbChsZW4pCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OndyaXRlKGJ1ZikKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorICBpZiBzdHJpbmcubGVuKHNlbGYud0J1ZikgPj0gc2VsZi53QnVmU2l6ZSB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShzZWxmLndCdWYpCisgICAgc2VsZi53QnVmID0gJycKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OmZsdXNoKCkKKyAgaWYgc3RyaW5nLmxlbihzZWxmLndCdWYpID4gMCB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShzZWxmLndCdWYpCisgICAgc2VsZi53QnVmID0gJycKKyAgZW5kCitlbmQKKworVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5JworfQorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFRyYW5zcG9ydEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRCdWZmZXJlZFRyYW5zcG9ydDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVENvbXBhY3RQcm90b2NvbC5sdWEgYi9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsNDU3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworcmVxdWlyZSAnbGlibHVhbG9uZ251bWJlcicKKworVENvbXBhY3RQcm90b2NvbCA9IF9fVE9iamVjdC5uZXcoVFByb3RvY29sQmFzZSwgeworICBfX3R5cGUgPSAnVENvbXBhY3RQcm90b2NvbCcsCisgIENPTVBBQ1RfUFJPVE9DT0xfSUQgICAgICAgPSAweDgyLAorICBDT01QQUNUX1ZFUlNJT04gICAgICAgICAgID0gMSwKKyAgQ09NUEFDVF9WRVJTSU9OX01BU0sgICAgICA9IDB4MWYsCisgIENPTVBBQ1RfVFlQRV9NQVNLICAgICAgICAgPSAweEUwLAorICBDT01QQUNUX1RZUEVfQklUUyAgICAgICAgID0gMHgwNywKKyAgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCA9IDUsCisKKyAgLS0gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgLS0gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgbGFzdEZpZWxkID0ge30sCisgIGxhc3RGaWVsZElkID0gMCwKKyAgbGFzdEZpZWxkSW5kZXggPSAxLAorCisgIC0tIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAtLSBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgIGJvb2xlYW5GaWVsZE5hbWUgICAgPSAiIiwKKyAgYm9vbGVhbkZpZWxkSWQgICAgICA9IDAsCisgIGJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZSwKKworICAtLSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgLS0gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCisgIGJvb2xWYWx1ZSAgICAgICAgICA9IGZhbHNlLAorICBib29sVmFsdWVJc05vdE51bGwgPSBmYWxzZSwKK30pCisKK1RDb21wYWN0VHlwZSA9IHsKKyAgQ09NUEFDVF9CT09MRUFOX1RSVUUgID0gMHgwMSwKKyAgQ09NUEFDVF9CT09MRUFOX0ZBTFNFID0gMHgwMiwKKyAgQ09NUEFDVF9CWVRFICAgICAgICAgID0gMHgwMywKKyAgQ09NUEFDVF9JMTYgICAgICAgICAgID0gMHgwNCwKKyAgQ09NUEFDVF9JMzIgICAgICAgICAgID0gMHgwNSwKKyAgQ09NUEFDVF9JNjQgICAgICAgICAgID0gMHgwNiwKKyAgQ09NUEFDVF9ET1VCTEUgICAgICAgID0gMHgwNywKKyAgQ09NUEFDVF9CSU5BUlkgICAgICAgID0gMHgwOCwKKyAgQ09NUEFDVF9MSVNUICAgICAgICAgID0gMHgwOSwKKyAgQ09NUEFDVF9TRVQgICAgICAgICAgID0gMHgwQSwKKyAgQ09NUEFDVF9NQVAgICAgICAgICAgID0gMHgwQiwKKyAgQ09NUEFDVF9TVFJVQ1QgICAgICAgID0gMHgwQworfQorCitUVHlwZVRvQ29tcGFjdFR5cGUgPSB7fQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUT1BdICAgPSBUVHlwZS5TVE9QCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuQk9PTF0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkJZVEVdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CWVRFCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTE2XSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0kxNgorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkkzMl0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMzIKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JNjRdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTY0CitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuRE9VQkxFXSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0RPVUJMRQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUUklOR10gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CSU5BUlkKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5MSVNUXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfTElTVAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNFVF0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9TRVQKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5NQVBdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfTUFQCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuU1RSVUNUXSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX1NUUlVDVAorCitDb21wYWN0VHlwZVRvVFR5cGUgPSB7fQorQ29tcGFjdFR5cGVUb1RUeXBlW1RUeXBlLlNUT1BdICAgICAgICAgICAgICAgICAgICAgICAgPSBUVHlwZS5TVE9QCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFXSA9IFRUeXBlLkJPT0wKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX0ZBTFNFXSA9IFRUeXBlLkJPT0wKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CWVRFXSAgICAgICAgID0gVFR5cGUuQllURQorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0kxNl0gICAgICAgICAgPSBUVHlwZS5JMTYKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMzJdICAgICAgICAgID0gVFR5cGUuSTMyCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTY0XSAgICAgICAgICA9IFRUeXBlLkk2NAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0RPVUJMRV0gICAgICAgPSBUVHlwZS5ET1VCTEUKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9CSU5BUlldICAgICAgID0gVFR5cGUuU1RSSU5HCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfTElTVF0gICAgICAgICA9IFRUeXBlLkxJU1QKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9TRVRdICAgICAgICAgID0gVFR5cGUuU0VUCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfTUFQXSAgICAgICAgICA9IFRUeXBlLk1BUAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX1NUUlVDVF0gICAgICAgPSBUVHlwZS5TVFJVQ1QKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZXNldExhc3RGaWVsZCgpCisgIHNlbGYubGFzdEZpZWxkID0ge30KKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IDEKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnBhY2tDb21wYWN0VHlwZShrdHlwZSwgdnR5cGUpCisgIHJldHVybiBsaWJsdWFiaXR3aXNlLmJvcihsaWJsdWFiaXR3aXNlLnNoaWZ0bChrdHlwZSwgNCksIHZ0eXBlKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBzZWxmOndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfUFJPVE9DT0xfSUQpCisgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJwYWNrLnBhY2tNZXNnVHlwZShUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVkVSU0lPTiwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVkVSU0lPTl9NQVNLLHR0eXBlLAorICAgIFRDb21wYWN0UHJvdG9jb2wuQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVFlQRV9NQVNLKSkKKyAgc2VsZjp3cml0ZVZhcmludDMyKHNlcWlkKQorICBzZWxmOndyaXRlU3RyaW5nKG5hbWUpCisgIHNlbGY6cmVzZXRMYXN0RmllbGQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggKyAxCisgIHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdID0gc2VsZi5sYXN0RmllbGRJZAorICBzZWxmLmxhc3RGaWVsZElkID0gMAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCAtIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBzZWxmLmJvb2xlYW5GaWVsZE5hbWUgPSBuYW1lCisgICAgc2VsZi5ib29sZWFuRmllbGRJZCAgID0gaWQKKyAgICBzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSB0cnVlCisgIGVsc2UKKyAgICBzZWxmOndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR0eXBlLCBpZCwgLTEpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkU3RvcCgpCisgIHNlbGY6d3JpdGVCeXRlKFRUeXBlLlNUT1ApOworZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgIGlmIHNpemUgPT0gMCB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUoMCkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVWYXJpbnQzMihzaXplKQorICAgIHNlbGY6d3JpdGVCeXRlKHNlbGY6cGFja0NvbXBhY3RUeXBlKFRUeXBlVG9Db21wYWN0VHlwZVtrdHlwZV0sIFRUeXBlVG9Db21wYWN0VHlwZVt2dHlwZV0pKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWFwRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU2V0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJvb2woYm9vbCkKKyAgbG9jYWwgdmFsdWUgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX0ZBTFNFCisgIGlmIGJvb2wgdGhlbgorICAgIHZhbHVlID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9UUlVFCisgIGVuZAorICBwcmludCh2YWx1ZSxzZWxmLmJvb2xlYW5GaWVsZFBlbmRpbmcsc2VsZi5ib29sZWFuRmllbGRJZCkKKyAgaWYgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nIHRoZW4KKyAgICBzZWxmOndyaXRlRmllbGRCZWdpbkludGVybmFsKHNlbGYuYm9vbGVhbkZpZWxkTmFtZSwgVFR5cGUuQk9PTCwgc2VsZi5ib29sZWFuRmllbGRJZCwgdmFsdWUpCisgICAgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nID0gZmFsc2UKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKHZhbHVlKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUkxNihpMTYpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihsaWJsdWFicGFjay5pMzJUb1ppZ3phZyhpMTYpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJMzIoaTMyKQorICBzZWxmOndyaXRlVmFyaW50MzIobGlibHVhYnBhY2suaTMyVG9aaWd6YWcoaTMyKSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgc2VsZjp3cml0ZVZhcmludDY0KGxpYmx1YWJwYWNrLmk2NFRvWmlnemFnKGk2NCkpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnZCcsIGR1YikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTdHJpbmcoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZUJpbmFyeShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJpbmFyeShzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlVmFyaW50MzIoc3RyaW5nLmxlbihzdHIpKQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIHR0eXBlLCBpZCwgdHlwZU92ZXJyaWRlKQorICBpZiB0eXBlT3ZlcnJpZGUgPT0gLTEgdGhlbgorICAgIHR5cGVPdmVycmlkZSA9IFRUeXBlVG9Db21wYWN0VHlwZVt0dHlwZV0KKyAgZW5kCisgIGxvY2FsIG9mZnNldCA9IGlkIC0gc2VsZi5sYXN0RmllbGRJZAorICBpZiBpZCA+IHNlbGYubGFzdEZpZWxkSWQgYW5kIG9mZnNldCA8PSAxNSB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwob2Zmc2V0LCA0KSwgdHlwZU92ZXJyaWRlKSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKHR5cGVPdmVycmlkZSkKKyAgICBzZWxmOndyaXRlSTE2KGlkKQorICBlbmQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IGlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKKyAgaWYgc2l6ZSA8PSAxNCB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwoc2l6ZSwgNCksIFRUeXBlVG9Db21wYWN0VHlwZVtldHlwZV0pKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUJ5dGUobGlibHVhYml0d2lzZS5ib3IoMHhmMCwgVFR5cGVUb0NvbXBhY3RUeXBlW2V0eXBlXSkpCisgICAgc2VsZjp3cml0ZVZhcmludDMyKHNpemUpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVWYXJpbnQzMihpMzIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBsb2NhbCBzdHIgPSBsaWJsdWFicGFjay50b1ZhcmludDMyKGkzMikKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVZhcmludDY0KGk2NCkKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIGxvY2FsIHN0ciA9IGxpYmx1YWJwYWNrLnRvVmFyaW50NjQoaTY0KQorICBzZWxmLnRyYW5zOndyaXRlKHN0cikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNZXNzYWdlQmVnaW4oKQorICBsb2NhbCBwcm90b2NvbElkID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBpZiBwcm90b2NvbElkIH49IHNlbGYuQ09NUEFDVF9QUk9UT0NPTF9JRCB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gIkV4cGVjdGVkIHByb3RvY29sIGlkICIgLi4gc2VsZi5DT01QQUNUX1BST1RPQ09MX0lEIC4uICIgYnV0IGdvdCAiIC4uIHByb3RvY29sSWR9KQorICBlbmQKKyAgbG9jYWwgdmVyc2lvbkFuZFR5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIHZlcnNpb24gPSBsaWJsdWFiaXR3aXNlLmJhbmQodmVyc2lvbkFuZFR5cGUsIHNlbGYuQ09NUEFDVF9WRVJTSU9OX01BU0spCisgIGxvY2FsIHR0eXBlID0gbGlibHVhYml0d2lzZS5iYW5kKGxpYmx1YWJpdHdpc2Uuc2hpZnRyKHZlcnNpb25BbmRUeXBlLAorICAgIHNlbGYuQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCksIHNlbGYuQ09NUEFDVF9UWVBFX0JJVFMpCisgIGlmIHZlcnNpb24gfj0gc2VsZi5DT01QQUNUX1ZFUlNJT04gdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCB2ZXJzaW9uICIgLi4gc2VsZi5DT01QQUNUX1ZFUlNJT04gLi4gIiBidXQgZ290ICIgLi4gdmVyc2lvbn0pCisgIGVuZAorICBsb2NhbCBzZXFpZCA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZFN0cmluZygpCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRNZXNzYWdlRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdID0gc2VsZi5sYXN0RmllbGRJZAorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCArIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKKyAgcmV0dXJuIG5pbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFN0cnVjdEVuZCgpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4IC0gMQorICBzZWxmLmxhc3RGaWVsZElkID0gc2VsZi5sYXN0RmllbGRbc2VsZi5sYXN0RmllbGRJbmRleF0KK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgZmllbGRfYW5kX3R0eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCB0dHlwZSA9IHNlbGY6Z2V0VFR5cGUoZmllbGRfYW5kX3R0eXBlKQorICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QIHRoZW4KKyAgICByZXR1cm4gbmlsLCB0dHlwZSwgMAorICBlbmQKKyAgLS0gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBsb2NhbCBtb2RpZmllciA9IGxpYmx1YWJpdHdpc2Uuc2hpZnRyKGxpYmx1YWJpdHdpc2UuYmFuZChmaWVsZF9hbmRfdHR5cGUsIDB4ZjApLCA0KQorICBsb2NhbCBpZCA9IDAKKyAgaWYgbW9kaWZpZXIgPT0gMCB0aGVuCisgICAgaWQgPSBzZWxmOnJlYWRJMTYoKQorICBlbHNlCisgICAgaWQgPSBzZWxmLmxhc3RGaWVsZElkICsgbW9kaWZpZXIKKyAgZW5kCisgIGlmIHR0eXBlID09IFRUeXBlLkJPT0wgdGhlbgorICAgIGJvb2xWYWx1ZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChmaWVsZF9hbmRfdHR5cGUsIDB4MGYpID09IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorICAgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IHRydWUKKyAgZW5kCisgIHNlbGYubGFzdEZpZWxkSWQgPSBpZAorICByZXR1cm4gbmlsLCB0dHlwZSwgaWQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBpZiBzaXplIDwgMCB0aGVuCisgICAgcmV0dXJuIG5pbCxuaWwsbmlsCisgIGVuZAorICBsb2NhbCBrdnR5cGUgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGxvY2FsIGt0eXBlID0gc2VsZjpnZXRUVHlwZShsaWJsdWFiaXR3aXNlLnNoaWZ0cihrdnR5cGUsIDQpKQorICBsb2NhbCB2dHlwZSA9IHNlbGY6Z2V0VFR5cGUoa3Z0eXBlKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWFwRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRMaXN0QmVnaW4oKQorICBsb2NhbCBzaXplX2FuZF90eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBzaXplID0gbGlibHVhYml0d2lzZS5iYW5kKGxpYmx1YWJpdHdpc2Uuc2hpZnRyKHNpemVfYW5kX3R5cGUsIDQpLCAweDBmKQorICBpZiBzaXplID09IDE1IHRoZW4KKyAgICBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBlbmQKKyAgaWYgc2l6ZSA8IDAgdGhlbgorICAgIHJldHVybiBuaWwsbmlsCisgIGVuZAorICBsb2NhbCBldHlwZSA9IHNlbGY6Z2V0VFR5cGUobGlibHVhYml0d2lzZS5iYW5kKHNpemVfYW5kX3R5cGUsIDB4MGYpKQorICByZXR1cm4gZXR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRMaXN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIHJldHVybiBzZWxmOnJlYWRMaXN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNldEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkQm9vbCgpCisgIGlmIGJvb2xWYWx1ZUlzTm90TnVsbCB0aGVuCisgICAgYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorICAgIHJldHVybiBib29sVmFsdWUKKyAgZW5kCisgIGxvY2FsIHZhbCA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgaWYgdmFsID09IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRSB0aGVuCisgICAgcmV0dXJuIHRydWUKKyAgZW5kCisgIHJldHVybiBmYWxzZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBidWZmID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ0MnLCBidWZmKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTE2KCkKKyAgcmV0dXJuIHNlbGY6cmVhZEkzMigpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTMyKCkKKyAgbG9jYWwgdiA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgdmFsdWUgPSBsaWJsdWFicGFjay56aWd6YWdUb0kzMih2KQorICByZXR1cm4gdmFsdWUKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCB2YWx1ZSA9IHNlbGY6cmVhZFZhcmludDY0KCkKKyAgcmV0dXJuIHZhbHVlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg4KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdkJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFN0cmluZygpCisgIHJldHVybiBzZWxmOnJlYWRCaW5hcnkoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJpbmFyeSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGlmIHNpemUgPD0gMCB0aGVuCisgICAgcmV0dXJuICIiCisgIGVuZAorICByZXR1cm4gc2VsZi50cmFuczpyZWFkQWxsKHNpemUpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkVmFyaW50MzIoKQorICBsb2NhbCBzaGlmdGwgPSAwCisgIGxvY2FsIHJlc3VsdCA9IDAKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGIgPSBzZWxmOnJlYWRCeXRlKCkKKyAgICByZXN1bHQgPSBsaWJsdWFiaXR3aXNlLmJvcihyZXN1bHQsCisgICAgICAgICAgICAgbGlibHVhYml0d2lzZS5zaGlmdGwobGlibHVhYml0d2lzZS5iYW5kKGIsIDB4N2YpLCBzaGlmdGwpKQorICAgIGlmIGxpYmx1YWJpdHdpc2UuYmFuZChiLCAweDgwKSB+PSAweDgwIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgc2hpZnRsID0gc2hpZnRsICsgNworICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFZhcmludDY0KCkKKyAgbG9jYWwgcmVzdWx0ID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgbG9jYWwgZGF0YSA9IHJlc3VsdCgwKQorICBsb2NhbCBzaGlmdGwgPSAwCisgIHdoaWxlIHRydWUgZG8KKyAgICBiID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgZW5kRmxhZywgZGF0YSA9IGxpYmx1YWJwYWNrLmZyb21WYXJpbnQ2NChiLCBzaGlmdGwsIGRhdGEpCisgICAgc2hpZnRsID0gc2hpZnRsICsgNworICAgIGlmIGVuZEZsYWcgPT0gMCB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIGRhdGEKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOmdldFRUeXBlKGN0eXBlKQorICByZXR1cm4gQ29tcGFjdFR5cGVUb1RUeXBlW2xpYmx1YWJpdHdpc2UuYmFuZChjdHlwZSwgMHgwZildCitlbmQKKworVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5JywKK30KKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpCisgIC0tIFRPRE8gRW5mb3JjZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHRyYW5zcG9ydCBjbGFzcyAoaWUgbm90IGEgYm9vbCkKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVENvbXBhY3RQcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGUyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsMTE4IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKK3JlcXVpcmUgJ2xpYmx1YWJwYWNrJworCitURnJhbWVkVHJhbnNwb3J0ID0gVFRyYW5zcG9ydEJhc2U6bmV3eworICBfX3R5cGUgPSAnVEZyYW1lZFRyYW5zcG9ydCcsCisgIGRvUmVhZCA9IHRydWUsCisgIGRvV3JpdGUgPSB0cnVlLAorICB3QnVmID0gJycsCisgIHJCdWYgPSAnJworfQorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpvcGVuKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6b3BlbigpCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0OnJlYWQobGVuKQorICBpZiBzdHJpbmcubGVuKHNlbGYuckJ1ZikgPT0gMCB0aGVuCisgICAgc2VsZjpfX3JlYWRGcmFtZSgpCisgIGVuZAorCisgIGlmIHNlbGYuZG9SZWFkID09IGZhbHNlIHRoZW4KKyAgICByZXR1cm4gc2VsZi50cmFuczpyZWFkKGxlbikKKyAgZW5kCisKKyAgaWYgbGVuID4gc3RyaW5nLmxlbihzZWxmLnJCdWYpIHRoZW4KKyAgICBsb2NhbCB2YWwgPSBzZWxmLnJCdWYKKyAgICBzZWxmLnJCdWYgPSAnJworICAgIHJldHVybiB2YWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGxlbikKKyAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGxlbisxKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpfX3JlYWRGcmFtZSgpCisgIGxvY2FsIGJ1ZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg0KQorICBsb2NhbCBmcmFtZV9sZW4gPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmKQorICBzZWxmLnJCdWYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoZnJhbWVfbGVuKQorZW5kCisKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDp3cml0ZShidWYsIGxlbikKKyAgaWYgc2VsZi5kb1dyaXRlID09IGZhbHNlIHRoZW4KKyAgICByZXR1cm4gc2VsZi50cmFuczp3cml0ZShidWYsIGxlbikKKyAgZW5kCisKKyAgaWYgbGVuIGFuZCBsZW4gPCBzdHJpbmcubGVuKGJ1ZikgdGhlbgorICAgIGJ1ZiA9IHN0cmluZy5zdWIoYnVmLCAwLCBsZW4pCisgIGVuZAorICBzZWxmLndCdWYgPSBzZWxmLndCdWYgLi4gYnVmCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpmbHVzaCgpCisgIGlmIHNlbGYuZG9Xcml0ZSA9PSBmYWxzZSB0aGVuCisgICAgcmV0dXJuIHNlbGYudHJhbnM6Zmx1c2goKQorICBlbmQKKworICAtLSBJZiB0aGUgd3JpdGUgZmFpbHMgd2Ugc3RpbGwgd2FudCB3QnVmIHRvIGJlIGNsZWFyCisgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgorICBzZWxmLndCdWYgPSAnJworICBsb2NhbCBmcmFtZV9sZW5fYnVmID0gbGlibHVhYnBhY2suYnBhY2soImkiLCBzdHJpbmcubGVuKHRtcCkpCisgIHRtcCA9IGZyYW1lX2xlbl9idWYgLi4gdG1wCisgIHNlbGYudHJhbnM6d3JpdGUodG1wKQorICBzZWxmLnRyYW5zOmZsdXNoKCkKK2VuZAorCitURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeScKK30KK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEZyYW1lZFRyYW5zcG9ydDpuZXd7dHJhbnMgPSB0cmFuc30KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RIdHRwVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUxZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKQEAgLTAsMCArMSwxODIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUSHR0cFRyYW5zcG9ydCA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RIdHRwVHJhbnNwb3J0JywKKyAgcGF0aCA9ICcvJywKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycsCisgIENSTEYgPSAnXHJcbicsCisgIFZFUlNJT04gPSB2ZXJzaW9uLAorICBpc1NlcnZlciA9IHRydWUKK30KKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcih0dHlwZShzZWxmKSAuLiAnbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSB0cmFuc3BvcnQgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai50cmFucyB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCisgIGVuZAorCisgIHJldHVybiBUVHJhbnNwb3J0QmFzZS5uZXcoc2VsZiwgb2JqKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmNsb3NlKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OnJlYWRBbGwobGVuKQorICByZXR1cm4gc2VsZjpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkKGxlbikKKyAgaWYgc3RyaW5nLmxlbihzZWxmLnJCdWYpID09IDAgdGhlbgorICAgIHNlbGY6X3JlYWRNc2coKQorICBlbmQKKyAgaWYgbGVuID4gc3RyaW5nLmxlbihzZWxmLnJCdWYpIHRoZW4KKyAgICBsb2NhbCB2YWwgPSBzZWxmLnJCdWYKKyAgICBzZWxmLnJCdWYgPSAnJworICAgIHJldHVybiB2YWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGxlbikKKyAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGxlbisxKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3JlYWRNc2coKQorICB3aGlsZSB0cnVlIGRvCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZCg0KQorICAgIGlmIHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRikgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIGlmIG5vdCBzZWxmLnJCdWYgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorICBzZWxmOmdldExpbmUoKQorICBsb2NhbCBoZWFkZXJzID0gc2VsZjpfcGFyc2VIZWFkZXJzKCkKKyAgaWYgbm90IGhlYWRlcnMgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorCisgIGxvY2FsIGxlbmd0aCA9IHRvbnVtYmVyKGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCisgIGlmIGxlbmd0aCB0aGVuCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nLmxlbihzZWxmLnJCdWYpCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZEFsbChsZW5ndGgpCisgIGVuZAorICBpZiBzZWxmLnJCdWYgPT0gbmlsIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpnZXRMaW5lKCkKKyAgbG9jYWwgYSxiID0gc3RyaW5nLmZpbmQoc2VsZi5yQnVmLCBzZWxmLkNSTEYpCisgIGxvY2FsIGxpbmUgPSAiIgorICBpZiBhIGFuZCBiIHRoZW4KKyAgICBsaW5lID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGEtMSkKKyAgICBzZWxmLnJCdWYgPSBzdHJpbmcuc3ViKHNlbGYuckJ1ZiwgYisxKQorICBlbmQKKyAgcmV0dXJuIGxpbmUKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpfcGFyc2VIZWFkZXJzKCkKKyAgbG9jYWwgaGVhZGVycyA9IHt9CisKKyAgcmVwZWF0CisgICAgbG9jYWwgbGluZSA9IHNlbGY6Z2V0TGluZSgpCisgICAgZm9yIGtleSwgdmFsIGluIHN0cmluZy5nbWF0Y2gobGluZSwgIihbJXclLV0rKSVzKjolcyooLispIikgZG8KKyAgICAgIGlmIGhlYWRlcnNba2V5XSB0aGVuCisgICAgICAgIGxvY2FsIGRlbGltaXRlciA9ICIsICIKKyAgICAgICAgaWYga2V5ID09ICJTZXQtQ29va2llIiB0aGVuCisgICAgICAgICAgZGVsaW1pdGVyID0gIjsgIgorICAgICAgICBlbmQKKyAgICAgICAgaGVhZGVyc1trZXldID0gaGVhZGVyc1trZXldIC4uIGRlbGltaXRlciAuLiB0b3N0cmluZyh2YWwpCisgICAgICBlbHNlCisgICAgICAgIGhlYWRlcnNba2V5XSA9IHRvc3RyaW5nKHZhbCkKKyAgICAgIGVuZAorICAgIGVuZAorICB1bnRpbCBzdHJpbmcuZmluZChsaW5lLCAiXiVzKiQiKQorCisgIHJldHVybiBoZWFkZXJzCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6d3JpdGUoYnVmLCBsZW4pCisgIGlmIGxlbiBhbmQgbGVuIDwgc3RyaW5nLmxlbihidWYpIHRoZW4KKyAgICBidWYgPSBzdHJpbmcuc3ViKGJ1ZiwgMCwgbGVuKQorICBlbmQKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlSHR0cEhlYWRlcihjb250ZW50X2xlbikKKyAgaWYgc2VsZi5pc1NlcnZlciB0aGVuCisgICAgbG9jYWwgaGVhZGVyID0gICJIVFRQLzEuMSAyMDAgT0siIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlNlcnZlcjogVGhyaWZ0LyIgLi4gc2VsZi5WRVJTSU9OIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbHNlCisgICAgbG9jYWwgaGVhZGVyID0gIlBPU1QgIiAuLiBzZWxmLnBhdGggLi4gIiBIVFRQLzEuMSIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiSG9zdDogIiAuLiBzZWxmLnRyYW5zLmhvc3QgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCAiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlVzZXItQWdlbnQ6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiAiIChMdWEvVEh0dHBDbGllbnQpIgorICAgICAgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpmbHVzaCgpCisgIC0tIElmIHRoZSB3cml0ZSBmYWlscyB3ZSBzdGlsbCB3YW50IHdCdWYgdG8gYmUgY2xlYXIKKyAgbG9jYWwgdG1wID0gc2VsZi53QnVmCisgIHNlbGYud0J1ZiA9ICcnCisgIHNlbGY6d3JpdGVIdHRwSGVhZGVyKHN0cmluZy5sZW4odG1wKSkKKyAgc2VsZi50cmFuczp3cml0ZSh0bXApCisgIHNlbGYudHJhbnM6Zmx1c2goKQorZW5kCisKK1RIdHRwVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydEZhY3RvcnknCit9CitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KHRyYW5zKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUSHR0cFRyYW5zcG9ydDpuZXd7dHJhbnMgPSB0cmFuc30KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USnNvblByb3RvY29sLmx1YSBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOGVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKQEAgLTAsMCArMSw3MjcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKSwgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCisKK1RKU09OUHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2wnLAorICBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OID0gMSwKKyAganNvbkNvbnRleHQgPSB7fSwKKyAganNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9LAorICBqc29uQ29udGV4dEluZGV4ID0gMSwKKyAgaGFzUmVhZEJ5dGUgPSAiIgorfSkKKworVFR5cGVUb1N0cmluZyA9IHt9CitUVHlwZVRvU3RyaW5nW1RUeXBlLkJPT0xdICAgPSAidGYiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkJZVEVdICAgPSAiaTgiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkkxNl0gICAgPSAiaTE2IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMzJdICAgID0gImkzMiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTY0XSAgICA9ICJpNjQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkRPVUJMRV0gPSAiZGJsIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TVFJJTkddID0gInN0ciIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSVUNUXSA9ICJyZWMiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkxJU1RdICAgPSAibHN0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TRVRdICAgID0gInNldCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuTUFQXSAgICA9ICJtYXAiCisKK1N0cmluZ1RvVFR5cGUgPSB7CisgIHRmICA9IFRUeXBlLkJPT0wsCisgIGk4ICA9IFRUeXBlLkJZVEUsCisgIGkxNiA9IFRUeXBlLkkxNiwKKyAgaTMyID0gVFR5cGUuSTMyLAorICBpNjQgPSBUVHlwZS5JNjQsCisgIGRibCA9IFRUeXBlLkRPVUJMRSwKKyAgc3RyID0gVFR5cGUuU1RSSU5HLAorICByZWMgPSBUVHlwZS5TVFJVQ1QsCisgIG1hcCA9IFRUeXBlLk1BUCwKKyAgc2V0ID0gVFR5cGUuU0VULAorICBsc3QgPSBUVHlwZS5MSVNUCit9CisKK0pTT05Ob2RlID0geworICBPYmplY3RCZWdpbiA9ICd7JywKKyAgT2JqZWN0RW5kID0gJ30nLAorICBBcnJheUJlZ2luID0gJ1snLAorICBBcnJheUVuZCA9ICddJywKKyAgUGFpclNlcGFyYXRvciA9ICc6JywKKyAgRWxlbVNlcGFyYXRvciA9ICcsJywKKyAgQmFja3NsYXNoID0gJ1xcJywKKyAgU3RyaW5nRGVsaW1pdGVyID0gJyInLAorICBaZXJvQ2hhciA9ICcwJywKKyAgRXNjYXBlQ2hhciA9ICd1JywKKyAgTmFuID0gJ05hTicsCisgIEluZmluaXR5ID0gJ0luZmluaXR5JywKKyAgTmVnYXRpdmVJbmZpbml0eSA9ICctSW5maW5pdHknLAorICBFc2NhcGVDaGFycyA9ICJcIlxcYmZucnQiLAorICBFc2NhcGVQcmVmaXggPSAiXFx1MDAiCit9CisKK0VzY2FwZUNoYXJWYWxzID0geworICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcKK30KKworSlNPTkNoYXJUYWJsZSA9IHsKKyAgLS0wICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDk4LDExNiwxMTAsICAwLDEwMiwxMTQsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAxLDM0LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK30KKworLS0gY2hhcmFjdGVyIHRhYmxlIHN0cmluZworbG9jYWwgYj0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycKKworLS0gZW5jb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9lbmNvZGUoZGF0YSkKKyAgICByZXR1cm4gKChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KSAKKyAgICAgICAgbG9jYWwgcixiPScnLHg6Ynl0ZSgpCisgICAgICAgIGZvciBpPTgsMSwtMSBkbyByPXIuLihiJTJeaS1iJTJeKGktMSk+MCBhbmQgJzEnIG9yICcwJykgZW5kCisgICAgICAgIHJldHVybiByOworICAgIGVuZCkuLicwMDAwJyk6Z3N1YignJWQlZCVkPyVkPyVkPyVkPycsIGZ1bmN0aW9uKHgpCisgICAgICAgIGlmICgjeCA8IDYpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw2IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig2LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gYjpzdWIoYysxLGMrMSkKKyAgICBlbmQpLi4oeyAnJywgJz09JywgJz0nIH0pWyNkYXRhJTMrMV0pCitlbmQKKworLS0gZGVjb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9kZWNvZGUoZGF0YSkKKyAgICBkYXRhID0gc3RyaW5nLmdzdWIoZGF0YSwgJ1teJy4uYi4uJz1dJywgJycpCisgICAgcmV0dXJuIChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoeCA9PSAnPScpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCByLGY9JycsKGI6ZmluZCh4KS0xKQorICAgICAgICBmb3IgaT02LDEsLTEgZG8gcj1yLi4oZiUyXmktZiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggfj0gOCkgdGhlbiByZXR1cm4gJycgZW5kCisgICAgICAgIGxvY2FsIGM9MAorICAgICAgICBmb3IgaT0xLDggZG8gYz1jKyh4OnN1YihpLGkpPT0nMScgYW5kIDJeKDgtaSkgb3IgMCkgZW5kCisgICAgICAgIHJldHVybiBzdHJpbmcuY2hhcihjKQorICAgIGVuZCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZXNldENvbnRleHQoKQorICBzZWxmLmpzb25Db250ZXh0ID0ge30KKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gdHJ1ZX0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFB1c2goY29udGV4dCkKKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4ICsgMQorICBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0gPSBzZWxmLmpzb25Db250ZXh0VmFsCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBjb250ZXh0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpjb250ZXh0UG9wKCkKKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHNlbGYuanNvbkNvbnRleHRbc2VsZi5qc29uQ29udGV4dEluZGV4XQorICBzZWxmLmpzb25Db250ZXh0SW5kZXggPSBzZWxmLmpzb25Db250ZXh0SW5kZXggLSAxCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDplc2NhcGVOdW0oKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgIHJldHVybiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLm51bGwgdGhlbgorICAgIHJldHVybgorICBlbmQKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCB0aGVuCisgICAgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCA9IGZhbHNlCisgIGVsc2UKKyAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiB0aGVuCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpoZXhDaGFyKHZhbCkKKyAgdmFsID0gbGlibHVhYml0d2lzZS5iYW5kKHZhbCwgMHgwZikKKyAgaWYgdmFsIDwgMTAgdGhlbgorICAgIHJldHVybiB2YWwgKyA0OAorICBlbHNlCisgICAgcmV0dXJuIHZhbCArIDg3CisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5Fc2NhcGVQcmVmaXgpCisgIGxvY2FsIG91dENoID0gaGV4Q2hhcihsaWJsdWFiaXR3aXNlLnNoaWZ0cihjaCwgNCkpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgIG91dENoID0gaGV4Q2hhcihjaCkKKyAgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkNoYXIoYnl0ZSkKKyAgY2ggPSBzdHJpbmcuYnl0ZShieXRlKQorICBpZiBjaCA+PSAweDMwIHRoZW4KKyAgICBpZiBjaCA9PSBKU09OTm9kZS5CYWNrc2xhc2ggdGhlbgorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZW5kCisgIGVsc2UKKyAgICBsb2NhbCBvdXRDaCA9IEpTT05DaGFyVGFibGVbY2grMV0KKyAgICBpZiBvdXRDaCA9PSAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZSkKKyAgICBlbHNlaWYgb3V0Q2ggPiAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgICAgZWxzZQorICAgICAgc2VsZjp3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTlN0cmluZyhzdHIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIC0tIFRPRE8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycworICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgaWkgPSAxCisgIHdoaWxlIGlpIDw9IGxlbmd0aCBkbworICAgIHNlbGY6d3JpdGVKU09OQ2hhcihzdHJpbmcuc3ViKHN0ciwgaWksIGlpKSkKKyAgICBpaSA9IGlpICsgMQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05CYXNlNjQoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gMyBkbworICAgIC0tIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrMykpCisgICAgc2VsZi50cmFuczp3cml0ZShieXRlcykKKyAgICBsZW5ndGggPSBsZW5ndGggLSAzCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMworICBlbmQKKyAgaWYgbGVuZ3RoID4gMCB0aGVuCisgICAgbG9jYWwgYnl0ZXMgPSBiYXNlNjRfZW5jb2RlKHN0cmluZy5zdWIoc3RyLCBvZmZzZXQsIG9mZnNldCtsZW5ndGgpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkludGVnZXIobnVtKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgbG9jYWwgbnVtc3RyID0gIiIgLi4gbnVtCisgIG51bXN0ciA9IHN0cmluZy5zdWIobnVtc3RyLCBzdHJpbmcuZmluZChudW1zdHIsICJeWystXT8lZCsiKSkKKyAgc2VsZi50cmFuczp3cml0ZShudW1zdHIpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkRvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgdmFsID0gIiIgLi4gZHViCisgIGxvY2FsIHByZWZpeCA9IHN0cmluZy5zdWIodmFsLCAxLCAxKQorICBsb2NhbCBzcGVjaWFsID0gZmFsc2UKKyAgaWYgcHJlZml4ID09ICdOJyBvciBwcmVmaXggPT0gJ24nIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5OYW4KKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICdJJyBvciBwcmVmaXggPT0gJ2knIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5JbmZpbml0eQorICAgIHNwZWNpYWwgPSB0cnVlCisgIGVsc2VpZiBwcmVmaXggPT0gJy0nIHRoZW4KKyAgICBsb2NhbCBzZWNvbmRCeXRlID0gc3RyaW5nLnN1Yih2YWwsIDIsIDIpCisgICAgaWYgc2Vjb25kQnl0ZSA9PSAnSScgb3Igc2Vjb25kQnl0ZSA9PSAnaScgdGhlbgorICAgICAgdmFsID0gSlNPTk5vZGUuTmVnYXRpdmVJbmZpbml0eQorICAgICAgc3BlY2lhbCA9IHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUodmFsKQorICBpZiBzcGVjaWFsIG9yIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLk9iamVjdEJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAxLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQXJyYXlFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKFRKU09OUHJvdG9jb2wuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHR0eXBlKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2VxaWQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihpZCkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdHR5cGVdKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2t0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1t2dHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorICByZXR1cm4gc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2V0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNpemUpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGlmIGJvb2wgdGhlbgorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigxKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKDApCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCeXRlKGJ5dGUpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIGJ5dGUpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ3MnLCBpMTYpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ3MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMzIoaTMyKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2knLCBpMzIpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2knLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJNjQoaTY0KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2wnLCBpNjQpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2wnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodG9zdHJpbmcodmFsKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgc2VsZjp3cml0ZUpTT05Eb3VibGUoc3RyaW5nLmZvcm1hdCgiJS4xNmYiLCBkdWIpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJpbmcoc3RyKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUJpbmFyeShzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlSlNPTkJhc2U2NChzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN5bnRheENoYXIoY2gpCisgIGxvY2FsIGNoMiA9ICIiCisgIGlmIHNlbGYuaGFzUmVhZEJ5dGUgfj0gIiIgdGhlbgorICAgIGNoMiA9IHNlbGYuaGFzUmVhZEJ5dGUKKyAgICBzZWxmLmhhc1JlYWRCeXRlID0gIiIKKyAgZWxzZQorICAgIGNoMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBlbmQKKyAgaWYgY2gyIH49IGNoIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkICIuLiBjaCAuLiAiLCBnb3QgIiAuLiBjaDJ9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5QYWlyU2VwYXJhdG9yKQorICAgICAgICBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4VmFsKGNoKQorICBsb2NhbCB2YWwgPSBzdHJpbmcuYnl0ZShjaCkKKyAgaWYgdmFsID49IDQ4IGFuZCB2YWwgPD0gNTcgdGhlbgorICAgIHJldHVybiB2YWwgLSA0OAorICBlbHNlaWYgdmFsID49IDk3IGFuZCB2YWwgPD0gMTAyIHRoZW4KKyAgICByZXR1cm4gdmFsIC0gODcKKyAgZWxzZQorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgIiAuLiBjaH0pCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5aZXJvQ2hhcikKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIGxvY2FsIGIxID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIGIyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIHJldHVybiBsaWJsdWFiaXR3aXNlLnNoaWZ0bChzZWxmOmhleFZhbChiMSksIDQpICsgc2VsZjpoZXhWYWwoYjIpCitlbmQKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OU3RyaW5nKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgICBpZiBjaCA9PSBKU09OTm9kZS5Fc2NhcGVDaGFyIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTkVzY2FwZUNoYXIoY2gpCisgICAgICBlbHNlCisgICAgICAgIGxvY2FsIHBvcywgXyA9IHN0cmluZy5maW5kKEpTT05Ob2RlLkVzY2FwZUNoYXJzLCBjaCkKKyAgICAgICAgaWYgcG9zID09IG5pbCB0aGVuCisgICAgICAgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAiIC4uIGNofSkKKyAgICAgICAgZW5kCisgICAgICAgIGNoID0gRXNjYXBlQ2hhclZhbHNbcG9zXQorICAgICAgZW5kCisgICAgZW5kCisgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkJhc2U2NCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHJlc3VsdCkKKyAgbG9jYWwgc3RyID0gIiIKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gNCBkbworICAgIGxvY2FsIGJ5dGVzID0gc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0KzQpCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoYnl0ZXMpCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgNAorICAgIGxlbmd0aCA9IGxlbmd0aCAtIDQKKyAgZW5kCisgIGlmIGxlbmd0aCA+PSAwIHRoZW4KKyAgICBzdHIgPSBzdHIgLi4gYmFzZTY0X2RlY29kZShzdHJpbmcuc3ViKHJlc3VsdCwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKQorICBlbmQKKyAgcmV0dXJuIHN0cgorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBsb2NhbCByZXN1bHQgPSAiIgorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgICBpZiBzdHJpbmcuZmluZChjaCwgJ1stKzAtOS5FZV0nKSB0aGVuCisgICAgICByZXN1bHQgPSByZXN1bHQgLi4gY2gKKyAgICBlbHNlCisgICAgICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gdG9udW1iZXIoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkRvdWJsZSgpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBsb2NhbCBkZWxpbWl0ZXIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgbnVtID0gMC4wCisgIGlmIGRlbGltaXRlciA9PSBKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIgdGhlbgorICAgIGxvY2FsIHN0ciA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIGlmIHN0ciA9PSBKU09OTm9kZS5OYW4gdGhlbgorICAgICAgbnVtID0gMS4wCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5JbmZpbml0eSB0aGVuCisgICAgICBudW0gPSBtYXRoLm1heGludGVnZXIKKyAgICBlbHNlaWYgc3RyID09IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5taW5pbnRlZ2VyCisgICAgZWxzZQorICAgICAgbnVtID0gdG9udW1iZXIoc3RyKQorICAgIGVuZAorICBlbHNlCisgICAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisgICAgbG9jYWwgcmVzdWx0ID0gc2VsZjpyZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgbnVtID0gdG9udW1iZXIoZGVsaW1pdGVyLi4gcmVzdWx0KQorICBlbmQKKyAgcmV0dXJuIG51bQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkFycmF5RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuQXJyYXlFbmQpCisgIHNlbGY6Y29udGV4dFBvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgc2VsZjpyZXNldENvbnRleHQoKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHZlcnNpb24gPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHZlcnNpb24gfj0gc2VsZi5USFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiJ9KQorICBlbmQKKyAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB0dHlwZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNZXNzYWdlRW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgdHR5cGUgPSBUVHlwZS5TVE9QCisgIGxvY2FsIGlkID0gMAorICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgaWYgY2ggfj0gSlNPTk5vZGUuT2JqZWN0RW5kIHRoZW4KKyAgICBpZCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICAgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgICAgdHR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBlbmQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIHNlbGY6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgbG9jYWwgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwga3R5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB2dHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBrdHlwZSwgdnR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRMaXN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGV0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEJlZ2luKCkKKyAgcmV0dXJuIHNlbGY6cmVhZExpc3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU2V0RW5kKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQm9vbCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID09IDEgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQnl0ZSgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID49IDI1NiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJVbkV4cGVjdGVkIEJ5dGUgIiAuLiByZXN1bHR9KQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTMyKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCBsb25nID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgcmV0dXJuIGxvbmcoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05Eb3VibGUoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFN0cmluZygpCisgIHJldHVybiBzZWxmOnJlYWRKU09OU3RyaW5nKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRCaW5hcnkoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkJhc2U2NCgpCitlbmQKKworVEpTT05Qcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2xGYWN0b3J5JywKK30KKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpCisgIC0tIFRPRE8gRW5mb3JjZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHRyYW5zcG9ydCBjbGFzcyAoaWUgbm90IGEgYm9vbCkKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEpTT05Qcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVE1lbW9yeUJ1ZmZlci5sdWEgYi9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjJmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhCkBAIC0wLDAgKzEsOTEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUTWVtb3J5QnVmZmVyID0gVFRyYW5zcG9ydEJhc2U6bmV3eworICBfX3R5cGUgPSAnVE1lbW9yeUJ1ZmZlcicsCisgIGJ1ZmZlciA9ICcnLAorICBidWZmZXJTaXplID0gMTAyNCwKKyAgd1BvcyA9IDAsCisgIHJQb3MgPSAwCit9CitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOmlzT3BlbigpCisgIHJldHVybiAxCitlbmQKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6b3BlbigpIGVuZAorZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpjbG9zZSgpIGVuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOnBlYWsoKQorICByZXR1cm4gc2VsZi5yUG9zIDwgc2VsZi53UG9zCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpnZXRCdWZmZXIoKQorICByZXR1cm4gc2VsZi5idWZmZXIKK2VuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOnJlc2V0QnVmZmVyKGJ1ZikKKyAgaWYgYnVmIHRoZW4KKyAgICBzZWxmLmJ1ZmZlciA9IGJ1ZgorICAgIHNlbGYuYnVmZmVyU2l6ZSA9IHN0cmluZy5sZW4oYnVmKQorICBlbHNlCisgICAgc2VsZi5idWZmZXIgPSAnJworICAgIHNlbGYuYnVmZmVyU2l6ZSA9IDEwMjQKKyAgZW5kCisgIHNlbGYud1BvcyA9IHN0cmluZy5sZW4oYnVmKQorICBzZWxmLnJQb3MgPSAwCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjphdmFpbGFibGUoKQorICByZXR1cm4gc2VsZi53UG9zIC0gc2VsZi5yUG9zCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpyZWFkKGxlbikKKyAgbG9jYWwgYXZhaWwgPSBzZWxmOmF2YWlsYWJsZSgpCisgIGlmIGF2YWlsID09IDAgdGhlbgorICAgIHJldHVybiAnJworICBlbmQKKworICBpZiBhdmFpbCA8IGxlbiB0aGVuCisgICAgbGVuID0gYXZhaWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLmJ1ZmZlciwgc2VsZi5yUG9zICsgMSwgc2VsZi5yUG9zICsgbGVuKQorICBzZWxmLnJQb3MgPSBzZWxmLnJQb3MgKyBsZW4KKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6cmVhZEFsbChsZW4pCisgIGxvY2FsIGF2YWlsID0gc2VsZjphdmFpbGFibGUoKQorCisgIGlmIGF2YWlsIDwgbGVuIHRoZW4KKyAgICBsb2NhbCBtc2cgPSBzdHJpbmcuZm9ybWF0KCdBdHRlbXB0IHRvIHJlYWRBbGwoJWQpIGZvdW5kIG9ubHkgJWQgYXZhaWxhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgYXZhaWwpCisgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3e21lc3NhZ2UgPSBtc2d9KQorICBlbmQKKyAgLS0gcmVhZCBzaG91bGQgYmxvY2sgc28gd2UgZG9uJ3QgbmVlZCBhIGxvb3AgaGVyZQorICByZXR1cm4gc2VsZjpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOndyaXRlKGJ1ZikKKyAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlciAuLiBidWYKKyAgc2VsZi53UG9zID0gc2VsZi53UG9zICsgc3RyaW5nLmxlbihidWYpCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpmbHVzaCgpIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UUHJvdG9jb2wubHVhIGIvbGliL2x1YS9UUHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmUxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RQcm90b2NvbC5sdWEKQEAgLTAsMCArMSwxNjIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUaHJpZnQnCisKK1RQcm90b2NvbEV4Y2VwdGlvbiA9IFRFeGNlcHRpb246bmV3IHsKKyAgVU5LTk9XTiAgICAgICAgICA9IDAsCisgIElOVkFMSURfREFUQSAgICAgPSAxLAorICBORUdBVElWRV9TSVpFICAgID0gMiwKKyAgU0laRV9MSU1JVCAgICAgICA9IDMsCisgIEJBRF9WRVJTSU9OICAgICAgPSA0LAorICBJTlZBTElEX1BST1RPQ09MID0gNSwKKyAgREVQVEhfTElNSVQgICAgICA9IDYsCisgIGVycm9yQ29kZSAgICAgICAgPSAwLAorICBfX3R5cGUgPSAnVFByb3RvY29sRXhjZXB0aW9uJworfQorZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uOl9fZXJyb3JDb2RlVG9TdHJpbmcoKQorICBpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfREFUQSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIGRhdGEnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLk5FR0FUSVZFX1NJWkUgdGhlbgorICAgIHJldHVybiAnTmVnYXRpdmUgc2l6ZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuU0laRV9MSU1JVCB0aGVuCisgICAgcmV0dXJuICdTaXplIGxpbWl0JworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5CQURfVkVSU0lPTiB0aGVuCisgICAgcmV0dXJuICdCYWQgdmVyc2lvbicKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9QUk9UT0NPTCB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5ERVBUSF9MSU1JVCB0aGVuCisgICAgcmV0dXJuICdFeGNlZWRlZCBzaXplIGxpbWl0JworICBlbHNlCisgICAgcmV0dXJuICdEZWZhdWx0ICh1bmtub3duKScKKyAgZW5kCitlbmQKKworVFByb3RvY29sQmFzZSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUUHJvdG9jb2xCYXNlJywKKyAgdHJhbnMKK30KKworZnVuY3Rpb24gVFByb3RvY29sQmFzZTpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKHR0eXBlKHNlbGYpIC4uICdtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIHRyYW5zcG9ydCBpcyBwcm92aWRlZAorICBpZiBub3Qgb2JqLnRyYW5zIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKKyAgZW5kCisKKyAgcmV0dXJuIF9fVE9iamVjdC5uZXcoc2VsZiwgb2JqKQorZW5kCisKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVNZXNzYWdlRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU3RydWN0QmVnaW4obmFtZSkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU3RydWN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUZpZWxkRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlRmllbGRTdG9wKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVNYXBFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVMaXN0QmVnaW4odHR5cGUsIHNpemUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUxpc3RFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVTZXRCZWdpbih0dHlwZSwgc2l6ZSkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU2V0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlQm9vbChib29sKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVCeXRlKGJ5dGUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUkxNihpMTYpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUkzMihpMzIpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUk2NChpNjQpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZURvdWJsZShkdWIpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVN0cmluZyhzdHIpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTWVzc2FnZUJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRNZXNzYWdlRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTdHJ1Y3RCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU3RydWN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRGaWVsZEJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRGaWVsZEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTWFwQmVnaW4oKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZE1hcEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTGlzdEJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRMaXN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTZXRCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU2V0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRCb29sKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRCeXRlKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRJMTYoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZEkzMigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkSTY0KCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWREb3VibGUoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZFN0cmluZygpIGVuZAorCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnNraXAodHR5cGUpCisgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBzZWxmOnJlYWRCb29sKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkJZVEUgdGhlbgorICAgIHNlbGY6cmVhZEJ5dGUoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuSTE2IHRoZW4KKyAgICBzZWxmOnJlYWRJMTYoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuSTMyIHRoZW4KKyAgICBzZWxmOnJlYWRJMzIoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuSTY0IHRoZW4KKyAgICBzZWxmOnJlYWRJNjQoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuRE9VQkxFIHRoZW4KKyAgICBzZWxmOnJlYWREb3VibGUoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuU1RSSU5HIHRoZW4KKyAgICBzZWxmOnJlYWRTdHJpbmcoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUIHRoZW4KKyAgICBsb2NhbCBuYW1lID0gc2VsZjpyZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIHRydWUgZG8KKyAgICAgIGxvY2FsIG5hbWUsIHR0eXBlLCBpZCA9IHNlbGY6cmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBlbmQKKyAgICAgIHNlbGY6c2tpcCh0dHlwZSkKKyAgICAgIHNlbGY6cmVhZEZpZWxkRW5kKCkKKyAgICBlbmQKKyAgICBzZWxmOnJlYWRTdHJ1Y3RFbmQoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuTUFQIHRoZW4KKyAgICBsb2NhbCBrdHR5cGUsIHZ0dHlwZSwgc2l6ZSA9IHNlbGY6cmVhZE1hcEJlZ2luKCkKKyAgICBmb3IgaSA9IDEsIHNpemUsIDEgZG8KKyAgICAgIHNlbGY6c2tpcChrdHR5cGUpCisgICAgICBzZWxmOnNraXAodnR0eXBlKQorICAgIGVuZAorICAgIHNlbGY6cmVhZE1hcEVuZCgpCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5TRVQgdGhlbgorICAgIGxvY2FsIGV0dHlwZSwgc2l6ZSA9IHNlbGY6cmVhZFNldEJlZ2luKCkKKyAgICBmb3IgaSA9IDEsIHNpemUsIDEgZG8KKyAgICAgIHNlbGY6c2tpcChldHR5cGUpCisgICAgZW5kCisgICAgc2VsZjpyZWFkU2V0RW5kKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkxJU1QgdGhlbgorICAgIGxvY2FsIGV0dHlwZSwgc2l6ZSA9IHNlbGY6cmVhZExpc3RCZWdpbigpCisgICAgZm9yIGkgPSAxLCBzaXplLCAxIGRvCisgICAgICBzZWxmOnNraXAoZXR0eXBlKQorICAgIGVuZAorICAgIHNlbGY6cmVhZExpc3RFbmQoKQorICBlbmQKK2VuZAorCitUUHJvdG9jb2xGYWN0b3J5ID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RQcm90b2NvbEZhY3RvcnknLAorfQorZnVuY3Rpb24gVFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbCh0cmFucykgZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RTZXJ2ZXIubHVhIGIvbGliL2x1YS9UU2VydmVyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM3ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UU2VydmVyLmx1YQpAQCAtMCwwICsxLDE0MCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RocmlmdCcKK3JlcXVpcmUgJ1RGcmFtZWRUcmFuc3BvcnQnCityZXF1aXJlICdUQmluYXJ5UHJvdG9jb2wnCisKKy0tIFRTZXJ2ZXIKK1RTZXJ2ZXIgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnVFNlcnZlcicKK30KKworLS0gMiBwb3NzaWJsZSBjb25zdHJ1Y3RvcnMKKy0tICAgMS4ge3Byb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0fQorLS0gICAyLiB7cHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeX0KK2Z1bmN0aW9uIFRTZXJ2ZXI6bmV3KGFyZ3MpCisgIGlmIHR0eXBlKGFyZ3MpIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKCdUU2VydmVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisgIGlmIGFyZ3MucHJvY2Vzc29yID09IG5pbCB0aGVuCisgICAgdGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgcHJvY2Vzc29yJykKKyAgZW5kCisgIGlmIGFyZ3Muc2VydmVyVHJhbnNwb3J0ID09IG5pbCB0aGVuCisgICAgdGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgc2VydmVyVHJhbnNwb3J0JykKKyAgZW5kCisKKyAgLS0gQ3JlYXRlIHRoZSBvYmplY3QKKyAgbG9jYWwgb2JqID0gX19UT2JqZWN0Lm5ldyhzZWxmLCBhcmdzKQorCisgIGlmIG9iai50cmFuc3BvcnRGYWN0b3J5IHRoZW4KKyAgICBvYmouaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gb2JqLnRyYW5zcG9ydEZhY3RvcnkKKyAgICBvYmoub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG9iai50cmFuc3BvcnRGYWN0b3J5CisgICAgb2JqLnRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKKyAgZWxzZQorICAgIG9iai5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpuZXd7fQorICAgIG9iai5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb2JqLmlucHV0VHJhbnNwb3J0RmFjdG9yeQorICBlbmQKKworICBpZiBvYmoucHJvdG9jb2xGYWN0b3J5IHRoZW4KKyAgICBvYmouaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBvYmoucHJvdG9jb2xGYWN0b3J5CisgICAgb2JqLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG9iai5wcm90b2NvbEZhY3RvcnkKKyAgICBvYmoucHJvdG9jb2xGYWN0b3J5ID0gbmlsCisgIGVsc2UKKyAgICBvYmouaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5Om5ld3t9CisgICAgb2JqLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG9iai5pbnB1dFByb3RvY29sRmFjdG9yeQorICBlbmQKKworICAtLSBTZXQgdGhlIF9fc2VydmVyIHZhcmlhYmxlIGluIHRoZSBoYW5kbGVyIHNvIHdlIGNhbiBzdG9wIHRoZSBzZXJ2ZXIKKyAgb2JqLnByb2Nlc3Nvci5oYW5kbGVyLl9fc2VydmVyID0gc2VsZgorCisgIHJldHVybiBvYmoKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOnNldFNlcnZlckV2ZW50SGFuZGxlcihoYW5kbGVyKQorICBzZWxmLnNlcnZlckV2ZW50SGFuZGxlciA9IGhhbmRsZXIKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOl9jbGllbnRCZWdpbihjb250ZW50LCBpcHJvdCwgb3Byb3QpCisgIGlmIHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyIGFuZAorICAgIHR5cGUoc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXIuY2xpZW50QmVnaW4pID09ICdmdW5jdGlvbicgdGhlbgorICAgIHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyOmNsaWVudEJlZ2luKGlwcm90LCBvcHJvdCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpfcHJlU2VydmUoKQorICBpZiBzZWxmLnNlcnZlckV2ZW50SGFuZGxlciBhbmQKKyAgICB0eXBlKHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKSA9PSAnZnVuY3Rpb24nIHRoZW4KKyAgICBzZWxmLnNlcnZlckV2ZW50SGFuZGxlcjpwcmVTZXJ2ZShzZWxmLnNlcnZlclRyYW5zcG9ydDpnZXRTb2NrZXRJbmZvKCkpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6X2hhbmRsZUV4Y2VwdGlvbihlcnIpCisgIGlmIHN0cmluZy5maW5kKGVyciwgJ1RUcmFuc3BvcnRFeGNlcHRpb24nKSA9PSBuaWwgdGhlbgorICAgIHByaW50KGVycikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpzZXJ2ZSgpIGVuZAorZnVuY3Rpb24gVFNlcnZlcjpoYW5kbGUoY2xpZW50KQorICBsb2NhbCBpdHJhbnMsIG90cmFucyA9CisgICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KGNsaWVudCksCisgICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpCisgIGxvY2FsIGlwcm90LCBvcHJvdCA9CisgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChpdHJhbnMpLAorICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKG90cmFucykKKworICBzZWxmOl9jbGllbnRCZWdpbihpcHJvdCwgb3Byb3QpCisgIHdoaWxlIHRydWUgZG8KKyAgICBsb2NhbCByZXQsIGVyciA9IHBjYWxsKHNlbGYucHJvY2Vzc29yLnByb2Nlc3MsIHNlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QpCisgICAgaWYgcmV0ID09IGZhbHNlIGFuZCBlcnIgdGhlbgorICAgICAgaWYgbm90IHN0cmluZy5maW5kKGVyciwgIlRUcmFuc3BvcnRFeGNlcHRpb24iKSB0aGVuCisgICAgICAgIHNlbGY6X2hhbmRsZUV4Y2VwdGlvbihlcnIpCisgICAgICBlbmQKKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICBpdHJhbnM6Y2xvc2UoKQorICBvdHJhbnM6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6Y2xvc2UoKQorICBzZWxmLnNlcnZlclRyYW5zcG9ydDpjbG9zZSgpCitlbmQKKworLS0gVFNpbXBsZVNlcnZlcgorLS0gIFNpbmdsZSB0aHJlYWRlZCBzZXJ2ZXIgdGhhdCBoYW5kbGVzIG9uZSB0cmFuc3BvcnQgKGNvbm5lY3Rpb24pCitUU2ltcGxlU2VydmVyID0gX19UT2JqZWN0Om5ldyhUU2VydmVyLCB7CisgIF9fdHlwZSA9ICdUU2ltcGxlU2VydmVyJywKKyAgX19zdG9wID0gZmFsc2UKK30pCisKK2Z1bmN0aW9uIFRTaW1wbGVTZXJ2ZXI6c2VydmUoKQorICBzZWxmLnNlcnZlclRyYW5zcG9ydDpsaXN0ZW4oKQorICBzZWxmOl9wcmVTZXJ2ZSgpCisgIHdoaWxlIG5vdCBzZWxmLl9fc3RvcCBkbworICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0OmFjY2VwdCgpCisgICAgc2VsZjpoYW5kbGUoY2xpZW50KQorICBlbmQKKyAgc2VsZjpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gVFNpbXBsZVNlcnZlcjpzdG9wKCkKKyAgc2VsZi5fX3N0b3AgPSB0cnVlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFNvY2tldC5sdWEgYi9saWIvbHVhL1RTb2NrZXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWZjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RTb2NrZXQubHVhCkBAIC0wLDAgKzEsMTMyIEBACistLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RUcmFuc3BvcnQnCityZXF1aXJlICdsaWJsdWFzb2NrZXQnCisKKy0tIFRTb2NrZXRCYXNlCitUU29ja2V0QmFzZSA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RTb2NrZXRCYXNlJywKKyAgdGltZW91dCA9IDEwMDAsCisgIGhvc3QgPSAnbG9jYWxob3N0JywKKyAgcG9ydCA9IDkwOTAsCisgIGhhbmRsZQorfQorCitmdW5jdGlvbiBUU29ja2V0QmFzZTpjbG9zZSgpCisgIGlmIHNlbGYuaGFuZGxlIHRoZW4KKyAgICBzZWxmLmhhbmRsZTpkZXN0cm95KCkKKyAgICBzZWxmLmhhbmRsZSA9IG5pbAorICBlbmQKK2VuZAorCistLSBSZXR1cm5zIGEgdGFibGUgd2l0aCB0aGUgZmllbGRzIGhvc3QgYW5kIHBvcnQKK2Z1bmN0aW9uIFRTb2NrZXRCYXNlOmdldFNvY2tldEluZm8oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgcmV0dXJuIHNlbGYuaGFuZGxlOmdldHNvY2tpbmZvKCkKKyAgZW5kCisgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOfSkKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0QmFzZTpzZXRUaW1lb3V0KHRpbWVvdXQpCisgIGlmIHRpbWVvdXQgYW5kIHR0eXBlKHRpbWVvdXQpID09ICdudW1iZXInIHRoZW4KKyAgICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgICBzZWxmLmhhbmRsZTpzZXR0aW1lb3V0KHRpbWVvdXQpCisgICAgZW5kCisgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICBlbmQKK2VuZAorCistLSBUU29ja2V0CitUU29ja2V0ID0gVFNvY2tldEJhc2U6bmV3eworICBfX3R5cGUgPSAnVFNvY2tldCcsCisgIGhvc3QgPSAnbG9jYWxob3N0JywKKyAgcG9ydCA9IDkwOTAKK30KKworZnVuY3Rpb24gVFNvY2tldDppc09wZW4oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgcmV0dXJuIHRydWUKKyAgZW5kCisgIHJldHVybiBmYWxzZQorZW5kCisKK2Z1bmN0aW9uIFRTb2NrZXQ6b3BlbigpCisgIGlmIHNlbGYuaGFuZGxlIHRoZW4KKyAgICBzZWxmOmNsb3NlKCkKKyAgZW5kCisKKyAgLS0gQ3JlYXRlIGxvY2FsIGhhbmRsZQorICBsb2NhbCBzb2NrLCBlcnIgPSBsdWFzb2NrZXQuY3JlYXRlX2FuZF9jb25uZWN0KAorICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzZWxmLnRpbWVvdXQpCisgIGlmIGVyciA9PSBuaWwgdGhlbgorICAgIHNlbGYuaGFuZGxlID0gc29jaworICBlbmQKKworICBpZiBlcnIgdGhlbgorICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuLiBzZWxmLmhvc3QgLi4gJzonIC4uIHNlbGYucG9ydAorICAgICAgICAuLiAnICgnIC4uIGVyciAuLiAnKScKKyAgICB9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0OnJlYWQobGVuKQorICBsb2NhbCBidWYgPSBzZWxmLmhhbmRsZTpyZWNlaXZlKHNlbGYuaGFuZGxlLCBsZW4pCisgIGlmIG5vdCBidWYgb3Igc3RyaW5nLmxlbihidWYpIH49IGxlbiB0aGVuCisgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3e2Vycm9yQ29kZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTn0pCisgIGVuZAorICByZXR1cm4gYnVmCitlbmQKKworZnVuY3Rpb24gVFNvY2tldDp3cml0ZShidWYpCisgIHNlbGYuaGFuZGxlOnNlbmQoc2VsZi5oYW5kbGUsIGJ1ZikKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0OmZsdXNoKCkKK2VuZAorCistLSBUU2VydmVyU29ja2V0CitUU2VydmVyU29ja2V0ID0gVFNvY2tldEJhc2U6bmV3eworICBfX3R5cGUgPSAnVFNlcnZlclNvY2tldCcsCisgIGhvc3QgPSAnbG9jYWxob3N0JywKKyAgcG9ydCA9IDkwOTAKK30KKworZnVuY3Rpb24gVFNlcnZlclNvY2tldDpsaXN0ZW4oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgc2VsZjpjbG9zZSgpCisgIGVuZAorCisgIGxvY2FsIHNvY2ssIGVyciA9IGx1YXNvY2tldC5jcmVhdGUoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisgIGlmIG5vdCBlcnIgdGhlbgorICAgIHNlbGYuaGFuZGxlID0gc29jaworICBlbHNlCisgICAgdGVycm9yKGVycikKKyAgZW5kCisgIHNlbGYuaGFuZGxlOnNldHRpbWVvdXQoc2VsZi50aW1lb3V0KQorICBzZWxmLmhhbmRsZTpsaXN0ZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQ6YWNjZXB0KCkKKyAgbG9jYWwgY2xpZW50LCBlcnIgPSBzZWxmLmhhbmRsZTphY2NlcHQoKQorICBpZiBlcnIgdGhlbgorICAgIHRlcnJvcihlcnIpCisgIGVuZAorICByZXR1cm4gVFNvY2tldDpuZXcoe2hhbmRsZSA9IGNsaWVudH0pCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RUcmFuc3BvcnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzdlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsOTMgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUaHJpZnQnCisKK1RUcmFuc3BvcnRFeGNlcHRpb24gPSBURXhjZXB0aW9uOm5ldyB7CisgIFVOS05PV04gICAgICAgICAgICAgPSAwLAorICBOT1RfT1BFTiAgICAgICAgICAgID0gMSwKKyAgQUxSRUFEWV9PUEVOICAgICAgICA9IDIsCisgIFRJTUVEX09VVCAgICAgICAgICAgPSAzLAorICBFTkRfT0ZfRklMRSAgICAgICAgID0gNCwKKyAgSU5WQUxJRF9GUkFNRV9TSVpFICA9IDUsCisgIElOVkFMSURfVFJBTlNGT1JNICAgPSA2LAorICBJTlZBTElEX0NMSUVOVF9UWVBFID0gNywKKyAgZXJyb3JDb2RlICAgICAgICA9IDAsCisgIF9fdHlwZSA9ICdUVHJhbnNwb3J0RXhjZXB0aW9uJworfQorCitmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uOl9fZXJyb3JDb2RlVG9TdHJpbmcoKQorICBpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLk5PVF9PUEVOIHRoZW4KKyAgICByZXR1cm4gJ1RyYW5zcG9ydCBub3Qgb3BlbicKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuQUxSRUFEWV9PUEVOIHRoZW4KKyAgICByZXR1cm4gJ1RyYW5zcG9ydCBhbHJlYWR5IG9wZW4nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlRJTUVEX09VVCB0aGVuCisgICAgcmV0dXJuICdUcmFuc3BvcnQgdGltZWQgb3V0JworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5FTkRfT0ZfRklMRSB0aGVuCisgICAgcmV0dXJuICdFbmQgb2YgZmlsZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9GUkFNRV9TSVpFIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgZnJhbWUgc2l6ZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9UUkFOU0ZPUk0gdGhlbgorICAgIHJldHVybiAnSW52YWxpZCB0cmFuc2Zvcm0nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfQ0xJRU5UX1RZUEUgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBjbGllbnQgdHlwZScKKyAgZWxzZQorICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93biknCisgIGVuZAorZW5kCisKK1RUcmFuc3BvcnRCYXNlID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RUcmFuc3BvcnRCYXNlJworfQorCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTppc09wZW4oKSBlbmQKK2Z1bmN0aW9uIFRUcmFuc3BvcnRCYXNlOm9wZW4oKSBlbmQKK2Z1bmN0aW9uIFRUcmFuc3BvcnRCYXNlOmNsb3NlKCkgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpyZWFkKGxlbikgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpyZWFkQWxsKGxlbikKKyAgbG9jYWwgYnVmLCBoYXZlLCBjaHVuayA9ICcnLCAwCisgIHdoaWxlIGhhdmUgPCBsZW4gZG8KKyAgICBjaHVuayA9IHNlbGY6cmVhZChsZW4gLSBoYXZlKQorICAgIGhhdmUgPSBoYXZlICsgc3RyaW5nLmxlbihjaHVuaykKKyAgICBidWYgPSBidWYgLi4gY2h1bmsKKworICAgIGlmIHN0cmluZy5sZW4oY2h1bmspID09IDAgdGhlbgorICAgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3eworICAgICAgICBlcnJvckNvZGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFCisgICAgICB9KQorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIGJ1ZgorZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTp3cml0ZShidWYpIGVuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6Zmx1c2goKSBlbmQKKworVFNlcnZlclRyYW5zcG9ydEJhc2UgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnVFNlcnZlclRyYW5zcG9ydEJhc2UnCit9CitmdW5jdGlvbiBUU2VydmVyVHJhbnNwb3J0QmFzZTpsaXN0ZW4oKSBlbmQKK2Z1bmN0aW9uIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlOmFjY2VwdCgpIGVuZAorZnVuY3Rpb24gVFNlcnZlclRyYW5zcG9ydEJhc2U6Y2xvc2UoKSBlbmQKKworVFRyYW5zcG9ydEZhY3RvcnlCYXNlID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RUcmFuc3BvcnRGYWN0b3J5QmFzZScKK30KK2Z1bmN0aW9uIFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpnZXRUcmFuc3BvcnQodHJhbnMpCisgIHJldHVybiB0cmFucworZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RocmlmdC5sdWEgYi9saWIvbHVhL1RocmlmdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNGJhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVGhyaWZ0Lmx1YQpAQCAtMCwwICsxLDI4MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKKy0tLS0gbmFtZXNwYWNlIHRocmlmdAorLS10aHJpZnQgPSB7fQorLS1zZXRtZXRhdGFibGUodGhyaWZ0LCB7X19pbmRleCA9IF9HfSkgLS0+IHBlcmYgaGl0IGZvciBhY2Nlc3NpbmcgZ2xvYmFsIG1ldGhvZHMKKy0tc2V0ZmVudigxLCB0aHJpZnQpCisKK3BhY2thZ2UuY3BhdGggPSBwYWNrYWdlLmNwYXRoIC4uICc7YmluLz8uc28nIC0tIFRPRE8gRklYCitmdW5jdGlvbiB0dHlwZShvYmopCisgIGlmIHR5cGUob2JqKSA9PSAndGFibGUnIGFuZAorICAgIG9iai5fX3R5cGUgYW5kCisgICAgdHlwZShvYmouX190eXBlKSA9PSAnc3RyaW5nJyB0aGVuCisgICAgICByZXR1cm4gb2JqLl9fdHlwZQorICBlbmQKKyAgcmV0dXJuIHR5cGUob2JqKQorZW5kCisKK2Z1bmN0aW9uIHRlcnJvcihlKQorICBpZiBlIGFuZCBlLl9fdG9zdHJpbmcgdGhlbgorICAgIGVycm9yKGU6X190b3N0cmluZygpKQorICAgIHJldHVybgorICBlbmQKKyAgZXJyb3IoZSkKK2VuZAorCitmdW5jdGlvbiB0dGFibGVfc2l6ZSh0KQorICBsb2NhbCBjb3VudCA9IDAKKyAgZm9yIGssIHYgaW4gcGFpcnModCkgZG8KKyAgICBjb3VudCA9IGNvdW50ICsgMQorICBlbmQKKyAgcmV0dXJuIGNvdW50CitlbmQKKwordmVyc2lvbiA9ICcxLjAuMCcKKworVFR5cGUgPSB7CisgIFNUT1AgICA9IDAsCisgIFZPSUQgICA9IDEsCisgIEJPT0wgICA9IDIsCisgIEJZVEUgICA9IDMsCisgIEkwOCAgICA9IDMsCisgIERPVUJMRSA9IDQsCisgIEkxNiAgICA9IDYsCisgIEkzMiAgICA9IDgsCisgIEk2NCAgICA9IDEwLAorICBTVFJJTkcgPSAxMSwKKyAgVVRGNyAgID0gMTEsCisgIFNUUlVDVCA9IDEyLAorICBNQVAgICAgPSAxMywKKyAgU0VUICAgID0gMTQsCisgIExJU1QgICA9IDE1LAorICBVVEY4ICAgPSAxNiwKKyAgVVRGMTYgID0gMTcKK30KKworVE1lc3NhZ2VUeXBlID0geworICBDQUxMICA9IDEsCisgIFJFUExZID0gMiwKKyAgRVhDRVBUSU9OID0gMywKKyAgT05FV0FZID0gNAorfQorCistLSBSZWN1cnNpdmUgX19pbmRleCBmdW5jdGlvbiB0byBhY2hpZXZlIGluaGVyaXRhbmNlCitmdW5jdGlvbiBfX3RvYmpfaW5kZXgoc2VsZiwga2V5KQorICBsb2NhbCB2ID0gcmF3Z2V0KHNlbGYsIGtleSkKKyAgaWYgdiB+PSBuaWwgdGhlbgorICAgIHJldHVybiB2CisgIGVuZAorCisgIGxvY2FsIHAgPSByYXdnZXQoc2VsZiwgJ19fcGFyZW50JykKKyAgaWYgcCB0aGVuCisgICAgcmV0dXJuIF9fdG9ial9pbmRleChwLCBrZXkpCisgIGVuZAorCisgIHJldHVybiBuaWwKK2VuZAorCistLSBCYXNpYyBUaHJpZnQtTHVhIE9iamVjdAorX19UT2JqZWN0ID0geworICBfX3R5cGUgPSAnX19UT2JqZWN0JywKKyAgX19tdCA9IHsKKyAgICBfX2luZGV4ID0gX190b2JqX2luZGV4CisgIH0KK30KK2Z1bmN0aW9uIF9fVE9iamVjdDpuZXcoaW5pdF9vYmopCisgIGxvY2FsIG9iaiA9IHt9CisgIGlmIHR0eXBlKG9iaikgPT0gJ3RhYmxlJyB0aGVuCisgICAgb2JqID0gaW5pdF9vYmoKKyAgZW5kCisKKyAgLS0gVXNlIHRoZSBfX3BhcmVudCBrZXkgYW5kIHRoZSBfX2luZGV4IGZ1bmN0aW9uIHRvIGFjaGlldmUgaW5oZXJpdGFuY2UKKyAgb2JqLl9fcGFyZW50ID0gc2VsZgorICBzZXRtZXRhdGFibGUob2JqLCBfX1RPYmplY3QuX19tdCkKKyAgcmV0dXJuIG9iagorZW5kCisKKy0tIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbnkgbHVhIHZhcmlhYmxlCitmdW5jdGlvbiB0aHJpZnRfcHJpbnRfcih0KQorICBsb2NhbCByZXQgPSAnJworICBsb2NhbCBsdHlwZSA9IHR5cGUodCkKKyAgaWYgKGx0eXBlID09ICd0YWJsZScpIHRoZW4KKyAgICByZXQgPSByZXQgLi4gJ3sgJworICAgIGZvciBrZXksdmFsdWUgaW4gcGFpcnModCkgZG8KKyAgICAgIHJldCA9IHJldCAuLiB0b3N0cmluZyhrZXkpIC4uICc9JyAuLiB0aHJpZnRfcHJpbnRfcih2YWx1ZSkgLi4gJyAnCisgICAgZW5kCisgICAgcmV0ID0gcmV0IC4uICd9JworICBlbHNlaWYgbHR5cGUgPT0gJ3N0cmluZycgdGhlbgorICAgIHJldCA9IHJldCAuLiAiJyIgLi4gdG9zdHJpbmcodCkgLi4gIiciCisgIGVsc2UKKyAgICByZXQgPSByZXQgLi4gdG9zdHJpbmcodCkKKyAgZW5kCisgIHJldHVybiByZXQKK2VuZAorCistLSBCYXNpYyBFeGNlcHRpb24KK1RFeGNlcHRpb24gPSBfX1RPYmplY3Q6bmV3eworICBtZXNzYWdlLAorICBlcnJvckNvZGUsCisgIF9fdHlwZSA9ICdURXhjZXB0aW9uJworfQorZnVuY3Rpb24gVEV4Y2VwdGlvbjpfX3Rvc3RyaW5nKCkKKyAgaWYgc2VsZi5tZXNzYWdlIHRoZW4KKyAgICByZXR1cm4gc3RyaW5nLmZvcm1hdCgnJXM6ICVzJywgc2VsZi5fX3R5cGUsIHNlbGYubWVzc2FnZSkKKyAgZWxzZQorICAgIGxvY2FsIG1lc3NhZ2UKKyAgICBpZiBzZWxmLmVycm9yQ29kZSBhbmQgc2VsZi5fX2Vycm9yQ29kZVRvU3RyaW5nIHRoZW4KKyAgICAgIG1lc3NhZ2UgPSBzdHJpbmcuZm9ybWF0KCclZDogJXMnLCBzZWxmLmVycm9yQ29kZSwgc2VsZjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkpCisgICAgZWxzZQorICAgICAgbWVzc2FnZSA9IHRocmlmdF9wcmludF9yKHNlbGYpCisgICAgZW5kCisgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoJyVzOiVzJywgc2VsZi5fX3R5cGUsIG1lc3NhZ2UpCisgIGVuZAorZW5kCisKK1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IFRFeGNlcHRpb246bmV3eworICBVTktOT1dOICAgICAgICAgICAgICAgICA9IDAsCisgIFVOS05PV05fTUVUSE9EICAgICAgICAgID0gMSwKKyAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgPSAyLAorICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA9IDMsCisgIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgID0gNCwKKyAgTUlTU0lOR19SRVNVTFQgICAgICAgICAgPSA1LAorICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA9IDYsCisgIFBST1RPQ09MX0VSUk9SICAgICAgICAgID0gNywKKyAgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgPSA4LAorICBJTlZBTElEX1BST1RPQ09MICAgICAgICA9IDksCisgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAsCisgIGVycm9yQ29kZSAgICAgICAgICAgICAgID0gMCwKKyAgX190eXBlID0gJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicKK30KKworZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOl9fZXJyb3JDb2RlVG9TdHJpbmcoKQorICBpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlVOS05PV05fTUVUSE9EIHRoZW4KKyAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUUgdGhlbgorICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLkJBRF9TRVFVRU5DRV9JRCB0aGVuCisgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUIHRoZW4KKyAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlRFUk5BTF9FUlJPUiB0aGVuCisgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuUFJPVE9DT0xfRVJST1IgdGhlbgorICAgIHJldHVybiAnUHJvdG9jb2wgZXJyb3InCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX1BST1RPQ09MIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIHRoZW4KKyAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlJworICBlbHNlCisgICAgcmV0dXJuICdEZWZhdWx0ICh1bmtub3duKScKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEV4Y2VwdGlvbjpyZWFkKGlwcm90KQorICBpcHJvdDpyZWFkU3RydWN0QmVnaW4oKQorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgZm5hbWUsIGZ0eXBlLCBmaWQgPSBpcHJvdDpyZWFkRmllbGRCZWdpbigpCisgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgICBicmVhaworICAgIGVsc2VpZiBmaWQgPT0gMSB0aGVuCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkcgdGhlbgorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdDpyZWFkU3RyaW5nKCkKKyAgICAgIGVsc2UKKyAgICAgICAgaXByb3Q6c2tpcChmdHlwZSkKKyAgICAgIGVuZAorICAgIGVsc2VpZiBmaWQgPT0gMiB0aGVuCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzIgdGhlbgorICAgICAgICBzZWxmLmVycm9yQ29kZSA9IGlwcm90OnJlYWRJMzIoKQorICAgICAgZWxzZQorICAgICAgICBpcHJvdDpza2lwKGZ0eXBlKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXByb3Q6c2tpcChmdHlwZSkKKyAgICBlbmQKKyAgICBpcHJvdDpyZWFkRmllbGRFbmQoKQorICBlbmQKKyAgaXByb3Q6cmVhZFN0cnVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEV4Y2VwdGlvbjp3cml0ZShvcHJvdCkKKyAgb3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKKyAgaWYgc2VsZi5tZXNzYWdlIHRoZW4KKyAgICBvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgb3Byb3Q6d3JpdGVTdHJpbmcoc2VsZi5tZXNzYWdlKQorICAgIG9wcm90OndyaXRlRmllbGRFbmQoKQorICBlbmQKKyAgaWYgc2VsZi5lcnJvckNvZGUgdGhlbgorICAgIG9wcm90OndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlLkkzMiwgMikKKyAgICBvcHJvdDp3cml0ZUkzMihzZWxmLmVycm9yQ29kZSkKKyAgICBvcHJvdDp3cml0ZUZpZWxkRW5kKCkKKyAgZW5kCisgIG9wcm90OndyaXRlRmllbGRTdG9wKCkKKyAgb3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKQorZW5kCisKKy0tIEJhc2ljIENsaWVudCAodXNlZCBpbiBnZW5lcmF0ZWQgbHVhIGNvZGUpCitfX1RDbGllbnQgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnX19UQ2xpZW50JywKKyAgX3NlcWlkID0gMAorfQorZnVuY3Rpb24gX19UQ2xpZW50Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IoJ1RDbGllbnQgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBTZXQgaXByb3QgJiBvcHJvdAorICBpZiBvYmoucHJvdG9jb2wgdGhlbgorICAgIG9iai5pcHJvdCA9IG9iai5wcm90b2NvbAorICAgIG9iai5vcHJvdCA9IG9iai5wcm90b2NvbAorICAgIG9iai5wcm90b2NvbCA9IG5pbAorICBlbHNlaWYgbm90IG9iai5pcHJvdCB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYW4gaXByb3QnKQorICBlbmQKKyAgaWYgbm90IG9iai5vcHJvdCB0aGVuCisgICAgb2JqLm9wcm90ID0gb2JqLmlwcm90CisgIGVuZAorCisgIHJldHVybiBfX1RPYmplY3QubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBfX1RDbGllbnQ6Y2xvc2UoKQorICBzZWxmLmlwcm90LnRyYW5zOmNsb3NlKCkKKyAgc2VsZi5vcHJvdC50cmFuczpjbG9zZSgpCitlbmQKKworLS0gQmFzaWMgUHJvY2Vzc29yICh1c2VkIGluIGdlbmVyYXRlZCBsdWEgY29kZSkKK19fVFByb2Nlc3NvciA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdfX1RQcm9jZXNzb3InCit9CitmdW5jdGlvbiBfX1RQcm9jZXNzb3I6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcignVFByb2Nlc3NvciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIGhhbmRsZXIgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai5oYW5kbGVyIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIGhhbmRsZXInKQorICBlbmQKKworICByZXR1cm4gX19UT2JqZWN0Lm5ldyhzZWxmLCBvYmopCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbG9uZ251bWJlcnV0aWxzLmMgYi9saWIvbHVhL3NyYy9sb25nbnVtYmVydXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM2Nzg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbG9uZ251bWJlcnV0aWxzLmMKQEAgLTAsMCArMSw0NyBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworY29uc3QgY2hhciAqIExPTkdfTlVNX1RZUEUgPSAiX190aHJpZnRfbG9uZ251bWJlciI7CitpbnQ2NF90IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KSB7CisgIHN3aXRjaCAobHVhX3R5cGUoTCwgaW5kZXgpKSB7CisgICAgY2FzZSBMVUFfVE5VTUJFUjoKKyAgICAgIHJldHVybiAoaW50NjRfdClsdWFfdG9udW1iZXIoTCwgaW5kZXgpOworICAgIGNhc2UgTFVBX1RTVFJJTkc6CisgICAgICByZXR1cm4gYXRvbGwobHVhX3Rvc3RyaW5nKEwsIGluZGV4KSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAqKChpbnQ2NF90ICopbHVhTF9jaGVja3VkYXRhKEwsIGluZGV4LCBMT05HX05VTV9UWVBFKSk7CisgIH0KK30KKworLy8gQ3JlYXRlcyBhIG5ldyBsb25nbnVtYmVyIGFuZCBwdXNoZXMgaXQgb250byB0aGUgc3RhdGNrCitpbnQ2NF90ICogbHVhbG9uZ251bWJlcl9wdXNobG9uZyhsdWFfU3RhdGUgKkwsIGludDY0X3QgKnZhbCkgeworICBpbnQ2NF90ICpkYXRhID0gKGludDY0X3QgKilsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKGludDY0X3QpKTsgLy8gbG9uZ251bQorICBsdWFMX2dldG1ldGF0YWJsZShMLCBMT05HX05VTV9UWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9uZ251bSwgbXQKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAtMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdudW0KKyAgaWYgKHZhbCkgeworICAgICpkYXRhID0gKnZhbDsKKyAgfQorICByZXR1cm4gZGF0YTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbHVhYml0d2lzZS5jIGIvbGliL2x1YS9zcmMvbHVhYml0d2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDdlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFiaXR3aXNlLmMKQEAgLTAsMCArMSw4MyBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisKK3N0YXRpYyBpbnQgbF9ub3QobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGEgPSB+YTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfeG9yKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQgYiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICBhIF49IGI7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsX2FuZChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSAmPSBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9vcihsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSB8PSBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9zaGlmdHIobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgPSBhID4+IGI7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsX3NoaWZ0bChsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSA9IGEgPDwgYjsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGZ1bmNzW10gPSB7CisgIHsiYmFuZCIsIGxfYW5kfSwKKyAgeyJib3IiLCBsX29yfSwKKyAgeyJieG9yIiwgbF94b3J9LAorICB7ImJub3QiLCBsX25vdH0sCisgIHsic2hpZnRsIiwgbF9zaGlmdGx9LAorICB7InNoaWZ0ciIsIGxfc2hpZnRyfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitpbnQgbHVhb3Blbl9saWJsdWFiaXR3aXNlKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX3JlZ2lzdGVyKEwsICJsaWJsdWFiaXR3aXNlIiwgZnVuY3MpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2I2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCkBAIC0wLDAgKzEsMzA4IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPGxhdXhsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9jaGVja2xvbmcobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhsdWFfU3RhdGUgKkwsIGludDY0X3QgKnZhbCk7CisKKy8vIGhvc3Qgb3JkZXIgdG8gbmV0d29yayBvcmRlciAoNjQtYml0KQorc3RhdGljIGludDY0X3QgVF9odG9ubGwodWludDY0X3QgZGF0YSkgeworICB1aW50MzJfdCBkMSA9IGh0b25sKCh1aW50MzJfdClkYXRhKTsKKyAgdWludDMyX3QgZDIgPSBodG9ubCgodWludDMyX3QpKGRhdGEgPj4gMzIpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZDEgPDwgMzIpICsgKHVpbnQ2NF90KWQyOworfQorCisvLyBuZXR3b3JrIG9yZGVyIHRvIGhvc3Qgb3JkZXIgKDY0LWJpdCkKK3N0YXRpYyBpbnQ2NF90IFRfbnRvaGxsKHVpbnQ2NF90IGRhdGEpIHsKKyAgdWludDMyX3QgZDEgPSBudG9obCgodWludDMyX3QpZGF0YSk7CisgIHVpbnQzMl90IGQyID0gbnRvaGwoKHVpbnQzMl90KShkYXRhID4+IDMyKSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWQxIDw8IDMyKSArICh1aW50NjRfdClkMjsKK30KKworLyoqCisgKiBicGFjayh0eXBlLCBkYXRhKQorICogIGMgLSBTaWduZWQgQnl0ZQorICogIHMgLSBTaWduZWQgU2hvcnQKKyAqICBpIC0gU2lnbmVkIEludAorICogIGwgLSBTaWduZWQgTG9uZworICogIGQgLSBEb3VibGUKKyAqLworc3RhdGljIGludCBsX2JwYWNrKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpjb2RlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgbHVhTF9hcmdjaGVjayhMLCBjb2RlWzFdID09ICdcMCcsIDAsICJGb3JtYXQgY29kZSBtdXN0IGJlIG9uZSBjaGFyYWN0ZXIuIik7CisgIGx1YUxfQnVmZmVyIGJ1ZjsKKyAgbHVhTF9idWZmaW5pdChMLCAmYnVmKTsKKworICBzd2l0Y2ggKGNvZGVbMF0pIHsKKyAgICBjYXNlICdjJzogeworICAgICAgaW50OF90IGRhdGEgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdzJzogeworICAgICAgaW50MTZfdCBkYXRhID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgICAgIGRhdGEgPSAoaW50MTZfdClodG9ucyhkYXRhKTsKKyAgICAgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnaSc6IHsKKyAgICAgIGludDMyX3QgZGF0YSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICAgICAgZGF0YSA9IChpbnQzMl90KWh0b25sKGRhdGEpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdsJzogeworICAgICAgaW50NjRfdCBkYXRhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgICAgICBkYXRhID0gKGludDY0X3QpVF9odG9ubGwoZGF0YSk7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2QnOiB7CisgICAgICBkb3VibGUgZGF0YSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIDAsIDAsICJJbnZhbGlkIGZvcm1hdCBjb2RlLiIpOworICB9CisKKyAgbHVhTF9wdXNocmVzdWx0KCZidWYpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBidW5wYWNrKHR5cGUsIGRhdGEpCisgKiAgYyAtIFNpZ25lZCBCeXRlCisgKiAgQyAtIFVuc2lnbmVkIEJ5dGUKKyAqICBzIC0gU2lnbmVkIFNob3J0CisgKiAgaSAtIFNpZ25lZCBJbnQKKyAqICBsIC0gU2lnbmVkIExvbmcKKyAqICBkIC0gRG91YmxlCisgKi8KK3N0YXRpYyBpbnQgbF9idW5wYWNrKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICpjb2RlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKKyAgbHVhTF9hcmdjaGVjayhMLCBjb2RlWzFdID09ICdcMCcsIDAsICJGb3JtYXQgY29kZSBtdXN0IGJlIG9uZSBjaGFyYWN0ZXIuIik7CisgIGNvbnN0IGNoYXIgKmRhdGEgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworI2lmIExVQV9WRVJTSU9OX05VTSA+PSA1MDIKKyAgc2l6ZV90IGxlbiA9IGx1YV9yYXdsZW4oTCwgMik7CisjZWxzZQorICBzaXplX3QgbGVuID0gbHVhX29iamxlbihMLCAyKTsKKyNlbmRpZgorCisgIHN3aXRjaCAoY29kZVswXSkgeworICAgIGNhc2UgJ2MnOiB7CisgICAgICBpbnQ4X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyoqCisgICAgICogdW5wYWNrIHVuc2lnbmVkIEJ5dGUuCisgICAgICovCisgICAgY2FzZSAnQyc6IHsKKyAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAncyc6IHsKKyAgICAgIGludDE2X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIHZhbCA9IChpbnQxNl90KW50b2hzKHZhbCk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2knOiB7CisgICAgICBpbnQzMl90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICB2YWwgPSAoaW50MzJfdCludG9obCh2YWwpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdsJzogeworICAgICAgaW50NjRfdCB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgdmFsID0gKGludDY0X3QpVF9udG9obGwodmFsKTsKKyAgICAgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnZCc6IHsKKyAgICAgIGRvdWJsZSB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgbHVhTF9hcmdjaGVjayhMLCAwLCAwLCAiSW52YWxpZCBmb3JtYXQgY29kZS4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF9pNjRUb1ppZ3phZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGludDY0X3QgcmVzdWx0ID0gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGludCBsX2kzMlRvWmlnemFnKGx1YV9TdGF0ZSAqTCkgeworICBpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KShuIDw8IDEpIF4gKG4gPj4gMzEpOworICBsdWFfcHVzaG51bWJlcihMLCByZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF96aWd6YWdUb0kzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDMyX3QgbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQzMl90IHJlc3VsdCA9IChpbnQzMl90KShuID4+IDEpIF4gKHVpbnQzMl90KSgtKGludDMyX3QpKG4gJiAxKSk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgaW50IGxfemlnemFnVG9JNjQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IChpbnQ2NF90KShuID4+IDEpIF4gKHVpbnQ2NF90KSgtKGludDY0X3QpKG4gJiAxKSk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTMyIHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGxfdG9WYXJpbnQzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICBsdWFfcHVzaGxzdHJpbmcoTCwgYnVmLCB3c2l6ZSk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTY0IHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBsX3RvVmFyaW50NjQobHVhX1N0YXRlICpMKSB7CisgIHVpbnQ4X3QgZGF0YVsxMF07CisgIHVpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICBsdWFMX0J1ZmZlciBidWY7CisgIGx1YUxfYnVmZmluaXQoTCwgJmJ1Zik7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGRhdGFbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YVt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgd3NpemUpOworICBsdWFMX3B1c2hyZXN1bHQoJmJ1Zik7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYSB2YXJpbnQgdG8gaTY0LgorICovCitzdGF0aWMgaW50IGxfZnJvbVZhcmludDY0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IHJlc3VsdDsKKyAgdWludDhfdCBieXRlID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgaW50MzJfdCBzaGlmdCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIHVpbnQ2NF90IG4gPSAodWludDY0X3QpbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMyk7CisgIG4gfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisKKyAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgcmVzdWx0ID0gKGludDY0X3QpKG4gPj4gMSkgXiAodWludDY0X3QpKC0oaW50NjRfdCkobiAmIDEpKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAwKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBuOworICAgIGx1YV9wdXNobnVtYmVyKEwsIDEpOworICB9CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAyOworfQorCisvKioKKyAqIFRvIHBhY2sgbWVzc2FnZSB0eXBlIG9mIGNvbXBhY3QgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBpbnQgbF9wYWNrTWVzZ1R5cGUobHVhX1N0YXRlICpMKSB7CisgIGludDMyX3QgdmVyc2lvbl9uID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludDMyX3QgdmVyc2lvbl9tYXNrID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGludDMyX3QgbWVzc2FnZXR5cGUgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAzKTsKKyAgaW50MzJfdCB0eXBlX3NoaWZ0X2Ftb3VudCA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDQpOworICBpbnQzMl90IHR5cGVfbWFzayA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDUpOworICBpbnQzMl90IHRvX21lc2dfdHlwZSA9ICh2ZXJzaW9uX24gJiB2ZXJzaW9uX21hc2spIHwKKyAgICAoKChpbnQzMl90KW1lc3NhZ2V0eXBlIDw8IHR5cGVfc2hpZnRfYW1vdW50KSAmIHR5cGVfbWFzayk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHRvX21lc2dfdHlwZSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGx1YV9icGFja1tdID0geworICB7ImJwYWNrIiwgbF9icGFja30sCisgIHsiYnVucGFjayIsIGxfYnVucGFja30sCisgIHsiaTMyVG9aaWd6YWciLCBsX2kzMlRvWmlnemFnfSwKKyAgeyJpNjRUb1ppZ3phZyIsIGxfaTY0VG9aaWd6YWd9LAorICB7InppZ3phZ1RvSTMyIiwgbF96aWd6YWdUb0kzMn0sCisgIHsiemlnemFnVG9JNjQiLCBsX3ppZ3phZ1RvSTY0fSwKKyAgeyJ0b1ZhcmludDMyIiwgbF90b1ZhcmludDMyfSwKKyAgeyJ0b1ZhcmludDY0IiwgbF90b1ZhcmludDY0fSwKKyAgeyJmcm9tVmFyaW50NjQiLCBsX2Zyb21WYXJpbnQ2NH0sCisgIHsicGFja01lc2dUeXBlIiwgbF9wYWNrTWVzZ1R5cGV9LAorICB7TlVMTCwgTlVMTH0KK307CisKK2ludCBsdWFvcGVuX2xpYmx1YWJwYWNrKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX3JlZ2lzdGVyKEwsICJsaWJsdWFicGFjayIsIGx1YV9icGFjayk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbHVhbG9uZ251bWJlci5jIGIvbGliL2x1YS9zcmMvbHVhbG9uZ251bWJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDFlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFsb25nbnVtYmVyLmMKQEAgLTAsMCArMSwyMjggQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8bGF1eGxpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gY29uc3QgY2hhciAqIExPTkdfTlVNX1RZUEU7CitleHRlcm4gaW50NjRfdCBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhsdWFfU3RhdGUgKkwsIGludCBpbmRleCk7CitleHRlcm4gaW50NjRfdCBsdWFsb25nbnVtYmVyX3B1c2hsb25nKGx1YV9TdGF0ZSAqTCwgaW50NjRfdCAqdmFsKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgbF9zZXJpYWxpemUoY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQ2NF90IHZhbCkgeworICBzbnByaW50ZihidWYsIGxlbiwgIiUiUFJJZDY0LCB2YWwpOworfQorCitzdGF0aWMgaW50NjRfdCBsX2Rlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmJ1ZikgeworICBpbnQ2NF90IGRhdGE7CisgIGludCBydjsKKyAgLy8gU3VwcG9ydCBoZXggcHJlZml4ZWQgd2l0aCAnMHgnCisgIGlmIChzdHJzdHIoYnVmLCAiMHgiKSA9PSBidWYpIHsKKyAgICBydiA9IHNzY2FuZihidWYsICIlIlBSSXg2NCwgJmRhdGEpOworICB9IGVsc2UgeworICAgIHJ2ID0gc3NjYW5mKGJ1ZiwgIiUiUFJJZDY0LCAmZGF0YSk7CisgIH0KKyAgaWYgKHJ2ID09IDEpIHsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorICByZXR1cm4gMDsgLy8gRmFpbGVkCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgbF9uZXcobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgdmFsOworICBjb25zdCBjaGFyICpzdHIgPSBOVUxMOworICBpZiAobHVhX3R5cGUoTCwgMSkgPT0gTFVBX1RTVFJJTkcpIHsKKyAgICBzdHIgPSBsdWFfdG9zdHJpbmcoTCwgMSk7CisgICAgdmFsID0gbF9kZXNlcmlhbGl6ZShzdHIpOworICB9IGVsc2UgaWYgKGx1YV90eXBlKEwsIDEpID09IExVQV9UTlVNQkVSKSB7CisgICAgdmFsID0gKGludDY0X3QpbHVhX3RvbnVtYmVyKEwsIDEpOworICAgIHN0ciA9IChjb25zdCBjaGFyICopMTsKKyAgfQorICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsIChzdHIgPyAmdmFsIDogTlVMTCkpOworICByZXR1cm4gMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gYSArIGIKK3N0YXRpYyBpbnQgbF9hZGQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYiwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGMgPSBhICsgYjsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhIC8gYgorc3RhdGljIGludCBsX2RpdihsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBiLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGIgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IGEgLyBiOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgPT0gYiAoYm90aCBhIGFuZCBiIGFyZSBsdWFsb25nbnVtYmVyJ3MpCitzdGF0aWMgaW50IGxfZXEobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYjsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoYSA9PSBiID8gMSA6IDApKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGdhcmJhZ2UgY29sbGVjdGlvbgorc3RhdGljIGludCBsX2djKGx1YV9TdGF0ZSAqTCkgeworICBsdWFfcHVzaG5pbChMKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCAxKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGEgPCBiCitzdGF0aWMgaW50IGxfbHQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYjsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoYSA8IGIgPyAxIDogMCkpOworICByZXR1cm4gMTsKK30KKworLy8gYSA8PSBiCitzdGF0aWMgaW50IGxfbGUobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYjsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGx1YV9wdXNoYm9vbGVhbihMLCAoYSA8PSBiID8gMSA6IDApKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgJSBiCitzdGF0aWMgaW50IGxfbW9kKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSAlIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gYSAqIGIKK3N0YXRpYyBpbnQgbF9tdWwobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYiwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGMgPSBhICogYjsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhIF4gYgorc3RhdGljIGludCBsX3BvdyhsdWFfU3RhdGUgKkwpIHsKKyAgbG9uZyBkb3VibGUgYSwgYjsKKyAgaW50NjRfdCBjOworICBhID0gKGxvbmcgZG91YmxlKWx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gKGxvbmcgZG91YmxlKWx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gKGludDY0X3QpcG93KGEsIGIpOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgLSBiCitzdGF0aWMgaW50IGxfc3ViKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSAtIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gdG9zdHJpbmcoKQorc3RhdGljIGludCBsX3Rvc3RyaW5nKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGE7CisgIGNoYXIgc3RyWzI1Nl07CisgIGxfc2VyaWFsaXplKHN0ciwgMjU2LCBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKSk7CisgIGx1YV9wdXNoc3RyaW5nKEwsIHN0cik7CisgIHJldHVybiAxOworfQorCisvLyAtYQorc3RhdGljIGludCBsX3VubShsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGMgPSAtYTsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgbWV0aG9kc1tdID0geworICB7Il9fYWRkIiwgbF9hZGR9LAorICB7Il9fZGl2IiwgbF9kaXZ9LAorICB7Il9fZXEiLCBsX2VxfSwKKyAgeyJfX2djIiwgbF9nY30sCisgIHsiX19sdCIsIGxfbHR9LAorICB7Il9fbGUiLCBsX2xlfSwKKyAgeyJfX21vZCIsIGxfbW9kfSwKKyAgeyJfX211bCIsIGxfbXVsfSwKKyAgeyJfX3BvdyIsIGxfcG93fSwKKyAgeyJfX3N1YiIsIGxfc3VifSwKKyAgeyJfX3Rvc3RyaW5nIiwgbF90b3N0cmluZ30sCisgIHsiX191bm0iLCBsX3VubX0sCisgIHtOVUxMLCBOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBsdWFMX1JlZyBmdW5jc1tdID0geworICB7Im5ldyIsIGxfbmV3fSwKKyAge05VTEwsIE5VTEx9Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBzZXRfbWV0aG9kcyhsdWFfU3RhdGUgKkwsCisgIGNvbnN0IGNoYXIgKm1ldGF0YWJsZW5hbWUsCisgIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyAqbWV0aG9kcykgeworICBsdWFMX2dldG1ldGF0YWJsZShMLCBtZXRhdGFibGVuYW1lKTsgICAvLyBtdAorICAvLyBObyBuZWVkIGZvciBhIF9faW5kZXggdGFibGUgc2luY2UgZXZlcnl0aGluZyBpcyBfXyoKKyAgZm9yICg7IG1ldGhvZHMtPm5hbWU7IG1ldGhvZHMrKykgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsIG1ldGhvZHMtPm5hbWUpOyAgICAvLyBtdCwgIm5hbWUiCisgICAgbHVhX3B1c2hjZnVuY3Rpb24oTCwgbWV0aG9kcy0+ZnVuYyk7IC8vIG10LCAibmFtZSIsIGZ1bmMKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgLy8gbXQKKyAgfQorICBsdWFfcG9wKEwsIDEpOworfQorCitMVUFMSUJfQVBJIGludCBsdWFvcGVuX2xpYmx1YWxvbmdudW1iZXIobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIExPTkdfTlVNX1RZUEUpOworICBsdWFfcG9wKEwsIDEpOworICBzZXRfbWV0aG9kcyhMLCBMT05HX05VTV9UWVBFLCBtZXRob2RzKTsKKworICBsdWFMX3JlZ2lzdGVyKEwsICJsaWJsdWFsb25nbnVtYmVyIiwgZnVuY3MpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jIGIvbGliL2x1YS9zcmMvbHVhc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4MzUxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jCkBAIC0wLDAgKzEsMzgwIEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPGxhdXhsaWIuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInNvY2tldC5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0FOWSAgICAgPSAiX190aHJpZnRfc29ja2V0X2FueSI7CitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0NPTk4gICAgPSAiX190aHJpZnRfc29ja2V0X2Nvbm5lY3RlZCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpTT0NLRVRfR0VORVJJQyA9ICJfX3RocmlmdF9zb2NrZXRfZ2VuZXJpYyI7CitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0NMSUVOVCAgPSAiX190aHJpZnRfc29ja2V0X2NsaWVudCI7CitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX1NFUlZFUiAgPSAiX190aHJpZnRfc29ja2V0X3NlcnZlciI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpERUZBVUxUX0hPU1QgICA9ICJsb2NhbGhvc3QiOworCit0eXBlZGVmIHN0cnVjdCBfX3RfdGNwIHsKKyAgdF9zb2NrZXQgc29jazsKKyAgaW50IHRpbWVvdXQ7IC8vIE1pbGxpc2Vjb25kcworfSB0X3RjcDsKK3R5cGVkZWYgdF90Y3AgKnBfdGNwOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVXRpbAorCitzdGF0aWMgdm9pZCB0aHJvd19hcmdlcnJvcihsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqZXhwZWN0ZWQpIHsKKyAgY2hhciBtc2dbMjU2XTsKKyAgc3ByaW50Zihtc2csICIlcyBleHBlY3RlZCwgZ290ICVzIiwgZXhwZWN0ZWQsIGx1YUxfdHlwZW5hbWUoTCwgaW5kZXgpKTsKKyAgbHVhTF9hcmdlcnJvcihMLCBpbmRleCwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgKmNoZWNrZ3JvdXAobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSkgeworICBpZiAoIWx1YV9nZXRtZXRhdGFibGUoTCwgaW5kZXgpKSB7CisgICAgdGhyb3dfYXJnZXJyb3IoTCwgaW5kZXgsIGdyb3VwbmFtZSk7CisgIH0KKworICBsdWFfcHVzaHN0cmluZyhMLCBncm91cG5hbWUpOworICBsdWFfcmF3Z2V0KEwsIC0yKTsKKyAgaWYgKGx1YV9pc25pbChMLCAtMSkpIHsKKyAgICBsdWFfcG9wKEwsIDIpOworICAgIHRocm93X2FyZ2Vycm9yKEwsIGluZGV4LCBncm91cG5hbWUpOworICB9IGVsc2UgeworICAgIGx1YV9wb3AoTCwgMik7CisgICAgcmV0dXJuIGx1YV90b3VzZXJkYXRhKEwsIGluZGV4KTsKKyAgfQorICByZXR1cm4gTlVMTDsgLy8gTm90IHJlYWNoYWJsZQorfQorCitzdGF0aWMgdm9pZCAqY2hlY2t0eXBlKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICp0eXBlbmFtZSkgeworICBpZiAoc3RyY21wKHR5cGVuYW1lLCBTT0NLRVRfQU5ZKSA9PSAwIHx8CisgICAgICBzdHJjbXAodHlwZW5hbWUsIFNPQ0tFVF9DT05OKSA9PSAwKSB7CisgICAgcmV0dXJuIGNoZWNrZ3JvdXAoTCwgaW5kZXgsIHR5cGVuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbHVhTF9jaGVja3VkYXRhKEwsIGluZGV4LCB0eXBlbmFtZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2V0dHlwZShsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqdHlwZW5hbWUpIHsKKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgdHlwZW5hbWUpOworICBsdWFfc2V0bWV0YXRhYmxlKEwsIGluZGV4KTsKK30KKworI2RlZmluZSBMVUFfU1VDQ0VTU19SRVRVUk4oTCkgXAorICBsdWFfcHVzaG51bWJlcihMLCAxKTsgXAorICByZXR1cm4gMQorCisjZGVmaW5lIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKSBcCisgIGlmIChlcnIpIHsgXAorICAgIGx1YV9wdXNobmlsKEwpOyBcCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyKTsgXAorICAgIHJldHVybiAyOyBcCisgIH0gXAorICBMVUFfU1VDQ0VTU19SRVRVUk4oTCkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCBsX3NvY2tldF9jcmVhdGUobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfZGVzdHJveShsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9zZXR0aW1lb3V0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2dldHNvY2tpbmZvKGx1YV9TdGF0ZSAqTCk7CisKK3N0YXRpYyBpbnQgbF9zb2NrZXRfYWNjZXB0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2xpc3RlbihsdWFfU3RhdGUgKkwpOworCitzdGF0aWMgaW50IGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9jb25uZWN0KGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X3NlbmQobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfcmVjZWl2ZShsdWFfU3RhdGUgKkwpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIG1ldGhvZHNfZ2VuZXJpY1tdID0geworICB7ImRlc3Ryb3kiLCAgICAgbF9zb2NrZXRfZGVzdHJveX0sCisgIHsic2V0dGltZW91dCIsICBsX3NvY2tldF9zZXR0aW1lb3V0fSwKKyAgeyJnZXRzb2NraW5mbyIsIGxfc29ja2V0X2dldHNvY2tpbmZvfSwKKyAgeyJsaXN0ZW4iLCAgICAgIGxfc29ja2V0X2xpc3Rlbn0sCisgIHsiY29ubmVjdCIsICAgICBsX3NvY2tldF9jb25uZWN0fSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIG1ldGhvZHNfc2VydmVyW10gPSB7CisgIHsiZGVzdHJveSIsICAgICBsX3NvY2tldF9kZXN0cm95fSwKKyAgeyJnZXRzb2NraW5mbyIsIGxfc29ja2V0X2dldHNvY2tpbmZvfSwKKyAgeyJhY2NlcHQiLCAgICAgIGxfc29ja2V0X2FjY2VwdH0sCisgIHsic2VuZCIsICAgICAgICBsX3NvY2tldF9zZW5kfSwKKyAgeyJyZWNlaXZlIiwgICAgIGxfc29ja2V0X3JlY2VpdmV9LAorICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgbWV0aG9kc19jbGllbnRbXSA9IHsKKyAgeyJkZXN0cm95IiwgICAgIGxfc29ja2V0X2Rlc3Ryb3l9LAorICB7InNldHRpbWVvdXQiLCAgbF9zb2NrZXRfc2V0dGltZW91dH0sCisgIHsiZ2V0c29ja2luZm8iLCBsX3NvY2tldF9nZXRzb2NraW5mb30sCisgIHsic2VuZCIsICAgICAgICBsX3NvY2tldF9zZW5kfSwKKyAgeyJyZWNlaXZlIiwgICAgIGxfc29ja2V0X3JlY2VpdmV9LAorICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgZnVuY3NfbHVhc29ja2V0W10gPSB7CisgIHsiY3JlYXRlIiwgICAgICAgICAgICAgbF9zb2NrZXRfY3JlYXRlfSwKKyAgeyJjcmVhdGVfYW5kX2Nvbm5lY3QiLCBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3R9LAorICB7TlVMTCwgTlVMTH0KK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIENoZWNrL2VuZm9yY2UgaW5oZXJpdGFuY2UKK3N0YXRpYyB2b2lkIGFkZF90b19ncm91cChsdWFfU3RhdGUgKkwsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRhdGFibGVuYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3JvdXBuYW1lKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIG1ldGF0YWJsZW5hbWUpOyAvLyBtdAorICBsdWFfcHVzaHN0cmluZyhMLCBncm91cG5hbWUpOyAgICAgICAgLy8gbXQsICJuYW1lIgorICBsdWFfcHVzaGJvb2xlYW4oTCwgMSk7ICAgICAgICAgICAgICAgLy8gbXQsICJuYW1lIiwgdHJ1ZQorICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgLy8gbXQKKyAgbHVhX3BvcChMLCAxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X21ldGhvZHMobHVhX1N0YXRlICpMLAorICBjb25zdCBjaGFyICptZXRhdGFibGVuYW1lLAorICBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgKm1ldGhvZHMpIHsKKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgbWV0YXRhYmxlbmFtZSk7ICAgLy8gbXQKKyAgLy8gQ3JlYXRlIHRoZSBfX2luZGV4IHRhYmxlCisgIGx1YV9wdXNoc3RyaW5nKEwsICJfX2luZGV4Iik7ICAgICAgICAgIC8vIG10LCAiX19pbmRleCIKKyAgbHVhX25ld3RhYmxlKEwpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXQsICJfX2luZGV4IiwgdAorICBmb3IgKDsgbWV0aG9kcy0+bmFtZTsgbWV0aG9kcysrKSB7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgbWV0aG9kcy0+bmFtZSk7ICAgIC8vIG10LCAiX19pbmRleCIsIHQsICJuYW1lIgorICAgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIG1ldGhvZHMtPmZ1bmMpOyAvLyBtdCwgIl9faW5kZXgiLCB0LCAibmFtZSIsIGZ1bmMKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgLy8gbXQsICJfX2luZGV4IiwgdAorICB9CisgIGx1YV9yYXdzZXQoTCwgLTMpOyAgICAgICAgICAgICAgICAgICAgIC8vIG10CisgIGx1YV9wb3AoTCwgMSk7Cit9CisKK2ludCBsdWFvcGVuX2xpYmx1YXNvY2tldChsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU09DS0VUX0dFTkVSSUMpOworICBsdWFMX25ld21ldGF0YWJsZShMLCBTT0NLRVRfQ0xJRU5UKTsKKyAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU09DS0VUX1NFUlZFUik7CisgIGx1YV9wb3AoTCwgMyk7CisgIGFkZF90b19ncm91cChMLCBTT0NLRVRfR0VORVJJQywgU09DS0VUX0FOWSk7CisgIGFkZF90b19ncm91cChMLCBTT0NLRVRfQ0xJRU5ULCBTT0NLRVRfQU5ZKTsKKyAgYWRkX3RvX2dyb3VwKEwsIFNPQ0tFVF9TRVJWRVIsIFNPQ0tFVF9BTlkpOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX0NMSUVOVCwgU09DS0VUX0NPTk4pOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX1NFUlZFUiwgU09DS0VUX0NPTk4pOworICBzZXRfbWV0aG9kcyhMLCBTT0NLRVRfR0VORVJJQywgbWV0aG9kc19nZW5lcmljKTsKKyAgc2V0X21ldGhvZHMoTCwgU09DS0VUX0NMSUVOVCwgbWV0aG9kc19jbGllbnQpOworICBzZXRfbWV0aG9kcyhMLCBTT0NLRVRfU0VSVkVSLCBtZXRob2RzX3NlcnZlcik7CisKKyAgbHVhTF9yZWdpc3RlcihMLCAibHVhc29ja2V0IiwgZnVuY3NfbHVhc29ja2V0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHZW5lcmFsCisKKy8vIHNvY2ssZXJyIGNyZWF0ZShiaW5kX2hvc3QsIGJpbmRfcG9ydCkKKy8vIHNvY2ssZXJyIGNyZWF0ZShiaW5kX2hvc3QpIC0+IGFueSBwb3J0CisvLyBzb2NrLGVyciBjcmVhdGUoKSAtPiBhbnkgcG9ydCBvbiBsb2NhbGhvc3QKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY3JlYXRlKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICplcnI7CisgIHRfc29ja2V0IHNvY2s7CisgIGNvbnN0IGNoYXIgKmFkZHIgPSBsdWFfdG9zdHJpbmcoTCwgMSk7CisgIGlmICghYWRkcikgeworICAgIGFkZHIgPSBERUZBVUxUX0hPU1Q7CisgIH0KKyAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IGx1YV90b251bWJlcihMLCAyKTsKKyAgZXJyID0gdGNwX2NyZWF0ZSgmc29jayk7CisgIGlmICghZXJyKSB7CisgICAgZXJyID0gdGNwX2JpbmQoJnNvY2ssIGFkZHIsIHBvcnQpOyAvLyBiaW5kIG9uIGNyZWF0ZQorICAgIGlmIChlcnIpIHsKKyAgICAgIHRjcF9kZXN0cm95KCZzb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgICBzZXR0eXBlKEwsIC0yLCBTT0NLRVRfR0VORVJJQyk7CisgICAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoJnNvY2spOworICAgICAgdGNwLT5zb2NrID0gc29jazsKKyAgICAgIHRjcC0+dGltZW91dCA9IDA7CisgICAgICByZXR1cm4gMTsgLy8gUmV0dXJuIHVzZXJkYXRhCisgICAgfQorICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8gZGVzdHJveSgpCitzdGF0aWMgaW50IGxfc29ja2V0X2Rlc3Ryb3kobHVhX1N0YXRlICpMKSB7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9BTlkpOworICBjb25zdCBjaGFyICplcnIgPSB0Y3BfZGVzdHJveSgmdGNwLT5zb2NrKTsKKyAgTFVBX0NIRUNLX1JFVFVSTihMLCBlcnIpOworfQorCisvLyBzZW5kKHNvY2tldCwgZGF0YSkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfc2VuZChsdWFfU3RhdGUgKkwpIHsKKyAgcF90Y3Agc2VsZiA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9DT05OKTsKKyAgcF90Y3AgdGNwID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMiwgU09DS0VUX0NPTk4pOworICBzaXplX3QgbGVuOworICBjb25zdCBjaGFyICpkYXRhID0gbHVhTF9jaGVja2xzdHJpbmcoTCwgMywgJmxlbik7CisgIGNvbnN0IGNoYXIgKmVyciA9CisgICAgdGNwX3NlbmQoJnRjcC0+c29jaywgZGF0YSwgbGVuLCB0Y3AtPnRpbWVvdXQpOworICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKyNkZWZpbmUgTFVBX1JFQURfU1RFUCA4MTkyCitzdGF0aWMgaW50IGxfc29ja2V0X3JlY2VpdmUobHVhX1N0YXRlICpMKSB7CisgIHBfdGNwIHNlbGYgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQ09OTik7CisgIHBfdGNwIGhhbmRsZSA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDIsIFNPQ0tFVF9DT05OKTsKKyAgc2l6ZV90IGxlbiA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMyk7CisgIGNoYXIgYnVmW0xVQV9SRUFEX1NURVBdOworICBjb25zdCBjaGFyICplcnIgPSBOVUxMOworICBpbnQgcmVjZWl2ZWQ7CisgIHNpemVfdCBnb3QgPSAwLCBzdGVwID0gMDsKKyAgbHVhTF9CdWZmZXIgYjsKKworICBsdWFMX2J1ZmZpbml0KEwsICZiKTsKKyAgZG8geworICAgIHN0ZXAgPSAoTFVBX1JFQURfU1RFUCA8IGxlbiAtIGdvdCA/IExVQV9SRUFEX1NURVAgOiBsZW4gLSBnb3QpOworICAgIGVyciA9IHRjcF9yYXdfcmVjZWl2ZSgmaGFuZGxlLT5zb2NrLCBidWYsIHN0ZXAsIHNlbGYtPnRpbWVvdXQsICZyZWNlaXZlZCk7CisgICAgaWYgKGVyciA9PSBOVUxMKSB7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmIsIGJ1ZiwgcmVjZWl2ZWQpOworICAgICAgZ290ICs9IHJlY2VpdmVkOworICAgIH0KKyAgfSB3aGlsZSAoZXJyID09IE5VTEwgJiYgZ290IDwgbGVuKTsKKworICBpZiAoZXJyKSB7CisgICAgbHVhX3B1c2huaWwoTCk7CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgZXJyKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBsdWFMX3B1c2hyZXN1bHQoJmIpOworICByZXR1cm4gMTsKK30KKworLy8gc2V0dGltZW91dCh0aW1lb3V0KQorc3RhdGljIGludCBsX3NvY2tldF9zZXR0aW1lb3V0KGx1YV9TdGF0ZSAqTCkgeworICBwX3RjcCBzZWxmID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX0FOWSk7CisgIGludCB0aW1lb3V0ID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgc2VsZi0+dGltZW91dCA9IHRpbWVvdXQ7CisgIExVQV9TVUNDRVNTX1JFVFVSTihMKTsKK30KKworLy8gdGFibGUgZ2V0c29ja2luZm8oKQorc3RhdGljIGludCBsX3NvY2tldF9nZXRzb2NraW5mbyhsdWFfU3RhdGUgKkwpIHsKKyAgY2hhciBidWZbMjU2XTsKKyAgc2hvcnQgcG9ydCA9IDA7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9BTlkpOworICBpZiAoc29ja2V0X2dldF9pbmZvKCZ0Y3AtPnNvY2ssICZwb3J0LCBidWYsIDI1NikgPT0gU1VDQ0VTUykgeworICAgIGx1YV9uZXd0YWJsZShMKTsgICAgICAgICAgICAgICAgICAgIC8vIHQKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAiaG9zdCIpOyAgICAgICAgICAvLyB0LCAiaG9zdCIKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBidWYpOyAgICAgICAgICAgICAvLyB0LCAiaG9zdCIsIGJ1ZgorICAgIGx1YV9yYXdzZXQoTCwgLTMpOyAgICAgICAgICAgICAgICAgIC8vIHQKKyAgICBsdWFfcHVzaHN0cmluZyhMLCAicG9ydCIpOyAgICAgICAgICAvLyB0LCAicG9ydCIKKyAgICBsdWFfcHVzaG51bWJlcihMLCBwb3J0KTsgICAgICAgICAgICAvLyB0LCAicG9ydCIsIHBvcnQKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAvLyB0CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXJ2ZXIKKworLy8gYWNjZXB0KCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfYWNjZXB0KGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICplcnI7CisgIHBfdGNwIHNlbGYgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfU0VSVkVSKTsKKyAgdF9zb2NrZXQgc29jazsKKyAgZXJyID0gdGNwX2FjY2VwdCgmc2VsZi0+c29jaywgJnNvY2ssIHNlbGYtPnRpbWVvdXQpOworICBpZiAoIWVycikgeyAvLyBTdWNjZXNzCisgICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBjbGllbnQKKyAgICBwX3RjcCBjbGllbnQgPSAocF90Y3ApIGx1YV9uZXd1c2VyZGF0YShMLCBzaXplb2YodF90Y3ApKTsKKyAgICBzZXR0eXBlKEwsIDIsIFNPQ0tFVF9DTElFTlQpOworICAgIHNvY2tldF9zZXRub25ibG9ja2luZygmc29jayk7CisgICAgY2xpZW50LT5zb2NrID0gc29jazsKKyAgICBjbGllbnQtPnRpbWVvdXQgPSBzZWxmLT50aW1lb3V0OworICAgIHJldHVybiAxOworICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworc3RhdGljIGludCBsX3NvY2tldF9saXN0ZW4obHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIqIGVycjsKKyAgcF90Y3AgdGNwID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX0dFTkVSSUMpOworICBpbnQgYmFja2xvZyA9IDEwOworICBlcnIgPSB0Y3BfbGlzdGVuKCZ0Y3AtPnNvY2ssIGJhY2tsb2cpOworICBpZiAoIWVycikgeworICAgIC8vIFNldCB0aGUgY3VycmVudCBhcyBhIHNlcnZlcgorICAgIHNldHR5cGUoTCwgMSwgU09DS0VUX1NFUlZFUik7IC8vIE5vdyBhIHNlcnZlcgorICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsaWVudAorCisvLyBjcmVhdGVfYW5kX2Nvbm5lY3QoaG9zdCwgcG9ydCwgdGltZW91dCkKK2V4dGVybiBkb3VibGUgX19nZXR0aW1lKCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciogZXJyID0gTlVMTDsKKyAgZG91YmxlIGVuZDsKKyAgdF9zb2NrZXQgc29jazsKKyAgY29uc3QgY2hhciAqaG9zdCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICBpbnQgdGltZW91dCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMyk7CisKKyAgLy8gQ3JlYXRlIGFuZCBjb25uZWN0IGxvb3AgZm9yIHRpbWVvdXQgbWlsbGlzZWNvbmRzCisgIGVuZCA9IF9fZ2V0dGltZSgpICsgdGltZW91dC8xMDAwOworICBkbyB7CisgICAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQKKyAgICBlcnIgPSB0Y3BfY3JlYXRlKCZzb2NrKTsKKyAgICBpZiAoIWVycikgeworICAgICAgICAvLyBDb25uZWN0CisgICAgICAgIGVyciA9IHRjcF9jb25uZWN0KCZzb2NrLCBob3N0LCBwb3J0LCB0aW1lb3V0KTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgIHRjcF9kZXN0cm95KCZzb2NrKTsKKyAgICAgICAgICB1c2xlZXAoMTAwMDAwKTsgLy8gc2xlZXAgZm9yIDEwMG1zCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcF90Y3AgdGNwID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgICAgICAgc2V0dHlwZShMLCAtMiwgU09DS0VUX0NMSUVOVCk7CisgICAgICAgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKCZzb2NrKTsKKyAgICAgICAgICB0Y3AtPnNvY2sgPSBzb2NrOworICAgICAgICAgIHRjcC0+dGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgcmV0dXJuIDE7IC8vIFJldHVybiB1c2VyZGF0YQorICAgICAgICB9CisgICAgfQorICB9IHdoaWxlIChlcnIgJiYgX19nZXR0aW1lKCkgPCBlbmQpOworCisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8gY29ubmVjdChob3N0LCBwb3J0KQorc3RhdGljIGludCBsX3NvY2tldF9jb25uZWN0KGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyICplcnI7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9HRU5FUklDKTsKKyAgY29uc3QgY2hhciAqaG9zdCA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMik7CisgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworICBlcnIgPSB0Y3BfY29ubmVjdCgmdGNwLT5zb2NrLCBob3N0LCBwb3J0LCB0Y3AtPnRpbWVvdXQpOworICBpZiAoIWVycikgeworICAgIHNldHR5cGUoTCwgMSwgU09DS0VUX0NMSUVOVCk7IC8vIE5vdyBhIGNsaWVudAorICB9CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3NvY2tldC5oIGIvbGliL2x1YS9zcmMvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiODI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL3NvY2tldC5oCkBAIC0wLDAgKzEsNzggQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaWZuZGVmIExVQV9USFJJRlRfU09DS0VUX0gKKyNkZWZpbmUgTFVBX1RIUklGVF9TT0NLRVRfSAorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWZkZWYgX1dJTjMyCisvLyBTT0wKKyNlbHNlCit0eXBlZGVmIGludCB0X3NvY2tldDsKK3R5cGVkZWYgdF9zb2NrZXQqIHBfc29ja2V0OworI2VuZGlmCisKKy8vIEVycm9yIENvZGVzCitlbnVtIHsKKyAgU1VDQ0VTUyA9IDAsCisgIFRJTUVPVVQgPSAtMSwKKyAgQ0xPU0VEID0gLTIsCit9OwordHlwZWRlZiBpbnQgVF9FUlJDT0RFOworCitzdGF0aWMgY29uc3QgY2hhciAqIFRJTUVPVVRfTVNHID0gIlRpbWVvdXQiOworc3RhdGljIGNvbnN0IGNoYXIgKiBDTE9TRURfTVNHID0gIkNvbm5lY3Rpb24gQ2xvc2VkIjsKKwordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHIgdF9zYTsKK3R5cGVkZWYgdF9zYSAqIHBfc2E7CisKK1RfRVJSQ09ERSBzb2NrZXRfY3JlYXRlKHBfc29ja2V0IHNvY2ssIGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOworVF9FUlJDT0RFIHNvY2tldF9kZXN0cm95KHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9iaW5kKHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuKTsKK1RfRVJSQ09ERSBzb2NrZXRfZ2V0X2luZm8ocF9zb2NrZXQgc29jaywgc2hvcnQgKnBvcnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitUX0VSUkNPREUgc29ja2V0X3NlbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgaW50IHRpbWVvdXQpOworVF9FUlJDT0RFIHNvY2tldF9yZWN2KHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVjZWl2ZWQpOworCitUX0VSUkNPREUgc29ja2V0X3NldGJsb2NraW5nKHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKKworVF9FUlJDT0RFIHNvY2tldF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgc2libGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2EgYWRkciwgc29ja2xlbl90ICphZGRyX2xlbiwgaW50IHRpbWVvdXQpOworVF9FUlJDT0RFIHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpOworCitUX0VSUkNPREUgc29ja2V0X2Nvbm5lY3QocF9zb2NrZXQgc29jaywgcF9zYSBhZGRyLCBpbnQgYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKKworY29uc3QgY2hhciAqIHRjcF9jcmVhdGUocF9zb2NrZXQgc29jayk7Citjb25zdCBjaGFyICogdGNwX2Rlc3Ryb3kocF9zb2NrZXQgc29jayk7Citjb25zdCBjaGFyICogdGNwX2JpbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgc2hvcnQgcG9ydCk7Citjb25zdCBjaGFyICogdGNwX3NlbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KTsKK2NvbnN0IGNoYXIgKiB0Y3BfcmVjZWl2ZShwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3Qgcl9sZW4sIGludCB0aW1lb3V0KTsKK2NvbnN0IGNoYXIgKiB0Y3BfcmF3X3JlY2VpdmUocF9zb2NrZXQgc29jaywgY2hhciAqIGRhdGEsIHNpemVfdCByX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQsIGludCAqcmVjZWl2ZWQpOworCitjb25zdCBjaGFyICogdGNwX2xpc3RlbihwX3NvY2tldCBzb2NrLCBpbnQgYmFja2xvZyk7Citjb25zdCBjaGFyICogdGNwX2FjY2VwdChwX3NvY2tldCBzb2NrLCBwX3NvY2tldCBjbGllbnQsIGludCB0aW1lb3V0KTsKKworY29uc3QgY2hhciAqIHRjcF9jb25uZWN0KHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHNob3J0IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFiNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvdXNvY2tldC5jCkBAIC0wLDAgKzEsMzc2IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPiAvLyBUT0RPIFJFTU9WRQorCisjaW5jbHVkZSAic29ja2V0LmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQcml2YXRlCisKKy8vIE51bSBzZWNvbmRzIHNpbmNlIEphbiAxIDE5NzAgKFVUQykKKyNpZmRlZiBfV0lOMzIKKy8vIFNPTAorI2Vsc2UKKyAgZG91YmxlIF9fZ2V0dGltZSgpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB2OworICAgIGdldHRpbWVvZmRheSgmdiwgKHN0cnVjdCB0aW1lem9uZSopIE5VTEwpOworICAgIHJldHVybiB2LnR2X3NlYyArIHYudHZfdXNlYy8xLjBlNjsKKyAgfQorI2VuZGlmCisKKyNkZWZpbmUgV0FJVF9NT0RFX1IgIDEKKyNkZWZpbmUgV0FJVF9NT0RFX1cgIDIKKyNkZWZpbmUgV0FJVF9NT0RFX0MgIChXQUlUX01PREVfUnxXQUlUX01PREVfVykKK1RfRVJSQ09ERSBzb2NrZXRfd2FpdChwX3NvY2tldCBzb2NrLCBpbnQgbW9kZSwgaW50IHRpbWVvdXQpIHsKKyAgaW50IHJldCA9IDA7CisgIGZkX3NldCByZmRzLCB3ZmRzOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgZG91YmxlIGVuZCwgdDsKKyAgaWYgKCF0aW1lb3V0KSB7CisgICAgcmV0dXJuIFRJTUVPVVQ7CisgIH0KKworICBlbmQgPSBfX2dldHRpbWUoKSArIHRpbWVvdXQvMTAwMDsKKyAgZG8geworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1pFUk8oJndmZHMpOworCisgICAgLy8gU3BlY2lmeSB3aGF0IEkvTyBvcGVyYXRpb25zIHdlIGNhcmUgYWJvdXQKKyAgICBpZiAobW9kZSAmIFdBSVRfTU9ERV9SKSB7CisgICAgICBGRF9TRVQoKnNvY2ssICZyZmRzKTsKKyAgICB9CisgICAgaWYgKG1vZGUgJiBXQUlUX01PREVfVykgeworICAgICAgRkRfU0VUKCpzb2NrLCAmd2Zkcyk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRpbWVvdXQKKyAgICB0ID0gZW5kIC0gX19nZXR0aW1lKCk7CisgICAgaWYgKHQgPCAwLjApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFdhaXQKKyAgICB0di50dl9zZWMgPSAoaW50KXQ7CisgICAgdHYudHZfdXNlYyA9IChpbnQpKCh0IC0gdHYudHZfc2VjKSAqIDEuMGU2KTsKKyAgICByZXQgPSBzZWxlY3QoKnNvY2srMSwgJnJmZHMsICZ3ZmRzLCBOVUxMLCAmdHYpOworICB9IHdoaWxlIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworICBpZiAocmV0ID09IC0xKSB7CisgICAgcmV0dXJuIGVycm5vOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIHRpbWVvdXQKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgcmV0dXJuIFRJTUVPVVQ7CisgIH0KKworICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSByZW1vdGUgaG9zdAorICBpZiAobW9kZSAmIFdBSVRfTU9ERV9DICYmIEZEX0lTU0VUKCpzb2NrLCAmcmZkcykgJiYKKyAgICAgIHJlY3YoKnNvY2ssIChjaGFyKikgJnJmZHMsIDAsIDApICE9IDApIHsKKyAgICByZXR1cm4gZXJybm87CisgIH0KKworICByZXR1cm4gU1VDQ0VTUzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdlbmVyYWwKKworVF9FUlJDT0RFIHNvY2tldF9jcmVhdGUocF9zb2NrZXQgc29jaywgaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkgeworICAqc29jayA9IHNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgaWYgKCpzb2NrID4gMCkgeworICAgIHJldHVybiBTVUNDRVNTOworICB9IGVsc2UgeworICAgIHJldHVybiBlcnJubzsKKyAgfQorfQorCitUX0VSUkNPREUgc29ja2V0X2Rlc3Ryb3kocF9zb2NrZXQgc29jaykgeworICAvLyBUT0RPIEZpZ3VyZSBvdXQgaWYgSSBzaG91bGQgYmUgZnJlZS1pbmcgdGhpcworICBpZiAoKnNvY2sgPiAwKSB7CisgICAgKHZvaWQpc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICAgIGNsb3NlKCpzb2NrKTsKKyAgICAqc29jayA9IC0xOworICB9CisgIHJldHVybiBTVUNDRVNTOworfQorCitUX0VSUkNPREUgc29ja2V0X2JpbmQocF9zb2NrZXQgc29jaywgcF9zYSBhZGRyLCBpbnQgYWRkcl9sZW4pIHsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAoYmluZCgqc29jaywgYWRkciwgYWRkcl9sZW4pKSB7CisgICAgcmV0ID0gZXJybm87CisgIH0KKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7Cit9CisKK1RfRVJSQ09ERSBzb2NrZXRfZ2V0X2luZm8ocF9zb2NrZXQgc29jaywgc2hvcnQgKnBvcnQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHNhKTsKKyAgaW50IHJjID0gZ2V0c29ja25hbWUoKnNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgJmFkZHJsZW4pOworICBpZiAoIXJjKSB7CisgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSgmc2EpOworICAgICAgaWYgKCFpbmV0X250b3AoQUZfSU5FVDYsICZzaW4tPnNpbjZfYWRkciwgYnVmLCBsZW4pKSB7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICAgIH0KKyAgICAgICpwb3J0ID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSgmc2EpOworICAgICAgaWYgKCFpbmV0X250b3AoQUZfSU5FVCwgJnNpbi0+c2luX2FkZHIsIGJ1ZiwgbGVuKSkgeworICAgICAgICByZXR1cm4gZXJybm87CisgICAgICB9CisgICAgICAqcG9ydCA9IG50b2hzKHNpbi0+c2luX3BvcnQpOworICAgIH0KKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorICByZXR1cm4gZXJybm87Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTZXJ2ZXIKKworVF9FUlJDT0RFIHNvY2tldF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgY2xpZW50LAorICAgICAgICAgICAgICAgICAgcF9zYSBhZGRyLCBzb2NrbGVuX3QgKmFkZHJsZW4sIGludCB0aW1lb3V0KSB7CisgIGludCBlcnI7CisgIGlmICgqc29jayA8IDApIHsKKyAgICByZXR1cm4gQ0xPU0VEOworICB9CisgIGRvIHsKKyAgICAqY2xpZW50ID0gYWNjZXB0KCpzb2NrLCBhZGRyLCBhZGRybGVuKTsKKyAgICBpZiAoKmNsaWVudCA+IDApIHsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgfSB3aGlsZSAoKGVyciA9IGVycm5vKSA9PSBFSU5UUik7CisKKyAgaWYgKGVyciA9PSBFQUdBSU4gfHwgZXJyID09IEVDT05OQUJPUlRFRCkgeworICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfUiwgdGltZW91dCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitUX0VSUkNPREUgc29ja2V0X2xpc3RlbihwX3NvY2tldCBzb2NrLCBpbnQgYmFja2xvZykgeworICBpbnQgcmV0ID0gc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICBpZiAocmV0ICE9IFNVQ0NFU1MpIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmIChsaXN0ZW4oKnNvY2ssIGJhY2tsb2cpKSB7CisgICAgcmV0ID0gZXJybm87CisgIH0KKyAgaW50IHJldDIgPSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7CisgIHJldHVybiByZXQgPT0gU1VDQ0VTUyA/IHJldDIgOiByZXQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGllbnQKKworVF9FUlJDT0RFIHNvY2tldF9jb25uZWN0KHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuLCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorCisgIGRvIHsKKyAgICBpZiAoY29ubmVjdCgqc29jaywgYWRkciwgYWRkcl9sZW4pID09IDApIHsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgfSB3aGlsZSAoKGVyciA9IGVycm5vKSA9PSBFSU5UUik7CisgIGlmIChlcnIgIT0gRUlOUFJPR1JFU1MgJiYgZXJyICE9IEVBR0FJTikgeworICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9DLCB0aW1lb3V0KTsKK30KKworVF9FUlJDT0RFIHNvY2tldF9zZW5kKAorICBwX3NvY2tldCBzb2NrLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyLCBwdXQgPSAwOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorICBkbyB7CisgICAgcHV0ID0gc2VuZCgqc29jaywgZGF0YSwgbGVuLCAwKTsKKyAgICBpZiAocHV0ID4gMCkgeworICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgfQorICB9IHdoaWxlICgoZXJyID0gZXJybm8pID09IEVJTlRSKTsKKworICBpZiAoZXJyID09IEVBR0FJTikgeworICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfVywgdGltZW91dCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCitUX0VSUkNPREUgc29ja2V0X3JlY3YoCisgIHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LCBpbnQgKnJlY2VpdmVkKSB7CisgIGludCBlcnIsIGdvdCA9IDA7CisgIGlmICgqc29jayA8IDApIHsKKyAgICByZXR1cm4gQ0xPU0VEOworICB9CisgICpyZWNlaXZlZCA9IDA7CisKKyAgZG8geworICAgIGdvdCA9IHJlY3YoKnNvY2ssIGRhdGEsIGxlbiwgMCk7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgICpyZWNlaXZlZCA9IGdvdDsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgICBlcnIgPSBlcnJubzsKKworICAgIC8vIENvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGJ5IHBlZXIKKyAgICBpZiAoZ290ID09IDApIHsKKyAgICAgIHJldHVybiBDTE9TRUQ7CisgICAgfQorICB9IHdoaWxlIChlcnIgPT0gRUlOVFIpOworCisgIGlmIChlcnIgPT0gRUFHQUlOKSB7CisgICAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9SLCB0aW1lb3V0KTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVdGlsCisKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jaykgeworICBpbnQgZmxhZ3MgPSBmY250bCgqc29jaywgRl9HRVRGTCwgMCk7CisgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgIHJldHVybiBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpICE9IC0xID8gU1VDQ0VTUyA6IGVycm5vOworfQorCitUX0VSUkNPREUgc29ja2V0X3NldGJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKKyAgaW50IGZsYWdzID0gZmNudGwoKnNvY2ssIEZfR0VURkwsIDApOworICBmbGFncyAmPSAofihPX05PTkJMT0NLKSk7CisgIHJldHVybiBmY250bCgqc29jaywgRl9TRVRGTCwgZmxhZ3MpICE9IC0xID8gU1VDQ0VTUyA6IGVycm5vOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVENQCisKKyNkZWZpbmUgRVJST1JTVFJfUkVUVVJOKGVycikgXAorICBpZiAoZXJyID09IFNVQ0NFU1MpIHsgXAorICAgIHJldHVybiBOVUxMOyBcCisgIH0gZWxzZSBpZiAoZXJyID09IFRJTUVPVVQpIHsgXAorICAgIHJldHVybiBUSU1FT1VUX01TRzsgXAorICB9IGVsc2UgaWYgKGVyciA9PSBDTE9TRUQpIHsgXAorICAgIHJldHVybiBDTE9TRURfTVNHOyBcCisgIH0gXAorICByZXR1cm4gc3RyZXJyb3IoZXJyKQorCitjb25zdCBjaGFyICogdGNwX2NyZWF0ZShwX3NvY2tldCBzb2NrKSB7CisgIGludCBlcnIgPSBzb2NrZXRfY3JlYXRlKHNvY2ssIEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfZGVzdHJveShwX3NvY2tldCBzb2NrKSB7CisgIGludCBlcnIgPSBzb2NrZXRfZGVzdHJveShzb2NrKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfYmluZChwX3NvY2tldCBzb2NrLCBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBzaG9ydCBwb3J0KSB7CisgIGludCBlcnI7CisgIHN0cnVjdCBob3N0ZW50ICpoOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWw7CisgIG1lbXNldCgmbG9jYWwsIDAsIHNpemVvZihsb2NhbCkpOworICBsb2NhbC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgbG9jYWwuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgIGxvY2FsLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgIGlmIChzdHJjbXAoaG9zdCwgIioiKSAmJiAhaW5ldF9hdG9uKGhvc3QsICZsb2NhbC5zaW5fYWRkcikpIHsKKyAgICBoID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKKyAgICBpZiAoIWgpIHsKKyAgICAgIHJldHVybiBoc3RyZXJyb3IoaF9lcnJubyk7CisgICAgfQorICAgIG1lbWNweSgmbG9jYWwuc2luX2FkZHIsCisgICAgICAgICAgIChzdHJ1Y3QgaW5fYWRkciAqKWgtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgfQorICBlcnIgPSBzb2NrZXRfYmluZChzb2NrLCAocF9zYSkgJmxvY2FsLCBzaXplb2YobG9jYWwpKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfbGlzdGVuKHBfc29ja2V0IHNvY2ssIGludCBiYWNrbG9nKSB7CisgIGludCBlcnIgPSBzb2NrZXRfbGlzdGVuKHNvY2ssIGJhY2tsb2cpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KKworY29uc3QgY2hhciAqIHRjcF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgY2xpZW50LCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyID0gc29ja2V0X2FjY2VwdChzb2NrLCBjbGllbnQsIE5VTEwsIE5VTEwsIHRpbWVvdXQpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KKworY29uc3QgY2hhciAqIHRjcF9jb25uZWN0KHBfc29ja2V0IHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KSB7CisgIGludCBlcnI7CisgIHN0cnVjdCBob3N0ZW50ICpoOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlOworICBtZW1zZXQoJnJlbW90ZSwgMCwgc2l6ZW9mKHJlbW90ZSkpOworICByZW1vdGUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIHJlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBpZiAoc3RyY21wKGhvc3QsICIqIikgJiYgIWluZXRfYXRvbihob3N0LCAmcmVtb3RlLnNpbl9hZGRyKSkgeworICAgIGggPSBnZXRob3N0YnluYW1lKGhvc3QpOworICAgIGlmICghaCkgeworICAgICAgcmV0dXJuIGhzdHJlcnJvcihoX2Vycm5vKTsKKyAgICB9CisgICAgbWVtY3B5KCZyZW1vdGUuc2luX2FkZHIsCisgICAgICAgICAgIChzdHJ1Y3QgaW5fYWRkciAqKWgtPmhfYWRkcl9saXN0WzBdLAorICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgfQorICBlcnIgPSBzb2NrZXRfY29ubmVjdChzb2NrLCAocF9zYSkgJnJlbW90ZSwgc2l6ZW9mKHJlbW90ZSksIHRpbWVvdXQpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KKworI2RlZmluZSBXUklURV9TVEVQIDgxOTIKK2NvbnN0IGNoYXIgKiB0Y3Bfc2VuZCgKKyAgcF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqIGRhdGEsIHNpemVfdCB3X2xlbiwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVycjsKKyAgc2l6ZV90IHB1dCA9IDAsIHN0ZXA7CisgIGlmICghd19sZW4pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGRvIHsKKyAgICBzdGVwID0gKFdSSVRFX1NURVAgPCB3X2xlbiAtIHB1dCA/IFdSSVRFX1NURVAgOiB3X2xlbiAtIHB1dCk7CisgICAgZXJyID0gc29ja2V0X3NlbmQoc29jaywgZGF0YSArIHB1dCwgc3RlcCwgdGltZW91dCk7CisgICAgcHV0ICs9IHN0ZXA7CisgIH0gd2hpbGUgKGVyciA9PSBTVUNDRVNTICYmIHB1dCA8IHdfbGVuKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfcmF3X3JlY2VpdmUoCisgIHBfc29ja2V0IHNvY2ssIGNoYXIgKiBkYXRhLCBzaXplX3Qgcl9sZW4sIGludCB0aW1lb3V0LCBpbnQgKnJlY2VpdmVkKSB7CisgIGludCBlcnIgPSBzb2NrZXRfcmVjdihzb2NrLCBkYXRhLCByX2xlbiwgdGltZW91dCwgcmVjZWl2ZWQpOworICBFUlJPUlNUUl9SRVRVUk4oZXJyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtIGIvbGliL25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmM2YzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2hlY2stbG9jYWw6CisJJChET1RORVRDT1JFKSB0ZXN0IFRlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCisJJHtET1RORVRDT1JFfSB0ZXN0IFRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBUaHJpZnQvYmluCisJJChSTSkgLXIgVGhyaWZ0L29iagorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJVGVzdHMgXAorCVRocmlmdCBcCisJVGhyaWZ0LnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaCBcCisJcnVudGVzdHMuY21kIFwKKwlydW50ZXN0cy5zaApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvUkVBRE1FLm1kIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YjA0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyNCBAQAorIyBBcGFjaGUgVGhyaWZ0IG5ldGNvcmUKKworVGhyaWZ0IGNsaWVudCBsaWJyYXJ5IHBvcnRlZCB0byBNaWNyb3NvZnQgLk5ldCBDb3JlIAorCisjIENvbnRlbnQKKy0gVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cyAtIHByb2plY3QgZm9yIGNoZWNraW5nIHB1YmxpYyBpbnRlcmZhY2VzIGR1cmluZyBhZGRpbmcgY2hhbmdlcyB0byBUaHJpZnQgbGlicmFyeQorLSBUaHJpZnQgLSBUaHJpZnQgbGlicmFyeSAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gLk5FVCBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIHRoZSBUaHJpZnQuc2xuIHByb2plY3Qgd2l0aCBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZC4KK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyBIb3cgdG8gYnVpbGQgb24gVW5peAorLSBFbnN1cmUgeW91IGhhdmUgLk5FVCBDb3JlIDIuMC4wIFNESyBpbnN0YWxsZWQgb3IgdXNlIHRoZSBVYnVudHUgWGVuaWFsIGRvY2tlciBpbWFnZQorLSBGb2xsb3cgY29tbW9uIGJ1aWxkIHByYWN0aWNlIGZvciBUaHJpZnQ6IGJvb3RzdHJhcCwgY29uZmlndXJlLCBhbmQgbWFrZQorCisjIEtub3duIGlzc3VlcworLSBJbiB0cmFjZSBsb2dnaW5nIG1vZGUgeW91IGNhbiBzZWUgc29tZSBub3QgaW1wb3J0YW50IGludGVybmFsIGV4Y2VwdGlvbnMKKwpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NGMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL0FwYWNoZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvUHJvdG9jb2xzL1Byb3RvY29sc09wZXJhdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MKQEAgLTAsMCArMSw1MDIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIEtlbGxlcm1hblNvZnR3YXJlLkNvbXBhcmVOZXRPYmplY3RzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFByb3RvY29sc09wZXJhdGlvbnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBDb21wYXJlTG9naWMgX2NvbXBhcmVMb2dpYyA9IG5ldyBDb21wYXJlTG9naWMoKTsKKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuQ2FsbCldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLk9uZXdheSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLlJlcGx5KV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWVzc2FnZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlLCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWVzc2FnZShuYW1lb2YoVE1lc3NhZ2UpLCBtZXNzYWdlVHlwZSwgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbE1lc3NhZ2UgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbE1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRTdHJ1Y3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRTdHJ1Y3QobmFtZW9mKFRTdHJ1Y3QpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEZpZWxkX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBURmllbGQobmFtZW9mKFRGaWVsZCksIFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRNYXBfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRNYXAoVFR5cGUuU3RyaW5nLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWFwQmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNYXBFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTGlzdF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVExpc3QoVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUxpc3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRMaXN0QmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU2V0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU2V0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTZXRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFNldEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFNldEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQm9vbF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSB0cnVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlQm9vbEFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCb29sQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRCeXRlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNieXRlLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlQnl0ZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCeXRlQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRJMTZfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gc2hvcnQuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVJMTZBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkSTE2QXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRJMzJfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gaW50Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTMyQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkzMkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTY0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGxvbmcuTWF4VmFsdWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVJNjRBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkSTY0QXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWREb3VibGVfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gZG91YmxlLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRG91YmxlQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZERvdWJsZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RyaW5nX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5hbWVvZihTdHJpbmcpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cmluZ0FzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQmluYXJ5X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMobmFtZW9mKFN0cmluZykpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlQmluYXJ5QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEJpbmFyeUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUdXBsZTxTdHJlYW0sIFRQcm90b2NvbD4gR2V0UHJvdG9jb2xJbnN0YW5jZShUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHZhciBzdHJlYW1DbGllbnRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChtZW1vcnlTdHJlYW0sIG1lbW9yeVN0cmVhbSk7CisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSAoVFByb3RvY29sKSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UocHJvdG9jb2xUeXBlLCBzdHJlYW1DbGllbnRUcmFuc3BvcnQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxTdHJlYW0sIFRQcm90b2NvbD4obWVtb3J5U3RyZWFtLCBwcm90b2NvbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1ZGFjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDI5IEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQuSW50ZWdyYXRpb25UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LkludGVncmF0aW9uVGVzdHM8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iQ29tcGFyZU5FVE9iamVjdHMiIFZlcnNpb249IjQuMy4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5ORVQuVGVzdC5TZGsiIFZlcnNpb249IjE1LjUuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEFkYXB0ZXIiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0RnJhbWV3b3JrIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249IjQuNC4wIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFNlcnZpY2UgSW5jbHVkZT0iezgyYTdmNDhkLTNiNTAtNGIxZS1iODJlLTNhZGE4MjEwYzM1OH0iIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTI5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKKy9BcGFjaGUKKy9GYWNlYm9vawpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9DYXNzYW5kcmFUZXN0LnRocmlmdCBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MjcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQKQEAgLTAsMCArMSw3MDUgQEAKKyMhL3Vzci9sb2NhbC9iaW4vdGhyaWZ0IC0tamF2YSAtLXBocCAtLXB5CisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorIyAqKiogUExFQVNFIFJFTUVNQkVSIFRPIEVESVQgVEhFIFZFUlNJT04gQ09OU1RBTlQgV0hFTiBNQUtJTkcgQ0hBTkdFUyAqKioKKyMgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyMKKyMgSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIENhc3NhbmRyYSBTZXJ2aWNlCisjCisKK25hbWVzcGFjZSBuZXRjb3JlIEFwYWNoZS5DYXNzYW5kcmEuVGVzdAorCisjIFRocmlmdC5yYiBoYXMgYSBidWcgd2hlcmUgdG9wLWxldmVsIG1vZHVsZXMgdGhhdCBpbmNsdWRlIG1vZHVsZXMgCisjIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgbm90IHByb3Blcmx5IHJlZmVyZW5jZWQsIHNvIHdlIGNhbid0IGRvCisjIENhc3NhbmRyYTo6Q2Fzc2FuZHJhOjpDbGllbnQuCituYW1lc3BhY2UgcmIgQ2Fzc2FuZHJhVGhyaWZ0CisKKyMgVGhlIEFQSSB2ZXJzaW9uIChOT1QgdGhlIHByb2R1Y3QgdmVyc2lvbiksIGNvbXBvc2VkIGFzIGEgZG90IGRlbGltaXRlZAorIyBzdHJpbmcgd2l0aCBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCBsZXZlbCBjb21wb25lbnRzLgorIworIyAgLSBNYWpvcjogSW5jcmVtZW50ZWQgZm9yIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzLiBBbiBleGFtcGxlIHdvdWxkCisjICAgICAgICAgICBiZSBjaGFuZ2VzIHRvIHRoZSBudW1iZXIgb3IgZGlzcG9zaXRpb24gb2YgbWV0aG9kIGFyZ3VtZW50cy4KKyMgIC0gTWlub3I6IEluY3JlbWVudGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIGNoYW5nZXMuIEFuIGV4YW1wbGUgd291bGQKKyMgICAgICAgICAgIGJlIHRoZSBhZGRpdGlvbiBvZiBhIG5ldyAob3B0aW9uYWwpIG1ldGhvZC4KKyMgIC0gUGF0Y2g6IEluY3JlbWVudGVkIGZvciBidWcgZml4ZXMuIFRoZSBwYXRjaCBsZXZlbCBzaG91bGQgYmUgaW5jcmVhc2VkCisjICAgICAgICAgICBmb3IgZXZlcnkgZWRpdCB0aGF0IGRvZXNuJ3QgcmVzdWx0IGluIGEgY2hhbmdlIHRvIG1ham9yL21pbm9yLgorIworIyBTZWUgdGhlIFNlbWFudGljIFZlcnNpb25pbmcgU3BlY2lmaWNhdGlvbiAoU2VtVmVyKSBodHRwOi8vc2VtdmVyLm9yZy4KK2NvbnN0IHN0cmluZyBWRVJTSU9OID0gIjE5LjI0LjAiCisKKworIworIyBkYXRhIHN0cnVjdHVyZXMKKyMKKworLyoqIEJhc2ljIHVuaXQgb2YgZGF0YSB3aXRoaW4gYSBDb2x1bW5GYW1pbHkuCisgKiBAcGFyYW0gbmFtZSwgdGhlIG5hbWUgYnkgd2hpY2ggdGhpcyBjb2x1bW4gaXMgc2V0IGFuZCByZXRyaWV2ZWQuICBNYXhpbXVtIDY0S0IgbG9uZy4KKyAqIEBwYXJhbSB2YWx1ZS4gVGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lLiAgTWF4aW11bSAyR0IgbG9uZywgYnV0IGluIHByYWN0aWNlIHlvdSBzaG91bGQgbGltaXQgaXQgdG8gc21hbGwgbnVtYmVycyBvZiBNQiAoc2luY2UgVGhyaWZ0IG11c3QgcmVhZCB0aGUgZnVsbCB2YWx1ZSBpbnRvIG1lbW9yeSB0byBvcGVyYXRlIG9uIGl0KS4KKyAqIEBwYXJhbSB0aW1lc3RhbXAuIFRoZSB0aW1lc3RhbXAgaXMgdXNlZCBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uL3Jlc29sdXRpb24gd2hlbiB0d28gY29sdW1ucyB3aXRoIHNhbWUgbmFtZSBuZWVkIHRvIGJlIGNvbXBhcmVkLgorICogQHBhcmFtIHR0bC4gQW4gb3B0aW9uYWwsIHBvc2l0aXZlIGRlbGF5IChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCB0aGUgY29sdW1uIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkLiAKKyAqLworc3RydWN0IENvbHVtbiB7CisgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgIDI6IG9wdGlvbmFsIGJpbmFyeSB2YWx1ZSwKKyAgIDM6IG9wdGlvbmFsIGk2NCB0aW1lc3RhbXAsCisgICA0OiBvcHRpb25hbCBpMzIgdHRsLAorfQorCisvKiogQSBuYW1lZCBsaXN0IG9mIGNvbHVtbnMuCisgKiBAcGFyYW0gbmFtZS4gc2VlIENvbHVtbi5uYW1lLgorICogQHBhcmFtIGNvbHVtbnMuIEEgY29sbGVjdGlvbiBvZiBzdGFuZGFyZCBDb2x1bW5zLiAgVGhlIGNvbHVtbnMgd2l0aGluIGEgc3VwZXIgY29sdW1uIGFyZSBkZWZpbmVkIGluIGFuIGFkaG9jIG1hbm5lci4KKyAqICAgICAgICAgICAgICAgICBDb2x1bW5zIHdpdGhpbiBhIHN1cGVyIGNvbHVtbiBkbyBub3QgaGF2ZSB0byBoYXZlIG1hdGNoaW5nIHN0cnVjdHVyZXMgKHNpbWlsYXJseSBuYW1lZCBjaGlsZCBjb2x1bW5zKS4KKyAqLworc3RydWN0IFN1cGVyQ29sdW1uIHsKKyAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgMjogcmVxdWlyZWQgbGlzdDxDb2x1bW4+IGNvbHVtbnMsCit9CisKK3N0cnVjdCBDb3VudGVyQ29sdW1uIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBpNjQgdmFsdWUKK30KKworc3RydWN0IENvdW50ZXJTdXBlckNvbHVtbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgbGlzdDxDb3VudGVyQ29sdW1uPiBjb2x1bW5zCit9CisKKy8qKgorICAgIE1ldGhvZHMgZm9yIGZldGNoaW5nIHJvd3MvcmVjb3JkcyBmcm9tIENhc3NhbmRyYSB3aWxsIHJldHVybiBlaXRoZXIgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgQ29sdW1uT3JTdXBlckNvbHVtbiBvciBhIGxpc3QKKyAgICBvZiBDb2x1bW5PclN1cGVyQ29sdW1ucyAoZ2V0X3NsaWNlKCkpLiBJZiB5b3UncmUgbG9va2luZyB1cCBhIFN1cGVyQ29sdW1uIChvciBsaXN0IG9mIFN1cGVyQ29sdW1ucykgdGhlbiB0aGUgcmVzdWx0aW5nCisgICAgaW5zdGFuY2VzIG9mIENvbHVtbk9yU3VwZXJDb2x1bW4gd2lsbCBoYXZlIHRoZSByZXF1ZXN0ZWQgU3VwZXJDb2x1bW4gaW4gdGhlIGF0dHJpYnV0ZSBzdXBlcl9jb2x1bW4uIEZvciBxdWVyaWVzIHJlc3VsdGluZworICAgIGluIENvbHVtbnMsIHRob3NlIHZhbHVlcyB3aWxsIGJlIGluIHRoZSBhdHRyaWJ1dGUgY29sdW1uLiBUaGlzIGNoYW5nZSB3YXMgbWFkZSBiZXR3ZWVuIDAuMyBhbmQgMC40IHRvIHN0YW5kYXJkaXplIG9uCisgICAgc2luZ2xlIHF1ZXJ5IG1ldGhvZHMgdGhhdCBtYXkgcmV0dXJuIGVpdGhlciBhIFN1cGVyQ29sdW1uIG9yIENvbHVtbi4KKworICAgIElmIHRoZSBxdWVyeSB3YXMgb24gYSBjb3VudGVyIGNvbHVtbiBmYW1pbHksIHlvdSB3aWxsIGVpdGhlciBnZXQgYSBjb3VudGVyX2NvbHVtbiAoaW5zdGVhZCBvZiBhIGNvbHVtbikgb3IgYSAKKyAgICBjb3VudGVyX3N1cGVyX2NvbHVtbiAoaW5zdGVhZCBvZiBhIHN1cGVyX2NvbHVtbikKKworICAgIEBwYXJhbSBjb2x1bW4uIFRoZSBDb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIHN1cGVyX2NvbHVtbi4gVGhlIFN1cGVyQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBjb3VudGVyX2NvbHVtbi4gVGhlIENvdW50ZXJvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gY291bnRlcl9zdXBlcl9jb2x1bW4uIFRoZSBDb3VudGVyU3VwZXJDb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgKi8KK3N0cnVjdCBDb2x1bW5PclN1cGVyQ29sdW1uIHsKKyAgICAxOiBvcHRpb25hbCBDb2x1bW4gY29sdW1uLAorICAgIDI6IG9wdGlvbmFsIFN1cGVyQ29sdW1uIHN1cGVyX2NvbHVtbiwKKyAgICAzOiBvcHRpb25hbCBDb3VudGVyQ29sdW1uIGNvdW50ZXJfY29sdW1uLAorICAgIDQ6IG9wdGlvbmFsIENvdW50ZXJTdXBlckNvbHVtbiBjb3VudGVyX3N1cGVyX2NvbHVtbgorfQorCisKKyMKKyMgRXhjZXB0aW9ucworIyAobm90ZSB0aGF0IGludGVybmFsIHNlcnZlciBlcnJvcnMgd2lsbCByYWlzZSBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgY291cnRlc3kgb2YgVGhyaWZ0KQorIworCisvKiogQSBzcGVjaWZpYyBjb2x1bW4gd2FzIHJlcXVlc3RlZCB0aGF0IGRvZXMgbm90IGV4aXN0LiAqLworZXhjZXB0aW9uIE5vdEZvdW5kRXhjZXB0aW9uIHsKK30KKworLyoqIEludmFsaWQgcmVxdWVzdCBjb3VsZCBtZWFuIGtleXNwYWNlIG9yIGNvbHVtbiBmYW1pbHkgZG9lcyBub3QgZXhpc3QsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcsIG9yIGEgcGFyYW1ldGVyIGlzIG1hbGZvcm1lZC4gCisgICAgd2h5IGNvbnRhaW5zIGFuIGFzc29jaWF0ZWQgZXJyb3IgbWVzc2FnZS4KKyovCitleGNlcHRpb24gSW52YWxpZFJlcXVlc3RFeGNlcHRpb24geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB3aHkKK30KKworLyoqIE5vdCBhbGwgdGhlIHJlcGxpY2FzIHJlcXVpcmVkIGNvdWxkIGJlIGNyZWF0ZWQgYW5kL29yIHJlYWQuICovCitleGNlcHRpb24gVW5hdmFpbGFibGVFeGNlcHRpb24geworfQorCisvKiogUlBDIHRpbWVvdXQgd2FzIGV4Y2VlZGVkLiAgZWl0aGVyIGEgbm9kZSBmYWlsZWQgbWlkLW9wZXJhdGlvbiwgb3IgbG9hZCB3YXMgdG9vIGhpZ2gsIG9yIHRoZSByZXF1ZXN0ZWQgb3Agd2FzIHRvbyBsYXJnZS4gKi8KK2V4Y2VwdGlvbiBUaW1lZE91dEV4Y2VwdGlvbiB7Cit9CisKKy8qKiBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgKGludmFsaWQga2V5c3BhY2UsIHVzZXIgZG9lcyBub3QgZXhpc3QsIG9yIGNyZWRlbnRpYWxzIGludmFsaWQpICovCitleGNlcHRpb24gQXV0aGVudGljYXRpb25FeGNlcHRpb24geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB3aHkKK30KKworLyoqIGludmFsaWQgYXV0aG9yaXphdGlvbiByZXF1ZXN0ICh1c2VyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIGtleXNwYWNlKSAqLworZXhjZXB0aW9uIEF1dGhvcml6YXRpb25FeGNlcHRpb24geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB3aHkKK30KKworLyoqIHNjaGVtYXMgYXJlIG5vdCBpbiBhZ3JlZW1lbnQgYWNyb3NzIGFsbCBub2RlcyAqLworZXhjZXB0aW9uIFNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiB7Cit9CisKKworIworIyBzZXJ2aWNlIGFwaQorIworLyoqIAorICogVGhlIENvbnNpc3RlbmN5TGV2ZWwgaXMgYW4gZW51bSB0aGF0IGNvbnRyb2xzIGJvdGggcmVhZCBhbmQgd3JpdGUKKyAqIGJlaGF2aW9yIGJhc2VkIG9uIHRoZSBSZXBsaWNhdGlvbkZhY3RvciBvZiB0aGUga2V5c3BhY2UuICBUaGUKKyAqIGRpZmZlcmVudCBjb25zaXN0ZW5jeSBsZXZlbHMgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZ3MsIGRlcGVuZGluZyBvbgorICogaWYgeW91J3JlIGRvaW5nIGEgd3JpdGUgb3IgcmVhZCBvcGVyYXRpb24uIAorICoKKyAqIElmIFcgKyBSID4gUmVwbGljYXRpb25GYWN0b3IsIHdoZXJlIFcgaXMgdGhlIG51bWJlciBvZiBub2RlcyB0bworICogYmxvY2sgZm9yIG9uIHdyaXRlLCBhbmQgUiB0aGUgbnVtYmVyIHRvIGJsb2NrIGZvciBvbiByZWFkcywgeW91CisgKiB3aWxsIGhhdmUgc3Ryb25nbHkgY29uc2lzdGVudCBiZWhhdmlvcjsgdGhhdCBpcywgcmVhZGVycyB3aWxsCisgKiBhbHdheXMgc2VlIHRoZSBtb3N0IHJlY2VudCB3cml0ZS4gT2YgdGhlc2UsIHRoZSBtb3N0IGludGVyZXN0aW5nIGlzCisgKiB0byBkbyBRVU9SVU0gcmVhZHMgYW5kIHdyaXRlcywgd2hpY2ggZ2l2ZXMgeW91IGNvbnNpc3RlbmN5IHdoaWxlCisgKiBzdGlsbCBhbGxvd2luZyBhdmFpbGFiaWxpdHkgaW4gdGhlIGZhY2Ugb2Ygbm9kZSBmYWlsdXJlcyB1cCB0byBoYWxmCisgKiBvZiA8UmVwbGljYXRpb25GYWN0b3I+LiBPZiBjb3Vyc2UgaWYgbGF0ZW5jeSBpcyBtb3JlIGltcG9ydGFudCB0aGFuCisgKiBjb25zaXN0ZW5jeSB0aGVuIHlvdSBjYW4gdXNlIGxvd2VyIHZhbHVlcyBmb3IgZWl0aGVyIG9yIGJvdGguCisgKiAKKyAqIFNvbWUgQ29uc2lzdGVuY3lMZXZlbHMgKE9ORSwgVFdPLCBUSFJFRSkgcmVmZXIgdG8gYSBzcGVjaWZpYyBudW1iZXIKKyAqIG9mIHJlcGxpY2FzIHJhdGhlciB0aGFuIGEgbG9naWNhbCBjb25jZXB0IHRoYXQgYWRqdXN0cworICogYXV0b21hdGljYWxseSB3aXRoIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IuICBPZiB0aGVzZSwgb25seSBPTkUgaXMKKyAqIGNvbW1vbmx5IHVzZWQ7IFRXTyBhbmQgKGV2ZW4gbW9yZSByYXJlbHkpIFRIUkVFIGFyZSBvbmx5IHVzZWZ1bAorICogd2hlbiB5b3UgY2FyZSBtb3JlIGFib3V0IGd1YXJhbnRlZWluZyBhIGNlcnRhaW4gbGV2ZWwgb2YKKyAqIGR1cmFiaWxpdHksIHRoYW4gY29uc2lzdGVuY3kuCisgKiAKKyAqIFdyaXRlIGNvbnNpc3RlbmN5IGxldmVscyBtYWtlIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBiZWZvcmUgcmVwb3J0aW5nIHN1Y2Nlc3MgdG8gdGhlIGNsaWVudDoKKyAqICAgQU5ZICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIG9uY2Ugc29tZXdoZXJlLCBpbmNsdWRpbmcgcG9zc2libHkgYmVpbmcgaGludGVkIGluIGEgbm9uLXRhcmdldCBub2RlLgorICogICBPTkUgICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMSBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFRXTyAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAyIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgVEhSRUUgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDMgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBRVU9SVU0gICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzCisgKiAgIExPQ0FMX1FVT1JVTSBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byA8UmVwbGljYXRpb25GYWN0b3I+IC8gMiArIDEgbm9kZXMsIHdpdGhpbiB0aGUgbG9jYWwgZGF0YWNlbnRlciAocmVxdWlyZXMgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kpCisgKiAgIEVBQ0hfUVVPUlVNICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byA8UmVwbGljYXRpb25GYWN0b3I+IC8gMiArIDEgbm9kZXMgaW4gZWFjaCBkYXRhY2VudGVyIChyZXF1aXJlcyBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSkKKyAqICAgQUxMICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBpcyB3cml0dGVuIHRvIDxjb2RlPiZsdDtSZXBsaWNhdGlvbkZhY3RvciZndDs8L2NvZGU+IG5vZGVzIGJlZm9yZSByZXNwb25kaW5nIHRvIHRoZSBjbGllbnQuCisgKiAKKyAqIFJlYWQgY29uc2lzdGVuY3kgbGV2ZWxzIG1ha2UgdGhlIGZvbGxvd2luZyBndWFyYW50ZWVzIGJlZm9yZSByZXR1cm5pbmcgc3VjY2Vzc2Z1bCByZXN1bHRzIHRvIHRoZSBjbGllbnQ6CisgKiAgIEFOWSAgICAgICAgICBOb3Qgc3VwcG9ydGVkLiBZb3UgcHJvYmFibHkgd2FudCBPTkUgaW5zdGVhZC4KKyAqICAgT05FICAgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCBvYnRhaW5lZCBmcm9tIGEgc2luZ2xlIHJlcGxpY2EuCisgKiAgIFRXTyAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgdHdvIHJlcGxpY2FzIGhhdmUgcmVwbGllZC4KKyAqICAgVEhSRUUgICAgICAgIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSB0aHJlZSByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIFFVT1JVTSAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYSBtYWpvcml0eSBvZiByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIExPQ0FMX1FVT1JVTSBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYSBtYWpvcml0eSBvZiByZXBsaWNhcyB3aXRoaW4gdGhlIGxvY2FsIGRhdGFjZW50ZXIgaGF2ZSByZXBsaWVkLgorICogICBFQUNIX1FVT1JVTSAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgd2l0aGluIGVhY2ggZGF0YWNlbnRlciBoYXZlIHJlcGxpZWQuCisgKiAgIEFMTCAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgYWxsIHJlcGxpY2FzIGhhdmUgcmVwbGllZCAoaW1wbGllcyBubyByZXBsaWNhIG1heSBiZSBkb3duKS4uCisqLworZW51bSBDb25zaXN0ZW5jeUxldmVsIHsKKyAgICBPTkUgPSAxLAorICAgIFFVT1JVTSA9IDIsCisgICAgTE9DQUxfUVVPUlVNID0gMywKKyAgICBFQUNIX1FVT1JVTSA9IDQsCisgICAgQUxMID0gNSwKKyAgICBBTlkgPSA2LAorICAgIFRXTyA9IDcsCisgICAgVEhSRUUgPSA4LAorfQorCisvKioKKyAgICBDb2x1bW5QYXJlbnQgaXMgdXNlZCB3aGVuIHNlbGVjdGluZyBncm91cHMgb2YgY29sdW1ucyBmcm9tIHRoZSBzYW1lIENvbHVtbkZhbWlseS4gSW4gZGlyZWN0b3J5IHN0cnVjdHVyZSB0ZXJtcywgaW1hZ2luZQorICAgIENvbHVtblBhcmVudCBhcyBDb2x1bW5QYXRoICsgJy8uLi8nLgorCisgICAgU2VlIGFsc28gPGEgaHJlZj0iY2Fzc2FuZHJhLmh0bWwjU3RydWN0X0NvbHVtblBhdGgiPkNvbHVtblBhdGg8L2E+CisgKi8KK3N0cnVjdCBDb2x1bW5QYXJlbnQgeworICAgIDM6IHJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5LAorICAgIDQ6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCit9CisKKy8qKiBUaGUgQ29sdW1uUGF0aCBpcyB0aGUgcGF0aCB0byBhIHNpbmdsZSBjb2x1bW4gaW4gQ2Fzc2FuZHJhLiBJdCBtaWdodCBtYWtlIHNlbnNlIHRvIHRoaW5rIG9mIENvbHVtblBhdGggYW5kCisgKiBDb2x1bW5QYXJlbnQgaW4gdGVybXMgb2YgYSBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICoKKyAqIENvbHVtblBhdGggaXMgdXNlZCB0byBsb29raW5nIHVwIGEgc2luZ2xlIGNvbHVtbi4KKyAqCisgKiBAcGFyYW0gY29sdW1uX2ZhbWlseS4gVGhlIG5hbWUgb2YgdGhlIENGIG9mIHRoZSBjb2x1bW4gYmVpbmcgbG9va2VkIHVwLgorICogQHBhcmFtIHN1cGVyX2NvbHVtbi4gVGhlIHN1cGVyIGNvbHVtbiBuYW1lLgorICogQHBhcmFtIGNvbHVtbi4gVGhlIGNvbHVtbiBuYW1lLgorICovCitzdHJ1Y3QgQ29sdW1uUGF0aCB7CisgICAgMzogcmVxdWlyZWQgc3RyaW5nIGNvbHVtbl9mYW1pbHksCisgICAgNDogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKKyAgICA1OiBvcHRpb25hbCBiaW5hcnkgY29sdW1uLAorfQorCisvKioKKyAgICBBIHNsaWNlIHJhbmdlIGlzIGEgc3RydWN0dXJlIHRoYXQgc3RvcmVzIGJhc2ljIHJhbmdlLCBvcmRlcmluZyBhbmQgbGltaXQgaW5mb3JtYXRpb24gZm9yIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybgorICAgIG11bHRpcGxlIGNvbHVtbnMuIEl0IGNvdWxkIGJlIHRob3VnaHQgb2YgYXMgQ2Fzc2FuZHJhJ3MgdmVyc2lvbiBvZiBMSU1JVCBhbmQgT1JERVIgQlkKKworICAgIEBwYXJhbSBzdGFydC4gVGhlIGNvbHVtbiBuYW1lIHRvIHN0YXJ0IHRoZSBzbGljZSB3aXRoLiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIHRob3VnaCB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgYW5kIGNhbiBiZSBzYWZlbHkgc2V0IHRvICcnLCBpLmUuLCBhbiBlbXB0eSBieXRlIGFycmF5LCB0byBzdGFydCB3aXRoIHRoZSBmaXJzdCBjb2x1bW4gbmFtZS4gT3RoZXJ3aXNlLCBpdAorICAgICAgICAgICAgICAgICAgbXVzdCBhIHZhbGlkIHZhbHVlIHVuZGVyIHRoZSBydWxlcyBvZiB0aGUgQ29tcGFyYXRvciBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gQ29sdW1uRmFtaWx5LgorICAgIEBwYXJhbSBmaW5pc2guIFRoZSBjb2x1bW4gbmFtZSB0byBzdG9wIHRoZSBzbGljZSBhdC4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJlcXVpcmVkLCB0aG91Z2ggdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBhbmQgY2FuIGJlIHNhZmVseSBzZXQgdG8gYW4gZW1wdHkgYnl0ZSBhcnJheSB0byBub3Qgc3RvcCB1bnRpbCAnY291bnQnIHJlc3VsdHMgYXJlIHNlZW4uIE90aGVyd2lzZSwgaXQKKyAgICAgICAgICAgICAgICAgICBtdXN0IGFsc28gYmUgYSB2YWxpZCB2YWx1ZSB0byB0aGUgQ29sdW1uRmFtaWx5IENvbXBhcmF0b3IuCisgICAgQHBhcmFtIHJldmVyc2VkLiBXaGV0aGVyIHRoZSByZXN1bHRzIHNob3VsZCBiZSBvcmRlcmVkIGluIHJldmVyc2VkIG9yZGVyLiBTaW1pbGFyIHRvIE9SREVSIEJZIGJsYWggREVTQyBpbiBTUUwuCisgICAgQHBhcmFtIGNvdW50LiBIb3cgbWFueSBjb2x1bW5zIHRvIHJldHVybi4gU2ltaWxhciB0byBMSU1JVCBpbiBTUUwuIE1heSBiZSBhcmJpdHJhcmlseSBsYXJnZSwgYnV0IFRocmlmdCB3aWxsCisgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZSB0aGUgd2hvbGUgcmVzdWx0IGludG8gbWVtb3J5IGJlZm9yZSByZXR1cm5pbmcgaXQgdG8gdGhlIGNsaWVudCwgc28gYmUgYXdhcmUgdGhhdCB5b3UgbWF5CisgICAgICAgICAgICAgICAgICBiZSBiZXR0ZXIgc2VydmVkIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHNsaWNlcyBieSBwYXNzaW5nIHRoZSBsYXN0IHZhbHVlIG9mIG9uZSBjYWxsIGluIGFzIHRoZSAnc3RhcnQnCisgICAgICAgICAgICAgICAgICBvZiB0aGUgbmV4dCBpbnN0ZWFkIG9mIGluY3JlYXNpbmcgJ2NvdW50JyBhcmJpdHJhcmlseSBsYXJnZS4KKyAqLworc3RydWN0IFNsaWNlUmFuZ2UgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBzdGFydCwKKyAgICAyOiByZXF1aXJlZCBiaW5hcnkgZmluaXNoLAorICAgIDM6IHJlcXVpcmVkIGJvb2wgcmV2ZXJzZWQ9MCwKKyAgICA0OiByZXF1aXJlZCBpMzIgY291bnQ9MTAwLAorfQorCisvKioKKyAgICBBIFNsaWNlUHJlZGljYXRlIGlzIHNpbWlsYXIgdG8gYSBtYXRoZW1hdGljIHByZWRpY2F0ZSAoc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJlZGljYXRlXyhtYXRoZW1hdGljYWxfbG9naWMpKSwKKyAgICB3aGljaCBpcyBkZXNjcmliZWQgYXMgImEgcHJvcGVydHkgdGhhdCB0aGUgZWxlbWVudHMgb2YgYSBzZXQgaGF2ZSBpbiBjb21tb24uIgorCisgICAgU2xpY2VQcmVkaWNhdGUncyBpbiBDYXNzYW5kcmEgYXJlIGRlc2NyaWJlZCB3aXRoIGVpdGhlciBhIGxpc3Qgb2YgY29sdW1uX25hbWVzIG9yIGEgU2xpY2VSYW5nZS4gIElmIGNvbHVtbl9uYW1lcyBpcworICAgIHNwZWNpZmllZCwgc2xpY2VfcmFuZ2UgaXMgaWdub3JlZC4KKworICAgIEBwYXJhbSBjb2x1bW5fbmFtZS4gQSBsaXN0IG9mIGNvbHVtbiBuYW1lcyB0byByZXRyaWV2ZS4gVGhpcyBjYW4gYmUgdXNlZCBzaW1pbGFyIHRvIE1lbWNhY2hlZCdzICJtdWx0aS1nZXQiIGZlYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZldGNoIE4ga25vd24gY29sdW1uIG5hbWVzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBrbm93IHlvdSB3aXNoIHRvIGZldGNoIGNvbHVtbnMgJ0pvZScsICdKYWNrJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAnSmltJyB5b3UgY2FuIHBhc3MgdGhvc2UgY29sdW1uIG5hbWVzIGFzIGEgbGlzdCB0byBmZXRjaCBhbGwgdGhyZWUgYXQgb25jZS4KKyAgICBAcGFyYW0gc2xpY2VfcmFuZ2UuIEEgU2xpY2VSYW5nZSBkZXNjcmliaW5nIGhvdyB0byByYW5nZSwgb3JkZXIsIGFuZC9vciBsaW1pdCB0aGUgc2xpY2UuCisgKi8KK3N0cnVjdCBTbGljZVByZWRpY2F0ZSB7CisgICAgMTogb3B0aW9uYWwgbGlzdDxiaW5hcnk+IGNvbHVtbl9uYW1lcywKKyAgICAyOiBvcHRpb25hbCBTbGljZVJhbmdlICAgc2xpY2VfcmFuZ2UsCit9CisKK2VudW0gSW5kZXhPcGVyYXRvciB7CisgICAgRVEsCisgICAgR1RFLAorICAgIEdULAorICAgIExURSwKKyAgICBMVAorfQorCitzdHJ1Y3QgSW5kZXhFeHByZXNzaW9uIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgY29sdW1uX25hbWUsCisgICAgMjogcmVxdWlyZWQgSW5kZXhPcGVyYXRvciBvcCwKKyAgICAzOiByZXF1aXJlZCBiaW5hcnkgdmFsdWUsCit9CisKK3N0cnVjdCBJbmRleENsYXVzZSB7CisgICAgMTogcmVxdWlyZWQgbGlzdDxJbmRleEV4cHJlc3Npb24+IGV4cHJlc3Npb25zCisgICAgMjogcmVxdWlyZWQgYmluYXJ5IHN0YXJ0X2tleSwKKyAgICAzOiByZXF1aXJlZCBpMzIgY291bnQ9MTAwLAorfQorCisvKioKK1RoZSBzZW1hbnRpY3Mgb2Ygc3RhcnQga2V5cyBhbmQgdG9rZW5zIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQuCitLZXlzIGFyZSBzdGFydC1pbmNsdXNpdmU7IHRva2VucyBhcmUgc3RhcnQtZXhjbHVzaXZlLiAgVG9rZW4KK3JhbmdlcyBtYXkgYWxzbyB3cmFwIC0tIHRoYXQgaXMsIHRoZSBlbmQgdG9rZW4gbWF5IGJlIGxlc3MKK3RoYW4gdGhlIHN0YXJ0IG9uZS4gIFRodXMsIGEgcmFuZ2UgZnJvbSBrZXlYIHRvIGtleVggaXMgYQorb25lLWVsZW1lbnQgcmFuZ2UsIGJ1dCBhIHJhbmdlIGZyb20gdG9rZW5ZIHRvIHRva2VuWSBpcyB0aGUKK2Z1bGwgcmluZy4KKyovCitzdHJ1Y3QgS2V5UmFuZ2UgeworICAgIDE6IG9wdGlvbmFsIGJpbmFyeSBzdGFydF9rZXksCisgICAgMjogb3B0aW9uYWwgYmluYXJ5IGVuZF9rZXksCisgICAgMzogb3B0aW9uYWwgc3RyaW5nIHN0YXJ0X3Rva2VuLAorICAgIDQ6IG9wdGlvbmFsIHN0cmluZyBlbmRfdG9rZW4sCisgICAgNTogcmVxdWlyZWQgaTMyIGNvdW50PTEwMAorfQorCisvKioKKyAgICBBIEtleVNsaWNlIGlzIGtleSBmb2xsb3dlZCBieSB0aGUgZGF0YSBpdCBtYXBzIHRvLiBBIGNvbGxlY3Rpb24gb2YgS2V5U2xpY2UgaXMgcmV0dXJuZWQgYnkgdGhlIGdldF9yYW5nZV9zbGljZSBvcGVyYXRpb24uCisKKyAgICBAcGFyYW0ga2V5LiBhIHJvdyBrZXkKKyAgICBAcGFyYW0gY29sdW1ucy4gTGlzdCBvZiBkYXRhIHJlcHJlc2VudGVkIGJ5IHRoZSBrZXkuIFR5cGljYWxseSwgdGhlIGxpc3QgaXMgcGFyZWQgZG93biB0byBvbmx5IHRoZSBjb2x1bW5zIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICBhIFNsaWNlUHJlZGljYXRlLgorICovCitzdHJ1Y3QgS2V5U2xpY2UgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgMjogcmVxdWlyZWQgbGlzdDxDb2x1bW5PclN1cGVyQ29sdW1uPiBjb2x1bW5zLAorfQorCitzdHJ1Y3QgS2V5Q291bnQgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgMjogcmVxdWlyZWQgaTMyIGNvdW50Cit9CisKKy8qKgorICogTm90ZSB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgb25seSBvcHRpb25hbCBpbiBjYXNlIG9mIGNvdW50ZXIgZGVsZXRpb24uCisgKi8KK3N0cnVjdCBEZWxldGlvbiB7CisgICAgMTogb3B0aW9uYWwgaTY0IHRpbWVzdGFtcCwKKyAgICAyOiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorICAgIDM6IG9wdGlvbmFsIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKK30KKworLyoqCisgICAgQSBNdXRhdGlvbiBpcyBlaXRoZXIgYW4gaW5zZXJ0IChyZXByZXNlbnRlZCBieSBmaWxsaW5nIGNvbHVtbl9vcl9zdXBlcmNvbHVtbikgb3IgYSBkZWxldGlvbiAocmVwcmVzZW50ZWQgYnkgZmlsbGluZyB0aGUgZGVsZXRpb24gYXR0cmlidXRlKS4KKyAgICBAcGFyYW0gY29sdW1uX29yX3N1cGVyY29sdW1uLiBBbiBpbnNlcnQgdG8gYSBjb2x1bW4gb3Igc3VwZXJjb2x1bW4gKHBvc3NpYmx5IGNvdW50ZXIgY29sdW1uIG9yIHN1cGVyY29sdW1uKQorICAgIEBwYXJhbSBkZWxldGlvbi4gQSBkZWxldGlvbiBvZiBhIGNvbHVtbiBvciBzdXBlcmNvbHVtbgorKi8KK3N0cnVjdCBNdXRhdGlvbiB7CisgICAgMTogb3B0aW9uYWwgQ29sdW1uT3JTdXBlckNvbHVtbiBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4sCisgICAgMjogb3B0aW9uYWwgRGVsZXRpb24gZGVsZXRpb24sCit9CisKK3N0cnVjdCBFbmRwb2ludERldGFpbHMgeworICAgIDE6IHN0cmluZyBob3N0LAorICAgIDI6IHN0cmluZyBkYXRhY2VudGVyLAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyByYWNrCit9CisKKy8qKgorICAgIEEgVG9rZW5SYW5nZSBkZXNjcmliZXMgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIHJpbmcsIGl0IGlzIGEgbWFwcGluZyBmcm9tIGEgcmFuZ2UgdG8KKyAgICBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoYXQgcmFuZ2UuCisgICAgQHBhcmFtIHN0YXJ0X3Rva2VuIFRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcmFuZ2UKKyAgICBAcGFyYW0gZW5kX3Rva2VuIFRoZSBsYXN0IHRva2VuIGluIHRoZSByYW5nZQorICAgIEBwYXJhbSBlbmRwb2ludHMgVGhlIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhlIHJhbmdlIChsaXN0ZWQgYnkgdGhlaXIgY29uZmlndXJlZCBsaXN0ZW5fYWRkcmVzcykKKyAgICBAcGFyYW0gcnBjX2VuZHBvaW50cyBUaGUgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmFuZ2UgKGxpc3RlZCBieSB0aGVpciBjb25maWd1cmVkIHJwY19hZGRyZXNzKQorKi8KK3N0cnVjdCBUb2tlblJhbmdlIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgc3RhcnRfdG9rZW4sCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIGVuZF90b2tlbiwKKyAgICAzOiByZXF1aXJlZCBsaXN0PHN0cmluZz4gZW5kcG9pbnRzLAorICAgIDQ6IG9wdGlvbmFsIGxpc3Q8c3RyaW5nPiBycGNfZW5kcG9pbnRzCisgICAgNTogb3B0aW9uYWwgbGlzdDxFbmRwb2ludERldGFpbHM+IGVuZHBvaW50X2RldGFpbHMsCit9CisKKy8qKgorICAgIEF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzIGNhbiBjb250YWluIGFueSBkYXRhLCBkZXBlbmRlbnQgb24gdGhlIElBdXRoZW50aWNhdG9yIHVzZWQKKyovCitzdHJ1Y3QgQXV0aGVudGljYXRpb25SZXF1ZXN0IHsKKyAgICAxOiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IGNyZWRlbnRpYWxzCit9CisKK2VudW0gSW5kZXhUeXBlIHsKKyAgICBLRVlTLAorICAgIENVU1RPTQorfQorCisvKiBkZXNjcmliZXMgYSBjb2x1bW4gaW4gYSBjb2x1bW4gZmFtaWx5LiAqLworc3RydWN0IENvbHVtbkRlZiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHZhbGlkYXRpb25fY2xhc3MsCisgICAgMzogb3B0aW9uYWwgSW5kZXhUeXBlIGluZGV4X3R5cGUsCisgICAgNDogb3B0aW9uYWwgc3RyaW5nIGluZGV4X25hbWUsCisgICAgNTogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGluZGV4X29wdGlvbnMKK30KKworCisvKiBkZXNjcmliZXMgYSBjb2x1bW4gZmFtaWx5LiAqLworc3RydWN0IENmRGVmIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIG5hbWUsCisgICAgMzogb3B0aW9uYWwgc3RyaW5nIGNvbHVtbl90eXBlPSJTdGFuZGFyZCIsCisgICAgNTogb3B0aW9uYWwgc3RyaW5nIGNvbXBhcmF0b3JfdHlwZT0iQnl0ZXNUeXBlIiwKKyAgICA2OiBvcHRpb25hbCBzdHJpbmcgc3ViY29tcGFyYXRvcl90eXBlLAorICAgIDg6IG9wdGlvbmFsIHN0cmluZyBjb21tZW50LAorICAgIDEyOiBvcHRpb25hbCBkb3VibGUgcmVhZF9yZXBhaXJfY2hhbmNlPTEuMCwKKyAgICAxMzogb3B0aW9uYWwgbGlzdDxDb2x1bW5EZWY+IGNvbHVtbl9tZXRhZGF0YSwKKyAgICAxNDogb3B0aW9uYWwgaTMyIGdjX2dyYWNlX3NlY29uZHMsCisgICAgMTU6IG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbGlkYXRpb25fY2xhc3MsCisgICAgMTY6IG9wdGlvbmFsIGkzMiBpZCwKKyAgICAxNzogb3B0aW9uYWwgaTMyIG1pbl9jb21wYWN0aW9uX3RocmVzaG9sZCwKKyAgICAxODogb3B0aW9uYWwgaTMyIG1heF9jb21wYWN0aW9uX3RocmVzaG9sZCwKKyAgICAyNDogb3B0aW9uYWwgYm9vbCByZXBsaWNhdGVfb25fd3JpdGUsCisgICAgMjU6IG9wdGlvbmFsIGRvdWJsZSBtZXJnZV9zaGFyZHNfY2hhbmNlLAorICAgIDI2OiBvcHRpb25hbCBzdHJpbmcga2V5X3ZhbGlkYXRpb25fY2xhc3MsCisgICAgMjg6IG9wdGlvbmFsIGJpbmFyeSBrZXlfYWxpYXMsCisgICAgMjk6IG9wdGlvbmFsIHN0cmluZyBjb21wYWN0aW9uX3N0cmF0ZWd5LAorICAgIDMwOiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gY29tcGFjdGlvbl9zdHJhdGVneV9vcHRpb25zLAorICAgIDMyOiBvcHRpb25hbCBtYXA8c3RyaW5nLHN0cmluZz4gY29tcHJlc3Npb25fb3B0aW9ucywKKyAgICAzMzogb3B0aW9uYWwgZG91YmxlIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UsCit9CisKKy8qIGRlc2NyaWJlcyBhIGtleXNwYWNlLiAqLworc3RydWN0IEtzRGVmIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZSwKKyAgICAyOiByZXF1aXJlZCBzdHJpbmcgc3RyYXRlZ3lfY2xhc3MsCisgICAgMzogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IHN0cmF0ZWd5X29wdGlvbnMsCisKKyAgICAvKiogQGRlcHJlY2F0ZWQgKi8KKyAgICA0OiBvcHRpb25hbCBpMzIgcmVwbGljYXRpb25fZmFjdG9yLCAKKworICAgIDU6IHJlcXVpcmVkIGxpc3Q8Q2ZEZWY+IGNmX2RlZnMsCisgICAgNjogb3B0aW9uYWwgYm9vbCBkdXJhYmxlX3dyaXRlcz0xLAorfQorCisvKiogQ1FMIHF1ZXJ5IGNvbXByZXNzaW9uICovCitlbnVtIENvbXByZXNzaW9uIHsKKyAgICBHWklQID0gMSwKKyAgICBOT05FID0gMgorfQorCitlbnVtIENxbFJlc3VsdFR5cGUgeworICAgIFJPV1MgPSAxLAorICAgIFZPSUQgPSAyLAorICAgIElOVCA9IDMKK30KKworLyoqIFJvdyByZXR1cm5lZCBmcm9tIGEgQ1FMIHF1ZXJ5ICovCitzdHJ1Y3QgQ3FsUm93IHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uPiBjb2x1bW5zCit9CisKK3N0cnVjdCBDcWxNZXRhZGF0YSB7CisgICAgMTogcmVxdWlyZWQgbWFwPGJpbmFyeSxzdHJpbmc+IG5hbWVfdHlwZXMsCisgICAgMjogcmVxdWlyZWQgbWFwPGJpbmFyeSxzdHJpbmc+IHZhbHVlX3R5cGVzLAorICAgIDM6IHJlcXVpcmVkIHN0cmluZyBkZWZhdWx0X25hbWVfdHlwZSwKKyAgICA0OiByZXF1aXJlZCBzdHJpbmcgZGVmYXVsdF92YWx1ZV90eXBlCit9CisKK3N0cnVjdCBDcWxSZXN1bHQgeworICAgIDE6IHJlcXVpcmVkIENxbFJlc3VsdFR5cGUgdHlwZSwKKyAgICAyOiBvcHRpb25hbCBsaXN0PENxbFJvdz4gcm93cywKKyAgICAzOiBvcHRpb25hbCBpMzIgbnVtLAorICAgIDQ6IG9wdGlvbmFsIENxbE1ldGFkYXRhIHNjaGVtYQorfQorCitzdHJ1Y3QgQ3FsUHJlcGFyZWRSZXN1bHQgeworICAgIDE6IHJlcXVpcmVkIGkzMiBpdGVtSWQsCisgICAgMjogcmVxdWlyZWQgaTMyIGNvdW50Cit9CisKKworc2VydmljZSBDYXNzYW5kcmEgeworICAjIGF1dGggbWV0aG9kcworICB2b2lkIGxvZ2luKDE6IHJlcXVpcmVkIEF1dGhlbnRpY2F0aW9uUmVxdWVzdCBhdXRoX3JlcXVlc3QpIHRocm93cyAoMTpBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBhdXRobngsIDI6QXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhdXRoengpLAorIAorICAjIHNldCBrZXlzcGFjZQorICB2b2lkIHNldF9rZXlzcGFjZSgxOiByZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorICAKKyAgIyByZXRyaWV2YWwgbWV0aG9kcworCisgIC8qKgorICAgIEdldCB0aGUgQ29sdW1uIG9yIFN1cGVyQ29sdW1uIGF0IHRoZSBnaXZlbiBjb2x1bW5fcGF0aC4gSWYgbm8gdmFsdWUgaXMgcHJlc2VudCwgTm90Rm91bmRFeGNlcHRpb24gaXMgdGhyb3duLiAoVGhpcyBpcworICAgIHRoZSBvbmx5IG1ldGhvZCB0aGF0IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gdW5kZXIgbm9uLWZhaWx1cmUgY29uZGl0aW9ucy4pCisgICAqLworICBDb2x1bW5PclN1cGVyQ29sdW1uIGdldCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBjb2x1bW5fcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6Tm90Rm91bmRFeGNlcHRpb24gbmZlLCAzOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCA0OlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBHZXQgdGhlIGdyb3VwIG9mIGNvbHVtbnMgY29udGFpbmVkIGJ5IGNvbHVtbl9wYXJlbnQgKGVpdGhlciBhIENvbHVtbkZhbWlseSBuYW1lIG9yIGEgQ29sdW1uRmFtaWx5L1N1cGVyQ29sdW1uIG5hbWUKKyAgICBwYWlyKSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFNsaWNlUHJlZGljYXRlLiBJZiBubyBtYXRjaGluZyB2YWx1ZXMgYXJlIGZvdW5kLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgorICAgKi8KKyAgbGlzdDxDb2x1bW5PclN1cGVyQ29sdW1uPiBnZXRfc2xpY2UoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG1hdGNoaW5nIDxjb2RlPnByZWRpY2F0ZTwvY29kZT4gZm9yIGEgcGFydGljdWxhciA8Y29kZT5rZXk8L2NvZGU+LCAKKyAgICA8Y29kZT5Db2x1bW5GYW1pbHk8L2NvZGU+IGFuZCBvcHRpb25hbGx5IDxjb2RlPlN1cGVyQ29sdW1uPC9jb2RlPi4KKyAgKi8KKyAgaTMyIGdldF9jb3VudCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksIAorICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFBlcmZvcm1zIGEgZ2V0X3NsaWNlIGZvciBjb2x1bW5fcGFyZW50IGFuZCBwcmVkaWNhdGUgZm9yIHRoZSBnaXZlbiBrZXlzIGluIHBhcmFsbGVsLgorICAqLworICBtYXA8YmluYXJ5LGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4+IG11bHRpZ2V0X3NsaWNlKDE6cmVxdWlyZWQgbGlzdDxiaW5hcnk+IGtleXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUGVyZm9ybSBhIGdldF9jb3VudCBpbiBwYXJhbGxlbCBvbiB0aGUgZ2l2ZW4gbGlzdDxiaW5hcnk+IGtleXMuIFRoZSByZXR1cm4gdmFsdWUgbWFwcyBrZXlzIHRvIHRoZSBjb3VudCBmb3VuZC4KKyAgKi8KKyAgbWFwPGJpbmFyeSwgaTMyPiBtdWx0aWdldF9jb3VudCgxOnJlcXVpcmVkIGxpc3Q8YmluYXJ5PiBrZXlzLAorICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICByZXR1cm5zIGEgc3Vic2V0IG9mIGNvbHVtbnMgZm9yIGEgY29udGlndW91cyByYW5nZSBvZiBrZXlzLgorICAqLworICBsaXN0PEtleVNsaWNlPiBnZXRfcmFuZ2Vfc2xpY2VzKDE6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgS2V5UmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKiogUmV0dXJucyB0aGUgc3Vic2V0IG9mIGNvbHVtbnMgc3BlY2lmaWVkIGluIFNsaWNlUHJlZGljYXRlIGZvciB0aGUgcm93cyBtYXRjaGluZyB0aGUgSW5kZXhDbGF1c2UgKi8KKyAgbGlzdDxLZXlTbGljZT4gZ2V0X2luZGV4ZWRfc2xpY2VzKDE6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIEluZGV4Q2xhdXNlIGluZGV4X2NsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgY29sdW1uX3ByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgIyBtb2RpZmljYXRpb24gbWV0aG9kcworCisgIC8qKgorICAgKiBJbnNlcnQgYSBDb2x1bW4gYXQgdGhlIGdpdmVuIGNvbHVtbl9wYXJlbnQuY29sdW1uX2ZhbWlseSBhbmQgb3B0aW9uYWwgY29sdW1uX3BhcmVudC5zdXBlcl9jb2x1bW4uCisgICAqLworICB2b2lkIGluc2VydCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksIAorICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAzOnJlcXVpcmVkIENvbHVtbiBjb2x1bW4sCisgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICogSW5jcmVtZW50IG9yIGRlY3JlbWVudCBhIGNvdW50ZXIuCisgICAqLworICB2b2lkIGFkZCgxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsCisgICAgICAgICAgIDM6cmVxdWlyZWQgQ291bnRlckNvbHVtbiBjb2x1bW4sCisgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBSZW1vdmUgZGF0YSBmcm9tIHRoZSByb3cgc3BlY2lmaWVkIGJ5IGtleSBhdCB0aGUgZ3JhbnVsYXJpdHkgc3BlY2lmaWVkIGJ5IGNvbHVtbl9wYXRoLCBhbmQgdGhlIGdpdmVuIHRpbWVzdGFtcC4gTm90ZQorICAgIHRoYXQgYWxsIHRoZSB2YWx1ZXMgaW4gY29sdW1uX3BhdGggYmVzaWRlcyBjb2x1bW5fcGF0aC5jb2x1bW5fZmFtaWx5IGFyZSB0cnVseSBvcHRpb25hbDogeW91IGNhbiByZW1vdmUgdGhlIGVudGlyZQorICAgIHJvdyBieSBqdXN0IHNwZWNpZnlpbmcgdGhlIENvbHVtbkZhbWlseSwgb3IgeW91IGNhbiByZW1vdmUgYSBTdXBlckNvbHVtbiBvciBhIHNpbmdsZSBDb2x1bW4gYnkgc3BlY2lmeWluZyB0aG9zZSBsZXZlbHMgdG9vLgorICAgKi8KKyAgdm9pZCByZW1vdmUoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggY29sdW1uX3BhdGgsCisgICAgICAgICAgICAgIDM6cmVxdWlyZWQgaTY0IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgNDpDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgKiBSZW1vdmUgYSBjb3VudGVyIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAqIE5vdGUgdGhhdCBjb3VudGVycyBoYXZlIGxpbWl0ZWQgc3VwcG9ydCBmb3IgZGVsZXRlczogaWYgeW91IHJlbW92ZSBhIGNvdW50ZXIsIHlvdSBtdXN0IHdhaXQgdG8gaXNzdWUgYW55IGZvbGxvd2luZyB1cGRhdGUKKyAgICogdW50aWwgdGhlIGRlbGV0ZSBoYXMgcmVhY2hlZCBhbGwgdGhlIG5vZGVzIGFuZCBhbGwgb2YgdGhlbSBoYXZlIGJlZW4gZnVsbHkgY29tcGFjdGVkLgorICAgKi8KKyAgdm9pZCByZW1vdmVfY291bnRlcigxOnJlcXVpcmVkIGJpbmFyeSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKworICAvKioKKyAgICBNdXRhdGUgbWFueSBjb2x1bW5zIG9yIHN1cGVyIGNvbHVtbnMgZm9yIG1hbnkgcm93IGtleXMuIFNlZSBhbHNvOiBNdXRhdGlvbi4KKworICAgIG11dGF0aW9uX21hcCBtYXBzIGtleSB0byBjb2x1bW4gZmFtaWx5IHRvIGEgbGlzdCBvZiBNdXRhdGlvbiBvYmplY3RzIHRvIHRha2UgcGxhY2UgYXQgdGhhdCBzY29wZS4KKyAgKiovCisgIHZvaWQgYmF0Y2hfbXV0YXRlKDE6cmVxdWlyZWQgbWFwPGJpbmFyeSwgbWFwPHN0cmluZywgbGlzdDxNdXRhdGlvbj4+PiBtdXRhdGlvbl9tYXAsCisgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKyAgICAgICAKKyAgLyoqCisgICBUcnVuY2F0ZSB3aWxsIG1hcmsgYW5kIGVudGlyZSBjb2x1bW4gZmFtaWx5IGFzIGRlbGV0ZWQuCisgICBGcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUgYSBzdWNjZXNzZnVsIGNhbGwgdG8gdHJ1bmNhdGUgd2lsbCByZXN1bHQgY29tcGxldGUgZGF0YSBkZWxldGlvbiBmcm9tIGNmbmFtZS4KKyAgIEludGVybmFsbHksIGhvd2V2ZXIsIGRpc2sgc3BhY2Ugd2lsbCBub3QgYmUgaW1tZWRpYXRpbHkgcmVsZWFzZWQsIGFzIHdpdGggYWxsIGRlbGV0ZXMgaW4gY2Fzc2FuZHJhLCB0aGlzIG9uZQorICAgb25seSBtYXJrcyB0aGUgZGF0YSBhcyBkZWxldGVkLgorICAgVGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBvbmx5IGlmIGFsbCBob3N0cyBpbiB0aGUgY2x1c3RlciBhdCBhdmFpbGFibGUgYW5kIHdpbGwgdGhyb3cgYW4gVW5hdmFpbGFibGVFeGNlcHRpb24gaWYgCisgICBzb21lIGhvc3RzIGFyZSBkb3duLgorICAqLworICB2b2lkIHRydW5jYXRlKDE6cmVxdWlyZWQgc3RyaW5nIGNmbmFtZSkKKyAgICAgICB0aHJvd3MgKDE6IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjogVW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6IFRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworCisgICAgCisgIC8vIE1ldGEtQVBJcyAtLSBBUElzIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSBvciBjbHVzdGVyLAorICAvLyByYXRoZXIgdGhhbiB1c2VyIGRhdGEuICBUaGUgbm9kZXByb2JlIHByb2dyYW0gcHJvdmlkZXMgdXNhZ2UgZXhhbXBsZXMuCisgIAorICAvKiogCisgICAqIGZvciBlYWNoIHNjaGVtYSB2ZXJzaW9uIHByZXNlbnQgaW4gdGhlIGNsdXN0ZXIsIHJldHVybnMgYSBsaXN0IG9mIG5vZGVzIGF0IHRoYXQgdmVyc2lvbi4KKyAgICogaG9zdHMgdGhhdCBkbyBub3QgcmVzcG9uZCB3aWxsIGJlIHVuZGVyIHRoZSBrZXkgRGF0YWJhc2VEZXNjcmlwdG9yLklOSVRJQUxfVkVSU0lPTi4gCisgICAqIHRoZSBjbHVzdGVyIGlzIGFsbCBvbiB0aGUgc2FtZSB2ZXJzaW9uIGlmIHRoZSBzaXplIG9mIHRoZSBtYXAgaXMgMS4gCisgICAqLworICBtYXA8c3RyaW5nLCBsaXN0PHN0cmluZz4+IGRlc2NyaWJlX3NjaGVtYV92ZXJzaW9ucygpCisgICAgICAgdGhyb3dzICgxOiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBsaXN0IHRoZSBkZWZpbmVkIGtleXNwYWNlcyBpbiB0aGlzIGNsdXN0ZXIgKi8KKyAgbGlzdDxLc0RlZj4gZGVzY3JpYmVfa2V5c3BhY2VzKCkKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogZ2V0IHRoZSBjbHVzdGVyIG5hbWUgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX2NsdXN0ZXJfbmFtZSgpLAorCisgIC8qKiBnZXQgdGhlIHRocmlmdCBhcGkgdmVyc2lvbiAqLworICBzdHJpbmcgZGVzY3JpYmVfdmVyc2lvbigpLAorCisgIC8qKiBnZXQgdGhlIHRva2VuIHJpbmc6IGEgbWFwIG9mIHJhbmdlcyB0byBob3N0IGFkZHJlc3NlcywKKyAgICAgIHJlcHJlc2VudGVkIGFzIGEgc2V0IG9mIFRva2VuUmFuZ2UgaW5zdGVhZCBvZiBhIG1hcCBmcm9tIHJhbmdlCisgICAgICB0byBsaXN0IG9mIGVuZHBvaW50cywgYmVjYXVzZSB5b3UgY2FuJ3QgdXNlIFRocmlmdCBzdHJ1Y3RzIGFzCisgICAgICBtYXAga2V5czoKKyAgICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTE2MiAKKworICAgICAgZm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgY2FuJ3QgcmV0dXJuIGEgc2V0IGhlcmUsIGV2ZW4gdGhvdWdoCisgICAgICBvcmRlciBpcyBuZWl0aGVyIGltcG9ydGFudCBub3IgcHJlZGljdGFibGUuICovCisgIGxpc3Q8VG9rZW5SYW5nZT4gZGVzY3JpYmVfcmluZygxOnJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogcmV0dXJucyB0aGUgcGFydGl0aW9uZXIgdXNlZCBieSB0aGlzIGNsdXN0ZXIgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3BhcnRpdGlvbmVyKCksCisKKyAgLyoqIHJldHVybnMgdGhlIHNuaXRjaCB1c2VkIGJ5IHRoaXMgY2x1c3RlciAqLworICBzdHJpbmcgZGVzY3JpYmVfc25pdGNoKCksCisKKyAgLyoqIGRlc2NyaWJlIHNwZWNpZmllZCBrZXlzcGFjZSAqLworICBLc0RlZiBkZXNjcmliZV9rZXlzcGFjZSgxOnJlcXVpcmVkIHN0cmluZyBrZXlzcGFjZSkKKyAgICB0aHJvd3MgKDE6Tm90Rm91bmRFeGNlcHRpb24gbmZlLCAyOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGV4cGVyaW1lbnRhbCBBUEkgZm9yIGhhZG9vcC9wYXJhbGxlbCBxdWVyeSBzdXBwb3J0LiAgCisgICAgICBtYXkgY2hhbmdlIHZpb2xlbnRseSBhbmQgd2l0aG91dCB3YXJuaW5nLiAKKworICAgICAgcmV0dXJucyBsaXN0IG9mIHRva2VuIHN0cmluZ3Mgc3VjaCB0aGF0IGZpcnN0IHN1YnJhbmdlIGlzIChsaXN0WzBdLCBsaXN0WzFdXSwKKyAgICAgIG5leHQgaXMgKGxpc3RbMV0sIGxpc3RbMl1dLCBldGMuICovCisgIGxpc3Q8c3RyaW5nPiBkZXNjcmliZV9zcGxpdHMoMTpyZXF1aXJlZCBzdHJpbmcgY2ZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgc3RyaW5nIHN0YXJ0X3Rva2VuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIHN0cmluZyBlbmRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBpMzIga2V5c19wZXJfc3BsaXQpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGFkZHMgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2FkZF9jb2x1bW5fZmFtaWx5KDE6cmVxdWlyZWQgQ2ZEZWYgY2ZfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgICAgCisgIC8qKiBkcm9wcyBhIGNvbHVtbiBmYW1pbHkuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fZHJvcF9jb2x1bW5fZmFtaWx5KDE6cmVxdWlyZWQgc3RyaW5nIGNvbHVtbl9mYW1pbHkpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwgCisgIAorICAvKiogYWRkcyBhIGtleXNwYWNlIGFuZCBhbnkgY29sdW1uIGZhbWlsaWVzIHRoYXQgYXJlIHBhcnQgb2YgaXQuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fYWRkX2tleXNwYWNlKDE6cmVxdWlyZWQgS3NEZWYga3NfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKiogZHJvcHMgYSBrZXlzcGFjZSBhbmQgYW55IGNvbHVtbiBmYW1pbGllcyB0aGF0IGFyZSBwYXJ0IG9mIGl0LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2Ryb3Bfa2V5c3BhY2UoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgCisgIC8qKiB1cGRhdGVzIHByb3BlcnRpZXMgb2YgYSBrZXlzcGFjZS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV91cGRhdGVfa2V5c3BhY2UoMTpyZXF1aXJlZCBLc0RlZiBrc19kZWYpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKSwKKyAgICAgICAgCisgIC8qKiB1cGRhdGVzIHByb3BlcnRpZXMgb2YgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX3VwZGF0ZV9jb2x1bW5fZmFtaWx5KDE6cmVxdWlyZWQgQ2ZEZWYgY2ZfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKioKKyAgICogRXhlY3V0ZXMgYSBDUUwgKENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkgc3RhdGVtZW50IGFuZCByZXR1cm5zIGEKKyAgICogQ3FsUmVzdWx0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMuCisgICAqLworICBDcWxSZXN1bHQgZXhlY3V0ZV9jcWxfcXVlcnkoMTpyZXF1aXJlZCBiaW5hcnkgcXVlcnksIDI6cmVxdWlyZWQgQ29tcHJlc3Npb24gY29tcHJlc3Npb24pCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwKKyAgICAgICAgICAgIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsCisgICAgICAgICAgICAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlLAorICAgICAgICAgICAgNDpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgLyoqCisgICAqIFByZXBhcmUgYSBDUUwgKENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSkgc3RhdGVtZW50IGJ5IGNvbXBpbGluZyBhbmQgcmV0dXJuaW5nCisgICAqIC0gdGhlIHR5cGUgb2YgQ1FMIHN0YXRlbWVudAorICAgKiAtIGFuIGlkIHRva2VuIG9mIHRoZSBjb21waWxlZCBDUUwgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICogLSBhIGNvdW50IG9mIHRoZSBkaXNjb3ZlcmVkIGJvdW5kIG1hcmtlcnMgaW4gdGhlIHN0YXRlbWVudCAKKyAgICovCisgIENxbFByZXBhcmVkUmVzdWx0IHByZXBhcmVfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgYmluYXJ5IHF1ZXJ5LCAyOnJlcXVpcmVkIENvbXByZXNzaW9uIGNvbXByZXNzaW9uKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpCisKKyAgICAgICAgICAgICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgcHJlcGFyZWQgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBieSBwYXNzaW5nIGFuIGlkIHRva2VuIGFuZCAgYSBsaXN0IG9mIHZhcmlhYmxlcworICAgKiB0byBiaW5kIGFuZCByZXR1cm5zIGEgQ3FsUmVzdWx0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMuCisgICAqLworICBDcWxSZXN1bHQgZXhlY3V0ZV9wcmVwYXJlZF9jcWxfcXVlcnkoMTpyZXF1aXJlZCBpMzIgaXRlbUlkLCAyOnJlcXVpcmVkIGxpc3Q8c3RyaW5nPiB2YWx1ZXMpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwKKyAgICAgICAgICAgIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsCisgICAgICAgICAgICAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlLAorICAgICAgICAgICAgNDpTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24gc2RlKQorICAgICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNDYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZDBkMzcwNmItZmVkNS00Y2Y1LWI5ODQtMDRmNDQ4ZGU5ZDdiIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhODRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwzNiBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzPC9QYWNrYWdlSWQ+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uLy4uL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuMS4wLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi9DYXNzYW5kcmFUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9IiQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU5OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsODMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5UZXN0cy5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVENvbGxlY3Rpb25zVGVzdHMKKyAgICB7CisgICAgICAgIC8vVE9ETzogQWRkIHRlc3RzIGZvciBJRW51bWVyYWJsZSB3aXRoIG9iamVjdHMgYW5kIHByaW1pdGl2ZSB2YWx1ZXMgaW5zaWRlCisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRDb2xsZWN0aW9uX0VxdWFsc19QcmltaXRpdmVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PGludD4gezEsMiwzfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4gezEsMiwzfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRDb2xsZWN0aW9uX0VxdWFsc19QcmltaXRpdmVfRGlmZmVyZW50X1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsgMSwgMiwgMyB9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gbmV3IExpc3Q8aW50PiB7IDEsIDIgfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfT2JqZWN0c19UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8RXhhbXBsZUNsYXNzPiB7IG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMSB9LCBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDIgfSB9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gbmV3IExpc3Q8RXhhbXBsZUNsYXNzPiB7IG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMSB9LCBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDIgfSB9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIGRpZmZlcmVudCBjb2xsZWN0aW9ucworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfT25lQW5kVGhlU2FtZU9iamVjdF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8RXhhbXBsZUNsYXNzPiB7IG5ldyBFeGFtcGxlQ2xhc3MgeyBYID0gMSB9LCBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDIgfSB9OworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24yID0gY29sbGVjdGlvbjE7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIC8vIHJlZmVyZW5jZXMgdG8gb25lIGFuZCB0aGUgc2FtZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEV4YW1wbGVDbGFzcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IFggeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVEhhc2hTZXRUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU1NzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MKQEAgLTAsMCArMSw3MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRIYXNoU2V0VGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUSGFzaFNldF9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxOworCisgICAgICAgICAgICB2YXIgaGFzaFNldCA9IG5ldyBUSGFzaFNldDxpbnQ+IHt2YWx1ZX07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaGFzaFNldC5Db250YWlucyh2YWx1ZSkpOworCisgICAgICAgICAgICBoYXNoU2V0LlJlbW92ZSh2YWx1ZSk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaGFzaFNldC5Db3VudCA9PSAwKTsKKworICAgICAgICAgICAgaGFzaFNldC5BZGQodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5DbGVhcigpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIHZhciBuZXdBcnIgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgaGFzaFNldC5BZGQodmFsdWUpOworICAgICAgICAgICAgaGFzaFNldC5Db3B5VG8obmV3QXJyLCAwKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShuZXdBcnIuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgdmFyIGVuID0gaGFzaFNldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICBlbi5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChpbnQpZW4uQ3VycmVudCA9PSB2YWx1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHVzaW5nICh2YXIgaWVuID0gKChJRW51bWVyYWJsZTxpbnQ+KWhhc2hTZXQpLkdldEVudW1lcmF0b3IoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xIZWxwZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM4MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MKQEAgLTAsMCArMSwxNzIgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuUHJvdG9jb2xzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbEhlbHBlclRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZU5hbWVGb3JUeXBlSWRfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIHNldHMgPSBuZXcgTGlzdDxUdXBsZTxUVHlwZSwgYnl0ZVtdPj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQm9vbCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJvb2wpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5CeXRlLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQnl0ZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkxNiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkzMiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkzMiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkk2NCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUk2NCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkRvdWJsZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cmluZywgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cmluZyksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cnVjdCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cnVjdCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLk1hcCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlNldCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVNldCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkxpc3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVMaXN0KSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBUeXBlTmFtZSB7dC5JdGVtMn0gdG8gVFR5cGU6IHt0Lkl0ZW0xfSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1RTdG9wX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKFRUeXBlLlN0b3ApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX05vbkV4aXN0aW5nVFR5cGVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoKFRUeXBlKTEwMCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIHNldHMgPSBuZXcgTGlzdDxUdXBsZTxUVHlwZSwgYnl0ZVtdPj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQm9vbCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJvb2wpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5CeXRlLCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lQnl0ZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkxNiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkkzMiwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkzMiksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkk2NCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUk2NCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkRvdWJsZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZSksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cmluZywgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cmluZyksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlN0cnVjdCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cnVjdCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLk1hcCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLlNldCwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVNldCksCisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkxpc3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVMaXN0KSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKHQuSXRlbTIpID09IHQuSXRlbTEsICQiV3JvbmcgbWFwcGluZyBvZiBUeXBlTmFtZSB7dC5JdGVtMn0gdG8gVFR5cGU6IHt0Lkl0ZW0xfSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1RTdG9wVHlwZU5hbWVfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUobmV3IFtdeyhieXRlKVRUeXBlLlN0b3AsIChieXRlKVRUeXBlLlN0b3B9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9Ob25FeGlzdGluZ1R5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBieXRlW117MTAwfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfRW1wdHlOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBieXRlW10ge30pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzSnNvbk51bWVyaWNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGNvcnJlY3RKc29uTnVtZXJpYyA9ICIrLS4wMTIzNDU2Nzg5RWUiOworICAgICAgICAgICAgdmFyIGluY29ycmVjdEpzb25OdW1lcmljID0gIkFhQmNEZC8qXFwiOworCisgICAgICAgICAgICB2YXIgc2V0cyA9IGNvcnJlY3RKc29uTnVtZXJpYy5TZWxlY3QoY2ggPT4gbmV3IFR1cGxlPGJ5dGUsIGJvb2w+KChieXRlKSBjaCwgdHJ1ZSkpLlRvTGlzdCgpOworICAgICAgICAgICAgc2V0cy5BZGRSYW5nZShpbmNvcnJlY3RKc29uTnVtZXJpYy5TZWxlY3QoY2ggPT4gbmV3IFR1cGxlPGJ5dGUsIGJvb2w+KChieXRlKSBjaCwgZmFsc2UpKSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShUSlNPTlByb3RvY29sSGVscGVyLklzSnNvbk51bWVyaWModC5JdGVtMSkgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIENoYXIge3QuSXRlbTF9IHRvIGJvb2w6IHt0Lkl0ZW0yfSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRvSGV4VmFsX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZEhleFZhbHVlcyA9IG5ldyBieXRlW10gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTV9OworCisgICAgICAgICAgICB2YXIgc2V0cyA9IGNoYXJzLlNlbGVjdCgoY2gsIGkpID0+IG5ldyBUdXBsZTxjaGFyLCBieXRlPihjaCwgZXhwZWN0ZWRIZXhWYWx1ZXNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbCgoYnl0ZSl0Lkl0ZW0xKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFjdHVhbFJlc3VsdCA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgY2hhciBieXRlIHt0Lkl0ZW0xfSB0byBpdCBleHBlY3RlZCBoZXggdmFsdWU6IHt0Lkl0ZW0yfS4gQWN0dWFsIGhleCB2YWx1ZToge2FjdHVhbFJlc3VsdH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9Xcm9uZ0lucHV0Q2hhcl9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbCgoYnl0ZSkncycpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRvSGV4Q2hhcl9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgaGV4VmFsdWVzID0gbmV3IGJ5dGVbXSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZENoYXJzID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIHZhciBzZXRzID0gaGV4VmFsdWVzLlNlbGVjdCgoaHYsIGkpID0+IG5ldyBUdXBsZTxieXRlLCBjaGFyPihodiwgZXhwZWN0ZWRDaGFyc1tpXSkpLlRvTGlzdCgpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhY3R1YWxSZXN1bHQgPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcih0Lkl0ZW0xKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFjdHVhbFJlc3VsdCA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgaGV4IHZhbHVlIHt0Lkl0ZW0xfSB0byBpdCBleHBlY3RlZCBjaGFyOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvUHJvdG9jb2xzL1RKc29uUHJvdG9jb2xUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM3MzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MKQEAgLTAsMCArMSw2NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBOU3Vic3RpdHV0ZTsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUSlNPTlByb3RvY29sX0Nhbl9DcmVhdGVfSW5zdGFuY2VfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50VHJhbnNwb3J0ID0gU3Vic3RpdHV0ZS5Gb3I8VEh0dHBDbGllbnRUcmFuc3BvcnQ+KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3QiKSwgbnVsbCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVEpTT05Qcm90b2NvbFdyYXBwZXIoaHR0cENsaWVudFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LldyYXBwZWRDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LldyYXBwZWRSZWFkZXIpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQuVHJhbnNwb3J0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWN1cnNpb25EZXB0aCA9PSAwKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWN1cnNpb25MaW1pdCA9PSBUUHJvdG9jb2wuRGVmYXVsdFJlY3Vyc2lvbkRlcHRoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuVHJhbnNwb3J0LkVxdWFscyhodHRwQ2xpZW50VHJhbnNwb3J0KSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkQ29udGV4dC5HZXRUeXBlKCkuTmFtZS5FcXVhbHMoIkpTT05CYXNlQ29udGV4dCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LldyYXBwZWRSZWFkZXIuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJMb29rYWhlYWRSZWFkZXIiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFRKU09OUHJvdG9jb2xXcmFwcGVyIDogVEpzb25Qcm90b2NvbAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVEpTT05Qcm90b2NvbFdyYXBwZXIoVENsaWVudFRyYW5zcG9ydCB0cmFucykgOiBiYXNlKHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFdyYXBwZWRDb250ZXh0ID0+IENvbnRleHQ7CisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFdyYXBwZWRSZWFkZXIgPT4gUmVhZGVyOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uRGVwdGggPT4gUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBwdWJsaWMgaW50IFdyYXBwZWRSZWN1cnNpb25MaW1pdCA9PiBSZWN1cnNpb25MaW1pdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1RocmlmdC5UZXN0cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2ZjE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMTggQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkNvbXBhcmVORVRPYmplY3RzIiBWZXJzaW9uPSI0LjMuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS41LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTlN1YnN0aXR1dGUiIFZlcnNpb249IjMuMS4wIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFNlcnZpY2UgSW5jbHVkZT0iezgyYTdmNDhkLTNiNTAtNGIxZS1iODJlLTNhZGE4MjEwYzM1OH0iIC8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC5zbG4gYi9saWIvbmV0Y29yZS9UaHJpZnQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzBhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQuc2xuCkBAIC0wLDAgKzEsODUgQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2NzMwLjEyCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJUZXN0cyIsICJUZXN0cyIsICJ7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIlRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuSW50ZWdyYXRpb25UZXN0cyIsICJUZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0c1xUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oiLCAiezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5UZXN0cyIsICJUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvaiIsICJ7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cyIsICJUZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzXFRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qIiwgIntBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihOZXN0ZWRQcm9qZWN0cykgPSBwcmVTb2x1dGlvbgorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7RkQyMEJDNEEtMDEwOS00MUQ4LThDMEMtODkzRTc4NEQ3RUY5fQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3YmZjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKQEAgLTAsMCArMSwxMDEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIFRocmlmdC5Db2xsZWN0aW9ucworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGNvbGxlY3Rpb25zIGFyZSB2YWx1ZS13aXNlIHRoZSBzYW1lLgorICAgICAgICAvLy8gICAgIElmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb25zIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFcXVhbHMoSUVudW1lcmFibGUgZmlyc3QsIElFbnVtZXJhYmxlIHNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgJiYgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpdGVyID0gZmlyc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgdmFyIHNpdGVyID0gc2Vjb25kLkdldEVudW1lcmF0b3IoKTsKKworICAgICAgICAgICAgdmFyIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIHZhciBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChmbmV4dCAmJiBzbmV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmVudW0gPSBmaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBzZW51bSA9IHNpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisKKyAgICAgICAgICAgICAgICBpZiAoZmVudW0gIT0gbnVsbCAmJiBzZW51bSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFFcXVhbHMoZmVudW0sIHNlbnVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZlbnVtID09IG51bGwgXiBzZW51bSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghRXF1YWxzKGZpdGVyLkN1cnJlbnQsIHNpdGVyLkN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbmV4dCA9PSBzbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHJldHVybnMgYSBoYXNoY29kZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGVudW1lcmFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEhhc2hDb2RlKElFbnVtZXJhYmxlIGVudW1lcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnVtZXJhYmxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoYXNoY29kZSA9IDA7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBvYmogaW4gZW51bWVyYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgdmFyIG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlKCkgOiBHZXRIYXNoQ29kZShlbnVtMik7CisKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc2hjb2RlID0gKGhhc2hjb2RlKjM5NykgXiAob2JqSGFzaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWYwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKQEAgLTAsMCArMSw2NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldDxUPiA6IElDb2xsZWN0aW9uPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEhhc2hTZXQ8VD4gX3NldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCA9PiBfc2V0LkNvdW50OworCisgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkgPT4gZmFsc2U7CisKKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5BZGQoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuQ29udGFpbnMoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoSUVudW1lcmFibGU8VD4pIF9zZXQpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVEFzeW5jUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGU0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDI5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0lUUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzM2U1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgSVRBc3luY1Byb2Nlc3NvciBHZXRBc3luY1Byb2Nlc3NvcihUQ2xpZW50VHJhbnNwb3J0IHRyYW5zLCBUQmFzZVNlcnZlciBiYXNlU2VydmVyID0gbnVsbCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQxNzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDIyAuTkVUIENvcmUgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisvL0BUT0RPIHdoZXJlIHRvIHB1dCBMaWNlbnNlIGluZm9ybWF0aW9uPworCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgZXhUeXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCBleFR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImRmM2Y4ZWYwLWUwYTMtNGM4Ni1hNjViLThlYzg0ZTAxNmIxZCIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVEZpZWxkLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTE1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpAQCAtMCwwICsxLDM3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBURmllbGQKKyAgICB7CisgICAgICAgIHB1YmxpYyBURmllbGQoc3RyaW5nIG5hbWUsIFRUeXBlIHR5cGUsIHNob3J0IGlkKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICAgICAgSUQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIFR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nIC0gZG8gbm90IHJlbmFtZSAtIGl0IHVzZWQgZm9yIGdlbmVyYXRpb24gCisgICAgICAgIHB1YmxpYyBzaG9ydCBJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVExpc3QuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjMyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzCkBAIC0wLDAgKzEsMzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRMaXN0CisgICAgeworICAgICAgICBwdWJsaWMgVExpc3QoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5NTU5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1hcC5jcwpAQCAtMCwwICsxLDM2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTWFwCisgICAgeworICAgICAgICBwdWJsaWMgVE1hcChUVHlwZSBrZXlUeXBlLCBUVHlwZSB2YWx1ZVR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgS2V5VHlwZSA9IGtleVR5cGU7CisgICAgICAgICAgICBWYWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEtleVR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBWYWx1ZVR5cGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNZXNzYWdlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Y0OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcwpAQCAtMCwwICsxLDM3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTWVzc2FnZQorICAgIHsKKyAgICAgICAgcHVibGljIFRNZXNzYWdlKHN0cmluZyBuYW1lLCBUTWVzc2FnZVR5cGUgdHlwZSwgaW50IHNlcWlkKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICAgICAgU2VxSUQgPSBzZXFpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIFRNZXNzYWdlVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgaW50IFNlcUlEIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNZXNzYWdlVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I5YTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKQEAgLTAsMCArMSwyOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZQorICAgIHsKKyAgICAgICAgQ2FsbCA9IDEsCisgICAgICAgIFJlcGx5ID0gMiwKKyAgICAgICAgRXhjZXB0aW9uID0gMywKKyAgICAgICAgT25ld2F5ID0gNAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4M2I1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFNldC5jcwpAQCAtMCwwICsxLDM4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUU2V0CisgICAgeworICAgICAgICBwdWJsaWMgVFNldChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2V0KFRMaXN0IGxpc3QpCisgICAgICAgICAgICA6IHRoaXMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTdHJ1Y3QuY3MKQEAgLTAsMCArMSwzMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFN0cnVjdAorICAgIHsKKyAgICAgICAgcHVibGljIFRTdHJ1Y3Qoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UVHlwZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzgxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBlbnVtIFRUeXBlIDogYnl0ZQorICAgIHsKKyAgICAgICAgU3RvcCA9IDAsCisgICAgICAgIFZvaWQgPSAxLAorICAgICAgICBCb29sID0gMiwKKyAgICAgICAgQnl0ZSA9IDMsCisgICAgICAgIERvdWJsZSA9IDQsCisgICAgICAgIEkxNiA9IDYsCisgICAgICAgIEkzMiA9IDgsCisgICAgICAgIEk2NCA9IDEwLAorICAgICAgICBTdHJpbmcgPSAxMSwKKyAgICAgICAgU3RydWN0ID0gMTIsCisgICAgICAgIE1hcCA9IDEzLAorICAgICAgICBTZXQgPSAxNCwKKyAgICAgICAgTGlzdCA9IDE1CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvSVRQcm90b2NvbEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzVjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBJVFByb3RvY29sRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb3RvY29sIEdldFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxODY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEFic3RyYWN0QmFzZS5jcwpAQCAtMCwwICsxLDI4IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmFzZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZTFhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRCYXNlIDogVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgVGFzayBSZWFkQXN5bmMoVFByb3RvY29sIHRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJpbmFyeVByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWM4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMCwwICsxLDYxMyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIC8vVE9ETzogVW5pdCB0ZXN0cworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorICAgICAgICAvL1RPRE86IHByYWdtYQorCisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb25NYXNrID0gMHhmZmZmMDAwMDsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVmVyc2lvbjEgPSAweDgwMDEwMDAwOworCisgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFdyaXRlOworCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoU3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBWZXJzaW9uMSB8ICh1aW50KSBtZXNzYWdlLlR5cGU7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYygoaW50KSB2ZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1lc3NhZ2UuU2VxSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhmaWVsZC5JRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBUVHlwZS5TdG9wLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1hcC5LZXlUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1hcC5WYWx1ZVR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWFwLkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBsaXN0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBzZXQuRWxlbWVudFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoYiA/IChzYnl0ZSkgMSA6IChzYnl0ZSkgMCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBieXRlW10gQ3JlYXRlV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBib3V0ID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIGJvdXRbMF0gPSAoYnl0ZSkgYjsKKworICAgICAgICAgICAgcmV0dXJuIGJvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJvdXQgPSBDcmVhdGVXcml0ZUJ5dGUoYik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJvdXQsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTE2KHNob3J0IHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpMTZPdXQgPSBuZXcgYnl0ZVsyXTsKKworICAgICAgICAgICAgaTE2T3V0WzBdID0gKGJ5dGUpICgweGZmICYgKHMgPj4gOCkpOworICAgICAgICAgICAgaTE2T3V0WzFdID0gKGJ5dGUpICgweGZmICYgcyk7CisKKyAgICAgICAgICAgIHJldHVybiBpMTZPdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMTZPdXQgPSBDcmVhdGVXcml0ZUkxNihpMTYpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMTZPdXQsIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAgICAgaTMyT3V0WzBdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiAyNCkpOworICAgICAgICAgICAgaTMyT3V0WzFdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiAxNikpOworICAgICAgICAgICAgaTMyT3V0WzJdID0gKGJ5dGUpICgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgICAgICAgICBpMzJPdXRbM10gPSAoYnl0ZSkgKDB4ZmYgJiBpMzIpOworCisgICAgICAgICAgICByZXR1cm4gaTMyT3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkzMk91dCA9IENyZWF0ZVdyaXRlSTMyKGkzMik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGkzMk91dCwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBieXRlW10gQ3JlYXRlV3JpdGVJNjQobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpNjRPdXQgPSBuZXcgYnl0ZVs4XTsKKworICAgICAgICAgICAgaTY0T3V0WzBdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA1NikpOworICAgICAgICAgICAgaTY0T3V0WzFdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA0OCkpOworICAgICAgICAgICAgaTY0T3V0WzJdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA0MCkpOworICAgICAgICAgICAgaTY0T3V0WzNdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAzMikpOworICAgICAgICAgICAgaTY0T3V0WzRdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAyNCkpOworICAgICAgICAgICAgaTY0T3V0WzVdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiAxNikpOworICAgICAgICAgICAgaTY0T3V0WzZdID0gKGJ5dGUpICgweGZmICYgKGk2NCA+PiA4KSk7CisgICAgICAgICAgICBpNjRPdXRbN10gPSAoYnl0ZSkgKDB4ZmYgJiBpNjQpOworCisgICAgICAgICAgICByZXR1cm4gaTY0T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRPdXQgPSBDcmVhdGVXcml0ZUk2NChpNjQpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpNjRPdXQsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUk2NEFzeW5jKEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAodWludCkgc2l6ZSAmIFZlcnNpb25NYXNrOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAkIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKSAoc2l6ZSAmIDB4MDAwMDAwZmYpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFN0cmljdFJlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gYXdhaXQgUmVhZFN0cmluZ0JvZHlBc3luYyhzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UT0RPOiBubyByZWFkIGZyb20gaW50ZXJuYWwgdHJhbnNwb3J0PworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VEZpZWxkPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWFwID0gbmV3IFRNYXAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXlUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBWYWx1ZVR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUU2V0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pID09IDE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmluID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYmluLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7IC8vVE9ETzogd2h5IHJlYWRhbGwgPworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYmluWzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzaG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2SW4gPSBuZXcgYnl0ZVsyXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMTZJbiwgMCwgMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChzaG9ydCkgKCgoaTE2SW5bMF0gJiAweGZmKSA8PCA4KSB8IGkxNkluWzFdICYgMHhmZik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJJbiA9IG5ldyBieXRlWzRdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGkzMkluLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzBdICYgMHhmZikgPDwgMjQpIHwgCisgICAgICAgICAgICAgICAgKChpMzJJblsxXSAmIDB4ZmYpIDw8IDE2KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgaTMySW5bM10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDY3NQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBsb25nIENyZWF0ZVJlYWRJNjQoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzZdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGJ1Zls3XSAmIDB4ZmY7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgNjc1CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8bG9uZz4gUmVhZEk2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGxvbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGk2NEluID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTY0SW4sIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZWFkSTY0KGk2NEluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGRvdWJsZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZCA9IGF3YWl0IFJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZVtdPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzaXplID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIHNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQm9keUFzeW5jKGludCBzaXplLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHN0cmluZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogSVRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgU3RyaWN0UmVhZDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFdyaXRlOworCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICAgICAgU3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBTdHJpY3RSZWFkLCBTdHJpY3RXcml0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2RmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RDb21wYWN0UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw5MjIgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvL1RPRE86IGltcGxlbWVudGF0aW9uIG9mIFRQcm90b2NvbAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFByb3RvY29sSWQgPSAweDgyOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbiA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWZXJzaW9uTWFzayA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVHlwZU1hc2sgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVCaXRzID0gMHgwNzsgLy8gMDAwMCAwMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFR5cGVTaGlmdEFtb3VudCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRTdHJ1Y3QgQW5vbnltb3VzU3RydWN0ID0gbmV3IFRTdHJ1Y3Qoc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEZpZWxkIFRzdG9wID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIFRUeXBlLlN0b3AsIDApOworCisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBUVHlwZVRvQ29tcGFjdFR5cGUgPSBuZXcgYnl0ZVsxNl07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RhY2s8c2hvcnQ+IF9sYXN0RmllbGQgPSBuZXcgU3RhY2s8c2hvcnQ+KDE1KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBURmllbGQ/IF9ib29sZWFuRmllbGQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sPyBfYm9vbFZhbHVlOworCisgICAgICAgIHByaXZhdGUgc2hvcnQgX2xhc3RGaWVsZElkOworCisgICAgICAgIHB1YmxpYyBUQ29tcGFjdFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TdG9wXSA9IFR5cGVzLlN0b3A7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQm9vbF0gPSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5CeXRlXSA9IFR5cGVzLkJ5dGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTE2XSA9IFR5cGVzLkkxNjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JMzJdID0gVHlwZXMuSTMyOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkk2NF0gPSBUeXBlcy5JNjQ7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuRG91YmxlXSA9IFR5cGVzLkRvdWJsZTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TdHJpbmddID0gVHlwZXMuQmluYXJ5OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkxpc3RdID0gVHlwZXMuTGlzdDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5TZXRdID0gVHlwZXMuU2V0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLk1hcF0gPSBUeXBlcy5NYXA7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RydWN0XSA9IFR5cGVzLlN0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xhc3RGaWVsZC5DbGVhcigpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge1Byb3RvY29sSWR9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgIFRyYW5zLldyaXRlQXN5bmMoCisgICAgICAgICAgICAgICAgICAgIG5ld1tdIHsoYnl0ZSkgKChWZXJzaW9uICYgVmVyc2lvbk1hc2spIHwgKCgodWludCkgbWVzc2FnZS5UeXBlIDw8IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlTWFzaykpfSwKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAgICAgICAgLy8vICAgICB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vICAgICBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sYXN0RmllbGQuUHVzaChfbGFzdEZpZWxkSWQpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQuUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSBleFR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICAgICAgdmFyIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBHZXRDb21wYWN0VHlwZShmaWVsZC5UeXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgICAgICBpZiAoKGZpZWxkLklEID4gX2xhc3RGaWVsZElkKSAmJiAoZmllbGQuSUQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBiID0gKGJ5dGUpICgoKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkKSA8PCA0KSB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7Yn0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7dHlwZVRvV3JpdGV9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMTZBc3luYyhmaWVsZC5JRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5JRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IGZpZWxkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoZmllbGQsIDB4RkYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge1R5cGVzLlN0b3B9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYXN5bmMgVGFzayBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKFRUeXBlIGVsZW1UeXBlLCBpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgICAgICAgICAgICAgdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIGV4VHlwZSBpbmRpY2F0b3IuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoc2l6ZSA8PSAxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHsoYnl0ZSkgKChzaXplIDw8IDQpIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHsoYnl0ZSkgKDB4ZjAgfCBHZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgc2l6ZSk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQ29sbGVjdGlvbkJlZ2luQXN5bmMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKHNldC5FbGVtZW50VHlwZSwgc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAgICAgICAgd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKyAgICAgICAgICAgIHJpZ2h0IGV4VHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAgICAgT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sZWFuRmllbGQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKF9ib29sZWFuRmllbGQuVmFsdWUsIGIgPyBUeXBlcy5Cb29sZWFuVHJ1ZSA6IFR5cGVzLkJvb2xlYW5GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2V9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpIGJ9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoSW50VG9aaWd6YWcoaTE2KSk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIFR1cGxlPGJ5dGVbXSwgaW50PiBDcmVhdGVXcml0ZVZhckludDMyKHVpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LlJlc3VsdHMgaW4gMSAtIDUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgaTMyQnVmID0gbmV3IGJ5dGVbNV07CisgICAgICAgICAgICB2YXIgaWR4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGkzMkJ1ZltpZHgrK10gPSAoYnl0ZSkgKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICBuID4+PSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPGJ5dGVbXSwgaW50PihpMzJCdWYsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkzMikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQ2NCh1bG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgICAgICB2YXIgaWR4ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfih1bG9uZykgMHg3RkwpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWZbaWR4KytdID0gKGJ5dGUpIG47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oYnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50NjQoTG9uZ1RvWmlnemFnKGk2NCkpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgRml4ZWRMb25nVG9CeXRlcyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGRhdGEsIDApOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhkYXRhLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzdHIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgMCwgYnl0ZXMuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWFwLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpIDB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWFwLkNvdW50KTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgIFRyYW5zLldyaXRlQXN5bmMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoR2V0Q29tcGFjdFR5cGUobWFwLktleVR5cGUpIDw8IDQpIHwgR2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSkpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbElkID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUHJvdG9jb2xJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCQiRXhwZWN0ZWQgcHJvdG9jb2wgaWQge1Byb3RvY29sSWQ6WH0gYnV0IGdvdCB7cHJvdG9jb2xJZDpYfSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdmVyc2lvbkFuZFR5cGUgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgdmVyc2lvbiA9IChieXRlKSAodmVyc2lvbkFuZFR5cGUgJiBWZXJzaW9uTWFzayk7CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHZlcnNpb24ge1ZlcnNpb259IGJ1dCBnb3Qge3ZlcnNpb259Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB0eXBlID0gKGJ5dGUpICgodmVyc2lvbkFuZFR5cGUgPj4gVHlwZVNoaWZ0QW1vdW50KSAmIFR5cGVCaXRzKTsKKyAgICAgICAgICAgIHZhciBzZXFpZCA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIChUTWVzc2FnZVR5cGUpIHR5cGUsIHNlcWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUU3RydWN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNvbWUgbWFnaWMgaXMgaGVyZSApCisKKyAgICAgICAgICAgIF9sYXN0RmllbGQuUHVzaChfbGFzdEZpZWxkSWQpOworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIEFub255bW91c1N0cnVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisgICAgICAgICAgICB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciB0eXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZXMuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHN0b3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNob3J0IGZpZWxkSWQ7CisgICAgICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIGV4VHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgICAgIHZhciBtb2RpZmllciA9IChzaG9ydCkgKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZElkID0gYXdhaXQgUmVhZEkxNkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZElkID0gKHNob3J0KSAoX2xhc3RGaWVsZElkICsgbW9kaWZpZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkKHN0cmluZy5FbXB0eSwgR2V0VFR5cGUoKGJ5dGUpICh0eXBlICYgMHgwZikpLCBmaWVsZElkKTsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSBleFR5cGUKKyAgICAgICAgICAgIGlmIChJc0Jvb2xUeXBlKHR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sVmFsdWUgPSAoYnl0ZSkgKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWFwPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICAgICAgICBhbmQgdmFsdWUgZXhUeXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAiY29ycmVjdCIgdHlwZXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAoYnl0ZSkgMCA6IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIEdldFRUeXBlKChieXRlKSAoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgICAgICBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgICAgICBvZiB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgICAgIHRydWUgc2l6ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChhd2FpdCBSZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICAgICAgICAgICAgYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgICAgICAgIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoX2Jvb2xWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfYm9vbFZhbHVlLlZhbHVlOworICAgICAgICAgICAgICAgIF9ib29sVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJ1ZlswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgWmlnemFnVG9JbnQoYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9JbnQoYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBaaWd6YWdUb0xvbmcoYXdhaXQgUmVhZFZhckludDY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGRvdWJsZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhsb25nQml0cywgMCwgOCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKEJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHN0cmluZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAgICAgICAgdmFyIGxlbmd0aCA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZVtdPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTGlzdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgICAgICBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCBleFR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB2YXIgc2l6ZUFuZFR5cGUgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGY7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IEdldFRUeXBlKHNpemVBbmRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBHZXRDb21wYWN0VHlwZShUVHlwZSB0dHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgICAgIHJldHVybiBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgdHR5cGVdOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8dWludD4gUmVhZFZhckludDMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB1aW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICB2YXIgc2hpZnQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVpbnQpIChiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVsb25nPiBSZWFkVmFySW50NjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDx1aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHVsb25nIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVsb25nKSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBaaWd6YWdUb0ludCh1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSAobiA+PiAxKSBeIC0oaW50KSAobiAmIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBaaWd6YWdUb0xvbmcodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKSAobiA+PiAxKSBeIC0obG9uZykgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgQnl0ZXNUb0xvbmcoYnl0ZVtdIGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgICAgICBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAgICAgeW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICgoYnl0ZXNbN10gJiAweGZmTCkgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzZdICYgMHhmZkwpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s1XSAmIDB4ZmZMKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNF0gJiAweGZmTCkgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzNdICYgMHhmZkwpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1syXSAmIDB4ZmZMKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMV0gJiAweGZmTCkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChieXRlc1swXSAmIDB4ZmZMKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNCb29sVHlwZShieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb3dlck5pYmJsZSA9IGIgJiAweDBmOworICAgICAgICAgICAgcmV0dXJuIChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuVHJ1ZSkgfHwgKGxvd2VyTmliYmxlID09IFR5cGVzLkJvb2xlYW5GYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUVHlwZSBHZXRUVHlwZShieXRlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBUVHlwZSB2YWx1ZS4KKyAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpICh0eXBlICYgMHgwZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TdG9wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJvb2xlYW5GYWxzZToKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJvb2xlYW5UcnVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TZXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5NYXA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkRvbid0IGtub3cgd2hhdCBleFR5cGU6IHsoYnl0ZSkgKHR5cGUgJiAweDBmKX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVsb25nIExvbmdUb1ppZ3phZyhsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50CisgICAgICAgICAgICByZXR1cm4gKHVsb25nKSAobiA8PCAxKSBeICh1bG9uZykgKG4gPj4gNjMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdWludCBJbnRUb1ppZ3phZyhpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1aW50KSAobiA8PCAxKSBeICh1aW50KSAobiA+PiAzMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgICAgICAgICBidWZbb2ZmICsgMF0gPSAoYnl0ZSkgKG4gJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAxXSA9IChieXRlKSAoKG4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAyXSA9IChieXRlKSAoKG4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgM10gPSAoYnl0ZSkgKChuID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDRdID0gKGJ5dGUpICgobiA+PiAzMikgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA1XSA9IChieXRlKSAoKG4gPj4gNDApICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNl0gPSAoYnl0ZSkgKChuID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDddID0gKGJ5dGUpICgobiA+PiA1NikgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogSVRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQWxsIG9mIHRoZSBvbi13aXJlIGV4VHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RvcCA9IDB4MDA7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCb29sZWFuVHJ1ZSA9IDB4MDE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCb29sZWFuRmFsc2UgPSAweDAyOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQnl0ZSA9IDB4MDM7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMTYgPSAweDA0OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTMyID0gMHgwNTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEk2NCA9IDB4MDY7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBEb3VibGUgPSAweDA3OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQmluYXJ5ID0gMHgwODsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIExpc3QgPSAweDA5OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU2V0ID0gMHgwQTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIE1hcCA9IDB4MEI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTdHJ1Y3QgPSAweDBDOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDMzZjAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9USlNPTlByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTgxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAgIC8vLyAgICAgVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyBXcml0ZSBhbmQgUmVhZC4KKyAgICAvLy8gICAgIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgLy8vICAgICBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgorICAgIC8vLyAgICAgQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSnNvblByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGxvbmcgVmVyc2lvbiA9IDE7CisKKyAgICAgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOworCisgICAgICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgICAgICBwcm90ZWN0ZWQgSlNPTkJhc2VDb250ZXh0IENvbnRleHQ7CisKKyAgICAgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgICAgIHByb3RlY3RlZCBTdGFjazxKU09OQmFzZUNvbnRleHQ+IENvbnRleHRTdGFjayA9IG5ldyBTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisKKyAgICAgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICAgICAgcHJvdGVjdGVkIExvb2thaGVhZFJlYWRlciBSZWFkZXI7CisKKyAgICAgICAgLy8gRGVmYXVsdCBlbmNvZGluZworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgVXRmOEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVEpzb25Qcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVEpzb25Qcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZXh0ID0gbmV3IEpTT05CYXNlQ29udGV4dCh0aGlzKTsKKyAgICAgICAgICAgIFJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFB1c2hDb250ZXh0KEpTT05CYXNlQ29udGV4dCBjKQorICAgICAgICB7CisgICAgICAgICAgICBDb250ZXh0U3RhY2suUHVzaChDb250ZXh0KTsKKyAgICAgICAgICAgIENvbnRleHQgPSBjOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dCA9IENvbnRleHRTdGFjay5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgIC8vLyAgICAgTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vICAgICBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGFzeW5jIFRhc2sgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggIT0gYnl0ZXNbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAkIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiB7KGNoYXIpIGNofSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uU3RyaW5nQXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgbGVuID0gYnl0ZXMuTGVuZ3RoOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ5dGVzW2ldICYgMHgwMEZGKSA+PSAweDMwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzW2ldID09IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLlRvQXJyYXkoKSwgaSwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Kc29uQ2hhclRhYmxlW2J5dGVzW2ldXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF90ZW1wQnVmZmVyWzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIGksIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGVtcEJ1ZmZlclswXSA+IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5CYWNrc2xhc2gsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NTZXF1ZW5jZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIoKGJ5dGUpIChieXRlc1tpXSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclsxXSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKGJ5dGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQorICAgICAgICAvLy8gICAgIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uSW50ZWdlckFzeW5jKGxvbmcgbnVtLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgdmFyIGVzY2FwZU51bSA9IENvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ5dGVzID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgICAgICAvLy8gICAgIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkRvdWJsZUFzeW5jKGRvdWJsZSBudW0sIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB2YXIgc3BlY2lhbCA9IGZhbHNlOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0clswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICdOJzogLy8gTmFOCisgICAgICAgICAgICAgICAgY2FzZSAnSSc6IC8vIEluZmluaXR5CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0clsxXSA9PSAnSScpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1JbmZpbml0eQorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IENvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCisgICAgICAgIC8vLyAgICAgZGF0YQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQmFzZTY0QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgbGVuID0gYnl0ZXMuTGVuZ3RoOworICAgICAgICAgICAgdmFyIG9mZiA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0SGVscGVyLkVuY29kZShieXRlcywgb2ZmLCAzLCBfdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG9mZiArPSAzOworICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5FbmNvZGUoYnl0ZXMsIG9mZiwgbGVuLCBfdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhfdGVtcEJ1ZmZlciwgMCwgbGVuICsgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LldyaXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFja2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25BcnJheUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFja2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKFZlcnNpb24sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKChsb25nKSBtZXNzYWdlLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChmaWVsZC5UeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQobWFwLktleVR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5WYWx1ZVR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWFwLkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQobGlzdC5FbGVtZW50VHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChzZXQuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoc2V0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhiID8gMSA6IDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoaTE2LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoaTMyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUk2NEFzeW5jKGxvbmcgaTY0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGk2NCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVEb3VibGVBc3luYyhkb3VibGUgZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkRvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQmFzZTY0QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcsIHVuZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuLiBTa2lwIFJlYWRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRKc29uU3RyaW5nQXN5bmMoYm9vbCBza2lwQ29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgYnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb2RldW5pdHMgPSBuZXcgTGlzdDxjaGFyPigpOworCisKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBDb250ZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1swXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmMobmV3W10ge2NofSwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgXD8KKyAgICAgICAgICAgICAgICAgICAgY2ggPSBhd2FpdCBSZWFkZXIuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzWzFdKSAvLyBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9mZiA9IEFycmF5LkluZGV4T2YoVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NhcGVDaGFycywgKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhclZhbHVlc1tvZmZdOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmMobmV3W10ge2NofSwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIFx1WFhYWAorICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgd2NoID0gKHNob3J0KSAoKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleFZhbChfdGVtcEJ1ZmZlclsxXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbM10pKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhci5Jc0hpZ2hTdXJyb2dhdGUoKGNoYXIpIHdjaCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKSB3Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhjb2RldW5pdHMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKHRtcCwgMCwgdG1wLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ld1tdIHsoY2hhcikgd2NofSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAgICAgICAvLy8gICAgIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZEpzb25OdW1lcmljQ2hhcnNBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0cmJsZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1RPRE86IHdvcmthcm91bmQgZm9yIHByaW1pdGl2ZSB0eXBlcyB3aXRoIFRKc29uUHJvdG9jb2wsIHRoaW5rIC0gaG93IHRvIHJld3JpdGUgaW50byBtb3JlIGVhc3kgZm9ybSB3aXRob3V0IGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRKU09OUHJvdG9jb2xIZWxwZXIuSXNKc29uTnVtZXJpYyhjaCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBjID0gKGNoYXIpYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHN0cmJsZC5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmJsZC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRKc29uSW50ZWdlckFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3RyID0gYXdhaXQgUmVhZEpzb25OdW1lcmljQ2hhcnNBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy5QYXJzZShzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgICAgICAgIC8vLyAgICAgd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZEpzb25Eb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGF3YWl0IFJlYWRlci5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pID09IFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGVbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFyciA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmModHJ1ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHZhciBkdWIgPSBkb3VibGUuUGFyc2UoVXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsIDAsIGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgICAgICAgICAgICAgIGlmICghQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkgJiYgIWRvdWJsZS5Jc05hTihkdWIpICYmICFkb3VibGUuSXNJbmZpbml0eShkdWIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRKc29uQmFzZTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiID0gYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgdmFyIG9mZiA9IDA7CisgICAgICAgICAgICB2YXIgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlICgobGVuID4gMCkgJiYgKGJbbGVuIC0gMV0gPT0gJz0nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVhZCAmIGRlY29kZSBmdWxsIGJ5dGUgdHJpcGxldHMgPSA0IHNvdXJjZSBieXRlcworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIDQgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5EZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBvZmYgKz0gNDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgICAgICAgICBzaXplICs9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAorICAgICAgICAgICAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyBleFR5cGUpCisgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5EZWNvZGUoYiwgb2ZmLCBsZW4sIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgICAgICAgICAgIHNpemUgKz0gbGVuIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQorICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgIT0gVmVyc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTdHJ1Y3Q+IFJlYWRTdHJ1Y3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2VbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSAoc2hvcnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTWFwPiBSZWFkTWFwQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBtYXAuS2V5VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIG1hcC5WYWx1ZVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuQ291bnQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGxpc3QuRWxlbWVudFR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBsaXN0LkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgc2V0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgc2V0LkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJvb2w+IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25Eb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBVdGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uQmFzZTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQorICAgICAgICAvLy8gICAgIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycworICAgICAgICAvLy8gICAgIFRoaXMgYmFzZSBjb250ZXh0IGRvZXMgbm90aGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05CYXNlQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgVEpzb25Qcm90b2NvbCBQcm90bzsKKworICAgICAgICAgICAgcHVibGljIEpTT05CYXNlQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEVzY2FwZU51bWJlcnMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAgICAgICAvLy8gICAgIGZvciB0aGUgZmlyc3Qgb25lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sIF9maXJzdCA9IHRydWU7CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OTGlzdENvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5UcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KKyAgICAgICAgLy8vICAgICBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgorICAgICAgICAvLy8gICAgIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKKyAgICAgICAgLy8vICAgICBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OUGFpckNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sIF9jb2xvbiA9IHRydWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTlBhaXJDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhfY29sb24gPyBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbG9uIDogVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db21tYSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVzY2FwZU51bWJlcnMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29sb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgSG9sZHMgdXAgdG8gb25lIGJ5dGUgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBMb29rYWhlYWRSZWFkZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX2RhdGEgPSBuZXcgYnl0ZVsxXTsKKworICAgICAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNEYXRhOworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBMb29rYWhlYWRSZWFkZXIoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gICAgIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vLyAgICAgZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUmVhZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF9oYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2hhc0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBtb3JlIGVhc3kgd2F5IHRvIGF2b2lkIGV4Y2VwdGlvbiBvbiByZWFkaW5nIHByaW1pdGl2ZSB0eXBlcworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5UcmFucy5SZWFkQWxsQXN5bmMoX2RhdGEsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kYXRhWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gICAgIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAgICAgICAgIC8vLyAgICAgYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxieXRlPiBQZWVrQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIV9oYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBtb3JlIGVhc3kgd2F5IHRvIGF2b2lkIGV4Y2VwdGlvbiBvbiByZWFkaW5nIHByaW1pdGl2ZSB0eXBlcworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5UcmFucy5SZWFkQWxsQXN5bmMoX2RhdGEsIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2hhc0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2U0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvKioKKyAgICAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgICAgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAqIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAgICAqCisgICAgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCisgICAgKiBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAgICAqCisgICAgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgICAgKgorICAgICogICAgIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgKgorICAgICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAqCisgICAgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgICAgKgorICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICAgICoKKyAgICAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICAgICoKKyAgICAqLworCisgICAgLy9UT0RPOiBpbXBsZW1lbnRhdGlvbiBvZiBUUHJvdG9jb2wKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisgICAgeworICAgICAgICAvKiogVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSAqLworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIFNlcGFyYXRvciA9ICI6IjsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfc2VydmljZU5hbWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBBcmdzOgorICAgICAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCisgICAgICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAgICAgKi8KKworICAgICAgICBwdWJsaWMgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBzdHJpbmcgc2VydmljZU5hbWUpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLlR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ2FsbDoKKyAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PbmV3YXk6CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJhc2UuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoJCJ7X3NlcnZpY2VOYW1lfXtTZXBhcmF0b3J9e21lc3NhZ2UuTmFtZX0iLCBtZXNzYWdlLlR5cGUsIG1lc3NhZ2UuU2VxSUQpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJhc2UuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWUwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MKQEAgLTAsMCArMSwzNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFJlY3Vyc2lvbkRlcHRoID0gNjQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKyAgICAgICAgcHJvdGVjdGVkIGludCBSZWN1cnNpb25EZXB0aDsKKworICAgICAgICBwcm90ZWN0ZWQgVENsaWVudFRyYW5zcG9ydCBUcmFuczsKKworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zID0gdHJhbnM7CisgICAgICAgICAgICBSZWN1cnNpb25MaW1pdCA9IERlZmF1bHRSZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIFJlY3Vyc2lvbkRlcHRoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IFRyYW5zcG9ydCA9PiBUcmFuczsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IFJlY3Vyc2lvbkxpbWl0IHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlY3Vyc2lvbkRlcHRoIDwgUmVjdXJzaW9uTGltaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytSZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tUmVjdXJzaW9uRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIChUcmFucyBhcyBJRGlzcG9zYWJsZSk/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RydWN0QmVnaW5Bc3luYyhAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWFwQmVnaW5Bc3luYyhtYXAsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUxpc3RCZWdpbkFzeW5jKGxpc3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVMaXN0QmVnaW5Bc3luYyhUTGlzdCBsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVNldEJlZ2luQXN5bmMoc2V0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVCb29sQXN5bmMoYiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKGIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoaTE2LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoaTMyLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVJNjRBc3luYyhpNjQsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVEb3VibGVBc3luYyhkb3VibGUgZCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVEb3VibGVBc3luYyhkLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMocywgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpOworICAgICAgICAgICAgYXdhaXQgV3JpdGVCaW5hcnlBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVCaW5hcnlBc3luYyhieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUTWVzc2FnZT4gUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRTdHJ1Y3Q+IFJlYWRTdHJ1Y3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUTWFwPiBSZWFkTWFwQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCb29sQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8bG9uZz4gUmVhZEk2NEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gYXdhaXQgUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMjc1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzCkBAIC0wLDAgKzEsMjQ3IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKKyAgICAvLy8gICAgIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy5XaGlsZSBpdCBoYXMKKyAgICAvLy8gICAgIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICAgIC8vLyAgICAgaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sIF93cmFwcGVkUHJvdG9jb2w7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfd3JhcHBlZFByb3RvY29sID0gcHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YocHJvdG9jb2wpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhtZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkFzeW5jKFRGaWVsZCBmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbkFzeW5jKG1hcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhzZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQm9vbEFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQnl0ZUFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUkxNkFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJNjRBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlQXN5bmMoZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmdBc3luYyhzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVCaW5hcnlBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNieXRlPiBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGRvdWJsZT4gUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxieXRlW10+IFJlYWRCaW5hcnlBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjdjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDU5IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmcKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgcHVibGljIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIGRvIG5vdCByZW5hbWUgcHVibGljIGNvbnN0YW50cyAtIHRoZXkgdXNlZCBpbiBnZW5lcmF0ZWQgZmlsZXMKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERFUFRIX0xJTUlUID0gNjsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IFR5cGUgPSBVTktOT1dOOworCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEdldEV4Y2VwdGlvblR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHlwZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0SGVscGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZmNWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcwpAQCAtMCwwICsxLDEwMSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0SGVscGVyCisgICAgeworICAgICAgICAvL1RPRE86IENvbnN0YW50cworICAgICAgICAvL1RPRE86IENoZWNrIGZvciBhcmdzCisgICAgICAgIC8vVE9ETzogVW5pdGVzdHMKKworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRW5jb2RlVGFibGUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50W10gRGVjb2RlVGFibGUgPQorICAgICAgICB7CisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2MiwgLTEsIC0xLCAtMSwgNjMsCisgICAgICAgICAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgICAgICAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgICAgICAgICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCisgICAgICAgIH07CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRW5jb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdID4+IDIpICYgMHgzRl07CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQykgfCAoKHNyY1tzcmNPZmYgKyAyXSA+PiA2KSAmIDB4MDMpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgM10gPSAoYnl0ZSkgRW5jb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgzRl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBsZW4gPT0gMQorICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIERlY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpICgoRGVjb2RlVGFibGVbc3JjW3NyY09mZl0gJiAweDBGRl0gPDwgMikgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdID4+IDQpKTsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA+PiAyKSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8IERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAzXSAmIDB4MEZGXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZkNDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NFV0aWxzLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRCYXNlNjRVdGlscworICAgIHsKKyAgICAgICAgLy9UT0RPOiBDb25zdGFudHMKKyAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgYXJncworICAgICAgICAvL1RPRE86IFVuaXRlc3RzCisKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuY29kZVRhYmxlID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIERlY29kZVRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworCisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0gKGJ5dGUpIEVuY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGVuID09IDEKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBEZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSAoKERlY29kZVRhYmxlW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfCBEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9USnNvblByb3RvY29sQ29uc3RhbnRzLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VmZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcwpAQCAtMCwwICsxLDYxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVEpTT05Qcm90b2NvbENvbnN0YW50cworICAgIHsKKyAgICAgICAgLy9UT0RPIENoZWNrIGZvciBwZXJmb3JtYW5jZSBmb3IgcmV1c2luZyBJbW11dGFibGVBcnJheSBmcm9tIFN5c3RlbS5Db2xsZWN0aW9ucy5JbW11dGFibGUgKGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL2RvdG5ldC8yMDEzLzA2LzI0L3BsZWFzZS13ZWxjb21lLWltbXV0YWJsZWFycmF5dC8pCisgICAgICAgIC8vIGNhbiBiZSBwb3NzaWJsZSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBhbHNvIGJldHRlciBHQworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIENvbW1hID0geyhieXRlKSAnLCd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb2xvbiA9IHsoYnl0ZSkgJzonfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNlID0geyhieXRlKSAneyd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBSaWdodEJyYWNlID0geyhieXRlKSAnfSd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBMZWZ0QnJhY2tldCA9IHsoYnl0ZSkgJ1snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFja2V0ID0geyhieXRlKSAnXSd9OworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBRdW90ZSA9IHsoYnl0ZSkgJyInfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQmFja3NsYXNoID0geyhieXRlKSAnXFwnfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBKc29uQ2hhclRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgKGJ5dGUpICdiJywgKGJ5dGUpICd0JywgKGJ5dGUpICduJywgMCwgKGJ5dGUpICdmJywgKGJ5dGUpICdyJywgMCwgMCwKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAxLCAxLCAoYnl0ZSkgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjaGFyW10gRXNjYXBlQ2hhcnMgPSAiXCJcXC9iZm5ydCIuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gRXNjYXBlQ2hhclZhbHVlcyA9IHsoYnl0ZSkgJyInLCAoYnl0ZSkgJ1xcJywgKGJ5dGUpICcvJywgKGJ5dGUpICdcYicsIChieXRlKSAnXGYnLCAoYnl0ZSkgJ1xuJywgKGJ5dGUpICdccicsIChieXRlKSAnXHQnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gRXNjU2VxdWVuY2VzID0geyhieXRlKSAnXFwnLCAoYnl0ZSkgJ3UnLCAoYnl0ZSkgJzAnLCAoYnl0ZSkgJzAnfTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVOYW1lcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQm9vbCA9IHsgKGJ5dGUpJ3QnLCAoYnl0ZSknZicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVCeXRlID0geyAoYnl0ZSknaScsIChieXRlKSc4JyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUkxNiA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknMScsIChieXRlKSc2JyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUkzMiA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknMycsIChieXRlKScyJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUk2NCA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknNicsIChieXRlKSc0JyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZURvdWJsZSA9IHsgKGJ5dGUpJ2QnLCAoYnl0ZSknYicsIChieXRlKSdsJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZVN0cnVjdCA9IHsgKGJ5dGUpJ3InLCAoYnl0ZSknZScsIChieXRlKSdjJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZVN0cmluZyA9IHsgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcsIChieXRlKSdyJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZU1hcCA9IHsgKGJ5dGUpJ20nLCAoYnl0ZSknYScsIChieXRlKSdwJyB9OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUxpc3QgPSB7IChieXRlKSdsJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTZXQgPSB7IChieXRlKSdzJywgKGJ5dGUpJ2UnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9USnNvblByb3RvY29sSGVscGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMyNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcwpAQCAtMCwwICsxLDE3NiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIEdldFR5cGVOYW1lRm9yVHlwZUlkKFRUeXBlIHR5cGVJZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGU7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cnVjdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3Q7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZVNldDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgZXhUeXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFRUeXBlIEdldFR5cGVJZEZvclR5cGVOYW1lKGJ5dGVbXSBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVFR5cGUuU3RvcDsKKyAgICAgICAgICAgIGlmIChuYW1lLkxlbmd0aCA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnOCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJ5dGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICcxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnMyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ20nOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cnVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAncyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAoYnl0ZSkgJ3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpICdlJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgZXhUeXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNKc29uTnVtZXJpYyhieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScrJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSctJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScuJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScwJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScxJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKScyJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSczJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc0JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc1JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc2JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc3JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc4JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc5JzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdFJzoKKyAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdlJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cworICAgICAgICAvLy8gICAgIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBUb0hleFZhbChieXRlIGNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ggKz0gMTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlIFRvSGV4Q2hhcihieXRlIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsICY9IDB4MEY7CisgICAgICAgICAgICBpZiAodmFsIDwgMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsIC09IDEwOworICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnYScpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjAzODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzCkBAIC0wLDAgKzEsMTEwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUUHJvdG9jb2xVdGlsCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2sgU2tpcEFzeW5jKFRQcm90b2NvbCBwcm90b2NvbCwgVFR5cGUgdHlwZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RvY29sLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJ5dGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5NYXA6CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIG1hcC5LZXlUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBzZXQuRWxlbWVudFR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBsaXN0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiVW5rbm93biBkYXRhIHR5cGUgIiArIHR5cGUuVG9TdHJpbmcoImQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RvY29sLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvQXN5bmNCYXNlU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWMzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcwpAQCAtMCwwICsxLDE4MyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vVE9ETzogdW5oYW5kbGVkIGV4Y2VwdGlvbnMsIGV0Yy4KKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIEFzeW5jQmFzZVNlcnZlciA6IFRCYXNlU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50V2FpdGluZ0RlbGF5OworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFRhc2sgX3NlcnZlclRhc2s7CisKKyAgICAgICAgcHVibGljIEFzeW5jQmFzZVNlcnZlcihJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSwgaW50IGNsaWVudFdhaXRpbmdEZWxheSA9IDEwKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgbG9nZ2VyRmFjdG9yeS5DcmVhdGVMb2dnZXIobmFtZW9mKEFzeW5jQmFzZVNlcnZlcikpLCBjbGllbnRXYWl0aW5nRGVsYXkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBc3luY0Jhc2VTZXJ2ZXIoSVRQcm9jZXNzb3JGYWN0b3J5IGl0UHJvY2Vzc29yRmFjdG9yeSwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSUxvZ2dlciBsb2dnZXIsIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogYmFzZShpdFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudFdhaXRpbmdEZWxheSA9IGNsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNhbmNlbGF0aW9uIHRva2VuCisgICAgICAgICAgICAgICAgX3NlcnZlclRhc2sgPSBUYXNrLkZhY3RvcnkuU3RhcnROZXcoKCkgPT4gU3RhcnRMaXN0ZW5pbmcoY2FuY2VsbGF0aW9uVG9rZW4pLCBUYXNrQ3JlYXRpb25PcHRpb25zLkxvbmdSdW5uaW5nKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBfc2VydmVyVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFN0YXJ0TGlzdGVuaW5nKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiU3RhcnRlZCBsaXN0ZW5pbmcgYXQgc2VydmVyIik7CisKKyAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuUHJlU2VydmVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlICghY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFNlcnZlclRyYW5zcG9ydC5Jc0NsaWVudFBlbmRpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiV2FpdGluZyBmb3IgY2xpZW50IGNvbm5lY3Rpb24iKTsKKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGF3YWl0IFNlcnZlclRyYW5zcG9ydC5BY2NlcHRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZhY3RvcnkuU3RhcnROZXcoKCkgPT4gRXhlY3V0ZShjbGllbnQsIGNhbmNlbGxhdGlvblRva2VuKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCQiVHJhbnNwb3J0IGV4Y2VwdGlvbjoge3R0eH0iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkRlbGF5KFRpbWVTcGFuLkZyb21NaWxsaXNlY29uZHMoX2NsaWVudFdhaXRpbmdEZWxheSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaChUYXNrQ2FuY2VsZWRFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiQ29tcGxldGVkIGxpc3RlbmluZyBhdCBzZXJ2ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgRXhlY3V0ZShUQ2xpZW50VHJhbnNwb3J0IGNsaWVudCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgiU3RhcnRlZCBjbGllbnQgcmVxdWVzdCBwcm9jZXNzaW5nIik7CisKKyAgICAgICAgICAgIHZhciBwcm9jZXNzb3IgPSBJdFByb2Nlc3NvckZhY3RvcnkuR2V0QXN5bmNQcm9jZXNzb3IoY2xpZW50LCB0aGlzKTsKKworICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBJbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gT3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKworICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLkNyZWF0ZUNvbnRleHRBc3luYyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlICghY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IGlucHV0VHJhbnNwb3J0LlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuUHJvY2Vzc0NvbnRleHRBc3luYyhjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghYXdhaXQgcHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoJCJUcmFuc3BvcnQgZXhjZXB0aW9uOiB7dHR4fSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcigkIkVycm9yOiB7eH0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5EZWxldGVDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0Py5DbG9zZSgpOworICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0Py5DbG9zZSgpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIkNvbXBsZXRlZCBjbGllbnQgcmVxdWVzdCBwcm9jZXNzaW5nIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RCYXNlU2VydmVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDFkZDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcwpAQCAtMCwwICsxLDc5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEJhc2VTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBJTG9nZ2VyIExvZ2dlcjsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IElucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgSW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgSVRQcm9jZXNzb3JGYWN0b3J5IEl0UHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IE91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IE91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgU2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBTZXJ2ZXJUcmFuc3BvcnQ7CisKKyAgICAgICAgcHJvdGVjdGVkIFRCYXNlU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBJdFByb2Nlc3NvckZhY3RvcnkgPSBpdFByb2Nlc3NvckZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaXRQcm9jZXNzb3JGYWN0b3J5KSk7CisgICAgICAgICAgICBTZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICBJbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSk7CisgICAgICAgICAgICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSk7CisgICAgICAgICAgICBJbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICAgICAgICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSk7CisgICAgICAgICAgICBMb2dnZXIgPSBsb2dnZXIgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YobG9nZ2VyKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBTZXRFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBzZWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIEdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYmI0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMCwwICsxLDU0IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHJlcGxhY2VtZW50IGJ5IGV2ZW50PworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJlU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dCAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1MTIzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDM4IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeSA6IElUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJVEFzeW5jUHJvY2Vzc29yIF90QXN5bmNQcm9jZXNzb3I7CisKKyAgICAgICAgcHVibGljIFNpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5KElUQXN5bmNQcm9jZXNzb3IgdEFzeW5jUHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBfdEFzeW5jUHJvY2Vzc29yID0gdEFzeW5jUHJvY2Vzc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVENsaWVudFRyYW5zcG9ydCB0cmFucywgVEJhc2VTZXJ2ZXIgYmFzZVNlcnZlciA9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdEFzeW5jUHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzE0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBVbmtub3duTWV0aG9kLAorICAgICAgICAgICAgSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgV3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgQmFkU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIE1pc3NpbmdSZXN1bHQsCisgICAgICAgICAgICBJbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvciwKKyAgICAgICAgICAgIEludmFsaWRUcmFuc2Zvcm0sCisgICAgICAgICAgICBJbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IE1lc3NhZ2VUeXBlRmllbGRJZCA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEV4VHlwZUZpZWxkSWQgPSAyOworCisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIFR5cGU7CisKKyAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazxUQXBwbGljYXRpb25FeGNlcHRpb24+IFJlYWRBc3luYyhUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgICAgIHZhciB0eXBlID0gRXhjZXB0aW9uVHlwZS5Vbmtub3duOworCisgICAgICAgICAgICBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VUeXBlRmllbGRJZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEV4VHlwZUZpZWxkSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5JMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChFeGNlcHRpb25UeXBlKSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG91dHB1dFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIG1lc3NhZ2VUeXBlRmllbGROYW1lID0gIm1lc3NhZ2UiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGV4VHlwZUZpZWxkTmFtZSA9ICJleFR5cGUiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHN0cnVjdEFwcGxpY2F0aW9uRXhjZXB0aW9uTmFtZSA9ICJUQXBwbGljYXRpb25FeGNlcHRpb24iOworCisgICAgICAgICAgICB2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChzdHJ1Y3RBcHBsaWNhdGlvbkV4Y2VwdGlvbk5hbWUpOworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworCisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShNZXNzYWdlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5OYW1lID0gbWVzc2FnZVR5cGVGaWVsZE5hbWU7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IE1lc3NhZ2VUeXBlRmllbGRJZDsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMoTWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpZWxkLk5hbWUgPSBleFR5cGVGaWVsZE5hbWU7CisgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuSTMyOworICAgICAgICAgICAgZmllbGQuSUQgPSBFeFR5cGVGaWVsZElkOworCisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVJMzJBc3luYygoaW50KSBUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxOTI1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UQmFzZUNsaWVudC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIFRCYXNlQ2xpZW50LgorICAgIC8vLyAgICAgQmFzZSBjbGllbnQgZm9yIGdlbmVyYXRlZCBjbGllbnRzLgorICAgIC8vLyAgICAgRG8gbm90IGNoYW5nZSB0aGlzIGNsYXNzIHdpdGhvdXQgY2hlY2tpbmcgZ2VuZXJhdGVkIGNvZGUgKG5hbWluZ3MsIGV0Yy4pCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEJhc2VDbGllbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb3RvY29sIF9pbnB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfb3V0cHV0UHJvdG9jb2w7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3NlcUlkOworICAgICAgICBwdWJsaWMgcmVhZG9ubHkgR3VpZCBDbGllbnRJZCA9IEd1aWQuTmV3R3VpZCgpOworCisgICAgICAgIHByb3RlY3RlZCBUQmFzZUNsaWVudChUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbCkpOworICAgICAgICAgICAgX291dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2wgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0UHJvdG9jb2wpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCA9PiBfaW5wdXRQcm90b2NvbDsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIE91dHB1dFByb3RvY29sID0+IF9vdXRwdXRQcm90b2NvbDsKKworICAgICAgICBwdWJsaWMgaW50IFNlcUlkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiArK19zZXFJZDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIE9wZW5UcmFuc3BvcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9pbnB1dFByb3RvY29sLlRyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIV9pbnB1dFByb3RvY29sLlRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgX291dHB1dFByb3RvY29sLlRyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pbnB1dFByb3RvY29sPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE1ODhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwZTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwxNDMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciA6IElUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIC8vVE9ETzogTG9jYWxpemF0aW9uCisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgSVRBc3luY1Byb2Nlc3Nvcj4gX3NlcnZpY2VQcm9jZXNzb3JNYXAgPQorICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBJVEFzeW5jUHJvY2Vzc29yPigpOworCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxib29sPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5DYWxsKSAmJiAobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5PbmV3YXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgRmFpbEFzeW5jKG9wcm90LCBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBleFR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBtZXNzYWdlLk5hbWUuSW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TZXBhcmF0b3IsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZToge21lc3NhZ2UuTmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UuTmFtZS5TdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgYWN0dWFsUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIGlmICghX3NlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoc2VydmljZU5hbWUsIG91dCBhY3R1YWxQcm9jZXNzb3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgRmFpbEFzeW5jKG9wcm90LCBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7c2VydmljZU5hbWV9LiBEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKHNlcnZpY2VOYW1lLkxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNlcGFyYXRvci5MZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQpOworCisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3NBc3luYyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBuZXdNZXNzYWdlKSwgb3Byb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2ltaWxhciB0byBhbGwgb3RoZXIgcHJvY2Vzc29ycworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUmVnaXN0ZXJQcm9jZXNzb3Ioc3RyaW5nIHNlcnZpY2VOYW1lLCBJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zZXJ2aWNlUHJvY2Vzc29yTWFwLkNvbnRhaW5zS2V5KHNlcnZpY2VOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJCJQcm9jZXNzb3IgbWFwIGFscmVhZHkgY29udGFpbnMgcHJvY2Vzc29yIHdpdGggbmFtZTogJ3tzZXJ2aWNlTmFtZX0nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9zZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBGYWlsQXN5bmMoVFByb3RvY29sIG9wcm90LCBUTWVzc2FnZSBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZSBleHR5cGUsCisgICAgICAgICAgICBzdHJpbmcgZXR4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oZXh0eXBlLCBldHh0KTsKKworICAgICAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXdNZXNzYWdlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBhcHBleC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgICAgICB7CisgICAgICAgICAgICByZWFkb25seSBUTWVzc2FnZSBfbXNnQmVnaW47CisKKyAgICAgICAgICAgIHB1YmxpYyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBUTWVzc2FnZSBtZXNzYWdlQmVnaW4pCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9tc2dCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1lc3NhZ2U+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX21zZ0JlZ2luOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwNmZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0PC9QYWNrYWdlSWQ+CisgICAgPEF1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+dHJ1ZTwvQXV0b0dlbmVyYXRlQmluZGluZ1JlZGlyZWN0cz4KKyAgICA8R2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT50cnVlPC9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHNPdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlWZXJzaW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VmVyc2lvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZyIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmcuQ29uc29sZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmcuRGVidWciIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uSU8uUGlwZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249IjQuNC4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuTmFtZVJlc29sdXRpb24iIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0LlJlcXVlc3RzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5TZWN1cml0eSIgVmVyc2lvbj0iWzQuMywpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RCdWZmZXJlZENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZjFhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMDYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2J1ZlNpemU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9pbnB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9vdXRwdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIC8vVE9ETzogc2hvdWxkIHN1cHBvcnQgb25seSBzcGVjaWZpZWQgaW5wdXQgdHJhbnNwb3J0PworICAgICAgICBwdWJsaWMgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSA9IDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZTaXplIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YoYnVmU2l6ZSksICJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgX2J1ZlNpemUgPSBidWZTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgVW5kZXJseWluZ1RyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RyYW5zcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogaW52ZXN0aWdhdGUgaG93IGl0IHNob3VsZCB3b3JrIGNvcnJlY3RseQorICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZ290ID0gYXdhaXQgX2lucHV0QnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIF9pbnB1dEJ1ZmZlci5TZXRMZW5ndGgoX2lucHV0QnVmZmVyLkNhcGFjaXR5KTsKKworICAgICAgICAgICAgQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgLy8gaW52ZXN0aWdhdGUKKyAgICAgICAgICAgIHZhciBmaWxsZWQgPSBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBc3luYyhidWZTZWdtZW50LkFycmF5LCAwLCAoaW50KSBfaW5wdXRCdWZmZXIuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGZpbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgdmFyIHdyaXR0ZW5Db3VudCA9IDA7CisgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjYXBhID0gKGludCkgKF9vdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBfb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgdmFyIHdyaXRlU2l6ZSA9IGNhcGEgPD0gbGVuZ3RoID8gY2FwYSA6IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIHdyaXRlU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgd3JpdHRlbkNvdW50ICs9IHdyaXRlU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVTaXplID09IGNhcGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0FycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgICAgICAgICAvL19vdXRwdXRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBfb3V0cHV0QnVmZmVyLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9hd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChsZW5ndGggLSB3cml0dGVuQ291bnQgPj0gX2J1ZlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbkNvdW50LCBfYnVmU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJlbWFpbiA9IGxlbmd0aCAtIHdyaXR0ZW5Db3VudDsKKyAgICAgICAgICAgIGlmIChyZW1haW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IDwgX2J1ZlNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLkNhcGFjaXR5ID0gX2J1ZlNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRCdWZmZXIuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgcmVtYWluLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0FycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX291dHB1dEJ1ZmZlci5Ub0FycmF5KCk7IC8vIFRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoZGF0YSAvKmJ1ZlNlZ21lbnQuQXJyYXkqLywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIF9vdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKG5hbWVvZihfdHJhbnNwb3J0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlcj8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfdHJhbnNwb3J0Py5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RGcmFtZWRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExYmI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjAxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgSGVhZGVyU2l6ZSA9IDQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9oZWFkZXJCdWYgPSBuZXcgYnl0ZVtIZWFkZXJTaXplXTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX3JlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gX3dyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIFRGcmFtZWRDbGllbnRUcmFuc3BvcnQoVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90cmFuc3BvcnQgPSB0cmFuc3BvcnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YodHJhbnNwb3J0KSk7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+ICFfaXNEaXNwb3NlZCAmJiBfdHJhbnNwb3J0LklzT3BlbjsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5PcGVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIF90cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQorICAgICAgICAgICAgYXdhaXQgUmVhZEZyYW1lQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlYWRCdWZmZXIuUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBSZWFkRnJhbWVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5SZWFkQWxsQXN5bmMoX2hlYWRlckJ1ZiwgMCwgSGVhZGVyU2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgc2l6ZSA9IERlY29kZUZyYW1lU2l6ZShfaGVhZGVyQnVmKTsKKworICAgICAgICAgICAgX3JlYWRCdWZmZXIuU2V0TGVuZ3RoKHNpemUpOworICAgICAgICAgICAgX3JlYWRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICBfcmVhZEJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICB2YXIgYnVmZiA9IGJ1ZlNlZ21lbnQuQXJyYXk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKGJ1ZmYsIDAsIHNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfd3JpdGVCdWZmZXIuTGVuZ3RoICsgbGVuZ3RoID4gaW50Lk1heFZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfd3JpdGVCdWZmZXIuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgIC8vX3dyaXRlQnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAvL3ZhciBidWYgPSBidWZTZWdtZW50LkFycmF5OworICAgICAgICAgICAgdmFyIGJ1ZiA9IF93cml0ZUJ1ZmZlci5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIC8vdmFyIGxlbiA9IChpbnQpX3dyaXRlQnVmZmVyLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBkYXRhTGVuID0gKGludCkgX3dyaXRlQnVmZmVyLkxlbmd0aCAtIEhlYWRlclNpemU7CisgICAgICAgICAgICBpZiAoZGF0YUxlbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQorICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFMZW4sIGJ1Zik7CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIGVudGlyZSBtZXNzYWdlIGF0IG9uY2UKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWYsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAorICAgICAgICAgICAgX3dyaXRlQnVmZmVyLlNldExlbmd0aChIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gMjQpKTsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gMTYpKTsKKyAgICAgICAgICAgIGJ1ZlsyXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUgPj4gOCkpOworICAgICAgICAgICAgYnVmWzNdID0gKGJ5dGUpICgweGZmICYgKGZyYW1lU2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IERlY29kZUZyYW1lU2l6ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIChidWZbM10gJiAweGZmKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJURnJhbWVkQ2xpZW50VHJhbnNwb3J0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcmVhZEJ1ZmZlcj8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfd3JpdGVCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3ZDM4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9USHR0cENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIyNiBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuSHR0cDsKK3VzaW5nIFN5c3RlbS5OZXQuSHR0cC5IZWFkZXJzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSHR0cENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlW10gX2NlcnRpZmljYXRlczsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBVcmkgX3VyaTsKKworICAgICAgICAvLyBUaW1lb3V0cyBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2Nvbm5lY3RUaW1lb3V0ID0gMzAwMDA7CisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBfaHR0cENsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gX2lucHV0U3RyZWFtOworCisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gX291dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICBwdWJsaWMgVEh0dHBDbGllbnRUcmFuc3BvcnQoVXJpIHUsIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgOiB0aGlzKHUsIEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpLCBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBDbGllbnRUcmFuc3BvcnQoVXJpIHUsIElFbnVtZXJhYmxlPFg1MDlDZXJ0aWZpY2F0ZT4gY2VydGlmaWNhdGVzLAorICAgICAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGN1c3RvbUhlYWRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF91cmkgPSB1OworICAgICAgICAgICAgX2NlcnRpZmljYXRlcyA9IChjZXJ0aWZpY2F0ZXMgPz8gRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIEN1c3RvbUhlYWRlcnMgPSBjdXN0b21IZWFkZXJzOworCisgICAgICAgICAgICAvLyBkdWUgdG8gY3VycmVudCBidWcgd2l0aCBwZXJmb3JtYW5jZSBvZiBEaXNwb3NlIGluIG5ldGNvcmUgaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlZngvaXNzdWVzLzg4MDkKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHN3aXRjaGVkIHRvIGRlZmF1bHQgd2F5IChjcmVhdGUgY2xpZW50LT51c2UtPmRpc3Bvc2UgcGVyIGZsdXNoKSBsYXRlcgorICAgICAgICAgICAgX2h0dHBDbGllbnQgPSBDcmVhdGVDbGllbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gQ3VzdG9tSGVhZGVycyB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0IHsgX2Nvbm5lY3RUaW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9odHRwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXQgPSBhd2FpdCBfaW5wdXRTdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfb3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBIdHRwQ2xpZW50IENyZWF0ZUNsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IEh0dHBDbGllbnRIYW5kbGVyKCk7CisgICAgICAgICAgICBoYW5kbGVyLkNsaWVudENlcnRpZmljYXRlcy5BZGRSYW5nZShfY2VydGlmaWNhdGVzKTsKKworICAgICAgICAgICAgdmFyIGh0dHBDbGllbnQgPSBuZXcgSHR0cENsaWVudChoYW5kbGVyKTsKKworICAgICAgICAgICAgaWYgKF9jb25uZWN0VGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHR0cENsaWVudC5UaW1lb3V0ID0gVGltZVNwYW4uRnJvbVNlY29uZHMoX2Nvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuQWNjZXB0LkFkZChuZXcgTWVkaWFUeXBlV2l0aFF1YWxpdHlIZWFkZXJWYWx1ZSgiYXBwbGljYXRpb24veC10aHJpZnQiKSk7CisgICAgICAgICAgICBodHRwQ2xpZW50LkRlZmF1bHRSZXF1ZXN0SGVhZGVycy5Vc2VyQWdlbnQuQWRkKG5ldyBQcm9kdWN0SW5mb0hlYWRlclZhbHVlKCJUSHR0cENsaWVudFRyYW5zcG9ydCIsICIxLjAuMCIpKTsKKworICAgICAgICAgICAgaWYgKEN1c3RvbUhlYWRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBDdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuQWRkKGl0ZW0uS2V5LCBpdGVtLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBodHRwQ2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX291dHB1dFN0cmVhbS5DYW5TZWVrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIG91dFN0cmVhbSA9IG5ldyBTdHJlYW1Db250ZW50KF9vdXRwdXRTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gYXdhaXQgX2h0dHBDbGllbnQuUG9zdEFzeW5jKF91cmksIG91dFN0cmVhbSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuRW5zdXJlU3VjY2Vzc1N0YXR1c0NvZGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gYXdhaXQgbXNnLkNvbnRlbnQuUmVhZEFzU3RyZWFtQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEh0dHBSZXF1ZXN0RXhjZXB0aW9uIHd4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfaHR0cENsaWVudD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNTVhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9ieXRlU3RyZWFtOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IHRydWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9ieXRlU3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfYnl0ZVN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2J5dGVTdHJlYW0uVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU0YmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw5NSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gX2NsaWVudDsKKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgcGlwZSkgOiB0aGlzKCIuIiwgcGlwZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJOYW1lID0gc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzZXJ2ZXIpID8gc2VydmVyIDogIi4iOworCisgICAgICAgICAgICBfY2xpZW50ID0gbmV3IE5hbWVkUGlwZUNsaWVudFN0cmVhbShzZXJ2ZXJOYW1lLCBwaXBlLCBQaXBlRGlyZWN0aW9uLkluT3V0LCBQaXBlT3B0aW9ucy5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiBfY2xpZW50ICE9IG51bGwgJiYgX2NsaWVudC5Jc0Nvbm5lY3RlZDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Db25uZWN0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9jbGllbnQuUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBfY2xpZW50LldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2OWQxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0IDogVFN0cmVhbUNsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KFRjcENsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENsaWVudCA9IGNsaWVudCA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihjbGllbnQpKTsKKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MgaG9zdCwgaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgSG9zdCA9IGhvc3Q7CisgICAgICAgICAgICBQb3J0ID0gcG9ydDsKKworICAgICAgICAgICAgVGNwQ2xpZW50ID0gbmV3IFRjcENsaWVudCgpOworICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIFRjcENsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgcHVibGljIElQQWRkcmVzcyBIb3N0IHsgZ2V0OyB9CisgICAgICAgIHB1YmxpYyBpbnQgUG9ydCB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUY3BDbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBUY3BDbGllbnQuU2VuZFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRjcENsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBUY3BDbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoUG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBvciBub3QgaW5pdGlhbGl6ZWQgdGNwIGNsaWVudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUY3BDbGllbnQuQ29ubmVjdEFzeW5jKEhvc3QsIFBvcnQpOworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IFRjcENsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IFRjcENsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50Py5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RTdHJlYW1DbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxNjRmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTEwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisKKyAgICAgICAgcHJvdGVjdGVkIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyZWFtIE91dHB1dFN0cmVhbSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBJbnB1dFN0cmVhbSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IHRydWU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgSW5wdXRTdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBPdXRwdXRTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPdXRwdXRTdHJlYW0uRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJlNGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMzcgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IHdvcmsKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQgOiBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZTIgX2NlcnRpZmljYXRlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIF9jZXJ0VmFsaWRhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElQQWRkcmVzcyBfaG9zdDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9pc1NlcnZlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIF9zc2xQcm90b2NvbHM7CisgICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IF9jbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3NsU3RyZWFtIF9zZWN1cmVTdHJlYW07CisgICAgICAgIHByaXZhdGUgaW50IF90aW1lb3V0OworCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KFRjcENsaWVudCBjbGllbnQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsIGJvb2wgaXNTZXJ2ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgX2NlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICBfY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKyAgICAgICAgICAgIF9pc1NlcnZlciA9IGlzU2VydmVyOworCisgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIgJiYgY2VydGlmaWNhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQgbmVlZHMgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZW9mKGNlcnRpZmljYXRlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBzdHJpbmcgY2VydGlmaWNhdGVQYXRoLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0aWZpY2F0ZVBhdGgpLAorICAgICAgICAgICAgICAgIGNlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSA9IG51bGwsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLAorICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgIGNlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2hvc3QgPSBob3N0OworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX3RpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgX2NlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICBfY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50LlNlbmRUaW1lb3V0ID0gX3RpbWVvdXQgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgPT4gX2NsaWVudDsKKworICAgICAgICBwdWJsaWMgSVBBZGRyZXNzIEhvc3QgPT4gX2hvc3Q7CisKKyAgICAgICAgcHVibGljIGludCBQb3J0ID0+IF9wb3J0OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIF9jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBfY2xpZW50LlNlbmRUaW1lb3V0ID0gX3RpbWVvdXQ7CisgICAgICAgICAgICBfY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLCBYNTA5Q2hhaW4gY2hhaW4sCisgICAgICAgICAgICBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNzbFZhbGlkYXRpb25FcnJvcnMgPT0gU3NsUG9saWN5RXJyb3JzLk5vbmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaG9zdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfcG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKF9ob3N0LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgYXdhaXQgU2V0dXBUbHNBc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgU2V0dXBUbHNBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSBfY2VydFZhbGlkYXRvciA/PyBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3I7CisKKyAgICAgICAgICAgIGlmIChfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oX2NsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIHZhbGlkYXRvciwgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oX2NsaWVudC5HZXRTdHJlYW0oKSwgZmFsc2UsIHZhbGlkYXRvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaXNTZXJ2ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNTZXJ2ZXJBc3luYyhfY2VydGlmaWNhdGUsIF9jZXJ0VmFsaWRhdG9yICE9IG51bGwsIF9zc2xQcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsaWVudCBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICB2YXIgY2VydHMgPSBfY2VydGlmaWNhdGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7X2NlcnRpZmljYXRlfQorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRIb3N0ID0gX2hvc3QuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3NlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudEFzeW5jKHRhcmdldEhvc3QsIGNlcnRzLCBfc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gX3NlY3VyZVN0cmVhbTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChfY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX2NsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VjdXJlU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX3NlY3VyZVN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjA2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVEh0dHBTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw5OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkh0dHA7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgY29uc3Qgc3RyaW5nIENvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTG9nZ2VyIF9sb2dnZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVxdWVzdERlbGVnYXRlIF9uZXh0OworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgRW5jb2RpbmcgPSBFbmNvZGluZy5VVEY4OworCisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvdG9jb2xGYWN0b3J5IE91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICBwcm90ZWN0ZWQgSVRBc3luY1Byb2Nlc3NvciBQcm9jZXNzb3I7CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgUmVxdWVzdERlbGVnYXRlIG5leHQsCisgICAgICAgICAgICBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIG5leHQsIGxvZ2dlckZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LCBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9nZ2VyRmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGxvZ2dlckZhY3RvcnkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUHJvY2Vzc29yID0gcHJvY2Vzc29yID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHByb2Nlc3NvcikpOworICAgICAgICAgICAgSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpbnB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sRmFjdG9yeSkpOworCisgICAgICAgICAgICBfbmV4dCA9IG5leHQ7CisgICAgICAgICAgICBfbG9nZ2VyID0gbG9nZ2VyRmFjdG9yeS5DcmVhdGVMb2dnZXI8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBJbnZva2UoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZXNwb25zZS5Db250ZW50VHlwZSA9IENvbnRlbnRUeXBlOworICAgICAgICAgICAgYXdhaXQgUHJvY2Vzc1JlcXVlc3RBc3luYyhjb250ZXh0LCBjb250ZXh0LlJlcXVlc3RBYm9ydGVkKTsgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCBsb2dpYworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgUHJvY2Vzc1JlcXVlc3RBc3luYyhIdHRwQ29udGV4dCBjb250ZXh0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5Cb2R5LCBjb250ZXh0LlJlc3BvbnNlLkJvZHkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBQcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2Nzg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTkxIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgUGlwZSBvbiB0aGUgbG9jYWxob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfcGlwZUFkZHJlc3M7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9hc3luY01vZGUgPSB0cnVlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgX2lzUGVuZGluZyA9IHRydWU7CisKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gX3N0cmVhbSA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoc3RyaW5nIHBpcGVBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBfcGlwZUFkZHJlc3MgPSBwaXBlQWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBmb3IgZGlzY29uZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtLkRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBfaXNQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9pc1BlbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRW5zdXJlUGlwZUluc3RhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IDI1NDsKKyAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IFBpcGVUcmFuc21pc3Npb25Nb2RlLkJ5dGU7CisgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBfYXN5bmNNb2RlID8gUGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzIDogUGlwZU9wdGlvbnMuTm9uZTsKKyAgICAgICAgICAgICAgICB2YXIgaW5idWYgPSA0MDk2OworICAgICAgICAgICAgICAgIHZhciBvdXRidWYgPSA0MDk2OworICAgICAgICAgICAgICAgIC8vIFRPRE86IHNlY3VyaXR5CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKF9waXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1Ziwgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKSAvLyBNb25vIHN0aWxsIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMsIGZhbGxiYWNrIHRvIHN5bmMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICY9ICh+UGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKF9waXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBpbmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgX2FzeW5jTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbnN1cmVQaXBlSW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV2FpdEZvckNvbm5lY3Rpb25Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgU2VydmVyVHJhbnNwb3J0KF9zdHJlYW0pOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBudWxsOyAvLyBwYXNzIG93bmVyc2hpcCB0byBTZXJ2ZXJUcmFuc3BvcnQKKworICAgICAgICAgICAgICAgIC8vX2lzUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW07CisKKyAgICAgICAgICAgIHB1YmxpYyBTZXJ2ZXJUcmFuc3BvcnQoTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX3N0cmVhbSAhPSBudWxsICYmIF9zdHJlYW0uSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbT8uRGlzcG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9zdHJlYW0uUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgX3N0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyRnJhbWVkVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODZlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNlcnZlckZyYW1lZFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBURnJhbWVkQ2xpZW50VHJhbnNwb3J0IHRTb2NrZXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIHZhciB0Y3BDbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydCh0Y3BDbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSBfY2xpZW50VGltZW91dAorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFNvY2tldFRyYW5zcG9ydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0U29ja2V0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKSB0Y3BDbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlkOGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyk6CisgICAgICAgICAgICB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIHVzZUJ1ZmZlcmVkU29ja2V0cywgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywgYm9vbCB1c2VGcmFtZWRUcmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICBfdXNlRnJhbWVkVHJhbnNwb3J0ID0gdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzZXJ2ZXIgc29ja2V0CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihJUEFkZHJlc3MuQW55LCBfcG9ydCk7CisgICAgICAgICAgICAgICAgX3NlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IHRTb2NrZXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIHZhciB0Y3BDbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQgPSBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydCh0Y3BDbGllbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSBfY2xpZW50VGltZW91dAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGlmIChfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0U29ja2V0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChfdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFNvY2tldFRyYW5zcG9ydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0U29ja2V0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRUcmFuc3BvcnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKSB0Y3BDbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTlmZWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2xpZW50Q2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQgPSAwOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9zZXJ2ZXJDZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgX3NzbFByb3RvY29sczsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlRnJhbWVkVHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIF9zZXJ2ZXI7CisKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoaW50IHBvcnQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgZmFsc2UsIGNlcnRpZmljYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpIAorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIHVzZUJ1ZmZlcmVkU29ja2V0cywgZmFsc2UsIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgIGNsaWVudENlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywKKyAgICAgICAgICAgIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICJZb3VyIHNlcnZlci1jZXJ0aWZpY2F0ZSBuZWVkcyB0byBoYXZlIGEgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3BvcnQgPSBwb3J0OworICAgICAgICAgICAgX3NlcnZlckNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRDZXJ0VmFsaWRhdG9yID0gY2xpZW50Q2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICBfc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQge3BvcnR9LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFjY2VwdCBpcyBub3QgYmxvY2tpbmcKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDoge3N4Lk1lc3NhZ2V9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNDbGllbnRQZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXJ2ZXIuUGVuZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUQ2xpZW50VHJhbnNwb3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBfc2VydmVyLkFjY2VwdFRjcENsaWVudEFzeW5jKCk7CisgICAgICAgICAgICAgICAgY2xpZW50LlNlbmRUaW1lb3V0ID0gY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQ7CisKKyAgICAgICAgICAgICAgICAvL3dyYXAgdGhlIGNsaWVudCBpbiBhbiBTU0wgU29ja2V0IHBhc3NpbmcgaW4gdGhlIFNTTCBjZXJ0CisgICAgICAgICAgICAgICAgdmFyIHRUbHNTb2NrZXQgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChjbGllbnQsIF9zZXJ2ZXJDZXJ0aWZpY2F0ZSwgdHJ1ZSwgX2NsaWVudENlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIF9zc2xQcm90b2NvbHMpOworCisgICAgICAgICAgICAgICAgYXdhaXQgdFRsc1NvY2tldC5TZXR1cFRsc0FzeW5jKCk7CisKKyAgICAgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zID0gdFRsc1NvY2tldDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF91c2VGcmFtZWRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDoge2V4fSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDk2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc5IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy9UT0RPOiB0aGluayBhYm91dCBjbGllbnQgaW5mbyAKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQ2xpZW50VHJhbnNwb3J0IDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIC8vVE9ETzogdGhpbmsgaG93IHRvIGF2b2lkIHBlZWsgYnl0ZQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfcGVla0J1ZmZlciA9IG5ldyBieXRlWzFdOworICAgICAgICBwcml2YXRlIGJvb2wgX2hhc1BlZWtCeXRlOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc09wZW4geyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgICAgIEdDLlN1cHByZXNzRmluYWxpemUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQZWVrQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vSWYgd2UgYWxyZWFkeSBoYXZlIGEgYnl0ZSByZWFkIGJ1dCBub3QgY29uc3VtZWQsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICBpZiAoX2hhc1BlZWtCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0lmIHRyYW5zcG9ydCBjbG9zZWQgd2UgY2FuJ3QgcGVlay4KKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UcnkgdG8gcmVhZCBvbmUgYnl0ZS4gSWYgc3VjY2VlZHMgd2Ugd2lsbCBuZWVkIHRvIHN0b3JlIGl0IGZvciB0aGUgbmV4dCByZWFkLgorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGJ5dGVzID0gYXdhaXQgUmVhZEFzeW5jKF9wZWVrQnVmZmVyLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CisKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoYnVmZmVyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKG9mZnNldCksICJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihsZW5ndGgpLCAiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5MZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YoYnVmZmVyKSwgIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFsbEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQWxsQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFsbEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmV0cmlldmVkID0gMDsKKworICAgICAgICAgICAgLy9JZiB3ZSBwcmV2aW91c2x5IHBlZWtlZCBhIGJ5dGUsIHdlIG5lZWQgdG8gdXNlIHRoYXQgZmlyc3QuCisgICAgICAgICAgICBpZiAoX2hhc1BlZWtCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyByZXRyaWV2ZWQrK10gPSBfcGVla0J1ZmZlclswXTsKKyAgICAgICAgICAgICAgICBfaGFzUGVla0J5dGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKHJldHJpZXZlZCA8IGxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHJldHVybmVkQ291bnQgPSBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQgKyByZXRyaWV2ZWQsIGxlbmd0aCAtIHJldHJpZXZlZCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZENvdW50IDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHJpZXZlZCArPSByZXR1cm5lZENvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHJpZXZlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQXN5bmMoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBGbHVzaEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ1YTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDU0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgTGlzdGVuKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzQ2xpZW50UGVuZGluZygpOworCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWNjZXB0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGF3YWl0IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJ7bmFtZW9mKEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMpfSBzaG91bGQgbm90IHJldHVybiBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNDJlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIE5vdE9wZW4sCisgICAgICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgIFRpbWVkT3V0LAorICAgICAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIEV4VHlwZTsKKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlKQorICAgICAgICAgICAgOiB0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhUeXBlID0gZXhUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSBleFR5cGUsIHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUgPT4gRXhUeXBlOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzNjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpAQCAtMCwwICsxLDM1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBGcm9tIE1hcmsgU2xlZSAmIEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgorICAgIC8vLyAgICAgRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgICAgLy8vICAgICBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAgICAvLy8gICAgIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICAgIC8vLyAgICAgYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5jbWQgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYzRiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI3IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKzplb2YKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL2J1aWxkLnNoIGIvbGliL25ldGNvcmUvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxOGJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCisjc2V0IC1lCisKK3RocmlmdCAtLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZCAKKworI3JldmlzaW9uPSR7VFJBVklTX0pPQl9JRDo9MX0gIAorI3JldmlzaW9uPSQocHJpbnRmICIlMDRkIiAkcmV2aXNpb24pIAorCisjZG90bmV0IHBhY2sgLi9zcmMvUFJPSkVDVF9OQU1FIC1jIFJlbGVhc2UgLW8gLi9hcnRpZmFjdHMgLS12ZXJzaW9uLXN1ZmZpeD0kcmV2aXNpb24gIApkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuY21kIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTRiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5jbWQKQEAgLTAsMCArMSwyOCBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KKworZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvagorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNmNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit0aHJpZnQgLXZlcnNpb24KK2RvdG5ldCAtLWluZm8KKworZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCitkb3RuZXQgdGVzdCBUZXN0c1xUaHJpZnQuVGVzdHNcVGhyaWZ0LlRlc3RzLmNzcHJvagpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0gYi9saWIvbm9kZWpzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4ZWEzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDMgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKworc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCitkZXBzOiAkKHRvcF9zcmNkaXIpL3BhY2thZ2UuanNvbgorCSQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvIHx8ICQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvCisKK2FsbC1sb2NhbDogZGVwcworCitwcmVjcm9zczogZGVwcyBzdHVicworCisjIFRPRE86IExpbnQgbm9kZWpzIGxpYiBhbmQgZ2VuLWNvZGUgYXMgcGFydCBvZiBidWlsZAorY2hlY2s6IGRlcHMKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSB0ZXN0ICYmICQoTlBNKSBydW4gbGludC10ZXN0cyAmJiBjZCBsaWIvbm9kZWpzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCisKK0VYVFJBX0RJU1QgPSBcCisJZXhhbXBsZXMgXAorCWxpYiBcCisJdGVzdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL1JFQURNRS5tZCBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCmluZGV4IDI4MzJjMWIuLjUwYWNmYmQgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvUkVBRE1FLm1kCisrKyBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCkBAIC0xLDI1ICsxLDI4IEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KK1RocmlmdCBOb2RlLmpzIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KIAorTGljZW5zZQorLS0tLS0tLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi1OT1RFOiB5b3UgbXVzdCB1c2UgdGhlIGZyYW1lZCB0aHJpZnQgdHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0IGluIG1vc3QKLWltcGxlbWVudGF0aW9ucywgb24gdGhlIHNlcnZlciBzaWRlLiBVc2luZyBhIHBvcHVsYXIgZXhhbXBsZSwgdGhpcyBpcyBlbmFibGVkCi1ieSBkZWZhdWx0IGluIENhc3NhbmRyYSAwLjcgKGJ1dCBjb25maWd1cmF0aW9uIG11c3QgYmUgY2hhbmdlZCBpbiBDYXNzYW5kcmEKLTAuNi54IGFuZCBlYXJsaWVyKS4KKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgQ29tcGF0aWJpbGl0eQorCitub2RlIHZlcnNpb24gNiBvciBsYXRlciBpcyByZXF1aXJlZAogCiAjIyBJbnN0YWxsCiAKQEAgLTI3LDcgKzMwLDcgQEAKIAogIyMgVGhyaWZ0IENvbXBpbGVyCiAKLVlvdSBjYW4gY29tcGlsZSBub2RlanMgc291cmNlcyBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmc6CitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIE5vZGUuanMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CiAKICAgICB0aHJpZnQgLS1nZW4ganM6bm9kZSB0aHJpZnRfZmlsZQogCkBAIC0zNSwyNiArMzgsMzMgQEAKIAogSGVyZSBpcyBhIENhc3NhbmRyYSBleGFtcGxlOgogCi0gICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAotICAgICAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKLSAgICAgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2Nhc3NhbmRyYV90eXBlcycpOworYGBganMKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKKyAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CiAKLSAgICB2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MTYwKSwKLSAgICAgICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYXNzYW5kcmEsIGNvbm5lY3Rpb24pOwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTE2MCksCisgICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYXNzYW5kcmEsIGNvbm5lY3Rpb24pOwogCi0gICAgY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKLSAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKLSAgICB9KTsKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGNvbnNvbGUuZXJyb3IoZXJyKTsKK30pOwogCi0gICAgY2xpZW50LmdldF9zbGljZSgiS2V5c3BhY2UiLCAia2V5IiwgbmV3IHR0eXBlcy5Db2x1bW5QYXJlbnQoe2NvbHVtbl9mYW1pbHk6ICJFeGFtcGxlQ0YifSksIG5ldyB0dHlwZXMuU2xpY2VQcmVkaWNhdGUoe3NsaWNlX3JhbmdlOiBuZXcgdHR5cGVzLlNsaWNlUmFuZ2Uoe3N0YXJ0OiAnJywgZmluaXNoOiAnJ30pfSksIHR0eXBlcy5Db25zaXN0ZW5jeUxldmVsLk9ORSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7Ci0gICAgICBpZiAoZXJyKSB7Ci0gICAgICAgIC8vIGhhbmRsZSBlcnIKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCi0gICAgICB9Ci0gICAgICBjb25uZWN0aW9uLmVuZCgpOwotICAgIH0pOworY2xpZW50LmdldF9zbGljZSgiS2V5c3BhY2UiLCAia2V5IiwgbmV3IHR0eXBlcy5Db2x1bW5QYXJlbnQoe2NvbHVtbl9mYW1pbHk6ICJFeGFtcGxlQ0YifSksIG5ldyB0dHlwZXMuU2xpY2VQcmVkaWNhdGUoe3NsaWNlX3JhbmdlOiBuZXcgdHR5cGVzLlNsaWNlUmFuZ2Uoe3N0YXJ0OiAnJywgZmluaXNoOiAnJ30pfSksIHR0eXBlcy5Db25zaXN0ZW5jeUxldmVsLk9ORSwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7CisgIGlmIChlcnIpIHsKKyAgICAvLyBoYW5kbGUgZXJyCisgIH0gZWxzZSB7CisgICAgLy8gZGF0YSA9PSBbdHR5cGVzLkNvbHVtbk9yU3VwZXJDb2x1bW4sIC4uLl0KKyAgfQorICBjb25uZWN0aW9uLmVuZCgpOworfSk7CitgYGAKIAotIyMgQ3VzdG9tIGNsaWVudCBhbmQgc2VydmVyIGV4YW1wbGUKKzxhIG5hbWU9ImludDY0Ij48L2E+CisjIyBJbnQ2NAogCi1BbiBleGFtcGxlIGJhc2VkIG9uIHRoZSBvbmUgc2hvd24gb24gdGhlIFRocmlmdCBmcm9udCBwYWdlIGlzIGluY2x1ZGVkIGluIHRoZSBleGFtcGxlcy8gZm9sZGVyLgorU2luY2UgSmF2YVNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZXMsIGludDY0IHZhbHVlcyBjYW5ub3QgYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCBuYXR1cmFsbHkuIFRvIHNvbHZlIHRoaXMsIGludDY0IHZhbHVlcyBpbiByZXNwb25zZXMgd2lsbCBiZSB3cmFwcGVkIHdpdGggVGhyaWZ0LkludDY0IG9iamVjdHMuIFRoZSBJbnQ2NCBpbXBsZW1lbnRhdGlvbiB1c2VkIGlzIFticm9vZmEvbm9kZS1pbnQ2NF0oaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLWludDY0KS4KKworIyMgQ2xpZW50IGFuZCBzZXJ2ZXIgZXhhbXBsZXMKKworU2V2ZXJhbCBleGFtcGxlIGNsaWVudHMgYW5kIHNlcnZlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSB0aHJpZnQvbGliL25vZGVqcy9leGFtcGxlcyBmb2xkZXIgYW5kIHRoZSBjcm9zcyBsYW5ndWFnZSB0dXRvcmlhbCB0aHJpZnQvdHV0b3JpYWwvbm9kZWpzIGZvbGRlci4KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZSBiL2xpYi9ub2RlanMvZXhhbXBsZXMvTWFrZWZpbGUKaW5kZXggMTkzMDI3OS4uODcxNTdkYiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL01ha2VmaWxlCkBAIC0xNCw1ICsxNCwxMSBAQAogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotQUxMOgkKK2FsbDoJCiAJLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0CisKK3NlcnZlcjogYWxsCQorCU5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdDokKE5PREVfUEFUSCkgbm9kZSBzZXJ2ZXIuanMKKworY2xpZW50OiBhbGwJCisJTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0OiQoTk9ERV9QQVRIKSBub2RlIGNsaWVudC5qcwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZAppbmRleCBhODc1ODFmLi43MzUwYzEwIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZApAQCAtMSwyOSArMSw0MCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIFJ1bm5pbmcgdGhlIHVzZXIgZXhhbXBsZQorIyBUaHJpZnQgTm9kZS5qcyBFeGFtcGxlcwogCi0jR2VuZXJhdGUgdGhlIGJpbmRpbmdzOgotLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0CisjIyBMaWNlbnNlCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSNUbyBydW4gdGhlIHVzZXIgZXhhbXBsZSwgZmlyc3Qgc3RhcnQgdXAgdGhlIHNlcnZlciBpbiBvbmUgdGVybWluYWw6Ci1OT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBzZXJ2ZXIuanMKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKLSNOb3cgcnVuIHRoZSBjbGllbnQ6Ci1OT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBjbGllbnQuanMKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KIAorIyMgUnVubmluZyB0aGUgdXNlciBleGFtcGxlCiAKLSAgICAKK0dlbmVyYXRlIHRoZSBiaW5kaW5nczoKKworICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSB1c2VyLnRocmlmdAorICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSAtLWdlbiBweSBoZWxsby50aHJpZnQKKworVG8gcnVuIHRoZSB1c2VyIGV4YW1wbGUsIGZpcnN0IHN0YXJ0IHVwIHRoZSBzZXJ2ZXIgaW4gb25lIHRlcm1pbmFsOgorCisgICAgTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0IG5vZGUgc2VydmVyLmpzCisKK05vdyBydW4gdGhlIGNsaWVudDoKKworICAgIE5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIGNsaWVudC5qcworCitGb3IgYW4gZXhhbXBsZSB1c2luZyBKYXZhU2NyaXB0IGluIHRoZSBicm93c2VyIHRvIGNvbm5lY3QgdG8KK2Egbm9kZS5qcyBzZXJ2ZXIgbG9vayBhdCBoZWxsby5odG1sLCBoZWxsby5qcyBhbmQgaGVsbG8udGhyaWZ0CisKK0hUVFAgZXhhbXBsZXMgYXJlIHByb3ZpZGVkIGFsc286IGh0dHBDbGllbnQuanMgYW5kIGh0dHBTZXJ2ZXIuanMKK1lvdSBjYW4gdGVzdCBIVFRQIGNyb3NzIHBsYXRmb3JtIHdpdGggdGhlIGh0dHBTZXJ2ZXIucHkgUHl0aG9uIHNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnRfbXVsdGl0cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM3ZGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnRfbXVsdGl0cmFuc3BvcnQuanMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAorICAgIHR0cmFuc3BvcnQgPSByZXF1aXJlKCd0aHJpZnQvdHJhbnNwb3J0Jyk7CisKK3ZhciBVc2VyU3RvcmFnZSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9Vc2VyU3RvcmFnZScpLAorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy91c2VyX3R5cGVzJyk7CisKK3ZhciBmX2Nvbm4gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbignbG9jYWxob3N0JywgOTA5MCksIC8vIGRlZmF1bHQ6IGZyYW1lZAorICAgIGZfY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChVc2VyU3RvcmFnZSwgZl9jb25uKTsKK3ZhciBiX2Nvbm4gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbignbG9jYWxob3N0JywgOTA5MSwge3RyYW5zcG9ydDogdHRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnR9KSwKKyAgICBiX2NsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVXNlclN0b3JhZ2UsIGJfY29ubik7Cit2YXIgdXNlcjEgPSBuZXcgdHR5cGVzLlVzZXJQcm9maWxlKHt1aWQ6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAiTWFyayBTbGVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdXJiOiAiSSdsbCBmaW5kIHNvbWV0aGluZyB0byBwdXQgaGVyZS4ifSk7Cit2YXIgdXNlcjIgPSBuZXcgdHR5cGVzLlVzZXJQcm9maWxlKHt1aWQ6IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAiU2F0b3NoaSBUYWdvbW9yaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVyYjogIm9rLCBsZXQncyB0ZXN0IHdpdGggYnVmZmVyZWQgdHJhbnNwb3J0LiJ9KTsKKworZl9jb25uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBjb25zb2xlLmVycm9yKCJmcmFtZWQ6IiwgZXJyKTsKK30pOworCitmX2NsaWVudC5zdG9yZSh1c2VyMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICBpZiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgcmV0dXJuOyB9CisKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyMS51aWQsICIgYXMgIiwgdXNlcjEubmFtZSk7CisgIGJfY2xpZW50LnJldHJpZXZlKHVzZXIxLnVpZCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZVVzZXIpIHsKKyAgICBpZiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgcmV0dXJuOyB9CisgICAgY29uc29sZS5sb2coInJldHJpZXZlZDoiLCByZXNwb25zZVVzZXIudWlkLCAiIGFzICIsIHJlc3BvbnNlVXNlci5uYW1lKTsKKyAgfSk7Cit9KTsKKworYl9jbGllbnQuc3RvcmUodXNlcjIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgaWYgKGVycikgeyBjb25zb2xlLmVycm9yKGVycik7IHJldHVybjsgfQorCisgIGNvbnNvbGUubG9nKCJzdG9yZWQ6IiwgdXNlcjIudWlkLCAiIGFzICIsIHVzZXIyLm5hbWUpOworICBmX2NsaWVudC5yZXRyaWV2ZSh1c2VyMi51aWQsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2VVc2VyKSB7CisgICAgaWYgKGVycikgeyBjb25zb2xlLmVycm9yKGVycik7IHJldHVybjsgfQorICAgIGNvbnNvbGUubG9nKCJyZXRyaWV2ZWQ6IiwgcmVzcG9uc2VVc2VyLnVpZCwgIiBhcyAiLCByZXNwb25zZVVzZXIubmFtZSk7CisgIH0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmh0bWwgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4NWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbApAQCAtMCwwICsxLDY1IEBACis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgICAgPHRpdGxlPkFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBCcm93c2VyIENsaWVudCBEZW1vPC90aXRsZT4KKyAgICA8c2NyaXB0IHNyYz0idGhyaWZ0LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvSGVsbG9TdmMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaW1lc1R3by5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT5BcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQgQnJvd3NlciBDbGllbnQgRGVtbzwvaDE+CisgICAgPHA+VGhpcyBodG1sIGZpbGUgZGVtb25zdHJhdGVzIEFwYWNoZSBUaHJpZnQgSmF2YVNjcnB0IFJQQyBiZXR3ZWVuIGEgYnJvd3NlciBjbGllbnQgdG8gYSBub2RlLmpzIHNlcnZlci4gQ2xpY2tpbmcgdGhlIGJ1dHRvbnMgYmVsb3cgd2lsbCBjYWxsIHRoZSBSUEMgZnVuY3Rpb25zIGhvc3RlZCBieSB0aGUgQXBhY2hlIFRocmlmdCBzZXJ2ZXIgYXQgbG9jYWxob3N0Ojg1ODUuIFRoZSBmaWxlIGhlbGxvLmpzIGNvbnRhaW5zIHRoZSBKYXZhU2NyaXB0IG5vZGUuanMgc2VydmVyIHJlcXVpcmVkLiBIZXJlIGFyZSB0aGUgc3RlcHMgdG8gZ2V0IHRoZSBleGFtcGxlIHJ1bm5pbmc6PC9wPgorICAgIDxvbD4KKyAgICAgICAgPGxpPkluc3RhbGwgTm9kZS5qcyA8cHJlPjxhIGhyZWY9Imh0dHA6Ly9ub2RlanMub3JnIj5ub2RlanMub3JnPC9hPjwvcHJlPjwvbGk+CisgICAgICAgIDxsaT5JbnN0YWxsIEFwYWNoZSBUaHJpZnQgZm9yIG5vZGUgKG5vdGUgdGhhdCB0aGUgbm9kZSBwYWNrYWdlIG1hbmFnZXIgd2lsbCBjcmVhdGUgdGhlIG5vZGVfbW9kdWxlcyBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNvIG1ha2Ugc3VyZSB0byBydW4gbnBtIGZyb20gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGhlbGxvLmpzIHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gZmluZCB0aGUgVGhyaWZ0IGxpYnJhcmllcy4gVGhpcyBleGFtcGxlIHJlcXVpcmVzIEFwYWNoZSBUaHJpZnQgMC45LjIrKSA8cHJlPiQgbnBtIGluc3RhbGwgdGhyaWZ0PC9wcmU+PC9saT4KKyAgICAgICAgPGxpPkNvbXBpbGUgdGhlIGhlbGxvLmlkbCBmb3IgSmF2YVNjcmlwdCBhbmQgTm9kZS5qcyAoeW91J2xsIG5lZWQgdG8gaGF2ZSB0aGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBpbnN0YWxsZWQgZm9yIHRoaXMgc3RlcC4gVGhpcyBhbHNvIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBoZWxsby5qcyBiZWNhdXNlIGhlbGxvLmpzIGFuZCBoZWxsby5odG1sIGxvb2sgZm9yIHRoZSBnZW4tbm9kZWpzIGFuZCBnZW4tanMgZGlyZWN0b3JpZXMgaGVyZS4pPHByZT4kIHRocmlmdCAtZ2VuIGpzIC1nZW4ganM6bm9kZSBoZWxsby50aHJpZnQ8L3ByZT48L2xpPgorICAgICAgICA8bGk+UnVuIHRoZSBub2RlIHNlcnZlciBpbiB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIGhlbGxvLmh0bWwgZmlsZTxwcmU+JCBub2RlIGhlbGxvLmpzPC9wcmU+PC9saT4KKyAgICAgICAgPGxpPkNvcHkgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5LCB0aHJpZnQuanMsIGludG8gdGhlIGRpcmVjdG9yeSB3aXRoIHRoaXMgaHRtbCBmaWxlLjxwcmU+JCBjcCAuLi4uLi90aHJpZnQuanMgLiAoeW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZSBCb3dlciB0byBpbnN0YWxsIHRoZSBicm93c2VyIGJhc2VkIEFwYWNoZSBUaHJpZnQgbGlicmFyeSBpbiB0aGUgbmVhciBmdXR1cmUuKTwvcHJlPgorICAgICAgICA8bGk+UmVsb2FkIHRoaXMgcGFnZSBpbiBhIGJyb3dzZXIgdGhyb3VnaCB0aGUgbm9kZSBzZXJ2ZXIgdXNpbmcgdXNpbmcgdGhlIFVSTDogPHByZT5odHRwOi8vbG9jYWxob3N0Ojg1ODUvaGVsbG8uaHRtbDwvcHJlPnRoZW4gY2xpY2sgYSBidXR0b24gYmVsb3cgdG8gbWFrZSBhbiBSUEMgY2FsbDwvbGk+CisgICAgPC9vbD4KKyAgICA8YnV0dG9uIGlkPSJidG4iPkdldCBNZXNzYWdlIGZyb20gTm9kZSBTZXJ2ZXI8L2J1dHRvbj4KKyAgICA8YnV0dG9uIGlkPSJidG5EYmwiPkRvdWJsZSAyNTwvYnV0dG9uPgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0biIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZ2V0TWVzc2FnZSwgZmFsc2UpOworCisgICAgICAgIGZ1bmN0aW9uIGdldE1lc3NhZ2UoKSB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSVHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUvaGVsbG8iKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgSGVsbG9TdmNDbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgdmFyIG1zZyA9IGNsaWVudC5oZWxsb19mdW5jKCk7CisgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0IikuaW5uZXJIVE1MID0gbXNnOworICAgICAgICB9CisKKyAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bkRibCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZGJsTWVzc2FnZSwgZmFsc2UpOworCisgICAgICAgIGZ1bmN0aW9uIGRibE1lc3NhZ2UoKSB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSVHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUvZGJsIik7CisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IFRpbWVzVHdvQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgIHZhciB2YWwgPSBjbGllbnQuZGJsKDI1KTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQyIikuaW5uZXJIVE1MID0gdmFsOworICAgICAgICB9CisgICAgPC9zY3JpcHQ+CisgICAgPGgyPlNlcnZlciBSZXNwb25zZTogPGRpdiBpZD0ib3V0cHV0Ij48L2Rpdj48L2gyPgorICAgIDxoMj5TZXJ2ZXIgRGJsOiA8ZGl2IGlkPSJvdXRwdXQyIj48L2Rpdj48L2gyPgorPC9ib2R5PiAKKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3YzRlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uanMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwordmFyIEhlbGxvU3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0hlbGxvU3ZjLmpzJyk7Cit2YXIgVGltZXNUd29TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGltZXNUd28uanMnKTsKKwordmFyIGhlbGxvSGFuZGxlciA9IHsKKwloZWxsb19mdW5jOiBmdW5jdGlvbihyZXN1bHQpIHsKKwkJdGhpcy5jYWxsX2NvdW50ZXIgPSB0aGlzLmNhbGxfY291bnRlciB8fCAwOworCQljb25zb2xlLmxvZygiQ2xpZW50IGNhbGw6ICIgKyAoKyt0aGlzLmNhbGxfY291bnRlcikpOworCQlyZXN1bHQobnVsbCwgIkhlbGxvIEFwYWNoZSBUaHJpZnQgZm9yIEphdmFTY3JpcHQgIiArIHRoaXMuY2FsbF9jb3VudGVyKTsKKwl9Cit9CisKK3ZhciB0aW1lc1R3b0hhbmRsZXIgPSB7CisJZGJsOiBmdW5jdGlvbih2YWwsIHJlc3VsdCkgeworCQljb25zb2xlLmxvZygiQ2xpZW50IGNhbGw6ICIgKyB2YWwpOworCQlyZXN1bHQobnVsbCwgdmFsICogMik7CisJfQorfQorCit2YXIgaGVsbG9TZXJ2aWNlID0geworCXRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKwlwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisJcHJvY2Vzc29yOiBIZWxsb1N2YywKKwloYW5kbGVyOiBoZWxsb0hhbmRsZXIKK307CisKK3ZhciBkYmxTZXJ2aWNlID0geworCXRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKwlwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisJcHJvY2Vzc29yOiBUaW1lc1R3b1N2YywKKwloYW5kbGVyOiB0aW1lc1R3b0hhbmRsZXIKK307CisKK3ZhciBTZXJ2ZXJPcHRpb25zID0geworCWZpbGVzOiAiLiIsCisJc2VydmljZXM6IHsKKwkJIi9oZWxsbyI6IGhlbGxvU2VydmljZSwKKwkJIi9kYmwiOiBkYmxTZXJ2aWNlLAorCX0KK30KKwordmFyIHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoU2VydmVyT3B0aW9ucyk7Cit2YXIgcG9ydCA9IDg1ODU7CitzZXJ2ZXIubGlzdGVuKHBvcnQpOworY29uc29sZS5sb2coIkh0dHAvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQ6ICIgKyBwb3J0KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8udGhyaWZ0IGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhZjVhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8udGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3NlcnZpY2UgSGVsbG9TdmMgeworICAgIHN0cmluZyBoZWxsb19mdW5jKCksCit9CisKK3NlcnZpY2UgVGltZXNUd28geworICAgIGk2NCBkYmwoMTogaTY0IHZhbCksCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9odHRwQ2xpZW50LmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwQ2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2MwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMKQEAgLTAsMCArMSwyMyBAQAordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwordmFyIGhlbGxvU3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0hlbGxvU3ZjLmpzJyk7CisKK3ZhciBvcHRpb25zID0geworICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorICAgcGF0aDogIi9oZWxsbyIsCisgICBoZWFkZXJzOiB7IkNvbm5lY3Rpb24iOiAiY2xvc2UifSwKKyAgIGh0dHBzOiBmYWxzZQorfTsKKwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIG9wdGlvbnMpOwordmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVIdHRwQ2xpZW50KGhlbGxvU3ZjLCBjb25uZWN0aW9uKTsKKworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKKyAgIGNvbnNvbGUubG9nKCJFcnJvcjogIiArIGVycik7Cit9KTsKKworY2xpZW50LmhlbGxvX2Z1bmMoZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkgeworICAgY29uc29sZS5sb2coIk1zZyBmcm9tIHNlcnZlcjogIiArIHJlc3VsdCk7Cit9KTsKKworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZTEzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcwpAQCAtMCwwICsxLDMxIEBACit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7ICAgICAgICAgICAgICAgICAJCit2YXIgaGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMnKTsKKworLy9TZXJ2aWNlSGFuZGxlcjogSW1wbGVtZW50IHRoZSBoZWxsbyBzZXJ2aWNlIAordmFyIGhlbGxvSGFuZGxlciA9IHsKKyAgaGVsbG9fZnVuYzogZnVuY3Rpb24gKHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJSZWNlaXZlZCBIZWxsbyBjYWxsIik7CisgICAgcmVzdWx0KG51bGwsICJIZWxsbyBmcm9tIE5vZGUuanMiKTsKKyAgfQorfTsKKworLy9TZXJ2aWNlT3B0aW9uczogVGhlIEkvTyBzdGFjayBmb3IgdGhlIHNlcnZpY2UKK3ZhciBoZWxsb1N2Y09wdCA9IHsgICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgaGFuZGxlcjogaGVsbG9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAJCisgICAgcHJvY2Vzc29yOiBoZWxsb1N2YywgICAgICAgICAgICAgICAgICAgICAgICAgCQorICAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwgICAgICAgICAgICAgICAgIAorICAgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCAJCQorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8vU2VydmVyT3B0aW9uczogRGVmaW5lIHNlcnZlciBmZWF0dXJlcwordmFyIHNlcnZlck9wdCA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkKKyAgIHNlcnZpY2VzOiB7ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIi9oZWxsbyI6IGhlbGxvU3ZjT3B0ICAgICAgICAgICAgICAgICAKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLy9DcmVhdGUgYW5kIHN0YXJ0IHRoZSB3ZWIgc2VydmVyIAordmFyIHBvcnQgPSA5MDkwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQordGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihzZXJ2ZXJPcHQpLmxpc3Rlbihwb3J0KTsgICAgICAgICAgICAgICAgICAgICAgICAJCQorY29uc29sZS5sb2coIkh0dHAvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQ6ICIgKyBwb3J0KTsKKwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5IGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTJmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIGhlbGxvIGltcG9ydCBIZWxsb1N2YworZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKKworY2xhc3MgSGVsbG9TdmNIYW5kbGVyOgorICBkZWYgaGVsbG9fZnVuYyhzZWxmKToKKyAgICBwcmludCgiSGVsbG8gQ2FsbGVkIikKKyAgICByZXR1cm4gImhlbGxvIGZyb20gUHl0aG9uIgorCitwcm9jZXNzb3IgPSBIZWxsb1N2Yy5Qcm9jZXNzb3IoSGVsbG9TdmNIYW5kbGVyKCkpCitwcm90b0ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkKK3BvcnQgPSA5MDkwCitzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgibG9jYWxob3N0IiwgcG9ydCksIHByb3RvRmFjdG9yeSkKK3ByaW50ICJQeXRob24gc2VydmVyIHJ1bm5pbmcgb24gcG9ydCAiICsgc3RyKHBvcnQpCitzZXJ2ZXIuc2VydmUoKQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvcGFyc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4YTFhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvcGFyc2UuanMKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisKKyAgVGhpcyBpcyBhIHN0YW5kYWxvbmUgZGVzZXJpYWxpemUvcGFyc2UgZXhhbXBsZSBpZiB5b3UganVzdCB3YW50IHRvIGRlc2VyaWFsaXplCisgIHRocmlmdCBkZWNvdXBsZWQgZnJvbSBjYXNzYW5kcmEgc2VydmVyCisKKyAgMS4gIGFjcXVpcmUgdGhyaWZ0IHRlbXBsYXRlIHNwZWNpZmljYXRpb24gZmlsZXMgZnJvbSB3aG8gZXZlciBidWlsdCBpdCAoZWc6IEVYQU1QTEUudGhyaWZ0KQorCisgIDIuICBJbnN0YWxsIHRocmlmdCBvbiBsb2NhbCBtYWNoaW5lCisKKyAgMy4gIGdlbmVyYXRlIHRocmlmdCBjbGllbnRzIGZvciBub2RlanMgdXNpbmcgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBmaWxlcyAoIzEpCisgICAgICB0aHJpZnQgLS1nZW4ganM6bm9kZSBzY2hlbWEvRVhBTVBMRS50aHJpZnQKKworICAgICAgVGhpcyBjcmVhdGVzIGNyZWF0ZXMgZ2VuLW5vZGUuanMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBuZXcgZmlsZSwgR0VORVJBVEVELmpzCisKKyAgNC4gIEluc2lkZSBHRU5FUkFURUQuanMgaXMgYSBjbGFzcyB5b3Ugd2lsbCB3YW50IHRvIGluc3RhbmNpYXRlLiAgRmluZCB0aGlzIGNsYXNzIG5hbWUgYW5kIHBsdWcgCisgICAgICBpdCBpbnRvIHRoZSBleGFtcGxlIGNvZGUgYmVsb3cgIChpZSwgIllPVVJfQ0xBU1NfTkFNRSIpCisgKi8KKworZnVuY3Rpb24gcGFyc2VUaHJpZnQodGhyaWZ0RW5jb2RlZERhdGEsIGNhbGxiYWNrKSB7CisgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKKyAgdmFyIHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydCh0aHJpZnRFbmNvZGVkRGF0YSk7CisgIHZhciBwcm90b2NvbCAgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworCisgIHZhciBjbGllbnRDbGFzcyA9IHJlcXVpcmUoJy4uL2dlbi1ub2RlanMvR0VORVJBVEVEJykuWU9VUl9DTEFTU19OQU1FOworICB2YXIgY2xpZW50ID0gbmV3IGNsaWVudENsYXNzKCk7CisgIGNsaWVudC5yZWFkKHByb3RvY29sKTsKKyAgY2FsbGJhY2sobnVsbCwgY2xpZW50KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMKaW5kZXggM2I4YzA0Ni4uMWM0ODJmZSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMKQEAgLTI0LDE1ICsyNCwxNSBAQAogdmFyIHVzZXJzID0ge307CiAKIHZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFVzZXJTdG9yYWdlLCB7Ci0gIHN0b3JlOiBmdW5jdGlvbih1c2VyLCBzdWNjZXNzKSB7CisgIHN0b3JlOiBmdW5jdGlvbih1c2VyLCByZXN1bHQpIHsKICAgICBjb25zb2xlLmxvZygic2VydmVyIHN0b3JlZDoiLCB1c2VyLnVpZCk7CiAgICAgdXNlcnNbdXNlci51aWRdID0gdXNlcjsKLSAgICBzdWNjZXNzKCk7CisgICAgcmVzdWx0KG51bGwpOwogICB9LAogCi0gIHJldHJpZXZlOiBmdW5jdGlvbih1aWQsIHN1Y2Nlc3MpIHsKKyAgcmV0cmlldmU6IGZ1bmN0aW9uKHVpZCwgcmVzdWx0KSB7CiAgICAgY29uc29sZS5sb2coInNlcnZlciByZXRyaWV2ZWQ6IiwgdWlkKTsKLSAgICBzdWNjZXNzKHVzZXJzW3VpZF0pOworICAgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKICAgfSwKIH0pOwogCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9odHRwLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfaHR0cC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjJkYzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfaHR0cC5qcwpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgY29ubmVjdCA9IHJlcXVpcmUoJ2Nvbm5lY3QnKTsKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKKwordmFyIFVzZXJTdG9yYWdlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1VzZXJTdG9yYWdlJyksCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3VzZXJfdHlwZXMnKTsKKwordmFyIHVzZXJzID0ge307CisKK3ZhciBzdG9yZSA9IGZ1bmN0aW9uKHVzZXIsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygic3RvcmVkOiIsIHVzZXIudWlkKTsKKyAgdXNlcnNbdXNlci51aWRdID0gdXNlcjsKKyAgcmVzdWx0KG51bGwpOworfTsKK3ZhciByZXRyaWV2ZSA9IGZ1bmN0aW9uKHVpZCwgcmVzdWx0KSB7CisgIGNvbnNvbGUubG9nKCJyZXRyaWV2ZWQ6IiwgdWlkKTsKKyAgcmVzdWx0KG51bGwsIHVzZXJzW3VpZF0pOworfTsKKwordmFyIHNlcnZlcl9odHRwID0gdGhyaWZ0LmNyZWF0ZUh0dHBTZXJ2ZXIoVXNlclN0b3JhZ2UsIHsKKyAgc3RvcmU6IHN0b3JlLAorICByZXRyaWV2ZTogcmV0cmlldmUKK30pOworc2VydmVyX2h0dHAubGlzdGVuKDkwOTApOworCit2YXIgc2VydmVyX2Nvbm5lY3QgPSBjb25uZWN0KHRocmlmdC5odHRwTWlkZGxld2FyZShVc2VyU3RvcmFnZSwgeworIHN0b3JlOiBzdG9yZSwKKyByZXRyaWV2ZTogcmV0cmlldmUKK30pKTsKK3NlcnZlcl9odHRwLmxpc3Rlbig5MDkxKTsKKwordmFyIHNlcnZlcl9jb25uZWN0X2pzb24gPSBjb25uZWN0KHRocmlmdC5odHRwTWlkZGxld2FyZShVc2VyU3RvcmFnZSwgeworIHN0b3JlOiBzdG9yZSwKKyByZXRyaWV2ZTogcmV0cmlldmUKK30sIHtwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2x9KSk7CitzZXJ2ZXJfY29ubmVjdF9qc29uLmxpc3Rlbig5MDkyKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfbXVsdGl0cmFuc3BvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0OGU2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKKyAgICB0dHJhbnNwb3J0ID0gcmVxdWlyZSgndGhyaWZ0L3RyYW5zcG9ydCcpOworCit2YXIgVXNlclN0b3JhZ2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVXNlclN0b3JhZ2UnKSwKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdXNlcl90eXBlcycpOworCit2YXIgdXNlcnMgPSB7fTsKKwordmFyIHN0b3JlID0gZnVuY3Rpb24odXNlciwgcmVzdWx0KSB7CisgIGNvbnNvbGUubG9nKCJzdG9yZWQ6IiwgdXNlci51aWQpOworICB1c2Vyc1t1c2VyLnVpZF0gPSB1c2VyOworICByZXN1bHQobnVsbCk7Cit9OwordmFyIHJldHJpZXZlID0gZnVuY3Rpb24odWlkLCByZXN1bHQpIHsKKyAgY29uc29sZS5sb2coInJldHJpZXZlZDoiLCB1aWQpOworICByZXN1bHQobnVsbCwgdXNlcnNbdWlkXSk7Cit9OworCit2YXIgc2VydmVyX2ZyYW1lZCA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVXNlclN0b3JhZ2UsIHsKKyAgc3RvcmU6IHN0b3JlLAorICByZXRyaWV2ZTogcmV0cmlldmUKK30pOworc2VydmVyX2ZyYW1lZC5saXN0ZW4oOTA5MCk7Cit2YXIgc2VydmVyX2J1ZmZlcmVkID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihVc2VyU3RvcmFnZSwgeworIHN0b3JlOiBzdG9yZSwKKyByZXRyaWV2ZTogcmV0cmlldmUKK30sIHt0cmFuc3BvcnQ6IHR0cmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0fSk7CitzZXJ2ZXJfYnVmZmVyZWQubGlzdGVuKDkwOTEpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy91c2VyLnRocmlmdCBiL2xpYi9ub2RlanMvZXhhbXBsZXMvdXNlci50aHJpZnQKaW5kZXggZWUyNjBlNS4uZDA4N2ZkNCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy91c2VyLnRocmlmdAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0CkBAIC0xNCw3ICsxNCw3IEBACiAjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gCisKIHN0cnVjdCBVc2VyUHJvZmlsZSB7CiAgIDE6IGkzMiB1aWQsCiAgIDI6IHN0cmluZyBuYW1lLApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxM2ZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnkuanMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIFBPV184ID0gTWF0aC5wb3coMiwgOCk7Cit2YXIgUE9XXzE2ID0gTWF0aC5wb3coMiwgMTYpOwordmFyIFBPV18yNCA9IE1hdGgucG93KDIsIDI0KTsKK3ZhciBQT1dfMzIgPSBNYXRoLnBvdygyLCAzMik7Cit2YXIgUE9XXzQwID0gTWF0aC5wb3coMiwgNDApOwordmFyIFBPV180OCA9IE1hdGgucG93KDIsIDQ4KTsKK3ZhciBQT1dfNTIgPSBNYXRoLnBvdygyLCA1Mik7Cit2YXIgUE9XXzEwMjIgPSBNYXRoLnBvdygyLCAxMDIyKTsKKworZXhwb3J0cy5yZWFkQnl0ZSA9IGZ1bmN0aW9uKGIpeworCXJldHVybiBiID4gMTI3ID8gYi0yNTYgOiBiOworfTsKKworZXhwb3J0cy5yZWFkSTE2ID0gZnVuY3Rpb24oYnVmZiwgb2ZmKSB7CisgIG9mZiA9IG9mZiB8fCAwOworICB2YXIgdiA9IGJ1ZmZbb2ZmICsgMV07CisgIHYgKz0gYnVmZltvZmZdIDw8IDg7CisgIGlmIChidWZmW29mZl0gJiAxMjgpIHsKKyAgICB2IC09IFBPV18xNjsKKyAgfQorICByZXR1cm4gdjsKK307CisKK2V4cG9ydHMucmVhZEkzMiA9IGZ1bmN0aW9uKGJ1ZmYsIG9mZikgeworICBvZmYgPSBvZmYgfHwgMDsKKyAgdmFyIHYgPSBidWZmW29mZiArIDNdOworICB2ICs9IGJ1ZmZbb2ZmICsgMl0gPDwgODsKKyAgdiArPSBidWZmW29mZiArIDFdIDw8IDE2OworICB2ICs9IGJ1ZmZbb2ZmXSAqIFBPV18yNDsKKyAgaWYgKGJ1ZmZbb2ZmXSAmIDB4ODApIHsKKyAgICB2IC09IFBPV18zMjsKKyAgfQorICByZXR1cm4gdjsKK307CisKK2V4cG9ydHMud3JpdGVJMTYgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIGJ1ZmZbMV0gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlswXSA9IHYgJiAweGZmOworICByZXR1cm4gYnVmZjsKK307CisKK2V4cG9ydHMud3JpdGVJMzIgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIGJ1ZmZbM10gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlsyXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzFdID0gdiAmIDB4ZmY7CisgIHYgPj49IDg7CisgIGJ1ZmZbMF0gPSB2ICYgMHhmZjsKKyAgcmV0dXJuIGJ1ZmY7Cit9OworCitleHBvcnRzLnJlYWREb3VibGUgPSBmdW5jdGlvbihidWZmLCBvZmYpIHsKKyAgb2ZmID0gb2ZmIHx8IDA7CisgIHZhciBzaWduZWQgPSBidWZmW29mZl0gJiAweDgwOworICB2YXIgZSA9IChidWZmW29mZisxXSAmIDB4RjApID4+IDQ7CisgIGUgKz0gKGJ1ZmZbb2ZmXSAmIDB4N0YpIDw8IDQ7CisKKyAgdmFyIG0gPSBidWZmW29mZis3XTsKKyAgbSArPSBidWZmW29mZis2XSA8PCA4OworICBtICs9IGJ1ZmZbb2ZmKzVdIDw8IDE2OworICBtICs9IGJ1ZmZbb2ZmKzRdICogUE9XXzI0OworICBtICs9IGJ1ZmZbb2ZmKzNdICogUE9XXzMyOworICBtICs9IGJ1ZmZbb2ZmKzJdICogUE9XXzQwOworICBtICs9IChidWZmW29mZisxXSAmIDB4MEYpICogUE9XXzQ4OworCisgIHN3aXRjaCAoZSkgeworICAgIGNhc2UgMDoKKyAgICAgIGUgPSAtMTAyMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA0NzoKKyAgICAgIHJldHVybiBtID8gTmFOIDogKHNpZ25lZCA/IC1JbmZpbml0eSA6IEluZmluaXR5KTsKKyAgICBkZWZhdWx0OgorICAgICAgbSArPSBQT1dfNTI7CisgICAgICBlIC09IDEwMjM7CisgIH0KKworICBpZiAoc2lnbmVkKSB7CisgICAgbSAqPSAtMTsKKyAgfQorCisgIHJldHVybiBtICogTWF0aC5wb3coMiwgZSAtIDUyKTsKK307CisKKy8qCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gdGhlIGpzcGFjayBtb2R1bGU6CisgKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNwYWNrLworICovCitleHBvcnRzLndyaXRlRG91YmxlID0gZnVuY3Rpb24oYnVmZiwgdikgeworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzBdID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZlsxXSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZlswXSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZls3XSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzZdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZls0XSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzNdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZlsxXSB8PSBtICYgMHgwZjsKKworICByZXR1cm4gYnVmZjsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3BhcnNlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcGFyc2VyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWVkYTQ2Li4wMDAwMDAwCi0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcGFyc2VyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXZhciBzeXMgPSByZXF1aXJlKCdzeXMnKTsKLXZhciBjaHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwotCi12YXIgcCA9IGV4cG9ydHMuQmluYXJ5UGFyc2VyID0gZnVuY3Rpb24oIGJpZ0VuZGlhbiwgYWxsb3dFeGNlcHRpb25zICl7Ci0gIHRoaXMuYmlnRW5kaWFuID0gYmlnRW5kaWFuIHx8IHRydWU7Ci0gIHRoaXMuYWxsb3dFeGNlcHRpb25zID0gYWxsb3dFeGNlcHRpb25zOwotfTsKLXAuYmlnRW5kaWFuID0gdHJ1ZTsKLQotdmFyIElCdWZmZXIgPSBleHBvcnRzLkJpbmFyeVBhcnNlci5JQnVmZmVyID0gZnVuY3Rpb24oIGJpZ0VuZGlhbiwgYnVmZmVyICl7Ci0gIHRoaXMuYmlnRW5kaWFuID0gYmlnRW5kaWFuIHx8IDE7Ci0gIHRoaXMuYnVmZmVyID0gW107Ci0gIHRoaXMuc2V0QnVmZmVyKCBidWZmZXIgKTsKLX07Ci0KLUlCdWZmZXIucHJvdG90eXBlLnNldEJ1ZmZlciA9IGZ1bmN0aW9uKCBkYXRhICl7Ci0gIGlmKCBkYXRhICl7Ci0gICAgZm9yKCB2YXIgbCwgaSA9IGwgPSBkYXRhLmxlbmd0aCwgYiA9IHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KCBsICk7IGk7IGJbbCAtIGldID0gZGF0YVstLWldICk7Ci0gICAgdGhpcy5iaWdFbmRpYW4gJiYgYi5yZXZlcnNlKCk7Ci0gIH0KLX07Ci0KLUlCdWZmZXIucHJvdG90eXBlLmhhc05lZWRlZEJpdHMgPSBmdW5jdGlvbiggbmVlZGVkQml0cyApewotICByZXR1cm4gdGhpcy5idWZmZXIubGVuZ3RoID49IC0oIC1uZWVkZWRCaXRzID4+IDMgKTsKLX07Ci0KLUlCdWZmZXIucHJvdG90eXBlLmNoZWNrQnVmZmVyID0gZnVuY3Rpb24oIG5lZWRlZEJpdHMgKXsKLSAgaWYoICF0aGlzLmhhc05lZWRlZEJpdHMoIG5lZWRlZEJpdHMgKSApIHsKLSAgICBjb25zb2xlLmxvZygibWlzc2luZzogIiArIG5lZWRlZEJpdHMgKyAiICIgKyB0aGlzLmJ1ZmZlci5sZW5ndGgpOwotICAgIHRocm93IG5ldyBFcnJvciggImNoZWNrQnVmZmVyOjptaXNzaW5nIGJ5dGVzIiApOwotICB9Ci19OwotCi1JQnVmZmVyLnByb3RvdHlwZS5yZWFkQml0cyA9IGZ1bmN0aW9uKCBzdGFydCwgbGVuZ3RoICl7Ci0gIC8vc2hsIGZpeDogSGVucmkgVG9yZ2VtYW5lIH4xOTk2IChjb21wcmVzc2VkIGJ5IEpvbmFzIFJhb25pKQotICBmdW5jdGlvbiBzaGwoIGEsIGIgKXsKLSAgICBmb3IoIDsgYi0tOyBhID0gKCAoIGEgJT0gMHg3ZmZmZmZmZiArIDEgKSAmIDB4NDAwMDAwMDAgKSA9PSAweDQwMDAwMDAwID8gYSAqIDIgOiAoIGEgLSAweDQwMDAwMDAwICkgKiAyICsgMHg3ZmZmZmZmZiArIDEgKTsKLSAgICByZXR1cm4gYTsKLSAgfQotICBpZiggc3RhcnQgPCAwIHx8IGxlbmd0aCA8PSAwICkKLSAgICByZXR1cm4gMDsKLSAgdGhpcy5jaGVja0J1ZmZlciggc3RhcnQgKyBsZW5ndGggKTsKLSAgZm9yKCB2YXIgb2Zmc2V0TGVmdCwgb2Zmc2V0UmlnaHQgPSBzdGFydCAlIDgsIGN1ckJ5dGUgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSAoIHN0YXJ0ID4+IDMgKSAtIDEsIGxhc3RCeXRlID0gdGhpcy5idWZmZXIubGVuZ3RoICsgKCAtKCBzdGFydCArIGxlbmd0aCApID4+IDMgKSwgZGlmZiA9IGN1ckJ5dGUgLSBsYXN0Qnl0ZSwgc3VtID0gKCAoIHRoaXMuYnVmZmVyWyBjdXJCeXRlIF0gPj4gb2Zmc2V0UmlnaHQgKSAmICggKCAxIDw8ICggZGlmZiA/IDggLSBvZmZzZXRSaWdodCA6IGxlbmd0aCApICkgLSAxICkgKSArICggZGlmZiAmJiAoIG9mZnNldExlZnQgPSAoIHN0YXJ0ICsgbGVuZ3RoICkgJSA4ICkgPyAoIHRoaXMuYnVmZmVyWyBsYXN0Qnl0ZSsrIF0gJiAoICggMSA8PCBvZmZzZXRMZWZ0ICkgLSAxICkgKSA8PCAoIGRpZmYtLSA8PCAzICkgLSBvZmZzZXRSaWdodCA6IDAgKTsgZGlmZjsgc3VtICs9IHNobCggdGhpcy5idWZmZXJbIGxhc3RCeXRlKysgXSwgKCBkaWZmLS0gPDwgMyApIC0gb2Zmc2V0UmlnaHQgKSApOwotICByZXR1cm4gc3VtOwotfTsKLSAgCi1wLndhcm4gPSBmdW5jdGlvbiggbXNnICl7Ci0gIGlmKCB0aGlzLmFsbG93RXhjZXB0aW9ucyApCi0gICAgdGhyb3cgbmV3IEVycm9yKCBtc2cgKTsKLSAgcmV0dXJuIDE7Ci19OwotcC5kZWNvZGVGbG9hdCA9IGZ1bmN0aW9uKCBkYXRhLCBwcmVjaXNpb25CaXRzLCBleHBvbmVudEJpdHMgKXsKLSAgdmFyIGIgPSBuZXcgdGhpcy5JQnVmZmVyKCB0aGlzLmJpZ0VuZGlhbiwgZGF0YSApOwotICBiLmNoZWNrQnVmZmVyKCBwcmVjaXNpb25CaXRzICsgZXhwb25lbnRCaXRzICsgMSApOwotICB2YXIgYmlhcyA9IE1hdGgucG93KCAyLCBleHBvbmVudEJpdHMgLSAxICkgLSAxLCBzaWduYWwgPSBiLnJlYWRCaXRzKCBwcmVjaXNpb25CaXRzICsgZXhwb25lbnRCaXRzLCAxICksIGV4cG9uZW50ID0gYi5yZWFkQml0cyggcHJlY2lzaW9uQml0cywgZXhwb25lbnRCaXRzICksIHNpZ25pZmljYW5kID0gMCwKLSAgZGl2aXNvciA9IDIsIGN1ckJ5dGUgPSBiLmJ1ZmZlci5sZW5ndGggKyAoIC1wcmVjaXNpb25CaXRzID4+IDMgKSAtIDE7Ci0gIGRvewotICAgIGZvciggdmFyIGJ5dGVWYWx1ZSA9IGIuYnVmZmVyWyArK2N1ckJ5dGUgXSwgc3RhcnRCaXQgPSBwcmVjaXNpb25CaXRzICUgOCB8fCA4LCBtYXNrID0gMSA8PCBzdGFydEJpdDsgbWFzayA+Pj0gMTsgKCBieXRlVmFsdWUgJiBtYXNrICkgJiYgKCBzaWduaWZpY2FuZCArPSAxIC8gZGl2aXNvciApLCBkaXZpc29yICo9IDIgKTsKLSAgfXdoaWxlKCBwcmVjaXNpb25CaXRzIC09IHN0YXJ0Qml0ICk7Ci0gIHJldHVybiBleHBvbmVudCA9PSAoIGJpYXMgPDwgMSApICsgMSA/IHNpZ25pZmljYW5kID8gTmFOIDogc2lnbmFsID8gLUluZmluaXR5IDogK0luZmluaXR5IDogKCAxICsgc2lnbmFsICogLTIgKSAqICggZXhwb25lbnQgfHwgc2lnbmlmaWNhbmQgPyAhZXhwb25lbnQgPyBNYXRoLnBvdyggMiwgLWJpYXMgKyAxICkgKiBzaWduaWZpY2FuZCA6IE1hdGgucG93KCAyLCBleHBvbmVudCAtIGJpYXMgKSAqICggMSArIHNpZ25pZmljYW5kICkgOiAwICk7Ci19OwotcC5kZWNvZGVJbnQgPSBmdW5jdGlvbiggZGF0YSwgYml0cywgc2lnbmVkLCBmb3JjZUJpZ0VuZGlhbiApewotICAvL2NvbnNvbGUubG9nKCJkZWNvZGVJbnQ6ICIsIGRhdGEsIGJpdHMsIHNpZ25lZCk7Ci0gIHZhciBiID0gbmV3IHRoaXMuSUJ1ZmZlciggdGhpcy5iaWdFbmRpYW58fGZvcmNlQmlnRW5kaWFuLCBkYXRhICksIHggPSBiLnJlYWRCaXRzKCAwLCBiaXRzICksIG1heCA9IE1hdGgucG93KCAyLCBiaXRzICk7Ci0gIHJldHVybiBzaWduZWQgJiYgeCA+PSBtYXggLyAyID8geCAtIG1heCA6IHg7Ci19OwotcC5lbmNvZGVGbG9hdCA9IGZ1bmN0aW9uKCBkYXRhLCBwcmVjaXNpb25CaXRzLCBleHBvbmVudEJpdHMgKXsKLSAgdmFyIGJpYXMgPSBNYXRoLnBvdyggMiwgZXhwb25lbnRCaXRzIC0gMSApIC0gMSwgbWluRXhwID0gLWJpYXMgKyAxLCBtYXhFeHAgPSBiaWFzLCBtaW5Vbm5vcm1FeHAgPSBtaW5FeHAgLSBwcmVjaXNpb25CaXRzLAotICBzdGF0dXMgPSBpc05hTiggbiA9IHBhcnNlRmxvYXQoIGRhdGEgKSApIHx8IG4gPT0gLUluZmluaXR5IHx8IG4gPT0gK0luZmluaXR5ID8gbiA6IDAsCi0gIGV4cCA9IDAsIGxlbiA9IDIgKiBiaWFzICsgMSArIHByZWNpc2lvbkJpdHMgKyAzLCBiaW4gPSBuZXcgQXJyYXkoIGxlbiApLAotICBzaWduYWwgPSAoIG4gPSBzdGF0dXMgIT09IDAgPyAwIDogbiApIDwgMCwgbiA9IE1hdGguYWJzKCBuICksIGludFBhcnQgPSBNYXRoLmZsb29yKCBuICksIGZsb2F0UGFydCA9IG4gLSBpbnRQYXJ0LAotICBpLCBsYXN0Qml0LCByb3VuZGVkLCBqLCByZXN1bHQ7Ci0gIGZvciggaSA9IGxlbjsgaTsgYmluWy0taV0gPSAwICk7Ci0gIGZvciggaSA9IGJpYXMgKyAyOyBpbnRQYXJ0ICYmIGk7IGJpblstLWldID0gaW50UGFydCAlIDIsIGludFBhcnQgPSBNYXRoLmZsb29yKCBpbnRQYXJ0IC8gMiApICk7Ci0gIGZvciggaSA9IGJpYXMgKyAxOyBmbG9hdFBhcnQgPiAwICYmIGk7ICggYmluWysraV0gPSAoICggZmxvYXRQYXJ0ICo9IDIgKSA+PSAxICkgLSAwICkgJiYgLS1mbG9hdFBhcnQgKTsKLSAgZm9yKCBpID0gLTE7ICsraSA8IGxlbiAmJiAhYmluW2ldOyApOwotICBpZiggYmluWyggbGFzdEJpdCA9IHByZWNpc2lvbkJpdHMgLSAxICsgKCBpID0gKCBleHAgPSBiaWFzICsgMSAtIGkgKSA+PSBtaW5FeHAgJiYgZXhwIDw9IG1heEV4cCA/IGkgKyAxIDogYmlhcyArIDEgLSAoIGV4cCA9IG1pbkV4cCAtIDEgKSApICkgKyAxXSApewotICAgIGlmKCAhKCByb3VuZGVkID0gYmluW2xhc3RCaXRdICkgKXsKLSAgICAgIGZvciggaiA9IGxhc3RCaXQgKyAyOyAhcm91bmRlZCAmJiBqIDwgbGVuOyByb3VuZGVkID0gYmluW2orK10gKTsKLSAgICB9Ci0gICAgZm9yKCBqID0gbGFzdEJpdCArIDE7IHJvdW5kZWQgJiYgLS1qID49IDA7ICggYmluW2pdID0gIWJpbltqXSAtIDAgKSAmJiAoIHJvdW5kZWQgPSAwICkgKTsKLSAgfQotICBmb3IoIGkgPSBpIC0gMiA8IDAgPyAtMSA6IGkgLSAzOyArK2kgPCBsZW4gJiYgIWJpbltpXTsgKTsKLSAgaWYoICggZXhwID0gYmlhcyArIDEgLSBpICkgPj0gbWluRXhwICYmIGV4cCA8PSBtYXhFeHAgKQotICAgICsraTsKLSAgZWxzZSBpZiggZXhwIDwgbWluRXhwICl7Ci0gICAgZXhwICE9IGJpYXMgKyAxIC0gbGVuICYmIGV4cCA8IG1pblVubm9ybUV4cCAmJiB0aGlzLndhcm4oICJlbmNvZGVGbG9hdDo6ZmxvYXQgdW5kZXJmbG93IiApOwotICAgIGkgPSBiaWFzICsgMSAtICggZXhwID0gbWluRXhwIC0gMSApOwotICB9Ci0gIGlmKCBpbnRQYXJ0IHx8IHN0YXR1cyAhPT0gMCApewotICAgIHRoaXMud2FybiggaW50UGFydCA/ICJlbmNvZGVGbG9hdDo6ZmxvYXQgb3ZlcmZsb3ciIDogImVuY29kZUZsb2F0OjoiICsgc3RhdHVzICk7Ci0gICAgZXhwID0gbWF4RXhwICsgMTsKLSAgICBpID0gYmlhcyArIDI7Ci0gICAgaWYoIHN0YXR1cyA9PSAtSW5maW5pdHkgKQotICAgICAgc2lnbmFsID0gMTsKLSAgICBlbHNlIGlmKCBpc05hTiggc3RhdHVzICkgKQotICAgICAgYmluW2ldID0gMTsKLSAgfQotICBmb3IoIG4gPSBNYXRoLmFicyggZXhwICsgYmlhcyApLCBqID0gZXhwb25lbnRCaXRzICsgMSwgcmVzdWx0ID0gIiI7IC0tajsgcmVzdWx0ID0gKCBuICUgMiApICsgcmVzdWx0LCBuID0gbiA+Pj0gMSApOwotICBmb3IoIG4gPSAwLCBqID0gMCwgaSA9ICggcmVzdWx0ID0gKCBzaWduYWwgPyAiMSIgOiAiMCIgKSArIHJlc3VsdCArIGJpbi5zbGljZSggaSwgaSArIHByZWNpc2lvbkJpdHMgKS5qb2luKCAiIiApICkubGVuZ3RoLCByID0gW107IGk7IGogPSAoIGogKyAxICkgJSA4ICl7Ci0gICAgbiArPSAoIDEgPDwgaiApICogcmVzdWx0LmNoYXJBdCggLS1pICk7Ci0gICAgaWYoIGogPT0gNyApewotICAgICAgcltyLmxlbmd0aF0gPSBuOwotICAgICAgbiA9IDA7Ci0gICAgfQotICB9Ci0gIGlmIChuKSB7Ci0gICAgcltyLmxlbmd0aF0gPSBuOwotICB9Ci0gIHJldHVybiBuZXcgQnVmZmVyKCB0aGlzLmJpZ0VuZGlhbiA/IHIucmV2ZXJzZSgpIDogciApOwotfTsKLXAuZW5jb2RlSW50ID0gZnVuY3Rpb24oIGRhdGEsIGJpdHMsIHNpZ25lZCwgZm9yY2VCaWdFbmRpYW4gKXsKLSAgdmFyIG1heCA9IE1hdGgucG93KCAyLCBiaXRzICk7Ci0gICggZGF0YSA+PSBtYXggfHwgZGF0YSA8IC0oIG1heCAvIDIgKSApICYmIHRoaXMud2FybiggImVuY29kZUludDo6b3ZlcmZsb3ciICkgJiYgKCBkYXRhID0gMCApOwotICBkYXRhIDwgMCAmJiAoIGRhdGEgKz0gbWF4ICk7Ci0gIGZvciggdmFyIHIgPSBbXTsgZGF0YTsgcltyLmxlbmd0aF0gPSBkYXRhICUgMjU2LCBkYXRhID0gTWF0aC5mbG9vciggZGF0YSAvIDI1NiApICk7Ci0gIGZvciggYml0cyA9IC0oIC1iaXRzID4+IDMgKSAtIHIubGVuZ3RoOyBiaXRzLS07IHJbci5sZW5ndGhdID0gMCApOwotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcigodGhpcy5iaWdFbmRpYW58fGZvcmNlQmlnRW5kaWFuKSA/IHIucmV2ZXJzZSgpIDogciApOwotfTsKLXAudG9TbWFsbCAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgIDgsIHRydWUgICk7IH07Ci1wLmZyb21TbWFsbCAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsICA4LCB0cnVlICApOyB9OwotcC50b0J5dGUgICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCAgOCwgZmFsc2UgKTsgfTsKLXAuZnJvbUJ5dGUgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgIDgsIGZhbHNlICk7IH07Ci1wLnRvU2hvcnQgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsIDE2LCB0cnVlICApOyB9OwotcC5mcm9tU2hvcnQgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCAxNiwgdHJ1ZSAgKTsgfTsKLXAudG9Xb3JkICAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgMTYsIGZhbHNlICk7IH07Ci1wLmZyb21Xb3JkICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsIDE2LCBmYWxzZSApOyB9OwotcC50b0ludCAgICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCAzMiwgdHJ1ZSAgKTsgfTsKLXAuZnJvbUludCAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgMzIsIHRydWUgICk7IH07Ci1wLnRvTG9uZyAgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsIDY0LCB0cnVlICApOyB9OwotcC5mcm9tTG9uZyAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCA2NCwgdHJ1ZSAgKTsgfTsKLXAudG9EV29yZCAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgMzIsIGZhbHNlICk7IH07Ci1wLmZyb21EV29yZCAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsIDMyLCBmYWxzZSApOyB9OwotcC50b1FXb3JkICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCA2NCwgdHJ1ZSApOyB9OwotcC5mcm9tUVdvcmQgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCA2NCwgdHJ1ZSApOyB9OwotcC50b0Zsb2F0ICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlRmxvYXQoIGRhdGEsIDIzLCA4ICAgKTsgfTsKLXAuZnJvbUZsb2F0ICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUZsb2F0KCBkYXRhLCAyMywgOCAgICk7IH07Ci1wLnRvRG91YmxlICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVGbG9hdCggZGF0YSwgNTIsIDExICApOyB9OwotcC5mcm9tRG91YmxlID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlRmxvYXQoIGRhdGEsIDUyLCAxMSAgKTsgfTsKLQotLy8gRmFjdG9yIG91dCB0aGUgZW5jb2RlIHNvIGl0IGNhbiBiZSBzaGFyZWQgYnkgYWRkX2hlYWRlciBhbmQgcHVzaF9pbnQzMgotcC5lbmNvZGVfaW50MzIgPSBmdW5jdGlvbihudW1iZXIpIHsKLSAgdmFyIGEsIGIsIGMsIGQsIHVuc2lnbmVkOwotICB1bnNpZ25lZCA9IChudW1iZXIgPCAwKSA/IChudW1iZXIgKyAweDEwMDAwMDAwMCkgOiBudW1iZXI7Ci0gIGEgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmZmZjsKLSAgYiA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmY7Ci0gIGMgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmY7Ci0gIGQgPSBNYXRoLmZsb29yKHVuc2lnbmVkKTsKLSAgcmV0dXJuIGNocihhKSArIGNocihiKSArIGNocihjKSArIGNocihkKTsKLX07Ci0KLXAuZW5jb2RlX2ludDY0ID0gZnVuY3Rpb24obnVtYmVyKSB7Ci0gIHZhciBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCB1bnNpZ25lZDsKLSAgdW5zaWduZWQgPSAobnVtYmVyIDwgMCkgPyAobnVtYmVyICsgMHgxMDAwMDAwMDAwMDAwMDAwMCkgOiBudW1iZXI7Ci0gIGEgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmZmZmZmZmZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZmZmZmZmZmZmZmY7Ci0gIGIgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmZmZmZmZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmZmZmZmZmZmZjsKLSAgYyA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmZmZmZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmZmZmZmZmY7Ci0gIGQgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmZmZmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmZmZmZmZmY7Ci0gIGUgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmZmZjsKLSAgZiA9IE1hdGguZmxvb3IodW5zaWduZWQgLyAweGZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmY7Ci0gIGcgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZik7Ci0gIHVuc2lnbmVkICY9IDB4ZmY7Ci0gIGggPSBNYXRoLmZsb29yKHVuc2lnbmVkKTsKLSAgcmV0dXJuIGNocihhKSArIGNocihiKSArIGNocihjKSArIGNocihkKSArIGNocihlKSArIGNocihmKSArIGNocihnKSArIGNocihoKTsKLX07Ci0KLS8qKgotICBVVEY4IG1ldGhvZHMKLSoqLwotCi0vLyBUYWtlIGEgcmF3IGJpbmFyeSBzdHJpbmcgYW5kIHJldHVybiBhIHV0Zjggc3RyaW5nCi1wLmRlY29kZV91dGY4ID0gZnVuY3Rpb24oYSkgewotICB2YXIgc3RyaW5nID0gIiI7Ci0gIHZhciBpID0gMDsKLSAgdmFyIGMgPSBjMSA9IGMyID0gMDsKLQotICB3aGlsZSAoIGkgPCBhLmxlbmd0aCApIHsKLSAgICBjID0gYS5jaGFyQ29kZUF0KGkpOwotICAgIGlmIChjIDwgMTI4KSB7Ci0gICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTsKLSAgICAgIGkrKzsKLSAgICB9IGVsc2UgaWYoKGMgPiAxOTEpICYmIChjIDwgMjI0KSkgewotICAgICAgYzIgPSBhLmNoYXJDb2RlQXQoaSsxKTsKLSAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7Ci0gICAgICBpICs9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGMyID0gYS5jaGFyQ29kZUF0KGkrMSk7Ci0gICAgICBjMyA9IGEuY2hhckNvZGVBdChpKzIpOwotICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpOwotICAgICAgaSArPSAzOwotICAgIH0KLSAgfQotICByZXR1cm4gc3RyaW5nOwotfTsKLQotLy8gRW5jb2RlIGEgY3N0cmluZyBjb3JyZWN0bHkKLXAuZW5jb2RlX2NzdHJpbmcgPSBmdW5jdGlvbihzKSB7IAotICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMpKSArIHAuZnJvbUJ5dGUoMCk7Ci19OwotCi0vLyBUYWtlIGEgdXRmOCBzdHJpbmcgYW5kIHJldHVybiBhIGJpbmFyeSBzdHJpbmcKLXAuZW5jb2RlX3V0ZjggPSBmdW5jdGlvbihzKSB7Ci0gIHZhciBhPSIiOwotICBmb3IgKHZhciBuPTA7IG48IHMubGVuZ3RoOyBuKyspIHsKLSAgICB2YXIgYz1zLmNoYXJDb2RlQXQobik7Ci0gICAgaWYgKGM8MTI4KSB7Ci0gICAgICBhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7Ci0gICAgfSBlbHNlIGlmICgoYz4xMjcpJiYoYzwyMDQ4KSkgewotICAgICAgYSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCAoYz4+NikgfCAxOTIpIDsKLSAgICAgIGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggKGMmNjMpIHwgMTI4KTsKLSAgICB9IGVsc2UgewotICAgICAgYSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCAoYz4+MTIpIHwgMjI0KTsKLSAgICAgIGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggKChjPj42KSAmIDYzKSB8IDEyOCk7Ci0gICAgICBhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIChjJjYzKSB8IDEyOCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBhOwotfTsKLQotcC5ocHJpbnQgPSBmdW5jdGlvbihzKSB7Ci0gIGZvciAodmFyIGk9MDsgaTxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKHMuY2hhckNvZGVBdChpKTwzMikgewotICAgICAgdmFyIG51bWJlciA9IHMuY2hhckNvZGVBdChpKSA8PSAxNSA/ICIwIiArIHMuY2hhckNvZGVBdChpKS50b1N0cmluZygxNikgOiBzLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpOwotICAgICAgc3lzLmRlYnVnKG51bWJlcisnIDogJyk7fQotICAgIGVsc2UgewotICAgICAgdmFyIG51bWJlciA9IHMuY2hhckNvZGVBdChpKSA8PSAxNSA/ICIwIiArIHMuY2hhckNvZGVBdChpKS50b1N0cmluZygxNikgOiBzLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpOyAgICAgIAotICAgICAgc3lzLmRlYnVnKG51bWJlcisnIDogJysgcy5jaGFyQXQoaSkpO30KLSAgfQotfTsKLQotcC50b19ieXRlX2FycmF5ID0gZnVuY3Rpb24ocykgewotICB2YXIgYXJyYXkgPSBbXTsKLSAgCi0gIGZvciAodmFyIGk9MDsgaTxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKHMuY2hhckNvZGVBdChpKTwzMikge2FycmF5LnB1c2gocy5jaGFyQ29kZUF0KGkpKTt9Ci0gICAgZWxzZSB7YXJyYXkucHVzaChzLmNoYXJDb2RlQXQoaSkpfSAgICAKLSAgfSAgCi0gIAotICBzeXMucHV0cyhhcnJheSk7Ci19Ci0KLXAucHByaW50ID0gZnVuY3Rpb24ocykgewotICBmb3IgKHZhciBpPTA7IGk8cy5sZW5ndGg7IGkrKykgewotICAgIGlmIChzLmNoYXJDb2RlQXQoaSk8MzIpIHtzeXMucHV0cyhzLmNoYXJDb2RlQXQoaSkrJyA6ICcpO30KLSAgICBlbHNlIHtzeXMucHV0cyhzLmNoYXJDb2RlQXQoaSkrJyA6ICcrIHMuY2hhckF0KGkpKTt9Ci0gIH0KLX07CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdjOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOworCittb2R1bGUuZXhwb3J0cyA9IFRCaW5hcnlQcm90b2NvbDsKKworLy8gSmF2YVNjcmlwdCBzdXBwb3J0cyBvbmx5IG51bWVyaWMgZG91YmxlcywgdGhlcmVmb3JlIGV2ZW4gaGV4IHZhbHVlcyBhcmUgYWx3YXlzIHNpZ25lZC4KKy8vIFRoZSBsYXJnZXN0IGludGVnZXIgdmFsdWUgd2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFTY3JpcHQgaXMgKy8tMl41My4KKy8vIEJpdHdpc2Ugb3BlcmF0aW9ucyBjb252ZXJ0IG51bWJlcnMgdG8gMzIgYml0IGludGVnZXJzIGJ1dCBwZXJmb3JtIHNpZ24gZXh0ZW5zaW9uCisvLyB1cG9uIGFzc2lnbmluZyB2YWx1ZXMgYmFjayB0byB2YXJpYWJsZXMuCit2YXIgVkVSU0lPTl9NQVNLID0gLTY1NTM2LCAgIC8vIDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMiwgLy8gMHg4MDAxMDAwMAorICAgIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmY7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKKyAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKKyAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7CisgICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOworICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisgICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKKyAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOworICAgIH0KKyAgICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKKyAgICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOworICAgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICAgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX3NlcWlkICE9PSBudWxsKSB7CisgICAgICAgIHRoaXMuX3NlcWlkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2cud2FybmluZygnTm8gc2VxaWQgdG8gdW5zZXQnKTsKKyAgICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIGlkKSB7CisgIHRoaXMud3JpdGVCeXRlKHR5cGUpOworICB0aGlzLndyaXRlSTE2KGlkKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa3R5cGUsIHZ0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGt0eXBlKTsKKyAgdGhpcy53cml0ZUJ5dGUodnR5cGUpOworICB0aGlzLndyaXRlSTMyKHNpemUpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKKyAgdGhpcy53cml0ZUkzMihzaXplKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQnl0ZShldHlwZSk7CisgIHRoaXMud3JpdGVJMzIoc2l6ZSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgaWYgKGJvb2wpIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgxKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgwKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJ5dGUgPSBmdW5jdGlvbihiKSB7CisgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihbYl0pKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKKyAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVJMTYobmV3IEJ1ZmZlcigyKSwgaTE2KSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlSTMyKG5ldyBCdWZmZXIoNCksIGkzMikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgeworICBpZiAoaTY0LmJ1ZmZlcikgeworICAgIHRoaXMudHJhbnMud3JpdGUoaTY0LmJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgSW50NjQoaTY0KS5idWZmZXIpOworICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlRG91YmxlKG5ldyBCdWZmZXIoOCksIGR1YikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgeworICBpZiAodHlwZW9mKGFyZykgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZUkzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsIGVuY29kaW5nKSk7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmICgoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB8fAorICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgLy8gQnVmZmVycyBpbiBOb2RlLmpzIHVuZGVyIEJyb3dzZXJpZnkgbWF5IGV4dGVuZCBVSW50OEFycmF5IGluc3RlYWQgb2YKKyAgICAvLyBkZWZpbmluZyBhIG5ldyBvYmplY3QuIFdlIGRldGVjdCB0aGVtIGhlcmUgc28gd2UgY2FuIHdyaXRlIHRoZW0KKyAgICAvLyBjb3JyZWN0bHkKKyAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOworICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlU3RyaW5nJywgJ3V0ZjgnLCBhcmcpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHN6ID0gdGhpcy5yZWFkSTMyKCk7CisgIHZhciB0eXBlLCBuYW1lLCBzZXFpZDsKKworICBpZiAoc3ogPCAwKSB7CisgICAgdmFyIHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKKyAgICB9CisgICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOworICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXIiKTsKKyAgICB9CisgICAgbmFtZSA9IHRoaXMudHJhbnMucmVhZChzeik7CisgICAgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9CisgIHJldHVybiB7Zm5hbWU6IG5hbWUsIG10eXBlOiB0eXBlLCByc2VxaWQ6IHNlcWlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7Zm5hbWU6ICcnfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgaWYgKHR5cGUgPT0gVHlwZS5TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogMH07CisgIH0KKyAgdmFyIGlkID0gdGhpcy5yZWFkSTE2KCk7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiB0eXBlLCBmaWQ6IGlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgZXR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciBzaXplID0gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB7ZXR5cGU6IGV0eXBlLCBzaXplOiBzaXplfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBldHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtldHlwZTogZXR5cGUsIHNpemU6IHNpemV9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworICBpZiAoYiA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkSTE2KCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEkzMigpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICByZXR1cm4gbmV3IEludDY0KGJ1ZmYpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWREb3VibGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKKyAgaWYgKGxlbiA9PT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2U4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitleHBvcnRzLlRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciB4aHJDb25uZWN0aW9uID0gcmVxdWlyZSgnLi94aHJfY29ubmVjdGlvbicpOworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5YSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDbGllbnQgPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNsaWVudDsKKworZXhwb3J0cy5NdWx0aXBsZXhlciA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKS5NdWx0aXBsZXhlcjsKKworZXhwb3J0cy5UV2ViU29ja2V0VHJhbnNwb3J0ID0gcmVxdWlyZSgnLi93c190cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworCitleHBvcnRzLlByb3RvY29sID0gZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK21vZHVsZS5leHBvcnRzID0gVEJ1ZmZlcmVkVHJhbnNwb3J0OworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSA9IDEwMjQ7CisgIHRoaXMud3JpdGVCdWZmZXJTaXplID0gNTEyOyAvLyBTb2Z0IExpbWl0CisgIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IDA7IC8vIGZvciBpbnB1dCBidWZmZXIKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5pbkJ1ZiA9IG5ldyBCdWZmZXIodGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpOworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfQorCitUQnVmZmVyZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKKyAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKworICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgeworICAgIGlmIChyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCA+IHJlYWRlci5pbkJ1Zi5sZW5ndGgpIHsKKyAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoKTsKKyAgICAgIHJlYWRlci5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgMCwgcmVhZGVyLndyaXRlQ3Vyc29yKTsKKyAgICAgIHJlYWRlci5pbkJ1ZiA9IGJ1ZjsKKyAgICB9CisgICAgZGF0YS5jb3B5KHJlYWRlci5pbkJ1ZiwgcmVhZGVyLndyaXRlQ3Vyc29yLCAwKTsKKyAgICByZWFkZXIud3JpdGVDdXJzb3IgKz0gZGF0YS5sZW5ndGg7CisKKyAgICBjYWxsYmFjayhyZWFkZXIsIHNlcWlkKTsKKyAgfTsKK307CisKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb21taXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7CisgIHZhciB1bnJlYWRTaXplID0gdGhpcy53cml0ZUN1cnNvciAtIHRoaXMucmVhZEN1cnNvcjsKKyAgdmFyIGJ1ZlNpemUgPSAodW5yZWFkU2l6ZSAqIDIgPiB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSkgPworICAgIHVucmVhZFNpemUgKiAyIDogdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemU7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGJ1ZlNpemUpOworICBpZiAodW5yZWFkU2l6ZSA+IDApIHsKKyAgICB0aGlzLmluQnVmLmNvcHkoYnVmLCAwLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMud3JpdGVDdXJzb3IpOworICB9CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSB1bnJlYWRTaXplOworICB0aGlzLmluQnVmID0gYnVmOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKK30KKworICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0CitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworfTsKKworICAvLyBTZXQgdGhlIHNlcWlkIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjbGllbnQKKyAgLy8gU28gdGhhdCBjYWxsYmFja3MgY2FuIGJlIGZvdW5kCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnNldEN1cnJTZXFJZCA9IGZ1bmN0aW9uKHNlcWlkKSB7CisgIHRoaXMuX3NlcWlkID0gc2VxaWQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkQ3Vyc29yICsgbGVuID4gdGhpcy53cml0ZUN1cnNvcikgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbik7CisgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IGxlbjsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMSk7CisgIHJldHVybiBiaW5hcnkucmVhZEJ5dGUodGhpcy5pbkJ1Zlt0aGlzLnJlYWRDdXJzb3IrK10pOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDIpOworICB2YXIgaTE2ID0gYmluYXJ5LnJlYWRJMTYodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkQ3Vyc29yKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IDI7CisgIHJldHVybiBpMTY7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg4KTsKKyAgdmFyIGQgPSBiaW5hcnkucmVhZERvdWJsZSh0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gODsKKyAgcmV0dXJuIGQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbihsZW4pIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIHN0ciA9IHRoaXMuaW5CdWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMucmVhZEN1cnNvciArIGxlbik7CisgIHRoaXMucmVhZEN1cnNvciArPSBsZW47CisgIHJldHVybiBzdHI7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0ge2J1ZjogdGhpcy5pbkJ1ZiwgcmVhZEluZGV4OiB0aGlzLnJlYWRDdXJzb3IsIHdyaXRlSW5kZXg6IHRoaXMud3JpdGVDdXJzb3J9OworICByZXR1cm4gb2JqOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb25zdW1lID0gZnVuY3Rpb24oYnl0ZXNDb25zdW1lZCkgeworICB0aGlzLnJlYWRDdXJzb3IgKz0gYnl0ZXNDb25zdW1lZDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgLy8gSWYgdGhlIHNlcWlkIG9mIHRoZSBjYWxsYmFjayBpcyBhdmFpbGFibGUgcGFzcyBpdCB0byB0aGUgb25GbHVzaAorICAvLyBUaGVuIHJlbW92ZSB0aGUgY3VycmVudCBzZXFpZAorICB2YXIgc2VxaWQgPSB0aGlzLl9zZXFpZDsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworCisgIGlmICh0aGlzLm91dENvdW50IDwgMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBtc2cgPSBuZXcgQnVmZmVyKHRoaXMub3V0Q291bnQpLAorICAgICAgcG9zID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7CisgICAgYnVmLmNvcHkobXNnLCBwb3MsIDApOworICAgIHBvcyArPSBidWYubGVuZ3RoOworICB9KTsKKworICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgLy8gUGFzc2luZyBzZXFpZCB0aHJvdWdoIHRoaXMgY2FsbCB0byBnZXQgaXQgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICB0aGlzLm9uRmx1c2gobXNnLCBzZXFpZCk7CisgIH0KKworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTMxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKKworbW9kdWxlLmV4cG9ydHMgPSBUQ29tcGFjdFByb3RvY29sOworCit2YXIgUE9XXzggPSBNYXRoLnBvdygyLCA4KTsKK3ZhciBQT1dfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPV180MCA9IE1hdGgucG93KDIsIDQwKTsKK3ZhciBQT1dfNDggPSBNYXRoLnBvdygyLCA0OCk7Cit2YXIgUE9XXzUyID0gTWF0aC5wb3coMiwgNTIpOwordmFyIFBPV18xMDIyID0gTWF0aC5wb3coMiwgMTAyMik7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBDb21wYWN0IFByb3RvY29sLgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge29iamVjdH0gW3RyYW5zXSAtIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBQcm90b2NvbCBsYXllciBwZXJmb3JtcyBzZXJpYWxpemF0aW9uCisgKiAgICAgb2YgYmFzZSB0eXBlcywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgc2VyaWFsaXplcyBkYXRhIGluIGJpbmFyeQorICogICAgIGZvcm0gd2l0aCBtaW5pbWFsIHNwYWNlIHVzZWQgZm9yIHNjYWxhciB2YWx1ZXMuCisgKi8KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLmxhc3RGaWVsZF8gPSBbXTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworICB0aGlzLnN0cmluZ19saW1pdF8gPSAwOworICB0aGlzLnN0cmluZ19idWZfID0gbnVsbDsKKyAgdGhpcy5zdHJpbmdfYnVmX3NpemVfID0gMDsKKyAgdGhpcy5jb250YWluZXJfbGltaXRfID0gMDsKKyAgdGhpcy5ib29sZWFuRmllbGRfID0geworICAgIG5hbWU6IG51bGwsCisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZQorICB9OworICB0aGlzLmJvb2xWYWx1ZV8gPSB7CisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZSwKKyAgICBib29sVmFsdWU6IGZhbHNlCisgIH07Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIENvbnN0YW50cworLy8KKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBJRCBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFBST1RPQ09MX0lECisgICovCitUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEID0gLTEyNjsgIC8vMTAwMCAwMDEwCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFZFUlNJT05fTgorICAqLworVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX04gPSAxOworCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIHZlcnNpb24gbWFzayBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVkVSU0lPTl9NQVNLCisgICovCitUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9IDB4MWY7IC8vMDAwMSAxMTExCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIG1hc2sgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfTUFTSworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX01BU0sgPSAtMzI7ICAgICAvLzExMTAgMDAwMAorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBiaXRzIGZvciBlbnN1cmluZyBtZXNzYWdlIHR5cGUgYml0IHNpemUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfQklUUworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMgPSA3OyAvLzAwMDAgMDExMQorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBzaGlmdCBhbW91bnQgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfU0hJRlRfQU1PVU5UCisgICovCitUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIHR5cGUgSURzIHVzZWQgdG8ga2VlcCB0eXBlIGRhdGEgd2l0aGluIG9uZSBuaWJibGUuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU1RPUCAgICAgICAgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fVFJVRSAgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggdHJ1ZSB2YWx1ZSAocGFja2VkIGZpZWxkIGFuZCB2YWx1ZSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fRkFMU0UgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggZmFsc2UgdmFsdWUgKHBhY2tlZCBmaWVsZCBhbmQgdmFsdWUpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CWVRFICAgICAgICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kxNiAgICAgICAgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kzMiAgICAgICAgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0k2NCAgICAgICAgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIgKDJeNTMgbWF4IGluIEphdmFTY3JpcHQpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9ET1VCTEUgICAgICAgIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CSU5BUlkgICAgICAgIC0gQXJyYXkgb2YgYnl0ZXMgKHVzZWQgZm9yIHN0cmluZ3MgYWxzbykuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0xJU1QgICAgICAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU0VUICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfTUFQICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX1NUUlVDVCAgICAgICAgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5UeXBlcyA9IHsKKyAgQ1RfU1RPUDogICAgICAgICAgIDB4MDAsCisgIENUX0JPT0xFQU5fVFJVRTogICAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFOiAgMHgwMiwKKyAgQ1RfQllURTogICAgICAgICAgIDB4MDMsCisgIENUX0kxNjogICAgICAgICAgICAweDA0LAorICBDVF9JMzI6ICAgICAgICAgICAgMHgwNSwKKyAgQ1RfSTY0OiAgICAgICAgICAgIDB4MDYsCisgIENUX0RPVUJMRTogICAgICAgICAweDA3LAorICBDVF9CSU5BUlk6ICAgICAgICAgMHgwOCwKKyAgQ1RfTElTVDogICAgICAgICAgIDB4MDksCisgIENUX1NFVDogICAgICAgICAgICAweDBBLAorICBDVF9NQVA6ICAgICAgICAgICAgMHgwQiwKKyAgQ1RfU1RSVUNUOiAgICAgICAgIDB4MEMKK307CisKKy8qKgorICogQXJyYXkgbWFwcGluZyBDb21wYWN0IHR5cGUgSURzIHRvIHN0YW5kYXJkIFRocmlmdCB0eXBlIElEcy4KKyAqIEByZWFkb25seQorICovCitUQ29tcGFjdFByb3RvY29sLlRUeXBlVG9DVHlwZSA9IFsKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK107CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgVXRpbGl0aWVzCisvLworCisvKioKKyAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgorICogQHJldHVybiB7b2JqZWN0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuCisgKi9UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCisvKioKKyAqIExvb2t1cCBhIENvbXBhY3QgUHJvdG9jb2wgVHlwZSB2YWx1ZSBmb3IgYSBnaXZlbiBUaHJpZnQgVHlwZSB2YWx1ZS4KKyAqIE4uQi4gVXNlZCBvbmx5IGludGVybmFsbHkuCisgKiBAcGFyYW0ge251bWJlcn0gdHR5cGUgLSBUaHJpZnQgdHlwZSB2YWx1ZQorICogQHJldHVybnMge251bWJlcn0gQ29tcGFjdCBwcm90b2NvbCB0eXBlIHZhbHVlCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldENvbXBhY3RUeXBlID0gZnVuY3Rpb24odHR5cGUpIHsKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVFR5cGVUb0NUeXBlW3R0eXBlXTsKK307CisKKy8qKgorICogTG9va3VwIGEgVGhyaWZ0IFR5cGUgdmFsdWUgZm9yIGEgZ2l2ZW4gQ29tcGFjdCBQcm90b2NvbCBUeXBlIHZhbHVlLgorICogTi5CLiBVc2VkIG9ubHkgaW50ZXJuYWxseS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gQ29tcGFjdCBQcm90b2NvbCB0eXBlIHZhbHVlCisgKiBAcmV0dXJucyB7bnVtYmVyfSBUaHJpZnQgVHlwZSB2YWx1ZQorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm4gVHlwZS5TVE9QOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVHlwZS5CT09MOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFOgorICAgICAgcmV0dXJuIFR5cGUuQllURTsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTE2OgorICAgICAgcmV0dXJuIFR5cGUuSTE2OworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMzI6CisgICAgICByZXR1cm4gVHlwZS5JMzI7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NDoKKyAgICAgIHJldHVybiBUeXBlLkk2NDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFR5cGUuRE9VQkxFOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlk6CisgICAgICByZXR1cm4gVHlwZS5TVFJJTkc7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0xJU1Q6CisgICAgICByZXR1cm4gVHlwZS5MSVNUOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQ6CisgICAgICByZXR1cm4gVHlwZS5TRVQ7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUDoKKyAgICAgIHJldHVybiBUeXBlLk1BUDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNUOgorICAgICAgcmV0dXJuIFR5cGUuU1RSVUNUOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorICByZXR1cm4gVHlwZS5TVE9QOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCB3cml0ZSBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFNlbmQgYW55IGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSBlbmQgcG9pbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhbiBSUEMgbWVzc2FnZSBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSAoQ0FMTCwgUkVQTFksIEVYQ0VQVElPTiwgT05FV0FZKS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBjYWxsIHNlcXVlbmNlIG51bWJlciAoaWYgYW55KS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICB0aGlzLndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEKTsKKyAgdGhpcy53cml0ZUJ5dGUoKFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICgodHlwZSA8PCBUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2wuVFlQRV9NQVNLKSk7CisgIHRoaXMud3JpdGVWYXJpbnQzMihzZXFpZCk7CisgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisKKyAgLy8gUmVjb3JkIGNsaWVudCBzZXFpZCB0byBmaW5kIGNhbGxiYWNrIGFnYWluCisgIGlmICh0aGlzLl9zZXFpZCkgeworICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICB9IGVsc2UgeworICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CisgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMubGFzdEZpZWxkXy5wdXNoKHRoaXMubGFzdEZpZWxkSWRfKTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSB0aGlzLmxhc3RGaWVsZF8ucG9wKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIHN0cnVjdCBmaWVsZCBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGZpZWxkIG5hbWUgKG5vdCB3cml0dGVuIHdpdGggdGhlIGNvbXBhY3QgcHJvdG9jb2wpLgorICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgZmllbGQgZGF0YSB0eXBlIChhIG5vcm1hbCBUaHJpZnQgZmllbGQgVHlwZSkuCisgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSURMIGZpZWxkIElkLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBpZCkgeworICBpZiAodHlwZSAhPSBUeXBlLkJPT0wpIHsKKyAgICByZXR1cm4gdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlLCBpZCwgLTEpOworICB9CisKKyAgdGhpcy5ib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOworICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gdHlwZTsKKyAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkSWQgPSBpZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RPUCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIG1hcCBjb2xsZWN0aW9uIGhlYWRlcgorICogQHBhcmFtIHtudW1iZXJ9IGtleVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorICogQHBhcmFtIHtudW1iZXJ9IHZhbFR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2Ygay92IHBhaXJzIGluIHRoZSBtYXAuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMCk7CisgIH0gZWxzZSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKHNpemUpOworICAgIHRoaXMud3JpdGVCeXRlKHRoaXMuZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUodmFsVHlwZSkpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworLyoqCisgKiBXcml0ZXMgYSBsaXN0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIGxpc3QgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogV3JpdGVzIGEgc2V0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIHNldCBlbGVtZW50cy4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgaWYgKHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lICE9PSBudWxsKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCh0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkpOworICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgIHRoaXMud3JpdGVCeXRlKCh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYikgeworICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoW2JdKSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLndyaXRlVmFyaW50MzIodGhpcy5pMzJUb1ppZ3phZyhpMTYpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMud3JpdGVWYXJpbnQzMih0aGlzLmkzMlRvWmlnemFnKGkzMikpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgdGhpcy53cml0ZVZhcmludDY0KHRoaXMuaTY0VG9aaWd6YWcoaTY0KSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKHYpIHsKKyAgdmFyIGJ1ZmYgPSBuZXcgQnVmZmVyKDgpOworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzddID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZls2XSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZls3XSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZlswXSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzFdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZlszXSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzRdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZls2XSB8PSBtICYgMHgwZjsKKworICB0aGlzLnRyYW5zLndyaXRlKGJ1ZmYpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmdPckJpbmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGVuY29kaW5nLCBhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKSA7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIgfHwKKyAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpIHsKKyAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgorICAgIC8vIGRlZmluaW5nIGEgbmV3IG9iamVjdC4gV2UgZGV0ZWN0IHRoZW0gaGVyZSBzbyB3ZSBjYW4gd3JpdGUgdGhlbQorICAgIC8vIGNvcnJlY3RseQorICAgIHRoaXMud3JpdGVWYXJpbnQzMihhcmcubGVuZ3RoKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIGludGVybmFsIHdyaXRlIG1ldGhvZHMKKy8vCisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbkludGVybmFsID0gZnVuY3Rpb24obmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGUpIHsKKyAgLy9JZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgIHZhciB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyB0aGlzLmdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworICAvL0NoZWNrIGlmIHdlIGNhbiBkZWx0YSBlbmNvZGUgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElkID4gdGhpcy5sYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIHRoaXMubGFzdEZpZWxkSWRfIDw9IDE1KSB7CisgICAgLy9JbmNsdWRlIHRoZSB0eXBlIGRlbHRhIHdpdGggdGhlIGZpZWxkIElECisgICAgdGhpcy53cml0ZUJ5dGUoKGZpZWxkSWQgLSB0aGlzLmxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgfSBlbHNlIHsKKyAgICAvL1dyaXRlIHNlcGFyYXRlIHR5cGUgYW5kIElEIHZhbHVlcworICAgIHRoaXMud3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICB0aGlzLndyaXRlSTE2KGZpZWxkSWQpOworICB9CisgIHRoaXMubGFzdEZpZWxkSWRfID0gZmllbGRJZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQ29sbGVjdGlvbkJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICAvL0NvbWJpbmUgc2l6ZSBhbmQgdHlwZSBpbiBvbmUgYnl0ZSBpZiBwb3NzaWJsZQorICAgIHRoaXMud3JpdGVCeXRlKHNpemUgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgweGYwIHwgdGhpcy5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIHRoaXMud3JpdGVWYXJpbnQzMihzaXplKTsKKyAgfQorfTsKKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVZhcmludDMyID0gZnVuY3Rpb24obikgeworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcig1KTsKKyAgdmFyIHdzaXplID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IG47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPSBuID4+PiA3OworICAgIH0KKyAgfQorICB2YXIgd2J1ZiA9IG5ldyBCdWZmZXIod3NpemUpOworICBidWYuY29weSh3YnVmLDAsMCx3c2l6ZSk7CisgIHRoaXMudHJhbnMud3JpdGUod2J1Zik7Cit9OworCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICogTi5CLiBub2RlLWludDY0IGlzIGFsd2F5cyBiaWcgZW5kaWFuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlVmFyaW50NjQgPSBmdW5jdGlvbihuKSB7CisgIGlmICh0eXBlb2YgbiA9PT0gIm51bWJlciIpeworICAgIG4gPSBuZXcgSW50NjQobik7CisgIH0KKyAgaWYgKCEgKG4gaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbik7CisgIH0KKworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcigxMCk7CisgIHZhciB3c2l6ZSA9IDA7CisgIHZhciBoaSA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworICB2YXIgbWFzayA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKCgobG8gJiB+MHg3RikgPT09IDApICYmIChoaSA9PT0gMCkpIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGxvOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9ICgobG8gJiAweDdGKSB8IDB4ODApOworICAgICAgbWFzayA9IGhpIDw8IDI1OworICAgICAgbG8gPSBsbyA+Pj4gNzsKKyAgICAgIGhpID0gaGkgPj4+IDc7CisgICAgICBsbyA9IGxvIHwgbWFzazsKKyAgICB9CisgIH0KKyAgdmFyIHdidWYgPSBuZXcgQnVmZmVyKHdzaXplKTsKKyAgYnVmLmNvcHkod2J1ZiwwLDAsd3NpemUpOworICB0aGlzLnRyYW5zLndyaXRlKHdidWYpOworfTsKKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmk2NFRvWmlnemFnID0gZnVuY3Rpb24obCkgeworICBpZiAodHlwZW9mIGwgPT09ICdzdHJpbmcnKSB7CisgICAgbCA9IG5ldyBJbnQ2NChwYXJzZUludChsLCAxMCkpOworICB9IGVsc2UgaWYgKHR5cGVvZiBsID09PSAnbnVtYmVyJykgeworICAgIGwgPSBuZXcgSW50NjQobCk7CisgIH0KKyAgaWYgKCEgKGwgaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbCk7CisgIH0KKyAgdmFyIGhpID0gbC5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG8gPSBsLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisgIHZhciBzaWduID0gaGkgPj4+IDMxOworICBoaSA9ICgoaGkgPDwgMSkgfCAobG8gPj4+IDMxKSkgXiAoKCEhc2lnbikgPyAweEZGRkZGRkZGIDogMCk7CisgIGxvID0gKGxvIDw8IDEpIF4gKCghIXNpZ24pID8gMHhGRkZGRkZGRiA6IDApOworICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5pMzJUb1ppZ3phZyA9IGZ1bmN0aW9uKG4pIHsKKyAgcmV0dXJuIChuIDw8IDEpIF4gKChuICYgMHg4MDAwMDAwMCkgPyAweEZGRkZGRkZGIDogMCk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIHJlYWQgb3BlcmF0aW9ucworLy8KKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICAvL1JlYWQgcHJvdG9jb2wgSUQKKyAgdmFyIHByb3RvY29sSWQgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgIGlmIChwcm90b2NvbElkICE9IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyICIgKyBwcm90b2NvbElkKTsKKyAgfQorCisgIC8vUmVhZCBWZXJzaW9uIGFuZCBUeXBlCisgIHZhciB2ZXJzaW9uQW5kVHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgdmFyIHZlcnNpb24gPSAodmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgIH0KKyAgdmFyIHR5cGUgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMpOworCisgIC8vUmVhZCBTZXFJZAorICB2YXIgc2VxaWQgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworCisgIC8vUmVhZCBuYW1lCisgIHZhciBuYW1lID0gdGhpcy5yZWFkU3RyaW5nKCk7CisKKyAgcmV0dXJuIHtmbmFtZTogbmFtZSwgbXR5cGU6IHR5cGUsIHJzZXFpZDogc2VxaWR9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZF8ucHVzaCh0aGlzLmxhc3RGaWVsZElkXyk7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gMDsKKyAgcmV0dXJuIHtmbmFtZTogJyd9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZElkXyA9IHRoaXMubGFzdEZpZWxkXy5wb3AoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBmaWVsZElkID0gMDsKKyAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKGIpOworICB2YXIgdHlwZSA9IChiICYgMHgwZik7CisKKyAgaWYgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IFRocmlmdC5UeXBlLlNUT1AsIGZpZDogMH07CisgIH0KKworICAvL01hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIgdG8gY2hlY2sgZm9yIGZpZWxkIGlkIGRlbHRhLgorICB2YXIgbW9kaWZpZXIgPSAoKGIgJiAweDAwMDAwMGYwKSA+Pj4gNCk7CisgIGlmIChtb2RpZmllciA9PT0gMCkgeworICAgIC8vSWYgbm90IGEgZGVsdGEgcmVhZCB0aGUgZmllbGQgaWQuCisgICAgZmllbGRJZCA9IHRoaXMucmVhZEkxNigpOworICB9IGVsc2UgeworICAgIC8vUmVjb3ZlciB0aGUgZmllbGQgaWQgZnJvbSB0aGUgZGVsdGEKKyAgICBmaWVsZElkID0gKHRoaXMubGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICB9CisgIHZhciBmaWVsZFR5cGUgPSB0aGlzLmdldFRUeXBlKHR5cGUpOworCisgIC8vQm9vbGVhbiBhcmUgZW5jb2RlZCB3aXRoIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFIHx8CisgICAgICB0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkgeworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5ib29sVmFsdWUgPQorICAgICAgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICB9CisKKyAgLy9TYXZlIHRoZSBuZXcgZmllbGQgZm9yIHRoZSBuZXh0IGRlbHRhIGNvbXB1dGF0aW9uLgorICB0aGlzLmxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiBmaWVsZFR5cGUsIGZpZDogZmllbGRJZH07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbXNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICBpZiAobXNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIG1hcCBzaXplIik7CisgIH0KKworICB2YXIga3ZUeXBlID0gMDsKKyAgaWYgKG1zaXplICE9PSAwKSB7CisgICAga3ZUeXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICB9CisKKyAgdmFyIGtleVR5cGUgPSB0aGlzLmdldFRUeXBlKChrdlR5cGUgJiAweGYwKSA+Pj4gNCk7CisgIHZhciB2YWxUeXBlID0gdGhpcy5nZXRUVHlwZShrdlR5cGUgJiAweGYpOworICByZXR1cm4ge2t0eXBlOiBrZXlUeXBlLCB2dHlwZTogdmFsVHlwZSwgc2l6ZTogbXNpemV9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZV9hbmRfdHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKworICB2YXIgbHNpemUgPSAoc2l6ZV9hbmRfdHlwZSA+Pj4gNCkgJiAweDAwMDAwMDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICBsc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGxpc3Qgc2l6ZSIpOworICB9CisKKyAgdmFyIGVsZW1UeXBlID0gdGhpcy5nZXRUVHlwZShzaXplX2FuZF90eXBlICYgMHgwMDAwMDAwZik7CisKKyAgcmV0dXJuIHtldHlwZTogZWxlbVR5cGUsIHNpemU6IGxzaXplfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RCZWdpbigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJvb2wgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHZhbHVlID0gZmFsc2U7CisgIHZhciByc2l6ZSA9IDA7CisgIGlmICh0aGlzLmJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09PSB0cnVlKSB7CisgICAgdmFsdWUgPSB0aGlzLmJvb2xWYWx1ZV8uYm9vbFZhbHVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgcmVzID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICAgIHJzaXplID0gcmVzLnJzaXplOworICAgIHZhbHVlID0gKHJlcy52YWx1ZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy56aWd6YWdUb0kzMih0aGlzLnJlYWRWYXJpbnQzMigpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuemlnemFnVG9JNjQodGhpcy5yZWFkVmFyaW50NjQoKSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICB2YXIgb2ZmID0gMDsKKworICB2YXIgc2lnbmVkID0gYnVmZltvZmYgKyA3XSAmIDB4ODA7CisgIHZhciBlID0gKGJ1ZmZbb2ZmKzZdICYgMHhGMCkgPj4gNDsKKyAgZSArPSAoYnVmZltvZmYrN10gJiAweDdGKSA8PCA0OworCisgIHZhciBtID0gYnVmZltvZmZdOworICBtICs9IGJ1ZmZbb2ZmKzFdIDw8IDg7CisgIG0gKz0gYnVmZltvZmYrMl0gPDwgMTY7CisgIG0gKz0gYnVmZltvZmYrM10gKiBQT1dfMjQ7CisgIG0gKz0gYnVmZltvZmYrNF0gKiBQT1dfMzI7CisgIG0gKz0gYnVmZltvZmYrNV0gKiBQT1dfNDA7CisgIG0gKz0gKGJ1ZmZbb2ZmKzZdICYgMHgwRikgKiBQT1dfNDg7CisKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSAwOgorICAgICAgZSA9IC0xMDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ3OgorICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoc2lnbmVkID8gLUluZmluaXR5IDogSW5maW5pdHkpOworICAgIGRlZmF1bHQ6CisgICAgICBtICs9IFBPV181MjsKKyAgICAgIGUgLT0gMTAyMzsKKyAgfQorCisgIGlmIChzaWduZWQpIHsKKyAgICBtICo9IC0xOworICB9CisKKyAgcmV0dXJuIG0gKiBNYXRoLnBvdygyLCBlIC0gNTIpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5IHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkKHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhzaXplKTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgaW50ZXJuYWwgcmVhZCBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFyaW50MzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZFZhcmludDY0KCkudG9OdW1iZXIoKTsKK307CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFZhcmludDY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciByc2l6ZSA9IDA7CisgIHZhciBsbyA9IDA7CisgIHZhciBoaSA9IDA7CisgIHZhciBzaGlmdCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgICAgcnNpemUgKys7CisgICAgaWYgKHNoaWZ0IDw9IDI1KSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgIH0gZWxzZSBpZiAoMjUgPCBzaGlmdCAmJiBzaGlmdCA8IDMyKSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpID4+PiAoMzItc2hpZnQpKTsKKyAgICB9IGVsc2UgeworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpIDw8IChzaGlmdC0zMikpOworICAgIH0KKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGIgJiAweDgwKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyc2l6ZSA+PSAxMCkgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgIH0KKyAgfQorICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuemlnemFnVG9JMzIgPSBmdW5jdGlvbihuKSB7CisgIHJldHVybiAobiA+Pj4gMSkgXiAoLTEgKiAobiAmIDEpKTsKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnppZ3phZ1RvSTY0ID0gZnVuY3Rpb24obikgeworICB2YXIgaGkgPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsbyA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKworICB2YXIgbmVnID0gbmV3IEludDY0KGhpICYgMCwgbG8gJiAxKTsKKyAgbmVnLl8yc2NvbXAoKTsKKyAgdmFyIGhpX25lZyA9IG5lZy5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG9fbmVnID0gbmVnLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisKKyAgdmFyIGhpX2xvID0gKGhpIDw8IDMxKTsKKyAgaGkgPSAoaGkgPj4+IDEpIF4gKGhpX25lZyk7CisgIGxvID0gKChsbyA+Pj4gMSkgfCBoaV9sbykgXiAobG9fbmVnKTsKKyAgcmV0dXJuIG5ldyBJbnQ2NChoaSwgbG8pOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKaW5kZXggZTQ2OWY0OS4uOWU1YzA2MyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKQEAgLTE2LDY4ICsxNiw2NCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciBzeXMgPSByZXF1aXJlKCdzeXMnKSwKLSAgICBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXIsCi0gICAgbmV0ID0gcmVxdWlyZSgnbmV0JyksCi0gICAgVE1lbW9yeUJ1ZmZlciA9IHJlcXVpcmUoJy4vdHJhbnNwb3J0JykuVE1lbW9yeUJ1ZmZlciwKLSAgICBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJykuVEJpbmFyeVByb3RvY29sOwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyOwordmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpOwordmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpOwordmFyIHRscyA9IHJlcXVpcmUoJ3RscycpOwordmFyIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKIAotdmFyIEJpbmFyeVBhcnNlciA9IHJlcXVpcmUoJy4vYmluYXJ5X3BhcnNlcicpLkJpbmFyeVBhcnNlcjsKLUJpbmFyeVBhcnNlci5iaWdFbmRpYW4gPSB0cnVlOwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOwogCi12YXIgaW50MzJGcmFtZWRSZWNlaXZlciA9IGV4cG9ydHMuaW50MzJGcmFtZWRSZWNlaXZlciA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewotICB2YXIgZnJhbWVMZWZ0ID0gMCwKLSAgICAgIGZyYW1lUG9zID0gMCwKLSAgICAgIGZyYW1lID0gbnVsbDsKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKIAotICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgewotICAgIC8vIHZhciBidWYgPSBuZXcgQnVmZmVyKGRhdGEsICdiaW5hcnknKTsKLSAgICAvLyBjb25zb2xlLmxvZyhidWYpOwotICAgIC8vIGZyYW1lZCB0cmFuc3BvcnQKLSAgICB3aGlsZSAoZGF0YS5sZW5ndGgpIHsKLSAgICAgIGlmIChmcmFtZUxlZnQgPT09IDApIHsKLSAgICAgICAgLy8gVE9ETyBhc3N1bWVzIHdlIGhhdmUgYWxsIDQgYnl0ZXMKLSAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCkgewotICAgICAgICAgIHRocm93IEVycm9yKCJOb3QgZW5vdWdoIGJ5dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVMZWZ0ID0gQmluYXJ5UGFyc2VyLnRvSW50KGRhdGEuc2xpY2UoMCw0KSk7Ci0gICAgICAgIGZyYW1lID0gbmV3IEJ1ZmZlcihmcmFtZUxlZnQpOwotICAgICAgICBmcmFtZVBvcyA9IDA7Ci0gICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDQsIGRhdGEubGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRhdGEubGVuZ3RoID49IGZyYW1lTGVmdCkgewotICAgICAgICBkYXRhLmNvcHkoZnJhbWUsIGZyYW1lUG9zLCAwLCBmcmFtZUxlZnQpOwotICAgICAgICBkYXRhID0gZGF0YS5zbGljZShmcmFtZUxlZnQsIGRhdGEubGVuZ3RoKTsKLQotICAgICAgICBmcmFtZUxlZnQgPSAwOwotICAgICAgICBjYWxsYmFjayhmcmFtZSk7Ci0gICAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoKSB7Ci0gICAgICAgIGRhdGEuY29weShmcmFtZSwgZnJhbWVQb3MsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgZnJhbWVMZWZ0IC09IGRhdGEubGVuZ3RoOwotICAgICAgICBmcmFtZVBvcyArPSBkYXRhLmxlbmd0aDsKLSAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoZGF0YS5sZW5ndGgsIGRhdGEubGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci19Cit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKIAogdmFyIENvbm5lY3Rpb24gPSBleHBvcnRzLkNvbm5lY3Rpb24gPSBmdW5jdGlvbihzdHJlYW0sIG9wdGlvbnMpIHsKICAgdmFyIHNlbGYgPSB0aGlzOwogICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKIAorICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKICAgdGhpcy5jb25uZWN0aW9uID0gc3RyZWFtOwotICB0aGlzLm9mZmxpbmVfcXVldWUgPSBbXTsKKyAgdGhpcy5zc2wgPSAoc3RyZWFtLmVuY3J5cHRlZCk7CiAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOworICB0aGlzLm9mZmxpbmVfcXVldWUgPSBbXTsKICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKKyAgdGhpcy5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKIAotICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKKyAgdGhpcy5fZGVidWcgPSB0aGlzLm9wdGlvbnMuZGVidWcgfHwgZmFsc2U7CisgIGlmICh0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzICYmCisgICAgICAhaXNOYU4odGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cykgJiYKKyAgICAgIHRoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHMgPiAwKSB7CisgICAgIHRoaXMubWF4X2F0dGVtcHRzID0gK3RoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHM7CisgIH0KKyAgdGhpcy5yZXRyeV9tYXhfZGVsYXkgPSBudWxsOworICBpZiAodGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSAhPT0gdW5kZWZpbmVkICYmCisgICAgICAhaXNOYU4odGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSkgJiYKKyAgICAgIHRoaXMub3B0aW9ucy5yZXRyeV9tYXhfZGVsYXkgPiAwKSB7CisgICAgIHRoaXMucmV0cnlfbWF4X2RlbGF5ID0gdGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheTsKKyAgfQorICB0aGlzLmNvbm5lY3RfdGltZW91dCA9IGZhbHNlOworICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCAmJgorICAgICAgIWlzTmFOKHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQpICYmCisgICAgICB0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ID4gMCkgeworICAgICB0aGlzLmNvbm5lY3RfdGltZW91dCA9ICt0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0OworICB9CisKKyAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKHRoaXMuc3NsID8gInNlY3VyZUNvbm5lY3QiIDogImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKICAgICBzZWxmLmNvbm5lY3RlZCA9IHRydWU7CisKICAgICB0aGlzLnNldFRpbWVvdXQoc2VsZi5vcHRpb25zLnRpbWVvdXQgfHwgMCk7CiAgICAgdGhpcy5zZXROb0RlbGF5KCk7CiAgICAgdGhpcy5mcmFtZUxlZnQgPSAwOwogICAgIHRoaXMuZnJhbWVQb3MgPSAwOwogICAgIHRoaXMuZnJhbWUgPSBudWxsOworICAgIHNlbGYuaW5pdGlhbGl6ZV9yZXRyeV92YXJzKCk7CiAKICAgICBzZWxmLm9mZmxpbmVfcXVldWUuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CiAgICAgICBzZWxmLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7CkBAIC04Nyw2ICs4MywyNDAgQEAKICAgfSk7CiAKICAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgeworICAgIC8vIE9ubHkgZW1pdCB0aGUgZXJyb3IgaWYgbm8tb25lIGVsc2UgaXMgbGlzdGVuaW5nIG9uIHRoZSBjb25uZWN0aW9uCisgICAgLy8gb3IgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmcgb24gdXMsIGJlY2F1c2UgTm9kZSB0dXJucyB1bmhhbmRsZWQKKyAgICAvLyAnZXJyb3InIGV2ZW50cyBpbnRvIGV4Y2VwdGlvbnMuCisgICAgaWYgKHNlbGYuY29ubmVjdGlvbi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID09PSAxIHx8CisgICAgICAgIHNlbGYubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCA+IDApIHsKKyAgICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOworICAgIH0KKyAgfSk7CisKKyAgLy8gQWRkIGEgY2xvc2UgbGlzdGVuZXIKKyAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCkgeworICAgIHNlbGYuY29ubmVjdGlvbl9nb25lKCk7IC8vIGhhbmRsZSBjbG9zZSBldmVudC4gdHJ5IHRvIHJlY29ubmVjdAorICB9KTsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoInRpbWVvdXQiLCBmdW5jdGlvbigpIHsKKyAgICBzZWxmLmVtaXQoInRpbWVvdXQiKTsKKyAgfSk7CisKKyAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJkYXRhIiwgc2VsZi50cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0X3dpdGhfZGF0YSkgeworICAgIHZhciBtZXNzYWdlID0gbmV3IHNlbGYucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgICAgdHJ5IHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciBoZWFkZXIgPSBtZXNzYWdlLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAgIC8vICBUaGUgY29ubmVjdGlvbi5jbGllbnQgb2JqZWN0IGlzIGEgc2luZ2xlIGNsaWVudCBvYmplY3Qgd2hlbiBub3QKKyAgICAgICAgLy8gIG11bHRpcGxleGluZywgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQKKyAgICAgICAgLy8gIGhhc2ggb2YgY2xpZW50IG9iamVjdHMuCisgICAgICAgIC8vTk9URTogVGhlIDIgd2F5IGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gcHJvdG9jb2xzLCB0cmFuc3BvcnRzLAorICAgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgICAvLyAgYW5kIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdCB0byBleHRlbmQgYW5kIG1haW50YWluLiBXZQorICAgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCisgICAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgICAgLy8gIC0tcmEKKyAgICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50W3NlcnZpY2VfbmFtZV07CisgICAgICAgIH0KKyAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworCisgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICAgICAgZGVsZXRlIHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLypqc2hpbnQgK1cwODMgKi8KKworICAgICAgICBpZihjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0obWVzc2FnZSwgaGVhZGVyLm10eXBlLCBkdW1teV9zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgICAgc2VsZi5lbWl0KCJlcnJvciIsCisgICAgICAgICAgICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpOworICAgICAgfQorICAgIH0KKyAgfSkpOworfTsKK3V0aWwuaW5oZXJpdHMoQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuY29ubmVjdGlvbi5lbmQoKTsKK307CisKK0Nvbm5lY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmRlc3Ryb3koKTsKK307CisKK0Nvbm5lY3Rpb24ucHJvdG90eXBlLmluaXRpYWxpemVfcmV0cnlfdmFycyA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5yZXRyeV90aW1lciA9IG51bGw7CisgIHRoaXMucmV0cnlfdG90YWx0aW1lID0gMDsKKyAgdGhpcy5yZXRyeV9kZWxheSA9IDE1MDsKKyAgdGhpcy5yZXRyeV9iYWNrb2ZmID0gMS43OworICB0aGlzLmF0dGVtcHRzID0gMDsKK307CisKK0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7CisgICAgdGhpcy5vZmZsaW5lX3F1ZXVlLnB1c2goZGF0YSk7CisgICAgcmV0dXJuOworICB9CisgIHRoaXMuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKK307CisKK0Nvbm5lY3Rpb24ucHJvdG90eXBlLmNvbm5lY3Rpb25fZ29uZSA9IGZ1bmN0aW9uICgpIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworCisgIC8vIElmIGEgcmV0cnkgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywganVzdCBsZXQgdGhhdCBoYXBwZW4KKyAgaWYgKHRoaXMucmV0cnlfdGltZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gV2UgY2Fubm90IHJlY29ubmVjdCBhIHNlY3VyZSBzb2NrZXQuCisgIGlmICghdGhpcy5tYXhfYXR0ZW1wdHMgfHwgdGhpcy5zc2wpIHsKKyAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHRoaXMucmV0cnlfbWF4X2RlbGF5ICE9PSBudWxsICYmIHRoaXMucmV0cnlfZGVsYXkgPj0gdGhpcy5yZXRyeV9tYXhfZGVsYXkpIHsKKyAgICB0aGlzLnJldHJ5X2RlbGF5ID0gdGhpcy5yZXRyeV9tYXhfZGVsYXk7CisgIH0gZWxzZSB7CisgICAgdGhpcy5yZXRyeV9kZWxheSA9IE1hdGguZmxvb3IodGhpcy5yZXRyeV9kZWxheSAqIHRoaXMucmV0cnlfYmFja29mZik7CisgIH0KKworICBsb2cuZGVidWcoIlJldHJ5IGNvbm5lY3Rpb24gaW4gIiArIHRoaXMucmV0cnlfZGVsYXkgKyAiIG1zIik7CisKKyAgaWYgKHRoaXMubWF4X2F0dGVtcHRzICYmIHRoaXMuYXR0ZW1wdHMgPj0gdGhpcy5tYXhfYXR0ZW1wdHMpIHsKKyAgICB0aGlzLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgICBjb25zb2xlLmVycm9yKCJ0aHJpZnQ6IENvdWxkbid0IGdldCB0aHJpZnQgY29ubmVjdGlvbiBhZnRlciAiICsgdGhpcy5tYXhfYXR0ZW1wdHMgKyAiIGF0dGVtcHRzLiIpOworICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aGlzLmF0dGVtcHRzICs9IDE7CisgIHRoaXMuZW1pdCgicmVjb25uZWN0aW5nIiwgeworICAgIGRlbGF5OiBzZWxmLnJldHJ5X2RlbGF5LAorICAgIGF0dGVtcHQ6IHNlbGYuYXR0ZW1wdHMKKyAgfSk7CisKKyAgdGhpcy5yZXRyeV90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgIGlmIChzZWxmLmNvbm5lY3Rpb24uZGVzdHJveWVkKSB7CisgICAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb2cuZGVidWcoIlJldHJ5aW5nIGNvbm5lY3Rpb24uLi4iKTsKKworICAgIHNlbGYucmV0cnlfdG90YWx0aW1lICs9IHNlbGYucmV0cnlfZGVsYXk7CisKKyAgICBpZiAoc2VsZi5jb25uZWN0X3RpbWVvdXQgJiYgc2VsZi5yZXRyeV90b3RhbHRpbWUgPj0gc2VsZi5jb25uZWN0X3RpbWVvdXQpIHsKKyAgICAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgICAgICBjb25zb2xlLmVycm9yKCJ0aHJpZnQ6IENvdWxkbid0IGdldCB0aHJpZnQgY29ubmVjdGlvbiBhZnRlciAiICsgc2VsZi5yZXRyeV90b3RhbHRpbWUgKyAibXMuIik7CisgICAgICAgc2VsZi5lbWl0KCJjbG9zZSIpOworICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc2VsZi5wYXRoICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KHNlbGYucGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KHNlbGYucG9ydCwgc2VsZi5ob3N0KTsKKyAgICB9CisgICAgc2VsZi5yZXRyeV90aW1lciA9IG51bGw7CisgIH0sIHRoaXMucmV0cnlfZGVsYXkpOworfTsKKworZXhwb3J0cy5jcmVhdGVDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICB2YXIgc3RyZWFtID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24ocG9ydCwgaG9zdCk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5ob3N0ID0gaG9zdDsKKyAgY29ubmVjdGlvbi5wb3J0ID0gcG9ydDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgdmFyIHN0cmVhbSA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHBhdGgpOworICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24ucGF0aCA9IHBhdGg7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9OworCitleHBvcnRzLmNyZWF0ZVNTTENvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucykgJiYgISgnc2VjdXJlT3B0aW9ucycgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgIG9wdGlvbnMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOworICB9CisKKyAgdmFyIHN0cmVhbSA9IHRscy5jb25uZWN0KHBvcnQsIGhvc3QsIG9wdGlvbnMpOworICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24uaG9zdCA9IGhvc3Q7CisgIGNvbm5lY3Rpb24ucG9ydCA9IHBvcnQ7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9OworCisKK2V4cG9ydHMuY3JlYXRlQ2xpZW50ID0gY3JlYXRlQ2xpZW50OworCit2YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTsKK3ZhciBTdGRJT0Nvbm5lY3Rpb24gPSBleHBvcnRzLlN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsIG9wdGlvbnMpIHsKKyAgdmFyIGNvbW1hbmRfcGFydHMgPSBjb21tYW5kLnNwbGl0KCcgJyk7CisgIGNvbW1hbmQgPSBjb21tYW5kX3BhcnRzWzBdOworICB2YXIgYXJncyA9IGNvbW1hbmRfcGFydHMuc3BsaWNlKDEsY29tbWFuZF9wYXJ0cy5sZW5ndGggLTEpOworICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkID0gY2hpbGRfcHJvY2Vzcy5zcGF3bihjb21tYW5kLGFyZ3MpOworCisgIHZhciBzZWxmID0gdGhpczsKKyAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CisKKyAgdGhpcy5jb25uZWN0aW9uID0gY2hpbGQuc3RkaW47CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOworICB0aGlzLm9mZmxpbmVfcXVldWUgPSBbXTsKKworICBpZiAobG9nLmdldExvZ0xldmVsKCkgPT09ICdkZWJ1ZycpIHsKKyAgICB0aGlzLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgIGxvZy5kZWJ1ZyhlcnIudG9TdHJpbmcoKSwgJ0NISUxEIEVSUk9SJyk7CisgICAgfSk7CisKKyAgICB0aGlzLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUsc2lnbmFsKSB7CisgICAgICBsb2cuZGVidWcoY29kZSArICc6JyArIHNpZ25hbCwgJ0NISUxEIEVYSVRFRCcpOworICAgIH0pOworICB9CisKKyAgdGhpcy5mcmFtZUxlZnQgPSAwOworICB0aGlzLmZyYW1lUG9zID0gMDsKKyAgdGhpcy5mcmFtZSA9IG51bGw7CisgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTsKKworICBzZWxmLm9mZmxpbmVfcXVldWUuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CisgICAgICBzZWxmLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7CisgIH0pOworCisKKyAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgewogICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOwogICB9KTsKIApAQCAtOTUsNTYgKzMyNSw1MCBAQAogICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKICAgfSk7CiAKLSAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJ0aW1lb3V0IiwgZnVuY3Rpb24oKSB7Ci0gICAgc2VsZi5lbWl0KCJ0aW1lb3V0Iik7Ci0gIH0pOworICBjaGlsZC5zdGRvdXQuYWRkTGlzdGVuZXIoImRhdGEiLCBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgICAgdmFyIG1lc3NhZ2UgPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgdmFyIGhlYWRlciA9IG1lc3NhZ2UucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgdmFyIGNsaWVudCA9IHNlbGYuY2xpZW50OworICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKIAotICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImRhdGEiLCBpbnQzMkZyYW1lZFJlY2VpdmVyKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YoZGF0YSkpOwotICAgIHZhciBpbnB1dCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSkpOwotICAgIHZhciByID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOwotICAgIC8vIGNvbnNvbGUubG9nKHIpOwotICAgIHNlbGYuY2xpZW50WydyZWN2XycgKyByLmZuYW1lXShpbnB1dCwgci5tdHlwZSwgci5yc2VxaWQpOwotICAgIC8vIHNlbGYuZW1pdCgiZGF0YSIsIGRhdGEpOworICAgICAgICB2YXIgY2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICAgIGNhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0obWVzc2FnZSwgaGVhZGVyLm10eXBlLCBkdW1teV9zZXFpZCk7CisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0aHJvdyBlOworICAgICAgfQorICAgIH0KICAgfSkpOwotfQotc3lzLmluaGVyaXRzKENvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7Cit9OwogCi1leHBvcnRzLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7Ci0gIHZhciBzdHJlYW0gPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihwb3J0LCBob3N0KTsKLSAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihzdHJlYW0sIG9wdGlvbnMpOwotICBjb25uZWN0aW9uLmhvc3QgPSBob3N0OwotICBjb25uZWN0aW9uLnBvcnQgPSBwb3J0OwordXRpbC5pbmhlcml0cyhTdGRJT0Nvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7CiAKLSAgcmV0dXJuIGNvbm5lY3Rpb247Ci19Ci0KLWV4cG9ydHMuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oY2xzLCBjb25uZWN0aW9uKSB7Ci0gIGlmIChjbHMuQ2xpZW50KSB7Ci0gICAgY2xzID0gY2xzLkNsaWVudDsKLSAgfQotICB2YXIgY2xpZW50ID0gbmV3IGNscyhuZXcgVE1lbW9yeUJ1ZmZlcih1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgewotICAgIGNvbm5lY3Rpb24ud3JpdGUoYnVmKTsKLSAgfSksIFRCaW5hcnlQcm90b2NvbCk7Ci0KLSAgLy8gVE9ETyBjbGVhbiB0aGlzIHVwCi0gIGNvbm5lY3Rpb24uY2xpZW50ID0gY2xpZW50OwotCi0gIHJldHVybiBjbGllbnQ7Ci19Ci0KLUNvbm5lY3Rpb24ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkgeworU3RkSU9Db25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKICAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOwotfQorfTsKIAotQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHsKLSAgLy8gVE9ETzogb3B0aW1pemUgdGhpcyBiZXR0ZXIsIGFsbG9jYXRlIG9uZSBidWZmZXIgaW5zdGVhZCBvZiBib3RoOgotICB2YXIgbXNnID0gbmV3IEJ1ZmZlcihidWYubGVuZ3RoICsgNCk7Ci0gIEJpbmFyeVBhcnNlci5mcm9tSW50KGJ1Zi5sZW5ndGgpLmNvcHkobXNnLCAwLCAwLCA0KTsKLSAgYnVmLmNvcHkobXNnLCA0LCAwLCBidWYubGVuZ3RoKTsKK1N0ZElPQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CiAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHsKLSAgICB0aGlzLm9mZmxpbmVfcXVldWUucHVzaChtc2cpOwotICB9IGVsc2UgewotICAgIHRoaXMuY29ubmVjdGlvbi53cml0ZShtc2cpOworICAgIHRoaXMub2ZmbGluZV9xdWV1ZS5wdXNoKGRhdGEpOworICAgIHJldHVybjsKICAgfQotfQorICB0aGlzLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7Cit9OworCitleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsb3B0aW9ucyl7CisgIHJldHVybiBuZXcgU3RkSU9Db25uZWN0aW9uKGNvbW1hbmQsb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVN0ZElPQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY3JlYXRlX2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI3N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNsaWVudDsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNsaWVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVGhyaWZ0IHNlcnZpY2UuCisgKiBAcGFyYW0ge29iamVjdH0gU2VydmljZUNsaWVudCAtIFRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xpZW50CisgKiBAcGFyYW0ge0Nvbm5lY3Rpb259IENvbm5lY3Rpb24gLSBUaGUgY29ubmVjdGlvbiB0byB1c2UuCisgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY2xpZW50IG9iamVjdC4KKyAqLworZnVuY3Rpb24gY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgLy8gVE9ETyB2YWxpZGF0ZSByZXF1aXJlZCBvcHRpb25zIGFuZCB0aHJvdyBvdGhlcndpc2UKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIC8vIFRPRE8gZGV0YW5nbGUgdGhlc2UgaW5pdGlhbGl6YXRpb24gY2FsbHMKKyAgLy8gY3JlYXRpbmcgImNsaWVudCIgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyBzZXJ2aWNlIGNsaWVudCBpbnN0YW5jZQorICAvLworICAvLyBOZXcgc2VydmljZSBjbGllbnQgaW5zdGFuY2UgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UKKyAgLy8gICAtIHByb3RvY29sIGNsYXNzIHJlZmVyZW5jZQorICAvLworICAvLyBOZXcgdHJhbnNwb3J0IGluc3RhbmNlIHJlcXVpcmVzCisgIC8vICAgLSBCdWZmZXIgdG8gdXNlIChvciBub25lKQorICAvLyAgIC0gQ2FsbGJhY2sgdG8gY2FsbCBvbiBmbHVzaAorCisgIC8vIFdyYXAgdGhlIHdyaXRlIG1ldGhvZAorICB2YXIgd3JpdGVDYiA9IGZ1bmN0aW9uKGJ1Ziwgc2VxaWQpIHsKKyAgICBjb25uZWN0aW9uLndyaXRlKGJ1Ziwgc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIGNvbm5lY3Rpb24ucHJvdG9jb2wpOworICB0cmFuc3BvcnQuY2xpZW50ID0gY2xpZW50OworICBjb25uZWN0aW9uLmNsaWVudCA9IGNsaWVudDsKKyAgcmV0dXJuIGNsaWVudDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDc5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRGcmFtZWRUcmFuc3BvcnQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmluQnVmID0gYnVmZmVyIHx8IG5ldyBCdWZmZXIoMCk7CisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKKyAgdGhpcy5yZWFkUG9zID0gMDsKKyAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNlcWlkKSB7CisgIHZhciByZXNpZHVhbCA9IG51bGw7CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAvLyBQcmVwZW5kIGFueSByZXNpZHVhbCBkYXRhIGZyb20gb3VyIHByZXZpb3VzIHJlYWQKKyAgICBpZiAocmVzaWR1YWwpIHsKKyAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtyZXNpZHVhbCwgZGF0YV0pOworICAgICAgcmVzaWR1YWwgPSBudWxsOworICAgIH0KKworICAgIC8vIGZyYW1lZCB0cmFuc3BvcnQKKyAgICB3aGlsZSAoZGF0YS5sZW5ndGgpIHsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDQpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBieXRlcyB0byBjb250aW51ZSwgc2F2ZSBhbmQgcmVzdW1lIG9uIG5leHQgcGFja2V0CisgICAgICAgIHJlc2lkdWFsID0gZGF0YTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdmFyIGZyYW1lU2l6ZSA9IGJpbmFyeS5yZWFkSTMyKGRhdGEsIDApOworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCArIGZyYW1lU2l6ZSkgeworICAgICAgICAvLyBOb3QgZW5vdWdoIGJ5dGVzIHRvIGNvbnRpbnVlLCBzYXZlIGFuZCByZXN1bWUgb24gbmV4dCBwYWNrZXQKKyAgICAgICAgcmVzaWR1YWwgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmcmFtZSA9IGRhdGEuc2xpY2UoNCwgNCArIGZyYW1lU2l6ZSk7CisgICAgICByZXNpZHVhbCA9IGRhdGEuc2xpY2UoNCArIGZyYW1lU2l6ZSk7CisKKyAgICAgIGNhbGxiYWNrKG5ldyBURnJhbWVkVHJhbnNwb3J0KGZyYW1lKSwgc2VxaWQpOworCisgICAgICBkYXRhID0gcmVzaWR1YWw7CisgICAgICByZXNpZHVhbCA9IG51bGw7CisgICAgfQorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29tbWl0UG9zaXRpb24gPSBmdW5jdGlvbigpe30sCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXt9LAorCisgIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gIGZ1bmN0aW9uKCkge307CisKKyAgLy8gU2V0IHRoZSBzZXFpZCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2xpZW50CisgIC8vIFNvIHRoYXQgY2FsbGJhY2tzIGNhbiBiZSBmb3VuZAorVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0Q3VyclNlcUlkID0gZnVuY3Rpb24oc2VxaWQpIHsKKyAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkUG9zICsgbGVuID4gdGhpcy5pbkJ1Zi5sZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsgLy8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggZnJhbWVzLgorICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgZW5kID0gdGhpcy5yZWFkUG9zICsgbGVuOworCisgIGlmICh0aGlzLmluQnVmLmxlbmd0aCA8IGVuZCkgeworICAgIHRocm93IG5ldyBFcnJvcigncmVhZCgnICsgbGVuICsgJykgZmFpbGVkIC0gbm90IGVub3VnaCBkYXRhJyk7CisgIH0KKworICB2YXIgYnVmID0gdGhpcy5pbkJ1Zi5zbGljZSh0aGlzLnJlYWRQb3MsIGVuZCk7CisgIHRoaXMucmVhZFBvcyA9IGVuZDsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDEpOworICByZXR1cm4gYmluYXJ5LnJlYWRCeXRlKHRoaXMuaW5CdWZbdGhpcy5yZWFkUG9zKytdKTsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMik7CisgIHZhciBpMTYgPSBiaW5hcnkucmVhZEkxNih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gMjsKKyAgcmV0dXJuIGkxNjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoOCk7CisgIHZhciBkID0gYmluYXJ5LnJlYWREb3VibGUodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKKyAgdGhpcy5yZWFkUG9zICs9IDg7CisgIHJldHVybiBkOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKGxlbikgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgc3RyID0gdGhpcy5pbkJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucmVhZFBvcywgdGhpcy5yZWFkUG9zICsgbGVuKTsKKyAgdGhpcy5yZWFkUG9zICs9IGxlbjsKKyAgcmV0dXJuIHN0cjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIGJ1ZjogdGhpcy5pbkJ1ZiwKKyAgICByZWFkSW5kZXg6IHRoaXMucmVhZFBvcywKKyAgICB3cml0ZUluZGV4OiB0aGlzLmluQnVmLmxlbmd0aAorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uKGJ5dGVzQ29uc3VtZWQpIHsKKyAgdGhpcy5yZWFkUG9zICs9IGJ5dGVzQ29uc3VtZWQ7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZiwgZW5jb2RpbmcpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCBlbmNvZGluZyB8fCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIC8vIElmIHRoZSBzZXFpZCBvZiB0aGUgY2FsbGJhY2sgaXMgYXZhaWxhYmxlIHBhc3MgaXQgdG8gdGhlIG9uRmx1c2gKKyAgLy8gVGhlbiByZW1vdmUgdGhlIGN1cnJlbnQgc2VxaWQKKyAgdmFyIHNlcWlkID0gdGhpcy5fc2VxaWQ7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKKworICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKKyAgICAgIHBvcyA9IDA7CisgIHRoaXMub3V0QnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZikgeworICAgIGJ1Zi5jb3B5KG91dCwgcG9zLCAwKTsKKyAgICBwb3MgKz0gYnVmLmxlbmd0aDsKKyAgfSk7CisKKyAgaWYgKHRoaXMub25GbHVzaCkgeworICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgYmV0dGVyLCBhbGxvY2F0ZSBvbmUgYnVmZmVyIGluc3RlYWQgb2YgYm90aDoKKyAgICB2YXIgbXNnID0gbmV3IEJ1ZmZlcihvdXQubGVuZ3RoICsgNCk7CisgICAgYmluYXJ5LndyaXRlSTMyKG1zZywgb3V0Lmxlbmd0aCk7CisgICAgb3V0LmNvcHkobXNnLCA0LCAwLCBvdXQubGVuZ3RoKTsKKyAgICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgICAvLyBQYXNzaW5nIHNlcWlkIHRocm91Z2ggdGhpcyBjYWxsIHRvIGdldCBpdCB0byB0aGUgY29ubmVjdGlvbgorICAgICAgdGhpcy5vbkZsdXNoKG1zZywgc2VxaWQpOworICAgIH0KKyAgfQorCisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJhYjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyOwordmFyIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQ29ubmVjdE9wdGlvbnMKKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmFuc3BvcnQgLSBUaGUgVGhyaWZ0IGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoVEJ1ZmZlcmVkVHJhbnNwb3J0LCBldGMpLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sIC0gVGhlIFRocmlmdCBzZXJpYWxpemF0aW9uIHByb3RvY29sIHRvIHVzZSAoVEJpbmFyeVByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIFBPU1QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBodHRwcyAtIFRydWUgY2F1c2VzIHRoZSBjb25uZWN0aW9uIHRvIHVzZSBodHRwcywgb3RoZXJ3aXNlIGh0dHAgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBub2RlT3B0aW9ucyAtIE9wdGlvbnMgcGFzc2VkIG9uIHRvIG5vZGUuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgY29ubmVjdGlvbiB0aGF0IHJlcXVpcmVzIHNzbC90bHMsIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciBlYWNoIHJlcXVlc3QsCisgKiAgICAgLy8gIHVzZXMgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBsYXllciwgdXNlcyB0aGUgSlNPTiBwcm90b2NvbCBhbmQgZGlyZWN0cyBSUEMgdHJhZmZpYworICogICAgIC8vICB0byBodHRwczovL3RocmlmdC5leGFtcGxlLmNvbTo5MDkwL2hlbGxvCisgKiAgICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICogICAgIHZhciBvcHRpb25zID0geworICogICAgICAgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAqICAgICAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgKiAgICAgICAgcGF0aDogIi9oZWxsbyIsCisgKiAgICAgICAgaGVhZGVyczogeyJDb25uZWN0aW9uIjogImNsb3NlIn0sCisgKiAgICAgICAgaHR0cHM6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oInRocmlmdC5leGFtcGxlLmNvbSIsIDkwOTAsIG9wdGlvbnMpOworICogICAgIHZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSHR0cENvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVIdHRwQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCisgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCisgKiBAZXZlbnQge2Vycm9yfSBUaGUgImVycm9yIiBldmVudCBpcyBmaXJlZCB3aGVuIGEgTm9kZS5qcyBlcnJvciBldmVudCBvY2N1cnMgZHVyaW5nCisgKiAgICAgcmVxdWVzdCBvciByZXNwb25zZSBwcm9jZXNzaW5nLCBpbiB3aGljaCBjYXNlIHRoZSBub2RlIGVycm9yIGlzIHBhc3NlZCBvbi4gQW4gImVycm9yIgorICogICAgIGV2ZW50IG1heSBhbHNvIGJlIGZpcmVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBIdHRwQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgb3ZlciB0aGUgTm9kZS5qcyBodHRwLnJlcXVlc3QoKSBtZXRob2QuCisgKiBAc2VlIHtAbGluayBjcmVhdGVIdHRwQ29ubmVjdGlvbn0KKyAqLwordmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CisgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOworCisgIC8vU2V0IGNvbmZpZ3VyYXRpb24KKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLmhvc3QgPSB0aGlzLm9wdGlvbnMuaG9zdDsKKyAgdGhpcy5wb3J0ID0gdGhpcy5vcHRpb25zLnBvcnQ7CisgIHRoaXMuc29ja2V0UGF0aCA9IHRoaXMub3B0aW9ucy5zb2NrZXRQYXRoOworICB0aGlzLmh0dHBzID0gdGhpcy5vcHRpb25zLmh0dHBzIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKKworICAvL1ByZXBhcmUgTm9kZS5qcyBvcHRpb25zCisgIHRoaXMubm9kZU9wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCwKKyAgICBzb2NrZXRQYXRoOiB0aGlzLnNvY2tldFBhdGgsCisgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgJy8nLAorICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IHt9LAorICAgIHJlc3BvbnNlVHlwZTogdGhpcy5vcHRpb25zLnJlc3BvbnNlVHlwZSB8fCBudWxsCisgIH07CisgIGZvciAodmFyIGF0dHJuYW1lIGluIHRoaXMub3B0aW9ucy5ub2RlT3B0aW9ucykgeworICAgIHRoaXMubm9kZU9wdGlvbnNbYXR0cm5hbWVdID0gdGhpcy5vcHRpb25zLm5vZGVPcHRpb25zW2F0dHJuYW1lXTsKKyAgfQorICAvKmpzaGludCAtVzA2OSAqLworICBpZiAoISB0aGlzLm5vZGVPcHRpb25zLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSkgeworICAgIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2tlZXAtYWxpdmUnOworICB9CisgIC8qanNoaW50ICtXMDY5ICovCisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworCisgIGZ1bmN0aW9uIGRlY29kZUNhbGxiYWNrKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgICB2YXIgcHJvdG8gPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKKyAgICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAgIC8vICBvYmplY3RzLgorICAgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKKyAgICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgICAgLy8gIHNob3VsZCBicmluZyB0aGlzIHN0dWZmIGlubGluZSB3aXRoIHR5cGljYWwgdGhyaWZ0IEkvTyBzdGFjaworICAgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAgIC8vICAtLXJhCisgICAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIH0KKyAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgICAgaWYoY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKSB7CisgICAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvL1Jlc3BvbnNlIGhhbmRsZXIKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgdGhpcy5yZXNwb25zZUNhbGxiYWNrID0gZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICB2YXIgZGF0YSA9IFtdOworICAgIHZhciBkYXRhTGVuID0gMDsKKworICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHsKKyAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpKTsKKyAgICB9CisKKyAgICByZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGUpOworICAgIH0pOworCisgICAgLy8gV2hlbiBydW5uaW5nIGRpcmVjdGx5IHVuZGVyIG5vZGUsIGNodW5rIHdpbGwgYmUgYSBidWZmZXIsCisgICAgLy8gaG93ZXZlciwgd2hlbiBydW5uaW5nIGluIGEgQnJvd3NlciAoZS5nLiBCcm93c2VyaWZ5KSwgY2h1bmsKKyAgICAvLyB3aWxsIGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5QnVmZmVyLgorICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7CisgICAgICBpZiAoKHR5cGVvZiBjaHVuayA9PSAnc3RyaW5nJykgfHwKKyAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNodW5rKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgICAgIC8vIFdyYXAgQXJyYXlCdWZmZXIvc3RyaW5nIGluIGEgQnVmZmVyIHNvIGRhdGFbaV0uY29weSB3aWxsIHdvcmsKKyAgICAgICAgZGF0YS5wdXNoKG5ldyBCdWZmZXIoY2h1bmspKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEucHVzaChjaHVuayk7CisgICAgICB9CisgICAgICBkYXRhTGVuICs9IGNodW5rLmxlbmd0aDsKKyAgICB9KTsKKworICAgIHJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbigpeworICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZGF0YUxlbik7CisgICAgICBmb3IgKHZhciBpPTAsIGxlbj1kYXRhLmxlbmd0aCwgcG9zPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXS5jb3B5KGJ1ZiwgcG9zKTsKKyAgICAgICAgcG9zICs9IGRhdGFbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgLy9HZXQgdGhlIHJlY2VpdmVyIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNwb3J0IGFuZAorICAgICAgLy8gIGNhbGwgaXQgd2l0aCB0aGUgYnVmZmVyCisgICAgICBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihkZWNvZGVDYWxsYmFjaykoYnVmKTsKKyAgICB9KTsKKyAgfTsKK307Cit1dGlsLmluaGVyaXRzKEh0dHBDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCisvKioKKyAqIFdyaXRlcyBUaHJpZnQgbWVzc2FnZSBkYXRhIHRvIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIEEgTm9kZS5qcyBCdWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZQorICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS4KKyAqIEBldmVudCB7ZXJyb3J9IHRoZSAiZXJyb3IiIGV2ZW50IGlzIHJhaXNlZCB1cG9uIHJlcXVlc3QgZmFpbHVyZSBwYXNzaW5nIHRoZQorICogICAgIE5vZGUuanMgZXJyb3Igb2JqZWN0IHRvIHRoZSBsaXN0ZW5lci4KKyAqLworSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHZhciBvcHRzID0gc2VsZi5ub2RlT3B0aW9uczsKKyAgb3B0cy5oZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdID0gZGF0YS5sZW5ndGg7CisgIGlmICghb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKKyAgICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsgIAorICB2YXIgcmVxID0gKHNlbGYuaHR0cHMpID8KKyAgICAgIGh0dHBzLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKSA6CisgICAgICBodHRwLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKTsKKyAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOworICB9KTsKKyAgcmVxLndyaXRlKGRhdGEpOworICByZXEuZW5kKCk7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgSHR0cENvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAcmV0dXJucyB7SHR0cENvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIENvbm5lY3RPcHRpb25zfQorICovCitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICBvcHRpb25zLmhvc3QgPSBob3N0OworICBvcHRpb25zLnBvcnQgPSBwb3J0IHx8IDgwOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgb3B0aW9ucy5zb2NrZXRQYXRoID0gcGF0aDsKKyAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlSHR0cENsaWVudCA9IGNyZWF0ZUNsaWVudAorCisKK2Z1bmN0aW9uIFRIVFRQRXhjZXB0aW9uKHJlc3BvbnNlKSB7CisgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTsKKyAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICB0aGlzLnR5cGUgPSB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5QUk9UT0NPTF9FUlJPUjsKKyAgdGhpcy5tZXNzYWdlID0gIlJlY2VpdmVkIGEgcmVzcG9uc2Ugd2l0aCBhIGJhZCBIVFRQIHN0YXR1cyBjb2RlOiAiICsgcmVzcG9uc2Uuc3RhdHVzQ29kZTsKK30KK3V0aWwuaW5oZXJpdHMoVEhUVFBFeGNlcHRpb24sIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCmluZGV4IGY0ZmEzY2QuLmIwOTk1M2QgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKQEAgLTE4LDkgKzE4LDU3IEBACiAgKi8KIGV4cG9ydHMuVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIAordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7CitleHBvcnRzLnNldExvZ0Z1bmMgPSBsb2cuc2V0TG9nRnVuYzsKK2V4cG9ydHMuc2V0TG9nTGV2ZWwgPSBsb2cuc2V0TG9nTGV2ZWw7CitleHBvcnRzLmdldExvZ0xldmVsID0gbG9nLmdldExvZ0xldmVsOworCiB2YXIgY29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vY29ubmVjdGlvbicpOwogZXhwb3J0cy5Db25uZWN0aW9uID0gY29ubmVjdGlvbi5Db25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZUNsaWVudDsKIGV4cG9ydHMuY3JlYXRlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlVURTQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU1NMQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlU3RkSU9DbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ2xpZW50OworZXhwb3J0cy5jcmVhdGVTdGRJT0Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbjsKIAotZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpLmNyZWF0ZVNlcnZlcjsKK3ZhciBodHRwQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vaHR0cF9jb25uZWN0aW9uJyk7CitleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ2xpZW50OworCit2YXIgd3NDb25uZWN0aW9uID0gcmVxdWlyZSgnLi93c19jb25uZWN0aW9uJyk7CitleHBvcnRzLldTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5XU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5jcmVhdGVXU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ2xpZW50ID0gd3NDb25uZWN0aW9uLmNyZWF0ZVdTQ2xpZW50OworCit2YXIgeGhyQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4veGhyX2Nvbm5lY3Rpb24nKTsKK2V4cG9ydHMuWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDbGllbnQ7CisKK3ZhciBzZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpOworZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlU2VydmVyOworZXhwb3J0cy5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlTXVsdGlwbGV4U2VydmVyOworCit2YXIgd2ViX3NlcnZlciA9IHJlcXVpcmUoJy4vd2ViX3NlcnZlcicpOworZXhwb3J0cy5jcmVhdGVXZWJTZXJ2ZXIgPSB3ZWJfc2VydmVyLmNyZWF0ZVdlYlNlcnZlcjsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK2V4cG9ydHMuUSA9IHJlcXVpcmUoJ3EnKTsKKwordmFyIG1wcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpOwordmFyIG1wcm90b2NvbCA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKTsKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSBtcHJvdG9jb2wuTXVsdGlwbGV4ZXI7CitleHBvcnRzLk11bHRpcGxleGVkUHJvY2Vzc29yID0gbXByb2Nlc3Nvci5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyoKKyAqIEV4cG9ydCB0cmFuc3BvcnQgYW5kIHByb3RvY29sIHNvIHRoZXkgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiBhCisgKiBjYXNzYW5kcmEvc2VydmVyIGNvbnRleHQKKyAqLworZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9mcmFtZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK2V4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NTVlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCJ1dGlsIik7CisKK21vZHVsZS5leHBvcnRzID0gSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yOworCitmdW5jdGlvbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IobWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKKwordXRpbC5pbmhlcml0cyhJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsIEVycm9yKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ludDY0X3V0aWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOworCit2YXIgSW50NjRVdGlsID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsKKwordmFyIFBPVzJfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XMl8zMSA9IE1hdGgucG93KDIsIDMxKTsKK3ZhciBQT1cyXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPVzEwXzExID0gTWF0aC5wb3coMTAsIDExKTsKKworSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKGk2NCkgeworICB2YXIgYiA9IGk2NC5idWZmZXI7CisgIHZhciBvID0gaTY0Lm9mZnNldDsKKyAgaWYgKCghYltvXSAmJiAhKGJbbyArIDFdICYgMHhlMCkpIHx8CisgICAgICAoIX5iW29dICYmICF+KGJbbyArIDFdICYgMHhlMCkpKSB7CisgICAgLy8gVGhlIG1hZ25pdHVkZSBpcyBzbWFsbCBlbm91Z2guCisgICAgcmV0dXJuIGk2NC50b1N0cmluZygpOworICB9IGVsc2UgeworICAgIHZhciBuZWdhdGl2ZSA9IGJbb10gJiAweDgwOworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIHZhciBpbmNyZW1lbnRlZCA9IGZhbHNlOworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIoOCk7CisgICAgICBmb3IgKHZhciBpID0gNzsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gKH5iW28gKyBpXSArIChpbmNyZW1lbnRlZCA/IDAgOiAxKSkgJiAweGZmOworICAgICAgICBpbmNyZW1lbnRlZCB8PSBiW28gKyBpXTsKKyAgICAgIH0KKyAgICAgIGIgPSBidWZmZXI7CisgICAgfQorICAgIHZhciBoaWdoMiA9IGJbbyArIDFdICsgKGJbb10gPDwgOCk7CisgICAgLy8gTGVzc2VyIDExIGRpZ2l0cyB3aXRoIGV4Y2VlZGluZyB2YWx1ZXMgYnV0IGlzIHVuZGVyIDUzIGJpdHMgY2FwYWNpdHkuCisgICAgdmFyIGxvdyA9IGJbbyArIDddICsgKGJbbyArIDZdIDw8IDgpICsgKGJbbyArIDVdIDw8IDE2KQorICAgICAgICArIGJbbyArIDRdICogUE9XMl8yNCAgLy8gQml0IHNoaWZ0IHJlbmRlcnMgMzJ0aCBiaXQgYXMgc2lnbiwgc28gdXNlIG11bHRpcGxpY2F0aW9uCisgICAgICAgICsgKGJbbyArIDNdICsgKGJbbyArIDJdIDw8IDgpKSAqIFBPVzJfMzIgKyBoaWdoMiAqIDc0OTc2NzEwNjU2OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAlIDEwXjExCisgICAgLy8gMTJ0aCBkaWdpdCBhbmQgZ3JlYXRlci4KKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMTBfMTEpICsgaGlnaDIgKiAyODE0OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAvIDEwXjExCisgICAgLy8gTWFrZSBpdCBleGFjdGx5IDExIHdpdGggbGVhZGluZyB6ZXJvcy4KKyAgICBsb3cgPSAoJzAwMDAwMDAwMDAwJyArIFN0cmluZyhsb3cgJSBQT1cxMF8xMSkpLnNsaWNlKC0xMSk7CisgICAgcmV0dXJuIChuZWdhdGl2ZSA/ICctJyA6ICcnKSArIFN0cmluZyhoaWdoKSArIGxvdzsKKyAgfQorfTsKKworSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nID0gZnVuY3Rpb24odGV4dCkgeworICB2YXIgbmVnYXRpdmUgPSB0ZXh0LmNoYXJBdCgwKSA9PT0gJy0nOworICBpZiAodGV4dC5sZW5ndGggPCAobmVnYXRpdmUgPyAxNyA6IDE2KSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGxlciB0aGFuIDJeNTMuCisgICAgcmV0dXJuIG5ldyBJbnQ2NCgrdGV4dCk7CisgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPiAobmVnYXRpdmUgPyAyMCA6IDE5KSkgeworICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUb28gbWFueSBkaWdpdHMgZm9yIEludDY0OiAnICsgdGV4dCk7CisgIH0gZWxzZSB7CisgICAgLy8gTW9zdCBzaWduaWZpY2FudCAodXAgdG8gNSkgZGlnaXRzCisgICAgdmFyIGhpZ2g1ID0gK3RleHQuc2xpY2UobmVnYXRpdmUgPyAxIDogMCwgLTE1KTsKKyAgICB2YXIgbG93ID0gK3RleHQuc2xpY2UoLTE1KSArIGhpZ2g1ICogMjc2NDQ3MjMyMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1ICUgMl4zMgorICAgIHZhciBoaWdoID0gTWF0aC5mbG9vcihsb3cgLyBQT1cyXzMyKSArIGhpZ2g1ICogMjMyODMwOyAgLy8gVGhlIGxpdGVyYWwgaXMgMTBeMTUgLyAyXiYzMgorICAgIGxvdyA9IGxvdyAlIFBPVzJfMzI7CisgICAgaWYgKGhpZ2ggPj0gUE9XMl8zMSAmJgorICAgICAgICAhKG5lZ2F0aXZlICYmIGhpZ2ggPT0gUE9XMl8zMSAmJiBsb3cgPT0gMCkgIC8vIEFsbG93IG1pbmltdW0gSW50NjQKKyAgICAgICApIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWFnbml0dWRlIGlzIHRvbyBsYXJnZSBmb3IgSW50NjQuJyk7CisgICAgfQorICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIGhpZ2ggPSB+aGlnaDsKKyAgICAgIGlmIChsb3cgPT09IDApIHsKKyAgICAgICAgaGlnaCA9IChoaWdoICsgMSkgJiAweGZmZmZmZmZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG93ID0gfmxvdyArIDE7CisgICAgICB9CisgICAgICBoaWdoID0gMHg4MDAwMDAwMCB8IGhpZ2g7CisgICAgfQorICAgIHJldHVybiBuZXcgSW50NjQoaGlnaCwgbG93KTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMGJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogSW1wb3J0ZWQgZnJvbSBEb3VnbGFzIENyb2NrZm9yZCdzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG1pbmltdW0gbW9kaWZpY2F0aW9uCisgKiB0byBoYW5kbGUgSW50NjQuCisgKgorICogaHR0cHM6Ly9naXRodWIuY29tL2RvdWdsYXNjcm9ja2ZvcmQvSlNPTi1qcy9ibG9iL2M5ODk0OGFlMTk0NGEyOGUyZThlYmMzNzE3ODk0ZTU4MGFlYWFhMDUvanNvbl9wYXJzZS5qcworICoKKyAqIE9yaWdpbmFsIGxpY2Vuc2UgaGVhZGVyOgorICoKKyAqIGpzb25fcGFyc2UuanMKKyAqIDIwMTUtMDUtMDIKKyAqIFB1YmxpYyBEb21haW4uCisgKiBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisgKi8KKworCisvKmpzbGludCBmb3IgKi8KKworLypwcm9wZXJ0eQorICAgIGF0LCBiLCBjYWxsLCBjaGFyQXQsIGYsIGZyb21DaGFyQ29kZSwgaGFzT3duUHJvcGVydHksIG1lc3NhZ2UsIG4sIG5hbWUsCisgICAgcHJvdG90eXBlLCBwdXNoLCByLCB0LCB0ZXh0CisqLworCit2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Cit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7CisKK3ZhciBqc29uX3BhcnNlID0gbW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIHBhcnNlIGEgSlNPTiB0ZXh0LCBwcm9kdWNpbmcgYSBKYXZhU2NyaXB0CisvLyBkYXRhIHN0cnVjdHVyZS4gSXQgaXMgYSBzaW1wbGUsIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4gSXQgZG9lcyBub3QgdXNlCisvLyBldmFsIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgbW9kZWwgZm9yIGltcGxlbWVudGluZworLy8gYSBKU09OIHBhcnNlciBpbiBvdGhlciBsYW5ndWFnZXMuCisKKy8vIFdlIGFyZSBkZWZpbmluZyB0aGUgZnVuY3Rpb24gaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcKKy8vIGdsb2JhbCB2YXJpYWJsZXMuCisKKyAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGNoLCAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGVzY2FwZWUgPSB7CisgICAgICAgICAgICAnIic6ICciJywKKyAgICAgICAgICAgICdcXCc6ICdcXCcsCisgICAgICAgICAgICAnLyc6ICcvJywKKyAgICAgICAgICAgIGI6ICdcYicsCisgICAgICAgICAgICBmOiAnXGYnLAorICAgICAgICAgICAgbjogJ1xuJywKKyAgICAgICAgICAgIHI6ICdccicsCisgICAgICAgICAgICB0OiAnXHQnCisgICAgICAgIH0sCisgICAgICAgIHRleHQsCisKKyAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgeworCisvLyBDYWxsIGVycm9yIHdoZW4gc29tZXRoaW5nIGlzIHdyb25nLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IobSk7CisgICAgICAgIH0sCisKKyAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIChjKSB7CisKKy8vIElmIGEgYyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHZlcmlmeSB0aGF0IGl0IG1hdGNoZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorCisgICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBjaCkgeworICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIGMgKyAiJyBpbnN0ZWFkIG9mICciICsgY2ggKyAiJyIpOworICAgICAgICAgICAgfQorCisvLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMsCisvLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KKworICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CisgICAgICAgICAgICBhdCArPSAxOworICAgICAgICAgICAgcmV0dXJuIGNoOworICAgICAgICB9LAorCisgICAgICAgIG51bWJlciA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBudW1iZXIgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBudW1iZXIsCisgICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOworICAgICAgICAgICAgICAgIG5leHQoJy0nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9ICcuJzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bWJlciA9ICtzdHJpbmc7CisgICAgICAgICAgICBpZiAoIWlzRmluaXRlKG51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG51bWJlciIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPj0gSW50NjQuTUFYX0lOVCB8fCBudW1iZXIgPD0gSW50NjQuTUlOX0lOVCkgeworICAgICAgICAgICAgICAgIC8vIFJldHVybiByYXcgc3RyaW5nIGZvciBmdXJ0aGVyIHByb2Nlc3MgaW4gVEpTT05Qcm90b2NvbAorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIHN0cmluZyB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGhleCwKKyAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnLAorICAgICAgICAgICAgICAgIHVmZmZmOworCisvLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgIiBhbmQgXCBjaGFyYWN0ZXJzLgorCisgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd1JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9IHBhcnNlSW50KG5leHQoKSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gdWZmZmYgKiAxNiArIGhleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodWZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXNjYXBlZVtjaF0gPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CisgICAgICAgIH0sCisKKyAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFNraXAgd2hpdGVzcGFjZS4KKworICAgICAgICAgICAgd2hpbGUgKGNoICYmIGNoIDw9ICcgJykgeworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgeworCisvLyB0cnVlLCBmYWxzZSwgb3IgbnVsbC4KKworICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgbmV4dCgndCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKKyAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CisgICAgICAgICAgICAgICAgbmV4dCgnZScpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgbmV4dCgnZicpOworICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgncycpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICBuZXh0KCduJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKKyAgICAgICAgfSwKKworICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgorCisgICAgICAgIGFycmF5ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBhcnJheSB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ1snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgnWycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgYXJyYXkiKTsKKyAgICAgICAgfSwKKworICAgICAgICBvYmplY3QgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGFuIG9iamVjdCB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGtleSwKKyAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKKworICAgICAgICAgICAgaWYgKGNoID09PSAneycpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CisgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7ICAgLy8gZW1wdHkgb2JqZWN0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOworICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRHVwbGljYXRlIGtleSAiJyArIGtleSArICciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXh0KCcsJyk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIkJhZCBvYmplY3QiKTsKKyAgICAgICAgfTsKKworICAgIHZhbHVlID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIEpTT04gdmFsdWUuIEl0IGNvdWxkIGJlIGFuIG9iamVjdCwgYW4gYXJyYXksIGEgc3RyaW5nLCBhIG51bWJlciwKKy8vIG9yIGEgd29yZC4KKworICAgICAgICB3aGl0ZSgpOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpOworICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgIHJldHVybiBhcnJheSgpOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKKyAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICByZXR1cm4gbnVtYmVyKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JworICAgICAgICAgICAgICAgID8gbnVtYmVyKCkKKyAgICAgICAgICAgICAgICA6IHdvcmQoKTsKKyAgICAgICAgfQorICAgIH07CisKKy8vIFJldHVybiB0aGUganNvbl9wYXJzZSBmdW5jdGlvbi4gSXQgd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgb2YgdGhlIGFib3ZlCisvLyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcy4KKworICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7CisgICAgICAgIHZhciByZXN1bHQ7CisKKyAgICAgICAgdGV4dCA9IHNvdXJjZTsKKyAgICAgICAgYXQgPSAwOworICAgICAgICBjaCA9ICcgJzsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWUoKTsKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgICBlcnJvcigiU3ludGF4IGVycm9yIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07Cit9KCkpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdhM2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKQEAgLTAsMCArMSw4MDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOwordmFyIHV0aWwgPSByZXF1aXJlKCJ1dGlsIik7CisKK3ZhciBJbnQ2NFV0aWwgPSByZXF1aXJlKCcuL2ludDY0X3V0aWwnKTsKK3ZhciBqc29uX3BhcnNlID0gcmVxdWlyZSgnLi9qc29uX3BhcnNlJyk7CisKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRKU09OUHJvdG9jb2w7CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFucyAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgKiBAY2xhc3NkZXNjIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2xzIHBlcmZvcm0gc2VyaWFsaXphdGlvbiB3aGljaCBlbmFibGVzIGNyb3NzCisgKiBsYW5ndWFnZSBSUEMuIFRoZSBQcm90b2NvbCB0eXBlIGlzIHRoZSBKYXZhU2NyaXB0IGJyb3dzZXIgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IFRKU09OUHJvdG9jb2wuCisgKiBAZXhhbXBsZQorICogICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgKi8KK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50c3RhY2sgPSBbXTsKKyAgdGhpcy50cG9zID0gW107CisgIHRoaXMudHJhbnMgPSB0cmFuczsKK307CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIElkIHRvIHN0cmluZyBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVEpTT05Qcm90b2NvbC5UeXBlID0ge307CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5CT09MXSA9ICcidGYiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkJZVEVdID0gJyJpOCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuSTE2XSA9ICciaTE2Iic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5JMzJdID0gJyJpMzIiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkk2NF0gPSAnImk2NCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuRE9VQkxFXSA9ICciZGJsIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TVFJVQ1RdID0gJyJyZWMiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLlNUUklOR10gPSAnInN0ciInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuTUFQXSA9ICcibWFwIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5MSVNUXSA9ICcibHN0Iic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TRVRdID0gJyJzZXQiJzsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUSlNPTlByb3RvY29sLlJUeXBlID0ge307CitUSlNPTlByb3RvY29sLlJUeXBlLnRmID0gVHlwZS5CT09MOworVEpTT05Qcm90b2NvbC5SVHlwZS5pOCA9IFR5cGUuQllURTsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTE2ID0gVHlwZS5JMTY7CitUSlNPTlByb3RvY29sLlJUeXBlLmkzMiA9IFR5cGUuSTMyOworVEpTT05Qcm90b2NvbC5SVHlwZS5pNjQgPSBUeXBlLkk2NDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuZGJsID0gVHlwZS5ET1VCTEU7CitUSlNPTlByb3RvY29sLlJUeXBlLnJlYyA9IFR5cGUuU1RSVUNUOworVEpTT05Qcm90b2NvbC5SVHlwZS5zdHIgPSBUeXBlLlNUUklORzsKK1RKU09OUHJvdG9jb2wuUlR5cGUubWFwID0gVHlwZS5NQVA7CitUSlNPTlByb3RvY29sLlJUeXBlLmxzdCA9IFR5cGUuTElTVDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuc2V0ID0gVHlwZS5TRVQ7CisKKy8qKgorICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgKiBAcmVhZG9ubHkKKyAqIEBjb25zdCB7bnVtYmVyfSBWZXJzaW9uCisgKiBAbWVtYmVyb2YgVGhyaWZ0LlByb3RvY29sCisgKi8KK1RKU09OUHJvdG9jb2wuVmVyc2lvbiA9IDE7CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSA9IGZ1bmN0aW9uKCkgeworICBpZiAodGhpcy50c3RhY2subGVuZ3RoID09PSAxKSB7CisgICAgdGhpcy50cmFucy53cml0ZSh0aGlzLnRzdGFjay5wb3AoKSk7CisgIH0KK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCkgeworICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlZlcnNpb24sICciJyArIG5hbWUgKyAnIicsIG1lc3NhZ2VUeXBlLCBzZXFpZF0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisgIHRoaXMud29iai5wdXNoKG9iaik7CisKKyAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKKworICAvLyB3ZSBhc3N1bWUgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGNvbWUgc28gd2Ugd3JpdGUKKyAgdGhpcy50cmFucy53cml0ZSh0aGlzLndidWYpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goe30pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworICB2YXIgc3RydWN0ID0gdGhpcy50c3RhY2tbcF07CisgIHZhciBzdHIgPSAneyc7CisgIHZhciBmaXJzdCA9IHRydWU7CisgIGZvciAodmFyIGtleSBpbiBzdHJ1Y3QpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAnLCc7CisgICAgfQorCisgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOworICB9CisKKyAgc3RyICs9ICd9JzsKKyAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHtUaHJpZnQuUHJvdG9jb2wuVHlwZX0gZmllbGRUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpIHsKKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaCh7ICdmaWVsZElkJzogJyInICsKKyAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVEpTT05Qcm90b2NvbC5UeXBlW2ZpZWxkVHlwZV0KKyAgfSk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciB2YWx1ZSA9IHRoaXMudHN0YWNrLnBvcCgpOworICB2YXIgZmllbGRJbmZvID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgaWYgKCc6JyArIHZhbHVlID09PSAiOltvYmplY3QgT2JqZWN0XSIpIHsKKyAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICd9JzsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOworICB9CisgIHRoaXMudHBvcy5wb3AoKTsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgZmllbGRzIGZvciBhIHN0cnVjdC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwIGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBrZXlUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcCAoaWdub3JlZCkuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIC8vc2l6ZSBpcyBpbnZhbGlkLCB3ZSdsbCBzZXQgaXQgb24gZW5kLgorICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlR5cGVba2V5VHlwZV0sIFRKU09OUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwgMF0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIGlmIChwID09IHRoaXMudHN0YWNrLmxlbmd0aCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goJycpOworICB9CisKKyAgdmFyIHNpemUgPSAodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpIC8gMjsKKworICB0aGlzLnRzdGFja1twXVt0aGlzLnRzdGFja1twXS5sZW5ndGggLSAxXSA9IHNpemU7CisKKyAgdmFyIG1hcCA9ICd9JzsKKyAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbWFwID0gJywnICsgbWFwOworICAgIH0KKworICAgIGlmICghIGlzTmFOKGspKSB7IGsgPSAnIicgKyBrICsgJyInOyB9IC8vanNvbiAia2V5cyIgbmVlZCB0byBiZSBzdHJpbmdzCisgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7CisgIH0KKyAgbWFwID0gJ3snICsgbWFwOworCisgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKKyAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgdmFyIHRtcFZhbCA9IHRoaXMudHN0YWNrW3AgKyAxXTsKKyAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgfQorCisgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7CisgIH0KKworICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgeworICB0aGlzLnRzdGFjay5wdXNoKGJvb2wgPyAxIDogMCk7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgeworICB0aGlzLnRzdGFjay5wdXNoKGJ5dGUpOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7CisgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgeworICB0aGlzLnRzdGFjay5wdXNoKGkzMik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgaWYgKGk2NCBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgdGhpcy50c3RhY2sucHVzaChJbnQ2NFV0aWwudG9EZWNpbWFsU3RyaW5nKGk2NCkpOworICB9IGVsc2UgeworICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgfQorfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHN0YWNrLnB1c2goZHViKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICAvLyBXZSBkbyBub3QgZW5jb2RlIHVyaSBjb21wb25lbnRzIGZvciB3aXJlIHRyYW5zZmVyOgorICBpZiAoYXJnID09PSBudWxsKSB7CisgICAgICB0aGlzLnRzdGFjay5wdXNoKG51bGwpOworICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciBzdHIgPSBhcmc7CisgICAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlcikgeworICAgICAgICB2YXIgc3RyID0gYXJnLnRvU3RyaW5nKCd1dGY4Jyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICB9CisKKyAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgorICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKKyAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaDogXAorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzOiBcXAorICAgICAgICAgIC8qIEN1cnJlbnRseSBlc2NhcGVkIGZvcndhcmQgc2xhc2hlcyBicmVhayBUSlNPTlByb3RvY29sLgorICAgICAgICAgICAqIEFzIGl0IHN0YW5kcywgd2UgY2FuIHNpbXBseSBwYXNzIGZvcndhcmQgc2xhc2hlcyBpbnRvCisgICAgICAgICAgICogb3VyIHN0cmluZ3MgYWNyb3NzIHRoZSB3aXJlIHdpdGhvdXQgYmVpbmcgZXNjYXBlZC4KKyAgICAgICAgICAgKiBJIHRoaW5rIHRoaXMgaXMgdGhlIHByb3RvY29sJ3MgYnVnLCBub3QgdGhyaWZ0LmpzCisgICAgICAgICAgICogfSBlbHNlIGlmKGNoID09PSAnLycpIHsgICAvLyBhIHNpbmdsZSBmb3J3YXJkIHNsYXNoOiAvCisgICAgICAgICAgICogIGVzY2FwZWRTdHJpbmcgKz0gJ1xcLyc7ICAvLyB3cml0ZSBvdXQgYXMgXC8KKyAgICAgICAgICAgKiB9CisgICAgICAgICAgICovCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOworICB9Cit9OworCisvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYXJnLCAnYmluYXJ5Jyk7CisgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyIHx8CisgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSAgeworICAgIHZhciBidWYgPSBhcmc7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZUJpbmFyeSBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICB9CisgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnVmLnRvU3RyaW5nKCdiYXNlNjQnKSArICciJyk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnJzdGFjayA9IFtdOworICB0aGlzLnJwb3MgPSBbXTsKKworICAvL0JvcnJvdyB0aGUgaW5ib3VuZCB0cmFuc3BvcnQgYnVmZmVyIGFuZCBlbnN1cmUgZGF0YSBpcyBwcmVzZW50L2NvbnNpc3RlbnQKKyAgdmFyIHRyYW5zQnVmID0gdGhpcy50cmFucy5ib3Jyb3coKTsKKyAgaWYgKHRyYW5zQnVmLnJlYWRJbmRleCA+PSB0cmFuc0J1Zi53cml0ZUluZGV4KSB7CisgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOworICB9CisgIHZhciBjdXJzb3IgPSB0cmFuc0J1Zi5yZWFkSW5kZXg7CisKKyAgaWYgKHRyYW5zQnVmLmJ1ZltjdXJzb3JdICE9PSAweDVCKSB7IC8vWworICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIEpTT04gaW5wdXQsIG5vIG9wZW5pbmcgYnJhY2tldCIpOworICB9CisKKyAgLy9QYXJzZSBhIHNpbmdsZSBtZXNzYWdlICh0aGVyZSBtYXkgYmUgc2V2ZXJhbCBpbiB0aGUgYnVmZmVyKQorICAvLyAgVE9ETzogSGFuZGxlIGNoYXJhY3RlcnMgdXNpbmcgbXVsdGlwbGUgY29kZSB1bml0cworICBjdXJzb3IrKzsKKyAgdmFyIG9wZW5CcmFja2V0Q291bnQgPSAxOworICB2YXIgaW5TdHJpbmcgPSBmYWxzZTsKKyAgZm9yICg7IGN1cnNvciA8IHRyYW5zQnVmLndyaXRlSW5kZXg7IGN1cnNvcisrKSB7CisgICAgdmFyIGNociA9IHRyYW5zQnVmLmJ1ZltjdXJzb3JdOworICAgIC8vd2UgdXNlIGhleGEgY2hhcmNvZGUgaGVyZSBiZWNhdXNlIGRhdGFbaV0gcmV0dXJucyBhbiBpbnQgYW5kIG5vdCBhIGNoYXIKKyAgICBpZiAoaW5TdHJpbmcpIHsKKyAgICAgIGlmIChjaHIgPT09IDB4MjIpIHsgLy8iCisgICAgICAgIGluU3RyaW5nID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QykgeyAvL1wKKyAgICAgICAgLy9lc2NhcGVkIGNoYXJhY3Rlciwgc2tpcAorICAgICAgICBjdXJzb3IgKz0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGNociA9PT0gMHg1QikgeyAvL1sKKyAgICAgICAgb3BlbkJyYWNrZXRDb3VudCArPSAxOworICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUQpIHsgLy9dCisgICAgICAgIG9wZW5CcmFja2V0Q291bnQgLT0gMTsKKyAgICAgICAgaWYgKG9wZW5CcmFja2V0Q291bnQgPT09IDApIHsKKyAgICAgICAgICAvL2VuZCBvZiBqc29uIG1lc3NhZ2UgZGV0ZWN0ZWQKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4MjIpIHsgLy8iCisgICAgICAgIGluU3RyaW5nID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAob3BlbkJyYWNrZXRDb3VudCAhPT0gMCkgeworICAgIC8vIE1pc3NpbmcgY2xvc2luZyBicmFja2V0LiBDYW4gYmUgYnVmZmVyIHVuZGVycnVuLgorICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorCisgIC8vUmVjb25zdGl0dXRlIHRoZSBKU09OIG9iamVjdCBhbmQgY29udW1lIHRoZSBuZWNlc3NhcnkgYnl0ZXMKKyAgdGhpcy5yb2JqID0ganNvbl9wYXJzZSh0cmFuc0J1Zi5idWYuc2xpY2UodHJhbnNCdWYucmVhZEluZGV4LCBjdXJzb3IrMSkudG9TdHJpbmcoKSk7CisgIHRoaXMudHJhbnMuY29uc3VtZShjdXJzb3IgKyAxIC0gdHJhbnNCdWYucmVhZEluZGV4KTsKKworICAvL1ZlcmlmeSB0aGUgcHJvdG9jb2wgdmVyc2lvbgorICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpOworICBpZiAodmVyc2lvbiAhPSBUSlNPTlByb3RvY29sLlZlcnNpb24pIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIHRocmlmdCBwcm90b2NvbCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7CisgIH0KKworICAvL09iamVjdGlmeSB0aGUgdGhyaWZ0IG1lc3NhZ2Uge25hbWUvdHlwZS9zZXF1ZW5jZS1udW1iZXJ9IGZvciByZXR1cm4KKyAgLy8gYW5kIHRoZW4gc2F2ZSB0aGUgSlNPTiBvYmplY3QgaW4gcnN0YWNrCisgIHZhciByID0ge307CisgIHIuZm5hbWUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgci5tdHlwZSA9IHRoaXMucm9iai5zaGlmdCgpOworICByLnJzZXFpZCA9IHRoaXMucm9iai5zaGlmdCgpOworICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKTsKKyAgcmV0dXJuIHI7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtZXNzYWdlLiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCAoaWdub3JlZCkKKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgciA9IHt9OworICByLmZuYW1lID0gJyc7CisKKyAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCisgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXS5zaGlmdCgpKTsKKyAgfQorCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnJzdGFjay5wb3AoKTsKK307CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCAoYWx3YXlzICcnKS4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAqLworLyoqCisgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLgorICogQHJldHVybnMge0Fub25SZWFkRmllbGRCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHIgPSB7fTsKKworICB2YXIgZmlkID0gLTE7CisgIHZhciBmdHlwZSA9IFR5cGUuU1RPUDsKKworICAvL2dldCBhIGZpZWxkSWQKKyAgZm9yICh2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgaWYgKGYgPT09IG51bGwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZpZCA9IHBhcnNlSW50KGYsIDEwKTsKKyAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworCisgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgIC8vcmVtb3ZlIHNvIHdlIGRvbid0IHNlZSBpdCBhZ2FpbgorICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtmaWRdOworCisgICAgdGhpcy5yc3RhY2sucHVzaChmaWVsZCk7CisKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWQgIT0gLTEpIHsKKyAgICAvL3Nob3VsZCBvbmx5IGJlIDEgb2YgdGhlc2UgYnV0IHRoaXMgaXMgdGhlIG9ubHkKKyAgICAvL3dheSB0byBtYXRjaCBhIGtleQorICAgIGZvciAodmFyIGkgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgICAgaWYgKFRKU09OUHJvdG9jb2wuUlR5cGVbaV0gPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZ0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtpXTsKKyAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1baV07CisgICAgfQorICB9CisKKyAgci5mbmFtZSA9ICcnOworICByLmZ0eXBlID0gZnR5cGU7CisgIHIuZmlkID0gZmlkOworCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgZmllbGQuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKTsKKworICAvL2dldCBiYWNrIHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgc3RhY2sKKyAgd2hpbGUgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykgeworICAgIHRoaXMucnN0YWNrLnBvcCgpOworICB9Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRNYXBCZWdpblJldHVybgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0ga3R5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgKiBAcmV0dXJucyB7QW5vblJlYWRNYXBCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKKyAgdmFyIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgdGhpcy5yc3RhY2sucHVzaChtYXApOworICAgIG1hcCA9IGZpcnN0OworICAgIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgIH0KKworICB2YXIgciA9IHt9OworICByLmt0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtmaXJzdF07CisgIHIudnR5cGUgPSBUSlNPTlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKKyAgci5zaXplID0gbWFwLnNoaWZ0KCk7CisKKworICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yZWFkRmllbGRFbmQoKTsKK307CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBBbm9uUmVhZENvbEJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBldHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgKiBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGxpc3QgPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXTsKKworICB2YXIgciA9IHt9OworICByLmV0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOworICByLnNpemUgPSBsaXN0LnNoaWZ0KCk7CisKKyAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgdGhpcy5yc3RhY2sucHVzaChsaXN0LnNoaWZ0KCkpOworCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCkgLSAyOworICB2YXIgc3QgPSB0aGlzLnJzdGFjazsKKyAgc3QucG9wKCk7CisgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5ICYmIHN0Lmxlbmd0aCA+IHBvcyAmJiBzdFtwb3NdLmxlbmd0aCA+IDApIHsKKyAgICBzdC5wdXNoKHN0W3Bvc10uc2hpZnQoKSk7CisgIH0KK307CisKKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHNldC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRFbmQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpID09ICcxJzsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKGYpIHsKKyAgcmV0dXJuICt0aGlzLnJlYWRWYWx1ZSgpOworfQorCisvKiogUmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFsdWUgPSBmdW5jdGlvbihmKSB7CisgIGlmIChmID09PSB1bmRlZmluZWQpIHsKKyAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisgIH0KKworICB2YXIgciA9IHt9OworCisgIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHIudmFsdWUgPSBmLnNoaWZ0KCk7CisgICAgfQorICB9IGVsc2UgaWYgKCEoZiBpbnN0YW5jZW9mIEludDY0KSAmJiBmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgICAgZm9yICh2YXIgaSBpbiBmKSB7CisgICAgICBpZiAoaSA9PT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICBkZWxldGUgZltpXTsKKworICAgICAgci52YWx1ZSA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgci52YWx1ZSA9IGY7CisgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgIH0KKworICByZXR1cm4gci52YWx1ZTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG4gPSB0aGlzLnJlYWRWYWx1ZSgpCisgIGlmICh0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKKyAgICAvLyBBc3N1bWluZyBubyBvbmUgaXMgc2VuZGluZyBpbiAxLjExMTExZSszMyBmb3JtYXQKKyAgICByZXR1cm4gSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nKG4pOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgSW50NjQobik7CisgIH0KK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gbmV3IEJ1ZmZlcih0aGlzLnJlYWRWYWx1ZSgpLCAnYmFzZTY0Jyk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zOworfTsKKworLyoqCisgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEKKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuU1RPUDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFR5cGUuQk9PTDoKKyAgICAgIHRoaXMucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgdGhpcy5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkxNjoKKyAgICAgIHRoaXMucmVhZEkxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkzMjoKKyAgICAgIHRoaXMucmVhZEkzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkk2NDoKKyAgICAgIHRoaXMucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgIHRoaXMucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUklORzoKKyAgICAgIHRoaXMucmVhZFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUlVDVDoKKyAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLk1BUDoKKyAgICAgIHZhciBtYXBCZWdpbiA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcEJlZ2luLnNpemU7ICsraSkgeworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4ua3R5cGUpOworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4udnR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU0VUOgorICAgICAgdmFyIHNldEJlZ2luID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzZXRCZWdpbi5zaXplOyArK2kyKSB7CisgICAgICAgIHRoaXMuc2tpcChzZXRCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5MSVNUOgorICAgICAgdmFyIGxpc3RCZWdpbiA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IGxpc3RCZWdpbi5zaXplOyArK2kzKSB7CisgICAgICAgIHRoaXMuc2tpcChsaXN0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyAgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOworICB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKKwordmFyIGRpc2FibGVkID0gZnVuY3Rpb24gKCkge307Cit2YXIgbG9nRnVuYyA9IGNvbnNvbGUubG9nOwordmFyIGxvZ0xldmVsID0gJ2Vycm9yJzsgLy8gZGVmYXVsdCBsZXZlbAorCitmdW5jdGlvbiBmYWN0b3J5KGxldmVsKSB7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgLy8gYmV0dGVyIHVzZSBzcHJlYWQgc3ludGF4LCBidXQgZHVlIHRvIGNvbXBhdGliaWxpdHksCisgICAgLy8gdXNlIGxlZ2FjeSBtZXRob2QgaGVyZS4KKyAgICB2YXIgYXJncyA9IFsndGhyaWZ0OiBbJyArIGxldmVsICsgJ10gJ10uY29uY2F0KEFycmF5LmZyb20oYXJndW1lbnRzKSk7CisgICAgcmV0dXJuIGxvZ0Z1bmModXRpbC5mb3JtYXQuYXBwbHkobnVsbCwgYXJncykpOworICB9OworfQorCit2YXIgdHJhY2UgPSBkaXNhYmxlZDsKK3ZhciBkZWJ1ZyA9IGRpc2FibGVkOwordmFyIGVycm9yID0gZGlzYWJsZWQ7Cit2YXIgd2FybmluZyA9IGRpc2FibGVkOwordmFyIGluZm8gPSBkaXNhYmxlZDsKKworZXhwb3J0cy5zZXRMb2dGdW5jID0gZnVuY3Rpb24gKGZ1bmMpIHsKKyAgbG9nRnVuYyA9IGZ1bmM7Cit9OworCit2YXIgc2V0TG9nTGV2ZWwgPSBleHBvcnRzLnNldExvZ0xldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7CisgIHRyYWNlID0gZGVidWcgPSBlcnJvciA9IHdhcm5pbmcgPSBpbmZvID0gZGlzYWJsZWQ7CisgIGxvZ0xldmVsID0gbGV2ZWw7CisgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgY2FzZSAndHJhY2UnOgorICAgIHRyYWNlID0gZmFjdG9yeSgnVFJBQ0UnKTsKKyAgY2FzZSAnZGVidWcnOgorICAgIGRlYnVnID0gZmFjdG9yeSgnREVCVUcnKTsKKyAgY2FzZSAnZXJyb3InOgorICAgIGVycm9yID0gZmFjdG9yeSgnRVJST1InKTsKKyAgY2FzZSAnd2FybmluZyc6CisgICAgd2FybmluZyA9IGZhY3RvcnkoJ1dBUk4nKTsKKyAgY2FzZSAnaW5mbyc6CisgICAgaW5mbyA9IGZhY3RvcnkoJ0lORk8nKTsKKyAgfQorfTsKKworLy8gc2V0IGRlZmF1bHQKK3NldExvZ0xldmVsKGxvZ0xldmVsKTsKKworZXhwb3J0cy5nZXRMb2dMZXZlbCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGxvZ0xldmVsOworfTsKKworZXhwb3J0cy50cmFjZSA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRyYWNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmRlYnVnID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuZXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBlcnJvci5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy53YXJuaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gd2FybmluZy5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5pbmZvID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gaW5mby5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCitleHBvcnRzLk11bHRpcGxleGVkUHJvY2Vzc29yID0gTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKK2Z1bmN0aW9uIE11bHRpcGxleGVkUHJvY2Vzc29yKHN0cmVhbSwgb3B0aW9ucykgeworICB0aGlzLnNlcnZpY2VzID0ge307Cit9OworCitNdWx0aXBsZXhlZFByb2Nlc3Nvci5wcm90b3R5cGUucmVnaXN0ZXJQcm9jZXNzb3IgPSBmdW5jdGlvbihuYW1lLCBoYW5kbGVyKSB7CisgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBoYW5kbGVyOworfTsKKworTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnAsIG91dCkgeworICB2YXIgYmVnaW4gPSBpbnAucmVhZE1lc3NhZ2VCZWdpbigpOworCisgIGlmIChiZWdpbi5tdHlwZSAhPSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCAmJiBiZWdpbi5tdHlwZSAhPSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlJyk7CisgIH0KKworICB2YXIgcCA9IGJlZ2luLmZuYW1lLnNwbGl0KCc6Jyk7CisgIHZhciBzbmFtZSA9IHBbMF07CisgIHZhciBmbmFtZSA9IHBbMV07CisKKyAgaWYgKCEgKHNuYW1lIGluIHRoaXMuc2VydmljZXMpKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVua25vd24gc2VydmljZTogJyArIHNuYW1lKTsKKyAgfQorCisgIC8vY29uc3RydWN0IGEgcHJveHkgb2JqZWN0IHdoaWNoIHN0dWJzIHRoZSByZWFkTWVzc2FnZUJlZ2luCisgIC8vZm9yIHRoZSBzZXJ2aWNlCisgIHZhciBpbnBQcm94eSA9IHt9OworCisgIGZvciAodmFyIGF0dHIgaW4gaW5wKSB7CisgICAgaW5wUHJveHlbYXR0cl0gPSBpbnBbYXR0cl07CisgIH0KKworICBpbnBQcm94eS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGZuYW1lOiBmbmFtZSwKKyAgICAgIG10eXBlOiBiZWdpbi5tdHlwZSwKKyAgICAgIHJzZXFpZDogYmVnaW4ucnNlcWlkCisgICAgfTsKKyAgfTsKKworICB0aGlzLnNlcnZpY2VzW3NuYW1lXS5wcm9jZXNzKGlucFByb3h5LCBvdXQpOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc4YWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSBNdWx0aXBsZXhlcjsKKworZnVuY3Rpb24gV3JhcHBlcihzZXJ2aWNlTmFtZSwgcHJvdG9jb2wsIGNvbm5lY3Rpb24pIHsKKworICBmdW5jdGlvbiBNdWx0aXBsZXhQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgICBwcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CisgIH07CisKKyAgdXRpbC5pbmhlcml0cyhNdWx0aXBsZXhQcm90b2NvbCwgcHJvdG9jb2wpOworCisgIE11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICBjb25uZWN0aW9uLnNlcUlkMlNlcnZpY2Vbc2VxaWRdID0gc2VydmljZU5hbWU7CisgICAgICBNdWx0aXBsZXhQcm90b2NvbC5zdXBlcl8ucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSArICI6IiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE11bHRpcGxleFByb3RvY29sLnN1cGVyXy5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCBuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgfQorICB9OworCisgIHJldHVybiBNdWx0aXBsZXhQcm90b2NvbDsKK307CisKK2Z1bmN0aW9uIE11bHRpcGxleGVyKCkgeworICB0aGlzLnNlcWlkID0gMDsKK307CisKK011bHRpcGxleGVyLnByb3RvdHlwZS5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgU2VydmljZUNsaWVudCwgY29ubmVjdGlvbikgeworICBpZiAoU2VydmljZUNsaWVudC5DbGllbnQpIHsKKyAgICBTZXJ2aWNlQ2xpZW50ID0gU2VydmljZUNsaWVudC5DbGllbnQ7CisgIH0KKyAgdmFyIHdyaXRlQ2IgPSBmdW5jdGlvbihidWYsIHNlcWlkKSB7CisgICAgY29ubmVjdGlvbi53cml0ZShidWYsc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBwcm90b2NvbFdyYXBwZXIgPSBuZXcgV3JhcHBlcihzZXJ2aWNlTmFtZSwgY29ubmVjdGlvbi5wcm90b2NvbCwgY29ubmVjdGlvbik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIHByb3RvY29sV3JhcHBlcik7CisgIHZhciBzZWxmID0gdGhpczsKKyAgY2xpZW50Lm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgIHNlbGYuc2VxaWQgKz0gMTsKKyAgICByZXR1cm4gc2VsZi5zZXFpZDsKKyAgfTsKKworICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2xpZW50ICE9PSAnb2JqZWN0JykgeworICAgIGNvbm5lY3Rpb24uY2xpZW50ID0ge307CisgIH0KKyAgY29ubmVjdGlvbi5jbGllbnRbc2VydmljZU5hbWVdID0gY2xpZW50OworCisgIHJldHVybiBjbGllbnQ7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzCmluZGV4IGYzMzNiYjkuLmE3MGViZTIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvcHJvdG9jb2wuanMKQEAgLTE2LDMyMiArMTYsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciBzeXMgPSByZXF1aXJlKCdzeXMnKSwKLSAgICBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpLAotICAgIFR5cGUgPSBUaHJpZnQuVHlwZTsKIAotdmFyIEJpbmFyeVBhcnNlciA9IHJlcXVpcmUoJy4vYmluYXJ5X3BhcnNlcicpLkJpbmFyeVBhcnNlcjsKLUJpbmFyeVBhcnNlci5iaWdFbmRpYW4gPSB0cnVlOwotCi12YXIgVU5LTk9XTiA9IDAsCi0gICAgSU5WQUxJRF9EQVRBID0gMSwKLSAgICBORUdBVElWRV9TSVpFID0gMiwKLSAgICBTSVpFX0xJTUlUID0gMywKLSAgICBCQURfVkVSU0lPTiA9IDQ7Ci0KLXZhciBUUHJvdG9jb2xFeGNlcHRpb24gPSBmdW5jdGlvbih0eXBlLCBtZXNzYWdlKSB7Ci0gIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7Ci0gIHRoaXMubmFtZSA9ICdUUHJvdG9jb2xFeGNlcHRpb24nOwotICB0aGlzLnR5cGUgPSB0eXBlOwotfQotc3lzLmluaGVyaXRzKFRQcm90b2NvbEV4Y2VwdGlvbiwgRXJyb3IpOwotCi12YXIgVEJpbmFyeVByb3RvY29sID0gZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSBmdW5jdGlvbih0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKLSAgdGhpcy50cmFucyA9IHRyYW5zOwotICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKLSAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOwotfQotCi0vLyBOYXN0eUhheHguIEphdmFTY3JpcHQgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKLS8vIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLS8vIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KLQotdmFyIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgLy8gMHhmZmZmMDAwMAotICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyLCAvLyAweDgwMDEwMDAwCi0gICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7Ci0gICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7Ci0gICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOwotICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKLSAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOwotICAgIH0KLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaWQpIHsKLSAgdGhpcy53cml0ZUJ5dGUodHlwZSk7Ci0gIHRoaXMud3JpdGVJMTYoaWQpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrdHlwZSwgdnR5cGUsIHNpemUpIHsKLSAgdGhpcy53cml0ZUJ5dGUoa3R5cGUpOwotICB0aGlzLndyaXRlQnl0ZSh2dHlwZSk7Ci0gIHRoaXMud3JpdGVJMzIoc2l6ZSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7Ci0gIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKLSAgdGhpcy53cml0ZUkzMihzaXplKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKLSAgY29uc29sZS5sb2coJ3dyaXRlIHNldCcsIGV0eXBlLCBzaXplKTsKLSAgdGhpcy53cml0ZUJ5dGUoZXR5cGUpOwotICB0aGlzLndyaXRlSTMyKHNpemUpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgewotICBpZiAoYm9vbCkgewotICAgIHRoaXMud3JpdGVCeXRlKDEpOwotICB9IGVsc2UgewotICAgIHRoaXMud3JpdGVCeXRlKDApOwotICB9Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgewotICB0aGlzLnRyYW5zLndyaXRlKEJpbmFyeVBhcnNlci5mcm9tQnl0ZShieXRlKSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbVNob3J0KGkxNikpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7Ci0gIHRoaXMudHJhbnMud3JpdGUoQmluYXJ5UGFyc2VyLmZyb21JbnQoaTMyKSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbUxvbmcoaTY0KSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbihkdWIpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbURvdWJsZShkdWIpKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0cikgewotICB0aGlzLndyaXRlSTMyKHN0ci5sZW5ndGgpOwotICB0aGlzLnRyYW5zLndyaXRlKHN0cik7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgc3ogPSB0aGlzLnJlYWRJMzIoKTsKLSAgdmFyIHR5cGUsIG5hbWUsIHNlcWlkOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgY29uc29sZS5sb2coIkJBRDogIiArIHZlcnNpb24pOwotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKEJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKLSAgICB9Ci0gICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOwotICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKLSAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOwotICB9IGVsc2UgewotICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgIk5vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyIik7Ci0gICAgfQotICAgIG5hbWUgPSB0aGlzLnRyYW5zLnJlYWQoc3opOwotICAgIHR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gICAgc2VxaWQgPSB0aGlzLnJlYWRJMzIoKTsKLSAgfQotICByZXR1cm4ge2ZuYW1lOiBuYW1lLCBtdHlwZTogdHlwZSwgcnNlcWlkOiBzZXFpZH07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHtmbmFtZTogJyd9Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAodHlwZSA9PSBUeXBlLlNUT1ApIHsKLSAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogdHlwZSwgZmlkOiAwfTsKLSAgfQotICB2YXIgaWQgPSB0aGlzLnJlYWRJMTYoKTsKLSAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogaWR9OwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKLSAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBieXRlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAoYnl0ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDEpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvQnl0ZShidWZmKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDIpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvU2hvcnQoYnVmZik7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgewotICB2YXIgYnVmZiA9IHRoaXMudHJhbnMucmVhZCg0KTsKLSAgLy8gY29uc29sZS5sb2coInJlYWQgYnVmOiAiKTsKLSAgLy8gY29uc29sZS5sb2coYnVmZik7Ci0gIC8vIGNvbnNvbGUubG9nKCJyZXN1bHQ6ICIgKyBCaW5hcnlQYXJzZXIudG9JbnQoYnVmZikpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvSW50KGJ1ZmYpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBCaW5hcnlQYXJzZXIudG9Mb25nKGJ1ZmYpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBCaW5hcnlQYXJzZXIudG9GbG9hdChidWZmKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgdmFyIHIgPSB0aGlzLnJlYWRCaW5hcnkoKS50b1N0cmluZygnYmluYXJ5Jyk7Ci0gIC8vIGNvbnNvbGUubG9nKCJyZWFkU3RyaW5nOiAiICsgcik7Ci0gIHJldHVybiByOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFuczsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgewotICAvLyBjb25zb2xlLmxvZygic2tpcDogIiArIHR5cGUpOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFR5cGUuU1RPUDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFR5cGUuQk9PTDoKLSAgICAgIHRoaXMucmVhZEJvb2woKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5CWVRFOgotICAgICAgdGhpcy5yZWFkQnl0ZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkkxNjoKLSAgICAgIHRoaXMucmVhZEkxNigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkkzMjoKLSAgICAgIHRoaXMucmVhZEkzMigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkk2NDoKLSAgICAgIHRoaXMucmVhZEk2NCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkRPVUJMRToKLSAgICAgIHRoaXMucmVhZERvdWJsZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLlNUUklORzoKLSAgICAgIHRoaXMucmVhZFN0cmluZygpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLlNUUlVDVDoKLSAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKLSAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKLSAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLk1BUDoKLSAgICAgIHZhciByID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgci5zaXplOyArK2kpIHsKLSAgICAgICAgdGhpcy5za2lwKHIua3R5cGUpOwotICAgICAgICB0aGlzLnNraXAoci52dHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5TRVQ6Ci0gICAgICB2YXIgciA9IHRoaXMucmVhZFNldEJlZ2luKCk7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHIuc2l6ZTsgKytpKSB7Ci0gICAgICAgIHRoaXMuc2tpcChyLmV0eXBlKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFNldEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkxJU1Q6Ci0gICAgICB2YXIgciA9IHRoaXMucmVhZExpc3RCZWdpbigpOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByLnNpemU7ICsraSkgewotICAgICAgICB0aGlzLnNraXAoci5ldHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOwotICB9Ci19Cittb2R1bGUuZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKaW5kZXggNDNhNzk2Ny4uZTEyNGFjYyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCkBAIC0xNiwzNiArMTYsOTggQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi12YXIgc3lzID0gcmVxdWlyZSgnc3lzJyksCi0gICAgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7CiAKLXZhciBCaW5hcnlQYXJzZXIgPSByZXF1aXJlKCcuL2JpbmFyeV9wYXJzZXInKS5CaW5hcnlQYXJzZXIsCi0gICAgVE1lbW9yeUJ1ZmZlciA9IHJlcXVpcmUoJy4vdHJhbnNwb3J0JykuVE1lbW9yeUJ1ZmZlciwKLSAgICBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJykuVEJpbmFyeVByb3RvY29sLAotICAgIGludDMyRnJhbWVkUmVjZWl2ZXIgPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKS5pbnQzMkZyYW1lZFJlY2VpdmVyOwordmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpOwordmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpOwordmFyIHRscyA9IHJlcXVpcmUoJ3RscycpOwogCi1leHBvcnRzLmNyZWF0ZVNlcnZlciA9IGZ1bmN0aW9uKGNscywgaGFuZGxlcikgewotICBpZiAoY2xzLlByb2Nlc3NvcikgewotICAgIGNscyA9IGNscy5Qcm9jZXNzb3I7Ci0gIH0KLSAgdmFyIHByb2Nlc3NvciA9IG5ldyBjbHMoaGFuZGxlcik7Cit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CiAKLSAgcmV0dXJuIG5ldC5jcmVhdGVTZXJ2ZXIoZnVuY3Rpb24oc3RyZWFtKSB7Ci0gICAgc3RyZWFtLm9uKCdkYXRhJywgaW50MzJGcmFtZWRSZWNlaXZlcihmdW5jdGlvbihkYXRhKSB7Ci0gICAgICB2YXIgaW5wdXQgPSBuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEpKTsKLSAgICAgIHZhciBvdXRwdXQgPSBuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUTWVtb3J5QnVmZmVyKHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7Ci0gICAgICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgYmV0dGVyLCBhbGxvY2F0ZSBvbmUgYnVmZmVyIGluc3RlYWQgb2YgYm90aDoKLSAgICAgICAgdmFyIG1zZyA9IG5ldyBCdWZmZXIoYnVmLmxlbmd0aCArIDQpOwotICAgICAgICBCaW5hcnlQYXJzZXIuZnJvbUludChidWYubGVuZ3RoKS5jb3B5KG1zZywgMCwgMCwgNCk7Ci0gICAgICAgIGJ1Zi5jb3B5KG1zZywgNCwgMCwgYnVmLmxlbmd0aCk7Ci0gICAgICAgIHN0cmVhbS53cml0ZShtc2cpOworLyoqCisgKiBDcmVhdGUgYSBUaHJpZnQgc2VydmVyIHdoaWNoIGNhbiBzZXJ2ZSBvbmUgb3IgbXVsdGlwbGUgc2VydmljZXMuCisgKiBAcGFyYW0ge29iamVjdH0gcHJvY2Vzc29yIC0gQSBub3JtYWwgb3IgbXVsdGlwbGV4ZWRQcm9jZXNzb3IgKG11c3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwcmVjb25zdHJ1Y3RlZCB3aXRoIHRoZSBkZXNpcmVkIGhhbmRsZXIpLgorICogQHBhcmFtIHtTZXJ2ZXJPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgTXVsdGlwbGV4IFNlcnZlci4KKyAqLworZXhwb3J0cy5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIgPSBmdW5jdGlvbihwcm9jZXNzb3IsIG9wdGlvbnMpIHsKKyAgdmFyIHRyYW5zcG9ydCA9IChvcHRpb25zICYmIG9wdGlvbnMudHJhbnNwb3J0KSA/IG9wdGlvbnMudHJhbnNwb3J0IDogVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB2YXIgcHJvdG9jb2wgPSAob3B0aW9ucyAmJiBvcHRpb25zLnByb3RvY29sKSA/IG9wdGlvbnMucHJvdG9jb2wgOiBUQmluYXJ5UHJvdG9jb2w7CisKKyAgZnVuY3Rpb24gc2VydmVySW1wbChzdHJlYW0pIHsKKyAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTsKKyAgICB9KTsKKyAgICBzdHJlYW0ub24oJ2RhdGEnLCB0cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0V2l0aERhdGEpIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBwcm90b2NvbCh0cmFuc3BvcnRXaXRoRGF0YSk7CisgICAgICB2YXIgb3V0cHV0ID0gbmV3IHByb3RvY29sKG5ldyB0cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZShidWYpOworICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpOworICAgICAgICAgICAgc3RyZWFtLmVuZCgpOworICAgICAgICB9CiAgICAgICB9KSk7CiAKLSAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgdHJ5IHsKKyAgICAgICAgZG8geworICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICAvL1RoZSBsYXN0IGRhdGEgaW4gdGhlIGJ1ZmZlciB3YXMgbm90IGEgY29tcGxldGUgbWVzc2FnZSwgd2FpdCBmb3IgdGhlIHJlc3QKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJyLm1lc3NhZ2UgPT09ICJJbnZhbGlkIHR5cGU6IHVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAvL05vIG1vcmUgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgLy9UaGlzIHRyYXAgaXMgYSBiaXQgaGFja2lzaAorICAgICAgICAgIC8vVGhlIG5leHQgc3RlcCB0byBpbXByb3ZlIHRoZSBub2RlIGJlaGF2aW9yIGhlcmUgaXMgdG8gaGF2ZQorICAgICAgICAgIC8vICB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHByb2Nlc3MgbWV0aG9kIHRocm93IGEgbW9yZSBleHBsaWNpdAorICAgICAgICAgIC8vICBlcnJvciB3aGVuIHRoZSBuZXR3b3JrIGJ1ZmZlciBpcyBlbXB0eSAocmVnYXJkbGVzIG9mIHRoZQorICAgICAgICAgIC8vICBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sgaW4gdXNlKSBhbmQgcmVwbGFjZSB0aGlzIGhldXJpc3RpYy4KKyAgICAgICAgICAvLyAgQWxzbyB0cmFuc3BvcnRzIHNob3VsZCBwcm9iYWJseSBub3QgZm9yY2UgdXBwZXIgbGF5ZXJzIHRvCisgICAgICAgICAgLy8gIG1hbmFnZSB0aGVpciBidWZmZXIgcG9zaXRpb25zIChpLmUuIHJvbGxiYWNrUG9zaXRpb24oKSBhbmQKKyAgICAgICAgICAvLyAgY29tbWl0UG9zaXRpb24oKSBzaG91bGQgYmUgZWxpbWluYXRlZCBpbiBsaWV1IG9mIGEgdHJhbnNwb3J0CisgICAgICAgICAgLy8gIGVuY2Fwc3VsYXRlZCBidWZmZXIgbWFuYWdlbWVudCBzdHJhdGVneS4pCisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vVW5leHBlY3RlZCBlcnJvcgorICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpOworICAgICAgICAgIHN0cmVhbS5lbmQoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0pKTsKIAogICAgIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7CiAgICAgICBzdHJlYW0uZW5kKCk7CiAgICAgfSk7Ci0gIH0pOwotfQorICB9CisKKyAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50bHMpIHsKKyAgICBpZiAoISgnc2VjdXJlUHJvdG9jb2wnIGluIG9wdGlvbnMudGxzKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zLnRscykpIHsKKyAgICAgIG9wdGlvbnMudGxzLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOworICAgIH0KKyAgICByZXR1cm4gdGxzLmNyZWF0ZVNlcnZlcihvcHRpb25zLnRscywgc2VydmVySW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldC5jcmVhdGVTZXJ2ZXIoc2VydmVySW1wbCk7CisgIH0KK307CisKKy8qKgorICogQ3JlYXRlIGEgc2luZ2xlIHNlcnZpY2UgQXBhY2hlIFRocmlmdCBzZXJ2ZXIuCisgKiBAcGFyYW0ge29iamVjdH0gcHJvY2Vzc29yIC0gQSBzZXJ2aWNlIGNsYXNzIG9yIHByb2Nlc3NvciBmdW5jdGlvbi4KKyAqIEBwYXJhbSB7U2VydmVyT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IE11bHRpcGxleCBTZXJ2ZXIuCisgKi8KK2V4cG9ydHMuY3JlYXRlU2VydmVyID0gZnVuY3Rpb24ocHJvY2Vzc29yLCBoYW5kbGVyLCBvcHRpb25zKSB7CisgIGlmIChwcm9jZXNzb3IuUHJvY2Vzc29yKSB7CisgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yLlByb2Nlc3NvcjsKKyAgfQorICByZXR1cm4gZXhwb3J0cy5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIobmV3IHByb2Nlc3NvcihoYW5kbGVyKSwgb3B0aW9ucyk7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMKaW5kZXggNTNjYTEwNi4uZjJiMjg5NiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdGhyaWZ0LmpzCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotdmFyIHN5cyA9IHJlcXVpcmUoJ3N5cycpOwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CiAKIHZhciBUeXBlID0gZXhwb3J0cy5UeXBlID0gewogICBTVE9QOiAwLApAQCAtMzUsMjEgKzM1LDI1IEBACiAgIFNFVDogMTQsCiAgIExJU1Q6IDE1LAogICBVVEY4OiAxNiwKLSAgVVRGMTY6IDE3LAotfQorICBVVEYxNjogMTcKK307CiAKIGV4cG9ydHMuTWVzc2FnZVR5cGUgPSB7CiAgIENBTEw6IDEsCiAgIFJFUExZOiAyLAogICBFWENFUFRJT046IDMsCi0gIE9ORVdBWTogNCwKLX0KKyAgT05FV0FZOiA0Cit9OwogCi12YXIgVEV4Y2VwdGlvbiA9IGV4cG9ydHMuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTsKLSAgdGhpcy5uYW1lID0gJ1RFeGNlcHRpb24nOwotfQotc3lzLmluaGVyaXRzKFRFeGNlcHRpb24sIEVycm9yKTsKK2V4cG9ydHMuVEV4Y2VwdGlvbiA9IFRFeGNlcHRpb247CisKK2Z1bmN0aW9uIFRFeGNlcHRpb24obWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK3V0aWwuaW5oZXJpdHMoVEV4Y2VwdGlvbiwgRXJyb3IpOwogCiB2YXIgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSA9IGV4cG9ydHMuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSA9IHsKICAgVU5LTk9XTjogMCwKQEAgLTU3LDgyICs2MSwxNzIgQEAKICAgSU5WQUxJRF9NRVNTQUdFX1RZUEU6IDIsCiAgIFdST05HX01FVEhPRF9OQU1FOiAzLAogICBCQURfU0VRVUVOQ0VfSUQ6IDQsCi0gIE1JU1NJTkdfUkVTVUxUOiA1Ci19CisgIE1JU1NJTkdfUkVTVUxUOiA1LAorICBJTlRFUk5BTF9FUlJPUjogNiwKKyAgUFJPVE9DT0xfRVJST1I6IDcsCisgIElOVkFMSURfVFJBTlNGT1JNOiA4LAorICBJTlZBTElEX1BST1RPQ09MOiA5LAorICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogMTAKK307CiAKLXZhciBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKLSAgVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIG1lc3NhZ2UpOworZXhwb3J0cy5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBUQXBwbGljYXRpb25FeGNlcHRpb247CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIFRFeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgIHRoaXMudHlwZSA9IHR5cGUgfHwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOOwotICB0aGlzLm5hbWUgPSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJzsKLX0KLXN5cy5pbmhlcml0cyhUQXBwbGljYXRpb25FeGNlcHRpb24sIFRFeGNlcHRpb24pOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwordXRpbC5pbmhlcml0cyhUQXBwbGljYXRpb25FeGNlcHRpb24sIFRFeGNlcHRpb24pOwogCiBUQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgewotICB2YXIgZnR5cGUKLSAgdmFyIGZpZAotICB2YXIgcmV0ID0gaW5wdXQucmVhZFN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKQorICB2YXIgZnR5cGU7CisgIHZhciByZXQgPSBpbnB1dC5yZWFkU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwogCiAgIHdoaWxlKDEpewotCi0gICAgICByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpCi0KKyAgICAgIHJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CiAgICAgICBpZihyZXQuZnR5cGUgPT0gVHlwZS5TVE9QKQotICAgICAgICAgIGJyZWFrCisgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIHZhciBmaWQgPSByZXQuZmlkCi0KLSAgICAgIHN3aXRjaChmaWQpeworICAgICAgc3dpdGNoKHJldC5maWQpewogICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgaWYoIHJldC5mdHlwZSA9PSBUeXBlLlNUUklORyApewotICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZFN0cmluZygpCi0gICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSByZXQKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldDsKICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQorICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOwogICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICBpZiggcmV0LmZ0eXBlID09IFR5cGUuSTMyICl7Ci0gICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkSTMyKCkKLSAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHJldAorICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZEkzMigpOworICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcmV0OwogICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgcmV0ICAgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKKyAgICAgICAgICAgICAgICAgIHJldCAgID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrCi0KKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpCi0gICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKQorICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CiAgIH0KLQotICBpbnB1dC5yZWFkU3RydWN0RW5kKCkKLX0KKyAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworfTsKIAogVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCl7CiAgIG91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKIAogICBpZiAodGhpcy5tZXNzYWdlKSB7Ci0gICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVHlwZS5TVFJJTkcsIDEpCi0gICAgICBvdXRwdXQud3JpdGVTdHJpbmcodGhpcy5tZXNzYWdlKQotICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKQorICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFR5cGUuU1RSSU5HLCAxKTsKKyAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLm1lc3NhZ2UpOworICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKICAgfQogCiAgIGlmICh0aGlzLmNvZGUpIHsKLSAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUeXBlLkkzMiwgMikKLSAgICAgIG91dHB1dC53cml0ZUkzMih0aGlzLmNvZGUpCi0gICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpCisgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVHlwZS5JMzIsIDIpOworICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSk7CisgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpOwogICB9CiAKLSAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCkKLSAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCkKLX0KKyAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCk7CisgIG91dHB1dC53cml0ZVN0cnVjdEVuZCgpOworfTsKKwordmFyIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSBleHBvcnRzLlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgIFVOS05PV046IDAsCisgIElOVkFMSURfREFUQTogMSwKKyAgTkVHQVRJVkVfU0laRTogMiwKKyAgU0laRV9MSU1JVDogMywKKyAgQkFEX1ZFUlNJT046IDQsCisgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgREVQVEhfTElNSVQ6IDYKK307CisKKworZXhwb3J0cy5UUHJvdG9jb2xFeGNlcHRpb24gPSBUUHJvdG9jb2xFeGNlcHRpb247CisKK2Z1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIEVycm9yLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMudHlwZSA9IHR5cGU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwordXRpbC5pbmhlcml0cyhUUHJvdG9jb2xFeGNlcHRpb24sIEVycm9yKTsKIAogZXhwb3J0cy5vYmplY3RMZW5ndGggPSBmdW5jdGlvbihvYmopIHsKICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoOwotfQorfTsKIAogZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKSB7Ci0gIHN5cy5pbmhlcml0cyhjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3Rvcik7Ci19CisgIHV0aWwuaW5oZXJpdHMoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IpOworfTsKKwordmFyIGNvcHlMaXN0LCBjb3B5TWFwOworCitjb3B5TGlzdCA9IGZ1bmN0aW9uKGxzdCwgdHlwZXMpIHsKKworICBpZiAoIWxzdCkge3JldHVybiBsc3Q7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciBsZW4gPSBsc3QubGVuZ3RoLCByZXN1bHQgPSBbXSwgaSwgdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2YWwgPSBsc3RbaV07CisgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlKHZhbCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpeworCisgIGlmICghb2JqKSB7cmV0dXJuIG9iajsgfQorCisgIHZhciB0eXBlOworCisgIGlmICh0eXBlcy5zaGlmdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgdHlwZSA9IHR5cGVzOworICB9CisgIGVsc2UgeworICAgIHR5cGUgPSB0eXBlc1swXTsKKyAgfQorICB2YXIgVHlwZSA9IHR5cGU7CisKKyAgdmFyIHJlc3VsdCA9IHt9LCB2YWw7CisgIGZvcih2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZihvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIHZhbCA9IG9ialtwcm9wXTsKKyAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHRbcHJvcF0gPSBuZXcgVHlwZSh2YWwpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworbW9kdWxlLmV4cG9ydHMuY29weU1hcCA9IGNvcHlNYXA7Cittb2R1bGUuZXhwb3J0cy5jb3B5TGlzdCA9IGNvcHlMaXN0OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKaW5kZXggMGMxMGVmMC4uNTlkYWE5OCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdHJhbnNwb3J0LmpzCkBAIC0xNiw3MiArMTYsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciBUTWVtb3J5QnVmZmVyID0gZXhwb3J0cy5UTWVtb3J5QnVmZmVyID0gZnVuY3Rpb24oYnVmZmVyLCBmbHVzaENhbGxiYWNrKSB7Ci0gIGlmIChidWZmZXIgIT09IHVuZGVmaW5lZCkgewotICAgIHRoaXMucmVjdl9idWYgPSBidWZmZXI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhpcy5yZWN2X2J1ZiA9IG5ldyBCdWZmZXIoMCk7Ci0gIH0KLSAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOwotICB0aGlzLnNlbmRfYnVmID0gW107Ci0gIHRoaXMucnBvcyA9IDA7Ci0gIHRoaXMuZmx1c2hDYWxsYmFjayA9IGZsdXNoQ2FsbGJhY2s7Ci19CiAKLVRNZW1vcnlCdWZmZXIucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgewotICAvLyBUT0RPCi0gIHJldHVybiB0cnVlOwotfQotCi1UTWVtb3J5QnVmZmVyLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRNZW1vcnlCdWZmZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRNZW1vcnlCdWZmZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsKLSAgdmFyIGF2YWlsID0gdGhpcy5yZWN2X2J1Zl9zeiAtIHRoaXMucnBvczsKLSAgLy8gY29uc29sZS5sb2coImF2YWlsOiAiICsgYXZhaWwpOwotCi0gIGlmKGF2YWlsID09IDApCi0gICAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKLQotICB2YXIgZ2l2ZSA9IGxlbgotCi0gIGlmKGF2YWlsIDwgbGVuKSB7Ci0gICAgICBjb25zb2xlLmxvZygiYXNrZWQgZm9yOiAiICsgbGVuKTsKLSAgICAgIHRocm93IG5ldyBFcnJvcigiYXNrZWQgZm9yIHRvbyBtdWNoIik7Ci0gICAgICBnaXZlID0gYXZhaWwKLSAgfQotCi0gIC8vIGNvbnNvbGUubG9nKHRoaXMucnBvcyArICIsIiArIGdpdmUpOwotICB2YXIgcmV0ID0gdGhpcy5yZWN2X2J1Zi5zbGljZSh0aGlzLnJwb3MsdGhpcy5ycG9zICsgZ2l2ZSkKLSAgdGhpcy5ycG9zICs9IGdpdmUKLSAgLy8gY29uc29sZS5sb2cocmV0KTsKLQotICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPwotICByZXR1cm4gcmV0Ci0KLX0KLQotVE1lbW9yeUJ1ZmZlci5wcm90b3R5cGUucmVhZEFsbCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWN2X2J1ZjsKLX0KLQotVE1lbW9yeUJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHsKLSAgLy8gVE9ETwotICBpZiAodHlwZW9mKGJ1ZikgPT09ICJzdHJpbmciKSB7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpIHsKLSAgICAgIHRoaXMuc2VuZF9idWYucHVzaChidWYuY2hhckNvZGVBdChpKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKSB7Ci0gICAgICB0aGlzLnNlbmRfYnVmLnB1c2goYnVmW2ldKTsKLSAgICB9Ci0gIH0KLX0KLQotVE1lbW9yeUJ1ZmZlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5mbHVzaENhbGxiYWNrKG5ldyBCdWZmZXIodGhpcy5zZW5kX2J1ZikpOwotICB0aGlzLnNlbmRfYnVmID0gW107Ci19Cittb2R1bGUuZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworbW9kdWxlLmV4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworbW9kdWxlLmV4cG9ydHMuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzZjQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgdXJsID0gcmVxdWlyZSgidXJsIik7Cit2YXIgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK3ZhciBmcyA9IHJlcXVpcmUoImZzIik7Cit2YXIgY3J5cHRvID0gcmVxdWlyZSgiY3J5cHRvIik7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKwordmFyIE11bHRpcGxleGVkUHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKS5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCisvLyBXU0ZyYW1lIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiogQXBhY2hlIFRocmlmdCBSUEMgV2ViIFNvY2tldCBUcmFuc3BvcnQKKyAqICBGcmFtZSBsYXlvdXQgY29uZm9ybWluZyB0byBSRkMgNjQ1NSBjaXJjYSAxMi8yMDExCisgKgorICogVGhlb3JldGljYWwgZnJhbWUgc2l6ZSBsaW1pdCBpcyA0R0IqNEdCLCBob3dldmVyIHRoZSBOb2RlIEJ1ZmZlcgorICogbGltaXQgaXMgMUdCIGFzIG9mIHYwLjEwLiBUaGUgZnJhbWUgbGVuZ3RoIGVuY29kaW5nIGlzIGFsc28KKyAqIGNvbmZpZ3VyZWQgZm9yIGEgbWF4IG9mIDRHQiBwcmVzZW50bHkgYW5kIG5lZWRzIHRvIGJlIGFkanVzdGVkCisgKiBpZiBOb2RlL0Jyb3dzZXJzIGJlY29tZSBjYXBhYmlsZSBvZiA+IDRHQiBmcmFtZXMuCisgKgorICogIC0gRklOIGlzIDEgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKKyAqICAtIFJTVjEvMi8zIGFyZSBhbHdheXMgMAorICogIC0gT3Bjb2RlIGlzIDEoVEVYVCkgZm9yIFRKU09OUHJvdG9jb2wgYW5kIDIoQklOKSBmb3IgVEJpbmFyeVByb3RvY29sCisgKiAgLSBNYXNrIFByZXNlbnQgYml0IGlzIDEgc2VuZGluZyB0by1zZXJ2ZXIgYW5kIDAgc2VuZGluZyB0by1jbGllbnQKKyAqICAtIFBheWxvYWQgTGVuOgorICogICAgICAgICsgSWYgPCAxMjY6IHRoZW4gcmVwcmVzZW50ZWQgZGlyZWN0bHkKKyAqICAgICAgICArIElmID49MTI2OiBidXQgd2l0aGluIHJhbmdlIG9mIGFuIHVuc2lnbmVkIDE2IGJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICB0aGVuIFBheWxvYWQgTGVuIGlzIDEyNiBhbmQgdGhlIHR3byBmb2xsb3dpbmcgYnl0ZXMgc3RvcmUKKyAqICAgICAgICAgICAgIHRoZSBsZW5ndGgKKyAqICAgICAgICArIEVsc2U6IFBheWxvYWQgTGVuIGlzIDEyNyBhbmQgdGhlIGZvbGxvd2luZyA4IGJ5dGVzIHN0b3JlIHRoZQorICogICAgICAgICAgICAgbGVuZ3RoIGFzIGFuIHVuc2lnbmVkIDY0IGJpdCBpbnRlZ2VyCisgKiAgLSBNYXNraW5nIGtleSBpcyBhIDMyIGJpdCBrZXkgb25seSBwcmVzZW50IHdoZW4gc2VuZGluZyB0byB0aGUgc2VydmVyCisgKiAgLSBQYXlsb2FkIGZvbGxvd3MgdGhlIG1hc2tpbmcga2V5IG9yIGxlbmd0aAorICoKKyAqICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiAgICArLSstKy0rLSstLS0tLS0tKy0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfEZ8UnxSfFJ8IG9wY29kZXxNfCBQYXlsb2FkIGxlbiB8ICAgIEV4dGVuZGVkIHBheWxvYWQgbGVuZ3RoICAgIHwKKyAqICAgIHxJfFN8U3xTfCAgKDQpICB8QXwgICAgICg3KSAgICAgfCAgICAgICAgICAgICAoMTYvNjQpICAgICAgICAgICB8CisgKiAgICB8TnxWfFZ8VnwgICAgICAgfFN8ICAgICAgICAgICAgIHwgICAoaWYgcGF5bG9hZCBsZW49PTEyNi8xMjcpICAgfAorICogICAgfCB8MXwyfDN8ICAgICAgIHxLfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0tLS0tLS0rLSstLS0tLS0tLS0tLS0tKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArCisgKiAgICB8ICAgICBFeHRlbmRlZCBwYXlsb2FkIGxlbmd0aCBjb250aW51ZWQsIGlmIHBheWxvYWQgbGVuID09IDEyNyAgfAorICogICAgKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1hc2tpbmcta2V5LCBpZiBNQVNLIHNldCB0byAxICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCBNYXNraW5nLWtleSAoY29udGludWVkKSAgICAgICB8ICAgICAgICAgIFBheWxvYWQgRGF0YSAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArCisgKiAgICA6ICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZCBEYXRhIGNvbnRpbnVlZCAuLi4gICAgICAgICAgICAgICAgOgorICogICAgKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkIERhdGEgY29udGludWVkIC4uLiAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICovCit2YXIgd3NGcmFtZSA9IHsKKyAgLyoqIEVuY29kZXMgYSBXZWJTb2NrZXQgZnJhbWUKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBUaGUgcmF3IGRhdGEgdG8gZW5jb2RlCisgICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gVGhlIG1hc2sgdG8gYXBwbHkgd2hlbiBzZW5kaW5nIHRvIHNlcnZlciwgbnVsbCBmb3Igbm8gbWFzaworICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJpbkVuY29kaW5nIC0gVHJ1ZSBmb3IgYmluYXJ5IGVuY29kaW5nLCBmYWxzZSBmb3IgdGV4dCBlbmNvZGluZworICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSBXZWJTb2NrZXQgZnJhbWUsIHJlYWR5IHRvIHNlbmQKKyAgICovCisgIGVuY29kZTogZnVuY3Rpb24oZGF0YSwgbWFzaywgYmluRW5jb2RpbmcpIHsKKyAgICAgIHZhciBmcmFtZSA9IG5ldyBCdWZmZXIod3NGcmFtZS5mcmFtZVNpemVGcm9tRGF0YShkYXRhLCBtYXNrKSk7CisgICAgICAvL0J5dGUgMCAtIEZJTiAmIE9QQ09ERQorICAgICAgZnJhbWVbMF0gPSB3c0ZyYW1lLmZpbi5GSU4gKworICAgICAgICAgIChiaW5FbmNvZGluZyA/IHdzRnJhbWUuZnJhbWVPcENvZGVzLkJJTiA6IHdzRnJhbWUuZnJhbWVPcENvZGVzLlRFWFQpOworICAgICAgLy9CeXRlIDEgb3IgMS0zIG9yIDEtOSAtIE1BU0sgRkxBRyAmIFNJWkUKKyAgICAgIHZhciBwYXlsb2FkT2Zmc2V0ID0gMjsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDB4N0UpIHsKKyAgICAgICAgZnJhbWVbMV0gPSBkYXRhLmxlbmd0aCArIChtYXNrID8gd3NGcmFtZS5tYXNrLlRPX1NFUlZFUiA6IHdzRnJhbWUubWFzay5UT19DTElFTlQpOworICAgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgeworICAgICAgICBmcmFtZVsxXSA9IDB4N0UgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MTZCRShkYXRhLmxlbmd0aCwgMiwgdHJ1ZSk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgPSA0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWVbMV0gPSAweDdGICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7CisgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoMCwgMiwgdHJ1ZSk7CisgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoZGF0YS5sZW5ndGgsIDYsIHRydWUpOworICAgICAgICBwYXlsb2FkT2Zmc2V0ID0gMTA7CisgICAgICB9CisgICAgICAvL01BU0sKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIG1hc2suY29weShmcmFtZSwgcGF5bG9hZE9mZnNldCwgMCwgNCk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgKz0gNDsKKyAgICAgIH0KKyAgICAgIC8vUGF5bG9hZAorICAgICAgZGF0YS5jb3B5KGZyYW1lLCBwYXlsb2FkT2Zmc2V0KTsKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIHdzRnJhbWUuYXBwbHlNYXNrKGZyYW1lLnNsaWNlKHBheWxvYWRPZmZzZXQpLCBmcmFtZS5zbGljZShwYXlsb2FkT2Zmc2V0LTQscGF5bG9hZE9mZnNldCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZyYW1lOworICB9LAorCisgIC8qKgorICAgKiBAY2xhc3MKKyAgICogQG5hbWUgV1NEZWNvZGVSZXN1bHQKKyAgICogQHByb3BlcnR5IHtCdWZmZXJ9IGRhdGEgLSBUaGUgZGVjb2RlZCBkYXRhIGZvciB0aGUgZmlyc3QgQVRSUEMgbWVzc2FnZQorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gbWFzayAtIFRoZSBmcmFtZSBtYXNrCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYmluRW5jb2RpbmcgLSBUcnVlIGlmIGJpbmFyeSAoVEJpbmFyeVByb3RvY29sKSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHRleHQgKFRKU09OUHJvdG9jb2wpCisgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBuZXh0RnJhbWUgLSBNdWx0aXBsZSBBVFJQQyBtZXNzYWdlcyBtYXkgYmUgc2VudCBpbiBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgV2ViU29ja2V0IGZyYW1lLCB0aGlzIEJ1ZmZlciBjb250YWlucworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IGJ5dGVzIHJlbWFpbmluZyB0byBiZSBkZWNvZGVkCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gRklOIC0gVHJ1ZSBpcyB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQorICAgKi8KKworICAgLyoqIERlY29kZXMgYSBXZWJTb2NrZXQgZnJhbWUKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGZyYW1lIC0gVGhlIHJhdyBpbmJvdW5kIGZyYW1lLCBpZiB0aGlzIGlzIGEgY29udGludWF0aW9uCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGl0IG11c3QgaGF2ZSBhIG1hc2sgcHJvcGVydHkgd2l0aCB0aGUgbWFzay4KKyAgICogQHJldHVybnMge1dTRGVjb2RlUmVzdWx0fSAtIFRoZSBkZWNvZGVkIHBheWxvYWQKKyAgICoKKyAgICogQHNlZSB7QGxpbmsgV1NEZWNvZGVSZXN1bHR9CisgICAqLworICBkZWNvZGU6IGZ1bmN0aW9uKGZyYW1lKSB7CisgICAgICB2YXIgcmVzdWx0ID0geworICAgICAgICBkYXRhOiBudWxsLAorICAgICAgICBtYXNrOiBudWxsLAorICAgICAgICBiaW5FbmNvZGluZzogZmFsc2UsCisgICAgICAgIG5leHRGcmFtZTogbnVsbCwKKyAgICAgICAgRklOOiB0cnVlCisgICAgICB9OworCisgICAgICAvL0J5dGUgMCAtIEZJTiAmIE9QQ09ERQorICAgICAgaWYgKHdzRnJhbWUuZmluLkZJTiAhPSAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZpbi5GSU4pKSB7CisgICAgICAgIHJlc3VsdC5GSU4gPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5iaW5FbmNvZGluZyA9ICh3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5CSU4gPT0gKGZyYW1lWzBdICYgd3NGcmFtZS5mcmFtZU9wQ29kZXMuQklOKSk7CisgICAgICAvL0J5dGUgMSBvciAxLTMgb3IgMS05IC0gU0laRQorICAgICAgdmFyIGxlbkJ5dGUgPSAoZnJhbWVbMV0gJiAweDAwMDAwMDdGKTsKKyAgICAgIHZhciBsZW4gPSBsZW5CeXRlOworICAgICAgdmFyIGRhdGFPZmZzZXQgPSAyOworICAgICAgaWYgKGxlbkJ5dGUgPT0gMHg3RSkgeworICAgICAgICBsZW4gPSBmcmFtZS5yZWFkVUludDE2QkUoMik7CisgICAgICAgIGRhdGFPZmZzZXQgPSA0OworICAgICAgfSBlbHNlIGlmIChsZW5CeXRlID09IDB4N0YpIHsKKyAgICAgICAgbGVuID0gZnJhbWUucmVhZFVJbnQzMkJFKDYpOworICAgICAgICBkYXRhT2Zmc2V0ID0gMTA7CisgICAgICB9CisgICAgICAvL01BU0sKKyAgICAgIGlmICh3c0ZyYW1lLm1hc2suVE9fU0VSVkVSID09IChmcmFtZVsxXSAmIHdzRnJhbWUubWFzay5UT19TRVJWRVIpKSB7CisgICAgICAgIHJlc3VsdC5tYXNrID0gbmV3IEJ1ZmZlcig0KTsKKyAgICAgICAgZnJhbWUuY29weShyZXN1bHQubWFzaywgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCArIDQpOworICAgICAgICBkYXRhT2Zmc2V0ICs9IDQ7CisgICAgICB9CisgICAgICAvL1BheWxvYWQKKyAgICAgIHJlc3VsdC5kYXRhID0gbmV3IEJ1ZmZlcihsZW4pOworICAgICAgZnJhbWUuY29weShyZXN1bHQuZGF0YSwgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCtsZW4pOworICAgICAgaWYgKHJlc3VsdC5tYXNrKSB7CisgICAgICAgIHdzRnJhbWUuYXBwbHlNYXNrKHJlc3VsdC5kYXRhLCByZXN1bHQubWFzayk7CisgICAgICB9CisgICAgICAvL05leHQgRnJhbWUKKyAgICAgIGlmIChmcmFtZS5sZW5ndGggPiBkYXRhT2Zmc2V0K2xlbikgeworICAgICAgICByZXN1bHQubmV4dEZyYW1lID0gbmV3IEJ1ZmZlcihmcmFtZS5sZW5ndGggLSAoZGF0YU9mZnNldCtsZW4pKTsKKyAgICAgICAgZnJhbWUuY29weShyZXN1bHQubmV4dEZyYW1lLCAwLCBkYXRhT2Zmc2V0K2xlbiwgZnJhbWUubGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIC8vRG9uJ3QgZm9yd2FyZCBjb250cm9sIGZyYW1lcworICAgICAgaWYgKGZyYW1lWzBdICYgd3NGcmFtZS5mcmFtZU9wQ29kZXMuRklOQ1RSTCkgeworICAgICAgICByZXN1bHQuZGF0YSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgLyoqIE1hc2tzL1VubWFza3MgZGF0YQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIGRhdGEgdG8gbWFzay91bm1hc2sgaW4gcGxhY2UKKyAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSB0aGUgbWFzaworICAgKi8KKyAgYXBwbHlNYXNrOiBmdW5jdGlvbihkYXRhLCBtYXNrKXsKKyAgICAvL1RPRE86IGxvb2sgaW50byB4b3Jpbmcgd29yZHMgYXQgYSB0aW1lCisgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKKyAgICB2YXIgbWFza0xlbiA9IG1hc2subGVuZ3RoOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbjsgaSsrKSB7CisgICAgICBkYXRhW2ldID0gZGF0YVtpXSBeIG1hc2tbaSVtYXNrTGVuXTsKKyAgICB9CisgIH0sCisKKyAgLyoqIENvbXB1dGVzIGZyYW1lIHNpemUgb24gdGhlIHdpcmUgZnJvbSBkYXRhIHRvIGJlIHNlbnQKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBkYXRhLmxlbmd0aCBpcyB0aGUgYXNzdW1lZCBwYXlsb2FkIHNpemUKKyAgICogQHBhcmFtIHtCb29sZWFufSBtYXNrIC0gdHJ1ZSBpZiBhIG1hc2sgd2lsbCBiZSBzZW50IChUT19TRVJWRVIpCisgICAqLworICBmcmFtZVNpemVGcm9tRGF0YTogZnVuY3Rpb24oZGF0YSwgbWFzaykgeworICAgIHZhciBoZWFkZXJTaXplID0gMTA7CisgICAgaWYgKGRhdGEubGVuZ3RoIDwgMHg3RSkgeworICAgICAgaGVhZGVyU2l6ZSA9IDI7CisgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgeworICAgICAgaGVhZGVyU2l6ZSA9IDQ7CisgICAgfQorICAgIHJldHVybiBoZWFkZXJTaXplICsgZGF0YS5sZW5ndGggKyAobWFzayA/IDQgOiAwKTsKKyAgfSwKKworICBmcmFtZU9wQ29kZXM6IHsKKyAgICBDT05UOiAgICAgMHgwMCwKKyAgICBURVhUOiAgICAgMHgwMSwKKyAgICBCSU46ICAgICAgMHgwMiwKKyAgICBDVFJMOiAgICAgMHg4MAorICB9LAorCisgIG1hc2s6IHsKKyAgICBUT19TRVJWRVI6IDB4ODAsCisgICAgVE9fQ0xJRU5UOiAweDAwCisgIH0sCisKKyAgZmluOiB7CisgICAgQ09OVDogMHgwMCwKKyAgICBGSU46IDB4ODAKKyAgfQorfTsKKworCisvLyBjcmVhdGVXZWJTZXJ2ZXIgY29uc3RydWN0b3IgYW5kIG9wdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgU2VydmVyT3B0aW9ucworICogQHByb3BlcnR5IHthcnJheX0gY29ycyAtIEFycmF5IG9mIENPUlMgb3JpZ2luIHN0cmluZ3MgdG8gcGVybWl0IHJlcXVlc3RzIGZyb20uCisgKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZXMgLSBQYXRoIHRvIHNlcnZlIHN0YXRpYyBmaWxlcyBmcm9tLCBpZiBhYnNlbnQgb3IgIiIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmaWxlIHNlcnZpY2UgaXMgZGlzYWJsZWQuCisgKiBAcHJvcGVydHkge29iamVjdH0gaGVhZGVycyAtIEFuIG9iamVjdCBoYXNoIG1hcHBpbmcgaGVhZGVyIHN0cmluZ3MgdG8gaGVhZGVyIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MsIHRoZXNlIGhlYWRlcnMgYXJlIHRyYW5zbWl0dGVkIGluIHJlc3BvbnNlIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmaWxlIEdFVCBvcGVyYXRpb25zLgorICogQHByb3BlcnR5IHtvYmplY3R9IHNlcnZpY2VzIC0gQW4gb2JqZWN0IGhhc2ggbWFwcGluZyBzZXJ2aWNlIFVSSSBzdHJpbmdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBTZXJ2aWNlT3B0aW9ucyBvYmplY3RzCisgKiBAcHJvcGVydHkge29iamVjdH0gdGxzIC0gTm9kZS5qcyBUTFMgb3B0aW9ucyAoc2VlOiBub2RlanMub3JnL2FwaS90bHMuaHRtbCksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZXNlbnQgb3IgbnVsbCByZWd1bGFyIGh0dHAgaXMgdXNlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBsZWFzdCBhIGtleSBhbmQgYSBjZXJ0IG11c3QgYmUgZGVmaW5lZCB0byB1c2UgU1NML1RMUworICogQHNlZSB7QGxpbmsgU2VydmljZU9wdGlvbnN9CisgKi8KKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIFNlcnZpY2VPcHRpb25zCisgKiBAcHJvcGVydHkge29iamVjdH0gdHJhbnNwb3J0IC0gVGhlIGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoZGVmYXVsdHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUQnVmZmVyZWRUcmFuc3BvcnQpLgorICogQHByb3BlcnR5IHtvYmplY3R9IHByb3RvY29sIC0gVGhlIHNlcmlhbGl6YXRpb24gUHJvdG9jb2wgdG8gdXNlIChkZWZhdWx0cyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xhc3MvcHJvY2Vzc29yIGdlbmVyYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBJREwgQ29tcGlsZXIgZm9yIHRoZSBzZXJ2aWNlICh0aGUgImNscyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhpcyBhdHRyaWJ1dGUpLgorICogQHByb3BlcnR5IHtvYmplY3R9IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBtZXRob2RzIGZvciB0aGUgVGhyaWZ0IFNlcnZpY2UuCisgKi8KKworLyoqCisgKiBDcmVhdGUgYSBUaHJpZnQgc2VydmVyIHdoaWNoIGNhbiBzZXJ2ZSBzdGF0aWMgZmlsZXMgYW5kL29yIG9uZSBvcgorICogbW9yZSBUaHJpZnQgU2VydmljZXMuCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IFdlYiBTZXJ2ZXIuCisgKi8KK2V4cG9ydHMuY3JlYXRlV2ViU2VydmVyID0gZnVuY3Rpb24ob3B0aW9ucykgeworICB2YXIgYmFzZURpciA9IG9wdGlvbnMuZmlsZXM7CisgIHZhciBjb250ZW50VHlwZXNCeUV4dGVuc2lvbiA9IHsKKyAgICAnLnR4dCc6ICd0ZXh0L3BsYWluJywKKyAgICAnLmh0bWwnOiAndGV4dC9odG1sJywKKyAgICAnLmNzcyc6ICd0ZXh0L2NzcycsCisgICAgJy54bWwnOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsCisgICAgJy5qcyc6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKKyAgICAnLmpwZyc6ICdpbWFnZS9qcGVnJywKKyAgICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsCisgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJywKKyAgICAnLnBuZyc6ICdpbWFnZS9wbmcnLAorICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnCisgIH07CisKKyAgLy9TZXR1cCBhbGwgb2YgdGhlIHNlcnZpY2VzCisgIHZhciBzZXJ2aWNlcyA9IG9wdGlvbnMuc2VydmljZXM7CisgIGZvciAodmFyIHVyaSBpbiBzZXJ2aWNlcykgeworICAgIHZhciBzdmNPYmogPSBzZXJ2aWNlc1t1cmldOworCisgICAgLy9TZXR1cCB0aGUgcHJvY2Vzc29yCisgICAgaWYgKHN2Y09iai5wcm9jZXNzb3IgaW5zdGFuY2VvZiBNdWx0aXBsZXhlZFByb2Nlc3NvcikgeworICAgICAgLy9NdWx0aXBsZXggcHJvY2Vzc29ycyBoYXZlIHByZSBlbWJlZGRlZCBwcm9jZXNzb3IvaGFuZGxlciBwYWlycywgc2F2ZSBhcyBpcworICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IHN2Y09iai5wcm9jZXNzb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vRm9yIGhpc3RvcmljYWwgcmVhc29ucyBOb2RlLmpzIHN1cHBvcnRzIHByb2Nlc3NvcnMgcGFzc2VkIGluIGRpcmVjdGx5IG9yIHZpYSB0aGUKKyAgICAgIC8vICBJREwgQ29tcGlsZXIgZ2VuZXJhdGVkIGNsYXNzIGhvdXNpbmcgdGhlIHByb2Nlc3Nvci4gQWxzbywgdGhlIG9wdGlvbnMgcHJvcGVydHkKKyAgICAgIC8vICBmb3IgYSBQcm9jZXNzb3IgaGFzIGJlZW4gY2FsbGVkIGJvdGggY2xzIGFuZCBwcm9jZXNzb3IgYXQgZGlmZmVyZW50IHRpbWVzLiBXZQorICAgICAgLy8gIHN1cHBvcnQgYW55IG9mIHRoZSBmb3VyIHBvc3NpYmlsaXRpZXMgaGVyZS4KKyAgICAgIHZhciBwcm9jZXNzb3IgPSAoc3ZjT2JqLnByb2Nlc3NvcikgPyAoc3ZjT2JqLnByb2Nlc3Nvci5Qcm9jZXNzb3IgfHwgc3ZjT2JqLnByb2Nlc3NvcikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdmNPYmouY2xzLlByb2Nlc3NvciB8fCBzdmNPYmouY2xzKTsKKyAgICAgIC8vUHJvY2Vzc29ycyBjYW4gYmUgc3VwcGxpZWQgYXMgY29uc3RydWN0ZWQgb2JqZWN0cyB3aXRoIGhhbmRsZXJzIGFscmVhZHkgZW1iZWRkZWQsCisgICAgICAvLyAgaWYgYSBoYW5kbGVyIGlzIHByb3ZpZGVkIHdlIGNvbnN0cnVjdCBhIG5ldyBwcm9jZXNzb3IsIGlmIG5vdCB3ZSB1c2UgdGhlIHByb2Nlc3NvcgorICAgICAgLy8gIG9iamVjdCBkaXJlY3RseQorICAgICAgaWYgKHN2Y09iai5oYW5kbGVyKSB7CisgICAgICAgIHN2Y09iai5wcm9jZXNzb3IgPSBuZXcgcHJvY2Vzc29yKHN2Y09iai5oYW5kbGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN2Y09iai5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICB9CisgICAgfQorICAgIHN2Y09iai50cmFuc3BvcnQgPSBzdmNPYmoudHJhbnNwb3J0ID8gc3ZjT2JqLnRyYW5zcG9ydCA6IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgICBzdmNPYmoucHJvdG9jb2wgPSBzdmNPYmoucHJvdG9jb2wgPyBzdmNPYmoucHJvdG9jb2wgOiBUQmluYXJ5UHJvdG9jb2w7CisgIH0KKworICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICBmdW5jdGlvbiBWZXJpZnlDT1JTQW5kU2V0SGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIGlmIChyZXF1ZXN0LmhlYWRlcnMub3JpZ2luICYmIG9wdGlvbnMuY29ycykgeworICAgICAgaWYgKG9wdGlvbnMuY29yc1siKiJdIHx8IG9wdGlvbnMuY29yc1tyZXF1ZXN0LmhlYWRlcnMub3JpZ2luXSkgeworICAgICAgICAvL0FsbG93LCBvcmlnaW4gYWxsb3dlZAorICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpbiIsIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4pOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLWFsbG93LW1ldGhvZHMiLCAiR0VULCBQT1NULCBPUFRJT05TIik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctaGVhZGVycyIsICJjb250ZW50LXR5cGUsIGFjY2VwdCIpOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLW1heC1hZ2UiLCAiNjAiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvL0Rpc2FsbG93LCBvcmlnaW4gZGVuaWVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy9BbGxvdywgQ09SUyBpcyBub3QgaW4gdXNlCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisgIC8vSGFuZGxlIE9QVElPTlMgbWV0aG9kIChDT1JTKQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc09wdGlvbnMocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICBpZiAoVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjIwNCIsICJObyBDb250ZW50IiwgeyJjb250ZW50LWxlbmd0aCI6IDB9KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICB9CisgICAgcmVzcG9uc2UuZW5kKCk7CisgIH0KKworCisgIC8vSGFuZGxlIFBPU1QgbWV0aG9kcyAoVFhIUlRyYW5zcG9ydCkKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIGZ1bmN0aW9uIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgLy9Mb29rdXAgc2VydmljZQorICAgIHZhciB1cmkgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpLnBhdGhuYW1lOworICAgIHZhciBzdmMgPSBzZXJ2aWNlc1t1cmldOworICAgIGlmICghc3ZjKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJObyBBcGFjaGUgVGhyaWZ0IFNlcnZpY2UgYXQgIiArIHVyaSwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKKyAgICBpZiAoIVZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vUHJvY2VzcyBYSFIgcGF5bG9hZAorICAgIHJlcXVlc3Qub24oJ2RhdGEnLCBzdmMudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgc3ZjLnByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgc3ZjLnByb3RvY29sKG5ldyBzdmMudHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgICB9CisgICAgICB9KSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHN2Yy5wcm9jZXNzb3IucHJvY2VzcyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSkpOworICB9CisKKworICAvL0hhbmRsZSBHRVQgbWV0aG9kcyAoU3RhdGljIFBhZ2UgU2VydmVyKQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc0dldChyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIC8vVW5kZWZpbmVkIG9yIGVtcHR5IGJhc2UgZGlyZWN0b3J5IG1lYW5zIGRvIG5vdCBzZXJ2ZSBzdGF0aWMgZmlsZXMKKyAgICBpZiAoIWJhc2VEaXIgfHwgIiIgPT09IGJhc2VEaXIpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKKyAgICBpZiAoIVZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTG9jYXRlIHRoZSBmaWxlIHJlcXVlc3RlZCBhbmQgc2VuZCBpdAorICAgIHZhciB1cmkgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpLnBhdGhuYW1lOworICAgIHZhciBmaWxlbmFtZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oYmFzZURpciwgdXJpKSk7CisKKyAgICAvL0Vuc3VyZSB0aGUgYmFzZWRpciBwYXRoIGlzIG5vdCBhYmxlIHRvIGJlIGVzY2FwZWQKKyAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZihiYXNlRGlyKSAhPSAwKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoNDAwLCAiSW52YWxpZCByZXF1ZXN0IHBhdGgiLCB7fSk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcy5leGlzdHMoZmlsZW5hbWUsIGZ1bmN0aW9uKGV4aXN0cykgeworICAgICAgaWYoIWV4aXN0cykgeworICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNDA0KTsKKyAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGVuYW1lKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIGZpbGVuYW1lICs9ICcvaW5kZXguaHRtbCc7CisgICAgICB9CisKKyAgICAgIGZzLnJlYWRGaWxlKGZpbGVuYW1lLCAiYmluYXJ5IiwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwKTsKKyAgICAgICAgICByZXNwb25zZS5lbmQoZXJyICsgIlxuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZhciBoZWFkZXJzID0ge307CisgICAgICAgIHZhciBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlc0J5RXh0ZW5zaW9uW3BhdGguZXh0bmFtZShmaWxlbmFtZSldOworICAgICAgICBpZiAoY29udGVudFR5cGUpIHsKKyAgICAgICAgICBoZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9IGNvbnRlbnRUeXBlOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGsgaW4gb3B0aW9ucy5oZWFkZXJzKSB7CisgICAgICAgICAgaGVhZGVyc1trXSA9IG9wdGlvbnMuaGVhZGVyc1trXTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwLCBoZWFkZXJzKTsKKyAgICAgICAgcmVzcG9uc2Uud3JpdGUoZmlsZSwgImJpbmFyeSIpOworICAgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKworICAvL0hhbmRsZSBXZWJTb2NrZXQgY2FsbHMgKFRXZWJTb2NrZXRUcmFuc3BvcnQpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzV1MoZGF0YSwgc29ja2V0LCBzdmMsIGJpbkVuY29kaW5nKSB7CisgICAgc3ZjLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRXaXRoRGF0YSkgeworICAgICAgdmFyIGlucHV0ID0gbmV3IHN2Yy5wcm90b2NvbCh0cmFuc3BvcnRXaXRoRGF0YSk7CisgICAgICB2YXIgb3V0cHV0ID0gbmV3IHN2Yy5wcm90b2NvbChuZXcgc3ZjLnRyYW5zcG9ydCh1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0cnkgeworICAgICAgICAgIHZhciBmcmFtZSA9IHdzRnJhbWUuZW5jb2RlKGJ1ZiwgbnVsbCwgYmluRW5jb2RpbmcpOworICAgICAgICAgIHNvY2tldC53cml0ZShmcmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIC8vVE9ETzogQWRkIGJldHRlciBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc3ZjLnByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgfQorICAgICAgY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vVE9ETzogQWRkIGJldHRlciBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KShkYXRhKTsKKyAgfQorCisgIC8vQ3JlYXRlIHRoZSBzZXJ2ZXIgKEhUVFAgb3IgSFRUUFMpCisgIHZhciBzZXJ2ZXIgPSBudWxsOworICBpZiAob3B0aW9ucy50bHMpIHsKKyAgICBzZXJ2ZXIgPSBodHRwcy5jcmVhdGVTZXJ2ZXIob3B0aW9ucy50bHMpOworICB9IGVsc2UgeworICAgIHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKCk7CisgIH0KKworICAvL1dpcmUgdXAgbGlzdGVuZXJzIGZvciB1cGdyYWRlKHRvIFdlYlNvY2tldCkgJiByZXF1ZXN0IG1ldGhvZHMgZm9yOgorICAvLyAgIC0gR0VUIHN0YXRpYyBmaWxlcywKKyAgLy8gICAtIFBPU1QgWEhSIFRocmlmdCBzZXJ2aWNlcworICAvLyAgIC0gT1BUSU9OUyBDT1JTIHJlcXVlc3RzCisgIHNlcnZlci5vbigncmVxdWVzdCcsIGZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpIHsKKyAgICAgIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnR0VUJykgeworICAgICAgcHJvY2Vzc0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7CisgICAgICBwcm9jZXNzT3B0aW9ucyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgfQorICB9KS5vbigndXBncmFkZScsIGZ1bmN0aW9uKHJlcXVlc3QsIHNvY2tldCwgaGVhZCkgeworICAgIC8vTG9va3VwIHNlcnZpY2UKKyAgICB2YXIgc3ZjOworICAgIHRyeSB7CisgICAgICBzdmMgPSBzZXJ2aWNlc1tPYmplY3Qua2V5cyhzZXJ2aWNlcylbMF1dOworICAgIH0gY2F0Y2goZSkgeworICAgICAgc29ja2V0LndyaXRlKCJIVFRQLzEuMSA0MDMgTm8gQXBhY2hlIFRocmlmdCBTZXJ2aWNlIGF2YWlsYWJsZVxyXG5cclxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vUGVyZm9ybSB1cGdyYWRlCisgICAgdmFyIGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgic2hhMSIpOworICAgIGhhc2gudXBkYXRlKHJlcXVlc3QuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1rZXknXSArICIyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEiKTsKKyAgICBzb2NrZXQud3JpdGUoIkhUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJVcGdyYWRlOiB3ZWJzb2NrZXRcclxuIiArCisgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IFVwZ3JhZGVcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlNlYy1XZWJTb2NrZXQtQWNjZXB0OiAiICsgaGFzaC5kaWdlc3QoImJhc2U2NCIpICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1PcmlnaW46ICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1Mb2NhdGlvbjogd3M6Ly8iICsgcmVxdWVzdC5oZWFkZXJzLmhvc3QgKyByZXF1ZXN0LnVybCArICJcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlxyXG4iKTsKKyAgICAvL0hhbmRsZSBXZWJTb2NrZXQgdHJhZmZpYworICAgIHZhciBkYXRhID0gbnVsbDsKKyAgICBzb2NrZXQub24oJ2RhdGEnLCBmdW5jdGlvbihmcmFtZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKGZyYW1lKSB7CisgICAgICAgICAgdmFyIHJlc3VsdCA9IHdzRnJhbWUuZGVjb2RlKGZyYW1lKTsKKyAgICAgICAgICAvL1ByZXBlbmQgYW55IGV4aXN0aW5nIGRlY29kZWQgZGF0YQorICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHsKKyAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBuZXcgQnVmZmVyKGRhdGEubGVuZ3RoICsgcmVzdWx0LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgZGF0YS5jb3B5KG5ld0RhdGEpOworICAgICAgICAgICAgICByZXN1bHQuZGF0YS5jb3B5KG5ld0RhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBuZXdEYXRhOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIC8vSWYgdGhpcyBjb21wbGV0ZXMgYSBtZXNzYWdlIHByb2Nlc3MgaXQKKyAgICAgICAgICBpZiAocmVzdWx0LkZJTikgeworICAgICAgICAgICAgcHJvY2Vzc1dTKHJlc3VsdC5kYXRhLCBzb2NrZXQsIHN2YywgcmVzdWx0LmJpbkVuY29kaW5nKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IHJlc3VsdC5kYXRhOworICAgICAgICAgIH0KKyAgICAgICAgICAvL1ByZXBhcmUgbmV4dCBmcmFtZSBmb3IgZGVjb2RpbmcgKGlmIGFueSkKKyAgICAgICAgICBmcmFtZSA9IHJlc3VsdC5uZXh0RnJhbWU7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICBsb2cuZXJyb3IoJ1RXZWJTb2NrZXRUcmFuc3BvcnQgRXhjZXB0aW9uOiAnICsgZSk7CisgICAgICAgIHNvY2tldC5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisgIC8vUmV0dXJuIHRoZSBzZXJ2ZXIKKyAgcmV0dXJuIHNlcnZlcjsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgV2ViU29ja2V0ID0gcmVxdWlyZSgnd3MnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTsKK3ZhciB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCit2YXIgY3JlYXRlQ2xpZW50ID0gcmVxdWlyZSgnLi9jcmVhdGVfY2xpZW50Jyk7CisKK2V4cG9ydHMuV1NDb25uZWN0aW9uID0gV1NDb25uZWN0aW9uOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgV1NDb25uZWN0T3B0aW9ucworICogQHByb3BlcnR5IHtzdHJpbmd9IHRyYW5zcG9ydCAtIFRoZSBUaHJpZnQgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChUQnVmZmVyZWRUcmFuc3BvcnQsIGV0YykuCisgKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2wgLSBUaGUgVGhyaWZ0IHNlcmlhbGl6YXRpb24gcHJvdG9jb2wgdG8gdXNlIChUSlNPTlByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIGNvbm5lY3QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBzZWN1cmUgLSBUcnVlIGNhdXNlcyB0aGUgY29ubmVjdGlvbiB0byB1c2Ugd3NzLCBvdGhlcndpc2Ugd3MgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB3c09wdGlvbnMgLSBPcHRpb25zIHBhc3NlZCBvbiB0byBXZWJTb2NrZXQuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgc2VjdXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbgorICogICAgIC8vICB1c2VzIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgbGF5ZXIsIHVzZXMgdGhlIEpTT04gcHJvdG9jb2wgYW5kIGRpcmVjdHMgUlBDIHRyYWZmaWMKKyAqICAgICAvLyAgdG8gd3NzOi8vdGhyaWZ0LmV4YW1wbGUuY29tOjkwOTAvaGVsbG8KKyAqICAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgKiAgICAgdmFyIG9wdGlvbnMgPSB7CisgKiAgICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICogICAgICAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAqICAgICAgICBwYXRoOiAiL2hlbGxvIiwKKyAqICAgICAgICBzZWN1cmU6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKCJ0aHJpZnQuZXhhbXBsZS5jb20iLCA5MDkwLCBvcHRpb25zKTsKKyAqICAgICBjb24ub3BlbigpCisgKiAgICAgdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICogICAgIGNvbi5jbG9zZSgpCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIFRocmlmdCBXU0Nvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVXU0Nvbm5lY3Rpb24oKSByYXRoZXIgdGhhbgorICogICAgaW5zdGFudGlhdGluZyBkaXJlY3RseSkuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7V1NDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KKyAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKKyAqICAgICByZXF1ZXN0IG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG5vZGUgZXJyb3IgaXMgcGFzc2VkIG9uLiBBbiAiZXJyb3IiCisgKiAgICAgZXZlbnQgbWF5IGFsc28gYmUgZmlyZWQgd2hlbiB0aGUgY29ubmVjdGlzb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBXU0Nvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFdlYnNvY2tldHMuCisgKiBAc2VlIHtAbGluayBjcmVhdGVXU0Nvbm5lY3Rpb259CisgKi8KK2Z1bmN0aW9uIFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIC8vSW5pdGlhbGl6ZSB0aGUgZW1pdHRlciBiYXNlIG9iamVjdAorICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICAvL1NldCBjb25maWd1cmF0aW9uCisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgdGhpcy5zZWN1cmUgPSB0aGlzLm9wdGlvbnMuc2VjdXJlIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRKU09OUHJvdG9jb2w7CisgIHRoaXMucGF0aCA9IHRoaXMub3B0aW9ucy5wYXRoOworICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOworCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKKworICAvL1ByZXBhcmUgV2ViU29ja2V0IG9wdGlvbnMKKyAgdGhpcy53c09wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCB8fCA4MCwKKyAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCisgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30KKyAgfTsKKyAgZm9yICh2YXIgYXR0cm5hbWUgaW4gdGhpcy5vcHRpb25zLndzT3B0aW9ucykgeworICAgIHRoaXMud3NPcHRpb25zW2F0dHJuYW1lXSA9IHRoaXMub3B0aW9ucy53c09wdGlvbnNbYXR0cm5hbWVdOworICB9Cit9OwordXRpbC5pbmhlcml0cyhXU0Nvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldCA9IG51bGw7IC8vVGhlIHdlYiBzb2NrZXQKKyAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgLy9CdWZmZXJzL0NhbGxiYWNrIHBhaXJzIHdhaXRpbmcgdG8gYmUgc2VudAorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uT3BlbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuZW1pdCgib3BlbiIpOworICBpZiAodGhpcy5zZW5kX3BlbmRpbmcubGVuZ3RoID4gMCkgeworICAgIC8vSWYgdGhlIHVzZXIgbWFkZSBjYWxscyBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGZ1bGx5CisgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgdGhpcy5zZW5kX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CisgICAgICBzZWxmLnNvY2tldC5zZW5kKGRhdGEpOworICAgIH0pOworICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgIH0KK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkNsb3NlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiY2xvc2UiKTsKKyAgdGhpcy5fX3Jlc2V0KCk7Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fZGVjb2RlQ2FsbGJhY2sgPSBmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgIHZhciBwcm90byA9IG5ldyB0aGlzLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICB0cnkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgaGVhZGVyID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgdmFyIGNsaWVudCA9IHRoaXMuY2xpZW50OworICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgIC8vICBsb29rdXAgdGhlIGFwcHJvcHJpYXRlIGNsaWVudCBmb3IgdGhpcyBjYWxsLgorICAgICAgLy8gIFRoZSBjbGllbnQgdmFyIGlzIGEgc2luZ2xlIGNsaWVudCBvYmplY3Qgd2hlbiBub3QgbXVsdGlwbGV4aW5nLAorICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAvLyAgb2JqZWN0cy4KKyAgICAgIC8vTk9URTogVGhlIDIgd2F5IGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gcHJvdG9jb2xzLCB0cmFuc3BvcnRzLAorICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCisgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAvLyAgLS1yYQorICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgY2xpZW50ID0gdGhpcy5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgZGVsZXRlIHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIH0KKyAgICAgIC8qanNoaW50IC1XMDgzICovCisgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKSB7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICBjbGllbnRDYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICB9CisgICAgICB9OworICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgIGlmIChjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdOworICAgICAgICB0aGlzLmVtaXQoImVycm9yIiwKKyAgICAgICAgICBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgIlJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gYW4gdW5rbm93biBSUEMgZnVuY3Rpb24iKSk7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CisgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEpOworICB9CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGRhdGEpOworICB0aGlzLnRyYW5zcG9ydC5yZWNlaXZlcih0aGlzLl9fZGVjb2RlQ2FsbGJhY2suYmluZCh0aGlzKSkoYnVmKTsKKworfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fb25EYXRhKGV2dC5kYXRhKTsKK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiZXJyb3IiLCBldnQpOworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PSB0aGlzLnNvY2tldC5PUEVOOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7CisgIC8vSWYgT1BFTi9DT05ORUNUSU5HL0NMT1NJTkcgaWdub3JlIGFkZGl0aW9uYWwgb3BlbnMKKyAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmkoKSwgIiIsIHRoaXMud3NPcHRpb25zKTsKKyAgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm4gVVJJIGZvciB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMge3N0cmluZ30gVVJJCisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUudXJpID0gZnVuY3Rpb24oKSB7CisgIHZhciBzY2hlbWEgPSB0aGlzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJzsKKyAgdmFyIHBvcnQgPSAnJzsKKyAgdmFyIHBhdGggPSB0aGlzLnBhdGggfHwgJy8nOworICB2YXIgaG9zdCA9IHRoaXMuaG9zdDsKKworICAvLyBhdm9pZCBwb3J0IGlmIGRlZmF1bHQgZm9yIHNjaGVtYQorICBpZiAodGhpcy5wb3J0ICYmICgoJ3dzcycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA0NDMpIHx8CisgICAgKCd3cycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA4MCkpKSB7CisgICAgcG9ydCA9ICc6JyArIHRoaXMucG9ydDsKKyAgfQorCisgIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIGhvc3QgKyBwb3J0ICsgcGF0aDsKK307CisKKy8qKgorICogV3JpdGVzIFRocmlmdCBtZXNzYWdlIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gQSBOb2RlLmpzIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLgorICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlCisgKiAgICAgTm9kZS5qcyBlcnJvciBvYmplY3QgdG8gdGhlIGxpc3RlbmVyLgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goZGF0YSk7CisgIH0KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBXU0Nvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge1dTQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtXU0Nvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIFdTQ29ubmVjdE9wdGlvbnN9CisgKi8KK2V4cG9ydHMuY3JlYXRlV1NDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlV1NDbGllbnQgPSBjcmVhdGVDbGllbnQ7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEzYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUV2ViU29ja2V0VHJhbnNwb3J0OworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqLworZnVuY3Rpb24gVFdlYlNvY2tldFRyYW5zcG9ydCh1cmwpIHsKKyAgICB0aGlzLl9fcmVzZXQodXJsKTsKK307CisKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKHVybCkgeworICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgIHRoaXMuc29ja2V0ID0gbnVsbDsgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgIHRoaXMuY2FsbGJhY2tzID0gW107ICAgICAgICAvL1BlbmRpbmcgY2FsbGJhY2tzCisgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgIHRoaXMuc2VuZF9idWYgPSAnJzsgICAgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgIHRoaXMucmVjdl9idWYgPSAnJzsgICAgICAgICAvL0luYm91bmQgZGF0YQorICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgIHRoaXMucmJfcnBvcyA9IDA7ICAgICAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCAoV1MgZmx1c2ggaXMgYWx3YXlzIGFzeW5jKSBhbmQgdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gVGhlIGNsaWVudCBjb21wbGV0aW9uIGNhbGxiYWNrLgorICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgeworICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgIH07CisgICAgfSgpKSk7CisgIH0gZWxzZSB7CisgICAgLy9RdWV1ZSB0aGUgc2VuZCB0byBnbyBvdXQgX19vbk9wZW4KKyAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKKyAgICAgIGNiOiAgY2FsbGJhY2sKKyAgICB9KTsKKyAgfQorfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk9wZW4gPSBmdW5jdGlvbigpIHsKKyAgIHZhciBzZWxmID0gdGhpczsKKyAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQorICAgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7CisgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7CisgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgIH07CisgICAgICAgICB9KCkpKTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgIH0KK307CisKK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLl9fb25DbG9zZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOworfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk1lc3NhZ2UgPSBmdW5jdGlvbihldnQpIHsKKyAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOworICB9Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgbG9nLmVycm9yKCd3ZWJzb2NrZXQ6ICcgKyBldnQudG9TdHJpbmcoKSk7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0UmVjdkJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICB0aGlzLnJwb3MgPSAwOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKKyAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5nZXRTZW5kQnVmZmVyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnNlbmRfYnVmOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU5YzkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0gWEhSQ29ubmVjdGlvbjsKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFhIUiBDb25uZWN0aW9uLgorICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgaG9zdCBhbmQgcG9ydCB0aGVuIFhIUkNvbm5lY3Rpb24gd2lsbCBkZWZhdWx0IHRvIHRoZQorICogaG9zdCBhbmQgcG9ydCBvZiB0aGUgcGFnZSBmcm9tIHdoaWNoIHRoaXMgamF2YXNjcmlwdCBpcyBzZXJ2ZWQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVFhIUkNvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFhIUi4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUkNvbm5lY3Rpb24oJ2xvY2FsaG9zdCcsIDkwOTksIHt9KTsKKyAqLworZnVuY3Rpb24gWEhSQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMud3BvcyA9IDA7CisgIHRoaXMucnBvcyA9IDA7CisgIHRoaXMudXNlQ09SUyA9IChvcHRpb25zICYmIG9wdGlvbnMudXNlQ09SUyk7CisgIHRoaXMuc2VuZF9idWYgPSAnJzsKKyAgdGhpcy5yZWN2X2J1ZiA9ICcnOworICB0aGlzLnRyYW5zcG9ydCA9IG9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2wgfHwgVEpTT05Qcm90b2NvbDsKKyAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9OworCisgIGhvc3QgPSBob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0OworICBwb3J0ID0gcG9ydCB8fCB3aW5kb3cubG9jYXRpb24ucG9ydDsKKyAgdmFyIHByZWZpeCA9IG9wdGlvbnMuaHR0cHMgPyAnaHR0cHM6Ly8nIDogJ2h0dHA6Ly8nOworICB2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnLyc7CisKKyAgaWYgKHBvcnQgPT09ICcnKSB7CisgICAgcG9ydCA9IHVuZGVmaW5lZDsKKyAgfQorCisgIGlmICghcG9ydCB8fCBwb3J0ID09PSA4MCB8fCBwb3J0ID09PSAnODAnKSB7CisgICAgdGhpcy51cmwgPSBwcmVmaXggKyBob3N0ICsgcGF0aDsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnVybCA9IHByZWZpeCArIGhvc3QgKyAnOicgKyBwb3J0ICsgcGF0aDsKKyAgfQorCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKK307CisKK3V0aWwuaW5oZXJpdHMoWEhSQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworLyoqCisqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0ID0gZnVuY3Rpb24oKSB7CisgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSBjYXRjaCAoZTEpIHsgfQorICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUyKSB7IH0KKyAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoIChlMykgeyB9CisKKyAgdGhyb3cgIllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgWEhSLiI7Cit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTAorICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgorICogdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nIG9yIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyLgorICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgaWYgKHRoaXMudXJsID09PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT09ICcnKSB7CisgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgIH0KKworICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7CisgIH0KKworICB4cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcih0aGlzLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9OworCisgIHhyZXEub3BlbignUE9TVCcsIHRoaXMudXJsLCB0cnVlKTsKKworICBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyS2V5KSB7CisgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlcktleSwgc2VsZi5oZWFkZXJzW2hlYWRlcktleV0pOworICB9KTsKKworICB4cmVxLnNlbmQodGhpcy5zZW5kX2J1Zik7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byBwcm92aWRlIHRoZSBwcm90b2NvbCB3aGVuIGRlc2VyaWFsaXppbmcuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZWN2QnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMucmVjdl9idWYgPSBidWY7CisgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMucnBvcyA9IDA7CisKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChidWYpID09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKKyAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CisgIH0KKyAgdmFyIHRoaW5nID0gbmV3IEJ1ZmZlcihkYXRhIHx8IGJ1Zik7CisKKyAgdGhpcy50cmFuc3BvcnQucmVjZWl2ZXIodGhpcy5fX2RlY29kZUNhbGxiYWNrLmJpbmQodGhpcykpKHRoaW5nKTsKKworfTsKKworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuX19kZWNvZGVDYWxsYmFjayA9IGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgdmFyIHByb3RvID0gbmV3IHRoaXMucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBoZWFkZXIgPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gdGhpcy5jbGllbnQ7CisgICAgICAvL1RoZSBNdWx0aXBsZXhlZCBQcm90b2NvbCBzdG9yZXMgYSBoYXNoIG9mIHNlcWlkIHRvIHNlcnZpY2UgbmFtZXMKKyAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAvLyAgVGhlIGNsaWVudCB2YXIgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdCBtdWx0aXBsZXhpbmcsCisgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgIC8vICBvYmplY3RzLgorICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgIC8vICAtLXJhCisgICAgICB2YXIgc2VydmljZV9uYW1lID0gdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICBjbGllbnQgPSB0aGlzLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgfQorICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgaWYgKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLAorICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIFhIUiBhbHdheXMgcmV0dXJucyB0cnVlLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKKworLyoqCisgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworICB0aGlzLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlbmRCdWZmZXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgVFhIUlRyYW5zcG9ydCBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7WEhSQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtYSFJDb25uZWN0aW9ufSBUaGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiBAc2VlIHtAbGluayBYSFJDb25uZWN0T3B0aW9uc30KKyAqLworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFhIUkNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvcGFja2FnZS5qc29uIGIvbGliL25vZGVqcy9wYWNrYWdlLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzBlNzYuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy9wYWNrYWdlLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi17Ci0gICJuYW1lIjogInRocmlmdCIsCi0gICJkZXNjcmlwdGlvbiI6ICJub2RlLXRocmlmdCIsCi0gICJ2ZXJzaW9uIjogIjAuNi4xIiwKLSAgImF1dGhvciI6ICJBcGFjaGUgVGhyaWZ0IiwKLSAgImRpcmVjdG9yaWVzIiA6IHsgImxpYiIgOiAiLi9saWIvdGhyaWZ0IiB9LAotICAibWFpbiI6ICIuL2xpYi90aHJpZnQiLAotICAiZW5naW5lcyI6IHsgIm5vZGUiOiAiPj0gMC4yLjQiIH0sCi19CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMgYi9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3Y2QxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgYmluYXJ5ID0gcmVxdWlyZSgidGhyaWZ0L2JpbmFyeSIpOworCitjb25zdCBjYXNlcyA9IHsKKyAgIlNob3VsZCByZWFkIHNpZ25lZCBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDEsIGJpbmFyeS5yZWFkQnl0ZSgweDAxKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEJ5dGUoMHhmZikpOworCisgICAgYXNzZXJ0LmVxdWFsKDEyNywgYmluYXJ5LnJlYWRCeXRlKDB4N2YpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEyOCwgYmluYXJ5LnJlYWRCeXRlKDB4ODApKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisgICJTaG91bGQgd3JpdGUgYnl0ZSI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIC8vUHJvdG9jb2wgc2ltcGx5IHdyaXRlcyB0byB0aGUgYnVmZmVyLiBOb3RoaW5nIHRvIHRlc3QuLiB5ZXQuCisgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKyAgIlNob3VsZCByZWFkIEkxNiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbCgwLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMF0pKTsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRJMTYoWzB4MDAsIDB4MDFdKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEkxNihbMHhmZiwgMHhmZl0pKTsKKworICAgIC8vIE1pbiBJMTYKKyAgICBhc3NlcnQuZXF1YWwoLTMyNzY4LCBiaW5hcnkucmVhZEkxNihbMHg4MCwgMHgwMF0pKTsKKyAgICAvLyBNYXggSTE2CisgICAgYXNzZXJ0LmVxdWFsKDMyNzY3LCBiaW5hcnkucmVhZEkxNihbMHg3ZiwgMHhmZl0pKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCB3cml0ZSBJMTYiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAwKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMV0sIGJpbmFyeS53cml0ZUkxNihbXSwgMSkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMTYoW10sIC0xKSk7CisKKyAgICAvLyBNaW4gSTE2CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg4MCwgMHgwMF0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTMyNzY4KSk7CisgICAgLy8gTWF4IEkxNgorICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMTYoW10sIDMyNzY3KSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgcmVhZCBJMzIiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoMCwgYmluYXJ5LnJlYWRJMzIoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSk7CisgICAgYXNzZXJ0LmVxdWFsKDEsIGJpbmFyeS5yZWFkSTMyKFsweDAwLCAweDAwLCAweDAwLCAweDAxXSkpOworICAgIGFzc2VydC5lcXVhbCgtMSwgYmluYXJ5LnJlYWRJMzIoWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSk7CisKKyAgICAvLyBNaW4gSTMyCisgICAgYXNzZXJ0LmVxdWFsKC0yMTQ3NDgzNjQ4LCBiaW5hcnkucmVhZEkzMihbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0pKTsKKyAgICAvLyBNYXggSTMyCisgICAgYXNzZXJ0LmVxdWFsKDIxNDc0ODM2NDcsIGJpbmFyeS5yZWFkSTMyKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIEkzMiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMzIoW10sIDApKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAwLCAweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAxKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkzMihbXSwgLTEpKTsKKworICAgIC8vIE1pbiBJMzIKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlSTMyKFtdLCAtMjE0NzQ4MzY0OCkKKyAgICApOworICAgIC8vIE1heCBJMzIKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAyMTQ3NDgzNjQ3KSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgcmVhZCBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDAsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMiwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIC0yLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICBNYXRoLlBJLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0pCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIEluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLUluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4ZmYsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisKKyAgICBhc3NlcnQub2soCisgICAgICBpc05hTihiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgICk7CisKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxIC8gMywKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSkKKyAgICApOworCisgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSkKKyAgICApOworICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICAvLyBNYXggcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSkKKyAgICApOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIGRvdWJsZXMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAwKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIpCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAtMikKKyAgICApOworCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBNYXRoLlBJKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC1JbmZpbml0eSkKKyAgICApOworCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTmFOKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxIC8gMykKKyAgICApOworCisgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCkKKyAgICApOworICAgIC8vIE1pbiBub3JtYWwgcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpCisgICAgKTsKKyAgICAvLyBNYXggcG9zaXRpdmUgZG91YmxlCisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGVmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCkKKyAgICApOworICAgIGFzc2VydC5lbmQoKTsKKyAgfQorfTsKKworT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgdGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKK30pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2NlcnRpZmljYXRlcy5SRUFETUUgYi9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2NlcnRpZmljYXRlcy5SRUFETUUKQEAgLTAsMCArMSw3IEBACitzZXJ2ZXIuY3J0IEFORCBzZXJ2ZXIua2V5IEFSRSBQUk9WSURFRCBGT1IgVEVTVCBQVVJQT1NFIEFORCBTSE9VTEQgKk5FVkVSKiBCRSBVU0VEIElOIFBST0RVQ1RJT04KKworCitPcmlnaW4gb2YgdGhlIHRlc3Qga2V5IGFuZCBjZXJ0IGlzIHRoZSBmb2xkZXIgdGVzdC9rZXlzIG9mIEFwYWNoZSBUaHJpZnQgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9uCisKK1dlIG5lZWQgY29waWVzIGZvciBucG0gZGVwbG95bWVudAorCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUzYTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpAQCAtMCwwICsxLDE3MCBAQAorIyEvdXNyL2Jpbi9lbnYgbm9kZQorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoImFzc2VydCIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Citjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7CisKK2NvbnN0IFRocmlmdFRlc3QgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0YCk7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpLlRocmlmdFRlc3REcml2ZXI7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKQorICAuVGhyaWZ0VGVzdERyaXZlclByb21pc2U7Citjb25zdCBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vU2Vjb25kU2VydmljZWApOworCitjb25zdCBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7CisKK3Byb2dyYW0KKyAgLm9wdGlvbigKKyAgICAiLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPiIsCisgICAgIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxjb21wYWN0fGpzb24pIFtwcm90b2NvbF0iCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSBbdHJhbnNwb3J0XSIKKyAgKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiLCA5MDkwKQorICAub3B0aW9uKCItLWhvc3QgPGhvc3Q+IiwgIlNldCB0aHJpZnQgc2VydmVyIGhvc3QgdG8gY29ubmVjdCIsICJsb2NhbGhvc3QiKQorICAub3B0aW9uKAorICAgICItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwKKyAgICAiU2V0IHRocmlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IHRvIGNvbm5lY3QiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIFNTTCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKAorICAgICItdCwgLS10eXBlIDx0eXBlPiIsCisgICAgIlNlbGVjdCBzZXJ2ZXIgdHlwZSAoaHR0cHxtdWx0aXBsZXh8dGNwfHdlYnNvY2tldCkiLAorICAgICJ0Y3AiCisgICkKKyAgLm9wdGlvbigiLS1lczYiLCAiVXNlIGVzNiBjb2RlIikKKyAgLm9wdGlvbigiLS1lczUiLCAiVXNlIGVzNSBjb2RlIikKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK2NvbnN0IGhvc3QgPSBwcm9ncmFtLmhvc3Q7Citjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKK2xldCB0eXBlID0gcHJvZ3JhbS50eXBlOworCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNyb3NzIHRlc3QgaW52b2NhdGlvbiBmb3IgaHR0cCB0cmFuc3BvcnQgdGVzdGluZyAqLworaWYgKHByb2dyYW0udHJhbnNwb3J0ID09PSAiaHR0cCIpIHsKKyAgcHJvZ3JhbS50cmFuc3BvcnQgPSAiYnVmZmVyZWQiOworICB0eXBlID0gImh0dHAiOworfQorCitjb25zdCBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCisgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQorfTsKKworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLnBhdGggPSAiL3Rlc3QiOworfQorCitpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIG9wdGlvbnMuaGVhZGVycyA9IHsgQ29ubmVjdGlvbjogImNsb3NlIiB9OworfQorCitpZiAoc3NsKSB7CisgIGlmICh0eXBlID09PSAidGNwIiB8fCB0eXBlID09PSAibXVsdGlwbGV4IikgeworICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgICAgb3B0aW9ucy5ub2RlT3B0aW9ucyA9IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9OworICAgIG9wdGlvbnMuaHR0cHMgPSB0cnVlOworICB9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgICAgb3B0aW9ucy53c09wdGlvbnMgPSB7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfTsKKyAgICBvcHRpb25zLnNlY3VyZSA9IHRydWU7CisgIH0KK30KKworbGV0IGNvbm5lY3Rpb247CitsZXQgY2xpZW50OworY29uc3QgdGVzdERyaXZlciA9IHByb2dyYW0uY2FsbGJhY2sKKyAgPyBUaHJpZnRUZXN0RHJpdmVyCisgIDogVGhyaWZ0VGVzdERyaXZlclByb21pc2U7CitpZiAoaGVscGVycy5lY21hTW9kZSA9PT0gImVzNiIgJiYgcHJvZ3JhbS5jYWxsYmFjaykgeworICBjb25zb2xlLmxvZygiRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUiKTsKKyAgcHJvY2Vzcy5leGl0KDApOworfQorCitpZiAodHlwZSA9PT0gInRjcCIgfHwgdHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlVURTQ29ubmVjdGlvbihkb21haW5Tb2NrZXQsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb24gPSBzc2wKKyAgICAgID8gdGhyaWZ0LmNyZWF0ZVNTTENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykKKyAgICAgIDogdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIH0KK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIGlmIChkb21haW5Tb2NrZXQpIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgeworICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5vcGVuKCk7Cit9CisKK2Nvbm5lY3Rpb24ub24oImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCitpZiAodHlwZSA9PT0gInRjcCIpIHsKKyAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKKyAgcnVuVGVzdHMoKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgY29uc3QgbXAgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVyKCk7CisgIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgiVGhyaWZ0VGVzdCIsIFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBjb25zdCBzZWNvbmRjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIFNlY29uZFNlcnZpY2UsCisgICAgY29ubmVjdGlvbgorICApOworCisgIGNvbm5lY3Rpb24ub24oImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKKyAgICBzZWNvbmRjbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdCIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydCghZXJyKTsKKyAgICAgIGFzc2VydC5lcXVhbCgndGVzdFN0cmluZygiVGVzdCIpJywgcmVzcG9uc2UpOworICAgIH0pOworCisgICAgcnVuVGVzdHMoKTsKKyAgfSk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIikgeworICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKKyAgcnVuVGVzdHMoKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZVdTQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBydW5UZXN0cygpOworfQorCitmdW5jdGlvbiBydW5UZXN0cygpIHsKKyAgdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGNvbnNvbGUubG9nKHN0YXR1cyk7CisgICAgaWYgKHR5cGUgIT09ICJodHRwIiAmJiB0eXBlICE9PSAid2Vic29ja2V0IikgeworICAgICAgY29ubmVjdGlvbi5lbmQoKTsKKyAgICB9CisgICAgaWYgKHR5cGUgIT09ICJtdWx0aXBsZXgiKSB7CisgICAgICBwcm9jZXNzLmV4aXQoMCk7CisgICAgfQorICB9KTsKK30KKworZXhwb3J0cy5leHByZXNzb1Rlc3QgPSBmdW5jdGlvbigpIHt9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0ZGFjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL0pzRGVlcENvbnN0cnVjdG9yVGVzdF90eXBlcyIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgYnVmZmVyRXF1YWxzID0gcmVxdWlyZSgiYnVmZmVyLWVxdWFscyIpOworCitmdW5jdGlvbiBzZXJpYWxpemVCaW5hcnkoZGF0YSkgeworICBsZXQgYnVmZjsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKSB7CisgICAgYnVmZiA9IG1zZzsKKyAgfSk7CisgIGNvbnN0IHByb3QgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBkYXRhLndyaXRlKHByb3QpOworICBwcm90LmZsdXNoKCk7CisgIHJldHVybiBidWZmOworfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZUJpbmFyeShzZXJpYWxpemVkLCB0eXBlKSB7CisgIGNvbnN0IHQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQoc2VyaWFsaXplZCk7CisgIGNvbnN0IHAgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0KTsKKyAgY29uc3QgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGRhdGEucmVhZChwKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK2Z1bmN0aW9uIHNlcmlhbGl6ZUpTT04oZGF0YSkgeworICBsZXQgYnVmZjsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKSB7CisgICAgYnVmZiA9IG1zZzsKKyAgfSk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCIiLCAwLCAwKTsKKyAgZGF0YS53cml0ZShwcm90b2NvbCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICBwcm90b2NvbC5mbHVzaCgpOworICByZXR1cm4gYnVmZjsKK30KKworZnVuY3Rpb24gZGVzZXJpYWxpemVKU09OKHNlcmlhbGl6ZWQsIHR5cGUpIHsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOworICBkYXRhLnJlYWQocHJvdG9jb2wpOworICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gY3JlYXRlVGhyaWZ0T2JqKCkgeworICByZXR1cm4gbmV3IHR0eXBlcy5Db21wbGV4KHsKKyAgICBzdHJ1Y3RfZmllbGQ6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJhIiB9KSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYiIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYyIgfSkKKyAgICBdLAorCisgICAgc3RydWN0X3NldF9maWVsZDogWworICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImQiIH0pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImUiIH0pCisgICAgXSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJmIiB9KSwKKyAgICAgIEI6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJnIiB9KQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFsKKyAgICAgICAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJoIiB9KSwKKyAgICAgICAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJpIiB9KQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQTogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImoiIH0pCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImsiIH0pCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbImwwMCIsICJsMDEiLCAibDAyIl0sCisgICAgICBbImwxMCIsICJsMTEiLCAibDEyIl0sCisgICAgICBbImwyMCIsICJsMjEiLCAibDIyIl0KKyAgICBdLAorCisgICAgbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgWyJtMDAwIiwgIm0wMDEiLCAibTAwMiJdLAorICAgICAgICBbIm0wMTAiLCAibTAxMSIsICJtMDEyIl0sCisgICAgICAgIFsibTAyMCIsICJtMDIxIiwgIm0wMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMTAwIiwgIm0xMDEiLCAibTEwMiJdLAorICAgICAgICBbIm0xMTAiLCAibTExMSIsICJtMTEyIl0sCisgICAgICAgIFsibTEyMCIsICJtMTIxIiwgIm0xMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMjAwIiwgIm0yMDEiLCAibTIwMiJdLAorICAgICAgICBbIm0yMTAiLCAibTIxMSIsICJtMjEyIl0sCisgICAgICAgIFsibTIyMCIsICJtMjIxIiwgIm0yMjIiXQorICAgICAgXQorICAgIF0KKyAgfSk7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUpzT2JqKCkgeworICByZXR1cm4geworICAgIHN0cnVjdF9maWVsZDogeyB2YWx1ZTogImEiIH0sCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogW3sgdmFsdWU6ICJiIiB9LCB7IHZhbHVlOiAiYyIgfV0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbeyB2YWx1ZTogImQiIH0sIHsgdmFsdWU6ICJlIiB9XSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IHsgdmFsdWU6ICJmIiB9LAorICAgICAgQjogeyB2YWx1ZTogImciIH0KKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbeyB2YWx1ZTogImgiIH0sIHsgdmFsdWU6ICJpIiB9XQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiB7IHZhbHVlOiAiaiIgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IHsgdmFsdWU6ICJrIiB9CisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbImwwMCIsICJsMDEiLCAibDAyIl0sCisgICAgICBbImwxMCIsICJsMTEiLCAibDEyIl0sCisgICAgICBbImwyMCIsICJsMjEiLCAibDIyIl0KKyAgICBdLAorCisgICAgbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgWyJtMDAwIiwgIm0wMDEiLCAibTAwMiJdLAorICAgICAgICBbIm0wMTAiLCAibTAxMSIsICJtMDEyIl0sCisgICAgICAgIFsibTAyMCIsICJtMDIxIiwgIm0wMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMTAwIiwgIm0xMDEiLCAibTEwMiJdLAorICAgICAgICBbIm0xMTAiLCAibTExMSIsICJtMTEyIl0sCisgICAgICAgIFsibTEyMCIsICJtMTIxIiwgIm0xMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMjAwIiwgIm0yMDEiLCAibTIwMiJdLAorICAgICAgICBbIm0yMTAiLCAibTIxMSIsICJtMjEyIl0sCisgICAgICAgIFsibTIyMCIsICJtMjIxIiwgIm0yMjIiXQorICAgICAgXQorICAgIF0KKyAgfTsKK30KKworZnVuY3Rpb24gYXNzZXJ0VmFsdWVzKG9iaiwgYXNzZXJ0KSB7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgImEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUsICJiIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlLCAiYyIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAiZCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlLCAiZSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUsICJmIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgImciKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0udmFsdWUsICJoIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAiaSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICJqIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFsxXS5EQi52YWx1ZSwgImsiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAibDAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXSwgImwwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMl0sICJsMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdLCAibDEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXSwgImwxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMl0sICJsMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdLCAibDIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXSwgImwyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMl0sICJsMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVswXSwgIm0wMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMV0sICJtMDAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzJdLCAibTAwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVswXSwgIm0wMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMV0sICJtMDExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzJdLCAibTAxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVswXSwgIm0wMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMV0sICJtMDIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzJdLCAibTAyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzBdLCAibTEwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVsxXSwgIm0xMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMl0sICJtMTAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzBdLCAibTExMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVsxXSwgIm0xMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMl0sICJtMTEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzBdLCAibTEyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVsxXSwgIm0xMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMl0sICJtMTIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMF0sICJtMjAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzFdLCAibTIwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVsyXSwgIm0yMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMF0sICJtMjEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzFdLCAibTIxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVsyXSwgIm0yMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMF0sICJtMjIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzFdLCAibTIyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVsyXSwgIm0yMjIiKTsKK30KKworZnVuY3Rpb24gY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUpIHsKKyAgY29uc3QgY2FzZXMgPSB7CisgICAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCwgIm5vdCB0aGUgc2FtZSBvYmplY3QiKTsKKyAgICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAiTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzIjogZnVuY3Rpb24oCisgICAgICBhc3NlcnQKKyAgICApIHsKKyAgICAgIGNvbnN0IHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgICBjb25zdCB0T2JqMiA9IG5ldyB0dHlwZXMuQ29tcGxleChjcmVhdGVKc09iaigpKTsKKyAgICAgIGFzc2VydFZhbHVlcyh0T2JqMiwgYXNzZXJ0KTsKKyAgICAgIGNvbnN0IHMxID0gc2VyaWFsaXplKHRPYmoxKTsKKyAgICAgIGNvbnN0IHMyID0gc2VyaWFsaXplKHRPYmoyKTsKKyAgICAgIGFzc2VydC5vayhidWZmZXJFcXVhbHMoczEsIHMyKSk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QiOiBmdW5jdGlvbigKKyAgICAgIGFzc2VydAorICAgICkgeworICAgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CisgICAgICBhc3NlcnRWYWx1ZXMoYXJncywgYXNzZXJ0KTsKKworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleChhcmdzKTsKKyAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworCisgICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gIlpaWiI7CisKKyAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAibnVsbHMgYXJlIG9rIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KHsKKyAgICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X21hcF9maWVsZDogbnVsbCwKKyAgICAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiBudWxsCisgICAgICB9KTsKKyAgICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodE9iai5zdHJ1Y3RfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICAgIGFzc2VydC5kZWVwRXF1YWwodE9iaiwgcmVjZWl2ZWQpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0sCisKKyAgICAiQ2FuIG1ha2UgbGlzdCB3aXRoIG9iamVjdHMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXhMaXN0KHsKKyAgICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFtuZXcgdHR5cGVzLkNvbXBsZXgoe30pXQorICAgICAgfSk7CisgICAgICBjb25zdCBpbm5lck9iaiA9IHRPYmouc3RydWN0X2xpc3RfZmllbGRbMF07CisgICAgICBhc3NlcnQub2soaW5uZXJPYmogaW5zdGFuY2VvZiB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbGlzdF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X3NldF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X21hcF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLCBudWxsKTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9CisgIH07CisgIHJldHVybiBjYXNlczsKK30KKworZnVuY3Rpb24gcnVuKG5hbWUsIGNhc2VzKSB7CisgIE9iamVjdC5rZXlzKGNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uKGNhc2VOYW1lKSB7CisgICAgdGVzdChuYW1lICsgIjogIiArIGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworICB9KTsKK30KKworcnVuKCJiaW5hcnkiLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplQmluYXJ5LCBkZXNlcmlhbGl6ZUJpbmFyeSkpOworcnVuKCJqc29uIiwgY3JlYXRlVGVzdENhc2VzKHNlcmlhbGl6ZUpTT04sIGRlc2VyaWFsaXplSlNPTikpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMgYi9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjI3OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2V4Y2VwdGlvbnMuanMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvdGhyaWZ0LmpzIik7Citjb25zdCBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCIuLi9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvciIpOworCit0ZXN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sCisgICAgImlzIGluc3RhbmNlb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAiaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo3OjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgidW5leHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24gIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKDEsIDEwMCk7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UQXBwbGljYXRpb25FeGNlcHRpb246IDEwMC8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjc6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAxMDAsICJoYXMgZXJyb3IgbWVzc2FnZSAxMDAiKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoIlRFeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5URXhjZXB0aW9uKCJmb28iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjIxOjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm5hbWUsICJURXhjZXB0aW9uIiwgImhhcyBmdW5jdGlvbiBuYW1lIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiVFByb3RvY29sRXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKDEsICJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UUHJvdG9jb2xFeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjMzOjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIlRQcm90b2NvbEV4Y2VwdGlvbiIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciwKKyAgICAiaXMgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczo0NjoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcyBiL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDEyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyJ1c2Ugc3RyaWN0IjsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKKworbW9kdWxlLmV4cG9ydHMudHJhbnNwb3J0cyA9IHsKKyAgYnVmZmVyZWQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIGZyYW1lZDogdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQKK307CisKK21vZHVsZS5leHBvcnRzLnByb3RvY29scyA9IHsKKyAganNvbjogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgIGJpbmFyeTogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCwKKyAgY29tcGFjdDogdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2wKK307CisKK21vZHVsZS5leHBvcnRzLmVjbWFNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCItLWVzNiIpID8gImVzNiIgOiAiZXM1IjsKK21vZHVsZS5leHBvcnRzLmdlblBhdGggPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikKKyAgPyAiZ2VuLW5vZGVqcy1lczYiCisgIDogImdlbi1ub2RlanMiOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5jcnQgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3NlcnZlci5jcnQKQEAgLTAsMCArMSwyNSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDIwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCkBAIC0wLDAgKzEsMTM3IEBACisjIS91c3IvYmluL2VudiBub2RlCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpOworY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKKworcHJvZ3JhbQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikiLAorICAgICJiaW5hcnkiCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSIsCisgICAgImJ1ZmZlcmVkIgorICApCisgIC5vcHRpb24oIi0tc3NsIiwgInVzZSBzc2wgdHJhbnNwb3J0IikKKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1kb21haW4tc29ja2V0IDxwYXRoPiIsICJTZXQgdGhpZnQgc2VydmVyIHVuaXggZG9tYWluIHNvY2tldCIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7Citjb25zdCB7IFRocmlmdFRlc3RIYW5kbGVyIH0gPSByZXF1aXJlKCIuL3Rlc3RfaGFuZGxlciIpOworCitjb25zdCBwb3J0ID0gcHJvZ3JhbS5wb3J0OworY29uc3QgZG9tYWluU29ja2V0ID0gcHJvZ3JhbS5kb21haW5Tb2NrZXQ7Citjb25zdCBzc2wgPSBwcm9ncmFtLnNzbDsKKworbGV0IHR5cGUgPSBwcm9ncmFtLnR5cGU7CitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2xldCBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCisgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQorfTsKKworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLmhhbmRsZXIgPSBUaHJpZnRUZXN0SGFuZGxlcjsKKyAgb3B0aW9ucy5wcm9jZXNzb3IgPSBUaHJpZnRUZXN0OworCisgIG9wdGlvbnMgPSB7CisgICAgc2VydmljZXM6IHsgIi90ZXN0Ijogb3B0aW9ucyB9LAorICAgIGNvcnM6IHsKKyAgICAgICIqIjogdHJ1ZQorICAgIH0KKyAgfTsKK30KKworbGV0IHByb2Nlc3NvcjsKK2lmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBjb25zdCBTZWNvbmRTZXJ2aWNlSGFuZGxlciA9IHsKKyAgICBzZWNvbmR0ZXN0U3RyaW5nOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgICAgICByZXN1bHQobnVsbCwgJ3Rlc3RTdHJpbmcoIicgKyB0aGluZyArICciKScpOworICAgIH0KKyAgfTsKKworICBwcm9jZXNzb3IgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisKKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJUaHJpZnRUZXN0IiwKKyAgICBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoVGhyaWZ0VGVzdEhhbmRsZXIpCisgICk7CisKKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3IoU2Vjb25kU2VydmljZUhhbmRsZXIpCisgICk7Cit9CisKK2lmIChzc2wpIHsKKyAgaWYgKAorICAgIHR5cGUgPT09ICJ0Y3AiIHx8CisgICAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgICB0eXBlID09PSAiaHR0cCIgfHwKKyAgICB0eXBlID09PSAid2Vic29ja2V0IgorICApIHsKKyAgICBvcHRpb25zLnRscyA9IHsKKyAgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICJzZXJ2ZXIua2V5IikpLAorICAgICAgY2VydDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICJzZXJ2ZXIuY3J0IikpCisgICAgfTsKKyAgfQorfQorCitsZXQgc2VydmVyOworaWYgKHR5cGUgPT09ICJ0Y3AiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdCwgVGhyaWZ0VGVzdEhhbmRsZXIsIG9wdGlvbnMpOworfSBlbHNlIGlmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlTXVsdGlwbGV4U2VydmVyKHByb2Nlc3Nvciwgb3B0aW9ucyk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKG9wdGlvbnMpOworfQorCitpZiAoZG9tYWluU29ja2V0KSB7CisgIHNlcnZlci5saXN0ZW4oZG9tYWluU29ja2V0KTsKK30gZWxzZSBpZiAoCisgIHR5cGUgPT09ICJ0Y3AiIHx8CisgIHR5cGUgPT09ICJtdWx0aXBsZXgiIHx8CisgIHR5cGUgPT09ICJodHRwIiB8fAorICB0eXBlID09PSAid2Vic29ja2V0IgorKSB7CisgIHNlcnZlci5saXN0ZW4ocG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmtleSBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIua2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2M2NmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmtleQpAQCAtMCwwICsxLDI4IEBACistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3FFOVRFOXdFWHA1TFIKK3RMUVZEU0dRR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3kKK1NOOEkyWHc2TDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0gKK2pLTmc2WktnMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUIKK0dtWm1NSVV3QWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGsKK3U2MkxpcGtYd0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG0KK3RyaFZRRjRuQWdNQkFBRUNnZ0VBVy95NTJZWVc2eXBST0diWjk0RFFwRlYwa0xPN3FUOHEwS3N4dzVzUE5hSXQKK2ZFUFJJeW1EYThpa3lIV0pTNU94bXc4NHdvNWpuSlYyNmphTG13ZTJMdXBxN1hmMWxxZWo4ZjVMSnR1djdjUVIKK3hmenAxdk02NUtKRkZKSHA2V3FqR3FKNkhTU1pPcFZEc25RWWNYUWpRQ2RweUFtYVNXZDNwK0ZxWVNaMW1RbUQKK2JGTkk3anFwY3pXU1poVGRvdFE3cDdIbjlUVkNlaGZsUDN5R0lCM2JRK3dDY0NCODVkT0J6MjAxTCtZZ2FJY2sKK1N6NDNBNE52V2FRSVJMUkR3N3M5R1c0alk1VDBKdjI4MldJZUFsVnBWeExJd3U0OHI0UjR5R1RJeDlZZG93dnEKKzU3K1k1aVBQakFYeHUwVjl0MDBvUzNiWXhEYUtoMkRVZmMvNXpvd3E4UUtCZ1FEWU5WUFhtYUcwYUlINHZqUTkKKzdmUmR3L1VEa1ljUWJuNkNuZ2xRT3U3Ny9TOG9nUXpwS0NWSmdKZ2taTnFPVnRRTUVQemVrR0VjTFRiamUxZ1UKKzhCa3kyaytQTDlVd2JGeTBlbW5PVmg0cnFyTlhIc1J2SmNlaE5UL1BSYjVoakYzTVVNRlYvMGlENGIrbmFGYUUKK2pyU1dpWjJaWGoycWZ3QUs1MkdGYnRPdUJRS0JnUURKWVF1R2lZMHIyMkU0d2FKbUNTS2N6b0JUM2N3bFZ6V2oKK1YybGpnQTlSSExOVFZrdk5OWVFMR3UycW5nRnJ0d3BlYVNuc01EZXJWRzR3S0FRV3lDbll6eFZybG5DNHVEckoKK0hYdUZFbHRCV2k5RmZiZ2ZzbmQzNzQ5QVQwb0JQMU5UMnRNbGVndXlmNURGZ2pDUjNWUkpMZHJWYWFaOHJvdy8KK0xxS2NGTXFuT3dLQmdCK09JTzk5bDdFNTg0WTNWRzZaZFNuZU9MdE5tUlhYMnBUN3RjWkU0NjVaZEhHSDdEZDMKK1NZSGh4OUsvK1huK3lESCtwTGxpL3hsYXJBRWxkbVNQNmsyV3VUZmZ0bEM3OEFmVE9mQUlkNXpON0NEUjk3OTEKK0Z4NjdJOVgvaXRxMzN0UzhFSXVabDU3UDZ1WG0vNEdYUmxvV09hOHhwdlJrVnNCQXB1WVBsOHQxQW9HQVRRRFMKK3kyc2xsRE9iQlh6bGdHYlYyV2dOSWdTWjMxMXRvVHYzakppWFFzamF1Vzh5SlJIbG4rbDRIOW16YVdEZ2tpRmMKK2FuZzFrVW9EcUY1azBlRlFQeHRRY1lkaEt3RW5XV2Z3cDMzUmJ6ZnhBMzJEUG51YnV6emJaaGZya0hhS2duSVcKK2N5b3I5dUZZbG0ybDdPRFpMZkplejJSS3lUcGxYbk9Tc21RdzZha0NnWUF6M2RqOUhza3lqK0hWSitodDFPY0UKK2M3YWkvRVNrU0E3VmFqcDB0akpwMEVLalcvenE4RHZVU1hPdGNkbkpna0t5Y0ZsdUx3Ym1uYU40dHhCZHMxQzEKK1FyOFJ0MnNVQ0NCTlplMUw2REhlM1hCZGJrSmU5c2daVk5UanRVU1Fyenk4VWh2c0NxRzRZV2VDdTA3U3pjYmMKK3JkUFVWOS91UWtkeDhWclNoeGxEOEE9PQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM1NjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3QtY2FzZXMuanMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworCitjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKKworLy9hbGwgTGFuZ3VhZ2VzIGluIFVURi04CisvKmpzaGludCAtVzEwMCAqLworY29uc3Qgc3RyaW5nVGVzdCA9IChtb2R1bGUuZXhwb3J0cy5zdHJpbmdUZXN0ID0KKyAgIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKyAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKyAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKyAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKTsKKy8qanNoaW50ICtXMTAwICovCisKK2NvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gKG1vZHVsZS5leHBvcnRzLnNwZWNpYWxDaGFyYWN0ZXJzID0KKyAgJ3F1b3RlOiAiIGJhY2tzbGFzaDonICsKKyAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogLyAiICsKKyAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiArCisgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFwvXGJcblxyXHQnICsKKyAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCisgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gIl1dIFxcIiB9fX17IFtbWyAnKTsKKworY29uc3QgbWFwVGVzdElucHV0ID0gKG1vZHVsZS5leHBvcnRzLm1hcFRlc3RJbnB1dCA9IHsKKyAgYTogIjEyMyIsCisgICJhIGIiOiAid2l0aCBzcGFjZXMgIiwKKyAgc2FtZTogInNhbWUiLAorICAiMCI6ICJudW1lcmljIGtleSIsCisgIGxvbmdWYWx1ZTogc3RyaW5nVGVzdCwKKyAgc3RyaW5nVGVzdDogImxvbmcga2V5IgorfSk7CisKK2NvbnN0IHNpbXBsZSA9IFsKKyAgWyJ0ZXN0Vm9pZCIsIHVuZGVmaW5lZF0sCisgIFsidGVzdFN0cmluZyIsICJUZXN0Il0sCisgIFsidGVzdFN0cmluZyIsICIiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3RyaW5nVGVzdF0sCisgIFsidGVzdFN0cmluZyIsIHNwZWNpYWxDaGFyYWN0ZXJzXSwKKyAgWyJ0ZXN0Qm9vbCIsIHRydWVdLAorICBbInRlc3RCb29sIiwgZmFsc2VdLAorICBbInRlc3RCeXRlIiwgMV0sCisgIFsidGVzdEJ5dGUiLCAwXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xMjddLAorICBbInRlc3RJMzIiLCAtMV0sCisgIFsidGVzdERvdWJsZSIsIC01LjIwOTg1MjNdLAorICBbInRlc3REb3VibGUiLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsidGVzdEVudW0iLCB0dHlwZXMuTnVtYmVyei5PTkVdLAorICBbInRlc3RJNjQiLCA1XSwKKyAgWyJ0ZXN0STY0IiwgLTVdLAorICBbInRlc3RJNjQiLCA3MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyJ0ZXN0STY0IiwgbmV3IEludDY0KG5ldyBCdWZmZXIoWzAsIDB4MjAsIDAsIDAsIDAsIDAsIDAsIDFdKSldLCAvLyAyXjUzKzEKKyAgWworICAgICJ0ZXN0STY0IiwKKyAgICBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMHhmZiwgMHhkZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKQorICBdLCAvLyAtMl41My0xCisgIFsidGVzdFR5cGVkZWYiLCA2OV0KK107CisKK2NvbnN0IG1hcG91dCA9IHt9OworZm9yIChsZXQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgbWFwb3V0W2ldID0gaSAtIDEwOworfQorCitjb25zdCBkZWVwID0gWworICBbCisgICAgInRlc3RMaXN0IiwKKyAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwXQorICBdCitdOworCitjb25zdCBkZWVwVW5vcmRlcmVkID0gWworICBbInRlc3RNYXAiLCBtYXBvdXRdLAorICBbInRlc3RTZXQiLCBbMSwgMiwgM11dLAorICBbInRlc3RTdHJpbmdNYXAiLCBtYXBUZXN0SW5wdXRdCitdOworCitjb25zdCBvdXQgPSBuZXcgdHR5cGVzLlh0cnVjdCh7CisgIHN0cmluZ190aGluZzogIlplcm8iLAorICBieXRlX3RoaW5nOiAxLAorICBpMzJfdGhpbmc6IC0zLAorICBpNjRfdGhpbmc6IDEwMDAwMDAKK30pOworCitjb25zdCBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7CitvdXQyLmJ5dGVfdGhpbmcgPSAxOworb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CitvdXQyLmkzMl90aGluZyA9IDU7CisKK2NvbnN0IGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7CisgIHVzZXJNYXA6IHsgIjUiOiA1LCAiOCI6IDggfSwKKyAgeHRydWN0czogWworICAgIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgIHN0cmluZ190aGluZzogIkdvb2RieWU0IiwKKyAgICAgIGJ5dGVfdGhpbmc6IDQsCisgICAgICBpMzJfdGhpbmc6IDQsCisgICAgICBpNjRfdGhpbmc6IDQKKyAgICB9KSwKKyAgICBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICBzdHJpbmdfdGhpbmc6ICJIZWxsbzIiLAorICAgICAgYnl0ZV90aGluZzogMiwKKyAgICAgIGkzMl90aGluZzogMiwKKyAgICAgIGk2NF90aGluZzogMgorICAgIH0pCisgIF0KK30pOworCitjb25zdCBjcmF6eTIgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgdXNlck1hcDogeyAiNSI6IDUsICI4IjogOCB9LAorICB4dHJ1Y3RzOiBbCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiR29vZGJ5ZTQiLAorICAgICAgYnl0ZV90aGluZzogNCwKKyAgICAgIGkzMl90aGluZzogNCwKKyAgICAgIGk2NF90aGluZzogNAorICAgIH0sCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9CisgIF0KK30pOworCitjb25zdCBpbnNhbml0eSA9IHsKKyAgIjEiOiB7ICIyIjogY3JhenksICIzIjogY3JhenkgfSwKKyAgIjIiOiB7ICI2IjogeyB1c2VyTWFwOiB7fSwgeHRydWN0czogW10gfSB9Cit9OworCittb2R1bGUuZXhwb3J0cy5zaW1wbGUgPSBzaW1wbGU7Cittb2R1bGUuZXhwb3J0cy5kZWVwID0gZGVlcDsKK21vZHVsZS5leHBvcnRzLmRlZXBVbm9yZGVyZWQgPSBkZWVwVW5vcmRlcmVkOworCittb2R1bGUuZXhwb3J0cy5vdXQgPSBvdXQ7Cittb2R1bGUuZXhwb3J0cy5vdXQyID0gb3V0MjsKK21vZHVsZS5leHBvcnRzLmNyYXp5ID0gY3Jhenk7Cittb2R1bGUuZXhwb3J0cy5jcmF6eTIgPSBjcmF6eTI7Cittb2R1bGUuZXhwb3J0cy5pbnNhbml0eSA9IGluc2FuaXR5OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggYi9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGYxZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKQEAgLTAsMCArMSw5OCBAQAorIyEgL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworaWYgWyAtbiAiJHsxfSIgXTsgdGhlbgorICBDT1ZFUj0kezF9OworZmkKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitJU1RBTkJVTD0iJERJUi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXN0YW5idWwvbGliL2NsaS5qcyIKKworUkVQT1JUX1BSRUZJWD0iJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCIKKworQ09VTlQ9MAorCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uL2xpYjoke05PREVfUEFUSH0iCisKK3Rlc3RTZXJ2ZXIoKQoreworICBlY2hvICIgIFtFQ01BICQxXSBUZXN0aW5nICQyIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMyBhbmQgdHJhbnNwb3J0ICQ0ICQ1IjsKKyAgUkVUPTAKKyAgaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KKyAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKKyAgICBDT1VOVD0kKChDT1VOVCsxKSkKKyAgZWxzZQorICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKKyAgZmkKKyAgU0VSVkVSUElEPSQhCisgIHNsZWVwIDAuMQorICBpZiBbIC1uICIke0NPVkVSfSIgXTsgdGhlbgorICAgICR7SVNUQU5CVUx9IGNvdmVyICR7RElSfS9jbGllbnQuanMgLS1kaXIgJHtSRVBPUlRfUFJFRklYfSR7Q09VTlR9IC0tIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgfHwgUkVUPTEKKyAgICBDT1VOVD0kKChDT1VOVCsxKSkKKyAgZWxzZQorICAgIG5vZGUgJHtESVJ9L2NsaWVudC5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1IHx8IFJFVD0xCisgIGZpCisgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICB3YWl0ICRTRVJWRVJQSUQKKyAgcmV0dXJuICRSRVQKK30KKworCitURVNUT0s9MAorCisjZ2VuZXJhdGluZyB0aHJpZnQgY29kZQorCiske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAorbWtkaXIgJHtESVJ9L2dlbi1ub2RlanMtZXM2Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAke0RJUn0vZ2VuLW5vZGVqcy1lczYgLS1nZW4ganM6bm9kZSxlczYgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAorCisjdW5pdCB0ZXN0cworCitub2RlICR7RElSfS9iaW5hcnkudGVzdC5qcyB8fCBURVNUT0s9MQorbm9kZSAke0RJUn0vZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIHx8IFRFU1RPSz0xCisKKyNpbnRlZ3JhdGlvbiB0ZXN0cworCitmb3IgdHlwZSBpbiB0Y3AgbXVsdGlwbGV4IHdlYnNvY2tldCBodHRwCitkbworICBmb3IgcHJvdG9jb2wgaW4gY29tcGFjdCBiaW5hcnkganNvbgorICBkbworICAgIGZvciB0cmFuc3BvcnQgaW4gYnVmZmVyZWQgZnJhbWVkCisgICAgZG8KKyAgICAgIGZvciBlY21hX3ZlcnNpb24gaW4gZXM1IGVzNgorICAgICAgZG8KKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQorICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgLS1jYWxsYmFjayB8fCBURVNUT0s9MQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorCisKK2lmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCisgICR7SVNUQU5CVUx9IHJlcG9ydCAtLWRpciAiJHtESVJ9Ly4uL2NvdmVyYWdlIiAtLWluY2x1ZGUgIiR7RElSfS8uLi9jb3ZlcmFnZS9yZXBvcnQqL2NvdmVyYWdlLmpzb24iIGxjb3YgY29iZXJ0dXJhIGh0bWwKKyAgcm0gLXIgJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovKgorICBybWRpciAke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0KgorZmkKKworZXhpdCAkVEVTVE9LCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5YTkxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIHRoZSBOb2RlLmpzIHRlc3QgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdAorLy8gdGVzdCBzZXJ2aWNlLiBUaGUgZHJpdmVyIGludm9rZXMgZXZlcnkgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUKKy8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCisvLworLy8gVGhlIFRocmlmdFRlc3REcml2ZXIgZnVuY3Rpb24gcmVxdWlyZXMgYSBjbGllbnQgb2JqZWN0CisvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKKy8vIHN1cHBvcnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoCisvLyBhIHN0YXR1cyBtZXNzYWdlIHdoZW4gdGhlIHRlc3QgaXMgY29tcGxldGUuCisKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworY29uc3QgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CisKK2V4cG9ydHMuVGhyaWZ0VGVzdERyaXZlciA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgKKyAgICAiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsCisgICAgeyBza2lwOiBoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiB9LAorICAgIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKKyAgICAgICAgICBjb25zdCBmbk5hbWUgPSBjWzBdOworICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgICBjbGllbnRbZm5OYW1lXShleHBlY3RlZCwgZnVuY3Rpb24oZXJyLCBhY3R1YWwpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcnJvcihlcnIsIGZuTmFtZSArICI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICAgIH0pOworICAgICAgICB9OworICAgICAgfQorCisgICAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKSB7CisgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgICAgY29uc3QgZTY0ID0gZSBpbnN0YW5jZW9mIEludDY0ID8gZSA6IG5ldyBJbnQ2NChlKTsKKyAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoYS5idWZmZXIsIGU2NC5idWZmZXIsIG0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwoYSwgZSwgbSk7CisgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpCisgICAgICApOworCisgICAgICBjb25zdCBhcnIgPSBbXTsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gMjU1IC0gaTsKKyAgICAgIH0KKyAgICAgIGxldCBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShCdWZmZXIpIik7CisgICAgICB9KTsKKyAgICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYXJyKTsKKyAgICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1Zi50b1N0cmluZygiYmluYXJ5IiksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShzdHJpbmcpIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgIjQiOiB7ICIxIjogMSwgIjIiOiAyLCAiMyI6IDMsICI0IjogNCB9LAorICAgICAgICAgICItNCI6IHsgIi00IjogLTQsICItMyI6IC0zLCAiLTIiOiAtMiwgIi0xIjogLTEgfQorICAgICAgICB9OworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChleHBlY3RlZCwgcmVzcG9uc2UsICJ0ZXN0TWFwTWFwIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdFN0cnVjdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3ROZXN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0SW5zYW5pdHkyOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkyIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5vaygKKyAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlIgorICAgICAgICApOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEsICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIGNvZGUiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgICAgICJYY2VwdGlvbiIsCisgICAgICAgICAgZXJyLm1lc3NhZ2UsCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgbWVzc2FnZSIKKyAgICAgICAgKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEV4Y2VwdGlvbjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE9uZXdheTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICJ0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgImNoZWNrT2ZmQnlPbmU6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSk7CisgICAgICB9LCBjYWxsYmFjayk7CisgICAgfQorICApOworCisgIC8vIEVTNiBkb2VzIG5vdCBzdXBwb3J0IGNhbGxiYWNrIHN0eWxlCisgIGlmIChoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IikgeworICAgIGNoZWNrT2ZmQnlPbmUoZG9uZSA9PiBkb25lKCksIGNhbGxiYWNrKTsKKyAgfQorfTsKKworZXhwb3J0cy5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgiUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjKSB7CisgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgY2xpZW50W2ZuTmFtZV0oZXhwZWN0ZWQpCisgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oYWN0dWFsKSB7CisgICAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICAgIH0pCisgICAgICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJmbk5hbWUiKSk7CisgICAgICB9OworICAgIH0KKworICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaCgKKyAgICAgIG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKSB7CisgICAgICAgIGlmIChhIGluc3RhbmNlb2YgSW50NjQpIHsKKyAgICAgICAgICBjb25zdCBlNjQgPSBlIGluc3RhbmNlb2YgSW50NjQgPyBlIDogbmV3IEludDY0KGUpOworICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoYS5idWZmZXIsIGU2NC5idWZmZXIsIG0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFzc2VydC5lcXVhbChhLCBlLCBtKTsKKyAgICAgICAgfQorICAgICAgfSkKKyAgICApOworICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuZGVlcFVub3JkZXJlZC5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSkKKyAgICApOworCisgICAgY2xpZW50CisgICAgICAudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RTdHJ1Y3QiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3ROZXN0IikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eSIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdEluc2FuaXR5IikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkyIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkyIikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFRFeGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0pOworCisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uOiBYY2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbik7CisgICAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKCJYY2VwdGlvbiIsIGVyci5tZXNzYWdlKTsKKyAgICAgIH0pOworCisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcXVhbCh1bmRlZmluZWQsIHJlc3BvbnNlKTsgLy92b2lkCisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uIikpOworCisgICAgY2xpZW50CisgICAgICAudGVzdE9uZXdheSgwKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICJ0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0T25ld2F5OiBzaG91bGQgbm90IHJlamVjdCIpKTsKKworICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgeworICAgICAgY2xpZW50CisgICAgICAgIC50ZXN0STMyKC0xKQorICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pCisgICAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgiY2hlY2tPZmZCeU9uZSIpKTsKKyAgICB9LCBjYWxsYmFjayk7CisgIH0pOworfTsKKworLy8gSGVscGVyIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Z1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKG1hcDEsIG1hcDIsIG1zZykgeworICAgIGNvbnN0IGVxdWFsID0gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKTsKKworICAgIGFzc2VydC5vayhlcXVhbCwgbXNnKTsKKworICAgIC8vIGRlZXBFcXVhbCBkb2Vzbid0IHdvcmsgd2l0aCBmaWVsZHMgdXNpbmcgbm9kZS1pbnQ2NAorICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBtYXAyICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKKyAgICAgICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQorICAgICAgICAgIGlmICgKKyAgICAgICAgICAgIHR5cGVvZiBtYXAxID09PSAibnVtYmVyIiAmJgorICAgICAgICAgICAgdHlwZW9mIG1hcDIgPT09ICJvYmplY3QiICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlciAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOAorICAgICAgICAgICkgeworICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gbWFwMSA9PT0gbi50b051bWJlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbWFwMSA9PSBtYXAyOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwMSkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07Cit9CisKK2Z1bmN0aW9uIGNoZWNrT2ZmQnlPbmUoZG9uZSwgY2FsbGJhY2spIHsKKyAgY29uc3QgcmV0cnlfbGltaXQgPSAzMDsKKyAgY29uc3QgcmV0cnlfaW50ZXJ2YWwgPSAxMDA7CisgIGxldCB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7CisgIGxldCByZXRyeXMgPSAwOworCisgIC8qKgorICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkgb25lIiAtLQorICAgKiBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IHZvaWQgbGlrZSBub3JtYWwgdm9pZCwgdGhpcyBuZXh0IHRlc3Qgd2lsbAorICAgKiBmYWlsIHNpbmNlIGl0IHdpbGwgZ2V0IHRoZSB2b2lkIGNvbmZpcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAorICAgKiByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbjoKKyAgICoKKyAgICogQmVjYXVzZSB0aGlzIGlzIHRoZSBsYXN0IHRlc3QgYWdhaW5zdCB0aGUgc2VydmVyLCB3aGVuIGl0IGNvbXBsZXRlcworICAgKiB0aGUgZW50aXJlIHN1aXRlIGlzIGNvbXBsZXRlIGJ5IGRlZmluaXRpb24gKHRoZSB0ZXN0cyBydW4gc2VyaWFsbHkpLgorICAgKi8KKyAgZG9uZShmdW5jdGlvbigpIHsKKyAgICB0ZXN0X2NvbXBsZXRlID0gdHJ1ZTsKKyAgfSk7CisKKyAgLy9XZSB3YWl0IHVwIHRvIHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIGNvbXBsZXRlCisgIGZ1bmN0aW9uIFRlc3RGb3JDb21wbGV0aW9uKCkgeworICAgIGlmICh0ZXN0X2NvbXBsZXRlICYmIGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjaygiU2VydmVyIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQhIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgrK3JldHJ5cyA8IHJldHJ5X2xpbWl0KSB7CisgICAgICAgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKKyAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2soCisgICAgICAgICAgIlNlcnZlciB0ZXN0IGZhaWxlZCB0byBjb21wbGV0ZSBhZnRlciAiICsKKyAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsKSAvIDEwMDAgKworICAgICAgICAgICAgIiBzZWNvbmRzIgorICAgICAgICApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKK30KKworZnVuY3Rpb24gbWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG5hbWUpIHsKKyAgICBhc3NlcnQuZXF1YWwoYWN0dWFsLmxlbmd0aCwgZXhwZWN0ZWQubGVuZ3RoLCBuYW1lKTsKKyAgICBmb3IgKGNvbnN0IGsgaW4gYWN0dWFsKSB7CisgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKKyAgICAgIGZvciAoY29uc3QgazIgaW4gZXhwZWN0ZWQpIHsKKyAgICAgICAgaWYgKGFjdHVhbFtrXSA9PT0gZXhwZWN0ZWRbazJdKSB7CisgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJVbmV4cGVjdGVkIHZhbHVlICIgKyBhY3R1YWxba10gKyAiIHdpdGgga2V5ICIgKyBrKTsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdhN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgaXMgdGhlIHNlcnZlciBzaWRlIE5vZGUgdGVzdCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQKKy8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4KK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKKworZnVuY3Rpb24gbWFrZVN5bmNIYW5kbGVyKCkgeworICByZXR1cm4gZnVuY3Rpb24odGhpbmcpIHsKKyAgICByZXR1cm4gdGhpbmc7CisgIH07Cit9CisKK2NvbnN0IHN5bmNIYW5kbGVycyA9IHsKKyAgdGVzdFZvaWQ6IHRlc3RWb2lkLAorICB0ZXN0TWFwTWFwOiB0ZXN0TWFwTWFwLAorICB0ZXN0SW5zYW5pdHk6IHRlc3RJbnNhbml0eSwKKyAgdGVzdE11bHRpOiB0ZXN0TXVsdGksCisgIHRlc3RFeGNlcHRpb246IHRlc3RFeGNlcHRpb24sCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogdGVzdE11bHRpRXhjZXB0aW9uLAorICB0ZXN0T25ld2F5OiB0ZXN0T25ld2F5Cit9OworCitmdW5jdGlvbiBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKSB7CisgIHJldHVybiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgdGhpbmcgPSBzeW5jSGFuZGxlcnNbbGFiZWxdKHRoaW5nKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9OworfQorCitjb25zdCBhc3luY0hhbmRsZXJzID0geworICB0ZXN0Vm9pZDogdGVzdFZvaWRBc3luYywKKyAgdGVzdE11bHRpOiB0ZXN0TXVsdGlBc3luYywKKyAgdGVzdEV4Y2VwdGlvbjogdGVzdEV4Y2VwdGlvbkFzeW5jLAorICB0ZXN0TXVsdGlFeGNlcHRpb246IHRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jLAorICB0ZXN0T25ld2F5OiB0ZXN0T25ld2F5QXN5bmMKK307CisKK2NvbnN0IGlkZW50aXR5SGFuZGxlcnMgPSBbCisgICJ0ZXN0U3RyaW5nIiwKKyAgInRlc3RCb29sIiwKKyAgInRlc3RCeXRlIiwKKyAgInRlc3RJMzIiLAorICAidGVzdEk2NCIsCisgICJ0ZXN0RG91YmxlIiwKKyAgInRlc3RCaW5hcnkiLAorICAidGVzdFN0cnVjdCIsCisgICJ0ZXN0TmVzdCIsCisgICJ0ZXN0TWFwIiwKKyAgInRlc3RTdHJpbmdNYXAiLAorICAidGVzdFNldCIsCisgICJ0ZXN0TGlzdCIsCisgICJ0ZXN0RW51bSIsCisgICJ0ZXN0VHlwZWRlZiIKK107CisKK2Z1bmN0aW9uIHRlc3RWb2lkKCkgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7Cit9CisKK2Z1bmN0aW9uIHRlc3RWb2lkQXN5bmMocmVzdWx0KSB7CisgIHJlc3VsdCh0ZXN0Vm9pZCgpKTsKK30KKworZnVuY3Rpb24gdGVzdE1hcE1hcCgpIHsKKyAgY29uc3QgbWFwbWFwID0gW107CisgIGNvbnN0IHBvcyA9IFtdOworICBjb25zdCBuZWcgPSBbXTsKKyAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICBwb3NbaV0gPSBpOworICAgIG5lZ1staV0gPSAtaTsKKyAgfQorICBtYXBtYXBbNF0gPSBwb3M7CisgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgcmV0dXJuIG1hcG1hcDsKK30KKworZnVuY3Rpb24gdGVzdEluc2FuaXR5KGFyZ3VtZW50KSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RJbnNhbml0eSgnKTsKKyAgLy9jb25zb2xlLmxvZyhhcmd1bWVudCk7CisgIC8vY29uc29sZS5sb2coJyknKTsKKworICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOworCisgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKworICBjb25zdCBpbnNhbmUgPSBbXTsKKyAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgIC8vY29uc29sZS5sb2coJ2luc2FuZSByZXN1bHQ6Jyk7CisgIC8vY29uc29sZS5sb2coaW5zYW5lKTsKKyAgcmV0dXJuIGluc2FuZTsKK30KKworZnVuY3Rpb24gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKKworICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgcmV0dXJuIGhlbGxvOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGlBc3luYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKKyAgY29uc3QgaGVsbG8gPSB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgIHJlc3VsdChudWxsLCBoZWxsbyk7Cit9CisKK2Z1bmN0aW9uIHRlc3RFeGNlcHRpb24oYXJnKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICB0aHJvdyB4OworICB9IGVsc2UgaWYgKGFyZyA9PT0gIlRFeGNlcHRpb24iKSB7CisgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oYXJnKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KK30KKworZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbkFzeW5jKGFyZywgcmVzdWx0KSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICByZXN1bHQoeCk7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0KG51bGwpOworICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwLCBhcmcxKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgaWYgKGFyZzAgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgdGhyb3cgeDsKKyAgfSBlbHNlIGlmIChhcmcwID09PSAiWGNlcHRpb24yIikgeworICAgIGNvbnN0IHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgdGhyb3cgeDI7CisgIH0KKworICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgcmV0dXJuIHJlczsKK30KKworZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoYXJnMCwgYXJnMSwgcmVzdWx0KSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKKyAgaWYgKGFyZzAgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgcmVzdWx0KHgpOworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICByZXN1bHQoeDIpOworICB9IGVsc2UgeworICAgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CisgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgIH0KK30KKworLy9jb25zb2xlLmxvZygndGVzdE9uZXdheSgnICsgc2xlZXBGb3IgKyAnKSA9PiBKYXZhU2NyaXB0IChsaWtlIFJ1c3QpIG5ldmVyIHNsZWVwcyEnKTsKK2Z1bmN0aW9uIHRlc3RPbmV3YXkoKSB7fQorCitmdW5jdGlvbiB0ZXN0T25ld2F5QXN5bmMoc2xlZXBGb3IpIHsKKyAgdGVzdE9uZXdheShzbGVlcEZvcik7Cit9CisKK2lkZW50aXR5SGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgeworICBzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZVN5bmNIYW5kbGVyKGxhYmVsKTsKKyAgYXN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKTsKK30pOworCitbInRlc3RNYXBNYXAiLCAidGVzdEluc2FuaXR5Il0uZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgeworICBhc3luY0hhbmRsZXJzW2xhYmVsXSA9IG1ha2VBc3luY0hhbmRsZXIobGFiZWwpOworfSk7CisKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSBhc3luY0hhbmRsZXJzOwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy8uZ2l0aWdub3JlIGIvbGliL25vZGV0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordGVzdC1jb21waWxlZC8KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0gYi9saWIvbm9kZXRzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhNjQwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKworc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSx0cyAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJiYgJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC1jb21waWxlZCAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwordHMtY29tcGlsZTogc3R1YnMKKwlta2RpciAtcCB0ZXN0LWNvbXBpbGVkCisJLi4vLi4vbm9kZV9tb2R1bGVzL3R5cGVzY3JpcHQvYmluL3RzYyAtLW91dERpciB0ZXN0LWNvbXBpbGVkLyAtLXByb2plY3QgdGVzdC90c2NvbmZpZy5qc29uCisKK2RlcHM6ICQodG9wX3NyY2RpcikvcGFja2FnZS5qc29uCisJJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8gfHwgJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8KKworYWxsLWxvY2FsOiBkZXBzIHRzLWNvbXBpbGUKKworcHJlY3Jvc3M6IGRlcHMgc3R1YnMgdHMtY29tcGlsZQorCitjaGVjazogZGVwcyB0cy1jb21waWxlCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKE5QTSkgcnVuIHRlc3QtdHMgJiYgY2QgbGliL25vZGV0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB0ZXN0L2dlbi1ub2RlanMKKwkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcworCSQoUk0pIC1yIHRlc3QtY29tcGlsZWQKKworRVhUUkFfRElTVCA9IFwKKwl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMgYi9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTNjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoImFzc2VydCIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Iik7CitpbXBvcnQgdGVzdF9kcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIik7CitpbXBvcnQgVGhyaWZ0VGVzdERyaXZlciA9IHRlc3RfZHJpdmVyLlRocmlmdFRlc3REcml2ZXI7CitpbXBvcnQgVGhyaWZ0VGVzdERyaXZlclByb21pc2UgPSB0ZXN0X2RyaXZlci5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKKworLy8gdmFyIHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2ltcG9ydCAqIGFzIHByb2dyYW0gZnJvbSAiY29tbWFuZGVyIjsKKworcHJvZ3JhbQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiLCA5MDkwKQorICAub3B0aW9uKCItLXByb21pc2UiLCAidGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zIikKKyAgLm9wdGlvbigiLS1wcm90b2NvbCIsICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnkpIFtwcm90b2NvbF0iKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKwordmFyIHBvcnQ6IG51bWJlciA9IHByb2dyYW0ucG9ydDsKK3ZhciBwcm9taXNlID0gcHJvZ3JhbS5wcm9taXNlOworCit2YXIgb3B0aW9ucyA9IHsKKyAgdHJhbnNwb3J0OiBUaHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogVGhyaWZ0LlRCaW5hcnlQcm90b2NvbAorfTsKKwordmFyIHRlc3REcml2ZXIgPSBwcm9taXNlID8gVGhyaWZ0VGVzdERyaXZlclByb21pc2UgOiBUaHJpZnRUZXN0RHJpdmVyOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCBwb3J0LCBvcHRpb25zKTsKKworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnI6IHN0cmluZykgeworICAgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChUaHJpZnRUZXN0LkNsaWVudCwgY29ubmVjdGlvbik7CitydW5UZXN0cygpOworCitmdW5jdGlvbiBydW5UZXN0cygpIHsKKyAgdGVzdERyaXZlcihjbGllbnQsIGZ1bmN0aW9uIChzdGF0dXM6IHN0cmluZykgeworICAgIGNvbnNvbGUubG9nKHN0YXR1cyk7CisgICAgcHJvY2Vzcy5leGl0KDApOworICB9KTsKK30KKworZXhwb3J0cy5leHByZXNzb1Rlc3QgPSBmdW5jdGlvbigpIHt9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaCBiL2xpYi9ub2RldHMvdGVzdC9ydW5DbGllbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQ1ZTlhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9ydW5DbGllbnQuc2gKQEAgLTAsMCArMSwxOCBAQAorIyEgL2Jpbi9zaAorCitESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCisKK21rZGlyIC1wICRESVIvLi4vdGVzdC1jb21waWxlZAorCitDT01QSUxFRERJUj0iJChjZCAkRElSICYmIGNkIC4uL3Rlc3QtY29tcGlsZWQgJiYgcHdkKSIKK2V4cG9ydCBOT0RFX1BBVEg9IiR7RElSfToke0RJUn0vLi4vLi4vbm9kZWpzL2xpYjoke05PREVfUEFUSH0iCisKK2NvbXBpbGUoKQoreworICAjZ2VuZXJhdGluZyB0aHJpZnQgY29kZQorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0NPTVBJTEVERElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Cit9Citjb21waWxlCisKK25vZGUgJHtDT01QSUxFRERJUn0vY2xpZW50LmpzICQqCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoIGIvbGliL25vZGV0cy90ZXN0L3J1blNlcnZlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWVlOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3J1blNlcnZlci5zaApAQCAtMCwwICsxLDIwIEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK30KK2NvbXBpbGUKKworbm9kZSAke0NPTVBJTEVERElSfS9zZXJ2ZXIuanMgJCoKKworCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3NlcnZlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE1M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3NlcnZlci50cwpAQCAtMCwwICsxLDI2IEBACitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Cit2YXIgcHJvZ3JhbSA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpOworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCcpOworaW1wb3J0IHRlc3RfaGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJyk7CisKKworcHJvZ3JhbQorICAub3B0aW9uKCctLXBvcnQgPHBvcnQ+JywgJ1NldCB0aHJpZnQgc2VydmVyIHBvcnQnLCA5MDkwKQorICAub3B0aW9uKCctLXByb21pc2UnLCAndGVzdCB3aXRoIHByb21pc2Ugc3R5bGUgZnVuY3Rpb25zJykKKyAgLm9wdGlvbignLS1wcm90b2NvbCcsICciU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5KSBbcHJvdG9jb2xdIicpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCit2YXIgcG9ydDogbnVtYmVyID0gcHJvZ3JhbS5wb3J0OworCit2YXIgb3B0aW9uczogdGhyaWZ0LlNlcnZlck9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgcHJvdG9jb2w6IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wKK307CisKK3ZhciBzZXJ2ZXI6IHRocmlmdC5TZXJ2ZXI7CitpZiAocHJvZ3JhbS5wcm9taXNlKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIG5ldyB0ZXN0X2hhbmRsZXIuQXN5bmNUaHJpZnRUZXN0SGFuZGxlcigpLCBvcHRpb25zKTsKK30gZWxzZSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIG5ldyB0ZXN0X2hhbmRsZXIuU3luY1RocmlmdFRlc3RIYW5kbGVyKCksIG9wdGlvbnMpOworfQorc2VydmVyLmxpc3Rlbihwb3J0KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0LWNhc2VzLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NDBlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0LWNhc2VzLnRzCkBAIC0wLDAgKzEsMTEzIEBACisndXNlIHN0cmljdCc7CisKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOworCisvL2FsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKy8qanNoaW50IC1XMTAwICovCitleHBvcnQgdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKyAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKyAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKyAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisgICAgIkLDom4tbMOibS1nw7osIOeyteiqniI7CisvKmpzaGludCArVzEwMCAqLworCitleHBvcnQgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsKKyAgICAnIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFwiIH19fXsgW1tbICc7CisKK2V4cG9ydCB2YXIgbWFwVGVzdElucHV0ID0geworICAiYSI6IjEyMyIsICJhIGIiOiJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6InNhbWUiLCAiMCI6Im51bWVyaWMga2V5IiwKKyAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCit9OworCitleHBvcnQgdmFyIHNpbXBsZSA9IFsKKyAgWyd0ZXN0Vm9pZCcsIHVuZGVmaW5lZF0sCisgIFsndGVzdFN0cmluZycsICdUZXN0J10sCisgIFsndGVzdFN0cmluZycsICcnXSwKKyAgWyd0ZXN0U3RyaW5nJywgc3RyaW5nVGVzdF0sCisgIFsndGVzdFN0cmluZycsIHNwZWNpYWxDaGFyYWN0ZXJzXSwKKyAgWyd0ZXN0Qnl0ZScsIDFdLAorICBbJ3Rlc3RCeXRlJywgMF0sCisgIFsndGVzdEJ5dGUnLCAtMV0sCisgIFsndGVzdEJ5dGUnLCAtMTI3XSwKKyAgWyd0ZXN0STMyJywgLTFdLAorICBbJ3Rlc3REb3VibGUnLCAtNS4yMDk4NTIzXSwKKyAgWyd0ZXN0RG91YmxlJywgNy4wMTIwNTIxNzUyMTUwNDRdLAorICBbJ3Rlc3RFbnVtJywgdHR5cGVzLk51bWJlcnouT05FXQorXTsKKworZXhwb3J0IHZhciBzaW1wbGVMb29zZSA9IFsKKyAgWyd0ZXN0STY0JywgNV0sCisgIFsndGVzdEk2NCcsIC01XSwKKyAgWyd0ZXN0STY0JywgNzM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0STY0JywgLTM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0STY0JywgLTczNDM1OTczODM2OF0sCisgIFsndGVzdFR5cGVkZWYnLCA2OV0KK10KKwordmFyIG1hcG91dDoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IHt9OworZm9yICh2YXIgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgbWFwb3V0W2ldID0gaS0xMDsKK30KKworZXhwb3J0IHZhciBkZWVwID0gWworICBbJ3Rlc3RNYXAnLCBtYXBvdXRdLAorICBbJ3Rlc3RTZXQnLCBbMSwyLDNdXSwKKyAgWyd0ZXN0TGlzdCcsIFsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMF1dLAorICBbJ3Rlc3RTdHJpbmdNYXAnLCBtYXBUZXN0SW5wdXRdCitdOworCitleHBvcnQgdmFyIG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgc3RyaW5nX3RoaW5nOiAnWmVybycsCisgIGJ5dGVfdGhpbmc6IDEsCisgIGkzMl90aGluZzogLTMsCisgIGk2NF90aGluZzogMTAwMDAwMAorfSk7CisKK2V4cG9ydCB2YXIgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOworb3V0Mi5ieXRlX3RoaW5nID0gMTsKK291dDIuc3RydWN0X3RoaW5nID0gb3V0Oworb3V0Mi5pMzJfdGhpbmcgPSA1OworCitleHBvcnQgdmFyIGNyYXp5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSh7CisgICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAorICAieHRydWN0cyI6W25ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCisgICAgICAiYnl0ZV90aGluZyI6NCwKKyAgICAgICJpMzJfdGhpbmciOjQsCisgICAgICAiaTY0X3RoaW5nIjo0CisgICAgfSksIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAorICAgICAgImJ5dGVfdGhpbmciOjIsCisgICAgICAiaTMyX3RoaW5nIjoyLAorICAgICAgImk2NF90aGluZyI6MgorICAgIH0pXQorfSk7CisKK2V4cG9ydCB2YXIgaW5zYW5pdHk6IGFueSA9IHsKKyAgIjEiOnsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6eyAiNiI6eyAidXNlck1hcCI6e30sICJ4dHJ1Y3RzIjpbXSB9IH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCBiL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3YzAwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaApAQCAtMCwwICsxLDM4IEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworICB0c2MgLS1vdXREaXIgJENPTVBJTEVERElSIC0tcHJvamVjdCAkRElSL3RzY29uZmlnLmpzb24KK30KK2NvbXBpbGUKKwordGVzdFNlcnZlcigpCit7CisgIGVjaG8gInN0YXJ0IHNlcnZlciAkMSIKKyAgUkVUPTAKKyAgbm9kZSAke0NPTVBJTEVERElSfS9zZXJ2ZXIuanMgJDEgJgorICBTRVJWRVJQSUQ9JCEKKyAgc2xlZXAgMQorICBlY2hvICJzdGFydCBjbGllbnQgJDEiCisgIG5vZGUgJHtDT01QSUxFRERJUn0vY2xpZW50LmpzICQxIHx8IFJFVD0xCisgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICByZXR1cm4gJFJFVAorfQorCisjaW50ZWdyYXRpb24gdGVzdHMKKwordGVzdFNlcnZlciB8fCBURVNUT0s9MQordGVzdFNlcnZlciAtLXByb21pc2UgfHwgVEVTVE9LPTEKKworZXhpdCAkVEVTVE9LCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdF9kcml2ZXIudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9kcml2ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0MTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisgLy8gVGhpcyBpcyB0aGUgTm9kZS5qcyB0ZXN0IGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQKKyAvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorIC8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCisgLy8KKyAvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKyAvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKKyAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aAorIC8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKworaW1wb3J0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CitpbXBvcnQgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMiKTsKK2ltcG9ydCBUaHJpZnRUZXN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QiKTsKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2ltcG9ydCBRID0gdGhyaWZ0LlE7CitpbXBvcnQgVEV4Y2VwdGlvbiA9IHRocmlmdC5UaHJpZnQuVEV4Y2VwdGlvbjsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoIm5vZGUtaW50NjQiKTsKK2ltcG9ydCB0ZXN0Q2FzZXMgPSByZXF1aXJlKCIuL3Rlc3QtY2FzZXMiKTsKKworZXhwb3J0IGZ1bmN0aW9uIFRocmlmdFRlc3REcml2ZXIoY2xpZW50OiBUaHJpZnRUZXN0LkNsaWVudCwgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZCkgeworCisgIHRlc3QoIk5vZGVKUyBTdHlsZSBDYWxsYmFjayBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKworICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm46IChhOiBhbnksIGI6IGFueSwgbXNnPzogc3RyaW5nKSA9PiB2b2lkKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oYzogKHN0cmluZyB8IGFueSlbXSkgeworICAgICAgICB2YXIgZm5OYW1lID0gY1swXTsKKyAgICAgICAgdmFyIGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgKDxhbnk+Y2xpZW50KVtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnI6IGFueSwgYWN0dWFsOiBhbnkpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCBmbk5hbWUgKyAiOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgIH0pCisgICAgICB9OworICAgIH0KKworICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmVxdWFsKSk7CisgICAgdGVzdENhc2VzLnNpbXBsZUxvb3NlLmZvckVhY2gobWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0peworICAgICAgYXNzZXJ0Lm9rKGEgPT0gZSwgbSk7CisgICAgfSkpOworICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICB2YXIgZXhwZWN0ZWQ6IHR5cGVvZiByZXNwb25zZSA9IHsKKyAgICAgICAgIjQiOiB7IjEiOjEsICIyIjoyLCAiMyI6MywgIjQiOjR9LAorICAgICAgICAiLTQiOiB7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KKyAgICAgIH07CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwZWN0ZWQsIHJlc3BvbnNlLCAidGVzdE1hcE1hcCIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RTdHJ1Y3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eSIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBjb2RlJyk7CisgICAgICBhc3NlcnQuZXF1YWwoJ1hjZXB0aW9uJywgZXJyLm1lc3NhZ2UsICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIG1lc3NhZ2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdEV4Y2VwdGlvbjogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RPbmV3YXk6IG5vIGNhbGxiYWNrIGVycm9yJyk7CisgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgJ3Rlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgeworICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgImNoZWNrT2ZmQnlPbmU6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgIGRvbmUoKTsKKyAgICAgIH0pOworICAgIH0sIGNhbGxiYWNrKTsKKworICB9KTsKK307CisKK2V4cG9ydCBmdW5jdGlvbiBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZShjbGllbnQ6IFRocmlmdFRlc3QuQ2xpZW50LCBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdGVzdCgiUSBQcm9taXNlIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgdmFyIGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIGZhaWwobXNnOiBzdHJpbmcpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihlcnJvciwgcmVzcG9uc2UpIHsKKyAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7CisgICAgICAgICAgYXNzZXJ0LmZhaWwobXNnKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbjogKGE6IGFueSwgYjogYW55LCBtc2c/OiBzdHJpbmcpID0+IHZvaWQpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjOiAoc3RyaW5nIHwgYW55KVtdKSB7CisgICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOworICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAoPGFueT5jbGllbnQpW2ZuTmFtZV0oZXhwZWN0ZWQpCisgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oYWN0dWFsOiBhbnkpIHsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSkKKyAgICAgICAgICAuZmFpbChmYWlsKCJmbk5hbWUiKSk7CisgICAgICB9OworICAgIH0KKworICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmVxdWFsKSk7CisgICAgdGVzdENhc2VzLnNpbXBsZUxvb3NlLmZvckVhY2gobWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0peworICAgICAgYXNzZXJ0Lm9rKGEgPT0gZSwgbSk7CisgICAgfSkpOworICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdFN0cnVjdCIpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3ROZXN0IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eSIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3RJbnNhbml0eSIpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgZmFpbCgidGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgVEV4Y2VwdGlvbik7CisgICAgICB9KTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGZhaWwoInRlc3RFeGNlcHRpb246IFhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiB0dHlwZXMuWGNlcHRpb24pOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICAgIGFzc2VydC5lcXVhbCgiWGNlcHRpb24iLCBlcnIubWVzc2FnZSk7CisgICAgICB9KTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXF1YWwodW5kZWZpbmVkLCByZXNwb25zZSk7IC8vdm9pZAorICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3RFeGNlcHRpb24iKSk7CisKKyAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmYWlsKCJ0ZXN0T25ld2F5OiBzaG91bGQgbm90IGFuc3dlciIpKTsKKworICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgeworICAgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0STMyKC0xKSkKKyAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KQorICAgICAgICAuZmFpbChmYWlsKCJjaGVja09mZkJ5T25lIikpOworICAgIH0sIGNhbGxiYWNrKTsKKyAgfSk7Cit9OworCisKKy8vIEhlbHBlciBGdW5jdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitmdW5jdGlvbiBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0OiB0ZXN0LlRlc3QpIHsKKworICByZXR1cm4gZnVuY3Rpb24gKG1hcDE6IGFueSwgbWFwMjogYW55LCBtc2c6IHN0cmluZykgeworICAgIHZhciBlcXVhbCA9IHRydWU7CisKKyAgICB2YXIgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworCisgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOworCisgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxOiBhbnksIG1hcDI6IGFueSkgOiBib29sZWFuIHsKKyAgICAgIGlmICghKHR5cGVvZiBtYXAxICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBtYXAyICE9PSAiZnVuY3Rpb24iKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICJvYmplY3QiKSB7CisgICAgICAgIC8vSGFuZGxlIGludDY0IHR5cGVzICh3aGljaCB1c2Ugbm9kZS1pbnQ2NCBpbiBOb2RlLmpzIEphdmFTY3JpcHQpCisgICAgICAgIGlmICgodHlwZW9mIG1hcDEgPT09ICJudW1iZXIiKSAmJiAodHlwZW9mIG1hcDIgPT09ICJvYmplY3QiKSAmJgorICAgICAgICAgICAgKG1hcDIuYnVmZmVyKSAmJiAobWFwMi5idWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIpICYmIChtYXAyLmJ1ZmZlci5sZW5ndGggPT09IDgpKSB7CisgICAgICAgICAgdmFyIG4gPSBuZXcgSW50NjQobWFwMi5idWZmZXIpOworICAgICAgICAgIHJldHVybiBtYXAxID09PSBuLnRvTnVtYmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIG1hcDEgPT0gbWFwMjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hcDEpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkgeworICAgICAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIGNoZWNrT2ZmQnlPbmUoZG9uZTogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB2b2lkLCBjYWxsYmFjazogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZCkgeworCisgIHZhciByZXRyeV9saW1pdCA9IDMwOworICB2YXIgcmV0cnlfaW50ZXJ2YWwgPSAxMDA7CisgIHZhciB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7CisgIHZhciByZXRyeXMgPSAwOworCisgIC8qKgorICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkgb25lIiAtLQorICAgKiBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IHZvaWQgbGlrZSBub3JtYWwgdm9pZCwgdGhpcyBuZXh0IHRlc3Qgd2lsbAorICAgKiBmYWlsIHNpbmNlIGl0IHdpbGwgZ2V0IHRoZSB2b2lkIGNvbmZpcm1hdGlvbiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAorICAgKiByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgdGhyb3cgdGhlIGV4Y2VwdGlvbjoKKyAgICoKKyAgICogQmVjYXVzZSB0aGlzIGlzIHRoZSBsYXN0IHRlc3QgYWdhaW5zdCB0aGUgc2VydmVyLCB3aGVuIGl0IGNvbXBsZXRlcworICAgKiB0aGUgZW50aXJlIHN1aXRlIGlzIGNvbXBsZXRlIGJ5IGRlZmluaXRpb24gKHRoZSB0ZXN0cyBydW4gc2VyaWFsbHkpLgorICAgKi8KKyAgZG9uZShmdW5jdGlvbigpIHsKKyAgICB0ZXN0X2NvbXBsZXRlID0gdHJ1ZTsKKyAgfSk7CisKKyAgLy9XZSB3YWl0IHVwIHRvIHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIGNvbXBsZXRlCisgIGZ1bmN0aW9uIFRlc3RGb3JDb21wbGV0aW9uKCkgeworICAgIGlmKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKKyAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKKyAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjaygiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKworICAgICAgICAgICAgICAgICAocmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCAvIDEwMDApICsgIiBzZWNvbmRzIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2hhbmRsZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjODU1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2hhbmRsZXIudHMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCisvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCisKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcyIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7CitpbXBvcnQgUSA9IHJlcXVpcmUoInEiKTsKKworCitleHBvcnQgY2xhc3MgU3luY1RocmlmdFRlc3RIYW5kbGVyIHsKKyAgdGVzdFZvaWQoKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgLy9jb25zb2xlLmxvZygndGVzdFZvaWQoKScpOworICAgIHJldHVybiBRLnJlc29sdmU8dm9pZD4odW5kZWZpbmVkKTsKKyAgfQorICB0ZXN0TWFwTWFwKGhlbGxvOiBudW1iZXIpIHsKKyAgICAvL2NvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CisKKyAgICB2YXIgbWFwbWFwOiB7W2tleTogbnVtYmVyXToge1trZXk6IG51bWJlcl06IG51bWJlcjsgfX0gPSBbXTsKKyAgICB2YXIgcG9zOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgdmFyIG5lZzoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKyAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgIHJldHVybiBRLnJlc29sdmUobWFwbWFwKTsKKyAgfQorICB0ZXN0SW5zYW5pdHkoYXJndW1lbnQ6IHR0eXBlcy5JbnNhbml0eSk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogYW55OyB9PiB7CisgICAgY29uc3QgZmlyc3RfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgCisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisgIAorICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisgIAorICAgIGNvbnN0IGluc2FuZTogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgICByZXR1cm4gUS5yZXNvbHZlKGluc2FuZSk7CisgIH0KKyAgdGVzdE11bHRpKGFyZzA6IGFueSwgYXJnMTogbnVtYmVyLCBhcmcyOiBudW1iZXIsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlcikgeworICAgIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CisgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CisgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICAgIHJldHVybiBRLnJlc29sdmUoaGVsbG8pOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHRocm93IHg7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgICB9CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nKSB7CisgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICB0aHJvdyB4OworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICB0aHJvdyB4MjsKKyAgICB9CisKKyAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHJlcyk7CisgIH0KKyAgdGVzdE9uZXdheShzbGVlcEZvcjogbnVtYmVyKSB7CisgIH0KKworICB0ZXN0U3RyaW5nKHRoaW5nOiBzdHJpbmcpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0Qm9vbCh0aGluZzogYm9vbGVhbikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCeXRlKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0STMyKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0STY0KHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0RG91YmxlKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0QmluYXJ5KHRoaW5nOiBCdWZmZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U3RydWN0KHRoaW5nOiB0dHlwZXMuWHRydWN0KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdE5lc3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdE1hcCh0aGluZzogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFN0cmluZ01hcCh0aGluZzogeyBbazogc3RyaW5nXTogc3RyaW5nOyB9KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnopIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KK30KKworZXhwb3J0IGNsYXNzIEFzeW5jVGhyaWZ0VGVzdEhhbmRsZXIgeworICBwcml2YXRlIHN5bmNIYW5kbGVyOiBTeW5jVGhyaWZ0VGVzdEhhbmRsZXI7CisgIGNvbnN0cnVjdG9yKCkgeworICAgIHRoaXMuc3luY0hhbmRsZXIgPSBuZXcgU3luY1RocmlmdFRlc3RIYW5kbGVyKCk7CisgIH0KKworICB0ZXN0Vm9pZChjYWxsYmFjazogKHJlc3VsdDogdm9pZCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNYXBNYXAoaGVsbG86IG51bWJlciwKKyAgICBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfTsgfSkgPT4gdm9pZCk6CisgICAgIFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9OyB9PiB7CisKKyAgICB2YXIgbWFwbWFwOiB7W2tleTogbnVtYmVyXToge1trZXk6IG51bWJlcl06IG51bWJlcjsgfX0gPSBbXTsKKyAgICB2YXIgcG9zOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgdmFyIG5lZzoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKyAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgIGNhbGxiYWNrKG51bGwsIG1hcG1hcCk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJbnNhbml0eShhcmd1bWVudDogdHR5cGVzLkluc2FuaXR5LCBjYWxsYmFjaz86IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBudW1iZXJdOiBhbnk7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IGFueTsgfT4geworICAgIGNvbnN0IGZpcnN0X21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgIAorICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworICAKKyAgICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAKKyAgICBjb25zdCBpbnNhbmU6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQpeworICAgICAgY2FsbGJhY2sobnVsbCwgaW5zYW5lKTsKKyAgICB9CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNdWx0aShhcmcwOiBhbnksIGFyZzE6IG51bWJlciwgYXJnMjogbnVtYmVyLCBhcmczOiB7IFtrOiBudW1iZXJdOiBzdHJpbmc7IH0sIGFyZzQ6IHR0eXBlcy5OdW1iZXJ6LCBhcmc1OiBudW1iZXIsIHJlc3VsdDogRnVuY3Rpb24pOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3Q+IHsKKyAgICB2YXIgaGVsbG8gPSB0aGlzLnN5bmNIYW5kbGVyLnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgICBoZWxsby50aGVuKGhlbGxvID0+IHJlc3VsdChudWxsLCBoZWxsbykpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RXhjZXB0aW9uKGFyZzogc3RyaW5nLCByZXN1bHQ6IChlcnI6IGFueSkgPT4gdm9pZCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIHJlc3VsdChuZXcgVGhyaWZ0LlRFeGNlcHRpb24oYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdChudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwOiBzdHJpbmcsIGFyZzE6IHN0cmluZywgcmVzdWx0OiAoZXJyOiBhbnksIHJlcz86IHR0eXBlcy5YdHJ1Y3QpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3Q+IHsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKKyAgICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgICAgcmVzdWx0KHgyKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgIHJlc3VsdChudWxsLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE9uZXdheShzbGVlcEZvcjogbnVtYmVyLCByZXN1bHQ6IEZ1bmN0aW9uKSB7CisgICAgdGhpcy5zeW5jSGFuZGxlci50ZXN0T25ld2F5KHNsZWVwRm9yKTsKKyAgfQorICB0ZXN0U3RyaW5nKHRoaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogc3RyaW5nKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxzdHJpbmc+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCeXRlKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCb29sKHRoaW5nOiBib29sZWFuLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQgKTogUS5JUHJvbWlzZTxib29sZWFuPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0STMyKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+ICB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0STY0KHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+ICB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RG91YmxlKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+ICB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0QmluYXJ5KHRoaW5nOiBCdWZmZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogQnVmZmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxCdWZmZXI+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTdHJ1Y3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLlh0cnVjdCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE5lc3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHR0eXBlcy5YdHJ1Y3QyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0Mj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE1hcCh0aGluZzogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9LCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfSkgPT4gdm9pZCk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogbnVtYmVyOyB9PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0U3RyaW5nTWFwKHRoaW5nOiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTZXQodGhpbmc6IG51bWJlcltdLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcltdKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXJbXT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdExpc3QodGhpbmc6IG51bWJlcltdLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcltdKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXJbXT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEVudW0odGhpbmc6IHR0eXBlcy5OdW1iZXJ6LCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHR0eXBlcy5OdW1iZXJ6KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuTnVtYmVyej4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFR5cGVkZWYodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90c2NvbmZpZy5qc29uIGIvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5ZDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90c2NvbmZpZy5qc29uCkBAIC0wLDAgKzEsMjIgQEAKK3sKKyAgICAiY29tcGlsZXJPcHRpb25zIjogeworICAgICAgICAiYWxsb3dKcyI6IGZhbHNlLAorICAgICAgICAiYWx3YXlzU3RyaWN0IjogdHJ1ZSwKKyAgICAgICAgImJhc2VVcmwiOiAiLiIsCisgICAgICAgICJkZWNsYXJhdGlvbiI6IHRydWUsCisgICAgICAgICJlbWl0RGVjb3JhdG9yTWV0YWRhdGEiOiB0cnVlLAorICAgICAgICAiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyI6IHRydWUsCisgICAgICAgICJtb2R1bGUiOiAiY29tbW9uanMiLAorICAgICAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJub2RlIiwKKyAgICAgICAgIm5vSW1wbGljaXRUaGlzIjogdHJ1ZSwKKyAgICAgICAgIm5vVW51c2VkTG9jYWxzIjogdHJ1ZSwKKyAgICAgICAgInByZXNlcnZlQ29uc3RFbnVtcyI6IHRydWUsCisgICAgICAgICJyZW1vdmVDb21tZW50cyI6IHRydWUsCisgICAgICAgICJzdHJpY3RGdW5jdGlvblR5cGVzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdE51bGxDaGVja3MiOiB0cnVlLAorICAgICAgICAidGFyZ2V0IjogImVzNiIsCisgICAgICAgICJwYXRocyI6IHsKKyAgICAgICAgICAgICJ0aHJpZnQiOiBbIi4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Il0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC8uZ2l0aWdub3JlIGIvbGliL29jYW1sLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5YTZhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTEgQEAKK19idWlsZC8KK190YWdzCitjb25maWd1cmUKK3NldHVwLmRhdGEKK3NldHVwLm1sCitteW9jYW1sYnVpbGQubWwKKyovTUVUQQorKi8qLm1sbGliCisqLyoubWxkeWxpYgorTWFrZWZpbGUKK09DYW1sTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9ERVZFTE9QTUVOVCBiL2xpYi9vY2FtbC9ERVZFTE9QTUVOVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVhMDNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL0RFVkVMT1BNRU5UCkBAIC0wLDAgKzEsNzYgQEAKK1RocmlmdCBPQ2FtbCBEZXZlbG9wbWVudAorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1ByZXJlcXVpc2l0ZXMKKy0tLS0tLS0tLS0tLS0KKworSW4gb3JkZXIgdG8gYnVpbGQgdGhpcyBsaWJyYXJ5LCB5b3UgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgaW5zdGFsbGVkOgorCisgICogVGhlIE9DYW1sIGNvbXBpbGVyLCBwcmVmZXJhYmx5ID40LjAwCisgICogVGhlIE9hc2lzIGJ1aWxkIHRvb2wKKworSW4gYWRkaXRpb24geW91IG1heSB3YW50IHRvIGluc3RhbGwgT1BBTSwgd2hpY2ggd2lsbCBhbGxvdyB5b3UgdG8gc2V0dXAgYW4KK09DYW1sIGRldmVsb3BtZW50IGVudmlyb25tZW50IHRoYXQncyBpc29sYXRlZCBmcm9tIHlvdXIgc3lzdGVtIGluc3RhbGxhdGlvbiwKK211Y2ggbGlrZSB2aXJ1dGFsZW52IGZvciBQeXRob24gb3IgdGhlIG15cmlhZCBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgUnVieS4gSWYKK3lvdSBoYXZlIE9QQU0gaW5zdGFsbGVkLCB0aGVuIGluc3RhbGxpbmcgT2FzaXMgaXMgYXMgc2ltcGxlIGFzIHJ1bm5pbmc6CisKKyAgJCBvcGFtIGluc3RhbGwgb2FzaXMKKworQnVpbGRpbmcKKy0tLS0tLS0tCisKK09uY2UgYWxsIHRoZSBwcmVyZXF1aXNpdGVzIGhhdmUgYmVlbiBpbnN0YWxsZWQsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgICQgb2FzaXMgc2V0dXAKKyAgJCAuL2NvbmZpZ3VyZQorICAkIG1ha2UKKworVGhlIGBvYXNpcyBzZXR1cGAgY29tbWFuZCB3aWxsIGdlbmVyYXRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBNYWtlZmlsZSwKK2Fsb25nIHdpdGggb3RoZXIgZmlsZXMgdGhhdCBvcGFtIHdpbGwgdXNlIHRvIGNyZWF0ZSBhbiBpbnN0YWxsYWJsZSBsaWJyYXJ5LgorVGhlIGNvZmlndXJlIHNjcmlwdCB3aWxsIGVuc3VyZSB0aGF0IGFsbCBidWlsZCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZCwgYW5kCittYWtlIHdpbGwgYWN0dWFsbHkgYnVpbGQgdGhlIGxpYnJhcnkuCisKK1RvIHJlbW92ZSBmaWxlcyB0aGF0IHRoZSBjb21waWxlciBnZW5lYXRlcywgcnVuOgorCisgICQgbWFrZSBjbGVhbgorCitUbyByZW1vdmUgdGhvc2UgZmlsZXMgX2FzIHdlbGwgYXNfIGZpbGVzIHRoYXQgdGhlIHNldHVwIGFuZCBjb25maWd1cmUgcHJvY2VzcworZ2VuZXJhdGVzLCBydW46CisKKyAgJCBybSBgY2F0IC5naXRpZ25vcmVgCisKK0luc3RhbGxpbmcKKy0tLS0tLS0tLS0KKworSWYgeW91J3JlIHVzaW5nIG9wYW0sIHNpbXBseSBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICQgbWFrZSBpbnN0YWxsCisKK1doaWxlIGRldmVsb3BtZW50LCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCB5b3VyIGxhdGVzdCBidWlsZCBvbiB0aGUgc3lzdGVtIHRvCit0ZXN0IGFnYWluc3Qgb3RoZXIgbGlicmFyaWVzIG9yIHByb2dyYW1zLiBUbyBkbyB0aGlzLCB1c2U6CisKKyAgJCBtYWtlIHJlaW5zdGFsbAorCitEaXN0cmlidXRpb24KKy0tLS0tLS0tLS0tLQorCitUaGUgZGUgZmFjdG8gcHJlZmVycmVkIG1ldGhvZCBmb3IgZGlzdHJpYnV0aW5nIE9DYW1sIGxpYnJhcmllcyBpcyB0aHJvdWdoIHRoZQorT1BBTSBwYWNrYWdlIHJlcG9zaXRvcnkuIFRvIHB1Ymxpc2ggdGhlIGxhdGVzdCBwYWNrYWdlLCBpc3N1ZSBhIHB1bGwgcmVxdWVzdAorYWdhaW5zdCB0aGUgZm9sbG93aW5nIGdpdGh1YiByZXBvc2l0b3J5OgorCisgIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkKKworVGhlIHB1bGwgcmVxdWVzdGlvbiBzaG91bGQgYWRkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgZmlsZXM6CisKKyAgcGFja2FnZQorICAgIHxfX3RocmlmdAorICAgICAgIHxfX3RocmlmdC48VkVSU0lPTj4KKyAgICAgICAgICB8X18gZGVzY3IKKyAgICAgICAgICB8X18gb3BhbQorICAgICAgICAgIHxfXyB1cmwKKworVGVtcGxhdGVzIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgb3BhbS8gc3ViZGlyZWN0b3J5IG9mCit0aGlzIGxpYnJhcnkncyByb290LCB3aXRoIFhYWCguLi4pIGluZGljYXRpbmcgZmllbGRzIHRoYXQgbmVlZCB0byBiZSBmaWxsZWQKK291dC4gWW91IGNhbiBmaW5kIGZ1cnRoZXIgZG9jdW1lbnRhdGlvbiBoZXJlOgorCisgIGh0dHA6Ly9vcGFtLm9jYW1sLm9yZy9kb2MvUGFja2FnaW5nLmh0bWwKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9NYWtlZmlsZSBiL2xpYi9vY2FtbC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiZWVlNy4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotYWxsOgotCWNkIHNyYzsgbWFrZTsgY2QgLi4KLWNsZWFuOgotCWNkIHNyYzsgbWFrZSBjbGVhbjsgY2QgLi4KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlIGIvbGliL29jYW1sL09DYW1sTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjkyNTIuLjAwMDAwMDAKLS0tIGEvbGliL29jYW1sL09DYW1sTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sTWFrZWZpbGUKLSMgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgTWFya3VzIE1vdHRsCi0jCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXBkYXRlcyBzZWU6Ci0jICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mby9ob21lL29jYW1sX3NvdXJjZXMuaHRtbAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTW9kaWZpZWQgYnkgZGFtaWVuIGZvciAuZ2xhZGUubWwgY29tcGlsYXRpb24KLQotIyBTZXQgdGhlc2UgdmFyaWFibGVzIHRvIHRoZSBuYW1lcyBvZiB0aGUgc291cmNlcyB0byBiZSBwcm9jZXNzZWQgYW5kCi0jIHRoZSByZXN1bHQgdmFyaWFibGUuIE9yZGVyIG1hdHRlcnMgZHVyaW5nIGxpbmthZ2UhCi0KLWlmbmRlZiBTT1VSQ0VTCi0gIFNPVVJDRVMgOj0gZm9vLm1sCi1lbmRpZgotZXhwb3J0IFNPVVJDRVMKLQotaWZuZGVmIFJFU19DTElCX1NVRgotICBSRVNfQ0xJQl9TVUYgOj0gX3N0dWJzCi1lbmRpZgotZXhwb3J0IFJFU19DTElCX1NVRgotCi1pZm5kZWYgUkVTVUxUCi0gIFJFU1VMVCA6PSBmb28KLWVuZGlmCi1leHBvcnQgUkVTVUxUIDo9ICQoc3RyaXAgJChSRVNVTFQpKQotCi1leHBvcnQgTElCX1BBQ0tfTkFNRQotCi1pZm5kZWYgRE9DX0ZJTEVTCi0gIERPQ19GSUxFUyA6PSAkKGZpbHRlciAlLm1saSwgJChTT1VSQ0VTKSkKLWVuZGlmCi1leHBvcnQgRE9DX0ZJTEVTCi1GSVJTVF9ET0NfRklMRSA6PSAkKGZpcnN0d29yZCAkKERPQ19GSUxFUykpCi0KLWV4cG9ydCBCQ1NVRkZJWAotZXhwb3J0IE5DU1VGRklYCi0KLWlmbmRlZiBUT1BTVUZGSVgKLSAgVE9QU1VGRklYIDo9IC50b3AKLWVuZGlmCi1leHBvcnQgVE9QU1VGRklYCi0KLSMgRXZlbnR1YWxseSBzZXQgaW5jbHVkZS0gYW5kIGxpYnJhcnktcGF0aHMsIGxpYnJhcmllcyB0byBsaW5rLAotIyBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uLSwgbGluay0gYW5kIG9jYW1seWFjYy1mbGFncwotIyBQYXRoLSBhbmQgbGlicmFyeSBpbmZvcm1hdGlvbiBuZWVkcyBub3QgYmUgd3JpdHRlbiB3aXRoICItSSIgYW5kIHN1Y2guLi4KLSMgRGVmaW5lIFRIUkVBRFMgaWYgeW91IG5lZWQgaXQsIG90aGVyd2lzZSBsZWF2ZSBpdCB1bnNldCAoc2FtZSBmb3IKLSMgVVNFX0NBTUxQNCkhCi0KLWV4cG9ydCBUSFJFQURTCi1leHBvcnQgVk1USFJFQURTCi1leHBvcnQgQU5OT1RBVEUKLWV4cG9ydCBVU0VfQ0FNTFA0Ci0KLWV4cG9ydCBJTkNESVJTCi1leHBvcnQgTElCRElSUwotZXhwb3J0IEVYVExJQkRJUlMKLWV4cG9ydCBSRVNVTFRERVBTCi1leHBvcnQgT0NBTUxfREVGQVVMVF9ESVJTCi0KLWV4cG9ydCBMSUJTCi1leHBvcnQgQ0xJQlMKLWV4cG9ydCBDRlJBTUVXT1JLUwotCi1leHBvcnQgT0NBTUxGTEFHUwotZXhwb3J0IE9DQU1MTkNGTEFHUwotZXhwb3J0IE9DQU1MQkNGTEFHUwotCi1leHBvcnQgT0NBTUxMREZMQUdTCi1leHBvcnQgT0NBTUxOTERGTEFHUwotZXhwb3J0IE9DQU1MQkxERkxBR1MKLQotZXhwb3J0IE9DQU1MTUtMSUJfRkxBR1MKLQotaWZuZGVmIE9DQU1MQ1BGTEFHUwotICBPQ0FNTENQRkxBR1MgOj0gYQotZW5kaWYKLWV4cG9ydCBPQ0FNTENQRkxBR1MKLQotaWZuZGVmIERPQ19ESVIKLSAgRE9DX0RJUiA6PSBkb2MKLWVuZGlmCi1leHBvcnQgRE9DX0RJUgotCi1leHBvcnQgUFBGTEFHUwotCi1leHBvcnQgTEZMQUdTCi1leHBvcnQgWUZMQUdTCi1leHBvcnQgSURMRkxBR1MKLQotZXhwb3J0IE9DQU1MRE9DRkxBR1MKLQotZXhwb3J0IE9DQU1MRklORF9JTlNURkxBR1MKLQotZXhwb3J0IERWSVBTRkxBR1MKLQotZXhwb3J0IFNUQVRJQwotCi0jIEFkZCBhIGxpc3Qgb2Ygb3B0aW9uYWwgdHJhc2ggZmlsZXMgdGhhdCBzaG91bGQgYmUgZGVsZXRlZCBieSAibWFrZSBjbGVhbiIKLWV4cG9ydCBUUkFTSAotCi1FQ0hPIDo9IGVjaG8KLQotaWZkZWYgUkVBTExZX1FVSUVUCi0gIGV4cG9ydCBSRUFMTFlfUVVJRVQKLSAgRUNITyA6PSB0cnVlCi0gIExGTEFHUyA6PSAkKExGTEFHUykgLXEKLSAgWUZMQUdTIDo9ICQoWUZMQUdTKSAtcQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMgIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24geW91ciBPQ2FtbC1pbnN0YWxsYXRpb24KLQotaWZkZWYgTUlOR1cKLSAgZXhwb3J0IE1JTkdXCi0gIFdJTjMyICAgOj0gMQotICBDRkxBR1NfV0lOMzIgOj0gLW1uby1jeWd3aW4KLWVuZGlmCi1pZmRlZiBNU1ZDCi0gIGV4cG9ydCBNU1ZDCi0gIFdJTjMyICAgOj0gMQotICBpZm5kZWYgU1RBVElDCi0gICAgQ1BQRkxBR1NfV0lOMzIgOj0gLURDQU1MX0RMTAotICBlbmRpZgotICBDRkxBR1NfV0lOMzIgKz0gLW5vbG9nbwotICBFWFRfT0JKIDo9IG9iagotICBFWFRfTElCIDo9IGxpYgotICBpZmVxICgkKENDKSxnY2MpCi0gICAgIyB3b3JrIGFyb3VuZCBHTlUgTWFrZSBkZWZhdWx0IHZhbHVlCi0gICAgaWZkZWYgVEhSRUFEUwotICAgICAgQ0MgOj0gY2wgLU1UCi0gICAgZWxzZQotICAgICAgQ0MgOj0gY2wKLSAgICBlbmRpZgotICBlbmRpZgotICBpZmVxICgkKENYWCksZysrKQotICAgICMgd29yayBhcm91bmQgR05VIE1ha2UgZGVmYXVsdCB2YWx1ZQotICAgIENYWCA6PSAkKENDKQotICBlbmRpZgotICBDRkxBR19PIDo9IC1GbwotZW5kaWYKLWlmZGVmIFdJTjMyCi0gIEVYVF9DWFggOj0gY3BwCi0gIEVYRSAgICAgOj0gLmV4ZQotZW5kaWYKLQotaWZuZGVmIEVYVF9PQkoKLSAgRVhUX09CSiA6PSBvCi1lbmRpZgotaWZuZGVmIEVYVF9MSUIKLSAgRVhUX0xJQiA6PSBhCi1lbmRpZgotaWZuZGVmIEVYVF9DWFgKLSAgRVhUX0NYWCA6PSBjYwotZW5kaWYKLWlmbmRlZiBFWEUKLSAgRVhFIDo9ICMgZW1wdHkKLWVuZGlmCi1pZm5kZWYgQ0ZMQUdfTwotICBDRkxBR19PIDo9IC1vICMgZG8gbm90IGRlbGV0ZSB0aGlzIGNvbW1lbnQgKHByZXNlcnZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlKSEKLWVuZGlmCi0KLWV4cG9ydCBDQwotZXhwb3J0IENYWAotZXhwb3J0IENGTEFHUwotZXhwb3J0IENYWEZMQUdTCi1leHBvcnQgTERGTEFHUwotZXhwb3J0IENQUEZMQUdTCi0KLWlmbmRlZiBSUEFUSF9GTEFHCi0gIGlmZGVmIEVMRl9SUEFUSF9GTEFHCi0gICAgUlBBVEhfRkxBRyA6PSAkKEVMRl9SUEFUSF9GTEFHKQotICBlbHNlCi0gICAgUlBBVEhfRkxBRyA6PSAtUgotICBlbmRpZgotZW5kaWYKLWV4cG9ydCBSUEFUSF9GTEFHCi0KLWlmbmRlZiBNU1ZDCi1pZm5kZWYgUElDX0NGTEFHUwotICBQSUNfQ0ZMQUdTIDo9IC1mUElDCi1lbmRpZgotaWZuZGVmIFBJQ19DUFBGTEFHUwotICBQSUNfQ1BQRkxBR1MgOj0gLURQSUMKLWVuZGlmCi1lbmRpZgotCi1leHBvcnQgUElDX0NGTEFHUwotZXhwb3J0IFBJQ19DUFBGTEFHUwotCi1CQ1JFU1VMVCAgOj0gJChhZGRzdWZmaXggJChCQ1NVRkZJWCksICQoUkVTVUxUKSkKLU5DUkVTVUxUICA6PSAkKGFkZHN1ZmZpeCAkKE5DU1VGRklYKSwgJChSRVNVTFQpKQotVE9QUkVTVUxUIDo9ICQoYWRkc3VmZml4ICQoVE9QU1VGRklYKSwgJChSRVNVTFQpKQotCi1pZm5kZWYgT0NBTUxGSU5ECi0gIE9DQU1MRklORCA6PSBvY2FtbGZpbmQKLWVuZGlmCi1leHBvcnQgT0NBTUxGSU5ECi0KLWlmbmRlZiBPQ0FNTEMKLSAgT0NBTUxDIDo9IG9jYW1sYwotZW5kaWYKLWV4cG9ydCBPQ0FNTEMKLQotaWZuZGVmIE9DQU1MT1BUCi0gIE9DQU1MT1BUIDo9IG9jYW1sb3B0Ci1lbmRpZgotZXhwb3J0IE9DQU1MT1BUCi0KLWlmbmRlZiBPQ0FNTE1LVE9QCi0gIE9DQU1MTUtUT1AgOj0gb2NhbWxta3RvcAotZW5kaWYKLWV4cG9ydCBPQ0FNTE1LVE9QCi0KLWlmbmRlZiBPQ0FNTENQCi0gIE9DQU1MQ1AgOj0gb2NhbWxjcAotZW5kaWYKLWV4cG9ydCBPQ0FNTENQCi0KLWlmbmRlZiBPQ0FNTERFUAotICBPQ0FNTERFUCA6PSBvY2FtbGRlcAotZW5kaWYKLWV4cG9ydCBPQ0FNTERFUAotCi1pZm5kZWYgT0NBTUxMRVgKLSAgT0NBTUxMRVggOj0gb2NhbWxsZXgKLWVuZGlmCi1leHBvcnQgT0NBTUxMRVgKLQotaWZuZGVmIE9DQU1MWUFDQwotICBPQ0FNTFlBQ0MgOj0gb2NhbWx5YWNjCi1lbmRpZgotZXhwb3J0IE9DQU1MWUFDQwotCi1pZm5kZWYgT0NBTUxNS0xJQgotICBPQ0FNTE1LTElCIDo9IG9jYW1sbWtsaWIKLWVuZGlmCi1leHBvcnQgT0NBTUxNS0xJQgotCi1pZm5kZWYgT0NBTUxfR0xBREVDQwotICBPQ0FNTF9HTEFERUNDIDo9IGxhYmxnbGFkZWNjMgotZW5kaWYKLWV4cG9ydCBPQ0FNTF9HTEFERUNDCi0KLWlmbmRlZiBPQ0FNTF9HTEFERUNDX0ZMQUdTCi0gIE9DQU1MX0dMQURFQ0NfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgT0NBTUxfR0xBREVDQ19GTEFHUwotCi1pZm5kZWYgQ0FNRUxFT05fUkVQT1JUCi0gIENBTUVMRU9OX1JFUE9SVCA6PSByZXBvcnQKLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fUkVQT1JUCi0KLWlmbmRlZiBDQU1FTEVPTl9SRVBPUlRfRkxBR1MKLSAgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1JFUE9SVF9GTEFHUwotCi1pZm5kZWYgQ0FNRUxFT05fWk9HR1kKLSAgQ0FNRUxFT05fWk9HR1kgOj0gY2FtbHA0byBwYV96b2cuY21hIHByX28uY21vCi1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1pPR0dZCi0KLWlmbmRlZiBDQU1FTEVPTl9aT0dHWV9GTEFHUwotICBDQU1FTEVPTl9aT0dHWV9GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9aT0dHWV9GTEFHUwotCi1pZm5kZWYgT1hSSURMCi0gIE9YUklETCA6PSBveHJpZGwKLWVuZGlmCi1leHBvcnQgT1hSSURMCi0KLWlmbmRlZiBDQU1MSURMCi0gIENBTUxJREwgOj0gY2FtbGlkbAotZW5kaWYKLWV4cG9ydCBDQU1MSURMCi0KLWlmbmRlZiBDQU1MSURMRExMCi0gIENBTUxJRExETEwgOj0gY2FtbGlkbGRsbAotZW5kaWYKLWV4cG9ydCBDQU1MSURMRExMCi0KLWlmbmRlZiBOT0lETEhFQURFUgotICBNQVlCRV9JRExfSEVBREVSIDo9IC1oZWFkZXIKLWVuZGlmCi1leHBvcnQgTk9JRExIRUFERVIKLQotZXhwb3J0IE5PX0NVU1RPTQotCi1pZm5kZWYgQ0FNTFA0Ci0gIENBTUxQNCA6PSBjYW1scDQKLWVuZGlmCi1leHBvcnQgQ0FNTFA0Ci0KLWlmbmRlZiBSRUFMX09DQU1MRklORAotICBpZmRlZiBQQUNLUwotICAgIGlmbmRlZiBDUkVBVEVfTElCCi0gICAgICBpZmRlZiBUSFJFQURTCi0JUEFDS1MgKz0gdGhyZWFkcwotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICAgIGVtcHR5IDo9Ci0gICAgc3BhY2UgOj0gJChlbXB0eSkgJChlbXB0eSkKLSAgICBjb21tYSA6PSAsCi0gICAgaWZkZWYgUFJFRFMKLSAgICAgIFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBSRURTKSkKLSAgICAgIFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChQQUNLUykpCi0gICAgICBPQ0FNTF9GSU5EX1BSRURJQ0FURVMgOj0gLXByZWRpY2F0ZXMgJChQUkVfT0NBTUxfRklORF9QUkVESUNBVEVTKQotICAjICAgIE9DQU1MX0RFUF9QUkVESUNBVEVTIDo9IC1zeW50YXggJChQUkVfT0NBTUxfRklORF9QUkVESUNBVEVTKQotICAgICAgT0NBTUxfRklORF9QQUNLQUdFUyA6PSAkKE9DQU1MX0ZJTkRfUFJFRElDQVRFUykgLXBhY2thZ2UgJChQUkVfT0NBTUxfRklORF9QQUNLQUdFUykKLSAgICAgIE9DQU1MX0RFUF9QQUNLQUdFUyA6PSAkKE9DQU1MX0RFUF9QUkVESUNBVEVTKSAtcGFja2FnZSAkKFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTKQotICAgIGVsc2UKLSAgICAgIE9DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gLXBhY2thZ2UgJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBBQ0tTKSkKLSAgICAgIE9DQU1MX0RFUF9QQUNLQUdFUyA6PQotICAgIGVuZGlmCi0gICAgT0NBTUxfRklORF9MSU5LUEtHIDo9IC1saW5rcGtnCi0gICAgUkVBTF9PQ0FNTEZJTkQgOj0gJChPQ0FNTEZJTkQpCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgT0NBTUxfRklORF9QQUNLQUdFUwotZXhwb3J0IE9DQU1MX0RFUF9QQUNLQUdFUwotZXhwb3J0IE9DQU1MX0ZJTkRfTElOS1BLRwotZXhwb3J0IFJFQUxfT0NBTUxGSU5ECi0KLWlmbmRlZiBPQ0FNTERPQwotICBPQ0FNTERPQyA6PSBvY2FtbGRvYwotZW5kaWYKLWV4cG9ydCBPQ0FNTERPQwotCi1pZm5kZWYgTEFURVgKLSAgTEFURVggOj0gbGF0ZXgKLWVuZGlmCi1leHBvcnQgTEFURVgKLQotaWZuZGVmIERWSVBTCi0gIERWSVBTIDo9IGR2aXBzCi1lbmRpZgotZXhwb3J0IERWSVBTCi0KLWlmbmRlZiBQUzJQREYKLSAgUFMyUERGIDo9IHBzMnBkZgotZW5kaWYKLWV4cG9ydCBQUzJQREYKLQotaWZuZGVmIE9DQU1MTUFLRUZJTEUKLSAgT0NBTUxNQUtFRklMRSA6PSBPQ2FtbE1ha2VmaWxlCi1lbmRpZgotZXhwb3J0IE9DQU1MTUFLRUZJTEUKLQotaWZuZGVmIE9DQU1MTElCUEFUSAotICBPQ0FNTExJQlBBVEggOj0gXAotICAgICQoc2hlbGwgJChPQ0FNTEMpIDI+L2Rldi9udWxsIC13aGVyZSB8fCBlY2hvIC91c3IvbG9jYWwvbGliL29jYW1sKQotZW5kaWYKLWV4cG9ydCBPQ0FNTExJQlBBVEgKLQotaWZuZGVmIE9DQU1MX0xJQl9JTlNUQUxMCi0gIE9DQU1MX0xJQl9JTlNUQUxMIDo9ICQoT0NBTUxMSUJQQVRIKS9jb250cmliCi1lbmRpZgotZXhwb3J0IE9DQU1MX0xJQl9JTlNUQUxMCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgY2hhbmdlIGZvbGxvd2luZyBzZWN0aW9ucyBvbmx5IGlmCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgICB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCi0KLSMgZGVsZXRlIHRhcmdldCBmaWxlcyB3aGVuIGEgYnVpbGQgY29tbWFuZCBmYWlscwotLlBIT05ZOiAuREVMRVRFX09OX0VSUk9SCi0uREVMRVRFX09OX0VSUk9SOgotCi0jIGZvciBwZWRhbnRzIHVzaW5nICItLXdhcm4tdW5kZWZpbmVkLXZhcmlhYmxlcyIKLWV4cG9ydCBNQVlCRV9JREwKLWV4cG9ydCBSRUFMX1JFU1VMVAotZXhwb3J0IENBTUxJRExGTEFHUwotZXhwb3J0IFRIUkVBRF9GTEFHCi1leHBvcnQgUkVTX0NMSUIKLWV4cG9ydCBNQUtFRExMCi1leHBvcnQgQU5OT1RfRkxBRwotZXhwb3J0IENfT1hSSURMCi1leHBvcnQgU1VCUFJPSlMKLWV4cG9ydCBDRkxBR1NfV0lOMzIKLWV4cG9ydCBDUFBGTEFHU19XSU4zMgotCi1JTkNGTEFHUyA6PQotCi1TSEVMTCA6PSAvYmluL3NoCi0KLU1MREVQRElSIDo9IC5fZAotQkNESURJUiAgOj0gLl9iY2RpCi1OQ0RJRElSICA6PSAuX25jZGkKLQotRklMVEVSX0VYVE5TIDo9ICUubWxpICUubWwgJS5tbGwgJS5tbHkgJS5pZGwgJS5veHJpZGwgJS5jICUubSAlLiQoRVhUX0NYWCkgJS5yZXAgJS56b2cgJS5nbGFkZQotCi1GSUxURVJFRCAgICAgOj0gJChmaWx0ZXIgJChGSUxURVJfRVhUTlMpLCAkKFNPVVJDRVMpKQotU09VUkNFX0RJUlMgIDo9ICQoZmlsdGVyLW91dCAuLywgJChzb3J0ICQoZGlyICQoRklMVEVSRUQpKSkpCi0KLUZJTFRFUkVEX1JFUCA6PSAkKGZpbHRlciAlLnJlcCwgJChGSUxURVJFRCkpCi1ERVBfUkVQICAgICAgOj0gJChGSUxURVJFRF9SRVA6JS5yZXA9JChNTERFUERJUikvJS5kKQotQVVUT19SRVAgICAgIDo9ICQoRklMVEVSRURfUkVQOi5yZXA9Lm1sKQotCi1GSUxURVJFRF9aT0cgOj0gJChmaWx0ZXIgJS56b2csICQoRklMVEVSRUQpKQotREVQX1pPRyAgICAgIDo9ICQoRklMVEVSRURfWk9HOiUuem9nPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fWk9HICAgICA6PSAkKEZJTFRFUkVEX1pPRzouem9nPS5tbCkKLQotRklMVEVSRURfR0xBREUgOj0gJChmaWx0ZXIgJS5nbGFkZSwgJChGSUxURVJFRCkpCi1ERVBfR0xBREUgICAgICA6PSAkKEZJTFRFUkVEX0dMQURFOiUuZ2xhZGU9JChNTERFUERJUikvJS5kKQotQVVUT19HTEFERSAgICAgOj0gJChGSUxURVJFRF9HTEFERTouZ2xhZGU9Lm1sKQotCi1GSUxURVJFRF9NTCAgOj0gJChmaWx0ZXIgJS5tbCwgJChGSUxURVJFRCkpCi1ERVBfTUwgICAgICAgOj0gJChGSUxURVJFRF9NTDolLm1sPSQoTUxERVBESVIpLyUuZCkKLQotRklMVEVSRURfTUxJIDo9ICQoZmlsdGVyICUubWxpLCAkKEZJTFRFUkVEKSkKLURFUF9NTEkgICAgICA6PSAkKEZJTFRFUkVEX01MSToubWxpPS5kaSkKLQotRklMVEVSRURfTUxMIDo9ICQoZmlsdGVyICUubWxsLCAkKEZJTFRFUkVEKSkKLURFUF9NTEwgICAgICA6PSAkKEZJTFRFUkVEX01MTDolLm1sbD0kKE1MREVQRElSKS8lLmQpCi1BVVRPX01MTCAgICAgOj0gJChGSUxURVJFRF9NTEw6Lm1sbD0ubWwpCi0KLUZJTFRFUkVEX01MWSA6PSAkKGZpbHRlciAlLm1seSwgJChGSUxURVJFRCkpCi1ERVBfTUxZICAgICAgOj0gJChGSUxURVJFRF9NTFk6JS5tbHk9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX01MWToubWx5PS5kaSkKLUFVVE9fTUxZICAgICA6PSAkKEZJTFRFUkVEX01MWToubWx5PS5tbGkpICQoRklMVEVSRURfTUxZOi5tbHk9Lm1sKQotCi1GSUxURVJFRF9JREwgOj0gJChmaWx0ZXIgJS5pZGwsICQoRklMVEVSRUQpKQotREVQX0lETCAgICAgIDo9ICQoRklMVEVSRURfSURMOiUuaWRsPSQoTUxERVBESVIpLyUuZCkgJChGSUxURVJFRF9JREw6LmlkbD0uZGkpCi1DX0lETCAgICAgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JV9zdHVicy5jKQotaWZuZGVmIE5PSURMSEVBREVSCi0gQ19JREwgKz0gJChGSUxURVJFRF9JREw6LmlkbD0uaCkKLWVuZGlmCi1PQkpfQ19JREwgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JV9zdHVicy4kKEVYVF9PQkopKQotQVVUT19JREwgICAgIDo9ICQoRklMVEVSRURfSURMOi5pZGw9Lm1saSkgJChGSUxURVJFRF9JREw6LmlkbD0ubWwpICQoQ19JREwpCi0KLUZJTFRFUkVEX09YUklETCA6PSAkKGZpbHRlciAlLm94cmlkbCwgJChGSUxURVJFRCkpCi1ERVBfT1hSSURMICAgICAgOj0gJChGSUxURVJFRF9PWFJJREw6JS5veHJpZGw9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX09YUklETDoub3hyaWRsPS5kaSkKLUFVVE9fT1hSSURMICAgICA6PSAkKEZJTFRFUkVEX09YUklETDoub3hyaWRsPS5tbGkpICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9Lm1sKSAkKENfT1hSSURMKQotCi1GSUxURVJFRF9DX0NYWCA6PSAkKGZpbHRlciAlLmMgJS5tICUuJChFWFRfQ1hYKSwgJChGSUxURVJFRCkpCi1PQkpfQ19DWFggICAgICA6PSAkKEZJTFRFUkVEX0NfQ1hYOi5jPS4kKEVYVF9PQkopKQotT0JKX0NfQ1hYICAgICAgOj0gJChPQkpfQ19DWFg6Lm09LiQoRVhUX09CSikpCi1PQkpfQ19DWFggICAgICA6PSAkKE9CSl9DX0NYWDouJChFWFRfQ1hYKT0uJChFWFRfT0JKKSkKLQotUFJFX1RBUkdFVFMgICs9ICQoQVVUT19NTEwpICQoQVVUT19NTFkpICQoQVVUT19JREwpICQoQVVUT19PWFJJREwpICQoQVVUT19aT0cpICQoQVVUT19SRVApICQoQVVUT19HTEFERSkKLQotQUxMX0RFUFMgICAgIDo9ICQoREVQX01MKSAkKERFUF9NTEkpICQoREVQX01MTCkgJChERVBfTUxZKSAkKERFUF9JREwpICQoREVQX09YUklETCkgJChERVBfWk9HKSAkKERFUF9SRVApICQoREVQX0dMQURFKQotCi1NTERFUFMgICAgICAgOj0gJChmaWx0ZXIgJS5kLCAkKEFMTF9ERVBTKSkKLU1MSURFUFMgICAgICA6PSAkKGZpbHRlciAlLmRpLCAkKEFMTF9ERVBTKSkKLUJDREVQSVMgICAgICA6PSAkKE1MSURFUFM6JS5kaT0kKEJDRElESVIpLyUuZGkpCi1OQ0RFUElTICAgICAgOj0gJChNTElERVBTOiUuZGk9JChOQ0RJRElSKS8lLmRpKQotCi1BTExNTCAgICAgICAgOj0gJChmaWx0ZXIgJS5tbGkgJS5tbCAlLm1sbCAlLm1seSAlLmlkbCAlLm94cmlkbCAlLnJlcCAlLnpvZyAlLmdsYWRlLCAkKEZJTFRFUkVEKSkKLQotSU1QTE9fSU5URiAgIDo9ICQoQUxMTUw6JS5tbGk9JS5tbGkuX18pCi1JTVBMT19JTlRGICAgOj0gJChmb3JlYWNoIGZpbGUsICQoSU1QTE9fSU5URiksIFwKLSAgICAgICAgICAgICAgICAgICQoYmFzZW5hbWUgJChmaWxlKSkuY21pICQoYmFzZW5hbWUgJChmaWxlKSkuY21vKQotSU1QTE9fSU5URiAgIDo9ICQoZmlsdGVyLW91dCAlLm1saS5jbW8sICQoSU1QTE9fSU5URikpCi1JTVBMT19JTlRGICAgOj0gJChJTVBMT19JTlRGOiUubWxpLmNtaT0lLmNtaSkKLQotSU1QTFhfSU5URiAgIDo9ICQoSU1QTE9fSU5URjouY21vPS5jbXgpCi0KLUlOVEYgICAgICAgICA6PSAkKGZpbHRlciAlLmNtaSwgJChJTVBMT19JTlRGKSkKLUlNUExfQ01PICAgICA6PSAkKGZpbHRlciAlLmNtbywgJChJTVBMT19JTlRGKSkKLUlNUExfQ01YICAgICA6PSAkKElNUExfQ01POi5jbW89LmNteCkKLUlNUExfQVNNICAgICA6PSAkKElNUExfQ01POi5jbW89LmFzbSkKLUlNUExfUyAgICAgICA6PSAkKElNUExfQ01POi5jbW89LnMpCi0KLU9CSl9MSU5LICAgICA6PSAkKE9CSl9DX0lETCkgJChPQkpfQ19DWFgpCi1PQkpfRklMRVMgICAgOj0gJChJTVBMX0NNTzouY21vPS4kKEVYVF9PQkopKSAkKE9CSl9MSU5LKQotCi1FWEVDUyAgICAgICAgOj0gJChhZGRzdWZmaXggJChFWEUpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzb3J0ICQoVE9QUkVTVUxUKSAkKEJDUkVTVUxUKSAkKE5DUkVTVUxUKSkpCi1pZmRlZiBXSU4zMgotICBFWEVDUyAgICAgICs9ICQoQkNSRVNVTFQpLmRsbCAkKE5DUkVTVUxUKS5kbGwKLWVuZGlmCi0KLUNMSUJfQkFTRSAgICA6PSAkKFJFU1VMVCkkKFJFU19DTElCX1NVRikKLWlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gIFJFU19DTElCICAgICA6PSBsaWIkKENMSUJfQkFTRSkuJChFWFRfTElCKQotZW5kaWYKLQotaWZkZWYgV0lOMzIKLURMTFNPTkFNRSA6PSAkKENMSUJfQkFTRSkuZGxsCi1lbHNlCi1ETExTT05BTUUgOj0gZGxsJChDTElCX0JBU0UpLnNvCi1lbmRpZgotCi1OT05FWEVDUyAgICAgOj0gJChJTlRGKSAkKElNUExfQ01PKSAkKElNUExfQ01YKSAkKElNUExfQVNNKSAkKElNUExfUykgXAotCQkkKE9CSl9GSUxFUykgJChQUkVfVEFSR0VUUykgJChCQ1JFU1VMVCkuY21hICQoTkNSRVNVTFQpLmNteGEgXAotCQkkKE5DUkVTVUxUKS4kKEVYVF9MSUIpICQoQkNSRVNVTFQpLmNtaSAkKEJDUkVTVUxUKS5jbW8gXAotCQkkKE5DUkVTVUxUKS5jbWkgJChOQ1JFU1VMVCkuY214ICQoTkNSRVNVTFQpLm8gXAotCQkkKFJFU19DTElCKSAkKElNUExfQ01POi5jbW89LmFubm90KSBcCi0JCSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY21vICQoTElCX1BBQ0tfTkFNRSkuY214ICQoTElCX1BBQ0tfTkFNRSkubwotCi1pZm5kZWYgU1RBVElDCi0gIE5PTkVYRUNTICs9ICQoRExMU09OQU1FKQotZW5kaWYKLQotaWZuZGVmIExJQklOU1RBTExfRklMRVMKLSAgTElCSU5TVEFMTF9GSUxFUyA6PSAkKFJFU1VMVCkubWxpICQoUkVTVUxUKS5jbWkgJChSRVNVTFQpLmNtYSBcCi0JCSAgICAgICQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS4kKEVYVF9MSUIpICQoUkVTX0NMSUIpCi0gIGlmbmRlZiBTVEFUSUMKLSAgICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICAgICAgTElCSU5TVEFMTF9GSUxFUyArPSAkKERMTFNPTkFNRSkKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLQotZXhwb3J0IExJQklOU1RBTExfRklMRVMKLQotaWZkZWYgV0lOMzIKLSAgIyBzb21lIGV4dHJhIHN0dWZmIGlzIGNyZWF0ZWQgd2hpbGUgbGlua2luZyBETExzCi0gIE5PTkVYRUNTICAgKz0gJChCQ1JFU1VMVCkuJChFWFRfTElCKSAkKEJDUkVTVUxUKS5leHAgJChOQ1JFU1VMVCkuZXhwICQoQ0xJQl9CQVNFKS5leHAgJChDTElCX0JBU0UpLmxpYgotZW5kaWYKLQotVEFSR0VUUyAgICAgIDo9ICQoRVhFQ1MpICQoTk9ORVhFQ1MpCi0KLSMgSWYgdGhlcmUgYXJlIElETC1maWxlcwotaWZuZXEgKCQoc3RyaXAgJChGSUxURVJFRF9JREwpKSwpCi0gIE1BWUJFX0lETCA6PSAtY2NsaWIgLWxjYW1saWRsCi1lbmRpZgotCi1pZmRlZiBVU0VfQ0FNTFA0Ci0gIENBTUxQNFBBVEggOj0gXAotICAgICQoc2hlbGwgJChDQU1MUDQpIC13aGVyZSAyPi9kZXYvbnVsbCB8fCBlY2hvIC91c3IvbG9jYWwvbGliL2NhbWxwNCkKLSAgSU5DRkxBR1MgOj0gLUkgJChDQU1MUDRQQVRIKQotICBDSU5DRkxBR1MgOj0gLUkkKENBTUxQNFBBVEgpCi1lbmRpZgotCi1ESU5DRkxBR1MgOj0gJChJTkNGTEFHUykgJChTT1VSQ0VfRElSUzolPS1JICUpICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUkgJSkKLUlOQ0ZMQUdTIDo9ICQoRElOQ0ZMQUdTKSAkKElOQ0RJUlM6JT0tSSAlKQotQ0lOQ0ZMQUdTICs9ICQoU09VUkNFX0RJUlM6JT0tSSUpICQoSU5DRElSUzolPS1JJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tSSUpCi0KLWlmbmRlZiBNU1ZDCi0gIENMSUJGTEFHUyArPSAkKFNPVVJDRV9ESVJTOiU9LUwlKSAkKExJQkRJUlM6JT0tTCUpIFwKLSAgICAgICAgICAgICAgICQoRVhUTElCRElSUzolPS1MJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tTCUpCi0KLSAgaWZlcSAoJChFTEZfUlBBVEgpLCB5ZXMpCi0gICAgQ0xJQkZMQUdTICs9ICQoRVhUTElCRElSUzolPS1XbCwkKFJQQVRIX0ZMQUcpJSkKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBQUk9GSUxJTkcKLSAgSU5URl9PQ0FNTEMgOj0gJChPQ0FNTEMpCi1lbHNlCi0gIGlmbmRlZiBUSFJFQURTCi0gICAgSU5URl9PQ0FNTEMgOj0gJChPQ0FNTENQKSAtcCAkKE9DQU1MQ1BGTEFHUykKLSAgZWxzZQotICAgICMgT0NhbWwgZG9lcyBub3Qgc3VwcG9ydCBwcm9maWxpbmcgYnl0ZSBjb2RlCi0gICAgIyB3aXRoIHRocmVhZHMgKHlldCksIHRoZXJlZm9yZSB3ZSBmb3JjZSBhbiBlcnJvci4KLSAgICBpZm5kZWYgUkVBTF9PQ0FNTEMKLSAgICAgICQoZXJyb3IgUHJvZmlsaW5nIG9mIG11bHRpdGhyZWFkZWQgYnl0ZSBjb2RlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IE9DYW1sKQotICAgIGVuZGlmCi0gICAgSU5URl9PQ0FNTEMgOj0gJChPQ0FNTEMpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5kZWYgTVNWQwotICBDT01NT05fTERGTEFHUyA6PSAkKExERkxBR1M6JT0tY2NvcHQgJSkgJChTT1VSQ0VfRElSUzolPS1jY29wdCAtTCUpIFwKLQkJICAgICQoTElCRElSUzolPS1jY29wdCAtTCUpICQoRVhUTElCRElSUzolPS1jY29wdCAtTCUpIFwKLQkJICAgICQoRVhUTElCRElSUzolPS1jY29wdCAtV2wgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tY2NvcHQgLUwlKSkKLQotICBpZmVxICgkKEVMRl9SUEFUSCkseWVzKQotICAgIENPTU1PTl9MREZMQUdTICs9ICQoRVhUTElCRElSUzolPS1jY29wdCAtV2wsJChSUEFUSF9GTEFHKSUpCi0gIGVuZGlmCi1lbHNlCi0gIENPTU1PTl9MREZMQUdTIDo9IC1jY29wdCAiL2xpbmsgLU5PREVGQVVMVExJQjpMSUJDICQoTERGTEFHUzolPSUpICQoU09VUkNFX0RJUlM6JT0tTElCUEFUSDolKSBcCi0JCSAgICAkKExJQkRJUlM6JT0tTElCUEFUSDolKSAkKEVYVExJQkRJUlM6JT0tTElCUEFUSDolKSBcCi0JCSAgICAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1MSUJQQVRIOiUpICIKLWVuZGlmCi0KLUNMSUJTX09QVFMgOj0gJChDTElCUzolPS1jY2xpYiAtbCUpICQoQ0ZSQU1FV09SS1M6JT0tY2NsaWIgJy1mcmFtZXdvcmsgJScpCi1pZmRlZiBNU1ZDCi0gIGlmbmRlZiBTVEFUSUMKLSAgIyBNU1ZDIGxpYnJhcmllcyBkbyBub3QgaGF2ZSAnbGliJyBwcmVmaXgKLSAgQ0xJQlNfT1BUUyA6PSAkKENMSUJTOiU9LWNjbGliICUubGliKQotICBlbmRpZgotZW5kaWYKLQotaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgaWZkZWYgQ1JFQVRFX0xJQgotICAgIE9CSlNfTElCUyA6PSAtY2NsaWIgLWwkKENMSUJfQkFTRSkgJChDTElCU19PUFRTKSAkKE1BWUJFX0lETCkKLSAgZWxzZQotICAgIE9CSlNfTElCUyA6PSAkKE9CSl9MSU5LKSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotICBlbmRpZgotZWxzZQotICBPQkpTX0xJQlMgOj0gJChDTElCU19PUFRTKSAkKE1BWUJFX0lETCkKLWVuZGlmCi0KLSMgSWYgd2UgaGF2ZSB0byBtYWtlIGJ5dGUtY29kZQotaWZuZGVmIFJFQUxfT0NBTUxDCi0gIEJZVEVfT0NBTUwgOj0geQotCi0gICMgRVhUUkFERVBTIGlzIGFkZGVkIGRlcGVuZGVuY2llcyB3ZSBoYXZlIHRvIGluc2VydCBmb3IgYWxsCi0gICMgZXhlY3V0YWJsZSBmaWxlcyB3ZSBnZW5lcmF0ZS4gIElkZWFsbHkgaXQgc2hvdWxkIGJlIGFsbCBvZiB0aGUKLSAgIyBsaWJyYXJpZXMgd2UgdXNlLCBidXQgaXQncyBoYXJkIHRvIGZpbmQgdGhlIG9uZXMgdGhhdCBnZXQgc2VhcmNoZWQgb24KLSAgIyB0aGUgcGF0aCBzaW5jZSBJIGRvbid0IGtub3cgdGhlIHBhdGhzIGJ1aWx0IGludG8gdGhlIGNvbXBpbGVyLCBzbwotICAjIGp1c3QgaW5jbHVkZSB0aGUgb25lcyB3aXRoIHNsYXNoZXMgaW4gdGhlaXIgbmFtZXMuCi0gIEVYVFJBREVQUyA6PSAkKGFkZHN1ZmZpeCAuY21hLCQoZm9yZWFjaCBpLCQoTElCUyksJChpZiAkKGZpbmRzdHJpbmcgLywkKGkpKSwkKGkpKSkpCi0gIFNQRUNJQUxfT0NBTUxGTEFHUyA6PSAkKE9DQU1MQkNGTEFHUykKLQotICBSRUFMX09DQU1MQyA6PSAkKElOVEZfT0NBTUxDKQotCi0gIFJFQUxfSU1QTCA6PSAkKElNUExfQ01PKQotICBSRUFMX0lNUExfSU5URiA6PSAkKElNUExPX0lOVEYpCi0gIElNUExfU1VGIDo9IC5jbW8KLQotICBERVBGTEFHUyAgOj0KLSAgTUFLRV9ERVBTIDo9ICQoTUxERVBTKSAkKEJDREVQSVMpCi0KLSAgaWZkZWYgQ1JFQVRFX0xJQgotICAgIG92ZXJyaWRlIENGTEFHUyA6PSAkKFBJQ19DRkxBR1MpICQoQ0ZMQUdTKQotICAgIG92ZXJyaWRlIENQUEZMQUdTIDo9ICQoUElDX0NQUEZMQUdTKSAkKENQUEZMQUdTKQotICAgIGlmbmRlZiBTVEFUSUMKLSAgICAgIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JTUFLRURMTCA6PSAkKERMTFNPTkFNRSkKLQlBTExfTERGTEFHUyA6PSAtZGxsaWIgJChETExTT05BTUUpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgaWZuZGVmIE5PX0NVU1RPTQotICAgIGlmbmVxICIkKHN0cmlwICQoT0JKX0xJTkspICQoVEhSRUFEUykgJChNQVlCRV9JREwpICQoQ0xJQlMpICQoQ0ZSQU1FV09SS1MpKSIgIiIKLSAgICAgIEFMTF9MREZMQUdTICs9IC1jdXN0b20KLSAgICBlbmRpZgotICBlbmRpZgotCi0gIEFMTF9MREZMQUdTICs9ICQoSU5DRkxBR1MpICQoT0NBTUxMREZMQUdTKSAkKE9DQU1MQkxERkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgJChDT01NT05fTERGTEFHUykgJChMSUJTOiU9JS5jbWEpCi0gIENBTUxJRExETExGTEFHUyA6PQotCi0gIGlmZGVmIFRIUkVBRFMKLSAgICBpZmRlZiBWTVRIUkVBRFMKLSAgICAgIFRIUkVBRF9GTEFHIDo9IC12bXRocmVhZAotICAgIGVsc2UKLSAgICAgIFRIUkVBRF9GTEFHIDo9IC10aHJlYWQKLSAgICBlbmRpZgotICAgIEFMTF9MREZMQUdTIDo9ICQoVEhSRUFEX0ZMQUcpICQoQUxMX0xERkxBR1MpCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmbmRlZiBSRUFMX09DQU1MRklORAotICAgICAgICBBTExfTERGTEFHUyA6PSB1bml4LmNtYSB0aHJlYWRzLmNtYSAkKEFMTF9MREZMQUdTKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICBlbmRpZgotCi0jIHdlIGhhdmUgdG8gbWFrZSBuYXRpdmUtY29kZQotZWxzZQotICBFWFRSQURFUFMgOj0gJChhZGRzdWZmaXggLmNteGEsJChmb3JlYWNoIGksJChMSUJTKSwkKGlmICQoZmluZHN0cmluZyAvLCQoaSkpLCQoaSkpKSkKLSAgaWZuZGVmIFBST0ZJTElORwotICAgIFNQRUNJQUxfT0NBTUxGTEFHUyA6PSAkKE9DQU1MTkNGTEFHUykKLSAgICBQTERGTEFHUyA6PQotICBlbHNlCi0gICAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9IC1wICQoT0NBTUxOQ0ZMQUdTKQotICAgIFBMREZMQUdTIDo9IC1wCi0gIGVuZGlmCi0KLSAgUkVBTF9JTVBMIDo9ICQoSU1QTF9DTVgpCi0gIFJFQUxfSU1QTF9JTlRGIDo9ICQoSU1QTFhfSU5URikKLSAgSU1QTF9TVUYgOj0gLmNteAotCi0gIG92ZXJyaWRlIENQUEZMQUdTIDo9IC1ETkFUSVZFX0NPREUgJChDUFBGTEFHUykKLQotICBERVBGTEFHUyAgOj0gLW5hdGl2ZQotICBNQUtFX0RFUFMgOj0gJChNTERFUFMpICQoTkNERVBJUykKLQotICBBTExfTERGTEFHUyA6PSAkKFBMREZMQUdTKSAkKElOQ0ZMQUdTKSAkKE9DQU1MTERGTEFHUykgXAotICAgICAgICAgICAgICAgICAkKE9DQU1MTkxERkxBR1MpICQoQ09NTU9OX0xERkxBR1MpCi0gIENBTUxJRExETExGTEFHUyA6PSAtb3B0Ci0KLSAgaWZuZGVmIENSRUFURV9MSUIKLSAgICBBTExfTERGTEFHUyArPSAkKExJQlM6JT0lLmNteGEpCi0gIGVsc2UKLSAgICBvdmVycmlkZSBDRkxBR1MgOj0gJChQSUNfQ0ZMQUdTKSAkKENGTEFHUykKLSAgICBvdmVycmlkZSBDUFBGTEFHUyA6PSAkKFBJQ19DUFBGTEFHUykgJChDUFBGTEFHUykKLSAgZW5kaWYKLQotICBpZmRlZiBUSFJFQURTCi0gICAgVEhSRUFEX0ZMQUcgOj0gLXRocmVhZAotICAgIEFMTF9MREZMQUdTIDo9ICQoVEhSRUFEX0ZMQUcpICQoQUxMX0xERkxBR1MpCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmbmRlZiBSRUFMX09DQU1MRklORAotICAgICAgICBBTExfTERGTEFHUyA6PSB1bml4LmNteGEgdGhyZWFkcy5jbXhhICQoQUxMX0xERkxBR1MpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgTUFLRV9ERVBTCi0KLWlmZGVmIEFOTk9UQVRFCi0gIEFOTk9UX0ZMQUcgOj0gLWR0eXBlcwotZWxzZQotZW5kaWYKLQotQUxMX09DQU1MQ0ZMQUdTIDo9ICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgJChPQ0FNTEZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICAgJChJTkNGTEFHUykgJChTUEVDSUFMX09DQU1MRkxBR1MpCi0KLWlmZGVmIG1ha2VfZGVwcwotICAtaW5jbHVkZSAkKE1BS0VfREVQUykKLSAgUFJFX1RBUkdFVFMgOj0KLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBVU0VSIFJVTEVTCi0KLSMgQ2FsbCAiT0NhbWxNYWtlZmlsZSBRVUlFVD0iIHRvIGdldCByaWQgb2YgYWxsIG9mIHRoZSBAJ3MuCi1RVUlFVD1ACi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSAoZGVmYXVsdCkKLWJ5dGUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi1iYzoJYnl0ZS1jb2RlCi0KLWJ5dGUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcwotYmNubDoJYnl0ZS1jb2RlLW5vbGluawotCi10b3A6CQkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoVE9QUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlCi0KLW5hdGl2ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoTkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uYzoJbmF0aXZlLWNvZGUKLQotbmF0aXZlLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uY25sOgluYXRpdmUtY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcwotYnl0ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotYmNsOglieXRlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBsaWJyYXJpZXMKLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY214YSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jbDoJbmF0aXZlLWNvZGUtbGlicmFyeQotCi1pZmRlZiBXSU4zMgotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGRsbAotYnl0ZS1jb2RlLWRsbDoJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuZGxsIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1iY2Q6CWJ5dGUtY29kZS1kbGwKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUgZGxsCi1uYXRpdmUtY29kZS1kbGw6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuZGxsIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uY2Q6CW5hdGl2ZS1jb2RlLWRsbAotZW5kaWYKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uCi1kZWJ1Zy1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRjOglkZWJ1Zy1jb2RlCi0KLWRlYnVnLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRjbmw6CWRlYnVnLWNvZGUtbm9saW5rCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAobmF0aXZlIGNvZGUpCi1kZWJ1Zy1uYXRpdmUtY29kZToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoTkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRuYzoJZGVidWctbmF0aXZlLWNvZGUKLQotZGVidWctbmF0aXZlLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRuY25sOglkZWJ1Zy1uYXRpdmUtY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcyB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotZGVidWctY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoQkNSRVNVTFQpLmNtYSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGNsOglkZWJ1Zy1jb2RlLWxpYnJhcnkKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcyB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAobmF0aXZlIGNvZGUpCi1kZWJ1Zy1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNtYSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jbDoJZGVidWctbmF0aXZlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgZm9yIHByb2ZpbGluZwotcHJvZmlsaW5nLWJ5dGUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBQUk9GSUxJTkc9InkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wYmM6CXByb2ZpbGluZy1ieXRlLWNvZGUKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUKLQotcHJvZmlsaW5nLW5hdGl2ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoTkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlQUk9GSUxJTkc9InkiIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wbmM6CXByb2ZpbGluZy1uYXRpdmUtY29kZQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzCi1wcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wYmNsOglwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUgbGlicmFyaWVzCi1wcm9maWxpbmctbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1wbmNsOglwcm9maWxpbmctbmF0aXZlLWNvZGUtbGlicmFyeQotCi0jIHBhY2tzIGJ5dGUtY29kZSBvYmplY3RzCi1wYWNrLWJ5dGUtY29kZToJCQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkuY21vIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFwKLQkJCQlQQUNLX0xJQj15ZXMgbWFrZV9kZXBzPXllcwotcGFiYzoJcGFjay1ieXRlLWNvZGUKLQotIyBwYWNrcyBuYXRpdmUtY29kZSBvYmplY3RzCi1wYWNrLW5hdGl2ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKE5DUkVTVUxUKS5jbXggJChOQ1JFU1VMVCkubyBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJUEFDS19MSUI9eWVzIG1ha2VfZGVwcz15ZXMKLXBhbmM6CXBhY2stbmF0aXZlLWNvZGUKLQotIyBnZW5lcmF0ZXMgSFRNTC1kb2N1bWVudGF0aW9uCi1odGRvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbC9pbmRleC5odG1sCi0KLSMgZ2VuZXJhdGVzIExhdGV4LWRvY3VtZW50YXRpb24KLWxhZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MudGV4Ci0KLSMgZ2VuZXJhdGVzIFBvc3RTY3JpcHQtZG9jdW1lbnRhdGlvbgotcHNkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wcwotCi0jIGdlbmVyYXRlcyBQREYtZG9jdW1lbnRhdGlvbgotcGRmZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucGRmCi0KLSMgZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotZG9jOiBodGRvYyBsYWRvYyBwc2RvYyBwZGZkb2MKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExPVyBMRVZFTCBSVUxFUwotCi0kKFJFQUxfUkVTVUxUKToJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSBcCi0JCQkJJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAkKE9DQU1MX0ZJTkRfTElOS1BLRykgXAotCQkJCSQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCQoRVhFKSBcCi0JCQkJJChSRUFMX0lNUEwpCi0KLW5vbGluazoJCQkkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKQotCi1pZmRlZiBXSU4zMgotJChSRUFMX1JFU1VMVCkuZGxsOgkkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKQotCQkJJChDQU1MSURMRExMKSAkKENBTUxJRExETExGTEFHUykgJChPQkpfTElOSykgJChDTElCUykgXAotCQkJCS1vICRAICQoUkVBTF9JTVBMKQotZW5kaWYKLQotJSQoVE9QU1VGRklYKToJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspICQoRVhUUkFERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE1LVE9QKSBcCi0JCQkJJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAkKE9DQU1MX0ZJTkRfTElOS1BLRykgXAotCQkJCSQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCQoRVhFKSBcCi0JCQkJJChSRUFMX0lNUEwpCi0KLS5TVUZGSVhFUzoJCS5tbGkgLm1sIC5jbWkgLmNtbyAuY214IC5jbWEgLmNteGEgLiQoRVhUX09CSikgXAotICAgICAgICAgICAgICAgICAgICAgICAgLm1seSAuZGkgLmQgLiQoRVhUX0xJQikgLmlkbCAlLm94cmlkbCAuYyAubSAuJChFWFRfQ1hYKSAuaCAuc28gXAotICAgICAgICAgICAgICAgICAgICAgICAgLnJlcCAuem9nIC5nbGFkZQotCi1pZm5kZWYgU1RBVElDCi1pZmRlZiBNSU5HVwotJChETExTT05BTUUpOgkJJChPQkpfTElOSykKLQkJCSQoQ0MpICQoQ0ZMQUdTKSAkKENGTEFHU19XSU4zMikgJChPQkpfTElOSykgLXNoYXJlZCAtbyAkQCBcCi0JCQktV2wsLS13aG9sZS1hcmNoaXZlICQod2lsZGNhcmQgJChmb3JlYWNoIGRpciwkKExJQkRJUlMpLCQoQ0xJQlM6JT0kKGRpcikvbGliJS5hKSkpIFwKLQkJCSAkKE9DQU1MTElCUEFUSCkvb2NhbWxydW4uYSBcCi0JCQktV2wsLS1leHBvcnQtYWxsLXN5bWJvbHMgXAotCQkJLVdsLC0tbm8td2hvbGUtYXJjaGl2ZQotZWxzZQotaWZkZWYgTVNWQwotJChETExTT05BTUUpOgkJJChPQkpfTElOSykKLQkJCWxpbmsgL05PTE9HTyAvRExMIC9PVVQ6JEAgJChPQkpfTElOSykgXAotCQkJICQod2lsZGNhcmQgJChmb3JlYWNoIGRpciwkKExJQkRJUlMpLCQoQ0xJQlM6JT0kKGRpcikvJS5saWIpKSkgXAotCQkJICQoT0NBTUxMSUJQQVRIKS9vY2FtbHJ1bi5saWIKLQotZWxzZQotJChETExTT05BTUUpOgkJJChPQkpfTElOSykKLQkJCSQoT0NBTUxNS0xJQikgJChJTkNGTEFHUykgJChDTElCRkxBR1MpIFwKLQkJCQktbyAkKENMSUJfQkFTRSkgJChPQkpfTElOSykgJChDTElCUzolPS1sJSkgJChDRlJBTUVXT1JLUzolPS1mcmFtZXdvcmsgJSkgXAotCQkJCSQoT0NBTUxNS0xJQl9GTEFHUykKLWVuZGlmCi1lbmRpZgotZW5kaWYKLQotaWZuZGVmIExJQl9QQUNLX05BTUUKLSQoUkVTVUxUKS5jbWE6CQkkKFJFQUxfSU1QTF9JTlRGKSAkKE1BS0VETEwpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi0KLSQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS4kKEVYVF9MSUIpOgkkKFJFQUxfSU1QTF9JTlRGKSAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLWEgJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotZWxzZQotaWZkZWYgQllURV9PQ0FNTAotJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW86ICQoUkVBTF9JTVBMX0lOVEYpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtcGFjayAtbyAkKExJQl9QQUNLX05BTUUpLmNtbyAkKE9DQU1MTERGTEFHUykgJChSRUFMX0lNUEwpCi1lbHNlCi0kKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNteDogJChSRUFMX0lNUExfSU5URikKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxPUFQpIC1wYWNrIC1vICQoTElCX1BBQ0tfTkFNRSkuY214ICAkKE9DQU1MTERGTEFHUykgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0kKFJFU1VMVCkuY21hOgkJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW8gJChNQUtFRExMKSAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgLWEgJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAICQoTElCX1BBQ0tfTkFNRSkuY21vCi0KLSQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS4kKEVYVF9MSUIpOgkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNteCAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLWEgJChmaWx0ZXItb3V0IC1jdXN0b20sICQoQUxMX0xERkxBR1MpKSAkKE9CSlNfTElCUykgLW8gJEAgJChMSUJfUEFDS19OQU1FKS5jbXgKLWVuZGlmCi0KLSQoUkVTX0NMSUIpOiAJCSQoT0JKX0xJTkspCi1pZm5kZWYgTVNWQwotICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCQkgICAgICAkKEFSKSByY3MgJEAgJChPQkpfTElOSykKLSAgZW5kaWYKLWVsc2UKLSAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQkJCWxpYiAtbm9sb2dvIC1kZWJ1Z3R5cGU6Y3YgLW91dDokKFJFU19DTElCKSAkKE9CSl9MSU5LKQotICBlbmRpZgotZW5kaWYKLQotLm1saS5jbWk6ICQoRVhUUkFERVBTKQotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQllbHNlIFwKLQkJCSAgICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCSAgICAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgIiQkcHAgJChQUEZMQUdTKSIgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJZmkKLQotLm1sLmNtaSAubWwuJChFWFRfT0JKKSAubWwuY214IC5tbC5jbW86ICQoRVhUUkFERVBTKQotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCWZpCi0KLWlmZGVmIFBBQ0tfTElCCi0kKFJFQUxfUkVTVUxUKS5jbW8gJChSRUFMX1JFU1VMVCkuY214ICQoUkVBTF9SRVNVTFQpLm86ICQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspICQoRVhUUkFERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgLXBhY2sgJChBTExfTERGTEFHUykgXAotCQkJCSQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5tbGwKLQkJCSQoT0NBTUxMRVgpICQoTEZMQUdTKSAkPAotCi0uUFJFQ0lPVVM6ICAgICAgICAgICAgICAlLm1sICUubWxpCi0lLm1sICUubWxpOiAgICAgICAgICAgICAlLm1seQotCQkJJChPQ0FNTFlBQ0MpICQoWUZMQUdTKSAkPAotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICdzLy4qKFwqcHAgXChbXipdKlwpIFwqKS4qL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbICEgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICBtdiAkKi5tbCAkKi5tbC50ZW1wb3Jhcnk7IFwKLQkJCSAgZWNobyAiKCpwcCAkJHBwICQoUFBGTEFHUykqKSIgPiAkKi5tbDsgXAotCQkJICBjYXQgJCoubWwudGVtcG9yYXJ5ID4+ICQqLm1sOyBcCi0JCQkgIHJtICQqLm1sLnRlbXBvcmFyeTsgXAotCQkJICBtdiAkKi5tbGkgJCoubWxpLnRlbXBvcmFyeTsgXAotCQkJICBlY2hvICIoKnBwICQkcHAgJChQUEZMQUdTKSopIiA+ICQqLm1saTsgXAotCQkJICBjYXQgJCoubWxpLnRlbXBvcmFyeSA+PiAkKi5tbGk7IFwKLQkJCSAgcm0gJCoubWxpLnRlbXBvcmFyeTsgXAotCQkJZmkKLQotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUucmVwCi0JCQkkKENBTUVMRU9OX1JFUE9SVCkgJChDQU1FTEVPTl9SRVBPUlRfRkxBR1MpIC1nZW4gJDwKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLnpvZwotCQkJJChDQU1FTEVPTl9aT0dHWSkgICQoQ0FNRUxFT05fWk9HR1lfRkxBR1MpIC1pbXBsICQ8ID4gJEAKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLmdsYWRlCi0JCQkkKE9DQU1MX0dMQURFQ0MpICAkKE9DQU1MX0dMQURFQ0NfRkxBR1MpICQ8ID4gJEAKLQotLlBSRUNJT1VTOgkJJS5tbCAlLm1saQotJS5tbCAlLm1saToJCSUub3hyaWRsCi0JCQkkKE9YUklETCkgJDwKLQotLlBSRUNJT1VTOgkJJS5tbCAlLm1saSAlX3N0dWJzLmMgJS5oCi0lLm1sICUubWxpICVfc3R1YnMuYyAlLmg6CQklLmlkbAotCQkJJChDQU1MSURMKSAkKE1BWUJFX0lETF9IRUFERVIpICQoSURMRkxBR1MpIFwKLQkJCQkkKENBTUxJRExGTEFHUykgJDwKLQkJCSQoUVVJRVQpaWYgWyAkKE5PSURMSEVBREVSKSBdOyB0aGVuIHRvdWNoICQqLmg7IGZpCi0KLS5jLiQoRVhUX09CSik6Ci0JCQkkKE9DQU1MQykgLWMgLWNjICIkKENDKSIgLWNjb3B0ICIkKENGTEFHUykgXAotCQkJCSQoQ1BQRkxBR1MpICQoQ1BQRkxBR1NfV0lOMzIpIFwKLQkJCQkkKENGTEFHU19XSU4zMikgJChDSU5DRkxBR1MpICQoQ0ZMQUdfTykkQCAiICQ8Ci0KLS5tLiQoRVhUX09CSik6Ci0JCQkkKENDKSAtYyAkKENGTEFHUykgJChDSU5DRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkJCQktSSckKE9DQU1MTElCUEFUSCknIFwKLQkJCQkkPCAkKENGTEFHX08pJEAKLQotLiQoRVhUX0NYWCkuJChFWFRfT0JKKToKLQkJCSQoQ1hYKSAtYyAkKENYWEZMQUdTKSAkKENJTkNGTEFHUykgJChDUFBGTEFHUykgXAotCQkJCS1JJyQoT0NBTUxMSUJQQVRIKScgXAotCQkJCSQ8ICQoQ0ZMQUdfTykkQAotCi0kKE1MREVQRElSKS8lLmQ6CSUubWwKLQkJCSQoUVVJRVQpaWYgWyAhIC1kICQoQEQpIF07IHRoZW4gbWtkaXIgLXAgJChARCk7IGZpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCSQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCSQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCS1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKE9DQU1MX0RFUF9QQUNLQUdFUykgXAotCQkJCS1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZmkKLQotJChCQ0RJRElSKS8lLmRpICQoTkNESURJUikvJS5kaToJJS5tbGkKLQkJCSQoUVVJRVQpaWYgWyAhIC1kICQoQEQpIF07IHRoZW4gbWtkaXIgLXAgJChARCk7IGZpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSAkKERJTkNGTEFHUykgJDwgXD4gJEA7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpIFwKLQkJCSAgICAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKERJTkNGTEFHUykgJDwgXD4gJEA7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgXAotCQkJICAgIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbDoKLQlta2RpciAtcCAkQAotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sL2luZGV4Lmh0bWw6ICQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwgJChET0NfRklMRVMpCi0Jcm0gLXJmICQ8LyoKLQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJChGSVJTVF9ET0NfRklMRSlgOyBcCi0JaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQllbHNlIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwICIkJHBwICQoUFBGTEFHUykiIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4OgotCW1rZGlyIC1wICRACi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXg6ICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICQoRE9DX0ZJTEVTKQotCXJtIC1yZiAkPC8qCi0JJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQoRklSU1RfRE9DX0ZJTEUpYDsgXAotCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpIFwKLQkgIAkkKERPQ19GSUxFUykgLW8gJEA7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgJChET0NfRklMRVMpIFwKLQkgIAktbyAkQDsgXAotCWVsc2UgXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgLW8gJEA7IFwKLQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwICIkJHBwICQoUFBGTEFHUykiIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgLW8gJEA7IFwKLQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucHM6ICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXgKLQljZCAkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleCAmJiBcCi0JICAkKExBVEVYKSBkb2MudGV4ICYmIFwKLQkgICQoTEFURVgpIGRvYy50ZXggJiYgXAotCSAgJChEVklQUykgJChEVklQU0ZMQUdTKSBkb2MuZHZpIC1vICQoQEYpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wZGY6ICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wcwotCWNkICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICYmICQoUFMyUERGKSAkKDxGKQotCi1kZWZpbmUgbWFrZV9zdWJwcm9qCi0uUEhPTlk6Ci1zdWJwcm9qXyQoMSk6Ci0JJCQoZXZhbCAkJChjYWxsIFBST0pfJCgxKSkpCi0JJChRVUlFVClpZiBbICIkKFNVQlRBUkdFVCkiICE9ICJhbGwiIF07IHRoZW4gXAotCSAgJChNQUtFKSAtZiAkKE9DQU1MTUFLRUZJTEUpICQoU1VCVEFSR0VUKTsgXAotCWZpCi1lbmRlZgotCi0kKGZvcmVhY2ggc3VicHJvaiwkKFNVQlBST0pTKSwkKGV2YWwgJChjYWxsIG1ha2Vfc3VicHJvaiwkKHN1YnByb2opKSkpCi0KLS5QSE9OWToKLXN1YnByb2pzOiAkKFNVQlBST0pTOiU9c3VicHJval8lKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgKFVOKUlOU1RBTEwgUlVMRVMgRk9SIExJQlJBUklFUwotCi0uUEhPTlk6IGxpYmluc3RhbGwKLWxpYmluc3RhbGw6CWFsbAotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxpbmcgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSBpbnN0YWxsICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpIE1FVEEgJChMSUJJTlNUQUxMX0ZJTEVTKQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IGxpYmluc3RhbGwtYnl0ZS1jb2RlCi1saWJpbnN0YWxsLWJ5dGUtY29kZToJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBieXRlLWNvZGUgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSBpbnN0YWxsICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpIE1FVEEgXAotCSAgJChmaWx0ZXItb3V0ICQoUkVTVUxUKS4kKEVYVF9MSUIpICQoUkVTVUxUKS5jbXhhLCAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IGxpYmluc3RhbGwtbmF0aXZlLWNvZGUKLWxpYmluc3RhbGwtbmF0aXZlLWNvZGU6CWFsbAotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxpbmcgbmF0aXZlLWNvZGUgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSBpbnN0YWxsICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpIE1FVEEgXAotCSAgJChmaWx0ZXItb3V0ICQoRExMU09OQU1FKSAkKFJFU1VMVCkuY21hLCAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IGxpYnVuaW5zdGFsbAotbGlidW5pbnN0YWxsOgotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGluZyBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIHJlbW92ZSAkKE9DQU1MRklORF9JTlNURkxBR1MpICQoUkVTVUxUKQotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogcmF3aW5zdGFsbAotcmF3aW5zdGFsbDoJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBsaWJyYXJ5IHRvOiAkKE9DQU1MX0xJQl9JTlNUQUxMKVxuIgotCS1pbnN0YWxsIC1kICQoT0NBTUxfTElCX0lOU1RBTEwpCi0JZm9yIGkgaW4gJChMSUJJTlNUQUxMX0ZJTEVTKTsgZG8gXAotCSAgaWYgWyAtZiAkJGkgXTsgdGhlbiBcCi0JICAgIGluc3RhbGwgLWMgLW0gMDY0NCAkJGkgJChPQ0FNTF9MSUJfSU5TVEFMTCk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IHJhd3VuaW5zdGFsbAotcmF3dW5pbnN0YWxsOgotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGluZyBsaWJyYXJ5IGZyb206ICQoT0NBTUxfTElCX0lOU1RBTEwpXG4iCi0JY2QgJChPQ0FNTF9MSUJfSU5TVEFMTCkgJiYgcm0gJChub3RkaXIgJChMSUJJTlNUQUxMX0ZJTEVTKSkKLQkkKFFVSUVUKXByaW50ZiAiXG5Vbmluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTUFJTlRFTkFOQ0UgUlVMRVMKLQotLlBIT05ZOgljbGVhbgotY2xlYW46OgotCXJtIC1mICQoVEFSR0VUUykgJChUUkFTSCkKLQlybSAtcmYgJChCQ0RJRElSKSAkKE5DRElESVIpICQoTUxERVBESVIpCi0KLS5QSE9OWToJY2xlYW51cAotY2xlYW51cDo6Ci0Jcm0gLWYgJChOT05FWEVDUykgJChUUkFTSCkKLQlybSAtcmYgJChCQ0RJRElSKSAkKE5DRElESVIpICQoTUxERVBESVIpCi0KLS5QSE9OWTogY2xlYW4tZG9jCi1jbGVhbi1kb2M6OgotCXJtIC1yZiAkKERPQ19ESVIpLyQoUkVTVUxUKQotCi0uUEhPTlk6IGNsZWFuLWFsbAotY2xlYW4tYWxsOjogY2xlYW4gY2xlYW4tZG9jCi0KLS5QSE9OWTogbm9iYWNrdXAKLW5vYmFja3VwOgotCXJtIC1mICouYmFrICp+ICouZHVwCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUgYi9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdjNjQuLjAwMDAwMDAKLS0tIGEvbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLU5PVEUgKGJyeWFuZHV4YnVyeSk6IE9DYW1sTWFrZWZpbGUgaXMgc2FmZSB0byBpbmNsdWRlIGluIHRoZSBwcm9qZWN0IGFmdGVyCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0xFR0FMLTU4LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uIG9mICJvY2FtbF9tYWtlIgotICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDA2ICBNYXJrdXMgTW90dGwgLSBmcmVlIHRvIGNvcHkgYW5kIG1vZGlmeSEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRSBBVCBZT1VSIE9XTiBSSVNLIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVJFUVVJU0lURVMKLQotICAgICAgICAgICAgICoqKiBZT1UgV0lMTCBORUVEIEdOVS1NQUtFIFZFUlNJT04gPjMuODAgKioqCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRzIG9mIHRoaXMgZGlzdHJpYnV0aW9uCi0KLUNoYW5nZXMgICAgICAgIC0gZ3Vlc3Mgd2hhdD8gOy0pCi0KLU9DYW1sTWFrZWZpbGUgIC0gTWFrZWZpbGUgZm9yIGVhc3kgaGFuZGxpbmcgb2YgY29tcGlsYXRpb24gb2Ygbm90IHNvIGVhc3kKLSAgICAgICAgICAgICAgICAgT0NhbWwtcHJvamVjdHMuICBJdCBnZW5lcmF0ZXMgZGVwZW5kZW5jaWVzIG9mIE9DYW1sLWZpbGVzCi0gICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHksIGlzIGFibGUgdG8gaGFuZGxlICJvY2FtbGxleCItLAotICAgICAgICAgICAgICAgICAib2NhbWx5YWNjIi0sIElETC0gYW5kIEMtZmlsZXMsIGtub3dzIGhvdyB0byBydW4KLSAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc29ycyBhbmQgZ2VuZXJhdGVzIG5hdGl2ZS0gb3IgYnl0ZS1jb2RlLCBhcwotICAgICAgICAgICAgICAgICBleGVjdXRhYmxlIG9yIGFzIGxpYnJhcnkgLSB3aXRoIHRocmVhZC1zdXBwb3J0IGlmIHlvdQotICAgICAgICAgICAgICAgICB3YW50ISBQcm9maWxpbmcgYW5kIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSBhZGRlZCBvbgotICAgICAgICAgICAgICAgICB0aGUgZmx5ISAgVGhlcmUgaXMgYWxzbyBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGxpYnJhcmllcy4KLSAgICAgICAgICAgICAgICAgQWgsIHllcywgYW5kIHlvdSBjYW4gYWxzbyBjcmVhdGUgdG9wbGV2ZWxzIGZyb20gYW55Ci0gICAgICAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMgYWxsb3dzIHlvdSBpbW1lZGlhdGUgaW50ZXJhY3RpdmUgdGVzdGluZy4KLSAgICAgICAgICAgICAgICAgQXV0b21hdGljIGdlbmVyYXRpb24gb2YgZG9jdW1lbnRhdGlvbiBpcyBlYXN5IGR1ZSB0bwotICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbiBvZiBzdXBwb3J0IGZvciBPQ2FtbGRvYy4KLQotUkVBRE1FICAgICAgICAgLSB0aGlzIGZpbGUKLQotY2FsYy8gICAgICAgICAgLSBEaXJlY3RvcnkgY29udGFpbmluZyBhIHF1aXRlIGZ1bGx5LWZlYXR1cmVkIGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgb2Ygd2hhdCAiT0NhbWxNYWtlZmlsZSIgY2FuIGRvIGZvciB5b3UuIFRoaXMgZXhhbXBsZQotICAgICAgICAgICAgICAgICBtYWtlcyB1c2Ugb2YgIm9jYW1sbGV4IiwgIm9jYW1seWFjYyIsIElETCArIEMgYW5kCi0gICAgICAgICAgICAgICAgIHRocmVhZHMuCi0KLWNhbWxwNC8gICAgICAgIC0gVGhpcyBzaW1wbGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgcHJlcHJvY2VzcyBmaWxlcyB3aXRoIHRoZSBjYW1scDQtcHJlcHJvY2Vzc29yLgotCi1ndGsvICAgICAgICAgICAtIERlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBPQ2FtbE1ha2VmaWxlIHdpdGggR1RLCi0gICAgICAgICAgICAgICAgIGFuZCB0aHJlYWRzLiBDb3VydGVzeSBvZiBUaW0gRnJlZW1hbiA8dGltQGZ1bmdpYmxlLmNvbT4uCi0KLWlkbC8gICAgICAgICAgIC0gQ29udGFpbnMgYSB2ZXJ5IHNtYWxsIGV4YW1wbGUgb2YgaG93IHRvIHVzZQotICAgICAgICAgICAgICAgICAiY2FtbGlkbCIgdG9nZXRoZXIgd2l0aCAiT0NhbWxNYWtlZmlsZSIuIEFsc28gaW50ZW5kZWQKLSAgICAgICAgICAgICAgICAgdG8gc2hvdywgaG93IGVhc3kgaXQgaXMgdG8gaW50ZXJmYWNlIE9DYW1sIGFuZCBDLgotCi10aHJlYWRzLyAgICAgICAtIFR3byBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRocmVhZHMgKG9yaWdpbmFsbHkKLSAgICAgICAgICAgICAgICAgcG9zdGVkIGJ5IFhhdmllciBMZXJveSBzb21lIHRpbWUgYWdvKS4gU2hvd3MgdGhlIHVzZSBvZgotICAgICAgICAgICAgICAgICAiT0NhbWxNYWtlZmlsZSIgaW4gYW4gZW52aXJvbm1lbnQgb2YgbXVsdGlwbGUgY29tcGlsYXRpb24KLSAgICAgICAgICAgICAgICAgdGFyZ2V0cy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICBXaHkgc2hvdWxkIHlvdSB1c2UgaXQ/Ci0KLUZvciBzZXZlcmFsIHJlYXNvbnM6Ci0KLSAgKiBJdCBpcyB3ZWxsLXRlc3RlZCAoSSB1c2UgaXQgaW4gYWxsIG9mIG15IHByb2plY3RzKS4KLQotICAqIEluIGNvbnRyYXN0IHRvIG1vc3Qgb3RoZXIgYXBwcm9hY2hlcyBpdCBnZW5lcmF0ZXMgZGVwZW5kZW5jaWVzCi0gICAgY29ycmVjdGx5IGJ5IGVuc3VyaW5nIHRoYXQgYWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIE9DYW1sLWZpbGVzCi0gICAgZXhpc3QgYmVmb3JlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24uICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0bwotICAgIGd1YXJhbnRlZSB0aGF0ICJvY2FtbGRlcCIgd29ya3MgY29ycmVjdGx5LgotCi0gICogSXQgaXMgZXh0cmVtZWx5IGNvbnZlbmllbnQgKGF0IGxlYXN0IEkgdGhpbmsgc28gOy0pLgotICAgIEV2ZW4gcXVpdGUgY29tcGxleCBjb21waWxhdGlvbiBwcm9jZXNzZXMgKHNlZSBleGFtcGxlICJjYWxjLm1sIikKLSAgICBuZWVkIHZlcnkgbGl0dGxlIGluZm9ybWF0aW9uIHRvIHdvcmsgY29ycmVjdGx5IC0gYWN0dWFsbHkganVzdCBhYm91dAotICAgIHRoZSBtaW5pbXVtIChmaWxlIG5hbWVzIG9mIHNvdXJjZXMpLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgV2hlbiB5b3Ugc2hvdWxkbid0IHVzZSBpdC4uLgotCi1JbiBwcm9qZWN0cyB3aGVyZSBldmVyeSBjb21waWxhdGlvbiB1bml0IG5lZWRzIGRpZmZlcmVudCBmbGFncyAtIGJ1dAotaW4gc3VjaCBjb21wbGljYXRlZCBjYXNlcyB5b3Ugd2lsbCBiZSBvbiB5b3VyIG93biBhbnl3YXkuIEx1Y2tpbHksCi10aGlzIGRvZXNuJ3QgaGFwcGVuIHRvbyBmcmVxdWVudGx5Li4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgSG93IHRvIHVzZSAiT0NhbWxNYWtlZmlsZSIgaW4geW91ciBvd24gcHJvamVjdAotICAgICAgICAgKFRha2UgYSBsb29rIGF0IHRoZSBleGFtcGxlcyBmb3IgYSBxdWljayBpbnRyb2R1Y3Rpb24hKQotCi1DcmVhdGUgeW91ciBwcm9qZWN0LXNwZWNpZmljICJNYWtlZmlsZSIgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeS4KLQotTm93IHRoZXJlIGFyZSB0d28gd2F5cyBvZiBtYWtpbmcgdXNlIG9mICJPQ2FtbE1ha2VmaWxlIjoKLQotICAxKSBIYXZlIGEgbG9vayBhdCB0aGUgZGVmYXVsdCBzZXR0aW5ncyBpbiAiT0NhbWxNYWtlZmlsZSIgYW5kIHNldAotICAgICB0aGVtIHRvIHRoZSB2YWx1ZXMgdGhhdCBhcmUgdmFpbGQgb24geW91ciBzeXN0ZW0gLSB3aGV0aGVyIHRoZQotICAgICBwYXRoIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJpZXMgaXMgb2ssIHdoYXQgZXhlY3V0YWJsZXMgc2hhbGwgYmUKLSAgICAgdXNlZCwgZXRjLi4uCi0KLSAgMikgQ29weSBpdCBpbnRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgdG8gYmUgY29tcGlsZWQuCi0gICAgIEFkZCAiLWluY2x1ZGUgT0NhbWxNYWtlZmlsZSIgYXMgYSBsYXN0IGxpbmUgb2YgeW91ciAiTWFrZWZpbGUiLgotCi0gIDMpIFB1dCBpdCBzb21ld2hlcmUgZWxzZSBvbiB0aGUgc3lzdGVtLiBJbiB0aGlzIGNhc2UgeW91IHdpbGwgaGF2ZSB0bwotICAgICBzZXQgYSB2YXJpYWJsZSAiT0NBTUxNQUtFRklMRSIgaW4geW91ciBwcm9qZWN0LXNwZWNpZmljICJNYWtlZmlsZSIuCi0gICAgIFRoaXMgaXMgdGhlIHdheSBpbiB3aGljaCB0aGUgZXhhbXBsZXMgYXJlIHdyaXR0ZW46IHNvIHlvdSBuZWVkCi0gICAgIG9ubHkgb25lIHZlcnNpb24gb2YgIk9DYW1sTWFrZWZpbGUiIHRvIG1hbmFnZSBhbGwgeW91ciBwcm9qZWN0cyEKLSAgICAgU2VlIHRoZSBleGFtcGxlcyBmb3IgZGV0YWlscy4KLQotWW91IHNob3VsZCB1c3VhbGx5IHNwZWNpZnkgdHdvIGZ1cnRoZXIgdmFyaWFibGVzIGZvciB5b3VyIHByb2plY3Q6Ci0KLSAgKiBTT1VSQ0VTICAoZGVmYXVsdDogZm9vLm1sKQotICAqIFJFU1VMVCAgIChkZWZhdWx0OiBmb28pCi0KLVB1dCBhbGwgdGhlIHNvdXJjZXMgbmVjZXNzYXJ5IGZvciBhIHRhcmdldCBpbnRvIHZhcmlhYmxlICJTT1VSQ0VTIi4KLVRoZW4gc2V0ICJSRVNVTFQiIHRvIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuIElmIHlvdSB3YW50IHRvIGdlbmVyYXRlCi1saWJyYXJpZXMsIHlvdSBzaG91bGQgKm5vdCogc3BlY2lmeSB0aGUgc3VmZml4ICgiLmNtYSIsICIuY214YSIsICIuYSIpCi0tIGl0IHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGJ1aWxkCi1hIGxpYnJhcnkuCi0KLSAgICAgICoqICAgICAgRG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgIi5tbGkiLWZpbGVzLCB0b28hICAgICAgICAqKgotICAgICAgKiogIERvbid0IGZvcmdldCB0aGF0IG9yZGVyIG9mIHRoZSBzb3VyY2UgZmlsZXMgbWF0dGVycyEgICoqCi0KLVRoZSBvcmRlciBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXQgbWF0dGVycyBkdXJpbmcgbGlua2luZyBhbnl3YXkKLWR1ZSB0byBwb3RlbnRpYWwgc2lkZSBlZmZlY3RzIGNhdXNlZCBhdCBwcm9ncmFtIHN0YXJ0dXAuIFRoaXMgaXMKLXdoeSBPQ2FtbE1ha2VmaWxlIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFydGlhbGx5IG9yZGVyIGRlcGVuZGVuY2llcyBieQotaXRzZWxmLCB3aGljaCBtaWdodCBjb25mdXNlIHVzZXJzIGV2ZW4gbW9yZS4gSXQganVzdCBjb21waWxlcyBhbmQgbGlua3MKLU9DYW1sLXNvdXJjZXMgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgdXNlciwgZXZlbiBpZiBpdCBjb3VsZAotZGV0ZXJtaW5lIGF1dG9tYXRpY2FsbHkgdGhhdCB0aGUgb3JkZXIgY2Fubm90IGJlIGNvcnJlY3QuCi0KLVRoZSBtaW5pbXVtIG9mIHlvdXIgIk1ha2VmaWxlIiBsb29rcyBsaWtlIHRoaXMgKGFzc3VtaW5nIHRoYXQKLSJPQ2FtbE1ha2VmaWxlIiBpcyBpbiB0aGUgc2VhcmNoIHBhdGggb2YgIm1ha2UiKToKLQotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLVRoaXMgd2lsbCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBjb21waWxlIGEgZmlsZSAiZm9vLm1sIiB0byBhIGJpbmFyeQotImZvbyIuCi0KLU90aGVyd2lzZSwgeW91ciBNYWtlZmlsZSB3aWxsIHByb2JhYmx5IGNvbnRhaW4gc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICBTT1VSQ0VTID0gZm9vLm1sCi0gIFJFU1VMVCAgPSBmb28KLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1CZSBjYXJlZnVsIHdpdGggdGhlIG5hbWVzIHlvdSBwdXQgaW50byB0aGVzZSB2YXJpYWJsZXM6IGlmIHRoZXkgYXJlIHdyb25nLAotYSAibWFrZSBjbGVhbiIgbWlnaHQgZXJhc2UgdGhlIHdyb25nIGZpbGVzIC0gYnV0IEkga25vdyB5b3Ugd2lsbCBub3QgZG8KLXRoYXQgOy0pCi0KLUEgc2ltcGxlICJtYWtlIiB3aWxsIGdlbmVyYXRlIGEgYnl0ZS1jb2RlIGV4ZWN1dGFibGUuIElmIHlvdSB3YW50IHRvCi1jaGFuZ2UgdGhpcywgeW91IG1heSBhZGQgYW4gImFsbCItcnVsZSB0aGF0IGdlbmVyYXRlcyBzb21ldGhpbmcgZWxzZS4KLQotRS5nLjoKLQotICBTT1VSQ0VTID0gZm9vLm1sCi0gIFJFU1VMVCAgPSBmb28KLSAgYWxsOiBuYXRpdmUtY29kZS1saWJyYXJ5Ci0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGJ1aWxkIGEgbmF0aXZlLWNvZGUgbGlicmFyeSAiZm9vLmNteGEiICgrICJmb28uYSIpIGZyb20gZmlsZQotImZvby5tbCIuCi0KLVlvdSBtYXkgZXZlbiBidWlsZCBzZXZlcmFsIHRhcmdldHMgYXQgb25jZS4gVG8gcHJvZHVjZSBieXRlLSBhbmQgbmF0aXZlLWNvZGUKLWV4ZWN1dGFibGVzIHdpdGggb25lICJtYWtlIiwgYWRkIHRoZSBmb2xsb3dpbmcgcnVsZToKLQotICAgIGFsbDogYnl0ZS1jb2RlIG5hdGl2ZS1jb2RlCi0KLVlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCBmb3IgZWFjaCBvZiB0aGVzZSB0YXJnZXRzCi1zbyB0aGF0IHRoZSByZXN1bHQgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gKHNlZSBvcHRpb25hbCB2YXJpYWJsZXMgYmVsb3cKLWZvciBkZXRhaWxzKS4KLQotWW91IG1heSBhbHNvIHRlbGwgIm1ha2UiIGF0IHRoZSBjb21tYW5kLWxpbmUgd2hhdCBraW5kIG9mIHRhcmdldCB0bwotcHJvZHVjZSAoZS5nLiAibWFrZSBuYyIpLiAgSGVyZSBhbGwgdGhlIHBvc3NpYmlsaXRpZXMgd2l0aCBzaG9ydGN1dHMKLWJldHdlZW4gcGFyZW50aGVzaXM6Ci0KLSAgICogYnl0ZS1jb2RlICAgICAgICAgICAgICAgICAgICAgKGJjKQotICAgKiBieXRlLWNvZGUtbm9saW5rICAgICAgICAgICAgICAoYmNubCkgICAtIG5vIGxpbmtpbmcgc3RhZ2UKLSAgICogYnl0ZS1jb2RlLWxpYnJhcnkgICAgICAgICAgICAgKGJjbCkKLSAgICogbmF0aXZlLWNvZGUgICAgICAgICAgICAgICAgICAgKG5jKQotICAgKiBuYXRpdmUtY29kZS1ub2xpbmsgICAgICAgICAgICAobmNubCkgICAtIG5vIGxpbmtpbmcgc3RhZ2UKLSAgICogbmF0aXZlLWNvZGUtbGlicmFyeSAgICAgICAgICAgKG5jbCkKLSAgICogZGVidWctY29kZSAgICAgICAgICAgICAgICAgICAgKGRjKQotICAgKiBkZWJ1Zy1jb2RlLW5vbGluayAgICAgICAgICAgICAoZGNubCkgICAtIG5vIGxpbmtpbmcgc3RhZ2UKLSAgICogZGVidWctY29kZS1saWJyYXJ5ICAgICAgICAgICAgKGRjbCkKLSAgICogcHJvZmlsaW5nLWJ5dGUtY29kZSAgICAgICAgICAgKHBiYykKLSAgICogcHJvZmlsaW5nLWJ5dGUtY29kZS1saWJyYXJ5ICAgKHBiY2wpCi0gICAqIHByb2ZpbGluZy1uYXRpdmUtY29kZSAgICAgICAgIChwbmMpCi0gICAqIHByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5IChwbmNsKQotICAgKiBieXRlLWNvZGUtZGxsICAgICAgICAgICAgICAgICAoYmNkKQotICAgKiBuYXRpdmUtY29kZS1kbGwgICAgICAgICAgICAgICAobmNkKQotICAgKiBwYWNrLWJ5dGUtY29kZSAgICAgICAgICAgICAgICAocGFiYykKLSAgICogcGFjay1uYXRpdmUtY29kZSAgICAgICAgICAgICAgKHBhbmMpCi0gICAqIHRvcGxldmVsIGludGVycHJldGVyICAgICAgICAgICh0b3ApCi0gICAqIHN1YnByb2pzCi0KLUhlcmUgYSBzaG9ydCBub3RlIGNvbmNlcm5pbmcgYnVpbGRpbmcgYW5kIGxpbmtpbmcgYnl0ZSBjb2RlIGxpYnJhcmllcwotd2l0aCBDLWZpbGVzOgotCi0gIE9DYW1sIGxpbmtzIEMtb2JqZWN0IGZpbGVzIG9ubHkgd2hlbiB0aGV5IGFyZSB1c2VkIGluIGFuIGV4ZWN1dGFibGUuCi0gIEFmdGVyIGNvbXBpbGF0aW9uIHRoZXkgc2hvdWxkIGJlIHBsYWNlZCBpbiBzb21lIGRpcmVjdG9yeSB0aGF0IGlzIGluCi0gIHlvdXIgaW5jbHVkZSBwYXRoIGlmIHlvdSBsaW5rIHlvdXIgbGlicmFyeSBhZ2FpbnN0IGFuIGV4ZWN1dGFibGUuCi0KLSAgSXQgaXMgc29tZXRpbWVzIG1vcmUgY29udmVuaWVudCB0byBsaW5rIGFsbCBDLW9iamVjdCBmaWxlcyBpbnRvIGEKLSAgc2luZ2xlIEMtbGlicmFyeS4gVGhlbiB5b3UgaGF2ZSB0byBvdmVycmlkZSB0aGUgYXV0b21hdGljIGxpbmsgZmxhZ3MKLSAgb2YgeW91ciBsaWJyYXJ5IHVzaW5nICItbm9hdXRvbGluayIgYW5kIGFkZCBhbm90aGVyIGxpbmtmbGFnIHRoYXQKLSAgbGlua3MgaW4geW91ciBDLWxpYnJhcnkgZXhwbGljaXRseS4KLQotV2hhdCBjb25jZXJucyBtYWludGFpbmFuY2U6Ci0KLSAgIm1ha2UgY2xlYW4iIHJlbW92ZXMgYWxsIChhbGwhKSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcyAtIHNvCi0gIGFnYWluOiBtYWtlIHN1cmUgeW91ciB2YXJpYWJsZXMgYXJlIG9rIQotCi0gICJtYWtlIGNsZWFudXAiIGlzIHNpbWlsYXIgdG8gIm1ha2UgY2xlYW4iIGJ1dCBsZWF2ZXMgZXhlY3V0YWJsZXMuCi0KLUFub3RoZXIgd2F5IHRvIGRlc3Ryb3kgc29tZSBpbXBvcnRhbnQgZmlsZXMgaXMgYnkgaGF2aW5nICJPQ2FtbE1ha2VmaWxlIgotYXV0b21hdGljYWxseSBnZW5lcmF0ZSBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlYWQgdGhlIGRvY3VtZW50YXRpb24KLWFib3V0IHRoZSB0b29scyBpbiB0aGUgT0NhbWwtZGlzdHJpYnV0aW9uIHRvIHNlZSB3aGF0IGtpbmQgb2YgZmlsZXMgYXJlCi1nZW5lcmF0ZWQuICJPQ2FtbE1ha2VmaWxlIiBhZGRpdGlvbmFsbHkgZ2VuZXJhdGVzICgnJScgaXMgYmFzZW5hbWUgb2YKLXNvdXJjZSBmaWxlKToKLQotICAlX2lkbC5jICAtICJjYW1saWRsIiBnZW5lcmF0ZXMgYSBmaWxlICIlLmMiIGZyb20gIiUuaWRsIiwgYnV0IHRoaXMgaXMKLSAgICAgICAgICAgICBub3Qgc3VjaCBhIGdvb2QgaWRlYSwgYmVjYXVzZSB3aGVuIGdlbmVyYXRpbmcgbmF0aXZlLWNvZGUsCi0gICAgICAgICAgICAgYm90aCB0aGUgZmlsZSAiJS5jIiBhbmQgIiUubWwiIHdvdWxkIGdlbmVyYXRlIGZpbGVzICIlLm8iCi0gICAgICAgICAgICAgd2hpY2ggd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuIFRodXMsICJPQ2FtbE1ha2VmaWxlIgotICAgICAgICAgICAgIHJlbmFtZXMgIiUuYyIgdG8gIiVfaWRsLmMiIHRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbS4KLQotVGhlIGRlcGVuZGVuY2llcyBhcmUgc3RvcmVkIGluIHRocmVlIGRpZmZlcmVudCBzdWJkaXJlY3RvcmllcyAoZG90IGRpcnMpOgotCi0gIC5fZCAgICAtIGNvbnRhaW5zIGRlcGVuZGVuY2llcyBmb3IgLm1sLWZpbGVzCi0gIC5fYmNkaSAtIGNvbnRhaW5zIGJ5dGUgY29kZSBkZXBlbmRlbmNpZXMgZm9yIC5tbGktZmlsZXMKLSAgLl9uY2RpIC0gY29udGFpbnMgbmF0aXZlIGNvZGUgZGVwZW5kZW5jaWVzIGZvciAubWxpLWZpbGVzCi0KLVRoZSBlbmRpbmdzIG9mIHRoZSBkZXBlbmRlbmN5IGZpbGVzIGFyZTogIiUuZCIgZm9yIHRob3NlIGdlbmVyYXRlZCBmcm9tCi0iJS5tbCItZmlsZXMsICIlLmRpIiBmb3Igb25lcyBkZXJpdmVkIGZyb20gIiUubWxpIi1maWxlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2luZwotCi0gIFRoaXMgaXMgZWFzeTogaWYgeW91IGRpc2NvdmVyIGEgYnVnLCBqdXN0IGRvIGEgIm1ha2UgY2xlYW47IG1ha2UgZGMiCi0gIHRvIHJlY29tcGlsZSB5b3VyIHByb2plY3Qgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoZW4geW91IGNhbgotICBpbW1lZGlhdGVseSBhcHBseSAib2NhbWxkZWJ1ZyIgdG8gdGhlIGV4ZWN1dGFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxpbmcKLQotICBGb3IgZ2VuZXJhdGluZyBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGggIm9jYW1scHJvZiIgKGJ5dGUgY29kZSkKLSAgb3IgImdwcm9mIiAobmF0aXZlIGNvZGUpLCBjb21waWxlIHlvdXIgcHJvamVjdCB3aXRoIG9uZSBvZiB0aGUgcHJvZmlsaW5nCi0gIHRhcmdldHMgKHNlZSB0YXJnZXRzIGFib3ZlKS4gRS5nLjoKLQotICAgICogIm1ha2UgcGJjIiB3aWxsIGJ1aWxkIGJ5dGUgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoCi0gICAgICAib2NhbWxwcm9mIi4KLQotICAgICogIm1ha2UgcG5jIiB3aWxsIGJ1aWxkIG5hdGl2ZSBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGgKLSAgICAgICJncHJvZiIuCi0KLSAgUGxlYXNlIG5vdGUgdGhhdCBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHRvIHByb2ZpbGUgYnl0ZSBjb2RlIHdpdGgKLSAgdGhyZWFkcy4gT0NhbWxNYWtlZmlsZSB3aWxsIGZvcmNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gZG8gdGhpcy4KLQotICBBIHNob3J0IGhpbnQgZm9yIERFQyBBbHBoYS11c2VycyAodW5kZXIgRGlnaXRhbCBVbml4KTogeW91IG1heSBhbHNvCi0gIGNvbXBpbGUgeW91ciBzb3VyY2VzIHRvIG5hdGl2ZSBjb2RlIHdpdGhvdXQgYW55IGZ1cnRoZXIgcHJvZmlsaW5nCi0gIG9wdGlvbnMvdGFyZ2V0cy4gVGhlbiBjYWxsICJwaXhpZSBteV9leGVjIiwgIm15X2V4ZWMiIGJlaW5nIHlvdXIKLSAgZXhlY3V0YWJsZS4gVGhpcyB3aWxsIHByb2R1Y2UgKGFtb25nIG90aGVyIGZpbGVzKSBhbiBleGVjdXRhYmxlCi0gICJteV9leGVjLnBpeGllIi4gQ2FsbCBpdCBhbmQgaXQgd2lsbCBwcm9kdWNlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3aGljaAotICBjYW4gYmUgYW5hbHlzZWQgdXNpbmcgInByb2YgLXBpeGllIG15X2V4ZWMiLiBUaGUgcmVzdWx0aW5nIGluZm9ybWF0aW9uCi0gIGlzIGV4dHJlbWVseSBkZXRhaWxlZCBhbmQgYWxsb3dzIGFuYWx5c2lzIHVwIHRvIHRoZSBjbG9jayBjeWNsZSBsZXZlbC4uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBQcmVwcm9jZXNzb3JzCi0KLSAgQmVjYXVzZSBvbmUgY291bGQgZW1wbG95IGFueSBraW5kIG9mIHByb2dyYW0gdGhhdCByZWFkcyBmcm9tIHN0YW5kYXJkCi0gIGlucHV0IGFuZCBwcmludHMgdG8gc3RhbmRhcmQgb3V0cHV0IGFzIHByZXByb2Nlc3NvciwgdGhlcmUgY2Fubm90IGJlIGFueQotICBkZWZhdWx0IHdheSB0byBoYW5kbGUgYWxsIG9mIHRoZW0gY29ycmVjdGx5IHdpdGhvdXQgZnVydGhlciBrbm93bGVkZ2UuCi0KLSAgVGhlcmVmb3JlIHlvdSBoYXZlIHRvIGNvb3BlcmF0ZSBhIGJpdCB3aXRoIE9DYW1sTWFrZWZpbGUgdG8gbGV0Ci0gIHByZXByb2Nlc3NpbmcgaGFwcGVuIGF1dG9tYXRpY2FsbHkuIEJhc2ljYWxseSwgdGhpcyBvbmx5IHJlcXVpcmVzCi0gIHRoYXQgeW91IHB1dCBhIGNvbW1lbnQgaW50byB0aGUgZmlyc3QgbGluZSBvZiBmaWxlcyB0aGF0IHNob3VsZCBiZQotICBwcmVwcm9jZXNzZWQsIGUuZy46Ci0KLSAgICAoKnBwIGNhdCAqKQotICAgIC4uLiByZXN0IG9mIHByb2dyYW0gLi4uCi0KLSAgT0NhbWxNYWtlZmlsZSBsb29rcyBhdCB0aGUgZmlyc3QgbGluZSBvZiB5b3VyIGZpbGVzLCBhbmQgaWYgaXQgZmluZHMKLSAgYSBjb21tZW50IHRoYXQgc3RhcnRzIHdpdGggIigqcHAiLCB0aGVuIGl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlCi0gIHJlc3Qgb2YgdGhlIGNvbW1lbnQgdGVsbHMgaXQgaG93IHRvIGNvcnJlY3RseSBjYWxsIHRoZSBhcHByb3ByaWF0ZQotICBwcmVwcm9jZXNzb3IuIEluIHRoaXMgY2FzZSB0aGUgcHJvZ3JhbSAiY2F0IiB3aWxsIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCwKLSAgb2YgY291cnNlLCBqdXN0IG91dHB1dCB0aGUgc291cmNlIHRleHQgYWdhaW4gd2l0aG91dCBjaGFuZ2luZyBpdC4KLQotICBJZiB5b3UgYXJlLCBmb3IgZXhhbXBsZSwgYW4gYWR2b2NhdGUgb2YgdGhlIG5ldyAicmV2aXNlZCBzeW50YXgiLAotICB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNhbWxwNCBwcmVwcm9jZXNzb3IsIHlvdSBjb3VsZCBzaW1wbHkgd3JpdGU6Ci0KLSAgICAoKnBwIGNhbWxwNHIgKikKLSAgICAuLi4gcmVzdCBvZiBwcm9ncmFtIGluIHJldmlzZWQgc3ludGF4IC4uLgotCi0gIFNpbXBsZSwgaXNuJ3QgaXQ/Ci0KLSAgSWYgeW91IHdhbnQgdG8gd3JpdGUgeW91ciBvd24gc3ludGF4IGV4dGVuc2lvbnMsIGp1c3QgdGFrZSBhIGxvb2sgYXQgdGhlCi0gIGV4YW1wbGUgaW4gdGhlIGRpcmVjdG9yeSAiY2FtbHA0IjogaXQgaW1wbGVtZW50cyB0aGUgInJlcGVhdCAuLi4gdW50aWwiCi0gIGV4dGVuc2lvbiBhcyBkZXNjcmliZWQgaW4gdGhlIGNhbWxwNC10dXRvcmlhbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgIExpYnJhcnkgKFVuLSlJbnN0YWxsYXRpb24gU3VwcG9ydAotCi0gIE9DYW1sTWFrZWZpbGUgY29udGFpbnMgdHdvIHRhcmdldHMgdXNpbmcgIm9jYW1sZmluZCIgZm9yIHRoaXMgcHVycG9zZToKLQotICAgICogbGliaW5zdGFsbAotICAgICogbGlidW5pbnN0YWxsCi0KLSAgVGhlc2UgdHdvIHRhcmdldHMgcmVxdWlyZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB2YXJpYWJsZQotICAiTElCSU5TVEFMTF9GSUxFUyIsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gYWxsIHRoZSBmaWxlcyB0aGF0IHlvdQotICB3YW50IHRvIGluc3RhbGwgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5ICh1c3VhbGx5ICUubWxpLCAlLmNtaSwgJS5jbWEsCi0gICUuY214YSwgJS5hIGFuZCBwb3NzaWJseSBmdXJ0aGVyIEMtbGlicmFyaWVzKS4gVGhlIHRhcmdldCAibGliaW5zdGFsbCIKLSAgaGFzIHRoZSBkZXBlbmRlbmN5ICJhbGwiIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9mIHRoZSBsaWJyYXJ5IHNvIG1ha2UKLSAgc3VyZSB5b3UgZGVmaW5lIHRhcmdldCAiYWxsIiBpbiB5b3VyIE1ha2VmaWxlIGFwcHJvcHJpYXRlbHkuCi0KLSAgVGhlIHRhcmdldHMgaW5mb3JtIHRoZSB1c2VyIGFib3V0IHRoZSBjb25maWd1cmVkIGluc3RhbGwgcGF0aCBhbmQgYXNrCi0gIGZvciBjb25maXJtYXRpb24gdG8gKHVuKWluc3RhbGwgdGhlcmUuIElmIHlvdSB3YW50IHRvIHVzZSB0aGVtLCBpdAotICBpcyBvZnRlbiBhIGdvb2QgaWRlYSB0byBqdXN0IGFsaWFzIHRoZW0gaW4geW91ciBNYWtlZmlsZSB0byAiaW5zdGFsbCIKLSAgYW5kICJ1bmluc3RhbGwiIHJlc3BlY3RpdmVseS4KLQotICBUd28gb3RoZXIgdGFyZ2V0cyBhbGxvdyBpbnN0YWxsYXRpb24gb2YgZmlsZXMgaW50byBhIHBhcnRpY3VsYXIKLSAgZGlyZWN0b3J5ICh3aXRob3V0IHVzaW5nIG9jYW1sZmluZCk6Ci0KLSAgICAqIHJhd2luc3RhbGwKLSAgICAqIHJhd3VuaW5zdGFsbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHRvcGxldmVscwotCi0gIFRoZXJlIGlzIGp1c3Qgb25lIHRhcmdldCBmb3IgdGhpczoKLQotICAgICogdG9wCi0KLSAgVGhlIGdlbmVyYXRlZCBmaWxlIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucyAtCi0gIGV2ZW4gd2l0aCBzY2FubmVycywgcGFyc2VycywgQy1maWxlcywgZXRjLiEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24KLQotICBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1cHBvcnRlZDoKLQotICAgKiBodGRvYyAgICAgIC0gZ2VuZXJhdGVzIEhUTUwtZG9jdW1lbnRhdGlvbgotICAgKiBsYWRvYyAgICAgIC0gZ2VuZXJhdGVzIExhdGV4LWRvY3VtZW50YXRpb24KLSAgICogcHNkb2MgICAgICAtIGdlbmVyYXRlcyBQb3N0U2NyaXB0LWRvY3VtZW50YXRpb24KLSAgICogcGRmZG9jICAgICAtIGdlbmVyYXRlcyBQREYtZG9jdW1lbnRhdGlvbgotICAgKiBkb2MgICAgICAgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotICAgKiBjbGVhbi1kb2MgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotCi0gIEFsbCBvZiB0aGVtIGdlbmVyYXRlIGEgc3ViLWRpcmVjdG9yeSAiZG9jIi4gTW9yZSBwcmVjaXNlbHksIGZvciBIVE1MIGl0Ci0gIGlzICJkb2MvJChSRVNVTFQpL2h0bWwiIGFuZCBmb3IgTGF0ZXgsIFBvc3RTY3JpcHQgYW5kIFBERiB0aGUgZGlyZWN0b3J5Ci0gICJkb2MvJChSRVNVTFQpL2xhdGV4Ii4gU2VlIHRoZSBPQ2FtbGRvYy1tYW51YWwgZm9yIGRldGFpbHMgYW5kIHRoZQotICBvcHRpb25hbCB2YXJpYWJsZXMgYmVsb3cgZm9yIHNldHRpbmdzIHlvdSBjYW4gY29udHJvbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIHN1YnByb2plY3RzCi0KLSAgWW91IGNhbiBoYXZlIHNldmVyYWwgdGFyZ2V0cyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIG1hbmFnZSB0aGVtCi0gIGZyb20gd2l0aGluIGFuIHNpbmdsZSBNYWtlZmlsZS4KLQotICBHaXZlIGVhY2ggc3VicHJvamVjdCBhIG5hbWUsIGUuZy4gInAxIiwgInAyIiwgZXRjLiBUaGVuIHlvdSBleHBvcnQKLSAgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gZWFjaCBwcm9qZWN0IGJ5IHVzaW5nIHZhcmlhYmxlcyBvZiB0aGUgZm9ybQotICAiUFJPSl9wMSIsICJQUk9KX3AyIiwgZXRjLiAgRS5nLjoKLQotICAgIGRlZmluZSBQUk9KX3AxCi0gICAgICBTT1VSQ0VTPSJmb28ubWwgbWFpbi5tbCIKLSAgICAgIFJFU1VMVD0icDEiCi0gICAgICBPQ0FNTEZMQUdTPSItdW5zYWZlIgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDEKLQotICAgIGRlZmluZSBQUk9KX3AyCi0gICAgICAuLi4KLSAgICBlbmRlZgotICAgIGV4cG9ydCBQUk9KX3AyCi0KLSAgWW91IG1heSBhbHNvIGV4cG9ydCBjb21tb24gc2V0dGluZ3MgdXNlZCBieSBhbGwgcHJvamVjdHMgZGlyZWN0bHksIGUuZy4KLSAgImV4cG9ydCBUSFJFQURTID0geSIuCi0KLSAgTm93IGl0IGlzIGEgZ29vZCBpZGVhIHRvIGRlZmluZSwgd2hpY2ggcHJvamVjdHMgc2hvdWxkIGJlIGFmZmVjdGVkIGJ5Ci0gIGNvbW1hbmRzIGJ5IGRlZmF1bHQuICBFLmcuOgotCi0gICAgaWZuZGVmIFNVQlBST0pTCi0gICAgICBleHBvcnQgU1VCUFJPSlMgPSBwMSBwMgotICAgIGVuZGlmCi0KLSAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBnaXZlbiB0YXJnZXQgZm9yIGFsbCB0aG9zZQotICBzdWJwcm9qZWN0cyBpZiB0aGlzIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBkZWZpbmVkIGluIHRoZSBzaGVsbAotICBlbnZpcm9ubWVudCBvciBpbiB0aGUgY29tbWFuZCBsaW5lIG9mIHRoZSBtYWtlLWludm9jYXRpb24gYnkgdGhlIHVzZXIuCi0gIEUuZy4sICJtYWtlIGRjIiB3aWxsIGdlbmVyYXRlIGRlYnVnIGNvZGUgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBUaGVuIHlvdSBuZWVkIHRvIGRlZmluZSBhIGRlZmF1bHQgYWN0aW9uIGZvciB5b3VyIHN1YnByb2plY3RzIGlmICJtYWtlIgotICBoYXMgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHM6Ci0KLSAgICBhbGw6IGJjCi0KLSAgVGhpcyB3aWxsIGJ1aWxkIGJ5dGUgY29kZSBieSBkZWZhdWx0IGZvciBhbGwgc3VicHJvamVjdHMuCi0KLSAgRmluYWxseSwgeW91J2xsIGhhdmUgdG8gZGVmaW5lIGEgY2F0Y2gtYWxsIHRhcmdldCB0aGF0IHVzZXMgdGhlIHRhcmdldAotICBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IgYWxsIHN1YnByb2plY3RzLiBKdXN0IGFkZCAoYXNzdW1pbmcgdGhhdAotICBPQ0FNTE1BS0VGSUxFIGhhcyBiZWVuIGRlZmluZWQgYXBwcm9wcmlhdGVseSk6Ci0KLSAgICAlOgotICAgICAgICAgICAgQG1ha2UgLWYgJChPQ0FNTE1BS0VGSUxFKSBzdWJwcm9qcyBTVUJUQVJHRVQ9JEAKLQotICBTZWUgdGhlICJ0aHJlYWRzIi1kaXJlY3RvcnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYSBzaG9ydCBleGFtcGxlIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIHRoYXQgbWF5IGJlIHBhc3NlZCB0byAiT0NhbWxNYWtlZmlsZSIKLQotICAqIExJQl9QQUNLX05BTUUgLSBwYWNrcyBhbGwgbW9kdWxlcyBvZiBhIGxpYnJhcnkgaW50byBhIG1vZHVsZSB3aG9zZQotICAgICAgICAgICAgICAgICAgICBuYW1lIGlzIGdpdmVuIGluIHZhcmlhYmxlICJMSUJfUEFDS19OQU1FIi4KLQotICAqIFJFU19DTElCX1NVRiAgLSB3aGVuIGJ1aWxkaW5nIGEgbGlicmFyeSB0aGF0IGNvbnRhaW5zIEMtc3R1YnMsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgY29udHJvbHMgdGhlIHN1ZmZpeCBhcHBlbmRlZCB0byB0aGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBvZiB0aGUgQy1saWJyYXJ5IChkZWZhdWx0OiAiX3N0dWJzIikuCi0KLSAgKiBUSFJFQURTICAgICAgIC0gc2F5ICJUSFJFQURTID0geWVzIiBpZiB5b3UgbmVlZCB0aHJlYWQgc3VwcG9ydCBjb21waWxlZCBpbiwKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGxlYXZlIGl0IGF3YXkuCi0KLSAgKiBWTVRIUkVBRFMgICAgIC0gc2F5ICJWTVRIUkVBRFMgPSB5ZXMiIGlmIHlvdSB3YW50IHRvIGZvcmNlIFZNLWxldmVsCi0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcgb2YgdGhyZWFkcyAoYnl0ZS1jb2RlIG9ubHkpLgotCi0gICogQU5OT1RBVEUgICAgICAtIHNheSAiQU5OT1RBVEUgPSB5ZXMiIHRvIGdlbmVyYXRlIHR5cGUgYW5ub3RhdGlvbiBmaWxlcwotICAgICAgICAgICAgICAgICAgICAoLmFubm90KSB0byBzdXBwb3J0IGRpc3BsYXlpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBpbiBlZGl0b3JzLgotCi0gICogVVNFX0NBTUxQNCAgICAtIHNheSAiVVNFX0NBTUxQNCA9IHllcyIgaW4geW91ciAiTWFrZWZpbGUiIGlmIHlvdQotICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGluY2x1ZGUgdGhlIGNhbWxwNCBkaXJlY3RvcnkgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICBidWlsZCBwcm9jZXNzLCBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIElOQ0RJUlMgICAgICAgLSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgIi5jbWkiLSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIi5jbW8iLWZpbGVzLiAgWW91IG5lZWQgbm90IHdyaXRlICItSSAuLi4iIC0ganVzdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgcGxhaW4gbmFtZXMuCi0gICogTElCRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBsaWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgQWxzbyBqdXN0IHB1dCB0aGUgcGxhaW4gcGF0aHMgaW50byB0aGlzIHZhcmlhYmxlCi0gICogRVhUTElCRElSUyAgICAtIFNhbWUgYXMgIkxJQkRJUlMiLCBidXQgcGF0aHMgaW4gdGhpcyB2YXJpYWJsZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgYWxzbyBhZGRlZCB0byB0aGUgYmluYXJ5IHZpYSB0aGUgIi1SIi1mbGFnIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMgaW4gbm9uLXN0YW5kYXJkIHBsYWNlcyBjYW4gYmUgZm91bmQuCi0gICogUkVTVUxUREVQUyAgICAtIFRhcmdldHMgb24gd2hpY2ggcmVzdWx0cyAoZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzKQotICAgICAgICAgICAgICAgICAgICBzaG91bGQgYWRkaXRpb25hbGx5IGRlcGVuZC4KLQotICAqIFBBQ0tTICAgICAgICAgLSBhZGRzIHBhY2thZ2VzIHVuZGVyIGNvbnRyb2wgb2YgImZpbmRsaWIiLgotCi0gICogUFJFRFMgICAgICAgICAtIHNwZWNpZmllcyAiZmluZGxpYiItcHJlZGljYXRlcy4KLQotICAqIExJQlMgICAgICAgICAgLSBPQ2FtbC1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLSAgICAgICAgICAgICAgICAgICAgRS5nLiBpZiB5b3Ugd2FudCB0byBsaW5rIHRoZSBTdHItbGlicmFyeSwganVzdCB3cml0ZQotICAgICAgICAgICAgICAgICAgICAic3RyIiAod2l0aG91dCBxdW90ZXMpLgotICAgICAgICAgICAgICAgICAgICBUaGUgbmV3IE9DYW1sLWNvbXBpbGVyIGhhbmRsZXMgbGlicmFyaWVzIGluIHN1Y2gKLSAgICAgICAgICAgICAgICAgICAgYSB3YXkgdGhhdCB0aGV5ICJyZW1lbWJlciIgd2hldGhlciB0aGV5IGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgYmUgbGlua2VkIGFnYWluc3QgYSBDLWxpYnJhcnkgYW5kIGl0IGdldHMgbGlua2VkCi0gICAgICAgICAgICAgICAgICAgIGluIGF1dG9tYXRpY2FsbHkuCi0gICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2xhc2ggaW4gdGhlIGxpYnJhcnkgbmFtZSAoc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAiLi9zdHIiIG9yICJsaWIvZm9vIikgdGhlbiBtYWtlIGlzIHRvbGQgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZpbGVzIGRlcGVuZCBvbiB0aGUgbGlicmFyeS4gIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgaGVscHMgdG8gZW5zdXJlIHRoYXQgY2hhbmdlcyB0byB5b3VyIGxpYnJhcmllcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgdGFrZW4gaW50byBhY2NvdW50LCB3aGljaCBpcyBpbXBvcnRhbnQgaWYgeW91IGFyZQotICAgICAgICAgICAgICAgICAgICByZWdlbmVyYXRpbmcgeW91ciBsaWJyYXJpZXMgZnJlcXVlbnRseS4KLSAgKiBDTElCUyAgICAgICAgIC0gQy1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLQotICAqIFBSRV9UQVJHRVRTICAgLSBzZXQgdGhpcyB0byBhIGxpc3Qgb2YgdGFyZ2V0IGZpbGVzIHRoYXQgeW91IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgdG8gaGF2ZSBidWlsZHQgYmVmb3JlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24gYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAgICAgdGFrZXMgcGxhY2UuIEUuZy4gdXNlIHRoaXMgdG8gYXV0b21hdGljYWxseSBjb21waWxlCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgbmVlZGVkIGJ5IGNhbWxwNCwgd2hpY2ggaGF2ZSB0byBiZSBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgYmVmb3JlIG90aGVyIG1vZHVsZXMgY2FuIGJlIHBhcnNlZCBhdCBhbGwuCi0KLSAgICAgICAgICAgICAgICAgICAgKiogV0FSTklORyAqKjogdGhlIGZpbGVzIG1lbnRpb25lZCBpbiB0aGlzIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZCB3aGVuICJtYWtlIGNsZWFuIiBpcyBleGVjdXRlZCEKLQotICAqIExJQklOU1RBTExfRklMRVMgLSB0aGUgZmlsZXMgb2YgYSBsaWJyYXJ5IHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAiZmluZGxpYiIuIERlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAkKFJFU1VMVCkubWxpICQoUkVTVUxUKS5jbWkgJChSRVNVTFQpLmNtYQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS5hIGxpYiQoUkVTVUxUKS5hCi0KLSAgKiBPQ0FNTF9MSUJfSU5TVEFMTCAtIHRhcmdldCBkaXJlY3RvcnkgZm9yICJyYXdpbnN0YWxsL3Jhd3VuaW5zdGFsbCIuCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIpCi0KLSAgKiBET0NfRklMRVMgICAgIC0gbmFtZXMgb2YgZmlsZXMgZnJvbSB3aGljaCBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGFsbCAubWxpLWZpbGVzIGluIHlvdXIgJChTT1VSQ0VTKSkuCi0KLSAgKiBET0NfRElSICAgICAgIC0gbmFtZSBvZiBkaXJlY3Rvcnkgd2hlcmUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgc3RvcmVkLgotCi0gICogT0NBTUxGTEFHUyAgICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgY29tcGlsZXJzCi0gICogT0NBTUxCQ0ZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgYnl0ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLSAgKiBPQ0FNTE5DRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBuYXRpdmUgY29kZSBjb21waWxlciBvbmx5Ci0KLSAgKiBPQ0FNTExERkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIKLSAgKiBPQ0FNTEJMREZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIgd2hlbiBsaW5raW5nIGJ5dGUgY29kZQotICAqIE9DQU1MTkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlIGNvZGUKLQotICAqIE9DQU1MTUtMSUJfRkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sIGxpYnJhcnkgdG9vbAotCi0gICogT0NBTUxDUEZMQUdTICAtIHByb2ZpbGluZyBmbGFncyBwYXNzZWQgdG8gIm9jYW1sY3AiIChkZWZhdWx0OiAiYSIpCi0KLSAgKiBQUEZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIHByZXByb2Nlc3NvciAoZGVmYXVsdDogbm9uZSkKLQotICAqIExGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sbGV4IgotICAqIFlGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1seWFjYyIKLSAgKiBJRExGTEFHUyAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJjYW1saWRsIgotCi0gICogT0NBTUxET0NGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxkb2MiCi0KLSAgKiBPQ0FNTEZJTkRfSU5TVEZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGZpbmQiIGR1cmluZyBpbnN0YWxsYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IG5vbmUpCi0KLSAgKiBEVklQU0ZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIGR2aXBzCi0gICAgICAgICAgICAgICAgICAgICh3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBQb3N0U2NyaXB0KS4KLQotICAqIFNUQVRJQyAgICAgICAgLSBzZXQgdGhpcyB2YXJpYWJsZSBpZiB5b3Ugd2FudCB0byBmb3JjZSBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAgICBvZiBzdGF0aWMgbGlicmFyaWVzCi0KLSAgKiBDQyAgICAgICAgICAgIC0gdGhlIEMtY29tcGlsZXIgdG8gYmUgdXNlZAotICAqIENYWCAgICAgICAgICAgLSB0aGUgQysrLWNvbXBpbGVyIHRvIGJlIHVzZWQKLQotICAqIENGTEFHUyAgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1jb21waWxlci4KLSAgICAgICAgICAgICAgICAgICAgVGhlIGZsYWcgIi1ETkFUSVZFX0NPREUiIHdpbGwgYmUgcGFzc2VkIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgaWYgeW91IGNob29zZSB0byBidWlsZCBuYXRpdmUgY29kZS4gVGhpcyBhbGxvd3MgeW91Ci0gICAgICAgICAgICAgICAgICAgIHRvIGNvbXBpbGUgeW91ciBDLWZpbGVzIGNvbmRpdGlvbmFsbHkuIEJ1dCBwbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgbm90ZTogWW91IHNob3VsZCBkbyBhICJtYWtlIGNsZWFuIiBvciByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdCBmaWxlcyBtYW51YWxseSBvciB0b3VjaCB0aGUgJS5jLWZpbGVzOgotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHRoZXkgbWF5IG5vdCBiZSBjb3JyZWN0bHkgcmVjb21waWxlZAotICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGRpZmZlcmVudCBidWlsZHMuCi0KLSAgKiBDWFhGTEFHUyAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMrKy1jb21waWxlci4KLQotICAqIENQUEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1wcmVwcm9jZXNzb3IuCi0KLSAgKiBDRlJBTUVXT1JLUyAgIC0gT2JqZWN0aXZlLUMgZnJhbWV3b3JrIHRvIHBhc3MgdG8gbGlua2VyIG9uIE1hY09TIFguCi0KLSAgKiBMREZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtbGlua2VyCi0KLSAgKiBSUEFUSF9GTEFHICAgIC0gZmxhZyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgQy1saW5rZXIgdG8gc2V0IGEgcGF0aCBmb3IKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMuICBNYXkgbmVlZCB0byBiZSBzZXQgYnkgdXNlciBvbgotICAgICAgICAgICAgICAgICAgICBleG90aWMgcGxhdGZvcm1zLiAgKGRlZmF1bHQ6ICItUiIpLgotCi0gICogRUxGX1JQQVRIX0ZMQUcgLSB0aGlzIGZsYWcgaXMgdXNlZCB0byBzZXQgdGhlIHJwYXRoIG9uIEVMRi1wbGF0Zm9ybXMuCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogIi1SIikKLQotICAqIEVMRl9SUEFUSCAgICAgLSBpZiB0aGlzIGZsYWcgaXMgInllcyIsIHRoZW4gdGhlIFJQQVRIX0ZMQUcgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICBwYXNzZWQgYnkgIi1XbCIgdG8gdGhlIGxpbmtlciBhcyBub3JtYWwgb24KLSAgICAgICAgICAgICAgICAgICAgRUxGLXBsYXRmb3Jtcy4KLQotICAqIE9DQU1MTElCUEFUSCAgLSBwYXRoIHRvIHRoZSBPQ2FtbC1zdGFuZGFyZC1saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgKGZpcnN0IGRlZmF1bHQ6IGAkKE9DQU1MQykgLXdoZXJlYCkKLSAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBkZWZhdWx0OiAiL3Vzci9sb2NhbC9saWIvb2NhbWwiKQotCi0gICogT0NBTUxfREVGQVVMVF9ESVJTIC0gYWRkaXRpb25hbCBwYXRoIGluIHdoaWNoIHRoZSB1c2VyIGNhbiBzdXBwbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIGhpcyBvd24gY29sbGVjdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIFRoZSBpZGVhIGlzIHRvIHBhc3MgdGhpcyBhcyBhbiBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgdGhlIE1ha2VmaWxlcyBkbyBub3QgaGF2ZSB0byBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXRoIGFsbCB0aGUgdGltZS4KLQotICAqIE9DQU1MRklORCAgICAgLSBvY2FtbGZpbmQgZnJvbSBmaW5kbGliICAgICAgIChkZWZhdWx0OiAib2NhbWxmaW5kIikKLSAgKiBPQ0FNTEMgICAgICAgIC0gYnl0ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sYyIpCi0gICogT0NBTUxPUFQgICAgICAtIG5hdGl2ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG9wdCIpCi0gICogT0NBTUxNS1RPUCAgICAtIHRvcC1sZXZlbCBjb21waWxlciAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG1rdG9wIikKLSAgKiBPQ0FNTENQICAgICAgIC0gcHJvZmlsaW5nIGJ5dGUtY29kZSBjb21waWxlciAoZGVmYXVsdDogIm9jYW1sY3AiKQotICAqIE9DQU1MREVQICAgICAgLSBkZXBlbmRlbmN5IGdlbmVyYXRvciAgICAgICAgIChkZWZhdWx0OiAib2NhbWxkZXAiKQotICAqIE9DQU1MTEVYICAgICAgLSBzY2FubmVyIGdlbmVyYXRvciAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxsZXgiKQotICAqIE9DQU1MWUFDQyAgICAgLSBwYXJzZXIgZ2VuZXJhdG9yICAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWx5YWNjIikKLSAgKiBPQ0FNTE1LTElCICAgIC0gdG9vbCB0byBjcmVhdGUgbGlicmFyaWVzICAgICAoZGVmYXVsdDogIm9jYW1sbWtsaWIiKQotICAqIENBTUxJREwgICAgICAgLSBJREwtY29kZSBnZW5lcmF0b3IgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbGlkbCIpCi0gICogQ0FNTElETERMTCAgICAtIElETC11dGlsaXR5ICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsZGxsIikKLSAgKiBDQU1MUDQgICAgICAgIC0gY2FtbHA0IHByZXByb2Nlc3NvciAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNCIpCi0gICogT0NBTUxET0MgICAgICAtIE9DYW1sZG9jLWNvbW1hbmQgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRvYyIpCi0KLSAgKiBMQVRFWCAgICAgICAgIC0gTGF0ZXgtcHJvY2Vzc29yICAgICAgICAgICAgICAoZGVmYXVsdDogImxhdGV4IikKLSAgKiBEVklQUyAgICAgICAgIC0gZHZpcHMtY29tbWFuZCAgICAgICAgICAgICAgICAoZGVmYXVsdDogImR2aXBzIikKLSAgKiBQUzJQREYgICAgICAgIC0gUG9zdFNjcmlwdC10by1QREYgY29udmVydGVyICAoZGVmYXVsdDogInBzMnBkZiIpCi0KLSAgKiBDQU1FTEVPTl9SRVBPUlQgLSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbiAgKGRlZmF1bHQ6ICJyZXBvcnQiKQotICAqIENBTUVMRU9OX1JFUE9SVF9GTEFHUyAtIGZsYWdzIGZvciB0aGUgcmVwb3J0IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIENBTUVMRU9OX1pPR0dZIC0gem9nZ3kgdG9vbCBvZiBDYW1lbGVvbgotICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8iKQotICAqIENBTUVMRU9OX1pPR0dZX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0KLSAgKiBPQ0FNTF9HTEFERUNDIC0gR2xhZGUgY29tcGlsZXIgZm9yIE9DYW1sICAgICAoZGVmYXVsdDogImxhYmxnbGFkZWNjMiIpCi0gICogT0NBTUxfR0xBREVDQ19GTEFHUyAtIGZsYWdzIGZvciB0aGUgR2xhZGUgY29tcGlsZXIKLQotICAqIE9YUklETCAgICAgICAgLSBPWFJJREwtZ2VuZXJhdG9yICAoZGVmYXVsdDogIm94cmlkbCIpCi0KLSAgKiBOT0lETEhFQURFUiAgIC0gc2V0IHRvICJ5ZXMiIHRvIHByb2hpYml0ICJPQ2FtbE1ha2VmaWxlIiBmcm9tIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNhbWxpZGwtZmxhZyAiLWhlYWRlciIuCi0KLSAgKiBOT19DVVNUT00gICAgIC0gUHJldmVudCBsaW5raW5nIGluIGN1c3RvbSBtb2RlLgotCi0gICogUVVJRVQgICAgICAgICAtIHVuc2V0dGluZyB0aGlzIHZhcmlhYmxlIChlLmcuICJtYWtlIFFVSUVUPSIpCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgcHJpbnQgYWxsIGV4ZWN1dGVkIGNvbW1hbmRzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIG9uZXMuIFRoaXMgYWxsb3dzIG1vcmUgY29tZm9ydGFibGUKLSAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nIHdoZW4gdGhpbmdzIGdvIHdyb25nIGR1cmluZyBhIGJ1aWxkLgotCi0gICogUkVBTExZX1FVSUVUICAtIHdoZW4gc2V0IHRoaXMgZmxhZyB0dXJucyBvZmYgb3V0cHV0IGZyb20gc29tZSBjb21tYW5kcy4KLQotICAqIE9DQU1MTUFLRUZJTEUgLSBsb2NhdGlvbiBvZiAoPXBhdGggdG8pIHRoaXMgIk9DYW1sTWFrZWZpbGUiLgotICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIGl0IGNhbGxlcyBpdHNlbGYgcmVjdXJzaXZlbHksIGl0IGhhcyB0bwotICAgICAgICAgICAgICAgICAgICBrbm93IHdoZXJlIGl0IGlzLiAoZGVmYXVsdDogIk9DYW1sTWFrZWZpbGUiID0KLSAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGlyZWN0b3J5KQotCi0gICogQkNTVUZGSVggICAgICAtIFN1ZmZpeCBmb3IgYWxsIGJ5dGUtY29kZSBmaWxlcy4gRS5nLjoKLQotICAgICAgICAgICAgICAgICAgICAgIFJFU1VMVCAgID0gZm9vCi0gICAgICAgICAgICAgICAgICAgICAgQkNTVUZGSVggPSBfYmMKLQotICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSBieXRlLWNvZGUgZXhlY3V0YWJsZXMvbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIHdpdGggYmFzZW5hbWUgImZvb19iYyIuCi0KLSAgKiBOQ1NVRkZJWCAgICAgIC0gU2ltaWxhciB0byAiQkNTVUZGSVgiLCBidXQgZm9yIG5hdGl2ZS1jb2RlIGZpbGVzLgotICAqIFRPUFNVRkZJWCAgICAgLSBTdWZmaXggYWRkZWQgdG8gdG9wbGV2ZWwgaW50ZXJwcmV0ZXJzIChkZWZhdWx0OiAiLnRvcCIpCi0KLSAgKiBTVUJQUk9KUyAgICAgIC0gdmFyaWFibGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2Ygc3VicHJvamVjdHMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZWQuCi0KLSAgKiBTVUJUQVJHRVQgICAgIC0gdGFyZ2V0IHRvIGJlIGJ1aWx0IGZvciBhbGwgcHJvamVjdHMgaW4gdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgU1VCUFJPSlMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHZhcmlhYmxlcyBmb3IgV2luZG93cyB1c2VycwotCi0gICogTUlOR1cgICAgICAgICAtIHZhcmlhYmxlIHRvIGRldGVjdCB0aGUgTUlOR1ctZW52aXJvbm1lbnQKLSAgKiBNU1ZDICAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNU1ZDLWNvbXBpbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1VcC10by1kYXRlIGluZm9ybWF0aW9uIChuZXdlc3QgcmVsZWFzZSBvZiBkaXN0cmlidXRpb24pIGNhbiBhbHdheXMgYmUKLWZvdW5kIGF0OgotCi0gIGh0dHA6Ly93d3cub2NhbWwuaW5mby9ob21lL29jYW1sX3NvdXJjZXMuaHRtbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRW5qb3khCi0KLU5ldyBZb3JrLCAyMDA3LTA0LTIyCi1NYXJrdXMgTW90dGwKLQotZS1tYWlsOiBtYXJrdXMubW90dGxAZ21haWwuY29tCi1XV1c6ICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mbwpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL1JFQURNRSBiL2xpYi9vY2FtbC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9vY2FtbC9SRUFETUUKcmVuYW1lIHRvIGxpYi9vY2FtbC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9fb2FzaXMgYi9saWIvb2NhbWwvX29hc2lzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDkwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvX29hc2lzCkBAIC0wLDAgKzEsMTkgQEAKK05hbWU6IGxpYnRocmlmdC1vY2FtbAorVmVyc2lvbjogMS4wLjAKK09BU0lTRm9ybWF0OiAwLjMKK1N5bm9wc2lzOiBPQ2FtbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQorQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitMaWNlbnNlOiBBcGFjaGUtMi4wCitIb21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWlsZFRvb2xzOiBvY2FtbGJ1aWxkCitQbHVnaW5zOiAgICAgTUVUQSAoMC4zKSwKKyAgRGV2RmlsZXMgKDAuMykKKworTGlicmFyeSAibGlidGhyaWZ0LW9jYW1sIgorICBQYXRoOiBzcmMKKyAgRmluZGxpYk5hbWU6IHRocmlmdAorICBidWlsZFRvb2xzOiBvY2FtbGJ1aWxkCisgIEJ1aWxkRGVwZW5kczogdGhyZWFkcworICBNb2R1bGVzOiBUaHJpZnQsVEJpbmFyeVByb3RvY29sLFRTb2NrZXQsVEZyYW1lZFRyYW5zcG9ydCxUQ2hhbm5lbFRyYW5zcG9ydCxUU2VydmVyLFRTaW1wbGVTZXJ2ZXIsVFNlcnZlclNvY2tldCxUVGhyZWFkZWRTZXJ2ZXIKKyAgWE1FVEFSZXF1aXJlczogdGhyZWFkcworCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9kZXNjciBiL2xpYi9vY2FtbC9kZXNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE3NDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL2Rlc2NyCkBAIC0wLDAgKzEgQEAKK09DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvb3BhbSBiL2xpYi9vY2FtbC9vcGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvb3BhbQpAQCAtMCwwICsxLDggQEAKK29wYW0tdmVyc2lvbjogIjEiCittYWludGFpbmVyOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBFTUFJTCkiCitidWlsZDogWworICBbbWFrZV0KKyAgW21ha2UgImluc3RhbGwiXQorXQorcmVtb3ZlOiBbWyJvY2FtbGZpbmQiICJyZW1vdmUiICJ0aHJpZnQiXV0KK2RlcGVuZHM6IFsib2NhbWxmaW5kIl0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9zcmMvTWFrZWZpbGUgYi9saWIvb2NhbWwvc3JjL01ha2VmaWxlCmluZGV4IDQyZWM4ZGIuLmE5N2FkZTUgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9zcmMvTWFrZWZpbGUKKysrIGIvbGliL29jYW1sL3NyYy9NYWtlZmlsZQpAQCAtMTcsNyArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU09VUkNFUyA9IFRocmlmdC5tbCBUQmluYXJ5UHJvdG9jb2wubWwgVFNvY2tldC5tbCBUQ2hhbm5lbFRyYW5zcG9ydC5tbCBUU2VydmVyLm1sIFRTaW1wbGVTZXJ2ZXIubWwgVFNlcnZlclNvY2tldC5tbCBUVGhyZWFkZWRTZXJ2ZXIubWwKK1NPVVJDRVMgPSBUaHJpZnQubWwgVEJpbmFyeVByb3RvY29sLm1sIFRTb2NrZXQubWwgVEZyYW1lZFRyYW5zcG9ydC5tbCBUQ2hhbm5lbFRyYW5zcG9ydC5tbCBUU2VydmVyLm1sIFRTaW1wbGVTZXJ2ZXIubWwgVFNlcnZlclNvY2tldC5tbCBUVGhyZWFkZWRTZXJ2ZXIubWwKIFJFU1VMVCA9IHRocmlmdAogTElCUyA9IHVuaXggdGhyZWFkcwogVEhSRUFEUyA9IHllcwpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9UQmluYXJ5UHJvdG9jb2wubWwgYi9saWIvb2NhbWwvc3JjL1RCaW5hcnlQcm90b2NvbC5tbAppbmRleCBhMDZjYzlhLi42ZDc1MDBlIDEwMDY0NAotLS0gYS9saWIvb2NhbWwvc3JjL1RCaW5hcnlQcm90b2NvbC5tbAorKysgYi9saWIvb2NhbWwvc3JjL1RCaW5hcnlQcm90b2NvbC5tbApAQCAtMjIsNiArMjIsNyBAQAogbW9kdWxlIFAgPSBQcm90b2NvbAogCiBsZXQgZ2V0X2J5dGUgaSBiID0gMjU1IGxhbmQgKGkgbHNyICg4KmIpKQorbGV0IGdldF9ieXRlMzIgaSBiID0gMjU1IGxhbmQgKEludDMyLnRvX2ludCAoSW50MzIuc2hpZnRfcmlnaHQgaSAoOCpiKSkpCiBsZXQgZ2V0X2J5dGU2NCBpIGIgPSAyNTUgbGFuZCAoSW50NjQudG9faW50IChJbnQ2NC5zaGlmdF9yaWdodCBpICg4KmIpKSkKIAogCkBAIC0zNSw3ICszNiw3IEBACiAgICAgZm9yIGk9MCB0byAobi0xKSBkbwogICAgICAgczo9IEludDMyLmxvZ29yICFzIChJbnQzMi5zaGlmdF9sZWZ0IChJbnQzMi5vZl9pbnQgKGludF9vZl9jaGFyIGIuW2ldKSkgKDgqKG4tMS1pKSkpCiAgICAgZG9uZTsKLSAgICBJbnQzMi50b19pbnQgKEludDMyLnNoaWZ0X3JpZ2h0IChJbnQzMi5zaGlmdF9sZWZ0ICFzIHNiKSBzYikKKyAgICBJbnQzMi5zaGlmdF9yaWdodCAoSW50MzIuc2hpZnRfbGVmdCAhcyBzYikgc2IKIAogbGV0IGNvbXBfaW50NjQgYiBuID0KICAgbGV0IHMgPSByZWYgMEwgaW4KQEAgLTQ0LDggKzQ1LDggQEAKICAgICBkb25lOwogICAgICFzCiAKLWxldCB2ZXJzaW9uX21hc2sgPSAweGZmZmYwMDAwCi1sZXQgdmVyc2lvbl8xID0gMHg4MDAxMDAwMAorbGV0IHZlcnNpb25fbWFzayA9IDB4ZmZmZjAwMDBsCitsZXQgdmVyc2lvbl8xID0gMHg4MDAxMDAwMGwKIAogY2xhc3MgdCB0cmFucyA9CiBvYmplY3QgKHNlbGYpCkBAIC02Myw3ICs2NCw3IEBACiAgICAgICBpYnl0ZS5bMF0gPC0gY2hhcl9vZl9pbnQgKGdiIDEpOwogICAgICAgdHJhbnMjd3JpdGUgaWJ5dGUgMCAyCiAgIG1ldGhvZCB3cml0ZUkzMiBpID0KLSAgICBsZXQgZ2IgPSBnZXRfYnl0ZSBpIGluCisgICAgbGV0IGdiID0gZ2V0X2J5dGUzMiBpIGluCiAgICAgICBmb3IgaT0wIHRvIDMgZG8KICAgICAgICAgaWJ5dGUuWzMtaV0gPC0gY2hhcl9vZl9pbnQgKGdiIGkpCiAgICAgICBkb25lOwpAQCAtNzgsMTMgKzc5LDEzIEBACiAgICAgc2VsZiN3cml0ZUk2NCAoSW50NjQuYml0c19vZl9mbG9hdCBkKQogICBtZXRob2Qgd3JpdGVTdHJpbmcgcz0KICAgICBsZXQgbiA9IFN0cmluZy5sZW5ndGggcyBpbgotICAgICAgc2VsZiN3cml0ZUkzMihuKTsKKyAgICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLm9mX2ludCBuKTsKICAgICAgIHRyYW5zI3dyaXRlIHMgMCBuCiAgIG1ldGhvZCB3cml0ZUJpbmFyeSBhID0gc2VsZiN3cml0ZVN0cmluZyBhCiAgIG1ldGhvZCB3cml0ZU1lc3NhZ2VCZWdpbiAobix0LHMpID0KLSAgICBzZWxmI3dyaXRlSTMyICh2ZXJzaW9uXzEgbG9yIChQLm1lc3NhZ2VfdHlwZV90b19pIHQpKTsKKyAgICBzZWxmI3dyaXRlSTMyIChJbnQzMi5sb2dvciB2ZXJzaW9uXzEgKEludDMyLm9mX2ludCAoUC5tZXNzYWdlX3R5cGVfdG9faSB0KSkpOwogICAgIHNlbGYjd3JpdGVTdHJpbmcgbjsKLSAgICBzZWxmI3dyaXRlSTMyIHMKKyAgICBzZWxmI3dyaXRlSTMyIChJbnQzMi5vZl9pbnQgcykKICAgbWV0aG9kIHdyaXRlTWVzc2FnZUVuZCA9ICgpCiAgIG1ldGhvZCB3cml0ZVN0cnVjdEJlZ2luIHMgPSAoKQogICBtZXRob2Qgd3JpdGVTdHJ1Y3RFbmQgPSAoKQpAQCAtOTMsMjYgKzk0LDI2IEBACiAgICAgc2VsZiN3cml0ZUkxNiBpCiAgIG1ldGhvZCB3cml0ZUZpZWxkRW5kID0gKCkKICAgbWV0aG9kIHdyaXRlRmllbGRTdG9wID0KLSAgICBzZWxmI3dyaXRlQnl0ZSAodHYgKFByb3RvY29sLlRfU1RPUCkpCisgICAgc2VsZiN3cml0ZUJ5dGUgKHR2IChQLlRfU1RPUCkpCiAgIG1ldGhvZCB3cml0ZU1hcEJlZ2luIChrLHYscykgPQogICAgIHNlbGYjd3JpdGVCeXRlICh0diBrKTsKICAgICBzZWxmI3dyaXRlQnl0ZSAodHYgdik7Ci0gICAgc2VsZiN3cml0ZUkzMiBzCisgICAgc2VsZiN3cml0ZUkzMiAoSW50MzIub2ZfaW50IHMpCiAgIG1ldGhvZCB3cml0ZU1hcEVuZCA9ICgpCiAgIG1ldGhvZCB3cml0ZUxpc3RCZWdpbiAodCxzKSA9CiAgICAgc2VsZiN3cml0ZUJ5dGUgKHR2IHQpOwotICAgIHNlbGYjd3JpdGVJMzIgcworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLm9mX2ludCBzKQogICBtZXRob2Qgd3JpdGVMaXN0RW5kID0gKCkKICAgbWV0aG9kIHdyaXRlU2V0QmVnaW4gKHQscykgPQogICAgIHNlbGYjd3JpdGVCeXRlICh0diB0KTsKLSAgICBzZWxmI3dyaXRlSTMyIHMKKyAgICBzZWxmI3dyaXRlSTMyIChJbnQzMi5vZl9pbnQgcykKICAgbWV0aG9kIHdyaXRlU2V0RW5kID0gKCkKICAgbWV0aG9kIHJlYWRCeXRlID0KICAgICBpZ25vcmUgKHRyYW5zI3JlYWRBbGwgaWJ5dGUgMCAxKTsKLSAgICAoY29tcF9pbnQgaWJ5dGUgMSkKKyAgICBJbnQzMi50b19pbnQgKGNvbXBfaW50IGlieXRlIDEpCiAgIG1ldGhvZCByZWFkSTE2ID0KICAgICBpZ25vcmUgKHRyYW5zI3JlYWRBbGwgaWJ5dGUgMCAyKTsKLSAgICBjb21wX2ludCBpYnl0ZSAyCisgICAgSW50MzIudG9faW50IChjb21wX2ludCBpYnl0ZSAyKQogICBtZXRob2QgcmVhZEkzMiA9CiAgICAgaWdub3JlICh0cmFucyNyZWFkQWxsIGlieXRlIDAgNCk7CiAgICAgY29tcF9pbnQgaWJ5dGUgNApAQCAtMTI0LDIwICsxMjUsMTkgQEAKICAgbWV0aG9kIHJlYWRCb29sID0KICAgICBzZWxmI3JlYWRCeXRlID0gMQogICBtZXRob2QgcmVhZFN0cmluZyA9Ci0gICAgbGV0IHN6ID0gc2VsZiNyZWFkSTMyIGluCisgICAgbGV0IHN6ID0gSW50MzIudG9faW50IChzZWxmI3JlYWRJMzIpIGluCiAgICAgbGV0IGJ1ZiA9IFN0cmluZy5jcmVhdGUgc3ogaW4KICAgICAgIGlnbm9yZSAodHJhbnMjcmVhZEFsbCBidWYgMCBzeik7CiAgICAgICBidWYKICAgbWV0aG9kIHJlYWRCaW5hcnkgPSBzZWxmI3JlYWRTdHJpbmcKICAgbWV0aG9kIHJlYWRNZXNzYWdlQmVnaW4gPQogICAgIGxldCB2ZXIgPSBzZWxmI3JlYWRJMzIgaW4KLSAgICAgIGlmICh2ZXIgbGFuZCB2ZXJzaW9uX21hc2sgIT0gdmVyc2lvbl8xKSB0aGVuCi0gICAgICAgIChwcmludF9pbnQgdmVyOwotICAgICAgICByYWlzZSAoUC5FIChQLkJBRF9WRVJTSU9OLCAiTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXIiKSkpCisgICAgICBpZiBJbnQzMi5jb21wYXJlIChJbnQzMi5sb2dhbmQgdmVyIHZlcnNpb25fbWFzaykgdmVyc2lvbl8xICE9IDAgdGhlbgorICAgICAgICByYWlzZSAoUC5FIChQLkJBRF9WRVJTSU9OLCAiTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXIiKSkKICAgICAgIGVsc2UKICAgICAgICAgbGV0IHMgPSBzZWxmI3JlYWRTdHJpbmcgaW4KLSAgICAgICAgbGV0IG10ID0gUC5tZXNzYWdlX3R5cGVfb2ZfaSAodmVyIGxhbmQgMHhGRikgaW4KLSAgICAgICAgICAocyxtdCwgc2VsZiNyZWFkSTMyKQorICAgICAgICBsZXQgbXQgPSBQLm1lc3NhZ2VfdHlwZV9vZl9pIChJbnQzMi50b19pbnQgKEludDMyLmxvZ2FuZCB2ZXIgMHhGRmwpKSBpbgorICAgICAgICAgIChzLG10LCBJbnQzMi50b19pbnQgc2VsZiNyZWFkSTMyKQogICBtZXRob2QgcmVhZE1lc3NhZ2VFbmQgPSAoKQogICBtZXRob2QgcmVhZFN0cnVjdEJlZ2luID0KICAgICAiIgpAQCAtMTUyLDE1ICsxNTIsMTUgQEAKICAgbWV0aG9kIHJlYWRNYXBCZWdpbiA9CiAgICAgbGV0IGt0ID0gdnQgKHNlbGYjcmVhZEJ5dGUpIGluCiAgICAgbGV0IHZ0ID0gdnQgKHNlbGYjcmVhZEJ5dGUpIGluCi0gICAgICAoa3QsdnQsIHNlbGYjcmVhZEkzMikKKyAgICAgIChrdCx2dCwgSW50MzIudG9faW50IHNlbGYjcmVhZEkzMikKICAgbWV0aG9kIHJlYWRNYXBFbmQgPSAoKQogICBtZXRob2QgcmVhZExpc3RCZWdpbiA9CiAgICAgbGV0IHQgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KLSAgICAodCxzZWxmI3JlYWRJMzIpCisgICAgKHQsIEludDMyLnRvX2ludCBzZWxmI3JlYWRJMzIpCiAgIG1ldGhvZCByZWFkTGlzdEVuZCA9ICgpCiAgIG1ldGhvZCByZWFkU2V0QmVnaW4gPQogICAgIGxldCB0ID0gdnQgKHNlbGYjcmVhZEJ5dGUpIGluCi0gICAgKHQsIHNlbGYjcmVhZEkzMik7CisgICAgKHQsIEludDMyLnRvX2ludCBzZWxmI3JlYWRJMzIpOwogICBtZXRob2QgcmVhZFNldEVuZCA9ICgpCiBlbmQKIApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9URnJhbWVkVHJhbnNwb3J0Lm1sIGIvbGliL29jYW1sL3NyYy9URnJhbWVkVHJhbnNwb3J0Lm1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTUxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvc3JjL1RGcmFtZWRUcmFuc3BvcnQubWwKQEAgLTAsMCArMSw5MyBAQAorb3BlbiBUaHJpZnQKKworbW9kdWxlIFQgPSBUcmFuc3BvcnQKKworbGV0IGNfMHhmZl8zMiA9IEludDMyLm9mX3N0cmluZyAiMHhmZiIKKworKCogQ29waWVkIGZyb20gT0NhbWxuZXQgcnR5cGVzLm1sICopCitsZXQgZW5jb2RlX2ZyYW1lX3NpemUgeCA9CisJbGV0IHMgPSBTdHJpbmcuY3JlYXRlIDQgaW4KKwlsZXQgbjMgPSBJbnQzMi50b19pbnQgKEludDMyLnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgeCAyNCkgbGFuZCAweGZmIGluCisJbGV0IG4yID0gSW50MzIudG9faW50IChJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIHggMTYpIGxhbmQgMHhmZiBpbgorCWxldCBuMSA9IEludDMyLnRvX2ludCAoSW50MzIuc2hpZnRfcmlnaHRfbG9naWNhbCB4IDgpIGxhbmQgMHhmZiBpbgorCWxldCBuMCA9IEludDMyLnRvX2ludCAoSW50MzIubG9nYW5kIHggY18weGZmXzMyKSBpbgorCQlTdHJpbmcudW5zYWZlX3NldCBzIDAgKENoYXIudW5zYWZlX2NociBuMyk7CisJCVN0cmluZy51bnNhZmVfc2V0IHMgMSAoQ2hhci51bnNhZmVfY2hyIG4yKTsKKwkJU3RyaW5nLnVuc2FmZV9zZXQgcyAyIChDaGFyLnVuc2FmZV9jaHIgbjEpOworCQlTdHJpbmcudW5zYWZlX3NldCBzIDMgKENoYXIudW5zYWZlX2NociBuMCk7CisJCXMKKwkJCitsZXQgZGVjb2RlX2ZyYW1lX3NpemUgcyA9IAorCWxldCBuMyA9IEludDMyLm9mX2ludCAoQ2hhci5jb2RlIHMuWzBdKSBpbgorCWxldCBuMiA9IEludDMyLm9mX2ludCAoQ2hhci5jb2RlIHMuWzFdKSBpbgorCWxldCBuMSA9IEludDMyLm9mX2ludCAoQ2hhci5jb2RlIHMuWzJdKSBpbgorCWxldCBuMCA9IEludDMyLm9mX2ludCAoQ2hhci5jb2RlIHMuWzNdKSBpbgorCQlJbnQzMi5sb2dvcgorCQkoSW50MzIuc2hpZnRfbGVmdCBuMyAyNCkKKwkJKEludDMyLmxvZ29yCisJCQkoSW50MzIuc2hpZnRfbGVmdCBuMiAxNikKKwkJCShJbnQzMi5sb2dvcgorCQkJCShJbnQzMi5zaGlmdF9sZWZ0IG4xIDgpCisJCQkJbjApKQorCitjbGFzcyB0ID8obWF4X2xlbmd0aD1TeXMubWF4X3N0cmluZ19sZW5ndGgpICh0cmFuc3BvcnQ6IFQudCkgPQorb2JqZWN0IChzZWxmKQorCWluaGVyaXQgVC50CisKKwltZXRob2QgaXNPcGVuID0gdHJhbnNwb3J0I2lzT3BlbgorCW1ldGhvZCBvcG4gPSB0cmFuc3BvcnQjb3BuCisJbWV0aG9kIGNsb3NlID0gdHJhbnNwb3J0I2Nsb3NlCisgCisJdmFsIG11dGFibGUgcmVhZF9idWYgPSBOb25lCisJdmFsIG11dGFibGUgcmVhZF9idWZfb2Zmc2V0ID0gMAorCXZhbCBtdXRhYmxlIHdyaXRlX2J1ZiA9ICIiCisKKwltZXRob2QgcHJpdmF0ZSByZWFkX2ZyYW1lID0KKwkJbGV0IGxlbl9idWYgPSBTdHJpbmcuY3JlYXRlIDQgaW4KKwkJYXNzZXJ0ICh0cmFuc3BvcnQjcmVhZEFsbCBsZW5fYnVmIDAgNCA9IDQpOyAKKwkJCisJCWxldCBzaXplID0gSW50MzIudG9faW50IChkZWNvZGVfZnJhbWVfc2l6ZSBsZW5fYnVmKSBpbgorCQkKKwkJKGlmIHNpemUgPCAwCisJCXRoZW4gZmFpbHdpdGggKFByaW50Zi5zcHJpbnRmICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoJWkpISIgc2l6ZSkpOworCQkKKwkJKGlmIHNpemUgPiBtYXhfbGVuZ3RoCisJCXRoZW4gZmFpbHdpdGggKFByaW50Zi5zcHJpbnRmICJGcmFtZSBzaXplICglaSkgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoJWkpISIgc2l6ZSBtYXhfbGVuZ3RoKSk7CisKKwkJbGV0IGJ1ZiA9IFN0cmluZy5jcmVhdGUgc2l6ZSBpbgorCQkJYXNzZXJ0ICh0cmFuc3BvcnQjcmVhZEFsbCBidWYgMCBzaXplID0gc2l6ZSk7CisJCQlyZWFkX2J1ZiA8LSBTb21lIGJ1ZjsKKwkJCXJlYWRfYnVmX29mZnNldCA8LSAwCisKKwltZXRob2QgcHJpdmF0ZSByZWFkX2Zyb21fZnJhbWUgZnJhbWUgYnVmIG9mZiBsZW4gPQorCQlsZXQgdG9fY29weSA9IG1pbiBsZW4gKChTdHJpbmcubGVuZ3RoIGZyYW1lKSAtIHJlYWRfYnVmX29mZnNldCkgaW4KKwkJCVN0cmluZy5ibGl0IGZyYW1lIHJlYWRfYnVmX29mZnNldCBidWYgb2ZmIHRvX2NvcHk7CisJCQlyZWFkX2J1Zl9vZmZzZXQgPC0gcmVhZF9idWZfb2Zmc2V0ICsgdG9fY29weTsKKwkJCXRvX2NvcHkKKworCW1ldGhvZCByZWFkIGJ1ZiBvZmYgbGVuID0gCisJCW1hdGNoIHJlYWRfYnVmIHdpdGgKKwkJfCBTb21lIGZyYW1lIC0+IAorCQkJbGV0IGkgPSBzZWxmI3JlYWRfZnJvbV9mcmFtZSBmcmFtZSBidWYgb2ZmIGxlbiBpbgorCQkJaWYgaSA+IDAKKwkJCXRoZW4gaQorCQkJZWxzZSBiZWdpbgorCQkJCXNlbGYjcmVhZF9mcmFtZTsgCisJCQkJc2VsZiNyZWFkX2Zyb21fZnJhbWUgZnJhbWUgYnVmIG9mZiBsZW4KKwkJCWVuZAorCQl8IE5vbmUgLT4KKwkJCQlzZWxmI3JlYWRfZnJhbWU7CisJCQkJc2VsZiNyZWFkIGJ1ZiBvZmYgbGVuIAorCSAKKwltZXRob2Qgd3JpdGUgYnVmIG9mZiBsZW4gPSAKKwkJd3JpdGVfYnVmIDwtIHdyaXRlX2J1ZiBeIChTdHJpbmcuc3ViIGJ1ZiBvZmYgbGVuKQorCisJbWV0aG9kIGZsdXNoID0gCisJCWxldCBlbmNvZGVkX3NpemUgPSBlbmNvZGVfZnJhbWVfc2l6ZSAoSW50MzIub2ZfaW50IChTdHJpbmcubGVuZ3RoIHdyaXRlX2J1ZikpIGluCisJCQl0cmFuc3BvcnQjd3JpdGUgZW5jb2RlZF9zaXplIDAgKFN0cmluZy5sZW5ndGggZW5jb2RlZF9zaXplKTsKKwkJCXRyYW5zcG9ydCN3cml0ZSB3cml0ZV9idWYgMCAoU3RyaW5nLmxlbmd0aCB3cml0ZV9idWYpOworCQkJdHJhbnNwb3J0I2ZsdXNoOyAKKwkJCXdyaXRlX2J1ZiA8LSAiIgorZW5kCisKKwpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9UU2ltcGxlU2VydmVyLm1sIGIvbGliL29jYW1sL3NyYy9UU2ltcGxlU2VydmVyLm1sCmluZGV4IGQxOWQ4YzUuLjI5MjdjMDggMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9zcmMvVFNpbXBsZVNlcnZlci5tbAorKysgYi9saWIvb2NhbWwvc3JjL1RTaW1wbGVTZXJ2ZXIubWwKQEAgLTI2LDEzICsyNiwxNSBAQAogICBtZXRob2Qgc2VydmUgPQogICAgIHRyeQogICAgICAgc3QjbGlzdGVuOwotICAgICAgbGV0IGMgPSBzdCNhY2NlcHQgaW4KLSAgICAgIGxldCB0cmFucyA9IHRmI2dldFRyYW5zcG9ydCBjIGluCi0gICAgICBsZXQgaW5wID0gaXBmI2dldFByb3RvY29sIHRyYW5zIGluCi0gICAgICBsZXQgb3AgPSBvcGYjZ2V0UHJvdG9jb2wgdHJhbnMgaW4KLSAgICAgICAgdHJ5Ci0gICAgICAgICAgd2hpbGUgKHBmI3Byb2Nlc3MgaW5wIG9wKSBkbyAoKSBkb25lOwotICAgICAgICAgIHRyYW5zI2Nsb3NlCi0gICAgICAgIHdpdGggZSAtPiB0cmFucyNjbG9zZTsgcmFpc2UgZQorICAgICAgd2hpbGUgdHJ1ZSBkbworICAgICAgICBsZXQgYyA9IHN0I2FjY2VwdCBpbgorICAgICAgICBsZXQgdHJhbnMgPSB0ZiNnZXRUcmFuc3BvcnQgYyBpbgorICAgICAgICBsZXQgaW5wID0gaXBmI2dldFByb3RvY29sIHRyYW5zIGluCisgICAgICAgIGxldCBvcCA9IG9wZiNnZXRQcm90b2NvbCB0cmFucyBpbgorICAgICAgICAgIHRyeQorICAgICAgICAgICAgd2hpbGUgKHBmI3Byb2Nlc3MgaW5wIG9wKSBkbyAoKSBkb25lOworICAgICAgICAgICAgdHJhbnMjY2xvc2UKKyAgICAgICAgICB3aXRoIGUgLT4gdHJhbnMjY2xvc2U7IHJhaXNlIGUKKyAgICAgIGRvbmUKICAgICB3aXRoIF8gLT4gKCkKIGVuZApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9UaHJpZnQubWwgYi9saWIvb2NhbWwvc3JjL1RocmlmdC5tbAppbmRleCA4ZGM5YWZhLi5mMGQ3YTQyIDEwMDY0NAotLS0gYS9saWIvb2NhbWwvc3JjL1RocmlmdC5tbAorKysgYi9saWIvb2NhbWwvc3JjL1RocmlmdC5tbApAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgbWV0aG9kIHZpcnR1YWwgd3JpdGVCb29sIDogYm9vbCAtPiB1bml0CiAgICAgbWV0aG9kIHZpcnR1YWwgd3JpdGVCeXRlIDogaW50IC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUkxNiA6IGludCAtPiB1bml0Ci0gICAgbWV0aG9kIHZpcnR1YWwgd3JpdGVJMzIgOiBpbnQgLT4gdW5pdAorICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlSTMyIDogSW50MzIudCAtPiB1bml0CiAgICAgbWV0aG9kIHZpcnR1YWwgd3JpdGVJNjQgOiBJbnQ2NC50IC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZURvdWJsZSA6IGZsb2F0IC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZVN0cmluZyA6IHN0cmluZyAtPiB1bml0CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICBtZXRob2QgdmlydHVhbCByZWFkQm9vbCA6IGJvb2wKICAgICBtZXRob2QgdmlydHVhbCByZWFkQnl0ZSA6IGludAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRJMTYgOiBpbnQKLSAgICBtZXRob2QgdmlydHVhbCByZWFkSTMyOiBpbnQKKyAgICBtZXRob2QgdmlydHVhbCByZWFkSTMyOiBJbnQzMi50CiAgICAgbWV0aG9kIHZpcnR1YWwgcmVhZEk2NCA6IEludDY0LnQKICAgICBtZXRob2QgdmlydHVhbCByZWFkRG91YmxlIDogZmxvYXQKICAgICBtZXRob2QgdmlydHVhbCByZWFkU3RyaW5nIDogc3RyaW5nCkBAIC0yNjEsNiArMjYxLDggQEAKICAgICAgIHwgTkVHQVRJVkVfU0laRQogICAgICAgfCBTSVpFX0xJTUlUCiAgICAgICB8IEJBRF9WRVJTSU9OCisgICAgICB8IE5PVF9JTVBMRU1FTlRFRAorICAgICAgfCBERVBUSF9MSU1JVAogCiAgIGV4Y2VwdGlvbiBFIG9mIGV4bl90eXBlICogc3RyaW5nOzsKIApAQCAtMjkyLDIyICsyOTQsMzcgQEAKICAgICAgIHwgV1JPTkdfTUVUSE9EX05BTUUKICAgICAgIHwgQkFEX1NFUVVFTkNFX0lECiAgICAgICB8IE1JU1NJTkdfUkVTVUxUCisgICAgICB8IElOVEVSTkFMX0VSUk9SCisgICAgICB8IFBST1RPQ09MX0VSUk9SCisgICAgICB8IElOVkFMSURfVFJBTlNGT1JNCisgICAgICB8IElOVkFMSURfUFJPVE9DT0wKKyAgICAgIHwgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKIAogICBsZXQgdHlwX29mX2kgPSBmdW5jdGlvbgotICAgICAgMCAtPiBVTktOT1dOCi0gICAgfCAxIC0+IFVOS05PV05fTUVUSE9ECi0gICAgfCAyIC0+IElOVkFMSURfTUVTU0FHRV9UWVBFCi0gICAgfCAzIC0+IFdST05HX01FVEhPRF9OQU1FCi0gICAgfCA0IC0+IEJBRF9TRVFVRU5DRV9JRAotICAgIHwgNSAtPiBNSVNTSU5HX1JFU1VMVAorICAgICAgMGwgLT4gVU5LTk9XTgorICAgIHwgMWwgLT4gVU5LTk9XTl9NRVRIT0QKKyAgICB8IDJsIC0+IElOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgfCAzbCAtPiBXUk9OR19NRVRIT0RfTkFNRQorICAgIHwgNGwgLT4gQkFEX1NFUVVFTkNFX0lECisgICAgfCA1bCAtPiBNSVNTSU5HX1JFU1VMVAorICAgIHwgNmwgLT4gSU5URVJOQUxfRVJST1IKKyAgICB8IDdsIC0+IFBST1RPQ09MX0VSUk9SCisgICAgfCA4bCAtPiBJTlZBTElEX1RSQU5TRk9STQorICAgIHwgOWwgLT4gSU5WQUxJRF9QUk9UT0NPTAorICAgIHwgMTBsIC0+IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFCiAgICAgfCBfIC0+IHJhaXNlIFRocmlmdF9lcnJvcjs7CiAgIGxldCB0eXBfdG9faSA9IGZ1bmN0aW9uCi0gICAgfCBVTktOT1dOIC0+IDAKLSAgICB8IFVOS05PV05fTUVUSE9EIC0+IDEKLSAgICB8IElOVkFMSURfTUVTU0FHRV9UWVBFIC0+IDIKLSAgICB8IFdST05HX01FVEhPRF9OQU1FIC0+IDMKLSAgICB8IEJBRF9TRVFVRU5DRV9JRCAtPiA0Ci0gICAgfCBNSVNTSU5HX1JFU1VMVCAtPiA1CisgICAgfCBVTktOT1dOIC0+IDBsCisgICAgfCBVTktOT1dOX01FVEhPRCAtPiAxbAorICAgIHwgSU5WQUxJRF9NRVNTQUdFX1RZUEUgLT4gMmwKKyAgICB8IFdST05HX01FVEhPRF9OQU1FIC0+IDNsCisgICAgfCBCQURfU0VRVUVOQ0VfSUQgLT4gNGwKKyAgICB8IE1JU1NJTkdfUkVTVUxUIC0+IDVsCisgICAgfCBJTlRFUk5BTF9FUlJPUiAtPiA2bAorICAgIHwgUFJPVE9DT0xfRVJST1IgLT4gN2wKKyAgICB8IElOVkFMSURfVFJBTlNGT1JNIC0+IDhsCisgICAgfCBJTlZBTElEX1BST1RPQ09MIC0+IDlsCisgICAgfCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSAtPiAxMGwKIAogICBjbGFzcyB0ID0KICAgb2JqZWN0IChzZWxmKQpAQCAtMzM3LDIzICszNTQsMjEgQEAKIAogICBsZXQgcmVhZCAoaXByb3QgOiBQcm90b2NvbC50KSA9CiAgICAgbGV0IG1zZyA9IHJlZiAiIiBpbgotICAgIGxldCB0eXAgPSByZWYgMCBpbgorICAgIGxldCB0eXAgPSByZWYgMGwgaW4KICAgICAgIGlnbm9yZSBpcHJvdCNyZWFkU3RydWN0QmVnaW47CiAgICAgICAodHJ5CiAgICAgICAgICAgIHdoaWxlIHRydWUgZG8KICAgICAgICAgICAgICBsZXQgKG5hbWUsZnQsaWQpID1pcHJvdCNyZWFkRmllbGRCZWdpbiBpbgotICAgICAgICAgICAgICAgaWYgZnQgPSBQcm90b2NvbC5UX1NUT1AgdGhlbgotICAgICAgICAgICAgICAgICByYWlzZSBCcmVhaworICAgICAgICAgICAgICAgaWYgZnQgPSBQcm90b2NvbC5UX1NUT1AKKyAgICAgICAgICAgICAgIHRoZW4gcmFpc2UgQnJlYWsKICAgICAgICAgICAgICAgIGVsc2UgKCk7CiAgICAgICAgICAgICAgICAobWF0Y2ggaWQgd2l0aAotICAgICAgICAgICAgIHwgMSAtPiAoaWYgZnQgPSBQcm90b2NvbC5UX1NUUklORyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXNnIDo9IChpcHJvdCNyZWFkU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgIGlwcm90I3NraXAgZnQpCi0gICAgICAgICAgICAgfCAyIC0+IChpZiBmdCA9IFByb3RvY29sLlRfSTMyIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXAgOj0gaXByb3QjcmVhZEkzMgotICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgIGlwcm90I3NraXAgZnQpCisgICAgICAgICAgICAgfCAxIC0+IChpZiBmdCA9IFByb3RvY29sLlRfU1RSSU5HCisgICAgICAgICAgICAgICB0aGVuIG1zZyA6PSAoaXByb3QjcmVhZFN0cmluZykKKyAgICAgICAgICAgICAgIGVsc2UgaXByb3Qjc2tpcCBmdCkKKyAgICAgICAgICAgICB8IDIgLT4gKGlmIGZ0ID0gUHJvdG9jb2wuVF9JMzIKKyAgICAgICAgICAgICAgIHRoZW4gdHlwIDo9IGlwcm90I3JlYWRJMzIKKyAgICAgICAgICAgICAgIGVsc2UgaXByb3Qjc2tpcCBmdCkKICAgICAgICAgICAgICB8IF8gLT4gaXByb3Qjc2tpcCBmdCk7CiAgICAgICAgICAgICAgICBpcHJvdCNyZWFkRmllbGRFbmQKICAgICAgIGRvbmUKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC91cmwgYi9saWIvb2NhbWwvdXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGQ2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvdXJsCkBAIC0wLDAgKzEsMiBAQAorYXJjaGl2ZTogIlhYWChGSUxMIE1FIElOIFdJVEggVVJMKSIKK2NoZWNrc3VtOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBNRDUpIgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTUFOSUZFU1QuU0tJUCBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2M2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKQEAgLTAsMCArMSwxMyBAQAorYmxpYi8uKiQKK2J1aWxkLWNwYW4tZGlzdC5zaAorRml4dXBEaXN0LnBsCitNQU5JRkVTVC5iYWsKK01BTklGRVNULlNLSVAKK01ZTUVUQS5qc29uCitNYWtlZmlsZQorTWFrZWZpbGUuYW0KK01ha2VmaWxlLmluCitwbV90b19ibGliCit0ZXN0L01ha2VmaWxlLmFtCit0ZXN0L01ha2VmaWxlLmluCit0b29scy9GaXh1cERpc3QucGwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLlBMIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKaW5kZXggOTRlYTM3Yy4uYmRlYWFkMiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuUEwKKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKQEAgLTE3LDEzICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKIHVzZSBFeHRVdGlsczo6TWFrZU1ha2VyOwotV3JpdGVNYWtlZmlsZSggJ05BTUUnID0+ICdUaHJpZnQnLAotICAgICAgICAgICAgICAgJ1ZFUlNJT05fRlJPTScgPT4gJ2xpYi9UaHJpZnQucG0nLAotICAgICAgICAgICAgICAgJ1BSRVJFUV9QTScgICAgICAgICAgICAgID0+IHsKLSAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InID0+IDAsCisKK1dyaXRlTWFrZWZpbGUoIEFCU1RSQUNUID0+ICdBcGFjaGUgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nLAorICAgICAgICAgICAgICAgQVVUSE9SID0+ICdBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+JywKKyAgICAgICAgICAgICAgIExJQ0VOU0UgPT4gJ2FwYWNoZV8yXzAnLAorICAgICAgICAgICAgICAgTUlOX1BFUkxfVkVSU0lPTiA9PiAnNS4wMTAwMDAnLAorICAgICAgICAgICAgICAgTkFNRSA9PiAnVGhyaWZ0JywKKyAgICAgICAgICAgICAgIE5FRURTX0xJTktJTkcgPT4gMCwKKyAgICAgICAgICAgICAgIFBSRVJFUV9QTSA9PiB7CisgICAgICAgICAgICAgICAgICAgJ0JpdDo6VmVjdG9yJyAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAnQ2xhc3M6OkFjY2Vzc29yJyA9PiAwCiAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgKCRdID49IDUuMDA1ID8KLSAoICAgICAgICAgICAgICAgIEFVVEhPUiAgICAgPT4gJ1QgSmFrZSBMdWNpYW5pIDxqYWtlcnNAZ21haWwuY29tPicpIDogKCkpLAotICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgIFZFUlNJT05fRlJPTSA9PiAnbGliL1RocmlmdC5wbScgKTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLmFtIGIvbGliL3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggOGUwY2FhZS4uZmEwZjE2YiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuYW0KQEAgLTIzLDMzICsyMyw4NiBAQAogCSQoUEVSTCkgTWFrZWZpbGUuUEwgTUFLRUZJTEU9TWFrZWZpbGUtcGVybC5tayBJTlNUQUxMRElSUz0kKElOU1RBTExESVJTKSBJTlNUQUxMX0JBU0U9JChQRVJMX1BSRUZJWCkKIAogYWxsLWxvY2FsOiBNYWtlZmlsZS1wZXJsLm1rCi0JJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rCisJJChNQUtFKSAtZiAkPAogCWZpbmQgYmxpYiAtbmFtZSAnTWFrZWZpbGUqJyAtZXhlYyBybSAtZiB7fSBcOwogCi1jaGVjay1sb2NhbDoKLQkkKFBFUkwpIC1JYmxpYi9saWIgLUlAYWJzX3NyY2RpckAgLUlAYnVpbGRkaXJAL3Rlc3QvZ2VuLXBlcmwgXAotCQlAYWJzX3NyY2RpckAvdGVzdC5wbCBAYWJzX3NyY2RpckAvdGVzdC8qLnQKLQogaW5zdGFsbC1leGVjLWxvY2FsOiBNYWtlZmlsZS1wZXJsLm1rCi0JJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rIGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpLworCSQoTUFLRSkgLWYgJDwgaW5zdGFsbCBERVNURElSPSQoREVTVERJUikvCiAKIGNsZWFuLWxvY2FsOgogCWlmIHRlc3QgLWYgTWFrZWZpbGUtcGVybC5tayA7IHRoZW4gXAogCQkkKE1BS0UpIC1mIE1ha2VmaWxlLXBlcmwubWsgY2xlYW4gOyBcCiAJZmkKLQlybSAtZiBNYWtlZmlsZS1wZXJsLm1rLm9sZAorCSQoUk0pIE1ha2VmaWxlLXBlcmwubWsub2xkCisJJChSTSkgLXIgZ2VuLXBlcmwgZ2VuLXBlcmwyCiAKIEVYVFJBX0RJU1QgPSBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJYnVpbGQtY3Bhbi1kaXN0LnNoIFwKIAlNYWtlZmlsZS5QTCBcCiAJdGVzdC5wbCBcCiAJbGliL1RocmlmdC5wbSBcCiAJbGliL1RocmlmdC5wbSBcCiAJbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbSBcCiAJbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbSBcCisJbGliL1RocmlmdC9FeGNlcHRpb24ucG0gXAogCWxpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtIFwKIAlsaWIvVGhyaWZ0L0h0dHBDbGllbnQucG0gXAogCWxpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtIFwKKwlsaWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtIFwKKwlsaWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtIFwKKwlsaWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0gXAogCWxpYi9UaHJpZnQvUHJvdG9jb2wucG0gXAorCWxpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0gXAogCWxpYi9UaHJpZnQvU2VydmVyLnBtIFwKKwlsaWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbSBcCiAJbGliL1RocmlmdC9Tb2NrZXQucG0gXAotCWxpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCisJbGliL1RocmlmdC9TU0xTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBcCisJbGliL1RocmlmdC9UeXBlLnBtIFwKKwlsaWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBcCisJUkVBRE1FLm1kCisKK1RIUklGVCA9IEB0b3BfYnVpbGRkaXJAL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RIUklGVF9JRiA9IEB0b3Bfc3JjZGlyQC90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitOQU1FX0JFTkNITUFSS1NFUlZJQ0UgPSAgQHRvcF9zcmNkaXJAL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorTkFNRV9BR0dSID0gQHRvcF9zcmNkaXJAL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAorCitUSFJJRlRURVNUX0dFTiA9IFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9TZWNvbmRTZXJ2aWNlLnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1RocmlmdFRlc3QucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG0KKworQkVOQ0hNQVJLX0dFTiA9IFwKKwlnZW4tcGVybC9CZW5jaG1hcmtTZXJ2aWNlLnBtIFwKKwlnZW4tcGVybC9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsL1R5cGVzLnBtCisKK0FHR1JfR0VOID0gXAorCWdlbi1wZXJsMi9BZ2dyLnBtIFwKKwlnZW4tcGVybDIvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybDIvVHlwZXMucG0KKworUEVSTF9HRU4gPSBcCisJJChUSFJJRlRURVNUX0dFTikgXAorCSQoQkVOQ0hNQVJLX0dFTikgXAorCSQoQUdHUl9HRU4pCisKK0JVSUxUX1NPVVJDRVMgPSAkKFBFUkxfR0VOKQorCitjaGVjay1sb2NhbDogJChQRVJMX0dFTikKKwkkKFBFUkwpIC1JYmxpYi9saWIgLUlAYWJzX3NyY2RpckAgLUlAYnVpbGRkaXJAL2dlbi1wZXJsMiAtSUBidWlsZGRpckAvZ2VuLXBlcmwgXAorCQlAYWJzX3NyY2RpckAvdGVzdC5wbCBAYWJzX3NyY2RpckAvdGVzdC8qLnQKKworJChUSFJJRlRURVNUX0dFTik6ICQoVEhSSUZUX0lGKSAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAkPAorCiskKEJFTkNITUFSS19HRU4pOiAkKE5BTUVfQkVOQ0hNQVJLU0VSVklDRSkgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgJDwKKworJChBR0dSX0dFTik6ICQoTkFNRV9BR0dSKSAkKFRIUklGVCkKKwkkKE1LRElSX1ApIGdlbi1wZXJsMgorCSQoVEhSSUZUKSAtb3V0IGdlbi1wZXJsMiAtLWdlbiBwZXJsICQ8CmRpZmYgLS1naXQgYS9saWIvcGVybC9SRUFETUUgYi9saWIvcGVybC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTQ4OGIuLjAwMDAwMDAKLS0tIGEvbGliL3BlcmwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotVGhyaWZ0IFBlcmwgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBQZXJsCi09PT09PT09PT09PT09PT09PT09PT0KLQotVGhyaWZ0IHJlcXVpcmVzIFBlcmwgPj0gNS42LjAKLQotRXhjZXB0aW9ucyBhcmUgdGhyb3duIHdpdGggZGllIHNvIGJlIHN1cmUgdG8gd3JhcCBldmFse30gc3RhdG1lbnRzCi1hcm91bmQgYW55IGNvZGUgdGhhdCBjb250YWlucyBleGNlcHRpb25zLgotCi1UaGUgNjRiaXQgSW50ZWdlcnMgd29yayBvbmx5IHVwdG8gMl40MiBvbiBteSBtYWNoaW5lIDotPwotTWF0aDo6QmlnSW50IGlzIHByb2JhYmx5IG5lZWRlZC4KLQotUGxlYXNlIHNlZSB0dXRvcmFsIGFuZCB0ZXN0IGRpcnMgZm9yIGV4YW1wbGVzLi4uCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLUJpdDo6VmVjdG9yICAgICAtIGNvbWVzIHdpdGggbW9kZXJuIHBlcmwgaW5zdGFsbGF0aW9ucy4KLUNsYXNzOjpBY2Nlc3NvcgotCmRpZmYgLS1naXQgYS9saWIvcGVybC9SRUFETUUubWQgYi9saWIvcGVybC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZTViMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL1JFQURNRS5tZApAQCAtMCwwICsxLDEyNCBAQAorVGhyaWZ0IFBlcmwgU29mdHdhcmUgTGlicmFyeQorCisjIFN1bW1hcnkKKworQXBhY2hlIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuCitJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yaworZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIEEgbGFuZ3VhZ2UtbmV1dHJhbCBJREwKK2lzIHVzZWQgdG8gZ2VuZXJhdGUgZnVuY3Rpb25pbmcgY2xpZW50IGxpYnJhcmllcyBhbmQgc2VydmVyLXNpZGUgaGFuZGxpbmcgZnJhbWV3b3Jrcy4KKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZvciBNb3JlIEluZm9ybWF0aW9uCisKK1NlZSB0aGUgW0FwYWNoZSBUaHJpZnQgV2ViIFNpdGVdKGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIFBlcmwKKworVGhyaWZ0IHJlcXVpcmVzIFBlcmwgPj0gNS4xMC4wCisKK1VuZXhwZWN0ZWQgZXhjZXB0aW9ucyBpbiBhIHNlcnZpY2UgaGFuZGxlciBhcmUgY29udmVydGVkIHRvCitUQXBwbGljYXRpb25FeGNlcHRpb24gd2l0aCB0eXBlIElOVEVSTkFMIEVSUk9SIGFuZCB0aGUgc3RyaW5nCitvZiB0aGUgZXhjZXB0aW9uIGlzIGRlbGl2ZXJlZCBhcyB0aGUgbWVzc2FnZS4KKworT24gdGhlIGNsaWVudCBzaWRlLCBleGNlcHRpb25zIGFyZSB0aHJvd24gd2l0aCBkaWUsIHNvIGJlIHN1cmUKK3RvIHdyYXAgZXZhbHt9IHN0YXRtZW50cyBhcm91bmQgYW55IGNvZGUgdGhhdCBjb250YWlucyBleGNlcHRpb25zLgorCitQbGVhc2Ugc2VlIHR1dG9yYWwgYW5kIHRlc3QgZGlycyBmb3IgZXhhbXBsZXMuCisKK1RoZSBQZXJsIEZvcmtpbmdTZXJ2ZXIgaWdub3JlcyBTSUdDSExEIGFsbG93aW5nIHRoZSBmb3JrcyB0byBiZQorcmVhcGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hdHVyYWxseSB3aGVuIHRoZXkgZXhpdC4gIFRoaXMgbWVhbnMKK29uZSBjYW5ub3QgdXNlIGEgY3VzdG9tIFNJR0NITEQgaGFuZGxlciBpbiB0aGUgY29uc3VtaW5nIHBlcmwKK2ltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgc2VydmUoKS4gIEl0IGlzIGFjY2VwdGFibGUgdG8gdXNlCithIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgd2l0aGluIGEgdGhyaWZ0IGhhbmRsZXIgaW1wbGVtZW50YXRpb24KK2FzIHRoZSBGb3JraW5nU2VydmVyIHJlc2V0cyB0aGUgZm9ya2VkIGNoaWxkIHByb2Nlc3MgdG8gdXNlCitkZWZhdWx0IHNpZ25hbCBoYW5kbGluZy4KKworIyBEZXBlbmRlbmNpZXMKKworVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBub3QgcHJvdmlkZWQgYnkgUGVybCA1LjEwLjAgYnV0IGFyZSByZXF1aXJlZAordG8gdXNlIFRocmlmdC4KKworIyMgUnVudGltZQorCisgICogQml0OjpWZWN0b3IKKyAgKiBDbGFzczo6QWNjZXNzb3IKKworIyMjIEh0dHBDbGllbnQgVHJhbnNwb3J0CisKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIFRocmlmdDo6SHR0cENsaWVudDoKKworICAqIEhUVFA6OlJlcXVlc3QKKyAgKiBJTzo6U3RyaW5nCisgICogTFdQOjpVc2VyQWdlbnQKKworIyMjIFNTTC9UTFMKKworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgVGhyaWZ0OjpTU0xTb2NrZXQgb3IgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ6CisKKyAgKiBJTzo6U29ja2V0OjpTU0wKKworIyBCcmVha2luZyBDaGFuZ2VzCisKKyMjIDAuMTAuMAorCitUaGUgc29ja2V0IGNsYXNzZXMgd2VyZSByZWZhY3RvcmVkIGluIDAuMTAuMCBzbyB0aGF0IHRoZXJlIGlzIG9uZSBwYWNrYWdlIHBlcgorZmlsZS4gIFRoaXMgbWVhbnMgYHVzZSBTb2NrZXQ7YCBubyBsb25nZXIgZGVmaW5lcyBTU0xTb2NrZXQuICBZb3UgY2FuIHVzZSB0aGlzCit0ZWNobmlxdWUgdG8gbWFrZSB5b3VyIGFwcGxpY2F0aW9uIHJ1biBhZ2FpbnN0IDAuMTAuMCBhcyB3ZWxsIGFzIGVhcmxpZXIgdmVyc2lvbnM6CisKK2BldmFsIHsgcmVxdWlyZSBUaHJpZnQ6OlNTTFNvY2tldDsgfSBvciBkbyB7IHJlcXVpcmUgVGhyaWZ0OjpTb2NrZXQ7IH1gCisKKyMjIDAuMTEuMAorCisgICogTmFtZXNwYWNlcyBvZiBwYWNrYWdlcyB0aGF0IHdlcmUgbm90IHNjb3BlZCB3aXRoaW4gVGhyaWZ0IGhhdmUgYmVlbiBmaXhlZC4KKyAgKiogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAqKiBURXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRFeGNlcHRpb24KKyAgKiogVE1lc3NhZ2VUeXBlIGlzIG5vdyBUaHJpZnQ6OlRNZXNzYWdlVHlwZQorICAqKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uCisgICoqIFRQcm90b2NvbEZhY3RvcnkgaXMgbm93IFRocmlmdDo6VFByb3RvY29sRmFjdG9yeQorICAqKiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24KKyAgKiogVFR5cGUgaXMgbm93IFRocmlmdDo6VFR5cGUKKworSWYgeW91IG5lZWQgYSBzaW5nbGUgdmVyc2lvbiBvZiB5b3VyIGNvZGUgdG8gd29yayB3aXRoIGJvdGggb2xkZXIgYW5kIG5ld2VyIHRocmlmdAorbmFtZXNwYWNlIGNoYW5nZXMsIHlvdSBjYW4gbWFrZSB0aGUgbmV3LCBjb3JyZWN0IG5hbWVzcGFjZXMgYmVoYXZlIGxpa2UgdGhlIG9sZCBvbmVzCitpbiB5b3VyIGZpbGVzIHdpdGggdGhpcyB0ZWNobmlxdWUgdG8gY3JlYXRlIGFuIGFsaWFzLCB3aGljaCB3aWxsIGFsbG93IHlvdSBjb2RlIHRvCitydW4gYWdhaW5zdCBlaXRoZXIgdmVyc2lvbiBvZiB0aGUgcGVybCBydW50aW1lIGZvciB0aHJpZnQ6CisKK2BCRUdJTiB7KlRUeXBlOjogPSAqVGhyaWZ0OjpUVHlwZTo6fWAKKworICAqIFBhY2thZ2VzIGZvdW5kIGluIFRocmlmdC5wbSB3ZXJlIG1vdmVkIGludG8gdGhlIFRocmlmdC8gZGlyZWN0b3J5IGluIHNlcGFyYXRlIGZpbGVzOgorICAqKiBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBub3cgaW4gVGhyaWZ0L0V4Y2VwdGlvbi5wbQorICAqKiBUaHJpZnQ6OlRFeGNlcHRpb24gaXMgbm93IGluIFRocmlmdC9FeGNlcHRpb24ucG0KKyAgKiogVGhyaWZ0OjpUTWVzc2FnZVR5cGUgaXMgbm93IGluIFRocmlmdC9NZXNzYWdlVHlwZS5wbQorICAqKiBUaHJpZnQ6OlRUeXBlIGlzIG5vdyBpbiBUaHJpZnQvVHlwZS5wbQorCitJZiB5b3UgbmVlZCB0byBtb2RpZnkgeW91ciBjb2RlIHRvIHdvcmsgYWdhaW5zdCBib3RoIG9sZGVyIG9yIG5ld2VyIHRocmlmdCB2ZXJzaW9ucywKK3lvdSBjYW4gZGVhbCB3aXRoIHRoZXNlIGNoYW5nZXMgaW4gYSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3YXkgaW4geW91ciBwcm9qZWN0cyB1c2luZyBldmFsOgorCitgZXZhbCAgeyByZXF1aXJlIFRocmlmdDo6RXhjZXB0aW9uOyByZXF1aXJlIFRocmlmdDo6TWVzc2FnZVR5cGU7IHJlcXVpcmUgVGhyaWZ0OjpUeXBlOyB9Cisgb3IgZG8geyByZXF1aXJlIFRocmlmdDsgfWAKKworIyBEZXByZWNhdGlvbnMKKworIyMgMC4xMS4wCisKK1RocmlmdDo6SHR0cENsaWVudCBzZXRSZWN2VGltZW91dCgpIGFuZCBzZXRTZW5kVGltZW91dCgpIGFyZSBkZXByZWNhdGVkLiAKK1VzZSBzZXRUaW1lb3V0IGluc3RlYWQuCisKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaCBiL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZTIyZTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFRoaXMgc2NyaXB0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgdGFnZ2luZyB0aGUgcmVwb3NpdG9yeSBhbmQgdXBkYXRpbmcKKyMgdGhlIHZlcnNpb24gZmlsZXMgZm9yIGEgcmVsZWFzZS4gIEl0IHdpbGwgY3JlYXRlIGEgQ1BBTiBhcmNoaXZlLiAgUnVuIHRoaXMKKyMgZnJvbSBpbnNpZGUgYSBkb2NrZXIgaW1hZ2UgbGlrZSB1YnVudHUteGVuaWFsLgorIworCitzZXQgLWUKKworcm0gLWYgTUFOSUZFU1QKK3JtIC1yZiBUaHJpZnQtKgorCisjIHNldHVwIGNwYW4gd2l0aG91dCBhIHByb21wdAorZWNobyB8IGNwYW4KK2NwYW4gaW5zdGFsbCBIVFRQOjpEYXRlCitjcGFuIGluc3RhbGwgQ1BBTgorY3BhbiBpbnN0YWxsIENQQU46Ok1ldGEgRXh0VXRpbHM6Ok1ha2VNYWtlciBKU09OOjpQUAorCitwZXJsIE1ha2VmaWxlLlBMCitybSBNWU1FVEEueW1sCittYWtlIG1hbmlmZXN0CittYWtlIGRpc3QKKworIworIyBXZSB1bnBhY2sgdGhlIGFyY2hpdmUgc28gd2UgY2FuIGFkZCB2ZXJzaW9uIG1ldGFkYXRhIGZvciBDUEFOCisjIHNvIHRoYXQgaXQgcHJvcGVybHkgaW5kZXhlcyBUaHJpZnQgYW5kIHJlbW92ZSB1bm5lY2Vzc2FyeSBmaWxlcy4KKyMKKworZWNobyAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitzZXQgLXgKKworRElTVEZJTEU9JChscyBUaHJpZnQqLmd6KQorTkVXRklMRT0ke0RJU1RGSUxFL3Qtdi90LX0KK2lmIFtbICIkRElTVEZJTEUiICE9ICIkTkVXRklMRSIgXV07IHRoZW4KKyAgICBtdiAkRElTVEZJTEUgJE5FV0ZJTEUKKyAgICBESVNURklMRT0iJE5FV0ZJTEUiCitmaQordGFyIHh6ZiAkRElTVEZJTEUKK3JtICRESVNURklMRQorRElTVERJUj0kKGxzIC1kIFRocmlmdCopCisjIGNwYW4gZG9lc24ndCBsaWtlICJUaHJpZnQtdjAubm4uMCBhcyBhIGRpcmVjdG9yeSBuYW1lCisjIG5lZWRzIHRvIGJlIFRocmlmdC0wLm5uLjAKK05FV0RJUj0ke0RJU1RESVIvdC12L3QtfQoraWYgW1sgIiRESVNURElSIiAhPSAiJE5FV0RJUiIgXV07IHRoZW4KKyAgICBtdiAkRElTVERJUiAkTkVXRElSCisgICAgRElTVERJUj0iJE5FV0RJUiIKK2ZpCitjZCAkRElTVERJUgorY3AgLXAgLi4vTWFrZWZpbGUuUEwgLgorcGVybCAuLi90b29scy9GaXh1cERpc3QucGwKK2NkIC4uCit0YXIgY3Z6ZiAkRElTVEZJTEUgJERJU1RESVIKK3JtIC1yICRESVNURElSCmRpZmYgLS1naXQgYS9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU4MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDIgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKS4KK0FkZGl0aW9uYWwgcGVybCBjb2Rpbmcgc3RhbmRhcmRzIGNhbiBiZSBmb3VuZCBpbiBbcGVybHN0eWxlXShodHRwOi8vcGVybGRvYy5wZXJsLm9yZy9wZXJsc3R5bGUuaHRtbCkuCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQppbmRleCA3YzkzOTUzLi5hYjQwOTMwIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KQEAgLTE3LDE2MSArMTcsMjAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLW91ciAkVkVSU0lPTiA9ICcwLjYuMSc7Ci0KLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogIwotIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIyBWZXJzaW9uaW5nCiAjCi1wYWNrYWdlIFRUeXBlOwotdXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwotdXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwotdXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwotdXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwotdXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwotdXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwotdXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwotdXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwotdXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKLXVzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Ci11c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwotdXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKLXVzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Ci11c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwotdXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKLXVzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Ci11c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OwotMTsKLQorIyBFdmVyeSBwZXJsIG1vZHVsZSBmb3IgVGhyaWZ0IHdpbGwgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uCisjIGRlY2xhcmF0aW9uLiAgRm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgY2hhbmdlIGl0IGJlbG93IHRvCisjIHNvbWV0aGluZyBsaWtlICJ2MC4xMS4wIiBhbmQgYWxsIG9mIHRoZSBwYWNrYWdlcyBpbiBhbGwKKyMgb2YgdGhlIGZpbGVzIHdpbGwgcGljayBpdCB1cCBmcm9tIGhlcmUuCiAjCi0jIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQwotIwotcGFja2FnZSBUTWVzc2FnZVR5cGU7Ci11c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Ci11c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Ci11c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Ci11c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7Ci0xOwogCi1wYWNrYWdlIFRocmlmdDo6VEV4Y2VwdGlvbjsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0xOwotCi1wYWNrYWdlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLXVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKLQotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgVU5LTk9XTl9NRVRIT0QgICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBJTlZBTElEX01FU1NBR0VfVFlQRSA9PiAyOwotdXNlIGNvbnN0YW50IFdST05HX01FVEhPRF9OQU1FICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1NFUVVFTkNFX0lEICAgICAgPT4gNDsKLXVzZSBjb25zdGFudCBNSVNTSU5HX1JFU1VMVCAgICAgICA9PiA1OwotCi1zdWIgbmV3IHsKLSAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0KLSAgICBteSAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKLQotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLQotc3ViIHJlYWQgewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRpbnB1dCA9IHNoaWZ0OwotCi0gICAgbXkgJHhmZXIgID0gMDsKLSAgICBteSAkZm5hbWUgPSB1bmRlZjsKLSAgICBteSAkZnR5cGUgPSAwOwotICAgIG15ICRmaWQgICA9IDA7Ci0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcJGZuYW1lKTsKLQotICAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcJGZuYW1lLCBcJGZ0eXBlLCBcJGZpZCk7Ci0gICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGxhc3Q7IG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgU1dJVENIOiBmb3IoJGZpZCkKLSAgICAgIHsKLSAgICAgICAgICAvMS8gJiYgZG97Ci0KLSAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJpbmcoXCRzZWxmLT57bWVzc2FnZX0pOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAvMi8gJiYgZG97Ci0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OkkzMikgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKFwkc2VsZi0+e2NvZGV9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfTsKLQotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgfQotCi0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLX0KLQotc3ViIHdyaXRlIHsKLSAgICBteSAkc2VsZiAgID0gc2hpZnQ7Ci0gICAgbXkgJG91dHB1dCA9IHNoaWZ0OwotCi0gICAgbXkgJHhmZXIgICA9IDA7Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLQotICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cmluZygkc2VsZi0+Z2V0TWVzc2FnZSgpKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIGlmICgkc2VsZi0+Z2V0Q29kZSgpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLX0KLQotc3ViIGdldE1lc3NhZ2UKLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Ci19Ci0KLXN1YiBnZXRDb2RlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OwotfQorcGFja2FnZSBUaHJpZnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCJ2MS4wLjAiKTsKIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCmluZGV4IDY0ZDc5NTguLmQ2MjUwOWEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQpAQCAtMTcsMjcgKzE3LDI5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwotCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAotdXNlIHV0Zjg7Ci11c2UgRW5jb2RlOwotCi11c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6UHJvdG9jb2w7Ci0KIHVzZSBCaXQ6OlZlY3RvcjsKK3VzZSBFbmNvZGU7Cit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlR5cGU7Cit1c2UgdXRmODsKIAogIwogIyBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlByb3RvY29sJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHVzZSBjb25zdGFudCBWRVJTSU9OX01BU0sgICA9PiAweGZmZmYwMDAwOwogdXNlIGNvbnN0YW50IFZFUlNJT05fMSAgICAgID0+IDB4ODAwMTAwMDA7Cit1c2UgY29uc3RhbnQgSVNfQklHX0VORElBTiAgPT4gdW5wYWNrKCdoKicsIHBhY2soJ3MnLCAxKSkgPX4gbS8wMS87CiAKIHN1YiBuZXcKIHsKQEAgLTY1LDcgKzY3LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3ViIHdyaXRlU3RydWN0QmVnaW57CitzdWIgd3JpdGVTdHJ1Y3RCZWdpbgorewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgICByZXR1cm4gMDsKQEAgLTk2LDcgKzk5LDcgQEAKIHN1YiB3cml0ZUZpZWxkU3RvcAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRocmlmdDo6VFR5cGU6OlNUT1ApOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbgpAQCAtMjExLDcgKzIxNCwxMiBAQAogICAgIG15ICR2YWx1ZT0gc2hpZnQ7CiAKICAgICBteSAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOwotICAgICRzZWxmLT57dHJhbnN9LT53cml0ZShzY2FsYXIgcmV2ZXJzZSgkZGF0YSksIDgpOworICAgIGlmIChJU19CSUdfRU5ESUFOKSB7CisgICAgICAkc2VsZi0+e3RyYW5zfS0+d3JpdGUoJGRhdGEsIDgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICRzZWxmLT57dHJhbnN9LT53cml0ZShzY2FsYXIgcmV2ZXJzZSgkZGF0YSksIDgpOworICAgIH0KICAgICByZXR1cm4gODsKIH0KIApAQCAtMjQ2LDE0ICsyNTQsMTYgQEAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRJMzIoXCR2ZXJzaW9uKTsKICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSA+IDApIHsKICAgICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spICE9IFZFUlNJT05fMSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKQorICAgICAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CiAgICAgICB9CiAgICAgICAkJHR5cGUgPSAkdmVyc2lvbiAmIDB4MDAwMDAwZmY7CiAgICAgICByZXR1cm4KICAgICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgICAkc2VsZi0+cmVhZFN0cmluZygkbmFtZSkgKwogICAgICAgICAgICRzZWxmLT5yZWFkSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQorICAgIH0KKyAgICBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQogICAgICAgcmV0dXJuCiAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAkc2VsZi0+cmVhZFN0cmluZ0JvZHkoJG5hbWUsICR2ZXJzaW9uKSArICMgdmVyc2lvbiBoZXJlIGhvbGRzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKQEAgLTI5MSw3ICszMDEsNyBAQAogCiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkQnl0ZSgkZmllbGRUeXBlKTsKIAotICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAkJGZpZWxkSWQgPSAwOwogICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQpAQCAtNDE5LDcgKzQyOSw3IEBACiAKICAgICBteSAoJGhpLCRsbyk9dW5wYWNrKCdOTicsJGRhdGEpOwogCi0gICAgbXkgJHZlYyA9IG5ldyBCaXQ6OlZlY3Rvcig2NCk7CisgICAgbXkgJHZlYyA9IEJpdDo6VmVjdG9yLT5uZXcoNjQpOwogCiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMzIsJGhpKTsKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwwLCRsbyk7CkBAIC00MzQsNyArNDQ0LDE0IEBACiAgICAgbXkgJHNlbGYgID0gc2hpZnQ7CiAgICAgbXkgJHZhbHVlID0gc2hpZnQ7CiAKLSAgICBteSAkZGF0YSA9IHNjYWxhciByZXZlcnNlKCRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpKTsKKyAgICBteSAkZGF0YTsKKyAgICBpZiAoSVNfQklHX0VORElBTikgeworICAgICAgJGRhdGEgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCg4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAkZGF0YSA9IHNjYWxhciByZXZlcnNlKCRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpKTsKKyAgICB9CisKICAgICBteSBAYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwogCiAgICAgJCR2YWx1ZSA9ICRhcnJbMF07CkBAIC00NTIsNyArNDY5LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00NjcsNyArNDg1LDggQEAKIAogICAgIGlmICgkbGVuKSB7CiAgICAgICAkJHZhbHVlID0gJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAkJHZhbHVlID0gJyc7CiAgICAgfQogCkBAIC00NzgsNyArNDk3LDggQEAKICMgQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Ci11c2UgYmFzZSgnVFByb3RvY29sRmFjdG9yeScpOwordXNlIGJhc2UoJ1RocmlmdDo6VFByb3RvY29sRmFjdG9yeScpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC00OTIsNyArNTEyLDcgQEAKICAgICBteSAkc2VsZiAgPSBzaGlmdDsKICAgICBteSAkdHJhbnMgPSBzaGlmdDsKIAotICAgIHJldHVybiBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnMpOworICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zKTsKIH0KIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCmluZGV4IDM4NjhjYTIuLjZiNWJmN2EgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQpAQCAtMTcsMTUgKzE3LDE3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKIHBhY2thZ2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICMgQnVmZmVyZWRUcmFuc3BvcnQgZmFjdG9yeSBjcmVhdGVzIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA0MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0KQEAgLTAsMCArMSwxNjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlR5cGU7CisKK3BhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2Ugb3ZlcmxvYWQgJyIiJyA9PiBzdWIgeworICAgIHJldHVybgorICAgICAgICBzcHJpbnRmICclcyBlcnJvcjogJXMgKGNvZGUgJXMpJywKKyAgICAgICAgICByZWYoICRfWzBdICksCisgICAgICAgICAgKCAkX1swXS0+e21lc3NhZ2V9IHx8ICdlbXB0eSBtZXNzYWdlJyApLAorICAgICAgICAgICggZGVmaW5lZCAkX1swXS0+e2NvZGV9ID8gJF9bMF0tPntjb2RlfSA6ICd1bmRlZmluZWQnICk7CisgICAgfTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3BhY2thZ2UgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb247Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlRFeGNlcHRpb24nOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICAgICA9PiAxOwordXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0+IDI7Cit1c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9PiA0OwordXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0+IDU7Cit1c2UgY29uc3RhbnQgSU5URVJOQUxfRVJST1IgICAgICAgICAgPT4gNjsKK3VzZSBjb25zdGFudCBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9PiA3OwordXNlIGNvbnN0YW50IElOVkFMSURfVFJBTlNGT1JNICAgICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPT4gOTsKK3VzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9PiAxMDsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIHJlYWQgeworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRpbnB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgID0gMDsKKyAgICBteSAkZm5hbWUgPSB1bmRlZjsKKyAgICBteSAkZnR5cGUgPSAwOworICAgIG15ICRmaWQgICA9IDA7CisKKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcJGZuYW1lKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcJGZuYW1lLCBcJGZ0eXBlLCBcJGZpZCk7CisgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgbGFzdDsgbmV4dDsKKyAgICAgICAgfQorCisgICAgICBTV0lUQ0g6IGZvcigkZmlkKQorICAgICAgeworICAgICAgICAgIC8xLyAmJiBkb3sKKworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORykgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgLzIvICYmIGRveworICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKFwkc2VsZi0+e2NvZGV9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgfTsKKworICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgfQorCisgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIHdyaXRlIHsKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJG91dHB1dCA9IHNoaWZ0OworCisgICAgbXkgJHhmZXIgICA9IDA7CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdDo6VFR5cGU6OlNUUklORywgMSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRzZWxmLT5nZXRNZXNzYWdlKCkpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKCRzZWxmLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0OjpUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gJHhmZXI7Cit9CisKK3N1YiBnZXRNZXNzYWdlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OworfQorCitzdWIgZ2V0Q29kZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KaW5kZXggYjc4YjE5OC4uYmE4OWJhMyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0KQEAgLTE3LDYgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0zMCw4ICszMSw4IEBACiAjIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKICMKIHBhY2thZ2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Ci0KIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC02OCw3ICs2OSw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e3RyYW5zcG9ydH0pIHsKKyAgICAgICAgJHNlbGYtPnt0cmFuc3BvcnR9LT5jbG9zZSgpOworICAgIH0KIH0KIAogIwpAQCAtMTYxLDQgKzE2NCwzMSBAQAogCiB9CiAKKyMKKyMgRnJhbWVkVHJhbnNwb3J0IGZhY3RvcnkgY3JlYXRlcyBmcmFtZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCisjCitwYWNrYWdlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSB7fTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgQnVpbGQgYSBmcmFtZWQgdHJhbnNwb3J0IGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0CisjCisjIEByZXR1cm4gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgdHJhbnNwb3J0CisjCitzdWIgZ2V0VHJhbnNwb3J0Cit7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHRyYW5zID0gc2hpZnQ7CisKKyAgICBteSAkYnVmZmVyZWQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC0+bmV3KCR0cmFucyk7CisgICAgcmV0dXJuICRidWZmZXJlZDsKK30KKwogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQppbmRleCBkNmZjOGJlLi40MGVjOWNlIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCkBAIC0xNywyNiArMTcsMjUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAordXNlIEhUVFA6OlJlcXVlc3Q7Cit1c2UgSU86OlN0cmluZzsKK3VzZSBMV1A6OlVzZXJBZ2VudDsKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKLXVzZSBIVFRQOjpSZXF1ZXN0OwotdXNlIExXUDo6VXNlckFnZW50OwotdXNlIElPOjpTdHJpbmc7Ci0KIHBhY2thZ2UgVGhyaWZ0OjpIdHRwQ2xpZW50OwotCiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkdXJsICAgICAgID0gc2hpZnQgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5MCc7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OwogCiAgICAgbXkgJG91dCA9IElPOjpTdHJpbmctPm5ldzsKICAgICBiaW5tb2RlKCRvdXQpOwpAQCAtNDQsNDQgKzQzLDQ0IEBACiAgICAgbXkgJHNlbGYgPSB7CiAgICAgICAgIHVybCAgICAgICAgICA9PiAkdXJsLAogICAgICAgICBvdXQgICAgICAgICAgPT4gJG91dCwKLSAgICAgICAgZGVidWdIYW5kbGVyID0+ICRkZWJ1Z0hhbmRsZXIsCi0gICAgICAgIGRlYnVnICAgICAgICA9PiAwLAotICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwLAotICAgICAgICByZWN2VGltZW91dCAgPT4gNzUwLAorICAgICAgICB0aW1lb3V0ICAgICAgPT4gMTAwLAogICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIGhlYWRlcnMgICAgICA9PiB7fSwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCitzdWIgc2V0VGltZW91dAoreworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKworICAgICRzZWxmLT57dGltZW91dH0gPSAkdGltZW91dDsKK30KKworc3ViIHNldFJlY3ZUaW1lb3V0Cit7CisgICAgd2FybiAnc2V0UmVjdlRpbWVvdXQgaXMgZGVwcmVjYXRlZCAtIHVzZSBzZXRUaW1lb3V0IGluc3RlYWQnOworICAgICMgbm90ZTogcmVjdlRpbWVvdXQgd2FzIG5ldmVyIHVzZWQgc28gd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZQorfQorCiBzdWIgc2V0U2VuZFRpbWVvdXQKIHsKICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CiAKLSAgICAkc2VsZi0+e3NlbmRUaW1lb3V0fSA9ICR0aW1lb3V0OworICAgIHdhcm4gJ3NldFNlbmRUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKworICAgICRzZWxmLT5zZXRUaW1lb3V0KCR0aW1lb3V0KTsKIH0KIAotc3ViIHNldFJlY3ZUaW1lb3V0CitzdWIgc2V0SGVhZGVyCiB7Ci0gICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKLSAgICBteSAkdGltZW91dCA9IHNoaWZ0OworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gQF87CiAKLSAgICAkc2VsZi0+e3JlY3ZUaW1lb3V0fSA9ICR0aW1lb3V0OwotfQotCi0KLSMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKKyAgICAkc2VsZi0+e2hlYWRlcnN9LT57JG5hbWV9ID0gJHZhbHVlOwogfQogCiAjCkBAIC0xMDMsOCArMTAyLDggQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIGlmIChkZWZpbmVkKCRzZWxmLT57aW99KSkgewotICAgICAgY2xvc2UoJHNlbGYtPntpb30pOwotICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKKyAgICAgICAgY2xvc2UoJHNlbGYtPntpb30pOworICAgICAgICAkc2VsZi0+e2lvfSA9IHVuZGVmOwogICAgIH0KIH0KIApAQCAtMTIyLDcgKzEyMSw4IEBACiAgICAgbXkgJGJ1ZiA9ICRzZWxmLT5yZWFkKCRsZW4pOwogCiAgICAgaWYgKCFkZWZpbmVkKCRidWYpKSB7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXInKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAkbGVuIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICByZXR1cm4gJGJ1ZjsKIH0KQEAgLTE0MCwxNSArMTQwLDE4IEBACiAgICAgbXkgJGluID0gJHNlbGYtPntpbn07CiAKICAgICBpZiAoIWRlZmluZWQoJGluKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICBldmFsIHsKLSAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7Ci0gICAgICBpZiAoISBkZWZpbmVkKCRyZXQpKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOwotICAgICAgfQotICAgIH07IGlmKCRAKXsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRAKTsKKyAgICAgICAgbXkgJHJldCA9IHN5c3JlYWQoJGluLCAkYnVmLCAkbGVuKTsKKyAgICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgeworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdObyBtb3JlIGRhdGEgYXZhaWxhYmxlLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKKyAgICAgICAgfQorICAgIH07CisgICAgaWYoJEApeworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIiRAIiwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKICAgICB9CiAKICAgICByZXR1cm4gJGJ1ZjsKQEAgLTE3MSw4ICsxNzQsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKLSAgICBteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCd0aW1lb3V0JyA9PiAoJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwKSwKLSAgICAgICdhZ2VudCcgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCisgICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygKKyAgICAgICAgJ3RpbWVvdXQnID0+ICgkc2VsZi0+e3RpbWVvdXR9IC8gMTAwMCksCisgICAgICAgICdhZ2VudCcgICA9PiAnUGVybC9USHR0cENsaWVudCcKICAgICAgKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwogICAgICR1YS0+ZGVmYXVsdF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CkBAIC0xODIsNyArMTg2LDcgQEAKICAgICAkb3V0LT5zZXRwb3MoMCk7ICMgcmV3aW5kCiAgICAgbXkgJGJ1ZiA9IGpvaW4oJycsIDwkb3V0Pik7CiAKLSAgICBteSAkcmVxdWVzdCA9IG5ldyBIVFRQOjpSZXF1ZXN0KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCB1bmRlZiwgJGJ1Zik7CisgICAgbXkgJHJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoUE9TVCA9PiAkc2VsZi0+e3VybH0sICgkc2VsZi0+e2hlYWRlcnN9IHx8IHVuZGVmKSwgJGJ1Zik7CiAgICAgbXkgJHJlc3BvbnNlID0gJHVhLT5yZXF1ZXN0KCRyZXF1ZXN0KTsKICAgICBteSAkY29udGVudF9yZWYgPSAkcmVzcG9uc2UtPmNvbnRlbnRfcmVmOwogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCmluZGV4IDBiMjg2ODcuLmJlOTdjZTQgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTI2LDYgKzI2LDcgQEAKIAogcGFja2FnZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0zNCwxMCArMzUsMTAgQEAKICAgICBteSAkYnVmZmVyU2l6ZT0gc2hpZnQgfHwgMTAyNDsKIAogICAgIG15ICRzZWxmID0gewotICAgICAgICBidWZmZXIgICAgPT4gJycsCi0gICAgICAgIGJ1ZmZlclNpemU9PiAkYnVmZmVyU2l6ZSwKLSAgICAgICAgd1BvcyAgICAgID0+IDAsCi0gICAgICAgIHJQb3MgICAgICA9PiAwLAorICAgICAgICBidWZmZXIgICAgID0+ICcnLAorICAgICAgICBidWZmZXJTaXplID0+ICRidWZmZXJTaXplLAorICAgICAgICB3UG9zICAgICAgID0+IDAsCisgICAgICAgIHJQb3MgICAgICAgPT4gMCwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtMTE2LDcgKzExNyw4IEBACiAKICAgICBteSAkYXZhaWwgPSAoJHNlbGYtPnt3UG9zfSAtICRzZWxmLT57clBvc30pOwogICAgIGlmICgkYXZhaWwgPCAkbGVuKSB7Ci0gICAgICAgIGRpZSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIpOworICAgICAgICBkaWUgVFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJBdHRlbXB0IHRvIHJlYWRBbGwoJGxlbikgZm91bmQgb25seSAkYXZhaWwgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KIAogICAgIG15ICRkYXRhID0gJyc7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjVjMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7CisKKyMKKyMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisjCitwYWNrYWdlIFRocmlmdDo6VE1lc3NhZ2VUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Cit1c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Cit1c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpAQCAtMCwwICsxLDEzMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKKworcGFja2FnZSBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3IpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRmbmFtZSAgPSBzaGlmdDsKKyAgICBteSAkbXR5cGUgID0gc2hpZnQ7CisgICAgbXkgJHJzZXFpZCAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbCk7CisKKyAgICAkc2VsZi0+e2ZuYW1lfSA9ICRmbmFtZTsKKyAgICAkc2VsZi0+e210eXBlfSA9ICRtdHlwZTsKKyAgICAkc2VsZi0+e3JzZXFpZH0gPSAkcnNlcWlkOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkdHlwZSA9IHNoaWZ0OworICAgIG15ICRzZXFpZCA9IHNoaWZ0OworCisgICAgJCRuYW1lID0gJHNlbGYtPntmbmFtZX07CisgICAgJCR0eXBlID0gJHNlbGYtPnttdHlwZX07CisgICAgJCRzZXFpZCA9ICRzZWxmLT57cnNlcWlkfTsKK30KKworcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9IHt9OworCisgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfSA9IHt9OworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSB1bmRlZjsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIGRlZmF1bHRQcm9jZXNzb3IgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OworCisgICAgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSA9ICRwcm9jZXNzb3I7Cit9CisKK3N1YiByZWdpc3RlclByb2Nlc3NvciB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc2VydmljZU5hbWUgPSBzaGlmdDsKKyAgICBteSAkcHJvY2Vzc29yID0gc2hpZnQ7CisKKyAgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0gPSAkcHJvY2Vzc29yOworfQorCitzdWIgcHJvY2VzcyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaW5wdXQgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICAjCisgICAgIyAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAjICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAjICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAjCisKKyAgICBteSAoJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOworICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZuYW1lLCBcJG10eXBlLCBcJHJzZXFpZCk7CisKKyAgICBpZiAoJG10eXBlIG5lIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPycpOworICAgIH0KKworICAgICMgRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICBpZiAoaW5kZXgoJGZuYW1lLCBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT0gLTEpIHsKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSkgeworICAgICAgICAgICAgcmV0dXJuICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0tPnByb2Nlc3MoCisgICAgICAgICAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9IGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBkZWZpbmVkLiBEaWQgeW91ICIgLgorICAgICAgICAgICAgICAgICdmb3JnZXQgdG8gdXNlIGEgTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Jyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAobXkgJHNlcnZpY2VOYW1lLCBteSAkbWVzc2FnZU5hbWUpID0gc3BsaXQoJzonLCAkZm5hbWUsIDIpOworCisgICAgaWYgKCFleGlzdHMoJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0pKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICd0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Jyk7CisgICAgfQorCisgICAgIyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgbXkgJHByb2Nlc3NvciA9ICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9OworICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbC0+bmV3KCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0CisgICAgKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjViNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKKworcGFja2FnZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFNFUEFSQVRPUiAgPT4gJzonOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRzZXJ2aWNlTmFtZSAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wpOworCisgICAgJHNlbGYtPntzZXJ2aWNlTmFtZX0gPSAkc2VydmljZU5hbWU7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyMgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUi4KKyMKKyMgQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZS4KKyMgQHBhcmFtIGludCAgICAkdHlwZSAgTWVzc2FnZSB0eXBlLgorIyBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgorIworc3ViIHdyaXRlTWVzc2FnZUJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87CisKKyAgICBpZiAoJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICBteSAkbmFtZVdpdGhTZXJ2aWNlID0gJHNlbGYtPntzZXJ2aWNlTmFtZX0uU0VQQVJBVE9SLiRuYW1lOworICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgfQorfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KaW5kZXggZTI4MDFmZS4uMjZlZjQ2YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCkBAIC0xNywyMyArMTcsMjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6OlR5cGU7CiAKICMKICMgUHJvdG9jb2wgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUUHJvdG9jb2xFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOwogdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICA9PiAwOwotdXNlIGNvbnN0YW50IElOVkFMSURfREFUQSAgPT4gMTsKLXVzZSBjb25zdGFudCBORUdBVElWRV9TSVpFID0+IDI7Ci11c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICA9PiAzOwotdXNlIGNvbnN0YW50IEJBRF9WRVJTSU9OICAgPT4gNDsKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgPT4gMDsKK3VzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgICAgPT4gMTsKK3VzZSBjb25zdGFudCBORUdBVElWRV9TSVpFICAgPT4gMjsKK3VzZSBjb25zdGFudCBTSVpFX0xJTUlUICAgICAgPT4gMzsKK3VzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgICAgPT4gNDsKK3VzZSBjb25zdGFudCBOT1RfSU1QTEVNRU5URUQgPT4gNTsKK3VzZSBjb25zdGFudCBERVBUSF9MSU1JVCAgICAgPT4gNjsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNDcsNiArNTIsNyBAQAogIyBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KICMKIHBhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNzUsMzcgKzgxLDM3IEBACiBzdWIgd3JpdGVNZXNzYWdlQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIENsb3NlIHRoZSBtZXNzYWdlCiAjCiBzdWIgd3JpdGVNZXNzYWdlRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgogIwogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0QmVnaW4gewogICAgIG15ICgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSBhIHN0cnVjdC4KICMKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNCw4NSArMTIwLDg1IEBACiAjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKICMgQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQogIyBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlRmllbGRCZWdpbiB7CiAgICAgbXkgKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUZpZWxkU3RvcCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEJlZ2luIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTWFwRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTGlzdEJlZ2luIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTZXRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCb29sIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVCeXRlIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJMTYgewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTMyIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUk2NCB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVEb3VibGUgewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0yMDUsNyArMjExLDcgQEAKIHN1YiByZWFkTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjEzLDEwNSArMjE5LDEwNSBAQAogIwogc3ViIHJlYWRNZXNzYWdlRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0QmVnaW4KIHsKICAgICBteSgkbmFtZSk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJ1Y3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRGaWVsZEJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBCZWdpbgogewogICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRNYXBFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRMaXN0QmVnaW4KIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFNldEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJvb2wKIHsKICAgICBteSAoJGJvb2wpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEJ5dGUKIHsKICAgICBteSAoJGJ5dGUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEkxNgogewogICAgIG15ICgkaTE2KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMzIKIHsKICAgICBteSAoJGkzMik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTY0CiB7CiAgICAgbXkgKCRpNjQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZERvdWJsZQogewogICAgIG15ICgkZHViKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJpbmcKIHsKICAgICBteSAoJHN0cik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTMyOSwzNiArMzM1LDM2IEBACiAgICAgbXkgJHJlc3VsdDsKICAgICBteSAkaTsKIAotICAgIGlmKCR0eXBlID09IFRUeXBlOjpCT09MKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCb29sKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRCeXRlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTE2KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkzMil7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTMyKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Okk2NCl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkSTY0KFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkRPVUJMRSl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkRG91YmxlKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUklORykKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcpCiAgICAgewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRTdHJpbmcoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U1RSVUNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUlVDVCkKICAgICB7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFN0cnVjdEJlZ2luKFwkcmVmKTsKICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgIG15ICgkZnR5cGUsJGZpZCk7CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkRmllbGRCZWdpbihcJHJlZiwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXAoJGZ0eXBlKTsKQEAgLTM2Nyw3ICszNzMsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU3RydWN0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgIG15KCRrZXlUeXBlLCR2YWxUeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkTWFwQmVnaW4oXCRrZXlUeXBlLCBcJHZhbFR5cGUsIFwkc2l6ZSk7CkBAIC0zNzgsNyArMzg0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZE1hcEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQpCiAgICAgewogICAgICAgICBteSAoJGVsZW1UeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkU2V0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTM4OCw3ICszOTQsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkU2V0RW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpMSVNUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZExpc3RCZWdpbihcJGVsZW1UeXBlLCBcJHNpemUpOwpAQCAtMzk5LDcgKzQwNSw4IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUeXBlICR0eXBlIG5vdCByZWNvZ25pc2VkIC0tLSBjb3JydXB0IGRhdGE/Iik7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiAKICAgfQogCkBAIC00MTUsMzEgKzQyMiwzMSBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkdHlwZSAgID0gc2hpZnQ7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKLSAgICB7Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkJZVEUpCisgICAgaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6Qk9PTCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STE2KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJZVEUpCisgICAgeworICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICB9CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STE2KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STY0KQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6RE9VQkxFKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSSU5HICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HICkKICAgICB7CiAgICAgICAgIG15IEBsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKICAgICAgICAgbXkgJGxlbiA9ICRsZW5bMF07CkBAIC00NDgsMjUgKzQ1NSwyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKICAgICB9Ci0gICAgZWxzaWYoICR0eXBlID09IFRUeXBlOjpTVFJVQ1QgKQorICAgIGVsc2lmKCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QgKQogICAgIHsKICAgICAgICAgbXkgJHJlc3VsdCA9IDA7CiAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgbXkgJGZ0eXBlID0gMDsKLSAgICAgICAgICBteSAkZmlkID0gMDsKLSAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICAgbXkgQGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgICMgSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKKyAgICAgICAgICAgIG15ICRmdHlwZSA9IDA7CisgICAgICAgICAgICBteSAkZmlkID0gMDsKKyAgICAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAkZnR5cGUgPSAkYXJyWzBdOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICMgSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpNQVApCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TUFQKQogICAgIHsKICAgICAgICAgIyBLdHlwZQogICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CkBAIC00OTAsNyArNDk3LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNFVCB8fCAkdHlwZSA9PSBUVHlwZTo6TElTVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgICMgVnR5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNTEwLDE0ICs1MTcsMTUgQEAKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQogCi0gICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlR5cGUgJHR5cGUgbm90IHJlY29nbmlzZWQgLS0tIGNvcnJ1cHQgZGF0YT8iKTsKKyAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygiVHlwZSAkdHlwZSBub3QgcmVjb2duaXplZCAtLS0gY29ycnVwdCBkYXRhPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKIH0KIAogIwogIyBQcm90b2NvbCBmYWN0b3J5IGNyZWF0ZXMgcHJvdG9jb2wgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKLXBhY2thZ2UgVFByb3RvY29sRmFjdG9yeTsKLQorcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTUzNCw3ICs1NDIsNyBAQAogc3ViIGdldFByb3RvY29sCiB7CiAgICAgbXkgKCR0cmFucyk7Ci0gICAgZGllICJpbnRlcmZhY2UiOworICAgIGRpZSAnaW50ZXJmYWNlJzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzVjOWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpAQCAtMCwwICsxLDM2MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6UHJvdG9jb2w7CisKK3BhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2wpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOworCisgICAgJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfSA9ICRwcm90b2NvbDsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworIworIyBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorIyBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorIyBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisjCitzdWIgd3JpdGVNZXNzYWdlQmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgICByZXR1cm4gICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKK30KKworIworIyBDbG9zZSB0aGUgbWVzc2FnZQorIworc3ViIHdyaXRlTWVzc2FnZUVuZCB7CisgICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCisjCisjIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisjCisjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVTdHJ1Y3RCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7Cit9CisKKyMKKyMgQ2xvc2UgYSBzdHJ1Y3QuCisjCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVTdHJ1Y3RFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RFbmQoKTsKK30KKworIworIyBTdGFydHMgYSBmaWVsZC4KKyMKKyMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQorIyBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisjIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCisjIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisjCitzdWIgd3JpdGVGaWVsZEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworfQorCitzdWIgd3JpdGVGaWVsZEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkRW5kKCk7Cit9CisKK3N1YiB3cml0ZUZpZWxkU3RvcCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkU3RvcCgpOworfQorCitzdWIgd3JpdGVNYXBCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVNYXBFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNYXBFbmQoKTsKK30KKworc3ViIHdyaXRlTGlzdEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVMaXN0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOworfQorCitzdWIgd3JpdGVTZXRCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgd3JpdGVTZXRFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3N1YiB3cml0ZUJvb2wgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGJvb2wgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUJvb2woJGJvb2wpOworfQorCitzdWIgd3JpdGVCeXRlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRieXRlID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVCeXRlKCRieXRlKTsKK30KKworc3ViIHdyaXRlSTE2IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpMTYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUkxNigkaTE2KTsKK30KKworc3ViIHdyaXRlSTMyIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkaTMyKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTMyKCRpMzIpOworCit9CisKK3N1YiB3cml0ZUk2NCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTY0ID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJNjQoJGk2NCk7Cit9CisKK3N1YiB3cml0ZURvdWJsZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZHViID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVEb3VibGUoJGR1Yik7Cit9CisKK3N1YiB3cml0ZVN0cmluZyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RyID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJpbmcoJHN0cik7Cit9CisKKyMKKyMgUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorIyBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorIyBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisjCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworfQorCisjCisjIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyMKK3N1YiByZWFkTWVzc2FnZUVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworc3ViIHJlYWRTdHJ1Y3RCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworfQorCitzdWIgcmVhZFN0cnVjdEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cnVjdEVuZCgpOworfQorCitzdWIgcmVhZEZpZWxkQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKK30KKworc3ViIHJlYWRGaWVsZEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3N1YiByZWFkTWFwQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKK30KKworc3ViIHJlYWRNYXBFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBFbmQoKTsKK30KKworc3ViIHJlYWRMaXN0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiByZWFkTGlzdEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZExpc3RFbmQoKTsKK30KKworc3ViIHJlYWRTZXRCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgcmVhZFNldEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEVuZCgpOworfQorCitzdWIgcmVhZEJvb2wKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRib29sID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEJvb2woJGJvb2wpOworfQorCitzdWIgcmVhZEJ5dGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRieXRlID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEJ5dGUoJGJ5dGUpOworfQorCitzdWIgcmVhZEkxNgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGkxNiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJMTYoJGkxNik7Cit9CisKK3N1YiByZWFkSTMyCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTMyICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJMzIoJGkzMik7Cit9CisKK3N1YiByZWFkSTY0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTY0ICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRJNjQoJGk2NCk7Cit9CisKK3N1YiByZWFkRG91YmxlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZHViICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWREb3VibGUoJGR1Yik7Cit9CisKK3N1YiByZWFkU3RyaW5nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RyID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cmluZygkc3RyKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwNjQzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsNzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlNTTDsKKworcGFja2FnZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBUYWtlcyBhIGhhc2g6CisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBjYSAgICAgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGVuYW1lIC0gbm90IHJlcXVpcmVkCisjIEBwYXJhbVtpbl0gIGNlcnQgICBjZXJ0aWZpY2F0ZSBmaWxlbmFtZTsgbWF5IGNvbnRhaW4ga2V5IGluIHdoaWNoIGNhc2Uga2V5IGlzIG5vdCByZXF1aXJlZAorIyBAcGFyYW1baW5dICBrZXkgICAgcHJpdmF0ZSBrZXkgZmlsZW5hbWUgZm9yIHRoZSBjZXJ0aWZpY2F0ZSBpZiBpdCBpcyBub3QgaW5zaWRlIHRoZSBjZXJ0IGZpbGUKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldygpOworfQorCitzdWIgX19saXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRvcHRzID0ge0xpc3RlbiAgICAgICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgTG9jYWxBZGRyICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIExvY2FsUG9ydCAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFJldXNlQWRkciAgICAgPT4gMX07CisKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ5MjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KQEAgLTAsMCArMSwxMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlNTTDsKKworcGFja2FnZSBUaHJpZnQ6OlNTTFNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdGlvbiBhbmQgdXNhZ2UKKyMKKyMgbXkgJG9wdHMgPSB7fQorIyBteSAkc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldyhcJW9wdHMpOworIworIyBvcHRpb25zOgorIworIyBBbnkgb3B0aW9uIGZyb20gU29ja2V0LnBtIGlzIHZhbGlkLCBhbmQgdGhlbjoKKyMKKyMgY2EgICAgICAgICAgPT4gY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUgKFBFTSBmaWxlKSB0byBhdXRoZW50aWNhdGUgdGhlCisjICAgICAgICAgICAgICAgIHNlcnZlciBhZ2FpbnN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIHNlcnZlciBpcyBub3QKKyMgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZAorIyBjZXJ0ICAgICAgICA9PiBjZXJ0aWZpY2F0ZSB0byB1c2UgYXMgdGhlIGNsaWVudDsgaWYgbm90IHNwZWNpZmllZCB0aGVuCisjICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgZG9lcyBub3QgcHJlc2VudCBvbmUgYnV0IHN0aWxsIGNvbm5lY3RzIHVzaW5nCisjICAgICAgICAgICAgICAgIHNlY3VyZSBwcm90b2NvbAorIyBjaXBoZXJzICAgICA9PiBhbGxvd2VkIGNpcGhlciBsaXN0CisjICAgICAgICAgICAgICAgIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL2FwcHMvY2lwaGVycy5odG1sI0NJUEhFUl9TVFJJTkdTKQorIyBrZXkgICAgICAgICA9PiBjZXJ0aWZpY2F0ZSBrZXkgZm9yICJjZXJ0IiBvcHRpb24KKyMgdmVyc2lvbiAgICAgPT4gYWNjZXB0YWJsZSBTU0wvVExTIHZlcnNpb25zIC0gaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZQorIyAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIHVzZSBTU0x2MjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZQorIyAgICAgICAgICAgICAgICBhdCBUTFN2MS4wIG9yIGxhdGVyCisjCisKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG9wdHMgPSB7UGVlckFkZHIgICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIFBlZXJQb3J0ICAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFRpbWVvdXQgICAgICAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwfTsKKworICAgIG15ICR2ZXJpZnkgPSBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfUEVFUiB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKworICAgICRvcHRzLT57U1NMX2NhX2ZpbGV9ICAgICAgPSAkc2VsZi0+e2NhfSAgICAgIGlmIGRlZmluZWQgJHNlbGYtPntjYX07CisgICAgJG9wdHMtPntTU0xfY2VydF9maWxlfSAgICA9ICRzZWxmLT57Y2VydH0gICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NlcnR9OworICAgICRvcHRzLT57U1NMX2NpcGhlcl9saXN0fSAgPSAkc2VsZi0+e2NpcGhlcnN9IGlmIGRlZmluZWQgJHNlbGYtPntjaXBoZXJzfTsKKyAgICAkb3B0cy0+e1NTTF9rZXlfZmlsZX0gICAgID0gJHNlbGYtPntrZXl9ICAgICBpZiBkZWZpbmVkICRzZWxmLT57a2V5fTsKKyAgICAkb3B0cy0+e1NTTF91c2VfY2VydH0gICAgID0gKGRlZmluZWQgJHNlbGYtPntjZXJ0fSkgPyAxIDogMDsKKyAgICAkb3B0cy0+e1NTTF92ZXJpZnlfbW9kZX0gID0gKGRlZmluZWQgJHNlbGYtPntjYX0pID8gJHZlcmlmeSA6IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9OT05FOworICAgICRvcHRzLT57U1NMX3ZlcnNpb259ICAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e3ZlcnNpb259KSA/ICRzZWxmLT57dmVyc2lvbn0gOiAnU1NMdjIzOiFTU0x2MzohU1NMdjInOworCisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KCUkb3B0cyk7Cit9CisKK3N1YiBfX2Nsb3NlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF07CisgICAgaWYgKCRzb2NrKSB7CisgICAgICAkc29jay0+Y2xvc2UoU1NMX25vX3NodXRkb3duID0+IDEpOworICAgIH0KK30KKworc3ViIF9fcmVjdgoreworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgaWYgKCRzb2NrKSB7CisgICAgc3lzcmVhZCgkc29jaywgJGJ1ZiwgJGxlbik7CisgIH0KKyAgcmV0dXJuICRidWY7Cit9CisKK3N1YiBfX3NlbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gc2hpZnQ7CisgICAgbXkgJGJ1ZiA9IHNoaWZ0OworICAgIHJldHVybiBzeXN3cml0ZSgkc29jaywgJGJ1Zik7Cit9CisKK3N1YiBfX3dhaXQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXTsKKyAgICBpZiAoJHNvY2sgYW5kICRzb2NrLT5wZW5kaW5nKCkgZXEgMCkgeworICAgICAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjpfX3dhaXQoKTsKKyAgICB9CisgICAgcmV0dXJuICRzb2NrOworfQorCisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCmluZGV4IDk2MGZiZDEuLjI4ODIyZTggMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtCkBAIC0xNywyNSArMTcsMzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBTZXJ2ZXIgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKKyMKICMgMyBwb3NzaWJsZSBjb25zdHJ1Y3RvcnM6CiAjICAgMS4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyMgICAgICAgVXNlcyBhIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBhbmQgYSBCaW5hcnlQcm90b2NvbEZhY3RvcnkuCiAjICAgMi4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorIyAgICAgICBVc2VzIHRoZSBzYW1lIGZhY3RvcnkgZm9yIGlucHV0IGFuZCBvdXRwdXQgb2YgZWFjaCB0eXBlLgogIyAgIDMuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCiAjICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCiAjICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKQEAgLTQ1LDcgKzUxLDcgQEAKIAogICAgIGlmIChzY2FsYXIgQGFyZ3MgPT0gMikKICAgICB7Ci0gICAgICAkc2VsZiA9IF9pbml0KCRhcmdzWzBdLCAkYXJnc1sxXSwKKyAgICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCksCkBAIC02MSw3ICs2Nyw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBkaWUgIlRocmlmdDo6U2VydmVyIGV4cGVjdHMgZXhhY3RseSAyLCA0LCBvciA2IGFyZ3MiOworICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCdUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzJyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtODgsNyArOTQsNyBAQAogCiBzdWIgc2VydmUKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIF9jbGllbnRCZWdpbgpAQCAtMTA5LDYyICsxMTUsNjggQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRlICAgID0gc2hpZnQ7CiAKLSAgICBpZiAoJGUgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRlLT57bWVzc2FnZX0pIHsKKyAgICBpZiAoJGUtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CiAgICAgICAgIG15ICRtZXNzYWdlID0gJGUtPnttZXNzYWdlfTsKICAgICAgICAgbXkgJGNvZGUgICAgPSAkZS0+e2NvZGV9OwogICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CiAKICAgICAgICAgJG1lc3NhZ2UgPX4gbS9UVHJhbnNwb3J0RXhjZXB0aW9uLyBhbmQgZGllICRvdXQ7Ci0gICAgICAgIGlmICgkbWVzc2FnZSA9fiBtL1RTb2NrZXQvKSB7Ci0gICAgICAgICAgICAjIHN1cHByZXNzIFRTb2NrZXQgbWVzc2FnZXMKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCRtZXNzYWdlID1+IG0vU29ja2V0LykgeworICAgICAgICAgICAgIyBzdXBwcmVzcyBTb2NrZXQgbWVzc2FnZXMKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJG91dDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICB3YXJuICRlOwogICAgIH0KIH0KIAotCiAjCiAjIFNpbXBsZVNlcnZlciBmcm9tIHRoZSBTZXJ2ZXIgYmFzZSBjbGFzcyB0aGF0IGhhbmRsZXMgb25lIGNvbm5lY3Rpb24gYXQgYSB0aW1lCiAjCiBwYWNrYWdlIFRocmlmdDo6U2ltcGxlU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgICAgICA9IEBfOwogCi0gICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQGFyZ3MpOworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKwogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAogc3ViIHNlcnZlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RvcCA9IDA7CiAKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwotICAgIHdoaWxlICgxKQotICAgIHsKKyAgICB3aGlsZSAoISRzdG9wKSB7CiAgICAgICAgIG15ICRjbGllbnQgPSAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmFjY2VwdCgpOwotICAgICAgICBteSAkaXRyYW5zID0gJHNlbGYtPntpbnB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7Ci0gICAgICAgIG15ICRvcHJvdCAgPSAkc2VsZi0+e291dHB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRvdHJhbnMpOwotICAgICAgICBldmFsIHsKLSAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOwotICAgICAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgaWYgKGRlZmluZWQgJGNsaWVudCkgeworICAgICAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOworICAgICAgICAgICAgbXkgJG90cmFucyA9ICRzZWxmLT57b3V0cHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7CisgICAgICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKKyAgICAgICAgICAgIGV2YWwgeworICAgICAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOworICAgICAgICAgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYoJEApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH07IGlmKCRAKSB7Ci0gICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CisgICAgICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOworICAgICAgICAgICAgJG90cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdG9wID0gMTsKICAgICAgICAgfQotCi0gICAgICAgICRpdHJhbnMtPmNsb3NlKCk7Ci0gICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNzMsOSArMTg1LDkgQEAKICMgRm9ya2luZ1NlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogIwogcGFja2FnZSBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXI7Ci11c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXIgKTsKLQotdXNlIFBPU0lYICI6c3lzX3dhaXRfaCI7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgUE9TSVggJzpzeXNfd2FpdF9oJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMTkxLDYgKzIwMyw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAorICAgICMgVEhSSUZULTM4NDg6IHdpdGhvdXQgaWdub3JpbmcgU0lHQ0hMRCwgcGVybCBGb3JraW5nU2VydmVyIGdvZXMgaW50byBhIHRpZ2h0IGxvb3AKKyAgICAkU0lHe0NITER9ID0gJ0lHTk9SRSc7CisKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwogICAgIHdoaWxlICgxKQogICAgIHsKQEAgLTIxNSwxMyArMjMwLDE1IEBACiAKICAgICAgICAgbXkgJHBpZCA9IGZvcmsoKTsKIAotICAgICAgICBpZiAoJHBpZCkgI3BhcmVudAorICAgICAgICBpZiAoJHBpZCkKICAgICAgICAgewogICAgICAgICAgICAgJHNlbGYtPl9wYXJlbnQoJHBpZCwgJGl0cmFucywgJG90cmFucyk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAkc2VsZi0+X2NoaWxkKCRpdHJhbnMsICRvdHJhbnMsICRpcHJvdCwgJG9wcm90KTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7CisgICAgfTsKKyAgICBpZigkQCkgewogICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgfQogfQpAQCAtMjMzLDEwICsyNTAsNiBAQAogICAgIG15ICRpdHJhbnMgPSBzaGlmdDsKICAgICBteSAkb3RyYW5zID0gc2hpZnQ7CiAKLSAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAkc2VsZi0+e2NoaWxkcmVufS0+eyRwaWR9ID0gMTsKLSAgICAkc2VsZi0+X2NvbGxlY3RDaGlsZHJlbigpOwotCiAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQgY2xvc2VkIHByb21wdGx5CiAgICAgJHNlbGYtPnRyeUNsb3NlKCRpdHJhbnMpOwogICAgICRzZWxmLT50cnlDbG9zZSgkb3RyYW5zKTsKQEAgLTI1MiwxMSArMjY1LDE0IEBACiAKICAgICBteSAkZWNvZGUgPSAwOwogICAgIGV2YWwgeworICAgICAgICAjIFRIUklGVC00MDY1IGVuc3VyZSBjaGlsZCBwcm9jZXNzIGhhcyBub3JtYWwgc2lnbmFsIGhhbmRsaW5nIGluIGNhc2UgdGhyaWZ0IGhhbmRsZXIgdXNlcyBpdAorICAgICAgICAkU0lHe0NITER9ID0gJ0RFRkFVTFQnOwogICAgICAgICB3aGlsZSAoMSkKICAgICAgICAgewogICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7CisgICAgfTsKKyAgICBpZigkQCkgewogICAgICAgICAkZWNvZGUgPSAxOwogICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgfQpAQCAtMjc3LDM3ICsyOTMsMTkgQEAKICAgICAgICAgewogICAgICAgICAgICRmaWxlLT5jbG9zZSgpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKLSAgICAgICAgaWYgKCRAID1+IG0vVEV4Y2VwdGlvbi8gYW5kIGV4aXN0cyAkQC0+e21lc3NhZ2V9KSB7CisgICAgfTsKKyAgICBpZigkQCkgeworICAgICAgICBpZiAoJEAtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkQC0+e21lc3NhZ2V9KSB7CiAgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICRALT57bWVzc2FnZX07CiAgICAgICAgICAgICBteSAkY29kZSAgICA9ICRALT57Y29kZX07CiAgICAgICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CiAKICAgICAgICAgICAgIHdhcm4gJG91dDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJEA7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN1YiBfY29sbGVjdENoaWxkcmVuCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHdoaWxlIChzY2FsYXIga2V5cyAleyRzZWxmLT57Y2hpbGRyZW59fSkKLSAgICB7Ci0gICAgICAgIG15ICRwaWQgICAgPSB3YWl0cGlkKC0xLCBXTk9IQU5HKTsKLQotICAgICAgICBpZiAoJHBpZD4wKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGUgJHNlbGYtPntjaGlsZHJlbn0tPnskcGlkfTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MjY0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsMTI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBJTzo6U29ja2V0OjpJTkVUOwordXNlIElPOjpTZWxlY3Q7Cit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIFRocmlmdDo6U29ja2V0OworCitwYWNrYWdlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyVHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIExlZ2FjeSBjb25zdHJ1Y3Rpb24gdGFrZXMgb25lIGFyZ3VtZW50LCBwb3J0IG51bWJlci4KKyMgTmV3IGNvbnN0cnVjdGlvbiB0YWtlcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIGhvc3QgICBob3N0IGludGVyZmFjZSB0byBsaXN0ZW4gb24gKHVuZGVmID0gYWxsIGludGVyZmFjZXMpCisjIEBwYXJhbVtpbl0gIHBvcnQgICBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24gKHJlcXVpcmVkKQorIyBAcGFyYW1baW5dICBxdWV1ZSAgdGhlIGxpc3RlbiBxdWV1ZSBzaXplIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQgaXMgMTI4KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQorIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICAjIFN1cHBvcnQgYm90aCBvbGQtc3R5bGUgInBvcnQgbnVtYmVyIiBjb25zdHJ1Y3Rpb24gYW5kIG5ld2VyLi4uCisgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CisgICAgICAgICRzZWxmID0gJGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZiA9IHsgcG9ydCA9PiAkYXJncyB9OworICAgIH0KKworICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e3F1ZXVlfSkgeworICAgICAgICAkc2VsZi0+e3F1ZXVlfSA9IDEyODsKKyAgICB9CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gJHNlbGYtPl9fbGlzdGVuKCkgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpIC4gJzogQ291bGQgbm90IGJpbmQgdG8gJyAuICcqOicgLiAkc2VsZi0+e3BvcnR9IC4gJyAoJyAuICQhIC4gJyknOworCisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSAkc29jazsKK30KKworc3ViIGFjY2VwdAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkgeworICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7CisgICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gJHNlbGYtPl9fY2xpZW50KCk7CisgICAgICAgICRyZXN1bHQtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCRjbGllbnQpOworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBjbG9zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57aGFuZGxlfS0+Y2xvc2UoKTsKKyAgICB9Cit9CisKKyMjIworIyMjIE92ZXJyaWRhYmxlIG1ldGhvZHMKKyMjIworCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICByZXR1cm4gSU86OlNvY2tldDo6SU5FVC0+bmV3KExvY2FsQWRkciA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0ID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXVzZUFkZHIgPT4gMSk7Cit9CisKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KaW5kZXggN2ViZWEzNS4uYmEwZGI1ZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0KQEAgLTE3LDM3ICsxNyw2MyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCiB1c2UgSU86OlNvY2tldDo6SU5FVDsKIHVzZSBJTzo6U2VsZWN0OwogCiBwYWNrYWdlIFRocmlmdDo6U29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6VHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgaG9zdCAgICAgICAgPT4gaG9zdCB0byBjb25uZWN0IHRvCisjIHBvcnQgICAgICAgID0+IHBvcnQgdG8gY29ubmVjdCB0bworIyBzZW5kVGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHNlbmQgYW5kIGZvciBjb25uZWN0CisjIHJlY3ZUaW1lb3V0ID0+IHRpbWVvdXQgdXNlZCBmb3IgcmVjdgorIwogCiBzdWIgbmV3CiB7Ci0gICAgbXkgJGNsYXNzbmFtZSAgICA9IHNoaWZ0OwotICAgIG15ICRob3N0ICAgICAgICAgPSBzaGlmdCB8fCAibG9jYWxob3N0IjsKLSAgICBteSAkcG9ydCAgICAgICAgID0gc2hpZnQgfHwgOTA5MDsKLSAgICBteSAkZGVidWdIYW5kbGVyID0gc2hpZnQ7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRvcHRzICAgICAgPSBzaGlmdDsKIAorICAgICMgZGVmYXVsdCBzZXR0aW5nczoKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgaG9zdCAgICAgICAgID0+ICRob3N0LAotICAgICAgICBwb3J0ICAgICAgICAgPT4gJHBvcnQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorICAgICAgICBob3N0ICAgICAgICAgPT4gJ2xvY2FsaG9zdCcsCisgICAgICAgIHBvcnQgICAgICAgICA9PiA5MDkwLAogICAgICAgICByZWN2VGltZW91dCAgPT4gMTAwMDAsCi0gICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMDAwLAorCisgICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZgogICAgIH07CiAKKyAgICBpZiAoZGVmaW5lZCAkb3B0cyBhbmQgcmVmICRvcHRzIGVxIHJlZiB7fSkgeworCisgICAgICAjIGFyZ3VtZW50IGlzIGEgaGFzaCBvZiBvcHRpb25zIHNvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cworICAgICAgJHNlbGYtPnskX30gPSAkb3B0cy0+eyRffSBmb3Iga2V5cyAlJG9wdHM7CisKKyAgICB9IGVsc2UgeworCisgICAgICAjIG9sZGVyIHN0eWxlIGNvbnN0cnVjdG9yIHRha2VzIDMgYXJndW1lbnRzLCBub25lIG9mIHdoaWNoIGFyZSByZXF1aXJlZAorICAgICAgJHNlbGYtPntob3N0fSA9ICRvcHRzIHx8ICdsb2NhbGhvc3QnOworICAgICAgJHNlbGYtPntwb3J0fSA9IHNoaWZ0IHx8IDkwOTA7CisKKyAgICB9CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKQEAgLTcwLDE5ICs5Niw2IEBACiAKIAogIwotI1NldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSMKLSMgQHBhcmFtIGJvb2wgJGRlYnVnCi0jCi1zdWIgc2V0RGVidWcKLXsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkZGVidWcgPSBzaGlmdDsKLQotICAgICRzZWxmLT57ZGVidWd9ID0gJGRlYnVnOwotfQotCi0jCiAjIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCiAjCiAjIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgpAQCAtMTA1LDIzICsxMTgsMTIgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9LzEwMDApCi0gICAgICAgIHx8IGRvIHsKLSAgICAgICAgICAgIG15ICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0uJyAoJy4kIS4nKSc7CisgICAgbXkgJHNvY2sgPSAkc2VsZi0+X19vcGVuKCkgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpLic6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fS4nICgnLiQhLicpJzsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKIAotICAgICAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKLQotICAgICAgICB9OwotCi0KLSAgICAkc2VsZi0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCggJHNvY2sgKTsKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoICRzb2NrICk7CiB9CiAKICMKQEAgLTEzMCw5ICsxMzIsOCBAQAogc3ViIGNsb3NlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApewotICAgICAgICBDT1JFOjpjbG9zZSggKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSApOworICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApIHsKKyAgICAgICRzZWxmLT5fX2Nsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNTMsMzAgKzE1NCwyMiBAQAogICAgIG15ICRwcmUgPSAiIjsKICAgICB3aGlsZSAoMSkgewogCi0gICAgICAgICNjaGVjayBmb3IgdGltZW91dAotICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOwotCi0gICAgICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgbXkgJHNvY2sgPSAkc29ja2V0c1swXTsKLQotICAgICAgICBteSAoJGJ1Ziwkc3opOwotICAgICAgICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgICAgICAgbXkgJHNvY2sgPSAkc2VsZi0+X193YWl0KCk7CisgICAgICAgIG15ICRidWYgPSAkc2VsZi0+X19yZWN2KCRzb2NrLCAkbGVuKTsKIAogICAgICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKLSAgICAgICAgfSBlbHNpZiAoKCRzeiA9IGxlbmd0aCgkYnVmKSkgPCAkbGVuKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKChteSAkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgewogCiAgICAgICAgICAgICAkcHJlIC49ICRidWY7CiAgICAgICAgICAgICAkbGVuIC09ICRzejsKIAotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmV0dXJuICRwcmUuJGJ1ZjsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NSwyMyArMTg4LDEzIEBACiAKICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCi0gICAgI2NoZWNrIGZvciB0aW1lb3V0Ci0gICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKLQotICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKLSAgICB9Ci0KLSAgICBteSAkc29jayA9ICRzb2NrZXRzWzBdOwotCi0gICAgbXkgKCRidWYsJHN6KTsKLSAgICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgICBteSAkc29jayA9ICRzZWxmLT5fX3dhaXQoKTsKKyAgICBteSAkYnVmID0gJHNlbGYtPl9fcmVjdigkc29jaywgJGxlbik7CiAKICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgZGllIG5ldyBURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKICAgICB9CiAKQEAgLTIyOSwzMCArMjEyLDI3IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkYnVmICA9IHNoaWZ0OwogCi0KICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCiAgICAgd2hpbGUgKGxlbmd0aCgkYnVmKSA+IDApIHsKLQotCiAgICAgICAgICNjaGVjayBmb3IgdGltZW91dAogICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3dyaXRlKCAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDAgKTsKIAogICAgICAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCB3cml0aW5nIHRvIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKICAgICAgICAgfQogCi0gICAgICAgIG15ICRzb2NrID0gJHNvY2tldHNbMF07CisgICAgICAgIG15ICRzZW50ID0gJHNlbGYtPl9fc2VuZCgkc29ja2V0c1swXSwgJGJ1Zik7CiAKLSAgICAgICAgbXkgJGdvdCA9ICRzb2NrLT5zZW5kKCRidWYpOworICAgICAgICBpZiAoIWRlZmluZWQgJHNlbnQgfHwgJHNlbnQgPT0gMCApIHsKIAotICAgICAgICBpZiAoIWRlZmluZWQgJGdvdCB8fCAkZ290ID09IDAgKSB7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOworCiAgICAgICAgIH0KIAotICAgICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRzZW50KTsKICAgICB9CiB9CiAKQEAgLTI2NSw2NSArMjQ1LDgyIEBACiAKICAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9OwogCi0gICAgbXkgJHJldCAgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdLT5mbHVzaDsKKyAgICBteSAkcmV0ID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXS0+Zmx1c2g7CiB9CiAKKyMjIworIyMjIE92ZXJyaWRhYmxlIG1ldGhvZHMKKyMjIwogCiAjCi0jIEJ1aWxkIGEgU2VydmVyU29ja2V0IGZyb20gdGhlIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzCisjIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgc2VydmVyLgogIwotcGFja2FnZSAgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Ci0KLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydCApOwotCi11c2UgY29uc3RhbnQgTElTVEVOX1FVRVVFX1NJWkUgPT4gMTI4OwotCi1zdWIgbmV3Ci17Ci0gICAgbXkgJGNsYXNzbmFtZSAgID0gc2hpZnQ7Ci0gICAgbXkgJHBvcnQgICAgICAgID0gc2hpZnQ7Ci0KLSAgICBteSAkc2VsZiAgICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KHVuZGVmLCAkcG9ydCwgdW5kZWYpOwotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLQotc3ViIGxpc3Rlbgorc3ViIF9fb3BlbgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICAjIExpc3RlbiB0byBhIG5ldyBzb2NrZXQKLSAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhMb2NhbEFkZHIgPT4gdW5kZWYsICMgYW55IGFkZHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuICAgID0+IExJU1RFTl9RVUVVRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldXNlQWRkciA9PiAxKQotICAgICAgICB8fCBkbyB7Ci0gICAgICAgICAgICBteSAkZXJyb3IgPSAnVFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9IC4gJzonIC4gJHNlbGYtPntwb3J0fSAuICcgKCcgLiAkISAuICcpJzsKLQotICAgICAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKLSAgICAgICAgfTsKLQotICAgICRzZWxmLT57aGFuZGxlfSA9ICRzb2NrOworICAgIHJldHVybiBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCk7CiB9CiAKLXN1YiBhY2NlcHQKKyMKKyMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24KKyMKK3N1YiBfX2Nsb3NlCit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgQ09SRTo6Y2xvc2UoKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSk7Cit9CisKKyMKKyMgUmVhZCBkYXRhCisjCisjIEBwYXJhbVtpbl0gJHNvY2sgdGhlIHNvY2tldAorIyBAcGFyYW1baW5dICRsZW4gdGhlIGxlbmd0aCB0byByZWFkCisjIEByZXR1cm5zIHRoZSBkYXRhIGJ1ZmZlciB0aGF0IHdhcyByZWFkCisjCitzdWIgX19yZWN2Cit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRzb2NrID0gc2hpZnQ7CisgIG15ICRsZW4gPSBzaGlmdDsKKyAgbXkgJGJ1ZiA9IHVuZGVmOworICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgcmV0dXJuICRidWY7Cit9CisKKyMKKyMgU2VuZCBkYXRhCisjCisjIEBwYXJhbVtpbl0gJHNvY2sgdGhlIHNvY2tldAorIyBAcGFyYW1baW5dICRidWYgdGhlIGRhdGEgYnVmZmVyCisjIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorIworc3ViIF9fc2VuZAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgICBteSAkYnVmID0gc2hpZnQ7CisgICAgcmV0dXJuICRzb2NrLT5zZW5kKCRidWYpOworfQogCi0gICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCi0gICAgewotICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7Ci0gICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gbmV3IFRocmlmdDo6U29ja2V0OwotICAgICAgICAkcmVzdWx0LT57aGFuZGxlfSA9IG5ldyBJTzo6U2VsZWN0KCRjbGllbnQpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyMKKyMgV2FpdCBmb3IgZGF0YSB0byBiZSByZWFkYWJsZQorIworIyBAcmV0dXJucyBhIHNvY2tldCB0aGF0IGNhbiBiZSByZWFkCisjCitzdWIgX193YWl0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOworCisgICAgaWYgKEBzb2NrZXRzID09IDApIHsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogdGltZWQgb3V0IHJlYWRpbmcgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgfQogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICRzb2NrZXRzWzBdOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KaW5kZXggNWVjNmZlZS4uNDFiN2UxNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KQEAgLTE3LDE3ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogCiAjCiAjIFRyYW5zcG9ydCBleGNlcHRpb25zCiAjCi1wYWNrYWdlIFRUcmFuc3BvcnRFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFVOS05PV04gICAgICA9PiAwOwogdXNlIGNvbnN0YW50IE5PVF9PUEVOICAgICA9PiAxOwpAQCAtMzUsNyArMzcsNyBAQAogdXNlIGNvbnN0YW50IFRJTUVEX09VVCAgICA9PiAzOwogdXNlIGNvbnN0YW50IEVORF9PRl9GSUxFICA9PiA0OwogCi1zdWIgbmV3eworc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKIApAQCAtNDMsNiArNDUsNyBAQAogfQogCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KQEAgLTUxLDcgKzU0LDcgQEAKICMKIHN1YiBpc09wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjEsNyArNjQsNyBAQAogIwogc3ViIG9wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjksNyArNzIsNyBAQAogIwogc3ViIGNsb3NlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTgxLDggKzg0LDcgQEAKICMKIHN1YiByZWFkCiB7Ci0gICAgbXkgKCRsZW4pOwotICAgIGRpZSgiYWJzdHJhY3QiKTsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTE0LDggKzExNiw3IEBACiAjCiBzdWIgd3JpdGUKIHsKLSAgICBteSAoJGJ1Zik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTEzMCw2ICsxMzEsNyBAQAogIyBUcmFuc3BvcnRGYWN0b3J5IGNyZWF0ZXMgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtMTU2LDIwICsxNTgsMjEgQEAKICMgIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzIG1vZHVsZQogIwogcGFja2FnZSBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIGxpc3RlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgYWNjZXB0CiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhkYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKKworIworIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIworcGFja2FnZSBUaHJpZnQ6OlRUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Cit1c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Cit1c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Cit1c2UgY29uc3RhbnQgQllURSAgID0+IDM7Cit1c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Cit1c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Cit1c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Cit1c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwordXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKK3VzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Cit1c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwordXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKK3VzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Cit1c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwordXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKK3VzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1ZTgwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDg0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBub3QgYSBoYXNoLCB0aGF0IGlzIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgcGF0aC4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIHBhdGggICB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZSBuYW1lCisjIEBwYXJhbVtpbl0gIHF1ZXVlICB0aGUgbGlzdGVuIHF1ZXVlIHNpemUgKGRlZmF1bHQgaXMgbm90IHNwZWNpZmllZCBpcyBzdXBwbGllZCBieSBTZXJ2ZXJTb2NrZXQpCisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJHBhdGgpOworIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KHBhdGggPT4gInNvbWVwYXRoIiwgcXVldWUgPT4gNjQpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICBpZiAocmVmKCRhcmdzKSBlcSAnSEFTSCcpIHsKKyAgICAgICAgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKKyAgICAgICAgJHNlbGYtPntwYXRofSA9ICRhcmdzOworICAgIH0KKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIExvY2FsICAgICA9PiAkc2VsZi0+e3BhdGh9LAorICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0pCisgICAgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSAnVW5peFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cGF0aH0gLiAnICgnIC4gJCEgLiAnKSc7CisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgcmV0dXJuICRzb2NrOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzg2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgVGFrZXMgYSB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZW5hbWUuCisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBwYXRoICAgcGF0aCB0byB1bml4IHNvY2tldCBmaWxlCisjIEBleGFtcGxlICAgIG15ICRzb2NrID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJHBhdGgpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOworICAgICRzZWxmLT57cGF0aH0gPSBzaGlmdDsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19vcGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIFBlZXIgICAgICA9PiAkc2VsZi0+e3BhdGh9KQorICAgIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gJ1VuaXhTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgJHNlbGYtPntwYXRofSAuICcgKCcgLiAkISAuICcpJzsKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQppbmRleCA3OTVhYWVkLi5kZTAzOTcxIDEwMDY0NAotLS0gYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDE1ICsxNyw0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSBAdG9wX2J1aWxkZGlyQC9jb21waWxlci9jcHAvdGhyaWZ0Ci1USFJJRlRfSUYgPSBAdG9wX3NyY2RpckAvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi1jaGVjay1sb2NhbDogZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbQotCi1nZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtOiAkKFRIUklGVF9JRikKLQkkKFRIUklGVCkgLS1nZW4gcGVybCAkKFRIUklGVF9JRikKLQotY2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGdlbi1wZXJsCi0KLUVYVFJBX0RJU1QgPSBtZW1vcnlfYnVmZmVyLnQgcHJvY2Vzc29yLnQKK0VYVFJBX0RJU1QgPSBtZW1vcnlfYnVmZmVyLnQgcHJvY2Vzc29yLnQgbXVsdGlwbGV4LnQKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTliNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50CkBAIC0wLDAgKzEsMjAxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gNjsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgQmVuY2htYXJrU2VydmljZTsKK3VzZSBBZ2dyOworCit1c2UgY29uc3RhbnQgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0+ICdCZW5jaG1hcmtTZXJ2aWNlJzsKK3VzZSBjb25zdGFudCBOQU1FX0FHR1IgID0+ICAnQWdncic7CisKK215ICRidWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KDEwMjQpOworbXkgJGFnZ3JfcHJvdG9jb2wgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0FHR1IpOworbXkgJGFnZ3JfY2xpZW50ICAgID0gQWdnckNsaWVudC0+bmV3KCRhZ2dyX3Byb3RvY29sKTsKK215ICRiZW5jaG1hcmtfcHJvdG9jb2wgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJGJ1ZmZlciksIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CitteSAkYmVuY2htYXJrX2NsaWVudCA9IEJlbmNobWFya1NlcnZpY2VDbGllbnQtPm5ldygkYmVuY2htYXJrX3Byb3RvY29sKTsgCisKKyRidWZmZXItPm9wZW4oKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRhZ2dyX2NsaWVudC0+c2VuZF9hZGRWYWx1ZSgkaSk7CisgICAgJGFnZ3JfY2xpZW50LT57c2VxaWR9Kys7Cit9CisKKyRhZ2dyX2NsaWVudC0+c2VuZF9nZXRWYWx1ZXMoKTsKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgICRiZW5jaG1hcmtfY2xpZW50LT5zZW5kX2ZpYm9uYWNjaSgkaSk7CisgICAgJGJlbmNobWFya19jbGllbnQtPntzZXFpZH0rKzsKK30KKyRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9LS07CisKK215ICRjbGllbnRfY29tbWFuZF9iaW5hcnkgPSAkYnVmZmVyLT5nZXRCdWZmZXI7CiskYnVmZmVyLT5yZXNldEJ1ZmZlcjsKKworCisjIFByb2Nlc3MgYnkgc2VydmVyCitteSAkc2VydmVyX291dHB1dF9iaW5hcnk7Cit7CisgICAgbXkgJGJlbmNobWFya19oYW5kbGVyID0gTXk6OkJlbmNobWFya1NlcnZpY2UtPm5ldygpOworICAgIG15ICRiZW5jaG1hcmtfcHJvY2Vzc29yID0gQmVuY2htYXJrU2VydmljZVByb2Nlc3Nvci0+bmV3KCRiZW5jaG1hcmtfaGFuZGxlcik7CisgICAgbXkgJGFnZ3JfaGFuZGxlciA9IE15OjpBZ2dyLT5uZXcoKTsgCisgICAgbXkgJGFnZ3JfcHJvY2Vzc29yID0gQWdnclByb2Nlc3Nvci0+bmV3KCRhZ2dyX2hhbmRsZXIpOworICAgIAorICAgIG15ICRwcm90b2NvbF9mYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworCisgICAgbXkgJGlucHV0X2J1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKKyAgICAkaW5wdXRfYnVmZmVyLT53cml0ZSgkY2xpZW50X2NvbW1hbmRfYmluYXJ5KTsKKworICAgIG15ICRpbnB1dF9wcm90b2NvbCAgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJGlucHV0X2J1ZmZlcik7CisKKyAgICBteSAkb3V0cHV0X2J1ZmZlciAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygpOworICAgIG15ICRvdXRwdXRfcHJvdG9jb2wgPSAkcHJvdG9jb2xfZmFjdG9yeS0+Z2V0UHJvdG9jb2woJG91dHB1dF9idWZmZXIpOworCisgICAgbXkgJHByb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygpOworCisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9CRU5DSE1BUktTRVJWSUNFLCAkYmVuY2htYXJrX3Byb2Nlc3Nvcik7CisgICAgJHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoTkFNRV9BR0dSLCAkYWdncl9wcm9jZXNzb3IpOworICAgIG15ICRyZXN1bHQ7CisgICAgZm9yKG15ICRpID0gMTsgJGkgPD0gMTE7ICRpKyspIHsKKyAgICAgICAgJHJlc3VsdCA9ICRwcm9jZXNzb3ItPnByb2Nlc3MoJGlucHV0X3Byb3RvY29sLCAkb3V0cHV0X3Byb3RvY29sKTsKKyAgICAgICAgcHJpbnQgInByb2Nlc3MgcmVzdWx0ZWQgaW4gJHJlc3VsdFxuIjsKKyAgICB9CisKKyAgICAkc2VydmVyX291dHB1dF9iaW5hcnkgPSAkb3V0cHV0X2J1ZmZlci0+Z2V0QnVmZmVyKCk7Cit9CisKKyRidWZmZXItPndyaXRlKCRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSk7CisKKworCitmb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7CisgICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCisgICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgICAgZGllOworICAgIH0KKyAgICAKKyAgICBteSAkYWdncl9yZXN1bHQgPSBBZ2dyX2FkZFZhbHVlX3Jlc3VsdC0+bmV3KCk7CisgICAgJGFnZ3JfcmVzdWx0LT5yZWFkKCRhZ2dyX3Byb3RvY29sKTsKKyAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKworbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCiskYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGRpZTsKK30KKyAgICAKK215ICRhZ2dyX3Jlc3VsdCA9IEFnZ3JfZ2V0VmFsdWVzX3Jlc3VsdC0+bmV3KCk7CiskYWdncl9yZXN1bHQtPnJlYWQoJGFnZ3JfcHJvdG9jb2wpOworJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7CisKK2lzX2RlZXBseSgkYWdncl9yZXN1bHQtPnN1Y2Nlc3MoKSwgWzEsMiwzLDQsNV0pOworIAorCitmb3JlYWNoIG15ICR2YWwoKDEsMiwzLDUsOCkpIHsKKyAgICBteSAoJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZCk7CisKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgICBkaWU7CisgICAgfQorICAgIG15ICRiZW5jaG1hcmtfcmVzdWx0ID0gQmVuY2htYXJrU2VydmljZV9maWJvbmFjY2lfcmVzdWx0LT5uZXcoKTsKKyAgICAkYmVuY2htYXJrX3Jlc3VsdC0+cmVhZCgkYmVuY2htYXJrX3Byb3RvY29sKTsKKyAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIAorICAgIGlzKCRiZW5jaG1hcmtfcmVzdWx0LT5zdWNjZXNzKCksICR2YWwpOworfQorCisKK3BhY2thZ2UgTXk6OkFnZ3I7Cit1c2UgYmFzZSBxdyhBZ2dySWYpOyAKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsgCisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisgICAgCisgICAgJHNlbGYtPnt2YWx1ZXN9ID0gKCk7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBhZGRWYWx1ZXsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworCisgICAgcHVzaCAoQHskc2VsZi0+e3ZhbHVlc319LCAkdmFsdWUpOyAgCit9CisKK3N1YiBnZXRWYWx1ZXN7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICAKKyAgIHJldHVybiAkc2VsZi0+e3ZhbHVlc307Cit9CisKKworCitwYWNrYWdlIE15OjpCZW5jaG1hcmtTZXJ2aWNlOwordXNlIGJhc2UgcXcoQmVuY2htYXJrU2VydmljZUlmKTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgcmV0dXJuIGJsZXNzIHt9LCAkY2xhc3M7Cit9CisKK3N1YiBmaWJvbmFjY2kgeworICAgIG15ICgkc2VsZiwgJG4pID0gQF87CisgICAgCisgICAgbXkgJHByZXYgPSAwOworICAgIG15ICRuZXh0OworICAgIG15ICRyZXN1bHQgPSAxOworICAgIAorICAgIHdoaWxlICgkbiA+IDApIHsKKyAgICAgICAgJG5leHQgPSAkcmVzdWx0ICsgJHByZXY7CisgICAgICAgICRwcmV2ID0gJHJlc3VsdDsKKyAgICAgICAgJHJlc3VsdCA9ICRuZXh0OworICAgICAgICAtLSRuOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gJHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKaW5kZXggMWQ4YmU3My4uZjgzMzAzNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAorKysgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CkBAIC0yMiw5ICsyMiw5IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIAogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogICAgIHByaW50ICIgICRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWRcbiI7CiAKLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKICAgICAgICAgZGllOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhpcyB3aWxsIGZpeCB1cCB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgQ1BBTiBwcm9wZXJseQorIyBpbmRleGVzIFRocmlmdC4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgdXRmODsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBDUEFOOjpNZXRhOworCitteSAkbWV0YSA9IENQQU46Ok1ldGEtPmxvYWRfZmlsZSgnTUVUQS5qc29uJyk7CiskbWV0YS0+eydwcm92aWRlcyd9ID0geyAnVGhyaWZ0JyA9PiB7ICdmaWxlJyA9PiAnbGliL1RocmlmdC5wbScsICd2ZXJzaW9uJyA9PiAkbWV0YS0+dmVyc2lvbigpIH0gfTsKKyRtZXRhLT5zYXZlKCdNRVRBLmpzb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9waHAvTWFrZWZpbGUuYW0gYi9saWIvcGhwL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDcyNDJmOS4uOGQ5MDUwYQotLS0gYS9saWIvcGhwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvTWFrZWZpbGUuYW0KQEAgLTE3LDQxICsxNywxMzMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSUuc286Ci0JY2Qgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvIFwKLQkgICYmICQoTUFLRSkKKworaWYgV0lUSF9URVNUUworU1VCRElSUyA9IHRlc3QKK2VuZGlmCiAKIGlmIFdJVEhfUEhQX0VYVEVOU0lPTgorJS5zbzoKKwljZCBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC8gJiYgJChNQUtFKQorCiBwaHBjb25mZGlyPSQoUEhQX0NPTkZJR19QUkVGSVgpCiBwaHBjb25mX0RBVEE9dGhyaWZ0X3Byb3RvY29sLmluaQogCiBwaHBtb2R1bGVkaXIgPSBgcGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXJgCiBwaHBtb2R1bGVfU0NSSVBUUyA9IHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMvdGhyaWZ0X3Byb3RvY29sLnNvCisKK2Rpc3RjbGVhbi1sb2NhbDoKKwljZCAkKHBocG1vZHVsZV9TQ1JJUFRTKSAmJiAkKFBIUElaRSkgLS1jbGVhbgorCiBlbmRpZgogCi1waHBkaXIgPSAkKFBIUF9QUkVGSVgpCi1waHBfREFUQSA9ICBcCi0gIHNyYy9hdXRvbG9hZC5waHAgXAotICBzcmMvVGhyaWZ0LnBocAorcGhwZGlyID0gJChQSFBfUFJFRklYKS8KK3BocF9EQVRBID0gXAorICBsaWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAogCi1waHBwcm90b2NvbGRpciA9ICQocGhwZGlyKS9wcm90b2NvbAorcGhwYmFzZWRpciA9ICQocGhwZGlyKS9CYXNlCitwaHBiYXNlX0RBVEEgPSBcCisgIGxpYi9CYXNlL1RCYXNlLnBocAorCitwaHBjbGFzc2xvYWRlcmRpciA9ICQocGhwZGlyKS9DbGFzc0xvYWRlcgorcGhwY2xhc3Nsb2FkZXJfREFUQSA9IFwKKyAgbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorCitwaHBleGNlcHRpb25kaXIgPSAkKHBocGRpcikvRXhjZXB0aW9uCitwaHBleGNlcHRpb25fREFUQSA9IFwKKyAgbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKKworcGhwZmFjdG9yeWRpciA9ICQocGhwZGlyKS9GYWN0b3J5CitwaHBmYWN0b3J5X0RBVEEgPSBcCisgIGxpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCisKK3BocHByb3RvY29sZGlyID0gJChwaHBkaXIpL1Byb3RvY29sCiBwaHBwcm90b2NvbF9EQVRBID0gXAotICBzcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCi0gIHNyYy9wcm90b2NvbC9UQmluYXJ5U2VyaWFsaXplci5waHAgXAotICBzcmMvcHJvdG9jb2wvVFByb3RvY29sLnBocAorICBsaWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIFwKKyAgbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocAogCi1waHB0cmFuc3BvcnRkaXIgPSAkKHBocGRpcikvdHJhbnNwb3J0CitwaHBwcm90b2NvbGpzb25kaXIgPSAkKHBocHByb3RvY29sZGlyKS9KU09OCitwaHBwcm90b2NvbGpzb25fREFUQSA9IFwKKyAgbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAorCitwaHBwcm90b2NvbHNpbXBsZWpzb25kaXIgPSAkKHBocHByb3RvY29sZGlyKS9TaW1wbGVKU09OCitwaHBwcm90b2NvbHNpbXBsZWpzb25fREFUQSA9IFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKKworcGhwc2VyaWFsaXplcmRpciA9ICQocGhwZGlyKS9TZXJpYWxpemVyCitwaHBzZXJpYWxpemVyX0RBVEEgPSBcCisgIGxpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAorCitwaHBzZXJ2ZXJkaXIgPSAkKHBocGRpcikvU2VydmVyCitwaHBzZXJ2ZXJfREFUQSA9IFwKKyAgbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocCBcCisgIGxpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIFwKKyAgbGliL1NlcnZlci9UU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgXAorICBsaWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisKK3BocHN0cmluZ2Z1bmNkaXIgPSAkKHBocGRpcikvU3RyaW5nRnVuYworcGhwc3RyaW5nZnVuY19EQVRBID0gXAorICBsaWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9Db3JlLnBocCBcCisgIGxpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAorCitwaHB0cmFuc3BvcnRkaXIgPSAkKHBocGRpcikvVHJhbnNwb3J0CiBwaHB0cmFuc3BvcnRfREFUQSA9IFwKLSAgc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVFNvY2tldC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKyAgbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAogCi1FWFRSQV9ESVNUID0gc3JjIHRocmlmdF9wcm90b2NvbC5pbmkgUkVBRE1FLmFwYWNoZQorcGhwdHlwZWRpciA9ICQocGhwZGlyKS9UeXBlCitwaHB0eXBlX0RBVEEgPSBcCisgIGxpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAorICBsaWIvVHlwZS9UVHlwZS5waHAgXAorICBsaWIvVHlwZS9UQ29uc3RhbnQucGhwCiAKLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUgTWFrZWZpbGUuaW4KK0VYVFJBX0RJU1QgPSBcCisgIGxpYiBcCisgIHNyYy9hdXRvbG9hZC5waHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwIFwKKyAgc3JjL1RocmlmdC5waHAgXAorICBzcmMvVFN0cmluZ1V0aWxzLnBocCBcCisgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICB0aHJpZnRfcHJvdG9jb2wuaW5pIFwKKyAgUkVBRE1FLmFwYWNoZS5tZCBcCisgIFJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKyAgTWFrZWZpbGUgXAorICBNYWtlZmlsZS5pbgorCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRSBiL2xpYi9waHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjU2NmY0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhyaWZ0IFBIUCBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIFBIUAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCByZXF1aXJlcyBQSFAgNS4gVGhyaWZ0IG1ha2VzIGFzIGZldyBhc3N1bXB0aW9ucyBhYm91dCB5b3VyIFBIUAotZW52aXJvbm1lbnQgYXMgcG9zc2libGUgd2hpbGUgdHJ5aW5nIHRvIG1ha2Ugc29tZSBtb3JlIGFkdmFuY2VkIFBIUAotZmVhdHVyZXMgKGkuZS4gQVBDIGNhY2hlaW5nIHVzaW5nIGFzYm9sdXRlIHBhdGggVVJMcykgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLgotCi1UbyB1c2UgVGhyaWZ0IGluIHlvdXIgUEhQIGNvZGViYXNlLCB0YWtlIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLSMxKSBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9zcmMgaW50byB5b3VyIFBIUCBjb2RlYmFzZQotIzIpIFNldCAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXSB0byB0aGUgcGF0aCB5b3UgaW5zdGFsbGVkIFRocmlmdAotIzMpIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotCi1Ob3RlIHRoYXQgIzMgbXVzdCBiZSBkb25lIGJlZm9yZSBpbmNsdWRpbmcgYW55IG90aGVyIFRocmlmdCBmaWxlcy4KLUlmIHlvdSBkbyBub3QgZG8gIzIsIFRocmlmdC5waHAgd2lsbCBzZXQgdGhpcyBnbG9iYWwgZm9yIHlvdSwgYnV0IGl0IHdpbGwgYmUKLWRvbmUgdXNpbmcgZGlybmFtZShfX0ZJTEVfXyksIHdoaWNoIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gcHJvdmlkaW5nIHRoZSBzdGF0aWMKLXN0cmluZyB5b3Vyc2VsZi4KLQotV2hlbiB5b3UgZ2VuZXJhdGUgYSBUaHJpZnQgcGFja2FnZSB1c2luZyB0aGUgY29tcGlsZXIsIGl0IG1ha2VzIGFuIGFzc3VtcHRpb24KLWFib3V0IHdoZXJlIHlvdXIgZ2VuZXJhdGVkIGNvZGUgd2lsbCBsaXZlLiBJZiB5b3VyIGZpbGUgaXMgIk15UGFja2FnZS50aHJpZnQiLAotdGhlIGdlbmVyYXRlZCBmaWxlcyBtdXN0IGJlIGluc3RhbGxlZCBpbnRvOgotCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL015UGFja2FnZS8nOwotCi1UaGlzIGFsbG93cyB0aGUgY29kZSBnZW5lcmF0b3IgdG8gY29tcGlsZSB5b3VyIGNvZGUgd2l0aG91dCBhbnkgZXh0cmEgZmxhZ3MKLWZvciB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBuYW1lcyB3aGlsZSBzdGlsbCBhbGxvd2luZyB5b3VyIGluY2x1ZGUgcGF0aHMgdG8KLWJlIGFic29sdXRlIChpZiB5b3UgaGF2ZSBhbiBhYnNvbHV0ZSBUSFJJRlRfUk9PVCkuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLVBIUF9JTlRfU0laRQotCi0gIFRoaXMgYnVpbHQtaW4gc2lnbmFscyB3aGV0aGVyIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIDMyIG9yIDY0IGJpdCBhbmQgaXMKLSAgdXNlZCBieSB0aGUgVEJpbmFyeVByb3RvY29sIHRvIHByb3Blcmx5IHVzZSBwYWNrKCkgYW5kIHVucGFjaygpIHRvCi0gIHNlcmlhbGl6ZSBkYXRhLgotCi1hcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKLQotICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAotICBUaHJpZnQgd2lsbCBmaWxsIGluIG51bGwgc3R1YiBmdW5jdGlvbiBkZWZpbml0aW9ucy4KZGlmZiAtLWdpdCBhL2xpYi9waHAvUkVBRE1FLmFwYWNoZSBiL2xpYi9waHAvUkVBRE1FLmFwYWNoZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0MTgzMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL1JFQURNRS5hcGFjaGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1UaHJpZnQgUEhQL0FwYWNoZSBJbnRlZ3JhdGlvbgotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1CdWlsZGluZyBQSFAgVGhyaWZ0IFNlcnZpY2VzIHdpdGggQXBhY2hlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIgd2l0aCBQSFAgaW5zdGFsbGVkLiBTYW1wbGUKLWNvZGUgaXMgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0byBtYWtlIHJlcXVlc3RzIHRvIHRoaXMgdHlwZSBvZiBzZXJ2ZXIKLXlvdSBtdXN0IHVzZSBhIFRIdHRwQ2xpZW50IHRyYW5zcG9ydC4KLQotU2FtcGxlIENvZGUKLT09PT09PT09PT09Ci0KLTw/cGhwCi0KLS8qKgotICogRXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBUaHJpZnQgc2VydmVyIGluIEFwYWNoZS9QSFAKLSAqCi0gKi8KLQotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSAnL3lvdXIvdGhyaWZ0L3Jvb3QnOwotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL1NlcnZpY2UvU2VydmljZS5waHAnOwotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotCi1jbGFzcyBTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIFNlcnZpY2VJZiB7Ci0gIC8vIEltcGxlbWVudCB5b3VyIGludGVyZmFjZSBhbmQgbWV0aG9kcyBoZXJlCi19Ci0KLWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcpOwotCi0kaGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcigpOwotJHByb2Nlc3NvciA9IG5ldyBTZXJ2aWNlUHJvY2Vzc29yKCRoYW5kbGVyKTsKLQotLy8gVXNlIHRoZSBUUGhwU3RyZWFtIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIGRpcmVjdGx5IGZyb20gSFRUUAotJHRyYW5zcG9ydCA9IG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVyk7Ci0kcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotCi0kdHJhbnNwb3J0LT5vcGVuKCk7Ci0kcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKLSR0cmFuc3BvcnQtPmNsb3NlKCk7CmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQgYi9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5MjU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvUkVBRE1FLmFwYWNoZS5tZApAQCAtMCwwICsxLDc0IEBACitUaHJpZnQgUEhQL0FwYWNoZSBJbnRlZ3JhdGlvbgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitCdWlsZGluZyBQSFAgVGhyaWZ0IFNlcnZpY2VzIHdpdGggQXBhY2hlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RocmlmdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIgd2l0aCBQSFAgaW5zdGFsbGVkLiBTYW1wbGUKK2NvZGUgaXMgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0byBtYWtlIHJlcXVlc3RzIHRvIHRoaXMgdHlwZSBvZiBzZXJ2ZXIKK3lvdSBtdXN0IHVzZSBhIFRIdHRwQ2xpZW50IHRyYW5zcG9ydC4KKworU2FtcGxlIENvZGUKKz09PT09PT09PT09CisKKzw/cGhwCisKK25hbWVzcGFjZSBNeU5hbWVzcGFjZTsKKworLyoqCisgKiBJbmNsdWRlIHBhdGgKKyAqLworJFRIUklGVF9ST09UID0gJy95b3VyL3RocmlmdC9yb290L2xpYic7CisKKy8qKgorICogSW5pdCBBdXRsb2FkZXIKKyAqLworcmVxdWlyZV9vbmNlICRUSFJJRlRfUk9PVCAuICcvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CisKKyRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCAkVEhSSUZUX1JPT1QpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnQnLCAkVEhSSUZUX1JPT1QgLiAnL3BhY2thZ2VzJyk7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUUGhwU3RyZWFtOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogRXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBUaHJpZnQgc2VydmVyIGluIEFwYWNoZS9QSFAKKyAqLworCitjbGFzcyBTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIFNlcnZpY2VJZiB7CisgIC8vIEltcGxlbWVudCB5b3VyIGludGVyZmFjZSBhbmQgbWV0aG9kcyBoZXJlCit9CisKK2hlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcpOworCiskaGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcigpOworJHByb2Nlc3NvciA9IG5ldyBTZXJ2aWNlUHJvY2Vzc29yKCRoYW5kbGVyKTsKKworLy8gVXNlIHRoZSBUUGhwU3RyZWFtIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIGRpcmVjdGx5IGZyb20gSFRUUAorJHRyYW5zcG9ydCA9IG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVyk7CiskcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCiskdHJhbnNwb3J0LT5vcGVuKCk7CiskcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKKyR0cmFuc3BvcnQtPmNsb3NlKCk7CmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5tZCBiL2xpYi9waHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzAxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL1JFQURNRS5tZApAQCAtMCwwICsxLDYwIEBACitUaHJpZnQgUEhQIFNvZnR3YXJlIExpYnJhcnkKKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIFBIUAorCitUaHJpZnQgcmVxdWlyZXMgUEhQIDUuIFRocmlmdCBtYWtlcyBhcyBmZXcgYXNzdW1wdGlvbnMgYWJvdXQgeW91ciBQSFAKK2Vudmlyb25tZW50IGFzIHBvc3NpYmxlIHdoaWxlIHRyeWluZyB0byBtYWtlIHNvbWUgbW9yZSBhZHZhbmNlZCBQSFAKK2ZlYXR1cmVzIChpLmUuIEFQQyBjYWNoZWluZyB1c2luZyBhc2JvbHV0ZSBwYXRoIFVSTHMpIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisxLiBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQorMi4gQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQorCitBZnRlciB0aGF0LCB5b3UgaGF2ZSB0byBtYW51YWxseSBpbmNsdWRlIHRoZSBUaHJpZnQgcGFja2FnZQorY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6CisKK2BgYAorcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKK3JlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOworYGBgCisKKyMgRGVwZW5kZW5jaWVzCisKK1BIUF9JTlRfU0laRQorCisgICAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcworICAgIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bworICAgIHNlcmlhbGl6ZSBkYXRhLgorCithcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKKworICAgIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCisgICAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworMS4gW1BTUi00XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvKSBsb2FkZXIgaXMgbm93IHRoZSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgbWFwcyBpbnN0ZWFkLCB1c2UgYC1nZW4gcGhwOmNsYXNzbWFwYC4KKworMi4gSWYgdXNpbmcgUFNSLTQsIHVzZSBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnbmFtZXNwYWNlJywgJzxwYXRoPicpYCBpbnN0ZWFkIG9mIGAkdGhyaWZ0Q2xhc3NMb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignbmFtZXNwYWNlJywgJzxwYXRoPicpYC4KZGlmZiAtLWdpdCBhL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE3NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNSBAQAorIyMgUEhQIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbUFNSLTJdKGh0dHA6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0yLykKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwIGIvbGliL3BocC9saWIvQmFzZS9UQmFzZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCkBAIC0wLDAgKzEsMzgyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEJhc2U7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgVGhyaWZ0IHN0cnVjdHMgZXh0ZW5kLiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuCisgKiBjdXQgYmFjayBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggaXMgdHVybmluZyBvdXQgdG8gaGF2ZSBhCisgKiBub250cml2aWFsIGNvc3QganVzdCB0byBsb2FkIHRoYW5rcyB0byB0aGUgd29uZHJvdXNseSBhYnlzbWFsIGltcGxlbWVudGF0aW9uCisgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZworICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CisgICAgcHVibGljIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiAnQm9vbCcsCisgICAgICAgIFRUeXBlOjpCWVRFID0+ICdCeXRlJywKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAnSTE2JywKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAnSTMyJywKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAnSTY0JywKKyAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKKyAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJworICAgICk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjID0gbnVsbCwgJHZhbHMgPSBudWxsKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgeworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9ICR2YWxzWyR2YXJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCisgICAgeworICAgICAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2MWJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ2xhc3NMb2FkZXIgdG8gbG9hZCBUaHJpZnQgbGlicmFyeSBhbmQgZGVmaW5pdGlvbnMKKyAqIEluc3BpcmVkIGZyb20gVW5pdmVyc2FsQ2xhc3NMb2FkZXIgZnJvbSBTeW1mb255IDIKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuY2xhc3Nsb2FkZXIKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XENsYXNzTG9hZGVyOworCitjbGFzcyBUaHJpZnRDbGFzc0xvYWRlcgoreworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZXMgcGF0aAorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG5hbWVzcGFjZXMgPSBhcnJheSgpOworCisgICAgLyoqCisgICAgICogVGhyaWZ0IGRlZmluaXRpb24gcGF0aHMKKyAgICAgKiBAdmFyIHR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlZmluaXRpb25zID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIERvIHdlIHVzZSBBUEMgY2FjaGUgPworICAgICAqIEB2YXIgYm9vbGVhbgorICAgICAqLworICAgIHByb3RlY3RlZCAkYXBjID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBUEMgQ2FjaGUgcHJlZml4CisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwY19wcmVmaXg7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYXV0b2xvYWRlciB0byB1c2UgQVBDIGNhY2hlCisgICAgICogQHBhcmFtIGJvb2xlYW4gJGFwYworICAgICAqIEBwYXJhbSBzdHJpbmcgJGFwY19wcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCisgICAgeworICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKKyAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgbmFtZXNwYWNlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyTmFtZXNwYWNlKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBUaHJpZnQgZGVmaW5pdGlvbiBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIGRlZmluaXRpb24gbmFtZXNwYWNlCisgICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkcGF0aHMgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIEJvb2xlYW4gJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBhdXRvbG9hZGVyIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MsIGRlZmluaXRpb24gb3IgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCisgICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKKyAgICAgICAgKSB7CisgICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbkFwYygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlID0gYXBjX2ZldGNoKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzKSkgeworICAgICAgICAgICAgYXBjX3N0b3JlKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzLCAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGNsYXNzIGluIG5hbWVzcGFjZXMgb3IgZGVmaW5pdGlvbnMgZGlyZWN0b3JpZXMKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MKKyAgICAgKiBAcmV0dXJuIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCisgICAgeworICAgICAgICAvLyBSZW1vdmUgZmlyc3QgYmFja3NsYXNoCisgICAgICAgIGlmICgnXFwnID09ICRjbGFzc1swXSkgeworICAgICAgICAgICAgJGNsYXNzID0gc3Vic3RyKCRjbGFzcywgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKKyAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgY2xhc3MgbmFtZQorICAgICAgICAgICAgJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRwb3MpOworCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIG5vcm1hbCBuYW1lc3BhY2VzCisgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRwb3MgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gVGhyaWZ0IG5hbWVzcGFjZXMKKworICAgICAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IHBhcnQgb2YgbmFtZXNwYWNlCisgICAgICAgICAgICAkbSA9IGV4cGxvZGUoJ1xcJywgJGNsYXNzKTsKKworICAgICAgICAgICAgLy8gSWdub3JlIHdyb25nIGNhbGwKKyAgICAgICAgICAgIGlmIChjb3VudCgkbSkgPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGNsYXNzID0gYXJyYXlfcG9wKCRtKTsKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBpbXBsb2RlKCdcXCcsICRtKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRlZmluaXRpb25zIGFzICRucyA9PiAkZGlycykgeworICAgICAgICAgICAgICAgIC8vRG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgYXV0b2xvYWRlcnMKKyAgICAgICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKCRuYW1lc3BhY2UsICRucykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogQXZhaWxhYmxlIGluIHNlcnZpY2U6IEludGVyZmFjZSwgQ2xpZW50LCBQcm9jZXNzb3IsIFJlc3QKKyAgICAgICAgICAgICAgICAgICAgICogQW5kIGV2ZXJ5IHNlcnZpY2UgbWV0aG9kcyAoXy4rKQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHByZWdfbWF0Y2goJyMoLispKGlmfGNsaWVudHxwcm9jZXNzb3J8cmVzdCkkI2knLCAkY2xhc3MsICRuKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispX1thLXowLTldK18oYXJnc3xyZXN1bHQpJCNpJywgJGNsYXNzLCAkbikKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJ1R5cGVzJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAkblsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkgLgorICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lIC4gJy5waHAnOworCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljICRfVFNQRUMgPQorICAgICAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKKyAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKKyAgICAgICAgICAgIDIgPT4gYXJyYXkoJ3ZhcicgPT4gJ2NvZGUnLAorICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6STMyKSk7CisKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBVTktOT1dOX01FVEhPRCA9IDE7CisgICAgY29uc3QgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICAgIGNvbnN0IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICAgIGNvbnN0IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgICAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OworICAgIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgICBjb25zdCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgICBjb25zdCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgICAgICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJG1lc3NhZ2UpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmICgkY29kZSA9ICR0aGlzLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJGNvZGUpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJmODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzg0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxCYXNlXFRCYXNlOworCisvKioKKyAqIE5PVEUobWNzbGVlKTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgYSB0b24gb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gVEJhc2UKKyAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzYXZlIENQVSBjeWNsZXMgYW5kIHRoaXMgaXMgbm90IHlldCBpbiBhbiBleHRlbnNpb24uCisgKiBJZGVhbGx5IHdlJ2QgbXVsdGlwbHktaW5oZXJpdCBURXhjZXB0aW9uIGZyb20gYm90aCBFeGNlcHRpb24gYW5kIEJhc2UsIGJ1dAorICogdGhhdCdzIG5vdCBwb3NzaWJsZSBpbiBQSFAgYW5kIHRoZXJlIGFyZSBubyBtb2R1bGVzIGVpdGhlciwgc28gZm9yIG5vdyB3ZQorICogYXBvbG9nZXRpY2FsbHkgdGFrZSBhIHRyaXAgdG8gSGFja1Rvd24uCisgKgorICogQ2FuIGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSkgb3Igd2l0aAorICogVGhyaWZ0IEJhc2Ugb2JqZWN0IGNvbnN0cnVjdG9yIChzcGVjLCB2YWxzKS4KKyAqCisgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKKyAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKKyAqLworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxID0gbnVsbCwgJHAyID0gMCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKKyAgICAgICAgICAgICRzcGVjID0gJHAxOworICAgICAgICAgICAgJHZhbHMgPSAkcDI7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwMSwgJHAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTVkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDUwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisgKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCisvKioKKyAqIFByb3RvY29sIGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IElOVkFMSURfREFUQSA9IDE7CisgICAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgY29uc3QgU0laRV9MSU1JVCA9IDM7CisgICAgY29uc3QgQkFEX1ZFUlNJT04gPSA0OworICAgIGNvbnN0IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgY29uc3QgREVQVEhfTElNSVQgPSA2OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhkNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc3BvcnQgZXhjZXB0aW9ucworICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IE5PVF9PUEVOID0gMTsKKyAgICBjb25zdCBBTFJFQURZX09QRU4gPSAyOworICAgIGNvbnN0IFRJTUVEX09VVCA9IDM7CisgICAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTkxODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByaXZhdGUgJHN0cmljdFdyaXRlXyA9IGZhbHNlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWRfLCAkdGhpcy0+c3RyaWN0V3JpdGVfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmI4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmYjFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCisvKioKKyAqIEpTT04gUHJvdG9jb2wgRmFjdG9yeQorICovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCR0cmFucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSwzNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCisvKioKKyAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cworICovCitpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgcHJvdG9jb2wgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGU0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKQEAgLTAsMCArMSw2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcTWJzdHJpbmc7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcVFN0cmluZ0Z1bmM7CisKK2NsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQoreworICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCisgICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7CisgICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQorICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlOiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCisgICAgICAgICAqLworICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgeworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBNYnN0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHIqIGZ1bmN0aW9ucyBlbmFibGVkIHNvIHVzZSBQSFAgY29yZSBzdHIqIGZ1bmN0aW9ucyBmb3IKKyAgICAgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKQEAgLTAsMCArMSwxOCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OworCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJjYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKQEAgLTAsMCArMSwzOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCitjbGFzcyBCYXNlQ29udGV4dAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBlc2NhcGVOdW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY2NTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKQEAgLTAsMCArMSw1NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7CisKK2NsYXNzIExpc3RDb250ZXh0IGV4dGVuZHMgQmFzZUNvbnRleHQKK3sKKyAgICBwcml2YXRlICRmaXJzdF8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZShUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5yZWFkSlNPTlN5bnRheENoYXIoVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMThjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKQEAgLTAsMCArMSw1NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIKK3sKKyAgICBwcml2YXRlICRoYXNEYXRhXyA9IGZhbHNlOworICAgIHByaXZhdGUgJGRhdGFfID0gYXJyYXkoKTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aGFzRGF0YV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcGVlaygpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT5oYXNEYXRhXykgeworICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IHRydWU7CisKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkdGhpcy0+ZGF0YV8sIDAsIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzNTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCkBAIC0wLDAgKzEsNjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCitjbGFzcyBQYWlyQ29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSAkZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfID0gbnVsbDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgkdGhpcy0+Y29sb25fID8gVEpTT05Qcm90b2NvbDo6Q09MT04gOiBUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPnJlYWRKU09OU3ludGF4Q2hhcigkdGhpcy0+Y29sb25fID8gVEpTT05Qcm90b2NvbDo6Q09MT04gOiBUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXNjYXBlTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29sb25fOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworY2xhc3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQxNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApAQCAtMCwwICsxLDM1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIENvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNDZkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOworCitjbGFzcyBMaXN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzA2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKworY2xhc3MgTWFwQ29udGV4dCBleHRlbmRzIFN0cnVjdENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGlzS2V5ID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBwYXJlbnQ6OndyaXRlKCk7CisgICAgICAgICR0aGlzLT5pc0tleSA9ICEkdGhpcy0+aXNLZXk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzTWFwS2V5KCkKKyAgICB7CisgICAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAgIC8vIG9mIHRoZWlyIHR5cGUKKyAgICAgICAgcmV0dXJuICR0aGlzLT5pc0tleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE2MmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApAQCAtMCwwICsxLDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKKworY2xhc3MgU3RydWN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJvdGVjdGVkICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKAorICAgICAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPworICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT0xPTiA6CisgICAgICAgICAgICAgICAgICAgIFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BCisgICAgICAgICAgICApOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKQEAgLTAsMCArMSw0NTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICAgIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgcHJvdGVjdGVkICRzdHJpY3RXcml0ZV8gPSB0cnVlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gc2VsZjo6VkVSU0lPTl8xIHwgJHR5cGU7CisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnbicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKKworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDQpOworCisgICAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpKCR2YWx1ZSAvIDQyOTQ5NjcyOTYpOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWU7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRoaSA9ICR2YWx1ZSA+PiAzMjsKKyAgICAgICAgICAgICRsbyA9ICR2YWx1ZSAmIDB4RkZGRkZGRkY7CisgICAgICAgICAgICAkZGF0YSA9IHBhY2soJ04yJywgJGhpLCAkbG8pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlSTMyKCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkc3opOworICAgICAgICBpZiAoJHN6IDwgMCkgeworICAgICAgICAgICAgJHZlcnNpb24gPSAoaW50KSgkc3ogJiBzZWxmOjpWRVJTSU9OX01BU0spOworICAgICAgICAgICAgaWYgKCR2ZXJzaW9uICE9IChpbnQpc2VsZjo6VkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJyAuICRzeiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdHlwZSA9ICRzeiAmIDB4MDAwMDAwZmY7CisgICAgICAgICAgICAkcmVzdWx0ICs9CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0CisgICAgICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRzeik7CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICAgICAkc3ogKworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7CisgICAgICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkSWQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnbicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgeworICAgICAgICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOworCisgICAgICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOworCisgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKKyAgICAgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKKyAgICAgICAgICAgICRoaSA9ICRhcnJbMV07CisgICAgICAgICAgICAkbG8gPSAkYXJyWzJdOworICAgICAgICAgICAgJGlzTmVnID0gJGhpIDwgMDsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkaGkrKzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkbG8rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvcmNlIDMyYml0IHdvcmRzIGluIGV4Y2VzcyBvZiAyRyB0byBwZSBwb3NpdGl2ZSAtIHdlIGRlYWwgd2lnaCBzaWduCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkaGkgJj0gKGludCkweDdmZmZmZmZmOworICAgICAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHZhbHVlID0gJGhpICogNDI5NDk2NzI5NiArICRsbzsKKworICAgICAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKKyAgICAgICAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdICogNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3OTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CisKKy8qKgorICogQWNjZWxlcmF0ZWQgYmluYXJ5IHByb3RvY29sOiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRocmlmdF9wcm90b2NvbAorICogZXh0ZW5zaW9uIGZvciBmYXN0ZXIgZGVzZXJpYWxpemF0aW9uCisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGV4dGVuZHMgVEJpbmFyeVByb3RvY29sCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCisgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKKworICAgICAgICAvLyBOT1RFICh0LmhlaW50eik6IFRoaXMgaXMgdmVyeSBldmlsIHRvIGRvLCBiZWNhdXNlIHRoZSBUQnVmZmVyZWRUcmFuc3BvcnQgbWF5IHN3YWxsb3cgYnl0ZXMsIHdoaWNoCisgICAgICAgIC8vIGFyZSB0aGVuIG5ldmVyIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGlzIGhhcHBlbnMgcHJlY2lzZWx5IHdoZW4gYSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBtYXggYnVmZmVyIHNpemUgKDUxMiBieSBkZWZhdWx0KSBpcyB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQgYW5kIHRoZW4gZmx1c2goKSBpcyBOT1QKKyAgICAgICAgLy8gY2FsbGVkLiBJbiB0aGF0IGNhc2UgdGhlIGRhdGEgc3RheXMgaW4gdGhlIHdyaXRlQnVmZmVyIG9mIHRoZSB0cmFuc3BvcnQsIGZyb20gd2hlcmUgaXQgY2FuIG5ldmVyIGJlCisgICAgICAgIC8vIGFjY2Vzc2VkIGFnYWluIChmb3IgZXhhbXBsZSB0aHJvdWdoIHJlYWQoKSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgd3JhcHBpbmcgdHJhbnNwb3J0LCB0aGlzIGNyZWF0ZXMgYnVncyB3aGljaAorICAgICAgICAvLyBhcmUgdmVyeSBkaWZmaWN1bHQgdG8gZmluZC4gSGVuY2UgdGhlIHdyYXBwaW5nIG9mIGEgdHJhbnNwb3J0IGluIGEgYnVmZmVyIHNob3VsZCBiZSBsZWZ0IHRvIHRoZQorICAgICAgICAvLyBjYWxsaW5nIGNvZGUuIEFuIGludGVyZmFjZSBjb3VsZCB1c2VkIHRvIG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBwdXRCYWNrKCkgbWV0aG9kIGluIHRoZSB0cmFuc3BvcnQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEkgYW0gbGVhdmluZyB0aGlzIGNvZGUgaW4gbm9uZXRoZWxlc3MsIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGFwcGxpY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhpcyBiZWhhdmlvci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorCisgICAgICAgIGlmICghbWV0aG9kX2V4aXN0cygkdHJhbnMsICdwdXRCYWNrJykpIHsKKyAgICAgICAgICAgICR0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHRyYW5zKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMmEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNzM5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIENvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KKyAqCisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOworICAgIGNvbnN0IENPTVBBQ1RfVFJVRSA9IDB4MDE7CisgICAgY29uc3QgQ09NUEFDVF9GQUxTRSA9IDB4MDI7CisgICAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKKyAgICBjb25zdCBDT01QQUNUX0kxNiA9IDB4MDQ7CisgICAgY29uc3QgQ09NUEFDVF9JMzIgPSAweDA1OworICAgIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKKyAgICBjb25zdCBDT01QQUNUX0RPVUJMRSA9IDB4MDc7CisgICAgY29uc3QgQ09NUEFDVF9CSU5BUlkgPSAweDA4OworICAgIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7CisgICAgY29uc3QgQ09NUEFDVF9TRVQgPSAweDBBOworICAgIGNvbnN0IENPTVBBQ1RfTUFQID0gMHgwQjsKKyAgICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7CisKKyAgICBjb25zdCBTVEFURV9DTEVBUiA9IDA7CisgICAgY29uc3QgU1RBVEVfRklFTERfV1JJVEUgPSAxOworICAgIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfV1JJVEUgPSAzOworICAgIGNvbnN0IFNUQVRFX0JPT0xfV1JJVEUgPSA0OworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OworICAgIGNvbnN0IFNUQVRFX0NPTlRBSU5FUl9SRUFEID0gNjsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9SRUFEID0gNzsKKyAgICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OworCisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHgxZjsKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKyAgICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7CisgICAgY29uc3QgVFlQRV9NQVNLID0gMHhlMDsKKyAgICBjb25zdCBUWVBFX0JJVFMgPSAweDA3OworICAgIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgJGN0eXBlcyA9IGFycmF5KAorICAgICAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCisgICAgICAgIFRUeXBlOjpCT09MID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgorICAgICAgICBUVHlwZTo6QllURSA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JZVEUsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlksCisgICAgICAgIFRUeXBlOjpTVFJVQ1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QsCisgICAgICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAorICAgICAgICBUVHlwZTo6U0VUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VULAorICAgICAgICBUVHlwZTo6TUFQID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQLAorICAgICk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QID0+IFRUeXBlOjpTVE9QLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUgPT4gVFR5cGU6OkJPT0wsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSA9PiBUVHlwZTo6Qk9PTCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kxNiA9PiBUVHlwZTo6STE2LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiA9PiBUVHlwZTo6STMyLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0RPVUJMRSA9PiBUVHlwZTo6RE9VQkxFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSA9PiBUVHlwZTo6U1RSSU5HLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0xJU1QgPT4gVFR5cGU6OkxTVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQgPT4gVFR5cGU6OlNFVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkICRzdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworICAgIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7CisgICAgcHJvdGVjdGVkICRib29sRmlkID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgJGJvb2xWYWx1ZSA9IG51bGw7CisgICAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKKyAgICBwcm90ZWN0ZWQgJGNvbnRhaW5lcnMgPSBhcnJheSgpOworCisgICAgLy8gU29tZSB2YXJpbnQgLyB6aWd6YWcgaGVscGVyIG1ldGhvZHMKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZyb21aaWdaYWcoJG4pCisgICAgeworICAgICAgICByZXR1cm4gKCRuID4+IDEpIF4gLSgkbiAmIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gIiI7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICRkYXRhID0gJGRhdGEgPj4gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVZhcmludCgkZGF0YSkKKyAgICB7CisgICAgICAgICRvdXQgPSAkdGhpcy0+Z2V0VmFyaW50KCRkYXRhKTsKKyAgICAgICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRWYXJpbnQoJiRyZXN1bHQpCisgICAgeworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKyAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgJHJlc3VsdCB8PSAoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQ7CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICRpZHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPQorICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04gfAorICAgICAgICAgICAgICAgICgkdHlwZSA8PCBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2VxaWQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkb2xkX3ZhbHVlcyA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRvbGRfdmFsdWVzWzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRvbGRfdmFsdWVzWzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgJGRlbHRhID0gJGZpZCAtICR0aGlzLT5sYXN0RmlkOworICAgICAgICBpZiAoMCA8ICRkZWx0YSAmJiAkZGVsdGEgPD0gMTUpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoKCRkZWx0YSA8PCA0KSB8ICR0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmlkKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWQ7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpCisgICAgeworICAgICAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKHNlbGY6OiRjdHlwZXNbJGZpZWxkX3R5cGVdLCAkZmllbGRfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkJlZ2luKCRldHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA8PSAxNCkgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKKyAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgweGYwIHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgaWYgKCRzaXplID09IDApIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAorICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgeworICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKKyAgICAgICAgICAgIGlmICgkdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAkY3R5cGUgPSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcigkY3R5cGUsICR0aGlzLT5ib29sRmlkKTsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEUpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKCR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMTYpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMzIpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpCisgICAgeworICAgICAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVWYXJpbnQoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdmFsdWUsICRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRfdHlwZSwgJiRmaWVsZF9pZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRjb21wYWN0X3R5cGVfYW5kX2RlbHRhKTsKKworICAgICAgICAkY29tcGFjdF90eXBlID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgJiAweDBmOworCisgICAgICAgIGlmICgkY29tcGFjdF90eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRfdHlwZSA9ICRjb21wYWN0X3R5cGU7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkZGVsdGEgPSAkY29tcGFjdF90eXBlX2FuZF9kZWx0YSA+PiA0OworICAgICAgICBpZiAoJGRlbHRhID09IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZF9pZCA9ICR0aGlzLT5sYXN0RmlkICsgJGRlbHRhOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZWxkX2lkOworICAgICAgICAkZmllbGRfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkY29tcGFjdF90eXBlKTsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRDsKKyAgICAgICAgICAgICR0aGlzLT5ib29sVmFsdWUgPSB0cnVlOworICAgICAgICB9IGVsc2VpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVUJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFppZ1phZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCR2YWx1ZSk7CisgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5mcm9tWmlnWmFnKCR2YWx1ZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcHJvdG9JZCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRwcm90b0lkKTsKKyAgICAgICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICR2ZXJUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKKyAgICAgICAgJHR5cGUgPSAoJHZlclR5cGUgPj4gVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9CSVRTOworICAgICAgICAkdmVyc2lvbiA9ICR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLOworICAgICAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNlcWlkKTsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICRsYXN0ID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gJGxhc3RbMF07CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGxhc3RbMV07CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkc2l6ZVR5cGUgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkc2l6ZVR5cGUpOworICAgICAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OworICAgICAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOworICAgICAgICBpZiAoJHNpemUgPT0gMTUpIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgJHR5cGVzID0gMDsKKyAgICAgICAgaWYgKCRzaXplID4gMCkgeworICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgJHZhbF90eXBlID0gJHRoaXMtPmdldFRUeXBlKCR0eXBlcyk7CisgICAgICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5ib29sVmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICcnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUVHlwZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzZWxmOjokdHR5cGVzWyRieXRlICYgMHgwZl07CisgICAgfQorCisgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorCisgICAgLy8gUmVhZCBhbmQgd3JpdGUgSTY0IGFzIHR3byAzMiBiaXQgbnVtYmVycyAkaGkgYW5kICRsbworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIFJlYWQgdmFyaW50IGZyb20gd2lyZQorICAgICAgICAkaGkgPSAwOworICAgICAgICAkbG8gPSAwOworCisgICAgICAgICRpZHggPSAwOworICAgICAgICAkc2hpZnQgPSAwOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgorICAgICAgICAgICAgaWYgKCRzaGlmdCA8IDI4KSB7CisgICAgICAgICAgICAgICAgJGxvIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQpOworICAgICAgICAgICAgfSBlbHNlaWYgKCRzaGlmdCA9PSAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHgwZikgPDwgMjgpOworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3MCkgPj4gNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPDwgKCRzaGlmdCAtIDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdywgdW56aWcgaXQuCisgICAgICAgICR4b3JlciA9IDA7CisgICAgICAgIGlmICgkbG8gJiAxKSB7CisgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICB9CisgICAgICAgICRsbyA9ICgkbG8gPj4gMSkgJiAweDdmZmZmZmZmOworICAgICAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKKyAgICAgICAgJGhpID0gKCRoaSA+PiAxKSBeICR4b3JlcjsKKyAgICAgICAgJGxvID0gJGxvIF4gJHhvcmVyOworCisgICAgICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgorICAgICAgICAkaXNOZWcgPSAkaGkgPCAwIHx8ICRoaSAmIDB4ODAwMDAwMDA7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gYmUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpdGggc2lnbgorICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgaWYgKCRoaSAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFzIG5lZ2F0aXZlIHZhbHVlIGZpcnN0LCBzaW5jZSB3ZSBjYW4gc3RvcmUgLTJeNjMgYnV0IG5vdCAyXjYzCisgICAgICAgICR2YWx1ZSA9IC0kaGkgKiA0Mjk0OTY3Mjk2IC0gJGxvOworCisgICAgICAgIGlmICghJGlzTmVnKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAtJHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRpZHg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCisgICAgICAgIGlmICgoJHZhbHVlID4gNDI5NDk2NzI5NikgfHwgKCR2YWx1ZSA8IC00Mjk0OTY3Mjk2KSkgeworICAgICAgICAgICAgLy8gQ29udmVydCAkdmFsdWUgdG8gJGhpIGFuZCAkbG8KKyAgICAgICAgICAgICRuZWcgPSAkdmFsdWUgPCAwOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGhpID0gKGludCkkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAoaW50KSR2YWx1ZSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgZG8gdGhlIHppZ2dpbmcgYW5kIHphZ2dpbmcuCisgICAgICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OworICAgICAgICAgICAgJGxvID0gKCRsbyA8PCAxKTsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKworICAgICAgICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbworICAgICAgICAgICAgJG91dCA9ICIiOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIH4weDdmKSA9PT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAkaGkgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRsbyAmIDB4ZmYpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgICAgICRsbyA9ICRsbyA+PiA3OworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKKyAgICAgICAgICAgICAgICAgICAgJGhpID0gJGhpID4+IDc7CisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IHNoaWZ0IGNhcnJpZXMgc2lnbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8uCisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXQpOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODE1IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMb29rYWhlYWRSZWFkZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cUGFpckNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTGlzdENvbnRleHQ7CisKKy8qKgorICogSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01NQSA9ICcsJzsKKyAgICBjb25zdCBDT0xPTiA9ICc6JzsKKyAgICBjb25zdCBMQlJBQ0UgPSAneyc7CisgICAgY29uc3QgUkJSQUNFID0gJ30nOworICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOworICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOworICAgIGNvbnN0IFFVT1RFID0gJyInOworICAgIGNvbnN0IEJBQ0tTTEFTSCA9ICdcXCc7CisgICAgY29uc3QgWkVSTyA9ICcwJzsKKyAgICBjb25zdCBFU0NTRVEgPSAnXFwnOworICAgIGNvbnN0IERPVUJMRUVTQyA9ICdfX0RPVUJMRV9FU0NBUEVfU0VRVUVOQ0VfXyc7CisKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEpTT05fQ0hBUl9UQUJMRSA9IGFycmF5KAorICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxCisgICAgICAgIDEsIDEsICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gMgorICAgICk7CisKKyAgICBwdWJsaWMgc3RhdGljICRFU0NBUEVfQ0hBUlMgPSBhcnJheSgnIicsICdcXCcsICcvJywgImIiLCAiZiIsICJuIiwgInIiLCAidCIpOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJfVkFMUyA9IGFycmF5KAorICAgICAgICAnIicsICdcXCcsICcvJywgIlx4MDgiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAorICAgICk7CisKKyAgICBjb25zdCBOQU1FX0JPT0wgPSAidGYiOworICAgIGNvbnN0IE5BTUVfQllURSA9ICJpOCI7CisgICAgY29uc3QgTkFNRV9JMTYgPSAiaTE2IjsKKyAgICBjb25zdCBOQU1FX0kzMiA9ICJpMzIiOworICAgIGNvbnN0IE5BTUVfSTY0ID0gImk2NCI7CisgICAgY29uc3QgTkFNRV9ET1VCTEUgPSAiZGJsIjsKKyAgICBjb25zdCBOQU1FX1NUUlVDVCA9ICJyZWMiOworICAgIGNvbnN0IE5BTUVfU1RSSU5HID0gInN0ciI7CisgICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKKyAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKKyAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvclR5cGVJRCgkdHlwZUlEKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZUlEKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kzMjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfRE9VQkxFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NFVDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9MSVNUOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFR5cGVJREZvclR5cGVOYW1lKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVE9QOworCisgICAgICAgIGlmIChzdHJsZW4oJG5hbWUpID4gMSkgeworICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDAsIDEpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6RE9VQkxFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDEsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJZVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TFNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpNQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUUlVDVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICd0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJJTkc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICdlJykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTRVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6Qk9PTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRyZXN1bHQgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljICRjb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICBwdWJsaWMgJGNvbnRleHRfOworICAgIHB1YmxpYyAkcmVhZGVyXzsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gcHVzaENvbnRleHQoJGMpCisgICAgeworICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5jb250ZXh0U3RhY2tfLCAkdGhpcy0+Y29udGV4dF8pOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkYzsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHBvcENvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT5jb250ZXh0U3RhY2tfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRTdGFja18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlICR0bXBidWZfID0gYXJyYXkoNCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEpTT05TeW50YXhDaGFyKCRiKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgIT0gJGIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAiIC4gJGNoLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhleFZhbCgkcykKKyAgICB7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkcyk7ICRpKyspIHsKKyAgICAgICAgICAgICRjaCA9IHN1YnN0cigkcywgJGksIDEpOworCisgICAgICAgICAgICBpZiAoISgkY2ggPj0gImEiICYmICRjaCA8PSAiZiIpICYmICEoJGNoID49ICIwIiAmJiAkY2ggPD0gIjkiKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIgIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhleGRlYygkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhDaGFyKCR2YWwpCisgICAgeworICAgICAgICByZXR1cm4gZGVjaGV4KCR2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzSlNPTlVuZXNjYXBlZFVuaWNvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKFBIUF9NQUpPUl9WRVJTSU9OID4gNSB8fCAoUEhQX01BSk9SX1ZFUlNJT04gPT0gNSAmJiBQSFBfTUlOT1JfVkVSU0lPTiA+PSA0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB1bmVzY2FwZWRVbmljb2RlKCRzdHIpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uX2VuY29kZSgkc3RyLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHN0cik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICogSGlnaCBzdXJyb2dhdGU6IDB4RDgwMCAtIDB4REJGRgorICAgICAgICAgKiBMb3cgc3Vycm9nYXRlOiAweERDMDAgLSAweERGRkYKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShkWzg5YWJdWzAtOWEtZl17Mn0pXFxcXHUoZFtjZGVmXVswLTlhLWZdezJ9KS9pJywKKyAgICAgICAgICAgIGZ1bmN0aW9uICgkbWF0Y2hlcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoZXNbMV0gLiAkbWF0Y2hlc1syXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShbMC05YS1mXXs0fSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdKSwgJ1VURi04JywgJ1VURi0xNkJFJyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJGpzb24KKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gJGpzb247CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05TdHJpbmcoJGIpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR0aGlzLT51bmVzY2FwZWRVbmljb2RlKCRiKSk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkbnVtKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJG51bSkpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkJhc2U2NCgkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZShiYXNlNjRfZW5jb2RlKCRkYXRhKSkpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05TdHJpbmcoJHNraXBDb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCEkc2tpcENvbnRleHQpIHsKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgJGpzb25TdHJpbmcgPSAnJzsKKyAgICAgICAgJGxhc3RDaGFyID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisgICAgICAgICAgICAkanNvblN0cmluZyAuPSAkY2g7CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OlFVT1RFICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBudWxsICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY2ggPT0gc2VsZjo6RVNDU0VRICYmICRsYXN0Q2hhciA9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSBzZWxmOjpET1VCTEVFU0M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uX2RlY29kZSgkanNvblN0cmluZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0pTT05OdW1lcmljKCRiKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkYikgeworICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIHsKKyAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7CisKKyAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludHZhbCgkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGljYWwgdG8gcmVhZEpTT05JbnRlZ2VyIGJ1dCB3aXRob3V0IHRoZSBmaW5hbCBjYXN0LgorICAgICAqIE5lZWRlZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIGk2NCBvbiAzMiBiaXQgbWFjaGluZXMuICBXaHkgYQorICAgICAqIHNlcGFyYXRlIGZ1bmN0aW9uPyAgU28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JjZSB0aGUgcmVzdCBvZiB0aGUKKyAgICAgKiB1c2UgY2FzZXMgdGhyb3VnaCB0aGUgZXh0cmEgY29uZGl0aW9uYWwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXJBc1N0cmluZygpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkc3RyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgeworICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkFOOworICAgICAgICAgICAgfSBlbHNlaWYgKCRhcnIgPT0gIkluZmluaXR5IikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTkY7CisgICAgICAgICAgICB9IGVsc2VpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQgIiAuICRhcnIsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCRhcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05CYXNlNjQoKQorICAgIHsKKyAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICRkYXRhID0gYmFzZTY0X2RlY29kZSgkYXJyLCB0cnVlKTsKKworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBkYXRhICIgLiAkYXJyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpSQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGZpZWxkSWQpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGZpZWxkVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGtleVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJHZhbFR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGVsZW1UeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworCisgICAgICAgIGlmICgkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgIT0gc2VsZjo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24iLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgICRuYW1lID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RTdGFydCgpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworICAgICAgICAkbmFtZSA9ICIiOworCisgICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSA9PSBzZWxmOjpSQlJBQ0UpIHsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSBUVHlwZTo6U1RPUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZElkID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJGtleVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICR2YWxUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgJGJvb2wgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgJGJ5dGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICAkaTE2ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgJGkzMiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT09IDQpIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgICRkdWIgPSAkdGhpcy0+cmVhZEpTT05Eb3VibGUoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc5YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgICAvKioKKyAgICAgKiBTZXBhcmF0b3IgYmV0d2VlbiBzZXJ2aWNlIG5hbWUgYW5kIGZ1bmN0aW9uIG5hbWUuCisgICAgICogU2hvdWxkIGJlIHRoZSBzYW1lIGFzIHVzZWQgYXQgbXVsdGlwbGV4ZWQgVGhyaWZ0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgY29uc3QgU0VQQVJBVE9SID0gIjoiOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2Ygc2VydmljZS4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkc2VydmljZU5hbWVfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGNsYXNzLgorICAgICAqCisgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+JHNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkc2VydmljZU5hbWUpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbCk7CisgICAgICAgICR0aGlzLT5zZXJ2aWNlTmFtZV8gPSAkc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lLgorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIGlmICgkdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgICAgICRuYW1lV2l0aFNlcnZpY2UgPSAkdGhpcy0+c2VydmljZU5hbWVfIC4gc2VsZjo6U0VQQVJBVE9SIC4gJG5hbWU7CisgICAgICAgICAgICBwYXJlbnQ6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyZW50Ojp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFjZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocApAQCAtMCwwICsxLDM1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc187CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfID0gJHRyYW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2Vzc29yIGZvciB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc187CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCk7CisKKyAgICAvKgorICAgICAqIFN0YXJ0cyBhIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpOworCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKKyAgICAgKiBjYXVzaW5nIGNvcnJ1cHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNraXAoJHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJvb2woJGJvb2wpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCRieXRlKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMTYoJGkxNik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTMyKCRpMzIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEk2NCgkaTY0KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWREb3VibGUoJGR1Yik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkU3RyaW5nKCRzdHIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRrZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRMaXN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBmaWVsZCB0eXBlOiAnIC4gJHR5cGUsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkaXRyYW5zIFRUcmFuc3BvcnQgb2JqZWN0CisgICAgICogQHBhcmFtIGludCAkdHlwZSBGaWVsZCB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBza2lwQmluYXJ5KCRpdHJhbnMsICR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6CisgICAgICAgICAgICAgICAgJGxlbiA9IHVucGFjaygnTicsICRpdHJhbnMtPnJlYWRBbGwoNCkpOworICAgICAgICAgICAgICAgICRsZW4gPSAkbGVuWzFdOworICAgICAgICAgICAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIDQgKyAkaXRyYW5zLT5yZWFkQWxsKCRsZW4pOworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAvLyBLdHlwZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgICAgICRrdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgLy8gVnR5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFNpemUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkc2l6ZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDY7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgLy8gVnR5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFNpemUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkc2l6ZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDU7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVlMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApAQCAtMCwwICsxLDI4NSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gV2hpbGUgaXQgaGFzIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0CisgKiBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwgaXQgZG9lcyBub3QgbW9kaWZ5CisgKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+LgorICoKKyAqIEBwYWNrYWdlIFRocmlmdFxQcm90b2NvbAorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiBwcm90b2NvbCwgdG8gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkZWQuCisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbAorICAgICAqLworICAgIHByaXZhdGUgJGNvbmNyZXRlUHJvdG9jb2xfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBjbGFzcy4KKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqCisgICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgaW5zdGFuY2UuIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8gPSAkcHJvdG9jb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlQnl0ZSgkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkxNigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJNjQoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZURvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RyaW5nKCRzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCb29sKCRib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEkxNigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMzIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZERvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJpbmcoJHN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2YxZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXExpc3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXFN0cnVjdENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cTWFwQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uOworCisvKioKKyAqIFNpbXBsZUpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgorICovCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NTUEgPSAnLCc7CisgICAgY29uc3QgQ09MT04gPSAnOic7CisgICAgY29uc3QgTEJSQUNFID0gJ3snOworICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKKyAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKKyAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKKyAgICBjb25zdCBRVU9URSA9ICciJzsKKworICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7CisgICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7CisgICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKKworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0XyA9IG51bGw7CisgICAgcHJvdGVjdGVkICR3cml0ZUNvbnRleHRTdGFja18gPSBbXTsKKworICAgIC8qKgorICAgICAqIFB1c2ggYSBuZXcgd3JpdGUgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcHVzaFdyaXRlQ29udGV4dChDb250ZXh0ICRjKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrX1tdID0gJHRoaXMtPndyaXRlQ29udGV4dF87CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gJGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IHdyaXRlIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BXcml0ZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8gPSBhcnJheV9wb3AoJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGVuY291bnRlcmluZyBhIG1hcCB3aG9zZSBrZXlzIGFyZSBjb250YWluZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFzc2VydENvbnRleHRJc05vdE1hcEtleSgkaW52YWxpZEtleVR5cGUpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGEgbWFwIHdpdGgga2V5cyB0aGF0IGFyZSBvZiB0eXBlICIgLgorICAgICAgICAgICAgICAgICRpbnZhbGlkS2V5VHlwZQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoKHN0cmluZykkYikpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJGlzTWFwS2V5ID0gJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCk7CisKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoKGludCkkbnVtKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkRvdWJsZSgkbnVtKQorICAgIHsKKyAgICAgICAgJGlzTWFwS2V5ID0gJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCk7CisKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoKGZsb2F0KSRudW0pKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDRSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJGZpZWxkTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX01BUCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTWFwQ29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDRSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfTElTVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfU0VUKTsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgIC8vIE5vIG1ldGFkYXRhIQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJvb2wgPyAxIDogMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05Eb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIHNpbXBsZWpzb24gaXMgbm90IG1lYW50IHRvIGJlIHJlYWQgYmFjayBpbnRvIHRocmlmdAorICAgICAqIC0gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdFVzYWdlSmF2YQorICAgICAqIC0gdXNlIEpTT04gaW5zdGVhZAorICAgICAqLworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL2xpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJiMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKQEAgLTAsMCArMSw4NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VyaWFsaXplcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Cit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCisgKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCisgKi8KK2NsYXNzIFRCaW5hcnlTZXJpYWxpemVyCit7CisgICAgLy8gTk9URShybWFyaW4pOiBCZWNhdXNlIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkKKyAgICAvLyBhZGRzIGEgYmVnaW4gbWVzc2FnZSBwcmVmaXgsIHlvdSBjYW5ub3Qgc3BlY2lmeQorICAgIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bworICAgIC8vIGJlIGEgc3RyaW5nLiBPdGhlcndpc2Ugd2Ugd2lsbCBicmVhayB0aGUgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgLy8gbm9ybWFsIGRlc2VyaWFsaXphdGlvbi4KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KAorICAgICAgICAgICAgICAgICRwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAkb2JqZWN0LT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwKKyAgICAgICAgICAgICAgICAkb2JqZWN0LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbigkdW51c2VkX25hbWUsICR1bnVzZWRfdHlwZSwgJHVudXNlZF9zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkb2JqZWN0LT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICB9CisgICAgICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVzZXJpYWxpemUoJHN0cmluZ19vYmplY3QsICRjbGFzc19uYW1lLCAkYnVmZmVyX3NpemUgPSA4MTkyKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5JykpIHsKKyAgICAgICAgICAgIC8vIE5PVEUgKHQuaGVpbnR6KSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnRlcm5hbGx5IHdyYXBzIG91ciBUTWVtb3J5QnVmZmVyIGluIGEKKyAgICAgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCwgc28gd2UgaGF2ZSB0byByZXRyaWV2ZSBpdCBhZ2FpbiBvciByaXNrIGxvc2luZyBkYXRhIHdoZW4gd3JpdGluZworICAgICAgICAgICAgLy8gbGVzcyB0aGFuIDUxMiBieXRlcyB0byB0aGUgdHJhbnNwb3J0IChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgYXMgd2VsbCkuCisgICAgICAgICAgICAvLyBAc2VlIFRIUklGVC0xNTc5CisgICAgICAgICAgICAkcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKCcnLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAwKTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydCA9ICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydC0+Zmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkcHJvdG9jb2wsICRjbGFzc19uYW1lLCAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpLCAkYnVmZmVyX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRyYW5zcG9ydC0+d3JpdGUoJHN0cmluZ19vYmplY3QpOworICAgICAgICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOworICAgICAgICAgICAgJG9iamVjdC0+cmVhZCgkcHJvdG9jb2wpOworCisgICAgICAgICAgICByZXR1cm4gJG9iamVjdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjZlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTI1IEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEEgZm9ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBURm9ya2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHN0b3BfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY2hpbGRyZW5fID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBXZSBmb3JrIHdoZW4gYSBuZXcgY29ubmVjdGlvbgorICAgICAqIGFycml2ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOworCisgICAgICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICRwaWQgPSBwY250bF9mb3JrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRwaWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aGFuZGxlUGFyZW50KCR0cmFuc3BvcnQsICRwaWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHBpZCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZUNoaWxkKCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICR0aGlzLT5jb2xsZWN0Q2hpbGRyZW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvZGUgcnVuIGJ5IHRoZSBwYXJlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcGFyYW0gaW50ICRwaWQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVBhcmVudChUVHJhbnNwb3J0ICR0cmFuc3BvcnQsICRwaWQpCisgICAgeworICAgICAgICAkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdID0gJHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDaGlsZChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGV4aXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdHMgYW55IGNoaWxkcmVuIHdlIG1heSBoYXZlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbGxlY3RDaGlsZHJlbigpCisgICAgeworICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2hpbGRyZW5fIGFzICRwaWQgPT4gJHRyYW5zcG9ydCkgeworICAgICAgICAgICAgaWYgKHBjbnRsX3dhaXRwaWQoJHBpZCwgJHN0YXR1cywgV05PSEFORykgPiAwKSB7CisgICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmNoaWxkcmVuX1skcGlkXSk7CisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0CisgICAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgICAgICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ODliNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU1NMU2VydmVyU29ja2V0LnBocApAQCAtMCwwICsxLDk3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTU0xTb2NrZXQ7CisKKy8qKgorICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHBhcmFtIGludCAkcG9ydCBQb3J0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkY29udGV4dCBTdHJlYW0gY29udGV4dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCA9ICdsb2NhbGhvc3QnLCAkcG9ydCA9IDkwOTAsICRjb250ZXh0ID0gbnVsbCkKKyAgICB7CisgICAgICAgICRzc2xfaG9zdCA9ICR0aGlzLT5nZXRTU0xIb3N0KCRob3N0KTsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3NsX2hvc3QsICRwb3J0KTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5saXN0ZW5lcl8gPSBAc3RyZWFtX3NvY2tldF9zZXJ2ZXIoCisgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgU1RSRUFNX1NFUlZFUl9CSU5EIHwgU1RSRUFNX1NFUlZFUl9MSVNURU4sCisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFNvY2tldAorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKKyAgICB7CisgICAgICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKKyAgICAgICAgaWYgKCEkaGFuZGxlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICRzb2NrZXQgPSBuZXcgVFNTTFNvY2tldCgpOworICAgICAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuICRzb2NrZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlci5waHAKQEAgLTAsMCArMSwxMDIgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEZhY3RvcnlcVFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFByb3RvY29sRmFjdG9yeTsKKworLyoqCisgKiBHZW5lcmljIGNsYXNzIGZvciBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCithYnN0cmFjdCBjbGFzcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogUHJvY2Vzc29yIHRvIGhhbmRsZSBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUUHJvY2Vzc29yCisgICAgICovCisgICAgcHJvdGVjdGVkICRwcm9jZXNzb3JfOworCisgICAgLyoqCisgICAgICogU2VydmVyIHRyYW5zcG9ydCB0byBiZSB1c2VkIGZvciBsaXN0ZW5pbmcKKyAgICAgKiBhbmQgYWNjZXB0aW5nIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAdmFyIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIE91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBwcm90b2NvbCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBwcm90b2NvbCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIGFsbCB0aGUgZmFjdG9yaWVzLCBldGMKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgJHByb2Nlc3NvcgorICAgICAqIEBwYXJhbSBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeQorICAgICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRwcm9jZXNzb3IsCisgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydCwKKyAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPnByb2Nlc3Nvcl8gPSAkcHJvY2Vzc29yOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7CisgICAgICAgICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8gPSAkaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gJG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXMgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuCisgICAgICogdW5sZXNzIGEgcHJvYmxlbSBwZXJtaXRzIGl0IHRvIGRvIHNvIG9yIGl0CisgICAgICogaXMgaW50ZXJydXB0ZWQgaW50ZW50aW9uYWxseQorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHNlcnZpbmcKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzOGZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogSGFuZGxlIGZvciB0aGUgbGlzdGVuZXIgc29ja2V0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRsaXN0ZW5lcl87CisKKyAgICAvKioKKyAgICAgKiBQb3J0IGZvciB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRhY2NlcHRUaW1lb3V0XyA9IDMwMDAwOworCisgICAgLyoqCisgICAgICogSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRhY2NlcHRUaW1lb3V0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFjY2VwdFRpbWVvdXQoJGFjY2VwdFRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+YWNjZXB0VGltZW91dF8gPSAkYWNjZXB0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBAZmNsb3NlKCR0aGlzLT5saXN0ZW5lcl8pOworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFNvY2tldAorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKKyAgICB7CisgICAgICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKKyAgICAgICAgaWYgKCEkaGFuZGxlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICRzb2NrZXQgPSBuZXcgVFNvY2tldCgpOworICAgICAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuICRzb2NrZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgU2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIExpc3QgZm9yIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc2VydmVyCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIGltcGxlbWVudAorICAgICAqIGFjY2VwdC4KKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VzIHRoZSBhY2NlcHQgaW1wbGVtdGF0aW9uLiBJZiBudWxsIGlzIHJldHVybmVkLCBhbgorICAgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+YWNjZXB0SW1wbCgpOworCisgICAgICAgIGlmICgkdHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHRyYW5zcG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxZGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGUgaW1wbGVtdGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCisgKi8KK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICAgKiB0cmFuc3BvcnQuIEl0IGhhbmRsZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbnMKKyAgICAgKiB0byBhdm9pZCB0aW1lb3V0cyBldGMga2lsbGluZyBpdAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU3RvcmVkTWVzc2FnZVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhYWFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAKQEAgLTAsMCArMSw1MyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb2Nlc3NvcgorICovCisKK25hbWVzcGFjZSBUaHJpZnQ7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2xEZWNvcmF0b3I7CisKKy8qKgorICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgdGhlIE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gdGhlIE1lc3NhZ2UgbmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgcHJpdmF0ZSAkZm5hbWVfOworICAgIHByaXZhdGUgJG10eXBlXzsKKyAgICBwcml2YXRlICRyc2VxaWRfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+Zm5hbWVfICA9ICRmbmFtZTsKKyAgICAgICAgJHRoaXMtPm10eXBlXyAgPSAkbXR5cGU7CisgICAgICAgICR0aGlzLT5yc2VxaWRfID0gJHJzZXFpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRuYW1lICA9ICR0aGlzLT5mbmFtZV87CisgICAgICAgICR0eXBlICA9ICR0aGlzLT5tdHlwZV87CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yc2VxaWRfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTc1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2NsYXNzIENvcmUgaW1wbGVtZW50cyBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8vIHNwZWNpZnlpbmcgYSBudWxsICRsZW5ndGggd291bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZworICAgICAgICBpZiAoJGxlbmd0aCA9PT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBzdHJsZW4oJHN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhmZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKQEAgLTAsMCArMSw0NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU3RyaW5nRnVuYzsKKworY2xhc3MgTWJzdHJpbmcgaW1wbGVtZW50cyBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CisgICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNDk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCkBAIC0wLDAgKzEsMjggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2ludGVyZmFjZSBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCk7CisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGE5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCkBAIC0wLDAgKzEsMTE4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCisgKi8KKworbmFtZXNwYWNlIFRocmlmdDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIFByb2Nlc3NvciBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgICRwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgKgorICogICAgICRwcm9jZXNzb3ItPnByb2Nlc3MoJHByb3RvY29sLCAkcHJvdG9jb2wpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgICBwcml2YXRlICRzZXJ2aWNlUHJvY2Vzc29yTWFwXzsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzb3IoJHNlcnZpY2VOYW1lLCAkcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV0gPSAkcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqICAgICAgICAgICAgICAgICAgICBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKFRQcm90b2NvbCAkaW5wdXQsIFRQcm90b2NvbCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKworICAgICAgICBpZiAoJG10eXBlICE9PSBUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlICE9IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICAgICAgaWYgKHN0cnBvcygkZm5hbWUsIFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfS4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0KCRzZXJ2aWNlTmFtZSwgJG1lc3NhZ2VOYW1lKSA9IGV4cGxvZGUoJzonLCAkZm5hbWUsIDIpOworICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHNlcnZpY2VOYW1lLCAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAkcHJvY2Vzc29yID0gJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV07CisKKyAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLAorICAgICAgICAgICAgJG91dHB1dAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYzVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsMjA2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gU3RvcmVzIGRhdGEgdG8gYW4gaW50ZXJuYWwgYnVmZmVyIHRoYXQgaXQgZG9lc24ndAorICogYWN0dWFsbHkgd3JpdGUgb3V0IHVudGlsIGZsdXNoIGlzIGNhbGxlZC4gRm9yIHJlYWRpbmcsIHdlIGRvIGEgZ3JlZWR5CisgKiByZWFkIGFuZCB0aGVuIHNlcnZlIGRhdGEgb3V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIFRoZSByZWFkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQsICRyQnVmU2l6ZSA9IDUxMiwgJHdCdWZTaXplID0gNTEyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+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/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKKyAqLworY2xhc3MgVE1lc3NhZ2VUeXBlCit7CisgICAgY29uc3QgQ0FMTCAgPSAxOworICAgIGNvbnN0IFJFUExZID0gMjsKKyAgICBjb25zdCBFWENFUFRJT04gPSAzOworICAgIGNvbnN0IE9ORVdBWSA9IDQ7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVFR5cGUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGIxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyAqLworY2xhc3MgVFR5cGUKK3sKKyAgICBjb25zdCBTVE9QICAgPSAwOworICAgIGNvbnN0IFZPSUQgICA9IDE7CisgICAgY29uc3QgQk9PTCAgID0gMjsKKyAgICBjb25zdCBCWVRFICAgPSAzOworICAgIGNvbnN0IEkwOCAgICA9IDM7CisgICAgY29uc3QgRE9VQkxFID0gNDsKKyAgICBjb25zdCBJMTYgICAgPSA2OworICAgIGNvbnN0IEkzMiAgICA9IDg7CisgICAgY29uc3QgSTY0ICAgID0gMTA7CisgICAgY29uc3QgU1RSSU5HID0gMTE7CisgICAgY29uc3QgVVRGNyAgID0gMTE7CisgICAgY29uc3QgU1RSVUNUID0gMTI7CisgICAgY29uc3QgTUFQICAgID0gMTM7CisgICAgY29uc3QgU0VUICAgID0gMTQ7CisgICAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQorICAgIGNvbnN0IFVURjggICA9IDE2OworICAgIGNvbnN0IFVURjE2ICA9IDE3OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvVFN0cmluZ1V0aWxzLnBocCBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0YmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKQEAgLTAsMCArMSw5MCBAQAorPD9waHAKKworaW50ZXJmYWNlIFRTdHJpbmdGdW5jCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKTsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpOworfQorCitjbGFzcyBUU3RyaW5nRnVuY19Db3JlCitpbXBsZW1lbnRzIFRTdHJpbmdGdW5jIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvLyBzcGVjaWZ5aW5nIGEgbnVsbCAkbGVuZ3RoIHdvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpOworICAgIH0KK30KKworY2xhc3MgVFN0cmluZ0Z1bmNfTWJzdHJpbmcKK2ltcGxlbWVudHMgVFN0cmluZ0Z1bmMgeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CisgICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOworICAgIH0KK30KKworY2xhc3MgVFN0cmluZ0Z1bmNGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRfaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5ub3QgdXNlIHN0ciogZnVuY3Rpb25zIGZvciBieXRlIGNvdW50aW5nIGJlY2F1c2UgbXVsdGlieXRlCisgICAgICAgICAqIGNoYXJhY3RlcnMgd2lsbCBiZSByZWFkIGEgc2luZ2xlIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWU6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9tYnN0cmluZy5vdmVybG9hZC5waHAKKyAgICAgICAgICovCisgICAgICAgIGlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IFRTdHJpbmdGdW5jX01ic3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZworICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCisgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgVFN0cmluZ0Z1bmNfQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvVGhyaWZ0LnBocCBiL2xpYi9waHAvc3JjL1RocmlmdC5waHAKaW5kZXggYTE0YTNmMy4uNGZlNDM5MiAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvVGhyaWZ0LnBocAorKysgYi9saWIvcGhwL3NyYy9UaHJpZnQucGhwCkBAIC0yMCwxMSArMjAsMTEgQEAKICAqIEBwYWNrYWdlIHRocmlmdAogICovCiAKLQogLyoqCiAgKiBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAogICovCi1jbGFzcyBUVHlwZSB7CitjbGFzcyBUVHlwZQorewogICBjb25zdCBTVE9QICAgPSAwOwogICBjb25zdCBWT0lEICAgPSAxOwogICBjb25zdCBCT09MICAgPSAyOwpAQCAtNDcsNyArNDcsOCBAQAogLyoqCiAgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKICAqLwotY2xhc3MgVE1lc3NhZ2VUeXBlIHsKK2NsYXNzIFRNZXNzYWdlVHlwZQorewogICBjb25zdCBDQUxMICA9IDE7CiAgIGNvbnN0IFJFUExZID0gMjsKICAgY29uc3QgRVhDRVBUSU9OID0gMzsKQEAgLTY3LDggKzY4LDEwIEBACiAgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKICAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKICAqLwotY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkgeworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgoreworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxPW51bGwsICRwMj0wKQorICB7CiAgICAgaWYgKGlzX2FycmF5KCRwMSkgJiYgaXNfYXJyYXkoJHAyKSkgewogICAgICAgJHNwZWMgPSAkcDE7CiAgICAgICAkdmFscyA9ICRwMjsKQEAgLTkxLDcgKzk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtMTU0LDEwICsxNTgsMTIgQEAKICAgICAgICR2YXJbJGtleV0gPSAkdmFsOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CkBAIC0yMDcsMTAgKzIxMywxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRmbmFtZSA9IG51bGw7CiAgICAgJGZ0eXBlID0gMDsKQEAgLTI1NiwxMCArMjY0LDEyIEBACiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtMzE0LDEwICszMjQsMTIgQEAKICAgICAgIH0KICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGV3cml0ZSA9IG51bGw7CkBAIC0zNTcsMTAgKzM2OSwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewpAQCAtMzkyLDYgKzQwNiw3IEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCkBAIC00MDQsOCArNDE5LDggQEAKICAqIG9mIFBIUC4gTm90ZSB0aGF0IGNvZGUgaXMgaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIGhlcmUgdG8gYXZvaWQgbWFraW5nCiAgKiBmdW5jdGlvbiBjYWxscyBmb3IgZXZlcnkgZmllbGQgb3IgbWVtYmVyIG9mIGEgY29udGFpbmVyLi4KICAqLwotYWJzdHJhY3QgY2xhc3MgVEJhc2UgewotCithYnN0cmFjdCBjbGFzcyBUQmFzZQorewogICBzdGF0aWMgJHRtZXRob2QgPSBhcnJheShUVHlwZTo6Qk9PTCAgID0+ICdCb29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkJZVEUgICA9PiAnQnl0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMTYgICAgPT4gJ0kxNicsCkBAIC00MTQsMTEgKzQyOSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKIAotICBhYnN0cmFjdCBmdW5jdGlvbiByZWFkKCRpbnB1dCk7CisgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCk7CiAKLSAgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCk7CisgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKIAotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkgeworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkKKyAgewogICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7CiAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewogICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKQEAgLTQyOSw3ICs0NDUsOCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTQ5MiwxMCArNTA5LDEyIEBACiAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXJlYWQgPSAkdnJlYWQgPSBudWxsOwpAQCAtNTQ1LDEwICs1NjQsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZm5hbWUgPSBudWxsOwogICAgICRmdHlwZSA9IDA7CkBAIC01OTQsMTAgKzYxNSwxMiBAQAogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTY1MiwxMCArNjc1LDEyIEBACiAgICAgICB9CiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRld3JpdGUgPSBudWxsOwpAQCAtNjk1LDEwICs3MjAsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CiAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKQEAgLTczMCwxMSArNzU3LDEzIEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogfQogCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKICAgc3RhdGljICRfVFNQRUMgPQogICAgIGFycmF5KDEgPT4gYXJyYXkoJ3ZhcicgPT4gJ21lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+IFRUeXBlOjpTVFJJTkcpLApAQCAtNzQ3LDE2ICs3NzYsMjEgQEAKICAgY29uc3QgV1JPTkdfTUVUSE9EX05BTUUgPSAzOwogICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OwogICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgIGNvbnN0IElOVEVSTkFMX0VSUk9SID0gNjsKKyAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OwogCi0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApIHsKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCisgIHsKICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7CiAgIH0KIAotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KSB7CisgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgIHsKICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKICAgfQogCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7CisgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwogICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKQEAgLTc3MSw2ICs4MDUsNyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIH0KQEAgLTc4MywzICs4MTgsNCBAQAogfQogaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVFByb3RvY29sLnBocCc7CiBpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAnOworaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVFN0cmluZ1V0aWxzLnBocCc7CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAgYi9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAKaW5kZXggM2EzNTU0NS4uODViZDc5NyAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwCisrKyBiL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocApAQCAtMjAsNyArMjAsNiBAQAogICogQHBhY2thZ2UgdGhyaWZ0CiAgKi8KIAotCiAvKioKICAqIEluY2x1ZGUgdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVzZSBhdXRvbG9hZCB3aXRoIHlvdXIgUEhQIGdlbmVyYXRlZCBUaHJpZnQKICAqIGNvZGUuIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsICpub3QqIGluY2x1ZGUgYW55IGRlZmluZWQgVGhyaWZ0IGNsYXNzZXMgYnkKQEAgLTM3LDEyICszNiwxMyBAQAogJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10gPSBhcnJheSgpOwogCiBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnX19hdXRvbG9hZCcpKSB7Ci0gIGZ1bmN0aW9uIF9fYXV0b2xvYWQoJGNsYXNzKSB7CisgIGZ1bmN0aW9uIF9fYXV0b2xvYWQoJGNsYXNzKQorICB7CiAgICAgZ2xvYmFsICRUSFJJRlRfQVVUT0xPQUQ7CiAgICAgJGNsYXNzbCA9IHN0cnRvbG93ZXIoJGNsYXNzKTsKICAgICBpZiAoaXNzZXQoJFRIUklGVF9BVVRPTE9BRFskY2xhc3NsXSkpIHsKICAgICAgIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLycuJFRIUklGVF9BVVRPTE9BRFskY2xhc3NsXTsKLSAgICB9IGVsc2UgaWYgKCFlbXB0eSgkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSkpIHsKKyAgICB9IGVsc2VpZiAoIWVtcHR5KCRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddKSkgewogICAgICAgZm9yZWFjaCAoJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10gYXMgJGhvb2spIHsKICAgICAgICAgJGhvb2soJGNsYXNzKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKaW5kZXggMmMzMzhhMC4uZTIxMzhjOCAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKQEAgLTIsMTQgKzIsMzMgQEAKIGRubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAogZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KK2RubAorZG5sIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK2RubCBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZG5sIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitkbmwgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCitkbmwgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorZG5sICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK2RubCB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2RubAorZG5sICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK2RubAorZG5sIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK2RubCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorZG5sICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorZG5sIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitkbmwgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworZG5sIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBQSFBfQVJHX0VOQUJMRSh0aHJpZnRfcHJvdG9jb2wsIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uLAotWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgZmJ0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uXSkKK1sgIC0tZW5hYmxlLXRocmlmdF9wcm90b2NvbAlFbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQogCiBpZiB0ZXN0ICIkUEhQX1RIUklGVF9QUk9UT0NPTCIgIT0gIm5vIjsgdGhlbgogICBQSFBfUkVRVUlSRV9DWFgoKQogICBQSFBfQUREX0xJQlJBUllfV0lUSF9QQVRIKHN0ZGMrKywgIiIsIFRIUklGVF9QUk9UT0NPTF9TSEFSRURfTElCQUREKQogICBQSFBfU1VCU1QoVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKysxMSIKKwogICBQSFBfTkVXX0VYVEVOU0lPTih0aHJpZnRfcHJvdG9jb2wsIHBocF90aHJpZnRfcHJvdG9jb2wuY3BwLCAkZXh0X3NoYXJlZCkKIGZpCiAKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMiBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYyNzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyCkBAIC0wLDAgKzEsOCBAQAorLy8gJElkOiBjb25maWcudzMyIDI1MDQwNCAyMDA4LTAxLTExIDEzOjM3OjI0WiBycmljaGFyZHMgJAorLy8gdmltOmZ0PWphdmFzY3JpcHQKKworQVJHX1dJVEgoInRocmlmdF9wcm90b2NvbCIsICJ3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbiIsICJ5ZXMiKTsKKworaWYgKFBIUF9USFJJRlRfUFJPVE9DT0wgPT0gInllcyIpeworICBFWFRFTlNJT04oInRocmlmdF9wcm90b2NvbCIsICJwaHBfdGhyaWZ0X3Byb3RvY29sLmNwcCIpCit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcAppbmRleCAzYzJjYzhjLi42M2M4OTA1IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKQEAgLTE2LDE2ICsxNiwyMyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQogI2lmZGVmIEhBVkVfQ09ORklHX0gKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCisjaW5jbHVkZSAicGhwLmgiCisjaW5jbHVkZSAiemVuZF9pbnRlcmZhY2VzLmgiCisjaW5jbHVkZSAiemVuZF9leGNlcHRpb25zLmgiCisjaW5jbHVkZSAicGhwX3RocmlmdF9wcm90b2NvbC5oIgorCisjaWYgUEhQX1ZFUlNJT05fSUQgPj0gNzAwMDAKKwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogI2lmbmRlZiBic3dhcF82NAogI2RlZmluZQlic3dhcF82NCh4KSAgICAgKCgodWludDY0X3QpKHgpIDw8IDU2KSB8IFwKQEAgLTc4LDI2ICs4NSwyMiBAQAogY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7CiBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OwogCi0jaW5jbHVkZSAicGhwLmgiCi0jaW5jbHVkZSAiemVuZF9pbnRlcmZhY2VzLmgiCi0jaW5jbHVkZSAiemVuZF9leGNlcHRpb25zLmgiCi0jaW5jbHVkZSAicGhwX3RocmlmdF9wcm90b2NvbC5oIgotCi1zdGF0aWMgZnVuY3Rpb25fZW50cnkgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9uc1tdID0gewotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgTlVMTCkKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgTlVMTCkKLSAge05VTEwsIE5VTEwsIE5VTEx9Ci19IDsKK3N0YXRpYyB6ZW5kX2Z1bmN0aW9uX2VudHJ5IHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnNbXSA9IHsKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbiwgbnVsbHB0cikKKyAge251bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9Cit9OwogCiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5ID0gewogICBTVEFOREFSRF9NT0RVTEVfSEVBREVSLAogICAidGhyaWZ0X3Byb3RvY29sIiwKICAgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9ucywKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKICAgIjEuMCIsCiAgIFNUQU5EQVJEX01PRFVMRV9QUk9QRVJUSUVTCiB9OwpAQCAtMTA4LDQyICsxMTEsNjEgQEAKIAogY2xhc3MgUEhQRXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CiBwdWJsaWM6Ci0gIFBIUEV4Y2VwdGlvbldyYXBwZXIoenZhbCogX2V4KSB0aHJvdygpIDogZXgoX2V4KSB7Ci0gICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgZXgpOworICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSB7CisgICAgWlZBTF9DT1BZKCZleCwgX2V4KTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXgpOwogICB9Ci0gIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIF93aGF0OyB9Ci0gIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7fQotICBvcGVyYXRvciB6dmFsKigpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gY29uc3RfY2FzdDx6dmFsKj4oZXgpOyB9IC8vIFplbmQgQVBJIGRvZXNuJ3QgZG8gJ2NvbnN0Jy4uLgorCisgIFBIUEV4Y2VwdGlvbldyYXBwZXIoemVuZF9vYmplY3QqIF9leG9iaikgdGhyb3coKSB7CisgICAgWlZBTF9PQkooJmV4LCBfZXhvYmopOworICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIF9leG9iaik7CisgIH0KKyAgflBIUEV4Y2VwdGlvbldyYXBwZXIoKSB0aHJvdygpIHsKKyAgICB6dmFsX2R0b3IoJmV4KTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgICByZXR1cm4gX3doYXQ7CisgIH0KKyAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDx6dmFsKj4oJmV4KTsKKyAgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KIHByb3RlY3RlZDoKLSAgenZhbCogZXg7CisgIHp2YWwgZXg7CiAgIGNoYXIgX3doYXRbNDBdOwogfSA7CiAKIGNsYXNzIFBIUFRyYW5zcG9ydCB7Ci1wdWJsaWM6Ci0gIHp2YWwqIHByb3RvY29sKCkgeyByZXR1cm4gcDsgfQotICB6dmFsKiB0cmFuc3BvcnQoKSB7IHJldHVybiB0OyB9CiBwcm90ZWN0ZWQ6Ci0gIFBIUFRyYW5zcG9ydCgpIHt9CisgIFBIUFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSkgeworICAgIGFzc2VydChaX1RZUEVfUChfcCkgPT0gSVNfT0JKRUNUKTsKIAotICB2b2lkIGNvbnN0cnVjdF93aXRoX3p2YWwoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBaVkFMX1VOREVGKCZ0KTsKKwogICAgIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVtYWxsb2MoX2J1ZmZlcl9zaXplKSk7CiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKICAgICBidWZmZXJfdXNlZCA9IDA7CiAgICAgYnVmZmVyX3NpemUgPSBfYnVmZmVyX3NpemU7Ci0gICAgcCA9IF9wOwogCiAgICAgLy8gR2V0IHRoZSB0cmFuc3BvcnQgZm9yIHRoZSBwYXNzZWQgcHJvdG9jb2wKICAgICB6dmFsIGdldHRyYW5zcG9ydDsKLSAgICBaVkFMX1NUUklORygmZ2V0dHJhbnNwb3J0LCAiZ2V0VHJhbnNwb3J0IiwgMCk7Ci0gICAgTUFLRV9TVERfWlZBTCh0KTsKLSAgICBaVkFMX05VTEwodCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnAsICZnZXR0cmFuc3BvcnQsIHQsIDAsIE5VTEwgVFNSTUxTX0NDKTsKKyAgICBaVkFMX1NUUklORygmZ2V0dHJhbnNwb3J0LCAiZ2V0VHJhbnNwb3J0Iik7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKG51bGxwdHIsIF9wLCAmZ2V0dHJhbnNwb3J0LCAmdCwgMCwgbnVsbHB0cik7CisKKyAgICB6dmFsX2R0b3IoJmdldHRyYW5zcG9ydCk7CisKKyAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgfQorCisgICAgYXNzZXJ0KFpfVFlQRSh0KSA9PSBJU19PQkpFQ1QpOwogICB9CisKICAgflBIUFRyYW5zcG9ydCgpIHsKICAgICBlZnJlZShidWZmZXIpOwotICAgIHp2YWxfcHRyX2R0b3IoJnQpOworICAgIHp2YWxfZHRvcigmdCk7CiAgIH0KIAogICBjaGFyKiBidWZmZXI7CkBAIC0xNTEsMjQgKzE3MywxOCBAQAogICBzaXplX3QgYnVmZmVyX3VzZWQ7CiAgIHNpemVfdCBidWZmZXJfc2l6ZTsKIAotICB6dmFsKiBwOwotICB6dmFsKiB0OworICB6dmFsIHQ7CiB9OwogCiAKIGNsYXNzIFBIUE91dHB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSB7Ci0gICAgY29uc3RydWN0X3dpdGhfenZhbChfcCwgX2J1ZmZlcl9zaXplKTsKLSAgfQotCi0gIH5QSFBPdXRwdXRUcmFuc3BvcnQoKSB7Ci0gICAgZmx1c2goKTsKLSAgfQorICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7IH0KKyAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsgfQogCiAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewogICAgIGlmICgobGVuICsgYnVmZmVyX3VzZWQpID4gYnVmZmVyX3NpemUpIHsKLSAgICAgIGZsdXNoKCk7CisgICAgICBpbnRlcm5hbEZsdXNoKCk7CiAgICAgfQogICAgIGlmIChsZW4gPiBidWZmZXJfc2l6ZSkgewogICAgICAgZGlyZWN0V3JpdGUoZGF0YSwgbGVuKTsKQEAgLTIwOSw0MiArMjI1LDQ4IEBACiAgIH0KIAogICB2b2lkIGZsdXNoKCkgewotICAgIGlmIChidWZmZXJfdXNlZCkgewotICAgICAgZGlyZWN0V3JpdGUoYnVmZmVyLCBidWZmZXJfdXNlZCk7Ci0gICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwotICAgICAgYnVmZmVyX3VzZWQgPSAwOwotICAgIH0KKyAgICBpbnRlcm5hbEZsdXNoKCk7CiAgICAgZGlyZWN0Rmx1c2goKTsKICAgfQogCiBwcm90ZWN0ZWQ6Ci0gIHZvaWQgZGlyZWN0Rmx1c2goKSB7Ci0gICAgenZhbCByZXQ7Ci0gICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIHp2YWwgZmx1c2hmbjsKLSAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmbHVzaGZuLCAmcmV0LCAwLCBOVUxMIFRTUk1MU19DQyk7Ci0gICAgenZhbF9kdG9yKCZyZXQpOworICB2b2lkIGludGVybmFsRmx1c2goKSB7CisgICAgIGlmIChidWZmZXJfdXNlZCkgeworICAgICAgZGlyZWN0V3JpdGUoYnVmZmVyLCBidWZmZXJfdXNlZCk7CisgICAgICBidWZmZXJfcHRyID0gYnVmZmVyOworICAgICAgYnVmZmVyX3VzZWQgPSAwOworICAgIH0KICAgfQotICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKLSAgICB6dmFsIHdyaXRlZm47Ci0gICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIsIDApOwotICAgIGNoYXIqIG5ld2J1ZiA9IChjaGFyKillbWFsbG9jKGxlbiArIDEpOwotICAgIG1lbWNweShuZXdidWYsIGRhdGEsIGxlbik7Ci0gICAgbmV3YnVmW2xlbl0gPSAnXDAnOwotICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICBaVkFMX1NUUklOR0woYXJnc1swXSwgbmV3YnVmLCBsZW4sIDApOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIHp2YWwgcmV0OworICB2b2lkIGRpcmVjdEZsdXNoKCkgeworICAgIHp2YWwgcmV0LCBmbHVzaGZuOwogICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJndyaXRlZm4sICZyZXQsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworICAgIFpWQUxfU1RSSU5HKCZmbHVzaGZuLCAiZmx1c2giKTsKKworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZmbHVzaGZuLCAmcmV0LCAwLCBudWxscHRyKTsKKyAgICB6dmFsX2R0b3IoJmZsdXNoZm4pOwogICAgIHp2YWxfZHRvcigmcmV0KTsKICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgewotICAgICAgenZhbCogZXggPSBFRyhleGNlcHRpb24pOwotICAgICAgRUcoZXhjZXB0aW9uKSA9IE5VTEw7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICB9CisgIH0KKyAgdm9pZCBkaXJlY3RXcml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgenZhbCBhcmdzWzFdLCByZXQsIHdyaXRlZm47CisKKyAgICBaVkFMX1NUUklORygmd3JpdGVmbiwgIndyaXRlIik7CisgICAgWlZBTF9TVFJJTkdMKCZhcmdzWzBdLCBkYXRhLCBsZW4pOworCisgICAgWlZBTF9OVUxMKCZyZXQpOworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZ3cml0ZWZuLCAmcmV0LCAxLCBhcmdzKTsKKworICAgIHp2YWxfZHRvcigmd3JpdGVmbik7CisgICAgenZhbF9kdG9yKCZyZXQpOworICAgIHp2YWxfZHRvcigmYXJnc1swXSk7CisKKyAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOwogICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CiAgICAgfQogICB9CkBAIC0yNTIsOCArMjc0LDcgQEAKIAogY2xhc3MgUEhQSW5wdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgUEhQSW5wdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSB7Ci0gICAgY29uc3RydWN0X3dpdGhfenZhbChfcCwgX2J1ZmZlcl9zaXplKTsKKyAgUEhQSW5wdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7CiAgIH0KIAogICB+UEhQSW5wdXRUcmFuc3BvcnQoKSB7CkBAIC0yNjIsMjQgKzI4MywyMSBAQAogCiAgIHZvaWQgcHV0X2JhY2soKSB7CiAgICAgaWYgKGJ1ZmZlcl91c2VkKSB7Ci0gICAgICB6dmFsIHB1dGJhY2tmbjsKLSAgICAgIFpWQUxfU1RSSU5HKCZwdXRiYWNrZm4sICJwdXRCYWNrIiwgMCk7Ci0KLSAgICAgIGNoYXIqIG5ld2J1ZiA9IChjaGFyKillbWFsbG9jKGJ1ZmZlcl91c2VkICsgMSk7Ci0gICAgICBtZW1jcHkobmV3YnVmLCBidWZmZXJfcHRyLCBidWZmZXJfdXNlZCk7Ci0gICAgICBuZXdidWZbYnVmZmVyX3VzZWRdID0gJ1wwJzsKLQotICAgICAgenZhbCAqYXJnc1sxXTsKLSAgICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgICBaVkFMX1NUUklOR0woYXJnc1swXSwgbmV3YnVmLCBidWZmZXJfdXNlZCwgMCk7Ci0KLSAgICAgIFRTUk1MU19GRVRDSCgpOwotCi0gICAgICB6dmFsIHJldDsKKyAgICAgIHp2YWwgYXJnc1sxXSwgcmV0LCBwdXRiYWNrZm47CisgICAgICBaVkFMX1NUUklOR0woJmFyZ3NbMF0sIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl91c2VkKTsKKyAgICAgIFpWQUxfU1RSSU5HKCZwdXRiYWNrZm4sICJwdXRCYWNrIik7CiAgICAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJnB1dGJhY2tmbiwgJnJldCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKworICAgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJnB1dGJhY2tmbiwgJnJldCwgMSwgYXJncyk7CisKKyAgICAgIHp2YWxfZHRvcigmcHV0YmFja2ZuKTsKICAgICAgIHp2YWxfZHRvcigmcmV0KTsKKyAgICAgIHp2YWxfZHRvcigmYXJnc1swXSk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CiAgICAgfQogICAgIGJ1ZmZlcl91c2VkID0gMDsKICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwpAQCAtMjg3LDcgKzMwNSw3IEBACiAKICAgdm9pZCBza2lwKHNpemVfdCBsZW4pIHsKICAgICB3aGlsZSAobGVuKSB7Ci0gICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IE1JTihsZW4sIGJ1ZmZlcl91c2VkKTsKKyAgICAgIHNpemVfdCBjaHVua19zaXplID0gKHN0ZDo6bWluKShsZW4sIGJ1ZmZlcl91c2VkKTsKICAgICAgIGlmIChjaHVua19zaXplKSB7CiAgICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7CiAgICAgICAgIGJ1ZmZlcl91c2VkIC09IGNodW5rX3NpemU7CkBAIC0zMDAsNyArMzE4LDcgQEAKIAogICB2b2lkIHJlYWRCeXRlcyh2b2lkKiBidWYsIHNpemVfdCBsZW4pIHsKICAgICB3aGlsZSAobGVuKSB7Ci0gICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IE1JTihsZW4sIGJ1ZmZlcl91c2VkKTsKKyAgICAgIHNpemVfdCBjaHVua19zaXplID0gKHN0ZDo6bWluKShsZW4sIGJ1ZmZlcl91c2VkKTsKICAgICAgIGlmIChjaHVua19zaXplKSB7CiAgICAgICAgIG1lbWNweShidWYsIGJ1ZmZlcl9wdHIsIGNodW5rX3NpemUpOwogICAgICAgICBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyX3B0cikgKyBjaHVua19zaXplOwpAQCAtMzQxLDI5ICszNTksMjkgQEAKICAgdm9pZCByZWZpbGwoKSB7CiAgICAgYXNzZXJ0KGJ1ZmZlcl91c2VkID09IDApOwogICAgIHp2YWwgcmV0dmFsOwotICAgIFpWQUxfTlVMTCgmcmV0dmFsKTsKLQotICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICBaVkFMX0xPTkcoYXJnc1swXSwgYnVmZmVyX3NpemUpOwotCi0gICAgVFNSTUxTX0ZFVENIKCk7Ci0KKyAgICB6dmFsIGFyZ3NbMV07CiAgICAgenZhbCBmdW5jbmFtZTsKLSAgICBaVkFMX1NUUklORygmZnVuY25hbWUsICJyZWFkIiwgMCk7CiAKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJmZ1bmNuYW1lLCAmcmV0dmFsLCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKyAgICBaVkFMX05VTEwoJnJldHZhbCk7CisgICAgWlZBTF9MT05HKCZhcmdzWzBdLCBidWZmZXJfc2l6ZSk7CisKKyAgICBaVkFMX1NUUklORygmZnVuY25hbWUsICJyZWFkIik7CisKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MpOworICAgIHp2YWxfZHRvcigmYXJnc1swXSk7CisgICAgenZhbF9kdG9yKCZmdW5jbmFtZSk7CiAKICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgewogICAgICAgenZhbF9kdG9yKCZyZXR2YWwpOwotICAgICAgenZhbCogZXggPSBFRyhleGNlcHRpb24pOwotICAgICAgRUcoZXhjZXB0aW9uKSA9IE5VTEw7CisKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOwogICAgIH0KIAogICAgIGJ1ZmZlcl91c2VkID0gWl9TVFJMRU4ocmV0dmFsKTsKICAgICBtZW1jcHkoYnVmZmVyLCBaX1NUUlZBTChyZXR2YWwpLCBidWZmZXJfdXNlZCk7CisKICAgICB6dmFsX2R0b3IoJnJldHZhbCk7CiAKICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwpAQCAtMzcxLDIyMiArMzg5LDYzIEBACiAKIH07CiAKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKTsKK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpOwotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCoqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYyk7Ci12b2lkIHNraXBfZWxlbWVudChsb25nIHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQpOwotdm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsICp0cmFuc3BvcnQsIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpOwotCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYyk7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlX2lzX3NjYWxhcihpbnQ4X3QgdCk7CiAKIC8vIENyZWF0ZSBhIFBIUCBvYmplY3QgZ2l2ZW4gYSB0eXBlbmFtZSBhbmQgY2FsbCB0aGUgY3Rvciwgb3B0aW9uYWxseSBwYXNzaW5nIHVwIHRvIDIgYXJndW1lbnRzCi12b2lkIGNyZWF0ZU9iamVjdChjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IE5VTEwsIHp2YWwqIGFyZzIgPSBOVUxMKSB7Ci0gIFRTUk1MU19GRVRDSCgpOwotICBzaXplX3Qgb2JqX3R5cGVuYW1lX2xlbiA9IHN0cmxlbihvYmpfdHlwZW5hbWUpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX3R5cGVuYW1lLCBvYmpfdHlwZW5hbWVfbGVuLCBaRU5EX0ZFVENIX0NMQVNTX0RFRkFVTFQgVFNSTUxTX0NDKTsKK3N0YXRpYwordm9pZCBjcmVhdGVPYmplY3QoY29uc3QgY2hhciogb2JqX3R5cGVuYW1lLCB6dmFsKiByZXR1cm5fdmFsdWUsIGludCBuYXJncyA9IDAsIHp2YWwqIGFyZzEgPSBudWxscHRyLCB6dmFsKiBhcmcyID0gbnVsbHB0cikgeworICAvKiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhhdCBvbiB0aGUgc3RhY2sgPyAqLworICB6ZW5kX3N0cmluZyAqb2JqX25hbWUgPSB6ZW5kX3N0cmluZ19pbml0KG9ial90eXBlbmFtZSwgc3RybGVuKG9ial90eXBlbmFtZSksIDApOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX25hbWUsIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCk7CisgIHplbmRfc3RyaW5nX3JlbGVhc2Uob2JqX25hbWUpOworCiAgIGlmICghIGNlKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKKyAgICBwaHBfZXJyb3JfZG9jcmVmKG51bGxwdHIsIEVfRVJST1IsICJDbGFzcyAlcyBkb2VzIG5vdCBleGlzdCIsIG9ial90eXBlbmFtZSk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfQogCi0gIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIE5VTEwpOwotICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKTsKLSAgenZhbCogY3Rvcl9ydiA9IE5VTEw7Ci0gIHplbmRfY2FsbF9tZXRob2QoJnJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyIFRTUk1MU19DQyk7Ci0gIHp2YWxfcHRyX2R0b3IoJmN0b3JfcnYpOworICBvYmplY3RfYW5kX3Byb3BlcnRpZXNfaW5pdChyZXR1cm5fdmFsdWUsIGNlLCBudWxscHRyKTsKKyAgemVuZF9mdW5jdGlvbiogY29uc3RydWN0b3IgPSB6ZW5kX3N0ZF9nZXRfY29uc3RydWN0b3IoWl9PQkpfUChyZXR1cm5fdmFsdWUpKTsKKyAgenZhbCBjdG9yX3J2OworICB6ZW5kX2NhbGxfbWV0aG9kKHJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyKTsKKyAgenZhbF9kdG9yKCZjdG9yX3J2KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9CiB9CiAKLXZvaWQgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGNoYXIqIHdoYXQsIGxvbmcgZXJyb3Jjb2RlKSB7Ci0gIFRTUk1MU19GRVRDSCgpOworc3RhdGljCit2b2lkIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihjb25zdCBjaGFyKiB3aGF0LCBsb25nIGVycm9yY29kZSkgeworICB6dmFsIHp3aGF0LCB6ZXJyb3Jjb2RlOwogCi0gIHp2YWwgKnp3aGF0LCAqemVycm9yY29kZTsKLSAgTUFLRV9TVERfWlZBTCh6d2hhdCk7Ci0gIE1BS0VfU1REX1pWQUwoemVycm9yY29kZSk7CisgIFpWQUxfU1RSSU5HKCZ6d2hhdCwgd2hhdCk7CisgIFpWQUxfTE9ORygmemVycm9yY29kZSwgZXJyb3Jjb2RlKTsKIAotICBaVkFMX1NUUklORyh6d2hhdCwgd2hhdCwgMSk7Ci0gIFpWQUxfTE9ORyh6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOworICB6dmFsIGV4OworICBjcmVhdGVPYmplY3QoIlxcVGhyaWZ0XFxFeGNlcHRpb25cXFRQcm90b2NvbEV4Y2VwdGlvbiIsICZleCwgMiwgJnp3aGF0LCAmemVycm9yY29kZSk7CiAKLSAgenZhbCogZXg7Ci0gIE1BS0VfU1REX1pWQUwoZXgpOwotICBjcmVhdGVPYmplY3QoIlRQcm90b2NvbEV4Y2VwdGlvbiIsIGV4LCAyLCB6d2hhdCwgemVycm9yY29kZSk7Ci0gIHp2YWxfcHRyX2R0b3IoJnp3aGF0KTsKLSAgenZhbF9wdHJfZHRvcigmemVycm9yY29kZSk7Ci0gIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB6dmFsX2R0b3IoJnp3aGF0KTsKKyAgenZhbF9kdG9yKCZ6ZXJyb3Jjb2RlKTsKKworICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKCZleCk7CiB9CiAKIC8vIFNldHMgRUcoZXhjZXB0aW9uKSwgY2FsbCB0aGlzIGFuZCB0aGVuIFJFVFVSTl9OVUxMKCk7CitzdGF0aWMKIHZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgewotICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdChUU1JNTFNfQ0MpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwIFRTUk1MU19DQyk7CisgIHplbmRfdGhyb3dfZXhjZXB0aW9uKHplbmRfZXhjZXB0aW9uX2dldF9kZWZhdWx0KCksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDApOwogfQogCi0KLXZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiByZXR1cm5fdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7Ci0gIHp2YWwqKiB2YWxfcHRyOwotICBaX1RZUEVfUChyZXR1cm5fdmFsdWUpID0gSVNfTlVMTDsgLy8ganVzdCBpbiBjYXNlCi0KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICAgIGlmICh6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIDYsICh2b2lkKiopJnZhbF9wdHIpICE9IFNVQ0NFU1MpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUFAodmFsX3B0cik7Ci0gICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKLSAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOwotICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgInNwZWMgZm9yICVzIGlzIHdyb25nIHR5cGU6ICVkXG4iLCBzdHJ1Y3RUeXBlLCBaX1RZUEVfUChzcGVjKSk7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFRfQk9PTDogewotICAgICAgdWludDhfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7Ci0gICAgICBSRVRVUk5fQk9PTChjICE9IDApOwotICAgIH0KLSAgLy9jYXNlIFRfSTA4OiAvLyBzYW1lIG51bWVyaWMgdmFsdWUgYXMgVF9CWVRFCi0gICAgY2FzZSBUX0JZVEU6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDhfdCljKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kxNjogewotICAgICAgdWludDE2X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDIpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDE2X3QpbnRvaHMoYykpOwotICAgIH0KLSAgICBjYXNlIFRfSTMyOiB7Ci0gICAgICB1aW50MzJfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgNCk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50MzJfdCludG9obChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9VNjQ6Ci0gICAgY2FzZSBUX0k2NDogewotICAgICAgdWludDY0X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDgpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDY0X3QpbnRvaGxsKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0RPVUJMRTogewotICAgICAgdW5pb24gewotICAgICAgICB1aW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJihhLmMpLCA4KTsKLSAgICAgIGEuYyA9IG50b2hsbChhLmMpOwotICAgICAgUkVUVVJOX0RPVUJMRShhLmQpOwotICAgIH0KLSAgICAvL2Nhc2UgVF9VVEY3OiAvLyBhbGlhc2VzIFRfU1RSSU5HCi0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgY2hhciogc3RyYnVmID0gKGNoYXIqKSBlbWFsbG9jKHNpemUgKyAxKTsKLSAgICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyhzdHJidWYsIHNpemUpOwotICAgICAgICBzdHJidWZbc2l6ZV0gPSAnXDAnOwotICAgICAgICBaVkFMX1NUUklOR0wocmV0dXJuX3ZhbHVlLCBzdHJidWYsIHNpemUsIDApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgWlZBTF9FTVBUWV9TVFJJTkcocmV0dXJuX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX01BUDogeyAvLyBhcnJheSBvZiBrZXkgLT4gdmFsdWUKLSAgICAgIHVpbnQ4X3QgdHlwZXNbMl07Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHR5cGVzLCAyKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJrZXkiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsICp2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0KLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICBNQUtFX1NURF9aVkFMKGtleSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsIGtleSwga2V5c3BlYyk7Ci0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCB2YWx1ZSwgdmFsc3BlYyk7Ci0gICAgICAgIGlmIChaX1RZUEVfUChrZXkpID09IElTX0xPTkcpIHsKLSAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfTFZBTF9QKGtleSksICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChaX1RZUEVfUChrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoa2V5KTsKLSAgICAgICAgICB6ZW5kX2hhc2hfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfU1RSVkFMX1Aoa2V5KSwgWl9TVFJMRU5fUChrZXkpICsgMSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgenZhbF9wdHJfZHRvcigma2V5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCi0gICAgfQotICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKLSAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCB2YWx1ZSwgZWxlbXNwZWMpOwotICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKLSAgICAgIHVpbnQ4X3QgdHlwZTsKLSAgICAgIHVpbnQzMl90IHNpemU7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOwotICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICB6dmFsKiB2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgWlZBTF9UUlVFKHZhbHVlKTsKLQotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCBrZXksIGVsZW1zcGVjKTsKLQotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9OwotCi0gIGNoYXIgZXJyYnVmWzEyOF07Ci0gIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7Ci0gIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci19Ci0KK3N0YXRpYwogdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KSB7CiAgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewogICAgIGNhc2UgVF9TVE9QOgpAQCAtNjQ2LDk2ICs1MDUsNDcyIEBACiAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CiB9CiAKLXZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCogdHJhbnNwb3J0LCBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKSB7Ci0gIHp2YWwgKmFyZ3NbM107Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIChjaGFyKiltZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSwgMCk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzFdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMV0sIG1zZ3R5cGUpOwotCi0gIE1BS0VfU1REX1pWQUwoYXJnc1syXSk7Ci0gIFpWQUxfTE9ORyhhcmdzWzJdLCBzZXFJRCk7Ci0KLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHp2YWwgcmV0OwotICBaVkFMX05VTEwoJnJldCk7Ci0gIHp2YWwgd3JpdGVNZXNzYWdlZm47Ci0gIFpWQUxfU1RSSU5HKCZ3cml0ZU1lc3NhZ2VmbiwgIndyaXRlTWVzc2FnZUJlZ2luIiwgMCk7Ci0gIFRTUk1MU19GRVRDSCgpOwotICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdHJhbnNwb3J0LCAmd3JpdGVNZXNzYWdlZm4sICZyZXQsIDMsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgenZhbF9kdG9yKCZyZXQpOworc3RhdGljIGlubGluZQorYm9vbCB6dmFsX2lzX2Jvb2woenZhbCogdikgeworICByZXR1cm4gWl9UWVBFX1AodikgPT0gSVNfVFJVRSB8fCBaX1RZUEVfUCh2KSA9PSBJU19GQUxTRTsKIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3Bvcykgeworc3RhdGljCit2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBaVkFMX05VTEwocmV0dXJuX3ZhbHVlKTsKKworICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX1NUUlVDVDogeworICAgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIHNpemVvZigiY2xhc3MiKS0xKTsKKyAgICAgIGlmICh2YWxfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOworICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIGNoYXIqIHN0cnVjdFR5cGUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOworICAgICAgLy8gQ3JlYXRlIGFuIG9iamVjdCBpbiBQSFAgdXNlcmxhbmQgYmFzZWQgb24gb3VyIHNwZWMKKyAgICAgIGNyZWF0ZU9iamVjdChzdHJ1Y3RUeXBlLCByZXR1cm5fdmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPT0gSVNfTlVMTCkgeworICAgICAgICAvLyB1bmFibGUgdG8gY3JlYXRlIGNsYXNzIGVudHJ5CisgICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgcmV0dXJuOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBUX0JPT0w6IHsKKyAgICAgIHVpbnQ4X3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOworICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKKyAgICB9CisgIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQorICAgIGNhc2UgVF9CWVRFOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7CisgICAgfQorICAgIGNhc2UgVF9JMTY6IHsKKyAgICAgIHVpbnQxNl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX0kzMjogeworICAgICAgdWludDMyX3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOworICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfVTY0OgorICAgIGNhc2UgVF9JNjQ6IHsKKyAgICAgIHVpbnQ2NF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7CisgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgYzsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICB9IGE7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7CisgICAgICBhLmMgPSBudG9obGwoYS5jKTsKKyAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKKyAgICB9CisgICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOiB7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGlmIChzaXplKSB7CisgICAgICAgIGNoYXIgc3RyYnVmW3NpemUrMV07CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKKyAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKKyAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCisgICAgICB1aW50OF90IHR5cGVzWzJdOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgenZhbCAqdmFsX3B0cjsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia2V5Iiwgc2l6ZW9mKCJrZXkiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhbCIsIHNpemVvZigidmFsIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMF0sIHRyYW5zcG9ydCwgJmtleSwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCAmdmFsdWUsIHZhbHNwZWMpOworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOyAvLyByZXR1cm5fdmFsdWUgYWxyZWFkeSBwb3B1bGF0ZWQKKyAgICB9CisgICAgY2FzZSBUX0xJU1Q6IHsgLy8gYXJyYXkgd2l0aCBhdXRvZ2VuZXJhdGVkIG51bWVyaWMga2V5cworICAgICAgaW50OF90IHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKyAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKKyAgICAgICAgenZhbCB2YWx1ZTsKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJnZhbHVlLCBlbGVtc3BlYyk7CisgICAgICAgIHplbmRfaGFzaF9uZXh0X2luZGV4X2luc2VydChaX0FSUl9QKHJldHVybl92YWx1ZSksICZ2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKKyAgICAgIHVpbnQ4X3QgdHlwZTsKKyAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOworICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOworICAgICAgenZhbCAqdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKyAgICAgICAgWlZBTF9UUlVFKCZ2YWx1ZSk7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJmtleSwgZWxlbXNwZWMpOworCisgICAgICAgIGlmIChaX1RZUEUoa2V5KSA9PSBJU19MT05HKSB7CisgICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfTFZBTChrZXkpLCAmdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChaX1RZUEUoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKCZrZXkpOworICAgICAgICAgIHplbmRfc3ltdGFibGVfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9TVFIoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB6dmFsX2R0b3IoJmtleSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3BvcywgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIGJvb2wga2V5dHlwZV9pc19udW1lcmljID0gKCEoKGtleXR5cGUgPT0gVF9TVFJJTkcpIHx8IChrZXl0eXBlID09IFRfVVRGOCkgfHwgKGtleXR5cGUgPT0gVF9VVEYxNikpKTsKIAotICBjaGFyKiBrZXk7CisgIHplbmRfc3RyaW5nKiBrZXk7CiAgIHVpbnQga2V5X2xlbjsKICAgbG9uZyBpbmRleCA9IDA7CiAKLSAgenZhbCogejsKLSAgTUFLRV9TVERfWlZBTCh6KTsKKyAgenZhbCB6OwogCi0gIGludCByZXMgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KGh0LCAma2V5LCAma2V5X2xlbiwgKHVsb25nKikmaW5kZXgsIDAsICZodF9wb3MpOwotICBpZiAoa2V5dHlwZV9pc19udW1lcmljKSB7Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGluZGV4ID0gc3RydG9sKGtleSwgTlVMTCwgMTApOwotICAgIH0KLSAgICBaVkFMX0xPTkcoeiwgaW5kZXgpOworICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgKHplbmRfdWxvbmcqKSZpbmRleCwgJmh0X3Bvcyk7CisgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7CisgICAgWlZBTF9TVFJfQ09QWSgmeiwga2V5KTsKICAgfSBlbHNlIHsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGtleV9sZW4gLT0gMTsgLy8gc2tpcCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgfSBlbHNlIHsKLSAgICAgIHNwcmludGYoYnVmLCAiJWxkIiwgaW5kZXgpOwotICAgICAga2V5ID0gYnVmOyBrZXlfbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgfQotICAgIFpWQUxfU1RSSU5HTCh6LCBrZXksIGtleV9sZW4sIDEpOworICAgIFpWQUxfTE9ORygmeiwgaW5kZXgpOwogICB9Ci0gIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCAmeiwgTlVMTCk7Ci0gIHp2YWxfcHRyX2R0b3IoJnopOworICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIHNwZWMpOworICB6dmFsX2R0b3IoJnopOwogfQogCi1pbmxpbmUgYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7CisgIGlmICh2YWx1ZSkgeworICAgIFpWQUxfREVSRUYodmFsdWUpOworICB9CisgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHR5cGVJRCAoYW5kIGZpZWxkIG51bSwgaWYgYXBwbGljYWJsZSkgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgd3JpdGUgdGhlIHBheWxvYWQuCisgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgeworICAgIGNhc2UgVF9TVE9QOgorICAgIGNhc2UgVF9WT0lEOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfT0JKRUNUKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1vYmplY3QgdHlwZSBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUCh2YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgICAgaWYgKHNwZWMgJiYgWl9UWVBFX1Aoc3BlYykgPT0gSVNfUkVGRVJFTkNFKSB7CisgICAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICB9CisgICAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWModmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0JPT0w6CisgICAgICBpZiAoIXp2YWxfaXNfYm9vbCh2YWx1ZSkpIGNvbnZlcnRfdG9fYm9vbGVhbih2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChaX1RZUEVfSU5GT19QKHZhbHVlKSA9PSBJU19UUlVFID8gMSA6IDApOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTE2OgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JNjQ6CisgICAgY2FzZSBUX1U2NDogeworICAgICAgaW50NjRfdCBsX2RhdGE7CisjaWYgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSBaX0xWQUxfUCh2YWx1ZSk7CisjZWxzZQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QKHZhbHVlKTsKKyNlbmRpZgorICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGxfZGF0YSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0RPVUJMRTogeworICAgICAgdW5pb24geworICAgICAgICBpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGEuZCA9IFpfRFZBTF9QKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChhLmMpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhaX1NUUlZBTF9QKHZhbHVlKSwgWl9TVFJMRU5fUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9NQVA6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9NQVApIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia3R5cGUiLCBzaXplb2YoImt0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidnR5cGUiLCBzaXplb2YoInZ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AoemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSkpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBrZXlzcGVjKTsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9MSVNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1AodmFsdWUpOworICAgICAgenZhbCogdmFsX3B0cjsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIHNpemVvZigiZXR5cGUiKS0xKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9TRVQ6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9TRVQpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBIYXNoVGFibGUqIHNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSkpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGlmKHR0eXBlX2lzX3NjYWxhcihrZXl0eXBlKSl7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIsIHNwZWMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gcmV0dXJuOworICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIHplbmRfc3RyaW5nKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKSB7CisgIHp2YWwgYXJnc1szXTsKKyAgenZhbCByZXQ7CisgIHp2YWwgd3JpdGVNZXNzYWdlZm47CisKKyAgWlZBTF9TVFJfQ09QWSgmYXJnc1swXSwgbWV0aG9kX25hbWUpOworICBaVkFMX0xPTkcoJmFyZ3NbMV0sIG1zZ3R5cGUpOworICBaVkFMX0xPTkcoJmFyZ3NbMl0sIHNlcUlEKTsKKyAgWlZBTF9OVUxMKCZyZXQpOworICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIpOworCisgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksIHRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzKTsKKworICB6dmFsX2R0b3IoJndyaXRlTWVzc2FnZWZuKTsKKyAgenZhbF9kdG9yKCZhcmdzWzJdKTsgenZhbF9kdG9yKCZhcmdzWzFdKTsgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgenZhbF9kdG9yKCZyZXQpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KK30KKworc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKICAgcmV0dXJuICgodCA9PSBUX0JZVEUpIHx8ICgodCA+PSBUX0kxNikgICYmICh0IDw9IFRfSTY0KSkpOwogfQorc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19zY2FsYXIoaW50OF90IHQpIHsKKyAgcmV0dXJuICEoKHQgPT0gVF9TVFJVQ1QpIHx8ICggdD09IFRfTUFQKSAgfHwgKHQgPT0gVF9TRVQpIHx8ICh0ID09IFRfTElTVCkpOworfQogCi1pbmxpbmUgYm9vbCB0dHlwZXNfYXJlX2NvbXBhdGlibGUoaW50OF90IHQxLCBpbnQ4X3QgdDIpIHsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CiAgIC8vIEludGVnZXIgdHlwZXMgb2YgZGlmZmVyZW50IHdpZHRocyBhcmUgY29uc2lkZXJlZCBjb21wYXRpYmxlOwogICAvLyBvdGhlcndpc2UgdGhlIHR5cGVJRCBtdXN0IG1hdGNoLgogICByZXR1cm4gKCh0MSA9PSB0MikgfHwgKHR0eXBlX2lzX2ludCh0MSkgJiYgdHR5cGVfaXNfaW50KHQyKSkpOwogfQogCisvL2lzIHVzZWQgdG8gdmFsaWRhdGUgb2JqZWN0cyBiZWZvcmUgc2VyaWFsaXphdGlvbiBhbmQgYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLiBGb3Igbm93LCBvbmx5IHJlcXVpcmVkIGZpZWxkcyBhcmUgdmFsaWRhdGVkLgorc3RhdGljCit2b2lkIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenZhbCogb2JqZWN0KSB7CisgICAgemVuZF9jbGFzc19lbnRyeSogb2JqZWN0X2NsYXNzX2VudHJ5ID0gWl9PQkpDRV9QKG9iamVjdCk7CisgICAgenZhbCogaXNfdmFsaWRhdGUgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgImlzVmFsaWRhdGUiLCBzaXplb2YoImlzVmFsaWRhdGUiKS0xLCB0cnVlKTsKKyAgICBpZiAoaXNfdmFsaWRhdGUpIHsKKyAgICAgIFpWQUxfREVSRUYoaXNfdmFsaWRhdGUpOworICAgIH0KKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICB6dmFsKiB2YWxfcHRyOworCisgICAgaWYgKGlzX3ZhbGlkYXRlICYmIFpfVFlQRV9JTkZPX1AoaXNfdmFsaWRhdGUpID09IElTX1RSVUUpIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgeworCisgICAgICAgICAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgICAgICAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChaX0FSUlZBTF9QKHNwZWMpLCBudWxscHRyLCAmZmllbGRubywgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJCYWQga2V5dHlwZSBpbiBUU1BFQyAoZXhwZWN0ZWQgJ2xvbmcnKSIsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgICAgICAgLy8gZmllbGQgbmFtZQorICAgICAgICAgICAgenZhbCogenZhcm5hbWUgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgICAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHp2YXJuYW1lKTsKKworICAgICAgICAgICAgenZhbCogaXNfcmVxdWlyZWQgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiaXNSZXF1aXJlZCIsIHNpemVvZigiaXNSZXF1aXJlZCIpLTEpOworICAgICAgICAgICAgenZhbCBydjsKKyAgICAgICAgICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCBvYmplY3QsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgZmFsc2UsICZydik7CisKKyAgICAgICAgICAgIGlmIChaX1RZUEVfSU5GT19QKGlzX3JlcXVpcmVkKSA9PSBJU19UUlVFICYmIFpfVFlQRV9QKHByb3ApID09IElTX05VTEwpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiUmVxdWlyZWQgZmllbGQgJXMuJXMgaXMgdW5zZXQhIiwgWlNUUl9WQUwob2JqZWN0X2NsYXNzX2VudHJ5LT5uYW1lKSwgdmFybmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKICAgLy8gU0VUIGFuZCBMSVNUIGhhdmUgJ2VsZW0nID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFsXSAnY2xhc3MnKQogICAvLyBNQVAgaGFzICd2YWwnID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFdICdjbGFzcycpCi0gIFRTUk1MU19GRVRDSCgpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZ2V0X2NsYXNzX2VudHJ5KHp0aGlzIFRTUk1MU19DQyk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gWl9PQkpDRV9QKHp0aGlzKTsKICAgd2hpbGUgKHRydWUpIHsKLSAgICB6dmFsKiogdmFsX3B0ciA9IE5VTEw7Ci0KICAgICBpbnQ4X3QgdHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7Ci0gICAgaWYgKHR0eXBlID09IFRfU1RPUCkgcmV0dXJuOworICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenRoaXMpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGludDE2X3QgZmllbGRubyA9IHRyYW5zcG9ydC5yZWFkSTE2KCk7Ci0gICAgaWYgKHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8sICh2b2lkKiopJnZhbF9wdHIpID09IFNVQ0NFU1MpIHsKLSAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7CisgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8pOworICAgIGlmICh2YWxfcHRyICE9IG51bGxwdHIpIHsKKyAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKICAgICAgIC8vIHB1bGwgdGhlIGZpZWxkIG5hbWUKLSAgICAgIC8vIHplbmQgaGFzaCB0YWJsZXMgdXNlIHRoZSBudWxsIGF0IHRoZSBlbmQgaW4gdGhlIGxlbmd0aC4uLiBzbyBzdHJsZW4oaGFzaCBrZXkpICsgMS4KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhciIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOworICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7CiAKICAgICAgIC8vIGFuZCB0aGUgdHlwZQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CiAKICAgICAgIGlmICh0dHlwZXNfYXJlX2NvbXBhdGlibGUodHR5cGUsIGV4cGVjdGVkX3R0eXBlKSkgewotICAgICAgICB6dmFsKiBydiA9IE5VTEw7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwocnYpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcnYsIGZpZWxkc3BlYyk7Ci0gICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBydiBUU1JNTFNfQ0MpOworICAgICAgICB6dmFsIHJ2OworICAgICAgICBaVkFMX1VOREVGKCZydik7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsICZydiwgZmllbGRzcGVjKTsKKyAgICAgICAgemVuZF91cGRhdGVfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksICZydik7CisKICAgICAgICAgenZhbF9wdHJfZHRvcigmcnYpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc2tpcF9lbGVtZW50KHR0eXBlLCB0cmFuc3BvcnQpOwpAQCAtNzQ2LDE2NCArOTgxLDQ0IEBACiAgIH0KIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCoqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgotICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX09CSkVDVCkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeSgqdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWMoKnZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9CT09MOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQk9PTCkgY29udmVydF90b19ib29sZWFuKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0JWQUxfUFAodmFsdWUpID8gMSA6IDApOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9CWVRFOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTE2OgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMTYoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kzMjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JNjQ6Ci0gICAgY2FzZSBUX1U2NDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICB9IHJldHVybjsKLSAgICAvL2Nhc2UgVF9VVEY3OgotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1NFVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX1NFVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICB9OwotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCi0KK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKKworICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKwogICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgenZhbCoqIHZhbF9wdHI7CisgIHp2YWwqIHZhbF9wdHI7CiAKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9nZXRfY2xhc3NfZW50cnkoenRoaXMgVFNSTUxTX0NDKTsKKyAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7CisgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKIAotICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7Ci0gICAgdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBOVUxMLCBOVUxMLCAmZmllbGRubywgMCwgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CiAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkJhZCBrZXl0eXBlIGluIFRTUEVDIChleHBlY3RlZCAnbG9uZycpIiwgSU5WQUxJRF9EQVRBKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKKyAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyBmaWVsZCBuYW1lCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIHRocmlmdCB0eXBlCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKIAotICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlIFRTUk1MU19DQyk7CisgICAgenZhbCBydjsKKyAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgaWYgKFpfVFlQRV9QKHByb3ApID09IElTX1JFRkVSRU5DRSl7CisgICAgICBaVkFMX1VOUkVGKHByb3ApOworICAgIH0KICAgICBpZiAoWl9UWVBFX1AocHJvcCkgIT0gSVNfTlVMTCkgewogICAgICAgdHJhbnNwb3J0LndyaXRlSTgodHR5cGUpOwogICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KGZpZWxkbm8pOwotICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcHJvcCwgZmllbGRzcGVjKTsKKyAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcHJvcCwgZmllbGRzcGVjKTsKICAgICB9CiAgIH0KICAgdHJhbnNwb3J0LndyaXRlSTgoVF9TVE9QKTsgLy8gc3RydWN0IGVuZApAQCAtOTExLDU1ICsxMDI2LDM4IEBACiAKIC8vIDYgcGFyYW1zOiAkdHJhbnNwb3J0ICRtZXRob2RfbmFtZSAkdHR5cGUgJHJlcXVlc3Rfc3RydWN0ICRzZXFJRCAkc3RyaWN0X3dyaXRlCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKLSAgaWYgKGFyZ2MgPCA2KSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7CisgIHp2YWwgKnByb3RvY29sOworICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKKyAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOworICBsb25nIG1zZ3R5cGUsIHNlcUlEOworICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnNfZXgoWkVORF9QQVJTRV9QQVJBTVNfUVVJRVQsIFpFTkRfTlVNX0FSR1MoKSwgIm9TbG9sYiIsCisgICAgJnByb3RvY29sLCAmbWV0aG9kX25hbWUsICZtc2d0eXBlLAorICAgICZyZXF1ZXN0X3N0cnVjdCwgJnNlcUlELCAmc3RyaWN0X3dyaXRlKSA9PSBGQUlMVVJFKSB7CisgICAgICByZXR1cm47CiAgIH0KIAotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAobWV0aG9kIG5hbWUpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1szXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjR0aCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAocmVxdWVzdCBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0KICAgdHJ5IHsKLSAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KCphcmdzWzBdKTsKLSAgICB6dmFsICpwcm90b2NvbCA9ICphcmdzWzBdOwotICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzJdKTsKLSAgICBpbnQzMl90IG1zZ3R5cGUgPSBaX0xWQUxfUFAoYXJnc1syXSk7Ci0gICAgenZhbCogcmVxdWVzdF9zdHJ1Y3QgPSAqYXJnc1szXTsKLSAgICBjb252ZXJ0X3RvX2xvbmcoKmFyZ3NbNF0pOwotICAgIGludDMyX3Qgc2VxSUQgPSBaX0xWQUxfUFAoYXJnc1s0XSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzVdKTsKLSAgICBib29sIHN0cmljdFdyaXRlID0gWl9CVkFMX1BQKGFyZ3NbNV0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgbXNndHlwZSwgc2VxSUQpOwotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJlcXVlc3Rfc3RydWN0IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJlcXVlc3Rfc3RydWN0KSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgdHJ1ZSk7CisgICAgaWYgKHNwZWMpIHsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CiAgICAgfQorCisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KKworICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOworICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7CiAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKICAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwpAQCAtOTY3LDM3ICsxMDY1LDIwIEBACiAgIH0KIH0KIAotLy8gMyBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZAorCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKIAotICBpZiAoYXJnYyA8IDMpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKLSAgfQotCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nICh0eXBlbmFtZSBvZiBleHBlY3RlZCByZXNwb25zZSBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CiAgIH0KIAogICB0cnkgewotICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgY2hhciogb2JqX3R5cGVuYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzJdKTsKLSAgICBib29sIHN0cmljdF9yZWFkID0gWl9CVkFMX1BQKGFyZ3NbMl0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotCisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CiAgICAgaW50OF90IG1lc3NhZ2VUeXBlID0gMDsKICAgICBpbnQzMl90IHN6ID0gdHJhbnNwb3J0LnJlYWRJMzIoKTsKIApAQCAtMTAyMywxOSArMTEwNCwzNCBAQAogICAgIH0KIAogICAgIGlmIChtZXNzYWdlVHlwZSA9PSBUX0VYQ0VQVElPTikgewotICAgICAgenZhbCogZXg7Ci0gICAgICBNQUtFX1NURF9aVkFMKGV4KTsKLSAgICAgIGNyZWF0ZU9iamVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZXgpOwotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoZXggVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhleCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgenZhbCBleDsKKyAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJmV4KTsKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0UoZXgpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFBTRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoJmV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwogICAgIH0KIAotICAgIGNyZWF0ZU9iamVjdChvYmpfdHlwZW5hbWUsIHJldHVybl92YWx1ZSk7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgZGVzZXJpYWxpemUgdG8gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHp2YWxfZHRvcihyZXR1cm5fdmFsdWUpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CiAgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKQEAgLTEwNDMsMyArMTEzOSwzNCBAQAogICB9CiB9CiAKKy8vIDQgcGFyYW1zOiAkdHJhbnNwb3J0ICRyZXNwb25zZV9UeXBlbmFtZSAkc3RyaWN0X3JlYWQgJGJ1ZmZlcl9zaXplCitQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4pIHsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKKworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSwgIm9TYnxsIiwgJnByb3RvY29sLCAmb2JqX3R5cGVuYW1lLCAmc3RyaWN0X3JlYWQsICZidWZmZXJfc2l6ZSkgPT0gRkFJTFVSRSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRyeSB7CisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CisKKyAgICBjcmVhdGVPYmplY3QoWlNUUl9WQUwob2JqX3R5cGVuYW1lKSwgcmV0dXJuX3ZhbHVlKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmV0dXJuX3ZhbHVlKSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgZmFsc2UpOworICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgeworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIHRha2Ugb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CisgICAgUkVUVVJOX05VTEwoKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9Cit9CisKKyNlbmRpZiAvKiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMCAqLwpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAppbmRleCA0NGQwM2NjLi4wNDIwOTk3IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaApAQCAtMjEsNiArMjEsNyBAQAogCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSk7CiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KTsKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbik7CiAKIGV4dGVybiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5OwogI2RlZmluZSBwaHBleHRfdGhyaWZ0X3Byb3RvY29sX3B0ciAmdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTc5ZTEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCc7Ci0KLS8qKgotICogQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCi0gKgotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewotCi0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0gIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci0KLSAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgJHN0cmljdFdyaXRlXyA9IHRydWU7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpIHsKLSAgICBpZiAoJHRoaXMtPnN0cmljdFdyaXRlXykgewotICAgICAgJHZlcnNpb24gPSBzZWxmOjpWRVJTSU9OXzEgfCAkdHlwZTsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHZlcnNpb24pICsKLSAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4KLSAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCi0gICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKLSAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCduJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgNCk7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKSB7Ci0gICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgewotICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICR2YWx1ZSAqPSAtMTsKLSAgICAgIH0KLQotICAgICAgJGhpID0gKGludCkoJHZhbHVlIC8gNDI5NDk2NzI5Nik7Ci0gICAgICAkbG8gPSAoaW50KSR2YWx1ZTsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaTsKLSAgICAgICAgJGxvID0gfiRsbzsKLSAgICAgICAgaWYgKCgkbG8gJiAoaW50KTB4ZmZmZmZmZmYpID09IChpbnQpMHhmZmZmZmZmZikgewotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgJGhpID0gJHZhbHVlID4+IDMyOwotICAgICAgJGxvID0gJHZhbHVlICYgMHhGRkZGRkZGRjsKLSAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7Ci0gICAgfQotCi0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCR2YWx1ZSkgewotICAgICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc3RycmV2KCRkYXRhKSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKSB7Ci0gICAgJGxlbiA9IHN0cmxlbigkdmFsdWUpOwotICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKSB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkSTMyKCRzeik7Ci0gICAgaWYgKCRzeiA8IDApIHsKLSAgICAgICR2ZXJzaW9uID0gKGludCkgKCRzeiAmIHNlbGY6OlZFUlNJT05fTUFTSyk7Ci0gICAgICBpZiAoJHZlcnNpb24gIT0gKGludCkgc2VsZjo6VkVSU0lPTl8xKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcuJHN6LCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0KLSAgICAgICR0eXBlID0gJHN6ICYgMHgwMDAwMDBmZjsKLSAgICAgICRyZXN1bHQgKz0KLSAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgewotICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAotICAgICAgICAkbmFtZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJHN6KTsKLSAgICAgICAgJHJlc3VsdCArPQotICAgICAgICAgICRzeiArCi0gICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCR0eXBlKSArCi0gICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkgewotICAgICRuYW1lID0gJyc7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOwotICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAkZmllbGRJZCA9IDA7Ci0gICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEkxNigkZmllbGRJZCk7Ci0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJGtleVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkdmFsVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXSA9PSAxOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKLSAgICAkYXJyID0gdW5wYWNrKCduJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgewotICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOwotICAgIH0KLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoNCk7Ci0gICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIGlmICgkdmFsdWUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZmZmZmYpOwotICAgIH0KLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7Ci0KLSAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKLQotICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKLQotICAgICAgJGhpID0gJGFyclsxXTsKLSAgICAgICRsbyA9ICRhcnJbMl07Ci0gICAgICAkaXNOZWcgPSAkaGkgIDwgMDsKLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKLSAgICAgICAgJGxvID0gfiRsbyAmIChpbnQpMHhmZmZmZmZmZjsKLQotICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgewotICAgICAgICAgICRoaSsrOwotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIHBlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aWdoIHNpZ24KLSAgICAgIC8vIGV4cGxpY2l0bHkgYmVsb3cKLQotICAgICAgaWYgKCRoaSAmIChpbnQpMHg4MDAwMDAwMCkgewotICAgICAgICAkaGkgJj0gKGludCkweDdmZmZmZmZmOwotICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgewotICAgICAgICAkbG8gJj0gKGludCkweDdmZmZmZmZmOwotICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKLSAgICAgIH0KLQotICAgICAgJHZhbHVlID0gJGhpICogNDI5NDk2NzI5NiArICRsbzsKLQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkdmFsdWUgPSAwIC0gJHZhbHVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0KLSAgICAgIC8vIFVwY2FzdCBuZWdhdGl2ZXMgaW4gTFNCIGJpdAotICAgICAgaWYgKCRhcnJbMl0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdICYgMHhmZmZmZmZmZjsKLSAgICAgIH0KLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gXiAweGZmZmZmZmZmOwotICAgICAgICAkdmFsdWUgPSAwIC0gJGFyclsxXSo0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFsdWUgPSAkYXJyWzFdKjQyOTQ5NjcyOTYgKyAkYXJyWzJdOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gc3RycmV2KCR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCkpOwotICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2YWx1ZSA9ICcnOwotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLX0KLQotLyoqCi0gKiBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0gIHByaXZhdGUgJHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByaXZhdGUgJHN0cmljdFdyaXRlXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPWZhbHNlKSB7Ci0gICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7Ci0gICAgJHRoaXMtPnN0cmljdFdyaXRlXyA9ICRzdHJpY3RXcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpIHsKLSAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnMsICR0aGlzLT5zdHJpY3RSZWFkLCAkdGhpcy0+c3RyaWN0V3JpdGUpOwotICB9Ci19Ci0KLS8qKgotICogQWNjZWxlcmF0ZWQgYmluYXJ5IHByb3RvY29sOiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRocmlmdF9wcm90b2NvbAotICogZXh0ZW5zaW9uIGZvciBmYXN0ZXIgZGVzZXJpYWxpemF0aW9uCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGV4dGVuZHMgVEJpbmFyeVByb3RvY29sIHsKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKSB7Ci0gICAgLy8gSWYgdGhlIHRyYW5zcG9ydCBkb2Vzbid0IGltcGxlbWVudCBwdXRCYWNrLCB3cmFwIGl0IGluIGEKLSAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQgKHdoaWNoIGRvZXMpCi0gICAgaWYgKCFtZXRob2RfZXhpc3RzKCR0cmFucywgJ3B1dEJhY2snKSkgewotICAgICAgJHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkdHJhbnMpOwotICAgIH0KLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOwotICB9Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5U2VyaWFsaXplci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MTNkMzIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwJzsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZwotICogYSB0aHJpZnQgb2JqZWN0IHVzaW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLgotICovCi1jbGFzcyBUQmluYXJ5U2VyaWFsaXplciB7Ci0KLSAgLy8gTk9URShybWFyaW4pOiBCZWNhdXNlIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkKLSAgLy8gYWRkcyBhIGJlZ2luIG1lc3NhZ2UgcHJlZml4LCB5b3UgY2Fubm90IHNwZWNpZnkKLSAgLy8gYSB0cmFuc3BvcnQgaW4gd2hpY2ggdG8gc2VyaWFsaXplIGFuIG9iamVjdC4gSXQgaGFzIHRvCi0gIC8vIGJlIGEgc3RyaW5nLiBPdGhlcndpc2Ugd2Ugd2lsbCBicmVhayB0aGUgY29tcGF0aWJpbGl0eSB3aXRoCi0gIC8vIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24uCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VyaWFsaXplKCRvYmplY3QpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7Ci0gICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7Ci0gICAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCRwcm90b2NvbCwgJG9iamVjdC0+Z2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJFUExZLCAkb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAkcHJvdG9jb2wtPmlzU3RyaWN0V3JpdGUoKSk7Ci0KLSAgICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbigkdW51c2VkX25hbWUsICR1bnVzZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdW51c2VkX3NlcWlkKTsKLSAgICB9IGVsc2UgewotICAgICAgJG9iamVjdC0+d3JpdGUoJHByb3RvY29sKTsKLSAgICB9Ci0gICAgcmV0dXJuICR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZSgkc3RyaW5nX29iamVjdCwgJGNsYXNzX25hbWUpIHsKLSAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKLSAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5JykpIHsKLSAgICAgICAkcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKCcnLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAwKTsKLSAgICAgICAkdHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkcHJvdG9jb2wsICRjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3RvY29sLT5pc1N0cmljdFJlYWQoKSk7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgJHRyYW5zcG9ydC0+d3JpdGUoJHN0cmluZ19vYmplY3QpOwotICAgICAgICRvYmplY3QgPSBuZXcgJGNsYXNzX25hbWUoKTsKLSAgICAgICAkb2JqZWN0LT5yZWFkKCRwcm90b2NvbCk7Ci0gICAgICAgcmV0dXJuICRvYmplY3Q7Ci0gICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMWZhY2QuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi0KLS8qKgotICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50Ci0gKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi0vKioKLSAqIFByb3RvY29sIGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7Ci0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOwotICBjb25zdCBORUdBVElWRV9TSVpFID0gMjsKLSAgY29uc3QgU0laRV9MSU1JVCA9IDM7Ci0gIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19Ci0KLS8qKgotICogUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCB7Ci0gIC8vIFRoZSBiZWxvdyBtYXkgc2VlbSBzaWxseSwgYnV0IGl0IGlzIHRvIGdldCBhcm91bmQgdGhlIHByb2JsZW0gdGhhdCB0aGUKLSAgLy8gImluc3RhbmNlb2YiIG9wZXJhdG9yIGNhbiBvbmx5IHRha2UgaW4gYSBUX1ZBUklBQkxFIGFuZCBub3QgYSBUX1NUUklORwotICAvLyBvciBUX0NPTlNUQU5UX0VOQ0FQU0VEX1NUUklORy4gVXNpbmcgImlzX2EoKSIgaW5zdGVhZCBvZiAiaW5zdGFuY2VvZiIgaXMKLSAgLy8gYSB3b3JrYXJvdW5kIGJ1dCBpcyBkZXByZWNhdGVkIGluIFBIUDUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkCi0gIC8vIGRlc2VyaWFsaXphdGlvbiBjb2RlLgotICBzdGF0aWMgJFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEID0gJ1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkJzsKLQotICAvKioKLSAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zXzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpIHsKLSAgICAkdGhpcy0+dHJhbnNfID0gJHRyYW5zOwotICB9Ci0KLSAgLyoqCi0gICAqIEFjY2Vzc29yIGZvciB0cmFuc3BvcnQKLSAgICoKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJhbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCi0gICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIGEgc3RydWN0LgotICAgKgotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgLyoKLSAgICogU3RhcnRzIGEgZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQotICAgKiBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVNldEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cik7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpOwotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZE1hcEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU2V0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKTsKLQotICAvKioKLSAgICogVGhlIHNraXAgZnVuY3Rpb24gaXMgYSB1dGlsaXR5IHRvIHBhcnNlIG92ZXIgdW5yZWNvZ25pemVkIGRhdGUgd2l0aG91dAotICAgKiBjYXVzaW5nIGNvcnJ1cHRpb24uCi0gICAqCi0gICAqIEBwYXJhbSBUVHlwZSAkdHlwZSBXaGF0IHR5cGUgaXMgaXQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBza2lwKCR0eXBlKSB7Ci0gICAgc3dpdGNoICgkdHlwZSkgewotICAgIGNhc2UgVFR5cGU6OkJPT0w6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCb29sKCRib29sKTsKLSAgICBjYXNlIFRUeXBlOjpCWVRFOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkYnl0ZSk7Ci0gICAgY2FzZSBUVHlwZTo6STE2OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTE2KCRpMTYpOwotICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkzMigkaTMyKTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJNjQoJGk2NCk7Ci0gICAgY2FzZSBUVHlwZTo6RE9VQkxFOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkRG91YmxlKCRkdWIpOwotICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZFN0cmluZygkc3RyKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRGaWVsZEVuZCgpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRrZXlUeXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCR2YWxUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTZXRFbmQoKTsKLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRMaXN0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXRpbGl0eSBmb3Igc2tpcHBpbmcgYmluYXJ5IGRhdGEKLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSAgIEZpZWxkIHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgIGNhc2UgVFR5cGU6Okk2NDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwotICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKLSAgICAgICRsZW4gPSAkbGVuWzFdOwotICAgICAgaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAwOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICRmdHlwZSA9IDA7Ci0gICAgICAgICAgJGZpZCA9IDA7Ci0gICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgLy8gS3R5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAka3R5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBWdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICR2dHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFNpemUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICAgICAkc2l6ZSA9ICRhcnJbMV07Ci0gICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ID0gNjsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGt0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgewotICAgICAgICAvLyBWdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICR2dHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFNpemUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICAgICAkc2l6ZSA9ICRhcnJbMV07Ci0gICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ID0gNTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCi0gKi8KLWludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgLyoqCi0gICAqIEJ1aWxkIGEgcHJvdG9jb2wgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKLSAgICoKLSAgICogQHJldHVybiBUUHJvdG9jb2wgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvc2VydmVyL1RTZXJ2ZXIucGhwIGIvbGliL3BocC9zcmMvc2VydmVyL1RTZXJ2ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVhOWVlLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3NlcnZlci9UU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/cGhwCi0KLS8qKgotICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFNlcnZlciB7Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3NvciB0byBoYW5kbGUgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQHZhciBUUHJvY2Vzc29yCi0gICAqLwotICBwcm90ZWN0ZWQgJHByb2Nlc3Nvcl87Ci0KLSAgLyoqCi0gICAqIFNlcnZlciB0cmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgbGlzdGVuaW5nCi0gICAqIGFuZCBhY2NlcHRpbmcgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQHZhciBUU2VydmVyVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87Ci0KLSAgLyoqCi0gICAqIElucHV0IHRyYW5zcG9ydCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKLQotICAvKioKLSAgICogT3V0cHV0IHRyYW5zcG9ydCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIElucHV0IHByb3RvY29sIGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLQotICAvKioKLSAgICogT3V0cHV0IHByb3RvY29sIGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIFNldHMgdXAgYWxsIHRoZSBmYWN0b3JpZXMsIGV0YwotICAgKgotICAgKiBAcGFyYW0gb2JqZWN0ICRwcm9jZXNzb3IKLSAgICogQHBhcmFtIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeQotICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgJHRoaXMtPnByb2Nlc3Nvcl8gPSAkcHJvY2Vzc29yOwotICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKLSAgICAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRpbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgICAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIH0KLQotICAvKioKLSAgICogU2VydmVzIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybgotICAgKiB1bmxlc3MgYSBwcm9ibGVtIHBlcm1pdHMgaXQgdG8gZG8gc28gb3IgaXQKLSAgICogaXMgaW50ZXJydXB0ZWQgaW50ZW50aW9uYWxseQotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKTsKLQotICAvKioKLSAgICogU3RvcHMgdGhlIHNlcnZlciBzZXJ2aW5nCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzdG9wKCk7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAgYi9saWIvcGhwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDBhMzIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD9waHAKLQotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvc2VydmVyL1RTZXJ2ZXIucGhwJzsKLQotLyoqCi0gKiBTaW1wbGUgaW1wbGVtdGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWNsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKLSAgLyoqCi0gICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHN0b3BfID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAqIHRyYW5zcG9ydC4gSXQgaGFuZGxlcyBUVHJhbnNwb3J0RXhjZXB0aW9ucwotICAgKiB0byBhdm9pZCB0aW1lb3V0cyBldGMga2lsbGluZyBpdAotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0KLSAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOwotICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0Ci0gICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICAgICR0aGlzLT5zdG9wXyA9IHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDE1NjQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKLSAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQotICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJCdWZTaXplPTUxMiwgJHdCdWZTaXplPTUxMikgewotICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKLSAgICAkdGhpcy0+ckJ1ZlNpemVfID0gJHJCdWZTaXplOwotICAgICR0aGlzLT53QnVmU2l6ZV8gPSAkd0J1ZlNpemU7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc3BvcnRfID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkckJ1ZlNpemVfID0gNTEyOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkd0J1ZlNpemVfID0gNTEyOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICR3QnVmXyA9ICcnOwotCi0gIC8qKgotICAgKiBUaGUgcmVhZCBidWZmZXIuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJCdWZfID0gJyc7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHJlYXNvbiB0aGF0IHdlIGN1c3RvbWl6ZSByZWFkQWxsIGhlcmUgaXMgdGhhdCB0aGUgbWFqb3JpdHkgb2YgUEhQCi0gICAqIHN0cmVhbXMgYXJlIGFscmVhZHkgaW50ZXJuYWxseSBidWZmZXJlZCBieSBQSFAuIFRoZSBzb2NrZXQgc3RyZWFtLCBmb3IKLSAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgotICAgKiB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUsIHVubGlrZSByZWN2KCkgaW4gQy4KLSAgICoKLSAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKLSAgICogdGhlIGJ1ZmZlcmVkIHJlYWRBbGwuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKSB7Ci0gICAgJGhhdmUgPSBzdHJsZW4oJHRoaXMtPnJCdWZfKTsKLSAgICBpZiAoJGhhdmUgPT0gMCkgewotICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgaWYgKCRoYXZlIDwgJGxlbikgewotICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKLSAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7Ci0gICAgfSBlbHNlIGlmICgkaGF2ZSA9PSAkbGVuKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgIH0gZWxzZSBpZiAoJGhhdmUgPiAkbGVuKSB7Ci0gICAgICAkZGF0YSA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICAgJHRoaXMtPnJCdWZfID0gc3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCR0aGlzLT5yQnVmU2l6ZV8pOwotICAgIH0KLQotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gc3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gc3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgcmV0dXJuICRyZXQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICAgIGlmIChzdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOwotCi0gICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCi0gICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICAgJHRoaXMtPndCdWZfID0gJyc7Ci0gICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKLSAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkdGhpcy0+d0J1Zl8pOwotICAgICAgJHRoaXMtPndCdWZfID0gJyc7Ci0gICAgfQotICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NzM5Mi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBGcmFtZWQgdHJhbnNwb3J0LiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgaW4gY2h1bmtzIHRoYXQgYXJlIHN0YW1wZWQgd2l0aAotICogdGhlaXIgbGVuZ3RoLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCi0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJpdmF0ZSAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRyQnVmXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJHdCdWZfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmVhZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkd3JpdGVfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJlYWQ9dHJ1ZSwgJHdyaXRlPXRydWUpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7Ci0gICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQotICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoISR0aGlzLT5yZWFkXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCRsZW4pOwotICAgIH0KLQotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOwotICAgIH0KLQotICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgotICAgIGlmICgkbGVuID49IHN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKLSAgICAgIHJldHVybiAkb3V0OwotICAgIH0KLQotICAgIC8vIFJldHVybiBzdWJzdHIKLSAgICAkb3V0ID0gc3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gc3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgcmV0dXJuICRvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUHV0IHByZXZpb3VzbHkgcmVhZCBkYXRhIGJhY2sgaW50byB0aGUgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgZGF0YSB0byByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSBjaHVuayBvZiBkYXRhIGludG8gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkRnJhbWUoKSB7Ci0gICAgJGJ1ZiA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKDQpOwotICAgICR2YWwgPSB1bnBhY2soJ04nLCAkYnVmKTsKLSAgICAkc3ogPSAkdmFsWzFdOwotCi0gICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJHN6KTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIHRvIHRoZSBwZW5kaW5nIG91dHB1dCBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YQotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gTGltaXQgb2YgYnl0ZXMgdG8gd3JpdGUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmLCAkbGVuPW51bGwpIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJGJ1ZiwgJGxlbik7Ci0gICAgfQotCi0gICAgaWYgKCRsZW4gIT09IG51bGwgJiYgJGxlbiA8IHN0cmxlbigkYnVmKSkgewotICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAwLCAkbGVuKTsKLSAgICB9Ci0gICAgJHRoaXMtPndCdWZfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm1hdCBvZiBhIDQtYnl0ZSBsZW5ndGgKLSAgICogZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBkYXRhLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIGlmICghJHRoaXMtPndyaXRlXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICAgIH0KLQotICAgICRvdXQgPSBwYWNrKCdOJywgc3RybGVuKCR0aGlzLT53QnVmXykpOwotICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOwotCi0gICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZGJiYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bwotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XzsKLQotICAvKioKLSAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XzsKLQotICAvKioKLSAgICogVGhlIFVSSSB0byByZXF1ZXN0Ci0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHVyaV87Ci0KLSAgLyoqCi0gICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcwotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRzY2hlbWVfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRidWZfOwotCi0gIC8qKgotICAgKiBJbnB1dCBzb2NrZXQgc3RyZWFtLgotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcm90ZWN0ZWQgJGhhbmRsZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKSB7Ci0gICAgaWYgKChzdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7fQotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICgkdGhpcy0+aGFuZGxlXykgewotICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgotICAgKgotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gSG93IG11Y2ggdG8gcmVhZAotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7Ci0gICAgaWYgKCRkYXRhID09PSBGQUxTRSB8fCAkZGF0YSA9PT0gJycpIHsKLSAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLiR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfLicvJy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUSHR0cENsaWVudDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLiR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfLicvJy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhbmQgc2VuZHMgdGhlIGFjdHVhbCByZXF1ZXN0IG92ZXIgdGhlIEhUVFAgY29ubmVjdGlvbgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCi0gICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8uKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6Jy4kdGhpcy0+cG9ydF8gOiAnJyk7Ci0KLSAgICAkaGVhZGVycyA9IGFycmF5KCdIb3N0OiAnLiRob3N0LAotICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQnLAotICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQ6IFBIUC9USHR0cENsaWVudCcsCi0gICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcsCi0gICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGg6ICcuc3RybGVuKCR0aGlzLT5idWZfKSk7Ci0KLSAgICAkb3B0aW9ucyA9IGFycmF5KCdtZXRob2QnID0+ICdQT1NUJywKLSAgICAgICAgICAgICAgICAgICAgICdoZWFkZXInID0+IGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycyksCi0gICAgICAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICdjb250ZW50JyA9PiAkdGhpcy0+YnVmXyk7Ci0gICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKLSAgICAgICRvcHRpb25zWyd0aW1lb3V0J10gPSAkdGhpcy0+dGltZW91dF87Ci0gICAgfQotICAgICR0aGlzLT5idWZfID0gJyc7Ci0KLSAgICAkY29udGV4dGlkID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKGFycmF5KCdodHRwJyA9PiAkb3B0aW9ucykpOwotICAgICR0aGlzLT5oYW5kbGVfID0gQGZvcGVuKCR0aGlzLT5zY2hlbWVfLic6Ly8nLiRob3N0LiR0aGlzLT51cmlfLCAncicsIGZhbHNlLCAkY29udGV4dGlkKTsKLQotICAgIC8vIENvbm5lY3QgZmFpbGVkPwotICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gRkFMU0UpIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICAgICRlcnJvciA9ICdUSHR0cENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kaG9zdC4kdGhpcy0+dXJpXzsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjFhNTQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCi0gKiBpbi1tZW1vcnkgc3RyaW5nIGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5Ci0gKiBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdAotICogYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gT3B0aW9uYWxseSBwYXNzIGFuIGluaXRpYWwgdmFsdWUKLSAgICogZm9yIHRoZSBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGJ1ZiA9ICcnKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAkYnVmOwotICB9Ci0KLSAgcHJvdGVjdGVkICRidWZfID0gJyc7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT5idWZfKSA9PT0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RNZW1vcnlCdWZmZXI6IENvdWxkIG5vdCByZWFkICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLQotICAgIGlmIChzdHJsZW4oJHRoaXMtPmJ1Zl8pIDw9ICRsZW4pIHsKLSAgICAgICRyZXQgPSAkdGhpcy0+YnVmXzsKLSAgICAgICR0aGlzLT5idWZfID0gJyc7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gc3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+YnVmXyA9IHN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHsKLSAgICByZXR1cm4gJHRoaXMtPmJ1Zl87Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlKCkgewotICAgIHJldHVybiBzdHJsZW4oJHRoaXMtPmJ1Zl8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MzQwZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBUcmFuc3BvcnQgdGhhdCBvbmx5IGFjY2VwdHMgd3JpdGVzIGFuZCBpZ25vcmVzIHRoZW0uCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWVhc3VyaW5nIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygc3RydWN0dXJlcy4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHt9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiMTFhNi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBQaHAgc3RyZWFtIHRyYW5zcG9ydC4gUmVhZHMgdG8gYW5kIHdyaXRlcyBmcm9tIHRoZSBwaHAgc3RhbmRhcmQgc3RyZWFtcwotICogcGhwOi8vaW5wdXQgYW5kIHBocDovL291dHB1dAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFBocFN0cmVhbSBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIGNvbnN0IE1PREVfUiA9IDE7Ci0gIGNvbnN0IE1PREVfVyA9IDI7Ci0KLSAgcHJpdmF0ZSAkaW5TdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOwotCi0gIHByaXZhdGUgJHdyaXRlXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkgewotICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOwotICAgICR0aGlzLT53cml0ZV8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfVzsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9pbnB1dCcpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHRoaXMtPndyaXRlXykgewotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmluU3RyZWFtXyk7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOwotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuCi0gICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKLSAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOwotICAgIGlmICgkZGF0YSA9PT0gRkFMU0UgfHwgJGRhdGEgPT09ICcnKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKLSAgICB9Ci0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICB3aGlsZSAoc3RybGVuKCRidWYpID4gMCkgewotICAgICAgJGdvdCA9IEBmd3JpdGUoJHRoaXMtPm91dFN0cmVhbV8sICRidWYpOwotICAgICAgaWYgKCRnb3QgPT09IDAgfHwgJGdvdCA9PT0gRkFMU0UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCB3cml0ZSAnLnN0cmxlbigkYnVmKS4nIGJ5dGVzJyk7Ci0gICAgICB9Ci0gICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBAZmZsdXNoKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpIHsKLSAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7Ci0gICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKLSAgICB9Ci0gICAgcmV0dXJuICdwaHA6Ly9pbnB1dCc7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWMxMmFiLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/cGhwCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LnBocCc7Ci1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFNvY2tldC5waHAnOwotCi0vKioKLSAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIGZvciB0aGUgbGlzdGVuZXIgc29ja2V0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByaXZhdGUgJGxpc3RlbmVyXzsKLQotICAvKioKLSAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcG9ydF87Ci0KLSAgLyoqCi0gICAqIFRpbWVvdXQgd2hlbiBsaXN0ZW5pbmcgZm9yIGEgbmV3IGNsaWVudAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKLQotICAvKioKLSAgICogSG9zdCB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJGhvc3RfOwotCi0gIC8qKgotICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgSG9zdCB0byBsaXN0ZW4gb24KLSAgICogQHBhcmFtIGludCAkcG9ydCAgICAgICAgICAgUG9ydCB0byBsaXN0ZW4gb24KLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwKSB7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYWNjZXB0IHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KSB7Ci0gICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkgewotICAgICR0aGlzLT5saXN0ZW5lcl8gPSBzdHJlYW1fc29ja2V0X3NlcnZlcigndGNwOi8vJyAuICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBzb2NrZXQgc2VydmVyIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBAZmNsb3NlKCR0aGlzLT5saXN0ZW5lcl8pOwotICAgICR0aGlzLT5saXN0ZW5lcl8gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudGF0aW9uIG9mIGFjY2VwdC4gSWYgbm90IGNsaWVudCBpcyBhY2NlcHRlZCBpbiB0aGUgZ2l2ZW4gdGltZQotICAgKgotICAgKiBAcmV0dXJuIFRTb2NrZXQKLSAgICovCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkgewotICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKLSAgICBpZighJGhhbmRsZSkgcmV0dXJuIG51bGw7Ci0KLSAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKLSAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7Ci0gICAgCi0gICAgcmV0dXJuICRzb2NrZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyY2E3Ny4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3BocAotCi0vKioKLSAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgewotICAvKioKLSAgICogTGlzdCBmb3IgbmV3IGNsaWVudHMKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgc2VydmVyCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKLSAgICogYWNjZXB0LgotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOwotCi0gIC8qKgotICAgKiBVc2VzIHRoZSBhY2NlcHQgaW1wbGVtdGF0aW9uLiBJZiBudWxsIGlzIHJldHVybmVkLCBhbgotICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkgewotICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+YWNjZXB0SW1wbCgpOwotCi0gICAgaWYgKCR0cmFuc3BvcnQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICR0cmFuc3BvcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkNDgyNS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTb2NrZXQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJpdmF0ZSAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcwotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRfID0gMTAwOwotCi0gIC8qKgotICAgKiBSZWN2IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZWN2VGltZW91dF8gPSA3NTA7Ci0KLSAgLyoqCi0gICAqIElzIHNlbmQgdGltZW91dCBzZXQ/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRTZXRfID0gRkFMU0U7Ci0KLSAgLyoqCi0gICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHBlcnNpc3RfID0gRkFMU0U7Ci0KLSAgLyoqCi0gICAqIERlYnVnZ2luZyBvbj8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcm90ZWN0ZWQgJGRlYnVnXyA9IEZBTFNFOwotCi0gIC8qKgotICAgKiBEZWJ1ZyBoYW5kbGVyCi0gICAqCi0gICAqIEB2YXIgbWl4ZWQKLSAgICovCi0gIHByb3RlY3RlZCAkZGVidWdIYW5kbGVyXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFNvY2tldCBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0ICAgICAgICAgUmVtb3RlIGhvc3RuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQgICAgICAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gYm9vbCAgICRwZXJzaXN0ICAgICAgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAotICAgKiBAcGFyYW0gc3RyaW5nICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZXJyb3IgbG9nZ2luZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0PSdsb2NhbGhvc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcnQ9OTA5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwZXJzaXN0PUZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSGFuZGxlcj1udWxsKSB7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gICAgJHRoaXMtPnBlcnNpc3RfID0gJHBlcnNpc3Q7Ci0gICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSByZXNvdXJjZSAkaGFuZGxlCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldEhhbmRsZSgkaGFuZGxlKSB7Ci0gICAgJHRoaXMtPmhhbmRsZV8gPSAkaGFuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNlbmQgdGltZW91dC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0U2VuZFRpbWVvdXQoJHRpbWVvdXQpIHsKLSAgICAkdGhpcy0+c2VuZFRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVjZWl2ZSB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0ICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWN2VGltZW91dCgkdGltZW91dCkgewotICAgICR0aGlzLT5yZWN2VGltZW91dF8gPSAkdGltZW91dDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRkZWJ1ZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnKCRkZWJ1ZykgewotICAgICR0aGlzLT5kZWJ1Z18gPSAkZGVidWc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIGhvc3QKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3N0KCkgewotICAgIHJldHVybiAkdGhpcy0+aG9zdF87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSByZW1vdGUgcG9ydCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIGludCBwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnBvcnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHRoaXMtPmhhbmRsZV8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKLSAgICB9Ci0KLSAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0KLSAgICBpZiAoJHRoaXMtPnBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKCR0aGlzLT5wZXJzaXN0XykgewotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAcGZzb2Nrb3BlbigkdGhpcy0+aG9zdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRfLzEwMDAuMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigkdGhpcy0+aG9zdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dF8vMTAwMC4wKTsKLSAgICB9Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nICgnLiRlcnJzdHIuJyBbJy4kZXJybm8uJ10pJzsKLSAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKLSAgICB9Ci0KLSAgICBzdHJlYW1fc2V0X3RpbWVvdXQoJHRoaXMtPmhhbmRsZV8sIDAsICR0aGlzLT5zZW5kVGltZW91dF8qMTAwMCk7Ci0gICAgJHRoaXMtPnNlbmRUaW1lb3V0U2V0XyA9IFRSVUU7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgaWYgKCEkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBVc2VzIHN0cmVhbSBnZXQgY29udGVudHMgdG8gZG8gdGhlIHJlYWRpbmcKLSAgICoKLSAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtYW55IGJ5dGVzCi0gICAqIEByZXR1cm4gc3RyaW5nIEJpbmFyeSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKSB7Ci0gICAgaWYgKCR0aGlzLT5zZW5kVGltZW91dFNldF8pIHsKLSAgICAgIHN0cmVhbV9zZXRfdGltZW91dCgkdGhpcy0+aGFuZGxlXywgMCwgJHRoaXMtPnJlY3ZUaW1lb3V0XyoxMDAwKTsKLSAgICAgICR0aGlzLT5zZW5kVGltZW91dFNldF8gPSBGQUxTRTsKLSAgICB9Ci0gICAgLy8gVGhpcyBjYWxsIGRvZXMgbm90IG9iZXkgc3RyZWFtX3NldF90aW1lb3V0IHZhbHVlcyEKLSAgICAvLyAkYnVmID0gQHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotCi0gICAgJHByZSA9IG51bGw7Ci0gICAgd2hpbGUgKFRSVUUpIHsKLSAgICAgICRidWYgPSBAZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgICAgaWYgKCRidWYgPT09IEZBTFNFKSB7Ci0gICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICAgaWYgKHRydWUgPT09ICRtZFsndGltZWRfb3V0J10gJiYgZmFsc2UgPT09ICRtZFsnYmxvY2tlZCddKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoKCRzeiA9IHN0cmxlbigkYnVmKSkgPCAkbGVuKSB7Ci0gICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICAgaWYgKHRydWUgPT09ICRtZFsndGltZWRfb3V0J10gJiYgZmFsc2UgPT09ICRtZFsnYmxvY2tlZCddKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJHByZSAuPSAkYnVmOwotICAgICAgICAgICRsZW4gLT0gJHN6OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gJHByZS4kYnVmOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGZyb20gdGhlIHNvY2tldAotICAgKgotICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG1hbnkgYnl0ZXMKLSAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoJHRoaXMtPnNlbmRUaW1lb3V0U2V0XykgewotICAgICAgc3RyZWFtX3NldF90aW1lb3V0KCR0aGlzLT5oYW5kbGVfLCAwLCAkdGhpcy0+cmVjdlRpbWVvdXRfKjEwMDApOwotICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2V0XyA9IEZBTFNFOwotICAgIH0KLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7Ci0gICAgaWYgKCRkYXRhID09PSBGQUxTRSkgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKHRydWUgPT09ICRtZFsndGltZWRfb3V0J10gJiYgZmFsc2UgPT09ICRtZFsnYmxvY2tlZCddKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRvIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICBpZiAoISR0aGlzLT5zZW5kVGltZW91dFNldF8pIHsKLSAgICAgIHN0cmVhbV9zZXRfdGltZW91dCgkdGhpcy0+aGFuZGxlXywgMCwgJHRoaXMtPnNlbmRUaW1lb3V0XyoxMDAwKTsKLSAgICAgICR0aGlzLT5zZW5kVGltZW91dFNldF8gPSBUUlVFOwotICAgIH0KLSAgICB3aGlsZSAoc3RybGVuKCRidWYpID4gMCkgewotICAgICAgJGdvdCA9IEBmd3JpdGUoJHRoaXMtPmhhbmRsZV8sICRidWYpOwotICAgICAgaWYgKCRnb3QgPT09IDAgfHwgJGdvdCA9PT0gRkFMU0UpIHsKLSAgICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgICBpZiAoJG1kWyd0aW1lZF9vdXQnXSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnLnN0cmxlbigkYnVmKS4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuc3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkZ290KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRmx1c2ggb3V0cHV0IHRvIHRoZSBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7Ci0gICAgJHJldCA9IGZmbHVzaCgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgaWYgKCRyZXQgPT09IEZBTFNFKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IGZsdXNoOiAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDZjMzYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotCi0vKiogSW5oZXJpdHMgZnJvbSBTb2NrZXQgKi8KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UU29ja2V0LnBocCc7Ci0KLS8qKgotICogVGhpcyBsaWJyYXJ5IG1ha2VzIHVzZSBvZiBBUEMgY2FjaGUgdG8gbWFrZSBob3N0cyBhcyBkb3duIGluIGEgd2ViCi0gKiBlbnZpcm9ubWVudC4gSWYgeW91IGFyZSBydW5uaW5nIGZyb20gdGhlIENMSSBvciBvbiBhIHN5c3RlbSB3aXRob3V0IEFQQwotICogaW5zdGFsbGVkLCB0aGVuIHRoZXNlIG51bGwgZnVuY3Rpb25zIHdpbGwgc3RlcCBpbiBhbmQgYWN0IGxpa2UgY2FjaGUKLSAqIG1pc3Nlcy4KLSAqLwotaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwY19mZXRjaCcpKSB7Ci0gIGZ1bmN0aW9uIGFwY19mZXRjaCgka2V5KSB7IHJldHVybiBGQUxTRTsgfQotICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bD0wKSB7IHJldHVybiBGQUxTRTsgfQotfQotCi0vKioKLSAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KLSAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0IHsKLQotICAvKioKLSAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKLSAgICovCi0gIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKLQotICAvKioKLSAgICogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KLSAgICogbWFya2VkIGFzIGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOwotCi0gIC8qKgotICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRyYW5kb21pemVfID0gVFJVRTsKLQotICAvKioKLSAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSBUUlVFOwotCi0gIC8qKgotICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gYXJyYXkgICRob3N0cyAgICAgICAgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCi0gICAqIEBwYXJhbSBtaXhlZCAgJHBvcnRzICAgICAgICBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBtaXhlZCAgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiBmb3IgZXJyb3IgbG9nZ2luZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0cz1hcnJheSgnbG9jYWxob3N0JyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydHM9YXJyYXkoOTA5MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOwotCi0gICAgaWYgKCFpc19hcnJheSgkcG9ydHMpKSB7Ci0gICAgICAkcG9ydCA9ICRwb3J0czsKLSAgICAgICRwb3J0cyA9IGFycmF5KCk7Ci0gICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OwotICAgICAgfQotICAgIH0KLQotICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7Ci0gICAgICAkdGhpcy0+c2VydmVyc18gW109IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgKgotICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHByZXZlbnQgeW91IGZyb20gYWRkaW5nIGEgZHVwbGljYXRlIHNlcnZlciBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAotICAgKiBAcGFyYW0gaW50ICRwb3J0IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KSB7Ci0gICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TnVtUmV0cmllcygkbnVtUmV0cmllcykgewotICAgICR0aGlzLT5udW1SZXRyaWVzXyA9ICRudW1SZXRyaWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCByZXRyeWluZyBhIGhvc3QgaWYgaXQgd2FzIG1hcmtlZCBkb3duCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKSB7Ci0gICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7Ci0gICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Ci0gIH0KLQotICAvKioKLSAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJhbmRvbWl6ZSgkcmFuZG9taXplKSB7Ci0gICAgJHRoaXMtPnJhbmRvbWl6ZV8gPSAkcmFuZG9taXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkgewotICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OwotICB9Ci0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldCBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgdGhlIHNlcnZlcnMgaW4gdGhlIHBvb2wKLSAgICogYW5kIHRyeWluZyB0byBmaW5kIG9uZSB0aGF0IHdvcmtzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgLy8gQ2hlY2sgaWYgd2Ugd2FudCBvcmRlciByYW5kb21pemF0aW9uCi0gICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7Ci0gICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7Ci0gICAgfQotCi0gICAgLy8gQ291bnQgc2VydmVycyB0byBpZGVudGlmeSB0aGUgImxhc3QiIG9uZQotICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKLQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1TZXJ2ZXJzOyArKyRpKSB7Ci0KLSAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlICRob3N0IGFuZCAkcG9ydCB2YXJpYWJsZXMKLSAgICAgIGV4dHJhY3QoJHRoaXMtPnNlcnZlcnNfWyRpXSk7Ci0KLSAgICAgIC8vIENoZWNrIEFQQyBjYWNoZSBmb3IgYSByZWNvcmQgb2YgdGhpcyBzZXJ2ZXIgYmVpbmcgZG93bgotICAgICAgJGZhaWx0aW1lS2V5ID0gJ3RocmlmdF9mYWlsdGltZTonLiRob3N0Lic6Jy4kcG9ydC4nfic7Ci0KLSAgICAgIC8vIENhY2hlIG1pc3M/IEFzc3VtZSBpdCdzIE9LCi0gICAgICAkbGFzdEZhaWx0aW1lID0gYXBjX2ZldGNoKCRmYWlsdGltZUtleSk7Ci0gICAgICBpZiAoJGxhc3RGYWlsdGltZSA9PT0gRkFMU0UpIHsKLSAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gRkFMU0U7Ci0KLSAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCi0gICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKLSAgICAgICAgJGVsYXBzZWQgPSB0aW1lKCkgLSAkbGFzdEZhaWx0aW1lOwotICAgICAgICBpZiAoJGVsYXBzZWQgPiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8pIHsKLSAgICAgICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IFRSVUU7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiByZXRyeUludGVydmFsICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcuJHRoaXMtPnJldHJ5SW50ZXJ2YWxfLicpICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnLiRob3N0Lic6Jy4kcG9ydCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE9ubHkgY29ubmVjdCBpZiBub3QgaW4gdGhlIG1pZGRsZSBvZiBhIGZhaWwgaW50ZXJ2YWwsIE9SIGlmIHRoaXMKLSAgICAgIC8vIGlzIHRoZSBMQVNUIHNlcnZlciB3ZSBhcmUgdHJ5aW5nLCBqdXN0IGhhbW1lciBhd2F5IG9uIGl0Ci0gICAgICAkaXNMYXN0U2VydmVyID0gRkFMU0U7Ci0gICAgICBpZiAoJHRoaXMtPmFsd2F5c1RyeUxhc3RfKSB7Ci0gICAgICAgICRpc0xhc3RTZXJ2ZXIgPSAoJGkgPT0gKCRudW1TZXJ2ZXJzIC0gMSkpOwotICAgICAgfQotCi0gICAgICBpZiAoKCRsYXN0RmFpbHRpbWUgPT09IDApIHx8Ci0gICAgICAgICAgKCRpc0xhc3RTZXJ2ZXIpIHx8Ci0gICAgICAgICAgKCRsYXN0RmFpbHRpbWUgPiAwICYmICRyZXRyeUludGVydmFsUGFzc2VkKSkgewotCi0gICAgICAgIC8vIFNldCB1bmRlcmx5aW5nIFRTb2NrZXQgcGFyYW1zIHRvIHRoaXMgb25lCi0gICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLQotICAgICAgICAvLyBUcnkgdXAgdG8gbnVtUmV0cmllc18gY29ubmVjdGlvbnMgcGVyIHNlcnZlcgotICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVXNlIHRoZSB1bmRlcmx5aW5nIFRTb2NrZXQgb3BlbiBmdW5jdGlvbgotICAgICAgICAgICAgcGFyZW50OjpvcGVuKCk7Ci0KLSAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGZhaWx1cmUgY291bnRzIGlmIHJlcXVpcmVkIHRvIGRvIHNvCi0gICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKLSAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdwotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAkdHgpIHsKLSAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gZmFpbGVkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFyayBmYWlsdXJlIG9mIHRoaXMgaG9zdCBpbiB0aGUgY2FjaGUKLSAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonLiRob3N0Lic6Jy4kcG9ydC4nfic7Ci0KLSAgICAgICAgLy8gSWdub3JlIGNhY2hlIG1pc3NlcwotICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKLSAgICAgICAgaWYgKCRjb25zZWNmYWlscyA9PT0gRkFMU0UpIHsKLSAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5jcmVtZW50IGJ5IG9uZQotICAgICAgICAkY29uc2VjZmFpbHMrKzsKLQotICAgICAgICAvLyBMb2cgYW5kIGNhY2hlIHRoaXMgZmFpbHVyZQotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID49ICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgewotICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnLiRob3N0Lic6Jy4kcG9ydC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcgYXMgZG93biBmb3IgJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJyBzZWNzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnYWZ0ZXIgJy4kY29uc2VjZmFpbHMuJyBmYWlsZWQgYXR0ZW1wdHMuJyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFN0b3JlIHRoZSBmYWlsdXJlIHRpbWUKLSAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCB0aW1lKCkpOwotCi0gICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCi0gICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgJGNvbnNlY2ZhaWxzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIE9oIG5vOyB3ZSBmYWlsZWQgdGhlbSBhbGwuIFRoZSBzeXN0ZW0gaXMgdG90YWxseSBpbGwhCi0gICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKLSAgICAkaG9zdHMgPSBhcnJheSgpOwotICAgIGZvcmVhY2ggKCR0aGlzLT5zZXJ2ZXJzXyBhcyAkc2VydmVyKSB7Ci0gICAgICAkaG9zdHMgW109ICRzZXJ2ZXJbJ2hvc3QnXS4nOicuJHNlcnZlclsncG9ydCddOwotICAgIH0KLSAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKLSAgICAkZXJyb3IgLj0gJygnLiRob3N0bGlzdC4nKSc7Ci0gICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOwotICAgIH0KLSAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTMzNmQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gewotCi0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBOT1RfT1BFTiA9IDE7Ci0gIGNvbnN0IEFMUkVBRFlfT1BFTiA9IDI7Ci0gIGNvbnN0IFRJTUVEX09VVCA9IDM7Ci0gIGNvbnN0IEVORF9PRl9GSUxFID0gNDsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNwb3J0IGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KLSAgICoKLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIGlzT3BlbigpOwotCi0gIC8qKgotICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBvcGVuKCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gY2xvc2UoKTsKLQotICAvKioKLSAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBIb3cgbXVjaCB0byByZWFkCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWQoJGxlbik7Ci0KLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLgotICAgKgotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKSB7Ci0gICAgLy8gcmV0dXJuICR0aGlzLT5yZWFkKCRsZW4pOwotCi0gICAgJGRhdGEgPSAnJzsKLSAgICAkZ290ID0gMDsKLSAgICB3aGlsZSAoKCRnb3QgPSBzdHJsZW4oJGRhdGEpKSA8ICRsZW4pIHsKLSAgICAgICRkYXRhIC49ICR0aGlzLT5yZWFkKCRsZW4gLSAkZ290KTsKLSAgICB9Ci0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZGF0YSBvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZSgkYnVmKTsKLQotICAvKioKLSAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIGJ1ZmZlcgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkge30KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBhNjVhLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3BocAotCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIC8qKgotICAgKiBAc3RhdGljCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpIHsKLSAgICByZXR1cm4gJHRyYW5zcG9ydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKQEAgLTAsMCArMSwxOTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDsKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDI7Cit1c2UgVGhyaWZ0VGVzdFxOdW1iZXJ6OwordXNlIFRocmlmdFRlc3RcSW5zYW5pdHk7CisKK2NsYXNzIEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkYnVmc2l6ZSA9IDgxOTI7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJncyA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3MoKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXSA9CisgICAgICAgICAgICAicXVvdGU6IFxcXCIgYmFja3NsYXNoOiIgLgorICAgICAgICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIgLgorICAgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiAuCisgICAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFwvXGJcblxyXHQiIC4KKyAgICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjXCQlJigpKCYlJCN7fXt9PD48PjwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9CisgICAgICAgICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPQorICAgICAgICAgICAgIuC4quC4p+C4seC4quC4lOC4tS/wnZKvIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXSA9IDMuMTQxNTkyNjUzNTg5ODsKKworICAgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEkzMiddID0gcG93KDIsIDMwKTsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gcG93KDIsIDYwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDMwKSwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0MigKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDE1KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNyA9PiA3NywKKyAgICAgICAgICAgICAgICA4ID0+IDg4LAorICAgICAgICAgICAgICAgIDkgPT4gOTkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgImEiID0+ICIxMjMiLAorICAgICAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAorICAgICAgICAgICAgICAgICJzYW1lIiA9PiAic2FtZSIsCisgICAgICAgICAgICAgICAgIjAiID0+ICJudW1lcmljIGtleSIsCisgICAgICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAorICAgICAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9PiAibG9uZyBrZXkiCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFNldCddID0gYXJyYXkoMSA9PiB0cnVlLCA1ID0+IHRydWUsIDYgPT4gdHJ1ZSk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddID0gYXJyYXkoMSwgMiwgMyk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXSA9IDY5OworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAorICAgICAgICAgICAgICAgICAgICAyID0+IDIsCisgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgLTQgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIC00ID0+IC00LAorICAgICAgICAgICAgICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCisgICAgICAgICAgICAgICAgICAgIC0xID0+IC0xCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAvLyB0ZXN0SW5zYW5pdHkgLi4uIHRha2VzIGEgZmV3IHN0ZXBzIHRvIHNldCB1cCEKKworICAgICAgICAkeHRydWN0MSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gNAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJHh0cnVjdDIgPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkdXNlck1hcCA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgICAgICAgICAgTnVtYmVyejo6RUlHSFQgPT4gOAorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkyID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+ICR1c2VyTWFwLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsICR4dHJ1Y3QyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJGluc2FuaXR5MyA9ICRpbnNhbml0eTI7CisKKyAgICAgICAgJGluc2FuaXR5NiA9CisgICAgICAgICAgICBuZXcgSW5zYW5pdHkoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiBudWxsLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICIxIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRIUkVFID0+ICRpbnNhbml0eTMKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICIyIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6U0lYID0+ICRpbnNhbml0eTYKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY4NjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCkBAIC0wLDAgKzEsMTE2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcSnNvblNlcmlhbGl6ZTsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIHN0ZENsYXNzOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgSnNvblNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzUuNCcsICc8JykpIHsKKyAgICAgICAgICAgICR0aGlzLT5tYXJrVGVzdFNraXBwZWQoJ1JlcXVpcmVzIFBIUCA1LjQgb3IgbmV3ZXIhJyk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocGpzJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpCisgICAgeworICAgICAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMobmV3IHN0ZENsYXNzKCksIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ3NBbmRJbnRzKCkKKyAgICB7CisgICAgICAgICRpbnB1dCA9IGFycmF5KAorICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2ZvbycsCisgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAxMjM0NTY3ODkwLAorICAgICAgICApOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOworCisgICAgICAgIC8vIFh0cnVjdCdzICdpMzJfdGhpbmcnIGFuZCAnYnl0ZV90aGluZycgZmllbGRzIHNob3VsZCBub3QgYmUgcHJlc2VudCBoZXJlIQorICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJpbmdfdGhpbmcgPSAkaW5wdXRbJ3N0cmluZ190aGluZyddOworICAgICAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkU3RydWN0cygpCisgICAgeworICAgICAgICAkeHRydWN0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKGFycmF5KAorICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQyLAorICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgKKyAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMjM0NTYsCisgICAgICAgICAgICApKSwKKyAgICAgICAgKSk7CisKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZyA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nID0gJHh0cnVjdDItPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdDIpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpCisgICAgeworICAgICAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkeGlucHV0KTsKKyAgICAgICAgJGluc2FuaXR5ID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KGFycmF5KAorICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QsICR4dHJ1Y3QsICR4dHJ1Y3QpCisgICAgICAgICkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT54dHJ1Y3RzID0gYXJyYXkoKG9iamVjdCkkeGlucHV0LCAob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkaW5zYW5pdHkpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOworICAgICAgICAkbmVzdGVkID0gbmV3IFxUaHJpZnRUZXN0XE5lc3RlZExpc3RzQm9uayhhcnJheSgnYm9uaycgPT4gYXJyYXkoYXJyYXkoYXJyYXkoJGJvbmspKSkpKTsKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ym9uayA9IGFycmF5KGFycmF5KGFycmF5KChvYmplY3QpYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSkpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBzKCkKKyAgICB7CisgICAgICAgICRpbnRtYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoWyd0aGluZycgPT4gWzAgPT4gJ3plcm8nXV0pOworICAgICAgICAkZW1wdHltYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoW10pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InRoaW5nIjp7IjAiOiJ6ZXJvIn19JywganNvbl9lbmNvZGUoJGludG1hcCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7fScsIGpzb25fZW5jb2RlKCRlbXB0eW1hcCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2NhbGFyVHlwZXMoKQorICAgIHsKKyAgICAgICAgJGIgPSBuZXcgXFRocmlmdFRlc3RcQm9vbHMoWydpbV90cnVlJyA9PiAnMScsICdpbV9mYWxzZScgPT4gJzAnXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3siaW1fdHJ1ZSI6dHJ1ZSwiaW1fZmFsc2UiOmZhbHNlfScsIGpzb25fZW5jb2RlKCRiKSk7CisgICAgICAgICRzID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoWydzJyA9PiA0Ml0pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InMiOiI0MiJ9JywganNvbl9lbmNvZGUoJHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDgyNDY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworUEhQVU5JVD1waHAgJCh0b3Bfc3JjZGlyKS92ZW5kb3IvYmluL3BocHVuaXQKKworc3R1YnM6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwCisJJChUSFJJRlQpIC0tZ2VuIHBocCAtciAtLW91dCAuL3BhY2thZ2VzL3BocCAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2bworCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwanMKKwkkKFRIUklGVCkgLS1nZW4gcGhwOnZhbGlkYXRlICAgICAtciAtLW91dCAuL3BhY2thZ2VzL3BocHYgICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOnZhbGlkYXRlLG9vcCAtciAtLW91dCAuL3BhY2thZ2VzL3BocHZvICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOmpzb24gICAgICAgICAtciAtLW91dCAuL3BhY2thZ2VzL3BocGpzICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKworZGVwczogJCh0b3Bfc3JjZGlyKS9jb21wb3Nlci5qc29uCisJY29tcG9zZXIgaW5zdGFsbCAtLXdvcmtpbmctZGlyPSQodG9wX3NyY2RpcikKKworYWxsLWxvY2FsOiBkZXBzCisKK2NoZWNrLWpzb24tc2VyaWFsaXplcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctanNvbi1zZXJpYWxpemVyLnhtbCBKc29uU2VyaWFsaXplLworCitjaGVjay12YWxpZGF0b3I6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXZhbGlkYXRvci54bWwgVmFsaWRhdG9yLworCitjaGVjay1wcm90b2NvbDoJZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctcHJvdG9jb2wueG1sIFByb3RvY29sLworCitjaGVjazogZGVwcyBzdHVicyBcCisgIGNoZWNrLXByb3RvY29sIFwKKyAgY2hlY2stdmFsaWRhdG9yIFwKKyAgY2hlY2stanNvbi1zZXJpYWxpemVyCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIC4vcGFja2FnZXMKKwkkKFJNKSBURVNULSoueG1sCmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWIwYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIEJpbmFyeVNlcmlhbGl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocCcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlIHRyeSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIGEgcmFuZG9tIG9iamVjdCB0byBtYWtlIHN1cmUgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLgorICAgICAqIEBzZWUgVEhSSUZULTE1NzkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeVNlcmlhbGl6ZXIoKQorICAgIHsKKyAgICAgICAgJHN0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2FiYycpKTsKKyAgICAgICAgJHNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6c2VyaWFsaXplKCRzdHJ1Y3QsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKKyAgICAgICAgJGRlc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSgkc2VyaWFsaXplZCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRzdHJ1Y3QsICRkZXNlcmlhbGl6ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5MDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyIxIjp7InN0ciI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIFwvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZVwn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwXC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7IjEiOnsic3RyIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddID0gJ3siMSI6eyJzdHIiOiJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXFxcXFwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddID0gJ3siMSI6eyJzdHIiOiLguKrguKfguLHguKrguJTguLVcL/Cdkq8ifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7IjEiOnsiaTgiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3siMSI6eyJpMzIiOjEwNzM3NDE4MjR9fSc7CisKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6JyAuIHBvdygyLCA2MCkgLiAnfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyIxIjp7Im1hcCI6WyJzdHIiLCJzdHIiLDYseyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7IjEiOnsic2V0IjpbImkzMiIsMywxLDUsNl19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXSA9ICd7IjEiOnsiaTMyIjoxfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyIxIjp7Imk2NCI6Njl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10gPSAneyIwIjp7Im1hcCI6WyJpNjQiLCJtYXAiLDIseyIxIjpbImkzMiIsInJlYyIsMix7IjIiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19LCIzIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fX1dLCIyIjpbImkzMiIsInJlYyIsMSx7IjYiOnt9fV19XX19JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBlY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDUxOCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlICRhY3R1YWwgcmV0dXJucyB1bmVzY2FwZWQgc3RyaW5nLgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0byB0byBkZWNvZGUgdGhlbiBlbmNvZGUgaXQgYWdhaW4KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleHBlY3RlZCBlc2NhcGVkIHVuaWNvZGUuCisgICAgICAgICAqLworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJGFjdHVhbCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1Xcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUkVBRCBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzNXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nNFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCisgICAgICAgICk7CisgICAgICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwTWFwX3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJbnNhbml0eV9yZXN1bHQoKTsKKyAgICAgICAgJHJlc3VsdC0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2ZkODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJnc0pTT04gPSBhcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddID0gJ3sidGhpbmciOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIn0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10gPSAneyJ0aGluZyI6InF1b3RlOiBcXFxcXCIgYmFja3NsYXNoOiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFxcXFwvICBiYWNrc3BhY2U6IFxcXFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcXFxcXFwvXFxcXGJcblxyXHQgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCJ9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10gPSAneyJ0aGluZyI6My4xNDE1OTI2NTM1ODk4fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7InRoaW5nIjoxfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3sidGhpbmciOjEwNzM3NDE4MjR9JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7InRoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7InRoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9JzsKKworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7InRoaW5nIjp7IjciOjc3LCI4Ijo4OCwiOSI6OTl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3sidGhpbmciOnsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3sidGhpbmciOlsxLDUsNl19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3sidGhpbmciOlsxLDIsM119JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3sidGhpbmciOjY5fSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhMTM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKQEAgLTAsMCArMSwyNTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwcml2YXRlICR0cmFuc3BvcnQ7CisgICAgcHJpdmF0ZSAkcHJvdG9jb2w7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQorICAgIHsKKworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRTaW1wbGVKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0IGIvbGliL3BocC90ZXN0L1Rlc3RWYWxpZGF0b3JzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzM4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Rlc3RWYWxpZGF0b3JzLnRocmlmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBwaHAgVGVzdFZhbGlkYXRvcnMKKworaW5jbHVkZSAiLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIKKwordW5pb24gVW5pb25PZlN0cmluZ3MgeworICAxOiBzdHJpbmcgYWE7CisgIDI6IHN0cmluZyBiYjsKK30KKworc2VydmljZSBUZXN0U2VydmljZSB7CisgICAgdm9pZCB0ZXN0KCkgdGhyb3dzKDE6IFRocmlmdFRlc3QuWGNlcHRpb24geGNlcHRpb24pOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI5MDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSwxNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCithYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCb25rVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0QVZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RVbmlvbk9mU3RyaW5nc1ZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVW5pb25PZlN0cmluZ3MnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNlcnZpY2VSZXN1bHRWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRib25rLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ0Jvbmsgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVdpdGhNaXNzaW5nUmVxdWlyZWQoKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAorICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgICAgICR0aGlzLT5mYWlsKCdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVhZFN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygiYWJjIiwgJHN0cnVjdGEtPnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVTdHJ1Y3RBKCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICRzdHJ1Y3RhLT5zID0gImFiYyI7CisgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAkd3JpdGVSZXN1bHQgPSBiYXNlNjRfZW5jb2RlKCR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygnQ3dBQkFBQUFBMkZpWXdBPScsICR3cml0ZVJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgcmVhZCB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOworCisgICAgICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JXcml0ZScpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBDbGFzcyBUZXN0VmFsaWRhdG9ycworICogQHBhY2thZ2UgVGVzdFxUaHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yVGVzdAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwdicpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmNhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzT29wCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdE9vcCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2bycpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9weS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI5MWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFlUSE9OX0lOQ0xVREVfRElSU30pCisKK2FkZF9jdXN0b21fdGFyZ2V0KHB5dGhvbl9idWlsZCBBTEwKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9IHNldHVwLnB5IGJ1aWxkCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgUHl0aG9uIGxpYnJhcnkiCispCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoUHl0aG9uVGVzdFNTTFNvY2tldCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC90ZXN0X3NzbHNvY2tldC5weSkKKyAgICBhZGRfdGVzdChQeXRob25UaHJpZnRKc29uICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3RocmlmdF9qc29uLnB5KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L01BTklGRVNULmluIGIvbGliL3B5L01BTklGRVNULmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvTUFOSUZFU1QuaW4KQEAgLTAsMCArMSBAQAoraW5jbHVkZSBzcmMvZXh0LyoKZGlmZiAtLWdpdCBhL2xpYi9weS9NYWtlZmlsZS5hbSBiL2xpYi9weS9NYWtlZmlsZS5hbQppbmRleCA1MjUwY2Y2Li41ODYxODU4IDEwMDY0NAotLS0gYS9saWIvcHkvTWFrZWZpbGUuYW0KKysrIGIvbGliL3B5L01ha2VmaWxlLmFtCkBAIC0xNiwxMSArMTYsMjEgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQorQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogREVTVERJUiA/PSAvCi1FWFRSQV9ESVNUID0gc2V0dXAucHkgc2V0dXAuY2ZnIHNyYwogCi1hbGwtbG9jYWw6CitpZiBXSVRIX1BZMworcHkzLWJ1aWxkOgorCSQoUFlUSE9OMykgc2V0dXAucHkgYnVpbGQKK3B5My10ZXN0OiBweTMtYnVpbGQKKwkkKFBZVEhPTjMpIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTjMpIHRlc3QvdGVzdF9zc2xzb2NrZXQucHkKK2Vsc2UKK3B5My1idWlsZDoKK3B5My10ZXN0OgorZW5kaWYKKworYWxsLWxvY2FsOiBweTMtYnVpbGQKIAkkKFBZVEhPTikgc2V0dXAucHkgYnVpbGQKIAogIyBXZSdyZSBpZ25vcmluZyBwcmVmaXggaGVyZSBiZWNhdXNlIHNpdGUtcGFja2FnZXMgc2VlbXMgdG8gYmUKQEAgLTMzLDQgKzQzLDE3IEBACiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciBidWlsZAogCi1jaGVjay1sb2NhbDogYWxsCitjaGVjay1sb2NhbDogYWxsIHB5My10ZXN0CisJJChQWVRIT04pIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTikgdGVzdC90ZXN0X3NzbHNvY2tldC5weQorCitFWFRSQV9ESVNUID0gXAorCUNNYWtlTGlzdHMudHh0IFwKKwlNQU5JRkVTVC5pbiBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJY29tcGF0IFwKKwlzZXR1cC5weSBcCisJc2V0dXAuY2ZnIFwKKwlzcmMgXAorCXRlc3QgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3B5L1JFQURNRSBiL2xpYi9weS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9weS9SRUFETUUKcmVuYW1lIHRvIGxpYi9weS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1NjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNyBAQAorIyMgUHl0aG9uIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBDb2RlIFN0eWxlIGZvciBQeXRob24gQ29kZSBbUEVQOF0oaHR0cDovL2xlZ2FjeS5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMDA4LykKKworV2hlbiBpbiBkb3VidCAtIGNoZWNrIHdpdGggPGh0dHA6Ly93d3cucHlsaW50Lm9yZy8+IG9yIG9ubGluZSB3aXRoIDxodHRwOi8vcGVwOG9ubGluZS5jb20+LgpkaWZmIC0tZ2l0IGEvbGliL3B5L2NvbXBhdC93aW4zMi9zdGRpbnQuaCBiL2xpYi9weS9jb21wYXQvd2luMzIvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNjA4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9jb21wYXQvd2luMzIvc3RkaW50LmgKQEAgLTAsMCArMSwyNDcgQEAKKy8vIElTTyBDOXggIGNvbXBsaWFudCBzdGRpbnQuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KKy8vIEJhc2VkIG9uIElTTy9JRUMgOTg5OTpUQzIgQ29tbWl0dGVlIGRyYWZ0IChNYXkgNiwgMjAwNSkgV0cxNC9OMTEyNCAKKy8vIAorLy8gIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEFsZXhhbmRlciBDaGVtZXJpcworLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy8vIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisvLyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworLy8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorLy8gUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisvLyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgCisvLyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorLy8gT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorLy8gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLyAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmbmRlZiBfTVNDX1ZFUiAvLyBbCisjZXJyb3IgIlVzZSB0aGlzIGhlYWRlciBvbmx5IHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzISIKKyNlbmRpZiAvLyBfTVNDX1ZFUiBdCisKKyNpZm5kZWYgX01TQ19TVERJTlRfSF8gLy8gWworI2RlZmluZSBfTVNDX1NURElOVF9IXworCisjaWYgX01TQ19WRVIgPiAxMDAwCisjcHJhZ21hIG9uY2UKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIEZvciBWaXN1YWwgU3R1ZGlvIDYgaW4gQysrIG1vZGUgYW5kIGZvciBtYW55IFZpc3VhbCBTdHVkaW8gdmVyc2lvbnMgd2hlbgorLy8gY29tcGlsaW5nIGZvciBBUk0gd2Ugc2hvdWxkIHdyYXAgPHdjaGFyLmg+IGluY2x1ZGUgd2l0aCAnZXh0ZXJuICJDKysiIHt9JworLy8gb3IgY29tcGlsZXIgZ2l2ZSBtYW55IGVycm9ycyBsaWtlIHRoaXM6CisvLyAgIGVycm9yIEMyNzMzOiBzZWNvbmQgQyBsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ3dtZW1jaHInIG5vdCBhbGxvd2VkCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisjICBpbmNsdWRlIDx3Y2hhci5oPgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8gRGVmaW5lIF9XNjQgbWFjcm9zIHRvIG1hcmsgdHlwZXMgY2hhbmdpbmcgdGhlaXIgc2l6ZSwgbGlrZSBpbnRwdHJfdC4KKyNpZm5kZWYgX1c2NAorIyAgaWYgIWRlZmluZWQoX19taWRsKSAmJiAoZGVmaW5lZChfWDg2XykgfHwgZGVmaW5lZChfTV9JWDg2KSkgJiYgX01TQ19WRVIgPj0gMTMwMAorIyAgICAgZGVmaW5lIF9XNjQgX193NjQKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBfVzY0CisjICBlbmRpZgorI2VuZGlmCisKKworLy8gNy4xOC4xIEludGVnZXIgdHlwZXMKKworLy8gNy4xOC4xLjEgRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcworCisvLyBWaXN1YWwgU3R1ZGlvIDYgYW5kIEVtYmVkZGVkIFZpc3VhbCBDKysgNCBkb2Vzbid0CisvLyByZWFsaXplIHRoYXQsIGUuZy4gY2hhciBoYXMgdGhlIHNhbWUgc2l6ZSBhcyBfX2ludDgKKy8vIHNvIHdlIGdpdmUgdXAgb24gX19pbnRYIGZvciB0aGVtLgorI2lmIChfTVNDX1ZFUiA8IDEzMDApCisgICB0eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgIGludDhfdDsKKyAgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgICAgaW50MTZfdDsKKyAgIHR5cGVkZWYgc2lnbmVkIGludCAgICAgICAgaW50MzJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgdWludDhfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgdWludDE2X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgIHVpbnQzMl90OworI2Vsc2UKKyAgIHR5cGVkZWYgc2lnbmVkIF9faW50OCAgICAgaW50OF90OworICAgdHlwZWRlZiBzaWduZWQgX19pbnQxNiAgICBpbnQxNl90OworICAgdHlwZWRlZiBzaWduZWQgX19pbnQzMiAgICBpbnQzMl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDggICB1aW50OF90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2ICB1aW50MTZfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgdWludDMyX3Q7CisjZW5kaWYKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgICAgICAgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICAgdWludDY0X3Q7CisKKworLy8gNy4xOC4xLjIgTWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCit0eXBlZGVmIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGludDE2X3QgICBpbnRfbGVhc3QxNl90OwordHlwZWRlZiBpbnQzMl90ICAgaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgIGludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2xlYXN0OF90OwordHlwZWRlZiB1aW50MTZfdCAgdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90ICB1aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRfbGVhc3Q2NF90OworCisvLyA3LjE4LjEuMyBGYXN0ZXN0IG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcwordHlwZWRlZiBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGludDE2X3QgICBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgICBpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGludDY0X3QgICBpbnRfZmFzdDY0X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIHVpbnQxNl90ICB1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1aW50MzJfdCAgdWludF9mYXN0MzJfdDsKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7CisKKy8vIDcuMTguMS40IEludGVnZXIgdHlwZXMgY2FwYWJsZSBvZiBob2xkaW5nIG9iamVjdCBwb2ludGVycworI2lmZGVmIF9XSU42NCAvLyBbCisgICB0eXBlZGVmIHNpZ25lZCBfX2ludDY0ICAgIGludHB0cl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICB1aW50cHRyX3Q7CisjZWxzZSAvLyBfV0lONjQgXVsKKyAgIHR5cGVkZWYgX1c2NCBzaWduZWQgaW50ICAgaW50cHRyX3Q7CisgICB0eXBlZGVmIF9XNjQgdW5zaWduZWQgaW50IHVpbnRwdHJfdDsKKyNlbmRpZiAvLyBfV0lONjQgXQorCisvLyA3LjE4LjEuNSBHcmVhdGVzdC13aWR0aCBpbnRlZ2VyIHR5cGVzCit0eXBlZGVmIGludDY0X3QgICBpbnRtYXhfdDsKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRtYXhfdDsKKworCisvLyA3LjE4LjIgTGltaXRzIG9mIHNwZWNpZmllZC13aWR0aCBpbnRlZ2VyIHR5cGVzCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfTElNSVRfTUFDUk9TKSAvLyBbICAgU2VlIGZvb3Rub3RlIDIyMCBhdCBwYWdlIDI1NyBhbmQgZm9vdG5vdGUgMjIxIGF0IHBhZ2UgMjU5CisKKy8vIDcuMTguMi4xIExpbWl0cyBvZiBleGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVDhfTUlOICAgICAoKGludDhfdClfSThfTUlOKQorI2RlZmluZSBJTlQ4X01BWCAgICAgX0k4X01BWAorI2RlZmluZSBJTlQxNl9NSU4gICAgKChpbnQxNl90KV9JMTZfTUlOKQorI2RlZmluZSBJTlQxNl9NQVggICAgX0kxNl9NQVgKKyNkZWZpbmUgSU5UMzJfTUlOICAgICgoaW50MzJfdClfSTMyX01JTikKKyNkZWZpbmUgSU5UMzJfTUFYICAgIF9JMzJfTUFYCisjZGVmaW5lIElOVDY0X01JTiAgICAoKGludDY0X3QpX0k2NF9NSU4pCisjZGVmaW5lIElOVDY0X01BWCAgICBfSTY0X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgX1VJOF9NQVgKKyNkZWZpbmUgVUlOVDE2X01BWCAgIF9VSTE2X01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgX1VJMzJfTUFYCisjZGVmaW5lIFVJTlQ2NF9NQVggICBfVUk2NF9NQVgKKworLy8gNy4xOC4yLjIgTGltaXRzIG9mIG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcworI2RlZmluZSBJTlRfTEVBU1Q4X01JTiAgICBJTlQ4X01JTgorI2RlZmluZSBJTlRfTEVBU1Q4X01BWCAgICBJTlQ4X01BWAorI2RlZmluZSBJTlRfTEVBU1QxNl9NSU4gICBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUFYICAgSU5UMTZfTUFYCisjZGVmaW5lIElOVF9MRUFTVDMyX01JTiAgIElOVDMyX01JTgorI2RlZmluZSBJTlRfTEVBU1QzMl9NQVggICBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUlOICAgSU5UNjRfTUlOCisjZGVmaW5lIElOVF9MRUFTVDY0X01BWCAgIElOVDY0X01BWAorI2RlZmluZSBVSU5UX0xFQVNUOF9NQVggICBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDE2X01BWCAgVUlOVDE2X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMzJfTUFYICBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVggIFVJTlQ2NF9NQVgKKworLy8gNy4xOC4yLjMgTGltaXRzIG9mIGZhc3Rlc3QgbWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVF9GQVNUOF9NSU4gICAgSU5UOF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1Q4X01BWCAgICBJTlQ4X01BWAorI2RlZmluZSBJTlRfRkFTVDE2X01JTiAgIElOVDE2X01JTgorI2RlZmluZSBJTlRfRkFTVDE2X01BWCAgIElOVDE2X01BWAorI2RlZmluZSBJTlRfRkFTVDMyX01JTiAgIElOVDMyX01JTgorI2RlZmluZSBJTlRfRkFTVDMyX01BWCAgIElOVDMyX01BWAorI2RlZmluZSBJTlRfRkFTVDY0X01JTiAgIElOVDY0X01JTgorI2RlZmluZSBJTlRfRkFTVDY0X01BWCAgIElOVDY0X01BWAorI2RlZmluZSBVSU5UX0ZBU1Q4X01BWCAgIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UX0ZBU1QxNl9NQVggIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMzJfTUFYICBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDY0X01BWCAgVUlOVDY0X01BWAorCisvLyA3LjE4LjIuNCBMaW1pdHMgb2YgaW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzCisjaWZkZWYgX1dJTjY0IC8vIFsKKyMgIGRlZmluZSBJTlRQVFJfTUlOICAgSU5UNjRfTUlOCisjICBkZWZpbmUgSU5UUFRSX01BWCAgIElOVDY0X01BWAorIyAgZGVmaW5lIFVJTlRQVFJfTUFYICBVSU5UNjRfTUFYCisjZWxzZSAvLyBfV0lONjQgXVsKKyMgIGRlZmluZSBJTlRQVFJfTUlOICAgSU5UMzJfTUlOCisjICBkZWZpbmUgSU5UUFRSX01BWCAgIElOVDMyX01BWAorIyAgZGVmaW5lIFVJTlRQVFJfTUFYICBVSU5UMzJfTUFYCisjZW5kaWYgLy8gX1dJTjY0IF0KKworLy8gNy4xOC4yLjUgTGltaXRzIG9mIGdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UTUFYX01JTiAgIElOVDY0X01JTgorI2RlZmluZSBJTlRNQVhfTUFYICAgSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRNQVhfTUFYICBVSU5UNjRfTUFYCisKKy8vIDcuMTguMyBMaW1pdHMgb2Ygb3RoZXIgaW50ZWdlciB0eXBlcworCisjaWZkZWYgX1dJTjY0IC8vIFsKKyMgIGRlZmluZSBQVFJESUZGX01JTiAgX0k2NF9NSU4KKyMgIGRlZmluZSBQVFJESUZGX01BWCAgX0k2NF9NQVgKKyNlbHNlICAvLyBfV0lONjQgXVsKKyMgIGRlZmluZSBQVFJESUZGX01JTiAgX0kzMl9NSU4KKyMgIGRlZmluZSBQVFJESUZGX01BWCAgX0kzMl9NQVgKKyNlbmRpZiAgLy8gX1dJTjY0IF0KKworI2RlZmluZSBTSUdfQVRPTUlDX01JTiAgSU5UX01JTgorI2RlZmluZSBTSUdfQVRPTUlDX01BWCAgSU5UX01BWAorCisjaWZuZGVmIFNJWkVfTUFYIC8vIFsKKyMgIGlmZGVmIF9XSU42NCAvLyBbCisjICAgICBkZWZpbmUgU0laRV9NQVggIF9VSTY0X01BWAorIyAgZWxzZSAvLyBfV0lONjQgXVsKKyMgICAgIGRlZmluZSBTSVpFX01BWCAgX1VJMzJfTUFYCisjICBlbmRpZiAvLyBfV0lONjQgXQorI2VuZGlmIC8vIFNJWkVfTUFYIF0KKworLy8gV0NIQVJfTUlOIGFuZCBXQ0hBUl9NQVggYXJlIGFsc28gZGVmaW5lZCBpbiA8d2NoYXIuaD4KKyNpZm5kZWYgV0NIQVJfTUlOIC8vIFsKKyMgIGRlZmluZSBXQ0hBUl9NSU4gIDAKKyNlbmRpZiAgLy8gV0NIQVJfTUlOIF0KKyNpZm5kZWYgV0NIQVJfTUFYIC8vIFsKKyMgIGRlZmluZSBXQ0hBUl9NQVggIF9VSTE2X01BWAorI2VuZGlmICAvLyBXQ0hBUl9NQVggXQorCisjZGVmaW5lIFdJTlRfTUlOICAwCisjZGVmaW5lIFdJTlRfTUFYICBfVUkxNl9NQVgKKworI2VuZGlmIC8vIF9fU1REQ19MSU1JVF9NQUNST1MgXQorCisKKy8vIDcuMTguNCBMaW1pdHMgb2Ygb3RoZXIgaW50ZWdlciB0eXBlcworCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0NPTlNUQU5UX01BQ1JPUykgLy8gWyAgIFNlZSBmb290bm90ZSAyMjQgYXQgcGFnZSAyNjAKKworLy8gNy4xOC40LjEgTWFjcm9zIGZvciBtaW5pbXVtLXdpZHRoIGludGVnZXIgY29uc3RhbnRzCisKKyNkZWZpbmUgSU5UOF9DKHZhbCkgIHZhbCMjaTgKKyNkZWZpbmUgSU5UMTZfQyh2YWwpIHZhbCMjaTE2CisjZGVmaW5lIElOVDMyX0ModmFsKSB2YWwjI2kzMgorI2RlZmluZSBJTlQ2NF9DKHZhbCkgdmFsIyNpNjQKKworI2RlZmluZSBVSU5UOF9DKHZhbCkgIHZhbCMjdWk4CisjZGVmaW5lIFVJTlQxNl9DKHZhbCkgdmFsIyN1aTE2CisjZGVmaW5lIFVJTlQzMl9DKHZhbCkgdmFsIyN1aTMyCisjZGVmaW5lIFVJTlQ2NF9DKHZhbCkgdmFsIyN1aTY0CisKKy8vIDcuMTguNC4yIE1hY3JvcyBmb3IgZ3JlYXRlc3Qtd2lkdGggaW50ZWdlciBjb25zdGFudHMKKyNkZWZpbmUgSU5UTUFYX0MgICBJTlQ2NF9DCisjZGVmaW5lIFVJTlRNQVhfQyAgVUlOVDY0X0MKKworI2VuZGlmIC8vIF9fU1REQ19DT05TVEFOVF9NQUNST1MgXQorCisKKyNlbmRpZiAvLyBfTVNDX1NURElOVF9IXyBdCmRpZmYgLS1naXQgYS9saWIvcHkvc2V0dXAuY2ZnIGIvbGliL3B5L3NldHVwLmNmZwppbmRleCAyZGNhMmY4Li5jOWVkMGFlIDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAuY2ZnCisrKyBiL2xpYi9weS9zZXR1cC5jZmcKQEAgLTEsMiArMSw2IEBACiBbaW5zdGFsbF0KIG9wdGltaXplID0gMQorW21ldGFkYXRhXQorZGVzY3JpcHRpb24tZmlsZSA9IFJFQURNRS5tZAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvbGliL3B5L3NldHVwLnB5IGIvbGliL3B5L3NldHVwLnB5CmluZGV4IGU0ZjEwYWUuLjNjZjE0NjkgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zZXR1cC5weQorKysgYi9saWIvcHkvc2V0dXAucHkKQEAgLTE5LDI2ICsxOSwxMjEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2ltcG9ydCBzeXMKK3RyeToKKyAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2V4Y2VwdCBFeGNlcHRpb246CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgogCi1mYXN0YmluYXJ5bW9kID0gRXh0ZW5zaW9uKCd0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgPSBbJ3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMnXSwKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorCisjIEZpeCB0byBidWlsZCBzZGlzdCB1bmRlciB2YWdyYW50CitpbXBvcnQgb3MKK2lmICd2YWdyYW50JyBpbiBzdHIob3MuZW52aXJvbik6CisgICAgdHJ5OgorICAgICAgICBkZWwgb3MubGluaworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworCitpbmNsdWRlX2RpcnMgPSBbJ3NyYyddCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICBpbmNsdWRlX2RpcnMuYXBwZW5kKCdjb21wYXQvd2luMzInKQorICAgIGV4dF9lcnJvcnMgPSAoQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgSU9FcnJvcikKK2Vsc2U6CisgICAgZXh0X2Vycm9ycyA9IChDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKQorCisKK2NsYXNzIEJ1aWxkRmFpbGVkKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIHZlX2J1aWxkX2V4dChidWlsZF9leHQpOgorICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1aWxkX2V4dC5ydW4oc2VsZikKKyAgICAgICAgZXhjZXB0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CisgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCisKKyAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQorICAgICAgICBleGNlcHQgZXh0X2Vycm9yczoKKyAgICAgICAgICAgIHJhaXNlIEJ1aWxkRmFpbGVkKCkKKworCitkZWYgcnVuX3NldHVwKHdpdGhfYmluYXJ5KToKKyAgICBpZiB3aXRoX2JpbmFyeToKKyAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoCisgICAgICAgICAgICBleHRfbW9kdWxlcz1bCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCd0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9WworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvbW9kdWxlLmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC90eXBlcy5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvYmluYXJ5LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC9jb21wYWN0LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBjbWRjbGFzcz1kaWN0KGJ1aWxkX2V4dD12ZV9idWlsZF9leHQpCisgICAgICAgICkKKyAgICBlbHNlOgorICAgICAgICBleHRlbnNpb25zID0gZGljdCgpCiAKLXNldHVwKG5hbWUgPSAnVGhyaWZ0JywKLSAgICAgIHZlcnNpb24gPSAnMC42LjEnLAotICAgICAgZGVzY3JpcHRpb24gPSAnUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtJywKLSAgICAgIGF1dGhvciA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXSwKLSAgICAgIGF1dGhvcl9lbWFpbCA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10sCi0gICAgICB1cmwgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKLSAgICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICAgIHBhY2thZ2VzID0gWwotICAgICAgICAndGhyaWZ0JywKLSAgICAgICAgJ3RocmlmdC5wcm90b2NvbCcsCi0gICAgICAgICd0aHJpZnQudHJhbnNwb3J0JywKLSAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAotICAgICAgXSwKLSAgICAgIHBhY2thZ2VfZGlyID0geyd0aHJpZnQnIDogJ3NyYyd9LAotICAgICAgZXh0X21vZHVsZXMgPSBbZmFzdGJpbmFyeW1vZF0sCi0gICAgICApCisgICAgc3NsX2RlcHMgPSBbXQorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdpcGFkZHJlc3MnKQorICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDAwMDoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lPj0zLjUnKQorICAgIHRvcm5hZG9fZGVwcyA9IFsndG9ybmFkbz49NC4wJ10KKyAgICB0d2lzdGVkX2RlcHMgPSBbJ3R3aXN0ZWQnXQogCisgICAgc2V0dXAobmFtZT0ndGhyaWZ0JywKKyAgICAgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbScsCisgICAgICAgICAgYXV0aG9yPSdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnLAorICAgICAgICAgIGF1dGhvcl9lbWFpbD0nZGV2QHRocmlmdC5hcGFjaGUub3JnJywKKyAgICAgICAgICB1cmw9J2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPVsnc2l4Pj0xLjcuMiddLAorICAgICAgICAgIGV4dHJhc19yZXF1aXJlPXsKKyAgICAgICAgICAgICAgJ3NzbCc6IHNzbF9kZXBzLAorICAgICAgICAgICAgICAndG9ybmFkbyc6IHRvcm5hZG9fZGVwcywKKyAgICAgICAgICAgICAgJ3R3aXN0ZWQnOiB0d2lzdGVkX2RlcHMsCisgICAgICAgICAgICAgICdhbGwnOiBzc2xfZGVwcyArIHRvcm5hZG9fZGVwcyArIHR3aXN0ZWRfZGVwcywKKyAgICAgICAgICB9LAorICAgICAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAgICAgJ3RocmlmdCcsCisgICAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAorICAgICAgICAgICAgICAndGhyaWZ0LnRyYW5zcG9ydCcsCisgICAgICAgICAgICAgICd0aHJpZnQuc2VydmVyJywKKyAgICAgICAgICBdLAorICAgICAgICAgIHBhY2thZ2VfZGlyPXsndGhyaWZ0JzogJ3NyYyd9LAorICAgICAgICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAorICAgICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycsCisgICAgICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAorICAgICAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICAgICAgXSwKKyAgICAgICAgICB6aXBfc2FmZT1GYWxzZSwKKyAgICAgICAgICAqKmV4dGVuc2lvbnMKKyAgICAgICAgICApCisKKwordHJ5OgorICAgIHdpdGhfYmluYXJ5ID0gVHJ1ZQorICAgIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSkKK2V4Y2VwdCBCdWlsZEZhaWxlZDoKKyAgICBwcmludCgpCisgICAgcHJpbnQoJyonICogODApCisgICAgcHJpbnQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjb21waWxlIHdpdGggdGhlIEMgZXh0ZW5zaW9uIGVuYWJsZWQiKQorICAgIHByaW50KCJBdHRlbXB0aW5nIHRvIGJ1aWxkIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiBub3ciKQorICAgIHByaW50KCcqJyAqIDgwKQorICAgIHByaW50KCkKKworICAgIHJ1bl9zZXR1cChGYWxzZSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5IGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNWFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbERlY29yYXRvciwgVE11bHRpcGxleGVkUHJvdG9jb2wKKworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoVFByb2Nlc3Nvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZpY2VzID0ge30KKworICAgIGRlZiByZWdpc3RlclByb2Nlc3NvcihzZWxmLCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIChuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgaWYgdHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCBhbmQgdHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiVE11bHRpcGxleGVkIHByb3RvY29sIG9ubHkgc3VwcG9ydHMgQ0FMTCAmIE9ORVdBWSIpCisKKyAgICAgICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQorICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKKworICAgICAgICBzZXJ2aWNlTmFtZSA9IG5hbWVbMDppbmRleF0KKyAgICAgICAgY2FsbCA9IG5hbWVbaW5kZXggKyBsZW4oVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTpdCisgICAgICAgIGlmIHNlcnZpY2VOYW1lIG5vdCBpbiBzZWxmLnNlcnZpY2VzOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpCisKKyAgICAgICAgc3RhbmRhcmRNZXNzYWdlID0gKGNhbGwsIHR5cGUsIHNlcWlkKQorICAgICAgICByZXR1cm4gc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0ucHJvY2VzcyhTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KQorCisKK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIG1lc3NhZ2VCZWdpbik6CisgICAgICAgIHNlbGYubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZUJlZ2luCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmMjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weQpAQCAtMCwwICsxLDgzIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUKKworVFlQRV9JRFggPSAxCitTUEVDX0FSR1NfSURYID0gMworU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFggPSAwCitTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYID0gMQorCisKK2RlZiBmaXhfc3BlYyhhbGxfc3RydWN0cyk6CisgICAgIiIiV2lyZSB1cCByZWN1cnNpdmUgcmVmZXJlbmNlcyBmb3IgYWxsIFRTdHJ1Y3QgZGVmaW5pdGlvbnMgaW5zaWRlIG9mIGVhY2ggdGhyaWZ0X3NwZWMuIiIiCisgICAgZm9yIHN0cnVjIGluIGFsbF9zdHJ1Y3RzOgorICAgICAgICBzcGVjID0gc3RydWMudGhyaWZ0X3NwZWMKKyAgICAgICAgZm9yIHRocmlmdF9zcGVjIGluIHNwZWM6CisgICAgICAgICAgICBpZiB0aHJpZnRfc3BlYyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgb3RoZXIgPSB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfQ0xBU1NfUkVGX0lEWF0udGhyaWZ0X3NwZWMKKyAgICAgICAgICAgICAgICB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYXSA9IG90aGVyCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgIF9maXhfbWFwKHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorCisKK2RlZiBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBsaXN0IG9yIHNldCwgdGhlIHRocmlmdF9zcGVjIGVudHJ5IGxvb2tzIGxpa2UsCisgICAgIyAoMSwgVFR5cGUuTElTVCwgJ2xpc3RlcicsIChUVHlwZS5TVFJVQ1QsIFtSZWNMaXN0LCBOb25lXSwgRmFsc2UpLCBOb25lLCApLCAgIyAxCisgICAgIyBzbyBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKQorICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworCitkZWYgX2ZpeF9tYXAoZWxlbWVudF90eXBlKToKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gdmFsdWUgdHlwZSwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULCBbUmVjTWFwQmFzaWMsIE5vbmVdLCBGYWxzZSksIE5vbmUsICkKKyAgICAjIHdoaWNoIGlzIGp1c3QgYSBub3JtYWwgc3RydWN0IGRlZmluaXRpb24uCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBsaXN0IC8gc2V0LCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5MSVNULCAoVFR5cGUuU1RSVUNULCBbUmVjTWFwTGlzdCwgTm9uZV0sIEZhbHNlKSwgRmFsc2UpCisgICAgIyBhbmQgd2UgbmVlZCB0byBwcm9jZXNzIHRoZSAzcmQgZWxlbWVudCBhcyBhIGxpc3QuCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBtYXAsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLk1BUCwgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULAorICAgICMgIFtSZWNNYXBNYXAsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIG5lZWQgdG8gcHJvY2VzcyAzcmQgZWxlbWVudCBhcyBhIG1hcC4KKworICAgICMgSXMgdGhlIG1hcCBrZXkgYSBzdHJ1Y3Q/CisgICAgaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzFdWzFdID0gZWxlbWVudF90eXBlWzFdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzFdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzFdKQorCisgICAgIyBJcyB0aGUgbWFwIHZhbHVlIGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVszXVsxXSA9IGVsZW1lbnRfdHlwZVszXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzJdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVszXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVszXSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFNDb25zLnB5IGIvbGliL3B5L3NyYy9UU0NvbnMucHkKaW5kZXggMjQwNDYyNS4uYmM2N2Q3MCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UU0NvbnMucHkKKysrIGIvbGliL3B5L3NyYy9UU0NvbnMucHkKQEAgLTE5LDE1ICsxOSwxOCBAQAogCiBmcm9tIG9zIGltcG9ydCBwYXRoCiBmcm9tIFNDb25zLkJ1aWxkZXIgaW1wb3J0IEJ1aWxkZXIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBtYXAKKwogCiBkZWYgc2NvbnNfZW52KGVudiwgYWRkPScnKToKLSAgb3BhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5hYnNwYXRoKCckVEFSR0VUJykpCi0gIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCi0gIGNwcGJ1aWxkID0gQnVpbGRlcihhY3Rpb24gPSBsc3RyKQotICBlbnYuQXBwZW5kKEJVSUxERVJTID0geydUaHJpZnRDcHAnIDogY3BwYnVpbGR9KQorICAgIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQorICAgIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCisgICAgY3BwYnVpbGQgPSBCdWlsZGVyKGFjdGlvbj1sc3RyKQorICAgIGVudi5BcHBlbmQoQlVJTERFUlM9eydUaHJpZnRDcHAnOiBjcHBidWlsZH0pCisKIAogZGVmIGdlbl9jcHAoZW52LCBkaXIsIGZpbGUpOgotICBzY29uc19lbnYoZW52KQotICBzdWZmaXhlcyA9IFsnX3R5cGVzLmgnLCAnX3R5cGVzLmNwcCddCi0gIHRhcmdldHMgPSBtYXAobGFtYmRhIHM6ICdnZW4tY3BwLycgKyBmaWxlICsgcywgc3VmZml4ZXMpCi0gIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpcitmaWxlKycudGhyaWZ0JykKKyAgICBzY29uc19lbnYoZW52KQorICAgIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KKyAgICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQorICAgIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpciArIGZpbGUgKyAnLnRocmlmdCcpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5IGIvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQppbmRleCBiMTlmOThhLi5mYmJlNzY4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CisrKyBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKQEAgLTE3LDE4ICsxNywyMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBwcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSAucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSAudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKLWRlZiBzZXJpYWxpemUodGhyaWZ0X29iamVjdCwgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOgorCitkZWYgc2VyaWFsaXplKHRocmlmdF9vYmplY3QsCisgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9VEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CiAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogICAgIHRocmlmdF9vYmplY3Qud3JpdGUocHJvdG9jb2wpCiAgICAgcmV0dXJuIHRyYW5zcG9ydC5nZXR2YWx1ZSgpCiAKLWRlZiBkZXNlcmlhbGl6ZShiYXNlLCBidWYsIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKToKKworZGVmIGRlc2VyaWFsaXplKGJhc2UsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIHByb3RvY29sX2ZhY3Rvcnk9VEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CiAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGJ1ZikKICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogICAgIGJhc2UucmVhZChwcm90b2NvbCkKICAgICByZXR1cm4gYmFzZQotCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RUb3JuYWRvLnB5IGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9UVG9ybmFkby5weQpAQCAtMCwwICsxLDE4OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHNvY2tldAoraW1wb3J0IHN0cnVjdAorCitmcm9tIC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFRyYW5zcG9ydEJhc2UsIFRNZW1vcnlCdWZmZXIKKworZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKK2Zyb20gdG9ybmFkbyBpbXBvcnQgZ2VuLCBpb3N0cmVhbSwgaW9sb29wLCB0Y3BzZXJ2ZXIsIGNvbmN1cnJlbnQKKworX19hbGxfXyA9IFsnVFRvcm5hZG9TZXJ2ZXInLCAnVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQnXQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitjbGFzcyBfTG9jayhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fd2FpdGVycyA9IGRlcXVlKCkKKworICAgIGRlZiBhY3F1aXJlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl93YWl0ZXJzKSA+IDAKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIGFjcXVpcmUoc2VsZik6CisgICAgICAgIGJsb2NrZXIgPSBzZWxmLl93YWl0ZXJzWy0xXSBpZiBzZWxmLmFjcXVpcmVkKCkgZWxzZSBOb25lCisgICAgICAgIGZ1dHVyZSA9IGNvbmN1cnJlbnQuRnV0dXJlKCkKKyAgICAgICAgc2VsZi5fd2FpdGVycy5hcHBlbmQoZnV0dXJlKQorICAgICAgICBpZiBibG9ja2VyOgorICAgICAgICAgICAgeWllbGQgYmxvY2tlcgorCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oc2VsZi5fbG9ja19jb250ZXh0KCkpCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYWNxdWlyZWQoKSwgJ0xvY2sgbm90IGFxdWlyZWQnCisgICAgICAgIGZ1dHVyZSA9IHNlbGYuX3dhaXRlcnMucG9wbGVmdCgpCisgICAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KE5vbmUpCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX2xvY2tfY29udGV4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKworY2xhc3MgVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UpOgorICAgICIiImEgZnJhbWVkLCBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciBhIFRvcm5hZG8gc3RyZWFtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmVhbT1Ob25lLCBpb19sb29wPU5vbmUpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5pb19sb29wID0gaW9fbG9vcCBvciBpb2xvb3AuSU9Mb29wLmN1cnJlbnQoKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9yZWFkX2xvY2sgPSBfTG9jaygpCisKKyAgICAgICAgIyBzZXJ2ZXJzIHByb3ZpZGUgYSByZWFkeS10by1nbyBzdHJlYW0KKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgIGRlZiB3aXRoX3RpbWVvdXQoc2VsZiwgdGltZW91dCwgZnV0dXJlKToKKyAgICAgICAgcmV0dXJuIGdlbi53aXRoX3RpbWVvdXQodGltZW91dCwgZnV0dXJlLCBzZWxmLmlvX2xvb3ApCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiBvcGVuKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGxvZ2dlci5kZWJ1Zygnc29ja2V0IGNvbm5lY3RpbmcnKQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICBzZWxmLnN0cmVhbSA9IGlvc3RyZWFtLklPU3RyZWFtKHNvY2spCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubmVjdCA9IHNlbGYuc3RyZWFtLmNvbm5lY3QoKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgc2VsZi53aXRoX3RpbWVvdXQodGltZW91dCwgY29ubmVjdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgY29ubmVjdAorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgSU9FcnJvciwgaW9sb29wLlRpbWVvdXRFcnJvcikgYXMgZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAnY291bGQgbm90IGNvbm5lY3QgdG8ge306e30gKHt9KScuZm9ybWF0KHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBlKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlKQorCisgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oc2VsZikKKworICAgIGRlZiBzZXRfY2xvc2VfY2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIG9wZW4oKSByZXR1cm5zCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0cmVhbS5zZXRfY2xvc2VfY2FsbGJhY2soY2FsbGJhY2spCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgZG9uJ3QgcmFpc2UgaWYgd2UgaW50ZW5kIHRvIGNsb3NlCisgICAgICAgIHNlbGYuc3RyZWFtLnNldF9jbG9zZV9jYWxsYmFjayhOb25lKQorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKKyAgICBkZWYgcmVhZChzZWxmLCBfKToKKyAgICAgICAgIyBUaGUgZ2VuZXJhdGVkIGNvZGUgZm9yIFRvcm5hZG8gc2hvdWxkbid0IGRvIGluZGl2aWR1YWwgcmVhZHMgLS0gb25seQorICAgICAgICAjIGZyYW1lcyBhdCBhIHRpbWUKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAieW91J3JlIGRvaW5nIGl0IHdyb25nIgorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIGlvX2V4Y2VwdGlvbl9jb250ZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgSU9FcnJvcikgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGUpKQorICAgICAgICBleGNlcHQgaW9zdHJlYW0uU3RyZWFtQnVmZmVyRnVsbEVycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGUpKQorCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICAjIElPU3RyZWFtIHByb2Nlc3NlcyByZWFkcyBvbmUgYXQgYSB0aW1lCisgICAgICAgIHdpdGggKHlpZWxkIHNlbGYuX3JlYWRfbG9jay5hY3F1aXJlKCkpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmlvX2V4Y2VwdGlvbl9jb250ZXh0KCk6CisgICAgICAgICAgICAgICAgZnJhbWVfaGVhZGVyID0geWllbGQgc2VsZi5zdHJlYW0ucmVhZF9ieXRlcyg0KQorICAgICAgICAgICAgICAgIGlmIGxlbihmcmFtZV9oZWFkZXIpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGlvc3RyZWFtLlN0cmVhbUNsb3NlZEVycm9yKCdSZWFkIHplcm8gYnl0ZXMgZnJvbSBzdHJlYW0nKQorICAgICAgICAgICAgICAgIGZyYW1lX2xlbmd0aCwgPSBzdHJ1Y3QudW5wYWNrKCchaScsIGZyYW1lX2hlYWRlcikKKyAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIHNlbGYuc3RyZWFtLnJlYWRfYnl0ZXMoZnJhbWVfbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJhaXNlIGdlbi5SZXR1cm4oZnJhbWUpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBmcmFtZSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgZnJhbWVfbGVuZ3RoID0gc3RydWN0LnBhY2soJyFpJywgbGVuKGZyYW1lKSkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgd2l0aCBzZWxmLmlvX2V4Y2VwdGlvbl9jb250ZXh0KCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJlYW0ud3JpdGUoZnJhbWVfbGVuZ3RoICsgZnJhbWUpCisKKworY2xhc3MgVFRvcm5hZG9TZXJ2ZXIodGNwc2VydmVyLlRDUFNlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihUVG9ybmFkb1NlcnZlciwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHNlbGYuX3Byb2Nlc3NvciA9IHByb2Nlc3NvcgorICAgICAgICBzZWxmLl9pcHJvdF9mYWN0b3J5ID0gaXByb3RfZmFjdG9yeQorICAgICAgICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gKG9wcm90X2ZhY3RvcnkgaWYgb3Byb3RfZmFjdG9yeSBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaXByb3RfZmFjdG9yeSkKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIGhhbmRsZV9zdHJlYW0oc2VsZiwgc3RyZWFtLCBhZGRyZXNzKToKKyAgICAgICAgaG9zdCwgcG9ydCA9IGFkZHJlc3NbOjJdCisgICAgICAgIHRyYW5zID0gVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoaG9zdD1ob3N0LCBwb3J0PXBvcnQsIHN0cmVhbT1zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIG9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBub3QgdHJhbnMuc3RyZWFtLmNsb3NlZCgpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCB0cmFucy5yZWFkRnJhbWUoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgdHIgPSBUTWVtb3J5QnVmZmVyKGZyYW1lKQorICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5faXByb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cikKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLl9wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCd0aHJpZnQgZXhjZXB0aW9uIGluIGhhbmRsZV9zdHJlYW0nKQorICAgICAgICAgICAgdHJhbnMuY2xvc2UoKQorCisgICAgICAgIGxvZ2dlci5pbmZvKCdjbGllbnQgZGlzY29ubmVjdGVkICVzOiVkJywgaG9zdCwgcG9ydCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVGhyaWZ0LnB5IGIvbGliL3B5L3NyYy9UaHJpZnQucHkKaW5kZXggOTE3MjhhNy4uMDA5NDFkOCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UaHJpZnQucHkKKysrIGIvbGliL3B5L3NyYy9UaHJpZnQucHkKQEAgLTE5LDExNSArMTksMTc0IEBACiAKIGltcG9ydCBzeXMKIAotY2xhc3MgVFR5cGU6Ci0gIFNUT1AgICA9IDAKLSAgVk9JRCAgID0gMQotICBCT09MICAgPSAyCi0gIEJZVEUgICA9IDMKLSAgSTA4ICAgID0gMwotICBET1VCTEUgPSA0Ci0gIEkxNiAgICA9IDYKLSAgSTMyICAgID0gOAotICBJNjQgICAgPSAxMAotICBTVFJJTkcgPSAxMQotICBVVEY3ICAgPSAxMQotICBTVFJVQ1QgPSAxMgotICBNQVAgICAgPSAxMwotICBTRVQgICAgPSAxNAotICBMSVNUICAgPSAxNQotICBVVEY4ICAgPSAxNgotICBVVEYxNiAgPSAxNwogCi1jbGFzcyBUTWVzc2FnZVR5cGU6Ci0gIENBTEwgID0gMQotICBSRVBMWSA9IDIKLSAgRVhDRVBUSU9OID0gMwotICBPTkVXQVkgPSA0CitjbGFzcyBUVHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAwCisgICAgVk9JRCA9IDEKKyAgICBCT09MID0gMgorICAgIEJZVEUgPSAzCisgICAgSTA4ID0gMworICAgIERPVUJMRSA9IDQKKyAgICBJMTYgPSA2CisgICAgSTMyID0gOAorICAgIEk2NCA9IDEwCisgICAgU1RSSU5HID0gMTEKKyAgICBVVEY3ID0gMTEKKyAgICBTVFJVQ1QgPSAxMgorICAgIE1BUCA9IDEzCisgICAgU0VUID0gMTQKKyAgICBMSVNUID0gMTUKKyAgICBVVEY4ID0gMTYKKyAgICBVVEYxNiA9IDE3CiAKLWNsYXNzIFRQcm9jZXNzb3I6CisgICAgX1ZBTFVFU19UT19OQU1FUyA9ICgKKyAgICAgICAgJ1NUT1AnLAorICAgICAgICAnVk9JRCcsCisgICAgICAgICdCT09MJywKKyAgICAgICAgJ0JZVEUnLAorICAgICAgICAnRE9VQkxFJywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0kxNicsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJMzInLAorICAgICAgICBOb25lLAorICAgICAgICAnSTY0JywKKyAgICAgICAgJ1NUUklORycsCisgICAgICAgICdTVFJVQ1QnLAorICAgICAgICAnTUFQJywKKyAgICAgICAgJ1NFVCcsCisgICAgICAgICdMSVNUJywKKyAgICAgICAgJ1VURjgnLAorICAgICAgICAnVVRGMTYnLAorICAgICkKIAotICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jc2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKIAotICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpOgotICAgIHBhc3MKK2NsYXNzIFRNZXNzYWdlVHlwZShvYmplY3QpOgorICAgIENBTEwgPSAxCisgICAgUkVQTFkgPSAyCisgICAgRVhDRVBUSU9OID0gMworICAgIE9ORVdBWSA9IDQKKworCitjbGFzcyBUUHJvY2Vzc29yKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgcHJvY2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIHBhc3MKKwogCiBjbGFzcyBURXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKKyAgICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCisgICAgaWYgKDIsIDYsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQogCi0gICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIHZbMi42LDMuMCkKLSAgaWYgKDIsNiwwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsMCk6Ci0gICAgZGVmIF9nZXRfbWVzc2FnZShzZWxmKToKLQkgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UKLSAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotCSAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQotICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKKyAgICAgICAgZGVmIF9zZXRfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKIAotICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKLSAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisKIAogY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgIFVOS05PV04gPSAwCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNAorICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCi0gIFVOS05PV04gPSAwCi0gIFVOS05PV05fTUVUSE9EID0gMQotICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIKLSAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCi0gIEJBRF9TRVFVRU5DRV9JRCA9IDQKLSAgTUlTU0lOR19SRVNVTFQgPSA1CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIGlmIHNlbGYubWVzc2FnZToKLSAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2UKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOS05PV05fTUVUSE9EOgotICAgICAgcmV0dXJuICdVbmtub3duIG1ldGhvZCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLldST05HX01FVEhPRF9OQU1FOgotICAgICAgcmV0dXJuICdXcm9uZyBtZXRob2QgbmFtZScKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLkJBRF9TRVFVRU5DRV9JRDoKLSAgICAgIHJldHVybiAnQmFkIHNlcXVlbmNlIElEJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuTUlTU0lOR19SRVNVTFQ6Ci0gICAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JwotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKLQotICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6Ci0gICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgIGJyZWFrCi0gICAgICBpZiBmaWQgPT0gMToKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgICAgIHNlbGYubWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tZXNzYWdlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOS05PV05fTUVUSE9EOgorICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIG1ldGhvZCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUU6CisgICAgICAgICAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLkJBRF9TRVFVRU5DRV9JRDoKKyAgICAgICAgICAgIHJldHVybiAnQmFkIHNlcXVlbmNlIElEJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUOgorICAgICAgICAgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAnSW50ZXJuYWwgZXJyb3InCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuUFJPVE9DT0xfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gJ1Byb3RvY29sIGVycm9yJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1BST1RPQ09MOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBjbGllbnQgdHlwZScKICAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxpZiBmaWQgPT0gMjoKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCi0gICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisgICAgICAgICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKIAotICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgotICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCi0gICAgaWYgc2VsZi5tZXNzYWdlICE9IE5vbmU6Ci0gICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCi0gICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2UpCi0gICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKLSAgICBpZiBzZWxmLnR5cGUgIT0gTm9uZToKLSAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlLkkzMiwgMikKLSAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYudHlwZSkKLSAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQotICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKLSAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisgICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKQorICAgICAgICBpZiBzZWxmLm1lc3NhZ2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2UpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgaWYgc2VsZi50eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisKK2NsYXNzIFRGcm96ZW5EaWN0KGRpY3QpOgorICAgICIiIkEgZGljdGlvbmFyeSB0aGF0IGlzICJmcm96ZW4iIGxpa2UgYSBmcm96ZW5zZXQiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihURnJvemVuRGljdCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAjIFNvcnQgdGhlIGl0ZW1zIHNvIHRoZXkgd2lsbCBiZSBpbiBhIGNvbnNpc3RlbnQgb3JkZXIuCisgICAgICAgICMgWE9SIGluIHRoZSBoYXNoIG9mIHRoZSBjbGFzcyBzbyB3ZSBkb24ndCBjb2xsaWRlIHdpdGgKKyAgICAgICAgIyB0aGUgaGFzaCBvZiBhIGxpc3Qgb2YgdHVwbGVzLgorICAgICAgICBzZWxmLl9faGFzaHZhbCA9IGhhc2goVEZyb3plbkRpY3QpIF4gaGFzaCh0dXBsZShzb3J0ZWQoc2VsZi5pdGVtcygpKSkpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIFRGcmVlemFibGVEaWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNodmFsCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2NvbXBhdC5weSBiL2xpYi9weS9zcmMvY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODI3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2NvbXBhdC5weQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgQnVmZmVySU8KKworICAgIGRlZiBiaW5hcnlfdG9fc3RyKGJpbl92YWwpOgorICAgICAgICByZXR1cm4gYmluX3ZhbAorCisgICAgZGVmIHN0cl90b19iaW5hcnkoc3RyX3ZhbCk6CisgICAgICAgIHJldHVybiBzdHJfdmFsCisKKyAgICBkZWYgYnl0ZV9pbmRleChieXRlc192YWwsIGkpOgorICAgICAgICByZXR1cm4gb3JkKGJ5dGVzX3ZhbFtpXSkKKworZWxzZToKKworICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8gYXMgQnVmZmVySU8gICMgbm9xYQorCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsLmRlY29kZSgndXRmOCcpCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzKHN0cl92YWwsICd1dGY4JykKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBieXRlc192YWxbaV0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDhkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC9iaW5hcnkuaCIKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitib29sIEJpbmFyeVByb3RvY29sOjpyZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKSB7CisgIHVpbnQ4X3QgYiA9IDA7CisgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihiKTsKKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIHJlYWRJMTYodGFnKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwYjBkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0JJTkFSWV9ICisjZGVmaW5lIFRIUklGVF9QWV9CSU5BUllfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisjaW5jbHVkZSAiZXh0L2VuZGlhbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY2xhc3MgQmluYXJ5UHJvdG9jb2wgOiBwdWJsaWMgUHJvdG9jb2xCYXNlPEJpbmFyeVByb3RvY29sPiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkJpbmFyeVByb3RvY29sKCkge30KKworICB2b2lkIHdyaXRlSTgoaW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgc2l6ZW9mKGludDhfdCkpOyB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQxNl90IHZhbCkgeworICAgIGludDE2X3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaHRvbnModmFsKSk7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm5ldCksIHNpemVvZihpbnQxNl90KSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludDMyX3QgdmFsKSB7CisgICAgaW50MzJfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihodG9ubCh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50NjRfdCB2YWwpIHsKKyAgICBpbnQ2NF90IG5ldCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGh0b25sbCh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQorICAgIHVuaW9uIHsKKyAgICAgIGRvdWJsZSBmOworICAgICAgaW50NjRfdCB0OworICAgIH0gdHJhbnNmZXI7CisgICAgdHJhbnNmZXIuZiA9IGR1YjsKKyAgICB3cml0ZUk2NCh0cmFuc2Zlci50KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGludCB2KSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90Pih2KSk7IH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFB5T2JqZWN0KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHdyaXRlQnVmZmVyKFB5Qnl0ZXNfQVNfU1RSSU5HKHZhbHVlKSwgbGVuKTsKKyAgfQorCisgIGJvb2wgd3JpdGVMaXN0QmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTZXRMaXN0VHlwZUFyZ3MmIHBhcnNlZGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKTsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZU1hcEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgTWFwVHlwZUFyZ3MmIHBhcnNlZGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3Mua3RhZyk7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3MudnRhZyk7CisgICAgd3JpdGVJMzIobGVuKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVTdHJ1Y3RCZWdpbigpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB3cml0ZVN0cnVjdEVuZCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB3cml0ZUZpZWxkKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU3RydWN0SXRlbVNwZWMmIHBhcnNlZHNwZWMpIHsKKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFyc2Vkc3BlYy50eXBlKSk7CisgICAgd3JpdGVJMTYocGFyc2Vkc3BlYy50YWcpOworICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZSwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihUX1NUT1ApKTsgfQorCisgIGJvb2wgcmVhZEJvb2woYm9vbCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXSA9PSAxOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTgoaW50OF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTE2KGludDE2X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQxNl90KSk7CisgICAgdmFsID0gbnRvaHModmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkzMihpbnQzMl90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50MzJfdCkpOworICAgIHZhbCA9IG50b2hsKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJNjQoaW50NjRfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB2YWwgPSBudG9obGwodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZERvdWJsZShkb3VibGUmIHZhbCkgeworICAgIHVuaW9uIHsKKyAgICAgIGludDY0X3QgZjsKKyAgICAgIGRvdWJsZSB0OworICAgIH0gdHJhbnNmZXI7CisKKyAgICBpZiAoIXJlYWRJNjQodHJhbnNmZXIuZikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gdHJhbnNmZXIudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludDMyX3QgcmVhZFN0cmluZyhjaGFyKiogYnVmKSB7CisgICAgaW50MzJfdCBsZW4gPSAwOworICAgIGlmICghcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgc3RyaW5nTGltaXQoKSkgfHwgIXJlYWRCeXRlcyhidWYsIGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZXR5cGUpIHsKKyAgICBpbnQzMl90IGxlbjsKKyAgICB1aW50OF90IGIgPSAwOworICAgIGlmICghcmVhZEJ5dGUoYikgfHwgIXJlYWRJMzIobGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGIpOworICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga3R5cGUsIFRUeXBlJiB2dHlwZSkgeworICAgIGludDMyX3QgbGVuOworICAgIHVpbnQ4X3QgaywgdjsKKyAgICBpZiAoIXJlYWRCeXRlKGspIHx8ICFyZWFkQnl0ZSh2KSB8fCAhcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAga3R5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oayk7CisgICAgdnR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4odik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGJvb2wgcmVhZFN0cnVjdEJlZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHJlYWRTdHJ1Y3RFbmQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCByZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKTsKKworI2RlZmluZSBTS0lQQllURVMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVhZEJ5dGVzKCZkdW1teV9idWZfLCAobikpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIGJvb2wgc2tpcEJvb2woKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBCeXRlKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwSTE2KCkgeyBTS0lQQllURVMoMik7IH0KKyAgYm9vbCBza2lwSTMyKCkgeyBTS0lQQllURVMoNCk7IH0KKyAgYm9vbCBza2lwSTY0KCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwRG91YmxlKCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwU3RyaW5nKCkgeworICAgIGludDMyX3QgbGVuOworICAgIGlmICghcmVhZEkzMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNLSVBCWVRFUyhsZW4pOworICB9CisjdW5kZWYgU0tJUEJZVEVTCisKK3ByaXZhdGU6CisgIGNoYXIqIGR1bW15X2J1Zl87Cit9OworfQorfQorfQorI2VuZGlmIC8vIFRIUklGVF9QWV9CSU5BUllfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5OWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC9jb21wYWN0LmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjb25zdCB1aW50OF90IENvbXBhY3RQcm90b2NvbDo6VFR5cGVUb0NUeXBlW10gPSB7CisgICAgQ1RfU1RPUCwgICAgICAgICAvLyBUX1NUT1AKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0JPT0xFQU5fVFJVRSwgLy8gVF9CT09MCisgICAgQ1RfQllURSwgICAgICAgICAvLyBUX0JZVEUKKyAgICBDVF9ET1VCTEUsICAgICAgIC8vIFRfRE9VQkxFCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JMTYsICAgICAgICAgIC8vIFRfSTE2CisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JMzIsICAgICAgICAgIC8vIFRfSTMyCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JNjQsICAgICAgICAgIC8vIFRfSTY0CisgICAgQ1RfQklOQVJZLCAgICAgICAvLyBUX1NUUklORworICAgIENUX1NUUlVDVCwgICAgICAgLy8gVF9TVFJVQ1QKKyAgICBDVF9NQVAsICAgICAgICAgIC8vIFRfTUFQCisgICAgQ1RfU0VULCAgICAgICAgICAvLyBUX1NFVAorICAgIENUX0xJU1QsICAgICAgICAgLy8gVF9MSVNUCit9OworCitib29sIENvbXBhY3RQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZykgeworICB1aW50OF90IGI7CisgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdWludDhfdCBjdHlwZSA9IGIgJiAweGY7CisgIHR5cGUgPSBnZXRUVHlwZShjdHlwZSk7CisgIGlmICh0eXBlID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgdGFnID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB1aW50OF90IGRpZmYgPSAoYiAmIDB4ZjApID4+IDQ7CisgIGlmIChkaWZmKSB7CisgICAgdGFnID0gcmVhZFRhZ3NfLnRvcCgpICsgZGlmZjsKKyAgfSBlbHNlIGlmICghcmVhZEkxNih0YWcpKSB7CisgICAgcmVhZFRhZ3NfLnRvcCgpID0gLTE7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFIHx8IGN0eXBlID09IENUX0JPT0xFQU5fVFJVRSkgeworICAgIHJlYWRCb29sXy5leGlzdHMgPSB0cnVlOworICAgIHJlYWRCb29sXy52YWx1ZSA9IGN0eXBlID09IENUX0JPT0xFQU5fVFJVRTsKKyAgfQorICByZWFkVGFnc18udG9wKCkgPSB0YWc7CisgIHJldHVybiB0cnVlOworfQorCitUVHlwZSBDb21wYWN0UHJvdG9jb2w6OmdldFRUeXBlKHVpbnQ4X3QgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX1NUT1A6CisgICAgcmV0dXJuIFRfU1RPUDsKKyAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgorICBjYXNlIENUX0JPT0xFQU5fVFJVRToKKyAgICByZXR1cm4gVF9CT09MOworICBjYXNlIENUX0JZVEU6CisgICAgcmV0dXJuIFRfQllURTsKKyAgY2FzZSBDVF9JMTY6CisgICAgcmV0dXJuIFRfSTE2OworICBjYXNlIENUX0kzMjoKKyAgICByZXR1cm4gVF9JMzI7CisgIGNhc2UgQ1RfSTY0OgorICAgIHJldHVybiBUX0k2NDsKKyAgY2FzZSBDVF9ET1VCTEU6CisgICAgcmV0dXJuIFRfRE9VQkxFOworICBjYXNlIENUX0JJTkFSWToKKyAgICByZXR1cm4gVF9TVFJJTkc7CisgIGNhc2UgQ1RfTElTVDoKKyAgICByZXR1cm4gVF9MSVNUOworICBjYXNlIENUX1NFVDoKKyAgICByZXR1cm4gVF9TRVQ7CisgIGNhc2UgQ1RfTUFQOgorICAgIHJldHVybiBUX01BUDsKKyAgY2FzZSBDVF9TVFJVQ1Q6CisgICAgcmV0dXJuIFRfU1RSVUNUOworICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJkb24ndCBrbm93IHdoYXQgdHlwZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFR5cGU+KC0xKTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGQ3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfQ09NUEFDVF9ICisjZGVmaW5lIFRIUklGVF9QWV9DT01QQUNUX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgImV4dC9wcm90b2NvbC5oIgorI2luY2x1ZGUgImV4dC9lbmRpYW4uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NsYXNzIENvbXBhY3RQcm90b2NvbCA6IHB1YmxpYyBQcm90b2NvbEJhc2U8Q29tcGFjdFByb3RvY29sPiB7CitwdWJsaWM6CisgIENvbXBhY3RQcm90b2NvbCgpIHsgcmVhZEJvb2xfLmV4aXN0cyA9IGZhbHNlOyB9CisKKyAgdmlydHVhbCB+Q29tcGFjdFByb3RvY29sKCkge30KKworICB2b2lkIHdyaXRlSTgoaW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICB2b2lkIHdyaXRlSTE2KGludDE2X3QgdmFsKSB7IHdyaXRlVmFyaW50KHRvWmlnWmFnKHZhbCkpOyB9CisKKyAgaW50IHdyaXRlSTMyKGludDMyX3QgdmFsKSB7IHJldHVybiB3cml0ZVZhcmludCh0b1ppZ1phZyh2YWwpKTsgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50NjRfdCB2YWwpIHsgd3JpdGVWYXJpbnQ2NCh0b1ppZ1phZzY0KHZhbCkpOyB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgdW5pb24geworICAgICAgZG91YmxlIGY7CisgICAgICBpbnQ2NF90IHQ7CisgICAgfSB0cmFuc2ZlcjsKKyAgICB0cmFuc2Zlci5mID0gaHRvbGVsbChkdWIpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ0cmFuc2Zlci50KSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGludCB2KSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90Pih2ID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSkpOyB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhQeU9iamVjdCogdmFsdWUsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB3cml0ZUJ1ZmZlcihQeUJ5dGVzX0FTX1NUUklORyh2YWx1ZSksIGxlbik7CisgIH0KKworICBib29sIHdyaXRlTGlzdEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU2V0TGlzdFR5cGVBcmdzJiBhcmdzLCBpbnQzMl90IGxlbikgeworICAgIGludCBjdHlwZSA9IHRvQ29tcGFjdFR5cGUoYXJncy5lbGVtZW50X3R5cGUpOworICAgIGlmIChsZW4gPD0gMTQpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihsZW4gPDwgNCB8IGN0eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSgweGYwIHwgY3R5cGUpOworICAgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlTWFwQmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBNYXBUeXBlQXJncyYgYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHdyaXRlQnl0ZSgwKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgY3R5cGUgPSB0b0NvbXBhY3RUeXBlKGFyZ3Mua3RhZykgPDwgNCB8IHRvQ29tcGFjdFR5cGUoYXJncy52dGFnKTsKKyAgICB3cml0ZVZhcmludChsZW4pOworICAgIHdyaXRlQnl0ZShjdHlwZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlU3RydWN0QmVnaW4oKSB7CisgICAgd3JpdGVUYWdzXy5wdXNoKDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgd3JpdGVUYWdzXy5wb3AoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVGaWVsZChQeU9iamVjdCogdmFsdWUsIGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBzcGVjKSB7CisgICAgaWYgKHNwZWMudHlwZSA9PSBUX0JPT0wpIHsKKyAgICAgIGRvV3JpdGVGaWVsZEJlZ2luKHNwZWMsIFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBkb1dyaXRlRmllbGRCZWdpbihzcGVjLCB0b0NvbXBhY3RUeXBlKHNwZWMudHlwZSkpOworICAgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlLCBzcGVjLnR5cGUsIHNwZWMudHlwZWFyZ3MpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7IHdyaXRlQnl0ZSgwKTsgfQorCisgIGJvb2wgcmVhZEJvb2woYm9vbCYgdmFsKSB7CisgICAgaWYgKHJlYWRCb29sXy5leGlzdHMpIHsKKyAgICAgIHJlYWRCb29sXy5leGlzdHMgPSBmYWxzZTsKKyAgICAgIHZhbCA9IHJlYWRCb29sXy52YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdID09IENUX0JPT0xFQU5fVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRJOChpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMTYoaW50MTZfdCYgdmFsKSB7CisgICAgdWludDE2X3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50MTZfdCwgMz4odXZhbCkpIHsKKyAgICAgIHZhbCA9IGZyb21aaWdaYWc8aW50MTZfdCwgdWludDE2X3Q+KHV2YWwpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgcmVhZEkzMihpbnQzMl90JiB2YWwpIHsKKyAgICB1aW50MzJfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQzMl90LCA1Pih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQzMl90LCB1aW50MzJfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkSTY0KGludDY0X3QmIHZhbCkgeworICAgIHVpbnQ2NF90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDY0X3QsIDEwPih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQ2NF90LCB1aW50NjRfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkRG91YmxlKGRvdWJsZSYgdmFsKSB7CisgICAgdW5pb24geworICAgICAgaW50NjRfdCBmOworICAgICAgZG91YmxlIHQ7CisgICAgfSB0cmFuc2ZlcjsKKworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCA4KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnRyYW5zZmVyLmYsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB0cmFuc2Zlci5mID0gbGV0b2hsbCh0cmFuc2Zlci5mKTsKKyAgICB2YWwgPSB0cmFuc2Zlci50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZWFkU3RyaW5nKGNoYXIqKiBidWYpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgc3RyaW5nTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFyZWFkQnl0ZXMoYnVmLCBsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGV0eXBlKSB7CisgICAgdWludDhfdCBiOworICAgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXR5cGUgPSBnZXRUVHlwZShiICYgMHhmKTsKKyAgICBpZiAoZXR5cGUgPT0gLTEpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdWludDMyX3QgbGVuID0gKGIgPj4gNCkgJiAweGY7CisgICAgaWYgKGxlbiA9PSAxNSAmJiAhcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGt0eXBlLCBUVHlwZSYgdnR5cGUpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICB1aW50OF90IGt2VHlwZTsKKyAgICAgIGlmICghcmVhZEJ5dGUoa3ZUeXBlKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBrdHlwZSA9IGdldFRUeXBlKGt2VHlwZSA+PiA0KTsKKyAgICAgIHZ0eXBlID0gZ2V0VFR5cGUoa3ZUeXBlICYgMHhmKTsKKyAgICAgIGlmIChrdHlwZSA9PSAtMSB8fCB2dHlwZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBib29sIHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZWFkVGFnc18ucHVzaCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgcmVhZFRhZ3NfLnBvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZyk7CisKKyAgYm9vbCBza2lwQm9vbCgpIHsKKyAgICBib29sIHZhbDsKKyAgICByZXR1cm4gcmVhZEJvb2wodmFsKTsKKyAgfQorI2RlZmluZSBTS0lQQllURVMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVhZEJ5dGVzKCZkdW1teV9idWZfLCAobikpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorICBib29sIHNraXBCeXRlKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwRG91YmxlKCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwSTE2KCkgeworICAgIGludDE2X3QgdmFsOworICAgIHJldHVybiByZWFkSTE2KHZhbCk7CisgIH0KKyAgYm9vbCBza2lwSTMyKCkgeworICAgIGludDMyX3QgdmFsOworICAgIHJldHVybiByZWFkSTMyKHZhbCk7CisgIH0KKyAgYm9vbCBza2lwSTY0KCkgeworICAgIGludDY0X3QgdmFsOworICAgIHJldHVybiByZWFkSTY0KHZhbCk7CisgIH0KKyAgYm9vbCBza2lwU3RyaW5nKCkgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU0tJUEJZVEVTKGxlbik7CisgIH0KKyN1bmRlZiBTS0lQQllURVMKKworcHJpdmF0ZToKKyAgZW51bSBUeXBlcyB7CisgICAgQ1RfU1RPUCA9IDB4MDAsCisgICAgQ1RfQk9PTEVBTl9UUlVFID0gMHgwMSwKKyAgICBDVF9CT09MRUFOX0ZBTFNFID0gMHgwMiwKKyAgICBDVF9CWVRFID0gMHgwMywKKyAgICBDVF9JMTYgPSAweDA0LAorICAgIENUX0kzMiA9IDB4MDUsCisgICAgQ1RfSTY0ID0gMHgwNiwKKyAgICBDVF9ET1VCTEUgPSAweDA3LAorICAgIENUX0JJTkFSWSA9IDB4MDgsCisgICAgQ1RfTElTVCA9IDB4MDksCisgICAgQ1RfU0VUID0gMHgwQSwKKyAgICBDVF9NQVAgPSAweDBCLAorICAgIENUX1NUUlVDVCA9IDB4MEMKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdWludDhfdCBUVHlwZVRvQ1R5cGVbXTsKKworICBUVHlwZSBnZXRUVHlwZSh1aW50OF90IHR5cGUpOworCisgIGludCB0b0NvbXBhY3RUeXBlKFRUeXBlIHR5cGUpIHsKKyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4odHlwZSk7CisgICAgcmV0dXJuIGkgPCAxNiA/IFRUeXBlVG9DVHlwZVtpXSA6IC0xOworICB9CisKKyAgdWludDMyX3QgdG9aaWdaYWcoaW50MzJfdCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gMzEpIF4gKHZhbCA8PCAxKTsgfQorCisgIHVpbnQ2NF90IHRvWmlnWmFnNjQoaW50NjRfdCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gNjMpIF4gKHZhbCA8PCAxKTsgfQorCisgIGludCB3cml0ZVZhcmludCh1aW50MzJfdCB2YWwpIHsKKyAgICBpbnQgY250ID0gMTsKKyAgICB3aGlsZSAodmFsICYgfjB4N2ZVKSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4oKHZhbCAmIDB4N2ZVKSB8IDB4ODBVKSk7CisgICAgICB2YWwgPj49IDc7CisgICAgICArK2NudDsKKyAgICB9CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KHZhbCkpOworICAgIHJldHVybiBjbnQ7CisgIH0KKworICBpbnQgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCB2YWwpIHsKKyAgICBpbnQgY250ID0gMTsKKyAgICB3aGlsZSAodmFsICYgfjB4N2ZVTEwpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPigodmFsICYgMHg3ZlVMTCkgfCAweDgwVUxMKSk7CisgICAgICB2YWwgPj49IDc7CisgICAgICArK2NudDsKKyAgICB9CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KHZhbCkpOworICAgIHJldHVybiBjbnQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE1heD4KKyAgYm9vbCByZWFkVmFyaW50KFQmIHJlc3VsdCkgeworICAgIHVpbnQ4X3QgYjsKKyAgICBUIHZhbCA9IDA7CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1heDsgKytpKSB7CisgICAgICBpZiAoIXJlYWRCeXRlKGIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChiICYgMHg4MCkgeworICAgICAgICB2YWwgfD0gc3RhdGljX2Nhc3Q8VD4oYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsIHw9IHN0YXRpY19jYXN0PFQ+KGIpIDw8IHNoaWZ0OworICAgICAgICByZXN1bHQgPSB2YWw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJ2YXJpbnQgZXhjZWVkZWQgJWQgYnl0ZXMiLCBNYXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTLCB0eXBlbmFtZSBVPgorICBTIGZyb21aaWdaYWcoVSB2YWwpIHsKKyAgICByZXR1cm4gKHZhbCA+PiAxKSBeIHN0YXRpY19jYXN0PFU+KC1zdGF0aWNfY2FzdDxTPih2YWwgJiAxKSk7CisgIH0KKworICB2b2lkIGRvV3JpdGVGaWVsZEJlZ2luKGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBzcGVjLCBpbnQgY3R5cGUpIHsKKyAgICBpbnQgZGlmZiA9IHNwZWMudGFnIC0gd3JpdGVUYWdzXy50b3AoKTsKKyAgICBpZiAoZGlmZiA+IDAgJiYgZGlmZiA8PSAxNSkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRpZmYgPDwgNCB8IGN0eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihjdHlwZSkpOworICAgICAgd3JpdGVJMTYoc3BlYy50YWcpOworICAgIH0KKyAgICB3cml0ZVRhZ3NfLnRvcCgpID0gc3BlYy50YWc7CisgIH0KKworICBzdGQ6OnN0YWNrPGludD4gd3JpdGVUYWdzXzsKKyAgc3RkOjpzdGFjazxpbnQ+IHJlYWRUYWdzXzsKKyAgc3RydWN0IHsKKyAgICBib29sIGV4aXN0czsKKyAgICBib29sIHZhbHVlOworICB9IHJlYWRCb29sXzsKKyAgY2hhciogZHVtbXlfYnVmXzsKK307Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX0NPTVBBQ1RfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvZW5kaWFuLmggYi9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM3MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvZW5kaWFuLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9FTkRJQU5fSAorI2RlZmluZSBUSFJJRlRfUFlfRU5ESUFOX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNwcmFnbWEgY29tbWVudChsaWIsICJ3czJfMzIubGliIikKKyNkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKKyNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKKyNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZGVmaW5lIGlubGluZSBfX2lubGluZQorI2VuZGlmCisKKy8qIEZpeCBlbmRpYW5uZXNzIGlzc3VlcyBvbiBTb2xhcmlzICovCisjaWYgZGVmaW5lZChfX1NWUjQpICYmIGRlZmluZWQoX19zdW4pCisjaWYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBfX2kzODZfXworI2VuZGlmCisKKyNpZm5kZWYgQklHX0VORElBTgorI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQorI2VuZGlmCisjaWZuZGVmIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKKyNlbmRpZgorCisvKiBJMzg2IGlzIExFLCBldmVuIG9uIFNvbGFyaXMgKi8KKyNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19CWVRFX09SREVSCisjaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKKyNkZWZpbmUgX19CWVRFX09SREVSIEJZVEVfT1JERVIKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KKyNlbHNlCisjZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKKyNlbmRpZgorI2VuZGlmCisKKy8vIFNhbWUgY29tbWVudCBhcyB0aGUgZW51bS4gIFNvcnJ5LgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgbnRvaGxsKG4pIChuKQorI2RlZmluZSBodG9ubGwobikgKG4pCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgbGV0b2hsbChuKSBic3dhcF82NChuKQorI2RlZmluZSBodG9sZWxsKG4pIGJzd2FwXzY0KG4pCisjZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSkKKyNkZWZpbmUgaHRvbGVsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZgorI2VsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZGVmaW5lIG50b2hsbChuKSBic3dhcF82NChuKQorI2RlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBudG9obGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZyludG9obChuKSkgPDwgMzIpICsgbnRvaGwobiA+PiAzMikpCisjZGVmaW5lIGh0b25sbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAobikKKyNkZWZpbmUgaHRvbGVsbChuKSAobikKKyNlbHNlIC8qIF9fQllURV9PUkRFUiAqLworI2Vycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCisjZW5kaWYKKworI2VuZGlmIC8vIFRIUklGVF9QWV9FTkRJQU5fSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcCBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1OGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiYmluYXJ5LmgiCisjaW5jbHVkZSAiY29tcGFjdC5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gVE9ETyhkcmVpc3MpOiBkZWZ2YWwgYXBwZWFycyB0byBiZSB1bnVzZWQuICBMb29rIGludG8gcmVtb3ZpbmcgaXQuCisvLyBUT0RPKGRyZWlzcyk6IE1ha2UgcGFyc2Vfc3BlY19hcmdzIHJlY3Vyc2l2ZSwgYW5kIGNhY2hlIHRoZSBvdXRwdXQKKy8vICAgICAgICAgICAgICAgcGVybWFuZW50bHkgaW4gdGhlIG9iamVjdC4gIChNYWxsb2MgYW5kIG9ycGhhbi4pCisvLyBUT0RPKGRyZWlzcyk6IFdoeSBkbyB3ZSBuZWVkIGNTdHJpbmdJTyBmb3IgcmVhZGluZywgd2h5IG5vdCBqdXN0IGNoYXIqPworLy8gICAgICAgICAgICAgICBDYW4gY1N0cmluZ0lPIGxldCB1cyB3b3JrIHdpdGggYSBCdWZmZXJlZFRyYW5zcG9ydD8KKy8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgaWdub3JlIHRoZSBydiBmcm9tIGN3cml0ZSAobWF5YmUpLgorCisvLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KKworLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCitQeU9iamVjdCogSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CitQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHRyYW5zKTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfaW1wbChQeU9iamVjdCogYXJncykgeworICBpZiAoIWFyZ3MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgUHlPYmplY3QqIGVuY19vYmogPSBOVUxMOworICBQeU9iamVjdCogdHlwZV9hcmdzID0gTlVMTDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZlbmNfb2JqLCAmdHlwZV9hcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghZW5jX29iaiB8fCAhdHlwZV9hcmdzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBUIHByb3RvY29sOworICBpZiAoIXByb3RvY29sLnByZXBhcmVFbmNvZGVCdWZmZXIoKSB8fCAhcHJvdG9jb2wuZW5jb2RlVmFsdWUoZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBwcm90b2NvbC5nZXRFbmNvZGVkVmFsdWUoKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3QqIHZhbHVlLCBsb25nIGRlZmF1bHRfdmFsdWUpIHsKKyAgU2NvcGVkUHlPYmplY3Qgc2NvcGUodmFsdWUpOworICBsb25nIHYgPSBQeUludF9Bc0xvbmcodmFsdWUpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiB2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2ltcGwoUHlPYmplY3QqIGFyZ3MpIHsKKyAgUHlPYmplY3QqIG91dHB1dF9vYmogPSBOVUxMOworICBQeU9iamVjdCogb3Byb3QgPSBOVUxMOworICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZvdXRwdXRfb2JqLCAmb3Byb3QsICZ0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFQgcHJvdG9jb2w7CisgIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCk7CisgIHByb3RvY29sLnNldFN0cmluZ0xlbmd0aExpbWl0KAorICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOworICBwcm90b2NvbC5zZXRDb250YWluZXJMZW5ndGhMaW1pdCgKKyAgICAgIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfbGltaXQpKTsKKyAgU2NvcGVkUHlPYmplY3QgdHJhbnNwb3J0KFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcodHJhbnMpKSk7CisgIGlmICghdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOworICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghcHJvdG9jb2wucHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQodHJhbnNwb3J0LmdldCgpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHByb3RvY29sLnJlYWRTdHJ1Y3Qob3V0cHV0X29iaiwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKK30KK30KK30KK30KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpweTsKKworLyogLS0gUFlUSE9OIE1PRFVMRSBTRVRVUCBTVFVGRiAtLS0gKi8KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBlbmNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2NvbXBhY3QoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZW5jb2RlX2ltcGw8Q29tcGFjdFByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfY29tcGFjdChQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxDb21wYWN0UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHNbXSA9IHsKKyAgICB7ImVuY29kZV9iaW5hcnkiLCBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImRlY29kZV9iaW5hcnkiLCBkZWNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImVuY29kZV9jb21wYWN0IiwgZW5jb2RlX2NvbXBhY3QsIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZGVjb2RlX2NvbXBhY3QiLCBkZWNvZGVfY29tcGFjdCwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAge05VTEwsIE5VTEwsIDAsIE5VTEx9IC8qIFNlbnRpbmVsICovCit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgVGhyaWZ0RmFzdEJpbmFyeURlZiA9IHtQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH07CisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybiBOVUxMOworCitQeU9iamVjdCogUHlJbml0X2Zhc3RiaW5hcnkoKSB7CisKKyNlbHNlCisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybjsKKwordm9pZCBpbml0ZmFzdGJpbmFyeSgpIHsKKworICBQeWNTdHJpbmdfSU1QT1JUOworICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkKKyAgICBJTklURVJST1IKKworI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9JTlRFUk5fU1RSSU5HKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUlOVEVSTl9TVFJJTkcodmFsdWUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIElOSVRFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBJTklUX0lOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CisgIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCk7CisgIElOSVRfSU5URVJOX1NUUklORyh0cmFucyk7CisjdW5kZWYgSU5JVF9JTlRFUk5fU1RSSU5HCisKKyAgUHlPYmplY3QqIG1vZHVsZSA9CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICAgICBQeU1vZHVsZV9DcmVhdGUoJlRocmlmdEZhc3RCaW5hcnlEZWYpOworI2Vsc2UKKyAgICAgIFB5X0luaXRNb2R1bGUoInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMpOworI2VuZGlmCisgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICBJTklURVJST1I7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgcmV0dXJuIG1vZHVsZTsKKyNlbmRpZgorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaCBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYjdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9QUk9UT0NPTF9ICisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2NsYXNzIFByb3RvY29sQmFzZSB7CisKK3B1YmxpYzoKKyAgUHJvdG9jb2xCYXNlKCkKKyAgICA6IHN0cmluZ0xpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIGNvbnRhaW5lckxpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIG91dHB1dF8oTlVMTCkge30KKyAgaW5saW5lIHZpcnR1YWwgflByb3RvY29sQmFzZSgpOworCisgIGJvb2wgcHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQoUHlPYmplY3QqIHRyYW5zKTsKKworICBQeU9iamVjdCogcmVhZFN0cnVjdChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCoga2xhc3MsIFB5T2JqZWN0KiBzcGVjX3NlcSk7CisKKyAgYm9vbCBwcmVwYXJlRW5jb2RlQnVmZmVyKCk7CisKKyAgYm9vbCBlbmNvZGVWYWx1ZShQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKKyAgUHlPYmplY3QqIGdldEVuY29kZWRWYWx1ZSgpOworCisgIGxvbmcgc3RyaW5nTGltaXQoKSBjb25zdCB7IHJldHVybiBzdHJpbmdMaW1pdF87IH0KKyAgdm9pZCBzZXRTdHJpbmdMZW5ndGhMaW1pdChsb25nIGxpbWl0KSB7IHN0cmluZ0xpbWl0XyA9IGxpbWl0OyB9CisKKyAgbG9uZyBjb250YWluZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRhaW5lckxpbWl0XzsgfQorICB2b2lkIHNldENvbnRhaW5lckxlbmd0aExpbWl0KGxvbmcgbGltaXQpIHsgY29udGFpbmVyTGltaXRfID0gbGltaXQ7IH0KKworcHJvdGVjdGVkOgorICBib29sIHJlYWRCeXRlcyhjaGFyKiogb3V0cHV0LCBpbnQgbGVuKTsKKworICBib29sIHJlYWRCeXRlKHVpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihidWZbMF0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3QgbGVuKTsKKworICB2b2lkIHdyaXRlQnl0ZSh1aW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICBQeU9iamVjdCogZGVjb2RlVmFsdWUoVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworICBib29sIHNraXAoVFR5cGUgdHlwZSk7CisKKyAgaW5saW5lIGJvb2wgY2hlY2tUeXBlKFRUeXBlIGdvdCwgVFR5cGUgZXhwZWN0ZWQpOworICBpbmxpbmUgYm9vbCBjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KTsKKworICBpbmxpbmUgYm9vbCBpc1V0ZjgoUHlPYmplY3QqIHR5cGVhcmdzKTsKKworcHJpdmF0ZToKKyAgSW1wbCogaW1wbCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEltcGwqPih0aGlzKTsgfQorCisgIGxvbmcgc3RyaW5nTGltaXRfOworICBsb25nIGNvbnRhaW5lckxpbWl0XzsKKyAgRW5jb2RlQnVmZmVyKiBvdXRwdXRfOworICBEZWNvZGVCdWZmZXIgaW5wdXRfOworfTsKK30KK30KK30KKworI2luY2x1ZGUgImV4dC9wcm90b2NvbC50Y2MiCisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfUFJPVE9DT0xfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWRmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKQEAgLTAsMCArMSw5MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfUFJPVE9DT0xfVENDCisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9UQ0MKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjZGVmaW5lIENIRUNLX1JBTkdFKHYsIG1pbiwgbWF4KSAoKCh2KSA8PSAobWF4KSkgJiYgKCh2KSA+PSAobWluKSkpCisjZGVmaW5lIElOSVRfT1VUQlVGX1NJWkUgMTI4CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworI2luY2x1ZGUgPGNTdHJpbmdJTy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIHJldHVybiBQeWNTdHJpbmdJT19JbnB1dENoZWNrKGlucHV0KTsKK30KKworaW5saW5lIEVuY29kZUJ1ZmZlciogbmV3X2VuY29kZV9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+TmV3T3V0cHV0KHNpemUpOworfQorCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gUHljU3RyaW5nSU8tPmNyZWFkKGJ1Ziwgb3V0cHV0LCBsZW4pOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgUHlfQ0xFQVIob3V0cHV0Xyk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0NoZWNrKHR5cGVhcmdzKSAmJiAhc3RybmNtcChQeVN0cmluZ19BU19TVFJJTkcodHlwZWFyZ3MpLCAiVVRGOCIsIDQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmdldEVuY29kZWRWYWx1ZSgpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKG91dHB1dF8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgbGVuID0gUHljU3RyaW5nSU8tPmN3cml0ZShvdXRwdXRfLCBkYXRhLCBzaXplKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImZhaWxlZCB0byB3cml0ZSB0byBjU3RyaW5nSU8gb2JqZWN0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikgIT0gc2l6ZSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19FT0ZFcnJvciwgIndyaXRlIGxlbmd0aCBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1IGdvdCAlZCIsIHNpemUsIGxlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZWxzZQorCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIC8vIFRPRE86IENoZWNrIGZvciBCeXRlc0lPIHR5cGUKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBFbmNvZGVCdWZmZXIqIG5ld19lbmNvZGVfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgIEVuY29kZUJ1ZmZlciogYnVmZmVyID0gbmV3IEVuY29kZUJ1ZmZlcjsKKyAgYnVmZmVyLT5idWYucmVzZXJ2ZShzaXplKTsKKyAgYnVmZmVyLT5wb3MgPSAwOworICByZXR1cm4gYnVmZmVyOworfQorCitzdHJ1Y3QgYnl0ZXNpbyB7CisgIFB5T2JqZWN0X0hFQUQKKyNpZiBQWV9NSU5PUl9WRVJTSU9OIDwgNQorICAgICAgY2hhciogYnVmOworI2Vsc2UKKyAgICAgIFB5T2JqZWN0KiBidWY7CisjZW5kaWYKKyAgUHlfc3NpemVfdCBwb3M7CisgIFB5X3NzaXplX3Qgc3RyaW5nX3NpemU7Cit9OworCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgYnl0ZXNpbyogYnVmMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ynl0ZXNpbyo+KGJ1Zik7CisjaWYgUFlfTUlOT1JfVkVSU0lPTiA8IDUKKyAgKm91dHB1dCA9IGJ1ZjItPmJ1ZiArIGJ1ZjItPnBvczsKKyNlbHNlCisgICpvdXRwdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhidWYyLT5idWYpICsgYnVmMi0+cG9zOworI2VuZGlmCisgIFB5X3NzaXplX3QgcG9zMCA9IGJ1ZjItPnBvczsKKyAgYnVmMi0+cG9zID0gKHN0ZDo6bWluKShidWYyLT5wb3MgKyBzdGF0aWNfY2FzdDxQeV9zc2l6ZV90PihsZW4pLCBidWYyLT5zdHJpbmdfc2l6ZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZjItPnBvcyAtIHBvczApOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgZGVsZXRlIG91dHB1dF87CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLy8gd2hpbGUgY29uZGl0aW9uIGZvciBweTIgaXMgImFyZyA9PSAnVVRGOCciLCBpdCBzaG91bGQgYmUgImFyZyAhPSAnQklOQVJZJyIgZm9yIHB5My4KKyAgLy8gSEFDSzogY2hlY2sgdGhlIGxlbmd0aCBhbmQgZG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIHZhbHVlCisgIHJldHVybiAhUHlVbmljb2RlX0NoZWNrKHR5cGVhcmdzKSB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSCh0eXBlYXJncykgIT0gNjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpnZXRFbmNvZGVkVmFsdWUoKSB7CisgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dF8tPmJ1Zi5kYXRhKCksIG91dHB1dF8tPmJ1Zi5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG5lZWQgPSBzaXplICsgb3V0cHV0Xy0+cG9zOworICBpZiAob3V0cHV0Xy0+YnVmLmNhcGFjaXR5KCkgPCBuZWVkKSB7CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dF8tPmJ1Zi5yZXNlcnZlKG5lZWQpOworICAgIH0gY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jJiBleCkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHdyaXRlIGJ1ZmZlciIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBzdGQ6OmNvcHkoZGF0YSwgZGF0YSArIHNpemUsIHN0ZDo6YmFja19pbnNlcnRlcihvdXRwdXRfLT5idWYpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCituYW1lc3BhY2UgZGV0YWlsIHsKKworI2RlZmluZSBERUNMQVJFX09QX1NDT1BFKG5hbWUsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgbmFtZSMjU2NvcGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEltcGwqIGltcGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgdmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWUjI1Njb3BlKEltcGwqIHRoaXopIDogaW1wbCh0aGl6KSwgdmFsaWQoaW1wbC0+b3AjI0JlZ2luKCkpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH5uYW1lIyNTY29wZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHZhbGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbXBsLT5vcCMjRW5kKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiB2YWxpZDsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbCwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lIyNTY29wZTxJbXBsPiBvcCMjU2NvcGUoVDxJbXBsPiogdGhpeikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuYW1lIyNTY29wZTxJbXBsPihzdGF0aWNfY2FzdDxJbXBsKj4odGhpeikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitERUNMQVJFX09QX1NDT1BFKFdyaXRlU3RydWN0LCB3cml0ZVN0cnVjdCkKK0RFQ0xBUkVfT1BfU0NPUEUoUmVhZFN0cnVjdCwgcmVhZFN0cnVjdCkKKyN1bmRlZiBERUNMQVJFX09QX1NDT1BFCisKK2lubGluZSBib29sIGNoZWNrX3NzaXplX3RfMzIoUHlfc3NpemVfdCBsZW4pIHsKKyAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIG91dCBvZiByYW5nZTogZXhjZWVkZWQgSU5UMzJfTUFYIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgcGFyc2VfcHlpbnQoUHlPYmplY3QqIG8sIFQqIHJldCwgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7CisgIGxvbmcgdmFsID0gUHlJbnRfQXNMb25nKG8pOworCisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2YWwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghQ0hFQ0tfUkFOR0UodmFsLCBtaW4sIG1heCkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqcmV0ID0gc3RhdGljX2Nhc3Q8VD4odmFsKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja1R5cGUoVFR5cGUgZ290LCBUVHlwZSBleHBlY3RlZCkgeworICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KSB7CisgIGlmIChsZW4gPCAwKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJuZWdhdGl2ZSBsZW5ndGg6ICVsZCIsIGxpbWl0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGxlbiA+IGxpbWl0KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIGV4Y2VlZGVkIHNwZWNpZmllZCBsaW1pdDogJWxkIiwgbGltaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6cmVhZEJ5dGVzKGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImF0dGVtcHRlZCB0byByZWFkIG5lZ2F0aXZlIGxlbmd0aDogJWQiLCBsZW4pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKKyAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0CisgIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgorCisgIGludCBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICBpZiAocmxlbiA9PSBsZW4pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIHVzaW5nIGJ1aWxkaW5nIGZ1bmN0aW9ucyBhcyB0aGlzIGlzIGEgcmFyZSBjb2RlcGF0aAorICAgIFNjb3BlZFB5T2JqZWN0IG5ld2lvYnVmKFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbnB1dF8ucmVmaWxsX2NhbGxhYmxlLmdldCgpLCByZWZpbGxfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCBybGVuLCBsZW4sIE5VTEwpKTsKKyAgICBpZiAoIW5ld2lvYnVmKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbXVzdCBkbyB0aGlzICpBRlRFUiogdGhlIGNhbGwgc28gdGhhdCB3ZSBkb24ndCBkZXJlZiB0aGUgaW8gYnVmZmVyCisgICAgaW5wdXRfLnN0cmluZ2lvYnVmLnJlc2V0KG5ld2lvYnVmLnJlbGVhc2UoKSk7CisKKyAgICBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICAgIGlmIChybGVuID09IGxlbikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWZpbGwgY2xhaW1lZCB0byBoYXZlIHJlZmlsbGVkIHRoZSBidWZmZXIsIGJ1dCBkaWRuJ3QhISIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydChQeU9iamVjdCogdHJhbnMpIHsKKyAgaWYgKGlucHV0Xy5zdHJpbmdpb2J1ZikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGVjb2RlIGJ1ZmZlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NvcGVkUHlPYmplY3Qgc3RyaW5naW9idWYoUHlPYmplY3RfR2V0QXR0cih0cmFucywgSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKSkpOworICBpZiAoIXN0cmluZ2lvYnVmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghZGV0YWlsOjppbnB1dF9jaGVjayhzdHJpbmdpb2J1Zi5nZXQoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHN0cmluZ2lvIGlucHV0XyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0IHJlZmlsbF9jYWxsYWJsZShQeU9iamVjdF9HZXRBdHRyKHRyYW5zLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpKSk7CisgIGlmICghcmVmaWxsX2NhbGxhYmxlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghUHlDYWxsYWJsZV9DaGVjayhyZWZpbGxfY2FsbGFibGUuZ2V0KCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlucHV0Xy5zdHJpbmdpb2J1Zi5zd2FwKHN0cmluZ2lvYnVmKTsKKyAgaW5wdXRfLnJlZmlsbF9jYWxsYWJsZS5zd2FwKHJlZmlsbF9jYWxsYWJsZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRW5jb2RlQnVmZmVyKCkgeworICBvdXRwdXRfID0gZGV0YWlsOjpuZXdfZW5jb2RlX2J1ZmZlcihJTklUX09VVEJVRl9TSVpFKTsKKyAgcmV0dXJuIG91dHB1dF8gIT0gTlVMTDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6ZW5jb2RlVmFsdWUoUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLyoKKyAgICogUmVmY291bnRpbmcgU3RyYXRlZ3k6CisgICAqCisgICAqIFdlIGFzc3VtZSB0aGF0IGVsZW1lbnRzIG9mIHRoZSB0aHJpZnRfc3BlYyB0dXBsZSBhcmUgbm90IGdvaW5nIHRvIGJlCisgICAqIG11dGF0ZWQsIHNvIHdlIGRvbid0IHJlZiBjb3VudCB0aG9zZSBhdCBhbGwuIE90aGVyIHRoYW4gdGhhdCwgd2UgdHJ5IHRvCisgICAqIGtlZXAgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB1c2VyLWNyZWF0ZWQgb2JqZWN0cyB3aGlsZSB3ZSB3b3JrIHdpdGggdGhlbS4KKyAgICogZW5jb2RlVmFsdWUgYXNzdW1lcyB0aGF0IGEgcmVmZXJlbmNlIGlzIGFscmVhZHkgaGVsZC4gVGhlICpjYWxsZXIqIGlzCisgICAqIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZWZlcmVuY2VzCisgICAqLworCisgIHN3aXRjaCAodHlwZSkgeworCisgIGNhc2UgVF9CT09MOiB7CisgICAgaW50IHYgPSBQeU9iamVjdF9Jc1RydWUodmFsdWUpOworICAgIGlmICh2ID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGltcGwoKS0+d3JpdGVCb29sKHYpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMDg6IHsKKyAgICBpbnQ4X3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJOCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJMTYodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTMyKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgbnZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZhbHVlKTsKKworICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChudmFsKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghQ0hFQ0tfUkFOR0UobnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTY0KG52YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSBudmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKG52YWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZURvdWJsZShudmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBTY29wZWRQeU9iamVjdCBudmFsOworCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgIG52YWwucmVzZXQoUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSkpOworICAgICAgaWYgKCFudmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgIG52YWwucmVzZXQodmFsdWUpOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19TaXplKG52YWwuZ2V0KCkpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlU3RyaW5nKG52YWwuZ2V0KCksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlPYmplY3RfTGVuZ3RoKHZhbHVlKTsKKyAgICBpZiAoIWRldGFpbDo6Y2hlY2tfc3NpemVfdF8zMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbXBsKCktPndyaXRlTGlzdEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNjb3BlZFB5T2JqZWN0IGl0ZXJhdG9yKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKKyAgICBpZiAoIWl0ZXJhdG9yKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKFB5T2JqZWN0KiByYXdJdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IuZ2V0KCkpKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBpdGVtKHJhd0l0ZW0pOworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShpdGVtLmdldCgpLCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSwgcGFyc2VkYXJncy50eXBlYXJncykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIFB5X3NzaXplX3QgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW1wbCgpLT53cml0ZU1hcEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCogayA9IE5VTEw7CisgICAgUHlPYmplY3QqIHYgPSBOVUxMOworICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cworICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgeworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShrLCBwYXJzZWRhcmdzLmt0YWcsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKQorICAgICAgICAgIHx8ICFlbmNvZGVWYWx1ZSh2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBuc3BlYyA9IFB5VHVwbGVfU2l6ZShwYXJzZWRhcmdzLnNwZWMpOworICAgIGlmIChuc3BlYyA9PSAtMSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInNwZWMgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXRhaWw6OldyaXRlU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OndyaXRlU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBuc3BlYzsgaSsrKSB7CisgICAgICBQeU9iamVjdCogc3BlY190dXBsZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyc2VkYXJncy5zcGVjLCBpKTsKKyAgICAgIGlmIChzcGVjX3R1cGxlID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIHNwZWNfdHVwbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgaW5zdHZhbChQeU9iamVjdF9HZXRBdHRyKHZhbHVlLCBwYXJzZWRzcGVjLmF0dHJuYW1lKSk7CisKKyAgICAgIGlmICghaW5zdHZhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0dmFsLmdldCgpID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgcmVzID0gaW1wbCgpLT53cml0ZUZpZWxkKGluc3R2YWwuZ2V0KCksIHBhcnNlZHNwZWMpOworICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpbXBsKCktPndyaXRlRmllbGRTdG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIGVuY29kZVZhbHVlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojpza2lwKFRUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiBpbXBsKCktPnNraXBCb29sKCk7CisgIGNhc2UgVF9JMDg6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEJ5dGUoKTsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTE2KCk7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEkzMigpOworICBjYXNlIFRfSTY0OgorICAgIHJldHVybiBpbXBsKCktPnNraXBJNjQoKTsKKyAgY2FzZSBUX0RPVUJMRToKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwRG91YmxlKCk7CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIHJldHVybiBpbXBsKCktPnNraXBTdHJpbmcoKTsKKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgVFR5cGUgZXR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRMaXN0QmVnaW4oZXR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoZXR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgVFR5cGUga3R5cGUgPSBUX1NUT1A7CisgICAgVFR5cGUgdnR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoa3R5cGUpIHx8ICFza2lwKHZ0eXBlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIGRldGFpbDo6UmVhZFN0cnVjdFNjb3BlPEltcGw+IHNjb3BlID0gZGV0YWlsOjpyZWFkU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICAgIGludDE2X3QgdGFnOworICAgICAgaWYgKCFpbXBsKCktPnJlYWRGaWVsZEJlZ2luKHR5cGUsIHRhZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIHNraXA6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpkZWNvZGVWYWx1ZShUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkQm9vbCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh2KSB7CisgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgfQorICBjYXNlIFRfSTA4OiB7CisgICAgaW50OF90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTgodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMTYodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMzIodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKworICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEk2NCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgorICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgorICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7CisgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdik7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSB2ID0gMC4wOworICAgIGlmICghaW1wbCgpLT5yZWFkRG91YmxlKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2KTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBjaGFyKiBidWYgPSBOVUxMOworICAgIGludCBsZW4gPSBpbXBsKCktPnJlYWRTdHJpbmcoJmJ1Zik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXNVdGY4KHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZiwgbGVuLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRUeXBlIGV0eXBlID0gVF9TVE9QOworICAgIGludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTGlzdEJlZ2luKGV0eXBlKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW4gPiAwICYmICFjaGVja1R5cGUoZXR5cGUsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYm9vbCB1c2VfdHVwbGUgPSB0eXBlID09IFRfTElTVCAmJiBwYXJzZWRhcmdzLmltbXV0YWJsZTsKKyAgICBTY29wZWRQeU9iamVjdCByZXQodXNlX3R1cGxlID8gUHlUdXBsZV9OZXcobGVuKSA6IFB5TGlzdF9OZXcobGVuKSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlVmFsdWUoZXR5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOworICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKHVzZV90dXBsZSkgeworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJldC5nZXQoKSwgaSwgaXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LmdldCgpLCBpLCBpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCisgICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KKyAgICBpZiAodHlwZSA9PSBUX1NFVCkgeworICAgICAgUHlPYmplY3QqIHNldHJldDsKKyAgICAgIHNldHJldCA9IHBhcnNlZGFyZ3MuaW1tdXRhYmxlID8gUHlGcm96ZW5TZXRfTmV3KHJldC5nZXQoKSkgOiBQeVNldF9OZXcocmV0LmdldCgpKTsKKyAgICAgIHJldHVybiBzZXRyZXQ7CisgICAgfQorICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUVHlwZSBrdHlwZSA9IFRfU1RPUDsKKyAgICBUVHlwZSB2dHlwZSA9IFRfU1RPUDsKKyAgICB1aW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPiAwICYmICghY2hlY2tUeXBlKGt0eXBlLCBwYXJzZWRhcmdzLmt0YWcpIHx8ICFjaGVja1R5cGUodnR5cGUsIHBhcnNlZGFyZ3MudnRhZykpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTY29wZWRQeU9iamVjdCByZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBrKGRlY29kZVZhbHVlKGt0eXBlLCBwYXJzZWRhcmdzLmt0eXBlYXJncykpOworICAgICAgaWYgKCFrKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgU2NvcGVkUHlPYmplY3QgdihkZWNvZGVWYWx1ZSh2dHlwZSwgcGFyc2VkYXJncy52dHlwZWFyZ3MpKTsKKyAgICAgIGlmICghdikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQuZ2V0KCksIGsuZ2V0KCksIHYuZ2V0KCkpID09IC0xKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJzZWRhcmdzLmltbXV0YWJsZSkgeworICAgICAgaWYgKCFUaHJpZnRNb2R1bGUpIHsKKyAgICAgICAgVGhyaWZ0TW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ0aHJpZnQuVGhyaWZ0Iik7CisgICAgICB9CisgICAgICBpZiAoIVRocmlmdE1vZHVsZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgY2xzKFB5T2JqZWN0X0dldEF0dHIoVGhyaWZ0TW9kdWxlLCBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KSkpOworICAgICAgaWYgKCFjbHMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGFyZyhQeVR1cGxlX05ldygxKSk7CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZy5nZXQoKSwgMCwgcmV0LnJlbGVhc2UoKSk7CisgICAgICByZXQucmVzZXQoUHlPYmplY3RfQ2FsbE9iamVjdChjbHMuZ2V0KCksIGFyZy5nZXQoKSkpOworICAgIH0KKworICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRTdHJ1Y3QoUHlfTm9uZSwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3IgZGVjb2RlVmFsdWU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpyZWFkU3RydWN0KFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBrbGFzcywgUHlPYmplY3QqIHNwZWNfc2VxKSB7CisgIGludCBzcGVjX3NlcV9sZW4gPSBQeVR1cGxlX1NpemUoc3BlY19zZXEpOworICBib29sIGltbXV0YWJsZSA9IG91dHB1dCA9PSBQeV9Ob25lOworICBTY29wZWRQeU9iamVjdCBrd2FyZ3M7CisgIGlmIChzcGVjX3NlcV9sZW4gPT0gLTEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChpbW11dGFibGUpIHsKKyAgICBrd2FyZ3MucmVzZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIWt3YXJncykgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZhaWxlZCB0byBwcmVwYXJlIGt3YXJndW1lbnQgc3RvcmFnZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgZGV0YWlsOjpSZWFkU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OnJlYWRTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgaWYgKCFzY29wZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICBpbnQxNl90IHRhZzsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEZpZWxkQmVnaW4odHlwZSwgdGFnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0YWcgPCAwIHx8IHRhZyA+PSBzcGVjX3NlcV9sZW4pIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXJyb3Igd2hpbGUgc2tpcHBpbmcgdW5rbm93biBmaWVsZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFB5T2JqZWN0KiBpdGVtX3NwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfc2VxLCB0YWcpOworICAgIGlmIChpdGVtX3NwZWMgPT0gUHlfTm9uZSkgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFcnJvciB3aGlsZSBza2lwcGluZyB1bmtub3duIGZpZWxkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBhcnNlZHNwZWMudHlwZSAhPSB0eXBlKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0cnVjdCBmaWVsZCBoYWQgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZWRzcGVjLnR5cGUsIHR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0IGZpZWxkdmFsKGRlY29kZVZhbHVlKHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncykpOworICAgIGlmICghZmllbGR2YWwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgoaW1tdXRhYmxlICYmIFB5RGljdF9TZXRJdGVtKGt3YXJncy5nZXQoKSwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKQorICAgICAgICB8fCAoIWltbXV0YWJsZSAmJiBQeU9iamVjdF9TZXRBdHRyKG91dHB1dCwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIGlmIChpbW11dGFibGUpIHsKKyAgICBTY29wZWRQeU9iamVjdCBhcmdzKFB5VHVwbGVfTmV3KDApKTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJmYWlsZWQgdG8gcHJlcGFyZSBhcmd1bWVudCBzdG9yYWdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoa2xhc3MsIGFyZ3MuZ2V0KCksIGt3YXJncy5nZXQoKSk7CisgIH0KKyAgUHlfSU5DUkVGKG91dHB1dCk7CisgIHJldHVybiBvdXRwdXQ7Cit9Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX1BST1RPQ09MX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcCBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ0M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK1B5T2JqZWN0KiBUaHJpZnRNb2R1bGUgPSBOVUxMOworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2NoYXIgcmVmaWxsX3NpZ25hdHVyZVtdID0geydzJywgJyMnLCAnaSd9OworI2Vsc2UKK2NvbnN0IGNoYXIqIHJlZmlsbF9zaWduYXR1cmUgPSAieSNpIjsKKyNlbmRpZgorCitib29sIHBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoU3RydWN0SXRlbVNwZWMqIGRlc3QsIFB5T2JqZWN0KiBzcGVjX3R1cGxlKSB7CisgIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KKyAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSBidXQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihQeVR1cGxlX1NpemUoc3BlY190dXBsZSkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMCkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDEpKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmF0dHJuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAyKTsKKyAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDMpOworICBkZXN0LT5kZWZ2YWwgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDMpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMyBmb3IgbGlzdC9zZXQgdHlwZSBhcmdzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+ZWxlbWVudF90eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+ZWxlbWVudF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgZGVzdC0+aW1tdXRhYmxlID0gUHlfVHJ1ZSA9PSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDUpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciB0eXBlYXJncyB0byBtYXAiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT52dGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKyAgZGVzdC0+dnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMyk7CisgIGRlc3QtPmltbXV0YWJsZSA9IFB5X1RydWUgPT0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgNCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBpZiAoUHlMaXN0X1NpemUodHlwZWFyZ3MpICE9IDIpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGxpc3Qgb2Ygc2l6ZSAyIGZvciBzdHJ1Y3QgYXJncyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmtsYXNzID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKKyAgZGVzdC0+c3BlYyA9IFB5TGlzdF9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgcmV0dXJuIHRydWU7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC90eXBlcy5oIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q4ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9UWVBFU19ICisjZGVmaW5lIFRIUklGVF9QWV9UWVBFU19ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE86IGJldHRlciBtYWNyb3MKKyNkZWZpbmUgUHlJbnRfQXNMb25nKHYpIFB5TG9uZ19Bc0xvbmcodikKKyNkZWZpbmUgUHlJbnRfRnJvbUxvbmcodikgUHlMb25nX0Zyb21Mb25nKHYpCisKKyNkZWZpbmUgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh2KSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZyh2KQorCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5fU1RSSU5HKHZhbHVlKSBfaW50ZXJuXyMjdmFsdWUKKworI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoKCh2KSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKworZXh0ZXJuICJDIiB7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworZXh0ZXJuIFB5T2JqZWN0KiBUaHJpZnRNb2R1bGU7CisKKy8vIFN0b2xlbiBvdXQgb2YgVFByb3RvY29sLmguCisvLyBJdCB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBoYXZlIGJvdGggZ2V0IHRoaXMgZnJvbSBvbmUgcGxhY2UuCitlbnVtIFRUeXBlIHsKKyAgVF9JTlZBTElEID0gLTEsCisgIFRfU1RPUCA9IDAsCisgIFRfVk9JRCA9IDEsCisgIFRfQk9PTCA9IDIsCisgIFRfQllURSA9IDMsCisgIFRfSTA4ID0gMywKKyAgVF9JMTYgPSA2LAorICBUX0kzMiA9IDgsCisgIFRfVTY0ID0gOSwKKyAgVF9JNjQgPSAxMCwKKyAgVF9ET1VCTEUgPSA0LAorICBUX1NUUklORyA9IDExLAorICBUX1VURjcgPSAxMSwKKyAgVF9TVFJVQ1QgPSAxMiwKKyAgVF9NQVAgPSAxMywKKyAgVF9TRVQgPSAxNCwKKyAgVF9MSVNUID0gMTUsCisgIFRfVVRGOCA9IDE2LAorICBUX1VURjE2ID0gMTcKK307CisKKy8vIHJlcGxhY2Ugd2l0aCB1bmlxdWVfcHRyIHdoZW4gd2UncmUgT0sgd2l0aCBDKysxMQorY2xhc3MgU2NvcGVkUHlPYmplY3QgeworcHVibGljOgorICBTY29wZWRQeU9iamVjdCgpIDogb2JqXyhOVUxMKSB7fQorICBleHBsaWNpdCBTY29wZWRQeU9iamVjdChQeU9iamVjdCogcHlfb2JqZWN0KSA6IG9ial8ocHlfb2JqZWN0KSB7fQorICB+U2NvcGVkUHlPYmplY3QoKSB7CisgICAgaWYgKG9ial8pCisgICAgICBQeV9ERUNSRUYob2JqXyk7CisgIH0KKyAgUHlPYmplY3QqIGdldCgpIHRocm93KCkgeyByZXR1cm4gb2JqXzsgfQorICBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gb2JqXzsgfQorICB2b2lkIHJlc2V0KFB5T2JqZWN0KiBweV9vYmplY3QpIHRocm93KCkgeworICAgIGlmIChvYmpfKQorICAgICAgUHlfREVDUkVGKG9ial8pOworICAgIG9ial8gPSBweV9vYmplY3Q7CisgIH0KKyAgUHlPYmplY3QqIHJlbGVhc2UoKSB0aHJvdygpIHsKKyAgICBQeU9iamVjdCogdG1wID0gb2JqXzsKKyAgICBvYmpfID0gTlVMTDsKKyAgICByZXR1cm4gdG1wOworICB9CisgIHZvaWQgc3dhcChTY29wZWRQeU9iamVjdCYgb3RoZXIpIHRocm93KCkgeworICAgIFNjb3BlZFB5T2JqZWN0IHRtcChvdGhlci5yZWxlYXNlKCkpOworICAgIG90aGVyLnJlc2V0KHJlbGVhc2UoKSk7CisgICAgcmVzZXQodG1wLnJlbGVhc2UoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU2NvcGVkUHlPYmplY3QoY29uc3QgU2NvcGVkUHlPYmplY3QmKSB7fQorICBTY29wZWRQeU9iamVjdCYgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFB5T2JqZWN0JikgeyByZXR1cm4gKnRoaXM7IH0KKworICBQeU9iamVjdCogb2JqXzsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgdHdvIGtleSBhdHRyaWJ1dGVzIG9mIGEgQ1JlYWRhYmxlVHJhbnNwb3J0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlPYmplY3RfR2V0QXR0ci4KKyAqLworc3RydWN0IERlY29kZUJ1ZmZlciB7CisgIFNjb3BlZFB5T2JqZWN0IHN0cmluZ2lvYnVmOworICBTY29wZWRQeU9iamVjdCByZWZpbGxfY2FsbGFibGU7Cit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2V4dGVybiBjaGFyIHJlZmlsbF9zaWduYXR1cmVbM107Cit0eXBlZGVmIFB5T2JqZWN0IEVuY29kZUJ1ZmZlcjsKKyNlbHNlCitleHRlcm4gY29uc3QgY2hhciogcmVmaWxsX3NpZ25hdHVyZTsKK3N0cnVjdCBFbmNvZGVCdWZmZXIgeworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CisgIHNpemVfdCBwb3M7Cit9OworI2VuZGlmCisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHNldCBvciBsaXN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFNldExpc3RUeXBlQXJncyB7CisgIFRUeXBlIGVsZW1lbnRfdHlwZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBNYXBUeXBlQXJncyB7CisgIFRUeXBlIGt0YWc7CisgIFRUeXBlIHZ0YWc7CisgIFB5T2JqZWN0KiBrdHlwZWFyZ3M7CisgIFB5T2JqZWN0KiB2dHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc3RydWN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFN0cnVjdFR5cGVBcmdzIHsKKyAgUHlPYmplY3QqIGtsYXNzOworICBQeU9iamVjdCogc3BlYzsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIGl0ZW0gc3BlYyBmcm9tIGEgc3RydWN0IHNwZWNpZmljYXRpb24sCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0SXRlbVNwZWMgeworICBpbnQgdGFnOworICBUVHlwZSB0eXBlOworICBQeU9iamVjdCogYXR0cm5hbWU7CisgIFB5T2JqZWN0KiB0eXBlYXJnczsKKyAgUHlPYmplY3QqIGRlZnZhbDsKK307CisKK2Jvb2wgcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2VfbWFwX2FyZ3MoTWFwVHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpOworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1BZX1RZUEVTX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTFiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CkBAIC0wLDAgKzEsODIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKworCitjbGFzcyBUQmFzZShvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10KKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoKKyAgICAgICAgICAgIG15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpCisgICAgICAgICAgICBpZiBteV92YWwgIT0gb3RoZXJfdmFsOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlmIChpcHJvdC5fZmFzdF9kZWNvZGUgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgaXByb3QuX2Zhc3RfZGVjb2RlKHNlbGYsIGlwcm90LCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXByb3QucmVhZFN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICAgICAgaWYgKG9wcm90Ll9mYXN0X2VuY29kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBvcHJvdC50cmFucy53cml0ZSgKKyAgICAgICAgICAgICAgICBvcHJvdC5fZmFzdF9lbmNvZGUoc2VsZiwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorCisKK2NsYXNzIFRFeGNlcHRpb25CYXNlKFRCYXNlLCBFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBURnJvemVuQmFzZShUQmFzZSk6CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIHN0cnVjdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goc2VsZi5fX3Nsb3RzX18pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcmVhZChjbHMsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgY2xzLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIHNlbGYgPSBjbHMoKQorICAgICAgICAgICAgcmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpcHJvdC5yZWFkU3RydWN0KGNscywgY2xzLnRocmlmdF9zcGVjLCBUcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQppbmRleCA1MGM2YWE4Li5mNmJlNzcyIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQpAQCAtMTcsMjQzICsxNywyODUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCAqCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKIAorCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2woVFByb3RvY29sQmFzZSk6CisgICAgIiIiQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgogCi0gICIiIkJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICAjIE5hc3R5SGF4eC4gUHl0aG9uIDIuNCsgb24gMzItYml0IG1hY2hpbmVzIGZvcmNlcyBoZXggY29uc3RhbnRzIHRvIGJlCisgICAgIyBwb3NpdGl2ZSwgY29udmVydGluZyB0aGlzIGludG8gYSBsb25nLiBJZiB3ZSBoYXJkY29kZSB0aGUgaW50IHZhbHVlCisgICAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCiAKLSAgIyBOYXN0eUhheHguIFB5dGhvbiAyLjQrIG9uIDMyLWJpdCBtYWNoaW5lcyBmb3JjZXMgaGV4IGNvbnN0YW50cyB0byBiZQotICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLSAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCisgICAgIyBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCisgICAgVkVSU0lPTl9NQVNLID0gLTY1NTM2CiAKLSAgIyBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCi0gIFZFUlNJT05fTUFTSyA9IC02NTUzNgorICAgICMgVkVSU0lPTl8xID0gMHg4MDAxMDAwMAorICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyCiAKLSAgIyBWRVJTSU9OXzEgPSAweDgwMDEwMDAwCi0gIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyCisgICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZgogCi0gIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmYKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6Ci0gICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQotICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKLSAgICBlbHNlOgotICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQotICAgICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKLSAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCisgICAgZGVmIF9jaGVja19jb250YWluZXJfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgorICAgICAgICBpZiBzZWxmLnN0cmljdFdyaXRlOgorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xIHwgdHlwZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGlkKToKLSAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgIHNlbGYud3JpdGVJMTYoaWQpCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTE2KGlkKQogCi0gIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKLSAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoa3R5cGUpCi0gICAgc2VsZi53cml0ZUJ5dGUodnR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoVFR5cGUuU1RPUCkKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGt0eXBlKQorICAgICAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkzMihzaXplKQogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQotICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKLSAgICBpZiBib29sOgotICAgICAgc2VsZi53cml0ZUJ5dGUoMSkKLSAgICBlbHNlOgotICAgICAgc2VsZi53cml0ZUJ5dGUoMCkKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZUJ5dGUoMCkKIAotICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBidWZmID0gcGFjaygiIWgiLCBpMTYpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBidWZmID0gcGFjaygiIWkiLCBpMzIpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBidWZmID0gcGFjaygiIWgiLCBpMTYpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBidWZmID0gcGFjaygiIXEiLCBpNjQpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBidWZmID0gcGFjaygiIWkiLCBpMzIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBidWZmID0gcGFjaygiIXEiLCBpNjQpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQotICAgIHNlbGYudHJhbnMud3JpdGUoc3RyKQorICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBzeiA9IHNlbGYucmVhZEkzMigpCi0gICAgaWYgc3ogPCAwOgotICAgICAgdmVyc2lvbiA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSwotICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sIG1lc3NhZ2U9J0JhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICVkJyAlIChzeikpCi0gICAgICB0eXBlID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLCi0gICAgICBuYW1lID0gc2VsZi5yZWFkU3RyaW5nKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICBlbHNlOgotICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sIG1lc3NhZ2U9J05vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyJykKLSAgICAgIG5hbWUgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc3opCi0gICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgc3RyKToKKyAgICAgICAgc2VsZi53cml0ZUkzMihsZW4oc3RyKSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShzdHIpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc3ogPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBpZiBzeiA8IDA6CisgICAgICAgICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCisgICAgICAgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICB0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKKyAgICAgICAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQorICAgICAgICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKKyAgICAgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKIAotICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCAwKQotICAgIGlkID0gc2VsZi5yZWFkSTE2KCkKLSAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQorICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgMCkKKyAgICAgICAgaWQgPSBzZWxmLnJlYWRJMTYoKQorICAgICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAga3R5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICB2dHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAga3R5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgdnR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgotICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgYnl0ZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIGlmIGJ5dGUgPT0gMDoKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJ5dGUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQotICAgIHZhbCwgPSB1bnBhY2soJyFiJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIGJ5dGUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiByZWFkSTE2KHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMikKLSAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchYicsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZEkzMihzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDQpCi0gICAgdmFsLCA9IHVucGFjaygnIWknLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIXEnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg0KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchcScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICBsZW4gPSBzZWxmLnJlYWRJMzIoKQotICAgIHN0ciA9IHNlbGYudHJhbnMucmVhZEFsbChsZW4pCi0gICAgcmV0dXJuIHN0cgorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFkJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19zdHJpbmdfbGVuZ3RoKHNpemUpCisgICAgICAgIHMgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc2l6ZSkKKyAgICAgICAgcmV0dXJuIHMKIAogCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OgotICBkZWYgX19pbml0X18oc2VsZiwgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSk6Ci0gICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAotICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICAgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ3N0cmluZ19sZW5ndGhfbGltaXQnLCBOb25lKQorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdjb250YWluZXJfbGVuZ3RoX2xpbWl0JywgTm9uZSkKIAotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSkKLSAgICByZXR1cm4gcHJvdAorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCkKKyAgICAgICAgcmV0dXJuIHByb3QKIAogCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZChUQmluYXJ5UHJvdG9jb2wpOgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQmluYXJ5UHJvdG9jb2wuCiAKLSAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRCaW5hcnlQcm90b2NvbC4KKyAgICBUaGlzIGNsYXNzIGRvZXMgbm90IG92ZXJyaWRlIGFueSBvZiBUQmluYXJ5UHJvdG9jb2wncyBtZXRob2RzLAorICAgIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KKyAgICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCisgICAgV2UgaW5oZXJpdCBmcm9tIFRCaW5hcnlQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVEJpbmFyeVByb3RvY29sCisgICAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCisgICAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLCBwYXNzIGZhbGxiYWNrPUZhbHNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgogCi0gIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMsCi0gIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KLSAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgotICBXZSBpbmhlcml0IGZyb20gVEJpbmFyeVByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQmluYXJ5UHJvdG9jb2wKLSAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCi0gIHJlYXNvbi4gIChUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBoYXBwZW4gc2FuZWx5IGluIG1vcmUgY2FzZXMuKQorICAgIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKKyAgICBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCi0gIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgorICAgIE5PVEU6ICBUaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IGFuIGV4dGVybmFsIGRldmVsb3Blci4KKyAgICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAorICAgICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCisgICAgICAgICAgIFBsZWFzZSBmZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3MgYW5kL29yIHN1Y2Nlc3Mgc3RvcmllcworICAgICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KKyAgICAiIiIKKyAgICBwYXNzCiAKLSAgTk9URTogIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgYW4gZXh0ZXJuYWwgZGV2ZWxvcGVyLgotICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAotICAgICAgICAgYnV0IHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBpdCBpcyBwcm9kdWN0aW9uLXJlYWR5LgotICAgICAgICAgUGxlYXNlIGZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBhbmQvb3Igc3VjY2VzcyBzdG9yaWVzCi0gICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KLSAgIiIiCi0KLSAgcGFzcworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmYWxsYmFjayA9IGt3YXJncy5wb3AoJ2ZhbGxiYWNrJywgVHJ1ZSkKKyAgICAgICAgc3VwZXIoVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgbm90IGZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeQorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkKIAogCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zKQorY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBmYWxsYmFjaz1UcnVlKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuX2ZhbGxiYWNrID0gZmFsbGJhY2sKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKKyAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1zZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGZhbGxiYWNrPXNlbGYuX2ZhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CmluZGV4IGZiYzE1NmEuLmU0ODVjZmYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKQEAgLTEsNiArMSwyNyBAQAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0ICoKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIGNoZWNrSW50ZWdlckxpbWl0cwogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogCitmcm9tIC4uY29tcGF0IGltcG9ydCBiaW5hcnlfdG9fc3RyLCBzdHJfdG9fYmluYXJ5CisKIF9fYWxsX18gPSBbJ1RDb21wYWN0UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbEZhY3RvcnknXQogCiBDTEVBUiA9IDAKQEAgLTEzLDM1NiArMzQsNDQyIEBACiBWQUxVRV9SRUFEID0gNwogQk9PTF9SRUFEID0gOAogCisKIGRlZiBtYWtlX2hlbHBlcih2X2Zyb20sIGNvbnRhaW5lcik6Ci0gIGRlZiBoZWxwZXIoZnVuYyk6Ci0gICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKHZfZnJvbSwgY29udGFpbmVyKSwgKHNlbGYuc3RhdGUsIHZfZnJvbSwgY29udGFpbmVyKQotICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQotICAgIHJldHVybiBuZXN0ZWQKLSAgcmV0dXJuIGhlbHBlcgorICAgIGRlZiBoZWxwZXIoZnVuYyk6CisgICAgICAgIGRlZiBuZXN0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluICh2X2Zyb20sIGNvbnRhaW5lciksIChzZWxmLnN0YXRlLCB2X2Zyb20sIGNvbnRhaW5lcikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIG5lc3RlZAorICAgIHJldHVybiBoZWxwZXIKKworCiB3cml0ZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKQogcmVhZGVyID0gbWFrZV9oZWxwZXIoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpCiAKKwogZGVmIG1ha2VaaWdaYWcobiwgYml0cyk6Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IChiaXRzIC0gMSkpCisgICAgY2hlY2tJbnRlZ2VyTGltaXRzKG4sIGJpdHMpCisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gKGJpdHMgLSAxKSkKKwogCiBkZWYgZnJvbVppZ1phZyhuKToKLSAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSkKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKQorCiAKIGRlZiB3cml0ZVZhcmludCh0cmFucywgbik6Ci0gIG91dCA9IFtdCi0gIHdoaWxlIFRydWU6Ci0gICAgaWYgbiAmIH4weDdmID09IDA6Ci0gICAgICBvdXQuYXBwZW5kKG4pCi0gICAgICBicmVhawotICAgIGVsc2U6Ci0gICAgICBvdXQuYXBwZW5kKChuICYgMHhmZikgfCAweDgwKQotICAgICAgbiA9IG4gPj4gNwotICB0cmFucy53cml0ZSgnJy5qb2luKG1hcChjaHIsIG91dCkpKQorICAgIG91dCA9IGJ5dGVhcnJheSgpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgbiAmIH4weDdmID09IDA6CisgICAgICAgICAgICBvdXQuYXBwZW5kKG4pCisgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0LmFwcGVuZCgobiAmIDB4ZmYpIHwgMHg4MCkKKyAgICAgICAgICAgIG4gPSBuID4+IDcKKyAgICB0cmFucy53cml0ZShieXRlcyhvdXQpKQorCiAKIGRlZiByZWFkVmFyaW50KHRyYW5zKToKLSAgcmVzdWx0ID0gMAotICBzaGlmdCA9IDAKLSAgd2hpbGUgVHJ1ZToKLSAgICB4ID0gdHJhbnMucmVhZEFsbCgxKQotICAgIGJ5dGUgPSBvcmQoeCkKLSAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdAotICAgIGlmIGJ5dGUgPj4gNyA9PSAwOgotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHNoaWZ0ICs9IDcKKyAgICByZXN1bHQgPSAwCisgICAgc2hpZnQgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgeCA9IHRyYW5zLnJlYWRBbGwoMSkKKyAgICAgICAgYnl0ZSA9IG9yZCh4KQorICAgICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdAorICAgICAgICBpZiBieXRlID4+IDcgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2hpZnQgKz0gNwogCi1jbGFzcyBDb21wYWN0VHlwZToKLSAgVFJVRSA9IDEKLSAgRkFMU0UgPSAyCi0gIEJZVEUgPSAweDAzCi0gIEkxNiA9IDB4MDQKLSAgSTMyID0gMHgwNQotICBJNjQgPSAweDA2Ci0gIERPVUJMRSA9IDB4MDcKLSAgQklOQVJZID0gMHgwOAotICBMSVNUID0gMHgwOQotICBTRVQgPSAweDBBCi0gIE1BUCA9IDB4MEIKLSAgU1RSVUNUID0gMHgwQwogCi1DVFlQRVMgPSB7VFR5cGUuQk9PTDogQ29tcGFjdFR5cGUuVFJVRSwgIyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgICAgICAgVFR5cGUuQllURTogQ29tcGFjdFR5cGUuQllURSwKLSAgICAgICAgICBUVHlwZS5JMTY6IENvbXBhY3RUeXBlLkkxNiwKLSAgICAgICAgICBUVHlwZS5JMzI6IENvbXBhY3RUeXBlLkkzMiwKLSAgICAgICAgICBUVHlwZS5JNjQ6IENvbXBhY3RUeXBlLkk2NCwKLSAgICAgICAgICBUVHlwZS5ET1VCTEU6IENvbXBhY3RUeXBlLkRPVUJMRSwKLSAgICAgICAgICBUVHlwZS5TVFJJTkc6IENvbXBhY3RUeXBlLkJJTkFSWSwKLSAgICAgICAgICBUVHlwZS5TVFJVQ1Q6IENvbXBhY3RUeXBlLlNUUlVDVCwKLSAgICAgICAgICBUVHlwZS5MSVNUOiBDb21wYWN0VHlwZS5MSVNULAotICAgICAgICAgIFRUeXBlLlNFVDogQ29tcGFjdFR5cGUuU0VULAotICAgICAgICAgIFRUeXBlLk1BUDogQ29tcGFjdFR5cGUuTUFQLAotICAgICAgICAgIH0KK2NsYXNzIENvbXBhY3RUeXBlKG9iamVjdCk6CisgICAgU1RPUCA9IDB4MDAKKyAgICBUUlVFID0gMHgwMQorICAgIEZBTFNFID0gMHgwMgorICAgIEJZVEUgPSAweDAzCisgICAgSTE2ID0gMHgwNAorICAgIEkzMiA9IDB4MDUKKyAgICBJNjQgPSAweDA2CisgICAgRE9VQkxFID0gMHgwNworICAgIEJJTkFSWSA9IDB4MDgKKyAgICBMSVNUID0gMHgwOQorICAgIFNFVCA9IDB4MEEKKyAgICBNQVAgPSAweDBCCisgICAgU1RSVUNUID0gMHgwQworCisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAorICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICBUVHlwZS5CWVRFOiBDb21wYWN0VHlwZS5CWVRFLAorICAgIFRUeXBlLkkxNjogQ29tcGFjdFR5cGUuSTE2LAorICAgIFRUeXBlLkkzMjogQ29tcGFjdFR5cGUuSTMyLAorICAgIFRUeXBlLkk2NDogQ29tcGFjdFR5cGUuSTY0LAorICAgIFRUeXBlLkRPVUJMRTogQ29tcGFjdFR5cGUuRE9VQkxFLAorICAgIFRUeXBlLlNUUklORzogQ29tcGFjdFR5cGUuQklOQVJZLAorICAgIFRUeXBlLlNUUlVDVDogQ29tcGFjdFR5cGUuU1RSVUNULAorICAgIFRUeXBlLkxJU1Q6IENvbXBhY3RUeXBlLkxJU1QsCisgICAgVFR5cGUuU0VUOiBDb21wYWN0VHlwZS5TRVQsCisgICAgVFR5cGUuTUFQOiBDb21wYWN0VHlwZS5NQVAsCit9CiAKIFRUWVBFUyA9IHt9CiBmb3IgaywgdiBpbiBDVFlQRVMuaXRlbXMoKToKLSAgVFRZUEVTW3ZdID0gaworICAgIFRUWVBFU1t2XSA9IGsKIFRUWVBFU1tDb21wYWN0VHlwZS5GQUxTRV0gPSBUVHlwZS5CT09MCiBkZWwgawogZGVsIHYKIAorCiBjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRQcm90b2NvbEJhc2UpOgotICAiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iCisgICAgIiIiQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKIAotICBQUk9UT0NPTF9JRCA9IDB4ODIKLSAgVkVSU0lPTiA9IDEKLSAgVkVSU0lPTl9NQVNLID0gMHgxZgotICBUWVBFX01BU0sgPSAweGUwCi0gIFRZUEVfU0hJRlRfQU1PVU5UID0gNQorICAgIFBST1RPQ09MX0lEID0gMHg4MgorICAgIFZFUlNJT04gPSAxCisgICAgVkVSU0lPTl9NQVNLID0gMHgxZgorICAgIFRZUEVfTUFTSyA9IDB4ZTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RhdGUgPSBDTEVBUgotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKLSAgICBzZWxmLl9fYm9vbF9maWQgPSBOb25lCi0gICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBOb25lCi0gICAgc2VsZi5fX3N0cnVjdHMgPSBbXQotICAgIHNlbGYuX19jb250YWluZXJzID0gW10KKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gTm9uZQorICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMgPSBbXQorICAgICAgICBzZWxmLl9fY29udGFpbmVycyA9IFtdCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAogCi0gIGRlZiBfX3dyaXRlVmFyaW50KHNlbGYsIG4pOgotICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5QUk9UT0NPTF9JRCkKLSAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlZFUlNJT04gfCAodHlwZSA8PCBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSkKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQoc2VxaWQpCi0gICAgc2VsZi5fX3dyaXRlU3RyaW5nKG5hbWUpCi0gICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCisgICAgZGVmIF9jaGVja19jb250YWluZXJfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IFZBTFVFX1dSSVRFCi0gICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgZGVmIF9fd3JpdGVWYXJpbnQoc2VsZiwgbik6CisgICAgICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfV1JJVEUsIFZBTFVFX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKLSAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5QUk9UT0NPTF9JRCkKKyAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5WRVJTSU9OIHwgKHR5cGUgPDwgc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkpCisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChzZXFpZCkKKyAgICAgICAgc2VsZi5fX3dyaXRlQmluYXJ5KHN0cl90b19iaW5hcnkobmFtZSkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQotICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gVkFMVUVfV1JJVEUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfV1JJVEUsIFZBTFVFX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCiAKLSAgZGVmIF9fd3JpdGVGaWVsZEhlYWRlcihzZWxmLCB0eXBlLCBmaWQpOgotICAgIGRlbHRhID0gZmlkIC0gc2VsZi5fX2xhc3RfZmlkCi0gICAgaWYgMCA8IGRlbHRhIDw9IDE1OgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoZGVsdGEgPDwgNCB8IHR5cGUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX193cml0ZUJ5dGUodHlwZSkKLSAgICAgIHNlbGYuX193cml0ZUkxNihmaWQpCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgZmlkKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQotICAgIGlmIHR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1dSSVRFCi0gICAgICBzZWxmLl9fYm9vbF9maWQgPSBmaWQKLSAgICBlbHNlOgotICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCi0gICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihDVFlQRVNbdHlwZV0sIGZpZCkKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIEJPT0xfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCisgICAgZGVmIF9fd3JpdGVGaWVsZEhlYWRlcihzZWxmLCB0eXBlLCBmaWQpOgorICAgICAgICBkZWx0YSA9IGZpZCAtIHNlbGYuX19sYXN0X2ZpZAorICAgICAgICBpZiAwIDwgZGVsdGEgPD0gMTU6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShkZWx0YSA8PCA0IHwgdHlwZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUodHlwZSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUkxNihmaWQpCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAogCi0gIGRlZiBfX3dyaXRlVUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchQicsIGJ5dGUpKQorICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgZmlkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfV1JJVEUsIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5CT09MOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX19ib29sX2ZpZCA9IGZpZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihDVFlQRVNbdHlwZV0sIGZpZCkKIAotICBkZWYgX193cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchYicsIGJ5dGUpKQorICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIEJPT0xfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQogCi0gIGRlZiBfX3dyaXRlSTE2KHNlbGYsIGkxNik6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTE2LCAxNikpCisgICAgZGVmIF9fd3JpdGVVQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchQicsIGJ5dGUpKQogCi0gIGRlZiBfX3dyaXRlU2l6ZShzZWxmLCBpMzIpOgotICAgIHNlbGYuX193cml0ZVZhcmludChpMzIpCisgICAgZGVmIF9fd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFiJywgYnl0ZSkpCiAKLSAgZGVmIHdyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKLSAgICBpZiBzaXplIDw9IDE0OgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2l6ZSA8PCA0IHwgQ1RZUEVTW2V0eXBlXSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoMHhmMCB8IENUWVBFU1tldHlwZV0pCi0gICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQotICB3cml0ZVNldEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KLSAgd3JpdGVMaXN0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIGRlZiBfX3dyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkxNiwgMTYpKQogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgaWYgc2l6ZSA9PSAwOgotICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCi0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShDVFlQRVNba3R5cGVdIDw8IDQgfCBDVFlQRVNbdnR5cGVdKQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKKyAgICBkZWYgX193cml0ZVNpemUoc2VsZiwgaTMyKToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KGkzMikKIAotICBkZWYgd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQotICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAotICB3cml0ZVNldEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAotICB3cml0ZUxpc3RFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKyAgICBkZWYgd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgc2l6ZSA8PSAxNDoKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNpemUgPDwgNCB8IENUWVBFU1tldHlwZV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZSgweGYwIHwgQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKKyAgICB3cml0ZVNldEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KKyAgICB3cml0ZUxpc3RCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCiAKLSAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKLSAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfV1JJVEU6Ci0gICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcih0eXBlc1tib29sXSwgc2VsZi5fX2Jvb2xfZmlkKQotICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEU6Ci0gICAgICBzZWxmLl9fd3JpdGVCeXRlKGludChib29sKSkKLSAgICBlbHNlOgotICAgICAgcmFpc2UgQXNzZXJ0ZXRpb25FcnJvciwgIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCIKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgc2l6ZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoQ1RZUEVTW2t0eXBlXSA8PCA0IHwgQ1RZUEVTW3Z0eXBlXSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKIAotICB3cml0ZUJ5dGUgPSB3cml0ZXIoX193cml0ZUJ5dGUpCi0gIHdyaXRlSTE2ID0gd3JpdGVyKF9fd3JpdGVJMTYpCisgICAgZGVmIHdyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQorICAgIHdyaXRlTWFwRW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVTZXRFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZUxpc3RFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKIAotICBAd3JpdGVyCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkzMiwgMzIpKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKKyAgICAgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuRkFMU0UKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKGN0eXBlLCBzZWxmLl9fYm9vbF9maWQpCisgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuVFJVRSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wiKQogCi0gIEB3cml0ZXIKLSAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTY0LCA2NCkpCisgICAgd3JpdGVCeXRlID0gd3JpdGVyKF9fd3JpdGVCeXRlKQorICAgIHdyaXRlSTE2ID0gd3JpdGVyKF9fd3JpdGVJMTYpCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFkJywgZHViKSkKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkzMiwgMzIpKQogCi0gIGRlZiBfX3dyaXRlU3RyaW5nKHNlbGYsIHMpOgotICAgIHNlbGYuX193cml0ZVNpemUobGVuKHMpKQotICAgIHNlbGYudHJhbnMud3JpdGUocykKLSAgd3JpdGVTdHJpbmcgPSB3cml0ZXIoX193cml0ZVN0cmluZykKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGk2NCwgNjQpKQogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFELCBzZWxmLnN0YXRlCi0gICAgdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIGlmIHR5cGUgJiAweDBmID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4gKE5vbmUsIDAsIDApCi0gICAgZGVsdGEgPSB0eXBlID4+IDQKLSAgICBpZiBkZWx0YSA9PSAwOgotICAgICAgZmlkID0gc2VsZi5fX3JlYWRJMTYoKQotICAgIGVsc2U6Ci0gICAgICBmaWQgPSBzZWxmLl9fbGFzdF9maWQgKyBkZWx0YQotICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAotICAgIHR5cGUgPSB0eXBlICYgMHgwZgotICAgIGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuVFJVRToKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKLSAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gVHJ1ZQotICAgIGVsaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5GQUxTRToKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKLSAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gRmFsc2UKLSAgICBlbHNlOgotICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1JFQUQKLSAgICByZXR1cm4gKE5vbmUsIHNlbGYuX19nZXRUVHlwZSh0eXBlKSwgZmlkKQorICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCc8ZCcsIGR1YikpCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQk9PTF9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECisgICAgZGVmIF9fd3JpdGVCaW5hcnkoc2VsZiwgcyk6CisgICAgICAgIHNlbGYuX193cml0ZVNpemUobGVuKHMpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHMpCisgICAgd3JpdGVCaW5hcnkgPSB3cml0ZXIoX193cml0ZUJpbmFyeSkKIAotICBkZWYgX19yZWFkVUJ5dGUoc2VsZik6Ci0gICAgcmVzdWx0LCA9IHVucGFjaygnIUInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICB0eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgJiAweDBmID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICByZXR1cm4gKE5vbmUsIDAsIDApCisgICAgICAgIGRlbHRhID0gdHlwZSA+PiA0CisgICAgICAgIGlmIGRlbHRhID09IDA6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fcmVhZEkxNigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fbGFzdF9maWQgKyBkZWx0YQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKKyAgICAgICAgdHlwZSA9IHR5cGUgJiAweDBmCisgICAgICAgIGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuVFJVRToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKKyAgICAgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gVHJ1ZQorICAgICAgICBlbGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuRkFMU0U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECisgICAgICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfUkVBRAorICAgICAgICByZXR1cm4gKE5vbmUsIHNlbGYuX19nZXRUVHlwZSh0eXBlKSwgZmlkKQogCi0gIGRlZiBfX3JlYWRCeXRlKHNlbGYpOgotICAgIHJlc3VsdCwgPSB1bnBhY2soJyFiJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQotICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQk9PTF9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAogCi0gIGRlZiBfX3JlYWRWYXJpbnQoc2VsZik6Ci0gICAgcmV0dXJuIHJlYWRWYXJpbnQoc2VsZi50cmFucykKKyAgICBkZWYgX19yZWFkVUJ5dGUoc2VsZik6CisgICAgICAgIHJlc3VsdCwgPSB1bnBhY2soJyFCJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKLSAgZGVmIF9fcmVhZFppZ1phZyhzZWxmKToKLSAgICByZXR1cm4gZnJvbVppZ1phZyhzZWxmLl9fcmVhZFZhcmludCgpKQorICAgIGRlZiBfX3JlYWRCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchYicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiBfX3JlYWRTaXplKHNlbGYpOgotICAgIHJlc3VsdCA9IHNlbGYuX19yZWFkVmFyaW50KCkKLSAgICBpZiByZXN1bHQgPCAwOgotICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiTGVuZ3RoIDwgMCIpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiBfX3JlYWRWYXJpbnQoc2VsZik6CisgICAgICAgIHJldHVybiByZWFkVmFyaW50KHNlbGYudHJhbnMpCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKLSAgICBwcm90b19pZCA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIGlmIHByb3RvX2lkICE9IHNlbGYuUFJPVE9DT0xfSUQ6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICdCYWQgcHJvdG9jb2wgaWQgaW4gdGhlIG1lc3NhZ2U6ICVkJyAlIHByb3RvX2lkKQotICAgIHZlcl90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgdHlwZSA9ICh2ZXJfdHlwZSAmIHNlbGYuVFlQRV9NQVNLKSA+PiBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UCi0gICAgdmVyc2lvbiA9IHZlcl90eXBlICYgc2VsZi5WRVJTSU9OX01BU0sKLSAgICBpZiB2ZXJzaW9uICE9IHNlbGYuVkVSU0lPTjoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCi0gICAgICAgICAgJ0JhZCB2ZXJzaW9uOiAlZCAoZXhwZWN0ICVkKScgJSAodmVyc2lvbiwgc2VsZi5WRVJTSU9OKSkKLSAgICBzZXFpZCA9IHNlbGYuX19yZWFkVmFyaW50KCkKLSAgICBuYW1lID0gc2VsZi5fX3JlYWRTdHJpbmcoKQotICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCisgICAgZGVmIF9fcmVhZFppZ1phZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGZyb21aaWdaYWcoc2VsZi5fX3JlYWRWYXJpbnQoKSkKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gVkFMVUVfUkVBRAotICAgIGFzc2VydCBsZW4oc2VsZi5fX3N0cnVjdHMpID09IDAKLSAgICBzZWxmLnN0YXRlID0gQ0xFQVIKKyAgICBkZWYgX19yZWFkU2l6ZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fX3JlYWRWYXJpbnQoKQorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKCJMZW5ndGggPCAwIikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfUkVBRCwgVkFMVUVfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIHByb3RvX2lkID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHByb3RvX2lkICE9IHNlbGYuUFJPVE9DT0xfSUQ6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgcHJvdG9jb2wgaWQgaW4gdGhlIG1lc3NhZ2U6ICVkJyAlIHByb3RvX2lkKQorICAgICAgICB2ZXJfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICB0eXBlID0gKHZlcl90eXBlID4+IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpICYgc2VsZi5UWVBFX0JJVFMKKyAgICAgICAgdmVyc2lvbiA9IHZlcl90eXBlICYgc2VsZi5WRVJTSU9OX01BU0sKKyAgICAgICAgaWYgdmVyc2lvbiAhPSBzZWxmLlZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgdmVyc2lvbjogJWQgKGV4cGVjdCAlZCknICUgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCisgICAgICAgIHNlcWlkID0gc2VsZi5fX3JlYWRWYXJpbnQoKQorICAgICAgICBuYW1lID0gYmluYXJ5X3RvX3N0cihzZWxmLl9fcmVhZEJpbmFyeSgpKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQKLSAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQorICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLl9fc3RydWN0cykgPT0gMAogCi0gIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzaXplX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBzaXplID0gc2l6ZV90eXBlID4+IDQKLSAgICB0eXBlID0gc2VsZi5fX2dldFRUeXBlKHNpemVfdHlwZSkKLSAgICBpZiBzaXplID09IDE1OgotICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECi0gICAgcmV0dXJuIHR5cGUsIHNpemUKLSAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgotICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1JFQUQsIFZBTFVFX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gMAogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQotICAgIHR5cGVzID0gMAotICAgIGlmIHNpemUgPiAwOgotICAgICAgdHlwZXMgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICB2dHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcykKLSAgICBrdHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcyA+PiA0KQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAotICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFECisgICAgICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFELCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCi0gIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAotICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCi0gIHJlYWRNYXBFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNpemVfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBzaXplID0gc2l6ZV90eXBlID4+IDQKKyAgICAgICAgdHlwZSA9IHNlbGYuX19nZXRUVHlwZShzaXplX3R5cGUpCisgICAgICAgIGlmIHNpemUgPT0gMTU6CisgICAgICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECisgICAgICAgIHJldHVybiB0eXBlLCBzaXplCisgICAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCiAKLSAgZGVmIHJlYWRCb29sKHNlbGYpOgotICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9SRUFEOgotICAgICAgcmV0dXJuIHNlbGYuX19ib29sX3ZhbHVlCi0gICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFEOgotICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3JlYWRCeXRlKCkpCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sOiAlZCIgJSBzZWxmLnN0YXRlCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICB0eXBlcyA9IDAKKyAgICAgICAgaWYgc2l6ZSA+IDA6CisgICAgICAgICAgICB0eXBlcyA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICB2dHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcykKKyAgICAgICAga3R5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMgPj4gNCkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAorICAgICAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKIAotICByZWFkQnl0ZSA9IHJlYWRlcihfX3JlYWRCeXRlKQotICBfX3JlYWRJMTYgPSBfX3JlYWRaaWdaYWcKLSAgcmVhZEkxNiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCi0gIHJlYWRJMzIgPSByZWFkZXIoX19yZWFkWmlnWmFnKQotICByZWFkSTY0ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFELCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQorICAgIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTWFwRW5kID0gcmVhZENvbGxlY3Rpb25FbmQKIAotICBAcmVhZGVyCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchZCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1JFQUQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2Jvb2xfdmFsdWUgPT0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWRCeXRlKCkgPT0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbDogJWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUpCiAKLSAgZGVmIF9fcmVhZFN0cmluZyhzZWxmKToKLSAgICBsZW4gPSBzZWxmLl9fcmVhZFNpemUoKQotICAgIHJldHVybiBzZWxmLnRyYW5zLnJlYWRBbGwobGVuKQotICByZWFkU3RyaW5nID0gcmVhZGVyKF9fcmVhZFN0cmluZykKKyAgICByZWFkQnl0ZSA9IHJlYWRlcihfX3JlYWRCeXRlKQorICAgIF9fcmVhZEkxNiA9IF9fcmVhZFppZ1phZworICAgIHJlYWRJMTYgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIHJlYWRJMzIgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIHJlYWRJNjQgPSByZWFkZXIoX19yZWFkWmlnWmFnKQogCi0gIGRlZiBfX2dldFRUeXBlKHNlbGYsIGJ5dGUpOgotICAgIHJldHVybiBUVFlQRVNbYnl0ZSAmIDB4MGZdCisgICAgQHJlYWRlcgorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJzxkJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIF9fcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgIHJlYWRCaW5hcnkgPSByZWFkZXIoX19yZWFkQmluYXJ5KQorCisgICAgZGVmIF9fZ2V0VFR5cGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHJldHVybiBUVFlQRVNbYnl0ZSAmIDB4MGZdCiAKIAotY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQpCisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKFRDb21wYWN0UHJvdG9jb2wpOgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQ29tcGFjdFByb3RvY29sLgorCisgICAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVENvbXBhY3RQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVENvbXBhY3RQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVENvbXBhY3RQcm90b2NvbAorICAgIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQorICAgIHJlYXNvbi4KKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCisKKyAgICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCisgICAgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVENvbXBhY3RQcm90b2NvbC4KKyAgICAiIiIKICAgICBwYXNzCiAKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZmFsbGJhY2sgPSBrd2FyZ3MucG9wKCdmYWxsYmFjaycsIFRydWUpCisgICAgICAgIHN1cGVyKFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfY29tcGFjdAorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9jb21wYWN0CisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLl9mYWxsYmFjayA9IGZhbGxiYWNrCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2E3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpAQCAtMCwwICsxLDIyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USGVhZGVyVHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0LCBUSGVhZGVyU3VicHJvdG9jb2xJRCwgVEhlYWRlckNsaWVudFR5cGUKKworCitQUk9UT0NPTFNfQllfSUQgPSB7CisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZOiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUOiBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsCit9CisKKworY2xhc3MgVEhlYWRlclByb3RvY29sKFRQcm90b2NvbEJhc2UpOgorICAgICIiIkEgZnJhbWVkIHByb3RvY29sIHdpdGggaGVhZGVycyBhbmQgcGF5bG9hZCB0cmFuc2Zvcm1zLgorCisgICAgVEhlYWRlclByb3RvY29sIGZyYW1lcyBvdGhlciBUaHJpZnQgcHJvdG9jb2xzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIG9wdGlvbmFsCisgICAgb3V0LW9mLWJhbmQgaGVhZGVycy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3VicHJvdG9jb2xzIGFyZQorICAgIFRCaW5hcnlQcm90b2NvbCBhbmQgVENvbXBhY3RQcm90b2NvbC4KKworICAgIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIHRoZSBlbmNvZGVkIG1lc3NhZ2UgcGF5bG9hZC4gVGhlCisgICAgb25seSB0cmFuc2Zvcm0gY3VycmVudGx5IHN1cHBvcnRlZCBpcyB0byBnemlwLgorCisgICAgV2hlbiB1c2VkIGluIGEgc2VydmVyLCBUSGVhZGVyUHJvdG9jb2wgY2FuIGFjY2VwdCBtZXNzYWdlcyBmcm9tCisgICAgbm9uLVRIZWFkZXJQcm90b2NvbCBjbGllbnRzIGlmIGFsbG93ZWQgKHNlZSBgYWxsb3dlZF9jbGllbnRfdHlwZXNgKS4gVGhpcworICAgIGluY2x1ZGVzIGZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhbmQgYm90aCBUQmluYXJ5UHJvdG9jb2wgYW5kCisgICAgVENvbXBhY3RQcm90b2NvbC4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxlY3QgZm9yCisgICAgdGhlIGNvbm5lY3RlZCBjbGllbnQuIEhUVFAgY2xpZW50cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgVEhUVFBTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwKKyAgICBvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuCisKKyAgICBTZWUgZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBmb3IgZGV0YWlscyBvZiB0aGUgd2lyZSBmb3JtYXQuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgIyBtdWNoIG9mIHRoZSBhY3R1YWwgd29yayBmb3IgVEhlYWRlclByb3RvY29sIGhhcHBlbnMgZG93biBpbgorICAgICAgICAjIFRIZWFkZXJUcmFuc3BvcnQgc2luY2Ugd2UgbmVlZCB0byBkbyBsb3ctbGV2ZWwgc2hlbmFuaWdhbnMgdG8gZGV0ZWN0CisgICAgICAgICMgaWYgdGhlIGNsaWVudCBpcyBzZW5kaW5nIHVzIGhlYWRlcnMgb3Igb25lIG9mIHRoZSBoZWFkZXJsZXNzIGZvcm1hdHMKKyAgICAgICAgIyB3ZSBzdXBwb3J0LiB0aGlzIHdyYXBzIHRoZSByZWFsIHRyYW5zcG9ydCB3aXRoIHRoZSBvbmUgdGhhdCBkb2VzIGFsbAorICAgICAgICAjIHRoZSBtYWdpYy4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHJhbnNwb3J0LCBUSGVhZGVyVHJhbnNwb3J0KToKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IFRIZWFkZXJUcmFuc3BvcnQodHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcykKKyAgICAgICAgc3VwZXIoVEhlYWRlclByb3RvY29sLCBzZWxmKS5fX2luaXRfXyh0cmFuc3BvcnQpCisgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLmdldF9oZWFkZXJzKCkKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLnRyYW5zLnNldF9oZWFkZXIoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zLmNsZWFyX2hlYWRlcnMoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgc2VsZi50cmFucy5hZGRfdHJhbnNmb3JtKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnRyYW5zLnNlcXVlbmNlX2lkID0gc2VxaWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBmaWQpCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpCisKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRFbmQoKQorCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJvb2woYm9vbF92YWwpCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCeXRlKGJ5dGUpCisKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTE2KGkxNikKKworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMzIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUk2NChpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRG91YmxlKGR1YikKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQmluYXJ5KHN0cl92YWwpCisKKyAgICBkZWYgX3NldF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvdG9jb2xfY2xzID0gUFJPVE9DT0xTX0JZX0lEW3NlbGYudHJhbnMucHJvdG9jb2xfaWRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBwcm90b2NvbCByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbCA9IHByb3RvY29sX2NscyhzZWxmLnRyYW5zKQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2VuY29kZQorICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2RlY29kZQorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHJhbnMucmVhZEZyYW1lKDApCisgICAgICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKGIiIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgMCkKKyAgICAgICAgICAgIGV4Yy53cml0ZShzZWxmLl9wcm90b2NvbCkKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgICAgICBzZWxmLnRyYW5zLmZsdXNoKCkKKworICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwRW5kKCkKKworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEVuZCgpCisKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEJlZ2luKCkKKworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEVuZCgpCisKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQm9vbCgpCisKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQnl0ZSgpCisKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMTYoKQorCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTMyKCkKKworICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEk2NCgpCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWREb3VibGUoKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQmluYXJ5KCkKKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbG93ZWRfY2xpZW50X3R5cGVzPShUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLCkpOgorICAgICAgICBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzID0gYWxsb3dlZF9jbGllbnRfdHlwZXMKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUSGVhZGVyUHJvdG9jb2wodHJhbnMsIHNlbGYuYWxsb3dlZF9jbGllbnRfdHlwZXMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyMDk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQpAQCAtMCwwICsxLDY3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgKFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMpCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgbWF0aAoraW1wb3J0IHN5cworCitmcm9tIC4uY29tcGF0IGltcG9ydCBzdHJfdG9fYmluYXJ5CisKKworX19hbGxfXyA9IFsnVEpTT05Qcm90b2NvbCcsCisgICAgICAgICAgICdUSlNPTlByb3RvY29sRmFjdG9yeScsCisgICAgICAgICAgICdUU2ltcGxlSlNPTlByb3RvY29sJywKKyAgICAgICAgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5J10KKworVkVSU0lPTiA9IDEKKworQ09NTUEgPSBiJywnCitDT0xPTiA9IGInOicKK0xCUkFDRSA9IGIneycKK1JCUkFDRSA9IGInfScKK0xCUkFDS0VUID0gYidbJworUkJSQUNLRVQgPSBiJ10nCitRVU9URSA9IGInIicKK0JBQ0tTTEFTSCA9IGInXFwnCitaRVJPID0gYicwJworCitFU0NTRVEwID0gb3JkKCdcXCcpCitFU0NTRVExID0gb3JkKCd1JykKK0VTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgJyInOiAnXFwiJywKKyAgICAnXFwnOiAnXFxcXCcsCisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1x0JzogJ1xcdCcsCisgICAgIyAnLyc6ICdcXC8nLAorfQorRVNDQVBFX0NIQVJTID0geworICAgIGInIic6ICciJywKKyAgICBiJ1xcJzogJ1xcJywKKyAgICBiJ2InOiAnXGInLAorICAgIGInZic6ICdcZicsCisgICAgYiduJzogJ1xuJywKKyAgICBiJ3InOiAnXHInLAorICAgIGIndCc6ICdcdCcsCisgICAgYicvJzogJy8nLAorfQorTlVNRVJJQ19DSEFSID0gYicrLS4wMTIzNDU2Nzg5RWUnCisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5CT09MOiAndGYnLAorICAgIFRUeXBlLkJZVEU6ICdpOCcsCisgICAgVFR5cGUuSTE2OiAnaTE2JywKKyAgICBUVHlwZS5JMzI6ICdpMzInLAorICAgIFRUeXBlLkk2NDogJ2k2NCcsCisgICAgVFR5cGUuRE9VQkxFOiAnZGJsJywKKyAgICBUVHlwZS5TVFJJTkc6ICdzdHInLAorICAgIFRUeXBlLlNUUlVDVDogJ3JlYycsCisgICAgVFR5cGUuTElTVDogJ2xzdCcsCisgICAgVFR5cGUuU0VUOiAnc2V0JywKKyAgICBUVHlwZS5NQVA6ICdtYXAnLAorfQorCitKVFlQRVMgPSB7fQorZm9yIGtleSBpbiBDVFlQRVMua2V5cygpOgorICAgIEpUWVBFU1tDVFlQRVNba2V5XV0gPSBrZXkKKworCitjbGFzcyBKU09OQmFzZUNvbnRleHQob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLmZpcnN0ID0gVHJ1ZQorCisgICAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworCitjbGFzcyBKU09OTGlzdENvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdCBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdW5jdGlvbihDT01NQSkKKworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorCisKK2NsYXNzIEpTT05QYWlyQ29udGV4dChKU09OQmFzZUNvbnRleHQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc3VwZXIoSlNPTlBhaXJDb250ZXh0LCBzZWxmKS5fX2luaXRfXyhwcm90b2NvbCkKKyAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgorCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC5yZWFkSlNPTlN5bnRheENoYXIpCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2xvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKKworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIoKToKKyAgICBoYXNEYXRhID0gRmFsc2UKKyAgICBkYXRhID0gJycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisKKyAgICBkZWYgcGVlayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCisgICAgICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCisKK2NsYXNzIFRKU09OUHJvdG9jb2xCYXNlKFRQcm90b2NvbEJhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCisKKyAgICAjIFdlIGRvbid0IGhhdmUgbGVuZ3RoIGxpbWl0IGltcGxlbWVudGF0aW9uIGZvciBKU09OIHByb3RvY29scworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVzZXRXcml0ZUNvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorICAgICAgICBzZWxmLmNvbnRleHRTdGFjayA9IFtzZWxmLmNvbnRleHRdCisKKyAgICBkZWYgcmVzZXRSZWFkQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVhZGVyID0gTG9va2FoZWFkUmVhZGVyKHNlbGYpCisKKyAgICBkZWYgcHVzaENvbnRleHQoc2VsZiwgY3R4KToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2suYXBwZW5kKGN0eCkKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gY3R4CisKKyAgICBkZWYgcG9wQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorCisgICAgZGVmIHdyaXRlSlNPTlN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBqc29uX3N0ciA9IFsnIiddCisgICAgICAgIGZvciBzIGluIHN0cmluZzoKKyAgICAgICAgICAgIGVzY2FwZWQgPSBFU0NBUEVfQ0hBUl9WQUxTLmdldChzLCBzKQorICAgICAgICAgICAganNvbl9zdHIuYXBwZW5kKGVzY2FwZWQpCisgICAgICAgIGpzb25fc3RyLmFwcGVuZCgnIicpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoc3RyX3RvX2JpbmFyeSgnJy5qb2luKGpzb25fc3RyKSkpCisKKyAgICBkZWYgd3JpdGVKU09OTnVtYmVyKHNlbGYsIG51bWJlciwgZm9ybWF0dGVyPSd7MH0nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNOdW1iZXIgPSBzdHIoZm9ybWF0dGVyLmZvcm1hdChudW1iZXIpKS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShqc051bWJlcikKKworICAgIGRlZiB3cml0ZUpTT05CYXNlNjQoc2VsZiwgYmluYXJ5KToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShiYXNlNjQuYjY0ZW5jb2RlKGJpbmFyeSkpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05PYmplY3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNFKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNLRVQpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDS0VUKQorCisgICAgZGVmIHJlYWRKU09OU3ludGF4Q2hhcihzZWxmLCBjaGFyYWN0ZXIpOgorICAgICAgICBjdXJyZW50ID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgIGlmIGNoYXJhY3RlciAhPSBjdXJyZW50OgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAlcyIgJSBjdXJyZW50KQorCisgICAgZGVmIF9pc0hpZ2hTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkODAwIGFuZCBjb2RldW5pdCA8PSAweGRiZmYKKworICAgIGRlZiBfaXNMb3dTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkYzAwIGFuZCBjb2RldW5pdCA8PSAweGRmZmYKKworICAgIGRlZiBfdG9DaGFyKHNlbGYsIGhpZ2gsIGxvdz1Ob25lKToKKyAgICAgICAgaWYgbm90IGxvdzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJcXHUlMDR4IiAlIGhpZ2gpLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihoaWdoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKQorICAgICAgICAgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcyA9ICJcXFUlMDh4IiAlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihjb2RlcG9pbnQpCisKKyAgICBkZWYgcmVhZEpTT05TdHJpbmcoc2VsZiwgc2tpcENvbnRleHQpOgorICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICBzdHJpbmcgPSBbXQorICAgICAgICBpZiBza2lwQ29udGV4dCBpcyBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgIGlmIGNoYXJhY3RlciA9PSBRVU9URToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMDoKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBvcmQoY2hhcmFjdGVyKSA9PSBFU0NTRVExOgorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnRyYW5zLnJlYWQoNCkuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0ID0gaW50KGNoYXJhY3RlciwgMTYpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzSGlnaFN1cnJvZ2F0ZShjb2RldW5pdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gY29kZXVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5faXNMb3dTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLl90b0NoYXIoaGlnaFN1cnJvZ2F0ZSwgY29kZXVuaXQpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGNvZGV1bml0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXJhY3RlciBub3QgaW4gRVNDQVBFX0NIQVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IEVTQ0FQRV9DSEFSU1tjaGFyYWN0ZXJdCisgICAgICAgICAgICBlbGlmIGNoYXJhY3RlciBpbiBFU0NBUEVfQ0hBUl9WQUxTOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5lc2NhcGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOgorICAgICAgICAgICAgICAgIHV0ZjhfYnl0ZXMgPSBieXRlYXJyYXkoW29yZChjaGFyYWN0ZXIpXSkKKyAgICAgICAgICAgICAgICB3aGlsZSBvcmQoc2VsZi5yZWFkZXIucGVlaygpKSA+PSAweDgwOgorICAgICAgICAgICAgICAgICAgICB1dGY4X2J5dGVzLmFwcGVuZChvcmQoc2VsZi5yZWFkZXIucmVhZCgpKSkKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB1dGY4X2J5dGVzLmRlY29kZSgndXRmOCcpCisgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGNoYXJhY3RlcikKKworICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKKworICAgIGRlZiBpc0pTT05OdW1lcmljKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQorCisgICAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgorICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpKToKKyAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorCisgICAgZGVmIHJlYWRKU09OTnVtZXJpY0NoYXJzKHNlbGYpOgorICAgICAgICBudW1lcmljID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKG51bWVyaWMpLmRlY29kZSgnYXNjaWknKQorCisgICAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludChudW1lcmljKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKworICAgIGRlZiByZWFkSlNPTkRvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6CisgICAgICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG91YmxlID0gZmxvYXQoc3RyaW5nKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05CYXNlNjQoc2VsZik6CisgICAgICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHNpemUgPSBsZW4oc3RyaW5nKQorICAgICAgICBtID0gc2l6ZSAlIDQKKyAgICAgICAgIyBGb3JjZSBwYWRkaW5nIHNpbmNlIGI2NGVuY29kZSBtZXRob2QgZG9lcyBub3QgYWxsb3cgaXQKKyAgICAgICAgaWYgbSAhPSAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCAtIG0pOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAnPScKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorCisgICAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpCisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICAgICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKKworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICB0dHlwZSA9IDAKKyAgICAgICAgaWQgPSAwCisgICAgICAgIGlmIGNoYXJhY3RlciA9PSBSQlJBQ0U6CisgICAgICAgICAgICB0dHlwZSA9IFRUeXBlLlNUT1AKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICByZXR1cm4gKE5vbmUsIHR0eXBlLCBpZCkKKworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBrZXlUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICB2YWx1ZVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHJldHVybiAoZWxlbVR5cGUsIHNpemUpCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCisgICAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICByZXR1cm4gKEZhbHNlIGlmIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkgPT0gMCBlbHNlIFRydWUpCisKKyAgICBkZWYgcmVhZE51bWJlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICByZWFkQnl0ZSA9IHJlYWROdW1iZXIKKyAgICByZWFkSTE2ID0gcmVhZE51bWJlcgorICAgIHJlYWRJMzIgPSByZWFkTnVtYmVyCisgICAgcmVhZEk2NCA9IHJlYWROdW1iZXIKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkRvdWJsZSgpCisKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05CYXNlNjQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoVkVSU0lPTikKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIocmVxdWVzdF90eXBlKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1trdHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKKworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhieXRlLCA4KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihieXRlKQorCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMTYsIDE2KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMTYpCisKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6CisgICAgICAgICMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIHNob3VsZCBiZSBqdXN0IGVub3VnaCBmb3IgYW55IGRvdWJsZSBwcmVjaXNpb24KKyAgICAgICAgIyB2YWx1ZS4KKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsLCAnezA6LjE3Z30nKQorCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkJhc2U2NChiaW5hcnkpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbCh0cmFucykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisgICAgIiIiU2ltcGxlLCByZWFkYWJsZSwgd3JpdGUtb25seSBKU09OIHByb3RvY29sLgorCisgICAgVXNlZnVsIGZvciBpbnRlcmFjdGluZyB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXMuCisgICAgIiIiCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKworICAgIGRlZiBfd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB3cml0ZUxpc3RCZWdpbiA9IF93cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEVuZCA9IF93cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZVNldEJlZ2luID0gX3dyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgd3JpdGVTZXRFbmQgPSBfd3JpdGVDb2xsZWN0aW9uRW5kCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoYnl0ZSwgOCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMzIsIDMyKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGk2NCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwpCisKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKKworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeShvYmplY3QpOgorCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjgzOTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IKKworU0VQQVJBVE9SID0gIjoiCisKKworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBzZXJ2aWNlTmFtZSk6CisgICAgICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgaWYgKHR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgb3IKKyAgICAgICAgICAgICAgICB0eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpOgorICAgICAgICAgICAgc3VwZXIoVE11bHRpcGxleGVkUHJvdG9jb2wsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBuYW1lLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgc2VxaWQKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKaW5kZXggYmUzY2IxNC4uODMxNGNmNiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKQEAgLTE3LDE4OSArMTcsNDA0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbiwgVFR5cGUsIFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorZnJvbSAuLmNvbXBhdCBpbXBvcnQgYmluYXJ5X3RvX3N0ciwgc3RyX3RvX2JpbmFyeQorCitpbXBvcnQgc2l4CitpbXBvcnQgc3lzCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgemlwCisKIAogY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkN1c3RvbSBQcm90b2NvbCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgVU5LTk9XTiA9IDAKKyAgICBJTlZBTElEX0RBVEEgPSAxCisgICAgTkVHQVRJVkVfU0laRSA9IDIKKyAgICBTSVpFX0xJTUlUID0gMworICAgIEJBRF9WRVJTSU9OID0gNAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgICBJTlZBTElEX1BST1RPQ09MID0gNwogCi0gIFVOS05PV04gPSAwCi0gIElOVkFMSURfREFUQSA9IDEKLSAgTkVHQVRJVkVfU0laRSA9IDIKLSAgU0laRV9MSU1JVCA9IDMKLSAgQkFEX1ZFUlNJT04gPSA0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQogCi1jbGFzcyBUUHJvdG9jb2xCYXNlOgorY2xhc3MgVFByb3RvY29sQmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgorICAgICAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gTm9uZQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgc2VsZi50cmFucyA9IHRyYW5zCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY2hlY2tfbGVuZ3RoKGxpbWl0LCBsZW5ndGgpOgorICAgICAgICBpZiBsZW5ndGggPCAwOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOZWdhdGl2ZSBsZW5ndGg6ICVkJyAlIGxlbmd0aCkKKyAgICAgICAgaWYgbGltaXQgaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+IGxpbWl0OgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlNJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICVkJyAlIGxpbWl0KQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHNlbGYud3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShzdHJfdmFsKSkKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVVdGY4KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBzZWxmLndyaXRlU3RyaW5nKHN0cl92YWwuZW5jb2RlKCd1dGY4JykpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEkxNihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMzIoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU3RyaW5nKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBza2lwKHNlbGYsIHR5cGUpOgotICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybgotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5CT09MOgotICAgICAgc2VsZi5yZWFkQm9vbCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkJZVEU6Ci0gICAgICBzZWxmLnJlYWRCeXRlKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTE2OgotICAgICAgc2VsZi5yZWFkSTE2KCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgc2VsZi5yZWFkSTMyKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuSTY0OgotICAgICAgc2VsZi5yZWFkSTY0KCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuRE9VQkxFOgotICAgICAgc2VsZi5yZWFkRG91YmxlKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgc2VsZi5yZWFkU3RyaW5nKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU1RSVUNUOgotICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIChuYW1lLCB0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYuc2tpcCh0eXBlKQotICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCi0gICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5NQVA6Ci0gICAgICAoa3R5cGUsIHZ0eXBlLCBzaXplKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKLSAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoa3R5cGUpCi0gICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKLSAgICAgIHNlbGYucmVhZE1hcEVuZCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLlNFVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCi0gICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKLSAgICAgICAgc2VsZi5za2lwKGV0eXBlKQotICAgICAgc2VsZi5yZWFkU2V0RW5kKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuTElTVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQotICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLWNsYXNzIFRQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gYmluYXJ5X3RvX3N0cihzZWxmLnJlYWRCaW5hcnkoKSkKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZFV0Zjgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0ZjgnKQorCisgICAgZGVmIHNraXAoc2VsZiwgdHR5cGUpOgorICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYucmVhZEJvb2woKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJZVEU6CisgICAgICAgICAgICBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMTY6CisgICAgICAgICAgICBzZWxmLnJlYWRJMTYoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICAgIHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTY0OgorICAgICAgICAgICAgc2VsZi5yZWFkSTY0KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgICBzZWxmLnJlYWREb3VibGUoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgIHNlbGYucmVhZFN0cmluZygpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgKG5hbWUsIHR0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh0dHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGt0eXBlKQorICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZE1hcEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU0VUOgorICAgICAgICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZFNldEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGV0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisKKyAgICAjIHR1cGxlIG9mOiAoICdyZWFkZXIgbWV0aG9kJyBuYW1lLCBpc19jb250YWluZXIgYm9vbCwgJ3dyaXRlcl9tZXRob2QnIG5hbWUgKQorICAgIF9UVFlQRV9IQU5ETEVSUyA9ICgKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMCBUVHlwZS5TVE9QCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDEgVFR5cGUuVk9JRCAjIFRPRE86IGhhbmRsZSB2b2lkPworICAgICAgICAoJ3JlYWRCb29sJywgJ3dyaXRlQm9vbCcsIEZhbHNlKSwgICMgMiBUVHlwZS5CT09MCisgICAgICAgICgncmVhZEJ5dGUnLCAnd3JpdGVCeXRlJywgRmFsc2UpLCAgIyAzIFRUeXBlLkJZVEUgYW5kIEkwOAorICAgICAgICAoJ3JlYWREb3VibGUnLCAnd3JpdGVEb3VibGUnLCBGYWxzZSksICAjIDQgVFR5cGUuRE9VQkxFCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDUgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEkxNicsICd3cml0ZUkxNicsIEZhbHNlKSwgICMgNiBUVHlwZS5JMTYKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNyB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTMyJywgJ3dyaXRlSTMyJywgRmFsc2UpLCAgIyA4IFRUeXBlLkkzMgorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA5IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJNjQnLCAnd3JpdGVJNjQnLCBGYWxzZSksICAjIDEwIFRUeXBlLkk2NAorICAgICAgICAoJ3JlYWRTdHJpbmcnLCAnd3JpdGVTdHJpbmcnLCBGYWxzZSksICAjIDExIFRUeXBlLlNUUklORyBhbmQgVVRGNworICAgICAgICAoJ3JlYWRDb250YWluZXJTdHJ1Y3QnLCAnd3JpdGVDb250YWluZXJTdHJ1Y3QnLCBUcnVlKSwgICMgMTIgKi5TVFJVQ1QKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyTWFwJywgJ3dyaXRlQ29udGFpbmVyTWFwJywgVHJ1ZSksICAjIDEzIFRUeXBlLk1BUAorICAgICAgICAoJ3JlYWRDb250YWluZXJTZXQnLCAnd3JpdGVDb250YWluZXJTZXQnLCBUcnVlKSwgICMgMTQgVFR5cGUuU0VUCisgICAgICAgICgncmVhZENvbnRhaW5lckxpc3QnLCAnd3JpdGVDb250YWluZXJMaXN0JywgVHJ1ZSksICAjIDE1IFRUeXBlLkxJU1QKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMTYgVFR5cGUuVVRGOCAjIFRPRE86IGhhbmRsZSB1dGY4IHR5cGVzPworICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpICAjIDE3IFRUeXBlLlVURjE2ICMgVE9ETzogaGFuZGxlIHV0ZjE2IHR5cGVzPworICAgICkKKworICAgIGRlZiBfdHR5cGVfaGFuZGxlcnMoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICBpZiBzcGVjID09ICdCSU5BUlknOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgYmluYXJ5IGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkQmluYXJ5JywgJ3dyaXRlQmluYXJ5JywgRmFsc2UpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3BlYyA9PSAnVVRGOCc6CisgICAgICAgICAgICBpZiB0dHlwZSAhPSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBzdHJpbmcgZmllbGQgdHlwZSAlZCcgJSB0dHlwZSkKKyAgICAgICAgICAgIHJldHVybiAoJ3JlYWRVdGY4JywgJ3dyaXRlVXRmOCcsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdIGlmIHR0eXBlIDwgbGVuKHNlbGYuX1RUWVBFX0hBTkRMRVJTKSBlbHNlIChOb25lLCBOb25lLCBGYWxzZSkKKworICAgIGRlZiBfcmVhZF9ieV90dHlwZShzZWxmLCB0dHlwZSwgc3BlYywgZXNwZWMpOgorICAgICAgICByZWFkZXJfbmFtZSwgXywgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIGVzcGVjKQorICAgICAgICBpZiByZWFkZXJfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIHR5cGUgJWQnICUgKHR0eXBlKSkKKyAgICAgICAgcmVhZGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHJlYWRlcl9uYW1lKQorICAgICAgICByZWFkID0gKGxhbWJkYTogcmVhZGVyX2Z1bmMoZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSByZWFkZXJfZnVuYworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgcmVhZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6CisgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHNwZWMpKQorCisgICAgZGVmIHJlYWRDb250YWluZXJMaXN0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKGxpc3RfdHlwZSwgbGlzdF9sZW4pID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgbGlzdF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAodHVwbGUgaWYgaXNfaW1tdXRhYmxlIGVsc2UgbGlzdCkoZWxlbXMpCisgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRDb250YWluZXJTZXQoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAoc2V0X3R5cGUsIHNldF9sZW4pID0gc2VsZi5yZWFkU2V0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBzZXRfbGVuKQorICAgICAgICByZXN1bHRzID0gKGZyb3plbnNldCBpZiBpc19pbW11dGFibGUgZWxzZSBzZXQpKGVsZW1zKQorICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRDb250YWluZXJTdHJ1Y3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIChvYmpfY2xhc3MsIG9ial9zcGVjKSA9IHNwZWMKKyAgICAgICAgb2JqID0gb2JqX2NsYXNzKCkKKyAgICAgICAgb2JqLnJlYWQoc2VsZikKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6CisgICAgICAgIGt0eXBlLCBrc3BlYywgdnR5cGUsIHZzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChtYXBfa3R5cGUsIG1hcF92dHlwZSwgbWFwX2xlbikgPSBzZWxmLnJlYWRNYXBCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKKyAgICAgICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCisgICAgICAgIGtleXMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKGt0eXBlLCBzcGVjLCBrc3BlYykKKyAgICAgICAgdmFscyA9IHNlbGYuX3JlYWRfYnlfdHR5cGUodnR5cGUsIHNwZWMsIHZzcGVjKQorICAgICAgICBrZXl2YWxzID0gaXNsaWNlKHppcChrZXlzLCB2YWxzKSwgbWFwX2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChURnJvemVuRGljdCBpZiBpc19pbW11dGFibGUgZWxzZSBkaWN0KShrZXl2YWxzKQorICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYywgaXNfaW1tdXRhYmxlPUZhbHNlKToKKyAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgZmllbGRzID0ge30KKyAgICAgICAgc2VsZi5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpZWxkID0gdGhyaWZ0X3NwZWNbZmlkXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBpcyBub3QgTm9uZSBhbmQgZnR5cGUgPT0gZmllbGRbMV06CisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoZnR5cGUsIGZzcGVjKQorICAgICAgICAgICAgICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZm5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIHJldHVybiBvYmooKipmaWVsZHMpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJTdHJ1Y3Qoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAgdmFsLndyaXRlKHNlbGYpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJMaXN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZUxpc3RCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZUxpc3RFbmQoKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZVNldEJlZ2luKHR0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIHZhbCwgc3BlYywgdHNwZWMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlU2V0RW5kKCkKKworICAgIGRlZiB3cml0ZUNvbnRhaW5lck1hcChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHppcChzZWxmLl93cml0ZV9ieV90dHlwZShrdHlwZSwgc2l4Lml0ZXJrZXlzKHZhbCksIHNwZWMsIGtzcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHZ0eXBlLCBzaXguaXRlcnZhbHVlcyh2YWwpLCBzcGVjLCB2c3BlYykpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEJlZ2luKG9iai5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKKyAgICAgICAgICAgIGlmIGZpZWxkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCBmbmFtZSkKKyAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgc2tpcCB3cml0aW5nIG91dCB1bnNldCBmaWVsZHMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlkID0gZmllbGRbMF0KKyAgICAgICAgICAgIGZ0eXBlID0gZmllbGRbMV0KKyAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkQnlUVHlwZShmdHlwZSwgdmFsLCBmc3BlYykKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBzZWxmLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiBfd3JpdGVfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHZhbHMsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgXywgd3JpdGVyX25hbWUsIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgd3JpdGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHdyaXRlcl9uYW1lKQorICAgICAgICB3cml0ZSA9IChsYW1iZGEgdjogd3JpdGVyX2Z1bmModiwgZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSB3cml0ZXJfZnVuYworICAgICAgICBmb3IgdiBpbiB2YWxzOgorICAgICAgICAgICAgeWllbGQgd3JpdGUodikKKworICAgIGRlZiB3cml0ZUZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgdmFsLCBzcGVjKToKKyAgICAgICAgbmV4dChzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgW3ZhbF0sIHNwZWMsIHNwZWMpKQorCisKK2RlZiBjaGVja0ludGVnZXJMaW1pdHMoaSwgYml0cyk6CisgICAgaWYgYml0cyA9PSA4IGFuZCAoaSA8IC0xMjggb3IgaSA+IDEyNyk6CisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk4IHJlcXVpcmVzIC0xMjggPD0gbnVtYmVyIDw9IDEyNyIpCisgICAgZWxpZiBiaXRzID09IDE2IGFuZCAoaSA8IC0zMjc2OCBvciBpID4gMzI3NjcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMTYgcmVxdWlyZXMgLTMyNzY4IDw9IG51bWJlciA8PSAzMjc2NyIpCisgICAgZWxpZiBiaXRzID09IDMyIGFuZCAoaSA8IC0yMTQ3NDgzNjQ4IG9yIGkgPiAyMTQ3NDgzNjQ3KToKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIHJlcXVpcmVzIC0yMTQ3NDgzNjQ4IDw9IG51bWJlciA8PSAyMTQ3NDgzNjQ3IikKKyAgICBlbGlmIGJpdHMgPT0gNjQgYW5kIChpIDwgLTkyMjMzNzIwMzY4NTQ3NzU4MDggb3IgaSA+IDkyMjMzNzIwMzY4NTQ3NzU4MDcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgcmVxdWlyZXMgLTkyMjMzNzIwMzY4NTQ3NzU4MDggPD0gbnVtYmVyIDw9IDkyMjMzNzIwMzY4NTQ3NzU4MDciKQorCisKK2NsYXNzIFRQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTQ2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3Iob2JqZWN0KToKKyAgICBkZWYgX19uZXdfXyhjbHMsIHByb3RvY29sLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBkZWNvcmF0ZWRfY2xzID0gdHlwZSgnJy5qb2luKFsnRGVjb3JhdGVkJywgcHJvdG9jb2wuX19jbGFzc19fLl9fbmFtZV9fXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbHMsIHByb3RvY29sLl9fY2xhc3NfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLl9fZGljdF9fKQorICAgICAgICByZXR1cm4gb2JqZWN0Ll9fbmV3X18oZGVjb3JhdGVkX2NscykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CmluZGV4IDAxYmZlMTguLjcxNDhmNjYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQpAQCAtMTcsNCArMTcsNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotX19hbGxfXyA9IFsnVFByb3RvY29sJywgJ1RCaW5hcnlQcm90b2NvbCcsICdmYXN0YmluYXJ5J10KK19fYWxsX18gPSBbJ2Zhc3RiaW5hcnknLCAnVEJhc2UnLCAnVEJpbmFyeVByb3RvY29sJywgJ1RDb21wYWN0UHJvdG9jb2wnLAorICAgICAgICAgICAnVEpTT05Qcm90b2NvbCcsICdUUHJvdG9jb2wnXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMgYi9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMjE1YS4uMDAwMDAwMAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0jaW5jbHVkZSAiY1N0cmluZ0lPLmgiCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KLSNpZiBkZWZpbmVkIChfX1NWUjQpICYmIGRlZmluZWQgKF9fc3VuKQotICNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCi0gICNkZWZpbmUgX19pMzg2X18KLSAjZW5kaWYKLQotICNpZm5kZWYgQklHX0VORElBTgotICAjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCi0gI2VuZGlmCi0gI2lmbmRlZiBMSVRUTEVfRU5ESUFOCi0gICNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSAjZW5kaWYKLQotIC8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLwotICNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotICNlbmRpZgotI2VuZGlmCi0KLS8vIFRPRE8oZHJlaXNzKTogZGVmdmFsIGFwcGVhcnMgdG8gYmUgdW51c2VkLiAgTG9vayBpbnRvIHJlbW92aW5nIGl0LgotLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHBhcnNlX3NwZWNfYXJncyByZWN1cnNpdmUsIGFuZCBjYWNoZSB0aGUgb3V0cHV0Ci0vLyAgICAgICAgICAgICAgIHBlcm1hbmVudGx5IGluIHRoZSBvYmplY3QuICAoTWFsbG9jIGFuZCBvcnBoYW4uKQotLy8gVE9ETyhkcmVpc3MpOiBXaHkgZG8gd2UgbmVlZCBjU3RyaW5nSU8gZm9yIHJlYWRpbmcsIHdoeSBub3QganVzdCBjaGFyKj8KLS8vICAgICAgICAgICAgICAgQ2FuIGNTdHJpbmdJTyBsZXQgdXMgd29yayB3aXRoIGEgQnVmZmVyZWRUcmFuc3BvcnQ/Ci0vLyBUT0RPKGRyZWlzcyk6IERvbid0IGlnbm9yZSB0aGUgcnYgZnJvbSBjd3JpdGUgKG1heWJlKS4KLQotLyogPT09PT09IEJFR0lOIFVUSUxJVElFUyA9PT09PT0gKi8KLQotI2RlZmluZSBJTklUX09VVEJVRl9TSVpFIDEyOAotCi0vLyBTdG9sZW4gb3V0IG9mIFRQcm90b2NvbC5oLgotLy8gSXQgd291bGQgYmUgYSBodWdlIHBhaW4gdG8gaGF2ZSBib3RoIGdldCB0aGlzIGZyb20gb25lIHBsYWNlLgotdHlwZWRlZiBlbnVtIFRUeXBlIHsKLSAgVF9TVE9QICAgICAgID0gMCwKLSAgVF9WT0lEICAgICAgID0gMSwKLSAgVF9CT09MICAgICAgID0gMiwKLSAgVF9CWVRFICAgICAgID0gMywKLSAgVF9JMDggICAgICAgID0gMywKLSAgVF9JMTYgICAgICAgID0gNiwKLSAgVF9JMzIgICAgICAgID0gOCwKLSAgVF9VNjQgICAgICAgID0gOSwKLSAgVF9JNjQgICAgICAgID0gMTAsCi0gIFRfRE9VQkxFICAgICA9IDQsCi0gIFRfU1RSSU5HICAgICA9IDExLAotICBUX1VURjcgICAgICAgPSAxMSwKLSAgVF9TVFJVQ1QgICAgID0gMTIsCi0gIFRfTUFQICAgICAgICA9IDEzLAotICBUX1NFVCAgICAgICAgPSAxNCwKLSAgVF9MSVNUICAgICAgID0gMTUsCi0gIFRfVVRGOCAgICAgICA9IDE2LAotICBUX1VURjE2ICAgICAgPSAxNwotfSBUVHlwZTsKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KLSMgZWxzZQotIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBTYW1lIGNvbW1lbnQgYXMgdGhlIGVudW0uICBTb3JyeS4KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jIGRlZmluZSBudG9obGwobikgKG4pCi0jIGRlZmluZSBodG9ubGwobikgKG4pCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KLSNkZWZpbmUgSU5URVJOX1NUUklORyh2YWx1ZSkgX2ludGVybl8gIyMgdmFsdWUKLQotI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoICgodikgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkgKQotI2RlZmluZSBDSEVDS19SQU5HRSh2LCBtaW4sIG1heCkgKCAoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSApCi0KLS8vIFB5X3NzaXplX3Qgd2FzIG5vdCBkZWZpbmVkIGJlZm9yZSBQeXRob24gMi41Ci0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLXR5cGVkZWYgaW50IFB5X3NzaXplX3Q7Ci0jZW5kaWYKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGVsZW1lbnRfdHlwZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotfSBTZXRMaXN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgVFR5cGUga3RhZzsKLSAgVFR5cGUgdnRhZzsKLSAgUHlPYmplY3QqIGt0eXBlYXJnczsKLSAgUHlPYmplY3QqIHZ0eXBlYXJnczsKLX0gTWFwVHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHN0cnVjdCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIGtsYXNzOwotICBQeU9iamVjdCogc3BlYzsKLX0gU3RydWN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRhZzsKLSAgVFR5cGUgdHlwZTsKLSAgUHlPYmplY3QqIGF0dHJuYW1lOwotICBQeU9iamVjdCogdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiBkZWZ2YWw7Ci19IFN0cnVjdEl0ZW1TcGVjOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHR3byBrZXkgYXR0cmlidXRlcyBvZiBhIENSZWFkYWJsZVRyYW5zcG9ydCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5T2JqZWN0X0dldEF0dHIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIHN0cmluZ2lvYnVmOwotICBQeU9iamVjdCogcmVmaWxsX2NhbGxhYmxlOwotfSBEZWNvZGVCdWZmZXI7Ci0KLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCi1zdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgewotICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgSU5UMzJfTUFYKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIHNpemUgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXBhcnNlX3B5aW50KFB5T2JqZWN0KiBvLCBpbnQzMl90KiByZXQsIGludDMyX3QgbWluLCBpbnQzMl90IG1heCkgewotICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyhvKTsKLQotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodmFsKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKHZhbCwgbWluLCBtYXgpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnJldCA9IChpbnQzMl90KSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBGVU5DVElPTlMgVE8gUEFSU0UgU1RSVUNUIFNQRUNJRklDQVRPSU5TIC0tLSAqLwotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIGxpc3Qvc2V0IHR5cGUgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmVsZW1lbnRfdHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNCBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT52dGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnZ0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a3R5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0gIGRlc3QtPnZ0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a2xhc3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKLSAgZGVzdC0+c3BlYyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSkgewotCi0gIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KLSAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50eXBlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dHlwZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5hdHRybmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMik7Ci0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAzKTsKLSAgZGVzdC0+ZGVmdmFsID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCA0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qID09PT09PSBFTkQgVVRJTElUSUVTID09PT09PSAqLwotCi0KLS8qID09PT09PSBCRUdJTiBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotLyogLS0tIExPVy1MRVZFTCBXUklUSU5HIEZVTkNUSU9OUyAtLS0gKi8KLQotc3RhdGljIHZvaWQgd3JpdGVCeXRlKFB5T2JqZWN0KiBvdXRidWYsIGludDhfdCB2YWwpIHsKLSAgaW50OF90IG5ldCA9IHZhbDsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50OF90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTE2KFB5T2JqZWN0KiBvdXRidWYsIGludDE2X3QgdmFsKSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnModmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50MTZfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkzMihQeU9iamVjdCogb3V0YnVmLCBpbnQzMl90IHZhbCkgewotICBpbnQzMl90IG5ldCA9IChpbnQzMl90KWh0b25sKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDMyX3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJNjQoUHlPYmplY3QqIG91dGJ1ZiwgaW50NjRfdCB2YWwpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwodmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50NjRfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZURvdWJsZShQeU9iamVjdCogb3V0YnVmLCBkb3VibGUgZHViKSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQotICB1bmlvbiB7Ci0gICAgZG91YmxlIGY7Ci0gICAgaW50NjRfdCB0OwotICB9IHRyYW5zZmVyOwotICB0cmFuc2Zlci5mID0gZHViOwotICB3cml0ZUk2NChvdXRidWYsIHRyYW5zZmVyLnQpOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBPVVRQVVQgRlVDTlRJT04gLS0gKi8KLQotc3RhdGljIGludAotb3V0cHV0X3ZhbChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICAvKgotICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKLSAgICoKLSAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKLSAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KLSAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgotICAgKiBvdXRwdXRfdmFsIGFzc3VtZXMgdGhhdCBhIHJlZmVyZW5jZSBpcyBhbHJlYWR5IGhlbGQuIFRoZSAqY2FsbGVyKiBpcwotICAgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVmZXJlbmNlcwotICAgKi8KLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludCB2ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKLSAgICBpZiAodiA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHYpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMDg6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDhfTUlOLCBJTlQ4X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDE2X01JTiwgSU5UMTZfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTE2KG91dHB1dCwgKGludDE2X3QpIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IG52YWwgPSBQeUxvbmdfQXNMb25nTG9uZyh2YWx1ZSk7Ci0KLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobnZhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIElOVDY0X01JTiwgSU5UNjRfTUFYKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJNjQob3V0cHV0LCBudmFsKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgbnZhbCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotICAgIGlmIChudmFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlRG91YmxlKG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLSAgICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dCwgUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpLCAoaW50MzJfdCkgbGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0gICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0gICAgUHlPYmplY3QgKml0ZXJhdG9yOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOwotCi0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSk7Ci0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLQotICAgIGl0ZXJhdG9yID0gIFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpOwotICAgIGlmIChpdGVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IpKSkgewotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaXRlbSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZXJhdG9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFB5T2JqZWN0ICprLCAqdjsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0KLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotCi0gICAgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5rdGFnKTsKLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLnZ0YWcpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgbGVuKTsKLQotICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cwotICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgewotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBoYXJkIGFib3V0IHdoZXRoZXIgdGhlc2UgSU5DUkVGcyBhY3R1YWxseQotICAgICAgLy8gICAgICAgICAgICAgICB0dXJuIGFueSB1bnNhZmUgc2NlbmFyaW9zIGludG8gc2FmZSBzY2VuYXJpb3MuCi0gICAgICBQeV9JTkNSRUYoayk7Ci0gICAgICBQeV9JTkNSRUYodik7Ci0KLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCi0gICAgICAgICAgfHwgIW91dHB1dF92YWwob3V0cHV0LCB2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYnJlYWtpbmcgdGhpcyBvdXQgYXMgYSBmdW5jdGlvbgotICAvLyAgICAgICAgICAgICAgIHRoZSB3YXkgd2UgZGlkIGZvciBkZWNvZGVfc3RydWN0LgotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBQeV9zc2l6ZV90IG5zcGVjOwotICAgIFB5X3NzaXplX3QgaTsKLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7Ci0KLSAgICBpZiAobnNwZWMgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgewotICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLSAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlOwotICAgICAgUHlPYmplY3QqIGluc3R2YWwgPSBOVUxMOwotCi0gICAgICBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOwotICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjICgmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpbnN0dmFsID0gUHlPYmplY3RfR2V0QXR0cih2YWx1ZSwgcGFyc2Vkc3BlYy5hdHRybmFtZSk7Ci0KLSAgICAgIGlmICghaW5zdHZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnN0dmFsID09IFB5X05vbmUpIHsKLSAgICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgcGFyc2Vkc3BlYy50eXBlKTsKLSAgICAgIHdyaXRlSTE2KG91dHB1dCwgcGFyc2Vkc3BlYy50YWcpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBpbnN0dmFsLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdClUX1NUT1ApOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIE9VVFBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotZW5jb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIGVuY19vYmo7Ci0gIFB5T2JqZWN0KiB0eXBlX2FyZ3M7Ci0gIFB5T2JqZWN0KiBidWY7Ci0gIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmZW5jX29iaiwgJnR5cGVfYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZiA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoSU5JVF9PVVRCVUZfU0laRSk7Ci0gIGlmIChvdXRwdXRfdmFsKGJ1ZiwgZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKLSAgICByZXQgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGJ1Zik7Ci0gIH0KLQotICBQeV9ERUNSRUYoYnVmKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogPT09PT09IEVORCBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgUkVBRElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX2RlY29kZWJ1ZihEZWNvZGVCdWZmZXIqIGQpIHsKLSAgUHlfWERFQ1JFRihkLT5zdHJpbmdpb2J1Zik7Ci0gIFB5X1hERUNSRUYoZC0+cmVmaWxsX2NhbGxhYmxlKTsKLX0KLQotc3RhdGljIGJvb2wKLWRlY29kZV9idWZmZXJfZnJvbV9vYmooRGVjb2RlQnVmZmVyKiBkZXN0LCBQeU9iamVjdCogb2JqKSB7Ci0gIGRlc3QtPnN0cmluZ2lvYnVmID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1ZikpOwotICBpZiAoIWRlc3QtPnN0cmluZ2lvYnVmKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFQeWNTdHJpbmdJT19JbnB1dENoZWNrKGRlc3QtPnN0cmluZ2lvYnVmKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5yZWZpbGxfY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKSk7Ci0KLSAgaWYoIWRlc3QtPnJlZmlsbF9jYWxsYWJsZSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHlDYWxsYWJsZV9DaGVjayhkZXN0LT5yZWZpbGxfY2FsbGFibGUpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCByZWFkQnl0ZXMoRGVjb2RlQnVmZmVyKiBpbnB1dCwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgewotICBpbnQgcmVhZDsKLQotICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKLSAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0Ci0gIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgotCi0gIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgaWYgKHJlYWQgPT0gbGVuKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBQeU9iamVjdCogbmV3aW9idWY7Ci0KLSAgICAvLyB1c2luZyBidWlsZGluZyBmdW5jdGlvbnMgYXMgdGhpcyBpcyBhIHJhcmUgY29kZXBhdGgKLSAgICBuZXdpb2J1ZiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKLSAgICAgICAgaW5wdXQtPnJlZmlsbF9jYWxsYWJsZSwgInMjaSIsICpvdXRwdXQsIHJlYWQsIGxlbiwgTlVMTCk7Ci0gICAgaWYgKG5ld2lvYnVmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKLSAgICBQeV9DTEVBUihpbnB1dC0+c3RyaW5naW9idWYpOwotICAgIGlucHV0LT5zdHJpbmdpb2J1ZiA9IG5ld2lvYnVmOwotCi0gICAgcmVhZCA9IFB5Y1N0cmluZ0lPLT5jcmVhZChpbnB1dC0+c3RyaW5naW9idWYsIG91dHB1dCwgbGVuKTsKLQotICAgIGlmIChyZWFkID09IGxlbikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZWFkID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgcmVhZEJ5dGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50OF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKihpbnQ4X3QqKSBidWY7Ci19Ci0KLXN0YXRpYyBpbnQxNl90IHJlYWRJMTYoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQxNl90KSBudG9ocygqKGludDE2X3QqKSBidWYpOwotfQotCi1zdGF0aWMgaW50MzJfdCByZWFkSTMyKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gKGludDMyX3QpIG50b2hsKCooaW50MzJfdCopIGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludDY0X3QgcmVhZEk2NChEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKGludDY0X3QpIG50b2hsbCgqKGludDY0X3QqKSBidWYpOwotfQotCi1zdGF0aWMgZG91YmxlIHJlYWREb3VibGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICB1bmlvbiB7Ci0gICAgaW50NjRfdCBmOwotICAgIGRvdWJsZSB0OwotICB9IHRyYW5zZmVyOwotCi0gIHRyYW5zZmVyLmYgPSByZWFkSTY0KGlucHV0KTsKLSAgaWYgKHRyYW5zZmVyLmYgPT0gLTEpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIHRyYW5zZmVyLnQ7Ci19Ci0KLXN0YXRpYyBib29sCi1jaGVja1R5cGVCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIGV4cGVjdGVkKSB7Ci0gIFRUeXBlIGdvdCA9IHJlYWRCeXRlKGlucHV0KTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGdvdCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2tpcChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlKSB7Ci0jZGVmaW5lIFNLSVBCWVRFUyhuKSBcCi0gIGRvIHsgXAotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmZHVtbXlfYnVmLCAobikpKSB7IFwKLSAgICAgIHJldHVybiBmYWxzZTsgXAotICAgIH0gXAotICB9IHdoaWxlKDApCi0KLSAgY2hhciogZHVtbXlfYnVmOwotCi0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOgotICBjYXNlIFRfSTA4OiBTS0lQQllURVMoMSk7IGJyZWFrOwotICBjYXNlIFRfSTE2OiBTS0lQQllURVMoMik7IGJyZWFrOwotICBjYXNlIFRfSTMyOiBTS0lQQllURVMoNCk7IGJyZWFrOwotICBjYXNlIFRfSTY0OgotICBjYXNlIFRfRE9VQkxFOiBTS0lQQllURVMoOCk7IGJyZWFrOwotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHRoZXNlIGNoZWNrX3NzaXplX3QzMnMgYXJlIHJlYWxseSBuZWNlc3NhcnkuCi0gICAgaW50IGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNLSVBCWVRFUyhsZW4pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBUVHlwZSBldHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAgZXR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGV0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgZXR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTUFQOiB7Ci0gICAgVFR5cGUga3R5cGUsIHZ0eXBlOwotICAgIGludCBsZW4sIGk7Ci0KLSAgICBrdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoa3R5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2dHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAodnR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKCEoc2tpcChpbnB1dCwga3R5cGUpICYmIHNraXAoaW5wdXQsIHZ0eXBlKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVFR5cGUgdHlwZTsKLQotICAgICAgdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKQotICAgICAgICBicmVhazsKLQotICAgICAgU0tJUEJZVEVTKDIpOyAvLyB0YWcKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSN1bmRlZiBTS0lQQllURVMKLX0KLQotCi0vKiAtLS0gSEVMUEVSIEZVTkNUSU9OIEZPUiBERUNPREVfVkFMIC0tLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfc3RydWN0KERlY29kZUJ1ZmZlciogaW5wdXQsIFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBzcGVjX3NlcSkgewotICBpbnQgc3BlY19zZXFfbGVuID0gUHlUdXBsZV9TaXplKHNwZWNfc2VxKTsKLSAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgVFR5cGUgdHlwZTsKLSAgICBpbnQxNl90IHRhZzsKLSAgICBQeU9iamVjdCogaXRlbV9zcGVjOwotICAgIFB5T2JqZWN0KiBmaWVsZHZhbCA9IE5VTEw7Ci0gICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLQotICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGFnID0gcmVhZEkxNihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHRhZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHRhZyA+PSAwICYmIHRhZyA8IHNwZWNfc2VxX2xlbikgewotICAgICAgaXRlbV9zcGVjID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3NlcSwgdGFnKTsKLSAgICB9IGVsc2UgewotICAgICAgaXRlbV9zcGVjID0gUHlfTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbV9zcGVjID09IFB5X05vbmUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwYXJzZWRzcGVjLnR5cGUgIT0gdHlwZSkgewotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlIHdoaWxlIHJlYWRpbmcgYW5kIGNhbid0IGJlIHNraXBwZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmllbGR2YWwgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOwotICAgIGlmIChmaWVsZHZhbCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbCkgPT0gLTEpIHsKLSAgICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIE1BSU4gUkVDVVJTSVZFIElOUFVUIEZVQ05USU9OIC0tLSAqLwotCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV92YWwoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHYpIHsKLSAgICBjYXNlIDA6IFB5X1JFVFVSTl9GQUxTRTsKLSAgICBjYXNlIDE6IFB5X1JFVFVSTl9UUlVFOwotICAgIC8vIERvbid0IGxhdWdoLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgaXNzdWUuCi0gICAgZGVmYXVsdDogUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJvb2xlYW4gb3V0IG9mIHJhbmdlIik7IHJldHVybiBOVUxMOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kxNjogewotICAgIGludDE2X3QgdiA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotICBjYXNlIFRfSTMyOiB7Ci0gICAgaW50MzJfdCB2ID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0k2NDogewotICAgIGludDY0X3QgdiA9IHJlYWRJNjQoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgotICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgotICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHYpOwotICAgIH0KLQotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0RPVUJMRTogewotICAgIGRvdWJsZSB2ID0gcmVhZERvdWJsZShpbnB1dCk7Ci0gICAgaWYgKHYgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodik7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBjaGFyKiBidWY7Ci0gICAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIGludDMyX3QgbGVuOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlMaXN0X05ldyhsZW4pOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOwotICAgICAgaWYgKCFpdGVtKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5TGlzdF9TRVRfSVRFTShyZXQsIGksIGl0ZW0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYml0aW5nIHRoZSBidWxsZXQgYW5kIG1ha2luZyB0d28gc2VwYXJhdGUgY2FzZXMKLSAgICAvLyAgICAgICAgICAgICAgIGZvciBsaXN0IGFuZCBzZXQsIGF2b2lkaW5nIHRoaXMgcG9zdCBmYWN0byBjb252ZXJzaW9uLgotICAgIGlmICh0eXBlID09IFRfU0VUKSB7Ci0gICAgICBQeU9iamVjdCogc2V0cmV0OwotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0gICAgICAvLyBoYWNrIG5lZWRlZCBmb3Igb2xkZXIgdmVyc2lvbnMKLSAgICAgIHNldHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KikmUHlTZXRfVHlwZSwgcmV0LCBOVUxMKTsKLSNlbHNlCi0gICAgICAvLyBvZmZpY2lhbCB2ZXJzaW9uCi0gICAgICBzZXRyZXQgPSBQeVNldF9OZXcocmV0KTsKLSNlbmRpZgotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gc2V0cmV0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIGludDMyX3QgbGVuOwotICAgIGludCBpOwotICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJldCA9IE5VTEw7Ci0KLSAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5rdGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy52dGFnKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXQgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogayA9IE5VTEw7Ci0gICAgICBQeU9iamVjdCogdiA9IE5VTEw7Ci0gICAgICBrID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncyk7Ci0gICAgICBpZiAoayA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIHYgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKTsKLSAgICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJldCwgaywgdikgPT0gLTEpIHsKLSAgICAgICAgZ290byBsb29wX2Vycm9yOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICBQeV9ERUNSRUYodik7Ci0gICAgICBjb250aW51ZTsKLQotICAgICAgLy8gWXVjayEgIERlc3RydWN0b3JzLCBhbnlvbmU/Ci0gICAgICBsb29wX2Vycm9yOgotICAgICAgUHlfWERFQ1JFRihrKTsKLSAgICAgIFB5X1hERUNSRUYodik7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0KLSAgICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKHJldCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5T2JqZWN0KiByZXQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHBhcnNlZGFyZ3Mua2xhc3MsIE5VTEwpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWRlY29kZV9zdHJ1Y3QoaW5wdXQsIHJldCwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgICAgUHlfREVDUkVGKHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIElOUFVUIC0tICovCi0KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV9iaW5hcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gIFB5T2JqZWN0KiBvdXRwdXRfb2JqID0gTlVMTDsKLSAgUHlPYmplY3QqIHRyYW5zcG9ydCA9IE5VTEw7Ci0gIFB5T2JqZWN0KiB0eXBlYXJncyA9IE5VTEw7Ci0gIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gIERlY29kZUJ1ZmZlciBpbnB1dCA9IHt9OwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJm91dHB1dF9vYmosICZ0cmFuc3BvcnQsICZ0eXBlYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfYnVmZmVyX2Zyb21fb2JqKCZpbnB1dCwgdHJhbnNwb3J0KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfc3RydWN0KCZpbnB1dCwgb3V0cHV0X29iaiwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKCZpbnB1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmcmVlX2RlY29kZWJ1ZigmaW5wdXQpOwotCi0gIFB5X1JFVFVSTl9OT05FOwotfQotCi0vKiA9PT09PT0gRU5EIFJFQURJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0KLS8qIC0tIFBZVEhPTiBNT0RVTEUgU0VUVVAgU1RVRkYgLS0tICovCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kc1tdID0gewotCi0gIHsiZW5jb2RlX2JpbmFyeSIsICBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKLSAgeyJkZWNvZGVfYmluYXJ5IiwgIGRlY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAotCi0gIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KLX07Ci0KLVB5TU9ESU5JVF9GVU5DCi1pbml0ZmFzdGJpbmFyeSh2b2lkKSB7Ci0jZGVmaW5lIElOSVRfSU5URVJOX1NUUklORyh2YWx1ZSkgXAotICBkbyB7IFwKLSAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgXAotICAgIGlmKCFJTlRFUk5fU1RSSU5HKHZhbHVlKSkgcmV0dXJuOyBcCi0gIH0gd2hpbGUoMCkKLQotICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7Ci0gIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKLSN1bmRlZiBJTklUX0lOVEVSTl9TVFJJTkcKLQotICBQeWNTdHJpbmdfSU1QT1JUOwotICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkgcmV0dXJuOwotCi0gICh2b2lkKSBQeV9Jbml0TW9kdWxlKCJ0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeSIsIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKaW5kZXggMzA0N2Q5Yy4uODVjZjQwMCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKQEAgLTE3LDY2ICsxNyw5MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgc3NsCisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCi1jbGFzcyBSZXNwb25zZUV4Y2VwdGlvbihFeGNlcHRpb24pOgotICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKIAotICBOb3JtYWxseSwgVEh0dHBTZXJ2ZXIgYWx3YXlzIHNlbmRzIGEgMjAwIHJlc3BvbnNlLiAgSWYgYSBoYW5kbGVyIHdhbnRzCi0gIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIHRvIHNpbXVsYXRlIGEgbWlzY29uZmlndXJlZCBvcgotICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KLSAgVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKLSAgUmVxdWVzdEhhbmRsZXIgYXMgaXRzIG9ubHkgYXJndW1lbnQuCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6Ci0gICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgorY2xhc3MgUmVzcG9uc2VFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJBbGxvd3MgaGFuZGxlcnMgdG8gb3ZlcnJpZGUgdGhlIEhUVFAgcmVzcG9uc2UKKworICAgIE5vcm1hbGx5LCBUSHR0cFNlcnZlciBhbHdheXMgc2VuZHMgYSAyMDAgcmVzcG9uc2UuICBJZiBhIGhhbmRsZXIgd2FudHMKKyAgICB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIChlLmcuLCB0byBzaW11bGF0ZSBhIG1pc2NvbmZpZ3VyZWQgb3IKKyAgICBvdmVybG9hZGVkIHdlYiBzZXJ2ZXIgZHVyaW5nIHRlc3RpbmcpLCBpdCBjYW4gcmFpc2UgYSBSZXNwb25zZUV4Y2VwdGlvbi4KKyAgICBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQorICAgIFJlcXVlc3RIYW5kbGVyIGFzIGl0cyBvbmx5IGFyZ3VtZW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgogCiAKIGNsYXNzIFRIdHRwU2VydmVyKFRTZXJ2ZXIuVFNlcnZlcik6Ci0gICIiIkEgc2ltcGxlIEhUVFAtYmFzZWQgVGhyaWZ0IHNlcnZlcgorICAgICIiIkEgc2ltcGxlIEhUVFAtYmFzZWQgVGhyaWZ0IHNlcnZlcgogCi0gIFRoaXMgY2xhc3MgaXMgbm90IHZlcnkgcGVyZm9ybWFudCwgYnV0IGl0IGlzIHVzZWZ1bCAoZm9yIGV4YW1wbGUpIGZvcgotICBhY3RpbmcgYXMgYSBtb2NrIHZlcnNpb24gb2YgYW4gQXBhY2hlLWJhc2VkIFBIUCBUaHJpZnQgZW5kcG9pbnQuIiIiCisgICAgVGhpcyBjbGFzcyBpcyBub3QgdmVyeSBwZXJmb3JtYW50LCBidXQgaXQgaXMgdXNlZnVsIChmb3IgZXhhbXBsZSkgZm9yCisgICAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9jbGFzcz1CYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyLAorICAgICAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgKG9yIEhUVFBTKSBzZXJ2ZXIuCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyX2FkZHJlc3MsCi0gICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gTm9uZSwKLSAgICAgIHNlcnZlcl9jbGFzcyA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgotICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgc2VydmVyLgorICAgICAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgorICAgICAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgogCi0gICAgU2VlIEJhc2VIVFRQU2VydmVyIGZvciBzZXJ2ZXJfYWRkcmVzcy4KLSAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLiIiIgorICAgICAgICBUbyBtYWtlIGEgc2VjdXJlIHNlcnZlciwgcHJvdmlkZSB0aGUgbmFtZWQgYXJndW1lbnRzOgorICAgICAgICAqIGNhZmlsZSAgICAtIHRvIHZhbGlkYXRlIGNsaWVudHMgW29wdGlvbmFsXQorICAgICAgICAqIGNlcnRfZmlsZSAtIHRoZSBzZXJ2ZXIgY2VydAorICAgICAgICAqIGtleV9maWxlICAtIHRoZSBzZXJ2ZXIncyBrZXkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKIAotICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgotICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCiAKLSAgICBUU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lLCBOb25lLCBOb25lLAotICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB0aHR0cHNlcnZlciA9IHNlbGYKIAotICAgIHRodHRwc2VydmVyID0gc2VsZgorICAgICAgICBjbGFzcyBSZXF1ZXN0SGFuZGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICAgICAgICAgIyBEb24ndCBjYXJlIGFib3V0IHRoZSByZXF1ZXN0IHBhdGguCisgICAgICAgICAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQorICAgICAgICAgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi53ZmlsZSkKKyAgICAgICAgICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zLCBpbnQoc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKSkKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICAgICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICAgICAgICAgIG9wcm90ID0gdGh0dHBzZXJ2ZXIub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzcG9uc2VFeGNlcHRpb24gYXMgZXhuOgorICAgICAgICAgICAgICAgICAgICBleG4uaGFuZGxlcihzZWxmKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKG90cmFucy5nZXR2YWx1ZSgpKQogCi0gICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgotICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KLSAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQotICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYud2ZpbGUpCi0gICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KGl0cmFucywgaW50KHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSkpCi0gICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHRodHRwc2VydmVyLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICAgIHRyeToKLSAgICAgICAgICB0aHR0cHNlcnZlci5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgIGV4Y2VwdCBSZXNwb25zZUV4Y2VwdGlvbiwgZXhuOgotICAgICAgICAgIGV4bi5oYW5kbGVyKHNlbGYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJjb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQotICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUob3RyYW5zLmdldHZhbHVlKCkpCisgICAgICAgIHNlbGYuaHR0cGQgPSBzZXJ2ZXJfY2xhc3Moc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kZXIpCiAKLSAgICBzZWxmLmh0dHBkID0gc2VydmVyX2NsYXNzKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGVyKQorICAgICAgICBpZiAoa3dhcmdzLmdldCgnY2FmaWxlJykgb3Iga3dhcmdzLmdldCgnY2VydF9maWxlJykgb3Iga3dhcmdzLmdldCgna2V5X2ZpbGUnKSk6CisgICAgICAgICAgICBjb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWt3YXJncy5nZXQoJ2NhZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCisgICAgICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSwga3dhcmdzLmdldCgna2V5X2ZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBlbHNlIHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0ID0gY29udGV4dC53cmFwX3NvY2tldChzZWxmLmh0dHBkLnNvY2tldCwgc2VydmVyX3NpZGU9VHJ1ZSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5odHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgIyBzZWxmLmh0dHBkLnNodXRkb3duKCkgIyBoYW5ncyBmb3JldmVyLCBweXRob24gZG9lc24ndCBoYW5kbGUgUE9MTE5WQUwgcHJvcGVybHkhCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKaW5kZXggZWEzNDhhMC4uZjYyZDQ4NiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQpAQCAtMTgsMjUgKzE4LDMzIEBACiAjCiAiIiJJbXBsZW1lbnRhdGlvbiBvZiBub24tYmxvY2tpbmcgc2VydmVyLgogCi1UaGUgbWFpbiBpZGVhIG9mIHRoZSBzZXJ2ZXIgaXMgcmVjaXZpbmcgYW5kIHNlbmRpbmcgcmVxdWVzdHMKLW9ubHkgZnJvbSBtYWluIHRocmVhZC4KK1RoZSBtYWluIGlkZWEgb2YgdGhlIHNlcnZlciBpcyB0byByZWNlaXZlIGFuZCBzZW5kIHJlcXVlc3RzCitvbmx5IGZyb20gdGhlIG1haW4gdGhyZWFkLgogCi1JdCBhbHNvIG1ha2VzIHRocmVhZCBwb29sIHNlcnZlciBpbiB0YXNrcyB0ZXJtcywgbm90IGNvbm5lY3Rpb25zLgorVGhlIHRocmVhZCBwb29vbCBzaG91bGQgYmUgc2l6ZWQgZm9yIGNvbmN1cnJlbnQgdGFza3MsIG5vdAorbWF4aW11bSBjb25uZWN0aW9ucwogIiIiCi1pbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgUXVldWUKLWltcG9ydCBzZWxlY3QKLWltcG9ydCBzdHJ1Y3QKKwogaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0aHJlYWRpbmcKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sRmFjdG9yeQogCiBfX2FsbF9fID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInXQogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCiBjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgIiIiV29ya2VyIGlzIGEgc21hbGwgaGVscGVyIHRvIHByb2Nlc3MgaW5jb21pbmcgY29ubmVjdGlvbi4iIiIKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxdWV1ZSk6CiAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKICAgICAgICAgc2VsZi5xdWV1ZSA9IHF1ZXVlCkBAIC01MSw4ICs1OSw5IEBACiAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICAgICAgICAgIGNhbGxiYWNrKFRydWUsIG90cmFucy5nZXR2YWx1ZSgpKQogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIpCi0gICAgICAgICAgICAgICAgY2FsbGJhY2soRmFsc2UsICcnKQorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiLCBleGNfaW5mbz1UcnVlKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKEZhbHNlLCBiJycpCisKIAogV0FJVF9MRU4gPSAwCiBXQUlUX01FU1NBR0UgPSAxCkBAIC02MCw4ICs2OSw5IEBACiBTRU5EX0FOU1dFUiA9IDMKIENMT1NFRCA9IDQKIAorCiBkZWYgbG9ja2VkKGZ1bmMpOgotICAgICJEZWNvcmF0b3Igd2hpY2ggbG9ja3Mgc2VsZi5sb2NrLiIKKyAgICAiIiJEZWNvcmF0b3Igd2hpY2ggbG9ja3Mgc2VsZi5sb2NrLiIiIgogICAgIGRlZiBuZXN0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoKQogICAgICAgICB0cnk6CkBAIC03MCwyNSArODAsNDAgQEAKICAgICAgICAgICAgIHNlbGYubG9jay5yZWxlYXNlKCkKICAgICByZXR1cm4gbmVzdGVkCiAKKwogZGVmIHNvY2tldF9leGNlcHRpb24oZnVuYyk6Ci0gICAgIkRlY29yYXRvciBjbG9zZSBvYmplY3Qgb24gc29ja2V0LmVycm9yLiIKKyAgICAiIiJEZWNvcmF0b3IgY2xvc2Ugb2JqZWN0IG9uIHNvY2tldC5lcnJvci4iIiIKICAgICBkZWYgcmVhZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2lnbm9yaW5nIHNvY2tldCBleGNlcHRpb24nLCBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgcmV0dXJuIHJlYWQKIAotY2xhc3MgQ29ubmVjdGlvbjoKKworY2xhc3MgTWVzc2FnZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIGxlbl8sIGhlYWRlcik6CisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIHNlbGYubGVuID0gbGVuXworICAgICAgICBzZWxmLmJ1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5pc19oZWFkZXIgPSBoZWFkZXIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9mZnNldCArIHNlbGYubGVuCisKKworY2xhc3MgQ29ubmVjdGlvbihvYmplY3QpOgogICAgICIiIkJhc2ljIGNsYXNzIGlzIHJlcHJlc2VudGVkIGNvbm5lY3Rpb24uCi0gICAgCisKICAgICBJdCBjYW4gYmUgaW4gc3RhdGU6CiAgICAgICAgIFdBSVRfTEVOIC0tLSBjb25uZWN0aW9uIGlzIHJlYWRpbmcgcmVxdWVzdCBsZW4uCiAgICAgICAgIFdBSVRfTUVTU0FHRSAtLS0gY29ubmVjdGlvbiBpcyByZWFkaW5nIHJlcXVlc3QuCi0gICAgICAgIFdBSVRfUFJPQ0VTUyAtLS0gY29ubmVjdGlvbiBoYXMganVzdCByZWFkIHdob2xlIHJlcXVlc3QgYW5kIAotICAgICAgICAgICAgd2FpdHMgZm9yIGNhbGwgcmVhZHkgcm91dGluZS4KKyAgICAgICAgV0FJVF9QUk9DRVNTIC0tLSBjb25uZWN0aW9uIGhhcyBqdXN0IHJlYWQgd2hvbGUgcmVxdWVzdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0cyBmb3IgY2FsbCByZWFkeSByb3V0aW5lLgogICAgICAgICBTRU5EX0FOU1dFUiAtLS0gY29ubmVjdGlvbiBpcyBzZW5kaW5nIGFuc3dlciBzdHJpbmcgKGluY2x1ZGluZyBsZW5ndGgKLSAgICAgICAgICAgIG9mIGFuc3dlcikuCisgICAgICAgICAgICAgICAgICAgICAgICBvZiBhbnN3ZXIpLgogICAgICAgICBDTE9TRUQgLS0tIHNvY2tldCB3YXMgY2xvc2VkIGFuZCBjb25uZWN0aW9uIHNob3VsZCBiZSBkZWxldGVkLgogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfc29ja2V0LCB3YWtlX3VwKToKQEAgLTk2LDgwICsxMjEsNzIgQEAKICAgICAgICAgc2VsZi5zb2NrZXQuc2V0YmxvY2tpbmcoRmFsc2UpCiAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgc2VsZi5sZW4gPSAwCi0gICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgIHNlbGYucmVjZWl2ZWQgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgIHNlbGYuX3JidWYgPSBiJycKKyAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgIHNlbGYud2FrZV91cCA9IHdha2VfdXAKLQotICAgIGRlZiBfcmVhZF9sZW4oc2VsZik6Ci0gICAgICAgICIiIlJlYWRzIGxlbmd0aCBvZiByZXF1ZXN0LgotICAgICAgICAKLSAgICAgICAgSXQncyByZWFsbHkgcGFyYW5vaWMgcm91dGluZSBhbmQgaXQgbWF5IGJlIHJlcGxhY2VkIGJ5IAotICAgICAgICBzZWxmLnNvY2tldC5yZWN2KDQpLiIiIgotICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdig0IC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgIyBpZiB3ZSByZWFkIDAgYnl0ZXMgYW5kIHNlbGYubWVzc2FnZSBpcyBlbXB0eSwgaXQgbWVhbnMgY2xpZW50IGNsb3NlIAotICAgICAgICAgICAgIyBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSAhPSAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgc2l6ZSBmcm9tIHNvY2tldCIpCi0gICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSA9PSA0OgotICAgICAgICAgICAgc2VsZi5sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLm1lc3NhZ2UpCi0gICAgICAgICAgICBpZiBzZWxmLmxlbiA8IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigibmVnYXRpdmUgZnJhbWUgc2l6ZSwgaXQgc2VlbXMgY2xpZW50IlwKLSAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IHVzZSBGcmFtZWRUcmFuc3BvcnQiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxpZiBzZWxmLmxlbiA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImVtcHR5IGZyYW1lLCBpdCdzIHJlYWxseSBzdHJhbmdlIikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKLSAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICBzZWxmLnJlbWFpbmluZyA9IEZhbHNlCiAKICAgICBAc29ja2V0X2V4Y2VwdGlvbgogICAgIGRlZiByZWFkKHNlbGYpOgogICAgICAgICAiIiJSZWFkcyBkYXRhIGZyb20gc3RyZWFtIGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyBpbiAoV0FJVF9MRU4sIFdBSVRfTUVTU0FHRSkKLSAgICAgICAgaWYgc2VsZi5zdGF0dXMgPT0gV0FJVF9MRU46Ci0gICAgICAgICAgICBzZWxmLl9yZWFkX2xlbigpCi0gICAgICAgICAgICAjIGdvIGJhY2sgdG8gdGhlIG1haW4gbG9vcCBoZXJlIGZvciBzaW1wbGljaXR5IGluc3RlYWQgb2YKLSAgICAgICAgICAgICMgZmFsbGluZyB0aHJvdWdoLCBldmVuIHRob3VnaCB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoYXQKLSAgICAgICAgICAgICMgdGhlIG1lc3NhZ2UgaXMgYWxyZWFkeSBhdmFpbGFibGUKLSAgICAgICAgZWxpZiBzZWxmLnN0YXR1cyA9PSBXQUlUX01FU1NBR0U6Ci0gICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihzZWxmLmxlbiAtIGxlbihzZWxmLm1lc3NhZ2UpKQotICAgICAgICAgICAgaWYgbGVuKHJlYWQpID09IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiY2FuJ3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCAoZ2V0ICVkIG9mICVkIGJ5dGVzKSIgJQotICAgICAgICAgICAgICAgICAgICAobGVuKHNlbGYubWVzc2FnZSksIHNlbGYubGVuKSkKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLnJlY2VpdmVkCisgICAgICAgIGJ1Zl9zaXplID0gODE5MgorICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgZG9uZSA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBkb25lOgorICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoYnVmX3NpemUpCisgICAgICAgICAgICBybGVuID0gbGVuKHJlYWQpCisgICAgICAgICAgICBkb25lID0gcmxlbiA8IGJ1Zl9zaXplCisgICAgICAgICAgICBzZWxmLl9yYnVmICs9IHJlYWQKKyAgICAgICAgICAgIGlmIGZpcnN0IGFuZCBybGVuID09IDA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGF0dXMgIT0gV0FJVF9MRU4gb3Igc2VsZi5fcmJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjb3VsZCBub3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZWFkIHplcm8gbGVuZ3RoLiBjbGllbnQgbWlnaHQgaGF2ZSBkaXNjb25uZWN0ZWQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpID09IHNlbGYubGVuOgorICAgICAgICAgICAgd2hpbGUgbGVuKHNlbGYuX3JidWYpID49IHNlbGYuX3JlYWRpbmcuZW5kOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3JlYWRpbmcuaXNfaGVhZGVyOgorICAgICAgICAgICAgICAgICAgICBtbGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5fcmJ1Zls6NF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKHNlbGYuX3JlYWRpbmcuZW5kLCBtbGVuLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nLmJ1ZmZlciA9IHNlbGYuX3JidWYKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNlaXZlZC5hcHBlbmQoc2VsZi5fcmVhZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IHNlbGYuX3JidWZbc2VsZi5fcmVhZGluZy5lbmQ6XQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5yZWNlaXZlZDoKICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfUFJPQ0VTUworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gbm90IGRvbmUKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHdyaXRlKHNlbGYpOgogICAgICAgICAiIiJXcml0ZXMgZGF0YSBmcm9tIHNvY2tldCBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gU0VORF9BTlNXRVIKLSAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5tZXNzYWdlKQotICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLm1lc3NhZ2UpOgorICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLl93YnVmKQorICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLl93YnVmKToKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgICAgICBzZWxmLmxlbiA9IDAKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHNlbGYubWVzc2FnZVtzZW50Ol0KKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBzZWxmLl93YnVmW3NlbnQ6XQogCiAgICAgQGxvY2tlZAogICAgIGRlZiByZWFkeShzZWxmLCBhbGxfb2ssIG1lc3NhZ2UpOgogICAgICAgICAiIiJDYWxsYmFjayBmdW5jdGlvbiBmb3Igc3dpdGNoaW5nIHN0YXRlIGFuZCB3YWtpbmcgdXAgbWFpbiB0aHJlYWQuCi0gICAgICAgIAorCiAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9ubHkgZnVuY3Rpb24gd2l0Y2ggY2FuIGJlIGNhbGxlZCBhc3luY2hyb25vdXMuCi0gICAgICAgIAorCiAgICAgICAgIFRoZSByZWFkeSBjYW4gc3dpdGNoIENvbm5lY3Rpb24gdG8gdGhyZWUgc3RhdGVzOgogICAgICAgICAgICAgV0FJVF9MRU4gaWYgcmVxdWVzdCB3YXMgb25ld2F5LgogICAgICAgICAgICAgU0VORF9BTlNXRVIgaWYgcmVxdWVzdCB3YXMgcHJvY2Vzc2VkIGluIG5vcm1hbCB3YXkuCiAgICAgICAgICAgICBDTE9TRUQgaWYgcmVxdWVzdCB0aHJvd3MgdW5leHBlY3RlZCBleGNlcHRpb24uCi0gICAgICAgIAorCiAgICAgICAgIFRoZSBvbmUgd2FrZXMgdXAgbWFpbiB0aHJlYWQuCiAgICAgICAgICIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gV0FJVF9QUk9DRVNTCkBAIC0xNzcsNjUgKzE5NCw3NCBAQAogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLndha2VfdXAoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubGVuID0gJycKKyAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGlmIGxlbihtZXNzYWdlKSA9PSAwOgogICAgICAgICAgICAgIyBpdCB3YXMgYSBvbmV3YXkgcmVxdWVzdCwgZG8gbm90IHdyaXRlIGFuc3dlcgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gU0VORF9BTlNXRVIKICAgICAgICAgc2VsZi53YWtlX3VwKCkKIAogICAgIEBsb2NrZWQKICAgICBkZWYgaXNfd3JpdGVhYmxlKHNlbGYpOgotICAgICAgICAiUmV0dXJucyBUcnVlIGlmIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHdyaXRlIGxpc3Qgb2Ygc2VsZWN0LiIKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgY29ubmVjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gd3JpdGUgbGlzdCBvZiBzZWxlY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzID09IFNFTkRfQU5TV0VSCiAKICAgICAjIGl0J3Mgbm90IG5lY2Vzc2FyeSwgYnV0Li4uCiAgICAgQGxvY2tlZAogICAgIGRlZiBpc19yZWFkYWJsZShzZWxmKToKLSAgICAgICAgIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBhZGRlZCB0byByZWFkIGxpc3Qgb2Ygc2VsZWN0LiIKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgY29ubmVjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gcmVhZCBsaXN0IG9mIHNlbGVjdCIiIgogICAgICAgICByZXR1cm4gc2VsZi5zdGF0dXMgaW4gKFdBSVRfTEVOLCBXQUlUX01FU1NBR0UpCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIGlzX2Nsb3NlZChzZWxmKToKLSAgICAgICAgIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGNsb3NlZC4iCisgICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGNsb3NlZC4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzID09IENMT1NFRAogCiAgICAgZGVmIGZpbGVubyhzZWxmKToKLSAgICAgICAgIlJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgYXNzb2NpYXRlZCBzb2NrZXQuIgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGFzc29jaWF0ZWQgc29ja2V0LiIiIgogICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuZmlsZW5vKCkKIAogICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgIkNsb3NlcyBjb25uZWN0aW9uIgorICAgICAgICAiIiJDbG9zZXMgY29ubmVjdGlvbiIiIgogICAgICAgICBzZWxmLnN0YXR1cyA9IENMT1NFRAogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAKLWNsYXNzIFROb25ibG9ja2luZ1NlcnZlcjoKKworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyKG9iamVjdCk6CiAgICAgIiIiTm9uLWJsb2NraW5nIHNlcnZlci4iIiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBsc29ja2V0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1Ob25lLCAKLSAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLCB0aHJlYWRzPTEwKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIGxzb2NrZXQsCisgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICB0aHJlYWRzPTEwKToKICAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKICAgICAgICAgc2VsZi5zb2NrZXQgPSBsc29ja2V0CiAgICAgICAgIHNlbGYuaW5fcHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeSBvciBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICAgICAgc2VsZi5vdXRfcHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnkgb3Igc2VsZi5pbl9wcm90b2NvbAogICAgICAgICBzZWxmLnRocmVhZHMgPSBpbnQodGhyZWFkcykKICAgICAgICAgc2VsZi5jbGllbnRzID0ge30KLSAgICAgICAgc2VsZi50YXNrcyA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50YXNrcyA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICAgc2VsZi5fcmVhZCwgc2VsZi5fd3JpdGUgPSBzb2NrZXQuc29ja2V0cGFpcigpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKIAogICAgIGRlZiBzZXROdW1UaHJlYWRzKHNlbGYsIG51bSk6CiAgICAgICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQuIiIiCiAgICAgICAgICMgaW1wbGVtZW50IFRocmVhZFBvb2wgaW50ZXJmYWNlCi0gICAgICAgIGFzc2VydCBub3Qgc2VsZi5wcmVwYXJlZCwgIllvdSBjYW4ndCBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHdvcmtpbmcgc2VydmVyIgorICAgICAgICBhc3NlcnQgbm90IHNlbGYucHJlcGFyZWQsICJDYW4ndCBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMgYWZ0ZXIgc3RhcnQiCiAgICAgICAgIHNlbGYudGhyZWFkcyA9IG51bQogCiAgICAgZGVmIHByZXBhcmUoc2VsZik6CiAgICAgICAgICIiIlByZXBhcmVzIHNlcnZlciBmb3Igc2VydmUgcmVxdWVzdHMuIiIiCisgICAgICAgIGlmIHNlbGYucHJlcGFyZWQ6CisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5zb2NrZXQubGlzdGVuKCkKLSAgICAgICAgZm9yIF8gaW4geHJhbmdlKHNlbGYudGhyZWFkcyk6CisgICAgICAgIGZvciBfIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6CiAgICAgICAgICAgICB0aHJlYWQgPSBXb3JrZXIoc2VsZi50YXNrcykKICAgICAgICAgICAgIHRocmVhZC5zZXREYWVtb24oVHJ1ZSkKICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpCkBAIC0yNDMsNTIgKzI2OSw4MiBAQAogCiAgICAgZGVmIHdha2VfdXAoc2VsZik6CiAgICAgICAgICIiIldha2UgdXAgbWFpbiB0aHJlYWQuCi0gICAgICAgIAotICAgICAgICBUaGUgc2VydmVyIHVzdWFseSB3YWl0cyBpbiBzZWxlY3QgY2FsbCBpbiB3ZSBzaG91bGQgdGVybWluYXRlIG9uZS4KKworICAgICAgICBUaGUgc2VydmVyIHVzdWFsbHkgd2FpdHMgaW4gc2VsZWN0IGNhbGwgaW4gd2Ugc2hvdWxkIHRlcm1pbmF0ZSBvbmUuCiAgICAgICAgIFRoZSBzaW1wbGVzdCB3YXkgaXMgdXNpbmcgc29ja2V0cGFpci4KLSAgICAgICAgCisKICAgICAgICAgU2VsZWN0IGFsd2F5cyB3YWl0IHRvIHJlYWQgZnJvbSB0aGUgZmlyc3Qgc29ja2V0IG9mIHNvY2tldHBhaXIuCi0gICAgICAgIAorCiAgICAgICAgIEluIHRoaXMgY2FzZSwgd2UgY2FuIGp1c3Qgd3JpdGUgYW55dGhpbmcgdG8gdGhlIHNlY29uZCBzb2NrZXQgZnJvbQotICAgICAgICBzb2NrZXRwYWlyLiIiIgotICAgICAgICBzZWxmLl93cml0ZS5zZW5kKCcxJykKKyAgICAgICAgc29ja2V0cGFpci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoYicxJykKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAiIiJTdG9wIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgVGhpcyBtZXRob2QgY2F1c2VzIHRoZSBzZXJ2ZSgpIG1ldGhvZCB0byByZXR1cm4uICBzdG9wKCkgbWF5IGJlIGludm9rZWQKKyAgICAgICAgZnJvbSB3aXRoaW4geW91ciBoYW5kbGVyLCBvciBmcm9tIGFub3RoZXIgdGhyZWFkLgorCisgICAgICAgIEFmdGVyIHN0b3AoKSBpcyBjYWxsZWQsIHNlcnZlKCkgd2lsbCByZXR1cm4gYnV0IHRoZSBzZXJ2ZXIgd2lsbCBzdGlsbAorICAgICAgICBiZSBsaXN0ZW5pbmcgb24gdGhlIHNvY2tldC4gIHNlcnZlKCkgbWF5IHRoZW4gYmUgY2FsbGVkIGFnYWluIHRvIHJlc3VtZQorICAgICAgICBwcm9jZXNzaW5nIHJlcXVlc3RzLiAgQWx0ZXJuYXRpdmVseSwgY2xvc2UoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCisgICAgICAgIHNlcnZlKCkgcmV0dXJucyB0byBjbG9zZSB0aGUgc2VydmVyIHNvY2tldCBhbmQgc2h1dGRvd24gYWxsIHdvcmtlcgorICAgICAgICB0aHJlYWRzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc3RvcCA9IFRydWUKKyAgICAgICAgc2VsZi53YWtlX3VwKCkKIAogICAgIGRlZiBfc2VsZWN0KHNlbGYpOgogICAgICAgICAiIiJEb2VzIHNlbGVjdCBvbiBvcGVuIGNvbm5lY3Rpb25zLiIiIgogICAgICAgICByZWFkYWJsZSA9IFtzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCksIHNlbGYuX3JlYWQuZmlsZW5vKCldCiAgICAgICAgIHdyaXRhYmxlID0gW10KLSAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gc2VsZi5jbGllbnRzLml0ZW1zKCk6CisgICAgICAgIHJlbWFpbmluZyA9IFtdCisgICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIGxpc3Qoc2VsZi5jbGllbnRzLml0ZW1zKCkpOgogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19yZWFkYWJsZSgpOgogICAgICAgICAgICAgICAgIHJlYWRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVtYWluaW5nIG9yIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfd3JpdGVhYmxlKCk6CiAgICAgICAgICAgICAgICAgd3JpdGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX2Nsb3NlZCgpOgogICAgICAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudHNbaV0KLSAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkKLSAgICAgICAgCisgICAgICAgIGlmIHJlbWFpbmluZzoKKyAgICAgICAgICAgIHJldHVybiByZW1haW5pbmcsIFtdLCBbXSwgRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3Quc2VsZWN0KHJlYWRhYmxlLCB3cml0YWJsZSwgcmVhZGFibGUpICsgKFRydWUsKQorCiAgICAgZGVmIGhhbmRsZShzZWxmKToKICAgICAgICAgIiIiSGFuZGxlIHJlcXVlc3RzLgotICAgICAgIAotICAgICAgICBXQVJOSU5HISBZb3UgbXVzdCBjYWxsIHByZXBhcmUgQkVGT1JFIGNhbGxpbmcgaGFuZGxlLgorCisgICAgICAgIFdBUk5JTkchIFlvdSBtdXN0IGNhbGwgcHJlcGFyZSgpIEJFRk9SRSBjYWxsaW5nIGhhbmRsZSgpCiAgICAgICAgICIiIgogICAgICAgICBhc3NlcnQgc2VsZi5wcmVwYXJlZCwgIllvdSBoYXZlIHRvIGNhbGwgcHJlcGFyZSBiZWZvcmUgaGFuZGxlIgotICAgICAgICByc2V0LCB3c2V0LCB4c2V0ID0gc2VsZi5fc2VsZWN0KCkKKyAgICAgICAgcnNldCwgd3NldCwgeHNldCwgc2VsZWN0ZWQgPSBzZWxmLl9zZWxlY3QoKQogICAgICAgICBmb3IgcmVhZGFibGUgaW4gcnNldDoKICAgICAgICAgICAgIGlmIHJlYWRhYmxlID09IHNlbGYuX3JlYWQuZmlsZW5vKCk6CiAgICAgICAgICAgICAgICAgIyBkb24ndCBjYXJlIGkganVzdCBuZWVkIHRvIGNsZWFuIHJlYWRhYmxlIGZsYWcKLSAgICAgICAgICAgICAgICBzZWxmLl9yZWFkLnJlY3YoMTAyNCkgCisgICAgICAgICAgICAgICAgc2VsZi5fcmVhZC5yZWN2KDEwMjQpCiAgICAgICAgICAgICBlbGlmIHJlYWRhYmxlID09IHNlbGYuc29ja2V0LmhhbmRsZS5maWxlbm8oKToKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKS5oYW5kbGUKLSAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LCBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBpZiBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmhhbmRsZS5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2Vycm9yIHdoaWxlIGFjY2VwdGluZycsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBzZWxmLmNsaWVudHNbcmVhZGFibGVdCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKLSAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnN0YXR1cyA9PSBXQUlUX1BST0NFU1M6Ci0gICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoY29ubmVjdGlvbi5tZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbm5lY3Rpb24ucmVjZWl2ZWQucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnLmJ1ZmZlciwgbXNnLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgb3RyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCiAgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbl9wcm90b2NvbC5nZXRQcm90b2NvbChpdHJhbnNwb3J0KQogICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0X3Byb3RvY29sLmdldFByb3RvY29sKG90cmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYudGFza3MucHV0KFtzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90LCAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW3NlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnNwb3J0LCBjb25uZWN0aW9uLnJlYWR5XSkKICAgICAgICAgZm9yIHdyaXRlYWJsZSBpbiB3c2V0OgogICAgICAgICAgICAgc2VsZi5jbGllbnRzW3dyaXRlYWJsZV0ud3JpdGUoKQpAQCAtMjk4LDEzICszNTQsMTcgQEAKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiQ2xvc2VzIHRoZSBzZXJ2ZXIuIiIiCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW05vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmVdKQogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQotICAgICAgICAKKwogICAgIGRlZiBzZXJ2ZShzZWxmKToKLSAgICAgICAgIiIiU2VydmUgZm9yZXZlci4iIiIKKyAgICAgICAgIiIiU2VydmUgcmVxdWVzdHMuCisKKyAgICAgICAgU2VydmUgcmVxdWVzdHMgZm9yZXZlciwgb3IgdW50aWwgc3RvcCgpIGlzIGNhbGxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3N0b3AgPSBGYWxzZQogICAgICAgICBzZWxmLnByZXBhcmUoKQotICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5fc3RvcDoKICAgICAgICAgICAgIHNlbGYuaGFuZGxlKCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZkYzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5CkBAIC0wLDAgKzEsMTIzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitpbXBvcnQgbG9nZ2luZworCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUHJvY2VzcywgVmFsdWUsIENvbmRpdGlvbgorCitmcm9tIC5UU2VydmVyIGltcG9ydCBUU2VydmVyCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitjbGFzcyBUUHJvY2Vzc1Bvb2xTZXJ2ZXIoVFNlcnZlcik6CisgICAgIiIiU2VydmVyIHdpdGggYSBmaXhlZCBzaXplIHBvb2wgb2Ygd29ya2VyIHN1YnByb2Nlc3NlcyB0byBzZXJ2aWNlIHJlcXVlc3RzCisKKyAgICBOb3RlIHRoYXQgaWYgeW91IG5lZWQgc2hhcmVkIHN0YXRlIGJldHdlZW4gdGhlIGhhbmRsZXJzIC0gaXQncyB1cCB0byB5b3UhCisgICAgV3JpdHRlbiBieSBEdmlyIFZvbGssIGRvYXQuY29tCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5udW1Xb3JrZXJzID0gMTAKKyAgICAgICAgc2VsZi53b3JrZXJzID0gW10KKyAgICAgICAgc2VsZi5pc1J1bm5pbmcgPSBWYWx1ZSgnYicsIEZhbHNlKQorICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24gPSBDb25kaXRpb24oKQorICAgICAgICBzZWxmLnBvc3RGb3JrQ2FsbGJhY2sgPSBOb25lCisKKyAgICBkZWYgc2V0UG9zdEZvcmtDYWxsYmFjayhzZWxmLCBjYWxsYmFjayk6CisgICAgICAgIGlmIG5vdCBjYWxsYWJsZShjYWxsYmFjayk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlRoaXMgaXMgbm90IGEgY2FsbGJhY2shIikKKyAgICAgICAgc2VsZi5wb3N0Rm9ya0NhbGxiYWNrID0gY2FsbGJhY2sKKworICAgIGRlZiBzZXROdW1Xb3JrZXJzKHNlbGYsIG51bSk6CisgICAgICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQiIiIKKyAgICAgICAgc2VsZi5udW1Xb3JrZXJzID0gbnVtCisKKyAgICBkZWYgd29ya2VyUHJvY2VzcyhzZWxmKToKKyAgICAgICAgIiIiTG9vcCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0iIiIKKyAgICAgICAgaWYgc2VsZi5wb3N0Rm9ya0NhbGxiYWNrOgorICAgICAgICAgICAgc2VsZi5wb3N0Rm9ya0NhbGxiYWNrKCkKKworICAgICAgICB3aGlsZSBzZWxmLmlzUnVubmluZy52YWx1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgorICAgICAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIG90cmFucy5jbG9zZSgpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IHdvcmtlcnMgYW5kIHB1dCBpbnRvIHF1ZXVlIiIiCisgICAgICAgICMgdGhpcyBpcyBhIHNoYXJlZCBzdGF0ZSB0aGF0IGNhbiB0ZWxsIHRoZSB3b3JrZXJzIHRvIGV4aXQgd2hlbiBGYWxzZQorICAgICAgICBzZWxmLmlzUnVubmluZy52YWx1ZSA9IFRydWUKKworICAgICAgICAjIGZpcnN0IGJpbmQgYW5kIGxpc3RlbiB0byB0aGUgcG9ydAorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorCisgICAgICAgICMgZm9yayB0aGUgY2hpbGRyZW4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5udW1Xb3JrZXJzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3ID0gUHJvY2Vzcyh0YXJnZXQ9c2VsZi53b3JrZXJQcm9jZXNzKQorICAgICAgICAgICAgICAgIHcuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgICAgIHcuc3RhcnQoKQorICAgICAgICAgICAgICAgIHNlbGYud29ya2Vycy5hcHBlbmQodykKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgIyB3YWl0IHVudGlsIHRoZSBjb25kaXRpb24gaXMgc2V0IGJ5IHN0b3AoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLmFjcXVpcmUoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbi53YWl0KCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IChTeXN0ZW1FeGl0LCBLZXlib2FyZEludGVycnVwdCk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgc2VsZi5pc1J1bm5pbmcudmFsdWUgPSBGYWxzZQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuaXNSdW5uaW5nLnZhbHVlID0gRmFsc2UKKyAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLmFjcXVpcmUoKQorICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24ubm90aWZ5KCkKKyAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKaW5kZXggODQ1NmUyZC4uZGYyYTdiYiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CkBAIC0xNywyNTggKzE3LDMwNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorZnJvbSBzaXgubW92ZXMgaW1wb3J0IHF1ZXVlCiBpbXBvcnQgbG9nZ2luZwotaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1pbXBvcnQgdHJhY2ViYWNrCiBpbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgUXVldWUKIAotZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRIZWFkZXJQcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sRmFjdG9yeQorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKLWNsYXNzIFRTZXJ2ZXI6Citsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAotICAiIiJCYXNlIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIsIHdoaWNoIG11c3QgaGF2ZSBhIHNlcnZlIG1ldGhvZC4iIiIKIAotICAiIiIgMyBjb25zdHJ1Y3RvcnMgZm9yIGFsbCBzZXJ2ZXJzOgotICAxKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCi0gIDIpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQotICAzKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSIiIgotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIGlmIChsZW4oYXJncykgPT0gMik6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBlbGlmIChsZW4oYXJncykgPT0gNCk6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzNdKQotICAgIGVsaWYgKGxlbihhcmdzKSA9PSA2KToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pCitjbGFzcyBUU2VydmVyKG9iamVjdCk6CisgICAgIiIiQmFzZSBpbnRlcmZhY2UgZm9yIGEgc2VydmVyLCB3aGljaCBtdXN0IGhhdmUgYSBzZXJ2ZSgpIG1ldGhvZC4KIAotICBkZWYgX19pbml0QXJnc19fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKLSAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0Ci0gICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICBUaHJlZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCBzZXJ2ZXJzOgorICAgIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyAgICAyKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyAgICAzKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiAobGVuKGFyZ3MpID09IDIpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIGVsaWYgKGxlbihhcmdzKSA9PSA0KToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbM10pCisgICAgICAgIGVsaWYgKGxlbihhcmdzKSA9PSA2KToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgX19pbml0QXJnc19fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk6CisgICAgICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0CisgICAgICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisKKyAgICAgICAgaW5wdXRfaXNfaGVhZGVyID0gaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBvdXRwdXRfaXNfaGVhZGVyID0gaXNpbnN0YW5jZShzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgaWYgYW55KChpbnB1dF9pc19oZWFkZXIsIG91dHB1dF9pc19oZWFkZXIpKSBhbmQgaW5wdXRfaXNfaGVhZGVyICE9IG91dHB1dF9pc19oZWFkZXI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUSGVhZGVyUHJvdG9jb2wgc2VydmVycyByZXF1aXJlIHRoYXQgYm90aCB0aGUgaW5wdXQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBwcm90b2NvbHMgYXJlIFRIZWFkZXJQcm90b2NvbC4iKQorCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBwYXNzCisKIAogY2xhc3MgVFNpbXBsZVNlcnZlcihUU2VydmVyKToKKyAgICAiIiJTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciB0aGF0IGp1c3QgcHVtcHMgYXJvdW5kIG9uZSB0cmFuc3BvcnQuIiIiCiAKLSAgIiIiU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgdGhhdCBqdXN0IHB1bXBzIGFyb3VuZCBvbmUgdHJhbnNwb3J0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgICAgdHJ5OgorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICBwYXNzCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgY29udGludWUKIAotICAgICAgaXRyYW5zLmNsb3NlKCkKLSAgICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKKworICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IKKyAgICAgICAgICAgICMgaW5wdXQgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQKKyAgICAgICAgICAgICMgdGhlIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKKwogCiBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIoVFNlcnZlcik6CisgICAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgogCi0gICIiIlRocmVhZGVkIHNlcnZlciB0aGF0IHNwYXducyBhIG5ldyB0aHJlYWQgcGVyIGVhY2ggY29ubmVjdGlvbi4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5oYW5kbGUsIGFyZ3M9KGNsaWVudCwpKQorICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldCA9IHNlbGYuaGFuZGxlLCBhcmdzPShjbGllbnQsKSkKLSAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCi0gICAgICAgIHQuc3RhcnQoKQotICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICByYWlzZQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6CisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgZGVmIGhhbmRsZShzZWxmLCBjbGllbnQpOgotICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICB0cnk6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgIHBhc3MKLSAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCisKIAogY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIoVFNlcnZlcik6CisgICAgIiIiU2VydmVyIHdpdGggYSBmaXhlZCBzaXplIHBvb2wgb2YgdGhyZWFkcyB3aGljaCBzZXJ2aWNlIHJlcXVlc3RzLiIiIgogCi0gICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5jbGllbnRzID0gcXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLnRocmVhZHMgPSAxMAorICAgICAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5jbGllbnRzID0gUXVldWUuUXVldWUoKQotICAgIHNlbGYudGhyZWFkcyA9IDEwCi0gICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKKyAgICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgorICAgICAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCisgICAgICAgIHNlbGYudGhyZWFkcyA9IG51bQogCi0gIGRlZiBzZXROdW1UaHJlYWRzKHNlbGYsIG51bSk6Ci0gICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCIiIgotICAgIHNlbGYudGhyZWFkcyA9IG51bQorICAgIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKKyAgICAgICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgc2VydmVUaHJlYWQoc2VsZik6Ci0gICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQotICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6CisgICAgICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKIAotICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKLSAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCi0gICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgIHRyeToKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgcGFzcwotICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvciBpbnB1dAorICAgICAgICAjIGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZQorICAgICAgICAjIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgaXRyYW5zLmNsb3NlKCkKLSAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgICIiIlN0YXJ0IGEgZml4ZWQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBwdXQgY2xpZW50IGludG8gYSBxdWV1ZSIiIgotICAgIGZvciBpIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldCA9IHNlbGYuc2VydmVUaHJlYWQpCi0gICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKLSAgICAjIFB1bXAgdGhlIHNvY2tldCBmb3IgY2xpZW50cwotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgIiIiU3RhcnQgYSBmaXhlZCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIHB1dCBjbGllbnQgaW50byBhIHF1ZXVlIiIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVUaHJlYWQpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICMgUHVtcCB0aGUgc29ja2V0IGZvciBjbGllbnRzCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50cy5wdXQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogCiBjbGFzcyBURm9ya2luZ1NlcnZlcihUU2VydmVyKToKKyAgICAiIiJBIFRocmlmdCBzZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKIAotICAiIiJBIFRocmlmdCBzZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QiIiIKLSAgIiIiCi0gIFRoaXMgaXMgbW9yZSBzY2FsYWJsZSB0aGFuIHRoZSB0aHJlYWRlZCBzZXJ2ZXIgYXMgaXQgZG9lcyBub3QgY2F1c2UKLSAgR0lMIGNvbnRlbnRpb24uCisgICAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQorICAgIEdJTCBjb250ZW50aW9uLgogCi0gIE5vdGUgdGhhdCB0aGlzIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZyb20gdGhlIHRocmVhZGluZyBzZXJ2ZXIuCi0gIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KLSAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCisgICAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KKyAgICBTcGVjaWZpY2FsbHksIHVwZGF0ZXMgdG8gc2hhcmVkIHZhcmlhYmxlcyB3aWxsIG5vIGxvbmdlciBiZSBzaGFyZWQuCisgICAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCiAKLSAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKLSAgUHl0aG9uIHN0ZGxpYi4KLSAgIiIiCisgICAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKKyAgICBQeXRob24gc3RkbGliLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNoaWxkcmVuID0gW10KLQotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgZGVmIHRyeV9jbG9zZShmaWxlKToKLSAgICAgIHRyeToKLSAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICBleGNlcHQgSU9FcnJvciwgZToKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCi0KLQotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICB0cnk6Ci0gICAgICAgIHBpZCA9IG9zLmZvcmsoKQotCi0gICAgICAgIGlmIHBpZDogIyBwYXJlbnQKLSAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChwaWQpCi0gICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKLQotICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0Ci0gICAgICAgICAgIyBjbG9zZWQgcHJvbXB0bHkKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotCi0gICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLQotICAgICAgICAgIGVjb2RlID0gMAotICAgICAgICAgIHRyeToKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIGRlZiB0cnlfY2xvc2UoZmlsZSk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oZSkKLSAgICAgICAgICAgICAgZWNvZGUgPSAxCi0gICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhlLCBleGNfaW5mbz1UcnVlKQogCi0gICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQogCi0gICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgICAgcGFzcwotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgICAgICAgICBpZiBwaWQ6ICAjIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQocGlkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQogCisgICAgICAgICAgICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0CisgICAgICAgICAgICAgICAgICAgICMgY2xvc2VkIHByb21wdGx5CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6Ci0gICAgd2hpbGUgc2VsZi5jaGlsZHJlbjoKLSAgICAgIHRyeToKLSAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIG9zLldOT0hBTkcpCi0gICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHBpZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzCisgICAgICAgICAgICAgICAgICAgICMgaW4uCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgICBpZiBwaWQ6Ci0gICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvZGUgPSAxCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCiAKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCiAKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBpZCA9IE5vbmUKKworICAgICAgICAgICAgaWYgcGlkOgorICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5CkBAIC0wLDAgKzEsMzUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHpsaWIKKworZnJvbSB0aHJpZnQuY29tcGF0IGltcG9ydCBCdWZmZXJJTywgYnl0ZV9pbmRleAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIHJlYWRWYXJpbnQsIHdyaXRlVmFyaW50Citmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0ICgKKyAgICBDUmVhZGFibGVUcmFuc3BvcnQsCisgICAgVE1lbW9yeUJ1ZmZlciwKKyAgICBUVHJhbnNwb3J0QmFzZSwKKyAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLAorKQorCisKK1UxNiA9IHN0cnVjdC5TdHJ1Y3QoIiFIIikKK0kzMiA9IHN0cnVjdC5TdHJ1Y3QoIiFpIikKK0hFQURFUl9NQUdJQyA9IDB4MEZGRgorSEFSRF9NQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkYKKworCitjbGFzcyBUSGVhZGVyQ2xpZW50VHlwZShvYmplY3QpOgorICAgIEhFQURFUlMgPSAweDAwCisKKyAgICBGUkFNRURfQklOQVJZID0gMHgwMQorICAgIFVORlJBTUVEX0JJTkFSWSA9IDB4MDIKKworICAgIEZSQU1FRF9DT01QQUNUID0gMHgwMworICAgIFVORlJBTUVEX0NPTVBBQ1QgPSAweDA0CisKKworY2xhc3MgVEhlYWRlclN1YnByb3RvY29sSUQob2JqZWN0KToKKyAgICBCSU5BUlkgPSAweDAwCisgICAgQ09NUEFDVCA9IDB4MDIKKworCitjbGFzcyBUSW5mb0hlYWRlclR5cGUob2JqZWN0KToKKyAgICBLRVlfVkFMVUUgPSAweDAxCisKKworY2xhc3MgVEhlYWRlclRyYW5zZm9ybUlEKG9iamVjdCk6CisgICAgWkxJQiA9IDB4MDEKKworCitSRUFEX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuZGVjb21wcmVzcywKK30KKworCitXUklURV9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmNvbXByZXNzLAorfQorCisKK2RlZiBfcmVhZFN0cmluZyh0cmFucyk6CisgICAgc2l6ZSA9IHJlYWRWYXJpbnQodHJhbnMpCisgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoIgorICAgICAgICApCisgICAgcmV0dXJuIHRyYW5zLnJlYWQoc2l6ZSkKKworCitkZWYgX3dyaXRlU3RyaW5nKHRyYW5zLCB2YWx1ZSk6CisgICAgd3JpdGVWYXJpbnQodHJhbnMsIGxlbih2YWx1ZSkpCisgICAgdHJhbnMud3JpdGUodmFsdWUpCisKKworY2xhc3MgVEhlYWRlclRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oYiIiKQorICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSB7fQorCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMgPSBbXQorCisgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQgPSAwCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gSEFSRF9NQVhfRlJBTUVfU0laRQorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5pc09wZW4oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQub3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuY2xvc2UoKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9oZWFkZXJzCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgbmFtZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgdmFsdWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMuY2xlYXIoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBXUklURV9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB0cmFuc2Zvcm0iKQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgc2V0X21heF9mcmFtZV9zaXplKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBub3QgMCA8IHNpemUgPCBIQVJEX01BWF9GUkFNRV9TSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWF4aW11bSBmcmFtZSBzaXplIHNob3VsZCBiZSA8ICVkIGFuZCA+IDAiICUgSEFSRF9NQVhfRlJBTUVfU0laRSkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBzaXplCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvdG9jb2xfaWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2xfaWQKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QsIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJQcm90b2NvbCBJRCBub3Qga25vdyBmb3IgY2xpZW50IHR5cGUgJWQiICUgc2VsZi5fY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICMgaWYgdGhlcmUgYXJlIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciwgcHJvZHVjZSB0aG9zZSBmaXJzdC4KKyAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoc3opCisgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHN6IC0gbGVuKGJ5dGVzX3JlYWQpCisgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQKKworICAgICAgICAjIGlmIHdlJ3ZlIGRldGVybWluZWQgdGhpcyBpcyBhbiB1bmZyYW1lZCBjbGllbnQsIGp1c3QgcGFzcyB0aGUgcmVhZAorICAgICAgICAjIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVudGlsIHdlJ3JlIHJlc2V0IGFnYWluIGF0IHRoZQorICAgICAgICAjIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZXNzYWdlLgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgICAgICMgd2UncmUgZW1wdHkgYW5kIChtYXliZSkgZnJhbWVkLiBmaWxsIHRoZSBidWZmZXJzIHdpdGggdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHNlbGYucmVhZEZyYW1lKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgIGRlZiBfc2V0X2NsaWVudF90eXBlKHNlbGYsIGNsaWVudF90eXBlKToKKyAgICAgICAgaWYgY2xpZW50X3R5cGUgbm90IGluIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNsaWVudCB0eXBlICVkIG5vdCBhbGxvd2VkIGJ5IHNlcnZlci4iICUgY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gY2xpZW50X3R5cGUKKworICAgIGRlZiByZWFkRnJhbWUoc2VsZiwgcmVxX3N6KToKKyAgICAgICAgIyB0aGUgZmlyc3Qgd29yZCBjb3VsZCBlaXRoZXIgYmUgdGhlIGxlbmd0aCBmaWVsZCBvZiBhIGZyYW1lZCBtZXNzYWdlCisgICAgICAgICMgb3IgdGhlIGZpcnN0IGJ5dGVzIG9mIGFuIHVuZnJhbWVkIG1lc3NhZ2UuCisgICAgICAgIGZpcnN0X3dvcmQgPSBzZWxmLl90cmFuc3BvcnQucmVhZEFsbChJMzIuc2l6ZSkKKyAgICAgICAgZnJhbWVfc2l6ZSwgPSBJMzIudW5wYWNrKGZpcnN0X3dvcmQpCisgICAgICAgIGlzX3VuZnJhbWVkID0gRmFsc2UKKyAgICAgICAgaWYgZnJhbWVfc2l6ZSAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChmaXJzdF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KGZpcnN0X3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisKKyAgICAgICAgaWYgaXNfdW5mcmFtZWQ6CisgICAgICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSByZXFfc3ogLSBJMzIuc2l6ZQorICAgICAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID4gMDoKKyAgICAgICAgICAgICAgICByZXN0ID0gc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN0ID0gYiIiCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGZpcnN0X3dvcmQgKyByZXN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBvaywgd2UncmUgc3RpbGwgaGVyZSBzbyB3ZSdyZSBmcmFtZWQuCisgICAgICAgIGlmIGZyYW1lX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJGcmFtZSB3YXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisgICAgICAgIHJlYWRfYnVmZmVyID0gQnVmZmVySU8oc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoZnJhbWVfc2l6ZSkpCisKKyAgICAgICAgIyB0aGUgbmV4dCB3b3JkIGlzIGVpdGhlciBnb2luZyB0byBiZSB0aGUgdmVyc2lvbiBmaWVsZCBvZiBhCisgICAgICAgICMgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgbWVzc2FnZSBvciB0aGUgbWFnaWMgdmFsdWUgKyBmbGFncyBvZiBhCisgICAgICAgICMgaGVhZGVyIHByb3RvY29sIG1lc3NhZ2UuCisgICAgICAgIHNlY29uZF93b3JkID0gcmVhZF9idWZmZXIucmVhZChJMzIuc2l6ZSkKKyAgICAgICAgdmVyc2lvbiwgPSBJMzIudW5wYWNrKHNlY29uZF93b3JkKQorICAgICAgICByZWFkX2J1ZmZlci5zZWVrKDApCisgICAgICAgIGlmIHZlcnNpb24gPj4gMTYgPT0gSEVBREVSX01BR0lDOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHNlbGYuX3BhcnNlX2hlYWRlcl9mb3JtYXQocmVhZF9idWZmZXIpCisgICAgICAgIGVsaWYgdmVyc2lvbiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbGlmIChieXRlX2luZGV4KHNlY29uZF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KHNlY29uZF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVyX2Zvcm1hdChzZWxmLCBidWZmZXIpOgorICAgICAgICAjIG1ha2UgQnVmZmVySU8gbG9vayBsaWtlIFRUcmFuc3BvcnQgZm9yIHZhcmludCBoZWxwZXJzCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydC5fYnVmZmVyID0gYnVmZmVyCisKKyAgICAgICAgYnVmZmVyLnJlYWQoMikgICMgZGlzY2FyZCB0aGUgbWFnaWMgYnl0ZXMKKyAgICAgICAgc2VsZi5mbGFncywgPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSkKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCwgPSBJMzIudW5wYWNrKGJ1ZmZlci5yZWFkKEkzMi5zaXplKSkKKworICAgICAgICBoZWFkZXJfbGVuZ3RoID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpWzBdICogNAorICAgICAgICBlbmRfb2ZfaGVhZGVycyA9IGJ1ZmZlci50ZWxsKCkgKyBoZWFkZXJfbGVuZ3RoCisgICAgICAgIGlmIGVuZF9vZl9oZWFkZXJzID4gbGVuKGJ1ZmZlci5nZXR2YWx1ZSgpKToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbiB3aG9sZSBmcmFtZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorCisgICAgICAgIHRyYW5zZm9ybXMgPSBbXQorICAgICAgICB0cmFuc2Zvcm1fY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgIGZvciBfIGluIHJhbmdlKHRyYW5zZm9ybV9jb3VudCk6CisgICAgICAgICAgICB0cmFuc2Zvcm1faWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFJFQURfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gdHJhbnNmb3JtOiAlZCIgJSB0cmFuc2Zvcm1faWQsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorICAgICAgICB0cmFuc2Zvcm1zLnJldmVyc2UoKQorCisgICAgICAgIGhlYWRlcnMgPSB7fQorICAgICAgICB3aGlsZSBidWZmZXIudGVsbCgpIDwgZW5kX29mX2hlYWRlcnM6CisgICAgICAgICAgICBoZWFkZXJfdHlwZSA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIGhlYWRlcl90eXBlID09IFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUU6CisgICAgICAgICAgICAgICAgY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGlnbm9yZSB1bmtub3duIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0gaGVhZGVycworCisgICAgICAgICMgc2tpcCBwYWRkaW5nIC8gYW55dGhpbmcgd2UgZGlkbid0IHVuZGVyc3RhbmQKKyAgICAgICAgYnVmZmVyLnNlZWsoZW5kX29mX2hlYWRlcnMpCisKKyAgICAgICAgcGF5bG9hZCA9IGJ1ZmZlci5yZWFkKCkKKyAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiB0cmFuc2Zvcm1zOgorICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcklPKHBheWxvYWQpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX3dyaXRlX2J1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKworICAgICAgICBidWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gV1JJVEVfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorCisgICAgICAgICAgICBoZWFkZXJzID0gQnVmZmVySU8oKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgc2VsZi5fcHJvdG9jb2xfaWQpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfdHJhbnNmb3JtcykpCisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgdHJhbnNmb3JtX2lkKQorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGVfaGVhZGVyczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFKQorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV9oZWFkZXJzKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl93cml0ZV9oZWFkZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCBrZXkpCisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgICAgIHBhZGRpbmdfbmVlZGVkID0gKDQgLSAobGVuKGhlYWRlcnMuZ2V0dmFsdWUoKSkgJSA0KSkgJSA0CisgICAgICAgICAgICBoZWFkZXJzLndyaXRlKGIiXHgwMCIgKiBwYWRkaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGhlYWRlcl9ieXRlcyA9IGhlYWRlcnMuZ2V0dmFsdWUoKQorCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soMTAgKyBsZW4oaGVhZGVyX2J5dGVzKSArIGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soSEVBREVSX01BR0lDKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhzZWxmLmZsYWdzKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhzZWxmLnNlcXVlbmNlX2lkKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhsZW4oaGVhZGVyX2J5dGVzKSAvLyA0KSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShoZWFkZXJfYnl0ZXMpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlVua25vd24gY2xpZW50IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIHRoZSBmcmFtZSBsZW5ndGggZmllbGQgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSBmcmFtZSBwYXlsb2FkIHNpemUKKyAgICAgICAgZnJhbWVfYnl0ZXMgPSBidWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBmcmFtZV9wYXlsb2FkX3NpemUgPSBsZW4oZnJhbWVfYnl0ZXMpIC0gNAorICAgICAgICBpZiBmcmFtZV9wYXlsb2FkX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNlbmQgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl90cmFuc3BvcnQud3JpdGUoZnJhbWVfYnl0ZXMpCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmVzdWx0ID0gYnl0ZWFycmF5KHBhcnRpYWxyZWFkKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJlc3VsdCArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJlc3VsdCkpCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8ocmVzdWx0KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKaW5kZXggNTAyNjk3OC4uMzdiMGE0ZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKQEAgLTE3LDExMCArMTcsMTcxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotCi1pbXBvcnQgdXJscGFyc2UKLWltcG9ydCBodHRwbGliCitmcm9tIGlvIGltcG9ydCBCeXRlc0lPCitpbXBvcnQgb3MKK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKIGltcG9ydCB3YXJuaW5ncwotaW1wb3J0IHNvY2tldAoraW1wb3J0IGJhc2U2NAorCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQKKworZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UKK2ltcG9ydCBzaXgKKwogCiBjbGFzcyBUSHR0cENsaWVudChUVHJhbnNwb3J0QmFzZSk6CisgICAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSwgY2FmaWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLCBrZXlfZmlsZT1Ob25lLCBzc2xfY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb25zdHJ1Y3Rpb246CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSk6Ci0gICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgorICAgICAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKKyAgICAgICAgVEh0dHBDbGllbnQodXJpLCBbcG9ydD08bj4sIHBhdGg9PHM+LCBjYWZpbGU9PGZpbGVuYW1lPiwgY2VydF9maWxlPTxmaWxlbmFtZT4sIGtleV9maWxlPTxmaWxlbmFtZT4sIHNzbF9jb250ZXh0PTxjb250ZXh0Pl0pCiAKLSAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKLSAgICBUSHR0cENsaWVudCh1cmkpCisgICAgICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4gIFRvIHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IHRoZSBzZXJ2ZXIsCisgICAgICAgIHByb3ZpZGUgdGhlIGNsaWVudCdzIGlkZW50aXR5IGJ5IHNwZWNpZnlpbmcgY2VydF9maWxlIGFuZCBrZXlfZmlsZS4gIFRvIHByb3Blcmx5CisgICAgICAgIGF1dGhlbnRpY2F0ZSB0aGUgc2VydmVyLCBzcGVjaWZ5IGVpdGhlciBjYWZpbGUgb3Igc3NsX2NvbnRleHQgd2l0aCBhIENBIGRlZmluZWQuCisgICAgICAgIE5PVEU6IGlmIGJvdGggY2FmaWxlIGFuZCBzc2xfY29udGV4dCBhcmUgZGVmaW5lZCwgc3NsX2NvbnRleHQgd2lsbCBvdmVycmlkZSBjYWZpbGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSB0aGUgVEh0dHBDbGllbnQoJ2h0dHB7c306Ly9ob3N0OnBvcnQvcGF0aCcpIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgc2VsZi5ob3N0ID0gdXJpX29yX2hvc3QKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgICAgIGFzc2VydCBwYXRoCisgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgICAgICBzZWxmLnNjaGVtZSA9ICdodHRwJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVyaV9vcl9ob3N0KQorICAgICAgICAgICAgc2VsZi5zY2hlbWUgPSBwYXJzZWQuc2NoZW1lCisgICAgICAgICAgICBhc3NlcnQgc2VsZi5zY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJykKKyAgICAgICAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwX2NsaWVudC5IVFRQX1BPUlQKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwX2NsaWVudC5IVFRQU19QT1JUCisgICAgICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRfZmlsZQorICAgICAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleV9maWxlCisgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWNhZmlsZSkgaWYgKGNhZmlsZSBhbmQgbm90IHNzbF9jb250ZXh0KSBlbHNlIHNzbF9jb250ZXh0CisgICAgICAgICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhcnNlZC5wYXRoCisgICAgICAgICAgICBpZiBwYXJzZWQucXVlcnk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRoICs9ICc/JXMnICUgcGFyc2VkLnF1ZXJ5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3h5ID0gdXJsbGliLnJlcXVlc3QuZ2V0cHJveGllcygpW3NlbGYuc2NoZW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcm94eSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHVybGxpYi5yZXF1ZXN0LnByb3h5X2J5cGFzcyhzZWxmLmhvc3QpOgorICAgICAgICAgICAgICAgIHByb3h5ID0gTm9uZQorICAgICAgICBpZiBwcm94eToKKyAgICAgICAgICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShwcm94eSkKKyAgICAgICAgICAgIHNlbGYucmVhbGhvc3QgPSBzZWxmLmhvc3QKKyAgICAgICAgICAgIHNlbGYucmVhbHBvcnQgPSBzZWxmLnBvcnQKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQKKyAgICAgICAgICAgIHNlbGYucHJveHlfYXV0aCA9IHNlbGYuYmFzaWNfcHJveHlfYXV0aF9oZWFkZXIocGFyc2VkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWFsaG9zdCA9IHNlbGYucmVhbHBvcnQgPSBzZWxmLnByb3h5X2F1dGggPSBOb25lCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCisgICAgICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IE5vbmUKIAotICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4iIiIKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGJhc2ljX3Byb3h5X2F1dGhfaGVhZGVyKHByb3h5KToKKyAgICAgICAgaWYgcHJveHkgaXMgTm9uZSBvciBub3QgcHJveHkudXNlcm5hbWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBhcCA9ICIlczolcyIgJSAodXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkudXNlcm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkucGFzc3dvcmQpKQorICAgICAgICBjciA9IGJhc2U2NC5iNjRlbmNvZGUoYXApLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuICJCYXNpYyAiICsgY3IKIAotICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6Ci0gICAgICB3YXJuaW5ncy53YXJuKCJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cDovL2hvc3Q6cG9ydC9wYXRoJykgc3ludGF4IiwgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAotICAgICAgc2VsZi5wb3J0ID0gcG9ydAotICAgICAgYXNzZXJ0IHBhdGgKLSAgICAgIHNlbGYucGF0aCA9IHBhdGgKLSAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCi0gICAgZWxzZToKLSAgICAgIHBhcnNlZCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaV9vcl9ob3N0KQotICAgICAgc2VsZi5zY2hlbWUgPSBwYXJzZWQuc2NoZW1lCi0gICAgICBhc3NlcnQgc2VsZi5zY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJykKLSAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQX1BPUlQKLSAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQU19QT1JUCi0gICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKLSAgICAgIHNlbGYucGF0aCA9IHBhcnNlZC5wYXRoCi0gICAgICBpZiBwYXJzZWQucXVlcnk6Ci0gICAgICAgIHNlbGYucGF0aCArPSAnPyVzJyAlIHBhcnNlZC5xdWVyeQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19odHRwID0gTm9uZQotICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQorICAgIGRlZiB1c2luZ19wcm94eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhbGhvc3QgaXMgbm90IE5vbmUKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6Ci0gICAgICBzZWxmLl9faHR0cCA9IGh0dHBsaWIuSFRUUChzZWxmLmhvc3QsIHNlbGYucG9ydCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX2h0dHAgPSBodHRwbGliLkhUVFBTKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6CisgICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYuX190aW1lb3V0KQorICAgICAgICBlbGlmIHNlbGYuc2NoZW1lID09ICdodHRwcyc6CisgICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9maWxlPXNlbGYua2V5ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZT1zZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ9c2VsZi5jb250ZXh0KQorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCk6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5zZXRfdHVubmVsKHNlbGYucmVhbGhvc3QsIHNlbGYucmVhbHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUHJveHktQXV0aG9yaXphdGlvbiI6IHNlbGYucHJveHlfYXV0aH0pCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuX19odHRwLmNsb3NlKCkKLSAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX19odHRwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fX2h0dHAgPSBOb25lCisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gTm9uZQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19odHRwICE9IE5vbmUKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHAgaXMgbm90IE5vbmUKIAotICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6Ci0gICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnZ2V0ZGVmYXVsdHRpbWVvdXQnKToKLSAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6CisgICAgICAgIGlmIG1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX190aW1lb3V0ID0gbXMgLyAxMDAwLjAKIAotICAgIGlmIG1zIGlzIE5vbmU6Ci0gICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3RpbWVvdXQgPSBtcy8xMDAwLjAKKyAgICBkZWYgc2V0Q3VzdG9tSGVhZGVycyhzZWxmLCBoZWFkZXJzKToKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gaGVhZGVycwogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXR1cm4gc2VsZi5fX2h0dHAuZmlsZS5yZWFkKHN6KQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19odHRwX3Jlc3BvbnNlLnJlYWQoc3opCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIF9fd2l0aFRpbWVvdXQoZik6Ci0gICAgZGVmIF9mKCphcmdzLCAqKmt3YXJncyk6Ci0gICAgICBvcmlnX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQotICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KGFyZ3NbMF0uX190aW1lb3V0KQotICAgICAgcmVzdWx0ID0gZigqYXJncywgKiprd2FyZ3MpCi0gICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob3JpZ190aW1lb3V0KQotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHJldHVybiBfZgorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pc09wZW4oKToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBzZWxmLm9wZW4oKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBpZiBzZWxmLmlzT3BlbigpOgotICAgICAgc2VsZi5jbG9zZSgpCi0gICAgc2VsZi5vcGVuKCk7CisgICAgICAgICMgUHVsbCBkYXRhIG91dCBvZiBidWZmZXIKKyAgICAgICAgZGF0YSA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKIAotICAgICMgUHVsbCBkYXRhIG91dCBvZiBidWZmZXIKLSAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICAjIEhUVFAgcmVxdWVzdAorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCkgYW5kIHNlbGYuc2NoZW1lID09ICJodHRwIjoKKyAgICAgICAgICAgICMgbmVlZCBmdWxsIFVSTCBvZiByZWFsIGhvc3QgZm9yIEhUVFAgcHJveHkgaGVyZSAoSFRUUFMgdXNlcyBDT05ORUNUIHR1bm5lbCkKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCAiaHR0cDovLyVzOiVzJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYucmVhbGhvc3QsIHNlbGYucmVhbHBvcnQsIHNlbGYucGF0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZi5wYXRoKQogCi0gICAgIyBIVFRQIHJlcXVlc3QKLSAgICBzZWxmLl9faHR0cC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZi5wYXRoKQorICAgICAgICAjIFdyaXRlIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKQorICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgc3RyKGxlbihkYXRhKSkpCisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKSBhbmQgc2VsZi5zY2hlbWUgPT0gImh0dHAiIGFuZCBzZWxmLnByb3h5X2F1dGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoIlByb3h5LUF1dGhvcml6YXRpb24iLCBzZWxmLnByb3h5X2F1dGgpCiAKLSAgICAjIFdyaXRlIGhlYWRlcnMKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0hvc3QnLCBzZWxmLmhvc3QpCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKQotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIobGVuKGRhdGEpKSkKLSAgICBzZWxmLl9faHR0cC5lbmRoZWFkZXJzKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX19jdXN0b21faGVhZGVycyBvciAnVXNlci1BZ2VudCcgbm90IGluIHNlbGYuX19jdXN0b21faGVhZGVyczoKKyAgICAgICAgICAgIHVzZXJfYWdlbnQgPSAnUHl0aG9uL1RIdHRwQ2xpZW50JworICAgICAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICAgICAgICAgIGlmIHNjcmlwdDoKKyAgICAgICAgICAgICAgICB1c2VyX2FnZW50ID0gJyVzICglcyknICUgKHVzZXJfYWdlbnQsIHVybGxpYi5wYXJzZS5xdW90ZShzY3JpcHQpKQorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKIAotICAgICMgV3JpdGUgcGF5bG9hZAotICAgIHNlbGYuX19odHRwLnNlbmQoZGF0YSkKKyAgICAgICAgaWYgc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIHNpeC5pdGVyaXRlbXMoc2VsZi5fX2N1c3RvbV9oZWFkZXJzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoa2V5LCB2YWwpCiAKLSAgICAjIEdldCByZXBseSB0byBmbHVzaCB0aGUgcmVxdWVzdAotICAgIHNlbGYuY29kZSwgc2VsZi5tZXNzYWdlLCBzZWxmLmhlYWRlcnMgPSBzZWxmLl9faHR0cC5nZXRyZXBseSgpCisgICAgICAgIHNlbGYuX19odHRwLmVuZGhlYWRlcnMoKQogCi0gICMgRGVjb3JhdGUgaWYgd2Uga25vdyBob3cgdG8gdGltZW91dAotICBpZiBoYXNhdHRyKHNvY2tldCwgJ2dldGRlZmF1bHR0aW1lb3V0Jyk6Ci0gICAgZmx1c2ggPSBfX3dpdGhUaW1lb3V0KGZsdXNoKQorICAgICAgICAjIFdyaXRlIHBheWxvYWQKKyAgICAgICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQorCisgICAgICAgICMgR2V0IHJlcGx5IHRvIGZsdXNoIHRoZSByZXF1ZXN0CisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gc2VsZi5fX2h0dHAuZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmNvZGUgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5zdGF0dXMKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhc29uCisgICAgICAgIHNlbGYuaGVhZGVycyA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLm1zZwpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0Y2E1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKQEAgLTAsMCArMSwzOTYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3NsCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSAuc3NsY29tcGF0IGltcG9ydCBfbWF0Y2hfaG9zdG5hbWUsIF9tYXRjaF9oYXNfaXBhZGRyZXNzCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoCisgICAgJ2RlZmF1bHQnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1fX25hbWVfXykKKworCitjbGFzcyBUU1NMQmFzZShvYmplY3QpOgorICAgICMgU1NMQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuOQorICAgIF9oYXNfc3NsX2NvbnRleHQgPSBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwOUYwCisKKyAgICAjIGNpcGhlcnMgYXJndW1lbnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDwgMi43LjAKKyAgICBfaGFzX2NpcGhlcnMgPSBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwMEYwCisKKyAgICAjIEZvciBweXRob24gPj0gMi43LjksIHVzZSBsYXRlc3QgVExTIHRoYXQgYm90aCBjbGllbnQgYW5kIHNlcnZlcgorICAgICMgc3VwcG9ydHMuCisgICAgIyBTU0wgMi4wIGFuZCAzLjAgYXJlIGRpc2FibGVkIHZpYSBzc2wuT1BfTk9fU1NMdjIgYW5kIHNzbC5PUF9OT19TU0x2My4KKyAgICAjIEZvciBweXRob24gPCAyLjcuOSwgdXNlIFRMUyAxLjAgc2luY2UgVExTdjFfWCBub3IgT1BfTk9fU1NMdlggaXMKKyAgICAjIHVuYXZhaWxhYmxlLgorICAgIF9kZWZhdWx0X3Byb3RvY29sID0gc3NsLlBST1RPQ09MX1NTTHYyMyBpZiBfaGFzX3NzbF9jb250ZXh0IGVsc2UgXAorICAgICAgICBzc2wuUFJPVE9DT0xfVExTdjEKKworICAgIGRlZiBfaW5pdF9jb250ZXh0KHNlbGYsIHNzbF92ZXJzaW9uKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgc2VsZi5fY29udGV4dCA9IHNzbC5TU0xDb250ZXh0KHNzbF92ZXJzaW9uKQorICAgICAgICAgICAgaWYgc2VsZi5fY29udGV4dC5wcm90b2NvbCA9PSBzc2wuUFJPVE9DT0xfU1NMdjIzOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjIKKyAgICAgICAgICAgICAgICBzZWxmLl9jb250ZXh0Lm9wdGlvbnMgfD0gc3NsLk9QX05PX1NTTHYzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jb250ZXh0ID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fc3NsX3ZlcnNpb24gPSBzc2xfdmVyc2lvbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9zaG91bGRfdmVyaWZ5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udGV4dC52ZXJpZnlfbW9kZSAhPSBzc2wuQ0VSVF9OT05FCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jZXJ0X3JlcXMgIT0gc3NsLkNFUlRfTk9ORQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNzbF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xfY29udGV4dC5wcm90b2NvbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NzbF92ZXJzaW9uCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3NsX2NvbnRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZXh0CisKKyAgICBTU0xfVkVSU0lPTiA9IF9kZWZhdWx0X3Byb3RvY29sCisgICAgIiIiCisgIERlZmF1bHQgU1NMIHZlcnNpb24uCisgIEZvciBiYWNrd29yZCBjb21wYXRpYmlsaXR5LCBpdCBjYW4gYmUgbW9kaWZpZWQuCisgIFVzZSBfX2luaXRfXyBrZXl3b2FyZCBhcmd1bWVudCAic3NsX3ZlcnNpb24iIGluc3RlYWQuCisgICIiIgorCisgICAgZGVmIF9kZXByZWNhdGVkX2FyZyhzZWxmLCBhcmdzLCBrd2FyZ3MsIHBvcywga2V5KToKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDw9IHBvczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZWFsX3BvcyA9IHBvcyArIDMKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICclZHRoIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZGVwcmVjYXRlZC4nCisgICAgICAgICAgICAncGxlYXNlIHVzZSBrZXl3YXJkIGFyZ3VtZW50IGluc3RlYW5kLicKKyAgICAgICAgICAgICUgcmVhbF9wb3MsIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0zKQorCisgICAgICAgIGlmIGtleSBpbiBrd2FyZ3M6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgICAgICAgJ0R1cGxpY2F0ZSBhcmd1bWVudDogJWR0aCBhcmd1bWVudCBhbmQgJXMga2V5d2FyZCBhcmd1bWVudC4nCisgICAgICAgICAgICAgICAgJSAocmVhbF9wb3MsIGtleSkpCisgICAgICAgIGt3YXJnc1trZXldID0gYXJnc1twb3NdCisKKyAgICBkZWYgX3VuaXhfc29ja2V0X2FyZyhzZWxmLCBob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICBrZXkgPSAndW5peF9zb2NrZXQnCisgICAgICAgIGlmIGhvc3QgaXMgTm9uZSBhbmQgcG9ydCBpcyBOb25lIGFuZCBsZW4oYXJncykgPT0gMSBhbmQga2V5IG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICBrd2FyZ3Nba2V5XSA9IGFyZ3NbMF0KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSA9PSAnU1NMX1ZFUlNJT04nOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnU1NMX1ZFUlNJT04gaXMgZGVwcmVjYXRlZC4nCisgICAgICAgICAgICAgICAgJ3BsZWFzZSB1c2Ugc3NsX3ZlcnNpb24gYXR0cmlidXRlIGluc3RlYWQuJywKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF92ZXJzaW9uCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX3NpZGUsIGhvc3QsIHNzbF9vcHRzKToKKyAgICAgICAgc2VsZi5fc2VydmVyX3NpZGUgPSBzZXJ2ZXJfc2lkZQorICAgICAgICBpZiBUU1NMQmFzZS5TU0xfVkVSU0lPTiAhPSBzZWxmLl9kZWZhdWx0X3Byb3RvY29sOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnU1NMX1ZFUlNJT04gaXMgZGVwcmVjYXRlZC4nCisgICAgICAgICAgICAgICAgJ3BsZWFzZSB1c2Ugc3NsX3ZlcnNpb24ga2V5d2FyZCBhcmd1bWVudCBpbnN0ZWFkLicsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuX2NvbnRleHQgPSBzc2xfb3B0cy5wb3AoJ3NzbF9jb250ZXh0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fc2VydmVyX2hvc3RuYW1lID0gTm9uZQorICAgICAgICBpZiBub3Qgc2VsZi5fc2VydmVyX3NpZGU6CisgICAgICAgICAgICBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUgPSBzc2xfb3B0cy5wb3AoJ3NlcnZlcl9ob3N0bmFtZScsIGhvc3QpCisgICAgICAgIGlmIHNlbGYuX2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLl9jdXN0b21fY29udGV4dCA9IFRydWUKKyAgICAgICAgICAgIGlmIHNzbF9vcHRzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdJbmNvbXBhdGlibGUgYXJndW1lbnRzOiBzc2xfY29udGV4dCBhbmQgJXMnCisgICAgICAgICAgICAgICAgICAgICUgJyAnLmpvaW4oc3NsX29wdHMua2V5cygpKSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ3NzbF9jb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgdmVyc2lvbiBvZiBQeXRob24nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY3VzdG9tX2NvbnRleHQgPSBGYWxzZQorICAgICAgICAgICAgc3NsX3ZlcnNpb24gPSBzc2xfb3B0cy5wb3AoJ3NzbF92ZXJzaW9uJywgVFNTTEJhc2UuU1NMX1ZFUlNJT04pCisgICAgICAgICAgICBzZWxmLl9pbml0X2NvbnRleHQoc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbF9vcHRzLnBvcCgnY2VydF9yZXFzJywgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gc3NsX29wdHMucG9wKCdjYV9jZXJ0cycsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBzc2xfb3B0cy5wb3AoJ2tleWZpbGUnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IHNzbF9vcHRzLnBvcCgnY2VydGZpbGUnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gc3NsX29wdHMucG9wKCdjaXBoZXJzJywgTm9uZSkKKworICAgICAgICAgICAgaWYgc3NsX29wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24ga2V5d29yZCBhcmd1bWVudHM6ICcsICcgJy5qb2luKHNzbF9vcHRzLmtleXMoKSkpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2FfY2VydHM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAnY2FfY2VydHMgaXMgbmVlZGVkIHdoZW4gY2VydF9yZXFzIGlzIG5vdCBzc2wuQ0VSVF9OT05FJykKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKHNlbGYuY2FfY2VydHMsIG9zLlJfT0spOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgY2FfY2VydHMgZmlsZSAiJXMiICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbm90IHJlYWRhYmxlLCBjYW5ub3QgdmFsaWRhdGUgU1NMICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2VydGlmaWNhdGVzLicgJSAoc2VsZi5jYV9jZXJ0cykpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2VydGZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jZXJ0ZmlsZQorCisgICAgQGNlcnRmaWxlLnNldHRlcgorICAgIGRlZiBjZXJ0ZmlsZShzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgIGlmIHNlbGYuX3NlcnZlcl9zaWRlIGFuZCBub3QgY2VydGZpbGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjZXJ0ZmlsZSBpcyBuZWVkZWQgZm9yIHNlcnZlci1zaWRlJykKKyAgICAgICAgaWYgY2VydGZpbGUgYW5kIG5vdCBvcy5hY2Nlc3MoY2VydGZpbGUsIG9zLlJfT0spOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignTm8gc3VjaCBjZXJ0ZmlsZSBmb3VuZDogJXMnICUgKGNlcnRmaWxlKSkKKyAgICAgICAgc2VsZi5fY2VydGZpbGUgPSBjZXJ0ZmlsZQorCisgICAgZGVmIF93cmFwX3NvY2tldChzZWxmLCBzb2NrKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2N1c3RvbV9jb250ZXh0OgorICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQudmVyaWZ5X21vZGUgPSBzZWxmLmNlcnRfcmVxcworICAgICAgICAgICAgICAgIGlmIHNlbGYuY2VydGZpbGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQubG9hZF9jZXJ0X2NoYWluKHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYua2V5ZmlsZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNpcGhlcnM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQuc2V0X2NpcGhlcnMoc2VsZi5jaXBoZXJzKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYuY2FfY2VydHMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xfY29udGV4dC53cmFwX3NvY2tldCgKKyAgICAgICAgICAgICAgICBzb2NrLCBzZXJ2ZXJfc2lkZT1zZWxmLl9zZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9c2VsZi5fc2VydmVyX2hvc3RuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3NsX29wdHMgPSB7CisgICAgICAgICAgICAgICAgJ3NzbF92ZXJzaW9uJzogc2VsZi5fc3NsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgJ3NlcnZlcl9zaWRlJzogc2VsZi5fc2VydmVyX3NpZGUsCisgICAgICAgICAgICAgICAgJ2NhX2NlcnRzJzogc2VsZi5jYV9jZXJ0cywKKyAgICAgICAgICAgICAgICAna2V5ZmlsZSc6IHNlbGYua2V5ZmlsZSwKKyAgICAgICAgICAgICAgICAnY2VydGZpbGUnOiBzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICdjZXJ0X3JlcXMnOiBzZWxmLmNlcnRfcmVxcywKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIHNlbGYuY2lwaGVyczoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9oYXNfY2lwaGVyczoKKyAgICAgICAgICAgICAgICAgICAgc3NsX29wdHNbJ2NpcGhlcnMnXSA9IHNlbGYuY2lwaGVycworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NpcGhlcnMgaXMgc3BlY2lmaWVkIGJ1dCBpZ25vcmVkIGR1ZSB0byBvbGQgUHl0aG9uIHZlcnNpb24nKQorICAgICAgICAgICAgcmV0dXJuIHNzbC53cmFwX3NvY2tldChzb2NrLCAqKnNzbF9vcHRzKQorCisKK2NsYXNzIFRTU0xTb2NrZXQoVFNvY2tldC5UU29ja2V0LCBUU1NMQmFzZSk6CisgICAgIiIiCisgICAgU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTb2NrZXQKKworICAgIFRoaXMgY2xhc3MgY3JlYXRlcyBvdXRib3VuZCBzb2NrZXRzIHdyYXBwZWQgdXNpbmcgdGhlCisgICAgcHl0aG9uIHN0YW5kYXJkIHNzbCBtb2R1bGUgZm9yIGVuY3J5cHRlZCBjb25uZWN0aW9ucy4KKyAgICAiIiIKKworICAgICMgTmV3IHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwKKyAgICAjICAgICAgICAgICAgICAqKnNzbF9hcmdzKToKKyAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB2YWxpZGF0ZT1UcnVlLAorICAgICMgICAgICAgICAgICAgIGNhX2NlcnRzPU5vbmUsIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwKKyAgICAjICAgICAgICAgICAgICB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIlBvc2l0aW9uYWwgYXJndW1lbnRzOiBgYGhvc3RgYCwgYGBwb3J0YGAsIGBgdW5peF9zb2NrZXRgYAorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOiBgYGtleWZpbGVgYCwgYGBjZXJ0ZmlsZWBgLCBgYGNlcnRfcmVxc2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBzc2xfdmVyc2lvbmBgLCBgYGNhX2NlcnRzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGNpcGhlcnNgYCAoUHl0aG9uIDIuNy4wIG9yIGxhdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGAgKFB5dGhvbiAyLjcuOSBvciBsYXRlcikKKyAgICAgICAgUGFzc2VkIHRvIHNzbC53cmFwX3NvY2tldC4gU2VlIHNzbC53cmFwX3NvY2tldCBkb2N1bWVudGF0aW9uLgorCisgICAgICAgIEFsdGVybmF0aXZlIGtleXdvcmQgYXJndW1lbnRzOiAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICAgIGBgc3NsX2NvbnRleHRgYDogc3NsLlNTTENvbnRleHQgdG8gYmUgdXNlZCBmb3IgU1NMQ29udGV4dC53cmFwX3NvY2tldAorICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGA6IFBhc3NlZCB0byBTU0xDb250ZXh0LndyYXBfc29ja2V0CisKKyAgICAgICAgQ29tbW9uIGtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgICAgYGB2YWxpZGF0ZV9jYWxsYmFja2BgIChjZXJ0LCBob3N0bmFtZSkgLT4gTm9uZToKKyAgICAgICAgICAgICAgQ2FsbGVkIGFmdGVyIFNTTCBoYW5kc2hha2UuIENhbiByYWlzZSB3aGVuIGhvc3RuYW1lIGRvZXMgbm90CisgICAgICAgICAgICAgIG1hdGNoIHRoZSBjZXJ0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5pc192YWxpZCA9IEZhbHNlCisgICAgICAgIHNlbGYucGVlcmNlcnQgPSBOb25lCisKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDY6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50JykKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl91bml4X3NvY2tldF9hcmcoaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDAsICd2YWxpZGF0ZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDEsICdjYV9jZXJ0cycpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDIsICdrZXlmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMywgJ2NlcnRmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgNCwgJ3VuaXhfc29ja2V0JykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgNSwgJ2NpcGhlcnMnKQorCisgICAgICAgIHZhbGlkYXRlID0ga3dhcmdzLnBvcCgndmFsaWRhdGUnLCBOb25lKQorICAgICAgICBpZiB2YWxpZGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNlcnRfcmVxc19uYW1lID0gJ0NFUlRfUkVRVUlSRUQnIGlmIHZhbGlkYXRlIGVsc2UgJ0NFUlRfTk9ORScKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzPXNzbC4lcyBpbnN0ZWFkJworICAgICAgICAgICAgICAgICUgY2VydF9yZXFzX25hbWUsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBpZiAnY2VydF9yZXFzJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3Qgc3BlY2lmeSBib3RoIHZhbGlkYXRlIGFuZCBjZXJ0X3JlcXMnKQorICAgICAgICAgICAga3dhcmdzWydjZXJ0X3JlcXMnXSA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIHZhbGlkYXRlIGVsc2Ugc3NsLkNFUlRfTk9ORQorCisgICAgICAgIHVuaXhfc29ja2V0ID0ga3dhcmdzLnBvcCgndW5peF9zb2NrZXQnLCBOb25lKQorICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayA9IGt3YXJncy5wb3AoJ3ZhbGlkYXRlX2NhbGxiYWNrJywgX21hdGNoX2hvc3RuYW1lKQorICAgICAgICBUU1NMQmFzZS5fX2luaXRfXyhzZWxmLCBGYWxzZSwgaG9zdCwga3dhcmdzKQorICAgICAgICBUU29ja2V0LlRTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICByZXR1cm4gc2VsZi5jZXJ0X3JlcXMgIT0gc3NsLkNFUlRfTk9ORQorCisgICAgQHZhbGlkYXRlLnNldHRlcgorICAgIGRlZiB2YWxpZGF0ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIHZhbHVlIGVsc2Ugc3NsLkNFUlRfTk9ORQorCisgICAgZGVmIF9kb19vcGVuKHNlbGYsIGZhbWlseSwgc29ja3R5cGUpOgorICAgICAgICBwbGFpbl9zb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9zb2NrZXQocGxhaW5fc29jaykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBsYWluX3NvY2suY2xvc2UoKQorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byBpbml0aWFsaXplIFNTTCcKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24obXNnKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc3VwZXIoVFNTTFNvY2tldCwgc2VsZikub3BlbigpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICBzZWxmLnBlZXJjZXJ0ID0gc2VsZi5oYW5kbGUuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrKHNlbGYucGVlcmNlcnQsIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmlzX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sIHN0cihleCkpCisKKworY2xhc3MgVFNTTFNlcnZlclNvY2tldChUU29ja2V0LlRTZXJ2ZXJTb2NrZXQsIFRTU0xCYXNlKToKKyAgICAiIiJTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclNvY2tldAorCisgICAgVGhpcyB1c2VzIHRoZSBzc2wgbW9kdWxlJ3Mgd3JhcF9zb2NrZXQoKSBtZXRob2QgdG8gcHJvdmlkZSBTU0wKKyAgICBuZWdvdGlhdGVkIGVuY3J5cHRpb24uCisgICAgIiIiCisKKyAgICAjIE5ldyBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgY2VydGZpbGU9J2NlcnQucGVtJywgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIlBvc2l0aW9uYWwgYXJndW1lbnRzOiBgYGhvc3RgYCwgYGBwb3J0YGAsIGBgdW5peF9zb2NrZXRgYAorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOiBgYGtleWZpbGVgYCwgYGBjZXJ0ZmlsZWBgLCBgYGNlcnRfcmVxc2BgLCBgYHNzbF92ZXJzaW9uYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGNhX2NlcnRzYGAsIGBgY2lwaGVyc2BgIChQeXRob24gMi43LjAgb3IgbGF0ZXIpCisgICAgICAgIFNlZSBzc2wud3JhcF9zb2NrZXQgZG9jdW1lbnRhdGlvbi4KKworICAgICAgICBBbHRlcm5hdGl2ZSBrZXl3b3JkIGFyZ3VtZW50czogKFB5dGhvbiAyLjcuOSBvciBsYXRlcikKKyAgICAgICAgICBgYHNzbF9jb250ZXh0YGA6IHNzbC5TU0xDb250ZXh0IHRvIGJlIHVzZWQgZm9yIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKyAgICAgICAgICBgYHNlcnZlcl9ob3N0bmFtZWBgOiBQYXNzZWQgdG8gU1NMQ29udGV4dC53cmFwX3NvY2tldAorCisgICAgICAgIENvbW1vbiBrZXl3b3JkIGFyZ3VtZW50OgorICAgICAgICAgIGBgdmFsaWRhdGVfY2FsbGJhY2tgYCAoY2VydCwgaG9zdG5hbWUpIC0+IE5vbmU6CisgICAgICAgICAgICAgIENhbGxlZCBhZnRlciBTU0wgaGFuZHNoYWtlLiBDYW4gcmFpc2Ugd2hlbiBob3N0bmFtZSBkb2VzIG5vdAorICAgICAgICAgICAgICBtYXRjaCB0aGUgY2VydC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBpZiBsZW4oYXJncykgPiAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudCcpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fdW5peF9zb2NrZXRfYXJnKGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAwLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAxLCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAyLCAnY2lwaGVycycpCisKKyAgICAgICAgaWYgJ3NzbF9jb250ZXh0JyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgIyBQcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvcnMgZm9yIGRlZmF1bHQgdmFsdWVzCisgICAgICAgICAgICBpZiAnY2VydF9yZXFzJyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snY2VydF9yZXFzJ10gPSBzc2wuQ0VSVF9OT05FCisgICAgICAgICAgICBpZidjZXJ0ZmlsZScgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRmaWxlJ10gPSAnY2VydC5wZW0nCisKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0gXAorICAgICAgICAgICAga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIFRydWUsIE5vbmUsIGt3YXJncykKKyAgICAgICAgVFNvY2tldC5UU2VydmVyU29ja2V0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0KQorICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5IGFuZCBub3QgX21hdGNoX2hhc19pcGFkZHJlc3M6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOZWVkIGlwYWRkcmVzcyBhbmQgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGUgdG8gdmVyaWZ5IGNsaWVudCBjZXJ0aWZpY2F0ZScpCisKKyAgICBkZWYgc2V0Q2VydGZpbGUoc2VsZiwgY2VydGZpbGUpOgorICAgICAgICAiIiJTZXQgb3IgY2hhbmdlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZmlsZSB1c2VkIHRvIHdyYXAgbmV3CisgICAgICAgIGNvbm5lY3Rpb25zLgorCisgICAgICAgIEBwYXJhbSBjZXJ0ZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiAnL2V0Yy9jZXJ0cy9zZXJ2ZXIucGVtJworICAgICAgICBAdHlwZSBjZXJ0ZmlsZTogc3RyCisKKyAgICAgICAgUmFpc2VzIGFuIElPRXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBjZXJ0ZmlsZSBpcyBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICdzZXRDZXJ0ZmlsZSBpcyBkZXByZWNhdGVkLiBwbGVhc2UgdXNlIGNlcnRmaWxlIHByb3BlcnR5IGluc3RlYWQuJywKKyAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBsYWluX2NsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuX3dyYXBfc29ja2V0KHBsYWluX2NsaWVudCkKKyAgICAgICAgZXhjZXB0IChzc2wuU1NMRXJyb3IsIHNvY2tldC5lcnJvciwgT1NFcnJvcik6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdFcnJvciB3aGlsZSBhY2NlcHRpbmcgZnJvbSAlcycsIGFkZHIpCisgICAgICAgICAgICAjIGZhaWxlZCBoYW5kc2hha2Uvc3NsIHdyYXAsIGNsb3NlIHNvY2tldCB0byBjbGllbnQKKyAgICAgICAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAjIHJhaXNlCisgICAgICAgICAgICAjIFdlIGNhbid0IHJhaXNlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgaXQga2lsbHMgbW9zdCBUU2VydmVyIGRlcml2ZWQKKyAgICAgICAgICAgICMgc2VydmUoKSBtZXRob2RzLgorICAgICAgICAgICAgIyBJbnN0ZWFkLCByZXR1cm4gTm9uZSwgYW5kIGxldCB0aGUgVFNlcnZlciBpbnN0YW5jZSBkZWFsIHdpdGggaXQgaW4KKyAgICAgICAgICAgICMgb3RoZXIgZXhjZXB0aW9uIGhhbmRsaW5nLiAgKGJ1dCBUU2ltcGxlU2VydmVyIGRpZXMgYW55d2F5KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgY2xpZW50LnBlZXJjZXJ0ID0gY2xpZW50LmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayhjbGllbnQucGVlcmNlcnQsIGFkZHJbMF0pCisgICAgICAgICAgICAgICAgY2xpZW50LmlzX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHZhbGlkYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBhZGRyZXNzOiAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkclswXSwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXN1bHQgPSBUU29ja2V0LlRTb2NrZXQoKQorICAgICAgICByZXN1bHQuaGFuZGxlID0gY2xpZW50CisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CmluZGV4IGQ3N2UzNTguLmE3ZDY2MTcgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQpAQCAtMTcsMTQ3ICsxNywxODUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgKgotaW1wb3J0IG9zCiBpbXBvcnQgZXJybm8KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzeXMKIAotY2xhc3MgVFNvY2tldEJhc2UoVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgotICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0IGlzIG5vdCBOb25lOgotICAgICAgcmV0dXJuIFsoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSwgTm9uZSwgTm9uZSwgc2VsZi5fdW5peF9zb2NrZXQpXQotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzb2NrZXQuQUZfVU5TUEVDLCBzb2NrZXQuU09DS19TVFJFQU0sIDAsIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFNlcnZlclRyYW5zcG9ydEJhc2UKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgaWYgc2VsZi5oYW5kbGU6Ci0gICAgICBzZWxmLmhhbmRsZS5jbG9zZSgpCi0gICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKK2NsYXNzIFRTb2NrZXRCYXNlKFRUcmFuc3BvcnRCYXNlKToKKyAgICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl91bml4X3NvY2tldCldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09DS19TVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisKIAogY2xhc3MgVFNvY2tldChUU29ja2V0QmFzZSk6Ci0gICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lKToKLSAgICAiIiJJbml0aWFsaXplIGEgVFNvY2tldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBUU29ja2V0CiAKLSAgICBAcGFyYW0gaG9zdChzdHIpICBUaGUgaG9zdCB0byBjb25uZWN0IHRvLgotICAgIEBwYXJhbSBwb3J0KGludCkgIFRoZSAoVENQKSBwb3J0IHRvIGNvbm5lY3QgdG8uCi0gICAgQHBhcmFtIHVuaXhfc29ja2V0KHN0cikgIFRoZSBmaWxlbmFtZSBvZiBhIHVuaXggc29ja2V0IHRvIGNvbm5lY3QgdG8uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3N0IGFuZCBwb3J0IHdpbGwgYmUgaWdub3JlZC4pCi0gICAgIiIiCisgICAgICAgIEBwYXJhbSBob3N0KHN0cikgIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgIEBwYXJhbSBwb3J0KGludCkgIFRoZSAoVENQKSBwb3J0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3QgYW5kIHBvcnQgd2lsbCBiZSBpZ25vcmVkLikKKyAgICAgICAgQHBhcmFtIHNvY2tldF9mYW1pbHkoaW50KSAgVGhlIHNvY2tldCBmYW1pbHkgdG8gdXNlIHdpdGggdGhpcyBzb2NrZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKKyAgICAgICAgc2VsZi5fdGltZW91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKIAotICAgIHNlbGYuaG9zdCA9IGhvc3QKLSAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgc2VsZi5oYW5kbGUgPSBOb25lCi0gICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAotICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgZGVmIHNldEhhbmRsZShzZWxmLCBoKToKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBoCiAKLSAgZGVmIHNldEhhbmRsZShzZWxmLCBoKToKLSAgICBzZWxmLmhhbmRsZSA9IGgKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGUgaXMgbm90IE5vbmUKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmhhbmRsZSAhPSBOb25lCisgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgorICAgICAgICBpZiBtcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fdGltZW91dCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAogCi0gIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKLSAgICBpZiBtcyBpcyBOb25lOgotICAgICAgc2VsZi5fdGltZW91dCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgc2VsZi5fdGltZW91dCA9IG1zLzEwMDAuMAorICAgICAgICBpZiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKIAotICAgIGlmIChzZWxmLmhhbmRsZSAhPSBOb25lKToKLSAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHJldHVybiBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgdHJ5OgotICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKLSAgICAgIGZvciByZXMgaW4gcmVzMDoKLSAgICAgICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9hZGRyZXNzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdW5peF9zb2NrZXQgaWYgc2VsZi5fdW5peF9zb2NrZXQgZWxzZSAnJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkFMUkVBRFlfT1BFTikKICAgICAgICAgdHJ5OgotICAgICAgICAgIHNlbGYuaGFuZGxlLmNvbm5lY3QocmVzWzRdKQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgICAgIGlmIHJlcyBpcyBub3QgcmVzMFstMV06Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBlCi0gICAgICAgIGJyZWFrCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKLSAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldCAlcycgJSBzZWxmLl91bml4X3NvY2tldAotICAgICAgZWxzZToKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byAlczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbWVzc2FnZT1tZXNzYWdlKQorICAgICAgICAgICAgYWRkcnMgPSBzZWxmLl9yZXNvbHZlQWRkcigpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBtc2cgPSAnZmFpbGVkIHRvIHJlc29sdmUgc29ja2FkZHIgZm9yICcgKyBzdHIoc2VsZi5fYWRkcmVzcykKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24obXNnKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCisgICAgICAgIGZvciBmYW1pbHksIHNvY2t0eXBlLCBfLCBfLCBzb2NrYWRkciBpbiBhZGRyczoKKyAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuX2RvX29wZW4oZmFtaWx5LCBzb2NrdHlwZSkKKyAgICAgICAgICAgIGhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlLmNvbm5lY3Qoc29ja2FkZHIpCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGUgPSBoYW5kbGUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgaGFuZGxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQ291bGQgbm90IGNvbm5lY3QgdG8gJXMnLCBzb2NrYWRkciwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgbXNnID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIGFueSBvZiAlcycgJSBsaXN0KG1hcChsYW1iZGEgYTogYVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRycykpCisgICAgICAgIGxvZ2dlci5lcnJvcihtc2cpCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICB0cnk6Ci0gICAgICBidWZmID0gc2VsZi5oYW5kbGUucmVjdihzeikKLSAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgaWYgKGUuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFU0VUIGFuZAotICAgICAgICAgIChzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbicgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSkpOgotICAgICAgICAjIGZyZWVic2QgYW5kIE1hY2ggZG9uJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YKLSAgICAgICAgIyBhbmQgZmFpbCB3aXRoIEVDT05OUkVTRVQgaWYgcGVlciBwZXJmb3JtZWQgc2h1dGRvd24uCi0gICAgICAgICMgU2VlIGNvcnJlc3BvbmRpbmcgY29tbWVudCBhbmQgY29kZSBpbiBUU29ja2V0OjpyZWFkKCkKLSAgICAgICAgIyBpbiBsaWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAuCi0gICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAjIFRyaWdnZXIgdGhlIGNoZWNrIHRvIHJhaXNlIHRoZSBFTkRfT0ZfRklMRSBleGNlcHRpb24gYmVsb3cuCi0gICAgICAgIGJ1ZmYgPSAnJwotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UKLSAgICBpZiBsZW4oYnVmZikgPT0gMDoKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCBtZXNzYWdlPSdUU29ja2V0IHJlYWQgMCBieXRlcycpCi0gICAgcmV0dXJuIGJ1ZmYKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1ZmYgPSBzZWxmLmhhbmRsZS5yZWN2KHN6KQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CisgICAgICAgICAgICBpZiAoZS5hcmdzWzBdID09IGVycm5vLkVDT05OUkVTRVQgYW5kCisgICAgICAgICAgICAgICAgICAgIChzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbicgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSkpOgorICAgICAgICAgICAgICAgICMgZnJlZWJzZCBhbmQgTWFjaCBkb24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdgorICAgICAgICAgICAgICAgICMgYW5kIGZhaWwgd2l0aCBFQ09OTlJFU0VUIGlmIHBlZXIgcGVyZm9ybWVkIHNodXRkb3duLgorICAgICAgICAgICAgICAgICMgU2VlIGNvcnJlc3BvbmRpbmcgY29tbWVudCBhbmQgY29kZSBpbiBUU29ja2V0OjpyZWFkKCkKKyAgICAgICAgICAgICAgICAjIGluIGxpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcC4KKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAjIFRyaWdnZXIgdGhlIGNoZWNrIHRvIHJhaXNlIHRoZSBFTkRfT0ZfRklMRSBleGNlcHRpb24gYmVsb3cuCisgICAgICAgICAgICAgICAgYnVmZiA9ICcnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIGxlbihidWZmKSA9PSAwOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgcmVhZCAwIGJ5dGVzJykKKyAgICAgICAgcmV0dXJuIGJ1ZmYKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmZik6Ci0gICAgaWYgbm90IHNlbGYuaGFuZGxlOgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1lc3NhZ2U9J1RyYW5zcG9ydCBub3Qgb3BlbicpCi0gICAgc2VudCA9IDAKLSAgICBoYXZlID0gbGVuKGJ1ZmYpCi0gICAgd2hpbGUgc2VudCA8IGhhdmU6Ci0gICAgICBwbHVzID0gc2VsZi5oYW5kbGUuc2VuZChidWZmKQotICAgICAgaWYgcGx1cyA9PSAwOgotICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgbWVzc2FnZT0nVFNvY2tldCBzZW50IDAgYnl0ZXMnKQotICAgICAgc2VudCArPSBwbHVzCi0gICAgICBidWZmID0gYnVmZltwbHVzOl0KKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUcmFuc3BvcnQgbm90IG9wZW4nKQorICAgICAgICBzZW50ID0gMAorICAgICAgICBoYXZlID0gbGVuKGJ1ZmYpCisgICAgICAgIHdoaWxlIHNlbnQgPCBoYXZlOgorICAgICAgICAgICAgcGx1cyA9IHNlbGYuaGFuZGxlLnNlbmQoYnVmZikKKyAgICAgICAgICAgIGlmIHBsdXMgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgc2VudCAwIGJ5dGVzJykKKyAgICAgICAgICAgIHNlbnQgKz0gcGx1cworICAgICAgICAgICAgYnVmZiA9IGJ1ZmZbcGx1czpdCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBhc3MKKwogCiBjbGFzcyBUU2VydmVyU29ja2V0KFRTb2NrZXRCYXNlLCBUU2VydmVyVHJhbnNwb3J0QmFzZSk6Ci0gICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lKToKLSAgICBzZWxmLmhvc3QgPSBOb25lCi0gICAgc2VsZi5wb3J0ID0gcG9ydAotICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKLSAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6CisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl9iYWNrbG9nID0gMTI4CiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgIGZvciByZXMgaW4gcmVzMDoKLSAgICAgIGlmIHJlc1swXSBpcyBzb2NrZXQuQUZfSU5FVDYgb3IgcmVzIGlzIHJlczBbLTFdOgotICAgICAgICBicmVhaworICAgIGRlZiBzZXRCYWNrbG9nKHNlbGYsIGJhY2tsb2c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuX2JhY2tsb2cgPSBiYWNrbG9nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGNhbm4ndCB1cGRhdGUgYmFja2xvZyB3aGVuIGl0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICMgaGFuZGxlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICBsb2dnZXIud2FybignWW91IGhhdmUgdG8gc2V0IGJhY2tsb2cgYmVmb3JlIGxpc3Rlbi4nKQogCi0gICAgIyBXZSBuZWVkIHJlbW92ZSB0aGUgb2xkIHVuaXggc29ja2V0IGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQKLSAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCi0gICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgICAgdHJ5OgotICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCi0gICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6Ci0gICAgICAgIGVubywgbWVzc2FnZSA9IGVyci5hcmdzCi0gICAgICAgIGlmIGVubyA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6Ci0gICAgICAgICAgb3MudW5saW5rKHJlc1s0XSkKKyAgICBkZWYgbGlzdGVuKHNlbGYpOgorICAgICAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQorICAgICAgICBzb2NrZXRfZmFtaWx5ID0gc2VsZi5fc29ja2V0X2ZhbWlseSA9PSBzb2NrZXQuQUZfVU5TUEVDIGFuZCBzb2NrZXQuQUZfSU5FVDYgb3Igc2VsZi5fc29ja2V0X2ZhbWlseQorICAgICAgICBmb3IgcmVzIGluIHJlczA6CisgICAgICAgICAgICBpZiByZXNbMF0gaXMgc29ja2V0X2ZhbWlseSBvciByZXMgaXMgcmVzMFstMV06CisgICAgICAgICAgICAgICAgYnJlYWsKIAotICAgIHNlbGYuaGFuZGxlID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICBzZWxmLmhhbmRsZS5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgIGlmIGhhc2F0dHIoc2VsZi5oYW5kbGUsICdzZXRfdGltZW91dCcpOgotICAgICAgc2VsZi5oYW5kbGUuc2V0X3RpbWVvdXQoTm9uZSkKLSAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKLSAgICBzZWxmLmhhbmRsZS5saXN0ZW4oMTI4KQorICAgICAgICAjIFdlIG5lZWQgcmVtb3ZlIHRoZSBvbGQgdW5peCBzb2NrZXQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZAorICAgICAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCisgICAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgorICAgICAgICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKKyAgICAgICAgICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncworICAgICAgICAgICAgICAgIGlmIGVubyA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQotICAgIHJlc3VsdCA9IFRTb2NrZXQoKQotICAgIHJlc3VsdC5zZXRIYW5kbGUoY2xpZW50KQotICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICBzZWxmLmhhbmRsZS5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKKyAgICAgICAgc2VsZi5oYW5kbGUubGlzdGVuKHNlbGYuX2JhY2tsb2cpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICByZXN1bHQgPSBUU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CmluZGV4IDEyZTUxYTkuLmQxMzA2MGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQpAQCAtMTcsMzE1ICsxNyw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssdW5wYWNrCitmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KK2Zyb20gLi5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPCisKIAogY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbihURXhjZXB0aW9uKToKKyAgICAiIiJDdXN0b20gVHJhbnNwb3J0IEV4Y2VwdGlvbiBjbGFzcyIiIgogCi0gICIiIkN1c3RvbSBUcmFuc3BvcnQgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgVU5LTk9XTiA9IDAKKyAgICBOT1RfT1BFTiA9IDEKKyAgICBBTFJFQURZX09QRU4gPSAyCisgICAgVElNRURfT1VUID0gMworICAgIEVORF9PRl9GSUxFID0gNAorICAgIE5FR0FUSVZFX1NJWkUgPSA1CisgICAgU0laRV9MSU1JVCA9IDYKKyAgICBJTlZBTElEX0NMSUVOVF9UWVBFID0gNwogCi0gIFVOS05PV04gPSAwCi0gIE5PVF9PUEVOID0gMQotICBBTFJFQURZX09QRU4gPSAyCi0gIFRJTUVEX09VVCA9IDMKLSAgRU5EX09GX0ZJTEUgPSA0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKLSAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi50eXBlID0gdHlwZQogCi1jbGFzcyBUVHJhbnNwb3J0QmFzZToKK2NsYXNzIFRUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKIAotICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgdHJhbnNwb3J0IGxheWVyLiIiIgorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRBbGwoc2VsZiwgc3opOgorICAgICAgICBidWZmID0gYicnCisgICAgICAgIGhhdmUgPSAwCisgICAgICAgIHdoaWxlIChoYXZlIDwgc3opOgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3ogLSBoYXZlKQorICAgICAgICAgICAgY2h1bmtMZW4gPSBsZW4oY2h1bmspCisgICAgICAgICAgICBoYXZlICs9IGNodW5rTGVuCisgICAgICAgICAgICBidWZmICs9IGNodW5rCiAKLSAgZGVmIHJlYWRBbGwoc2VsZiwgc3opOgotICAgIGJ1ZmYgPSAnJwotICAgIGhhdmUgPSAwCi0gICAgd2hpbGUgKGhhdmUgPCBzeik6Ci0gICAgICBjaHVuayA9IHNlbGYucmVhZChzei1oYXZlKQotICAgICAgaGF2ZSArPSBsZW4oY2h1bmspCi0gICAgICBidWZmICs9IGNodW5rCisgICAgICAgICAgICBpZiBjaHVua0xlbiA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yKCkKIAotICAgICAgaWYgbGVuKGNodW5rKSA9PSAwOgotICAgICAgICByYWlzZSBFT0ZFcnJvcigpCisgICAgICAgIHJldHVybiBidWZmCiAKLSAgICByZXR1cm4gYnVmZgorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCiAKICMgVGhpcyBjbGFzcyBzaG91bGQgYmUgdGhvdWdodCBvZiBhcyBhbiBpbnRlcmZhY2UuCi1jbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQ6Ci0gICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCitjbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQob2JqZWN0KToKKyAgICAiIiJiYXNlIGNsYXNzIGZvciB0cmFuc3BvcnRzIHRoYXQgYXJlIHJlYWRhYmxlIGZyb20gQyIiIgogCi0gICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKLSAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCi0gICMgICAgICAgICAgICAgICB5b3UgdG8gd3JpdGUgYWZ0ZXIgcmVhZGluZy4KKyAgICAjIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgY2hhbmdpbmcgdGhpcyBpbnRlcmZhY2UgdG8gYWxsb3cgdXMgdG8gdXNlCisgICAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCisgICAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgogCi0gICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yawotICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgICIiIkEgY1N0cmluZ0lPIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNodW5rIHdlIGFyZSByZWFkaW5nLiIiIgotICAgIHBhc3MKKyAgICAjIE5PVEU6IFRoaXMgaXMgYSBjbGFzc2ljIGNsYXNzLCBzbyBwcm9wZXJ0aWVzIHdpbGwgTk9UIHdvcmsKKyAgICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCisgICAgICAgIHBhc3MKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAiIiJSZWZpbGxzIGNzdHJpbmdpb19idWYuCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KIAotICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcwotICAgIHRoZSBvbGQgY3N0cmluZ2lvX2J1ZikuIHBhcnRpYWxyZWFkIGlzIHdoYXQgdGhlIEMgY29kZSBoYXMgcmVhZCBmcm9tIHRoZQotICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCi0gICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCi0gICAgbGluZXMgb2Ygc2VsZi5fYnVmIHNob3VsZCBiZSBmaW5lLgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgdXNlZCBidWZmZXIgKHdoaWNoIGNhbiBidXQgbmVlZCBub3QgYmUgdGhlIHNhbWUgYXMKKyAgICAgICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCisgICAgICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgbmV3LCBub3QgYm9ycm93ZWQgcmVmZXJlbmNlLiAgU29tZXRoaW5nIGFsb25nIHRoZQorICAgICAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCiAKLSAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCisgICAgICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4iIiIKKworICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKKworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gdHJhbnMKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgorCisgICAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6CisgICAgICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKQorICAgICAgICByZXR1cm4gYnVmZmVyZWQKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgorCisgICAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYSAoY29uZmlndXJhYmxlKSBmaXhlZC1zaXplIHJlYWQgYnVmZmVyCisgICAgYnV0IGJ1ZmZlcnMgYWxsIHdyaXRlcyB1bnRpbCBhIGZsdXNoIGlzIHBlcmZvcm1lZC4KICAgICAiIiIKLSAgICBwYXNzCisgICAgREVGQVVMVF9CVUZGRVIgPSA0MDk2CiAKLWNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgcmJ1Zl9zaXplPURFRkFVTFRfQlVGRkVSKToKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICMgUGFzcyBzdHJpbmcgYXJndW1lbnQgdG8gaW5pdGlhbGl6ZSByZWFkIGJ1ZmZlciBhcyBjU3RyaW5nSU8uSW5wdXRUeXBlCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorICAgICAgICBzZWxmLl9fcmJ1Zl9zaXplID0gcmJ1Zl9zaXplCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgbGlzdGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnlCYXNlOgorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICMgb24gZXhjZXB0aW9uIHJlc2V0IHdidWYgc28gaXQgZG9lc24ndCBjb250YWluIGEgcGFydGlhbCBmdW5jdGlvbiBjYWxsCisgICAgICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHJhaXNlIGUKIAotICAiIiJCYXNlIGNsYXNzIGZvciBhIFRyYW5zcG9ydCBGYWN0b3J5IiIiCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUob3V0KQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiB0cmFucworICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeToKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5fX3JidWZfc2l6ZToKKyAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgYSByZWFkIG9mIGFzIG11Y2ggYXMgd2UgY2FuLgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkKHNlbGYuX19yYnVmX3NpemUpCiAKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgorICAgICAgICAjIGJ1dCBtYWtlIHN1cmUgd2UgZG8gcmVhZCByZXFsZW4gYnl0ZXMuCisgICAgICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBidWZmZXJlZAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0KLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgotCi0gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgotICBidXQgYnVmZmVycyBhbGwgd3JpdGVzIHVudGlsIGEgZmx1c2ggaXMgcGVyZm9ybWVkLgotICAiIiIKLQotICBERUZBVUxUX0JVRkZFUiA9IDQwOTYKLQotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZSA9IERFRkFVTFRfQlVGRkVSKToKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oIiIpCi0gICAgc2VsZi5fX3JidWZfc2l6ZSA9IHJidWZfc2l6ZQotCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQotCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCi0KLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQotCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0Ci0KLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKLQotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQotCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19yYnVmCi0KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKLSAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgotICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCi0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKLQotICAgICMgYnV0IG1ha2Ugc3VyZSB3ZSBkbyByZWFkIHJlcWxlbiBieXRlcy4KLSAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocmV0c3RyaW5nKQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCiBjbGFzcyBUTWVtb3J5QnVmZmVyKFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJXcmFwcyBhIGNTdHJpbmdJTyBvYmplY3QgYXMgYSBUVHJhbnNwb3J0LgorICAgICIiIldyYXBzIGEgY0J5dGVzSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KIAotICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKLSAgICAgICAgdGhlbiBpbW1lZGlhdGVseSByZWFkIGZyb20gaXQuICBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gYQotICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCi0gIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCi0gICIiIgorICAgIE5PVEU6IFVubGlrZSB0aGUgQysrIHZlcnNpb24gb2YgdGhpcyBjbGFzcywgeW91IGNhbm5vdCB3cml0ZSB0byBpdAorICAgICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKKyAgICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgd29yayBsaWtlIHRoZSBDKysgdmVyc2lvbi4KKyAgICAiIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSk6Ci0gICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUsIG9mZnNldD0wKToKKyAgICAgICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCiAKLSAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKLSAgICBvdGhlcndpc2UsIGl0IGlzIGZvciB3cml0aW5nIiIiCi0gICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLl9idWZmZXIgPSBTdHJpbmdJTyh2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8oKQorICAgICAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKKyAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBpZiBvZmZzZXQ6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIuc2VlayhvZmZzZXQpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fYnVmZmVyLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGdldHZhbHVlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQorICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5nZXR2YWx1ZSgpCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAjIG9ubHkgb25lIHNob3QgYXQgcmVhZGluZy4uLgotICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KKyAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeToKIAotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgorY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpCi0gICAgcmV0dXJuIGZyYW1lZAorICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQorICAgICAgICByZXR1cm4gZnJhbWVkCiAKIAogY2xhc3MgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBmcmFtZXMgaXRzIEkvTyB3aGVuIHdyaXRpbmcuIiIiCiAKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgZnJhbWVzIGl0cyBJL08gd2hlbiB3cml0aW5nLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCk6Ci0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5yZWFkRnJhbWUoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotICAgIHNlbGYucmVhZEZyYW1lKCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKKyAgICAgICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5fX3RyYW5zLnJlYWRBbGwoc3opKQogCi0gIGRlZiByZWFkRnJhbWUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCi0gICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLl9fdHJhbnMucmVhZEFsbChzeikpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICB3c3ogPSBsZW4od291dCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZworICAgICAgICAjIHR3byBzZXBhcmF0ZSBjYWxscyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LiBTb2NrZXQgd3JpdGVzIGluCisgICAgICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQorICAgICAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKKyAgICAgICAgYnVmID0gcGFjaygiIWkiLCB3c3opICsgd291dAorICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHdzeiA9IGxlbih3b3V0KQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgIyBOLkIuOiBEb2luZyB0aGlzIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIFdBWSBjaGVhcGVyIHRoYW4gbWFraW5nCi0gICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgotICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQotICAgICMgZ29vZCBqb2Igb2YgbWFuYWdpbmcgc3RyaW5nIGJ1ZmZlciBvcGVyYXRpb25zIHdpdGhvdXQgZXhjZXNzaXZlIGNvcGllcwotICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKLSAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQotICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19yYnVmCi0KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgotICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKLSAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKLSAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCi0gICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46Ci0gICAgICBzZWxmLnJlYWRGcmFtZSgpCi0gICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocHJlZml4KQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAorICAgICAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKKyAgICAgICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYucmVhZEZyYW1lKCkKKyAgICAgICAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAogCiBjbGFzcyBURmlsZU9iamVjdFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSk6Ci0gICIiIldyYXBzIGEgZmlsZS1saWtlIG9iamVjdCB0byBtYWtlIGl0IHdvcmsgYXMgYSBUaHJpZnQgdHJhbnNwb3J0LiIiIgorICAgICIiIldyYXBzIGEgZmlsZS1saWtlIG9iamVjdCB0byBtYWtlIGl0IHdvcmsgYXMgYSBUaHJpZnQgdHJhbnNwb3J0LiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKLSAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgorICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc3opCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgc2VsZi5maWxlb2JqLmZsdXNoKCkKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai5mbHVzaCgpCisKKworY2xhc3MgVFNhc2xDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgIiIiCisgICAgU0FTTCB0cmFuc3BvcnQKKyAgICAiIiIKKworICAgIFNUQVJUID0gMQorICAgIE9LID0gMgorICAgIEJBRCA9IDMKKyAgICBFUlJPUiA9IDQKKyAgICBDT01QTEVURSA9IDUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbT0nR1NTQVBJJywKKyAgICAgICAgICAgICAgICAgKipzYXNsX2t3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICB0cmFuc3BvcnQ6IGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHVzZSwgdHlwaWNhbGx5IGp1c3QgYSBUU29ja2V0CisgICAgICAgIGhvc3Q6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIHNlcnZpY2U6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBzZXJ2aWNlLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBtZWNoYW5pc206IHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIHRvIHVzZQorCisgICAgICAgIEFsbCBvdGhlciBrd2FyZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHB1cmVzYXNsLmNsaWVudC5TQVNMQ2xpZW50CisgICAgICAgIGNvbnN0cnVjdG9yLgorICAgICAgICAiIiIKKworICAgICAgICBmcm9tIHB1cmVzYXNsLmNsaWVudCBpbXBvcnQgU0FTTENsaWVudAorCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgICAgIHNlbGYuc2FzbCA9IFNBU0xDbGllbnQoaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtLCAqKnNhc2xfa3dhcmdzKQorCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi50cmFuc3BvcnQuaXNPcGVuKCk6CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKKworICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5TVEFSVCwgc2VsZi5zYXNsLm1lY2hhbmlzbSkKKyAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKCkpCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHN0YXR1cywgY2hhbGxlbmdlID0gc2VsZi5yZWN2X3Nhc2xfbXNnKCkKKyAgICAgICAgICAgIGlmIHN0YXR1cyA9PSBzZWxmLk9LOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLk9LLCBzZWxmLnNhc2wucHJvY2VzcyhjaGFsbGVuZ2UpKQorICAgICAgICAgICAgZWxpZiBzdGF0dXMgPT0gc2VsZi5DT01QTEVURToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zYXNsLmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBTQVNMIG5lZ290aWF0aW9uIHdhcyBjb21wbGV0ZSIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgIkJhZCBTQVNMIG5lZ290aWF0aW9uIHN0YXR1czogJWQgKCVzKSIKKyAgICAgICAgICAgICAgICAgICAgJSAoc3RhdHVzLCBjaGFsbGVuZ2UpKQorCisgICAgZGVmIHNlbmRfc2FzbF9tc2coc2VsZiwgc3RhdHVzLCBib2R5KToKKyAgICAgICAgaGVhZGVyID0gcGFjaygiPkJJIiwgc3RhdHVzLCBsZW4oYm9keSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKGhlYWRlciArIGJvZHkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGRlZiByZWN2X3Nhc2xfbXNnKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDUpCisgICAgICAgIHN0YXR1cywgbGVuZ3RoID0gdW5wYWNrKCI+QkkiLCBoZWFkZXIpCisgICAgICAgIGlmIGxlbmd0aCA+IDA6CisgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXlsb2FkID0gIiIKKyAgICAgICAgcmV0dXJuIHN0YXR1cywgcGF5bG9hZAorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShkYXRhKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBlbmNvZGVkID0gc2VsZi5zYXNsLndyYXAoZGF0YSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJycuam9pbigocGFjaygiIWkiLCBsZW4oZW5jb2RlZCkpLCBlbmNvZGVkKSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisKKyAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorCisgICAgZGVmIF9yZWFkX2ZyYW1lKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDQpCisgICAgICAgIGxlbmd0aCwgPSB1bnBhY2soJyFpJywgaGVhZGVyKQorICAgICAgICBlbmNvZGVkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5zYXNsLnVud3JhcChlbmNvZGVkKSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zYXNsLmRpc3Bvc2UoKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCisKKyAgICAjIGJhc2VkIG9uIFRGcmFtZWRUcmFuc3BvcnQKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKKyAgICAgICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCisgICAgICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLl9yZWFkX2ZyYW1lKCkKKyAgICAgICAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkKaW5kZXggYjZkY2I0ZS4uYTI3ZjBhZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkKQEAgLTE2LDMwICsxNiwzMyBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cywgSW50ZXJmYWNlLCBBdHRyaWJ1dGUKLWZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgUHJvdG9jb2wsIFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKKworZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTworaW1wb3J0IHN0cnVjdAorCitmcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRlciwgSW50ZXJmYWNlLCBBdHRyaWJ1dGUKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgU2VydmVyRmFjdG9yeSwgQ2xpZW50RmFjdG9yeSwgXAogICAgIGNvbm5lY3Rpb25Eb25lCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyCitmcm9tIHR3aXN0ZWQuaW50ZXJuZXQudGhyZWFkcyBpbXBvcnQgZGVmZXJUb1RocmVhZAogZnJvbSB0d2lzdGVkLnByb3RvY29scyBpbXBvcnQgYmFzaWMKLWZyb20gdHdpc3RlZC5weXRob24gaW1wb3J0IGxvZwogZnJvbSB0d2lzdGVkLndlYiBpbXBvcnQgc2VydmVyLCByZXNvdXJjZSwgaHR0cAogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCiAKIGNsYXNzIFRNZXNzYWdlU2VuZGVyVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKIAogICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgogICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKICAgICBkZWYgZmx1c2goc2VsZik6CiAgICAgICAgIG1zZyA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgICAgIHNlbGYuc2VuZE1lc3NhZ2UobXNnKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICByZXR1cm4gc2VsZi5zZW5kTWVzc2FnZShtc2cpCiAKICAgICBkZWYgc2VuZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKQEAgLTUyLDcgKzU1LDcgQEAKICAgICAgICAgc2VsZi5mdW5jID0gZnVuYwogCiAgICAgZGVmIHNlbmRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgICBzZWxmLmZ1bmMobWVzc2FnZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZnVuYyhtZXNzYWdlKQogCiAKIGNsYXNzIFRocmlmdENsaWVudFByb3RvY29sKGJhc2ljLkludDMyU3RyaW5nUmVjZWl2ZXIpOgpAQCAtNzksMTEgKzgyLDE4IEBACiAgICAgICAgIHNlbGYuc3RhcnRlZC5jYWxsYmFjayhzZWxmLmNsaWVudCkKIAogICAgIGRlZiBjb25uZWN0aW9uTG9zdChzZWxmLCByZWFzb249Y29ubmVjdGlvbkRvbmUpOgotICAgICAgICBmb3Igayx2IGluIHNlbGYuY2xpZW50Ll9yZXFzLml0ZXJpdGVtcygpOgorICAgICAgICAjIHRoZSBjYWxsZWQgZXJyYmFja3MgY2FuIGFkZCBpdGVtcyB0byBvdXIgY2xpZW50J3MgX3JlcXMsCisgICAgICAgICMgc28gd2UgbmVlZCB0byB1c2UgYSB0bXAsIGFuZCBpdGVyYXRlIHVudGlsIG5vIG1vcmUgcmVxdWVzdHMKKyAgICAgICAgIyBhcmUgYWRkZWQgZHVyaW5nIGVycmJhY2tzCisgICAgICAgIGlmIHNlbGYuY2xpZW50OgogICAgICAgICAgICAgdGV4ID0gVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0Nvbm5lY3Rpb24gY2xvc2VkJykKLSAgICAgICAgICAgIHYuZXJyYmFjayh0ZXgpCisgICAgICAgICAgICAgICAgbWVzc2FnZT0nQ29ubmVjdGlvbiBjbG9zZWQgKCVzKScgJSByZWFzb24pCisgICAgICAgICAgICB3aGlsZSBzZWxmLmNsaWVudC5fcmVxczoKKyAgICAgICAgICAgICAgICBfLCB2ID0gc2VsZi5jbGllbnQuX3JlcXMucG9waXRlbSgpCisgICAgICAgICAgICAgICAgdi5lcnJiYWNrKHRleCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudC5fcmVxcworICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCiAKICAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgogICAgICAgICB0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkKQEAgLTk5LDYgKzEwOSwxMDggQEAKICAgICAgICAgbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKQogCiAKK2NsYXNzIFRocmlmdFNBU0xDbGllbnRQcm90b2NvbChUaHJpZnRDbGllbnRQcm90b2NvbCk6CisKKyAgICBTVEFSVCA9IDEKKyAgICBPSyA9IDIKKyAgICBCQUQgPSAzCisgICAgRVJST1IgPSA0CisgICAgQ09NUExFVEUgPSA1CisKKyAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaG9zdD1Ob25lLCBzZXJ2aWNlPU5vbmUsIG1lY2hhbmlzbT0nR1NTQVBJJywgKipzYXNsX2t3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBzZXJ2aWNlOiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyJ3Mgc2VydmljZSwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKKworICAgICAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAorICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZnJvbSBwdXJlc2FzbC5jbGllbnQgaW1wb3J0IFNBU0xDbGllbnQKKyAgICAgICAgc2VsZi5TQVNMQ0xpZW50ID0gU0FTTENsaWVudAorCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLl9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkKKworICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkID0gTm9uZQorICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cyA9IE5vbmUKKyAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCisKKyAgICAgICAgaWYgaG9zdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCisKKyAgICBkZWYgY3JlYXRlU0FTTENsaWVudChzZWxmLCBob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5zYXNsID0gc2VsZi5TQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKiprd2FyZ3MpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgbXNnKToKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYuc2FzbC53cmFwKG1zZykKKyAgICAgICAgbGVuX2FuZF9lbmNvZGVkID0gJycuam9pbigoc3RydWN0LnBhY2soJyFpJywgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmRpc3BhdGNoKHNlbGYsIGxlbl9hbmRfZW5jb2RlZCkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgY29ubmVjdGlvbk1hZGUoc2VsZik6CisgICAgICAgIHNlbGYuX3NlbmRTQVNMTWVzc2FnZShzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBpbml0aWFsX21lc3NhZ2UgPSB5aWVsZCBkZWZlclRvVGhyZWFkKHNlbGYuc2FzbC5wcm9jZXNzKQorICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5PSywgaW5pdGlhbF9tZXNzYWdlKQorCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzdGF0dXMsIGNoYWxsZW5nZSA9IHlpZWxkIHNlbGYuX3JlY2VpdmVTQVNMTWVzc2FnZSgpCisgICAgICAgICAgICBpZiBzdGF0dXMgPT0gc2VsZi5PSzoKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGRlZmVyVG9UaHJlYWQoc2VsZi5zYXNsLnByb2Nlc3MsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5PSywgcmVzcG9uc2UpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCB0aGF0IFNBU0wgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdvdGlhdGlvbiB3YXMgY29tcGxldGUiCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbihtc2csIG1lc3NhZ2U9bXNnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1zZyA9ICJCYWQgU0FTTCBuZWdvdGlhdGlvbiBzdGF0dXM6ICVkICglcykiICUgKHN0YXR1cywgY2hhbGxlbmdlKQorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbihtc2csIG1lc3NhZ2U9bXNnKQorCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBOb25lCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmNvbm5lY3Rpb25NYWRlKHNlbGYpCisKKyAgICBkZWYgX3NlbmRTQVNMTWVzc2FnZShzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBpZiBib2R5IGlzIE5vbmU6CisgICAgICAgICAgICBib2R5ID0gIiIKKyAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soIj5CSSIsIHN0YXR1cywgbGVuKGJvZHkpKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZShoZWFkZXIgKyBib2R5KQorCisgICAgZGVmIF9yZWNlaXZlU0FTTE1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBkZWZlci5EZWZlcnJlZCgpCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fc3RhdHVzID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZAorCisgICAgZGVmIGNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbj1jb25uZWN0aW9uRG9uZSk6CisgICAgICAgIGlmIHNlbGYuY2xpZW50OgorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuY29ubmVjdGlvbkxvc3Qoc2VsZiwgcmVhc29uKQorCisgICAgZGVmIGRhdGFSZWNlaXZlZChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZDoKKyAgICAgICAgICAgICMgd2UgZ290IGEgc2FzbCBjaGFsbGVuZ2UgaW4gdGhlIGZvcm1hdCAoc3RhdHVzLCBsZW5ndGgsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICMgc2F2ZSB0aGUgc3RhdHVzLCBsZXQgSW50TlN0cmluZ1JlY2VpdmVyIHBpZWNlIHRoZSBjaGFsbGVuZ2UgZGF0YSB0b2dldGhlcgorICAgICAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9zdGF0dXMsID0gc3RydWN0LnVucGFjaygiQiIsIGRhdGFbMF0pCisgICAgICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5kYXRhUmVjZWl2ZWQoc2VsZiwgZGF0YVsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5vcm1hbCBmcmFtZSwgbGV0IEludE5TdHJpbmdSZWNlaXZlciBwaWVjZSBpdCB0b2dldGhlcgorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuZGF0YVJlY2VpdmVkKHNlbGYsIGRhdGEpCisKKyAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgorICAgICAgICBpZiBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkOgorICAgICAgICAgICAgIyB0aGUgZnJhbWUgaXMganVzdCBhIFNBU0wgY2hhbGxlbmdlCisgICAgICAgICAgICByZXNwb25zZSA9IChzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cywgZnJhbWUpCisgICAgICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkLmNhbGxiYWNrKHJlc3BvbnNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGVyZSdzIGEgc2Vjb25kIDQgYnl0ZSBsZW5ndGggcHJlZml4IGluc2lkZSB0aGUgZnJhbWUKKyAgICAgICAgICAgIGRlY29kZWRfZnJhbWUgPSBzZWxmLnNhc2wudW53cmFwKGZyYW1lWzQ6XSkKKyAgICAgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLnN0cmluZ1JlY2VpdmVkKHNlbGYsIGRlY29kZWRfZnJhbWUpCisKKwogY2xhc3MgVGhyaWZ0U2VydmVyUHJvdG9jb2woYmFzaWMuSW50MzJTdHJpbmdSZWNlaXZlcik6CiAKICAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKQEAgLTEyNCw3ICsyMzYsNyBAQAogCiAgICAgICAgIGQgPSBzZWxmLmZhY3RvcnkucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICBkLmFkZENhbGxiYWNrcyhzZWxmLnByb2Nlc3NPaywgc2VsZi5wcm9jZXNzRXJyb3IsCi0gICAgICAgICAgICBjYWxsYmFja0FyZ3M9KHRtbywpKQorICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0FyZ3M9KHRtbywpKQogCiAKIGNsYXNzIElUaHJpZnRTZXJ2ZXJGYWN0b3J5KEludGVyZmFjZSk6CkBAIC0xNDUsMTAgKzI1Nyw5IEBACiAgICAgb3Byb3RfZmFjdG9yeSA9IEF0dHJpYnV0ZSgiT3V0cHV0IHByb3RvY29sIGZhY3RvcnkiKQogCiAKK0BpbXBsZW1lbnRlcihJVGhyaWZ0U2VydmVyRmFjdG9yeSkKIGNsYXNzIFRocmlmdFNlcnZlckZhY3RvcnkoU2VydmVyRmFjdG9yeSk6CiAKLSAgICBpbXBsZW1lbnRzKElUaHJpZnRTZXJ2ZXJGYWN0b3J5KQotCiAgICAgcHJvdG9jb2wgPSBUaHJpZnRTZXJ2ZXJQcm90b2NvbAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToKQEAgLTE2MCwxMCArMjcxLDkgQEAKICAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdENsaWVudEZhY3RvcnkpCiBjbGFzcyBUaHJpZnRDbGllbnRGYWN0b3J5KENsaWVudEZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0Q2xpZW50RmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0Q2xpZW50UHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0xNzYsNyArMjg2LDcgQEAKIAogICAgIGRlZiBidWlsZFByb3RvY29sKHNlbGYsIGFkZHIpOgogICAgICAgICBwID0gc2VsZi5wcm90b2NvbChzZWxmLmNsaWVudF9jbGFzcywgc2VsZi5pcHJvdF9mYWN0b3J5LAotICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkpCiAgICAgICAgIHAuZmFjdG9yeSA9IHNlbGYKICAgICAgICAgcmV0dXJuIHAKIApAQCAtMTg2LDcgKzI5Niw3IEBACiAgICAgYWxsb3dlZE1ldGhvZHMgPSAoJ1BPU1QnLCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSk6CisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lKToKICAgICAgICAgcmVzb3VyY2UuUmVzb3VyY2UuX19pbml0X18oc2VsZikKICAgICAgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQ4NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKQEAgLTAsMCArMSwyNDggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisiIiJUWmxpYlRyYW5zcG9ydCBwcm92aWRlcyBhIGNvbXByZXNzZWQgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQorY2xhc3MsIHVzaW5nIHRoZSBweXRob24gc3RhbmRhcmQgbGlicmFyeSB6bGliIG1vZHVsZSB0byBpbXBsZW1lbnQKK2RhdGEgY29tcHJlc3Npb24uCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoraW1wb3J0IHpsaWIKK2Zyb20gLlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQKK2Zyb20gLi5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPCisKKworY2xhc3MgVFpsaWJUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCisKKyAgICBUaGlzIGZhY3RvcnkgY2FjaGVzIHRoZSBsYXN0IHNpbmdsZSBjbGllbnQvdHJhbnNwb3J0IHRoYXQgaXQgd2FzIHBhc3NlZAorICAgIGFuZCByZXR1cm5zIHRoZSBzYW1lIFRabGliVHJhbnNwb3J0IG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLgorCisgICAgVGhpcyBjYWNoaW5nIG1lYW5zIHRoZSBUU2VydmVyIGNsYXNzIHdpbGwgZ2V0IHRoZSBfc2FtZV8gdHJhbnNwb3J0CisgICAgb2JqZWN0IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cyBmcm9tIHRoaXMgZmFjdG9yeS4KKyAgICAoRm9yIG5vbi10aHJlYWRlZCBzY2VuYXJpb3Mgb25seSwgc2luY2UgdGhlIGNhY2hlIG9ubHkgaG9sZHMgb25lIG9iamVjdCkKKworICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2FjaGluZyBpcyB0byBhbGxvY2F0ZSBvbmx5IG9uZSBUWmxpYlRyYW5zcG9ydCB3aGVyZQorICAgIG9ubHkgb25lIGlzIHJlYWxseSBuZWVkZWQgKHNpbmNlIGl0IG11c3QgaGF2ZSBzZXBhcmF0ZSByZWFkL3dyaXRlIGJ1ZmZlcnMpLAorICAgIGFuZCBtYWtlcyB0aGUgc3RhdGlzdGljcyBmcm9tIGdldENvbXBTYXZpbmdzKCkgYW5kIGdldENvbXBSYXRpbygpCisgICAgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCisgICAgIiIiCisgICAgIyBjbGFzcyBzY29wZWQgY2FjaGUgb2YgbGFzdCB0cmFuc3BvcnQgZ2l2ZW4gYW5kIHpsaWJ0cmFuc3BvcnQgcmV0dXJuZWQKKyAgICBfbGFzdF90cmFucyA9IE5vbmUKKyAgICBfbGFzdF96ID0gTm9uZQorCisgICAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKKyAgICAgICAgIiIiV3JhcCBhIHRyYW5zcG9ydCwgdHJhbnMsIHdpdGggdGhlIFRabGliVHJhbnNwb3J0CisgICAgICAgIGNvbXByZXNzZWQgdHJhbnNwb3J0IGNsYXNzLCByZXR1cm5pbmcgYSBuZXcKKyAgICAgICAgdHJhbnNwb3J0IHRvIHRoZSBjYWxsZXIuCisKKyAgICAgICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCisgICAgICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdHMgdG8gOS4KKyAgICAgICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50CisKKyAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIFRabGliVHJhbnNwb3J0IHdoaWNoIHdyYXBzIHRoZQorICAgICAgICBwYXNzZWQgQ3t0cmFuc30gVFRyYW5zcG9ydCBkZXJpdmVkIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdHJhbnMgPT0gc2VsZi5fbGFzdF90cmFuczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9sYXN0X3oKKyAgICAgICAgenRyYW5zID0gVFpsaWJUcmFuc3BvcnQodHJhbnMsIGNvbXByZXNzbGV2ZWwpCisgICAgICAgIHNlbGYuX2xhc3RfdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9sYXN0X3ogPSB6dHJhbnMKKyAgICAgICAgcmV0dXJuIHp0cmFucworCisKK2NsYXNzIFRabGliVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYSB0cmFuc3BvcnQgd2l0aCB6bGliLCBjb21wcmVzc2luZyB3cml0ZXMKKyAgICBhbmQgZGVjb21wcmVzc2VzIHJlYWRzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkCisgICAgbGlicmFyeSB6bGliIG1vZHVsZS4KKyAgICAiIiIKKyAgICAjIFJlYWQgYnVmZmVyIHNpemUgZm9yIHRoZSBweXRob24gZmFzdGJpbmFyeSBDIGV4dGVuc2lvbiwKKyAgICAjIHRoZSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBjbGFzcy4KKyAgICBERUZBVUxUX0JVRkZTSVpFID0gNDA5NgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgVFpsaWJUcmFuc3BvcnQsIHdyYXBwaW5nIEN7dHJhbnN9LCBhbm90aGVyCisgICAgICAgIFRUcmFuc3BvcnQgZGVyaXZlZCBvYmplY3QuCisKKyAgICAgICAgQHBhcmFtIHRyYW5zOiBBIHRocmlmdCB0cmFuc3BvcnQgb2JqZWN0LCBpLmUuIGEgVFNvY2tldCgpIG9iamVjdC4KKyAgICAgICAgQHR5cGUgdHJhbnM6IFRUcmFuc3BvcnQKKyAgICAgICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCisgICAgICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdCBpcyA5LgorICAgICAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuY29tcHJlc3NsZXZlbCA9IGNvbXByZXNzbGV2ZWwKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9pbml0X3psaWIoKQorICAgICAgICBzZWxmLl9pbml0X3N0YXRzKCkKKworICAgIGRlZiBfcmVpbml0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCB0byBpbml0aWFsaXplL3Jlc2V0IHRoZSBpbnRlcm5hbCBTdHJpbmdJTyBvYmplY3RzCisgICAgICAgIGZvciByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorCisgICAgZGVmIF9pbml0X3N0YXRzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gcmVzZXQgdGhlIGludGVybmFsIHN0YXRpc3RpY3MgY291bnRlcnMKKyAgICAgICAgZm9yIGNvbXByZXNzaW9uIHJhdGlvcyBhbmQgYmFuZHdpZHRoIHNhdmluZ3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmJ5dGVzX2luID0gMAorICAgICAgICBzZWxmLmJ5dGVzX291dCA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19pbl9jb21wID0gMAorICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wID0gMAorCisgICAgZGVmIF9pbml0X3psaWIoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCBmb3Igc2V0dGluZyB1cCB0aGUgemxpYiBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgZGVjb21wcmVzc2lvbiBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5femNvbXBfcmVhZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIHNlbGYuX3pjb21wX3dyaXRlID0gemxpYi5jb21wcmVzc29iaihzZWxmLmNvbXByZXNzbGV2ZWwpCisKKyAgICBkZWYgZ2V0Q29tcFJhdGlvKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgbWVhc3VyZWQgY29tcHJlc3Npb24gcmF0aW9zIChpbixvdXQpIGZyb20KKyAgICAgICAgdGhpcyB0cmFuc3BvcnQuCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mOgorICAgICAgICAoaW5ib3VuZF9jb21wcmVzc2lvbl9yYXRpbywgb3V0Ym91bmRfY29tcHJlc3Npb25fcmF0aW8pCisKKyAgICAgICAgVGhlIGNvbXByZXNzaW9uIHJhdGlvcyBhcmUgY29tcHV0ZWQgYXM6CisgICAgICAgICAgICBjb21wcmVzc2VkIC8gdW5jb21wcmVzc2VkCisKKyAgICAgICAgRS5nLiwgZGF0YSB0aGF0IGNvbXByZXNzZXMgYnkgMTB4IHdpbGwgaGF2ZSBhIHJhdGlvIG9mOiAwLjEwCisgICAgICAgIGFuZCBkYXRhIHRoYXQgY29tcHJlc3NlcyB0byBoYWxmIG9mIHRzIG9yaWdpbmFsIHNpemUgd2lsbAorICAgICAgICBoYXZlIGEgcmF0aW8gb2YgMC41CisKKyAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpZiBubyBieXRlcyBoYXZlIHlldCBiZWVuIHByb2Nlc3NlZCBpbgorICAgICAgICBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcl9wZXJjZW50LCB3X3BlcmNlbnQgPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5ieXRlc19pbiA+IDA6CisgICAgICAgICAgICByX3BlcmNlbnQgPSBzZWxmLmJ5dGVzX2luX2NvbXAgLyBzZWxmLmJ5dGVzX2luCisgICAgICAgIGlmIHNlbGYuYnl0ZXNfb3V0ID4gMDoKKyAgICAgICAgICAgIHdfcGVyY2VudCA9IHNlbGYuYnl0ZXNfb3V0X2NvbXAgLyBzZWxmLmJ5dGVzX291dAorICAgICAgICByZXR1cm4gKHJfcGVyY2VudCwgd19wZXJjZW50KQorCisgICAgZGVmIGdldENvbXBTYXZpbmdzKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgY291bnQgb2Ygc2F2ZWQgYnl0ZXMgZHVlIHRvIGRhdGEKKyAgICAgICAgY29tcHJlc3Npb24uCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mOgorICAgICAgICAoaW5ib3VuZF9zYXZlZF9ieXRlcywgb3V0Ym91bmRfc2F2ZWRfYnl0ZXMpCisKKyAgICAgICAgTm90ZTogaWYgY29tcHJlc3Npb24gaXMgYWN0dWFsbHkgZXhwYW5kaW5nIHlvdXIKKyAgICAgICAgZGF0YSAob25seSBsaWtlbHkgd2l0aCB2ZXJ5IHRpbnkgdGhyaWZ0IG9iamVjdHMpLCB0aGVuCisgICAgICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgd2lsbCBiZSBuZWdhdGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJfc2F2ZWQgPSBzZWxmLmJ5dGVzX2luIC0gc2VsZi5ieXRlc19pbl9jb21wCisgICAgICAgIHdfc2F2ZWQgPSBzZWxmLmJ5dGVzX291dCAtIHNlbGYuYnl0ZXNfb3V0X2NvbXAKKyAgICAgICAgcmV0dXJuIChyX3NhdmVkLCB3X3NhdmVkKQorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIG9wZW4gc3RhdHVzIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICAiIiJPcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgorICAgICAgICBzZWxmLl9pbml0X3N0YXRzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKworICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgICIiIkludm9rZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBsaXN0ZW4oKSBtZXRob2QiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zLmxpc3RlbigpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICAiIiJBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuYWNjZXB0KCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCIiIgorICAgICAgICBzZWxmLl9yZWluaXRfYnVmZmVycygpCisgICAgICAgIHNlbGYuX2luaXRfemxpYigpCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICAiIiJSZWFkIHVwIHRvIHN6IGJ5dGVzIGZyb20gdGhlIGRlY29tcHJlc3NlZCBieXRlcyBidWZmZXIsIGFuZAorICAgICAgICByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlmIHRoZSBkZWNvbXByZXNzaW9uCisgICAgICAgIGJ1ZmZlciBpcyBlbXB0eS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpID4gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgIyBrZWVwIHJlYWRpbmcgZnJvbSB0cmFuc3BvcnQgdW50aWwgc29tZXRoaW5nIGNvbWVzIGJhY2sKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNlbGYucmVhZENvbXAoc3opOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIHJldHVybiByZXQKKworICAgIGRlZiByZWFkQ29tcChzZWxmLCBzeik6CisgICAgICAgICIiIlJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGVuCisgICAgICAgIGRlY29tcHJlc3MgaXQgYW5kIGFwcGVuZCBpdCB0byB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gcmVhZCBidWZmZXIKKyAgICAgICAgIiIiCisgICAgICAgIHpidWYgPSBzZWxmLl9fdHJhbnMucmVhZChzeikKKyAgICAgICAgemJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQudW5jb25zdW1lZF90YWlsICsgemJ1ZgorICAgICAgICBidWYgPSBzZWxmLl96Y29tcF9yZWFkLmRlY29tcHJlc3MoemJ1ZikKKyAgICAgICAgc2VsZi5ieXRlc19pbiArPSBsZW4oemJ1ZikKKyAgICAgICAgc2VsZi5ieXRlc19pbl9jb21wICs9IGxlbihidWYpCisgICAgICAgIG9sZCA9IHNlbGYuX19yYnVmLnJlYWQoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKG9sZCArIGJ1ZikKKyAgICAgICAgaWYgbGVuKG9sZCkgKyBsZW4oYnVmKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgIiIiV3JpdGUgc29tZSBieXRlcywgcHV0dGluZyB0aGVtIGludG8gdGhlIGludGVybmFsIHdyaXRlCisgICAgICAgIGJ1ZmZlciBmb3IgZXZlbnR1YWwgY29tcHJlc3Npb24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFueSBxdWV1ZWQgdXAgZGF0YSBpbiB0aGUgd3JpdGUgYnVmZmVyIGFuZCBlbnN1cmUgdGhlCisgICAgICAgIGNvbXByZXNzaW9uIGJ1ZmZlciBpcyBmbHVzaGVkIG91dCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgIiIiCisgICAgICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGlmIGxlbih3b3V0KSA+IDA6CisgICAgICAgICAgICB6YnVmID0gc2VsZi5femNvbXBfd3JpdGUuY29tcHJlc3Mod291dCkKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfb3V0ICs9IGxlbih3b3V0KQorICAgICAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oemJ1ZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHpidWYgPSAnJworICAgICAgICB6dGFpbCA9IHNlbGYuX3pjb21wX3dyaXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNIKQorICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6dGFpbCkKKyAgICAgICAgaWYgKGxlbih6YnVmKSArIGxlbih6dGFpbCkpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKHpidWYgKyB6dGFpbCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIGZvciByZWZpbGwiIiIKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5ERUZBVUxUX0JVRkZTSVpFOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChzZWxmLkRFRkFVTFRfQlVGRlNJWkUpCisgICAgICAgIHdoaWxlIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhyZXRzdHJpbmcpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvX19pbml0X18ucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9fX2luaXRfXy5weQppbmRleCAwMmM2MDQ4Li5jOTU5NmQ5IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9fX2luaXRfXy5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9fX2luaXRfXy5weQpAQCAtMTcsNCArMTcsNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotX19hbGxfXyA9IFsnVFRyYW5zcG9ydCcsICdUU29ja2V0JywgJ1RIdHRwQ2xpZW50J10KK19fYWxsX18gPSBbJ1RUcmFuc3BvcnQnLCAnVFNvY2tldCcsICdUSHR0cENsaWVudCcsICdUWmxpYlRyYW5zcG9ydCddCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMGNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weQpAQCAtMCwwICsxLDEwMCBAQAorIworIyBsaWNlbnNlZCB0byB0aGUgYXBhY2hlIHNvZnR3YXJlIGZvdW5kYXRpb24gKGFzZikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBzZWUgdGhlIG5vdGljZSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiB0aGUgYXNmIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIGFwYWNoZSBsaWNlbnNlLCB2ZXJzaW9uIDIuMCAodGhlCisjICJsaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgbGljZW5zZS4geW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL2xpY2Vuc2UtMi4wCisjCisjIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgImFzIGlzIiBiYXNpcywgd2l0aG91dCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgYW55CisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3lzCisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKK2RlZiBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2soY2VydCwgaG9zdG5hbWUpOgorICAgICIiImxlZ2FjeSBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHBlZXIncyBTU0wgY2VydGlmaWNhdGUsIGFuZCB0byBjaGVjaworICAgIHRoZSBjb21tb25OYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgaG9zdG5hbWUgd2UKKyAgICB1c2VkIHRvIG1ha2UgdGhpcyBjb25uZWN0aW9uLiAgRG9lcyBub3Qgc3VwcG9ydCBzdWJqZWN0QWx0TmFtZSByZWNvcmRzCisgICAgaW4gY2VydGlmaWNhdGVzLgorCisgICAgcmFpc2VzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIGNlcnRpZmljYXRlIGZhaWxzIHZhbGlkYXRpb24uCisgICAgIiIiCisgICAgaWYgJ3N1YmplY3QnIG5vdCBpbiBjZXJ0OgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICdObyBTU0wgY2VydGlmaWNhdGUgZm91bmQgZnJvbSAlcycgJSBob3N0bmFtZSkKKyAgICBmaWVsZHMgPSBjZXJ0WydzdWJqZWN0J10KKyAgICBmb3IgZmllbGQgaW4gZmllbGRzOgorICAgICAgICAjIGVuc3VyZSBzdHJ1Y3R1cmUgd2UgZ2V0IGJhY2sgaXMgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmllbGQsIHR1cGxlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRfcGFpciA9IGZpZWxkWzBdCisgICAgICAgIGlmIGxlbihjZXJ0X3BhaXIpIDwgMjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRfa2V5LCBjZXJ0X3ZhbHVlID0gY2VydF9wYWlyWzA6Ml0KKyAgICAgICAgaWYgY2VydF9rZXkgIT0gJ2NvbW1vbk5hbWUnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY2VydGhvc3QgPSBjZXJ0X3ZhbHVlCisgICAgICAgICMgdGhpcyBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHNvbWUgc29ydCBvZiBBY2Nlc3MgTWFuYWdlcgorICAgICAgICBpZiBjZXJ0aG9zdCA9PSBob3N0bmFtZToKKyAgICAgICAgICAgICMgc3VjY2VzcywgY2VydCBjb21tb25OYW1lIG1hdGNoZXMgZGVzaXJlZCBob3N0bmFtZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAnSG9zdG5hbWUgd2UgY29ubmVjdGVkIHRvICIlcyIgZG9lc25cJ3QgbWF0Y2ggY2VydGlmaWNhdGUgJworICAgICAgICAgICAgICAgICdwcm92aWRlZCBjb21tb25OYW1lICIlcyInICUgKGhvc3RuYW1lLCBjZXJ0aG9zdCkpCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAnQ291bGQgbm90IHZhbGlkYXRlIFNTTCBjZXJ0aWZpY2F0ZSBmcm9tIGhvc3QgIiVzIi4gIENlcnQ9JXMnCisgICAgICAgICUgKGhvc3RuYW1lLCBjZXJ0KSkKKworCitkZWYgX29wdGlvbmFsX2RlcGVuZGVuY2llcygpOgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGlwYWRkcmVzcyAgIyBub3FhCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnaXBhZGRyZXNzIG1vZHVsZSBpcyBhdmFpbGFibGUnKQorICAgICAgICBpcGFkZHIgPSBUcnVlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBsb2dnZXIud2FybignaXBhZGRyZXNzIG1vZHVsZSBpcyB1bmF2YWlsYWJsZScpCisgICAgICAgIGlwYWRkciA9IEZhbHNlCisKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDMwNTAwRjA6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUsIF9fdmVyc2lvbl9fIGFzIHZlcgorICAgICAgICAgICAgdmVyID0gbGlzdChtYXAoaW50LCB2ZXIuc3BsaXQoJy4nKSkpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIGlzIGF2YWlsYWJsZScpCisgICAgICAgICAgICBtYXRjaCA9IG1hdGNoX2hvc3RuYW1lCisgICAgICAgICAgICBpZiB2ZXJbMF0gKiAxMCArIHZlclsxXSA+PSAzNToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXBhZGRyLCBtYXRjaAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgaXMgdG9vIG9sZCcpCisgICAgICAgICAgICAgICAgaXBhZGRyID0gRmFsc2UKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXMgdW5hdmFpbGFibGUnKQorICAgICAgICAgICAgaXBhZGRyID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIGZyb20gc3NsIGltcG9ydCBtYXRjaF9ob3N0bmFtZQorICAgICAgICBsb2dnZXIuZGVidWcoJ3NzbC5tYXRjaF9ob3N0bmFtZSBpcyBhdmFpbGFibGUnKQorICAgICAgICBtYXRjaCA9IG1hdGNoX2hvc3RuYW1lCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBsb2dnZXIud2FybigndXNpbmcgbGVnYWN5IHZhbGlkYXRpb24gY2FsbGJhY2snKQorICAgICAgICBtYXRjaCA9IGxlZ2FjeV92YWxpZGF0ZV9jYWxsYmFjaworICAgIHJldHVybiBpcGFkZHIsIG1hdGNoCisKKworX21hdGNoX2hhc19pcGFkZHJlc3MsIF9tYXRjaF9ob3N0bmFtZSA9IF9vcHRpb25hbF9kZXBlbmRlbmNpZXMoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkgYi9saWIvcHkvdGVzdC9faW1wb3J0X2xvY2FsX3RocmlmdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIzMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUikpKQorCitmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2Iob3MucGF0aC5qb2luKFJPT1RfRElSLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykpOgorICAgIGlmIGxpYnBhdGguZW5kc3dpdGgoJy0lZC4lZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgbGlicGF0aCkKKyAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5IGIvbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzNDRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CkBAIC0wLDAgKzEsMzQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGluc3BlY3QKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHNzbAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorCitpbXBvcnQgX2ltcG9ydF9sb2NhbF90aHJpZnQgICMgbm9xYQorCitTQ1JJUFRfRElSID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSkpCitTRVJWRVJfUEVNID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5wZW0nKQorU0VSVkVSX0NFUlQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnc2VydmVyLmNydCcpCitTRVJWRVJfS0VZID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5rZXknKQorQ0xJRU5UX0NFUlRfTk9fSVAgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50LmNydCcpCitDTElFTlRfS0VZX05PX0lQID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudC5rZXknKQorQ0xJRU5UX0NFUlQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50X3YzLmNydCcpCitDTElFTlRfS0VZID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5rZXknKQorQ0xJRU5UX0NBID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ0NBLnBlbScpCisKK1RFU1RfQ0lQSEVSUyA9ICdERVMtQ0JDMy1TSEE6RUNESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2JworCisKK2NsYXNzIFNlcnZlckFjY2VwdG9yKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlPUZhbHNlKToKKyAgICAgICAgc3VwZXIoU2VydmVyQWNjZXB0b3IsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5kYWVtb24gPSBUcnVlCisgICAgICAgIHNlbGYuX3NlcnZlciA9IHNlcnZlcgorICAgICAgICBzZWxmLl9saXN0ZW5pbmcgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9wb3J0ID0gTm9uZQorICAgICAgICBzZWxmLl9wb3J0X2JvdW5kID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fY2xpZW50ID0gTm9uZQorICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9leHBlY3RfZmFpbHVyZSA9IGV4cGVjdF9mYWlsdXJlCisgICAgICAgIGZyYW1lID0gaW5zcGVjdC5zdGFjaygzKVsyXQorICAgICAgICBzZWxmLm5hbWUgPSBmcmFtZVszXQorICAgICAgICBkZWwgZnJhbWUKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuX3NlcnZlci5saXN0ZW4oKQorICAgICAgICBzZWxmLl9saXN0ZW5pbmcuc2V0KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBhZGRyZXNzID0gc2VsZi5fc2VydmVyLmhhbmRsZS5nZXRzb2NrbmFtZSgpCisgICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgorICAgICAgICAgICAgICAgICMgQUZfSU5FVCBhZGRyZXNzZXMgYXJlIDItdHVwbGVzIChob3N0LCBwb3J0KSBhbmQgQUZfSU5FVDYgYXJlCisgICAgICAgICAgICAgICAgIyA0LXR1cGxlcyAoaG9zdCwgcG9ydCwgLi4uKSwgYnV0IGluIGVhY2ggY2FzZSBwb3J0IGlzIGluIHRoZSBzZWNvbmQgc2xvdC4KKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0ID0gYWRkcmVzc1sxXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fcG9ydF9ib3VuZC5zZXQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCA9IHNlbGYuX3NlcnZlci5hY2NlcHQoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oJ2Vycm9yIG9uIHNlcnZlciBzaWRlICglcyk6JyAlIHNlbGYubmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHBlY3RfZmFpbHVyZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkLnNldCgpCisKKyAgICBkZWYgYXdhaXRfbGlzdGVuaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9saXN0ZW5pbmcud2FpdCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5fcG9ydF9ib3VuZC53YWl0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BvcnQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbGllbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC53YWl0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NsaWVudAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jbGllbnQ6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQuY2xvc2UoKQorICAgICAgICBzZWxmLl9zZXJ2ZXIuY2xvc2UoKQorCisKKyMgUHl0aG9uIDIuNiBjb21wYXQKK2NsYXNzIEFzc2VydFJhaXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuX2V4cGVjdGVkID0gZXhwZWN0ZWQKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICBpZiBub3QgZXhjX3R5cGUgb3Igbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuX2V4cGVjdGVkKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignZmFpbCcpCisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgVFNTTFNvY2tldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfc2VydmVyX3NvY2tldChzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUU1NMU2VydmVyU29ja2V0KHBvcnQ9MCwgKiprd2FyZ3MpCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX2Nvbm5lY3RhYmxlX2NsaWVudChzZWxmLCBzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlPUZhbHNlLCBwYXRoPU5vbmUsICoqY2xpZW50X2t3YXJncyk6CisgICAgICAgIGFjYyA9IFNlcnZlckFjY2VwdG9yKHNlcnZlciwgZXhwZWN0X2ZhaWx1cmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFjYy5zdGFydCgpCisgICAgICAgICAgICBhY2MuYXdhaXRfbGlzdGVuaW5nKCkKKworICAgICAgICAgICAgaG9zdCwgcG9ydCA9ICgnbG9jYWxob3N0JywgYWNjLnBvcnQpIGlmIHBhdGggaXMgTm9uZSBlbHNlIChOb25lLCBOb25lKQorICAgICAgICAgICAgY2xpZW50ID0gVFNTTFNvY2tldChob3N0LCBwb3J0LCB1bml4X3NvY2tldD1wYXRoLCAqKmNsaWVudF9rd2FyZ3MpCisgICAgICAgICAgICB5aWVsZCBhY2MsIGNsaWVudAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgYWNjLmNsb3NlKCkKKworICAgIGRlZiBfYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZWxmLCBzZXJ2ZXIsIHBhdGg9Tm9uZSwgKipjbGllbnRfYXJncyk6CisgICAgICAgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLkNSSVRJQ0FMKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuX2Nvbm5lY3RhYmxlX2NsaWVudChzZXJ2ZXIsIFRydWUsIHBhdGg9cGF0aCwgKipjbGllbnRfYXJncykgYXMgKGFjYywgY2xpZW50KToKKyAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSBjb25uZWN0aW9uIGZhaWx1cmUsIGJ1dCBub3QgdG9vIGxvbmcuICAyMG1zIGlzIGEgdHVuYWJsZQorICAgICAgICAgICAgICAgICMgY29tcHJvbWlzZSBiZXR3ZWVuIHRlc3Qgc3BlZWQgYW5kIHN0YWJpbGl0eQorICAgICAgICAgICAgICAgIGNsaWVudC5zZXRUaW1lb3V0KDIwKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhUVHJhbnNwb3J0RXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50Lm9wZW4oKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY2MuY2xpZW50IGlzIE5vbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5OT1RTRVQpCisKKyAgICBkZWYgX2Fzc2VydF9yYWlzZXMoc2VsZiwgZXhjKToKKyAgICAgICAgaWYgc3lzLmhleHZlcnNpb24gPj0gMHgwMjA3MDBGMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydFJhaXNlcyhleGMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gQXNzZXJ0UmFpc2VzKGV4YykKKworICAgIGRlZiBfYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZWxmLCBzZXJ2ZXIsIHBhdGg9Tm9uZSwgKipjbGllbnRfYXJncyk6CisgICAgICAgIHdpdGggc2VsZi5fY29ubmVjdGFibGVfY2xpZW50KHNlcnZlciwgcGF0aD1wYXRoLCAqKmNsaWVudF9hcmdzKSBhcyAoYWNjLCBjbGllbnQpOgorICAgICAgICAgICAgY2xpZW50Lm9wZW4oKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY2MuY2xpZW50IGlzIG5vdCBOb25lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9kZXByZWNhdGlvbihzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAxKQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICAgICAgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1Ob25lLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgICAgICAgICBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBUcnVlLCBTRVJWRVJfQ0VSVCwgQ0xJRU5UX0tFWSwgQ0xJRU5UX0NFUlQsIE5vbmUsIFRFU1RfQ0lQSEVSUykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCA3KQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICAgICAgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIGNlcnRmaWxlPSdjZXJ0LnBlbScsIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgICAgICAgICBUU1NMU2VydmVyU29ja2V0KE5vbmUsIDAsIFNFUlZFUl9QRU0sIE5vbmUsIFRFU1RfQ0lQSEVSUykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAzKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9zZXRfY2VydF9yZXFzX2J5X3ZhbGlkYXRlKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLmNlcnRfcmVxcywgc3NsLkNFUlRfUkVRVUlSRUQpCisKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9RmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLmNlcnRfcmVxcywgc3NsLkNFUlRfTk9ORSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDIpCisKKyAgICAjIGRlcHJlY2F0ZWQgZmVhdHVyZQorICAgIGRlZiB0ZXN0X3NldF92YWxpZGF0ZV9ieV9jZXJ0X3JlcXMoc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgYzEgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYzEudmFsaWRhdGUpCisKKyAgICAgICAgICAgIGMyID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMi52YWxpZGF0ZSkKKworICAgICAgICAgICAgYzMgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBjZXJ0X3JlcXM9c3NsLkNFUlRfT1BUSU9OQUwsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMzLnZhbGlkYXRlKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMykKKworICAgIGRlZiB0ZXN0X3VuaXhfZG9tYWluX3NvY2tldChzZWxmKToKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfdW5peF9kb21haW5fc29ja2V0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmZCwgcGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCh1bml4X3NvY2tldD1wYXRoLCBrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIHBhdGg9cGF0aCwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiB0ZXN0X3NlcnZlcl9jZXJ0KHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgIyBzZXJ2ZXIgY2VydCBub3QgaW4gY2FfY2VydHMKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9Q0xJRU5UX0NFUlQpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisKKyAgICBkZWYgdGVzdF9zZXRfc2VydmVyX2NlcnQoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCkKKyAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSAnZm9vJworICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9IE5vbmUKKyAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gU0VSVkVSX0NFUlQKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICBkZWYgdGVzdF9jbGllbnRfY2VydChzZWxmKToKKyAgICAgICAgaWYgbm90IF9tYXRjaF9oYXNfaXBhZGRyZXNzOgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfY2xpZW50X2NlcnQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwga2V5ZmlsZT1TRVJWRVJfS0VZKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlRfTk9fSVAsIGtleWZpbGU9Q0xJRU5UX0tFWV9OT19JUCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJULCBrZXlmaWxlPUNMSUVOVF9LRVkpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9PUFRJT05BTCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCwga2V5ZmlsZT1DTElFTlRfS0VZKQorCisgICAgZGVmIHRlc3RfY2lwaGVycyhzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKworICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX2NpcGhlcnM6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfY2lwaGVycycpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9J05VTEwnKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz0nTlVMTCcpCisKKyAgICBkZWYgdGVzdF9zc2wyX2FuZF9zc2wzX2Rpc2FibGVkKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MycpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1NTTHYzIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjMpCisKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYzKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYyJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfU1NMdjIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MikKKworICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICBkZWYgdGVzdF9uZXdlcl90bHMoc2VsZik6CisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfbmV3ZXJfdGxzJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8xIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpIG9yIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8xIGFuZC9vciBQUk9UT0NPTF9UTFN2MV8yIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisKKyAgICBkZWYgdGVzdF9zc2xfY29udGV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9zc2xfY29udGV4dCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyX2NvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChzc2wuUHVycG9zZS5DTElFTlRfQVVUSCkKKyAgICAgICAgc2VydmVyX2NvbnRleHQubG9hZF9jZXJ0X2NoYWluKFNFUlZFUl9DRVJULCBTRVJWRVJfS0VZKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoQ0xJRU5UX0NBKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoc3NsX2NvbnRleHQ9c2VydmVyX2NvbnRleHQpCisKKyAgICAgICAgY2xpZW50X2NvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChzc2wuUHVycG9zZS5TRVJWRVJfQVVUSCkKKyAgICAgICAgY2xpZW50X2NvbnRleHQubG9hZF9jZXJ0X2NoYWluKENMSUVOVF9DRVJULCBDTElFTlRfS0VZKQorICAgICAgICBjbGllbnRfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU0VSVkVSX0NFUlQpCisgICAgICAgIGNsaWVudF9jb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKworICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgc3NsX2NvbnRleHQ9Y2xpZW50X2NvbnRleHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuV0FSTikKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFNTTFNvY2tldCBpbXBvcnQgVFNTTFNvY2tldCwgVFNTTFNlcnZlclNvY2tldCwgX21hdGNoX2hhc19pcGFkZHJlc3MKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weSBiL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTdhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQpAQCAtMCwwICsxLDUxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBfaW1wb3J0X2xvY2FsX3RocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKworIworIyBJbiBvcmRlciB0byBydW4gdGhlIHRlc3QgdW5kZXIgV2luZG93cy4gV2UgbmVlZCB0byBjcmVhdGUgc3ltYm9saWMgbGluaworIyBuYW1lICd0aHJpZnQnIHRvICcuLi9zcmMnIGZvbGRlciBieSB1c2luZzoKKyMKKyMgbWtsaW5rIC9EIHRocmlmdCAuLlxzcmMKKyMKKworCitjbGFzcyBUZXN0SlNPTlN0cmluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lc2NhcGVkX3VuaWNvZGVfc3RyaW5nKHNlbGYpOgorICAgICAgICB1bmljb2RlX2pzb24gPSBiJyJoZWxsbyBcXHUwZTAxXFx1MGUwMlxcdTBlMDNcXHVkODM1XFx1ZGNhYlxcdWRiNDBcXHVkYzcwIHVuaWNvZGUiJworICAgICAgICB1bmljb2RlX3RleHQgPSB1J2hlbGxvIFx1MGUwMVx1MGUwMlx1MGUwM1xVMDAwMUQ0QUJcVTAwMEUwMDcwIHVuaWNvZGUnCisKKyAgICAgICAgYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHVuaWNvZGVfanNvbikKKyAgICAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkuZ2V0VHJhbnNwb3J0KGJ1ZikKKyAgICAgICAgcHJvdG9jb2wgPSBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICB1bmljb2RlX3RleHQgPSB1bmljb2RlX3RleHQuZW5jb2RlKCd1dGY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90b2NvbC5yZWFkU3RyaW5nKCksIHVuaWNvZGVfdGV4dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3JiL0NIQU5HRUxPRyBiL2xpYi9yYi9DSEFOR0VMT0cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGNlMmEuLjAwMDAwMDAKLS0tIGEvbGliL3JiL0NIQU5HRUxPRworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXYwLjAuMS4gSW5pdGlhbCByZWxlYXNlCmRpZmYgLS1naXQgYS9saWIvcmIvR2VtZmlsZSBiL2xpYi9yYi9HZW1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODZhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvR2VtZmlsZQpAQCAtMCwwICsxLDQgQEAKK3NvdXJjZSAiaHR0cDovL3J1YnlnZW1zLm9yZyIKKworZ2Vtc3BlYworCmRpZmYgLS1naXQgYS9saWIvcmIvTWFrZWZpbGUuYW0gYi9saWIvcmIvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBkYTQ1ZWQ1Li4xMzdlZGI0Ci0tLSBhL2xpYi9yYi9NYWtlZmlsZS5hbQorKysgYi9saWIvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDMxICsxNywzNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorREVTVERJUiA/PSAvCisKK2lmIEhBVkVfQlVORExFUgorCithbGwtbG9jYWw6CisJJChCVU5ETEVSKSBpbnN0YWxsCisJJChCVU5ETEVSKSBleGVjIHJha2UgYnVpbGRfZXh0CisKK2luc3RhbGwtZXhlYy1ob29rOgorCSQoQlVORExFUikgZXhlYyByYWtlIGluc3RhbGwKKworY2xlYW4tbG9jYWw6CisJJChCVU5ETEVSKSBpbnN0YWxsCisJJChCVU5ETEVSKSBleGVjIHJha2UgY2xlYW4KKworY2hlY2stbG9jYWw6IGFsbAorCSQoQlVORExFUikgaW5zdGFsbAorCSQoQlVORExFUikgZXhlYyByYWtlCisKK2VuZGlmCisKIEVYVFJBX0RJU1QgPSBcCi0JQ0hBTkdFTE9HIFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAlSYWtlZmlsZSBcCi0JTWFuaWZlc3QgXAotCXNldHVwLnJiIFwKKwlHZW1maWxlIFwKKwl0aHJpZnQuZ2Vtc3BlYyBcCiAJbGliIFwKIAlleHQgXAogCWJlbmNobWFyayBcCiAJc2NyaXB0IFwKLQlzcGVjCi0KLWFsbC1sb2NhbDoKLQlpZiBbIC1uICIkKFJVQllfUFJFRklYKSIgXSA7IHRoZW4gJChSVUJZKSBzZXR1cC5yYiBjb25maWcgLS1wcmVmaXg9JChERVNURElSKSQoUlVCWV9QUkVGSVgpIC0tcmJkaXI9JyQkbGliZGlyL3J1YnknIC0tc29kaXI9JyQkbGliZGlyL3J1YnknIDsgZWxpZiBbIC1uICIkKERFU1RESVIpIiBdIDsgdGhlbiAkKFJVQlkpIHNldHVwLnJiIGNvbmZpZyAtLXByZWZpeD0kKERFU1RESVIpIDsgZWxzZSAkKFJVQlkpIHNldHVwLnJiIGNvbmZpZyA7IGZpCi0JJChSVUJZKSBzZXR1cC5yYiBzZXR1cAotCi1pbnN0YWxsLWV4ZWMtaG9vazoKLQkkKFJVQlkpIHNldHVwLnJiIGluc3RhbGwKLQotIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgUnVieSBpcyBub3QgY29uZmlndXJlZC4KLWNsZWFuLWxvY2FsOgotCVJVQlk9JChSVUJZKSA7IGlmIHRlc3QgLXogIiQkUlVCWSIgOyB0aGVuIFJVQlk9OiA7IGZpIDsgXAotCSQkUlVCWSBzZXR1cC5yYiBjbGVhbgotCi1jaGVjay1sb2NhbDogYWxsCi1pZiBIQVZFX1JTUEVDCi0JcmFrZSBzcGVjCi1lbmRpZgotCisJc3BlYyBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcmIvTWFuaWZlc3QgYi9saWIvcmIvTWFuaWZlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWYwMzEuLjAwMDAwMDAKLS0tIGEvbGliL3JiL01hbmlmZXN0CisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotQ0hBTkdFTE9HCi1NYW5pZmVzdAotUmFrZWZpbGUKLVJFQURNRQotc2V0dXAucmIKLWJlbmNobWFyay9iZW5jaG1hcmsucmIKLWJlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0Ci1iZW5jaG1hcmsvY2xpZW50LnJiCi1iZW5jaG1hcmsvc2VydmVyLnJiCi1iZW5jaG1hcmsvdGhpbl9zZXJ2ZXIucmIKLWV4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYwotZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5oCi1leHQvY29tcGFjdF9wcm90b2NvbC5jCi1leHQvY29tcGFjdF9wcm90b2NvbC5oCi1leHQvY29uc3RhbnRzLmgKLWV4dC9leHRjb25mLnJiCi1leHQvbWFjcm9zLmgKLWV4dC9tZW1vcnlfYnVmZmVyLmMKLWV4dC9tZW1vcnlfYnVmZmVyLmgKLWV4dC9wcm90b2NvbC5jCi1leHQvcHJvdG9jb2wuaAotZXh0L3N0cnVjdC5jCi1leHQvc3RydWN0LmgKLWV4dC90aHJpZnRfbmF0aXZlLmMKLWxpYi90aHJpZnQucmIKLWxpYi90aHJpZnQvY2xpZW50LnJiCi1saWIvdGhyaWZ0L2NvcmVfZXh0LnJiCi1saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKLWxpYi90aHJpZnQvcHJvY2Vzc29yLnJiCi1saWIvdGhyaWZ0L3N0cnVjdC5yYgotbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKLWxpYi90aHJpZnQvdW5pb24ucmIKLWxpYi90aHJpZnQvdGhyaWZ0X25hdGl2ZS5yYgotbGliL3RocmlmdC90eXBlcy5yYgotbGliL3RocmlmdC9jb3JlX2V4dC9maXhudW0ucmIKLWxpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgotbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKLWxpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCi1saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKLWxpYi90aHJpZnQvc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIucmIKLWxpYi90aHJpZnQvc2VyaWFsaXplci9zZXJpYWxpemVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvbW9uZ3JlbF9odHRwX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmdfc2VydmVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKLXNjcmlwdC9wcm90b19iZW5jaG1hcmsucmIKLXNjcmlwdC9yZWFkX3N0cnVjdC5yYgotc2NyaXB0L3dyaXRlX3N0cnVjdC5yYgotc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKLXNwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgotc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgotc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgotc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKLXNwZWMvY2xpZW50X3NwZWMucmIKLXNwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCi1zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCi1zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKLXNwZWMvbW9uZ3JlbF9odHRwX3NlcnZlcl9zcGVjLnJiCi1zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiCi1zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCi1zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgotc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKLXNwZWMvc2VydmVyX3NwZWMucmIKLXNwZWMvc29ja2V0X3NwZWMucmIKLXNwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCi1zcGVjL3NwZWNfaGVscGVyLnJiCi1zcGVjL3N0cnVjdF9zcGVjLnJiCi1zcGVjL3VuaW9uX3NwZWMucmIKLXNwZWMvVGhyaWZ0U3BlYy50aHJpZnQKLXNwZWMvdHlwZXNfc3BlYy5yYgotc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCmRpZmYgLS1naXQgYS9saWIvcmIvUkVBRE1FIGIvbGliL3JiL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3JiL1JFQURNRQpyZW5hbWUgdG8gbGliL3JiL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JiL1Jha2VmaWxlIGIvbGliL3JiL1Jha2VmaWxlCmluZGV4IDViNmY0MzIuLjVlNWU1YWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9SYWtlZmlsZQorKysgYi9saWIvcmIvUmFrZWZpbGUKQEAgLTE5LDg2ICsxOSwxMDIgQEAKIAogcmVxdWlyZSAncnVieWdlbXMnCiByZXF1aXJlICdyYWtlJwotcmVxdWlyZSAnc3BlYy9yYWtlL3NwZWN0YXNrJworcmVxdWlyZSAncmFrZS9jbGVhbicKK3JlcXVpcmUgJ3JzcGVjL2NvcmUvcmFrZV90YXNrJwogCiBUSFJJRlQgPSAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcKIAotdGFzayA6ZGVmYXVsdCA9PiBbOnNwZWNdCit0YXNrIDpkZWZhdWx0ID0+IFs6Z2VtXQordGFzayA6c3BlYyA9PiBbOidnZW4tcmInLCA6YnVpbGRfZXh0LCA6cmVhbHNwZWNdCiAKLXRhc2sgOnNwZWMgPT4gWzonZ2VuLXJiJywgOnJlYWxzcGVjXQotCi1TcGVjOjpSYWtlOjpTcGVjVGFzay5uZXcoOnJlYWxzcGVjKSBkbyB8dHwKLSAgdC5zcGVjX2ZpbGVzID0gRmlsZUxpc3RbJ3NwZWMvKiovKl9zcGVjLnJiJ10KLSAgdC5zcGVjX29wdHMgPSBbJy0tY29sb3InXQorUlNwZWM6OkNvcmU6OlJha2VUYXNrLm5ldyg6cmVhbHNwZWMpIGRvIHx0fAorICB0LnJzcGVjX29wdHMgPSBbJy0tY29sb3InLCAnLS1mb3JtYXQgZCddCiBlbmQKIAotU3BlYzo6UmFrZTo6U3BlY1Rhc2submV3KDonc3BlYzpyY292JykgZG8gfHR8Ci0gIHQuc3BlY19maWxlcyA9IEZpbGVMaXN0WydzcGVjLyoqLypfc3BlYy5yYiddCi0gIHQuc3BlY19vcHRzID0gWyctLWNvbG9yJ10KK1JTcGVjOjpDb3JlOjpSYWtlVGFzay5uZXcoOidzcGVjOnJjb3YnKSBkbyB8dHwKKyAgdC5yc3BlY19vcHRzID0gWyctLWNvbG9yJywgJy0tZm9ybWF0IGQnXQogICB0LnJjb3YgPSB0cnVlCiAgIHQucmNvdl9vcHRzID0gWyctLWV4Y2x1ZGUnLCAnXnNwZWMsL2dlbXMvJ10KIGVuZAogCi1kZXNjICdSdW4gdGhlIGNvbXBpbGVyIHRlc3RzIChyZXF1aXJlcyBmdWxsIHRocmlmdCBjaGVja291dCknCi10YXNrIDp0ZXN0IGRvCi0gICMgZW5zdXJlIHRoaXMgaXMgYSBmdWxsIHRocmlmdCBjaGVja291dCBhbmQgbm90IGEgdGFyYmFsbCBvZiB0aGUgcnVieSBsaWJzCi0gIGNtZCA9ICdoZWFkIC0xIC4uLy4uL1JFQURNRSAyPi9kZXYvbnVsbCB8IGdyZXAgVGhyaWZ0ID4vZGV2L251bGwgMj4vZGV2L251bGwnCi0gIHN5c3RlbShjbWQpIG9yIGZhaWwgInJha2UgdGVzdCByZXF1aXJlcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IgotICBzaCAnbWFrZScsICctQycsIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiLy4uLy4uL3Rlc3QvcmIiLCAiY2hlY2siCi1lbmQKLQogZGVzYyAnQ29tcGlsZSB0aGUgLnRocmlmdCBmaWxlcyBmb3IgdGhlIHNwZWNzJwotdGFzayA6J2dlbi1yYicgPT4gWzonZ2VuLXJiOnNwZWMnLCA6J2dlbi1yYjpiZW5jaG1hcmsnLCA6J2dlbi1yYjpkZWJ1Z19wcm90byddCi0KK3Rhc2sgOidnZW4tcmInID0+IFs6J2dlbi1yYjpzcGVjJywgOidnZW4tcmI6bmFtZXNwYWNlZF9zcGVjJywgOidnZW4tcmI6ZmxhdF9zcGVjJywgOidnZW4tcmI6YmVuY2htYXJrJywgOidnZW4tcmI6ZGVidWdfcHJvdG8nXQogbmFtZXNwYWNlIDonZ2VuLXJiJyBkbwogICB0YXNrIDonc3BlYycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJwogICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgJy1vJywgZGlyLCAiI3tkaXJ9L1RocmlmdFNwZWMudGhyaWZ0IgogICBlbmQKIAorICB0YXNrIDonbmFtZXNwYWNlZF9zcGVjJyBkbworICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWMnCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L0Jhc2VTZXJ2aWNlLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0IgorICBlbmQKKworICB0YXNrIDonZmxhdF9zcGVjJyBkbworICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWMnCisgICAgbWtkaXJfcCgiI3tkaXJ9L2dlbi1yYi9mbGF0IikKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICctLXJlY3Vyc2UnLCAnLW91dCcsICIje2Rpcn0vZ2VuLXJiL2ZsYXQiLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgZW5kCisKICAgdGFzayA6J2JlbmNobWFyaycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9iZW5jaG1hcmsnCiAgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLW8nLCBkaXIsICIje2Rpcn0vQmVuY2htYXJrLnRocmlmdCIKICAgZW5kCiAgIAogICB0YXNrIDonZGVidWdfcHJvdG8nIGRvCi0gICAgc2ggIm1rZGlyIiwgIi1wIiwgImRlYnVnX3Byb3RvX3Rlc3QiCi0gICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAiLW8iLCAiZGVidWdfcHJvdG9fdGVzdCIsICIuLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCIKKyAgICBzaCAibWtkaXIiLCAiLXAiLCAidGVzdC9kZWJ1Z19wcm90byIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICItbyIsICJ0ZXN0L2RlYnVnX3Byb3RvIiwgIi4uLy4uL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IgogICBlbmQKIGVuZAogCitkZXNjICJCdWlsZCB0aGUgbmF0aXZlIGxpYnJhcnkiCit0YXNrIDpidWlsZF9leHQgPT4gOidnZW4tcmInIGRvCisgICBuZXh0IGlmIGRlZmluZWQ/KFJVQllfRU5HSU5FKSAmJiBSVUJZX0VOR0lORSA9fiAvanJ1YnkvCisgICBEaXI6OmNoZGlyKEZpbGU6OmRpcm5hbWUoJ2V4dC9leHRjb25mLnJiJykpIGRvCisgICAgICB1bmxlc3Mgc2ggInJ1YnkgI3tGaWxlOjpiYXNlbmFtZSgnZXh0L2V4dGNvbmYucmInKX0iCisgICAgICAgICRzdGRlcnIucHV0cyAiRmFpbGVkIHRvIHJ1biBleHRjb25mIgorICAgICAgICAgIGJyZWFrCisgICAgICBlbmQKKyAgICAgIHVubGVzcyBzaCAibWFrZSIKKyAgICAgICAgJHN0ZGVyci5wdXRzICJtYWtlIGZhaWxlZCIKKyAgICAgICAgYnJlYWsKKyAgICAgIGVuZAorICAgIGVuZAorZW5kCisKK2Rlc2MgJ1J1biB0aGUgY29tcGlsZXIgdGVzdHMgKHJlcXVpcmVzIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0KScKK3Rhc2sgOnRlc3QgZG8KKyAgIyBlbnN1cmUgdGhpcyBpcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IGFuZCBub3QgYSB0YXJiYWxsIG9mIHRoZSBydWJ5IGxpYnMKKyAgY21kID0gJ2hlYWQgLTEgLi4vLi4vUkVBRE1FLm1kIDI+L2Rldi9udWxsIHwgZ3JlcCBUaHJpZnQgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCcKKyAgc3lzdGVtKGNtZCkgb3IgZmFpbCAicmFrZSB0ZXN0IHJlcXVpcmVzIGEgZnVsbCB0aHJpZnQgY2hlY2tvdXQiCisgIHNoICdtYWtlJywgJy1DJywgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvLi4vLi4vdGVzdC9yYiIsICJjaGVjayIKK2VuZAorCiBkZXNjICdSdW4gYmVuY2htYXJraW5nIG9mIE5vbmJsb2NraW5nU2VydmVyJwogdGFzayA6YmVuY2htYXJrIGRvCiAgIHJ1YnkgJ2JlbmNobWFyay9iZW5jaG1hcmsucmInCiBlbmQKIAotCi1iZWdpbgotICByZXF1aXJlICdlY2hvZScKLQotICBFY2hvZS5uZXcoJ3RocmlmdCcpIGRvIHxwfAotICAgIHAuYXV0aG9yID0gWydUaHJpZnQgRGV2ZWxvcGVycyddCi0gICAgcC5lbWFpbCA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10KLSAgICBwLnN1bW1hcnkgPSAiUnVieSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIKLSAgICBwLnVybCA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gICAgcC5pbmNsdWRlX3Jha2VmaWxlID0gdHJ1ZQotICAgIHAudmVyc2lvbiA9ICIwLjYuMSIKLSAgICBwLnJ1YnlnZW1zX3ZlcnNpb24gPSAiPj0gMS4yLjAiCi0gIGVuZAotCi0gIHRhc2sgOmluc3RhbGwgPT4gWzpjaGVja19zaXRlX2xpYl0KLQotICByZXF1aXJlICdyYmNvbmZpZycKLSAgdGFzayA6Y2hlY2tfc2l0ZV9saWIgZG8KLSAgICBpZiBGaWxlLmV4aXN0PyhGaWxlLmpvaW4oQ29uZmlnOjpDT05GSUdbJ3NpdGVsaWJkaXInXSwgJ3RocmlmdC5yYicpKQotICAgICAgZmFpbCAidGhyaWZ0IGlzIGFscmVhZHkgaW5zdGFsbGVkIGluIHNpdGVfcnVieSIKLSAgICBlbmQKLSAgZW5kCi1yZXNjdWUgTG9hZEVycm9yCi0gIFs6aW5zdGFsbCwgOnBhY2thZ2VdLmVhY2ggZG8gfHR8Ci0gICAgZGVzYyAiU3R1YiBmb3IgI3t0fSIKLSAgICB0YXNrIHQgZG8KLSAgICAgIGZhaWwgIlRoZSBFY2hvZSBnZW0gaXMgcmVxdWlyZWQgZm9yIHRoaXMgdGFzayIKLSAgICBlbmQKK2Rlc2MgJ0J1aWxkcyB0aGUgdGhyaWZ0IGdlbScKK3Rhc2sgOmdlbSA9PiBbOnNwZWMsIDpidWlsZF9leHRdIGRvCisgIHVubGVzcyBzaCAnZ2VtJywgJ2J1aWxkJywgJ3RocmlmdC5nZW1zcGVjJworICAgICRzdGRlcnIucHV0cyAiRmFpbGVkIHRvIGJ1aWxkIHRocmlmdCBnZW0iCisgICAgYnJlYWsKICAgZW5kCiBlbmQKKworZGVzYyAnSW5zdGFsbCB0aGUgdGhyaWZ0IGdlbScKK3Rhc2sgOmluc3RhbGwgPT4gWzpnZW1dIGRvCisgIHVubGVzcyBzaCAnZ2VtJywgJ2luc3RhbGwnLCBEaXIuZ2xvYigndGhyaWZ0LSouZ2VtJykubGFzdAorICAgICRzdGRlcnIucHV0cyAiRmFpbGVkIHRvIGluc3RhbGwgdGhyaWZ0IGdlbSIKKyAgICBicmVhaworICBlbmQKK2VuZAorCitDTEVBTi5pbmNsdWRlIFsKKyAgJy5idW5kbGUnLCAnYmVuY2htYXJrL2dlbi1yYicsICdjb3ZlcmFnZScsICdleHQvKi57byxidW5kbGUsc28sZGxsfScsICdleHQvbWttZi5sb2cnLAorICAnZXh0L01ha2VmaWxlJywgJ2V4dC9jb25mdGVzdC5kU1lNJywgJ0dlbWZpbGUubG9jaycsICdta21mLmxvZycsICdwa2cnLCAgJ3NwZWMvZ2VuLXJiJywKKyAgJ3Rlc3QnLCAndGhyaWZ0LSouZ2VtJworXQpkaWZmIC0tZ2l0IGEvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcmIvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jIGIvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYwppbmRleCAzODU0ODg3Li42NWNiZTVmIDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jCisrKyBiL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKQEAgLTIyLDcgKzIyLDggQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxjb25zdGFudHMuaD4KICNpbmNsdWRlIDxzdHJ1Y3QuaD4KLSNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlIDxtYWNyb3MuaD4KKyNpbmNsdWRlIDxieXRlcy5oPgogCiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX25hdGl2ZV9xbWFyayhWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRdHJ1ZTsKQEAgLTM0LDYgKzM1LDcgQEAKIHN0YXRpYyBpbnQgVkVSU0lPTl9NQVNLOwogc3RhdGljIGludCBUWVBFX01BU0s7CiBzdGF0aWMgaW50IEJBRF9WRVJTSU9OOworc3RhdGljIElEIHJidWZfaXZhcl9pZDsKIAogc3RhdGljIHZvaWQgd3JpdGVfYnl0ZV9kaXJlY3QoVkFMVUUgdHJhbnMsIGludDhfdCBiKSB7CiAgIFdSSVRFKHRyYW5zLCAoY2hhciopJmIsIDEpOwpAQCAtNzcsOCArNzksOSBAQAogCiBzdGF0aWMgdm9pZCB3cml0ZV9zdHJpbmdfZGlyZWN0KFZBTFVFIHRyYW5zLCBWQUxVRSBzdHIpIHsKICAgaWYgKFRZUEUoc3RyKSAhPSBUX1NUUklORykgewotICAgIHJiX3JhaXNlKHJiX2VTdGFuZGFyZEVycm9yLCAiVmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nIik7ICAgIAorICAgIHJiX3JhaXNlKHJiX2VTdGFuZGFyZEVycm9yLCAiVmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nIik7CiAgIH0KKyAgc3RyID0gY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cik7CiAgIHdyaXRlX2kzMl9kaXJlY3QodHJhbnMsIFJTVFJJTkdfTEVOKHN0cikpOwogICByYl9mdW5jYWxsKHRyYW5zLCB3cml0ZV9tZXRob2RfaWQsIDEsIHN0cik7CiB9CkBAIC0yMTYsMzYgKzIxOSw1NiBAQAogICByZXR1cm4gUW5pbDsKIH0KIAorVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9iaW5hcnkoVkFMVUUgc2VsZiwgVkFMVUUgYnVmKSB7CisgIENIRUNLX05JTChidWYpOworICBWQUxVRSB0cmFucyA9IEdFVF9UUkFOU1BPUlQoc2VsZik7CisgIGJ1ZiA9IGZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpOworICB3cml0ZV9pMzJfZGlyZWN0KHRyYW5zLCBSU1RSSU5HX0xFTihidWYpKTsKKyAgcmJfZnVuY2FsbCh0cmFucywgd3JpdGVfbWV0aG9kX2lkLCAxLCBidWYpOworICByZXR1cm4gUW5pbDsKK30KKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIGludGVyZmFjZSByZWFkaW5nIG1ldGhvZHMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZik7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5KFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2J5dGUoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfaTMyKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2kxNihWQUxVRSBzZWxmKTsKIAogc3RhdGljIGNoYXIgcmVhZF9ieXRlX2RpcmVjdChWQUxVRSBzZWxmKSB7Ci0gIFZBTFVFIGJ1ZiA9IFJFQUQoc2VsZiwgMSk7Ci0gIHJldHVybiBSU1RSSU5HX1BUUihidWYpWzBdOworICBWQUxVRSBieXRlID0gcmJfZnVuY2FsbChHRVRfVFJBTlNQT1JUKHNlbGYpLCByZWFkX2J5dGVfbWV0aG9kX2lkLCAwKTsKKyAgcmV0dXJuIChjaGFyKShGSVgySU5UKGJ5dGUpKTsKIH0KIAogc3RhdGljIGludDE2X3QgcmVhZF9pMTZfZGlyZWN0KFZBTFVFIHNlbGYpIHsKLSAgVkFMVUUgYnVmID0gUkVBRChzZWxmLCAyKTsKLSAgcmV0dXJuIChpbnQxNl90KSgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ1ZilbMV0pKSB8ICgodWludDE2X3QpKChSU1RSSU5HX1BUUihidWYpWzBdKSA8PCA4KSkpOworICBWQUxVRSByYnVmID0gcmJfaXZhcl9nZXQoc2VsZiwgcmJ1Zl9pdmFyX2lkKTsKKyAgcmJfZnVuY2FsbChHRVRfVFJBTlNQT1JUKHNlbGYpLCByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZCwgMiwgcmJ1ZiwgSU5UMkZJWCgyKSk7CisgIHJldHVybiAoaW50MTZfdCkoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsxXSkpIHwgKCh1aW50MTZfdCkoKFJTVFJJTkdfUFRSKHJidWYpWzBdKSA8PCA4KSkpOwogfQogCiBzdGF0aWMgaW50MzJfdCByZWFkX2kzMl9kaXJlY3QoVkFMVUUgc2VsZikgewotICBWQUxVRSBidWYgPSBSRUFEKHNlbGYsIDQpOwotICByZXR1cm4gKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzNdKSkgfCAKLSAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzJdKSkgPDwgOCkgfCAKLSAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzFdKSkgPDwgMTYpIHwgCi0gICAgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnVmKVswXSkpIDw8IDI0KTsKKyAgVkFMVUUgcmJ1ZiA9IHJiX2l2YXJfZ2V0KHNlbGYsIHJidWZfaXZhcl9pZCk7CisgIHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQsIDIsIHJidWYsIElOVDJGSVgoNCkpOworICByZXR1cm4gKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVszXSkpIHwKKyAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsyXSkpIDw8IDgpIHwKKyAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsxXSkpIDw8IDE2KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMF0pKSA8PCAyNCk7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IHJlYWRfaTY0X2RpcmVjdChWQUxVRSBzZWxmKSB7Ci0gIHVpbnQ2NF90IGhpID0gcmVhZF9pMzJfZGlyZWN0KHNlbGYpOwotICB1aW50MzJfdCBsbyA9IHJlYWRfaTMyX2RpcmVjdChzZWxmKTsKKyAgVkFMVUUgcmJ1ZiA9IHJiX2l2YXJfZ2V0KHNlbGYsIHJidWZfaXZhcl9pZCk7CisgIHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQsIDIsIHJidWYsIElOVDJGSVgoOCkpOworICB1aW50NjRfdCBoaSA9ICgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbM10pKSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMl0pKSA8PCA4KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMV0pKSA8PCAxNikgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzBdKSkgPDwgMjQpOworICB1aW50MzJfdCBsbyA9ICgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbN10pKSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNl0pKSA8PCA4KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNV0pKSA8PCAxNikgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzRdKSkgPDwgMjQpOwogICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwogfQogCkBAIC0yNjAsMjcgKzI4MywyNyBAQAogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgeworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTM2OCw2ICszOTEsMTEgQEAKIH0KIAogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cmluZyhWQUxVRSBzZWxmKSB7CisgIFZBTFVFIGJ1ZmZlciA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnkoc2VsZik7CisgIHJldHVybiBjb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpOworfQorCitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5KFZBTFVFIHNlbGYpIHsKICAgaW50IHNpemUgPSByZWFkX2kzMl9kaXJlY3Qoc2VsZik7CiAgIHJldHVybiBSRUFEKHNlbGYsIHNpemUpOwogfQpAQCAtMzk2LDYgKzQyNCw3IEBACiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfaTY0IiwgICAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfaTY0LCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9kb3VibGUiLCAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9kb3VibGUsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX3N0cmluZyIsICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3N0cmluZywgMSk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfYmluYXJ5IiwgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfYmluYXJ5LCAxKTsKICAgLy8gdW51c2VkIG1ldGhvZHMKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfbWVzc2FnZV9lbmQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfc3RydWN0X2JlZ2luLCAxKTsKQEAgLTQxNywxMiArNDQ2LDE1IEBACiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9pNjQiLCAgICAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pNjQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfZG91YmxlIiwgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZG91YmxlLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cmluZyIsICAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cmluZywgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9iaW5hcnkiLCAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnksIDApOwogICAvLyB1bnVzZWQgbWV0aG9kcwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2JlZ2luIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9tYXBfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9saXN0X2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQsIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWFwX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2xpc3RfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZCwgMCk7CisKKyAgcmJ1Zl9pdmFyX2lkID0gcmJfaW50ZXJuKCJAcmJ1ZiIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9ieXRlcy5jIGIvbGliL3JiL2V4dC9ieXRlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmZhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L2J5dGVzLmMKQEAgLTAsMCArMSwzNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJ1YnkuaD4KKyNpZmRlZiBIQVZFX1JVQllfRU5DT0RJTkdfSAorI2luY2x1ZGUgPHJ1YnkvZW5jb2RpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNvbnN0YW50cy5oPgorCitWQUxVRSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoVkFMVUUgYnVmZmVyKSB7CisgIHJldHVybiByYl9mdW5jYWxsKHRocmlmdF9ieXRlc19tb2R1bGUsIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZCwgMSwgYnVmZmVyKTsKK30KKworVkFMVUUgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKFZBTFVFIHN0cmluZykgeworICByZXR1cm4gcmJfZnVuY2FsbCh0aHJpZnRfYnl0ZXNfbW9kdWxlLCBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXJfaWQsIDEsIHN0cmluZyk7Cit9CisKK1ZBTFVFIGNvbnZlcnRfdG9fc3RyaW5nKFZBTFVFIHV0ZjhfYnVmZmVyKSB7CisgIHJldHVybiByYl9mdW5jYWxsKHRocmlmdF9ieXRlc19tb2R1bGUsIGNvbnZlcnRfdG9fc3RyaW5nX2lkLCAxLCB1dGY4X2J1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2J5dGVzLmggYi9saWIvcmIvZXh0L2J5dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwOGQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9leHQvYnl0ZXMuaApAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cnVieS5oPgorCisvKgorICogQSBjb2xsZWN0aW9uIG9mIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIGJ5dGVzIGFuZCBieXRlIGJ1ZmZlcnMuCisgKgorICogVGhlc2UgbWV0aG9kcyBhcmUgdGhlIG5hdGl2ZSBhbmFsb2dpZXMgdG8gc29tZSBvZiB0aGUgbWV0aG9kcyBpbgorICogVGhyaWZ0OjpCeXRlcyAodGhyaWZ0L2J5dGVzLnJiKS4KKyAqLworCitWQUxVRSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoVkFMVUUgYnVmZmVyKTsKK1ZBTFVFIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihWQUxVRSBzdHJpbmcpOworVkFMVUUgY29udmVydF90b19zdHJpbmcoVkFMVUUgdXRmOF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwppbmRleCA2YzAxMjNkLi5jMGY0NmI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYworKysgYi9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMjAsOSArMjAsMTAgQEAKICNpbmNsdWRlIDxydWJ5Lmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImNvbnN0YW50cy5oIgotI2luY2x1ZGUgInN0cnVjdC5oIgotI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgPGNvbnN0YW50cy5oPgorI2luY2x1ZGUgPHN0cnVjdC5oPgorI2luY2x1ZGUgPG1hY3Jvcy5oPgorI2luY2x1ZGUgPGJ5dGVzLmg+CiAKICNkZWZpbmUgTEFTVF9JRChvYmopIEZJWDJJTlQocmJfYXJ5X3BvcChyYl9pdmFyX2dldChvYmosIGxhc3RfZmllbGRfaWQpKSkKICNkZWZpbmUgU0VUX0xBU1RfSUQob2JqLCB2YWwpIHJiX2FyeV9wdXNoKHJiX2l2YXJfZ2V0KG9iaiwgbGFzdF9maWVsZF9pZCksIHZhbCkKQEAgLTM0LDEwICszNSwxMiBAQAogc3RhdGljIElEIGxhc3RfZmllbGRfaWQ7CiBzdGF0aWMgSUQgYm9vbGVhbl9maWVsZF9pZDsKIHN0YXRpYyBJRCBib29sX3ZhbHVlX2lkOworc3RhdGljIElEIHJidWZfaXZhcl9pZDsKIAogc3RhdGljIGludCBWRVJTSU9OOwogc3RhdGljIGludCBWRVJTSU9OX01BU0s7CiBzdGF0aWMgaW50IFRZUEVfTUFTSzsKK3N0YXRpYyBpbnQgVFlQRV9CSVRTOwogc3RhdGljIGludCBUWVBFX1NISUZUX0FNT1VOVDsKIHN0YXRpYyBpbnQgUFJPVE9DT0xfSUQ7CiAKQEAgLTE2NSw2ICsxNjgsNyBAQAogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9pMzIoVkFMVUUgc2VsZiwgVkFMVUUgaTMyKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZyhWQUxVRSBzZWxmLCBWQUxVRSBzdHIpOworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1Zik7CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CkBAIC0zMDMsOSArMzA3LDE2IEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZyhWQUxVRSBzZWxmLCBWQUxVRSBzdHIpIHsKKyAgc3RyID0gY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cik7CisgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2JpbmFyeShzZWxmLCBzdHIpOworICByZXR1cm4gUW5pbDsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1ZikgeworICBidWYgPSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKTsKICAgVkFMVUUgdHJhbnNwb3J0ID0gR0VUX1RSQU5TUE9SVChzZWxmKTsKLSAgd3JpdGVfdmFyaW50MzIodHJhbnNwb3J0LCBSU1RSSU5HX0xFTihzdHIpKTsKLSAgV1JJVEUodHJhbnNwb3J0LCBSU1RSSU5HX1BUUihzdHIpLCBSU1RSSU5HX0xFTihzdHIpKTsKKyAgd3JpdGVfdmFyaW50MzIodHJhbnNwb3J0LCBSU1RSSU5HX0xFTihidWYpKTsKKyAgV1JJVEUodHJhbnNwb3J0LCBTdHJpbmdWYWx1ZVB0cihidWYpLCBSU1RSSU5HX0xFTihidWYpKTsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTMxNiw2ICszMjcsNyBAQAogI2RlZmluZSBpc19ib29sX3R5cGUoY3R5cGUpICgoKGN0eXBlKSAmIDB4MEYpID09IENUWVBFX0JPT0xFQU5fVFJVRSB8fCAoKGN0eXBlKSAmIDB4MEYpID09IENUWVBFX0JPT0xFQU5fRkFMU0UpCiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nKFZBTFVFIHNlbGYpOworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnkoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2J5dGUoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2kzMihWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTE2KFZBTFVFIHNlbGYpOwpAQCAtMzU0LDggKzM2Niw4IEBACiB9CiAKIHN0YXRpYyBjaGFyIHJlYWRfYnl0ZV9kaXJlY3QoVkFMVUUgc2VsZikgewotICBWQUxVRSBidWYgPSBSRUFEKHNlbGYsIDEpOwotICByZXR1cm4gUlNUUklOR19QVFIoYnVmKVswXTsKKyAgVkFMVUUgYnl0ZSA9IHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9ieXRlX21ldGhvZF9pZCwgMCk7CisgIHJldHVybiAoY2hhcikoRklYMklOVChieXRlKSk7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IHppZ196YWdfdG9fbGwoaW50NjRfdCBuKSB7CkBAIC00MzksNyArNDUxLDcgQEAKICAgICByYl9leGNfcmFpc2UoZ2V0X3Byb3RvY29sX2V4Y2VwdGlvbihJTlQyRklYKC0xKSwgcmJfc3RyX25ldzIoYnVmKSkpOwogICB9CiAgIAotICBpbnQ4X3QgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDM7CisgIGludDhfdCB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTOwogICBpbnQzMl90IHNlcWlkID0gcmVhZF92YXJpbnQ2NChzZWxmKTsKICAgVkFMVUUgbWVzc2FnZU5hbWUgPSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhzZWxmKTsKICAgcmV0dXJuIHJiX2FyeV9uZXczKDMsIG1lc3NhZ2VOYW1lLCBJTlQyRklYKHR5cGUpLCBJTlQyTlVNKHNlcWlkKSk7CkBAIC01MjgsMzcgKzU0MCw0NSBAQAogICAgIGRvdWJsZSBmOwogICAgIGludDY0X3QgbDsKICAgfSB0cmFuc2ZlcjsKLSAgVkFMVUUgYnl0ZXMgPSBSRUFEKHNlbGYsIDgpOwotICB1aW50MzJfdCBsbyA9ICgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzBdKSkKLSAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVsxXSkpIDw8IDgpCi0gICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbMl0pKSA8PCAxNikKLSAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVszXSkpIDw8IDI0KTsKLSAgdWludDY0X3QgaGkgPSAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbNF0pKSkKLSAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVs1XSkpIDw8IDgpCi0gICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbNl0pKSA8PCAxNikKLSAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVs3XSkpIDw8IDI0KTsKKyAgVkFMVUUgcmJ1ZiA9IHJiX2l2YXJfZ2V0KHNlbGYsIHJidWZfaXZhcl9pZCk7CisgIHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQsIDIsIHJidWYsIElOVDJGSVgoOCkpOworICB1aW50MzJfdCBsbyA9ICgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMF0pKQorICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMV0pKSA8PCA4KQorICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMl0pKSA8PCAxNikKKyAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzNdKSkgPDwgMjQpOworICB1aW50NjRfdCBoaSA9ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzRdKSkpCisgICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVs1XSkpIDw8IDgpCisgICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVs2XSkpIDw8IDE2KQorICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbN10pKSA8PCAyNCk7CiAgIHRyYW5zZmVyLmwgPSAoaGkgPDwgMzIpIHwgbG87CiAKICAgcmV0dXJuIHJiX2Zsb2F0X25ldyh0cmFuc2Zlci5mKTsKIH0KIAogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZikgeworICBWQUxVRSBidWZmZXIgPSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2JpbmFyeShzZWxmKTsKKyAgcmV0dXJuIGNvbnZlcnRfdG9fc3RyaW5nKGJ1ZmZlcik7Cit9CisKK1ZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYmluYXJ5KFZBTFVFIHNlbGYpIHsKICAgaW50NjRfdCBzaXplID0gcmVhZF92YXJpbnQ2NChzZWxmKTsKICAgcmV0dXJuIFJFQUQoc2VsZiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIEluaXRfY29uc3RhbnRzKCkgewogICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcyA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIkNvbXBhY3RQcm90b2NvbCIpKTsKLSAgCisKICAgVkVSU0lPTiA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVkVSU0lPTiIpKSk7CiAgIFZFUlNJT05fTUFTSyA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVkVSU0lPTl9NQVNLIikpKTsKICAgVFlQRV9NQVNLID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJUWVBFX01BU0siKSkpOworICBUWVBFX0JJVFMgPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlRZUEVfQklUUyIpKSk7CiAgIFRZUEVfU0hJRlRfQU1PVU5UID0gRklYMklOVChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVFlQRV9TSElGVF9BTU9VTlQiKSkpOwogICBQUk9UT0NPTF9JRCA9IEZJWDJJTlQocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlBST1RPQ09MX0lEIikpKTsKLSAgCisKICAgbGFzdF9maWVsZF9pZCA9IHJiX2ludGVybigiQGxhc3RfZmllbGQiKTsKICAgYm9vbGVhbl9maWVsZF9pZCA9IHJiX2ludGVybigiQGJvb2xlYW5fZmllbGQiKTsKICAgYm9vbF92YWx1ZV9pZCA9IHJiX2ludGVybigiQGJvb2xfdmFsdWUiKTsKKyAgcmJ1Zl9pdmFyX2lkID0gcmJfaW50ZXJuKCJAcmJ1ZiIpOwogfQogCiBzdGF0aWMgdm9pZCBJbml0X3JiX21ldGhvZHMoKSB7CkBAIC01NzcsNiArNTk3LDcgQEAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX2k2NCIsICAgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9pNjQsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfZG91YmxlIiwgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2RvdWJsZSwgMSk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9zdHJpbmciLCAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc3RyaW5nLCAxKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX2JpbmFyeSIsICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9iaW5hcnksIDEpOwogCiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7CkBAIC01OTksNiArNjIwLDcgQEAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfaTY0IiwgICAgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2k2NCwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX2RvdWJsZSIsICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9kb3VibGUsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9zdHJpbmciLCAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfYmluYXJ5IiwgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2JpbmFyeSwgMCk7CiAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfc3RydWN0X2JlZ2luIiwgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvY29uc3RhbnRzLmggYi9saWIvcmIvZXh0L2NvbnN0YW50cy5oCmluZGV4IDU3ZGY1NDQuLmU3YWVjNDQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvY29uc3RhbnRzLmgKKysrIGIvbGliL3JiL2V4dC9jb25zdGFudHMuaApAQCAtNDIsMTkgKzQyLDIwIEBACiBleHRlcm4gSUQgd3JpdGVfaTY0X21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9kb3VibGVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX3N0cmluZ19tZXRob2RfaWQ7CitleHRlcm4gSUQgd3JpdGVfYmluYXJ5X21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9tYXBfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX21hcF9lbmRfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2xpc3RfZW5kX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9zZXRfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX3NldF9lbmRfbWV0aG9kX2lkOwotZXh0ZXJuIElEIHNpemVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfYm9vbF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9ieXRlX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2kxNl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9pMzJfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfaTY0X21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX3N0cmluZ19tZXRob2RfaWQ7CitleHRlcm4gSUQgcmVhZF9iaW5hcnlfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfZG91YmxlX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9tYXBfZW5kX21ldGhvZF9pZDsKQEAgLTY3LDE0ICs2OCwxNSBAQAogZXh0ZXJuIElEIHJlYWRfZmllbGRfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfZmllbGRfZW5kX21ldGhvZF9pZDsKIGV4dGVybiBJRCBrZXlzX21ldGhvZF9pZDsKLWV4dGVybiBJRCBlbnRyaWVzX21ldGhvZF9pZDsgCi1leHRlcm4gSUQgbmFtZV9tZXRob2RfaWQ7IAotZXh0ZXJuIElEIHNvcnRfbWV0aG9kX2lkOworZXh0ZXJuIElEIGVudHJpZXNfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2ZpZWxkX3N0b3BfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHNraXBfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2FsbF9tZXRob2RfaWQ7Ci1leHRlcm4gSUQgbmF0aXZlX3FtYXJrX21ldGhvZF9pZDsKK2V4dGVybiBJRCByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZDsKK2V4dGVybiBJRCBmb3JjZV9iaW5hcnlfZW5jb2RpbmdfaWQ7CitleHRlcm4gSUQgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkOworZXh0ZXJuIElEIGNvbnZlcnRfdG9fc3RyaW5nX2lkOwogCiBleHRlcm4gSUQgZmllbGRzX2NvbnN0X2lkOwogZXh0ZXJuIElEIHRyYW5zcG9ydF9pdmFyX2lkOwpAQCAtODcsOSArODksMTEgQEAKIGV4dGVybiBWQUxVRSB2YWx1ZV9zeW07CiBleHRlcm4gVkFMVUUgZWxlbWVudF9zeW07CiBleHRlcm4gVkFMVUUgY2xhc3Nfc3ltOworZXh0ZXJuIFZBTFVFIGJpbmFyeV9zeW07CiAKIGV4dGVybiBWQUxVRSByYl9jU2V0OwogZXh0ZXJuIFZBTFVFIHRocmlmdF9tb2R1bGU7CiBleHRlcm4gVkFMVUUgdGhyaWZ0X3R5cGVzX21vZHVsZTsKK2V4dGVybiBWQUxVRSB0aHJpZnRfYnl0ZXNfbW9kdWxlOwogZXh0ZXJuIFZBTFVFIGNsYXNzX3RocmlmdF9wcm90b2NvbDsKIGV4dGVybiBWQUxVRSBwcm90b2NvbF9leGNlcHRpb25fY2xhc3M7CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2V4dGNvbmYucmIgYi9saWIvcmIvZXh0L2V4dGNvbmYucmIKaW5kZXggMzZkYWM5Yi4uYjM1ZjYwYiAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9leHRjb25mLnJiCisrKyBiL2xpYi9yYi9leHQvZXh0Y29uZi5yYgpAQCAtMjEsOCArMjEsMTIgQEAKICAgRmlsZS5vcGVuKCdNYWtlZmlsZScsICd3Jyl7fGZ8IGYucHV0cyAiYWxsOlxuXG5pbnN0YWxsOlxuIiB9CiBlbHNlCiAgIHJlcXVpcmUgJ21rbWYnCisgIHJlcXVpcmUgJ3JiY29uZmlnJwogCi0gICRDRkxBR1MgPSAiLWcgLU8yIC1XYWxsIC1XZXJyb3IiCisgICRBUkNIX0ZMQUdTID0gUmJDb25maWc6OkNPTkZJR1snQ0ZMQUdTJ10uc2NhbiggLygtYXJjaCApKFxTKykvICkubWFwe3x4LHl8IHggKyB5ICsgJyAnIH0uam9pbignJykKKworCisgICRDRkxBR1MgPSAiLWZzaWduZWQtY2hhciAtZyAtTzIgLVdhbGwgLVdlcnJvciAiICsgJEFSQ0hfRkxBR1MKIAogICBoYXZlX2Z1bmMoInN0cmxjcHkiLCAic3RyaW5nLmgiKQogCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L21lbW9yeV9idWZmZXIuYyBiL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCmluZGV4IDc0ZWZhMmMuLjhiNTJjNGEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCisrKyBiL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCkBAIC0xOSw3ICsxOSw4IEBACiAKICNpbmNsdWRlIDxydWJ5Lmg+CiAjaW5jbHVkZSA8Y29uc3RhbnRzLmg+Ci0jaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSA8Ynl0ZXMuaD4KKyNpbmNsdWRlIDxtYWNyb3MuaD4KIAogSUQgYnVmX2l2YXJfaWQ7CiBJRCBpbmRleF9pdmFyX2lkOwpAQCAtMzAsOSArMzEsMTUgQEAKIAogI2RlZmluZSBHRVRfQlVGKHNlbGYpIHJiX2l2YXJfZ2V0KHNlbGYsIGJ1Zl9pdmFyX2lkKQogCitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZShWQUxVRSBzZWxmLCBWQUxVRSBzdHIpOworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZChWQUxVRSBzZWxmLCBWQUxVRSBsZW5ndGhfdmFsdWUpOworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9ieXRlKFZBTFVFIHNlbGYpOworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9pbnRvX2J1ZmZlcihWQUxVRSBzZWxmLCBWQUxVRSBidWZmZXJfdmFsdWUsIFZBTFVFIHNpemVfdmFsdWUpOworCiBWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZShWQUxVRSBzZWxmLCBWQUxVRSBzdHIpIHsKICAgVkFMVUUgYnVmID0gR0VUX0JVRihzZWxmKTsKLSAgcmJfc3RyX2J1Zl9jYXQoYnVmLCBSU1RSSU5HX1BUUihzdHIpLCBSU1RSSU5HX0xFTihzdHIpKTsKKyAgc3RyID0gZm9yY2VfYmluYXJ5X2VuY29kaW5nKHN0cik7CisgIHJiX3N0cl9idWZfY2F0KGJ1ZiwgU3RyaW5nVmFsdWVQdHIoc3RyKSwgUlNUUklOR19MRU4oc3RyKSk7CiAgIHJldHVybiBRbmlsOwogfQogCkBAIC01MywxOSArNjAsNzAgQEAKICAgICByYl9pdmFyX3NldChzZWxmLCBidWZfaXZhcl9pZCwgcmJfZnVuY2FsbChidWYsIHNsaWNlX21ldGhvZF9pZCwgMiwgSU5UMkZJWChpbmRleCksIElOVDJGSVgoUlNUUklOR19MRU4oYnVmKSAtIDEpKSk7CiAgICAgaW5kZXggPSAwOwogICB9CisgIHJiX2l2YXJfc2V0KHNlbGYsIGluZGV4X2l2YXJfaWQsIElOVDJGSVgoaW5kZXgpKTsKIAogICBpZiAoUlNUUklOR19MRU4oZGF0YSkgPCBsZW5ndGgpIHsKICAgICByYl9yYWlzZShyYl9lRU9GRXJyb3IsICJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBtZW1vcnkgYnVmZmVyIik7CiAgIH0KIAotICByYl9pdmFyX3NldChzZWxmLCBpbmRleF9pdmFyX2lkLCBJTlQyRklYKGluZGV4KSk7CiAgIHJldHVybiBkYXRhOwogfQogCitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2J5dGUoVkFMVUUgc2VsZikgeworICBWQUxVRSBpbmRleF92YWx1ZSA9IHJiX2l2YXJfZ2V0KHNlbGYsIGluZGV4X2l2YXJfaWQpOworICBpbnQgaW5kZXggPSBGSVgySU5UKGluZGV4X3ZhbHVlKTsKKworICBWQUxVRSBidWYgPSBHRVRfQlVGKHNlbGYpOworICBpZiAoaW5kZXggPj0gUlNUUklOR19MRU4oYnVmKSkgeworICAgIHJiX3JhaXNlKHJiX2VFT0ZFcnJvciwgIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIG1lbW9yeSBidWZmZXIiKTsKKyAgfQorICBjaGFyIGJ5dGUgPSBSU1RSSU5HX1BUUihidWYpW2luZGV4KytdOworCisgIGlmIChpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFKSB7CisgICAgcmJfaXZhcl9zZXQoc2VsZiwgYnVmX2l2YXJfaWQsIHJiX2Z1bmNhbGwoYnVmLCBzbGljZV9tZXRob2RfaWQsIDIsIElOVDJGSVgoaW5kZXgpLCBJTlQyRklYKFJTVFJJTkdfTEVOKGJ1ZikgLSAxKSkpOworICAgIGluZGV4ID0gMDsKKyAgfQorICByYl9pdmFyX3NldChzZWxmLCBpbmRleF9pdmFyX2lkLCBJTlQyRklYKGluZGV4KSk7CisKKyAgaW50IHJlc3VsdCA9IChpbnQpIGJ5dGU7CisgIHJldHVybiBJTlQyRklYKHJlc3VsdCk7Cit9CisKK1ZBTFVFIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfaW50b19idWZmZXIoVkFMVUUgc2VsZiwgVkFMVUUgYnVmZmVyX3ZhbHVlLCBWQUxVRSBzaXplX3ZhbHVlKSB7CisgIGludCBpID0gMDsKKyAgaW50IHNpemUgPSBGSVgySU5UKHNpemVfdmFsdWUpOworICBpbnQgaW5kZXg7CisgIFZBTFVFIGJ1ZiA9IEdFVF9CVUYoc2VsZik7CisKKyAgaW5kZXggPSBGSVgySU5UKHJiX2l2YXJfZ2V0KHNlbGYsIGluZGV4X2l2YXJfaWQpKTsKKyAgd2hpbGUgKGkgPCBzaXplKSB7CisgICAgaWYgKGluZGV4ID49IFJTVFJJTkdfTEVOKGJ1ZikpIHsKKyAgICAgIHJiX3JhaXNlKHJiX2VFT0ZFcnJvciwgIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIG1lbW9yeSBidWZmZXIiKTsKKyAgICB9CisgICAgY2hhciBieXRlID0gUlNUUklOR19QVFIoYnVmKVtpbmRleCsrXTsKKworICAgIGlmIChpID49IFJTVFJJTkdfTEVOKGJ1ZmZlcl92YWx1ZSkpIHsKKyAgICAgIHJiX3JhaXNlKHJiX2VJbmRleEVycm9yLCAiaW5kZXggJWQgb3V0IG9mIHN0cmluZyIsIGkpOworICAgIH0KKyAgICAoKGNoYXIqKVJTVFJJTkdfUFRSKGJ1ZmZlcl92YWx1ZSkpW2ldID0gYnl0ZTsKKyAgICBpKys7CisgIH0KKworICBpZiAoaW5kZXggPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgeworICAgIHJiX2l2YXJfc2V0KHNlbGYsIGJ1Zl9pdmFyX2lkLCByYl9mdW5jYWxsKGJ1Ziwgc2xpY2VfbWV0aG9kX2lkLCAyLCBJTlQyRklYKGluZGV4KSwgSU5UMkZJWChSU1RSSU5HX0xFTihidWYpIC0gMSkpKTsKKyAgICBpbmRleCA9IDA7CisgIH0KKyAgcmJfaXZhcl9zZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCwgSU5UMkZJWChpbmRleCkpOworCisgIHJldHVybiBJTlQyRklYKGkpOworfQorCiB2b2lkIEluaXRfbWVtb3J5X2J1ZmZlcigpIHsKICAgVkFMVUUgdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJNZW1vcnlCdWZmZXJUcmFuc3BvcnQiKSk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3MsICJ3cml0ZSIsIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlLCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcywgInJlYWQiLCByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkLCAxKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcywgInJlYWRfYnl0ZSIsIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfYnl0ZSwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3MsICJyZWFkX2ludG9fYnVmZmVyIiwgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9pbnRvX2J1ZmZlciwgMik7CiAgIAogICBidWZfaXZhcl9pZCA9IHJiX2ludGVybigiQGJ1ZiIpOwogICBpbmRleF9pdmFyX2lkID0gcmJfaW50ZXJuKCJAaW5kZXgiKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvcHJvdG9jb2wuYyBiL2xpYi9yYi9leHQvcHJvdG9jb2wuYwppbmRleCBjMTg3NjU0Li5lNjlkZTI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3Byb3RvY29sLmMKKysrIGIvbGliL3JiL2V4dC9wcm90b2NvbC5jCkBAIC0xLDE4NSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8cnVieS5oPgotI2luY2x1ZGUgPHByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGNvbnN0YW50cy5oPgotI2luY2x1ZGUgPHN0cnVjdC5oPgotCi1zdGF0aWMgVkFMVUUgc2tpcChWQUxVRSBzZWxmLCBpbnQgdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IFRUWVBFX1NUT1ApIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9CT09MKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2Jvb2xfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9CWVRFKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2J5dGVfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMTYpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfaTE2X21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTMyKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2kzMl9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0k2NCkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9pNjRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9ET1VCTEUpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfZG91YmxlX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX3N0cmluZ19tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUlVDVCkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9zdHJ1Y3RfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVkFMVUUgZmllbGRfaGVhZGVyID0gcmJfZnVuY2FsbChzZWxmLCByZWFkX2ZpZWxkX2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgICBpZiAoTklMX1AoZmllbGRfaGVhZGVyKSB8fCBGSVgySU5UKHJiX2FyeV9lbnRyeShmaWVsZF9oZWFkZXIsIDEpKSA9PSBUVFlQRV9TVE9QICkgewotICAgICAgICBicmVhazsKLSAgICAgIH0gCi0gICAgICBza2lwKHNlbGYsIEZJWDJJTlQocmJfYXJ5X2VudHJ5KGZpZWxkX2hlYWRlciwgMSkpKTsKLSAgICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9maWVsZF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgICB9Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX3N0cnVjdF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9NQVApIHsKLSAgICBpbnQgaTsKLSAgICBWQUxVRSBtYXBfaGVhZGVyID0gcmJfZnVuY2FsbChzZWxmLCByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQsIDApOwotICAgIGludCBrdHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDApKTsKLSAgICBpbnQgdnR5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAxKSk7Ci0gICAgaW50IHNpemUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAyKSk7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgc2tpcChzZWxmLCBrdHlwZSk7Ci0gICAgICBza2lwKHNlbGYsIHZ0eXBlKTsKLSAgICB9Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX21hcF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9MSVNUIHx8IHR0eXBlID09IFRUWVBFX1NFVCkgewotICAgIGludCBpOwotICAgIFZBTFVFIGNvbGxlY3Rpb25faGVhZGVyID0gcmJfZnVuY2FsbChzZWxmLCB0dHlwZSA9PSBUVFlQRV9MSVNUID8gcmVhZF9saXN0X2JlZ2luX21ldGhvZF9pZCA6IHJlYWRfc2V0X2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgaW50IGV0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkoY29sbGVjdGlvbl9oZWFkZXIsIDApKTsKLSAgICBpbnQgc2l6ZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGNvbGxlY3Rpb25faGVhZGVyLCAxKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgc2tpcChzZWxmLCBldHlwZSk7Ci0gICAgfQotICAgIHJiX2Z1bmNhbGwoc2VsZiwgdHR5cGUgPT0gVFRZUEVfTElTVCA/IHJlYWRfbGlzdF9lbmRfbWV0aG9kX2lkIDogcmVhZF9zZXRfZW5kX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmJfcmFpc2UocmJfZU5vdEltcEVycm9yLCAiZG9uJ3Qga25vdyBob3cgdG8gc2tpcCB0eXBlICVkIiwgdHR5cGUpOwotICB9Ci0KLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF9wcm90b2NvbF9uYXRpdmVfcW1hcmsoVkFMVUUgc2VsZikgewotICByZXR1cm4gUWZhbHNlOwotfQotCi1WQUxVRSByYl90aHJpZnRfcHJvdG9jb2xfc2tpcChWQUxVRSBwcm90b2NvbCwgVkFMVUUgdHR5cGUpIHsKLSAgcmV0dXJuIHNraXAocHJvdG9jb2wsIEZJWDJJTlQodHR5cGUpKTsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX21lc3NhZ2VfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZiwgVkFMVUUgbmFtZSkgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfbWFwX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfbGlzdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX3NldF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3JlYWRfbWVzc2FnZV9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfZmllbGRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfbWFwX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfc2V0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi12b2lkIEluaXRfcHJvdG9jb2woKSB7Ci0gIFZBTFVFIGNfcHJvdG9jb2wgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJCYXNlUHJvdG9jb2wiKSk7Ci0gIAotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJza2lwIiwgcmJfdGhyaWZ0X3Byb3RvY29sX3NraXAsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF93cml0ZV9tZXNzYWdlX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfYmVnaW4sIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9zdHJ1Y3RfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9maWVsZF9lbmQiLCByYl90aHJpZnRfd3JpdGVfZmllbGRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfbWFwX2VuZCIsIHJiX3RocmlmdF93cml0ZV9tYXBfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfbGlzdF9lbmQiLCByYl90aHJpZnRfd3JpdGVfbGlzdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9zZXRfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX3NldF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X3JlYWRfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RoaWZ0X3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9zdHJ1Y3RfZW5kIiwgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9maWVsZF9lbmQiLCByYl90aGlmdF9yZWFkX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfbWFwX2VuZCIsIHJiX3RoaWZ0X3JlYWRfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfbGlzdF9lbmQiLCByYl90aGlmdF9yZWFkX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9zZXRfZW5kIiwgcmJfdGhpZnRfcmVhZF9zZXRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAibmF0aXZlPyIsIHJiX3RocmlmdF9wcm90b2NvbF9uYXRpdmVfcW1hcmssIDApOwotICAKLSAgLy8gbmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSAqbnBtdDsKLSAgLy8gbnBtdCA9IEFMTE9DKG5hdGl2ZV9wcm90b19tZXRob2RfdGFibGUpOwotICAvLyBucG10LT53cml0ZV9tZXNzYWdlX2VuZCA9IHJiX3RocmlmdF93cml0ZV9tZXNzYWdlX2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfc3RydWN0X2JlZ2luID0gcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9iZWdpbjsKLSAgLy8gbnBtdC0+d3JpdGVfc3RydWN0X2VuZCA9IHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfZW5kOwotICAvLyBucG10LT53cml0ZV9maWVsZF9lbmQgPSByYl90aHJpZnRfd3JpdGVfZmllbGRfZW5kOwotICAvLyBucG10LT53cml0ZV9tYXBfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX21hcF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX2xpc3RfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX2xpc3RfZW5kOwotICAvLyBucG10LT53cml0ZV9zZXRfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX3NldF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfbWVzc2FnZV9lbmQgPSByYl90aHJpZnRfcmVhZF9tZXNzYWdlX2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSByYl90aGlmdF9yZWFkX3N0cnVjdF9iZWdpbjsKLSAgLy8gbnBtdC0+cmVhZF9zdHJ1Y3RfZW5kID0gcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfZW5kOwotICAvLyBucG10LT5yZWFkX2ZpZWxkX2VuZCA9IHJiX3RoaWZ0X3JlYWRfZmllbGRfZW5kOwotICAvLyBucG10LT5yZWFkX21hcF9lbmQgPSByYl90aGlmdF9yZWFkX21hcF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfbGlzdF9lbmQgPSByYl90aGlmdF9yZWFkX2xpc3RfZW5kOwotICAvLyBucG10LT5yZWFkX3NldF9lbmQgPSByYl90aGlmdF9yZWFkX3NldF9lbmQ7Ci0gIC8vIAotICAvLyBWQUxVRSBtZXRob2RfdGFibGVfb2JqZWN0ID0gRGF0YV9XcmFwX1N0cnVjdChyYl9jT2JqZWN0LCAwLCBmcmVlLCBucG10KTsKLSAgLy8gcmJfY29uc3Rfc2V0KGNfcHJvdG9jb2wsIHJiX2ludGVybigiQG5hdGl2ZV9tZXRob2RfdGFibGUiKSwgbWV0aG9kX3RhYmxlX29iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3Byb3RvY29sLmggYi9saWIvcmIvZXh0L3Byb3RvY29sLmgKaW5kZXggNTM2OTUzMC4uZTY5ZGUyOSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9wcm90b2NvbC5oCisrKyBiL2xpYi9yYi9leHQvcHJvdG9jb2wuaApAQCAtMSwyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXZvaWQgSW5pdF9wcm90b2NvbCgpOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9zdHJsY3B5LmMgYi9saWIvcmIvZXh0L3N0cmxjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAwZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2V4dC9zdHJsY3B5LmMKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInN0cmxjcHkuaCIKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKKyNkZWZpbmUgSEFWRV9TVFJMQ1BZCitzaXplX3QKK3N0cmxjcHkgKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZHN0X3N6KQoreworICAgIHNpemVfdCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IGRzdF9zejsgbisrKSB7CisgICAgICBpZiAoKCpkc3QrKyA9ICpzcmMrKykgPT0gJ1wwJykKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG4gPCBkc3Rfc3opCisgICAgICByZXR1cm4gbjsKKyAgICBpZiAobiA+IDApCisgICAgICAqKGRzdCAtIDEpID0gJ1wwJzsKKyAgICByZXR1cm4gbiArIHN0cmxlbiAoc3JjKTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cmxjcHkuaCBiL2xpYi9yYi9leHQvc3RybGNweS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmUwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L3N0cmxjcHkuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBfX2hhc19idWlsdGluCisjZGVmaW5lIF9faGFzX2J1aWx0aW4oeCkgMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJMQ1BZCitzaXplX3Qgc3RybGNweSAoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc3opOworI2Vsc2UKKyNpZiAhX19oYXNfYnVpbHRpbihzdHJsY3B5KQorZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9zdHJ1Y3QuYyBiL2xpYi9yYi9leHQvc3RydWN0LmMKaW5kZXggZGI3OGVmYS4uZTNhYTg1NSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9zdHJ1Y3QuYworKysgYi9saWIvcmIvZXh0L3N0cnVjdC5jCkBAIC0yMCwzMyArMjAsNyBAQAogI2luY2x1ZGUgInN0cnVjdC5oIgogI2luY2x1ZGUgImNvbnN0YW50cy5oIgogI2luY2x1ZGUgIm1hY3Jvcy5oIgotCi0jaWZuZGVmIEhBVkVfU1RSTENQWQotCi1zdGF0aWMKLXNpemVfdAotc3RybGNweSAoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc3opCi17Ci0gICAgc2l6ZV90IG47Ci0KLSAgICBmb3IgKG4gPSAwOyBuIDwgZHN0X3N6OyBuKyspIHsKLSAgICAgIGlmICgoKmRzdCsrID0gKnNyYysrKSA9PSAnXDAnKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobiA8IGRzdF9zeikKLSAgICAgIHJldHVybiBuOwotICAgIGlmIChuID4gMCkKLSAgICAgICooZHN0IC0gMSkgPSAnXDAnOwotICAgIHJldHVybiBuICsgc3RybGVuIChzcmMpOwotfQotI2Vsc2UKLS8qCi0gICBSdWJ5IDEuOS54IGluY2x1ZGVzIHRoZSBPcGVuQlNEIGltcGxlbWVudGF0aW9uIG9mIHN0cmxjcHkuCi0gICBTZWUgbWlzc2luZy9zdHJsY3B5LmMgaW4gUnVieSAxLjkgc291cmNlCi0gKi8KLWV4dGVybiBzaXplX3Qgc3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLSNlbmRpZgorI2luY2x1ZGUgInN0cmxjcHkuaCIKIAogVkFMVUUgdGhyaWZ0X3VuaW9uX2NsYXNzOwogCkBAIC01NSw2ICsyOSw3IEBACiAKIElEIHRvX3NfbWV0aG9kX2lkOwogSUQgbmFtZV90b19pZF9tZXRob2RfaWQ7CitzdGF0aWMgSUQgc29ydGVkX2ZpZWxkX2lkc19tZXRob2RfaWQ7CiAKICNkZWZpbmUgSVNfQ09OVEFJTkVSKHR0eXBlKSAoKHR0eXBlKSA9PSBUVFlQRV9NQVAgfHwgKHR0eXBlKSA9PSBUVFlQRV9MSVNUIHx8ICh0dHlwZSkgPT0gVFRZUEVfU0VUKQogI2RlZmluZSBTVFJVQ1RfRklFTERTKG9iaikgcmJfY29uc3RfZ2V0KENMQVNTX09GKG9iaiksIGZpZWxkc19jb25zdF9pZCkKQEAgLTEwMCw2ICs3NSwxMSBAQAogICByZXR1cm4gUW5pbDsKIH0KIAorVkFMVUUgZGVmYXVsdF93cml0ZV9iaW5hcnkoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIHZhbHVlKSB7CisgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQsIDEsIHZhbHVlKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKIFZBTFVFIGRlZmF1bHRfd3JpdGVfbGlzdF9iZWdpbihWQUxVRSBwcm90b2NvbCwgVkFMVUUgZXR5cGUsIFZBTFVFIGxlbmd0aCkgewogICByYl9mdW5jYWxsKHByb3RvY29sLCB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZCwgMiwgZXR5cGUsIGxlbmd0aCk7CiAgIHJldHVybiBRbmlsOwpAQCAtMjE1LDYgKzE5NSwxMCBAQAogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJpbmdfbWV0aG9kX2lkLCAwKTsKIH0KIAorVkFMVUUgZGVmYXVsdF9yZWFkX2JpbmFyeShWQUxVRSBwcm90b2NvbCkgeworICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9iaW5hcnlfbWV0aG9kX2lkLCAwKTsKK30KKwogVkFMVUUgZGVmYXVsdF9yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBwcm90b2NvbCkgewogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJ1Y3RfYmVnaW5fbWV0aG9kX2lkLCAwKTsKIH0KQEAgLTIzMCwxMCArMjE0LDEwIEBACiBzdGF0aWMgdm9pZCB3cml0ZV9hbnl0aGluZyhpbnQgdHR5cGUsIFZBTFVFIHZhbHVlLCBWQUxVRSBwcm90b2NvbCwgVkFMVUUgZmllbGRfaW5mbyk7CiAKIFZBTFVFIGdldF9maWVsZF92YWx1ZShWQUxVRSBvYmosIFZBTFVFIGZpZWxkX25hbWUpIHsKLSAgY2hhciBuYW1lX2J1ZltSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDFdOworICBjaGFyIG5hbWVfYnVmW1JTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMl07CiAKICAgbmFtZV9idWZbMF0gPSAnQCc7Ci0gIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgc2l6ZW9mKG5hbWVfYnVmKSk7CisgIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgUlNUUklOR19MRU4oZmllbGRfbmFtZSkgKyAxKTsKIAogICBWQUxVRSB2YWx1ZSA9IHJiX2l2YXJfZ2V0KG9iaiwgcmJfaW50ZXJuKG5hbWVfYnVmKSk7CiAKQEAgLTMwNiw3ICsyOTAsNyBAQAogCiAgICAgaWYgKFRZUEUodmFsdWUpID09IFRfQVJSQVkpIHsKICAgICAgIGl0ZW1zID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsgICAgICAgIAorICAgIH0gZWxzZSB7CiAgICAgICBpZiAocmJfY1NldCA9PSBDTEFTU19PRih2YWx1ZSkpIHsKICAgICAgICAgaXRlbXMgPSByYl9mdW5jYWxsKHZhbHVlLCBlbnRyaWVzX21ldGhvZF9pZCwgMCk7CiAgICAgICB9IGVsc2UgewpAQCAtMzUyLDcgKzMzNiwxMiBAQAogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0RPVUJMRSkgewogICAgIGRlZmF1bHRfd3JpdGVfZG91YmxlKHByb3RvY29sLCB2YWx1ZSk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgZGVmYXVsdF93cml0ZV9zdHJpbmcocHJvdG9jb2wsIHZhbHVlKTsKKyAgICBWQUxVRSBpc19iaW5hcnkgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgYmluYXJ5X3N5bSk7CisgICAgaWYgKGlzX2JpbmFyeSAhPSBRdHJ1ZSkgeworICAgICAgZGVmYXVsdF93cml0ZV9zdHJpbmcocHJvdG9jb2wsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVmYXVsdF93cml0ZV9iaW5hcnkocHJvdG9jb2wsIHZhbHVlKTsKKyAgICB9CiAgIH0gZWxzZSBpZiAoSVNfQ09OVEFJTkVSKHR0eXBlKSkgewogICAgIHdyaXRlX2NvbnRhaW5lcih0dHlwZSwgZmllbGRfaW5mbywgdmFsdWUsIHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJVQ1QpIHsKQEAgLTM3NSwxMyArMzY0LDExIEBACiAKICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgZmllbGRzIGhlcmUKICAgVkFMVUUgc3RydWN0X2ZpZWxkcyA9IFNUUlVDVF9GSUVMRFMoc2VsZik7Ci0KLSAgVkFMVUUgc3RydWN0X2ZpZWxkX2lkc191bm9yZGVyZWQgPSByYl9mdW5jYWxsKHN0cnVjdF9maWVsZHMsIGtleXNfbWV0aG9kX2lkLCAwKTsKLSAgVkFMVUUgc3RydWN0X2ZpZWxkX2lkc19vcmRlcmVkID0gcmJfZnVuY2FsbChzdHJ1Y3RfZmllbGRfaWRzX3Vub3JkZXJlZCwgc29ydF9tZXRob2RfaWQsIDApOworICBWQUxVRSBzb3J0ZWRfZmllbGRfaWRzID0gcmJfZnVuY2FsbChzZWxmLCBzb3J0ZWRfZmllbGRfaWRzX21ldGhvZF9pZCwgMCk7CiAKICAgaW50IGkgPSAwOwotICBmb3IgKGk9MDsgaSA8IFJBUlJBWV9MRU4oc3RydWN0X2ZpZWxkX2lkc19vcmRlcmVkKTsgaSsrKSB7Ci0gICAgVkFMVUUgZmllbGRfaWQgPSByYl9hcnlfZW50cnkoc3RydWN0X2ZpZWxkX2lkc19vcmRlcmVkLCBpKTsKKyAgZm9yIChpPTA7IGkgPCBSQVJSQVlfTEVOKHNvcnRlZF9maWVsZF9pZHMpOyBpKyspIHsKKyAgICBWQUxVRSBmaWVsZF9pZCA9IHJiX2FyeV9lbnRyeShzb3J0ZWRfZmllbGRfaWRzLCBpKTsKIAogICAgIFZBTFVFIGZpZWxkX2luZm8gPSByYl9oYXNoX2FyZWYoc3RydWN0X2ZpZWxkcywgZmllbGRfaWQpOwogCkBAIC00MTQsMTYgKzQwMSwzNSBAQAogCiBzdGF0aWMgVkFMVUUgcmJfdGhyaWZ0X3VuaW9uX3JlYWQoVkFMVUUgc2VsZiwgVkFMVUUgcHJvdG9jb2wpOwogc3RhdGljIFZBTFVFIHJiX3RocmlmdF9zdHJ1Y3RfcmVhZChWQUxVRSBzZWxmLCBWQUxVRSBwcm90b2NvbCk7CitzdGF0aWMgdm9pZCBza2lwX21hcF9jb250ZW50cyhWQUxVRSBwcm90b2NvbCwgVkFMVUUga2V5X3R5cGVfdmFsdWUsIFZBTFVFIHZhbHVlX3R5cGVfdmFsdWUsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIHNraXBfbGlzdF9vcl9zZXRfY29udGVudHMoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIGVsZW1lbnRfdHlwZV92YWx1ZSwgaW50IHNpemUpOwogCiBzdGF0aWMgdm9pZCBzZXRfZmllbGRfdmFsdWUoVkFMVUUgb2JqLCBWQUxVRSBmaWVsZF9uYW1lLCBWQUxVRSB2YWx1ZSkgewotICBjaGFyIG5hbWVfYnVmW1JTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMV07CisgIGNoYXIgbmFtZV9idWZbUlNUUklOR19MRU4oZmllbGRfbmFtZSkgKyAyXTsKIAogICBuYW1lX2J1ZlswXSA9ICdAJzsKLSAgc3RybGNweSgmbmFtZV9idWZbMV0sIFJTVFJJTkdfUFRSKGZpZWxkX25hbWUpLCBzaXplb2YobmFtZV9idWYpKTsKKyAgc3RybGNweSgmbmFtZV9idWZbMV0sIFJTVFJJTkdfUFRSKGZpZWxkX25hbWUpLCBSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSsxKTsKIAogICByYl9pdmFyX3NldChvYmosIHJiX2ludGVybihuYW1lX2J1ZiksIHZhbHVlKTsKIH0KIAorLy8gSGVscGVyIG1ldGhvZCB0byBza2lwIHRoZSBjb250ZW50cyBvZiBhIG1hcCAoYXNzdW1lcyB0aGUgbWFwIGhlYWRlciBoYXMgYmVlbiByZWFkKS4KK3N0YXRpYyB2b2lkIHNraXBfbWFwX2NvbnRlbnRzKFZBTFVFIHByb3RvY29sLCBWQUxVRSBrZXlfdHlwZV92YWx1ZSwgVkFMVUUgdmFsdWVfdHlwZV92YWx1ZSwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICByYl9mdW5jYWxsKHByb3RvY29sLCBza2lwX21ldGhvZF9pZCwgMSwga2V5X3R5cGVfdmFsdWUpOworICAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHNraXBfbWV0aG9kX2lkLCAxLCB2YWx1ZV90eXBlX3ZhbHVlKTsKKyAgfQorfQorCisvLyBIZWxwZXIgbWV0aG9kIHRvIHNraXAgdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBvciBzZXQgKGFzc3VtZXMgdGhlIGxpc3Qvc2V0IGhlYWRlciBoYXMgYmVlbiByZWFkKS4KK3N0YXRpYyB2b2lkIHNraXBfbGlzdF9vcl9zZXRfY29udGVudHMoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIGVsZW1lbnRfdHlwZV92YWx1ZSwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICByYl9mdW5jYWxsKHByb3RvY29sLCBza2lwX21ldGhvZF9pZCwgMSwgZWxlbWVudF90eXBlX3ZhbHVlKTsKKyAgfQorfQorCiBzdGF0aWMgVkFMVUUgcmVhZF9hbnl0aGluZyhWQUxVRSBwcm90b2NvbCwgaW50IHR0eXBlLCBWQUxVRSBmaWVsZF9pbmZvKSB7CiAgIFZBTFVFIHJlc3VsdCA9IFFuaWw7CiAKQEAgLTQzOCw3ICs0NDQsMTIgQEAKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JNjQpIHsKICAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfaTY0KHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJJTkcpIHsKLSAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfc3RyaW5nKHByb3RvY29sKTsKKyAgICBWQUxVRSBpc19iaW5hcnkgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgYmluYXJ5X3N5bSk7CisgICAgaWYgKGlzX2JpbmFyeSAhPSBRdHJ1ZSkgeworICAgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX3N0cmluZyhwcm90b2NvbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9iaW5hcnkocHJvdG9jb2wpOworICAgIH0KICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9ET1VCTEUpIHsKICAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfZG91YmxlKHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJVQ1QpIHsKQEAgLTQ1OCwxOCArNDY5LDMwIEBACiAgICAgaW50IHZhbHVlX3R0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMSkpOwogICAgIGludCBudW1fZW50cmllcyA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDIpKTsKIAorICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBrZXkgYW5kIHZhbHVlIHR5cGVzIGFnYWluc3QgdGhlIGV4cGVjdGVkIG9uZXMgYW5kIHNraXAgdGhlIG1hcCBjb250ZW50cworICAgIC8vIGlmIHRoZSB0eXBlcyBkb24ndCBtYXRjaC4KICAgICBWQUxVRSBrZXlfaW5mbyA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBrZXlfc3ltKTsKICAgICBWQUxVRSB2YWx1ZV9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIHZhbHVlX3N5bSk7CiAKLSAgICByZXN1bHQgPSByYl9oYXNoX25ldygpOworICAgIGlmICghTklMX1Aoa2V5X2luZm8pICYmICFOSUxfUCh2YWx1ZV9pbmZvKSkgeworICAgICAgaW50IHNwZWNpZmllZF9rZXlfdHlwZSA9IEZJWDJJTlQocmJfaGFzaF9hcmVmKGtleV9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaW50IHNwZWNpZmllZF92YWx1ZV90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYodmFsdWVfaW5mbywgdHlwZV9zeW0pKTsKKyAgICAgIGlmIChudW1fZW50cmllcyA9PSAwIHx8IChzcGVjaWZpZWRfa2V5X3R5cGUgPT0ga2V5X3R0eXBlICYmIHNwZWNpZmllZF92YWx1ZV90eXBlID09IHZhbHVlX3R0eXBlKSkgeworICAgICAgICByZXN1bHQgPSByYl9oYXNoX25ldygpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyArK2kpIHsKLSAgICAgIFZBTFVFIGtleSwgdmFsOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkgeworICAgICAgICAgIFZBTFVFIGtleSwgdmFsOwogCi0gICAgICBrZXkgPSByZWFkX2FueXRoaW5nKHByb3RvY29sLCBrZXlfdHR5cGUsIGtleV9pbmZvKTsKLSAgICAgIHZhbCA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIHZhbHVlX3R0eXBlLCB2YWx1ZV9pbmZvKTsKKyAgICAgICAgICBrZXkgPSByZWFkX2FueXRoaW5nKHByb3RvY29sLCBrZXlfdHR5cGUsIGtleV9pbmZvKTsKKyAgICAgICAgICB2YWwgPSByZWFkX2FueXRoaW5nKHByb3RvY29sLCB2YWx1ZV90dHlwZSwgdmFsdWVfaW5mbyk7CiAKLSAgICAgIHJiX2hhc2hfYXNldChyZXN1bHQsIGtleSwgdmFsKTsKKyAgICAgICAgICByYl9oYXNoX2FzZXQocmVzdWx0LCBrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNraXBfbWFwX2NvbnRlbnRzKHByb3RvY29sLCBJTlQyRklYKGtleV90dHlwZSksIElOVDJGSVgodmFsdWVfdHR5cGUpLCBudW1fZW50cmllcyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNraXBfbWFwX2NvbnRlbnRzKHByb3RvY29sLCBJTlQyRklYKGtleV90dHlwZSksIElOVDJGSVgodmFsdWVfdHR5cGUpLCBudW1fZW50cmllcyk7CiAgICAgfQogCiAgICAgZGVmYXVsdF9yZWFkX21hcF9lbmQocHJvdG9jb2wpOwpAQCAtNDc5LDEwICs1MDIsMjMgQEAKICAgICBWQUxVRSBsaXN0X2hlYWRlciA9IGRlZmF1bHRfcmVhZF9saXN0X2JlZ2luKHByb3RvY29sKTsKICAgICBpbnQgZWxlbWVudF90dHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGxpc3RfaGVhZGVyLCAwKSk7CiAgICAgaW50IG51bV9lbGVtZW50cyA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGxpc3RfaGVhZGVyLCAxKSk7Ci0gICAgcmVzdWx0ID0gcmJfYXJ5X25ldzIobnVtX2VsZW1lbnRzKTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7ICsraSkgewotICAgICAgcmJfYXJ5X3B1c2gocmVzdWx0LCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBlbGVtZW50X3R0eXBlLCByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgZWxlbWVudF9zeW0pKSk7CisgICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIGVsZW1lbnQgdHlwZSBhZ2FpbnN0IHRoZSBleHBlY3RlZCBvbmUgYW5kIHNraXAgdGhlIGxpc3QgY29udGVudHMKKyAgICAvLyBpZiB0aGUgdHlwZXMgZG9uJ3QgbWF0Y2guCisgICAgVkFMVUUgZWxlbWVudF9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKTsKKyAgICBpZiAoIU5JTF9QKGVsZW1lbnRfaW5mbykpIHsKKyAgICAgIGludCBzcGVjaWZpZWRfZWxlbWVudF90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYoZWxlbWVudF9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaWYgKHNwZWNpZmllZF9lbGVtZW50X3R5cGUgPT0gZWxlbWVudF90dHlwZSkgeworICAgICAgICByZXN1bHQgPSByYl9hcnlfbmV3MihudW1fZWxlbWVudHMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7ICsraSkgeworICAgICAgICAgIHJiX2FyeV9wdXNoKHJlc3VsdCwgcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgZWxlbWVudF90dHlwZSwgcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKSkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKHByb3RvY29sLCBJTlQyRklYKGVsZW1lbnRfdHR5cGUpLCBudW1fZWxlbWVudHMpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKHByb3RvY29sLCBJTlQyRklYKGVsZW1lbnRfdHR5cGUpLCBudW1fZWxlbWVudHMpOwogICAgIH0KIAogICAgIGRlZmF1bHRfcmVhZF9saXN0X2VuZChwcm90b2NvbCk7CkBAIC00OTMsMTUgKzUyOSwyOCBAQAogICAgIFZBTFVFIHNldF9oZWFkZXIgPSBkZWZhdWx0X3JlYWRfc2V0X2JlZ2luKHByb3RvY29sKTsKICAgICBpbnQgZWxlbWVudF90dHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KHNldF9oZWFkZXIsIDApKTsKICAgICBpbnQgbnVtX2VsZW1lbnRzID0gRklYMklOVChyYl9hcnlfZW50cnkoc2V0X2hlYWRlciwgMSkpOwotICAgIGl0ZW1zID0gcmJfYXJ5X25ldzIobnVtX2VsZW1lbnRzKTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7ICsraSkgewotICAgICAgcmJfYXJ5X3B1c2goaXRlbXMsIHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGVsZW1lbnRfdHR5cGUsIHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBlbGVtZW50X3N5bSkpKTsKKyAgICAvLyBDaGVjayB0aGUgZGVjbGFyZWQgZWxlbWVudCB0eXBlIGFnYWluc3QgdGhlIGV4cGVjdGVkIG9uZSBhbmQgc2tpcCB0aGUgc2V0IGNvbnRlbnRzCisgICAgLy8gaWYgdGhlIHR5cGVzIGRvbid0IG1hdGNoLgorICAgIFZBTFVFIGVsZW1lbnRfaW5mbyA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBlbGVtZW50X3N5bSk7CisgICAgaWYgKCFOSUxfUChlbGVtZW50X2luZm8pKSB7CisgICAgICBpbnQgc3BlY2lmaWVkX2VsZW1lbnRfdHlwZSA9IEZJWDJJTlQocmJfaGFzaF9hcmVmKGVsZW1lbnRfaW5mbywgdHlwZV9zeW0pKTsKKyAgICAgIGlmIChzcGVjaWZpZWRfZWxlbWVudF90eXBlID09IGVsZW1lbnRfdHR5cGUpIHsKKyAgICAgICAgaXRlbXMgPSByYl9hcnlfbmV3MihudW1fZWxlbWVudHMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7ICsraSkgeworICAgICAgICAgIHJiX2FyeV9wdXNoKGl0ZW1zLCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBlbGVtZW50X3R0eXBlLCByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgZWxlbWVudF9zeW0pKSk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMSwgJml0ZW1zLCByYl9jU2V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNraXBfbGlzdF9vcl9zZXRfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoZWxlbWVudF90dHlwZSksIG51bV9lbGVtZW50cyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNraXBfbGlzdF9vcl9zZXRfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoZWxlbWVudF90dHlwZSksIG51bV9lbGVtZW50cyk7CiAgICAgfQogCiAgICAgZGVmYXVsdF9yZWFkX3NldF9lbmQocHJvdG9jb2wpOwotCi0gICAgcmVzdWx0ID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDEsICZpdGVtcywgcmJfY1NldCk7CiAgIH0gZWxzZSB7CiAgICAgcmJfcmFpc2UocmJfZU5vdEltcEVycm9yLCAicmVhZF9hbnl0aGluZyBub3QgaW1wbGVtZW50ZWQgZm9yIHR5cGUgJWQhIiwgdHR5cGUpOwogICB9CkBAIC01NzcsNyArNjI2LDcgQEAKICAgICBpZiAoZmllbGRfdHlwZSA9PSBzcGVjaWZpZWRfdHlwZSkgewogICAgICAgLy8gcmVhZCB0aGUgdmFsdWUKICAgICAgIFZBTFVFIG5hbWUgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgbmFtZV9zeW0pOwotICAgICAgcmJfaXZfc2V0KHNlbGYsICJAc2V0ZmllbGQiLCBJRDJTWU0ocmJfaW50ZXJuKFJTVFJJTkdfUFRSKG5hbWUpKSkpOworICAgICAgcmJfaXZfc2V0KHNlbGYsICJAc2V0ZmllbGQiLCByYl9zdHJfaW50ZXJuKG5hbWUpKTsKICAgICAgIHJiX2l2X3NldChzZWxmLCAiQHZhbHVlIiwgcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgZmllbGRfdHlwZSwgZmllbGRfaW5mbykpOwogICAgIH0gZWxzZSB7CiAgICAgICByYl9mdW5jYWxsKHByb3RvY29sLCBza2lwX21ldGhvZF9pZCwgMSwgZmllbGRfdHlwZV92YWx1ZSk7CkBAIC01OTcsOSArNjQ2LDYgQEAKICAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAidG9vIG1hbnkgZmllbGRzIGluIHVuaW9uISIpOwogICB9CiAKLSAgLy8gcmVhZCBmaWVsZCBlbmQKLSAgZGVmYXVsdF9yZWFkX2ZpZWxkX2VuZChwcm90b2NvbCk7Ci0KICAgLy8gcmVhZCBzdHJ1Y3QgZW5kCiAgIGRlZmF1bHRfcmVhZF9zdHJ1Y3RfZW5kKHByb3RvY29sKTsKIApAQCAtNjI0LDYgKzY3MCwxMCBAQAogCiAgIFZBTFVFIGZpZWxkX2luZm8gPSByYl9oYXNoX2FyZWYoc3RydWN0X2ZpZWxkcywgZmllbGRfaWQpOwogCisgIGlmKE5JTF9QKGZpZWxkX2luZm8pKSB7CisgICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIik7CisgIH0KKwogICBWQUxVRSB0dHlwZV92YWx1ZSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCB0eXBlX3N5bSk7CiAgIGludCB0dHlwZSA9IEZJWDJJTlQodHR5cGVfdmFsdWUpOwogCkBAIC02NTcsNCArNzA3LDUgQEAKIAogICB0b19zX21ldGhvZF9pZCA9IHJiX2ludGVybigidG9fcyIpOwogICBuYW1lX3RvX2lkX21ldGhvZF9pZCA9IHJiX2ludGVybigibmFtZV90b19pZCIpOworICBzb3J0ZWRfZmllbGRfaWRzX21ldGhvZF9pZCA9IHJiX2ludGVybigic29ydGVkX2ZpZWxkX2lkcyIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMgYi9saWIvcmIvZXh0L3RocmlmdF9uYXRpdmUuYwppbmRleCAwOWI5ZmU0Li4zNDMwYjdjIDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3RocmlmdF9uYXRpdmUuYworKysgYi9saWIvcmIvZXh0L3RocmlmdF9uYXRpdmUuYwpAQCAtMTgsMTUgKzE4LDE2IEBACiAgKi8KIAogI2luY2x1ZGUgPHJ1YnkuaD4KKyNpbmNsdWRlIDxieXRlcy5oPgogI2luY2x1ZGUgPHN0cnVjdC5oPgogI2luY2x1ZGUgPGJpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5oPgogI2luY2x1ZGUgPGNvbXBhY3RfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC5oPgogI2luY2x1ZGUgPG1lbW9yeV9idWZmZXIuaD4KIAogLy8gY2FjaGVkIGNsYXNzZXMvbW9kdWxlcwogVkFMVUUgcmJfY1NldDsKIFZBTFVFIHRocmlmdF9tb2R1bGU7CitWQUxVRSB0aHJpZnRfYnl0ZXNfbW9kdWxlOwogVkFMVUUgdGhyaWZ0X3R5cGVzX21vZHVsZTsKIAogLy8gVFR5cGUgY29uc3RhbnRzCkBAIC01NiwxOSArNTcsMjAgQEAKIElEIHdyaXRlX2k2NF9tZXRob2RfaWQ7CiBJRCB3cml0ZV9kb3VibGVfbWV0aG9kX2lkOwogSUQgd3JpdGVfc3RyaW5nX21ldGhvZF9pZDsKK0lEIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQ7CiBJRCB3cml0ZV9tYXBfYmVnaW5fbWV0aG9kX2lkOwogSUQgd3JpdGVfbWFwX2VuZF9tZXRob2RfaWQ7CiBJRCB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZDsKIElEIHdyaXRlX2xpc3RfZW5kX21ldGhvZF9pZDsKIElEIHdyaXRlX3NldF9iZWdpbl9tZXRob2RfaWQ7CiBJRCB3cml0ZV9zZXRfZW5kX21ldGhvZF9pZDsKLUlEIHNpemVfbWV0aG9kX2lkOwogSUQgcmVhZF9ib29sX21ldGhvZF9pZDsKIElEIHJlYWRfYnl0ZV9tZXRob2RfaWQ7CiBJRCByZWFkX2kxNl9tZXRob2RfaWQ7CiBJRCByZWFkX2kzMl9tZXRob2RfaWQ7CiBJRCByZWFkX2k2NF9tZXRob2RfaWQ7CiBJRCByZWFkX3N0cmluZ19tZXRob2RfaWQ7CitJRCByZWFkX2JpbmFyeV9tZXRob2RfaWQ7CiBJRCByZWFkX2RvdWJsZV9tZXRob2RfaWQ7CiBJRCByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQ7CiBJRCByZWFkX21hcF9lbmRfbWV0aG9kX2lkOwpAQCAtODEsMTQgKzgzLDE1IEBACiBJRCByZWFkX2ZpZWxkX2JlZ2luX21ldGhvZF9pZDsKIElEIHJlYWRfZmllbGRfZW5kX21ldGhvZF9pZDsKIElEIGtleXNfbWV0aG9kX2lkOwotSUQgZW50cmllc19tZXRob2RfaWQ7IAotSUQgbmFtZV9tZXRob2RfaWQ7IAotSUQgc29ydF9tZXRob2RfaWQ7CitJRCBlbnRyaWVzX21ldGhvZF9pZDsKIElEIHdyaXRlX2ZpZWxkX3N0b3BfbWV0aG9kX2lkOwogSUQgc2tpcF9tZXRob2RfaWQ7CiBJRCB3cml0ZV9tZXRob2RfaWQ7CiBJRCByZWFkX2FsbF9tZXRob2RfaWQ7Ci1JRCBuYXRpdmVfcW1hcmtfbWV0aG9kX2lkOworSUQgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQ7CitJRCBmb3JjZV9iaW5hcnlfZW5jb2RpbmdfaWQ7CitJRCBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXJfaWQ7CitJRCBjb252ZXJ0X3RvX3N0cmluZ19pZDsKIAogLy8gY29uc3RhbnQgaWRzCiBJRCBmaWVsZHNfY29uc3RfaWQ7CkBAIC0xMDMsMTEgKzEwNiwxMyBAQAogVkFMVUUgdmFsdWVfc3ltOwogVkFMVUUgZWxlbWVudF9zeW07CiBWQUxVRSBjbGFzc19zeW07CitWQUxVRSBiaW5hcnlfc3ltOwogVkFMVUUgcHJvdG9jb2xfZXhjZXB0aW9uX2NsYXNzOwogCiB2b2lkIEluaXRfdGhyaWZ0X25hdGl2ZSgpIHsKICAgLy8gY2FjaGVkIGNsYXNzZXMKICAgdGhyaWZ0X21vZHVsZSA9IHJiX2NvbnN0X2dldChyYl9jT2JqZWN0LCByYl9pbnRlcm4oIlRocmlmdCIpKTsKKyAgdGhyaWZ0X2J5dGVzX21vZHVsZSA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIkJ5dGVzIikpOwogICB0aHJpZnRfdHlwZXNfbW9kdWxlID0gcmJfY29uc3RfZ2V0KHRocmlmdF9tb2R1bGUsIHJiX2ludGVybigiVHlwZXMiKSk7CiAgIHJiX2NTZXQgPSByYl9jb25zdF9nZXQocmJfY09iamVjdCwgcmJfaW50ZXJuKCJTZXQiKSk7CiAgIHByb3RvY29sX2V4Y2VwdGlvbl9jbGFzcyA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIlByb3RvY29sRXhjZXB0aW9uIikpOwpAQCAtMTM4LDE5ICsxNDMsMjAgQEAKICAgd3JpdGVfaTY0X21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfaTY0Iik7CiAgIHdyaXRlX2RvdWJsZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2RvdWJsZSIpOwogICB3cml0ZV9zdHJpbmdfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9zdHJpbmciKTsKKyAgd3JpdGVfYmluYXJ5X21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfYmluYXJ5Iik7CiAgIHdyaXRlX21hcF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX21hcF9iZWdpbiIpOwogICB3cml0ZV9tYXBfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfbWFwX2VuZCIpOwogICB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfbGlzdF9iZWdpbiIpOwogICB3cml0ZV9saXN0X2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2xpc3RfZW5kIik7CiAgIHdyaXRlX3NldF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX3NldF9iZWdpbiIpOwogICB3cml0ZV9zZXRfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfc2V0X2VuZCIpOwotICBzaXplX21ldGhvZF9pZCA9IHJiX2ludGVybigic2l6ZSIpOwogICByZWFkX2Jvb2xfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2Jvb2wiKTsKICAgcmVhZF9ieXRlX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9ieXRlIik7CiAgIHJlYWRfaTE2X21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pMTYiKTsKICAgcmVhZF9pMzJfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2kzMiIpOwogICByZWFkX2k2NF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfaTY0Iik7CiAgIHJlYWRfc3RyaW5nX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9zdHJpbmciKTsKKyAgcmVhZF9iaW5hcnlfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2JpbmFyeSIpOwogICByZWFkX2RvdWJsZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfZG91YmxlIik7CiAgIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9tYXBfYmVnaW4iKTsKICAgcmVhZF9tYXBfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9tYXBfZW5kIik7ICAKQEAgLTE2NCwxMyArMTcwLDE0IEBACiAgIHJlYWRfZmllbGRfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9maWVsZF9lbmQiKTsKICAga2V5c19tZXRob2RfaWQgPSByYl9pbnRlcm4oImtleXMiKTsKICAgZW50cmllc19tZXRob2RfaWQgPSByYl9pbnRlcm4oImVudHJpZXMiKTsKLSAgbmFtZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIm5hbWUiKTsKLSAgc29ydF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInNvcnQiKTsKICAgd3JpdGVfZmllbGRfc3RvcF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2ZpZWxkX3N0b3AiKTsKICAgc2tpcF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInNraXAiKTsKICAgd3JpdGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZSIpOwogICByZWFkX2FsbF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfYWxsIik7Ci0gIG5hdGl2ZV9xbWFya19tZXRob2RfaWQgPSByYl9pbnRlcm4oIm5hdGl2ZT8iKTsKKyAgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfaW50b19idWZmZXIiKTsKKyAgZm9yY2VfYmluYXJ5X2VuY29kaW5nX2lkID0gcmJfaW50ZXJuKCJmb3JjZV9iaW5hcnlfZW5jb2RpbmciKTsKKyAgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkID0gcmJfaW50ZXJuKCJjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIiKTsKKyAgY29udmVydF90b19zdHJpbmdfaWQgPSByYl9pbnRlcm4oImNvbnZlcnRfdG9fc3RyaW5nIik7CiAKICAgLy8gY29uc3RhbnQgaWRzCiAgIGZpZWxkc19jb25zdF9pZCA9IHJiX2ludGVybigiRklFTERTIik7CkBAIC0xODUsOCArMTkyLDggQEAKICAgdmFsdWVfc3ltID0gSUQyU1lNKHJiX2ludGVybigidmFsdWUiKSk7CiAgIGVsZW1lbnRfc3ltID0gSUQyU1lNKHJiX2ludGVybigiZWxlbWVudCIpKTsKICAgY2xhc3Nfc3ltID0gSUQyU1lNKHJiX2ludGVybigiY2xhc3MiKSk7CisgIGJpbmFyeV9zeW0gPSBJRDJTWU0ocmJfaW50ZXJuKCJiaW5hcnkiKSk7CiAKLSAgSW5pdF9wcm90b2NvbCgpOwogICBJbml0X3N0cnVjdCgpOwogICBJbml0X2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZCgpOwogICBJbml0X2NvbXBhY3RfcHJvdG9jb2woKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQucmIKaW5kZXggMDJkNjdiOC4uMGY1ODEyMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQucmIKQEAgLTEsNCArMSw0IEBACi0jIAorIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC02LDI2ICs2LDI4IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCisjCiAjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAorIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAKKyMKICMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KICMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKICMgZGV0YWlscy4KIAogJDoudW5zaGlmdCBGaWxlLmRpcm5hbWUoX19GSUxFX18pCiAKK3JlcXVpcmUgJ3RocmlmdC9ieXRlcycKIHJlcXVpcmUgJ3RocmlmdC9jb3JlX2V4dCcKIHJlcXVpcmUgJ3RocmlmdC9leGNlcHRpb25zJwogcmVxdWlyZSAndGhyaWZ0L3R5cGVzJwogcmVxdWlyZSAndGhyaWZ0L3Byb2Nlc3NvcicKK3JlcXVpcmUgJ3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3InCiByZXF1aXJlICd0aHJpZnQvY2xpZW50JwogcmVxdWlyZSAndGhyaWZ0L3N0cnVjdCcKIHJlcXVpcmUgJ3RocmlmdC91bmlvbicKQEAgLTQwLDEyICs0MiwxNiBAQAogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbCcKIHJlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQnCiByZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbCcKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sJworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sJwogCiAjIHRyYW5zcG9ydAogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQnCityZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3NlcnZlcl9zb2NrZXQnCityZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQnCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9ieXRlcy5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L2J5dGVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDRmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9ieXRlcy5yYgpAQCAtMCwwICsxLDEzMSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK21vZHVsZSBUaHJpZnQKKyAgIyBBIGNvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggYnl0ZXMgYW5kIGJ5dGUgYnVmZmVycy4KKyAgbW9kdWxlIEJ5dGVzCisgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgICAjIENyZWF0ZXMgYW5kIGVtcHR5IGJ5dGUgYnVmZmVyIChTdHJpbmcgd2l0aCBCSU5BUlkgZW5jb2RpbmcpCisgICAgICAjCisgICAgICAjIHNpemUgLSBUaGUgSW50ZWdlciBzaXplIG9mIHRoZSBidWZmZXIgKGRlZmF1bHQ6IG5pbCkgdG8gY3JlYXRlCisgICAgICAjCisgICAgICAjIFJldHVybnMgYSBTdHJpbmcgd2l0aCBCSU5BUlkgZW5jb2RpbmcsIGZpbGxlZCB3aXRoIG51bGwgY2hhcmFjdGVycyAKKyAgICAgICMgaWYgc2l6ZSBpcyBncmVhdGVyIHRoYW4gemVybworICAgICAgZGVmIHNlbGYuZW1wdHlfYnl0ZV9idWZmZXIoc2l6ZSA9IG5pbCkKKyAgICAgICAgaWYgKHNpemUgJiYgc2l6ZSA+IDApCisgICAgICAgICAgIlwwIi5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSAqIHNpemUKKyAgICAgICAgZWxzZQorICAgICAgICAgICcnLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgICMgRm9yY2VzIHRoZSBlbmNvZGluZyBvZiB0aGUgYnVmZmVyIHRvIEJJTkFSWS4gSWYgdGhlIGJ1ZmZlcgorICAgICAgIyBwYXNzZWQgaXMgZnJvemVuLCB0aGVuIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KKyAgICAgICMKKyAgICAgICMgYnVmZmVyIC0gVGhlIFN0cmluZyB0byBmb3JjZSB0aGUgZW5jb2Rpbmcgb2YuCisgICAgICAjCisgICAgICAjIFJldHVybnMgdGhlIFN0cmluZyBwYXNzZWQgd2l0aCBhbiBlbmNvZGluZyBvZiBCSU5BUlk7IHJldHVybmVkCisgICAgICAjIFN0cmluZyBtYXkgYmUgYSBkdXBsaWNhdGUuCisgICAgICBkZWYgc2VsZi5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmZmVyKQorICAgICAgICBidWZmZXIgPSBidWZmZXIuZHVwIGlmIGJ1ZmZlci5mcm96ZW4/CisgICAgICAgIGJ1ZmZlci5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisKKyAgICAgICMgR2V0cyB0aGUgYnl0ZSB2YWx1ZSBvZiBhIGdpdmVuIHBvc2l0aW9uIGluIGEgU3RyaW5nLgorICAgICAgIworICAgICAgIyBzdHJpbmcgLSBUaGUgU3RyaW5nIHRvIHJldHJpdmUgdGhlIGJ5dGUgdmFsdWUgZnJvbS4KKyAgICAgICMgaW5kZXggIC0gVGhlIEludGVnZXIgbG9jYXRpb24gb2YgdGhlIGJ5dGUgdmFsdWUgdG8gcmV0cmlldmUuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYW4gSW50ZWdlciB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS4KKyAgICAgIGRlZiBzZWxmLmdldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4KQorICAgICAgICBzdHJpbmcuZ2V0Ynl0ZShpbmRleCkKKyAgICAgIGVuZAorCisgICAgICAjIFNldHMgdGhlIGJ5dGUgdmFsdWUgZ2l2ZW4gdG8gYSBnaXZlbiBpbmRleCBpbiBhIFN0cmluZy4KKyAgICAgICMKKyAgICAgICMgc3RyaW5nIC0gVGhlIFN0cmluZyB0byBzZXQgdGhlIGJ5dGUgdmFsdWUgaW4uCisgICAgICAjIGluZGV4ICAtIFRoZSBJbnRlZ2VyIGxvY2F0aW9uIHRvIHNldCB0aGUgYnl0ZSB2YWx1ZSBhdC4KKyAgICAgICMgYnl0ZSAgIC0gVGhlIEludGVnZXIgdmFsdWUgKDAgdG8gMjU1KSB0byBzZXQgaW4gdGhlIHN0cmluZy4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhbiBJbnRlZ2VyIHZhbHVlIG9mIHRoZSBieXRlIHZhbHVlIHRvIHNldC4KKyAgICAgIGRlZiBzZWxmLnNldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4LCBieXRlKQorICAgICAgICBzdHJpbmcuc2V0Ynl0ZShpbmRleCwgYnl0ZSkKKyAgICAgIGVuZAorCisgICAgICAjIENvbnZlcnRzIHRoZSBnaXZlbiBTdHJpbmcgdG8gYSBVVEYtOCBieXRlIGJ1ZmZlci4KKyAgICAgICMKKyAgICAgICMgc3RyaW5nIC0gVGhlIFN0cmluZyB0byBjb252ZXJ0LgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgbmV3IFN0cmluZyB3aXRoIEJJTkFSWSBlbmNvZGluZywgY29udGFpbmluZyB0aGUgVVRGLTgKKyAgICAgICMgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHN0cmluZy4KKyAgICAgIGRlZiBzZWxmLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHJpbmcpCisgICAgICAgIGlmIHN0cmluZy5lbmNvZGluZyAhPSBFbmNvZGluZzo6VVRGXzgKKyAgICAgICAgICAjIHRyYW5zY29kZSB0byBVVEYtOAorICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5lbmNvZGUoRW5jb2Rpbmc6OlVURl84KQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBlbmNvZGluZyBpcyBhbHJlYWR5IFVURi04LCBidXQgYSBkdXBsaWNhdGUgaXMgbmVlZGVkCisgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLmR1cAorICAgICAgICBlbmQKKyAgICAgICAgc3RyaW5nLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgIyBDb252ZXJ0cyB0aGUgZ2l2ZW4gVVRGLTggYnl0ZSBidWZmZXIgaW50byBhIFN0cmluZworICAgICAgIworICAgICAgIyB1dGY4X2J1ZmZlciAtIEEgU3RyaW5nLCB3aXRoIEJJTkFSWSBlbmNvZGluZywgY29udGFpbmluZyBVVEYtOCBieXRlcworICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgbmV3IFN0cmluZyB3aXRoIFVURi04IGVuY29kaW5nLAorICAgICAgZGVmIHNlbGYuY29udmVydF90b19zdHJpbmcodXRmOF9idWZmZXIpCisgICAgICAgICMgZHVwbGljYXRlIHRoZSBidWZmZXIsIGZvcmNlIGVuY29kaW5nIHRvIFVURi04CisgICAgICAgIHV0ZjhfYnVmZmVyLmR1cC5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBkZWYgc2VsZi5lbXB0eV9ieXRlX2J1ZmZlcihzaXplID0gbmlsKQorICAgICAgICBpZiAoc2l6ZSAmJiBzaXplID4gMCkKKyAgICAgICAgICAiXDAiICogc2l6ZQorICAgICAgICBlbHNlCisgICAgICAgICAgJycKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCisgICAgICAgIHN0cmluZ1tpbmRleF0KKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCwgYnl0ZSkKKyAgICAgICAgc3RyaW5nW2luZGV4XSA9IGJ5dGUKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyaW5nKQorICAgICAgICAjIFRoaXMgYXNzdW1lcyAkS0NPREUgaXMgJ1VURjgnLydVJywgd2hpY2ggd291bGQgbWVhbiB0aGUgU3RyaW5nIGlzIGFscmVhZHkgYSBVVEYtOCBieXRlIGJ1ZmZlcgorICAgICAgICAjIFRPRE8gY29uc2lkZXIgaGFuZGxpbmcgb3RoZXIgJEtDT0RFIHZhbHVlcyBhbmQgdHJhbnNjb2Rpbmcgd2l0aCBpY29udgorICAgICAgICBzdHJpbmcKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5jb252ZXJ0X3RvX3N0cmluZyh1dGY4X2J1ZmZlcikKKyAgICAgICAgIyBTZWUgY29tbWVudCBpbiAnY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyJyBmb3IgcmVsZXZhbnQgYXNzdW1wdGlvbnMuCisgICAgICAgIHV0ZjhfYnVmZmVyCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYgppbmRleCA1YjMwZjAxLi42NGVmMDU5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvY2xpZW50LnJiCkBAIC0xLDQgKzEsNCBAQAotIyAKKyMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtNiwxNiArNiwxNiBAQAogIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAorIwogIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKKyMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSMgCisjCiAKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIENsaWVudApAQCAtMjcsNiArMjcsMTUgQEAKIAogICAgIGRlZiBzZW5kX21lc3NhZ2UobmFtZSwgYXJnc19jbGFzcywgYXJncyA9IHt9KQogICAgICAgQG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpDQUxMLCBAc2VxaWQpCisgICAgICBzZW5kX21lc3NhZ2VfYXJncyhhcmdzX2NsYXNzLCBhcmdzKQorICAgIGVuZAorCisgICAgZGVmIHNlbmRfb25ld2F5X21lc3NhZ2UobmFtZSwgYXJnc19jbGFzcywgYXJncyA9IHt9KQorICAgICAgQG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpPTkVXQVksIEBzZXFpZCkKKyAgICAgIHNlbmRfbWVzc2FnZV9hcmdzKGFyZ3NfY2xhc3MsIGFyZ3MpCisgICAgZW5kCisKKyAgICBkZWYgc2VuZF9tZXNzYWdlX2FyZ3MoYXJnc19jbGFzcywgYXJncykKICAgICAgIGRhdGEgPSBhcmdzX2NsYXNzLm5ldwogICAgICAgYXJncy5lYWNoIGRvIHxrLCB2fAogICAgICAgICBkYXRhLnNlbmQoIiN7ay50b19zfT0iLCB2KQpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKaW5kZXggZGRhNzA4OS4uNjhjYjllMCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9leGNlcHRpb25zLnJiCkBAIC0zNSw2ICszNSwxMSBAQAogICAgIFdST05HX01FVEhPRF9OQU1FID0gMwogICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQKICAgICBNSVNTSU5HX1JFU1VMVCA9IDUKKyAgICBJTlRFUk5BTF9FUlJPUiA9IDYKKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgKKyAgICBJTlZBTElEX1BST1RPQ09MID0gOQorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKIAogICAgIGF0dHJfcmVhZGVyIDp0eXBlCiAKQEAgLTc5LDQgKzg0LDQgQEAKICAgICBlbmQKIAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzRjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIKQEAgLTAsMCArMSw3NiBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3InCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBNdWx0aXBsZXhlZFByb2Nlc3NvcgorICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnMgPSB7fQorICAgIGVuZAorIAorICAgIGRlZiByZWdpc3Rlcl9wcm9jZXNzb3Ioc2VydmljZV9uYW1lLCBwcm9jZXNzb3IpCisgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnNbc2VydmljZV9uYW1lXSA9IHByb2Nlc3NvcgorICAgIGVuZAorIAorICAgIGRlZiBwcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgIG5hbWUsIHR5cGUsIHNlcWlkID0gaXByb3QucmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBjaGVja190eXBlKHR5cGUpCisgICAgICBjaGVja19zZXBhcmF0b3IobmFtZSkKKyAgICAgIHNlcnZpY2VfbmFtZSwgbWV0aG9kID0gbmFtZS5zcGxpdCgnOicpCisgICAgICBwcm9jZXNzb3Ioc2VydmljZV9uYW1lKS5wcm9jZXNzKFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5uZXcoaXByb3QsIFttZXRob2QsIHR5cGUsIHNlcWlkXSksIG9wcm90KQorICAgIGVuZAorCisgICAgcHJvdGVjdGVkCisKKyAgICBkZWYgcHJvY2Vzc29yKHNlcnZpY2VfbmFtZSkKKyAgICAgIGlmIEBhY3R1YWxfcHJvY2Vzc29ycy5oYXNfa2V5PyhzZXJ2aWNlX25hbWUpCisgICAgICAgIEBhY3R1YWxfcHJvY2Vzc29yc1tzZXJ2aWNlX25hbWVdCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogI3tzZXJ2aWNlX25hbWV9LiBEaWQgeW91IGZvcmdldCB0byBjYWxsICN7c2VsZi5jbGFzcy5uYW1lfSNyZWdpc3Rlcl9wcm9jZXNzb3I/IikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX3R5cGUodHlwZSkKKyAgICAgIHVubGVzcyBbTWVzc2FnZVR5cGVzOjpDQUxMLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWV0uaW5jbHVkZT8odHlwZSkKKyAgICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCdUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/JykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGNoZWNrX3NlcGFyYXRvcihuYW1lKQorICAgICAgaWYgbmFtZS5jb3VudCgnOicpIDwgMQorICAgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAje25hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUaHJpZnQ6OlByb3RvY29sOjpNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBpbmNsdWRlIFByb3RvY29sRGVjb3JhdG9yCisgICAgCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wsIG1lc3NhZ2VfYmVnaW4pCisgICAgICBzdXBlcihwcm90b2NvbCkKKyAgICAgIEBtZXNzYWdlX2JlZ2luID0gbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgQG1lc3NhZ2VfYmVnaW4KKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgppbmRleCA1ZDllMGExLi5jZTIxZTEyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCkBAIC0xNywyNSArMTcsMzYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCityZXF1aXJlICdsb2dnZXInCisKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFByb2Nlc3NvcgotICAgIGRlZiBpbml0aWFsaXplKGhhbmRsZXIpCisgICAgZGVmIGluaXRpYWxpemUoaGFuZGxlciwgbG9nZ2VyPW5pbCkKICAgICAgIEBoYW5kbGVyID0gaGFuZGxlcgorICAgICAgaWYgbG9nZ2VyLm5pbD8KKyAgICAgICAgQGxvZ2dlciA9IExvZ2dlci5uZXcoU1RERVJSKQorICAgICAgICBAbG9nZ2VyLmxldmVsID0gTG9nZ2VyOjpXQVJOCisgICAgICBlbHNlCisgICAgICAgIEBsb2dnZXIgPSBsb2dnZXIKKyAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgbmFtZSwgdHlwZSwgc2VxaWQgID0gaXByb3QucmVhZF9tZXNzYWdlX2JlZ2luCiAgICAgICBpZiByZXNwb25kX3RvPygicHJvY2Vzc18je25hbWV9IikKLSAgICAgICAgc2VuZCgicHJvY2Vzc18je25hbWV9Iiwgc2VxaWQsIGlwcm90LCBvcHJvdCkKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBzZW5kKCJwcm9jZXNzXyN7bmFtZX0iLCBzZXFpZCwgaXByb3QsIG9wcm90KQorICAgICAgICByZXNjdWUgPT4gZQorICAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgICAgICAgIEBsb2dnZXIuZGVidWcgIkludGVybmFsIGVycm9yIDogI3tlLm1lc3NhZ2V9XG4je2UuYmFja3RyYWNlLmpvaW4oIlxuIil9IgorICAgICAgICAgIHdyaXRlX2Vycm9yKHgsIG9wcm90LCBuYW1lLCBzZXFpZCkKKyAgICAgICAgZW5kCiAgICAgICAgIHRydWUKICAgICAgIGVsc2UKICAgICAgICAgaXByb3Quc2tpcChUeXBlczo6U1RSVUNUKQogICAgICAgICBpcHJvdC5yZWFkX21lc3NhZ2VfZW5kCiAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAnVW5rbm93biBmdW5jdGlvbiAnK25hbWUpCi0gICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQotICAgICAgICB4LndyaXRlKG9wcm90KQotICAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAotICAgICAgICBvcHJvdC50cmFucy5mbHVzaAorICAgICAgICB3cml0ZV9lcnJvcih4LCBvcHJvdCwgbmFtZSwgc2VxaWQpCiAgICAgICAgIGZhbHNlCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTUzLDUgKzY0LDEyIEBACiAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAogICAgICAgb3Byb3QudHJhbnMuZmx1c2gKICAgICBlbmQKKworICAgIGRlZiB3cml0ZV9lcnJvcihlcnIsIG9wcm90LCBuYW1lLCBzZXFpZCkKKyAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIHNlcWlkKQorICAgICAgZXJyLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIG9wcm90LnRyYW5zLmZsdXNoCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgppbmRleCBiMTk5MDlkLi41YzY5M2U5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKQEAgLTI4LDYgKzI4LDggQEAKICAgICBORUdBVElWRV9TSVpFID0gMgogICAgIFNJWkVfTElNSVQgPSAzCiAgICAgQkFEX1ZFUlNJT04gPSA0CisgICAgTk9UX0lNUExFTUVOVEVEID0gNQorICAgIERFUFRIX0xJTUlUID0gNgogCiAgICAgYXR0cl9yZWFkZXIgOnR5cGUKIApAQCAtMTE0LDEwICsxMTYsMjcgQEAKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAorICAgICMgV3JpdGVzIGEgVGhyaWZ0IFN0cmluZy4gSW4gUnVieSAxLjkrLCB0aGUgU3RyaW5nIHBhc3NlZCB3aWxsIGJlIHRyYW5zY29kZWQgdG8gVVRGLTguCisgICAgIworICAgICMgc3RyIC0gVGhlIFN0cmluZyB0byB3cml0ZS4KKyAgICAjCisgICAgIyBSYWlzZXMgRW5jb2RpbmdFcnJvciBpZiB0aGUgdHJhbnNjb2RpbmcgdG8gVVRGLTggZmFpbHMuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgogICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogCisgICAgIyBXcml0ZXMgYSBUaHJpZnQgQmluYXJ5IChUaHJpZnQgU3RyaW5nIHdpdGggbm8gZW5jb2RpbmcpLiBJbiBSdWJ5IDEuOSssIHRoZSBTdHJpbmcgcGFzc2VkCisgICAgIyB3aWxsIGZvcmNlZCBpbnRvIEJJTkFSWSBlbmNvZGluZy4KKyAgICAjCisgICAgIyBidWYgLSBUaGUgU3RyaW5nIHRvIHdyaXRlLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKwogICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKQEAgLTE3OCwxOCArMTk3LDY3IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFJlYWRzIGEgVGhyaWZ0IFN0cmluZy4gSW4gUnVieSAxLjkrLCBhbGwgU3RyaW5ncyB3aWxsIGJlIHJldHVybmVkIHdpdGggYW4gRW5jb2Rpbmcgb2YgVVRGLTguCisgICAgIworICAgICMgUmV0dXJucyBhIFN0cmluZy4KICAgICBkZWYgcmVhZF9zdHJpbmcKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAotICAgIGRlZiB3cml0ZV9maWVsZChuYW1lLCB0eXBlLCBmaWQsIHZhbHVlKQotICAgICAgd3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgZmlkKQotICAgICAgd3JpdGVfdHlwZSh0eXBlLCB2YWx1ZSkKKyAgICAjIFJlYWRzIGEgVGhyaWZ0IEJpbmFyeSAoVGhyaWZ0IFN0cmluZyB3aXRob3V0IGVuY29kaW5nKS4gSW4gUnVieSAxLjkrLCBhbGwgU3RyaW5ncyB3aWxsIGJlIHJldHVybmVkCisgICAgIyB3aXRoIGFuIEVuY29kaW5nIG9mIEJJTkFSWS4KKyAgICAjCisgICAgIyBSZXR1cm5zIGEgU3RyaW5nLgorICAgIGRlZiByZWFkX2JpbmFyeQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCisgICAgIyBXcml0ZXMgYSBmaWVsZCBiYXNlZCBvbiB0aGUgZmllbGQgaW5mb3JtYXRpb24sIGZpZWxkIElEIGFuZCB2YWx1ZS4KKyAgICAjCisgICAgIyBmaWVsZF9pbmZvIC0gQSBIYXNoIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZpZWxkOgorICAgICMgICAgICAgICAgICAgIDpuYW1lICAgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQuCisgICAgIyAgICAgICAgICAgICAgOnR5cGUgICAtIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCwgd2hpY2ggbXVzdCBiZSBhIFRocmlmdDo6VHlwZXMgY29uc3RhbnQuCisgICAgIyAgICAgICAgICAgICAgOmJpbmFyeSAtIEEgQm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIFRocmlmdDo6VHlwZXM6OlNUUklORyBpcyBhIGJpbmFyeSBzdHJpbmcgKHN0cmluZyB3aXRob3V0IGVuY29kaW5nKS4KKyAgICAjIGZpZCAgICAgICAgLSBUaGUgSUQgb2YgdGhlIGZpZWxkLgorICAgICMgdmFsdWUgICAgICAtIFRoZSBmaWVsZCdzIHZhbHVlIHRvIHdyaXRlOyBvYmplY3QgdHlwZSB2YXJpZXMgYmFzZWQgb24gOnR5cGUuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiB3cml0ZV9maWVsZCgqYXJncykKKyAgICAgIGlmIGFyZ3Muc2l6ZSA9PSAzCisgICAgICAgICMgaGFuZGxlcyB0aGUgZG9jdW1lbnRlZCBtZXRob2Qgc2lnbmF0dXJlIC0gd3JpdGVfZmllbGQoZmllbGRfaW5mbywgZmlkLCB2YWx1ZSkKKyAgICAgICAgZmllbGRfaW5mbyA9IGFyZ3NbMF0KKyAgICAgICAgZmlkID0gYXJnc1sxXQorICAgICAgICB2YWx1ZSA9IGFyZ3NbMl0KKyAgICAgIGVsc2lmIGFyZ3Muc2l6ZSA9PSA0CisgICAgICAgICMgaGFuZGxlcyB0aGUgZGVwcmVjYXRlZCBtZXRob2Qgc2lnbmF0dXJlIC0gd3JpdGVfZmllbGQobmFtZSwgdHlwZSwgZmlkLCB2YWx1ZSkKKyAgICAgICAgZmllbGRfaW5mbyA9IHs6bmFtZSA9PiBhcmdzWzBdLCA6dHlwZSA9PiBhcmdzWzFdfQorICAgICAgICBmaWQgPSBhcmdzWzJdCisgICAgICAgIHZhbHVlID0gYXJnc1szXQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3thcmdzLnNpemV9IGZvciAzKSIKKyAgICAgIGVuZAorCisgICAgICB3cml0ZV9maWVsZF9iZWdpbihmaWVsZF9pbmZvWzpuYW1lXSwgZmllbGRfaW5mb1s6dHlwZV0sIGZpZCkKKyAgICAgIHdyaXRlX3R5cGUoZmllbGRfaW5mbywgdmFsdWUpCiAgICAgICB3cml0ZV9maWVsZF9lbmQKICAgICBlbmQKIAotICAgIGRlZiB3cml0ZV90eXBlKHR5cGUsIHZhbHVlKQotICAgICAgY2FzZSB0eXBlCisgICAgIyBXcml0ZXMgYSBmaWVsZCB2YWx1ZSBiYXNlZCBvbiB0aGUgZmllbGQgaW5mb3JtYXRpb24uCisgICAgIworICAgICMgZmllbGRfaW5mbyAtIEEgSGFzaCBjb250YWluaW5nIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmaWVsZDoKKyAgICAjICAgICAgICAgICAgICA6dHlwZSAgIC0gVGhlIFRocmlmdDo6VHlwZXMgY29uc3RhbnQgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgdmFsdWUgaXMgd3JpdHRlbi4KKyAgICAjICAgICAgICAgICAgICA6YmluYXJ5IC0gQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgVGhyaWZ0OjpUeXBlczo6U1RSSU5HIGlzIGEgYmluYXJ5IHN0cmluZyAoc3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLgorICAgICMgdmFsdWUgICAgICAtIFRoZSBmaWVsZCdzIHZhbHVlIHRvIHdyaXRlOyBvYmplY3QgdHlwZSB2YXJpZXMgYmFzZWQgb24gZmllbGRfaW5mb1s6dHlwZV0uCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiB3cml0ZV90eXBlKGZpZWxkX2luZm8sIHZhbHVlKQorICAgICAgIyBpZiBmaWVsZF9pbmZvIGlzIGEgRml4bnVtLCBhc3N1bWUgaXQgaXMgYSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50CisgICAgICAjIGNvbnZlcnQgaXQgaW50byBhIGZpZWxkX2luZm8gSGFzaCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgIGlmIGZpZWxkX2luZm8uaXNfYT8gRml4bnVtCisgICAgICAgIGZpZWxkX2luZm8gPSB7OnR5cGUgPT4gZmllbGRfaW5mb30KKyAgICAgIGVuZAorCisgICAgICBjYXNlIGZpZWxkX2luZm9bOnR5cGVdCiAgICAgICB3aGVuIFR5cGVzOjpCT09MCiAgICAgICAgIHdyaXRlX2Jvb2wodmFsdWUpCiAgICAgICB3aGVuIFR5cGVzOjpCWVRFCkBAIC0yMDMsNyArMjcxLDExIEBACiAgICAgICB3aGVuIFR5cGVzOjpJNjQKICAgICAgICAgd3JpdGVfaTY0KHZhbHVlKQogICAgICAgd2hlbiBUeXBlczo6U1RSSU5HCi0gICAgICAgIHdyaXRlX3N0cmluZyh2YWx1ZSkKKyAgICAgICAgaWYgZmllbGRfaW5mb1s6YmluYXJ5XQorICAgICAgICAgIHdyaXRlX2JpbmFyeSh2YWx1ZSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlX3N0cmluZyh2YWx1ZSkKKyAgICAgICAgZW5kCiAgICAgICB3aGVuIFR5cGVzOjpTVFJVQ1QKICAgICAgICAgdmFsdWUud3JpdGUoc2VsZikKICAgICAgIGVsc2UKQEAgLTIxMSw4ICsyODMsMjEgQEAKICAgICAgIGVuZAogICAgIGVuZAogCi0gICAgZGVmIHJlYWRfdHlwZSh0eXBlKQotICAgICAgY2FzZSB0eXBlCisgICAgIyBSZWFkcyBhIGZpZWxkIHZhbHVlIGJhc2VkIG9uIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyBmaWVsZF9pbmZvIC0gQSBIYXNoIGNvbnRhaW5pbmcgdGhlIHBlcnRpbmVudCBkYXRhIHRvIHdyaXRlOgorICAgICMgICAgICAgICAgICAgIDp0eXBlICAgLSBUaGUgVGhyaWZ0OjpUeXBlcyBjb25zdGFudCB0aGF0IGRldGVybWluZXMgaG93IHRoZSB2YWx1ZSBpcyB3cml0dGVuLgorICAgICMgICAgICAgICAgICAgIDpiaW5hcnkgLSBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgVGhyaWZ0OjpUeXBlczo6U1RSSU5HIGlzIGEgYmluYXJ5IHN0cmluZyAoc3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIHZhbHVlIHJlYWQ7IG9iamVjdCB0eXBlIHZhcmllcyBiYXNlZCBvbiBmaWVsZF9pbmZvWzp0eXBlXS4KKyAgICBkZWYgcmVhZF90eXBlKGZpZWxkX2luZm8pCisgICAgICAjIGlmIGZpZWxkX2luZm8gaXMgYSBGaXhudW0sIGFzc3VtZSBpdCBpcyBhIFRocmlmdDo6VHlwZXMgY29uc3RhbnQKKyAgICAgICMgY29udmVydCBpdCBpbnRvIGEgZmllbGRfaW5mbyBIYXNoIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgaWYgZmllbGRfaW5mby5pc19hPyBGaXhudW0KKyAgICAgICAgZmllbGRfaW5mbyA9IHs6dHlwZSA9PiBmaWVsZF9pbmZvfQorICAgICAgZW5kCisKKyAgICAgIGNhc2UgZmllbGRfaW5mb1s6dHlwZV0KICAgICAgIHdoZW4gVHlwZXM6OkJPT0wKICAgICAgICAgcmVhZF9ib29sCiAgICAgICB3aGVuIFR5cGVzOjpCWVRFCkBAIC0yMjYsNyArMzExLDExIEBACiAgICAgICB3aGVuIFR5cGVzOjpJNjQKICAgICAgICAgcmVhZF9pNjQKICAgICAgIHdoZW4gVHlwZXM6OlNUUklORwotICAgICAgICByZWFkX3N0cmluZworICAgICAgICBpZiBmaWVsZF9pbmZvWzpiaW5hcnldCisgICAgICAgICAgcmVhZF9iaW5hcnkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlYWRfc3RyaW5nCisgICAgICAgIGVuZAogICAgICAgZWxzZQogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICBlbmQKQEAgLTI4MCwxMSArMzY5LDE5IEBACiAgICAgICAgIHJlYWRfbGlzdF9lbmQKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiI3t0cmFucy50b19zfSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCmluZGV4IDA0ZDE0OWEuLmQ4Mjc5ZGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKQEAgLTI5LDYgKzI5LDEwIEBACiAgICAgICBzdXBlcih0cmFucykKICAgICAgIEBzdHJpY3RfcmVhZCA9IHN0cmljdF9yZWFkCiAgICAgICBAc3RyaWN0X3dyaXRlID0gc3RyaWN0X3dyaXRlCisKKyAgICAgICMgUHJlLWFsbG9jYXRlZCByZWFkIGJ1ZmZlciBmb3IgZml4ZWQtc2l6ZSByZWFkIG1ldGhvZHMuIE5lZWRzIHRvIGJlIGF0IGxlYXN0IDggYnl0ZXMgbG9uZyBmb3IKKyAgICAgICMgcmVhZF9pNjQoKSBhbmQgcmVhZF9kb3VibGUoKS4KKyAgICAgIEByYnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIoOCkKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQpAQCAtMTAzLDggKzEwNywxMyBAQAogICAgIGVuZAogCiAgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCi0gICAgICB3cml0ZV9pMzIoc3RyLmxlbmd0aCkKLSAgICAgIHRyYW5zLndyaXRlKHN0cikKKyAgICAgIGJ1ZiA9IEJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpCisgICAgICB3cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2JpbmFyeShidWYpCisgICAgICB3cml0ZV9pMzIoYnVmLmJ5dGVzaXplKQorICAgICAgdHJhbnMud3JpdGUoYnVmKQogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgpAQCAtMTY1LDggKzE3NCw3IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9ieXRlCi0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCgxKQotICAgICAgdmFsID0gZGF0WzBdLm9yZAorICAgICAgdmFsID0gdHJhbnMucmVhZF9ieXRlCiAgICAgICBpZiAodmFsID4gMHg3ZikKICAgICAgICAgdmFsID0gMCAtICgodmFsIC0gMSkgXiAweGZmKQogICAgICAgZW5kCkBAIC0xNzQsOCArMTgyLDggQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2kxNgotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoMikKLSAgICAgIHZhbCwgPSBkYXQudW5wYWNrKCduJykKKyAgICAgIHRyYW5zLnJlYWRfaW50b19idWZmZXIoQHJidWYsIDIpCisgICAgICB2YWwsID0gQHJidWYudW5wYWNrKCduJykKICAgICAgIGlmICh2YWwgPiAweDdmZmYpCiAgICAgICAgIHZhbCA9IDAgLSAoKHZhbCAtIDEpIF4gMHhmZmZmKQogICAgICAgZW5kCkBAIC0xODMsOCArMTkxLDggQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2kzMgotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoNCkKLSAgICAgIHZhbCwgPSBkYXQudW5wYWNrKCdOJykKKyAgICAgIHRyYW5zLnJlYWRfaW50b19idWZmZXIoQHJidWYsIDQpCisgICAgICB2YWwsID0gQHJidWYudW5wYWNrKCdOJykKICAgICAgIGlmICh2YWwgPiAweDdmZmZmZmZmKQogICAgICAgICB2YWwgPSAwIC0gKCh2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpCiAgICAgICBlbmQKQEAgLTE5Miw4ICsyMDAsOCBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfaTY0Ci0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCg4KQotICAgICAgaGksIGxvID0gZGF0LnVucGFjaygnTjInKQorICAgICAgdHJhbnMucmVhZF9pbnRvX2J1ZmZlcihAcmJ1ZiwgOCkKKyAgICAgIGhpLCBsbyA9IEByYnVmLnVucGFjaygnTjInKQogICAgICAgaWYgKGhpID4gMHg3ZmZmZmZmZikKICAgICAgICAgaGkgXj0gMHhmZmZmZmZmZgogICAgICAgICBsbyBePSAweGZmZmZmZmZmCkBAIC0yMDQsMjIgKzIxMiwzMyBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfZG91YmxlCi0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCg4KQotICAgICAgdmFsID0gZGF0LnVucGFjaygnRycpLmZpcnN0CisgICAgICB0cmFucy5yZWFkX2ludG9fYnVmZmVyKEByYnVmLCA4KQorICAgICAgdmFsID0gQHJidWYudW5wYWNrKCdHJykuZmlyc3QKICAgICAgIHZhbAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfc3RyaW5nCi0gICAgICBzeiA9IHJlYWRfaTMyCi0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbChzeikKLSAgICAgIGRhdAorICAgICAgYnVmZmVyID0gcmVhZF9iaW5hcnkKKyAgICAgIEJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nKGJ1ZmZlcikKICAgICBlbmQKIAorICAgIGRlZiByZWFkX2JpbmFyeQorICAgICAgc2l6ZSA9IHJlYWRfaTMyCisgICAgICB0cmFucy5yZWFkX2FsbChzaXplKQorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmluYXJ5KCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCaW5hcnlQcm90b2NvbEZhY3RvcnkgPCBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgppbmRleCA3MGVhNjUyLi4wOWIwMjY0IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCkBAIC0zNSw1ICszNSwxMyBAQAogICAgICAgICBCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICBpZiAoZGVmaW5lZD8gQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgICAgImJpbmFyeS1hY2NlbCIKKyAgICAgIGVsc2UKKyAgICAgICAgImJpbmFyeSIKKyAgICAgIGVuZAorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKaW5kZXggM2JlMmE5MC4uMWY5YmQzMCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCkBAIC0yNCw2ICsyNCw3IEBACiAgICAgVkVSU0lPTiA9IDEKICAgICBWRVJTSU9OX01BU0sgPSAweDFmCiAgICAgVFlQRV9NQVNLID0gMHhFMAorICAgIFRZUEVfQklUUyA9IDB4MDcKICAgICBUWVBFX1NISUZUX0FNT1VOVCA9IDUKIAogICAgIFRTVE9QID0gWyIiLCBUeXBlczo6U1RPUCwgMF0KQEAgLTk4LDYgKzk5LDkgQEAKIAogICAgICAgQGxhc3RfZmllbGQgPSBbMF0KICAgICAgIEBib29sZWFuX3ZhbHVlID0gbmlsCisKKyAgICAgICMgUHJlLWFsbG9jYXRlZCByZWFkIGJ1ZmZlciBmb3IgcmVhZF9kb3VibGUoKS4KKyAgICAgIEByYnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIoOCkKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQpAQCAtMjA3LDggKzIxMSwxMyBAQAogICAgIGVuZAogCiAgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCi0gICAgICB3cml0ZV92YXJpbnQzMihzdHIubGVuZ3RoKQotICAgICAgQHRyYW5zLndyaXRlKHN0cikKKyAgICAgIGJ1ZiA9IEJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpCisgICAgICB3cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2JpbmFyeShidWYpCisgICAgICB3cml0ZV92YXJpbnQzMihidWYuYnl0ZXNpemUpCisgICAgICBAdHJhbnMud3JpdGUoYnVmKQogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgpAQCAtMjIzLDcgKzIzMiw3IEBACiAgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldygiRXhwZWN0ZWQgdmVyc2lvbiAje1ZFUlNJT059IGJ1dCBnb3QgI3t2ZXJzaW9ufSIpOwogICAgICAgZW5kCiAgICAgICAKLSAgICAgIHR5cGUgPSAodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiAweDAzCisgICAgICB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTCiAgICAgICBzZXFpZCA9IHJlYWRfdmFyaW50MzIoKQogICAgICAgbWVzc2FnZU5hbWUgPSByZWFkX3N0cmluZygpCiAgICAgICBbbWVzc2FnZU5hbWUsIHR5cGUsIHNlcWlkXQpAQCAtMzAyLDggKzMxMSw3IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9ieXRlCi0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCgxKQotICAgICAgdmFsID0gZGF0WzBdCisgICAgICB2YWwgPSB0cmFucy5yZWFkX2J5dGUKICAgICAgIGlmICh2YWwgPiAweDdmKQogICAgICAgICB2YWwgPSAwIC0gKCh2YWwgLSAxKSBeIDB4ZmYpCiAgICAgICBlbmQKQEAgLTMyMywxNyArMzMxLDI1IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9kb3VibGUKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDgpCi0gICAgICB2YWwgPSBkYXQucmV2ZXJzZS51bnBhY2soJ0cnKS5maXJzdAorICAgICAgdHJhbnMucmVhZF9pbnRvX2J1ZmZlcihAcmJ1ZiwgOCkKKyAgICAgIHZhbCA9IEByYnVmLnJldmVyc2UudW5wYWNrKCdHJykuZmlyc3QKICAgICAgIHZhbAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfc3RyaW5nCisgICAgICBidWZmZXIgPSByZWFkX2JpbmFyeQorICAgICAgQnl0ZXMuY29udmVydF90b19zdHJpbmcoYnVmZmVyKQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYmluYXJ5CiAgICAgICBzaXplID0gcmVhZF92YXJpbnQzMigpCiAgICAgICB0cmFucy5yZWFkX2FsbChzaXplKQogICAgIGVuZAogICAgIAotICAgIAorICAgIGRlZiB0b19zCisgICAgICAiY29tcGFjdCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKwogICAgIHByaXZhdGUKICAgICAKICAgICAjIApAQCAtNDE5LDUgKzQzNSw5IEBACiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIENvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJjb21wYWN0IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNzRlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKQEAgLTAsMCArMSw3ODYgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMgCisKK3JlcXVpcmUgJ2Jhc2U2NCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBMb29rYWhlYWRSZWFkZXIKKyAgICBkZWYgaW5pdGlhbGl6ZSh0cmFucykKKyAgICAgIEB0cmFucyA9IHRyYW5zCisgICAgICBAaGFzRGF0YSA9IGZhbHNlCisgICAgICBAZGF0YSA9IG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWQKKyAgICAgIGlmIEBoYXNEYXRhCisgICAgICAgIEBoYXNEYXRhID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgQGRhdGEgPSBAdHJhbnMucmVhZCgxKQorICAgICAgZW5kCisKKyAgICAgIHJldHVybiBAZGF0YQorICAgIGVuZAorCisgICAgZGVmIHBlZWsKKyAgICAgIGlmICFAaGFzRGF0YQorICAgICAgICBAZGF0YSA9IEB0cmFucy5yZWFkKDEpCisgICAgICBlbmQKKyAgICAgIEBoYXNEYXRhID0gdHJ1ZQorICAgICAgcmV0dXJuIEBkYXRhCisgICAgZW5kCisgIGVuZAorCisgICMKKyAgIyBDbGFzcyB0byBzZXJ2ZSBhcyBiYXNlIEpTT04gY29udGV4dCBhbmQgYXMgYmFzZSBjbGFzcyBmb3Igb3RoZXIgY29udGV4dAorICAjIGltcGxlbWVudGF0aW9ucworICAjCisgIGNsYXNzIEpTT05Db250ZXh0CisgICAgQEBrSlNPTkVsZW1TZXBhcmF0b3IgPSAnLCcKKyAgICAjCisgICAgIyBXcml0ZSBjb250ZXh0IGRhdGEgdG8gdGhlIHRyYW5zLiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAgIworICAgIGRlZiB3cml0ZSh0cmFucykKKyAgICBlbmQKKworICAgICMKKyAgICAjIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zLiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAgIworICAgIGRlZiByZWFkKHJlYWRlcikKKyAgICBlbmQKKworICAgICMKKyAgICAjIFJldHVybiB0cnVlIGlmIG51bWJlcnMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHN0cmluZ3MgaW4gdGhpcyBjb250ZXh0LgorICAgICMgRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCisgICAgIworICAgIGRlZiBlc2NhcGVOdW0KKyAgICAgIHJldHVybiBmYWxzZQorICAgIGVuZAorICBlbmQKKworICAjIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCisgIGNsYXNzIEpTT05QYWlyQ29udGV4dCA8IEpTT05Db250ZXh0CisgICAgQEBrSlNPTlBhaXJTZXBhcmF0b3IgPSAnOicKKworICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAZmlyc3QgPSB0cnVlCisgICAgICBAY29sb24gPSB0cnVlCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGUodHJhbnMpCisgICAgICBpZiAoQGZpcnN0KQorICAgICAgICBAZmlyc3QgPSBmYWxzZQorICAgICAgICBAY29sb24gPSB0cnVlCisgICAgICBlbHNlCisgICAgICAgIHRyYW5zLndyaXRlKEBjb2xvbiA/IEBAa0pTT05QYWlyU2VwYXJhdG9yIDogQEBrSlNPTkVsZW1TZXBhcmF0b3IpCisgICAgICAgIEBjb2xvbiA9ICFAY29sb24KKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWQocmVhZGVyKQorICAgICAgaWYgKEBmaXJzdCkKKyAgICAgICAgQGZpcnN0ID0gZmFsc2UKKyAgICAgICAgQGNvbG9uID0gdHJ1ZQorICAgICAgZWxzZQorICAgICAgICBjaCA9IChAY29sb24gPyBAQGtKU09OUGFpclNlcGFyYXRvciA6IEBAa0pTT05FbGVtU2VwYXJhdG9yKQorICAgICAgICBAY29sb24gPSAhQGNvbG9uCisgICAgICAgIEpzb25Qcm90b2NvbDo6cmVhZF9zeW50YXhfY2hhcihyZWFkZXIsIGNoKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIE51bWJlcnMgbXVzdCBiZSB0dXJuZWQgaW50byBzdHJpbmdzIGlmIHRoZXkgYXJlIHRoZSBrZXkgcGFydCBvZiBhIHBhaXIKKyAgICBkZWYgZXNjYXBlTnVtCisgICAgICByZXR1cm4gQGNvbG9uCisgICAgZW5kCisgIGVuZAorCisgICMgQ29udGV4dCBjbGFzcyBmb3IgbGlzdHMKKyAgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDwgSlNPTkNvbnRleHQKKworICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAZmlyc3QgPSB0cnVlCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGUodHJhbnMpCisgICAgICBpZiAoQGZpcnN0KQorICAgICAgICBAZmlyc3QgPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICB0cmFucy53cml0ZShAQGtKU09ORWxlbVNlcGFyYXRvcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWQocmVhZGVyKQorICAgICAgaWYgKEBmaXJzdCkKKyAgICAgICAgQGZpcnN0ID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgSnNvblByb3RvY29sOjpyZWFkX3N5bnRheF9jaGFyKHJlYWRlciwgQEBrSlNPTkVsZW1TZXBhcmF0b3IpCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgSnNvblByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBAQGtKU09OT2JqZWN0U3RhcnQgPSAneycKKyAgICBAQGtKU09OT2JqZWN0RW5kID0gJ30nCisgICAgQEBrSlNPTkFycmF5U3RhcnQgPSAnWycKKyAgICBAQGtKU09OQXJyYXlFbmQgPSAnXScKKyAgICBAQGtKU09OTmV3bGluZSA9ICdcbicKKyAgICBAQGtKU09OQmFja3NsYXNoID0gJ1xcJworICAgIEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIicKKworICAgIEBAa1RocmlmdFZlcnNpb24xID0gMQorCisgICAgQEBrVGhyaWZ0TmFuID0gIk5hTiIKKyAgICBAQGtUaHJpZnRJbmZpbml0eSA9ICJJbmZpbml0eSIKKyAgICBAQGtUaHJpZnROZWdhdGl2ZUluZmluaXR5ID0gIi1JbmZpbml0eSIKKworICAgIGRlZiBpbml0aWFsaXplKHRyYW5zKQorICAgICAgc3VwZXIodHJhbnMpCisgICAgICBAY29udGV4dCA9IEpTT05Db250ZXh0Lm5ldworICAgICAgQGNvbnRleHRzID0gQXJyYXkubmV3CisgICAgICBAcmVhZGVyID0gTG9va2FoZWFkUmVhZGVyLm5ldyh0cmFucykKKyAgICBlbmQKKworICAgIGRlZiBnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKGlkKQorICAgICAgY2FzZSBpZAorICAgICAgd2hlbiBUeXBlczo6Qk9PTAorICAgICAgICAidGYiCisgICAgICB3aGVuIFR5cGVzOjpCWVRFCisgICAgICAgICJpOCIKKyAgICAgIHdoZW4gVHlwZXM6OkkxNgorICAgICAgICAiaTE2IgorICAgICAgd2hlbiBUeXBlczo6STMyCisgICAgICAgICJpMzIiCisgICAgICB3aGVuIFR5cGVzOjpJNjQKKyAgICAgICAgImk2NCIKKyAgICAgIHdoZW4gVHlwZXM6OkRPVUJMRQorICAgICAgICAiZGJsIgorICAgICAgd2hlbiBUeXBlczo6U1RSSU5HCisgICAgICAgICJzdHIiCisgICAgICB3aGVuIFR5cGVzOjpTVFJVQ1QKKyAgICAgICAgInJlYyIKKyAgICAgIHdoZW4gVHlwZXM6Ok1BUAorICAgICAgICAibWFwIgorICAgICAgd2hlbiBUeXBlczo6U0VUCisgICAgICAgICJzZXQiCisgICAgICB3aGVuIFR5cGVzOjpMSVNUCisgICAgICAgICJsc3QiCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIGdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUobmFtZSkKKyAgICAgIGlmIChuYW1lID09ICJ0ZiIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpCT09MCisgICAgICBlbHNpZiAobmFtZSA9PSAiaTgiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6QllURQorICAgICAgZWxzaWYgKG5hbWUgPT0gImkxNiIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpJMTYKKyAgICAgIGVsc2lmIChuYW1lID09ICJpMzIiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6STMyCisgICAgICBlbHNpZiAobmFtZSA9PSAiaTY0IikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6Okk2NAorICAgICAgZWxzaWYgKG5hbWUgPT0gImRibCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpET1VCTEUKKyAgICAgIGVsc2lmIChuYW1lID09ICJzdHIiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6U1RSSU5HCisgICAgICBlbHNpZiAobmFtZSA9PSAicmVjIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OlNUUlVDVAorICAgICAgZWxzaWYgKG5hbWUgPT0gIm1hcCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpNQVAKKyAgICAgIGVsc2lmIChuYW1lID09ICJzZXQiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6U0VUCisgICAgICBlbHNpZiAobmFtZSA9PSAibHN0IikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkxJU1QKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OlNUT1AKKyAgICAgIGVuZAorICAgICAgaWYgKHJlc3VsdCA9PSBUeXBlczo6U1RPUCkKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgZW5kCisgICAgICByZXR1cm4gcmVzdWx0CisgICAgZW5kCisKKyAgICAjIFN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCisKKyAgICAjIFJlYWQgMSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHJhbnMgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIHRoZSBleHBlY3RlZCBjaGFyYWN0ZXIgY2guCisgICAgIyBUaHJvdyBhIHByb3RvY29sIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3QuCisgICAgZGVmIHNlbGYucmVhZF9zeW50YXhfY2hhcihyZWFkZXIsIGNoKQorICAgICAgY2gyID0gcmVhZGVyLnJlYWQKKyAgICAgIGlmIChjaDIgIT0gY2gpCisgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCcje2NofVwnIGdvdCBcJyN7Y2gyfVwnLiIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGNoIGlzIGluIFstKzAtOS5FZV07IGZhbHNlIG90aGVyd2lzZQorICAgIGRlZiBpc19qc29uX251bWVyaWMoY2gpCisgICAgICBjYXNlIGNoCisgICAgICB3aGVuICcrJywgJy0nLCAnLicsICcwJyAuLiAnOScsICdFJywgImUiCisgICAgICAgIHJldHVybiB0cnVlCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgcHVzaF9jb250ZXh0KGNvbnRleHQpCisgICAgICBAY29udGV4dHMucHVzaChAY29udGV4dCkKKyAgICAgIEBjb250ZXh0ID0gY29udGV4dAorICAgIGVuZAorCisgICAgZGVmIHBvcF9jb250ZXh0CisgICAgICBAY29udGV4dCA9IEBjb250ZXh0cy5wb3AKKyAgICBlbmQKKworICAgICMgV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBhIEpTT04gZXNjYXBlIHNlcXVlbmNlICgiXHUwMHh4IikKKyAgICBkZWYgd3JpdGVfanNvbl9lc2NhcGVfY2hhcihjaCkKKyAgICAgIHRyYW5zLndyaXRlKCdcXHUnKQorICAgICAgY2hfdmFsdWUgPSBjaFswXQorICAgICAgaWYgKGNoX3ZhbHVlLmtpbmRfb2Y/IFN0cmluZykKKyAgICAgICAgY2hfdmFsdWUgPSBjaC5ieXRlcy5maXJzdAorICAgICAgZW5kCisgICAgICB0cmFucy53cml0ZShjaF92YWx1ZS50b19zKDE2KS5yanVzdCg0LCcwJykpCisgICAgZW5kCisKKyAgICAjIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgcGFydCBvZiBhIEpTT04gc3RyaW5nLCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KKyAgICBkZWYgd3JpdGVfanNvbl9jaGFyKGNoKQorICAgICAgIyBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaGFuZGxpbmcgZm9yIHRoZSBmaXJzdCAweDMwIGNoYXJhY3RlcnMKKyAgICAgICMgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgorICAgICAgIyAxIDoganVzdCBvdXRwdXQgaW5kZXgKKyAgICAgICMgPG90aGVyPiA6IGVzY2FwZSB1c2luZyAiXDxvdGhlcj4iIG5vdGF0aW9uCisgICAgICBrSlNPTkNoYXJUYWJsZSA9IFsKKyAgICAgICAgICAjIDAgMSAyIDMgNCA1IDYgNyA4IDkgQSBCIEMgRCBFIEYKKyAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCdiJywndCcsJ24nLCAwLCdmJywncicsIDAsIDAsICMgMAorICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICMgMQorICAgICAgICAgIDEsIDEsJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAjIDIKKyAgICAgIF0KKworICAgICAgY2hfdmFsdWUgPSBjaFswXQorICAgICAgaWYgKGNoX3ZhbHVlLmtpbmRfb2Y/IFN0cmluZykKKyAgICAgICAgY2hfdmFsdWUgPSBjaC5ieXRlcy5maXJzdAorICAgICAgZW5kCisgICAgICBpZiAoY2hfdmFsdWUgPj0gMHgzMCkKKyAgICAgICAgaWYgKGNoID09IEBAa0pTT05CYWNrc2xhc2gpICMgT25seSBzcGVjaWFsIGNoYXJhY3RlciA+PSAweDMwIGlzICdcJworICAgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05CYWNrc2xhc2gpCisgICAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkJhY2tzbGFzaCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHRyYW5zLndyaXRlKGNoKQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0Q2ggPSBrSlNPTkNoYXJUYWJsZVtjaF92YWx1ZV07CisgICAgICAgICMgQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKU09OIGVzY2FwZWQKKyAgICAgICAgaWYgb3V0Q2gua2luZF9vZj8gU3RyaW5nCisgICAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkJhY2tzbGFzaCkKKyAgICAgICAgICB0cmFucy53cml0ZShvdXRDaCkKKyAgICAgICAgZWxzaWYgb3V0Q2ggPT0gMQorICAgICAgICAgIHRyYW5zLndyaXRlKGNoKQorICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGVfanNvbl9lc2NhcGVfY2hhcihjaCkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIHN0ciBhcyBhIEpTT04gc3RyaW5nLCBlc2NhcGluZyBjaGFyYWN0ZXJzIGFzIGFwcHJvcHJpYXRlLgorICAgIGRlZiB3cml0ZV9qc29uX3N0cmluZyhzdHIpCisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBzdHIuc3BsaXQoJycpLmVhY2ggZG8gfGNofAorICAgICAgICB3cml0ZV9qc29uX2NoYXIoY2gpCisgICAgICBlbmQKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisKKyAgICAjIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBhcyBKU09OIHN0cmluZywgYmFzZTY0LWVuY29kaW5nCisgICAgIyB0aGUgc3RyaW5nJ3MgY29udGVudHMsIGFuZCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZQorICAgIGRlZiB3cml0ZV9qc29uX2Jhc2U2NChzdHIpCisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICB0cmFucy53cml0ZShCYXNlNjQuc3RyaWN0X2VuY29kZTY0KHN0cikpCisgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgIGVuZAorCisgICAgIyBDb252ZXJ0IHRoZSBnaXZlbiBpbnRlZ2VyIHR5cGUgdG8gYSBKU09OIG51bWJlciwgb3IgYSBzdHJpbmcKKyAgICAjIGlmIHRoZSBjb250ZXh0IHJlcXVpcmVzIGl0IChlZzoga2V5IGluIGEgbWFwIHBhaXIpLgorICAgIGRlZiB3cml0ZV9qc29uX2ludGVnZXIobnVtKQorICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCisgICAgICBlc2NhcGVOdW0gPSBAY29udGV4dC5lc2NhcGVOdW0KKyAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBlbmQKKyAgICAgIHRyYW5zLndyaXRlKG51bS50b19zKTsKKyAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgQ29udmVydCB0aGUgZ2l2ZW4gZG91YmxlIHRvIGEgSlNPTiBzdHJpbmcsIHdoaWNoIGlzIGVpdGhlciB0aGUgbnVtYmVyLAorICAgICMgIk5hTiIgb3IgIkluZmluaXR5IiBvciAiLUluZmluaXR5Ii4KKyAgICBkZWYgd3JpdGVfanNvbl9kb3VibGUobnVtKQorICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCisgICAgICAjIE5vcm1hbGl6ZSBvdXRwdXQgb2YgdGhyaWZ0Ojp0b19zdHJpbmcgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKKyAgICAgIHNwZWNpYWwgPSBmYWxzZTsKKyAgICAgIGlmIChudW0ubmFuPykKKyAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgIHZhbCA9IEBAa1RocmlmdE5hbjsKKyAgICAgIGVsc2lmIChudW0uaW5maW5pdGU/KQorICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgdmFsID0gQEBrVGhyaWZ0SW5maW5pdHk7CisgICAgICAgIGlmIChudW0gPCAwLjApCisgICAgICAgICAgdmFsID0gQEBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eTsKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIHZhbCA9IG51bS50b19zCisgICAgICBlbmQKKworICAgICAgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBAY29udGV4dC5lc2NhcGVOdW0KKyAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBlbmQKKyAgICAgIHRyYW5zLndyaXRlKHZhbCkKKyAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9qc29uX29iamVjdF9zdGFydAorICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCisgICAgICB0cmFucy53cml0ZShAQGtKU09OT2JqZWN0U3RhcnQpCisgICAgICBwdXNoX2NvbnRleHQoSlNPTlBhaXJDb250ZXh0Lm5ldyk7CisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgICBwb3BfY29udGV4dAorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTk9iamVjdEVuZCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05BcnJheVN0YXJ0KQorICAgICAgcHVzaF9jb250ZXh0KEpTT05MaXN0Q29udGV4dC5uZXcpOworICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgICBwb3BfY29udGV4dAorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkFycmF5RW5kKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICB3cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoQEBrVGhyaWZ0VmVyc2lvbjEpCisgICAgICB3cml0ZV9qc29uX3N0cmluZyhuYW1lKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKHR5cGUpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoc2VxaWQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RydWN0X2JlZ2luKG5hbWUpCisgICAgICB3cml0ZV9qc29uX29iamVjdF9zdGFydAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cnVjdF9lbmQKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKGlkKQorICAgICAgd3JpdGVfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQodHlwZSkpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfZW5kCisgICAgICB3cml0ZV9qc29uX29iamVjdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9zdG9wOyBuaWw7IGVuZAorCisgICAgZGVmIHdyaXRlX21hcF9iZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgICB3cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICB3cml0ZV9qc29uX3N0cmluZyhnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKGt0eXBlKSkKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQodnR5cGUpKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKHNpemUpCisgICAgICB3cml0ZV9qc29uX29iamVjdF9zdGFydAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21hcF9lbmQKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X2VuZAorICAgICAgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9saXN0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgICAgd3JpdGVfanNvbl9hcnJheV9zdGFydAorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChldHlwZSkpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoc2l6ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9saXN0X2VuZAorICAgICAgd3JpdGVfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zZXRfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICB3cml0ZV9qc29uX2FycmF5X3N0YXJ0CisgICAgICB3cml0ZV9qc29uX3N0cmluZyhnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKGV0eXBlKSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9lbmQKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYm9vbChib29sKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKGJvb2wgPyAxIDogMCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ieXRlKGJ5dGUpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoYnl0ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pMTYoaTE2KQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKGkxNikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pMzIoaTMyKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKGkzMikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pNjQoaTY0KQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKGk2NCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9kb3VibGUoZHViKQorICAgICAgd3JpdGVfanNvbl9kb3VibGUoZHViKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCisgICAgICB3cml0ZV9qc29uX3N0cmluZyhzdHIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYmluYXJ5KHN0cikKKyAgICAgIHdyaXRlX2pzb25fYmFzZTY0KHN0cikKKyAgICBlbmQKKworICAgICMjCisgICAgIyBSZWFkaW5nIGZ1bmN0aW9ucworICAgICMjCisKKyAgICAjIFJlYWRzIDEgYnl0ZSBhbmQgdmVyaWZpZXMgdGhhdCBpdCBtYXRjaGVzIGNoLgorICAgIGRlZiByZWFkX2pzb25fc3ludGF4X2NoYXIoY2gpCisgICAgICBKc29uUHJvdG9jb2w6OnJlYWRfc3ludGF4X2NoYXIoQHJlYWRlciwgY2gpCisgICAgZW5kCisKKyAgICAjIERlY29kZXMgdGhlIGZvdXIgaGV4IHBhcnRzIG9mIGEgSlNPTiBlc2NhcGVkIHN0cmluZyBjaGFyYWN0ZXIgYW5kIHJldHVybnMKKyAgICAjIHRoZSBjaGFyYWN0ZXIgdmlhIG91dC4KKyAgICAjCisgICAgIyBOb3RlIC0gdGhpcyBvbmx5IHN1cHBvcnRzIFVuaWNvZGUgY2hhcmFjdGVycyBpbiB0aGUgQk1QIChVKzAwMDAgdG8gVStGRkZGKTsKKyAgICAjIGNoYXJhY3RlcnMgYWJvdmUgdGhlIEJNUCBhcmUgZW5jb2RlZCBhcyB0d28gZXNjYXBlIHNlcXVlbmNlcyAoc3Vycm9nYXRlIHBhaXJzKSwKKyAgICAjIHdoaWNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgICBkZWYgcmVhZF9qc29uX2VzY2FwZV9jaGFyCisgICAgICBzdHIgPSBAcmVhZGVyLnJlYWQKKyAgICAgIHN0ciArPSBAcmVhZGVyLnJlYWQKKyAgICAgIHN0ciArPSBAcmVhZGVyLnJlYWQKKyAgICAgIHN0ciArPSBAcmVhZGVyLnJlYWQKKyAgICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JworICAgICAgICBzdHIuaGV4LmNocihFbmNvZGluZzo6VVRGXzgpCisgICAgICBlbHNlCisgICAgICAgIHN0ci5oZXguY2hyCisgICAgICBlbmQKKyAgICBlbmQKKworICAgICMgRGVjb2RlcyBhIEpTT04gc3RyaW5nLCBpbmNsdWRpbmcgdW5lc2NhcGluZywgYW5kIHJldHVybnMgdGhlIHN0cmluZyB2aWEgc3RyCisgICAgZGVmIHJlYWRfanNvbl9zdHJpbmcoc2tpcENvbnRleHQgPSBmYWxzZSkKKyAgICAgICMgVGhpcyBzdHJpbmcncyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZWxlbWVudHMgaW4gZXNjYXBlX2NoYXJfdmFscy4KKyAgICAgICMgSSBkb24ndCBoYXZlICcvJyBvbiB0aGlzIGxpc3QgZXZlbiB0aG91Z2ggaXQgYXBwZWFycyBvbiB3d3cuanNvbi5vcmcgLS0KKyAgICAgICMgaXQgaXMgbm90IGluIHRoZSBSRkMgLT4gaXQgaXMuIFNlZSBSRkMgNDYyNworICAgICAgZXNjYXBlX2NoYXJzID0gIlwiXFwvYmZucnQiCisKKyAgICAgICMgVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCisgICAgICAjIGVzY2FwZV9jaGFycworICAgICAgZXNjYXBlX2NoYXJfdmFscyA9IFsKKyAgICAgICAgIlwiIiwgIlxcIiwgIlwvIiwgIlxiIiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKKyAgICAgIF0KKworICAgICAgaWYgIXNraXBDb250ZXh0CisgICAgICAgIEBjb250ZXh0LnJlYWQoQHJlYWRlcikKKyAgICAgIGVuZAorICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBjaCA9ICIiCisgICAgICBzdHIgPSAiIgorICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIGNoID0gQHJlYWRlci5yZWFkCisgICAgICAgIGlmIChjaCA9PSBAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgICAgIGJyZWFrCisgICAgICAgIGVuZAorICAgICAgICBpZiAoY2ggPT0gQEBrSlNPTkJhY2tzbGFzaCkKKyAgICAgICAgICBjaCA9IEByZWFkZXIucmVhZAorICAgICAgICAgIGlmIChjaCA9PSAndScpCisgICAgICAgICAgICBjaCA9IHJlYWRfanNvbl9lc2NhcGVfY2hhcgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBvcyA9IGVzY2FwZV9jaGFycy5pbmRleChjaCk7CisgICAgICAgICAgICBpZiAocG9zLm5pbD8pICMgbm90IGZvdW5kCisgICAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgXCcje2NofVwnLiIpCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGNoID0gZXNjYXBlX2NoYXJfdmFsc1twb3NdCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgICBzdHIgKz0gY2gKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHN0cgorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIGJsb2NrIG9mIGJhc2U2NCBjaGFyYWN0ZXJzLCBkZWNvZGluZyBpdCwgYW5kIHJldHVybnMgdmlhIHN0cgorICAgIGRlZiByZWFkX2pzb25fYmFzZTY0CisgICAgICBzdHIgPSByZWFkX2pzb25fc3RyaW5nCisgICAgICBtID0gc3RyLmxlbmd0aCAlIDQKKyAgICAgIGlmIG0gIT0gMAorICAgICAgICAjIEFkZCBtaXNzaW5nIHBhZGRpbmcKKyAgICAgICAgKDQgLSBtKS50aW1lcyBkbworICAgICAgICAgIHN0ciArPSAnPScKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIEJhc2U2NC5zdHJpY3RfZGVjb2RlNjQoc3RyKQorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMsIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBub3QKKyAgICAjIGEgdmFsaWQgSlNPTiBudW1lcmljIGNoYXJhY3Rlci4KKyAgICBkZWYgcmVhZF9qc29uX251bWVyaWNfY2hhcnMKKyAgICAgIHN0ciA9ICIiCisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgY2ggPSBAcmVhZGVyLnBlZWsKKyAgICAgICAgaWYgKCFpc19qc29uX251bWVyaWMoY2gpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBlbmQKKyAgICAgICAgY2ggPSBAcmVhZGVyLnJlYWQKKyAgICAgICAgc3RyICs9IGNoCisgICAgICBlbmQKKyAgICAgIHJldHVybiBzdHIKKyAgICBlbmQKKworICAgICMgUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAorICAgICMgcmV0dXJuaW5nIHRoZW0gdmlhIG51bQorICAgIGRlZiByZWFkX2pzb25faW50ZWdlcgorICAgICAgQGNvbnRleHQucmVhZChAcmVhZGVyKQorICAgICAgaWYgKEBjb250ZXh0LmVzY2FwZU51bSkKKyAgICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBlbmQKKyAgICAgIHN0ciA9IHJlYWRfanNvbl9udW1lcmljX2NoYXJzCisKKyAgICAgIGJlZ2luCisgICAgICAgIG51bSA9IEludGVnZXIoc3RyKTsKKyAgICAgIHJlc2N1ZQorICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiN7c3RyfVwiIikKKyAgICAgIGVuZAorCisgICAgICBpZiAoQGNvbnRleHQuZXNjYXBlTnVtKQorICAgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gbnVtCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgSlNPTiBudW1iZXIgb3Igc3RyaW5nIGFuZCBpbnRlcnByZXRzIGl0IGFzIGEgZG91YmxlLgorICAgIGRlZiByZWFkX2pzb25fZG91YmxlCisgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICBudW0gPSAwCisgICAgICBpZiAoQHJlYWRlci5wZWVrID09IEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICAgIHN0ciA9IHJlYWRfanNvbl9zdHJpbmcodHJ1ZSkKKyAgICAgICAgIyBDaGVjayBmb3IgTmFOLCBJbmZpbml0eSBhbmQgLUluZmluaXR5CisgICAgICAgIGlmIChzdHIgPT0gQEBrVGhyaWZ0TmFuKQorICAgICAgICAgIG51bSA9ICgrMS4wLzAuMCkvKCsxLjAvMC4wKQorICAgICAgICBlbHNpZiAoc3RyID09IEBAa1RocmlmdEluZmluaXR5KQorICAgICAgICAgIG51bSA9ICsxLjAvMC4wCisgICAgICAgIGVsc2lmIChzdHIgPT0gQEBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSkKKyAgICAgICAgICBudW0gPSAtMS4wLzAuMAorICAgICAgICBlbHNlCisgICAgICAgICAgaWYgKCFAY29udGV4dC5lc2NhcGVOdW0pCisgICAgICAgICAgICAjIFJhaXNlIGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpCisgICAgICAgICAgZW5kCisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIG51bSA9IEZsb2F0KHN0cikKKyAgICAgICAgICByZXNjdWUKKyAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiI3tzdHJ9XCIiKQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgKEBjb250ZXh0LmVzY2FwZU51bSkKKyAgICAgICAgICAjIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICAgIGVuZAorICAgICAgICBzdHIgPSByZWFkX2pzb25fbnVtZXJpY19jaGFycworICAgICAgICBiZWdpbgorICAgICAgICAgIG51bSA9IEZsb2F0KHN0cikKKyAgICAgICAgcmVzY3VlCisgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIje3N0cn1cIiIpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICByZXR1cm4gbnVtCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9qc29uX29iamVjdF9zdGFydAorICAgICAgQGNvbnRleHQucmVhZChAcmVhZGVyKQorICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05PYmplY3RTdGFydCkKKyAgICAgIHB1c2hfY29udGV4dChKU09OUGFpckNvbnRleHQubmV3KQorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9qc29uX29iamVjdF9lbmQKKyAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OT2JqZWN0RW5kKQorICAgICAgcG9wX2NvbnRleHQKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAgQGNvbnRleHQucmVhZChAcmVhZGVyKQorICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05BcnJheVN0YXJ0KQorICAgICAgcHVzaF9jb250ZXh0KEpTT05MaXN0Q29udGV4dC5uZXcpCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTkFycmF5RW5kKQorICAgICAgcG9wX2NvbnRleHQKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICB2ZXJzaW9uID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIGlmICh2ZXJzaW9uICE9IEBAa1RocmlmdFZlcnNpb24xKQorICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAnTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uJykKKyAgICAgIGVuZAorICAgICAgbmFtZSA9IHJlYWRfanNvbl9zdHJpbmcKKyAgICAgIG1lc3NhZ2VfdHlwZSA9IHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICBzZXFpZCA9IHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICBbbmFtZSwgbWVzc2FnZV90eXBlLCBzZXFpZF0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21lc3NhZ2VfZW5kCisgICAgICByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cnVjdF9iZWdpbgorICAgICAgcmVhZF9qc29uX29iamVjdF9zdGFydAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfZW5kCisgICAgICByZWFkX2pzb25fb2JqZWN0X2VuZAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9iZWdpbgorICAgICAgIyBDaGVjayBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgY2ggPSBAcmVhZGVyLnBlZWsKKyAgICAgIGlmIChjaCA9PSBAQGtKU09OT2JqZWN0RW5kKQorICAgICAgICBmaWVsZF90eXBlID0gVHlwZXM6OlNUT1AKKyAgICAgIGVsc2UKKyAgICAgICAgZmllbGRfaWQgPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgICByZWFkX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICAgIGZpZWxkX3R5cGUgPSBnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpCisgICAgICBlbmQKKyAgICAgIFtuaWwsIGZpZWxkX3R5cGUsIGZpZWxkX2lkXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZmllbGRfZW5kCisgICAgICByZWFkX2pzb25fb2JqZWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2JlZ2luCisgICAgICByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIGtleV90eXBlID0gZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShyZWFkX2pzb25fc3RyaW5nKQorICAgICAgdmFsX3R5cGUgPSBnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpCisgICAgICBzaXplID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIHJlYWRfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgIFtrZXlfdHlwZSwgdmFsX3R5cGUsIHNpemVdCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tYXBfZW5kCisgICAgICByZWFkX2pzb25fb2JqZWN0X2VuZAorICAgICAgcmVhZF9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbGlzdF9iZWdpbgorICAgICAgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICBbZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShyZWFkX2pzb25fc3RyaW5nKSwgcmVhZF9qc29uX2ludGVnZXJdCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9saXN0X2VuZAorICAgICAgcmVhZF9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2JlZ2luCisgICAgICByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIFtnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKHJlYWRfanNvbl9zdHJpbmcpLCByZWFkX2pzb25faW50ZWdlcl0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX3NldF9lbmQKKyAgICAgIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2Jvb2wKKyAgICAgIGJ5dGUgPSByZWFkX2J5dGUKKyAgICAgIGJ5dGUgIT0gMAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgcmVhZF9qc29uX2ludGVnZXIKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kxNgorICAgICAgcmVhZF9qc29uX2ludGVnZXIKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kzMgorICAgICAgcmVhZF9qc29uX2ludGVnZXIKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2k2NAorICAgICAgcmVhZF9qc29uX2ludGVnZXIKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2RvdWJsZQorICAgICAgcmVhZF9qc29uX2RvdWJsZQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RyaW5nCisgICAgICByZWFkX2pzb25fc3RyaW5nCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIHJlYWRfanNvbl9iYXNlNjQKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAianNvbigje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCisKKyAgY2xhc3MgSnNvblByb3RvY29sRmFjdG9yeSA8IEJhc2VQcm90b2NvbEZhY3RvcnkKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQorICAgICAgcmV0dXJuIFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFucykKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAianNvbiIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0MjhhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiCkBAIC0wLDAgKzEsNDQgQEAKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvcHJvdG9jb2xfZGVjb3JhdG9yJworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIE11bHRpcGxleGVkUHJvdG9jb2wgPCBCYXNlUHJvdG9jb2wKKworICAgIGluY2x1ZGUgUHJvdG9jb2xEZWNvcmF0b3IKKworICAgIGRlZiBpbml0aWFsaXplKHByb3RvY29sLCBzZXJ2aWNlX25hbWUpCisgICAgICBzdXBlcihwcm90b2NvbCkKKyAgICAgIEBzZXJ2aWNlX25hbWUgPSBzZXJ2aWNlX25hbWUKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgICAgY2FzZSB0eXBlCisgICAgICB3aGVuIE1lc3NhZ2VUeXBlczo6Q0FMTCwgTWVzc2FnZVR5cGVzOjpPTkVXQVkKKyAgICAgICAgQHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4oIiN7QHNlcnZpY2VfbmFtZX06I3tuYW1lfSIsIHR5cGUsIHNlcWlkKQorICAgICAgZWxzZQorICAgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIGVuZCAKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIm11bHRpcGxleGVkKCN7QHNlcnZpY2VfbmFtZT1AcHJvdG9jb2wudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvcHJvdG9jb2xfZGVjb3JhdG9yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvcHJvdG9jb2xfZGVjb3JhdG9yLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIKQEAgLTAsMCArMSwxOTQgQEAKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCittb2R1bGUgVGhyaWZ0CisgIG1vZHVsZSBQcm90b2NvbERlY29yYXRvcgorCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wpCisgICAgICBAcHJvdG9jb2wgPSBwcm90b2NvbAorICAgIGVuZAorCisgICAgZGVmIHRyYW5zCisgICAgICBAcHJvdG9jb2wudHJhbnMKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgICAgQHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tZXNzYWdlX2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX21lc3NhZ2VfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RydWN0X2JlZ2luKG5hbWUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfc3RydWN0X2JlZ2luKG5hbWUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RydWN0X2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX3N0cnVjdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9iZWdpbihuYW1lLCB0eXBlLCBpZCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9maWVsZF9iZWdpbihuYW1lLCB0eXBlLCBpZCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9maWVsZF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9zdG9wCisgICAgICBAcHJvdG9jb2wud3JpdGVfZmllbGRfc3RvcAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21hcF9iZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWFwX2JlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tYXBfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWFwX2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfbGlzdF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9saXN0X2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX2xpc3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc2V0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgICAgQHByb3RvY29sLndyaXRlX3NldF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zZXRfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfc2V0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2Jvb2woYm9vbCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9ib29sKGJvb2wpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYnl0ZShieXRlKQorICAgICAgQHByb3RvY29sLndyaXRlX2J5dGUoYnl0ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pMTYoaTE2KQorICAgICAgQHByb3RvY29sLndyaXRlX2kxNihpMTYpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTMyKGkzMikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9pMzIoaTMyKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2k2NChpNjQpCisgICAgICBAcHJvdG9jb2wud3JpdGVfaTY0KGk2NCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9kb3VibGUoZHViKQorICAgICAgQHByb3RvY29sLndyaXRlX2RvdWJsZShkdWIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zdHJpbmcoc3RyKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2JpbmFyeShidWYpCisgICAgICBAcHJvdG9jb2wud3JpdGVfYmluYXJ5KGJ1ZikKKyAgICBlbmQKKworICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX21lc3NhZ2VfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21lc3NhZ2VfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9tZXNzYWdlX2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9zdHJ1Y3RfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cnVjdF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cnVjdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ZpZWxkX2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZmllbGRfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9maWVsZF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfbWFwX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tYXBfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9tYXBfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9saXN0X2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9saXN0X2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9saXN0X2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfbGlzdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3NldF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfc2V0X2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zZXRfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9zZXRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9ib29sCisgICAgICBAcHJvdG9jb2wucmVhZF9ib29sCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICBAcHJvdG9jb2wucmVhZF9ieXRlCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pMTYKKyAgICAgIEBwcm90b2NvbC5yZWFkX2kxNgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTMyCisgICAgICBAcHJvdG9jb2wucmVhZF9pMzIKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2k2NAorICAgICAgQHByb3RvY29sLnJlYWRfaTY0CisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9kb3VibGUKKyAgICAgIEBwcm90b2NvbC5yZWFkX2RvdWJsZQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RyaW5nCisgICAgICBAcHJvdG9jb2wucmVhZF9zdHJpbmcKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2JpbmFyeQorICAgICAgQHByb3RvY29sLnJlYWRfYmluYXJ5CisgICAgZW5kCisgIGVuZAorZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCmluZGV4IDFlZTEyMTMuLmFhNGQwOWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKQEAgLTI2LDYgKzI2LDEyIEBACiAgICAgICBAcHJvdG9jb2xfZmFjdG9yeSA9IHByb3RvY29sX2ZhY3RvcnkgPyBwcm90b2NvbF9mYWN0b3J5IDogVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CiAgICAgZW5kCiAKLSAgICBkZWYgc2VydmU7IG5pbDsgZW5kCisgICAgZGVmIHNlcnZlCisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgInNlcnZlcigje0Bwcm90b2NvbF9mYWN0b3J5LnRvX3N9KCN7QHRyYW5zcG9ydF9mYWN0b3J5LnRvX3N9KCN7QHNlcnZlcl90cmFuc3BvcnQudG9fc30pKSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbW9uZ3JlbF9odHRwX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyLnJiCmluZGV4IDg0ZWFjZjAuLmRlMzU0YzggMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyLnJiCkBAIC0yMCw2ICsyMCw3IEBACiByZXF1aXJlICdtb25ncmVsJwogCiAjIyBTdGlja3MgYSBzZXJ2aWNlIG9uIGEgVVJMLCB1c2luZyBtb25ncmVsIHRvIGRvIHRoZSBIVFRQIHdvcmsKKyMgPGI+REVQUkVDQVRFRDo8L2I+IFBsZWFzZSB1c2UgPHR0PlRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI8L3R0PiBpbnN0ZWFkLgogbW9kdWxlIFRocmlmdAogICBjbGFzcyBNb25ncmVsSFRUUFNlcnZlciA8IEJhc2VTZXJ2ZXIKICAgICBjbGFzcyBIYW5kbGVyIDwgTW9uZ3JlbDo6SHR0cEhhbmRsZXIKQEAgLTQzLDYgKzQ0LDcgQEAKICAgICBlbmQKIAogICAgIGRlZiBpbml0aWFsaXplKHByb2Nlc3Nvciwgb3B0cz17fSkKKyAgICAgIEtlcm5lbC53YXJuICJbREVQUkVDQVRJT04gV0FSTklOR10gYFRocmlmdDo6TW9uZ3JlbEhUVFBTZXJ2ZXJgIGlzIGRlcHJlY2F0ZWQuICBQbGVhc2UgdXNlIGBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyYCBpbnN0ZWFkLiIKICAgICAgIHBvcnQgPSBvcHRzWzpwb3J0XSB8fCA4MAogICAgICAgaXAgPSBvcHRzWzppcF0gfHwgIjAuMC4wLjAiCiAgICAgICBwYXRoID0gb3B0c1s6cGF0aF0gfHwgIiIKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZ19zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmdfc2VydmVyLnJiCmluZGV4IDllMWNmZTYuLjc0MGYzNDEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZ19zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nX3NlcnZlci5yYgpAQCAtNDQsNyArNDQsMTMgQEAKICAgICAgIGJlZ2luCiAgICAgICAgIGxvb3AgZG8KICAgICAgICAgICBicmVhayBpZiBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZWQ/Ci0gICAgICAgICAgcmQsID0gc2VsZWN0KFtAc2VydmVyX3RyYW5zcG9ydF0sIG5pbCwgbmlsLCAwLjEpCisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIHJkLCA9IHNlbGVjdChbQHNlcnZlcl90cmFuc3BvcnRdLCBuaWwsIG5pbCwgMC4xKQorICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUJBREYgPT4gZQorICAgICAgICAgICAgIyBJbiBSdWJ5IDEuOSwgY2FsbGluZyBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZSBpbiBzaHV0ZG93biBwYXRocyBjYXVzZXMgdGhlIHNlbGVjdCgpIHRvIHJhaXNlIGFuCisgICAgICAgICAgICAjIEVycm5vOjpFQkFERi4gSWYgdGhpcyBoYXBwZW5zLCBpZ25vcmUgaXQgYW5kIHJldHJ5IHRoZSBsb29wLgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBlbmQKICAgICAgICAgICBuZXh0IGlmIHJkLm5pbD8KICAgICAgICAgICBzb2NrZXQgPSBAc2VydmVyX3RyYW5zcG9ydC5hY2NlcHQKICAgICAgICAgICBAbG9nZ2VyLmRlYnVnICJBY2NlcHRlZCBzb2NrZXQ6ICN7c29ja2V0Lmluc3BlY3R9IgpAQCAtMTQ2LDEwICsxNTIsMTQgQEAKICAgICAgICAgICAgIGJyZWFrIGlmIHJlYWRfc2lnbmFscyA9PSA6c2h1dGRvd24KICAgICAgICAgICBlbmQKICAgICAgICAgICByZC5lYWNoIGRvIHxmZHwKLSAgICAgICAgICAgIGlmIGZkLmhhbmRsZS5lb2Y/CisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBpZiBmZC5oYW5kbGUuZW9mPworICAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uIGZkCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZWFkX2Nvbm5lY3Rpb24gZmQKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICByZXNjdWUgRXJybm86OkVDT05OUkVTRVQKICAgICAgICAgICAgICAgcmVtb3ZlX2Nvbm5lY3Rpb24gZmQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcmVhZF9jb25uZWN0aW9uIGZkCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCkBAIC0yOTIsNCArMzAyLDQgQEAKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgppbmRleCAyMWU4NjU5Li45MDVmZTliIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgpAQCAtMzksNSArMzksOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzaW1wbGUoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODFjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYgpAQCAtMCwwICsxLDkxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAncmFjaycKK3JlcXVpcmUgJ3RoaW4nCisKKyMjCisjIFdyYXBzIHRoZSBUaGluIHdlYiBzZXJ2ZXIgdG8gcHJvdmlkZSBhIFRocmlmdCBzZXJ2ZXIgb3ZlciBIVFRQLgorbW9kdWxlIFRocmlmdAorICBjbGFzcyBUaGluSFRUUFNlcnZlciA8IEJhc2VTZXJ2ZXIKKworICAgICMjCisgICAgIyBBY2NlcHRzIGEgVGhyaWZ0OjpQcm9jZXNzb3IKKyAgICAjIE9wdGlvbnMgaW5jbHVkZToKKyAgICAjICogOnBvcnQKKyAgICAjICogOmlwCisgICAgIyAqIDpwYXRoCisgICAgIyAqIDpwcm90b2NvbF9mYWN0b3J5CisgICAgZGVmIGluaXRpYWxpemUocHJvY2Vzc29yLCBvcHRpb25zPXt9KQorICAgICAgcG9ydCA9IG9wdGlvbnNbOnBvcnRdIHx8IDgwCisgICAgICBpcCA9IG9wdGlvbnNbOmlwXSB8fCAiMC4wLjAuMCIKKyAgICAgIHBhdGggPSBvcHRpb25zWzpwYXRoXSB8fCAiLyIKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBvcHRpb25zWzpwcm90b2NvbF9mYWN0b3J5XSB8fCBCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CisgICAgICBhcHAgPSBSYWNrQXBwbGljYXRpb24uZm9yKHBhdGgsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgIEBzZXJ2ZXIgPSBUaGluOjpTZXJ2ZXIubmV3KGlwLCBwb3J0LCBhcHApCisgICAgZW5kCisKKyAgICAjIworICAgICMgU3RhcnRzIHRoZSBzZXJ2ZXIKKyAgICBkZWYgc2VydmUKKyAgICAgIEBzZXJ2ZXIuc3RhcnQKKyAgICBlbmQKKworICAgIGNsYXNzIFJhY2tBcHBsaWNhdGlvbgorCisgICAgICBUSFJJRlRfSEVBREVSID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IgorCisgICAgICBkZWYgc2VsZi5mb3IocGF0aCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICBSYWNrOjpCdWlsZGVyLm5ldyBkbworICAgICAgICAgIHVzZSBSYWNrOjpDb21tb25Mb2dnZXIKKyAgICAgICAgICB1c2UgUmFjazo6U2hvd0V4Y2VwdGlvbnMKKyAgICAgICAgICB1c2UgUmFjazo6TGludAorICAgICAgICAgIG1hcCBwYXRoIGRvCisgICAgICAgICAgICBydW4gbGFtYmRhIHsgfGVudnwKKyAgICAgICAgICAgICAgcmVxdWVzdCA9IFJhY2s6OlJlcXVlc3QubmV3KGVudikKKyAgICAgICAgICAgICAgaWYgUmFja0FwcGxpY2F0aW9uLnZhbGlkX3RocmlmdF9yZXF1ZXN0PyhyZXF1ZXN0KQorICAgICAgICAgICAgICAgIFJhY2tBcHBsaWNhdGlvbi5zdWNjZXNzZnVsX3JlcXVlc3QocmVxdWVzdCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUmFja0FwcGxpY2F0aW9uLmZhaWxlZF9yZXF1ZXN0CisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdWNjZXNzZnVsX3JlcXVlc3QocmFja19yZXF1ZXN0LCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgICAgICAgIHJlc3BvbnNlID0gUmFjazo6UmVzcG9uc2UubmV3KFtdLCAyMDAsIHsnQ29udGVudC1UeXBlJyA9PiBUSFJJRlRfSEVBREVSfSkKKyAgICAgICAgdHJhbnNwb3J0ID0gSU9TdHJlYW1UcmFuc3BvcnQubmV3IHJhY2tfcmVxdWVzdC5ib2R5LCByZXNwb25zZQorICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0X3Byb3RvY29sIHRyYW5zcG9ydAorICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyBwcm90b2NvbCwgcHJvdG9jb2wKKyAgICAgICAgcmVzcG9uc2UKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5mYWlsZWRfcmVxdWVzdAorICAgICAgICBSYWNrOjpSZXNwb25zZS5uZXcoWydOb3QgRm91bmQnXSwgNDA0LCB7J0NvbnRlbnQtVHlwZScgPT4gVEhSSUZUX0hFQURFUn0pCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudmFsaWRfdGhyaWZ0X3JlcXVlc3Q/KHJhY2tfcmVxdWVzdCkKKyAgICAgICAgcmFja19yZXF1ZXN0LnBvc3Q/ICYmIHJhY2tfcmVxdWVzdC5lbnZbIkNPTlRFTlRfVFlQRSJdID09IFRIUklGVF9IRUFERVIKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCmluZGV4IDhjZWM4MDUuLmJiNzU0YWQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgpAQCAtNzEsNSArNzEsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRwb29sKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKaW5kZXggYTJjOTE3Yy4uODhlZTE4MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCkBAIC00Myw1ICs0Myw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInRocmVhZGVkKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiCmluZGV4IDA1MjVmNTMuLmRmOWQ2NTYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3QucmIKQEAgLTU1LDcgKzU1LDcgQEAKICAgICBlbmQKIAogICAgIGRlZiBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcwotICAgICAgZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzIikKKyAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzID0gc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcykKICAgICAgIHVubGVzcyBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcwogICAgICAgICBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcyA9IHt9CiAgICAgICAgIHN0cnVjdF9maWVsZHMuZWFjaCBkbyB8ZmlkLCBmaWVsZF9kZWZ8CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlc1tmaWVsZF9kZWZbOm5hbWVdXSA9IGZpZWxkX2RlZls6ZGVmYXVsdF0KICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCi0gICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCJAZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMiLCBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcykKKyAgICAgICAgc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcywgZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMpCiAgICAgICBlbmQKICAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzCiAgICAgZW5kCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgICAgICAgIHdyaXRlX2NvbnRhaW5lcihvcHJvdCwgdmFsdWUsIGZpZWxkX2luZm8pCiAgICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZF9lbmQKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZChuYW1lLCB0eXBlLCBmaWQsIHZhbHVlKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVfZmllbGQoZmllbGRfaW5mbywgZmlkLCB2YWx1ZSkKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKQEAgLTExNCw5ICsxMTQsMTAgQEAKICAgICBlbmQKIAogICAgIGRlZiA9PShvdGhlcikKKyAgICAgIHJldHVybiBmYWxzZSBpZiBvdGhlci5uaWw/CiAgICAgICBlYWNoX2ZpZWxkIGRvIHxmaWQsIGZpZWxkX2luZm98CiAgICAgICAgIG5hbWUgPSBmaWVsZF9pbmZvWzpuYW1lXQotICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIHNlbGYuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KCJAI3tuYW1lfSIpID09IG90aGVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQCN7bmFtZX0iKQorICAgICAgICByZXR1cm4gZmFsc2UgdW5sZXNzIG90aGVyLnJlc3BvbmRfdG8/KG5hbWUpICYmIHNlbGYuc2VuZChuYW1lKSA9PSBvdGhlci5zZW5kKG5hbWUpCiAgICAgICBlbmQKICAgICAgIHRydWUKICAgICBlbmQKQEAgLTEyNSwxMyArMTI2LDE1IEBACiAgICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIHNlbGYgPT0gb3RoZXIKICAgICBlbmQKIAorICAgICMgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoKCkgaXMgaW5zcGlyZWQgYnkgQXBhY2hlJ3MgSmF2YSBIYXNoQ29kZUJ1aWxkZXIgY2xhc3MuCiAgICAgZGVmIGhhc2gKLSAgICAgIGZpZWxkX3ZhbHVlcyA9IFtdCisgICAgICB0b3RhbCA9IDE3CiAgICAgICBlYWNoX2ZpZWxkIGRvIHxmaWQsIGZpZWxkX2luZm98CiAgICAgICAgIG5hbWUgPSBmaWVsZF9pbmZvWzpuYW1lXQotICAgICAgICBmaWVsZF92YWx1ZXMgPDwgc2VsZi5pbnN0YW5jZV92YXJpYWJsZV9nZXQoIkAje25hbWV9IikKKyAgICAgICAgdmFsdWUgPSBzZWxmLnNlbmQobmFtZSkKKyAgICAgICAgdG90YWwgPSAodG90YWwgKiAzNyArIHZhbHVlLmhhc2gpICYgMHhmZmZmZmZmZgogICAgICAgZW5kCi0gICAgICBmaWVsZF92YWx1ZXMuaGFzaAorICAgICAgdG90YWwKICAgICBlbmQKIAogICAgIGRlZiBkaWZmZXJlbmNlcyhvdGhlcikKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYgppbmRleCA5YmZiZWQ1Li5lMjFiMzllIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCkBAIC0yMSwxOSArMjEsMjggQEAKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFN0cnVjdF9VbmlvbgogICAgIGRlZiBuYW1lX3RvX2lkKG5hbWUpCi0gICAgICBuYW1lc190b19pZHMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQG5hbWVzX3RvX2lkcyIpCisgICAgICBuYW1lc190b19pZHMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QG5hbWVzX3RvX2lkcykKICAgICAgIHVubGVzcyBuYW1lc190b19pZHMKICAgICAgICAgbmFtZXNfdG9faWRzID0ge30KICAgICAgICAgc3RydWN0X2ZpZWxkcy5lYWNoIGRvIHxmaWQsIGZpZWxkX2RlZnwKICAgICAgICAgICBuYW1lc190b19pZHNbZmllbGRfZGVmWzpuYW1lXV0gPSBmaWQKICAgICAgICAgZW5kCi0gICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KCJAbmFtZXNfdG9faWRzIiwgbmFtZXNfdG9faWRzKQorICAgICAgICBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QG5hbWVzX3RvX2lkcywgbmFtZXNfdG9faWRzKQogICAgICAgZW5kCiAgICAgICBuYW1lc190b19pZHNbbmFtZV0KICAgICBlbmQKIAorICAgIGRlZiBzb3J0ZWRfZmllbGRfaWRzCisgICAgICBzb3J0ZWRfZmllbGRfaWRzID0gc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBzb3J0ZWRfZmllbGRfaWRzKQorICAgICAgdW5sZXNzIHNvcnRlZF9maWVsZF9pZHMKKyAgICAgICAgc29ydGVkX2ZpZWxkX2lkcyA9IHN0cnVjdF9maWVsZHMua2V5cy5zb3J0CisgICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAc29ydGVkX2ZpZWxkX2lkcywgc29ydGVkX2ZpZWxkX2lkcykKKyAgICAgIGVuZAorICAgICAgc29ydGVkX2ZpZWxkX2lkcworICAgIGVuZAorCiAgICAgZGVmIGVhY2hfZmllbGQKLSAgICAgIHN0cnVjdF9maWVsZHMua2V5cy5zb3J0LmVhY2ggZG8gfGZpZHwKKyAgICAgIHNvcnRlZF9maWVsZF9pZHMuZWFjaCBkbyB8ZmlkfAogICAgICAgICBkYXRhID0gc3RydWN0X2ZpZWxkc1tmaWRdCiAgICAgICAgIHlpZWxkIGZpZCwgZGF0YQogICAgICAgZW5kCkBAIC00NiwyOSArNTUsNTMgQEAKICAgICAgICAgdmFsdWUucmVhZChpcHJvdCkKICAgICAgIHdoZW4gVHlwZXM6Ok1BUAogICAgICAgICBrZXlfdHlwZSwgdmFsX3R5cGUsIHNpemUgPSBpcHJvdC5yZWFkX21hcF9iZWdpbgotICAgICAgICB2YWx1ZSA9IHt9Ci0gICAgICAgIHNpemUudGltZXMgZG8KLSAgICAgICAgICBrID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6a2V5XSkpCi0gICAgICAgICAgdiA9IHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOnZhbHVlXSkpCi0gICAgICAgICAgdmFsdWVba10gPSB2CisgICAgICAgICMgU2tpcCB0aGUgbWFwIGNvbnRlbnRzIGlmIHRoZSBkZWNsYXJlZCBrZXkgb3IgdmFsdWUgdHlwZXMgZG9uJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG9uZXMuCisgICAgICAgIGlmIChzaXplICE9IDAgJiYgKGtleV90eXBlICE9IGZpZWxkWzprZXldWzp0eXBlXSB8fCB2YWxfdHlwZSAhPSBmaWVsZFs6dmFsdWVdWzp0eXBlXSkpCisgICAgICAgICAgc2l6ZS50aW1lcyBkbworICAgICAgICAgICAgaXByb3Quc2tpcChrZXlfdHlwZSkKKyAgICAgICAgICAgIGlwcm90LnNraXAodmFsX3R5cGUpCisgICAgICAgICAgZW5kCisgICAgICAgICAgdmFsdWUgPSBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlID0ge30KKyAgICAgICAgICBzaXplLnRpbWVzIGRvCisgICAgICAgICAgICBrID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6a2V5XSkpCisgICAgICAgICAgICB2ID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6dmFsdWVdKSkKKyAgICAgICAgICAgIHZhbHVlW2tdID0gdgorICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgICAgaXByb3QucmVhZF9tYXBfZW5kCiAgICAgICB3aGVuIFR5cGVzOjpMSVNUCiAgICAgICAgIGVfdHlwZSwgc2l6ZSA9IGlwcm90LnJlYWRfbGlzdF9iZWdpbgotICAgICAgICB2YWx1ZSA9IEFycmF5Lm5ldyhzaXplKSBkbyB8bnwKLSAgICAgICAgICByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzplbGVtZW50XSkpCisgICAgICAgICMgU2tpcCB0aGUgbGlzdCBjb250ZW50cyBpZiB0aGUgZGVjbGFyZWQgZWxlbWVudCB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG9uZS4KKyAgICAgICAgaWYgKGVfdHlwZSAhPSBmaWVsZFs6ZWxlbWVudF1bOnR5cGVdKQorICAgICAgICAgIHNpemUudGltZXMgZG8KKyAgICAgICAgICAgIGlwcm90LnNraXAoZV90eXBlKQorICAgICAgICAgIGVuZAorICAgICAgICAgIHZhbHVlID0gbmlsCisgICAgICAgIGVsc2UKKyAgICAgICAgICB2YWx1ZSA9IEFycmF5Lm5ldyhzaXplKSBkbyB8bnwKKyAgICAgICAgICAgIHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOmVsZW1lbnRdKSkKKyAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICAgIGlwcm90LnJlYWRfbGlzdF9lbmQKICAgICAgIHdoZW4gVHlwZXM6OlNFVAogICAgICAgICBlX3R5cGUsIHNpemUgPSBpcHJvdC5yZWFkX3NldF9iZWdpbgotICAgICAgICB2YWx1ZSA9IFNldC5uZXcKLSAgICAgICAgc2l6ZS50aW1lcyBkbwotICAgICAgICAgIGVsZW1lbnQgPSByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzplbGVtZW50XSkpCi0gICAgICAgICAgdmFsdWUgPDwgZWxlbWVudAorICAgICAgICAjIFNraXAgdGhlIHNldCBjb250ZW50cyBpZiB0aGUgZGVjbGFyZWQgZWxlbWVudCB0eXBlIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG9uZS4KKyAgICAgICAgaWYgKGVfdHlwZSAhPSBmaWVsZFs6ZWxlbWVudF1bOnR5cGVdKQorICAgICAgICAgIHNpemUudGltZXMgZG8KKyAgICAgICAgICAgIGlwcm90LnNraXAoZV90eXBlKQorICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgdmFsdWUgPSBTZXQubmV3CisgICAgICAgICAgc2l6ZS50aW1lcyBkbworICAgICAgICAgICAgZWxlbWVudCA9IHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOmVsZW1lbnRdKSkKKyAgICAgICAgICAgIHZhbHVlIDw8IGVsZW1lbnQKKyAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICAgIGlwcm90LnJlYWRfc2V0X2VuZAogICAgICAgZWxzZQotICAgICAgICB2YWx1ZSA9IGlwcm90LnJlYWRfdHlwZShmaWVsZFs6dHlwZV0pCisgICAgICAgIHZhbHVlID0gaXByb3QucmVhZF90eXBlKGZpZWxkKQogICAgICAgZW5kCiAgICAgICB2YWx1ZQogICAgIGVuZApAQCAtNzcsNyArMTEwLDcgQEAKICAgICAgIGlmIGlzX2NvbnRhaW5lcj8gZmllbGRbOnR5cGVdCiAgICAgICAgIHdyaXRlX2NvbnRhaW5lcihvcHJvdCwgdmFsdWUsIGZpZWxkKQogICAgICAgZWxzZQotICAgICAgICBvcHJvdC53cml0ZV90eXBlKGZpZWxkWzp0eXBlXSwgdmFsdWUpCisgICAgICAgIG9wcm90LndyaXRlX3R5cGUoZmllbGQsIHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCmluZGV4IDY4YzVhZjAuLjAxMDU0NjMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgpAQCAtMzQsNCArMzQsNCBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCmluZGV4IDA4YTcxZGEuLjk3ZTU5MzUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKQEAgLTM0LDYgKzM0LDE4IEBACiAgICAgZW5kCiAgIGVuZAogCisgIG1vZHVsZSBUcmFuc3BvcnRVdGlscworICAgICMgRGVwcmVjYXRlZDogVXNlIFRocmlmdDo6Qnl0ZXMgaW5zdGVhZAorICAgIGRlZiBzZWxmLmdldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4KQorICAgICAgQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCisgICAgZW5kCisKKyAgICAjIERlcHJlY2F0ZWQ6IFVzZSBUaHJpZnQ6OkJ5dGVzIGluc3RlYWQKKyAgICBkZWYgc2VsZi5zZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCwgYnl0ZSkKKyAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4LCBieXRlKQorICAgIGVuZAorICBlbmQKKwogICBjbGFzcyBCYXNlVHJhbnNwb3J0CiAgICAgZGVmIG9wZW4/OyBlbmQKICAgICAKQEAgLTQxLDEzICs1MywzNSBAQAogCiAgICAgZGVmIGNsb3NlOyBlbmQKIAorICAgICMgUmVhZHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0cy4gSW4gUnVieSAxLjkrLCB0aGUgU3RyaW5nIHJldHVybmVkIHdpbGwgaGF2ZSBhIEJJTkFSWSAoYWthIEFTQ0lJOEJJVCkgZW5jb2RpbmcuCisgICAgIworICAgICMgc3ogLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0LgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcgYWN0aW5nIGFzIGEgYnl0ZSBidWZmZXIuCiAgICAgZGVmIHJlYWQoc3opCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFJldHVybnMgYW4gdW5zaWduZWQgYnl0ZSBhcyBhIEZpeG51bSBpbiB0aGUgcmFuZ2UgKDAuLjI1NSkuCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgYnVmID0gcmVhZF9hbGwoMSkKKyAgICAgIHJldHVybiBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoYnVmLCAwKQorICAgIGVuZAorCisgICAgIyBSZWFkcyBzaXplIGJ5dGVzIGFuZCBjb3BpZXMgdGhlbSBpbnRvIGJ1ZmZlclswLi5zaXplXS4KKyAgICBkZWYgcmVhZF9pbnRvX2J1ZmZlcihidWZmZXIsIHNpemUpCisgICAgICB0bXAgPSByZWFkX2FsbChzaXplKQorICAgICAgaSA9IDAKKyAgICAgIHRtcC5lYWNoX2J5dGUgZG8gfGJ5dGV8CisgICAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCisgICAgICAgIGkgKz0gMQorICAgICAgZW5kCisgICAgICBpCisgICAgZW5kCisKICAgICBkZWYgcmVhZF9hbGwoc2l6ZSkKLSAgICAgIGJ1ZiA9ICcnCi0gICAgCisgICAgICByZXR1cm4gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgaWYgc2l6ZSA8PSAwCisgICAgICBidWYgPSByZWFkKHNpemUpCiAgICAgICB3aGlsZSAoYnVmLmxlbmd0aCA8IHNpemUpCiAgICAgICAgIGNodW5rID0gcmVhZChzaXplIC0gYnVmLmxlbmd0aCkKICAgICAgICAgYnVmIDw8IGNodW5rCkBAIC01NSwxNiArODksMjkgQEAKICAgICAKICAgICAgIGJ1ZgogICAgIGVuZAotICAKKworICAgICMgV3JpdGVzIHRoZSBieXRlIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LiBJbiBSdWJ5IDEuOSssIHRoZSBidWZmZXIgd2lsbCBiZSBmb3JjZWQgaW50byBCSU5BUlkgZW5jb2RpbmcuCisgICAgIworICAgICMgYnVmIC0gQSBTdHJpbmcgYWN0aW5nIGFzIGEgYnl0ZSBidWZmZXIuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgogICAgIGRlZiB3cml0ZShidWYpOyBlbmQKICAgICBhbGlhc19tZXRob2QgOjw8LCA6d3JpdGUKIAogICAgIGRlZiBmbHVzaDsgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAogICAKICAgY2xhc3MgQmFzZVRyYW5zcG9ydEZhY3RvcnkKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFucykKICAgICAgIHJldHVybiB0cmFucwogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCmluZGV4IDhkZWFkNGUuLjRmZTljNDEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgpAQCAtMjQsOCArMjQsOCBAQAogICAgIAogICAgIGRlZiBpbml0aWFsaXplKHRyYW5zcG9ydCkKICAgICAgIEB0cmFuc3BvcnQgPSB0cmFuc3BvcnQKLSAgICAgIEB3YnVmID0gJycKLSAgICAgIEByYnVmID0gJycKKyAgICAgIEB3YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgIEByYnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICAgIEBpbmRleCA9IDAKICAgICBlbmQKIApAQCAtNDQsMzQgKzQ0LDc5IEBACiAKICAgICBkZWYgcmVhZChzeikKICAgICAgIEBpbmRleCArPSBzegotICAgICAgcmV0ID0gQHJidWYuc2xpY2UoQGluZGV4IC0gc3osIHN6KSB8fCAnJworICAgICAgcmV0ID0gQHJidWYuc2xpY2UoQGluZGV4IC0gc3osIHN6KSB8fCBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogCiAgICAgICBpZiByZXQubGVuZ3RoID09IDAKICAgICAgICAgQHJidWYgPSBAdHJhbnNwb3J0LnJlYWQoW3N6LCBERUZBVUxUX0JVRkZFUl0ubWF4KQogICAgICAgICBAaW5kZXggPSBzegotICAgICAgICByZXQgPSBAcmJ1Zi5zbGljZSgwLCBzeikgfHwgJycKKyAgICAgICAgcmV0ID0gQHJidWYuc2xpY2UoMCwgc3opIHx8IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBlbmQKIAogICAgICAgcmV0CiAgICAgZW5kCiAKKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICAjIElmIHRoZSByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIHRyeSB0byByZWFkIHVwIHRvIERFRkFVTFRfQlVGRkVSIG1vcmUgYnl0ZXMgaW50byBpdC4KKyAgICAgIGlmIEBpbmRleCA+PSBAcmJ1Zi5zaXplCisgICAgICAgIEByYnVmID0gQHRyYW5zcG9ydC5yZWFkKERFRkFVTFRfQlVGRkVSKQorICAgICAgICBAaW5kZXggPSAwCisgICAgICBlbmQKKworICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHJlYWQgYSBzaW5nbGUgYnl0ZS4gVXNpbmcgZ2V0X3N0cmluZ19ieXRlKCkgYXZvaWRzCisgICAgICAjIGFsbG9jYXRpbmcgYSB0ZW1wIHN0cmluZyBvZiBzaXplIDEgdW5uZWNlc3NhcmlseS4KKyAgICAgIEBpbmRleCArPSAxCisgICAgICByZXR1cm4gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKEByYnVmLCBAaW5kZXggLSAxKQorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnQgaW50byB0aGUgYnVmZmVyIHBhc3NlZC4KKyAgICAjCisgICAgIyBidWZmZXIgLSBUaGUgU3RyaW5nIChieXRlIGJ1ZmZlcikgdG8gd3JpdGUgZGF0YSB0bzsgdGhpcyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBCSU5BUlkgZW5jb2RpbmcuCisgICAgIyBzaXplICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGFuZCB3cml0ZSB0byB0aGUgYnVmZmVyLgorICAgICMKKyAgICAjIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICAgIGRlZiByZWFkX2ludG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSkKKyAgICAgIGkgPSAwCisgICAgICB3aGlsZSBpIDwgc2l6ZQorICAgICAgICAjIElmIHRoZSByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIHRyeSB0byByZWFkIHVwIHRvIERFRkFVTFRfQlVGRkVSIG1vcmUgYnl0ZXMgaW50byBpdC4KKyAgICAgICAgaWYgQGluZGV4ID49IEByYnVmLnNpemUKKyAgICAgICAgICBAcmJ1ZiA9IEB0cmFuc3BvcnQucmVhZChERUZBVUxUX0JVRkZFUikKKyAgICAgICAgICBAaW5kZXggPSAwCisgICAgICAgIGVuZAorCisgICAgICAgICMgVGhlIHJlYWQgYnVmZmVyIGhhcyBzb21lIGRhdGEgbm93LCBzbyBjb3B5IGJ5dGVzIG92ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgIGJ5dGUgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCkKKyAgICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgQGluZGV4ICs9IDEKKyAgICAgICAgaSArPSAxCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKwogICAgIGRlZiB3cml0ZShidWYpCi0gICAgICBAd2J1ZiA8PCBidWYKKyAgICAgIEB3YnVmIDw8IEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpCiAgICAgZW5kCiAKICAgICBkZWYgZmx1c2gKLSAgICAgIGlmIEB3YnVmICE9ICcnCisgICAgICB1bmxlc3MgQHdidWYuZW1wdHk/CiAgICAgICAgIEB0cmFuc3BvcnQud3JpdGUoQHdidWYpCi0gICAgICAgIEB3YnVmID0gJycKKyAgICAgICAgQHdidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgZW5kCiAgICAgICAKICAgICAgIEB0cmFuc3BvcnQuZmx1c2gKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYnVmZmVyZWQoI3tAdHJhbnNwb3J0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IDwgQmFzZVRyYW5zcG9ydEZhY3RvcnkKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpCiAgICAgICByZXR1cm4gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zcG9ydCkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgppbmRleCA1NThhZjc0Li45NTMxNzc4IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgpAQCAtMjIsOCArMjIsOCBAQAogICBjbGFzcyBGcmFtZWRUcmFuc3BvcnQgPCBCYXNlVHJhbnNwb3J0CiAgICAgZGVmIGluaXRpYWxpemUodHJhbnNwb3J0LCByZWFkPXRydWUsIHdyaXRlPXRydWUpCiAgICAgICBAdHJhbnNwb3J0ID0gdHJhbnNwb3J0Ci0gICAgICBAcmJ1ZiAgICAgID0gJycKLSAgICAgIEB3YnVmICAgICAgPSAnJworICAgICAgQHJidWYgICAgICA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICBAd2J1ZiAgICAgID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICAgIEByZWFkICAgICAgPSByZWFkCiAgICAgICBAd3JpdGUgICAgID0gd3JpdGUKICAgICAgIEBpbmRleCAgICAgID0gMApAQCAtNDQsMTcgKzQ0LDQzIEBACiAgICAgZGVmIHJlYWQoc3opCiAgICAgICByZXR1cm4gQHRyYW5zcG9ydC5yZWFkKHN6KSB1bmxlc3MgQHJlYWQKIAotICAgICAgcmV0dXJuICcnIGlmIHN6IDw9IDAKKyAgICAgIHJldHVybiBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciBpZiBzeiA8PSAwCiAKICAgICAgIHJlYWRfZnJhbWUgaWYgQGluZGV4ID49IEByYnVmLmxlbmd0aAogCiAgICAgICBAaW5kZXggKz0gc3oKLSAgICAgIEByYnVmLnNsaWNlKEBpbmRleCAtIHN6LCBzeikgfHwgJycKKyAgICAgIEByYnVmLnNsaWNlKEBpbmRleCAtIHN6LCBzeikgfHwgQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICBlbmQKIAotICAgIGRlZiB3cml0ZShidWYsc3o9bmlsKQorICAgIGRlZiByZWFkX2J5dGUKKyAgICAgIHJldHVybiBAdHJhbnNwb3J0LnJlYWRfYnl0ZSgpIHVubGVzcyBAcmVhZAorCisgICAgICByZWFkX2ZyYW1lIGlmIEBpbmRleCA+PSBAcmJ1Zi5sZW5ndGgKKworICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHJlYWQgYSBzaW5nbGUgYnl0ZS4gVXNpbmcgZ2V0X3N0cmluZ19ieXRlKCkgYXZvaWRzCisgICAgICAjIGFsbG9jYXRpbmcgYSB0ZW1wIHN0cmluZyBvZiBzaXplIDEgdW5uZWNlc3NhcmlseS4KKyAgICAgIEBpbmRleCArPSAxCisgICAgICByZXR1cm4gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKEByYnVmLCBAaW5kZXggLSAxKQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaW50b19idWZmZXIoYnVmZmVyLCBzaXplKQorICAgICAgaSA9IDAKKyAgICAgIHdoaWxlIGkgPCBzaXplCisgICAgICAgIHJlYWRfZnJhbWUgaWYgQGluZGV4ID49IEByYnVmLmxlbmd0aAorCisgICAgICAgICMgVGhlIHJlYWQgYnVmZmVyIGhhcyBzb21lIGRhdGEgbm93LCBzbyBjb3B5IGJ5dGVzIG92ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgIGJ5dGUgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCkKKyAgICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgQGluZGV4ICs9IDEKKyAgICAgICAgaSArPSAxCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZShidWYsIHN6PW5pbCkKICAgICAgIHJldHVybiBAdHJhbnNwb3J0LndyaXRlKGJ1ZikgdW5sZXNzIEB3cml0ZQogCisgICAgICBidWYgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKQogICAgICAgQHdidWYgPDwgKHN6ID8gYnVmWzAuLi5zel0gOiBidWYpCiAgICAgZW5kCiAKQEAgLTY2LDEwICs5MiwxNSBAQAogICAgICAgcmV0dXJuIEB0cmFuc3BvcnQuZmx1c2ggdW5sZXNzIEB3cml0ZQogCiAgICAgICBvdXQgPSBbQHdidWYubGVuZ3RoXS5wYWNrKCdOJykKKyAgICAgICMgQXJyYXkjcGFjayBzaG91bGQgcmV0dXJuIGEgQklOQVJZIGVuY29kZWQgU3RyaW5nLCBzbyBpdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHRvIGZvcmNlIGVuY29kaW5nCiAgICAgICBvdXQgPDwgQHdidWYKICAgICAgIEB0cmFuc3BvcnQud3JpdGUob3V0KQogICAgICAgQHRyYW5zcG9ydC5mbHVzaAotICAgICAgQHdidWYgPSAnJworICAgICAgQHdidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJmcmFtZWQoI3tAdHJhbnNwb3J0LnRvX3N9KSIKICAgICBlbmQKIAogICAgIHByaXZhdGUKQEAgLTg2LDUgKzExNyw5IEBACiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEZyYW1lZFRyYW5zcG9ydC5uZXcodHJhbnNwb3J0KQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiZnJhbWVkIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKaW5kZXggMjJjYWYwMi4uNWMxZGQ1YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCkBAIC0yMCwyMSArMjAsMjMgQEAKIAogcmVxdWlyZSAnbmV0L2h0dHAnCiByZXF1aXJlICduZXQvaHR0cHMnCityZXF1aXJlICdvcGVuc3NsJwogcmVxdWlyZSAndXJpJwogcmVxdWlyZSAnc3RyaW5naW8nCiAKIG1vZHVsZSBUaHJpZnQKICAgY2xhc3MgSFRUUENsaWVudFRyYW5zcG9ydCA8IEJhc2VUcmFuc3BvcnQKIAotICAgIGRlZiBpbml0aWFsaXplKHVybCkKKyAgICBkZWYgaW5pdGlhbGl6ZSh1cmwsIG9wdHMgPSB7fSkKICAgICAgIEB1cmwgPSBVUkkgdXJsCiAgICAgICBAaGVhZGVycyA9IHsnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnfQotICAgICAgQG91dGJ1ZiA9ICIiCisgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgIEBzc2xfdmVyaWZ5X21vZGUgPSBvcHRzLmZldGNoKDpzc2xfdmVyaWZ5X21vZGUsIE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj87IHRydWUgZW5kCiAgICAgZGVmIHJlYWQoc3opOyBAaW5idWYucmVhZCBzeiBlbmQKLSAgICBkZWYgd3JpdGUoYnVmKTsgQG91dGJ1ZiA8PCBidWYgZW5kCisgICAgZGVmIHdyaXRlKGJ1Zik7IEBvdXRidWYgPDwgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZikgZW5kCiAKICAgICBkZWYgYWRkX2hlYWRlcnMoaGVhZGVycykKICAgICAgIEBoZWFkZXJzID0gQGhlYWRlcnMubWVyZ2UoaGVhZGVycykKQEAgLTQyLDEwICs0NCwxOCBAQAogCiAgICAgZGVmIGZsdXNoCiAgICAgICBodHRwID0gTmV0OjpIVFRQLm5ldyBAdXJsLmhvc3QsIEB1cmwucG9ydAotICAgICAgaHR0cC51c2Vfc3NsID0gQHVybC5zY2hlbWUgPT0gImh0dHBzIgotICAgICAgcmVzcCwgZGF0YSA9IGh0dHAucG9zdChAdXJsLnJlcXVlc3RfdXJpLCBAb3V0YnVmLCBAaGVhZGVycykKKyAgICAgIGh0dHAudXNlX3NzbCA9IEB1cmwuc2NoZW1lID09ICdodHRwcycKKyAgICAgIGh0dHAudmVyaWZ5X21vZGUgPSBAc3NsX3ZlcmlmeV9tb2RlIGlmIEB1cmwuc2NoZW1lID09ICdodHRwcycKKyAgICAgIHJlc3AgPSBodHRwLnBvc3QoQHVybC5yZXF1ZXN0X3VyaSwgQG91dGJ1ZiwgQGhlYWRlcnMpCisgICAgICBkYXRhID0gcmVzcC5ib2R5CisgICAgICBkYXRhID0gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGRhdGEpCiAgICAgICBAaW5idWYgPSBTdHJpbmdJTy5uZXcgZGF0YQotICAgICAgQG91dGJ1ZiA9ICIiCisgICAgZW5zdXJlCisgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIkB7c2VsZi51cmx9IgogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgppbmRleCBiZTM0OGFhLi5jY2VjNjhmIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgpAQCAtMzIsOCArMzIsMTEgQEAKIAogICAgIGRlZiBvcGVuPzsgbm90IEBpbnB1dC5jbG9zZWQ/IG9yIG5vdCBAb3V0cHV0LmNsb3NlZD8gZW5kCiAgICAgZGVmIHJlYWQoc3opOyBAaW5wdXQucmVhZChzeikgZW5kCi0gICAgZGVmIHdyaXRlKGJ1Zik7IEBvdXRwdXQud3JpdGUoYnVmKSBlbmQKKyAgICBkZWYgd3JpdGUoYnVmKTsgQG91dHB1dC53cml0ZShCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKSkgZW5kCiAgICAgZGVmIGNsb3NlOyBAaW5wdXQuY2xvc2U7IEBvdXRwdXQuY2xvc2UgZW5kCiAgICAgZGVmIHRvX2lvOyBAaW5wdXQgZW5kICMgd2UncmUgYXNzdW1pbmcgdGhpcyBpcyB1c2VkIGluIGEgSU8uc2VsZWN0IGZvciByZWFkaW5nCisgICAgZGVmIHRvX3MKKyAgICAgICJpb3N0cmVhbShpbnB1dD0je0BpbnB1dC50b19zfSxvdXRwdXQ9I3tAb3V0cHV0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgppbmRleCAzMTY5YjJiLi40NjllYTczIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgIyB0aGlzIGJlaGF2aW9yIGlzIG5vIGxvbmdlciByZXF1aXJlZC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIGl0CiAgICAgIyBnbyBhaGVhZCwganVzdCBtYWtlIHN1cmUgdGhlIHNwZWNzIHBhc3MKICAgICBkZWYgaW5pdGlhbGl6ZShidWZmZXIgPSBuaWwpCi0gICAgICBAYnVmID0gYnVmZmVyIHx8ICcnCisgICAgICBAYnVmID0gYnVmZmVyID8gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZmZlcikgOiBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgQGluZGV4ID0gMAogICAgIGVuZAogCkBAIC00OCw3ICs0OCw3IEBACiAKICAgICAjIHRoaXMgbWV0aG9kIGRvZXMgbm90IHVzZSB0aGUgcGFzc2VkIG9iamVjdCBkaXJlY3RseSBidXQgY29waWVzIGl0CiAgICAgZGVmIHJlc2V0X2J1ZmZlcihuZXdfYnVmID0gJycpCi0gICAgICBAYnVmLnJlcGxhY2UgbmV3X2J1ZgorICAgICAgQGJ1Zi5yZXBsYWNlIEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhuZXdfYnVmKQogICAgICAgQGluZGV4ID0gMAogICAgIGVuZAogCkBAIC03MCw4ICs3MCwzNyBAQAogICAgICAgZGF0YQogICAgIGVuZAogCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgcmFpc2UgRU9GRXJyb3IubmV3KCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiKSBpZiBAaW5kZXggPj0gQGJ1Zi5zaXplCisgICAgICB2YWwgPSBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQGJ1ZiwgQGluZGV4KQorICAgICAgQGluZGV4ICs9IDEKKyAgICAgIGlmIEBpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFCisgICAgICAgIEBidWYgPSBAYnVmLnNsaWNlKEBpbmRleC4uLTEpCisgICAgICAgIEBpbmRleCA9IDAKKyAgICAgIGVuZAorICAgICAgdmFsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pbnRvX2J1ZmZlcihidWZmZXIsIHNpemUpCisgICAgICBpID0gMAorICAgICAgd2hpbGUgaSA8IHNpemUKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IubmV3KCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiKSBpZiBAaW5kZXggPj0gQGJ1Zi5zaXplCisKKyAgICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHNvIGNvcHkgYnl0ZXMgb3ZlciB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgYnl0ZSA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAYnVmLCBAaW5kZXgpCisgICAgICAgIEJ5dGVzLnNldF9zdHJpbmdfYnl0ZShidWZmZXIsIGksIGJ5dGUpCisgICAgICAgIEBpbmRleCArPSAxCisgICAgICAgIGkgKz0gMQorICAgICAgZW5kCisgICAgICBpZiBAaW5kZXggPj0gR0FSQkFHRV9CVUZGRVJfU0laRQorICAgICAgICBAYnVmID0gQGJ1Zi5zbGljZShAaW5kZXguLi0xKQorICAgICAgICBAaW5kZXggPSAwCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKwogICAgIGRlZiB3cml0ZSh3YnVmKQotICAgICAgQGJ1ZiA8PCB3YnVmCisgICAgICBAYnVmIDw8IEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyh3YnVmKQogICAgIGVuZAogCiAgICAgZGVmIGZsdXNoCkBAIC05Miw1ICsxMjEsOSBAQAogICAgICAgZW5kCiAgICAgICBvdXQuam9pbigiICIpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtZW1vcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IDdmZWI5YWIuLjUwMDAyMzIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01OSw1ICs1OSwxMCBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCisgICAgZW5kCisKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCmluZGV4IDliYjIwMzYuLmY1ZTZmM2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgpAQCAtMzMsMjUgKzMzLDI4IEBACiAgICAgYXR0cl9hY2Nlc3NvciA6aGFuZGxlLCA6dGltZW91dAogCiAgICAgZGVmIG9wZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIGFkZHJpbmZvID0gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCkuZmlyc3QKLSAgICAgICAgQGhhbmRsZSA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQotICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKKyAgICAgIGZvciBhZGRyaW5mbyBpbiA6OlNvY2tldDo6Z2V0YWRkcmluZm8oQGhvc3QsIEBwb3J0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkgZG8KICAgICAgICAgYmVnaW4KLSAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgIHJlc2N1ZSBFcnJubzo6RUlOUFJPR1JFU1MKLSAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCi0gICAgICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb25uZWN0aW9uIHRpbWVvdXQgdG8gI3tAZGVzY30iKQotICAgICAgICAgIGVuZAorICAgICAgICAgIHNvY2tldCA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICAgIHNvY2tldC5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQorICAgICAgICAgIHNvY2thZGRyID0gOjpTb2NrZXQuc29ja2FkZHJfaW4oYWRkcmluZm9bMV0sIGFkZHJpbmZvWzNdKQogICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgICAgcmVzY3VlIEVycm5vOjpFSVNDT05OCisgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCisgICAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBzb2NrZXQgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuIEBoYW5kbGUgPSBzb2NrZXQKKyAgICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICAgIG5leHQKICAgICAgICAgZW5kCi0gICAgICAgIEBoYW5kbGUKLSAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKLSAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgICAgZW5kCisgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj8KQEAgLTYwLDYgKzYzLDcgQEAKIAogICAgIGRlZiB3cml0ZShzdHIpCiAgICAgICByYWlzZSBJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIgdW5sZXNzIG9wZW4/CisgICAgICBzdHIgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2Rpbmcoc3RyKQogICAgICAgYmVnaW4KICAgICAgICAgaWYgQHRpbWVvdXQubmlsPyBvciBAdGltZW91dCA9PSAwCiAgICAgICAgICAgQGhhbmRsZS53cml0ZShzdHIpCkBAIC0xMzAsOCArMTM0LDEwIEBACiAgICAgICBAaGFuZGxlID0gbmlsCiAgICAgZW5kCiAKLSAgICBkZWYgdG9faW8KLSAgICAgIEBoYW5kbGUKKyAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAic29ja2V0KCN7QGhvc3R9OiN7QHBvcnR9KSIKICAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJkNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCkBAIC0wLDAgKzEsNDEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzb2NrZXQnCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgU1NMU2VydmVyU29ja2V0IDwgU2VydmVyU29ja2V0CisgICAgZGVmIGluaXRpYWxpemUoaG9zdF9vcl9wb3J0LCBwb3J0ID0gbmlsLCBzc2xfY29udGV4dCA9IG5pbCkKKyAgICAgIHN1cGVyKGhvc3Rfb3JfcG9ydCwgcG9ydCkKKyAgICAgIEBzc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CisgICAgZW5kCisKKyAgICBhdHRyX2FjY2Vzc29yIDpzc2xfY29udGV4dAorCisgICAgZGVmIGxpc3RlbgorICAgICAgc29ja2V0ID0gVENQU2VydmVyLm5ldyhAaG9zdCwgQHBvcnQpCisgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTZXJ2ZXIubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI5NmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIKQEAgLTAsMCArMSw1MSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgU1NMU29ja2V0IDwgU29ja2V0CisgICAgZGVmIGluaXRpYWxpemUoaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB0aW1lb3V0PW5pbCwgc3NsX2NvbnRleHQ9bmlsKQorICAgICAgc3VwZXIoaG9zdCwgcG9ydCwgdGltZW91dCkKKyAgICAgIEBzc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CisgICAgZW5kCisKKyAgICBhdHRyX2FjY2Vzc29yIDpzc2xfY29udGV4dAorCisgICAgZGVmIG9wZW4KKyAgICAgIHNvY2tldCA9IHN1cGVyCisgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQorICAgICAgYmVnaW4KKyAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrCisgICAgICAgIEBoYW5kbGUucG9zdF9jb25uZWN0aW9uX2NoZWNrKEBob3N0KQorICAgICAgICBAaGFuZGxlCisgICAgICByZXNjdWUgSU86OldhaXRSZWFkYWJsZQorICAgICAgICBJTy5zZWxlY3QoWyBAaGFuZGxlIF0sIG5pbCwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgcmV0cnkKKyAgICAgIHJlc2N1ZSBJTzo6V2FpdFdyaXRhYmxlCisgICAgICAgIElPLnNlbGVjdChuaWwsIFsgQGhhbmRsZSBdLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICByZXRyeQorICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNzbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IGExMzVkMjUuLjA1N2QxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgpAQCAtNTYsNSArNTYsOSBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKaW5kZXggOGY2OTJlNC4uNWRmZmQ1OSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgpAQCAtMzYsNSArMzYsOSBAQAogICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgb3BlbiBVTklYIHNvY2tldCBhdCAje0BwYXRofSIpCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiCmluZGV4IGE3MDU4ZjIuLjQ5MGM1NWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiCkBAIC04NywxMiArODcsOSBAQAogICAgIGVuZAogCiAgICAgZGVmID09KG90aGVyKQotICAgICAgb3RoZXIgIT0gbmlsICYmIEBzZXRmaWVsZCA9PSBvdGhlci5nZXRfc2V0X2ZpZWxkICYmIEB2YWx1ZSA9PSBvdGhlci5nZXRfdmFsdWUKKyAgICAgIG90aGVyLmVxdWFsPyhzZWxmKSB8fCBvdGhlci5pbnN0YW5jZV9vZj8oc2VsZi5jbGFzcykgJiYgQHNldGZpZWxkID09IG90aGVyLmdldF9zZXRfZmllbGQgJiYgQHZhbHVlID09IG90aGVyLmdldF92YWx1ZQogICAgIGVuZAotCi0gICAgZGVmIGVxbD8ob3RoZXIpCi0gICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIHNlbGYgPT0gb3RoZXIKLSAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOmVxbD8sIDo9PQogCiAgICAgZGVmIGhhc2gKICAgICAgIFtzZWxmLmNsYXNzLm5hbWUsIEBzZXRmaWVsZCwgQHZhbHVlXS5oYXNoCkBAIC0xNzYsNCArMTczLDQgQEAKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NldHVwLnJiIGIvbGliL3JiL3NldHVwLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjBjODI2Li4wMDAwMDAwCi0tLSBhL2xpYi9yYi9zZXR1cC5yYgorKysgL2Rldi9udWxsCkBAIC0xLDE1ODUgKzAsMCBAQAotIwotIyBzZXR1cC5yYgotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raQotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZS4KLSMgWW91IGNhbiBkaXN0cmlidXRlL21vZGlmeSB0aGlzIHByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mCi0jIHRoZSBHTlUgTEdQTCwgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEuCi0jCi0KLXVubGVzcyBFbnVtZXJhYmxlLm1ldGhvZF9kZWZpbmVkPyg6bWFwKSAgICMgUnVieSAxLjQuNgotICBtb2R1bGUgRW51bWVyYWJsZQotICAgIGFsaWFzIG1hcCBjb2xsZWN0Ci0gIGVuZAotZW5kCi0KLXVubGVzcyBGaWxlLnJlc3BvbmRfdG8/KDpyZWFkKSAgICMgUnVieSAxLjYKLSAgZGVmIEZpbGUucmVhZChmbmFtZSkKLSAgICBvcGVuKGZuYW1lKSB7fGZ8Ci0gICAgICByZXR1cm4gZi5yZWFkCi0gICAgfQotICBlbmQKLWVuZAotCi11bmxlc3MgRXJybm8uY29uc3RfZGVmaW5lZD8oOkVOT1RFTVBUWSkgICAjIFdpbmRvd3M/Ci0gIG1vZHVsZSBFcnJubwotICAgIGNsYXNzIEVOT1RFTVBUWQotICAgICAgIyBXZSBkbyBub3QgcmFpc2UgdGhpcyBleGNlcHRpb24sIGltcGxlbWVudGF0aW9uIGlzIG5vdCBuZWVkZWQuCi0gICAgZW5kCi0gIGVuZAotZW5kCi0KLWRlZiBGaWxlLmJpbnJlYWQoZm5hbWUpCi0gIG9wZW4oZm5hbWUsICdyYicpIHt8ZnwKLSAgICByZXR1cm4gZi5yZWFkCi0gIH0KLWVuZAotCi0jIGZvciBjb3JydXB0ZWQgV2luZG93cycgc3RhdCgyKQotZGVmIEZpbGUuZGlyPyhwYXRoKQotICBGaWxlLmRpcmVjdG9yeT8oKHBhdGhbLTEsMV0gPT0gJy8nKSA/IHBhdGggOiBwYXRoICsgJy8nKQotZW5kCi0KLQotY2xhc3MgQ29uZmlnVGFibGUKLQotICBpbmNsdWRlIEVudW1lcmFibGUKLQotICBkZWYgaW5pdGlhbGl6ZShyYmNvbmZpZykKLSAgICBAcmJjb25maWcgPSByYmNvbmZpZwotICAgIEBpdGVtcyA9IFtdCi0gICAgQHRhYmxlID0ge30KLSAgICAjIG9wdGlvbnMKLSAgICBAaW5zdGFsbF9wcmVmaXggPSBuaWwKLSAgICBAY29uZmlnX29wdCA9IG5pbAotICAgIEB2ZXJib3NlID0gdHJ1ZQotICAgIEBub19oYXJtID0gZmFsc2UKLSAgZW5kCi0KLSAgYXR0cl9hY2Nlc3NvciA6aW5zdGFsbF9wcmVmaXgKLSAgYXR0cl9hY2Nlc3NvciA6Y29uZmlnX29wdAotCi0gIGF0dHJfd3JpdGVyIDp2ZXJib3NlCi0KLSAgZGVmIHZlcmJvc2U/Ci0gICAgQHZlcmJvc2UKLSAgZW5kCi0KLSAgYXR0cl93cml0ZXIgOm5vX2hhcm0KLQotICBkZWYgbm9faGFybT8KLSAgICBAbm9faGFybQotICBlbmQKLQotICBkZWYgW10oa2V5KQotICAgIGxvb2t1cChrZXkpLnJlc29sdmUoc2VsZikKLSAgZW5kCi0KLSAgZGVmIFtdPShrZXksIHZhbCkKLSAgICBsb29rdXAoa2V5KS5zZXQgdmFsCi0gIGVuZAotCi0gIGRlZiBuYW1lcwotICAgIEBpdGVtcy5tYXAge3xpfCBpLm5hbWUgfQotICBlbmQKLQotICBkZWYgZWFjaCgmYmxvY2spCi0gICAgQGl0ZW1zLmVhY2goJmJsb2NrKQotICBlbmQKLQotICBkZWYga2V5PyhuYW1lKQotICAgIEB0YWJsZS5rZXk/KG5hbWUpCi0gIGVuZAotCi0gIGRlZiBsb29rdXAobmFtZSkKLSAgICBAdGFibGVbbmFtZV0gb3Igc2V0dXBfcmJfZXJyb3IgIm5vIHN1Y2ggY29uZmlnIGl0ZW06ICN7bmFtZX0iCi0gIGVuZAotCi0gIGRlZiBhZGQoaXRlbSkKLSAgICBAaXRlbXMucHVzaCBpdGVtCi0gICAgQHRhYmxlW2l0ZW0ubmFtZV0gPSBpdGVtCi0gIGVuZAotCi0gIGRlZiByZW1vdmUobmFtZSkKLSAgICBpdGVtID0gbG9va3VwKG5hbWUpCi0gICAgQGl0ZW1zLmRlbGV0ZV9pZiB7fGl8IGkubmFtZSA9PSBuYW1lIH0KLSAgICBAdGFibGUuZGVsZXRlX2lmIHt8bmFtZSwgaXwgaS5uYW1lID09IG5hbWUgfQotICAgIGl0ZW0KLSAgZW5kCi0KLSAgZGVmIGxvYWRfc2NyaXB0KHBhdGgsIGluc3QgPSBuaWwpCi0gICAgaWYgRmlsZS5maWxlPyhwYXRoKQotICAgICAgTWV0YUNvbmZpZ0Vudmlyb25tZW50Lm5ldyhzZWxmLCBpbnN0KS5pbnN0YW5jZV9ldmFsIEZpbGUucmVhZChwYXRoKSwgcGF0aAotICAgIGVuZAotICBlbmQKLQotICBkZWYgc2F2ZWZpbGUKLSAgICAnLmNvbmZpZycKLSAgZW5kCi0KLSAgZGVmIGxvYWRfc2F2ZWZpbGUKLSAgICBiZWdpbgotICAgICAgRmlsZS5mb3JlYWNoKHNhdmVmaWxlKCkpIGRvIHxsaW5lfAotICAgICAgICBrLCB2ID0gKmxpbmUuc3BsaXQoLz0vLCAyKQotICAgICAgICBzZWxmW2tdID0gdi5zdHJpcAotICAgICAgZW5kCi0gICAgcmVzY3VlIEVycm5vOjpFTk9FTlQKLSAgICAgIHNldHVwX3JiX2Vycm9yICQhLm1lc3NhZ2UgKyAiXG4je0ZpbGUuYmFzZW5hbWUoJDApfSBjb25maWcgZmlyc3QiCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBzYXZlCi0gICAgQGl0ZW1zLmVhY2gge3xpfCBpLnZhbHVlIH0KLSAgICBGaWxlLm9wZW4oc2F2ZWZpbGUoKSwgJ3cnKSB7fGZ8Ci0gICAgICBAaXRlbXMuZWFjaCBkbyB8aXwKLSAgICAgICAgZi5wcmludGYgIiVzPSVzXG4iLCBpLm5hbWUsIGkudmFsdWUgaWYgaS52YWx1ZT8gYW5kIGkudmFsdWUKLSAgICAgIGVuZAotICAgIH0KLSAgZW5kCi0KLSAgZGVmIGxvYWRfc3RhbmRhcmRfZW50cmllcwotICAgIHN0YW5kYXJkX2VudHJpZXMoQHJiY29uZmlnKS5lYWNoIGRvIHxlbnR8Ci0gICAgICBhZGQgZW50Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBzdGFuZGFyZF9lbnRyaWVzKHJiY29uZmlnKQotICAgIGMgPSByYmNvbmZpZwotCi0gICAgcnVieXBhdGggPSBGaWxlLmpvaW4oY1snYmluZGlyJ10sIGNbJ3J1YnlfaW5zdGFsbF9uYW1lJ10gKyBjWydFWEVFWFQnXSkKLQotICAgIG1ham9yID0gY1snTUFKT1InXS50b19pCi0gICAgbWlub3IgPSBjWydNSU5PUiddLnRvX2kKLSAgICB0ZWVueSA9IGNbJ1RFRU5ZJ10udG9faQotICAgIHZlcnNpb24gPSAiI3ttYWpvcn0uI3ttaW5vcn0iCi0KLSAgICAjIHJ1YnkgdmVyLiA+PSAxLjQuND8KLSAgICBuZXdwYXRoX3AgPSAoKG1ham9yID49IDIpIG9yCi0gICAgICAgICAgICAgICAgICgobWFqb3IgPT0gMSkgYW5kCi0gICAgICAgICAgICAgICAgICAoKG1pbm9yID49IDUpIG9yCi0gICAgICAgICAgICAgICAgICAgKChtaW5vciA9PSA0KSBhbmQgKHRlZW55ID49IDQpKSkpKQotCi0gICAgaWYgY1sncnVieWxpYmRpciddCi0gICAgICAjIFYgPiAxLjYuMwotICAgICAgbGlicnVieSAgICAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5IgotICAgICAgbGlicnVieXZlciAgICAgID0gY1sncnVieWxpYmRpciddCi0gICAgICBsaWJydWJ5dmVyYXJjaCAgPSBjWydhcmNoZGlyJ10KLSAgICAgIHNpdGVydWJ5ICAgICAgICA9IGNbJ3NpdGVkaXInXQotICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gY1snc2l0ZWxpYmRpciddCi0gICAgICBzaXRlcnVieXZlcmFyY2ggPSBjWydzaXRlYXJjaGRpciddCi0gICAgZWxzaWYgbmV3cGF0aF9wCi0gICAgICAjIDEuNC40IDw9IFYgPD0gMS42LjMKLSAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKLSAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259IgotICAgICAgbGlicnVieXZlcmFyY2ggID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vI3tjWydhcmNoJ119IgotICAgICAgc2l0ZXJ1YnkgICAgICAgID0gY1snc2l0ZWRpciddCi0gICAgICBzaXRlcnVieXZlciAgICAgPSAiJHNpdGVydWJ5LyN7dmVyc2lvbn0iCi0gICAgICBzaXRlcnVieXZlcmFyY2ggPSAiJHNpdGVydWJ5dmVyLyN7Y1snYXJjaCddfSIKLSAgICBlbHNlCi0gICAgICAjIFYgPCAxLjQuNAotICAgICAgbGlicnVieSAgICAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5IgotICAgICAgbGlicnVieXZlciAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0iCi0gICAgICBsaWJydWJ5dmVyYXJjaCAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufS8je2NbJ2FyY2gnXX0iCi0gICAgICBzaXRlcnVieSAgICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufS9zaXRlX3J1YnkiCi0gICAgICBzaXRlcnVieXZlciAgICAgPSBzaXRlcnVieQotICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gIiRzaXRlcnVieXZlci8je2NbJ2FyY2gnXX0iCi0gICAgZW5kCi0gICAgcGFyYW1ldGVyaXplID0gbGFtYmRhIHt8cGF0aHwKLSAgICAgIHBhdGguc3ViKC9cQSN7UmVnZXhwLnF1b3RlKGNbJ3ByZWZpeCddKX0vLCAnJHByZWZpeCcpCi0gICAgfQotCi0gICAgaWYgYXJnID0gY1snY29uZmlndXJlX2FyZ3MnXS5zcGxpdC5kZXRlY3Qge3xhcmd8IC8tLXdpdGgtbWFrZS1wcm9nPS8gPX4gYXJnIH0KLSAgICAgIG1ha2Vwcm9nID0gYXJnLnN1YigvJy8sICcnKS5zcGxpdCgvPS8sIDIpWzFdCi0gICAgZWxzZQotICAgICAgbWFrZXByb2cgPSAnbWFrZScKLSAgICBlbmQKLQotICAgIFsKLSAgICAgIEV4ZWNJdGVtLm5ldygnaW5zdGFsbGRpcnMnLCAnc3RkL3NpdGUvaG9tZScsCi0gICAgICAgICAgICAgICAgICAgJ3N0ZDogaW5zdGFsbCB1bmRlciBsaWJydWJ5OyBzaXRlOiBpbnN0YWxsIHVuZGVyIHNpdGVfcnVieTsgaG9tZTogaW5zdGFsbCB1bmRlciAkSE9NRScpXAotICAgICAgICAgIHt8dmFsLCB0YWJsZXwKLSAgICAgICAgICAgIGNhc2UgdmFsCi0gICAgICAgICAgICB3aGVuICdzdGQnCi0gICAgICAgICAgICAgIHRhYmxlWydyYmRpciddID0gJyRsaWJydWJ5dmVyJwotICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckbGlicnVieXZlcmFyY2gnCi0gICAgICAgICAgICB3aGVuICdzaXRlJwotICAgICAgICAgICAgICB0YWJsZVsncmJkaXInXSA9ICckc2l0ZXJ1Ynl2ZXInCi0gICAgICAgICAgICAgIHRhYmxlWydzb2RpciddID0gJyRzaXRlcnVieXZlcmFyY2gnCi0gICAgICAgICAgICB3aGVuICdob21lJwotICAgICAgICAgICAgICBzZXR1cF9yYl9lcnJvciAnJEhPTUUgd2FzIG5vdCBzZXQnIHVubGVzcyBFTlZbJ0hPTUUnXQotICAgICAgICAgICAgICB0YWJsZVsncHJlZml4J10gPSBFTlZbJ0hPTUUnXQotICAgICAgICAgICAgICB0YWJsZVsncmJkaXInXSA9ICckbGliZGlyL3J1YnknCi0gICAgICAgICAgICAgIHRhYmxlWydzb2RpciddID0gJyRsaWJkaXIvcnVieScKLSAgICAgICAgICAgIGVuZAotICAgICAgICAgIH0sCi0gICAgICBQYXRoSXRlbS5uZXcoJ3ByZWZpeCcsICdwYXRoJywgY1sncHJlZml4J10sCi0gICAgICAgICAgICAgICAgICAgJ3BhdGggcHJlZml4IG9mIHRhcmdldCBlbnZpcm9ubWVudCcpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdiaW5kaXInLCAncGF0aCcsIHBhcmFtZXRlcml6ZS5jYWxsKGNbJ2JpbmRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgY29tbWFuZHMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbGliZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydsaWJkaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGxpYnJhcmllcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdkYXRhZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydkYXRhZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBzaGFyZWQgZGF0YScpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdtYW5kaXInLCAncGF0aCcsIHBhcmFtZXRlcml6ZS5jYWxsKGNbJ21hbmRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgbWFuIHBhZ2VzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3N5c2NvbmZkaXInLCAncGF0aCcsIHBhcmFtZXRlcml6ZS5jYWxsKGNbJ3N5c2NvbmZkaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHN5c3RlbSBjb25maWd1cmF0aW9uIGZpbGVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xvY2Fsc3RhdGVkaXInLCAncGF0aCcsIHBhcmFtZXRlcml6ZS5jYWxsKGNbJ2xvY2Fsc3RhdGVkaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGxvY2FsIHN0YXRlIGRhdGEnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbGlicnVieScsICdwYXRoJywgbGlicnVieSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgcnVieSBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbGlicnVieXZlcicsICdwYXRoJywgbGlicnVieXZlciwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc3RhbmRhcmQgcnVieSBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbGlicnVieXZlcmFyY2gnLCAncGF0aCcsIGxpYnJ1Ynl2ZXJhcmNoLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBzdGFuZGFyZCBydWJ5IGV4dGVuc2lvbnMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1YnknLCAncGF0aCcsIHNpdGVydWJ5LAotICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciB2ZXJzaW9uLWluZGVwZW5kZW50IGF1eCBydWJ5IGxpYnJhcmllcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdzaXRlcnVieXZlcicsICdwYXRoJywgc2l0ZXJ1Ynl2ZXIsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGF1eCBydWJ5IGxpYnJhcmllcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdzaXRlcnVieXZlcmFyY2gnLCAncGF0aCcsIHNpdGVydWJ5dmVyYXJjaCwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgYXV4IHJ1YnkgYmluYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygncmJkaXInLCAncGF0aCcsICckc2l0ZXJ1Ynl2ZXInLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBydWJ5IHNjcmlwdHMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc29kaXInLCAncGF0aCcsICckc2l0ZXJ1Ynl2ZXJhcmNoJywKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgcnVieSBleHRlbnRpb25zJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3J1YnlwYXRoJywgJ3BhdGgnLCBydWJ5cGF0aCwKLSAgICAgICAgICAgICAgICAgICAndGhlIHBhdGggdG8gc2V0IHRvICMhIGxpbmUnKSwKLSAgICAgIFByb2dyYW1JdGVtLm5ldygncnVieXByb2cnLCAnbmFtZScsIHJ1YnlwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICd0aGUgcnVieSBwcm9ncmFtIHVzaW5nIGZvciBpbnN0YWxsYXRpb24nKSwKLSAgICAgIFByb2dyYW1JdGVtLm5ldygnbWFrZXByb2cnLCAnbmFtZScsIG1ha2Vwcm9nLAotICAgICAgICAgICAgICAgICAgICAgICd0aGUgbWFrZSBwcm9ncmFtIHRvIGNvbXBpbGUgcnVieSBleHRlbnRpb25zJyksCi0gICAgICBTZWxlY3RJdGVtLm5ldygnc2hlYmFuZycsICdhbGwvcnVieS9uZXZlcicsICdydWJ5JywKLSAgICAgICAgICAgICAgICAgICAgICdzaGViYW5nIGxpbmUgKCMhKSBlZGl0aW5nIG1vZGUnKSwKLSAgICAgIEJvb2xJdGVtLm5ldygnd2l0aG91dC1leHQnLCAneWVzL25vJywgJ25vJywKLSAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgY29tcGlsZS9pbnN0YWxsIHJ1YnkgZXh0ZW50aW9ucycpCi0gICAgXQotICBlbmQKLSAgcHJpdmF0ZSA6c3RhbmRhcmRfZW50cmllcwotCi0gIGRlZiBsb2FkX211bHRpcGFja2FnZV9lbnRyaWVzCi0gICAgbXVsdGlwYWNrYWdlX2VudHJpZXMoKS5lYWNoIGRvIHxlbnR8Ci0gICAgICBhZGQgZW50Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBtdWx0aXBhY2thZ2VfZW50cmllcwotICAgIFsKLSAgICAgIFBhY2thZ2VTZWxlY3Rpb25JdGVtLm5ldygnd2l0aCcsICduYW1lLG5hbWUuLi4nLCAnJywgJ0FMTCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UgbmFtZXMgdGhhdCB5b3Ugd2FudCB0byBpbnN0YWxsJyksCi0gICAgICBQYWNrYWdlU2VsZWN0aW9uSXRlbS5uZXcoJ3dpdGhvdXQnLCAnbmFtZSxuYW1lLi4uJywgJycsICdOT05FJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZSBuYW1lcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBpbnN0YWxsJykKLSAgICBdCi0gIGVuZAotICBwcml2YXRlIDptdWx0aXBhY2thZ2VfZW50cmllcwotCi0gIEFMSUFTRVMgPSB7Ci0gICAgJ3N0ZC1ydWJ5JyAgICAgICAgID0+ICdsaWJydWJ5dmVyJywKLSAgICAnc3RkcnVieScgICAgICAgICAgPT4gJ2xpYnJ1Ynl2ZXInLAotICAgICdydWJ5bGliZGlyJyAgICAgICA9PiAnbGlicnVieXZlcicsCi0gICAgJ2FyY2hkaXInICAgICAgICAgID0+ICdsaWJydWJ5dmVyYXJjaCcsCi0gICAgJ3NpdGUtcnVieS1jb21tb24nID0+ICdzaXRlcnVieScsICAgICAjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgJ3NpdGUtcnVieScgICAgICAgID0+ICdzaXRlcnVieXZlcicsICAjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgJ2Jpbi1kaXInICAgICAgICAgID0+ICdiaW5kaXInLAotICAgICdiaW4tZGlyJyAgICAgICAgICA9PiAnYmluZGlyJywKLSAgICAncmItZGlyJyAgICAgICAgICAgPT4gJ3JiZGlyJywKLSAgICAnc28tZGlyJyAgICAgICAgICAgPT4gJ3NvZGlyJywKLSAgICAnZGF0YS1kaXInICAgICAgICAgPT4gJ2RhdGFkaXInLAotICAgICdydWJ5LXBhdGgnICAgICAgICA9PiAncnVieXBhdGgnLAotICAgICdydWJ5LXByb2cnICAgICAgICA9PiAncnVieXByb2cnLAotICAgICdydWJ5JyAgICAgICAgICAgICA9PiAncnVieXByb2cnLAotICAgICdtYWtlLXByb2cnICAgICAgICA9PiAnbWFrZXByb2cnLAotICAgICdtYWtlJyAgICAgICAgICAgICA9PiAnbWFrZXByb2cnCi0gIH0KLQotICBkZWYgZml4dXAKLSAgICBBTElBU0VTLmVhY2ggZG8gfGFsaSwgbmFtZXwKLSAgICAgIEB0YWJsZVthbGldID0gQHRhYmxlW25hbWVdCi0gICAgZW5kCi0gICAgQGl0ZW1zLmZyZWV6ZQotICAgIEB0YWJsZS5mcmVlemUKLSAgICBAb3B0aW9uc19yZSA9IC9cQS0tKCN7QHRhYmxlLmtleXMuam9pbignfCcpfSkoPzo9KC4qKSk/XHovCi0gIGVuZAotCi0gIGRlZiBwYXJzZV9vcHQob3B0KQotICAgIG0gPSBAb3B0aW9uc19yZS5tYXRjaChvcHQpIG9yIHNldHVwX3JiX2Vycm9yICJjb25maWc6IHVua25vd24gb3B0aW9uICN7b3B0fSIKLSAgICBtLnRvX2FbMSwyXQotICBlbmQKLQotICBkZWYgZGxsZXh0Ci0gICAgQHJiY29uZmlnWydETEVYVCddCi0gIGVuZAotCi0gIGRlZiB2YWx1ZV9jb25maWc/KG5hbWUpCi0gICAgbG9va3VwKG5hbWUpLnZhbHVlPwotICBlbmQKLQotICBjbGFzcyBJdGVtCi0gICAgZGVmIGluaXRpYWxpemUobmFtZSwgdGVtcGxhdGUsIGRlZmF1bHQsIGRlc2MpCi0gICAgICBAbmFtZSA9IG5hbWUuZnJlZXplCi0gICAgICBAdGVtcGxhdGUgPSB0ZW1wbGF0ZQotICAgICAgQHZhbHVlID0gZGVmYXVsdAotICAgICAgQGRlZmF1bHQgPSBkZWZhdWx0Ci0gICAgICBAZGVzY3JpcHRpb24gPSBkZXNjCi0gICAgZW5kCi0KLSAgICBhdHRyX3JlYWRlciA6bmFtZQotICAgIGF0dHJfcmVhZGVyIDpkZXNjcmlwdGlvbgotCi0gICAgYXR0cl9hY2Nlc3NvciA6ZGVmYXVsdAotICAgIGFsaWFzIGhlbHBfZGVmYXVsdCBkZWZhdWx0Ci0KLSAgICBkZWYgaGVscF9vcHQKLSAgICAgICItLSN7QG5hbWV9PSN7QHRlbXBsYXRlfSIKLSAgICBlbmQKLQotICAgIGRlZiB2YWx1ZT8KLSAgICAgIHRydWUKLSAgICBlbmQKLQotICAgIGRlZiB2YWx1ZQotICAgICAgQHZhbHVlCi0gICAgZW5kCi0KLSAgICBkZWYgcmVzb2x2ZSh0YWJsZSkKLSAgICAgIEB2YWx1ZS5nc3ViKCVyPFwkKFteL10rKT4pIHsgdGFibGVbJDFdIH0KLSAgICBlbmQKLQotICAgIGRlZiBzZXQodmFsKQotICAgICAgQHZhbHVlID0gY2hlY2sodmFsKQotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHZhbCkKLSAgICAgIHNldHVwX3JiX2Vycm9yICJjb25maWc6IC0tI3tuYW1lfSByZXF1aXJlcyBhcmd1bWVudCIgdW5sZXNzIHZhbAotICAgICAgdmFsCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIEJvb2xJdGVtIDwgSXRlbQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ2Jvb2wnCi0gICAgZW5kCi0KLSAgICBkZWYgaGVscF9vcHQKLSAgICAgICItLSN7QG5hbWV9IgotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHZhbCkKLSAgICAgIHJldHVybiAneWVzJyB1bmxlc3MgdmFsCi0gICAgICBjYXNlIHZhbAotICAgICAgd2hlbiAvXEF5KGVzKT9cei9pLCAvXEF0KHJ1ZSk/XHovaSB0aGVuICd5ZXMnCi0gICAgICB3aGVuIC9cQW4obyk/XHovaSwgL1xBZihhbHNlKVx6L2kgIHRoZW4gJ25vJwotICAgICAgZWxzZQotICAgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7QG5hbWV9IGFjY2VwdHMgb25seSB5ZXMvbm8gZm9yIGFyZ3VtZW50IgotICAgICAgZW5kCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIFBhdGhJdGVtIDwgSXRlbQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ3BhdGgnCi0gICAgZW5kCi0KLSAgICBwcml2YXRlCi0KLSAgICBkZWYgY2hlY2socGF0aCkKLSAgICAgIHNldHVwX3JiX2Vycm9yICJjb25maWc6IC0tI3tAbmFtZX0gcmVxdWlyZXMgYXJndW1lbnQiICB1bmxlc3MgcGF0aAotICAgICAgcGF0aFswLDFdID09ICckJyA/IHBhdGggOiBGaWxlLmV4cGFuZF9wYXRoKHBhdGgpCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIFByb2dyYW1JdGVtIDwgSXRlbQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ3Byb2dyYW0nCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIFNlbGVjdEl0ZW0gPCBJdGVtCi0gICAgZGVmIGluaXRpYWxpemUobmFtZSwgc2VsZWN0aW9uLCBkZWZhdWx0LCBkZXNjKQotICAgICAgc3VwZXIKLSAgICAgIEBvayA9IHNlbGVjdGlvbi5zcGxpdCgnLycpCi0gICAgZW5kCi0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdzZWxlY3QnCi0gICAgZW5kCi0KLSAgICBwcml2YXRlCi0KLSAgICBkZWYgY2hlY2sodmFsKQotICAgICAgdW5sZXNzIEBvay5pbmNsdWRlPyh2YWwuc3RyaXApCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJjb25maWc6IHVzZSAtLSN7QG5hbWV9PSN7QHRlbXBsYXRlfSAoI3t2YWx9KSIKLSAgICAgIGVuZAotICAgICAgdmFsLnN0cmlwCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIEV4ZWNJdGVtIDwgSXRlbQotICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHNlbGVjdGlvbiwgZGVzYywgJmJsb2NrKQotICAgICAgc3VwZXIgbmFtZSwgc2VsZWN0aW9uLCBuaWwsIGRlc2MKLSAgICAgIEBvayA9IHNlbGVjdGlvbi5zcGxpdCgnLycpCi0gICAgICBAYWN0aW9uID0gYmxvY2sKLSAgICBlbmQKLQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ2V4ZWMnCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWU/Ci0gICAgICBmYWxzZQotICAgIGVuZAotCi0gICAgZGVmIHJlc29sdmUodGFibGUpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiJCN7bmFtZSgpfSB3cm9uZ2x5IHVzZWQgYXMgb3B0aW9uIHZhbHVlIgotICAgIGVuZAotCi0gICAgdW5kZWYgc2V0Ci0KLSAgICBkZWYgZXZhbHVhdGUodmFsLCB0YWJsZSkKLSAgICAgIHYgPSB2YWwuc3RyaXAuZG93bmNhc2UKLSAgICAgIHVubGVzcyBAb2suaW5jbHVkZT8odikKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImludmFsaWQgb3B0aW9uIC0tI3tAbmFtZX09I3t2YWx9ICh1c2UgI3tAdGVtcGxhdGV9KSIKLSAgICAgIGVuZAotICAgICAgQGFjdGlvbi5jYWxsIHYsIHRhYmxlCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIFBhY2thZ2VTZWxlY3Rpb25JdGVtIDwgSXRlbQotICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHRlbXBsYXRlLCBkZWZhdWx0LCBoZWxwX2RlZmF1bHQsIGRlc2MpCi0gICAgICBzdXBlciBuYW1lLCB0ZW1wbGF0ZSwgZGVmYXVsdCwgZGVzYwotICAgICAgQGhlbHBfZGVmYXVsdCA9IGhlbHBfZGVmYXVsdAotICAgIGVuZAotCi0gICAgYXR0cl9yZWFkZXIgOmhlbHBfZGVmYXVsdAotCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAncGFja2FnZScKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayh2YWwpCi0gICAgICB1bmxlc3MgRmlsZS5kaXI/KCJwYWNrYWdlcy8je3ZhbH0iKQotICAgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiBubyBzdWNoIHBhY2thZ2U6ICN7dmFsfSIKLSAgICAgIGVuZAotICAgICAgdmFsCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIE1ldGFDb25maWdFbnZpcm9ubWVudAotICAgIGRlZiBpbml0aWFsaXplKGNvbmZpZywgaW5zdGFsbGVyKQotICAgICAgQGNvbmZpZyA9IGNvbmZpZwotICAgICAgQGluc3RhbGxlciA9IGluc3RhbGxlcgotICAgIGVuZAotCi0gICAgZGVmIGNvbmZpZ19uYW1lcwotICAgICAgQGNvbmZpZy5uYW1lcwotICAgIGVuZAotCi0gICAgZGVmIGNvbmZpZz8obmFtZSkKLSAgICAgIEBjb25maWcua2V5PyhuYW1lKQotICAgIGVuZAotCi0gICAgZGVmIGJvb2xfY29uZmlnPyhuYW1lKQotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgPT0gJ2Jvb2wnCi0gICAgZW5kCi0KLSAgICBkZWYgcGF0aF9jb25maWc/KG5hbWUpCi0gICAgICBAY29uZmlnLmxvb2t1cChuYW1lKS5jb25maWdfdHlwZSA9PSAncGF0aCcKLSAgICBlbmQKLQotICAgIGRlZiB2YWx1ZV9jb25maWc/KG5hbWUpCi0gICAgICBAY29uZmlnLmxvb2t1cChuYW1lKS5jb25maWdfdHlwZSAhPSAnZXhlYycKLSAgICBlbmQKLQotICAgIGRlZiBhZGRfY29uZmlnKGl0ZW0pCi0gICAgICBAY29uZmlnLmFkZCBpdGVtCi0gICAgZW5kCi0KLSAgICBkZWYgYWRkX2Jvb2xfY29uZmlnKG5hbWUsIGRlZmF1bHQsIGRlc2MpCi0gICAgICBAY29uZmlnLmFkZCBCb29sSXRlbS5uZXcobmFtZSwgJ3llcy9ubycsIGRlZmF1bHQgPyAneWVzJyA6ICdubycsIGRlc2MpCi0gICAgZW5kCi0KLSAgICBkZWYgYWRkX3BhdGhfY29uZmlnKG5hbWUsIGRlZmF1bHQsIGRlc2MpCi0gICAgICBAY29uZmlnLmFkZCBQYXRoSXRlbS5uZXcobmFtZSwgJ3BhdGgnLCBkZWZhdWx0LCBkZXNjKQotICAgIGVuZAotCi0gICAgZGVmIHNldF9jb25maWdfZGVmYXVsdChuYW1lLCBkZWZhdWx0KQotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuZGVmYXVsdCA9IGRlZmF1bHQKLSAgICBlbmQKLQotICAgIGRlZiByZW1vdmVfY29uZmlnKG5hbWUpCi0gICAgICBAY29uZmlnLnJlbW92ZShuYW1lKQotICAgIGVuZAotCi0gICAgIyBGb3Igb25seSBtdWx0aXBhY2thZ2UKLSAgICBkZWYgcGFja2FnZXMKLSAgICAgIHJhaXNlICdbc2V0dXAucmIgZmF0YWxdIG11bHRpLXBhY2thZ2UgbWV0YWNvbmZpZyBBUEkgcGFja2FnZXMoKSBjYWxsZWQgZm9yIHNpbmdsZS1wYWNrYWdlOyBjb250YWN0IGFwcGxpY2F0aW9uIHBhY2thZ2UgdmVuZG9yJyB1bmxlc3MgQGluc3RhbGxlcgotICAgICAgQGluc3RhbGxlci5wYWNrYWdlcwotICAgIGVuZAotCi0gICAgIyBGb3Igb25seSBtdWx0aXBhY2thZ2UKLSAgICBkZWYgZGVjbGFyZV9wYWNrYWdlcyhsaXN0KQotICAgICAgcmFpc2UgJ1tzZXR1cC5yYiBmYXRhbF0gbXVsdGktcGFja2FnZSBtZXRhY29uZmlnIEFQSSBkZWNsYXJlX3BhY2thZ2VzKCkgY2FsbGVkIGZvciBzaW5nbGUtcGFja2FnZTsgY29udGFjdCBhcHBsaWNhdGlvbiBwYWNrYWdlIHZlbmRvcicgdW5sZXNzIEBpbnN0YWxsZXIKLSAgICAgIEBpbnN0YWxsZXIucGFja2FnZXMgPSBsaXN0Ci0gICAgZW5kCi0gIGVuZAotCi1lbmQgICAjIGNsYXNzIENvbmZpZ1RhYmxlCi0KLQotIyBUaGlzIG1vZHVsZSByZXF1aXJlczogI3ZlcmJvc2U/LCAjbm9faGFybT8KLW1vZHVsZSBGaWxlT3BlcmF0aW9ucwotCi0gIGRlZiBta2Rpcl9wKGRpcm5hbWUsIHByZWZpeCA9IG5pbCkKLSAgICBkaXJuYW1lID0gcHJlZml4ICsgRmlsZS5leHBhbmRfcGF0aChkaXJuYW1lKSBpZiBwcmVmaXgKLSAgICAkc3RkZXJyLnB1dHMgIm1rZGlyIC1wICN7ZGlybmFtZX0iIGlmIHZlcmJvc2U/Ci0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0KLSAgICAjIERvZXMgbm90IGNoZWNrICcvJywgaXQncyB0b28gYWJub3JtYWwuCi0gICAgZGlycyA9IEZpbGUuZXhwYW5kX3BhdGgoZGlybmFtZSkuc3BsaXQoJXI8KD89Lyk+KQotICAgIGlmIC9cQVthLXpdOlx6L2kgPX4gZGlyc1swXQotICAgICAgZGlzayA9IGRpcnMuc2hpZnQKLSAgICAgIGRpcnNbMF0gPSBkaXNrICsgZGlyc1swXQotICAgIGVuZAotICAgIGRpcnMuZWFjaF9pbmRleCBkbyB8aWR4fAotICAgICAgcGF0aCA9IGRpcnNbMC4uaWR4XS5qb2luKCcnKQotICAgICAgRGlyLm1rZGlyIHBhdGggdW5sZXNzIEZpbGUuZGlyPyhwYXRoKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgcm1fZihwYXRoKQotICAgICRzdGRlcnIucHV0cyAicm0gLWYgI3twYXRofSIgaWYgdmVyYm9zZT8KLSAgICByZXR1cm4gaWYgbm9faGFybT8KLSAgICBmb3JjZV9yZW1vdmVfZmlsZSBwYXRoCi0gIGVuZAotCi0gIGRlZiBybV9yZihwYXRoKQotICAgICRzdGRlcnIucHV0cyAicm0gLXJmICN7cGF0aH0iIGlmIHZlcmJvc2U/Ci0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0gICAgcmVtb3ZlX3RyZWUgcGF0aAotICBlbmQKLQotICBkZWYgcmVtb3ZlX3RyZWUocGF0aCkKLSAgICBpZiBGaWxlLnN5bWxpbms/KHBhdGgpCi0gICAgICByZW1vdmVfZmlsZSBwYXRoCi0gICAgZWxzaWYgRmlsZS5kaXI/KHBhdGgpCi0gICAgICByZW1vdmVfdHJlZTAgcGF0aAotICAgIGVsc2UKLSAgICAgIGZvcmNlX3JlbW92ZV9maWxlIHBhdGgKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJlbW92ZV90cmVlMChwYXRoKQotICAgIERpci5mb3JlYWNoKHBhdGgpIGRvIHxlbnR8Ci0gICAgICBuZXh0IGlmIGVudCA9PSAnLicKLSAgICAgIG5leHQgaWYgZW50ID09ICcuLicKLSAgICAgIGVudHBhdGggPSAiI3twYXRofS8je2VudH0iCi0gICAgICBpZiBGaWxlLnN5bWxpbms/KGVudHBhdGgpCi0gICAgICAgIHJlbW92ZV9maWxlIGVudHBhdGgKLSAgICAgIGVsc2lmIEZpbGUuZGlyPyhlbnRwYXRoKQotICAgICAgICByZW1vdmVfdHJlZTAgZW50cGF0aAotICAgICAgZWxzZQotICAgICAgICBmb3JjZV9yZW1vdmVfZmlsZSBlbnRwYXRoCi0gICAgICBlbmQKLSAgICBlbmQKLSAgICBiZWdpbgotICAgICAgRGlyLnJtZGlyIHBhdGgKLSAgICByZXNjdWUgRXJybm86OkVOT1RFTVBUWQotICAgICAgIyBkaXJlY3RvcnkgbWF5IG5vdCBiZSBlbXB0eQotICAgIGVuZAotICBlbmQKLQotICBkZWYgbW92ZV9maWxlKHNyYywgZGVzdCkKLSAgICBmb3JjZV9yZW1vdmVfZmlsZSBkZXN0Ci0gICAgYmVnaW4KLSAgICAgIEZpbGUucmVuYW1lIHNyYywgZGVzdAotICAgIHJlc2N1ZQotICAgICAgRmlsZS5vcGVuKGRlc3QsICd3YicpIHt8ZnwKLSAgICAgICAgZi53cml0ZSBGaWxlLmJpbnJlYWQoc3JjKQotICAgICAgfQotICAgICAgRmlsZS5jaG1vZCBGaWxlLnN0YXQoc3JjKS5tb2RlLCBkZXN0Ci0gICAgICBGaWxlLnVubGluayBzcmMKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIGZvcmNlX3JlbW92ZV9maWxlKHBhdGgpCi0gICAgYmVnaW4KLSAgICAgIHJlbW92ZV9maWxlIHBhdGgKLSAgICByZXNjdWUKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJlbW92ZV9maWxlKHBhdGgpCi0gICAgRmlsZS5jaG1vZCAwNzc3LCBwYXRoCi0gICAgRmlsZS51bmxpbmsgcGF0aAotICBlbmQKLQotICBkZWYgaW5zdGFsbChmcm9tLCBkZXN0LCBtb2RlLCBwcmVmaXggPSBuaWwpCi0gICAgJHN0ZGVyci5wdXRzICJpbnN0YWxsICN7ZnJvbX0gI3tkZXN0fSIgaWYgdmVyYm9zZT8KLSAgICByZXR1cm4gaWYgbm9faGFybT8KLQotICAgIHJlYWxkZXN0ID0gcHJlZml4ID8gcHJlZml4ICsgRmlsZS5leHBhbmRfcGF0aChkZXN0KSA6IGRlc3QKLSAgICByZWFsZGVzdCA9IEZpbGUuam9pbihyZWFsZGVzdCwgRmlsZS5iYXNlbmFtZShmcm9tKSkgaWYgRmlsZS5kaXI/KHJlYWxkZXN0KQotICAgIHN0ciA9IEZpbGUuYmlucmVhZChmcm9tKQotICAgIGlmIGRpZmY/KHN0ciwgcmVhbGRlc3QpCi0gICAgICB2ZXJib3NlX29mZiB7Ci0gICAgICAgIHJtX2YgcmVhbGRlc3QgaWYgRmlsZS5leGlzdD8ocmVhbGRlc3QpCi0gICAgICB9Ci0gICAgICBGaWxlLm9wZW4ocmVhbGRlc3QsICd3YicpIHt8ZnwKLSAgICAgICAgZi53cml0ZSBzdHIKLSAgICAgIH0KLSAgICAgIEZpbGUuY2htb2QgbW9kZSwgcmVhbGRlc3QKLQotICAgICAgRmlsZS5vcGVuKCIje29iamRpcl9yb290KCl9L0luc3RhbGxlZEZpbGVzIiwgJ2EnKSB7fGZ8Ci0gICAgICAgIGlmIHByZWZpeAotICAgICAgICAgIGYucHV0cyByZWFsZGVzdC5zdWIocHJlZml4LCAnJykKLSAgICAgICAgZWxzZQotICAgICAgICAgIGYucHV0cyByZWFsZGVzdAotICAgICAgICBlbmQKLSAgICAgIH0KLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIGRpZmY/KG5ld19jb250ZW50LCBwYXRoKQotICAgIHJldHVybiB0cnVlIHVubGVzcyBGaWxlLmV4aXN0PyhwYXRoKQotICAgIG5ld19jb250ZW50ICE9IEZpbGUuYmlucmVhZChwYXRoKQotICBlbmQKLQotICBkZWYgY29tbWFuZCgqYXJncykKLSAgICAkc3RkZXJyLnB1dHMgYXJncy5qb2luKCcgJykgaWYgdmVyYm9zZT8KLSAgICBzeXN0ZW0oKmFyZ3MpIG9yIHJhaXNlIFJ1bnRpbWVFcnJvciwKLSAgICAgICAgInN5c3RlbSgje2FyZ3MubWFwe3xhfCBhLmluc3BlY3QgfS5qb2luKCcgJyl9KSBmYWlsZWQiCi0gIGVuZAotCi0gIGRlZiBydWJ5KCphcmdzKQotICAgIGNvbW1hbmQgY29uZmlnKCdydWJ5cHJvZycpLCAqYXJncwotICBlbmQKLQotICBkZWYgbWFrZSh0YXNrID0gbmlsKQotICAgIGNvbW1hbmQoKltjb25maWcoJ21ha2Vwcm9nJyksIHRhc2tdLmNvbXBhY3QpCi0gIGVuZAotCi0gIGRlZiBleHRkaXI/KGRpcikKLSAgICBGaWxlLmV4aXN0PygiI3tkaXJ9L01BTklGRVNUIikgb3IgRmlsZS5leGlzdD8oIiN7ZGlyfS9leHRjb25mLnJiIikKLSAgZW5kCi0KLSAgZGVmIGZpbGVzX29mKGRpcikKLSAgICBEaXIub3BlbihkaXIpIHt8ZHwKLSAgICAgIHJldHVybiBkLnNlbGVjdCB7fGVudHwgRmlsZS5maWxlPygiI3tkaXJ9LyN7ZW50fSIpIH0KLSAgICB9Ci0gIGVuZAotCi0gIERJUl9SRUpFQ1QgPSAldyggLiAuLiBDVlMgU0NDUyBSQ1MgQ1ZTLmFkbSAuc3ZuICkKLQotICBkZWYgZGlyZWN0b3JpZXNfb2YoZGlyKQotICAgIERpci5vcGVuKGRpcikge3xkfAotICAgICAgcmV0dXJuIGQuc2VsZWN0IHt8ZW50fCBGaWxlLmRpcj8oIiN7ZGlyfS8je2VudH0iKSB9IC0gRElSX1JFSkVDVAotICAgIH0KLSAgZW5kCi0KLWVuZAotCi0KLSMgVGhpcyBtb2R1bGUgcmVxdWlyZXM6ICNzcmNkaXJfcm9vdCwgI29iamRpcl9yb290LCAjcmVscGF0aAotbW9kdWxlIEhvb2tTY3JpcHRBUEkKLQotICBkZWYgZ2V0X2NvbmZpZyhrZXkpCi0gICAgQGNvbmZpZ1trZXldCi0gIGVuZAotCi0gIGFsaWFzIGNvbmZpZyBnZXRfY29uZmlnCi0KLSAgIyBvYnNvbGV0ZTogdXNlIG1ldGFjb25maWcgdG8gY2hhbmdlIGNvbmZpZ3VyYXRpb24KLSAgZGVmIHNldF9jb25maWcoa2V5LCB2YWwpCi0gICAgQGNvbmZpZ1trZXldID0gdmFsCi0gIGVuZAotCi0gICMKLSAgIyBzcmNkaXIvb2JqZGlyICh3b3JrcyBvbmx5IGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSkKLSAgIwotCi0gIGRlZiBjdXJyX3NyY2RpcgotICAgICIje3NyY2Rpcl9yb290KCl9LyN7cmVscGF0aCgpfSIKLSAgZW5kCi0KLSAgZGVmIGN1cnJfb2JqZGlyCi0gICAgIiN7b2JqZGlyX3Jvb3QoKX0vI3tyZWxwYXRoKCl9IgotICBlbmQKLQotICBkZWYgc3JjZmlsZShwYXRoKQotICAgICIje2N1cnJfc3JjZGlyKCl9LyN7cGF0aH0iCi0gIGVuZAotCi0gIGRlZiBzcmNleGlzdD8ocGF0aCkKLSAgICBGaWxlLmV4aXN0PyhzcmNmaWxlKHBhdGgpKQotICBlbmQKLQotICBkZWYgc3JjZGlyZWN0b3J5PyhwYXRoKQotICAgIEZpbGUuZGlyPyhzcmNmaWxlKHBhdGgpKQotICBlbmQKLQotICBkZWYgc3JjZmlsZT8ocGF0aCkKLSAgICBGaWxlLmZpbGU/KHNyY2ZpbGUocGF0aCkpCi0gIGVuZAotCi0gIGRlZiBzcmNlbnRyaWVzKHBhdGggPSAnLicpCi0gICAgRGlyLm9wZW4oIiN7Y3Vycl9zcmNkaXIoKX0vI3twYXRofSIpIHt8ZHwKLSAgICAgIHJldHVybiBkLnRvX2EgLSAldyguIC4uKQotICAgIH0KLSAgZW5kCi0KLSAgZGVmIHNyY2ZpbGVzKHBhdGggPSAnLicpCi0gICAgc3JjZW50cmllcyhwYXRoKS5zZWxlY3Qge3xmbmFtZXwKLSAgICAgIEZpbGUuZmlsZT8oRmlsZS5qb2luKGN1cnJfc3JjZGlyKCksIHBhdGgsIGZuYW1lKSkKLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBzcmNkaXJlY3RvcmllcyhwYXRoID0gJy4nKQotICAgIHNyY2VudHJpZXMocGF0aCkuc2VsZWN0IHt8Zm5hbWV8Ci0gICAgICBGaWxlLmRpcj8oRmlsZS5qb2luKGN1cnJfc3JjZGlyKCksIHBhdGgsIGZuYW1lKSkKLSAgICB9Ci0gIGVuZAotCi1lbmQKLQotCi1jbGFzcyBUb3BsZXZlbEluc3RhbGxlcgotCi0gIFZlcnNpb24gICA9ICczLjQuMScKLSAgQ29weXJpZ2h0ID0gJ0NvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1pbmVybyBBb2tpJwotCi0gIFRBU0tTID0gWwotICAgIFsgJ2FsbCcsICAgICAgJ2RvIGNvbmZpZywgc2V0dXAsIHRoZW4gaW5zdGFsbCcgXSwKLSAgICBbICdjb25maWcnLCAgICdzYXZlcyB5b3VyIGNvbmZpZ3VyYXRpb25zJyBdLAotICAgIFsgJ3Nob3cnLCAgICAgJ3Nob3dzIGN1cnJlbnQgY29uZmlndXJhdGlvbicgXSwKLSAgICBbICdzZXR1cCcsICAgICdjb21waWxlcyBydWJ5IGV4dGVudGlvbnMgYW5kIG90aGVycycgXSwKLSAgICBbICdpbnN0YWxsJywgICdpbnN0YWxscyBmaWxlcycgXSwKLSAgICBbICd0ZXN0JywgICAgICdydW4gYWxsIHRlc3RzIGluIHRlc3QvJyBdLAotICAgIFsgJ2NsZWFuJywgICAgImRvZXMgYG1ha2UgY2xlYW4nIGZvciBlYWNoIGV4dGVudGlvbiIgXSwKLSAgICBbICdkaXN0Y2xlYW4nLCJkb2VzIGBtYWtlIGRpc3RjbGVhbicgZm9yIGVhY2ggZXh0ZW50aW9uIiBdCi0gIF0KLQotICBkZWYgVG9wbGV2ZWxJbnN0YWxsZXIuaW52b2tlCi0gICAgY29uZmlnID0gQ29uZmlnVGFibGUubmV3KGxvYWRfcmJjb25maWcoKSkKLSAgICBjb25maWcubG9hZF9zdGFuZGFyZF9lbnRyaWVzCi0gICAgY29uZmlnLmxvYWRfbXVsdGlwYWNrYWdlX2VudHJpZXMgaWYgbXVsdGlwYWNrYWdlPwotICAgIGNvbmZpZy5maXh1cAotICAgIGtsYXNzID0gKG11bHRpcGFja2FnZT8oKSA/IFRvcGxldmVsSW5zdGFsbGVyTXVsdGkgOiBUb3BsZXZlbEluc3RhbGxlcikKLSAgICBrbGFzcy5uZXcoRmlsZS5kaXJuYW1lKCQwKSwgY29uZmlnKS5pbnZva2UKLSAgZW5kCi0KLSAgZGVmIFRvcGxldmVsSW5zdGFsbGVyLm11bHRpcGFja2FnZT8KLSAgICBGaWxlLmRpcj8oRmlsZS5kaXJuYW1lKCQwKSArICcvcGFja2FnZXMnKQotICBlbmQKLQotICBkZWYgVG9wbGV2ZWxJbnN0YWxsZXIubG9hZF9yYmNvbmZpZwotICAgIGlmIGFyZyA9IEFSR1YuZGV0ZWN0IHt8YXJnfCAvXEEtLXJiY29uZmlnPS8gPX4gYXJnIH0KLSAgICAgIEFSR1YuZGVsZXRlKGFyZykKLSAgICAgIGxvYWQgRmlsZS5leHBhbmRfcGF0aChhcmcuc3BsaXQoLz0vLCAyKVsxXSkKLSAgICAgICQiLnB1c2ggJ3JiY29uZmlnLnJiJwotICAgIGVsc2UKLSAgICAgIHJlcXVpcmUgJ3JiY29uZmlnJwotICAgIGVuZAotICAgIDo6Q29uZmlnOjpDT05GSUcKLSAgZW5kCi0KLSAgZGVmIGluaXRpYWxpemUoYXJkaXJfcm9vdCwgY29uZmlnKQotICAgIEBhcmRpciA9IEZpbGUuZXhwYW5kX3BhdGgoYXJkaXJfcm9vdCkKLSAgICBAY29uZmlnID0gY29uZmlnCi0gICAgIyBjYWNoZQotICAgIEB2YWxpZF90YXNrX3JlID0gbmlsCi0gIGVuZAotCi0gIGRlZiBjb25maWcoa2V5KQotICAgIEBjb25maWdba2V5XQotICBlbmQKLQotICBkZWYgaW5zcGVjdAotICAgICIjPCN7c2VsZi5jbGFzc30gI3tfX2lkX18oKX0+IgotICBlbmQKLQotICBkZWYgaW52b2tlCi0gICAgcnVuX21ldGFjb25maWdzCi0gICAgY2FzZSB0YXNrID0gcGFyc2VhcmdfZ2xvYmFsKCkKLSAgICB3aGVuIG5pbCwgJ2FsbCcKLSAgICAgIHBhcnNlYXJnX2NvbmZpZwotICAgICAgaW5pdF9pbnN0YWxsZXJzCi0gICAgICBleGVjX2NvbmZpZwotICAgICAgZXhlY19zZXR1cAotICAgICAgZXhlY19pbnN0YWxsCi0gICAgZWxzZQotICAgICAgY2FzZSB0YXNrCi0gICAgICB3aGVuICdjb25maWcnLCAndGVzdCcKLSAgICAgICAgOwotICAgICAgd2hlbiAnY2xlYW4nLCAnZGlzdGNsZWFuJwotICAgICAgICBAY29uZmlnLmxvYWRfc2F2ZWZpbGUgaWYgRmlsZS5leGlzdD8oQGNvbmZpZy5zYXZlZmlsZSkKLSAgICAgIGVsc2UKLSAgICAgICAgQGNvbmZpZy5sb2FkX3NhdmVmaWxlCi0gICAgICBlbmQKLSAgICAgIF9fc2VuZF9fICJwYXJzZWFyZ18je3Rhc2t9IgotICAgICAgaW5pdF9pbnN0YWxsZXJzCi0gICAgICBfX3NlbmRfXyAiZXhlY18je3Rhc2t9IgotICAgIGVuZAotICBlbmQKLQotICBkZWYgcnVuX21ldGFjb25maWdzCi0gICAgQGNvbmZpZy5sb2FkX3NjcmlwdCAiI3tAYXJkaXJ9L21ldGFjb25maWciCi0gIGVuZAotCi0gIGRlZiBpbml0X2luc3RhbGxlcnMKLSAgICBAaW5zdGFsbGVyID0gSW5zdGFsbGVyLm5ldyhAY29uZmlnLCBAYXJkaXIsIEZpbGUuZXhwYW5kX3BhdGgoJy4nKSkKLSAgZW5kCi0KLSAgIwotICAjIEhvb2sgU2NyaXB0IEFQSSBiYXNlcwotICAjCi0KLSAgZGVmIHNyY2Rpcl9yb290Ci0gICAgQGFyZGlyCi0gIGVuZAotCi0gIGRlZiBvYmpkaXJfcm9vdAotICAgICcuJwotICBlbmQKLQotICBkZWYgcmVscGF0aAotICAgICcuJwotICBlbmQKLQotICAjCi0gICMgT3B0aW9uIFBhcnNpbmcKLSAgIwotCi0gIGRlZiBwYXJzZWFyZ19nbG9iYWwKLSAgICB3aGlsZSBhcmcgPSBBUkdWLnNoaWZ0Ci0gICAgICBjYXNlIGFyZwotICAgICAgd2hlbiAvXEFcdytcei8KLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImludmFsaWQgdGFzazogI3thcmd9IiB1bmxlc3MgdmFsaWRfdGFzaz8oYXJnKQotICAgICAgICByZXR1cm4gYXJnCi0gICAgICB3aGVuICctcScsICctLXF1aWV0JwotICAgICAgICBAY29uZmlnLnZlcmJvc2UgPSBmYWxzZQotICAgICAgd2hlbiAnLS12ZXJib3NlJwotICAgICAgICBAY29uZmlnLnZlcmJvc2UgPSB0cnVlCi0gICAgICB3aGVuICctLWhlbHAnCi0gICAgICAgIHByaW50X3VzYWdlICRzdGRvdXQKLSAgICAgICAgZXhpdCAwCi0gICAgICB3aGVuICctLXZlcnNpb24nCi0gICAgICAgIHB1dHMgIiN7RmlsZS5iYXNlbmFtZSgkMCl9IHZlcnNpb24gI3tWZXJzaW9ufSIKLSAgICAgICAgZXhpdCAwCi0gICAgICB3aGVuICctLWNvcHlyaWdodCcKLSAgICAgICAgcHV0cyBDb3B5cmlnaHQKLSAgICAgICAgZXhpdCAwCi0gICAgICBlbHNlCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJ1bmtub3duIGdsb2JhbCBvcHRpb24gJyN7YXJnfSciCi0gICAgICBlbmQKLSAgICBlbmQKLSAgICBuaWwKLSAgZW5kCi0KLSAgZGVmIHZhbGlkX3Rhc2s/KHQpCi0gICAgdmFsaWRfdGFza19yZSgpID1+IHQKLSAgZW5kCi0KLSAgZGVmIHZhbGlkX3Rhc2tfcmUKLSAgICBAdmFsaWRfdGFza19yZSB8fD0gL1xBKD86I3tUQVNLUy5tYXAge3x0YXNrLGRlc2N8IHRhc2sgfS5qb2luKCd8Jyl9KVx6LwotICBlbmQKLQotICBkZWYgcGFyc2Vhcmdfbm9fb3B0aW9ucwotICAgIHVubGVzcyBBUkdWLmVtcHR5PwotICAgICAgdGFzayA9IGNhbGxlcigwKS5maXJzdC5zbGljZSglcjxgcGFyc2VhcmdfKFx3KyknPiwgMSkKLSAgICAgIHNldHVwX3JiX2Vycm9yICIje3Rhc2t9OiB1bmtub3duIG9wdGlvbnM6ICN7QVJHVi5qb2luKCcgJyl9IgotICAgIGVuZAotICBlbmQKLQotICBhbGlhcyBwYXJzZWFyZ19zaG93ICAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgYWxpYXMgcGFyc2Vhcmdfc2V0dXAgICAgICBwYXJzZWFyZ19ub19vcHRpb25zCi0gIGFsaWFzIHBhcnNlYXJnX3Rlc3QgICAgICAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotICBhbGlhcyBwYXJzZWFyZ19jbGVhbiAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgYWxpYXMgcGFyc2VhcmdfZGlzdGNsZWFuICBwYXJzZWFyZ19ub19vcHRpb25zCi0KLSAgZGVmIHBhcnNlYXJnX2NvbmZpZwotICAgIGV2YWxvcHQgPSBbXQotICAgIHNldCA9IFtdCi0gICAgQGNvbmZpZy5jb25maWdfb3B0ID0gW10KLSAgICB3aGlsZSBpID0gQVJHVi5zaGlmdAotICAgICAgaWYgL1xBLS0/XHovID1+IGkKLSAgICAgICAgQGNvbmZpZy5jb25maWdfb3B0ID0gQVJHVi5kdXAKLSAgICAgICAgYnJlYWsKLSAgICAgIGVuZAotICAgICAgbmFtZSwgdmFsdWUgPSAqQGNvbmZpZy5wYXJzZV9vcHQoaSkKLSAgICAgIGlmIEBjb25maWcudmFsdWVfY29uZmlnPyhuYW1lKQotICAgICAgICBAY29uZmlnW25hbWVdID0gdmFsdWUKLSAgICAgIGVsc2UKLSAgICAgICAgZXZhbG9wdC5wdXNoIFtuYW1lLCB2YWx1ZV0KLSAgICAgIGVuZAotICAgICAgc2V0LnB1c2ggbmFtZQotICAgIGVuZAotICAgIGV2YWxvcHQuZWFjaCBkbyB8bmFtZSwgdmFsdWV8Ci0gICAgICBAY29uZmlnLmxvb2t1cChuYW1lKS5ldmFsdWF0ZSB2YWx1ZSwgQGNvbmZpZwotICAgIGVuZAotICAgICMgQ2hlY2sgaWYgY29uZmlndXJhdGlvbiBpcyB2YWxpZAotICAgIHNldC5lYWNoIGRvIHxufAotICAgICAgQGNvbmZpZ1tuXSBpZiBAY29uZmlnLnZhbHVlX2NvbmZpZz8obikKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHBhcnNlYXJnX2luc3RhbGwKLSAgICBAY29uZmlnLm5vX2hhcm0gPSBmYWxzZQotICAgIEBjb25maWcuaW5zdGFsbF9wcmVmaXggPSAnJwotICAgIHdoaWxlIGEgPSBBUkdWLnNoaWZ0Ci0gICAgICBjYXNlIGEKLSAgICAgIHdoZW4gJy0tbm8taGFybScKLSAgICAgICAgQGNvbmZpZy5ub19oYXJtID0gdHJ1ZQotICAgICAgd2hlbiAvXEEtLXByZWZpeD0vCi0gICAgICAgIHBhdGggPSBhLnNwbGl0KC89LywgMilbMV0KLSAgICAgICAgcGF0aCA9IEZpbGUuZXhwYW5kX3BhdGgocGF0aCkgdW5sZXNzIHBhdGhbMCwxXSA9PSAnLycKLSAgICAgICAgQGNvbmZpZy5pbnN0YWxsX3ByZWZpeCA9IHBhdGgKLSAgICAgIGVsc2UKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImluc3RhbGw6IHVua25vd24gb3B0aW9uICN7YX0iCi0gICAgICBlbmQKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHByaW50X3VzYWdlKG91dCkKLSAgICBvdXQucHV0cyAnVHlwaWNhbCBJbnN0YWxsYXRpb24gUHJvY2VkdXJlOicKLSAgICBvdXQucHV0cyAiICAkIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSBjb25maWciCi0gICAgb3V0LnB1dHMgIiAgJCBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gc2V0dXAiCi0gICAgb3V0LnB1dHMgIiAgIyBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gaW5zdGFsbCAobWF5IHJlcXVpcmUgcm9vdCBwcml2aWxlZ2UpIgotICAgIG91dC5wdXRzCi0gICAgb3V0LnB1dHMgJ0RldGFpbGVkIFVzYWdlOicKLSAgICBvdXQucHV0cyAiICBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gPGdsb2JhbCBvcHRpb24+IgotICAgIG91dC5wdXRzICIgIHJ1YnkgI3tGaWxlLmJhc2VuYW1lICQwfSBbPGdsb2JhbCBvcHRpb25zPl0gPHRhc2s+IFs8dGFzayBvcHRpb25zPl0iCi0KLSAgICBmbXQgPSAiICAlLTI0cyAlc1xuIgotICAgIG91dC5wdXRzCi0gICAgb3V0LnB1dHMgJ0dsb2JhbCBvcHRpb25zOicKLSAgICBvdXQucHJpbnRmIGZtdCwgJy1xLC0tcXVpZXQnLCAgICdzdXBwcmVzcyBtZXNzYWdlIG91dHB1dHMnCi0gICAgb3V0LnByaW50ZiBmbXQsICcgICAtLXZlcmJvc2UnLCAnb3V0cHV0IG1lc3NhZ2VzIHZlcmJvc2VseScKLSAgICBvdXQucHJpbnRmIGZtdCwgJyAgIC0taGVscCcsICAgICdwcmludCB0aGlzIG1lc3NhZ2UnCi0gICAgb3V0LnByaW50ZiBmbXQsICcgICAtLXZlcnNpb24nLCAncHJpbnQgdmVyc2lvbiBhbmQgcXVpdCcKLSAgICBvdXQucHJpbnRmIGZtdCwgJyAgIC0tY29weXJpZ2h0JywgICdwcmludCBjb3B5cmlnaHQgYW5kIHF1aXQnCi0gICAgb3V0LnB1dHMKLSAgICBvdXQucHV0cyAnVGFza3M6JwotICAgIFRBU0tTLmVhY2ggZG8gfG5hbWUsIGRlc2N8Ci0gICAgICBvdXQucHJpbnRmIGZtdCwgbmFtZSwgZGVzYwotICAgIGVuZAotCi0gICAgZm10ID0gIiAgJS0yNHMgJXMgWyVzXVxuIgotICAgIG91dC5wdXRzCi0gICAgb3V0LnB1dHMgJ09wdGlvbnMgZm9yIENPTkZJRyBvciBBTEw6JwotICAgIEBjb25maWcuZWFjaCBkbyB8aXRlbXwKLSAgICAgIG91dC5wcmludGYgZm10LCBpdGVtLmhlbHBfb3B0LCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmhlbHBfZGVmYXVsdAotICAgIGVuZAotICAgIG91dC5wcmludGYgZm10LCAnLS1yYmNvbmZpZz1wYXRoJywgJ3JiY29uZmlnLnJiIHRvIGxvYWQnLCJydW5uaW5nIHJ1YnkncyIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdPcHRpb25zIGZvciBJTlNUQUxMOicKLSAgICBvdXQucHJpbnRmIGZtdCwgJy0tbm8taGFybScsICdvbmx5IGRpc3BsYXkgd2hhdCB0byBkbyBpZiBnaXZlbicsICdvZmYnCi0gICAgb3V0LnByaW50ZiBmbXQsICctLXByZWZpeD1wYXRoJywgICdpbnN0YWxsIHBhdGggcHJlZml4JywgJycKLSAgICBvdXQucHV0cwotICBlbmQKLQotICAjCi0gICMgVGFzayBIYW5kbGVycwotICAjCi0KLSAgZGVmIGV4ZWNfY29uZmlnCi0gICAgQGluc3RhbGxlci5leGVjX2NvbmZpZwotICAgIEBjb25maWcuc2F2ZSAgICMgbXVzdCBiZSBmaW5hbAotICBlbmQKLQotICBkZWYgZXhlY19zZXR1cAotICAgIEBpbnN0YWxsZXIuZXhlY19zZXR1cAotICBlbmQKLQotICBkZWYgZXhlY19pbnN0YWxsCi0gICAgQGluc3RhbGxlci5leGVjX2luc3RhbGwKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfdGVzdAotICAgIEBpbnN0YWxsZXIuZXhlY190ZXN0Ci0gIGVuZAotCi0gIGRlZiBleGVjX3Nob3cKLSAgICBAY29uZmlnLmVhY2ggZG8gfGl8Ci0gICAgICBwcmludGYgIiUtMjBzICVzXG4iLCBpLm5hbWUsIGkudmFsdWUgaWYgaS52YWx1ZT8KLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfY2xlYW4KLSAgICBAaW5zdGFsbGVyLmV4ZWNfY2xlYW4KLSAgZW5kCi0KLSAgZGVmIGV4ZWNfZGlzdGNsZWFuCi0gICAgQGluc3RhbGxlci5leGVjX2Rpc3RjbGVhbgotICBlbmQKLQotZW5kICAgIyBjbGFzcyBUb3BsZXZlbEluc3RhbGxlcgotCi0KLWNsYXNzIFRvcGxldmVsSW5zdGFsbGVyTXVsdGkgPCBUb3BsZXZlbEluc3RhbGxlcgotCi0gIGluY2x1ZGUgRmlsZU9wZXJhdGlvbnMKLQotICBkZWYgaW5pdGlhbGl6ZShhcmRpcl9yb290LCBjb25maWcpCi0gICAgc3VwZXIKLSAgICBAcGFja2FnZXMgPSBkaXJlY3Rvcmllc19vZigiI3tAYXJkaXJ9L3BhY2thZ2VzIikKLSAgICByYWlzZSAnbm8gcGFja2FnZSBleGlzdHMnIGlmIEBwYWNrYWdlcy5lbXB0eT8KLSAgICBAcm9vdF9pbnN0YWxsZXIgPSBJbnN0YWxsZXIubmV3KEBjb25maWcsIEBhcmRpciwgRmlsZS5leHBhbmRfcGF0aCgnLicpKQotICBlbmQKLQotICBkZWYgcnVuX21ldGFjb25maWdzCi0gICAgQGNvbmZpZy5sb2FkX3NjcmlwdCAiI3tAYXJkaXJ9L21ldGFjb25maWciLCBzZWxmCi0gICAgQHBhY2thZ2VzLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBAY29uZmlnLmxvYWRfc2NyaXB0ICIje0BhcmRpcn0vcGFja2FnZXMvI3tuYW1lfS9tZXRhY29uZmlnIgotICAgIGVuZAotICBlbmQKLQotICBhdHRyX3JlYWRlciA6cGFja2FnZXMKLQotICBkZWYgcGFja2FnZXM9KGxpc3QpCi0gICAgcmFpc2UgJ3BhY2thZ2UgbGlzdCBpcyBlbXB0eScgaWYgbGlzdC5lbXB0eT8KLSAgICBsaXN0LmVhY2ggZG8gfG5hbWV8Ci0gICAgICByYWlzZSAiZGlyZWN0b3J5IHBhY2thZ2VzLyN7bmFtZX0gZG9lcyBub3QgZXhpc3QiXAotICAgICAgICAgICAgICB1bmxlc3MgRmlsZS5kaXI/KCIje0BhcmRpcn0vcGFja2FnZXMvI3tuYW1lfSIpCi0gICAgZW5kCi0gICAgQHBhY2thZ2VzID0gbGlzdAotICBlbmQKLQotICBkZWYgaW5pdF9pbnN0YWxsZXJzCi0gICAgQGluc3RhbGxlcnMgPSB7fQotICAgIEBwYWNrYWdlcy5lYWNoIGRvIHxwYWNrfAotICAgICAgQGluc3RhbGxlcnNbcGFja10gPSBJbnN0YWxsZXIubmV3KEBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3tAYXJkaXJ9L3BhY2thZ2VzLyN7cGFja30iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VzLyN7cGFja30iKQotICAgIGVuZAotICAgIHdpdGggICAgPSBleHRyYWN0X3NlbGVjdGlvbihjb25maWcoJ3dpdGgnKSkKLSAgICB3aXRob3V0ID0gZXh0cmFjdF9zZWxlY3Rpb24oY29uZmlnKCd3aXRob3V0JykpCi0gICAgQHNlbGVjdGVkID0gQGluc3RhbGxlcnMua2V5cy5zZWxlY3Qge3xuYW1lfAotICAgICAgICAgICAgICAgICAgKHdpdGguZW1wdHk/IG9yIHdpdGguaW5jbHVkZT8obmFtZSkpIFwKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHdpdGhvdXQuaW5jbHVkZT8obmFtZSkKLSAgICAgICAgICAgICAgICB9Ci0gIGVuZAotCi0gIGRlZiBleHRyYWN0X3NlbGVjdGlvbihsaXN0KQotICAgIGEgPSBsaXN0LnNwbGl0KC8sLykKLSAgICBhLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBzZXR1cF9yYl9lcnJvciAibm8gc3VjaCBwYWNrYWdlOiAje25hbWV9IiAgdW5sZXNzIEBpbnN0YWxsZXJzLmtleT8obmFtZSkKLSAgICBlbmQKLSAgICBhCi0gIGVuZAotCi0gIGRlZiBwcmludF91c2FnZShmKQotICAgIHN1cGVyCi0gICAgZi5wdXRzICdJbmx1ZGVkIHBhY2thZ2VzOicKLSAgICBmLnB1dHMgJyAgJyArIEBwYWNrYWdlcy5zb3J0LmpvaW4oJyAnKQotICAgIGYucHV0cwotICBlbmQKLQotICAjCi0gICMgVGFzayBIYW5kbGVycwotICAjCi0KLSAgZGVmIGV4ZWNfY29uZmlnCi0gICAgcnVuX2hvb2sgJ3ByZS1jb25maWcnCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX2NvbmZpZyB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3QtY29uZmlnJwotICAgIEBjb25maWcuc2F2ZSAgICMgbXVzdCBiZSBmaW5hbAotICBlbmQKLQotICBkZWYgZXhlY19zZXR1cAotICAgIHJ1bl9ob29rICdwcmUtc2V0dXAnCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX3NldHVwIH0KLSAgICBydW5faG9vayAncG9zdC1zZXR1cCcKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfaW5zdGFsbAotICAgIHJ1bl9ob29rICdwcmUtaW5zdGFsbCcKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfaW5zdGFsbCB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3QtaW5zdGFsbCcKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfdGVzdAotICAgIHJ1bl9ob29rICdwcmUtdGVzdCcKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfdGVzdCB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3QtdGVzdCcKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfY2xlYW4KLSAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKLSAgICBydW5faG9vayAncHJlLWNsZWFuJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19jbGVhbiB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3QtY2xlYW4nCi0gIGVuZAotCi0gIGRlZiBleGVjX2Rpc3RjbGVhbgotICAgIHJtX2YgQGNvbmZpZy5zYXZlZmlsZQotICAgIHJ1bl9ob29rICdwcmUtZGlzdGNsZWFuJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19kaXN0Y2xlYW4gfQotICAgIHJ1bl9ob29rICdwb3N0LWRpc3RjbGVhbicKLSAgZW5kCi0KLSAgIwotICAjIGxpYgotICAjCi0KLSAgZGVmIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycwotICAgIERpci5ta2RpciAncGFja2FnZXMnIHVubGVzcyBGaWxlLmRpcj8oJ3BhY2thZ2VzJykKLSAgICBAc2VsZWN0ZWQuZWFjaCBkbyB8cGFja3wKLSAgICAgICRzdGRlcnIucHV0cyAiUHJvY2Vzc2luZyB0aGUgcGFja2FnZSBgI3twYWNrfScgLi4uIiBpZiB2ZXJib3NlPwotICAgICAgRGlyLm1rZGlyICJwYWNrYWdlcy8je3BhY2t9IiB1bmxlc3MgRmlsZS5kaXI/KCJwYWNrYWdlcy8je3BhY2t9IikKLSAgICAgIERpci5jaGRpciAicGFja2FnZXMvI3twYWNrfSIKLSAgICAgIHlpZWxkIEBpbnN0YWxsZXJzW3BhY2tdCi0gICAgICBEaXIuY2hkaXIgJy4uLy4uJwotICAgIGVuZAotICBlbmQKLQotICBkZWYgcnVuX2hvb2soaWQpCi0gICAgQHJvb3RfaW5zdGFsbGVyLnJ1bl9ob29rIGlkCi0gIGVuZAotCi0gICMgbW9kdWxlIEZpbGVPcGVyYXRpb25zIHJlcXVpcmVzIHRoaXMKLSAgZGVmIHZlcmJvc2U/Ci0gICAgQGNvbmZpZy52ZXJib3NlPwotICBlbmQKLQotICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCi0gIGRlZiBub19oYXJtPwotICAgIEBjb25maWcubm9faGFybT8KLSAgZW5kCi0KLWVuZCAgICMgY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXJNdWx0aQotCi0KLWNsYXNzIEluc3RhbGxlcgotCi0gIEZJTEVUWVBFUyA9ICV3KCBiaW4gbGliIGV4dCBkYXRhIGNvbmYgbWFuICkKLQotICBpbmNsdWRlIEZpbGVPcGVyYXRpb25zCi0gIGluY2x1ZGUgSG9va1NjcmlwdEFQSQotCi0gIGRlZiBpbml0aWFsaXplKGNvbmZpZywgc3Jjcm9vdCwgb2Jqcm9vdCkKLSAgICBAY29uZmlnID0gY29uZmlnCi0gICAgQHNyY2RpciA9IEZpbGUuZXhwYW5kX3BhdGgoc3Jjcm9vdCkKLSAgICBAb2JqZGlyID0gRmlsZS5leHBhbmRfcGF0aChvYmpyb290KQotICAgIEBjdXJyZGlyID0gJy4nCi0gIGVuZAotCi0gIGRlZiBpbnNwZWN0Ci0gICAgIiM8I3tzZWxmLmNsYXNzfSAje0ZpbGUuYmFzZW5hbWUoQHNyY2Rpcil9PiIKLSAgZW5kCi0KLSAgZGVmIG5vb3AocmVsKQotICBlbmQKLQotICAjCi0gICMgSG9vayBTY3JpcHQgQVBJIGJhc2UgbWV0aG9kcwotICAjCi0KLSAgZGVmIHNyY2Rpcl9yb290Ci0gICAgQHNyY2RpcgotICBlbmQKLQotICBkZWYgb2JqZGlyX3Jvb3QKLSAgICBAb2JqZGlyCi0gIGVuZAotCi0gIGRlZiByZWxwYXRoCi0gICAgQGN1cnJkaXIKLSAgZW5kCi0KLSAgIwotICAjIENvbmZpZyBBY2Nlc3MKLSAgIwotCi0gICMgbW9kdWxlIEZpbGVPcGVyYXRpb25zIHJlcXVpcmVzIHRoaXMKLSAgZGVmIHZlcmJvc2U/Ci0gICAgQGNvbmZpZy52ZXJib3NlPwotICBlbmQKLQotICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCi0gIGRlZiBub19oYXJtPwotICAgIEBjb25maWcubm9faGFybT8KLSAgZW5kCi0KLSAgZGVmIHZlcmJvc2Vfb2ZmCi0gICAgYmVnaW4KLSAgICAgIHNhdmUsIEBjb25maWcudmVyYm9zZSA9IEBjb25maWcudmVyYm9zZT8sIGZhbHNlCi0gICAgICB5aWVsZAotICAgIGVuc3VyZQotICAgICAgQGNvbmZpZy52ZXJib3NlID0gc2F2ZQotICAgIGVuZAotICBlbmQKLQotICAjCi0gICMgVEFTSyBjb25maWcKLSAgIwotCi0gIGRlZiBleGVjX2NvbmZpZwotICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnY29uZmlnJwotICBlbmQKLQotICBhbGlhcyBjb25maWdfZGlyX2JpbiBub29wCi0gIGFsaWFzIGNvbmZpZ19kaXJfbGliIG5vb3AKLQotICBkZWYgY29uZmlnX2Rpcl9leHQocmVsKQotICAgIGV4dGNvbmYgaWYgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQotICBlbmQKLQotICBhbGlhcyBjb25maWdfZGlyX2RhdGEgbm9vcAotICBhbGlhcyBjb25maWdfZGlyX2NvbmYgbm9vcAotICBhbGlhcyBjb25maWdfZGlyX21hbiBub29wCi0KLSAgZGVmIGV4dGNvbmYKLSAgICBydWJ5ICIje2N1cnJfc3JjZGlyKCl9L2V4dGNvbmYucmIiLCAqQGNvbmZpZy5jb25maWdfb3B0Ci0gIGVuZAotCi0gICMKLSAgIyBUQVNLIHNldHVwCi0gICMKLQotICBkZWYgZXhlY19zZXR1cAotICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnc2V0dXAnCi0gIGVuZAotCi0gIGRlZiBzZXR1cF9kaXJfYmluKHJlbCkKLSAgICBmaWxlc19vZihjdXJyX3NyY2RpcigpKS5lYWNoIGRvIHxmbmFtZXwKLSAgICAgIHVwZGF0ZV9zaGViYW5nX2xpbmUgIiN7Y3Vycl9zcmNkaXIoKX0vI3tmbmFtZX0iCi0gICAgZW5kCi0gIGVuZAotCi0gIGFsaWFzIHNldHVwX2Rpcl9saWIgbm9vcAotCi0gIGRlZiBzZXR1cF9kaXJfZXh0KHJlbCkKLSAgICBtYWtlIGlmIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgZW5kCi0KLSAgYWxpYXMgc2V0dXBfZGlyX2RhdGEgbm9vcAotICBhbGlhcyBzZXR1cF9kaXJfY29uZiBub29wCi0gIGFsaWFzIHNldHVwX2Rpcl9tYW4gbm9vcAotCi0gIGRlZiB1cGRhdGVfc2hlYmFuZ19saW5lKHBhdGgpCi0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0gICAgcmV0dXJuIGlmIGNvbmZpZygnc2hlYmFuZycpID09ICduZXZlcicKLSAgICBvbGQgPSBTaGViYW5nLmxvYWQocGF0aCkKLSAgICBpZiBvbGQKLSAgICAgICRzdGRlcnIucHV0cyAid2FybmluZzogI3twYXRofTogU2hlYmFuZyBsaW5lIGluY2x1ZGVzIHRvbyBtYW55IGFyZ3MuICBJdCBpcyBub3QgcG9ydGFibGUgYW5kIHlvdXIgcHJvZ3JhbSBtYXkgbm90IHdvcmsuIiBpZiBvbGQuYXJncy5zaXplID4gMQotICAgICAgbmV3ID0gbmV3X3NoZWJhbmcob2xkKQotICAgICAgcmV0dXJuIGlmIG5ldy50b19zID09IG9sZC50b19zCi0gICAgZWxzZQotICAgICAgcmV0dXJuIHVubGVzcyBjb25maWcoJ3NoZWJhbmcnKSA9PSAnYWxsJwotICAgICAgbmV3ID0gU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpKQotICAgIGVuZAotICAgICRzdGRlcnIucHV0cyAidXBkYXRpbmcgc2hlYmFuZzogI3tGaWxlLmJhc2VuYW1lKHBhdGgpfSIgaWYgdmVyYm9zZT8KLSAgICBvcGVuX2F0b21pY193cml0ZXIocGF0aCkge3xvdXRwdXR8Ci0gICAgICBGaWxlLm9wZW4ocGF0aCwgJ3JiJykge3xmfAotICAgICAgICBmLmdldHMgaWYgb2xkICAgIyBkaXNjYXJkCi0gICAgICAgIG91dHB1dC5wdXRzIG5ldy50b19zCi0gICAgICAgIG91dHB1dC5wcmludCBmLnJlYWQKLSAgICAgIH0KLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBuZXdfc2hlYmFuZyhvbGQpCi0gICAgaWYgL1xBcnVieS8gPX4gRmlsZS5iYXNlbmFtZShvbGQuY21kKQotICAgICAgU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpLCBvbGQuYXJncykKLSAgICBlbHNpZiBGaWxlLmJhc2VuYW1lKG9sZC5jbWQpID09ICdlbnYnIGFuZCBvbGQuYXJncy5maXJzdCA9PSAncnVieScKLSAgICAgIFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSwgb2xkLmFyZ3NbMS4uLTFdKQotICAgIGVsc2UKLSAgICAgIHJldHVybiBvbGQgdW5sZXNzIGNvbmZpZygnc2hlYmFuZycpID09ICdhbGwnCi0gICAgICBTaGViYW5nLm5ldyhjb25maWcoJ3J1YnlwYXRoJykpCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBvcGVuX2F0b21pY193cml0ZXIocGF0aCwgJmJsb2NrKQotICAgIHRtcGZpbGUgPSBGaWxlLmJhc2VuYW1lKHBhdGgpICsgJy50bXAnCi0gICAgYmVnaW4KLSAgICAgIEZpbGUub3Blbih0bXBmaWxlLCAnd2InLCAmYmxvY2spCi0gICAgICBGaWxlLnJlbmFtZSB0bXBmaWxlLCBGaWxlLmJhc2VuYW1lKHBhdGgpCi0gICAgZW5zdXJlCi0gICAgICBGaWxlLnVubGluayB0bXBmaWxlIGlmIEZpbGUuZXhpc3Q/KHRtcGZpbGUpCi0gICAgZW5kCi0gIGVuZAotCi0gIGNsYXNzIFNoZWJhbmcKLSAgICBkZWYgU2hlYmFuZy5sb2FkKHBhdGgpCi0gICAgICBsaW5lID0gbmlsCi0gICAgICBGaWxlLm9wZW4ocGF0aCkge3xmfAotICAgICAgICBsaW5lID0gZi5nZXRzCi0gICAgICB9Ci0gICAgICByZXR1cm4gbmlsIHVubGVzcyAvXEEjIS8gPX4gbGluZQotICAgICAgcGFyc2UobGluZSkKLSAgICBlbmQKLQotICAgIGRlZiBTaGViYW5nLnBhcnNlKGxpbmUpCi0gICAgICBjbWQsICphcmdzID0gKmxpbmUuc3RyaXAuc3ViKC9cQVwjIS8sICcnKS5zcGxpdCgnICcpCi0gICAgICBuZXcoY21kLCBhcmdzKQotICAgIGVuZAotCi0gICAgZGVmIGluaXRpYWxpemUoY21kLCBhcmdzID0gW10pCi0gICAgICBAY21kID0gY21kCi0gICAgICBAYXJncyA9IGFyZ3MKLSAgICBlbmQKLQotICAgIGF0dHJfcmVhZGVyIDpjbWQKLSAgICBhdHRyX3JlYWRlciA6YXJncwotCi0gICAgZGVmIHRvX3MKLSAgICAgICIjISAje0BjbWR9IiArIChAYXJncy5lbXB0eT8gPyAnJyA6ICIgI3tAYXJncy5qb2luKCcgJyl9IikKLSAgICBlbmQKLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgaW5zdGFsbAotICAjCi0KLSAgZGVmIGV4ZWNfaW5zdGFsbAotICAgIHJtX2YgJ0luc3RhbGxlZEZpbGVzJwotICAgIGV4ZWNfdGFza190cmF2ZXJzZSAnaW5zdGFsbCcKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2JpbihyZWwpCi0gICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ2JpbmRpcicpfS8je3JlbH0iLCAwNzU1Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9saWIocmVsKQotICAgIGluc3RhbGxfZmlsZXMgbGliZmlsZXMoKSwgIiN7Y29uZmlnKCdyYmRpcicpfS8je3JlbH0iLCAwNjQ0Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9leHQocmVsKQotICAgIHJldHVybiB1bmxlc3MgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQotICAgIGluc3RhbGxfZmlsZXMgcnVieWV4dGVudGlvbnMoJy4nKSwKLSAgICAgICAgICAgICAgICAgICIje2NvbmZpZygnc29kaXInKX0vI3tGaWxlLmRpcm5hbWUocmVsKX0iLAotICAgICAgICAgICAgICAgICAgMDU1NQotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfZGF0YShyZWwpCi0gICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ2RhdGFkaXInKX0vI3tyZWx9IiwgMDY0NAotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfY29uZihyZWwpCi0gICAgIyBGSVhNRTogc2hvdWxkIG5vdCByZW1vdmUgY3VycmVudCBjb25maWcgZmlsZXMKLSAgICAjIChyZW5hbWUgcHJldmlvdXMgZmlsZSB0byAub2xkLy5vcmcpCi0gICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ3N5c2NvbmZkaXInKX0vI3tyZWx9IiwgMDY0NAotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfbWFuKHJlbCkKLSAgICBpbnN0YWxsX2ZpbGVzIHRhcmdldGZpbGVzKCksICIje2NvbmZpZygnbWFuZGlyJyl9LyN7cmVsfSIsIDA2NDQKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZmlsZXMobGlzdCwgZGVzdCwgbW9kZSkKLSAgICBta2Rpcl9wIGRlc3QsIEBjb25maWcuaW5zdGFsbF9wcmVmaXgKLSAgICBsaXN0LmVhY2ggZG8gfGZuYW1lfAotICAgICAgaW5zdGFsbCBmbmFtZSwgZGVzdCwgbW9kZSwgQGNvbmZpZy5pbnN0YWxsX3ByZWZpeAotICAgIGVuZAotICBlbmQKLQotICBkZWYgbGliZmlsZXMKLSAgICBnbG9iX3JlamVjdCgldygqLnkgKi5vdXRwdXQpLCB0YXJnZXRmaWxlcygpKQotICBlbmQKLQotICBkZWYgcnVieWV4dGVudGlvbnMoZGlyKQotICAgIGVudHMgPSBnbG9iX3NlbGVjdCgiKi4je0Bjb25maWcuZGxsZXh0fSIsIHRhcmdldGZpbGVzKCkpCi0gICAgaWYgZW50cy5lbXB0eT8KLSAgICAgIHNldHVwX3JiX2Vycm9yICJubyBydWJ5IGV4dGVudGlvbiBleGlzdHM6ICdydWJ5ICN7JDB9IHNldHVwJyBmaXJzdCIKLSAgICBlbmQKLSAgICBlbnRzCi0gIGVuZAotCi0gIGRlZiB0YXJnZXRmaWxlcwotICAgIG1hcGRpcihleGlzdGZpbGVzKCkgLSBob29rZmlsZXMoKSkKLSAgZW5kCi0KLSAgZGVmIG1hcGRpcihlbnRzKQotICAgIGVudHMubWFwIHt8ZW50fAotICAgICAgaWYgRmlsZS5leGlzdD8oZW50KQotICAgICAgdGhlbiBlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIyBvYmpkaXIKLSAgICAgIGVsc2UgIiN7Y3Vycl9zcmNkaXIoKX0vI3tlbnR9IiAgICMgc3JjZGlyCi0gICAgICBlbmQKLSAgICB9Ci0gIGVuZAotCi0gICMgcGlja2VkIHVwIG1hbnkgZW50cmllcyBmcm9tIGN2cy0xLjExLjEvc3JjL2lnbm9yZS5jCi0gIEpVTktfRklMRVMgPSAldygKLSAgICBjb3JlIFJDU0xPRyB0YWdzIFRBR1MgLm1ha2Uuc3RhdGUKLSAgICAubnNlX2RlcGluZm8gIyogLiMqIGN2c2xvZy4qICwqIC5kZWwtKiAqLm9sYgotICAgICp+ICoub2xkICouYmFrICouQkFLICoub3JpZyAqLnJlaiBfJCogKiQKLQotICAgICoub3JnICouaW4gLioKLSAgKQotCi0gIGRlZiBleGlzdGZpbGVzCi0gICAgZ2xvYl9yZWplY3QoSlVOS19GSUxFUywgKGZpbGVzX29mKGN1cnJfc3JjZGlyKCkpIHwgZmlsZXNfb2YoJy4nKSkpCi0gIGVuZAotCi0gIGRlZiBob29rZmlsZXMKLSAgICAldyggcHJlLSVzIHBvc3QtJXMgcHJlLSVzLnJiIHBvc3QtJXMucmIgKS5tYXAge3xmbXR8Ci0gICAgICAldyggY29uZmlnIHNldHVwIGluc3RhbGwgY2xlYW4gKS5tYXAge3x0fCBzcHJpbnRmKGZtdCwgdCkgfQotICAgIH0uZmxhdHRlbgotICBlbmQKLQotICBkZWYgZ2xvYl9zZWxlY3QocGF0LCBlbnRzKQotICAgIHJlID0gZ2xvYnMycmUoW3BhdF0pCi0gICAgZW50cy5zZWxlY3Qge3xlbnR8IHJlID1+IGVudCB9Ci0gIGVuZAotCi0gIGRlZiBnbG9iX3JlamVjdChwYXRzLCBlbnRzKQotICAgIHJlID0gZ2xvYnMycmUocGF0cykKLSAgICBlbnRzLnJlamVjdCB7fGVudHwgcmUgPX4gZW50IH0KLSAgZW5kCi0KLSAgR0xPQjJSRUdFWCA9IHsKLSAgICAnLicgPT4gJ1wuJywKLSAgICAnJCcgPT4gJ1wkJywKLSAgICAnIycgPT4gJ1wjJywKLSAgICAnKicgPT4gJy4qJwotICB9Ci0KLSAgZGVmIGdsb2JzMnJlKHBhdHMpCi0gICAgL1xBKD86I3sKLSAgICAgIHBhdHMubWFwIHt8cGF0fCBwYXQuZ3N1YigvW1wuXCRcI1wqXS8pIHt8Y2h8IEdMT0IyUkVHRVhbY2hdIH0gfS5qb2luKCd8JykKLSAgICB9KVx6LwotICBlbmQKLQotICAjCi0gICMgVEFTSyB0ZXN0Ci0gICMKLQotICBURVNURElSID0gJ3Rlc3QnCi0KLSAgZGVmIGV4ZWNfdGVzdAotICAgIHVubGVzcyBGaWxlLmRpcmVjdG9yeT8oJ3Rlc3QnKQotICAgICAgJHN0ZGVyci5wdXRzICdubyB0ZXN0IGluIHRoaXMgcGFja2FnZScgaWYgdmVyYm9zZT8KLSAgICAgIHJldHVybgotICAgIGVuZAotICAgICRzdGRlcnIucHV0cyAnUnVubmluZyB0ZXN0cy4uLicgaWYgdmVyYm9zZT8KLSAgICBiZWdpbgotICAgICAgcmVxdWlyZSAndGVzdC91bml0JwotICAgIHJlc2N1ZSBMb2FkRXJyb3IKLSAgICAgIHNldHVwX3JiX2Vycm9yICd0ZXN0L3VuaXQgY2Fubm90IGxvYWRlZC4gIFlvdSBuZWVkIFJ1YnkgMS44IG9yIGxhdGVyIHRvIGludm9rZSB0aGlzIHRhc2suJwotICAgIGVuZAotICAgIHJ1bm5lciA9IFRlc3Q6OlVuaXQ6OkF1dG9SdW5uZXIubmV3KHRydWUpCi0gICAgcnVubmVyLnRvX3J1biA8PCBURVNURElSCi0gICAgcnVubmVyLnJ1bgotICBlbmQKLQotICAjCi0gICMgVEFTSyBjbGVhbgotICAjCi0KLSAgZGVmIGV4ZWNfY2xlYW4KLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ2NsZWFuJwotICAgIHJtX2YgQGNvbmZpZy5zYXZlZmlsZQotICAgIHJtX2YgJ0luc3RhbGxlZEZpbGVzJwotICBlbmQKLQotICBhbGlhcyBjbGVhbl9kaXJfYmluIG5vb3AKLSAgYWxpYXMgY2xlYW5fZGlyX2xpYiBub29wCi0gIGFsaWFzIGNsZWFuX2Rpcl9kYXRhIG5vb3AKLSAgYWxpYXMgY2xlYW5fZGlyX2NvbmYgbm9vcAotICBhbGlhcyBjbGVhbl9kaXJfbWFuIG5vb3AKLQotICBkZWYgY2xlYW5fZGlyX2V4dChyZWwpCi0gICAgcmV0dXJuIHVubGVzcyBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gICAgbWFrZSAnY2xlYW4nIGlmIEZpbGUuZmlsZT8oJ01ha2VmaWxlJykKLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgZGlzdGNsZWFuCi0gICMKLQotICBkZWYgZXhlY19kaXN0Y2xlYW4KLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ2Rpc3RjbGVhbicKLSAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKLSAgICBybV9mICdJbnN0YWxsZWRGaWxlcycKLSAgZW5kCi0KLSAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9iaW4gbm9vcAotICBhbGlhcyBkaXN0Y2xlYW5fZGlyX2xpYiBub29wCi0KLSAgZGVmIGRpc3RjbGVhbl9kaXJfZXh0KHJlbCkKLSAgICByZXR1cm4gdW5sZXNzIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgICBtYWtlICdkaXN0Y2xlYW4nIGlmIEZpbGUuZmlsZT8oJ01ha2VmaWxlJykKLSAgZW5kCi0KLSAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9kYXRhIG5vb3AKLSAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9jb25mIG5vb3AKLSAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9tYW4gbm9vcAotCi0gICMKLSAgIyBUcmF2ZXJzaW5nCi0gICMKLQotICBkZWYgZXhlY190YXNrX3RyYXZlcnNlKHRhc2spCi0gICAgcnVuX2hvb2sgInByZS0je3Rhc2t9IgotICAgIEZJTEVUWVBFUy5lYWNoIGRvIHx0eXBlfAotICAgICAgaWYgdHlwZSA9PSAnZXh0JyBhbmQgY29uZmlnKCd3aXRob3V0LWV4dCcpID09ICd5ZXMnCi0gICAgICAgICRzdGRlcnIucHV0cyAnc2tpcHBpbmcgZXh0LyogYnkgdXNlciBvcHRpb24nIGlmIHZlcmJvc2U/Ci0gICAgICAgIG5leHQKLSAgICAgIGVuZAotICAgICAgdHJhdmVyc2UgdGFzaywgdHlwZSwgIiN7dGFza31fZGlyXyN7dHlwZX0iCi0gICAgZW5kCi0gICAgcnVuX2hvb2sgInBvc3QtI3t0YXNrfSIKLSAgZW5kCi0KLSAgZGVmIHRyYXZlcnNlKHRhc2ssIHJlbCwgbWlkKQotICAgIGRpdmVfaW50byhyZWwpIHsKLSAgICAgIHJ1bl9ob29rICJwcmUtI3t0YXNrfSIKLSAgICAgIF9fc2VuZF9fIG1pZCwgcmVsLnN1YiglcltcQS4qPyg/Oi98XHopXSwgJycpCi0gICAgICBkaXJlY3Rvcmllc19vZihjdXJyX3NyY2RpcigpKS5lYWNoIGRvIHxkfAotICAgICAgICB0cmF2ZXJzZSB0YXNrLCAiI3tyZWx9LyN7ZH0iLCBtaWQKLSAgICAgIGVuZAotICAgICAgcnVuX2hvb2sgInBvc3QtI3t0YXNrfSIKLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBkaXZlX2ludG8ocmVsKQotICAgIHJldHVybiB1bmxlc3MgRmlsZS5kaXI/KCIje0BzcmNkaXJ9LyN7cmVsfSIpCi0KLSAgICBkaXIgPSBGaWxlLmJhc2VuYW1lKHJlbCkKLSAgICBEaXIubWtkaXIgZGlyIHVubGVzcyBGaWxlLmRpcj8oZGlyKQotICAgIHByZXZkaXIgPSBEaXIucHdkCi0gICAgRGlyLmNoZGlyIGRpcgotICAgICRzdGRlcnIucHV0cyAnLS0tPiAnICsgcmVsIGlmIHZlcmJvc2U/Ci0gICAgQGN1cnJkaXIgPSByZWwKLSAgICB5aWVsZAotICAgIERpci5jaGRpciBwcmV2ZGlyCi0gICAgJHN0ZGVyci5wdXRzICc8LS0tICcgKyByZWwgaWYgdmVyYm9zZT8KLSAgICBAY3VycmRpciA9IEZpbGUuZGlybmFtZShyZWwpCi0gIGVuZAotCi0gIGRlZiBydW5faG9vayhpZCkKLSAgICBwYXRoID0gWyAiI3tjdXJyX3NyY2RpcigpfS8je2lkfSIsCi0gICAgICAgICAgICAgIiN7Y3Vycl9zcmNkaXIoKX0vI3tpZH0ucmIiIF0uZGV0ZWN0IHt8Y2FuZHwgRmlsZS5maWxlPyhjYW5kKSB9Ci0gICAgcmV0dXJuIHVubGVzcyBwYXRoCi0gICAgYmVnaW4KLSAgICAgIGluc3RhbmNlX2V2YWwgRmlsZS5yZWFkKHBhdGgpLCBwYXRoLCAxCi0gICAgcmVzY3VlCi0gICAgICByYWlzZSBpZiAkREVCVUcKLSAgICAgIHNldHVwX3JiX2Vycm9yICJob29rICN7cGF0aH0gZmFpbGVkOlxuIiArICQhLm1lc3NhZ2UKLSAgICBlbmQKLSAgZW5kCi0KLWVuZCAgICMgY2xhc3MgSW5zdGFsbGVyCi0KLQotY2xhc3MgU2V0dXBFcnJvciA8IFN0YW5kYXJkRXJyb3I7IGVuZAotCi1kZWYgc2V0dXBfcmJfZXJyb3IobXNnKQotICByYWlzZSBTZXR1cEVycm9yLCBtc2cKLWVuZAotCi1pZiAkMCA9PSBfX0ZJTEVfXwotICBiZWdpbgotICAgIFRvcGxldmVsSW5zdGFsbGVyLmludm9rZQotICByZXNjdWUgU2V0dXBFcnJvcgotICAgIHJhaXNlIGlmICRERUJVRwotICAgICRzdGRlcnIucHV0cyAkIS5tZXNzYWdlCi0gICAgJHN0ZGVyci5wdXRzICJUcnkgJ3J1YnkgI3skMH0gLS1oZWxwJyBmb3IgZGV0YWlsZWQgdXNhZ2UuIgotICAgIGV4aXQgMQotICBlbmQKLWVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvQmFzZVNlcnZpY2UudGhyaWZ0IGIvbGliL3JiL3NwZWMvQmFzZVNlcnZpY2UudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2QzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9CYXNlU2VydmljZS50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBCYXNlCisKK3N0cnVjdCBIZWxsbyB7CisgIDE6IHN0cmluZyBncmVldGluZyA9ICJoZWxsbyB3b3JsZCIKK30KKworc2VydmljZSBCYXNlU2VydmljZSB7CisgIEhlbGxvIGdyZWV0aW5nKDE6Ym9vbCBlbmdsaXNoKQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCBiL2xpYi9yYi9zcGVjL0V4dGVuZGVkU2VydmljZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2YjcwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL0V4dGVuZGVkU2VydmljZS50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBFeHRlbmRlZAorCitpbmNsdWRlICJCYXNlU2VydmljZS50aHJpZnQiCisKK3NlcnZpY2UgRXh0ZW5kZWRTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2UuQmFzZVNlcnZpY2UgeworICB2b2lkIHBpbmcoKQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvUmVmZXJlbmNlZC50aHJpZnQgYi9saWIvcmIvc3BlYy9SZWZlcmVuY2VkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYxODNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvUmVmZXJlbmNlZC50aHJpZnQKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIE90aGVyTmFtZXNwYWNlCisKK2VudW0gU29tZUVudW0geworICBPTkUKKyAgVFdPCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQgYi9saWIvcmIvc3BlYy9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMjg4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdApAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2UKKworaW5jbHVkZSAiUmVmZXJlbmNlZC50aHJpZnQiCisKK3N0cnVjdCBIZWxsbyB7CisgIDE6IHN0cmluZyBncmVldGluZyA9ICJoZWxsbyB3b3JsZCIKK30KKworc2VydmljZSBOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlIHsKKyAgSGVsbG8gZ3JlZXRpbmcoMTpib29sIGVuZ2xpc2gpCisgIGJvb2wgYmxvY2soKQorICBvbmV3YXkgdm9pZCB1bmJsb2NrKDE6aTMyIG4pCisgIG9uZXdheSB2b2lkIHNodXRkb3duKCkKKyAgdm9pZCBzbGVlcCgxOmRvdWJsZSBzZWNvbmRzKQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQgYi9saWIvcmIvc3BlYy9UaHJpZnRTcGVjLnRocmlmdAppbmRleCBlNGRlY2U0Li5iNDI0ODFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9UaHJpZnRTcGVjLnRocmlmdAorKysgYi9saWIvcmIvc3BlYy9UaHJpZnRTcGVjLnRocmlmdApAQCAtMTI5LDQgKzEyOSw1NSBAQAogCiBzdHJ1Y3QgU3RydWN0V2l0aEVudW1NYXAgewogICAxOiBtYXA8U29tZUVudW0sIGxpc3Q8U29tZUVudW0+PiBteV9tYXA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQorCisjIE5lc3RlZCBsaXN0cworc3RydWN0IE5lc3RlZExpc3RJbkxpc3QgeworICAxOiBsaXN0PGxpc3Q8Ynl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRMaXN0SW5TZXQgeworICAxOiBzZXQ8bGlzdDxieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZExpc3RJbk1hcEtleSB7CisgIDE6IG1hcDxsaXN0PGJ5dGU+LCBieXRlPiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTGlzdEluTWFwVmFsdWUgeworICAxOiBtYXA8Ynl0ZSwgbGlzdDxieXRlPj4gdmFsdWUKK30KKworIyBOZXN0ZWQgc2V0cworc3RydWN0IE5lc3RlZFNldEluTGlzdCB7CisgIDE6IGxpc3Q8c2V0PGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkU2V0SW5TZXQgeworICAxOiBzZXQ8c2V0PGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkU2V0SW5NYXBLZXkgeworICAxOiBtYXA8c2V0PGJ5dGU+LCBieXRlPiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkU2V0SW5NYXBWYWx1ZSB7CisgIDE6IG1hcDxieXRlLCBzZXQ8Ynl0ZT4+IHZhbHVlCit9CisKKyMgTmVzdGVkIG1hcHMKK3N0cnVjdCBOZXN0ZWRNYXBJbkxpc3QgeworICAxOiBsaXN0PG1hcDxieXRlLCBieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZE1hcEluU2V0IHsKKyAgMTogc2V0PG1hcDxieXRlLCBieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZE1hcEluTWFwS2V5IHsKKyAgMjogbWFwPG1hcDxieXRlLCBieXRlPiwgYnl0ZT4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZE1hcEluTWFwVmFsdWUgeworICAyOiBtYXA8Ynl0ZSwgbWFwPGJ5dGUsIGJ5dGU+PiB2YWx1ZQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCmluZGV4IGVmYjE2ZDguLmVjYTkzNmIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKQEAgLTE3LDE0NCArMTcsMjEwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdEJhc2VQcm90b2NvbFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdCYXNlUHJvdG9jb2wnIGRvCiAKICAgYmVmb3JlKDplYWNoKSBkbwotICAgIEB0cmFucyA9IG1vY2soIk1vY2tUcmFuc3BvcnQiKQotICAgIEBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhAdHJhbnMpCisgICAgQHRyYW5zID0gZG91YmxlKCJNb2NrVHJhbnNwb3J0IikKKyAgICBAcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhAdHJhbnMpCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJhc2VQcm90b2NvbCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VQcm90b2NvbCBkbwogICAgICMgbW9zdCBvZiB0aGUgbWV0aG9kcyBhcmUgc3R1YnMsIHNvIHdlIGNhbiBpZ25vcmUgdGhlbQogCi0gICAgaXQgInNob3VsZCBtYWtlIHRyYW5zIGFjY2Vzc2libGUiIGRvCi0gICAgICBAcHJvdC50cmFucy5zaG91bGQgZXFsKEB0cmFucykKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgidHJhbnMiKQogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHkiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoJ3R5cGUnLCAndmFsdWUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgaXQgInNob3VsZCBtYWtlIHRyYW5zIGFjY2Vzc2libGUiIGRvCisgICAgICBleHBlY3QoQHByb3QudHJhbnMpLnRvIGVxbChAdHJhbnMpCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCBhIGZpZWxkIG5pY2VseSAoZGVwcmVjYXRlZCB3cml0ZV9maWVsZCBzaWduYXR1cmUpJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJ30sICd2YWx1ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV9maWVsZCgnZmllbGQnLCAndHlwZScsICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2J5dGUpLndpdGgoJ2J5dGUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKCdpMzInKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCi0gICAgICBzdHJ1Y3QgPSBtb2NrKCdTdHJ1Y3QnKQotICAgICAgc3RydWN0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6Qk9PTCwgJ2Jvb2wnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6QllURSwgJ2J5dGUnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6RE9VQkxFLCAnZG91YmxlJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkkxNiwgJ2kxNicpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpJMzIsICdpMzInKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6STY0LCAnaTY0JykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OlNUUklORywgJ3N0cmluZycpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpTVFJVQ1QsIHN0cnVjdCkKKyAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCBhIGZpZWxkIG5pY2VseScgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAndmFsdWUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgQHByb3Qud3JpdGVfZmllbGQoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICdmaWQnLCAndmFsdWUnKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcyAoZGVwcmVjYXRlZCB3cml0ZV90eXBlIHNpZ25hdHVyZSknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoJ2Jvb2wnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2J5dGUpLndpdGgoJ2J5dGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoJ2kxNicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKCdpMzInKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ3N0cmluZycpLm9yZGVyZWQKKyAgICAgIHN0cnVjdCA9IGRvdWJsZSgnU3RydWN0JykKKyAgICAgIGV4cGVjdChzdHJ1Y3QpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkJPT0wsICdib29sJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6QllURSwgJ2J5dGUnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpET1VCTEUsICdkb3VibGUnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpJMTYsICdpMTYnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpJMzIsICdpMzInKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpJNjQsICdpNjQnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsICdzdHJpbmcnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIHN0cnVjdCkKICAgICAgICMgYWxsIG90aGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQKLSAgICAgIFtUeXBlczo6U1RPUCwgVHlwZXM6OlZPSUQsIFR5cGVzOjpNQVAsIFR5cGVzOjpTRVQsIFR5cGVzOjpMSVNUXS5lYWNoIGRvIHx0eXBlfAotICAgICAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV90eXBlKHR5cGUsIHR5cGUudG9fcykgfS5zaG91bGQgcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVE9QLCBUaHJpZnQ6OlR5cGVzOjpWT0lELCBUaHJpZnQ6OlR5cGVzOjpNQVAsIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVF0uZWFjaCBkbyB8dHlwZXwKKyAgICAgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfdHlwZSh0eXBlLCB0eXBlLnRvX3MpIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKICAgICAgIGVuZAogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpCT09MKQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpCWVRFKQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpJMTYpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6OkkzMikKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6STY0KQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpET1VCTEUpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6OlNUUklORykKKyAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCB0aGUgZGlmZmVyZW50IHR5cGVzJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2JpbmFyeSkud2l0aCgnYmluYXJ5Jykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAnYm9vbCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgJ2J5dGUnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgJ2RvdWJsZScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAnaTE2JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICdpMzInKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgJ2k2NCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCAnc3RyaW5nJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklORywgOmJpbmFyeSA9PiB0cnVlfSwgJ2JpbmFyeScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCBzdHJ1Y3QpCiAgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCi0gICAgICBbVHlwZXM6OlNUT1AsIFR5cGVzOjpWT0lELCBUeXBlczo6TUFQLCBUeXBlczo6U0VULCBUeXBlczo6TElTVF0uZWFjaCBkbyB8dHlwZXwKLSAgICAgICAgbGFtYmRhIHsgQHByb3QucmVhZF90eXBlKHR5cGUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IHR5cGV9LCB0eXBlLnRvX3MpIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgcmVhZF90eXBlIHNpZ25hdHVyZSknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MKQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6STE2KQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpJNjQpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OlNUUklORykKKyAgICAgICMgYWxsIG90aGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVE9QLCBUaHJpZnQ6OlR5cGVzOjpWT0lELCBUaHJpZnQ6OlR5cGVzOjpNQVAsCisgICAgICAgVGhyaWZ0OjpUeXBlczo6U0VULCBUaHJpZnQ6OlR5cGVzOjpMSVNULCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfdHlwZSh0eXBlKSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYmluYXJ5KS5vcmRlcmVkCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCA6YmluYXJ5ID0+IHRydWV9KQorICAgICAgIyBhbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZAorICAgICAgW1RocmlmdDo6VHlwZXM6OlNUT1AsIFRocmlmdDo6VHlwZXM6OlZPSUQsIFRocmlmdDo6VHlwZXM6Ok1BUCwKKyAgICAgICBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1QsIFRocmlmdDo6VHlwZXM6OlNUUlVDVF0uZWFjaCBkbyB8dHlwZXwKKyAgICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiB0eXBlfSkgfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgdGhlIGJhc2ljIHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkJPT0wpCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpCWVRFKQotICAgICAgQHByb3Quc2tpcChUeXBlczo6STE2KQotICAgICAgQHByb3Quc2tpcChUeXBlczo6STMyKQotICAgICAgQHByb3Quc2tpcChUeXBlczo6STY0KQotICAgICAgQHByb3Quc2tpcChUeXBlczo6RE9VQkxFKQotICAgICAgQHByb3Quc2tpcChUeXBlczo6U1RSSU5HKQotICAgICAgQHByb3Quc2tpcChUeXBlczo6U1RPUCkgIyBzaG91bGQgZG8gYWJzb2x1dGVseSBub3RoaW5nCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6QllURSkKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STE2KQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6Okk2NCkKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OlNUT1ApICMgc2hvdWxkIGRvIGFic29sdXRlbHkgbm90aGluZwogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHN0cnVjdHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDQpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFsnZmllbGQgMScsIFR5cGVzOjpTVFJJTkcsIDFdLAotICAgICAgICBbJ2ZpZWxkIDInLCBUeXBlczo6STMyLCAyXSwKLSAgICAgICAgWydmaWVsZCAzJywgVHlwZXM6Ok1BUCwgM10sCi0gICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDQpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICAgIFsnZmllbGQgMScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCisgICAgICAgIFsnZmllbGQgMicsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCisgICAgICAgIFsnZmllbGQgMycsIFRocmlmdDo6VHlwZXM6Ok1BUCwgM10sCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVHlwZXM6OlNUUklORywgVHlwZXM6OlNUUklORywgMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSkKICAgICAgICMgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5leGFjdGx5KDIpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCi0gICAgICByZWFsX3NraXAuY2FsbChUeXBlczo6U1RSVUNUKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbWFwcyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUeXBlczo6U1RSSU5HLCBUeXBlczo6U1RSVUNULCAxXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oWyJzb21lX3N0cnVjdCJdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbbmlsLCBUeXBlczo6U1RPUCwgbmlsXSk7Ci0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCi0gICAgICByZWFsX3NraXAuY2FsbChUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oWyJzb21lX3N0cnVjdCJdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgbmlsXSk7CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKKyAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6Ok1BUCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzZXRzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1R5cGVzOjpJNjQsIDldKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkLmV4YWN0bHkoOSkudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9lbmQpCi0gICAgICByZWFsX3NraXAuY2FsbChUeXBlczo6U0VUKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJNjQsIDldKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OlNFVCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBsaXN0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVHlwZXM6OkRPVUJMRSwgMTFdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkLmV4YWN0bHkoMTEpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKLSAgICAgIHJlYWxfc2tpcC5jYWxsKFR5cGVzOjpMSVNUKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkLmV4YWN0bHkoMTEpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCisgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpMSVNUKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCYXNlUHJvdG9jb2xGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciIgZG8KICAgICAgICMgcmV0dXJuaW5nIG5pbCBzaW5jZSBQcm90b2NvbCBpcyBqdXN0IGFuIGFic3RyYWN0IGNsYXNzCi0gICAgICBsYW1iZGEge0Jhc2VQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpfS5zaG91bGQgcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGV4cGVjdCB7VGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKaW5kZXggYTI5NjU2Zi4uZDJmNjBhYSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCkBAIC0xNywyMTIgKzE3LDIzNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRCYXNlVHJhbnNwb3J0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ0Jhc2VUcmFuc3BvcnQnIGRvCiAKLSAgZGVzY3JpYmUgVHJhbnNwb3J0RXhjZXB0aW9uIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBtYWtlIHR5cGUgYWNjZXNzaWJsZSIgZG8KLSAgICAgIGV4YyA9IFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4sICJtc2ciKQotICAgICAgZXhjLnR5cGUuc2hvdWxkID09IFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOCi0gICAgICBleGMubWVzc2FnZS5zaG91bGQgPT0gIm1zZyIKKyAgICAgIGV4YyA9IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOLCAibXNnIikKKyAgICAgIGV4cGVjdChleGMudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTikKKyAgICAgIGV4cGVjdChleGMubWVzc2FnZSkudG8gZXEoIm1zZyIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJhc2VUcmFuc3BvcnQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0IGRvCiAgICAgaXQgInNob3VsZCByZWFkIHRoZSBzcGVjaWZpZWQgc2l6ZSIgZG8KLSAgICAgIHRyYW5zcG9ydCA9IEJhc2VUcmFuc3BvcnQubmV3Ci0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoNDApLm9yZGVyZWQuYW5kX3JldHVybigiMTAgbGV0dGVycyIpCi0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMzApLm9yZGVyZWQuYW5kX3JldHVybigiZmlmdGVlbiBsZXR0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNSkub3JkZXJlZC5hbmRfcmV0dXJuKCJtb3JlIGNoYXJhY3RlcnMiKQotICAgICAgdHJhbnNwb3J0LnJlYWRfYWxsKDQwKS5zaG91bGQgPT0gIjEwIGxldHRlcnNmaWZ0ZWVuIGxldHRlcnNtb3JlIGNoYXJhY3RlcnMiCisgICAgICB0cmFuc3BvcnQgPSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubmV3CisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDQwKS5vcmRlcmVkLmFuZF9yZXR1cm4oIjEwIGxldHRlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgzMCkub3JkZXJlZC5hbmRfcmV0dXJuKCJmaWZ0ZWVuIGxldHRlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNSkub3JkZXJlZC5hbmRfcmV0dXJuKCJtb3JlIGNoYXJhY3RlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydC5yZWFkX2FsbCg0MCkpLnRvIGVxKCIxMCBsZXR0ZXJzZmlmdGVlbiBsZXR0ZXJzbW9yZSBjaGFyYWN0ZXJzIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3R1YiBvdXQgdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZHMiIGRvCiAgICAgICAjIGNhbid0IHRlc3QgZm9yIHN0dWJiaW5lc3MsIHNvIGp1c3QgbWFrZSBzdXJlIHRoZXkncmUgZGVmaW5lZAogICAgICAgWzpvcGVuPywgOm9wZW4sIDpjbG9zZSwgOnJlYWQsIDp3cml0ZSwgOmZsdXNoXS5lYWNoIGRvIHxzeW18Ci0gICAgICAgIEJhc2VUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkuc2hvdWxkIGJlX3RydWUKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKSkudG8gYmVfdHJ1dGh5CiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxpYXMgPDwgdG8gd3JpdGUiIGRvCi0gICAgICBCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6PDwpLnNob3VsZCA9PSBCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6d3JpdGUpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6PDwpKS50byBlcShUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDp3cml0ZSkpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCYXNlU2VydmVyVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgc3R1YiBvdXQgaXRzIG1ldGhvZHMiIGRvCiAgICAgICBbOmxpc3RlbiwgOmFjY2VwdCwgOmNsb3NlXS5lYWNoIGRvIHxzeW18Ci0gICAgICAgIEJhc2VTZXJ2ZXJUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkuc2hvdWxkIGJlX3RydWUKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKSkudG8gYmVfdHJ1dGh5CiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVRyYW5zcG9ydEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSB0cmFuc3BvcnQgaXQncyBnaXZlbiIgZG8KLSAgICAgIHRyYW5zcG9ydCA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpLnNob3VsZCBlcWwodHJhbnNwb3J0KQorICAgICAgdHJhbnNwb3J0ID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnNwb3J0KSkudG8gZXFsKHRyYW5zcG9ydCkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCdWZmZXJlZFRyYW5zcG9ydCBkbwotICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgYnV0IHdyaXRlL2ZsdXNoL3JlYWQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkICMgZnJvbSB0aGUgY2xvc2UKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5vcGVuPy5zaG91bGQgPT0gIisgb3Blbj8iCi0gICAgICBidHJhbnMub3Blbi5zaG91bGQgPT0gIisgb3BlbiIKLSAgICAgIGJ0cmFucy5jbG9zZS5zaG91bGQgPT0gIisgY2xvc2UiCisgIGRlc2NyaWJlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQgZG8KKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKS50b19zKS50byBlcSgiYnVmZmVyZWQobW9jaykiKQogICAgIGVuZAotICAgIAotICAgIGl0ICJzaG91bGQgYnVmZmVyIHJlYWRzIGluIGNodW5rcyBvZiAje0J1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUn0iIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVIpLmFuZF9yZXR1cm4oImxvcnVtIGlwc3VtIGRvbG9yIGVtZXQiKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJsb3J1bSAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImlwc3VtICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiZG9sb3IgIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJlbWV0IgorCisgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggZXZlcnl0aGluZyBidXQgd3JpdGUvZmx1c2gvcmVhZCIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZCAjIGZyb20gdGhlIGNsb3NlCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICBleHBlY3QoYnRyYW5zLm9wZW4/KS50byBlcSgiKyBvcGVuPyIpCisgICAgICBleHBlY3QoYnRyYW5zLm9wZW4pLnRvIGVxKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KGJ0cmFucy5jbG9zZSkudG8gZXEoIisgY2xvc2UiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBidWZmZXIgcmVhZHMgaW4gY2h1bmtzIG9mICN7VGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVJ9IiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVIpLmFuZF9yZXR1cm4oImxvcnVtIGlwc3VtIGRvbG9yIGVtZXQiKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJsb3J1bSAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiaXBzdW0gIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImRvbG9yICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJlbWV0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHdyaXRlcyBhbmQgc2VuZCB0aGVtIG9uIGZsdXNoIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBidHJhbnMud3JpdGUoInR3by8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0aHJlZS8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpLm9yZGVyZWQKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKS5vcmRlcmVkCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb25seSBzZW5kIGJ1ZmZlcmVkIGRhdGEgb25jZSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGJ0cmFucy53cml0ZSgidGhyZWUvIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKQotICAgICAgdHJhbnMuc3R1YiEoOmZsdXNoKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKQorICAgICAgYWxsb3codHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgICAjIE5vdGhpbmcgdG8gZmx1c2ggd2l0aCBubyBkYXRhCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKLSAgICAKKwogICAgIGl0ICJzaG91bGQgZmx1c2ggb24gY2xvc2UiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICBleHBlY3QoYnRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucy5jbG9zZQogICAgIGVuZAotICAgIAorCiAgICAgaXQgInNob3VsZCBub3Qgd3JpdGUgdG8gc29ja2V0IGlmIHRoZXJlJ3Mgbm8gZGF0YSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgd3JhcCB0aGUgZ2l2ZW4gdHJhbnNwb3J0IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBidHJhbnMgPSBtb2NrKCJCdWZmZXJlZFRyYW5zcG9ydCIpCi0gICAgICBCdWZmZXJlZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKS5hbmRfcmV0dXJuKGJ0cmFucykKLSAgICAgIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykuc2hvdWxkID09IGJ0cmFucworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBidHJhbnMgPSBkb3VibGUoIkJ1ZmZlcmVkVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpLmFuZF9yZXR1cm4oYnRyYW5zKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKSkudG8gZXEoYnRyYW5zKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJ1ZmZlcmVkIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgRnJhbWVkVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHRvX3MgdGhhdCBkZXNjcmliZXMgdGhlIGVuY2Fwc3VsYXRpb24iIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9jayIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KHRyYW5zKS50b19zKS50byBlcSgiZnJhbWVkKG1vY2spIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIG9wZW4/L29wZW4vY2xvc2UiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCi0gICAgICBmdHJhbnMub3Blbj8uc2hvdWxkID09ICIrIG9wZW4/IgotICAgICAgZnRyYW5zLm9wZW4uc2hvdWxkID09ICIrIG9wZW4iCi0gICAgICBmdHJhbnMuY2xvc2Uuc2hvdWxkID09ICIrIGNsb3NlIgorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCisgICAgICBleHBlY3QoZnRyYW5zLm9wZW4/KS50byBlcSgiKyBvcGVuPyIpCisgICAgICBleHBlY3QoZnRyYW5zLm9wZW4pLnRvIGVxKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KGZ0cmFucy5jbG9zZSkudG8gZXEoIisgY2xvc2UiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZCB3aGVuIHJlYWQgaXMgdHVybmVkIG9mZiIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zLCBmYWxzZSwgdHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHJlYWQiKQotICAgICAgZnRyYW5zLnJlYWQoMTcpLnNob3VsZCA9PSAiKyByZWFkIgorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgZmFsc2UsIHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTcpKS50byBlcSgiKyByZWFkIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHdyaXRlL2ZsdXNoIHdoZW4gd3JpdGUgaXMgdHVybmVkIG9mZiIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zLCB0cnVlLCBmYWxzZSkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvbyIpLm9yZGVyZWQuYW5kX3JldHVybigiKyB3cml0ZSIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgZmx1c2giKQotICAgICAgZnRyYW5zLndyaXRlKCJmb28iKS5zaG91bGQgPT0gIisgd3JpdGUiCi0gICAgICBmdHJhbnMuZmx1c2guc2hvdWxkID09ICIrIGZsdXNoIgorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vIikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgZmx1c2giKQorICAgICAgZXhwZWN0KGZ0cmFucy53cml0ZSgiZm9vIikpLnRvIGVxKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChmdHJhbnMuZmx1c2gpLnRvIGVxKCIrIGZsdXNoIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIGEgZnVsbCBmcmFtZSBpZiBhc2tlZCBmb3IgPj0gdGhlIGZyYW1lJ3MgbGVuZ3RoIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoZnJhbWUubGVuZ3RoICsgMTApLnNob3VsZCA9PSBmcmFtZQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZChmcmFtZS5sZW5ndGggKyAxMCkpLnRvIGVxKGZyYW1lKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gc2xpY2VzIG9mIHRoZSBmcmFtZSB3aGVuIGFza2VkIGZvciA8IHRoZSBmcmFtZSdzIGxlbmd0aCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICIgaXMgIgotICAgICAgZnRyYW5zLnJlYWQoMTYpLnNob3VsZCA9PSAiYSBmcmFtZSIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInRoaXMiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgiIGlzICIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTYpKS50byBlcSgiYSBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBub3RoaW5nIGlmIGFza2VkIGZvciA8PSAwIiBkbwotICAgICAgRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoLTIpLnNob3VsZCA9PSAiIgorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoLTIpKS50byBlcSgiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHVsbCBhIG5ldyBmcmFtZSB3aGVuIHRoZSBmaXJzdCBpcyBleGhhdXN0ZWQiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCiAgICAgICBmcmFtZTIgPSAieWV0IGFub3RoZXIgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciLCAiXDAwMFwwMDBcMDAwXDAyMSIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUyLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZTIpCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKLSAgICAgIGZ0cmFucy5yZWFkKDgpLnNob3VsZCA9PSAiIGlzIGEgZnIiCi0gICAgICBmdHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImFtZSIKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAieWV0ICIKLSAgICAgIGZ0cmFucy5yZWFkKDE2KS5zaG91bGQgPT0gImFub3RoZXIgZnJhbWUiCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IiwgIlwwMDBcMDAwXDAwMFwwMjEiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUyLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZTIpCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgidGhpcyIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoOCkpLnRvIGVxKCIgaXMgYSBmciIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNikpLnRvIGVxKCJhbWUiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgieWV0ICIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTYpKS50byBlcSgiYW5vdGhlciBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciB3cml0ZXMiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfbm90X3JlY2VpdmUoOndyaXRlKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChAdHJhbnMpLm5vdF90byByZWNlaXZlKDp3cml0ZSkKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikKICAgICAgIGZ0cmFucy53cml0ZSgiYmFyIikKICAgICAgIGZ0cmFucy53cml0ZSgidGhpcyBpcyBhIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc2xpY2VzIG9mIHRoZSBidWZmZXIiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCiAgICAgICBmdHJhbnMud3JpdGUoImZvb2JhciIsIDMpCiAgICAgICBmdHJhbnMud3JpdGUoImJhcmZvbyIsIDEpCi0gICAgICBAdHJhbnMuc3R1YiEoOmZsdXNoKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwNGZvb2IiKQorICAgICAgYWxsb3coQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA0Zm9vYiIpCiAgICAgICBmdHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZmx1c2ggZnJhbWVzIHdpdGggYSA0LWJ5dGUgaGVhZGVyIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDM1b25lL3R3by90aHJlZS90aGlzIGlzIGEgZnJhbWUiKS5vcmRlcmVkCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMzVvbmUvdHdvL3RocmVlL3RoaXMgaXMgYSBmcmFtZSIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICBmdHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgZnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGZ0cmFucy53cml0ZSgidGhyZWUvIikKQEAgLTIzMSwxMjAgKzI1NCwxMzQgQEAKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGZsdXNoIHRoZSBzYW1lIGJ1ZmZlcmVkIGRhdGEgdHdpY2UiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDdmb28vYmFyIikKLSAgICAgIEB0cmFucy5zdHViISg6Zmx1c2gpCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDdmb28vYmFyIikKKyAgICAgIGFsbG93KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBmdHJhbnMud3JpdGUoImZvbyIpCiAgICAgICBmdHJhbnMud3JpdGUoIi9iYXIiKQogICAgICAgZnRyYW5zLmZsdXNoCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDAwIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDAwIikKICAgICAgIGZ0cmFucy5mbHVzaAogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgd3JhcCB0aGUgZ2l2ZW4gdHJhbnNwb3J0IGluIGEgRnJhbWVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgRnJhbWVkVHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpCi0gICAgICBGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aCh0cmFucykKKyAgICAgIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiZnJhbWVkIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgTWVtb3J5QnVmZmVyVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQGJ1ZmZlciA9IE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICAgIEBidWZmZXIgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAYnVmZmVyLnRvX3MpLnRvIGVxKCJtZW1vcnkiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYSBidWZmZXIgb24gaW5wdXQgYW5kIHVzZSBpdCBkaXJlY3RseSIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCi0gICAgICBAYnVmZmVyID0gTWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldyhzKQotICAgICAgQGJ1ZmZlci5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKKyAgICAgIEBidWZmZXIgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcocykKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKICAgICAgIHMuc2xpY2UhKC00Li4tMSkKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICIgaXMgYSAiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoIiBpcyBhICIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsd2F5cyByZW1haW4gb3BlbiIgZG8KLSAgICAgIEBidWZmZXIuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAYnVmZmVyKS50byBiZV9vcGVuCiAgICAgICBAYnVmZmVyLmNsb3NlCi0gICAgICBAYnVmZmVyLnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGJ1ZmZlcikudG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXNwb25kIHRvIHBlZWsgYW5kIGF2YWlsYWJsZSIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInNvbWUgZGF0YSIKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfdHJ1ZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDkKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg5KQogICAgICAgQGJ1ZmZlci5yZWFkKDQpCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX3RydWUKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA1CisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNSkKICAgICAgIEBidWZmZXIucmVhZCg1KQotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV9mYWxzZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDAKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBhYmxlIHRvIHJlc2V0IHRoZSBidWZmZXIiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJ0ZXN0IGRhdGEiCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcigiZm9vYmFyIikKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA2Ci0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiZm9vYmFyIgorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg2KQorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCJmb29iYXIiKQogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAwCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNvcHkgdGhlIGdpdmVuIHN0cmluZyB3aGVuIHJlc2V0dGluZyB0aGUgYnVmZmVyIiBkbwogICAgICAgcyA9ICJ0aGlzIGlzIGEgdGVzdCIKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKHMpCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMTQKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMTQpCiAgICAgICBAYnVmZmVyLnJlYWQoMTApCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNAotICAgICAgcy5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IgorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg0KQorICAgICAgZXhwZWN0KHMpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBmcm9tIHJlYWQgd2hhdCB3YXMgZ2l2ZW4gaW4gd3JpdGUiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJ0ZXN0IGRhdGEiCi0gICAgICBAYnVmZmVyLnJlYWQoNCkuc2hvdWxkID09ICJ0ZXN0IgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiBkYXRhIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZCg0KSkudG8gZXEoInRlc3QiKQorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCIgZGF0YSIpCiAgICAgICBAYnVmZmVyLndyaXRlICJmb28iCiAgICAgICBAYnVmZmVyLndyaXRlICIgYmFyIgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gImZvbyBiYXIiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoImZvbyBiYXIiKQogICAgIGVuZAotICAgIAorCiAgICAgaXQgInNob3VsZCB0aHJvdyBhbiBFT0ZFcnJvciB3aGVuIHRoZXJlIGlzbid0IGVub3VnaCBkYXRhIGluIHRoZSBidWZmZXIiIGRvCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcigiIikKLSAgICAgIGxhbWJkYXtAYnVmZmVyLnJlYWQoMSl9LnNob3VsZCByYWlzZV9lcnJvcihFT0ZFcnJvcikKKyAgICAgIGV4cGVjdHtAYnVmZmVyLnJlYWQoMSl9LnRvIHJhaXNlX2Vycm9yKEVPRkVycm9yKQogCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcigiMTIzNCIpCi0gICAgICBsYW1iZGF7QGJ1ZmZlci5yZWFkKDUpfS5zaG91bGQgcmFpc2VfZXJyb3IoRU9GRXJyb3IpCisgICAgICBleHBlY3R7QGJ1ZmZlci5yZWFkKDUpfS50byByYWlzZV9lcnJvcihFT0ZFcnJvcikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgSU9TdHJlYW1UcmFuc3BvcnQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBpbnB1dCA9IG1vY2soIklucHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAb3V0cHV0ID0gbW9jaygiT3V0cHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAdHJhbnMgPSBJT1N0cmVhbVRyYW5zcG9ydC5uZXcoQGlucHV0LCBAb3V0cHV0KQorICAgICAgQGlucHV0ID0gZG91YmxlKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQG91dHB1dCA9IGRvdWJsZSgiT3V0cHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBAdHJhbnMgPSBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0Lm5ldyhAaW5wdXQsIEBvdXRwdXQpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrX2lucHV0IikKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrX291dHB1dCIpCisgICAgICBleHBlY3QoQHRyYW5zLnRvX3MpLnRvIGVxKCJpb3N0cmVhbShpbnB1dD1tb2NrX2lucHV0LG91dHB1dD1tb2NrX291dHB1dCkiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBvcGVuIGFzIGxvbmcgYXMgYm90aCBpbnB1dCBvciBvdXRwdXQgYXJlIG9wZW4iIGRvCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4oZmFsc2UpCi0gICAgICBAb3V0cHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZF9ub3QgYmVfb3BlbgorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4oZmFsc2UpCisgICAgICBhbGxvdyhAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLm5vdF90byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCByZWFkL3dyaXRlIHRvIGlucHV0L291dHB1dCIgZG8KLSAgICAgIEBpbnB1dC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIEBvdXRwdXQuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKS5hbmRfcmV0dXJuKCIrIHdyaXRlIikKLSAgICAgIEB0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKLSAgICAgIEB0cmFucy53cml0ZSgiZm9vYmFyIikuc2hvdWxkID09ICIrIHdyaXRlIgorICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykuYW5kX3JldHVybigiKyByZWFkIikKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMTcpKS50byBlcSgiKyByZWFkIikKKyAgICAgIGV4cGVjdChAdHJhbnMud3JpdGUoImZvb2JhciIpKS50byBlcSgiKyB3cml0ZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIGJvdGggaW5wdXQgYW5kIG91dHB1dCB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIEBpbnB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHRyYW5zLmNsb3NlCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgppbmRleCBiODUxOGM4Li5iMmNkMDRiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgpAQCAtMTcsMzAgKzE3LDMwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJwotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQnCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQiKQogCiBpZiBkZWZpbmVkPyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKIAotICBjbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICAgIGluY2x1ZGUgVGhyaWZ0CisgIGRlc2NyaWJlICdCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkJyBkbworICAgICMgc2luY2UgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBzaG91bGQgYmUgZGlyZWN0bHkgZXF1aXZhbGVudCB0bworICAgICMgQmluYXJ5UHJvdG9jb2wsIHdlIGRvbid0IG5lZWQgYW55IGN1c3RvbSBzcGVjcyEKKyAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgJ2EgYmluYXJ5IHByb3RvY29sJwogCi0gICAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGRvCi0gICAgICAjIHNpbmNlIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgc2hvdWxkIGJlIGRpcmVjdGx5IGVxdWl2YWxlbnQgdG8gCi0gICAgICAjIEJpbmFyeVByb3RvY29sLCB3ZSBkb24ndCBuZWVkIGFueSBjdXN0b20gc3BlY3MhCi0gICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgJ2EgYmluYXJ5IHByb3RvY29sJwotCi0gICAgICBkZWYgcHJvdG9jb2xfY2xhc3MKLSAgICAgICAgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAotICAgICAgZW5kCisgICAgZGVmIHByb3RvY29sX2NsYXNzCisgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKICAgICBlbmQKIAotICAgIGRlc2NyaWJlIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5IGRvCisgICAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSBkbwogICAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIiBkbwotICAgICAgICBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICBlbmQKKworICAgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJpbmFyeS1hY2NlbCIpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCiBlbHNlCiAgIHB1dHMgInNraXBwaW5nIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgc3BlYyBiZWNhdXNlIGl0IGlzIG5vdCBkZWZpbmVkLiIKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgppbmRleCAwYWJjY2I4Li4wNjVmNWNlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMTcsNDcgKzE3LDU4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJwotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQnCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQiKQogCi1jbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdCaW5hcnlQcm90b2NvbCcgZG8KIAotICBkZXNjcmliZSBCaW5hcnlQcm90b2NvbCBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAnYSBiaW5hcnkgcHJvdG9jb2wnCisgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAnYSBiaW5hcnkgcHJvdG9jb2wnCiAKLSAgICBkZWYgcHJvdG9jb2xfY2xhc3MKLSAgICAgIEJpbmFyeVByb3RvY29sCisgIGRlZiBwcm90b2NvbF9jbGFzcworICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wKKyAgZW5kCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCBkbworCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYSBtZXNzYWdlIGhlYWRlciIgZG8KLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLmV4YWN0bHkoMikudGltZXMuYW5kX3JldHVybigKLSAgICAgICAgW3Byb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSB8IFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWV0ucGFjaygnTicpLAotICAgICAgICBbNDJdLnBhY2soJ04nKQotICAgICAgKSAgICAgIAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCd0ZXN0TWVzc2FnZScpCi0gICAgICBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4uc2hvdWxkID09IFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXQorICAgICAgQHRyYW5zLndyaXRlKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFldLnBhY2soJ04nKSkKKyAgICAgIEB0cmFucy53cml0ZShbNDJdLnBhY2soJ04nKSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oJ3Rlc3RNZXNzYWdlJykKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4pLnRvIGVxKFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGhlYWRlciBoYXMgdGhlIHdyb25nIHZlcnNpb24iIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oLTEpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgZG9lcyBub3QgZXhpc3QgYW5kIHN0cmljdF9yZWFkIGlzIGVuYWJsZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycpIGRvIHxlfCAgICAgICAgCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpzdHJpY3RfcmVhZCkuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwKICAgICAgICAgZS50eXBlID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgiYmluYXJ5KG1lbW9yeSkiKQorICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCaW5hcnlQcm90b2NvbEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sIiBkbwotICAgICAgQmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoQmluYXJ5UHJvdG9jb2wpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2wpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCmluZGV4IDI4ZGE3NjAuLjU4ZDY1ZjAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKQEAgLTEsMyArMSw0IEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE3LDcgKzE4LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAogc2hhcmVkX2V4YW1wbGVzX2ZvciAnYSBiaW5hcnkgcHJvdG9jb2wnIGRvCiAgIGJlZm9yZSg6ZWFjaCkgZG8KQEAgLTI2LDM0ICsyNywzNCBAQAogICBlbmQKIAogICBpdCAic2hvdWxkIGRlZmluZSB0aGUgcHJvcGVyIFZFUlNJT05fMSwgVkVSU0lPTl9NQVNLIEFORCBUWVBFX01BU0siIGRvCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OX01BU0spLnNob3VsZCA9PSAweGZmZmYwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpLnNob3VsZCA9PSAweDgwMDEwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spLnNob3VsZCA9PSAweDAwMDAwMGZmCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKSkudG8gZXEoMHhmZmZmMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpKS50byBlcSgweDgwMDEwMDAwKQorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlRZUEVfTUFTSykpLnRvIGVxKDB4MDAwMDAwZmYpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3RfcmVhZCByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3RfcmVhZC5zaG91bGQgZXFsKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnN0cmljdF9yZWFkKS50byBlcWwodHJ1ZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIHN0cmljdF93cml0ZSByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3Rfd3JpdGUuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3Rfd3JpdGUpLnRvIGVxbCh0cnVlKQogICBlbmQgICAgCiAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAKQEAgLTYxLDY0ICs2Miw2NyBAQAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGZpZWxkIGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbignZm9vJywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgU1RPUCBmaWVsZCIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCi0gICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09ICJcMDAwIgorICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoIlwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1hcCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWFwX2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6TElTVCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKTsKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKSk7CiAgIGVuZAogICAgCiAgICMgbWFwIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGxpc3QgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBzZXQgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJvb2wiIGRvCiAgICAgQHByb3Qud3JpdGVfYm9vbCh0cnVlKQogICAgIEBwcm90LndyaXRlX2Jvb2woZmFsc2UpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAxXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMDAxXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB0cmVhdCBhIG5pbCBib29sIGFzIGZhbHNlIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wobmlsKQotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgYnl0ZSIgZG8KICAgICAjIGJ5dGUgaXMgc21hbGwgZW5vdWdoLCBsZXQncyBjaGVjayAtMTI4Li4xMjcKICAgICAoLTEyOC4uMTI3KS5lYWNoIGRvIHxpfAogICAgICAgQHByb3Qud3JpdGVfYnl0ZShpKQotICAgICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09IFtpXS5wYWNrKCdjJykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoW2ldLnBhY2soJ2MnKSkKICAgICBlbmQKLSAgICAjIGhhbmRpbmcgaXQgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIHNob3VsZCBjbGlwCi0gICAgQHRyYW5zLnJzcGVjX3ZlcmlmeQorICBlbmQKKworICBpdCAic2hvdWxkIGNsaXAgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIiBkbwogICAgICgxMjguLjI1NSkuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBhbmQgbGFzdGx5LCBhIEJpZ251bSBpcyBnb2luZyB0byBlcnJvciBvdXQKLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICBlbmQKKworICBpdCAiZXJyb3JzIG91dCB3aXRoIGEgQmlnbnVtIiBkbworICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2J5dGUoMioqNjUpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgYnl0ZSIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTE2IiBkbwpAQCAtMTMwLDE0ICsxMzQsMTQgQEAKICAgICAjIGFuZCB0cnkgc29tZXRoaW5nIG91dCBvZiBzaWduZWQgcmFuZ2UsIGl0IHNob3VsZCBjbGlwCiAgICAgQHByb3Qud3JpdGVfaTE2KDIqKjE1ICsgNSkKICAgICAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMzc0XDAwMFwwMDBcMDIxXDAwMFwwMDBcMzMwXDM2MFwwMDZcMjczXDE3N1wzNzdcMjAwXDAwNSIpCiAgICAgCiAgICAgIyBhIEJpZ251bSBzaG91bGQgZXJyb3IKICAgICAjIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNigyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTE2IiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTE2KG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTMyIiBkbwpAQCAtMTQ3LDE0ICsxNTEsMTQgQEAKICAgICAgIEBwcm90LndyaXRlX2kzMihpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciKQogICAgIFsyICoqIDMxICsgNSwgMiAqKiA2NSArIDVdLmVhY2ggZG8gfGl8Ci0gICAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMzIoaSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAorICAgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKGkpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpMzIiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pMzIobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhbiBpNjQiIGRvCkBAIC0xNjQsNyArMTY4LDcgQEAKICAgICAgIEBwcm90LndyaXRlX2k2NChpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFsiXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAogICAgICAgIlwzNzdcMzc3XDM2NFwzMDNcMDM1XDI0NCtdIiwKICAgICAgICJcMzc3XDM3N1wzNzdcMzc3XDM3NlwyMzE6XDM0MSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wwMjYiLApAQCAtMTcyLDEyICsxNzYsMTIgQEAKICAgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDMxNyIsCiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDAjXDM0MFwyMDQiLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDJcMzQwXDMxMX5cMzY1IiwKLSAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICAgICAgIlwxNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3Il0uam9pbigiIikpCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGk2NCIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NChuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgZG91YmxlIiBkbwpAQCAtMTg1LDgxICsxODksMTI0IEBACiAgICAgdmFsdWVzID0gW0Zsb2F0OjpNSU4sLTEyMzEuMTUzMjUsIC0xMjMxMjMuMjMsIC0yMy4yMzUxNTEyMywgMCwgMTIzNTEuMTMyNSwgNTIzLjIzLCBGbG9hdDo6TUFYXQogICAgIHZhbHVlcy5lYWNoIGRvIHxmfAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKGYpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW2ZdLnBhY2soIkciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbZl0ucGFjaygiRyIpKQogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBkb3VibGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9kb3VibGUobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAotICAKLSAgaXQgInNob3VsZCB3cml0ZSBhIHN0cmluZyIgZG8KLSAgICBzdHIgPSAiaGVsbG8gd29ybGQiCi0gICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW3N0ci5zaXplXS5wYWNrKCJOIikgKyBzdHIKKworICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nJyBkbworICAgICAgc3RyID0gJ2FiYycKKyAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbworICAgICAgc3RyID0gImFiYyBcdTIwQUMgXHUyMEFEIi5lbmNvZGUoJ1VURi04JykKKyAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMiwgMHg4MiwgMHhBQywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBRF0pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIHNob3VsZCB3cml0ZSBhIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycyBhbmQgdHJhbnNjb2RpbmcnIGRvCisgICAgICBzdHIgPSAiYWJjIFx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpCisgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QUNdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMCwgMSwgMiwgM10ucGFjaygnQyonKQorICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KGJ1ZmZlcikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXSkKKyAgICBlbmQKKyAgZWxzZQorICAgIGl0ICdzaG91bGQgd3JpdGUgYSBzdHJpbmcnIGRvCisgICAgICBzdHIgPSAnYWJjJworICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFswLCAxLCAyLCAzXS5wYWNrKCdDKicpCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoYnVmZmVyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXSkKKyAgICBlbmQKICAgZW5kCi0gIAorCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBzdHJpbmciIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9zdHJpbmcobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGggYSB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBzdHJpY3QiIGRvCiAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zKSAjIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgIyBtZXNzYWdlIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIGZpZWxkIGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgM10ucGFjaygiY24iKSkKLSAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10pCiAgIGVuZAogICAKICAgIyBmaWVsZCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzdG9wIGZpZWxkIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RPUF0ucGFjaygiYyIpKTsKLSAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSkKICAgZW5kCiAKICAgaXQgInNob3VsZCByZWFkIGEgbWFwIGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0ucGFjaygiY2NOIikpCi0gICAgQHByb3QucmVhZF9tYXBfYmVnaW4uc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXSkKICAgZW5kCiAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBsaXN0IGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddLnBhY2soImNOIikpCi0gICAgQHByb3QucmVhZF9saXN0X2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10KKyAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBsaXN0IGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIHNldCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfc2V0X2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10KKyAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XSkKICAgZW5kCiAgIAogICAjIHNldCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBib29sIiBkbwogICAgIEB0cmFucy53cml0ZSgiXDAwMVwwMDAiKTsKLSAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IHRydWUKLSAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IGZhbHNlCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEodHJ1ZSkKKyAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcShmYWxzZSkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBieXRlIiBkbwogICAgIFstMTI4LCAtNTcsIC0zLCAwLCAxNywgMjQsIDEyN10uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiYyIpKQotICAgICAgQHByb3QucmVhZF9ieXRlLnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ieXRlKS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0yNjcsNyArMzE0LDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqMTUsIC01MjM3LCAtMzUzLCAwLCAxNTI3LCAyMjM0LCAyKioxNS0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJuIikpOwotICAgICAgQHByb3QucmVhZF9pMTYuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kxNikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjc1LDcgKzMyMiw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjMxLCAtMjM1MTI1LCAtNjIzNiwgMCwgMjM1MSwgMTIzMTIzLCAyKiozMS0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJOIikpCi0gICAgICBAcHJvdC5yZWFkX2kzMi5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0yODMsNyArMzMwLDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqNjMsIC0xMjM1MTIzMTIsIC02MzQ2LCAwLCAzMiwgMjM0NjMyMjMyMywgMioqNjMtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaSA+PiAzMiwgaSAmIDB4RkZGRkZGRkZdLnBhY2soIk5OIikpCi0gICAgICBAcHJvdC5yZWFkX2k2NC5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0yOTEsMjcgKzMzOCw2MyBAQAogICAgICMgdHJ5IGEgcmFuZG9tIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFtGbG9hdDo6TUlOLCAtMjMxMjMxLjEyMzUxLCAtMzIzLjIzMzUxMywgMCwgMTIzLjIzNTEyMzUsIDIzNTEyMzUuMTIzNTEyMzUsIEZsb2F0OjpNQVhdLmVhY2ggZG8gfGZ8CiAgICAgICBAdHJhbnMud3JpdGUoW2ZdLnBhY2soIkciKSk7Ci0gICAgICBAcHJvdC5yZWFkX2RvdWJsZS5zaG91bGQgPT0gZgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZG91YmxlKS50byBlcShmKQogICAgIGVuZAogICBlbmQKLSAgCi0gIGl0ICJzaG91bGQgcmVhZCBhIHN0cmluZyIgZG8KLSAgICBzdHIgPSAiaGVsbG8gd29ybGQiCi0gICAgQHRyYW5zLndyaXRlKFtzdHIuc2l6ZV0ucGFjaygiTiIpICsgc3RyKQotICAgIEBwcm90LnJlYWRfc3RyaW5nLnNob3VsZCA9PSBzdHIKKworICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcnIGRvCisgICAgICAjIGkzMiBvZiB2YWx1ZSAzLCBmb2xsb3dlZCBieSB0aHJlZSBjaGFyYWN0ZXJzL1VURi04IGJ5dGVzICdhJywgJ2InLCAnYycKKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCisgICAgICBleHBlY3QoYSkudG8gZXEoJ2FiYycuZW5jb2RlKCdVVEYtOCcpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZyBjb250YWluaW5nIHVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIFVURi04IGVuY29kZWQgYnVmZmVyJyBkbworICAgICAgIyBpMzIgb2YgdmFsdWUgMywgZm9sbG93ZWQgYnkgb25lIGNoYXJhY3RlciBVKzIwQUMgbWFkZSB1cCBvZiB0aHJlZSBieXRlcworICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RTIsIDB4ODIsIDB4QUNdLnBhY2soJ0MqJykKKyAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCisgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5CisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICBlbmQKKyAgZWxzZQorICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZycgZG8KKyAgICAgICMgaTMyIG9mIHZhbHVlIDMsIGZvbGxvd2VkIGJ5IHRocmVlIGNoYXJhY3RlcnMvVVRGLTggYnl0ZXMgJ2EnLCAnYicsICdjJworICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdLnBhY2soJ0MqJykKKyAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCdhYmMnKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5CisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCisgICAgZW5kCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIG5vIGFyZ3Mgb3IgcmV0dXJuIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfdm9pZE1ldGhvZCgpfSwKLSAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5yZWN2X3ZvaWRNZXRob2Quc2hvdWxkID09IG5pbH0KKyAgICAgIHByb2Mge3xjbGllbnR8IGV4cGVjdChjbGllbnQucmVjdl92b2lkTWV0aG9kKS50byBlcShuaWwpfQogICAgICkKICAgZW5kCiAKICAgaXQgInNob3VsZCBwZXJmb3JtIGEgY29tcGxldGUgcnBjIHdpdGggYSBwcmltaXRpdmUgcmV0dXJuIHR5cGUiIGRvCiAgICAgc3J2X3Rlc3QoCiAgICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQuc2VuZF9wcmltaXRpdmVNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl9wcmltaXRpdmVNZXRob2Quc2hvdWxkID09IDF9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kKS50byBlcSgxKX0KICAgICApCiAgIGVuZAogCkBAIC0zMjIsNyArNDA1LDcgQEAKICAgICAgICAgcmVzdWx0ID0gY2xpZW50LnJlY3Zfc3RydWN0TWV0aG9kCiAgICAgICAgIHJlc3VsdC5zZXRfYnl0ZV9tYXAgPSBuaWwKICAgICAgICAgcmVzdWx0Lm1hcF9ieXRlX21hcCA9IG5pbAotICAgICAgICByZXN1bHQuc2hvdWxkID09IEZpeHR1cmVzOjpDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUCisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKEZpeHR1cmVzOjpDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUKQogICAgICAgfQogICAgICkKICAgZW5kCkBAIC0zNDMsOSArNDI2LDkgQEAKICAgICBjbGllbnRwcm90byA9IHByb3RvY29sX2NsYXNzLm5ldyhjbGllbnRzaWRlKQogICAgIHNlcnZlcnByb3RvID0gcHJvdG9jb2xfY2xhc3MubmV3KHNlcnZlcnNpZGUpCiAKLSAgICBwcm9jZXNzb3IgPSBTcnY6OlByb2Nlc3Nvci5uZXcoU3J2SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoU3J2SGFuZGxlci5uZXcpCiAKLSAgICBjbGllbnQgPSBTcnY6OkNsaWVudC5uZXcoY2xpZW50cHJvdG8sIGNsaWVudHByb3RvKQorICAgIGNsaWVudCA9IFRocmlmdDo6VGVzdDo6U3J2OjpDbGllbnQubmV3KGNsaWVudHByb3RvLCBjbGllbnRwcm90bykKIAogICAgICMgZmlyc3QgYmxvY2sKICAgICBmaXJzdGJsb2NrLmNhbGwoY2xpZW50KQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4NjUzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKQEAgLTAsMCArMSwxNjAgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlIFRocmlmdDo6Qnl0ZXMgZG8KKyAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgZGVzY3JpYmUgJy5lbXB0eV9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlcicgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDIpCisgICAgICAgIGV4cGVjdChiLmdldGJ5dGUoMCkpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmdldGJ5dGUoMSkpLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmZvcmNlX2JpbmFyeV9lbmNvZGluZycgZG8KKyAgICAgIGl0ICdzaG91bGQgY2hhbmdlIGVuY29kaW5nJyBkbworICAgICAgICBlID0gJ1NUUklORycuZW5jb2RlKCdVVEYtOCcpCisgICAgICAgIGV4cGVjdChlLmVuY29kaW5nKS5ub3RfdG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbworICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLnNldF9zdHJpbmdfYnl0ZScgZG8KKyAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCisgICAgICAgIGV4cGVjdChzLmdldGJ5dGUoMCkpLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgY29udmVydCBVVEYtOCBTdHJpbmcgdG8gYnl0ZSBidWZmZXInIGRvCisgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDCisgICAgICAgIGV4cGVjdChlLmxlbmd0aCkudG8gZXEoMSkKKworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZXhwZWN0KGEubGVuZ3RoKS50byBlcSgzKQorICAgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEUyLCAweDgyLCAweEFDXSkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgSVNPLTg4NTktMTUgU3RyaW5nIHRvIFVURi04IGJ5dGUgYnVmZmVyJyBkbworICAgICAgICAjIEFzc3VtcHRpb25zCisgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDLCB0aGVuIGNvbnZlcnRlZCB0byBJU08tODg1OS0xNQorICAgICAgICBleHBlY3QoZS5sZW5ndGgpLnRvIGVxKDEpCisgICAgICAgIGV4cGVjdChlLnVucGFjaygnQyonKSkudG8gZXEoWzB4QTRdKSAjIGV1cm8gc2lnbiBpcyBhIGRpZmZlcmVudCBjb2RlIHBvaW50IGluIElTTy04ODU5LTE1CisKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuY29udmVydF90b19zdHJpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggYnl0ZSBidWZmZXIgdG8gYSBVVEYtOCBTdHJpbmcnIGRvCisgICAgICAgIGUgPSBbMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygiQyoiKQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b19zdHJpbmcgZQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIpCisgICAgICBlbmQKKyAgICBlbmQKKworICBlbHNlICMgUlVCWV9WRVJTSU9OCisgICAgZGVzY3JpYmUgJy5lbXB0eV9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlcicgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IGJ1ZmZlciBvZiBnaXZlbiBzaXplJyBkbworICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciAyCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMikKKyAgICAgICAgZXhwZWN0KGJbMF0pLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiWzFdKS50byBlcSgwKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmZvcmNlX2JpbmFyeV9lbmNvZGluZycgZG8KKyAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5nZXRfc3RyaW5nX2J5dGUnIGRvCisgICAgICBpdCAnc2hvdWxkIGdldCB0aGUgYnl0ZSBhdCBpbmRleCcgZG8KKyAgICAgICAgcyA9ICJceDQxXHg0MiIKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApKS50byBlcSgweDQxKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkpLnRvIGVxKDB4NDIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuc2V0X3N0cmluZ19ieXRlJyBkbworICAgICAgaXQgJ3Nob3VsZCBzZXQgYnl0ZSB2YWx1ZSBhdCBpbmRleCcgZG8KKyAgICAgICAgcyA9ICJceDQxXHg0MiIKKyAgICAgICAgVGhyaWZ0OjpCeXRlcy5zZXRfc3RyaW5nX2J5dGUocywgMCwgMHg0MykKKyAgICAgICAgZXhwZWN0KHNbMF0pLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZG8KKyAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3N0cmluZycgZG8KKyAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCmluZGV4IGU3MDdkODEuLmQ1ZDRjZWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCkBAIC0xNyw4NCArMTcsODIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0Q2xpZW50U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ0NsaWVudCcgZG8KIAogICBjbGFzcyBDbGllbnRTcGVjCiAgICAgaW5jbHVkZSBUaHJpZnQ6OkNsaWVudAogICBlbmQKIAogICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIEBjbGllbnQgPSBDbGllbnRTcGVjLm5ldyhAcHJvdCkKICAgZW5kCiAKLSAgZGVzY3JpYmUgQ2xpZW50IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6Q2xpZW50IGRvCiAgICAgaXQgInNob3VsZCByZS11c2UgaXByb3QgZm9yIG9wcm90IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkIiBkbwotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAaXByb3QnKS5zaG91bGQgZXFsKEBwcm90KQotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKS5zaG91bGQgZXFsKEBwcm90KQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90JykpLnRvIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BvcHJvdCcpKS50byBlcWwoQHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDApCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCcjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpiYXI9KS53aXRoKDQyKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp0cmFucykgZG8KLSAgICAgICAgbW9jaygndHJhbnMnKS50ZWUgZG8gfHRyYW5zfAotICAgICAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkKKyAgICAgIG1vY2tfYXJncyA9IGRvdWJsZSgnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOmZvbz0pLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpiYXI9KS53aXRoKDQyKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0cmFucykgZG8KKyAgICAgICAgZG91YmxlKCd0cmFucycpLnRhcCBkbyB8dHJhbnN8CisgICAgICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIGtsYXNzID0gc3R1YigiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGtsYXNzLCA6Zm9vID0+ICdmb28nLCA6YmFyID0+IDQyKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIGlkIHdoZW4gc2VuZGluZyBtZXNzYWdlcyIgZG8KLSAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIgZG8KLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAxKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgICBAcHJvdC5zdHViISg6dHJhbnMpLmFuZF9yZXR1cm4gbW9jaygidHJhbnMiKS5hc19udWxsX29iamVjdAotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTInLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTMnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpICAgICAgICAKLSAgICAgIGVuZAorICAgICAgcGVuZGluZyAiaXQgc2VlbXMgc2VxdWVuY2UgaWRzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgcmlnaHQgbm93IgorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTInLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMikub3JkZXJlZAorICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIGRvdWJsZSgidHJhbnMiKS5hc19udWxsX29iamVjdAorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlY2VpdmUgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19rbGFzcyA9IG1vY2soIiM8TW9ja0NsYXNzOm1vY2s+IikKLSAgICAgIG1vY2tfa2xhc3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCi0gICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShzdHViKCJNb2NrQ2xhc3MiLCA6bmV3ID0+IG1vY2tfa2xhc3MpKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2tsYXNzID0gZG91YmxlKCIjPE1vY2tDbGFzczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19rbGFzcykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKKyAgICAgIEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKGRvdWJsZSgiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGFuZGxlIHJlY2VpdmVkIGV4Y2VwdGlvbnMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIE1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCi0gICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIFN0YW5kYXJkRXJyb3IubmV3LnRlZSBkbyB8bW9ja19leGN8Ci0gICAgICAgICAgbW9ja19leGMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykgZG8KKyAgICAgICAgU3RhbmRhcmRFcnJvci5uZXcudGFwIGRvIHxtb2NrX2V4Y3wKKyAgICAgICAgICBleHBlY3QobW9ja19leGMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIHRyYW5zcG9ydCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyBhIG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9iZWdpbikKLSAgICAgIEBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICB0cmFucyA9IG1vY2soIk1vY2tUcmFuc3BvcnQiKQotICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAga2xhc3MgPSBtb2NrKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKKyAgICAgIGFsbG93KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKQorICAgICAgZXhwZWN0KEBwcm90KS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoIiM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgICB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGV4cGVjdCB7IEBjbGllbnQuc2VuZF9tZXNzYWdlKCJ0ZXN0TWVzc2FnZSIsIGtsYXNzKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKaW5kZXggMWZhMjE4Mi4uNTEzZGQ2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMSwzICsxLDQgQEAKKyMgZW5jb2Rpbmc6IFVURi04CiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE3LDcgKzE4LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAogZGVzY3JpYmUgVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wgZG8KICAgVEVTVFMgPSB7CkBAIC0yNSw3ICsyNiw3IEBACiAgICAgOmkxNiA9PiAoMC4uMTQpLm1hcCB7fHNoaWZ0fCBbMSA8PCBzaGlmdCwgLSgxIDw8IHNoaWZ0KV19LmZsYXR0ZW4uc29ydCwKICAgICA6aTMyID0+ICgwLi4zMCkubWFwIHt8c2hpZnR8IFsxIDw8IHNoaWZ0LCAtKDEgPDwgc2hpZnQpXX0uZmxhdHRlbi5zb3J0LAogICAgIDppNjQgPT4gKDAuLjYyKS5tYXAge3xzaGlmdHwgWzEgPDwgc2hpZnQsIC0oMSA8PCBzaGlmdCldfS5mbGF0dGVuLnNvcnQsCi0gICAgOnN0cmluZyA9PiBbIiIsICIxIiwgInNob3J0IiwgImZvdXJ0ZWVuMTIzNDU2IiwgImZpZnRlZW4xMjM0NTY3OCIsICIxIiAqIDEyNywgIjEiICogMzAwMF0sCisgICAgOnN0cmluZyA9PiBbIiIsICIxIiwgInNob3J0IiwgImZvdXJ0ZWVuMTIzNDU2IiwgImZpZnRlZW4xMjM0NTY3OCIsICJ1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiLCAiMSIgKiAxMjcsICIxIiAqIDMwMDBdLAogICAgIDpiaW5hcnkgPT4gWyIiLCAiXDAwMSIsICJcMDAxIiAqIDUsICJcMDAxIiAqIDE0LCAiXDAwMSIgKiAxNSwgIlwwMDEiICogMTI3LCAiXDAwMSIgKiAzMDAwXSwKICAgICA6ZG91YmxlID0+IFswLjAsIDEuMCwgLTEuMCwgMS4xLCAtMS4xLCAxMDAwMDAwMC4xLCAxLjAvMC4wLCAtMS4wLzAuMF0sCiAgICAgOmJvb2wgPT4gW3RydWUsIGZhbHNlXQpAQCAtNDEsNyArNDIsNyBAQAogICAgICAgICBwcm90by5zZW5kKHdyaXRlcihwcmltaXRpdmVfdHlwZSksIHZhbHVlKQogICAgICAgICAjIHB1dHMgImJ1ZjogI3t0cmFucy5pbnNwZWN0X2J1ZmZlcn0iIGlmIHByaW1pdGl2ZV90eXBlID09IDppNjQKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApAQCAtNjEsMTAgKzYyLDEwIEBACiAKICAgICAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICAgIG5hbWUsIHR5cGUsIGlkID0gcHJvdG8ucmVhZF9maWVsZF9iZWdpbgotICAgICAgICB0eXBlLnNob3VsZCA9PSB0aHJpZnRfdHlwZQotICAgICAgICBpZC5zaG91bGQgPT0gMTUKKyAgICAgICAgZXhwZWN0KHR5cGUpLnRvIGVxKHRocmlmdF90eXBlKQorICAgICAgICBleHBlY3QoaWQpLnRvIGVxKDE1KQogICAgICAgICByZWFkX2JhY2sgPSBwcm90by5zZW5kKHJlYWRlcihwcmltaXRpdmVfdHlwZSkpCi0gICAgICAgIHJlYWRfYmFjay5zaG91bGQgPT0gdmFsdWUKKyAgICAgICAgZXhwZWN0KHJlYWRfYmFjaykudG8gZXEodmFsdWUpCiAgICAgICAgIHByb3RvLnJlYWRfZmllbGRfZW5kCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTc0LDEzICs3NSwxMyBAQAogICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAKLSAgICBzdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICAjIHNldHMgYW5kIG1hcHMgZG9uJ3QgaGFzaCB3ZWxsLi4uIG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZS4KICAgICBzdHJ1Y3Qud3JpdGUocHJvdG8pCiAKLSAgICBzdHJ1Y3QyID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldwogICAgIHN0cnVjdDIucmVhZChwcm90bykgICAgCi0gICAgc3RydWN0Mi5zaG91bGQgPT0gc3RydWN0CisgICAgZXhwZWN0KHN0cnVjdDIpLnRvIGVxKHN0cnVjdCkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIG1ldGhvZCBjYWxscyBjb3JyZWN0bHkiIGRvCkBAIC05MCwxOSArOTEsMTkgQEAKICAgICBjbGllbnRfaW5fdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBjbGllbnRfaW5fcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcoY2xpZW50X2luX3RyYW5zKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoSmFua3lIYW5kbGVyLm5ldykKIAotICAgIGNsaWVudCA9IFNydjo6Q2xpZW50Lm5ldyhjbGllbnRfaW5fcHJvdG8sIGNsaWVudF9vdXRfcHJvdG8pCisgICAgY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQogICAgIGNsaWVudC5zZW5kX0phbmt5KDEpCiAgICAgIyBwdXRzIGNsaWVudF9vdXRfdHJhbnMuaW5zcGVjdF9idWZmZXIKICAgICBwcm9jZXNzb3IucHJvY2VzcyhjbGllbnRfb3V0X3Byb3RvLCBjbGllbnRfaW5fcHJvdG8pCi0gICAgY2xpZW50LnJlY3ZfSmFua3kuc2hvdWxkID09IDIKKyAgICBleHBlY3QoY2xpZW50LnJlY3ZfSmFua3kpLnRvIGVxKDIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBkZWFsIHdpdGggZmllbGRzIGZvbGxvd2luZyBmaWVsZHMgdGhhdCBoYXZlIG5vbi1kZWx0YSBpZHMiIGRvCi0gICAgYnJjcCA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAorICAgIGJyY3AgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAogICAgICAgOmZpZWxkMSA9PiAiYmxhaCIsIAotICAgICAgOmZpZWxkMiA9PiBCaWdGaWVsZElkU3RydWN0Lm5ldygKKyAgICAgIDpmaWVsZDIgPT4gVGhyaWZ0OjpUZXN0OjpCaWdGaWVsZElkU3RydWN0Lm5ldygKICAgICAgICAgOmZpZWxkMSA9PiAic3RyaW5nMSIsIAogICAgICAgICA6ZmllbGQyID0+ICJzdHJpbmcyIiksIAogICAgICAgOmZpZWxkMyA9PiAzKQpAQCAtMTEwLDkgKzExMSwyNSBAQAogICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShicmNwKQogCiAgICAgZGVzZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldykKLSAgICBicmNwMiA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CisgICAgYnJjcDIgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CiAgICAgZGVzZXIuZGVzZXJpYWxpemUoYnJjcDIsIGJ5dGVzKQotICAgIGJyY3AyLnNob3VsZCA9PSBicmNwCisgICAgZXhwZWN0KGJyY3AyKS50byBlcShicmNwKQorICBlbmQKKyAgCisgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgYW4gZW1wdHkgbWFwIHRvIGFuIGVtcHR5IGhhc2giIGRvCisgICAgc3RydWN0ID0gVGhyaWZ0OjpUZXN0OjpTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldyg6aTMyX21hcCA9PiB7fSkKKyAgICBzZXIgPSBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCisgICAgYnl0ZXMgPSBzZXIuc2VyaWFsaXplKHN0cnVjdCkKKworICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcKKyAgICBkZXNlci5kZXNlcmlhbGl6ZShzdHJ1Y3QyLCBieXRlcykKKyAgICBleHBlY3Qoc3RydWN0KS50byBlcShzdHJ1Y3QyKQorICBlbmQKKyAgCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJjb21wYWN0KG1lbW9yeSkiKQogICBlbmQKICAgCiAgIGNsYXNzIEphbmt5SGFuZGxlcgpAQCAtMTIyLDEyICsxMzksMjAgQEAKICAgZW5kCiAgIAogICBkZWYgd3JpdGVyKHN5bSkKLSAgICBzeW0gPSBzeW0gPT0gOmJpbmFyeSA/IDpzdHJpbmcgOiBzeW0KICAgICAid3JpdGVfI3tzeW0udG9fc30iCiAgIGVuZAogICAKICAgZGVmIHJlYWRlcihzeW0pCi0gICAgc3ltID0gc3ltID09IDpiaW5hcnkgPyA6c3RyaW5nIDogc3ltCiAgICAgInJlYWRfI3tzeW0udG9fc30iCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCisKK2Rlc2NyaWJlIFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeSBkbworICBpdCAic2hvdWxkIGNyZWF0ZSBhIENvbXBhY3RQcm90b2NvbCIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJjb21wYWN0IikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKaW5kZXggZmMzMjEzNy4uMzc5YWU2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKQEAgLTE3LDEyNiArMTcsMTI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdEV4Y2VwdGlvblNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdFeGNlcHRpb24nIGRvCiAKLSAgZGVzY3JpYmUgRXhjZXB0aW9uIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgbWVzc2FnZSIgZG8KLSAgICAgIGUgPSBFeGNlcHRpb24ubmV3KCJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZSA9IFRocmlmdDo6RXhjZXB0aW9uLm5ldygidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJ0ZXN0IG1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBpbmhlcml0IGZyb20gVGhyaWZ0OjpFeGNlcHRpb24iIGRvCi0gICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzLnNob3VsZCA9PSBFeGNlcHRpb24KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnN1cGVyY2xhc3MpLnRvIGVxKFRocmlmdDo6RXhjZXB0aW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgdHlwZSBhbmQgbWVzc2FnZSIgZG8KLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV04KLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCi0gICAgICBlLnR5cGUuc2hvdWxkID09IEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRAotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCisgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBhIHN0cnVjdCBvZmYgb2YgYSBwcm90b2NvbCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybigKLSAgICAgICAgWyJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgMV0sCi0gICAgICAgIFsidHlwZSIsIFR5cGVzOjpJMzIsIDJdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCisgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZC5hbmRfcmV0dXJuIEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDIpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3CisgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKICAgICAgIGUucmVhZChwcm90KQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgotICAgICAgZS50eXBlLnNob3VsZCA9PSBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBiYWQgZmllbGRzIHdoZW4gcmVhZGluZyBhIHN0cnVjdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKLSAgICAgICAgWyJ0eXBlIiwgVHlwZXM6OkkzMiwgMl0sCi0gICAgICAgIFsidHlwZSIsIFR5cGVzOjpTVFJJTkcsIDJdLAotICAgICAgICBbIm1lc3NhZ2UiLCBUeXBlczo6TUFQLCAxXSwKLSAgICAgICAgWyJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgM10sCi0gICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXQorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKKyAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKKyAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKKyAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxXSwKKyAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXSwKKyAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSSU5HKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6TUFQKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldworICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCi0gICAgICBlLnR5cGUuc2hvdWxkID09IEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIHN0cnVjdCB0byB0aGUgb3Byb3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aChBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKICAgICAgIGUud3JpdGUocHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBuaWwgZmllbGRzIHdoZW4gd3JpdGluZyB0byB0aGUgb3Byb3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwsICJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAKLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCisgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCkKICAgICAgIGUud3JpdGUocHJvdCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgUHJvdG9jb2xFeGNlcHRpb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIHR5cGUiIGRvCi0gICAgICBwcm90ID0gUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlULCAibWVzc2FnZSIpCi0gICAgICBwcm90LnR5cGUuc2hvdWxkID09IFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUCi0gICAgICBwcm90Lm1lc3NhZ2Uuc2hvdWxkID09ICJtZXNzYWdlIgorICAgICAgcHJvdCA9IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQsICJtZXNzYWdlIikKKyAgICAgIGV4cGVjdChwcm90LnR5cGUpLnRvIGVxKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpCisgICAgICBleHBlY3QocHJvdC5tZXNzYWdlKS50byBlcSgibWVzc2FnZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzMDU2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL2ZsYXRfc3BlYy5yYgpAQCAtMCwwICsxLDYyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdnZW5lcmF0aW9uJyBkbworICBiZWZvcmUgZG8KKyAgICByZXF1aXJlICduYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UnCisgIGVuZAorCisgIGl0ICJkaWQgbm90IGdlbmVyYXRlIHRoZSB3cm9uZyBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIvZmxhdCIsIF9fRklMRV9fKQorICAgIFsibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS9uYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX2NvbnN0YW50cy5yYiIsCisgICAgICJuYW1lc3BhY2VkX3NwZWNfbmFtZXNwYWNlL3RocmlmdF9uYW1lc3BhY2VkX3NwZWNfdHlwZXMucmIiLAorICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX3R5cGVzLnJiIgorICAgIF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLm5vdF90byBiZV90cnV0aHkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgImdlbmVyYXRlZCB0aGUgcmlnaHQgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiL2ZsYXQiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfbm9uYmxvY2tpbmdfc2VydmljZS5yYiIsCisgICAgICJ0aHJpZnRfbmFtZXNwYWNlZF9zcGVjX2NvbnN0YW50cy5yYiIsCisgICAgICJ0aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgInJlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZXMucmIiCisgICAgXS5lYWNoIGRvIHxuYW1lfAorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkudG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgppbmRleCBjOTE5MDUxLi5kZjQ3MmFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKQEAgLTE3LDMzICsxNyw0MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRIVFRQQ2xpZW50VHJhbnNwb3J0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1RocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydCcgZG8KIAotICBkZXNjcmliZSBIVFRQQ2xpZW50VHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBjbGllbnQgPSBIVFRQQ2xpZW50VHJhbnNwb3J0Lm5ldygiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIikKKyAgICAgIEBjbGllbnQgPSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIEBjbGllbnQudG9fcyA9PSAiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgYmUgb3BlbiIgZG8KLSAgICAgIEBjbGllbnQuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAY2xpZW50KS50byBiZV9vcGVuCiAgICAgICBAY2xpZW50LmNsb3NlCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwb3N0IHZpYSBIVFRQIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMiIGRvCiAgICAgICBAY2xpZW50LndyaXRlICJhIHRlc3QiCiAgICAgICBAY2xpZW50LndyaXRlICIgZnJhbWUiCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRlZSBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pLmFuZF9yZXR1cm4oW25pbCwgImRhdGEiXSkKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAiYSB0ZXN0IGZyYW1lIiwgeyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifSkgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIEBjbGllbnQuZmx1c2gKLSAgICAgIEBjbGllbnQucmVhZCgxMCkuc2hvdWxkID09ICJkYXRhIgorICAgICAgZXhwZWN0KEBjbGllbnQucmVhZCgxMCkpLnRvIGVxKCJkYXRhIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VuZCBjdXN0b20gaGVhZGVycyBpZiBkZWZpbmVkIiBkbwpAQCAtNTIsMTMgKzU5LDgxIEBACiAgICAgICBoZWFkZXJzID0geyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifS5tZXJnZShjdXN0b21faGVhZGVycykKIAogICAgICAgQGNsaWVudC5hZGRfaGVhZGVycyhjdXN0b21faGVhZGVycykKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGVlIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpLmFuZF9yZXR1cm4oW25pbCwgImRhdGEiXSkKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCiAgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlc2V0IHRoZSBvdXRidWYgb24gSFRUUCBmYWlsdXJlcycgZG8KKyAgICAgIEBjbGllbnQud3JpdGUgInRlc3QiCisKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIHsgcmFpc2UgTmV0OjpSZWFkVGltZW91dCB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBjbGllbnQuZmx1c2ggIHJlc2N1ZQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAb3V0YnVmKSkudG8gZXEoVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcikKKyAgICBlbmQKKworICBlbmQKKworICBkZXNjcmliZSAnc3NsIGVuYWJsZWQnIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNlcnZpY2VfcGF0aCA9ICIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgorICAgICAgQHNlcnZlcl91cmkgPSAiaHR0cHM6Ly9teS5kb21haW4uY29tIgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB1c2UgU1NMIGZvciBodHRwcyIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIpCisKKyAgICAgIGNsaWVudC53cml0ZSAidGVzdCIKKworICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY2xpZW50LmZsdXNoCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc2V0IFNTTCB2ZXJpZnkgbW9kZSB3aGVuIHNwZWNpZmllZCIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIsCisgICAgICAgICAgOnNzbF92ZXJpZnlfbW9kZSA9PiBPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQorCisgICAgICBjbGllbnQud3JpdGUgInRlc3QiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBjbGllbnQuZmx1c2gKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWFmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKQEAgLTAsMCArMSw1NTIgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdKc29uUHJvdG9jb2wnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2wgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICAgIEBwcm90ID0gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KEB0cmFucykKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBlc2NhcGVkIGNoYXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCJcbiIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMGEnKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCIgIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1x1MDAyMCcpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gY2hhciIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiXG4iKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXFxuJykKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCIgIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJyAnKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIlxcIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlxcXFwiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIkAiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnQCcpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gc3RyaW5nIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9zdHJpbmcoInRoaXMgaXMgYSBcXCBqc29uXG5zdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGJhc2U2NCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYmFzZTY0KCJ0aGlzIGlzIGEgYmFzZTY0IHN0cmluZyIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGludGVnZXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoNDUpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI0NSIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMzAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMzMDAwIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDYwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBkb3VibGUiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgxMi4zKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTIuMyIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKC0zLjIxKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiLTMuMjEiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKzEuMC8wLjApKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKC0xLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIG9iamVjdCBzdGFydCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3QgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBzdGFydCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGFycmF5IGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oIm5hbWUiLCAxMiwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbMSxcIm5hbWVcIiwxMiwzMiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oIm5hbWUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHN0cnVjdCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbigibmFtZSIsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMntcInJlY1wiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfZmllbGRfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgc3RvcCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkX3N0b3AKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsXCJsc3RcIiwzMix7IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbWFwIGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX21hcF9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn1dIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLDMyIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9saXN0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHNldCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfc2V0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGJvb2wiIGRvCisgICAgICBAcHJvdC53cml0ZV9ib29sKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxIikKKworICAgICAgQHByb3Qud3JpdGVfYm9vbChmYWxzZSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBieXRlIiBkbworICAgICAgQHByb3Qud3JpdGVfYnl0ZSgxMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpMTYiIGRvCisgICAgICBAcHJvdC53cml0ZV9pMTYoMTAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpMzIiIGRvCisgICAgICBAcHJvdC53cml0ZV9pMzIoMzAwMDAwMDAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMwMDAwMDAwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpNjQiIGRvCisgICAgICBAcHJvdC53cml0ZV9pNjQoNjAwMDAwMDAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjYwMDAwMDAwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBkb3VibGUiIGRvCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoMS4yMykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEuMjMiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoLTMyLjEpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMzIuMSIpCisKKyAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCsxLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCisKKyAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoLTEuMC8wLjApKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCItSW5maW5pdHlcIiIpCisgICAgZW5kCisKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nJyBkbworICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCisgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKKyAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQURcIiIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCisgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKKyAgICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGJpbmFyeSIgZG8KKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeSgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoKDAuLi4yNTYpLnRvX2EucGFjaygnQyonKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGdldCB0eXBlIG5hbWUgZm9yIHR5cGUgaWQiIGRvCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RPUCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Vk9JRCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCT09MKSkudG8gZXEoInRmIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpKS50byBlcSgiaTgiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKSkudG8gZXEoImRibCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMTYpKS50byBlcSgiaTE2IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikpLnRvIGVxKCJpMzIiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STY0KSkudG8gZXEoImk2NCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpKS50byBlcSgic3RyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkpLnRvIGVxKCJyZWMiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TUFQKSkudG8gZXEoIm1hcCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTRVQpKS50byBlcSgic2V0IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpKS50byBlcSgibHN0IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgZ2V0IHR5cGUgaWQgZm9yIHR5cGUgbmFtZSIgZG8KKyAgICAgIGV4cGVjdCB7QHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicHAiKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpCT09MKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk4IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiZGJsIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STE2KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkzMiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTY0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Okk2NCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInJlYyIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibWFwIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U0VUKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImxzdCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpMSVNUKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gc3ludGF4IGNoYXIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoJ0YnKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fc3ludGF4X2NoYXIoJ0cnKX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgIEB0cmFucy53cml0ZSgnSCcpCisgICAgICBAcHJvdC5yZWFkX2pzb25fc3ludGF4X2NoYXIoJ0gnKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gZXNjYXBlIGNoYXIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoJzAwNTQnKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhcikudG8gZXEoJ1QnKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlwiIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXFxcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcXCIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXC9cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcLyIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcYiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGZcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcZiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcbiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcciIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHRcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcdCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzdHJpbmciIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxQIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSl9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmdcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBiYXNlNjQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYmFzZTY0KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgaXMganNvbiBudW1lcmljIiBkbworICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpKS50byBlcShmYWxzZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIisiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi0iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjEiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjQiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjciKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoImUiKSkudG8gZXEodHJ1ZSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG51bWVyaWMgY2hhcnMiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzRTQ1VCIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX251bWVyaWNfY2hhcnMpLnRvIGVxKCIxLjQ1M0U0NSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBpbnRlZ2VyIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1XCJcIiIpCisgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9pbnRlZ2VyfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCIxNDUzVCIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2ludGVnZXIpLnRvIGVxKDE0NTMpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBkb3VibGUiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDVlM2UwMVwiXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCJcIjEuNDUzZTAxXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzZTAxXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoMTQuNTMpCisgICAgICBAcHJvdC5yZWFkX3N0cmluZworCisgICAgICBAdHJhbnMud3JpdGUoIlwiTmFOXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPykudG8gZXEodHJ1ZSkKKworICAgICAgQHRyYW5zLndyaXRlKCJcIkluZmluaXR5XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKCsxLjAvMC4wKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiLUluZmluaXR5XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKC0xLjAvMC4wKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IHN0YXJ0IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ7IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X3N0YXJ0KS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBvYmplY3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ9IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgc3RhcnQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlsiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYXJyYXlfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWRfbWVzc2FnZV9iZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiWzIsIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9tZXNzYWdlX2JlZ2lufS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIlsxLFwibmFtZVwiLDEyLDMyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbIm5hbWUiLCAxMiwgMzJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1lc3NhZ2UgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ7IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9iZWdpbikudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxe1wicmVjXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIDEyLCAxXSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIixcImxzdFwiLDIseyIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfYmVnaW4pLnRvIGVxKFsxMiwgMTUsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1hcCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn1dIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9lbmQpLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbMTIsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGxpc3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFsxMiwgMl0pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYm9vbCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCisgICAgICBAcHJvdC5yZWFkX3N0cmluZworCisgICAgICBAdHJhbnMud3JpdGUoIjFcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYnl0ZSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiNjBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2J5dGUpLnRvIGVxKDYwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGkxNiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMTAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTE2KS50byBlcSgxMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGkzMiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMzAwMDAwMDAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcSgzMDAwMDAwMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGk2NCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiNjAwMDAwMDAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcSg2MDAwMDAwMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGRvdWJsZSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMTIuMjNcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoMTIuMjMpCisgICAgZW5kCisKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZycgZG8KKyAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCisgICAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2JpbmFyeSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkuYnl0ZXMudG9fYSkudG8gZXEoKDAuLi4yNTYpLnRvX2EpCisgICAgZW5kCisgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgianNvbihtZW1vcnkpIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5IGRvCisgICAgaXQgInNob3VsZCBjcmVhdGUgYSBKc29uUHJvdG9jb2wiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJqc29uIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5NDQ5MS4uMDAwMDAwMAotLS0gYS9saWIvcmIvc3BlYy9tb25ncmVsX2h0dHBfc2VydmVyX3NwZWMucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlICd0aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXInCi0KLWNsYXNzIFRocmlmdEhUVFBTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0KLSAgSGFuZGxlciA9IE1vbmdyZWxIVFRQU2VydmVyOjpIYW5kbGVyCi0KLSAgZGVzY3JpYmUgTW9uZ3JlbEhUVFBTZXJ2ZXIgZG8KLSAgICBpdCAic2hvdWxkIGhhdmUgYXBwcm9wcmlhdGUgZGVmYXVsdHMiIGRvCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJCaW5hcnlQcm90b2NvbEZhY3RvcnkiKQotICAgICAgbW9ja19wcm9jID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2tfZmFjdG9yeSkKLSAgICAgIE1vbmdyZWw6Okh0dHBTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgiMC4wLjAuMCIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIiKS50ZWUgZG8gfG1vY2t8Ci0gICAgICAgICAgaGFuZGxlciA9IG1vY2soIkhhbmRsZXIiKQotICAgICAgICAgIEhhbmRsZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChtb2NrX3Byb2MsIG1vY2tfZmFjdG9yeSkuYW5kX3JldHVybihoYW5kbGVyKQotICAgICAgICAgIG1vY2suc2hvdWxkX3JlY2VpdmUoOnJlZ2lzdGVyKS53aXRoKCIvIiwgaGFuZGxlcikKLSAgICAgICAgZW5kCi0gICAgICBlbmQKLSAgICAgIE1vbmdyZWxIVFRQU2VydmVyLm5ldyhtb2NrX3Byb2MpCi0gICAgZW5kCi0KLSAgICBpdCAic2hvdWxkIHVuZGVyc3RhbmQgOmlwLCA6cG9ydCwgOnBhdGgsIGFuZCA6cHJvdG9jb2xfZmFjdG9yeSIgZG8KLSAgICAgIG1vY2tfcHJvYyA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCIxLjIuMy40IiwgMTIzNCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJNb25ncmVsOjpIdHRwU2VydmVyIikudGVlIGRvIHxtb2NrfAotICAgICAgICAgIGhhbmRsZXIgPSBtb2NrKCJIYW5kbGVyIikKLSAgICAgICAgICBIYW5kbGVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobW9ja19wcm9jLCBtb2NrX2ZhY3RvcnkpLmFuZF9yZXR1cm4oaGFuZGxlcikKLSAgICAgICAgICBtb2NrLnNob3VsZF9yZWNlaXZlKDpyZWdpc3Rlcikud2l0aCgiL2ZvbyIsIGhhbmRsZXIpCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobW9ja19wcm9jLCA6aXAgPT4gIjEuMi4zLjQiLCA6cG9ydCA9PiAxMjM0LCA6cGF0aCA9PiAiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IG1vY2tfZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgTW9uZ3JlbDo6SHR0cFNlcnZlciIgZG8KLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5zdHViISg6bmV3KQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIiKS50ZWUgZG8gfG1vY2t8Ci0gICAgICAgICAgSGFuZGxlci5zdHViISg6bmV3KQotICAgICAgICAgIG1vY2suc3R1YiEoOnJlZ2lzdGVyKQotICAgICAgICAgIG1vY2suc2hvdWxkX3JlY2VpdmUoOnJ1bikuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlci5ydW4iKS50ZWUgZG8gfHJ1bm5lcnwKLSAgICAgICAgICAgICAgcnVubmVyLnNob3VsZF9yZWNlaXZlKDpqb2luKQotICAgICAgICAgICAgZW5kCi0gICAgICAgICAgZW5kCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobmlsKS5zZXJ2ZQotICAgIGVuZAotICBlbmQKLQotICBkZXNjcmliZSBNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlciBkbwotICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQGZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgQGhhbmRsZXIgPSBIYW5kbGVyLm5ldyhAcHJvY2Vzc29yLCBAZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgcmV0dXJuIDQwNCBmb3Igbm9uLVBPU1QgcmVxdWVzdHMiIGRvCi0gICAgICByZXF1ZXN0ID0gbW9jaygicmVxdWVzdCIsIDpwYXJhbXMgPT4geyJSRVFVRVNUX01FVEhPRCIgPT4gIkdFVCJ9KQotICAgICAgcmVzcG9uc2UgPSBtb2NrKCJyZXNwb25zZSIpCi0gICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6c3RhcnQpLndpdGgoNDA0KQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX25vdF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCBzZXJ2ZSB1c2luZyBhcHBsaWNhdGlvbi94LXRocmlmdCIgZG8KLSAgICAgIHJlcXVlc3QgPSBtb2NrKCJyZXF1ZXN0IiwgOnBhcmFtcyA9PiB7IlJFUVVFU1RfTUVUSE9EIiA9PiAiUE9TVCJ9LCA6Ym9keSA9PiBuaWwpCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIGhlYWQgPSBtb2NrKCJoZWFkIikKLSAgICAgIGhlYWQuc2hvdWxkX3JlY2VpdmUoOltdPSkud2l0aCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgIElPU3RyZWFtVHJhbnNwb3J0LnN0dWIhKDpuZXcpCi0gICAgICBAZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKQotICAgICAgQHByb2Nlc3Nvci5zdHViISg6cHJvY2VzcykKLSAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApLmFuZF95aWVsZChoZWFkLCBuaWwpCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCB1c2UgdGhlIElPU3RyZWFtVHJhbnNwb3J0IiBkbwotICAgICAgYm9keSA9IG1vY2soImJvZHkiKQotICAgICAgcmVxdWVzdCA9IG1vY2soInJlcXVlc3QiLCA6cGFyYW1zID0+IHsiUkVRVUVTVF9NRVRIT0QiID0+ICJQT1NUIn0sIDpib2R5ID0+IGJvZHkpCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIGhlYWQgPSBtb2NrKCJoZWFkIikKLSAgICAgIGhlYWQuc3R1YiEoOltdPSkKLSAgICAgIG91dCA9IG1vY2soIm91dCIpCi0gICAgICBwcm90b2NvbCA9IG1vY2soInByb3RvY29sIikKLSAgICAgIHRyYW5zcG9ydCA9IG1vY2soInRyYW5zcG9ydCIpCi0gICAgICBJT1N0cmVhbVRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGJvZHksIG91dCkuYW5kX3JldHVybih0cmFuc3BvcnQpCi0gICAgICBAZmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKHRyYW5zcG9ydCkuYW5kX3JldHVybihwcm90b2NvbCkKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLndpdGgocHJvdG9jb2wsIHByb3RvY29sKQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KS53aXRoKDIwMCkuYW5kX3lpZWxkKGhlYWQsIG91dCkKLSAgICAgIEBoYW5kbGVyLnByb2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgZW5kCi0gIGVuZAotZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgpAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICduYW1lc3BhY2VkIGdlbmVyYXRpb24nIGRvCisgIGJlZm9yZSBkbworICAgIHJlcXVpcmUgJ25hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZ2VuZXJhdGVkIHRoZSByaWdodCBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS50byBiZV90cnV0aHkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgImRpZCBub3QgZ2VuZXJhdGUgdGhlIHdyb25nIGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYiIsIF9fRklMRV9fKQorICAgIFsibmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfY29uc3RhbnRzLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfdHlwZXMucmIiLAorICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAorICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJleHRlbmRlZCBhIHNlcnZpY2UiIGRvCisgICAgcmVxdWlyZSAiZXh0ZW5kZWQvZXh0ZW5kZWRfc2VydmljZSIKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgppbmRleCBlYWQ1MWQ3Li42MTNkODgzIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgpAQCAtMTcsMTEgKzE3LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0Tm9uYmxvY2tpbmdTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0gIGluY2x1ZGUgU3BlY05hbWVzcGFjZQorZGVzY3JpYmUgJ05vbmJsb2NraW5nU2VydmVyJyBkbwogCiAgIGNsYXNzIEhhbmRsZXIKICAgICBkZWYgaW5pdGlhbGl6ZQpAQCAtNTUsNyArNTMsNyBAQAogICAgIGVuZAogICBlbmQKIAotICBjbGFzcyBTcGVjVHJhbnNwb3J0IDwgQmFzZVRyYW5zcG9ydAorICBjbGFzcyBTcGVjVHJhbnNwb3J0IDwgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0CiAgICAgZGVmIGluaXRpYWxpemUodHJhbnNwb3J0LCBxdWV1ZSkKICAgICAgIEB0cmFuc3BvcnQgPSB0cmFuc3BvcnQKICAgICAgIEBxdWV1ZSA9IHF1ZXVlCkBAIC04OSw3ICs4Nyw3IEBACiAgICAgZW5kCiAgIGVuZAogCi0gIGNsYXNzIFNwZWNTZXJ2ZXJTb2NrZXQgPCBTZXJ2ZXJTb2NrZXQKKyAgY2xhc3MgU3BlY1NlcnZlclNvY2tldCA8IFRocmlmdDo6U2VydmVyU29ja2V0CiAgICAgZGVmIGluaXRpYWxpemUoaG9zdCwgcG9ydCwgcXVldWUpCiAgICAgICBzdXBlcihob3N0LCBwb3J0KQogICAgICAgQHF1ZXVlID0gcXVldWUKQEAgLTEwNSwxMyArMTAzLDEzIEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBvcnQgPSA0MzI1MQogICAgICAgaGFuZGxlciA9IEhhbmRsZXIubmV3Ci0gICAgICBwcm9jZXNzb3IgPSBOb25ibG9ja2luZ1NlcnZpY2U6OlByb2Nlc3Nvci5uZXcoaGFuZGxlcikKKyAgICAgIHByb2Nlc3NvciA9IFNwZWNOYW1lc3BhY2U6Ok5vbmJsb2NraW5nU2VydmljZTo6UHJvY2Vzc29yLm5ldyhoYW5kbGVyKQogICAgICAgcXVldWUgPSBRdWV1ZS5uZXcKICAgICAgIEB0cmFuc3BvcnQgPSBTcGVjU2VydmVyU29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQsIHF1ZXVlKQotICAgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworICAgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3CiAgICAgICBsb2dnZXIgPSBMb2dnZXIubmV3KFNUREVSUikKICAgICAgIGxvZ2dlci5sZXZlbCA9IExvZ2dlcjo6V0FSTgotICAgICAgQHNlcnZlciA9IE5vbmJsb2NraW5nU2VydmVyLm5ldyhwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIHRyYW5zcG9ydF9mYWN0b3J5LCBuaWwsIDUsIGxvZ2dlcikKKyAgICAgIEBzZXJ2ZXIgPSBUaHJpZnQ6Ok5vbmJsb2NraW5nU2VydmVyLm5ldyhwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIHRyYW5zcG9ydF9mYWN0b3J5LCBuaWwsIDUsIGxvZ2dlcikKICAgICAgIGhhbmRsZXIuc2VydmVyID0gQHNlcnZlcgogICAgICAgQHNlcnZlcl90aHJlYWQgPSBUaHJlYWQubmV3KFRocmVhZC5jdXJyZW50KSBkbyB8bWFzdGVyX3RocmVhZHwKICAgICAgICAgYmVnaW4KQEAgLTEzNiw5ICsxMzQsOSBAQAogICAgIGVuZAogCiAgICAgZGVmIHNldHVwX2NsaWVudChxdWV1ZSA9IG5pbCkKLSAgICAgIHRyYW5zcG9ydCA9IFNwZWNUcmFuc3BvcnQubmV3KEZyYW1lZFRyYW5zcG9ydC5uZXcoU29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQpKSwgcXVldWUpCi0gICAgICBwcm90b2NvbCA9IEJpbmFyeVByb3RvY29sLm5ldyh0cmFuc3BvcnQpCi0gICAgICBjbGllbnQgPSBOb25ibG9ja2luZ1NlcnZpY2U6OkNsaWVudC5uZXcocHJvdG9jb2wpCisgICAgICB0cmFuc3BvcnQgPSBTcGVjVHJhbnNwb3J0Lm5ldyhUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCBAcG9ydCkpLCBxdWV1ZSkKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnNwb3J0KQorICAgICAgY2xpZW50ID0gU3BlY05hbWVzcGFjZTo6Tm9uYmxvY2tpbmdTZXJ2aWNlOjpDbGllbnQubmV3KHByb3RvY29sKQogICAgICAgdHJhbnNwb3J0Lm9wZW4KICAgICAgIEBjbGllbnRzIDw8IFtjbGllbnQsIHRyYW5zcG9ydF0KICAgICAgIGNsaWVudApAQCAtMTc4LDggKzE3Niw4IEBACiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSBiYXNpYyBtZXNzYWdlIHBhc3NpbmciIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyhmYWxzZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpKQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0xOTcsNyArMTk1LDcgQEAKICAgICAgIGVuZAogICAgICAgNC50aW1lcyB7IHRyYW5zX3F1ZXVlLnBvcCB9CiAgICAgICBzZXR1cF9jbGllbnQudW5ibG9jayg0KQotICAgICAgNC50aW1lcyB7IHF1ZXVlLnBvcC5zaG91bGQgYmVfdHJ1ZSB9CisgICAgICA0LnRpbWVzIHsgZXhwZWN0KHF1ZXVlLnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjE0LDE1ICsyMTIsMTUgQEAKICAgICAgIHF1ZXVlc1s0XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s1XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s2XSA8PCA6aGVsbG8KLSAgICAgIDMudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCA9PSBIZWxsby5uZXcgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBIZWxsby5uZXcKKyAgICAgIDMudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KSB9CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBxdWV1ZXNbNV0gPDwgWzp1bmJsb2NrLCA0XQotICAgICAgNC50aW1lcyB7IHJlc3VsdC5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChyZXN1bHQucG9wKS50byBiZV90cnV0aHkgfQogICAgICAgcXVldWVzWzJdIDw8IDpoZWxsbwotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gSGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIDcudGltZXMgeyBxdWV1ZXMuc2hpZnQgPDwgOmV4aXQgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBIZWxsby5uZXcKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjMxLDcgKzIyOSw3IEBACiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKICAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkgIyBmb3JjZSBhIG1lc3NhZ2UgcGFzcwogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyBhY3RpdmUgbWVzc2FnZXMgd2hlbiBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjQwLDggKzIzOCw4IEBACiAgICAgICBjbGllbnQgPDwgOnNsZWVwCiAgICAgICBzbGVlcCAwLjEgIyBnaXZlIHRoZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBjbGllbnQncyBtZXNzYWdlCiAgICAgICBAc2VydmVyLnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCi0gICAgICByZXN1bHQucG9wLnNob3VsZCA9PSA6c2xlcHQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCisgICAgICBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoOnNsZXB0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBraWxsIGFjdGl2ZSBtZXNzYWdlcyB3aGVuIHRoZXkgZG9uJ3QgZXhwaXJlIHdoaWxlIHNodXR0aW5nIGRvd24iIGRvCkBAIC0yNTEsMTUgKzI0OSwxNSBAQAogICAgICAgc2xlZXAgMC4xICMgc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bigxKQogICAgICAgQGNhdGNoX2V4Y2VwdGlvbnMgPSB0cnVlCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDMpLnNob3VsZF9ub3QgYmVfbmlsCi0gICAgICByZXN1bHQuc2hvdWxkIGJlX2VtcHR5CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigzKSkubm90X3RvIGJlX25pbAorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfZW1wdHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxsb3cgc2h1dHRpbmcgZG93biBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UiIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBjbGllbnQuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkX25vdCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS5ub3RfdG8gYmVfbmlsCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCmluZGV4IGQzNWY2NTIuLmQzMDU1M2YgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCkBAIC0xNyw2NSArMTcsNjIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0UHJvY2Vzc29yU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1Byb2Nlc3NvcicgZG8KIAogICBjbGFzcyBQcm9jZXNzb3JTcGVjCiAgICAgaW5jbHVkZSBUaHJpZnQ6OlByb2Nlc3NvcgogICBlbmQKIAotICBkZXNjcmliZSAiUHJvY2Vzc29yIiBkbworICBkZXNjcmliZSBUaHJpZnQ6OlByb2Nlc3NvciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhtb2NrKCJNb2NrSGFuZGxlciIpKQotICAgICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgICAgQHByb2Nlc3NvciA9IFByb2Nlc3NvclNwZWMubmV3KGRvdWJsZSgiTW9ja0hhbmRsZXIiKSkKKyAgICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIGVuZAogCiAgICAgZGVmIG1vY2tfdHJhbnMob2JqKQotICAgICAgb2JqLnNob3VsZF9yZWNlaXZlKDp0cmFucykub3JkZXJlZC5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soInRyYW5zIikudGVlIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChvYmopLnRvIHJlY2VpdmUoOnRyYW5zKS5vcmRlcmVkIGRvCisgICAgICAgIGRvdWJsZSgidHJhbnMiKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2FsbCBwcm9jZXNzXzxtZXNzYWdlPiB3aGVuIGl0IHJlY2VpdmVzIHRoYXQgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDRdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSVUNUKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKLSAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jayhBcHBsaWNhdGlvbkV4Y2VwdGlvbikudGVlIGRvIHxlfAotICAgICAgICAgIGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCA0XQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgNCkub3JkZXJlZAorICAgICAgZSA9IGRvdWJsZShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgZXhwZWN0KGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4oZSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIGFyZ3Mgb2ZmIHRvIHRoZSBhcmdzIGNsYXNzIiBkbwotICAgICAgYXJnc19jbGFzcyA9IG1vY2soIk1vY2tBcmdzQ2xhc3MiKQotICAgICAgYXJncyA9IG1vY2soIiM8TW9ja0FyZ3NDbGFzczptb2NrPiIpLnRlZSBkbyB8YXJnc3wKLSAgICAgICAgYXJncy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgYXJnc19jbGFzcyA9IGRvdWJsZSgiTW9ja0FyZ3NDbGFzcyIpCisgICAgICBhcmdzID0gZG91YmxlKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50YXAgZG8gfGFyZ3N8CisgICAgICAgIGV4cGVjdChhcmdzKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBlbmQKLSAgICAgIGFyZ3NfY2xhc3Muc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBhcmdzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpLnNob3VsZCBlcWwoYXJncykKKyAgICAgIGV4cGVjdChhcmdzX2NsYXNzKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpKS50byBlcWwoYXJncykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IGEgcmVwbHkgd2hlbiBhc2tlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIE1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCi0gICAgICByZXN1bHQgPSBtb2NrKCJNb2NrUmVzdWx0IikKLSAgICAgIHJlc3VsdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgMjMpLm9yZGVyZWQKKyAgICAgIHJlc3VsdCA9IGRvdWJsZSgiTW9ja1Jlc3VsdCIpCisgICAgICBleHBlY3QocmVzdWx0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3Iud3JpdGVfcmVzdWx0KHJlc3VsdCwgQHByb3QsICd0ZXN0TWVzc2FnZScsIDIzKQogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCmluZGV4IDQ0MzM5YzAuLjJhN2RjNmQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKQEAgLTE3LDUzICsxNyw1MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRTZXJpYWxpemVyU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotICBpbmNsdWRlIFNwZWNOYW1lc3BhY2UKK2Rlc2NyaWJlICdTZXJpYWxpemVyJyBkbwogCi0gIGRlc2NyaWJlIFNlcmlhbGl6ZXIgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTZXJpYWxpemVyIGRvCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgc3RydWN0cyB0byBiaW5hcnkgYnkgZGVmYXVsdCIgZG8KLSAgICAgIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKLSAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQotICAgICAgZGF0YS5zaG91bGQgPT0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCisgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKKyAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQorICAgICAgZXhwZWN0KGRhdGEpLnRvIGVxKCJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQotICAgICAgc2VyaWFsaXplciA9IFNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCi0gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBkb3VibGUoIlByb3RvY29sRmFjdG9yeSIpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCisgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQorICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgRGVzZXJpYWxpemVyIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RGVzZXJpYWxpemVyIGRvCiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCi0gICAgICBkZXNlcmlhbGl6ZXIgPSBEZXNlcmlhbGl6ZXIubmV3CisgICAgICBkZXNlcmlhbGl6ZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcKICAgICAgIGRhdGEgPSAiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIKLSAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShIZWxsby5uZXcsIGRhdGEpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgZGF0YSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIHN0cnVjdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG9jb2wiIGRvCi0gICAgICBwcm90b2NvbCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUeXBlczo6U1RSSU5HLCAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQotICAgICAgZGVzZXJpYWxpemVyID0gRGVzZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKEhlbGxvLm5ldywgIiIpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpCisgICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikuYW5kX3JldHVybigiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCmluZGV4IGZjZTUwMTMuLmVjOWU1NTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTE3LDY0ICsxNyw2OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0U2VydmVyU29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1RocmlmdDo6U2VydmVyU29ja2V0JyBkbwogCi0gIGRlc2NyaWJlIFNlcnZlclNvY2tldCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlNlcnZlclNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBzb2NrZXQgPSBTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBob3N0IGFyZ3VtZW50IiBkbwotICAgICAgQHNvY2tldCA9IFNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNlcnZlcihsb2NhbGhvc3Q6MTIzNCkiCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBUaHJpZnQ6OlNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiKQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIikKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIHNvY2sgPSBtb2NrKCJzb2NrIikKLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCi0gICAgICB0cmFucyA9IG1vY2soIlNvY2tldCIpCi0gICAgIFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzb2NrZXQoOjEyMzQpIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKaW5kZXggZmZlOWJmZi4uNTdmNTIzNyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKQEAgLTE2LDE0NSArMTYsMTcyIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK2Rlc2NyaWJlICdTZXJ2ZXInIGRvCiAKLWNsYXNzIFRocmlmdFNlcnZlclNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLQotICBkZXNjcmliZSBCYXNlU2VydmVyIGRvCi0gICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbwotICAgICAgc2VydmVyID0gQmFzZVNlcnZlci5uZXcobW9jaygiUHJvY2Vzc29yIiksIG1vY2soIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoQmFzZVRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoQmluYXJ5UHJvdG9jb2xGYWN0b3J5KQotICAgIGVuZAotCi0gICAgIyBzZXJ2ZSBpcyBhIG5vb3AsIHNvIGNhbid0IHRlc3QgdGhhdAotICBlbmQKLQotICBzaGFyZWRfZXhhbXBsZXNfZm9yICJzZXJ2ZXJzIiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJUcmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQotICAgICAgQHNlcnZlciA9IHNlcnZlcl90eXBlLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbworICAgICAgQHNlcnZlciA9IFRocmlmdDo6QmFzZVNlcnZlci5uZXcoZG91YmxlKCJQcm9jZXNzb3IiKSwgZG91YmxlKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGV4cGVjdChAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0Bwcm90b2NvbF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBub3Qgc2VydmUiIGRvCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlKCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFNpbXBsZVNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgU2ltcGxlU2VydmVyCisgIGRlc2NyaWJlIFRocmlmdDo6U2ltcGxlU2VydmVyIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCisgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCi0KKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNpbXBsZShzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW4gdGhlIG1haW4gdGhyZWFkIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gdGhyb3cgOnN0b3AKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8gdGhyb3dfc3ltYm9sKDpzdG9wKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBUaHJlYWRlZFNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgVGhyZWFkZWRTZXJ2ZXIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRlZFNlcnZlciBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRlZChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgdGhyZWFkcyIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcHJvdCwgQHRyYW5zKS5leGFjdGx5KDMpLnRpbWVzLmFuZF95aWVsZChAcHJvdCwgQHRyYW5zKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgVGhyZWFkUG9vbFNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgIyBwdXQgdGhpcyBzdHVmZiBoZXJlIHNvIGl0IHJ1bnMgYmVmb3JlIHRoZSBzZXJ2ZXIgaXMgY3JlYXRlZAotICAgICAgQHRocmVhZFEgPSBtb2NrKCJTaXplZFF1ZXVlIikKLSAgICAgIFNpemVkUXVldWUuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgyMCkuYW5kX3JldHVybihAdGhyZWFkUSkKLSAgICAgIEBleGNRID0gbW9jaygiUXVldWUiKQotICAgICAgUXVldWUuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihAZXhjUSkKLSAgICAgIFRocmVhZFBvb2xTZXJ2ZXIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJfdHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlcl90cmFucywgQHRyYW5zLCBAcHJvdCkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHNldCB1cCB0aGUgcXVldWVzIiBkbwotICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdGhyZWFkX3EnKS5zaG91bGQgYmUoQHRocmVhZFEpCi0gICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BleGNlcHRpb25fcScpLnNob3VsZCBiZShAZXhjUSkKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJfdHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkcG9vbChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJfdHJhbnMpKSkpIikKICAgICBlbmQKLQorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkIiBkbwotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gZG8gfGJsb2NrfAotICAgICAgICBAc2VydmVyLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkKLSAgICAgICAgYmxvY2suY2FsbAotICAgICAgICBAc2VydmVyLnJzcGVjX3ZlcmlmeQorICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1InKSkKICAgICAgIGVuZAotICAgICAgQGV4Y1Euc2hvdWxkX3JlY2VpdmUoOnBvcCkuYW5kX3Rocm93KDpwb3BwZWQpCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnBvcHBlZCkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SJykpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhdm9pZCBydW5uaW5nIHRoZSBzZXJ2ZXIgdHdpY2Ugd2hlbiByZXRyeWluZyByZXNjdWFibGVfc2VydmUiIGRvCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbyB8YmxvY2t8Ci0gICAgICAgIEBzZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKQotICAgICAgICBibG9jay5jYWxsCi0gICAgICAgIEBzZXJ2ZXIucnNwZWNfdmVyaWZ5CisgICAgICBleGNlcHRpb25fcSA9IEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZXhjZXB0aW9uX3EpCisgICAgICBleHBlY3RfYW55X2luc3RhbmNlX29mKGRlc2NyaWJlZF9jbGFzcykudG8gcmVjZWl2ZSg6c2VydmUpIGRvIAorICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjEnKSkKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IyJykpCiAgICAgICBlbmQKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwb3ApLnR3aWNlLmFuZF90aHJvdyg6cG9wcGVkKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpwb3BwZWQpCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnBvcHBlZCkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SMScpKQorICAgICAgZXhwZWN0IHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS50byhyYWlzZV9lcnJvcignRVJST1IyJykpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIGEgdGhyZWFkIHBvb2wiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHRocmVhZFEuc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQotICAgICAgQHRocmVhZFEuc2hvdWxkX3JlY2VpdmUoOnBvcCkKLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIHRocmVhZF9xID0gZG91YmxlKCJTaXplZFF1ZXVlIikKKyAgICAgIGV4Y2VwdGlvbl9xID0gZG91YmxlKCJRdWV1ZSIpCisgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHRocmVhZF9xLCB0aHJlYWRfcSkKKyAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAZXhjZXB0aW9uX3EsIGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KHRocmVhZF9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKDp0b2tlbikKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cG9wKQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCiAgICAgICB4ID0gMAogICAgICAgZXJyb3IgPSBSdW50aW1lRXJyb3IubmV3KCJTdG9wcGVkIikKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gcmFpc2UgZXJyb3IKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KGV4Y2VwdGlvbl9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8odGhyb3dfc3ltYm9sKDpzdG9wKSkKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKaW5kZXggZGQ4YjBmOS4uMjAyYzc0NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKQEAgLTE3LDQ1ICsxNyw1MiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0U29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1NvY2tldCcgZG8KIAotICBkZXNjcmliZSBTb2NrZXQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAc29ja2V0ID0gU29ja2V0Lm5ldwotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjb25uZWN0X25vbmJsb2NrKQotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldworICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwKS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KGxvY2FsaG9zdDo5MDkwKSIKICAgICAgIEBzb2NrZXQub3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0KS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCi0gICAgICBTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KG15LmRvbWFpbjoxMjM0KSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KQotICAgICAgU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNvY2tldChteWhvc3Q6ODA5MCkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCmluZGV4IDZlZDc3ZmEuLjMyYmRiNzEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKQEAgLTE3LDg4ICsxNyw4OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCiBzaGFyZWRfZXhhbXBsZXNfZm9yICJhIHNvY2tldCIgZG8KICAgaXQgInNob3VsZCBvcGVuIGEgc29ja2V0IiBkbwotICAgIEBzb2NrZXQub3Blbi5zaG91bGQgPT0gQGhhbmRsZQorICAgIGV4cGVjdChAc29ja2V0Lm9wZW4pLnRvIGVxKEBoYW5kbGUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgYmUgb3BlbiB3aGVuZXZlciBpdCBoYXMgYSBoYW5kbGUiIGRvCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAc29ja2V0LnNob3VsZCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IG5pbAotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgICAgQHNvY2tldC5oYW5kbGUgPSBAaGFuZGxlCiAgICAgQHNvY2tldC5jbG9zZQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgd3JpdGUgZGF0YSB0byB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikKICAgICBAc29ja2V0LndyaXRlKCJmb29iYXIiKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gaXQgY2Fubm90IHJlYWQgZnJvbSB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTcpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJldHVybiB0aGUgZGF0YSByZWFkIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBoYW5kbGUgd29ya3MiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIGRlY2xhcmUgaXRzZWxmIGFzIGNsb3NlZCB3aGVuIGl0IGhhcyBhbiBlcnJvciIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKKyAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxMCkgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgdGltZW91dCBhY2Nlc3NvciBmb3IgcmVhZCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQorICAgIGV4cGVjdChAc29ja2V0LnJlYWQoMTcpKS50byBlcSgidGVzdCBkYXRhIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciB3cml0ZSIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgiIGRhdGEiKS5hbmRfcmV0dXJuKDUpCi0gICAgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikuc2hvdWxkID09IDkKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCJ0ZXN0IGRhdGEiKS5hbmRfcmV0dXJuKDQpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKKyAgICBleHBlY3QoQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikpLnRvIGVxKDkpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiByZWFkIHRpbWVzIG91dCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAwLjUKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS5vbmNlIHtzbGVlcCgwLjUpOyBuaWx9Ci0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDE3KSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIH0KKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkub25jZSB7c2xlZXAoMC41KTsgbmlsfQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gd3JpdGUgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbnlfbnVtYmVyX29mX3RpbWVzLmFuZF9yZXR1cm4obmlsKQotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGFsbG93KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbmRfcmV0dXJuKG5pbCkKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYiBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCmluZGV4IGViNWQyOWMuLjViZjk4ZDAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCkBAIC0xLDMgKzEsNCBAQAorIyBlbmNvZGluZzogVVRGLTgKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTgsOSArMTksNyBAQAogIwogCiByZXF1aXJlICdydWJ5Z2VtcycKLSMgcmVxdWlyZSBhdCBsZWFzdCAxLjEuNCB0byBmaXggYSBidWcgd2l0aCBkZXNjcmliaW5nIE1vZHVsZXMKLWdlbSAncnNwZWMnLCAnPj0gMS4xLjQnCi1yZXF1aXJlICdzcGVjJworcmVxdWlyZSAncnNwZWMnCiAKICQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1suLiBleHRdKQogCkBAIC0yOCwzMyArMjcsMzggQEAKICMgd2lsbCBnZXQgc2NyZXdlZCB1cAogIyAkIiA8PCAnZmFzdHRocmVhZC5idW5kbGUnCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vbGliL3RocmlmdCcKK3JlcXVpcmUgJ3RocmlmdCcKIAotY2xhc3MgT2JqZWN0Ci0gICMgdGVlIGlzIGEgdXNlZnVsIG1ldGhvZCwgc28gbGV0J3MgbGV0IG91ciB0ZXN0cyBoYXZlIGl0Ci0gIGRlZiB0ZWUoJmJsb2NrKQotICAgIGJsb2NrLmNhbGwoc2VsZikKLSAgICBzZWxmCit1bmxlc3MgT2JqZWN0Lm1ldGhvZF9kZWZpbmVkPyA6dGFwCisgICMgaWYgT2JqZWN0I3RhcCBpc24ndCBkZWZpbmVkLCB0aGVuIGFkZCBpdDsgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gUnVieSA8IDEuOC43CisgIGNsYXNzIE9iamVjdAorICAgIGRlZiB0YXAoJmJsb2NrKQorICAgICAgYmxvY2suY2FsbChzZWxmKQorICAgICAgc2VsZgorICAgIGVuZAogICBlbmQKIGVuZAogCi1TcGVjOjpSdW5uZXIuY29uZmlndXJlIGRvIHxjb25maWd1cmF0aW9ufAorUlNwZWMuY29uZmlndXJlIGRvIHxjb25maWd1cmF0aW9ufAogICBjb25maWd1cmF0aW9uLmJlZm9yZSg6ZWFjaCkgZG8KICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKICAgZW5kCiBlbmQKIAotJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3Wy4uIGRlYnVnX3Byb3RvX3Rlc3QgZ2VuLXJiXSkKLXJlcXVpcmUgInNydiIKLXJlcXVpcmUgImRlYnVnX3Byb3RvX3Rlc3RfY29uc3RhbnRzIgorJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3Wy4uIHRlc3QgZGVidWdfcHJvdG8gZ2VuLXJiXSkKK3JlcXVpcmUgJ3NydicKK3JlcXVpcmUgJ2RlYnVnX3Byb3RvX3Rlc3RfY29uc3RhbnRzJwogCiAkOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbZ2VuLXJiXSkKIHJlcXVpcmUgJ3RocmlmdF9zcGVjX3R5cGVzJwogcmVxdWlyZSAnbm9uYmxvY2tpbmdfc2VydmljZScKIAogbW9kdWxlIEZpeHR1cmVzCi0gIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QgPSBDT01QQUNUX1RFU1QuZHVwCisgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QgPSBUaHJpZnQ6OlRlc3Q6OkNPTVBBQ1RfVEVTVC5kdXAKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5hX2JpbmFyeSA9IFswLDEsMiwzLDQsNSw2LDcsOF0ucGFjaygnYyonKQogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULnNldF9ieXRlX21hcCA9IG5pbAogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULm1hcF9ieXRlX21hcCA9IG5pbAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCisKKyQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1tnZW4tcmIvZmxhdF0pCisKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTY1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQorCitkZXNjcmliZSAnU1NMU2VydmVyU29ja2V0JyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0IGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldygxMjM0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoInNzbChzb2NrZXQoOjEyMzQpKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4ZDhkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYgpAQCAtMCwwICsxLDc4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKKworZGVzY3JpYmUgJ1NTTFNvY2tldCcgZG8KKworICBkZXNjcmliZSBUaHJpZnQ6OlNTTFNvY2tldCBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBjb250ZXh0ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldworICAgICAgQHNpbXBsZV9zb2NrZXRfaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOnNldHNvY2tvcHQpCisKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoZG91YmxlKCJTU0xIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6cG9zdF9jb25uZWN0aW9uX2NoZWNrID0+IHRydWUpLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykKKworICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAc2ltcGxlX3NvY2tldF9oYW5kbGUpCisgICAgICBhbGxvdyhPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgZW5kCisKKyAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgorCisgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc3NsIHNvY2tldCIgZG8KKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoImxvY2FsaG9zdCIsIDkwOTAsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QgeyBAc29ja2V0Lm9wZW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIG9wZW4gYSA6OlNvY2tldCB3aXRoIGRlZmF1bHQgYXJncyIgZG8KKyAgICAgIGV4cGVjdChPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBzaW1wbGVfc29ja2V0X2hhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdsb2NhbGhvc3QnKQorICAgICAgQHNvY2tldC5vcGVuCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBob3N0L3BvcnQgb3B0aW9ucyIgZG8KKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIGV4cGVjdChPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGhhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdteS5kb21haW4nKQorICAgICAgVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0LCA2MDAwLCBuaWwpLm9wZW4KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgY29udGV4dCIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUsIEBjb250ZXh0KS5zc2xfY29udGV4dCkudG8gZXEoQGNvbnRleHQpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdteWhvc3QnLCA4MDkwKS50b19zKS50byBlcSgic3NsKHNvY2tldChteWhvc3Q6ODA5MCkpIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MzU2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCkBAIC0wLDAgKzEsMTkxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdTdHJ1Y3ROZXN0ZWRDb250YWluZXJzJyBkbworCisgIGRlZiB3aXRoX3R5cGVfY2hlY2tpbmcKKyAgICBzYXZlZF90eXBlX2NoZWNraW5nLCBUaHJpZnQudHlwZV9jaGVja2luZyA9IFRocmlmdC50eXBlX2NoZWNraW5nLCB0cnVlCisgICAgYmVnaW4KKyAgICAgIHlpZWxkCisgICAgZW5zdXJlCisgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHNhdmVkX3R5cGVfY2hlY2tpbmcKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTdHJ1Y3QgZG8KKyAgICAjIE5lc3RlZCBjb250YWluZXIgdGVzdHMsIHNlZSBUSFJJRlQtMzY5LgorICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbGlzdHMgaW5zaWRlIGxpc3RzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5MaXN0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTGlzdC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLnB1c2ggWzMsIDQsIDVdCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBsaXN0cyBpbnNpZGUgc2V0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluU2V0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluU2V0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10sIFsyLCAzLCA0XSBdLnRvX3NldAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLmFkZCBbMywgNCwgNV0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIGxpc3RzIGluIG1hcCBrZXlzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5NYXBLZXkubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5NYXBLZXkubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXSA9PiAxLCBbMiwgMywgNF0gPT4gMiB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdXSA9IDMKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIGxpc3RzIGluIG1hcCB2YWx1ZXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbk1hcFZhbHVlLm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTWFwVmFsdWUubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLCAyID0+IFsyLCAzLCA0XSB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbM10gPSBbMywgNCwgNV0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW5zaWRlIGxpc3RzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbkxpc3QubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbkxpc3QubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLnB1c2goWzMsIDQsIDVdLnRvX3NldCkKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW5zaWRlIHNldHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluU2V0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5TZXQubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXS50b19zZXQKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5hZGQoWzMsIDQsIDVdLnRvX3NldCkKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW4gbWFwIGtleXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTWFwS2V5Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5NYXBLZXkubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXS50b19zZXQgPT4gMSwgWzIsIDMsIDRdLnRvX3NldCA9PiAyIH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVtbMywgNCwgNV0udG9fc2V0XSA9IDMKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW4gbWFwIHZhbHVlcyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5NYXBWYWx1ZS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTWFwVmFsdWUubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLnRvX3NldCwgMiA9PiBbMiwgMywgNF0udG9fc2V0IH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XS50b19zZXQKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIG1hcHMgaW5zaWRlIGxpc3RzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbkxpc3QubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbkxpc3QubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLnB1c2goeyAzID0+IDQsIDUgPT4gNiB9KQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbWFwcyBpbnNpZGUgc2V0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5TZXQubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJblNldC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgezEgPT4gMiwgMyA9PiA0fSwgezIgPT4gMywgNCA9PiA1fSBdLnRvX3NldAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLmFkZCh7IDMgPT4gNCwgNSA9PiA2IH0pCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBtYXBzIGluIG1hcCBrZXlzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbk1hcEtleS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTWFwS2V5Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyB7IDEgPT4gMiwgMyA9PiA0fSA9PiAxLCB7MiA9PiAzLCA0ID0+IDV9ICA9PiAyIH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVt7MyA9PiA0LCA1ID0+IDZ9XSA9IDMKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIG1hcHMgaW4gbWFwIHZhbHVlcyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5NYXBWYWx1ZS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTWFwVmFsdWUubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4geyAxID0+IDIsIDMgPT4gNH0sIDIgPT4gezIgPT4gMywgNCA9PiA1fSB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbM10gPSB7IDMgPT4gNCwgNSA9PiA2IH0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCmluZGV4IDA0ZjU1Y2EuLmJiZDUwMmIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCkBAIC0xNywyMDQgKzE3LDIwMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRTdHJ1Y3RTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0gIGluY2x1ZGUgU3BlY05hbWVzcGFjZQorZGVzY3JpYmUgJ1N0cnVjdCcgZG8KIAotICBkZXNjcmliZSBTdHJ1Y3QgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTdHJ1Y3QgZG8KICAgICBpdCAic2hvdWxkIGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHByb3Blcmx5IiBkbwogICAgICAgZmllbGRzID0ge30KLSAgICAgIEZvby5uZXcuZWFjaF9maWVsZCB7IHxmaWQsZmllbGRfaW5mb3wgZmllbGRzW2ZpZF0gPSBmaWVsZF9pbmZvIH0KLSAgICAgIGZpZWxkcy5zaG91bGQgPT0gRm9vOjpGSUVMRFMKKyAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuZWFjaF9maWVsZCB7IHxmaWQsZmllbGRfaW5mb3wgZmllbGRzW2ZpZF0gPSBmaWVsZF9pbmZvIH0KKyAgICAgIGV4cGVjdChmaWVsZHMpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbml0aWFsaXplIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHMiIGRvCi0gICAgICB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhGb28ubmV3KQorICAgICAgdmFsaWRhdGVfZGVmYXVsdF9hcmd1bWVudHMoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHRzIGFuZCBhY2NlcHQgYSBibG9jayBhcmd1bWVudCIgZG8KLSAgICAgIEZvby5uZXcgZG8gfGZ8CisgICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3IGRvIHxmfAogICAgICAgICB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhmKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZWYgdmFsaWRhdGVfZGVmYXVsdF9hcmd1bWVudHMob2JqZWN0KQotICAgICAgb2JqZWN0LnNpbXBsZS5zaG91bGQgPT0gNTMKLSAgICAgIG9iamVjdC53b3Jkcy5zaG91bGQgPT0gIndvcmRzIgotICAgICAgb2JqZWN0LmhlbGxvLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykKLSAgICAgIG9iamVjdC5pbnRzLnNob3VsZCA9PSBbMSwgMiwgMiwgM10KLSAgICAgIG9iamVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIG9iamVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzUsIDE3LCAyMzldKQorICAgICAgZXhwZWN0KG9iamVjdC5zaW1wbGUpLnRvIGVxKDUzKQorICAgICAgZXhwZWN0KG9iamVjdC53b3JkcykudG8gZXEoIndvcmRzIikKKyAgICAgIGV4cGVjdChvYmplY3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChvYmplY3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KG9iamVjdC5jb21wbGV4KS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChvYmplY3Quc2hvcnRzKS50byBlcShTZXQubmV3KFs1LCAxNywgMjM5XSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBzaGFyZSBkZWZhdWx0IHZhbHVlcyBiZXR3ZWVuIGluc3RhbmNlcyIgZG8KICAgICAgIGJlZ2luCi0gICAgICAgIHN0cnVjdCA9IEZvby5uZXcKKyAgICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwogICAgICAgICBzdHJ1Y3QuaW50cyA8PCAxNwotICAgICAgICBGb28ubmV3LmludHMuc2hvdWxkID09IFsxLDIsMiwzXQorICAgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5pbnRzKS50byBlcShbMSwyLDIsM10pCiAgICAgICBlbnN1cmUKICAgICAgICAgIyBlbnN1cmUgbm8gbGVha2FnZSB0byBvdGhlciB0ZXN0cwotICAgICAgICBGb286OkZJRUxEU1s0XVs6ZGVmYXVsdF0gPSBbMSwyLDIsM10KKyAgICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFNbNF1bOmRlZmF1bHRdID0gWzEsMiwyLDNdCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBib29sZWFuIHZhbHVlcyIgZG8KLSAgICAgIHN0cnVjdCA9IEJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKLSAgICAgIHN0cnVjdC55ZXNuby5zaG91bGQgYmVfZmFsc2UKKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QueWVzbm8pLnRvIGJlX2ZhbHNleQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIHByb3BlciA9PSBzZW1hbnRpY3MiIGRvCi0gICAgICBGb28ubmV3LnNob3VsZF9ub3QgPT0gSGVsbG8ubmV3Ci0gICAgICBGb28ubmV3LnNob3VsZCA9PSBGb28ubmV3Ci0gICAgICBGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNob3VsZF9ub3QgPT0gRm9vLm5ldworICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykudG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpKS5ub3RfdG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJpbnQgZW51bSB2YWx1ZSBuYW1lcyBpbiBpbnNwZWN0IiBkbwotICAgICAgU3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNvbWVFbnVtOjpPTkUpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtIHNvbWVfZW51bTpPTkUgKDApPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IikKIAotICAgICAgU3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NvbWVFbnVtOjpPTkUgPT4gW1NvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAgbXlfbWFwOntPTkUgKDApOiBbVFdPICgxKV19PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByZXR0eSBwcmludCBiaW5hcnkgZmllbGRzIiBkbwotICAgICAgRm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvbzIubmV3KDpteV9iaW5hcnkgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6Rm9vMiBteV9iaW5hcnk6MDEwMjAzPiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9mZmVyIGZpZWxkPyBtZXRob2RzIiBkbwotICAgICAgRm9vLm5ldy5vcHRfc3RyaW5nPy5zaG91bGQgYmVfZmFsc2UKLSAgICAgIEZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgRm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8uc2hvdWxkIGJlX3RydWUKLSAgICAgIEZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3Lm9wdF9zdHJpbmc/KS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNpbXBsZT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gZmFsc2UpLm15X2Jvb2w/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IHRydWUpLm15X2Jvb2w/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgY29tcGFyYWJsZSIgZG8KLSAgICAgIHMxID0gU3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNvbWVFbnVtOjpPTkUpCi0gICAgICBzMiA9IFN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6VFdPKQorICAgICAgczEgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkKKyAgICAgIHMyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV08pCiAKLSAgICAgIChzMSA8PT4gczIpLnNob3VsZCA9PSAtMQotICAgICAgKHMyIDw9PiBzMSkuc2hvdWxkID09IDEKLSAgICAgIChzMSA8PT4gczEpLnNob3VsZCA9PSAwCi0gICAgICAoczEgPD0+IFN0cnVjdFdpdGhTb21lRW51bS5uZXcoKSkuc2hvdWxkID09IC0xCisgICAgICBleHBlY3QoczEgPD0+IHMyKS50byBlcSgtMSkKKyAgICAgIGV4cGVjdChzMiA8PT4gczEpLnRvIGVxKDEpCisgICAgICBleHBlY3QoczEgPD0+IHMxKS50byBlcSgwKQorICAgICAgZXhwZWN0KHMxIDw9PiBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KCkpLnRvIGVxKC0xKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGl0c2VsZiBvZmYgdGhlIHdpcmUiIGRvCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3Ci0gICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKLSAgICAgICAgWydjb21wbGV4JywgVHlwZXM6Ok1BUCwgNV0sICMgRm9vCi0gICAgICAgIFsnd29yZHMnLCBUeXBlczo6U1RSSU5HLCAyXSwgIyBGb28KLSAgICAgICAgWydoZWxsbycsIFR5cGVzOjpTVFJVQ1QsIDNdLCAjIEZvbwotICAgICAgICAgIFsnZ3JlZXRpbmcnLCBUeXBlczo6U1RSSU5HLCAxXSwgIyBIZWxsbwotICAgICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXSwgIyBIZWxsbwotICAgICAgICBbJ3NpbXBsZScsIFR5cGVzOjpJMzIsIDFdLCAjIEZvbwotICAgICAgICBbJ2ludHMnLCBUeXBlczo6TElTVCwgNF0sICMgRm9vCi0gICAgICAgIFsnc2hvcnRzJywgVHlwZXM6OlNFVCwgNl0sICMgRm9vCi0gICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXSAjIEhlbGxvCisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICAgIFsnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNV0sICMgRm9vCisgICAgICAgIFsnd29yZHMnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLCAjIEZvbworICAgICAgICBbJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzXSwgIyBGb28KKyAgICAgICAgICBbJ2dyZWV0aW5nJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwgIyBIZWxsbworICAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdLCAjIEhlbGxvCisgICAgICAgIFsnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxXSwgIyBGb28KKyAgICAgICAgWydpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNF0sICMgRm9vCisgICAgICAgIFsnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2XSwgIyBGb28KKyAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0gIyBIZWxsbwogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNykudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKAotICAgICAgICBbVHlwZXM6OkkzMiwgVHlwZXM6Ok1BUCwgMl0sICMgY29tcGxleAotICAgICAgICAgIFtUeXBlczo6U1RSSU5HLCBUeXBlczo6RE9VQkxFLCAyXSwgIyBjb21wbGV4LzEvdmFsdWUKLSAgICAgICAgICBbVHlwZXM6OlNUUklORywgVHlwZXM6OkRPVUJMRSwgMV0gIyBjb21wbGV4LzIvdmFsdWUKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgICBbVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDJdLCAjIGNvbXBsZXgKKyAgICAgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDJdLCAjIGNvbXBsZXgvMS92YWx1ZQorICAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMV0gIyBjb21wbGV4LzIvdmFsdWUKICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5hbmRfcmV0dXJuKFtUeXBlczo6STMyLCA0XSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9iZWdpbikuYW5kX3JldHVybihbVHlwZXM6OkkxNiwgMl0pCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkzMiwgNF0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STE2LCAyXSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oCiAgICAgICAgIDEsIDE0LCAgICAgICAgIyBjb21wbGV4IGtleXMKICAgICAgICAgNDIsICAgICAgICAgICAjIHNpbXBsZQogICAgICAgICA0LCAyMywgNCwgMjkgICMgaW50cwogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oInBpIiwgImUiLCAiZmVpZ2VuYmF1bSIsICJhcHBsZSBiYW5hbmEiLCAid2hhdCdzIHVwPyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkuYW5kX3JldHVybihNYXRoOjpQSSwgTWF0aDo6RSwgNC42NjkyMDE2MDkpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikuYW5kX3JldHVybigyLCAzKQotICAgICAgcHJvdC5zaG91bGRfbm90X3JlY2VpdmUoOnNraXApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oInBpIiwgImUiLCAiZmVpZ2VuYmF1bSIsICJhcHBsZSBiYW5hbmEiLCAid2hhdCdzIHVwPyIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLmFuZF9yZXR1cm4oTWF0aDo6UEksIE1hdGg6OkUsIDQuNjY5MjAxNjA5KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5hbmRfcmV0dXJuKDIsIDMpCisgICAgICBleHBlY3QocHJvdCkubm90X3RvIHJlY2VpdmUoOnNraXApCiAgICAgICBzdHJ1Y3QucmVhZChwcm90KQogCi0gICAgICBzdHJ1Y3Quc2ltcGxlLnNob3VsZCA9PSA0MgotICAgICAgc3RydWN0LmNvbXBsZXguc2hvdWxkID09IHsxID0+IHsicGkiID0+IE1hdGg6OlBJLCAiZSIgPT4gTWF0aDo6RX0sIDE0ID0+IHsiZmVpZ2VuYmF1bSIgPT4gNC42NjkyMDE2MDl9fQotICAgICAgc3RydWN0LmhlbGxvLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJ3aGF0J3MgdXA/IikKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gImFwcGxlIGJhbmFuYSIKLSAgICAgIHN0cnVjdC5pbnRzLnNob3VsZCA9PSBbNCwgMjMsIDQsIDI5XQotICAgICAgc3RydWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbMywgMl0pCisgICAgICBleHBlY3Qoc3RydWN0LnNpbXBsZSkudG8gZXEoNDIpCisgICAgICBleHBlY3Qoc3RydWN0LmNvbXBsZXgpLnRvIGVxKHsxID0+IHsicGkiID0+IE1hdGg6OlBJLCAiZSIgPT4gTWF0aDo6RX0sIDE0ID0+IHsiZmVpZ2VuYmF1bSIgPT4gNC42NjkyMDE2MDl9fSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIndoYXQncyB1cD8iKSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Qud29yZHMpLnRvIGVxKCJhcHBsZSBiYW5hbmEiKQorICAgICAgZXhwZWN0KHN0cnVjdC5pbnRzKS50byBlcShbNCwgMjMsIDQsIDI5XSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2hvcnRzKS50byBlcShTZXQubmV3KFszLCAyXSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBmYWxzZSBib29sZWFuIGZpZWxkcyBjb3JyZWN0bHkiIGRvCi0gICAgICBiID0gQm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQotICAgICAgcHJvdCA9IEJpbmFyeVByb3RvY29sLm5ldyhNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aChmYWxzZSkKKyAgICAgIGIgPSBTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCisgICAgICBwcm90ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoZmFsc2UpCiAgICAgICBiLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgdW5leHBlY3RlZCBmaWVsZHMgaW4gc3RydWN0cyBhbmQgdXNlIGRlZmF1bHQgdmFsdWVzIiBkbwotICAgICAgc3RydWN0ID0gRm9vLm5ldwotICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCi0gICAgICAgIFsnc2ltcGxlJywgVHlwZXM6OkkzMiwgMV0sCi0gICAgICAgIFsnY29tcGxleCcsIFR5cGVzOjpTVFJVQ1QsIDVdLAotICAgICAgICBbJ3RoaW56JywgVHlwZXM6Ok1BUCwgN10sCi0gICAgICAgIFsnZm9vYmFyJywgVHlwZXM6OkkzMiwgM10sCi0gICAgICAgIFsnd29yZHMnLCBUeXBlczo6U1RSSU5HLCAyXSwKLSAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdCisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICAgIFsnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxXSwKKyAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA1XSwKKyAgICAgICAgWyd0aGlueicsIFRocmlmdDo6VHlwZXM6Ok1BUCwgN10sCisgICAgICAgIFsnZm9vYmFyJywgVGhyaWZ0OjpUeXBlczo6STMyLCAzXSwKKyAgICAgICAgWyd3b3JkcycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg1KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiZm9vYmFyIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6OlNUUlVDVCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6Ok1BUCkKLSAgICAgICMgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oW1R5cGVzOjpJMzIsIFR5cGVzOjpJMzIsIDBdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oImZvb2JhciIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMF0pCiAgICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6OkkzMikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMikKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgYmVfbmlsCi0gICAgICBzdHJ1Y3Qud29yZHMuc2hvdWxkID09ICJmb29iYXIiCi0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgc3RydWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICBleHBlY3Qoc3RydWN0LnNpbXBsZSkudG8gZXEoNDIpCisgICAgICBleHBlY3Qoc3RydWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImZvb2JhciIpCisgICAgICBleHBlY3Qoc3RydWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFsxLCAyLCAyLCAzXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2hvcnRzKS50byBlcShTZXQubmV3KFs1LCAxNywgMjM5XSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGl0c2VsZiB0byB0aGUgd2lyZSIgZG8KLSAgICAgIHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKSAjbW9jaygiUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpGb28iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ludHMnLCBUeXBlczo6TElTVCwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDIpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb21wbGV4JywgVHlwZXM6Ok1BUCwgNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdmb28nKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2hvcnRzJywgVHlwZXM6OlNFVCwgNikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCg1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDE3KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDIzOSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLmV4YWN0bHkoNikudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaW1wbGUnLCBUeXBlczo6STMyLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2hlbGxvJywgVHlwZXM6OlNUUlVDVCwgMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdncmVldGluZycsIFR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFR5cGVzOjpJMzIsIFR5cGVzOjpNQVAsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVHlwZXM6OlNUUklORywgVHlwZXM6OkRPVUJMRSwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9saXN0X2JlZ2luKS53aXRoKFR5cGVzOjpJMzIsIDQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3NldF9iZWdpbikud2l0aChUeXBlczo6STE2LCAzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc2V0X2VuZCkKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkgI21vY2soIlByb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkZvbyIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaW50cycsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDIpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDUpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdmb28nKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgxLjIzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDYpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDUpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDE3KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgyMzkpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLmV4YWN0bHkoNikudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1MykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2dyZWV0aW5nJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnaGVsbG8sIHdvcmxkIScpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2xpc3RfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCA0KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3NldF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMTYsIDMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc2V0X2VuZCkKIAotICAgICAgc3RydWN0ID0gRm9vLm5ldworICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwogICAgICAgc3RydWN0LndvcmRzID0gbmlsCiAgICAgICBzdHJ1Y3QuY29tcGxleCA9IHs1ID0+IHsiZm9vIiA9PiAxLjIzfX0KICAgICAgIHN0cnVjdC53cml0ZShwcm90KQpAQCAtMjIyLDUxICsyMjAsNTEgQEAKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHByZXNlbnRlZCB3aXRoIGFuIHVua25vd24gY29udGFpbmVyIiBkbwogICAgICAgIyB5ZWFoIHRoaXMgaXMgc2lsbHksIGJ1dCBJJ20gZ29pbmcgZm9yIGNvZGUgY292ZXJhZ2UgaGVyZQotICAgICAgc3RydWN0ID0gRm9vLm5ldwotICAgICAgbGFtYmRhIHsgc3RydWN0LnNlbmQgOndyaXRlX2NvbnRhaW5lciwgbmlsLCBuaWwsIHs6dHlwZSA9PiAiZm9vIn0gfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIk5vdCBhIGNvbnRhaW5lciB0eXBlOiBmb28iKQorICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldworICAgICAgZXhwZWN0IHsgc3RydWN0LnNlbmQgOndyaXRlX2NvbnRhaW5lciwgbmlsLCBuaWwsIHs6dHlwZSA9PiAiZm9vIn0gfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiTm90IGEgY29udGFpbmVyIHR5cGU6IGZvbyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb3B0aW9uYWwgdHlwZS1jaGVja2luZyBpbiBUaHJpZnQ6OlN0cnVjdC5uZXciIGRvCiAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKICAgICAgIGJlZ2luCi0gICAgICAgIGxhbWJkYSB7IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGdyZWV0aW5nLykKICAgICAgIGVuc3VyZQogICAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCiAgICAgICBlbmQKLSAgICAgIGxhbWJkYSB7IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIGZpZWxkIGFjY2Vzc29ycyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KLSAgICAgICAgaGVsbG8gPSBIZWxsby5uZXcKLSAgICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZ3JlZXRpbmciKQorICAgICAgICBoZWxsbyA9IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldworICAgICAgICBleHBlY3QgeyBoZWxsby5ncmVldGluZyA9IDMgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGdyZWV0aW5nLykKICAgICAgIGVuc3VyZQogICAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCiAgICAgICBlbmQKLSAgICAgIGxhbWJkYSB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHVua25vd24gdHlwZXMgYXJlIGdpdmVuIHRvIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KLSAgICAgIGxhbWJkYSB7IEhlbGxvLm5ldyg6ZmlzaCA9PiAnc2FsbW9uJykgfS5zaG91bGQgcmFpc2VfZXJyb3IoRXhjZXB0aW9uLCAiVW5rbm93biBrZXkgZ2l2ZW4gdG8gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3OiBmaXNoIikKKyAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6ZmlzaCA9PiAnc2FsbW9uJykgfS50byByYWlzZV9lcnJvcihFeGNlcHRpb24sICJVbmtub3duIGtleSBnaXZlbiB0byBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXc6IGZpc2giKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IGByYWlzZSBYY2VwdGlvbiwgJ21lc3NhZ2UnYCBmb3IgRXhjZXB0aW9uIHN0cnVjdHMiIGRvCiAgICAgICBiZWdpbgotICAgICAgICByYWlzZSBYY2VwdGlvbiwgInNvbWV0aGluZyBoYXBwZW5lZCIKKyAgICAgICAgcmFpc2UgU3BlY05hbWVzcGFjZTo6WGNlcHRpb24sICJzb21ldGhpbmcgaGFwcGVuZWQiCiAgICAgICByZXNjdWUgVGhyaWZ0OjpFeGNlcHRpb24gPT4gZQotICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJzb21ldGhpbmcgaGFwcGVuZWQiCi0gICAgICAgIGUuY29kZS5zaG91bGQgPT0gMQorICAgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KGUuY29kZSkudG8gZXEoMSkKICAgICAgICAgIyBlbnN1cmUgaXQgZ2V0cyBzZXJpYWxpemVkIHByb3Blcmx5LCB0aGlzIGlzIHRoZSByZWFsbHkgaW1wb3J0YW50IHBhcnQKLSAgICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnMiKSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVHlwZXM6OlNUUklORywgMSkjLCAic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFR5cGVzOjpJMzIsIDIpIywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zIikpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkjLCAic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKSMsIDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCiAKICAgICAgICAgZS53cml0ZShwcm90KQogICAgICAgZW5kCkBAIC0yNzQsMTkgKzI3MiwxOSBAQAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSByZWd1bGFyIGluaXRpYWxpemVyIGZvciBleGNlcHRpb24gc3RydWN0cyIgZG8KICAgICAgIGJlZ2luCi0gICAgICAgIHJhaXNlIFhjZXB0aW9uLCA6bWVzc2FnZSA9PiAic29tZXRoaW5nIGhhcHBlbmVkIiwgOmNvZGUgPT4gNQorICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gInNvbWV0aGluZyBoYXBwZW5lZCIsIDpjb2RlID0+IDUKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSA1Ci0gICAgICAgIHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zIikpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUeXBlczo6STMyLCAyKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KGUuY29kZSkudG8gZXEoNSkKKyAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zIikpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQogCiAgICAgICAgIGUud3JpdGUocHJvdCkKICAgICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTM5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKQEAgLTAsMCArMSwxNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3JhY2svdGVzdCcKK3JlcXVpcmUgJ3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlcicKKworZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlciBkbworCisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQorCisgIGRlc2NyaWJlICIjaW5pdGlhbGl6ZSIgZG8KKworICAgIGNvbnRleHQgIndoZW4gdXNpbmcgdGhlIGRlZmF1bHRzIiBkbworCisgICAgICBpdCAiYmluZHMgdG8gcG9ydCA4MCwgd2l0aCBob3N0IDAuMC4wLjAsIGEgcGF0aCBvZiAnLyciIGRvCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aCgnMC4wLjAuMCcsIDgwLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQnIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisgICAgICBlbmQKKworICAgICAgaXQgInVzZXMgdGhlIEJpbmFyeVByb3RvY29sRmFjdG9yeSIgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KS50byByZWNlaXZlKDpuZXcpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aGVuIHVzaW5nIHRoZSBvcHRpb25zIiBkbworCisgICAgICBpdCAnYWNjZXB0cyA6aXAsIDpwb3J0LCA6cGF0aCcgZG8KKyAgICAgICAgaXAgPSAiMTkyLjE2OC4wLjEiCisgICAgICAgIHBvcnQgPSAzMDAwCisgICAgICAgIHBhdGggPSAiL3RoaW4iCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChpcCwgcG9ydCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppcCA9PiBpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwb3J0ID0+IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6cGF0aCA9PiBwYXRoKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQgd2l0aCBhIGRpZmZlcmVudCBwcm90b2NvbCBmYWN0b3J5JyBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uKS50byByZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcpCisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorCisgIGRlc2NyaWJlICIjc2VydmUiIGRvCisKKyAgICBpdCAnc3RhcnRzIHRoZSBUaGluIHNlcnZlcicgZG8KKyAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIgPSBkb3VibGUoJ3RoaW4gc2VydmVyJywgOnN0YXJ0ID0+IHRydWUpCisgICAgICBhbGxvdyhUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih1bmRlcmx5aW5nX3RoaW5fc2VydmVyKQorCisgICAgICB0aGluX3RocmlmdF9zZXJ2ZXIgPSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisKKyAgICAgIGV4cGVjdCh1bmRlcmx5aW5nX3RoaW5fc2VydmVyKS50byByZWNlaXZlKDpzdGFydCkKKyAgICAgIHRoaW5fdGhyaWZ0X3NlcnZlci5zZXJ2ZQorICAgIGVuZAorICBlbmQKKworZW5kCisKK2Rlc2NyaWJlIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbiBkbworICBpbmNsdWRlIFJhY2s6OlRlc3Q6Ok1ldGhvZHMKKworICBsZXQoOnByb2Nlc3NvcikgeyBkb3VibGUoJ3Byb2Nlc3NvcicpIH0KKyAgbGV0KDpwcm90b2NvbF9mYWN0b3J5KSB7IGRvdWJsZSgncHJvdG9jb2wgZmFjdG9yeScpIH0KKworICBkZWYgYXBwCisgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uLmZvcigiLyIsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgZW5kCisKKyAgY29udGV4dCAiNDA0IHJlc3BvbnNlIiBkbworCisgICAgaXQgJ3JlY2VpdmVzIGEgbm9uLVBPU1QnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICBnZXQgIi8iCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAorICAgIGVuZAorCisgICAgaXQgJ3JlY2VpdmVzIGEgaGVhZGVyIG90aGVyIHRoYW4gYXBwbGljYXRpb24veC10aHJpZnQnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgIHBvc3QgIi8iCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAorICAgIGVuZAorCisgIGVuZAorCisgIGNvbnRleHQgIjIwMCByZXNwb25zZSIgZG8KKworICAgIGJlZm9yZSBkbworICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKQorICAgICAgYWxsb3cocHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKQorICAgIGVuZAorCisgICAgaXQgJ2NyZWF0ZXMgYW4gSU9TdHJlYW1UcmFuc3BvcnQnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGFuX2luc3RhbmNlX29mKFJhY2s6OkxpbnQ6OklucHV0V3JhcHBlciksIGFuX2luc3RhbmNlX29mKFJhY2s6OlJlc3BvbnNlKSkKKyAgICAgIHBvc3QgIi8iCisgICAgZW5kCisKKyAgICBpdCAnZmV0Y2hlcyB0aGUgcmlnaHQgcHJvdG9jb2wgYmFzZWQgb24gdGhlIFRyYW5zcG9ydCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIGV4cGVjdChwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLndpdGgoYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkpCisgICAgICBwb3N0ICIvIgorICAgIGVuZAorCisgICAgaXQgJ3N0YXR1cyBjb2RlIDIwMCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIHBvc3QgIi8iCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5vaz8pLnRvIGJlX3RydXRoeQorICAgIGVuZAorCisgIGVuZAorCitlbmQKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKaW5kZXggNzk5OWU5Mi4uZDU5NWFiNSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCkBAIC0xNywxMCArMTcsOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRUeXBlc1NwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlIFRocmlmdDo6VHlwZXMgZG8KIAogICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCkBAIC0zMCw4NyArMjksOTAgQEAKICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCiAgIGVuZAogCi0gIGRlc2NyaWJlICJUeXBlIGNoZWNraW5nIiBkbworICBjb250ZXh0ICd0eXBlIGNoZWNraW5nJyBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSBwcm9wZXIgbmFtZSBmb3IgZWFjaCB0eXBlIiBkbwotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUeXBlczo6STE2KS5zaG91bGQgPT0gIlR5cGVzOjpJMTYiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFR5cGVzOjpWT0lEKS5zaG91bGQgPT0gIlR5cGVzOjpWT0lEIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUeXBlczo6TElTVCkuc2hvdWxkID09ICJUeXBlczo6TElTVCIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoNDIpLnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkkxNikpLnRvIGVxKCJUeXBlczo6STE2IikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OlZPSUQpKS50byBlcSgiVHlwZXM6OlZPSUQiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6TElTVCkpLnRvIGVxKCJUeXBlczo6TElTVCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZSg0MikpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjaGVjayB0eXBlcyBwcm9wZXJseSIgZG8KLSAgICAgICMgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCBUeXBlczo6U1RPUCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U1RPUH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlZPSUR9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkJPT0x9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpCWVRFfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6STE2fSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkkzMn0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpJNjR9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6STMyfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkRPVUJMRX0sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICAjIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUT1B9LCAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlZPSUR9LCAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlZPSUR9LCAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh0cnVlLCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgiMyIsICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgICBoZWxsbyA9IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoaGVsbG8sICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoImZvbyIsICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U1RSVUNUfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIHs6dHlwZSA9PiBUeXBlczo6TUFQfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6Ok1BUH0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkxJU1R9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgezp0eXBlID0+IFR5cGVzOjpMSVNUfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLDJdKSwgezp0eXBlID0+IFR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gdHJ1ZX0sIHs6dHlwZSA9PiBUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoaGVsbG8sICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30sIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgiZm9vIiwgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUifSwgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsMl0pLCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLDJdLCAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IHRydWV9LCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZXJyb3Igb3V0IGlmIG5pbCBpcyBwYXNzZWQgYW5kIHNraXBfdHlwZXMgaXMgZmFsc2UiIGRvCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6Qk9PTH0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpCWVRFfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkkxNn0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6STMyfSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpJNjR9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkRPVUJMRX0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpTVFJVQ1R9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkxJU1R9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6U0VUfSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpNQVB9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1R9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVB9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2hlY2sgZWxlbWVudCB0eXBlcyBvbiBjb250YWluZXJzIiBkbwotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUeXBlczo6STMyfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLCAyXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgbmlsLCAyXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9LCA6dmFsdWUgPT4gezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCBuaWwgPT4gIm5pbCJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gbmlsLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUeXBlczo6STMyfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDJdKSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCBuaWwsIDJdKSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDIuMywgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgMl0sIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIG5pbCwgMl0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLCA6a2V5ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR319CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIG5pbCA9PiAibmlsIn0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gbmlsLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMl0pLCBmaWVsZCwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIG5pbCwgMl0pLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDIuMywgMl0pLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKworICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgZ2l2ZSB0aGUgVHlwZUVycm9yIGEgcmVhZGFibGUgbWVzc2FnZSIgZG8KLSAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGZvbyIKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsIHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCBtc2cpCi0gICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBmb28uZWxlbWVudCIKLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR319Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbM10sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsIG1zZykKKyAgICBpdCAic2hvdWxkIGdpdmUgdGhlIFRocmlmdDo6VHlwZUVycm9yIGEgcmVhZGFibGUgbWVzc2FnZSIgZG8KKyAgICAgIG1zZyA9IC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBmb28vCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQorICAgICAgbXNnID0gL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGZvby5lbGVtZW50LworICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR319CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbM10sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OkkzMiwgcmVjZWl2ZWQgTmlsQ2xhc3MgZm9yIGZpZWxkIGZvby5lbGVtZW50LmtleSIKLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpMSVNULAotICAgICAgICAgICAgICAgOmVsZW1lbnQgPT4gezp0eXBlID0+IFR5cGVzOjpNQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleSA9PiB7OnR5cGUgPT4gVHlwZXM6OkkzMn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOnZhbHVlID0+IHs6dHlwZSA9PiBUeXBlczo6STMyfX19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbe25pbCA9PiAzfV0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsIG1zZykKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsCisgICAgICAgICAgICAgICA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFt7bmlsID0+IDN9XSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6STMyLCByZWNlaXZlZCBOaWxDbGFzcyBmb3IgZmllbGQgZm9vLmVsZW1lbnQudmFsdWUiCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbezEgPT4gbmlsfV0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsIG1zZykKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIgYi9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCmluZGV4IDcwMmU5MjAuLjBjZTYzMDYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgpAQCAtMTcsMTU2ICsxNywxNzggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0VW5pb25TcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0gIGluY2x1ZGUgU3BlY05hbWVzcGFjZQorZGVzY3JpYmUgJ1VuaW9uJyBkbwogCi0gIGRlc2NyaWJlIFVuaW9uIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6VW5pb24gZG8KICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgdmFsdWUgaW4gdW5zZXQgdW5pb24iIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldwotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gbmlsCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IG5pbAorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcShuaWwpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNldCBhIGZpZWxkIGFuZCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggZ2V0X3ZhbHVlIGFuZCB0aGUgbmFtZWQgZmllbGQgYWNjZXNzb3IiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldworICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKICAgICAgIHVuaW9uLmludGVnZXIzMiA9IDI1Ci0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI1Ci0gICAgICB1bmlvbi5pbnRlZ2VyMzIuc2hvdWxkID09IDI1CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI1KQorICAgICAgZXhwZWN0KHVuaW9uLmludGVnZXIzMikudG8gZXEoMjUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdvcmsgY29ycmVjdGx5IHdoZW4gaW5zdGFudGlhdGVkIHdpdGggc3RhdGljIGZpZWxkIGNvbnN0cnVjdG9ycyIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24uaW50ZWdlcjMyKDUpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5pbnRlZ2VyMzIuc2hvdWxkID09IDUKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24uaW50ZWdlcjMyKDUpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnRlZ2VyMzIpLnRvIGVxKDUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGZvciB3cm9uZyBzZXQgZmllbGQiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldworICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKICAgICAgIHVuaW9uLmludGVnZXIzMiA9IDI1Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0IHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQogICAgIGVuZAotICAgICAKKworICAgIGl0ICJzaG91bGQgcmFpc2UgZm9yIHdyb25nIHNldCBmaWVsZCB3aGVuIGhhc2ggaW5pdGlhbGl6ZWQgYW5kIHR5cGUgY2hlY2tpbmcgaXMgb2ZmIiBkbworICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoe2luY29ycmVjdF9maWVsZDogOmluY29ycmVjdH0pCisgICAgICBleGFtcGxlID0gbGFtYmRhIHsgVGhyaWZ0OjpTZXJpYWxpemVyLm5ldy5zZXJpYWxpemUodW5pb24pIH0KKyAgICAgIGV4cGVjdChleGFtcGxlKS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzZXRfZmllbGQgaXMgbm90IHZhbGlkIGZvciB0aGlzIHVuaW9uISIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIG5vdCBiZSBlcXVhbCB0byBuaWwiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldwotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBuaWwKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShuaWwpCiAgICAgZW5kCi0gICAgIAorCisgICAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgd2l0aCBhbiBlbXB0eSBTdHJpbmciIGRvCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldworICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEoJycpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMsIGkzMiB2cy4gc3RyaW5nIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICBvdGhlcl91bmlvbiA9IE15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiYmxhaCEiKQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiYmxhaCEiKQorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IHJlc2V0IHNldGZpZWxkIGFuZCBzZXR2YWx1ZSIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKICAgICAgIHVuaW9uLnNvbWVfY2hhcmFjdGVycyA9ICJibGFoISIKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDpzb21lX2NoYXJhY3RlcnMKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gImJsYWghIgotICAgICAgbGFtYmRhIHsgdW5pb24uaW50ZWdlcjMyIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgImludGVnZXIzMiBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6c29tZV9jaGFyYWN0ZXJzKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoImJsYWghIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLmludGVnZXIzMiB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgImludGVnZXIzMiBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDQwMCkKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgNDAwKQorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMgd2l0aCBkaWZmZXJlbnQgZmllbGRzIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICBvdGhlcl91bmlvbiA9IE15X3VuaW9uLm5ldyg6b3RoZXJfaTMyLCAyNSkKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm90aGVyX2kzMiwgMjUpCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5zcGVjdCBwcm9wZXJseSIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgdW5pb24uaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgZXhwZWN0KHVuaW9uLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gaW50ZWdlcjMyOiAyNT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgYWxsb3cgc2V0dGluZyB3aXRoIGluc3RhbmNlX3ZhcmlhYmxlX3NldCIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI3KQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjcpCiAgICAgICB1bmlvbi5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBzb21lX2NoYXJhY3RlcnMsICJoYWxsbyEiKQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNwotICAgICAgbGFtYmRhIHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjcpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBjb3JyZWN0bHkiIGRvCisgICAgaXQgInNob3VsZCBzZXJpYWxpemUgdG8gYmluYXJ5IGNvcnJlY3RseSIgZG8KICAgICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgICBwcm90byA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgdW5pb24ud3JpdGUocHJvdG8pCiAKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQotICAgICAgb3RoZXJfdW5pb24uc2hvdWxkID09IHVuaW9uCisgICAgICBleHBlY3Qob3RoZXJfdW5pb24pLnRvIGVxKHVuaW9uKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzZXJpYWxpemUgdG8ganNvbiBjb3JyZWN0bHkiIGRvCisgICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgICAgcHJvdG8gPSBUaHJpZnQ6Okpzb25Qcm90b2NvbC5uZXcodHJhbnMpCisKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgdW5pb24ud3JpdGUocHJvdG8pCisKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgb3RoZXJfdW5pb24ucmVhZChwcm90bykKKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIHdoZW4gdmFsaWRhdGluZyB1bnNldCB1bmlvbiIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi52YWxpZGF0ZSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldworICAgICAgZXhwZWN0IHsgdW5pb24udmFsaWRhdGUgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCiAKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDEpCi0gICAgICBsYW1iZGEgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMSkKKyAgICAgIGV4cGVjdCB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHZhbGlkYXRlIGFuIGVudW0gZmllbGQgcHJvcGVybHkiIGRvCi0gICAgICB1bmlvbiA9IFRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDMpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6ZW51bV9maWVsZAotICAgICAgbGFtYmRhIHsgdW5pb24udmFsaWRhdGUgfS5zaG91bGQgcmFpc2VfZXJyb3IoUHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMykKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6ZW51bV9maWVsZCkKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnZhbGlkYXRlIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQogCi0gICAgICBvdGhlcl91bmlvbiA9IFRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDEpCi0gICAgICBsYW1iZGEgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoUHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMSkKKyAgICAgIGV4cGVjdCB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IHNlcmlhbGl6ZSBhbmQgbWF0Y2ggc3RydWN0cyB3aXRoIGEgdW5pb24iIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNikKLSAgICAgIHN3dSA9IFN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IHVuaW9uKQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjYpCisgICAgICBzd3UgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3Rfd2l0aF91bmlvbi5uZXcoOmZ1bl91bmlvbiA9PiB1bmlvbikKIAogICAgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogCiAgICAgICBzd3Uud3JpdGUocHJvdG8pCiAKLSAgICAgIG90aGVyX3VuaW9uID0gTXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJoZWxsbyB0aGVyZSIpCi0gICAgICBzd3UyID0gU3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gb3RoZXJfdW5pb24pCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiaGVsbG8gdGhlcmUiKQorICAgICAgc3d1MiA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IG90aGVyX3VuaW9uKQogCi0gICAgICBzd3UyLnNob3VsZF9ub3QgPT0gc3d1CisgICAgICBleHBlY3Qoc3d1Mikubm90X3RvIGVxKHN3dSkKIAogICAgICAgc3d1Mi5yZWFkKHByb3RvKQotICAgICAgc3d1Mi5zaG91bGQgPT0gc3d1CisgICAgICBleHBlY3Qoc3d1MikudG8gZXEoc3d1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9sZCBzdHlsZSBjb25zdHJ1Y3RvciIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIgPT4gMjYpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI2CisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyID0+IDI2KQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHRocm93IGFuIGVycm9yIHdoZW4gaW5zcGVjdGVkIGFuZCB1bnNldCIgZG8KLSAgICAgIGxhbWJkYXtUZXN0VW5pb24ubmV3KCkuaW5zcGVjdH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0e1NwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoKS5pbnNwZWN0fS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJpbnQgZW51bSB2YWx1ZSBuYW1lIHdoZW4gaW5zcGVjdGVkIiBkbwotICAgICAgTXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06Ok9ORSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBzb21lX2VudW06IE9ORSAoMCk+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gc29tZV9lbnVtOiBPTkUgKDApPiIpCiAKLSAgICAgIE15X3VuaW9uLm5ldyg6bXlfbWFwID0+IHtTb21lRW51bTo6T05FID0+IFtTb21lRW51bTo6VFdPXX0pLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gbXlfbWFwOiB7T05FICgwKTogW1RXTyAoMSldfT4iIAorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gbXlfbWFwOiB7T05FICgwKTogW1RXTyAoMSldfT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvZmZlciBmaWVsZD8gbWV0aG9kcyIgZG8KLSAgICAgIE15X3VuaW9uLm5ldy5zb21lX2VudW0/LnNob3VsZCBiZV9mYWxzZQotICAgICAgTXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06Ok9ORSkuc29tZV9lbnVtPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgTXlfdW5pb24ubmV3KDppbV90cnVlID0+IGZhbHNlKS5pbV90cnVlPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgTXlfdW5pb24ubmV3KDppbV90cnVlID0+IHRydWUpLmltX3RydWU/LnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3LnNvbWVfZW51bT8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLnNvbWVfZW51bT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiBmYWxzZSkuaW1fdHJ1ZT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiB0cnVlKS5pbV90cnVlPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByZXR0eSBwcmludCBiaW5hcnkgZmllbGRzIiBkbwotICAgICAgVGVzdFVuaW9uLm5ldyg6YmluYXJ5X2ZpZWxkID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbiBiaW5hcnlfZmllbGQ6IDAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6YmluYXJ5X2ZpZWxkID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbiBiaW5hcnlfZmllbGQ6IDAxMDIwMz4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwpAQCAtMTc3LDE1ICsxOTksMTUgQEAKICAgICAgICAgWzEsICAgMSwgIDEsICAwXV0KIAogICAgICAgb2JqcyA9IFsKLSAgICAgICAgVGVzdFVuaW9uLm5ldyg6c3RyaW5nX2ZpZWxkLCAiYmxhaCIpLCAKLSAgICAgICAgVGVzdFVuaW9uLm5ldyg6c3RyaW5nX2ZpZWxkLCAiYmxhaGJsYWgiKSwKLSAgICAgICAgVGVzdFVuaW9uLm5ldyg6aTMyX2ZpZWxkLCAxKSwKLSAgICAgICAgVGVzdFVuaW9uLm5ldygpXQorICAgICAgICBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDpzdHJpbmdfZmllbGQsICJibGFoIiksCisgICAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOnN0cmluZ19maWVsZCwgImJsYWhibGFoIiksCisgICAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmkzMl9maWVsZCwgMSksCisgICAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoKV0KIAogICAgICAgZm9yIHkgaW4gMC4uMwogICAgICAgICBmb3IgeCBpbiAwLi4zCiAgICAgICAgICAgIyBwdXRzICIje29ianNbeV0uaW5zcGVjdH0gPD0+ICN7b2Jqc1t4XS5pbnNwZWN0fSBzaG91bGQgPT0gI3tyZWxhdGlvbnNoaXBzW3ldW3hdfSIKLSAgICAgICAgICAob2Jqc1t5XSA8PT4gb2Jqc1t4XSkuc2hvdWxkID09IHJlbGF0aW9uc2hpcHNbeV1beF0KKyAgICAgICAgICBleHBlY3Qob2Jqc1t5XSA8PT4gb2Jqc1t4XSkudG8gZXEocmVsYXRpb25zaGlwc1t5XVt4XSkKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCmluZGV4IGRmMjM5ZDcuLjg2MjNlOTUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgpAQCAtMTcsOTIgKzE3LDEwMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0VU5JWFNvY2tldFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdVTklYU29ja2V0JyBkbwogCi0gIGRlc2NyaWJlIFVOSVhTb2NrZXQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpVTklYU29ja2V0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBhdGggPSAnL3RtcC90aHJpZnRfc3BlY19zb2NrZXQnCi0gICAgICBAc29ja2V0ID0gVU5JWFNvY2tldC5uZXcoQHBhdGgpCi0gICAgICBAaGFuZGxlID0gbW9jaygiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIDo6VU5JWFNvY2tldC5zdHViISg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlVOSVhTb2NrZXQuc3R1YiEoOm5ldykKLSAgICAgIFVOSVhTb2NrZXQubmV3KEBwYXRoLCA1KS50aW1lb3V0LnNob3VsZCA9PSA1CisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgpLnRvX3MpLnRvIGVxKCJkb21haW4oI3tAcGF0aH0pIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgVU5JWFNlcnZlclNvY2tldCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlVOSVhTZXJ2ZXJTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAcGF0aCA9ICcvdG1wL3RocmlmdF9zcGVjX3NvY2tldCcKLSAgICAgIEBzb2NrZXQgPSBVTklYU2VydmVyU29ja2V0Lm5ldyhAcGF0aCkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTZXJ2ZXJTb2NrZXQubmV3KEBwYXRoKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBoYW5kbGUgd2hlbiBjYWxsaW5nIGxpc3RlbiIgZG8KLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBUaHJpZnQ6OlVOSVhTb2NrZXQgdG8gd3JhcCBhY2NlcHRlZCBzb2NrZXRzIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIikKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIHNvY2sgPSBtb2NrKCJzb2NrIikKLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCi0gICAgICB0cmFucyA9IG1vY2soIlVOSVhTb2NrZXQiKQotICAgICAgVU5JWFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJVTklYU29ja2V0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBlcSh0cmFucykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIGhhbmRsZSB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBGaWxlLnN0dWIhKDpkZWxldGUpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZGVsZXRlIHRoZSBzb2NrZXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgRmlsZS5zaG91bGRfcmVjZWl2ZSg6ZGVsZXRlKS53aXRoKEBwYXRoKQorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChGaWxlKS50byByZWNlaXZlKDpkZWxldGUpLndpdGgoQHBhdGgpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgd2hlbiBhY2NlcHRpbmcgaWYgdGhlcmUgaXMgbm8gaGFuZGxlIiBkbwotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRydWUgZm9yIGNsb3NlZD8gd2hlbiBhcHByb3ByaWF0ZSIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCi0gICAgICBGaWxlLnN0dWIhKDpkZWxldGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBhbGxvdyhGaWxlKS50byByZWNlaXZlKDpkZWxldGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJkb21haW4oI3tAcGF0aH0pIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYyBiL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTMxOTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3RocmlmdC5nZW1zcGVjCkBAIC0wLDAgKzEsNDAgQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KKyQ6LnB1c2ggRmlsZS5leHBhbmRfcGF0aCgiLi4vbGliIiwgX19GSUxFX18pCisKK0dlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgPSAndGhyaWZ0JworICBzLnZlcnNpb24gICAgID0gJzEuMC4wJworICBzLmF1dGhvcnMgICAgID0gWydBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnXQorICBzLmVtYWlsICAgICAgID0gWydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXQorICBzLmhvbWVwYWdlICAgID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKKyAgcy5zdW1tYXJ5ICAgICA9ICVxe1J1YnkgYmluZGluZ3MgZm9yIEFwYWNoZSBUaHJpZnR9CisgIHMuZGVzY3JpcHRpb24gPSAlcXtSdWJ5IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtfQorICBzLmxpY2Vuc2UgICAgID0gJ0FwYWNoZS0yLjAnCisgIHMuZXh0ZW5zaW9ucyAgPSBbJ2V4dC9leHRjb25mLnJiJ10KKworICBzLmhhc19yZG9jICAgICAgPSB0cnVlCisgIHMucmRvY19vcHRpb25zICA9ICV3Wy0tbGluZS1udW1iZXJzIC0taW5saW5lLXNvdXJjZSAtLXRpdGxlIFRocmlmdCAtLW1haW4gUkVBRE1FXQorCisgIHMucnVieWZvcmdlX3Byb2plY3QgPSAndGhyaWZ0JworCisgIGRpciA9IEZpbGUuZXhwYW5kX3BhdGgoRmlsZS5kaXJuYW1lKF9fRklMRV9fKSkKKworICBzLmZpbGVzID0gRGlyLmdsb2IoIntsaWIsc3BlY30vKiovKiIpCisgIHMudGVzdF9maWxlcyA9IERpci5nbG9iKCJ7dGVzdCxzcGVjLGJlbmNobWFya30vKiovKiIpCisgIHMuZXhlY3V0YWJsZXMgPSAgRGlyLmdsb2IoIntiaW59LyoqLyoiKQorCisgIHMuZXh0cmFfcmRvY19maWxlcyAgPSAld1tSRUFETUUubWRdICsgRGlyLmdsb2IoIntleHQsbGlifS8qKi8qLntjLGgscmJ9IikKKworICBzLnJlcXVpcmVfcGF0aHMgPSAld1tsaWIgZXh0XQorCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ2J1bmRsZXInLCAgICAgICAgICAgICd+PiAxLjExJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdwcnknLCAgICAgICAgICAgICAgICAnfj4gMC4xMS4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdwcnktYnllYnVnJywgICAgICAgICAnfj4gMy42JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdwcnktc3RhY2tfZXhwbG9yZXInLCAnfj4gMC40LjkuMicKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFjaycsICAgICAgICAgICAgICAgJ34+IDIuMCcKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFjay10ZXN0JywgICAgICAgICAgJ34+IDAuOC4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWtlJywgICAgICAgICAgICAgICAnfj4gMTIuMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncnNwZWMnLCAgICAgICAgICAgICAgJ34+IDMuNycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAndGhpbicsICAgICAgICAgICAgICAgJ34+IDEuNycKK2VuZAorCmRpZmYgLS1naXQgYS9saWIvcnMvQ2FyZ28udG9tbCBiL2xpYi9ycy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE5IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0IgorZGVzY3JpcHRpb24gPSAiUnVzdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIKK3ZlcnNpb24gPSAiMS4wLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQoraG9tZXBhZ2UgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorZG9jdW1lbnRhdGlvbiA9ICJodHRwczovL3RocmlmdC5hcGFjaGUub3JnIgorcmVhZG1lID0gIlJFQURNRS5tZCIKK2V4Y2x1ZGUgPSBbIk1ha2VmaWxlKiIsICJ0ZXN0LyoqIiwgIiouaW1sIl0KK2tleXdvcmRzID0gWyJ0aHJpZnQiXQorCitbZGVwZW5kZW5jaWVzXQorYnl0ZW9yZGVyID0gIn4xLjIuMSIKK2ludGVnZXItZW5jb2RpbmcgPSAifjEuMC40IgorbG9nID0gIn4wLjMuOCIKK3RocmVhZHBvb2wgPSAifjEuNy4xIgordHJ5X2Zyb20gPSAifjAuMi4yIgorCmRpZmYgLS1naXQgYS9saWIvcnMvTWFrZWZpbGUuYW0gYi9saWIvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzNDEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworaWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitpbnN0YWxsOgorCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJ1RoZSBSdXN0IGNsaWVudCBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgdmlhIGEgQ2FyZ28udG9tbCBkZXBlbmRlbmN5IC0gcGxlYXNlIHNlZSAvbGliL3JzL1JFQURNRS5tZCcKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCitjaGVjay1sb2NhbDoKKwkkKENBUkdPKSB0ZXN0CisKK2FsbC1sb2NhbDoKKwkkKENBUkdPKSBidWlsZAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwlDYXJnby50b21sIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9ycy9SRUFETUUubWQgYi9saWIvcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzdhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTExIEBACisjIFJ1c3QgVGhyaWZ0IGxpYnJhcnkKKworIyMgT3ZlcnZpZXcKKworVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIHRoZSBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgd29ya2luZyBUaHJpZnQgc2VydmVyCithbmQgY2xpZW50LiBJdCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorCisgMS4gZXJyb3JzCisgMi4gcHJvdG9jb2wKKyAzLiB0cmFuc3BvcnQKKyA0LiBzZXJ2ZXIKKyA1LiBhdXRvZ2VuCisKK1RoZSBtb2R1bGVzIGFyZSBsYXllcmVkIGFzIHNob3duLiBUaGUgYGdlbmVyYXRlZGAgbGF5ZXIgaXMgY29kZSBnZW5lcmF0ZWQgYnkgdGhlCitUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbi4gSXQgdXNlcyB0aGUgY29tcG9uZW50cyBkZWZpbmVkIGluIHRoaXMgY3JhdGUgdG8KK3NlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgdHlwZXMgYW5kIGltcGxlbWVudCBSUEMuIFVzZXJzIGludGVyYWN0IHdpdGggdGhlc2UKK3R5cGVzIGFuZCBzZXJ2aWNlcyBieSB3cml0aW5nIHRoZWlyIG93biBjb2RlIG9uIHRvcC4KKworIGBgYHRleHQKKyArLS0tLS0tLS0tLS0rCisgfCAgYXBwIGRldiAgfAorICstLS0tLS0tLS0tLSsKKyB8IGdlbmVyYXRlZCB8IDwtPiBlcnJvcnMvcmVzdWx0cworICstLS0tLS0tLS0tLSsKKyB8ICBwcm90b2NvbCB8CisgKy0tLS0tLS0tLS0tKworIHwgdHJhbnNwb3J0IHwKKyArLS0tLS0tLS0tLS0rCisgYGBgCisKKyMjIFVzaW5nIHRoaXMgY3JhdGUKKworQWRkIGB0aHJpZnQgPSAieC55LnoiYCB0byB5b3VyIGBDYXJnby50b21sYCwgd2hlcmUgYHgueS56YCBpcyB0aGUgdmVyc2lvbiBvZiB0aGUKK1RocmlmdCBjb21waWxlciB5b3UncmUgdXNpbmcuCisKKyMjIEFQSSBEb2N1bWVudGF0aW9uCisKK0Z1bGwgW1J1c3Rkb2NdKGh0dHBzOi8vZG9jcy5ycy90aHJpZnQvKQorCisjIyBDb21wYXRpYmlsaXR5CisKK1RoZSBSdXN0IGxpYnJhcnkgYW5kIGF1dG8tZ2VuZXJhdGVkIGNvZGUgdGFyZ2V0cyBSdXN0IHZlcnNpb25zIDEuMjgrLgorSXQgZG9lcyBub3QgY3VycmVudGx5IHVzZSBhbnkgUnVzdCAyMDE4IGZlYXR1cmVzLgorCisjIyMgQnJlYWtpbmcgQ2hhbmdlcworCitCcmVha2luZyBjaGFuZ2VzIGFyZSBtaW5pbWl6ZWQuIFdoZW4gdGhleSBhcmUgbWFkZSB0aGV5IHdpbGwgYmUgb3V0bGluZWQgYmVsb3cgd2l0aCB0cmFuc2l0aW9uIGd1aWRlbGluZXMuCisKKyMjIyMjIFRocmlmdCAwLjEyLjAKKworKiAqKltUSFJJRlQtNDUyOV0qKiAtIFJ1c3QgZW51bSB2YXJpYW50cyBhcmUgbm93IGNhbWVsLWNhc2VkIGluc3RlYWQgb2YgdXBwZXJjYXNlZCB0byBjb25mb3JtIHRvIFJ1c3QgbmFtaW5nIGNvbnZlbnRpb25zCisKKyAgICBQcmV2aW91c2x5LCBlbnVtIHZhcmlhbnRzIHdlcmUgdXBwZXJjYXNlZCBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgY29kZS4KKyAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0aHJpZnQgZW51bToKKworICAgIGBgYHRocmlmdAorICAgIC8vIFRIUklGVAorICAgIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgIEFERCwKKyAgICAgIFNVQlRSQUNULAorICAgICAgTVVMVElQTFksCisgICAgICBESVZJREUsCisgICAgfQorICAgIGBgYAorICAgIAorICAgIHVzZWQgdG8gZ2VuZXJhdGU6CisgICAgCisgICAgYGBgcnVzdAorICAgIC8vIE9MRCBBVVRPLUdFTkVSQVRFRCBSVVNUCisgICAgcHViIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgICBBREQsCisgICAgICAgU1VCVFJBQ1QsCisgICAgICAgTVVMVElQTFksCisgICAgICAgRElWSURFLAorICAgICB9CisgICAgYGBgCisgICAgSXQgKm5vdyogZ2VuZXJhdGVzOgorICAgIGBgYHJ1c3QKKyAgICAvLyBORVcgQVVUTy1HRU5FUkFURUQgUlVTVAorICAgIHB1YiBlbnVtIE9wZXJhdGlvbiB7CisgICAgICAgQWRkLAorICAgICAgIFN1YnRyYWN0LAorICAgICAgIE11bHRpcGx5LAorICAgICAgIERpdmlkZSwKKyAgICAgfQorICAgIGBgYAorICAgIAorICAgIFlvdSB3aWxsIGhhdmUgdG8gY2hhbmdlIGFsbCBlbnVtIHZhcmlhbnRzIGluIHlvdXIgY29kZSB0byB1c2UgY2FtZWwtY2FzZWQgbmFtZXMuCisgICAgVGhpcyBzaG91bGQgYmUgYSBzZWFyY2ggYW5kIHJlcGxhY2UuCisKKyMjIENvbnRyaWJ1dGluZworCitCdWcgcmVwb3J0cyBhbmQgUFJzIGFyZSBhbHdheXMgd2VsY29tZSEgUGxlYXNlIHNlZSB0aGUKK1tUaHJpZnQgd2Vic2l0ZV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIGZvciBtb3JlIGRldGFpbHMuCisKK1RocmlmdCBSdXN0IHN1cHBvcnQgcmVxdWlyZXMgY29kZSBpbiBzZXZlcmFsIGRpcmVjdG9yaWVzOgorCisqIGBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jY2A6IGJpbmRpbmcgY29kZSBnZW5lcmF0b3IKKyogYGxpYi9yc2A6IHJ1bnRpbWUgbGlicmFyeQorKiBgbGliL3JzL3Rlc3RgOiBzdXBwbGVtZW50YWwgdGVzdHMKKyogYHR1dG9yaWFsL3JzYDogdHV0b3JpYWwgY2xpZW50IGFuZCBzZXJ2ZXIKKyogYHRlc3QvcnNgOiBjcm9zcy1sYW5ndWFnZSB0ZXN0IGNsaWVudCBhbmQgc2VydmVyCisKK0FsbCBsaWJyYXJ5IGNvZGUsIHRlc3QgY29kZSBhbmQgYXV0by1nZW5lcmF0ZWQgY29kZSBjb21waWxlcyBhbmQgcGFzc2VzIGNsaXBweQord2l0aG91dCB3YXJuaW5ncy4gQWxsIG5ldyBjb2RlIG11c3QgZG8gdGhlIHNhbWUhIFdoZW4gbWFraW5nIGNoYW5nZXMgZW5zdXJlIHRoYXQ6CisKKyogYHJ1c3RjYCBkb2VzIGRvZXMgb3V0cHV0IGFueSB3YXJuaW5ncworKiBgY2xpcHB5YCB3aXRoIGRlZmF1bHQgc2V0dGluZ3MgZG9lcyBub3Qgb3V0cHV0IGFueSB3YXJuaW5ncyAoaW5jbHVkZXMgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyogYGNhcmdvIHRlc3RgIGlzIHN1Y2Nlc3NmdWwKKyogYG1ha2UgcHJlY3Jvc3NgIGFuZCBgbWFrZSBjaGVja2AgYXJlIHN1Y2Nlc3NmdWwKKyogYHR1dG9yaWFsL2Jpbi90dXRvcmlhbF9jbGllbnRgIGFuZCBgdHV0b3JpYWwvYmluL3R1dG9yaWFsX3NlcnZlcmAgY29tbXVuaWNhdGUKZGlmZiAtLWdpdCBhL2xpYi9ycy9SRUxFQVNJTkcubWQgYi9saWIvcnMvUkVMRUFTSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2Q3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvUkVMRUFTSU5HLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgUHVibGlzaGluZyB0aGUgdGhyaWZ0IGNyYXRlCisKK1B1Ymxpc2hpbmcgdGhlIFJ1c3QgdGhyaWZ0IGNyYXRlIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgYW5kIGludm9sdmVzIHR3byBtYWpvciBzdGVwczoKKworMS4gU2V0dGluZyB1cCB5b3VyIFtjcmF0ZXMuaW9dKGh0dHBzOi8vd3d3LmNyYXRlcy5pbykgYWNjb3VudCBfKG9uZS10aW1lKV8KKworMi4gUGFja2FnaW5nL3B1Ymxpc2hpbmcgdGhlIFJ1c3QgdGhyaWZ0IGNyYXRlIGl0c2VsZgorCisjIyBTZXQgdXAgeW91ciBjcmF0ZXMuaW8gYWNjb3VudCAob25lLXRpbWUpCisKKzEuIEdvIHRvIFtjcmF0ZXMuaW9dKGh0dHBzOi8vd3d3LmNyYXRlcy5pbykgYW5kIGNsaWNrIHRoZSBgTG9nIEluYCBidXR0b24gYXQgdGhlIHRvcCByaWdodC4KKworICAgTG9nIGluICoqYXMgdGhlIEdpdGh1YiB1c2VyIHdpdGggd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRocmlmdCByZXBvISoqCisKKzIuIENsaWNrIHlvdXIgdXNlciBpY29uIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0IGFuZCBzZWxlY3QgYEFjY291bnQgU2V0dGluZ3NgLgorCiszLiBDbGljayBgTmV3IFRva2VuYCBuZXh0IHRvIGBBUEkgQWNjZXNzYC4KKworICAgVGhpcyBnZW5lcmF0ZXMgYSBuZXcgQVBJIGtleSB0aGF0IGNhcmdvIHVzZXMgdG8gcHVibGlzaCBwYWNrYWdlcyB0byBjcmF0ZXMuaW8uCisgICBTdG9yZSB0aGlzIEFQSSBrZXkgc29tZXdoZXJlIHNhZmUuIElmIHlvdSB3aWxsIG9ubHkgdXNlIHRoaXMgR2l0aHViIGFjY291bnQgdG8KKyAgIHB1Ymxpc2ggY3JhdGVzIHRvIGNyYXRlcy5pbyB5b3UgY2FuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHNhdmUgdGhlCisgICBnZW5lcmF0ZWQga2V5IHRvIGB+Ly5jYXJnby9jcmVkZW50aWFsc2AuCisKKyMjIFBhY2thZ2UgYW5kIFB1Ymxpc2gKKworWW91IGNhbiB1c2UgdGhlIGF1dG9tYXRlZCBzY3JpcHQgb3IgcnVuIHRoZSByZWxlYXNlIHN0ZXBzIG1hbnVhbGx5LgorCisqKkltcG9ydGFudCoqOiBgY2FyZ29gIGV4cGVjdHMgdGhhdCB2ZXJzaW9uIG51bWJlcnMgZm9sbG93IHRoZSBzZW1hbnRpYyB2ZXJzaW9uaW5nIGZvcm1hdC4KK1RoaXMgbWVhbnMgdGhhdCBgVEhSSUZUX1JFTEVBU0VfVkVSU0lPTmAgbXVzdCBoYXZlIGEgbWFqb3IsIG1pbm9yIGFuZCBwYXRjaCBudW1iZXIsIGkuZS4sIG11c3QKK2JlIGluIHRoZSBmb3JtIGAjLiMjLiMjYC4KKworIyMjIyBBdXRvbWF0ZWQKKworUnVuIGAuL3JlbGVhc2Uuc2ggW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dYC4KKworX1JlcXVpcmVzIHlvdSB0byBoYXZlIHN0b3JlZCB5b3VyIGNyZWRlbnRpYWxzIGluIGB+Ly5jYXJnby9jcmVkZW50aWFsc2AuXworCisjIyMjIE1hbnVhbAorCisxLiBFZGl0IGBDYXJnby50b21sYCBhbmQgdXBkYXRlIHRoZSBgdmVyc2lvbiA9IDEuMGAga2V5IHRvIGB2ZXJzaW9uID0gW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dYAorCisyLiBgZ2l0IGFkZCBDYXJnby50b21sYAorCiszLiBgZ2l0IGNvbW1pdCAtbSAiVXBkYXRlIHRocmlmdCBjcmF0ZSB2ZXJzaW9uIHRvIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXSIgLW0gIkNsaWVudDogcnMiYAorCis0LiBgY2FyZ28gbG9naW5gCisKKyAgICBfKG5vdCByZXF1aXJlZCBpZiB5b3UgaGF2ZSBzdG9yZWQgeW91ciBjcmVkZW50aWFscyBpbiBgfi8uY2FyZ28vY3JlZGVudGlhbHNgKV8KKworNS4gYGNhcmdvIGNsZWFuYAorCis2LiBgY2FyZ28gcGFja2FnZWAKKworICAgVGhpcyBzdGVwIGZhaWxzIGlmIHRoZXJlIGFyZSBhbnkgdW5jb21taXR0ZWQgb3IgaWdub3JlZCBmaWxlcy4gRG8gKipub3QqKiB1c2UgdGhlIGAtLWFsbG93LWRpcnR5YAorICAgZmxhZyEgSW5zdGVhZCwgYWRkIHRoZSBoaWdobGlnaHRlZCBmaWxlcyBhcyBlbnRyaWVzIGluIHRoZSBgQ2FyZ28udG9tbGAgYGV4Y2x1ZGVgIGtleS4KKworNy4gYGNhcmdvIHB1Ymxpc2hgCmRpZmYgLS1naXQgYS9saWIvcnMvcmVsZWFzZS5zaCBiL2xpYi9ycy9yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0ZTViNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvcmVsZWFzZS5zaApAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLW8gZXJyZXhpdAorc2V0IC1vIHBpcGVmYWlsCitzZXQgLW8gbm91bnNldAorCitpZiAhIFtbICQjIC1lcSAxICYmICQxID1+IF5bMC05XShcLlswLTldWzAtOV0qKXsyfSQgXV07IHRoZW4KKyAgICAoPiYyIGVjaG8gIlVzYWdlOiAuL3B1Ymxpc2gtY3JhdGUuc2ggW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dICIpCisgICAgKD4mMiBlY2hvICIgICAgICAgVEhSSUZUX1JFTEVBU0VfVkVSU0lPTiBpcyBpbiBzZW1hbnRpYyB2ZXJzaW9uaW5nIGZvcm1hdCwgaS5lLiAjLiMjLiMjIikKKyAgICBleGl0IDEKK2ZpCisKK1RIUklGVF9SRUxFQVNFX1ZFUlNJT049JHsxOi19CisKK2VjaG8gIlVwZGF0aW5nIENhcmdvLnRvbWwgdG8gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIKK3NlZCAtaS5vbGQgLWUgInMvXnZlcnNpb24gPSAuKiQvdmVyc2lvbiA9IFwiJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfVwiL2ciIENhcmdvLnRvbWwKK3JtIENhcmdvLnRvbWwub2xkCisKK2VjaG8gIkNvbW1pdHRpbmcgdXBkYXRlZCBDYXJnby50b21sIgorZ2l0IGFkZCBDYXJnby50b21sCitnaXQgY29tbWl0IC1tICJVcGRhdGUgdGhyaWZ0IGNyYXRlIHZlcnNpb24gdG8gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIgLW0gIkNsaWVudDogcnMiCisKK2VjaG8gIlBhY2thZ2luZyBhbmQgcmVsZWFzaW5nIHJ1c3QgdGhyaWZ0IGNyYXRlIHdpdGggdmVyc2lvbiAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059IgorY2FyZ28gY2xlYW4KK2NhcmdvIHBhY2thZ2UKK2NhcmdvIHB1Ymxpc2gKZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvYXV0b2dlbi5ycyBiL2xpYi9ycy9zcmMvYXV0b2dlbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ0MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9hdXRvZ2VuLnJzCkBAIC0wLDAgKzEsNDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFRocmlmdCBjb21waWxlciBhdXRvLWdlbmVyYXRlZCBzdXBwb3J0LgorLy8hCisvLyEKKy8vISBUeXBlcyBhbmQgZnVuY3Rpb25zIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4KKy8vISB0byBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4gVXNlcnMgc2hvdWxkIG5ldmVyIGhhdmUgdG8gdXNlIGNvZGUKKy8vISBpbiB0aGlzIG1vZHVsZSBkaXJlY3RseS4KKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisKKy8vLyBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZnVuY3Rpb25hbGl0eSBhbiBhdXRvLWdlbmVyYXRlZCBjbGllbnQgc2hvdWxkIHByb3ZpZGUKKy8vLyB0byBjb21tdW5pY2F0ZSB3aXRoIGEgVGhyaWZ0IHNlcnZlci4KK3B1YiB0cmFpdCBUVGhyaWZ0Q2xpZW50IHsKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5wdXQgcHJvdG9jb2wgdXNlZCB0byByZWFkIHNlcmlhbGl6ZWQgVGhyaWZ0IG1lc3NhZ2VzCisgICAgLy8vIGZyb20gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gaV9wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVElucHV0UHJvdG9jb2w7CisgICAgLy8vIFJldHVybnMgdGhlIG91dHB1dCBwcm90b2NvbCB1c2VkIHRvIHdyaXRlIHNlcmlhbGl6ZWQgVGhyaWZ0IG1lc3NhZ2VzCisgICAgLy8vIHRvIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIG9fcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRPdXRwdXRQcm90b2NvbDsKKyAgICAvLy8gUmV0dXJucyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IG1lc3NhZ2Ugd3JpdHRlbiB0byB0aGUgVGhyaWZ0CisgICAgLy8vIHNlcnZlci4gUmV0dXJucyBgMGAgaWYgbm8gbWVzc2FnZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uIFNlcXVlbmNlCisgICAgLy8vIG51bWJlcnMgc2hvdWxkICpuZXZlciogYmUgbmVnYXRpdmUsIGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGBpMzJgCisgICAgLy8vIHNpbXBseSBiZWNhdXNlIHRoZSBUaHJpZnQgcHJvdG9jb2wgZW5jb2RlcyBzZXF1ZW5jZSBudW1iZXJzIGFzIGBpMzJgIG9uCisgICAgLy8vIHRoZSB3aXJlLgorICAgIGZuIHNlcXVlbmNlX251bWJlcigmc2VsZikgLT4gaTMyOyAvLyBGSVhNRTogY29uc2lkZXIgcmV0dXJuaW5nIGEgdTMyCisgICAgLy8vIEluY3JlbWVudHMgdGhlIHNlcXVlbmNlIG51bWJlciwgaW5kaWNhdGluZyB0aGF0IGEgbWVzc2FnZSB3aXRoIHRoYXQKKyAgICAvLy8gbnVtYmVyIGhhcyBiZWVuIHNlbnQgdG8gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigmbXV0IHNlbGYpIC0+IGkzMjsKK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvZXJyb3JzLnJzIGIvbGliL3JzL3NyYy9lcnJvcnMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhMjU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvZXJyb3JzLnJzCkBAIC0wLDAgKzEsNjcwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OntGcm9tLCBJbnRvfTsKK3VzZSBzdGQ6OmVycm9yOjpFcnJvciBhcyBTdGRFcnJvcjsKK3VzZSBzdGQ6OmZtdDo6e0RlYnVnLCBEaXNwbGF5LCBGb3JtYXR0ZXJ9OwordXNlIHN0ZDo6e2Vycm9yLCBmbXQsIGlvLCBzdHJpbmd9OwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2UgcHJvdG9jb2w6OntURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OworCisvLyBGSVhNRTogc2hvdWxkIGFsbCBteSBlcnJvciBzdHJ1Y3RzIGltcGwgZXJyb3I6OkVycm9yIGFzIHdlbGw/CisvLyBGSVhNRTogc2hvdWxkIGFsbCBmaWVsZHMgaW4gVHJhbnNwb3J0RXJyb3IsIFByb3RvY29sRXJyb3IgYW5kIEFwcGxpY2F0aW9uRXJyb3IgYmUgb3B0aW9uYWw/CisKKy8vLyBFcnJvciB0eXBlIHJldHVybmVkIGJ5IGFsbCBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zLgorLy8vCisvLy8gYHRocmlmdDo6RXJyb3JgIGlzIHVzZWQgdGhyb3VnaG91dCB0aGlzIGNyYXRlIGFzIHdlbGwgYXMgaW4gYXV0by1nZW5lcmF0ZWQKKy8vLyBSdXN0IGNvZGUuIEl0IGNvbnNpc3RzIG9mIGZvdXIgdmFyaWFudHMgZGVmaW5lZCBieSBjb252ZW50aW9uIGFjcm9zcyBUaHJpZnQKKy8vLyBpbXBsZW1lbnRhdGlvbnM6CisvLy8KKy8vLyAxLiBgVHJhbnNwb3J0YDogZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIG9wZXJhdGluZyBvbiBJL08gY2hhbm5lbHMKKy8vLyAyLiBgUHJvdG9jb2xgOiBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJ1bnRpbWUtbGlicmFyeSBwcm9jZXNzaW5nCisvLy8gMy4gYEFwcGxpY2F0aW9uYDogZXJyb3JzIGVuY291bnRlcmVkIHdpdGhpbiBhdXRvLWdlbmVyYXRlZCBjb2RlCisvLy8gNC4gYFVzZXJgOiBJREwtZGVmaW5lZCBleGNlcHRpb24gc3RydWN0cworLy8vCisvLy8gVGhlIGBBcHBsaWNhdGlvbmAgdmFyaWFudCBhbHNvIGZ1bmN0aW9ucyBhcyBhIGNhdGNoLWFsbDogYWxsIGhhbmRsZXIgZXJyb3JzCisvLy8gYXJlIGF1dG9tYXRpY2FsbHkgdHVybmVkIGludG8gYXBwbGljYXRpb24gZXJyb3JzLgorLy8vCisvLy8gQWxsIGVycm9yIHZhcmlhbnRzIGV4Y2VwdCBgRXJyb3I6OlVzZXJgIHRha2UgYW4gZXBvbnltb3VzIHN0cnVjdCB3aXRoIHR3bworLy8vIHJlcXVpcmVkIGZpZWxkczoKKy8vLworLy8vIDEuIGBraW5kYDogdmFyaWFudC1zcGVjaWZpYyBlbnVtIGlkZW50aWZ5aW5nIHRoZSBlcnJvciBzdWItdHlwZQorLy8vIDIuIGBtZXNzYWdlYDogaHVtYW4tcmVhZGFibGUgZXJyb3IgaW5mbyBzdHJpbmcKKy8vLworLy8vIGBraW5kYCBpcyBkZWZpbmVkIGJ5IGNvbnZlbnRpb24gd2hpbGUgYG1lc3NhZ2VgIGlzIGZyZWVmb3JtLiBJZiBub25lIG9mIHRoZQorLy8vIGVudW1lcmF0ZWQga2luZHMgYXJlIHN1aXRhYmxlIHVzZSBgVW5rbm93bmAuCisvLy8KKy8vLyBUbyBzaW1wbGlmeSBlcnJvciBjcmVhdGlvbiBjb252ZW5pZW5jZSBjb25zdHJ1Y3RvcnMgYXJlIGRlZmluZWQgZm9yIGFsbAorLy8vIHZhcmlhbnRzLCBhbmQgY29udmVyc2lvbnMgZnJvbSB0aGVpciBzdHJ1Y3RzIChgdGhyaWZ0OjpUcmFuc3BvcnRFcnJvcmAsCisvLy8gYHRocmlmdDo6UHJvdG9jb2xFcnJvcmAgYW5kIGB0aHJpZnQ6OkFwcGxpY2F0aW9uRXJyb3JgIGludG8gYHRocmlmdDo6RXJyb3JgLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRyYW5zcG9ydEVycm9yYC4KKy8vLworLy8vIGBgYAorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6e1RyYW5zcG9ydEVycm9yLCBUcmFuc3BvcnRFcnJvcktpbmR9OworLy8vCisvLy8gLy8gZXhwbGljaXQKKy8vLyBsZXQgZXJyMDogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6VHJhbnNwb3J0KAorLy8vICAgICBUcmFuc3BvcnRFcnJvciB7CisvLy8gICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLworLy8vIC8vIHVzZSBjb252ZXJzaW9uCisvLy8gbGV0IGVycjE6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oCisvLy8gICAgIFRyYW5zcG9ydEVycm9yIHsKKy8vLyAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8gLy8gdXNlIHN0cnVjdCBjb25zdHJ1Y3RvcgorLy8vIGxldCBlcnIyOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpUcmFuc3BvcnQoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yOjpuZXcoCisvLy8gICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICAiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IgorLy8vICAgICApCisvLy8gICApCisvLy8gKTsKKy8vLworLy8vCisvLy8gLy8gdXNlIGVycm9yIHZhcmlhbnQgY29uc3RydWN0b3IKKy8vLyBsZXQgZXJyMzogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpuZXdfdHJhbnNwb3J0X2Vycm9yKAorLy8vICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IgorLy8vICAgKQorLy8vICk7CisvLy8gYGBgCisvLy8KKy8vLyBDcmVhdGUgYW4gZXJyb3IgZnJvbSBhIHN0cmluZy4KKy8vLworLy8vIGBgYAorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6e0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKy8vLworLy8vIC8vIHdlIGp1c3QgdXNlIGBGcm9tOjpmcm9tYCB0byBjb252ZXJ0IGEgYFN0cmluZ2AgaW50byBhIGB0aHJpZnQ6OkVycm9yYAorLy8vIGxldCBlcnIwOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKCJUaGlzIGlzIGFuIGVycm9yIikKKy8vLyApOworLy8vCisvLy8gLy8gZXJyMCBpcyBlcXVpdmFsZW50IHRvLi4uCisvLy8gbGV0IGVycjE6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKAorLy8vICAgICBBcHBsaWNhdGlvbkVycm9yIHsKKy8vLyAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJUaGlzIGlzIGFuIGVycm9yIikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8gYGBgCisvLy8KKy8vLyBSZXR1cm4gYW4gSURMLWRlZmluZWQgZXhjZXB0aW9uLgorLy8vCisvLy8gYGBgdGV4dAorLy8vIC8vIFRocmlmdCBJREwgZXhjZXB0aW9uIGRlZmluaXRpb24uCisvLy8gZXhjZXB0aW9uIFhjZXB0aW9uIHsKKy8vLyAgIDE6IGkzMiBlcnJvckNvZGUsCisvLy8gICAyOiBzdHJpbmcgbWVzc2FnZQorLy8vIH0KKy8vLyBgYGAKKy8vLworLy8vIGBgYAorLy8vIHVzZSBzdGQ6OmNvbnZlcnQ6OkZyb207CisvLy8gdXNlIHN0ZDo6ZXJyb3I6OkVycm9yOworLy8vIHVzZSBzdGQ6OmZtdDsKKy8vLyB1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OworLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vICNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KKy8vLyBwdWIgc3RydWN0IFhjZXB0aW9uIHsKKy8vLyAgIHB1YiBlcnJvcl9jb2RlOiBPcHRpb248aTMyPiwKKy8vLyAgIHB1YiBtZXNzYWdlOiBPcHRpb248U3RyaW5nPiwKKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBFcnJvciBmb3IgWGNlcHRpb24geworLy8vICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworLy8vICAgICAicmVtb3RlIHNlcnZpY2UgdGhyZXcgWGNlcHRpb24iCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRnJvbTxYY2VwdGlvbj4gZm9yIHRocmlmdDo6RXJyb3IgeworLy8vICAgZm4gZnJvbShlOiBYY2VwdGlvbikgLT4gU2VsZiB7CisvLy8gICAgIHRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoZSkpCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRGlzcGxheSBmb3IgWGNlcHRpb24geworLy8vICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworLy8vICAgICBzZWxmLmRlc2NyaXB0aW9uKCkuZm10KGYpCisvLy8gICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW4gdXNlciBjb2RlLi4uCisvLy8gbGV0IGVycjogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbShYY2VwdGlvbiB7IGVycm9yX2NvZGU6IFNvbWUoMSksIG1lc3NhZ2U6IE5vbmUgfSkKKy8vLyApOworLy8vIGBgYAorcHViIGVudW0gRXJyb3IgeworICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgb3BlcmF0aW5nIG9uIEkvTyBjaGFubmVscy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqY29ubmVjdGlvbiBjbG9zZWQqIGFuZCAqYmluZCBmYWlsdXJlKi4KKyAgICBUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IpLAorICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJ1bnRpbWUtbGlicmFyeSBwcm9jZXNzaW5nLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICptZXNzYWdlIHRvbyBsYXJnZSogYW5kICp1bnN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uKi4KKyAgICBQcm90b2NvbChQcm90b2NvbEVycm9yKSwKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIHdpdGhpbiBhdXRvLWdlbmVyYXRlZCBjb2RlLCBvciB3aGVuIGluY29taW5nCisgICAgLy8vIG9yIG91dGdvaW5nIG1lc3NhZ2VzIHZpb2xhdGUgdGhlIFRocmlmdCBzcGVjLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICpvdXQtb2Ytb3JkZXIgbWVzc2FnZXMqIGFuZCAqbWlzc2luZyByZXF1aXJlZCBzdHJ1Y3QKKyAgICAvLy8gZmllbGRzKi4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyB2YXJpYW50IGFsc28gZnVuY3Rpb25zIGFzIGEgY2F0Y2gtYWxsOiBlcnJvcnMgZnJvbSBoYW5kbGVyCisgICAgLy8vIGZ1bmN0aW9ucyBhcmUgYXV0b21hdGljYWxseSByZXR1cm5lZCBhcyBhbiBgQXBwbGljYXRpb25FcnJvcmAuCisgICAgQXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciksCisgICAgLy8vIElETC1kZWZpbmVkIGV4Y2VwdGlvbiBzdHJ1Y3RzLgorICAgIFVzZXIoQm94PGVycm9yOjpFcnJvciArIFN5bmMgKyBTZW5kPiksCit9CisKK2ltcGwgRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGZyb20gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgICAgLy8vCisgICAgLy8vIEFwcGxpY2F0aW9uIGNvZGUgKipzaG91bGQgbmV2ZXIqKiBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgIHB1YiBmbiByZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woCisgICAgICAgIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDxBcHBsaWNhdGlvbkVycm9yPiB7CisgICAgICAgIGxldCBtdXQgbWVzc2FnZSA9ICJnZW5lcmFsIHJlbW90ZSBlcnJvciIudG9fb3duZWQoKTsKKyAgICAgICAgbGV0IG11dCBraW5kID0gQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd247CisKKyAgICAgICAgaS5yZWFkX3N0cnVjdF9iZWdpbigpPzsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCBmaWVsZF9pZGVudCA9IGkucmVhZF9maWVsZF9iZWdpbigpPzsKKworICAgICAgICAgICAgaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBpZCA9IGZpZWxkX2lkZW50CisgICAgICAgICAgICAgICAgLmlkCisgICAgICAgICAgICAgICAgLmV4cGVjdCgic2VuZGVyIHNob3VsZCBhbHdheXMgc3BlY2lmeSBpZCBmb3Igbm9uLVNUT1AgZmllbGQiKTsKKworICAgICAgICAgICAgbWF0Y2ggaWQgeworICAgICAgICAgICAgICAgIDEgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX21lc3NhZ2UgPSBpLnJlYWRfc3RyaW5nKCk/OworICAgICAgICAgICAgICAgICAgICBpLnJlYWRfZmllbGRfZW5kKCk/OworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gcmVtb3RlX21lc3NhZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDIgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX3R5cGVfYXNfaW50ID0gaS5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV9raW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCA9IFRyeUZyb206OnRyeV9mcm9tKHJlbW90ZV90eXBlX2FzX2ludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bndyYXBfb3IoQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24pOworICAgICAgICAgICAgICAgICAgICBpLnJlYWRfZmllbGRfZW5kKCk/OworICAgICAgICAgICAgICAgICAgICBraW5kID0gcmVtb3RlX2tpbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgICAgICBpLnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkucmVhZF9zdHJ1Y3RfZW5kKCk/OworCisgICAgICAgIE9rKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCisgICAgICAgIH0pCisgICAgfQorCisgICAgLy8vIENvbnZlcnQgYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGludG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24gYW5kIHdyaXRlCisgICAgLy8vIGl0IHRvIHRoZSByZW1vdGUuCisgICAgLy8vCisgICAgLy8vIEFwcGxpY2F0aW9uIGNvZGUgKipzaG91bGQgbmV2ZXIqKiBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgIHB1YiBmbiB3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woCisgICAgICAgIGU6ICZBcHBsaWNhdGlvbkVycm9yLAorICAgICAgICBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG8ud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIi50b19vd25lZCgpLAorICAgICAgICB9KT87CisKKyAgICAgICAgbGV0IG1lc3NhZ2VfZmllbGQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoIm1lc3NhZ2UiLCBUVHlwZTo6U3RyaW5nLCAxKTsKKyAgICAgICAgbGV0IHR5cGVfZmllbGQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoInR5cGUiLCBUVHlwZTo6STMyLCAyKTsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX2JlZ2luKCZtZXNzYWdlX2ZpZWxkKT87CisgICAgICAgIG8ud3JpdGVfc3RyaW5nKCZlLm1lc3NhZ2UpPzsKKyAgICAgICAgby53cml0ZV9maWVsZF9lbmQoKT87CisKKyAgICAgICAgby53cml0ZV9maWVsZF9iZWdpbigmdHlwZV9maWVsZCk/OworICAgICAgICBvLndyaXRlX2kzMihlLmtpbmQgYXMgaTMyKT87CisgICAgICAgIG8ud3JpdGVfZmllbGRfZW5kKCk/OworCisgICAgICAgIG8ud3JpdGVfZmllbGRfc3RvcCgpPzsKKyAgICAgICAgby53cml0ZV9zdHJ1Y3RfZW5kKCk/OworCisgICAgICAgIG8uZmx1c2goKQorICAgIH0KK30KKworaW1wbCBlcnJvcjo6RXJyb3IgZm9yIEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IFRyYW5zcG9ydEVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gUHJvdG9jb2xFcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IEFwcGxpY2F0aW9uRXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IGUuZGVzY3JpcHRpb24oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEZWJ1ZyBmb3IgRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpQcm90b2NvbChyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208U3RyaW5nPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oczogU3RyaW5nKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBzLAorICAgICAgICB9KQorICAgIH0KK30KKworaW1wbDwnYT4gRnJvbTwmJ2Egc3RyPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oczogJidhIHN0cikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nOjpmcm9tKHMpLAorICAgICAgICB9KQorICAgIH0KK30KKworaW1wbCBGcm9tPFRyYW5zcG9ydEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogVHJhbnNwb3J0RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KGUpCisgICAgfQorfQorCitpbXBsIEZyb208UHJvdG9jb2xFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IFByb3RvY29sRXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6UHJvdG9jb2woZSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxBcHBsaWNhdGlvbkVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogQXBwbGljYXRpb25FcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihlKQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhCisvLy8gYFRyYW5zcG9ydEVycm9yYC4KK3B1YiBmbiBuZXdfdHJhbnNwb3J0X2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgSS9PIGVycm9ycy4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVHJhbnNwb3J0RXJyb3IgeworICAgIC8vLyBJL08gZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgVHJhbnNwb3J0RXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIFRyYW5zcG9ydEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBUcmFuc3BvcnRFcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gVHJhbnNwb3J0RXJyb3IgeworICAgICAgICBUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJL08gZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIEVxLCBEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRyYW5zcG9ydEVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBJL08gZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIEFuIEkvTyBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCB3aGVuIHRoZSB0cmFuc3BvcnQgY2hhbm5lbCB3YXMgbm90IG9wZW4uCisgICAgTm90T3BlbiA9IDEsCisgICAgLy8vIFRoZSB0cmFuc3BvcnQgY2hhbm5lbCBjYW5ub3QgYmUgb3BlbmVkIGJlY2F1c2UgaXQgd2FzIG9wZW5lZCBwcmV2aW91c2x5LgorICAgIEFscmVhZHlPcGVuID0gMiwKKyAgICAvLy8gQW4gSS9PIG9wZXJhdGlvbiB0aW1lZCBvdXQuCisgICAgVGltZWRPdXQgPSAzLAorICAgIC8vLyBBIHJlYWQgY291bGQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugbm8gYnl0ZXMgd2VyZSBhdmFpbGFibGUuCisgICAgRW5kT2ZGaWxlID0gNCwKKyAgICAvLy8gQW4gaW52YWxpZCAoYnVmZmVyL21lc3NhZ2UpIHNpemUgd2FzIHJlcXVlc3RlZCBvciByZWNlaXZlZC4KKyAgICBOZWdhdGl2ZVNpemUgPSA1LAorICAgIC8vLyBUb28gbGFyZ2UgYSBidWZmZXIgb3IgbWVzc2FnZSBzaXplIHdhcyByZXF1ZXN0ZWQgb3IgcmVjZWl2ZWQuCisgICAgU2l6ZUxpbWl0ID0gNiwKK30KKworaW1wbCBUcmFuc3BvcnRFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duID0+ICJ0cmFuc3BvcnQgZXJyb3IiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuID0+ICJub3Qgb3BlbiIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuID0+ICJhbHJlYWR5IG9wZW4iLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCA9PiAidGltZWQgb3V0IiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlID0+ICJlbmQgb2YgZmlsZSIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSA9PiAibmVnYXRpdmUgc2l6ZSBtZXNzYWdlIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6U2l6ZUxpbWl0ID0+ICJtZXNzYWdlIHRvbyBsb25nIiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBUcmFuc3BvcnRFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIFRyYW5zcG9ydEVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiksCisgICAgICAgICAgICAyID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4pLAorICAgICAgICAgICAgMyA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0KSwKKyAgICAgICAgICAgIDQgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUpLAorICAgICAgICAgICAgNSA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSksCisgICAgICAgICAgICA2ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6U2l6ZUxpbWl0KSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUcmFuc3BvcnRFcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPGlvOjpFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGVycjogaW86OkVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggZXJyLmtpbmQoKSB7CisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpDb25uZWN0aW9uUmVzZXQKKyAgICAgICAgICAgIHwgaW86OkVycm9yS2luZDo6Q29ubmVjdGlvblJlZnVzZWQKKyAgICAgICAgICAgIHwgaW86OkVycm9yS2luZDo6Tm90Q29ubmVjdGVkID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpBbHJlYWR5RXhpc3RzID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6VGltZWRPdXQgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpVbmV4cGVjdGVkRW9mID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksIC8vIEZJWE1FOiB1c2UgaW8gZXJyb3IncyBkZWJ1ZyBzdHJpbmcKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208c3RyaW5nOjpGcm9tVXRmOEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZXJyOiBzdHJpbmc6OkZyb21VdGY4RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLCAvLyBGSVhNRTogdXNlIGZtdDo6RXJyb3IncyBkZWJ1ZyBzdHJpbmcKKyAgICAgICAgfSkKKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBQcm90b2NvbGAgdGhhdCB3cmFwcyBhCisvLy8gYFByb3RvY29sRXJyb3JgLgorcHViIGZuIG5ld19wcm90b2NvbF9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IGVycm9ycyB0aGF0IG9jY3VyIGluIHRoZSBydW50aW1lIGxpYnJhcnkuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFByb3RvY29sRXJyb3IgeworICAgIC8vLyBQcm90b2NvbCBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBQcm90b2NvbEVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgUHJvdG9jb2xFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgUHJvdG9jb2xFcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBQcm90b2NvbEVycm9yIHsKKyAgICAgICAgUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBSdW50aW1lIGxpYnJhcnkgZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIEVxLCBEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFByb3RvY29sRXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIHJ1bnRpbWUtbGlicmFyeSBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgc3VwcGxpZWQgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uLCBvciBpbnZhbGlkIGRhdGEKKyAgICAvLy8gd2FzIHJlY2VpdmVkIGZyb20gYSBUaHJpZnQgZW5kcG9pbnQuCisgICAgSW52YWxpZERhdGEgPSAxLAorICAgIC8vLyBBbiBpbnZhbGlkIHNpemUgd2FzIHJlY2VpdmVkIGluIGFuIGVuY29kZWQgZmllbGQuCisgICAgTmVnYXRpdmVTaXplID0gMiwKKyAgICAvLy8gVGhyaWZ0IG1lc3NhZ2Ugb3IgZmllbGQgd2FzIHRvbyBsb25nLgorICAgIFNpemVMaW1pdCA9IDMsCisgICAgLy8vIFVuc3VwcG9ydGVkIG9yIHVua25vd24gVGhyaWZ0IHByb3RvY29sIHZlcnNpb24uCisgICAgQmFkVmVyc2lvbiA9IDQsCisgICAgLy8vIFVuc3VwcG9ydGVkIFRocmlmdCBwcm90b2NvbCwgc2VydmVyIG9yIGZpZWxkIHR5cGUuCisgICAgTm90SW1wbGVtZW50ZWQgPSA1LAorICAgIC8vLyBSZWFjaGVkIHRoZSBtYXhpbXVtIG5lc3RlZCBkZXB0aCB0byB3aGljaCBhbiBlbmNvZGVkIFRocmlmdCBmaWVsZCBjb3VsZAorICAgIC8vLyBiZSBza2lwcGVkLgorICAgIERlcHRoTGltaXQgPSA2LAorfQorCitpbXBsIFByb3RvY29sRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duID0+ICJwcm90b2NvbCBlcnJvciIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEgPT4gImJhZCBkYXRhIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUgPT4gIm5lZ2F0aXZlIG1lc3NhZ2Ugc2l6ZSIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6U2l6ZUxpbWl0ID0+ICJtZXNzYWdlIHRvbyBsb25nIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uID0+ICJpbnZhbGlkIHRocmlmdCB2ZXJzaW9uIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpOb3RJbXBsZW1lbnRlZCA9PiAibm90IGltcGxlbWVudGVkIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0ID0+ICJtYXhpbXVtIHNraXAgZGVwdGggcmVhY2hlZCIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgUHJvdG9jb2xFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIFByb3RvY29sRXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEpLAorICAgICAgICAgICAgMiA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6TmVnYXRpdmVTaXplKSwKKyAgICAgICAgICAgIDMgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OlNpemVMaW1pdCksCisgICAgICAgICAgICA0ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uKSwKKyAgICAgICAgICAgIDUgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6Ok5vdEltcGxlbWVudGVkKSwKKyAgICAgICAgICAgIDYgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFByb3RvY29sRXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBBcHBsaWNhdGlvbmAgdGhhdCB3cmFwcyBhbgorLy8vIGBBcHBsaWNhdGlvbkVycm9yYC4KK3B1YiBmbiBuZXdfYXBwbGljYXRpb25fZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBvciBpbiB1c2VyLWltcGxlbWVudGVkCisvLy8gc2VydmljZSBoYW5kbGVycy4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgQXBwbGljYXRpb25FcnJvciB7CisgICAgLy8vIEFwcGxpY2F0aW9uIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYEFwcGxpY2F0aW9uRXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBBcHBsaWNhdGlvbkVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEF1dG8tZ2VuZXJhdGVkIG9yIHVzZXItaW1wbGVtZW50ZWQgY29kZSBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gQXBwbGljYXRpb25FcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgYXBwbGljYXRpb24gZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIE1hZGUgc2VydmljZSBjYWxsIHRvIGFuIHVua25vd24gc2VydmljZSBtZXRob2QuCisgICAgVW5rbm93bk1ldGhvZCA9IDEsCisgICAgLy8vIFJlY2VpdmVkIGFuIHVua25vd24gVGhyaWZ0IG1lc3NhZ2UgdHlwZS4gVGhhdCBpcywgbm90IG9uZSBvZiB0aGUKKyAgICAvLy8gYHRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZWAgdmFyaWFudHMuCisgICAgSW52YWxpZE1lc3NhZ2VUeXBlID0gMiwKKyAgICAvLy8gTWV0aG9kIG5hbWUgaW4gYSBzZXJ2aWNlIHJlcGx5IGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lIG9mIHRoZQorICAgIC8vLyByZWNlaXZpbmcgc2VydmljZSBtZXRob2QuCisgICAgV3JvbmdNZXRob2ROYW1lID0gMywKKyAgICAvLy8gUmVjZWl2ZWQgYW4gb3V0LW9mLW9yZGVyIFRocmlmdCBtZXNzYWdlLgorICAgIEJhZFNlcXVlbmNlSWQgPSA0LAorICAgIC8vLyBTZXJ2aWNlIHJlcGx5IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICAgIE1pc3NpbmdSZXN1bHQgPSA1LAorICAgIC8vLyBBdXRvLWdlbmVyYXRlZCBjb2RlIGZhaWxlZCB1bmV4cGVjdGVkbHkuCisgICAgSW50ZXJuYWxFcnJvciA9IDYsCisgICAgLy8vIFRocmlmdCBwcm90b2NvbCBlcnJvci4gV2hlbiBwb3NzaWJsZSB1c2UgYEVycm9yOjpQcm90b2NvbEVycm9yYCB3aXRoIGEKKyAgICAvLy8gc3BlY2lmaWMgYFByb3RvY29sRXJyb3JLaW5kYCBpbnN0ZWFkLgorICAgIFByb3RvY29sRXJyb3IgPSA3LAorICAgIC8vLyAqVW5rbm93biouIEluY2x1ZGVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBUaHJpZnQgaW1wbGVtZW50YXRpb25zLgorICAgIEludmFsaWRUcmFuc2Zvcm0gPSA4LCAvLyA/PworICAgIC8vLyBUaHJpZnQgZW5kcG9pbnQgcmVxdWVzdGVkLCBvciBpcyB1c2luZywgYW4gdW5zdXBwb3J0ZWQgZW5jb2RpbmcuCisgICAgSW52YWxpZFByb3RvY29sID0gOSwgLy8gPz8KKyAgICAvLy8gVGhyaWZ0IGVuZHBvaW50IHJlcXVlc3RlZCwgb3IgaXMgdXNpbmcsIGFuIHVuc3VwcG9ydGVkIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCB0eXBlLgorICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IDEwLCAvLyA/PworfQorCitpbXBsIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duID0+ICJzZXJ2aWNlIGVycm9yIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kID0+ICJ1bmtub3duIHNlcnZpY2UgbWV0aG9kIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUgPT4gIndyb25nIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lID0+ICJ1bmtub3duIG1ldGhvZCByZXBseSByZWNlaXZlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCA9PiAib3V0IG9mIG9yZGVyIHNlcXVlbmNlIGlkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0ID0+ICJtaXNzaW5nIG1ldGhvZCByZXN1bHQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludGVybmFsRXJyb3IgPT4gInJlbW90ZSBzZXJ2aWNlIHRocmV3IGV4Y2VwdGlvbiIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6UHJvdG9jb2xFcnJvciA9PiAicHJvdG9jb2wgZXJyb3IiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRUcmFuc2Zvcm0gPT4gImludmFsaWQgdHJhbnNmb3JtIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkUHJvdG9jb2wgPT4gImludmFsaWQgcHJvdG9jb2wgcmVxdWVzdGVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbnN1cHBvcnRlZENsaWVudFR5cGUgPT4gInVuc3VwcG9ydGVkIHByb3RvY29sIGNsaWVudCIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgQXBwbGljYXRpb25FcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoZiwgInt9Iiwgc2VsZi5kZXNjcmlwdGlvbigpKQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIEFwcGxpY2F0aW9uRXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCksCisgICAgICAgICAgICAyID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUpLAorICAgICAgICAgICAgMyA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lKSwKKyAgICAgICAgICAgIDQgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQpLAorICAgICAgICAgICAgNSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCksCisgICAgICAgICAgICA2ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnRlcm5hbEVycm9yKSwKKyAgICAgICAgICAgIDcgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlByb3RvY29sRXJyb3IpLAorICAgICAgICAgICAgOCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFRyYW5zZm9ybSksCisgICAgICAgICAgICA5ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkUHJvdG9jb2wpLAorICAgICAgICAgICAgMTAgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVuc3VwcG9ydGVkQ2xpZW50VHlwZSksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gQXBwbGljYXRpb25FcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvbGliLnJzIGIvbGliL3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1YzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsODcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFJ1c3QgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLgorLy8hCisvLyEgVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIHRoZSBjb21wb25lbnRzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgd29ya2luZworLy8hIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudC4gSXQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKy8vIQorLy8hIDEuIGVycm9ycworLy8hIDIuIHByb3RvY29sCisvLyEgMy4gdHJhbnNwb3J0CisvLyEgNC4gc2VydmVyCisvLyEgNS4gYXV0b2dlbgorLy8hCisvLyEgVGhlIG1vZHVsZXMgYXJlIGxheWVyZWQgYXMgc2hvd24gaW4gdGhlIGRpYWdyYW0gYmVsb3cuIFRoZSBgYXV0b2dlbidkYAorLy8hIGxheWVyIGlzIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4uIEl0IHVzZXMgdGhlCisvLyEgdHlwZXMgYW5kIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgY3JhdGUgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorLy8hIG1lc3NhZ2VzIGFuZCBpbXBsZW1lbnQgUlBDLiBVc2VycyBpbnRlcmFjdCB3aXRoIHRoZXNlIHR5cGVzIGFuZCBzZXJ2aWNlcworLy8hIGJ5IHdyaXRpbmcgdGhlaXIgb3duIGNvZGUgdGhhdCB1c2VzIHRoZSBhdXRvLWdlbmVyYXRlZCBjbGllbnRzIGFuZAorLy8hIHNlcnZlcnMuCisvLyEKKy8vISBgYGB0ZXh0CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgdXNlciBhcHAgIHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCBhdXRvZ2VuJ2QgfCAodXNlcyBlcnJvcnMsIGF1dG9nZW4pCisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgIHByb3RvY29sIHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCB0cmFuc3BvcnQgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISBgYGAKKworIyFbY3JhdGVfdHlwZSA9ICJsaWIiXQorIyFbZG9jKHRlc3QoYXR0cihhbGxvdyh1bnVzZWRfdmFyaWFibGVzKSwgZGVueSh3YXJuaW5ncykpKSldCisKK2V4dGVybiBjcmF0ZSBieXRlb3JkZXI7CitleHRlcm4gY3JhdGUgaW50ZWdlcl9lbmNvZGluZzsKK2V4dGVybiBjcmF0ZSB0aHJlYWRwb29sOworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CisKKy8vIE5PVEU6IHRoaXMgbWFjcm8gaGFzIHRvIGJlIGRlZmluZWQgYmVmb3JlIGFueSBtb2R1bGVzLiBTZWU6CisvLyBodHRwczovL2RhbmllbGtlZXAuZ2l0aHViLmlvL3F1aWNrLWludHJvLXRvLW1hY3Jvcy5odG1sI3NvbWUtbW9yZS1nb3RjaGFzCisKKy8vLyBBc3NlcnQgdGhhdCBhbiBleHByZXNzaW9uIHJldHVybmluZyBhIGBSZXN1bHRgIGlzIGEgc3VjY2Vzcy4gSWYgaXQgaXMsCisvLy8gcmV0dXJuIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIHJlc3VsdCwgaS5lLiBgZXhwci51bndyYXAoKWAuCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfc3VjY2VzcyB7CisgICAgKCRlOiBleHByKSA9PiB7eworICAgICAgICBsZXQgcmVzID0gJGU7CisgICAgICAgIGFzc2VydCEocmVzLmlzX29rKCkpOworICAgICAgICByZXMudW53cmFwKCkKKyAgICB9fTsKK30KKworcHViIG1vZCBwcm90b2NvbDsKK3B1YiBtb2Qgc2VydmVyOworcHViIG1vZCB0cmFuc3BvcnQ7CisKK21vZCBlcnJvcnM7CitwdWIgdXNlIGVycm9yczo6KjsKKworbW9kIGF1dG9nZW47CitwdWIgdXNlIGF1dG9nZW46Oio7CisKKy8vLyBSZXN1bHQgdHlwZSByZXR1cm5lZCBieSBhbGwgcnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucy4KKy8vLworLy8vIEFzIGlzIGNvbnZlbnRpb24gdGhpcyBpcyBhIHR5cGVkZWYgb2YgYHN0ZDo6cmVzdWx0OjpSZXN1bHRgCisvLy8gd2l0aCBgRWAgZGVmaW5lZCBhcyB0aGUgYHRocmlmdDo6RXJyb3JgIHR5cGUuCitwdWIgdHlwZSBSZXN1bHQ8VD4gPSBzdGQ6OnJlc3VsdDo6UmVzdWx0PFQsIHNlbGY6OkVycm9yPjsKZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZmYzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzCkBAIC0wLDAgKzEsOTU3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIEJ5dGVPcmRlciwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsCisgICAgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCit9OwordXNlIHN1cGVyOjp7VE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB7UHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmR9OworCitjb25zdCBCSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xOiB1MzIgPSAweDgwMDEwMDAwOworCisvLy8gUmVhZCBtZXNzYWdlcyBlbmNvZGVkIGluIHRoZSBUaHJpZnQgc2ltcGxlIGJpbmFyeSBlbmNvZGluZy4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIG1vZGVzOiBgc3RyaWN0YCBhbmQgYG5vbi1zdHJpY3RgLCB3aGVyZSB0aGUKKy8vLyBgbm9uLXN0cmljdGAgdmVyc2lvbiBkb2VzIG5vdCBjaGVjayBmb3IgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlCisvLy8gcmVjZWl2ZWQgbWVzc2FnZSBoZWFkZXIuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIGxldCByZWN2ZF9ib29sID0gcHJvdG9jb2wucmVhZF9ib29sKCkudW53cmFwKCk7CisvLy8gbGV0IHJlY3ZkX3N0cmluZyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIHN0cmljdDogYm9vbCwKKyAgICBwdWIgdHJhbnNwb3J0OiBULCAvLyBGSVhNRTogc2hvdWxkbid0IGJlIHB1YmxpYworfQorCitpbXBsPCdhLCBUPiBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgLy8vCisgICAgLy8vIFNldCBgc3RyaWN0YCB0byBgdHJ1ZWAgaWYgYWxsIGluY29taW5nIG1lc3NhZ2VzIGNvbnRhaW4gdGhlIHByb3RvY29sCisgICAgLy8vIHZlcnNpb24gbnVtYmVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQsIHN0cmljdDogYm9vbCkgLT4gVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzdHJpY3Q6IHN0cmljdCwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sIGZvciBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3coY29sbGFwc2libGVfaWYpKV0KKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IG11dCBmaXJzdF9ieXRlcyA9IHZlYyFbMDsgNF07CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZXhhY3QoJm11dCBmaXJzdF9ieXRlc1suLl0pPzsKKworICAgICAgICAvLyB0aGUgdGhyaWZ0IHZlcnNpb24gaGVhZGVyIGlzIGludGVudGlvbmFsbHkgbmVnYXRpdmUKKyAgICAgICAgLy8gc28gdGhlIGZpcnN0IGNoZWNrIHdlJ2xsIGRvIGlzIHNlZSBpZiB0aGUgc2lnbiBiaXQgaXMgc2V0CisgICAgICAgIC8vIGFuZCBpZiBzbyAtIGFzc3VtZSBpdCdzIHRoZSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlcgorICAgICAgICBpZiBmaXJzdF9ieXRlc1swXSA+PSA4IHsKKyAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgd2UgZ290IGEgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIgLSBjaGVjaworICAgICAgICAgICAgLy8gaXQsIGFuZCBpZiBpdCBtYXRjaGVzLCByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKyAgICAgICAgICAgIGlmIGZpcnN0X2J5dGVzWzAuLjJdICE9IFsweDgwLCAweDAxXSB7CisgICAgICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgicmVjZWl2ZWQgYmFkIHZlcnNpb246IHs6P30iLCAmZmlyc3RfYnl0ZXNbMC4uMl0pLAorICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBUcnlGcm9tOjp0cnlfZnJvbShmaXJzdF9ieXRlc1szXSk/OworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gc2VsZi5yZWFkX3N0cmluZygpPzsKKyAgICAgICAgICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhcHBhcmVudGx5IHdlIGRpZG4ndCBnZXQgYSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciwKKyAgICAgICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgaWYgdGhlIHNlbmRlciBpcyBub3QgdXNpbmcgdGhlIHN0cmljdCBwcm90b2NvbAorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3QgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGluIHN0cmljdCBtb2RlIGhvd2V2ZXIsIGFuZCB0aGF0IGFsd2F5cworICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIHRoZSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciB0byBiZSB3cml0dGVuIGZpcnN0CisgICAgICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgicmVjZWl2ZWQgYmFkIHZlcnNpb246IHs6P30iLCAmZmlyc3RfYnl0ZXNbMC4uMl0pLAorICAgICAgICAgICAgICAgIH0pKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbm9uLXN0cmljdCB2ZXJzaW9uIHRoZSBmaXJzdCBtZXNzYWdlIGZpZWxkCisgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG1lc3NhZ2UgbmFtZS4gc3RyaW5ncyAoYnl0ZSBhcnJheXMpIGFyZSBsZW5ndGgtcHJlZml4ZWQsCisgICAgICAgICAgICAgICAgLy8gc28gd2UndmUganVzdCByZWFkIHRoZSBsZW5ndGggaW4gdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICBsZXQgbmFtZV9zaXplID0gQmlnRW5kaWFuOjpyZWFkX2kzMigmZmlyc3RfYnl0ZXMpIGFzIHVzaXplOworICAgICAgICAgICAgICAgIGxldCBtdXQgbmFtZV9idWY6IFZlYzx1OD4gPSB2ZWMhWzA7IG5hbWVfc2l6ZV07CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9leGFjdCgmbXV0IG5hbWVfYnVmKT87CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmc6OmZyb21fdXRmOChuYW1lX2J1Zik/OworCisgICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihUcnlGcm9tOjp0cnlfZnJvbSk/OworICAgICAgICAgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KG5hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgT2soTm9uZSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICBsZXQgZmllbGRfdHlwZV9ieXRlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBmaWVsZF90eXBlID0gZmllbGRfdHlwZV9mcm9tX3U4KGZpZWxkX3R5cGVfYnl0ZSk/OworICAgICAgICBsZXQgaWQgPSBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IE9rKDApLAorICAgICAgICAgICAgXyA9PiBzZWxmLnJlYWRfaTE2KCksCisgICAgICAgIH0/OworICAgICAgICBPayhURmllbGRJZGVudGlmaWVyOjpuZXc6OjxPcHRpb248U3RyaW5nPiwgU3RyaW5nLCBpMTY+KAorICAgICAgICAgICAgTm9uZSwgZmllbGRfdHlwZSwgaWQsCisgICAgICAgICkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBsZXQgbnVtX2J5dGVzID0gc2VsZi50cmFuc3BvcnQucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCk/IGFzIHVzaXplOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyBudW1fYnl0ZXNdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwKHxffCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbGV0IGIgPSBzZWxmLnJlYWRfaTgoKT87CisgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgMCA9PiBPayhmYWxzZSksCisgICAgICAgICAgICBfID0+IE9rKHRydWUpLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTgoKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pMTY6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2k2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9mNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGxldCBieXRlcyA9IHNlbGYucmVhZF9ieXRlcygpPzsKKyAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoYnl0ZXMpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRMaXN0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRTZXRJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBrZXlfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgdmFsdWVfdHlwZTogVFR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKGZpZWxkX3R5cGVfZnJvbV91OCk/OworICAgICAgICBsZXQgc2l6ZSA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoa2V5X3R5cGUsIHZhbHVlX3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF91OCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCaW5hcnlJbnB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0LCB0cnVlKSkKKyAgICB9Cit9CisKKy8vLyBXcml0ZSBtZXNzYWdlcyB1c2luZyB0aGUgVGhyaWZ0IHNpbXBsZSBiaW5hcnkgZW5jb2RpbmcuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBtb2RlczogYHN0cmljdGAgYW5kIGBub24tc3RyaWN0YCwgd2hlcmUgdGhlCisvLy8gYHN0cmljdGAgdmVyc2lvbiB3cml0ZXMgdGhlIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlCisvLy8gaGVhZGVyIGFuZCB0aGUgYG5vbi1zdHJpY3RgIHZlcnNpb24gZG9lcyBub3QuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9ib29sKHRydWUpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygidGVzdF9zdHJpbmciKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBzdHJpY3Q6IGJvb2wsCisgICAgcHViIHRyYW5zcG9ydDogVCwgLy8gRklYTUU6IGRvIG5vdCBtYWtlIHB1YmxpYzsgb25seSBwdWJsaWMgZm9yIHRlc3RpbmchCit9CisKK2ltcGw8VD4gVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgLy8vCisgICAgLy8vIFNldCBgc3RyaWN0YCB0byBgdHJ1ZWAgaWYgYWxsIG91dGdvaW5nIG1lc3NhZ2VzIHNob3VsZCBjb250YWluIHRoZQorICAgIC8vLyBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBULCBzdHJpY3Q6IGJvb2wpIC0+IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzdHJpY3Q6IHN0cmljdCwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbCBmb3IgVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc2VsZi5zdHJpY3QgeworICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogdTggPSBpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZS5pbnRvKCk7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSB8IChtZXNzYWdlX3R5cGUgYXMgdTMyKTsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3UzMjo6PEJpZ0VuZGlhbj4oaGVhZGVyKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZS5pbnRvKCkpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBfOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBpZGVudGlmaWVyLmlkLmlzX25vbmUoKSAmJiBpZGVudGlmaWVyLmZpZWxkX3R5cGUgIT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgcmV0dXJuIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHdyaXRlIGlkZW50aWZpZXIgezo/fSB3aXRob3V0IHNlcXVlbmNlIG51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICZpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZmllbGRfdHlwZSkpPzsKKyAgICAgICAgaWYgbGV0IFNvbWUoaWQpID0gaWRlbnRpZmllci5pZCB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2kxNihpZCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KFRUeXBlOjpTdG9wKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2kzMihiLmxlbigpIGFzIGkzMik/OworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9hbGwoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBiIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTgoMSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTgoMCkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2k4KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2kxNjo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTMyOjo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pNjQ6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2Y2NDo6PEJpZ0VuZGlhbj4oZCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZXMocy5hc19ieXRlcygpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBrZXlfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoa2V5X3R5cGUpKT87CisgICAgICAgIGxldCB2YWxfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KHZhbF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3U4KGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQsIHRydWUpKQorICAgIH0KK30KKworZm4gZmllbGRfdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6U3RvcCA9PiAweDAwLAorICAgICAgICBUVHlwZTo6Vm9pZCA9PiAweDAxLAorICAgICAgICBUVHlwZTo6Qm9vbCA9PiAweDAyLAorICAgICAgICBUVHlwZTo6STA4ID0+IDB4MDMsIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiAweDA0LAorICAgICAgICBUVHlwZTo6STE2ID0+IDB4MDYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gMHgwOCwKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAweDBBLAorICAgICAgICBUVHlwZTo6U3RyaW5nIHwgVFR5cGU6OlV0ZjcgPT4gMHgwQiwKKyAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiAweDBDLAorICAgICAgICBUVHlwZTo6TWFwID0+IDB4MEQsCisgICAgICAgIFRUeXBlOjpTZXQgPT4gMHgwRSwKKyAgICAgICAgVFR5cGU6Okxpc3QgPT4gMHgwRiwKKyAgICAgICAgVFR5cGU6OlV0ZjggPT4gMHgxMCwKKyAgICAgICAgVFR5cGU6OlV0ZjE2ID0+IDB4MTEsCisgICAgfQorfQorCitmbiBmaWVsZF90eXBlX2Zyb21fdTgoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDAgPT4gT2soVFR5cGU6OlN0b3ApLAorICAgICAgICAweDAxID0+IE9rKFRUeXBlOjpWb2lkKSwKKyAgICAgICAgMHgwMiA9PiBPayhUVHlwZTo6Qm9vbCksCisgICAgICAgIDB4MDMgPT4gT2soVFR5cGU6OkkwOCksIC8vIEVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgMHgwNCA9PiBPayhUVHlwZTo6RG91YmxlKSwKKyAgICAgICAgMHgwNiA9PiBPayhUVHlwZTo6STE2KSwKKyAgICAgICAgMHgwOCA9PiBPayhUVHlwZTo6STMyKSwKKyAgICAgICAgMHgwQSA9PiBPayhUVHlwZTo6STY0KSwKKyAgICAgICAgMHgwQiA9PiBPayhUVHlwZTo6U3RyaW5nKSwgLy8gdGVjaG5pY2FsbHksIGFsc28gYSBVVEY3LCBidXQgd2UnbGwgdHJlYXQgaXQgYXMgc3RyaW5nCisgICAgICAgIDB4MEMgPT4gT2soVFR5cGU6OlN0cnVjdCksCisgICAgICAgIDB4MEQgPT4gT2soVFR5cGU6Ok1hcCksCisgICAgICAgIDB4MEUgPT4gT2soVFR5cGU6OlNldCksCisgICAgICAgIDB4MEYgPT4gT2soVFR5cGU6Okxpc3QpLAorICAgICAgICAweDEwID0+IE9rKFRUeXBlOjpVdGY4KSwKKyAgICAgICAgMHgxMSA9PiBPayhUVHlwZTo6VXRmMTYpLAorICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRUeXBlIiwgdW5rbiksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6eworICAgICAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZSwKKyAgICB9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJpY3RfbWVzc2FnZV9jYWxsX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxNl0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ub25fc3RyaWN0X21lc3NhZ2VfY2FsbF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEzXSA9IFsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cmljdF9tZXNzYWdlX3JlcGx5X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpSZXBseSwgMTApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE2XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25vbl9zdHJpY3RfbWVzc2FnZV9yZXBseV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OlJlcGx5LCAxMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTNdID0gWworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwQSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJpY3RfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmc2VudF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ub25fc3RyaWN0X21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZzZW50X2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21lc3NhZ2VfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF9iZWdpbigpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKAorICAgICAgICAgICAgfG98IG8ud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSksCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zdHJ1Y3RfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic29tZV9maWVsZCIsIFRUeXBlOjpTdHJpbmcsIDIyKSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbMHgwQiwgMHgwMCwgMHgxNl07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2ZpZWxkX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBzZW50X2ZpZWxkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAyMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZzZW50X2ZpZWxkX2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6STY0LAorICAgICAgICAgICAgaWQ6IFNvbWUoMjApLAorICAgICAgICB9OyAvLyBubyBuYW1lCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZleHBlY3RlZF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RvcF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9maWVsZF9zdG9wKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgIGlkOiBTb21lKDApLAorICAgICAgICB9OyAvLyB3ZSBnZXQgaWQgMAorCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZleHBlY3RlZF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfZmllbGRfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgNSkpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWzB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDVdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpMaXN0LCA5MDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbGlzdF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMTYsIDcpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDA3XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgMjAwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudF9yZXN1bHQgPSBpX3Byb3QucmVhZF9zZXRfYmVnaW4oKTsKKyAgICAgICAgYXNzZXJ0IShyZWNlaXZlZF9pZGVudF9yZXN1bHQuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50X3Jlc3VsdC51bndyYXAoKSwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc2V0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgVFR5cGU6OlN0cnVjdCwgMzIpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA2XSA9IFsweDBBLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDIwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgVFR5cGU6OlNldCwgMTAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21hcF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF9mYWxzZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweDAxXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9ib29sX2ZhbHNlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4MDBdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCBmYWxzZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfYW55X25vbl96ZXJvX3ZhbHVlX3RvX2JlX2ludGVycHJldGVkX2FzX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweEFDXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYnl0ZXMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGJ5dGVzOiBbdTg7IDEwXSA9IFsweDBBLCAweENDLCAweEQxLCAweDg0LCAweDk5LCAweDEyLCAweEFCLCAweEJCLCAweDQ1LCAweERGXTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ieXRlcygmYnl0ZXMpLmlzX29rKCkpOworCisgICAgICAgIGxldCBidWYgPSBvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi40XSwgWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEFdKTsgLy8gbGVuZ3RoCisgICAgICAgIGFzc2VydF9lcSEoJmJ1Zls0Li5dLCBieXRlcyk7IC8vIGFjdHVhbCBieXRlcworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfYnl0ZXMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGJ5dGVzOiBbdTg7IDI1XSA9IFsKKyAgICAgICAgICAgIDB4MjAsCisgICAgICAgICAgICAweEZELAorICAgICAgICAgICAgMHgxOCwKKyAgICAgICAgICAgIDB4ODQsCisgICAgICAgICAgICAweDk5LAorICAgICAgICAgICAgMHgxMiwKKyAgICAgICAgICAgIDB4QUIsCisgICAgICAgICAgICAweEJCLAorICAgICAgICAgICAgMHg0NSwKKyAgICAgICAgICAgIDB4REYsCisgICAgICAgICAgICAweDM0LAorICAgICAgICAgICAgMHhEQywKKyAgICAgICAgICAgIDB4OTgsCisgICAgICAgICAgICAweEE0LAorICAgICAgICAgICAgMHg2RCwKKyAgICAgICAgICAgIDB4RjMsCisgICAgICAgICAgICAweDk5LAorICAgICAgICAgICAgMHhCNCwKKyAgICAgICAgICAgIDB4QjcsCisgICAgICAgICAgICAweEQ0LAorICAgICAgICAgICAgMHg5QywKKyAgICAgICAgICAgIDB4QTUsCisgICAgICAgICAgICAweEIzLAorICAgICAgICAgICAgMHhDOSwKKyAgICAgICAgICAgIDB4ODgsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYnl0ZXMoJmJ5dGVzKS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfYnl0ZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2J5dGVzLCAmYnl0ZXMpOworICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygKKyAgICAgICAgc3RyaWN0OiBib29sLAorICAgICkgLT4gKAorICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0MCwgNDApOworCisgICAgICAgIGxldCAocl9tZW0sIHdfbWVtKSA9IG1lbS5zcGxpdCgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBpX3Byb3QgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHJfbWVtLCBzdHJpY3QpOworICAgICAgICBsZXQgb19wcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19tZW0sIHN0cmljdCk7CisKKyAgICAgICAgKGlfcHJvdCwgb19wcm90KQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub193cml0ZTxGPihtdXQgd3JpdGVfZm46IEYsIHN0cmljdDogYm9vbCkKKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PikgLT4gOjpSZXN1bHQ8KCk+LAorICAgIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhzdHJpY3QpOworICAgICAgICBhc3NlcnQhKHdyaXRlX2ZuKCZtdXQgb19wcm90KS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjVlZGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzCkBAIC0wLDAgKzEsMjM4NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIGludGVnZXJfZW5jb2Rpbmc6OntWYXJJbnRSZWFkZXIsIFZhckludFdyaXRlcn07Cit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6aW87Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsCisgICAgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCit9OwordXNlIHN1cGVyOjp7VE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKKworY29uc3QgQ09NUEFDVF9QUk9UT0NPTF9JRDogdTggPSAweDgyOworY29uc3QgQ09NUEFDVF9WRVJTSU9OOiB1OCA9IDB4MDE7Citjb25zdCBDT01QQUNUX1ZFUlNJT05fTUFTSzogdTggPSAweDFGOworCisvLy8gUmVhZCBtZXNzYWdlcyBlbmNvZGVkIGluIHRoZSBUaHJpZnQgY29tcGFjdCBwcm90b2NvbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwpOworLy8vCisvLy8gbGV0IHJlY3ZkX2Jvb2wgPSBwcm90b2NvbC5yZWFkX2Jvb2woKS51bndyYXAoKTsKKy8vLyBsZXQgcmVjdmRfc3RyaW5nID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vIElkZW50aWZpZXIgb2YgdGhlIGxhc3QgZmllbGQgZGVzZXJpYWxpemVkIGZvciBhIHN0cnVjdC4KKyAgICBsYXN0X3JlYWRfZmllbGRfaWQ6IGkxNiwKKyAgICAvLyBTdGFjayBvZiB0aGUgbGFzdCByZWFkIGZpZWxkIGlkcyAoYSBuZXcgZW50cnkgaXMgYWRkZWQgZWFjaCB0aW1lIGEgbmVzdGVkIHN0cnVjdCBpcyByZWFkKS4KKyAgICByZWFkX2ZpZWxkX2lkX3N0YWNrOiBWZWM8aTE2PiwKKyAgICAvLyBCb29sZWFuIHZhbHVlIGZvciBhIGZpZWxkLgorICAgIC8vIFNhdmVkIGJlY2F1c2UgYm9vbGVhbiBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUsCisgICAgLy8gYW5kIHJlYWRpbmcgdGhlIGZpZWxkIG9ubHkgb2NjdXJzIGFmdGVyIHRoZSBmaWVsZCBpZCBpcyByZWFkLgorICAgIHBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlOiBPcHRpb248Ym9vbD4sCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgYnl0ZS1sZXZlbCBvcGVyYXRpb25zLgorICAgIHRyYW5zcG9ydDogVCwKK30KKworaW1wbDxUPiBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCkgLT4gVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGxhc3RfcmVhZF9maWVsZF9pZDogMCwKKyAgICAgICAgICAgIHJlYWRfZmllbGRfaWRfc3RhY2s6IFZlYzo6bmV3KCksCisgICAgICAgICAgICBwZW5kaW5nX3JlYWRfYm9vbF92YWx1ZTogTm9uZSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PChUVHlwZSwgaTMyKT4geworICAgICAgICBsZXQgaGVhZGVyID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBlbGVtZW50X3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoaGVhZGVyICYgMHgwRik/OworCisgICAgICAgIGxldCBlbGVtZW50X2NvdW50OworICAgICAgICBsZXQgcG9zc2libGVfZWxlbWVudF9jb3VudCA9IChoZWFkZXIgJiAweEYwKSA+PiA0OworICAgICAgICBpZiBwb3NzaWJsZV9lbGVtZW50X2NvdW50ICE9IDE1IHsKKyAgICAgICAgICAgIC8vIGhpZ2ggYml0cyBzZXQgaGlnaCBpZiBjb3VudCBhbmQgdHlwZSBlbmNvZGVkIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIGVsZW1lbnRfY291bnQgPSBwb3NzaWJsZV9lbGVtZW50X2NvdW50IGFzIGkzMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVsZW1lbnRfY291bnQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT8gYXMgaTMyOworICAgICAgICB9CisKKyAgICAgICAgT2soKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sIGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBjb21wYWN0X2lkID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGlmIGNvbXBhY3RfaWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCB7CisgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImludmFsaWQgY29tcGFjdCBwcm90b2NvbCBoZWFkZXIgezo/fSIsIGNvbXBhY3RfaWQpLAorICAgICAgICAgICAgfSkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHR5cGVfYW5kX2J5dGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IHJlY2VpdmVkX3ZlcnNpb24gPSB0eXBlX2FuZF9ieXRlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7CisgICAgICAgIGlmIHJlY2VpdmVkX3ZlcnNpb24gIT0gQ09NUEFDVF9WRVJTSU9OIHsKKyAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwcm9jZXNzIGNvbXBhY3QgcHJvdG9jb2wgdmVyc2lvbiB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRfdmVyc2lvbgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9KSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9PzsKKworICAgICAgICAvLyBOT1RFOiB1bnNpZ25lZCByaWdodCBzaGlmdCB3aWxsIHBhZCB3aXRoIDBzCisgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IFRNZXNzYWdlVHlwZTo6dHJ5X2Zyb20odHlwZV9hbmRfYnl0ZSA+PiA1KT87CisgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBsZXQgc2VydmljZV9jYWxsX25hbWUgPSBzZWxmLnJlYWRfc3RyaW5nKCk/OworCisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gMDsKKworICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIHNlcnZpY2VfY2FsbF9uYW1lLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICApKQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgc2VsZi5yZWFkX2ZpZWxkX2lkX3N0YWNrLnB1c2goc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQpOworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IDA7CisgICAgICAgIE9rKE5vbmUpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSBzZWxmCisgICAgICAgICAgICAucmVhZF9maWVsZF9pZF9zdGFjaworICAgICAgICAgICAgLnBvcCgpCisgICAgICAgICAgICAuZXhwZWN0KCJzaG91bGQgaGF2ZSBwcmV2aW91cyBmaWVsZCBpZHMiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgLy8gd2UgY2FuIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUsIHdoaWNoIGlzOgorICAgICAgICAvLyAtIHRoZSB0eXBlCisgICAgICAgIC8vIC0gdGhlIGZpZWxkIGRlbHRhIGFuZCB0aGUgdHlwZQorICAgICAgICBsZXQgZmllbGRfdHlwZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZmllbGRfZGVsdGEgPSAoZmllbGRfdHlwZSAmIDB4RjApID4+IDQ7CisgICAgICAgIGxldCBmaWVsZF90eXBlID0gbWF0Y2ggZmllbGRfdHlwZSAmIDB4MEYgeworICAgICAgICAgICAgMHgwMSA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZSA9IFNvbWUodHJ1ZSk7CisgICAgICAgICAgICAgICAgT2soVFR5cGU6OkJvb2wpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAweDAyID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlID0gU29tZShmYWxzZSk7CisgICAgICAgICAgICAgICAgT2soVFR5cGU6OkJvb2wpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0dHU4ID0+IHU4X3RvX3R5cGUodHR1OCksCisgICAgICAgIH0/OworCisgICAgICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gT2soCisgICAgICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllcjo6bmV3Ojo8T3B0aW9uPFN0cmluZz4sIFN0cmluZywgT3B0aW9uPGkxNj4+KAorICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIGlmIGZpZWxkX2RlbHRhICE9IDAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCArPSBmaWVsZF9kZWx0YSBhcyBpMTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSBzZWxmLnJlYWRfaTE2KCk/OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBPayhURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaWQ6IFNvbWUoc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbWF0Y2ggc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZS50YWtlKCkgeworICAgICAgICAgICAgU29tZShiKSA9PiBPayhiKSwKKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIGxldCBiID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgICAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAgICAgICAgIDB4MDEgPT4gT2sodHJ1ZSksCisgICAgICAgICAgICAgICAgICAgIDB4MDIgPT4gT2soZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSBpbnRvIGJvb2wiLCB1bmtuKSwKKyAgICAgICAgICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBsZW4gPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT87CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IGxlbiBhcyB1c2l6ZV07CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCBidWYpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYucmVhZF9ieXRlKCkubWFwKHxpfCBpIGFzIGk4KQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTE2PigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGkzMj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpNjQ+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZjY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBsZXQgYnl0ZXMgPSBzZWxmLnJlYWRfYnl0ZXMoKT87CisgICAgICAgIFN0cmluZzo6ZnJvbV91dGY4KGJ5dGVzKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCAoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSA9IHNlbGYucmVhZF9saXN0X3NldF9iZWdpbigpPzsKKyAgICAgICAgT2soVExpc3RJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkgPSBzZWxmLnJlYWRfbGlzdF9zZXRfYmVnaW4oKT87CisgICAgICAgIE9rKFRTZXRJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X2NvdW50ID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/IGFzIGkzMjsKKyAgICAgICAgaWYgZWxlbWVudF9jb3VudCA9PSAwIHsKKyAgICAgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoTm9uZSwgTm9uZSwgMCkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgdHlwZV9oZWFkZXIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZSgodHlwZV9oZWFkZXIgJiAweEYwKSA+PiA0KT87CisgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUodHlwZV9oZWFkZXIgJiAweDBGKT87CisgICAgICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KGtleV90eXBlLCB2YWxfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIGxldCBtdXQgYnVmID0gWzB1ODsgMV07CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCBidWZbMF0pCisgICAgfQorfQorCitpbXBsPFQ+IGlvOjpTZWVrIGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogaW86OlNlZWsgKyBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBmbiBzZWVrKCZtdXQgc2VsZiwgcG9zOiBpbzo6U2Vla0Zyb20pIC0+IGlvOjpSZXN1bHQ8dTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnNlZWsocG9zKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVENvbXBhY3RJbnB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCkpCisgICAgfQorfQorCisvLy8gV3JpdGUgbWVzc2FnZXMgdXNpbmcgdGhlIFRocmlmdCBjb21wYWN0IHByb3RvY29sLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfYm9vbCh0cnVlKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoInRlc3Rfc3RyaW5nIikudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vIElkZW50aWZpZXIgb2YgdGhlIGxhc3QgZmllbGQgc2VyaWFsaXplZCBmb3IgYSBzdHJ1Y3QuCisgICAgbGFzdF93cml0ZV9maWVsZF9pZDogaTE2LAorICAgIC8vIFN0YWNrIG9mIHRoZSBsYXN0IHdyaXR0ZW4gZmllbGQgaWRzIChuZXcgZW50cnkgYWRkZWQgZWFjaCB0aW1lIGEgbmVzdGVkIHN0cnVjdCBpcyB3cml0dGVuKS4KKyAgICB3cml0ZV9maWVsZF9pZF9zdGFjazogVmVjPGkxNj4sCisgICAgLy8gRmllbGQgaWRlbnRpZmllciBvZiB0aGUgYm9vbGVhbiBmaWVsZCB0byBiZSB3cml0dGVuLgorICAgIC8vIFNhdmVkIGJlY2F1c2UgYm9vbGVhbiBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUKKyAgICBwZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllcjogT3B0aW9uPFRGaWVsZElkZW50aWZpZXI+LAorICAgIC8vIFVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIGJ5dGUtbGV2ZWwgb3BlcmF0aW9ucy4KKyAgICB0cmFuc3BvcnQ6IFQsCit9CisKK2ltcGw8VD4gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCkgLT4gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgbGFzdF93cml0ZV9maWVsZF9pZDogMCwKKyAgICAgICAgICAgIHdyaXRlX2ZpZWxkX2lkX3N0YWNrOiBWZWM6Om5ldygpLAorICAgICAgICAgICAgcGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXI6IE5vbmUsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZJWE1FOiBmaWVsZF90eXBlIGFzIHVuY29uc3RyYWluZWQgdTggaXMgYmFkCisgICAgZm4gd3JpdGVfZmllbGRfaGVhZGVyKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogdTgsIGZpZWxkX2lkOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBmaWVsZF9kZWx0YSA9IGZpZWxkX2lkIC0gc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkOworICAgICAgICBpZiBmaWVsZF9kZWx0YSA+IDAgJiYgZmllbGRfZGVsdGEgPCAxNSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoKChmaWVsZF9kZWx0YSBhcyB1OCkgPDwgNCkgfCBmaWVsZF90eXBlKT87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMTYoZmllbGRfaWQpPzsKKyAgICAgICAgfQorICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9zZXRfYmVnaW4oJm11dCBzZWxmLCBlbGVtZW50X3R5cGU6IFRUeXBlLCBlbGVtZW50X2NvdW50OiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBlbGVtX2lkZW50aWZpZXIgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoZWxlbWVudF90eXBlKTsKKyAgICAgICAgaWYgZWxlbWVudF9jb3VudCA8PSAxNCB7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gKGVsZW1lbnRfY291bnQgYXMgdTgpIDw8IDQgfCBlbGVtX2lkZW50aWZpZXI7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaGVhZGVyKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IGhlYWRlciA9IDB4RjAgfCBlbGVtX2lkZW50aWZpZXI7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaGVhZGVyKT87CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgICAgIC53cml0ZV92YXJpbnQoZWxlbWVudF9jb3VudCBhcyB1MzIpCisgICAgICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoJnNlbGYpIHsKKyAgICAgICAgaWYgbGV0IFNvbWUocmVmIGYpID0gc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllciB7CisgICAgICAgICAgICBwYW5pYyEoInBlbmRpbmcgYm9vbCBmaWVsZCB7Oj99IG5vdCB3cml0dGVuIiwgZikKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoQ09NUEFDVF9QUk9UT0NPTF9JRCk/OworICAgICAgICBzZWxmLndyaXRlX2J5dGUoKHU4Ojpmcm9tKGlkZW50aWZpZXIubWVzc2FnZV90eXBlKSA8PCA1KSB8IENPTVBBQ1RfVkVSU0lPTik/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcik/OworICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIF86ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9maWVsZF9pZF9zdGFjay5wdXNoKHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCk7CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IDA7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gc2VsZgorICAgICAgICAgICAgLndyaXRlX2ZpZWxkX2lkX3N0YWNrCisgICAgICAgICAgICAucG9wKCkKKyAgICAgICAgICAgIC5leHBlY3QoInNob3VsZCBoYXZlIHByZXZpb3VzIGZpZWxkIGlkcyIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBpZGVudGlmaWVyLmZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4geworICAgICAgICAgICAgICAgIGlmIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIuaXNfc29tZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMhKAorICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBub3QgaGF2ZSBhIHBlbmRpbmcgYm9vbCB3aGlsZSB3cml0aW5nIGFub3RoZXIgYm9vbCB3aXRoIGlkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgezo/fSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllciA9IFNvbWUoaWRlbnRpZmllci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIGxldCBmaWVsZF90eXBlID0gdHlwZV90b191OChpZGVudGlmaWVyLmZpZWxkX3R5cGUpOworICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZCA9IGlkZW50aWZpZXIuaWQuZXhwZWN0KCJub24tc3RvcCBmaWVsZCBzaG91bGQgaGF2ZSBmaWVsZCBpZCIpOworICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaGVhZGVyKGZpZWxkX3R5cGUsIGZpZWxkX2lkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKHR5cGVfdG9fdTgoVFR5cGU6OlN0b3ApKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyLnRha2UoKSB7CisgICAgICAgICAgICBTb21lKHBlbmRpbmcpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWQgPSBwZW5kaW5nLmlkLmV4cGVjdCgiYm9vbCBmaWVsZCBzaG91bGQgaGF2ZSBhIGZpZWxkIGlkIik7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX3R5cGVfYXNfdTggPSBpZiBiIHsgMHgwMSB9IGVsc2UgeyAweDAyIH07CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWVsZF9oZWFkZXIoZmllbGRfdHlwZV9hc191OCwgZmllbGRfaWQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBpZiBiIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDB4MDEpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDB4MDIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdmFyaW50KGIubGVuKCkgYXMgdTMyKT87CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2FsbChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGkgYXMgdTgpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9mNjQ6OjxCaWdFbmRpYW4+KGQpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGVzKHMuYXNfYnl0ZXMoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9saXN0X3NldF9iZWdpbihpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSwgaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2xpc3Rfc2V0X2JlZ2luKGlkZW50aWZpZXIuZWxlbWVudF90eXBlLCBpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgaWRlbnRpZmllci5zaXplID09IDAgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKDApCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV92YXJpbnQoaWRlbnRpZmllci5zaXplIGFzIHUzMik/OworCisgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZV9ieXRlID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KGtleV90eXBlKSA8PCA0OworCisgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgICAgICBsZXQgdmFsX3R5cGVfYnl0ZSA9IGNvbGxlY3Rpb25fdHlwZV90b191OCh2YWxfdHlwZSk7CisKKyAgICAgICAgICAgIGxldCBtYXBfdHlwZV9oZWFkZXIgPSBrZXlfdHlwZV9ieXRlIHwgdmFsX3R5cGVfYnl0ZTsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShtYXBfdHlwZV9oZWFkZXIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJltiXSkubWFwX2VycihGcm9tOjpmcm9tKS5tYXAofF98ICgpKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0KSkKKyAgICB9Cit9CisKK2ZuIGNvbGxlY3Rpb25fdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6Qm9vbCA9PiAweDAxLAorICAgICAgICBmID0+IHR5cGVfdG9fdTgoZiksCisgICAgfQorfQorCitmbiB0eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpTdG9wID0+IDB4MDAsCisgICAgICAgIFRUeXBlOjpJMDggPT4gMHgwMywgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICBUVHlwZTo6STE2ID0+IDB4MDQsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gMHgwNSwKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAweDA2LAorICAgICAgICBUVHlwZTo6RG91YmxlID0+IDB4MDcsCisgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gMHgwOCwKKyAgICAgICAgVFR5cGU6Okxpc3QgPT4gMHgwOSwKKyAgICAgICAgVFR5cGU6OlNldCA9PiAweDBBLAorICAgICAgICBUVHlwZTo6TWFwID0+IDB4MEIsCisgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gMHgwQywKKyAgICAgICAgXyA9PiBwYW5pYyEoZm9ybWF0ISgKKyAgICAgICAgICAgICJzaG91bGQgbm90IGhhdmUgYXR0ZW1wdGVkIHRvIGNvbnZlcnQge30gdG8gdTgiLAorICAgICAgICAgICAgZmllbGRfdHlwZQorICAgICAgICApKSwKKyAgICB9Cit9CisKK2ZuIGNvbGxlY3Rpb25fdThfdG9fdHlwZShiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMSA9PiBPayhUVHlwZTo6Qm9vbCksCisgICAgICAgIG8gPT4gdThfdG9fdHlwZShvKSwKKyAgICB9Cit9CisKK2ZuIHU4X3RvX3R5cGUoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDAgPT4gT2soVFR5cGU6OlN0b3ApLAorICAgICAgICAweDAzID0+IE9rKFRUeXBlOjpJMDgpLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIDB4MDQgPT4gT2soVFR5cGU6OkkxNiksCisgICAgICAgIDB4MDUgPT4gT2soVFR5cGU6OkkzMiksCisgICAgICAgIDB4MDYgPT4gT2soVFR5cGU6Okk2NCksCisgICAgICAgIDB4MDcgPT4gT2soVFR5cGU6OkRvdWJsZSksCisgICAgICAgIDB4MDggPT4gT2soVFR5cGU6OlN0cmluZyksCisgICAgICAgIDB4MDkgPT4gT2soVFR5cGU6Okxpc3QpLAorICAgICAgICAweDBBID0+IE9rKFRUeXBlOjpTZXQpLAorICAgICAgICAweDBCID0+IE9rKFRUeXBlOjpNYXApLAorICAgICAgICAweDBDID0+IE9rKFRUeXBlOjpTdHJ1Y3QpLAorICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSBpbnRvIFRUeXBlIiwgdW5rbiksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6eworICAgICAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZSwKKyAgICB9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luXzAoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgImZvbyIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwsCisgICAgICAgICAgICA0MzEKKyAgICAgICAgKSkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4ODIsIC8qIHByb3RvY29sIElEICovCisgICAgICAgICAgICAweDIxLCAvKiBtZXNzYWdlIHR5cGUgfCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgICAgICAweERFLAorICAgICAgICAgICAgMHgwNiwgLyogemlnLXphZyB2YXJpbnQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgICAgICAgICAweDAzLCAvKiBtZXNzYWdlLW5hbWUgbGVuZ3RoICovCisgICAgICAgICAgICAweDY2LAorICAgICAgICAgICAgMHg2RiwKKyAgICAgICAgICAgIDB4NkYgLyogImZvbyIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fMSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAiYmFyIiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHksCisgICAgICAgICAgICA5OTE4MjgKKyAgICAgICAgKSkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA5XSA9IFsKKyAgICAgICAgICAgIDB4ODIsIC8qIHByb3RvY29sIElEICovCisgICAgICAgICAgICAweDQxLCAvKiBtZXNzYWdlIHR5cGUgfCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgICAgICAgICAweEE4LAorICAgICAgICAgICAgMHg4OSwKKyAgICAgICAgICAgIDB4NzksIC8qIHppZy16YWcgdmFyaW50IHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICAgICAgMHgwMywgLyogbWVzc2FnZS1uYW1lIGxlbmd0aCAqLworICAgICAgICAgICAgMHg2MiwKKyAgICAgICAgICAgIDB4NjEsCisgICAgICAgICAgICAweDcyIC8qICJiYXIiICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMjgzOTQ4KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tZXNzYWdlX2VuZCgpKTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBzdHJ1Y3RzIGFuZCBmaWVsZHMgYXJlIHRlc3RlZCB0b2dldGhlcgorICAgIC8vCisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMTYsIDQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6TGlzdCwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWworICAgICAgICAgICAgMHgwMywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmlyc3QgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NDQsIC8qIGZpZWxkIGRlbHRhICg0KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NTksIC8qIGZpZWxkIGRlbHRhICg1KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STE2LCA0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6TGlzdCwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9ub25femVyb19pbml0aWFsX2ZpZWxkX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCA2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweDE1LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDFBLCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDQ4LCAvKiBmaWVsZCBkZWx0YSAoNCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbm9uX3plcm9faW5pdGlhbF9maWVsZF9hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9sb25nX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDE2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgOTkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4MDUsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpcnN0IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDA2LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDIwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhDNiwKKyAgICAgICAgICAgIDB4MDEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbG9uZ19maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMTYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDk5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX21peF9vZl9sb25nX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDEwMDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG9ubHkgMyB1cCBmcm9tIHRoZSBwcmV2aW91cyBpdCBpcyByZWNvcmRlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEwXSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4RDAsCisgICAgICAgICAgICAweDBGLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhBMiwKKyAgICAgICAgICAgIDB4MUYsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDNBLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfbWl4X29mX2xvbmdfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgbGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMTAwMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBvbmx5IDMgdXAgZnJvbSB0aGUgcHJldmlvdXMgaXQgaXMgcmVjb3JkZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF81ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF81LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzUKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18wKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NzMsIC8qIGZpZWxkIGRlbHRhICg3KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzAoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCA3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzEoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MzMsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMSgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMigpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCA3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMTApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA4LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg3NywgLyogZmllbGQgZGVsdGEoNykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMzLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzIoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMTApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzMoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwOCwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDYzLCAvKiBmaWVsZCBkZWx0YSAoNikgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzMoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfZmllbGQoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTYgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDI2KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgNDUpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDExLCAvKiBmaWVsZCBkZWx0YSAoMSkgfCB0cnVlICovCisgICAgICAgICAgICAweDgyLCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmYWxzZSAqLworICAgICAgICAgICAgMHgwMSwgLyogdHJ1ZSAqLworICAgICAgICAgICAgMHgzNCwgLyogZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDIsIC8qIGZhbHNlICovCisgICAgICAgICAgICAweDVBLCAvKiBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCAvKiBzdG9wIGZpZWxkICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2Jvb2xfZmllbGQoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCkpOworCisgICAgICAgIC8vIHdyaXRlIHR3byBmaWVsZHMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE2IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAyNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgNDUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8xLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMiwgZmFsc2UpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8zLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfNCwgZmFsc2UpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzUgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzUsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfZmllbGRfZW5kX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdG9wX2ZpZWxkX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RydWN0X2VuZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX3N0cnVjdF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0cnVjdF9lbmRfd2l0aG91dF9hbnlfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfZmllbGRfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NtYWxsX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIDQpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4NDYgLyogc2l6ZSB8IGVsZW1fdHlwZSAqL107CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc21hbGxfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMDgsIDEwKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGFyZ2Vfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCByZXMgPSBvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okxpc3QsIDk5OTkpKTsKKyAgICAgICAgYXNzZXJ0IShyZXMuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWworICAgICAgICAgICAgMHhGOSwgLyogMHhGMCB8IGVsZW1fdHlwZSAqLworICAgICAgICAgICAgMHg4RiwgMHg0RSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9sYXJnZV9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlNldCwgNDczODEpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2xpc3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NtYWxsX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTdHJ1Y3QsIDIpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MkMgLyogc2l6ZSB8IGVsZW1fdHlwZSAqL107CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc21hbGxfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STE2LCA3KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3NldF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xhcmdlX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpEb3VibGUsIDIzODkxKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4RjcsIC8qIDB4RjAgfCBlbGVtX3R5cGUgKi8KKyAgICAgICAgICAgIDB4RDMsIDB4QkEsIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGFyZ2Vfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCAzOTI4NDI5KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3NldF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zZXRfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3plcm9fc2l6ZWRfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlN0cmluZywgVFR5cGU6OkkzMiwgMCkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07IC8vIHNpbmNlIHNpemUgaXMgemVybyB3ZSBkb24ndCB3cml0ZSBhbnl0aGluZworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX3plcm9fc2l6ZWRfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkRvdWJsZSwgVFR5cGU6OkkzMiwgMCkpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICZyZXMsCisgICAgICAgICAgICAmVE1hcElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIGtleV90eXBlOiBOb25lLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IE5vbmUsCisgICAgICAgICAgICAgICAgc2l6ZTogMCwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUsCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nLAorICAgICAgICAgICAgMjM4CisgICAgICAgICkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbCisgICAgICAgICAgICAweEVFLCAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICAgICAgMHg3OCwgLyoga2V5IHR5cGUgfCB2YWwgdHlwZSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgVFR5cGU6Okxpc3QsIDE5MjgzNDkpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21hcF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX3dpdGhfYm9vbF9rZXlfYW5kX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfZW5kKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgICAgICAweDExLCAvKiBrZXkgdHlwZSB8IHZhbCB0eXBlICovCisgICAgICAgICAgICAweDAxLCAvKiBrZXk6IHRydWUgKi8KKyAgICAgICAgICAgIDB4MDIsIC8qIHZhbDogZmFsc2UgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfd2l0aF9ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IG1hcF9pZGVudCA9IFRNYXBJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIFRUeXBlOjpCb29sLCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJm1hcF9pZGVudCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyBtYXAgaGVhZGVyCisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmN2ZF9pZGVudCwgJm1hcF9pZGVudCk7CisgICAgICAgIC8vIGtleSAxCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgdHJ1ZSk7CisgICAgICAgIC8vIHZhbCAxCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgZmFsc2UpOworICAgICAgICAvLyBrZXkgMgorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIGZhbHNlKTsKKyAgICAgICAgLy8gdmFsIDIKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCB0cnVlKTsKKyAgICAgICAgLy8gbWFwIGVuZAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21hcF9lbmQoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0IShpX3Byb3QucmVhZF9tYXBfZW5kKCkuaXNfb2soKSk7IC8vIHdpbGwgYmxvdyB1cCBpZiB3ZSB0cnkgdG8gcmVhZCBmcm9tIGVtcHR5IGJ1ZmZlcgorICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygpIC0+ICgKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg4MCwgODApOworCisgICAgICAgIGxldCAocl9tZW0sIHdfbWVtKSA9IG1lbS5zcGxpdCgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBpX3Byb3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyX21lbSk7CisgICAgICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcod19tZW0pOworCisgICAgICAgIChpX3Byb3QsIG9fcHJvdCkKKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fd3JpdGU8Rj4obXV0IHdyaXRlX2ZuOiBGKQorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PikgLT4gOjpSZXN1bHQ8KCk+LAorICAgIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnQhKHdyaXRlX2ZuKCZtdXQgb19wcm90KS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjMDI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzCkBAIC0wLDAgKzEsOTY5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgcHJpbWl0aXZlcyBiZXR3ZWVuIGEgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyLgorLy8hCisvLyEgIyBFeGFtcGxlcworLy8hCisvLyEgQ3JlYXRlIGFuZCB1c2UgYSBgVElucHV0UHJvdG9jb2xgLgorLy8hCisvLyEgYGBgbm9fcnVuCisvLyEgdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8hIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIEkvTyBjaGFubmVsCisvLyEgbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8hIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgcHJvdG9jb2wgdG8gZGVjb2RlIGJ5dGVzIGludG8gdHlwZXMKKy8vISBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vIQorLy8hIC8vIHJlYWQgdHlwZXMgZnJvbSB0aGUgd2lyZQorLy8hIGxldCBmaWVsZF9pZGVudGlmaWVyID0gcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbigpLnVud3JhcCgpOworLy8hIGxldCBmaWVsZF9jb250ZW50cyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLyEgbGV0IGZpZWxkX2VuZCA9IHByb3RvY29sLnJlYWRfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLyEgYGBgCisvLyEKKy8vISBDcmVhdGUgYW5kIHVzZSBhIGBUT3V0cHV0UHJvdG9jb2xgLgorLy8hCisvLyEgYGBgbm9fcnVuCisvLyEgdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRGaWVsZElkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFR5cGV9OworLy8hIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIEkvTyBjaGFubmVsCisvLyEgbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8hIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgcHJvdG9jb2wgdG8gZW5jb2RlIHR5cGVzIGludG8gYnl0ZXMKKy8vISBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLyEKKy8vISAvLyB3cml0ZSB0eXBlcworLy8hIHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInN0cmluZ190aGluZyIsIFRUeXBlOjpTdHJpbmcsIDEpKS51bndyYXAoKTsKKy8vISBwcm90b2NvbC53cml0ZV9zdHJpbmcoImZvbyIpLnVud3JhcCgpOworLy8hIHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8hIGBgYAorCit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OwordXNlIHtQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZH07CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIHsKKyAgICAoJG9fcHJvdDppZGVudCwgJGV4cGVjdGVkX2J5dGVzOmlkZW50KSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCRvX3Byb3QudHJhbnNwb3J0LndyaXRlX2J5dGVzKCksICYkZXhwZWN0ZWRfYnl0ZXMpOworICAgIH19OworfQorCisvLyBGSVhNRTogc2hvdWxkIHRha2UgYm90aCByZWFkIGFuZCB3cml0ZQorI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIgeworICAgICgkb19wcm90OmlkZW50KSA9PiB7eworICAgICAgICAkb19wcm90LnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgIH19OworfQorCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBzZXRfcmVhZGFibGVfYnl0ZXMgeworICAgICgkaV9wcm90OmlkZW50LCAkYnl0ZXM6ZXhwcikgPT4geworICAgICAgICAkaV9wcm90LnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJGJ5dGVzKTsKKyAgICB9OworfQorCittb2QgYmluYXJ5OworbW9kIGNvbXBhY3Q7Cittb2QgbXVsdGlwbGV4ZWQ7Cittb2Qgc3RvcmVkOworCitwdWIgdXNlIHNlbGY6OmJpbmFyeTo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwKKyAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6Y29tcGFjdDo6eworICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbCwKKyAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6Om11bHRpcGxleGVkOjpUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDsKK3B1YiB1c2Ugc2VsZjo6c3RvcmVkOjpUU3RvcmVkSW5wdXRQcm90b2NvbDsKKworLy8gRGVmYXVsdCBtYXhpbXVtIGRlcHRoIHRvIHdoaWNoIGBUSW5wdXRQcm90b2NvbDo6c2tpcGAgd2lsbCBza2lwIGEgVGhyaWZ0CisvLyBmaWVsZC4gQSBkZWZhdWx0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFRocmlmdCBzdHJ1Y3RzIG9yIGNvbGxlY3Rpb25zIG1heQorLy8gY29udGFpbiBuZXN0ZWQgc3RydWN0cyBhbmQgY29sbGVjdGlvbnMsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBpbmRlZmluaXRlCisvLyByZWN1cnNpb24uCitjb25zdCBNQVhJTVVNX1NLSVBfREVQVEg6IGk4ID0gNjQ7CisKKy8vLyBDb252ZXJ0cyBhIHN0cmVhbSBvZiBieXRlcyBpbnRvIFRocmlmdCBpZGVudGlmaWVycywgcHJpbWl0aXZlcywKKy8vLyBjb250YWluZXJzLCBvciBzdHJ1Y3RzLgorLy8vCisvLy8gVGhpcyB0cmFpdCBkb2VzIG5vdCBkZWFsIHdpdGggaGlnaGVyLWxldmVsIFRocmlmdCBjb25jZXB0cyBsaWtlIHN0cnVjdHMgb3IKKy8vLyBleGNlcHRpb25zIC0gb25seSB3aXRoIHByaW1pdGl2ZXMgYW5kIG1lc3NhZ2Ugb3IgY29udGFpbmVyIGJvdW5kYXJpZXMuIE9uY2UKKy8vLyBieXRlcyBhcmUgcmVhZCB0aGV5IGFyZSBkZXNlcmlhbGl6ZWQgYW5kIGFuIGlkZW50aWZpZXIgKGZvciBleGFtcGxlCisvLy8gYFRNZXNzYWdlSWRlbnRpZmllcmApIG9yIGEgcHJpbWl0aXZlIGlzIHJldHVybmVkLgorLy8vCisvLy8gQWxsIG1ldGhvZHMgcmV0dXJuIGEgYHRocmlmdDo6UmVzdWx0YC4gSWYgYW4gYEVycmAgaXMgcmV0dXJuZWQgdGhlIHByb3RvY29sCisvLy8gaW5zdGFuY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzaG91bGQgYmUgdGVybWluYXRlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRJbnB1dFByb3RvY29sYAorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBsZXQgZmllbGRfaWRlbnRpZmllciA9IHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4oKS51bndyYXAoKTsKKy8vLyBsZXQgZmllbGRfY29udGVudHMgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGxldCBmaWVsZF9lbmQgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8vIGBgYAorcHViIHRyYWl0IFRJbnB1dFByb3RvY29sIHsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdCBmaWVsZC4KKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QgZmllbGQuCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgYSBib29sLgorICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+OworICAgIC8vLyBSZWFkIGEgZml4ZWQtbGVuZ3RoIGJ5dGUgYXJyYXkuCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+OworICAgIC8vLyBSZWFkIGEgd29yZC4KKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+OworICAgIC8vLyBSZWFkIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PjsKKyAgICAvLy8gUmVhZCBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj47CisgICAgLy8vIFJlYWQgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+OworICAgIC8vLyBSZWFkIGEgNjQtYml0IGZsb2F0LgorICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PjsKKyAgICAvLy8gUmVhZCBhIGZpeGVkLWxlbmd0aCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpLgorICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgc2V0LgorICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBTa2lwIGEgZmllbGQgd2l0aCB0eXBlIGBmaWVsZF90eXBlYCByZWN1cnNpdmVseSB1bnRpbCB0aGUgZGVmYXVsdAorICAgIC8vLyBtYXhpbXVtIHNraXAgZGVwdGggaXMgcmVhY2hlZC4KKyAgICBmbiBza2lwKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogVFR5cGUpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGZpZWxkX3R5cGUsIE1BWElNVU1fU0tJUF9ERVBUSCkKKyAgICB9CisgICAgLy8vIFNraXAgYSBmaWVsZCB3aXRoIHR5cGUgYGZpZWxkX3R5cGVgIHJlY3Vyc2l2ZWx5IHVwIHRvIGBkZXB0aGAgbGV2ZWxzLgorICAgIGZuIHNraXBfdGlsbF9kZXB0aCgmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IFRUeXBlLCBkZXB0aDogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGRlcHRoID09IDAgeworICAgICAgICAgICAgcmV0dXJuIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgcGFyc2UgcGFzdCB7Oj99IiwgZmllbGRfdHlwZSksCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHNlbGYucmVhZF9ib29sKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STA4ID0+IHNlbGYucmVhZF9pOCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkxNiA9PiBzZWxmLnJlYWRfaTE2KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STMyID0+IHNlbGYucmVhZF9pMzIoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJNjQgPT4gc2VsZi5yZWFkX2k2NCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiBzZWxmLnJlYWRfZG91YmxlKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nID0+IHNlbGYucmVhZF9zdHJpbmcoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4geworICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zdHJ1Y3RfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZGVudCA9IHNlbGYucmVhZF9maWVsZF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICAgICAgaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChmaWVsZF9pZGVudC5maWVsZF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3N0cnVjdF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6Okxpc3QgPT4geworICAgICAgICAgICAgICAgIGxldCBsaXN0X2lkZW50ID0gc2VsZi5yZWFkX2xpc3RfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4ubGlzdF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgobGlzdF9pZGVudC5lbGVtZW50X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfbGlzdF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6OlNldCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHNldF9pZGVudCA9IHNlbGYucmVhZF9zZXRfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4uc2V0X2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChzZXRfaWRlbnQuZWxlbWVudF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3NldF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVFR5cGU6Ok1hcCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG1hcF9pZGVudCA9IHNlbGYucmVhZF9tYXBfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gMC4ubWFwX2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBtYXBfaWRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdCgibm9uLXplcm8gc2l6ZWQgbWFwIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IG1hcF9pZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBlY3QoIm5vbi16ZXJvIHNpemVkIG1hcCBzaG91bGQgY29udGFpbiB2YWx1ZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGtleV90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgodmFsX3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfbWFwX2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3Qgc2tpcCBmaWVsZCB0eXBlIHs6P30iLCAmdSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5IChETyBOT1QgVVNFIElOIEdFTkVSQVRFRCBDT0RFISEhISkKKyAgICAvLworCisgICAgLy8vIFJlYWQgYW4gdW5zaWduZWQgYnl0ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkICoqbmV2ZXIqKiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLgorICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PjsKK30KKworLy8vIENvbnZlcnRzIFRocmlmdCBpZGVudGlmaWVycywgcHJpbWl0aXZlcywgY29udGFpbmVycyBvciBzdHJ1Y3RzIGludG8gYQorLy8vIHN0cmVhbSBvZiBieXRlcy4KKy8vLworLy8vIFRoaXMgdHJhaXQgZG9lcyBub3QgZGVhbCB3aXRoIGhpZ2hlci1sZXZlbCBUaHJpZnQgY29uY2VwdHMgbGlrZSBzdHJ1Y3RzIG9yCisvLy8gZXhjZXB0aW9ucyAtIG9ubHkgd2l0aCBwcmltaXRpdmVzIGFuZCBtZXNzYWdlIG9yIGNvbnRhaW5lciBib3VuZGFyaWVzLgorLy8vIFdyaXRlIG1ldGhvZHMgdGFrZSBhbiBpZGVudGlmaWVyIChmb3IgZXhhbXBsZSwgYFRNZXNzYWdlSWRlbnRpZmllcmApIG9yIGEKKy8vLyBwcmltaXRpdmUuIEFueSBvciBhbGwgb2YgdGhlIGZpZWxkcyBpbiBhbiBpZGVudGlmaWVyIG1heSBiZSBvbWl0dGVkIHdoZW4KKy8vLyB3cml0aW5nIHRvIHRoZSB0cmFuc3BvcnQuIFdyaXRlIG1ldGhvZHMgbWF5IGV2ZW4gYmUgbm9vcHMuIEFsbCBvZiB0aGlzIGlzCisvLy8gdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlcjsgYXMgbG9uZyBhcyBhIG1hdGNoaW5nIGBUSW5wdXRQcm90b2NvbGAKKy8vLyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLCByZWNlaXZlZCBtZXNzYWdlcyB3aWxsIGJlIGRlY29kZWQgY29ycmVjdGx5LgorLy8vCisvLy8gQWxsIG1ldGhvZHMgcmV0dXJuIGEgYHRocmlmdDo6UmVzdWx0YC4gSWYgYW4gYEVycmAgaXMgcmV0dXJuZWQgdGhlIHByb3RvY29sCisvLy8gaW5zdGFuY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzaG91bGQgYmUgdGVybWluYXRlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRPdXRwdXRQcm90b2NvbGAKKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBURmllbGRJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRUeXBlfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInN0cmluZ190aGluZyIsIFRUeXBlOjpTdHJpbmcsIDEpKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoImZvbyIpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8vIGBgYAorcHViIHRyYWl0IFRPdXRwdXRQcm90b2NvbCB7CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IGZpZWxkLgorICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBmaWVsZC4KKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgU1RPUCBmaWVsZCBpbmRpY2F0aW5nIHRoYXQgYWxsIHRoZSBmaWVsZHMgaW4gYSBzdHJ1Y3QgaGF2ZSBiZWVuCisgICAgLy8vIHdyaXR0ZW4uCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBib29sLgorICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgZml4ZWQtbGVuZ3RoIGJ5dGUgYXJyYXkuCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhbiA4LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgNjQtYml0IGZsb2F0LgorICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGZpeGVkLWxlbmd0aCBzdHJpbmcuCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIHNldC4KKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgbWFwLgorICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIEZsdXNoIGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKworICAgIC8vIHV0aWxpdHkgKERPIE5PVCBVU0UgSU4gR0VORVJBVEVEIENPREUhISEhKQorICAgIC8vCisKKyAgICAvLy8gV3JpdGUgYW4gdW5zaWduZWQgYnl0ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkICoqbmV2ZXIqKiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLgorICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+OyAvLyBGSVhNRTogUkVNT1ZFCit9CisKK2ltcGw8UD4gVElucHV0UHJvdG9jb2wgZm9yIEJveDxQPgord2hlcmUKKyAgICBQOiBUSW5wdXRQcm90b2NvbCArID9TaXplZCwKK3sKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tZXNzYWdlX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RydWN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZmllbGRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ib29sKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2J5dGVzKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pOCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pMTYoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTMyKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICAoKipzZWxmKS5yZWFkX2k2NCgpCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9kb3VibGUoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RyaW5nKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9saXN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX3NldF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWFwX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYnl0ZSgpCisgICAgfQorfQorCitpbXBsPFA+IFRPdXRwdXRQcm90b2NvbCBmb3IgQm94PFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCArID9TaXplZCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWVzc2FnZV9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RydWN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfc3RvcCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2Jvb2woYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ieXRlcyhiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2k4KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pMTYoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2kzMihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTY0KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9kb3VibGUoZCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJpbmcocykKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbGlzdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc2V0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWFwX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikuZmx1c2goKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYnl0ZShiKQorICAgIH0KK30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgc2VydmVycyB0byBjcmVhdGUgYFRJbnB1dFByb3RvY29sYCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRJbnB1dFByb3RvY29sRmFjdG9yeWAgYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBgVElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRJbnB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgZmFjdG9yeSA9IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisvLy8gbGV0IHByb3RvY29sID0gZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcoY2hhbm5lbCkpOworLy8vIGBgYAorcHViIHRyYWl0IFRJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8gQ3JlYXRlIGEgYFRJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZSh0cmFuc3BvcnQpCisgICAgfQorfQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNyZWF0ZSBgVE91dHB1dFByb3RvY29sYCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbEZhY3RvcnlgIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IGZhY3RvcnkgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKy8vLyBsZXQgcHJvdG9jb2wgPSBmYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhjaGFubmVsKSk7CisvLy8gYGBgCitwdWIgdHJhaXQgVE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVE91dHB1dFByb3RvY29sRmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUodHJhbnNwb3J0KQorICAgIH0KK30KKworLy8vIFRocmlmdCBtZXNzYWdlIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgIC8vLyBTZXJ2aWNlIGNhbGwgdGhlIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHB1YiBuYW1lOiBTdHJpbmcsCisgICAgLy8vIE1lc3NhZ2UgdHlwZS4KKyAgICBwdWIgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUsCisgICAgLy8vIE9yZGVyZWQgc2VxdWVuY2UgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSBtZXNzYWdlLgorICAgIHB1YiBzZXF1ZW5jZV9udW1iZXI6IGkzMiwKK30KKworaW1wbCBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVE1lc3NhZ2VJZGVudGlmaWVyYCBmb3IgYSBUaHJpZnQgc2VydmljZS1jYWxsIG5hbWVkIGBuYW1lYAorICAgIC8vLyB3aXRoIG1lc3NhZ2UgdHlwZSBgbWVzc2FnZV90eXBlYCBhbmQgc2VxdWVuY2UgbnVtYmVyIGBzZXF1ZW5jZV9udW1iZXJgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PigKKyAgICAgICAgbmFtZTogUywKKyAgICAgICAgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgIHNlcXVlbmNlX251bWJlcjogaTMyLAorICAgICkgLT4gVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IG5hbWUuaW50bygpLAorICAgICAgICAgICAgbWVzc2FnZV90eXBlOiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICBzZXF1ZW5jZV9udW1iZXI6IHNlcXVlbmNlX251bWJlciwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzdHJ1Y3QgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgZW5jb2RlZCBUaHJpZnQgc3RydWN0LgorICAgIHB1YiBuYW1lOiBTdHJpbmcsCit9CisKK2ltcGwgVFN0cnVjdElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVFN0cnVjdElkZW50aWZpZXJgIGZvciBhIHN0cnVjdCBuYW1lZCBgbmFtZWAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KG5hbWU6IFMpIC0+IFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAgICAgVFN0cnVjdElkZW50aWZpZXIgeyBuYW1lOiBuYW1lLmludG8oKSB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IGZpZWxkIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBURmllbGRJZGVudGlmaWVyIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgVGhyaWZ0IGZpZWxkLgorICAgIC8vLworICAgIC8vLyBgTm9uZWAgaWYgaXQncyBub3Qgc2VudCBvdmVyIHRoZSB3aXJlLgorICAgIHB1YiBuYW1lOiBPcHRpb248U3RyaW5nPiwKKyAgICAvLy8gRmllbGQgdHlwZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtYXkgYmUgYSBwcmltaXRpdmUsIGNvbnRhaW5lciwgb3IgYSBzdHJ1Y3QuCisgICAgcHViIGZpZWxkX3R5cGU6IFRUeXBlLAorICAgIC8vLyBUaHJpZnQgZmllbGQgaWQuCisgICAgLy8vCisgICAgLy8vIGBOb25lYCBvbmx5IGlmIGBmaWVsZF90eXBlYCBpcyBgVFR5cGU6OlN0b3BgLgorICAgIHB1YiBpZDogT3B0aW9uPGkxNj4sCit9CisKK2ltcGwgVEZpZWxkSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBURmllbGRJZGVudGlmaWVyYCBmb3IgYSBmaWVsZCBuYW1lZCBgbmFtZWAgd2l0aCB0eXBlCisgICAgLy8vIGBmaWVsZF90eXBlYCBhbmQgZmllbGQgaWQgYGlkYC4KKyAgICAvLy8KKyAgICAvLy8gYGlkYCBzaG91bGQgYmUgYE5vbmVgIGlmIGBmaWVsZF90eXBlYCBpcyBgVFR5cGU6OlN0b3BgLgorICAgIHB1YiBmbiBuZXc8TiwgUywgST4obmFtZTogTiwgZmllbGRfdHlwZTogVFR5cGUsIGlkOiBJKSAtPiBURmllbGRJZGVudGlmaWVyCisgICAgd2hlcmUKKyAgICAgICAgTjogSW50bzxPcHRpb248Uz4+LAorICAgICAgICBTOiBJbnRvPFN0cmluZz4sCisgICAgICAgIEk6IEludG88T3B0aW9uPGkxNj4+LAorICAgIHsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBuYW1lLmludG8oKS5tYXAofG58IG4uaW50bygpKSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkX3R5cGUsCisgICAgICAgICAgICBpZDogaWQuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IGxpc3QgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRMaXN0SWRlbnRpZmllciB7CisgICAgLy8vIFR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgIHB1YiBlbGVtZW50X3R5cGU6IFRUeXBlLAorICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUTGlzdElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVExpc3RJZGVudGlmaWVyYCBmb3IgYSBsaXN0IHdpdGggYHNpemVgIGVsZW1lbnRzIG9mIHR5cGUKKyAgICAvLy8gYGVsZW1lbnRfdHlwZWAuCisgICAgcHViIGZuIG5ldyhlbGVtZW50X3R5cGU6IFRUeXBlLCBzaXplOiBpMzIpIC0+IFRMaXN0SWRlbnRpZmllciB7CisgICAgICAgIFRMaXN0SWRlbnRpZmllciB7CisgICAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc2V0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUU2V0SWRlbnRpZmllciB7CisgICAgLy8vIFR5cGUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgICAgcHViIGVsZW1lbnRfdHlwZTogVFR5cGUsCisgICAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVFNldElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVFNldElkZW50aWZpZXJgIGZvciBhIHNldCB3aXRoIGBzaXplYCBlbGVtZW50cyBvZiB0eXBlCisgICAgLy8vIGBlbGVtZW50X3R5cGVgLgorICAgIHB1YiBmbiBuZXcoZWxlbWVudF90eXBlOiBUVHlwZSwgc2l6ZTogaTMyKSAtPiBUU2V0SWRlbnRpZmllciB7CisgICAgICAgIFRTZXRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudF90eXBlLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBtYXAgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRNYXBJZGVudGlmaWVyIHsKKyAgICAvLy8gTWFwIGtleSB0eXBlLgorICAgIHB1YiBrZXlfdHlwZTogT3B0aW9uPFRUeXBlPiwKKyAgICAvLy8gTWFwIHZhbHVlIHR5cGUuCisgICAgcHViIHZhbHVlX3R5cGU6IE9wdGlvbjxUVHlwZT4sCisgICAgLy8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtYXAuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUTWFwSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTWFwSWRlbnRpZmllcmAgZm9yIGEgbWFwIHdpdGggYHNpemVgIGVudHJpZXMgb2YgdHlwZQorICAgIC8vLyBga2V5X3R5cGUgLT4gdmFsdWVfdHlwZWAuCisgICAgcHViIGZuIG5ldzxLLCBWPihrZXlfdHlwZTogSywgdmFsdWVfdHlwZTogViwgc2l6ZTogaTMyKSAtPiBUTWFwSWRlbnRpZmllcgorICAgIHdoZXJlCisgICAgICAgIEs6IEludG88T3B0aW9uPFRUeXBlPj4sCisgICAgICAgIFY6IEludG88T3B0aW9uPFRUeXBlPj4sCisgICAgeworICAgICAgICBUTWFwSWRlbnRpZmllciB7CisgICAgICAgICAgICBrZXlfdHlwZToga2V5X3R5cGUuaW50bygpLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogdmFsdWVfdHlwZS5pbnRvKCksCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1lc3NhZ2UgdHlwZXMuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVE1lc3NhZ2VUeXBlIHsKKyAgICAvLy8gU2VydmljZS1jYWxsIHJlcXVlc3QuCisgICAgQ2FsbCwKKyAgICAvLy8gU2VydmljZS1jYWxsIHJlc3BvbnNlLgorICAgIFJlcGx5LAorICAgIC8vLyBVbmV4cGVjdGVkIGVycm9yIGluIHRoZSByZW1vdGUgc2VydmljZS4KKyAgICBFeGNlcHRpb24sCisgICAgLy8vIE9uZS13YXkgc2VydmljZS1jYWxsIHJlcXVlc3QgKG5vIHJlc3BvbnNlIGlzIGV4cGVjdGVkKS4KKyAgICBPbmVXYXksCit9CisKK2ltcGwgRGlzcGxheSBmb3IgVE1lc3NhZ2VUeXBlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCA9PiB3cml0ZSEoZiwgIkNhbGwiKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHkgPT4gd3JpdGUhKGYsICJSZXBseSIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24gPT4gd3JpdGUhKGYsICJFeGNlcHRpb24iKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IHdyaXRlIShmLCAiT25lV2F5IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxUTWVzc2FnZVR5cGU+IGZvciB1OCB7CisgICAgZm4gZnJvbShtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSkgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIG1lc3NhZ2VfdHlwZSB7CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgPT4gMHgwMSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UmVwbHkgPT4gMHgwMiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uID0+IDB4MDMsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiAweDA0LAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRyeUZyb208dTg+IGZvciBUTWVzc2FnZVR5cGUgeworICAgIHR5cGUgRXJyID0gOjpFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShiOiB1OCkgLT4gOjpSZXN1bHQ8U2VsZj4geworICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgIDB4MDEgPT4gT2soVE1lc3NhZ2VUeXBlOjpDYWxsKSwKKyAgICAgICAgICAgIDB4MDIgPT4gT2soVE1lc3NhZ2VUeXBlOjpSZXBseSksCisgICAgICAgICAgICAweDAzID0+IE9rKFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uKSwKKyAgICAgICAgICAgIDB4MDQgPT4gT2soVE1lc3NhZ2VUeXBlOjpPbmVXYXkpLAorICAgICAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRNZXNzYWdlVHlwZSIsIHVua24pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHN0cnVjdC1maWVsZCB0eXBlcy4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUVHlwZSB7CisgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHNlcmlhbGl6ZWQgZmllbGRzIGluIHRoaXMgVGhyaWZ0IHN0cnVjdC4KKyAgICBTdG9wLAorICAgIC8vLyBWb2lkIChgKClgKSBmaWVsZC4KKyAgICBWb2lkLAorICAgIC8vLyBCb29sZWFuLgorICAgIEJvb2wsCisgICAgLy8vIFNpZ25lZCA4LWJpdCBpbnQuCisgICAgSTA4LAorICAgIC8vLyBEb3VibGUtcHJlY2lzaW9uIG51bWJlci4KKyAgICBEb3VibGUsCisgICAgLy8vIFNpZ25lZCAxNi1iaXQgaW50LgorICAgIEkxNiwKKyAgICAvLy8gU2lnbmVkIDMyLWJpdCBpbnQuCisgICAgSTMyLAorICAgIC8vLyBTaWduZWQgNjQtYml0IGludC4KKyAgICBJNjQsCisgICAgLy8vIFVURi04IHN0cmluZy4KKyAgICBTdHJpbmcsCisgICAgLy8vIFVURi03IHN0cmluZy4gKlVuc3VwcG9ydGVkKi4KKyAgICBVdGY3LAorICAgIC8vLyBUaHJpZnQgc3RydWN0LgorICAgIFN0cnVjdCwKKyAgICAvLy8gTWFwLgorICAgIE1hcCwKKyAgICAvLy8gU2V0LgorICAgIFNldCwKKyAgICAvLy8gTGlzdC4KKyAgICBMaXN0LAorICAgIC8vLyBVVEYtOCBzdHJpbmcuCisgICAgVXRmOCwKKyAgICAvLy8gVVRGLTE2IHN0cmluZy4gKlVuc3VwcG9ydGVkKi4KKyAgICBVdGYxNiwKK30KKworaW1wbCBEaXNwbGF5IGZvciBUVHlwZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiB3cml0ZSEoZiwgIlNUT1AiKSwKKyAgICAgICAgICAgIFRUeXBlOjpWb2lkID0+IHdyaXRlIShmLCAidm9pZCIpLAorICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4gd3JpdGUhKGYsICJib29sIiksCisgICAgICAgICAgICBUVHlwZTo6STA4ID0+IHdyaXRlIShmLCAiaTA4IiksCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlID0+IHdyaXRlIShmLCAiZG91YmxlIiksCisgICAgICAgICAgICBUVHlwZTo6STE2ID0+IHdyaXRlIShmLCAiaTE2IiksCisgICAgICAgICAgICBUVHlwZTo6STMyID0+IHdyaXRlIShmLCAiaTMyIiksCisgICAgICAgICAgICBUVHlwZTo6STY0ID0+IHdyaXRlIShmLCAiaTY0IiksCisgICAgICAgICAgICBUVHlwZTo6U3RyaW5nID0+IHdyaXRlIShmLCAic3RyaW5nIiksCisgICAgICAgICAgICBUVHlwZTo6VXRmNyA9PiB3cml0ZSEoZiwgIlVURjciKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gd3JpdGUhKGYsICJzdHJ1Y3QiKSwKKyAgICAgICAgICAgIFRUeXBlOjpNYXAgPT4gd3JpdGUhKGYsICJtYXAiKSwKKyAgICAgICAgICAgIFRUeXBlOjpTZXQgPT4gd3JpdGUhKGYsICJzZXQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpMaXN0ID0+IHdyaXRlIShmLCAibGlzdCIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjggPT4gd3JpdGUhKGYsICJVVEY4IiksCisgICAgICAgICAgICBUVHlwZTo6VXRmMTYgPT4gd3JpdGUhKGYsICJVVEYxNiIpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZAorLy8vIG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKGV4cGVjdGVkOiBpMzIsIGFjdHVhbDogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBzZXJ2aWNlLWNhbGwgbmFtZSBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkCisvLy8gc2VydmljZS1jYWxsIG5hbWUgYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGwoZXhwZWN0ZWQ6ICZzdHIsIGFjdHVhbDogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBtZXNzYWdlIHR5cGUgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZCBtZXNzYWdlIHR5cGUKKy8vLyBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZShleHBlY3RlZDogVE1lc3NhZ2VUeXBlLCBhY3R1YWw6IFRNZXNzYWdlVHlwZSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImV4cGVjdGVkIHt9IGdvdCB7fSIsIGV4cGVjdGVkLCBhY3R1YWwpLAorICAgICAgICB9KSkKKyAgICB9Cit9CisKKy8vLyBDaGVjayBpZiBhIHJlcXVpcmVkIFRocmlmdCBzdHJ1Y3QgZmllbGQgZXhpc3RzLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgaXQgZG9lcywgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHM8VD4oZmllbGRfbmFtZTogJnN0ciwgZmllbGQ6ICZPcHRpb248VD4pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgbWF0Y2ggKmZpZWxkIHsKKyAgICAgICAgU29tZShfKSA9PiBPaygoKSksCisgICAgICAgIE5vbmUgPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgibWlzc2luZyByZXF1aXJlZCBmaWVsZCB7fSIsIGZpZWxkX25hbWUpLAorICAgICAgICB9KSksCisgICAgfQorfQorCisvLy8gRXh0cmFjdCB0aGUgZmllbGQgaWQgZnJvbSBhIFRocmlmdCBmaWVsZCBpZGVudGlmaWVyLgorLy8vCisvLy8gYGZpZWxkX2lkZW50YCBtdXN0ICpub3QqIGhhdmUgYFRGaWVsZElkZW50aWZpZXIuZmllbGRfdHlwZWAgb2YgdHlwZSBgVFR5cGU6OlN0b3BgLgorLy8vCisvLy8gUmV0dXJuIGBURmllbGRJZGVudGlmaWVyLmlkYCBpZiBhbiBpZCBleGlzdHMsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiBmaWVsZF9pZChmaWVsZF9pZGVudDogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PGkxNj4geworICAgIGZpZWxkX2lkZW50LmlkLm9rX29yX2Vsc2UofHwgeworICAgICAgICA6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIm1pc3NpbmcgZmllbGQgaW4gaW4gezo/fSIsIGZpZWxkX2lkZW50KSwKKyAgICAgICAgfSkKKyAgICB9KQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjppbzo6Q3Vyc29yOworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfaW5wdXRfcHJvdG9jb2xfZnJvbV9jb25jcmV0ZV9pbnB1dF9wcm90b2NvbCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocik7CisgICAgICAgIHRha2VzX2lucHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX2lucHV0X3Byb3RvY29sX2Zyb21fYm94ZWRfaW5wdXQoKSB7CisgICAgICAgIGxldCByOiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRJbnB1dFByb3RvY29sPiA9IEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHIpKTsKKyAgICAgICAgdGFrZXNfaW5wdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfb3V0cHV0X3Byb3RvY29sX2Zyb21fY29uY3JldGVfb3V0cHV0X3Byb3RvY29sKCkgeworICAgICAgICBsZXQgdzogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHcpOworICAgICAgICB0YWtlc19vdXRwdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfb3V0cHV0X3Byb3RvY29sX2Zyb21fYm94ZWRfb3V0cHV0KCkgeworICAgICAgICBsZXQgdzogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VE91dHB1dFByb3RvY29sPiA9IEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3KSk7CisgICAgICAgIHRha2VzX291dHB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgZm4gdGFrZXNfaW5wdXRfcHJvdG9jb2w8Uj4odDogJm11dCBSKQorICAgIHdoZXJlCisgICAgICAgIFI6IFRJbnB1dFByb3RvY29sLAorICAgIHsKKyAgICAgICAgdC5yZWFkX2J5dGUoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICBmbiB0YWtlc19vdXRwdXRfcHJvdG9jb2w8Vz4odDogJm11dCBXKQorICAgIHdoZXJlCisgICAgICAgIFc6IFRPdXRwdXRQcm90b2NvbCwKKyAgICB7CisgICAgICAgIHQuZmx1c2goKS51bndyYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVlNDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycwpAQCAtMCwwICsxLDIzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKKyAgICBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwKK307CisKKy8vLyBgVE91dHB1dFByb3RvY29sYCB0aGF0IHByZWZpeGVzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gYWxsIG91dGdvaW5nIFRocmlmdAorLy8vIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgIHNob3VsZCBiZSB1c2VkIHdoZW4gbXVsdGlwbGUgVGhyaWZ0IHNlcnZpY2VzCisvLy8gc2VuZCBtZXNzYWdlcyBvdmVyIGEgc2luZ2xlIEkvTyBjaGFubmVsLiBCeSBwcmVmaXhpbmcgc2VydmljZSBpZGVudGlmaWVycworLy8vIHRvIG91dGdvaW5nIG1lc3NhZ2VzIHJlY2VpdmVycyBhcmUgYWJsZSB0byBkZW11eCB0aGVtIGFuZCByb3V0ZSB0aGVtIHRvIHRoZQorLy8vIGFwcHJvcHJpYXRlIHNlcnZpY2UgcHJvY2Vzc29yLiBSdXN0IHJlY2VpdmVycyBtdXN0IHVzZSBhIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgCisvLy8gdG8gcHJvY2VzcyBpbmNvbWluZyBtZXNzYWdlcywgd2hpbGUgb3RoZXIgbGFuZ3VhZ2VzIG11c3QgdXNlIHRoZWlyCisvLy8gY29ycmVzcG9uZGluZyBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb25zLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2VydmljZSBgVGVzdFNlcnZpY2VgIGFuZCBhIHNlcnZpY2UgY2FsbCBgdGVzdF9jYWxsYCwKKy8vLyB0aGlzIGltcGxlbWVudGF0aW9uIHdvdWxkIGlkZW50aWZ5IG1lc3NhZ2VzIGFzIG9yaWdpbmF0aW5nIGZyb20KKy8vLyBgVGVzdFNlcnZpY2U6dGVzdF9jYWxsYC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KCJzZXJ2aWNlX25hbWUiLCBwcm90b2NvbCk7CisvLy8KKy8vLyBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic3ZjX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworLy8vIHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIHNlcnZpY2VfbmFtZTogU3RyaW5nLAorICAgIGlubmVyOiBQLAorfQorCitpbXBsPFA+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYCB0aGF0IGlkZW50aWZpZXMgb3V0Z29pbmcgbWVzc2FnZXMKKyAgICAvLy8gYXMgb3JpZ2luYXRpbmcgZnJvbSBhIHNlcnZpY2UgbmFtZWQgYHNlcnZpY2VfbmFtZWAgYW5kIHNlbmRzIHRoZW0gb3ZlcgorICAgIC8vLyB0aGUgYHdyYXBwZWRgIGBUT3V0cHV0UHJvdG9jb2xgLiBPdXRnb2luZyBtZXNzYWdlcyBhcmUgZW5jb2RlZCBhbmQgc2VudAorICAgIC8vLyBieSBgd3JhcHBlZGAsIG5vdCBieSB0aGlzIGluc3RhbmNlLgorICAgIHB1YiBmbiBuZXcoc2VydmljZV9uYW1lOiAmc3RyLCB3cmFwcGVkOiBQKSAtPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPiB7CisgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHNlcnZpY2VfbmFtZTogc2VydmljZV9uYW1lLnRvX293bmVkKCksCisgICAgICAgICAgICBpbm5lcjogd3JhcHBlZCwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRklYTUU6IGF2b2lkIHBhc3N0aHJvdWdoIG1ldGhvZHMKK2ltcGw8UD4gVE91dHB1dFByb3RvY29sIGZvciBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIGlkZW50aWZpZXIubWVzc2FnZV90eXBlIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gb3ZlcnJpZGUgaWRlbnRpZmllciBoZXJlPworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsIHwgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4geworICAgICAgICAgICAgICAgIGxldCBpZGVudGlmaWVyID0gVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZTogZm9ybWF0ISgie306e30iLCBzZWxmLnNlcnZpY2VfbmFtZSwgaWRlbnRpZmllci5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgLi4qaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudGlmaWVyKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfYmVnaW4oaWRlbnRpZmllciksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJ1Y3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX3N0b3AoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYnl0ZXMoYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ib29sKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pOChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pMTYoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTMyKGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2k2NChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9kb3VibGUoZCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cmluZyhzKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2xpc3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zZXRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWFwX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLmZsdXNoKCkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ieXRlKGIpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworICAgIHVzZSB0cmFuc3BvcnQ6OntUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fd2l0aF9wcmVmaXhlZF9zZXJ2aWNlX25hbWUoKSB7CisgICAgICAgIGxldCBtdXQgb19wcm90ID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImJhciIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTldID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsIC8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLCAvKiBtZXNzYWdlIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDcsCisgICAgICAgICAgICAweDY2LAorICAgICAgICAgICAgMHg2RiwKKyAgICAgICAgICAgIDB4NkYsIC8qICJmb28iICovCisgICAgICAgICAgICAweDNBLCAvKiAiOiIgKi8KKyAgICAgICAgICAgIDB4NjIsCisgICAgICAgICAgICAweDYxLAorICAgICAgICAgICAgMHg3MiwgLyogImJhciIgKi8KKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDIgLyogc2VxdWVuY2UgbnVtYmVyICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcSEob19wcm90LmlubmVyLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKCkgLT4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8VEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+PgorICAgIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0MCwgNDApOworICAgICAgICBsZXQgKF8sIHdfY2hhbikgPSBjLnNwbGl0KCkudW53cmFwKCk7CisgICAgICAgIGxldCBwcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19jaGFuLCB0cnVlKTsKKyAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldygiZm9vIiwgcHJvdCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTU5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycwpAQCAtMCwwICsxLDE5NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwKK307Cit1c2UgUHJvdG9jb2xFcnJvcktpbmQ7CisKKy8vLyBgVElucHV0UHJvdG9jb2xgIHJlcXVpcmVkIHRvIHVzZSBhIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCByZWFkcyBpbmNvbWluZyBtZXNzYWdlIGlkZW50aWZpZXJzIHRvIGRldGVybWluZSB0bworLy8vIHdoaWNoIGBUUHJvY2Vzc29yYCByZXF1ZXN0cyBzaG91bGQgYmUgZm9yd2FyZGVkLiBIb3dldmVyLCBvbmNlIHJlYWQsIHRob3NlCisvLy8gbWVzc2FnZSBpZGVudGlmaWVyIGJ5dGVzIGFyZSBubyBsb25nZXIgb24gdGhlIHdpcmUuIFNpbmNlIGRvd25zdHJlYW0KKy8vLyBwcm9jZXNzb3JzIGV4cGVjdCB0byByZWFkIG1lc3NhZ2UgaWRlbnRpZmllcnMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wKKy8vLyB3ZSBuZWVkIHNvbWUgd2F5IG9mIHN1cHBseWluZyBhIGBUTWVzc2FnZUlkZW50aWZpZXJgIHdpdGggdGhlIHNlcnZpY2UtbmFtZQorLy8vIHN0cmlwcGVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHN0b3JlcyB0aGUgcmVjZWl2ZWQgYFRNZXNzYWdlSWRlbnRpZmllcmAKKy8vLyAod2l0aG91dCB0aGUgc2VydmljZSBuYW1lKSBhbmQgcGFzc2VzIGl0IHRvIHRoZSB3cmFwcGVkIGBUSW5wdXRQcm90b2NvbGAKKy8vLyB3aGVuIGBUSW5wdXRQcm90b2NvbDo6cmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgIGlzIGNhbGxlZC4gSXQgZGVsZWdhdGVzIGFsbAorLy8vIG90aGVyIGNhbGxzIGRpcmVjdGx5IHRvIHRoZSB3cmFwcGVkIGBUSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBUaGlzIHR5cGUgKipzaG91bGQgbm90KiogYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBjb2RlLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVFN0b3JlZElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRTdG9yZWRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gLy8gc2FtcGxlIHByb2Nlc3NvcgorLy8vIHN0cnVjdCBBY3R1YWxQcm9jZXNzb3I7CisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBBY3R1YWxQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKAorLy8vICAgICAgICAgJnNlbGYsCisvLy8gICAgICAgICBfOiAmbXV0IFRJbnB1dFByb3RvY29sLAorLy8vICAgICAgICAgXzogJm11dCBUT3V0cHV0UHJvdG9jb2wKKy8vLyAgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKQorLy8vICAgICB9CisvLy8gfQorLy8vIGxldCBwcm9jZXNzb3IgPSBBY3R1YWxQcm9jZXNzb3Ige307CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCB0cmFuc3BvcnQKKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IChpX2NoYW4sIG9fY2hhbikgPSBjaGFubmVsLnNwbGl0KCkudW53cmFwKCk7CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIGFjdHVhbCBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scworLy8vIGxldCBtdXQgaV9wcm90ID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX2NoYW4sIHRydWUpOworLy8vIGxldCBtdXQgb19wcm90ID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob19jaGFuLCB0cnVlKTsKKy8vLworLy8vIC8vIG1lc3NhZ2UgaWRlbnRpZmllciByZWNlaXZlZCBmcm9tIHJlbW90ZSBhbmQgbW9kaWZpZWQgdG8gcmVtb3ZlIHRoZSBzZXJ2aWNlIG5hbWUKKy8vLyBsZXQgbmV3X21zZ19pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBwcm94eSBpbnB1dCBwcm90b2NvbAorLy8vIGxldCBtdXQgcHJveHlfaV9wcm90ID0gVFN0b3JlZElucHV0UHJvdG9jb2w6Om5ldygmbXV0IGlfcHJvdCwgbmV3X21zZ19pZGVudCk7CisvLy8gbGV0IHJlcyA9IHByb2Nlc3Nvci5wcm9jZXNzKCZtdXQgcHJveHlfaV9wcm90LCAmbXV0IG9fcHJvdCk7CisvLy8gYGBgCisvLyBGSVhNRTogaW1wbGVtZW50IERlYnVnCitwdWIgc3RydWN0IFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgaW5uZXI6ICYnYSBtdXQgVElucHV0UHJvdG9jb2wsCisgICAgbWVzc2FnZV9pZGVudDogT3B0aW9uPFRNZXNzYWdlSWRlbnRpZmllcj4sCit9CisKK2ltcGw8J2E+IFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgLy8vIENyZWF0ZSBhIGBUU3RvcmVkSW5wdXRQcm90b2NvbGAgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNhbGxzIG90aGVyIHRoYW4KKyAgICAvLy8gYFRJbnB1dFByb3RvY29sOjpyZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAgdG8gYSBgd3JhcHBlZGAKKyAgICAvLy8gYFRJbnB1dFByb3RvY29sYC4gYG1lc3NhZ2VfaWRlbnRgIGlzIHRoZSBtb2RpZmllZCBtZXNzYWdlIGlkZW50aWZpZXIgLQorICAgIC8vLyB3aXRoIHNlcnZpY2UgbmFtZSBzdHJpcHBlZCAtIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAvLy8gYHdyYXBwZWQucmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgLgorICAgIHB1YiBmbiBuZXcoCisgICAgICAgIHdyYXBwZWQ6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgICAgIG1lc3NhZ2VfaWRlbnQ6IFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICApIC0+IFRTdG9yZWRJbnB1dFByb3RvY29sIHsKKyAgICAgICAgVFN0b3JlZElucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgaW5uZXI6IHdyYXBwZWQsCisgICAgICAgICAgICBtZXNzYWdlX2lkZW50OiBtZXNzYWdlX2lkZW50LmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDwnYT4gVElucHV0UHJvdG9jb2wgZm9yIFRTdG9yZWRJbnB1dFByb3RvY29sPCdhPiB7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYubWVzc2FnZV9pZGVudC50YWtlKCkub2tfb3JfZWxzZSh8fCB7CisgICAgICAgICAgICA6OmVycm9yczo6bmV3X3Byb3RvY29sX2Vycm9yKAorICAgICAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIGlkZW50aWZpZXIgYWxyZWFkeSByZWFkIiwKKyAgICAgICAgICAgICkKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cnVjdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9maWVsZF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYnl0ZXMoKQorICAgIH0KKworICAgIGZuIHJlYWRfYm9vbCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2Jvb2woKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTgoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pMTYoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pMzIoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pNjQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9kb3VibGUoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJpbmcoKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbGlzdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc2V0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWFwX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWFwX2VuZCgpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYnl0ZSgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjM4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMKQEAgLTAsMCArMSwxMjQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gaW1wbGVtZW50IGEgVGhyaWZ0IHNlcnZlci4KKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OwordXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKK21vZCBtdWx0aXBsZXhlZDsKK21vZCB0aHJlYWRlZDsKKworcHViIHVzZSBzZWxmOjptdWx0aXBsZXhlZDo6VE11bHRpcGxleGVkUHJvY2Vzc29yOworcHViIHVzZSBzZWxmOjp0aHJlYWRlZDo6VFNlcnZlcjsKKworLy8vIEhhbmRsZXMgaW5jb21pbmcgVGhyaWZ0IG1lc3NhZ2VzIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIHVzZXItZGVmaW5lZAorLy8vIGhhbmRsZXIgZnVuY3Rpb25zLgorLy8vCisvLy8gQW4gaW1wbGVtZW50YXRpb24gaXMgYXV0by1nZW5lcmF0ZWQgZm9yIGVhY2ggVGhyaWZ0IHNlcnZpY2UuIFdoZW4gdXNlZCBieSBhCisvLy8gc2VydmVyIChmb3IgZXhhbXBsZSwgYSBgVFNpbXBsZVNlcnZlcmApLCBpdCB3aWxsIGRlbXV4IGluY29taW5nIHNlcnZpY2UKKy8vLyBjYWxscyBhbmQgaW52b2tlIHRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBoYW5kbGVyIGZ1bmN0aW9uLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCBzdGFydCBhIHNlcnZlciB1c2luZyB0aGUgYXV0by1nZW5lcmF0ZWQgYFRQcm9jZXNzb3JgIGZvcgorLy8vIGEgVGhyaWZ0IHNlcnZpY2UgYFNpbXBsZVNlcnZpY2VgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsKKy8vLworLy8vIC8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQKKy8vLyAvLworLy8vCisvLy8gLy8gcHJvY2Vzc29yIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIG5ldzxIOiBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXI+KHByb2Nlc3NvcjogSCkgLT4gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbiBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIHNlcnZpY2UgZnVuY3Rpb25zIGZvciBTaW1wbGVTZXJ2aWNlCisvLy8gdHJhaXQgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT47CisvLy8gfQorLy8vCisvLy8gLy8KKy8vLyAvLyB1c2VyLWNvZGUgZm9sbG93cworLy8vIC8vCisvLy8KKy8vLyAvLyBkZWZpbmUgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gYHNlcnZpY2VfY2FsbGAgaXMgcmVjZWl2ZWQKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIGZvciBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvcgorLy8vIGxldCBwcm9jZXNzb3IgPSBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7fSk7CisvLy8KKy8vLyAvLyBhdCB0aGlzIHBvaW50IHlvdSBjYW4gcGFzcyB0aGUgcHJvY2Vzc29yIHRvIHRoZSBzZXJ2ZXIKKy8vLyAvLyBsZXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KC4uLiwgcHJvY2Vzc29yKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUUHJvY2Vzc29yIHsKKyAgICAvLy8gUHJvY2VzcyBhIFRocmlmdCBzZXJ2aWNlIGNhbGwuCisgICAgLy8vCisgICAgLy8vIFJlYWRzIGFyZ3VtZW50cyBmcm9tIGBpYCwgZXhlY3V0ZXMgdGhlIHVzZXIncyBoYW5kbGVyIGNvZGUsIGFuZCB3cml0ZXMKKyAgICAvLy8gdGhlIHJlc3BvbnNlIHRvIGBvYC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBgKClgIGlmIHRoZSBoYW5kbGVyIHdhcyBleGVjdXRlZDsgYEVycmAgb3RoZXJ3aXNlLgorICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT47Cit9CisKKy8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB1c2VkIGluIGdlbmVyYXRlZCBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb25zIHRvCisvLy8gcmV0dXJuIGFuIGBBcHBsaWNhdGlvbkVycm9yYCBpZiB0aHJpZnQgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWxlZC4KK3B1YiBmbiBoYW5kbGVfcHJvY2Vzc19yZXN1bHQoCisgICAgbXNnX2lkZW50OiAmVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgIHJlczogOjpSZXN1bHQ8KCk+LAorICAgIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wsCispIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgbGV0IEVycihlKSA9IHJlcyB7CisgICAgICAgIGxldCBlID0gbWF0Y2ggZSB7CisgICAgICAgICAgICA6OkVycm9yOjpBcHBsaWNhdGlvbihhKSA9PiBhLAorICAgICAgICAgICAgXyA9PiBBcHBsaWNhdGlvbkVycm9yOjpuZXcoQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sIGZvcm1hdCEoIns6P30iLCBlKSksCisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBtc2dfaWRlbnQubmFtZS5jbG9uZSgpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sCisgICAgICAgICAgICBtc2dfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICApOworCisgICAgICAgIG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCk/OworICAgICAgICA6OkVycm9yOjp3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woJmUsIG9fcHJvdCk/OworICAgICAgICBvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87CisgICAgICAgIG9fcHJvdC5mbHVzaCgpCisgICAgfSBlbHNlIHsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMgYi9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDMzNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMKQEAgLTAsMCArMSwzNTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6Zm10Ojp7RGVidWcsIEZvcm1hdHRlcn07Cit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07CisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFN0b3JlZElucHV0UHJvdG9jb2x9OworCit1c2Ugc3VwZXI6OntoYW5kbGVfcHJvY2Vzc19yZXN1bHQsIFRQcm9jZXNzb3J9OworCitjb25zdCBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVDogJidzdGF0aWMgc3RyID0KKyAgICAibWlzc2luZyBzZXJ2aWNlIHNlcGFyYXRvciBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3Igc2V0IjsKK3R5cGUgVGhyZWFkU2FmZVByb2Nlc3NvciA9IEJveDxUUHJvY2Vzc29yICsgU2VuZCArIFN5bmM+OworCisvLy8gQSBgVFByb2Nlc3NvcmAgdGhhdCBjYW4gZGVtdXggc2VydmljZSBjYWxscyB0byBtdWx0aXBsZSB1bmRlcmx5aW5nCisvLy8gVGhyaWZ0IHNlcnZpY2VzLgorLy8vCisvLy8gVXNlcnMgcmVnaXN0ZXIgc2VydmljZS1zcGVjaWZpYyBgVFByb2Nlc3NvcmAgaW5zdGFuY2VzIHdpdGggYQorLy8vIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgLCBhbmQgdGhlbiByZWdpc3RlciB0aGF0IHByb2Nlc3NvciB3aXRoIGEgc2VydmVyCisvLy8gaW1wbGVtZW50YXRpb24uIEZvbGxvd2luZyB0aGF0LCBhbGwgaW5jb21pbmcgc2VydmljZSBjYWxscyBhcmUgYXV0b21hdGljYWxseQorLy8vIHJvdXRlZCB0byB0aGUgc2VydmljZS1zcGVjaWZpYyBgVFByb2Nlc3NvcmAuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIGNhbiBvbmx5IGhhbmRsZSBtZXNzYWdlcyBzZW50IGJ5IGEKKy8vLyBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgc3RvcmVkOiBNdXRleDxTdG9yZWRQcm9jZXNzb3JzPiwKK30KKworI1tkZXJpdmUoRGVmYXVsdCldCitzdHJ1Y3QgU3RvcmVkUHJvY2Vzc29ycyB7CisgICAgcHJvY2Vzc29yczogSGFzaE1hcDxTdHJpbmcsIEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4sCisgICAgZGVmYXVsdF9wcm9jZXNzb3I6IE9wdGlvbjxBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+LAorfQorCitpbXBsIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCB3aXRoIG5vIHJlZ2lzdGVyZWQgc2VydmljZS1zcGVjaWZpYworICAgIC8vLyBwcm9jZXNzb3JzLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgICAgICAgICAgc3RvcmVkOiBNdXRleDo6bmV3KFN0b3JlZFByb2Nlc3NvcnMgeworICAgICAgICAgICAgICAgIHByb2Nlc3NvcnM6IEhhc2hNYXA6Om5ldygpLAorICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJvY2Vzc29yOiBOb25lLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlLXNwZWNpZmljIGBwcm9jZXNzb3JgIGZvciB0aGUgc2VydmljZSBuYW1lZAorICAgIC8vLyBgc2VydmljZV9uYW1lYC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGgKKyAgICAvLy8gbm9uLW11bHRpcGxleGVkIGNsaWVudHMuIFNldCBgYXNfZGVmYXVsdGAgdG8gYHRydWVgIHRvIGFsbG93CisgICAgLy8vIG5vbi1uYW1lc3BhY2VkIHJlcXVlc3RzIHRvIGJlIGRpc3BhdGNoZWQgdG8gYSBkZWZhdWx0IHByb2Nlc3Nvci4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyBzdWNjZXNzIGlmIGEgbmV3IGVudHJ5IHdhcyBpbnNlcnRlZC4gUmV0dXJucyBhbiBlcnJvciBpZjoKKyAgICAvLy8gKiBBIHByb2Nlc3NvciBleGlzdHMgZm9yIGBzZXJ2aWNlX25hbWVgCisgICAgLy8vICogWW91IGF0dGVtcHQgdG8gcmVnaXN0ZXIgYSBwcm9jZXNzb3IgYXMgZGVmYXVsdCwgYW5kIGFuIGV4aXN0aW5nIGRlZmF1bHQgZXhpc3RzCisgICAgI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KG1hcF9lbnRyeSkpXQorICAgIHB1YiBmbiByZWdpc3RlcjxTOiBJbnRvPFN0cmluZz4+KAorICAgICAgICAmbXV0IHNlbGYsCisgICAgICAgIHNlcnZpY2VfbmFtZTogUywKKyAgICAgICAgcHJvY2Vzc29yOiBCb3g8VFByb2Nlc3NvciArIFNlbmQgKyBTeW5jPiwKKyAgICAgICAgYXNfZGVmYXVsdDogYm9vbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtdXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworCisgICAgICAgIGxldCBuYW1lID0gc2VydmljZV9uYW1lLmludG8oKTsKKyAgICAgICAgaWYgIXN0b3JlZC5wcm9jZXNzb3JzLmNvbnRhaW5zX2tleSgmbmFtZSkgeworICAgICAgICAgICAgbGV0IHByb2Nlc3NvciA9IEFyYzo6bmV3KHByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgIGlmIGFzX2RlZmF1bHQgeworICAgICAgICAgICAgICAgIGlmIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5pc19ub25lKCkgeworICAgICAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5pbnNlcnQobmFtZSwgcHJvY2Vzc29yLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IgPSBTb21lKHByb2Nlc3Nvci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRXJyKCJjYW5ub3QgcmVzZXQgZGVmYXVsdCBwcm9jZXNzb3IiLmludG8oKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmluc2VydChuYW1lLCBwcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKGZvcm1hdCEoImNhbm5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgcHJvY2Vzc29yIGZvciBzZXJ2aWNlIHt9IiwgbmFtZSkuaW50bygpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcHJvY2Vzc19tZXNzYWdlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbXNnX2lkZW50OiAmVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICAgICBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsCisgICAgICAgIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgKHN2Y19uYW1lLCBzdmNfY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZtc2dfaWRlbnQubmFtZSk7CisgICAgICAgIGRlYnVnISgicm91dGluZyBzdmNfbmFtZSB7Oj99IHN2Y19jYWxsIHt9IiwgJnN2Y19uYW1lLCAmc3ZjX2NhbGwpOworCisgICAgICAgIGxldCBwcm9jZXNzb3I6IE9wdGlvbjxBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+ID0geworICAgICAgICAgICAgbGV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKG5hbWUpID0gc3ZjX25hbWUgeworICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmdldChuYW1lKS5jbG9uZWQoKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuY2xvbmUoKQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1hdGNoIHByb2Nlc3NvciB7CisgICAgICAgICAgICBTb21lKGFyYykgPT4geworICAgICAgICAgICAgICAgIGxldCBuZXdfbXNnX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIHN2Y19jYWxsLAorICAgICAgICAgICAgICAgICAgICBtc2dfaWRlbnQubWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICBtc2dfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgbGV0IG11dCBwcm94eV9pX3Byb3QgPSBUU3RvcmVkSW5wdXRQcm90b2NvbDo6bmV3KGlfcHJvdCwgbmV3X21zZ19pZGVudCk7CisgICAgICAgICAgICAgICAgKCphcmMpLnByb2Nlc3MoJm11dCBwcm94eV9pX3Byb3QsIG9fcHJvdCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4gRXJyKG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2Uoc3ZjX25hbWUpLmludG8oKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVFByb2Nlc3NvciBmb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBmbiBwcm9jZXNzKCZzZWxmLCBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtc2dfaWRlbnQgPSBpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCk/OworCisgICAgICAgIGRlYnVnISgicHJvY2VzcyBpbmNvbWluZyBtc2cgaWQ6ezo/fSIsICZtc2dfaWRlbnQpOworICAgICAgICBsZXQgcmVzID0gc2VsZi5wcm9jZXNzX21lc3NhZ2UoJm1zZ19pZGVudCwgaV9wcm90LCBvX3Byb3QpOworCisgICAgICAgIGhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgmbXNnX2lkZW50LCByZXMsIG9fcHJvdCkKKyAgICB9Cit9CisKK2ltcGwgRGVidWcgZm9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBsZXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworICAgICAgICB3cml0ZSEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIlRNdWx0aXBsZXhlZFByb2Nlc3Mge3sgcmVnaXN0ZXJlZF9jb3VudDogezo/fSBkZWZhdWx0OiB7Oj99IH19IiwKKyAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmtleXMoKS5sZW4oKSwKKyAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5pc19zb21lKCkKKyAgICAgICAgKQorICAgIH0KK30KKworZm4gc3BsaXRfaWRlbnRfbmFtZShpZGVudF9uYW1lOiAmc3RyKSAtPiAoT3B0aW9uPCZzdHI+LCAmc3RyKSB7CisgICAgaWRlbnRfbmFtZQorICAgICAgICAuZmluZCgnOicpCisgICAgICAgIC5tYXAofHBvc3wgeworICAgICAgICAgICAgbGV0IChzdmNfbmFtZSwgc3ZjX2NhbGwpID0gaWRlbnRfbmFtZS5zcGxpdF9hdChwb3MpOworICAgICAgICAgICAgbGV0IChfLCBzdmNfY2FsbCkgPSBzdmNfY2FsbC5zcGxpdF9hdCgxKTsgLy8gcmVtb3ZlIGNvbG9uIGZyb20gc2VydmljZSBjYWxsIG5hbWUKKyAgICAgICAgICAgIChTb21lKHN2Y19uYW1lKSwgc3ZjX2NhbGwpCisgICAgICAgIH0pCisgICAgICAgIC5vcl9lbHNlKHx8IFNvbWUoKE5vbmUsIGlkZW50X25hbWUpKSkKKyAgICAgICAgLnVud3JhcCgpCit9CisKK2ZuIG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2Uoc3ZjX25hbWU6IE9wdGlvbjwmc3RyPikgLT4gU3RyaW5nIHsKKyAgICBtYXRjaCBzdmNfbmFtZSB7CisgICAgICAgIFNvbWUobmFtZSkgPT4gZm9ybWF0ISgibm8gcHJvY2Vzc29yIGZvdW5kIGZvciBzZXJ2aWNlIHt9IiwgbmFtZSksCisgICAgICAgIE5vbmUgPT4gTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQudG9fb3duZWQoKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworICAgIHVzZSBzdGQ6OnN5bmM6OmF0b21pYzo6e0F0b21pY0Jvb2wsIE9yZGVyaW5nfTsKKyAgICB1c2Ugc3RkOjpzeW5jOjpBcmM7CisKKyAgICB1c2UgcHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZX07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKyAgICB1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfc3BsaXRfbmFtZV9pbnRvX3Byb3Blcl9zZXBhcmF0b3JfYW5kX3NlcnZpY2VfY2FsbCgpIHsKKyAgICAgICAgbGV0IGlkZW50X25hbWUgPSAiZm9vOmJhcl9jYWxsIjsKKyAgICAgICAgbGV0IChzZXJ2LCBjYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJmlkZW50X25hbWUpOworICAgICAgICBhc3NlcnRfZXEhKHNlcnYsIFNvbWUoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWxsLCAiYmFyX2NhbGwiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JldHVybl9mdWxsX2lkZW50X2lmX25vX3NlcGFyYXRvcl9leGlzdHMoKSB7CisgICAgICAgIGxldCBpZGVudF9uYW1lID0gImJhcl9jYWxsIjsKKyAgICAgICAgbGV0IChzZXJ2LCBjYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJmlkZW50X25hbWUpOworICAgICAgICBhc3NlcnRfZXEhKHNlcnYsIE5vbmUpOworICAgICAgICBhc3NlcnRfZXEhKGNhbGwsICJiYXJfY2FsbCIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfd3JpdGVfZXJyb3JfaWZfbm9fc2VwYXJhdG9yX2ZvdW5kX2FuZF9ub19kZWZhdWx0X3Byb2Nlc3Nvcl9leGlzdHMoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7IC8vIGF0IHRoaXMgcG9pbnQgYW4gZXJyb3Igc2hvdWxkIGJlIHdyaXR0ZW4gb3V0CisKKyAgICAgICAgaS50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCZvLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBpLnJlYWRfbWVzc2FnZV9iZWdpbigpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiZm9vIiwgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2lkZW50LCBleHBlY3RlZF9pZGVudCk7CisgICAgICAgIGxldCByY3ZkX2VyciA9IDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgmbXV0IGkpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZXJyID0gQXBwbGljYXRpb25FcnJvcjo6bmV3KAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVCwKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2VyciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3dyaXRlX2Vycm9yX2lmX3NlcGFyYXRvcl9leGlzdHNfYW5kX25vX3Byb2Nlc3Nvcl9mb3VuZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm1pc3Npbmc6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsgLy8gYXQgdGhpcyBwb2ludCBhbiBlcnJvciBzaG91bGQgYmUgd3JpdHRlbiBvdXQKKworICAgICAgICBpLnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJm8udHJhbnNwb3J0LndyaXRlX2J5dGVzKCkpOworICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGkucmVhZF9tZXNzYWdlX2JlZ2luKCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJtaXNzaW5nOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfaWRlbnQsIGV4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgbGV0IHJjdmRfZXJyID0gOjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKCZtdXQgaSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9lcnIgPSBBcHBsaWNhdGlvbkVycm9yOjpuZXcoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1pc3NpbmdfcHJvY2Vzc29yX21lc3NhZ2UoU29tZSgibWlzc2luZyIpKSwKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2VyciwgZXhwZWN0ZWRfZXJyKTsKKyAgICB9CisKKyAgICAjW2Rlcml2ZShEZWZhdWx0KV0KKyAgICBzdHJ1Y3QgU2VydmljZSB7CisgICAgICAgIHB1YiBpbnZva2VkOiBBcmM8QXRvbWljQm9vbD4sCisgICAgfQorCisgICAgaW1wbCBUUHJvY2Vzc29yIGZvciBTZXJ2aWNlIHsKKyAgICAgICAgZm4gcHJvY2Vzcygmc2VsZiwgXzogJm11dCBUSW5wdXRQcm90b2NvbCwgXzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICAgICBsZXQgcmVzID0gc2VsZgorICAgICAgICAgICAgICAgIC5pbnZva2VkCisgICAgICAgICAgICAgICAgLmNvbXBhcmVfYW5kX3N3YXAoZmFsc2UsIHRydWUsIE9yZGVyaW5nOjpSZWxheGVkKTsKKyAgICAgICAgICAgIGlmIHJlcyB7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVycigiZmFpbGVkIHN3YXAiLmludG8oKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcm91dGVfY2FsbF90b19jb3JyZWN0X3Byb2Nlc3NvcigpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBzZXJ2aWNlcworICAgICAgICBsZXQgc3ZjXzEgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzEgPSBzdmNfMS5pbnZva2VkLmNsb25lKCk7CisgICAgICAgIGxldCBzdmNfMiA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMiA9IHN2Y18yLmludm9rZWQuY2xvbmUoKTsKKworICAgICAgICAvLyByZWdpc3RlciB0aGVtCisgICAgICAgIGxldCBtdXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMSIsIEJveDo6bmV3KHN2Y18xKSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzIiLCBCb3g6Om5ldyhzdmNfMiksIGZhbHNlKS51bndyYXAoKTsKKworICAgICAgICAvLyBtYWtlIHRoZSBzZXJ2aWNlIGNhbGwKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV8xOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOworCisgICAgICAgIC8vIHNlcnZpY2UgMSBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQsIG5vdCBzZXJ2aWNlIDIKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMS5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9lcSEoYXRtXzIubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIGZhbHNlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JvdXRlX2NhbGxfdG9fY29ycmVjdF9wcm9jZXNzb3JfaWZfbm9fc2VwYXJhdG9yX2V4aXN0c19hbmRfZGVmYXVsdF9wcm9jZXNzb3Jfc2V0KCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcnZpY2VzCisgICAgICAgIGxldCBzdmNfMSA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMSA9IHN2Y18xLmludm9rZWQuY2xvbmUoKTsKKyAgICAgICAgbGV0IHN2Y18yID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8yID0gc3ZjXzIuaW52b2tlZC5jbG9uZSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZW0KKyAgICAgICAgbGV0IG11dCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8xIiwgQm94OjpuZXcoc3ZjXzEpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMiIsIEJveDo6bmV3KHN2Y18yKSwgdHJ1ZSkudW53cmFwKCk7IC8vIHNlY29uZCBwcm9jZXNzb3IgaXMgZGVmYXVsdAorCisgICAgICAgIC8vIG1ha2UgdGhlIHNlcnZpY2UgY2FsbCAoaXQncyBhbiBvbGQgY2xpZW50LCBzbyB3ZSBoYXZlIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlKQorICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJvbGRfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7CisKKyAgICAgICAgLy8gc2VydmljZSAyIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCwgbm90IHNlcnZpY2UgMQorICAgICAgICBhc3NlcnRfZXEhKGF0bV8xLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9lcSEoYXRtXzIubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIHRydWUpOworICAgIH0KKworICAgIGZuIGJ1aWxkX29iamVjdHMoKSAtPiAoCisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMjgsIDEyOCk7CisgICAgICAgIGxldCAocl9jLCB3X2MpID0gYy5zcGxpdCgpLnVud3JhcCgpOworICAgICAgICAoCisgICAgICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHJfYywgdHJ1ZSksCisgICAgICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X2MsIHRydWUpLAorICAgICAgICApCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMgYi9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM5YTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMKQEAgLTAsMCArMSwyMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6bmV0Ojp7VGNwTGlzdGVuZXIsIFRjcFN0cmVhbX07Cit1c2Ugc3RkOjpzeW5jOjpBcmM7Cit1c2UgdGhyZWFkcG9vbDo6VGhyZWFkUG9vbDsKKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRUY3BDaGFubmVsLCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCit1c2Ugc3VwZXI6OlRQcm9jZXNzb3I7CisKKy8vLyBGaXhlZC1zaXplIHRocmVhZC1wb29sIGJsb2NraW5nIFRocmlmdCBzZXJ2ZXIuCisvLy8KKy8vLyBBIGBUU2VydmVyYCBsaXN0ZW5zIG9uIGEgZ2l2ZW4gYWRkcmVzcyBhbmQgc3VibWl0cyBhY2NlcHRlZCBjb25uZWN0aW9ucworLy8vIHRvIGFuICoqdW5ib3VuZGVkKiogcXVldWUuIENvbm5lY3Rpb25zIGZyb20gdGhpcyBxdWV1ZSBhcmUgc2VydmljZWQgYnkKKy8vLyB0aGUgZmlyc3QgYXZhaWxhYmxlIHdvcmtlciB0aHJlYWQgZnJvbSBhICoqZml4ZWQtc2l6ZSoqIHRocmVhZCBwb29sLiBFYWNoCisvLy8gYWNjZXB0ZWQgY29ubmVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoYXQgd29ya2VyIHRocmVhZCwgYW5kIGNvbW11bmljYXRpb24KKy8vLyBvdmVyIHRoaXMgdGhyZWFkIG9jY3VycyBzZXF1ZW50aWFsbHkgYW5kIHN5bmNocm9ub3VzbHkgKGkuZS4gY2FsbHMgYmxvY2spLgorLy8vIEFjY2VwdGVkIGNvbm5lY3Rpb25zIGhhdmUgYW4gaW5wdXQgaGFsZiBhbmQgYW4gb3V0cHV0IGhhbGYsIGVhY2ggb2Ygd2hpY2gKKy8vLyB1c2VzIGEgYFRUcmFuc3BvcnRgIGFuZCBgVElucHV0UHJvdG9jb2xgL2BUT3V0cHV0UHJvdG9jb2xgIHRvIHRyYW5zbGF0ZQorLy8vIG1lc3NhZ2VzIHRvIGFuZCBmcm9tIGJ5ZXMuIEFueSBjb21iaW5hdGlvbiBvZiBgVElucHV0UHJvdG9jb2xgLCBgVE91dHB1dFByb3RvY29sYAorLy8vIGFuZCBgVFRyYW5zcG9ydGAgbWF5IGJlIHVzZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGluZyBhbmQgcnVubmluZyBhIGBUU2VydmVyYCB1c2luZyBUaHJpZnQtY29tcGlsZXItZ2VuZXJhdGVkCisvLy8gc2VydmljZSBjb2RlLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6e1RQcm9jZXNzb3IsIFRTZXJ2ZXJ9OworLy8vCisvLy8gLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZAorLy8vIC8vCisvLy8KKy8vLyAvLyBwcm9jZXNzb3IgZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvcjsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gbmV3PEg6IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlcj4ocHJvY2Vzc29yOiBIKSAtPiBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9uIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gc2VydmljZSBmdW5jdGlvbnMgZm9yIFNpbXBsZVNlcnZpY2UKKy8vLyB0cmFpdCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPjsKKy8vLyB9CisvLy8KKy8vLyAvLworLy8vIC8vIHVzZXItY29kZSBmb2xsb3dzCisvLy8gLy8KKy8vLworLy8vIC8vIGRlZmluZSBhIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBgc2VydmljZV9jYWxsYCBpcyByZWNlaXZlZAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGw7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCisvLy8gbGV0IHByb2Nlc3NvciA9IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHt9KTsKKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBzZXJ2ZXIKKy8vLyBsZXQgaV90cl9mYWN0OiBCb3g8VFJlYWRUcmFuc3BvcnRGYWN0b3J5PiA9IEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IGlfcHJfZmFjdDogQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4gPSBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgb190cl9mYWN0OiBCb3g8VFdyaXRlVHJhbnNwb3J0RmFjdG9yeT4gPSBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgb19wcl9mYWN0OiBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4gPSBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSk7CisvLy8KKy8vLyBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKy8vLyAgICAgaV90cl9mYWN0LAorLy8vICAgICBpX3ByX2ZhY3QsCisvLy8gICAgIG9fdHJfZmFjdCwKKy8vLyAgICAgb19wcl9mYWN0LAorLy8vICAgICBwcm9jZXNzb3IsCisvLy8gICAgIDEwCisvLy8gKTsKKy8vLworLy8vIC8vIHN0YXJ0IGxpc3RlbmluZyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKKy8vLyBtYXRjaCBzZXJ2ZXIubGlzdGVuKCIxMjcuMC4wLjE6ODA4MCIpIHsKKy8vLyAgIE9rKF8pICA9PiBwcmludGxuISgibGlzdGVuIGNvbXBsZXRlZCIpLAorLy8vICAgRXJyKGUpID0+IHByaW50bG4hKCJsaXN0ZW4gZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpLAorLy8vIH0KKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4KK3doZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIHJfdHJhbnNfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9fZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9fZmFjdG9yeTogT1BGLAorICAgIHByb2Nlc3NvcjogQXJjPFBSQz4sCisgICAgd29ya2VyX3Bvb2w6IFRocmVhZFBvb2wsCit9CisKK2ltcGw8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+Cit3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRTZXJ2ZXJgLgorICAgIC8vLworICAgIC8vLyBFYWNoIGFjY2VwdGVkIGNvbm5lY3Rpb24gaGFzIGFuIGlucHV0IGFuZCBvdXRwdXQgaGFsZiwgZWFjaCBvZiB3aGljaAorICAgIC8vLyByZXF1aXJlcyBhIGBUVHJhbnNwb3J0YCBhbmQgYFRQcm90b2NvbGAuIGBUU2VydmVyYCB1c2VzCisgICAgLy8vIGByZWFkX3RyYW5zcG9ydF9mYWN0b3J5YCBhbmQgYGlucHV0X3Byb3RvY29sX2ZhY3RvcnlgIHRvIGNyZWF0ZQorICAgIC8vLyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBpbnB1dCwgYW5kIGB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeWAgYW5kCisgICAgLy8vIGBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeWAgdG8gY3JlYXRlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIG91dHB1dC4KKyAgICBwdWIgZm4gbmV3KAorICAgICAgICByZWFkX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgICAgIGlucHV0X3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICAgICAgd3JpdGVfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICAgICAgb3V0cHV0X3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKyAgICAgICAgcHJvY2Vzc29yOiBQUkMsCisgICAgICAgIG51bV93b3JrZXJzOiB1c2l6ZSwKKyAgICApIC0+IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+IHsKKyAgICAgICAgVFNlcnZlciB7CisgICAgICAgICAgICByX3RyYW5zX2ZhY3Rvcnk6IHJlYWRfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvX2ZhY3Rvcnk6IGlucHV0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zX2ZhY3Rvcnk6IHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b19mYWN0b3J5OiBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHByb2Nlc3NvcjogQXJjOjpuZXcocHJvY2Vzc29yKSwKKyAgICAgICAgICAgIHdvcmtlcl9wb29sOiBUaHJlYWRQb29sOjp3aXRoX25hbWUoIlRocmlmdCBzZXJ2aWNlIHByb2Nlc3NvciIudG9fb3duZWQoKSwgbnVtX3dvcmtlcnMpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIExpc3RlbiBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgb24gYGxpc3Rlbl9hZGRyZXNzYC4KKyAgICAvLy8KKyAgICAvLy8gYGxpc3Rlbl9hZGRyZXNzYCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gYGhvc3Q6cG9ydGAsCisgICAgLy8vIGZvciBleGFtcGxlOiBgMTI3LjAuMC4xOjgwODBgLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gYCgpYCBpZiBzdWNjZXNzZnVsLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gYEVycmAgd2hlbiB0aGUgc2VydmVyIGNhbm5vdCBiaW5kIHRvIGBsaXN0ZW5fYWRkcmVzc2Agb3IgdGhlcmUKKyAgICAvLy8gaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICBwdWIgZm4gbGlzdGVuKCZtdXQgc2VsZiwgbGlzdGVuX2FkZHJlc3M6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBsaXN0ZW5lciA9IFRjcExpc3RlbmVyOjpiaW5kKGxpc3Rlbl9hZGRyZXNzKT87CisgICAgICAgIGZvciBzdHJlYW0gaW4gbGlzdGVuZXIuaW5jb21pbmcoKSB7CisgICAgICAgICAgICBtYXRjaCBzdHJlYW0geworICAgICAgICAgICAgICAgIE9rKHMpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBzZWxmLm5ld19wcm90b2NvbHNfZm9yX2Nvbm5lY3Rpb24ocyk/OworICAgICAgICAgICAgICAgICAgICBsZXQgcHJvY2Vzc29yID0gc2VsZi5wcm9jZXNzb3IuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JrZXJfcG9vbAorICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUobW92ZSB8fCBoYW5kbGVfaW5jb21pbmdfY29ubmVjdGlvbihwcm9jZXNzb3IsIGlfcHJvdCwgb19wcm90KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHdhcm4hKCJmYWlsZWQgdG8gYWNjZXB0IHJlbW90ZSBjb25uZWN0aW9uIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogImFib3J0ZWQgbGlzdGVuIGxvb3AiLmludG8oKSwKKyAgICAgICAgfSkpCisgICAgfQorCisgICAgZm4gbmV3X3Byb3RvY29sc19mb3JfY29ubmVjdGlvbigKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzdHJlYW06IFRjcFN0cmVhbSwKKyAgICApIC0+IDo6UmVzdWx0PChCb3g8VElucHV0UHJvdG9jb2wgKyBTZW5kPiwgQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+KT4geworICAgICAgICAvLyBjcmVhdGUgdGhlIHNoYXJlZCB0Y3Agc3RyZWFtCisgICAgICAgIGxldCBjaGFubmVsID0gVFRjcENoYW5uZWw6OndpdGhfc3RyZWFtKHN0cmVhbSk7CisKKyAgICAgICAgLy8gc3BsaXQgaXQgaW50byB0d28gLSBvbmUgdG8gYmUgb3duZWQgYnkgdGhlCisgICAgICAgIC8vIGlucHV0IHRyYW4vcHJvdG8gYW5kIHRoZSBvdGhlciBieSB0aGUgb3V0cHV0CisgICAgICAgIGxldCAocl9jaGFuLCB3X2NoYW4pID0gY2hhbm5lbC5zcGxpdCgpPzsKKworICAgICAgICAvLyBpbnB1dCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0CisgICAgICAgIGxldCByX3RyYW4gPSBzZWxmLnJfdHJhbnNfZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcocl9jaGFuKSk7CisgICAgICAgIGxldCBpX3Byb3QgPSBzZWxmLmlfcHJvdG9fZmFjdG9yeS5jcmVhdGUocl90cmFuKTsKKworICAgICAgICAvLyBvdXRwdXQgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydAorICAgICAgICBsZXQgd190cmFuID0gc2VsZi53X3RyYW5zX2ZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KHdfY2hhbikpOworICAgICAgICBsZXQgb19wcm90ID0gc2VsZi5vX3Byb3RvX2ZhY3RvcnkuY3JlYXRlKHdfdHJhbik7CisKKyAgICAgICAgT2soKGlfcHJvdCwgb19wcm90KSkKKyAgICB9Cit9CisKK2ZuIGhhbmRsZV9pbmNvbWluZ19jb25uZWN0aW9uPFBSQz4oCisgICAgcHJvY2Vzc29yOiBBcmM8UFJDPiwKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgd2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IsCit7CisgICAgbGV0IG11dCBpX3Byb3QgPSBpX3Byb3Q7CisgICAgbGV0IG11dCBvX3Byb3QgPSBvX3Byb3Q7CisgICAgbG9vcCB7CisgICAgICAgIGxldCByID0gcHJvY2Vzc29yLnByb2Nlc3MoJm11dCAqaV9wcm90LCAmbXV0ICpvX3Byb3QpOworICAgICAgICBpZiBsZXQgRXJyKGUpID0gciB7CisgICAgICAgICAgICB3YXJuISgicHJvY2Vzc29yIGNvbXBsZXRlZCB3aXRoIGVycm9yOiB7Oj99IiwgZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjZmVmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzCkBAIC0wLDAgKzEsNDgzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKK3VzZSBzdXBlcjo6e1RSZWFkVHJhbnNwb3J0LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSByZWFkIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFJFQURfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHdyaXRlIGJ1ZmZlciBpbiBieXRlcy4uCitjb25zdCBXUklURV9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gVHJhbnNwb3J0IHRoYXQgcmVhZHMgbWVzc2FnZXMgdmlhIGFuIGludGVybmFsIGJ1ZmZlci4KKy8vLworLy8vIEEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisvLy8gT24gYSBjYWxsIHRvIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpyZWFkKC4uLilgIG9uZSBmdWxsIG1lc3NhZ2UgLSBib3RoCisvLy8gZml4ZWQtbGVuZ3RoIGhlYWRlciBhbmQgYnl0ZXMgLSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbCBhbmQgYnVmZmVyZWQuCisvLy8gU3Vic2VxdWVudCByZWFkIGNhbGxzIGFyZSBzZXJ2aWNlZCBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIgdW50aWwgaXQgaXMKKy8vLyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IGZ1bGwgbWVzc2FnZSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQKKy8vLyBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6UmVhZDsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC5yZWFkKCZtdXQgdmVjIVswdTg7IDFdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFuOiBDLAorfQorCitpbXBsPEM+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsIHJlYWQgYW5kCisgICAgLy8vIHdyaXRlIGJ1ZmZlcnMgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoUkVBRF9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGByZWFkX2NhcGFjaXR5YCBhbmQgYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICBjYXA6IDAsCisgICAgICAgICAgICBjaGFuOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gZ2V0X2J5dGVzKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwmW3U4XT4geworICAgICAgICBpZiBzZWxmLmNhcCAtIHNlbGYucG9zID09IDAgeworICAgICAgICAgICAgc2VsZi5wb3MgPSAwOworICAgICAgICAgICAgc2VsZi5jYXAgPSBzZWxmLmNoYW4ucmVhZCgmbXV0IHNlbGYuYnVmKT87CisgICAgICAgIH0KKworICAgICAgICBPaygmc2VsZi5idWZbc2VsZi5wb3MuLnNlbGYuY2FwXSkKKyAgICB9CisKKyAgICBmbiBjb25zdW1lKCZtdXQgc2VsZiwgY29uc3VtZWQ6IHVzaXplKSB7CisgICAgICAgIC8vIFRPRE86IHdhcyBhIGJ1ZyBoZXJlICs9IDwtLSB0ZXN0IHNvbWVob3cKKyAgICAgICAgc2VsZi5wb3MgPSBjbXA6Om1pbihzZWxmLmNhcCwgc2VsZi5wb3MgKyBjb25zdW1lZCk7CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCBieXRlc19yZWFkID0gMDsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCBucmVhZCA9IHsKKyAgICAgICAgICAgICAgICBsZXQgYXZhaWxfYnl0ZXMgPSBzZWxmLmdldF9ieXRlcygpPzsKKyAgICAgICAgICAgICAgICBsZXQgYXZhaWxfc3BhY2UgPSBidWYubGVuKCkgLSBieXRlc19yZWFkOworICAgICAgICAgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGF2YWlsX3NwYWNlLCBhdmFpbF9ieXRlcy5sZW4oKSk7CisgICAgICAgICAgICAgICAgYnVmW2J5dGVzX3JlYWQuLihieXRlc19yZWFkICsgbnJlYWQpXS5jb3B5X2Zyb21fc2xpY2UoJmF2YWlsX2J5dGVzWy4ubnJlYWRdKTsKKyAgICAgICAgICAgICAgICBucmVhZAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2VsZi5jb25zdW1lKG5yZWFkKTsKKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gbnJlYWQ7CisKKyAgICAgICAgICAgIGlmIGJ5dGVzX3JlYWQgPT0gYnVmLmxlbigpIHx8IG5yZWFkID09IDAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2soYnl0ZXNfcmVhZCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisvLy8gVHJhbnNwb3J0IHRoYXQgd3JpdGVzIG1lc3NhZ2VzIHZpYSBhbiBpbnRlcm5hbCBidWZmZXIuCisvLy8KKy8vLyBBIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuCisvLy8gQWxsIHdyaXRlcyBhcmUgbWFkZSB0byB0aGlzIGJ1ZmZlciBhbmQgYXJlIHNlbnQgdG8gdGhlIHdyYXBwZWQgY2hhbm5lbCBvbmx5CisvLy8gd2hlbiBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OmZsdXNoKClgIGlzIGNhbGxlZC4gT24gYSBmbHVzaCBhIGZpeGVkLWxlbmd0aAorLy8vIGhlYWRlciB3aXRoIGEgY291bnQgb2YgdGhlIGJ1ZmZlcmVkIGJ5dGVzIGlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBieXRlcworLy8vIHRoZW1zZWx2ZXMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6V3JpdGU7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC53cml0ZSgmWzB4MDBdKS51bndyYXAoKTsKKy8vLyB0LmZsdXNoKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW5uZWw6IEMsCit9CisKK2ltcGw8Qz4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbCByZWFkIGFuZAorICAgIC8vLyB3cml0ZSBidWZmZXJzIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoV1JJVEVfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgcmVhZF9jYXBhY2l0eWAgYW5kIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgd3JpdGVfY2FwYWNpdHkgPiAwLAorICAgICAgICAgICAgIndyaXRlIGJ1ZmZlciBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIgorICAgICAgICApOworCisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogVmVjOjp3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5KSwKKyAgICAgICAgICAgIGNhcDogd3JpdGVfY2FwYWNpdHksCisgICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgaWYgIWJ1Zi5pc19lbXB0eSgpIHsKKyAgICAgICAgICAgIGxldCBtdXQgYXZhaWxfYnl0ZXM7CisKKyAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgIGF2YWlsX2J5dGVzID0gY21wOjptaW4oYnVmLmxlbigpLCBzZWxmLmNhcCAtIHNlbGYuYnVmLmxlbigpKTsKKworICAgICAgICAgICAgICAgIGlmIGF2YWlsX2J5dGVzID09IDAgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCk/OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGF2YWlsX2J5dGVzID0gYXZhaWxfYnl0ZXM7CisKKyAgICAgICAgICAgIHNlbGYuYnVmLmV4dGVuZF9mcm9tX3NsaWNlKCZidWZbLi5hdmFpbF9ieXRlc10pOworICAgICAgICAgICAgYXNzZXJ0IShzZWxmLmJ1Zi5sZW4oKSA8PSBzZWxmLmNhcCwgImNvcHkgb3ZlcmZsb3dlZCBidWZmZXIiKTsKKworICAgICAgICAgICAgT2soYXZhaWxfYnl0ZXMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygwKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuY2hhbm5lbC53cml0ZV9hbGwoJnNlbGYuYnVmKT87CisgICAgICAgIHNlbGYuY2hhbm5lbC5mbHVzaCgpPzsKKyAgICAgICAgc2VsZi5idWYuY2xlYXIoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9yZWFkX2J1ZmZlcl9pc19lbXB0eSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgbXV0IGIgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX3JlYWRzX2ludG9femVyb19jYXBhY2l0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgW10pOworCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX25vdGhpbmdfbW9yZV9jYW5fYmVfcmVhZCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyByZWFkIGJ1ZmZlciBpcyBleGFjdGx5IHRoZSBzYW1lIHNpemUgYXMgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluCisgICAgICAgIGxldCBidWZfYWdhaW4gPSB2ZWMhWzB1ODsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lLCAwIGJ5dGVzIGFuZCB3ZSBoYXZlbid0IGNoYW5nZWQgdGhlIGJ1ZmZlcgorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmX2FnYWluLCAmWzAsIDAsIDAsIDBdKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2ZpbGxfdXNlcl9idWZmZXJfd2l0aF9vbmx5X2FzX21hbnlfYnl0ZXNfYXNfYXZhaWxhYmxlKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHJlYWQgYnVmZmVyIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA4XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zls0Li5dKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUsIDAgYnl0ZXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgMywgMCwgMCwgMCwgMF0pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9zdWNjZXNzZnVsbHkoKSB7CisgICAgICAgIC8vIHRoaXMgdGVzdCBpbnZvbHZlcyBhIGZldyBsb29wcyB3aXRoaW4gdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydAorICAgICAgICAvLyBpdHNlbGYgd2hlcmUgaXQgaGFzIHRvIGRyYWluIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpbiBvcmRlcgorICAgICAgICAvLyB0byBzZXJ2aWNlIGEgcmVhZAorCisgICAgICAgIC8vIHdlIGhhdmUgYSBtdWNoIHNtYWxsZXIgYnVmZmVyIHRoYW4gdGhlCisgICAgICAgIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0IGhhcyBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBtZW0pOworCisgICAgICAgIC8vIGZpbGwgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgYnl0ZSBidWZmZXIKKyAgICAgICAgbGV0IG11dCByZWFkYWJsZV9ieXRlcyA9IFswdTg7IDEwXTsKKyAgICAgICAgZm9yIGkgaW4gMC4uMTAgeworICAgICAgICAgICAgcmVhZGFibGVfYnl0ZXNbaV0gPSBpIGFzIHU4OworICAgICAgICB9CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXMpOworCisgICAgICAgIC8vIHdlIGFzayB0byByZWFkIGludG8gYSBidWZmZXIgdGhhdCdzIG11Y2ggbGFyZ2VyCisgICAgICAgIC8vIHRoYW4gdGhlIG9uZSB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0IGhhczsgYXMgYSByZXN1bHQKKyAgICAgICAgLy8gaXQncyBnb2luZyB0byBoYXZlIHRvIGtlZXAgYXNraW5nIHRoZSB1bmRlcmx5aW5nCisgICAgICAgIC8vIHRyYW5zcG9ydCBmb3IgbW9yZSBieXRlcworICAgICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IDhdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIHJlYWQgOCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA4KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDddKTsKKworICAgICAgICAvLyBsZXQncyBjbGVhciBvdXQgdGhlIGJ1ZmZlciBhbmQgdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgZm9yIGkgaW4gMC4uOCB7CisgICAgICAgICAgICBidWZbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlIHdlcmUgb25seSBhYmxlIHRvIHJlYWQgMiBieXRlcworICAgICAgICAvLyAoYWxsIHRoYXQncyByZW1haW5pbmcgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQpCisgICAgICAgIC8vIGxldCdzIGFsc28gY2hlY2sgdGhhdCB0aGUgcmVtYWluaW5nIGJ5dGVzIGFyZSB1bnRvdWNoZWQKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi4yXSwgJls4LCA5XSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsyLi5dLCAmWzAsIDAsIDAsIDAsIDAsIDBdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbiAod2Ugc2hvdWxkIGdldCAwKQorICAgICAgICAvLyBhbmQgYWxsIHRoZSBleGlzdGluZyBieXRlcyB3ZXJlIHVudG91Y2hlZAorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjJdLCAmWzgsIDldKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzIuLl0sICZbMCwgMCwgMCwgMCwgMCwgMF0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl9lcnJvcl93aGVuX25vdGhpbmdfY2FuX2JlX3dyaXR0ZW5fdG9fdW5kZXJseWluZ19jaGFubmVsKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiKTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEgYnl0ZQorICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDEpOworCisgICAgICAgIC8vIGxldCdzIHRyeSBhZ2Fpbi4uLgorICAgICAgICBsZXQgciA9IHQud3JpdGUoJmJbMS4uXSk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlJ2xsIGVycm9yIG91dCBiZWNhdXNlIHRoZSBhdXRvLWZsdXNoIGZhaWxlZAorICAgICAgICBhc3NlcnQhKHIuaXNfZXJyKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9jYWxsc193cml0ZV93aXRoX2VtcHR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZbXSk7CisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAwXSA9IFtdOworCisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2F1dG9fZmx1c2hfaWZfd3JpdGVfYnVmZmVyX2Z1bGwoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCA4KTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICBsZXQgYjAgPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM107CisgICAgICAgIGxldCBiMSA9IFsweDA0LCAweDA1LCAweDA2LCAweDA3XTsKKworICAgICAgICAvLyB3cml0ZSB0aGUgZmlyc3QgNCBieXRlczsgd2UndmUgbm93IGZpbGxlZCB0aGUgdHJhbnNwb3J0J3Mgd3JpdGUgYnVmZmVyCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYjApOworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDQpOworCisgICAgICAgIC8vIHRyeSB3cml0ZSB0aGUgbmV4dCA0IGJ5dGVzOyB0aGlzIGNhdXNlcyB0aGUgdHJhbnNwb3J0IHRvIGF1dG8tZmx1c2ggdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiMSk7CisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgNCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbiB3cml0aW5nIHRoZSBzZWNvbmQgNCBieXRlcyB3ZSBhdXRvLWZsdXNoZWQgdGhlIGZpcnN0IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgNCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYjApOworICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgLy8gbm93IGZsdXNoIHRoZSB0cmFuc3BvcnQgdG8gcHVzaCB0aGUgc2Vjb25kIDQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgY2hhbm5lbAorICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlIHdyb3RlIG91dCB0aGUgc2Vjb25kIDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhtZW0pOworCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzAsIDEsIDIsIDMsIDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdWNjZXNzZnVsbHlfYWZ0ZXJfZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCA1KTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNSwgbWVtKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2gKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMCwgMSwgMiwgMywgNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworCisgICAgICAgIC8vIHJlc2V0IG91ciB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoIGFnYWluCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA5MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzCkBAIC0wLDAgKzEsNDU5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCit1c2Ugc3VwZXI6OntUUmVhZFRyYW5zcG9ydCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgcmVhZCBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBSRUFEX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSB3cml0ZSBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBXUklURV9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gVHJhbnNwb3J0IHRoYXQgcmVhZHMgZnJhbWVkIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisvLy8gT24gYSBjYWxsIHRvIGBURnJhbWVkUmVhZFRyYW5zcG9ydDo6cmVhZCguLi4pYCBvbmUgZnVsbCBtZXNzYWdlIC0gYm90aAorLy8vIGZpeGVkLWxlbmd0aCBoZWFkZXIgYW5kIGJ5dGVzIC0gaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwgYW5kCisvLy8gYnVmZmVyZWQuIFN1YnNlcXVlbnQgcmVhZCBjYWxscyBhcmUgc2VydmljZWQgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyCisvLy8gdW50aWwgaXQgaXMgZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbmV4dCBmdWxsIG1lc3NhZ2UgaXMgcmVhZAorLy8vIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpSZWFkOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQucmVhZCgmbXV0IHZlYyFbMHU4OyAxXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFuOiBDLAorfQorCitpbXBsPEM+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAgd2l0aCBhIGRlZmF1bHQtc2l6ZWQKKyAgICAvLy8gaW50ZXJuYWwgcmVhZCBidWZmZXIgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShSRUFEX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlcgorICAgIC8vLyBvZiBzaXplIGByZWFkX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLCAvLyBGSVhNRTogZG8gSSBhY3R1YWxseSBoYXZlIHRvIGRvIHRoaXM/CisgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICBjYXA6IDAsCisgICAgICAgICAgICBjaGFuOiBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGI6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBpZiBzZWxmLmNhcCAtIHNlbGYucG9zID09IDAgeworICAgICAgICAgICAgbGV0IG1lc3NhZ2Vfc2l6ZSA9IHNlbGYuY2hhbi5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKT8gYXMgdXNpemU7CisKKyAgICAgICAgICAgIGxldCBidWZfY2FwYWNpdHkgPSBjbXA6Om1heChtZXNzYWdlX3NpemUsIFJFQURfQ0FQQUNJVFkpOworICAgICAgICAgICAgc2VsZi5idWYucmVzaXplKGJ1Zl9jYXBhY2l0eSwgMCk7CisKKyAgICAgICAgICAgIHNlbGYuY2hhbi5yZWFkX2V4YWN0KCZtdXQgc2VsZi5idWZbLi5tZXNzYWdlX3NpemVdKT87CisgICAgICAgICAgICBzZWxmLmNhcCA9IG1lc3NhZ2Vfc2l6ZSBhcyB1c2l6ZTsKKyAgICAgICAgICAgIHNlbGYucG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGIubGVuKCksIHNlbGYuY2FwIC0gc2VsZi5wb3MpOworICAgICAgICBiWy4ubnJlYWRdLmNsb25lX2Zyb21fc2xpY2UoJnNlbGYuYnVmW3NlbGYucG9zLi5zZWxmLnBvcyArIG5yZWFkXSk7CisgICAgICAgIHNlbGYucG9zICs9IG5yZWFkOworCisgICAgICAgIE9rKG5yZWFkKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworLy8vIFRyYW5zcG9ydCB0aGF0IHdyaXRlcyBmcmFtZWQgbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLiBBbGwKKy8vLyB3cml0ZXMgYXJlIG1hZGUgdG8gdGhpcyBidWZmZXIgYW5kIGFyZSBzZW50IHRvIHRoZSB3cmFwcGVkIGNoYW5uZWwgb25seQorLy8vIHdoZW4gYFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6Zmx1c2goKWAgaXMgY2FsbGVkLiBPbiBhIGZsdXNoIGEgZml4ZWQtbGVuZ3RoCisvLy8gaGVhZGVyIHdpdGggYSBjb3VudCBvZiB0aGUgYnVmZmVyZWQgYnl0ZXMgaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzCisvLy8gdGhlbXNlbHZlcy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6V3JpdGU7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LndyaXRlKCZbMHgwMF0pLnVud3JhcCgpOworLy8vIHQuZmx1c2goKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBjaGFubmVsOiBDLAorfQorCitpbXBsPEM+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsCisgICAgLy8vIHdyaXRlIGJ1ZmZlciB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoV1JJVEVfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyCisgICAgLy8vIG9mIHNpemUgYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiBWZWM6OndpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHkpLAorICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IGN1cnJlbnRfY2FwYWNpdHkgPSBzZWxmLmJ1Zi5jYXBhY2l0eSgpOworICAgICAgICBsZXQgYXZhaWxhYmxlX3NwYWNlID0gY3VycmVudF9jYXBhY2l0eSAtIHNlbGYuYnVmLmxlbigpOworICAgICAgICBpZiBiLmxlbigpID4gYXZhaWxhYmxlX3NwYWNlIHsKKyAgICAgICAgICAgIGxldCBhZGRpdGlvbmFsX3NwYWNlID0gY21wOjptYXgoYi5sZW4oKSAtIGF2YWlsYWJsZV9zcGFjZSwgY3VycmVudF9jYXBhY2l0eSk7CisgICAgICAgICAgICBzZWxmLmJ1Zi5yZXNlcnZlKGFkZGl0aW9uYWxfc3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi5idWYuZXh0ZW5kX2Zyb21fc2xpY2UoYik7CisgICAgICAgIE9rKGIubGVuKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCBtZXNzYWdlX3NpemUgPSBzZWxmLmJ1Zi5sZW4oKTsKKworICAgICAgICBpZiBsZXQgMCA9IG1lc3NhZ2Vfc2l6ZSB7CisgICAgICAgICAgICByZXR1cm4gT2soKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5jaGFubmVsLndyaXRlX2kzMjo6PEJpZ0VuZGlhbj4obWVzc2FnZV9zaXplIGFzIGkzMik/OworICAgICAgICB9CisKKyAgICAgICAgLy8gd2lsbCBzcGluIGlmIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwgY2FuJ3QgYmUgd3JpdHRlbiB0bworICAgICAgICBsZXQgbXV0IGJ5dGVfaW5kZXggPSAwOworICAgICAgICB3aGlsZSBieXRlX2luZGV4IDwgbWVzc2FnZV9zaXplIHsKKyAgICAgICAgICAgIGxldCBud3JpdGUgPSBzZWxmLmNoYW5uZWwud3JpdGUoJnNlbGYuYnVmW2J5dGVfaW5kZXguLm1lc3NhZ2Vfc2l6ZV0pPzsKKyAgICAgICAgICAgIGJ5dGVfaW5kZXggPSBjbXA6Om1pbihieXRlX2luZGV4ICsgbndyaXRlLCBtZXNzYWdlX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGJ1Zl9jYXBhY2l0eSA9IGNtcDo6bWluKHNlbGYuYnVmLmNhcGFjaXR5KCksIFdSSVRFX0NBUEFDSVRZKTsKKyAgICAgICAgc2VsZi5idWYucmVzaXplKGJ1Zl9jYXBhY2l0eSwgMCk7CisgICAgICAgIHNlbGYuYnVmLmNsZWFyKCk7CisKKyAgICAgICAgc2VsZi5jaGFubmVsLmZsdXNoKCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0OjptZW06OlRCdWZmZXJDaGFubmVsOworCisgICAgLy8gRklYTUU6IHRlc3QgYSBmb3JjZWQgcmVzZXJ2ZQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tZXNzYWdlX3NtYWxsZXJfdGhhbl9pbml0aWFsX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDgsIGMpOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9pbml0aWFsX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIGMpOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tdWx0aXBsZV9tZXNzYWdlc19pbl9zZXF1ZW5jZV9jb3JyZWN0bHkoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgYyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMXN0IG1lc3NhZ2UKKyAgICAgICAgLy8KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTsKKworICAgICAgICAvLworICAgICAgICAvLyAybmQgbWVzc2FnZQorICAgICAgICAvLworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwNCwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgMSBieXRlCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlsweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9zbWFsbGVyX3RoYW5fYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIwLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxMCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAxMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX2NhbGxzX3dyaXRlX3dpdGhfZW1wdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDBdID0gW107CisKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZbXSkudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhtZW0pOworCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9idWZmZXJfc2l6ZV8wMCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBJTVBPUlRBTlQ6IERPICoqTk9UKiogQ0hBTkdFIFRIRSBXUklURV9DQVBBQ0lUWSBPUiBUSEUgTlVNQkVSIE9GIEJZVEVTIFRPIEJFIFdSSVRURU4hCisgICAgICAgIC8vIHRoZXNlIGxlbmd0aHMgd2VyZSBjaG9zZW4gdG8gYmUganVzdCBsb25nIGVub3VnaAorICAgICAgICAvLyB0aGF0IGRvdWJsaW5nIHRoZSBjYXBhY2l0eSBpcyBhICoqd29yc2UqKiBjaG9pY2UgdGhhbgorICAgICAgICAvLyBzaW1wbHkgcmVzaXppbmcgdGhlIGJ1ZmZlciB0byBiLmxlbigpCisKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisgICAgICAgIGxldCBiID0gWzB4MDAsIDB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMyBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2dyZWF0ZXJfdGhhbl9idWZmZXJfc2l6ZV8wMSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBJTVBPUlRBTlQ6IERPICoqTk9UKiogQ0hBTkdFIFRIRSBXUklURV9DQVBBQ0lUWSBPUiBUSEUgTlVNQkVSIE9GIEJZVEVTIFRPIEJFIFdSSVRURU4hCisgICAgICAgIC8vIHRoZXNlIGxlbmd0aHMgd2VyZSBjaG9zZW4gdG8gYmUganVzdCBsb25nIGVub3VnaAorICAgICAgICAvLyB0aGF0IGRvdWJsaW5nIHRoZSBjYXBhY2l0eSBpcyBhICoqYmV0dGVyKiogY2hvaWNlIHRoYW4KKyAgICAgICAgLy8gc2ltcGx5IHJlc2l6aW5nIHRoZSBidWZmZXIgdG8gYi5sZW4oKQorCisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBtZW0pOworICAgICAgICBsZXQgYiA9IFsweDAwLCAweDAxLCAweDAyXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDMgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX2Vycm9yX2lmX25vdGhpbmdfY2FuX2JlX3dyaXR0ZW5fdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxMCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAxMCk7CisKKyAgICAgICAgLy8gbGV0J3MgZmx1c2gKKyAgICAgICAgbGV0IHIgPSB0LmZsdXNoKCk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lIHdlJ2xsIGVycm9yIG91dCBiZWNhdXNlIHRoZSBmbHVzaCBjYW4ndCB3cml0ZSB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsCisgICAgICAgIGFzc2VydCEoci5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3VjY2Vzc2Z1bGx5X2FmdGVyX2ZsdXNoKCkgeworICAgICAgICAvLyBJTVBPUlRBTlQ6IHdyaXRlIGNhcGFjaXR5ICpNVVNUKiBiZSBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gbWVzc2FnZSBzaXplcyB1c2VkIGluIHRoaXMgdGVzdCArIDQtYnl0ZSBmcmFtZSBoZWFkZXIKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDUsIG1lbSk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoCisgICAgICAgIGxldCBmaXJzdF9tZXNzYWdlOiBbdTg7IDVdID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmZpcnN0X21lc3NhZ2UpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGV4cGVjdGVkLndyaXRlX2FsbCgmWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDVdKS51bndyYXAoKTsgLy8gbWVzc2FnZSBzaXplCisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZmaXJzdF9tZXNzYWdlKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisKKyAgICAgICAgLy8gcmVzZXQgb3VyIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgc2Vjb25kX21lc3NhZ2U6IFt1ODsgM10gPSBbMHgwNSwgMHgwNiwgMHgwN107CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmc2Vjb25kX21lc3NhZ2UpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgZXhwZWN0ZWQuY2xlYXIoKTsKKyAgICAgICAgZXhwZWN0ZWQud3JpdGVfYWxsKCZbMHgwMCwgMHgwMCwgMHgwMCwgMHgwM10pLnVud3JhcCgpOyAvLyBtZXNzYWdlIHNpemUKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlY29uZF9tZXNzYWdlKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZmx1c2hlZCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCBleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMKQEAgLTAsMCArMSwzODUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjpzeW5jOjp7QXJjLCBNdXRleH07CisKK3VzZSBzdXBlcjo6e1JlYWRIYWxmLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisvLy8gSW4tbWVtb3J5IHJlYWQgYW5kIHdyaXRlIGNoYW5uZWwgd2l0aCBmaXhlZC1zaXplIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisvLy8KKy8vLyBPbiBhIGB3cml0ZWAgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlci4gV3JpdGVzIGFyZSBubworLy8vIGxvbmdlciBhY2NlcHRlZCBvbmNlIHRoaXMgYnVmZmVyIGlzIGZ1bGwuIENhbGxlcnMgbXVzdCBgZW1wdHlfd3JpdGVfYnVmZmVyKClgCisvLy8gYmVmb3JlIHN1YnNlcXVlbnQgd3JpdGVzIGFyZSBhY2NlcHRlZC4KKy8vLworLy8vIFlvdSBjYW4gc2V0IHJlYWRhYmxlIGJ5dGVzIGluIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBieSBmaWxsaW5nIGl0IHdpdGgKKy8vLyBgc2V0X3JlYWRhYmxlX2J5dGVzKC4uLilgLiBDYWxsZXJzIGNhbiB0aGVuIHJlYWQgdW50aWwgdGhlIGJ1ZmZlciBpcworLy8vIGRlcGxldGVkLiBObyBmdXJ0aGVyIHJlYWRzIGFyZSBhY2NlcHRlZCB1bnRpbCB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIgaXMKKy8vLyByZXBsZW5pc2hlZCBhZ2Fpbi4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlckNoYW5uZWwgeworICAgIHJlYWQ6IEFyYzxNdXRleDxSZWFkRGF0YT4+LAorICAgIHdyaXRlOiBBcmM8TXV0ZXg8V3JpdGVEYXRhPj4sCit9CisKKyNbZGVyaXZlKERlYnVnKV0KK3N0cnVjdCBSZWFkRGF0YSB7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBpZHg6IHVzaXplLAorICAgIGNhcDogdXNpemUsCit9CisKKyNbZGVyaXZlKERlYnVnKV0KK3N0cnVjdCBXcml0ZURhdGEgeworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKK30KKworaW1wbCBUQnVmZmVyQ2hhbm5lbCB7CisgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGBUQnVmZmVyQ2hhbm5lbGAgd2l0aCB0aGUgZ2l2ZW4KKyAgICAvLy8gcmVhZCBidWZmZXIgY2FwYWNpdHkgYW5kIHdyaXRlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgd3JpdGVfY2FwYWNpdHk6IHVzaXplKSAtPiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgIFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgIHJlYWQ6IEFyYzo6bmV3KE11dGV4OjpuZXcoUmVhZERhdGEgeworICAgICAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICAgICAgaWR4OiAwLAorICAgICAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgICAgICBjYXA6IHJlYWRfY2FwYWNpdHksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICB3cml0ZTogQXJjOjpuZXcoTXV0ZXg6Om5ldyhXcml0ZURhdGEgeworICAgICAgICAgICAgICAgIGJ1ZjogdmVjIVswOyB3cml0ZV9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgICAgICBjYXA6IHdyaXRlX2NhcGFjaXR5LAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLgorICAgIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHZlY3RvciBpZiBubyByZWFkYWJsZSBieXRlcyBhcmUgcHJlc2VudC4KKyAgICBwdWIgZm4gcmVhZF9ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IHJkYXRhLmlkeF07CisgICAgICAgIGJ1Zi5jb3B5X2Zyb21fc2xpY2UoJnJkYXRhLmJ1ZlsuLnJkYXRhLmlkeF0pOworICAgICAgICBidWYKKyAgICB9CisKKyAgICAvLyBGSVhNRTogZG8gSSByZWFsbHkgbmVlZCB0aGlzIEFQSSBjYWxsPworICAgIC8vIEZJWE1FOiBzaG91bGQgdGhpcyBzaW1wbHkgcmVzZXQgdG8gdGhlIGxhc3Qgc2V0IG9mIHJlYWRhYmxlIGJ5dGVzPworICAgIC8vLyBSZXNldCB0aGUgbnVtYmVyIG9mIHJlYWRhYmxlIGJ5dGVzIHRvIHplcm8uCisgICAgLy8vCisgICAgLy8vIFN1YnNlcXVlbnQgY2FsbHMgdG8gYHJlYWRgIHdpbGwgcmV0dXJuIG5vdGhpbmcuCisgICAgcHViIGZuIGVtcHR5X3JlYWRfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgcmRhdGEucG9zID0gMDsKKyAgICAgICAgcmRhdGEuaWR4ID0gMDsKKyAgICB9CisKKyAgICAvLy8gQ29weSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyIGBidWZgIGludG8gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLAorICAgIC8vLyBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYnl0ZXMuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQsCisgICAgLy8vIHdoaWNoIGlzIGBtaW4oYnVmLmxlbigpLCBpbnRlcm5hbF9yZWFkX2J1Zi5sZW4oKSlgLgorICAgIHB1YiBmbiBzZXRfcmVhZGFibGVfYnl0ZXMoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiB1c2l6ZSB7CisgICAgICAgIHNlbGYuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtYXhfYnl0ZXMgPSBjbXA6Om1pbihyZGF0YS5jYXAsIGJ1Zi5sZW4oKSk7CisgICAgICAgIHJkYXRhLmJ1ZlsuLm1heF9ieXRlc10uY2xvbmVfZnJvbV9zbGljZSgmYnVmWy4ubWF4X2J5dGVzXSk7CisgICAgICAgIHJkYXRhLmlkeCA9IG1heF9ieXRlczsKKyAgICAgICAgbWF4X2J5dGVzCisgICAgfQorCisgICAgLy8vIFJldHVybiBhIGNvcHkgb2YgdGhlIGJ5dGVzIGhlbGQgYnkgdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlci4KKyAgICAvLy8gUmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IgaWYgbm8gYnl0ZXMgd2VyZSB3cml0dGVuLgorICAgIHB1YiBmbiB3cml0ZV9ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyB3ZGF0YS5wb3NdOworICAgICAgICBidWYuY29weV9mcm9tX3NsaWNlKCZ3ZGF0YS5idWZbLi53ZGF0YS5wb3NdKTsKKyAgICAgICAgYnVmCisgICAgfQorCisgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLCBtYWtpbmcgaXQgc2VlbSBsaWtlIG5vIGJ5dGVzIHdlcmUKKyAgICAvLy8gd3JpdHRlbi4gQ2FsbGluZyBgd3JpdGVfYnVmZmVyYCBhZnRlciB0aGlzIHJldHVybnMgYW4gZW1wdHkgdmVjdG9yLgorICAgIHB1YiBmbiBlbXB0eV93cml0ZV9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIGxldCBtdXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgd2RhdGEucG9zID0gMDsKKyAgICB9CisKKyAgICAvLy8gT3ZlcndyaXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHJlYWQgYnVmZmVyIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgIC8vLyB3cml0ZSBidWZmZXIuIFRoZSB3cml0ZSBidWZmZXIgaXMgZW1wdGllZCBhZnRlciB0aGlzIG9wZXJhdGlvbi4KKyAgICBwdWIgZm4gY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIC8vIEZJWE1FOiByZWRvIHRoaXMgZW50aXJlIG1ldGhvZAorICAgICAgICBsZXQgYnVmID0geworICAgICAgICAgICAgbGV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYiA9ICZ3ZGF0YS5idWZbLi53ZGF0YS5wb3NdOworICAgICAgICAgICAgbGV0IG11dCBiX3JldCA9IHZlYyFbMDsgYi5sZW4oKV07CisgICAgICAgICAgICBiX3JldC5jb3B5X2Zyb21fc2xpY2UoYik7CisgICAgICAgICAgICBiX3JldAorICAgICAgICB9OworCisgICAgICAgIGxldCBieXRlc19jb3BpZWQgPSBzZWxmLnNldF9yZWFkYWJsZV9ieXRlcygmYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShieXRlc19jb3BpZWQsIGJ1Zi5sZW4oKSk7CisKKyAgICAgICAgc2VsZi5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICB9Cit9CisKK2ltcGwgVElvQ2hhbm5lbCBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PChSZWFkSGFsZjxTZWxmPiwgV3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZCwKKyAgICB7CisgICAgICAgIE9rKCgKKyAgICAgICAgICAgIFJlYWRIYWxmIHsKKyAgICAgICAgICAgICAgICBoYW5kbGU6IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZDogc2VsZi5yZWFkLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgIHdyaXRlOiBzZWxmLndyaXRlLmNsb25lKCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBXcml0ZUhhbGYgeworICAgICAgICAgICAgICAgIGhhbmRsZTogVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICByZWFkOiBzZWxmLnJlYWQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGU6IHNlbGYud3JpdGUuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSkKKyAgICB9Cit9CisKK2ltcGwgaW86OlJlYWQgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBucmVhZCA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgcmRhdGEuaWR4IC0gcmRhdGEucG9zKTsKKyAgICAgICAgYnVmWy4ubnJlYWRdLmNsb25lX2Zyb21fc2xpY2UoJnJkYXRhLmJ1ZltyZGF0YS5wb3MuLnJkYXRhLnBvcyArIG5yZWFkXSk7CisgICAgICAgIHJkYXRhLnBvcyArPSBucmVhZDsKKyAgICAgICAgT2sobnJlYWQpCisgICAgfQorfQorCitpbXBsIGlvOjpXcml0ZSBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBud3JpdGUgPSBjbXA6Om1pbihidWYubGVuKCksIHdkYXRhLmNhcCAtIHdkYXRhLnBvcyk7CisgICAgICAgIGxldCAoc3RhcnQsIGVuZCkgPSAod2RhdGEucG9zLCB3ZGF0YS5wb3MgKyBud3JpdGUpOworICAgICAgICB3ZGF0YS5idWZbc3RhcnQuLmVuZF0uY2xvbmVfZnJvbV9zbGljZSgmYnVmWy4ubndyaXRlXSk7CisgICAgICAgIHdkYXRhLnBvcyArPSBud3JpdGU7CisgICAgICAgIE9rKG53cml0ZSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpIC8vIG5vdGhpbmcgdG8gZG8gb24gZmx1c2gKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworICAgIHVzZSBzdXBlcjo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9lbXB0eV93cml0ZV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEpOworCisgICAgICAgIGxldCBieXRlc190b193cml0ZTogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisKKyAgICAgICAgdC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF93cml0ZXNfYWZ0ZXJfYnVmZmVyX2VtcHRpZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDIpOworCisgICAgICAgIGxldCBieXRlc190b193cml0ZTogW3U4OyAyXSA9IFsweDAxLCAweDAyXTsKKworICAgICAgICAvLyBmaXJzdCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4pCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworCisgICAgICAgIC8vIHRyeSB3cml0ZSBhZ2FpbiAobm90aGluZyBzaG91bGQgYmUgd3JpdHRlbikKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7IC8vIHN0aWxsIHRoZSBzYW1lIGFzIGJlZm9yZQorCisgICAgICAgIC8vIG5vdyByZXNldCB0aGUgYnVmZmVyCisgICAgICAgIHQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKworICAgICAgICAvLyBub3cgdHJ5IHdyaXRlIGFnYWluIC0gdGhlIHdyaXRlIHNob3VsZCBzdWNjZWVkCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF9tdWx0aXBsZV93cml0ZXNfdW50aWxfYnVmZmVyX2lzX2Z1bGwoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKworICAgICAgICAvLyBmaXJzdCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4pCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8wOiBbdTg7IDJdID0gWzB4MDEsIDB4NDFdOworICAgICAgICBsZXQgd3JpdGVfMF9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8wKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8wX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGVfMCk7CisKKyAgICAgICAgLy8gc2Vjb25kIHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbiwgc3RhcnRpbmcgYXQgaW5kZXggMikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzE6IFt1ODsgN10gPSBbMHgyNCwgMHg0MSwgMHgzMiwgMHgzMywgMHgxMSwgMHg5OCwgMHhBRl07CisgICAgICAgIGxldCB3cml0ZV8xX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzEpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzFfcmVzdWx0LnVud3JhcCgpLCA3KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpWzIuLl0sICZieXRlc190b193cml0ZV8xKTsKKworICAgICAgICAvLyB0aGlyZCB3cml0ZSAob25seSAxIGJ5dGUgd3JpdHRlbiAtIHRoYXQncyBhbGwgd2UgaGF2ZSBzcGFjZSBmb3IpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8yOiBbdTg7IDNdID0gWzB4QkYsIDB4REEsIDB4OThdOworICAgICAgICBsZXQgd3JpdGVfMl9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8yKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8yX3Jlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKVs5Li5dLCAmYnl0ZXNfdG9fd3JpdGVfMlswLi4xXSk7IC8vIGhvdyBkb2VzIHRoaXMgc3ludGF4IHdvcms/IQorCisgICAgICAgIC8vIGZvdXJ0aCB3cml0ZSAobm8gd3JpdGVzIGFyZSBhY2NlcHRlZCkKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzM6IFt1ODsgM10gPSBbMHhCRiwgMHhBQSwgMHhGRF07CisgICAgICAgIGxldCB3cml0ZV8zX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzMpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzNfcmVzdWx0LnVud3JhcCgpLCAwKTsKKworICAgICAgICAvLyBjaGVjayB0aGUgZnVsbCB3cml0ZSBidWZmZXIKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZDogVmVjPHU4PiA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMCk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8wKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzEpOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMlswLi4xXSk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLCAmZXhwZWN0ZWRbLi5dKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9lbXB0eV9yZWFkX2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWQ6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWQpOworCisgICAgICAgIHQuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfcmVhZGFibGVfYnl0ZXNfdG9fYmVfc2V0X2FmdGVyX3JlYWRfYnVmZmVyX2VtcHRpZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEsIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkXzA6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZF8wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZF8wKTsKKworICAgICAgICB0LmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCkubGVuKCksIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkXzE6IFt1ODsgMV0gPSBbMHgwMl07CisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmYnl0ZXNfdG9fcmVhZF8xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZF8xKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfbXVsdGlwbGVfcmVhZHNfdW50aWxfYWxsX2J5dGVzX3JlYWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKworICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXM6IFt1ODsgMTBdID0gWzB4RkYsIDB4RUUsIDB4REQsIDB4Q0MsIDB4QkIsIDB4MDAsIDB4MUEsIDB4MkIsIDB4M0MsIDB4NERdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlcyk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlcyk7CisKKyAgICAgICAgLy8gZmlyc3QgcmVhZAorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzAgPSB2ZWMhWzA7IDVdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMC5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzAuLjVdKSk7CisKKyAgICAgICAgLy8gc2Vjb25kIHJlYWQKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8xID0gdmVjIVswOyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzEuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1s1Li45XSkpOworCisgICAgICAgIC8vIHRoaXJkIHJlYWQgKG9ubHkgMSBieXRlIHJlbWFpbnMgdG8gYmUgcmVhZCkKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8yID0gdmVjIVswOyAzXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICByZWFkX2J1Zl8yLnRydW5jYXRlKDEpOyAvLyBGSVhNRTogZG9lcyB0aGUgY2FsbGVyIGhhdmUgdG8gZG8gdGhpcz8KKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8yLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbOS4uXSkpOworCisgICAgICAgIC8vIGZvdXJ0aCByZWFkIChub3RoaW5nIHNob3VsZCBiZSByZWFkYWJsZSkKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8zID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzMpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgcmVhZF9idWZfMy50cnVuY2F0ZSgwKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGFsbCB0aGUgYnl0ZXMgd2UgcmVjZWl2ZWQgbWF0Y2ggdGhlIG9yaWdpbmFsIChhZ2FpbiEpCisgICAgICAgIGxldCBtdXQgYnl0ZXNfcmVhZCA9IFZlYzo6d2l0aF9jYXBhY2l0eSgxMCk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzApOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8xKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMik7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzMpOworICAgICAgICBhc3NlcnRfZXEhKCZieXRlc19yZWFkLCAmcmVhZGFibGVfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X3JlYWRzX3RvX3N1Y2NlZWRfYWZ0ZXJfcmVhZF9idWZmZXJfcmVwbGVuaXNoZWQoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDMsIDApOworCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlc18wOiBbdTg7IDNdID0gWzB4MDIsIDB4QUIsIDB4MzNdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlc18wKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDMpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXNfMCk7CisKKyAgICAgICAgbGV0IG11dCByZWFkX2J1ZiA9IHZlYyFbMDsgNF07CisKKyAgICAgICAgLy8gZHJhaW4gdGhlIHJlYWQgYnVmZmVyCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkX2J1ZlswLi4zXSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhIHN1YnNlcXVlbnQgcmVhZCBmYWlscworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworCisgICAgICAgIC8vIHdlIGRvbid0IG1vZGlmeSB0aGUgcmVhZCBidWZmZXIgb24gZmFpbHVyZQorICAgICAgICBsZXQgbXV0IGV4cGVjdGVkX2J5dGVzID0gVmVjOjp3aXRoX2NhcGFjaXR5KDQpOworICAgICAgICBleHBlY3RlZF9ieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmcmVhZGFibGVfYnl0ZXNfMCk7CisgICAgICAgIGV4cGVjdGVkX2J5dGVzLnB1c2goMHgwMCk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlYWRfYnVmLCAmZXhwZWN0ZWRfYnl0ZXMpOworCisgICAgICAgIC8vIHJlcGxlbmlzaCB0aGUgcmVhZCBidWZmZXIgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzXzE6IFt1ODsgMl0gPSBbMHg5MSwgMHhBQV07CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlc18xKTsKKworICAgICAgICAvLyByZWFkIGFnYWluCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkX2J1ZlswLi4yXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjMzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMKQEAgLTAsMCArMSwyOTEgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBieXRlcyBvdmVyIGFuIEkvTyBjaGFubmVsLgorLy8hCisvLyEgVGhlIGNvcmUgdHlwZXMgYXJlIHRoZSBgVFJlYWRUcmFuc3BvcnRgLCBgVFdyaXRlVHJhbnNwb3J0YCBhbmQgdGhlCisvLyEgYFRJb0NoYW5uZWxgIHRyYWl0cywgdGhyb3VnaCB3aGljaCBgVElucHV0UHJvdG9jb2xgIG9yCisvLyEgYFRPdXRwdXRQcm90b2NvbGAgY2FuIHJlY2VpdmUgYW5kIHNlbmQgcHJpbWl0aXZlcyBvdmVyIHRoZSB3aXJlLiBXaGlsZQorLy8hIGBUSW5wdXRQcm90b2NvbGAgYW5kIGBUT3V0cHV0UHJvdG9jb2xgIGluc3RhbmNlcyBkZWFsIHdpdGggbGFuZ3VhZ2UgcHJpbWl0aXZlcworLy8hIHRoZSB0eXBlcyBpbiB0aGlzIG1vZHVsZSB1bmRlcnN0YW5kIG9ubHkgYnl0ZXMuCisKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpvcHM6OntEZXJlZiwgRGVyZWZNdXR9OworCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzIHsKKyAgICAoJHRyYW5zcG9ydDppZGVudCwgJG51bV93cml0dGVuX2J5dGVzOmV4cHIpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJHRyYW5zcG9ydC5jaGFubmVsLndyaXRlX2J5dGVzKCkubGVuKCksICRudW1fd3JpdHRlbl9ieXRlcyk7CisgICAgfX07Cit9CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyB7CisgICAgKCR0cmFuc3BvcnQ6aWRlbnQsICRleHBlY3RlZF9ieXRlczppZGVudCkgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkdHJhbnNwb3J0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgJiRleHBlY3RlZF9ieXRlcyk7CisgICAgfX07Cit9CisKK21vZCBidWZmZXJlZDsKK21vZCBmcmFtZWQ7Cittb2QgbWVtOworbW9kIHNvY2tldDsKKworcHViIHVzZSBzZWxmOjpidWZmZXJlZDo6eworICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjpmcmFtZWQ6OnsKKyAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsCisgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6Om1lbTo6VEJ1ZmZlckNoYW5uZWw7CitwdWIgdXNlIHNlbGY6OnNvY2tldDo6VFRjcENoYW5uZWw7CisKKy8vLyBJZGVudGlmaWVzIGEgdHJhbnNwb3J0IHVzZWQgYnkgYSBgVElucHV0UHJvdG9jb2xgIHRvIHJlY2VpdmUgYnl0ZXMuCitwdWIgdHJhaXQgVFJlYWRUcmFuc3BvcnQ6IFJlYWQge30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY3JlYXRlIGBUUmVhZFRyYW5zcG9ydGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KK3B1YiB0cmFpdCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhIGNoYW5uZWwgb3ZlciB3aGljaCBieXRlcyBhcmUgdG8gYmUgcmVhZC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+OworfQorCisvLy8gSWRlbnRpZmllcyBhIHRyYW5zcG9ydCB1c2VkIGJ5IGBUT3V0cHV0UHJvdG9jb2xgIHRvIHNlbmQgYnl0ZXMuCitwdWIgdHJhaXQgVFdyaXRlVHJhbnNwb3J0OiBXcml0ZSB7fQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBhIHNlcnZlciB0byBjcmVhdGUgYFRXcml0ZVRyYW5zcG9ydGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KK3B1YiB0cmFpdCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYSBjaGFubmVsIG92ZXIgd2hpY2ggYnl0ZXMgYXJlIHRvIGJlIHNlbnQuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRSZWFkVHJhbnNwb3J0IGZvciBUIHdoZXJlIFQ6IFJlYWQge30KKworaW1wbDxUPiBUV3JpdGVUcmFuc3BvcnQgZm9yIFQgd2hlcmUgVDogV3JpdGUge30KKworLy8gRklYTUU6IGltcGxlbWVudCB0aGUgRGVidWcgdHJhaXQgZm9yIGJveGVkIHRyYW5zcG9ydHMKKworaW1wbDxUPiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZShjaGFubmVsKQorICAgIH0KK30KKworaW1wbDxUPiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUoY2hhbm5lbCkKKyAgICB9Cit9CisKKy8vLyBJZGVudGlmaWVzIGEgc3BsaXR0YWJsZSBiaWRpcmVjdGlvbmFsIEkvTyBjaGFubmVsIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBieXRlcy4KK3B1YiB0cmFpdCBUSW9DaGFubmVsOiBSZWFkICsgV3JpdGUgeworICAgIC8vLyBTcGxpdCB0aGUgY2hhbm5lbCBpbnRvIGEgcmVhZGFibGUgaGFsZiBhbmQgYSB3cml0YWJsZSBoYWxmLCB3aGVyZSB0aGUKKyAgICAvLy8gcmVhZGFibGUgaGFsZiBpbXBsZW1lbnRzIGBpbzo6UmVhZGAgYW5kIHRoZSB3cml0YWJsZSBoYWxmIGltcGxlbWVudHMKKyAgICAvLy8gYGlvOjpXcml0ZWAuIFJldHVybnMgYE5vbmVgIGlmIHRoZSBjaGFubmVsIHdhcyBub3QgaW5pdGlhbGl6ZWQsIG9yIGlmIGl0CisgICAgLy8vIGNhbm5vdCBiZSBzcGxpdCBzYWZlbHkuCisgICAgLy8vCisgICAgLy8vIFJldHVybmVkIGhhbHZlcyBtYXkgc2hhcmUgdGhlIHVuZGVybHlpbmcgT1MgY2hhbm5lbCBvciBidWZmZXIgcmVzb3VyY2VzLgorICAgIC8vLyBJbXBsZW1lbnRhdGlvbnMgKipzaG91bGQgZW5zdXJlKiogdGhhdCB0aGVzZSB0d28gaGFsdmVzIGNhbiBiZSBzYWZlbHkKKyAgICAvLy8gdXNlZCBpbmRlcGVuZGVudGx5IGJ5IGNvbmN1cnJlbnQgdGhyZWFkcy4KKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoOjp0cmFuc3BvcnQ6OlJlYWRIYWxmPFNlbGY+LCA6OnRyYW5zcG9ydDo6V3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZDsKK30KKworLy8vIFRoZSByZWFkYWJsZSBoYWxmIG9mIGFuIG9iamVjdCByZXR1cm5lZCBmcm9tIGBUSW9DaGFubmVsOjpzcGxpdGAuCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgaGFuZGxlOiBDLAorfQorCisvLy8gVGhlIHdyaXRhYmxlIGhhbGYgb2YgYW4gb2JqZWN0IHJldHVybmVkIGZyb20gYFRJb0NoYW5uZWw6OnNwbGl0YC4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGhhbmRsZTogQywKK30KKworaW1wbDxDPiBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgUmVhZEhhbGZgIGFzc29jaWF0ZWQgd2l0aCByZWFkYWJsZSBgaGFuZGxlYAorICAgIHB1YiBmbiBuZXcoaGFuZGxlOiBDKSAtPiBSZWFkSGFsZjxDPiB7CisgICAgICAgIFJlYWRIYWxmIHsgaGFuZGxlIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgV3JpdGVIYWxmYCBhc3NvY2lhdGVkIHdpdGggd3JpdGFibGUgYGhhbmRsZWAKKyAgICBwdWIgZm4gbmV3KGhhbmRsZTogQykgLT4gV3JpdGVIYWxmPEM+IHsKKyAgICAgICAgV3JpdGVIYWxmIHsgaGFuZGxlIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYnVmOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUucmVhZChidWYpCisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLndyaXRlKGJ1ZikKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUuZmx1c2goKQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZiBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICB0eXBlIFRhcmdldCA9IEM7CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgICZzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZk11dCBmb3IgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IEMgeworICAgICAgICAmbXV0IHNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmIGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgdHlwZSBUYXJnZXQgPSBDOworCisgICAgZm4gZGVyZWYoJnNlbGYpIC0+ICZTZWxmOjpUYXJnZXQgeworICAgICAgICAmc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWZNdXQgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiBkZXJlZl9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IEMgeworICAgICAgICAmbXV0IHNlbGYuaGFuZGxlCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjppbzo6Q3Vyc29yOworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX2NoYW5uZWxfZnJvbV9jb25jcmV0ZV9yZWFkX3R5cGUoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX2NoYW5uZWxfZnJvbV9ib3hlZF9yZWFkKCkgeworICAgICAgICBsZXQgcjogQm94PFJlYWQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfY2hhbm5lbF9mcm9tX2NvbmNyZXRlX3dyaXRlX3R5cGUoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfY2hhbm5lbF9mcm9tX2JveGVkX3dyaXRlKCkgeworICAgICAgICBsZXQgdzogQm94PFdyaXRlPiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX3RyYW5zcG9ydF9mcm9tX2NvbmNyZXRlX3JlYWRfdHJhbnNwb3J0KCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICAgICAgdGFrZXNfcmVhZF90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF90cmFuc3BvcnRfZnJvbV9ib3hlZF9yZWFkKCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKSk7CisgICAgICAgIHRha2VzX3JlYWRfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX3RyYW5zcG9ydF9mcm9tX2NvbmNyZXRlX3dyaXRlX3RyYW5zcG9ydCgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgICAgICB0YWtlc193cml0ZV90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfdHJhbnNwb3J0X2Zyb21fYm94ZWRfd3JpdGUoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodykpOworICAgICAgICB0YWtlc193cml0ZV90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgIGZuIHRha2VzX3JlYWRfdHJhbnNwb3J0PFI+KHQ6ICZtdXQgUikKKyAgICB3aGVyZQorICAgICAgICBSOiBUUmVhZFRyYW5zcG9ydCwKKyAgICB7CisgICAgICAgIHQuYnl0ZXMoKTsKKyAgICB9CisKKyAgICBmbiB0YWtlc193cml0ZV90cmFuc3BvcnQ8Vz4odDogJm11dCBXKQorICAgIHdoZXJlCisgICAgICAgIFc6IFRXcml0ZVRyYW5zcG9ydCwKKyAgICB7CisgICAgICAgIHQuZmx1c2goKS51bndyYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycwpAQCAtMCwwICsxLDE2OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e0Vycm9yS2luZCwgUmVhZCwgV3JpdGV9OwordXNlIHN0ZDo6bmV0Ojp7U2h1dGRvd24sIFRjcFN0cmVhbX07CisKK3VzZSBzdXBlcjo6e1JlYWRIYWxmLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OwordXNlIHtuZXdfdHJhbnNwb3J0X2Vycm9yLCBUcmFuc3BvcnRFcnJvcktpbmR9OworCisvLy8gQmlkaXJlY3Rpb25hbCBUQ1AvSVAgY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworLy8vIGMucmVhZCgmbXV0IGJ1ZikudW53cmFwKCk7CisvLy8gYy53cml0ZSgmdmVjIVswLCAxLCAyXSkudW53cmFwKCk7CisvLy8gYGBgCisvLy8KKy8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgIGJ5IHdyYXBwaW5nIGFuIGV4aXN0aW5nIGBUY3BTdHJlYW1gLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisvLy8gdXNlIHN0ZDo6bmV0OjpUY3BTdHJlYW07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBzdHJlYW0gPSBUY3BTdHJlYW06OmNvbm5lY3QoIjEyNy4wLjAuMTo5MTg5IikudW53cmFwKCk7CisvLy8KKy8vLyAvLyBubyBuZWVkIHRvIGNhbGwgYy5vcGVuKCkgc2luY2Ugd2UndmUgYWxyZWFkeSBjb25uZWN0ZWQgYWJvdmUKKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6d2l0aF9zdHJlYW0oc3RyZWFtKTsKKy8vLworLy8vIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDRdOworLy8vIGMucmVhZCgmbXV0IGJ1ZikudW53cmFwKCk7CisvLy8gYy53cml0ZSgmdmVjIVswLCAxLCAyXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZywgRGVmYXVsdCldCitwdWIgc3RydWN0IFRUY3BDaGFubmVsIHsKKyAgICBzdHJlYW06IE9wdGlvbjxUY3BTdHJlYW0+LAorfQorCitpbXBsIFRUY3BDaGFubmVsIHsKKyAgICAvLy8gQ3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgYFRUY3BDaGFubmVsYC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHJldHVybmVkIGluc3RhbmNlIG11c3QgYmUgb3BlbmVkIHVzaW5nIGBUVGNwQ2hhbm5lbDo6b3BlbiguLi4pYAorICAgIC8vLyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuCisgICAgcHViIGZuIG5ldygpIC0+IFRUY3BDaGFubmVsIHsKKyAgICAgICAgVFRjcENoYW5uZWwgeyBzdHJlYW06IE5vbmUgfQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgIHRoYXQgd3JhcHMgYW4gZXhpc3RpbmcgYFRjcFN0cmVhbWAuCisgICAgLy8vCisgICAgLy8vIFRoZSBwYXNzZWQtaW4gc3RyZWFtIGlzIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIG9wZW5lZCBiZWZvcmUgYmVpbmcgd3JhcHBlZAorICAgIC8vLyBieSB0aGUgY3JlYXRlZCBgVFRjcENoYW5uZWxgIGluc3RhbmNlLgorICAgIHB1YiBmbiB3aXRoX3N0cmVhbShzdHJlYW06IFRjcFN0cmVhbSkgLT4gVFRjcENoYW5uZWwgeworICAgICAgICBUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICBzdHJlYW06IFNvbWUoc3RyZWFtKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBDb25uZWN0IHRvIGByZW1vdGVfYWRkcmVzc2AsIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBmb3JtIGBob3N0OnBvcnRgLgorICAgIHB1YiBmbiBvcGVuKCZtdXQgc2VsZiwgcmVtb3RlX2FkZHJlc3M6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHNlbGYuc3RyZWFtLmlzX3NvbWUoKSB7CisgICAgICAgICAgICBFcnIobmV3X3RyYW5zcG9ydF9lcnJvcigKKyAgICAgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuLAorICAgICAgICAgICAgICAgICJ0Y3AgY29ubmVjdGlvbiBwcmV2aW91c2x5IG9wZW5lZCIsCisgICAgICAgICAgICApKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF0Y2ggVGNwU3RyZWFtOjpjb25uZWN0KCZyZW1vdGVfYWRkcmVzcykgeworICAgICAgICAgICAgICAgIE9rKHMpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBTb21lKHMpOworICAgICAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXJyKGUpID0+IEVycihGcm9tOjpmcm9tKGUpKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBTaHV0IGRvd24gdGhpcyBjaGFubmVsLgorICAgIC8vLworICAgIC8vLyBCb3RoIHNlbmQgYW5kIHJlY2VpdmUgaGFsdmVzIGFyZSBjbG9zZWQsIGFuZCB0aGlzIGluc3RhbmNlIGNhbiBubworICAgIC8vLyBsb25nZXIgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFub3RoZXIgZW5kcG9pbnQuCisgICAgcHViIGZuIGNsb3NlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMuc2h1dGRvd24oU2h1dGRvd246OkJvdGgpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiBpZl9zZXQ8RiwgVD4oJm11dCBzZWxmLCBtdXQgc3RyZWFtX29wZXJhdGlvbjogRikgLT4gaW86OlJlc3VsdDxUPgorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVGNwU3RyZWFtKSAtPiBpbzo6UmVzdWx0PFQ+LAorICAgIHsKKyAgICAgICAgaWYgbGV0IFNvbWUocmVmIG11dCBzKSA9IHNlbGYuc3RyZWFtIHsKKyAgICAgICAgICAgIHN0cmVhbV9vcGVyYXRpb24ocykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihpbzo6RXJyb3I6Om5ldygKKyAgICAgICAgICAgICAgICBFcnJvcktpbmQ6Ok5vdENvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICAidGNwIGVuZHBvaW50IG5vdCBjb25uZWN0ZWQiLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUSW9DaGFubmVsIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KFJlYWRIYWxmPFNlbGY+LCBXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkLAorICAgIHsKKyAgICAgICAgbGV0IG11dCBzID0gc2VsZjsKKworICAgICAgICBzLnN0cmVhbQorICAgICAgICAgICAgLmFzX211dCgpCisgICAgICAgICAgICAuYW5kX3RoZW4ofHN8IHMudHJ5X2Nsb25lKCkub2soKSkKKyAgICAgICAgICAgIC5tYXAofGNsb25lZHwgeworICAgICAgICAgICAgICAgIGxldCByZWFkX2hhbGYgPSBSZWFkSGFsZjo6bmV3KFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBzLnN0cmVhbS50YWtlKCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbGV0IHdyaXRlX2hhbGYgPSBXcml0ZUhhbGY6Om5ldyhUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbTogU29tZShjbG9uZWQpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIChyZWFkX2hhbGYsIHdyaXRlX2hhbGYpCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLm9rX29yX2Vsc2UofHwgeworICAgICAgICAgICAgICAgIG5ld190cmFuc3BvcnRfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjbG9uZSB1bmRlcmx5aW5nIHRjcCBzdHJlYW0iLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsIFJlYWQgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLnJlYWQoYikpCisgICAgfQorfQorCitpbXBsIFdyaXRlIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy53cml0ZShiKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMuZmx1c2goKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9DYXJnby50b21sIGIvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE1IEBACitbcGFja2FnZV0KK25hbWUgPSAia2l0Y2hlbi1zaW5rIgordmVyc2lvbiA9ICIwLjEuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLyIKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRkNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK3N0dWJzOiB0aHJpZnRzL0Jhc2VfT25lLnRocmlmdCB0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCB0aHJpZnRzL01pZGxheWVyLnRocmlmdCB0aHJpZnRzL1VsdGltYXRlLnRocmlmdCAkKHRvcF9idWlsZGRpcikvdGVzdC9SZWN1cnNpdmUudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvQmFzZV9Ud28udGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL01pZGxheWVyLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKKwkkKFRIUklGVCkgLW91dCBzcmMgLS1nZW4gcnMgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorCitjaGVjazogc3R1YnMKKwkkKENBUkdPKSBidWlsZAorCSQoQ0FSR08pIHRlc3QKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy9raXRjaGVuX3Npbmtfc2VydmVyIGJpbi9raXRjaGVuX3Npbmtfc2VydmVyCisJY3AgdGFyZ2V0L2RlYnVnL2tpdGNoZW5fc2lua19jbGllbnQgYmluL2tpdGNoZW5fc2lua19jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvYmFzZV9vbmUucnMKKwktJChSTSkgc3JjL2Jhc2VfdHdvLnJzCisJLSQoUk0pIHNyYy9taWRsYXllci5ycworCS0kKFJNKSBzcmMvdWx0aW1hdGUucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisJdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgXAorCXRocmlmdHMvQmFzZV9Ud28udGhyaWZ0IFwKKwl0aHJpZnRzL01pZGxheWVyLnRocmlmdCBcCisJdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgXAorCXNyYy9saWIucnMgXAorCXNyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycyBcCisJc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk1Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCkBAIC0wLDAgKzEsMjM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CisKK2V4dGVybiBjcmF0ZSBraXRjaGVuX3Npbms7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworCit1c2Ugc3RkOjpjb252ZXJ0OjpJbnRvOworCit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX3R3bzo6e1ROYXBraW5TZXJ2aWNlU3luY0NsaWVudCwgVFJhbWVuU2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6bWlkbGF5ZXI6OntNZWFsU2VydmljZVN5bmNDbGllbnQsIFRNZWFsU2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOjp7Q29SZWMsIENvUmVjMiwgUmVjTGlzdCwgUmVjVHJlZSwgVFRlc3RTZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6e0Z1bGxNZWFsU2VydmljZVN5bmNDbGllbnQsIFRGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sLAorICAgIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsCit9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgUmVhZEhhbGYsIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRUY3BDaGFubmVsLCBXcml0ZUhhbGYsCit9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJraXRjaGVuIHNpbmsgY2xpZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJraXRjaGVuIHNpbmsgY2xpZW50IGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X2tpdGNoZW5fc2lua19jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCBraXRjaGVuIHNpbmsgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiSG9zdCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxvY2F0ZWQiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJQb3J0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2aWNlOiAtLXNlcnZpY2UgK3Rha2VzX3ZhbHVlICJTZXJ2aWNlIHR5cGUgdG8gY29udGFjdCAoXCJwYXJ0XCIsIFwiZnVsbFwiLCBcInJlY3Vyc2l2ZVwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgaG9zdCA9IG1hdGNoZXMudmFsdWVfb2YoImhvc3QiKS51bndyYXBfb3IoIjEyNy4wLjAuMSIpOworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiY29tcGFjdCIpOworICAgIGxldCBzZXJ2aWNlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmljZSIpLnVud3JhcF9vcigicGFydCIpOworCisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSB0Y3BfY2hhbm5lbChob3N0LCBwb3J0KT87CisgICAgbGV0IChpX3RyYW4sIG9fdHJhbikgPSAoCisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSwKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSwKKyAgICApOworCisgICAgbGV0IChpX3Byb3QsIG9fcHJvdCk6IChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPikgPSBtYXRjaCBwcm90b2NvbCB7CisgICAgICAgICJiaW5hcnkiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpKSwKKyAgICAgICAgKSwKKyAgICAgICAgImNvbXBhY3QiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbikpLAorICAgICAgICApLAorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBwcm90b2NvbCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgcnVuX2NsaWVudChzZXJ2aWNlLCBpX3Byb3QsIG9fcHJvdCkKK30KKworZm4gcnVuX2NsaWVudCgKKyAgICBzZXJ2aWNlOiAmc3RyLAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIG1hdGNoIHNlcnZpY2UgeworICAgICAgICAiZnVsbCIgPT4gZXhlY19mdWxsX21lYWxfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgInBhcnQiID0+IGV4ZWNfbWVhbF9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICAicmVjdXJzaXZlIiA9PiBleGVjX3JlY3Vyc2l2ZV9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpmcm9tKGZvcm1hdCEoCisgICAgICAgICAgICAidW5rbm93biBzZXJ2aWNlIHR5cGUge30iLAorICAgICAgICAgICAgc2VydmljZQorICAgICAgICApKSksCisgICAgfQorfQorCitmbiB0Y3BfY2hhbm5lbCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KFJlYWRIYWxmPFRUY3BDaGFubmVsPiwgV3JpdGVIYWxmPFRUY3BDaGFubmVsPik+IHsKKyAgICBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisgICAgYy5zcGxpdCgpCit9CisKK2ZuIGV4ZWNfbWVhbF9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSBNZWFsU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAvLyBjbGllbnQuZnVsbF9tZWFsKCk7IC8vIDwtLSBJTVBPUlRBTlQ6IGlmIHlvdSB1bmNvbW1lbnQgdGhpcywgY29tcGlsYXRpb24gKnNob3VsZCogZmFpbAorICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0aGUgTWVhbFNlcnZpY2Ugc3RydWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGFwcHJvcHJpYXRlIHNlcnZpY2UgbWFya2VyCisKKyAgICAvLyBvbmx5IHRoZSBmb2xsb3dpbmcgdGhyZWUgY2FsbHMgd29yaworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJyYW1lbiIsIHx8IGNsaWVudC5yYW1lbig1MCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAibWVhbCIsIHx8IGNsaWVudC5tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAibmFwa2luIiwgfHwgY2xpZW50Lm5hcGtpbigpKS5tYXAofF98ICgpKT87CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY19mdWxsX21lYWxfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gRnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJyYW1lbiIsIHx8IGNsaWVudC5yYW1lbigxMDApKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgIm1lYWwiLCB8fCBjbGllbnQubWVhbCgpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgIm5hcGtpbiIsIHx8IGNsaWVudC5uYXBraW4oKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJmdWxsIG1lYWwiLCB8fCBjbGllbnQuZnVsbF9tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKworICAgIE9rKCgpKQorfQorCitmbiBleGVjX3JlY3Vyc2l2ZV9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIGxldCB0cmVlID0gUmVjVHJlZSB7CisgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhWworICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoNCksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pXSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKworICAgIGxldCBleHBlY3RlZF90cmVlID0gUmVjVHJlZSB7CisgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhWworICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogU29tZShWZWM6Om5ldygpKSwgLy8gcmVtb3RlIHJldHVybnMgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogU29tZShWZWM6Om5ldygpKSwgLy8gcmVtb3RlIHJldHVybnMgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDQpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KV0pLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisKKyAgICBsZXQgcmV0dXJuZWRfdHJlZSA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fdHJlZSIsIHx8IGNsaWVudC5lY2hvX3RyZWUodHJlZS5jbG9uZSgpKSk/OworICAgIGlmIHJldHVybmVkX3RyZWUgIT0gZXhwZWN0ZWRfdHJlZSB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgKKyAgICAgICAgICAgICJtaXNtYXRjaGVkIHJlY3Vyc2l2ZSB0cmVlIHs6P30gezo/fSIsCisgICAgICAgICAgICBleHBlY3RlZF90cmVlLCByZXR1cm5lZF90cmVlCisgICAgICAgICkKKyAgICAgICAgLmludG8oKSk7CisgICAgfQorCisgICAgbGV0IGxpc3QgPSBSZWNMaXN0IHsKKyAgICAgICAgbmV4dGl0ZW06IFNvbWUoQm94OjpuZXcoUmVjTGlzdCB7CisgICAgICAgICAgICBuZXh0aXRlbTogU29tZShCb3g6Om5ldyhSZWNMaXN0IHsKKyAgICAgICAgICAgICAgICBuZXh0aXRlbTogTm9uZSwKKyAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSkpLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisgICAgbGV0IHJldHVybmVkX2xpc3QgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX2xpc3QiLCB8fCBjbGllbnQuZWNob19saXN0KGxpc3QuY2xvbmUoKSkpPzsKKyAgICBpZiByZXR1cm5lZF9saXN0ICE9IGxpc3QgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoIm1pc21hdGNoZWQgcmVjdXJzaXZlIGxpc3Qgezo/fSB7Oj99IiwgbGlzdCwgcmV0dXJuZWRfbGlzdCkuaW50bygpKTsKKyAgICB9CisKKyAgICBsZXQgY29fcmVjID0gQ29SZWMgeworICAgICAgICBvdGhlcjogU29tZShCb3g6Om5ldyhDb1JlYzIgeworICAgICAgICAgICAgb3RoZXI6IFNvbWUoQ29SZWMgeworICAgICAgICAgICAgICAgIG90aGVyOiBTb21lKEJveDo6bmV3KENvUmVjMiB7IG90aGVyOiBOb25lIH0pKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9KSksCisgICAgfTsKKyAgICBsZXQgcmV0dXJuZWRfY29fcmVjID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob19jb19yZWMiLCB8fCB7CisgICAgICAgIGNsaWVudC5lY2hvX2NvX3JlYyhjb19yZWMuY2xvbmUoKSkKKyAgICB9KT87CisgICAgaWYgcmV0dXJuZWRfY29fcmVjICE9IGNvX3JlYyB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgibWlzbWF0Y2hlZCBjb19yZWMgezo/fSB7Oj99IiwgY29fcmVjLCByZXR1cm5lZF9jb19yZWMpLmludG8oKSk7CisgICAgfQorCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWN1dGVfY2FsbDxGLCBSPihzZXJ2aWNlX3R5cGU6ICZzdHIsIGNhbGxfbmFtZTogJnN0ciwgbXV0IGY6IEYpIC0+IHRocmlmdDo6UmVzdWx0PFI+Cit3aGVyZQorICAgIEY6IEZuTXV0KCkgLT4gdGhyaWZ0OjpSZXN1bHQ8Uj4sCit7CisgICAgbGV0IHJlcyA9IGYoKTsKKworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKF8pID0+IHByaW50bG4hKCJ7fTogY29tcGxldGVkIHt9IGNhbGwiLCBzZXJ2aWNlX3R5cGUsIGNhbGxfbmFtZSksCisgICAgICAgIEVycihyZWYgZSkgPT4gcHJpbnRsbiEoCisgICAgICAgICAgICAie306IGZhaWxlZCB7fSBjYWxsIHdpdGggZXJyb3Igezo/fSIsCisgICAgICAgICAgICBzZXJ2aWNlX3R5cGUsIGNhbGxfbmFtZSwgZQorICAgICAgICApLAorICAgIH0KKworICAgIHJlcworfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODAxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMKQEAgLTAsMCArMSwzMTMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBraXRjaGVuX3Npbms7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworCit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX29uZTo6Tm9vZGxlOwordXNlIGtpdGNoZW5fc2luazo6YmFzZV90d286OnsKKyAgICBCcm90aFR5cGUsIE5hcGtpbiwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyLCBSYW1lbiwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIsCit9OwordXNlIGtpdGNoZW5fc2luazo6bWlkbGF5ZXI6OnsKKyAgICBEZXNzZXJ0LCBNZWFsLCBNZWFsU2VydmljZVN5bmNIYW5kbGVyLCBNZWFsU2VydmljZVN5bmNQcm9jZXNzb3IsIFBpZSwKK307Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU7Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6RnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY0hhbmRsZXI7Cit1c2Uga2l0Y2hlbl9zaW5rOjp1bHRpbWF0ZTo6eworICAgIERyaW5rLCBGdWxsTWVhbCwgRnVsbE1lYWxBbmREcmlua3MsIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNQcm9jZXNzb3IsCisgICAgRnVsbE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIsCit9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJraXRjaGVuIHNpbmsgc2VydmVyIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJraXRjaGVuIHNpbmsgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X2tpdGNoZW5fc2lua19zZXJ2ZXIgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCBraXRjaGVuIHNpbmsgdGVzdCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0ZXN0IHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2aWNlOiAtLXNlcnZpY2UgK3Rha2VzX3ZhbHVlICJTZXJ2aWNlIHR5cGUgdG8gY29udGFjdCAoXCJwYXJ0XCIsIFwiZnVsbFwiLCBcInJlY3Vyc2l2ZVwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImNvbXBhY3QiKTsKKyAgICBsZXQgc2VydmljZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZpY2UiKS51bndyYXBfb3IoInBhcnQiKTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIHByaW50bG4hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IHJfdHJhbnNwb3J0X2ZhY3RvcnkgPSBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCB3X3RyYW5zcG9ydF9mYWN0b3J5ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisKKyAgICBsZXQgKGlfcHJvdG9jb2xfZmFjdG9yeSwgb19wcm90b2NvbF9mYWN0b3J5KTogKAorICAgICAgICBCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiwKKyAgICAgICAgQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICkgPSBtYXRjaCAmKnByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICksCisgICAgICAgICJjb21wYWN0IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICApLAorICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEZJWE1FOiBzaG91bGQgcHJvY2Vzc29yIGJlIGJveGVkIGFzIHdlbGw/CisgICAgLy8KKyAgICAvLyBbc2lnaF0gSSBoYXRlIFJ1c3QgZ2VuZXJpY3MgaW1wbGVtZW50YXRpb24KKyAgICAvLworICAgIC8vIEkgd291bGQgaGF2ZSBwcmVmZXJyZWQgdG8gYnVpbGQgYSBzZXJ2ZXIgaGVyZSwgcmV0dXJuIGl0LCBhbmQgdGhlbiBkbworICAgIC8vIHRoZSBjb21tb24gbGlzdGVuLWFuZC1oYW5kbGUgc3R1ZmYsIGJ1dCBzaW5jZSB0aGUgc2VydmVyIGRvZXNuJ3QgaGF2ZSBhCisgICAgLy8gY29tbW9uIHR5cGUgKGJlY2F1c2UgZWFjaCBtYXRjaCBhcm0gaW5zdGFudGlhdGVzIGEgc2VydmVyIHdpdGggYQorICAgIC8vIGRpZmZlcmVudCBwcm9jZXNzb3IpIHRoaXMgaXNuJ3QgcG9zc2libGUuCisgICAgLy8KKyAgICAvLyBTaW5jZSB3aGF0IEknbSBkb2luZyBpcyB1bmNvbW1vbiBJJ20ganVzdCBnb2luZyB0byBkdXBsaWNhdGUgdGhlIGNvZGUKKyAgICBtYXRjaCAmKnNlcnZpY2UgeworICAgICAgICAicGFydCIgPT4gcnVuX21lYWxfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgICJmdWxsIiA9PiBydW5fZnVsbF9tZWFsX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICAicmVjdXJzaXZlIiA9PiBydW5fcmVjdXJzaXZlX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICB1bmtub3duID0+IEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBzZXJ2aWNlIHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpLAorICAgIH0KK30KKworZm4gcnVuX21lYWxfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSBNZWFsU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhQYXJ0SGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK2ZuIHJ1bl9mdWxsX21lYWxfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoRnVsbEhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitzdHJ1Y3QgUGFydEhhbmRsZXI7CisKK2ltcGwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2sobWVhbCgpKQorICAgIH0KK30KKworaW1wbCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9yYW1lbigmc2VsZiwgXzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxSYW1lbj4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgcmFtZW4gY2FsbCIpOworICAgICAgICBPayhyYW1lbigpKQorICAgIH0KK30KKworaW1wbCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbmFwa2luKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxOYXBraW4+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIG5hcGtpbiBjYWxsIik7CisgICAgICAgIE9rKG5hcGtpbigpKQorICAgIH0KK30KKworLy8gZnVsbCBzZXJ2aWNlCisvLworCitzdHJ1Y3QgRnVsbEhhbmRsZXI7CisKK2ltcGwgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZnVsbF9tZWFsX2FuZF9kcmlua3MoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PEZ1bGxNZWFsQW5kRHJpbmtzPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsX21lYWxfYW5kX2RyaW5rczogaGFuZGxpbmcgZnVsbCBtZWFsIGFuZCBkcmlua3MgY2FsbCIpOworICAgICAgICBPayhGdWxsTWVhbEFuZERyaW5rczo6bmV3KGZ1bGxfbWVhbCgpLCBEcmluazo6Q2FuYWRpYW5XaGlza3kpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9iZXN0X3BpZSgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8UGllPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsX21lYWxfYW5kX2RyaW5rczogaGFuZGxpbmcgcGllIGNhbGwiKTsKKyAgICAgICAgT2soUGllOjpNaXNzaXNzaXBwaU11ZCkgLy8gSSBwcmVmZXIgUGllOjpQdW1wa2luLCBidXQgSSBoYXZlIHRvIGNoZWNrIHRoYXQgY2FzaW5nIHdvcmtzCisgICAgfQorfQorCitpbXBsIEZ1bGxNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2Z1bGxfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8RnVsbE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIGZ1bGwgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKGZ1bGxfbWVhbCgpKQorICAgIH0KK30KKworaW1wbCBNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIG1lYWwgY2FsbCIpOworICAgICAgICBPayhtZWFsKCkpCisgICAgfQorfQorCitpbXBsIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX3JhbWVuKCZzZWxmLCBfOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFJhbWVuPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyByYW1lbiBjYWxsIik7CisgICAgICAgIE9rKHJhbWVuKCkpCisgICAgfQorfQorCitpbXBsIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9uYXBraW4oJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE5hcGtpbj4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgbmFwa2luIGNhbGwiKTsKKyAgICAgICAgT2sobmFwa2luKCkpCisgICAgfQorfQorCitmbiBmdWxsX21lYWwoKSAtPiBGdWxsTWVhbCB7CisgICAgRnVsbE1lYWw6Om5ldyhtZWFsKCksIERlc3NlcnQ6OlBvcnQoIkdyYWhhbSdzIFRhd255Ii50b19vd25lZCgpKSkKK30KKworZm4gbWVhbCgpIC0+IE1lYWwgeworICAgIE1lYWw6Om5ldyhub29kbGUoKSwgcmFtZW4oKSkKK30KKworZm4gbm9vZGxlKCkgLT4gTm9vZGxlIHsKKyAgICBOb29kbGU6Om5ldygic3BlbHQiLnRvX293bmVkKCksIDEwMCkKK30KKworZm4gcmFtZW4oKSAtPiBSYW1lbiB7CisgICAgUmFtZW46Om5ldygiTXIgUmFtZW4iLnRvX293bmVkKCksIDcyLCBCcm90aFR5cGU6Ok1pc28pCit9CisKK2ZuIG5hcGtpbigpIC0+IE5hcGtpbiB7CisgICAgTmFwa2luIHt9Cit9CisKK2ZuIHJ1bl9yZWN1cnNpdmVfc2VydmVyPFJURiwgSVBGLCBXVEYsIE9QRj4oCisgICAgbGlzdGVuX2FkZHJlc3M6ICZzdHIsCisgICAgcl90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgIGlfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgIHdfdHJhbnNwb3J0X2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvY29sX2ZhY3Rvcnk6IE9QRiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+Cit3aGVyZQorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIGxldCBwcm9jZXNzb3IgPSByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworc3RydWN0IFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyOworaW1wbCByZWN1cnNpdmU6OlRlc3RTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFJlY3Vyc2l2ZVRlc3RTZXJ2ZXJIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZWNob190cmVlKCZzZWxmLCB0cmVlOiByZWN1cnNpdmU6OlJlY1RyZWUpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6UmVjVHJlZT4geworICAgICAgICBwcmludGxuISgiezo/fSIsIHRyZWUpOworICAgICAgICBPayh0cmVlKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9lY2hvX2xpc3QoJnNlbGYsIGxzdDogcmVjdXJzaXZlOjpSZWNMaXN0KSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OlJlY0xpc3Q+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCBsc3QpOworICAgICAgICBPayhsc3QpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2VjaG9fY29fcmVjKCZzZWxmLCBpdGVtOiByZWN1cnNpdmU6OkNvUmVjKSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OkNvUmVjPiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgaXRlbSk7CisgICAgICAgIE9rKGl0ZW0pCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycyBiL2xpYi9ycy90ZXN0L3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlMTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9saWIucnMKQEAgLTAsMCArMSw1NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK3B1YiBtb2QgYmFzZV9vbmU7CitwdWIgbW9kIGJhc2VfdHdvOworcHViIG1vZCBtaWRsYXllcjsKK3B1YiBtb2QgdWx0aW1hdGU7CitwdWIgbW9kIHJlY3Vyc2l2ZTsKKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoU29tZShiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCkpLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3Rvcl93aXRoX25vX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KE5vbmUsIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yX3dpdGhvdXRfb3B0aW9uX3dyYXAoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCksIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2RlZmF1bHRzKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsIHsKKyAgICAgICAgICAgIG5vb2RsZTogU29tZShiYXNlX29uZTo6Tm9vZGxlOjpkZWZhdWx0KCkpLAorICAgICAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmE2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdApAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit0eXBlZGVmIGk2NCBUZW1wZXJhdHVyZQorCit0eXBlZGVmIGk4IFNpemUKKwordHlwZWRlZiBzdHJpbmcgTG9jYXRpb24KKworY29uc3QgaTMyIEJvaWxpbmdQb2ludCA9IDEwMAorCitjb25zdCBsaXN0PFRlbXBlcmF0dXJlPiBUZW1wZXJhdHVyZXMgPSBbMTAsIDExLCAyMiwgMzNdCisKKy8vIElNUE9SVEFOVDogdGVtcHMgc2hvdWxkIGVuZCB3aXRoICIuMCIgYmVjYXVzZSB0aGlzIHRlc3RzCisvLyB0aGF0IHdlIGRvbid0IGhhdmUgYSBwcm9ibGVtIHdpdGggY29uc3QgZmxvYXQgbGlzdCBnZW5lcmF0aW9uCitjb25zdCBsaXN0PGRvdWJsZT4gQ29tbW9uVGVtcGVyYXR1cmVzID0gWzMwMC4wLCA0NTAuMF0KKworY29uc3QgZG91YmxlIE1lYWxzUGVyRGF5ID0gMi41OworCitjb25zdCBzdHJpbmcgRGVmYXVsdFJlY2lwZU5hbWUgPSAiU291cC1yaXNlIG9mIHRoZSBEYXkiCitjb25zdCBiaW5hcnkgRGVmYXVsdFJlY2lwZUJpbmFyeSA9ICJTb3VwLXJpc2Ugb2YgdGhlIDAxMDEwMTAxIgorCitzdHJ1Y3QgTm9vZGxlIHsKKyAgMTogc3RyaW5nIGZsb3VyVHlwZQorICAyOiBUZW1wZXJhdHVyZSBjb29rVGVtcAorfQorCitzdHJ1Y3QgU3BhZ2hldHRpIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxOb29kbGU+IG5vb2RsZXMKK30KKworY29uc3QgTm9vZGxlIFNwZWx0Tm9vZGxlID0geyAiZmxvdXJUeXBlIjogInNwZWx0IiwgImNvb2tUZW1wIjogMTEwIH0KKworc3RydWN0IE1lYXN1cmluZ1Nwb29uIHsKKyAgMTogU2l6ZSBzaXplCit9CisKK3N0cnVjdCBNZWFzdXJpbmdDdXAgeworICAxOiBkb3VibGUgbWlsbGlzCit9CisKK3VuaW9uIE1lYXN1cmluZ0FpZHMgeworICAxOiBNZWFzdXJpbmdTcG9vbiBzcG9vbgorICAyOiBNZWFzdXJpbmdDdXAgY3VwCit9CisKK3N0cnVjdCBDb29raW5nVGVtcGVyYXR1cmVzIHsKKyAgMTogc2V0PGRvdWJsZT4gY29tbW9uVGVtcGVyYXR1cmVzCisgIDI6IGxpc3Q8ZG91YmxlPiB1c2VkVGVtcGVyYXR1cmVzCisgIDM6IG1hcDxkb3VibGUsIGRvdWJsZT4gZmFocmVuaGVpdFRvQ2VudGlncmFkZUNvbnZlcnNpb25zCit9CisKK3N0cnVjdCBSZWNpcGUgeworICAxOiBzdHJpbmcgcmVjaXBlTmFtZQorICAyOiBzdHJpbmcgY3Vpc2luZQorICAzOiBpOCBwYWdlCit9CisKK3VuaW9uIENvb2tpbmdUb29scyB7CisgIDE6IHNldDxNZWFzdXJpbmdTcG9vbj4gbWVhc3VyaW5nU3Bvb25zCisgIDI6IG1hcDxTaXplLCBMb2NhdGlvbj4gbWVhc3VyaW5nQ3VwcywKKyAgMzogbGlzdDxSZWNpcGU+IHJlY2lwZXMKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE2YWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworY29uc3QgaTMyIFdhdGVyV2VpZ2h0ID0gMjAwCisKK2VudW0gYnJvdGhUeXBlIHsKKyAgTWlzbywKKyAgc2hvdXl1LAorfQorCitzdHJ1Y3QgUmFtZW4geworICAxOiBvcHRpb25hbCBzdHJpbmcgcmFtZW5UeXBlCisgIDI6IHJlcXVpcmVkIGkzMiBub29kbGVDb3VudAorICAzOiBicm90aFR5cGUgYnJvdGgKK30KKworc3RydWN0IE5hcGtpbiB7CisgIC8vIGVtcHR5Cit9CisKK3NlcnZpY2UgTmFwa2luU2VydmljZSB7CisgIE5hcGtpbiBuYXBraW4oKQorfQorCitzZXJ2aWNlIFJhbWVuU2VydmljZSBleHRlbmRzIE5hcGtpblNlcnZpY2UgeworICBSYW1lbiByYW1lbigxOiBpMzIgcmVxdWVzdGVkTm9vZGxlQ291bnQpCit9CisKKy8qIGNvbnN0IHN0cnVjdCBDb29rZWRSYW1lbiA9IHsgImJhciI6IDEwIH0gKi8KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZmNDliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworaW5jbHVkZSAiQmFzZV9PbmUudGhyaWZ0IgoraW5jbHVkZSAiQmFzZV9Ud28udGhyaWZ0IgorCitjb25zdCBpMzIgV2F0ZXJCb2lsaW5nUG9pbnQgPSBCYXNlX09uZS5Cb2lsaW5nUG9pbnQKKworY29uc3QgbWFwPHN0cmluZywgQmFzZV9PbmUuVGVtcGVyYXR1cmU+IFRlbXBlcmF0dXJlTmFtZXMgPSB7ICJmcmVlemluZyI6IDAsICJib2lsaW5nIjogMTAwIH0KKworY29uc3QgbWFwPHNldDxpMzI+LCBtYXA8bGlzdDxzdHJpbmc+LCBzdHJpbmc+PiBNeUNvbnN0TmVzdGVkTWFwID0geworICBbMCwgMSwgMiwgM106IHsgWyJmb28iXTogImJhciIgfSwKKyAgWzIwXTogeyBbIm51dCIsICJ0b24iXSA6ICJiYXIiIH0sCisgIFszMCwgNDBdOiB7IFsiYm91bmN5IiwgInRpbmtseSJdOiAiY2FzdGxlIiB9Cit9CisKK2NvbnN0IGxpc3Q8bGlzdDxpMzI+PiBNeUNvbnN0TmVzdGVkTGlzdCA9IFsKKyAgWzAsIDEsIDJdLAorICBbMywgNCwgNV0sCisgIFs2LCA3LCA4XQorXQorCitjb25zdCBzZXQ8c2V0PGkzMj4+IE15Q29uc3ROZXN0ZWRTZXQgPSBbCisgIFswLCAxLCAyXSwKKyAgWzMsIDQsIDVdLAorICBbNiwgNywgOF0KK10KKworZW51bSBQaWUgeworICBQVU1QS0lOLAorICBhcHBsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgU1RSQVdCRVJSWV9SSFVCQVJCLAorICBLZXlfTGltZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgY29jb251dF9DcmVhbSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgbWlzc2lzc2lwcGlfbXVkLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorfQorCitzdHJ1Y3QgTWVhbCB7CisgIDE6IEJhc2VfT25lLk5vb2RsZSBub29kbGUKKyAgMjogQmFzZV9Ud28uUmFtZW4gcmFtZW4KK30KKwordW5pb24gRGVzc2VydCAgeworICAxOiBzdHJpbmcgcG9ydAorICAyOiBzdHJpbmcgaWNlV2luZQorfQorCitzZXJ2aWNlIE1lYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZV9Ud28uUmFtZW5TZXJ2aWNlIHsKKyAgTWVhbCBtZWFsKCkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZhMTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworaW5jbHVkZSAiTWlkbGF5ZXIudGhyaWZ0IgorCitlbnVtIERyaW5rIHsKKyAgV0FURVIsCisgIFdISVNLRVksCisgIFdJTkUsCisgIHNjb3RjaCwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgTEFURV9IQVJWRVNUX1dJTkUsCisgIEluZGlhX1BhbGVfQWxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBhcHBsZV9jaWRlciwgLy8gaW50ZW50aWFsbHkgcG9vcmx5IGNhc2VkCisgIGJlbGdpYW5fQWxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBDYW5hZGlhbl93aGlza3ksIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCit9CisKK2NvbnN0IG1hcDxpOCwgTWlkbGF5ZXIuUGllPiBSYW5rZWRQaWVzID0geworICAxOiBNaWRsYXllci5QaWUuUFVNUEtJTiwKKyAgMjogTWlkbGF5ZXIuUGllLlNUUkFXQkVSUllfUkhVQkFSQiwKKyAgMzogTWlkbGF5ZXIuUGllLmFwcGxlLAorICA0OiBNaWRsYXllci5QaWUubWlzc2lzc2lwcGlfbXVkLAorICA1OiBNaWRsYXllci5QaWUuY29jb251dF9DcmVhbSwKKyAgNjogTWlkbGF5ZXIuUGllLktleV9MaW1lLAorfQorCitzdHJ1Y3QgRnVsbE1lYWwgeworICAxOiByZXF1aXJlZCBNaWRsYXllci5NZWFsIG1lYWwKKyAgMjogcmVxdWlyZWQgTWlkbGF5ZXIuRGVzc2VydCBkZXNzZXJ0Cit9CisKK3N0cnVjdCBGdWxsTWVhbEFuZERyaW5rcyB7CisgIDE6IHJlcXVpcmVkIEZ1bGxNZWFsIGZ1bGxNZWFsCisgIDI6IG9wdGlvbmFsIERyaW5rIGRyaW5rCit9CisKK3NlcnZpY2UgRnVsbE1lYWxTZXJ2aWNlIGV4dGVuZHMgTWlkbGF5ZXIuTWVhbFNlcnZpY2UgeworICBGdWxsTWVhbCBmdWxsTWVhbCgpCit9CisKK3NlcnZpY2UgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlIGV4dGVuZHMgRnVsbE1lYWxTZXJ2aWNlIHsKKyAgRnVsbE1lYWxBbmREcmlua3MgZnVsbE1lYWxBbmREcmlua3MoKQorCisgIE1pZGxheWVyLlBpZSBiZXN0UGllKCkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N0L1JFQURNRSBiL2xpYi9zdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9zdC9SRUFETUUKcmVuYW1lIHRvIGxpYi9zdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9zdC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3N0L2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zdC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL3N0L3BhY2thZ2UueG1sIGIvbGliL3N0L3BhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzkzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3QvcGFja2FnZS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPCEtLSBBcGFjaGUgVGhyaWZ0IFNtYWxsdGFsayBsaWJyYXJ5IHZlcnNpb24gMS4wLjAgLS0+Cis8cGFja2FnZT4KKyAgPG5hbWU+bGlidGhyaWZ0LXN0PC9uYW1lPgorICA8ZmlsZT50aHJpZnQuc3Q8L2ZpbGU+CisgIDxmaWxlaW4+dGhyaWZ0LnN0PC9maWxlaW4+Cis8L3BhY2thZ2U+CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9NYWtlZmlsZS5hbSBiL2xpYi9zd2lmdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjg4YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCithbGwtbG9jYWw6CisJc3dpZnQgYnVpbGQgLS1jb25maWd1cmF0aW9uIHJlbGVhc2UKKworaW5zdGFsbC1leGVjLWhvb2s6CisJc3dpZnQgaW5zdGFsbAorCitjbGVhbi1sb2NhbDoKKwlzd2lmdCBwYWNrYWdlIGNsZWFuCisJcm0gLXJmIC5idWlsZAorCitwcmVjcm9zczoKKwlzd2lmdAorCitjaGVjay1sb2NhbDoKKwlzd2lmdCB0ZXN0CisKK0VYVFJBX0RJU1QgPSBcCisJUGFja2FnZS5zd2lmdCBcCisJU291cmNlcyBcCisJVGVzdHMgXAorCVJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZSBcCisJTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0IGIvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzM2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IFBhY2thZ2VEZXNjcmlwdGlvbgorCitsZXQgcGFja2FnZSA9IFBhY2thZ2UoCisJbmFtZTogIlRocmlmdCIKKykKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9SRUFETUUubWQgYi9saWIvc3dpZnQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTA5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE1IEBACitUaHJpZnQgU3dpZnQgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworCisjIyBCdWlsZAorICAgIHN3aWZ0IGJ1aWxkCisKKyMjIFRlc3QKKyAgICBzd2lmdCB0ZXN0CisKKyMjIEluc3RhbGwgTGlicmFyeQorIyMjIyMgQ29jb2Fwb2RzCitBZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIHBvZGZpbGUKK2BgYHJ1YnkKKyAgICBwb2QgJ1RocmlmdC1zd2lmdDMnLCA6Z2l0ID0+ICdnaXRAZ2l0aHViLmNvbTphcGFjaGUvdGhyaWZ0LmdpdCcsIDpicmFuY2ggPT4gJ21hc3RlcicKK2BgYAorCisjIyMjIyBTUE0KK1VuZm9ydHVuYXRlbHkgZHVlIHRvIHNvbWUgbGltaXRhdGlvbnMgaW4gU1BNLCB0aGUgUGFja2FnZSBtYW5pZmVzdCBhbmQgU291cmNlcyBkaXJlY3RvcnkgbXVzdCBiZSBhdCB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KK1RvIGdldCBhcm91bmQgdGhhdCBmb3IgdGhlIHRpbWUgYmVpbmcsIHlvdSBjYW4gdXNlIHRoaXMgbWlycm9yZWQgcmVwby4KK0FkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgUGFja2FnZS5zd2lmdAorYGBgc3dpZnQKK2RlcGVuZGVuY2llczogWworICAgIC5QYWNrYWdlKHVybDogImh0dHBzOi8vZ2l0aHViLmNvbS9hcG9jb2xpcHNlL1RocmlmdC1Td2lmdC5naXQiLCBtYWpvclZlcnNpb246IDEpCitdCitgYGAKKworIyMgVGhyaWZ0IENvbXBpbGVyCisKK1lvdSBjYW4gY29tcGlsZSBJREwgc291cmNlcyBmb3IgU3dpZnQgMyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAgIHRocmlmdCAtLWdlbiBzd2lmdCB0aHJpZnRfZmlsZQorCisjIyBDbGllbnQgRXhhbXBsZQorYGBgc3dpZnQKK2xldCB0cmFuc3BvcnQgPSBUU29ja2V0VHJhbnNwb3J0KGhvc3RuYW1lOiAibG9jYWxob3N0IiwgcG9ydDogOTA5MCkhCisKKy8vICB2YXIgcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydDogdHJhbnNwb3J0KQorbGV0IHByb3RvID0gVEJpbmFyeVByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisvLyAgdmFyIGNsaWVudCA9IEhlcm1lc0NsaWVudChpbm91dFByb3RvY29sOiBwcm90bykKK2xldCBjbGllbnQgPSBUaHJpZnRUZXN0Q2xpZW50KGlub3V0UHJvdG9jb2w6IHByb3RvKQorZG8geworICAgIHRyeSBjbGllbnQudGVzdFZvaWQoKQorfSBjYXRjaCBsZXQgZXJyb3IgeworICAgIHByaW50KCJcKGVycm9yKSIpCit9CitgYGAKKworIyMgTGlicmFyeSBOb3RlcworLSBFbGltaW5hdGVkIFByb3RvY29sIEZhY3RvcmllcywgVGhleSB3ZXJlIG9ubHkgdXNlZCBpbiBhc3luYyBjbGllbnRzIGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLCB3aGVyZSBHZW5lcmljcyBwcm92aWRlIGEgYmV0dGVyIGFsdGVybmF0aXZlLgorLSBTd2lmdHkgRXJyb3JzLCBBbGwgYFRFcnJvcmAgdHlwZXMgaGF2ZSBhIG5lc3RlZCBgRXJyb3JDb2RlYCBFbnVtIGFzIHdlbGwgYXMgc29tZSBleHRyYSBmbGF2b3Igd2hlcmUgbmVlZGVkLgorLSBWYWx1ZSB0eXBlZCBldmVyeXRoaW5nLiAgYFRUcmFuc3BvcnRgIG9wZXJhdGVzIG9uIHZhbHVlIHR5cGVkIGBEYXRhYCByYXRoZXIgdGhhbiByZWZlcmVuY2UgdHlwZWQgYE5TRGF0YWAgb3IgYFVuc2FmZUJ1ZmZlclBvaW50ZXJgcworLSBTd2lmdCAzIE5hbWVkIHByb3RvY29scy4gIFN3aWZ0IDMgbmFtaW5nIGNvbnZlbnRpb25zIHN1Z2dlc3QgdGhlIGVsaW1pbmF0aW9uIG9mIHJlZHVuZGFudCB3b3JkcyB0aGF0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHZhcmlhYmxlL2Z1bmN0aW9uIHNpZ25hdHVyZXMuICBUaGlzIHJlbmFtaW5nIGlzIGFwcGxpZWQgdGhyb3VnaG91dCB0aGUgU3dpZnQgMyBsaWJyYXJ5IGNvbnZlcnRpbmcgbW9zdCBuYW1pbmcgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgU3dpZnQyL0NvY29hIGxpYnJhcnkgdG8gU3dpZnQgMy1lc3F1ZSBuYW1pbmcgY29udmVudGlvbnMuIGVnLgorYGBgc3dpZnQKK2Z1bmMgcmVhZFN0cmluZygpIHRocm93cyAtPiBTdHJpbmcKK2Z1bmMgd3JpdGVTdHJpbmcoXyB2YWw6IFN0cmluZykgdGhyb3dzCitgYGAKK2hhdmUgYmVlbiByZW5hbWVkIHRvIGVsaW1pbmF0ZSByZWR1bmRhbnQgd29yZHM6CitgYGBzd2lmdAorZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZworZnVuYyB3cml0ZShfIHZhbDogU3RyaW5nKSB0aHJvd3MKK2BgYAorCistIEVsaW1pbmF0ZWQgYFRIVFRQVHJhbnNwb3J0YCB0aGF0IHVzZXMgYE5TVVJMQ29ubmVjdGlvbmAgZHVlIHRvIGl0IGJlaW5nIGRlcHJlY2F0ZWQgYW5kIG5vdCBhdmFpbGFibGUgYXQgYWxsIGluIFN3aWZ0IDMgZm9yIExpbnV4LiAgYFRIVFRQU2Vzc2lvblRyYW5zcG9ydGAgZnJvbSB0aGUgU3dpZnQyL0NvY29hIGxpYnJhcnkgdGhhdCB1c2VzIGBOU1VSTFNlc3Npb25gIGhhcyBiZWVuIHJlbmFtZWQgdG8gYFRIVFRQVHJhbnNwb3J0YCBmb3IgdGhpcyBsaWJyYXJ5IGFuZCBsZXZlcmFnZXMgYFVSTFNlc3Npb25gLCBwcm92aWRpbmcgYm90aCBzeW5jaHJvbm91cyAod2l0aCBzZW1hcGhvcmVzKSBhbmQgYXN5bmNocm9ub3VzIGJlaGF2aW9yLgorLSBQcm9iYWJseSBzb21lIE1vcmUgdGhpbmdzIEkndmUgbWlzc2VkIGhlcmUuCisKKyMjIEdlbmVyYXRvciBOb3RlcworIyMjIyBHZW5lcmF0b3IgRmxhZ3MKK3wgRmxhZyAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tLS0gfDotLS0tLS0tLS0tLS0tOnwKK3wgYXN5bmNfY2xpZW50cyB8IEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguIEFzeW5jaHJvbm91cyBjbGFzc2VzIGFyZSBhcHBlbmRlZCB3aXRoIGBfQXN5bmNgIHwKK3wgbm9fc3RyaWN0KiAgICB8IEdlbmVyYXRlcyBub24tc3RyaWN0IHN0cnVjdHMgICAgICB8Cit8IGRlYnVnX2Rlc2NyaXB0aW9ucyB8IEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uICAgICAgfAorfCBsb2dfdW5leHBlY3RlZCB8IExvZyBldmVyeSB0aW1lIGFuIHVuZXhwZWN0ZWQgZmllbGQgSUQgb3IgdHlwZSBpcyBlbmNvdW50ZXJlZC4gfAorfCBzYWZlX2VudW1zICAgICB8IEdlbmVyYXRlIGVudW0gdHlwZXMgd2l0aCBhbiB1bmtub3duIGNhc2UgdG8gaGFuZGxlIHVuc3BlY2lmaWVkIHZhbHVlcyByYXRoZXIgdGhhbiB0aHJvdyBhIHNlcmlhbGl6YXRpb24gZXJyb3IgIHwKKworCisKKypNb3N0IHRocmlmdCBsaWJyYXJpZXMgYWxsb3cgZW1wdHkgaW5pdGlhbGl6YXRpb24gb2YgU3RydWN0cywgaW5pdGlhbGl6aW5nIGByZXF1aXJlZGAgZmllbGRzIHdpdGggbmlsL251bGwvTm9uZSAoUHl0aG9uIGFuZCBOb2RlIGdlbmVyYXRvcnMpLiAgU3dpZnQgb24gdGhlIG90aGVyIGhhbmQgcmVxdWlyZXMgaW5pdGlhbGl6ZXJzIHRvIGluaXRpYWxpemUgYWxsIG5vbi1PcHRpb25hbCBmaWVsZHMsIGFuZCB0aHVzIHRoZSBTd2lmdCAzIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGRlZmF1bHQgdmFsdWVzICh1bmxpa2UgdGhlIFN3aWZ0IDIvQ29jb2EgZ2VuZXJhdG9yKS4gIEluIG90aGVyIGxhbmd1YWdlcywgdGhpcyBhbGxvd3MgdGhlIHNlbmRpbmcgb2YgTlVMTCB2YWx1ZXMgaW4gZmllbGRzIHRoYXQgYXJlIG1hcmtlZCBgcmVxdWlyZWRgLCBhbmQgdGh1cyB3aWxsIHRocm93IGFuIGVycm9yIGluIFN3aWZ0IGNsaWVudHMgYXR0ZW1wdGluZyB0byB2YWxpZGF0ZSBmaWVsZHMuICBUaGUgYG5vX3N0cmljdGAgb3B0aW9uIGhlcmUgd2lsbCBpZ25vcmUgdGhlIHZhbGlkYXRpb24gY2hlY2ssIGFzIHdlbGwgYXMgYmVoYXZlIHNpbWlsYXIgdG8gdGhlIFN3aWZ0Mi9Db2NvYSBnZW5lcmF0b3IgYW5kIGluaXRpYWxpemUgcmVxdWlyZWQgZmllbGRzIHdpdGggZW1wdHkgaW5pdGlhbGl6ZXJzICh3aGVyZSBwb3NzaWJsZSkuCisKKworIyMgV2hhdHMgaW1wbGVtZW50ZWQKKyMjIyMgTGlicmFyeQorIyMjIyMgVHJhbnNwb3J0cworLSBbeF0gVFNvY2tldFRyYW5zcG9ydCAtIENGU29ja2V0IGFuZCBQb3NpeFNvY2tldCB2YXJpYW50cyBhdmFpbGFibGUuIENGU29ja2V0IHZhcmlhbnQgb25seSBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciBEYXJ3aW4gcGxhdGZvcm1zCistIFt4XSBUSFRUUFRyYW5zcG9ydCAtIEN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgRGFyd2luIHBsYXRmb3JtcywgU3dpZnQgRm91bmRhdGlvbiBVUkxTZXNzaW9uIGltcGxlbWVudGF0aW9uIG5lZWRzIGNvbXBsZXRpb24gb24gbGludXguCistIFt4XSBUU29ja2V0U2VydmVyIC0gVXNlcyBDRlNvY2tldHMgb25seSBmb3IgYmluZGluZywgc2hvdWxkIGJlIHdvcmtpbmcgb24gbGludXgKKy0gW3hdIFRGcmFtZWRUcmFuc3BvcnQKKy0gW3hdIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKy0gW3hdIFRGaWxlVHJhbnNwb3J0IC0gQSBmZXcgdmFyaWFudHMgdXNpbmcgRmlsZSBoYW5kbGVzIGFuZCBmaWxlIGRlc2NyaXB0b3JzLgorLSBbeF0gVFN0cmVhbVRyYW5zcG9ydCAtIEZ1bGx5IGZ1bmN0aW9uYWwgaW4gRGFyd2luLCBGb3VuZGF0aW9uIGJhY2tpbmcgbm90IHlldCBjb21wbGV0ZWQgaW4gTGludXggKFRoaXMgbGltaXRzIFRDRlNvY2tldFRyYW5zcG9ydCB0byBEYXJ3aW4pCistIFsgXSBIVFRQU2VydmVyIC0gQ3VycmVudGx5IHRoZXJlIGlzIG5vIGxpZ2h0d2VpZ2h0ICBIVFRQU2VydmVyIGltcGxlbWVudGF0aW9uIHRoZSBTd2lmdCBTdGFuZGFyZCBMaWJyYXJ5LCBzbyBvdGhlciAzcmQgcGFydHkgYWx0ZXJuYXRpdmVzIGFyZSByZXF1aXJlZCBhbmQgb3V0IG9mIHNjb3BlIGZvciB0aGUgVGhyaWZ0IGxpYnJhcnkuICBFeGFtcGxlcyB1c2luZyBQZXJmZWN0IHdpbGwgYmUgcHJvdmlkZWQuCistIFsgXSBPdGhlciAoZ3osIGV0YykKKworIyMjIyMgUHJvdG9jb2xzCistIFt4XSBUQmluYXJ5UHJvdG9jb2wKKy0gW3hdIFRDb21wYWN0UHJvdG9jb2wKKy0gWyBdIFRKU09OUHJvdG9jb2wgLSBUaGlzIHdpbGwgbmVlZCB0byBiZSBpbXBsZW1lbnRlZAorCisjIyMjIyBHZW5lcmF0b3IKKy0gW3hdIENvZGUgQ29tcGxldGUgR2VuZXJhdG9yCistIFt4XSBBc3luYyBjbGllbnRzCistIFt4XSBEb2N1bWVudGF0aW9uIEdlbmVyYXRpb24gLSBHZW5lcmF0b3Igd2lsbCB0cmFuc3BsYW50IElETCBkb2NzIHRvIFN3aWZ0IGNvZGUgZm9yIGVhc3kgbG9va3VwIGluIFhjb2RlCistIFsgXSBEZWZhdWx0IFZhbHVlcyAtIFRPRE8KKy0gWyBdIG5vX3N0cmljdCBtb2RlIC0gVE9ETworLSBbIF0gTmFtZXNwYWNpbmcgLSBTdGlsbCBoYXZlbid0IG5haWxlZCBkb3duIGEgZ29vZCBwYXJhZGlnbSBmb3IgbmFtZXNwYWNpbmcuICBJdCB3aWxsIGxpa2VseSBpbnZvbHZlIGNyZWF0aW5nIHN1YmRpcmVjdG9yaWVzIGZvciBkaWZmZXJlbnQgbmFtZXNwYWNlcyBhbmQgZXhwZWN0aW5nIHRoZSBkZXZlbG9wZXIgdG8gaW1wb3J0IGVhY2ggc3ViZGlyZWN0b3J5IGFzIHNlcGFyYXRlIG1vZHVsZXMuICBJdCBjb3VsZCBleHRlbmQgdG8gY3JlYXRpbmcgU1BNIFBhY2thZ2UgbWFuaWZlc3RzIHdpdGggc3ViLW1vZHVsZXMgd2l0aGluIHRoZSBnZW5lcmF0ZWQgbW9kdWxlCisKKworCisjIyBFeGFtcGxlIEhUVFAgU2VydmVyIHdpdGggUGVyZmVjdAorYGBgc3dpZnQKK2ltcG9ydCBQZXJmZWN0TGliCitpbXBvcnQgUGVyZmVjdEhUVFAKK2ltcG9ydCBQZXJmZWN0SFRUUFNlcnZlcgoraW1wb3J0IERpc3BhdGNoCisKK2xldCBsb2dRdWV1ZSA9IERpc3BhdGNoUXVldWUobGFiZWw6ICJsb2ciLCBxb3M6IC5iYWNrZ3JvdW5kLCBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKK2xldCBwUXVldWUgPSBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAibG9nIiwgcW9zOiAudXNlckluaXRpYXRlZCwgYXR0cmlidXRlczogLmNvbmN1cnJlbnQpCisKKworY2xhc3MgVFBlcmZlY3RTZXJ2ZXI8SW5Qcm90b2NvbDogVFByb3RvY29sLCBPdXRQcm90b2NvbDogVFByb3RvY29sPiB7CisKKyBwcml2YXRlIHZhciBzZXJ2ZXIgPSBIVFRQU2VydmVyKCkKKyBwcml2YXRlIHZhciBwcm9jZXNzb3I6IFRQcm9jZXNzb3IKKworIGluaXQoYWRkcmVzczogU3RyaW5nPyA9IG5pbCwKKyAgICAgIHBhdGg6IFN0cmluZz8gPSBuaWwsCisgICAgICBwb3J0OiBJbnQsCisgICAgICBwcm9jZXNzb3I6IFRQcm9jZXNzb3IsCisgICAgICBpblByb3RvY29sOiBJblByb3RvY29sLlR5cGUsCisgICAgICBvdXRQcm90b2NvbDogT3V0UHJvdG9jb2wuVHlwZSkgdGhyb3dzIHsKKworICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKKworICAgaWYgbGV0IGFkZHJlc3MgPSBhZGRyZXNzIHsKKyAgICAgc2VydmVyLnNlcnZlckFkZHJlc3MgPSBhZGRyZXNzCisgICB9CisgICBzZXJ2ZXIuc2VydmVyUG9ydCA9IFVJbnQxNihwb3J0KQorCisgICB2YXIgcm91dGVzID0gUm91dGVzKCkKKyAgIHZhciB1cmkgPSAiLyIKKyAgIGlmIGxldCBwYXRoID0gcGF0aCB7CisgICAgIHVyaSArPSBwYXRoCisgICB9CisgICByb3V0ZXMuYWRkKG1ldGhvZDogLnBvc3QsIHVyaTogdXJpKSB7IHJlcXVlc3QsIHJlc3BvbnNlIGluCisgICAgIHBRdWV1ZS5hc3luYyB7CisgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKC5jb250ZW50VHlwZSwgdmFsdWU6ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisKKyAgICAgICBsZXQgaXRyYW5zID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCgpCisgICAgICAgaWYgbGV0IGJ5dGVzID0gcmVxdWVzdC5wb3N0Qm9keUJ5dGVzIHsKKyAgICAgICAgIGxldCBkYXRhID0gRGF0YShieXRlczogYnl0ZXMpCisgICAgICAgICBpdHJhbnMucmVzZXQocmVhZEJ1ZmZlcjogZGF0YSkKKyAgICAgICB9CisKKyAgICAgICBsZXQgb3RyYW5zID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsgdHJhbnMsIGJ1ZmYgaW4KKyAgICAgICAgIGxldCBhcnJheSA9IGJ1ZmYud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgICAgQXJyYXk8VUludDg+KFVuc2FmZUJ1ZmZlclBvaW50ZXIoc3RhcnQ6ICQwLCBjb3VudDogYnVmZi5jb3VudCkpCisgICAgICAgICB9CisgICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAub2sKKyAgICAgICAgIHJlc3BvbnNlLnNldEJvZHkoYnl0ZXM6IGFycmF5KQorICAgICAgICAgcmVzcG9uc2UuY29tcGxldGVkKCkKKyAgICAgICB9KQorCisgICAgICAgbGV0IGlucHJvdG8gPSBJblByb3RvY29sKG9uOiBpdHJhbnMpCisgICAgICAgbGV0IG91dHByb3RvID0gT3V0UHJvdG9jb2wob246IG90cmFucykKKworICAgICAgIGRvIHsKKyAgICAgICAgIHRyeSBwcm9jZXNzb3IucHJvY2VzcyhvbjogaW5wcm90bywgb3V0UHJvdG9jb2w6IG91dHByb3RvKQorICAgICAgICAgdHJ5IG90cmFucy5mbHVzaCgpCisgICAgICAgfSBjYXRjaCB7CisgICAgICAgICByZXNwb25zZS5zdGF0dXMgPSAuYmFkUmVxdWVzdAorICAgICAgICAgcmVzcG9uc2UuY29tcGxldGVkKCkKKyAgICAgICB9CisgICAgIH0KKyAgIH0KKyAgIHNlcnZlci5hZGRSb3V0ZXMocm91dGVzKQorIH0KKworIGZ1bmMgc2VydmUoKSB0aHJvd3MgeworICAgdHJ5IHNlcnZlci5zdGFydCgpCisgfQorfQorYGBgCisKKyMjIyMgRXhhbXBsZSBVc2FnZQorYGBgc3dpZnQKK2NsYXNzIFNlcnZpY2VIYW5kbGVyIDogU2VydmljZSB7CisgICAgLi4uCit9CitsZXQgc2VydmVyID0gdHJ5PyBUUGVyZmVjdFNlcnZlcihwb3J0OiA5MDkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3I6IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZTogU2VydmljZUhhbmRsZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvdG9jb2w6IFRCaW5hcnlQcm90b2NvbC5zZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm90b2NvbDogVEJpbmFyeVByb3RvY29sLnNlbGYpCisKK3RyeT8gc2VydmVyPy5zZXJ2ZSgpCitgYGAKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkOTJiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKKy8vLyBFeHRlbnNpb25zIGZvciBMaW51eCBmb3IgaW5jb21wbGV0ZSBGb3VuZGF0aW9uIEFQSSdzLgorLy8vIHN3aWZ0LWNvcmVsaWJzLWZvdW5kYXRpb24gaXMgbm90IHlldCAxOjEgd2l0aCBPU1gvaU9TIEZvdW5kYXRpb24KKworZXh0ZW5zaW9uIENGU29ja2V0RXJyb3IgeworICBwdWJsaWMgc3RhdGljIGxldCBzdWNjZXNzID0ga0NGU29ja2V0U3VjY2VzcworfQorICAKK2V4dGVuc2lvbiBVSW50IHsKKyAgcHVibGljIHN0YXRpYyBmdW5jICYobGhzOiBVSW50LCByaHM6IEludCkgLT4gVUludCB7CisgICAgbGV0IGNhc3QgPSB1bnNhZmVCaXRDYXN0KHJocywgdG86IFVJbnQuc2VsZikKKyAgICByZXR1cm4gbGhzICYgY2FzdAorICB9Cit9CisKKyNlbHNlCitleHRlbnNpb24gQ0ZTdHJlYW1Qcm9wZXJ0eUtleSB7CisgIHN0YXRpYyBsZXQgc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQgID0gQ0ZTdHJlYW1Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0KQorICAvLyBFeGlzdHMgYXMgU3RyZWFtLlByb3BlcnR5S2V5LnNvY2tldFNlY3VyaXR5bGV2ZWxLZXkgYnV0IGRvZXNuJ3Qgd29yayB3aXRoIENGUmVhZFN0cmVhbVNldFByb3BlcnR5CisgIHN0YXRpYyBsZXQgc29ja2V0U2VjdXJpdHlMZXZlbCAgICAgID0gQ0ZTdHJlYW1Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNvY2tldFNlY3VyaXR5TGV2ZWwpCisgIHN0YXRpYyBsZXQgU1NMU2V0dGluZ3MgICAgICAgICAgICAgID0gQ0ZTdHJlYW1Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzKQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMzkzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwdWJsaWMgc3RydWN0IFRBcHBsaWNhdGlvbkVycm9yIDogVEVycm9yIHsKKyAgcHVibGljIGVudW0gQ29kZSA6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2UgdW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgaW52YWxpZE1lc3NhZ2VUeXBlCisgICAgY2FzZSB3cm9uZ01ldGhvZE5hbWUobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGJhZFNlcXVlbmNlSWQKKyAgICBjYXNlIG1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGludGVybmFsRXJyb3IKKyAgICBjYXNlIHByb3RvY29sRXJyb3IKKyAgICBjYXNlIGludmFsaWRUcmFuc2Zvcm0KKyAgICBjYXNlIGludmFsaWRQcm90b2NvbAorICAgIGNhc2UgdW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgCisgICAgCisgICAgLy8vIEluaXRpYWxpemUgYSBUQXBwbGljYXRpb25FcnJvciB3aXRoIGEgVGhyaWZ0IGVycm9yIGNvZGUKKyAgICAvLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhY2hpZXZlZCB3aXRoIFJhd1JlcHJlc2VudGFibGUgaG93ZXZlcgorICAgIC8vLyBieSBkb2luZyB0aGlzIHdlIGNhbiBhbGxvdyBmb3IgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIG9uIGVudW0gY2FzZXMgZm9yCisgICAgLy8vIGNhc2Ugc3BlY2lmaWMgY29udGV4dCBkYXRhIGluIGEgU3dpZnR5LCB0eXBlLXNhZmUgbWFubmVyLgorICAgIC8vLworICAgIC8vLyAtIHBhcmFtZXRlciB0aHJpZnRFcnJvckNvZGU6IEludGVnZXIgVEFwcGxpY2F0aW9uRXJyb3IoZXhjZXB0aW9uKSBlcnJvciBjb2RlLiAgCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0byAwICgudW5rbm93bikKKyAgICBwdWJsaWMgaW5pdCh0aHJpZnRFcnJvckNvZGU6IEludCkgeworICAgICAgc3dpdGNoIHRocmlmdEVycm9yQ29kZSB7CisgICAgICBjYXNlIDE6ICBzZWxmID0gLnVua25vd25NZXRob2QobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSAyOiAgc2VsZiA9IC5pbnZhbGlkTWVzc2FnZVR5cGUKKyAgICAgIGNhc2UgMzogIHNlbGYgPSAud3JvbmdNZXRob2ROYW1lKG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgNDogIHNlbGYgPSAuYmFkU2VxdWVuY2VJZAorICAgICAgY2FzZSA1OiAgc2VsZiA9IC5taXNzaW5nUmVzdWx0KG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgNjogIHNlbGYgPSAuaW50ZXJuYWxFcnJvcgorICAgICAgY2FzZSA3OiAgc2VsZiA9IC5wcm90b2NvbEVycm9yCisgICAgICBjYXNlIDg6ICBzZWxmID0gLmludmFsaWRQcm90b2NvbAorICAgICAgY2FzZSA5OiAgc2VsZiA9IC5pbnZhbGlkVHJhbnNmb3JtCisgICAgICBjYXNlIDEwOiBzZWxmID0gLnVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgICAgZGVmYXVsdDogc2VsZiA9IC51bmtub3duCisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLnVua25vd25NZXRob2Q6ICAgICAgICAgIHJldHVybiAxCisgICAgICBjYXNlIC5pbnZhbGlkTWVzc2FnZVR5cGU6ICAgICByZXR1cm4gMgorICAgICAgY2FzZSAud3JvbmdNZXRob2ROYW1lOiAgICAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmJhZFNlcXVlbmNlSWQ6ICAgICAgICAgIHJldHVybiA0CisgICAgICBjYXNlIC5taXNzaW5nUmVzdWx0OiAgICAgICAgICByZXR1cm4gNQorICAgICAgY2FzZSAuaW50ZXJuYWxFcnJvcjogICAgICAgICAgcmV0dXJuIDYKKyAgICAgIGNhc2UgLnByb3RvY29sRXJyb3I6ICAgICAgICAgIHJldHVybiA3CisgICAgICBjYXNlIC5pbnZhbGlkUHJvdG9jb2w6ICAgICAgICByZXR1cm4gOAorICAgICAgY2FzZSAuaW52YWxpZFRyYW5zZm9ybTogICAgICAgcmV0dXJuIDkKKyAgICAgIGNhc2UgLnVuc3VwcG9ydGVkQ2xpZW50VHlwZTogIHJldHVybiAxMAorICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgLy8vIE91dHB1dCAiZm9yICNtZXRob2ROYW1lIiBpZiBtZXRob2QgaXMgbm90IG5pbCBlbHNlIGVtcHR5CisgICAgICBsZXQgbWV0aG9kVW53cmFwOiAoU3RyaW5nPykgLT4gU3RyaW5nID0gIHsgbWV0aG9kIGluCisgICAgICAgIHJldHVybiAiXChtZXRob2QgPT0gbmlsID8gIiIgOiAiIGZvciBcKG1ldGhvZCA/PyAiIikiKSIKKyAgICAgIH0KKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBUQXBwbGljYXRpb25FcnJvciIKKyAgICAgIGNhc2UgLnVua25vd25NZXRob2QobGV0IG1ldGhvZCk6ICAgIHJldHVybiAiVW5rbm93biBNZXRob2RcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmludmFsaWRNZXNzYWdlVHlwZTogICAgICAgICAgIHJldHVybiAiSW52YWxpZCBNZXNzYWdlIFR5cGUiCisgICAgICBjYXNlIC53cm9uZ01ldGhvZE5hbWUobGV0IG1ldGhvZCk6ICByZXR1cm4gIldyb25nIE1ldGhvZCBOYW1lXChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5iYWRTZXF1ZW5jZUlkOiAgICAgICAgICAgICAgICByZXR1cm4gIkJhZCBTZXF1ZW5jZSBJRCIKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXN1bHQobGV0IG1ldGhvZCk6ICAgIHJldHVybiAiTWlzc2luZyBSZXN1bHRcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmludGVybmFsRXJyb3I6ICAgICAgICAgICAgICAgIHJldHVybiAiSW50ZXJuYWwgRXJyb3IiCisgICAgICBjYXNlIC5wcm90b2NvbEVycm9yOiAgICAgICAgICAgICAgICByZXR1cm4gIlByb3RvY29sIEVycm9yIgorICAgICAgY2FzZSAuaW52YWxpZFByb3RvY29sOiAgICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIFByb3RvY29sIgorICAgICAgY2FzZSAuaW52YWxpZFRyYW5zZm9ybTogICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIFRyYW5zZm9ybSIKKyAgICAgIGNhc2UgLnVuc3VwcG9ydGVkQ2xpZW50VHlwZTogICAgICAgIHJldHVybiAiVW5zdXBwb3J0ZWQgQ2xpZW50IFR5cGUiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGluaXQoKSB7IH0KKyAgCisgIHB1YmxpYyBpbml0KHRocmlmdEVycm9yQ29kZSBjb2RlOiBJbnQsIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwpIHsKKyAgICBzZWxmLmVycm9yID0gQ29kZSh0aHJpZnRFcnJvckNvZGU6IGNvZGUpCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICB9CisgIAorICBwdWJsaWMgdmFyIGVycm9yOiBDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KK30KKworZXh0ZW5zaW9uIFRBcHBsaWNhdGlvbkVycm9yIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJ1Y3QgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVEFwcGxpY2F0aW9uRXJyb3IgeworICAgIHZhciBlcnJvckNvZGU6IEludCA9IDAKKyAgICB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICAgIF8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkKKyAgICBmaWVsZHM6IHdoaWxlIHRydWUgeworICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIAorICAgICAgc3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIHsKKyAgICAgIGNhc2UgKF8sIC5zdG9wKToKKyAgICAgICAgYnJlYWsgZmllbGRzCisgICAgICBjYXNlICgxLCAuc3RyaW5nKToKKyAgICAgICAgbWVzc2FnZSA9IHRyeSBwcm90by5yZWFkKCkKKyAgICAgIGNhc2UgKDIsIC5pMzIpOgorICAgICAgICBlcnJvckNvZGUgPSBJbnQodHJ5IHByb3RvLnJlYWQoKSBhcyBJbnQzMikKKyAgICAgIAorICAgICAgY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToKKyAgICAgICAgdHJ5IHByb3RvLnNraXAodHlwZTogdW5rbm93blR5cGUpCisgICAgICB9CisgICAgICAKKyAgICAgIHRyeSBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcmV0dXJuIFRBcHBsaWNhdGlvbkVycm9yKHRocmlmdEVycm9yQ29kZTogZXJyb3JDb2RlLCBtZXNzYWdlOiBtZXNzYWdlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKyAgICAKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKG5hbWU6ICJtZXNzYWdlIiwgdHlwZTogLnN0cmluZywgZmllbGRJRDogMSkKKyAgICB0cnkgcHJvdG8ud3JpdGUobWVzc2FnZSA/PyAiIikKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRCZWdpbihuYW1lOiAidHlwZSIsIHR5cGU6IC5pMzIsIGZpZWxkSUQ6IDIpCisgICAgbGV0IHZhbCA9IEludDMyKGVycm9yLnRocmlmdEVycm9yQ29kZSkKKyAgICB0cnkgcHJvdG8ud3JpdGUodmFsKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIHJldHVybiBlcnJvci50aHJpZnRFcnJvckNvZGUgJisgKG1lc3NhZ2U/Lmhhc2hWYWx1ZSA/PyAwKQorICB9Cit9CisKK3B1YmxpYyBmdW5jID09KGxoczogVEFwcGxpY2F0aW9uRXJyb3IsIHJoczogVEFwcGxpY2F0aW9uRXJyb3IpIC0+IEJvb2wgeworICByZXR1cm4gbGhzLmVycm9yLnRocmlmdEVycm9yQ29kZSA9PSByaHMuZXJyb3IudGhyaWZ0RXJyb3JDb2RlICYmIGxocy5tZXNzYWdlID09IHJocy5tZXNzYWdlCit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU1NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdApAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK2V4dGVuc2lvbiBEYXRhIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJpbmcgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkgYXMgRGF0YQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3MjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRCaW5hcnlQcm90b2NvbFZlcnNpb24geworICBzdGF0aWMgbGV0IHZlcnNpb24xICAgID0gSW50MzIoYml0UGF0dGVybjogMHg4MDAxMDAwMCkKKyAgc3RhdGljIGxldCB2ZXJzaW9uTWFzayA9IEludDMyKGJpdFBhdHRlcm46IDB4ZmZmZjAwMDApCit9CisKK3B1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2w6IFRQcm90b2NvbCB7CisgIHB1YmxpYyB2YXIgbWVzc2FnZVNpemVMaW1pdDogVUludDMyICA9IDAKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIAorICAvLyBjbGFzcyBsZXZlbCBwcm9wZXJ0aWVzIGZvciBzZXR0aW5nIGdsb2JhbCBjb25maWcgKHVzZWZ1bCBmb3Igc2VydmVyIGluIGxpZXUgb2YgRmFjdG9yeSBkZXNpZ24pCisgIHB1YmxpYyBzdGF0aWMgdmFyIHN0cmljdFJlYWQ6IEJvb2wgPSBmYWxzZQorICBwdWJsaWMgc3RhdGljIHZhciBzdHJpY3RXcml0ZTogQm9vbCA9IHRydWUKKworICBwcml2YXRlIHZhciBzdHJpY3RSZWFkOiBCb29sCisgIHByaXZhdGUgdmFyIHN0cmljdFdyaXRlOiBCb29sCisgIAorICB2YXIgY3VycmVudE1lc3NhZ2VOYW1lOiBTdHJpbmc/CisgIHZhciBjdXJyZW50RmllbGROYW1lOiBTdHJpbmc/CisgIAorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBzdHJpY3RSZWFkOiBCb29sLCBzdHJpY3RXcml0ZTogQm9vbCkgeworICAgIHNlbGYuaW5pdChvbjogdHJhbnNwb3J0KQorICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgfQorICAKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICBzZWxmLnN0cmljdFdyaXRlID0gVEJpbmFyeVByb3RvY29sLnN0cmljdFdyaXRlCisgICAgc2VsZi5zdHJpY3RSZWFkID0gVEJpbmFyeVByb3RvY29sLnN0cmljdFJlYWQKKyAgfQorICAKKyAgZnVuYyByZWFkU3RyaW5nQm9keShfIHNpemU6IEludCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgCisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKSkgeworICAgICAgZGF0YSA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgfQorICAgIAorICAgIHJldHVybiBTdHJpbmcoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSA/PyAiIgorICB9CisgIAorICAvLy8gTWFyazogLSBUUHJvdG9jb2wKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikgeworICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICB2YXIgbWVzc2FnZU5hbWUgPSAiIgorICAgIHZhciB0eXBlID0gVE1lc3NhZ2VUeXBlLmV4Y2VwdGlvbgorICAgIAorICAgIGlmIHNpemUgPCAwIHsKKyAgICAgIGxldCB2ZXJzaW9uID0gc2l6ZSAmIFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbk1hc2sKKyAgICAgIGlmIHZlcnNpb24gIT0gVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuYmFkVmVyc2lvbihleHBlY3RlZDogIlwoVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290OiAiXCh2ZXJzaW9uKSIpKQorICAgICAgfQorICAgICAgdHlwZSA9IFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogSW50MzIoc2l6ZSkgJiAweDAwRkYpID8/IHR5cGUKKyAgICAgIG1lc3NhZ2VOYW1lID0gdHJ5IHJlYWQoKQorICAgIH0gZWxzZSB7CisgICAgICBpZiBzdHJpY3RSZWFkIHsKKyAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICJNaXNzaW5nIG1lc3NhZ2UgdmVyc2lvbiwgb2xkIGNsaWVudD8gTWVzc2FnZSBOYW1lOiBcKGN1cnJlbnRNZXNzYWdlTmFtZSA/PyAiIikiCisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSkKKyAgICAgIH0KKyAgICAgIGlmIG1lc3NhZ2VTaXplTGltaXQgPiAwICYmIHNpemUgPiBJbnQzMihtZXNzYWdlU2l6ZUxpbWl0KSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuc2l6ZUxpbWl0KGxpbWl0OiBJbnQobWVzc2FnZVNpemVMaW1pdCksIGdvdDogSW50KHNpemUpKSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgbWVzc2FnZU5hbWUgPSB0cnkgcmVhZFN0cmluZ0JvZHkoSW50KHNpemUpKQorICAgICAgdHlwZSA9IFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkpID8/IHR5cGUKKyAgICB9CisgICAgCisgICAgbGV0IHNlcUlEOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICByZXR1cm4gKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gIiIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIGxldCBmaWVsZFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkpID8/IFRUeXBlLnN0b3AKKyAgICB2YXIgZmllbGRJRDogSW50MzIgPSAwCisgICAgCisgICAgaWYgZmllbGRUeXBlICE9IC5zdG9wIHsKKyAgICAgIGZpZWxkSUQgPSBJbnQzMih0cnkgcmVhZCgpIGFzIEludDE2KQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gKCIiLCBmaWVsZFR5cGUsIGZpZWxkSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIHZhciByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCBrZXlUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3Iga2V5VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgCisgICAgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgdmFsdWVUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgdmFsdWVUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCBlbGVtZW50VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGVsZW1lbnRUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICAKKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCBlbGVtZW50VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGVsZW1lbnRUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGV0IGRhdGE6IERhdGEgPSB0cnkgcmVhZCgpCisgICAgZ3VhcmQgbGV0IHN0ciA9IFN0cmluZy5pbml0KGRhdGE6IGRhdGEsIGVuY29kaW5nOiAudXRmOCkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLCBtZXNzYWdlOiAiQ291bGRuJ3QgZW5jb2RlIFVURi04IGZyb20gZGF0YSByZWFkIikKKyAgICB9CisgICAgcmV0dXJuIHN0cgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiAodHJ5IHJlYWQoKSBhcyBVSW50OCkgPT0gMQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMSkKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZbMF0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNiB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDIpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQxNihidWZmWzBdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQxNihidWZmWzFdICYgMHhmZikKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA0KQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50MzIoYnVmZlswXSAmIDB4ZmYpIDw8IDI0CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbMV0gJiAweGZmKSA8PCAxNgorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzJdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzNdICYgMHhmZikKKyAgICAKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA4KQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50NjQoYnVmZlswXSAmIDB4ZmYpIDw8IDU2CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbMV0gJiAweGZmKSA8PCA0OAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzJdICYgMHhmZikgPDwgNDAKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlszXSAmIDB4ZmYpIDw8IDMyCisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNF0gJiAweGZmKSA8PCAyNAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzVdICYgMHhmZikgPDwgMTYKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls2XSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls3XSAmIDB4ZmYpCisgICAgCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgbGV0IHZhbCA9IHRyeSByZWFkKCkgYXMgSW50NjQKKyAgICByZXR1cm4gRG91YmxlKGJpdFBhdHRlcm46IFVJbnQ2NChiaXRQYXR0ZXJuOiB2YWwpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBzaXplID0gSW50KHRyeSByZWFkKCkgYXMgSW50MzIpCisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgZGF0YSA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhCisgIH0KKyAgCisgIC8vIFdyaXRlIG1ldGhvZHMKKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBzdHJpY3RXcml0ZSB7CisgICAgICBsZXQgdmVyc2lvbiA9IFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEgfCBJbnQzMihtZXNzYWdlVHlwZS5yYXdWYWx1ZSkKKyAgICAgIHRyeSB3cml0ZSh2ZXJzaW9uKQorICAgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgICB0cnkgd3JpdGUoc2VxdWVuY2VJRCkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgICB0cnkgd3JpdGUoVUludDgobWVzc2FnZVR5cGUucmF3VmFsdWUpKQorICAgICAgdHJ5IHdyaXRlKHNlcXVlbmNlSUQpCisgICAgfQorICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuaWwKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZmllbGRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoSW50MTYoZmllbGRJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoVFR5cGUuc3RvcC5yYXdWYWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoa2V5VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKFVJbnQ4KHZhbHVlVHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChlbGVtZW50VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZWxlbWVudFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKHZhbHVlLmRhdGEodXNpbmc6IC51dGY4KSEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgbGV0IGJ5dGVWYWw6IFVJbnQ4ID0gdmFsdWUgPyAxIDogMAorICAgIHRyeSB3cml0ZShieXRlVmFsKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzIHsKKyAgICBsZXQgYnVmZiA9IERhdGEoYnl0ZXM6IFt2YWx1ZV0pCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDI0KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAxNikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDU2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA0OCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNDApKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDMyKSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAyNCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIC8vIE5vdGFibHkgdW5zYWZlLCBzaW5jZSBEb3VibGUgYW5kIEludDY0IGFyZSB0aGUgc2FtZSBzaXplLCB0aGlzIHNob3VsZCB3b3JrIGZpbmUKKyAgICB0cnkgc2VsZi53cml0ZShJbnQ2NChiaXRQYXR0ZXJuOiB2YWx1ZS5iaXRQYXR0ZXJuKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShJbnQzMihkYXRhLmNvdW50KSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBkYXRhKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzMjg4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK29wZW4gY2xhc3MgVENsaWVudCB7CisgIHB1YmxpYyBsZXQgaW5Qcm90b2NvbDogVFByb3RvY29sCisgIHB1YmxpYyBsZXQgb3V0UHJvdG9jb2w6IFRQcm90b2NvbAorCisgIHJlcXVpcmVkIHB1YmxpYyBpbml0KGlub3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgeworICAgIHNlbGYuaW5Qcm90b2NvbCA9IGlub3V0UHJvdG9jb2wKKyAgICBzZWxmLm91dFByb3RvY29sID0gaW5vdXRQcm90b2NvbAorICB9CisKKyAgcmVxdWlyZWQgcHVibGljIGluaXQoaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB7CisgICAgc2VsZi5pblByb3RvY29sID0gaW5Qcm90b2NvbAorICAgIHNlbGYub3V0UHJvdG9jb2wgPSBvdXRQcm90b2NvbAorICB9Cit9CisKKworb3BlbiBjbGFzcyBUQXN5bmNDbGllbnQ8UHJvdG9jb2w6IFRQcm90b2NvbCwgRmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4geworICBwdWJsaWMgdmFyIGZhY3Rvcnk6IEZhY3RvcnkKKyAgcHVibGljIGluaXQod2l0aCBwcm90b2NvbDogUHJvdG9jb2wuVHlwZSwgZmFjdG9yeTogRmFjdG9yeSkgeworICAgIHNlbGYuZmFjdG9yeSA9IGZhY3RvcnkKKyAgfQorfQorCisKK3B1YmxpYyBlbnVtIFRBc3luY1Jlc3VsdDxUPiB7CisgIGNhc2Ugc3VjY2VzcyhUKQorICBjYXNlIGVycm9yKFN3aWZ0LkVycm9yKQorICAKKyAgcHVibGljIGZ1bmMgdmFsdWUoKSB0aHJvd3MgLT4gVCB7CisgICAgc3dpdGNoIHNlbGYgeworICAgIGNhc2UgLnN1Y2Nlc3MobGV0IHQpOiByZXR1cm4gdAorICAgIGNhc2UgLmVycm9yKGxldCBlKTogdGhyb3cgZQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3NzNjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHVibGljIGVudW0gVENUeXBlOiBVSW50OCB7CisgIGNhc2Ugc3RvcCAgICAgICAgICA9IDB4MDAKKyAgY2FzZSBib29sZWFuX1RSVUUgID0gMHgwMQorICBjYXNlIGJvb2xlYW5fRkFMU0UgPSAweDAyCisgIGNhc2UgaTggICAgICAgICAgICA9IDB4MDMKKyAgY2FzZSBpMTYgICAgICAgICAgID0gMHgwNAorICBjYXNlIGkzMiAgICAgICAgICAgPSAweDA1CisgIGNhc2UgaTY0ICAgICAgICAgICA9IDB4MDYKKyAgY2FzZSBkb3VibGUgICAgICAgID0gMHgwNworICBjYXNlIGJpbmFyeSAgICAgICAgPSAweDA4CisgIGNhc2UgbGlzdCAgICAgICAgICA9IDB4MDkKKyAgY2FzZSBzZXQgICAgICAgICAgID0gMHgwQQorICBjYXNlIG1hcCAgICAgICAgICAgPSAweDBCCisgIGNhc2UgYHN0cnVjdGAgICAgICA9IDB4MEMKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHR5cGVNYXNrOiBVSW50OCA9IDB4RTAgLy8gMTExMCAwMDAwCisgIHB1YmxpYyBzdGF0aWMgbGV0IHR5cGVCaXRzOiBVSW50OCA9IDB4MDcgLy8gMDAwMCAwMTExCisgIHB1YmxpYyBzdGF0aWMgbGV0IHR5cGVTaGlmdEFtb3VudCA9IDUKKyAKK30KKworCitwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbDogVFByb3RvY29sIHsKKyAgcHVibGljIHN0YXRpYyBsZXQgcHJvdG9jb2xJRDogVUludDggID0gMHg4MgorICBwdWJsaWMgc3RhdGljIGxldCB2ZXJzaW9uOiBVSW50OCAgICAgPSAxCisgIHB1YmxpYyBzdGF0aWMgbGV0IHZlcnNpb25NYXNrOiBVSW50OCA9IDB4MUYgLy8gMDAwMSAxMTExCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICAKKyAgdmFyIGxhc3RGaWVsZDogW1VJbnQ4XSA9IFtdCisgIHZhciBsYXN0RmllbGRJZDogVUludDggPSAwCisgIAorICB2YXIgYm9vbEZpZWxkTmFtZTogU3RyaW5nPworICB2YXIgYm9vbEZpZWxkVHlwZTogVFR5cGU/CisgIHZhciBib29sRmllbGRJZDogSW50MzI/CisgIHZhciBib29sZWFuVmFsdWU6IEJvb2w/CisgIAorICB2YXIgY3VycmVudE1lc3NhZ2VOYW1lOiBTdHJpbmc/CisKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgfQorCisgIAorICAvLy8gTWFyazogLSBUQ29tcGFjdFByb3RvY29sIGhlbHBlcnMKKyAgCisgIGZ1bmMgd3JpdGVieXRlRGlyZWN0KF8gYnl0ZTogVUludDgpIHRocm93cyB7CisgICAgbGV0IGJ5dGUgPSBEYXRhKGJ5dGVzOiBbYnl0ZV0pCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnl0ZSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVWYXJpbnQzMihfIHZhbDogVUludDMyKSB0aHJvd3MgeworICAgIHZhciB2YWwgPSB2YWwKKyAgICB2YXIgaTMyYnVmID0gW1VJbnQ4XShyZXBlYXRpbmc6IDAsIGNvdW50OiA1KQorICAgIHZhciBpZHggPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBpZiAodmFsICYgfjB4N0YpID09IDAgeworICAgICAgICBpMzJidWZbaWR4XSA9IFVJbnQ4KHZhbCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgYnJlYWsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkzMmJ1ZltpZHhdID0gVUludDgoKHZhbCAmIDB4N0YpIHwgMHg4MCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgdmFsID4+PSA3CisgICAgICB9CisgICAgfQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IERhdGEoYnl0ZXM6IGkzMmJ1ZlswLi48aWR4XSkpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlVmFyaW50NjQoXyB2YWw6IFVJbnQ2NCkgdGhyb3dzIHsKKyAgICB2YXIgdmFsID0gdmFsCisgICAgdmFyIHZhcmludDY0b3V0ID0gW1VJbnQ4XShyZXBlYXRpbmc6IDAsIGNvdW50OiAxMCkKKyAgICB2YXIgaWR4ID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgaWYgKHZhbCAmIH4weDdGKSA9PSAweworICAgICAgICB2YXJpbnQ2NG91dFtpZHhdID0gVUludDgodmFsKQorICAgICAgICBpZHggKz0gMQorICAgICAgICBicmVhaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IFVJbnQ4KHZhbCAmIDB4N0YpIHwgMHg4MAorICAgICAgICBpZHggKz0gMQorICAgICAgICB2YWwgPj49IDcKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogRGF0YShieXRlczogdmFyaW50NjRvdXRbMC4uPGlkeF0pKQorICAgIH0KKyAgCisgIH0KKyAgCisgIGZ1bmMgd3JpdGVDb2xsZWN0aW9uQmVnaW4oXyBlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIGxldCBjdHlwZSA9IGNvbXBhY3RUeXBlKGVsZW1lbnRUeXBlKS5yYXdWYWx1ZQorICAgIGlmIHNpemUgPD0gMTQgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChVSW50OChzaXplIDw8IDQpIHwgY3R5cGUpCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoMHhGMCB8IGN0eXBlKQorICAgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKHNpemUpKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyByZWFkQmluYXJ5KF8gc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIHJlc3VsdCA9IERhdGEoKQorICAgIGlmIHNpemUgIT0gMCB7CisgICAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgICByZXN1bHQgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIGZ1bmMgcmVhZFZhcmludDMyKCkgdGhyb3dzIC0+IFVJbnQzMiB7CisgICAgdmFyIHJlc3VsdDogVUludDMyID0gMAorICAgIHZhciBzaGlmdDogVUludDMyID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgbGV0IGJ5dGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgICAgCisgICAgICByZXN1bHQgfD0gVUludDMyKGJ5dGUgJiAweDdGKSA8PCBzaGlmdAorICAgICAgaWYgKGJ5dGUgJiAweDgwKSA9PSAwIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2hpZnQgKz0gNworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIGZ1bmMgcmVhZFZhcmludDY0KCkgdGhyb3dzIC0+IFVJbnQ2NCB7CisgICAgdmFyIHJlc3VsdDogVUludDY0ID0gMAorICAgIHZhciBzaGlmdDogVUludDY0ID0gMAorICAgIAorICAgIHdoaWxlIHRydWUgeworICAgICAgbGV0IGJ5dGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgICAgCisgICAgICByZXN1bHQgfD0gVUludDY0KGJ5dGUgJiAweDdGKSA8PCBzaGlmdAorICAgICAgaWYgKGJ5dGUgJiAweDgwKSA9PSAwIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2hpZnQgKz0gNworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisKKyAgZnVuYyB0dHlwZShfIGNvbXBhY3RUeXBlVmFsOiBVSW50OCkgdGhyb3dzIC0+IFRUeXBlIHsKKyAgICBndWFyZCBsZXQgY29tcGFjdFR5cGUgPSBUQ1R5cGUocmF3VmFsdWU6IGNvbXBhY3RUeXBlVmFsKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRDVHlwZSB2YWx1ZTogXChjb21wYWN0VHlwZVZhbCkiKQorICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggY29tcGFjdFR5cGUgeworICAgIGNhc2UgLnN0b3A6IHJldHVybiAuc3RvcDsKKyAgICBjYXNlIC5ib29sZWFuX0ZBTFNFLCAuYm9vbGVhbl9UUlVFOiByZXR1cm4gLmJvb2w7CisgICAgY2FzZSAuaTg6IHJldHVybiAuaTg7CisgICAgY2FzZSAuaTE2OiByZXR1cm4gLmkxNjsKKyAgICBjYXNlIC5pMzI6IHJldHVybiAuaTMyOworICAgIGNhc2UgLmk2NDogcmV0dXJuIC5pNjQ7CisgICAgY2FzZSAuZG91YmxlOiByZXR1cm4gLmRvdWJsZTsKKyAgICBjYXNlIC5iaW5hcnk6IHJldHVybiAuc3RyaW5nOworICAgIGNhc2UgLmxpc3Q6IHJldHVybiAubGlzdDsKKyAgICBjYXNlIC5zZXQ6IHJldHVybiAuc2V0OworICAgIGNhc2UgLm1hcDogcmV0dXJuIC5tYXA7CisgICAgY2FzZSAuc3RydWN0OiByZXR1cm4gLnN0cnVjdDsKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgY29tcGFjdFR5cGUoXyB0dHlwZTogVFR5cGUpIC0+IFRDVHlwZSB7CisgICAgc3dpdGNoIHR0eXBlIHsKKyAgICBjYXNlIC5zdG9wOiAgIHJldHVybiAuc3RvcAorICAgIGNhc2UgLnZvaWQ6ICAgcmV0dXJuIC5pOAorICAgIGNhc2UgLmJvb2w6ICAgcmV0dXJuIC5ib29sZWFuX0ZBTFNFCisgICAgY2FzZSAuaTg6ICAgcmV0dXJuIC5pOAorICAgIGNhc2UgLmRvdWJsZTogcmV0dXJuIC5kb3VibGUKKyAgICBjYXNlIC5pMTY6ICAgIHJldHVybiAuaTE2CisgICAgY2FzZSAuaTMyOiAgICByZXR1cm4gLmkzMgorICAgIGNhc2UgLmk2NDogICAgcmV0dXJuIC5pNjQKKyAgICBjYXNlIC5zdHJpbmc6IHJldHVybiAuYmluYXJ5CisgICAgY2FzZSAuc3RydWN0OiByZXR1cm4gLnN0cnVjdAorICAgIGNhc2UgLm1hcDogICAgcmV0dXJuIC5tYXAKKyAgICBjYXNlIC5zZXQ6ICAgIHJldHVybiAuc2V0CisgICAgY2FzZSAubGlzdDogICByZXR1cm4gLmxpc3QKKyAgICBjYXNlIC51dGY4OiAgIHJldHVybiAuYmluYXJ5CisgICAgY2FzZSAudXRmMTY6ICByZXR1cm4gLmJpbmFyeQorICAgIH0KKyAgfQorICAKKyAgLy8vIFppZ1phZyBlbmNvZGluZyBtYXBzIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZCBpbnRlZ2VycyBzbyB0aGF0CisgIC8vLyBudW1iZXJzIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSAoZm9yIGluc3RhbmNlLCAtMSkgaGF2ZQorICAvLy8gYSBzbWFsbCB2YXJpbnQgZW5jb2RlZCB2YWx1ZSB0b28uIEl0IGRvZXMgdGhpcyBpbiBhIHdheSB0aGF0CisgIC8vLyAiemlnLXphZ3MiIGJhY2sgYW5kIGZvcnRoIHRocm91Z2ggdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBpbnRlZ2VycywKKyAgLy8vIHNvIHRoYXQgLTEgaXMgZW5jb2RlZCBhcyAxLCAxIGlzIGVuY29kZWQgYXMgMiwgLTIgaXMgZW5jb2RlZCBhcyAzLCBhbmQgc28KKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBuOiBudW1iZXIgdG8gemlnemFnCisgIC8vLworICAvLy8gLSByZXR1cm5zOiB6aWd6YWdlZCBVSW50MzIKKyAgZnVuYyBpMzJUb1ppZ1phZyhfIG4gOiBJbnQzMikgLT4gVUludDMyIHsKKyAgICByZXR1cm4gVUludDMyKGJpdFBhdHRlcm46IEludDMyKG4gPDwgMSkgXiBJbnQzMihuID4+IDMxKSkKKyAgfQorCisgIGZ1bmMgaTY0VG9aaWdaYWcoXyBuIDogSW50NjQpIC0+IFVJbnQ2NCB7CisgICAgcmV0dXJuIFVJbnQ2NChiaXRQYXR0ZXJuOiBJbnQ2NChuIDw8IDEpIF4gSW50NjQobiA+PiA2MykpCisgIH0KKworICBmdW5jIHppZ1phZ1RvaTMyKF8gbjogVUludDMyKSAtPiBJbnQzMiB7CisgICAgcmV0dXJuIEludDMyKG4gPj4gMSkgXiAoLUludDMyKG4gJiAxKSkKKyAgfQorICAKKyAgZnVuYyB6aWdaYWdUb2k2NChfIG46IFVJbnQ2NCkgLT4gSW50NjQgeworICAgIHJldHVybiBJbnQ2NChuID4+IDEpIF4gKC1JbnQ2NChuICYgMSkpCisgIH0KKyAgCisgIAorICAKKyAgLy8vIE1hcms6IC0gVFByb3RvY29sICAKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikgeworICAgIGxldCBwcm90b2NvbElkOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAKKyAgICBpZiBwcm90b2NvbElkICE9IFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCB7CisgICAgICBsZXQgZXhwZWN0ZWQgPSBTdHJpbmcoZm9ybWF0OiIlMlgiLCBUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQpCisgICAgICBsZXQgZ290ICAgICAgPSBTdHJpbmcoZm9ybWF0OiIlMlgiLCBwcm90b2NvbElkKQorICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIldyb25nIFByb3RvY29sIElEIFwoZ290KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAubWlzbWF0Y2hlZFByb3RvY29sKGV4cGVjdGVkOiBleHBlY3RlZCwgZ290OiBnb3QpKQorCisgICAgfQorCisgICAgbGV0IHZlcnNpb25BbmRUeXBlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICBsZXQgdmVyc2lvbjogVUludDggPSB2ZXJzaW9uQW5kVHlwZSAmIFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbk1hc2sKKyAgICBpZiB2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbiB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmJhZFZlcnNpb24oZXhwZWN0ZWQ6ICJcKFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdDoiXCh2ZXJzaW9uKSIpKQorCisgICAgfQorICAgIAorICAgIGxldCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IFVJbnQ4KFRDVHlwZS50eXBlU2hpZnRBbW91bnQpKSAmIFRDVHlwZS50eXBlQml0cworICAgIGd1YXJkIGxldCBtdHlwZSA9IFRNZXNzYWdlVHlwZShyYXdWYWx1ZTogSW50MzIodHlwZSkpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVE1lc3NhZ2VUeXBlIHZhbHVlOiBcKHR5cGUpIikKKyAgICB9CisgICAgbGV0IHNlcXVlbmNlSWQgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICBsZXQgbmFtZTogU3RyaW5nID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAobmFtZSwgbXR5cGUsIEludDMyKHNlcXVlbmNlSWQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxhc3RGaWVsZC5hcHBlbmQobGFzdEZpZWxkSWQpCisgICAgbGFzdEZpZWxkSWQgPSAwCisgICAgcmV0dXJuICIiCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZElkID0gbGFzdEZpZWxkLmxhc3QgPz8gMAorICAgIGxhc3RGaWVsZC5yZW1vdmVMYXN0KCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgbGV0IGJ5dGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIGd1YXJkIGxldCB0eXBlID0gVENUeXBlKHJhd1ZhbHVlOiBieXRlICYgMHgwRikgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUQ1R5cGUgXChieXRlICYgMHgwRikiKQorICAgIH0KKyAgICAKKyAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIKKyAgICBpZiB0eXBlID09IC5zdG9wIHsKKyAgICAgIHJldHVybiAoIiIsIC5zdG9wLCAwKQorICAgIH0KKyAgICAKKyAgICB2YXIgZmllbGRJZDogSW50MTYgPSAwCisgICAgCisgICAgLy8gbWFzayBvZmYgdGhlIDRNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiAgaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhCisgICAgbGV0IG1vZGlmaWVyID0gKGJ5dGUgJiAweEYwKSA+PiA0CisgICAgaWYgbW9kaWZpZXIgPT0gMCB7CisgICAgICAvLyBub3QgYSBkZWx0YS4gIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkCisgICAgICBmaWVsZElkID0gdHJ5IHJlYWQoKQorICAgIH0gZWxzZSB7CisgICAgICAvLyBoYXMgYSBkZWx0YS4gIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKyAgICAgIGZpZWxkSWQgPSBJbnQxNihsYXN0RmllbGRJZCArIG1vZGlmaWVyKQorICAgIH0KKyAgICAKKyAgICBsZXQgZmllbGRUeXBlID0gdHJ5IHR0eXBlKHR5cGUucmF3VmFsdWUpCisgICAgCisgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICBpZiB0eXBlID09IC5ib29sZWFuX1RSVUUgfHwgdHlwZSA9PSAuYm9vbGVhbl9GQUxTRSB7CisgICAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZQorICAgICAgYm9vbGVhblZhbHVlID0gdHlwZSA9PSAuYm9vbGVhbl9UUlVFCisgICAgfQorICAgIAorICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nCisgICAgbGFzdEZpZWxkSWQgPSBVSW50OChmaWVsZElkKQorICAgIHJldHVybiAoIiIsIGZpZWxkVHlwZSwgSW50MzIoZmllbGRJZCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsZXQgbGVuZ3RoID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgCisgICAgdmFyIHJlc3VsdDogU3RyaW5nCisgICAgCisgICAgaWYgbGVuZ3RoICE9IDAgeworICAgICAgbGV0IGRhdGEgPSB0cnkgcmVhZEJpbmFyeShJbnQobGVuZ3RoKSkKKyAgICAgIHJlc3VsdCA9IFN0cmluZyhkYXRhOiBkYXRhLCBlbmNvZGluZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpID8/ICIiCisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9ICIiCisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sIHsKKyAgICBpZiBsZXQgdmFsID0gYm9vbGVhblZhbHVlIHsKKyAgICAgIHNlbGYuYm9vbGVhblZhbHVlID0gbmlsCisgICAgICByZXR1cm4gdmFsCisgICAgfSBlbHNlIHsKKyAgICAgIGxldCByZXN1bHQgPSB0cnkgcmVhZCgpIGFzIFVJbnQ4CisgICAgICByZXR1cm4gVENUeXBlKHJhd1ZhbHVlOiByZXN1bHQpID09IC5ib29sZWFuX1RSVUUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDggeworICAgIHZhciBidWZmOiBVSW50OCA9IDAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDEpWzBdCisgICAgfQorICAgIHJldHVybiBidWZmCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIEludDE2KHppZ1phZ1RvaTMyKHYpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiB6aWdaYWdUb2kzMih2KQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50NjQoKQorICAgIHJldHVybiB6aWdaYWdUb2k2NCh2KQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDgpCisgICAgfQorICAgIAorICAgIGxldCBpNjQ6IFVJbnQ2NCA9IGJ1ZmYud2l0aFVuc2FmZUJ5dGVzIHsgKHB0cjogVW5zYWZlUG9pbnRlcjxVSW50OD4pIC0+IFVJbnQ2NCBpbgorICAgICAgcmV0dXJuIFVuc2FmZVBvaW50ZXI8VUludDY0PihPcGFxdWVQb2ludGVyKHB0cikpLnBvaW50ZWUKKyAgICB9CisgICAgbGV0IGJpdHMgPSBDRlN3YXBJbnQ2NExpdHRsZVRvSG9zdChpNjQpCisgICAgcmV0dXJuIERvdWJsZShiaXRQYXR0ZXJuOiBiaXRzKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBsZW5ndGggPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gdHJ5IHJlYWRCaW5hcnkoSW50KGxlbmd0aCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIHZhciBrZXlBbmRWYWx1ZVR5cGU6IFVJbnQ4ID0gOAorICAgIGxldCBzaXplID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgaWYgc2l6ZSAhPSAwIHsKKyAgICAgIGtleUFuZFZhbHVlVHlwZSA9IHRyeSByZWFkKCkKKyAgICB9CisgICAgCisgICAgbGV0IGtleVR5cGUgPSB0cnkgdHR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpCisgICAgbGV0IHZhbHVlVHlwZSA9IHRyeSB0dHlwZShrZXlBbmRWYWx1ZVR5cGUgJiAweEYpCisgICAgCisgICAgcmV0dXJuIChrZXlUeXBlLCB2YWx1ZVR5cGUsIEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IHJlYWRMaXN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHNpemVBbmRUeXBlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICB2YXIgc2l6ZTogVUludDMyID0gVUludDMyKHNpemVBbmRUeXBlID4+IDQpICYgMHgwZgorICAgIGlmIHNpemUgPT0gMTUgeworICAgICAgc2l6ZSA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIH0KKyAgICBsZXQgZWxlbWVudFR5cGUgPSB0cnkgdHR5cGUoc2l6ZUFuZFR5cGUgJiAweDBGKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCkKKyAgICBsZXQgbmV4dEJ5dGU6IFVJbnQ4ID0gKFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbiAmIFRDb21wYWN0UHJvdG9jb2wudmVyc2lvbk1hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFVJbnQ4KChVSW50MzIobWVzc2FnZVR5cGUucmF3VmFsdWUpIDw8IFVJbnQzMihUQ1R5cGUudHlwZVNoaWZ0QW1vdW50KSkpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVENUeXBlLnR5cGVNYXNrKQorICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QobmV4dEJ5dGUpCisgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKHNlcXVlbmNlSUQpKQorICAgIHRyeSB3cml0ZShuYW1lKQorICAgIAorICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuaWwKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgbGFzdEZpZWxkLmFwcGVuZChsYXN0RmllbGRJZCkKKyAgICBsYXN0RmllbGRJZCA9IDAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZElkID0gbGFzdEZpZWxkLmxhc3QgPz8gMAorICAgIGxhc3RGaWVsZC5yZW1vdmVMYXN0KCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MgeworICAgIGlmIGZpZWxkVHlwZSA9PSAuYm9vbCB7CisgICAgICBib29sRmllbGROYW1lID0gbmFtZQorICAgICAgYm9vbEZpZWxkVHlwZSA9IGZpZWxkVHlwZQorICAgICAgYm9vbEZpZWxkSWQgPSBmaWVsZElECisgICAgICByZXR1cm4KKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IGZpZWxkSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiAweEZGKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IEludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogVUludDgpIHRocm93cyB7CisgICAgCisgICAgbGV0IHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBjb21wYWN0VHlwZShmaWVsZFR5cGUpLnJhd1ZhbHVlIDogdHlwZU92ZXJyaWRlCisgICAgCisgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgbGV0IGRpZmYgPSBVSW50OChmaWVsZElEKSAtIGxhc3RGaWVsZElkCisgICAgaWYgKFVJbnQ4KGZpZWxkSUQpID4gbGFzdEZpZWxkSWQpICYmIChkaWZmIDw9IDE1KSB7CisgICAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KChVSW50OChmaWVsZElEKSAtIGxhc3RGaWVsZElkKSA8PCA0IHwgdHlwZVRvV3JpdGUpCisgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSkKKyAgICAgIHRyeSB3cml0ZShJbnQxNihmaWVsZElEKSkKKyAgICB9CisgICAgCisgICAgbGFzdEZpZWxkSWQgPSBVSW50OChmaWVsZElEKQorICAgICAgCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFRDVHlwZS5zdG9wLnJhd1ZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgaWYgc2l6ZSA9PSAwIHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoMCkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKHNpemUpKQorICAgICAgCisgICAgICBsZXQgY29tcGFjdGVkVHlwZXMgPSBjb21wYWN0VHlwZShrZXlUeXBlKS5yYXdWYWx1ZSA8PCA0IHwgY29tcGFjdFR5cGUodmFsdWVUeXBlKS5yYXdWYWx1ZQorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChjb21wYWN0ZWRUeXBlcykKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZSh2YWx1ZS5kYXRhKHVzaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MgeworICAgIGlmIGxldCBib29sRmllbGRJZCA9IGJvb2xGaWVsZElkLCBsZXQgYm9vbEZpZWxkVHlwZSA9IGJvb2xGaWVsZFR5cGUsCisgICAgICAgbGV0IGJvb2xGaWVsZE5hbWUgPSBib29sRmllbGROYW1lIHsKKyAgICAgIAorICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICBsZXQgY29tcGFjdFR5cGU6IFRDVHlwZSA9IHZhbHVlID8gLmJvb2xlYW5fVFJVRSA6IC5ib29sZWFuX0ZBTFNFCisgICAgICB0cnkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogYm9vbEZpZWxkTmFtZSwgdHlwZTogYm9vbEZpZWxkVHlwZSwgZmllbGRJRDogYm9vbEZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiBjb21wYWN0VHlwZS5yYXdWYWx1ZSkKKyAgICAgIHNlbGYuYm9vbEZpZWxkSWQgPSBuaWwKKyAgICAgIHNlbGYuYm9vbEZpZWxkVHlwZSA9IG5pbAorICAgICAgc2VsZi5ib29sRmllbGROYW1lID0gbmlsCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlLgorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh2YWx1ZSA/IFRDVHlwZS5ib29sZWFuX1RSVUUucmF3VmFsdWUgOiBUQ1R5cGUuYm9vbGVhbl9GQUxTRS5yYXdWYWx1ZSkKKyAgICB9CisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoaTMyVG9aaWdaYWcoSW50MzIodmFsdWUpKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoaTMyVG9aaWdaYWcodmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQ2NChpNjRUb1ppZ1phZyh2YWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzIHsKKyAgICB2YXIgYml0cyA9IENGU3dhcEludDY0SG9zdFRvTGl0dGxlKHZhbHVlLmJpdFBhdHRlcm4pCisgICAgbGV0IGRhdGEgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmJpdHMpIHsKKyAgICAgIHJldHVybiBEYXRhKGJ5dGVzOiBVbnNhZmVQb2ludGVyPFVJbnQ4PihPcGFxdWVQb2ludGVyKCQwKSksIGNvdW50OiBNZW1vcnlMYXlvdXQ8VUludDY0Pi5zaXplKQorICAgIH0KKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBkYXRhKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihkYXRhLmNvdW50KSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBkYXRhKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRmZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3B1YmxpYyBwcm90b2NvbCBURW51bSA6IFRTZXJpYWxpemFibGUsIEhhc2hhYmxlIHsKKyAgdmFyIHJhd1ZhbHVlOiBJbnQzMiB7IGdldCB9Cit9CisKK2V4dGVuc2lvbiBURW51bSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMzIgfQorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsgcmV0dXJuIHJhd1ZhbHVlLmhhc2hWYWx1ZSB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUocmF3VmFsdWUpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVkYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsNzcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworLy8vIFRFcnJvckNvZGUKKy8vLworLy8vIFByb3RvY29sIGZvciBURXJyb3IgY29uZm9ybWVycycgZW51bSdzIHRvIGNvbmZvcm0gdG8uCisvLy8gR2VuZXJpYyBJbnQgVGhyaWZ0IGVycm9yIGNvZGUgdG8gYWxsb3cgZXJyb3IgY2FzZXMgdG8gaGF2ZQorLy8vIGFzc29jaWF0ZWQgdmFsdWVzLgorcHVibGljIHByb3RvY29sIFRFcnJvckNvZGUgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSB7CisgIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7IGdldCB9Cit9CisKKy8vLyBURXJyb3IKKy8vLworLy8vIEJhc2UgcHJvdG9jb2wgZm9yIGFsbCBUaHJpZnQgRXJyb3IoRXhjZXB0aW9uKSB0eXBlcyB0byBjb25mb3JtIHRvCitwdWJsaWMgcHJvdG9jb2wgVEVycm9yIDogRXJyb3IsIEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlIHsKKworICAvLy8gRW51bSBmb3IgZXJyb3IgY2FzZXMuICBDYW4gYmUgdHlwZWFsaWFzZWQgdG8gYW55IGNvbmZvcm1pbmcgZW51bQorICAvLy8gb3IgZGVmaW5lZCBuZXN0ZWQuCisgIGFzc29jaWF0ZWR0eXBlIENvZGU6IFRFcnJvckNvZGUKKyAgCisgIC8vLyBFcnJvciBDYXNlLCB2YWx1ZSBmcm9tIGludGVybmFsIGVudW0KKyAgdmFyIGVycm9yOiBDb2RlIHsgZ2V0IHNldCB9CisgIAorICAvLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBtZXNzYWdlCisgIHZhciBtZXNzYWdlOiBTdHJpbmc/IHsgZ2V0IHNldCB9CisgIAorICAvLy8gRGVmYXVsdCBlcnJvciBjYXNlIGZvciB0aGUgZXJyb3IgdHlwZSwgdXNlZCBmb3IgZ2VuZXJpYyBpbml0KCkKKyAgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IGdldCB9CisgIAorICBpbml0KCkKK30KKworZXh0ZW5zaW9uIFRFcnJvciB7CisgIC8vLyBIdW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBlcnJvci4gRGVmYXVsdCBwcm92aWRlZCBmb3IgeW91IGluIHRoZQorICAvLy8gZm9ybWF0IFwoU2VsZi5zZWxmKTogXChlcnJvci5lcnJvckRlc2NyaXB0aW9uKSBcbiBtZXNzYWdlCisgIC8vLyBlZzoKKyAgLy8vCisgIC8vLyAgICAgVEFwcGxpY2F0aW9uRXJyb3IgKDEpOiBJbnZhbGlkIE1lc3NhZ2UgVHlwZQorICAvLy8gICAgIEFuIHVua25vd24gRXJyb3IgaGFzIG9jY3VyZWQuCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgdmFyIG91dCA9ICJcKFNlbGYuc2VsZikgKFwoZXJyb3IudGhyaWZ0RXJyb3JDb2RlKSk6ICIgKyBlcnJvci5kZXNjcmlwdGlvbiArICJcbiIKKyAgICBpZiBsZXQgbWVzc2FnZSA9IG1lc3NhZ2UgeworICAgICAgb3V0ICs9ICJNZXNzYWdlOiBcKG1lc3NhZ2UpIgorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KKworICAvLy8gU2ltcGxlIGRlZmF1bHQgSW5pdGlhbGl6ZXIgZm9yIFRFcnJvcidzCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgZXJyb3I6ICAgRXJyb3JDb2RlIHZhbHVlLiAgRGVmYXVsdDogZGVmYXVsdENhc2UKKyAgLy8vIC0gcGFyYW1ldGVyIG1lc3NhZ2U6IEN1c3RvbSBtZXNzYWdlIHdpdGggZXJyb3IuICBPcHRpb25hbAorICAvLy8KKyAgLy8vIC0gcmV0dXJuczogPCNyZXR1cm4gdmFsdWUgZGVzY3JpcHRpb24jPgorICBwdWJsaWMgaW5pdChlcnJvcjogQ29kZSwgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCkgeworICAgIHNlbGYuaW5pdCgpCisgICAgc2VsZi5lcnJvciA9IGVycm9yCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTVmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDU2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVEZpbGVIYW5kbGVUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICB2YXIgaW5wdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlCisgIHZhciBvdXRwdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlCisgIAorICBwdWJsaWMgaW5pdChpbnB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUsIG91dHB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUpIHsKKyAgICBzZWxmLmlucHV0RmlsZUhhbmRsZSA9IGlucHV0RmlsZUhhbmRsZQorICAgIHNlbGYub3V0cHV0RmlsZUhhbmRsZSA9IG91dHB1dEZpbGVIYW5kbGUKKyAgfQorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoZmlsZUhhbmRsZTogRmlsZUhhbmRsZSkgeworICAgIHNlbGYuaW5pdChpbnB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGUsIG91dHB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICB3aGlsZSBkYXRhLmNvdW50IDwgc2l6ZSB7CisgICAgICBsZXQgcmVhZCA9IGlucHV0RmlsZUhhbmRsZS5yZWFkRGF0YShvZkxlbmd0aDogc2l6ZSAtIGRhdGEuY291bnQpCisgICAgICBkYXRhLmFwcGVuZChyZWFkKQorICAgICAgaWYgcmVhZC5jb3VudCA9PSAwIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRhdGEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICBvdXRwdXRGaWxlSGFuZGxlLndyaXRlKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMjUzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTAxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisjZW5kaWYKKworLy8vIFRGaWxlVHJhbnNwb3J0CisvLy8gRm91bmRhdGlvbi1sZXNzIFN3aWZ0IEZpbGUgdHJhbnNwb3J0LgorLy8vIFVzZXMgQyBmb3Blbi9mcmVhZC9md3JpdGUsCisvLy8gcHJvdmlkZWQgYnkgR2xpYmMgaW4gbGludXggYW5kIERhcndpbiBvbiBPU1gvaU9TCitwdWJsaWMgY2xhc3MgVEZpbGVUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICB2YXIgZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4/ID0gbmlsCisgIAorICBwdWJsaWMgaW5pdCAoZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4pIHsKKyAgICBzZWxmLmZpbGVIYW5kbGUgPSBmaWxlSGFuZGxlCisgIH0KKworICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChmaWxlbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHZhciBmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPj8KKyAgICBmaWxlbmFtZS53aXRoQ1N0cmluZyh7IGNGaWxlbmFtZSBpbgorICAgICAgInJ3Ii53aXRoQ1N0cmluZyh7IGNNb2RlIGluCisgICAgICAgIGZpbGVIYW5kbGUgPSBmb3BlbihjRmlsZW5hbWUsIGNNb2RlKQorICAgICAgfSkKKyAgICB9KQorICAgIGlmIGxldCBmaWxlSGFuZGxlID0gZmlsZUhhbmRsZSB7CisgICAgICBzZWxmLmluaXQoZmlsZUhhbmRsZTogZmlsZUhhbmRsZSkKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICB9CisgIH0KKyAgCisgIGRlaW5pdCB7CisgICAgZmNsb3NlKHNlbGYuZmlsZUhhbmRsZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgcmVhZCA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSkKKyAgICAKKyAgICBpZiByZWFkLmNvdW50ICE9IHNpemUgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgIH0KKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIC8vIHNldCB1cCByZWFkIGJ1ZmZlciwgcG9zaXRpb24gMAorICAgIHZhciByZWFkID0gRGF0YShjYXBhY2l0eTogc2l6ZSkKKyAgICB2YXIgcG9zaXRpb24gPSAwCisgICAgCisgICAgLy8gcmVhZCBjaGFyYWN0ZXIgYnVmZmVyCisgICAgdmFyIG5leHRDaGFyOiBVSW50OCA9IDAKKyAgICAKKyAgICAvLyBjb250aW51ZSB1bnRpbCB3ZSd2ZSByZWFkIHNpemUgYnl0ZXMKKyAgICB3aGlsZSByZWFkLmNvdW50IDwgc2l6ZSB7CisgICAgICBpZiBmcmVhZCgmbmV4dENoYXIsIDEsIDEsIHNlbGYuZmlsZUhhbmRsZSkgPT0gMSB7CisgICAgICAgIHJlYWRbcG9zaXRpb25dID0gbmV4dENoYXIKKworICAgICAgICAvLyBJbmNyZW1lbnQgb3V0cHV0IGJ5dGUgcG9pbnRlcgorICAgICAgICBwb3NpdGlvbiArPSAxCisgICAgICAgIAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIGxldCBieXRlc1dyaXR0ZW4gPSBkYXRhLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICBmd3JpdGUoJDAsIDEsIGRhdGEuY291bnQsIHNlbGYuZmlsZUhhbmRsZSkKKyAgICB9CisgICAgaWYgYnl0ZXNXcml0dGVuICE9IGRhdGEuY291bnQgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzODVkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgcHVibGljIHN0YXRpYyBsZXQgaGVhZGVyU2l6ZSAgICA9IDQKKyAgcHVibGljIHN0YXRpYyBsZXQgaW5pdEZyYW1lU2l6ZSA9IDEwMjQKKyAgcHJpdmF0ZSBzdGF0aWMgbGV0IGRlZmF1bHRNYXhMZW5ndGggPSAxNjM4NDAwMAorCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIHByaXZhdGUgdmFyIHdyaXRlQnVmZmVyID0gRGF0YSgpCisKKyAgcHJpdmF0ZSB2YXIgbWF4U2l6ZSAgICAgPSBURnJhbWVkVHJhbnNwb3J0LmRlZmF1bHRNYXhMZW5ndGgKKyAgcHJpdmF0ZSB2YXIgcmVtYWluaW5nQnl0ZXMgPSAwCisKKworICBwdWJsaWMgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIG1heFNpemU6IEludCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgc2VsZi5tYXhTaXplID0gbWF4U2l6ZQorICB9CisKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi5pbml0KHRyYW5zcG9ydDogdHJhbnNwb3J0LCBtYXhTaXplOiBURnJhbWVkVHJhbnNwb3J0LmRlZmF1bHRNYXhMZW5ndGgpCisgIH0KKworICBmdW5jIHJlYWRIZWFkZXIoKSB0aHJvd3MgeworICAgIGxldCByZWFkID0gdHJ5IHRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyU2l6ZSkKKyAgICByZW1haW5pbmdCeXRlcyA9IEludChkZWNvZGVGcmFtZVNpemUoZGF0YTogcmVhZCkpCisgIH0KKworICAvLy8gTWFyazogLSBUVHJhbnNwb3J0CisKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB3aGlsZSAocmVtYWluaW5nQnl0ZXMgPD0gMCkgeworICAgICAgICB0cnkgcmVhZEhlYWRlcigpCisgICAgfQorCisgICAgbGV0IHRvUmVhZCA9IG1pbihzaXplLCByZW1haW5pbmdCeXRlcykKKworICAgIGlmIHRvUmVhZCA8IDAgeworICAgICAgICB0cnkgY2xvc2UoKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5uZWdhdGl2ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplIChcKHRvUmVhZCkpISIpCisgICAgfQorCisgICAgaWYgdG9SZWFkID4gbWF4U2l6ZSB7CisgICAgICAgIHRyeSBjbG9zZSgpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnNpemVMaW1pdChsaW1pdDogbWF4U2l6ZSwgZ290OiB0b1JlYWQpKQorICAgIH0KKworICAgIHJldHVybiB0cnkgdHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogdG9SZWFkKQorICB9CisKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIC8vIGNvcHkgYnVmZmVyIGFuZCByZXNldAorICAgIGxldCBidWZmID0gd3JpdGVCdWZmZXIKKyAgICB3cml0ZUJ1ZmZlciA9IERhdGEoKQorCisgICAgaWYgYnVmZi5jb3VudCAtIFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyU2l6ZSA8IDAgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICB9CisKKyAgICBsZXQgZnJhbWVTaXplID0gZW5jb2RlRnJhbWVTaXplKHNpemU6IFVJbnQzMihidWZmLmNvdW50KSkKKworICAgIHRyeSB0cmFuc3BvcnQud3JpdGUoZGF0YTogZnJhbWVTaXplKQorICAgIHRyeSB0cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB0cnkgdHJhbnNwb3J0LmZsdXNoKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgd3JpdGVCdWZmZXIuYXBwZW5kKGRhdGEpCisgIH0KKworCisKKyAgcHJpdmF0ZSBmdW5jIGVuY29kZUZyYW1lU2l6ZShzaXplOiBVSW50MzIpIC0+IERhdGEgeworICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSA+PiAyNCkpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSA+PiAxNikpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSA+PiA4KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplKSldKSkKKworICAgIHJldHVybiBkYXRhCisgIH0KKworICBwcml2YXRlIGZ1bmMgZGVjb2RlRnJhbWVTaXplKGRhdGE6IERhdGEpIC0+IFVJbnQzMiB7CisgICAgdmFyIHNpemU6IFVJbnQzMgorICAgIHNpemUgID0gKFVJbnQzMihkYXRhWzBdICYgMHhmZikgPDwgMjQpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbMV0gJiAweGZmKSA8PCAxNikKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVsyXSAmIDB4ZmYpIDw8ICA4KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzNdICYgMHhmZikpCisgICAgcmV0dXJuIHNpemUKKyAgfQorCisgIHB1YmxpYyBmdW5jIGNsb3NlKCkgdGhyb3dzIHsKKyAgICB0cnkgdHJhbnNwb3J0LmNsb3NlKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIG9wZW4oKSB0aHJvd3MgeworICAgIHRyeSB0cmFuc3BvcnQub3BlbigpCisgIH0KKworICBwdWJsaWMgZnVuYyBpc09wZW4oKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSB0cmFuc3BvcnQuaXNPcGVuKCkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGFmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxODQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgRGlzcGF0Y2gKKworCitwdWJsaWMgY2xhc3MgVEhUVFBTZXNzaW9uVHJhbnNwb3J0OiBUQXN5bmNUcmFuc3BvcnQgeworICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRBc3luY1RyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YmxpYyB2YXIgcmVzcG9uc2VWYWxpZGF0ZTogKChIVFRQVVJMUmVzcG9uc2U/LCBEYXRhPykgdGhyb3dzIC0+IFZvaWQpPworICAgIAorICAgIHZhciBzZXNzaW9uOiBVUkxTZXNzaW9uCisgICAgdmFyIHVybDogVVJMCisgICAgCisgICAgcHVibGljIGNsYXNzIGZ1bmMgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uKF8gY29uZmlnOiBVUkxTZXNzaW9uQ29uZmlndXJhdGlvbiwgd2l0aFByb3RvY29sTmFtZSBwcm90b2NvbE5hbWU6IFN0cmluZz8pIHsKKyAgICAgIHZhciB0aHJpZnRDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCIKKyAgICAgIAorICAgICAgaWYgbGV0IHByb3RvY29sTmFtZSA9IHByb3RvY29sTmFtZSB7CisgICAgICAgIHRocmlmdENvbnRlbnRUeXBlICs9ICI7IHA9XChwcm90b2NvbE5hbWUpIgorICAgICAgfQorICAgICAgCisgICAgICBjb25maWcucmVxdWVzdENhY2hlUG9saWN5ID0gLnJlbG9hZElnbm9yaW5nTG9jYWxDYWNoZURhdGEKKyAgICAgIGNvbmZpZy51cmxDYWNoZSA9IG5pbAorICAgICAgCisgICAgICBjb25maWcuaHR0cFNob3VsZFVzZVBpcGVsaW5pbmcgID0gdHJ1ZQorICAgICAgY29uZmlnLmh0dHBTaG91bGRTZXRDb29raWVzICAgICA9IHRydWUKKyAgICAgIGNvbmZpZy5odHRwQWRkaXRpb25hbEhlYWRlcnMgICAgPSBbIkNvbnRlbnQtVHlwZSI6IHRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXB0IjogdGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyLUFnZW50IjogIlRocmlmdC9Td2lmdCAoU2Vzc2lvbikiXQorICAgICAgCisgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIGluaXQoc2Vzc2lvbjogVVJMU2Vzc2lvbiwgdXJsOiBVUkwpIHsKKyAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KKyAgICAgIHNlbGYudXJsID0gdXJsCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIG5ld1RyYW5zcG9ydCgpIC0+IFRIVFRQU2Vzc2lvblRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gVEhUVFBTZXNzaW9uVHJhbnNwb3J0KGZhY3Rvcnk6IHNlbGYpCisgICAgfQorICAgIAorICAgIGZ1bmMgdmFsaWRhdGVSZXNwb25zZShfIHJlc3BvbnNlOiBIVFRQVVJMUmVzcG9uc2U/LCBkYXRhOiBEYXRhPykgdGhyb3dzIHsKKyAgICAgIHRyeSByZXNwb25zZVZhbGlkYXRlPyhyZXNwb25zZSwgZGF0YSkKKyAgICB9CisgICAgCisgICAgZnVuYyB0YXNrV2l0aFJlcXVlc3QoXyByZXF1ZXN0OiBVUkxSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogQGVzY2FwaW5nIChEYXRhPywgVVJMUmVzcG9uc2U/LCBFcnJvcj8pIC0+ICgpKSB0aHJvd3MgLT4gVVJMU2Vzc2lvblRhc2sgeworICAgICAgCisgICAgICBsZXQgbmV3VGFzazogVVJMU2Vzc2lvblRhc2s/ID0gc2Vzc2lvbi5kYXRhVGFzayh3aXRoOiByZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogY29tcGxldGlvbkhhbmRsZXIpCisgICAgICBpZiBsZXQgbmV3VGFzayA9IG5ld1Rhc2sgeworICAgICAgICByZXR1cm4gbmV3VGFzaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93biwgbWVzc2FnZTogIkZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvbiBkYXRhIHRhc2siKQorICAgICAgfQorICAgIH0gICAgCisgIH0KKyAgCisgIHZhciBmYWN0b3J5OiBGYWN0b3J5CisgIHZhciByZXF1ZXN0RGF0YSA9IERhdGEoKQorICB2YXIgcmVzcG9uc2VEYXRhID0gRGF0YSgpCisgIHZhciByZXNwb25zZURhdGFPZmZzZXQ6IEludCA9IDAKKyAgCisgIGluaXQoZmFjdG9yeTogRmFjdG9yeSkgeworICAgIHNlbGYuZmFjdG9yeSA9IGZhY3RvcnkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgcmVhZCA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSkKKyAgICBpZiByZWFkLmNvdW50ICE9IHNpemUgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgIH0KKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBhdmFpbCA9IHJlc3BvbnNlRGF0YS5jb3VudCAtIHJlc3BvbnNlRGF0YU9mZnNldAorICAgIGxldCAoc3RhcnQsIHN0b3ApID0gKHJlc3BvbnNlRGF0YU9mZnNldCwgcmVzcG9uc2VEYXRhT2Zmc2V0ICsgbWluKHNpemUsIGF2YWlsKSkKKyAgICBsZXQgcmVhZCA9IHJlc3BvbnNlRGF0YS5zdWJkYXRhKGluOiBzdGFydC4uPHN0b3ApCisgICAgcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJlYWQuY291bnQKKyAgICByZXR1cm4gcmVhZAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHJlcXVlc3REYXRhLmFwcGVuZChkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaChfIGNvbXBsZXRlZDogQGVzY2FwaW5nIChUQXN5bmNUcmFuc3BvcnQsIEVycm9yPykgLT4gVm9pZCkgeworICAgIHZhciBlcnJvcjogRXJyb3I/CisgICAgdmFyIHRhc2s6IFVSTFNlc3Npb25UYXNrPworICAgIAorICAgIHZhciByZXF1ZXN0ID0gVVJMUmVxdWVzdCh1cmw6IGZhY3RvcnkudXJsKQorICAgIHJlcXVlc3QuaHR0cE1ldGhvZCA9ICJQT1NUIgorICAgIHJlcXVlc3QuaHR0cEJvZHkgPSAgcmVxdWVzdERhdGEKKworICAgIHJlcXVlc3REYXRhID0gRGF0YSgpCisKKyAgICBkbyB7CisgICAgICB0YXNrID0gdHJ5IGZhY3RvcnkudGFza1dpdGhSZXF1ZXN0KHJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiB7IChkYXRhLCByZXNwb25zZSwgdGFza0Vycm9yKSBpbgorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIHRoZSBuZXR3b3JrCisgICAgICAgIGlmIHRhc2tFcnJvciAhPSBuaWwgeworICAgICAgICAgICAgZXJyb3IgPSBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC50aW1lZE91dCkKKyAgICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgcmVzcG9uc2UgdHlwZQorICAgICAgICBpZiB0YXNrRXJyb3IgPT0gbmlsICYmICEocmVzcG9uc2UgaXMgSFRUUFVSTFJlc3BvbnNlKSB7CisgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5pbnZhbGlkUmVzcG9uc2UpCisgICAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgc3RhdHVzIGNvZGUKKyAgICAgICAgaWYgbGV0IGh0dHBSZXNwb25zZSA9IHJlc3BvbnNlIGFzPyBIVFRQVVJMUmVzcG9uc2UgeworICAgICAgICAgIGlmIHRhc2tFcnJvciA9PSBuaWwgJiYgaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gMjAwIHsKKyAgICAgICAgICAgIGlmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlID09IDQwMSB7CisgICAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmF1dGhlbnRpY2F0aW9uKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaW52YWxpZFN0YXR1cyhzdGF0dXNDb2RlOiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIC8vIEFsbG93IGZhY3RvcnkgdG8gY2hlY2sKKyAgICAgICAgICBpZiBlcnJvciAhPSBuaWwgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICB0cnkgc2VsZi5mYWN0b3J5LnZhbGlkYXRlUmVzcG9uc2UoaHR0cFJlc3BvbnNlLCBkYXRhOiBkYXRhKQorICAgICAgICAgICAgfSBjYXRjaCBsZXQgdmFsaWRhdGVFcnJvciB7CisgICAgICAgICAgICAgIGVycm9yID0gdmFsaWRhdGVFcnJvcgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YU9mZnNldCA9IDAKKyAgICAgICAgICBpZiBlcnJvciAhPSBuaWwgeworICAgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGEgPSBEYXRhKCkKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGEgPSBkYXRhID8/IERhdGEoKQorICAgICAgICAgIH0KKyAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgIH0KKyAgICAgIH0pCisgICAgICAKKyAgICB9IGNhdGNoIGxldCB0YXNrRXJyb3IgeworICAgICAgZXJyb3IgPSB0YXNrRXJyb3IKKyAgICB9CisgICAgCisgICAgaWYgbGV0IGVycm9yID0gZXJyb3IsIHRhc2sgPT0gbmlsIHsKKyAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICB9CisgICAgdGFzaz8ucmVzdW1lKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICBsZXQgY29tcGxldGVkID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCisgICAgdmFyIGludGVybmFsRXJyb3I6IEVycm9yPworICAgIAorICAgIGZsdXNoKCkgeyBfLCBlcnJvciBpbgorICAgICAgaW50ZXJuYWxFcnJvciA9IGVycm9yCisgICAgICBjb21wbGV0ZWQuc2lnbmFsKCkKKyAgICB9CisgICAgCisgICAgXyA9IGNvbXBsZXRlZC53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQorICAgIAorICAgIGlmIGxldCBlcnJvciA9IGludGVybmFsRXJyb3IgeworICAgICAgdGhyb3cgZXJyb3IKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzOWQxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0CkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YmxpYyBzdHJ1Y3QgVExpc3Q8RWxlbWVudCA6IFRTZXJpYWxpemFibGU+IDogUmFuZG9tQWNjZXNzQ29sbGVjdGlvbiwgTXV0YWJsZUNvbGxlY3Rpb24sIEV4cHJlc3NpYmxlQnlBcnJheUxpdGVyYWwsIFRTZXJpYWxpemFibGUsIEhhc2hhYmxlIHsKKyAgcHVibGljIHR5cGVhbGlhcyBTdG9yYWdlID0gQXJyYXk8RWxlbWVudD4KKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgcHVibGljIGluaXQoKSB7IH0KKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICBwdWJsaWMgaW5pdDxTb3VyY2UgOiBTZXF1ZW5jZT4oXyBzZXF1ZW5jZTogU291cmNlKSB3aGVyZSBTb3VyY2UuSXRlcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50IHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShzZXF1ZW5jZSkKKyAgfQorCisgIC8vLyBNYXJrOiBIYXNoYWJsZQorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciBlbGVtZW50IGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIE1hcms6IFRTZXJpYWxpemFibGUKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5saXN0IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTGlzdCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogZWxlbWVudFR5cGUpKQorICAgIH0KKyAgICB2YXIgbGlzdCA9IFRMaXN0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBsaXN0LnN0b3JhZ2UuYXBwZW5kKGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTGlzdEVuZCgpCisgICAgcmV0dXJuIGxpc3QKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlKGVsZW1lbnQsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEVuZCgpCisgIH0KKworICAvLy8gTWFyazogTXV0YWJsZUNvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgU3ViU2VxdWVuY2UgPSBTdG9yYWdlLlN1YlNlcXVlbmNlCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHBvc2l0aW9uOiBTdG9yYWdlLkluZGV4KSAtPiBFbGVtZW50IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW3Bvc2l0aW9uXSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHJhbmdlOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcmFuZ2VdCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW3JhbmdlXSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChhZnRlciBpOiBpbm91dCBJbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGJlZm9yZSBpOiBpbm91dCBJbnQpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChiZWZvcmU6ICZpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisKKyAgcHVibGljIGZ1bmMgaW5kZXgoYmVmb3JlIGk6IEludCkgLT4gSW50IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChiZWZvcmU6IGkpCisgIH0KKworfQorCitleHRlbnNpb24gVExpc3QgOiBSYW5nZVJlcGxhY2VhYmxlQ29sbGVjdGlvbiB7CisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlcGxhY2VTdWJyYW5nZTxDOiBDb2xsZWN0aW9uPihfIHN1YnJhbmdlOiBSYW5nZTxJbmRleD4sIHdpdGggbmV3RWxlbWVudHM6IEMpCisgICAgd2hlcmUgQy5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UucmVwbGFjZVN1YnJhbmdlKHN1YnJhbmdlLCB3aXRoOiBuZXdFbGVtZW50cykKKyAgfQorfQorCitleHRlbnNpb24gVExpc3QgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUTGlzdDxFbGVtZW50PiwgcmhzOiBUTGlzdDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZS5lbGVtZW50c0VxdWFsKHJocy5zdG9yYWdlKSB7ICQwID09ICQxIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODAzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0CkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YmxpYyBzdHJ1Y3QgVE1hcDxLZXkgOiBUU2VyaWFsaXphYmxlICYgSGFzaGFibGUsIFZhbHVlIDogVFNlcmlhbGl6YWJsZT46IENvbGxlY3Rpb24sIEV4cHJlc3NpYmxlQnlEaWN0aW9uYXJ5TGl0ZXJhbCwgSGFzaGFibGUsIFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBEaWN0aW9uYXJ5PEtleSwgVmFsdWU+CisgIHB1YmxpYyB0eXBlYWxpYXMgRWxlbWVudCA9IFN0b3JhZ2UuRWxlbWVudAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4RGlzdGFuY2UgPSBTdG9yYWdlLkluZGV4RGlzdGFuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisgIHB1YmxpYyB0eXBlYWxpYXMgU3ViU2VxdWVuY2UgPSBTdG9yYWdlLlN1YlNlcXVlbmNlCisgIGludGVybmFsIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIAorICAvLy8gTWFyazogQmUgTGlrZSBEaWN0aW9uYXJ5CisgIAorICBwdWJsaWMgZnVuYyBpbmRleEZvcktleShfIGtleTogS2V5KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyB1cGRhdGVWYWx1ZShfIHZhbHVlOiBWYWx1ZSwgZm9yS2V5IGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiB1cGRhdGVWYWx1ZSh2YWx1ZSwgZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUF0SW5kZXgoXyBpbmRleDogRGljdGlvbmFyeUluZGV4PEtleSwgVmFsdWU+KSAtPiAoS2V5LCBWYWx1ZSkgeworICAgIHJldHVybiByZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVWYWx1ZUZvcktleShfIGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZVZhbHVlKGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgaW5pdChtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKG1pbmltdW1DYXBhY2l0eTogbWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICAvLy8gaW5pdCBmcm9tIERpY3Rpb25hcnk8SyxWPgorICBwdWJsaWMgaW5pdChfIGRpY3Q6IFtLZXk6IFZhbHVlXSkgeworICAgIHN0b3JhZ2UgPSBkaWN0CisgIH0KKworICAvLy8gcmVhZCBvbmx5IGFjY2VzcyB0byBzdG9yYWdlIGlmIG5lZWRlZCBhcyBEaWN0aW9uYXJ5PEssVj4KKyAgcHVibGljIHZhciBkaWN0aW9uYXJ5OiBbS2V5OiBWYWx1ZV0geworICAgIHJldHVybiBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtrZXldCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW2tleV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgLy8vIE1hcms6IENvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB2YXIgaW5kaWNlczogSW5kaWNlcyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kaWNlcworICB9CisgIAorICBwdWJsaWMgZnVuYyBkaXN0YW5jZShmcm9tIHN0YXJ0OiBJbmRleCwgdG8gZW5kOiBJbmRleCkgLT4gSW5kZXhEaXN0YW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGlzdGFuY2UoZnJvbTogc3RhcnQsIHRvOiBlbmQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSwgbGltaXRlZEJ5IGxpbWl0OiBJbmRleCkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbiwgbGltaXRlZEJ5OiBsaW1pdCkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgIAorICAvLy8gTWFyazogSW5kZXhhYmxlQmFzZQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4OiBJbmRleCB7IHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXggfQorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgcHVibGljIGZ1bmMgaW5kZXgoYWZ0ZXIgaTogSW5kZXgpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChhZnRlcjogaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IEluZGV4KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYWZ0ZXI6ICZpKQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KGJvdW5kczogUmFuZ2U8SW5kZXg+KSAtPiBTdWJTZXF1ZW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2VbYm91bmRzXQorICB9CisgIAorICAvLy8gTWFyazogRGljdGlvbmFyeUxpdGVyYWxDb252ZXJ0aWJsZQorICAKKyAgcHVibGljIGluaXQoZGljdGlvbmFyeUxpdGVyYWwgZWxlbWVudHM6IChLZXksIFZhbHVlKS4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIGVsZW1lbnRzIHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICB9CisKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBrZXkuaGFzaFZhbHVlCisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgdmFsdWUuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIE1hcms6IFRTZXJpYWxpemFibGUKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAubWFwIH0KKyAgcHVibGljIGluaXQoKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVE1hcCB7CisKKyAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZE1hcEJlZ2luKCkKKyAgICBpZiBzaXplID4gMCB7CisgICAgICBpZiBrZXlUeXBlICE9IEtleS50aHJpZnRUeXBlIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlVuZXhwZWN0ZWQgVE1hcCBLZXkgVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiBrZXlUeXBlKSkKKyAgICAgIH0KKyAgICAgIGlmIHZhbHVlVHlwZSAhPSBWYWx1ZS50aHJpZnRUeXBlIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIlVuZXhwZWN0ZWQgVE1hcCBWYWx1ZSBUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IHZhbHVlVHlwZSkpCisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1hcCA9IFRNYXAoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBrZXkgPSB0cnkgS2V5LnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBsZXQgdmFsdWUgPSB0cnkgVmFsdWUucmVhZChmcm9tOiBwcm90bykKKyAgICAgIG1hcC5zdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZE1hcEVuZCgpCisgICAgcmV0dXJuIG1hcAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZU1hcEJlZ2luKGtleVR5cGU6IEtleS50aHJpZnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogVmFsdWUudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzZWxmLnN0b3JhZ2UgeworICAgICAgdHJ5IEtleS53cml0ZShrZXksIHRvOiBwcm90bykKKyAgICAgIHRyeSBWYWx1ZS53cml0ZSh2YWx1ZSwgdG86IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBFbmQoKQorICB9Cit9CisKKy8vLyBNYXJrOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZQorCitleHRlbnNpb24gVE1hcCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCisvLy8gTWFyazogRXF1YXRhYmxlCisKK3B1YmxpYyBmdW5jID09PEtleSwgVmFsdWU+KGxoczogVE1hcDxLZXksVmFsdWU+LCByaHM6IFRNYXA8S2V5LCBWYWx1ZT4pIC0+IEJvb2wgeworICBpZiBsaHMuY291bnQgIT0gcmhzLmNvdW50IHsKKyAgICByZXR1cm4gZmFsc2UKKyAgfQorICByZXR1cm4gbGhzLnN0b3JhZ2UuZWxlbWVudHNFcXVhbChyaHMuc3RvcmFnZSkgeyAkMC5rZXkgPT0gJDEua2V5ICYmICQwLnZhbHVlID09ICQxLnZhbHVlIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNThiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgOiBUVHJhbnNwb3J0IHsKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgcmVhZEJ1ZmZlciA9IERhdGEoKQorICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciB3cml0ZUJ1ZmZlciA9IERhdGEoKQorICAKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgcG9zaXRpb24gPSAwCisKKyAgcHVibGljIHZhciBieXRlc1JlbWFpbmluZ0luQnVmZmVyOiBJbnQgeworICAgIHJldHVybiByZWFkQnVmZmVyLmNvdW50IC0gcG9zaXRpb24KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY29uc3VtZUJ1ZmZlcihzaXplOiBJbnQpIHsKKyAgICBwb3NpdGlvbiArPSBzaXplCisgIH0KKyAgcHVibGljIGZ1bmMgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlciA9IERhdGEoKQorICAgIHdyaXRlQnVmZmVyID0gRGF0YSgpCisgIH0KKyAgCisgIAorICBwcml2YXRlIHZhciBmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPworICAKKyAgcHVibGljIGluaXQoZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8gPSBuaWwpIHsKKyAgICBzZWxmLmZsdXNoSGFuZGxlciA9IGZsdXNoSGFuZGxlcgorICB9CisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChyZWFkQnVmZmVyOiBEYXRhLCBmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPyA9IG5pbCkgeworICAgIHNlbGYuaW5pdCgpCisgICAgc2VsZi5yZWFkQnVmZmVyID0gcmVhZEJ1ZmZlcgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZXNldChyZWFkQnVmZmVyOiBEYXRhID0gRGF0YSgpLCB3cml0ZUJ1ZmZlcjogRGF0YSA9IERhdGEoKSkgeworICAgIHNlbGYucmVhZEJ1ZmZlciA9IHJlYWRCdWZmZXIKKyAgICBzZWxmLndyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgYW1vdW50VG9SZWFkID0gbWluKGJ5dGVzUmVtYWluaW5nSW5CdWZmZXIsIHNpemUpCisgICAgaWYgYW1vdW50VG9SZWFkID4gMCB7CisgICAgICBsZXQgcmV0ID0gcmVhZEJ1ZmZlci5zdWJkYXRhKGluOiBSYW5nZSh1bmNoZWNrZWRCb3VuZHM6IChsb3dlcjogcG9zaXRpb24sIHVwcGVyOiBwb3NpdGlvbiArIGFtb3VudFRvUmVhZCkpKQorICAgICAgcG9zaXRpb24gKz0gcmV0LmNvdW50CisgICAgICByZXR1cm4gcmV0CisgICAgfQorICAgIHJldHVybiBEYXRhKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB3cml0ZUJ1ZmZlci5hcHBlbmQoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIGZsdXNoSGFuZGxlcj8oc2VsZiwgd3JpdGVCdWZmZXIpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhOGQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3B1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbDxQcm90b2NvbDogVFByb3RvY29sPjogVFdyYXBwZWRQcm90b2NvbDxQcm90b2NvbD4geworICBwdWJsaWMgbGV0IHNlcGFyYXRvciA9ICI6IgorCisgIHB1YmxpYyB2YXIgc2VydmljZU5hbWUgPSAiIgorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBzZXJ2aWNlTmFtZTogU3RyaW5nKSB7CisgICAgc2VsZi5pbml0KG9uOiB0cmFuc3BvcnQpCisgICAgc2VsZi5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lICAgIAorICB9CisKKyAgb3ZlcnJpZGUgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHN3aXRjaCBtZXNzYWdlVHlwZSB7CisgICAgY2FzZSAuY2FsbCwgLm9uZXdheToKKyAgICAgIHZhciBzZXJ2aWNlRnVuY3Rpb24gPSBzZXJ2aWNlTmFtZQorICAgICAgc2VydmljZUZ1bmN0aW9uICs9IHNlcnZpY2VOYW1lID09ICIiID8gIiIgOiBzZXBhcmF0b3IKKyAgICAgIHNlcnZpY2VGdW5jdGlvbiArPSBuYW1lCisgICAgICByZXR1cm4gdHJ5IHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IHNlcnZpY2VGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiB0cnkgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmYyMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdApAQCAtMCwwICsxLDI5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3B1YmxpYyB0eXBlYWxpYXMgVFByb2Nlc3Nvck1lc3NhZ2VIYW5kbGVyPFQ+ID0gKEludCwgVFByb3RvY29sLCBUUHJvdG9jb2wsIFQpIC0+IFZvaWQKKworcHVibGljIHByb3RvY29sIFRQcm9jZXNzb3IgeworICBhc3NvY2lhdGVkdHlwZSBTZXJ2aWNlCisgIHZhciBzZXJ2aWNlOiBTZXJ2aWNlIHsgZ2V0IHNldCB9CisgIGZ1bmMgcHJvY2VzcyhvbiBpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHRocm93cworICBpbml0KHNlcnZpY2U6IFNlcnZpY2UpCit9CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU0YTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMTgyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorLy8KKworcHVibGljIGVudW0gVE1lc3NhZ2VUeXBlOiBJbnQzMiB7CisgIGNhc2UgY2FsbCA9IDEKKyAgY2FzZSByZXBseSA9IDIKKyAgY2FzZSBleGNlcHRpb24gPSAzCisgIGNhc2Ugb25ld2F5ID0gNAorfQorCitwdWJsaWMgZW51bSBUVHlwZTogSW50MzIgeworICBjYXNlIHN0b3AgICAgID0gMAorICBjYXNlIHZvaWQgICAgID0gMQorICBjYXNlIGJvb2wgICAgID0gMgorICBjYXNlIGk4ICAgICAgID0gMworICBjYXNlIGRvdWJsZSAgID0gNAorICBjYXNlIGkxNiAgICAgID0gNgorICBjYXNlIGkzMiAgICAgID0gOAorICBjYXNlIGk2NCAgICAgID0gMTAKKyAgY2FzZSBzdHJpbmcgICA9IDExCisgIGNhc2UgYHN0cnVjdGAgPSAxMgorICBjYXNlIG1hcCAgICAgID0gMTMKKyAgY2FzZSBzZXQgICAgICA9IDE0CisgIGNhc2UgbGlzdCAgICAgPSAxNQorICBjYXNlIHV0ZjggICAgID0gMTYKKyAgY2FzZSB1dGYxNiAgICA9IDE3Cit9CisKK3B1YmxpYyBwcm90b2NvbCBUUHJvdG9jb2wgeworICB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsgZ2V0IHNldCB9CisgIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KQorICAvLyBSZWFkaW5nIE1ldGhvZHMKKyAgCisgIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKQorICBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZworICBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzCisgIAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhCisgIAorICAvLyBXcml0aW5nIG1ldGhvZHMKKyAgCisgIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzCisgIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIGZpZWxkVHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzCisKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IERhdGEpIHRocm93cworfQorCitwdWJsaWMgZXh0ZW5zaW9uIFRQcm90b2NvbCB7CisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRWYWx1ZShfIHZhbHVlOiBUU2VyaWFsaXphYmxlLCBuYW1lOiBTdHJpbmcsIHR5cGU6IFRUeXBlLCBpZDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlRmllbGRCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiB0eXBlLCBmaWVsZElEOiBpZCkKKyAgICB0cnkgdmFsdWUud3JpdGUodG86IHNlbGYpCisgICAgdHJ5IHdyaXRlRmllbGRFbmQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgdmFsaWRhdGVWYWx1ZShfIHZhbHVlOiBBbnk/LCBuYW1lZCBuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgaWYgdmFsdWUgPT0gbmlsIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAudW5rbm93biwgbWVzc2FnZTogIk1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yIGZpZWxkOiBcKG5hbWUpIikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgeworICAgIGxldCAoXywgdHlwZSwgXykgPSB0cnkgcmVhZE1lc3NhZ2VCZWdpbigpOworICAgIGlmIHR5cGUgPT0gLmV4Y2VwdGlvbiB7CisgICAgICBsZXQgeCA9IHRyeSByZWFkRXhjZXB0aW9uKCkKKyAgICAgIHRocm93IHgKKyAgICB9CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRFeGNlcHRpb24oKSB0aHJvd3MgLT4gVEFwcGxpY2F0aW9uRXJyb3IgeworICAgIHJldHVybiB0cnkgVEFwcGxpY2F0aW9uRXJyb3IucmVhZChmcm9tOiBzZWxmKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZSBuYW1lOiBTdHJpbmcsIHNlcXVlbmNlSUQ6IEludDMyLCBleDogVEFwcGxpY2F0aW9uRXJyb3IpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IC5leGNlcHRpb24sIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgICAgdHJ5IGV4LndyaXRlKHRvOiBzZWxmKQorICAgIHRyeSB3cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBza2lwKHR5cGU6IFRUeXBlKSB0aHJvd3MgeworICAgIHN3aXRjaCB0eXBlIHsKKyAgICBjYXNlIC5ib29sOiAgIF8gPSB0cnkgcmVhZCgpIGFzIEJvb2wKKyAgICBjYXNlIC5pODogICBfID0gdHJ5IHJlYWQoKSBhcyBVSW50OAorICAgIGNhc2UgLmkxNjogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50MTYKKyAgICBjYXNlIC5pMzI6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDMyCisgICAgY2FzZSAuaTY0OiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQ2NAorICAgIGNhc2UgLmRvdWJsZTogXyA9IHRyeSByZWFkKCkgYXMgRG91YmxlCisgICAgY2FzZSAuc3RyaW5nOiBfID0gdHJ5IHJlYWQoKSBhcyBTdHJpbmcKKyAgICAgIAorICAgIGNhc2UgLnN0cnVjdDoKKyAgICAgIF8gPSB0cnkgcmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgIHdoaWxlIHRydWUgeworICAgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgXykgPSB0cnkgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgICBpZiBmaWVsZFR5cGUgPT0gLnN0b3AgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHNraXAodHlwZTogZmllbGRUeXBlKQorICAgICAgICB0cnkgcmVhZEZpZWxkRW5kKCkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkU3RydWN0RW5kKCkKKyAgICAgIAorICAgICAgCisgICAgY2FzZSAubWFwOgorICAgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHJlYWRNYXBCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGtleVR5cGUpCisgICAgICAgIHRyeSBza2lwKHR5cGU6IHZhbHVlVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkTWFwRW5kKCkKKyAgICAgIAorICAgICAgCisgICAgY2FzZSAuc2V0OgorICAgICAgbGV0IChlbGVtVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZFNldEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZTogZWxlbVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZFNldEVuZCgpCisgICAgICAKKyAgICBjYXNlIC5saXN0OgorICAgICAgbGV0IChlbGVtVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZExpc3RCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGVsZW1UeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRMaXN0RW5kKCkKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2xFcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDE0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2xFcnJvci5zd2lmdApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHN0cnVjdCBUUHJvdG9jb2xFcnJvciA6IFRFcnJvciB7CisgIHB1YmxpYyBpbml0KCkgeyB9CisKKyAgcHVibGljIGVudW0gQ29kZSA6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2UgaW52YWxpZERhdGEKKyAgICBjYXNlIG5lZ2F0aXZlU2l6ZQorICAgIGNhc2Ugc2l6ZUxpbWl0KGxpbWl0OiBJbnQsIGdvdDogSW50KQorICAgIGNhc2UgYmFkVmVyc2lvbihleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFN0cmluZykKKyAgICBjYXNlIG5vdEltcGxlbWVudGVkCisgICAgY2FzZSBkZXB0aExpbWl0CisKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICByZXR1cm4gMAorICAgICAgY2FzZSAuaW52YWxpZERhdGE6ICAgIHJldHVybiAxCisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6ICAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLnNpemVMaW1pdDogICAgICByZXR1cm4gMworICAgICAgY2FzZSAuYmFkVmVyc2lvbjogICAgIHJldHVybiA0CisgICAgICBjYXNlIC5ub3RJbXBsZW1lbnRlZDogcmV0dXJuIDUKKyAgICAgIGNhc2UgLmRlcHRoTGltaXQ6ICAgICByZXR1cm4gNgorICAgICAgfQorCisgICAgfQorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgcmV0dXJuICJVbmtub3duIFRQcm90b2NvbEVycm9yIgorICAgICAgY2FzZSAuaW52YWxpZERhdGE6ICAgIHJldHVybiAiSW52YWxpZCBEYXRhIgorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiAgIHJldHVybiAiTmVnYXRpdmUgU2l6ZSIKKyAgICAgIGNhc2UgLnNpemVMaW1pdChsZXQgbGltaXQsIGxldCBnb3QpOgorICAgICAgICByZXR1cm4gIk1lc3NhZ2UgZXhjZWVkcyBzaXplIGxpbWl0IG9mIFwobGltaXQpIChyZWNlaXZlZDogXChnb3QpIgorICAgICAgY2FzZSAuYmFkVmVyc2lvbihsZXQgZXhwZWN0ZWQsIGxldCBnb3QpOgorICAgICAgICByZXR1cm4gIkJhZCBWZXJzaW9uLiAoRXhwZWN0ZWQ6IFwoZXhwZWN0ZWQpLCBHb3Q6IFwoZ290KSIKKyAgICAgIGNhc2UgLm5vdEltcGxlbWVudGVkOiByZXR1cm4gIk5vdCBJbXBsZW1lbnRlZCIKKyAgICAgIGNhc2UgLmRlcHRoTGltaXQ6ICAgICByZXR1cm4gIkRlcHRoIExpbWl0IgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBlbnVtIEV4dGVuZGVkRXJyb3JDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBtaXNzaW5nUmVxdWlyZWRGaWVsZChmaWVsZE5hbWU6IFN0cmluZykKKyAgICBjYXNlIHVuZXhwZWN0ZWRUeXBlKHR5cGU6IFRUeXBlKQorICAgIGNhc2UgbWlzbWF0Y2hlZFByb3RvY29sKGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogU3RyaW5nKQorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgIHJldHVybiAxMDAwCisgICAgICBjYXNlIC5taXNzaW5nUmVxdWlyZWRGaWVsZDogcmV0dXJuIDEwMDEKKyAgICAgIGNhc2UgLnVuZXhwZWN0ZWRUeXBlOiAgICAgICByZXR1cm4gMTAwMgorICAgICAgY2FzZSAubWlzbWF0Y2hlZFByb3RvY29sOiAgIHJldHVybiAxMDAzCisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBUUHJvdG9jb2xFeHRlbmRlZEVycm9yIgorICAgICAgY2FzZSAubWlzc2luZ1JlcXVpcmVkRmllbGQobGV0IGZpZWxkTmFtZSk6ICAgICAgICByZXR1cm4gIk1pc3NpbmcgUmVxdWlyZWQgRmllbGQ6IFwoZmllbGROYW1lKSIKKyAgICAgIGNhc2UgLnVuZXhwZWN0ZWRUeXBlKGxldCB0eXBlKTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmV4cGVjdGVkIFR5cGUgXCh0eXBlLnNlbGYpIgorICAgICAgY2FzZSAubWlzbWF0Y2hlZFByb3RvY29sKGxldCBleHBlY3RlZCwgbGV0IGdvdCk6ICByZXR1cm4gIk1pc21hdGNoZWQgUHJvdG9jb2wuICAoRXhwZWN0ZWQ6IFwoZXhwZWN0ZWQpLCBnb3QgXChnb3QpKSIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgdmFyIGV4dGVuZGVkRXJyb3I6IEV4dGVuZGVkRXJyb3JDb2RlPyA9IG5pbAorCisgIHB1YmxpYyBpbml0KGVycm9yOiBDb2RlID0gLnVua25vd24sCisgICAgICAgICAgICAgIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwsCisgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IEV4dGVuZGVkRXJyb3JDb2RlPyA9IG5pbCkgeworICAgIHNlbGYuZXJyb3IgPSBlcnJvcgorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICBzZWxmLmV4dGVuZGVkRXJyb3IgPSBleHRlbmRlZEVycm9yCisgIH0KKworICAvLy8gTWFyazogVEVycm9yCisgIHB1YmxpYyB2YXIgZXJyb3I6IENvZGUgPSAudW5rbm93bgorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyByZXR1cm4gLnVua25vd24gfQorCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgdmFyIG91dCA9ICJcKFRQcm90b2NvbEVycm9yLnNlbGYpOiAgKFwoZXJyb3IudGhyaWZ0RXJyb3JDb2RlKSBcKGVycm9yLmRlc2NyaXB0aW9uKVxuIgorICAgIGlmIGxldCBleHRlbmRlZEVycm9yID0gZXh0ZW5kZWRFcnJvciB7CisgICAgICBvdXQgKz0gIlRQcm90b2NvbEV4dGVuZGVkRXJyb3IgKFwoZXh0ZW5kZWRFcnJvci50aHJpZnRFcnJvckNvZGUpKTogXChleHRlbmRlZEVycm9yLmRlc2NyaXB0aW9uKSIKKyAgICB9CisgICAgaWYgbGV0IG1lc3NhZ2UgPSBtZXNzYWdlIHsKKyAgICAgIG91dCArPSAiTWVzc2FnZTogXChtZXNzYWdlKSIKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9Cit9CisKKworLy8vIFdyYXBwZXIgZm9yIFRyYW5zcG9ydCBlcnJvcnMgaW4gUHJvdG9jb2xzLiAgSW5zcGlyZWQgYnkgVGhyaWZ0LUNvY29hIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUgorLy8vIG1hY3JvLiAgTW9kaWZpZWQgdG8gYmUgbW9yZSBTd2lmdC15LiAgQ2F0Y2hlcyBhbnkgVEVycm9yIHRocm93biB3aXRoaW4gdGhlIGJsb2NrIGFuZAorLy8vIHJldGhyb3dzIGEgZ2l2ZW4gVFByb3RvY29sRXJyb3IsIHRoZSBvcmlnaW5hbCBlcnJvcidzIGRlc2NyaXB0aW9uIGlzIGFwcGVuZGVkIHRvIHRoZSBuZXcKKy8vLyBUUHJvdG9jb2xFcnJvcidzIG1lc3NhZ2UuICBzb3VyY2VGaWxlLCBzb3VyY2VMaW5lLCBzb3VyY2VNZXRob2QgYXJlIGF1dG8tcG9wdWxhdGVkIGFuZCBzaG91bGQKKy8vLyBiZSBpZ25vcmVkIHdoZW4gY2FsbGluZy4KKy8vLworLy8vIC0gcGFyYW1ldGVyIGVycm9yOiAgICAgICAgVFByb3RvY29sRXJyb3IgdG8gdGhyb3cgaWYgdGhlIGJsb2NrIHRocm93cworLy8vIC0gcGFyYW1ldGVyIHNvdXJjZUZpbGU6ICAgdGhyb3dpbmcgZmlsZSwgYXV0b3BvcHVsYXRlZAorLy8vIC0gcGFyYW1ldGVyIHNvdXJjZUxpbmU6ICAgdGhyb3dpbmcgbGluZSwgYXV0b3BvcHVsYXRlZAorLy8vIC0gcGFyYW1ldGVyIHNvdXJjZU1ldGhvZDogdGhyb3dpbmcgbWV0aG9kLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgYmxvY2s6ICAgICAgICB0aHJvd2luZyBibG9jaworLy8vCisvLy8gLSB0aHJvd3M6IFRQcm90b2NvbEVycm9yICBEZWZhdWx0IGlzIFRQcm90b2NvbEVycm9yLkVycm9yQ29kZS51bmtub3duLiAgVW5kZXJseWluZworLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IncyBkZXNjcmlwdGlvbiBhcHBlbmRlZCB0byBUUHJvdG9jb2xFcnJvci5tZXNzYWdlCitmdW5jIFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvciA9IFRQcm90b2NvbEVycm9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGU6IFN0cmluZyA9ICNmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VMaW5lOiBJbnQgPSAjbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTWV0aG9kOiBTdHJpbmcgPSAjZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiAoKSB0aHJvd3MgLT4gKCkpIHRocm93cyB7CisgIC8vIE5lZWQgbXV0YWJsZSBjb3B5CisgIHZhciBlcnJvciA9IGVycm9yCisgIGRvIHsKKyAgICB0cnkgYmxvY2soKQorICB9IGNhdGNoIGxldCBlcnIgYXMgVEVycm9yIHsKKyAgICB2YXIgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgPz8gIiIKKyAgICBtZXNzYWdlICs9ICJcbkZpbGU6IFwoc291cmNlRmlsZSlcbiIKKyAgICBtZXNzYWdlICs9ICJMaW5lOiBcKHNvdXJjZUxpbmUpXG4iCisgICAgbWVzc2FnZSArPSAiTWV0aG9kOiBcKHNvdXJjZU1ldGhvZCkiCisgICAgbWVzc2FnZSArPSAiXG5PcmlnaW5hbCBFcnJvcjpcbiIgKyBlcnIuZGVzY3JpcHRpb24KKyAgICBlcnJvci5tZXNzYWdlID0gbWVzc2FnZQorICAgIHRocm93IGVycm9yCisgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmI1OTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCitwdWJsaWMgY2xhc3MgVFNTTFNvY2tldFRyYW5zcG9ydCB7CisgIGluaXQoaG9zdG5hbWU6IFN0cmluZywgcG9ydDogVUludDE2KSB7CisgICAgLy8gRklYTUUhCisgICAgYXNzZXJ0KGZhbHNlLCAiU2VjdXJpdHkgbm90IGF2YWlsYWJsZSBpbiBMaW51eCwgVFNTTFNvY2tldFRyYW5zcG9ydCBVbmF2aWxhYmxlIGZvciBub3ciKQorICB9Cit9CisjZWxzZQorbGV0IGlzTGl0dGxlRW5kaWFuID0gSW50KE9TSG9zdEJ5dGVPcmRlcigpKSA9PSBPU0xpdHRsZUVuZGlhbgorbGV0IGh0b25zICA9IGlzTGl0dGxlRW5kaWFuID8gX09TU3dhcEludDE2IDogeyAkMCB9CitsZXQgaHRvbmwgID0gaXNMaXR0bGVFbmRpYW4gPyBfT1NTd2FwSW50MzIgOiB7ICQwIH0KKworcHVibGljIGNsYXNzIFRTU0xTb2NrZXRUcmFuc3BvcnQ6IFRTdHJlYW1UcmFuc3BvcnQgeworICB2YXIgc3NsSG9zdG5hbWU6IFN0cmluZworICB2YXIgc2Q6IEludDMyID0gMAorICAKKyAgcHVibGljIGluaXQoaG9zdG5hbWU6IFN0cmluZywgcG9ydDogVUludDE2KSB0aHJvd3MgeworICAgIHNzbEhvc3RuYW1lID0gaG9zdG5hbWUKKyAgICB2YXIgcmVhZFN0cmVhbTogVW5tYW5hZ2VkPENGUmVhZFN0cmVhbT4/CisgICAgdmFyIHdyaXRlU3RyZWFtOiBVbm1hbmFnZWQ8Q0ZXcml0ZVN0cmVhbT4/CisgICAgCisgICAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLworICAgIHZhciBwaW46IHNvY2thZGRyX2luID0gc29ja2FkZHJfaW4oKQorICAgIHZhciBocDogVW5zYWZlTXV0YWJsZVBvaW50ZXI8aG9zdGVudD4/ID0gbmlsCisgICAgZm9yIGkgaW4gMC4uPDEwIHsKKyAgICAgIAorICAgICAgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lLmNTdHJpbmcodXNpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSEpCisgICAgICBpZiBocCA9PSBuaWwgeworICAgICAgICBwcmludCgiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUgXChob3N0bmFtZSkiKQorICAgICAgICBoZXJyb3IoInJlc29sdiIpCisgICAgICAgIGlmIGkgPT0gOSB7CisgICAgICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkgLy8gaGF2ZSB0byBpbml0IGJlZm9yZSB0aHJvd2luZworICAgICAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmhvc3RhbmFtZVJlc29sdXRpb24oaG9zdG5hbWU6IGhvc3RuYW1lKSkKKyAgICAgICAgfQorICAgICAgICBUaHJlYWQuc2xlZXAoZm9yVGltZUludGVydmFsOiAwLjIpCisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhaworICAgICAgfQorICAgIH0KKyAgICBwaW4uc2luX2ZhbWlseSAgPSBVSW50OChBRl9JTkVUKQorICAgIHBpbi5zaW5fYWRkciAgICA9IGluX2FkZHIoc19hZGRyOiBVSW50MzIoKGhwPy5wb2ludGVlLmhfYWRkcl9saXN0LnBvaW50ZWU/LnBvaW50ZWUpISkpIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBnZXQgdGhpcz8/PworICAgIHBpbi5zaW5fcG9ydCAgICA9IGh0b25zKHBvcnQpCisgICAgCisgICAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgICBzZCA9IHNvY2tldChJbnQzMihBRl9JTkVUKSwgSW50MzIoU09DS19TVFJFQU0pLCBJbnQzMihJUFBST1RPX1RDUCkpCisgICAgaWYgc2QgPT0gLTEgeworICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkgLy8gaGF2ZSB0byBpbml0IGJlZm9yZSB0aHJvd2luZworICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuc29ja2V0Q3JlYXRlKHBvcnQ6IEludChwb3J0KSkpCisgICAgfQorICAgIAorICAgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCisgICAgLy8gbmVlZCBhIG5vbi1zZWxmIHJlZiB0byBzZCwgb3RoZXJ3aXNlIHRoZSBqIGNvbXBsYWlucworICAgIGxldCBzZF9sb2NhbCA9IHNkCisgICAgbGV0IGNvbm5lY3RSZXN1bHQgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJnBpbikgeworICAgICAgY29ubmVjdChzZF9sb2NhbCwgVW5zYWZlUG9pbnRlcjxzb2NrYWRkcj4oT3BhcXVlUG9pbnRlcigkMCkpLCBzb2NrbGVuX3QoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSkKKyAgICB9CisgICAgaWYgY29ubmVjdFJlc3VsdCA9PSAtMSB7CisgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5jb25uZWN0KQorICAgIH0KKyAgICAKKyAgICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0KGtDRkFsbG9jYXRvckRlZmF1bHQsIHNkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKQorICAgIAorICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksIC5zb2NrZXROYXRpdmVIYW5kbGUsIGtDRkJvb2xlYW5UcnVlKQorICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwgLnNvY2tldE5hdGl2ZUhhbmRsZSwga0NGQm9vbGVhblRydWUpCisgICAgCisgICAgdmFyIGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8gPSBuaWwKKyAgICB2YXIgb3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0/ID0gbmlsCisgICAgaWYgcmVhZFN0cmVhbSAhPSBuaWwgJiYgd3JpdGVTdHJlYW0gIT0gbmlsIHsKKyAgICAgIAorICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb2NrZXRTZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtU29ja2V0U2VjdXJpdHlMZXZlbFRMU3YxKQorICAgICAgCisgICAgICBsZXQgc2V0dGluZ3M6IFtTdHJpbmc6IEJvb2xdID0gW2tDRlN0cmVhbVNTTFZhbGlkYXRlc0NlcnRpZmljYXRlQ2hhaW4gYXMgU3RyaW5nOiB0cnVlXQorICAgICAgCisgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgYXMgQ0ZUeXBlUmVmISkKKyAgICAgIAorICAgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgYXMgQ0ZUeXBlUmVmISkKKyAgICAgIAorICAgICAgaW5wdXRTdHJlYW0gPSByZWFkU3RyZWFtIS50YWtlUmV0YWluZWRWYWx1ZSgpCisgICAgICBpbnB1dFN0cmVhbT8uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgaW5wdXRTdHJlYW0/Lm9wZW4oKQorICAgICAgCisgICAgICBvdXRwdXRTdHJlYW0gPSB3cml0ZVN0cmVhbSEudGFrZVJldGFpbmVkVmFsdWUoKQorICAgICAgb3V0cHV0U3RyZWFtPy5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBvdXRwdXRTdHJlYW0/Lm9wZW4oKQorICAgICAgCisgICAgICByZWFkU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIHdyaXRlU3RyZWFtPy5yZWxlYXNlKCkKKyAgICB9CisgICAgCisgICAgCisgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogb3V0cHV0U3RyZWFtKQorICAgIHNlbGYuaW5wdXQ/LmRlbGVnYXRlID0gc2VsZgorICAgIHNlbGYub3V0cHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgfQorICAKKyAgZnVuYyByZWNvdmVyRnJvbVRydXN0RmFpbHVyZShfIG15VHJ1c3Q6IFNlY1RydXN0LCBsYXN0VHJ1c3RSZXN1bHQ6IFNlY1RydXN0UmVzdWx0VHlwZSkgLT4gQm9vbCB7CisgICAgbGV0IHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KQorICAgIGxldCBjdXJyZW50VGltZSA9IENGQWJzb2x1dGVUaW1lR2V0Q3VycmVudCgpCisgICAgCisgICAgbGV0IHRpbWVJbmNyZW1lbnQgPSAzMTUzNjAwMCAvLyBmcm9tIFRTU0xTb2NrZXRUcmFuc3BvcnQubQorICAgIGxldCBuZXdUaW1lID0gY3VycmVudFRpbWUgLSBEb3VibGUodGltZUluY3JlbWVudCkKKyAgICAKKyAgICBpZiB0cnVzdFRpbWUgLSBuZXdUaW1lICE9IDAgeworICAgICAgbGV0IG5ld0RhdGUgPSBDRkRhdGVDcmVhdGUobmlsLCBuZXdUaW1lKQorICAgICAgU2VjVHJ1c3RTZXRWZXJpZnlEYXRlKG15VHJ1c3QsIG5ld0RhdGUhKQorICAgICAgCisgICAgICB2YXIgdHIgPSBsYXN0VHJ1c3RSZXN1bHQKKyAgICAgIGxldCBzdWNjZXNzID0gd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmdHIpIHsgdHJQdHIgLT4gQm9vbCBpbgorICAgICAgICBpZiBTZWNUcnVzdEV2YWx1YXRlKG15VHJ1c3QsIHRyUHRyKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgfQorICAgICAgaWYgIXN1Y2Nlc3MgeyByZXR1cm4gZmFsc2UgfQorICAgIH0KKyAgICBpZiBsYXN0VHJ1c3RSZXN1bHQgPT0gLnByb2NlZWQgfHwgbGFzdFRydXN0UmVzdWx0ID09IC51bnNwZWNpZmllZCB7CisgICAgICAgIHJldHVybiBmYWxzZQorICAgIH0KKworICAgIHByaW50KCJUU1NMU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gcmVjb3ZlciBjZXJ0aWZpY2F0ZSB0cnVzdCBmYWlsdXJlIikKKyAgICByZXR1cm4gdHJ1ZQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpc09wZW4oKSAtPiBCb29sIHsKKyAgICByZXR1cm4gc2QgPiAwCisgIH0KK30KKworZXh0ZW5zaW9uIFRTU0xTb2NrZXRUcmFuc3BvcnQ6IFN0cmVhbURlbGVnYXRlIHsKKyAgcHVibGljIGZ1bmMgc3RyZWFtKF8gYVN0cmVhbTogU3RyZWFtLCBoYW5kbGUgZXZlbnRDb2RlOiBTdHJlYW0uRXZlbnQpIHsKKyAgICAKKyAgICBzd2l0Y2ggZXZlbnRDb2RlIHsKKyAgICBjYXNlIFN0cmVhbS5FdmVudCgpOiBicmVhaworICAgIGNhc2UgU3RyZWFtLkV2ZW50Lmhhc0J5dGVzQXZhaWxhYmxlOiBicmVhaworICAgIGNhc2UgU3RyZWFtLkV2ZW50Lm9wZW5Db21wbGV0ZWQ6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuaGFzU3BhY2VBdmFpbGFibGU6CisgICAgICB2YXIgcHJvY2VlZCA9IGZhbHNlCisgICAgICB2YXIgdHJ1c3RSZXN1bHQ6IFNlY1RydXN0UmVzdWx0VHlwZSA9IC5pbnZhbGlkCisKKyAgICAgIHZhciBuZXdQb2xpY2llczogQ0ZNdXRhYmxlQXJyYXk/CisgICAgICAKKyAgICAgIHJlcGVhdCB7CisgICAgICAgIGxldCB0cnVzdDogU2VjVHJ1c3QgPSBhU3RyZWFtLnByb3BlcnR5KGZvcktleTogLlNTTFBlZXJUcnVzdCkgYXMhIFNlY1RydXN0CisgICAgICAgIAorICAgICAgICAvLyBBZGQgbmV3IHBvbGljeSB0byBjdXJyZW50IGxpc3Qgb2YgcG9saWNpZXMKKyAgICAgICAgbGV0IHBvbGljeSA9IFNlY1BvbGljeUNyZWF0ZVNTTChmYWxzZSwgc3NsSG9zdG5hbWUgYXMgQ0ZTdHJpbmc/KQorICAgICAgICB2YXIgcHBvbGljeSA9IHBvbGljeSAvLyBtdXRhYmxlIGZvciBwb2ludGVyCisgICAgICAgIGxldCBwb2xpY2llczogVW5zYWZlTXV0YWJsZVBvaW50ZXI8Q0ZBcnJheT8+PyA9IG5pbAorICAgICAgICBpZiBTZWNUcnVzdENvcHlQb2xpY2llcyh0cnVzdCwgcG9saWNpZXMhKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnBwb2xpY3kpIHsgcHRyIGluCisgICAgICAgICAgbmV3UG9saWNpZXMgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkobmlsLCAwLCBwb2xpY2llcz8ucG9pbnRlZSkKKyAgICAgICAgICBDRkFycmF5QXBwZW5kVmFsdWUobmV3UG9saWNpZXMsIHB0cikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gdXBkYXRlIHRydXN0IHBvbGljaWVzCisgICAgICAgIGlmIFNlY1RydXN0U2V0UG9saWNpZXModHJ1c3QsIG5ld1BvbGljaWVzISkgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRXZhbHVhdGUgdGhlIHRydXN0IGNoYWluCisgICAgICAgIGxldCBzdWNjZXNzID0gd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmdHJ1c3RSZXN1bHQpIHsgdHJ1c3RQdHIgLT4gQm9vbCBpbgorICAgICAgICAgIGlmIFNlY1RydXN0RXZhbHVhdGUodHJ1c3QsIHRydXN0UHRyKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAhc3VjY2VzcyB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCB0cnVzdFJlc3VsdCB7CisgICAgICAgIGNhc2UgLnByb2NlZWQ6ICAgICAgcHJvY2VlZCA9IHRydWUKKyAgICAgICAgY2FzZSAudW5zcGVjaWZpZWQ6ICBwcm9jZWVkID0gdHJ1ZQorICAgICAgICBjYXNlIC5yZWNvdmVyYWJsZVRydXN0RmFpbHVyZToKKyAgICAgICAgICBwcm9jZWVkID0gc2VsZi5yZWNvdmVyRnJvbVRydXN0RmFpbHVyZSh0cnVzdCwgbGFzdFRydXN0UmVzdWx0OiB0cnVzdFJlc3VsdCkKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSAuZGVueTogICAgICAgICBicmVhaworICAgICAgICBjYXNlIC5mYXRhbFRydXN0RmFpbHVyZTogYnJlYWsKKyAgICAgICAgY2FzZSAub3RoZXJFcnJvcjogICBicmVhaworICAgICAgICBjYXNlIC5pbnZhbGlkOiAgICAgIGJyZWFrCisgICAgICAgIGRlZmF1bHQ6IGJyZWFrCisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgZmFsc2UKKyAgCisgICAgICBpZiAhcHJvY2VlZCB7CisgICAgICAgIHByaW50KCJUU1NMU29ja2V0VHJhbnNwb3J0OiBDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuICBSZXN1bHQ6IFwodHJ1c3RSZXN1bHQpIikKKyAgICAgICAgYVN0cmVhbS5jbG9zZSgpCisgICAgICB9CisgICAgICAKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5lcnJvck9jY3VycmVkOiBicmVhaworICAgIGNhc2UgU3RyZWFtLkV2ZW50LmVuZEVuY291bnRlcmVkOiBicmVhaworICAgIGRlZmF1bHQ6IGJyZWFrCisgICAgfQorICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGExNjJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsNDggQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3B1YmxpYyBzdHJ1Y3QgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yOiBURXJyb3IgeworICBwdWJsaWMgZW51bSBFcnJvckNvZGU6IFRFcnJvckNvZGUgeworICAgIGNhc2UgaG9zdGFuYW1lUmVzb2x1dGlvbihob3N0bmFtZTogU3RyaW5nKQorICAgIGNhc2Ugc29ja2V0Q3JlYXRlKHBvcnQ6IEludCkKKyAgICBjYXNlIGNvbm5lY3QKKyAgCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5ob3N0YW5hbWVSZXNvbHV0aW9uOiAgcmV0dXJuIC0xMDAwMAorICAgICAgY2FzZSAuc29ja2V0Q3JlYXRlOiAgICAgICAgIHJldHVybiAtMTAwMDEKKyAgICAgIGNhc2UgLmNvbm5lY3Q6ICAgICAgICAgICAgICByZXR1cm4gLTEwMDAyCisgICAgICB9CisgICAgfQorICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaG9zdGFuYW1lUmVzb2x1dGlvbihsZXQgaG9zdG5hbWUpOiAgcmV0dXJuICJGYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZTogXChob3N0bmFtZSkiCisgICAgICBjYXNlIC5zb2NrZXRDcmVhdGUobGV0IHBvcnQpOiAgICAgICAgICAgICByZXR1cm4gIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IG9uIHBvcnQ6IFwocG9ydCkiCisgICAgICBjYXNlIC5jb25uZWN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbm5lY3QgZXJyb3IiCisgICAgICB9CisgICAgfQorICAKKyAgfQorICBwdWJsaWMgdmFyIGVycm9yOiBFcnJvckNvZGUgPSAuY29ubmVjdAorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8KKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IEVycm9yQ29kZSB7IHJldHVybiAuY29ubmVjdCB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXJpYWxpemFibGUuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1MDk2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXJpYWxpemFibGUuc3dpZnQKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFNlcmlhbGl6YWJsZSB7CisgIHZhciBoYXNoVmFsdWU6IEludCB7IGdldCB9CisKKyAgLy8vIFRUeXBlIGZvciBpbnN0YW5jZQorICBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgZ2V0IH0KKworICAvLy8gUmVhZCBUU2VyaWFsaXphYmxlIGluc3RhbmNlIGZyb20gUHJvdG9jb2wKKyAgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTZWxmCisKKyAgLy8vIFdyaXRlIFRTZXJpYWxpemFibGUgaW5zdGFuY2UgdG8gUHJvdG9jb2wKKyAgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MKKworfQorCitleHRlbnNpb24gVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTZWxmLCB0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSB2YWx1ZS53cml0ZSh0bzogcHJvdG8pCisgIH0KKworICAvLy8gY29udmVuaWVuY2UgZm9yIG1lbWJlciBhY2Nlc3MKKyAgcHVibGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiBTZWxmLnRocmlmdFR5cGUgfQorfQorCitwdWJsaWMgZnVuYyA9PTxUPihsaHM6IFQsIHJoczogVCkgLT4gQm9vbCB3aGVyZSBUIDogVFNlcmlhbGl6YWJsZSB7CisgIHJldHVybiBsaHMuaGFzaFZhbHVlID09IHJocy5oYXNoVmFsdWUKK30KKworLy8vIERlZmF1bHQgcmVhZC93cml0ZSBmb3IgcHJpbWl0YXZlIFRocmlmdCB0eXBlczoKKy8vLyBCb29sLCBJbnQ4IChieXRlKSwgSW50MTYsIEludDMyLCBJbnQ2NCwgRG91YmxlLCBTdHJpbmcKKworZXh0ZW5zaW9uIEJvb2wgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmJvb2wgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBJbnQ4IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pOCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50OCB7CisgICAgcmV0dXJuIEludDgodHJ5IHByb3RvLnJlYWQoKSBhcyBVSW50OCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKFVJbnQ4KHNlbGYpKQorICB9Cit9CisKK2V4dGVuc2lvbiBJbnQxNiA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTE2IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQxNiB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDMyIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMzIgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCisKK2V4dGVuc2lvbiBJbnQ2NCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTY0IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIERvdWJsZSA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuZG91YmxlIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBEb3VibGUgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBTdHJpbmcgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cmluZyB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjZDE3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXQuc3dpZnQKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHN0cnVjdCBUU2V0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlICYgSGFzaGFibGU+IDogU2V0QWxnZWJyYSwgSGFzaGFibGUsIENvbGxlY3Rpb24sIEV4cHJlc3NpYmxlQnlBcnJheUxpdGVyYWwsIFRTZXJpYWxpemFibGUgeworICAvLy8gVHlwZWFsaWFzIGZvciBTdG9yYWdlIHR5cGUKKyAgcHVibGljIHR5cGVhbGlhcyBTdG9yYWdlID0gU2V0PEVsZW1lbnQ+CisgIAorICAKKyAgLy8vIEludGVybmFsIFN0b3JhZ2UgdXNlZCBmb3IgVFNldCAoU2V0XDxFbGVtZW50XD4pCisgIGludGVybmFsIHZhciBzdG9yYWdlIDogU3RvcmFnZQorICAKKyAgCisgIC8vLyBNYXJrOiBDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleERpc3RhbmNlID0gU3RvcmFnZS5JbmRleERpc3RhbmNlCisgIHB1YmxpYyB0eXBlYWxpYXMgU3ViU2VxdWVuY2UgPSBTdG9yYWdlLlN1YlNlcXVlbmNlCisgIAorICAKKyAgcHVibGljIHZhciBpbmRpY2VzOiBJbmRpY2VzIHsgcmV0dXJuIHN0b3JhZ2UuaW5kaWNlcyB9CisgIAorICAvLyBNdXN0IGltcGxlbWVudCBpc0VtcHR5IGV2ZW4gdGhvdWdoIGJvdGggU2V0QWxnZWJyYSBhbmQgQ29sbGVjdGlvbiBwcm92aWRlIGl0IGR1ZSB0byB0aGVpciBjb25mbGNpdGluZyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucworICBwdWJsaWMgdmFyIGlzRW1wdHk6IEJvb2wgeyByZXR1cm4gc3RvcmFnZS5pc0VtcHR5IH0KKyAgCisgIHB1YmxpYyBmdW5jIGRpc3RhbmNlKGZyb20gc3RhcnQ6IEluZGV4LCB0byBlbmQ6IEluZGV4KSAtPiBJbmRleERpc3RhbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kaXN0YW5jZShmcm9tOiBzdGFydCwgdG86IGVuZCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlLCBsaW1pdGVkQnkgbGltaXQ6IEluZGV4KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuLCBsaW1pdGVkQnk6IGxpbWl0KQorICB9CisgIAorICAjaWYgc3dpZnQoPj0zLjIpCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBTdG9yYWdlLkluZGV4KSAtPiBFbGVtZW50IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgI2Vsc2UKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQ/IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAjZW5kaWYKKyAgCisgIC8vLyBNYXJrOiBTZXRBbGdlYnJhCisgIGludGVybmFsIGluaXQoc3RvcmFnZTogU2V0PEVsZW1lbnQ+KSB7CisgICAgc2VsZi5zdG9yYWdlID0gc3RvcmFnZQorICB9CisgIAorICBwdWJsaWMgZnVuYyBjb250YWlucyhfIG1lbWJlcjogRWxlbWVudCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuY29udGFpbnMobWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnNlcnQoXyBuZXdNZW1iZXI6IEVsZW1lbnQpIC0+IChpbnNlcnRlZDogQm9vbCwgbWVtYmVyQWZ0ZXJJbnNlcnQ6IEVsZW1lbnQpIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbnNlcnQobmV3TWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmUoXyBtZW1iZXI6IEVsZW1lbnQpIC0+IEVsZW1lbnQ/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmUobWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB1bmlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLnVuaW9uKG90aGVyLnN0b3JhZ2UpKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBmb3JtSW50ZXJzZWN0aW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIHsKKyAgICByZXR1cm4gc3RvcmFnZS5mb3JtSW50ZXJzZWN0aW9uKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1TeW1tZXRyaWNEaWZmZXJlbmNlKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIHsKKyAgICByZXR1cm4gc3RvcmFnZS5mb3JtU3ltbWV0cmljRGlmZmVyZW5jZShvdGhlci5zdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBmb3JtVW5pb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1VbmlvbihvdGhlci5zdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbnRlcnNlY3Rpb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZTogc3RvcmFnZS5pbnRlcnNlY3Rpb24ob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHN5bW1ldHJpY0RpZmZlcmVuY2UoXyBvdGhlcjogVFNldDxFbGVtZW50PikgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZTogc3RvcmFnZS5zeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyLnN0b3JhZ2UpKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyB1cGRhdGUod2l0aCBuZXdNZW1iZXI6IEVsZW1lbnQpIC0+IEVsZW1lbnQ/IHsKKyAgICByZXR1cm4gc3RvcmFnZS51cGRhdGUod2l0aDogbmV3TWVtYmVyKQorICB9CisgIAorICAvLy8gTWFyazogSW5kZXhhYmxlQmFzZQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4OiBJbmRleCB7IHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXggfQorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgcHVibGljIGZ1bmMgaW5kZXgoYWZ0ZXIgaTogSW5kZXgpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChhZnRlcjogaSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChhZnRlciBpOiBpbm91dCBTdG9yYWdlLkluZGV4KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYWZ0ZXI6ICZpKQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KGJvdW5kczogUmFuZ2U8SW5kZXg+KSAtPiBTdWJTZXF1ZW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2VbYm91bmRzXQorICB9CisKKyAgCisgIC8vLyBNYXJrOiBIYXNoYWJsZQorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciBlbGVtZW50IGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIE1hcms6IFRTZXJpYWxpemFibGUKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5zZXQgfQorICAKKyAgcHVibGljIGluaXQoKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIAorICBwdWJsaWMgaW5pdDxTb3VyY2UgOiBTZXF1ZW5jZT4oXyBzZXF1ZW5jZTogU291cmNlKSB3aGVyZSBTb3VyY2UuSXRlcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50IHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShzZXF1ZW5jZSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVFNldCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZFNldEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiBlbGVtZW50VHlwZSkpCisgICAgfQorICAgIHZhciBzZXQgPSBUU2V0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBzZXQuc3RvcmFnZS5pbnNlcnQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRTZXRFbmQoKQorICAgIHJldHVybiBzZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgZWxlbWVudCBpbiBzZWxmLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGUoZWxlbWVudCwgdG86IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVTZXRFbmQoKQorICB9Cit9CisKK2V4dGVuc2lvbiBUU2V0OiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVFNldDxFbGVtZW50PiwgcmhzOiBUU2V0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFNlcnZlci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjI0ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFNlcnZlci5zd2lmdApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmIG9zKE9TWCkgfHwgb3MoaU9TKSB8fCBvcyh3YXRjaE9TKSB8fCBvcyh0dk9TKQorICBpbXBvcnQgRGFyd2luCisjZWxzZWlmIG9zKExpbnV4KSB8fCBvcyhGcmVlQlNEKSB8fCBvcyhQUzQpIHx8IG9zKEFuZHJvaWQpCisgIGltcG9ydCBHbGliYworICBpbXBvcnQgRGlzcGF0Y2gKKyNlbmRpZgorCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCA9ICJUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkIgorcHVibGljIGxldCBUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5ID0gIlRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3IiCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJUcmFuc3BvcnRLZXkgPSAiVFNvY2tldFNlcnZlclRyYW5zcG9ydCIKKworY2xhc3MgVFNvY2tldFNlcnZlcjxJblByb3RvY29sOiBUUHJvdG9jb2wsIE91dFByb3RvY29sOiBUUHJvdG9jb2wsIFByb2Nlc3NvcjogVFByb2Nlc3NvciwgU2VydmljZT4gd2hlcmUgUHJvY2Vzc29yLlNlcnZpY2UgPT0gU2VydmljZSB7CisgIHZhciBzb2NrZXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlCisgIHZhciBwcm9jZXNzaW5nUXVldWUgPSAgRGlzcGF0Y2hRdWV1ZShsYWJlbDogIlRTb2NrZXRTZXJ2ZXIucHJvY2Vzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxb3M6IC5iYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogLmNvbmN1cnJlbnQpCisgIHZhciBzZXJ2aWNlSGFuZGxlcjogU2VydmljZQorCisgIHB1YmxpYyBpbml0KHBvcnQ6IEludCwKKyAgICAgICAgICAgICAgc2VydmljZTogU2VydmljZSwKKyAgICAgICAgICAgICAgaW5Qcm90b2NvbDogSW5Qcm90b2NvbC5UeXBlLAorICAgICAgICAgICAgICBvdXRQcm90b2NvbDogT3V0UHJvdG9jb2wuVHlwZSwKKyAgICAgICAgICAgICAgcHJvY2Vzc29yOiBQcm9jZXNzb3IuVHlwZSkgdGhyb3dzIHsKKyAgICAvLyBzZXQgc2VydmljZSBoYW5kbGVyCisgICAgc2VsZi5zZXJ2aWNlSGFuZGxlciA9IHNlcnZpY2UKKworICAgIC8vIGNyZWF0ZSBhIHNvY2tldAorICAgIHZhciBmZDogSW50MzIgPSAtMQorICAgICNpZiBvcyhMaW51eCkKKyAgICAgIGxldCBzb2NrID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgSW50MzIoU09DS19TVFJFQU0ucmF3VmFsdWUpLCBJbnQzMihJUFBST1RPX1RDUCksIDAsIG5pbCwgbmlsKQorICAgICNlbHNlCisgICAgICBsZXQgc29jayA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgMCwgbmlsLCBuaWwpCisgICAgI2VuZGlmCisgICAgaWYgc29jayAhPSBuaWwgeworICAgICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrLCBDRlNvY2tldEdldFNvY2tldEZsYWdzKHNvY2spICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKQorCisgICAgICBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2spCisgICAgICB2YXIgeWVzID0gMQorICAgICAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBVSW50MzIoTWVtb3J5TGF5b3V0PEludD4uc2l6ZSkpCisKKyAgICAgICNpZiBvcyhMaW51eCkKKyAgICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fcG9ydDogaW5fcG9ydF90KHBvcnQuYmlnRW5kaWFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkcjogaW5fYWRkcihzX2FkZHI6IGluX2FkZHJfdCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgICNlbHNlCisgICAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2xlbjogVUludDgoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fcG9ydDogaW5fcG9ydF90KHBvcnQuYmlnRW5kaWFuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkcjogaW5fYWRkcihzX2FkZHI6IGluX2FkZHJfdCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgICNlbmRpZgorCisgICAgICBsZXQgcHRyID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZhZGRyKSB7CisgICAgICAgIHJldHVybiBVbnNhZmVQb2ludGVyPFVJbnQ4PihPcGFxdWVQb2ludGVyKCQwKSkKKyAgICAgIH0KKworICAgICAgbGV0IGFkZHJlc3MgPSBEYXRhKGJ5dGVzOiBwdHIsIGNvdW50OiBNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpCisKKyAgICAgIGxldCBjZmFkZHIgPSBhZGRyZXNzLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICAgIENGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAkMCwgYWRkcmVzcy5jb3VudCwgbmlsKQorICAgICAgfQorICAgICAgaWYgQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2ssIGNmYWRkcikgIT0gQ0ZTb2NrZXRFcnJvci5zdWNjZXNzIHsgLy9rQ0ZTb2NrZXRTdWNjZXNzIHsKKyAgICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2spCisgICAgICAgIHByaW50KCJUU29ja2V0U2VydmVyOiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIikKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbiwgbWVzc2FnZTogIkNvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKQorICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50KCJUU29ja2V0U2VydmVyOiBObyBzZXJ2ZXIgc29ja2V0IikKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJDb3VsZCBub3QgY3JlYXRlIHNvY2tldCIpCisgICAgfQorCisgICAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAorICAgIHNvY2tldEZpbGVIYW5kbGUgPSBGaWxlSGFuZGxlKGZpbGVEZXNjcmlwdG9yOiBmZCwgY2xvc2VPbkRlYWxsb2M6IHRydWUpCisKKyAgICAvLyB0aHJvdyBhd2F5IG91ciBzb2NrZXQKKyAgICBDRlNvY2tldEludmFsaWRhdGUoc29jaykKKworICAgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCisgICAgXyA9IE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0LmFkZE9ic2VydmVyKGZvck5hbWU6IC5OU0ZpbGVIYW5kbGVDb25uZWN0aW9uQWNjZXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogbmlsLCBxdWV1ZTogbmlsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2VhayBzZWxmXSBub3RpZmljYXRpb24gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkIGxldCBzdHJvbmdTZWxmID0gc2VsZiBlbHNlIHsgcmV0dXJuIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZ1NlbGYuY29ubmVjdGlvbkFjY2VwdGVkKHN0cm9uZ1NlbGYuc29ja2V0RmlsZUhhbmRsZSkKKworICAgIH0KKworICAgIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgorICAgIHNvY2tldEZpbGVIYW5kbGUuYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeSgpCisKKyAgICBwcmludCgiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIFRDUCBwb3J0IFwocG9ydCkiKQorICB9CisKKyAgZGVpbml0IHsKKyAgICBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdC5yZW1vdmVPYnNlcnZlcihzZWxmKQorICB9CisKKyAgZnVuYyBjb25uZWN0aW9uQWNjZXB0ZWQoXyBzb2NrZXQ6IEZpbGVIYW5kbGUpIHsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgY2xpZW50IGNvbm5lY3RlZCwgaGFuZGxlIHRoZSByZXF1ZXN0IG9uIHF1ZXVlCisgICAgcHJvY2Vzc2luZ1F1ZXVlLmFzeW5jIHsKKyAgICAgIHNlbGYuaGFuZGxlQ2xpZW50Q29ubmVjdGlvbihzb2NrZXQpCisgICAgfQorICB9CisKKyAgZnVuYyBoYW5kbGVDbGllbnRDb25uZWN0aW9uKF8gY2xpZW50U29ja2V0OiBGaWxlSGFuZGxlKSB7CisKKyAgICBsZXQgdHJhbnNwb3J0ID0gVEZpbGVIYW5kbGVUcmFuc3BvcnQoZmlsZUhhbmRsZTogY2xpZW50U29ja2V0KQorICAgIGxldCBwcm9jZXNzb3IgPSBQcm9jZXNzb3Ioc2VydmljZTogc2VydmljZUhhbmRsZXIpCisKKyAgICBsZXQgaW5Qcm90b2NvbCA9IEluUHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICBsZXQgb3V0UHJvdG9jb2wgPSBPdXRQcm90b2NvbChvbjogdHJhbnNwb3J0KQorCisgICAgZG8geworICAgICAgdHJ5IHByb2Nlc3Nvci5wcm9jZXNzKG9uOiBpblByb3RvY29sLCBvdXRQcm90b2NvbDogb3V0UHJvdG9jb2wpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgcHJpbnQoIkVycm9yIHByb2Nlc3NpZ24gcmVxdWVzdDogXChlcnJvcikiKQorICAgIH0KKyAgICBEaXNwYXRjaFF1ZXVlLm1haW4uYXN5bmMgeworICAgICAgTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQKKyAgICAgICAgLnBvc3QobmFtZTogTm90aWZpY2F0aW9uLk5hbWUocmF3VmFsdWU6IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQpLAorICAgICAgICAgICAgICBvYmplY3Q6IHNlbGYsCisgICAgICAgICAgICAgIHVzZXJJbmZvOiBbVFNvY2tldFNlcnZlclByb2Nlc3NvcktleTogcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRTb2NrZXRTZXJ2ZXJUcmFuc3BvcnRLZXk6IHRyYW5zcG9ydF0pCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE2ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDIxMCBAQAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmIG9zKE9TWCkgfHwgb3MoaU9TKSB8fCBvcyh3YXRjaE9TKSB8fCBvcyh0dk9TKQorICBpbXBvcnQgRGFyd2luCisjZWxzZWlmIG9zKExpbnV4KSB8fCBvcyhGcmVlQlNEKSB8fCBvcyhQUzQpIHx8IG9zKEFuZHJvaWQpCisgIGltcG9ydCBHbGliYworICBpbXBvcnQgRGlzcGF0Y2gKKyNlbmRpZgorCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKK3ByaXZhdGUgc3RydWN0IFN5cyB7CisgICNpZiBvcyhMaW51eCkKKyAgc3RhdGljIGxldCByZWFkID0gR2xpYmMucmVhZAorICBzdGF0aWMgbGV0IHdyaXRlID0gR2xpYmMud3JpdGUKKyAgc3RhdGljIGxldCBjbG9zZSA9IEdsaWJjLmNsb3NlCisgICNlbHNlCisgIHN0YXRpYyBsZXQgcmVhZCA9IERhcndpbi5yZWFkCisgIHN0YXRpYyBsZXQgd3JpdGUgPSBEYXJ3aW4ud3JpdGUKKyAgc3RhdGljIGxldCBjbG9zZSA9IERhcndpbi5jbG9zZQorICAjZW5kaWYKK30KKworZXh0ZW5zaW9uIGluX2FkZHIgeworICBwdWJsaWMgaW5pdD8oaG9zdGVudDogaG9zdGVudD8pIHsKKyAgICBndWFyZCBsZXQgaG9zdCA9IGhvc3RlbnQsIGhvc3QuaF9hZGRyX2xpc3QgIT0gbmlsLCBob3N0LmhfYWRkcl9saXN0LnBvaW50ZWUgIT0gbmlsIGVsc2UgeworICAgICAgcmV0dXJuIG5pbAorICAgIH0KKyAgICBzZWxmLmluaXQoKQorICAgIG1lbWNweSgmc2VsZiwgaG9zdC5oX2FkZHJfbGlzdC5wb2ludGVlISwgSW50KGhvc3QuaF9sZW5ndGgpKQorICAgIAorICB9Cit9CisKKworI2lmIG9zKExpbnV4KQorICAvLy8gVENGU29ja2V0VHJhbnNwb3J0IGN1cnJlbnRseSB1bmF2YWlsYWJsZQorICAvLy8gcmVtb3ZlIGNvbW1lbnRzIGFuZCBidWlsZCB0byBzZWUgd2h5L2ZpeAorICAvLy8gY3VycmVudGx5IENGW1JlYWR8V3JpdGVdU3RyZWFtJ3MgY2FuJ3QgY2FzdCB0byBbSW5wdXR8T3V0cHV0XVN0cmVhbXMgd2hpY2ggYnJlYWtzIHRoaWducworI2Vsc2UKK2V4dGVuc2lvbiBTdHJlYW0uUHJvcGVydHlLZXkgeworICBzdGF0aWMgbGV0IFNTTFBlZXJUcnVzdCA9IFN0cmVhbS5Qcm9wZXJ0eUtleShrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFBlZXJUcnVzdCBhcyBTdHJpbmcpCit9CisKKy8vLyBUQ0ZTb2NrZXRUcmFuc3BvcnQsIHVzZXMgQ0ZTb2NrZXRzIGFuZCAoTlMpU3RyZWFtJ3MKK3B1YmxpYyBjbGFzcyBUQ0ZTb2NrZXRUcmFuc3BvcnQ6IFRTdHJlYW1UcmFuc3BvcnQgeworICAgIHB1YmxpYyBpbml0Pyhob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBJbnQsIHNlY3VyZTogQm9vbCA9IGZhbHNlKSB7CisgICAgCisgICAgdmFyIGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbQorICAgIHZhciBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbQorICAgIAorICAgIHZhciByZWFkU3RyZWFtOiAgVW5tYW5hZ2VkPENGUmVhZFN0cmVhbT4/CisgICAgdmFyIHdyaXRlU3RyZWFtOiAgVW5tYW5hZ2VkPENGV3JpdGVTdHJlYW0+PworICAgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lIGFzIENGU3RyaW5nISwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMihwb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlU3RyZWFtKQorICAgIAorICAgIGlmIGxldCByZWFkU3RyZWFtID0gcmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgIGxldCB3cml0ZVN0cmVhbSA9IHdyaXRlU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpIHsKKyAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgCisgICAgICAgIGlmIHNlY3VyZSB7CisgICAgICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCAuc29ja2V0U2VjdXJpdHlMZXZlbCwgU3RyZWFtU29ja2V0U2VjdXJpdHlMZXZlbC5uZWdvdGlhdGVkU1NMLnJhd1ZhbHVlIGFzIENGU3RyaW5nKQorICAgICAgICAgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCAuc29ja2V0U2VjdXJpdHlMZXZlbCwgU3RyZWFtU29ja2V0U2VjdXJpdHlMZXZlbC5uZWdvdGlhdGVkU1NMLnJhd1ZhbHVlIGFzIENGU3RyaW5nKQorICAgICAgICB9CisKKyAgICAgIGlucHV0U3RyZWFtID0gcmVhZFN0cmVhbSBhcyBJbnB1dFN0cmVhbQorICAgICAgaW5wdXRTdHJlYW0uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgaW5wdXRTdHJlYW0ub3BlbigpCisgICAgICAKKyAgICAgIG91dHB1dFN0cmVhbSA9IHdyaXRlU3RyZWFtIGFzIE91dHB1dFN0cmVhbQorICAgICAgb3V0cHV0U3RyZWFtLnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIG91dHB1dFN0cmVhbS5vcGVuKCkKKyAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICAKKyAgICAgIGlmIHJlYWRTdHJlYW0gIT0gbmlsIHsKKyAgICAgICAgcmVhZFN0cmVhbT8ucmVsZWFzZSgpCisgICAgICB9CisgICAgICBpZiB3cml0ZVN0cmVhbSAhPSBuaWwgeworICAgICAgICB3cml0ZVN0cmVhbT8ucmVsZWFzZSgpCisgICAgICB9CisgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKQorICAgICAgcmV0dXJuIG5pbAorICAgIH0KKyAgICAKKyAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgCisgICAgc2VsZi5pbnB1dD8uZGVsZWdhdGUgPSBzZWxmCisgICAgc2VsZi5vdXRwdXQ/LmRlbGVnYXRlID0gc2VsZgorICB9Cit9CisKK2V4dGVuc2lvbiBUQ0ZTb2NrZXRUcmFuc3BvcnQ6IFN0cmVhbURlbGVnYXRlIHsgfQorI2VuZGlmCisKKworLy8vIFRTb2NrZXRUcmFuc3BvcnQsIHBvc2l4IHNvY2tldHMuICBTdXBwb3J0cyBJUHY0IG9ubHkgZm9yIG5vdworcHVibGljIGNsYXNzIFRTb2NrZXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0IHsKKyAgcHVibGljIHZhciBzb2NrZXREZXNjcmlwdG9yOiBJbnQzMgorICAKKyAgCisgIAorICAvLy8gSW5pdGlhbGl6ZSBmcm9tIGFuIGFscmVhZHkgc2V0IHVwIHNvY2tldERlc2NyaXB0b3IuCisgIC8vLyBFeHBlY3RzIHNvY2tldCB0aGF0cyBhbHJlYWR5IGJvdW5kL2Nvbm5lY3RlZCAoaS5lLiBmcm9tIGxpc3RlbmluZykKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBzb2NrZXREZXNjcmlwdG9yOiBwb3NpeCBzb2NrZXQgZGVzY3JpcHRvciAoSW50MzIpCisgIHB1YmxpYyBpbml0KHNvY2tldERlc2NyaXB0b3I6IEludDMyKSB7CisgICAgc2VsZi5zb2NrZXREZXNjcmlwdG9yID0gc29ja2V0RGVzY3JpcHRvcgorICB9CisgIAorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoaG9zdG5hbWU6IFN0cmluZywgcG9ydDogSW50KSB0aHJvd3MgeworICAgIGd1YXJkIGxldCBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUuY1N0cmluZyh1c2luZzogLnV0ZjgpISk/LnBvaW50ZWUsCisgICAgICBsZXQgaG9zdEFkZHIgPSBpbl9hZGRyKGhvc3RlbnQ6IGhwKSBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93biwgbWVzc2FnZTogIkludmFsaWQgYWRkcmVzczogXChob3N0bmFtZSkiKQorICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAjaWYgb3MoTGludXgpCisgICAgICBsZXQgc29jayA9IHNvY2tldChBRl9JTkVULCBJbnQzMihTT0NLX1NUUkVBTS5yYXdWYWx1ZSksIDApCisgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fcG9ydDogaW5fcG9ydF90KGh0b25zKFVJbnQxNihwb3J0KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkcjogaG9zdEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgI2Vsc2UKKyAgICAgIGxldCBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKQorICAgICAgCisgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9sZW46IFVJbnQ4KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fcG9ydDogaW5fcG9ydF90KGh0b25zKFVJbnQxNihwb3J0KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkcjogaW5fYWRkcihzX2FkZHI6IGluX2FkZHJfdCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAKKyAgICAjZW5kaWYKKyAgICAKKyAgICBsZXQgYWRkclB0ciA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYWRkcil7IFVuc2FmZVBvaW50ZXI8c29ja2FkZHI+KE9wYXF1ZVBvaW50ZXIoJDApKSB9CisgICAgCisgICAgbGV0IGNvbm5lY3RlZCA9IGNvbm5lY3Qoc29jaywgYWRkclB0ciwgVUludDMyKE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkpCisgICAgaWYgY29ubmVjdGVkICE9IDAgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbiwgbWVzc2FnZTogIkVycm9yIGJpbmRpbmcgdG8gaG9zdDogXChob3N0bmFtZSkgXChwb3J0KSIpCisgICAgfQorICAgIAorICAgIHNlbGYuaW5pdChzb2NrZXREZXNjcmlwdG9yOiBzb2NrKQorICB9CisgIAorICBkZWluaXQgeworICAgIGNsb3NlKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgb3V0ID0gRGF0YSgpCisgICAgd2hpbGUgb3V0LmNvdW50IDwgc2l6ZSB7CisgICAgICBvdXQuYXBwZW5kKHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSkpCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgYnVmZiA9IEFycmF5PFVJbnQ4Pi5pbml0KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUpCisgICAgbGV0IHJlYWRCeXRlcyA9IFN5cy5yZWFkKHNvY2tldERlc2NyaXB0b3IsICZidWZmLCBzaXplKQorICAgIAorICAgIHJldHVybiBEYXRhKGJ5dGVzOiBidWZmWzAuLjxyZWFkQnl0ZXNdKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB7CisgICAgdmFyIGJ5dGVzVG9Xcml0ZSA9IGRhdGEuY291bnQKKyAgICB2YXIgd3JpdGVCdWZmZXIgPSBkYXRhCisgICAgd2hpbGUgYnl0ZXNUb1dyaXRlID4gMCB7CisgICAgICBsZXQgd3JpdHRlbiA9IHdyaXRlQnVmZmVyLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICAgIFN5cy53cml0ZShzb2NrZXREZXNjcmlwdG9yLCAkMCwgd3JpdGVCdWZmZXIuY291bnQpCisgICAgICB9CisgICAgICB3cml0ZUJ1ZmZlciA9IHdyaXRlQnVmZmVyLnN1YmRhdGEoaW46IHdyaXR0ZW4gLi48IHdyaXRlQnVmZmVyLmNvdW50KQorICAgICAgYnl0ZXNUb1dyaXRlIC09IHdyaXR0ZW4KKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNsb3NlKCkgeworICAgIHNodXRkb3duKHNvY2tldERlc2NyaXB0b3IsIEludDMyKFNIVVRfUkRXUikpCisgICAgXyA9IFN5cy5jbG9zZShzb2NrZXREZXNjcmlwdG9yKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cmVhbVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJjMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cmVhbVRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKKyAgLy8vIEN1cnJlbnRseSB1bmF2YWlsYWJsZSBpbiBMaW51eAorICAvLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBidWlsZCB0byBmaXgKKyAgLy8vIEN1cnJlbnRseSBrQ29uc3RhbnRzIGZvciBDRlNvY2tldHMgZG9uJ3QgZXhpc3QgaW4gbGludXggYW5kIG5vdCBhbGwgaGF2ZSBiZWVuIG1vdmVkCisgIC8vLyB0byBwcm9wZXJ0eSBzdHJ1Y3RzIHlldAorI2Vsc2UKKyAgLy8gTXVzdCBpbmhlcml0IE5TT2JqZWN0IGZvciBOU1N0cmVhbURlbGVnYXRlIGNvbmZvcm1hbmNlCisgIHB1YmxpYyBjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IDogTlNPYmplY3QsIFRUcmFuc3BvcnQgeworICAgIHB1YmxpYyB2YXIgaW5wdXQ6IElucHV0U3RyZWFtPyA9IG5pbAorICAgIHB1YmxpYyB2YXIgb3V0cHV0OiBPdXRwdXRTdHJlYW0/ID0gbmlsCisgICAgCisgICAgcHVibGljIGluaXQoaW5wdXRTdHJlYW06IElucHV0U3RyZWFtPywgb3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0/KSB7CisgICAgICBpbnB1dCAgID0gaW5wdXRTdHJlYW0KKyAgICAgIG91dHB1dCAgPSBvdXRwdXRTdHJlYW0KKyAgICB9CisgICAgCisgICAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoaW5wdXRTdHJlYW06IElucHV0U3RyZWFtPykgeworICAgICAgc2VsZi5pbml0KGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtOiBuaWwpCisgICAgfQorICAgIAorICAgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPykgeworICAgICAgc2VsZi5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogb3V0cHV0U3RyZWFtKQorICAgIH0KKyAgICAKKyAgICBkZWluaXQgeworICAgICAgY2xvc2UoKQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgICAgZ3VhcmQgbGV0IGlucHV0ID0gaW5wdXQgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgICB9CisgICAgICAKKyAgICAgIHZhciByZWFkID0gRGF0YSgpCisgICAgICB3aGlsZSByZWFkLmNvdW50IDwgc2l6ZSB7CisgICAgICAgIHZhciBidWZmZXIgPSBBcnJheTxVSW50OD4ocmVwZWF0aW5nOiAwLCBjb3VudDogc2l6ZSAtIHJlYWQuY291bnQpCisgICAgICAgIAorICAgICAgICBsZXQgYnl0ZXNSZWFkID0gYnVmZmVyLndpdGhVbnNhZmVNdXRhYmxlQnVmZmVyUG9pbnRlciB7IGJ1ZmZlclB0ciBpbgorICAgICAgICAgIHJldHVybiBpbnB1dC5yZWFkKGJ1ZmZlclB0ci5iYXNlQWRkcmVzcyEsIG1heExlbmd0aDogc2l6ZSAtIHJlYWQuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzUmVhZCA8PSAwIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgICAgICB9CisgICAgICAgIHJlYWQuYXBwZW5kKERhdGEoYnl0ZXM6IGJ1ZmZlcikpCisgICAgICB9CisgICAgICByZXR1cm4gcmVhZAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgICAgZ3VhcmQgbGV0IGlucHV0ID0gaW5wdXQgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgICB9CisgICAgICAKKyAgICAgIHZhciByZWFkID0gRGF0YSgpCisgICAgICB3aGlsZSByZWFkLmNvdW50IDwgc2l6ZSB7CisgICAgICAgIHZhciBidWZmZXIgPSBBcnJheTxVSW50OD4ocmVwZWF0aW5nOiAwLCBjb3VudDogc2l6ZSAtIHJlYWQuY291bnQpCisgICAgICAgIGxldCBieXRlc1JlYWQgPSBidWZmZXIud2l0aFVuc2FmZU11dGFibGVCdWZmZXJQb2ludGVyIHsKKyAgICAgICAgICBpbnB1dC5yZWFkKCQwLmJhc2VBZGRyZXNzISwgbWF4TGVuZ3RoOiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNSZWFkIDw9IDAgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJlYWQuYXBwZW5kKERhdGEoYnl0ZXM6IGJ1ZmZlcikpCisgICAgICB9CisgICAgICByZXR1cm4gcmVhZAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgICAgZ3VhcmQgbGV0IG91dHB1dCA9IG91dHB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIGJ5dGVzV3JpdHRlbiA9IDAKKyAgICAgIHdoaWxlIGJ5dGVzV3JpdHRlbiA8IGRhdGEuY291bnQgeworICAgICAgICBieXRlc1dyaXR0ZW4gPSBkYXRhLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICAgICAgcmV0dXJuIG91dHB1dC53cml0ZSgkMCwgbWF4TGVuZ3RoOiBkYXRhLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1dyaXR0ZW4gPT0gLTEgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgICAgIH0gZWxzZSBpZiBieXRlc1dyaXR0ZW4gPT0gMCB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyBjbG9zZSgpIHsKKyAgICAgIAorICAgICAgaWYgaW5wdXQgIT0gbmlsIHsKKyAgICAgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IGlucHV0c3RyZWFtCisgICAgICAgIGlmIGxldCBjZjogQ0ZSZWFkU3RyZWFtID0gaW5wdXQgeworICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KGNmLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnB1dD8uZGVsZWdhdGUgPSBuaWwKKyAgICAgICAgaW5wdXQ/LmNsb3NlKCkKKyAgICAgICAgaW5wdXQ/LnJlbW92ZShmcm9tOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgICAgaW5wdXQgPSBuaWwKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgb3V0cHV0ICE9IG5pbCB7CisgICAgICAgIC8vIENsb3NlIGFuZCByZXNldCBvdXRwdXQgc3RyZWFtCisgICAgICAgIGlmIGxldCBjZjogQ0ZXcml0ZVN0cmVhbSA9IG91dHB1dCB7CisgICAgICAgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KGNmLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgICB9CisgICAgICAgIG91dHB1dD8uZGVsZWdhdGUgPSBuaWwKKyAgICAgICAgb3V0cHV0Py5jbG9zZSgpCisgICAgICAgIG91dHB1dD8ucmVtb3ZlKGZyb206IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgICBvdXRwdXQgPSBuaWwKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJ1Y3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MmEzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJ1Y3Quc3dpZnQKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvLy8gUHJvdG9jb2wgZm9yIEdlbmVyYXRlZCBTdHJ1Y3RzIHRvIGNvbmZvcm0gdG8KKy8vLyBEaWN0aW9uYXJ5IG1hcHMgZmllbGQgbmFtZXMgdG8gaW50ZXJuYWwgSURzIGFuZCB1c2VzIFJlZmxlY3Rpb24KKy8vLyB0byBpdGVyYXRlIHRocm91Z2ggYWxsIGZpZWxkcy4gIAorLy8vIGB3cml0ZUZpZWxkVmFsdWUoXzpuYW1lOnR5cGU6aWQ6KWAgY2FsbHMgYFRTZXJpYWxpemFibGUud3JpdGUodG86KWAgaW50ZXJuYWxseQorLy8vIGdpdmluZyBhIG5pY2UgcmVjdXJzaXZlIGJlaGF2aW9yIGZvciBuZXN0ZWQgVFN0cnVjdHMsIFRMaXN0cywgVE1hcHMsIGFuZCBUU2V0cworcHVibGljIHByb3RvY29sIFRTdHJ1Y3QgOiBUU2VyaWFsaXphYmxlIHsKKyAgc3RhdGljIHZhciBmaWVsZElkczogW1N0cmluZzogSW50MzJdIHsgZ2V0IH0KKyAgc3RhdGljIHZhciBzdHJ1Y3ROYW1lOiBTdHJpbmcgeyBnZXQgfQorfQorCitwdWJsaWMgZXh0ZW5zaW9uIFRTdHJ1Y3QgeworICBwdWJsaWMgc3RhdGljIHZhciBmaWVsZElkczogW1N0cmluZzogKGlkOiBJbnQzMiwgdHlwZTogVFR5cGUpXSB7IHJldHVybiBbOl0gfQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RydWN0IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgLy8gV3JpdGUgc3RydWN0IG5hbWUgZmlyc3QKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTZWxmLnN0cnVjdE5hbWUpCisgICAgCisgICAgdHJ5IHNlbGYuZm9yRWFjaCB7IG5hbWUsIHZhbHVlLCBpZCBpbgorICAgICAgLy8gV3JpdGUgdG8gcHJvdG9jb2wKKyAgICAgIHRyeSBwcm90by53cml0ZUZpZWxkVmFsdWUodmFsdWUsIG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLnRocmlmdFR5cGUsIGlkOiBpZCkKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgc2VsZi5mb3JFYWNoIHsgXywgdmFsdWUsIF8gaW4KKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyAodmFsdWUuaGFzaFZhbHVlKQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBQcm92aWRlcyBhIGJsb2NrIGZvciBoYW5kbGluZyBlYWNoIChhdmFpbGFibGUpIHRocmlmdCBwcm9wZXJ0eSB1c2luZyByZWZsZWN0aW9uCisgIC8vLyBDYXZlYXQ6IFNraXBzIG92ZXIgb3B0aW9uYWwgdmFsdWVzCisgIAorICAKKyAgLy8vIFByb3ZpZGVzIGEgYmxvY2sgZm9yIGhhbmRsaW5nIGVhY2ggKGF2YWlsYWJsZSkgdGhyaWZ0IHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24KKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBibG9jazogYmxvY2sgZm9yIGhhbmRsaW5nIHByb3BlcnR5CisgIC8vLworICAvLy8gLSB0aHJvd3M6IHJldGhyb3dzIGFueSBFcnJvciB0aHJvd24gaW4gYmxvY2sKKyAgcHJpdmF0ZSBmdW5jIGZvckVhY2goXyBibG9jazogKF8gbmFtZTogU3RyaW5nLCBfIHZhbHVlOiBUU2VyaWFsaXphYmxlLCBfIGlkOiBJbnQzMikgdGhyb3dzIC0+IFZvaWQpIHJldGhyb3dzIHsKKyAgICAvLyBNaXJyb3IgdGhlIG9iamVjdCwgZ2V0dGluZyAobmFtZTogU3RyaW5nPywgdmFsdWU6IEFueSkgZm9yIGV2ZXJ5IHByb3BlcnR5CisgICAgbGV0IG1pcnJvciA9IE1pcnJvcihyZWZsZWN0aW5nOiBzZWxmKQorICAgIAorICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgY2hpbGRyZW4sIGlnbm9yZSBlbXB0eSBwcm9wZXJ0eSBuYW1lcworICAgIGZvciAocHJvcE5hbWUsIHByb3BWYWx1ZSkgaW4gbWlycm9yLmNoaWxkcmVuIHsKKyAgICAgIGd1YXJkIGxldCBwcm9wTmFtZSA9IHByb3BOYW1lIGVsc2UgeyBjb250aW51ZSB9CisKKyAgICAgIGlmIGxldCB0dmFsID0gdW53cmFwKGFueTogcHJvcFZhbHVlKSBhcz8gVFNlcmlhbGl6YWJsZSwgbGV0IGlkID0gU2VsZi5maWVsZElkc1twcm9wTmFtZV0geworICAgICAgICB0cnkgYmxvY2socHJvcE5hbWUsIHR2YWwsIGlkKQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgCisgIC8vLyBBbnkgY2FuIG15c3RlcmlvdXNseSBiZSBhbiBPcHRpb25hbDxBbnk+IGF0IHRoZSBzYW1lIHRpbWUsCisgIC8vLyB0aGlzIGNoZWNrcyBhbmQgYWx3YXlzIHJldHVybnMgT3B0aW9uYWw8QW55PiB3aXRob3V0IGRvdWJsZSB3cmFwcGluZworICAvLy8gd2UgdGhlbiB0cnkgdG8gYmluZCB2YWx1ZSBhcyBUU2VyaWFsaXphYmxlIHRvIGlnbm9yZSBhbnkgZXh0ZW5zaW9uIHByb3BlcnRpZXMKKyAgLy8vIGFuZCB0aGUgbGlrZSBhbmQgdmVyaWZ5IHRoZSBwcm9wZXJ0eSBleGlzdHMgYW5kIGdyYWIgdGhlIFRocmlmdAorICAvLy8gcHJvcGVydHkgSUQgYXQgdGhlIHNhbWUgdGltZQorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGFueTogQW55IGluc3RhbmNlIHRvIGF0dGVtcHQgdG8gdW53cmFwCisgIC8vLworICAvLy8gLSByZXR1cm5zOiBVbndyYXBwZWQgQW55IGFzIE9wdGlvbmFsPEFueT4KKyAgcHJpdmF0ZSBmdW5jIHVud3JhcChhbnk6IEFueSkgLT4gQW55PyB7CisgICAgbGV0IG1pID0gTWlycm9yKHJlZmxlY3Rpbmc6IGFueSkKKyAgICAKKyAgICBpZiBtaS5kaXNwbGF5U3R5bGUgIT0gLm9wdGlvbmFsIHsgcmV0dXJuIGFueSB9CisgICAgaWYgbWkuY2hpbGRyZW4uY291bnQgPT0gMCB7IHJldHVybiBuaWwgfQorICAgIAorICAgIGxldCAoXywgc29tZSkgPSBtaS5jaGlsZHJlbi5maXJzdCEKKyAgICByZXR1cm4gc29tZQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmJiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsNjQgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBwcm90b2NvbCBUVHJhbnNwb3J0IHsKKyAgCisgIC8vIFJlcXVpcmVkCisgIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhCisgIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzCisgIGZ1bmMgZmx1c2goKSB0aHJvd3MKKworICAvLyBPcHRpb25hbCAoZGVmYXVsdCBwcm92aWRlZCkKKyAgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEKKyAgZnVuYyBpc09wZW4oKSB0aHJvd3MgLT4gQm9vbAorICBmdW5jIG9wZW4oKSB0aHJvd3MKKyAgZnVuYyBjbG9zZSgpIHRocm93cworfQorCitwdWJsaWMgZXh0ZW5zaW9uIFRUcmFuc3BvcnQgeworICBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sIHsgcmV0dXJuIHRydWUgfQorICBmdW5jIG9wZW4oKSB0aHJvd3MgeyB9CisgIGZ1bmMgY2xvc2UoKSB0aHJvd3MgeyB9CisgIAorICBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB2YXIgaGF2ZSA9IDAKKyAgICB3aGlsZSBoYXZlIDwgc2l6ZSB7CisgICAgICBsZXQgY2h1bmsgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUgLSBoYXZlKQorICAgICAgaGF2ZSArPSBjaHVuay5jb3VudAorICAgICAgYnVmZi5hcHBlbmQoY2h1bmspCisgICAgICBpZiBjaHVuay5jb3VudCA9PSAwIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuZW5kT2ZGaWxlKQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnVmZgorICB9Cit9CisKK3B1YmxpYyBwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnQgOiBUVHJhbnNwb3J0IHsKKyAgLy8gRmFjdG9yeQorICBmdW5jIGZsdXNoKF8gY29tcGxldGlvbjogQGVzY2FwaW5nIChUQXN5bmNUcmFuc3BvcnQsIEVycm9yPykgLT4oKSkKK30KKworcHVibGljIHByb3RvY29sIFRBc3luY1RyYW5zcG9ydEZhY3RvcnkgeworICBhc3NvY2lhdGVkdHlwZSBUcmFuc3BvcnQgOiBUQXN5bmNUcmFuc3BvcnQKKyAgZnVuYyBuZXdUcmFuc3BvcnQoKSAtPiBUcmFuc3BvcnQKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnRFcnJvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnRFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQwMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsODYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3B1YmxpYyBzdHJ1Y3QgVFRyYW5zcG9ydEVycm9yOiBURXJyb3IgeworICBwdWJsaWMgZW51bSBFcnJvckNvZGU6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2Ugbm90T3BlbgorICAgIGNhc2UgYWxyZWFkeU9wZW4KKyAgICBjYXNlIHRpbWVkT3V0CisgICAgY2FzZSBlbmRPZkZpbGUKKyAgICBjYXNlIG5lZ2F0aXZlU2l6ZQorICAgIGNhc2Ugc2l6ZUxpbWl0KGxpbWl0OiBJbnQsIGdvdDogSW50KQorICAgIAorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICByZXR1cm4gMAorICAgICAgY2FzZSAubm90T3BlbjogICAgICByZXR1cm4gMQorICAgICAgY2FzZSAuYWxyZWFkeU9wZW46ICByZXR1cm4gMgorICAgICAgY2FzZSAudGltZWRPdXQ6ICAgICByZXR1cm4gMworICAgICAgY2FzZSAuZW5kT2ZGaWxlOiAgICByZXR1cm4gNAorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiByZXR1cm4gNQorICAgICAgY2FzZSAuc2l6ZUxpbWl0OiAgICByZXR1cm4gNgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICByZXR1cm4gIlVua25vd24gVFRyYW5zcG9ydEVycm9yIgorICAgICAgY2FzZSAubm90T3BlbjogICAgICByZXR1cm4gIk5vdCBPcGVuIgorICAgICAgY2FzZSAuYWxyZWFkeU9wZW46ICByZXR1cm4gIkFscmVhZHkgT3BlbiIKKyAgICAgIGNhc2UgLnRpbWVkT3V0OiAgICAgcmV0dXJuICJUaW1lZCBPdXQiCisgICAgICBjYXNlIC5lbmRPZkZpbGU6ICAgIHJldHVybiAiRW5kIE9mIEZpbGUiCisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6IHJldHVybiAiTmVnYXRpdmUgU2l6ZSIKKyAgICAgIGNhc2UgLnNpemVMaW1pdChsZXQgbGltaXQsIGxldCBnb3QpOgorICAgICAgICByZXR1cm4gIk1lc3NhZ2UgZXhjZWVkcyBzaXplIGxpbWl0IG9mIFwobGltaXQpIChyZWNlaXZlZDogXChnb3QpIgorICAgICAgfQorICAgIH0KKyAgfQorICBwdWJsaWMgdmFyIGVycm9yOiBFcnJvckNvZGUgPSAudW5rbm93bgorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IEVycm9yQ29kZSB7IHJldHVybiAudW5rbm93biB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsgfQorCit9CisKKy8vLyBUSFRUUFRyYW5zcG9ydEVycm9yCisvLy8KKy8vLyBFcnJvcidzIHRocm93biBvbiBIVFRQIFRyYW5zcG9ydAorcHVibGljIHN0cnVjdCBUSFRUUFRyYW5zcG9ydEVycm9yOiBURXJyb3IgeworICBwdWJsaWMgZW51bSBFcnJvckNvZGU6IFRFcnJvckNvZGUgeworICAgIGNhc2UgaW52YWxpZFJlc3BvbnNlCisgICAgY2FzZSBpbnZhbGlkU3RhdHVzKHN0YXR1c0NvZGU6IEludCkKKyAgICBjYXNlIGF1dGhlbnRpY2F0aW9uCisgICAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmludmFsaWRSZXNwb25zZTogICAgICAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIEhUVFAgUmVzcG9uc2UiCisgICAgICBjYXNlIC5pbnZhbGlkU3RhdHVzKGxldCBzdGF0dXNDb2RlKTogIHJldHVybiAiSW52YWxpZCBIVFRQIFN0YXR1cyBDb2RlIChcKHN0YXR1c0NvZGUpKSIKKyAgICAgIGNhc2UgLmF1dGhlbnRpY2F0aW9uOiAgICAgICAgICAgICAgICAgcmV0dXJuICJBdXRoZW50aWNhdGlvbiBFcnJvciIKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7IHJldHVybiAwIH0KKyAgfQorICBwdWJsaWMgdmFyIGVycm9yOiBFcnJvckNvZGUgPSAuaW52YWxpZFJlc3BvbnNlCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC5pbnZhbGlkUmVzcG9uc2UgfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RXcmFwcGVkUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NTc3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RXcmFwcGVkUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwyMDggQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uIC8vIEZvciAoTlMpRGF0YQorCisKKy8vLyBHZW5lcmljIHByb3RvY29sLCBpbXBsZW1lbnRlcyBUUHJvdG9jb2wgYW5kIHdyYXBzIGEgY29uY3JldGUgcHJvdG9jb2wuCisvLy8gVXNlZnVsIGZvciBnZW5lcmljYWxseSBzdWJjbGFzc2luZyBwcm90b2NvbHMgdG8gb3ZlcnJpZGUgc3BlY2lmaWMgbWV0aG9kcyAKKy8vLyAoaS5lLiBUTXVsdGlwbGV4ZWRQcm90b2NvbCkKK29wZW4gY2xhc3MgVFdyYXBwZWRQcm90b2NvbDxQcm90b2NvbDogVFByb3RvY29sPiA6IFRQcm90b2NvbCB7CisgIHZhciBjb25jcmV0ZVByb3RvY29sOiBQcm90b2NvbAorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC50cmFuc3BvcnQKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIGNvbmNyZXRlUHJvdG9jb2wudHJhbnNwb3J0ID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKworICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLmNvbmNyZXRlUHJvdG9jb2wgPSBQcm90b2NvbChvbjogdHJhbnNwb3J0KQorICB9CisgIAorICAvLyBSZWFkIG1ldGhvZHMKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTWFwQmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTWFwRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFNldEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFNldEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDggeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNiB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIC8vIFdyaXRlIG1ldGhvZHMKKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogbmFtZSwgdHlwZTogbWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBuYW1lKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIGZpZWxkVHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiBmaWVsZFR5cGUsIGZpZWxkSUQ6IGZpZWxkSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEJlZ2luKGtleVR5cGU6IGtleVR5cGUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEVuZCgpCisgIH0KKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZShkYXRhKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UaHJpZnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UaHJpZnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMTc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdApAQCAtMCwwICsxLDMgQEAKK2NsYXNzIFRocmlmdCB7CisJbGV0IHZlcnNpb24gPSAiMS4xLjAiCit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhmZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdApAQCAtMCwwICsxLDggQEAKK2ltcG9ydCBYQ1Rlc3QKK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0VGVzdHMKKworWENUTWFpbihbCisgICAgIHRlc3RDYXNlKFRocmlmdFRlc3RzLmFsbFRlc3RzKSwKKyAgICAgdGVzdENhc2UoVEJpbmFyeVByb3RvY29sVGVzdHMuYWxsVGVzdHMpLAorICAgICB0ZXN0Q2FzZShUQ29tcGFjdFByb3RvY29sVGVzdHMuYWxsVGVzdHMpLAorXSkKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE1NTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMTY4IEBACisvLworLy8gIFRCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0CisvLyAgVGhyaWZ0CisvLworLy8gIENyZWF0ZWQgYnkgQ2hyaXN0b3BoZXIgU2ltcHNvbiBvbiA4LzE4LzE2LgorLy8KKy8vCisKK2ltcG9ydCBYQ1Rlc3QKK2ltcG9ydCBGb3VuZGF0aW9uCitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCisKKy8vLyBUZXN0aW5nIEJpbmFyeSBwcm90b2NvbCByZWFkL3dyaXRlIGFnYWluc3QgaXRzZWxmCisvLy8gVXNlcyBzZXBhcmF0ZSByZWFkL3dyaXRlIHRyYW5zcG9ydC9wcm90b2NvbHMgCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xUZXN0czogWENUZXN0Q2FzZSB7CisgIHZhciB0cmFuc3BvcnQ6IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeworICAgICQwLnJlc2V0KHJlYWRCdWZmZXI6ICQxKQorICB9KQorICAKKyAgdmFyIHByb3RvOiBUQmluYXJ5UHJvdG9jb2whCisgIAorICBvdmVycmlkZSBmdW5jIHNldFVwKCkgeworICAgIHN1cGVyLnNldFVwKCkKKyAgICBwcm90byA9IFRCaW5hcnlQcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIG92ZXJyaWRlIGZ1bmMgdGVhckRvd24oKSB7CisgICAgc3VwZXIudGVhckRvd24oKQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDhXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBVSW50OCA9IDI1MAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFVJbnQ4ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFVJbnQ4LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MTZXcml0ZVJlYWQoKSB7CisKKyAgICBsZXQgd3JpdGVWYWw6IEludDE2ID0gMTIzMTIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKyAgICBsZXQgcmVhZFZhbDogSW50MTYgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MTYsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDMyID0gMjAyOTIzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDMyID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDMyLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50NjRXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQ2NCA9IDIzNDIzNDk4MTM3NDEzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDY0ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDY0LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RG91YmxlV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRG91YmxlID0gMy4xNDE1OTI2CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRG91YmxlID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwLjAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRG91YmxlLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0Qm9vbFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEJvb2wgPSB0cnVlCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogQm9vbCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gZmFsc2UKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggQm9vbCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cmluZ1dyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFN0cmluZyA9ICJIZWxsbyBXb3JsZCIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBTdHJpbmchCisgICAgZG8geworICAgICAgcmVhZFZhbCA9IHRyeSBwcm90by5yZWFkKCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiRXJyb3IgcmVhZGluZyBcKGVycm9yKSIpCisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFN0cmluZywgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERhdGFXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEYXRhID0gIkRhdGEgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEYXRhID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAiR29vZGJ5ZSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEYXRhLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RydWN0V3JpdGVSZWFkKCkgeworICAgIGxldCBtc2cgPSAiVGVzdCBQcm90b2NvbCBFcnJvciIKKyAgICBsZXQgd3JpdGVWYWwgPSBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLnByb3RvY29sRXJyb3IsIG1lc3NhZ2U6IG1zZykKKyAgICBkbyB7CisgICAgICB0cnkgd3JpdGVWYWwud3JpdGUodG86IHByb3RvKQorICAgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHdyaXRlIFwoZXJyb3IpIikKKyAgICB9CisgICAgCisgICAgZG8geworICAgICAgbGV0IHJlYWRWYWwgPSB0cnkgVEFwcGxpY2F0aW9uRXJyb3IucmVhZChmcm9tOiBwcm90bykKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCB3cml0ZVZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsICJFcnJvciBjYXNlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwuZXJyb3IpIGdvdCBcKHdyaXRlVmFsLmVycm9yKSIpCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLm1lc3NhZ2UsIHdyaXRlVmFsLm1lc3NhZ2UsICJFcnJvciBtZXNzYWdlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwubWVzc2FnZSkgZ290IFwod3JpdGVWYWwubWVzc2FnZSkiKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byByZWFkIFwoZXJyb3IpIikKKyAgICB9CisgIH0KKyAgZnVuYyB0ZXN0VW5zYWZlQml0Y2FzdFVwZGF0ZSgpIHsKKyAgICBsZXQgdmFsdWU6IERvdWJsZSA9IDMuMTQxNTkKKyAgICBsZXQgdmFsOiBJbnQ2NCA9IDMxNDE1OTI2CisgICAgbGV0IHV2YWw6IFVJbnQ2NCA9IDMxNDE1OTI2CisgICAgCisgICAgbGV0IGk2NCA9IEludDY0KGJpdFBhdHRlcm46IHZhbHVlLmJpdFBhdHRlcm4pCisgICAgbGV0IHViYyA9IHVuc2FmZUJpdENhc3QodmFsdWUsIHRvOiBJbnQ2NC5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGk2NCwgdWJjLCAiQml0Y2FzdCBEb3VibGUtPiBpNjQgVmFsdWVzIGRvbid0IG1hdGNoIikKKyAgICAKKyAgICBsZXQgZGJsID0gRG91YmxlKGJpdFBhdHRlcm46IFVJbnQ2NCh2YWwpKQorICAgIGxldCB1YmRiID0gdW5zYWZlQml0Q2FzdCh2YWwsIHRvOiBEb3VibGUuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChkYmwsIHViZGIsICJCaXRjYXN0IGk2NCAtPiBEb3VibGUgVmFsdWVzIGRvbid0IG1hdGNoIikKKyAgICAKKyAgICBsZXQgZGIyID0gRG91YmxlKGJpdFBhdHRlcm46IHV2YWwpCisgICAgbGV0IHVzYmMyID0gdW5zYWZlQml0Q2FzdCh1dmFsLCB0bzogRG91YmxlLnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoZGIyLCB1c2JjMiwgIkJpdGNhc3QgdTY0IC0+IERvdWJsZSBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorCisgICAgCisgIH0KKyAgCisgIHN0YXRpYyB2YXIgYWxsVGVzdHMgOiBbKFN0cmluZywgKFRCaW5hcnlQcm90b2NvbFRlc3RzKSAtPiAoKSB0aHJvd3MgLT4gVm9pZCldIHsKKyAgICByZXR1cm4gWworICAgICAgKCJ0ZXN0SW50OFdyaXRlUmVhZCIsIHRlc3RJbnQ4V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDE2V3JpdGVSZWFkIiwgdGVzdEludDE2V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyV3JpdGVSZWFkIiwgdGVzdEludDMyV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDY0V3JpdGVSZWFkIiwgdGVzdEludDY0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERvdWJsZVdyaXRlUmVhZCIsIHRlc3REb3VibGVXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0Qm9vbFdyaXRlUmVhZCIsIHRlc3RCb29sV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cmluZ1dyaXRlUmVhZCIsIHRlc3RTdHJpbmdXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RGF0YVdyaXRlUmVhZCIsIHRlc3REYXRhV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cnVjdFdyaXRlUmVhZCIsIHRlc3RTdHJ1Y3RXcml0ZVJlYWQpCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJjMjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdApAQCAtMCwwICsxLDIxMCBAQAorLy8KKy8vICBUQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKKy8vICBUaHJpZnQKKy8vCisvLyAgQ3JlYXRlZCBieSBDaHJpc3RvcGhlciBTaW1wc29uIG9uIDgvMTkvMTYuCisvLworLy8KKworaW1wb3J0IFhDVGVzdAoraW1wb3J0IEZvdW5kYXRpb24KK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKKworLy8vIFRlc3RpbmcgQmluYXJ5IHByb3RvY29sIHJlYWQvd3JpdGUgYWdhaW5zdCBpdHNlbGYKKy8vLyBVc2VzIHNlcGFyYXRlIHJlYWQvd3JpdGUgdHJhbnNwb3J0L3Byb3RvY29scworY2xhc3MgVENvbXBhY3RQcm90b2NvbFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgdmFyIHRyYW5zcG9ydDogVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7CisgICAgJDAucmVzZXQocmVhZEJ1ZmZlcjogJDEpCisgIH0pCisgIHZhciBwcm90bzogVENvbXBhY3RQcm90b2NvbCEKKyAgCisgIG92ZXJyaWRlIGZ1bmMgc2V0VXAoKSB7CisgICAgc3VwZXIuc2V0VXAoKQorICAgIHByb3RvID0gVENvbXBhY3RQcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIG92ZXJyaWRlIGZ1bmMgdGVhckRvd24oKSB7CisgICAgc3VwZXIudGVhckRvd24oKQorICAgIHRyYW5zcG9ydC5yZXNldCgpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDhXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBVSW50OCA9IDI1MAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorICAgIGxldCByZWFkVmFsOiBVSW50OCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBVSW50OCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDE2V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MTYgPSAxMjMxMgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDE2ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDE2LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQzMiA9IDIwMjkyMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQzMiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQzMiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDY0V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50NjQgPSAyMzQyMzQ5ODEzNzQxMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQ2NCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQ2NCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERvdWJsZVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERvdWJsZSA9IDMuMTQxNTkyNgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERvdWJsZSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMC4wCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERvdWJsZSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEJvb2xXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBCb29sID0gdHJ1ZQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEJvb2wgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IGZhbHNlCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEJvb2wsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJpbmdXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBTdHJpbmcgPSAiSGVsbG8gV29ybGQiCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogU3RyaW5nIQorICAgIGRvIHsKKyAgICAgIHJlYWRWYWwgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkVycm9yIHJlYWRpbmcgXChlcnJvcikiKQorICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBTdHJpbmcsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REYXRhV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRGF0YSA9ICJEYXRhIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRGF0YSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gIkdvb2RieWUgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRGF0YSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cnVjdFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgbXNnID0gIlRlc3QgUHJvdG9jb2wgRXJyb3IiCisgICAgbGV0IHdyaXRlVmFsID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC5wcm90b2NvbEVycm9yLCBtZXNzYWdlOiBtc2cpCisgICAgZG8geworICAgICAgdHJ5IHdyaXRlVmFsLndyaXRlKHRvOiBwcm90bykKKyAgICAgIHRyeSB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHdyaXRlIFwoZXJyb3IpIikKKyAgICB9CisgICAgCisgICAgZG8geworICAgICAgbGV0IHJlYWRWYWwgPSB0cnkgVEFwcGxpY2F0aW9uRXJyb3IucmVhZChmcm9tOiBwcm90bykKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCB3cml0ZVZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsICJFcnJvciBjYXNlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwuZXJyb3IpIGdvdCBcKHdyaXRlVmFsLmVycm9yKSIpCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLm1lc3NhZ2UsIHdyaXRlVmFsLm1lc3NhZ2UsICJFcnJvciBtZXNzYWdlIG1pc21hdGNoLCBleHBlY3RlZCBcKHJlYWRWYWwubWVzc2FnZSkgZ290IFwod3JpdGVWYWwubWVzc2FnZSkiKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byByZWFkIFwoZXJyb3IpIikKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyWmlnWmFnKCkgeworICAgIGxldCB6ZXJvOiBJbnQzMiA9IDAKKyAgICBsZXQgb25lOiBJbnQzMiA9IDEKKyAgICBsZXQgbk9uZTogSW50MzIgPSAtMQorICAgIGxldCB0d286IEludDMyID0gMgorICAgIGxldCBuVHdvOiBJbnQzMiA9IC0yCisgICAgbGV0IG1heCA9IEludDMyLm1heAorICAgIGxldCBtaW4gPSBJbnQzMi5taW4KKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKHplcm8pLCBVSW50MzIoMCksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMCksIHplcm8sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhuT25lKSwgVUludDMyKDEpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobk9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDEpLCBuT25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobk9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcob25lKSwgVUludDMyKDIpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwob25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMiksIG9uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcoblR3byksIFVJbnQzMigzKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5Ud28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigzKSwgblR3bywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5Ud28pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKHR3byksIFVJbnQzMig0KSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDQpLCB0d28sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh0d28pIikKKworICAgIGxldCB1TWF4TWludXNPbmU6IFVJbnQzMiA9IFVJbnQzMi5tYXggLSAxCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobWF4KSwgdU1heE1pbnVzT25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWF4KSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIodU1heE1pbnVzT25lKSwgbWF4LCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWF4KSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhtaW4pLCBVSW50MzIubWF4LCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWluKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoVUludDMyLm1heCksIG1pbiwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1pbikiKQorICB9CisKKyAgZnVuYyB0ZXN0SW50NjRaaWdaYWcoKSB7CisgICAgbGV0IHplcm86IEludDY0ID0gMAorICAgIGxldCBvbmU6IEludDY0ID0gMQorICAgIGxldCBuT25lOiBJbnQ2NCA9IC0xCisgICAgbGV0IHR3bzogSW50NjQgPSAyCisgICAgbGV0IG5Ud286IEludDY0ID0gLTIKKyAgICBsZXQgbWF4ID0gSW50NjQubWF4CisgICAgbGV0IG1pbiA9IEludDY0Lm1pbgorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcoemVybyksIFVJbnQ2NCgwKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHplcm8pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgwKSwgemVybywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHplcm8pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG5PbmUpLCBVSW50NjQoMSksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuT25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMSksIG5PbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuT25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhvbmUpLCBVSW50NjQoMiksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChvbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgyKSwgb25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwob25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhuVHdvKSwgVUludDY0KDMpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoblR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDMpLCBuVHdvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoblR3bykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcodHdvKSwgVUludDY0KDQpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwodHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoNCksIHR3bywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHR3bykiKQorCisgICAgbGV0IHVNYXhNaW51c09uZTogVUludDY0ID0gVUludDY0Lm1heCAtIDEKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhtYXgpLCB1TWF4TWludXNPbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtYXgpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCh1TWF4TWludXNPbmUpLCBtYXgsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtYXgpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG1pbiksIFVJbnQ2NC5tYXgsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NChVSW50NjQubWF4KSwgbWluLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWluKSIpCisgIH0KKyAgCisgIHN0YXRpYyB2YXIgYWxsVGVzdHMgOiBbKFN0cmluZywgKFRDb21wYWN0UHJvdG9jb2xUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdEludDhXcml0ZVJlYWQiLCB0ZXN0SW50OFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQxNldyaXRlUmVhZCIsIHRlc3RJbnQxNldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMldyaXRlUmVhZCIsIHRlc3RJbnQzMldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQ2NFdyaXRlUmVhZCIsIHRlc3RJbnQ2NFdyaXRlUmVhZCksCisgICAgICAoInRlc3REb3VibGVXcml0ZVJlYWQiLCB0ZXN0RG91YmxlV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEJvb2xXcml0ZVJlYWQiLCB0ZXN0Qm9vbFdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJpbmdXcml0ZVJlYWQiLCB0ZXN0U3RyaW5nV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERhdGFXcml0ZVJlYWQiLCB0ZXN0RGF0YVdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJ1Y3RXcml0ZVJlYWQiLCB0ZXN0U3RydWN0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyWmlnWmFnIiwgdGVzdEludDMyWmlnWmFnKSwKKyAgICAgICgidGVzdEludDY0WmlnWmFnIiwgdGVzdEludDY0WmlnWmFnKQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTYxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IFhDVGVzdAorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworY2xhc3MgVGhyaWZ0VGVzdHM6IFhDVGVzdENhc2UgeworICBmdW5jIHRlc3RWZXJzaW9uKCkgeworICAgIFhDVEFzc2VydEVxdWFsKFRocmlmdCgpLnZlcnNpb24sICIxLjEuMCIpCisgIH0KKworICBmdW5jIHRlc3RfaW5fYWRkcl9leHRlbnNpb24oKSB7CisKKyAgfQorCisgIHN0YXRpYyB2YXIgYWxsVGVzdHMgOiBbKFN0cmluZywgKFRocmlmdFRlc3RzKSAtPiAoKSB0aHJvd3MgLT4gVm9pZCldIHsKKyAgICByZXR1cm4gWworICAgICAgKCJ0ZXN0VmVyc2lvbiIsIHRlc3RWZXJzaW9uKSwKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi90cy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3RzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL3RzL3RocmlmdC5kLnRzIGIvbGliL3RzL3RocmlmdC5kLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTQ2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvdGhyaWZ0LmQudHMKQEAgLTAsMCArMSw2OTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZGVjbGFyZSBtb2R1bGUgVGhyaWZ0IHsKKyAgLyoqCisgICAqIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnkgdmVyc2lvbi4KKyAgICovCisgIHZhciBWZXJzaW9uOiBzdHJpbmc7CisKKyAgLyoqCisgICAqIFRocmlmdCBJREwgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVE9QICAgLSBFbmQgb2YgYSBzZXQgb2YgZmllbGRzLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFZPSUQgICAtIE5vIHZhbHVlIChvbmx5IGxlZ2FsIGZvciByZXR1cm4gdHlwZXMpLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJPT0wgICAtIFRydWUvRmFsc2UgaW50ZWdlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCWVRFICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMDggICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4gICAgIAorICAgKiBAcHJvcGVydHkge251bWJlcn0gIERPVUJMRSAtIDY0IGJpdCBJRUVFIDg1NCBmbG9hdGluZyBwb2ludC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMTYgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTMyICAgIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEk2NCAgICAtIFNpZ25lZCA2NCBiaXQgaW50ZWdlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJJTkcgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEY3ICAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGNyBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU1RSVUNUIC0gQSBtdWx0aWZpZWxkIHR5cGUuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgTUFQICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKG1hcC9hc3NvY2lhdGl2ZS1hcnJheS9kaWN0aW9uYXJ5KS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTRVQgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgTElTVCAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCkuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGOCAgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjggZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjE2ICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEYxNiBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAqLworICBpbnRlcmZhY2UgVHlwZSB7CisgICAgJ1NUT1AnOiBudW1iZXI7CisgICAgJ1ZPSUQnOiBudW1iZXI7CisgICAgJ0JPT0wnOiBudW1iZXI7CisgICAgJ0JZVEUnOiBudW1iZXI7CisgICAgJ0kwOCc6IG51bWJlcjsKKyAgICAnRE9VQkxFJzogbnVtYmVyOworICAgICdJMTYnOiBudW1iZXI7CisgICAgJ0kzMic6IG51bWJlcjsKKyAgICAnSTY0JzogbnVtYmVyOworICAgICdTVFJJTkcnOiBudW1iZXI7CisgICAgJ1VURjcnOiBudW1iZXI7CisgICAgJ1NUUlVDVCc6IG51bWJlcjsKKyAgICAnTUFQJzogbnVtYmVyOworICAgICdTRVQnOiBudW1iZXI7CisgICAgJ0xJU1QnOiBudW1iZXI7CisgICAgJ1VURjgnOiBudW1iZXI7CisgICAgJ1VURjE2JzogbnVtYmVyOworICB9CisgIHZhciBUeXBlOiBUeXBlOworCisgIC8qKgorICAgKiBUaHJpZnQgUlBDIG1lc3NhZ2UgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBDQUxMICAgICAgLSBSUEMgY2FsbCBzZW50IGZyb20gY2xpZW50IHRvIHNlcnZlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBSRVBMWSAgICAgLSBSUEMgY2FsbCBub3JtYWwgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50LgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEVYQ0VQVElPTiAtIFJQQyBjYWxsIGV4Y2VwdGlvbiByZXNwb25zZSBmcm9tIHNlcnZlciB0byBjbGllbnQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgT05FV0FZICAgIC0gT25ld2F5IFJQQyBjYWxsIGZyb20gY2xpZW50IHRvIHNlcnZlciB3aXRoIG5vIHJlc3BvbnNlLgorICAgKi8KKyAgaW50ZXJmYWNlIE1lc3NhZ2VUeXBlIHsKKyAgICAnQ0FMTCc6IG51bWJlcjsKKyAgICAnUkVQTFknOiBudW1iZXI7CisgICAgJ0VYQ0VQVElPTic6IG51bWJlcjsKKyAgICAnT05FV0FZJzogbnVtYmVyOworICB9CisgIHZhciBNZXNzYWdlVHlwZTogTWVzc2FnZVR5cGU7CisKKyAgLyoqCisgICAqIFV0aWxpdHkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3VudCBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy4KKyAgICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIE9iamVjdCB0byB0ZXN0LgorICAgKiBAcmV0dXJucyB7bnVtYmVyfSBudW1iZXIgb2Ygb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMKKyAgICovCisgIGZ1bmN0aW9uIG9iamVjdExlbmd0aChvYmo6IE9iamVjdCk6IG51bWJlcjsKKworICAvKioKKyAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBlc3RhYmxpc2ggcHJvdG90eXBlIGluaGVyaXRhbmNlLgorICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgZGVyaXZlZC4KKyAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgYmFzZS4KKyAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFR5cGUgbmFtZSB0byBzZXQgYXMgbmFtZSBwcm9wZXJ0eSBpbiBkZXJpdmVkIHByb3RvdHlwZS4KKyAgICovCisgIGZ1bmN0aW9uIGluaGVyaXRzKGNvbnN0cnVjdG9yOiBGdW5jdGlvbiwgc3VwZXJDb25zdHJ1Y3RvcjogRnVuY3Rpb24sIG5hbWU/OiBzdHJpbmcpOiB2b2lkOworCisgIC8qKgorICAgKiBURXhjZXB0aW9uIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMgdHlwZXMuCisgICAqLworICBjbGFzcyBURXhjZXB0aW9uIGltcGxlbWVudHMgRXJyb3IgeworICAgIG5hbWU6IHN0cmluZzsKKyAgICBtZXNzYWdlOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRocmlmdCBURXhjZXB0aW9uIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIFRFeGNlcHRpb24gbWVzc2FnZSAoZGlzdGluY3QgZnJvbSB0aGUgRXJyb3IgbWVzc2FnZSkuCisgICAgICovCisgICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc2V0IG9uIHRoZSBleGNlcHRpb24uCisgICAgICogQHJldHVybnMge3N0cmluZ30gZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBnZXRNZXNzYWdlKCk6IHN0cmluZzsKKyAgfQorCisgIC8qKgorICAgKiBUaHJpZnQgQXBwbGljYXRpb24gRXhjZXB0aW9uIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTiAgICAgICAgICAgICAgICAgLSBVbmtub3duL3VuZGVmaW5lZC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOX01FVEhPRCAgICAgICAgICAtIENsaWVudCBhdHRlbXB0ZWQgdG8gY2FsbCBhIG1ldGhvZCB1bmtub3duIHRvIHRoZSBzZXJ2ZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgLSBDbGllbnQgcGFzc2VkIGFuIHVua25vd24vdW5zdXBwb3J0ZWQgTWVzc2FnZVR5cGUuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgLSBVbnVzZWQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgLSBVbnVzZWQgaW4gVGhyaWZ0IFJQQywgdXNlZCB0byBmbGFnIHByb3ByaWV0YXJ5IHNlcXVlbmNlIG51bWJlciBlcnJvcnMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgTUlTU0lOR19SRVNVTFQgICAgICAgICAgLSBSYWlzZWQgYnkgYSBzZXJ2ZXIgcHJvY2Vzc29yIGlmIGEgaGFuZGxlciBmYWlscyB0byBzdXBwbHkgdGhlIHJlcXVpcmVkIHJldHVybiByZXN1bHQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5URVJOQUxfRVJST1IgICAgICAgICAgLSBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFBST1RPQ09MX0VSUk9SICAgICAgICAgIC0gVGhlIHByb3RvY29sIGxheWVyIGZhaWxlZCB0byBzZXJpYWxpemUgb3IgZGVzZXJpYWxpemUgZGF0YS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX1RSQU5TRk9STSAgICAgICAtIFVudXNlZC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX1BST1RPQ09MICAgICAgICAtIFRoZSBwcm90b2NvbCAob3IgdmVyc2lvbikgaXMgbm90IHN1cHBvcnRlZC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSAtIFVudXNlZC4KKyAgICovCisgIGludGVyZmFjZSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHsKKyAgICAnVU5LTk9XTic6IG51bWJlcjsKKyAgICAnVU5LTk9XTl9NRVRIT0QnOiBudW1iZXI7CisgICAgJ0lOVkFMSURfTUVTU0FHRV9UWVBFJzogbnVtYmVyOworICAgICdXUk9OR19NRVRIT0RfTkFNRSc6IG51bWJlcjsKKyAgICAnQkFEX1NFUVVFTkNFX0lEJzogbnVtYmVyOworICAgICdNSVNTSU5HX1JFU1VMVCc6IG51bWJlcjsKKyAgICAnSU5URVJOQUxfRVJST1InOiBudW1iZXI7CisgICAgJ1BST1RPQ09MX0VSUk9SJzogbnVtYmVyOworICAgICdJTlZBTElEX1RSQU5TRk9STSc6IG51bWJlcjsKKyAgICAnSU5WQUxJRF9QUk9UT0NPTCc6IG51bWJlcjsKKyAgICAnVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUnOiBudW1iZXI7CisgIH0KKyAgdmFyIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGU7CisKKyAgLyoqCisgICAqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgdG8gcHJvcGFnYXRlIGV4Y2VwdGlvbnMgZnJvbSBhbiBSUEMgc2VydmVyIGJhY2sgdG8gYSBjYWxsaW5nIGNsaWVudC4KKyAgICovCisgIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworICAgIG1lc3NhZ2U6IHN0cmluZzsKKyAgICBjb2RlOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRocmlmdCBUQXBwbGljYXRpb25FeGNlcHRpb24gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG1lc3NhZ2UgKGRpc3RpbmN0IGZyb20gdGhlIEVycm9yIG1lc3NhZ2UpLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IFtjb2RlXSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGNvZGUuCisgICAgICovCisgICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlPzogbnVtYmVyKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gZnJvbSB0aGUgc3VwcGxpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gVGhlIGlucHV0IHByb3RvY29sIHRvIHJlYWQgZnJvbS4KKyAgICAgKi8KKyAgICByZWFkKGlucHV0OiBPYmplY3QpOiB2b2lkOworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gdG8gdGhlIHN1cHBsaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvdXRwdXQgLSBUaGUgb3V0cHV0IHByb3RvY29sIHRvIHdyaXRlIHRvLgorICAgICAqLworICAgIHdyaXRlKG91dHB1dDogT2JqZWN0KTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBjb2RlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm5zIHtUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZX0gZXhjZXB0aW9uIGNvZGUKKyAgICAgKi8KKyAgICBnZXRDb2RlKCk6IG51bWJlcjsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08gYmV0d2VlbiBSUEMKKyAgICogY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVHJhbnNwb3J0IG9iamVjdCB0eXBlIHVzZXMgSHR0cFtzXS9YSFIgYW5kIGlzCisgICAqIHRoZSBzb2xlIGJyb3dzZXIgYmFzZWQgVGhyaWZ0IHRyYW5zcG9ydC4gVGFyZ2V0IHNlcnZlcnMgbXVzdCBpbXBsZW1lbnQgdGhlIGh0dHBbc10gCisgICAqIHRyYW5zcG9ydCAoc2VlOiBub2RlLmpzIGV4YW1wbGUgc2VydmVyKS4KKyAgICovCisgIGNsYXNzIFRYSFJUcmFuc3BvcnQgeworICAgIHVybDogc3RyaW5nOworICAgIHdwb3M6IG51bWJlcjsKKyAgICBycG9zOiBudW1iZXI7CisgICAgdXNlQ09SUzogYW55OworICAgIHNlbmRfYnVmOiBzdHJpbmc7CisgICAgcmVjdl9idWY6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBYSFIgb3BlcmF0aW9ucyBvbgorICAgICAqIHlvdXIgb3duLiBUaGlzIHR5cGUgY2FuIGFsc28gYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIFRyYW5zcG9ydCBhbGlhcworICAgICAqIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucy4KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3Rvcih1cmw/OiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnJvd3NlciBzcGVjaWZpYyBYbWxIdHRwUmVxdWVzdCBPYmplY3QuCisgICAgICogQHJldHVybnMge29iamVjdH0gdGhlIGJyb3dzZXIgWEhSIGludGVyZmFjZSBvYmplY3QKKyAgICAgKi8KKyAgICBnZXRYbWxIdHRwUmVxdWVzdE9iamVjdCgpOiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBYUkggcmVxdWVzdCBpZiB0aGUgdHJhbnNwb3J0IHdhcyBjcmVhdGVkIHdpdGggYSBVUkwgYW5kCisgICAgICogdGhlIGFzeW5jIHBhcmFtZXRlciBpZiBmYWxzZS4gSWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGNyZWF0ZWQgd2l0aCBhIFVSTAorICAgICAqIG9yIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgVHJ1ZSBvciB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgCisgICAgICogc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCisgICAgICovCisgICAgZmx1c2goYXN5bmM6IGFueSwgY2FsbGJhY2s/OiBGdW5jdGlvbik6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBqUXVlcnkgWEhSIG9iamVjdCB0byBiZSB1c2VkIGZvciBhIFRocmlmdCBzZXJ2ZXIgY2FsbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2xpZW50IC0gVGhlIFRocmlmdCBTZXJ2aWNlIGNsaWVudCBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRoZSBJREwgY29tcGlsZXIuCisgICAgICogQHBhcmFtIHtvYmplY3R9IHBvc3REYXRhIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgc2VydmVyLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGFyZ3MgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZWN2X21ldGhvZCAtIFRoZSBUaHJpZnQgU2VydmljZSBDbGllbnQgcmVjZWl2ZSBtZXRob2QgZm9yIHRoZSBjYWxsLgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEEgbmV3IGpRdWVyeSBYSFIgb2JqZWN0LgorICAgICAqLworICAgIGpxUmVxdWVzdChjbGllbnQ6IE9iamVjdCwgcG9zdERhdGE6IGFueSwgYXJnczogRnVuY3Rpb24sIHJlY3ZfbWV0aG9kOiBGdW5jdGlvbik6IE9iamVjdDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byByZWNlaXZlIHNlcnZlciByZXNwb25zZXMuCisgICAgICovCisgICAgc2V0UmVjdkJ1ZmZlcihidWY6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBpbiBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQKKyAgICAgKiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIHRydWUuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyBUcnVlLgorICAgICAqLworICAgIGlzT3BlbigpOiBib29sZWFuOworCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCBpbiBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQKKyAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9wLgorICAgICAqLworICAgIG9wZW4oKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIGluIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdAorICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgYSBub3AuCisgICAgICovCisgICAgY2xvc2UoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkKGxlbjogbnVtYmVyKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsKCk6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlKGJ1Zjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBnZXRTZW5kQnVmZmVyKCk6IHN0cmluZzsKKyAgfQorCisgIC8qKgorICAgKiBPbGQgYWxpYXMgb2YgdGhlIFRYSFJUcmFuc3BvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgKi8KKyAgY2xhc3MgVHJhbnNwb3J0IGV4dGVuZHMgVFhIUlRyYW5zcG9ydCB7IH0KKworICAvKioKKyAgICogVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PIAorICAgKiBiZXR3ZWVuIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUV2ViU29ja2V0VHJhbnNwb3J0IG9iamVjdCAKKyAgICogdXNlcyB0aGUgV2ViU29ja2V0IHByb3RvY29sLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCBXZWJTb2NrZXQuCisgICAqLworICBjbGFzcyBUV2ViU29ja2V0VHJhbnNwb3J0IHsKKyAgICB1cmw6IHN0cmluZzsgICAgICAgICAgIC8vV2hlcmUgdG8gY29ubmVjdAorICAgIHNvY2tldDogYW55OyAgICAgICAgICAgLy9UaGUgd2ViIHNvY2tldAorICAgIGNhbGxiYWNrczogRnVuY3Rpb25bXTsgLy9QZW5kaW5nIGNhbGxiYWNrcworICAgIHNlbmRfcGVuZGluZzogYW55W107ICAgLy9CdWZmZXJzL0NhbGxiYWNrIHBhaXJzIHdhaXRpbmcgdG8gYmUgc2VudAorICAgIHNlbmRfYnVmOiBzdHJpbmc7ICAgICAgLy9PdXRib3VuZCBkYXRhLCBpbW11dGFibGUgdW50aWwgc2VudAorICAgIHJlY3ZfYnVmOiBzdHJpbmc7ICAgICAgLy9JbmJvdW5kIGRhdGEKKyAgICByYl93cG9zOiBudW1iZXI7ICAgICAgIC8vTmV0d29yayB3cml0ZSBwb3NpdGlvbiBpbiByZWNlaXZlIGJ1ZmZlcgorICAgIHJiX3Jwb3M6IG51bWJlcjsgICAgICAgLy9DbGllbnQgcmVhZCBwb3NpdGlvbiBpbiByZWNlaXZlIGJ1ZmZlcgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nIH0gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpOworCisgICAgX19yZXNldCh1cmw6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYyAKKyAgICAgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCAoV1MgZmx1c2ggaXMgYWx3YXlzIGFzeW5jKSBhbmQgdGhlIGNhbGxiYWNrIAorICAgICAqIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNsaWVudCBjb21wbGV0aW9uIGNhbGxiYWNrLgorICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nICh1bmRlZmluZWQpIAorICAgICAqLworICAgIGZsdXNoKGFzeW5jOiBhbnksIGNhbGxiYWNrOiBGdW5jdGlvbik6IHN0cmluZzsKKworICAgIF9fb25PcGVuKCk6IHZvaWQ7CisKKyAgICBfX29uQ2xvc2UoKTogdm9pZDsKKworICAgIF9fb25NZXNzYWdlKCk6IHZvaWQ7CisKKyAgICBfX29uRXJyb3IoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byByZWNlaXZlIHNlcnZlciByZXNwb25zZXMuCisgICAgICovCisgICAgc2V0UmVjdkJ1ZmZlcihidWY6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgICAgICogQHJldHVybnMge2Jvb2xlYW59IAorICAgICAqLworICAgIGlzT3BlbigpOiBib29sZWFuOworCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgICAgICovCisgICAgb3BlbigpOiB2b2lkOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIGNsb3NlKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAgICAgKiBidWZmZXIuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbiAtIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXR1cm4uCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZChsZW46IG51bWJlcik6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGlyZSByZXNwb25zZSBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZEFsbCgpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKi8KKyAgICB3cml0ZShidWY6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgICAgICovCisgICAgZ2V0U2VuZEJ1ZmZlcigpOiBzdHJpbmc7CisgIH0KKworICAvKioKKyAgICogQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MgCisgICAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiAKKyAgICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KKyAgICovCisgIGNsYXNzIFRKU09OUHJvdG9jb2wgeworICAgIHRyYW5zcG9ydDogT2JqZWN0OworCisgICAgLyoqCisgICAgICogVGhyaWZ0IElETCB0eXBlIElkIHRvIHN0cmluZyBtYXBwaW5nLgorICAgICAqIFRoZSBtYXBwaW5nIHRhYmxlIGxvb2tzIGFzIGZvbGxvd3M6CisgICAgICogVGhyaWZ0LlR5cGUuQk9PTCAgIC0+ICJ0ZiI6IFRydWUvRmFsc2UgaW50ZWdlci4KKyAgICAgKiBUaHJpZnQuVHlwZS5CWVRFICAgLT4gImk4IjogU2lnbmVkIDggYml0IGludGVnZXIuCisgICAgICogVGhyaWZ0LlR5cGUuSTE2ICAgIC0+ICJpMTYiOiBTaWduZWQgMTYgYml0IGludGVnZXIuCisgICAgICogVGhyaWZ0LlR5cGUuSTMyICAgIC0+ICJpMzIiOiBTaWduZWQgMzIgYml0IGludGVnZXIuCisgICAgICogVGhyaWZ0LlR5cGUuSTY0ICAgIC0+ICJpNjQiOiBTaWduZWQgNjQgYml0IGludGVnZXIuCisgICAgICogVGhyaWZ0LlR5cGUuRE9VQkxFIC0+ICJkYmwiOiA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCisgICAgICogVGhyaWZ0LlR5cGUuU1RSVUNUIC0+ICJyZWMiOiBBIG11bHRpZmllbGQgdHlwZS4KKyAgICAgKiBUaHJpZnQuVHlwZS5TVFJJTkcgLT4gInN0ciI6IEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLgorICAgICAqIFRocmlmdC5UeXBlLk1BUCAgICAtPiAibWFwIjogQSBjb2xsZWN0aW9uIHR5cGUgKG1hcC9hc3NvY2lhdGl2ZS1hcnJheS9kaWN0aW9uYXJ5KS4KKyAgICAgKiBUaHJpZnQuVHlwZS5MSVNUICAgLT4gImxzdCI6IEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQpLgorICAgICAqIFRocmlmdC5UeXBlLlNFVCAgICAtPiAic2V0IjogQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCBhbmQgd2l0aG91dCByZXBlYXRlZCB2YWx1ZXMpLgorICAgICAqLworICAgIFR5cGU6IHsgW2s6IG51bWJlcl06IHN0cmluZyB9OworCisgICAgLyoqCisgICAgICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgICAqIFRoZSBtYXBwaW5nIHRhYmxlIGxvb2tzIGFzIGZvbGxvd3M6CisgICAgICogInRmIiAgLT4gVGhyaWZ0LlR5cGUuQk9PTCAgCisgICAgICogImk4IiAgLT4gVGhyaWZ0LlR5cGUuQllURSAgCisgICAgICogImkxNiIgLT4gVGhyaWZ0LlR5cGUuSTE2ICAgCisgICAgICogImkzMiIgLT4gVGhyaWZ0LlR5cGUuSTMyICAgCisgICAgICogImk2NCIgLT4gVGhyaWZ0LlR5cGUuSTY0ICAgCisgICAgICogImRibCIgLT4gVGhyaWZ0LlR5cGUuRE9VQkxFCisgICAgICogInJlYyIgLT4gVGhyaWZ0LlR5cGUuU1RSVUNUCisgICAgICogInN0ciIgLT4gVGhyaWZ0LlR5cGUuU1RSSU5HCisgICAgICogIm1hcCIgLT4gVGhyaWZ0LlR5cGUuTUFQICAgCisgICAgICogImxzdCIgLT4gVGhyaWZ0LlR5cGUuTElTVCAgCisgICAgICogInNldCIgLT4gVGhyaWZ0LlR5cGUuU0VUICAgCisgICAgICovCisgICAgUlR5cGU6IHsgW2s6IHN0cmluZ106IG51bWJlciB9OworCisgICAgLyoqCisgICAgICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgICAgICovCisgICAgVmVyc2lvbjogbnVtYmVyOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UcmFuc3BvcnR9IHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgICAgICovCisgICAgY29uc3RydWN0b3IodHJhbnNwb3J0OiBPYmplY3QpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBnZXRUcmFuc3BvcnQoKTogT2JqZWN0OworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHtUaHJpZnQuTWVzc2FnZVR5cGV9IG1lc3NhZ2VUeXBlIC0gVGhlIHR5cGUgb2YgbWV0aG9kIGNhbGwuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IHN0cmluZywgbWVzc2FnZVR5cGU6IG51bWJlciwgc2VxaWQ6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgICAgICovCisgICAgd3JpdGVNZXNzYWdlRW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0QmVnaW4obmFtZT86IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVTdHJ1Y3RFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5Qcm90b2NvbC5UeXBlfSBmaWVsZFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICAqLworICAgIHdyaXRlRmllbGRCZWdpbihuYW1lOiBzdHJpbmcsIGZpZWxkVHlwZTogbnVtYmVyLCBmaWVsZElkOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgZmllbGQuCisgICAgICovCisgICAgd3JpdGVGaWVsZEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgZmllbGRzIGZvciBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkU3RvcCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0ga2V5VHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSB2YWxUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcCAoaWdub3JlZCkuCisgICAgICovCisgICAgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBudW1iZXIsIHZhbFR5cGU6IG51bWJlciwgc2l6ZT86IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgICovCisgICAgd3JpdGVNYXBFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RCZWdpbihlbGVtVHlwZTogbnVtYmVyLCBzaXplOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlU2V0QmVnaW4oZWxlbVR5cGU6IG51bWJlciwgc2l6ZTogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHNldC4KKyAgICAgKi8KKyAgICB3cml0ZVNldEVuZCgpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBib29sZWFuICovCisgICAgd3JpdGVCb29sKHZhbHVlOiBib29sZWFuKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVCeXRlKGk4OiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkxNihpMTY6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTMyKGkzMjogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVJNjQoaTY0OiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZURvdWJsZShkYmw6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworICAgIHdyaXRlU3RyaW5nKHN0cjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCisgICAgd3JpdGVCaW5hcnkoc3RyOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuTWVzc2FnZVR5cGV9IG10eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSBjYWxsLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgorICAgICAqLworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuIAorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkTWVzc2FnZUJlZ2luKCk6IHsgZm5hbWU6IHN0cmluZzsgbXR5cGU6IG51bWJlcjsgcnNlcWlkOiBudW1iZXIgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1lc3NhZ2UuICovCisgICAgcmVhZE1lc3NhZ2VFbmQoKTogdm9pZDsKKworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4gCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpLgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5LgorICAgICAqLworICAgIHJlYWRTdHJ1Y3RCZWdpbihuYW1lPzogc3RyaW5nKTogeyBmbmFtZTogc3RyaW5nIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuICovCisgICAgcmVhZFN0cnVjdEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIChhbHdheXMgJycpLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQuIAorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZEZpZWxkQmVnaW4oKTogeyBmbmFtZTogc3RyaW5nOyBmdHlwZTogbnVtYmVyOyBmaWQ6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgZmllbGQuICovCisgICAgcmVhZEZpZWxkRW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZE1hcEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0ga3R5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gdnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcC4KKyAgICAgKi8KKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuIAorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1hcEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNYXBCZWdpbigpOiB7IGt0eXBlOiBudW1iZXI7IHZ0eXBlOiBudW1iZXI7IHNpemU6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLiAqLworICAgIHJlYWRNYXBFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkQ29sQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBldHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuIAorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRMaXN0QmVnaW4oKTogeyBldHlwZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCisgICAgcmVhZExpc3RFbmQoKTogdm9pZDsKKworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4gCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gZWxlbVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cyAoaWdub3JlZCkuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IChpZ25vcmVkKS4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkU2V0QmVnaW4oZWxlbVR5cGU/OiBudW1iZXIsIHNpemU/OiBudW1iZXIpOiB7IGV0eXBlOiBudW1iZXI7IHNpemU6IG51bWJlciB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LiAqLworICAgIHJlYWRTZXRFbmQoKTogdm9pZDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIAorICAgICAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIgCisgICAgICogIGlzIDEsIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIHByb3BlcnR5IGlzIFRydWUuICovCisgICAgcmVhZEJvb2woKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZEJ5dGUoKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZEkxNigpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkSTMyKGY/OiBhbnkpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkSTY0KCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWREb3VibGUoKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZFN0cmluZygpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkQmluYXJ5KCk6IE9iamVjdDsKKworICAgIC8qKiAKKyAgICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEgKG5vdCBpbXBsZW1lbnRlZCkuCisgICAgICovCisgICAgc2tpcCh0eXBlOiBudW1iZXIpOiB2b2lkOworICB9CisKKyAgLyoqCisgICAqIE9sZCBhbGlhcyBvZiB0aGUgVFhIUlRyYW5zcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAqLworICBjbGFzcyBQcm90b2NvbCBleHRlbmRzIFRKU09OUHJvdG9jb2wgeyB9CisKKyAgY2xhc3MgTXVsdGlwbGV4UHJvdG9jb2wgZXh0ZW5kcyBUSlNPTlByb3RvY29sIHsKKyAgICBzZXJ2aWNlTmFtZTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBNdXRpbHBsZXhQcm90b2NvbCBJbXBsZW1lbnRhdGlvbiBhcyBhIFdyYXBwZXIgZm9yIFRocmlmdC5Qcm90b2NvbC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3J2TmFtZQorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnMKKyAgICAgKiBAcGFyYW0ge2FueX0gW3N0cmljdFJlYWRdCisgICAgICogQHBhcmFtIHthbnl9IFtzdHJpY3RXcml0ZV0KKyAgICAgKi8KKyAgICBjb25zdHJ1Y3RvcihzcnZOYW1lOiBzdHJpbmcsIHRyYW5zOiBPYmplY3QsIHN0cmljdFJlYWQ/OiBhbnksIHN0cmljdFdyaXRlPzogYW55KTsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHdyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZCBvZiBwcm90b3R5cGUKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgY2FsbCAoYWx3YXlzIDAgaW4gQXBhY2hlIFRocmlmdCkuCisgICAgICovCisgICAgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc3RyaW5nLCB0eXBlOiBudW1iZXIsIHNlcWlkOiBudW1iZXIpOiB2b2lkOworICB9CisKKyAgY2xhc3MgTXVsdGlwbGV4ZXIgeworICAgIHNlcWlkOiBudW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBtdWx0aXBsZXhlZCBjbGllbnQgZm9yIGEgc3BlY2lmaWMgc2VydmljZS4KKyAgICAgKiBAcGFyYW0ge1N0cmluZ30gc2VydmljZU5hbWUgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlNlcnZpY2VDbGllbnR9IFNDbCAtIFRoZSBTZXJ2aWNlIENsaWVudCBDbGFzcy4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UcmFuc3BvcnR9IHRyYW5zcG9ydCAtIFRocmlmdC5UcmFuc3BvcnQgaW5zdGFuY2Ugd2hpY2ggcHJvdmlkZXMgcmVtb3RlIGhvc3Q6cG9ydC4KKyAgICAgKi8KKyAgICBjcmVhdGVDbGllbnQoc2VydmljZU5hbWU6IHN0cmluZywgU0NsOiBhbnksIHRyYW5zcG9ydDogT2JqZWN0KTogYW55OworICB9Cit9CmRpZmYgLS1naXQgYS9saWIveG1sL01ha2VmaWxlLmFtIGIvbGliL3htbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2FkNmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitFWFRSQV9ESVNUID0gXAorICB0aHJpZnQtaWRsLnhzZCBcCisgIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi94bWwvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi94bWwvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg3YTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitjaGVjazoKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KZGlmZiAtLWdpdCBhL2xpYi94bWwvdGVzdC9idWlsZC54bWwgYi9saWIveG1sL3Rlc3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTk1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3Rlc3QvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTEyIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iWE1MIFNjaGVtYSBUZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8ZGVzY3JpcHRpb24+WE1MIFNjaGVtYSBWYWxpZGF0aW9uIFRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ4bWwuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Imdlbi54bWwuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi9nZW4teG1sIiAvPgorICA8cHJvcGVydHkgbmFtZT0iaWRsLnhtbC5zY2hlbWEiIGxvY2F0aW9uPSIke3htbC5kaXJ9L3RocmlmdC1pZGwueHNkIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnRlc3QuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS90ZXN0IiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmNvbXBpbGVyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9jb21waWxlci9jcHAvdGhyaWZ0IiAvPgorCisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlci5jaGVjayI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZmlsZT0iJHt0aHJpZnQuY29tcGlsZXJ9Ii8+CisgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgVGhyaWZ0IGNvbXBpbGVyIGlzIG1pc3NpbmcgIQorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJjb21waWxlci5jaGVjaywgbWtkaXJzIj4KKyAgICA8dHN0YW1wIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWtkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSIke2dlbi54bWwuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UaHJpZnRUZXN0LnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0luY2x1ZGUudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vUmVjdXJzaXZlLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L01hbnlPcHRpb25hbHMudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vQ29uc3RhbnRzRGVtby50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UeXBlZGVmVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vQW5ub3RhdGlvblRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0RvY1Rlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0VudW1UZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9NYW55VHlwZWRlZnMudGhyaWZ0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gc2NoZW1hIHZhbGlkYXRpb24iCisgICAgICAgICAgZGVwZW5kcz0idmFsaWRhdGUtZ2VuZXJhdGVkLXhtbCIvPgorICAgIAorICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLWdlbmVyYXRlZC14bWwiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlIj4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L1RocmlmdFRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9JbmNsdWRlLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vUmVjdXJzaXZlLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vTWFueU9wdGlvbmFscy54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L09wdGlvbmFsUmVxdWlyZWRUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vQ29uc3RhbnRzRGVtby54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L1R5cGVkZWZUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vQW5ub3RhdGlvblRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Eb2NUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vRW51bVRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9NYW55VHlwZWRlZnMueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuLnhtbC5kaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0iZ2VuZXJhdGUteG1sIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgPGFyZyBsaW5lPSItZ2VuIHhtbDptZXJnZSIvPgorICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4ueG1sLmRpcn0iLz4KKyAgICAgICAgPGFyZyBsaW5lPSJAe2ZpbGV9Ii8+CisgICAgICA8L2V4ZWM+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDxtYWNyb2RlZiBuYW1lPSJ2YWxpZGF0ZS14bWwiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9InZhbGlkYXRpbmcgZ2VuZXJhdGVkIFhNTDogQHtmaWxlfSIgLz4KKyAgICAgIDxzY2hlbWF2YWxpZGF0ZSBmaWxlPSJAe2ZpbGV9Ij4KKyAgICAgICAgPHNjaGVtYSBuYW1lc3BhY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgICAgICAgICBmaWxlPSIke2lkbC54bWwuc2NoZW1hfSIgLz4KKyAgICAgIDwvc2NoZW1hdmFsaWRhdGU+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIveG1sL3RocmlmdC1pZGwueHNkIGIvbGliL3htbC90aHJpZnQtaWRsLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWRkNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC90aHJpZnQtaWRsLnhzZApAQCAtMCwwICsxLDI4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIgCisgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8ZWxlbWVudCBuYW1lPSJpZGwiIHR5cGU9InRuczpJREwiIC8+CisgIDxlbGVtZW50IG5hbWU9ImRvY3VtZW50IiB0eXBlPSJ0bnM6RG9jdW1lbnQiIC8+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IklETCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgcmVmPSJ0bnM6ZG9jdW1lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJEb2N1bWVudCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgdHlwZT0idG5zOkluY2x1ZGUiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0idG5zOk5hbWVzcGFjZSIgLz4KKyAgICAgIDwvY2hvaWNlPgorICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uIiB0eXBlPSJ0bnM6RXhjZXB0aW9uIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0eXBlZGVmIiB0eXBlPSJ0bnM6VHlwZWRlZiIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2VydmljZSIgdHlwZT0idG5zOlNlcnZpY2UiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cnVjdCIgdHlwZT0idG5zOlN0cnVjdCIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iY29uc3QiIHR5cGU9InRuczpDb25zdCIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5pb24iIHR5cGU9InRuczpVbmlvbiIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZW51bSIgdHlwZT0idG5zOkVudW0iIC8+CisgICAgICA8L2Nob2ljZT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iSW5jbHVkZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVzcGFjZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxncm91cCBuYW1lPSJBYnN0cmFjdFN0cnVjdCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICA8L2dyb3VwPgorCisgIDxhdHRyaWJ1dGVHcm91cCBuYW1lPSJTdHJ1Y3RBdHRyaWJ1dGVzIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2F0dHJpYnV0ZUdyb3VwPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJFeGNlcHRpb24iPgorICAgIDxncm91cCByZWY9InRuczpBYnN0cmFjdFN0cnVjdCIgLz4KKyAgICA8YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6U3RydWN0QXR0cmlidXRlcyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iU2VydmljZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWV0aG9kIiB0eXBlPSJ0bnM6TWV0aG9kIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudC1tb2R1bGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudC1pZCIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPiAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJNZXRob2QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9InJldHVybnMiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9InRocm93cyIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvbmV3YXkiIHR5cGU9ImJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iVHlwZWRlZiI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3QiPgorICAgIDxncm91cCByZWY9InRuczpBYnN0cmFjdFN0cnVjdCIgLz4KKyAgICA8YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6U3RydWN0QXR0cmlidXRlcyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iVW5pb24iPgorICAgIDxncm91cCByZWY9InRuczpBYnN0cmFjdFN0cnVjdCIgLz4KKyAgICA8YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6U3RydWN0QXR0cmlidXRlcyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRW51bSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWVtYmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiIC8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHBsaWNpdCIgdHlwZT0iYm9vbGVhbiIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJGaWVsZCI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkZWZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmllbGQtaWQiIHR5cGU9ImxvbmciIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ0bnM6UmVxdWlyZWRuZXNzIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9jb21wbGV4Q29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8c2ltcGxlVHlwZSBuYW1lPSJSZXF1aXJlZG5lc3MiPgorICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyZXF1aXJlZCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiIC8+CisgICAgPC9yZXN0cmljdGlvbj4KKyAgPC9zaW1wbGVUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJBbm5vdGF0aW9uIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ic3RyaW5nIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQ29uc3QiPgorICAgIDxjb21wbGV4Q29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOlRocmlmdFR5cGUiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9jb21wbGV4Q29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RMaXN0Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgIDwvZWxlbWVudD4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdE1hcCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ia2V5Ij4KKyAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC9lbGVtZW50PgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiPgorICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgIDwvZWxlbWVudD4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxncm91cCBuYW1lPSJDb25zdFZhbHVlIj4KKyAgICA8Y2hvaWNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJkb3VibGUiIHR5cGU9ImRvdWJsZSIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Imxpc3QiIHR5cGU9InRuczpDb25zdExpc3QiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtYXAiIHR5cGU9InRuczpDb25zdE1hcCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImludCIgdHlwZT0ibG9uZyIgLz4KKyAgICA8L2Nob2ljZT4KKyAgPC9ncm91cD4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iVGhyaWZ0VHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImVsZW1UeXBlIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgLz4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImtleVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgIDwvY2hvaWNlPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ0bnM6VHlwZUlkZW50aWZpZXIiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW1vZHVsZSIgdHlwZT0ic3RyaW5nIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZS1pZCIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxzaW1wbGVUeXBlIG5hbWU9IlR5cGVJZGVudGlmaWVyIj4KKyAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0idm9pZCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYm9vbCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYnl0ZSIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTgiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImkxNiIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTMyIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpNjQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImRvdWJsZSIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iYmluYXJ5IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImlkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJtYXAiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InNldCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIgLz4KKyAgICA8L3Jlc3RyaWN0aW9uPgorICA8L3NpbXBsZVR5cGU+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGFja2FnZS1sb2NrLmpzb24gYi9wYWNrYWdlLWxvY2suanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY1YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwyMTgzIEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgIkBiYWJlbC9jb2RlLWZyYW1lIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9jb2RlLWZyYW1lLy0vY29kZS1mcmFtZS03LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2ZDMnVlbWFrblhyODdiZExVa1dvZzduWXVsaU05SWo1SFVjYWpzVmNNQ3BRcmNMbXR4UmJWRlRJcW1jU2tTZVlSQkZCUnhzMkZpVXFGSkRMZGllYkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkBiYWJlbC9oaWdobGlnaHQiOiAiXjcuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIkBiYWJlbC9oaWdobGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2hpZ2hsaWdodC8tL2hpZ2hsaWdodC03LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVUZNQzRaZUZDNDhUcHZqN0M4VWdMdnRrYVV1b3ZRWCs1eE5XcnNJb01HOG8yeitYRktqS2FOOWlWbVM4NGRQd1ZOMDBXNHdQbXF2WW9aRjNFR0FzZnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4yLjAuMCIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJqcy10b2tlbnMiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIkB0eXBlcy9ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMTAuMTIuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL25vZGUvLS9ub2RlLTEwLjEyLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLStaV0I1RWMxaWtpOTl4UUZ6QmxpdmxLeFNaUStmdVVLQm90dDhTdEJPbkxONGRXYlJIbGdkZzFYa25wVzZnMHR3ZW5pTjVEY09xQTY0Q0p5T1VQU0F3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJAdHlwZXMvcSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvcS8tL3EtMS41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVxejhjLzBrd05pL09FSFFmdkl1SlZMVHN0M2luMGU3dVRLZXVZK1dML3pmS24weFZ1ak9UcDQyYlMvdlVVb2toSzVQMkJwcExkOUpYTU9NSGNnYmpBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhYmJyZXYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWJicmV2Ly0vYWJicmV2LTEuMC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta2JSNUpZaW5jNHdsODEzVzlqZFNvdmgzWVRVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLy0vYWNvcm4tNi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdYbUtJdmJyTjNUVjdhVnFBelZGYU1XOEY4d3pWWDd2b0VCUk8zYkRBNjQrRVgzN1lTYXlnZ1JKUDVYaWc2SFlIQmtXS3BGZzlXNWdnNm9ya2x1YmhnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhY29ybi1qc3giOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4tanN4Ly0vYWNvcm4tanN4LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Ya0I1MGZuME1VUkR5d3c5K1VZTDNjMXlMYk9CejBaRnZyZFlsR0I4bCtJamUxb1NDNzVxQXFyelNQallRYmRuUVV6aGxVR05LdWVzcnlBdjBneFpPZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWp2IjogeworICAgICAgInZlcnNpb24iOiAiNi41LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi02LjUuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNFd5anQ4K3Q2WXN6cWFYbkxEZk1tRy84QWxPNVpiY3N5M0FUSG5jQ3pqVy9Ob1B6QUlkOEFLNjc0OVliam1kdCtrVVkxZ1A2MGZDdTQ2b0R4UHYvbWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZhc3QtZGVlcC1lcXVhbCI6ICJeMi4wLjEiLAorICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogIl4wLjQuMSIsCisgICAgICAgICJ1cmktanMiOiAiXjQuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImFtZGVmaW5lIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FtZGVmaW5lLy0vYW1kZWZpbmUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TbEtDckJaSEtlazJHYno5T3RGUitCZk9rZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktZXNjYXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLWVzY2FwZXMvLS9hbnNpLWVzY2FwZXMtMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVnQWI4SDlENDFBUW51L1BiV2xDb2ZRVmNuVjRHczJiQkppOWVaUHhmVS9oZ2dsRmgzU01ETUVOUklxZHI3SDZYRm5YZG9rbmN0RkJ5VnNDT290VFZ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1FNWHd5SUdUM2xHYkFLV2E5MjJCYXMzMlpnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMy4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZUMFpJNmtaUmRUaDhZeUp3M1NNYlltL3UrTnFmc0F4RXBXTzBQZjlzcTgvZTk0V3h4T3BQS3g5RlIxRmx5Q3RPVkROT1ErOG50bHFGeGlSYytyNXFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1jb252ZXJ0IjogIl4xLjkuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcHJvYmEiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXByb2JhLy0vYXByb2JhLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZOUo2WmpYdG9ZaDhSblhWQ01PVS90dERtazFhQmp1bnE5dk8wdGE1eDg1V0RRaVFmVUY5c0lQQklUZGJpaUlWY0JvMDNIaTNqTXhpZ0J0c2RkbFhSdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJlLXdlLXRoZXJlLXlldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmUtd2UtdGhlcmUteWV0Ly0vYXJlLXdlLXRoZXJlLXlldC0xLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNWhZZEFrWmxjRzh0T0x1alZEVGdDVCt1UFgwVm5wQUgyOGdXc0xmenBYWW03d1A2bXA1US9nWXlSN1lRMGNLVkpjWEpubDNqMmtwQmFuMTNQdFFmNnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGVnYXRlcyI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcmdwYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJncGFyc2UvLS9hcmdwYXJzZS0xLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW81Um95NnRORzRTTC9GT2tDQU42UnpqaWFrWlMyNVJMWUZyY010dEpxYmRkOEJXcm5BK2ZHejU3aU41UGIwNnB2Qkd2bDVnUTBCNDhkSmxzbFh2b1RnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIn4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcnJheS11bmlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlvbi8tL2FycmF5LXVuaW9uLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWpSQkRrOU9QYUk5NmpkYjViNXc4a2Q0N0RrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaXEiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImFycmF5LXVuaXEiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pcS8tL2FycmF5LXVuaXEtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yMnJJZDZKY3gvZE9CWWlVZFRoWTM5c2svYlk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmlmeS8tL2FycmlmeS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWlZVUkyaUltODREZmtFY29SV2hKd1ZBYVN3MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmluZGluZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmluZGluZ3MvLS9iaW5kaW5ncy0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRHBMaDVFek1SMmt6dlgxS0lsVkMwVmtDM2ladEhLVGdkdFowYTNwZ2xCWmRhUUZqdDVTOWc5eGQxbEUrWXZYeWZkNm10Q2VSbnJVZk9MWWlUTWxOU3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmwvLS9ibC0xLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZTh0UVluWm9kbWViWURXR0g3S01SdnR6S1hhSkh4M0JiaWxyZ1pDZnZ5TFVZZEtwSzF0NVBTUG1wa255L1NnaVRTQ25qZkxXN3Y1cmxPTlhWRmtRRUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjUiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRoSFRXTUk3a014NXdoTVFudGw3VnI5QzZCdlYxMGxGWERBYXNucW5yTVloWFZDenprNklPOUZvMkw3NWpYSFQwN1dyT25nTDFXRFhPcCt5WVM5MVlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJicmFjZS1leHBhbnNpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi0xLjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlDdVBIREZnckhYN0gydkVJLzV4cHowN3pTSEIwMFRwdWdxaG1ZdFZtTU82NTE4bUN1Uk1vT1lGbGRFQmwwZzE4N3Vmb3pkYUhnV0tjWUZiNjFxR2lBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWxhbmNlZC1tYXRjaCI6ICJeMS4wLjAiLAorICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItYWxsb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWFsbG9jLy0vYnVmZmVyLWFsbG9jLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DRnNIUWdqdFcxVUNoZFhnYnlKR3RubStPL3VMUWVaZHRiRG84bWZVZ1lYQ0hTTTF3Z3JWeFhtNmJTeXJVdUVyRWIrNHNZVkdDekFTQlJvdDd6eXJvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVmZmVyLWFsbG9jLXVuc2FmZSI6ICJeMS4xLjAiLAorICAgICAgICAiYnVmZmVyLWZpbGwiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1hbGxvYy11bnNhZmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWFsbG9jLXVuc2FmZS8tL2J1ZmZlci1hbGxvYy11bnNhZmUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRFTTJpTUlFUWRKMnlqUEpvU0lzbGRubGVWYUFrMW9XM0RCVlV5a3lPTHNFc0ZtRWM5a24rU0ZGUHorZ2w1NEtRTnhsRG5Bd0NYb3NPUzlPa3gyeEFnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItZXF1YWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWVxdWFscy8tL2J1ZmZlci1lcXVhbHMtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BMU8xVDlCLzJWWkJjR2NhNXZacm5QRU5KL1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLWZpbGwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWZpbGwvLS9idWZmZXItZmlsbC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLStQZUxkbmlZaU84NThnWE5ZMzlvNXdJU0t5dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYWxsZXItcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWxsZXItcGF0aC8tL2NhbGxlci1wYXRoLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbEFoZTlqV0I3TlBhcVNSRXFQNlU2Q1YzZFI4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbGxzaXRlcyI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FsbHNpdGVzIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxzaXRlcy8tL2NhbGxzaXRlcy0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXI2dVdKaWtRcC9NOEdhVjNXQ1hHbnpUalVNbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNoYXJkZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhcmRldC8tL2NoYXJkZXQtMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UOGlEY3JoMDNxREdSUm1vQTJobUJKbnhwbGxNUiswLzBxbHpqcVpFUzZOZGlXRGNaa0NOQWs0clBGWjlRODVyMjd1bmtpTk5nOFpPaXdaWEJId2NBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjaG93bnIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hvd25yLy0vY2hvd25yLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qMzhFdk81K0xIWDg0amxvNmg0VXptT3dpMFVnVzYxV1J5UHRKejRxYWFkSzVlWTNCVFM1VFkvUzFTdGMzVWsybElNNlRQZXZBbFVMaUVKd2llODYwZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2lyY3VsYXItanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaXJjdWxhci1qc29uLy0vY2lyY3VsYXItanNvbi0wLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVVpLM05CeDJNY2ErYjVMc0c3YlkxODNwSFd0NVkxeHRzNFAzUHo3RU5Ud0dWbkpPVVdiUmIzb2Nqdlg3aHg5dHEveVRBZGNsWG05c1ozOGdOdWVtNEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNsaS1jdXJzb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpLWN1cnNvci8tL2NsaS1jdXJzb3ItMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMTJzTjJSNStzdytsSFI5UWREUTlTT1AvTFU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzdG9yZS1jdXJzb3IiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsaS13aWR0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGktd2lkdGgvLS9jbGktd2lkdGgtMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0veG50NkttbDVYa3lRVWV3d1I4UHZMcSsxams9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29kZS1wb2ludC1hdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2RlLXBvaW50LWF0Ly0vY29kZS1wb2ludC1hdC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURRY0xUUVE2Vytvem92R2tEaTdiUFpwTXozYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbW1hbmRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMTkuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tbWFuZGVyLy0vY29tbWFuZGVyLTIuMTkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNnR2QU9PK0Q2T0VOdlJBaDUyNERoOWpjZktUWURRQXF2cWV6YkNXODJ4ajVYMHBTcmNweHR2UktITEcweUJZNlNEN1BTRHJKYWorMEFpT2NLVmQxWGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29ubmVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNi42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25uZWN0Ly0vY29ubmVjdC0zLjYuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNlLzJ4VnIzSTI0VGNUV25KWFNGaTJlRzlTUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJmaW5hbGhhbmRsZXIiOiAiMS4xLjAiLAorICAgICAgICAicGFyc2V1cmwiOiAifjEuMy4yIiwKKyAgICAgICAgInV0aWxzLW1lcmdlIjogIjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImNvbnNvbGUtY29udHJvbC1zdHJpbmdzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnNvbGUtY29udHJvbC1zdHJpbmdzLy0vY29uc29sZS1jb250cm9sLXN0cmluZ3MtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QWHowUmsyMlJHNm1STDlMT1ZCL21GRUFqbzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29yZS11dGlsLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcmUtdXRpbC1pcy8tL2NvcmUtdXRpbC1pcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmMVVJZ3FpdkZxMWVxdHhRTWxBZFVVRHdhYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjcm9zcy1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcm9zcy1zcGF3bi8tL2Nyb3NzLXNwYXduLTYuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lVFZMckJTdDdmamJEeWd6ODA1cE1uc3RJczJWVEJOa1JtMHF4WmQrTTdBNVhEZHhWUldPNU14R0JYWmhqWTRjcUxZTGR0ckdxUmY4bUJQbXp3U3BXUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibmljZS10cnkiOiAiXjEuMC40IiwKKyAgICAgICAgInBhdGgta2V5IjogIl4yLjAuMSIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4wIiwKKyAgICAgICAgInNoZWJhbmctY29tbWFuZCI6ICJeMS4yLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMi45IgorICAgICAgfQorICAgIH0sCisgICAgImRlYnVnIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMi42LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJDN0VscmRKYUpuUGJBUCsxRW90WXZxWnNiM2VjbDV3aTZCZmk2QkpUVWNOb3dwNmN2c3BnMGpYem5SVEtEam0vRTdBZGdGQlZlQVBWTU5jS0dzSE1BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtcyI6ICIyLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWNvbXByZXNzLXJlc3BvbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY29tcHJlc3MtcmVzcG9uc2UvLS9kZWNvbXByZXNzLXJlc3BvbnNlLTMuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZ0tUZE1qZElPRXY2SklDRFlpcnQ3SmdxMy9NPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbWljLXJlc3BvbnNlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtZXF1YWwvLS9kZWVwLWVxdWFsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWRKZ0tTdG1EZ2hPLzB6YnlmQ0sweVIwU0xVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZXAtZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtZXh0ZW5kLy0vZGVlcC1leHRlbmQtMC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUxPSHhJT2FQWWRIbEpSdENRZkRJVlp0ZncvdWZNOCtyVmo2NDlSSUh6Y20vdkd3UVJYRnQ2T1BxSUZXc20yWEVNck5JRXRXUjY0c1kxTEVLRDJ2QU9BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWVwLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtaXMvLS9kZWVwLWlzLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczJuVysxMjhFKzdQVWsrUnNIRCs3Y05YenpRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZmluZS1wcm9wZXJ0aWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0aWVzLy0vZGVmaW5lLXByb3BlcnRpZXMtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNNcWZZS2oybEx6ZE1TZjhaSVpFL1YrWnV5K0JnRDZmMTY0ZThLMnc3ZGducEtBckJEZXJHWXBNNDZJWVljam5rZFBOTWpQazlBNlZGQjgrM1NLbFhRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvYmplY3Qta2V5cyI6ICJeMS4wLjEyIgorICAgICAgfQorICAgIH0sCisgICAgImRlZmluZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lZC8tL2RlZmluZWQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS15WTJienZkV2RCaU9FUWxwRlJHWjQ1c2ZwcE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVsIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbC8tL2RlbC0yLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdTeVlIUVo0UnNoTHl2aGl6L2t3MlFmLzBhZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iYnkiOiAiXjUuMC4wIiwKKyAgICAgICAgImlzLXBhdGgtY3dkIjogIl4xLjAuMCIsCisgICAgICAgICJpcy1wYXRoLWluLWN3ZCI6ICJeMS4wLjAiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJeMi4yLjgiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVsZWdhdGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGVnYXRlcy8tL2RlbGVnYXRlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhNYmhXYmdaQlAzS1dhRHZSTTJIRFRFbEQ1bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZXRlY3QtbGliYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXRlY3QtbGliYy8tL2RldGVjdC1saWJjLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK2hOOFM5YVk3ZlZjMWMwQ3JGV2ZrYVRFdXBzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvY3RyaW5lIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvY3RyaW5lLy0vZG9jdHJpbmUtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTM1bVNrdTRaWEswdmZDdUhFREF3dDU1ZGcyak5hakhaMW9kdkYrOFNTcjgyRXNaWTRRbVhmdVdzbzhvRWQ4elJoVk9iU04xOGFNMENqU2RvQlg3ekl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlZS1maXJzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lZS1maXJzdC8tL2VlLWZpcnN0LTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV1F4aEZXc0s0dlR3SlZjeW9WaXlacnhXc2gwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVuY29kZXVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbmNvZGV1cmwvLS9lbmNvZGV1cmwtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yVC8weUc3QzBDa3lMMW9DdzZtbUJzbGJQMWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZW5kLW9mLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbmQtb2Ytc3RyZWFtLy0vZW5kLW9mLXN0cmVhbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMU1rclpOdldUS0NhaWdibitXMTVlbHEyQkIvTDIybnFyU1k1REtsbzNYNit2Y2xKbThCYjVkalhKQm1FWDZmUzMrekNoL0Y0VkJLNVoyS3hKdDRzMlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uY2UiOiAiXjEuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzLWFic3RyYWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lcy1hYnN0cmFjdC8tL2VzLWFic3RyYWN0LTEuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQzhGeC8wakZtVjVJUG9NT0ZQQTlQOUc1TnRxVys0Y09QaXQzTUl1dlIydDdBZzJLMTVFSlRweG5IQVlUekwrYVlRSklFU1llWFptREJmT0JFMUhjcEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzLXRvLXByaW1pdGl2ZSI6ICJeMS4xLjEiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4xLjEiLAorICAgICAgICAiaGFzIjogIl4xLjAuMSIsCisgICAgICAgICJpcy1jYWxsYWJsZSI6ICJeMS4xLjMiLAorICAgICAgICAiaXMtcmVnZXgiOiAiXjEuMC40IgorICAgICAgfQorICAgIH0sCisgICAgImVzLXRvLXByaW1pdGl2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lcy10by1wcmltaXRpdmUvLS9lcy10by1wcmltaXRpdmUtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFacnlCT0pqVi8vTGF4TFRWNlVDLy9XZXduZUIzTGNYT0w5TlArK296S1ZYc0lJSXBtLzJjMTNVRGlEOUpwMmVUaHNlY3c5bTNqUHFEd1R5b2JjZGJnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1jYWxsYWJsZSI6ICJeMS4xLjQiLAorICAgICAgICAiaXMtZGF0ZS1vYmplY3QiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLXN5bWJvbCI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNjYXBlLWh0bWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLWh0bWwvLS9lc2NhcGUtaHRtbC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUFsanE1TlBRd0pkTjRjRnBHSTd3QlIwZEdZZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzY29kZWdlbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NvZGVnZW4vLS9lc2NvZGVnZW4tMS44LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XbHRUcjBhVEVRdnJzSVo2bzBNTjA3Y0tFQmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNwcmltYSI6ICJeMi43LjEiLAorICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeMS45LjEiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAib3B0aW9uYXRvciI6ICJeMC44LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sdU8zRFZkNTlxMUp6UU1tYzlIREVuWjdwWUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZXN0cmF2ZXJzZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdHJhdmVyc2UvLS9lc3RyYXZlcnNlLTEuOS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXIyZnkzSklsZ2tGWlVKSmdrYVFBWFNuSnUwUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50Ly0vZXNsaW50LTUuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi16WUNlRlFhaHN4ZmZHbDg3VTJhSjdEUHlIOENiV2d4QkMyMTNZOCtUQ2FuaFVUZjJnRXZmcTNFS3BIbUVjb3pUTHlQbUdlOUxaZE1Bd0MvQ3BKQk01QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiQGJhYmVsL2NvZGUtZnJhbWUiOiAiXjcuMC4wIiwKKyAgICAgICAgImFqdiI6ICJeNi41LjMiLAorICAgICAgICAiY2hhbGsiOiAiXjIuMS4wIiwKKyAgICAgICAgImNyb3NzLXNwYXduIjogIl42LjAuNSIsCisgICAgICAgICJkZWJ1ZyI6ICJeNC4wLjEiLAorICAgICAgICAiZG9jdHJpbmUiOiAiXjIuMS4wIiwKKyAgICAgICAgImVzbGludC1zY29wZSI6ICJeNC4wLjAiLAorICAgICAgICAiZXNsaW50LXV0aWxzIjogIl4xLjMuMSIsCisgICAgICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogIl4xLjAuMCIsCisgICAgICAgICJlc3ByZWUiOiAiXjQuMC4wIiwKKyAgICAgICAgImVzcXVlcnkiOiAiXjEuMC4xIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgImZpbGUtZW50cnktY2FjaGUiOiAiXjIuMC4wIiwKKyAgICAgICAgImZ1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUiOiAiXjEuMC4xIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4yIiwKKyAgICAgICAgImdsb2JhbHMiOiAiXjExLjcuMCIsCisgICAgICAgICJpZ25vcmUiOiAiXjQuMC42IiwKKyAgICAgICAgImltdXJtdXJoYXNoIjogIl4wLjEuNCIsCisgICAgICAgICJpbnF1aXJlciI6ICJeNi4xLjAiLAorICAgICAgICAiaXMtcmVzb2x2YWJsZSI6ICJeMS4xLjAiLAorICAgICAgICAianMteWFtbCI6ICJeMy4xMi4wIiwKKyAgICAgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiAiXjEuMC4xIiwKKyAgICAgICAgImxldm4iOiAiXjAuMy4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy41IiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJuYXR1cmFsLWNvbXBhcmUiOiAiXjEuNC4wIiwKKyAgICAgICAgIm9wdGlvbmF0b3IiOiAiXjAuOC4yIiwKKyAgICAgICAgInBhdGgtaXMtaW5zaWRlIjogIl4xLjAuMiIsCisgICAgICAgICJwbHVyYWxpemUiOiAiXjcuMC4wIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4yLjAuMCIsCisgICAgICAgICJyZWdleHBwIjogIl4yLjAuMSIsCisgICAgICAgICJyZXF1aXJlLXVuY2FjaGVkIjogIl4xLjAuMyIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4xIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjQuMC4wIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInRhYmxlIjogIl41LjAuMiIsCisgICAgICAgICJ0ZXh0LXRhYmxlIjogIl4wLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4xLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTQuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItaGVOUEpVSklxQyt4QjZheUxBTUhhSXJtTjlIS2E3YVFPOE1HcUtwdkNBK3VKWVZjdlI2bDVrZ2RyaFJ1d1BGSFU3UDUvQTF3MEJqQnlQSHdwZlRES2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtY29uZmlnLXByZXR0aWVyLy0vZXNsaW50LWNvbmZpZy1wcmV0dGllci0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUVlHZm16dWM0cTRKNlhJaGxwOHZSS2RJL2ZJMHRRZlFQeTFkTUUzVU9McHJFK3Y0c3NILzNXOUxNMlE3aDVxQmN5NW0wZWhDckJEVTJZRjhxNk9ZOHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXBsdWdpbi1wcmV0dGllciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtcGx1Z2luLXByZXR0aWVyLy0vZXNsaW50LXBsdWdpbi1wcmV0dGllci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNGcxMW9wemhxcS84K0FNbW81VmMyR243ejlhbFo0SnFyYlorRDRpOEtsU3l4ZVFoWkhsbUlyWThVOUFrZjUxNE1vRWhvZ1BhODdKZ2txODdhWjJPaHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZXR0aWVyLWxpbnRlci1oZWxwZXJzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtc2NvcGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXNjb3BlLy0vZXNsaW50LXNjb3BlLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xRzZVVERpN0pjMUVMRnduUjU4SFY0Zks5T1FLNFM2Tjk4NWYxNjZ4cVh4cGpVNnBseEZJU0phMkJhOUtDUXVGYThSQ25qL2xTRkpiSG83VUZEQm5VQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNyZWN1cnNlIjogIl40LjEuMCIsCisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXV0aWxzLy0vZXNsaW50LXV0aWxzLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aN1lqbklsZFgrMlhNY2pyN1prZ0VzT2ovYlJFT05WNjBxWWVCL2JqTUFxcXFaNHp4S3lXWCtCT1VrZG1SbUE5cmlpSVBWdm81eDg2bTVlbHZpT2swUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdmlzaXRvci1rZXlzLy0vZXNsaW50LXZpc2l0b3Ita2V5cy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcXptL1h4SWJ4bS9GSHlIMzQxWnJibk1VcGUrNUJvY3RlOXhrbUZNelBNalJhWk1jWHd3K01wQnB0RnZ0VSs3OUwzNjJucWlMaGVrQ3hDeERQYVVNQlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzcHJlZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByZWUvLS9lc3ByZWUtNC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUk1QnljWlc2RkNWSXViOTNUZVZZMXM3dmpoUDlDWTZjWEN6bklSZmlpZzduUnZpS1pZZFJuai9zSEVXQzZBN1dFOVJEV09GcTkrN09zV1NZejhxdjJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhY29ybiI6ICJeNi4wLjIiLAorICAgICAgICAiYWNvcm4tanN4IjogIl41LjAuMCIsCisgICAgICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lR3VGRnc3VXBkYStnNHArUUh2blcwUnlUWC9TVmVKQkRNL2dDdE1BUk8wY0x1VDJIY0VLblRQdmhqVjZhR2VxckNCL3NiTm9wMEtzem0wanNhV1U0QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNxdWVyeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3F1ZXJ5Ly0vZXNxdWVyeS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItU21peVo1eklXSDlWTStTUlVSZUxTNVE4YTdHeHRSZHhFQlZacG05OHJKTTdTYitBOURWQ25kWGZrZUZVZDNieWRlcmcrRWJEa2ZuZXZmQ3d5bldhTkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzcmVjdXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3JlY3Vyc2UvLS9lc3JlY3Vyc2UtNC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTY0UkJCKytmSU9BWFB3M1A5Y3k4OXFmTWx2WkVYWmtxcUpranFxWEl2elA1ZXpSWmpXK2xQV2p3MzVVWC8zRWhVUEZZYmc1RVI0SllnRHc0MDA3L0RRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3RyYXZlcnNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdHJhdmVyc2UvLS9lc3RyYXZlcnNlLTQuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGU0LzdUSDgxR2xoak9jMElKbjhHdm9MMnhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN1dGlscy8tL2VzdXRpbHMtMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DcjlQSEtwYnl4OTZuWXJNYmVwUHFxQkxySnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXhwYW5kLXRlbXBsYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC10ZW1wbGF0ZS8tL2V4cGFuZC10ZW1wbGF0ZS0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY2VicUx0VjhLT1pmdzBVSThURUZXeHRjenh4QzFqdnlVdng2SDRmeXAxSzFGTjdBNFErdWdnVlVsT3NJMUs4QUdVMHJ3T0dxUDhuQ2FwZHJ3OENZUWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4dGVybmFsLWVkaXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlcm5hbC1lZGl0b3IvLS9leHRlcm5hbC1lZGl0b3ItMy4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJuNzFIOStxV29PUUt5WkRvMjVtT01WcFNtWFJPQXNUSlZWVll6cnJ0b2wzZDR5K0FzS2pmNEl3bDJRK0l1VDBrRlNRMXFvMTY2VXVJd3FZcTdtR25BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFyZGV0IjogIl4wLjcuMCIsCisgICAgICAgICJpY29udi1saXRlIjogIl4wLjQuMjQiLAorICAgICAgICAidG1wIjogIl4wLjAuMzMiCisgICAgICB9CisgICAgfSwKKyAgICAiZmFzdC1kZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGVlcC1lcXVhbC8tL2Zhc3QtZGVlcC1lcXVhbC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWV3VWhqZCtXWjc5L053djMvYkxMRmYzUXFraz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWRpZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kaWZmLy0vZmFzdC1kaWZmLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi14SnVvVDUrTDk5WGxaOHR3ZWRhUmY2QXgyVGdRVnh2Z1pPWW9QS3FadWZtSmliMHRMMnRlZ1BCT1piMXBWTmdJaGxxRGxBMGVPMGMzd0J2UWNteng0dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFSUXNESzdtc1JpZmg5T25ZUkVHVDRiSXUvST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWxldmVuc2h0ZWluIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtbGV2ZW5zaHRlaW4vLS9mYXN0LWxldmVuc2h0ZWluLTIuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUFlwY1pvZzZGcU1NcUdRK2hSOFp1cWQ1ZVJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZpZ3VyZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlndXJlcy8tL2ZpZ3VyZXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PckdpMHFZc2kvdERHZ3lVeTNsNkw4NG55V0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IgorICAgICAgfQorICAgIH0sCisgICAgImZpbGUtZW50cnktY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlsZS1lbnRyeS1jYWNoZS8tL2ZpbGUtZW50cnktY2FjaGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13NUtaREQ1b1I0UFlPTGpJU2tYWW9FaEZnMkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmxhdC1jYWNoZSI6ICJeMS4yLjEiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZmluYWxoYW5kbGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmFsaGFuZGxlci8tL2ZpbmFsaGFuZGxlci0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXpndG9WYlJZVStlUnN2ekdnQVJ0aUNVOTEvVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJlbmNvZGV1cmwiOiAifjEuMC4xIiwKKyAgICAgICAgImVzY2FwZS1odG1sIjogIn4xLjAuMyIsCisgICAgICAgICJvbi1maW5pc2hlZCI6ICJ+Mi4zLjAiLAorICAgICAgICAicGFyc2V1cmwiOiAifjEuMy4yIiwKKyAgICAgICAgInN0YXR1c2VzIjogIn4xLjMuMSIsCisgICAgICAgICJ1bnBpcGUiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImZsYXQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmxhdC1jYWNoZS8tL2ZsYXQtY2FjaGUtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wd01MTXJPQlZQVGp0K25IQ2ZTUTkrK1h4SUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2lyY3VsYXItanNvbiI6ICJeMC4zLjEiLAorICAgICAgICAiZGVsIjogIl4yLjAuMiIsCisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAid3JpdGUiOiAiXjAuMi4xIgorICAgICAgfQorICAgIH0sCisgICAgImZvci1lYWNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1lYWNoLy0vZm9yLWVhY2gtMC4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpxWWZMcDdtbzl2SXlRZjh5a1cydjdBKzJONFFqZUNlSTUrRHo5WHJhaU8xaWduODF3amlIN0ZiOXZTT1d2UWZOdG1TYTRIMlJvUVRyclhpdmRVWm13PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1jYWxsYWJsZSI6ICJeMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiZnMtY29uc3RhbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWNvbnN0YW50cy8tL2ZzLWNvbnN0YW50cy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteTZPQXdvU0lmN0Z5ak1Jdjk0dStiNXJkaGVaRWp6UjYzR1R5WkptNXFoNEJpKzJZZ3dMQ2NJL2ZQRlprTDVQU2l4T3Q2Wk5LbSt3K0hmcC9CY2l3b3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZzLnJlYWxwYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLnJlYWxwYXRoLy0vZnMucmVhbHBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GUVN0SlNNVmpLcEEyMG9uaDhzQlFSbVU2azg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnVuY3Rpb24tYmluZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mdW5jdGlvbi1iaW5kLy0vZnVuY3Rpb24tYmluZC0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUlvdkF6TVg0OXNGOFlsNThmU0NXSjVzdlNMdWFpYlB4WFFKRkxtQk9iVHVDcjBNZjFLaVBvcEdNOU5pRmppWUJDYmZhYTJGaDZicmVRNkFOVlRJMEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZ1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS8tL2Z1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Hd3F6dlZVN0tnMWptZEtjRGo2Z3NsSUhneWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2F1Z2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2F1Z2UvLS9nYXVnZS0yLjcuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxBTkFYSFU0dzUxK3Mzc3hjQ0xqSmZzQmkvYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcHJvYmEiOiAiXjEuMC4zIiwKKyAgICAgICAgImNvbnNvbGUtY29udHJvbC1zdHJpbmdzIjogIl4xLjAuMCIsCisgICAgICAgICJoYXMtdW5pY29kZSI6ICJeMi4wLjAiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4xLjAiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMS4wLjEiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjEiLAorICAgICAgICAid2lkZS1hbGlnbiI6ICJeMS4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13N002dGU0MkRZYmc1aWp3Um9ybjd5ZldWTjg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC8tL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLTc1NHhPRzhER244TlpEcjRMOTVReEZmdkFNcz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJudW1iZXItaXMtbmFuIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmctd2lkdGgiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmctd2lkdGgvLS9zdHJpbmctd2lkdGgtMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRVl2Zlc0emNVYUtuNXcwaEhnZmlzTG14QjlNPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvZGUtcG9pbnQtYXQiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWFqaGZ1SVU5bFMxZjhGME9pcStVSjQzR1BjOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJnZXQtc3RkaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXN0ZGluLy0vZ2V0LXN0ZGluLTYuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcDR0SGF3eVY3K2Zra1NLeXZqdUxac3dibFV0eitTUUt6U1duQmJpaTE2QnVaa3NKbFUxd3VCWVhZNzVyK2R1aC9sbEYxdXI2b053aSsyWnpqS1o3Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2l0aHViLWZyb20tcGFja2FnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9naXRodWItZnJvbS1wYWNrYWdlLy0vZ2l0aHViLWZyb20tcGFja2FnZS0wLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwvdGRsci9laVhNeFB5RG9LSTc1b1dmNlpNND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiNy4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12Y2Z1aUl4b2dMVjREbEdCSElVT3dJMElicko4SFdQYzRNVTdIenZpR2VOaG8vVUpEZmk2QjVwM3NIZVdJUTBLR0lVMEpweGk1Wkh4ZW1RZkxra0F3UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYmFscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjExLjguMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFscy8tL2dsb2JhbHMtMTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pbzZMa3lQVnV6Q0hCU1FWOWZtT3d4WmtVazZuSWFHbXhoZUxEZ211RnY4OWowZm0yYXFEYklYS0FHZnpDTUhxejNITEYyWmY4V1NHNlZxTWgycUZtQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2xvYmJ5IjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JieS8tL2dsb2JieS01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTY5aEdaOG9OdXpNTG1iejhhT3JDdkZRM0RnMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlvbiI6ICJeMS4wLjEiLAorICAgICAgICAiYXJyaWZ5IjogIl4xLjAuMCIsCisgICAgICAgICJnbG9iIjogIl43LjAuMyIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRG92ZjVOSGR1SVZOWk9CT3A4QU9LZ0p1VmxnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhbmRsZWJhcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhbmRsZWJhcnMvLS9oYW5kbGViYXJzLTQuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmhtVGVrUCtGWkwrWE5od1MxV2YrYlRUWnBkTG91Z3d0NXBjZ0ExdHV6NkpjeDBmcEgvN3owcWQ3MVJLblpIQkN4SVJCSGZCT25pbzRnVmlQZW1OekE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIl4yLjUuMCIsCisgICAgICAgICJvcHRpbWlzdCI6ICJeMC42LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJeMC42LjEiLAorICAgICAgICAidWdsaWZ5LWpzIjogIl4zLjEuNCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTIuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItZk5FaUwyK0FadDZBbEF3LzI5Q3IwVURlNHNSQUhDcEVIaDU0V016K0JiN1FmTmNGdzRoM2xvb2Z5SnBMZVFzNFl4N3l1cXUvMmRMZ001aEtPczZIbFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzb3VyY2UtbWFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VamdhcHVtV2xiTWhrQmd6VDdZa2M1WVhVVDQ2RjBpS3U4U0dYcTBiY3dQNWR6L2gwUGxqNmVuSnFqejFaYnEybDVXYXFZbnJWYndXT1dNeUYzRjQ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaGFzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy8tL2hhcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZjJkdk8wVlU2T2VqN1JrV0pHcmVoamJ6TUFqRnA1L1ZLUHA1dFRwV0lWNEpISFpLMS9CeGJGUnRmL3NpQTJTV1RlMDljYURtVnRZWXpXRUliQlM0enc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXN5bWJvbHMvLS9oYXMtc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVocVBHdktnL0RsbEQxeUZBMmR3UVNJR08wUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtdW5pY29kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdW5pY29kZS8tL2hhcy11bmljb2RlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNE9iK2FpalBVUk9JVmVDRzBXa2VkeDNpcUxrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaWdub3JlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lnbm9yZS8tL2lnbm9yZS00LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY3lGREtycWMvWWRjV0ZuaUpoekk0MitBelMrZ053bVV6T1NGY1JDUVl3eVN1QkJCeS9LanV4V0xaL0ZIRUg2TW9xMU5pek1PQld5VGN2OE80T1pJTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImltdXJtdXJoYXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ltdXJtdXJoYXNoLy0vaW11cm11cmhhc2gtMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1raGk1c3Jrb29qaXhQY1Q3YTIxWGJ5TVVVK289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnF1aXJlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbnF1aXJlci8tL2lucXVpcmVyLTYuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RSUVRRzRZeVEyVVlaR0RDNHNyTVo3QmpIT21OazFsUjJKUWo1VWtuQmFwa2xtNldIQStWVkg3TitzVWRYM0E3TmVDZkdGOG80WDFTM0FvN25BY0llZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1lc2NhcGVzIjogIl4zLjAuMCIsCisgICAgICAgICJjaGFsayI6ICJeMi4wLjAiLAorICAgICAgICAiY2xpLWN1cnNvciI6ICJeMi4xLjAiLAorICAgICAgICAiY2xpLXdpZHRoIjogIl4yLjAuMCIsCisgICAgICAgICJleHRlcm5hbC1lZGl0b3IiOiAiXjMuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjIuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIsCisgICAgICAgICJtdXRlLXN0cmVhbSI6ICIwLjAuNyIsCisgICAgICAgICJydW4tYXN5bmMiOiAiXjIuMi4wIiwKKyAgICAgICAgInJ4anMiOiAiXjYuMS4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMi4xLjAiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiLAorICAgICAgICAidGhyb3VnaCI6ICJeMi4zLjYiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtY2FsbGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtY2FsbGFibGUvLS9pcy1jYWxsYWJsZS0xLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcjVwOXN4SmpZbkFyTGpPYnBqQTR4dTVFS0kzQ3VLSGtKWE1oVDdrd2JwVXlJRkQxbjVQTUFzb1B2V252dFppTno3TGprWURSWmhkN0ZsSTBlTWlqRUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWRhdGUtb2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGUtb2JqZWN0Ly0vaXMtZGF0ZS1vYmplY3QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tcUlPdHE3cnYvZC92VFBuVEtBYk0xZ2RPaFk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQvLS9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW83TUtYRThaa1lNV2VxcTVPKzc2NDkzN1pVOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1wYXRoLWN3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWN3ZC8tL2lzLXBhdGgtY3dkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMGlYc0l4TXVpZTNUajlwMmRITG1MbVh4RUcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXBhdGgtaW4tY3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtaW4tY3dkLy0vaXMtcGF0aC1pbi1jd2QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZqVjFSVFc0OEU3Q1dNN2VFL0oyTkp2QUVFVmVrdGVjREJWQkU1SGgzbk0xSmQwa3ZoSHRYNjhQcjN4c0RmODU3eHQzWTRBa3dWVUxLMVZrdTYyYWFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1wYXRoLWluc2lkZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcGF0aC1pbnNpZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1pbnNpZGUvLS9pcy1wYXRoLWluc2lkZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWp2VzMzbEJEZWovY3ByVG9aZTk2cFZ5MGdEWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLWlzLWluc2lkZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wcm9taXNlLy0vaXMtcHJvbWlzZS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVhS3A3T2Z3bHVnUE50S3k4N3dXd2Y5TDgvbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1yZWdleC8tL2lzLXJlZ2V4LTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVlJkSW0xUndrYkNURGdsV1ZNN1NYdWwrbEpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVzb2x2YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1yZXNvbHZhYmxlLy0vaXMtcmVzb2x2YWJsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcWdEWVhGU1I1V3ZFZnVTNWRNajZvVE1FYnJyU2FNMENyRmsyWWlxL2dYbkJ2RDlwTWEyakdYeHloR0xmdmhacHVNWmUxOENKcEZ4QXQzQ1JzNDJOTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXN5bWJvbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1zeW1ib2wvLS9pcy1zeW1ib2wtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhTOGJaOW94NjB5Q0pMSDlzbkJwSXd2OXBZVUFrY3VMaFNBMW9lcm8xVUI1eTlhaVFwUkE4eTJleDk0NUFPdENaTDFsSkRlSWszRzVMdGhzd0k0Nkx3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtc3ltYm9scyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXNhcnJheSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc2FycmF5Ly0vaXNhcnJheS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXU1TmRTRmdzdWhhTUJvTkpWNlZLUGdjU1R4RT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2V4ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc2V4ZS8tL2lzZXhlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNlB2emROeFZiL2lVZWhEY3NGY3RZejhzK2hBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzdGFuYnVsIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzdGFuYnVsLy0vaXN0YW5idWwtMC40LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aY2ZYUFV4TnFFMVBPc01RdVJqN0M0QXpjenM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWJicmV2IjogIjEuMC54IiwKKyAgICAgICAgImFzeW5jIjogIjEueCIsCisgICAgICAgICJlc2NvZGVnZW4iOiAiMS44LngiLAorICAgICAgICAiZXNwcmltYSI6ICIyLjcueCIsCisgICAgICAgICJnbG9iIjogIl41LjAuMTUiLAorICAgICAgICAiaGFuZGxlYmFycyI6ICJeNC4wLjEiLAorICAgICAgICAianMteWFtbCI6ICIzLngiLAorICAgICAgICAibWtkaXJwIjogIjAuNS54IiwKKyAgICAgICAgIm5vcHQiOiAiMy54IiwKKyAgICAgICAgIm9uY2UiOiAiMS54IiwKKyAgICAgICAgInJlc29sdmUiOiAiMS4xLngiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjMuMS4wIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sdU8zRFZkNTlxMUp6UU1tYzlIREVuWjdwWUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMTUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi01LjAuMTUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzhrMnVlQXZTbUEvekNJdXozWXowd3VMazdFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIjIgfHwgMyIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy1mbGFnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWZsYWcvLS9oYXMtZmxhZy0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uWjU1TVdYT0FYb0E4QVFZeEQrVUtuc2RFZm89IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTMuMi4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVphd0ZCTE9WUVhIWXBrbEdzcTQ4dTRwZlZQWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJoYXMtZmxhZyI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianMtdG9rZW5zIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzLXRva2Vucy8tL2pzLXRva2Vucy00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmRKVWZsY0UzY1V6S2lNcVFnc0N1MDZGUHU5VWRJSk8wYmVZYlBoSE40azZhcGdKdGlmY29DdFQ5YmN4T3BZQnRwRDJrQ002U2J6ZzRDYXVzVy9QS1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzLXlhbWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzLXlhbWwvLS9qcy15YW1sLTMuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUEl0MmNud21QZkw0aEtOd3FlaXV6NGJLZm56SFRCdjZIeVZnamFoQTZtUEx3UER6akRXcnBsSkJNakhVRnhrdS9OM0ZsbXJieVBjbGFkK0krNG1KM0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyZ3BhcnNlIjogIl4xLjAuNyIsCisgICAgICAgICJlc3ByaW1hIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJqczJ4bWxwYXJzZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMyeG1scGFyc2VyLy0vanMyeG1scGFyc2VyLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUDdZT3FnaWNWRUQ1TVo5UmRnek5CK0pKbHpNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInhtbGNyZWF0ZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAianNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNkb2MvLS9qc2RvYy0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNlB4QjY1VEFVNFdPMFd6eXIvNC9ZaGxHb3ZYbDBFVllmcEticFNyb1NqMHFCeFQ0L3hvZC9sNDBPcGttMzhkUkhSZFFnZGVZODM2TTB1Vm5KUUc3a2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc2NoZW1hLXRyYXZlcnNlLy0vanNvbi1zY2hlbWEtdHJhdmVyc2UtMC40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhiYkNINWRDWVU1VDhMY0VoaHVoN0hKODhIWHVXM3FzSTNZMHpPWkZLZlpFSGNwV2lIVS9KeHprNjI5QnJzYWIvbU1pSFF0aTl3TVArODQ1UlBlM1ZnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkvLS9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbmJlMWxKYXRQenorOHdwMUZDMHRrd3JYSmxFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImtsYXciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XY0VvNE54YzVCQWdFVkVaVHV1Y3Y0V0dVUFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS45IgorICAgICAgfQorICAgIH0sCisgICAgImxldm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGV2bi8tL2xldm4tMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Pd21TVHQrZkNEd0VrUDNVd0x4RUllQkhaTzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiLAorICAgICAgICAidHlwZS1jaGVjayI6ICJ+MC4zLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXJrZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuMy4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZWEyZUdXT3FOeFBjWHY4ZHlFUmRTci82Rm16dld3empNeHBmR0Ivc2JNY2NYb2N0K3hZK1l1a1BEK1FUVVp3eXZLN0Jad2NyNG0yMVdCT1c0MXBBa2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbWljLWZuIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWljLWZuLy0vbWltaWMtZm4tMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpmODR1eHp3aXVpSVZLaU9McGZZazdONDZUU3k4dWJUb25tbmVZOXZycEhOQW5wMFFCdDJCeFdWOWRPMy9qK0JvVkFiK2E1RzZZRFBXM001SE9kTVdRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1pYy1yZXNwb25zZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1pYy1yZXNwb25zZS8tL21pbWljLXJlc3BvbnNlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qNUVjdG5rSDdhbWZWL3E1SGdtb2FsMWcyUUhGSlJyYU90bXgwSnBJcWt4aEJoSS9sSlNsMW5NcFE0NWhWYXJ3TkVUT29XRWltbmRaNFFLMFJIeHV4UT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWluaW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYXRjaC8tL21pbmltYXRjaC0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUpIVlFFaHlxUExVVGd0OUI4M1BYdTZXM3J4NE12dkh2U1V2VG9vZ3B3b0dET1VRK3lEclIwSFJvdCt5T0NkQ083dTRoWDNwV2Z0NmtXQkJjcWgwVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeMS4xLjciCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTAuMC44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFgvS3Y4TTVmU1lsdUNLQ1l1aHFwNkFSc0YwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICIwLjAuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmdpdXJmd0F2bXdwQWQ5Zm1HRjRqZURWbDhnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm11dGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL211dGUtc3RyZWFtLy0vbXV0ZS1zdHJlYW0tMC4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NSFhPazd3aHVQcTBQaHZFMm42QkZlMGVlNnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmFuIjogeworICAgICAgInZlcnNpb24iOiAiMi4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL25hbi8tL25hbi0yLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJBZEp2N2ZCTGhXQysvQmxzME96YSttdlRhTlF0UCsxUnloaGh2RDk1cGdVSno2WE01SXpnbXhPa0l0Sjl0a29DaXBsdkFuWEkxdE5tbVVEL2VTY3lBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYXR1cmFsLWNvbXBhcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmF0dXJhbC1jb21wYXJlLy0vbmF0dXJhbC1jb21wYXJlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU3I2Lzd0ZFVIeXduclBzcHZidlJYSTFicFBjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5pY2UtdHJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25pY2UtdHJ5Ly0vbmljZS10cnktMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFuaDQ1ZGVlYjVvbE5ZN2VYODJCa1BPN1NTeFI1U1NZSmlQVHJUZEZVVll3QWw4Q0tNQTVOOVBqVFlrSGlSamlzVmN4Y1ExSFhkTGh4MnF4eEp6TE5RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub2RlLWFiaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub2RlLWFiaS8tL25vZGUtYWJpLTIuNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hYS9VQzZOcjMrdHFoSEdSc0F1dy9lZHo3L3E5bm5ldEJyS1d4ajZycFR0bSswWDlUMXFVN2xJRUhNUzN5TjlKd0FiUmlLVWJSUkZ5MVBMei95M2FhQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2VtdmVyIjogIl41LjQuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJub2RlLWludDY0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtaW50NjQvLS9ub2RlLWludDY0LTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaDZrR1hOczFYVEdDMlBsTTRSR0l1Q1hHaWpzPSIKKyAgICB9LAorICAgICJub29wLWxvZ2dlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub29wLWxvZ2dlci8tL25vb3AtbG9nZ2VyLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbEtLeFl6eFBFeGRWTUFmWWxtL1E2RUcycE1JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnBtbG9nIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25wbWxvZy8tL25wbWxvZy00LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMnVVcWF6dUtsVGFTSS9kQzhBemljVWNrNytJckVhT25OL2UwamQzWHR0MUtjR3B3eDMwdjUwbUw3b1B5ci9oOWJMM0U0YVpjY1Z3cHdQKzVXOVZqa2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyZS13ZS10aGVyZS15ZXQiOiAifjEuMS4yIiwKKyAgICAgICAgImNvbnNvbGUtY29udHJvbC1zdHJpbmdzIjogIn4xLjEuMCIsCisgICAgICAgICJnYXVnZSI6ICJ+Mi43LjMiLAorICAgICAgICAic2V0LWJsb2NraW5nIjogIn4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJudW1iZXItaXMtbmFuIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL251bWJlci1pcy1uYW4vLS9udW1iZXItaXMtbmFuLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ1h0Z0sxTkNLbElzR3Z1SGtER0ROcFFhQVIwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWluc3BlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWluc3BlY3QvLS9vYmplY3QtaW5zcGVjdC0xLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR0p6ZkJaNkRnREFtbnVhTTMxMDRqUjRzMU15eHIzWTN6Zkl5TjR6M1VkcU42OW9TUmFjTks4VWhub2JEZEMrN0oyQUhDakd3eFF1Yk5KZkU3MFNYWFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1rZXlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3Qta2V5cy8tL29iamVjdC1rZXlzLTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRlRNeUZVbTJ3QmNHSG5IMmVYbXo3dEM2SXdscVFaNm1WWis2ZG02dlo0SVFJSGpzNkZkTnNRQnVLR1B1VVVVWTZOZkp3MlBzaEMwOFRuNkx6TERPYWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9uLWZpbmlzaGVkIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uLWZpbmlzaGVkLy0vb24tZmluaXNoZWQtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUEV6WklHd2c4MTFNM21Tb1dseHFpMlFhVWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZWUtZmlyc3QiOiAiMS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25jZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmNlLy0vb25jZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdEc2FwM1dXSFVzUk9zRjluRkM2NzUzWGE5RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmV0aW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uZXRpbWUvLS9vbmV0aW1lLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQm5Rb0l3L1dkRU95ZVVzaXU2VW90b1o1WXRRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbWljLWZuIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcHRpbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcHRpbWlzdC8tL29wdGltaXN0LTAuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMmo2blJvYjZJYUdhRVJ3eWJwRHJGYUFaWm9ZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIn4wLjAuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJ+MC4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIndvcmR3cmFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd29yZHdyYXAvLS93b3Jkd3JhcC0wLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vOVhhYk5YQXZBQUkwM0kwdTY4YjdXTUZrUWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAib3B0aW9uYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcHRpb25hdG9yLy0vb3B0aW9uYXRvci0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5reGVRSjAvVFdNQjFzQzB3RnU2VUJnSzYyUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWlzIjogIn4wLjEuMyIsCisgICAgICAgICJmYXN0LWxldmVuc2h0ZWluIjogIn4yLjAuNCIsCisgICAgICAgICJsZXZuIjogIn4wLjMuMCIsCisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIsCisgICAgICAgICJ0eXBlLWNoZWNrIjogIn4wLjMuMiIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvcy10bXBkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtdG1wZGlyLy0vb3MtdG1wZGlyLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdStaMEJzZWFxRnhjL3NkbS9sYzBWVjM2RW5RPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhcnNldXJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNldXJsLy0vcGFyc2V1cmwtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vQ2lkVHRpWk1SbEdEQlZpVXlZczNJM21XL009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1pcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWFic29sdXRlLy0vcGF0aC1pcy1hYnNvbHV0ZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUYwdVNhSE5WTlArOGVzNXI5VHBhbmh0Y1gxOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWlzLWluc2lkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWluc2lkZS8tL3BhdGgtaXMtaW5zaWRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTmxRWDN0NUVRdzBjRWE5aEFuK3M4SFM5L0ZNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgta2V5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RUnl0dFhURm9VRFRwTEdSRFVEWURNbjBDMEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLXBhcnNlLy0vcGF0aC1wYXJzZS0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1NtT1QyRWJIcklOQmY5U1I3Q0RFTHdsSjhBRU5rM1FuN09pa0s0bkZZQXUzT3RlMitKWU5WdmtwQUVRbTMvVExORUpGRC94Wkpqenl4ZzNLQldPenc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waWZ5Ly0vcGlmeS0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdSUWFhc0JEcUVucVdJU1k1OXlvc1ZNdzZRdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLy0vcGlua2llLTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY2xWcmdNK2cxSXFYVG9EbmNram9EdFQzK0hBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZS1wcm9taXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS1wcm9taXNlLy0vcGlua2llLXByb21pc2UtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JVFhXMzZlaldNQnBySnNYaDNZb2dpaEZEL289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwbHVyYWxpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGx1cmFsaXplLy0vcGx1cmFsaXplLTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BUmhCT2R6UzNlNDFGYmtXL1hXclRFdHVrcXFMb0s1K1ovNFVlRGFMdVNXKzM5SlBlRmdzNGdDR3FzckpIVlpYMGZVcngvLzRPRjBLMUNVR3dsSUZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJlYnVpbGQtaW5zdGFsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmVidWlsZC1pbnN0YWxsLy0vcHJlYnVpbGQtaW5zdGFsbC00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN3RheXhlWWJvSlgwUmJWemRuS3lHbDJ2aFFSV3I2cWZDbEVYRGhPa1hqdWFPS0N3MnE4YWl1RmhPTlJZVnNHL2N6aWE3S2hweWtJbEkyUzJWYVB1bkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRldGVjdC1saWJjIjogIl4xLjAuMyIsCisgICAgICAgICJleHBhbmQtdGVtcGxhdGUiOiAiXjEuMC4yIiwKKyAgICAgICAgImdpdGh1Yi1mcm9tLXBhY2thZ2UiOiAiMC4wLjAiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMi4wIiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAibm9kZS1hYmkiOiAiXjIuMi4wIiwKKyAgICAgICAgIm5vb3AtbG9nZ2VyIjogIl4wLjEuMSIsCisgICAgICAgICJucG1sb2ciOiAiXjQuMC4xIiwKKyAgICAgICAgIm9zLWhvbWVkaXIiOiAiXjEuMC4xIiwKKyAgICAgICAgInB1bXAiOiAiXjIuMC4xIiwKKyAgICAgICAgInJjIjogIl4xLjEuNiIsCisgICAgICAgICJzaW1wbGUtZ2V0IjogIl4yLjcuMCIsCisgICAgICAgICJ0YXItZnMiOiAiXjEuMTMuMCIsCisgICAgICAgICJ0dW5uZWwtYWdlbnQiOiAiXjAuNi4wIiwKKyAgICAgICAgIndoaWNoLXBtLXJ1bnMiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicHJlbHVkZS1scyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmVsdWRlLWxzLy0vcHJlbHVkZS1scy0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlaTXFWSjllVXYvWnFDZjFjT0JMNWlxWDJsUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dGllciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHRpZXIvLS9wcmV0dGllci0xLjE0LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFaRFZuQ3JucHNSSkpxNW5Tc2lIQ0UzQllNRUQyT3RzSStjbXpJekYxUUlmcW01QUxmOHRFSmNPMjd6VjFnS05LUlBkaGpPMGROV25yenNzRFExdEZnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dGllci1saW50ZXItaGVscGVycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmV0dGllci1saW50ZXItaGVscGVycy8tL3ByZXR0aWVyLWxpbnRlci1oZWxwZXJzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HYksyY1A5bnJhU1NVRjlOMlh3VXdxZnpsQUZsTU5ZWWwrU2hFL1YrSDhhOXVObC9vVXFCMXcyRUw1NEpoME9seVJTZDhSZldZSjNjb1ZTNFRST1Aydz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmFzdC1kaWZmIjogIl4xLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9jZXNzLW5leHRpY2stYXJncy8tL3Byb2Nlc3MtbmV4dGljay1hcmdzLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NdEVDMVRxTjBFVTVuZXBoYUo0ckF0VGhIdEM4NmROTjlxQ3VFaHRzaHZwVkJrQVc1Wk83QkFTTjlSRW5GOWVvWEdjUnViK3BGdUtFcE9IRStIYkVNdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJvZ3Jlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT0UrYTZ2enFhemMrSzZMeEpyWDVVUHlLRnZHbkw1Q1ltcTJqRkdOSUJXSHBjNFF5RTQ5L1lPdW1jcnBRRkpwZmVqbXZSdGJKemdPMXpQbU1DcWxiQmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInB1bXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVtcC8tL3B1bXAtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJ1UE1OUmtOM01IUDFjV0pjOU9XcitUL3hEUDBqaFhZQ0xmSmNCdVg1NGhoZklCbmFRbUFVTWZEY0c0RE01VU1XQnlCYkpZNjlRU3BobTNqdERLSWtBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjEuMCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJwdW55Y29kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW55Y29kZS8tL3B1bnljb2RlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1YUnNSamRmK2o1bWwreS82R0tIUFpickYvOHAyWWdhMEpQdGRxVElZMlhlNW9oSlBEOXNhREpKTFB2cDkrTlNCcHJWdmV2ZFhaeWJuajJjdjhPRWQwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xLy0vcS0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZqTDNXMEU0RXBIUVJoSHh2eFFRbXNBR1VkYz0iCisgICAgfSwKKyAgICAicmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmMvLS9yYy0xLjIuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteTNiR2dxS2ozUUJkeExiTGtvbWxvaGt2c0E4Z2RBaVVRbFNCSm5CaGZuK0JQeGc0YmM2MmQ4VGNCVzE1d2F2RGZnZXhDZ2NjY2toY1p2eXd5UVlQT3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXh0ZW5kIjogIl4wLjYuMCIsCisgICAgICAgICJpbmkiOiAifjEuMy4wIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjIuMCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjEuMS4xIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWdleHBwIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZ2V4cHAvLS9yZWdleHBwLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sdjBNNitUa0RWbmlBM2FEMUVnMERWcGZVL2Jvb1N1N0VldjNURE8vbVpLSEJmVmpnQ0dUVjR0NGJ1cHBFU0VZRHRrQXJZRk94VEpXdjZTNUMraWFOdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVxdWlyZS11bmNhY2hlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1aXJlLXVuY2FjaGVkLy0vcmVxdWlyZS11bmNhY2hlZC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRnMVcxc2xtTDlNZVF3RWNTNVdxU1pWVUlkTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYWxsZXItcGF0aCI6ICJeMC4xLjAiLAorICAgICAgICAicmVzb2x2ZS1mcm9tIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS4xLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JREVVMkNyU3hlMmVqZ1FSczVNb2RlaUo2WHM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVzb2x2ZS1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZnJvbS8tL3Jlc29sdmUtZnJvbS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpzditrMTBhN3VxN0tidy81YTZ3SHBQVVFpWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXN0b3JlLWN1cnNvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXN0b3JlLWN1cnNvci8tL3Jlc3RvcmUtY3Vyc29yLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjM3aWgvZ3YweWJVL1JZcEk5WWhLZTdnMzY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uZXRpbWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXN1bWVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc3VtZXIvLS9yZXN1bWVyLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOGVqMFllUUdTNk9lZ3E4ODNDcU1pVDBIWjFrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAifjIuMy40IgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJydW4tYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcnVuLWFzeW5jLy0vcnVuLWFzeW5jLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQTNHclN1QzkxeURVRm0xOS9hWlA5NlJGcHNBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXByb21pc2UiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJ4anMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcnhqcy8tL3J4anMtNi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUpUV21vWTl0V0NzN3p2SWsvQ3ZSamhqR2FPZCtPVkJNOTg3bXhGbytPVzY2Y0dwZEtqWmNwbWM3NEVTMXNCLy83S2wvUEFlOCt3RWFrdWhHNHBjZ093PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0c2xpYiI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmVyLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlci1idWZmZXIvLS9zYWZlci1idWZmZXItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlabzNLODJTRDdSaXlpMEUxRVFQb2pMejdrcGVwblNRSTlJeVBiSEhnMVhYWGV2YjVkSkk3dHB5TjJBRHhHY1FiSEc3dmN5UkhrMGNid3FjUXJpVXRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZW12ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2VtdmVyLy0vc2VtdmVyLTUuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SUzlSNlIzNU5ZZ1FuKytma0RXYU9tcUdvajRFazlnR3MrRFB4TlVaS3V3RTE4M3hqSnJvS3Z5bzFJelZGZVh2VXJ2bUFMeTZGV0Q1eHJkSlQyNWdNZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2V0LWJsb2NraW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NldC1ibG9ja2luZy8tL3NldC1ibG9ja2luZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJGK1hndEFScnBwb0E5M1RnckpEa3JQWWtQYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2lnbmFsLWV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2lnbmFsLWV4aXQvLS9zaWduYWwtZXhpdC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmM0FqeEtINmhGNFlvNUJYaVVUSzNOa2JHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaW1wbGUtY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpbXBsZS1jb25jYXQvLS9zaW1wbGUtY29uY2F0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYzBUTHVMYmliN0o5WnJMOGh2bjIxWmwxSWNZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1nZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjguMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWdldC8tL3NpbXBsZS1nZXQtMi44LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxTU0hSU3czbVFOVUdQQVlScW83eHk5ZGhLbXhGWElqTGpwNEtIcGY5OUdFSDJWSDdDM0FNK1FmeDZkdTZqaGZVaTZWbTdYbmJFVkVmN1diNk44alJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWNvbXByZXNzLXJlc3BvbnNlIjogIl4zLjMuMCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMSIsCisgICAgICAgICJzaW1wbGUtY29uY2F0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzbGljZS1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NsaWNlLWFuc2kvLS9zbGljZS1hbnNpLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QT3F4Qks2TGIzcTZzMDQ3RC9Yc0RWTlBuRjlEbDhKU2FxZTloOWxVUmwwT2ROcXkvdWpEck9pSUh0c3FYTUdiV1dUSW9tUnpBTWFUeWF3QVUvL1JlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ycmMvdlB3cnFCbTAzZ085YjI2cVNCWkxQNTA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFtZGVmaW5lIjogIj49MC4wLjQiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJPYVNiMllvbFRWUFBkQVZJRFl6dUZjcGZpdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdGF0dXNlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdGF0dXNlcy8tL3N0YXR1c2VzLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK3ZVYm5yZEtydk96clBTdFgyR3I4a3kzdVQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0cmluZy13aWR0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmctd2lkdGgvLS9zdHJpbmctd2lkdGgtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5PcUg1OWRlQ3E5U1JIbHhxMUF3ODVKbnQ0dzZLdkxLcVdWaWs2b0E5WmtsWExOSU9scWc0RjJ5clQxTVZhVGpBcXZWd2RmZVo3dzdhQ3ZKRDd1Z2t3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMi4wLjAiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nLnByb3RvdHlwZS50cmltIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy5wcm90b3R5cGUudHJpbS8tL3N0cmluZy5wcm90b3R5cGUudHJpbS0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTBFM2l5SjRUZjAxOUlHOElhMTdTK3VhK2pPbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydGllcyI6ICJeMS4xLjIiLAorICAgICAgICAiZXMtYWJzdHJhY3QiOiAiXjEuNS4wIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFFZVFJdXNhdzJpb2NUaWJZMUppeFFYdU5vOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUEZNWlF1a0l3bWw4RHNORWhZd29iSHlncGdvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFqVmp3ZFhJdDQwOE1JaUFxQ1g0b1VLc2dVMkVxQUd6czJQcGttNGFRWWJqbStaRVdFY1c0U2ZGTlRyNHVNTlptYTBleTRmNWxnTHJrQjBhWDBRTW93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtZmxhZyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFibGUvLS90YWJsZS01LjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZTU0MmluMjJaTGhEL2ZPSXVYcy84eURaOVc2MWx0RjhkYU04OHJrUk50Z1RJY3QrdkkyZlRuQXl1L0RiMlRDZkVjSThpN21qWno2bWVMcTBuVzdUWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFqdiI6ICJeNi41LjMiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIiwKKyAgICAgICAgInNsaWNlLWFuc2kiOiAiMS4wLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4yLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRhcGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjkuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFwZS8tL3RhcGUtNC45LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZmS0lYa25McG9lL0pwNHJ6SEtGUHBKVUhESERxbjhqdXM5OUlmUG5ISWp5ejc4SFlsZWZUR0QzYjVFa2JRenVMZmFFdm1mUEszSW9sTGdxMnhUM2t3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWVxdWFsIjogIn4xLjAuMSIsCisgICAgICAgICJkZWZpbmVkIjogIn4xLjAuMCIsCisgICAgICAgICJmb3ItZWFjaCI6ICJ+MC4zLjMiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJ+MS4xLjEiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAiaGFzIjogIn4xLjAuMyIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAibWluaW1pc3QiOiAifjEuMi4wIiwKKyAgICAgICAgIm9iamVjdC1pbnNwZWN0IjogIn4xLjYuMCIsCisgICAgICAgICJyZXNvbHZlIjogIn4xLjcuMSIsCisgICAgICAgICJyZXN1bWVyIjogIn4wLjAuMCIsCisgICAgICAgICJzdHJpbmcucHJvdG90eXBlLnRyaW0iOiAifjEuMS4yIiwKKyAgICAgICAgInRocm91Z2giOiAifjIuMy44IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAicmVzb2x2ZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjcuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuNy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYzdyd0xvZnA4ZzFVK2gxS055SEwvamljcktnMUVrNHErTHIzM0FMNjV1WlRpblVaSGUzMEQ1SGx5TjVWOU5XMEpYMUQ1ZFhRNGpxVzVsN1N5L2tHZnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgInBhdGgtcGFyc2UiOiAiXjEuMC41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRhci1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTYuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFyLWZzLy0vdGFyLWZzLTEuMTYuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTnZDZVhwWXg3T3NtT2g4eklPUC9lYkc1NXpabXhMRTBldGZXUmJXb2srcTJRbzh4L3ZPUi9JSlQxdGFBRFhQZStqc2l1OWF4RGIzWDRCK2lJZ05sS3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNob3duciI6ICJeMS4wLjEiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJwdW1wIjogIl4xLjAuMCIsCisgICAgICAgICJ0YXItc3RyZWFtIjogIl4xLjEuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicHVtcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bXAvLS9wdW1wLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItOGswSnVwV21lNTUrOXRDVkUrRlM1VUxUM0s2QWJncXJHYTU4bFRUNDlScHlmd3djR2VkSHFhQzVMbFFOZEVBdW1uL3dGc3U2YVB3a3VQTWlveThrcXc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMS4wIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0YXItc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rhci1zdHJlYW0vLS90YXItc3RyZWFtLTEuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1yelMwaGVpTmY4WG43L21wZFNWVlNNQVdBb3k5YmZiMVdPVFlDNzhaMFVRS2VLYS9DV1M4Rk9xMGxLR05hOERXS0FuOWd4akN2TUxZYzVQR1hZbEsyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmwiOiAiXjEuMC4wIiwKKyAgICAgICAgImJ1ZmZlci1hbGxvYyI6ICJeMS4yLjAiLAorICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4wLjAiLAorICAgICAgICAiZnMtY29uc3RhbnRzIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMy4wIiwKKyAgICAgICAgInRvLWJ1ZmZlciI6ICJeMS4xLjEiLAorICAgICAgICAieHRlbmQiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInRleHQtdGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGV4dC10YWJsZS8tL3RleHQtdGFibGUtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mMTdvSTY2QVVnZkFDdkxmU29Uc1A4K2xjTFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gvLS90aHJvdWdoLTIuMy44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGRUSi82cThOWGxnc2Jja0VWMStEb2FpNGZVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRtcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4zMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG1wLy0vdG1wLTAuMC4zMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItalJDSmxvaktuWjNhZGR0VE9qZElxb1J1UEVLQnZOWGNHWXF6TzZ6V1pYOEtmS0VwbkdZNWpmZ2dKUTNFakt1dThENGJKUnIweStjWUpGbVliSW1YR3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9zLXRtcGRpciI6ICJ+MS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLWJ1ZmZlci8tL3RvLWJ1ZmZlci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHg5QjVpdjdtc3VGWUUzZHl0VCtLRTV0YXArck5ZdytLNGpWa2I5Ui9hc0FiK3BiQlNNMTdqdHVuSHBsaEJlNlJSSmRaeDNQbjJKcGgyNE8zMm1PVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRzbGliIjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RzbGliLy0vdHNsaWItMS45LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRrckY4c2NwZWpoYU9ncXpCRWNHTTd5RElFZmkwLzgrOHpEUlpoTlpaMmtqbUhKNGh2M3pDYlFXeG9KR3oxaXc1VTBKbDBubWExM3h6SFhjbmNNYXZRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dW5uZWwtYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHVubmVsLWFnZW50Ly0vdHVubmVsLWFnZW50LTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjZYZW9HczJzRW9LbVdaM1N5a0lhUEQ4UVAwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0eXBlLWNoZWNrIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGUtY2hlY2svLS90eXBlLWNoZWNrLTAuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0lUS3RSTFBIVFZlUDdlRTh3Z0VzclVnMjNJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZXNjcmlwdC8tL3R5cGVzY3JpcHQtMy4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRETVlmVnR2cGI5Nm1zUzFsRFg5TUVkSHJXNHlPdVo0S2RjNEhpbTlvVTc5NlhsZFBZRi90Mit1S29YMEJCYTBoWFh3RGxxWVFiWFk1UnpqemM1aEJBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1Z2xpZnktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjQuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTMuNC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04Q0pzYktPdEVibkpzVHl2NkxFNm02WktuaXFNaUZXbW05c1Jib3Bia0dzM2dNUFBmZDNGaDhpSUE0WWt2NU1nYVRicUhyNEJhb0dMSkxaTmhzclcxUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbW1hbmRlciI6ICJ+Mi4xNy4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuNi4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjb21tYW5kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xNy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tbWFuZGVyLy0vY29tbWFuZGVyLTIuMTcuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXdQTVV0NkZuSDJ5ekc5NVNBNm16alFPRUtVVTNhTGFERW16czF0aSsxRTloK0NzclpnaFJscUVNL0VKNEtzY3NRVkc4dU5ONHVWcmVVZVQ4K2RybGdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVqZ2FwdW1XbGJNaGtCZ3pUN1lrYzVZWFVUNDZGMGlLdThTR1hxMGJjd1A1ZHovaDBQbGo2ZW5KcWp6MVpicTJsNVdhcVluclZid1dPV015RjNGNDdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5kZXJzY29yZS1jb250cmliIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUtY29udHJpYi8tL3VuZGVyc2NvcmUtY29udHJpYi0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpsdG13a2VEK1BvckdNbjR5N0RpeDlTTUpzYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVucGlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnBpcGUvLS91bnBpcGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcjlPNkZGS3JtRmx0SUY0S2RJYkx2U1pCT3c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXJpLWpzIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1qcy8tL3VyaS1qcy00LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1k5RnJtaXJxbDkxWDJRZ2pyeTBXZDRZK1lUZHJkWmhlUzhURnd2a2JMV2YvRzVLTkpEQ2g2cEtMNU9aY3RFVzQrMEJhYTVpZEsyWlF1RUxSd1B6blE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInB1bnljb2RlIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1dGYtOC12YWxpZGF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGYtOC12YWxpZGF0ZS8tL3V0Zi04LXZhbGlkYXRlLTQuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DUzYzU3NwNnp5bkJRNEl4VnpnalA1QWJkbzZMdUo4N0hGSWNnSWlWVWVZOTYrTVRIa3FLdHJVaHBoYndRNmpYOGFTR1p2OHpYNmwxRENQcGZjQW54QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmluZGluZ3MiOiAifjEuMy4wIiwKKyAgICAgICAgIm5hbiI6ICJ+Mi4xMC4wIiwKKyAgICAgICAgInByZWJ1aWxkLWluc3RhbGwiOiAifjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInV0aWwtZGVwcmVjYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWwtZGVwcmVjYXRlLy0vdXRpbC1kZXByZWNhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SUTFOeWZwdzNuTW5ZdnZTMUtLSmdVR2FETTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXRpbHMtbWVyZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbHMtbWVyZ2UvLS91dGlscy1tZXJnZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW41VnhEMUNpWjVSN0xNd1NSMEhCQW9RbjV4TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aGljaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IeEpkWVdxMU1USVFiSjNudzBjcXNzSG9UTlUyNjdLbHJEdUdaMVdZbHhEU3RVdEtVaE9hSm1oMTEyL1RabUh4eFVmdUpxUFhTT203dER5YXMwT1NJUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoLXBtLXJ1bnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hpY2gtcG0tcnVucy8tL3doaWNoLXBtLXJ1bnMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ad3M2KzhWUzRMVmQ5cmQ0REtkR0ZmSTYwY3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2lkZS1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aWRlLWFsaWduLy0vd2lkZS1hbGlnbi0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUUdrT1FjOFhMNkJ0NVB3bnNFeEtCUHVNS0J4bkd4V1dXM2ZVNTVYdDRmZUhvek1VaGRVTWFCQ2syOTBxcG0vd0c1dS9SU0t6d2RBQzRpNTFZaWdpaEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMS4wLjIgfHwgMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjFoSUVJa1VWcVFYSEkwQ0prUWEzcERMeXVzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyYXBweSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cmFwcHkvLS93cmFwcHktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3JpdGUvLS93cml0ZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVg4QTRLT0prenFQK2tVVlVkdmVqeFdiTEIxYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIgorICAgICAgfQorICAgIH0sCisgICAgIndzIjogeworICAgICAgInZlcnNpb24iOiAiNS4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dzLy0vd3MtNS4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWphSEZENlBGdjZVZ29JVmRhNnFabGxwdFFzTWxERUprVFFjeWJ6elhEWU0xWE85WThlbTY5MUZHTVBtTTQ2V0d5TFU0ejlLTWdRTitxcnV4L25obEhBPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94dGVuZC8tL3h0ZW5kLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGNiVk1yNWxiaVBiZ2c3N2xEb2ZCSm1OWTY4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZS5qc29uIGIvcGFja2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTUzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlLmpzb24KQEAgLTAsMCArMSw2NiBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAiZGVzY3JpcHRpb24iOiAibm9kZS5qcyBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIsCisgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIiwKKyAgInJlcG9zaXRvcnkiOiB7CisgICAgInR5cGUiOiAiZ2l0IiwKKyAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgfSwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAiYXV0aG9yIjogeworICAgICJuYW1lIjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIsCisgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCisgICAgInVybCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIH0sCisgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAibGljZW5zZXMiOiBbCisgICAgeworICAgICAgInR5cGUiOiAiQXBhY2hlLTIuMCIsCisgICAgICAidXJsIjogImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCIKKyAgICB9CisgIF0sCisgICJidWdzIjogeworICAgICJtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCisgICAgInVybCI6ICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIKKyAgfSwKKyAgImZpbGVzIjogWworICAgICJsaWIvbm9kZWpzL2xpYi90aHJpZnQiLAorICAgICJsaWIvbm9kZWpzL1JFQURNRS5tZCIKKyAgXSwKKyAgImRpcmVjdG9yaWVzIjogeworICAgICJsaWIiOiAiLi9saWIvbm9kZWpzL2xpYi90aHJpZnQiCisgIH0sCisgICJtYWluIjogIi4vbGliL25vZGVqcy9saWIvdGhyaWZ0IiwKKyAgImVuZ2luZXMiOiB7CisgICAgIm5vZGUiOiAiPj0gNC4xLjAiCisgIH0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgIm5vZGUtaW50NjQiOiAiXjAuNC4wIiwKKyAgICAicSI6ICJeMS41LjAiLAorICAgICJ3cyI6ICJeNS4wLjAiCisgIH0sCisgICJkZXZEZXBlbmRlbmNpZXMiOiB7CisgICAgImJ1ZmZlci1lcXVhbHMiOiAiXjEuMC40IiwKKyAgICAiY29tbWFuZGVyIjogIl4yLjE0LjEiLAorICAgICJjb25uZWN0IjogIl4zLjYuNiIsCisgICAgImVzbGludCI6ICJeNS43LjAiLAorICAgICJlc2xpbnQtY29uZmlnLXByZXR0aWVyIjogIl4zLjEuMCIsCisgICAgImVzbGludC1wbHVnaW4tcHJldHRpZXIiOiAiXjMuMC4wIiwKKyAgICAiaXN0YW5idWwiOiAiXjAuNC41IiwKKyAgICAianNkb2MiOiAiXjMuNS41IiwKKyAgICAicHJldHRpZXIiOiAiXjEuMTQuMyIsCisgICAgInRhcGUiOiAiXjQuOS4wIiwKKyAgICAidXRmLTgtdmFsaWRhdGUiOiAiXjQuMC4wIiwKKyAgICAidHlwZXNjcmlwdCI6ICJeMy4xLjYiLAorICAgICJAdHlwZXMvbm9kZSI6ICJeMTAuMTIuNiIsCisgICAgIkB0eXBlcy9xIjogIl4xLjUuMSIKKyAgfSwKKyAgInNjcmlwdHMiOiB7CisgICAgImNvdmVyIjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIENPVkVSIiwKKyAgICAidGVzdCI6ICJsaWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaCIsCisgICAgInRlc3QtdHMiOiAibGliL25vZGV0cy90ZXN0L3Rlc3RBbGwuc2giLAorICAgICJwcmV0dGllciI6ICJwcmV0dGllciAtLXdyaXRlICcqKi8qLmpzJyIsCisgICAgImxpbnQiOiAiZXNsaW50IGxpYi9ub2RlanMvLiAtLWV4dCAuanMiLAorICAgICJsaW50LXRlc3RzIjogImVzbGludCBsaWIvbm9kZWpzL3Rlc3QvLiAtLWV4dCAuanMiCisgIH0KK30KZGlmZiAtLWdpdCBhL3BocGNzLnhtbC5kaXN0IGIvcGhwY3MueG1sLmRpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwMzg4YQotLS0gL2Rldi9udWxsCisrKyBiL3BocGNzLnhtbC5kaXN0CkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHJ1bGVzZXQgbmFtZT0iQXBhY2hlX1RocmlmdCI+CisgICAgPGRlc2NyaXB0aW9uPlRoZSBjb2Rpbmcgc3RhbmRhcmQgZm9yIHRocmlmdC48L2Rlc2NyaXB0aW9uPgorCisgICAgPGZpbGU+bGliL3BocC9saWI8L2ZpbGU+CisgICAgPGZpbGU+bGliL3BocC90ZXN0PC9maWxlPgorICAgIDxleGNsdWRlLXBhdHRlcm4+bGliL3BocC90ZXN0L3BhY2thZ2VzLyo8L2V4Y2x1ZGUtcGF0dGVybj4KKworICAgIDxhcmcgbmFtZT0iYmFzZXBhdGgiIHZhbHVlPSIuIi8+CisgICAgPGFyZyBuYW1lPSJjb2xvcnMiIC8+CisgICAgPGFyZyBuYW1lPSJwYXJhbGxlbCIgdmFsdWU9IjQiIC8+CisKKyAgICA8cnVsZSByZWY9IlBTUjIiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJQU1IyLk1ldGhvZHMuTWV0aG9kRGVjbGFyYXRpb24uVW5kZXJzY29yZSIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJQU1IyLkNsYXNzZXMuUHJvcGVydHlEZWNsYXJhdGlvbi5VbmRlcnNjb3JlIi8+CisgICAgPC9ydWxlPgorCisgICAgPHJ1bGUgcmVmPSJQU1IxLkZpbGVzLlNpZGVFZmZlY3RzIj4KKyAgICAgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvKjwvZXhjbHVkZS1wYXR0ZXJuPgorICAgIDwvcnVsZT4KKyAgICA8cnVsZSByZWY9IkdlbmVyaWMuRmlsZXMuTGluZUxlbmd0aCI+CisgICAgICAgIDxleGNsdWRlLXBhdHRlcm4+bGliL3BocC90ZXN0Lyo8L2V4Y2x1ZGUtcGF0dGVybj4KKyAgICA8L3J1bGU+CisKKzwvcnVsZXNldD4KZGlmZiAtLWdpdCBhL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCBiL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjY5NjViCi0tLSAvZGV2L251bGwKKysrIGIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kCkBAIC0wLDAgKzEsMTkgQEAKK1NvbWUgaGVscGZ1bCB0aXBzIGZvciBhIHN1Y2Nlc3NmdWwgQXBhY2hlIFRocmlmdCBQUjoKKworKiBEaWQgeW91IHRlc3QgeW91ciBjaGFuZ2VzIGxvY2FsbHkgb3IgdXNpbmcgQ0kgaW4geW91ciBmb3JrPworKiBJcyB0aGUgQXBhY2hlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyIGluIHRoZSBQUiB0aXRsZT8KKyogSXMgdGhlIEFwYWNoZSBKaXJhIFRIUklGVCB0aWNrZXQgaWRlbnRpZmllciBpbiB0aGUgY29tbWl0IG1lc3NhZ2U/CisqIERpZCB5b3Ugc3F1YXNoIHlvdXIgY2hhbmdlcyB0byBhIHNpbmdsZSBjb21taXQ/CisqIEFyZSB0aGVzZSBjaGFuZ2VzIGJhY2t3YXJkcyBjb21wYXRpYmxlPyAocGxlYXNlIHNheSBzbyBpbiBQUiBkZXNjcmlwdGlvbikKKyogRG8geW91IG5lZWQgdG8gdXBkYXRlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBSRUFETUU/CisKK0V4YW1wbGUgaWRlYWwgcHVsbCByZXF1ZXN0IHRpdGxlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBhbiBleGFtcGxlIHB1bGwgcmVxdWVzdCB0aXRsZQorCitFeGFtcGxlIGlkZWFsIGNvbW1pdCBtZXNzYWdlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBbc3VtbWFyeSBvZiBmaXgsIG9uZSBsaW5lIGlmIHBvc3NpYmxlXQorICAgICAgICBDbGllbnQ6IFtsYW5ndWFnZShzKSBhZmZlY3RlZCwgY29tbWEgc2VwYXJhdGVkLCB1c2UgbGliLyBkaXJlY3RvcnkgbmFtZXMgcGxlYXNlXQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb21taXR0aW5nLCBzZWUgQ09OVFJJQlVUSU5HLm1kCmRpZmYgLS1naXQgYS9yYXRfZXhjbHVkZSBiL3JhdF9leGNsdWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGNjZWQ1Li4wMDAwMDAwCi0tLSBhL3JhdF9leGNsdWRlCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLmdpdGlnbm9yZQotQ0hBTkdFUwotQ09OVFJJQlVUT1JTCi1hdXRvc2Nhbi5sb2cKLWNvbmZpZy5ndWVzcwotY29uZmlnLmxvZwotY29uZmlnLnN0YXR1cwotY29uZmlnLnN1YgotY29uZmlndXJlCi1jb25maWd1cmUuc2NhbgotZGVwY29tcAotaW5zdGFsbC1zaAotbGlidG9vbAotbHRtYWluLnNoCi1taXNzaW5nCi1zdGFtcC1oMQoteWx3cmFwCi0qLm00Ci1hdXRvbTR0ZS5jYWNoZQotdGhyaWZ0eS5oCi12ZXJzaW9uLmgKLXZlcnNpb24uaC5pbgotbWQ1LmMKLW1kNS5oCi1kb2MKLWxpYi9lcmwvdnNuLm1rCi0vbGliL2VybC9idWlsZC8qKi8qCi1saWIvZXJsL3NyYy9NYWtlZmlsZQotdGhyaWZ0LmFwcHVwLnNyYwotT0NhbWxNYWtlZmlsZQotUkVBRE1FLU9DYW1sTWFrZWZpbGUKLVRPRE8KLU1hbmlmZXN0Ci1zZXR1cC5yYgpkaWZmIC0tZ2l0IGEvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIGIvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkNWVjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNDAgQEAKK++7vyMgQXBhY2hlIFRocmlmdCDCqSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisKKyMgRmlsZTogc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCisjIEFwYWNoZSBUaHJpZnQgY29uZmlndXJhdGlvbiBmaWxlIGZvciBTb25hciBodHRwczovL2FuYWx5c2lzLmFwYWNoZS5vcmcvCisjIFNvbmFyIGlzIGFuIG9wZW4gcGxhdGZvcm0gdG8gbWFuYWdlIGNvZGUgcXVhbGl0eSBodHRwOi8vd3d3LnNvbmFyc291cmNlLm9yZy8KKworCisjIHJlcXVpcmVkIG1ldGFkYXRhCitzb25hci5wcm9qZWN0S2V5PW9yZy5hcGFjaGUudGhyaWZ0Citzb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0Citzb25hci5wcm9qZWN0RGVzY3JpcHRpb249CitUaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBmcmFtZXdvcmssIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworZGV2ZWxvcG1lbnQsIGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQKK3NlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIGFsbCBtYWpvciBsYW5ndWFnZXMuCisKKyMgQXBhY2hlIFRocmlmdCBWZXJzaW9uCitzb25hci5wcm9qZWN0VmVyc2lvbj0xLjAuMAorIyB1c2UgdGhpcyB0byBzZXQgYW5vdGhlciB2ZXJzaW9uIHN0cmluZworIyAkIHNvbmFyLXJ1bm5lciAtRCBzb25hci5wcm9qZWN0VmVyc2lvbj1gZ2l0IHJldi1wYXJzZSBIRUFEYAorIyBzZXQgcHJvamVjdERhdGUgaW4gY29tYmluYXRpb24gd2l0aCBwcm9qZWN0VmVyc2lvbiBmb3IgaW1wb3J0cyBvZiBvbGQgcmVsZWFzZXMKKyNzb25hci5wcm9qZWN0RGF0ZT15eXl5LU1NLWRkCisKKyMgVE9ETyBhZGQgd2Vic2l0ZSAoc29uYXIucHJvamVjdFVybCBkb2VzIG5vdCB3b3JrKQorI3NvbmFyLlhYWFg9aHR0cC8vdGhyaWZ0LmFwYWNoZS5vcmcKKworIyBTb21lIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIGluaGVyaXRlZCBieSB0aGUgbW9kdWxlcworc29uYXIuc291cmNlcz1zcmMKK3NvbmFyLmxhbmd1YWdlPWphdmEsanMsYysrLHB5LGMKK3NvbmFyLnNvdXJjZUVuY29kaW5nPVVURi04CisKKyMgc2NtCitzb25hci5zY20udXJsPXNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CisKKyMgY3BwY2hlY2sgLXEgLS1lcnJvci1leGl0Y29kZT0wIC0teG1sIC4gMj4gY3BwY2hlY2stcmVzdWx0LnhtbAorc29uYXIuY3h4LmNwcGNoZWNrLnJlcG9ydFBhdGg9Y3BwY2hlY2stcmVzdWx0LnhtbAorCisjIExpc3Qgb2YgdGhlIG1vZHVsZSBpZGVudGlmaWVycworc29uYXIubW9kdWxlcz1tb2R1bGUxLG1vZHVsZTMsbW9kdWxlNCxtb2R1bGU1LG1vZHVsZTYsbW9kdWxlNyxtb2R1bGU4LG1vZHVsZTksbW9kdWxlMTAsbW9kdWxlMTEsbW9kdWxlMTIsbW9kdWxlMTQKKworCisKKyMgd2UgbmVlZCBzb25hci1ydW5uZXIgMi4xIGZvciB0aGlzLCBzZWUgaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9TT05BUlBMVUdJTlMtMjQyMQorI3NvbmFyLm1vZHVsZXM9bW9kdWxlMgorCisjIGRlbHBoIHBsdWdpbiBpcyBicm9rZW4KKyNzb25hci5tb2R1bGVzPW1vZHVsZTEzCisKKyMgcGhwdW5pdCBwbHVnaW4gaXMgYnJva2VuCisjc29uYXIubW9kdWxlcz1tb2R1bGUxNQorCittb2R1bGUxLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhIExpYnJhcnkKK21vZHVsZTEuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2phdmEKK21vZHVsZTEuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTEuc29uYXIudGVzdHM9dGVzdAorbW9kdWxlMS5zb25hci5iaW5hcmllcz1idWlsZC9saWJzL2xpYnRocmlmdC0xLjAuMC5qYXIKK21vZHVsZTEuc29uYXIubGlicmFyaWVzPWJ1aWxkL2RlcHMvKi5qYXIKK21vZHVsZTEuc29uYXIubGFuZ3VhZ2U9amF2YQorCittb2R1bGUyLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhIFR1dG9yaWFsCittb2R1bGUyLnNvbmFyLnByb2plY3RCYXNlRGlyPS4KK21vZHVsZTIuc29uYXIuc291cmNlcz10dXRvcmlhbC9qYXZhL3NyYywgdHV0b3JpYWwvamF2YS9nZW4tamF2YQorbW9kdWxlMi5zb25hci5iaW5hcmllcz10dXRvcmlhbC9qYXZhL3R1dG9yaWFsLmphcgorbW9kdWxlMi5zb25hci5saWJyYXJpZXM9bGliL2phdmEvYnVpbGQvZGVwcy8qLmphcixsaWIvamF2YS9idWlsZC9saWJzL2xpYnRocmlmdC0xLjAuMC5qYXIKK21vZHVsZTIuc29uYXIubGFuZ3VhZ2U9amF2YQorCittb2R1bGUzLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhU2NyaXB0IExpYnJhcnkKK21vZHVsZTMuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2pzCittb2R1bGUzLnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlMy5zb25hci5leGNsdXNpb25zPXRlc3QvKiovKgorbW9kdWxlMy5zb25hci5sYW5ndWFnZT1qcworCittb2R1bGU0LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhU2NyaXB0IFR1dG9yaWFsCittb2R1bGU0LnNvbmFyLnByb2plY3RCYXNlRGlyPXR1dG9yaWFsL2pzCittb2R1bGU0LnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlNC5zb25hci5sYW5ndWFnZT13ZWIKKworbW9kdWxlNS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gQysrIExpYnJhcnkKK21vZHVsZTUuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2NwcAorbW9kdWxlNS5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlNS5zb25hci50ZXN0cz10ZXN0Cittb2R1bGU1LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU2LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDKysgVHV0b3JpYWwKK21vZHVsZTYuc29uYXIucHJvamVjdEJhc2VEaXI9dHV0b3JpYWwvY3BwCittb2R1bGU2LnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlNi5zb25hci5leGNsdXNpb25zPWdlbi1jcHAvKiovKgorbW9kdWxlNi5zb25hci5sYW5ndWFnZT1jKysKKworbW9kdWxlNy5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gQysrIENyb3NzIExhbmd1YWdlIFRlc3QKK21vZHVsZTcuc29uYXIucHJvamVjdEJhc2VEaXI9dGVzdC9jcHAKK21vZHVsZTcuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTcuc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTguc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIENvbXBpbGVyCittb2R1bGU4LnNvbmFyLnByb2plY3RCYXNlRGlyPWNvbXBpbGVyL2NwcAorbW9kdWxlOC5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlOC5zb25hci5sYW5ndWFnZT1jKysKKworbW9kdWxlOS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUHl0aG9uIExpYnJhcnkKK21vZHVsZTkuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL3B5Cittb2R1bGU5LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU5LnNvbmFyLmxhbmd1YWdlPXB5CisKK21vZHVsZTEwLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBQeXRob24gVHV0b3JpYWwKK21vZHVsZTEwLnNvbmFyLnByb2plY3RCYXNlRGlyPXR1dG9yaWFsL3B5Cittb2R1bGUxMC5zb25hci5zb3VyY2VzPS4KK21vZHVsZTEwLnNvbmFyLmV4Y2x1c2lvbnM9Z2VuLXB5LyoqLyoKK21vZHVsZTEwLnNvbmFyLmxhbmd1YWdlPXB5CisKK21vZHVsZTExLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBQeXRob24gQ3Jvc3MgTGFuZ3VhZ2UgVGVzdAorbW9kdWxlMTEuc29uYXIucHJvamVjdEJhc2VEaXI9dGVzdC9weQorbW9kdWxlMTEuc29uYXIuc291cmNlcz0uCittb2R1bGUxMS5zb25hci5leGNsdXNpb25zPWdlbi0qLyoqLyoKK21vZHVsZTExLnNvbmFyLmxhbmd1YWdlPXB5CisKK21vZHVsZTEyLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBjX2dsaWIgTGlicmFyeQorbW9kdWxlMTIuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2NfZ2xpYgorbW9kdWxlMTIuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTEyLnNvbmFyLmxhbmd1YWdlPWMKKworbW9kdWxlMTMuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIERlbHBoaSBMaWJyYXJ5Cittb2R1bGUxMy5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvZGVscGhpCittb2R1bGUxMy5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMTMuc29uYXIudGVzdHM9dGVzdAorbW9kdWxlMTMuc29uYXIubGFuZ3VhZ2U9ZGVscGgKKworbW9kdWxlMTQuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEZsZXggKGFzMykgTGlicmFyeQorbW9kdWxlMTQuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2FzMworbW9kdWxlMTQuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTE0LnNvbmFyLmxhbmd1YWdlPWZsZXgKKworbW9kdWxlMTUuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFBIUCBMaWJyYXJ5Cittb2R1bGUxNS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvcGhwCittb2R1bGUxNS5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlMTUuc29uYXIubGFuZ3VhZ2U9cGhwCisKKyMgVE9ETyBhZGQgc29tZSBtb3JlIGxhbmd1YWdlcyBoZXJlCisKZGlmZiAtLWdpdCBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0IGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKaW5kZXggMWEzNDMyMC4uN2UyNGUxYyAxMDA2NDQKLS0tIGEvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKQEAgLTI4LDcgKzI4LDQ1IEBACiAgIGNwcC50eXBlID0gIkRlbnNlRm9vIiwKICAgcHl0aG9uLnR5cGUgPSAiRGVuc2VGb28iLAogICBqYXZhLmZpbmFsID0gIiIsCisgIGFubm90YXRpb24ud2l0aG91dC52YWx1ZSwKICkKIAotdHlwZWRlZiBzdHJpbmcgKCB1bmljb2RlLmVuY29kaW5nID0gIlVURi0xNiIgKSBub25fbGF0aW5fc3RyaW5nCitleGNlcHRpb24gZm9vX2Vycm9yIHsKKyAgMTogaTMyIGVycm9yX2NvZGUgKCBmb289ImJhciIgKQorICAyOiBzdHJpbmcgZXJyb3JfbXNnCit9IChmb28gPSAiYmFyIikKKwordHlwZWRlZiBzdHJpbmcgKCB1bmljb2RlLmVuY29kaW5nID0gIlVURi0xNiIgKSBub25fbGF0aW5fc3RyaW5nIChmb289ImJhciIpCiB0eXBlZGVmIGxpc3Q8IGRvdWJsZSAoIGNwcC5maXhlZF9wb2ludCA9ICIxNiIgKSA+IHRpbnlfZmxvYXRfbGlzdAorCitlbnVtIHdlZWtkYXlzIHsKKyAgU1VOREFZICggd2Vla2VuZCA9ICJ5ZXMiICksCisgIE1PTkRBWSwKKyAgVFVFU0RBWSwKKyAgV0VETkVTREFZLAorICBUSFVSU0RBWSwKKyAgRlJJREFZLAorICBTQVRVUkRBWSAoIHdlZWtlbmQgPSAieWVzIiApCit9IChmb28uYmFyPSJiYXoiKQorCisvKiBOb3RlIHRoYXQgYW5ub3RhdGlvbnMgb24gc2VudW0gdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworc2VudW0gc2Vhc29ucyB7CisgICJTcHJpbmciLAorICAiU3VtbWVyIiwKKyAgIkZhbGwiLAorICAiV2ludGVyIgorfSAoIGZvbyA9ICJiYXIiICkKKworc3RydWN0IG9zdHJfZGVmYXVsdCB7CisgIDE6IGkzMiBiYXI7Cit9CisKK3N0cnVjdCBvc3RyX2N1c3RvbSB7CisgIDE6IGkzMiBiYXI7Cit9IChjcHAuY3VzdG9tb3N0cmVhbSkKKworCitzZXJ2aWNlIGZvb19zZXJ2aWNlIHsKKyAgdm9pZCBmb28oKSAoIGZvbyA9ICJiYXIiICkKK30gKGEuYj0iYyIpCisKZGlmZiAtLWdpdCBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CmluZGV4IDdkOTcxZTYuLmE1NDUzNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKysrIGIvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdApAQCAtMTgsNiArMTgsNyBAQAogICovCiAKIG5hbWVzcGFjZSBjcHAgeW96b25lCituYW1lc3BhY2UgZXJsIGNvbnN0c18KIAogc3RydWN0IHRoaW5nIHsKICAgMTogaTMyIGhlbGxvLApAQCAtNDAsMTIgKzQxLDE2IEBACiAvL2NvbnN0IG1hcDxlbnVtY29uc3RhbnRzLHN0cmluZz4gR0VOX0VOVU1fTkFNRVMgPSB7T05FIDogIkhPV0RZIiwgVFdPOiAiUEFSVE5FUiJ9CiAKIGNvbnN0IGkzMiBoZXhfY29uc3QgPSAweDAwMDFGCitjb25zdCBpMzIgbmVnYXRpdmVfaGV4X2NvbnN0YW50ID0gLTB4MDAwMUYKIAogY29uc3QgaTMyIEdFTl9NRSA9IC0zNTIzNTUzCiBjb25zdCBkb3VibGUgR0VuX0RVQiA9IDMyNS41MzIKIGNvbnN0IGRvdWJsZSBHRW5fRFUgPSAwODUuMjM1NQogY29uc3Qgc3RyaW5nIEdFTl9TVFJJTkcgPSAiYXNsZGtqYXNmZCIKIAorY29uc3QgZG91YmxlIGUxMCA9IDFlMTAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCitjb25zdCBkb3VibGUgZTExID0gLTFlMTAgIAorCiBjb25zdCBtYXA8aTMyLGkzMj4gR0VOX01BUCA9IHsgMzU1MzIgOiAyMzMsIDQzNTIzIDogODUzIH0KIGNvbnN0IGxpc3Q8aTMyPiBHRU5fTElTVCA9IFsgMjM1MjM1LCAyMzU5ODM1MiwgMzI1MzUyMyBdCiAKZGlmZiAtLWdpdCBhL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKaW5kZXggMjNkNWQ5Ny4uYjZhNzY1OSAxMDA2NDQKLS0tIGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKysrIGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKQEAgLTIwLDYgKzIwLDcgQEAKIG5hbWVzcGFjZSBjX2dsaWIgVFRlc3QKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QuZGVidWcKIG5hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CituYW1lc3BhY2UgcmIgdGhyaWZ0LnRlc3QKIAogc3RydWN0IERvdWJsZXMgewogIDE6IGRvdWJsZSBuYW4sCkBAIC0yNyw3ICsyOCw3IEBACiAgMzogZG91YmxlIG5lZ2luZiwKICA0OiBkb3VibGUgcmVwZWF0aW5nLAogIDU6IGRvdWJsZSBiaWcsCi0gNjogZG91YmxlIHNtYWxsLAorIDY6IGRvdWJsZSB0aW55LAogIDc6IGRvdWJsZSB6ZXJvLAogIDg6IGRvdWJsZSBuZWd6ZXJvLAogfQpAQCAtMzUsNyArMzYsNyBAQAogc3RydWN0IE9uZU9mRWFjaCB7CiAgIDE6IGJvb2wgaW1fdHJ1ZSwKICAgMjogYm9vbCBpbV9mYWxzZSwKLSAgMzogYnl0ZSBhX2JpdGUgPSAweDdmLAorICAzOiBpOCBhX2JpdGUgPSAweDdmLAogICA0OiBpMTYgaW50ZWdlcjE2ID0gMHg3ZmZmLAogICA1OiBpMzIgaW50ZWdlcjMyLAogICA2OiBpNjQgaW50ZWdlcjY0ID0gMTAwMDAwMDAwMDAsCkBAIC00NCw3ICs0NSw3IEBACiAgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCiAgIDEwOiBib29sIHdoYXRfd2hvLAogICAxMTogYmluYXJ5IGJhc2U2NCwKLSAgMTI6IGxpc3Q8Ynl0ZT4gYnl0ZV9saXN0ID0gWzEsIDIsIDNdLAorICAxMjogbGlzdDxpOD4gYnl0ZV9saXN0ID0gWzEsIDIsIDNdLAogICAxMzogbGlzdDxpMTY+IGkxNl9saXN0ID0gWzEsMiwzXSwKICAgMTQ6IGxpc3Q8aTY0PiBpNjRfbGlzdCA9IFsxLDIsM10KIH0KQEAgLTYxLDcgKzYyLDcgQEAKIAogc3RydWN0IEhvbHlNb2xleSB7CiAgIDE6IGxpc3Q8T25lT2ZFYWNoPiBiaWcsCi0gIDI6IHNldDxsaXN0PHN0cmluZz4+IGNvbnRhaW4sCisgIDI6IHNldDxsaXN0PHN0cmluZz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+IGNvbnRhaW4sCiAgIDM6IG1hcDxzdHJpbmcsbGlzdDxCb25rPj4gYm9ua3MsCiB9CiAKQEAgLTcxLDExICs3MiwxNSBAQAogfQogCiBzdHJ1Y3QgRW1wdHkgewotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFdyYXBwZXIgewogICAxOiBFbXB0eSBmb28KLX0KK30gKAorICBweXRob24uaW1tdXRhYmxlID0gIiIsCispCiAKIHN0cnVjdCBSYW5kb21TdHVmZiB7CiAgIDE6IGkzMiBhLApAQCAtMTAwLDcgKzEwNSw3IEBACiAKIHN0cnVjdCBDb21wYWN0UHJvdG9UZXN0U3RydWN0IHsKICAgLy8gcHJpbWl0aXZlIGZpZWxkcwotICAxOiBieXRlICAgYV9ieXRlOworICAxOiBpOCAgICAgYV9ieXRlOwogICAyOiBpMTYgICAgYV9pMTY7CiAgIDM6IGkzMiAgICBhX2kzMjsKICAgNDogaTY0ICAgIGFfaTY0OwpAQCAtMTEwLDkgKzExNSw5IEBACiAgIDg6IGJvb2wgICB0cnVlX2ZpZWxkOwogICA5OiBib29sICAgZmFsc2VfZmllbGQ7CiAgIDEwOiBFbXB0eSBlbXB0eV9zdHJ1Y3RfZmllbGQ7Ci0gIAorCiAgIC8vIHByaW1pdGl2ZXMgaW4gbGlzdHMKLSAgMTE6IGxpc3Q8Ynl0ZT4gICAgYnl0ZV9saXN0OworICAxMTogbGlzdDxpOD4gICAgICBieXRlX2xpc3Q7CiAgIDEyOiBsaXN0PGkxNj4gICAgIGkxNl9saXN0OwogICAxMzogbGlzdDxpMzI+ICAgICBpMzJfbGlzdDsKICAgMTQ6IGxpc3Q8aTY0PiAgICAgaTY0X2xpc3Q7CkBAIC0xMjEsOSArMTI2LDkgQEAKICAgMTc6IGxpc3Q8YmluYXJ5PiAgYmluYXJ5X2xpc3Q7CiAgIDE4OiBsaXN0PGJvb2w+ICAgIGJvb2xlYW5fbGlzdDsKICAgMTk6IGxpc3Q8RW1wdHk+ICAgc3RydWN0X2xpc3Q7Ci0gIAorCiAgIC8vIHByaW1pdGl2ZXMgaW4gc2V0cwotICAyMDogc2V0PGJ5dGU+ICAgICBieXRlX3NldDsKKyAgMjA6IHNldDxpOD4gICAgICAgYnl0ZV9zZXQ7CiAgIDIxOiBzZXQ8aTE2PiAgICAgIGkxNl9zZXQ7CiAgIDIyOiBzZXQ8aTMyPiAgICAgIGkzMl9zZXQ7CiAgIDIzOiBzZXQ8aTY0PiAgICAgIGk2NF9zZXQ7CkBAIC0xMzIsMzUgKzEzNywzOSBAQAogICAyNjogc2V0PGJpbmFyeT4gICBiaW5hcnlfc2V0OwogICAyNzogc2V0PGJvb2w+ICAgICBib29sZWFuX3NldDsKICAgMjg6IHNldDxFbXB0eT4gICAgc3RydWN0X3NldDsKLSAgCisKICAgLy8gbWFwcwogICAvLyBwcmltaXRpdmVzIGFzIGtleXMKLSAgMjk6IG1hcDxieXRlLCBieXRlPiAgICAgICAgICAgICBieXRlX2J5dGVfbWFwOwotICAzMDogbWFwPGkxNiwgYnl0ZT4gICAgICAgICAgICAgIGkxNl9ieXRlX21hcDsKLSAgMzE6IG1hcDxpMzIsIGJ5dGU+ICAgICAgICAgICAgICBpMzJfYnl0ZV9tYXA7Ci0gIDMyOiBtYXA8aTY0LCBieXRlPiAgICAgICAgICAgICAgaTY0X2J5dGVfbWFwOwotICAzMzogbWFwPGRvdWJsZSwgYnl0ZT4gICAgICAgICAgIGRvdWJsZV9ieXRlX21hcDsKLSAgMzQ6IG1hcDxzdHJpbmcsIGJ5dGU+ICAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA7Ci0gIDM1OiBtYXA8YmluYXJ5LCBieXRlPiAgICAgICAgICAgYmluYXJ5X2J5dGVfbWFwOwotICAzNjogbWFwPGJvb2wsIGJ5dGU+ICAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA7CisgIDI5OiBtYXA8aTgsIGk4PiAgICAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA7CisgIDMwOiBtYXA8aTE2LCBpOD4gICAgICAgICAgICAgIGkxNl9ieXRlX21hcDsKKyAgMzE6IG1hcDxpMzIsIGk4PiAgICAgICAgICAgICAgaTMyX2J5dGVfbWFwOworICAzMjogbWFwPGk2NCwgaTg+ICAgICAgICAgICAgICBpNjRfYnl0ZV9tYXA7CisgIDMzOiBtYXA8ZG91YmxlLCBpOD4gICAgICAgICAgIGRvdWJsZV9ieXRlX21hcDsKKyAgMzQ6IG1hcDxzdHJpbmcsIGk4PiAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwOworICAzNTogbWFwPGJpbmFyeSwgaTg+ICAgICAgICAgICBiaW5hcnlfYnl0ZV9tYXA7CisgIDM2OiBtYXA8Ym9vbCwgaTg+ICAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA7CiAgIC8vIHByaW1pdGl2ZXMgYXMgdmFsdWVzCi0gIDM3OiBtYXA8Ynl0ZSwgaTE2PiAgICAgICAgICAgICAgYnl0ZV9pMTZfbWFwOwotICAzODogbWFwPGJ5dGUsIGkzMj4gICAgICAgICAgICAgIGJ5dGVfaTMyX21hcDsKLSAgMzk6IG1hcDxieXRlLCBpNjQ+ICAgICAgICAgICAgICBieXRlX2k2NF9tYXA7Ci0gIDQwOiBtYXA8Ynl0ZSwgZG91YmxlPiAgICAgICAgICAgYnl0ZV9kb3VibGVfbWFwOwotICA0MTogbWFwPGJ5dGUsIHN0cmluZz4gICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcDsKLSAgNDI6IG1hcDxieXRlLCBiaW5hcnk+ICAgICAgICAgICBieXRlX2JpbmFyeV9tYXA7Ci0gIDQzOiBtYXA8Ynl0ZSwgYm9vbD4gICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcDsKKyAgMzc6IG1hcDxpOCwgaTE2PiAgICAgICAgICAgICAgYnl0ZV9pMTZfbWFwOworICAzODogbWFwPGk4LCBpMzI+ICAgICAgICAgICAgICBieXRlX2kzMl9tYXA7CisgIDM5OiBtYXA8aTgsIGk2ND4gICAgICAgICAgICAgIGJ5dGVfaTY0X21hcDsKKyAgNDA6IG1hcDxpOCwgZG91YmxlPiAgICAgICAgICAgYnl0ZV9kb3VibGVfbWFwOworICA0MTogbWFwPGk4LCBzdHJpbmc+ICAgICAgICAgICBieXRlX3N0cmluZ19tYXA7CisgIDQyOiBtYXA8aTgsIGJpbmFyeT4gICAgICAgICAgIGJ5dGVfYmluYXJ5X21hcDsKKyAgNDM6IG1hcDxpOCwgYm9vbD4gICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcDsKICAgLy8gY29sbGVjdGlvbnMgYXMga2V5cwotICA0NDogbWFwPGxpc3Q8Ynl0ZT4sIGJ5dGU+ICAgICAgIGxpc3RfYnl0ZV9tYXA7Ci0gIDQ1OiBtYXA8c2V0PGJ5dGU+LCBieXRlPiAgICAgICAgc2V0X2J5dGVfbWFwOwotICA0NjogbWFwPG1hcDxieXRlLGJ5dGU+LCBieXRlPiAgIG1hcF9ieXRlX21hcDsKKyAgNDQ6IG1hcDxsaXN0PGk4PiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgaTg+ICAgICAgIGxpc3RfYnl0ZV9tYXA7CisgIDQ1OiBtYXA8c2V0PGk4PiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgaTg+ICAgICAgICBzZXRfYnl0ZV9tYXA7CisgIDQ2OiBtYXA8bWFwPGk4LGk4PiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgaTg+ICAgICBtYXBfYnl0ZV9tYXA7CiAgIC8vIGNvbGxlY3Rpb25zIGFzIHZhbHVlcwotICA0NzogbWFwPGJ5dGUsIG1hcDxieXRlLGJ5dGU+PiAgIGJ5dGVfbWFwX21hcDsKLSAgNDg6IG1hcDxieXRlLCBzZXQ8Ynl0ZT4+ICAgICAgICBieXRlX3NldF9tYXA7Ci0gIDQ5OiBtYXA8Ynl0ZSwgbGlzdDxieXRlPj4gICAgICAgYnl0ZV9saXN0X21hcDsKKyAgNDc6IG1hcDxpOCwgbWFwPGk4LGk4Pj4gICAgIGJ5dGVfbWFwX21hcDsKKyAgNDg6IG1hcDxpOCwgc2V0PGk4Pj4gICAgICAgIGJ5dGVfc2V0X21hcDsKKyAgNDk6IG1hcDxpOCwgbGlzdDxpOD4+ICAgICAgIGJ5dGVfbGlzdF9tYXA7CiB9CiAKKy8vIFRvIGJlIHVzZWQgdG8gdGVzdCB0aGUgc2VyaWFsaXphdGlvbiBvZiBhbiBlbXB0eSBtYXAKK3N0cnVjdCBTaW5nbGVNYXBUZXN0U3RydWN0IHsKKyAgMTogcmVxdWlyZWQgbWFwPGkzMiwgaTMyPiAgICAgICBpMzJfbWFwOworfQogCiBjb25zdCBDb21wYWN0UHJvdG9UZXN0U3RydWN0IENPTVBBQ1RfVEVTVCA9IHsKICAgJ2FfYnl0ZScgICAgICAgICAgICAgOiAxMjcsCkBAIC0yMzksNiArMjQ4LDggQEAKICAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoMTogaTMyIHNvbWV0aGluZyA9IE1ZQ09OU1QpOwogCiAgIG9uZXdheSB2b2lkIG9uZXdheU1ldGhvZCgpOworCisgIGJvb2wgZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoMTogYm9vbCBzaG91bGRUaHJvdykgdGhyb3dzICgxOiBFeGNlcHRpb25XaXRoQU1hcCB4d2FtYXApOwogfQogCiBzZXJ2aWNlIEluaGVyaXRlZCBleHRlbmRzIFNydiB7CkBAIC0yNTAsMTAgKzI2MSwxMCBAQAogLy8gVGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIHRoaW5nIGlzIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZQogLy8gc28gdGhhdCBabGliVGVzdCBoYXMgbW9yZSBoaWdobHkgY29tcHJlc3NpYmxlIGRhdGEgdG8gcGxheSB3aXRoLgogc3RydWN0IEJsb3dVcCB7Ci0gIDE6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIxOwotICAyOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMjsKLSAgMzogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjM7Ci0gIDQ6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGI0OworICAxOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIxOworICAyOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIyOworICAzOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIzOworICA0OiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGI0OwogfQogCiAKQEAgLTM0NywzICszNTgsMjEgQEAKICAgMzogaTMyIGZpZWxkMzsKIH0KIAorc3RydWN0IFR1cGxlUHJvdG9jb2xUZXN0U3RydWN0IHsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMTsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMjsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMzsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNDsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNTsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNjsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNzsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkODsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkOTsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMTA7CisgIG9wdGlvbmFsIGkzMiBmaWVsZDExOworICBvcHRpb25hbCBpMzIgZmllbGQxMjsKK30KKworc3RydWN0IExpc3REb3VibGVQZXJmIHsKKyAgMTogbGlzdDxkb3VibGU+IGZpZWxkOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBiL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQKaW5kZXggY2Y2MTQ5Ni4uM2E1Yjk1NyAxMDA2NDQKLS0tIGEvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdAorKysgYi90ZXN0L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0CkBAIC0zNCw2ICszNCw3IEBACiAqLwogCiBuYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0CituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAogCiBzdHJ1Y3QgT25lT2ZFYWNoWlogewogICAxOiBib29sIGltX3RydWUsCkBAIC05MCwzICs5MSw4IEBACiBzZXJ2aWNlIFNydiB7CiAgIGkzMiBKYW5reSgxOiBpMzIgYXJnKQogfQorCitzZXJ2aWNlIFVuZGVyc2NvcmVTcnYgeworICBpNjQgc29tZV9ycGNfY2FsbCgxOiBzdHJpbmcgbWVzc2FnZSkKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Eb2NUZXN0LnRocmlmdCBiL3Rlc3QvRG9jVGVzdC50aHJpZnQKaW5kZXggY2IzNTVhZS4uZDcwMmIyYyAxMDA2NDQKLS0tIGEvdGVzdC9Eb2NUZXN0LnRocmlmdAorKysgYi90ZXN0L0RvY1Rlc3QudGhyaWZ0CkBAIC01OCw3ICs1OCw3IEBACiAgIDE6ICBzdHJpbmcgc3RyaW5nX3RoaW5nCiAKICAgLyoqIGRvY3QgdGV4dCBnb2VzIGJlZm9yZSBhIGNvbW1hICovCi0gIDQ6ICBieXRlICAgYnl0ZV90aGluZywKKyAgNDogIGk4ICAgICBieXRlX3RoaW5nLAogCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwpAQCAtNzQsNyArNzQsNyBAQAogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTExNyw3ICsxMTcsNyBAQAogICAvKiogQW5kIHRoaXMgaXMgaG93IHlvdSB3b3VsZCBkb2N1bWVudCBmdW5jdGlvbnMgaW4gYSBzZXJ2aWNlICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAogICBzdHJpbmcgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisgIGk4ICAgICAgICAgICB0ZXN0Qnl0ZSgxOiBieXRlIHRoaW5nKSwKICAgaTMyICAgICAgICAgIHRlc3RJMzIoMTogaTMyIHRoaW5nKSwKIAogICAvKiogTGlrZSB0aGlzIG9uZSAqLwpAQCAtMTU1LDcgKzE1NSw3IEBACiB0eXBlZGVmIGkzMiBUcml2aWFsTXVsdGlMaW5lCiAKIC8qKgotICogVGhpcyBpcyB0aGUgY2Fubm9uaWNhbCBleGFtcGxlCisgKiBUaGlzIGlzIHRoZSBjYW5vbmljYWwgZXhhbXBsZQogICogb2YgYSBtdWx0aWxpbmUgZG9jc3RyaW5nLgogICovCiB0eXBlZGVmIGkzMiBTdGFuZGFyZE11bHRpTGluZQpAQCAtMjQ0LDQgKzI0NCw0NCBAQAogKi8KIHR5cGVkZWYgaTMyIFRvdGFsbHlEZWdlbmVyYXRlCiAKKy8qKm5vIHJvb20gZm9yIG5ld2xpbmUgaGVyZSovCisKKy8qICogLyAqLwordHlwZWRlZiBpMzIgVGVzdEZvcjM1MDFhCisKKy8qKgorICogLworICovCit0eXBlZGVmIGkzMiBUZXN0Rm9yMzUwMWIKKworCisvKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMCB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDEgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMiB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDMgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNCB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNSB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzA2IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzA3IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wOCB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisKK3N0cnVjdCBUZXN0Rm9yMzcwOSB7CisgIC8qKiBUaGlzIGlzIGEgY29tbWVudCAqLworICAxOiByZXF1aXJlZCBzdHJpbmcgaWQsCisgIC8qKiBUaGlzIGlzIGFsc28gYSBjb21tZW50ICoqLworICAyOiByZXF1aXJlZCBzdHJpbmcgdHlwZUlkLAorICAvKiogWWV0IGFub3RoZXIgY29tbWVudCEgKi8KKyAgMzogcmVxdWlyZWQgaTMyIGVuZFRpbWVzdGFtcAorfQorCisKIC8qIFRIRSBFTkQgKi8KZGlmZiAtLWdpdCBhL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgYi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjEyYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTcgQEAKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CituYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0CisKKy8vIG1vcmUgdGVzdHMgb24gZG91YmxlIGNvbnN0YW50cyAocHJlY2lzaW9uIGFuZCB0eXBlIGNoZWNrcykKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QgPSAxCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUID0gLTEwMAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUID0gOTIyMzM3MjAzNjg1NDc3NTgwNworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCA9IDMuMTQxNTkyNjUzNTkKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IDEwMDAwMDAuMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gLTEwMDAwMDAuMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCA9IDEuN2UrMzA4Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUID0gLTEuN2UrMzA4Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKworY29uc3QgbGlzdDxkb3VibGU+IERPVUJMRV9MSVNUX1RFU1QgPSBbMSwtMTAwLDEwMCw5MjIzMzcyMDM2ODU0Nzc1ODA3LC05MjIzMzcyMDM2ODU0Nzc1ODA3LDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDNdCmRpZmYgLS1naXQgYS90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQgYi90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2NDA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzCisKK2VudW0gR3JlZWtHb2RHb2RkZXNzIHsKKyAgICBBUkVTLAorICAgIEFQSFJPRElURSwKKyAgICBaRVVTLAorICAgIFBPU0VJRE9OLAorICAgIEhFUkEsCit9CisKK3R5cGVkZWYgR3JlZWtHb2RHb2RkZXNzIEdyZWVrR29kR29kZGVzc1R5cGUKK3R5cGVkZWYgaTMyIFBvd2VyCisKK3N0cnVjdCBHb2RCZWFuIHsKKyAgICAxOiBvcHRpb25hbCBtYXA8R3JlZWtHb2RHb2RkZXNzVHlwZSwgUG93ZXI+IHBvd2VyLAorICAgIDI6IG9wdGlvbmFsIHNldDxHcmVla0dvZEdvZGRlc3NUeXBlPiBnb2RkZXNzLAorICAgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIEdyZWVrR29kR29kZGVzcz4gYnlBbGlhcywKKyAgICA0OiBvcHRpb25hbCBzZXQ8c3RyaW5nPiBpbWFnZXMsCit9CisKK2NvbnN0IG1hcDxHcmVla0dvZEdvZGRlc3NUeXBlLCBzdHJpbmc+IEFUVFJJQlVURVMgPQoreworICAgIEdyZWVrR29kR29kZGVzcy5aRVVTOiAibGlnaHRuaW5nIGJvbHQiLAorICAgIEdyZWVrR29kR29kZGVzcy5QT1NFSURPTjogInRyaWRlbnQiLAorfQorCitjb25zdCBzZXQ8R3JlZWtHb2RHb2RkZXNzVHlwZT4gQkVBVVRZID0gWyBHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFLCBHcmVla0dvZEdvZGRlc3MuSEVSQSBdCmRpZmYgLS1naXQgYS90ZXN0L0VudW1UZXN0LnRocmlmdCBiL3Rlc3QvRW51bVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjFmMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0VudW1UZXN0LnRocmlmdApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAorCitlbnVtIE15RW51bTEgeworICBNRTFfMCA9IDAsCisgIE1FMV8xID0gMSwKKyAgTUUxXzIsCisgIE1FMV8zLAorICBNRTFfNSA9IDUsCisgIE1FMV82LAorfQorCitlbnVtIE15RW51bTIgeworICBNRTJfMCwKKyAgTUUyXzEsCisgIE1FMl8yLAorfQorCitlbnVtIE15RW51bTJfYWdhaW4geworICAvLyBlbnVtIHZhbHVlIGlkZW50aWZpZXJzIG1heSBhcHBlYXIgYWdhaW4gaW4gYW5vdGhlciBlbnVtIHR5cGUKKyAgTUUwXzEsCisgIE1FMV8xLAorICBNRTJfMSwKKyAgTUUzXzEsCit9CisKK2VudW0gTXlFbnVtMyB7CisgIE1FM18wLAorICBNRTNfMSwKKyAgTUUzX04yID0gLTIsCisgIE1FM19OMSwKKyAgTUUzX0QwLAorICBNRTNfRDEsCisgIE1FM185ID0gOSwKKyAgTUUzXzEwLAorfQorCitlbnVtIE15RW51bTQgeworICBNRTRfQSA9IDB4N2ZmZmZmZmQKKyAgTUU0X0IKKyAgTUU0X0MKKyAgLy8gYXR0ZW1wdGluZyB0byBkZWZpbmUgYW5vdGhlciBlbnVtIHZhbHVlIGhlcmUgZmFpbHMKKyAgLy8gd2l0aCBhbiBvdmVyZmxvdyBlcnJvciwgYXMgd2Ugb3ZlcmZsb3cgdmFsdWVzIHRoYXQgY2FuIGJlCisgIC8vIHJlcHJlc2VudGVkIHdpdGggYW4gaTMyLgorfQorCitlbnVtIE15RW51bTUgeworICBlMSAgICAgICAgLy8gZmFpbHMgd2l0aCAwLjkuMyBhbmQgZWFybGllcgorICBlMiA9IDQyICAgLy8gZmFpbHMgd2l0aCAwLjkuMyBhbmQgZWFybGllcgorfQorCitlbnVtIE15RW51bVdpdGhDdXN0b21Pc3RyZWFtIHsKKyAgY3VzdG9tMSA9IDEsCisgIEN1c3RvTTIKK30gKGNwcC5jdXN0b21vc3RyZWFtKQorCitzdHJ1Y3QgTXlTdHJ1Y3QgeworICAxOiBNeUVudW0yIG1lMl8yID0gTXlFbnVtMS5NRTJfMgorICAyOiBNeUVudW0zIG1lM19uMiA9IE15RW51bTMuTUUzX04yCisgIDM6IE15RW51bTMgbWUzX2QxID0gTXlFbnVtMy5NRTNfRDEKK30KKworc3RydWN0IEVudW1UZXN0U3RydWN0IHsKKyAgMTogTXlFbnVtMyBhX2VudW07CisgIDI6IGxpc3Q8TXlFbnVtMz4gZW51bV9saXN0OworICAzOiBzZXQ8TXlFbnVtMz4gZW51bV9zZXQ7CisgIDQ6IG1hcDxNeUVudW0zLCBNeUVudW0zPiBlbnVtX2VudW1fbWFwOworICAvLyBjb2xsZWN0aW9ucyBhcyBrZXlzCisgIDQ0OiBtYXA8bGlzdDxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gbGlzdF9lbnVtX21hcDsKKyAgNDU6IG1hcDxzZXQ8TXlFbnVtMz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIE15RW51bTM+IHNldF9lbnVtX21hcDsKKyAgNDY6IG1hcDxtYXA8TXlFbnVtMyxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gbWFwX2VudW1fbWFwOworICAvLyBjb2xsZWN0aW9ucyBhcyB2YWx1ZXMKKyAgNDc6IG1hcDxNeUVudW0zLCBtYXA8TXlFbnVtMywgTXlFbnVtMz4+IGVudW1fbWFwX21hcDsKKyAgNDg6IG1hcDxNeUVudW0zLCBzZXQ8TXlFbnVtMz4+IGVudW1fc2V0X21hcDsKKyAgNDk6IG1hcDxNeUVudW0zLCBsaXN0PE15RW51bTM+PiBlbnVtX2xpc3RfbWFwOworfQorCitjb25zdCBFbnVtVGVzdFN0cnVjdCBFTlVNX1RFU1QgPSB7CisgICdhX2VudW0nOiBNeUVudW0zLk1FM19EMSwKKyAgJ2VudW1fbGlzdCc6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfMCwgTXlFbnVtMy5NRTNfTjJdLAorICAnZW51bV9zZXQnOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXSwKKyAgJ2VudW1fZW51bV9tYXAnOiB7TXlFbnVtMy5NRTNfRDE6IE15RW51bTMuTUUzXzAsIE15RW51bTMuTUUzXzA6IE15RW51bTMuTUUzX0QxfSwKKyAgJ2xpc3RfZW51bV9tYXAnOiB7W015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wXTogTXlFbnVtMy5NRTNfMCwgW015RW51bTMuTUUzX0QxXTogTXlFbnVtMy5NRTNfMCwgW015RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM19EMX0sCisgICdzZXRfZW51bV9tYXAnOiB7W015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wXTogTXlFbnVtMy5NRTNfMCwgW015RW51bTMuTUUzX0QxXTogTXlFbnVtMy5NRTNfMH0sCisgICdtYXBfZW51bV9tYXAnOiB7e015RW51bTMuTUUzX04xOiBNeUVudW0zLk1FM18xMH06IE15RW51bTMuTUUzXzF9LAorICAnZW51bV9tYXBfbWFwJzoge015RW51bTMuTUUzX04xOiB7TXlFbnVtMy5NRTNfRDE6IE15RW51bTMuTUUzX0QxfX0sCisgICdlbnVtX3NldF9tYXAnOiB7TXlFbnVtMy5NRTNfTjI6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdLCBNeUVudW0zLk1FM18xMDogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV19LAorICAnZW51bV9saXN0X21hcCc6IHtNeUVudW0zLk1FM19EMTogW015RW51bTMuTUUzXzEwXSwgTXlFbnVtMy5NRTNfMDogW015RW51bTMuTUUzXzksIE15RW51bTMuTUUzXzEwXX0sCit9CisKK3NlcnZpY2UgRW51bVRlc3RTZXJ2aWNlIHsKKyAgTXlFbnVtMyB0ZXN0RW51bSgxOiBNeUVudW0zIGVudW0xKSwKKyAgbGlzdDxNeUVudW0zPiB0ZXN0RW51bUxpc3QoMTogbGlzdDxNeUVudW0zPiBlbnVtMSksCisgIHNldDxNeUVudW0zPiB0ZXN0RW51bVNldCgxOiBzZXQ8TXlFbnVtMz4gZW51bTEpLAorICBtYXA8TXlFbnVtMywgTXlFbnVtMz4gdGVzdEVudW1NYXAoMTogbWFwPE15RW51bTMsIE15RW51bTM+IGVudW0xKSwKKyAgRW51bVRlc3RTdHJ1Y3QgdGVzdEVudW1TdHJ1Y3QoMTogRW51bVRlc3RTdHJ1Y3QgZW51bTEpLAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9GYXN0YmluYXJ5VGVzdC5weSBiL3Rlc3QvRmFzdGJpbmFyeVRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmNmVmYWUuLjAwMDAwMDAKLS0tIGEvdGVzdC9GYXN0YmluYXJ5VGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXIiIiIKLXRocmlmdCAtLWdlbiBweSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLS4vRmFzdGJpbmFyeVRlc3QucHkKLSIiIgotCi0jIFRPRE8oZHJlaXNzKTogVGVzdCBlcnJvciBjYXNlcy4gIENoZWNrIGZvciBtZW1vcnkgbGVha3MuCi0KLWltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnLi9nZW4tcHknKQotCi1pbXBvcnQgbWF0aAotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgU3J2Ci1mcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi0KLWltcG9ydCB0aW1laXQKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQotZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAotCi1jbGFzcyBURGV2TnVsbFRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHBhc3MKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gVHJ1ZQotCi1vb2UxID0gT25lT2ZFYWNoKCkKLW9vZTEuaW1fdHJ1ZSAgID0gVHJ1ZTsKLW9vZTEuaW1fZmFsc2UgID0gRmFsc2U7Ci1vb2UxLmFfYml0ZSAgICA9IDB4ZDY7Ci1vb2UxLmludGVnZXIxNiA9IDI3MDAwOwotb29lMS5pbnRlZ2VyMzIgPSAxPDwyNDsKLW9vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwOwotb29lMS5kb3VibGVfcHJlY2lzaW9uID0gbWF0aC5waTsKLW9vZTEuc29tZV9jaGFyYWN0ZXJzICA9ICJEZWJ1ZyBUSElTISI7Ci1vb2UxLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0KLW9vZTIgPSBPbmVPZkVhY2goKTsKLW9vZTIuaW50ZWdlcjE2ID0gMTY7Ci1vb2UyLmludGVnZXIzMiA9IDMyOwotb29lMi5pbnRlZ2VyNjQgPSA2NDsKLW9vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkrMSkvMjsKLW9vZTIuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLW9vZTIuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0KLWhtID0gSG9seU1vbGV5KHsiYmlnIjpbXSwgImNvbnRhaW4iOnNldCgpLCAiYm9ua3MiOnt9fSkKLWhtLmJpZy5hcHBlbmQob29lMSkKLWhtLmJpZy5hcHBlbmQob29lMikKLWhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotaG0uYmlnWzFdLmFfYml0ZSA9IDB4MjI7Ci0KLWhtLmNvbnRhaW4uYWRkKCgiYW5kIGEgb25lIiwgImFuZCBhIHR3byIpKQotaG0uY29udGFpbi5hZGQoKCJ0aGVuIGEgb25lLCB0d28iLCAidGhyZWUhIiwgIkZPVVIhIikpCi1obS5jb250YWluLmFkZCgoKSkKLQotaG0uYm9ua3NbIm5vdGhpbmciXSA9IFtdOwotaG0uYm9ua3NbInNvbWV0aGluZyJdID0gWwotICBCb25rKHsidHlwZSI6MSwgIm1lc3NhZ2UiOiJXYWl0LiJ9KSwKLSAgQm9uayh7InR5cGUiOjIsICJtZXNzYWdlIjoiV2hhdD8ifSksCi1dCi1obS5ib25rc1sicG9lIl0gPSBbCi0gIEJvbmsoeyJ0eXBlIjozLCAibWVzc2FnZSI6InF1b3RoIn0pLAotICBCb25rKHsidHlwZSI6NCwgIm1lc3NhZ2UiOiJ0aGUgcmF2ZW4ifSksCi0gIEJvbmsoeyJ0eXBlIjo1LCAibWVzc2FnZSI6Im5ldmVybW9yZSJ9KSwKLV0KLQotcnMgPSBSYW5kb21TdHVmZigpCi1ycy5hID0gMQotcnMuYiA9IDIKLXJzLmMgPSAzCi1ycy5teWludGxpc3QgPSByYW5nZSgyMCkKLXJzLm1hcHMgPSB7MTpXcmFwcGVyKHsiZm9vIjpFbXB0eSgpfSksMjpXcmFwcGVyKHsiZm9vIjpFbXB0eSgpfSl9Ci1ycy5iaWdpbnQgPSAxMjQ1MjM0NTI0MzVMCi1ycy50cmlwbGUgPSAzLjE0Ci0KLSMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKLXJzaHVnZSA9IFJhbmRvbVN0dWZmKCkKLXJzaHVnZS5teWludGxpc3Q9cmFuZ2UoMTAwMDApCi0KLW15X3plcm8gPSBTcnYuSmFua3lfcmVzdWx0KHsiYXJnIjo1fSkKLQotZGVmIGNoZWNrV3JpdGUobyk6Ci0gIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgcHJvdF9mYXN0ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zX2Zhc3QpCi0gIHByb3Rfc2xvdyA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNfc2xvdykKLQotICBvLndyaXRlKHByb3RfZmFzdCkKLSAgby53cml0ZShwcm90X3Nsb3cpCi0gIE9SSUcgPSB0cmFuc19zbG93LmdldHZhbHVlKCkKLSAgTUlORSA9IHRyYW5zX2Zhc3QuZ2V0dmFsdWUoKQotICBpZiBPUklHICE9IE1JTkU6Ci0gICAgcHJpbnQgIm1pbmU6ICVzXG5vcmlnOiAlcyIgJSAocmVwcihNSU5FKSwgcmVwcihPUklHKSkKLQotZGVmIGNoZWNrUmVhZChvKToKLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCi0gIG8ud3JpdGUocHJvdCkKLQotICBzbG93X3ZlcnNpb25fYmluYXJ5ID0gcHJvdC50cmFucy5nZXR2YWx1ZSgpCi0KLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKLSAgICAgICAgICAgVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNsb3dfdmVyc2lvbl9iaW5hcnkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKLSAgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotCi1kZWYgZG9UZXN0KCk6Ci0gIGNoZWNrV3JpdGUoaG0pCi0gIG5vX3NldCA9IGRlZXBjb3B5KGhtKQotICBub19zZXQuY29udGFpbiA9IHNldCgpCi0gIGNoZWNrUmVhZChub19zZXQpCi0gIGNoZWNrV3JpdGUocnMpCi0gIGNoZWNrUmVhZChycykKLSAgY2hlY2tXcml0ZShyc2h1Z2UpCi0gIGNoZWNrUmVhZChyc2h1Z2UpCi0gIGNoZWNrV3JpdGUobXlfemVybykKLSAgY2hlY2tSZWFkKG15X3plcm8pCi0gIGNoZWNrUmVhZChCYWNrd2FyZHMoeyJmaXJzdF90YWcyIjo0LCAic2Vjb25kX3RhZzEiOjJ9KSkKLQotICAjIE9uZSBjYXNlIHdoZXJlIHRoZSBzZXJpYWxpemVkIGZvcm0gY2hhbmdlcywgYnV0IG9ubHkgc3VwZXJmaWNpYWxseS4KLSAgbyA9IEJhY2t3YXJkcyh7ImZpcnN0X3RhZzIiOjQsICJzZWNvbmRfdGFnMSI6Mn0pCi0gIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgcHJvdF9mYXN0ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zX2Zhc3QpCi0gIHByb3Rfc2xvdyA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNfc2xvdykKLQotICBvLndyaXRlKHByb3RfZmFzdCkKLSAgby53cml0ZShwcm90X3Nsb3cpCi0gIE9SSUcgPSB0cmFuc19zbG93LmdldHZhbHVlKCkKLSAgTUlORSA9IHRyYW5zX2Zhc3QuZ2V0dmFsdWUoKQotICBpZiBPUklHID09IE1JTkU6Ci0gICAgcHJpbnQgIlRoYXQgc2hvdWxkbid0IGhhcHBlbi4iCi0KLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpKQotICBvLndyaXRlKHByb3QpCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoCi0gICAgICAgICAgICAgcHJvdC50cmFucy5nZXR2YWx1ZSgpKSkKLSAgYyA9IG8uX19jbGFzc19fKCkKLSAgYy5yZWFkKHByb3QpCi0gIGlmIGMgIT0gbzoKLSAgICBwcmludCAiY29weTogIgotICAgIHBwcmludChldmFsKHJlcHIoYykpKQotICAgIHByaW50ICJvcmlnOiAiCi0gICAgcHByaW50KGV2YWwocmVwcihvKSkpCi0KLQotCi1kZWYgZG9CZW5jaG1hcmsoKToKLQotICBpdGVycyA9IDI1MDAwCi0KLSAgc2V0dXAgPSAiIiIKLWZyb20gX19tYWluX18gaW1wb3J0IGhtLCBycywgVERldk51bGxUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLXRyYW5zID0gVERldk51bGxUcmFuc3BvcnQoKQotcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wlcyh0cmFucykKLSIiIgotCi0gIHNldHVwX2Zhc3QgPSBzZXR1cCAlICJBY2NlbGVyYXRlZCIKLSAgc2V0dXBfc2xvdyA9IHNldHVwICUgIiIKLQotICBwcmludCAiU3RhcnRpbmcgQmVuY2htYXJrcyIKLQotICBwcmludCAiSG9seU1vbGV5IFN0YW5kYXJkID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdobS53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0gIHByaW50ICJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykKLQotICBwcmludCAiRmFzdFN0cnVjdCBTdGFuZGFyZCA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKQotICBwcmludCAiRmFzdFN0cnVjdCBBY2NlbGVyLiA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKQotCi0KLQotZG9UZXN0KCkKLWRvQmVuY2htYXJrKCkKLQpkaWZmIC0tZ2l0IGEvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdCBiL3Rlc3QvRnVsbENhbWVsVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlNGRkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRnVsbENhbWVsVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5mdWxsY2FtZWwKKworc3RydWN0IE9uZU9mRWFjaFpaIHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBieXRlIGFfYml0ZSwKKyAgNDogaTE2IGludGVnZXIxNiwKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorfQorCitzZXJ2aWNlIFVuZGVyc2NvcmVTcnYgeworICBpNjQgc29tZV9ycGNfY2FsbCgxOiBzdHJpbmcgbWVzc2FnZSkKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9JbmNsdWRlLnRocmlmdCBiL3Rlc3QvSW5jbHVkZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyMzE5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5jbHVkZS50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbmNsdWRlICJUaHJpZnRUZXN0LnRocmlmdCIKKworc3RydWN0IEluY2x1ZGVUZXN0IHsKKyAgMTogcmVxdWlyZWQgVGhyaWZ0VGVzdC5Cb29scyBib29scworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgYi90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTc0YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTkgQEAKK2luY2x1ZGUgIkphdmFUeXBlcy50aHJpZnQiCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBEZWVwQ29weUZvbyB7CisgIDE6IG9wdGlvbmFsIGxpc3Q8RGVlcENvcHlCYXI+IGwsCisgIDI6IG9wdGlvbmFsIHNldDxEZWVwQ29weUJhcj4gcywKKyAgMzogb3B0aW9uYWwgbWFwPHN0cmluZywgRGVlcENvcHlCYXI+IG0sCisgIDQ6IG9wdGlvbmFsIGxpc3Q8SmF2YVR5cGVzLk9iamVjdD4gbGksCisgIDU6IG9wdGlvbmFsIHNldDxKYXZhVHlwZXMuT2JqZWN0PiBzaSwKKyAgNjogb3B0aW9uYWwgbWFwPHN0cmluZywgSmF2YVR5cGVzLk9iamVjdD4gbWksCisgIDc6IG9wdGlvbmFsIERlZXBDb3B5QmFyIGJhciwKK30KKworc3RydWN0IERlZXBDb3B5QmFyIHsKKyAgMTogb3B0aW9uYWwgc3RyaW5nIGEsCisgIDI6IG9wdGlvbmFsIGkzMiBiLAorICAzOiBvcHRpb25hbCBib29sIGMsCit9CmRpZmYgLS1naXQgYS90ZXN0L0phdmFUeXBlcy50aHJpZnQgYi90ZXN0L0phdmFUeXBlcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3MzNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSmF2YVR5cGVzLnRocmlmdApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgSW50ZWdlciB7CisgIDE6IGkzMiB2YWwKK30KKworc3RydWN0IFN0cmluZyB7CisgIDE6IHN0cmluZyB2YWwKK30KKworc3RydWN0IEJvb2xlYW4geworICAxOiBib29sIHZhbAorfQorCitzdHJ1Y3QgRG91YmxlIHsKKyAgMTogZG91YmxlIHZhbAorfQorCitzdHJ1Y3QgTG9uZyB7CisgIDE6IGk2NCB2YWwKK30KKworc3RydWN0IEJ5dGUgeworICAxOiBieXRlIHZhbAorfQorCitzdHJ1Y3QgRmxvYXQgeworICAxOiBkb3VibGUgdmFsCit9CisKK3N0cnVjdCBMaXN0IHsKKyAgMTogbGlzdDxzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IEFycmF5TGlzdCB7CisgIDE6IGxpc3Q8c3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBTb3J0ZWRNYXAgeworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IFRyZWVNYXAgeworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IEhhc2hNYXAgeworICAxOiBtYXA8c3RyaW5nLCBTdHJpbmc+IHZhbHMKK30KKworc3RydWN0IE1hcCB7CisgIDE6IG1hcDxkb3VibGUsIERvdWJsZT4gdmFscworfQorCitzdHJ1Y3QgT2JqZWN0IHsKKyAgMTogSW50ZWdlciBpbnRlZ2VyLAorICAyOiBTdHJpbmcgc3RyLAorICAzOiBCb29sZWFuIGJvb2xlYW5fZmllbGQsCisgIDQ6IERvdWJsZSBkYmwsCisgIDU6IEJ5dGUgYml0ZSwKKyAgNjogbWFwPGkzMiwgSW50ZWdlcj4gaW50bWFwLAorICA3OiBNYXAgc29tZW1hcCwKK30KKworZXhjZXB0aW9uIEV4Y2VwdGlvbiB7CisgIDE6IHN0cmluZyBtc2cKK30KKworc2VydmljZSBBc3luY05vbmJsb2NraW5nU2VydmljZSB7CisgIE9iamVjdCBteW1ldGhvZCgKKyAgICAxOiBJbnRlZ2VyIGludGVnZXIsCisgICAgMjogU3RyaW5nIHN0ciwKKyAgICAzOiBCb29sZWFuIGJvb2xlYW5fZmllbGQsCisgICAgNDogRG91YmxlIGRibCwKKyAgICA1OiBCeXRlIGJpdGUsCisgICAgNjogbWFwPGkzMiwgSW50ZWdlcj4gaW50bWFwLAorICAgIDc6IE1hcCBzb21lbWFwLAorICApIHRocm93cyAoMTpFeGNlcHRpb24gZXgpOworfQorCitzdHJ1Y3QgU2FmZUJ5dGVzIHsKKyAgMTogYmluYXJ5IGJ5dGVzOworfQorCmRpZmYgLS1naXQgYS90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgYi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1MTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdApAQCAtMCwwICsxLDE4IEBACitzdHJ1Y3QgU2ltcGxlIHsKKyAgMTogc3RyaW5nIHZhbHVlCit9CisKK3N0cnVjdCBDb21wbGV4IHsKKyAgMTogU2ltcGxlIHN0cnVjdF9maWVsZAorICAyOiBsaXN0PFNpbXBsZT4gc3RydWN0X2xpc3RfZmllbGQKKyAgMzogc2V0PFNpbXBsZT4gc3RydWN0X3NldF9maWVsZAorICA0OiBtYXA8c3RyaW5nLFNpbXBsZT4gc3RydWN0X21hcF9maWVsZAorICA1OiBsaXN0PHNldDxtYXA8c3RyaW5nLGxpc3Q8U2ltcGxlPj4+PiBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQKKyAgNjogbWFwPHN0cmluZywgbGlzdDxtYXA8c3RyaW5nLFNpbXBsZT4+ID4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMgorICA3OiBsaXN0PGxpc3Q8c3RyaW5nPj4gbGlzdF9vZl9saXN0X2ZpZWxkCisgIDg6IGxpc3Q8bGlzdDxsaXN0PHN0cmluZz4+PiBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZAorfQorCitzdHJ1Y3QgQ29tcGxleExpc3QgeworICAxOiBsaXN0PENvbXBsZXg+IHN0cnVjdF9saXN0X2ZpZWxkOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzOWVhODVhLi42OGYxOTg2Ci0tLSBhL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsNDMgKzE3LDE1NCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9CitTVUJESVJTID0gZmVhdHVyZXMKK1BSRUNST1NTX1RBUkdFVCA9CisKK2lmIFdJVEhfQ19HTElCCitTVUJESVJTICs9IGNfZ2xpYgorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNfZ2xpYgorZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNsCitlbmRpZgorCitpZiBXSVRIX01PTk8KK1NVQkRJUlMgKz0gY3NoYXJwCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY3NoYXJwCitlbmRpZgorCitpZiBXSVRIX0NQUAorU1VCRElSUyArPSBjcHAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jcHAKK2VuZGlmCisKK2lmIFdJVEhfUEVSTAorU1VCRElSUyArPSBwZXJsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcGVybAorZW5kaWYKKworaWYgV0lUSF9QSFAKK1NVQkRJUlMgKz0gcGhwCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcGhwCitlbmRpZgorCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWRhcnQKK2VuZGlmCiAKIGlmIFdJVEhfUFlUSE9OCiBTVUJESVJTICs9IHB5CitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcHkKK1NVQkRJUlMgKz0gcHkudG9ybmFkbworaWYgV0lUSF9UV0lTVEVEX1RFU1QKIFNVQkRJUlMgKz0gcHkudHdpc3RlZAogZW5kaWYKK2VuZGlmCiAKIGlmIFdJVEhfUlVCWQogU1VCRElSUyArPSByYgorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXJiCiBlbmRpZgogCiBpZiBXSVRIX0hBU0tFTEwKIFNVQkRJUlMgKz0gaHMKIGVuZGlmCiAKK2lmIFdJVEhfSEFYRQorU1VCRElSUyArPSBoYXhlCitlbmRpZgorCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKKworaWYgV0lUSF9HTworU1VCRElSUyArPSBnbworUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWdvCitlbmRpZgorCitpZiBXSVRIX0VSTEFORworU1VCRElSUyArPSBlcmwKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1lcmwKK2VuZGlmCisKK2lmIFdJVEhfTFVBCitTVUJESVJTICs9IGx1YQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWx1YQorZW5kaWYKKworaWYgV0lUSF9SUworU1VCRElSUyArPSBycworUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXJzCitlbmRpZgorCisjCisjIGdlbmVyYXRlIGh0bWwgZm9yIFRocmlmdFRlc3QudGhyaWZ0CisjCitjaGVjay1sb2NhbDoKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBodG1sIC1yICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCitjbGVhbi1sb2NhbDoKKwlybSAtcmYgJCh0b3Bfc3JjZGlyKS90ZXN0L2dlbi1odG1sCisKIEVYVFJBX0RJU1QgPSBcCisJYXVkaXQgXAorCWNyb3NzcnVubmVyIFwKKwlrZXlzIFwKKwljX2dsaWIgXAorCWNsIFwKIAljcHAgXAotCXRocmVhZHMgXAotCWNzaGFycCBcCi0JcHkgXAotCXB5LnR3aXN0ZWQgXAotCXJiIFwKLQlwZXJsIFwKLQlwaHAgXAorCWRhcnQgXAogCWVybCBcCiAJaHMgXAorCWx1YSBcCiAJb2NhbWwgXAorCXBlcmwgXAorCXBocCBcCisJcHkgXAorCXB5LnR3aXN0ZWQgXAorCXB5LnRvcm5hZG8gXAorCXJiIFwKKwlycyBcCisJdGhyZWFkcyBcCiAJQW5ub3RhdGlvblRlc3QudGhyaWZ0IFwKIAlCcm9rZW5Db25zdGFudHMudGhyaWZ0IFwKIAlDb25zdGFudHNEZW1vLnRocmlmdCBcCiAJRGVidWdQcm90b1Rlc3QudGhyaWZ0IFwKKwlEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBcCiAJRGVuc2VMaW5raW5nVGVzdC50aHJpZnQgXAogCURvY1Rlc3QudGhyaWZ0IFwKKwlFbnVtVGVzdC50aHJpZnQgXAorCUZ1bGxDYW1lbFRlc3QudGhyaWZ0IFwKKwlJbmNsdWRlLnRocmlmdCBcCiAJSmF2YUJlYW5zVGVzdC50aHJpZnQgXAorCUphdmFEZWVwQ29weVRlc3QudGhyaWZ0IFwKKwlKYXZhVHlwZXMudGhyaWZ0IFwKKwlKc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0IFwKKwlNYW55T3B0aW9uYWxzLnRocmlmdCBcCiAJTWFueVR5cGVkZWZzLnRocmlmdCBcCisJTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgXAogCU9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCBcCisJUmVjdXJzaXZlLnRocmlmdCBcCisJUmV1c2VPYmplY3RzLnRocmlmdCBcCisJRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCBcCiAJU21hbGxUZXN0LnRocmlmdCBcCiAJU3RyZXNzVGVzdC50aHJpZnQgXAogCVRocmlmdFRlc3QudGhyaWZ0IFwKLQlGYXN0YmluYXJ5VGVzdC5weQorCVR5cGVkZWZUZXN0LnRocmlmdCBcCisJVW5zYWZlVHlwZXMudGhyaWZ0IFwKKwlrbm93bl9mYWlsdXJlc19MaW51eC5qc29uIFwKKwl0ZXN0LnB5IFwKKwl0ZXN0cy5qc29uIFwKKwlyZWJ1aWxkX2tub3duX2ZhaWx1cmVzLnNoIFwKKwlyZXN1bHQuanMgXAorCWluZGV4Lmh0bWwgXAorCVJFQURNRS5tZCBcCisJdmFsZ3JpbmQuc3VwcHJlc3MKKworcHJlY3Jvc3MtJToKKwkkKE1BS0UpIC1DICQqIHByZWNyb3NzCitwcmVjcm9zczogJChQUkVDUk9TU19UQVJHRVQpCmRpZmYgLS1naXQgYS90ZXN0L01hbnlPcHRpb25hbHMudGhyaWZ0IGIvdGVzdC9NYW55T3B0aW9uYWxzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIxZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9NYW55T3B0aW9uYWxzLnRocmlmdApAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGUgamF2YSBjb2RlZ2VuZXJhdG9yIGhhcyBhIGZldyBkaWZmZXJlbnQgY29kZXBhdGhzIGRlcGVuZGluZworLy8gb24gaG93IG1hbnkgb3B0aW9uYWxzIHRoZSBzdHJ1Y3QgaGFzOyB0aGlzIGF0dGVtcHRzIHRvIGV4ZXJjaXNlCisvLyB0aGVtLgorCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgT3B0NCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworfQorCitzdHJ1Y3QgT3B0MTMgeworICAxOiBpMzIgZGVmMTsKKyAgMjogaTMyIGRlZjI7CisgIDM6IGkzMiBkZWYzOworICA0OiBpMzIgZGVmNDsKKyAgNTogaTMyIGRlZjU7CisgIDY6IGkzMiBkZWY2OworICA3OiBpMzIgZGVmNzsKKyAgODogaTMyIGRlZjg7CisgIDk6IGkzMiBkZWY5OworICAxMDogaTMyIGRlZjEwOworICAxMTogaTMyIGRlZjExOworICAxMjogaTMyIGRlZjEyOworICAxMzogaTMyIGRlZjEzOworfQorCitzdHJ1Y3QgT3B0MzAgeworICAxOiBpMzIgZGVmMTsKKyAgMjogaTMyIGRlZjI7CisgIDM6IGkzMiBkZWYzOworICA0OiBpMzIgZGVmNDsKKyAgNTogaTMyIGRlZjU7CisgIDY6IGkzMiBkZWY2OworICA3OiBpMzIgZGVmNzsKKyAgODogaTMyIGRlZjg7CisgIDk6IGkzMiBkZWY5OworICAxMDogaTMyIGRlZjEwOworICAxMTogaTMyIGRlZjExOworICAxMjogaTMyIGRlZjEyOworICAxMzogaTMyIGRlZjEzOworICAxNDogaTMyIGRlZjE0OworICAxNTogaTMyIGRlZjE1OworICAxNjogaTMyIGRlZjE2OworICAxNzogaTMyIGRlZjE3OworICAxODogaTMyIGRlZjE4OworICAxOTogaTMyIGRlZjE5OworICAyMDogaTMyIGRlZjIwOworICAyMTogaTMyIGRlZjIxOworICAyMjogaTMyIGRlZjIyOworICAyMzogaTMyIGRlZjIzOworICAyNDogaTMyIGRlZjI0OworICAyNTogaTMyIGRlZjI1OworICAyNjogaTMyIGRlZjI2OworICAyNzogaTMyIGRlZjI3OworICAyODogaTMyIGRlZjI4OworICAyOTogaTMyIGRlZjI5OworICAzMDogaTMyIGRlZjMwOworfQorCitzdHJ1Y3QgT3B0NjQgeworICAxOiBpMzIgZGVmMTsKKyAgMjogaTMyIGRlZjI7CisgIDM6IGkzMiBkZWYzOworICA0OiBpMzIgZGVmNDsKKyAgNTogaTMyIGRlZjU7CisgIDY6IGkzMiBkZWY2OworICA3OiBpMzIgZGVmNzsKKyAgODogaTMyIGRlZjg7CisgIDk6IGkzMiBkZWY5OworICAxMDogaTMyIGRlZjEwOworICAxMTogaTMyIGRlZjExOworICAxMjogaTMyIGRlZjEyOworICAxMzogaTMyIGRlZjEzOworICAxNDogaTMyIGRlZjE0OworICAxNTogaTMyIGRlZjE1OworICAxNjogaTMyIGRlZjE2OworICAxNzogaTMyIGRlZjE3OworICAxODogaTMyIGRlZjE4OworICAxOTogaTMyIGRlZjE5OworICAyMDogaTMyIGRlZjIwOworICAyMTogaTMyIGRlZjIxOworICAyMjogaTMyIGRlZjIyOworICAyMzogaTMyIGRlZjIzOworICAyNDogaTMyIGRlZjI0OworICAyNTogaTMyIGRlZjI1OworICAyNjogaTMyIGRlZjI2OworICAyNzogaTMyIGRlZjI3OworICAyODogaTMyIGRlZjI4OworICAyOTogaTMyIGRlZjI5OworICAzMDogaTMyIGRlZjMwOworICAzMTogaTMyIGRlZjMxOworICAzMjogaTMyIGRlZjMyOworICAzMzogaTMyIGRlZjMzOworICAzNDogaTMyIGRlZjM0OworICAzNTogaTMyIGRlZjM1OworICAzNjogaTMyIGRlZjM2OworICAzNzogaTMyIGRlZjM3OworICAzODogaTMyIGRlZjM4OworICAzOTogaTMyIGRlZjM5OworICA0MDogaTMyIGRlZjQwOworICA0MTogaTMyIGRlZjQxOworICA0MjogaTMyIGRlZjQyOworICA0MzogaTMyIGRlZjQzOworICA0NDogaTMyIGRlZjQ0OworICA0NTogaTMyIGRlZjQ1OworICA0NjogaTMyIGRlZjQ2OworICA0NzogaTMyIGRlZjQ3OworICA0ODogaTMyIGRlZjQ4OworICA0OTogaTMyIGRlZjQ5OworICA1MDogaTMyIGRlZjUwOworICA1MTogaTMyIGRlZjUxOworICA1MjogaTMyIGRlZjUyOworICA1MzogaTMyIGRlZjUzOworICA1NDogaTMyIGRlZjU0OworICA1NTogaTMyIGRlZjU1OworICA1NjogaTMyIGRlZjU2OworICA1NzogaTMyIGRlZjU3OworICA1ODogaTMyIGRlZjU4OworICA1OTogaTMyIGRlZjU5OworICA2MDogaTMyIGRlZjYwOworICA2MTogaTMyIGRlZjYxOworICA2MjogaTMyIGRlZjYyOworICA2MzogaTMyIGRlZjYzOworICA2NDogaTMyIGRlZjY0OworfQorCitzdHJ1Y3QgT3B0ODAgeworICAxOiBpMzIgZGVmMTsKKyAgMjogaTMyIGRlZjI7CisgIDM6IGkzMiBkZWYzOworICA0OiBpMzIgZGVmNDsKKyAgNTogaTMyIGRlZjU7CisgIDY6IGkzMiBkZWY2OworICA3OiBpMzIgZGVmNzsKKyAgODogaTMyIGRlZjg7CisgIDk6IGkzMiBkZWY5OworICAxMDogaTMyIGRlZjEwOworICAxMTogaTMyIGRlZjExOworICAxMjogaTMyIGRlZjEyOworICAxMzogaTMyIGRlZjEzOworICAxNDogaTMyIGRlZjE0OworICAxNTogaTMyIGRlZjE1OworICAxNjogaTMyIGRlZjE2OworICAxNzogaTMyIGRlZjE3OworICAxODogaTMyIGRlZjE4OworICAxOTogaTMyIGRlZjE5OworICAyMDogaTMyIGRlZjIwOworICAyMTogaTMyIGRlZjIxOworICAyMjogaTMyIGRlZjIyOworICAyMzogaTMyIGRlZjIzOworICAyNDogaTMyIGRlZjI0OworICAyNTogaTMyIGRlZjI1OworICAyNjogaTMyIGRlZjI2OworICAyNzogaTMyIGRlZjI3OworICAyODogaTMyIGRlZjI4OworICAyOTogaTMyIGRlZjI5OworICAzMDogaTMyIGRlZjMwOworICAzMTogaTMyIGRlZjMxOworICAzMjogaTMyIGRlZjMyOworICAzMzogaTMyIGRlZjMzOworICAzNDogaTMyIGRlZjM0OworICAzNTogaTMyIGRlZjM1OworICAzNjogaTMyIGRlZjM2OworICAzNzogaTMyIGRlZjM3OworICAzODogaTMyIGRlZjM4OworICAzOTogaTMyIGRlZjM5OworICA0MDogaTMyIGRlZjQwOworICA0MTogaTMyIGRlZjQxOworICA0MjogaTMyIGRlZjQyOworICA0MzogaTMyIGRlZjQzOworICA0NDogaTMyIGRlZjQ0OworICA0NTogaTMyIGRlZjQ1OworICA0NjogaTMyIGRlZjQ2OworICA0NzogaTMyIGRlZjQ3OworICA0ODogaTMyIGRlZjQ4OworICA0OTogaTMyIGRlZjQ5OworICA1MDogaTMyIGRlZjUwOworICA1MTogaTMyIGRlZjUxOworICA1MjogaTMyIGRlZjUyOworICA1MzogaTMyIGRlZjUzOworICA1NDogaTMyIGRlZjU0OworICA1NTogaTMyIGRlZjU1OworICA1NjogaTMyIGRlZjU2OworICA1NzogaTMyIGRlZjU3OworICA1ODogaTMyIGRlZjU4OworICA1OTogaTMyIGRlZjU5OworICA2MDogaTMyIGRlZjYwOworICA2MTogaTMyIGRlZjYxOworICA2MjogaTMyIGRlZjYyOworICA2MzogaTMyIGRlZjYzOworICA2NDogaTMyIGRlZjY0OworICA2NTogaTMyIGRlZjY1OworICA2NjogaTMyIGRlZjY2OworICA2NzogaTMyIGRlZjY3OworICA2ODogaTMyIGRlZjY4OworICA2OTogaTMyIGRlZjY5OworICA3MDogaTMyIGRlZjcwOworICA3MTogaTMyIGRlZjcxOworICA3MjogaTMyIGRlZjcyOworICA3MzogaTMyIGRlZjczOworICA3NDogaTMyIGRlZjc0OworICA3NTogaTMyIGRlZjc1OworICA3NjogaTMyIGRlZjc2OworICA3NzogaTMyIGRlZjc3OworICA3ODogaTMyIGRlZjc4OworICA3OTogaTMyIGRlZjc5OworICA4MDogaTMyIGRlZjgwOworfQorCmRpZmYgLS1naXQgYS90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0IGIvdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VmYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdApAQCAtMCwwICsxLDExMCBAQAorLy8gTmFtaW5nIHRlc3RjYXNlcywgc2VwY2lmaWNhbGx5IGZvciB0aGVzZSB0aWNrZXRzIChidXQgbm90IGxpbWl0ZWQgdG8gdGhlbSkKKy8vIFRIUklGVC0yNTA4IFVuY29tcGlsZWFibGUgQyMgY29kZSBkdWUgdG8gbGFuZ3VhZ2Uga2V5d29yZHMgaW4gSURMCisvLyBUSFJJRlQtMjU1NyBlcnJvciBDUzA1NDIgbWVtYmVyIG5hbWVzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGVpciBlbmNsb3NpbmcgdHlwZQorCisKK3N0cnVjdCB1c2luZyB7CisgICAgMTogZG91YmxlIHNpbmdsZQorICAgIDI6IGRvdWJsZSBpbnRlZ2VyCit9CisKK3N0cnVjdCBkZWxlZ2F0ZSB7CisgICAgMTogc3RyaW5nIHBhcnRpYWwKKyAgICAyOiBkZWxlZ2F0ZSBkZWxlZ2F0ZQorfQorCitzdHJ1Y3QgZ2V0IHsKKyAgICAxOiBib29sIHNieXRlCit9CisKK3N0cnVjdCBwYXJ0aWFsIHsKKyAgICAxOiB1c2luZyB1c2luZworICAgIDI6IGJvb2wgcmVhZAorICAgIDM6IGJvb2wgd3JpdGUKK30KKworZW51bSBNYXliZSB7CisgIEpVU1QgPSAxLAorICBUUlVFID0gMiwKKyAgRkFMU0UgPSAzCit9CisKK2VudW0gRWl0aGVyIHsKKyAgTEVGVCA9IDEsCisgIFJJR0hUID0gMgorfQorCitzdHJ1Y3QgZm9sZHIgeworICAxOiBzdHJpbmcgaWQKK30KKworc3RydWN0IG9mIHsKKyAgMTogc3RyaW5nIGxldAorICAyOiBzdHJpbmcgd2hlcmUKK30KKworc3RydWN0IG9mT2YgeworICAxOiBvZiBPZgorfQorCisKK3N0cnVjdCBDbGFzc0FuZFByb3AgeworICAxOiBib29sIENsYXNzQW5kUHJvcAorICAyOiBib29sIENsYXNzQW5kUHJvcF8KKyAgMzogYm9vbCBDbGFzc0FuZFByb3BfXworICA0OiBib29sIENsYXNzQW5kUHJvcGVyCit9CisKK3N0cnVjdCBzZWNvbmRfY2hhbmNlIHsKKyAgMTogYm9vbCBTRUNPTkRfQ0hBTkNFCisgIDI6IGJvb2wgU0VDT05EX0NIQU5DRV8KKyAgMzogYm9vbCBTRUNPTkRfQ0hBTkNFX18KKyAgNDogYm9vbCBTRUNPTkRfQ0hBTkNFUworfQorCitzdHJ1Y3QgTk9XX0VBVF9USElTIHsKKyAgMTogYm9vbCBub3dfZWF0X3RoaXMKKyAgMjogYm9vbCBub3dfZWF0X3RoaXNfCisgIDM6IGJvb2wgbm93X2VhdF90aGlzX18KKyAgNDogYm9vbCBub3dfZWF0X3RoaXNfYW5kX3RoaXMKK30KKworc3RydWN0IFRoZUVkZ2VDYXNlIHsKKyAgMTogYm9vbCB0aGVFZGdlQ2FzZQorICAyOiBib29sIHRoZUVkZ2VDYXNlXworICAzOiBib29sIHRoZUVkZ2VDYXNlX18KKyAgNDogYm9vbCBUaGVFZGdlQ2FzZQorICA1OiBib29sIFRoZUVkZ2VDYXNlXworICA2OiBib29sIFRoZUVkZ2VDYXNlX18KK30KKworc3RydWN0IFRyaWNreV8geworICAxOiBib29sIHRyaWNreQorICAyOiBib29sIFRyaWNreQorfQorCitzdHJ1Y3QgTmVzdGVkIHsKKyAgMTogQ2xhc3NBbmRQcm9wIENsYXNzQW5kUHJvcAorICAyOiBzZWNvbmRfY2hhbmNlIHNlY29uZF9jaGFuY2UKKyAgMzogTk9XX0VBVF9USElTIE5PV19FQVRfVEhJUworICA0OiBUaGVFZGdlQ2FzZSBUaGVFZGdlQ2FzZQorICA1OiBUcmlja3lfIFRyaWNreV8KKyAgNjogTmVzdGVkIE5lc3RlZAorfQorCitleGNlcHRpb24gUHJvYmxlbV8geworICAxOiBib29sIHByb2JsZW0KKyAgMjogYm9vbCBQcm9ibGVtCit9CisKKworc2VydmljZSBleHRlcm4geworICAgIGRlbGVnYXRlIGV2ZW50KDE6IHBhcnRpYWwgZ2V0KQorICAgIHZvaWQgRm9vKDE6IE5lc3RlZCBGb29fYXJncykgdGhyb3dzICgxOiBQcm9ibGVtXyBGb29fcmVzdWx0KQorfQorCitzZXJ2aWNlIHF1YWxpZmllZCB7CisgICAgTWF5YmUgbWF5YmUoMTogTWF5YmUgZm9sZHIpCisgICAgRWl0aGVyIGVpdGhlcigxOiBmb2xkciBvZikKK30KKy8vIGVvZgpkaWZmIC0tZ2l0IGEvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQgYi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAppbmRleCA4MTA4YTdmLi5hNjA4ODk4IDEwMDY0NAotLS0gYS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorKysgYi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdApAQCAtNDksNiArNDksMTEgQEAKICAgMTogcmVxdWlyZWQgaTE2IGltX3JlcXVpcmVkOwogfQogCitzdHJ1Y3QgT3B0aW9uYWxEZWZhdWx0IHsKKyAgMTogb3B0aW9uYWwgaTE2IG9wdF9pbnQgPSAxMjM0OworICAyOiBvcHRpb25hbCBzdHJpbmcgb3B0X3N0ciA9ICJkZWZhdWx0IjsKK30KKwogc3RydWN0IENvbXBsZXggewogICAxOiAgICAgICAgICBpMTYgY3BfZGVmYXVsdDsKICAgMjogcmVxdWlyZWQgaTE2IGNwX3JlcXVpcmVkOwpAQCAtNzUsMyArODAsOSBAQAogICA1OiByZXF1aXJlZCBiaW5hcnkgcmVxX2JpbjsKICAgNjogb3B0aW9uYWwgYmluYXJ5IG9wdF9iaW47CiB9CisKK3N0cnVjdCBCaW5hcmllcyB7CisgIDQ6IGJpbmFyeSBiaW47CisgIDU6IHJlcXVpcmVkIGJpbmFyeSByZXFfYmluOworICA2OiBvcHRpb25hbCBiaW5hcnkgb3B0X2JpbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvUkVBRE1FLm1kIGIvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDY4MmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTg1IEBACisjIEFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlCisKK1RoaXMgaXMgdGhlIGNyb3NzIGV2ZXJ5dGhpbmcgaW50ZWdyYXRpb24gdGVzdCBzdWl0ZSBmb3IgQXBhY2hlIFRocmlmdC4KKworIyMgUnVuCisKKyMjIyBBLiBVc2luZyBNYWtlCisKK1RoZSB0ZXN0IGNhbiBiZSBleGVjdXRlZCBieToKKworICAgIG1ha2UgY3Jvc3MKKworVGhpcyBzdGFydHMgdGhlIFt0ZXN0LnB5XSh0ZXN0LnB5KSBzY3JpcHQgd2hpY2ggZG9lcyB0aGUgcmVhbCBjcm9zcyB0ZXN0IHdpdGgKK2RpZmZlcmVudCB0cmFuc3BvcnRzLCBwcm90b2NvbHMgYW5kIGxhbmd1YWdlcy4KKworTm90ZSB0aGF0IHRoaXMgc2tpcHMgYW55IGxhbmd1YWdlIHRoYXQgaXMgbm90IGJ1aWx0IGxvY2FsbHkuIEl0IGFsc28gc2tpcHMKK3Rlc3RzIHRoYXQgYXJlIGtub3duIHRvIGJlIGZhaWxpbmcuIElmIHlvdSBuZWVkIG1vcmUgY29udHJvbCBvdmVyIHdoaWNoIHRlc3RzCit0byBydW4sIHJlYWQgZm9sbG93aW5nIHNlY3Rpb24uCisKKyMjIyBCLiBVc2luZyB0ZXN0IHNjcmlwdCBkaXJlY3RseQorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGludm9rZSBbdGVzdC5weV0odGVzdC5weSkgZGlyZWN0bHkuIFlvdSBuZWVkIHRvIHJ1bmBtYWtlCitwcmVjcm9zc2Agb25jZSBiZWZvcmUgZXhlY3V0aW5nIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBjaGFuZ2VkIHNvbWV0aGluZyBpbiBgbm9kZWpzYCBsaWJyYXJ5IGFuZCBuZWVkIHRvIHZlcmlmeQordGhlIHBhdGNoLCB5b3UgY2FuIHNraXAgZXZlcnl0aGluZyBleGNlcHQgYG5vZGVqc2AgaXRzZWxmIGFuZCBzb21lIHJlZmVyZW5jZQoraW1wbGVtZW50YXRpb24gKGN1cnJlbnRseSBgY3BwYCBhbmQgYGphdmFgIGFyZSByZWNvbW1lbmRlZCkgbGlrZSB0aGlzOgorCisgICAgLi9jb25maWd1cmUgLS13aXRob3V0LWNfZ2xpYiAtd2l0aG91dC1jc2hhcnAgLS13aXRob3V0LWVybGFuZyAtLXdpdGhvdXQtbHVhIC4uLgorICAgIG1ha2UgcHJlY3Jvc3MgLWo4CisgICAgdGVzdC90ZXN0LnB5IC0tc2VydmVyIGNwcCxqYXZhIC0tY2xpZW50IG5vZGVqcworICAgIHRlc3QvdGVzdC5weSAtLXNlcnZlciBub2RlanMgLS1jbGllbnQgY3BwLGphdmEKKworQW5vdGhlciB1c2VmdWwgZmxhZyBpcyAtLXJlZ2V4LiBGb3IgZXhhbXBsZSwgdG8gcnVuIGFsbCB0ZXN0cyB0aGF0IGludm9sdmUKK0phdmEgVEJpbmFyeVByb3RvY29sOgorCisgICAgdGVzdC90ZXN0LnB5IC0tcmVnZXggImphdmEuKmJpbmFyeSIKKworIyMgVGVzdCBjYXNlIGRlZmluaXRpb24gZmlsZQorCitUaGUgY3Jvc3MgdGVzdCBjYXNlcyBhcmUgZGVmaW5lZCBpbiBbdGVzdHMuanNvbl0odGVzdHMuanNvbikuCitUaGUgcm9vdCBlbGVtZW50IGlzIGNvbGxlY3Rpb24gb2YgdGVzdCB0YXJnZXQgZGVmaW5pdGlvbnMuCitFYWNoIHRlc3QgdGFyZ2V0IGRlZmluaXRpb24gbG9va3MgbGlrZSB0aGlzOgorCisgICAgeworICAgICAgIm5hbWUiOiAic29tZWxpYiIsCisKKyAgICAgICJjbGllbnQiOiB7CisgICAgICAgICJjb21tYW5kIjogWyJzb21lbGliX2NsaWVudF9leGVjdXRhYmxlIl0sCisgICAgICAgICJ3b3JrZGlyIjogInNvbWVsaWIvYmluIiwKKyAgICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAgIH0sCisgICAgICAic2VydmVyIjogeworICAgICAgICAiY29tbWFuZCI6IFsic29tZWxpYl9zZXJ2ZXJfZXhlY3V0YWJsZSJdLAorICAgICAgICAid29ya2RpciI6ICJzb21lbGliL2JpbiIsCisgICAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAgICAgInNvY2tldHMiOiBbImlwIiwgImlwLXNzbCJdLAorICAgICAgfQorICAgIH0KKworRWl0aGVyIGNsaWVudCBvciBzZXJ2ZXIgZGVmaW5pdGlvbiBvciBib3RoIHNob3VsZCBiZSBwcmVzZW50LgorCitQYXJhbWV0ZXJzIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIGBjbGllbnRgIGFuZCBgc2VydmVyYCBjYW4gYmUgcHV0IHRvIHRhcmdldAorZGVmaW5pdGlvbiByb290OgorCisgICAgeworICAgICAgIm5hbWUiOiAic29tZWxpYiIsCisKKyAgICAgICJ3b3JrZGlyIjogInNvbWVsaWIvYmluIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXSwKKworICAgICAgImNsaWVudCI6IHsgImNvbW1hbmQiOiBbInNvbWVsaWJfY2xpZW50X2V4ZWN1dGFibGUiXSB9LAorICAgICAgInNlcnZlciI6IHsKKyAgICAgICAgImNvbW1hbmQiOiBbInNvbWVsaWJfc2VydmVyX2V4ZWN1dGFibGUiXSwKKyAgICAgICAgInNvY2tldHMiOiBbImlwLXNzbCJdCisgICAgICB9CisgICAgfQorCitGb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIGtleXMgYW5kIHRoZWlyIGVmZmVjdCwgc2VlIHNvdXJjZSBjb2RlCitjb21tZW50IGF0IHRoZSBvcHQgb2YgW2Nyb3NzcnVubmVyL2NvbGxlY3QucHldKGNyb3NzcnVubmVyL2NvbGxlY3QucHkpLgorCisKKyMjIExpc3Qgb2Yga25vd24gZmFpbHVyZXMKKworU2luY2UgbWFueSBjcm9zcyB0ZXN0cyBjdXJyZW50bHkgZmFpbCAobWFpbmx5IGR1ZSB0byBwYXJ0aWFsIGluY29tcGF0aWJpbGl0eQorYXJvdW5kIGV4Y2VwdGlvbiBoYW5kbGluZyksIHRoZSB0ZXN0IHNjcmlwdCBzcGVjaWZpY2FsbHkgcmVwb3J0IGZvciAibm90IGtub3duCitiZWZvcmUiIGZhaWx1cmVzLgorCitGb3IgdGhpcyBwdXJwb3NlLCB0ZXN0IGNhc2VzIGtub3duIHRvIChvY2Nhc2lvbmFsbHkpIGZhaWwgYXJlIGxpc3RlZCBpbgorYGtub3duX2ZhaWx1cmVzXzxwbGF0Zm9ybT4uanNvbmAgd2hlcmUgYDxwbGF0Zm9ybT5gIG1hdGNoZXMgd2l0aCBweXRob24KK2BwbGF0Zm9ybS5zeXN0ZW0oKWAgc3RyaW5nLgorCitDdXJyZW50bHksIG9ubHkgTGludXggdmVyc2lvbiBpcyBpbmNsdWRlZC4KKworRllJLCB0aGUgZmlsZSBpcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5CisKKyAgICB0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9b3ZlcndyaXRlCisKK2FmdGVyIGEgZnVsbCB0ZXN0IHJ1biwgdGhlbiByZXBlYXRlZGx5CisKKyAgICB0ZXN0L3Rlc3QucHkgLS1za2lwLWtub3duLWZhaWx1cmVzCisgICAgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW1lcmdlCisKK3RvIHVwZGF0ZSB0aGUga25vd24gZmFpbHVyZXMsIHJ1bgorCisgICAgbWFrZSBmYWlsCisKKyMjIFRlc3QgZXhlY3V0YWJsZSBzcGVjaWZpY2F0aW9uCisKKyMjIyBDb21tYW5kIGxpbmUgcGFyYW1ldGVycworCitVbml0IHRlc3RzIGZvciBsYW5ndWFnZXMgYXJlIHVzdWFsbHkgbG9jYXRlZCB1bmRlciBsaWIvPGxhbmc+L3Rlc3QvCitjcm9zcyBsYW5ndWFnZSB0ZXN0cyBhY2NvcmRpbmcgdG8gW1RocmlmdFRlc3QudGhyaWZ0XShUaHJpZnRUZXN0LnRocmlmdCkgc2hhbGwgYmUKK3Byb3ZpZGVkIGZvciBldmVyeSBsYW5ndWFnZSBpbmNsdWRpbmcgZXhlY3V0YWJsZXMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQKK2xpbmUgaW50ZXJmYWNlOgorCisqKlNlcnZlciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOioqCisKKyAgICAkIC4vY3BwL1Rlc3RTZXJ2ZXIgLWgKKyAgICBBbGxvd2VkIG9wdGlvbnM6CisgICAgICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4KKyAgICAgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkKKyAgICAgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCAic2ltcGxlIiwgInRocmVhZC1wb29sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciCisgICAgICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZQorICAgICAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHMKKyAgICAgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorCisqKkNsaWVudCBjb21tYW5kIGxpbmUgaW50ZXJmYWNlOioqCisKKyAgICAkIC4vY3BwL1Rlc3RDbGllbnQgLWgKKyAgICBBbGxvd2VkIG9wdGlvbnM6CisgICAgICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UKKyAgICAgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKKyAgICAgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0CisgICAgICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQKKyAgICAgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCisgICAgICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMKKyAgICAgIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzCisKK0lmIHlvdSBoYXZlIGV4ZWN1dGVkIHRoZSAqKm1ha2UgY2hlY2sqKiBvciAqKm1ha2UgY3Jvc3MqKiB0aGVuIHlvdSB3aWxsIGJlIGFibGUgdG8gYnJvd3NlCitbZ2VuLWh0bWwvVGhyaWZ0VGVzdC5odG1sXShnZW4taHRtbC9UaHJpZnRUZXN0Lmh0bWwpIHdpdGggdGhlIHRlc3QgZG9jdW1lbnRhdGlvbi4KKworIyMjIFJldHVybiBjb2RlCisKK1RoZSByZXR1cm4gY29kZSAoZXhpdCBjb2RlKSBzaGFsbCBiZSAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDEgLSAyNTUgb24gZXJyb3JzLgorSW4gb3JkZXIgdG8gc2lnbmFsIGZhaWxlZCB0ZXN0cywgdGhlIHJldHVybiBjb2RlIHNoYWxsIGJlIGNvbXBvc2VkIGZyb20gdGhlc2UgYml0cyB0byBpbmRpY2F0ZQorZmFpbGluZyB0ZXN0czoKKworICAgICAgI2RlZmluZSBURVNUX0JBU0VUWVBFUyAgICAgMSAgLy8gMDAwMCAwMDAxCisgICAgICAjZGVmaW5lIFRFU1RfU1RSVUNUUyAgICAgICAyICAvLyAwMDAwIDAwMTAKKyAgICAgICNkZWZpbmUgVEVTVF9DT05UQUlORVJTICAgIDQgIC8vIDAwMDAgMDEwMAorICAgICAgI2RlZmluZSBURVNUX0VYQ0VQVElPTlMgICAgOCAgLy8gMDAwMCAxMDAwCisgICAgICAjZGVmaW5lIFRFU1RfVU5LTk9XTiAgICAgIDY0ICAvLyAwMTAwIDAwMDAgKEZhaWxlZCB0byBwcmVwYXJlIGVudmlyb25lbXQgZXRjLikKKyAgICAgICNkZWZpbmUgVEVTVF9USU1FT1VUICAgICAxMjggIC8vIDEwMDAgMDAwMAorICAgICAgI2RlZmluZSBURVNUX05PVFVTRUQgICAgICA0OCAgLy8gMDAxMSAwMDAwIChyZXNlcnZlZCBiaXRzKQorCitUZXN0cyB0aGF0IGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQgYXQgYWxsIGNvdW50IGFzIGVycm9ycy4KKworKipFeGFtcGxlOioqCisKK0R1cmluZyB0ZXN0cywgdGhlIHRlc3QgY2xpZW50IG5vdGljZXMgdGhhdCBzb21lIG9mIHRoZSBTdHJ1Y3QgdGVzdHMgZmFpbC4KK0Z1cnRoZXJtb3JlLCBkdWUgdG8gc29tZSBvdGhlciBwcm9ibGVtIG5vbmUgb2YgdGhlIEV4Y2VwdGlvbiB0ZXN0cyBpcyBleGVjdXRlZC4KK1RoZXJlZm9yZSwgdGhlIHRlc3QgY2xpZW50IHJldHVybnMgdGhlIGNvZGUgYDEwID0gMiB8IDhgLCBpbmRpY2F0aW5nIHRoZSBmYWlsdXJlCitvZiBib3RoIHRlc3QgMiAoVEVTVF9TVFJVQ1RTKSBhbmQgdGVzdCA4IChURVNUX0VYQ0VQVElPTlMpLgorCisKKyMjIFNTTAorVGVzdCBLZXlzIGFuZCBDZXJ0aWZpY2F0ZXMgYXJlIHByb3ZpZGVkIGluIG11bHRpcGxlIGZvcm1hdHMgdW5kZXIgdGhlIGZvbGxvd2luZworZGlyZWN0b3J5IFt0ZXN0L2tleXNdKGtleXMpCmRpZmYgLS1naXQgYS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgYi90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4MjU4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUmVjdXJzaXZlLnRocmlmdApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N0cnVjdCBSZWNUcmVlIHsKKyAgMTogbGlzdDxSZWNUcmVlPiBjaGlsZHJlbgorICAyOiBpMTYgaXRlbQorfQorCitzdHJ1Y3QgUmVjTGlzdCB7CisgIDE6IFJlY0xpc3QgJiBuZXh0aXRlbQorICAzOiBpMTYgaXRlbQorfQorCitzdHJ1Y3QgQ29SZWMgeworICAxOiAgQ29SZWMyICYgb3RoZXIKK30KKworc3RydWN0IENvUmVjMiB7CisgIDE6IENvUmVjIG90aGVyCit9CisKK3N0cnVjdCBWZWN0b3JUZXN0IHsKKyAgMTogbGlzdDxSZWNMaXN0PiBsaXN0ZXI7Cit9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UKK3sKKyAgUmVjVHJlZSBlY2hvVHJlZSgxOlJlY1RyZWUgdHJlZSkKKyAgUmVjTGlzdCBlY2hvTGlzdCgxOlJlY0xpc3QgbHN0KQorICBDb1JlYyBlY2hvQ29SZWMoMTpDb1JlYyBpdGVtKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9SZXVzZU9iamVjdHMudGhyaWZ0IGIvdGVzdC9SZXVzZU9iamVjdHMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDZjNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1JldXNlT2JqZWN0cy50aHJpZnQKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGUgamF2YSBjb2RlZ2VuZXJhdG9yIGhhcyBvcHRpb24gdG8gcmV1c2Ugb2JqZWN0cyBmb3IgZGVzZXJpYWxpemF0aW9uCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgorCitzdHJ1Y3QgUmV1c2UgeworICAxOiBpMzIgdmFsMTsKKyAgMjogc2V0PHN0cmluZz4gdmFsMjsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCBiL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKaW5kZXggODdjNmU0Ny4uNDMxODExYiAxMDA2NDQKLS0tIGEvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKysgYi90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CkBAIC0xOCwxNiArMTgsMTggQEAKICAqLwogCiBuYW1lc3BhY2UgY3BwIHRlc3Quc3RyZXNzCituYW1lc3BhY2UgZCB0aHJpZnQudGVzdC5zdHJlc3MKK25hbWVzcGFjZSBnbyBzdHJlc3MKIAogc2VydmljZSBTZXJ2aWNlIHsKIAogICB2b2lkIGVjaG9Wb2lkKCksCi0gIGJ5dGUgZWNob0J5dGUoMTogYnl0ZSBhcmcpLAorICBpOCBlY2hvQnl0ZSgxOiBpOCBhcmcpLAogICBpMzIgZWNob0kzMigxOiBpMzIgYXJnKSwKICAgaTY0IGVjaG9JNjQoMTogaTY0IGFyZyksCiAgIHN0cmluZyBlY2hvU3RyaW5nKDE6IHN0cmluZyBhcmcpLAotICBsaXN0PGJ5dGU+ICBlY2hvTGlzdCgxOiBsaXN0PGJ5dGU+IGFyZyksCi0gIHNldDxieXRlPiAgZWNob1NldCgxOiBzZXQ8Ynl0ZT4gYXJnKSwKLSAgbWFwPGJ5dGUsIGJ5dGU+ICBlY2hvTWFwKDE6IG1hcDxieXRlLCBieXRlPiBhcmcpLAorICBsaXN0PGk4PiAgZWNob0xpc3QoMTogbGlzdDxpOD4gYXJnKSwKKyAgc2V0PGk4PiAgZWNob1NldCgxOiBzZXQ8aTg+IGFyZyksCisgIG1hcDxpOCwgaTg+ICBlY2hvTWFwKDE6IG1hcDxpOCwgaTg+IGFyZyksCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CmluZGV4IDIzNzAyM2IuLjM0OTlhYjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKysrIGIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdApAQCAtMzEsNiArMzEsMTkgQEAKIG5hbWVzcGFjZSBzdCBUaHJpZnRUZXN0CiBuYW1lc3BhY2UgcHkgVGhyaWZ0VGVzdAogbmFtZXNwYWNlIHB5LnR3aXN0ZWQgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGdvIHRocmlmdHRlc3QKK25hbWVzcGFjZSBwaHAgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuVGVzdAorbmFtZXNwYWNlIGNvY29hIFRocmlmdFRlc3QKK25hbWVzcGFjZSBsdWEgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL1RocmlmdFRlc3QnKQorbmFtZXNwYWNlIG5ldGNvcmUgVGhyaWZ0VGVzdAorCisvLyBQcmVzZW5jZSBvZiBuYW1lc3BhY2VzIGFuZCBzdWItbmFtZXNwYWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMKKy8vIG5vIGdlbmVyYXRvciBzaG91bGQgY29tcGlsZSB3aXRoIHdhcm5pbmdzIG9ubHkKK25hbWVzcGFjZSBub2V4aXN0IFRocmlmdFRlc3QKK25hbWVzcGFjZSBjcHAubm9leGlzdCBUaHJpZnRUZXN0CisKIG5hbWVzcGFjZSAqIHRocmlmdC50ZXN0CiAKIC8qKgpAQCAtNTgsNiArNzEsOCBAQAogICAyOiBpMzIgdHlwZQogfQogCit0eXBlZGVmIG1hcDxzdHJpbmcsQm9uaz4gTWFwVHlwZQorCiBzdHJ1Y3QgQm9vbHMgewogICAxOiBib29sIGltX3RydWUsCiAgIDI6IGJvb2wgaW1fZmFsc2UsCkBAIC02NiwxNCArODEsMTQgQEAKIHN0cnVjdCBYdHJ1Y3QKIHsKICAgMTogIHN0cmluZyBzdHJpbmdfdGhpbmcsCi0gIDQ6ICBieXRlICAgYnl0ZV90aGluZywKKyAgNDogIGk4ICAgICBieXRlX3RoaW5nLAogICA5OiAgaTMyICAgIGkzMl90aGluZywKICAgMTE6IGk2NCAgICBpNjRfdGhpbmcKIH0KIAogc3RydWN0IFh0cnVjdDIKIHsKLSAgMTogYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDE6IGk4ICAgICBieXRlX3RoaW5nLCAgLy8gdXNlZCB0byBiZSBieXRlLCBoZW5jZSB0aGUgbmFtZQogICAyOiBYdHJ1Y3Qgc3RydWN0X3RoaW5nLAogICAzOiBpMzIgICAgaTMyX3RoaW5nCiB9CkBAIC05MSwxNSArMTA2LDI0IEBACiB7CiAgIDE6IG1hcDxOdW1iZXJ6LCBVc2VySWQ+IHVzZXJNYXAsCiAgIDI6IGxpc3Q8WHRydWN0PiB4dHJ1Y3RzCi19Cit9IChweXRob24uaW1tdXRhYmxlPSAiIikKIAogc3RydWN0IENyYXp5TmVzdGluZyB7CiAgIDE6IHN0cmluZyBzdHJpbmdfZmllbGQsCiAgIDI6IG9wdGlvbmFsIHNldDxJbnNhbml0eT4gc2V0X2ZpZWxkLAotICAzOiByZXF1aXJlZCBsaXN0PCBtYXA8c2V0PGkzMj4sbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPj4+Pj4+IGxpc3RfZmllbGQsCisgIC8vIERvIG5vdCBpbnNlcnQgbGluZSBicmVhayBhcyB0ZXN0L2dvL01ha2VmaWxlLmFtIGlzIHJlbW92aW5nIHRoaXMgbGluZSB3aXRoIHBhdHRlcm4gbWF0Y2gKKyAgMzogcmVxdWlyZWQgbGlzdDxtYXA8c2V0PGkzMj4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+Pj4+IGxpc3RfZmllbGQsCiAgIDQ6IGJpbmFyeSBiaW5hcnlfZmllbGQKIH0KIAordW5pb24gU29tZVVuaW9uIHsKKyAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gbWFwX3RoaW5nLAorICAyOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAzOiBpMzIgaTMyX3RoaW5nLAorICA0OiBYdHJ1Y3QzIHh0cnVjdF90aGluZywKKyAgNTogSW5zYW5pdHkgaW5zYW5pdHlfdGhpbmcKK30KKwogZXhjZXB0aW9uIFhjZXB0aW9uIHsKICAgMTogaTMyIGVycm9yQ29kZSwKICAgMjogc3RyaW5nIG1lc3NhZ2UKQEAgLTExOCw0MyArMTQyLDE5MSBAQAogCiBzZXJ2aWNlIFRocmlmdFRlc3QKIHsKKyAgLyoqCisgICAqIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KKyAgICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJworICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisgICAqLwogICBzdHJpbmcgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdEJvb2woIiVzIiknIHdoZXJlICclcycgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworICAgKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50CisgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICovCisgIGJvb2wgICAgICAgICB0ZXN0Qm9vbCgxOiBib29sIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIFRoZSB0eXBlcyBpOCBhbmQgYnl0ZSBhcmUgc3lub255bXMsIHVzZSBvZiBpOCBpcyBlbmNvdXJhZ2VkLCBieXRlIHN0aWxsIGV4aXN0cyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4KKyAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgaTgvYnl0ZSB0byBwcmludAorICAgKiBAcmV0dXJuIGk4IC0gcmV0dXJucyB0aGUgaTgvYnl0ZSAndGhpbmcnCisgICAqLworICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogaTggdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAorICAgKiBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCisgICAqLwogICBpMzIgICAgICAgICAgdGVzdEkzMigxOiBpMzIgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RJNjQoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gaTY0IHRoaW5nIC0gdGhlIGk2NCB0byBwcmludAorICAgKiBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisgICAqLwogICBpNjQgICAgICAgICAgdGVzdEk2NCgxOiBpNjQgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3REb3VibGUoIiVmIiknIHdpdGggdGhpbmcgYXMgJyVmJworICAgKiBAcGFyYW0gZG91YmxlIHRoaW5nIC0gdGhlIGRvdWJsZSB0byBwcmludAorICAgKiBAcmV0dXJuIGRvdWJsZSAtIHJldHVybnMgdGhlIGRvdWJsZSAndGhpbmcnCisgICAqLwogICBkb3VibGUgICAgICAgdGVzdERvdWJsZSgxOiBkb3VibGUgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RCaW5hcnkoIiVzIiknIHdoZXJlICclcycgaXMgYSBoZXgtZm9ybWF0dGVkIHN0cmluZyBvZiB0aGluZydzIGRhdGEKKyAgICogQHBhcmFtIGJpbmFyeSAgdGhpbmcgLSB0aGUgYmluYXJ5IGRhdGEgdG8gcHJpbnQKKyAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKyAgICovCisgIGJpbmFyeSAgICAgICB0ZXN0QmluYXJ5KDE6IGJpbmFyeSB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCisgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyB0aGUgWHRydWN0ICd0aGluZycKKyAgICovCiAgIFh0cnVjdCAgICAgICB0ZXN0U3RydWN0KDE6IFh0cnVjdCB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE5lc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKKyAgICogQHBhcmFtIFh0cnVjdDIgdGhpbmcgLSB0aGUgWHRydWN0MiB0byBwcmludAorICAgKiBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKKyAgICovCiAgIFh0cnVjdDIgICAgICB0ZXN0TmVzdCgxOiBYdHJ1Y3QyIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogQHBhcmFtIG1hcDxpMzIsaTMyPiB0aGluZyAtIHRoZSBtYXA8aTMyLGkzMj4gdG8gcHJpbnQKKyAgICogQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworICAgKi8KICAgbWFwPGkzMixpMzI+IHRlc3RNYXAoMTogbWFwPGkzMixpMzI+IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0U3RyaW5nTWFwKCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CisgICAqIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKKyAgICovCisgIG1hcDxzdHJpbmcsc3RyaW5nPiB0ZXN0U3RyaW5nTWFwKDE6IG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogQHBhcmFtIHNldDxpMzI+IHRoaW5nIC0gdGhlIHNldDxpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCisgICAqLwogICBzZXQ8aTMyPiAgICAgdGVzdFNldCgxOiBzZXQ8aTMyPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdExpc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gbGlzdDxpMzI+IC0gcmV0dXJucyB0aGUgbGlzdDxpMzI+ICd0aGluZycKKyAgICovCiAgIGxpc3Q8aTMyPiAgICB0ZXN0TGlzdCgxOiBsaXN0PGkzMj4gdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RFbnVtKCIlZCIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBpdCdzIG51bWVyaWMgdmFsdWUKKyAgICogQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludAorICAgKiBAcmV0dXJuIE51bWJlcnogLSByZXR1cm5zIHRoZSBOdW1iZXJ6ICd0aGluZycKKyAgICovCiAgIE51bWJlcnogICAgICB0ZXN0RW51bSgxOiBOdW1iZXJ6IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0VHlwZWRlZigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAqIEBwYXJhbSBVc2VySWQgdGhpbmcgLSB0aGUgVXNlcklkIHRvIHByaW50CisgICAqIEByZXR1cm4gVXNlcklkIC0gcmV0dXJucyB0aGUgVXNlcklkICd0aGluZycKKyAgICovCiAgIFVzZXJJZCAgICAgICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAogCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RNYXBNYXAoIiVkIiknIHdpdGggaGVsbG8gYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIGhlbGxvIC0gdGhlIGkzMiB0byBwcmludAorICAgKiBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgKiAgIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgKi8KICAgbWFwPGkzMixtYXA8aTMyLGkzMj4+IHRlc3RNYXBNYXAoMTogaTMyIGhlbGxvKSwKIAotICAvKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8gKi8KKyAgLyoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKi8KICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoMTogSW5zYW5pdHkgYXJndW1lbnQpLAogCi0gIC8qIE11bHRpcGxlIHBhcmFtZXRlcnMgKi8KLSAgWHRydWN0IHRlc3RNdWx0aSgxOiBieXRlIGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE11bHRpKCknCisgICAqIEBwYXJhbSBpOCBhcmcwIC0KKyAgICogQHBhcmFtIGkzMiBhcmcxIC0KKyAgICogQHBhcmFtIGk2NCBhcmcyIC0KKyAgICogQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCisgICAqIEBwYXJhbSBOdW1iZXJ6IGFyZzQgLQorICAgKiBAcGFyYW0gVXNlcklkIGFyZzUgLQorICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gIkhlbGxvMiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEKKyAgICogICAgYW5kIGk2NF90aGluZyA9IGFyZzIKKyAgICovCisgIFh0cnVjdCB0ZXN0TXVsdGkoMTogaTggYXJnMCwgMjogaTMyIGFyZzEsIDM6IGk2NCBhcmcyLCA0OiBtYXA8aTE2LCBzdHJpbmc+IGFyZzMsIDU6IE51bWJlcnogYXJnNCwgNjogVXNlcklkIGFyZzUpLAogCi0gIC8qIEV4Y2VwdGlvbiBzcGVjaWZpZXIgKi8KLQorICAvKioKKyAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICovCiAgIHZvaWQgdGVzdEV4Y2VwdGlvbigxOiBzdHJpbmcgYXJnKSB0aHJvd3MoMTogWGNlcHRpb24gZXJyMSksCiAKLSAgLyogTXVsdGlwbGUgZXhjZXB0aW9ucyBzcGVjaWZpZXIgKi8KLQorICAvKioKKyAgICogUHJpbnQgJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyB3aXRoIGFyZzAgYXMgJyVzJyBhbmQgYXJnMSBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAqIGlmIGFyZzAgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICogZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBzdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgKiBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICovCiAgIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oMTogc3RyaW5nIGFyZzAsIDI6IHN0cmluZyBhcmcxKSB0aHJvd3MoMTogWGNlcHRpb24gZXJyMSwgMjogWGNlcHRpb24yIGVycjIpCiAKLSAgLyogVGVzdCBvbmV3YXkgdm9pZCAqLworICAvKioKKyAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAqIHNsZWVwICdzZWNvbmRzVG9TbGVlcCcKKyAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAqIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKyAgICovCiAgIG9uZXdheSB2b2lkIHRlc3RPbmV3YXkoMTppMzIgc2Vjb25kc1RvU2xlZXApCiB9CiAKIHNlcnZpY2UgU2Vjb25kU2VydmljZQogewotICB2b2lkIGJsYWhCbGFoKCkKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisgICAqIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKKyAgICovCisgIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZykKIH0KIAogc3RydWN0IFZlcnNpb25pbmdUZXN0VjEgewpAQCAtMTY3LDcgKzMzOSw3IEBACiAgICAgICAgMTogaTMyIGJlZ2luX2luX2JvdGgsCiAKICAgICAgICAyOiBpMzIgbmV3aW50LAotICAgICAgIDM6IGJ5dGUgbmV3Ynl0ZSwKKyAgICAgICAzOiBpOCBuZXdieXRlLAogICAgICAgIDQ6IGkxNiBuZXdzaG9ydCwKICAgICAgICA1OiBpNjQgbmV3bG9uZywKICAgICAgICA2OiBkb3VibGUgbmV3ZG91YmxlCkBAIC0xOTIsMyArMzY0LDQ4IEBACiBzdHJ1Y3QgR3Vlc3NQcm90b2NvbFN0cnVjdCB7CiAgIDc6IG1hcDxzdHJpbmcsc3RyaW5nPiBtYXBfZmllbGQsCiB9CisKK3N0cnVjdCBMYXJnZURlbHRhcyB7CisgIDE6IEJvb2xzIGIxLAorICAxMDogQm9vbHMgYjEwLAorICAxMDA6IEJvb2xzIGIxMDAsCisgIDUwMDogYm9vbCBjaGVja190cnVlLAorICAxMDAwOiBCb29scyBiMTAwMCwKKyAgMTUwMDogYm9vbCBjaGVja19mYWxzZSwKKyAgMjAwMDogVmVyc2lvbmluZ1Rlc3RWMiB2ZXJ0d28yMDAwLAorICAyNTAwOiBzZXQ8c3RyaW5nPiBhX3NldDI1MDAsCisgIDMwMDA6IFZlcnNpb25pbmdUZXN0VjIgdmVydHdvMzAwMCwKKyAgNDAwMDogbGlzdDxpMzI+IGJpZ19udW1iZXJzCit9CisKK3N0cnVjdCBOZXN0ZWRMaXN0c0kzMngyIHsKKyAgMTogbGlzdDxsaXN0PGkzMj4+IGludGVnZXJsaXN0Cit9CitzdHJ1Y3QgTmVzdGVkTGlzdHNJMzJ4MyB7CisgIDE6IGxpc3Q8bGlzdDxsaXN0PGkzMj4+PiBpbnRlZ2VybGlzdAorfQorc3RydWN0IE5lc3RlZE1peGVkeDIgeworICAxOiBsaXN0PHNldDxpMzI+PiBpbnRfc2V0X2xpc3QKKyAgMjogbWFwPGkzMixzZXQ8c3RyaW5nPj4gbWFwX2ludF9zdHJzZXQKKyAgMzogbGlzdDxtYXA8aTMyLHNldDxzdHJpbmc+Pj4gbWFwX2ludF9zdHJzZXRfbGlzdAorfQorc3RydWN0IExpc3RCb25rcyB7CisgIDE6IGxpc3Q8Qm9uaz4gYm9uaworfQorc3RydWN0IE5lc3RlZExpc3RzQm9uayB7CisgIDE6IGxpc3Q8bGlzdDxsaXN0PEJvbms+Pj4gYm9uaworfQorCitzdHJ1Y3QgQm9vbFRlc3QgeworICAxOiBvcHRpb25hbCBib29sIGIgPSB0cnVlOworICAyOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJ0cnVlIjsKK30KKworc3RydWN0IFN0cnVjdEEgeworICAxOiByZXF1aXJlZCBzdHJpbmcgczsKK30KKworc3RydWN0IFN0cnVjdEIgeworICAxOiBvcHRpb25hbCBTdHJ1Y3RBIGFhOworICAyOiByZXF1aXJlZCBTdHJ1Y3RBIGFiOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQgYi90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDM3NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCit0eXBlZGVmIGkzMiBNeUludDMyCit0eXBlZGVmIHN0cmluZyBNeVN0cmluZzsKKworc3RydWN0IFR5cGVkZWZUZXN0U3RydWN0IHsKKyAgMTogTXlJbnQzMiBmaWVsZF9NeUludDMyOworICAyOiBNeVN0cmluZyBmaWVsZF9NeVN0cmluZzsKKyAgMzogaTMyIGZpZWxkX0ludDMyOworICA0OiBzdHJpbmcgZmllbGRfU3RyaW5nOworfQorCit0eXBlZGVmIFR5cGVkZWZUZXN0U3RydWN0IE15U3RydWN0LApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0IGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YzkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IFVuc2FmZUJ5dGVzIHsKKyAgMTogYmluYXJ5IGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9SRUFETUUubWQgYi90ZXN0L2F1ZGl0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTJmOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorVHlwaWNhbCB1c2FnZQorPT09PT09PT09PT09PQorYGBgCit0aHJpZnQuZXhlIC0tYXVkaXQgPG9sZEZpbGU+IDxuZXdGaWxlPgorYGBgCitFeGFtcGxlIHJ1bgorPT09PT09PT09PT0KK2BgYAorPiB0aHJpZnQuZXhlIC0tYXVkaXQgdGVzdC50aHJpZnQgYnJlYWsxLnRocmlmdAorW1RocmlmdCBBdWRpdCBGYWlsdXJlOmJyZWFrMS50aHJpZnRdIE5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiBiYXNlX2Z1bmN0aW9uMworW1RocmlmdCBBdWRpdCBXYXJuaW5nOmJyZWFrMS50aHJpZnRdIENvbnN0YW50IGNvbnN0MyBoYXMgZGlmZmVyZW50IHZhbHVlCitgYGAKKworUHJvYmxlbXMgdGhhdCB0aGUgYXVkaXQgdG9vbCBjYW4gY2F0Y2gKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFcnJvcnMKKyogUmVtb3ZpbmcgYW4gZW51bSB2YWx1ZQorKiBDaGFuZ2luZyB0aGUgdHlwZSBvZiBhIHN0cnVjdCBmaWVsZAorKiBDaGFuZ2luZyB0aGUgcmVxdWlyZWQtbmVzcyBvZiBhIHN0cnVjdCBmaWVsZAorKiBSZW1vdmluZyBhIHN0cnVjdCBmaWVsZAorKiBBZGRpbmcgYSByZXF1aXJlZCBzdHJ1Y3QgZmllbGQKKyogQWRkaW5nIGEgc3RydWN0IGZpZWxkICdpbiB0aGUgbWlkZGxlJy4gIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYW4gb2xkIElEIGhhcyBiZWVuIHJlY3ljbGVkCisqIFN0cnVjdCByZW1vdmVkCisqIE9uZXdheS1uZXNzIGNoYW5nZQorKiBSZXR1cm4gdHlwZSBjaGFuZ2UKKyogTWlzc2luZyBmdW5jdGlvbgorKiBNaXNzaW5nIHNlcnZpY2UKKyogQ2hhbmdlIGluIHNlcnZpY2UgaW5oZXJpdGFuY2UKKworV2FybmluZ3MKKyogUmVtb3ZpbmcgYSBsYW5ndWFnZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KKyogQ2hhbmdpbmcgYSBuYW1lc3BhY2UKKyogQ2hhbmdpbmcgYW4gZW51bSB2YWx1ZSdzIG5hbWUKKyogUmVtb3ZpbmcgYW4gZW51bSBjbGFzcworKiBEZWZhdWx0IHZhbHVlIGNoYW5nZWQKKyogU3RydWN0IGZpZWxkIG5hbWUgY2hhbmdlCisqIFJlbW92ZWQgY29uc3RhbnQKKyogVHlwZSBvZiBjb25zdGFudCBjaGFuZ2VkCisqIFZhbHVlIG9mIGNvbnN0YW50IGNoYW5nZWQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3ZjY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxLnRocmlmdApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RocmlmdCBNZXRob2QgcmVtb3ZlZCBmcm9tIHNlcnZpY2UgYmFzZS4KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vY29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzPSBbMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTAudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEwLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY5MGFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEwLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTAgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDIgaWQgPTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazExLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlMGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazExIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QzIGlkID03CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTIudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazEyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTUyMmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEyLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBkZXJpdmVkMV9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGVudW0xIHRvIGVudW0yCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMiBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTc1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTMudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGRlcml2ZWQxX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RydWN0MSB0byBzdHJ1Y3QyCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDIgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjY2Q1MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTQudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGRlcml2ZWQxX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RyaW5nIHRvIGRvdWJsZSAKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjY5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTUudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrMTUgLSBkZXJpdmVkMl9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGxpc3Q8aTMyPiB0byBsaXN0PGkxNj4KK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTE2PiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTYudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2ZmN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTYudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrIDE2IC0gZGVyaXZlZDJfZnVuY3Rpb241IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gdG8gbWFwPHRlc3RfZW51bTMsIHRlc3RfZW51bTI+CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMywgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxNy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1M2IxNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTcudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxNyAtIGRlcml2ZWQyX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHN0cnVjdDEsc3RydWN0Mj4gdG8gbWFwPHN0cnVjdDEsIHN0cnVjdDM+CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mz4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxOC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzhiNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTgudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxOC0gb25ld2F5IHJlbW92ZWQgZnJvbSBiYXNlX29uZXdheQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxOS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTkudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGIyMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTkudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxOSAtIG9uZXdheSBhZGRlZCB0byBiYXNlX2Z1bmN0aW9uMQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICBvbmV3YXkgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGZlMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMi50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9TdHJ1Y3QgZmllbGQgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkzMiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIwLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlNWYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWsgMjAgLSBmaXJzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIxLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkYTQwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazIxLSBsYXN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0yCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwODM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMi50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazIyIC0gaW4tYmV0d2VlbiBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazIzLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5NWE0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyMy50aHJpZnQKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazIzIC0gcmVxdWlyZWQgc3RydWN0IGZpZWxkIGFkZGVkIHRvIHN0cnVjdDQKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIsCisgICAgMzogcmVxdWlyZWQgaTY0IHN0cnVjdDRfbWVtYmVyMworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRkNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI0LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjQgLSByZW1vdmVkIGluaGVyaXRhbmNlIGZyb20gZGVyaXZlZDEuCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI1LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyNS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmZTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyNS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9DaGFuZ2VkIGluaGVyaXRhbmNlIG9mIGRlcml2ZWQyCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBkZXJpdmVkMSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjYudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI2LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc2ZDliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI2LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjYgLSBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gYmFzZV9mdW5jdGlvbjEgYXJndW1lbnQgaWQ9MworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQorCmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjcudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI3LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTU2NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI3LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhazI3IC0gYXJndW1lbnQgY2hhbmdlZCBiYXNlX2Z1bmN0aW9uMiBsaXN0PGVudW0xPiB0byBsaXN0PGVudW0zPiBpZCA9OAorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0zPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazI4LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsyOC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0ZTU1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyOC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazI4LSBkZXJpdmVkMV9mdW5jdGlvbjUgYXJndWVtZW50IHR5cGUgY2hhbmdlZCBtYXA8aTY0LCBkb3VibGU+IHRvIGxpc3Q8aTY0PgorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjkudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI5LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmYzMDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI5LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjkgLSBiYXNlX2Z1bmN0aW9uMiBhcmd1ZW1udCB0eXBlIGNoYW5nZWQgbGlzdDxzdHJpbmc+IHRvIHN0cmluZworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkOTk3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMyAtIFN0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShlbnVtMSB0byBlbnVtMikKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMiBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzAudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMwLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MThkZDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMwLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhazMwLSBkZXJpdmVkMV9mdW5jdGlvbjYgYXJndW1lbnQgY2hhbmdlZCBzdHJ1Y3QxIHRvIG1hcDxzdHJ1Y3QxLHN0cnVjdDE+CituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzEudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMxLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2EzODA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMxLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMzEgLSBFeGNlcHRpb24gcmVtb3ZlZCB0byBiYXNlX2Z1bmN0aW9uMgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMyLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzZjhhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMyLSBFeGNlcHRpb24xIGZpZWxkIHR5cGUgY2hhbmdlZCBmb3IgaWQgPTEKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGk2NCBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazMzLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYmI4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszMy50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazMzIC0gZGVyaXZlZDFfZnVuY3Rpb24xIGV4Y2VwdGlvbiB0eXBlIGNoYW5nZWQuCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24xIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTNlNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzQudGhyaWZ0CkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszNCAtIEZpZWxkIGFkZGVkIHRvIHN0cnVjdCB3aXRoIEZpZWxkIElEIGJlaW5nIGluIGJldHdlZW4gdHdvIGV4aXN0aW5nIGZpZWxkIElEcworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDY6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBzdHJ1Y3QzX21lbWJlcjYsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs0LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI4ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazQudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vRmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIHN0cmluZykKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPVsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs1LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMyMmQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazUudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1lbWJlciBmaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGJvb2wgdG8gbGlzdDxib29sPikKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs2LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs2LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdhMzAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazYudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDIgKGxpc3Q8ZG91YmxlPiB0byBsaXN0PGkxNj4pCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWs3LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWs3LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFjMmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazcudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWs3IC0gcmVxdWlyZWRuZXNzIHJlbW92ZWQgaW4gc3RydWN0NgorCituYW1lc3BhY2UgY3BwIHRlc3QKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazgudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2FjMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrOC50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazggLSByZXF1aXJlZG5lc3MgYWRkZWRkIGluIHN0cnVjdDUKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazkudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazkudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjMxOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrOS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazkgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDEKKworCituYW1lc3BhY2UgY3BwIHRlc3QKKy8vQ29uc3RhbnRzCisKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC90ZXN0LnRocmlmdCBiL3Rlc3QvYXVkaXQvdGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4MzRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvdGVzdC50aHJpZnQKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC90aHJpZnRfYXVkaXRfdGVzdC5wbCBiL3Rlc3QvYXVkaXQvdGhyaWZ0X2F1ZGl0X3Rlc3QucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllZDRkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvdGhyaWZ0X2F1ZGl0X3Rlc3QucGwKQEAgLTAsMCArMSwyNjEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjYnJlYWsxIC0gVGhyaWZ0IG1ldGhvZCByZW1vdmVkIGZyb20gc2VydmljZSBiYXNlCisjYnJlYWsyIC0gU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGkxNiB0byBpMzIpCisjYnJlYWszIC0gU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGVudW0xIHRvIGVudW0yKQorI2JyZWFrNCAtIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBzdHJpbmcpCisjYnJlYWs1LSBtZW1iZXIgZmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIGxpc3Q8Ym9vbD4pCisjYnJlYWs2LSAgRmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MiAobGlzdDxkb3VibGU+IHRvIGxpc3Q8aTE2PikKKyNicmVhazcgLSByZXF1aXJlZG5lc3MgcmVtb3ZlZCBpbiBzdHJ1Y3Q2CisjYnJlYWs4IC0gcmVxdWlyZWRuZXNzIGFkZGVkZCBpbiBzdHJ1Y3Q1CisjYnJlYWs5IC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QxCisjYnJlYWsxMCAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MiBpZCA9IDEKKyNicmVhazExIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QzIGxhc3QgaWQKKyNicmVhazEyIC0gIGRlcml2ZWQxX2Z1bmN0aW9uMSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gZW51bTEgdG8gZW51bTIKKyNicmVhazEzIC0gZGVyaXZlZDFfZnVuY3Rpb242IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBzdHJ1Y3QxIHRvIHN0cnVjdDIKKyNicmVhazE0IC0gIGRlcml2ZWQxX2Z1bmN0aW9uNCByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gc3RyaW5nIHRvIGRvdWJsZSAKKyNicmVhazE1IC0gZGVyaXZlZDJfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBsaXN0PGkzMj4gdG8gbGlzdDxpMTY+CisjYnJlYWsxNiAtIGRlcml2ZWQyX2Z1bmN0aW9uNSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHRlc3RfZW51bTEsdGVzdF9lbnVtMj4gdG8gbWFwPHRlc3RfZW51bTMsIHRlc3RfZW51bTI+CisjYnJlYWsxNyAtIGRlcml2ZWQyX2Z1bmN0aW9uNiByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbWFwPHN0cnVjdDEsc3RydWN0Mj4gdG8gbWFwPHN0cnVjdDEsIHN0cnVjdDM+CisjYnJlYWsxOC0gb25ld2F5IHJlbW92ZWQgZnJvbSBiYXNlX29uZXdheQorI2JyZWFrMTkgLSBvbmV3YXkgYWRkZWQgdG8gYmFzZV9mdW5jdGlvbjEKKyNicmVhazIwIC0gZmlyc3QgZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKyNicmVhazIxLSBsYXN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0yCisjYnJlYWsyMiAtIGluLWJldHdlZW4gZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTEKKyNicmVhazIzIC0gcmVxdWlyZWQgc3RydWN0IGZpZWxkIGFkZGVkIHRvIHN0cnVjdDQKKyNicmVhazI0IC0gcmVtb3ZlZCBpbmhlcml0YW5jZSBvZiBkZXJpdmVkMS4KKyNicmVhazI1IC0gY2hhbmdlZCBpbmhlcml0YW5jZSBvZiBkZXJpdmVkMi4KKyNicmVhazI2IC0gRmllbGQgdHlwZSBjaGFuZ2VkIGluIGJhc2VfZnVuY3Rpb24xIGFyZ3VtZW50IGlkPTMKKyNicmVhazI3IC0gYXJndW1lbnQgY2hhbmdlZCBiYXNlX2Z1bmN0aW9uMiBsaXN0PGVudW0xPiB0byBsaXN0PGVudW0zPiBpZCA9OAorI2JyZWFrMjgtIGRlcml2ZWQxX2Z1bmN0aW9uNSBhcmd1ZW1lbnQgdHlwZSBjaGFuZ2VkIG1hcDxpNjQsIGRvdWJsZT4gdG8gbGlzdDxpNjQ+CisjYnJlYWsyOSAtIGJhc2VfZnVuY3Rpb24yIGFyZ3VlbW50IHR5cGUgY2hhbmdlZCBsaXN0PHN0cmluZz4gdG8gc3RyaW5nCisjYnJlYWszMC0gZGVyaXZlZDFfZnVuY3Rpb242IGFyZ3VtZW50IGNoYW5nZWQgc3RydWN0MSB0byBtYXA8c3RydWN0MSxzdHJ1Y3QxPgorI2JyZWFrMzEgLSBFeGNlcHRpb24gcmVtb3ZlZCB0byBiYXNlX2Z1bmN0aW9uMgorI2JyZWFrMzItIEV4Y2VwdGlvbjEgZmllbGQgdHlwZSBjaGFuZ2VkIGZvciBpZCA9MQorI2JyZWFrMzMgLSBkZXJpdmVkMV9mdW5jdGlvbjEgZXhjZXB0aW9uIHR5cGUgY2hhbmdlZC4KKyNicmVhazM0IC0gRmllbGQgYWRkZWQgdG8gc3RydWN0IHdpdGggRmllbGQgSUQgYmVpbmcgaW4gYmV0d2VlbiB0d28gZXhpc3RpbmcgZmllbGQgSURzCisKKyN3YXJuaW5nLnRocmlmdAorI0NoYW5naW5nIGRlZmF1bHRzCisjSWQ9MSBzdHJ1Y3Q1CisjaWQ9MiBzdHJ1Y3Q1IAorI2lkPTQgc3RydWN0MihsaXN0PGRvdWJsZT4pCisjaWQ9MyBzdHJ1Y3QyKGxpc3Q8aTY0PiAgZGVmYXVsdCB2YWx1ZXMgcmVtb3ZlZCkKKyNpZCA0IHN0cnVjdDEgY2hhbmdlIGluIGRvdWJsZSB2YWx1ZQorI2lkIDUgc3RydWN0MSAoZGVmYXVsdCBzdHJpbmcgdmFsdWUgcmVtb3ZlZCkKKyNpZD0xIHN0cnVjdDMgKGNoYW5nZSBpbiBtYXAgdmFsdWVzKQorI2lkMiBzdHJ1Y3QzIChjaGFuZ2UgaW4gbWFwIGtleXMpCisKKyNjaGFuZ2UgaW4gaW5oZXJpdGFuY2UgZm9yIGRlcml2ZWQxIGFuZCBkZXJpdmVkMgorCisjY2hhbmdlIGluIHN0cnVjdCBmaWVsZCBuYW1lcworI2lkOSBzdHJ1Y3QxCisjaWQyIHN0cnVjdDIKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBHZXRvcHQ6OlN0ZDsKKworIyBnbG9iYWxzCitteSAkZ0FyZ3VtZW50cyA9ICIiOyAgICAgICAgICAgICAgICAjIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIEF1ZGl0VG9vbAorbXkgJGdBdWRpdFRvb2xQYXRoID0gIiI7CitteSAkZ1ByZXZpb3VzVGhyaWZ0UGF0aDsgICAgICAgICAgICAjIHByZXZpb3VzIHRocmlmdCBwYXRoCitteSAkZ0N1cnJlbnRUaHJpZnRQYXRoOyAgICAgICAgICAgICAjIGN1cnJlbnQgdGhyaWZ0IHBhdGgKK215ICRnVGhyaWZ0RmlsZUZvbGRlcjsKK215ICRnQnJlYWtpbmdGaWxlc0NvdW50ID0zNDsgCisKK215ICRnVmVyYm9zZSA9IDA7CisjZnVuY3Rpb25zCitzdWIgYXVkaXRCcmVha2luZ0NoYW5nZXM7CitzdWIgYXVkaXROb25CcmVha2luZ0NoYW5nZXM7CisKK21haW4oKTsKKworc3ViIG1haW4KK3sKKyAgICBwYXJzZU9wdGlvbnMoKTsKKyAgICBhdWRpdEJyZWFraW5nQ2hhbmdlcygpOworICAgIGF1ZGl0Tm9uQnJlYWtpbmdDaGFuZ2VzKCk7Cit9CisKK3N1YiBwYXJzZU9wdGlvbnMKK3sKKyAgICBteSAlb3B0aW9ucyA9ICgpOworICAgIGlmICggZ2V0b3B0cyAoJ3ZmOm86dDonLFwlb3B0aW9ucykgKQorICAgIHsKKyAgICAgICAgIyBjdXJyZW50IChuZXcpIHRocmlmdCBmb2xkZXIKKyAgICAgICAgaWYgKCRvcHRpb25zeydmJ30pCisgICAgICAgIHsKKyAgICAgICAgICAgICRnVGhyaWZ0RmlsZUZvbGRlciA9ICRvcHRpb25zeydmJ307CisgICAgICAgICAgICAkZ1ByZXZpb3VzVGhyaWZ0UGF0aCA9ICRnVGhyaWZ0RmlsZUZvbGRlci4iL3Rlc3QudGhyaWZ0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZSAiTWlzc2luZyBGb2xkZXIgY29udGFpbmluZyB0aHJpZnQgZmlsZXNcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZigkb3B0aW9uc3sndCd9KQorICAgICAgICB7CisgICAgICAgICAgICAkZ0F1ZGl0VG9vbFBhdGggPSAkb3B0aW9uc3sndCd9OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGllICJBdWRpdCBUb29sIFBhdGggcmVxdWlyZWQgXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRvcHRpb25zeyd2J30pCisgICAgICAgIHsKKyAgICAgICAgICAgICRnVmVyYm9zZSA9IDE7CisgICAgICAgIH0KKworICAgIH0KK30KKworc3ViIGF1ZGl0QnJlYWtpbmdDaGFuZ2VzCit7CisgICAgbXkgJGJyZWFraW5nRmlsZUJhc2VOYW1lID0gJGdUaHJpZnRGaWxlRm9sZGVyLiIvYnJlYWsiOworICAgIG15ICRuZXdUaHJpZnRGaWxlOworICAgIGZvcihteSAkaT0xOyAkaSA8PSAkZ0JyZWFraW5nRmlsZXNDb3VudDsgJGkrKykKKyAgICB7CisgICAgICAgICRuZXdUaHJpZnRGaWxlID0gJGJyZWFraW5nRmlsZUJhc2VOYW1lLiIkaS50aHJpZnQiOworICAgICAgICBteSAkYXJndW1lbnRzID0gICRnUHJldmlvdXNUaHJpZnRQYXRoLiIgIi4kbmV3VGhyaWZ0RmlsZTsKKyAgICAgICAgbXkgKCRleGl0Q29kZSwgJG91dHB1dCkgPSBjYWxsVGhyaWZ0QXVkaXRUb29sKCRhcmd1bWVudHMpOworICAgICAgICBwcmludCAkb3V0cHV0IGlmICRnVmVyYm9zZSBlcSAxOworCisgICAgICAgIGlmKCRleGl0Q29kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAjIHRocmlmdF9hdWRpdCByZXR1cm5zIDEgd2hlbiBpdCBpcyBub3QgYWJsZSB0byBmaW5kIGZpbGVzIG9yIG90aGVyIG5vbi1hdWRpdCBmYWlsdXJlcworICAgICAgICAgICAgcHJpbnQgImV4aXRpbmcgd2l0aCBleGl0IGNvZGUgPTEgaSA9ICIuJGkuIlxuIjsKKyAgICAgICAgICAgIHByaW50ICRvdXRwdXQ7CisgICAgICAgICAgICBleGl0ICRleGl0Q29kZTsKKyAgICAgICAgfQorICAgICAgICBpZigkZXhpdENvZGUgIT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgIyB0aHJpZnQtYXVkaXQgcmV0dXJuIDIgZm9yIGF1ZGl0IGZhaWx1cmVzLiBTbyBmb3IgQnJlYWtpbmcgY2hhbmdlcyB3ZSBzaG91bGQgZ2V0IDIgYXMgcmV0dXJuIHZhbHVlLgorICAgICAgICAgICAgcHJpbnQgJG91dHB1dDsKKyAgICAgICAgICAgIGRpZSAiXG5URVNUIEZBSUxVUkU6IEJyZWFraW5nIENoYW5nZSBub3QgZGV0ZWN0ZWQgZm9yIHRocmlmdCBmaWxlICRuZXdUaHJpZnRGaWxlLCBjb2RlPSRleGl0Q29kZSBcbiI7CisgICAgICAgIH0KKyAgICAgICAgaWYoaW5kZXgoJG91dHB1dCxnZXRNZXNzYWdlU3ViU3RyaW5nKCJicmVhayRpIikpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICAjQXVkaXQgdG9vbCBkZXRlY3RlZCBmYWlsdXJlLCBidXQgbm90IHRoZSBleHBlY3RlZCBvbmUuIFRoZSBjaGFuZ2UgaW4gYnJlYWtpbmcgdGhyaWZ0IGZpbGUgZG9lcyBub3QgbWF0Y2ggZ2V0TWVzc2FnZVN1YlN0cmluZygpCisgICAgICAgICAgICBwcmludCAkb3V0cHV0OworICAgICAgICAgICAgZGllICJcblRlc3QgRkFJTFVSRTogQXVkaXQgdG9vbCBkZXRlY3RlZCBmYWlsdXJlLCBidXQgbm90IHRoZSBleHBlY3RlZCBvbmUhXG4iOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgI1RocmlmdCBhdWRpdCB0b29sIGhhcyBkZXRlY3RlZCBhdWRpdCBmYWlsdXJlIGFuZCBoYXMgcmV0dXJuZWQgZXhpdGVkIHRvIHN0YXR1cyBjb2RlIDIKKyAgICAgICAgICAgIHByaW50ICJUZXN0IFBhc3M6IEF1ZGl0IEZhaWx1cmUgZGV0ZWN0ZWQgZm9yIHRocmlmdCBmaWxlIGJyZWFrJGkudGhyaWZ0IFxuIjsKKyAgICAgICAgfQorICAgIH0KKworfQorCitzdWIgYXVkaXROb25CcmVha2luZ0NoYW5nZXMKK3sKKyAgICBteSAkYnJlYWtpbmdGaWxlQmFzZU5hbWUgPSAkZ1RocmlmdEZpbGVGb2xkZXIuIi93YXJuaW5nIjsKKyAgICBteSAkbmV3VGhyaWZ0RmlsZTsKKyAgICAkbmV3VGhyaWZ0RmlsZSA9ICRicmVha2luZ0ZpbGVCYXNlTmFtZS4iLnRocmlmdCI7CisgICAgbXkgJGFyZ3VtZW50cyA9ICAkZ1ByZXZpb3VzVGhyaWZ0UGF0aC4iICIuJG5ld1RocmlmdEZpbGU7CisgICAgbXkgKCRleGl0Q29kZSwgJG91dHB1dCkgPSBjYWxsVGhyaWZ0QXVkaXRUb29sKCRhcmd1bWVudHMpOworICAgIHByaW50ICRvdXRwdXQgaWYgJGdWZXJib3NlIGVxIDE7CisKKyAgICBpZigkZXhpdENvZGUgPT0gMSkKKyAgICB7CisgICAgICAgICMgdGhyaWZ0X2F1ZGl0IHJldHVybnMgMSB3aGVuIGl0IGlzIG5vdCBhYmxlIHRvIGZpbmQgZmlsZXMgb3Igb3RoZXIgbm9uLWF1ZGl0IGZhaWx1cmVzCisgICAgICAgIHByaW50ICJleGl0aW5nIHdpdGggZXhpdCBjb2RlID0gMSAgZm9yIGZpbGUgd2FybmluZy50aHJpZnRcbiI7CisgICAgICAgIGV4aXQgJGV4aXRDb2RlOworICAgIH0KKyAgICBlbHNpZigkZXhpdENvZGUgIT0gMCkKKyAgICB7CisgICAgICAgICMgdGhyaWZ0LWF1ZGl0IHJldHVybiAwIGlmIHRoZXJlIGFyZSBubyBhdWRpdCBmYWlsdXJlcy4KKyAgICAgICAgZGllICJcblRFU1QgRkFJTFVSRTogTm9uIEJyZWFraW5nIGNoYW5nZXMgcmV0dXJuZWQgZmFpbHVyZSBmb3IgdGhyaWZ0IGZpbGUgJG5ld1RocmlmdEZpbGUgXG4iOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjVGhyaWZ0IGF1ZGl0IHRvb2wgaGFzIGV4aXRlZCB3aXRoIHN0YXR1cyAwLiAKKyAgICAgICAgcHJpbnQgIlRlc3QgUGFzczogQXVkaXQgdG9vbCBleGl0cyB3aXRoIHN1Y2Nlc3MgZm9yIHdhcm5pbmdzIFxuIjsKKyAgICB9CisKKworfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNhbGwgdGhyaWZ0QXVkaXRUb29sIHNjcmlwdAorc3ViIGNhbGxUaHJpZnRBdWRpdFRvb2wgKCAkICkKK3sKKyAgICBteSAkYXJncyA9IHNoaWZ0OworCisgICAgbXkgJGNvbW1hbmQgPSAiJGdBdWRpdFRvb2xQYXRoIC0tYXVkaXQgJGFyZ3MiOworICAgIG15ICRvdXRwdXQgPSBgJGNvbW1hbmQgMj4mMWA7CisgICAgbXkgJGV4aXRDb2RlID0gJD8gPj4gODsKKworICAgIHJldHVybiAoJGV4aXRDb2RlLCRvdXRwdXQpOworfQorCitzdWIgZ2V0TWVzc2FnZVN1YlN0cmluZyggJCApCit7CisgICAgbXkgJGZpbGVOYW1lID0gc2hpZnQ7CisgICAgbXkgJWxvb2t1cFRhYmxlID0gKAorICAgICAgICAiYnJlYWsxIiAgPT4gImJhc2VfZnVuY3Rpb24zIiwKKyAgICAgICAgImJyZWFrMiIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWszIiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazQiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrNSIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWs2IiAgPT4gInRlc3Rfc3RydWN0MiIsCisgICAgICAgICJicmVhazciICA9PiAidGVzdF9zdHJ1Y3Q2IiwKKyAgICAgICAgImJyZWFrOCIgID0+ICJ0ZXN0X3N0cnVjdDUiLAorICAgICAgICAiYnJlYWs5IiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazEwIiA9PiAidGVzdF9zdHJ1Y3QyIiwKKyAgICAgICAgImJyZWFrMTEiID0+ICJ0ZXN0X3N0cnVjdDMiLAorICAgICAgICAiYnJlYWsxMiIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazEzIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb242IiwKKyAgICAgICAgImJyZWFrMTQiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjQiLAorICAgICAgICAiYnJlYWsxNSIgPT4gImRlcml2ZWQyX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazE2IiA9PiAiZGVyaXZlZDJfZnVuY3Rpb241IiwKKyAgICAgICAgImJyZWFrMTciID0+ICJkZXJpdmVkMl9mdW5jdGlvbjYiLAorICAgICAgICAiYnJlYWsxOCIgPT4gImJhc2Vfb25ld2F5IiwKKyAgICAgICAgImJyZWFrMTkiID0+ICJiYXNlX2Z1bmN0aW9uMSIsCisgICAgICAgICJicmVhazIwIiA9PiAidGVzdF9lbnVtMSIsCisgICAgICAgICJicmVhazIxIiA9PiAidGVzdF9lbnVtMiIsCisgICAgICAgICJicmVhazIyIiA9PiAidGVzdF9lbnVtMSIsCisgICAgICAgICJicmVhazIzIiA9PiAidGVzdF9zdHJ1Y3Q0IiwKKyAgICAgICAgImJyZWFrMjQiID0+ICJkZXJpdmVkMSIsCisgICAgICAgICJicmVhazI1IiA9PiAiZGVyaXZlZDIiLAorICAgICAgICAiYnJlYWsyNiIgPT4gImJhc2VfZnVuY3Rpb24xIiwKKyAgICAgICAgImJyZWFrMjciID0+ICJiYXNlX2Z1bmN0aW9uMl9hcmdzIiwKKyAgICAgICAgImJyZWFrMjgiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjVfYXJncyIsCisgICAgICAgICJicmVhazI5IiA9PiAiYmFzZV9mdW5jdGlvbjJfYXJncyIsCisgICAgICAgICJicmVhazMwIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb242IiwKKyAgICAgICAgImJyZWFrMzEiID0+ICJiYXNlX2Z1bmN0aW9uMl9leGNlcHRpb24iLAorICAgICAgICAiYnJlYWszMiIgPT4gInRlc3RfZXhjZXB0aW9uMSIsCisgICAgICAgICJicmVhazMzIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb24xX2V4Y2VwdGlvbiIsCisgICAgICAgICJicmVhazM0IiA9PiAidGVzdF9zdHJ1Y3QzIiwKKyAgICApOworICAgIGlmIChub3QgZXhpc3RzICRsb29rdXBUYWJsZXsgJGZpbGVOYW1lIH0pCisgICAgeworICAgICAgICBwcmludCAiaW4gdGhlIG51bGwgY2FzZVxuIjsKKyAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICB9CisgICAgCisgICAgbXkgJHJldHZhbCA9ICRsb29rdXBUYWJsZXsgJGZpbGVOYW1lIH07CisgICAgcHJpbnQgIiRmaWxlTmFtZSA9PiAkcmV0dmFsXG4iOworICAgIHJldHVybiAkbG9va3VwVGFibGV7ICRmaWxlTmFtZSB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC93YXJuaW5nLnRocmlmdCBiL3Rlc3QvYXVkaXQvd2FybmluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5MmQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvd2FybmluZy50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKKworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4yOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJjbGFzcyIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi40LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIGNoYW5nZWQxOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBjaGFuZ2VkMjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMywKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0ID1bMS4wLCAyLjFdLAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjEwLCAyOjIwfSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxOjEuMSwgMjoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEgPSAxLjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzcyIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2V7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtIGIvdGVzdC9jX2dsaWIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGEwM2QyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Y2dsaWIubGEKK25vZGlzdF9saWJ0ZXN0Y2dsaWJfbGFfU09VUkNFUyA9IFwKKwlnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIFwKKwlnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIFwKKwlnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCisKK2xpYnRlc3RjZ2xpYl9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK3ByZWNyb3NzOiBsaWJ0ZXN0Y2dsaWIubGEgdGVzdF9jbGllbnQgdGVzdF9zZXJ2ZXIKKworY2hlY2tfUFJPR1JBTVMgPSBcCisJdGVzdF9jbGllbnQgXAorCXRlc3Rfc2VydmVyCisKK3Rlc3RfY2xpZW50X1NPVVJDRVMgPSBcCisJc3JjL3Rlc3RfY2xpZW50LmMKKwordGVzdF9jbGllbnRfTERBREQgPSBcCisJbGlidGVzdGNnbGliLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK3Rlc3Rfc2VydmVyX1NPVVJDRVMgPSBcCisJc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYyBcCisJc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBcCisJc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMgXAorCXNyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oIFwKKwlzcmMvdGVzdF9zZXJ2ZXIuYworCit0ZXN0X3NlcnZlcl9MREFERCA9IFwKKwlsaWJ0ZXN0Y2dsaWIubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgLXIgJDwKKworQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKQorQU1fQ1hYRkxBR1MgPSAkKEFNX0NGTEFHUykKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2xpYi9jX2dsaWIvc3JjIC1JZ2VuLWNfZ2xpYgorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgQEdDT1ZfTERGTEFHU0AKKworY2xlYW4tbG9jYWw6CisJJChSTSkgZ2VuLWNfZ2xpYi8qCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjL3Rlc3RfY2xpZW50LmMgXAorCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAorCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAorCXNyYy90ZXN0X3NlcnZlci5jCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjRhYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYwpAQCAtMCwwICsxLDE4MDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorCisvKiBIYW5kbGUgU0lHUElQRSBzaWduYWxzIChpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUKKyAgIGNvbm5lY3Rpb24gcHJlbWF0dXJlbHkpIGJ5IG91dHB1dHRpbmcgYW4gZXJyb3IgbWVzc2FnZSBiZWZvcmUKKyAgIGV4aXRpbmcuICovCitzdGF0aWMgdm9pZAorc2lncGlwZV9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIEZsdXNoIHN0YW5kYXJkIG91dHB1dCB0byBtYWtlIHN1cmUgdGhlIHRlc3QgcmVzdWx0cyBzbyBmYXIgYXJlCisgICAgIGxvZ2dlZCAqLworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgZnB1dHMgKCJCcm9rZW4gcGlwZSAoc2VydmVyIGNsb3NlZCBjb25uZWN0aW9uIHByZW1hdHVyZWx5KVxuIiwgc3RkZXJyKTsKKyAgZmZsdXNoIChzdGRlcnIpOworCisgIC8qIFJlLXJhaXNlIHRoZSBzaWduYWwsIHRoaXMgdGltZSBpbnZva2luZyB0aGUgZGVmYXVsdCBzaWduYWwKKyAgICAgaGFuZGxlciwgdG8gdGVybWluYXRlIHRoZSBwcm9ncmFtICovCisgIHJhaXNlIChTSUdQSVBFKTsKK30KKworLyogQ29tcGFyZSB0d28gZ2ludDMyIHZhbHVlcy4gVXNlZCBmb3Igc29ydGluZyBhbmQgZmluZGluZyBpbnRlZ2VyCisgICB2YWx1ZXMgd2l0aGluIGEgR0xpc3QuICovCitzdGF0aWMgZ2ludAorZ2ludDMyX2NvbXBhcmUgKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBnaW50MzIgaW50MzJfYSA9ICooZ2ludDMyICopYTsKKyAgZ2ludDMyIGludDMyX2IgPSAqKGdpbnQzMiAqKWI7CisgIGludCByZXN1bHQgPSAwOworCisgIGlmIChpbnQzMl9hIDwgaW50MzJfYikKKyAgICByZXN1bHQgPSAtMTsKKyAgZWxzZSBpZiAoaW50MzJfYSA+IGludDMyX2IpCisgICAgcmVzdWx0ID0gMTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEl0IGdldHMgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aGljaCB1c2VzIGEgY29uY3JldGUgcHJvdG9jb2wgdW5kZXJuZWF0aAorICogQHBhcmFtICBwcm90b2NvbF9uYW1lICB0aGUgZnVsbHkgcXVhbGlmaWVkIHByb3RvY29sIHBhdGggKGUuZy4gImJpbmFyeTptdWx0aSIpCisgKiBAcGFyYW0gIHRyYW5zcG9ydCAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICogQHBhcmFtICBzZXJ2aWNlX25hbWUgICB0aGUgc2luZ2xlIHN1cHBvcnRlZCBzZXJ2aWNlIG5hbWUKKyAqIEB0b2RvICAgICAgICAgICAgICAgICAgbmVlZCB0byBhbGxvdyBtdWx0aXBsZSBzZXJ2aWNlcyB0byBmdWxseSB0ZXN0IG11bHRpcGxleGVkCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgIGEgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd3JhcHBpbmcgdGhlIGNvcnJlY3QgdW5kZXJseWluZyBwcm90b2NvbAorICovCitUaHJpZnRQcm90b2NvbCAqCitnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2woZ2NoYXIgKnByb3RvY29sX25hbWUsIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBnY2hhciAqc2VydmljZV9uYW1lKQoreworICBUaHJpZnRQcm90b2NvbCAqIG11bHRpcGxleGVkX3Byb3RvY29sID0gTlVMTDsKKworICBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImJpbmFyeToiLCA3KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImNvbXBhY3Q6IiwgOCkgPT0gMCkgeworICAgIG11bHRpcGxleGVkX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbXVsdGlwbGV4IHByb3RvY29sIG5hbWU6ICVzXG4iLCBwcm90b2NvbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLAorICAgICAgICAgICJ0cmFuc3BvcnQiLCAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgICAicHJvdG9jb2wiLCAgICAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCwKKyAgICAgICAgICAic2VydmljZS1uYW1lIiwgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgTlVMTCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdGF0aWMgZ2NoYXIgKiAgaG9zdCA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBwb3J0ID0gOTA5MDsKKyAgc3RhdGljIGdib29sZWFuIHNzbCAgPSBGQUxTRTsKKyAgc3RhdGljIGdjaGFyICogIHRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2NoYXIgKiAgcHJvdG9jb2xfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdpbnQgICAgIG51bV90ZXN0cyA9IDE7CisKKyAgc3RhdGljCisgICAgR09wdGlvbkVudHJ5IG9wdGlvbl9lbnRyaWVzW10gPXsKKyAgICB7ICJob3N0IiwgICAgICAgICAgICAnaCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJmhvc3QsCisgICAgICAiSG9zdCB0byBjb25uZWN0ICg9bG9jYWxob3N0KSIsIE5VTEwgfSwKKyAgICB7ICJwb3J0IiwgICAgICAgICAgICAncCcsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnBvcnQsCisgICAgICAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCAoPTkwOTApIiwgTlVMTCB9LAorICAgIHsgInNzbCIsICAgICAgICAgICAgICdzJywgMCwgR19PUFRJT05fQVJHX05PTkUsICAgICAmc3NsLAorICAgICAgIkVuYWJsZSBTU0wiLCBOVUxMIH0sCisgICAgeyAidHJhbnNwb3J0IiwgICAgICAgJ3QnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZ0cmFuc3BvcnRfb3B0aW9uLAorICAgICAgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCAoPWJ1ZmZlcmVkKSIsIE5VTEwgfSwKKyAgICB7ICJwcm90b2NvbCIsICAgICAgICAncicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnByb3RvY29sX29wdGlvbiwKKyAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBtdWx0aSwgbXVsdGljICg9YmluYXJ5KSIsIE5VTEwgfSwKKyAgICB7ICJ0ZXN0bG9vcHMiLCAgICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKKyAgICAgICJOdW1iZXIgb2YgdGVzdHMgKD0xKSIsIE5VTEwgfSwKKyAgICB7IE5VTEwgfQorICB9OworCisgIHN0cnVjdCBzaWdhY3Rpb24gc2lncGlwZV9hY3Rpb247CisKKyAgR1R5cGUgIHNvY2tldF90eXBlICAgID0gVEhSSUZUX1RZUEVfU09DS0VUOworICBnY2hhciAqc29ja2V0X25hbWUgICAgPSAiaXAiOworICBHVHlwZSAgdHJhbnNwb3J0X3R5cGUgPSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQ7CisgIGdjaGFyICp0cmFuc3BvcnRfbmFtZSA9ICJidWZmZXJlZCI7CisgIEdUeXBlICBwcm90b2NvbF90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTDsKKyAgZ2NoYXIgKnByb3RvY29sX25hbWUgID0gImJpbmFyeSI7CisKKyAgVGhyaWZ0U29ja2V0ICAgICpzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sMiA9IE5VTEw7ICAgICAgICAgICAgLy8gZm9yIG11bHRpcGxleGVkIHRlc3RzCisKKyAgVFRlc3RUaHJpZnRUZXN0SWYgKnRlc3RfY2xpZW50ID0gTlVMTDsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKnNlY29uZF9zZXJ2aWNlID0gTlVMTDsgIC8vIGZvciBtdWx0aXBsZXhlZCB0ZXN0cworCisgIHN0cnVjdCB0aW1ldmFsIHRpbWVfc3RhcnQsIHRpbWVfc3RvcCwgdGltZV9lbGFwc2VkOworICBndWludDY0IHRpbWVfZWxhcHNlZF91c2VjLCB0aW1lX3RvdGFsX3VzZWMgPSAwOworICBndWludDY0IHRpbWVfbWluX3VzZWMgPSBHX01BWFVJTlQ2NCwgdGltZV9tYXhfdXNlYyA9IDAsIHRpbWVfYXZnX3VzZWM7CisKKyAgR09wdGlvbkNvbnRleHQgKm9wdGlvbl9jb250ZXh0OworICBnYm9vbGVhbiBvcHRpb25zX3ZhbGlkID0gVFJVRTsKKyAgaW50IHRlc3RfbnVtID0gMDsKKyAgaW50IGZhaWxfY291bnQgPSAwOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogQ29uZmlndXJlIGFuZCBwYXJzZSBvdXIgY29tbWFuZC1saW5lIG9wdGlvbnMgKi8KKyAgb3B0aW9uX2NvbnRleHQgPSBnX29wdGlvbl9jb250ZXh0X25ldyAoTlVMTCk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAob3B0aW9uX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGlmICghZ19vcHRpb25fY29udGV4dF9wYXJzZSAob3B0aW9uX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0dXJuIDI1NTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKG9wdGlvbl9jb250ZXh0KTsKKworICAvKiBTZXQgcmVtYWluaW5nIGRlZmF1bHQgdmFsdWVzIGZvciB1bnNwZWNpZmllZCBvcHRpb25zICovCisgIGlmIChob3N0ID09IE5VTEwpCisgICAgaG9zdCA9IGdfc3RyZHVwICgibG9jYWxob3N0Iik7CisKKyAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCisgIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJjb21wYWN0IiwgOCkgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiYmluYXJ5Om11bHRpIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGljIiwgNykgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpID09IDApIHsKKyAgICAgIHByaW50ZigiV2UgYXJlIGdvaW5nIHdpdGggZGVmYXVsdCBwcm90b2NvbFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmICh0cmFuc3BvcnRfb3B0aW9uICE9IE5VTEwpIHsKKyAgICBpZiAoc3RybmNtcCAodHJhbnNwb3J0X29wdGlvbiwgImZyYW1lZCIsIDcpID09IDApIHsKKyAgICAgIHRyYW5zcG9ydF90eXBlID0gVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVDsKKyAgICAgIHRyYW5zcG9ydF9uYW1lID0gImZyYW1lZCI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHRyYW5zcG9ydF9vcHRpb24sICJidWZmZXJlZCIsIDkpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gdHJhbnNwb3J0IHR5cGUgJXNcbiIsIHRyYW5zcG9ydF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmIChzc2wpIHsKKyAgICBzb2NrZXRfdHlwZSA9IFRIUklGVF9UWVBFX1NTTF9TT0NLRVQ7CisgICAgc29ja2V0X25hbWUgPSAiaXAtc3NsIjsKKyAgICBwcmludGYoIlR5cGUgbmFtZSAlc1xuIiwgZ190eXBlX25hbWUgKHNvY2tldF90eXBlKSk7CisgIH0KKworICBpZiAoIW9wdGlvbnNfdmFsaWQpCisgICAgcmV0dXJuIDI1NDsKKworICBwcmludGYgKCJDb25uZWN0aW5nICglcy8lcykgdG86ICVzLyVzOiVkXG4iLAorICAgICAgICAgIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgIHByb3RvY29sX25hbWUsCisgICAgICAgICAgc29ja2V0X25hbWUsCisgICAgICAgICAgaG9zdCwKKyAgICAgICAgICBwb3J0KTsKKworICAvKiBJbnN0YWxsIG91ciBTSUdQSVBFIGhhbmRsZXIsIHdoaWNoIG91dHB1dHMgYW4gZXJyb3IgbWVzc2FnZSB0bworICAgICBzdGFuZGFyZCBlcnJvciBiZWZvcmUgZXhpdGluZyBzbyB0ZXN0ZXJzIGNhbiBrbm93IHdoYXQKKyAgICAgaGFwcGVuZWQgKi8KKyAgbWVtc2V0ICgmc2lncGlwZV9hY3Rpb24sIDAsIHNpemVvZiAoc2lncGlwZV9hY3Rpb24pKTsKKyAgc2lncGlwZV9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ3BpcGVfaGFuZGxlcjsKKyAgc2lncGlwZV9hY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7CisgIHNpZ2FjdGlvbiAoU0lHUElQRSwgJnNpZ3BpcGVfYWN0aW9uLCBOVUxMKTsKKworICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKCk7CisgIH0KKworICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChzb2NrZXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHNzbCAmJiAhdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRIUklGVF9TU0xfU09DS0VUKHNvY2tldCksICIuLi9rZXlzL0NBLnBlbSIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB2YWxpZGF0aW9uIGNlcnRpZmljYXRlIC4uL2tleXMvQ0EucGVtIC0gZGlkIHlvdSBydW4gaW4gdGhlIHRlc3QvY19nbGliIGRpcmVjdG9yeT9cbiIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICByZXR1cm4gMjUzOworICB9CisKKyAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmKHByb3RvY29sX3R5cGU9PVRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSB7CisgICAgLy8gVE9ETzogQSBtdWx0aXBsZXhlZCB0ZXN0IHNob3VsZCBhbHNvIHRlc3QgIlNlY29uZCIgKHNlZSBKYXZhIFRlc3RTZXJ2ZXIpCisgICAgLy8gVGhlIGNvbnRleHQgY29tZXMgZnJvbSB0aGUgbmFtZSBvZiB0aGUgdGhyaWZ0IGZpbGUuIElmIG11bHRpcGxlIHRocmlmdAorICAgIC8vIHNjaGVtYXMgYXJlIHVzZWQgd2UgaGF2ZSB0byByZWRvIHRoZSB3YXkgdGhpcyBpcyBkb25lLgorICAgIHByb3RvY29sID0gZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKHByb3RvY29sX25hbWUsIHRyYW5zcG9ydCwgIlRocmlmdFRlc3QiKTsKKyAgICBpZiAoTlVMTCA9PSBwcm90b2NvbCkgeworICAgICAgZ19jbGVhcl9vYmplY3QgKCZ0cmFuc3BvcnQpOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZzb2NrZXQpOworICAgICAgcmV0dXJuIDI1MjsKKyAgICB9CisKKyAgICAvLyBNYWtlIGEgc2Vjb25kIHByb3RvY29sIGFuZCBjbGllbnQgcnVubmluZyBvbiB0aGUgc2FtZSBtdWx0aXBsZXhlZCB0cmFuc3BvcnQKKyAgICBwcm90b2NvbDIgPSBnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wocHJvdG9jb2xfbmFtZSwgdHJhbnNwb3J0LCAiU2Vjb25kU2VydmljZSIpOworICAgIHNlY29uZF9zZXJ2aWNlID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TRUNPTkRfU0VSVklDRV9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIH1lbHNleworICAgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF90eXBlLAorICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICBOVUxMKTsKKyAgfQorCisgIHRlc3RfY2xpZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBFeGVjdXRlIHRoZSBhY3R1YWwgdGVzdHMgKi8KKyAgZm9yICh0ZXN0X251bSA9IDA7IHRlc3RfbnVtIDwgbnVtX3Rlc3RzOyArK3Rlc3RfbnVtKSB7CisgICAgaWYgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKSB7CisgICAgICBnY2hhciAgICpzdHJpbmcgID0gTlVMTDsKKyAgICAgIGdib29sZWFuIGJvb2xlYW4gPSAwOworICAgICAgZ2ludDggICAgYnl0ZSAgICA9IDA7CisgICAgICBnaW50MzIgICBpbnQzMiAgID0gMDsKKyAgICAgIGdpbnQ2NCAgIGludDY0ICAgPSAwOworICAgICAgZ2RvdWJsZSAgZHViICAgICA9IDA7CisKKyAgICAgIGdpbnQgYnl0ZV90aGluZywgaTMyX3RoaW5nLCBpbm5lcl9ieXRlX3RoaW5nLCBpbm5lcl9pMzJfdGhpbmc7CisgICAgICBnaW50NjQgaTY0X3RoaW5nLCBpbm5lcl9pNjRfdGhpbmc7CisKKyAgICAgIFRUZXN0WHRydWN0ICAqeHRydWN0X291dCwgICp4dHJ1Y3Rfb3V0MiwgKnh0cnVjdF9pbiwgICppbm5lcl94dHJ1Y3RfaW47CisgICAgICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfb3V0LCAqeHRydWN0Ml9pbjsKKworICAgICAgR0hhc2hUYWJsZSAqbWFwX291dCwgKm1hcF9pbiwgKmlubmVyX21hcF9pbjsKKyAgICAgIEdIYXNoVGFibGUgKnNldF9vdXQsICpzZXRfaW47CisgICAgICBncG9pbnRlciBrZXksIHZhbHVlOworICAgICAgZ2ludDMyICppMzJfa2V5X3B0ciwgKmkzMl92YWx1ZV9wdHI7CisgICAgICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXIsIGlubmVyX2hhc2hfdGFibGVfaXRlcjsKKyAgICAgIEdMaXN0ICprZXlzX291dCwgKmtleXNfaW4sICprZXlzX2VsZW07CisKKyAgICAgIEdBcnJheSAqbGlzdF9vdXQsICpsaXN0X2luOworCisgICAgICBUVGVzdE51bWJlcnogbnVtYmVyejsKKyAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6MjsKKworICAgICAgVFRlc3RVc2VySWQgdXNlcl9pZCwgKnVzZXJfaWRfcHRyLCAqdXNlcl9pZF9wdHIyOworCisgICAgICBUVGVzdEluc2FuaXR5ICppbnNhbml0eV9vdXQsICppbnNhbml0eV9pbjsKKyAgICAgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICAgICAgR0hhc2hUYWJsZUl0ZXIgdXNlcl9tYXBfaXRlcjsKKyAgICAgIEdQdHJBcnJheSAqeHRydWN0czsKKworICAgICAgVFRlc3RYY2VwdGlvbiAgKnhjZXB0aW9uICA9IE5VTEw7CisgICAgICBUVGVzdFhjZXB0aW9uMiAqeGNlcHRpb24yID0gTlVMTDsKKworICAgICAgZ2Jvb2xlYW4gb25ld2F5X3Jlc3VsdDsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIG9uZXdheV9zdGFydCwgb25ld2F5X2VuZCwgb25ld2F5X2VsYXBzZWQ7CisgICAgICBnaW50IG9uZXdheV9lbGFwc2VkX3VzZWM7CisKKyAgICAgIGdib29sZWFuIGZpcnN0OworICAgICAgZ2ludDMyIGksIGo7CisKKyAgICAgIHByaW50ZiAoIlRlc3QgIyVkLCBjb25uZWN0ICVzOiVkXG4iLCB0ZXN0X251bSArIDEsIGhvc3QsIHBvcnQpOworICAgICAgZ2V0dGltZW9mZGF5ICgmdGltZV9zdGFydCwgTlVMTCk7CisKKyAgICAgIC8qIFRoZXNlIHRlc3Qgcm91dGluZXMgaGF2ZSBiZWVuIHBvcnRlZCBmcm9tIHRoZSBDKysgdGVzdAorICAgICAgICAgY2xpZW50LCBjYXJlIGJlaW5nIHRha2VuIHRvIGVuc3VyZSB0aGVpciBvdXRwdXQgcmVtYWlucyBhcworICAgICAgICAgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIG9yaWdpbmFsIHRvIGZhY2lsaXRhdGUgZGlmZnMuCisKKyAgICAgICAgIEZvciBzaW1wbGljaXR5IGNvbW1lbnRzIGhhdmUgYmVlbiBvbWl0dGVkLCBidXQgZXZlcnkgcm91dGluZQorICAgICAgICAgaGFzIHRoZSBzYW1lIGJhc2ljIHN0cnVjdHVyZToKKworICAgICAgICAgLSBDcmVhdGUgYW5kIHBvcHVsYXRlIGRhdGEgc3RydWN0dXJlcyBhcyBuZWNlc3NhcnkuCisKKyAgICAgICAgIC0gRm9ybWF0IGFuZCBvdXRwdXQgKHRvIHRoZSBjb25zb2xlKSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAgICAgICBvdXRnb2luZyBkYXRhLgorCisgICAgICAgICAtIElzc3VlIHRoZSByZW1vdGUgbWV0aG9kIGNhbGwgdG8gdGhlIHNlcnZlci4KKworICAgICAgICAgLSBGb3JtYXQgYW5kIG91dHB1dCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXR1cm5lZCBkYXRhLgorCisgICAgICAgICAtIFZlcmlmeSB0aGUgcmV0dXJuZWQgZGF0YSBtYXRjaGVzIHdoYXQgd2FzIGV4cGVjdGVkLgorCisgICAgICAgICAtIERlYWxsb2NhdGUgYW55IGNyZWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgorCisgICAgICAgICBOb3RlIHRoZSByZWNvZ25pemVkIHZhbHVlcyBhbmQgZXhwZWN0ZWQgYmVoYXZpb3VyIG9mIGVhY2gKKyAgICAgICAgIHJlbW90ZSBtZXRob2QgYXJlIGRlc2NyaWJlZCBpbiBUaHJpZnRUZXN0LnRocmlmdCwgd2hpY2gKKyAgICAgICAgIHlvdSdsbCBmaW5kIGluIHRoZSB0b3AtbGV2ZWwgInRlc3QiIGZvbGRlci4gKi8KKworICAgICAgLyoqCisgICAgICAgKiBWT0lEIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFZvaWQoKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3ZvaWQgKHRlc3RfY2xpZW50LCAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHZvaWRcbiIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmKGVycm9yIT1OVUxMKXsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogU1RSSU5HIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9zdHJpbmcgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICBpZiAoc3RybmNtcCAoc3RyaW5nLCAiVGVzdCIsIDUpICE9IDApCisgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBNdWx0aXBsZXhlZCBUZXN0IC0gZG8gdGhpcyByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBub3JtYWwgVGVzdCBDbGllbnQgcnVuCisgICAgICAgKi8KKyAgICAgIGlmIChzZWNvbmRfc2VydmljZSkgeworICAgICAgICBwcmludGYgKCJ0ZXN0U2Vjb25kU2VydmljZU11bHRpcGxleFNlY29uZFRlc3RTdHJpbmcoXCIybmRcIikiKTsKKyAgICAgICAgaWYgKHRfdGVzdF9zZWNvbmRfc2VydmljZV9pZl9zZWNvbmR0ZXN0X3N0cmluZyAoc2Vjb25kX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIybmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmluZywgInRlc3RTdHJpbmcoXCIybmRcIikiKSAhPSAwKSB7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBCT09MIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJ5dGUodHJ1ZSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ib29sICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJXNcbiIsIGJvb2xlYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgaWYgKGJvb2xlYW4gIT0gMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZShmYWxzZSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ib29sICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJXNcbiIsIGJvb2xlYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgaWYgKGJvb2xlYW4gIT0gMCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQllURSBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RCeXRlKDEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYnl0ZSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBieXRlKTsKKyAgICAgICAgaWYgKGJ5dGUgIT0gMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSgtMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ieXRlICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBieXRlKTsKKyAgICAgICAgaWYgKGJ5dGUgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEkzMiBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RJMzIoLTEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaTMyICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZFxuIiwgaW50MzIpOworICAgICAgICBpZiAoaW50MzIgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEk2NCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2k2NCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDY0KS0zNDM1OTczODM2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJSIgUFJJZDY0ICJcbiIsIGludDY0KTsKKyAgICAgICAgaWYgKGludDY0ICE9IChnaW50NjQpLTM0MzU5NzM4MzY4KQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBET1VCTEUgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9kb3VibGUgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01LjIwOTg1MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVmXG4iLCBkdWIpOworICAgICAgICBpZiAoKGR1YiAtICgtNS4yMDk4NTIzKSkgPiAwLjAwMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJpbmFyeShlbXB0eSkiKTsKKyAgICAgIEdCeXRlQXJyYXkgKmVtcHR5QXJyYXkgPSBnX2J5dGVfYXJyYXlfbmV3KCk7CisgICAgICBHQnl0ZUFycmF5ICpyZXN1bHQgPSBOVUxMOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2JpbmFyeSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGlmIChzaXogPT0gMCkgeworICAgICAgICAgIHByaW50ZigiID0gZW1wdHlcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiID0gbm90IGVtcHR5ICglbGQgYnl0ZXMpXG4iLCAobG9uZylzaXopOworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgICBnX2J5dGVzX3VucmVmKHJlc3BvbnNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZ19ieXRlX2FycmF5X3VucmVmKGVtcHR5QXJyYXkpOworICAgICAgZW1wdHlBcnJheSA9IE5VTEw7CisKKyAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgd2l0aCBkYXRhCisgICAgICBwcmludGYgKCJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiKTsKKyAgICAgIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworICAgICAgR0J5dGVBcnJheSAqZnVsbEFycmF5ID0gZ19ieXRlX2FycmF5X25ldygpOworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZChmdWxsQXJyYXksIChndWludDggKikoJmJpbl9kYXRhWzBdKSwgMjU2KTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9iaW5hcnkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGdjb25zdHBvaW50ZXIgcHRyID0gZ19ieXRlc19nZXRfZGF0YShyZXNwb25zZSwgJnNpeik7CisgICAgICAgIGlmIChzaXogPT0gMjU2KSB7CisgICAgICAgICAgZ2Jvb2xlYW4gZmlyc3QgPSAxOworICAgICAgICAgIGdib29sZWFuIGZhaWxlZCA9IDA7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICBpbnQgdmFsID0gKChzaWduZWQgY2hhciAqKXB0cilbaV07CisgICAgICAgICAgICBwcmludGYoIiVkIiwgdmFsKTsKKyAgICAgICAgICAgIGlmICghZmFpbGVkICYmIHZhbCAhPSBpIC0gMTI4KSB7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigifSAiKTsKKyAgICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICBwcmludGYoIkZBSUwgKGJhZCBjb250ZW50KSBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJPSyBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBiYWQgc2l6ZSAlbGRcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICAgIGdfYnl0ZXNfdW5yZWYocmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBnX2J5dGVfYXJyYXlfdW5yZWYoZnVsbEFycmF5KTsKKyAgICAgIGZ1bGxBcnJheSA9IE5VTEw7CisKKyAgICAgIC8qKgorICAgICAgICogU1RSVUNUIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICB4dHJ1Y3Rfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIlplcm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAgICAgLTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgICAtNUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9zdHJ1Y3QgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0cnVjdF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBwcmludGYgKCIgPSB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifVxuIiwKKyAgICAgICAgICAgICAgICBzdHJpbmcsCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nKTsKKyAgICAgICAgaWYgKChzdHJpbmcgPT0gTlVMTCB8fCBzdHJuY21wIChzdHJpbmcsICJaZXJvIiwgNSkgIT0gMCkgfHwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmcgIT0gMSB8fAorICAgICAgICAgICAgaTMyX3RoaW5nICE9IC0zIHx8CisgICAgICAgICAgICBpNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICAvLyBnX2NsZWFyX29iamVjdCgmeHRydWN0X291dCk7IHVzZWQgYmVsb3cKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3RfaW4pOworCisgICAgICAvKioKKyAgICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iKTsKKyAgICAgIHh0cnVjdDJfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCB4dHJ1Y3Rfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAgICAgICAgICA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgeHRydWN0Ml9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgTlVMTCk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9uZXN0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0Ml9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dHJ1Y3QyX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0Ml9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsICZ4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmaW5uZXJfYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmlubmVyX2kzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmlubmVyX2k2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBwcmludGYgKCIgPSB7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH1cbiIsCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBzdHJpbmcsCisgICAgICAgICAgICAgICAgaW5uZXJfYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBpbm5lcl9pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgaW5uZXJfaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgIGkzMl90aGluZyk7CisgICAgICAgIGlmIChieXRlX3RoaW5nICE9IDEgfHwKKyAgICAgICAgICAgIChzdHJpbmcgPT0gTlVMTCB8fCBzdHJuY21wIChzdHJpbmcsICJaZXJvIiwgNSkgIT0gMCkgfHwKKyAgICAgICAgICAgIGlubmVyX2J5dGVfdGhpbmcgIT0gMSB8fAorICAgICAgICAgICAgaW5uZXJfaTMyX3RoaW5nICE9IC0zIHx8CisgICAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSB8fAorICAgICAgICAgICAgaTMyX3RoaW5nICE9IDUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3RfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdDJfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdDJfb3V0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3Rfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBNQVAgVEVTVAorICAgICAgICovCisgICAgICBtYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworICAgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgICBpMzJfa2V5X3B0ciAgID0gZ19tYWxsb2MgKHNpemVvZiAqaTMyX2tleV9wdHIpOworICAgICAgICBpMzJfdmFsdWVfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqaTMyX3ZhbHVlX3B0cik7CisKKyAgICAgICAgKmkzMl9rZXlfcHRyICAgPSBpOworICAgICAgICAqaTMyX3ZhbHVlX3B0ciA9IGkgLSAxMDsKKworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCBpMzJfa2V5X3B0ciwgaTMyX3ZhbHVlX3B0cik7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0TWFwKHsiKTsKKyAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9vdXQpOworICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICBwcmludGYgKCIlZCA9PiAlZCIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIn0pIik7CisKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X21hcCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9pbik7CisgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgICBwcmludGYgKCIlZCA9PiAlZCIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9vdXQpKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX291dCk7CisgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGdwb2ludGVyIGluX3ZhbHVlID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCBrZXkpOworICAgICAgICAgICAgaWYgKGluX3ZhbHVlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAqKGdpbnQzMiAqKWluX3ZhbHVlICE9ICooZ2ludDMyICopdmFsdWUpIHsKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfaW4pOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBTVFJJTkcgTUFQIFRFU1QKKyAgICAgICAqLworICAgICAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19zdHJfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfc3RyX2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgImEiLCAgICAiMiIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgImIiLCAgICAiYmxhaCIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgInNvbWUiLCAidGhpbmciKTsKKyAgICAgIHByaW50ZiAoInRlc3RTdHJpbmdNYXAoeyIpOworICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX291dCk7CisgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgIHByaW50ZiAoIlwiJXNcIiA9PiBcIiVzXCIiLCAoZ2NoYXIgKilrZXksIChnY2hhciAqKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIil9Iik7CisKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19zdHJfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zdHJfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3N0cmluZ19tYXAgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfaW4pOworICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgICAgcHJpbnRmICgiXCIlc1wiID0+IFwiJXNcIiIsIChnY2hhciAqKWtleSwgKGdjaGFyICopdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIn1cbiIpOworCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAobWFwX2luKSAhPSBnX2hhc2hfdGFibGVfc2l6ZSAobWFwX291dCkpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfb3V0KTsKKyAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgZ3BvaW50ZXIgaW5fdmFsdWUgPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sIGtleSk7CisgICAgICAgICAgICBpZiAoaW5fdmFsdWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHN0cmNtcCAoKGdjaGFyICopaW5fdmFsdWUsIChnY2hhciAqKXZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogU0VUIFRFU1QKKyAgICAgICAqLworICAgICAgc2V0X291dCA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwgZ19pbnRfZXF1YWwsIGdfZnJlZSwgTlVMTCk7CisgICAgICBmb3IgKGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICBpMzJfa2V5X3B0ciA9IGdfbWFsbG9jIChzaXplb2YgKmkzMl9rZXlfcHRyKTsKKyAgICAgICAgKmkzMl9rZXlfcHRyID0gaTsKKworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZXRfb3V0LCBpMzJfa2V5X3B0ciwgTlVMTCk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0U2V0KHsiKTsKKyAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgIGtleXNfb3V0ID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChzZXRfb3V0KTsKKyAgICAgIGtleXNfZWxlbSA9IGtleXNfb3V0OworICAgICAgd2hpbGUgKGtleXNfZWxlbSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICBwcmludGYgKCIlZCIsICooZ2ludDMyICopa2V5c19lbGVtLT5kYXRhKTsKKworICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX2VsZW0tPm5leHQ7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9KSIpOworCisgICAgICBzZXRfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsIGdfaW50X2VxdWFsLCBnX2ZyZWUsIE5VTEwpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfc2V0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgICBrZXlzX2luID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChzZXRfaW4pOworICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX2luOworICAgICAgICB3aGlsZSAoa2V5c19lbGVtICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgICBwcmludGYgKCIlZCIsICooZ2ludDMyICopa2V5c19lbGVtLT5kYXRhKTsKKworICAgICAgICAgIGtleXNfZWxlbSA9IGtleXNfZWxlbS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19saXN0X2xlbmd0aCAoa2V5c19pbikgIT0gZ19saXN0X2xlbmd0aCAoa2V5c19vdXQpKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAga2V5c19lbGVtID0ga2V5c19vdXQ7CisgICAgICAgICAgd2hpbGUgKGtleXNfZWxlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZ19saXN0X2ZpbmRfY3VzdG9tIChrZXlzX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c19lbGVtLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyX2NvbXBhcmUpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5c19lbGVtID0ga2V5c19lbGVtLT5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdfbGlzdF9mcmVlIChrZXlzX2luKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChzZXRfaW4pOworICAgICAgZ19saXN0X2ZyZWUgKGtleXNfb3V0KTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAoc2V0X291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogTElTVCBURVNUCisgICAgICAgKi8KKyAgICAgIGxpc3Rfb3V0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBUUlVFLCBzaXplb2YgKGdpbnQzMikpOworICAgICAgZm9yIChpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChsaXN0X291dCwgaSk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0TGlzdCh7Iik7CisgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKGdpbnQzMilsaXN0X291dC0+bGVuOyArK2kpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgIHByaW50ZiAoIiVkIiwgZ19hcnJheV9pbmRleCAobGlzdF9vdXQsIGdpbnQzMiwgaSkpOworICAgICAgfQorICAgICAgcHJpbnRmICgifSkiKTsKKworICAgICAgbGlzdF9pbiA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChnaW50MzIpKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2xpc3QgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoZ2ludDMyKWxpc3RfaW4tPmxlbjsgKytpKSB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgICAgcHJpbnRmICgiJWQiLCBnX2FycmF5X2luZGV4IChsaXN0X2luLCBnaW50MzIsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAobGlzdF9pbi0+bGVuICE9IGxpc3Rfb3V0LT5sZW4gfHwKKyAgICAgICAgICAgIG1lbWNtcCAobGlzdF9pbi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdF9vdXQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgIGxpc3RfaW4tPmxlbiAqIHNpemVvZiAoZ2ludDMyKSkgIT0gMCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfYXJyYXlfdW5yZWYgKGxpc3RfaW4pOworICAgICAgZ19hcnJheV91bnJlZiAobGlzdF9vdXQpOworCisgICAgICAvKioKKyAgICAgICAqIEVOVU0gVEVTVAorICAgICAgICovCisgICAgICBwcmludGYoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfT05FKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfVFdPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlZFxuIiwgbnVtYmVyeik7CisgICAgICAgIGlmIChudW1iZXJ6ICE9IFRfVEVTVF9OVU1CRVJaX1RXTykKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIHByaW50ZigidGVzdEVudW0oVEhSRUUpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfVEhSRUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfVEhSRUUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBwcmludGYoInRlc3RFbnVtKEZJVkUpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZW51bSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlcnosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfRklWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9GSVZFKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9FSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9FSUdIVCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogVFlQRURFRiBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF90eXBlZGVmICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk4NTgyMzUwODI1MjNMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIHVzZXJfaWQpOworICAgICAgICBpZiAodXNlcl9pZCAhPSAzMDk4NTgyMzUwODI1MjNMTCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogTkVTVEVEIE1BUCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KWdfaGFzaF90YWJsZV91bnJlZik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbWFwX21hcCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX2luKTsKKworICAgICAgICBwcmludGYgKCIgPSB7Iik7CisgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICBwcmludGYgKCIlZCA9PiB7IiwgKihnaW50MzIgKilrZXkpOworCisgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0hhc2hUYWJsZSAqKXZhbHVlKTsKKyAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgcHJpbnRmICgiJWQgPT4gJWQsICIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gMikKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGdpbnQzMiBpbm5lcl9rZXlzW10gPSB7MSwgMiwgMywgNH07CisgICAgICAgICAgZ2ludDMyIGkzMl9rZXk7CisKKyAgICAgICAgICBpMzJfa2V5ID0gLTQ7CisgICAgICAgICAgaW5uZXJfbWFwX2luID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCAmaTMyX2tleSk7CisgICAgICAgICAgaWYgKGlubmVyX21hcF9pbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9zaXplIChpbm5lcl9tYXBfaW4pICE9IDQpCisgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBrZXlzX2luID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChpbm5lcl9tYXBfaW4pOworICAgICAgICAgICAga2V5c19pbiA9IGdfbGlzdF9zb3J0IChrZXlzX2luLCBnaW50MzJfY29tcGFyZSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAga2V5c19lbGVtID0gZ19saXN0X250aCAoa2V5c19pbiwgMyAtIGkpOworCisgICAgICAgICAgICAgIGlmICgqKGdpbnQzMiAqKWtleXNfZWxlbS0+ZGF0YSAhPSAoLTEgKiBpbm5lcl9rZXlzW2ldKSB8fAorICAgICAgICAgICAgICAgICAgKihnaW50MzIgKilnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNfZWxlbS0+ZGF0YSkgIT0KKyAgICAgICAgICAgICAgICAgICgtMSAqIGlubmVyX2tleXNbaV0pKSB7CisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdfbGlzdF9mcmVlIChrZXlzX2luKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpMzJfa2V5ID0gNDsKKyAgICAgICAgICBpbm5lcl9tYXBfaW4gPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sICZpMzJfa2V5KTsKKyAgICAgICAgICBpZiAoaW5uZXJfbWFwX2luID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3NpemUgKGlubmVyX21hcF9pbikgIT0gNCkKKyAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGtleXNfaW4gPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGlubmVyX21hcF9pbik7CisgICAgICAgICAgICBrZXlzX2luID0gZ19saXN0X3NvcnQgKGtleXNfaW4sIGdpbnQzMl9jb21wYXJlKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICBrZXlzX2VsZW0gPSBnX2xpc3RfbnRoIChrZXlzX2luLCBpKTsKKworICAgICAgICAgICAgICBpZiAoKihnaW50MzIgKilrZXlzX2VsZW0tPmRhdGEgIT0gaW5uZXJfa2V5c1tpXSB8fAorICAgICAgICAgICAgICAgICAgKihnaW50MzIgKilnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNfZWxlbS0+ZGF0YSkgIT0KKyAgICAgICAgICAgICAgICAgIGlubmVyX2tleXNbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ19saXN0X2ZyZWUgKGtleXNfaW4pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9pbik7CisKKyAgICAgIC8qKgorICAgICAgICogSU5TQU5JVFkgVEVTVAorICAgICAgICovCisgICAgICBpbnNhbml0eV9vdXQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X2dldCAoaW5zYW5pdHlfb3V0LAorICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIG51bWJlcnogPSBUX1RFU1RfTlVNQkVSWl9GSVZFOworICAgICAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKKyAgICAgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAgICAgKnVzZXJfaWRfcHRyID0gNTsKKyAgICAgIHVzZXJfaWRfcHRyMiA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgICAgICp1c2VyX2lkX3B0cjIgPSA4OworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6LCB1c2VyX2lkX3B0cik7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnoyLCB1c2VyX2lkX3B0cjIpOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgICAgIHh0cnVjdF9vdXQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiSGVsbG8yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgMkxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB4dHJ1Y3Rfb3V0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJHb29kYnllNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDRMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3Rfb3V0Mik7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdF9vdXQpOworICAgICAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgICAgICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50NjRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnQ2NF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpZ19oYXNoX3RhYmxlX3VucmVmKTsKKworICAgICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2luc2FuaXR5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zYW5pdHlfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX2luKTsKKyAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgIHByaW50ZiAoIiUiIFBSSWQ2NCAiID0+IHsiLCAqKFRUZXN0VXNlcklkICopa2V5KTsKKworICAgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdIYXNoVGFibGUgKil2YWx1ZSk7CisgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZpbm5lcl9oYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHByaW50ZiAoIiVkID0+IHsiLCAoVFRlc3ROdW1iZXJ6KWtleSk7CisKKyAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoKFRUZXN0SW5zYW5pdHkgKil2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBwcmludGYgKCJ7Iik7CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmdXNlcl9tYXBfaXRlciwgdXNlcl9tYXApOworICAgICAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZ1c2VyX21hcF9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgICBwcmludGYgKCIlZCA9PiAlIiBQUklkNjQgIiwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAoVFRlc3ROdW1iZXJ6KWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAqKFRUZXN0VXNlcklkICopdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmICgifSwgIik7CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGdpbnQzMil4dHJ1Y3RzLT5sZW47ICsraSkgeworICAgICAgICAgICAgICB4dHJ1Y3RfaW4gPSBnX3B0cl9hcnJheV9pbmRleCAoeHRydWN0cywgaSk7CisgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICBwcmludGYgKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZiAoIn0iKTsKKyAgICAgICAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKworICAgICAgICAgICAgcHJpbnRmICgifSwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJ9XG4iKTsKKworICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKG1hcF9pbikgIT0gMikKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6X2tleV92YWx1ZXNbXSA9IHsKKyAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX1RXTywgVF9URVNUX05VTUJFUlpfVEhSRUUKKyAgICAgICAgICB9OworICAgICAgICAgIGdpbnQgdXNlcl9tYXBfdmFsdWVzW10gPSB7IDUsIDggfTsKKyAgICAgICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkX2tleTsKKworICAgICAgICAgIHVzZXJfaWRfa2V5ID0gMTsKKyAgICAgICAgICBpbm5lcl9tYXBfaW4gPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sICZ1c2VyX2lkX2tleSk7CisgICAgICAgICAgaWYgKGlubmVyX21hcF9pbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9zaXplIChpbm5lcl9tYXBfaW4pICE9IDIpCisgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBUVGVzdE51bWJlcnogbnVtYmVyel9rZXk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgICAgbnVtYmVyel9rZXkgPSBudW1iZXJ6X2tleV92YWx1ZXNbaV07CisgICAgICAgICAgICAgIGluc2FuaXR5X2luID0KKyAgICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjb25zdHBvaW50ZXIpbnVtYmVyel9rZXkpOworICAgICAgICAgICAgICBpZiAoaW5zYW5pdHlfaW4gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoaW5zYW5pdHlfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICAgIGlmICh1c2VyX21hcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplICh1c2VyX21hcCkgIT0gMikKKyAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICBudW1iZXJ6X2tleSA9IChUVGVzdE51bWJlcnopdXNlcl9tYXBfdmFsdWVzW2pdOworCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX2xvb2t1cCAodXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NvbnN0cG9pbnRlciludW1iZXJ6X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihUVGVzdFVzZXJJZCAqKXZhbHVlICE9IChUVGVzdFVzZXJJZCl1c2VyX21hcF92YWx1ZXNbal0pCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzLT5sZW4gIT0gMikKKyAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHh0cnVjdF9pbiA9IGdfcHRyX2FycmF5X2luZGV4ICh4dHJ1Y3RzLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmluZyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcCAoc3RyaW5nLCAiR29vZGJ5ZTQiLCA5KSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyAhPSA0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgIT0gNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nICE9IDQpCisgICAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgICAgICAgICAgICAgICAgICAgeHRydWN0X2luID0gZ19wdHJfYXJyYXlfaW5kZXggKHh0cnVjdHMsIDEpOworICAgICAgICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wIChzdHJpbmcsICJIZWxsbzIiLCA3KSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyAhPSAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgIT0gMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nICE9IDIpCisgICAgICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICB1c2VyX2lkX2tleSA9IDI7CisgICAgICAgICAgaW5uZXJfbWFwX2luID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWFwX2luLCAmdXNlcl9pZF9rZXkpOworICAgICAgICAgIGlmIChpbm5lcl9tYXBfaW4gPT0gTlVMTCB8fAorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfc2l6ZSAoaW5uZXJfbWFwX2luKSAhPSAxKQorICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5zYW5pdHlfaW4gPQorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwIChpbm5lcl9tYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY29uc3Rwb2ludGVyKVRfVEVTVF9OVU1CRVJaX1NJWCk7CisgICAgICAgICAgICBpZiAoaW5zYW5pdHlfaW4gPT0gTlVMTCkKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoaW5zYW5pdHlfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICBpZiAodXNlcl9tYXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAodXNlcl9tYXApICE9IDApCisgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeHRydWN0cy0+bGVuICE9IDApCisgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbnNhbml0eV9vdXQpOworCisgICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGlmICghdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gIT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHByaW50ZiAoIiAgeyV1LCBcIiVzXCJ9XG4iLCBpbnQzMiwgc3RyaW5nKTsKKyAgICAgICAgZ19mcmVlIChzdHJpbmcpOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7CisgICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CisgICAgICBpZiAoIXRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gPT0gTlVMTCAmJgorICAgICAgICAgIGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmICgiICBDYXVnaHQgVEV4Y2VwdGlvblxuIik7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisKKyAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgICBwcmludGYgKCIgIHZvaWRcbiIpOworICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgfQorCisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIC8qIHRlc3QgbXVsdGkgZXhjZXB0aW9uICovCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgICAgICBpZiAoIXRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X211bHRpX2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiAhPSBOVUxMICYmCisgICAgICAgICAgeGNlcHRpb24yID09IE5VTEwpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgJmludDMyLAorICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgICAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBwcmludGYgKCIgIHsldSwgXCIlc1wifVxuIiwgaW50MzIsIHN0cmluZyk7CisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKworICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOworCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iKTsKKyAgICAgIHh0cnVjdF9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgICAgIGlmICghdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbXVsdGlfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiA9PSBOVUxMICYmCisgICAgICAgICAgeGNlcHRpb24yICE9IE5VTEwpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsICAgICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJmlubmVyX3h0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgZ19vYmplY3RfZ2V0IChpbm5lcl94dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHByaW50ZiAoIiAgeyV1LCB7XCIlc1wifX1cbiIsIGludDMyLCBzdHJpbmcpOworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbm5lcl94dHJ1Y3RfaW4pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOworCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CisKKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOworICAgICAgeHRydWN0X2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X211bHRpX2V4Y2VwdGlvbiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeGNlcHRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSAmJgorICAgICAgICAgIHhjZXB0aW9uID09IE5VTEwgJiYKKyAgICAgICAgICB4Y2VwdGlvbjIgPT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcHJpbnRmICgiICB7e1wiJXNcIn19XG4iLCBzdHJpbmcpOworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4dHJ1Y3RfaW4pOworCisgICAgICAvKiB0ZXN0IG9uZXdheSB2b2lkICovCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSkgPT4iKTsKKyAgICAgIGdldHRpbWVvZmRheSAoJm9uZXdheV9zdGFydCwgTlVMTCk7CisgICAgICBvbmV3YXlfcmVzdWx0ID0gdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfb25ld2F5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgZ2V0dGltZW9mZGF5ICgmb25ld2F5X2VuZCwgTlVMTCk7CisgICAgICB0aW1lcnN1YiAoJm9uZXdheV9lbmQsICZvbmV3YXlfc3RhcnQsICZvbmV3YXlfZWxhcHNlZCk7CisgICAgICBvbmV3YXlfZWxhcHNlZF91c2VjID0KKyAgICAgICAgb25ld2F5X2VsYXBzZWQudHZfc2VjICogMTAwMCAqIDEwMDAgKyBvbmV3YXlfZWxhcHNlZC50dl91c2VjOworCisgICAgICBpZiAob25ld2F5X3Jlc3VsdCkgeworICAgICAgICBpZiAob25ld2F5X2VsYXBzZWRfdXNlYyA+IDIwMCAqIDEwMDApIHsKKyAgICAgICAgICBwcmludGYgKCIgIEZBSUxVUkUgLSB0b29rICUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgICAoZG91YmxlKW9uZXdheV9lbGFwc2VkX3VzZWMgLyAxMDAwLjApOworICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmICgiICBzdWNjZXNzIC0gdG9vayAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvbmV3YXlfZWxhcHNlZF91c2VjIC8gMTAwMC4wKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiByZWRvIGEgc2ltcGxlIHRlc3QgYWZ0ZXIgdGhlIG9uZXdheSB0byBtYWtlIHN1cmUgd2UgYXJlbid0ICJvZmYgYnkKKyAgICAgICAqIG9uZSIgLS0gaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSB2b2lkIGxpa2Ugbm9ybWFsIHZvaWQsIHRoaXMgbmV4dAorICAgICAgICogdGVzdCB3aWxsIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuCisgICAgICAgKiB0aGUgY29ycmVjdCByZXN1bHQuIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgY2xpZW50IHdpbGwgcmVjZWl2ZSB0aGUKKyAgICAgICAqIGVycm9yOgorICAgICAgICoKKyAgICAgICAqICAgYXBwbGljYXRpb24gZXJyb3I6IFdyb25nIG1ldGhvZCBuYW1lCisgICAgICAgKi8KKyAgICAgIC8qKgorICAgICAgICogSTMyIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgicmUtdGVzdCB0ZXN0STMyKC0xKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2kzMiAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJWRcbiIsIGludDMyKTsKKyAgICAgICAgaWYgKGludDMyICE9IC0xKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ2V0dGltZW9mZGF5ICgmdGltZV9zdG9wLCBOVUxMKTsKKyAgICAgIHRpbWVyc3ViICgmdGltZV9zdG9wLCAmdGltZV9zdGFydCwgJnRpbWVfZWxhcHNlZCk7CisgICAgICB0aW1lX2VsYXBzZWRfdXNlYyA9CisgICAgICAgIHRpbWVfZWxhcHNlZC50dl9zZWMgKiAxMDAwICogMTAwMCArIHRpbWVfZWxhcHNlZC50dl91c2VjOworCisgICAgICBwcmludGYoIlRvdGFsIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2VsYXBzZWRfdXNlYyk7CisKKyAgICAgIHRpbWVfdG90YWxfdXNlYyArPSB0aW1lX2VsYXBzZWRfdXNlYzsKKyAgICAgIGlmICh0aW1lX2VsYXBzZWRfdXNlYyA8IHRpbWVfbWluX3VzZWMpCisgICAgICAgIHRpbWVfbWluX3VzZWMgPSB0aW1lX2VsYXBzZWRfdXNlYzsKKyAgICAgIGlmICh0aW1lX2VsYXBzZWRfdXNlYyA+IHRpbWVfbWF4X3VzZWMpCisgICAgICAgIHRpbWVfbWF4X3VzZWMgPSB0aW1lX2VsYXBzZWRfdXNlYzsKKworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHByaW50ZiAoIkNvbm5lY3QgZmFpbGVkOiAlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIC8qIEFsbCBkb25lLS0tb3V0cHV0IHN0YXRpc3RpY3MgKi8KKyAgcHV0cyAoIlxuQWxsIHRlc3RzIGRvbmUuIik7CisgIHByaW50ZigiTnVtYmVyIG9mIGZhaWx1cmVzOiAlZFxuIiwgZmFpbF9jb3VudCk7CisKKyAgdGltZV9hdmdfdXNlYyA9IHRpbWVfdG90YWxfdXNlYyAvIG51bV90ZXN0czsKKworICBwcmludGYgKCJNaW4gdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfbWluX3VzZWMpOworICBwcmludGYgKCJNYXggdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfbWF4X3VzZWMpOworICBwcmludGYgKCJBdmcgdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfYXZnX3VzZWMpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWNvbmRfc2VydmljZSk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbDIpOworICBnX2NsZWFyX29iamVjdCgmdGVzdF9jbGllbnQpOworICBnX2NsZWFyX29iamVjdCgmcHJvdG9jb2wpOworICBnX2NsZWFyX29iamVjdCgmdHJhbnNwb3J0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNvY2tldCk7CisKKyAgaWYgKHNzbCkgeworICAgIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2woKTsKKyAgfQorCisgIHJldHVybiBmYWlsX2NvdW50OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3Rlc3Rfc2VydmVyLmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDcxNmVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3Rlc3Rfc2VydmVyLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCisKKyNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKKworLyogT3VyIHNlcnZlciBvYmplY3QsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aGluIHRoZSBTSUdJTlQKKyAgIHNpZ25hbCBoYW5kbGVyICovCitUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IE5VTEw7CisKKy8qIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGludGVycnVwdGVkIHdpdGggU0lHSU5UCisgICAoaS5lLiBDdHJsLUMpIHNvIHdlIGNhbiB0ZWxsIHdoZXRoZXIgaXRzIHRlcm1pbmF0aW9uIHdhcyBhYm5vcm1hbCAqLworZ2Jvb2xlYW4gc2lnaW50X3JlY2VpdmVkID0gRkFMU0U7CisKKy8qIEhhbmRsZSBTSUdJTlQgKCJDdHJsLUMiKSBzaWduYWxzIGJ5IGdyYWNlZnVsbHkgc3RvcHBpbmcgdGhlIHNlcnZlciAqLworc3RhdGljIHZvaWQKK3NpZ2ludF9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIFRha2Ugbm90ZSB3ZSB3ZXJlIGNhbGxlZCAqLworICBzaWdpbnRfcmVjZWl2ZWQgPSBUUlVFOworCisgIC8qIFNodXQgZG93biB0aGUgc2VydmVyIGdyYWNlZnVsbHkgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIHRocmlmdF9zZXJ2ZXJfc3RvcCAoc2VydmVyKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0YXRpYyBnaW50ICAgcG9ydCA9IDkwOTA7CisgIHN0YXRpYyBnY2hhciAqc2VydmVyX3R5cGVfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICp0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICpwcm90b2NvbF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2ludCAgIHN0cmluZ19saW1pdCA9IDA7CisgIHN0YXRpYyBnaW50ICAgY29udGFpbmVyX2xpbWl0ID0gMDsKKworICBzdGF0aWMKKyAgICBHT3B0aW9uRW50cnkgb3B0aW9uX2VudHJpZXNbXSA9IHsKKyAgICB7ICJwb3J0IiwgICAgICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAorICAgICAgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgKD05MDkwKSIsIE5VTEwgfSwKKyAgICB7ICJzZXJ2ZXItdHlwZSIsICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZzZXJ2ZXJfdHlwZV9vcHRpb24sCisgICAgICAiVHlwZSBvZiBzZXJ2ZXI6IHNpbXBsZSAoPXNpbXBsZSkiLCBOVUxMIH0sCisgICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKKyAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCisgICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInN0cmluZy1saW1pdCIsICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnN0cmluZ19saW1pdCwKKyAgICAgICJNYXggc3RyaW5nIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgImNvbnRhaW5lci1saW1pdCIsIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJmNvbnRhaW5lcl9saW1pdCwKKyAgICAgICJNYXggY29udGFpbmVyIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgTlVMTCB9CisgIH07CisKKyAgZ2NoYXIgKnNlcnZlcl9uYW1lICAgICAgICAgICAgPSAic2ltcGxlIjsKKyAgZ2NoYXIgKnRyYW5zcG9ydF9uYW1lICAgICAgICAgPSAiYnVmZmVyZWQiOworICBHVHlwZSAgdHJhbnNwb3J0X2ZhY3RvcnlfdHlwZSA9IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZOworICBnY2hhciAqcHJvdG9jb2xfbmFtZSAgICAgICAgICA9ICJiaW5hcnkiOworICBHVHlwZSAgcHJvdG9jb2xfZmFjdG9yeV90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZOworCisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXIgKmhhbmRsZXI7CisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXIgKmhhbmRsZXJfc2Vjb25kX3NlcnZpY2UgPSBOVUxMOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3I7CisgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3Nvcl90ZXN0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlID0gTlVMTDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICAqc2VydmVyX3RyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqdHJhbnNwb3J0X2ZhY3Rvcnk7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSAgKnByb3RvY29sX2ZhY3Rvcnk7CisKKyAgc3RydWN0IHNpZ2FjdGlvbiBzaWdpbnRfYWN0aW9uOworCisgIEdPcHRpb25Db250ZXh0ICpvcHRpb25fY29udGV4dDsKKyAgZ2Jvb2xlYW4gICAgICAgIG9wdGlvbnNfdmFsaWQgPSBUUlVFOworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICAvKiBDb25maWd1cmUgYW5kIHBhcnNlIG91ciBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworICBvcHRpb25fY29udGV4dCA9IGdfb3B0aW9uX2NvbnRleHRfbmV3IChOVUxMKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChvcHRpb25fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgaWYgKGdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKG9wdGlvbl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgPT0gRkFMU0UpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgIHJldHVybiAyNTU7CisgIH0KKyAgZ19vcHRpb25fY29udGV4dF9mcmVlIChvcHRpb25fY29udGV4dCk7CisKKyAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCisgIGlmIChzZXJ2ZXJfdHlwZV9vcHRpb24gIT0gTlVMTCAmJgorICAgICAgc3RybmNtcCAoc2VydmVyX3R5cGVfb3B0aW9uLCAic2ltcGxlIiwgNykgIT0gMCkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gc2VydmVyIHR5cGUgJXNcbiIsIHByb3RvY29sX29wdGlvbik7CisgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICB9CisKKyAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImNvbXBhY3QiLCA4KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKwlwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKwlwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisJcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAodHJhbnNwb3J0X29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHRyYW5zcG9ydF9vcHRpb24sICJmcmFtZWQiLCA3KSA9PSAwKSB7CisgICAgICB0cmFuc3BvcnRfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZOworICAgICAgdHJhbnNwb3J0X25hbWUgPSAiZnJhbWVkIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAodHJhbnNwb3J0X29wdGlvbiwgImJ1ZmZlcmVkIiwgOSkgIT0gMCkgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAlc1xuIiwgdHJhbnNwb3J0X29wdGlvbik7CisgICAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKCFvcHRpb25zX3ZhbGlkKQorICAgIHJldHVybiAyNTQ7CisKKyAgLyogRXN0YWJsaXNoIGFsbCBvdXIgY29ubmVjdGlvbiBvYmplY3RzICovCisgIGhhbmRsZXIgICAgICAgICAgID0gZ19vYmplY3RfbmV3IChUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworCisKKyAgaWYoc3Ryc3RyKHByb3RvY29sX25hbWUsICI6bXVsdGkiKSl7CisgICAgICAvKiBXaGVuIGEgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGlzIGludm9sdmVkIHRoZSBoYW5kbGVyIGlzIG5vdAorICAgICAgICAgcmVnaXN0ZXJlZCBhcyB1c3VhbC4gV2UgY3JlYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZSByZWFsCisgICAgICAgICBwcm9jZXNzb3IgaXMgcmVnaXN0ZXJlZC4gTXVsdGlwbGUgcHJvY2Vzc29ycyBjYW4gYmUgcmVnaXN0ZXJlZAorICAgICAgICAgYXQgb25jZS4gVGhpcyBpcyB3aHkgd2UgZG9uJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHByb3BlcnR5ICovCisgICAgICBwcm9jZXNzb3IgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwKKwkJCQkJIE5VTEwpOworCisgICAgICBoYW5kbGVyX3NlY29uZF9zZXJ2aWNlID0gZ19vYmplY3RfbmV3IChUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsCisgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgcHJvY2Vzc29yX3Rlc3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX1BST0NFU1NPUiwKKwkJCQkgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorCQkJCSAgICBOVUxMKTsKKyAgICAgIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSA9ICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TRUNPTkRfU0VSVklDRV9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlcl9zZWNvbmRfc2VydmljZSwKKwkJCQkgICAgTlVMTCk7CisKKyAgICAgIC8qIFdlIHJlZ2lzdGVyIGEgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFRocmlmdFRlc3QgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiVGhyaWZ0VGVzdCIsIHByb2Nlc3Nvcl90ZXN0LAorCQkJCQkJICAgICAgJmVycm9yKSl7CisJICAgIGdfbWVzc2FnZSAoInRocmlmdF9zZXJ2ZXJfc2VydmU6ICVzIiwKKwkgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisJICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgICB9CisgICAgICAvKiBXZSByZWdpc3RlciBhIHNlY29uZCB0ZXN0IHByb2Nlc3NvciB3aXRoIE11bHRpcGxleGVkIG5hbWUgU2Vjb25kU2VydmljZQorICAgICAgICogd2UgYXJlIHJlc3BvbnNpYmxlIG9mIGZyZWVpbmcgdGhlIHByb2Nlc3NvciB3aGVuIGl0J3Mgbm90IHVzZWQgYW55bW9yZSAqLworICAgICAgaWYoIXRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKHByb2Nlc3NvciwKKwkJCQkJCSAgICAgICJTZWNvbmRTZXJ2aWNlIiwgcHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlLAorCQkJCQkJICAgICAgJmVycm9yKSl7CisJICAgIGdfbWVzc2FnZSAoInRocmlmdF9zZXJ2ZXJfc2VydmU6ICVzIiwKKwkgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisJICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgICB9CisKKyAgfWVsc2V7CisgICAgICBwcm9jZXNzb3IgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0KKyAgc2VydmVyX3RyYW5zcG9ydCAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX29iamVjdF9uZXcgKHRyYW5zcG9ydF9mYWN0b3J5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3Ryc3RyIChwcm90b2NvbF9uYW1lLCAiY29tcGFjdCIpICE9IE5VTEwpIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0Iiwgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorCisgIHNlcnZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF90cmFuc3BvcnRfZmFjdG9yeSIsICB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogSW5zdGFsbCBvdXIgU0lHSU5UIGhhbmRsZXIsIHdoaWNoIGhhbmRsZXMgQ3RybC1DIGJlaW5nIHByZXNzZWQgYnkgc3RvcHBpbmcKKyAgICAgdGhlIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIG1lbXNldCAoJnNpZ2ludF9hY3Rpb24sIDAsIHNpemVvZiAoc2lnaW50X2FjdGlvbikpOworICBzaWdpbnRfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWdpbnRfaGFuZGxlcjsKKyAgc2lnaW50X2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgc2lnYWN0aW9uIChTSUdJTlQsICZzaWdpbnRfYWN0aW9uLCBOVUxMKTsKKworICBwcmludGYgKCJTdGFydGluZyBcIiVzXCIgc2VydmVyICglcy8lcykgbGlzdGVuIG9uOiAlZFxuIiwKKyAgICAgICAgICBzZXJ2ZXJfbmFtZSwKKyAgICAgICAgICB0cmFuc3BvcnRfbmFtZSwKKyAgICAgICAgICBwcm90b2NvbF9uYW1lLAorICAgICAgICAgIHBvcnQpOworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgLyogU2VydmUgY2xpZW50cyB1bnRpbCBTSUdJTlQgaXMgcmVjZWl2ZWQgKEN0cmwtQyBpcyBwcmVzc2VkKSAqLworICB0aHJpZnRfc2VydmVyX3NlcnZlIChzZXJ2ZXIsICZlcnJvcik7CisKKyAgLyogSWYgdGhlIHNlcnZlciBzdG9wcGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYmVpbmcgaW50ZXJydXB0ZWQgYnkgdGhlCisgICAgIHVzZXIsIHJlcG9ydCB0aGUgZXJyb3IgKi8KKyAgaWYgKCFzaWdpbnRfcmVjZWl2ZWQpIHsKKyAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgfQorCisgIHB1dHMgKCJkb25lLiIpOworCisgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnRfZmFjdG9yeSk7CisgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcik7CisgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyKTsKKyAgaWYoaGFuZGxlcl9zZWNvbmRfc2VydmljZSl7CisgICAgICBnX29iamVjdF91bnJlZiAoaGFuZGxlcl9zZWNvbmRfc2VydmljZSk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3Rlc3QpeworICAgICAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcl90ZXN0KTsKKyAgfQorICBpZihwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSk7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhYzdiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgaW50ZXJmYWNlICovCisKK0dfREVGSU5FX1RZUEUgKFNlY29uZFNlcnZpY2VIYW5kbGVyLAorICAgICAgICAgICAgICAgc2Vjb25kX3NlcnZpY2VfaGFuZGxlciwKKwkgICAgICAgVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUik7CisKKworZ2Jvb2xlYW4KK3NlY29uZF9zZXJ2aWNlX2hhbmRsZXJfc2Vjb25kdGVzdF9zdHJpbmcgKFRUZXN0U2Vjb25kU2VydmljZUlmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgZ2NoYXIgYnVmZmVyWzI1Nl07CisKKyAgcHJpbnRmICgidGVzdFNlY29uZFNlcnZpY2VNdWx0aXBsZXhTZWNvbmRUZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKTsKKyAgc25wcmludGYoYnVmZmVyLCAyNTUsICJ0ZXN0U3RyaW5nKFwiJXNcIikiLCB0aGluZyk7CisgICpfcmV0dXJuID0gZ19zdHJkdXAgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX2luaXQgKFNlY29uZFNlcnZpY2VIYW5kbGVyICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX2NsYXNzX2luaXQgKFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgKmtsYXNzKQoreworICBUVGVzdFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgKmJhc2VfY2xhc3MgPQorICAgICAgVF9URVNUX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworCisgIGJhc2VfY2xhc3MtPnNlY29uZHRlc3Rfc3RyaW5nID0KKyAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfc2Vjb25kdGVzdF9zdHJpbmc7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisjZGVmaW5lIF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgaW50ZXJmYWNlICovCisKKyNkZWZpbmUgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSIChzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICgpKQorCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXIpKQorI2RlZmluZSBJU19TRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgU0VDT05EX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgU0VDT05EX1NFUlZJQ0VfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfU2Vjb25kU2VydmljZUhhbmRsZXIgU2Vjb25kU2VydmljZUhhbmRsZXI7Cit0eXBlZGVmIHN0cnVjdCBfU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcyBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzOworCitzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlciBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgeworICBUVGVzdFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgcGFyZW50OworCit9OworCisvKiBVc2VkIGJ5IFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX1RZUEUgKi8KK0dUeXBlIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2JsYWhfYmxhaCAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBHRXJyb3IgKiplcnJvcik7CitnYm9vbGVhbiBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nICAgICAgICAgIChUVGVzdFNlY29uZFNlcnZpY2VJZiAqaWZhY2UsIGdjaGFyICoqIF9yZXR1cm4sIGNvbnN0IGdjaGFyICogdGhpbmcsIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGJjYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCkBAIC0wLDAgKzEsODM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF90ZXN0X2hhbmRsZXIuaCIKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RUaHJpZnRUZXN0SWYgaW50ZXJmYWNlICovCisKK0dfREVGSU5FX1RZUEUgKFRocmlmdFRlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlciwKKyAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX0hBTkRMRVIpOworCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3ZvaWQgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0Vm9pZCgpXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmcgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSBnX3N0cmR1cCAodGhpbmcpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2Jvb2wgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0Qm9vbCglcylcbiIsIHRoaW5nID8gInRydWUiIDogImZhbHNlIik7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYnl0ZSAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50OCAgICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RCeXRlKCVkKVxuIiwgKGdpbnQpdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2kzMiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RJMzIoJWQpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTY0IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICAgICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEk2NCglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9kb3VibGUgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0RG91YmxlKCVmKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbiAKK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9iaW5hcnkgKFRUZXN0VGhyaWZ0VGVzdElmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCeXRlQXJyYXkgKiogX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdCeXRlQXJyYXkgKiB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RCaW5hcnkoKVxuIik7ICAvLyBUT0RPOiBoZXggb3V0cHV0CisgIGdfYnl0ZV9hcnJheV9yZWYoKEdCeXRlQXJyYXkgKil0aGluZyk7CisgICpfcmV0dXJuID0gKEdCeXRlQXJyYXkgKil0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJ1Y3QgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdCAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgZ2NoYXIgKnN0cmluZ190aGluZyA9IE5VTEw7CisgIGdpbnQgICBieXRlX3RoaW5nOworICBnaW50ICAgaTMyX3RoaW5nOworICBnaW50NjQgaTY0X3RoaW5nOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19vYmplY3RfZ2V0ICgoVFRlc3RYdHJ1Y3QgKil0aGluZywKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcHJpbnRmICgidGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSlcbiIsCisgICAgICAgICAgc3RyaW5nX3RoaW5nLAorICAgICAgICAgIChnaW50KWJ5dGVfdGhpbmcsCisgICAgICAgICAgaTMyX3RoaW5nLAorICAgICAgICAgIGk2NF90aGluZyk7CisKKyAgZ19vYmplY3Rfc2V0ICgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIGk2NF90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3RyaW5nX3RoaW5nICE9IE5VTEwpCisgICAgZ19mcmVlIChzdHJpbmdfdGhpbmcpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X25lc3QgKFRUZXN0VGhyaWZ0VGVzdElmICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0MiAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QyICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIGdjaGFyICppbm5lcl9zdHJpbmdfdGhpbmcgPSBOVUxMOworICBnaW50ICAgYnl0ZV90aGluZywgaW5uZXJfYnl0ZV90aGluZzsKKyAgZ2ludCAgIGkzMl90aGluZywgaW5uZXJfaTMyX3RoaW5nOworICBnaW50NjQgaW5uZXJfaTY0X3RoaW5nOworICBUVGVzdFh0cnVjdCAqc3RydWN0X3RoaW5nOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19vYmplY3RfZ2V0ICgoVFRlc3RYdHJ1Y3QyICopdGhpbmcsCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCAmc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9nZXQgKHN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJmlubmVyX3N0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmlubmVyX2J5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpbm5lcl9pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpbm5lcl9pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcHJpbnRmICgidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9KVxuIiwKKyAgICAgICAgICBieXRlX3RoaW5nLAorICAgICAgICAgIGlubmVyX3N0cmluZ190aGluZywKKyAgICAgICAgICBpbm5lcl9ieXRlX3RoaW5nLAorICAgICAgICAgIGlubmVyX2kzMl90aGluZywKKyAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcsCisgICAgICAgICAgaTMyX3RoaW5nKTsKKworICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCBzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIGkzMl90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoaW5uZXJfc3RyaW5nX3RoaW5nICE9IE5VTEwpCisgICAgZ19mcmVlIChpbm5lcl9zdHJpbmdfdGhpbmcpOworICBnX29iamVjdF91bnJlZiAoc3RydWN0X3RoaW5nKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXAgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBncG9pbnRlciBrZXk7CisgIGdwb2ludGVyIHZhbHVlOworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0TWFwKHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKEdIYXNoVGFibGUgKil0aGluZyk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICBnaW50MzIgKm5ld19rZXk7CisgICAgZ2ludDMyICpuZXdfdmFsdWU7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICBwcmludGYgKCIlZCA9PiAlZCIsICooZ2ludDMyICopa2V5LCAqKGdpbnQzMiAqKXZhbHVlKTsKKworICAgIG5ld19rZXkgPSBnX21hbGxvYyAoc2l6ZW9mICpuZXdfa2V5KTsKKyAgICAqbmV3X2tleSA9ICooZ2ludDMyICopa2V5OworICAgIG5ld192YWx1ZSA9IGdfbWFsbG9jIChzaXplb2YgKm5ld192YWx1ZSk7CisgICAgKm5ld192YWx1ZSA9ICooZ2ludDMyICopdmFsdWU7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIG5ld19rZXksIG5ld192YWx1ZSk7CisgIH0KKyAgcHJpbnRmICgifSlcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZ19tYXAgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBncG9pbnRlciBrZXk7CisgIGdwb2ludGVyIHZhbHVlOworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0U3RyaW5nTWFwKHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKEdIYXNoVGFibGUgKil0aGluZyk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICBnY2hhciAqbmV3X2tleTsKKyAgICBnY2hhciAqbmV3X3ZhbHVlOworCisgICAgaWYgKGZpcnN0KQorICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICBwcmludGYgKCIsICIpOworCisgICAgcHJpbnRmICgiJXMgPT4gJXMiLCAoZ2NoYXIgKilrZXksIChnY2hhciAqKXZhbHVlKTsKKworICAgIG5ld19rZXkgPSBnX3N0cmR1cCAoKGdjaGFyICopa2V5KTsKKyAgICBuZXdfdmFsdWUgPSBnX3N0cmR1cCAoKGdjaGFyICopdmFsdWUpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBuZXdfa2V5LCBuZXdfdmFsdWUpOworICB9CisgIHByaW50ZiAoIn0pXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zZXQgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaGFzaF90YWJsZV9pdGVyOworICBncG9pbnRlciBrZXk7CisgIGdib29sZWFuIGZpcnN0ID0gVFJVRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RTZXQoeyIpOworICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCAoR0hhc2hUYWJsZSAqKXRoaW5nKTsKKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKKyAgICBnaW50MzIgKm5ld19rZXk7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICBwcmludGYgKCIlZCIsICooZ2ludDMyICopa2V5KTsKKworICAgIG5ld19rZXkgPSBnX21hbGxvYyAoc2l6ZW9mICpuZXdfa2V5KTsKKyAgICAqbmV3X2tleSA9ICooZ2ludDMyICopa2V5OworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBuZXdfa2V5LCBOVUxMKTsKKyAgfQorICBwcmludGYgKCJ9KVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbGlzdCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXJyYXkgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FycmF5ICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBndWludCBpOworICBnYm9vbGVhbiBmaXJzdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0TGlzdCh7Iik7CisgIGZvciAoaSA9IDA7IGkgPCB0aGluZy0+bGVuOyBpICs9IDEpIHsKKyAgICBnaW50MzIgdmFsdWU7CisgICAgZ2ludDMyICpuZXdfdmFsdWU7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICB2YWx1ZSA9IGdfYXJyYXlfaW5kZXggKHRoaW5nLCBnaW50MzIsIGkpOworICAgIHByaW50ZiAoIiVkIiwgdmFsdWUpOworCisgICAgbmV3X3ZhbHVlID0gZ19tYWxsb2MgKHNpemVvZiAqbmV3X3ZhbHVlKTsKKyAgICAqbmV3X3ZhbHVlID0gdmFsdWU7CisgICAgZ19hcnJheV9hcHBlbmRfdmFsICgqX3JldHVybiwgKm5ld192YWx1ZSk7CisgIH0KKyAgcHJpbnRmICgifSlcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2VudW0gKFRUZXN0VGhyaWZ0VGVzdElmICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0TnVtYmVyeiAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEVudW0oJWQpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfdHlwZWRlZiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFVzZXJJZCAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RUeXBlZGVmKCUiIFBSSWQ2NCAiKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcF9tYXAgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgR0hhc2hUYWJsZSAqcG9zaXRpdmU7CisgIEdIYXNoVGFibGUgKm5lZ2F0aXZlOworICBnaW50MzIgKmtleTsKKyAgZ2ludDMyICp2YWx1ZTsKKyAgZ3VpbnQgaTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbyk7CisKKyAgcG9zaXRpdmUgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSk7CisgIG5lZ2F0aXZlID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworCisgIGZvciAoaSA9IDE7IGkgPCA1OyBpICs9IDEpIHsKKyAgICBrZXkgPSBnX21hbGxvYyAoc2l6ZW9mICprZXkpOworICAgIHZhbHVlID0gZ19tYWxsb2MgKHNpemVvZiAqdmFsdWUpOworICAgICprZXkgPSBpOworICAgICp2YWx1ZSA9IGk7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAocG9zaXRpdmUsIGtleSwgdmFsdWUpOworCisgICAga2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqa2V5KTsKKyAgICB2YWx1ZSA9IGdfbWFsbG9jIChzaXplb2YgKnZhbHVlKTsKKyAgICAqa2V5ID0gLWk7CisgICAgKnZhbHVlID0gLWk7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAobmVnYXRpdmUsIGtleSwgdmFsdWUpOworICB9CisKKyAga2V5ID0gZ19tYWxsb2MgKHNpemVvZiAqa2V5KTsKKyAgKmtleSA9IDQ7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBrZXksIHBvc2l0aXZlKTsKKworICBrZXkgPSBnX21hbGxvYyAoc2l6ZW9mICprZXkpOworICAqa2V5ID0gLTQ7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCBrZXksIG5lZ2F0aXZlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pbnNhbml0eSAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RJbnNhbml0eSAgKmFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRUZXN0WHRydWN0ICp4dHJ1Y3RfaW47CisKKyAgZ2NoYXIgKnN0cmluZ190aGluZyA9IE5VTEw7CisgIGdpbnQgICBieXRlX3RoaW5nOworICBnaW50ICAgaTMyX3RoaW5nOworICBnaW50NjQgaTY0X3RoaW5nOworCisgIEdQdHJBcnJheSAqeHRydWN0czsKKworICBUVGVzdEluc2FuaXR5ICpsb29uZXk7CisKKyAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CisgIEdIYXNoVGFibGUgKmZpcnN0X21hcDsKKyAgR0hhc2hUYWJsZSAqc2Vjb25kX21hcDsKKworICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXI7CisgIEdIYXNoVGFibGVJdGVyIGlubmVyX2hhc2hfdGFibGVfaXRlcjsKKyAgR0hhc2hUYWJsZUl0ZXIgdXNlcl9tYXBfaXRlcjsKKworICBncG9pbnRlciBrZXk7CisgIGdwb2ludGVyIHZhbHVlOworCisgIFRUZXN0VXNlcklkICp1c2VyX2lkOworCisgIGd1aW50IGk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0SW5zYW5pdHkoKVxuIik7CisKKyAgZmlyc3RfbWFwID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZGlyZWN0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfdW5yZWYpOworICBzZWNvbmRfbWFwID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2RpcmVjdF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfdW5yZWYpOworCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChUX1RFU1RfTlVNQkVSWl9UV08pLAorICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChmaXJzdF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfVEhSRUUpLAorICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOworCisgIC8qIEluY3JlbWVudCBhcmd1bWVudCdzIHJlZiBjb3VudCBieSB0d28gYmVjYXVzZSBmaXJzdF9tYXAgbm93IGhvbGRzCisgICAgIHR3byByZWZlcmVuY2VzIHRvIGl0IGFuZCB0aGUgY2FsbGVyIGlzIG5vdCBhd2FyZSB3ZSBoYXZlIG1hZGUgYW55CisgICAgIGFkZGl0aW9uYWwgcmVmZXJlbmNlcyB0byBhcmd1bWVudC4gIChUaGF0IGlzLCBjYWxsZXIgb3ducyBhcmd1bWVudAorICAgICBhbmQgd2lsbCB1bnJlZiBpdCBleHBsaWNpdGx5IGluIGFkZGl0aW9uIHRvIHVucmVmLWluZyAqX3JldHVybi4pCisKKyAgICAgV2UgZG8gdGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY29weSBvZiBhcmd1bWVudCBpbiBvcmRlciB0byBtaW1pYworICAgICB0aGUgQysrIGltcGxlbWVudGF0aW9uIChhbmQgc2luY2UsIGZyYW5rbHksIHRoZSB3b3JsZCBuZWVkcyBsZXNzCisgICAgIGFyZ3VtZW50LCBub3QgbW9yZSkuICovCisgIGdfb2JqZWN0X3JlZiAoKGdwb2ludGVyKWFyZ3VtZW50KTsKKyAgZ19vYmplY3RfcmVmICgoZ3BvaW50ZXIpYXJndW1lbnQpOworCisgIGxvb25leSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZWNvbmRfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1NJWCksCisgICAgICAgICAgICAgICAgICAgICAgIGxvb25leSk7CisKKyAgdXNlcl9pZCA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWQpOworICAqdXNlcl9pZCA9IDE7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCB1c2VyX2lkLCBmaXJzdF9tYXApOworCisgIHVzZXJfaWQgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkKTsKKyAgKnVzZXJfaWQgPSAyOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwgdXNlcl9pZCwgc2Vjb25kX21hcCk7CisKKyAgcHJpbnRmICgicmV0dXJuIik7CisgIHByaW50ZiAoIiA9IHsiKTsKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgKl9yZXR1cm4pOworICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgcHJpbnRmICgiJSIgUFJJZDY0ICIgPT4geyIsICooVFRlc3RVc2VySWQgKilrZXkpOworCisgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0hhc2hUYWJsZSAqKXZhbHVlKTsKKyAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgcHJpbnRmICgiJWQgPT4geyIsIChUVGVzdE51bWJlcnopa2V5KTsKKworICAgICAgZ19vYmplY3RfZ2V0ICgoVFRlc3RJbnNhbml0eSAqKXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByaW50ZiAoInsiKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZ1c2VyX21hcF9pdGVyLCB1c2VyX21hcCk7CisgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJnVzZXJfbWFwX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgIHByaW50ZiAoIiVkID0+ICUiIFBSSWQ2NCAiLCAiLAorICAgICAgICAgICAgICAgIChUVGVzdE51bWJlcnopa2V5LAorICAgICAgICAgICAgICAgICooVFRlc3RVc2VySWQgKil2YWx1ZSk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworCisgICAgICBwcmludGYgKCJ7Iik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgeHRydWN0cy0+bGVuOyArK2kpIHsKKyAgICAgICAgeHRydWN0X2luID0gZ19wdHJfYXJyYXlfaW5kZXggKHh0cnVjdHMsIGkpOworICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgcHJpbnRmICgie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIGk2NF90aGluZyk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9Iik7CisgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgICAgIHByaW50ZiAoIn0sICIpOworICAgIH0KKyAgICBwcmludGYgKCJ9LCAiKTsKKyAgfQorICBwcmludGYgKCJ9XG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aSAoVFRlc3RUaHJpZnRUZXN0SWYgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgKmFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgIGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoYXJnMyk7CisgIFRIUklGVF9VTlVTRURfVkFSIChhcmc0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGFyZzUpOworCisgIHByaW50ZiAoInRlc3RNdWx0aSgpXG4iKTsKKworICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBnX3N0cmR1cCAoIkhlbGxvMiIpLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICBhcmcwLAorICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICBhcmcxLAorICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICBhcmcyLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2V4Y2VwdGlvbiAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKworICBUVGVzdFh0cnVjdCAqeHRydWN0OworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgcHJpbnRmICgidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZyk7CisKKyAgLyogVW5saWtlIGFyZ3VtZW50IG9iamVjdHMsIGV4Y2VwdGlvbiBvYmplY3RzIGFyZSBub3QgcHJlLWNyZWF0ZWQgKi8KKyAgZ19hc3NlcnQgKCplcnIxID09IE5VTEwpOworCisgIGlmIChzdHJuY21wIChhcmcsICJYY2VwdGlvbiIsIDkpID09IDApIHsKKyAgICAvKiAiVGhyb3ciIGEgY3VzdG9tIGV4Y2VwdGlvbjogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGV4Y2VwdGlvbgorICAgICAgIGFyZ3VtZW50LCBzZXQgKmVycm9yIHRvIE5VTEwgYW5kIHJldHVybiBGQUxTRSAqLworICAgICplcnIxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsIDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgICBnX3N0cmR1cCAoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgKmVycm9yID0gTlVMTDsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcsICJURXhjZXB0aW9uIiwgMTEpID09IDApIHsKKyAgICAvKiAiVGhyb3ciIGEgZ2VuZXJpYyBURXhjZXB0aW9uIChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbik6IFNldAorICAgICAgIGFsbCBleGNlcHRpb24gYXJndW1lbnRzIHRvIE5VTEwsIHNldCAqZXJyb3IgYW5kIHJldHVybiBGQUxTRSAqLworICAgICplcnIxID0gTlVMTDsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKCksCisgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgIkRlZmF1bHQgVEV4Y2VwdGlvbi4iKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIHsKKyAgICAqZXJyMSA9IE5VTEw7CisgICAgKmVycm9yID0gTlVMTDsKKworICAgIC8qIFRoaXMgY29kZSBpcyBkdXBsaWNhdGVkIGZyb20gdGhlIEMrKyB0ZXN0IHN1aXRlLCB0aG91Z2ggaXQKKyAgICAgICBhcHBlYXJzIHRvIHNlcnZlIG5vIHB1cnBvc2UgKi8KKyAgICB4dHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBnX3N0cmR1cCAoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QpOworCisgICAgcmVzdWx0ID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGlfZXhjZXB0aW9uIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICphcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICphcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbjIgICAgKiplcnIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBUVGVzdFh0cnVjdCAqc3RydWN0X3RoaW5nOworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgcHJpbnRmICgidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAsIGFyZzEpOworCisgIGdfYXNzZXJ0ICgqZXJyMSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKCplcnIyID09IE5VTEwpOworCisgIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24iLCA4KSA9PSAwICYmIHN0cmxlbihhcmcwKSA9PSA4KSB7CisgICAgKmVycjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgIGdfc3RyZHVwICgiVGhpcyBpcyBhbiBYY2VwdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24yIiwgOSkgPT0gMCkgeworICAgICplcnIyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YQ0VQVElPTjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGdfb2JqZWN0X2dldCAoKmVycjIsCisgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJnN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIGdfc3RyZHVwICgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoKmVycjIsCisgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHN0cnVjdF90aGluZyk7CisKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgfQorICBlbHNlIHsKKyAgICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIGdfc3RyZHVwIChhcmcxKSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHJlc3VsdCA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X29uZXdheSAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgc2Vjb25kc1RvU2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2Vjb25kc1RvU2xlZXApOworICBzbGVlcCAoc2Vjb25kc1RvU2xlZXApOworICBwcmludGYgKCJ0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyFcbiIsIHNlY29uZHNUb1NsZWVwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90ZXN0X2hhbmRsZXJfaW5pdCAoVGhyaWZ0VGVzdEhhbmRsZXIgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90ZXN0X2hhbmRsZXJfY2xhc3NfaW5pdCAoVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyAqYmFzZV9jbGFzcyA9CisgICAgVF9URVNUX1RIUklGVF9URVNUX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworICBiYXNlX2NsYXNzLT50ZXN0X3ZvaWQgPQorICAgIGtsYXNzLT50ZXN0X3ZvaWQgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF92b2lkOworICBiYXNlX2NsYXNzLT50ZXN0X3N0cmluZyA9CisgICAga2xhc3MtPnRlc3Rfc3RyaW5nID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nOworICBiYXNlX2NsYXNzLT50ZXN0X2Jvb2wgPQorICAgIGtsYXNzLT50ZXN0X2Jvb2wgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ib29sOworICBiYXNlX2NsYXNzLT50ZXN0X2J5dGUgPQorICAgIGtsYXNzLT50ZXN0X2J5dGUgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ieXRlOworICBiYXNlX2NsYXNzLT50ZXN0X2kzMiA9CisgICAga2xhc3MtPnRlc3RfaTMyID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTMyOworICBiYXNlX2NsYXNzLT50ZXN0X2k2NCA9CisgICAga2xhc3MtPnRlc3RfaTY0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTY0OworICBiYXNlX2NsYXNzLT50ZXN0X2RvdWJsZSA9CisgICAga2xhc3MtPnRlc3RfZG91YmxlID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZG91YmxlOworICBiYXNlX2NsYXNzLT50ZXN0X2JpbmFyeSA9CisgICAga2xhc3MtPnRlc3RfYmluYXJ5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYmluYXJ5OworICBiYXNlX2NsYXNzLT50ZXN0X3N0cnVjdCA9CisgICAga2xhc3MtPnRlc3Rfc3RydWN0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0OworICBiYXNlX2NsYXNzLT50ZXN0X25lc3QgPQorICAgIGtsYXNzLT50ZXN0X25lc3QgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9uZXN0OworICBiYXNlX2NsYXNzLT50ZXN0X21hcCA9CisgICAga2xhc3MtPnRlc3RfbWFwID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwOworICBiYXNlX2NsYXNzLT50ZXN0X3N0cmluZ19tYXAgPQorICAgIGtsYXNzLT50ZXN0X3N0cmluZ19tYXAgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmdfbWFwOworICBiYXNlX2NsYXNzLT50ZXN0X3NldCA9CisgICAga2xhc3MtPnRlc3Rfc2V0ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc2V0OworICBiYXNlX2NsYXNzLT50ZXN0X2xpc3QgPQorICAgIGtsYXNzLT50ZXN0X2xpc3QgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9saXN0OworICBiYXNlX2NsYXNzLT50ZXN0X2VudW0gPQorICAgIGtsYXNzLT50ZXN0X2VudW0gPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9lbnVtOworICBiYXNlX2NsYXNzLT50ZXN0X3R5cGVkZWYgPQorICAgIGtsYXNzLT50ZXN0X3R5cGVkZWYgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF90eXBlZGVmOworICBiYXNlX2NsYXNzLT50ZXN0X21hcF9tYXAgPQorICAgIGtsYXNzLT50ZXN0X21hcF9tYXAgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXBfbWFwOworICBiYXNlX2NsYXNzLT50ZXN0X2luc2FuaXR5ID0KKyAgICBrbGFzcy0+dGVzdF9pbnNhbml0eSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5OworICBiYXNlX2NsYXNzLT50ZXN0X211bHRpID0KKyAgICBrbGFzcy0+dGVzdF9tdWx0aSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpOworICBiYXNlX2NsYXNzLT50ZXN0X2V4Y2VwdGlvbiA9CisgICAga2xhc3MtPnRlc3RfZXhjZXB0aW9uID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZXhjZXB0aW9uOworICBiYXNlX2NsYXNzLT50ZXN0X211bHRpX2V4Y2VwdGlvbiA9CisgICAga2xhc3MtPnRlc3RfbXVsdGlfZXhjZXB0aW9uID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGlfZXhjZXB0aW9uOworICBiYXNlX2NsYXNzLT50ZXN0X29uZXdheSA9CisgICAga2xhc3MtPnRlc3Rfb25ld2F5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfb25ld2F5OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0Y2IxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFU1RfSEFORExFUl9ICisjZGVmaW5lIF9USFJJRlRfVEVTVF9IQU5ETEVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogQSBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgVFRlc3RUaHJpZnRUZXN0SWYgaW50ZXJmYWNlICovCisKKyNkZWZpbmUgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSICh0aHJpZnRfdGVzdF9oYW5kbGVyX2dldF90eXBlICgpKQorCisjZGVmaW5lIFRIUklGVF9URVNUX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdEhhbmRsZXIpKQorI2RlZmluZSBJU19USFJJRlRfVEVTVF9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSKSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0SGFuZGxlckNsYXNzKSkKKyNkZWZpbmUgSVNfVEhSSUZUX1RFU1RfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9USFJJRlRfVEVTVF9IQU5ETEVSKSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VGVzdEhhbmRsZXIgVGhyaWZ0VGVzdEhhbmRsZXI7Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyBUaHJpZnRUZXN0SGFuZGxlckNsYXNzOworCitzdHJ1Y3QgX1RocmlmdFRlc3RIYW5kbGVyIHsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX1RocmlmdFRlc3RIYW5kbGVyQ2xhc3MgeworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqdGVzdF92b2lkKSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc3RyaW5nKSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfYm9vbCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4qX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9ieXRlKSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50OCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2kzMikgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2k2NCkgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2RvdWJsZSkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9iaW5hcnkpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQnl0ZUFycmF5ICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQnl0ZUFycmF5ICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc3RydWN0KSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdCAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbmVzdCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QyICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdDIgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbWFwKSAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc3RyaW5nX21hcCkgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3Rfc2V0KSAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbGlzdCkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FycmF5ICAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQXJyYXkgICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfZW51bSkgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3ROdW1iZXJ6Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdE51bWJlcnogICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfdHlwZWRlZikgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RVc2VySWQqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9tYXBfbWFwKSAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBoZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9pbnNhbml0eSkgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0SW5zYW5pdHkgICphcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9tdWx0aSkgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgICBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICAgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICphcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICAgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9leGNlcHRpb24pICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfbXVsdGlfZXhjZXB0aW9uKSAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uMiAgICAgICoqZXJyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9vbmV3YXkpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgc2Vjb25kc1RvU2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworfTsKKworLyogVXNlZCBieSBUSFJJRlRfVEVTVF9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSB0aHJpZnRfdGVzdF9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3ZvaWQgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmcgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ieXRlICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ4Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaTMyICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2k2NCAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2RvdWJsZSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJ1Y3QgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9uZXN0ICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0MiAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RYdHJ1Y3QyICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXAgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmdfbWFwICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zZXQgICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9saXN0ICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBcnJheSAgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0FycmF5ICAgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF90eXBlZGVmICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0VXNlcklkKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcF9tYXAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgaGVsbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5ICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdEluc2FuaXR5ICAqYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICAgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgICBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICAgIGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2V4Y2VwdGlvbiAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKK2dib29sZWFuIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aV9leGNlcHRpb24gKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24gICAgICAgKiplcnIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbjIgICAgICAqKmVycjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X29uZXdheSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIHNlY29uZHNUb1NsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfVEVTVF9IQU5ETEVSX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3QvY2wvTWFrZWZpbGUuYW0gYi90ZXN0L2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZTcyYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY2wgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworVGVzdFNlcnZlcjogbWFrZS10ZXN0LXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3Qtc2VydmVyLmxpc3AKKworVGVzdENsaWVudDogbWFrZS10ZXN0LWNsaWVudC5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3QtY2xpZW50Lmxpc3AKKworcHJlY3Jvc3M6IHN0dWJzIFRlc3RTZXJ2ZXIgVGVzdENsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tY2wKKwkkKFJNKSBUZXN0U2VydmVyCisJJChSTSkgVGVzdENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWltcGxlbWVudGF0aW9uLmxpc3AgXAorCW1ha2UtdGVzdC1jbGllbnQubGlzcCBcCisJbWFrZS10ZXN0LXNlcnZlci5saXNwIFwKKwl0ZXN0cy5saXNwCmRpZmYgLS1naXQgYS90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AgYi90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhZjdiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDEzNiBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQudGVzdC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC12b2lkICgpCisgIChmb3JtYXQgdCAidGVzdFZvaWQoKX4lIikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZyAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cmluZyh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1ib29sICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0Qm9vbCh+YSl+JSIgKGlmIHRoaW5nICJ0cnVlIiAiZmFsc2UiKSkKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJ5dGUgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCeXRlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWkzMiAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEkzMih+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pNjQgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RJNjQofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZG91YmxlICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RG91YmxlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJpbmFyeSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJpbmFyeSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJ1Y3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJ1Y3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbmVzdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdE5lc3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbWFwICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TWFwKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZy1tYXAgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJpbmdNYXAofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc2V0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U2V0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWxpc3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RMaXN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWVudW0gKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RFbnVtKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXR5cGVkZWYgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RUeXBlZGVmKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW1hcC1tYXAgKGhlbGxvKQorICAoZm9ybWF0IHQgInRlc3RNYXBNYXAofmEpfiUiIGhlbGxvKQorICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKSAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pbnNhbml0eSAoYXJndW1lbnQpCisgIChsZXQgKChyZXN1bHQgYCgoMSAuICgoMiAuICxhcmd1bWVudCkgKDMgLiAsYXJndW1lbnQpKSkKKyAgICAgICAgICAgICAgICAgICgyIC4gKCg2IC4gLCh0aHJpZnQudGVzdDo6bWFrZS1pbnNhbml0eSA6dXNlci1tYXAgbmlsIDp4dHJ1Y3RzIG5pbCkpKSkpKSkKKyAgICAoZm9ybWF0IHQgIn5hfiUiIHJlc3VsdCkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aSAoYXJnMCBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUpCisgIChkZWNsYXJlIChpZ25vcmFibGUgYXJnMyBhcmc0IGFyZzUpKQorICAoZm9ybWF0IHQgInRlc3RNdWx0aSgpfiUiKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbG8yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgYXJnMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIGFyZzIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1leGNlcHRpb24gKGFyZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RXhjZXB0aW9uKH5hKX4lIiBhcmcpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZyAiWGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlIGFyZykpCisgICAgKChzdHJpbmc9IGFyZyAiVEV4Y2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlICJTdHVmZiEiKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aS1leGNlcHRpb24gKGFyZzAgYXJnMSkKKyAgKGZvcm1hdCB0ICJ0ZXN0TXVsdGlFeGNlcHRpb24ofmEsIH5hKX4lIiBhcmcwIGFyZzEpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZzAgIlhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpKQorICAgICgoc3RyaW5nPSBhcmcwICJYY2VwdGlvbjIiKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3RydWN0LXRoaW5nICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyAwKSkpKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgMCkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW9uZXdheSAoc2Vjb25kcykKKyAgKGZvcm1hdCB0ICJ0ZXN0T25ld2F5KH5hKTogU2xlZXBpbmcuLi5+JSIgc2Vjb25kcykKKyAgKHNsZWVwIHNlY29uZHMpCisgIChmb3JtYXQgdCAidGVzdE9uZXdheSh+YSk6IGRvbmUgc2xlZXBpbmchfiUiIHNlY29uZHMpKQorCis7OzsgUmVtb3ZlZCBmcm9tIHRoZSBJREwgZGVmaW5pdGlvbi4KKyMrKG9yKQorKGRlZnVuIHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmJsYWgtYmxhaCAoKQorICAoZm9ybWF0IHQgImJsYWhCbGFoKCl+JSIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2UtaW1wbGVtZW50YXRpb246c2Vjb25kdGVzdC1zdHJpbmcgKHRoaW5nKQorICAoZm9ybWF0IHQgInNlY29uZHRlc3RTdHJpbmcofmEpfiUiIHRoaW5nKQorICAoY29uY2F0ZW5hdGUgJ3N0cmluZyAidGVzdFN0cmluZyhcIiIgdGhpbmcgIlwiKSIpKQorCmRpZmYgLS1naXQgYS90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcCBiL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcApAQCAtMCwwICsxLDkzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIysob3IpICh3aGVuIChub3QgKGJvdW5kcCAnc2ItaW1wbDo6ZGVmYXVsdC1leHRlcm5hbC1mb3JtYXQpCisgICAgICAgICAgICAgICAgIChzZXRmIHNiLWltcGw6OmRlZmF1bHQtZXh0ZXJuYWwtZm9ybWF0IDpVVEYtOCkpKQorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi8uLi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLXN5c3RlbSA6Zmlhc2NvKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL1RocmlmdFRlc3QvdGhyaWZ0LWdlbi1UaHJpZnRUZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtZ2VuLXRocmlmdHRlc3QpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmcGFja2FnZSAjOnRocmlmdC1jcm9zcworICAoOnVzZSAjOmNvbW1vbi1saXNwICM6Zmlhc2NvKQorICAoOmV4cG9ydCAjOmNyb3NzLXRlc3QpKQorCisoaW4tcGFja2FnZSAjOnRocmlmdC1jcm9zcykKKworKGRlZnBhcmFtZXRlciAqcHJvdCogbmlsKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJ0ZXN0cy5saXNwIiAqbG9hZC10cnVlbmFtZSopIDpleHRlcm5hbC1mb3JtYXQgOlVURi04KQorCisoY2xvbjpkZWZzeW5vcHNpcyAoKQorICAodGV4dCA6Y29udGVudHMgIlRoZSBDb21tb24gTGlzcCBjbGllbnQgZm9yIFRocmlmdCdzIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUuIikKKyAgKGdyb3VwICg6aGVhZGVyICJBbGxvd2VkIG9wdGlvbnM6IikKKyAgICAoZmxhZyA6c2hvcnQtbmFtZSAiaCIgOmxvbmctbmFtZSAiaGVscCIKKyAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByaW50IHRoaXMgaGVscCBhbmQgZXhpdC4iKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAiaG9zdCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIGhvc3QgdG8gY29ubmVjdCB0by4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAibG9jYWxob3N0IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJidWZmZXJlZCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicHJvdG9jb2wiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByb3RvY29sOiBwcm90b2NvbCB0byB1c2UgKFwiYmluYXJ5XCIsIFwibXVsdGlcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYmluYXJ5IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpKSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciBvdXIgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4iCisgIChjbG9uOm1ha2UtY29udGV4dCkKKyAgKHdoZW4gKGNsb246Z2V0b3B0IDpzaG9ydC1uYW1lICJoIikKKyAgICAoY2xvbjpoZWxwKQorICAgIChjbG9uOmV4aXQpKQorICAobGV0ICgocG9ydCAiOTA5MCIpCisgICAgICAgIChob3N0ICJsb2NhbGhvc3QiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJob3N0IikKKyAgICAgICAgICAoc2V0ZiBob3N0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAoc2V0ZiAqcHJvdCogKHRocmlmdC5pbXBsZW1lbnRhdGlvbjo6Y2xpZW50IChwdXJpOnBhcnNlLXVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXRlbmF0ZSAnc3RyaW5nICJ0aHJpZnQ6Ly8iIGhvc3QgIjoiIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZyYW1lZCBmcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpCisgICAgKGxldCAoKHJlc3VsdCAoY3Jvc3MtdGVzdCA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgICAgICh0aHJpZnQuaW1wbGVtZW50YXRpb246OmNsb3NlICpwcm90KikKKyAgICAgIChjbG9uOmV4aXQgcmVzdWx0KSkpKQorCisoY2xvbjpkdW1wICJUZXN0Q2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AgYi90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNjODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AKQEAgLTAsMCArMSw4MCBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uLy4uL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9UaHJpZnRUZXN0L3RocmlmdC1nZW4tVGhyaWZ0VGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LWdlbi10aHJpZnR0ZXN0KQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiaW1wbGVtZW50YXRpb24ubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhjbG9uOmRlZnN5bm9wc2lzICgpCisgICh0ZXh0IDpjb250ZW50cyAiVGhlIENvbW1vbiBMaXNwIHNlcnZlciBmb3IgVGhyaWZ0J3MgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZS4iKQorICAoZ3JvdXAgKDpoZWFkZXIgIkFsbG93ZWQgb3B0aW9uczoiKQorICAgIChmbGFnIDpzaG9ydC1uYW1lICJoIiA6bG9uZy1uYW1lICJoZWxwIgorICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0LiIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJzZXJ2ZXItdHlwZSIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIHR5cGUgb2Ygc2VydmVyLCBjdXJyZW50bHkgb25seSBcInNpbXBsZVwiIGlzIGF2YWlsYWJsZS4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAic2ltcGxlIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiIG9yIFwiZnJhbWVkXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJ1ZmZlcmVkIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwcm90b2NvbCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJvdG9jb2w6IHByb3RvY29sIHRvIHVzZSAoXCJiaW5hcnlcIiBvciBcIm11bHRpXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJpbmFyeSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKSkpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3Igb3VyIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIgorICAoY2xvbjptYWtlLWNvbnRleHQpCisgICh3aGVuIChjbG9uOmdldG9wdCA6c2hvcnQtbmFtZSAiaCIpCisgICAgKGNsb246aGVscCkKKyAgICAoY2xvbjpleGl0KSkKKyAgKGxldCAoKHBvcnQgIjkwOTAiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAobGV0ICgoc2VydmljZXMgKGlmIG11bHRpcGxleGVkCisgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCB0aHJpZnQudGVzdDp0aHJpZnQtdGVzdCB0aHJpZnQudGVzdDpzZWNvbmQtc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC50ZXN0OnRocmlmdC10ZXN0KSkpCisgICAgICAodGhyaWZ0OnNlcnZlIChwdXJpOnBhcnNlLXVyaSAoY29uY2F0ZW5hdGUgJ3N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQ6Ly8xMjcuMC4wLjE6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcworICAgICAgICAgICAgICAgICAgICA6ZnJhbWVkIGZyYW1lZAorICAgICAgICAgICAgICAgICAgICA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgKGNsb246ZXhpdCkpCisKKyhjbG9uOmR1bXAgIlRlc3RTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90ZXN0L2NsL3Rlc3RzLmxpc3AgYi90ZXN0L2NsL3Rlc3RzLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMzVmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvdGVzdHMubGlzcApAQCAtMCwwICsxLDI0MCBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGUgdGVzdHMgaGVyZSBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIGNvbnRleHQgb2YgYSBUZXN0U2VydmVyCis7Ozs7IHJ1bm5pbmcgYW5kIHRoZSBkeW5hbWljIHZhcmlhYmxlIHRocmlmdC1jcm9zczo6KnByb3QqCis7Ozs7IGJlaW5nIHNldCB3aXRoIGEgY2xpZW50IGNvbm5lY3Rpb24gdG8gdGhlIFRlc3RTZXJ2ZXIuIE5vcm1hbGx5LAorOzs7OyB0aGlzIGlzIGhhbmRsZWQgaW4gbWFrZS10ZXN0LWNsaWVudC5saXNwLgorCisKKzs7OyBTdGFuZGFyZCBUaHJpZnQgY3Jvc3MtdGVzdCBlcnJvciBjb2RlcworKGRlZnBhcmFtZXRlciAqdGVzdF9iYXNldHlwZXMqIDEpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3N0cnVjdHMqIDIpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2NvbnRhaW5lcnMqIDQpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2V4Y2VwdGlvbnMqIDgpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3Vua25vd24qIDY0KQorKGRlZnBhcmFtZXRlciAqdGVzdF90aW1lb3V0KiAxMjgpCisKKyhkZWZ1biBjcm9zcy10ZXN0ICgma2V5IChtdWx0aXBsZXhlZCBuaWwpKQorICAiVGhlIG1haW4gY3Jvc3MtdGVzdCBydW5uZXIuIgorICAobGV0ICgocmVzdWx0IG5pbCkpCisgICAgKGhhbmRsZXItY2FzZQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6YmFzZS10eXBlcykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2Jhc2V0eXBlcyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6c3RydWN0cykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3N0cnVjdHMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmNvbnRhaW5lcnMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9jb250YWluZXJzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpleGNlcHRpb25zKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfZXhjZXB0aW9ucyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bWlzYykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpCisKKyAgICAgICAgICA7OyBJdCBkb2Vzbid0IHNlZW0gbGlrZSBhbnlvbmUgYWN0dWFsbHkgdXNlcworICAgICAgICAgIDs7IHRoZSBzZWNvbmQgdGVzdCBzZXJ2aWNlIHdoZW4gdGVzdGluZyBtdWx0aXBsZXhpbmcsCisgICAgICAgICAgOzsgc28gdGhpcyB3b3VsZCBmYWlsIGFnYWluc3Qgc2VydmVycyBpbiBvdGhlcgorICAgICAgICAgIDs7IGxhbmd1YWdlcy4gRm9yIG5vdywgYW55d2F5LgorICAgICAgICAgICMrKG9yKQorICAgICAgICAgICh3aGVuIG11bHRpcGxleGVkCisgICAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bXVsdGlwbGV4KQorICAgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKSkpCisgICAgICAoZXJyb3IgKGUpIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpKQorICAgIChhcHBseSAjJysgcmVzdWx0KSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmJhc2UtdHlwZXMpCisKKyhpbi1wYWNrYWdlICM6YmFzZS10eXBlcykKKworKGRlZmNvbnN0YW50ICpsYW5nLXN0cmluZyogIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKQorCisoZGVmcGFyYW1ldGVyICp0cmljay1zdHJpbmcqIChmb3JtYXQgbmlsICJxdW90ZTogXCIgYmFja3NsYXNoOiBcXCBuZXdsaW5lOiB+JSBiYWNrc3BhY2U6IH5DIH4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogflQganVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgI1xiYWNrc3BhY2UpKQorCisoZGVmY29uc3RhbnQgKmJpbmFyeS1zZXF1ZW5jZSogIygxMjggMTI5IDEzMCAxMzEgMTMyIDEzMyAxMzQgMTM1IDEzNiAxMzcgMTM4IDEzOSAxNDAgMTQxIDE0MiAxNDMgMTQ0IDE0NSAxNDYgMTQ3IDE0OCAxNDkgMTUwIDE1MSAxNTIgMTUzIDE1NCAxNTUgMTU2IDE1NyAxNTggMTU5IDE2MCAxNjEgMTYyIDE2MyAxNjQgMTY1IDE2NiAxNjcgMTY4IDE2OSAxNzAgMTcxIDE3MiAxNzMgMTc0IDE3NSAxNzYgMTc3IDE3OCAxNzkgMTgwIDE4MSAxODIgMTgzIDE4NCAxODUgMTg2IDE4NyAxODggMTg5IDE5MCAxOTEgMTkyIDE5MyAxOTQgMTk1IDE5NiAxOTcgMTk4IDE5OSAyMDAgMjAxIDIwMiAyMDMgMjA0IDIwNSAyMDYgMjA3IDIwOCAyMDkgMjEwIDIxMSAyMTIgMjEzIDIxNCAyMTUgMjE2IDIxNyAyMTggMjE5IDIyMCAyMjEgMjIyIDIyMyAyMjQgMjI1IDIyNiAyMjcgMjI4IDIyOSAyMzAgMjMxIDIzMiAyMzMgMjM0IDIzNSAyMzYgMjM3IDIzOCAyMzkgMjQwIDI0MSAyNDIgMjQzIDI0NCAyNDUgMjQ2IDI0NyAyNDggMjQ5IDI1MCAyNTEgMjUyIDI1MyAyNTQgMjU1IDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcgNzggNzkgODAgODEgODIgODMgODQgODUgODYgODcgODggODkgOTAgOTEgOTIgOTMgOTQgOTUgOTYgOTcgOTggOTkgMTAwIDEwMSAxMDIgMTAzIDEwNCAxMDUgMTA2IDEwNyAxMDggMTA5IDExMCAxMTEgMTEyIDExMyAxMTQgMTE1IDExNiAxMTcgMTE4IDExOSAxMjAgMTIxIDEyMiAxMjMgMTI0IDEyNSAxMjYgMTI3KSkKKworKGRlZnRlc3Qgdm9pZC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC12b2lkIHRocmlmdC1jcm9zczo6KnByb3QqKSkpKQorCisoZGVmdGVzdCBib29sZWFuLXRlc3QgKCkKKyAgKGlzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogdCkpCisgIChpcyAobm90ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpKQorCisoZGVmdGVzdCBpbnRlZ2VyLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMTI3KSAxMjcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMTI4KSAtMTI4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMjE0NzQ4MzY0NykgMjE0NzQ4MzY0NykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTIxNDc0ODM2NDgpIC0yMTQ3NDgzNjQ4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA5MjIzMzcyMDM2ODU0Nzc1ODA3KSA5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtOTIyMzM3MjAzNjg1NDc3NTgwOCkgLTkyMjMzNzIwMzY4NTQ3NzU4MDgpKSkKKworKGRlZnRlc3QgZG91YmxlLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwLjApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDQyLjApIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtNTU1LjApIC01NTUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01Mi4zNjc4KSAtNTIuMzY3OCkpKQorCisoZGVmdGVzdCBzdHJpbmctdGVzdCAoKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICIiKSAiIikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKQorICAgICAgICAgICAgICAgIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqbGFuZy1zdHJpbmcqKSAqbGFuZy1zdHJpbmcqKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdHJpY2stc3RyaW5nKikgKnRyaWNrLXN0cmluZyopKSkKKworKGRlZnRlc3QgYmluYXJ5LXRlc3QgKCkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICMoKSkgIygpKSkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICpiaW5hcnktc2VxdWVuY2UqKSAqYmluYXJ5LXNlcXVlbmNlKikpKQorCisoZGVmdGVzdCBlbnVtLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5maXZlKSB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpIHRocmlmdC50ZXN0Om51bWJlcnoub25lKSkpCisKKyhkZWZ0ZXN0IHR5cGVkZWYtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtdHlwZWRlZiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAzMDk4NTgyMzUwODI1MjMpIDMwOTg1ODIzNTA4MjUyMykpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpzdHJ1Y3RzKQorCisoaW4tcGFja2FnZSAjOnN0cnVjdHMpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3Qtc3RydWN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbCBpcyBlbXB0eS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIC0yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyA0MjQyNDI0MikpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3QtbmVzdCogKHRocmlmdC50ZXN0Om1ha2UteHRydWN0MiA6Ynl0ZS10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHJ1Y3QtdGhpbmcgKnRlc3Qtc3RydWN0KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgLTQyKSkKKworKGRlZnRlc3Qgc3RydWN0LXRlc3QgKCkKKyAgKGxldCAoKHJlYy1zdHJ1Y3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RydWN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LXN0cnVjdCopKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpKSkKKworKGRlZnRlc3QgbmVzdC10ZXN0ICgpCisgIChsZXQqICgocmVjLW5lc3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbmVzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdGVzdC1uZXN0KikpCisgICAgICAgICAocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1zdHJ1Y3QtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItaTMyLXRoaW5nICp0ZXN0LW5lc3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgcmVjLW5lc3QpKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpjb250YWluZXJzKQorCisoaW4tcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhkZWZ0ZXN0IGxpc3QtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbGlzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqICcoNDIgLTQyIDAgNSkpICcoNDIgLTQyIDAgNSkpKSkKKworKGRlZnRlc3Qgc2V0LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAoc29ydCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zZXQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKGxpc3QgNDIgLTQyIDAgNSkpICMnPCkKKyAgICAgICAgICAgICAnKC00MiAwIDUgNDIpKSkpCisKKyhkZWZ1biBtYXA9IChtYXAxIG1hcDIgJmtleSAoY2FyLXByZWRpY2F0ZSAjJ2VxdWFsKSAoY2RyLXByZWRpY2F0ZSAjJ2VxdWFsKSkKKyAgIkNvbXBhcmUgdHdvIGFzc29jIG1hcHMgYWNjb3JkaW5nIHRvIHRoZSBwcmVkaWNhdGVzIGdpdmVuLiIKKyAgKG5vdCAoc2V0LWV4Y2x1c2l2ZS1vciBtYXAxIG1hcDIgOnRlc3QgKGxhbWJkYSAoZWwxIGVsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIChmdW5jYWxsIGNhci1wcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgZWwxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgY2RyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMikpKSkpKSkKKworKGRlZnRlc3QgbWFwLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAnKCgwIC4gMSkgKDQyIC4gLTQyKSAoNSAuIDUpKSkKKyAgICAgICAgICAgICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpCisgICAgICAgICAgICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKQorICAgICAgICAgICAgICAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpCisgICAgICAgICAgICA6Y2RyLXByZWRpY2F0ZSAjJ21hcD0pKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6ZXhjZXB0aW9ucykKKworKGluLXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24gaXMgc2lnbmFsbGVkLCBhbmQgd2hldGhlciBpdHMgZmllbGRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcy4iCisgIChoYW5kbGVyLWNhc2UgKHByb2duIChhcHBseSBmdW5jdGlvbiBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBuaWwpCisgICAgKHRocmlmdC50ZXN0OnhjZXB0aW9uIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLW1lc3NhZ2UgZXgpIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbjIgKGV4cGVjdGVkLWNvZGUgZXhwZWN0ZWQtbWVzc2FnZSBmdW5jdGlvbiAmcmVzdCBhcmdzKQorICAiQSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHhjZXB0aW9uMiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24yIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1lcnJvci1jb2RlIGV4KSBleHBlY3RlZC1jb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1zdHJ1Y3QtdGhpbmcgZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdGVzdCBleGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMSAiWGNlcHRpb24iICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlhjZXB0aW9uIikpCisgIChzaWduYWxzIHRocmlmdDphcHBsaWNhdGlvbi1lcnJvciAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlRFeGNlcHRpb24iKSkKKyAgKGZpbmlzaGVzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAic3VjY2VzcyIpKSkKKworKGRlZnRlc3QgbXVsdGktZXhjZXB0aW9uLXRlc3QgKCkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyIpKQorICAoaXMgKHRlc3QteGNlcHRpb24yIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAibWVhbmluZ2xlc3MgdG9vISIpKQorICAoaXMgKHN0cmluZz0gImZvb2JhciIgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYmFyIikpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm1pc2MpCisKKyhpbi1wYWNrYWdlICM6bWlzYykKKworKGRlZnRlc3Qgb25ld2F5LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW9uZXdheSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhpbi1wYWNrYWdlICM6bXVsdGlwbGV4KQorCisoZGVmdGVzdCBtdWx0aXBsZXgtdGVzdCAoKQorICA7OyBSZW1vdmVkIGZyb20gdGhlIElETCBkZWZpbml0aW9uLgorICA7OyAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlOmJsYWgtYmxhaCB0aHJpZnQtY3Jvc3M6Oipwcm90KikpCisgIChpcyAoc3RyaW5nPSAiYXNkIiAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6c2Vjb25kdGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogImFzZCIpKSkpCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1ZDI5OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBDb250YWlucyB0aGUgdGhyaWZ0IHNwZWNpZmljIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWQoraW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCitmaW5kX3BhY2thZ2UoT3BlblNTTCBSRVFVSVJFRCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKKworZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZnJvbSB1cHN0cmVhbQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorCitmaW5kX3BhY2thZ2UoWkxJQiBSRVFVSVJFRCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCisjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworc2V0KGNyb3NzdGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBzcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCispCithZGRfbGlicmFyeShjcm9zc3Rlc3RnZW5jcHAgU1RBVElDICR7Y3Jvc3N0ZXN0Z2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGNyb3NzdGVzdGdlbmNwcCB0aHJpZnQpCisKK3NldChjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcAorKQorYWRkX2xpYnJhcnkoY3Jvc3NzdHJlc3NnZW5jcHAgU1RBVElDICR7Y3Jvc3NzdHJlc3NnZW5jcHBfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY3Jvc3NzdHJlc3NnZW5jcHAgdGhyaWZ0KQorCithZGRfZXhlY3V0YWJsZShUZXN0U2VydmVyIHNyYy9UZXN0U2VydmVyLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUZXN0U2VydmVyIGNyb3NzdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnR6KQorCithZGRfZXhlY3V0YWJsZShUZXN0Q2xpZW50IHNyYy9UZXN0Q2xpZW50LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUZXN0Q2xpZW50IGNyb3NzdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0bmIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnR6KQorCithZGRfZXhlY3V0YWJsZShTdHJlc3NUZXN0IHNyYy9TdHJlc3NUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTdHJlc3NUZXN0IGNyb3Nzc3RyZXNzZ2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgU3RyZXNzVGVzdCBDT01NQU5EIFN0cmVzc1Rlc3QpCisKK2FkZF9leGVjdXRhYmxlKFN0cmVzc1Rlc3ROb25CbG9ja2luZyBzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgY3Jvc3NzdHJlc3NnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgdGhyaWZ0eikKK2FkZF90ZXN0KE5BTUUgU3RyZXNzVGVzdE5vbkJsb2NraW5nIENPTU1BTkQgU3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5oIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvTWFrZWZpbGUuYW0gYi90ZXN0L2NwcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOGJlODBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEgbGlic3RyZXNzdGVzdGdlbmNwcC5sYQorbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLnRjYyBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy50Y2MgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdC5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3QudGNjIFwKKwlzcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCisKK2xpYnRlc3RnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK25vZGlzdF9saWJzdHJlc3N0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvU2VydmljZS5jcHAgXAorCWdlbi1jcHAvU2VydmljZS5oCisKK2xpYnN0cmVzc3Rlc3RnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK3ByZWNyb3NzOiBUZXN0U2VydmVyIFRlc3RDbGllbnQKKworY2hlY2tfUFJPR1JBTVMgPSBcCisJVGVzdFNlcnZlciBcCisJVGVzdENsaWVudCBcCisJU3RyZXNzVGVzdCBcCisJU3RyZXNzVGVzdE5vbkJsb2NraW5nCisKKyMgd2UgY3VycmVudGx5IGRvIG5vdCBydW4gdGhlIHRlc3RzdWl0ZSwgc3RvcCBjKysgc2VydmVyIGlzc3VlCisjIFRFU1RTID0gXAorIwkkKGNoZWNrX1BST0dSQU1TKQorCitUZXN0U2VydmVyX1NPVVJDRVMgPSBcCisJc3JjL1Rlc3RTZXJ2ZXIuY3BwCisKK1Rlc3RTZXJ2ZXJfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCisKK1Rlc3RDbGllbnRfU09VUkNFUyA9IFwKKwlzcmMvVGVzdENsaWVudC5jcHAKKworVGVzdENsaWVudF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKwktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbSAkKFpMSUJfTElCUykKKworU3RyZXNzVGVzdF9TT1VSQ0VTID0gXAorCXNyYy9TdHJlc3NUZXN0LmNwcAorCitTdHJlc3NUZXN0X0xEQUREID0gXAorCWxpYnN0cmVzc3Rlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitTdHJlc3NUZXN0Tm9uQmxvY2tpbmdfU09VUkNFUyA9IFwKKwlzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcAorCitTdHJlc3NUZXN0Tm9uQmxvY2tpbmdfTERBREQgPSBcCisJbGlic3RyZXNzdGVzdGdlbmNwcC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorCS1sZXZlbnQKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKK2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5oIGdlbi1jcHAvU2Vjb25kU2VydmljZS50Y2M6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgLXIgJDwKKworZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlcnZpY2UuY3BwOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoTElCRVZFTlRfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSWdlbi1jcHAKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MKK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpICQoTElCRVZFTlRfTERGTEFHUykgJChaTElCX0xJQlMpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jcHAvKgorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKKworRVhUUkFfRElTVCA9IFwKKwlzcmMvVGVzdENsaWVudC5jcHAgXAorCXNyYy9UZXN0U2VydmVyLmNwcCBcCisJc3JjL1N0cmVzc1Rlc3QuY3BwIFwKKwlzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvU3RyZXNzLXRlc3QubWsgYi90ZXN0L2NwcC9TdHJlc3MtdGVzdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3NTNiMy4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9TdHJlc3MtdGVzdC5taworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pZm5kZWYgdGhyaWZ0X2hvbWUKLXRocmlmdF9ob21lPS4uLy4uCi1lbmRpZiAjdGhyaWZ0X2hvbWUKLQotdGFyZ2V0OiBhbGwKLQotaWZuZGVmIGJvb3N0X2hvbWUKLSNib29zdF9ob21lPS4uLy4uLy4uLy4uLy4uL3RoaXJkcGFydHkvYm9vc3RfMV8zM18xCi1ib29zdF9ob21lPS91c3IvbG9jYWwvaW5jbHVkZS9ib29zdC0xXzMzXzEKLWVuZGlmICNib29zdF9ob21lCi10YXJnZXQ6IGFsbAotCi1pbmNsdWRlX3BhdGhzID0gJCh0aHJpZnRfaG9tZSkvbGliL2NwcC9zcmMgXAotICAgICAgICAgICAgICAgICQodGhyaWZ0X2hvbWUpL2xpYi9jcHAgXAotICAgICAgICAgICAgICAgICQodGhyaWZ0X2hvbWUpLyBcCi0gICAgICAgICAgICAgICAgJChib29zdF9ob21lKQotCi1pbmNsdWRlX2ZsYWdzID0gJChwYXRzdWJzdCAlLC1JJSwgJChpbmNsdWRlX3BhdGhzKSkKLQotIyBUb29scwotaWZuZGVmIFRIUklGVAotVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAotZW5kaWYgIyBUSFJJRlQKLQotQ0MgICAgID0gZysrCi1MRCAgICAgPSBnKysKLQotIyBDb21waWxlciBmbGFncwotRENGTCAgPSAtV2FsbCAtTzMgLWcgLUkuL2dlbi1jcHAgJChpbmNsdWRlX2ZsYWdzKSAtTCQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvLmxpYnMgLWx0aHJpZnQgLWx0aHJpZnRuYiAtbGV2ZW50Ci1DRkwgICA9IC1XYWxsIC1PMyAtSS4vZ2VuLWNwcCAkKGluY2x1ZGVfZmxhZ3MpIC1MJCh0aHJpZnRfaG9tZSkvbGliL2NwcC8ubGlicyAtbHRocmlmdCAtbHRocmlmdG5iIC1sZXZlbnQKLQotYWxsOiBzdHJlc3MtdGVzdCBzdHJlc3MtdGVzdC1uYgotCi1kZWJ1Zzogc3RyZXNzLXRlc3QtZGVidWcgc3RyZXNzLXRlc3QtZGVidWctbmIKLQotc3R1YnM6IC4uL1N0cmVzc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcCAtLWdlbiBwaHAgLi4vU3RyZXNzVGVzdC50aHJpZnQKLQotc3RyZXNzLXRlc3QtZGVidWctbmI6IHN0dWJzCi0JZysrIC1vIHN0cmVzcy10ZXN0LW5iICQoRENGTCkgc3JjL25iLW1haW4uY3BwIC4vZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwCi0KLXN0cmVzcy10ZXN0LW5iOiBzdHVicwotCWcrKyAtbyBzdHJlc3MtdGVzdC1uYiAkKENGTCkgc3JjL25iLW1haW4uY3BwIC4vZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwCi0KLXN0cmVzcy10ZXN0LWRlYnVnOiBzdHVicwotCWcrKyAtbyBzdHJlc3MtdGVzdCAkKERDRkwpIHNyYy9tYWluLmNwcCAuL2dlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAotCi1zdHJlc3MtdGVzdDogc3R1YnMKLQlnKysgLW8gc3RyZXNzLXRlc3QgJChDRkwpIHNyYy9tYWluLmNwcCAuL2dlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAotCi1jbGVhbjoKLQlybSAtZnIgc3RyZXNzLXRlc3Qgc3RyZXNzLXRlc3QtbmIgZ2VuLWNwcApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvVGhyaWZ0LXRlc3QubWsgYi90ZXN0L2NwcC9UaHJpZnQtdGVzdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxN2U3ZS4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9UaHJpZnQtdGVzdC5taworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIE1ha2VmaWxlIGZvciBUaHJpZnQgdGVzdCBwcm9qZWN0LgotIyBEZWZhdWx0IHRhcmdldCBpcyBldmVyeXRoaW5nCi0KLWlmbmRlZiB0aHJpZnRfaG9tZQotdGhyaWZ0X2hvbWU9Li4vLi4KLWVuZGlmICN0aHJpZnRfaG9tZQotCi10YXJnZXQ6IGFsbAotCi1pZm5kZWYgYm9vc3RfaG9tZQotI2Jvb3N0X2hvbWU9Li4vLi4vLi4vLi4vLi4vdGhpcmRwYXJ0eS9ib29zdF8xXzMzXzEKLWJvb3N0X2hvbWU9L3Vzci9sb2NhbC9pbmNsdWRlL2Jvb3N0LTFfMzNfMQotZW5kaWYgI2Jvb3N0X2hvbWUKLXRhcmdldDogYWxsCi0KLWluY2x1ZGVfcGF0aHMgPSAkKHRocmlmdF9ob21lKS9saWIvY3BwL3NyYyBcCi0JCSQoYm9vc3RfaG9tZSkKLQotaW5jbHVkZV9mbGFncyA9ICQocGF0c3Vic3QgJSwtSSUsICQoaW5jbHVkZV9wYXRocykpCi0KLSMgVG9vbHMKLWlmbmRlZiBUSFJJRlQKLVRIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLWVuZGlmICMgVEhSSUZUCi0KLUNDICAgICA9IGcrKwotTEQgICAgID0gZysrCi0KLSMgQ29tcGlsZXIgZmxhZ3MKLURDRkwgID0gLVdhbGwgLU8zIC1nIC1JLiAtSS4vZ2VuLWNwcCAkKGluY2x1ZGVfZmxhZ3MpIC1MJCh0aHJpZnRfaG9tZSkvbGliL2NwcC8ubGlicyAtbHRocmlmdCAtbHRocmlmdG5iIC1sZXZlbnQKLUxGTCAgID0gIC1MJCh0aHJpZnRfaG9tZSkvbGliL2NwcC8ubGlicyAtbHRocmlmdCAtbHRocmlmdG5iIC1sZXZlbnQKLUNDRkwgID0gLVdhbGwgLU8zIC1JLiAtSS4vZ2VuLWNwcCAkKGluY2x1ZGVfZmxhZ3MpCi1DRkwgICA9ICQoQ0NGTCkgJChMRkwpCi0KLWFsbDogc2VydmVyIGNsaWVudAotCi1kZWJ1Zzogc2VydmVyLWRlYnVnIGNsaWVudC1kZWJ1ZwotCi1zdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyAuLi9UaHJpZnRUZXN0LnRocmlmdAotCi1zZXJ2ZXItZGVidWc6IHN0dWJzCi0JZysrIC1vIFRlc3RTZXJ2ZXIgJChEQ0ZMKSBzcmMvVGVzdFNlcnZlci5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3QuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCAkKHRocmlmdF9ob21lKS9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCi0KLWNsaWVudC1kZWJ1Zzogc3R1YnMKLQlnKysgLW8gVGVzdENsaWVudCAkKERDRkwpIHNyYy9UZXN0Q2xpZW50LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwICQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKLQotc2VydmVyOiBzdHVicwotCWcrKyAtbyBUZXN0U2VydmVyICQoQ0ZMKSBzcmMvVGVzdFNlcnZlci5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3QuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCAkKHRocmlmdF9ob21lKS9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCi0KLWNsaWVudDogc3R1YnMKLQlnKysgLW8gVGVzdENsaWVudCAkKENGTCkgc3JjL1Rlc3RDbGllbnQuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgJCh0aHJpZnRfaG9tZSkvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcAotCi1zbWFsbDoKLQkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyAuLi9TbWFsbFRlc3QudGhyaWZ0Ci0JZysrIC1jICQoQ0NGTCkgLi9nZW4tY3BwL1NtYWxsU2VydmljZS5jcHAgLi9nZW4tY3BwL1NtYWxsVGVzdF90eXBlcy5jcHAKLQotY2xlYW46Ci0Jcm0gLWZyICoubyBUZXN0U2VydmVyIFRlc3RDbGllbnQgZ2VuLWNwcApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZSBiL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWJiYjMuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgcHJvYmFibHkgc2hvdWxkIG5vdCBnbyBpbnRvICJtYWtlIGNoZWNrIiwgYmVjYXVzZSBpdCBpcyBhbiBleHBlcmltZW50LAotIyBub3QgYSB0ZXN0LiAgU3BlY2lmaWNhbGx5LCBpdCBpcyBtZWFudCB0byBkZXRlcm1pbmUgaG93IGxpa2VseSByZWFsbG9jIGlzCi0jIHRvIGF2b2lkIGEgY29weS4gIFRoaXMgaXMgcG9vcmx5IGRvY3VtZW50ZWQuCi0KLXJ1bjogcmVhbGxvY190ZXN0Ci0JZm9yIGl0IGluIDEgNCA2NCA7IGRvIFwKLQkJZm9yIG5iIGluIDEgOCA2NCA1MTIgOyBkbyBcCi0JCQlmb3IgbWlucyBpbiA2NCA1MTIgOyBkbyBcCi0JCQkJZm9yIG1heHMgaW4gMjA0OCAyNjIxNDQgOyBkbyBcCi0JCQkJCWZvciBkYiBpbiA4IDY0IDsgZG8gXAotCQkJCQkJLi9yZWFsbG9jX3Rlc3QgJCRuYiAkJG1pbnMgJCRtYXhzICQkZGIgJCRpdCBcCi0JCQkJCTsgZG9uZSBcCi0JCQkJOyBkb25lIFwKLQkJCTsgZG9uZSBcCi0JCTsgZG9uZSBcCi0JOyBkb25lIFwKLQk+IHJhd19zdGF0cwotCi1DRkxBR1MgPSAtV2FsbCAtZyAtc3RkPWM5OQotTERMSUJTID0gLWxkbAotcmVhbGxvY190ZXN0OiByZWFsbG9jX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYyBiL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzYzYWQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1pbnQgY29waWVzOwotaW50IG5vbl9jb3BpZXM7Ci0KLXZvaWQgKnJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICBzdGF0aWMgdm9pZCAqKCpyZWFsX3JlYWxsb2MpKHZvaWQqLCBzaXplX3QpID0gTlVMTDsKLSAgaWYgKHJlYWxfcmVhbGxvYyA9PSBOVUxMKSB7Ci0gICAgcmVhbF9yZWFsbG9jID0gKHZvaWQqICgqKSAodm9pZCosIHNpemVfdCkpIGRsc3ltKFJUTERfTkVYVCwgInJlYWxsb2MiKTsKLSAgfQotCi0gIHZvaWQgKnJldF9wdHIgPSAoKnJlYWxfcmVhbGxvYykocHRyLCBzaXplKTsKLQotICBpZiAocmV0X3B0ciA9PSBwdHIpIHsKLSAgICBub25fY29waWVzKys7Ci0gIH0gZWxzZSB7Ci0gICAgY29waWVzKys7Ci0gIH0KLQotICByZXR1cm4gcmV0X3B0cjsKLX0KLQotCi1zdHJ1Y3QgVE1lbW9yeUJ1ZmZlciB7Ci0gIHZvaWQqIHB0cjsKLSAgaW50IHNpemU7Ci19OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gIGludCBudW1fYnVmZmVyczsKLSAgaW50IGluaXRfc2l6ZTsKLSAgaW50IG1heF9zaXplOwotICBpbnQgZG91YmxpbmdzOwotICBpbnQgaXRlcmF0aW9uczsKLQotICBpZiAoYXJnYyA8IDYgfHwKLSAgICAgIGFyZ2MgPiA3IHx8Ci0gICAgICAobnVtX2J1ZmZlcnMgPSBhdG9pKGFyZ3ZbMV0pKSA9PSAwIHx8Ci0gICAgICAoaW5pdF9zaXplID0gYXRvaShhcmd2WzJdKSkgPT0gMCB8fAotICAgICAgKG1heF9zaXplID0gYXRvaShhcmd2WzNdKSkgPT0gMCB8fAotICAgICAgaW5pdF9zaXplID4gbWF4X3NpemUgfHwKLSAgICAgIChpdGVyYXRpb25zID0gYXRvaShhcmd2WzRdKSkgPT0gMCB8fAotICAgICAgKGRvdWJsaW5ncyA9IGF0b2koYXJndls1XSkpID09IDAgfHwKLSAgICAgIChhcmdjID09IDcgJiYgYXRvaShhcmd2WzZdKSA9PSAwKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHJlYWxsb2NfdGVzdCA8bnVtX2J1ZmZlcnM+IDxpbml0X3NpemU+IDxtYXhfc2l6ZT4gPGRvdWJsaW5ncz4gPGl0ZXJhdGlvbnM+IFtzZWVkXVxuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0KLSAgZm9yICggaW50IGkgPSAwIDsgaSA8IGFyZ2MgOyBpKysgKSB7Ci0gICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKLSAgfQotICBwcmludGYoIlxuIik7Ci0KLSAgaWYgKGFyZ2MgPT0gNykgewotICAgIHNyYW5kKGF0b2koYXJndls2XSkpOwotICB9IGVsc2UgewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICB9Ci0KLSAgc3RydWN0IFRNZW1vcnlCdWZmZXIqIGJ1ZmZlcnMgPSBjYWxsb2MobnVtX2J1ZmZlcnMsIHNpemVvZigqYnVmZmVycykpOwotICBpZiAoYnVmZmVycyA9PSBOVUxMKSBhYm9ydCgpOwotCi0gIGZvciAoIGludCBpID0gMCA7IGkgPCBudW1fYnVmZmVycyA7IGkrKyApIHsKLSAgICBidWZmZXJzW2ldLnNpemUgPSBtYXhfc2l6ZTsKLSAgfQotCi0gIHdoaWxlIChpdGVyYXRpb25zIC0tPiAwKSB7Ci0gICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGRvdWJsaW5ncyAqIG51bV9idWZmZXJzIDsgaSsrICkgewotICAgICAgc3RydWN0IFRNZW1vcnlCdWZmZXIqIGJ1ZiA9ICZidWZmZXJzW3JhbmQoKSAlIG51bV9idWZmZXJzXTsKLSAgICAgIGJ1Zi0+c2l6ZSAqPSAyOwotICAgICAgaWYgKGJ1Zi0+c2l6ZSA8PSBtYXhfc2l6ZSkgewotICAgICAgICBidWYtPnB0ciA9IHJlYWxsb2MoYnVmLT5wdHIsIGJ1Zi0+c2l6ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcmVlKGJ1Zi0+cHRyKTsKLSAgICAgICAgYnVmLT5zaXplID0gaW5pdF9zaXplOwotICAgICAgICBidWYtPnB0ciA9IG1hbGxvYyhidWYtPnNpemUpOwotICAgICAgfQotICAgICAgaWYgKGJ1Zi0+cHRyID09IE5VTEwpIGFib3J0KCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpbnRmKCJOb24tY29waWVkICVkLyVkICglLjJmJSUpXG4iLCBub25fY29waWVzLCBjb3BpZXMgKyBub25fY29waWVzLCAxMDAuMCAqIG5vbl9jb3BpZXMgLyAoY29waWVzICsgbm9uX2NvcGllcykpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcCBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVmODlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgorCisjaW5jbHVkZSAiU2VydmljZS5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3VzaW5nIG5hbWVzcGFjZSB0ZXN0OjpzdHJlc3M7CisKK3N0cnVjdCBlcXN0ciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7IH0KK307CisKK3N0cnVjdCBsdHN0ciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsgfQorfTsKKworLy8gdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgaW50LCBoYXNoPGNvbnN0IGNoYXIqPiwgZXFzdHI+IGNvdW50X21hcDsKK3R5cGVkZWYgbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGx0c3RyPiBjb3VudF9tYXA7CisKK2NsYXNzIFNlcnZlciA6IHB1YmxpYyBTZXJ2aWNlSWYgeworcHVibGljOgorICBTZXJ2ZXIoKSB7fQorCisgIHZvaWQgY291bnQoY29uc3QgY2hhciogbWV0aG9kKSB7CisgICAgR3VhcmQgbShsb2NrXyk7CisgICAgaW50IGN0ID0gY291bnRzX1ttZXRob2RdOworICAgIGNvdW50c19bbWV0aG9kXSA9ICsrY3Q7CisgIH0KKworICB2b2lkIGVjaG9Wb2lkKCkgeworICAgIGNvdW50KCJlY2hvVm9pZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvdW50X21hcCBnZXRDb3VudCgpIHsKKyAgICBHdWFyZCBtKGxvY2tfKTsKKyAgICByZXR1cm4gY291bnRzXzsKKyAgfQorCisgIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIGFyZykgeworICAgIGlmIChhcmcgIT0gImhlbGxvIikgeworICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HICglcykhISEhIiwgYXJnLmNfc3RyKCkpOworICAgIH0KKyAgICBvdXQgPSBhcmc7CisgIH0KKyAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4mIG91dCwgY29uc3Qgc2V0PGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4mIG91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorCitwcml2YXRlOgorICBjb3VudF9tYXAgY291bnRzXzsKKyAgTXV0ZXggbG9ja187Cit9OworCitlbnVtIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIHsKKyAgT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQsCisgIERvbnRPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZAorfTsKK2NsYXNzIENsaWVudFRocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CitwdWJsaWM6CisgIENsaWVudFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VJZj4gY2xpZW50LAorICAgICAgICAgICAgICAgTW9uaXRvciYgbW9uaXRvciwKKyAgICAgICAgICAgICAgIHNpemVfdCYgd29ya2VyQ291bnQsCisgICAgICAgICAgICAgICBzaXplX3QgbG9vcENvdW50LAorICAgICAgICAgICAgICAgVFR5cGUgbG9vcFR5cGUsCisgICAgICAgICAgICAgICBUcmFuc3BvcnRPcGVuQ2xvc2VCZWhhdmlvciBiZWhhdmlvcikKKyAgICA6IF90cmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIF9jbGllbnQoY2xpZW50KSwKKyAgICAgIF9tb25pdG9yKG1vbml0b3IpLAorICAgICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKKyAgICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKKyAgICAgIF9sb29wVHlwZShsb29wVHlwZSksCisgICAgICBfYmVoYXZpb3IoYmVoYXZpb3IpIHt9CisKKyAgdm9pZCBydW4oKSB7CisKKyAgICAvLyBXYWl0IGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gc3RhcnQKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgIHdoaWxlIChfd29ya2VyQ291bnQgPT0gMCkgeworICAgICAgICBfbW9uaXRvci53YWl0KCk7CisgICAgICB9CisgICAgfQorCisgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgaWYoX2JlaGF2aW9yID09IE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSB7CisgICAgICBfdHJhbnNwb3J0LT5vcGVuKCk7CisgICAgfQorCisgICAgc3dpdGNoIChfbG9vcFR5cGUpIHsKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIGxvb3BFY2hvVm9pZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6CisgICAgICBsb29wRWNob0J5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JMzI6CisgICAgICBsb29wRWNob0kzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0k2NDoKKyAgICAgIGxvb3BFY2hvSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgbG9vcEVjaG9TdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBpZihfYmVoYXZpb3IgPT0gT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpIHsKKyAgICAgIF90cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgfQorCisgICAgX2RvbmUgPSB0cnVlOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgICBfd29ya2VyQ291bnQtLTsKKworICAgICAgaWYgKF93b3JrZXJDb3VudCA9PSAwKSB7CisKKyAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob1ZvaWQoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIF9jbGllbnQtPmVjaG9Wb2lkKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob0J5dGUoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIGludDhfdCBhcmcgPSAxOworICAgICAgaW50OF90IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob0kzMigpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgaW50MzJfdCBhcmcgPSAxOworICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvSTMyKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob0k2NCgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgaW50NjRfdCBhcmcgPSAxOworICAgICAgaW50NjRfdCByZXN1bHQ7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvSTY0KGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob1N0cmluZygpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgc3RyaW5nIGFyZyA9ICJoZWxsbyI7CisgICAgICBzdHJpbmcgcmVzdWx0OworICAgICAgX2NsaWVudC0+ZWNob1N0cmluZyhyZXN1bHQsIGFyZyk7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IF9jbGllbnQ7CisgIE1vbml0b3ImIF9tb25pdG9yOworICBzaXplX3QmIF93b3JrZXJDb3VudDsKKyAgc2l6ZV90IF9sb29wQ291bnQ7CisgIFRUeXBlIF9sb29wVHlwZTsKKyAgaW50NjRfdCBfc3RhcnRUaW1lOworICBpbnQ2NF90IF9lbmRUaW1lOworICBib29sIF9kb25lOworICBNb25pdG9yIF9zbGVlcDsKKyAgVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgX2JlaGF2aW9yOworfTsKKworY2xhc3MgVFN0YXJ0T2JzZXJ2ZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIFRTdGFydE9ic2VydmVyKCkgOiBhd2FrZV8oZmFsc2UpIHt9CisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKG1fKTsKKyAgICBhd2FrZV8gPSB0cnVlOworICAgIG1fLm5vdGlmeUFsbCgpOworICB9CisgIHZvaWQgd2FpdEZvclNlcnZpY2UoKSB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7CisgICAgd2hpbGUgKCFhd2FrZV8pCisgICAgICBtXy53YWl0Rm9yZXZlcigpOworICB9CisKK3ByaXZhdGU6CisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBtXzsKKyAgYm9vbCBhd2FrZV87Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKworICBpbnQgcG9ydCA9IDkwOTE7CisgIHN0cmluZyBjbGllbnRUeXBlID0gInJlZ3VsYXIiOworICBzdHJpbmcgc2VydmVyVHlwZSA9ICJ0aHJlYWQtcG9vbCI7CisgIHN0cmluZyBwcm90b2NvbFR5cGUgPSAiYmluYXJ5IjsKKyAgc2l6ZV90IHdvcmtlckNvdW50ID0gNDsKKyAgc2l6ZV90IGNsaWVudENvdW50ID0gMjA7CisgIHNpemVfdCBsb29wQ291bnQgPSA1MDAwMDsKKyAgVFR5cGUgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJlY2hvVm9pZCI7CisgIGJvb2wgcnVuU2VydmVyID0gdHJ1ZTsKKyAgYm9vbCBsb2dSZXF1ZXN0cyA9IGZhbHNlOworICBzdHJpbmcgcmVxdWVzdExvZ1BhdGggPSAiLi9yZXF1ZXN0bG9nLnRsb2ciOworICBib29sIHJlcGxheVJlcXVlc3RzID0gZmFsc2U7CisKKyAgb3N0cmluZ3N0cmVhbSB1c2FnZTsKKworICB1c2FnZSA8PCBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50LXR5cGU9PGNsaWVudC10eXBlPl0iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIiA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsCisgICAgICAgIDw8ICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNsaWVudC10eXBlICAgIFR5cGUgb2YgY2xpZW50LCBcInJlZ3VsYXJcIiBvciBcImNvbmN1cnJlbnRcIi4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICBtYXA8c3RyaW5nLCBzdHJpbmc+IGFyZ3M7CisKKyAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKKworICAgIHN0cmluZyBhcmcoYXJndltpeF0pOworCisgICAgaWYgKGFyZy5jb21wYXJlKDAsIDIsICItLSIpID09IDApIHsKKworICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7CisKKyAgICAgIHN0cmluZyBrZXkgPSBzdHJpbmcoYXJnLCAyLCBlbmQgLSAyKTsKKworICAgICAgaWYgKGVuZCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgYXJnc1trZXldID0gc3RyaW5nKGFyZywgZW5kICsgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiICsgYXJnKTsKKyAgICB9CisgIH0KKworICB0cnkgeworCisgICAgaWYgKCFhcmdzWyJjbGllbnRzIl0uZW1wdHkoKSkgeworICAgICAgY2xpZW50Q291bnQgPSBhdG9pKGFyZ3NbImNsaWVudHMiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImhlbHAiXS5lbXB0eSgpKSB7CisgICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJsb29wIl0uZW1wdHkoKSkgeworICAgICAgbG9vcENvdW50ID0gYXRvaShhcmdzWyJsb29wIl0uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJjYWxsIl0uZW1wdHkoKSkgeworICAgICAgY2FsbE5hbWUgPSBhcmdzWyJjYWxsIl07CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJwb3J0Il0uZW1wdHkoKSkgeworICAgICAgcG9ydCA9IGF0b2koYXJnc1sicG9ydCJdLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICghYXJnc1sic2VydmVyIl0uZW1wdHkoKSkgeworICAgICAgcnVuU2VydmVyID0gYXJnc1sic2VydmVyIl0gPT0gInRydWUiOworICAgIH0KKworICAgIGlmICghYXJnc1sibG9nLXJlcXVlc3QiXS5lbXB0eSgpKSB7CisgICAgICBsb2dSZXF1ZXN0cyA9IGFyZ3NbImxvZy1yZXF1ZXN0Il0gPT0gInRydWUiOworICAgIH0KKworICAgIGlmICghYXJnc1sicmVwbGF5LXJlcXVlc3QiXS5lbXB0eSgpKSB7CisgICAgICByZXBsYXlSZXF1ZXN0cyA9IGFyZ3NbInJlcGxheS1yZXF1ZXN0Il0gPT0gInRydWUiOworICAgIH0KKworICAgIGlmICghYXJnc1sic2VydmVyLXR5cGUiXS5lbXB0eSgpKSB7CisgICAgICBzZXJ2ZXJUeXBlID0gYXJnc1sic2VydmVyLXR5cGUiXTsKKworICAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKKworICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKKworICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKKworICAgICAgfSBlbHNlIHsKKworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIgKyBzZXJ2ZXJUeXBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFhcmdzWyJjbGllbnQtdHlwZSJdLmVtcHR5KCkpIHsKKyAgICAgIGNsaWVudFR5cGUgPSBhcmdzWyJjbGllbnQtdHlwZSJdOworCisgICAgICBpZiAoY2xpZW50VHlwZSA9PSAicmVndWxhciIpIHsKKworICAgICAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09ICJjb25jdXJyZW50IikgeworCisgICAgICB9IGVsc2UgeworCisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gY2xpZW50IHR5cGUgIiArIGNsaWVudFR5cGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWFyZ3NbIndvcmtlcnMiXS5lbXB0eSgpKSB7CisgICAgICB3b3JrZXJDb3VudCA9IGF0b2koYXJnc1sid29ya2VycyJdLmNfc3RyKCkpOworICAgIH0KKworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICBjZXJyIDw8IHVzYWdlLnN0cigpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworCisgIC8vIERpc3BhdGNoZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKworICBpZiAocmVwbGF5UmVxdWVzdHMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisKKyAgICAvLyBUcmFuc3BvcnRzCisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOworICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOworICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOworCisgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKyAgICBURmlsZVByb2Nlc3NvciBmaWxlUHJvY2Vzc29yKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgZmlsZVRyYW5zcG9ydCk7CisKKyAgICBmaWxlUHJvY2Vzc29yLnByb2Nlc3MoMCwgdHJ1ZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGlmIChydW5TZXJ2ZXIpIHsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisKKyAgICAvLyBUcmFuc3BvcnQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKworICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworCisgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKyAgICBpZiAobG9nUmVxdWVzdHMpIHsKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKKyAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOworCisgICAgICB0cmFuc3BvcnRGYWN0b3J5CisgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOworCisgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKKworICAgICAgc2VydmVyLnJlc2V0KAorICAgICAgICAgIG5ldyBUU2ltcGxlU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisKKyAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgeworCisgICAgICBzZXJ2ZXIucmVzZXQoCisgICAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworCisgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKKworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworCisgICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFN0YXJ0T2JzZXJ2ZXI+IG9ic2VydmVyKG5ldyBUU3RhcnRPYnNlcnZlcik7CisgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIob2JzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzZXJ2ZXIpOworCisgICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCBlbmRsOworCisgICAgc2VydmVyVGhyZWFkLT5zdGFydCgpOworICAgIG9ic2VydmVyLT53YWl0Rm9yU2VydmljZSgpOworCisgICAgLy8gSWYgd2UgYXJlbid0IHJ1bm5pbmcgY2xpZW50cywganVzdCB3YWl0IGZvcmV2ZXIgZm9yIGV4dGVybmFsIGNsaWVudHMKKyAgICBpZiAoY2xpZW50Q291bnQgPT0gMCkgeworICAgICAgc2VydmVyVGhyZWFkLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgaWYgKGNsaWVudENvdW50ID4gMCkgeyAvL0ZJWE1FOiBzdGFydCBoZXJlIGZvciBjbGllbnQgdHlwZT8KKworICAgIE1vbml0b3IgbW9uaXRvcjsKKworICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7CisKKyAgICBzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOworCisgICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9WT0lEOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9CeXRlIikgeworICAgICAgbG9vcFR5cGUgPSBUX0JZVEU7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9JMzI7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9JNjQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob1N0cmluZyIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9TVFJJTkc7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIgKyBjYWxsTmFtZSk7CisgICAgfQorCisgICAgaWYoY2xpZW50VHlwZSA9PSAicmVndWxhciIpIHsKKyAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgeworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworCisgICAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgICAgIG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSwgT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpKSkpOworICAgICAgfQorICAgIH0gZWxzZSBpZihjbGllbnRUeXBlID09ICJjb25jdXJyZW50IikgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKKyAgICAgIC8vc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ29uY3VycmVudENsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNvbmN1cnJlbnRDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHNvY2tldC0+b3BlbigpOworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CisgICAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgICAgIG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSwgRG9udE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgdGhyZWFkKyspIHsKKyAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWUwMDsKKyAgICBpbnQ2NF90IHRpbWUwMTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgICAgdGhyZWFkQ291bnQgPSBjbGllbnRDb3VudDsKKworICAgICAgY2VyciA8PCAiTGF1bmNoICIgPDwgY2xpZW50Q291bnQgPDwgIiAiIDw8IGNsaWVudFR5cGUgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKKworICAgICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKKworICAgICAgd2hpbGUgKHRocmVhZENvdW50ID4gMCkgeworICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKKyAgICBpbnQ2NF90IGxhc3RUaW1lID0gMDsKKworICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7CisgICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOworICAgIGludDY0X3QgbWF4VGltZSA9IDA7CisKKyAgICBmb3IgKHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CisKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAorICAgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKworICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7CisKKyAgICAgIGFzc2VydChkZWx0YSA+IDApOworCisgICAgICBpZiAoY2xpZW50LT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7CisgICAgICAgIGZpcnN0VGltZSA9IGNsaWVudC0+X3N0YXJ0VGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNsaWVudC0+X2VuZFRpbWUgPiBsYXN0VGltZSkgeworICAgICAgICBsYXN0VGltZSA9IGNsaWVudC0+X2VuZFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKKyAgICAgICAgbWluVGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7CisgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKKyAgICAgIH0KKworICAgICAgYXZlcmFnZVRpbWUgKz0gZGVsdGE7CisgICAgfQorCisgICAgYXZlcmFnZVRpbWUgLz0gY2xpZW50Q291bnQ7CisKKyAgICBjb3V0IDw8ICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudAorICAgICAgICAgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKKworICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOworICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBjb3VudC5iZWdpbigpOyBpdGVyICE9IGNvdW50LmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHByaW50ZigiJXMgPT4gJWRcbiIsIGl0ZXItPmZpcnN0LCBpdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBjZXJyIDw8ICJkb25lLiIgPDwgZW5kbDsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDNlZDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKQEAgLTAsMCArMSw1NDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgorCisjaW5jbHVkZSAiU2VydmljZS5oIgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKwordXNpbmcgbmFtZXNwYWNlIHRlc3Q6OnN0cmVzczsKKworc3RydWN0IGVxc3RyIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsgfQorfTsKKworc3RydWN0IGx0c3RyIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOyB9Cit9OworCisvLyB0eXBlZGVmIGhhc2hfbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGhhc2g8Y29uc3QgY2hhcio+LCBlcXN0cj4gY291bnRfbWFwOwordHlwZWRlZiBtYXA8Y29uc3QgY2hhciosIGludCwgbHRzdHI+IGNvdW50X21hcDsKKworY2xhc3MgU2VydmVyIDogcHVibGljIFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIFNlcnZlcigpIHt9CisKKyAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKKyAgICBHdWFyZCBtKGxvY2tfKTsKKyAgICBpbnQgY3QgPSBjb3VudHNfW21ldGhvZF07CisgICAgY291bnRzX1ttZXRob2RdID0gKytjdDsKKyAgfQorCisgIHZvaWQgZWNob1ZvaWQoKSB7CisgICAgY291bnQoImVjaG9Wb2lkIik7CisgICAgLy8gU2xlZXAgdG8gc2ltdWxhdGUgd29yaworICAgIFRIUklGVF9TTEVFUF9VU0VDKDEpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvdW50X21hcCBnZXRDb3VudCgpIHsKKyAgICBHdWFyZCBtKGxvY2tfKTsKKyAgICByZXR1cm4gY291bnRzXzsKKyAgfQorCisgIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIGFyZykgeworICAgIGlmIChhcmcgIT0gImhlbGxvIikgeworICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HICglcykhISEhIiwgYXJnLmNfc3RyKCkpOworICAgIH0KKyAgICBvdXQgPSBhcmc7CisgIH0KKyAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4mIG91dCwgY29uc3Qgc2V0PGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4mIG91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorCitwcml2YXRlOgorICBjb3VudF9tYXAgY291bnRzXzsKKyAgTXV0ZXggbG9ja187Cit9OworCitjbGFzcyBDbGllbnRUaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgeworcHVibGljOgorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsCisgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAorICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCisgICAgICAgICAgICAgICBUVHlwZSBsb29wVHlwZSkKKyAgICA6IF90cmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIF9jbGllbnQoY2xpZW50KSwKKyAgICAgIF9tb25pdG9yKG1vbml0b3IpLAorICAgICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKKyAgICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKKyAgICAgIF9sb29wVHlwZShsb29wVHlwZSkge30KKworICB2b2lkIHJ1bigpIHsKKworICAgIC8vIFdhaXQgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBzdGFydAorCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgd2hpbGUgKF93b3JrZXJDb3VudCA9PSAwKSB7CisgICAgICAgIF9tb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKKworICAgIHN3aXRjaCAoX2xvb3BUeXBlKSB7CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBsb29wRWNob1ZvaWQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgbG9vcEVjaG9CeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTMyOgorICAgICAgbG9vcEVjaG9JMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JNjQ6CisgICAgICBsb29wRWNob0k2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGxvb3BFY2hvU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgX3RyYW5zcG9ydC0+Y2xvc2UoKTsKKworICAgIF9kb25lID0gdHJ1ZTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgICAgX3dvcmtlckNvdW50LS07CisKKyAgICAgIGlmIChfd29ya2VyQ291bnQgPT0gMCkgeworCisgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9Wb2lkKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBfY2xpZW50LT5lY2hvVm9pZCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9CeXRlKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBpbnQ4X3QgYXJnID0gMTsKKyAgICAgIGludDhfdCByZXN1bHQ7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvQnl0ZShhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9JMzIoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIGludDMyX3QgYXJnID0gMTsKKyAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0kzMihhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9JNjQoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIGludDY0X3QgYXJnID0gMTsKKyAgICAgIGludDY0X3QgcmVzdWx0OworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHZvaWQgbG9vcEVjaG9TdHJpbmcoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIHN0cmluZyBhcmcgPSAiaGVsbG8iOworICAgICAgc3RyaW5nIHJlc3VsdDsKKyAgICAgIF9jbGllbnQtPmVjaG9TdHJpbmcocmVzdWx0LCBhcmcpOworICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKKyAgTW9uaXRvciYgX21vbml0b3I7CisgIHNpemVfdCYgX3dvcmtlckNvdW50OworICBzaXplX3QgX2xvb3BDb3VudDsKKyAgVFR5cGUgX2xvb3BUeXBlOworICBpbnQ2NF90IF9zdGFydFRpbWU7CisgIGludDY0X3QgX2VuZFRpbWU7CisgIGJvb2wgX2RvbmU7CisgIE1vbml0b3IgX3NsZWVwOworfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisKKyAgaW50IHBvcnQgPSA5MDkxOworICBzdHJpbmcgc2VydmVyVHlwZSA9ICJzaW1wbGUiOworICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7CisgIHVpbnQzMl90IHdvcmtlckNvdW50ID0gNDsKKyAgdWludDMyX3QgY2xpZW50Q291bnQgPSAyMDsKKyAgdWludDMyX3QgbG9vcENvdW50ID0gMTAwMDsKKyAgVFR5cGUgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJlY2hvVm9pZCI7CisgIGJvb2wgcnVuU2VydmVyID0gdHJ1ZTsKKyAgYm9vbCBsb2dSZXF1ZXN0cyA9IGZhbHNlOworICBzdHJpbmcgcmVxdWVzdExvZ1BhdGggPSAiLi9yZXF1ZXN0bG9nLnRsb2ciOworICBib29sIHJlcGxheVJlcXVlc3RzID0gZmFsc2U7CisKKyAgb3N0cmluZ3N0cmVhbSB1c2FnZTsKKworICB1c2FnZSA8PCBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiAiCisgICAgICAgICAgICJzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdGhlbHAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgdGV4dC4iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIgorICAgICAgICA8PCBsb29wQ291bnQgPDwgZW5kbCA8PCAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIKKyAgICAgICAgPDwgZW5kbCA8PCAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgc2VydmVyVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIgorICAgICAgICA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cworICAgICAgICA8PCBlbmRsIDw8ICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgPDwgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudAorICAgICAgICA8PCBlbmRsOworCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gYXJnczsKKworICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgeworCisgICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7CisKKyAgICBpZiAoYXJnLmNvbXBhcmUoMCwgMiwgIi0tIikgPT0gMCkgeworCisgICAgICBzaXplX3QgZW5kID0gYXJnLmZpbmRfZmlyc3Rfb2YoIj0iLCAyKTsKKworICAgICAgc3RyaW5nIGtleSA9IHN0cmluZyhhcmcsIDIsIGVuZCAtIDIpOworCisgICAgICBpZiAoZW5kICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBhcmdzW2tleV0gPSBzdHJpbmcoYXJnLCBlbmQgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ3Nba2V5XSA9ICJ0cnVlIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIgKyBhcmcpOworICAgIH0KKyAgfQorCisgIHRyeSB7CisKKyAgICBpZiAoIWFyZ3NbImNsaWVudHMiXS5lbXB0eSgpKSB7CisgICAgICBjbGllbnRDb3VudCA9IGF0b2koYXJnc1siY2xpZW50cyJdLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICghYXJnc1siaGVscCJdLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImxvb3AiXS5lbXB0eSgpKSB7CisgICAgICBsb29wQ291bnQgPSBhdG9pKGFyZ3NbImxvb3AiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImNhbGwiXS5lbXB0eSgpKSB7CisgICAgICBjYWxsTmFtZSA9IGFyZ3NbImNhbGwiXTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInBvcnQiXS5lbXB0eSgpKSB7CisgICAgICBwb3J0ID0gYXRvaShhcmdzWyJwb3J0Il0uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJzZXJ2ZXIiXS5lbXB0eSgpKSB7CisgICAgICBydW5TZXJ2ZXIgPSBhcmdzWyJzZXJ2ZXIiXSA9PSAidHJ1ZSI7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJsb2ctcmVxdWVzdCJdLmVtcHR5KCkpIHsKKyAgICAgIGxvZ1JlcXVlc3RzID0gYXJnc1sibG9nLXJlcXVlc3QiXSA9PSAidHJ1ZSI7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJyZXBsYXktcmVxdWVzdCJdLmVtcHR5KCkpIHsKKyAgICAgIHJlcGxheVJlcXVlc3RzID0gYXJnc1sicmVwbGF5LXJlcXVlc3QiXSA9PSAidHJ1ZSI7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJzZXJ2ZXItdHlwZSJdLmVtcHR5KCkpIHsKKyAgICAgIHNlcnZlclR5cGUgPSBhcmdzWyJzZXJ2ZXItdHlwZSJdOworICAgIH0KKworICAgIGlmICghYXJnc1sid29ya2VycyJdLmVtcHR5KCkpIHsKKyAgICAgIHdvcmtlckNvdW50ID0gYXRvaShhcmdzWyJ3b3JrZXJzIl0uY19zdHIoKSk7CisgICAgfQorCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOworICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisKKyAgLy8gRGlzcGF0Y2hlcgorICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworCisgIGlmIChyZXBsYXlSZXF1ZXN0cykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKworICAgIC8vIFRyYW5zcG9ydHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CisgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CisgICAgZmlsZVRyYW5zcG9ydC0+c2Vla1RvRW5kKCk7CisKKyAgICAvLyBQcm90b2NvbCBGYWN0b3J5CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKworICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKKworICAgIGZpbGVQcm9jZXNzb3IucHJvY2VzcygwLCB0cnVlKTsKKyAgICBleGl0KDApOworICB9CisKKyAgaWYgKHJ1blNlcnZlcikgeworCisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKworICAgIC8vIFByb3RvY29sIEZhY3RvcnkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworCisgICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgICBpZiAobG9nUmVxdWVzdHMpIHsKKyAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKKyAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOworCisgICAgICB0cmFuc3BvcnRGYWN0b3J5CisgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IG5iU29ja2V0MTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IG5iU29ja2V0MjsKKworICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7CisKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MikpKTsKKworICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CisKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKworICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisgICAgICBuYlNvY2tldDEucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIG5iU29ja2V0Mi5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCArIDEpKTsKKyAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDIsIHRocmVhZE1hbmFnZXIpKSk7CisgICAgfQorCisgICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCAiIGFuZCAiIDw8IChwb3J0ICsgMSkgPDwgZW5kbDsKKyAgICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisgICAgc2VydmVyVGhyZWFkMi0+c3RhcnQoKTsKKworICAgIC8vIElmIHdlIGFyZW4ndCBydW5uaW5nIGNsaWVudHMsIGp1c3Qgd2FpdCBmb3JldmVyIGZvciBleHRlcm5hbCBjbGllbnRzCisKKyAgICBpZiAoY2xpZW50Q291bnQgPT0gMCkgeworICAgICAgc2VydmVyVGhyZWFkLT5qb2luKCk7CisgICAgICBzZXJ2ZXJUaHJlYWQyLT5qb2luKCk7CisgICAgfQorICB9CisgIFRIUklGVF9TTEVFUF9TRUMoMSk7CisKKyAgaWYgKGNsaWVudENvdW50ID4gMCkgeworCisgICAgTW9uaXRvciBtb25pdG9yOworCisgICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKKworICAgIHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CisKKyAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeworICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7CisgICAgICBsb29wVHlwZSA9IFRfQllURTsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeworICAgICAgbG9vcFR5cGUgPSBUX0kzMjsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeworICAgICAgbG9vcFR5cGUgPSBUX0k2NDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeworICAgICAgbG9vcFR5cGUgPSBUX1NUUklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIiArIGNhbGxOYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgeworCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0ICsgKGl4ICUgMikpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKworICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgIG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7CisgICAgfQorCisgICAgZm9yIChzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIHRocmVhZCsrKSB7CisgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lMDA7CisgICAgaW50NjRfdCB0aW1lMDE7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKyAgICAgIHRocmVhZENvdW50ID0gY2xpZW50Q291bnQ7CisKKyAgICAgIGNlcnIgPDwgIkxhdW5jaCAiIDw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7CisKKyAgICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7CisKKyAgICAgIHdoaWxlICh0aHJlYWRDb3VudCA+IDApIHsKKyAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICB9CisKKyAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgfQorCisgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBsYXN0VGltZSA9IDA7CisKKyAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOworICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKKyAgICBpbnQ2NF90IG1heFRpbWUgPSAwOworCisgICAgZm9yIChzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgaXgrKykgeworCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKKyAgICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CisKKyAgICAgIGludDY0X3QgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOworCisgICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKKworICAgICAgaWYgKGNsaWVudC0+X3N0YXJ0VGltZSA8IGZpcnN0VGltZSkgeworICAgICAgICBmaXJzdFRpbWUgPSBjbGllbnQtPl9zdGFydFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmIChjbGllbnQtPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKKyAgICAgICAgbGFzdFRpbWUgPSBjbGllbnQtPl9lbmRUaW1lOworICAgICAgfQorCisgICAgICBpZiAoZGVsdGEgPCBtaW5UaW1lKSB7CisgICAgICAgIG1pblRpbWUgPSBkZWx0YTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbHRhID4gbWF4VGltZSkgeworICAgICAgICBtYXhUaW1lID0gZGVsdGE7CisgICAgICB9CisKKyAgICAgIGF2ZXJhZ2VUaW1lICs9IGRlbHRhOworICAgIH0KKworICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OworCisgICAgY291dCA8PCAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQKKyAgICAgICAgIDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7CisKKyAgICBjb3VudF9tYXAgY291bnQgPSBzZXJ2aWNlSGFuZGxlci0+Z2V0Q291bnQoKTsKKyAgICBjb3VudF9tYXA6Oml0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gY291bnQuYmVnaW4oKTsgaXRlciAhPSBjb3VudC5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGYoIiVzID0+ICVkXG4iLCBpdGVyLT5maXJzdCwgaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgY2VyciA8PCAiZG9uZS4iIDw8IGVuZGw7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcAppbmRleCA4OTcxNTNhLi44OWYzZmQxIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLyoKK++7vy8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE3LDc5ICsxNywzMzYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4gLy8gPGV2ZW50Lmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS9yYW5kb21fZGV2aWNlLmhwcD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJTZWNvbmRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCi0vL2V4dGVybiB1aW50MzJfdCBnX3NvY2tldF9zeXNjYWxsczsKLQogLy8gQ3VycmVudCB0aW1lLCBtaWNyb3NlY29uZHMgc2luY2UgdGhlIGVwb2NoCi11aW50NjRfdCBub3coKQotewordWludDY0X3Qgbm93KCkgewogICBpbnQ2NF90IHJldDsKICAgc3RydWN0IHRpbWV2YWwgdHY7CiAKLSAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnR2LCBOVUxMKTsKICAgcmV0ID0gdHYudHZfc2VjOwotICByZXQgPSByZXQqMTAwMCoxMDAwICsgdHYudHZfdXNlYzsKKyAgcmV0ID0gcmV0ICogMTAwMCAqIDEwMDAgKyB0di50dl91c2VjOwogICByZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCB0ZXN0U3RyaW5nX2NsaWVudFJldHVybihldmVudF9iYXNlKiBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRlc3ROciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgeworICB0cnkgeworICAgIHN0cmluZyBzOworICAgIGNsaWVudC0+cmVjdl90ZXN0U3RyaW5nKHMpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAidGVzdCIgPDwgdGVzdE5yOworICAgIGNvbnN0IGJvb2wgb2sgPSAocyA9PSBvcy5zdHIoKSk7CisgICAgY291dCA8PCAidGVzdFN0cmluZzogIiA8PCBzIDw8ICIgIiA8PCAoKG9rKSA/ICJvayIgOiAiZmFpbGVkIikgPDwgZW5kbDsKKyAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZXhuKSB7CisgICAgY291dCA8PCAiRXJyb3I6ICIgPDwgZXhuLndoYXQoKSA8PCBlbmRsOworICB9CisKKyAgaWYgKHRlc3ROciA9PSA5KQorICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGJhc2UpOyAvLyBlbmQgdGVzdAorfQorCitzdGF0aWMgdm9pZCB0ZXN0Vm9pZF9jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7CisgIHRyeSB7CisgICAgY2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CisgICAgY291dCA8PCAidGVzdFZvaWQiIDw8IGVuZGw7CisKKyAgICBmb3IgKGludCB0ZXN0TnIgPSAwOyB0ZXN0TnIgPCAxMDsgKyt0ZXN0TnIpIHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJ0ZXN0IiA8PCB0ZXN0TnI7CisgICAgICBjbGllbnQtPnRlc3RTdHJpbmcoc3RkOjpiaW5kKHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpKTsKKyAgICB9CisgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgeworICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKKyAgfQorfQorCisvLyBXb3JrYXJvdW5kIGZvciBhYnNlbnNlIG9mIEMrKzExICJhdXRvIiBrZXl3b3JkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHByaW50X2VxKFQgZXhwZWN0ZWQsIFQgYWN0dWFsKSB7CisgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgeworICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEJBU0VUWVBFX0lERU5USVRZX1RFU1QoZnVuYywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvdXQgPDwgI2Z1bmMgIigiIDw8IHZhbHVlIDw8ICIpID0gIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwcmludF9lcSh2YWx1ZSwgdGVzdENsaWVudC5mdW5jKHZhbHVlKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeik7CisKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9TVFJVQ1RTID0gMjsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBjb3V0LnByZWNpc2lvbigxOSk7CisKKyAgc3RyaW5nIHRlc3REaXIgID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5zdHJpbmcoKTsKKyAgc3RyaW5nIGNhUGF0aCAgID0gdGVzdERpciArICIva2V5cy9DQS5wZW0iOworICBzdHJpbmcgY2VydFBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5jcnQiOworICBzdHJpbmcga2V5UGF0aCAgPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5rZXkiOworCisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CiAgIGludCBwb3J0ID0gOTA5MDsKICAgaW50IG51bVRlc3RzID0gMTsKLSAgYm9vbCBmcmFtZWQgPSBmYWxzZTsKKyAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB6bGliID0gZmFsc2U7CisgIHN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CisgIHN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CisgIHN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgIGJvb2wgYWJzdHJhY3RfbmFtZXNwYWNlID0gZmFsc2U7CisgIGJvb2wgbm9pbnNhbmUgPSBmYWxzZTsKIAotICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSkgewotICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi1oIikgPT0gMCkgewotICAgICAgY2hhciogcGNoID0gc3RydG9rKGFyZ3ZbKytpXSwgIjoiKTsKLSAgICAgIGlmIChwY2ggIT0gTlVMTCkgewotICAgICAgICBob3N0ID0gc3RyaW5nKHBjaCk7CisgIGludCByZXR1cm5fY29kZSA9IDA7CisKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKKyAgZGVzYy5hZGRfb3B0aW9ucygpCisgICAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCisgICAgICAoImhvc3QiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmhvc3QpLT5kZWZhdWx0X3ZhbHVlKGhvc3QpLAorICAgICAgICAgICJIb3N0IHRvIGNvbm5lY3QiKQorICAgICAgKCJwb3J0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwKKyAgICAgICAgICAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpCisgICAgICAoImRvbWFpbi1zb2NrZXQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLAorICAgICAgICAgICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQorICAgICAgKCJhYnN0cmFjdC1uYW1lc3BhY2UiLAorICAgICAgICAgICJMb29rIGZvciB0aGUgZG9tYWluIHNvY2tldCBpbiB0aGUgQWJzdHJhY3QgTmFtZXNwYWNlIgorICAgICAgICAgICIgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKQorICAgICAgKCJ0cmFuc3BvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksCisgICAgICAgICAgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwLCB6bGliIikKKyAgICAgICgicHJvdG9jb2wiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLAorICAgICAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaCwgbXVsdGlqIikKKyAgICAgICgic3NsIiwKKyAgICAgICAgICAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQorICAgICAgKCJ6bGliIiwKKyAgICAgICAgICAiV3JhcCBUcmFuc3BvcnQgd2l0aCBabGliIikKKyAgICAgICgidGVzdGxvb3BzLG4iLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJm51bVRlc3RzKS0+ZGVmYXVsdF92YWx1ZShudW1UZXN0cyksCisgICAgICAgICAgIk51bWJlciBvZiBUZXN0cyIpCisgICAgICAoIm5vaW5zYW5lIiwKKyAgICAgICAgICAiRG8gbm90IHJ1biBpbnNhbml0eSB0ZXN0Iik7CisKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFyaWFibGVzX21hcCB2bTsKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6c3RvcmUoYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7CisgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om5vdGlmeSh2bSk7CisKKyAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKKyAgICBjb3V0IDw8IGRlc2MgPDwgZW5kbDsKKyAgICByZXR1cm4gRVJSX1VOS05PV047CisgIH0KKworICB0cnkgeworICAgIGlmICghcHJvdG9jb2xfdHlwZS5lbXB0eSgpKSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIgKyBwcm90b2NvbF90eXBlKTsKICAgICAgIH0KLSAgICAgIHBjaCA9IHN0cnRvayhOVUxMLCAiOiIpOwotICAgICAgaWYgKHBjaCAhPSBOVUxMKSB7Ci0gICAgICAgIHBvcnQgPSBhdG9pKHBjaCk7CisgICAgfQorCisgICAgaWYgKCF0cmFuc3BvcnRfdHlwZS5lbXB0eSgpKSB7CisgICAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImJ1ZmZlcmVkIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImV2aHR0cCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gInpsaWIiKSB7CisgICAgICAgIC8vIGNyb3NzdGVzdCB3aWxsIHBhc3MgemxpYiBhcyBhIHRyYW5zcG9ydCBhbmQgYXMgYSBmbGFnIHJpZ2h0IG5vdy4uCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIgKyB0cmFuc3BvcnRfdHlwZSk7CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1uIikgPT0gMCkgewotICAgICAgbnVtVGVzdHMgPSBhdG9pKGFyZ3ZbKytpXSk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1mIikgPT0gMCkgewotICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgfSBjYXRjaCAoZXhjZXB0aW9uJiBlKSB7CisgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOworICAgIGNvdXQgPDwgZGVzYyA8PCBlbmRsOworICAgIHJldHVybiBFUlJfVU5LTk9XTjsKKyAgfQorCisgIGlmICh2bS5jb3VudCgic3NsIikpIHsKKyAgICBzc2wgPSB0cnVlOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJ6bGliIikpIHsKKyAgICB6bGliID0gdHJ1ZTsKKyAgfQorCisgIGlmICh2bS5jb3VudCgiYWJzdHJhY3QtbmFtZXNwYWNlIikpIHsKKyAgICBhYnN0cmFjdF9uYW1lc3BhY2UgPSB0cnVlOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJub2luc2FuZSIpKSB7CisgICAgbm9pbnNhbmUgPSB0cnVlOworICB9CisKKyAgLy8gVEhSSUZULTQxNjQ6IFRoZSBmYWN0b3J5IE1VU1Qgb3V0bGl2ZSBhbnkgc29ja2V0cyBpdCBjcmVhdGVzIGZvciBjb3JyZWN0IGJlaGF2aW9yIQorICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDI7ICAvLyBTZWNvbmRTZXJ2aWNlIGZvciBtdWx0aXBsZXhlZAorCisgIGlmIChzc2wpIHsKKyAgICBjb3V0IDw8ICJDbGllbnQgQ2VydGlmaWNhdGUgRmlsZTogIiA8PCBjZXJ0UGF0aCA8PCBlbmRsOworICAgIGNvdXQgPDwgIkNsaWVudCBLZXkgICAgICAgICBGaWxlOiAiIDw8IGtleVBhdGggPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJDQSAgICAgICAgICAgICAgICAgRmlsZTogIiA8PCBjYVBhdGggPDwgZW5kbDsKKworICAgIGZhY3RvcnkgPSBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgICBmYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgICBmYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjYVBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGtleVBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICAgIHNvY2tldCA9IGZhY3RvcnktPmNyZWF0ZVNvY2tldChob3N0LCBwb3J0KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgeworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQorICAgICAgcG9ydCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CiAgICAgfQogICB9CiAKLQotICBzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiB0cmFuc3BvcnQ7Ci0KLSAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOwotCi0gIGlmIChmcmFtZWQpIHsKLSAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICB0cmFuc3BvcnQgPSBmcmFtZWRTb2NrZXQ7CisgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJodHRwIikgPT0gMCkgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBDbGllbnQ+KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIik7CisgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuY29tcGFyZSgiZnJhbWVkIikgPT0gMCkgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfSBlbHNlIHsKLSAgICBzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICB0cmFuc3BvcnQgPSBidWZmZXJlZFNvY2tldDsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfQogCi0gIHNoYXJlZF9wdHI8IFRCaW5hcnlQcm90b2NvbFQ8VEJ1ZmZlckJhc2U+ID4gcHJvdG9jb2woCi0gICAgICBuZXcgVEJpbmFyeVByb3RvY29sVDxUQnVmZmVyQmFzZT4odHJhbnNwb3J0KSk7Ci0gIFRocmlmdFRlc3RDbGllbnRUPCBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiA+IHRlc3RDbGllbnQocHJvdG9jb2wpOworICBpZiAoemxpYikgeworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFpsaWJUcmFuc3BvcnQ+KHRyYW5zcG9ydCk7CisgIH0KKworICBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSlNPTlByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEhlYWRlclByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0KKworICBpZiAoYm9vc3Q6OnN0YXJ0c193aXRoKHByb3RvY29sX3R5cGUsICJtdWx0aSIpKSB7CisgIHByb3RvY29sMiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VE11bHRpcGxleGVkUHJvdG9jb2w+KHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpOworICAvLyB3ZSBkb24ndCBuZWVkIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgcHJvdG9jb2wgYW55IG1vcmUsIHNvLi4uCisgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJUaHJpZnRUZXN0Iik7CisgIH0KKworICAvLyBDb25uZWN0aW9uIGluZm8KKyAgY291dCA8PCAiQ29ubmVjdGluZyAoIiA8PCB0cmFuc3BvcnRfdHlwZSA8PCAiLyIgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKSB0bzogIjsKKyAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgIGNvdXQgPDwgJ0AnOworICB9CisgIGNvdXQgPDwgZG9tYWluX3NvY2tldDsKKyAgaWYgKHBvcnQgIT0gMCkgeworICAgIGNvdXQgPDwgaG9zdCA8PCAiOiIgPDwgcG9ydDsKKyAgfQorICBjb3V0IDw8IGVuZGw7CisKKyAgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImV2aHR0cCIpID09IDApIHsKKyAgICBldmVudF9iYXNlKiBiYXNlID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgICBjb3V0IDw8ICJMaWJldmVudCBWZXJzaW9uOiAiIDw8IGV2ZW50X2dldF92ZXJzaW9uKCkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJMaWJldmVudCBNZXRob2Q6ICIgPDwgZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGJhc2UpIDw8IGVuZGw7CisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMjAwMDAwMAorICAgIGNvdXQgPDwgIkxpYmV2ZW50IEZlYXR1cmVzOiAweCIgPDwgaGV4IDw8IGV2ZW50X2Jhc2VfZ2V0X2ZlYXR1cmVzKGJhc2UpIDw8IGVuZGw7CisjZW5kaWYKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCgKKyAgICAgICAgbmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QuY19zdHIoKSwgIi8iLCBob3N0LmNfc3RyKCksIHBvcnQsIGJhc2UpKTsKKyAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENvYkNsaWVudChjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkuZ2V0KCkpOworICAgIGNsaWVudC0+dGVzdFZvaWQoc3RkOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKKyAgICBldmVudF9iYXNlX2xvb3AoYmFzZSwgMCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBUaHJpZnRUZXN0Q2xpZW50IHRlc3RDbGllbnQocHJvdG9jb2wpOwogCiAgIHVpbnQ2NF90IHRpbWVfbWluID0gMDsKICAgdWludDY0X3QgdGltZV9tYXggPSAwOwpAQCAtMTAwLDE1ICszNTcsMTUgQEAKIAogICAgIHRyeSB7CiAgICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHByaW50ZigiQ29ubmVjdCBmYWlsZWQ6ICVzXG4iLCB0dHgud2hhdCgpKTsKLSAgICAgIGNvbnRpbnVlOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICJDb25uZWN0IGZhaWxlZDogIiA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDT05ORUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoIlRlc3QgIyVkLCBjb25uZWN0ICVzOiVkXG4iLCB0ZXN0KzEsIGhvc3QuY19zdHIoKSwgcG9ydCk7CisgICAgcHJpbnRmKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdCArIDEsIGhvc3QuY19zdHIoKSwgcG9ydCk7CiAKICAgICB1aW50NjRfdCBzdGFydCA9IG5vdygpOwogCkBAIC0xMTYsNTMgKzM3MywyMjUgQEAKICAgICAgKiBWT0lEIFRFU1QKICAgICAgKi8KICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Vm9pZCgpIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCgpIiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdFZvaWQoKTsKLSAgICAgIHByaW50ZigiID0gdm9pZFxuIik7Ci0gICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRheCkgewotICAgICAgcHJpbnRmKCIlc1xuIiwgdGF4LndoYXQoKSk7CisgICAgICBjb3V0IDw8ICIgPSB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAvLyBTdG9wIGhlcmUgaWYgdHJhbnNwb3J0IGdvdCBicm9rZW4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTVFJJTkcgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIgPDwgZmx1c2g7CiAgICAgc3RyaW5nIHM7CiAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsICJUZXN0Iik7Ci0gICAgcHJpbnRmKCIgPSBcIiVzXCJcbiIsIHMuY19zdHIoKSk7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CisgICAgaWYgKHMgIT0gIlRlc3QiKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNdWx0aXBsZXhlZCBwcm90b2NvbCAtIGNhbGwgYW5vdGhlciBzZXJ2aWNlIG1ldGhvZAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIFRocmlmdFRlc3QKKyAgICAvLworICAgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBTZWNvbmRTZXJ2aWNlQ2xpZW50IHNzYyhwcm90b2NvbDIpOworICAgIC8vIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4uLi4KKworICAgICAgICB0cnkgeworICAgICAgICAgIGNvdXQgPDwgInNlY29uZFNlcnZpY2Uuc2Vjb25kVGVzdFN0cmluZyhcImZvb1wiKSA9PiAiIDw8IGZsdXNoOworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzc2Muc2Vjb25kdGVzdFN0cmluZyhyZXN1bHQsICJmb28iKTsKKyAgICAgIGNvdXQgPDwgInsiIDw8IHJlc3VsdCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgICoqKiBGQUlMRUQgKioqICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU2NiApCisjZW5kaWYKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgIn17QWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIKKyAgICAgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIKKyAgICAgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiCisgICAgICAgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIgorICAgICAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIKKyAgICAgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiCisgICAgICAgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIgorICAgICAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIKKyAgICAgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIgorICAgICAgICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiCisgICAgICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIgorICAgICAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIKKyAgICAgICAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiCisgICAgICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIKKyAgICAgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIKKyAgICAgICAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIgorICAgICAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIKKyAgICAgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIKKyAgICAgICAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIKKyAgICAgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiCisgICAgICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIgorICAgICAgICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIKKyAgICAgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIgorICAgICAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiCisgICAgICAgICAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkIHN0cmluZzogIiA8PCBzdHIgPDwgIiBidXQgZ290OiAiIDw8IHMgPDwgZW5kbCA8PCAiQ0xFQVIiOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzdHJpbmcgc3RyKAorICAgICAgICAgICJxdW90ZTogXCIgYmFja3NsYXNoOiIKKyAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIgorICAgICAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIKKyAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcL1xiXG5cclx0IgorICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIKKyAgICAgICAgICAiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkNMRUFSIjsKKyAgICAgICAgOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQk9PTCBURVNUCisgICAgICovCisgICAgY291dCA8PCBib29sYWxwaGE7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgdHJ1ZSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogQllURSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0Qnl0ZSgxKSIpOwotICAgIHVpbnQ4X3QgdTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKDEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIChpbnQpdTgpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCk0Mik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktNDIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpMTI3KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS0xMjgpOwogCiAgICAgLyoqCiAgICAgICogSTMyIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RJMzIoLTEpIik7Ci0gICAgaW50MzJfdCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIGkzMik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIC0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIDE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMTkwMDAwMDEzKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKIAogICAgIC8qKgogICAgICAqIEk2NCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLSAgICBpbnQ2NF90IGk2NCA9IHRlc3RDbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjhMTCk7Ci0gICAgcHJpbnRmKCIgPSAlIlBSSWQ2NCJcbiIsIGk2NCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCkwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KTcwMDAwMDAwMDAwMDAwMDAxMjNMTCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOwogCiAgICAgLyoqCiAgICAgICogRE9VQkxFIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3REb3VibGUoLTUuMjA5ODUyMykiKTsKLSAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMpOwotICAgIHByaW50ZigiID0gJWxmXG4iLCBkdWIpOworICAgIC8vIENvbXBhcmluZyBkb3VibGUgdmFsdWVzIHdpdGggcGxhaW4gZXF1YWxpdHkgYmVjYXVzZSBUaHJpZnQgaGFuZGxlcyBmdWxsIHByZWNpc2lvbiBvZiBkb3VibGUKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIDAuMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMS4wKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC01LjIwOTg1MjMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDUzKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgNTMpICsgMSk7CisKKyAgICB0cnkgeworICAgICAgZG91YmxlIGV4cGVjdGVkID0gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAzMDcpOworICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOworICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAyOTIpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0yOTIpOworICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOworICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAtMzA3KSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCSU5BUlkgVEVTVAorICAgICAqLworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCAxMzEwNzMgJiYgIXJldHVybl9jb2RlOyApIHsKKyAgICAgIHJldHVybl9jb2RlIHw9IGJpbmFyeV90ZXN0KHRlc3RDbGllbnQsIGkpOworICAgICAgaWYgKGkgPiAwKSB7IGkgKj0gMjsgfSBlbHNlIHsgKytpOyB9CisgICAgfQorCiAKICAgICAvKioKICAgICAgKiBTVFJVQ1QgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgY291dCA8PCAidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIiA8PCBmbHVzaDsKICAgICBYdHJ1Y3Qgb3V0OwogICAgIG91dC5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CiAgICAgb3V0LmJ5dGVfdGhpbmcgPSAxOwpAQCAtMTcwLDE2ICs1OTksMjAgQEAKICAgICBvdXQuaTY0X3RoaW5nID0gLTU7CiAgICAgWHRydWN0IGluOwogICAgIHRlc3RDbGllbnQudGVzdFN0cnVjdChpbiwgb3V0KTsKLSAgICBwcmludGYoIiA9IHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifVxuIiwKKyAgICBwcmludGYoIiA9IHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9XG4iLAogICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcuY19zdHIoKSwKICAgICAgICAgICAgKGludClpbi5ieXRlX3RoaW5nLAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZyk7CisgICAgaWYgKGluICE9IG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgIGNvdXQgPDwgInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIgPDwgZmx1c2g7CiAgICAgWHRydWN0MiBvdXQyOwogICAgIG91dDIuYnl0ZV90aGluZyA9IDE7CiAgICAgb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CkBAIC0xODcsNDYgKzYyMCw4NSBAQAogICAgIFh0cnVjdDIgaW4yOwogICAgIHRlc3RDbGllbnQudGVzdE5lc3QoaW4yLCBvdXQyKTsKICAgICBpbiA9IGluMi5zdHJ1Y3RfdGhpbmc7Ci0gICAgcHJpbnRmKCIgPSB7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSwgJWR9XG4iLAorICAgIHByaW50ZigiID0geyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9XG4iLAogICAgICAgICAgICBpbjIuYnl0ZV90aGluZywKICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nLmNfc3RyKCksCiAgICAgICAgICAgIChpbnQpaW4uYnl0ZV90aGluZywKICAgICAgICAgICAgaW4uaTMyX3RoaW5nLAogICAgICAgICAgICBpbi5pNjRfdGhpbmcsCiAgICAgICAgICAgIGluMi5pMzJfdGhpbmcpOworICAgIGlmIChpbjIgIT0gb3V0MikgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBNQVAgVEVTVAogICAgICAqLwotICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG1hcG91dDsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwb3V0OwogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7ICsraSkgewotICAgICAgbWFwb3V0Lmluc2VydChtYWtlX3BhaXIoaSwgaS0xMCkpOworICAgICAgbWFwb3V0Lmluc2VydChtYWtlX3BhaXIoaSwgaSAtIDEwKSk7CiAgICAgfQotICAgIHByaW50ZigidGVzdE1hcCh7Iik7CisgICAgY291dCA8PCAidGVzdE1hcCh7IiA8PCBmbHVzaDsKICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKG1faXRlciA9IG1hcG91dC5iZWdpbigpOyBtX2l0ZXIgIT0gbWFwb3V0LmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBtYXBpbjsKKyAgICBjb3V0IDw8ICJ9KSI7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG1hcGluOwogICAgIHRlc3RDbGllbnQudGVzdE1hcChtYXBpbiwgbWFwb3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBpbi5iZWdpbigpOyBtX2l0ZXIgIT0gbWFwaW4uZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkID0+ICVkIiwgbV9pdGVyLT5maXJzdCwgbV9pdGVyLT5zZWNvbmQpOworICAgICAgY291dCA8PCBtX2l0ZXItPmZpcnN0IDw8ICIgPT4gIiA8PCBtX2l0ZXItPnNlY29uZDsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChtYXBpbiAhPSBtYXBvdXQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU1RSSU5HIE1BUCBURVNUCisgICAgICovCisgICAgY291dCA8PCAidGVzdFN0cmluZ01hcCh7YSA9PiAyLCBiID0+IGJsYWgsIHNvbWUgPT4gdGhpbmd9KSA9IHsiIDw8IGZsdXNoOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc21hcGluOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc21hcG91dDsKKyAgICBzbWFwaW5bImEiXSA9ICIyIjsKKyAgICBzbWFwaW5bImIiXSA9ICJibGFoIjsKKyAgICBzbWFwaW5bInNvbWUiXSA9ICJ0aGluZyI7CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdFN0cmluZ01hcChzbWFwb3V0LCBzbWFwaW4pOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNtYXBvdXQuYmVnaW4oKTsgaXQgIT0gc21hcG91dC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBjb3V0IDw8IGl0LT5maXJzdCA8PCAiID0+ICIgPDwgaXQtPnNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAoc21hcGluICE9IHNtYXBvdXQpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNFVCBURVNUCkBAIC0yMzUsMjIyICs3MDcsMzY3IEBACiAgICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgewogICAgICAgc2V0b3V0Lmluc2VydChpKTsKICAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0U2V0KHsiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U2V0KHsiIDw8IGZsdXNoOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKHNfaXRlciA9IHNldG91dC5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0b3V0LmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7CisgICAgY291dCA8PCAifSkiOwogICAgIHNldDxpbnQzMl90PiBzZXRpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RTZXQoc2V0aW4sIHNldG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0aW4uYmVnaW4oKTsgc19pdGVyICE9IHNldGluLmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOworICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKHNldGluICE9IHNldG91dCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBMSVNUIFRFU1QKICAgICAgKi8KLSAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKLSAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7Ci0gICAgICBsaXN0b3V0LnB1c2hfYmFjayhpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0TGlzdCh7Iik7Ci0gICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobF9pdGVyID0gbGlzdG91dC5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdG91dC5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgIGNvdXQgPDwgInRlc3RMaXN0KGVtcHR5KSIgPDwgZmx1c2g7CisgICAgdHJ5IHsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OworICAgICAgdGVzdENsaWVudC50ZXN0TGlzdChsaXN0b3V0LCB2ZWN0b3I8aW50MzJfdD4oKSk7CisgICAgICBpZiAoIWxpc3RvdXQuZW1wdHkoKSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgY291dCA8PCAiaW52YWxpZCBsZW5ndGg6ICIgPDwgbGlzdG91dC5zaXplKCkgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKLSAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdGluOwotICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdGluLCBsaXN0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaXN0aW4uYmVnaW4oKTsgbF9pdGVyICE9IGxpc3Rpbi5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgIHRyeSB7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gLTI7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgbGlzdG91dC5wdXNoX2JhY2soaSk7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgICBjb3V0IDw8ICJ0ZXN0TGlzdCh7IiA8PCBmbHVzaDsKKyAgICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgKmxfaXRlcjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0pIjsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CiAKICAgICAvKioKICAgICAgKiBFTlVNIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RFbnVtKE9ORSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShPTkUpIiA8PCBmbHVzaDsKICAgICBOdW1iZXJ6Ojp0eXBlIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6T05FKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpPTkUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVFdPKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUV08pOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OlRXTykgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKFRIUkVFKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKFRIUkVFKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUSFJFRSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6VEhSRUUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShGSVZFKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKEZJVkUpIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OkZJVkUpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OkZJVkUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShFSUdIVCkiIDw8IGZsdXNoOwogICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RUlHSFQpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OkVJR0hUKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRZUEVERUYgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgIGNvdXQgPDwgInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiIDw8IGZsdXNoOwogICAgIFVzZXJJZCB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0xMKTsKLSAgICBwcmludGYoIiA9ICUiUFJJZDY0IlxuIiwgdWlkKTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHVpZCA8PCBlbmRsOworICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTEwpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTkVTVEVEIE1BUCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgY291dCA8PCAidGVzdE1hcE1hcCgxKSIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+IG1tOwogICAgIHRlc3RDbGllbnQudGVzdE1hcE1hcChtbSwgMSk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+Ojpjb25zdF9pdGVyYXRvciBtaTsKICAgICBmb3IgKG1pID0gbW0uYmVnaW4oKTsgbWkgIT0gbW0uZW5kKCk7ICsrbWkpIHsKICAgICAgIHByaW50ZigiJWQgPT4geyIsIG1pLT5maXJzdCk7CiAgICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1pMjsKICAgICAgIGZvciAobWkyID0gbWktPnNlY29uZC5iZWdpbigpOyBtaTIgIT0gbWktPnNlY29uZC5lbmQoKTsgKyttaTIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiAlZCwgIiwgbWkyLT5maXJzdCwgbWkyLT5zZWNvbmQpOworICAgICAgICBjb3V0IDw8IG1pMi0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1pMi0+c2Vjb25kOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwKKyAgICAgICAgbW1bLTRdWy00XSAhPSAtNCB8fAorICAgICAgICBtbVstNF1bLTNdICE9IC0zIHx8CisgICAgICAgIG1tWy00XVstMl0gIT0gLTIgfHwKKyAgICAgICAgbW1bLTRdWy0xXSAhPSAtMSB8fAorICAgICAgICBtbVs0XVs0XSAhPSA0IHx8CisgICAgICAgIG1tWzRdWzNdICE9IDMgfHwKKyAgICAgICAgbW1bNF1bMl0gIT0gMiB8fAorICAgICAgICBtbVs0XVsxXSAhPSAxKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIElOU0FOSVRZIFRFU1QKICAgICAgKi8KLSAgICBJbnNhbml0eSBpbnNhbmU7Ci0gICAgaW5zYW5lLnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpGSVZFLCA1MDAwKSk7Ci0gICAgWHRydWN0IHRydWNrOwotICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7Ci0gICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7Ci0gICAgdHJ1Y2suaTMyX3RoaW5nID0gODsKLSAgICB0cnVjay5pNjRfdGhpbmcgPSA4OwotICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjayk7Ci0gICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+IHdob2E7Ci0gICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkod2hvYSwgaW5zYW5lKTsKLSAgICBwcmludGYoIiA9IHsiKTsKLSAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOwotICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJSJQUklkNjQiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKLSAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKLSAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7Ci0gICAgICAgICAgIGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gICAgICAgICAgICsraTJfaXRlcikgewotICAgICAgICBwcmludGYoIiVkID0+IHsiLCBpMl9pdGVyLT5maXJzdCk7Ci0gICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKLSAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgZm9yICh1bSA9IHVzZXJNYXAuYmVnaW4oKTsgdW0gIT0gdXNlck1hcC5lbmQoKTsgKyt1bSkgewotICAgICAgICAgIHByaW50ZigiJWQgPT4gJSJQUklkNjQiLCAiLCB1bS0+Zmlyc3QsIHVtLT5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgaWYgKCFub2luc2FuZSkgeworICAgICAgSW5zYW5pdHkgaW5zYW5lOworICAgICAgaW5zYW5lLnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpGSVZFLCA1KSk7CisgICAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkVJR0hULCA4KSk7CisgICAgICBYdHJ1Y3QgdHJ1Y2s7CisgICAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDQ7CisgICAgICB0cnVjay5pMzJfdGhpbmcgPSA0OworICAgICAgdHJ1Y2suaTY0X3RoaW5nID0gNDsKKyAgICAgIFh0cnVjdCB0cnVjazI7CisgICAgICB0cnVjazIuc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICB0cnVjazIuYnl0ZV90aGluZyA9IDI7CisgICAgICB0cnVjazIuaTMyX3RoaW5nID0gMjsKKyAgICAgIHRydWNrMi5pNjRfdGhpbmcgPSAyOworICAgICAgaW5zYW5lLnh0cnVjdHMucHVzaF9iYWNrKHRydWNrKTsKKyAgICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjazIpOworICAgICAgY291dCA8PCAidGVzdEluc2FuaXR5KCkiIDw8IGZsdXNoOworICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IHdob2E7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eSh3aG9hLCBpbnNhbmUpOworICAgICAgY291dCA8PCAiID0geyI7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CisgICAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7IGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7ICsraTJfaXRlcikgeworICAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CisgICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOworICAgICAgICAgIGNvdXQgPDwgInsiOworICAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKKyAgICAgICAgICAgIGNvdXQgPDwgdW0tPmZpcnN0IDw8ICIgPT4gIiA8PCB1bS0+c2Vjb25kOworICAgICAgICAgIH0KKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOwogCi0gICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKLSAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7Ci0gICAgICAgIHByaW50ZigieyIpOwotICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0sICIsCi0gICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAoaW50KXgtPmJ5dGVfdGhpbmcsCi0gICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKLSAgICAgICAgICAgICAgICAgeC0+aTY0X3RoaW5nKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIn0iKTsKKyAgICAgICAgICB2ZWN0b3I8WHRydWN0PiB4dHJ1Y3RzID0gaTJfaXRlci0+c2Vjb25kLnh0cnVjdHM7CisgICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7CisgICAgICAgICAgY291dCA8PCAieyI7CisgICAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgeworICAgICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICAgICB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAoaW50KXgtPmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgIHgtPmk2NF90aGluZyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvdXQgPDwgIn0iOwogCi0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgICAgY291dCA8PCAifSwgIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDEgPSB3aG9hLmZpbmQoVXNlcklkKDEpKTsKKyAgICAgIGlmICh3aG9hLnNpemUoKSAhPSAyKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoaXQxID09IHdob2EuZW5kKCkpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MTIgPSBpdDEtPnNlY29uZC5maW5kKE51bWJlcno6OlRXTyk7CisgICAgICAgIGlmIChpdDEyID09IGl0MS0+c2Vjb25kLmVuZCgpIHx8IGl0MTItPnNlY29uZCAhPSBpbnNhbmUpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MTMgPSBpdDEtPnNlY29uZC5maW5kKE51bWJlcno6OlRIUkVFKTsKKyAgICAgICAgaWYgKGl0MTMgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQxMy0+c2Vjb25kICE9IGluc2FuZSkgeworICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaXQyID0gd2hvYS5maW5kKFVzZXJJZCgyKSk7CisgICAgICBpZiAoaXQyID09IHdob2EuZW5kKCkpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MjYgPSBpdDItPnNlY29uZC5maW5kKE51bWJlcno6OlNJWCk7CisgICAgICAgIGlmIChpdDI2ID09IGl0Mi0+c2Vjb25kLmVuZCgpIHx8IGl0MjYtPnNlY29uZCAhPSBJbnNhbml0eSgpKSB7CisgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICB9CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisKKyAgICAvKioKKyAgICAgKiBNVUxUSSBURVNUCisgICAgICovCisgICAgY291dCA8PCAidGVzdE11bHRpKCkiIDw8IGVuZGw7CisgICAgdHJ5IHsKKyAgICAgIG1hcDxpbnQxNl90LCBzdHJpbmc+IG11bF9tYXA7CisgICAgICBYdHJ1Y3QgbXVsX3Jlc3VsdDsKKyAgICAgIG11bF9tYXBbMV0gPSAiYmxhaCI7CisgICAgICBtdWxfbWFwWzJdID0gInRoaW5nIjsKKyAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpKG11bF9yZXN1bHQsIDQyLCA0MjQyLCA0MjQyNDIsIG11bF9tYXAsIE51bWJlcno6OkVJR0hULCBVc2VySWQoMjQpKTsKKyAgICAgIFh0cnVjdCB4eHM7CisgICAgICB4eHMuc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICB4eHMuYnl0ZV90aGluZyA9IDQyOworICAgICAgeHhzLmkzMl90aGluZyA9IDQyNDI7CisgICAgICB4eHMuaTY0X3RoaW5nID0gNDI0MjQyOworICAgICAgaWYgKG11bF9yZXN1bHQgIT0geHhzKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKIAotICAgIH0gY2F0Y2goWGNlcHRpb24mIGUpIHsKKyAgICB9IGNhdGNoIChYY2VwdGlvbiYgZSkgewogICAgICAgcHJpbnRmKCIgIHsldSwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZS5jX3N0cigpKTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+IiA8PCBmbHVzaDsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgY291dCA8PCAiICB2b2lkXG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworCisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKKyAgICAgIGNvdXQgPDwgIiAgQ2F1Z2h0IFRFeGNlcHRpb24iIDw8IGVuZGw7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iIDw8IGZsdXNoOwogICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJzdWNjZXNzIik7Ci0gICAgICBwcmludGYoIiAgdm9pZFxuIik7Ci0gICAgfSBjYXRjaCguLi4pIHsKLSAgICAgIHByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOworICAgICAgY291dCA8PCAiICB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgIH0KIAogICAgIC8qIHRlc3QgbXVsdGkgZXhjZXB0aW9uICovCiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKLSAgICAgIHByaW50ZigiICByZXN1bHRcbkZBSUxVUkVcbiIpOwotICAgIH0gY2F0Y2goWGNlcHRpb24mIGUpIHsKKyAgICAgIGNvdXQgPDwgIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0gY2F0Y2ggKFhjZXB0aW9uJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAiWGNlcHRpb24yIiwgInRlc3QgMiIpOwotICAgICAgcHJpbnRmKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICBjb3V0IDw8ICIgIHJlc3VsdFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKIAotICAgIH0gY2F0Y2goWGNlcHRpb24yJiBlKSB7CisgICAgfSBjYXRjaCAoWGNlcHRpb24yJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCB7XCIlc1wifX1cbiIsIGUuZXJyb3JDb2RlLCBlLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgInN1Y2Nlc3MiLCAidGVzdCAzIik7CiAgICAgICBwcmludGYoIiAge3tcIiVzXCJ9fVxuIiwgcmVzdWx0LnN0cmluZ190aGluZy5jX3N0cigpKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgcHJpbnRmKCIgIGV4Y2VwdGlvblxuRkFJTFVSRVxuIik7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgfQogCiAgICAgLyogdGVzdCBvbmV3YXkgdm9pZCAqLwogICAgIHsKLSAgICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMykgPT4iKTsKLSAgICAgICAgdWludDY0X3Qgc3RhcnRPbmV3YXkgPSBub3coKTsKLSAgICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOwotICAgICAgICB1aW50NjRfdCBlbGFwc2VkID0gbm93KCkgLSBzdGFydE9uZXdheTsKLSAgICAgICAgaWYgKGVsYXBzZWQgPiAyMDAgKiAxMDAwKSB7IC8vIDAuMiBzZWNvbmRzCi0gICAgICAgICAgICBwcmludGYoIiAgRkFJTFVSRSAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkLzEwMDAuMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkLzEwMDAuMCk7Ci0gICAgICAgIH0KKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIgPDwgZmx1c2g7CisgICAgICB1aW50NjRfdCBzdGFydE9uZXdheSA9IG5vdygpOworICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOworICAgICAgdWludDY0X3QgZWxhcHNlZCA9IG5vdygpIC0gc3RhcnRPbmV3YXk7CisgICAgICBpZiAoZWxhcHNlZCA+IDIwMCAqIDEwMDApIHsgLy8gMC4yIHNlY29uZHMKKyAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKiAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkIC8gMTAwMC4wKTsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkIC8gMTAwMC4wKTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ2NCwxNSArMTA4MSwxOCBAQAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7Ci0gICAgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOworICAgIGNvdXQgPDwgInJlLXRlc3QgdGVzdEkzMigtMSkiIDw8IGZsdXNoOworICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgaTMyIDw8IGVuZGw7CisgICAgaWYgKGkzMiAhPSAtMSkKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAKKyAgICBjb3V0IDw8IGVuZGwgPDwgIkFsbCB0ZXN0cyBkb25lLiIgPDwgZW5kbCA8PCBmbHVzaDsKIAogICAgIHVpbnQ2NF90IHN0b3AgPSBub3coKTsKLSAgICB1aW50NjRfdCB0b3QgPSBzdG9wLXN0YXJ0OworICAgIHVpbnQ2NF90IHRvdCA9IHN0b3AgLSBzdGFydDsKIAotICAgIHByaW50ZigiVG90YWwgdGltZTogJSJQUkl1NjQiIHVzXG4iLCBzdG9wLXN0YXJ0KTsKKyAgICBjb3V0IDw8ICJUb3RhbCB0aW1lOiAiIDw8IHN0b3AgLSBzdGFydCA8PCAiIHVzIiA8PCBlbmRsOwogCiAgICAgdGltZV90b3QgKz0gdG90OwogICAgIGlmICh0aW1lX21pbiA9PSAwIHx8IHRvdCA8IHRpbWVfbWluKSB7CkBAIC00ODIsMTcgKzExMDIsNzkgQEAKICAgICAgIHRpbWVfbWF4ID0gdG90OwogICAgIH0KIAorICAgIGNvdXQgPDwgZmx1c2g7CiAgICAgdHJhbnNwb3J0LT5jbG9zZSgpOwogICB9CiAKLSAgLy8gIHByaW50ZigiXG5Tb2NrZXQgc3lzY2FsbHM6ICV1IiwgZ19zb2NrZXRfc3lzY2FsbHMpOwotICBwcmludGYoIlxuQWxsIHRlc3RzIGRvbmUuXG4iKTsKIAogICB1aW50NjRfdCB0aW1lX2F2ZyA9IHRpbWVfdG90IC8gbnVtVGVzdHM7CiAKLSAgcHJpbnRmKCJNaW4gdGltZTogJSJQUkl1NjQiIHVzXG4iLCB0aW1lX21pbik7Ci0gIHByaW50ZigiTWF4IHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgdGltZV9tYXgpOwotICBwcmludGYoIkF2ZyB0aW1lOiAlIlBSSXU2NCIgdXNcbiIsIHRpbWVfYXZnKTsKKyAgY291dCA8PCAiTWluIHRpbWU6ICIgPDwgdGltZV9taW4gPDwgIiB1cyIgPDwgZW5kbDsKKyAgY291dCA8PCAiTWF4IHRpbWU6ICIgPDwgdGltZV9tYXggPDwgIiB1cyIgPDwgZW5kbDsKKyAgY291dCA8PCAiQXZnIHRpbWU6ICIgPDwgdGltZV9hdmcgPDwgIiB1cyIgPDwgZW5kbDsKIAotICByZXR1cm4gMDsKKyAgcmV0dXJuIHJldHVybl9jb2RlOworfQorCit2b2lkIGJpbmFyeV9maWxsKHN0ZDo6c3RyaW5nJiBzdHIsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYmluX2RhdGFbMjU2XQorICAgICAgICA9IHstMTI4LCAtMTI3LCAtMTI2LCAtMTI1LCAtMTI0LCAtMTIzLCAtMTIyLCAtMTIxLCAtMTIwLCAtMTE5LCAtMTE4LCAtMTE3LCAtMTE2LCAtMTE1LCAtMTE0LAorICAgICAgICAgICAtMTEzLCAtMTEyLCAtMTExLCAtMTEwLCAtMTA5LCAtMTA4LCAtMTA3LCAtMTA2LCAtMTA1LCAtMTA0LCAtMTAzLCAtMTAyLCAtMTAxLCAtMTAwLCAtOTksCisgICAgICAgICAgIC05OCwgIC05NywgIC05NiwgIC05NSwgIC05NCwgIC05MywgIC05MiwgIC05MSwgIC05MCwgIC04OSwgIC04OCwgIC04NywgIC04NiwgIC04NSwgIC04NCwKKyAgICAgICAgICAgLTgzLCAgLTgyLCAgLTgxLCAgLTgwLCAgLTc5LCAgLTc4LCAgLTc3LCAgLTc2LCAgLTc1LCAgLTc0LCAgLTczLCAgLTcyLCAgLTcxLCAgLTcwLCAgLTY5LAorICAgICAgICAgICAtNjgsICAtNjcsICAtNjYsICAtNjUsICAtNjQsICAtNjMsICAtNjIsICAtNjEsICAtNjAsICAtNTksICAtNTgsICAtNTcsICAtNTYsICAtNTUsICAtNTQsCisgICAgICAgICAgIC01MywgIC01MiwgIC01MSwgIC01MCwgIC00OSwgIC00OCwgIC00NywgIC00NiwgIC00NSwgIC00NCwgIC00MywgIC00MiwgIC00MSwgIC00MCwgIC0zOSwKKyAgICAgICAgICAgLTM4LCAgLTM3LCAgLTM2LCAgLTM1LCAgLTM0LCAgLTMzLCAgLTMyLCAgLTMxLCAgLTMwLCAgLTI5LCAgLTI4LCAgLTI3LCAgLTI2LCAgLTI1LCAgLTI0LAorICAgICAgICAgICAtMjMsICAtMjIsICAtMjEsICAtMjAsICAtMTksICAtMTgsICAtMTcsICAtMTYsICAtMTUsICAtMTQsICAtMTMsICAtMTIsICAtMTEsICAtMTAsICAtOSwKKyAgICAgICAgICAgLTgsICAgLTcsICAgLTYsICAgLTUsICAgLTQsICAgLTMsICAgLTIsICAgLTEsICAgMCwgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwKKyAgICAgICAgICAgNywgICAgOCwgICAgOSwgICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsCisgICAgICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LAorICAgICAgICAgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywgICA0OCwgICA0OSwgICA1MCwgICA1MSwKKyAgICAgICAgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsCisgICAgICAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLAorICAgICAgICAgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NiwgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwgICA5NSwgICA5NiwKKyAgICAgICAgICAgOTcsICAgOTgsICAgOTksICAgMTAwLCAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LCAgMTA5LCAgMTEwLCAgMTExLAorICAgICAgICAgICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsICAxMTcsICAxMTgsICAxMTksICAxMjAsICAxMjEsICAxMjIsICAxMjMsICAxMjQsICAxMjUsICAxMjYsCisgICAgICAgICAgIDEyN307CisKKyAgICBzdHIucmVzaXplKHNpeik7CisgICAgY2hhciAqcHRyID0gJnN0clswXTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzaXo7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChwb3MgPT0gMjU1KSB7IHBvcyA9IDA7IH0gZWxzZSB7ICsrcG9zOyB9CisgICAgICAgICpwdHIrKyA9IGJpbl9kYXRhW3Bvc107CisgICAgfQorfQorCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KQoreworICAgIHN0cmluZyBiaW5fcmVxdWVzdDsKKyAgICBzdHJpbmcgYmluX3Jlc3VsdDsKKworICAgIGNvdXQgPDwgInRlc3RCaW5hcnkoc2l6ID0gIiA8PCBzaXogPDwgIikiIDw8IGVuZGw7CisgICAgYmluYXJ5X2ZpbGwoYmluX3JlcXVlc3QsIHNpeik7CisgICAgdHJ5IHsKKyAgICAgICAgdGVzdENsaWVudC50ZXN0QmluYXJ5KGJpbl9yZXN1bHQsIGJpbl9yZXF1ZXN0KTsKKworICAgICAgICBpZiAoYmluX3JlcXVlc3Quc2l6ZSgpICE9IGJpbl9yZXN1bHQuc2l6ZSgpKSB7CisgICAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEOiByZXF1ZXN0IHNpemUgIiA8PCBiaW5fcmVxdWVzdC5zaXplKCkgPDwgIjsgcmVzdWx0IHNpemUgIiA8PCBiaW5fcmVzdWx0LnNpemUoKSA8PCBlbmRsOworICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChiaW5fcmVxdWVzdC5hdChpKSAhPSBiaW5fcmVzdWx0LmF0KGkpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogYXQgcG9zaXRpb24gIiA8PCBpIDw8ICIgcmVxdWVzdFtpXSBpcyBoIiA8PCBoZXggPDwgYmluX3JlcXVlc3QuYXQoaSkgPDwgIiByZXN1bHRbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXN1bHQuYXQoaSkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCmluZGV4IGQzMDQ3NWIuLjYyMjIwMTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKQEAgLTE3LDI4ICsxNyw1OSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiU2Vjb25kU2VydmljZS5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKIAorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzc3RyZWFtPgogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorCisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKQEAgLTQ2LDE5ICs3NywzMyBAQAogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKKwogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlc3RIYW5kbGVyKCkge30KIAotICB2b2lkIHRlc3RWb2lkKCkgewotICAgIHByaW50ZigidGVzdFZvaWQoKVxuIik7Ci0gIH0KKyAgdm9pZCB0ZXN0Vm9pZCgpIHsgcHJpbnRmKCJ0ZXN0Vm9pZCgpXG4iKTsgfQogCi0gIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgeworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAorICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKwogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKQEAgLTcwLDI3ICsxMTUsNDQgQEAKICAgfQogCiAgIGludDY0X3QgdGVzdEk2NChjb25zdCBpbnQ2NF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0STY0KCUiUFJJZDY0IilcbiIsIHRoaW5nKTsKKyAgICBwcmludGYoInRlc3RJNjQoJSIgUFJJZDY0ICIpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgZG91YmxlIHRlc3REb3VibGUoY29uc3QgZG91YmxlIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0RG91YmxlKCVsZilcbiIsIHRoaW5nKTsKKyAgICBwcmludGYoInRlc3REb3VibGUoJWYpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSlcbiIsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaGV4c3RyOworICAgIGhleHN0ciA8PCBzdGQ6OmhleCA8PCB0aGluZzsKKyAgICBwcmludGYoInRlc3RCaW5hcnkoJWx1OiAlcylcbiIsIHNhZmVfbnVtZXJpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHRoaW5nLnNpemUoKSksIGhleHN0ci5zdHIoKS5jX3N0cigpKTsKKyAgICBfcmV0dXJuID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0pXG4iLAorICAgICAgICAgICB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgKGludCl0aGluZy5ieXRlX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgewotICAgIGNvbnN0IFh0cnVjdCAmdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKLSAgICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb25zdCBYdHJ1Y3QmIHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CisgICAgcHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH0pXG4iLAorICAgICAgICAgICAoaW50KW5lc3QuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgIChpbnQpdGhpbmcuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcsCisgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nKTsKICAgICBvdXQgPSBuZXN0OwogICB9CiAKLSAgdm9pZCB0ZXN0TWFwKG1hcDxpbnQzMl90LCBpbnQzMl90PiAmb3V0LCBjb25zdCBtYXA8aW50MzJfdCwgaW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4mIG91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHByaW50ZigidGVzdE1hcCh7Iik7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMDYsNyArMTY4LDI0IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RNYXAoeyIpOworICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiJXMgPT4gJXMiLCAobV9pdGVyLT5maXJzdCkuY19zdHIoKSwgKG1faXRlci0+c2Vjb25kKS5jX3N0cigpKTsKKyAgICB9CisgICAgcHJpbnRmKCJ9KVxuIik7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTZXQoeyIpOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTIyLDcgKzIwMSw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RMaXN0KHsiKTsKICAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTE0NCw1MyArMjIzLDMzIEBACiAgIH0KIAogICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgeworICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+JiBtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKICAgICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbyk7CiAKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBwb3M7Ci0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbmVnOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBwb3M7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG5lZzsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSxpKSk7Ci0gICAgICBuZWcuaW5zZXJ0KG1ha2VfcGFpcigtaSwtaSkpOworICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSwgaSkpOworICAgICAgbmVnLmluc2VydChtYWtlX3BhaXIoLWksIC1pKSk7CiAgICAgfQogCiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoNCwgcG9zKSk7CiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoLTQsIG5lZykpOwotCiAgIH0KIAotICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIHsKKyAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+JiBpbnNhbmUsIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewogICAgIHByaW50ZigidGVzdEluc2FuaXR5KClcbiIpOwogCi0gICAgWHRydWN0IGhlbGxvOwotICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLQotICAgIFh0cnVjdCBnb29kYnllOwotICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7Ci0KLSAgICBJbnNhbml0eSBjcmF6eTsKLSAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RUlHSFQsIDgpKTsKLSAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhnb29kYnllKTsKLQogICAgIEluc2FuaXR5IGxvb25leTsKLSAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RklWRSwgNSkpOwotICAgIGNyYXp5Lnh0cnVjdHMucHVzaF9iYWNrKGhlbGxvKTsKLQogICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gZmlyc3RfbWFwOwogICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gc2Vjb25kX21hcDsKIAotICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRXTywgY3JhenkpKTsKLSAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUSFJFRSwgY3JhenkpKTsKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUV08sIGFyZ3VtZW50KSk7CisgICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VEhSRUUsIGFyZ3VtZW50KSk7CiAKICAgICBzZWNvbmRfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6U0lYLCBsb29uZXkpKTsKIApAQCAtMTk5LDE5ICsyNTgsMTcgQEAKIAogICAgIHByaW50ZigicmV0dXJuIik7CiAgICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICBmb3IgKGlfaXRlciA9IGluc2FuZS5iZWdpbigpOyBpX2l0ZXIgIT0gaW5zYW5lLmVuZCgpOyArK2lfaXRlcikgewotICAgICAgcHJpbnRmKCIlIlBSSWQ2NCIgPT4geyIsIGlfaXRlci0+Zmlyc3QpOwotICAgICAgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOwotICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsKLSAgICAgICAgICAgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsKLSAgICAgICAgICAgKytpMl9pdGVyKSB7CisgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKKyAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CisgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOyBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOyArK2kyX2l0ZXIpIHsKICAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOwogICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKICAgICAgICAgcHJpbnRmKCJ7Iik7CiAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICUiUFJJZDY0IiwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKKyAgICAgICAgICBwcmludGYoIiVkID0+ICUiIFBSSWQ2NCAiLCAiLCB1bS0+Zmlyc3QsIHVtLT5zZWNvbmQpOwogICAgICAgICB9CiAgICAgICAgIHByaW50ZigifSwgIik7CiAKQEAgLTIxOSw3ICsyNzYsMTEgQEAKICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7CiAgICAgICAgIHByaW50ZigieyIpOwogICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0sICIsIHgtPnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXgtPmJ5dGVfdGhpbmcsIHgtPmkzMl90aGluZywgeC0+aTY0X3RoaW5nKTsKKyAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAorICAgICAgICAgICAgICAgICB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgKGludCl4LT5ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICB4LT5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgIHgtPmk2NF90aGluZyk7CiAgICAgICAgIH0KICAgICAgICAgcHJpbnRmKCJ9Iik7CiAKQEAgLTIyOCwxMSArMjg5LDE5IEBACiAgICAgICBwcmludGYoIn0sICIpOwogICAgIH0KICAgICBwcmludGYoIn1cbiIpOwotCi0KICAgfQogCi0gIHZvaWQgdGVzdE11bHRpKFh0cnVjdCAmaGVsbG8sIGNvbnN0IGludDhfdCBhcmcwLCBjb25zdCBpbnQzMl90IGFyZzEsIGNvbnN0IGludDY0X3QgYXJnMiwgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+ICAmYXJnMywgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgeworICB2b2lkIHRlc3RNdWx0aShYdHJ1Y3QmIGhlbGxvLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgYXJnMCwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBhcmcxLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFyZzIsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiYgYXJnMywKKyAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICBjb25zdCBVc2VySWQgYXJnNSkgeworICAgICh2b2lkKWFyZzM7CisgICAgKHZvaWQpYXJnNDsKKyAgICAodm9pZClhcmc1OworCiAgICAgcHJpbnRmKCJ0ZXN0TXVsdGkoKVxuIik7CiAKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKQEAgLTI0MSwxNiArMzEwLDE0IEBACiAgICAgaGVsbG8uaTY0X3RoaW5nID0gKGludDY0X3QpYXJnMjsKICAgfQogCi0gIHZvaWQgdGVzdEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmYXJnKQotICAgIHRocm93KFhjZXB0aW9uLCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbikKLSAgeworICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgewogICAgIHByaW50ZigidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZy5jX3N0cigpKTsKICAgICBpZiAoYXJnLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKICAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKICAgICAgIGUubWVzc2FnZSA9IGFyZzsKICAgICAgIHRocm93IGU7Ci0gICAgfSBlbHNlIGlmIChhcmcuY29tcGFyZSgiQXBwbGljYXRpb25FeGNlcHRpb24iKSA9PSAwKSB7CisgICAgfSBlbHNlIGlmIChhcmcuY29tcGFyZSgiVEV4Y2VwdGlvbiIpID09IDApIHsKICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIGU7CiAgICAgICB0aHJvdyBlOwogICAgIH0gZWxzZSB7CkBAIC0yNjAsNyArMzI3LDkgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihYdHJ1Y3QgJnJlc3VsdCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzAsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcxKSB0aHJvdyhYY2VwdGlvbiwgWGNlcHRpb24yKSB7CisgIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKIAogICAgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAuY19zdHIoKSwgYXJnMS5jX3N0cigpKTsKIApAQCAtMjgwLDMxICszNDksMzUgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKLSAgICBzbGVlcChzbGVlcEZvcik7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyFcbiIsIHNsZWVwRm9yKTsKKyAgdm9pZCB0ZXN0T25ld2F5KGNvbnN0IGludDMyX3QgYU51bSkgeworICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IGNhbGwgcmVjZWl2ZWRcbiIsIGFOdW0pOwogICB9CiB9OwogCitjbGFzcyBTZWNvbmRIYW5kbGVyIDogcHVibGljIFNlY29uZFNlcnZpY2VJZgoreworICBwdWJsaWM6CisgICAgdm9pZCBzZWNvbmR0ZXN0U3RyaW5nKHN0ZDo6c3RyaW5nJiByZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykKKyAgICB7IHJlc3VsdCA9ICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7IH0KK307CiAKIGNsYXNzIFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CiAgIHZpcnR1YWwgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbl9uYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICByZXR1cm4gbmV3IHN0ZDo6c3RyaW5nKGZuX25hbWUpOwogICB9CiAgIHZpcnR1YWwgdm9pZCBmcmVlQ29udGV4dCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZClmbl9uYW1lOwogICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZyo+KGN0eCk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIHByZVJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgY29tbXVuaWNhdGUoInByZVJlYWQiLCBjdHgsIGZuX25hbWUpOwotICB9CisgIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeyBjb21tdW5pY2F0ZSgicHJlUmVhZCIsIGN0eCwgZm5fbmFtZSk7IH0KICAgdmlydHVhbCB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICAodm9pZClieXRlczsKICAgICBjb21tdW5pY2F0ZSgicG9zdFJlYWQiLCBjdHgsIGZuX25hbWUpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICBjb21tdW5pY2F0ZSgicHJlV3JpdGUiLCBjdHgsIGZuX25hbWUpOwotICB9CisgIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsgY29tbXVuaWNhdGUoInByZVdyaXRlIiwgY3R4LCBmbl9uYW1lKTsgfQogICB2aXJ0dWFsIHZvaWQgcG9zdFdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICAodm9pZClieXRlczsKICAgICBjb21tdW5pY2F0ZSgicG9zdFdyaXRlIiwgY3R4LCBmbl9uYW1lKTsKICAgfQogICB2aXJ0dWFsIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKQEAgLTMxOSwxNDcgKzM5Miw0NTQgQEAKICAgfQogfTsKIAorY2xhc3MgVGVzdEhhbmRsZXJBc3luYyA6IHB1YmxpYyBUaHJpZnRUZXN0Q29iU3ZJZiB7CitwdWJsaWM6CisgIFRlc3RIYW5kbGVyQXN5bmMoc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiYgaGFuZGxlcikgOiBfZGVsZWdhdGUoaGFuZGxlcikge30KKyAgdmlydHVhbCB+VGVzdEhhbmRsZXJBc3luYygpIHt9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgeworICAgIF9kZWxlZ2F0ZS0+dGVzdFZvaWQoKTsKKyAgICBjb2IoKTsKKyAgfQogCi0gIGludCBwb3J0ID0gOTA5MDsKLSAgc3RyaW5nIHNlcnZlclR5cGUgPSAic2ltcGxlIjsKLSAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwotICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgeworICAgIHN0ZDo6c3RyaW5nIHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmcocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KIAotICBvc3RyaW5nc3RyZWFtIHVzYWdlOworICB2aXJ0dWFsIHZvaWQgdGVzdEJvb2woc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBib29sIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEJvb2wodGhpbmcpOworICAgIGNvYihyZXMpOworICB9CiAKLSAgdXNhZ2UgPDwKLSAgICBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gWy0tcHJvY2Vzc29yLWV2ZW50c10iIDw8IGVuZGwgPDwKKyAgdmlydHVhbCB2b2lkIHRlc3RCeXRlKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQ4X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDhfdCB0aGluZykgeworICAgIGludDhfdCByZXMgPSBfZGVsZWdhdGUtPnRlc3RCeXRlKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQogCi0gICAgIlx0XHRzZXJ2ZXItdHlwZVx0XHR0eXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiLCBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKKyAgdmlydHVhbCB2b2lkIHRlc3RJMzIoc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKKyAgICBpbnQzMl90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEkzMih0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KIAotICAgICJcdFx0cHJvdG9jb2wtdHlwZVx0XHR0eXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKKyAgdmlydHVhbCB2b2lkIHRlc3RJNjQoc3RkOjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKKyAgICBpbnQ2NF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEk2NCh0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KIAotICAgICJcdFx0d29ya2Vyc1x0XHROdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsOworICB2aXJ0dWFsIHZvaWQgdGVzdERvdWJsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoZG91YmxlIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBkb3VibGUgdGhpbmcpIHsKKyAgICBkb3VibGUgcmVzID0gX2RlbGVnYXRlLT50ZXN0RG91YmxlKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQogCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gIGFyZ3M7CisgIHZpcnR1YWwgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdEJpbmFyeShyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQogCi0gIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7Ci0gICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7Ci0gICAgaWYgKGFyZy5jb21wYXJlKDAsMiwgIi0tIikgPT0gMCkgewotICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7Ci0gICAgICBpZiAoZW5kICE9IHN0cmluZzo6bnBvcykgewotCWFyZ3Nbc3RyaW5nKGFyZywgMiwgZW5kIC0gMildID0gc3RyaW5nKGFyZywgZW5kICsgMSk7Ci0gICAgICB9IGVsc2UgewotCWFyZ3Nbc3RyaW5nKGFyZywgMildID0gInRydWUiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIithcmcpOworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cnVjdChzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QmIHRoaW5nKSB7CisgICAgWHRydWN0IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RTdHJ1Y3QocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdE5lc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdDIgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdDImIHRoaW5nKSB7CisgICAgWHRydWN0MiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0TmVzdChyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0TWFwKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4mIHRoaW5nKSB7CisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdE1hcChyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nTWFwKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiB0aGluZykgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cmluZ01hcChyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0U2V0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNldDxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8aW50MzJfdD4mIHRoaW5nKSB7CisgICAgc3RkOjpzZXQ8aW50MzJfdD4gcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdFNldChyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0TGlzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0TGlzdChyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0RW51bShzdGQ6OmZ1bmN0aW9uPHZvaWQoTnVtYmVyejo6dHlwZSBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgdGhpbmcpIHsKKyAgICBOdW1iZXJ6Ojp0eXBlIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEVudW0odGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RUeXBlZGVmKHN0ZDo6ZnVuY3Rpb248dm9pZChVc2VySWQgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFVzZXJJZCB0aGluZykgeworICAgIFVzZXJJZCByZXMgPSBfZGVsZWdhdGUtPnRlc3RUeXBlZGVmKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0TWFwTWFwKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBjb25zdCBpbnQzMl90IGhlbGxvKSB7CisgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0TWFwTWFwKHJlcywgaGVsbG8pOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RJbnNhbml0eSgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3QgSW5zYW5pdHkmIGFyZ3VtZW50KSB7CisgICAgc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0SW5zYW5pdHkocmVzLCBhcmd1bWVudCk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpKHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4mIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVzZXJJZCBhcmc1KSB7CisgICAgWHRydWN0IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RNdWx0aShyZXMsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RFeGNlcHRpb24oCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgeworICAgIHRyeSB7CisgICAgICBfZGVsZWdhdGUtPnRlc3RFeGNlcHRpb24oYXJnKTsKKyAgICB9IGNhdGNoIChjb25zdCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiYgZSkgeworICAgICAgZXhuX2NvYihhcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb246OmRlbGF5RXhjZXB0aW9uKGUpKTsKKyAgICAgIHJldHVybjsKICAgICB9CisgICAgY29iKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcwLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKKyAgICBYdHJ1Y3QgcmVzOworICAgIHRyeSB7CisgICAgICBfZGVsZWdhdGUtPnRlc3RNdWx0aUV4Y2VwdGlvbihyZXMsIGFyZzAsIGFyZzEpOworICAgIH0gY2F0Y2ggKGNvbnN0IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uJiBlKSB7CisgICAgICBleG5fY29iKGFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbjo6ZGVsYXlFeGNlcHRpb24oZSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0T25ld2F5KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKKyAgICBfZGVsZWdhdGUtPnRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXApOworICAgIGNvYigpOworICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiBfZGVsZWdhdGU7Cit9OworCituYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKworICBzdHJpbmcgdGVzdERpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvc2VydmVyLmNydCI7CisgIHN0cmluZyBrZXlQYXRoID0gdGVzdERpciArICIva2V5cy9zZXJ2ZXIua2V5IjsKKworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgorICBpbnQgcG9ydCA9IDkwOTA7CisgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOworICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOworICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOworICBzdHJpbmcgc2VydmVyX3R5cGUgPSAic2ltcGxlIjsKKyAgc3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgYm9vbCBhYnN0cmFjdF9uYW1lc3BhY2UgPSBmYWxzZTsKKyAgc2l6ZV90IHdvcmtlcnMgPSA0OworICBpbnQgc3RyaW5nX2xpbWl0ID0gMDsKKyAgaW50IGNvbnRhaW5lcl9saW1pdCA9IDA7CisKKyAgcG86Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7CisgIGRlc2MuYWRkX29wdGlvbnMoKQorICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKKyAgICAoInBvcnQiLCBwbzo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksICJQb3J0IG51bWJlciB0byBsaXN0ZW4iKQorICAgICgiZG9tYWluLXNvY2tldCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KSAtPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksICJVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCkiKQorICAgICgiYWJzdHJhY3QtbmFtZXNwYWNlIiwgIkNyZWF0ZSB0aGUgZG9tYWluIHNvY2tldCBpbiB0aGUgQWJzdHJhY3QgTmFtZXNwYWNlIChubyBjb25uZWN0aW9uIHdpdGggZmlsZXN5c3RlbSBwYXRobmFtZXMpIikKKyAgICAoInNlcnZlci10eXBlIiwgcG86OnZhbHVlPHN0cmluZz4oJnNlcnZlcl90eXBlKS0+ZGVmYXVsdF92YWx1ZShzZXJ2ZXJfdHlwZSksICJ0eXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiLCBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIiIpCisgICAgKCJ0cmFuc3BvcnQiLCBwbzo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwgInRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgemxpYiIpCisgICAgKCJwcm90b2NvbCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwgInByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICgic3NsIiwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKKyAgICAoInpsaWIiLCAiV3JhcHBlZCBUcmFuc3BvcnQgdXNpbmcgWmxpYiIpCisgICAgKCJwcm9jZXNzb3ItZXZlbnRzIiwgInByb2Nlc3Nvci1ldmVudHMiKQorICAgICgid29ya2VycyxuIiwgcG86OnZhbHVlPHNpemVfdD4oJndvcmtlcnMpLT5kZWZhdWx0X3ZhbHVlKHdvcmtlcnMpLCAiTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZSIpCisgICAgKCJzdHJpbmctbGltaXQiLCBwbzo6dmFsdWU8aW50Pigmc3RyaW5nX2xpbWl0KSkKKyAgICAoImNvbnRhaW5lci1saW1pdCIsIHBvOjp2YWx1ZTxpbnQ+KCZjb250YWluZXJfbGltaXQpKTsKKworICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgcG86OnN0b3JlKHBvOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKKyAgcG86Om5vdGlmeSh2bSk7CisKKyAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKKyAgICBjb3V0IDw8IGRlc2MgPDwgIlxuIjsKKyAgICByZXR1cm4gMTsKICAgfQogCiAgIHRyeSB7Ci0KLSAgICBpZiAoIWFyZ3NbInBvcnQiXS5lbXB0eSgpKSB7Ci0gICAgICBwb3J0ID0gYXRvaShhcmdzWyJwb3J0Il0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJzZXJ2ZXItdHlwZSJdLmVtcHR5KCkpIHsKLSAgICAgIHNlcnZlclR5cGUgPSBhcmdzWyJzZXJ2ZXItdHlwZSJdOwotICAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKLSAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7Ci0gICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgewotICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJub25ibG9ja2luZyIpIHsKKyAgICBpZiAoIXNlcnZlcl90eXBlLmVtcHR5KCkpIHsKKyAgICAgIGlmIChzZXJ2ZXJfdHlwZSA9PSAic2ltcGxlIikgeworICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CisgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKKyAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewogICAgICAgfSBlbHNlIHsKLQl0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIrc2VydmVyVHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIiArIHNlcnZlcl90eXBlKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWFyZ3NbInByb3RvY29sLXR5cGUiXS5lbXB0eSgpKSB7Ci0gICAgICBwcm90b2NvbFR5cGUgPSBhcmdzWyJwcm90b2NvbC10eXBlIl07Ci0gICAgICBpZiAocHJvdG9jb2xUeXBlID09ICJiaW5hcnkiKSB7Ci0gICAgICB9IGVsc2UgaWYgKHByb3RvY29sVHlwZSA9PSAiYXNjaWkiKSB7Ci0JdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiQVNDSUkgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOwotICAgICAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gInhtbCIpIHsKLQl0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJYTUwgcHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworICAgIGlmICghcHJvdG9jb2xfdHlwZS5lbXB0eSgpKSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpIikgeyAgLy8gbXVsdGlwbGV4ZWQgYmluYXJ5CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsgLy8gbXVsdGlwbGV4ZWQgY29tcGFjdAorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7IC8vIG11bHRpcGxleGVkIGhlYWRlcgorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7IC8vIG11bHRpcGxleGVkIGpzb24KICAgICAgIH0gZWxzZSB7Ci0JdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIrcHJvdG9jb2xUeXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIgKyBwcm90b2NvbF90eXBlKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWFyZ3NbIndvcmtlcnMiXS5lbXB0eSgpKSB7Ci0gICAgICB3b3JrZXJDb3VudCA9IGF0b2koYXJnc1sid29ya2VycyJdLmNfc3RyKCkpOworICAgIGlmICghdHJhbnNwb3J0X3R5cGUuZW1wdHkoKSkgeworICAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJidWZmZXJlZCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3RlciB3aWxsIHBhc3MgemxpYiBhcyBhIGZsYWcgYW5kIGEgdHJhbnNwb3J0IHJpZ2h0IG5vdy4uLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOworICAgICAgfQogICAgIH0KKwogICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKLSAgICBjZXJyIDw8IHVzYWdlOworICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJzc2wiKSkgeworICAgIHNzbCA9IHRydWU7CisgIH0KKworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOworICB9CisKKyNpZiBkZWZpbmVkKEhBVkVfU0lHTkFMX0gpICYmIGRlZmluZWQoU0lHUElQRSkKKyAgaWYgKHNzbCkgeworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLy8gZm9yIE9wZW5TU0wsIG90aGVyd2lzZSB3ZSBlbmQgYWJydXB0bHkKKyAgfQorI2VuZGlmCisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CiAgIH0KIAogICAvLyBEaXNwYXRjaGVyCi0gIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KAotICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKKyAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4ganNvblByb3RvY29sRmFjdG9yeShuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0ganNvblByb3RvY29sRmFjdG9yeTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiAqY29tcGFjdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0U3RyaW5nU2l6ZUxpbWl0KHN0cmluZ19saW1pdCk7CisgICAgcHJvdG9jb2xGYWN0b3J5LnJlc2V0KGNvbXBhY3RQcm90b2NvbEZhY3RvcnkpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBoZWFkZXJQcm90b2NvbEZhY3RvcnkobmV3IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0gaGVhZGVyUHJvdG9jb2xGYWN0b3J5OworICB9IGVsc2UgeworICAgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiogYmluYXJ5UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGJpbmFyeVByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRTdHJpbmdTaXplTGltaXQoc3RyaW5nX2xpbWl0KTsKKyAgICBwcm90b2NvbEZhY3RvcnkucmVzZXQoYmluYXJ5UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQogCi0gIHNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgLy8gUHJvY2Vzc29ycworICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKIAotICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IoCi0gICAgICBuZXcgVGhyaWZ0VGVzdFByb2Nlc3NvclQ8IFRCaW5hcnlQcm90b2NvbFQ8VEJ1ZmZlckJhc2U+ID4odGVzdEhhbmRsZXIpKTsKLQotCi0gIGlmICghYXJnc1sicHJvY2Vzc29yLWV2ZW50cyJdLmVtcHR5KCkpIHsKLSAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoc2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPigKLSAgICAgICAgICBuZXcgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlcigpKSk7CisgIGlmICh2bS5jb3VudCgicHJvY2Vzc29yLWV2ZW50cyIpKSB7CisgICAgdGVzdFByb2Nlc3Nvci0+c2V0RXZlbnRIYW5kbGVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4obmV3IFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSkpOwogICB9CiAKICAgLy8gVHJhbnNwb3J0Ci0gIHNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBzc2xTb2NrZXRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OwogCi0gIC8vIEZhY3RvcnkKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKLQotICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotCi0gICAgLy8gU2VydmVyCi0gICAgVFNpbXBsZVNlcnZlciBzaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwKLQkJCSAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpOwotCi0gICAgcHJpbnRmKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgJWQuLi5cbiIsIHBvcnQpOwotICAgIHNpbXBsZVNlcnZlci5zZXJ2ZSgpOwotCi0gIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQotICAgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0KLSAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9Ci0gICAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLQotICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KLSAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotCi0gICAgVFRocmVhZFBvb2xTZXJ2ZXIgdGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLAotCQkJCSAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSAgICAgICB0aHJlYWRNYW5hZ2VyKTsKLQotICAgIHByaW50ZigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKLSAgICB0aHJlYWRQb29sU2VydmVyLnNlcnZlKCk7Ci0KLSAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgIFRUaHJlYWRlZFNlcnZlciB0aHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLSAgICBwcmludGYoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAlZC4uLlxuIiwgcG9ydCk7Ci0gICAgdGhyZWFkZWRTZXJ2ZXIuc2VydmUoKTsKLQotICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gIm5vbmJsb2NraW5nIikgewotICAgIFROb25ibG9ja2luZ1NlcnZlciBub25ibG9ja2luZ1NlcnZlcih0ZXN0UHJvY2Vzc29yLCBwb3J0KTsKLSAgICBwcmludGYoIlN0YXJ0aW5nIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIgb24gcG9ydCAlZC4uLlxuIiwgcG9ydCk7Ci0gICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKKyAgaWYgKHNzbCkgeworICAgIHNzbFNvY2tldEZhY3RvcnkgPSBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydFBhdGguY19zdHIoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoa2V5UGF0aC5jX3N0cigpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgICBpZiAoc2VydmVyX3R5cGUgIT0gIm5vbmJsb2NraW5nIikgeworICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGRvbWFpbl9zb2NrZXQgIT0gIiIpIHsKKyAgICAgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWJzdHJhY3Rfc29ja2V0KCJcMCIsIDEpOworICAgICAgICBhYnN0cmFjdF9zb2NrZXQgKz0gZG9tYWluX3NvY2tldDsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGFic3RyYWN0X3NvY2tldCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5saW5rKGRvbWFpbl9zb2NrZXQuY19zdHIoKSk7CisgICAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChkb21haW5fc29ja2V0KSk7CisgICAgICB9CisgICAgICBwb3J0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICB9CiAgIH0KIAotICBwcmludGYoImRvbmUuXG4iKTsKKyAgLy8gRmFjdG9yeQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIiAmJiBzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpOworICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CisgIH0gZWxzZSB7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKTsKKyAgfQorCisgIGlmICh6bGliKSB7CisgICAgLy8gaG1tLi4gZG9lc24ndCBzZWVtIHRvIGJlIGEgd2F5IHRvIG1ha2UgaXQgd3JhcCB0aGUgb3RoZXJzLi4uCisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFpsaWJUcmFuc3BvcnRGYWN0b3J5PigpOworICB9CisKKyAgLy8gU2VydmVyIEluZm8KKyAgY291dCA8PCAiU3RhcnRpbmcgXCIiIDw8IHNlcnZlcl90eXBlIDw8ICJcIiBzZXJ2ZXIgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUKKyAgICAgICA8PCAiKSBsaXN0ZW4gb246ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CisgIGlmIChwb3J0ICE9IDApIHsKKyAgICBjb3V0IDw8IHBvcnQ7CisgIH0KKyAgY291dCA8PCBlbmRsOworCisgIC8vIE11bHRpcGxleGVkIFByb2Nlc3NvciBpZiBuZWVkZWQKKyAgaWYgKGJvb3N0OjpzdGFydHNfd2l0aChwcm90b2NvbF90eXBlLCAibXVsdGkiKSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWNvbmRIYW5kbGVyPiBzZWNvbmRIYW5kbGVyKG5ldyBTZWNvbmRIYW5kbGVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yPiBzZWNvbmRQcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VQcm9jZXNzb3Ioc2Vjb25kSGFuZGxlcikpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gbXVsdGlwbGV4ZWRQcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJEZWZhdWx0KHRlc3RQcm9jZXNzb3IpOyAvLyBub24tbXVsdGkgY2xpZW50cyBnbyB0byB0aGUgZGVmYXVsdCBwcm9jZXNzb3IgKG11bHRpOmJpbmFyeSwgbXVsdGljOmNvbXBhY3QsIC4uLikKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpOworICAgIHRlc3RQcm9jZXNzb3IgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQcm9jZXNzb3I+KG11bHRpcGxleGVkUHJvY2Vzc29yKTsKKyAgfQorCisgIC8vIFNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcj4gc2VydmVyOworCisgIGlmIChzZXJ2ZXJfdHlwZSA9PSAic2ltcGxlIikgeworICAgIHNlcnZlci5yZXNldChuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlcnMpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CisgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZGVkIikgeworICAgIHNlcnZlci5yZXNldCgKKyAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJub25ibG9ja2luZyIpIHsKKyAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKAorICAgICAgICAgIG5ldyBUaHJpZnRUZXN0QXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXJBc3luYykpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gdGVzdEJ1ZmZlclByb2Nlc3NvcigKKyAgICAgICAgICBuZXcgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IodGVzdFByb2Nlc3NvckFzeW5jLCBwcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgLy8gbm90IGxvYWRpbmcgbm9uYmxvY2tpbmdTZXJ2ZXIgaW50byAic2VydmVyIiBiZWNhdXNlCisgICAgICAvLyBURXZodHRwU2VydmVyIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFRTZXJ2ZXIsIGFuZCBkb2Vzbid0CisgICAgICAvLyBwcm92aWRlIGEgc3RvcCBtZXRob2QuCisgICAgICBURXZodHRwU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RCdWZmZXJQcm9jZXNzb3IsIHBvcnQpOworICAgICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+IG5iU29ja2V0OworICAgICAgbmJTb2NrZXQucmVzZXQoCisgICAgICAgICAgc3NsID8gbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpCisgICAgICAgICAgICAgIDogbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVE5vbmJsb2NraW5nU2VydmVyKHRlc3RQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQpKTsKKyAgICB9IGVsc2UgeworICAgICAgY2VyciA8PCAic2VydmVyLXR5cGUgbm9uYmxvY2tpbmcgcmVxdWlyZXMgdHJhbnNwb3J0IG9mIGh0dHAgb3IgZnJhbWVkIiA8PCBlbmRsOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KKworICBpZiAoc2VydmVyLmdldCgpICE9IE5VTEwpIHsKKyAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgLy8gVGVsbCB0aGUgc2VydmVyIHRvIHVzZSB0aGUgc2FtZSBwcm90b2NvbCBmb3IgaW5wdXQgLyBvdXRwdXQKKyAgICAgIC8vIGlmIHVzaW5nIGhlYWRlcgorICAgICAgc2VydmVyLT5zZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIH0KKyAgICAKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSBmYWN0b3J5OworICAgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlPiBzZXJ2ZXJUaHJlYWRSdW5uZXIoc2VydmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZAorICAgICAgICA9IGZhY3RvcnkubmV3VGhyZWFkKHNlcnZlclRocmVhZFJ1bm5lcik7CisKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisgICAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOworI2VuZGlmCisKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgZ01vbml0b3Iud2FpdEZvcmV2ZXIoKTsgICAgICAgICAvLyB3YWl0IGZvciBhIHNodXRkb3duIHNpZ25hbAorICAgIAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyNlbmRpZgorCisgICAgc2VydmVyLT5zdG9wKCk7CisgICAgdGhyZWFkLT5qb2luKCk7CisgICAgc2VydmVyLnJlc2V0KCk7CisgIH0KKworICBjb3V0IDw8ICJkb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAgYi90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTYwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBUaHJpZnRUZXN0X3R5cGVzIHRvIHdvcmsKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgorCituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworYm9vbCBJbnNhbml0eTo6b3BlcmF0b3I8KHRocmlmdDo6dGVzdDo6SW5zYW5pdHkgY29uc3QmIG90aGVyKSBjb25zdCB7CisgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZzsKKyAgcmV0dXJuIFRocmlmdERlYnVnU3RyaW5nKCp0aGlzKSA8IFRocmlmdERlYnVnU3RyaW5nKG90aGVyKTsKK30KK30KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9tYWluLmNwcCBiL3Rlc3QvY3BwL3NyYy9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxMjRjMy4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9zcmMvbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTXV0ZXguaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPFRMb2dnaW5nLmg+Ci0KLSNpbmNsdWRlICJTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLXVzaW5nIF9fZ251X2N4eDo6aGFzaDsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi11c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOwotCi1zdHJ1Y3QgZXFzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Ci0gIH0KLX07Ci0KLXN0cnVjdCBsdHN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOwotICB9Ci19OwotCi0KLS8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7Ci10eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOwotCi1jbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKLSBwdWJsaWM6Ci0gIFNlcnZlcigpIHt9Ci0KLSAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKLSAgICBHdWFyZCBtKGxvY2tfKTsKLSAgICBpbnQgY3QgPSBjb3VudHNfW21ldGhvZF07Ci0gICAgY291bnRzX1ttZXRob2RdID0gKytjdDsKLSAgfQotCi0gIHZvaWQgZWNob1ZvaWQoKSB7Ci0gICAgY291bnQoImVjaG9Wb2lkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY291bnRfbWFwIGdldENvdW50KCkgewotICAgIEd1YXJkIG0obG9ja18pOwotICAgIHJldHVybiBjb3VudHNfOwotICB9Ci0KLSAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykge3JldHVybiBhcmc7fQotICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmYXJnKSB7Ci0gICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7Ci0gICAgICBUX0VSUk9SX0FCT1JUKCJXUk9ORyBTVFJJTkchISEhIik7Ci0gICAgfQotICAgIG91dCA9IGFyZzsKLSAgfQotICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiAmb3V0LCBjb25zdCBzZXQ8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiAmb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0KLXByaXZhdGU6Ci0gIGNvdW50X21hcCBjb3VudHNfOwotICBNdXRleCBsb2NrXzsKLQotfTsKLQotY2xhc3MgQ2xpZW50VGhyZWFkOiBwdWJsaWMgUnVubmFibGUgewotcHVibGljOgotCi0gIENsaWVudFRocmVhZChzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+dHJhbnNwb3J0LCBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwgTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiB3b3JrZXJDb3VudCwgc2l6ZV90IGxvb3BDb3VudCwgVFR5cGUgbG9vcFR5cGUpIDoKLSAgICBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCi0gICAgX2NsaWVudChjbGllbnQpLAotICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCi0gICAgX2xvb3BDb3VudChsb29wQ291bnQpLAotICAgIF9sb29wVHlwZShsb29wVHlwZSkKLSAge30KLQotICB2b2lkIHJ1bigpIHsKLQotICAgIC8vIFdhaXQgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBzdGFydAotCi0gICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLSAgICAgIHdoaWxlKF93b3JrZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKLQotICAgIHN3aXRjaChfbG9vcFR5cGUpIHsKLSAgICBjYXNlIFRfVk9JRDogbG9vcEVjaG9Wb2lkKCk7IGJyZWFrOwotICAgIGNhc2UgVF9CWVRFOiBsb29wRWNob0J5dGUoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0kzMjogbG9vcEVjaG9JMzIoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0k2NDogbG9vcEVjaG9JNjQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX1NUUklORzogbG9vcEVjaG9TdHJpbmcoKTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOyBicmVhazsKLSAgICB9Ci0KLSAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOwotCi0gICAgX2RvbmUgPSB0cnVlOwotCi0gICAge1N5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgX3dvcmtlckNvdW50LS07Ci0KLSAgICAgIGlmIChfd29ya2VyQ291bnQgPT0gMCkgewotCi0gICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9Wb2lkKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBfY2xpZW50LT5lY2hvVm9pZCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9CeXRlKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBpbnQ4X3QgYXJnID0gMTsKLSAgICAgIGludDhfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9CeXRlKGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob0kzMigpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgaW50MzJfdCBhcmcgPSAxOwotICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JMzIoYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvSTY0KCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBpbnQ2NF90IGFyZyA9IDE7Ci0gICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9TdHJpbmcoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIHN0cmluZyBhcmcgPSAiaGVsbG8iOwotICAgICAgc3RyaW5nIHJlc3VsdDsKLSAgICAgIF9jbGllbnQtPmVjaG9TdHJpbmcocmVzdWx0LCBhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OwotICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgc2l6ZV90JiBfd29ya2VyQ291bnQ7Ci0gIHNpemVfdCBfbG9vcENvdW50OwotICBUVHlwZSBfbG9vcFR5cGU7Ci0gIGludDY0X3QgX3N0YXJ0VGltZTsKLSAgaW50NjRfdCBfZW5kVGltZTsKLSAgYm9vbCBfZG9uZTsKLSAgTW9uaXRvciBfc2xlZXA7Ci19OwotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCi0gIGludCBwb3J0ID0gOTA5MTsKLSAgc3RyaW5nIHNlcnZlclR5cGUgPSAidGhyZWFkLXBvb2wiOwotICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7Ci0gIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7Ci0gIHNpemVfdCBjbGllbnRDb3VudCA9IDIwOwotICBzaXplX3QgbG9vcENvdW50ID0gNTAwMDA7Ci0gIFRUeXBlIGxvb3BUeXBlICA9IFRfVk9JRDsKLSAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKLSAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOwotICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7Ci0gIHN0cmluZyByZXF1ZXN0TG9nUGF0aCA9ICIuL3JlcXVlc3Rsb2cudGxvZyI7Ci0gIGJvb2wgcmVwbGF5UmVxdWVzdHMgPSBmYWxzZTsKLQotICBvc3RyaW5nc3RyZWFtIHVzYWdlOwotCi0gIHVzYWdlIDw8Ci0gICAgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuIHNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byBmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGw7Ci0KLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOwotCi0gIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7Ci0KLSAgICBzdHJpbmcgYXJnKGFyZ3ZbaXhdKTsKLQotICAgIGlmIChhcmcuY29tcGFyZSgwLDIsICItLSIpID09IDApIHsKLQotICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7Ci0KLSAgICAgIHN0cmluZyBrZXkgPSBzdHJpbmcoYXJnLCAyLCBlbmQgLSAyKTsKLQotICAgICAgaWYgKGVuZCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgYXJnc1trZXldID0gc3RyaW5nKGFyZywgZW5kICsgMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7Ci0gICAgfQotICB9Ci0KLSAgdHJ5IHsKLQotICAgIGlmICghYXJnc1siY2xpZW50cyJdLmVtcHR5KCkpIHsKLSAgICAgIGNsaWVudENvdW50ID0gYXRvaShhcmdzWyJjbGllbnRzIl0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJoZWxwIl0uZW1wdHkoKSkgewotICAgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghYXJnc1sibG9vcCJdLmVtcHR5KCkpIHsKLSAgICAgIGxvb3BDb3VudCA9IGF0b2koYXJnc1sibG9vcCJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1siY2FsbCJdLmVtcHR5KCkpIHsKLSAgICAgIGNhbGxOYW1lID0gYXJnc1siY2FsbCJdOwotICAgIH0KLQotICAgIGlmICghYXJnc1sicG9ydCJdLmVtcHR5KCkpIHsKLSAgICAgIHBvcnQgPSBhdG9pKGFyZ3NbInBvcnQiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlciJdLmVtcHR5KCkpIHsKLSAgICAgIHJ1blNlcnZlciA9IGFyZ3NbInNlcnZlciJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImxvZy1yZXF1ZXN0Il0uZW1wdHkoKSkgewotICAgICAgbG9nUmVxdWVzdHMgPSBhcmdzWyJsb2ctcmVxdWVzdCJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInJlcGxheS1yZXF1ZXN0Il0uZW1wdHkoKSkgewotICAgICAgcmVwbGF5UmVxdWVzdHMgPSBhcmdzWyJyZXBsYXktcmVxdWVzdCJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlci10eXBlIl0uZW1wdHkoKSkgewotICAgICAgc2VydmVyVHlwZSA9IGFyZ3NbInNlcnZlci10eXBlIl07Ci0KLSAgICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7Ci0KLSAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7Ci0KLSAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7Ci0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiK3NlcnZlclR5cGUpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghYXJnc1sid29ya2VycyJdLmVtcHR5KCkpIHsKLSAgICAgIHdvcmtlckNvdW50ID0gYXRvaShhcmdzWyJ3b3JrZXJzIl0uY19zdHIoKSk7Ci0gICAgfQotCi0gIH0gY2F0Y2goZXhjZXB0aW9uJiBlKSB7Ci0gICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOwotICAgIGNlcnIgPDwgdXNhZ2U7Ci0gIH0KLQotICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotCi0gIC8vIERpc3BhdGNoZXIKLSAgc2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7Ci0KLSAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgc2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7Ci0KLSAgICAvLyBUcmFuc3BvcnRzCi0gICAgc2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKLSAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKLSAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKLSAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKLQotICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLQotICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUcmFuc3BvcnQpOwotCi0gICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOwotICAgIGV4aXQoMCk7Ci0gIH0KLQotCi0gIGlmIChydW5TZXJ2ZXIpIHsKLQotICAgIHNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwotCi0gICAgLy8gVHJhbnNwb3J0Ci0gICAgc2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwotCi0gICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKLSAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwotCi0gICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotCi0gICAgaWYgKGxvZ1JlcXVlc3RzKSB7Ci0gICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQotICAgICAgc2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKLSAgICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwotICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7Ci0KLSAgICAgIHRyYW5zcG9ydEZhY3RvcnkgPQotICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7Ci0gICAgfQotCi0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKLQotICAgIGlmIChzZXJ2ZXJUeXBlID09ICJzaW1wbGUiKSB7Ci0KLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUU2ltcGxlU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkpOwotCi0gICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFRUaHJlYWRlZFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpKTsKLQotICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwotCi0gICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUVGhyZWFkUG9vbFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpKTsKLSAgICB9Ci0KLSAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8IGVuZGw7Ci0KLSAgICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7Ci0KLSAgICAvLyBJZiB3ZSBhcmVuJ3QgcnVubmluZyBjbGllbnRzLCBqdXN0IHdhaXQgZm9yZXZlciBmb3IgZXh0ZXJuYWwgY2xpZW50cwotCi0gICAgaWYgKGNsaWVudENvdW50ID09IDApIHsKLSAgICAgIHNlcnZlclRocmVhZC0+am9pbigpOwotICAgIH0KLSAgfQotCi0gIGlmIChjbGllbnRDb3VudCA+IDApIHsKLQotICAgIE1vbml0b3IgbW9uaXRvcjsKLQotICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7Ci0KLSAgICBzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKLQotICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7IGxvb3BUeXBlID0gVF9WT0lEO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7IGxvb3BUeXBlID0gVF9CWVRFO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsgbG9vcFR5cGUgPSBUX0kzMjt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7IGxvb3BUeXBlID0gVF9JNjQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeyBsb29wVHlwZSA9IFRfU1RSSU5HO30KLSAgICBlbHNlIHt0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiK2NhbGxOYW1lKTt9Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKLQotICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOwotICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwotCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKLSAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWUwMDsKLSAgICBpbnQ2NF90IHRpbWUwMTsKLQotICAgIHtTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLSAgICAgIHRocmVhZENvdW50ID0gY2xpZW50Q291bnQ7Ci0KLSAgICAgIGNlcnIgPDwgIkxhdW5jaCAiPDwgY2xpZW50Q291bnQgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKLQotICAgICAgdGltZTAwID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7Ci0KLSAgICAgIHdoaWxlKHRocmVhZENvdW50ID4gMCkgewotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLQotICAgICAgdGltZTAxID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgfQotCi0gICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgaW50NjRfdCBsYXN0VGltZSA9IDA7Ci0KLSAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOwotICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwotCi0gICAgZm9yIChzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyBpeCsrKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKLQotICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7Ci0KLSAgICAgIGFzc2VydChkZWx0YSA+IDApOwotCi0gICAgICBpZiAoY2xpZW50LT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7Ci0gICAgICAgIGZpcnN0VGltZSA9IGNsaWVudC0+X3N0YXJ0VGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNsaWVudC0+X2VuZFRpbWUgPiBsYXN0VGltZSkgewotICAgICAgICBsYXN0VGltZSA9IGNsaWVudC0+X2VuZFRpbWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKLSAgICAgICAgbWluVGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7Ci0gICAgICAgIG1heFRpbWUgPSBkZWx0YTsKLSAgICAgIH0KLQotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKLSAgICB9Ci0KLSAgICBhdmVyYWdlVGltZSAvPSBjbGllbnRDb3VudDsKLQotCi0gICAgY291dCA8PCAgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50IDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7Ci0KLSAgICBjb3VudF9tYXAgY291bnQgPSBzZXJ2aWNlSGFuZGxlci0+Z2V0Q291bnQoKTsKLSAgICBjb3VudF9tYXA6Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gY291bnQuYmVnaW4oKTsgaXRlciAhPSBjb3VudC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICBwcmludGYoIiVzID0+ICVkXG4iLCBpdGVyLT5maXJzdCwgaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgY2VyciA8PCAiZG9uZS4iIDw8IGVuZGw7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9uYi1tYWluLmNwcCBiL3Rlc3QvY3BwL3NyYy9uYi1tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4N2U0ZS4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9zcmMvbmItbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTXV0ZXguaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxUTG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiU2VydmljZS5oIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLXVzaW5nIF9fZ251X2N4eDo6aGFzaDsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi11c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOwotCi1zdHJ1Y3QgZXFzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Ci0gIH0KLX07Ci0KLXN0cnVjdCBsdHN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOwotICB9Ci19OwotCi0KLS8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7Ci10eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOwotCi1jbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKLSBwdWJsaWM6Ci0gIFNlcnZlcigpIHt9Ci0KLSAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKLSAgICBHdWFyZCBtKGxvY2tfKTsKLSAgICBpbnQgY3QgPSBjb3VudHNfW21ldGhvZF07Ci0gICAgY291bnRzX1ttZXRob2RdID0gKytjdDsKLSAgfQotCi0gIHZvaWQgZWNob1ZvaWQoKSB7Ci0gICAgY291bnQoImVjaG9Wb2lkIik7Ci0gICAgLy8gU2xlZXAgdG8gc2ltdWxhdGUgd29yawotICAgIHVzbGVlcCg1MDAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb3VudF9tYXAgZ2V0Q291bnQoKSB7Ci0gICAgR3VhcmQgbShsb2NrXyk7Ci0gICAgcmV0dXJuIGNvdW50c187Ci0gIH0KLQotICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZhcmcpIHsKLSAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKLSAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyEhISEiKTsKLSAgICB9Ci0gICAgb3V0ID0gYXJnOwotICB9Ci0gIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLQotcHJpdmF0ZToKLSAgY291bnRfbWFwIGNvdW50c187Ci0gIE11dGV4IGxvY2tfOwotCi19OwotCi1jbGFzcyBDbGllbnRUaHJlYWQ6IHB1YmxpYyBSdW5uYWJsZSB7Ci1wdWJsaWM6Ci0KLSAgQ2xpZW50VGhyZWFkKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD50cmFuc3BvcnQsIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LCBNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIHdvcmtlckNvdW50LCBzaXplX3QgbG9vcENvdW50LCBUVHlwZSBsb29wVHlwZSkgOgotICAgIF90cmFuc3BvcnQodHJhbnNwb3J0KSwKLSAgICBfY2xpZW50KGNsaWVudCksCi0gICAgX21vbml0b3IobW9uaXRvciksCi0gICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKLSAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCi0gICAgX2xvb3BUeXBlKGxvb3BUeXBlKQotICB7fQotCi0gIHZvaWQgcnVuKCkgewotCi0gICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0Ci0KLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZShfd29ya2VyQ291bnQgPT0gMCkgewotICAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgX3RyYW5zcG9ydC0+b3BlbigpOwotCi0gICAgc3dpdGNoKF9sb29wVHlwZSkgewotICAgIGNhc2UgVF9WT0lEOiBsb29wRWNob1ZvaWQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0JZVEU6IGxvb3BFY2hvQnl0ZSgpOyBicmVhazsKLSAgICBjYXNlIFRfSTMyOiBsb29wRWNob0kzMigpOyBicmVhazsKLSAgICBjYXNlIFRfSTY0OiBsb29wRWNob0k2NCgpOyBicmVhazsKLSAgICBjYXNlIFRfU1RSSU5HOiBsb29wRWNob1N0cmluZygpOyBicmVhazsKLSAgICBkZWZhdWx0OiBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7IGJyZWFrOwotICAgIH0KLQotICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgIF90cmFuc3BvcnQtPmNsb3NlKCk7Ci0KLSAgICBfZG9uZSA9IHRydWU7Ci0KLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICBfd29ya2VyQ291bnQtLTsKLQotICAgICAgaWYgKF93b3JrZXJDb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob1ZvaWQoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIF9jbGllbnQtPmVjaG9Wb2lkKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob0J5dGUoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIGludDhfdCBhcmcgPSAxOwotICAgICAgaW50OF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvSTMyKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBpbnQzMl90IGFyZyA9IDE7Ci0gICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0kzMihhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9JNjQoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIGludDY0X3QgYXJnID0gMTsKLSAgICAgIGludDY0X3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID1fY2xpZW50LT5lY2hvSTY0KGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob1N0cmluZygpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgc3RyaW5nIGFyZyA9ICJoZWxsbyI7Ci0gICAgICBzdHJpbmcgcmVzdWx0OwotICAgICAgX2NsaWVudC0+ZWNob1N0cmluZyhyZXN1bHQsIGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7Ci0gIE1vbml0b3ImIF9tb25pdG9yOwotICBzaXplX3QmIF93b3JrZXJDb3VudDsKLSAgc2l6ZV90IF9sb29wQ291bnQ7Ci0gIFRUeXBlIF9sb29wVHlwZTsKLSAgaW50NjRfdCBfc3RhcnRUaW1lOwotICBpbnQ2NF90IF9lbmRUaW1lOwotICBib29sIF9kb25lOwotICBNb25pdG9yIF9zbGVlcDsKLX07Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgaW50IHBvcnQgPSA5MDkxOwotICBzdHJpbmcgc2VydmVyVHlwZSA9ICJzaW1wbGUiOwotICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7Ci0gIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7Ci0gIHNpemVfdCBjbGllbnRDb3VudCA9IDIwOwotICBzaXplX3QgbG9vcENvdW50ID0gNTAwMDA7Ci0gIFRUeXBlIGxvb3BUeXBlICA9IFRfVk9JRDsKLSAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKLSAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOwotICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7Ci0gIHN0cmluZyByZXF1ZXN0TG9nUGF0aCA9ICIuL3JlcXVlc3Rsb2cudGxvZyI7Ci0gIGJvb2wgcmVwbGF5UmVxdWVzdHMgPSBmYWxzZTsKLQotICBvc3RyaW5nc3RyZWFtIHVzYWdlOwotCi0gIHVzYWdlIDw8Ci0gICAgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSBbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuIHNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsIDw8Ci0gICAgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byBmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwgPDwKLSAgICAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGw7Ci0KLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOwotCi0gIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7Ci0KLSAgICBzdHJpbmcgYXJnKGFyZ3ZbaXhdKTsKLQotICAgIGlmIChhcmcuY29tcGFyZSgwLDIsICItLSIpID09IDApIHsKLQotICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7Ci0KLSAgICAgIHN0cmluZyBrZXkgPSBzdHJpbmcoYXJnLCAyLCBlbmQgLSAyKTsKLQotICAgICAgaWYgKGVuZCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgYXJnc1trZXldID0gc3RyaW5nKGFyZywgZW5kICsgMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7Ci0gICAgfQotICB9Ci0KLSAgdHJ5IHsKLQotICAgIGlmICghYXJnc1siY2xpZW50cyJdLmVtcHR5KCkpIHsKLSAgICAgIGNsaWVudENvdW50ID0gYXRvaShhcmdzWyJjbGllbnRzIl0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJoZWxwIl0uZW1wdHkoKSkgewotICAgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghYXJnc1sibG9vcCJdLmVtcHR5KCkpIHsKLSAgICAgIGxvb3BDb3VudCA9IGF0b2koYXJnc1sibG9vcCJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1siY2FsbCJdLmVtcHR5KCkpIHsKLSAgICAgIGNhbGxOYW1lID0gYXJnc1siY2FsbCJdOwotICAgIH0KLQotICAgIGlmICghYXJnc1sicG9ydCJdLmVtcHR5KCkpIHsKLSAgICAgIHBvcnQgPSBhdG9pKGFyZ3NbInBvcnQiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlciJdLmVtcHR5KCkpIHsKLSAgICAgIHJ1blNlcnZlciA9IGFyZ3NbInNlcnZlciJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImxvZy1yZXF1ZXN0Il0uZW1wdHkoKSkgewotICAgICAgbG9nUmVxdWVzdHMgPSBhcmdzWyJsb2ctcmVxdWVzdCJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInJlcGxheS1yZXF1ZXN0Il0uZW1wdHkoKSkgewotICAgICAgcmVwbGF5UmVxdWVzdHMgPSBhcmdzWyJyZXBsYXktcmVxdWVzdCJdID09ICJ0cnVlIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlci10eXBlIl0uZW1wdHkoKSkgewotICAgICAgc2VydmVyVHlwZSA9IGFyZ3NbInNlcnZlci10eXBlIl07Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgewotICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgfSBjYXRjaChleGNlcHRpb24mIGUpIHsKLSAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY2VyciA8PCB1c2FnZTsKLSAgfQotCi0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgLy8gRGlzcGF0Y2hlcgotICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLQotICBpZiAocmVwbGF5UmVxdWVzdHMpIHsKLSAgICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKLQotICAgIC8vIFRyYW5zcG9ydHMKLSAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwotCi0gICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7Ci0KLSAgICBmaWxlUHJvY2Vzc29yLnByb2Nlc3MoMCwgdHJ1ZSk7Ci0gICAgZXhpdCgwKTsKLSAgfQotCi0KLSAgaWYgKHJ1blNlcnZlcikgewotCi0gICAgc2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7Ci0KLSAgICAvLyBQcm90b2NvbCBGYWN0b3J5Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0KLSAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+ICAgICAgdHJhbnNwb3J0RmFjdG9yeTsKLQotICAgIGlmIChsb2dSZXF1ZXN0cykgewotICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKLSAgICAgIHNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7Ci0gICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKLSAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwotCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5ID0KLSAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwotICAgIH0KLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7Ci0KLSAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCkpKTsKLSAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCsxKSkpOwotCi0gICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQrMSwgdGhyZWFkTWFuYWdlcikpKTsKLSAgICB9Ci0KLSAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOwotICAgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKLSAgICBzZXJ2ZXJUaHJlYWQyLT5zdGFydCgpOwotCi0gICAgLy8gSWYgd2UgYXJlbid0IHJ1bm5pbmcgY2xpZW50cywganVzdCB3YWl0IGZvcmV2ZXIgZm9yIGV4dGVybmFsIGNsaWVudHMKLQotICAgIGlmIChjbGllbnRDb3VudCA9PSAwKSB7Ci0gICAgICBzZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKLSAgICAgIHNlcnZlclRocmVhZDItPmpvaW4oKTsKLSAgICB9Ci0gIH0KLSAgc2xlZXAoMSk7Ci0KLSAgaWYgKGNsaWVudENvdW50ID4gMCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKLQotICAgIHNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwotCi0gICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsgbG9vcFR5cGUgPSBUX1ZPSUQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsgbG9vcFR5cGUgPSBUX0JZVEU7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeyBsb29wVHlwZSA9IFRfSTMyO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsgbG9vcFR5cGUgPSBUX0k2NDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7IGxvb3BUeXBlID0gVF9TVFJJTkc7fQotICAgIGVsc2Uge3Rocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIrY2FsbE5hbWUpO30KLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotCi0gICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCArIChpeCAlIDIpKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOwotICAgICAgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7Ci0KLSAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPENsaWVudFRocmVhZD4obmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKLSAgICB9Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyB0aHJlYWQrKykgewotICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZTAwOwotICAgIGludDY0X3QgdGltZTAxOwotCi0gICAge1N5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgdGhyZWFkQ291bnQgPSBjbGllbnRDb3VudDsKLQotICAgICAgY2VyciA8PCAiTGF1bmNoICI8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOwotCi0gICAgICB0aW1lMDAgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKLQotICAgICAgd2hpbGUodGhyZWFkQ291bnQgPiAwKSB7Ci0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotCi0gICAgICB0aW1lMDEgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKLSAgICBpbnQ2NF90IGxhc3RUaW1lID0gMDsKLQotICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7Ci0gICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotICAgIGludDY0X3QgbWF4VGltZSA9IDA7Ci0KLSAgICBmb3IgKHNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7IGl4KyspIHsKLQotICAgICAgc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudCA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOwotCi0gICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKLQotICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7Ci0KLSAgICAgIGlmIChjbGllbnQtPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKLSAgICAgICAgZmlyc3RUaW1lID0gY2xpZW50LT5fc3RhcnRUaW1lOwotICAgICAgfQotCi0gICAgICBpZiAoY2xpZW50LT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7Ci0gICAgICAgIGxhc3RUaW1lID0gY2xpZW50LT5fZW5kVGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgewotICAgICAgICBtaW5UaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKLSAgICAgICAgbWF4VGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBhdmVyYWdlVGltZSs9IGRlbHRhOwotICAgIH0KLQotICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OwotCi0KLSAgICBjb3V0IDw8ICAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKLQotICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOwotICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBjb3VudC5iZWdpbigpOyBpdGVyICE9IGNvdW50LmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJWRcbiIsIGl0ZXItPmZpcnN0LCBpdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICBjZXJyIDw8ICJkb25lLiIgPDwgZW5kbDsKLSAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjgzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLnRlc3QgaW1wb3J0IHRlc3RfbmFtZSAgIyBub3FhCitmcm9tIC5jb2xsZWN0IGltcG9ydCBjb2xsZWN0X2Nyb3NzX3Rlc3RzLCBjb2xsZWN0X2ZlYXR1cmVfdGVzdHMgICMgbm9xYQorZnJvbSAucnVuIGltcG9ydCBUZXN0RGlzcGF0Y2hlciAgIyBub3FhCitmcm9tIC5yZXBvcnQgaW1wb3J0IGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzLCBsb2FkX2tub3duX2ZhaWx1cmVzICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ4OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CkBAIC0wLDAgKzEsMTY0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0CisKK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorCisjIFRob3NlIGtleXMgYXJlIHBhc3NlZCB0byBleGVjdXRpb24gYXMgaXMuCisjIE5vdGUgdGhhdCB0aGVyZSBhcmUga2V5cyBvdGhlciB0aGFuIHRoZXNlLCBuYW1lbHk6CisjIGRlbGF5OiBBZnRlciBzZXJ2ZXIgaXMgc3RhcnRlZCwgY2xpZW50IHN0YXJ0IGlzIGRlbGF5ZWQgZm9yIHRoZSB2YWx1ZQorIyAoc2Vjb25kcykuCisjIHRpbWVvdXQ6IFRlc3QgdGltZW91dCBhZnRlciBjbGllbnQgaXMgc3RhcnRlZCAoc2Vjb25kcykuCisjIHBsYXRmb3JtczogU3VwcG9ydGVkIHBsYXRmb3Jtcy4gU2hvdWxkIG1hdGNoIHBsYXRmb3JtLnN5c3RlbSgpIHZhbHVlLgorIyBwcm90b2NvbHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3RvY29scworIyB0cmFuc3BvcnRzOiBsaXN0IG9mIHN1cHBvcnRlZCB0cmFuc3BvcnRzCisjIHNvY2tldHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHNvY2tldHMKKyMKKyMgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGVudHJpZXMgY2FuIGJlIGNvbG9uIHNlcGFyYXRlZCAic3BlYzppbXBsIiBwYWlyCisjIChlLmcuIGJpbmFyeTphY2NlbCkgd2hlcmUgdGVzdCBpcyBydW4gZm9yIGFueSBtYXRjaGluZyAic3BlYyIgd2hpbGUgYWN0dWFsCisjIGFyZ3VtZW50IHBhc3NlZCB0byB0ZXN0IGV4ZWN1dGFibGUgaXMgImltcGwiLgorIyBPdGhlcndpc2UgInNwZWMiIGlzIGVxdWl2YWxlbnQgdG8gInNwZWM6c3BlYyIgcGFpci4KKyMgKGUuZy4gImJpbmFyeSIgaXMgZXF1aXZhbGVudCB0byAiYmluYXJ5OmJpbmFyeSIgaW4gdGVzdHMuanNvbikKKyMKK1ZBTElEX0pTT05fS0VZUyA9IFsKKyAgICAnbmFtZScsICAjIG5hbWUgb2YgdGhlIGxpYnJhcnksIHR5cGljYWxseSBhIGxhbmd1YWdlIG5hbWUKKyAgICAnd29ya2RpcicsICAjIHdvcmsgZGlyZWN0b3J5IHdoZXJlIGNvbW1hbmQgaXMgZXhlY3V0ZWQKKyAgICAnY29tbWFuZCcsICAjIHRlc3QgY29tbWFuZAorICAgICdleHRyYV9hcmdzJywgICMgYXJncyBhcHBlbmRlZCB0byBjb21tYW5kIGFmdGVyIG90aGVyIGFyZ3MgYXJlIGFwcGVuZGVkCisgICAgJ3JlbW90ZV9hcmdzJywgICMgYXJncyBhZGRlZCB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcHJvZ3JhbQorICAgICdqb2luX2FyZ3MnLCAgIyB3aGV0aGVyIGFyZ3Mgc2hvdWxkIGJlIHBhc3NlZCBhcyBzaW5nbGUgY29uY2F0ZW5hdGVkIHN0cmluZworICAgICdlbnYnLCAgIyBhZGRpdGlvbmFsIGVudmlyb25tZW50YWwgdmFyaWFibGUKK10KKworREVGQVVMVF9NQVhfREVMQVkgPSA1CitERUZBVUxUX1NJR05BTCA9IDEKK0RFRkFVTFRfVElNRU9VVCA9IDUKKworCitkZWYgX2NvbGxlY3RfdGVzdGxpYnMoY29uZmlnLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaD1bTm9uZV0pOgorICAgICIiIkNvbGxlY3RzIHNlcnZlci9jbGllbnQgY29uZmlndXJhdGlvbnMgZnJvbSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb25zIiIiCisgICAgZGVmIGV4cGFuZF9saWJzKGNvbmZpZyk6CisgICAgICAgIGZvciBsaWIgaW4gY29uZmlnOgorICAgICAgICAgICAgc3YgPSBsaWIucG9wKCdzZXJ2ZXInLCBOb25lKQorICAgICAgICAgICAgY2wgPSBsaWIucG9wKCdjbGllbnQnLCBOb25lKQorICAgICAgICAgICAgeWllbGQgbGliLCBzdiwgY2wKKworICAgIGRlZiB5aWVsZF90ZXN0bGlicyhiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MsIG1hdGNoKToKKyAgICAgICAgZm9yIGJhc2UsIGNvbmYgaW4gemlwKGJhc2VfY29uZmlncywgY29uZmlncyk6CisgICAgICAgICAgICBpZiBjb25mOgorICAgICAgICAgICAgICAgIGlmIG5vdCBtYXRjaCBvciBiYXNlWyduYW1lJ10gaW4gbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtcyA9IGNvbmYuZ2V0KCdwbGF0Zm9ybXMnKSBvciBiYXNlLmdldCgncGxhdGZvcm1zJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBsYXRmb3JtcyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBtZXJnZV9kaWN0KGJhc2UsIGNvbmYpCisKKyAgICBsaWJzLCBzdnMsIGNscyA9IHppcCgqZXhwYW5kX2xpYnMoY29uZmlnKSkKKyAgICBzZXJ2ZXJzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBzdnMsIHNlcnZlcl9tYXRjaCkpCisgICAgY2xpZW50cyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgY2xzLCBjbGllbnRfbWF0Y2gpKQorICAgIHJldHVybiBzZXJ2ZXJzLCBjbGllbnRzCisKKworZGVmIGNvbGxlY3RfZmVhdHVyZXMoY29uZmlnLCBtYXRjaCk6CisgICAgcmVzID0gbGlzdChtYXAocmUuY29tcGlsZSwgbWF0Y2gpKQorICAgIHJldHVybiBsaXN0KGZpbHRlcihsYW1iZGEgYzogYW55KG1hcChsYW1iZGEgcjogci5zZWFyY2goY1snbmFtZSddKSwgcmVzKSksIGNvbmZpZykpCisKKworZGVmIF9kb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgorICAgIGRlZiBpbnRlcnNlY3Rpb24oa2V5LCBvMSwgbzIpOgorICAgICAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICBjb2xsZWN0aW9ucyBhcmUgcmVwbGFjZWQgd2l0aCBzZXRzIHRoZSBmaXJzdCB0aW1lIiIiCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8sIGtleSk6CisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodikKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gY2FjaGVkX3NldChvMSwga2V5KSAmIGNhY2hlZF9zZXQobzIsIGtleSkKKworICAgIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKKyAgICAgICAgIyBzdG9yZSBhcyBzZXQgb2YgKHNwZWMsIGltcGwpIHR1cGxlCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8pOgorICAgICAgICAgICAgZGVmIHRvX3NwZWNfaW1wbF90dXBsZXModmFsdWVzKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIHNwZWMsIF8sIGltcGwgPSB2LnBhcnRpdGlvbignOicpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYworICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHRvX3NwZWNfaW1wbF90dXBsZXMoc2V0KHYpKSkKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3Igc3BlYzEsIGltcGwxIGluIGNhY2hlZF9zZXQobzEpOgorICAgICAgICAgICAgZm9yIHNwZWMyLCBpbXBsMiBpbiBjYWNoZWRfc2V0KG8yKToKKyAgICAgICAgICAgICAgICBpZiBzcGVjMSA9PSBzcGVjMjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGltcGwxIGlmIGltcGwxID09IGltcGwyIGVsc2UgJyVzLSVzJyAlIChpbXBsMSwgaW1wbDIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgorCisgICAgZGVmIG1heWJlX21heChrZXksIG8xLCBvMiwgZGVmYXVsdCk6CisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCisgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKKyAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQorICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdAorCisgICAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbWVyZ2VfbWV0YWRhdGEobywgKipyZXQpOgorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGZvciBzdiwgY2wgaW4gcHJvZHVjdChzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICAgICAgZm9yIHByb3RvLCBwcm90bzEsIHByb3RvMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCdwcm90b2NvbHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgZm9yIHRyYW5zLCB0cmFuczEsIHRyYW5zMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCd0cmFuc3BvcnRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICBmb3Igc29jayBpbiBpbnRlcnNlY3Rpb24oJ3NvY2tldHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0Jzogc29jaworICAgICAgICAgICAgICAgICAgICB9CisKKworZGVmIF9maWx0ZXJfZW50cmllcyh0ZXN0cywgcmVnZXgpOgorICAgIGlmIHJlZ2V4OgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSB0OiByZS5zZWFyY2gocmVnZXgsIFRlc3RFbnRyeS5nZXRfbmFtZSgqKnQpKSwgdGVzdHMpCisgICAgcmV0dXJuIHRlc3RzCisKKworZGVmIGNvbGxlY3RfY3Jvc3NfdGVzdHModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgY2wgPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGNsKSwgcmVnZXgpKQorCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVfdGVzdHModGVzdHNfZGljdCwgZmVhdHVyZXNfZGljdCwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCk6CisgICAgc3YsIF8gPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gpCisgICAgZnQgPSBjb2xsZWN0X2ZlYXR1cmVzKGZlYXR1cmVzX2RpY3QsIGZlYXR1cmVfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBmdCksIHJlZ2V4KSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgX0VOQ09ERSA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCisgICAgZGVmIHBhdGhfam9pbigqYXJncyk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgYXJncykKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgZGVmIHN0cl9qb2luKHMsIGwpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGwpCisgICAgICAgIGIgPSBzLmRlY29kZShfRU5DT0RFKQorICAgICAgICByZXR1cm4gYi5qb2luKGJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGxvZ2ZpbGVfb3BlbiA9IG9wZW4KKworZWxzZToKKworICAgIHBhdGhfam9pbiA9IG9zLnBhdGguam9pbgorICAgIHN0cl9qb2luID0gc3RyLmpvaW4KKworICAgIGRlZiBsb2dmaWxlX29wZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3BlbigqYXJncywgZXJyb3JzPSdyZXBsYWNlJykKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhZjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CkBAIC0wLDAgKzEsNDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCisKK2Zyb20gLmNvbXBhdCBpbXBvcnQgbG9nZmlsZV9vcGVuLCBwYXRoX2pvaW4sIHN0cl9qb2luCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKKworTE9HX0RJUiA9ICdsb2cnCitSRVNVTFRfSFRNTCA9ICdpbmRleC5odG1sJworUkVTVUxUX0pTT04gPSAncmVzdWx0cy5qc29uJworRkFJTF9KU09OID0gJ2tub3duX2ZhaWx1cmVzXyVzLmpzb24nCisKKworZGVmIGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIsIG92ZXJ3cml0ZSwgc2F2ZSwgb3V0KToKKyAgICBkZWYgY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzKToKKyAgICAgICAgc3VjY2Vzc19pbmRleCA9IDUKKyAgICAgICAgZm9yIHIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGlmIG5vdCByW3N1Y2Nlc3NfaW5kZXhdOgorICAgICAgICAgICAgICAgIHlpZWxkIFRlc3RFbnRyeS5nZXRfbmFtZSgqcikKKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBSRVNVTFRfSlNPTiksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXN1bHRzID0ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVbmFibGUgdG8gbG9hZCBsYXN0IHJlc3VsdC4gRGlkIHlvdSBydW4gdGVzdHMgP1xuJykKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbHMgPSBjb2xsZWN0X2ZhaWx1cmVzKHJlc3VsdHNbJ3Jlc3VsdHMnXSkKKyAgICBpZiBub3Qgb3ZlcndyaXRlOgorICAgICAgICBrbm93biA9IGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcikKKyAgICAgICAga25vd24uZXh0ZW5kKGZhaWxzKQorICAgICAgICBmYWlscyA9IGtub3duCisgICAgZmFpbHNfanNvbiA9IGpzb24uZHVtcHMoc29ydGVkKHNldChmYWlscykpLCBpbmRlbnQ9Miwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICBpZiBzYXZlOgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3Blbihvcy5wYXRoLmpvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1N1Y2Nlc3NmdWxseSB1cGRhdGVkIGtub3duIGZhaWx1cmVzLlxuJykKKyAgICBpZiBvdXQ6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZmFpbHNfanNvbikKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgIHJldHVybiBUcnVlCisKKworZGVmIGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcik6CisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIFtdCisKKworY2xhc3MgVGVzdFJlcG9ydGVyKG9iamVjdCk6CisgICAgIyBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCBsaWJyYXJ5IGRvZXNuJ3QgaGFuZGxlIHRpbWV6b25lIHdlbGwKKyAgICAjIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWiAlWScKKyAgICBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVknCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZXN0X2xvZ2ZpbGUoY2xzLCB0ZXN0X25hbWUsIHByb2dfa2luZCwgZGlyPU5vbmUpOgorICAgICAgICByZWxwYXRoID0gcGF0aF9qb2luKCdsb2cnLCAnJXNfJXMubG9nJyAlICh0ZXN0X25hbWUsIHByb2dfa2luZCkpCisgICAgICAgIHJldHVybiByZWxwYXRoIGlmIG5vdCBkaXIgZWxzZSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihkaXIsIHJlbHBhdGgpKQorCisgICAgZGVmIF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2VsYXBzZWQoc2VsZik6CisgICAgICAgIHJldHVybiB0aW1lLnRpbWUoKSAtIHNlbGYuX3N0YXJ0X3RpbWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZm9ybWF0X2RhdGUoY2xzKToKKyAgICAgICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQorCisgICAgZGVmIF9wcmludF9kYXRlKHNlbGYpOgorICAgICAgICBwcmludChzZWxmLl9mb3JtYXRfZGF0ZSgpLCBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9iYXIoc2VsZiwgb3V0PU5vbmUpOgorICAgICAgICBwcmludCgKKyAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JywKKyAgICAgICAgICAgIGZpbGU9KG91dCBvciBzZWxmLm91dCkpCisKKyAgICBkZWYgX3ByaW50X2V4ZWNfdGltZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ1Rlc3QgZXhlY3V0aW9uIHRvb2sgezouMWZ9IHNlY29uZHMuJy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksIGZpbGU9c2VsZi5vdXQpCisKKworY2xhc3MgRXhlY1JlcG9ydGVyKFRlc3RSZXBvcnRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgorICAgICAgICBzdXBlcihFeGVjUmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5sb2dwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nLmtpbmQsIHRlc3RkaXIpCisgICAgICAgIHNlbGYub3V0ID0gTm9uZQorCisgICAgZGVmIGJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHNlbGYuX29wZW4oKQorICAgICAgICBpZiBzZWxmLm91dCBhbmQgbm90IHNlbGYub3V0LmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2hlYWRlcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorCisgICAgZGVmIGVuZChzZWxmLCByZXR1cm5jb2RlKToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKHJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBraWxsZWQoc2VsZik6CisgICAgICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdTZXJ2ZXIgcHJvY2VzcyBpcyBzdWNjZXNzZnVsbHkga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuZW5kKE5vbmUpCisKKyAgICBkZWYgZGllZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJyoqKiBTZXJ2ZXIgcHJvY2VzcyBoYXMgZGllZCB1bmV4cGVjdGVkbHkgKioqJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIF9pbml0X2ZhaWx1cmVfZXhwcnMgPSB7CisgICAgICAgICdzZXJ2ZXInOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0FhXWRkcmVzcyBhbHJlYWR5IGluIHVzZScsCisgICAgICAgICAgICAnQ291bGQgbm90IGJpbmQnLAorICAgICAgICAgICAgJ0VBRERSSU5VU0UnLAorICAgICAgICBdKSksCisgICAgICAgICdjbGllbnQnOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0NjXW9ubmVjdGlvbiByZWZ1c2VkJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgY29ubmVjdCB0bycsCisgICAgICAgICAgICAnQ291bGQgbm90IG9wZW4gVU5JWCAnLCAgICAgICAjIGRvbWFpbiBzb2NrZXQgKHJiKQorICAgICAgICAgICAgJ0VDT05OUkVGVVNFRCcsCisgICAgICAgICAgICAnZWNvbm5yZWZ1c2VkJywgICAgICAgICAgICAgICAjIGVybAorICAgICAgICAgICAgJ0NPTk5FQ1RJT04tUkVGVVNFRC1FUlJPUicsICAgIyBjbAorICAgICAgICAgICAgJ2Nvbm5lY3QgRU5PRU5UJywgICAgICAgICAgICAgIyBub2RlanMgZG9tYWluIHNvY2tldAorICAgICAgICAgICAgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknLCAgIyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnU29ja2V0cy5UY3BDbGllbnQuQ29ubmVjdCcsICAjIGNzaGFycAorICAgICAgICBdKSksCisgICAgfQorCisgICAgZGVmIG1heWJlX2ZhbHNlX3Bvc2l0aXZlKHNlbGYpOgorICAgICAgICAiIiJTZWFyY2hlcyB0aHJvdWdoIGxvZyBmaWxlIGZvciBzb2NrZXQgYmluZCBlcnJvci4KKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHN1c3BpY2lvdXMgZXhwcmVzc2lvbiBpcyBmb3VuZCwgb3RoZXJ3aXNlIEZhbHNlIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIGV4cHJzID0gc2VsZi5faW5pdF9mYWlsdXJlX2V4cHJzW3NlbGYuX3Byb2cua2luZF0KKworICAgICAgICAgICAgZGVmIG1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGZvciBleHByIGluIGV4cHJzOgorICAgICAgICAgICAgICAgICAgICBpZiBleHByLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCJtYXliZSBmYWxzZSBwb3NpdGl2ZTogJXMiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBpZiBhbnkobWFwKG1hdGNoLCBmcCkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLl9sb2cud2FybignWyVzXTogRXJyb3Igd2hpbGUgZGV0ZWN0aW5nIGZhbHNlIHBvc2l0aXZlOiAlcycgJSAoc2VsZi5fdGVzdC5uYW1lLCBzdHIoZXgpKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKHRyYWNlYmFjay5wcmludF9leGMoKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX29wZW4oc2VsZik6CisgICAgICAgIHNlbGYub3V0ID0gbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3crJykKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYub3V0LmNsb3NlKCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKyAgICAgICAgcHJpbnQoJ0V4ZWN1dGluZzogJXMnICUgc3RyX2pvaW4oJyAnLCBzZWxmLl9wcm9nLmNvbW1hbmQpLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnRGlyZWN0b3J5OiAlcycgJSBzZWxmLl9wcm9nLndvcmtkaXIsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6ZGVsYXk6ICVzJyAlIHNlbGYuX3Rlc3QuZGVsYXksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6dGltZW91dDogJXMnICUgc2VsZi5fdGVzdC50aW1lb3V0LCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLm91dC5mbHVzaCgpCisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmLCByZXR1cm5jb2RlPU5vbmUpOgorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBpZiByZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ1JldHVybiBjb2RlOiAlZCAobmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGtpbGwgYnkgc2lnbmFsKScgJSByZXR1cm5jb2RlLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1Byb2Nlc3MgaXMga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisKK2NsYXNzIFN1bW1hcnlSZXBvcnRlcihUZXN0UmVwb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlZGlyLCB0ZXN0ZGlyX3JlbGF0aXZlLCBjb25jdXJyZW50PVRydWUpOgorICAgICAgICBzdXBlcihTdW1tYXJ5UmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fYmFzZWRpciA9IGJhc2VkaXIKKyAgICAgICAgc2VsZi5fdGVzdGRpcl9yZWwgPSB0ZXN0ZGlyX3JlbGF0aXZlCisgICAgICAgIHNlbGYubG9nZGlyID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgTE9HX0RJUikKKyAgICAgICAgc2VsZi5vdXRfcGF0aCA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIFJFU1VMVF9KU09OKQorICAgICAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50CisgICAgICAgIHNlbGYub3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLnN5c3RlbSgpCisgICAgICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2dkaXIpCisgICAgICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyhzZWxmLnRlc3RkaXIpCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0ZXN0ZGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gcGF0aF9qb2luKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX3Rlc3RkaXJfcmVsKQorCisgICAgZGVmIF9yZXN1bHRfc3RyaW5nKHNlbGYsIHRlc3QpOgorICAgICAgICBpZiB0ZXN0LnN1Y2Nlc3M6CisgICAgICAgICAgICBpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdzdWNjZXNzJworICAgICAgICAgICAgZWxpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSgxIHJldHJ5KScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSglZCByZXRyaWVzKScgJSB0ZXN0LnJldHJ5X2NvdW50CisgICAgICAgIGVsaWYgdGVzdC5leHBpcmVkOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKHRpbWVvdXQpJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKCVkKScgJSB0ZXN0LnJldHVybmNvZGUKKworICAgIGRlZiBfZ2V0X3JldmlzaW9uKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnRlc3RkaXIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICByZXR1cm4gb3V0LnN0cmlwKCkKKworICAgIGRlZiBfZm9ybWF0X3Rlc3Qoc2VsZiwgdGVzdCwgd2l0aF9yZXN1bHQ9VHJ1ZSk6CisgICAgICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCisgICAgICAgIHRyYW5zID0gJyVzLSVzJyAlICh0ZXN0LnRyYW5zcG9ydCwgdGVzdC5zb2NrZXQpCisgICAgICAgIGlmIG5vdCB3aXRoX3Jlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxOHN9ezoyNXN9Jy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxN10sIHRyYW5zWzoyNF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfXs6c31cbicuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1s6MjRdLCBzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpKQorCisgICAgZGVmIF9wcmludF90ZXN0X2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAnezoyNHN9ezoxOHN9ezoyNXN9ezpzfScuZm9ybWF0KCdzZXJ2ZXItY2xpZW50OicsICdwcm90b2NvbDonLCAndHJhbnNwb3J0OicsICdyZXN1bHQ6JyksCisgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0KCkKKyAgICAgICAgcHJpbnQoJ0FwYWNoZSBUaHJpZnQgLSBJbnRlZ3JhdGlvbiBUZXN0IFN1aXRlJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKworICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA+IDA6CisgICAgICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICAgICAnKioqIEZvbGxvd2luZyAlZCBmYWlsdXJlcyB3ZXJlIHVuZXhwZWN0ZWQgKioqOlxuJyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpLAorICAgICAgICAgICAgICAgICdJZiBpdCBpcyBpbnRyb2R1Y2VkIGJ5IHlvdSwgcGxlYXNlIGZpeCBpdCBiZWZvcmUgc3VibWl0dGluZyB0aGUgY29kZS5cbicsCisgICAgICAgICAgICAgICAgIyAnSWYgbm90LCBwbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUXG4nLAorICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ05vIHVuZXhwZWN0ZWQgZmFpbHVyZXMuJywgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfZmxha3lfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBleHBlY3RlZCB0byBjbGVhbmx5IHN1Y2NlZWQgYnV0IG5lZWRlZCByZXRyeTonICUgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl9mbGFreV9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcykgPiAwOgorICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgJ0ZvbGxvd2luZyAlZCB0ZXN0cyB3ZXJlIGtub3duIHRvIGZhaWwgYnV0IHN1Y2NlZWRlZCAobWF5YmUgZmxha3kpOicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX2h0dHBfc2VydmVyX2NvbW1hbmQoc2VsZiwgcG9ydCk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gU2ltcGxlSFRUUFNlcnZlciAlZCcgJSBwb3J0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3B5dGhvbiAtbSBodHRwLnNlcnZlciAlZCcgJSBwb3J0CisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmKToKKyAgICAgICAgZmFpbF9jb3VudCA9IGxlbihzZWxmLl9leHBlY3RlZF9mYWlsdXJlKSArIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcygpCisgICAgICAgIHNlbGYuX3ByaW50X2ZsYWt5X3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX2ZhaWx1cmUoKQorICAgICAgICBzZWxmLl93cml0ZV9odG1sX2RhdGEoKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ3VuZXhwZWN0ZWQgZmFpbHVyZXMnLCBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX2Fzc2VtYmxlX2xvZygna25vd24gZmFpbHVyZXMnLCBzZWxmLl9leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICdZb3UgY2FuIGJyb3dzZSByZXN1bHRzIGF0OlxuJywKKyAgICAgICAgICAgICdcdGZpbGU6Ly8lcy8lc1xuJyAlIChzZWxmLnRlc3RkaXIsIFJFU1VMVF9IVE1MKSwKKyAgICAgICAgICAgICcjIElmIHlvdSB1c2UgQ2hyb21lLCBydW46XG4nLAorICAgICAgICAgICAgJyMgXHRjZCAlc1xuI1x0JXNcbicgJSAoc2VsZi5fYmFzZWRpciwgc2VsZi5faHR0cF9zZXJ2ZXJfY29tbWFuZCg4MDAxKSksCisgICAgICAgICAgICAnIyB0aGVuIGJyb3dzZTpcbicsCisgICAgICAgICAgICAnIyBcdGh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXMvXG4nICUgKDgwMDEsIHNlbGYuX3Rlc3RkaXJfcmVsKSwKKyAgICAgICAgICAgICdGdWxsIGxvZyBmb3IgZWFjaCB0ZXN0IGlzIGhlcmU6XG4nLAorICAgICAgICAgICAgJ1x0dGVzdC9sb2cvc2VydmVyX2NsaWVudF9wcm90b2NvbF90cmFuc3BvcnRfY2xpZW50LmxvZ1xuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X3NlcnZlci5sb2dcbicsCisgICAgICAgICAgICAnJWQgZmFpbGVkIG9mICVkIHRlc3RzIGluIHRvdGFsLlxuJyAlIChmYWlsX2NvdW50LCBsZW4oc2VsZi5fdGVzdHMpKSwKKyAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisKKyAgICBkZWYgX3JlbmRlcl9yZXN1bHQoc2VsZiwgdGVzdCk6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICB0ZXN0LnNlcnZlci5uYW1lLAorICAgICAgICAgICAgdGVzdC5jbGllbnQubmFtZSwKKyAgICAgICAgICAgIHRlc3QucHJvdG9jb2wsCisgICAgICAgICAgICB0ZXN0LnRyYW5zcG9ydCwKKyAgICAgICAgICAgIHRlc3Quc29ja2V0LAorICAgICAgICAgICAgdGVzdC5zdWNjZXNzLAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCwKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnc2VydmVyJzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LnNlcnZlci5raW5kKSwKKyAgICAgICAgICAgICAgICAnY2xpZW50Jzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LmNsaWVudC5raW5kKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIF0KKworICAgIGRlZiBfd3JpdGVfaHRtbF9kYXRhKHNlbGYpOgorICAgICAgICAiIiJXcml0ZXMgSlNPTiBkYXRhIHRvIGJlIHJlYWQgYnkgcmVzdWx0IGh0bWwiIiIKKyAgICAgICAgcmVzdWx0cyA9IFtzZWxmLl9yZW5kZXJfcmVzdWx0KHIpIGZvciByIGluIHNlbGYuX3Rlc3RzXQorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihzZWxmLm91dF9wYXRoLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGpzb24uZHVtcHMoeworICAgICAgICAgICAgICAgICdkYXRlJzogc2VsZi5fZm9ybWF0X2RhdGUoKSwKKyAgICAgICAgICAgICAgICAncmV2aXNpb24nOiBzdHIoc2VsZi5fcmV2aXNpb24pLAorICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6IHNlbGYuX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgICdkdXJhdGlvbic6ICd7Oi4xZn0nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwKKyAgICAgICAgICAgICAgICAncmVzdWx0cyc6IHJlc3VsdHMsCisgICAgICAgICAgICB9LCBpbmRlbnQ9MikpCisKKyAgICBkZWYgX2Fzc2VtYmxlX2xvZyhzZWxmLCB0aXRsZSwgaW5kZXhlcyk6CisgICAgICAgIGlmIGxlbihpbmRleGVzKSA+IDA6CisgICAgICAgICAgICBkZWYgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCBwcm9nX2tpbmQpOgorICAgICAgICAgICAgICAgIHByaW50KCcqKioqKioqKioqKioqKioqKioqKioqKioqKiogJXMgbWVzc2FnZSAqKioqKioqKioqKioqKioqKioqKioqKioqKionICUgcHJvZ19raW5kLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9ZnApCisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZ19raW5kLCBzZWxmLnRlc3RkaXIpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGgsICdyJykgYXMgcHJvZ19mcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHByb2dfZnAucmVhZCgpLCBmaWxlPWZwKQorICAgICAgICAgICAgZmlsZW5hbWUgPSB0aXRsZS5yZXBsYWNlKCcgJywgJ18nKSArICcubG9nJworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHNlbGYubG9nZGlyLCBmaWxlbmFtZSksICd3KycpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIG1hcChzZWxmLl90ZXN0cy5fX2dldGl0ZW1fXywgaW5kZXhlcyk6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCdURVNUOiBbJXNdXG4nICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3Quc2VydmVyLmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgdGVzdC5jbGllbnQua2luZCkKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuJykKKyAgICAgICAgICAgIHByaW50KCclcyBhcmUgbG9nZ2VkIHRvICVzLyVzLyVzJyAlICh0aXRsZS5jYXBpdGFsaXplKCksIHNlbGYuX3Rlc3RkaXJfcmVsLCBMT0dfRElSLCBmaWxlbmFtZSkpCisKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9mb290ZXIoKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPT0gMAorCisgICAgZGVmIGFkZF90ZXN0KHNlbGYsIHRlc3RfZGljdCk6CisgICAgICAgIHRlc3QgPSBUZXN0RW50cnkoc2VsZi50ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0LCBGYWxzZSkpCisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3Rlc3RzKSAtIDEKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgYWRkX3Jlc3VsdChzZWxmLCBpbmRleCwgcmV0dXJuY29kZSwgZXhwaXJlZCwgcmV0cnlfY291bnQpOgorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWlsZWQgPSByZXR1cm5jb2RlIGlzIE5vbmUgb3IgcmV0dXJuY29kZSAhPSAwCisgICAgICAgICAgICBmbGFreSA9IG5vdCBmYWlsZWQgYW5kIHJldHJ5X2NvdW50ICE9IDAKKyAgICAgICAgICAgIHRlc3QgPSBzZWxmLl90ZXN0c1tpbmRleF0KKyAgICAgICAgICAgIGtub3duID0gdGVzdC5uYW1lIGluIHNlbGYuX2tub3duX2ZhaWx1cmVzCisgICAgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgaWYga25vd246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnJXMgZmFpbGVkIGFzIGV4cGVjdGVkJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgZmFpbHVyZTogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgZWxpZiBmbGFreSBhbmQgbm90IGtub3duOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZsYWt5IHN1Y2Nlc3M6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFreV9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgbm90IGZsYWt5IGFuZCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcyA9IG5vdCBmYWlsZWQKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSA9IHJldHVybmNvZGUKKyAgICAgICAgICAgIHRlc3QucmV0cnlfY291bnQgPSByZXRyeV9jb3VudAorICAgICAgICAgICAgdGVzdC5leHBpcmVkID0gZXhwaXJlZAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCA9IGtub3duID09IGZhaWxlZAorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3J1bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhmYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTAsMCArMSw0MjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2VycworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIC5jb21wYXQgaW1wb3J0IHN0cl9qb2luCitmcm9tIC5yZXBvcnQgaW1wb3J0IEV4ZWNSZXBvcnRlciwgU3VtbWFyeVJlcG9ydGVyCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKK2Zyb20gLnV0aWwgaW1wb3J0IGRvbWFpbl9zb2NrZXRfcGF0aAorCitSRVNVTFRfRVJST1IgPSA2NAorUkVTVUxUX1RJTUVPVVQgPSAxMjgKK1NJR05PTkUgPSAwCitTSUdLSUxMID0gMTUKKworIyBnbG9iYWxzCitwb3J0cyA9IE5vbmUKK3N0b3AgPSBOb25lCisKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGN3ZCwgZW52LCBzdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHNlbGYuY3dkID0gY3dkCisgICAgICAgIHNlbGYuZW52ID0gZW52CisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmlzX3NlcnZlciA9IGlzX3NlcnZlcgorICAgICAgICBzZWxmLnJlcG9ydCA9IHJlcG9ydAorICAgICAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmtpbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvYyA9IE5vbmUKKworICAgIGRlZiBfcG9wZW5fYXJncyhzZWxmKToKKyAgICAgICAgYXJncyA9IHsKKyAgICAgICAgICAgICdjd2QnOiBzZWxmLmN3ZCwKKyAgICAgICAgICAgICdlbnYnOiBzZWxmLmVudiwKKyAgICAgICAgICAgICdzdGRvdXQnOiBzZWxmLnJlcG9ydC5vdXQsCisgICAgICAgICAgICAnc3RkZXJyJzogc3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgIH0KKyAgICAgICAgIyBtYWtlIHN1cmUgY2hpbGQgcHJvY2Vzc2VzIGRvZXNuJ3QgcmVtYWluIGFmdGVyIGtpbGxpbmcKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgREVUQUNIRURfUFJPQ0VTUyA9IDB4MDAwMDAwMDgKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKGNyZWF0aW9uZmxhZ3M9REVUQUNIRURfUFJPQ0VTUyB8IHN1YnByb2Nlc3MuQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCisgICAgICAgIHJldHVybiBhcmdzCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCisgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKKyAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgIFBJRDogJWQnLCBzZWxmLnByb2MucGlkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgIFBHSUQ6ICVkJywgb3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Njb3BlZCgpCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfc2NvcGVkKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKworICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKKworICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJldHVybmNvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByb2MucmV0dXJuY29kZSBpZiBzZWxmLnByb2MgZWxzZSBOb25lCisKKworZGVmIGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHByb2csIGlzX3NlcnZlcik6CisgICAgcmVwb3J0ID0gRXhlY1JlcG9ydGVyKGxvZ2RpciwgdGVzdCwgcHJvZykKKyAgICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKKyAgICByZXR1cm4gRXhlY3V0aW9uQ29udGV4dChwcm9nLmNvbW1hbmQsIHByb2cud29ya2RpciwgcHJvZy5lbnYsIHByb2cuc3RvcF9zaWduYWwsIGlzX3NlcnZlciwgcmVwb3J0KQorCisKK2RlZiBydW5fdGVzdCh0ZXN0ZGlyLCBsb2dkaXIsIHRlc3RfZGljdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPVRydWUpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKworICAgIGRlZiBlbnN1cmVfc29ja2V0X29wZW4oc3YsIHBvcnQsIHRlc3QpOgorICAgICAgICBzbGVwdCA9IDAuMQorICAgICAgICB0aW1lLnNsZWVwKHNsZXB0KQorICAgICAgICBzbGVlcF9zdGVwID0gMC4xCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzbGVwdCA+IHRlc3QuZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1t7MH1dIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBidXQgc2VydmVyIGlzIG5vdCBvcGVuJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHRlc3Quc29ja2V0ID09ICdkb21haW4nOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkb21haW5fc29ja2V0X3BhdGgocG9ydCkpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIGRvbWFpbih1bml4KSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgIGVsaWYgdGVzdC5zb2NrZXQgPT0gJ2Fic3RyYWN0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBzb2NrZXRzIGV2ZXJ5IGl0ZXJhdGlvbiBiZWNhdXNlIHJlZnVzZWQgc29ja2V0cyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgICAjIHJldXNlZCBvbiBzb21lIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgc29jazQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoZmFtaWx5PXNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNvY2s0LmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgPT0gMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc29jazYuY29ubmVjdF9leCgoJzo6MScsIHBvcnQpKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2VydmVyIHByb2Nlc3MgaXMgZXhpdGVkJy5mb3JtYXQoc3YucHJvYy5waWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc29ja2V0IG5vdCBhdmFpbGFibGUgeWV0LiBzbGVwdCBmb3IgezF9IHNlY29uZHMgc28gZmFyJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBzbGVwdCArPSBzbGVlcF9zdGVwCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIHNlcnZlciByZWFkeSAtIHdhaXRlZCBmb3IgezF9IHNlY29uZHMnLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHRyeToKKyAgICAgICAgbWF4X2JpbmRfcmV0cnkgPSAzCisgICAgICAgIHJldHJ5X2NvdW50ID0gMAorICAgICAgICBiaW5kX3JldHJ5X2NvdW50ID0gMAorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHRlc3RkaXIsICoqdGVzdF9kaWN0KQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc3RvcC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGJlY2F1c2Ugc2h1dHRpbmcgZG93bicpCisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgTm9uZSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnQnKQorICAgICAgICAgICAgd2l0aCBQb3J0QWxsb2NhdG9yLmFsbG9jX3BvcnRfc2NvcGVkKHBvcnRzLCB0ZXN0LnNvY2tldCkgYXMgcG9ydDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQorICAgICAgICAgICAgICAgIHN2ID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5zZXJ2ZXIsIFRydWUpCisgICAgICAgICAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCB0ZXN0LmNsaWVudCwgRmFsc2UpCisKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHNlcnZlcicpCisgICAgICAgICAgICAgICAgd2l0aCBzdi5zdGFydCgpOgorICAgICAgICAgICAgICAgICAgICBwb3J0X29rID0gZW5zdXJlX3NvY2tldF9vcGVuKHN2LCBwb3J0LCB0ZXN0KQorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0X29rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb25uZWN0X3JldHJ5ID0gMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfd2FpdCA9IDAuMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdub3Qgc3RhcnRpbmcgY2xpZW50IGJlY2F1c2Ugc2VydmVyIHByb2Nlc3MgaXMgYWJzZW50JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIGNsaWVudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQgKHVwIHRvICVkIHNlY3MpJyAlIHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC53YWl0KHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY29ubmVjdF9yZXRyeV9jb3VudCA+PSBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ubmVjdF9yZXRyeV9jb3VudCA+IDAgYW5kIGNvbm5lY3RfcmV0cnlfY291bnQgPCBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjb25uZWN0X3JldHJ5X2NvdW50LCBjb25uZWN0X3JldHJ5X3dhaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIDUwbXMgdG8gc2VlIGlmIHNlcnZlciBkb2VzIG5vdCBkaWUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2VydmVyIG1heSBub3QgYmUgcmVhZHksIHdhaXRpbmcgJS4yZiBzZWNvbmQuLi4nICUgY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgKz0gMQorCisgICAgICAgICAgICBpZiBzdi5yZXBvcnQubWF5YmVfZmFsc2VfcG9zaXRpdmUoKSBhbmQgYmluZF9yZXRyeV9jb3VudCA8IG1heF9iaW5kX3JldHJ5OgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBEZXRlY3RlZCBzb2NrZXQgYmluZCBmYWlsdXJlLCByZXRyeWluZy4uLicsIHRlc3Quc2VydmVyLm5hbWUpCisgICAgICAgICAgICAgICAgYmluZF9yZXRyeV9jb3VudCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJFU1VMVF9USU1FT1VUIGlmIGNsLmV4cGlyZWQgZWxzZSBjbC5yZXR1cm5jb2RlIGlmIChjbC5wcm9jIGFuZCBjbC5wcm9jLnBvbGwoKSkgaXMgbm90IE5vbmUgZWxzZSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgICMgRm9yIHNlcnZlcnMgdGhhdCBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duIGJ5IHNpZ25hbAorICAgICAgICAgICAgICAgICMgaWYgdGhleSBhcmUga2lsbGVkLCBvciByZXR1cm4gYW4gZXJyb3IgY29kZSwgdGhhdCBpcyBhCisgICAgICAgICAgICAgICAgIyBwcm9ibGVtLiAgRm9yIHNlcnZlcnMgdGhhdCBhcmUgbm90IHNpZ25hbC1hd2FyZSwgd2Ugc2ltcGx5CisgICAgICAgICAgICAgICAgIyBraWxsIHRoZW0gb2ZmOyBpZiB3ZSBkaWRuJ3Qga2lsbCB0aGVtIG9mZiwgc29tZXRoaW5nIGVsc2UKKyAgICAgICAgICAgICAgICAjIGhhcHBlbmVkIChjcmFzaGVkPykKKyAgICAgICAgICAgICAgICBpZiB0ZXN0LnNlcnZlci5zdG9wX3NpZ25hbCAhPSAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzdi5raWxsZWQgb3Igc3YucmV0dXJuY29kZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN2LmtpbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSAwIG9yIHJldHJ5X2NvdW50ID49IG1heF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXMtJXNdOiB0ZXN0IGZhaWxlZCwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCArPSAxCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBsb2dnZXIud2FybignRXJyb3IgZXhlY3V0aW5nIFslc10nLCB0ZXN0Lm5hbWUsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKKyAgICBleGNlcHQ6CisgICAgICAgIGxvZ2dlci5pbmZvKCdJbnRlcnJ1cHRlZCBleGVjdXRpb24nLCBleGNfaW5mbz1UcnVlKQorICAgICAgICBpZiBub3QgYXN5bmNfbW9kZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHN0b3Auc2V0KCkKKyAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgUkVTVUxUX0VSUk9SKQorCisKK2NsYXNzIFBvcnRBbGxvY2F0b3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9kb21fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gMAorCisgICAgZGVmIF9nZXRfdGNwX3BvcnQoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc29jay5iaW5kKCgnJywgMCkpCisgICAgICAgIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9wb3J0cworICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9hbGxvYyA9IHRpbWUudGltZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKworICAgIGRlZiBfZ2V0X2RvbWFpbl9wb3J0KHNlbGYpOgorICAgICAgICBwb3J0ID0gcmFuZG9tLnJhbmRpbnQoMTAyNCwgNjU1MzYpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fZG9tX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCisKKyAgICBkZWYgYWxsb2NfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIGlmIHNvY2tldF90eXBlIGluICgnZG9tYWluJywgJ2Fic3RyYWN0Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfdGNwX3BvcnQoKQorCisgICAgIyBzdGF0aWMgbWV0aG9kIGZvciBpbnRlci1wcm9jZXNzIGludm9rYXRpb24KKyAgICBAc3RhdGljbWV0aG9kCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgYWxsb2NfcG9ydF9zY29wZWQoYWxsb2NhdG9yLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIHBvcnQgPSBhbGxvY2F0b3IuYWxsb2NfcG9ydChzb2NrZXRfdHlwZSkKKyAgICAgICAgeWllbGQgcG9ydAorICAgICAgICBhbGxvY2F0b3IuZnJlZV9wb3J0KHNvY2tldF90eXBlLCBwb3J0KQorCisgICAgZGVmIGZyZWVfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSwgcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZV9wb3J0JykKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgICAgIHBhdGggPSBkb21haW5fc29ja2V0X3BhdGgocG9ydCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBlbGlmIHNvY2tldF90eXBlID09ICdhYnN0cmFjdCc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnRXJyb3Igd2hpbGUgZnJlZWluZyBwb3J0JywgZXhjX2luZm89c3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisKK2NsYXNzIE5vbkFzeW5jUmVzdWx0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIGdldChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkeShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdWNjZXNzZnVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUgPT0gMAorCisKK2NsYXNzIFRlc3REaXNwYXRjaGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5KToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX3JlcG9ydCA9IFN1bW1hcnlSZXBvcnRlcihiYXNlZGlyLCBsb2dkaXJfcmVsLCBjb25jdXJyZW5jeSA+IDEpCisgICAgICAgIHNlbGYubG9nZGlyID0gc2VsZi5fcmVwb3J0LnRlc3RkaXIKKyAgICAgICAgIyBzZWVtcyBuZWVkZWQgZm9yIHB5dGhvbiAyLnggdG8gaGFuZGxlIGtleWJvYXJkIGludGVycnVwdAorICAgICAgICBzZWxmLl9zdG9wID0gbXVsdGlwcm9jZXNzaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fYXN5bmMgPSBjb25jdXJyZW5jeSA+IDEKKyAgICAgICAgaWYgbm90IHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IE5vbmUKKyAgICAgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgICAgICBnbG9iYWwgcG9ydHMKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgICAgICBwb3J0cyA9IFBvcnRBbGxvY2F0b3IoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcigpCisgICAgICAgICAgICBzZWxmLl9tLnJlZ2lzdGVyKCdwb3J0cycsIFBvcnRBbGxvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9tLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChjb25jdXJyZW5jeSwgc2VsZi5fcG9vbF9pbml0LCAoc2VsZi5fbS5hZGRyZXNzLCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygKKyAgICAgICAgICAgICdUZXN0RGlzcGF0Y2hlciBzdGFydGVkIHdpdGggJWQgY29uY3VycmVudCBqb2JzJyAlIGNvbmN1cnJlbmN5KQorCisgICAgZGVmIF9wb29sX2luaXQoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgIGdsb2JhbCBtCisgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICBzdG9wID0gc2VsZi5fc3RvcAorICAgICAgICBtID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKGFkZHJlc3MpCisgICAgICAgIG0uY29ubmVjdCgpCisgICAgICAgIHBvcnRzID0gbS5wb3J0cygpCisKKyAgICBkZWYgX2Rpc3BhdGNoX3N5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgciA9IHJ1bl90ZXN0KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1GYWxzZSkKKyAgICAgICAgY29udChyKQorICAgICAgICByZXR1cm4gTm9uQXN5bmNSZXN1bHQocikKKworICAgIGRlZiBfZGlzcGF0Y2hfYXN5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdfZGlzcGF0Y2hfYXN5bmMnKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9vbC5hcHBseV9hc3luYyhmdW5jPXJ1bl90ZXN0LCBhcmdzPShzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnkpLCBjYWxsYmFjaz1jb250KQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIHRlc3QsIG1heF9yZXRyeSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5fcmVwb3J0LmFkZF90ZXN0KHRlc3QpCisKKyAgICAgICAgZGVmIGNvbnQocmVzdWx0KToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdG9wLmlzX3NldCgpOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBhbmQgbGVuKHJlc3VsdCkgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQsIHJldHVybmNvZGUgPSByZXN1bHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuY29kZSA9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZWluZyBwb3J0JykKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2FkZGluZyByZXN1bHQnKQorICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydC5hZGRfcmVzdWx0KGluZGV4LCByZXR1cm5jb2RlLCByZXR1cm5jb2RlID09IFJFU1VMVF9USU1FT1VULCByZXRyeV9jb3VudCkKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZpbmlzaCBjb250aW51YXRpb24nKQorICAgICAgICBmbiA9IHNlbGYuX2Rpc3BhdGNoX2FzeW5jIGlmIHNlbGYuX2FzeW5jIGVsc2Ugc2VsZi5fZGlzcGF0Y2hfc3luYworICAgICAgICByZXR1cm4gZm4odGVzdCwgY29udCwgbWF4X3JldHJ5KQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnQuZW5kKCkKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuX3N0b3Auc2V0KCkKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZyBiL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkxMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CkBAIC0wLDAgKzEsMTQ5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSAuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QsIGRvbWFpbl9zb2NrZXRfcGF0aAorCisKK2NsYXNzIFRlc3RQcm9ncmFtKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtpbmQsIG5hbWUsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgd29ya2Rpciwgc3RvcF9zaWduYWwsIGNvbW1hbmQsIGVudj1Ob25lLAorICAgICAgICAgICAgICAgICBleHRyYV9hcmdzPVtdLCBleHRyYV9hcmdzMj1bXSwgam9pbl9hcmdzPUZhbHNlLCAqKmt3YXJncyk6CisKKyAgICAgICAgc2VsZi5raW5kID0ga2luZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAorICAgICAgICBzZWxmLndvcmtkaXIgPSB3b3JrZGlyCisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYuX2Jhc2VfY29tbWFuZCA9IHNlbGYuX2ZpeF9jbWRfcGF0aChjb21tYW5kKQorICAgICAgICBpZiBlbnY6CisgICAgICAgICAgICBzZWxmLmVudiA9IGNvcHkuY29weShvcy5lbnZpcm9uKQorICAgICAgICAgICAgc2VsZi5lbnYudXBkYXRlKGVudikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW52ID0gb3MuZW52aXJvbgorICAgICAgICBzZWxmLl9leHRyYV9hcmdzID0gZXh0cmFfYXJncworICAgICAgICBzZWxmLl9leHRyYV9hcmdzMiA9IGV4dHJhX2FyZ3MyCisgICAgICAgIHNlbGYuX2pvaW5fYXJncyA9IGpvaW5fYXJncworCisgICAgZGVmIF9maXhfY21kX3BhdGgoc2VsZiwgY21kKToKKyAgICAgICAgIyBpZiB0aGUgYXJnIGlzIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG1ha2UgaXQgcGF0aAorICAgICAgICBkZWYgYWJzX2lmX2V4aXN0cyhhcmcpOgorICAgICAgICAgICAgcCA9IHBhdGhfam9pbihzZWxmLndvcmtkaXIsIGFyZykKKyAgICAgICAgICAgIHJldHVybiBwIGlmIG9zLnBhdGguZXhpc3RzKHApIGVsc2UgYXJnCisKKyAgICAgICAgaWYgY21kWzBdID09ICdweXRob24nOgorICAgICAgICAgICAgY21kWzBdID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZFswXSA9IGFic19pZl9leGlzdHMoY21kWzBdKQorICAgICAgICByZXR1cm4gY21kCisKKyAgICBkZWYgX3NvY2tldF9hcmdzKHNlbGYsIHNvY2tldCwgcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnaXAtc3NsJzogWyctLXNzbCddLAorICAgICAgICAgICAgJ2RvbWFpbic6IFsnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KV0sCisgICAgICAgICAgICAnYWJzdHJhY3QnOiBbJy0tYWJzdHJhY3QtbmFtZXNwYWNlJywgJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICB9LmdldChzb2NrZXQsIE5vbmUpCisKKyAgICBkZWYgX3RyYW5zcG9ydF9hcmdzKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnemxpYic6IFsnLS16bGliJ10sCisgICAgICAgIH0uZ2V0KHRyYW5zcG9ydCwgTm9uZSkKKworICAgIGRlZiBidWlsZF9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBjbWQgPSBjb3B5LmNvcHkoc2VsZi5fYmFzZV9jb21tYW5kKQorICAgICAgICBhcmdzID0gY29weS5jb3B5KHNlbGYuX2V4dHJhX2FyZ3MyKQorICAgICAgICBhcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0nICsgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PScgKyBzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgdHJhbnNwb3J0X2FyZ3MgPSBzZWxmLl90cmFuc3BvcnRfYXJncyhzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgaWYgdHJhbnNwb3J0X2FyZ3M6CisgICAgICAgICAgICBhcmdzICs9IHRyYW5zcG9ydF9hcmdzCisgICAgICAgIHNvY2tldF9hcmdzID0gc2VsZi5fc29ja2V0X2FyZ3Moc2VsZi5zb2NrZXQsIHBvcnQpCisgICAgICAgIGlmIHNvY2tldF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSBzb2NrZXRfYXJncworICAgICAgICBhcmdzLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpCisgICAgICAgIGlmIHNlbGYuX2pvaW5fYXJnczoKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyVzJyAlICIgIi5qb2luKGFyZ3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kLmV4dGVuZChhcmdzKQorICAgICAgICBpZiBzZWxmLl9leHRyYV9hcmdzOgorICAgICAgICAgICAgY21kLmV4dGVuZChzZWxmLl9leHRyYV9hcmdzKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjbWQKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZAorCisKK2NsYXNzIFRlc3RFbnRyeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBzZXJ2ZXIsIGNsaWVudCwgZGVsYXksIHRpbWVvdXQsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2NvbmZpZyA9IGt3YXJncworICAgICAgICBzZWxmLnByb3RvY29sID0ga3dhcmdzWydwcm90b2NvbCddCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0ga3dhcmdzWyd0cmFuc3BvcnQnXQorICAgICAgICBzZWxmLnNvY2tldCA9IGt3YXJnc1snc29ja2V0J10KKyAgICAgICAgc3J2X2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgc2VydmVyKSkKKyAgICAgICAgY2xpX2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgY2xpZW50KSkKKyAgICAgICAgY2xpX2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBzcnZfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNydl9kaWN0WydleHRyYV9hcmdzMiddID0gY2xpX2RpY3QucG9wKCdyZW1vdGVfYXJncycsIFtdKQorICAgICAgICBzZWxmLnNlcnZlciA9IFRlc3RQcm9ncmFtKCdzZXJ2ZXInLCAqKnNydl9kaWN0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRlc3RQcm9ncmFtKCdjbGllbnQnLCAqKmNsaV9kaWN0KQorICAgICAgICBzZWxmLmRlbGF5ID0gZGVsYXkKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLl9uYW1lID0gTm9uZQorICAgICAgICAjIHJlc3VsdHMKKyAgICAgICAgc2VsZi5zdWNjZXNzID0gTm9uZQorICAgICAgICBzZWxmLmFzX2V4cGVjdGVkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucmV0cnlfY291bnQgPSAwCisKKyAgICBkZWYgX2ZpeF93b3JrZGlyKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGtleSA9ICd3b3JrZGlyJworICAgICAgICBwYXRoID0gY29uZmlnLmdldChrZXksIE5vbmUpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdGRpcgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGgpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIHBhdGgpKQorICAgICAgICBjb25maWcudXBkYXRlKHtrZXk6IHBhdGh9KQorICAgICAgICByZXR1cm4gY29uZmlnCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZ2V0X25hbWUoY2xzLCBzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gJyVzLSVzXyVzXyVzLSVzJyAlIChzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uYW1lOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHNlbGYuZ2V0X25hbWUoCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIubmFtZSwgc2VsZi5jbGllbnQubmFtZSwgc2VsZi5wcm90b2NvbCwgc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRyYW5zcG9ydF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzLSVzJyAlIChzZWxmLnRyYW5zcG9ydCwgc2VsZi5zb2NrZXQpCisKKworZGVmIHRlc3RfbmFtZShzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqKmt3YXJncyk6CisgICAgcmV0dXJuIFRlc3RFbnRyeS5nZXRfbmFtZShzZXJ2ZXJbJ25hbWUnXSwgY2xpZW50WyduYW1lJ10sIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE0ZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29weQorCisKK2RlZiBkb21haW5fc29ja2V0X3BhdGgocG9ydCk6CisgICAgcmV0dXJuICcvdG1wL1RocmlmdFRlc3QudGhyaWZ0LiVkJyAlIHBvcnQKKworCitkZWYgbWVyZ2VfZGljdChiYXNlLCB1cGRhdGUpOgorICAgICIiIlVwZGF0ZSBkaWN0IGNvbmNhdGVuYXRpbmcgbGlzdCB2YWx1ZXMiIiIKKyAgICByZXMgPSBjb3B5LmRlZXBjb3B5KGJhc2UpCisgICAgZm9yIGssIHYgaW4gbGlzdCh1cGRhdGUuaXRlbXMoKSk6CisgICAgICAgIGlmIGsgaW4gbGlzdChyZXMua2V5cygpKSBhbmQgaXNpbnN0YW5jZSh2LCBsaXN0KToKKyAgICAgICAgICAgIHJlc1trXS5leHRlbmQodikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc1trXSA9IHYKKyAgICByZXR1cm4gcmVzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDk1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworR0VORVJBVEVEID0gXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9uay5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb29scy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb29sVGVzdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9DcmF6eU5lc3RpbmcuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvRW1wdHlTdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvR3Vlc3NQcm90b2NvbFN0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9JbnNhbml0eS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MYXJnZURlbHRhcy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0Qm9ua3MuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdFR5cGVWZXJzaW9uaW5nVjEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdFR5cGVWZXJzaW9uaW5nVjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNCb25rLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzSTMyeDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNJMzJ4My5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRNaXhlZHgyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L051bWJlcnouY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvT25lRmllbGQuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU2Vjb25kU2VydmljZS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TdHJ1Y3RBLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1N0cnVjdEIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVGhyaWZ0VGVzdC5Db25zdGFudHMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVGhyaWZ0VGVzdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9WZXJzaW9uaW5nVGVzdFYxLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1ZlcnNpb25pbmdUZXN0VjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWGNlcHRpb24uY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWGNlcHRpb24yLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdDMuY3MKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORVJBVEVEKQorCitpZiBNT05PX01DUworQ1NDID0gbWNzCitlbHNlCitDU0MgPSBnbWNzCitlbmRpZgorCitpZiBORVRfMl8wCitDU0NfREVGSU5FUyA9IC1kOk5FVF8yXzAKK2VuZGlmCisKK0xJQkRJUiA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3NoYXJwCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyQoR0VORVJBVEVEKTogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgLW8gLiAkPAorCitwcmVjcm9zczogVGVzdENsaWVudFNlcnZlci5leGUKKworVGhyaWZ0SW1wbC5kbGw6ICQoR0VORVJBVEVEKSAkKExJQkRJUikvVGhyaWZ0LmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtdDpsaWJyYXJ5IC1vdXQ6JEAgLXJlZmVyZW5jZTokKExJQkRJUikvVGhyaWZ0LmRsbCAkKEdFTkVSQVRFRCkKKworU1JDUyA9IFRlc3RDbGllbnQuY3MgVGVzdFNlcnZlci5jcyBQcm9ncmFtLmNzCisKK1Rlc3RDbGllbnRTZXJ2ZXIuZXhlOiAkKFNSQ1MpIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTokKExJQkRJUikvVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQoU1JDUykKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jc2hhcnAgKi5leGUgKi5kbGwKKworVEVTVFBPUlQgPSA5NTAwCitjaGVjay1sb2NhbDogVGVzdENsaWVudFNlcnZlci5leGUKKwlNT05PX1BBVEg9JChMSUJESVIpIHRpbWVvdXQgMTAgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBzZXJ2ZXIgLS1wb3J0PSQoVEVTVFBPUlQpICYKKwlzbGVlcCAxCisJTU9OT19QQVRIPSQoTElCRElSKSBtb25vIFRlc3RDbGllbnRTZXJ2ZXIuZXhlIGNsaWVudCAtLXBvcnQ9JChURVNUUE9SVCkKKworRVhUUkFfRElTVCA9IFwKKwlQcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisJVGhyaWZ0VGVzdC5jc3Byb2ogXAorCVRocmlmdFRlc3Quc2xuIFwKKwlQcm9ncmFtLmNzIFwKKwlUZXN0U2VydmVyLmNzIFwKKwlUZXN0Q2xpZW50LmNzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzIGIvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWMwMGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQorCituYW1lc3BhY2UgVGVzdAoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5TZXRCdWZmZXJTaXplKENvbnNvbGUuQnVmZmVyV2lkdGgsIDQwOTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRmFpbGVkIHRvIGdyb3cgc2Nyb2xsLWJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZ1tdIHN1YkFyZ3MgPSBuZXcgc3RyaW5nW2FyZ3MuTGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdWJBcmdzW2ktMV0gPSBhcmdzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT0gImNsaWVudCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbMF0gPT0gInNlcnZlciIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKSA/IDAgOiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlICdzZXJ2ZXInIG9yICdjbGllbnQnIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMDFhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRUZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZjQxYjE5M2ItZjFhYi00OGVlLTg4NDMtZjg4ZTQzMDg0ZTI2IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWMwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsODcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOworCituYW1lc3BhY2UgVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdFBhcmFtcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIHN0cmluZyB1cmw7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHBpcGU7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBidWZmZXJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGZyYW1lZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvdG9jb2w7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBlbmNyeXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIG11bHRpcGxleGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNGaXJzdFRyYW5zcG9ydCA9IHRydWU7CisKKworICAgICAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNlcnRQYXRoID0gIi4uL2tleXMvY2xpZW50LnAxMiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0UGF0aCwgInRocmlmdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTb2NrZXQoaG9zdCwgcG9ydCwgMCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLCBjLCBjaGFpbiwgZXJyb3JzKSA9PiB0cnVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX2lzRmlyc3RUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZW5zdXJlIHByb3BlciBvcGVuL2Nsb3NlIG9mIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuT3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pc0ZpcnN0VHJhbnNwb3J0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KG5ldyBVcmkodXJsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIENyZWF0ZVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAiY29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvY29sID09ICJqc29uIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQmFzZVR5cGVzID0gMTsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JTdHJ1Y3RzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JDb250YWluZXJzID0gNDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JFeGNlcHRpb25zID0gODsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JQcm90b2NvbCA9IDE2OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclVua25vd24gPSA2NDsKKworICAgICAgICBwcml2YXRlIGNsYXNzIENsaWVudFRlc3QKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUZXN0UGFyYW1zIHBhcmFtOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW1pbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHBhcmFtaW47CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcGFyYW0uQ3JlYXRlUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0ubXVsdGlwbGV4ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmQgPSBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gcGFyYW0ubnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4ZWN1dGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEV4ZWN1dGVDbGllbnRUZXN0KGNsaWVudCwgc2Vjb25kLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlIGNsb3NpbmcgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXN0UGFyYW1zIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtVGhyZWFkcyA9IDE7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItdSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLm51bUl0ZXJhdGlvbnMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIDxuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnBpcGUgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIG5hbWVkIHBpcGVzIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1ob3N0PSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmhvc3QgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikrMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5idWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPW11bHRpYyIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucHJvdG9jb2wgPSAiY29tcGFjdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPW11bHRpaiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucHJvdG9jb2wgPSAianNvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIEpTT04gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBlbmNyeXB0ZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcHJvdG9jb2w9bXVsdGkiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5tdWx0aXBsZXhlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgIHBhcnNpbmcgYXJndW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gRW51bWVyYWJsZS5SYW5nZSgwLCBudW1UaHJlYWRzKS5TZWxlY3QoXyA9PiBuZXcgQ2xpZW50VGVzdChwYXJhbSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUaHJlYWQodGVzdC5FeGVjdXRlKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LkpvaW4oKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0LCBib29sIGh1Z2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGh1Z2UgPSB0cnVlIHRlc3RzIGZvciBUSFJJRlQtNDM3MgorICAgICAgICAgICAgYnl0ZVtdIHJldHZhbCA9IG5ldyBieXRlW2h1Z2UgPyAweDEyMzQ1IDogMHgxMDBdOworICAgICAgICAgICAgaW50IGluaXRMZW4gPSByZXR2YWwuTGVuZ3RoOworCisgICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZUNsaWVudFRlc3QoVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50LCBTZWNvbmRTZXJ2aWNlLkNsaWVudCBzZWNvbmQsIFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gMDsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgICAgICAgICAgc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgIGlmICgiVGVzdCIgIT0gcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0ubXVsdGlwbGV4ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInNlY29uZFRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgICAgICAgIHMgPSBzZWNvbmQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgICAgaWYgKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiICE9IHMpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclByb3RvY29sOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICBib29sIHQgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpdHJ1ZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOworICAgICAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbChmYWxzZSkiKTsKKyAgICAgICAgICAgIGJvb2wgZiA9IGNsaWVudC50ZXN0Qm9vbCgoYm9vbClmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGYpOworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgICAgIHNieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChzYnl0ZSkxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOworICAgICAgICAgICAgaWYgKDEgIT0gaTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEkzMigtMSkiKTsKKyAgICAgICAgICAgIGludCBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGkzMik7CisgICAgICAgICAgICBpZiAoLTEgIT0gaTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgICAgICAgbG9uZyBpNjQgPSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpNjQpOworICAgICAgICAgICAgaWYgKC0zNDM1OTczODM2OCAhPSBpNjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgICAgIGRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoNS4zMjUwOTgyMzUgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkiKTsKKyAgICAgICAgICAgIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzMiA9IDA7IGkzMiA8IDI7ICsraTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBodWdlID0gKGkzMiA+IDApOworICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEoZmFsc2UsaHVnZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW4uTGVuZ3RoICE9IGJpbk91dC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5JbltvZnNdICE9IGJpbk91dFtvZnNdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIGlmKCB0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpLkRlY2xhcmluZ1R5cGUgPT0gdHlwZW9mKENyYXp5TmVzdGluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBDcmF6eU5lc3RpbmcgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgICAgIG9uZS5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgICAgICBpZiAoIW9uZS5FcXVhbHModHdvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQ29udGFpbmVyczsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ3JhenlOZXN0aW5nLkVxdWFscyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgICAgICAgWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICBvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICAgICAgICAgIG8uQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgby5JMzJfdGhpbmcgPSAtMzsKKyAgICAgICAgICAgIG8uSTY0X3RoaW5nID0gLTU7CisgICAgICAgICAgICBYdHJ1Y3QgaSA9IGNsaWVudC50ZXN0U3RydWN0KG8pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9KSIpOworICAgICAgICAgICAgWHRydWN0MiBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgICAgICBvMi5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvMi5TdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICAgICAgbzIuSTMyX3RoaW5nID0gNTsKKyAgICAgICAgICAgIFh0cnVjdDIgaTIgPSBjbGllbnQudGVzdE5lc3QobzIpOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcG91dCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFwb3V0W2pdID0gaiAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcCh7Iik7CisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbWFwaW4uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcGluW2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RvdXQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBsaXN0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBMaXN0PGludD4gbGlzdGluID0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBsaXN0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vc2V0CisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBUSGFzaFNldDxpbnQ+IHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBUSGFzaFNldDxpbnQ+IHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oT05FKSIpOworICAgICAgICAgICAgTnVtYmVyeiByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouT05FICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRXTyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVEhSRUUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5GSVZFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5FSUdIVCAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgICAgIGxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7CisgICAgICAgICAgICBYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICB0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgICAgICAgICAgdHJ1Y2suQnl0ZV90aGluZyA9IChzYnl0ZSk4OworICAgICAgICAgICAgdHJ1Y2suSTMyX3RoaW5nID0gODsKKyAgICAgICAgICAgIHRydWNrLkk2NF90aGluZyA9IDg7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzLkFkZCh0cnVjayk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGxvbmcga2V5IGluIHdob2EuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiB2YWwgPSB3aG9hW2tleV07CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazIgaW4gdmFsLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbFtrMl07CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4geyIpOworICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+IHVzZXJNYXAgPSB2Mi5Vc2VyTWFwOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoTnVtYmVyeiBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWHRydWN0IHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgaW50IGFyZzEgPSAyOworICAgICAgICAgICAgbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIG11bHRpRGljdFsxXSA9ICJvbmUiOworICAgICAgICAgICAgTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICAgICAgbG9uZyBhcmc1ID0gNTAwMDAwMDsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIFh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwib2tcIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigib2siKTsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24yIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMjAwMiB8fCBleC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJPS1wiKSIpOworICAgICAgICAgICAgICAgIGlmICgiT0siICE9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oInN1Y2Nlc3MiLCAiT0siKS5TdHJpbmdfdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdG9wd2F0Y2ggc3cgPSBuZXcgU3RvcHdhdGNoKCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgT25ld2F5KDEpIik7CisgICAgICAgICAgICBjbGllbnQudGVzdE9uZXdheSgxKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIGlmIChzdy5FbGFwc2VkTWlsbGlzZWNvbmRzID4gMTAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciB0aW1lcyA9IDUwOworICAgICAgICAgICAgc3cuUmVzZXQoKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHRpbWVzOyArK2spCisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gezB9IG1zIGEgdGVzdFZvaWQoKSBjYWxsIiwgc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyAvIHRpbWVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGVzdFNlcnZlci5jcyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2NDVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOworCituYW1lc3BhY2UgVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBfY2xpZW50SUQgPSAtMTsKKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgVGVzdExvZ0RlbGVnYXRlKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpOworCisgICAgICAgIHB1YmxpYyBjbGFzcyBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBjYWxsQ291bnQgPSAwOworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QuSWZhY2UsIFRocmlmdC5UQ29udHJvbGxpbmdIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcmV1c2FibGVTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHByaXZhdGUgVGVzdExvZ0RlbGVnYXRlIHRlc3RMb2dEZWxlZ2F0ZTsKKworICAgICAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySUQgPSBJbnRlcmxvY2tlZC5JbmNyZW1lbnQocmVmIF9jbGllbnRJRCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlICs9IHRlc3RDb25zb2xlTG9nZ2VyOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoIk5ldyBUZXN0SGFuZGxlciBpbnN0YW5jZSBjcmVhdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zb2xlTG9nZ2VyKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiaGFuZGxlcnswOkQzfToiLGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdChtc2csIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZExpbmUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCByZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJpbmcoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIHRlc3RCb29sKGJvb2wgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzYnl0ZSB0ZXN0Qnl0ZShzYnl0ZSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0Qnl0ZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0STMyKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RG91YmxlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIHRlc3RCaW5hcnkoYnl0ZVtdIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCaW5hcnkoezA6WH0pIiwgaGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgdGhpbmcgPSBuZXN0LlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TmVzdCh7e3swfSwge3tcInsxfVwiLCB7Mn0sIHszfSwgezR9LCB7NX19fX19KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5JMzJfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0TWFwKHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGVzdFN0cmluZ01hcChEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVEhhc2hTZXQ8aW50PiB0ZXN0U2V0KFRIYXNoU2V0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFNldCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0TGlzdCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RFbnVtKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RUeXBlZGVmKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtYXBtYXAgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4oKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IHBvcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcG1hcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5zYW5pdHkKKyAgICAgICAgICAgIC8vIHJldHVybnM6CisgICAgICAgICAgICAvLyB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgLy8gICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICB9LAorICAgICAgICAgICAgLy8gICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEluc2FuaXR5KCkiKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IGluc2FuZSA9CisgICAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4oKTsKKyAgICAgICAgICAgICAgICBpbnNhbmVbKGxvbmcpMV0gPSBmaXJzdF9tYXA7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTJdID0gc2Vjb25kX21hcDsKKworICAgICAgICAgICAgICAgIHJldHVybiBpbnNhbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKHNieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE11bHRpKCkiKTsKKworICAgICAgICAgICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOworICAgICAgICAgICAgICAgIGhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICAgICAgICAgIGhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICAgICAgICAgIGhlbGxvLkkzMl90aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGVsbG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAgICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICAgICAgICAgICogaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgICAgICAgICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAgICAgICAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RXhjZXB0aW9uKHswfSkiLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aUV4Y2VwdGlvbih7MH0sIHsxfSkiLCBhcmcwLGFyZzEpOworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24yIHggPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMjAwMjsKKyAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuU3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IGFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0T25ld2F5KHswfSksIHNsZWVwaW5nLi4uIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvLyBjbGFzcyBUZXN0SGFuZGxlcgorCisgICAgICAgIHByaXZhdGUgZW51bSBTZXJ2ZXJUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTaW1wbGVTZXJ2ZXIsCisgICAgICAgICAgICBUVGhyZWFkZWRTZXJ2ZXIsCisgICAgICAgICAgICBUVGhyZWFkUG9vbFNlcnZlciwKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBQcm9jZXNzb3JGYWN0b3J5VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZSwgdXNlRnJhbWVkID0gZmFsc2UsIHVzZUVuY3J5cHRpb24gPSBmYWxzZSwgY29tcGFjdCA9IGZhbHNlLCBqc29uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UU2ltcGxlU2VydmVyOworICAgICAgICAgICAgICAgIFByb2Nlc3NvckZhY3RvcnlUeXBlIHByb2Nlc3NvckZhY3RvcnlUeXBlID0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFNpbmdsZXRvblByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgICAgIHN0cmluZyBwaXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXBpcGUiKSAgLy8gLXBpcGUgbmFtZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRlZCIgfHwgYXJnc1tpXSA9PSAiLS1zZXJ2ZXItdHlwZT10aHJlYWRlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRUaHJlYWRlZFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZHBvb2wiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tcHJvdG90eXBlIiB8fCBhcmdzW2ldID09ICItLXByb2Nlc3Nvcj1wcm90b3R5cGUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodXNlRW5jcnlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNlcnRQYXRoID0gIi4uL2tleXMvc2VydmVyLnAxMiI7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cywgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTc2xQcm90b2NvbHMuVGxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG87CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhY3QpCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpzb24pCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NvckZhY3RvcnlUeXBlID09IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTxUaHJpZnRUZXN0LlByb2Nlc3NvciwgVGVzdEhhbmRsZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSh0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUZyYW1lZCkKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlcnZlclR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZFBvb2xTZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIHNlcnZlckV2ZW50cyA9IG5ldyBUcmFkZVNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKworICAgICAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgICAgIHN0cmluZyB3aGVyZSA9IChwaXBlICE9IG51bGwgPyAib24gcGlwZSAiICsgcGlwZSA6ICJvbiBwb3J0ICIgKyBwb3J0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlICIgKyBzZXJ2ZXJUeXBlLlRvU3RyaW5nKCkgKyAiICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSA/ICIgd2l0aCBwcm9jZXNzb3IgcHJvdG90eXBlIGZhY3RvcnkgIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChjb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKGpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAiLi4uIik7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvaiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjI5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpAQCAtMCwwICsxLDE0MSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdFRlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRUZXN0PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cVGhyaWZ0VGVzdC50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CiskKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cbGliXGNzaGFycFxiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NWEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuCkBAIC0wLDAgKzEsMTcgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYzY2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvZ3JhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCi0vLwotLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgotLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0JY2xhc3MgUHJvZ3JhbQotCXsKLQkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQotCQl7Ci0JCQlpZiAoYXJncy5MZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKLQkJCWZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotCQkJewotCQkJCXN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07Ci0JCQl9Ci0JCQlpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKLQkJCXsKLQkJCQlUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQotCQkJewotCQkJCVRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGNhOGQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRUZXN0IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdFRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoImY0MWIxOTNiLWYxYWItNDhlZS04ODQzLWY4OGU0MzA4NGUyNiIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZmM5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwotdXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5UZXN0OwotCi1uYW1lc3BhY2UgVGVzdAotewotCXB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50Ci0JewotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtSXRlcmF0aW9ucyA9IDE7Ci0KLQkJcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKLQkJCQlpbnQgcG9ydCA9IDkwOTA7Ci0JCQkJc3RyaW5nIHVybCA9IG51bGw7Ci0JCQkJaW50IG51bVRocmVhZHMgPSAxOwotCQkJCWJvb2wgYnVmZmVyZWQgPSBmYWxzZSwgZnJhbWVkID0gZmFsc2U7Ci0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKGFyZ3NbaV0gPT0gIi1oIikKLQkJCQkJCXsKLQkJCQkJCQlzdHJpbmdbXSBob3N0cG9ydCA9IGFyZ3NbKytpXS5TcGxpdCgnOicpOwotCQkJCQkJCWhvc3QgPSBob3N0cG9ydFswXTsKLQkJCQkJCQlpZiAoaG9zdHBvcnQuTGVuZ3RoID4gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXBvcnQgPSBDb252ZXJ0LlRvSW50MzIoaG9zdHBvcnRbMV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGFyZ3NbaV0gPT0gIi11IikKLQkJCQkJCXsKLQkJCQkJCQl1cmwgPSBhcmdzWysraV07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItbiIpCi0JCQkJCQl7Ci0JCQkJCQkJbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi1idWZmZXJlZCIpCi0JCQkJCQl7Ci0JCQkJCQkJYnVmZmVyZWQgPSB0cnVlOwotCQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLWZyYW1lZCIpCi0JCQkJCQl7Ci0JCQkJCQkJZnJhbWVkID0gdHJ1ZTsKLQkJCQkJCQlDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQotCQkJCQkJewotCQkJCQkJCW51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlTGluZShlLlN0YWNrVHJhY2UpOwotCQkJCX0KLQotCi0KLQkJCQkvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLQkJCQlUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1UaHJlYWRzXTsKLQkJCQlEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKLQkJCQlmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLQkJCQl7Ci0JCQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFRocmVhZCkpOwotCQkJCQl0aHJlYWRzW3Rlc3RdID0gdDsKLQkJCQkJaWYgKHVybCA9PSBudWxsKQotCQkJCQl7Ci0JCQkJCQlUVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQkJCQlpZiAoYnVmZmVyZWQpCi0JCQkJCQkJdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIGFzIFRTdHJlYW1UcmFuc3BvcnQpOwotCQkJCQkJaWYgKGZyYW1lZCkKLQkJCQkJCQl0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKLQkJCQkJCQkKLQkJCQkJCXQuU3RhcnQodHJhbnMpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJVEh0dHBDbGllbnQgaHR0cCA9IG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOwotCQkJCQkJdC5TdGFydChodHRwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGhyZWFkczsgdGVzdCsrKQotCQkJCXsKLQkJCQkJdGhyZWFkc1t0ZXN0XS5Kb2luKCk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKLQkJCX0KLQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGhyZWFkKG9iamVjdCBvYmopCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFRUcmFuc3BvcnQpb2JqOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCi0JCQl7Ci0JCQkJQ2xpZW50VGVzdCh0cmFuc3BvcnQpOwotCQkJfQotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGVzdChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJewotCQkJVEJpbmFyeVByb3RvY29sIGJpbmFyeVByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotCi0JCQlUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQoYmluYXJ5UHJvdG9jb2wpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQotCQkJCXsKLQkJCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IERhdGVUaW1lLk5vdy5Ub0ZpbGVUaW1lKCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKLQkJCWNsaWVudC50ZXN0Vm9pZCgpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLQkJCXN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7Ci0JCQlieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7Ci0JCQlpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLQkJCWxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKLQkJCWRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotCQkJWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7Ci0JCQlvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKLQkJCW8uQnl0ZV90aGluZyA9IChieXRlKTE7Ci0JCQlvLkkzMl90aGluZyA9IC0zOwotCQkJby5JNjRfdGhpbmcgPSAtNTsKLQkJCVh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7Ci0JCQlYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKLQkJCW8yLkJ5dGVfdGhpbmcgPSAoYnl0ZSkxOwotCQkJbzIuU3RydWN0X3RoaW5nID0gbzsKLQkJCW8yLkkzMl90aGluZyA9IDU7Ci0JCQlYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKLQkJCWkgPSBpMi5TdHJ1Y3RfdGhpbmc7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOwotCi0JCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQotCQkJewotCQkJCW1hcG91dFtqXSA9IGogLSAxMDsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOwotCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLQkJCUxpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCWxpc3RvdXQuQWRkKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0JCQkvL3NldAotCQkJVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCXNldG91dC5BZGQoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKLQkJCU51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOwotCQkJcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKLQkJCWxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7Ci0JCQlEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7Ci0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07Ci0JCQkJZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCQkJSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0JCQlpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQlpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7Ci0JCQlYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0JCQl0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotCQkJdHJ1Y2suQnl0ZV90aGluZyA9IChieXRlKTg7Ci0JCQl0cnVjay5JMzJfdGhpbmcgPSA4OwotCQkJdHJ1Y2suSTY0X3RoaW5nID0gODsKLQkJCWluc2FuZS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOwotCQkJaW5zYW5lLlh0cnVjdHMuQWRkKHRydWNrKTsKLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJbnNhbml0eSgpIik7Ci0JCQlEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZm9yZWFjaCAobG9uZyBrZXkgaW4gd2hvYS5LZXlzKQotCQkJewotCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHZhbCA9IHdob2Fba2V5XTsKLQkJCQlDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOwotCi0JCQkJZm9yZWFjaCAoTnVtYmVyeiBrMiBpbiB2YWwuS2V5cykKLQkJCQl7Ci0JCQkJCUluc2FuaXR5IHYyID0gdmFsW2syXTsKLQotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7Ci0JCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4gdXNlck1hcCA9IHYyLlVzZXJNYXA7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAodXNlck1hcCAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChOdW1iZXJ6IGszIGluIHVzZXJNYXAuS2V5cykKLQkJCQkJCXsKLQkJCQkJCQlDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9LCAiKTsKLQotCQkJCQlMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLlh0cnVjdHM7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAoeHRydWN0cyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChYdHJ1Y3QgeCBpbiB4dHJ1Y3RzKQotCQkJCQkJewotCQkJCQkJCUNvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9Iik7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCi0JCQlieXRlIGFyZzAgPSAxOwotCQkJaW50IGFyZzEgPSAyOwotCQkJbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKLQkJCURpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKLQkJCW11bHRpRGljdFsxXSA9ICJvbmUiOwotCQkJTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOwotCQkJbG9uZyBhcmc1ID0gNTAwMDAwMDsKLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKLQkJCVh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZwotCQkJCQkJKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOwotCQkJY2xpZW50LnRlc3RPbmV3YXkoMSk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgQ2FsbHRpbWUoKSIpOwotCQkJdmFyIHN0YXJ0dCA9IERhdGVUaW1lLlV0Y05vdzsKLQkJCWZvciAoIGludCBrPTA7IGs8MTAwMDsgKytrICkKLQkJCQljbGllbnQudGVzdFZvaWQoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgKERhdGVUaW1lLlV0Y05vdyAtIHN0YXJ0dCkuVG90YWxTZWNvbmRzLlRvU3RyaW5nKCkgKyAiIG1zIGEgdGVzdFZvaWQoKSBjYWxsIiApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTRlYzljLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlNlcnZlcjsKLQotbmFtZXNwYWNlIFRlc3QKLXsKLQlwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgotCXsKLQkJcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdC5JZmFjZQotCQl7Ci0JCQlwdWJsaWMgVFNlcnZlciBzZXJ2ZXI7Ci0KLQkJCXB1YmxpYyBUZXN0SGFuZGxlcigpIHsgfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RWb2lkKCkiKTsKLQkJCX0KLQotCQkJcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdHN0cmluZyhcIiIgKyB0aGluZyArICJcIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RCeXRlKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IHRlc3RJMzIoaW50IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0STMyKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJNjQoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3REb3VibGUoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTdHJ1Y3QoeyIgKwotCQkJCQkJCQkgIlwiIiArIHRoaW5nLlN0cmluZ190aGluZyArICJcIiwgIiArCi0JCQkJCQkJCSB0aGluZy5CeXRlX3RoaW5nICsgIiwgIiArCi0JCQkJCQkJCSB0aGluZy5JMzJfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkk2NF90aGluZyArICJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KQotCQkJewotCQkJCVh0cnVjdCB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOwotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TmVzdCh7IiArCi0JCQkJCQkJCSBuZXN0LkJ5dGVfdGhpbmcgKyAiLCB7IiArCi0JCQkJCQkJCSAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotCQkJCQkJCQkgdGhpbmcuSTY0X3RoaW5nICsgIn0sICIgKwotCQkJCQkJCQkgbmVzdC5JMzJfdGhpbmcgKyAifSkiKTsKLQkJCQlyZXR1cm4gbmVzdDsKLQkJCX0KLQotCQkJcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNYXAoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKLQkJCQl7Ci0JCQkJCWlmIChmaXJzdCkKLQkJCQkJewotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGtleSArICIgPT4gIiArIHRoaW5nW2tleV0pOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdFNldCh7Iik7Ci0JCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQkJZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0JCQkJewotCQkJCQlpZiAoZmlyc3QpCi0JCQkJCXsKLQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdExpc3QoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotCQkJCXsKLQkJCQkJaWYgKGZpcnN0KQotCQkJCQl7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0JCQkJCX0KLQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOwotCQkJCURpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KLQkJCQkgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7Ci0KLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKLQkJCQl7Ci0JCQkJCXBvc1tpXSA9IGk7Ci0JCQkJCW5lZ1staV0gPSAtaTsKLQkJCQl9Ci0KLQkJCQltYXBtYXBbNF0gPSBwb3M7Ci0JCQkJbWFwbWFwWy00XSA9IG5lZzsKLQotCQkJCXJldHVybiBtYXBtYXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJbnNhbml0eSgpIik7Ci0KLQkJCQlYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0JCQkJaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0JCQkJaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0JCQkJaGVsbG8uSTMyX3RoaW5nID0gMjsKLQkJCQloZWxsby5JNjRfdGhpbmcgPSAyOwotCi0JCQkJWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0JCQkJZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotCQkJCWdvb2RieWUuQnl0ZV90aGluZyA9IChieXRlKTQ7Ci0JCQkJZ29vZGJ5ZS5JMzJfdGhpbmcgPSA0OwotCQkJCWdvb2RieWUuSTY0X3RoaW5nID0gKGxvbmcpNDsKLQotCQkJCUluc2FuaXR5IGNyYXp5ID0gbmV3IEluc2FuaXR5KCk7Ci0JCQkJY3JhenkuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQkJY3JhenkuVXNlck1hcFtOdW1iZXJ6LkVJR0hUXSA9IChsb25nKTg7Ci0JCQkJY3JhenkuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKLQkJCQljcmF6eS5YdHJ1Y3RzLkFkZChnb29kYnllKTsKLQotCQkJCUluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwotCQkJCWNyYXp5LlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IChsb25nKTU7Ci0JCQkJY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOwotCi0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7Ci0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOyA7Ci0KLQkJCQlmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gY3Jhenk7Ci0JCQkJZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gY3Jhenk7Ci0KLQkJCQlzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IGxvb25leTsKLQotCQkJCURpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IGluc2FuZSA9Ci0JCQkJICBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4oKTsKLQkJCQlpbnNhbmVbKGxvbmcpMV0gPSBmaXJzdF9tYXA7Ci0JCQkJaW5zYW5lWyhsb25nKTJdID0gc2Vjb25kX21hcDsKLQotCQkJCXJldHVybiBpbnNhbmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpKCkiKTsKLQotCQkJCVh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOwotCQkJCWhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotCQkJCWhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOwotCQkJCWhlbGxvLkkzMl90aGluZyA9IGFyZzE7Ci0JCQkJaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKLQkJCQlyZXR1cm4gaGVsbG87Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbigiICsgYXJnICsgIikiKTsKLQkJCQlpZiAoYXJnID09ICJYY2VwdGlvbiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMTAwMTsKLQkJCQkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKCIgKyBhcmcwICsgIiwgIiArIGFyZzEgKyAiKSIpOwotCQkJCWlmIChhcmcwID09ICJYY2VwdGlvbiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMTAwMTsKLQkJCQkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQkJCQllbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQotCQkJCXsKLQkJCQkJWGNlcHRpb24yIHggPSBuZXcgWGNlcHRpb24yKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMjAwMjsKLQkJCQkJeC5TdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7Ci0JCQkJCXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCi0JCQkJWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKLQkJCQlyZXN1bHQuU3RyaW5nX3RoaW5nID0gYXJnMTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpCi0JCQl7Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJc2VydmVyLlN0b3AoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IGFyZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSgiICsgYXJnICsgIiksIHNsZWVwaW5nLi4uIik7Ci0JCQkJU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKLQkJCX0KLQotCQl9IC8vIGNsYXNzIFRlc3RIYW5kbGVyCi0KLQkJcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZSwgdXNlRnJhbWVkID0gZmFsc2U7Ci0JCQkJaW50IHBvcnQgPSA5MDkwOwotCQkJCWlmIChhcmdzLkxlbmd0aCA+IDApCi0JCQkJewotCQkJCQlwb3J0ID0gaW50LlBhcnNlKGFyZ3NbMF0pOwotCi0JCQkJCWlmIChhcmdzLkxlbmd0aCA+IDEpCi0JCQkJCXsKLQkJCQkJCWlmICggYXJnc1sxXSA9PSAicmF3IiApCi0JCQkJCQl7Ci0JCQkJCQkJLy8gYXMgZGVmYXVsdAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIGFyZ3NbMV0gPT0gImJ1ZmZlcmVkIiApCi0JCQkJCQl7Ci0JCQkJCQkJdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCBhcmdzWzFdID09ICJmcmFtZWQiICkKLQkJCQkJCXsKLQkJCQkJCQl1c2VGcmFtZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIEZhbGwgYmFjayB0byB0aGUgb2xkZXIgYm9vbGVhbiBzeW50YXgKLQkJCQkJCQlib29sLlRyeVBhcnNlKGFyZ3NbMV0sIG91dCB1c2VCdWZmZXJlZFNvY2tldHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gUHJvY2Vzc29yCi0JCQkJVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLQkJCQlUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKLQotCQkJCS8vIFRyYW5zcG9ydAotCQkJCVRTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7Ci0KLQkJCQkvLyBTaW1wbGUgU2VydmVyCi0JCQkJVFNlcnZlciBzZXJ2ZXJFbmdpbmU7Ci0JCQkJaWYgKCB1c2VGcmFtZWQgKQotCQkJCQlzZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOwotCQkJCWVsc2UKLQkJCQkJc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQkvLyBUaHJlYWRQb29sIFNlcnZlcgotCQkJCS8vIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0KTsKLQotCQkJCS8vIFRocmVhZGVkIFNlcnZlcgotCQkJCS8vIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQl0ZXN0SGFuZGxlci5zZXJ2ZXIgPSBzZXJ2ZXJFbmdpbmU7Ci0KLQkJCQkvLyBSdW4gaXQKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgKyBwb3J0ICsgCi0JCQkJCSh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArIAotCQkJCQkodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsgCi0JCQkJCSIuLi4iKTsKLQkJCQlzZXJ2ZXJFbmdpbmUuU2VydmUoKTsKLQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCUNvbnNvbGUuRXJyb3IuV3JpdGUoeCk7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTU1ODNhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgotICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KLSAgICA8UHJvamVjdEd1aWQ+ezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ308L1Byb2plY3RHdWlkPgotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0VGVzdDwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdFRlc3Q8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KLSAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KLSAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgotICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgotICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KLSAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KLSAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+Ci0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0SW1wbCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KLSAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q2xpZW50LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RTZXJ2ZXIuY3MiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+Ci0gICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KLSAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KLSAgICA8L1Byb2plY3RSZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgotICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKLWRlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgotU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQotU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cVGhyaWZ0VGVzdC50aHJpZnQKLWZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQotZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQotIiQoUHJvamVjdERpcilcLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1Ci0kKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50PgotICA8L1Byb3BlcnR5R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU4MGRlOC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uL1RocmlmdFRlc3QudGhyaWZ0Ci1nbWNzIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vLi4vbGliL2NzaGFycC9UaHJpZnQuZGxsCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvTWFrZWZpbGUuYW0gYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1MGVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQ6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHViLWdldC1nZW46IGdlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0CisJY2QgZ2VuLWRhcnQvdGhyaWZ0X3Rlc3Q7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQ6IHB1Yi1nZXQtZ2VuCisJY2QgdGVzdF9jbGllbnQ7ICR7REFSVFBVQn0gZ2V0CisKK3N0dWJzOiBnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydCBwdWItZ2V0CisKK3ByZWNyb3NzOiBzdHVicworCitjaGVjazogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWRhcnQgdGVzdF9jbGllbnQvLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NsaWVudDogc3R1YnMKKwkke0RBUlR9IHRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydCBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Njg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydApAQCAtMCwwICsxLDMzNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgYXMgaHR0cDsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfY29uc29sZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnRfdGVzdC90aHJpZnRfdGVzdC5kYXJ0JzsKKworY29uc3QgVEVTVF9CQVNFVFlQRVMgPSAxOyAvLyAwMDAwIDAwMDEKK2NvbnN0IFRFU1RfU1RSVUNUUyA9IDI7IC8vIDAwMDAgMDAxMAorY29uc3QgVEVTVF9DT05UQUlORVJTID0gNDsgLy8gMDAwMCAwMTAwCitjb25zdCBURVNUX0VYQ0VQVElPTlMgPSA4OyAvLyAwMDAwIDEwMDAKK2NvbnN0IFRFU1RfVU5LTk9XTiA9IDY0OyAvLyAwMTAwIDAwMDAgKEZhaWxlZCB0byBwcmVwYXJlIGVudmlyb25lbXQgZXRjLikKK2NvbnN0IFRFU1RfVElNRU9VVCA9IDEyODsgLy8gMTAwMCAwMDAwCitjb25zdCBURVNUX05PVFVTRUQgPSA0ODsgLy8gMDAxMSAwMDAwIChyZXNlcnZlZCBiaXRzKQorCit0eXBlZGVmIEZ1dHVyZSBGdXR1cmVGdW5jdGlvbigpOworCitjbGFzcyBUVGVzdCB7CisgIGZpbmFsIGludCBlcnJvckNvZGU7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBGdXR1cmVGdW5jdGlvbiBmdW5jOworCisgIFRUZXN0KHRoaXMuZXJyb3JDb2RlLCB0aGlzLm5hbWUsIHRoaXMuZnVuYyk7Cit9CisKK2NsYXNzIFRUZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7CisgIGZpbmFsIGFjdHVhbDsKKyAgZmluYWwgZXhwZWN0ZWQ7CisKKyAgVFRlc3RFcnJvcih0aGlzLmFjdHVhbCwgdGhpcy5leHBlY3RlZCk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRhY3R1YWwgIT0gJGV4cGVjdGVkJzsKK30KKworTGlzdDxUVGVzdD4gX3Rlc3RzOworVGhyaWZ0VGVzdENsaWVudCBjbGllbnQ7Citib29sIHZlcmJvc2U7CisKKy8vLyBBZGFwdGVkIGZyb20gVGVzdENsaWVudC5waHAKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKKyAgQXJnUmVzdWx0cyByZXN1bHRzID0gX3BhcnNlQXJncyhhcmdzKTsKKworICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgZXhpdChURVNUX1VOS05PV04pOworICB9CisKKyAgdmVyYm9zZSA9IHJlc3VsdHNbJ3ZlcmJvc2UnXSA9PSB0cnVlOworCisgIGF3YWl0IF9pbml0VGVzdENsaWVudCgKKyAgICAgIGhvc3Q6IHJlc3VsdHNbJ2hvc3QnXSwKKyAgICAgIHBvcnQ6IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pLAorICAgICAgdHJhbnNwb3J0VHlwZTogcmVzdWx0c1sndHJhbnNwb3J0J10sCisgICAgICBwcm90b2NvbFR5cGU6IHJlc3VsdHNbJ3Byb3RvY29sJ10pLmNhdGNoRXJyb3IoKGUpIHsKKyAgICBzdGRvdXQud3JpdGVsbignRXJyb3I6Jyk7CisgICAgc3Rkb3V0LndyaXRlbG4oJyRlJyk7CisgICAgaWYgKGUgaXMgRXJyb3IpIHsKKyAgICAgIHN0ZG91dC53cml0ZWxuKCcke2Uuc3RhY2tUcmFjZX0nKTsKKyAgICB9CisgICAgZXhpdChURVNUX1VOS05PV04pOworICB9KTsKKworICAvLyBydW4gdGVzdHMKKyAgX3Rlc3RzID0gX2NyZWF0ZVRlc3RzKCk7CisKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgZm9yIChUVGVzdCB0ZXN0IGluIF90ZXN0cykgeworICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGUoJyR7dGVzdC5uYW1lfS4uLiAnKTsKKyAgICB0cnkgeworICAgICAgYXdhaXQgdGVzdC5mdW5jKCk7CisgICAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlbG4oJ3N1Y2Nlc3MhJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZWxuKCckZScpOworICAgICAgcmVzdWx0ID0gcmVzdWx0IHwgdGVzdC5lcnJvckNvZGU7CisgICAgfQorICB9CisKKyAgZXhpdChyZXN1bHQpOworfQorCitBcmdSZXN1bHRzIF9wYXJzZUFyZ3MoTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbignaG9zdCcsIGRlZmF1bHRzVG86ICdsb2NhbGhvc3QnLCBoZWxwOiAnVGhlIHNlcnZlciBob3N0Jyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBjb25uZWN0IHRvJyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3RyYW5zcG9ydCcsCisgICAgICBkZWZhdWx0c1RvOiAnYnVmZmVyZWQnLAorICAgICAgYWxsb3dlZDogWydidWZmZXJlZCcsICdmcmFtZWQnLCAnaHR0cCddLAorICAgICAgaGVscDogJ1RoZSB0cmFuc3BvcnQgbmFtZScsCisgICAgICBhbGxvd2VkSGVscDogeworICAgICAgICAnYnVmZmVyZWQnOiAnVEJ1ZmZlcmVkVHJhbnNwb3J0JywKKyAgICAgICAgJ2ZyYW1lZCc6ICdURnJhbWVkVHJhbnNwb3J0JworICAgICAgfSk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3Byb3RvY29sJywKKyAgICAgIGRlZmF1bHRzVG86ICdiaW5hcnknLAorICAgICAgYWxsb3dlZDogWydiaW5hcnknLCAnY29tcGFjdCcsICdqc29uJ10sCisgICAgICBoZWxwOiAnVGhlIHByb3RvY29sIG5hbWUnLAorICAgICAgYWxsb3dlZEhlbHA6IHsKKyAgICAgICAgJ2JpbmFyeSc6ICdUQmluYXJ5UHJvdG9jb2wnLAorICAgICAgICAnY29tcGFjdCc6ICdUQ29tcGFjdFByb3RvY29sJywKKyAgICAgICAgJ2pzb24nOiAnVEpzb25Qcm90b2NvbCcKKyAgICAgIH0pOworICBwYXJzZXIuYWRkRmxhZygndmVyYm9zZScsIGRlZmF1bHRzVG86IGZhbHNlKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHN0ZG91dC53cml0ZWxuKCckZVxuJyk7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSBzdGRvdXQud3JpdGUocGFyc2VyLnVzYWdlKTsKKworICByZXR1cm4gcmVzdWx0czsKK30KKworVFByb3RvY29sRmFjdG9yeSBnZXRQcm90b2NvbEZhY3RvcnkoU3RyaW5nIHByb3RvY29sVHlwZSkgeworICBpZiAocHJvdG9jb2xUeXBlID09ICdiaW5hcnknKSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICdjb21wYWN0JykgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gJ2pzb24nKSB7CisgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sRmFjdG9yeSgpOworICB9CisKKyAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUocHJvdG9jb2xUeXBlKTsKK30KKworRnV0dXJlIF9pbml0VGVzdENsaWVudCgKKyAgICB7U3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdHJhbnNwb3J0VHlwZSwgU3RyaW5nIHByb3RvY29sVHlwZX0pIGFzeW5jIHsKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIHZhciBwcm90b2NvbEZhY3RvcnkgPSBnZXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xUeXBlKTsKKworICBpZiAodHJhbnNwb3J0VHlwZSA9PSAnaHR0cCcpIHsKKyAgICB2YXIgaHR0cENsaWVudCA9IG5ldyBodHRwLklPQ2xpZW50KCk7CisgICAgdmFyIHVyaSA9IFVyaS5wYXJzZSgnaHR0cDovLyRob3N0OiRwb3J0Jyk7CisgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyh1cmksIHt9KTsKKyAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoaHR0cENsaWVudCwgY29uZmlnKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgc29ja2V0ID0gYXdhaXQgU29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7CisgICAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gJ2ZyYW1lZCcpIHsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgfQorICB9CisKKyAgdmFyIHByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworfQorCitMaXN0PFRUZXN0PiBfY3JlYXRlVGVzdHMoKSB7CisgIExpc3Q8VFRlc3Q+IHRlc3RzID0gW107CisKKyAgdmFyIHh0cnVjdCA9IG5ldyBYdHJ1Y3QoKQorICAgIC4uc3RyaW5nX3RoaW5nID0gJ1plcm8nCisgICAgLi5ieXRlX3RoaW5nID0gMQorICAgIC4uaTMyX3RoaW5nID0gLTMKKyAgICAuLmk2NF90aGluZyA9IC01OworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Vm9pZCcsICgpIGFzeW5jIHsKKyAgICBhd2FpdCBjbGllbnQudGVzdFZvaWQoKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0U3RyaW5nJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9ICdUZXN0JzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJpbmcoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCb29sJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IHRydWU7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJ5dGUnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gNjQ7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qnl0ZShpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEkzMicsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAyMTQ3NDgzNjQ3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEkzMihpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEk2NCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEk2NChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdERvdWJsZScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAzLjE0MTU5MjY7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0QmluYXJ5JywgKCkgYXN5bmMgeworICAgIHZhciB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKyAgICB2YXIgaW5wdXQgPSB1dGY4Q29kZWMuZW5jb2RlKCdmb28nKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCaW5hcnkoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IExpc3RFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdFN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3QoeHRydWN0KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckeHRydWN0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCB4dHJ1Y3QpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TmVzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0MigpCisgICAgICAuLmJ5dGVfdGhpbmcgPSAxCisgICAgICAuLnN0cnVjdF90aGluZyA9IHh0cnVjdAorICAgICAgLi5pMzJfdGhpbmcgPSAtMzsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE5lc3QoaW5wdXQpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TWFwJywgKCkgYXN5bmMgeworICAgIE1hcDxpbnQsIGludD4gaW5wdXQgPSB7MTogLTEwLCAyOiAtOSwgMzogLTgsIDQ6IC03LCA1OiAtNn07CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNYXAoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IE1hcEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0U2V0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBTZXQ8aW50Pi5mcm9tKFstMiwgLTEsIDAsIDEsIDJdKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTZXQoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IFNldEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TGlzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBbLTIsIC0xLCAwLCAxLCAyXTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RMaXN0KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBMaXN0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RFbnVtJywgKCkgYXN5bmMgeworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RUeXBlZGVmJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDMwOTg1ODIzNTA4MjUyMzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE1hcE1hcCcsICgpIGFzeW5jIHsKKyAgICBNYXA8aW50LCBNYXA8aW50LCBpbnQ+PiByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkgfHwgcmVzdWx0W3Jlc3VsdC5rZXlzLmZpcnN0XS5pc0VtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsICdNYXA8aW50LCBNYXA8aW50LCBpbnQ+PicpOworICAgIH0KKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdEluc2FuaXR5JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBJbnNhbml0eSgpOworICAgIGlucHV0LnVzZXJNYXAgPSB7TnVtYmVyei5GSVZFOiA1MDAwfTsKKyAgICBpbnB1dC54dHJ1Y3RzID0gW3h0cnVjdF07CisKKyAgICBNYXA8aW50LCBNYXA8aW50LCBJbnNhbml0eT4+IHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5wdXQpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSB8fCByZXN1bHRbcmVzdWx0LmtleXMuZmlyc3RdLmlzRW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgJ01hcDxpbnQsIE1hcDxpbnQsIEluc2FuaXR5Pj4nKTsKKyAgICB9CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNdWx0aScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0KCkKKyAgICAgIC4uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMicKKyAgICAgIC4uYnl0ZV90aGluZyA9IDEyMworICAgICAgLi5pMzJfdGhpbmcgPSA0NTYKKyAgICAgIC4uaTY0X3RoaW5nID0gNzg5OworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TXVsdGkoaW5wdXQuYnl0ZV90aGluZywgaW5wdXQuaTMyX3RoaW5nLAorICAgICAgICBpbnB1dC5pNjRfdGhpbmcsIHsxOiAnb25lJ30sIE51bWJlcnouRUlHSFQsIDU2NzgpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0VYQ0VQVElPTlMsICd0ZXN0RXhjZXB0aW9uJywgKCkgYXN5bmMgeworICAgIHRyeSB7CisgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICB9IG9uIFhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uJyk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfRVhDRVBUSU9OUywgJ3Rlc3RNdWx0aUV4Y2VwdGlvbicsICgpIGFzeW5jIHsKKyAgICB0cnkgeworICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2ZvbycpOworICAgIH0gb24gWGNlcHRpb24yIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uMicpOworICB9KSk7CisKKyAgcmV0dXJuIHRlc3RzOworfQorCitGdXR1cmUgX3Rlc3RFbnVtKGludCBpbnB1dCkgYXN5bmMgeworICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtKGlucHV0KTsKKyAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY0MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHRocmlmdF90ZXN0X2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBIGNsaWVudCBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgRGFydCBUaHJpZnQgbGlicmFyeQorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGh0dHA6IF4wLjExLjAKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHRocmlmdF90ZXN0OgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3RocmlmdF90ZXN0CisKK2Rldl9kZXBlbmRlbmNpZXM6CisgIHRlc3Q6ICJeMC4xMi4wIgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvTWFrZWZpbGUgYi90ZXN0L2VybC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiNWFlNi4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1HRU5ESVI9Z2VuCi1HRU5fSU5DTFVERURJUj0kKEdFTkRJUikvaW5jbHVkZQotR0VOX1NSQ0RJUj0kKEdFTkRJUikvc3JjCi1HRU5fVEFSR0VURElSPSQoR0VORElSKS9lYmluCi0KLUlOQ0xVREVESVI9aW5jbHVkZQotVEFSR0VURElSPWViaW4KLVNSQ0RJUj1zcmMKLQotQUxMX0lOQ0xVREVESVI9JChHRU5fSU5DTFVERURJUikgJChJTkNMVURFRElSKSAuLi8uLi9saWIvZXJsL2luY2x1ZGUKLUlOQ0xVREVGTEFHUz0kKHBhdHN1YnN0ICUsLUklLCAke0FMTF9JTkNMVURFRElSfSkKLQotTU9EVUxFUyA9IHN0cmVzc19zZXJ2ZXIgdGVzdF9zZXJ2ZXIgdGVzdF9jbGllbnQgdGVzdF9kaXNrbG9nIHRlc3RfbWVtYnVmZmVyCi0KLUlOQ0xVREVTID0gCi1UQVJHRVRTID0gJChwYXRzdWJzdCAlLCR7VEFSR0VURElSfS8lLmJlYW0sJHtNT0RVTEVTfSkKLUhFQURFUlMgPSAkKHBhdHN1YnN0ICUsJHtJTkNMVURFRElSfS8lLmhybCwke0lOQ0xVREVTfSkKLQotYWxsOiAke0dFTl9UQVJHRVRESVJ9LyAke1RBUkdFVFN9Ci0KLVRFU1RfUlBDRklMRSA9IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci1TVFJFU1NfUlBDRklMRSA9IC4uL1N0cmVzc1Rlc3QudGhyaWZ0Ci1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLSR7R0VORElSfS86ICR7UlBDRklMRX0KLQlybSAtcmYgJHtHRU5ESVJ9Ci0JJHtUSFJJRlR9IC0tZ2VuIGVybCAke1RFU1RfUlBDRklMRX0KLQkke1RIUklGVH0gLS1nZW4gZXJsICR7U1RSRVNTX1JQQ0ZJTEV9Ci0JbWtkaXIgLXAgJHtHRU5fSU5DTFVERURJUn0KLQlta2RpciAtcCAke0dFTl9TUkNESVJ9Ci0JbWtkaXIgLXAgJHtHRU5fVEFSR0VURElSfQotCW12IC10ICR7R0VOX0lOQ0xVREVESVJ9IGdlbi1lcmwvKi5ocmwKLQltdiAtdCAke0dFTl9TUkNESVJ9IGdlbi1lcmwvKi5lcmwKLQlybSAtcmYgZ2VuLWVybAotCi0ke0dFTl9UQVJHRVRESVJ9LzogJHtHRU5ESVJ9LwotCXJtIC1yZiAke0dFTl9UQVJHRVRESVJ9Ci0JbWtkaXIgLXAgJHtHRU5fVEFSR0VURElSfQotCWVybGMgJHtFUkxDX0ZMQUdTfSAke0lOQ0xVREVGTEFHU30gLW8gJHtHRU5fVEFSR0VURElSfSAke0dFTl9TUkNESVJ9LyouZXJsCi0KLSQoVEFSR0VUUyk6ICR7VEFSR0VURElSfS8lLmJlYW06ICR7U1JDRElSfS8lLmVybCAke0dFTl9JTkNMVURFRElSfS8gJHtIRUFERVJTfQotCW1rZGlyIC1wICR7VEFSR0VURElSfQotCWVybGMgJHtFUkxDX0ZMQUdTfSAke0lOQ0xVREVGTEFHU30gLW8gJHtUQVJHRVRESVJ9ICQ8Ci0KLWNsZWFuOgotCXJtIC1mICR7VEFSR0VURElSfS8qLmJlYW0KLQlybSAtcmYgJHtHRU5ESVJ9CmRpZmYgLS1naXQgYS90ZXN0L2VybC9NYWtlZmlsZS5hbSBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjVlODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCAuLi8qLnRocmlmdCkKKworaWYgRVJMQU5HX09UUDE2CitFUkxfRkxBRyA9IGVybDpvdHAxNgorZWxzZQorRVJMX0ZMQUcgPSBlcmwKK2VuZGlmCisjIG1ha2Ugc3VyZSBUaHJpZnRUZXN0LnRocmlmdCBpcyBnZW5lcmF0ZWQgbGFzdCB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIG90aGVyICoudGhyaWZ0IGZpbGVzCisuZ2VuZXJhdGVkOiAkKFRIUklGVF9GSUxFUykKKwlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCisJICAkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gc3JjICQkZiA7IFwKKwlkb25lIDsgXAorCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyBzcmMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwl0b3VjaCAuZ2VuZXJhdGVkCisKK3ByZWNyb3NzOiAuZ2VuZXJhdGVkCisJJChSRUJBUikgY29tcGlsZQorCitjbGVhbjoKKwlybSAtZiAuZ2VuZXJhdGVkCisJcm0gLXJmIHNyYy9nZW4tZXJsCisJJChSRUJBUikgY2xlYW4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZyBiL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWEwNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCkBAIC0wLDAgKzEsNiBAQAore3N1Yl9kaXJzLCBbIi4uLy4uL2xpYi9lcmwiXX0uCisKK3tlcmxfb3B0cywgWworICBkZWJ1Z19pbmZvLAorICB7aSwgIi4uLy4uL2xpYi9lcmwvaW5jbHVkZSJ9CitdfS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCmluZGV4IGEyNjQ2N2YuLjliYWQ1OTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwKKysrIGIvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybApAQCAtMjEsNDQgKzIxLDYxIEBACiAKIC1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzFdKS4KIAotLWluY2x1ZGUoInRocmlmdFRlc3RfdHlwZXMuaHJsIikuCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF90eXBlcy5ocmwiKS4KIAogLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCiAgICAgICAgICAgICAgICAgICBjbGllbnRfb3B0cyA9IFtdfSkuCiAKIHBhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KLXBhcnNlX2FyZ3MoW10sIE9wdHMpIC0+IE9wdHM7CitwYXJzZV9hcmdzKFtdLCBPcHRzKSAtPgorICBPcHRzOwogcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgogICAgIE5ld09wdHMgPQotICAgICAgICBjYXNlIGNhdGNoIGxpc3RfdG9faW50ZWdlcihIZWFkKSBvZgotICAgICAgICAgICAgUG9ydCB3aGVuIGlzX2ludGVnZXIoUG9ydCkgLT4KLSAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IFBvcnR9OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICBjYXNlIEhlYWQgb2YKKyAgICAgICAgY2FzZSBIZWFkIG9mCisgICAgICAgICAgICAiLS1wb3J0PSIgKysgUG9ydCAtPgorICAgICAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoUG9ydCkgb2YKKyAgICAgICAgICAgICAgICAgIHtJbnRQb3J0LF99IHdoZW4gaXNfaW50ZWdlcihJbnRQb3J0KSAtPgorICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IEludFBvcnR9OworICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS10cmFuc3BvcnQ9IiArKyBUcmFucyAtPgorICAgICAgICAgICAgICAgICUgVE9ETzogRW5hYmxlIEJ1ZmZlcmVkIGFuZCBIVFRQIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnMgb2YKICAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KICAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c119OwotICAgICAgICAgICAgICAgICAgICAiIiAtPgotICAgICAgICAgICAgICAgICAgICAgICAgT3B0czsKICAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCi0gICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tc3NsIiAtPgorICAgICAgICAgICAgICAgIHNzbDpzdGFydCgpLAorICAgICAgICAgICAgICAgIFNzbE9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICB7c3Nsb3B0aW9ucywgWworICAgICAgICAgICAgICAgICAgICAgICAge2NhY2VydGZpbGUsICIuLi9rZXlzL0NBLnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9jbGllbnQucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7a2V5ZmlsZSwgIi4uL2tleXMvY2xpZW50LmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9XX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCiAgICAgICAgIGVuZCwKICAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgogCi0KLXN0YXJ0KCkgLT4gc3RhcnQoW10pLgorc3RhcnQoKSAtPiBzdGFydChpbml0OmdldF9wbGFpbl9hcmd1bWVudHMoKSkuCiBzdGFydChBcmdzKSAtPgogICAjb3B0aW9uc3twb3J0ID0gUG9ydCwgY2xpZW50X29wdHMgPSBDbGllbnRPcHRzfSA9IHBhcnNlX2FyZ3MoQXJncyksCiAgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KAotICAgICIxMjcuMC4wLjEiLCBQb3J0LCB0aHJpZnRUZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCisgICAgIjEyNy4wLjAuMSIsIFBvcnQsIHRocmlmdF90ZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCiAKLSAgRGVtb1h0cnVjdCA9ICN4dHJ1Y3R7Ci0gICAgc3RyaW5nX3RoaW5nID0gPDwiWmVybyI+PiwKLSAgICBieXRlX3RoaW5nID0gMSwKLSAgICBpMzJfdGhpbmcgPSA5MTI4MzYxLAotICAgIGk2NF90aGluZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDd9LAorICBEZW1vWHRydWN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QneworICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nID0gPDwiWmVybyI+PiwKKyAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSAxLAorICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gOTEyODM2MSwKKyAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDd9LAogCi0gIERlbW9OZXN0ID0gI3h0cnVjdDJ7CisgIERlbW9OZXN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QyJ3sKICAgICBieXRlX3RoaW5nID0gNywKICAgICBzdHJ1Y3RfdGhpbmcgPSBEZW1vWHRydWN0LAogICAgICUgTm90ZSB0aGF0IHdlIGRvbid0IHNldCBpMzJfdGhpbmcsIGl0IHdpbGwgY29tZSBiYWNrIGFzIHVuZGVmaW5lZApAQCAtNzAsMzMgKzg3LDQ3IEBACiAgIERlbW9EaWN0ID0gZGljdDpmcm9tX2xpc3QoWyB7S2V5LCBLZXktMTB9IHx8IEtleSA8LSBsaXN0czpzZXEoMCwxMCkgXSksCiAgIERlbW9TZXQgPSBzZXRzOmZyb21fbGlzdChbIEtleSB8fCBLZXkgPC0gbGlzdHM6c2VxKC0zLDMpIF0pLAogCi0gICVEZW1vSW5zYW5lID0gI2luc2FuaXR5ewotICAlICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/dGhyaWZ0VGVzdF9GSVZFLCA1MDAwfV0pLAotICAlICB4dHJ1Y3RzID0gWyN4dHJ1Y3R7IHN0cmluZ190aGluZyA9IDw8IlRydWNrIj4+LCBieXRlX3RoaW5nID0gOCwgaTMyX3RoaW5nID0gOCwgaTY0X3RoaW5nID0gOH1dfSwKKyAgRGVtb0luc2FuZSA9ICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkneworICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0ZJVkUsIDUwMDB9XSksCisgICAgeHRydWN0cyA9IFsjJ3RocmlmdC50ZXN0Llh0cnVjdCd7IHN0cmluZ190aGluZyA9IDw8IlRydWNrIj4+LCBieXRlX3RoaW5nID0gOCwgaTMyX3RoaW5nID0gOCwgaTY0X3RoaW5nID0gOH1dfSwKIAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RWb2lkIiksCiAgIHtDbGllbnQwMSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHRlc3RWb2lkLCBbXSksCiAKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U3RyaW5nIiksCiAgIHtDbGllbnQwMiwge29rLCA8PCJUZXN0Ij4+fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMSwgdGVzdFN0cmluZywgWyJUZXN0Il0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJpbmciKSwKICAge0NsaWVudDAzLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAyLCB0ZXN0U3RyaW5nLCBbPDwiVGVzdCI+Pl0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RCeXRlIiksCiAgIHtDbGllbnQwNCwge29rLCA2M319ICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMywgdGVzdEJ5dGUsIFs2M10pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJMzIiKSwKICAge0NsaWVudDA1LCB7b2ssIC0xfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA0LCB0ZXN0STMyLCBbLTFdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0STMyIiksCiAgIHtDbGllbnQwNiwge29rLCAwfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNSwgdGVzdEkzMiwgWzBdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0STY0IiksCiAgIHtDbGllbnQwNywge29rLCAtMzQzNTk3MzgzNjh9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNiwgdGVzdEk2NCwgWy0zNDM1OTczODM2OF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3REb3VibGUiKSwKICAge0NsaWVudDA4LCB7b2ssIC01LjIwOTg1MjN9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA3LCB0ZXN0RG91YmxlLCBbLTUuMjA5ODUyM10pLAorICAlJSBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U3RydWN0IiksCiAgIHtDbGllbnQwOSwge29rLCBEZW1vWHRydWN0fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOCwgdGVzdFN0cnVjdCwgW0RlbW9YdHJ1Y3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TmVzdCIpLAogICB7Q2xpZW50MTAsIHtvaywgRGVtb05lc3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDksIHRlc3ROZXN0LCBbRGVtb05lc3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TWFwIiksCiAgIHtDbGllbnQxMSwge29rLCBEZW1vRGljdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMCwgdGVzdE1hcCwgW0RlbW9EaWN0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFNldCIpLAogICB7Q2xpZW50MTIsIHtvaywgRGVtb1NldH19ICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTEsIHRlc3RTZXQsIFtEZW1vU2V0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdExpc3QiKSwKICAge0NsaWVudDEzLCB7b2ssIFstMSwyLDNdfX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEyLCB0ZXN0TGlzdCwgW1stMSwyLDNdXSksCi0gIHtDbGllbnQxNCwge29rLCAxfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMywgdGVzdEVudW0sIFs/dGhyaWZ0VGVzdF9PTkVdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0RW51bSIpLAorICB7Q2xpZW50MTQsIHtvaywgMX19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTMsIHRlc3RFbnVtLCBbP1RIUklGVF9URVNUX05VTUJFUlpfT05FXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFR5cGVkZWYiKSwKICAge0NsaWVudDE1LCB7b2ssIDMwOTg1ODIzNTA4MjUyM319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE0LCB0ZXN0VHlwZWRlZiwgWzMwOTg1ODIzNTA4MjUyM10pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJbnNhbml0eSIpLAorICB7Q2xpZW50MTYsIHtvaywgSW5zYW5lUmVzdWx0fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTUsIHRlc3RJbnNhbml0eSwgW0RlbW9JbnNhbmVdKSwKKyAgaW86Zm9ybWF0KCJ+cH5uIiwgW0luc2FuZVJlc3VsdF0pLAogCi0gICUgTm8gcHl0aG9uIGltcGxlbWVudGF0aW9uLCBidXQgd29ya3Mgd2l0aCBDKysgYW5kIEVybGFuZy4KLSAgJXtDbGllbnQxNiwge29rLCBJbnNhbmVSZXN1bHR9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNSwgdGVzdEluc2FuaXR5LCBbRGVtb0luc2FuZV0pLAotICAlaW86Zm9ybWF0KCJ+cH5uIiwgW0luc2FuZVJlc3VsdF0pLAotICBDbGllbnQxNiA9IENsaWVudDE1LAotCi0gIHtDbGllbnQxNywge29rLCAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8Ik1lc3NhZ2UiPj59fX0gPQorICB7Q2xpZW50MTcsIHtvaywgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8Ik1lc3NhZ2UiPj59fX0gPQogICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNiwgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlNhZmUiLCAiTWVzc2FnZSJdKSwKIAogICBDbGllbnQxOCA9CkBAIC0xMDUsMTAgKzEzNiwxMCBAQAogICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQxXSksCiAgICAgICBDbGllbnRTMQogICAgIGNhdGNoCi0gICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIEV4blMxID0gI3hjZXB0aW9ue319fSAtPgotICAgICAgICAjeGNlcHRpb257ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCisgICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIEV4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSA9IEV4blMxLAogICAgICAgICBDbGllbnRTMjsKLSAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgX0V4blMxID0gI3hjZXB0aW9uMnt9fX0gLT4KKyAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgX0V4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgogICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAogICAgICAgICBDbGllbnRTMgogICAgIGVuZCwKQEAgLTExOSwxNCArMTUwLDI1IEBACiAgICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDJdKSwKICAgICAgIENsaWVudFMzCiAgICAgY2F0Y2gKLSAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgX0V4blMyID0gI3hjZXB0aW9ue319fSAtPgorICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBfRXhuUzIgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3t9fX0gLT4KICAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKICAgICAgICAgQ2xpZW50UzQ7Ci0gICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gI3hjZXB0aW9uMnt9fX0gLT4KLSAgICAgICAgI3hjZXB0aW9uMntlcnJvckNvZGUgPSAyMDAyLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9ICN4dHJ1Y3R7CisgICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgorICAgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7CiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCiAgICAgICAgIENsaWVudFM0CiAgICAgZW5kLAogCi0gIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MTkpLgorICAlJSBTdGFydGVkID0gZXJsYW5nOm1vbm90b25pY190aW1lKG1pbGxpX3NlY29uZHMpLAorICB7XywgU3RhcnRTZWMsIFN0YXJ0VVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE9uZXdheSIpLAorICB7Q2xpZW50MjAsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOSwgdGVzdE9uZXdheSwgWzFdKSwKKyAge18sIEVuZFNlYywgRW5kVVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIEVsYXBzZWQgPSAoRW5kU2VjIC0gU3RhcnRTZWMpICogMTAwMCArIChFbmRVU2VjIC0gU3RhcnRVU2VjKSAvIDEwMDAsCisgIGlmCisgICAgRWxhcHNlZCA+IDEwMDAgLT4gZXhpdCgxKTsKKyAgICB0cnVlIC0+IHRydWUKKyAgZW5kLAorCisgIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MjApLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfZGlza2xvZy5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9kaXNrbG9nLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwZGNmOC4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF9kaXNrbG9nLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKHRlc3RfZGlza2xvZykuCi0KLS1jb21waWxlKGV4cG9ydF9hbGwpLgotCi10KCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCi0gICAgICAgICAgdGVzdF9kaXNrbG9nLAotICAgICAgICAgIFt7ZmlsZSwgIi90bXAvdGVzdF9sb2cifSwKLSAgICAgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgW10pLAotICAgIHtvaywgUHJvdG99ID0gUHJvdG9jb2xGYWN0b3J5KCksCi0gICAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRUZXN0X3RocmlmdCksCi0KLSAgICBpbzpmb3JtYXQoIkNsaWVudCBzdGFydGVkfm4iKSwKLQotICAgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlIGl0IHdpbGwgdHJ5Ci0gICAgJSB0byByZWFkIGZyb20gdGhlIGRpc2tsb2cgYW5kIGdvIGJvb20uCi0gICAge0NsaWVudDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0T25ld2F5LCBbMTYjZGVhZGJlZWZdKSwKLSAgICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCi0KLSAgICAlIFVzZSB0aGUgc2VuZF9jYWxsIG1ldGhvZCB0byB3cml0ZSBhIG5vbi1vbmV3YXkgY2FsbCBpbnRvIHRoZSBsb2cKLSAgICB7Q2xpZW50Miwgb2t9ID0gdGhyaWZ0X2NsaWVudDpzZW5kX2NhbGwoQ2xpZW50MSwgdGVzdFN0cmluZywgWzw8ImhlbGxvIHdvcmxkIj4+XSksCi0gICAgaW86Zm9ybWF0KCJOb24tb25ld2F5IGNhbGwgc2VudH5uIiksCi0KLSAgICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCi0gICAgaW86Zm9ybWF0KCJDbGllbnQgY2xvc2Vkfm4iKSwKLQotICAgIG9rLgotCi0KLQotdF9iYXNlNjQoKSAtPgotICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKLSAgICAgICAgICB0ZXN0X2Rpc2tsb2csCi0gICAgICAgICAgW3tmaWxlLCAiL3RtcC90ZXN0X2I2NF9sb2cifSwKLSAgICAgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKLSAgICB7b2ssIEI2NEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnkpLAotICAgIHtvaywgQnVmRmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShCNjRGYWN0b3J5KSwKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmRmFjdG9yeSwgW10pLAotICAgIHtvaywgUHJvdG99ID0gUHJvdG9jb2xGYWN0b3J5KCksCi0gICAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRUZXN0X3RocmlmdCksCi0KLSAgICBpbzpmb3JtYXQoIkNsaWVudCBzdGFydGVkfm4iKSwKLQotICAgICUgV2UgaGF2ZSB0byBtYWtlIG9uZXdheSBjYWxscyBpbnRvIHRoaXMgY2xpZW50IG9ubHkgc2luY2Ugb3RoZXJ3aXNlIGl0IHdpbGwgdHJ5Ci0gICAgJSB0byByZWFkIGZyb20gdGhlIGRpc2tsb2cgYW5kIGdvIGJvb20uCi0gICAge0NsaWVudDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0T25ld2F5LCBbMTYjZGVhZGJlZWZdKSwKLSAgICBpbzpmb3JtYXQoIkNhbGwgd3JpdHRlbn5uIiksCi0KLSAgICAlIFVzZSB0aGUgc2VuZF9jYWxsIG1ldGhvZCB0byB3cml0ZSBhIG5vbi1vbmV3YXkgY2FsbCBpbnRvIHRoZSBsb2cKLSAgICB7Q2xpZW50Miwgb2t9ID0gdGhyaWZ0X2NsaWVudDpzZW5kX2NhbGwoQ2xpZW50MSwgdGVzdFN0cmluZywgWzw8ImhlbGxvIHdvcmxkIj4+XSksCi0gICAgaW86Zm9ybWF0KCJOb24tb25ld2F5IGNhbGwgc2VudH5uIiksCi0KLSAgICB7X0NsaWVudDMsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MiksCi0gICAgaW86Zm9ybWF0KCJDbGllbnQgY2xvc2Vkfm4iKSwKLQotICAgIG9rLgotCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9tZW1idWZmZXIuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfbWVtYnVmZmVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhYzUyNy4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF9tZW1idWZmZXIuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9tZW1idWZmZXIpLgotLWV4cG9ydChbdC8wXSkuCi0KLS1pbmNsdWRlKCJ0aHJpZnRUZXN0X3R5cGVzLmhybCIpLgotCi10ZXN0X2RhdGEoKSAtPgotICAgICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiZm9vYmFyIj4+LAotCSAgICBieXRlX3RoaW5nID0gMTIzLAotCSAgICBpMzJfdGhpbmcgPSAxMjM0NTY3LAotCSAgICBpNjRfdGhpbmcgPSAxMjM0NTY3ODkwMH0uCi0KLXQxKCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAgICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICAgIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0JCXtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0JCQkgICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0JykpfSwKLQkJCQlUZXN0RGF0YX0pLAotCQl7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLQkJCQkJe3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotCQkJCQkneHRydWN0JyksCi0KLSAgICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotCi10MigpIC0+Ci0gICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gICAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgICBUZXN0RGF0YSA9IHRlc3RfZGF0YSgpLAotCQl7UHJvdG9jb2wxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wwLAotCQkJICAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdCcpKX0sCi0JCQkJVGVzdERhdGF9KSwKLQkJe19Qcm90b2NvbDIsIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbDEsCi0JCQkJCXtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0MycpKX0sCi0JCQkJCSd4dHJ1Y3QzJyksCi0KLSAgICBSZXN1bHQgPSAjeHRydWN0M3tzdHJpbmdfdGhpbmcgPSBUZXN0RGF0YSN4dHJ1Y3Quc3RyaW5nX3RoaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB1bmRlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gVGVzdERhdGEjeHRydWN0LmkzMl90aGluZywKLSAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBUZXN0RGF0YSN4dHJ1Y3QuaTY0X3RoaW5nfS4KLQotCi10MygpIC0+Ci0gICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gICAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgICBUZXN0RGF0YSA9ICNib29sc3tpbV90cnVlID0gdHJ1ZSwgaW1fZmFsc2UgPSBmYWxzZX0sCi0JCXtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0JCQkgICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnYm9vbHMnKSl9LAotCQkJCVRlc3REYXRhfSksCi0JCXtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotCQkJCQl7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ2Jvb2xzJykpfSwKLQkJCQkJJ2Jvb2xzJyksCi0KLSAgICB0cnVlID0gVGVzdERhdGEjYm9vbHMuaW1fdHJ1ZSAgPTo9IFJlc3VsdCNib29scy5pbV90cnVlLAotICAgIHRydWUgPSBUZXN0RGF0YSNib29scy5pbV9mYWxzZSA9Oj0gUmVzdWx0I2Jvb2xzLmltX2ZhbHNlLgotCi0KLXQ0KCkgLT4KLSAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAgICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICAgIFRlc3REYXRhID0gI2luc2FuaXR5e3h0cnVjdHM9W119LAotCQl7UHJvdG9jb2wxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wwLAotCQkJICAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ2luc2FuaXR5JykpfSwKLQkJCQlUZXN0RGF0YX0pLAotCQl7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLQkJCQkJe3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdpbnNhbml0eScpKX0sCi0JCQkJCSdpbnNhbml0eScpLAotCi0gICAgVGVzdERhdGEgPSBSZXN1bHQuCi0KLQotdCgpIC0+Ci0gICAgdDEoKSwKLSAgICB0MigpLAotICAgIHQzKCksCi0gICAgdDQoKS4KLQpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3Rfc2VydmVyLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X3NlcnZlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDQ3YjEuLjAwMDAwMDAKLS0tIGEvdGVzdC9lcmwvc3JjL3Rlc3Rfc2VydmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X3NlcnZlcikuCi0KLS1leHBvcnQoW2dvLzAsIGdvLzEsIHN0YXJ0X2xpbmsvMiwgaGFuZGxlX2Z1bmN0aW9uLzJdKS4KLQotLWluY2x1ZGUoInRocmlmdFRlc3RfdHlwZXMuaHJsIikuCi0KLS1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAotICAgICAgICAgICAgICAgICAgc2VydmVyX29wdHMgPSBbXX0pLgotCi1wYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCi1wYXJzZV9hcmdzKFtdLCBPcHRzKSAtPiBPcHRzOwotcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgotICAgIE5ld09wdHMgPQotICAgICAgICBjYXNlIGNhdGNoIGxpc3RfdG9faW50ZWdlcihIZWFkKSBvZgotICAgICAgICAgICAgUG9ydCB3aGVuIGlzX2ludGVnZXIoUG9ydCkgLT4KLSAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IFBvcnR9OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICBjYXNlIEhlYWQgb2YKLSAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OwotICAgICAgICAgICAgICAgICAgICAiIiAtPgotICAgICAgICAgICAgICAgICAgICAgICAgT3B0czsKLSAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCi0gICAgICAgICAgICAgICAgZW5kCi0gICAgICAgIGVuZCwKLSAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgotCi1nbygpIC0+IGdvKFtdKS4KLWdvKEFyZ3MpIC0+Ci0gICAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIHNlcnZlcl9vcHRzID0gU2VydmVyT3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAotICAgIHNwYXduKGZ1bigpIC0+IHN0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cyksIHJlY2VpdmUgYWZ0ZXIgaW5maW5pdHkgLT4gb2sgZW5kIGVuZCkuCi0KLXN0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cykgLT4KLSAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdGFydChbe2hhbmRsZXIsID9NT0RVTEV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2VydmljZSwgdGhyaWZ0VGVzdF90aHJpZnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cG9ydCwgUG9ydH1dICsrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyT3B0cykuCi0KLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RWb2lkLCB7fSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RWb2lkfm4iKSwKLSAgICBvazsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJpbmcsIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmc6IH5wfm4iLCBbU10pLAotICAgIHtyZXBseSwgU307Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0Qnl0ZSwge0k4fSkgd2hlbiBpc19pbnRlZ2VyKEk4KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEJ5dGU6IH5wfm4iLCBbSThdKSwKLSAgICB7cmVwbHksIEk4fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJMzIsIHtJMzJ9KSB3aGVuIGlzX2ludGVnZXIoSTMyKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEkzMjogfnB+biIsIFtJMzJdKSwKLSAgICB7cmVwbHksIEkzMn07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0STY0LCB7STY0fSkgd2hlbiBpc19pbnRlZ2VyKEk2NCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RJNjQ6IH5wfm4iLCBbSTY0XSksCi0gICAge3JlcGx5LCBJNjR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdERvdWJsZSwge0RvdWJsZX0pIHdoZW4gaXNfZmxvYXQoRG91YmxlKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdERvdWJsZTogfnB+biIsIFtEb3VibGVdKSwKLSAgICB7cmVwbHksIERvdWJsZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAotICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjeHRydWN0e3N0cmluZ190aGluZyA9IFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCi13aGVuIGlzX2JpbmFyeShTdHJpbmcpLAotICAgICBpc19pbnRlZ2VyKEJ5dGUpLAotICAgICBpc19pbnRlZ2VyKEkzMiksCi0gICAgIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKLSAgICB7cmVwbHksIFN0cnVjdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKLSAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsIHh0cnVjdDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWNvcmQoTmVzdCN4dHJ1Y3QyLnN0cnVjdF90aGluZywgeHRydWN0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAotICAgIHtyZXBseSwgTmVzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKLSAgICB7cmVwbHksIE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KLSAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKLSAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKLSAgICB7cmVwbHksIFNldH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKLSAgICB7cmVwbHksIExpc3R9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCi0gICAge3JlcGx5LCBFbnVtfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAotICAgIHtyZXBseSwgVXNlcklEfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCi0KLSAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLSAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDUpXSwKLQotICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKLSAgICB7cmVwbHksIE1hcE1hcH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCBpbnNhbml0eSkgLT4KLSAgICBIZWxsbyA9ICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAotICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCi0KLSAgICBHb29kYnllID0gI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKLSAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDR9LAotICAgIENyYXp5ID0gI2luc2FuaXR5ewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRUlHSFQsIDh9XSksCi0gICAgICB4dHJ1Y3RzID0gW0dvb2RieWVdCi0gICAgICB9LAotCi0gICAgTG9vbmV5ID0gI2luc2FuaXR5ewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRklWRSwgNX1dKSwKLSAgICAgIHh0cnVjdHMgPSBbSGVsbG9dCi0gICAgICB9LAotCi0gICAgRmlyc3RNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X1RXTywgQ3Jhenl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/dGhyaWZ0VGVzdF9USFJFRSwgQ3Jhenl9XSksCi0KLSAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X1NJWCwgTG9vbmV5fV0pLAotCi0gICAgSW5zYW5lID0gZGljdDpmcm9tX2xpc3QoW3sxLCBGaXJzdE1hcH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBTZWNvbmRNYXB9XSksCi0KLSAgICBpbzpmb3JtYXQoIlJldHVybiA9IH5wfm4iLCBbSW5zYW5lXSksCi0KLSAgICB7cmVwbHksIEluc2FuZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGksIEFyZ3MgPSB7QXJnMCwgQXJnMSwgQXJnMiwgX0FyZzMsIEFyZzQsIEFyZzV9KQotICB3aGVuIGlzX2ludGVnZXIoQXJnMCksCi0gICAgICAgaXNfaW50ZWdlcihBcmcxKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzIpLAotICAgICAgIGlzX2ludGVnZXIoQXJnNCksCi0gICAgICAgaXNfaW50ZWdlcihBcmc1KSAtPgotCi0gICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGkofnApfm4iLCBbQXJnc10pLAotICAgIHtyZXBseSwgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBBcmcwLAotICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBBcmcxLAotICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBBcmcyfX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RXhjZXB0aW9uLCB7U3RyaW5nfSkgd2hlbiBpc19iaW5hcnkoU3RyaW5nKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEV4Y2VwdGlvbih+cCl+biIsIFtTdHJpbmddKSwKLSAgICBjYXNlIFN0cmluZyBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coI3hjZXB0aW9ue2Vycm9yQ29kZSA9IDEwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IFN0cmluZ30pOwotICAgICAgICBfIC0+Ci0gICAgICAgICAgICBvawotICAgIGVuZDsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aUV4Y2VwdGlvbiwge0FyZzAsIEFyZzF9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE11bHRpRXhjZXB0aW9uKH5wLCB+cCl+biIsIFtBcmcwLCBBcmcxXSksCi0gICAgY2FzZSBBcmcwIG9mCi0gICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjeGNlcHRpb257ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59KTsKLSAgICAgICAgPDwiWGNlcHRpb24yIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjeGNlcHRpb24ye2Vycm9yQ29kZSA9IDIwMDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19KTsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAge3JlcGx5LCAjeHRydWN0e3N0cmluZ190aGluZyA9IEFyZzF9fQotICAgIGVuZDsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RPbmV3YXksIHtTZWNvbmRzfSkgLT4KLSAgICB0aW1lcjpzbGVlcCgxMDAwICogU2Vjb25kcyksCi0gICAgb2suCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDhkZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybApAQCAtMCwwICsxLDIzMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfc2VydmVyKS4KKworLWV4cG9ydChbc3RhcnQvMCwgc3RhcnQvMSwgc3RhcnRfbGluay8yLCBoYW5kbGVfZnVuY3Rpb24vMl0pLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgorCistcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKKyAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KKworcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgorcGFyc2VfYXJncyhbXSwgT3B0cykgLT4KKyAgT3B0czsKK3BhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KKyAgICBOZXdPcHRzID0KKyAgICAgICAgY2FzZSBIZWFkIG9mCisgICAgICAgICAgICAiLS1wb3J0PSIgKysgUG9ydCAtPgorICAgICAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoUG9ydCkgb2YKKyAgICAgICAgICAgICAgICAgIHtJbnRQb3J0LF99IHdoZW4gaXNfaW50ZWdlcihJbnRQb3J0KSAtPgorICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IEludFBvcnR9OworICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS10cmFuc3BvcnQ9IiArKyBUcmFucyAtPgorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnMgb2YKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OworICAgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cworICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXNzbCIgLT4KKyAgICAgICAgICAgICAgICBzc2w6c3RhcnQoKSwKKyAgICAgICAgICAgICAgICBTc2xPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAge3NzbG9wdGlvbnMsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VydGZpbGUsICIuLi9rZXlzL3NlcnZlci5wZW0ifQorICAgICAgICAgICAgICAgICAgICAgICAgLHtrZXlmaWxlLCAgIi4uL2tleXMvc2VydmVyLmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9IHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgIGVuZCwKKyAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgorCitzdGFydCgpIC0+IHN0YXJ0KGluaXQ6Z2V0X3BsYWluX2FyZ3VtZW50cygpKS4KK3N0YXJ0KEFyZ3MpIC0+CisgICAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIHNlcnZlcl9vcHRzID0gU2VydmVyT3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAorICAgIHNwYXduKGZ1bigpIC0+IHN0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cyksIHJlY2VpdmUgYWZ0ZXIgaW5maW5pdHkgLT4gb2sgZW5kIGVuZCkuCisKK3N0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cykgLT4KKyAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdGFydChbe2hhbmRsZXIsID9NT0RVTEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2VydmljZSwgdGhyaWZ0X3Rlc3RfdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BvcnQsIFBvcnR9XSArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlck9wdHMpLgorCisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0Vm9pZCwge30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0Vm9pZH5uIiksCisgICAgb2s7CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nLCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0U3RyaW5nOiB+cH5uIiwgW1NdKSwKKyAgICB7cmVwbHksIFN9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEJvb2wsIHtCfSkgd2hlbiBpc19ib29sZWFuKEIpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0Qm9vbDogfnB+biIsIFtCXSksCisgICAge3JlcGx5LCBCfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCeXRlLCB7STh9KSB3aGVuIGlzX2ludGVnZXIoSTgpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0Qnl0ZTogfnB+biIsIFtJOF0pLAorICAgIHtyZXBseSwgSTh9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEkzMiwge0kzMn0pIHdoZW4gaXNfaW50ZWdlcihJMzIpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0STMyOiB+cH5uIiwgW0kzMl0pLAorICAgIHtyZXBseSwgSTMyfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJNjQsIHtJNjR9KSB3aGVuIGlzX2ludGVnZXIoSTY0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEk2NDogfnB+biIsIFtJNjRdKSwKKyAgICB7cmVwbHksIEk2NH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RG91YmxlLCB7RG91YmxlfSkgd2hlbiBpc19mbG9hdChEb3VibGUpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RG91YmxlOiB+cH5uIiwgW0RvdWJsZV0pLAorICAgIHtyZXBseSwgRG91YmxlfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCaW5hcnksIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RCaW5hcnk6IH5wfm4iLCBbU10pLAorICAgIHtyZXBseSwgU307CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAorICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBJMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBJNjR9fSkKK3doZW4gaXNfYmluYXJ5KFN0cmluZyksCisgICAgIGlzX2ludGVnZXIoQnl0ZSksCisgICAgIGlzX2ludGVnZXIoSTMyKSwKKyAgICAgaXNfaW50ZWdlcihJNjQpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0U3RydWN0OiB+cH5uIiwgW1N0cnVjdF0pLAorICAgIHtyZXBseSwgU3RydWN0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3ROZXN0LAorICAgICAgICAgICAgICAgIHtOZXN0fSkgd2hlbiBpc19yZWNvcmQoTmVzdCwgJ3RocmlmdC50ZXN0Llh0cnVjdDInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVjb3JkKE5lc3QjJ3RocmlmdC50ZXN0Llh0cnVjdDInLnN0cnVjdF90aGluZywgJ3RocmlmdC50ZXN0Llh0cnVjdCcpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TmVzdDogfnB+biIsIFtOZXN0XSksCisgICAge3JlcGx5LCBOZXN0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXAsIHtNYXB9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE1hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAorICAgIHtyZXBseSwgTWFwfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJpbmdNYXAsIHtNYXB9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZ01hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAorICAgIHtyZXBseSwgTWFwfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RTZXQsIHtTZXR9KSAtPgorICAgIHRydWUgPSBzZXRzOmlzX3NldChTZXQpLAorICAgIGlvOmZvcm1hdCgidGVzdFNldDogfnB+biIsIFtzZXRzOnRvX2xpc3QoU2V0KV0pLAorICAgIHtyZXBseSwgU2V0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RMaXN0LCB7TGlzdH0pIHdoZW4gaXNfbGlzdChMaXN0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdExpc3Q6IH5wfm4iLCBbTGlzdF0pLAorICAgIHtyZXBseSwgTGlzdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RW51bSwge0VudW19KSB3aGVuIGlzX2ludGVnZXIoRW51bSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RFbnVtOiB+cH5uIiwgW0VudW1dKSwKKyAgICB7cmVwbHksIEVudW19OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFR5cGVkZWYsIHtVc2VySUR9KSB3aGVuIGlzX2ludGVnZXIoVXNlcklEKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFR5cGVkZWY6IH5wfm4iLCBbVXNlcklEXSksCisgICAge3JlcGx5LCBVc2VySUR9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE1hcE1hcCwge0hlbGxvfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RNYXBNYXA6IH5wfm4iLCBbSGVsbG9dKSwKKworICAgIFBvc0xpc3QgPSBbe0ksIEl9ICAgfHwgSSA8LSBsaXN0czpzZXEoMSwgNCldLAorICAgIE5lZ0xpc3QgPSBbey1JLCAtSX0gfHwgSSA8LSBsaXN0czpzZXEoMSwgNCldLAorCisgICAgTWFwTWFwID0gZGljdDpmcm9tX2xpc3QoW3s0LCAgZGljdDpmcm9tX2xpc3QoUG9zTGlzdCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIGRpY3Q6ZnJvbV9saXN0KE5lZ0xpc3QpfV0pLAorICAgIHtyZXBseSwgTWFwTWFwfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJbnNhbml0eSwge0luc2FuaXR5fSkgd2hlbiBpc19yZWNvcmQoSW5zYW5pdHksICd0aHJpZnQudGVzdC5JbnNhbml0eScpIC0+CisgICAgSGVsbG8gPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCisKKyAgICBHb29kYnllID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8Ikdvb2RieWU0Ij4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSA0fSwKKyAgICBDcmF6eSA9ICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkneworICAgICAgICAgICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRUlHSFQsIDh9XSksCisgICAgICAgICAgICAgICB4dHJ1Y3RzID0gW0dvb2RieWVdCisgICAgICAgICAgICAgIH0sCisKKyAgICBMb29uZXkgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3t9LAorCisgICAgRmlyc3RNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1RXTywgSW5zYW5pdHl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/VEhSSUZUX1RFU1RfTlVNQkVSWl9USFJFRSwgSW5zYW5pdHl9XSksCisKKyAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1NJWCwgTG9vbmV5fV0pLAorCisgICAgSW5zYW5lID0gZGljdDpmcm9tX2xpc3QoW3sxLCBGaXJzdE1hcH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBTZWNvbmRNYXB9XSksCisKKyAgICBpbzpmb3JtYXQoIlJldHVybiA9IH5wfm4iLCBbSW5zYW5lXSksCisKKyAgICB7cmVwbHksIEluc2FuZX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGksIEFyZ3MgPSB7QXJnMCwgQXJnMSwgQXJnMiwgX0FyZzMsIEFyZzQsIEFyZzV9KQorICB3aGVuIGlzX2ludGVnZXIoQXJnMCksCisgICAgICAgaXNfaW50ZWdlcihBcmcxKSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzIpLAorICAgICAgIGlzX2ludGVnZXIoQXJnNCksCisgICAgICAgaXNfaW50ZWdlcihBcmc1KSAtPgorCisgICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGkofnApfm4iLCBbQXJnc10pLAorICAgIHtyZXBseSwgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gQXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBBcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEFyZzJ9fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RFeGNlcHRpb24sIHtTdHJpbmd9KSB3aGVuIGlzX2JpbmFyeShTdHJpbmcpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RXhjZXB0aW9uKH5wKX5uIiwgW1N0cmluZ10pLAorICAgIGNhc2UgU3RyaW5nIG9mCisgICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmd9KTsKKyAgICAgICAgPDwiVEV4Y2VwdGlvbiI+PiAtPgorICAgICAgICAgICAgdGhyb3coez9UQXBwbGljYXRpb25FeGNlcHRpb25fU3RydWN0dXJlfSk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIG9rCisgICAgZW5kOworCitoYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpRXhjZXB0aW9uLCB7QXJnMCwgQXJnMX0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGlFeGNlcHRpb24ofnAsIH5wKX5uIiwgW0FyZzAsIEFyZzFdKSwKKyAgICBjYXNlIEFyZzAgb2YKKyAgICAgICAgPDwiWGNlcHRpb24iPj4gLT4KKyAgICAgICAgICAgIHRocm93KCMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSk7CisgICAgICAgIDw8IlhjZXB0aW9uMiI+PiAtPgorICAgICAgICAgICAgdGhyb3coIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24yIj4+fX0pOworICAgICAgICBfIC0+CisgICAgICAgICAgICB7cmVwbHksICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSBBcmcxfX0KKyAgICBlbmQ7CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0T25ld2F5LCB7U2Vjb25kc30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0T25ld2F5OiB+cH5uIiwgW1NlY29uZHNdKSwKKyAgICB0aW1lcjpzbGVlcCgxMDAwICogU2Vjb25kcyksCisgICAgb2suCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYyBiL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZWY5OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwpAQCAtMCwwICsxLDU0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKyUlJSAtKi0gbW9kZTplcmxhbmcgLSotCit7YXBwbGljYXRpb24sIHRocmlmdF90ZXN0LCBbCisgICUgQSBxdWljayBkZXNjcmlwdGlvbiBvZiB0aGUgYXBwbGljYXRpb24uCisgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBjcm9zcyBsYW5ndWFnZSB0ZXN0In0sCisKKyAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgorICB7dnNuLCAiMS4wLjAifSwKKworICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICB7bW9kdWxlcywgWworICAgIHRlc3RfY2xpZW50LAorICAgIHRlc3RfdGhyaWZ0X3NlcnZlcgorICBdfSwKKworICAlIEFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBuYW1lcyB0aGUgYXBwbGljYXRpb24gdXNlcy4gVGhpcyBjYW4gYmUgaWdub3JlZC4KKyAge3JlZ2lzdGVyZWQsIFtdfSwKKworICAlIEFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0byBiZSBzdGFydGVkIHByaW9yIHRvIHRoaXMgb25lLiBUaGlzIGNhbiBiZSBpZ25vcmVkCisgICUgbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGl0IHdlbGwgYW5kIGxldCB0aGUgLnJlbCBmaWxlcyBpbgorICAlIHlvdXIgcmVsZWFzZSBoYW5kbGUgdGhpcy4KKyAge2FwcGxpY2F0aW9ucywgW2tlcm5lbCwgc3RkbGliXX0sCisKKyAgJSBPVFAgYXBwbGljYXRpb24gbG9hZGVyIHdpbGwgbG9hZCwgYnV0IG5vdCBzdGFydCwgaW5jbHVkZWQgYXBwcy4gQWdhaW4KKyAgJSB0aGlzIGNhbiBiZSBpZ25vcmVkIGFzIHdlbGwuICBUbyBsb2FkIGJ1dCBub3Qgc3RhcnQgYW4gYXBwbGljYXRpb24gaXQKKyAgJSBpcyBlYXNpZXIgdG8gaW5jbHVkZSBpdCBpbiB0aGUgLnJlbCBmaWxlIGZvbGxvd2VkIGJ5IHRoZSBhdG9tICdub25lJworICB7aW5jbHVkZWRfYXBwbGljYXRpb25zLCBbXX0sCisKKyAgJSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc2ltaWxhciB0byB0aG9zZSBpbiB0aGUgY29uZmlnIGZpbGUgc3BlY2lmaWVkCisgICUgb24gdGhlIGNvbW1hbmQgbGluZS4gY2FuIGJlIGZldGNoZWQgd2l0aCBnYXM6Z2V0X2VudgorICB7ZW52LCBbCisgICAgJSBJZiBhbiBlcnJvci9jcmFzaCBvY2N1cnMgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYSBmdW5jdGlvbiwKKyAgICAlIHNob3VsZCB0aGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHNlcmlhbGl6ZWQgYmFjayB0byB0aGUgY2xpZW50CisgICAgJSBpbmNsdWRlIHRoZSBlcmxhbmcgYmFja3RyYWNlPworICAgIHtleGNlcHRpb25zX2luY2x1ZGVfdHJhY2VzLCB0cnVlfQorICBdfQorXX0uCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzdkNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwIEBACisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0VYVFJBX0RJU1QgPSBcCisJbG9jYWxfdGhyaWZ0IFwKKwlpbmRleC5odG1sIFwKKwljb250YWluZXJfbGltaXQucHkgXAorCWluZGV4Lmh0bWwgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCU1ha2VmaWxlLmFtIFwKKyAgICAgICAgbm9zc2x2My5zaCBcCisJc3RyaW5nX2xpbWl0LnB5IFwKKwl0ZXN0cy5qc29uIFwKKwl0aGVhZGVyX2JpbmFyeS5weSBcCisJc2V0dXAuY2ZnIFwKKyAgICAgICAgdGxzLnNoIFwKKwl1dGlsLnB5CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Zjg0ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weQpAQCAtMCwwICsxLDcyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3RfbGlzdChwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RMaXN0JworICAgIHR0eXBlID0gVFR5cGUuTElTVAorICAgIGV0eXBlID0gVFR5cGUuSTMyCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kX25hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4obWV0aG9kX25hbWUgKyAnX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRCZWdpbigndGhpbmcnLCB0dHlwZSwgMSkKKyAgICBwcm90by53cml0ZUxpc3RCZWdpbihldHlwZSwgbGVuKHZhbHVlKSkKKyAgICBmb3IgZSBpbiB2YWx1ZToKKyAgICAgICAgcHJvdG8ud3JpdGVJMzIoZSkKKyAgICBwcm90by53cml0ZUxpc3RFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgZXR5cGUyLCBsZW4yID0gcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgYXNzZXJ0IGV0eXBlID09IGV0eXBlMgorICAgIGFzc2VydCBsZW4yID09IGxlbih2YWx1ZSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4yKToKKyAgICAgICAgdiA9IHByb3RvLnJlYWRJMzIoKQorICAgICAgICBhc3NlcnQgdiA9PSB2YWx1ZVtpXQorICAgIHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tbGltaXQnLCB0eXBlPWludCkKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBwcm90byA9IGluaXRfcHJvdG9jb2woYXJncykKKyAgICAjIFRPRE86IHRlc3Qgc2V0IGFuZCBtYXAKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICBwcmludCgnW09LXTogbGltaXQgLSAxJykKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCkpKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0KSkpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgKyAxKSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sIGIvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nIGZpbGVzPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gYi90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3Njk2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgpAQCAtMCwwICsxLDUwIEBACitbCisgICAgImNfZ2xpYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNfZ2xpYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfY29tcGFjdF9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJwZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJuZXRjb3JlLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIgorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkgYi90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVjZWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitfUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfU0NSSVBUX0RJUikpKQorX0xJQkRJUiA9IG9zLnBhdGguam9pbihfUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQorCitmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2IoX0xJQkRJUik6CisgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJwYXRoKQorICAgICAgICB0aHJpZnQgPSBfX2ltcG9ydF9fKCd0aHJpZnQnKQorICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoIGIvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2NhMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBhbGxvd2VkIGJ5IGEgc2VydmVyLgorIworCitUSFJJRlRIT1NUPWxvY2FsaG9zdAorVEhSSUZUUE9SVD05MDkwCisKK3doaWxlIFtbICQjIC1nZSAxIF1dOyBkbworICBhcmc9IiQxIgorICBhcmdJTj0oJHthcmcvLz0vIH0pCisKKyAgY2FzZSAke2FyZ0lOWzBdfSBpbgorICAgIC1ofC0taG9zdCkKKyAgICBUSFJJRlRIT1NUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtcHwtLXBvcnQpCisgICAgVEhSSUZUUE9SVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAjIHVua25vd24gb3B0aW9uIGlnbm9yZWQKKyAgICA7OworICBlc2FjCisKKyAgc2hpZnQgICAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKK2RvbmUKKworZnVuY3Rpb24gbm9zc2x2MworeworICBsb2NhbCBuZWdvCisgIGxvY2FsIG5lZ29kZW5pZWQKKyAgbG9jYWwgb3BlbnNzbHYKKworICBvcGVuc3Nsdj0kKG9wZW5zc2wgdmVyc2lvbiB8IGN1dCAtZCcgJyAtZjIpCisgIGlmIFtbICRvcGVuc3NsdiA+ICIxLjAiIF1dOyB0aGVuCisgICAgZWNobyAiW3Bhc3NdIE9wZW5TU0wgMS4xIG9yIGxhdGVyIC0gbm8gbmVlZCB0byBjaGVjayBzc2wzIgorICAgIHJldHVybiAwCisgIGZpCisKKyAgIyBlY2hvICJvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLXNzbDMgMj4mMSA8IC9kZXYvbnVsbCIKKyAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsKQorICBuZWdvZGVuaWVkPSQ/CisKKyAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lIDAgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gU1NMdjMgbmVnb3RpYXRpb24gZGlzYWJsZWQiCisgICAgZWNobyAkbmVnbworICAgIHJldHVybiAwCisgIGZpCisKKyAgZWNobyAiW2ZhaWxdIFNTTHYzIG5lZ290aWF0aW9uIGVuYWJsZWQhICBzdGRvdXQ6IgorICBlY2hvICRuZWdvCisgIHJldHVybiAxCit9CisKK25vc3NsdjMKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnIGIvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMWY5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkgYi90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk5MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKQEAgLTAsMCArMSw2MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncywgaW5pdF9wcm90b2NvbAorZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKKworCisjIFRPRE86IGdlbmVyYXRlIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKK2RlZiB0ZXN0X3N0cmluZyhwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RTdHJpbmcnCisgICAgdHR5cGUgPSBUVHlwZS5TVFJJTkcKKyAgICBwcm90by53cml0ZU1lc3NhZ2VCZWdpbihtZXRob2RfbmFtZSwgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihtZXRob2RfbmFtZSArICdfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKCd0aGluZycsIHR0eXBlLCAxKQorICAgIHByb3RvLndyaXRlU3RyaW5nKHZhbHVlKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgcmVzdWx0ID0gcHJvdG8ucmVhZFN0cmluZygpCisgICAgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICBfLCBmdHlwZSwgXyA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZnR5cGUgPT0gVFR5cGUuU1RPUAorICAgIHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHByb3RvLnJlYWRNZXNzYWdlRW5kKCkKKyAgICBhc3NlcnQgdmFsdWUgPT0gcmVzdWx0CisKKworZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1saW1pdCcsIHR5cGU9aW50KQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIHByb3RvID0gaW5pdF9wcm90b2NvbChhcmdzKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCAtIDEpKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCAtIDEpKQorICAgIHByaW50KCdbT0tdOiBsaW1pdCAtIDEnKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiBhcmdzLmxpbWl0KQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiBhcmdzLmxpbWl0KQorICAgIHByaW50KCdbT0tdOiBqdXN0IGxpbWl0JykKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCArIDEpKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHByaW50KCdbT0tdOiBsaW1pdCArIDEnKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCdbRVJST1JdOiBsaW1pdCArIDEnKQorICAgICAgICBhc3NlcnQgRmFsc2UKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uIGIvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTA3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KQEAgLTAsMCArMSwxMTQgQEAKK1sKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgdW5mcmFtZWQgYmluYXJ5IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX3VuZnJhbWVkX2JpbmFyeSIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1iaW5hcnkiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWJ1ZmZlcmVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIGZyYW1lZCBiaW5hcnkgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfZnJhbWVkX2JpbmFyeSIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1iaW5hcnkiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyB1bmZyYW1lZCBjb21wYWN0IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX3VuZnJhbWVkX2NvbXBhY3QiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9Y29tcGFjdCIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9YnVmZmVyZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgZnJhbWVkIGNvbXBhY3Qgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfZnJhbWVkX2NvbXBhY3QiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9Y29tcGFjdCIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9ZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsaW1pdF9zdHJpbmdfbGVuZ3RoIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInN0cmluZ19saW1pdC5weSIsCisgICAgICAiLS1saW1pdD01MCIKKyAgICBdLAorICAgICJyZW1vdGVfYXJncyI6IFsKKyAgICAgICItLXN0cmluZy1saW1pdD01MCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibGltaXRfY29udGFpbmVyX2xlbmd0aCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJjb250YWluZXJfbGltaXQucHkiLAorICAgICAgIi0tbGltaXQ9NTAiCisgICAgXSwKKyAgICAicmVtb3RlX2FyZ3MiOiBbCisgICAgICAiLS1jb250YWluZXItbGltaXQ9NTAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vc3NsdjMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBTU0x2MyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJub3NzbHYzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAidGxzIiwKKyAgICAiY29tbWVudCI6ICJjaGVjayB0byBtYWtlIHN1cmUgVExTdjEuMCBvciBsYXRlciBpcyBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgInRscy5zaCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcC1zc2wiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weSBiL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMzk5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkKQEAgLTAsMCArMSw3MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncworZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorCisKK2RlZiB0ZXN0X3ZvaWQocHJvdG8pOgorICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKCd0ZXN0Vm9pZCcsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4oJ3Rlc3RWb2lkX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKKyMgVEhlYWRlciBzdGFjayBzaG91bGQgYWNjZXB0IGJpbmFyeSBwcm90b2NvbCB3aXRoIG9wdGlvbmFsbHkgZnJhbWVkIHRyYW5zcG9ydAorZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICAjIFNpbmNlIFRIZWFkZXJUcmFuc3BvcnQgYWN0cyBhcyBmcmFtZWQgdHJhbnNwb3J0IHdoZW4gZGV0ZWN0ZWQgZnJhbWUsIHdlCisgICAgIyBjYW5ub3QgdXNlIC0tdHJhbnNwb3J0PWZyYW1lZCBhcyBpdCB3b3VsZCByZXN1bHQgaW4gMiBsYXllcmVkIGZyYW1lcy4KKyAgICBwLmFkZF9hcmd1bWVudCgnLS1vdmVycmlkZS10cmFuc3BvcnQnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLW92ZXJyaWRlLXByb3RvY29sJykKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBhc3NlcnQgYXJncy5wcm90b2NvbCA9PSAnaGVhZGVyJworICAgIGFzc2VydCBhcmdzLnRyYW5zcG9ydCA9PSAnYnVmZmVyZWQnCisgICAgYXNzZXJ0IG5vdCBhcmdzLnNzbAorCisgICAgc29jayA9IFRTb2NrZXQoYXJncy5ob3N0LCBhcmdzLnBvcnQsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX0lORVQpCisgICAgaWYgbm90IGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0IG9yIGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0ID09ICdidWZmZXJlZCc6CisgICAgICAgIHRyYW5zID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2spCisgICAgZWxpZiBhcmdzLm92ZXJyaWRlX3RyYW5zcG9ydCA9PSAnZnJhbWVkJzoKKyAgICAgICAgcHJpbnQoJ1RGUkFNRUQnKQorICAgICAgICB0cmFucyA9IFRGcmFtZWRUcmFuc3BvcnQoc29jaykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHRyYW5zcG9ydCcpCisgICAgdHJhbnMub3BlbigpCisKKyAgICBpZiBub3QgYXJncy5vdmVycmlkZV9wcm90b2NvbCBvciBhcmdzLm92ZXJyaWRlX3Byb3RvY29sID09ICdiaW5hcnknOgorICAgICAgICBwcm90byA9IFRCaW5hcnlQcm90b2NvbCh0cmFucykKKyAgICBlbGlmIGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgPT0gJ2NvbXBhY3QnOgorICAgICAgICBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCB0cmFuc3BvcnQnKQorCisgICAgdGVzdF92b2lkKHByb3RvKQorICAgIHRlc3Rfdm9pZChwcm90bykKKworICAgIHRyYW5zLmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdGxzLnNoIGIvdGVzdC9mZWF0dXJlcy90bHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFkYTZhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGxzLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgQ2hlY2tzIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIGFsbG93ZWQgYnkgYSBzZXJ2ZXIuCisjCisKK1RIUklGVEhPU1Q9bG9jYWxob3N0CitUSFJJRlRQT1JUPTkwOTAKKword2hpbGUgW1sgJCMgLWdlIDEgXV07IGRvCisgIGFyZz0iJDEiCisgIGFyZ0lOPSgke2FyZy8vPS8gfSkKKworICBjYXNlICR7YXJnSU5bMF19IGluCisgICAgLWh8LS1ob3N0KQorICAgIFRIUklGVEhPU1Q9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgIC1wfC0tcG9ydCkKKyAgICBUSFJJRlRQT1JUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAqKQorICAgICAgICAgICMgdW5rbm93biBvcHRpb24gaWdub3JlZAorICAgIDs7CisgIGVzYWMKKworICBzaGlmdCAgICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCitkZWNsYXJlIC1BIEVYUEVDVF9ORUdPVElBVEUKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV09MQorRVhQRUNUX05FR09USUFURVt0bHMxXzFdPTEKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV8yXT0xCisKK2ZhaWx1cmVzPTAKKworZnVuY3Rpb24gdGxzCit7CisgIGZvciBQUk9UTyBpbiAiJHshRVhQRUNUX05FR09USUFURVtAXX0iOyBkbworCisgICAgbG9jYWwgbmVnbworICAgIGxvY2FsIG5lZ29kZW5pZWQKKyAgICBsb2NhbCByZXMKKworICAgIGVjaG8gIm9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtJFBST1RPIDI+JjEgPCAvZGV2L251bGwiCisgICAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtJFBST1RPIDI+JjEgPCAvZGV2L251bGwpCisgICAgbmVnb2RlbmllZD0kPworICAgIGVjaG8gInJlc3VsdCBvZiBjb21tYW5kOiAkbmVnb2RlbmllZCIKKworICAgIHJlcz0iZW5hYmxlZCI7IGlmIFtbICR7RVhQRUNUX05FR09USUFURVskUFJPVE9dfSAtZXEgMCBdXTsgdGhlbiByZXM9ImRpc2FibGVkIjsgZmkKKworICAgIGlmIFtbICRuZWdvZGVuaWVkIC1uZSAke0VYUEVDVF9ORUdPVElBVEVbJFBST1RPXX0gXV07IHRoZW4KKyAgICAgIGVjaG8gIiRQUk9UTyBuZWdvdGlhdGlvbiBhbGxvd2VkIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIlt3YXJuXSAkUFJPVE8gbmVnb3RpYXRpb24gZGlkIG5vdCB3b3JrIgorICAgICAgZWNobyAkbmVnbworICAgICAgKChmYWlsdXJlcysrKSkKKyAgICBmaQorICBkb25lCit9CisKK3RscworCitpZiBbWyAkZmFpbHVyZXMgLWVxIDMgXV07IHRoZW4KKyAgZWNobyAiW2ZhaWxdIEF0IGxlYXN0IG9uZSBvZiBUTFN2MS4wLCBUTFN2MS4xLCBvciBUTFN2MS4yIG5lZWRzIHRvIHdvcmssIGJ1dCBkb2VzIG5vdCIKKyAgZXhpdCAkZmFpbHVyZXMKK2ZpCisKK2VjaG8gIltwYXNzXSBBdCBsZWFzdCBvbmUgb2YgVExTdjEuMCwgVExTdjEuMSwgb3IgVExTdjEuMiB3b3JrZWQiCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdXRpbC5weSBiL3Rlc3QvZmVhdHVyZXMvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJiYmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy91dGlsLnB5CkBAIC0wLDAgKzEsNDAgQEAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAorCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQgaW1wb3J0IFRIdHRwQ2xpZW50Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorCisKK2RlZiBhZGRfY29tbW9uX2FyZ3MocCk6CisgICAgcC5hZGRfYXJndW1lbnQoJy0taG9zdCcsIGRlZmF1bHQ9J2xvY2FsaG9zdCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tcG9ydCcsIHR5cGU9aW50LCBkZWZhdWx0PTkwOTApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tcHJvdG9jb2wnLCBkZWZhdWx0PSdiaW5hcnknKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXRyYW5zcG9ydCcsIGRlZmF1bHQ9J2J1ZmZlcmVkJykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1zc2wnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorCisKK2RlZiBwYXJzZV9jb21tb25fYXJncyhhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHJldHVybiBwLnBhcnNlX2FyZ3MoYXJndikKKworCitkZWYgaW5pdF9wcm90b2NvbChhcmdzKToKKyAgICBzb2NrID0gVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfSU5FVCkKKyAgICBzb2NrLnNldFRpbWVvdXQoNTAwKQorICAgIHRyYW5zID0geworICAgICAgICAnYnVmZmVyZWQnOiBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgICAgICdmcmFtZWQnOiBURnJhbWVkVHJhbnNwb3J0LAorICAgICAgICAnaHR0cCc6IFRIdHRwQ2xpZW50LAorICAgIH1bYXJncy50cmFuc3BvcnRdKHNvY2spCisgICAgdHJhbnMub3BlbigpCisgICAgcmV0dXJuIHsKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbCwKKyAgICAgICAgJ2NvbXBhY3QnOiBUQ29tcGFjdFByb3RvY29sLAorICAgICAgICAnanNvbic6IFRKU09OUHJvdG9jb2wsCisgICAgfVthcmdzLnByb3RvY29sXSh0cmFucykKZGlmZiAtLWdpdCBhL3Rlc3QvZ28vTWFrZWZpbGUuYW0gYi90ZXN0L2dvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTgzMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCVUlMVF9TT1VSQ0VTID0gZ29wYXRoCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQkKENPTVBJTEVSX0VYVFJBRkxBRykKK1RIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IGJpbi90ZXN0Y2xpZW50IGJpbi90ZXN0c2VydmVyCisKK1RocmlmdFRlc3QudGhyaWZ0OiAkKFRIUklGVFRFU1QpCisJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpID4gVGhyaWZ0VGVzdC50aHJpZnQKKworLlBIT05ZOiBnb3BhdGgKKworIyBUaHJpZnQgZm9yIEdPIGhhcyBwcm9ibGVtcyB3aXRoIGNvbXBsZXggbWFwIGtleXM6IFRIUklGVC0yMDYzCitnb3BhdGg6ICQoVEhSSUZUKSBUaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIHNyYy9nZW4KKwkkKFRIUklGVENNRCkgVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVENNRCkgLi4vU3RyZXNzVGVzdC50aHJpZnQKKwlHT1BBVEg9YHB3ZGAgJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIHx8IHRydWUKKwlzZWQgLWkgJ3MvXCJjb250ZXh0XCIvXCJnb2xhbmcub3JnXC94XC9uZXRcL2NvbnRleHRcIi9nJyBzcmMvZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2svY29udHJvbGxlci5nbyB8fCB0cnVlCisJR09QQVRIPWBwd2RgICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jaworCWxuIC1uZnMgLi4vLi4vLi4vbGliL2dvL3RocmlmdCBzcmMvdGhyaWZ0CisJdG91Y2ggZ29wYXRoCisKK2Jpbi90ZXN0Y2xpZW50OiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAgJChHTykgaW5zdGFsbCBiaW4vdGVzdGNsaWVudAorCitiaW4vdGVzdHNlcnZlcjogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgYmluL3Rlc3RzZXJ2ZXIKKworYmluL3N0cmVzczogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgYmluL3N0cmVzcworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBzcmMvZ2VuIHNyYy9naXRodWIuY29tL2dvbGFuZyBzcmMvdGhyaWZ0IGJpbiBwa2cgZ29wYXRoIFRocmlmdFRlc3QudGhyaWZ0CisKK2NoZWNrX1BST0dSQU1TOiBiaW4vdGVzdGNsaWVudCBiaW4vdGVzdHNlcnZlciBiaW4vc3RyZXNzCisKK2NoZWNrOiBnb3BhdGggZ2VubW9jaworCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC12IGNvbW1vbi8uLi4KKworZ2VubW9jazogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9tb2NrZ2VuCisJR09QQVRIPWBwd2RgIGJpbi9tb2NrZ2VuIC1kZXN0aW5hdGlvbj1zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbyAtcGFja2FnZT1jb21tb24gZ2VuL3RocmlmdHRlc3QgVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCXNyYy9iaW4gXAorCXNyYy9jb21tb24KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmUwZjIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgbWFpbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbGFnIgorCSJmbXQiCisJImdlbi9zdHJlc3MiCisJImxvZyIKKwlfICJuZXQvaHR0cC9wcHJvZiIKKwkib3MiCisJInJ1bnRpbWUiCisJInJ1bnRpbWUvcHByb2YiCisJInN5bmMiCisJInN5bmMvYXRvbWljIgorCSJ0aHJpZnQiCisJInRpbWUiCispCisKK3ZhciBjcHVwcm9maWxlID0gZmxhZy5TdHJpbmcoImNwdXByb2ZpbGUiLCAiIiwgIndyaXRlIGNwdSBwcm9maWxlIHRvIHRoaXMgZmlsZSIpCit2YXIgbWVtcHJvZmlsZSA9IGZsYWcuU3RyaW5nKCJtZW1wcm9maWxlIiwgIiIsICJ3cml0ZSBtZW1vcnkgcHJvZmlsZSB0byB0aGlzIGZpbGUiKQorCit2YXIgKAorCWhvc3QgICAgICA9IGZsYWcuU3RyaW5nKCJob3N0IiwgImxvY2FsaG9zdCIsICJIb3N0IHRvIGNvbm5lY3QiKQorCXBvcnQgICAgICA9IGZsYWcuSW50NjQoInBvcnQiLCA5MDkxLCAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpCisJbG9vcCAgICAgID0gZmxhZy5JbnQoImxvb3BzIiwgNTAwMDAsICJUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMiKQorCXJ1bnNlcnZlciA9IGZsYWcuSW50KCJzZXJ2ZXIiLCAxLCAiUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2VzcyIpCisJY2xpZW50cyAgID0gZmxhZy5JbnQoImNsaWVudHMiLCAyMCwgIk51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiBzZXJ2ZXIgb25seSIpCisJY2FsbE5hbWUgID0gZmxhZy5TdHJpbmcoImNhbGwiLCAiZWNob1ZvaWQiLCAiU2VydmljZSBtZXRob2QgdG8gY2FsbCwgb25lIG9mIGVjaG9Wb2lkLCBlY2hvQnl0ZSwgZWNob0kzMiwgZWNob0k2NCwgZWNob1N0cmluZywgZWNoaUxpc3QsIGVjaG9TZXQsIGVjaG9NYXAiKQorCWNvbXBhY3QgICA9IGZsYWcuQm9vbCgiY29tcGFjdCIsIGZhbHNlLCAiVXNlIGNvbXBhY3QgcHJvdG9jb2wgaW5zdGVhZCBvZiBiaW5hcnkuIikKKwlmcmFtZWQgICAgPSBmbGFnLkJvb2woImZyYW1lZCIsIGZhbHNlLCAiVXNlIGZyYW1lZCB0cmFuc3BvcnQgaW5zdGVhZCBvZiBidWZmZXJlZC4iKQorKQordmFyIGhvc3RQb3J0IHN0cmluZworCit0eXBlIGNhbGxUIGludDY0CisKK2NvbnN0ICgKKwllY2hvVm9pZCBjYWxsVCA9IGlvdGEKKwllY2hvQnl0ZQorCWVjaG9JMzIKKwllY2hvSTY0CisJZWNob1N0cmluZworCWVjaGlMaXN0CisJZWNob1NldAorCWVjaG9NYXAKKykKKwordmFyIGNhbGxUTWFwID0gbWFwW3N0cmluZ11jYWxsVHsKKwkiZWNob1ZvaWQiOiAgIGVjaG9Wb2lkLAorCSJlY2hvQnl0ZSI6ICAgZWNob0J5dGUsCisJImVjaG9JMzIiOiAgICBlY2hvSTMyLAorCSJlY2hvSTY0IjogICAgZWNob0k2NCwKKwkiZWNob1N0cmluZyI6IGVjaG9TdHJpbmcsCisJImVjaGlMaXN0IjogICBlY2hpTGlzdCwKKwkiZWNob1NldCI6ICAgIGVjaG9TZXQsCisJImVjaG9NYXAiOiAgICBlY2hvTWFwLAorfQordmFyIGNhbGxUeXBlIGNhbGxUCisKK3ZhciByZWFkeSwgZG9uZSBzeW5jLldhaXRHcm91cAorCit2YXIgY2xpY291bnRlciBpbnQ2NCA9IDAKK3ZhciBjb3VudGVyIGludDY0ID0gMAorCitmdW5jIG1haW4oKSB7CisJZmxhZy5QYXJzZSgpCisJaWYgKm1lbXByb2ZpbGUgIT0gIiIgeworCQlydW50aW1lLk1lbVByb2ZpbGVSYXRlID0gMTAwCisJfQorCXZhciBvayBib29sCisJaWYgY2FsbFR5cGUsIG9rID0gY2FsbFRNYXBbKmNhbGxOYW1lXTsgIW9rIHsKKwkJbG9nLkZhdGFsKCJVbmtub3duIHNlcnZpY2UgY2FsbCIsICpjYWxsTmFtZSkKKwl9CisJaWYgKmNwdXByb2ZpbGUgIT0gIiIgeworCQlmLCBlcnIgOj0gb3MuQ3JlYXRlKCpjcHVwcm9maWxlKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWxvZy5GYXRhbChlcnIpCisJCX0KKwkJcHByb2YuU3RhcnRDUFVQcm9maWxlKGYpCisJCWRlZmVyIHBwcm9mLlN0b3BDUFVQcm9maWxlKCkKKwl9CisJaG9zdFBvcnQgPSBmbXQuU3ByaW50ZigiJXM6JWQiLCAqaG9zdCwgKnBvcnQpCisJdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQorCXZhciB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeQorCisJaWYgKmNvbXBhY3QgeworCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCX0gZWxzZSB7CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJfQorCisJaWYgKmZyYW1lZCB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDgxOTIpCisJfQorCisJaWYgKnJ1bnNlcnZlciA+IDAgeworCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChob3N0UG9ydCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQ6ICVzIiwgZXJyKQorCQl9CisKKwkJcHJvY2Vzc29yIDo9IHN0cmVzcy5OZXdTZXJ2aWNlUHJvY2Vzc29yKCZoYW5kbGVye30pCisJCXNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwkJaWYgKmNsaWVudHMgPT0gMCB7CisJCQlzZXJ2ZXIuU2VydmUoKQorCQl9IGVsc2UgeworCQkJZ28gc2VydmVyLlNlcnZlKCkKKwkJfQorCX0KKwkvL3N0YXJ0IGNsaWVudHMKKwlpZiAqY2xpZW50cyAhPSAwIHsKKwkJcmVhZHkuQWRkKCpjbGllbnRzICsgMSkKKwkJZG9uZS5BZGQoKmNsaWVudHMpCisJCWZvciBpIDo9IDA7IGkgPCAqY2xpZW50czsgaSsrIHsKKwkJCWdvIGNsaWVudChwcm90b2NvbEZhY3RvcnkpCisJCX0KKwkJcmVhZHkuRG9uZSgpCisJCXJlYWR5LldhaXQoKQorCQkvL3J1biEKKwkJc3RhcnRUaW1lIDo9IHRpbWUuTm93KCkKKwkJLy93YWl0IGZvciBjb21wbGV0aW9uCisJCWRvbmUuV2FpdCgpCisJCWVuZFRpbWUgOj0gdGltZS5Ob3coKQorCQlkdXJhdGlvbiA6PSBlbmRUaW1lLlN1YihzdGFydFRpbWUpCisJCWxvZy5QcmludGYoIiVkIGNhbGxzIGluICV2ICglZiBjYWxscyBwZXIgc2Vjb25kKVxuIiwgY2xpY291bnRlciwgZHVyYXRpb24sIGZsb2F0NjQoY2xpY291bnRlcikvZHVyYXRpb24uU2Vjb25kcygpKQorCX0KKwlpZiAqbWVtcHJvZmlsZSAhPSAiIiB7CisJCWYsIGVyciA6PSBvcy5DcmVhdGUoKm1lbXByb2ZpbGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJbG9nLkZhdGFsKGVycikKKwkJfQorCQlwcHJvZi5Xcml0ZUhlYXBQcm9maWxlKGYpCisJCWYuQ2xvc2UoKQorCQlyZXR1cm4KKwl9Cit9CisKK2Z1bmMgY2xpZW50KHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgeworCXRyYW5zLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTb2NrZXQoaG9zdFBvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldDogJXMiLCBlcnIpCisJfQorCWJ0cmFucyA6PSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCAyMDQ4KQorCWNsaWVudCA6PSBzdHJlc3MuTmV3U2VydmljZUNsaWVudEZhY3RvcnkoYnRyYW5zLCBwcm90b2NvbEZhY3RvcnkpCisJZXJyID0gdHJhbnMuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBvcGVuIGNvbm5lY3Rpb246ICVzIiwgZXJyKQorCX0KKwlyZWFkeS5Eb25lKCkKKwlyZWFkeS5XYWl0KCkKKwlzd2l0Y2ggY2FsbFR5cGUgeworCWNhc2UgZWNob1ZvaWQ6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvVm9pZCgpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9CeXRlOgorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob0J5dGUoNDIpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9JMzI6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvSTMyKDQyNDIpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9JNjQ6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvSTY0KDQyNDI0MikKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob1N0cmluZzoKKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9TdHJpbmcoIlRlc3RTdHJpbmciKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hpTGlzdDoKKwkJbCA6PSBbXWludDh7LTEwLCAtOSwgLTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fQorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob0xpc3QobCkKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob1NldDoKKwkJcyA6PSBtYXBbaW50OF1zdHJ1Y3R7fXstMTA6IHt9LCAtOToge30sIC04OiB7fSwgLTc6IHt9LCAtNjoge30sIC01OiB7fSwgLTQ6IHt9LCAtMzoge30sIC0yOiB7fSwgLTE6IHt9LCAwOiB7fSwgMToge30sIDI6IHt9LCAzOiB7fSwgNDoge30sIDU6IHt9LCA2OiB7fSwgNzoge30sIDg6IHt9fQorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob1NldChzKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvTWFwOgorCQltIDo9IG1hcFtpbnQ4XWludDh7LTEwOiAxMCwgLTk6IDksIC04OiA4LCAtNzogNywgLTY6IDYsIC01OiA1LCAtNDogNCwgLTM6IDMsIC0yOiAyLCAtMTogMSwgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCwgNTogNSwgNjogNiwgNzogNywgODogOH0KKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9NYXAobSkKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCX0KKworCWRvbmUuRG9uZSgpCit9CisKK3R5cGUgaGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChoICpoYW5kbGVyKSBFY2hvVm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9CeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvSTMyKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9MaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBbXWludDgpIChyIFtdaW50OCwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob1NldChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdc3RydWN0e30pIChyIG1hcFtpbnQ4XXN0cnVjdHt9LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBtYXBbaW50OF1pbnQ4KSAociBtYXBbaW50OF1pbnQ4LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzU3ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG1haW4KKworaW1wb3J0ICgKKwkiY29tbW9uIgorCSJjb250ZXh0IgorCSJmbGFnIgorCSJnZW4vdGhyaWZ0dGVzdCIKKwl0ICJsb2ciCisJInJlZmxlY3QiCisJInRocmlmdCIKKykKKwordmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKK3ZhciBwb3J0ID0gZmxhZy5JbnQ2NCgicG9ydCIsIDkwOTAsICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKK3ZhciBkb21haW5fc29ja2V0ID0gZmxhZy5TdHJpbmcoImRvbWFpbi1zb2NrZXQiLCAiIiwgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC90aHJpZnR0ZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCit2YXIgdHJhbnNwb3J0ID0gZmxhZy5TdHJpbmcoInRyYW5zcG9ydCIsICJidWZmZXJlZCIsICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQordmFyIHByb3RvY29sID0gZmxhZy5TdHJpbmcoInByb3RvY29sIiwgImJpbmFyeSIsICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikKK3ZhciBzc2wgPSBmbGFnLkJvb2woInNzbCIsIGZhbHNlLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQordmFyIHpsaWIgPSBmbGFnLkJvb2woInpsaWIiLCBmYWxzZSwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQordmFyIHRlc3Rsb29wcyA9IGZsYWcuSW50KCJ0ZXN0bG9vcHMiLCAxLCAiTnVtYmVyIG9mIFRlc3RzIikKKworZnVuYyBtYWluKCkgeworCWZsYWcuUGFyc2UoKQorCWNsaWVudCwgXywgZXJyIDo9IGNvbW1vbi5TdGFydENsaWVudCgqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAiLCBlcnIpCisJfQorCWZvciBpIDo9IDA7IGkgPCAqdGVzdGxvb3BzOyBpKysgeworCQljYWxsRXZlcnl0aGluZyhjbGllbnQpCisJfQorfQorCit2YXIgcm1hcG1hcCA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJLTQ6IG1hcFtpbnQzMl1pbnQzMnstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCTQ6ICBtYXBbaW50MzJdaW50MzJ7NDogNCwgMzogMywgMjogMiwgMTogMX0sCit9CisKK3ZhciB4eHMgPSAmdGhyaWZ0dGVzdC5YdHJ1Y3R7CisJU3RyaW5nVGhpbmc6ICJIZWxsbzIiLAorCUJ5dGVUaGluZzogICA0MiwKKwlJMzJUaGluZzogICAgNDI0MiwKKwlJNjRUaGluZzogICAgNDI0MjQyLAorfQorCit2YXIgeGNlcHQgPSAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJYY2VwdGlvbiJ9Cit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgY2FsbEV2ZXJ5dGhpbmcoY2xpZW50ICp0aHJpZnR0ZXN0LlRocmlmdFRlc3RDbGllbnQpIHsKKwl2YXIgZXJyIGVycm9yCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCisJfQorCisJdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGhpbmciKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiB0aGluZyAhPSAidGhpbmciIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKKwl9CisKKwlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCB0cnVlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIWJsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgdHJ1ZSwgZ290ICVmICIsIGJsKQorCX0KKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgYmwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQorCX0KKworCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBiICE9IDQyIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJ5dGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIsIGdvdCAlZCAiLCBiKQorCX0KKworCWkzMiwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIDQyNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJMzIoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGkzMiAhPSA0MjQyIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQorCX0KKworCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDQyNDI0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEk2NCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgaTY0ICE9IDQyNDI0MiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQorCX0KKworCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCA0Mi40MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdERvdWJsZSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgZCAhPSA0Mi40MiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQorCX0KKworCWJpbm91dCA6PSBtYWtlKFtdYnl0ZSwgMjU2KQorCWZvciBpIDo9IDA7IGkgPCAyNTY7IGkrKyB7CisJCWJpbm91dFtpXSA9IGJ5dGUoaSkKKwl9CisJYmluLCBlcnIgOj0gY2xpZW50LlRlc3RCaW5hcnkoZGVmYXVsdEN0eCwgYmlub3V0KQorCWZvciBpIDo9IDA7IGkgPCAyNTY7IGkrKyB7CisJCWlmIGJpbm91dFtpXSAhPSBiaW5baV0geworCQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJpbmFyeSgpIHJlc3VsdCBleHBlY3RlZCAlZCwgZ290ICVkICIsIGJpbm91dFtpXSwgYmluW2ldKQorCQl9CisJfQorCisJeHMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXhzLlN0cmluZ1RoaW5nID0gInRoaW5nIgorCXhzLkJ5dGVUaGluZyA9IDQyCisJeHMuSTMyVGhpbmcgPSA0MjQyCisJeHMuSTY0VGhpbmcgPSA0MjQyNDIKKwl4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHhzKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RydWN0KCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAqeHMgIT0gKnhzcmV0IHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cnVjdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHMsIHhzcmV0KQorCX0KKworCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCisJeDIuU3RydWN0VGhpbmcgPSB4cworCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHgyLCB4MnJldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TmVzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeDIsIHgycmV0KQorCX0KKworCW0gOj0gbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfQorCW1yZXQsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobSwgbXJldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBtLCBtcmV0KQorCX0KKworCXNtIDo9IG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChzbSwgc21yZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQorCX0KKworCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKKwl9CisJLy8gU2V0cyBjYW4gYmUgaW4gYW55IG9yZGVyLCBidXQgR28gc2xpY2VzIGFyZSBvcmRlcmVkLCBzbyByZWZsZWN0LkRlZXBFcXVhbCB3b24ndCB3b3JrLgorCXN0ZW1wIDo9IG1hcFtpbnQzMl1zdHJ1Y3R7fXt9CisJZm9yIF8sIHZhbCA6PSByYW5nZSBzIHsKKwkJc3RlbXBbdmFsXSA9IHN0cnVjdHt9e30KKwl9CisJZm9yIF8sIHZhbCA6PSByYW5nZSBzcmV0IHsKKwkJaWYgXywgb2sgOj0gc3RlbXBbdmFsXTsgIW9rIHsKKwkJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RTZXQoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHMsIHNyZXQpCisJCX0KKwl9CisKKwlsIDo9IFtdaW50MzJ7MSwgMiwgNDJ9CisJbHJldCwgZXJyIDo9IGNsaWVudC5UZXN0TGlzdChkZWZhdWx0Q3R4LCBsKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGwsIGxyZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdExpc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIGwsIGxyZXQpCisJfQorCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCisJfQorCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCisJfQorCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBNYXAoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtYXBtYXAsIHJtYXBtYXApIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE1hcE1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcm1hcG1hcCwgbWFwbWFwKQorCX0KKworCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkeworCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRTogIDUsCisJCXRocmlmdHRlc3QuTnVtYmVyel9FSUdIVDogOCwKKwl9CisJdHJ1Y2sxIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl0cnVjazEuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJdHJ1Y2sxLkJ5dGVUaGluZyA9IDQKKwl0cnVjazEuSTMyVGhpbmcgPSA0CisJdHJ1Y2sxLkk2NFRoaW5nID0gNAorCXRydWNrMiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJdHJ1Y2syLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwl0cnVjazIuQnl0ZVRoaW5nID0gMgorCXRydWNrMi5JMzJUaGluZyA9IDIKKwl0cnVjazIuSTY0VGhpbmcgPSAyCisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0eworCQl0cnVjazEsCisJCXRydWNrMiwKKwl9CisJaW5zYW5pdHksIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0SW5zYW5pdHkoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChjcmF6eSwgaW5zYW5pdHlbMV1bMl0pIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgZmlyc3QgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVsyXSkKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGNyYXp5LCBpbnNhbml0eVsxXVszXSkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBzZWNvbmQgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVszXSkKKwl9CisJaWYgbGVuKGluc2FuaXR5WzJdWzZdLlVzZXJNYXApID4gMCB8fCBsZW4oaW5zYW5pdHlbMl1bNl0uWHRydWN0cykgPiAwIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgbm9uLWVtcHR5IHJlc3VsdCBnb3QgJSN2ICIsCisJCQlpbnNhbml0eVsyXVs2XSkKKwl9CisKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIikKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCB4Y2VwdCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4Y2VwdCwgZXJyKQorCX0KKworCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJURXhjZXB0aW9uIikKKwlfLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgZXJyID09IG5pbCB8fCAhb2sgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlI3YgIiwgZXJyKQorCX0KKworCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgeworCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCisJfQorCisJaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CisJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlleHBlY3RpbmcgOj0gJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19CisKKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCBleHBlY3RpbmcpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0T25ld2F5KCkgY2FsbDogIiwgZXJyKQorCX0KKworCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyZDk2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG1haW4KKworaW1wb3J0ICgKKwkiY29tbW9uIgorCSJmbGFnIgorCSJmbXQiCisJImxvZyIKKwkibmV0L2h0dHAiCisJInRocmlmdCIKKykKKwordmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKK3ZhciBwb3J0ID0gZmxhZy5JbnQ2NCgicG9ydCIsIDkwOTAsICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKK3ZhciBkb21haW5fc29ja2V0ID0gZmxhZy5TdHJpbmcoImRvbWFpbi1zb2NrZXQiLCAiIiwgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCit2YXIgdHJhbnNwb3J0ID0gZmxhZy5TdHJpbmcoInRyYW5zcG9ydCIsICJidWZmZXJlZCIsICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQordmFyIHByb3RvY29sID0gZmxhZy5TdHJpbmcoInByb3RvY29sIiwgImJpbmFyeSIsICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikKK3ZhciBzc2wgPSBmbGFnLkJvb2woInNzbCIsIGZhbHNlLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQordmFyIHpsaWIgPSBmbGFnLkJvb2woInpsaWIiLCBmYWxzZSwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQordmFyIGNlcnRQYXRoID0gZmxhZy5TdHJpbmcoImNlcnRQYXRoIiwgImtleXMiLCAiRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgU1NMIGNlcnRpZmljYXRlcyIpCisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlBhcnNlKCkKKworCXByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIGVyciA6PSBjb21tb24uR2V0U2VydmVyUGFyYW1zKCpob3N0LCAqcG9ydCwgKmRvbWFpbl9zb2NrZXQsICp0cmFuc3BvcnQsICpwcm90b2NvbCwgKnNzbCwgKmNlcnRQYXRoLCBjb21tb24uUHJpbnRpbmdIYW5kbGVyKQorCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBwcm9jZXNzIHNlcnZlciBwYXJhbXM6ICIsIGVycikKKwl9CisKKwlpZiAqdHJhbnNwb3J0ID09ICJodHRwIiB7CisJCWh0dHAuSGFuZGxlRnVuYygiLyIsIHRocmlmdC5OZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkKKworCQlpZiAqc3NsIHsKKwkJCWVyciA6PSBodHRwLkxpc3RlbkFuZFNlcnZlVExTKGZtdC5TcHJpbnRmKCI6JWQiLCAqcG9ydCksCisJCQkJKmNlcnRQYXRoKyIvc2VydmVyLnBlbSIsICpjZXJ0UGF0aCsiL3NlcnZlci5rZXkiLCBuaWwpCisKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCWZtdC5QcmludGxuKGVycikKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh0dHAuTGlzdGVuQW5kU2VydmUoZm10LlNwcmludGYoIjolZCIsICpwb3J0KSwgbmlsKQorCQl9CisJfSBlbHNlIHsKKwkJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCQlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZ28gc2VydmVyLkFjY2VwdExvb3AoKQorCQlzZXJ2ZXIuU2VydmUoKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNmNlNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJImNyeXB0by90bHMiCisJImZsYWciCisJImZtdCIKKwkiZ2VuL3RocmlmdHRlc3QiCisJIm5ldC9odHRwIgorCSJ0aHJpZnQiCispCisKK3ZhciBkZWJ1Z0NsaWVudFByb3RvY29sIGJvb2wKKworZnVuYyBpbml0KCkgeworCWZsYWcuQm9vbFZhcigmZGVidWdDbGllbnRQcm90b2NvbCwgImRlYnVnX2NsaWVudF9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBjbGllbnQgcHJvdG9jb2wgdHJhY2Ugb24iKQorfQorCitmdW5jIFN0YXJ0Q2xpZW50KAorCWhvc3Qgc3RyaW5nLAorCXBvcnQgaW50NjQsCisJZG9tYWluX3NvY2tldCBzdHJpbmcsCisJdHJhbnNwb3J0IHN0cmluZywKKwlwcm90b2NvbCBzdHJpbmcsCisJc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQsIGVyciBlcnJvcikgeworCisJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKKwlzd2l0Y2ggcHJvdG9jb2wgeworCWNhc2UgImNvbXBhY3QiOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgInNpbXBsZWpzb24iOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgImpzb24iOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgImJpbmFyeSI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCX0KKwlpZiBkZWJ1Z0NsaWVudFByb3RvY29sIHsKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnksICJjbGllbnQ6IikKKwl9CisJaWYgc3NsIHsKKwkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUU1NMU29ja2V0KGhvc3RQb3J0LCAmdGxzLkNvbmZpZ3tJbnNlY3VyZVNraXBWZXJpZnk6IHRydWV9KQorCX0gZWxzZSB7CisJCWlmIGRvbWFpbl9zb2NrZXQgIT0gIiIgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUU29ja2V0KGRvbWFpbl9zb2NrZXQpCisJCX0gZWxzZSB7CisJCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQoaG9zdFBvcnQpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJfQorCXN3aXRjaCB0cmFuc3BvcnQgeworCWNhc2UgImh0dHAiOgorCQlpZiBzc2wgeworCQkJdHIgOj0gJmh0dHAuVHJhbnNwb3J0eworCQkJCVRMU0NsaWVudENvbmZpZzogJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSwKKwkJCX0KKwkJCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7VHJhbnNwb3J0OiB0cn0KKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoZm10LlNwcmludGYoImh0dHBzOi8vJXMvIiwgaG9zdFBvcnQpLCB0aHJpZnQuVEh0dHBDbGllbnRPcHRpb25ze0NsaWVudDogY2xpZW50fSkKKwkJCWZtdC5QcmludGxuKGhvc3RQb3J0KQorCQl9IGVsc2UgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cFBvc3RDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy8iLCBob3N0UG9ydCkpCisJCX0KKwljYXNlICJmcmFtZWQiOgorCQl0cmFucyA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQorCWNhc2UgImJ1ZmZlcmVkIjoKKwkJdHJhbnMgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCA4MTkyKQorCWNhc2UgInpsaWIiOgorCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCB6bGliLkJlc3RDb21wcmVzc2lvbikKKwljYXNlICIiOgorCQl0cmFucyA9IHRyYW5zCisJZGVmYXVsdDoKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHRyYW5zcG9ydCBzcGVjaWZpZWQgJXMiLCB0cmFuc3BvcnQpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCX0KKwlpZiBlcnIgPSB0cmFucy5PcGVuKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCX0KKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5M2M0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImdlbi90aHJpZnR0ZXN0IgorCSJyZWZsZWN0IgorCSJzeW5jIgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCispCisKK3R5cGUgdGVzdF91bml0IHN0cnVjdCB7CisJaG9zdCAgICAgICAgICBzdHJpbmcKKwlwb3J0ICAgICAgICAgIGludDY0CisJZG9tYWluX3NvY2tldCBzdHJpbmcKKwl0cmFuc3BvcnQgICAgIHN0cmluZworCXByb3RvY29sICAgICAgc3RyaW5nCisJc3NsICAgICAgICAgICBib29sCit9CisKK3ZhciB1bml0cyA9IFtddGVzdF91bml0eworCXsiMTI3LjAuMC4xIiwgOTA5NSwgIiIsICIiLCAiYmluYXJ5IiwgZmFsc2V9LAorCXsiMTI3LjAuMC4xIiwgOTA5MSwgIiIsICIiLCAiY29tcGFjdCIsIGZhbHNlfSwKKwl7IjEyNy4wLjAuMSIsIDkwOTIsICIiLCAiIiwgImJpbmFyeSIsIHRydWV9LAorCXsiMTI3LjAuMC4xIiwgOTA5MywgIiIsICIiLCAiY29tcGFjdCIsIHRydWV9LAorfQorCitmdW5jIFRlc3RBbGxDb25uZWN0aW9uKHQgKnRlc3RpbmcuVCkgeworCWNlcnRQYXRoID0gIi4uLy4uLy4uL2tleXMiCisJd2cgOj0gJnN5bmMuV2FpdEdyb3Vwe30KKwl3Zy5BZGQobGVuKHVuaXRzKSkKKwlmb3IgXywgdW5pdCA6PSByYW5nZSB1bml0cyB7CisJCWdvIGZ1bmModSB0ZXN0X3VuaXQpIHsKKwkJCWRlZmVyIHdnLkRvbmUoKQorCQkJZG9Vbml0KHQsICZ1KQorCQl9KHVuaXQpCisJfQorCXdnLldhaXQoKQorfQorCitmdW5jIGRvVW5pdCh0ICp0ZXN0aW5nLlQsIHVuaXQgKnRlc3RfdW5pdCkgeworCWN0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBjdHJsLkZpbmlzaCgpCisJaGFuZGxlciA6PSBOZXdNb2NrVGhyaWZ0VGVzdChjdHJsKQorCisJcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgZXJyIDo9IEdldFNlcnZlclBhcmFtcyh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wsICIuLi8uLi8uLi9rZXlzIiwgaGFuZGxlcikKKworCXNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IHNlcnZlcjogJXYiLCBlcnIpCisJCXJldHVybgorCX0KKwlnbyBzZXJ2ZXIuQWNjZXB0TG9vcCgpCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAldiIsIGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zLkNsb3NlKCkKKwljYWxsRXZlcnl0aGluZ1dpdGhNb2NrKHQsIGNsaWVudCwgaGFuZGxlcikKK30KKwordmFyIHJtYXBtYXAgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCS00OiBtYXBbaW50MzJdaW50MzJ7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwk0OiAgbWFwW2ludDMyXWludDMyezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorfQorCit2YXIgeHhzID0gJnRocmlmdHRlc3QuWHRydWN0eworCVN0cmluZ1RoaW5nOiAiSGVsbG8yIiwKKwlCeXRlVGhpbmc6ICAgNDIsCisJSTMyVGhpbmc6ICAgIDQyNDIsCisJSTY0VGhpbmc6ICAgIDQyNDI0MiwKK30KKwordmFyIHhjZXB0ID0gJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAic29tZSJ9Cit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0ICp0ZXN0aW5nLlQsIGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50LCBoYW5kbGVyICpNb2NrVGhyaWZ0VGVzdCkgeworCWdvbW9jay5Jbk9yZGVyKAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZyhnb21vY2suQW55KCksICJ0aGluZyIpLlJldHVybigidGhpbmciLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgdHJ1ZSkuUmV0dXJuKHRydWUsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZ29tb2NrLkFueSgpLCBmYWxzZSkuUmV0dXJuKGZhbHNlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCeXRlKGdvbW9jay5BbnkoKSwgaW50OCg0MikpLlJldHVybihpbnQ4KDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STMyKGdvbW9jay5BbnkoKSwgaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGdvbW9jay5BbnkoKSwgaW50NjQoNDI0MjQyKSkuUmV0dXJuKGludDY0KDQyNDI0MiksIG5pbCksCisJCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGdvbW9jay5BbnkoKSwgZmxvYXQ2NCg0Mi40MikpLlJldHVybihmbG9hdDY0KDQyLjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RydWN0KGdvbW9jay5BbnkoKSwgJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TmVzdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKGdvbW9jay5BbnkoKSwgbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSkuUmV0dXJuKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZ01hcChnb21vY2suQW55KCksIG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSkuUmV0dXJuKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U2V0KGdvbW9jay5BbnkoKSwgW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TGlzdChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0oZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKS5SZXR1cm4odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0VHlwZWRlZihnb21vY2suQW55KCksIHRocmlmdHRlc3QuVXNlcklkKDQyKSkuUmV0dXJuKHRocmlmdHRlc3QuVXNlcklkKDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwTWFwKGdvbW9jay5BbnkoKSwgaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKKwkJLy8gVE9ETzogbm90IHRlc3RpbmcgaW5zYW5pdHkKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGkoZ29tb2NrLkFueSgpLCBpbnQ4KDQyKSwgaW50MzIoNDI0MiksIGludDY0KDQyNDI0MiksIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpLlJldHVybih4eHMsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEV4Y2VwdGlvbihnb21vY2suQW55KCksICJzb21lIikuUmV0dXJuKHhjZXB0KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlRFeGNlcHRpb24iKS5SZXR1cm4oZXJyb3JzLk5ldygiSnVzdCByYW5kb20gZXhjZXB0aW9uIikpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbihnb21vY2suQW55KCksICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpLlJldHVybihuaWwsICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlRoaXMgaXMgYW4gWGNlcHRpb24ifSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpRXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpLlJldHVybihuaWwsICZ0aHJpZnR0ZXN0LlhjZXB0aW9uMntFcnJvckNvZGU6IDIwMDIsIFN0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiJ9fSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE9uZXdheShnb21vY2suQW55KCksIGludDMyKDIpKS5SZXR1cm4obmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZChnb21vY2suQW55KCkpLAorCSkKKwl2YXIgZXJyIGVycm9yCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAlcyIsIGVycikKKwl9CisKKwl0aGluZywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0aGluZyIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmcoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgdGhpbmcgIT0gInRoaW5nIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmcoKSByZXN1bHQsIGV4cGVjdGVkICd0aGluZycgZ290ICclcycgIiwgdGhpbmcpCisJfQorCisJYmwsIGVyciA6PSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgdHJ1ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIWJsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgdHJ1ZSwgZ290ICV2ICIsIGJsKQorCX0KKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBibCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIGZhbHNlLCBnb3QgJXYgIiwgYmwpCisJfQorCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgYiAhPSA0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCeXRlKCkgcmVzdWx0IGV4cGVjdGVkIDQyLCBnb3QgJWQgIiwgYikKKwl9CisKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGkzMiAhPSA0MjQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQorCX0KKworCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDQyNDI0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEk2NCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBpNjQgIT0gNDI0MjQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEk2NCgpIHJlc3VsdCBleHBlY3RlZCA0MjQyNDIsIGdvdCAlZCAiLCBpNjQpCisJfQorCisJZCwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIDQyLjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RG91YmxlKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGQgIT0gNDIuNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RG91YmxlKCkgcmVzdWx0IGV4cGVjdGVkIDQyLjQyLCBnb3QgJWYgIiwgZCkKKwl9CisKKwkvLyBUT0RPOiBhZGQgVGVzdEJpbmFyeSgpIGNhbGwKKworCXhzIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl4cy5TdHJpbmdUaGluZyA9ICJ0aGluZyIKKwl4cy5CeXRlVGhpbmcgPSA0MgorCXhzLkkzMlRoaW5nID0gNDI0MgorCXhzLkk2NFRoaW5nID0gNDI0MjQyCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAqeHMgIT0gKnhzcmV0IHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cnVjdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHMsIHhzcmV0KQorCX0KKworCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCisJeDIuU3RydWN0VGhpbmcgPSB4cworCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoeDIsIHgycmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3ROZXN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4MiwgeDJyZXQpCisJfQorCisJbSA6PSBtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9CisJbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG0pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXAoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG0sIG1yZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbSwgbXJldCkKKwl9CisKKwlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KKwlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIHNtKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nTWFwKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChzbSwgc21yZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQorCX0KKworCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwkvLyBTZXRzIGNhbiBiZSBpbiBhbnkgb3JkZXIsIGJ1dCBHbyBzbGljZXMgYXJlIG9yZGVyZWQsIHNvIHJlZmxlY3QuRGVlcEVxdWFsIHdvbid0IHdvcmsuCisJc3RlbXAgOj0gbWFwW2ludDMyXXN0cnVjdHt9e30KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHMgeworCQlzdGVtcFt2YWxdID0gc3RydWN0e317fQorCX0KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHNyZXQgeworCQlpZiBfLCBvayA6PSBzdGVtcFt2YWxdOyAhb2sgeworCQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFNldCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcywgc3JldCkKKwkJfQorCX0KKworCWwgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChsLCBscmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RMaXN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCX0KKworCWVyZXQsIGVyciA6PSBjbGllbnQuVGVzdEVudW0oZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCisJfQorCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIHRyZXQgIT0gdGhyaWZ0dGVzdC5Vc2VySWQoNDIpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFR5cGVkZWYoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuVXNlcklkKDQyKSwgdHJldCkKKwl9CisKKwltYXBtYXAsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcChkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcG1hcCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobWFwbWFwLCBybWFwbWFwKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNYXBtYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHJtYXBtYXAsIG1hcG1hcCkKKwl9CisKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoeHhzLCB4eHNyZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4eHMsIHh4c3JldCkKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAic29tZSIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgeGNlcHQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeGNlcHQsIGVycikKKwl9CisKKwkvLyBUT0RPOiBjb25uZWN0aW9uIGlzIGJlaW5nIGNsb3NlZCBvbiB0aGlzCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yKCJleHBlY3RlZCBleGNlcHRpb24gZ290IG5pbCIpCisJfSBlbHNlIGlmIHRleCwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgIW9rIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJVQgIiwgZXJyKQorCX0gZWxzZSBpZiB0ZXguVHlwZUlkKCkgIT0gdGhyaWZ0LklOVEVSTkFMX0VSUk9SIHsKKwkJdC5FcnJvcmYoImV4cGVjdGVkIGludGVybmFsX2Vycm9yIGdvdCAldiIsIHRleC5UeXBlSWQoKSkKKwl9CisKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCisJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlRoaXMgaXMgYW4gWGNlcHRpb24ifSkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQorCX0KKworCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKKwlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJZXhwZWN0aW5nIDo9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9uMntFcnJvckNvZGU6IDIwMDIsIFN0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiJ9fQorCisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgZXhwZWN0aW5nKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKworCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAlcyIsIGVycikKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL2NvbnRleHRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjRkYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NvbnRleHRfdGVzdC5nbwpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkibmV0IgorCSJuZXQvaHR0cCIKKwkibmV0L3VybCIKKwkib3MiCisJInN5c2NhbGwiCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGltZSIKKykKKwordHlwZSBzbG93SHR0cEhhbmRsZXIgc3RydWN0e30KKworZnVuYyAoc2xvd0h0dHBIYW5kbGVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwl0aW1lLlNsZWVwKDEgKiB0aW1lLlNlY29uZCkKK30KKworZnVuYyBUZXN0SHR0cENvbnRleHRUaW1lb3V0KHQgKnRlc3RpbmcuVCkgeworCWNlcnRQYXRoID0gIi4uLy4uLy4uL2tleXMiCisKKwl1bml0IDo9IHRlc3RfdW5pdHsiMTI3LjAuMC4xIiwgOTA5NiwgIiIsICJodHRwIiwgImJpbmFyeSIsIGZhbHNlfQorCisJc2VydmVyIDo9ICZodHRwLlNlcnZlcntBZGRyOiB1bml0Lmhvc3QgKyBmbXQuU3ByaW50ZigiOiVkIiwgdW5pdC5wb3J0KSwgSGFuZGxlcjogc2xvd0h0dHBIYW5kbGVye319CisJZ28gc2VydmVyLkxpc3RlbkFuZFNlcnZlKCkKKworCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAldiIsIGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zLkNsb3NlKCkKKworCXVud3JhcEVyciA6PSBmdW5jKGVyciBlcnJvcikgZXJyb3IgeworCQlmb3IgeworCQkJc3dpdGNoIGVyci4odHlwZSkgeworCQkJY2FzZSB0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKwkJCQllcnIgPSBlcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKS5FcnIoKQorCQkJY2FzZSAqdXJsLkVycm9yOgorCQkJCWVyciA9IGVyci4oKnVybC5FcnJvcikuRXJyCisJCQljYXNlICpuZXQuT3BFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpuZXQuT3BFcnJvcikuRXJyCisJCQljYXNlICpvcy5TeXNjYWxsRXJyb3I6CisJCQkJZXJyID0gZXJyLigqb3MuU3lzY2FsbEVycm9yKS5FcnIKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQl9CisJfQorCisJc2VydmVyU3RhcnR1cERlYWRsaW5lIDo9IHRpbWUuTm93KCkuQWRkKDUgKiB0aW1lLlNlY29uZCkKKwlmb3IgeworCQljdHgsIF8gOj0gY29udGV4dC5XaXRoVGltZW91dChjb250ZXh0LkJhY2tncm91bmQoKSwgNTAqdGltZS5NaWxsaXNlY29uZCkKKwkJZXJyID0gY2xpZW50LlRlc3RWb2lkKGN0eCkKKwkJZXJyID0gdW53cmFwRXJyKGVycikKKwkJaWYgZXJyICE9IHN5c2NhbGwuRUNPTk5SRUZVU0VEIHx8IHRpbWUuTm93KCkuQWZ0ZXIoc2VydmVyU3RhcnR1cERlYWRsaW5lKSB7CisJCQlicmVhaworCQl9CisJCXRpbWUuU2xlZXAodGltZS5NaWxsaXNlY29uZCkKKwl9CisKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIlJlcXVlc3QgY29tcGxldGVkIChzaG91bGQgaGF2ZSB0aW1lZCBvdXQpIikKKwkJcmV0dXJuCisJfQorCisJLy8gV2UndmUgZ290IHRvIHN3aXRjaCBvbiBgZXJyLkVycm9yKClgIGhlcmUgc2luY2UgZ28xLjcgZG9lc24ndCBwcm9wZXJseSByZXR1cm4KKwkvLyBgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkYCBlcnJvciBhbmQgYGh0dHAuZXJyUmVxdWVzdENhbmNlbGVkYCBpcyBub3QgZXhwb3J0ZWQuCisJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvZ28vaXNzdWVzLzE3NzExCisJc3dpdGNoIGVyci5FcnJvcigpIHsKKwljYXNlIGNvbnRleHQuRGVhZGxpbmVFeGNlZWRlZC5FcnJvcigpLCAibmV0L2h0dHA6IHJlcXVlc3QgY2FuY2VsZWQiOgorCQkvLyBFeHBlY3RlZCBlcnJvcgorCWRlZmF1bHQ6CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yOiAlcyIsIGVycikKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjJkMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9oZXgiCisJImVycm9ycyIKKwkiZm10IgorCS4gImdlbi90aHJpZnR0ZXN0IgorCSJ0aW1lIgorKQorCit2YXIgUHJpbnRpbmdIYW5kbGVyID0gJnByaW50aW5nSGFuZGxlcnt9CisKK3R5cGUgcHJpbnRpbmdIYW5kbGVyIHN0cnVjdHt9CisKKy8vIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWZtdC5QcmludGxuKCJ0ZXN0Vm9pZCgpIikKKwlyZXR1cm4gbmlsCit9CisKKy8vIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisvLyBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorLy8gQHJldHVybiBzdHJpbmcgLSByZXR1cm5zIHRoZSBzdHJpbmcgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEJvb2woIiV0IiknIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKy8vIEBwYXJhbSBib29sIHRoaW5nIC0gdGhlIGJvb2wgdG8gcHJpbnQKKy8vIEByZXR1cm4gYm9vbCAtIHJldHVybnMgdGhlIGJvb2wgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qm9vbChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBib29sKSAociBib29sLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0Qm9vbCgldClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworLy8gQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgYnl0ZSB0byBwcmludAorLy8gQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RCeXRlKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0STMyKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKy8vIEBwYXJhbSBpMzIgdGhpbmcgLSB0aGUgaTMyIHRvIHByaW50CisvLyBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0STMyKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0STY0KCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKy8vIEBwYXJhbSBpNjQgdGhpbmcgLSB0aGUgaTY0IHRvIHByaW50CisvLyBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0STY0KCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0RG91YmxlKCIlZiIpJyB3aXRoIHRoaW5nIGFzICclZicKKy8vIEBwYXJhbSBkb3VibGUgdGhpbmcgLSB0aGUgZG91YmxlIHRvIHByaW50CisvLyBAcmV0dXJuIGRvdWJsZSAtIHJldHVybnMgdGhlIGRvdWJsZSAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdERvdWJsZSglZilcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEJpbmFyeSgiJXMiKScgd2hlcmUgJyVzJyBpcyBhIGhleC1mb3JtYXR0ZWQgc3RyaW5nIG9mIHRoaW5nJ3MgZGF0YQorLy8gQHBhcmFtIFtdYnl0ZSB0aGluZyAtIHRoZSBiaW5hcnkgdG8gcHJpbnQKKy8vIEByZXR1cm4gW11ieXRlIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJpbmFyeShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEJpbmFyeSglcylcbiIsIGhleC5FbmNvZGVUb1N0cmluZyh0aGluZykpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0U3RydWN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMKKy8vIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisvLyBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgdGhlIFh0cnVjdCAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKlh0cnVjdCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICVkfSlcbiIsIHRoaW5nLlN0cmluZ1RoaW5nLCB0aGluZy5CeXRlVGhpbmcsIHRoaW5nLkkzMlRoaW5nLCB0aGluZy5JNjRUaGluZykKKwlyZXR1cm4gdGhpbmcsIGVycgorfQorCisvLyBQcmludHMgJ3Rlc3ROZXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIHRoZSBuZXN0ZWQgc3RydWN0CisvLyBAcGFyYW0gWHRydWN0MiB0aGluZyAtIHRoZSBYdHJ1Y3QyIHRvIHByaW50CisvLyBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE5lc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgbmVzdCAqWHRydWN0MikgKHIgKlh0cnVjdDIsIGVyciBlcnJvcikgeworCXRoaW5nIDo9IG5lc3QuU3RydWN0VGhpbmcKKwlmbXQuUHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJWR9LCAlZH0pXG4iLCBuZXN0LkJ5dGVUaGluZywgdGhpbmcuU3RyaW5nVGhpbmcsIHRoaW5nLkJ5dGVUaGluZywgdGhpbmcuSTMyVGhpbmcsIHRoaW5nLkk2NFRoaW5nLCBuZXN0LkkzMlRoaW5nKQorCXJldHVybiBuZXN0LCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyBAcGFyYW0gbWFwPGkzMixpMzI+IHRoaW5nIC0gdGhlIG1hcDxpMzIsaTMyPiB0byBwcmludAorLy8gQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TWFwKHsiKQorCWZpcnN0IDo9IHRydWUKKwlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CisJCWlmIGZpcnN0IHsKKwkJCWZpcnN0ID0gZmFsc2UKKwkJfSBlbHNlIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlZCA9PiAlZCIsIGssIHYpCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CisvLyBAcmV0dXJuIG1hcDxzdHJpbmcsc3RyaW5nPiAtIHJldHVybnMgdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nTWFwKHsiKQorCWZpcnN0IDo9IHRydWUKKwlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CisJCWlmIGZpcnN0IHsKKwkJCWZpcnN0ID0gZmFsc2UKKwkJfSBlbHNlIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlcyA9PiAlcyIsIGssIHYpCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyBAcGFyYW0gc2V0PGkzMj4gdGhpbmcgLSB0aGUgc2V0PGkzMj4gdG8gcHJpbnQKKy8vIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFNldCh7IikKKwlmaXJzdCA6PSB0cnVlCisJZm9yIGssIF8gOj0gcmFuZ2UgdGhpbmcgeworCQlpZiBmaXJzdCB7CisJCQlmaXJzdCA9IGZhbHNlCisJCX0gZWxzZSB7CisJCQlmbXQuUHJpbnRmKCIsICIpCisJCX0KKwkJZm10LlByaW50ZigiJWQiLCBrKQorCX0KKwlmbXQuUHJpbnRmKCJ9KVxuIikKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RMaXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisvLyBAcmV0dXJuIGxpc3Q8aTMyPiAtIHJldHVybnMgdGhlIGxpc3Q8aTMyPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RMaXN0KHsiKQorCWZvciBpLCB2IDo9IHJhbmdlIHRoaW5nIHsKKwkJaWYgaSAhPSAwIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlZCIsIHYpCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEVudW0oIiVkIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGl0J3MgbnVtZXJpYyB2YWx1ZQorLy8gQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludAorLy8gQHJldHVybiBOdW1iZXJ6IC0gcmV0dXJucyB0aGUgTnVtYmVyeiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFbnVtKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIE51bWJlcnopIChyIE51bWJlcnosIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RFbnVtKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0VHlwZWRlZigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisvLyBAcGFyYW0gVXNlcklkIHRoaW5nIC0gdGhlIFVzZXJJZCB0byBwcmludAorLy8gQHJldHVybiBVc2VySWQgLSByZXR1cm5zIHRoZSBVc2VySWQgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0VHlwZWRlZihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBVc2VySWQpIChyIFVzZXJJZCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFR5cGVkZWYoJWQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RNYXBNYXAoIiVkIiknIHdpdGggaGVsbG8gYXMgJyVkJworLy8gQHBhcmFtIGkzMiBoZWxsbyAtIHRoZSBpMzIgdG8gcHJpbnQKKy8vIEByZXR1cm4gbWFwPGkzMixtYXA8aTMyLGkzMj4+IC0gcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGVzZSB2YWx1ZXM6CisvLyAgIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBIZWxsbworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pCisKKwlyID0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwkJLTQ6IG1hcFtpbnQzMl1pbnQzMnstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCQk0OiAgbWFwW2ludDMyXWludDMyezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorCX0KKwlyZXR1cm4KK30KKworLy8gU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisvLworLy8gQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisvLyAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisvLyAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisvLyAgICAgICAgICB9LAorLy8gICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorLy8gICB9CisvLyBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJndW1lbnQKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEluc2FuaXR5KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZ3VtZW50ICpJbnNhbml0eSkgKHIgbWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHksIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RJbnNhbml0eSgpXG4iKQorCXIgPSBtYWtlKG1hcFtVc2VySWRdbWFwW051bWJlcnpdKkluc2FuaXR5KQorCXJbMV0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHl7CisJCTI6IGFyZ3VtZW50LAorCQkzOiBhcmd1bWVudCwKKwl9CisJclsyXSA9IG1hcFtOdW1iZXJ6XSpJbnNhbml0eXsKKwkJNjogTmV3SW5zYW5pdHkoKSwKKwl9CisJcmV0dXJuCit9CisKKy8vIFByaW50cyAndGVzdE11bHRpKCknCisvLyBAcGFyYW0gYnl0ZSBhcmcwIC0KKy8vIEBwYXJhbSBpMzIgYXJnMSAtCisvLyBAcGFyYW0gaTY0IGFyZzIgLQorLy8gQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCisvLyBAcGFyYW0gTnVtYmVyeiBhcmc0IC0KKy8vIEBwYXJhbSBVc2VySWQgYXJnNSAtCisvLyBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0IHdpdGggU3RyaW5nVGhpbmcgPSAiSGVsbG8yLCBCeXRlVGhpbmcgPSBhcmcwLCBJMzJUaGluZyA9IGFyZzEKKy8vICAgIGFuZCBJNjRUaGluZyA9IGFyZzIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJnMAorLy8gIC0gQXJnMQorLy8gIC0gQXJnMgorLy8gIC0gQXJnMworLy8gIC0gQXJnNAorLy8gIC0gQXJnNQorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RNdWx0aSgpXG4iKQorCXIgPSBOZXdYdHJ1Y3QoKQorCisJci5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJci5CeXRlVGhpbmcgPSBhcmcwCisJci5JMzJUaGluZyA9IGFyZzEKKwlyLkk2NFRoaW5nID0gYXJnMgorCXJldHVybgorfQorCisvLyBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKKy8vIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisvLyBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKy8vIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJnCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcpCisJc3dpdGNoIGFyZyB7CisJY2FzZSAiWGNlcHRpb24iOgorCQllIDo9IE5ld1hjZXB0aW9uKCkKKwkJZS5FcnJvckNvZGUgPSAxMDAxCisJCWUuTWVzc2FnZSA9IGFyZworCQlyZXR1cm4gZQorCWNhc2UgIlRFeGNlcHRpb24iOgorCQlyZXR1cm4gZXJyb3JzLk5ldygiSnVzdCBURXhjZXB0aW9uIikKKwl9CisJcmV0dXJuCit9CisKKy8vIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJworLy8gQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKy8vIGlmIGFyZzAgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKy8vIGVsc2VuIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKy8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisvLyBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIFN0cmluZ1RoaW5nID0gYXJnMQorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBBcmcwCisvLyAgLSBBcmcxCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLCBhcmcxKQorCXN3aXRjaCBhcmcwIHsKKworCWNhc2UgIlhjZXB0aW9uIjoKKwkJZSA6PSBOZXdYY2VwdGlvbigpCisJCWUuRXJyb3JDb2RlID0gMTAwMQorCQllLk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKwkJcmV0dXJuIG5pbCwgZQorCWNhc2UgIlhjZXB0aW9uMiI6CisJCWUgOj0gTmV3WGNlcHRpb24yKCkKKwkJZS5FcnJvckNvZGUgPSAyMDAyCisJCWUuU3RydWN0VGhpbmcgPSBOZXdYdHJ1Y3QoKQorCQllLlN0cnVjdFRoaW5nLlN0cmluZ1RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorCQlyZXR1cm4gbmlsLCBlCisJZGVmYXVsdDoKKwkJciA9IE5ld1h0cnVjdCgpCisJCXIuU3RyaW5nVGhpbmcgPSBhcmcxCisJCXJldHVybgorCX0KK30KKworLy8gUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisvLyBzbGVlcCAnc2Vjb25kc1RvU2xlZXAnCisvLyBQcmludCAndGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchJyB3aXRoIHNlY29uZHNUb1NsZWVwIGFzICclZCcKKy8vIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gU2Vjb25kc1RvU2xlZXAKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE9uZXdheShjdHggY29udGV4dC5Db250ZXh0LCBzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2Vjb25kc1RvU2xlZXApCisJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQorCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2Vjb25kc1RvU2xlZXApCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM0NDAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgorCSJjcnlwdG8vdGxzIgorCSJmbGFnIgorCSJmbXQiCisJImdlbi90aHJpZnR0ZXN0IgorCSJ0aHJpZnQiCispCisKK3ZhciAoCisJZGVidWdTZXJ2ZXJQcm90b2NvbCBib29sCisJY2VydFBhdGggICAgICAgICAgICBzdHJpbmcKKykKKworZnVuYyBpbml0KCkgeworCWZsYWcuQm9vbFZhcigmZGVidWdTZXJ2ZXJQcm90b2NvbCwgImRlYnVnX3NlcnZlcl9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBzZXJ2ZXIgcHJvdG9jb2wgdHJhY2Ugb24iKQorfQorCitmdW5jIEdldFNlcnZlclBhcmFtcygKKwlob3N0IHN0cmluZywKKwlwb3J0IGludDY0LAorCWRvbWFpbl9zb2NrZXQgc3RyaW5nLAorCXRyYW5zcG9ydCBzdHJpbmcsCisJcHJvdG9jb2wgc3RyaW5nLAorCXNzbCBib29sLAorCWNlcnRQYXRoIHN0cmluZywKKwloYW5kbGVyIHRocmlmdHRlc3QuVGhyaWZ0VGVzdCkgKHRocmlmdC5UUHJvY2Vzc29yLCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydCwgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5LCB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgZXJyb3IpIHsKKworCXZhciBlcnIgZXJyb3IKKwlob3N0UG9ydCA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQorCXN3aXRjaCBwcm90b2NvbCB7CisJY2FzZSAiY29tcGFjdCI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAic2ltcGxlanNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAianNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAiYmluYXJ5IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCX0KKwlpZiBkZWJ1Z1NlcnZlclByb3RvY29sIHsKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnksICJzZXJ2ZXI6IikKKwl9CisKKwl2YXIgc2VydmVyVHJhbnNwb3J0IHRocmlmdC5UU2VydmVyVHJhbnNwb3J0CisJaWYgc3NsIHsKKwkJY2ZnIDo9IG5ldyh0bHMuQ29uZmlnKQorCQlpZiBjZXJ0LCBlcnIgOj0gdGxzLkxvYWRYNTA5S2V5UGFpcihjZXJ0UGF0aCsiL3NlcnZlci5jcnQiLCBjZXJ0UGF0aCsiL3NlcnZlci5rZXkiKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKKwkJfSBlbHNlIHsKKwkJCWNmZy5DZXJ0aWZpY2F0ZXMgPSBhcHBlbmQoY2ZnLkNlcnRpZmljYXRlcywgY2VydCkKKwkJfQorCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU1NMU2VydmVyU29ja2V0KGhvc3RQb3J0LCBjZmcpCisJfSBlbHNlIHsKKwkJaWYgZG9tYWluX3NvY2tldCAhPSAiIiB7CisJCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpCisJCX0gZWxzZSB7CisJCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGhvc3RQb3J0KQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKKwl9CisKKwl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKKworCXN3aXRjaCB0cmFuc3BvcnQgeworCWNhc2UgImh0dHAiOgorCQkvLyB0aGVyZSBpcyBubyBzdWNoIGZhY3RvcnksIGFuZCB3ZSBkb24ndCBuZWVkIGFueQorCQl0cmFuc3BvcnRGYWN0b3J5ID0gbmlsCisJY2FzZSAiZnJhbWVkIjoKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwljYXNlICJidWZmZXJlZCI6CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4MTkyKQorCWNhc2UgInpsaWIiOgorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RabGliVHJhbnNwb3J0RmFjdG9yeSh6bGliLkJlc3RDb21wcmVzc2lvbikKKwljYXNlICIiOgorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHRyYW5zcG9ydCBzcGVjaWZpZWQgJXMiLCB0cmFuc3BvcnQpCisJfQorCXByb2Nlc3NvciA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RQcm9jZXNzb3IoaGFuZGxlcikKKworCXJldHVybiBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuaWwKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk0NjNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkuICJnZW4vdGhyaWZ0dGVzdCIKKwkidGltZSIKKykKKwordmFyIFNpbXBsZUhhbmRsZXIgPSAmc2ltcGxlSGFuZGxlcnt9CisKK3R5cGUgc2ltcGxlSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTdHJpbmcodGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RCb29sKHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0STMyKHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEk2NCh0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3REb3VibGUodGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEJpbmFyeSh0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gciwgZXJyCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3ROZXN0KG5lc3QgKlh0cnVjdDIpIChyICpYdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmVzdCwgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RNYXAodGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTdHJpbmdNYXAodGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U2V0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RMaXN0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RFbnVtKHRoaW5nIE51bWJlcnopIChyIE51bWJlcnosIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RUeXBlZGVmKHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TWFwTWFwKGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKworCXIgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCQktNDogbWFwW2ludDMyXWludDMyey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJCTQ6ICBtYXBbaW50MzJdaW50MzJ7NDogNCwgMzogMywgMjogMiwgMTogMX0sCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0SW5zYW5pdHkoYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygiTm8gSW5zYW5pdHkiKQorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TXVsdGkoYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCXIgPSBOZXdYdHJ1Y3QoKQorCisJci5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJci5CeXRlVGhpbmcgPSBhcmcwCisJci5JMzJUaGluZyA9IGFyZzEKKwlyLkk2NFRoaW5nID0gYXJnMgorCXJldHVybgorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwlzd2l0Y2ggYXJnIHsKKwljYXNlICJYY2VwdGlvbiI6CisJCWUgOj0gTmV3WGNlcHRpb24oKQorCQllLkVycm9yQ29kZSA9IDEwMDEKKwkJZS5NZXNzYWdlID0gYXJnCisJCXJldHVybiBlCisJY2FzZSAiVEV4Y2VwdGlvbiI6CisJCXJldHVybiBlcnJvcnMuTmV3KCJKdXN0IFRFeGNlcHRpb24iKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJc3dpdGNoIGFyZzAgeworCisJY2FzZSAiWGNlcHRpb24iOgorCQllIDo9IE5ld1hjZXB0aW9uKCkKKwkJZS5FcnJvckNvZGUgPSAxMDAxCisJCWUuTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorCQlyZXR1cm4gbmlsLCBlCisJY2FzZSAiWGNlcHRpb24yIjoKKwkJZSA6PSBOZXdYY2VwdGlvbjIoKQorCQllLkVycm9yQ29kZSA9IDIwMDIKKwkJZS5TdHJ1Y3RUaGluZy5TdHJpbmdUaGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKwkJcmV0dXJuIG5pbCwgZQorCWRlZmF1bHQ6CisJCXIgPSBOZXdYdHJ1Y3QoKQorCQlyLlN0cmluZ1RoaW5nID0gYXJnMQorCQlyZXR1cm4KKwl9Cit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKKwl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvTWFrZWZpbGUuYW0gYi90ZXN0L2hheGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNDgzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEwNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKK0JJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKK0JJTl9QSFBfV0VCID0gYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKKwkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKSAkKEJJTl9QSFBfV0VCKQorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4CisJJChIQVhFKSAtLWN3ZCAuICBjcHAuaHhtbAorCiskKEJJTl9QSFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiskKEJJTl9QSFBfV0VCKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLXdlYi1zZXJ2ZXIuaHhtbAorCisKKworI1RPRE86IG90aGVyIGhheGUgdGFyZ2V0cworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBjc2hhcnAKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgZmxhc2gKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YQorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhc2NyaXB0CisjICAgICQoSEFYRSkgIC0tY3dkIC4gIG5la28KKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgcHl0aG9uICAjIG5lZWRzIEhheGUgMy4yLjAKKworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4taGF4ZSBiaW4KKworLk5PVFBBUkFMTEVMOgorCitjaGVjazogY2hlY2tfY3BwIFwKKwljaGVja19waHAgXAorCWNoZWNrX3BocF93ZWIgCisKK2NoZWNrX2NwcDogJChCSU5fQ1BQKSAKKwl0aW1lb3V0IDIwICQoQklOX0NQUCkgc2VydmVyICYKKwlzbGVlcCAxCisJJChCSU5fQ1BQKSBjbGllbnQKKwlzbGVlcCAxMAorCitjaGVja19waHA6ICQoQklOX1BIUCkgCisJdGltZW91dCAyMCBwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIgJgorCXNsZWVwIDEKKwlwaHAgLWYgJChCSU5fUEhQKSBjbGllbnQKKwlzbGVlcCAxMAorCitjaGVja19waHBfd2ViOiAkKEJJTl9QSFBfV0VCKSAkKEJJTl9DUFApCisJdGltZW91dCAyMCBwaHAgLVMgMTI3LjAuMC4xOjkwOTAgcm91dGVyLnBocCAmCisJc2xlZXAgMQorCSQoQklOX0NQUCkgY2xpZW50IC0tdHJhbnNwb3J0IGh0dHAKKwlzbGVlcCAxMAorCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwljcHAuaHhtbCBcCisJY3NoYXJwLmh4bWwgXAorCWZsYXNoLmh4bWwgXAorCWphdmEuaHhtbCBcCisJamF2YXNjcmlwdC5oeG1sIFwKKwluZWtvLmh4bWwgXAorCXBocC5oeG1sIFwKKwlweXRob24uaHhtbCBcCisJcm91dGVyLnBocCBcCisJcHJvamVjdC5oaWRlIFwKKwlwaHAtd2ViLXNlcnZlci5oeG1sIFwKKwlUZXN0Q2xpZW50U2VydmVyLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL1Rlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qIGIvdGVzdC9oYXhlL1Rlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTZkODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvVGVzdENsaWVudFNlcnZlci5oeHByb2oKQEAgLTAsMCArMSw2NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjIiPgorICA8IS0tIE91dHB1dCBTV0Ygb3B0aW9ucyAtLT4KKyAgPG91dHB1dD4KKyAgICA8bW92aWUgb3V0cHV0VHlwZT0iQXBwbGljYXRpb24iIC8+CisgICAgPG1vdmllIGlucHV0PSIiIC8+CisgICAgPG1vdmllIHBhdGg9ImJpbi9UZXN0Q2xpZW50U2VydmVyIiAvPgorICAgIDxtb3ZpZSBmcHM9IjMwIiAvPgorICAgIDxtb3ZpZSB3aWR0aD0iODAwIiAvPgorICAgIDxtb3ZpZSBoZWlnaHQ9IjYwMCIgLz4KKyAgICA8bW92aWUgdmVyc2lvbj0iMSIgLz4KKyAgICA8bW92aWUgbWlub3JWZXJzaW9uPSIwIiAvPgorICAgIDxtb3ZpZSBwbGF0Zm9ybT0iQysrIiAvPgorICAgIDxtb3ZpZSBiYWNrZ3JvdW5kPSIjRkZGRkZGIiAvPgorICA8L291dHB1dD4KKyAgPCEtLSBPdGhlciBjbGFzc2VzIHRvIGJlIGNvbXBpbGVkIGludG8geW91ciBTV0YgLS0+CisgIDxjbGFzc3BhdGhzPgorICAgIDxjbGFzcyBwYXRoPSJzcmMiIC8+CisgICAgPGNsYXNzIHBhdGg9Imdlbi1oYXhlIiAvPgorICAgIDxjbGFzcyBwYXRoPSIuLi8uLi9saWIvaGF4ZS9zcmMiIC8+CisgIDwvY2xhc3NwYXRocz4KKyAgPCEtLSBCdWlsZCBvcHRpb25zIC0tPgorICA8YnVpbGQ+CisgICAgPG9wdGlvbiBkaXJlY3RpdmVzPSIiIC8+CisgICAgPG9wdGlvbiBmbGFzaFN0cmljdD0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBub0lubGluZU9uRGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbWFpbkNsYXNzPSJNYWluIiAvPgorICAgIDxvcHRpb24gZW5hYmxlZGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gYWRkaXRpb25hbD0iIiAvPgorICA8L2J1aWxkPgorICA8IS0tIGhheGVsaWIgbGlicmFyaWVzIC0tPgorICA8aGF4ZWxpYj4KKyAgICA8IS0tIGV4YW1wbGU6IDxsaWJyYXJ5IG5hbWU9Ii4uLiIgLz4gLS0+CisgIDwvaGF4ZWxpYj4KKyAgPCEtLSBDbGFzcyBmaWxlcyB0byBjb21waWxlIChvdGhlciByZWZlcmVuY2VkIGNsYXNzZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkKSAtLT4KKyAgPGNvbXBpbGVUYXJnZXRzPgorICAgIDwhLS0gZXhhbXBsZTogPGNvbXBpbGUgcGF0aD0iLi4uIiAvPiAtLT4KKyAgPC9jb21waWxlVGFyZ2V0cz4KKyAgPCEtLSBQYXRocyB0byBleGNsdWRlIGZyb20gdGhlIFByb2plY3QgRXhwbG9yZXIgdHJlZSAtLT4KKyAgPGhpZGRlblBhdGhzPgorICAgIDxoaWRkZW4gcGF0aD0ib2JqIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3BwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjc2hhcnAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImZsYXNoLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhc2NyaXB0Lmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5iYXQiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5zaCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Ik1ha2VmaWxlLmFtIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibmVrby5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icGhwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwcm9qZWN0LmhpZGUiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJweXRob24uaHhtbCIgLz4KKyAgPC9oaWRkZW5QYXRocz4KKyAgPCEtLSBFeGVjdXRlZCBiZWZvcmUgYnVpbGQgLS0+CisgIDxwcmVCdWlsZENvbW1hbmQ+dGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vVGhyaWZ0VGVzdC50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iVW5rbm93biIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9IiIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9jcHAuaHhtbCBiL3Rlc3QvaGF4ZS9jcHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRiNTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvY3NoYXJwLmh4bWwgYi90ZXN0L2hheGUvY3NoYXJwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1YzAxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UdXRvcmlhbC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9mbGFzaC5oeG1sIGIvdGVzdC9oYXhlL2ZsYXNoLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMDU2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1R1dG9yaWFsLnN3ZgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworIyB3ZSBuZWVkIHNvbWUgZ29vZGllcyBmcm9tIHN5cy5uZXQKKyMgLS1tYWNybyBhbGxvd1BhY2thZ2UoInN5cyIpCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9qYXZhLmh4bWwgYi90ZXN0L2hheGUvamF2YS5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTU1NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYyAKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UdXRvcmlhbC5qYXIKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwgYi90ZXN0L2hheGUvamF2YXNjcmlwdC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjM4NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvamF2YXNjcmlwdC5oeG1sCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhU2NyaXB0IHRhcmdldAorLWpzIGJpbi9UdXRvcmlhbC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9tYWtlX2FsbC5iYXQgYi90ZXN0L2hheGUvbWFrZV9hbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWJhODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgIC4uXFRocmlmdFRlc3QudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL21ha2VfYWxsLnNoIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViMmM5YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgorLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtZ2VuIGhheGUgIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKKyMgb3V0cHV0IGZvbGRlcgoraWYgWyAhIC1kIGJpbiBdOyB0aGVuCisgIG1rZGlyICBiaW4KK2ZpCisKKyMgaW52b2tlIEhheGUgY29tcGlsZXIKK2ZvciB0YXJnZXQgaW4gKi5oeG1sOyBkbyAKKyAgZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBlY2hvIEJ1aWxkaW5nICR7dGFyZ2V0fSAuLi4KKyAgZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpZiBbICEgLWQgYmluLyR7dGFyZ2V0fSBdOyB0aGVuCisgICAgbWtkaXIgIGJpbi8ke3RhcmdldH0KKyAgZmkKKyAgaGF4ZSAgLS1jd2QgLiAgJHt0YXJnZXR9IAorZG9uZQorCisKKyNlb2YKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9uZWtvLmh4bWwgYi90ZXN0L2hheGUvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvbmVrby5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNuZWtvIHRhcmdldAorLW5la28gYmluL1R1dG9yaWFsLm4KKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdGVzdC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAtd2ViLXNlcnZlci8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKyNkZWZpbmVzCistRCBwaHB3ZWJzZXJ2ZXIKKworCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcGhwLmh4bWwgYi90ZXN0L2hheGUvcGhwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1MTg5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9waHAuaHhtbApAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcHJvamVjdC5oaWRlIGIvdGVzdC9oYXhlL3Byb2plY3QuaGlkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWMwOWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDc2IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJBcGFjaGUgVGhyaWZ0IGNyb3NzLXBsYXRmb3JtIHRlc3QgY2xpZW50L3NlcnZlciIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIgorICAgICwibGljZW5zZSIgOiAiQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgorICAgICwidXJsIiA6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UdXRvcmlhbC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1R1dG9yaWFsLm4iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicGhwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3BwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vTWFpbi1kZWJ1Zy5leGUgIGNsaWVudCAtLXByb3RvY29sIGpzb24iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YS5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNzaGFycC5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogInB5dGhvbi5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAicHl0aG9uIGJpbi9UdXRvcmlhbC5weSIKKyAgICAgICAgfQorICAgIF0KKyAgICAsImZpbGVzIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxUZXN0Q2xpZW50Lmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMTg4CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxUZXN0U2VydmVyLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogODgKKyAgICAgICAgfQorICAgIF0KKyAgICAsImFjdGl2ZUZpbGUiIDogInNyY1xcVGVzdENsaWVudC5oeCIKKyAgICAsIm9wZW5GTFRhcmdldCIgOiBudWxsCisgICAgLCJvcGVuRkxCdWlsZE1vZGUiIDogIkRlYnVnIgorICAgICwicnVuQWN0aW9uVHlwZSIgOiBudWxsCisgICAgLCJydW5BY3Rpb25UZXh0IiA6IG51bGwKKyAgICAsImJ1aWxkQWN0aW9uQ29tbWFuZCIgOiBudWxsCisgICAgLCJoaWRkZW5JdGVtcyIgOiBbCisKKyAgICBdCisgICAgLCJzaG93SGlkZGVuSXRlbXMiIDogZmFsc2UKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcHl0aG9uLmh4bWwgYi90ZXN0L2hheGUvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjMTlmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9weXRob24uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUHl0aG9uIHRhcmdldAorLXB5dGhvbiBiaW4vVHV0b3JpYWwucHkKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwIGIvdGVzdC9oYXhlL3JvdXRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MTM1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwCkBAIC0wLDAgKzEsMzEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKKworCisvL3JvdXRlciBmaWxlIHRvIHJ1biB0ZXN0aW5nIHdlYiBzZXJ2ZXIKKworLy9zZXRfdGltZV9saW1pdCgxKTsKKworcmVxdWlyZV9vbmNlICBkaXJuYW1lKF9fRklMRV9fKSAuICcvYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwJzsKKworCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeCBiL3Rlc3QvaGF4ZS9zcmMvQXJndW1lbnRzLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTA3NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworaW1wb3J0IGhheGUuaW8uUGF0aDsKKwordXNpbmcgU3RyaW5nVG9vbHM7CisKKworZW51bSBQcm90b2NvbFR5cGUgeworICAgIGJpbmFyeTsKKyAgICBqc29uOworICAgIGNvbXBhY3Q7Cit9CisKK2VudW0gRW5kcG9pbnRUcmFuc3BvcnQgeworICAgIHNvY2tldDsKKyAgICBodHRwOworfQorCitlbnVtIFNlcnZlclR5cGUgeworICAgIHNpbXBsZTsKKyAgICAvKgorICAgIHRocmVhZHBvb2w7CisgICAgdGhyZWFkZWQ7CisgICAgbm9uYmxvY2tpbmc7CisgICAgKi8KK30KKworCitjbGFzcyBBcmd1bWVudHMKK3sKKyAgICBwdWJsaWMgdmFyIHByaW50SGVscE9ubHkoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2YXIgc2VydmVyKGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisgICAgcHVibGljIHZhciBzZXJ2ZXJ0eXBlKGRlZmF1bHQsbnVsbCkgOiBTZXJ2ZXJUeXBlID0gc2ltcGxlOworCisgICAgcHVibGljIHZhciBob3N0KGRlZmF1bHQsbnVsbCkgOiBTdHJpbmcgPSAibG9jYWxob3N0IjsKKyAgICBwdWJsaWMgdmFyIHBvcnQoZGVmYXVsdCxudWxsKSA6IEludCA9IDkwOTA7CisKKyAgICBwdWJsaWMgdmFyIHByb3RvY29sKGRlZmF1bHQsbnVsbCkgOiBQcm90b2NvbFR5cGUgPSBiaW5hcnk7CisgICAgcHVibGljIHZhciB0cmFuc3BvcnQoZGVmYXVsdCxudWxsKSA6IEVuZHBvaW50VHJhbnNwb3J0ID0gc29ja2V0OworICAgIHB1YmxpYyB2YXIgZnJhbWVkKGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisgICAgcHVibGljIHZhciBidWZmZXJlZChkZWZhdWx0LG51bGwpIDogQm9vbCA9IGZhbHNlOworCisgICAgcHVibGljIHZhciBudW1JdGVyYXRpb25zKGRlZmF1bHQsbnVsbCkgOiBJbnQgPSAxOworICAgIHB1YmxpYyB2YXIgbnVtVGhyZWFkcyhkZWZhdWx0LG51bGwpIDogSW50ID0gMTsKKyAgICBwdWJsaWMgdmFyIHNraXBTcGVlZFRlc3QoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICAgICAgI2lmIHN5cworICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgUGFyc2VBcmdzKCk7CisgICAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoR2V0SGVscCgpKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfQorICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAvL2ZvcmNpbmcgc2VydmVyCisgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gaHR0cDsKKyAgICAgICAgICAjZW5kCisgICAgICAgICNlbHNlCisgICAgICAgIHRyYWNlKCJXTjogUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBwcm9ncmFtIGFyZ3VtZW50cywgdXNpbmcgZGVmYXVsdHMuIik7CisgICAgICAgICNlbmQKKyAgICB9CisKKyAgICAjaWYgc3lzCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBHZXRIZWxwKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgc1Byb2cgPSBQYXRoLndpdGhvdXREaXJlY3RvcnkoIFN5cy5leGVjdXRhYmxlUGF0aCgpKTsKKyAgICAgICAgcmV0dXJuICJcbiIKKyAgICAgICAgICAgICtzUHJvZysiICBbY2xpZW50fHNlcnZlcl0gIFtvcHRpb25zXVxuIgorICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiTW9kdXM6IEVpdGhlciBjbGllbnQgb3Igc2VydmVyLCB0aGUgZGVmYXVsdCBpcyBjbGllbnQuXG4iCisgICAgICAgICAgICArIlxuIgorICAgICAgICAgICAgKyJDb21tb24gb3B0aW9uczpcbiIKKyAgICAgICAgICAgICsiICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2VcbiIKKyAgICAgICAgICAgICsiICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuIC8gY29ubmVjdCB0b1xuIgorICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgICAgICsiICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpXG4iCisgICAgICAgICAgICArIiAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpXG4iCisgICAgICAgICAgICAqLworICAgICAgICAgICAgKyIgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG4iCisgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgKyIgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuIgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICsiXG4iCisgICAgICAgICAgICArIlNlcnZlciBvbmx5IG9wdGlvbnM6XG4iCisgICAgICAgICAgICArIiAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgYW5vbnBpcGVcbiIKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICAgICArIiAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHNcbiIKKyAgICAgICAgICAgICsiICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXG4iCisgICAgICAgICAgICArIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiXG4iCisgICAgICAgICAgICArIiAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgXG4iCisgICAgICAgICAgICArIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlXG4iCisgICAgICAgICAgICAqLworICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiQ2xpZW50IG9ubHkgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICsiICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0XG4iCisgICAgICAgICAgICArIiAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwXG4iCisgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgKyIgIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKVxuIgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICsiICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzXG4iCisgICAgICAgICAgICArIiAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHNcbiIKKyAgICAgICAgICAgICsiICAtLXNraXAtc3BlZWQtdGVzdCAgICAgICAgICAgU2tpcCB0aGUgc3BlZWQgdGVzdFxuIgorICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4iCisgICAgICAgICAgICA7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFBhcnNlQXJncygpIDogVm9pZCB7CisKKyAgICAgICAgdmFyIGFyZ3MgPSBTeXMuYXJncygpLmNvcHkoKTsKKyAgICAgICAgaWYoIChhcmdzID09IG51bGwpIHx8IChhcmdzLmxlbmd0aCA8PSAwKSkgeworICAgICAgICAgICAgc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgIGlmICggYXJnID09ICJjbGllbnQiKSB7CisgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIG51bVRocmVhZHMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBhcmcgPT0gInNlcnZlciIpIHsKKyAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICBudW1UaHJlYWRzID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKGFyZyA9PSAiLWgiKSB8fCAoYXJnID09ICItLWhlbHAiKSkgeworICAgICAgICAgICAgLy8gLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAgICAgICBTeXMucHJpbnRsbiggR2V0SGVscCgpKTsKKyAgICAgICAgICAgIHByaW50SGVscE9ubHkgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhyb3cgIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciOworICAgICAgICB9CisKKworICAgICAgICB3aGlsZSggYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisKKyAgICAgICAgICAgIGlmICggKGFyZyA9PSAiLWgiKSB8fCAoYXJnID09ICItLWhlbHAiKSkgeworICAgICAgICAgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICAgICAgICAgIFN5cy5wcmludGxuKCBHZXRIZWxwKCkpOworICAgICAgICAgICAgICAgIHByaW50SGVscE9ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1wb3J0IikgeworICAgICAgICAgICAgICAgIC8vIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4KKyAgICAgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFN0ZC5wYXJzZUludChhcmcpOworICAgICAgICAgICAgICAgIGlmKCB0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gdG1wOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHBvcnQgbnVtYmVyICIrYXJnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1kb21haW4tc29ja2V0IikgeworICAgICAgICAgICAgICAgIC8vICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KQorICAgICAgICAgICAgICAgIHRocm93ICJkb21haW4gc29ja2V0cyBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tbmFtZWQtcGlwZSIpIHsKKyAgICAgICAgICAgICAgICAvLyAgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgICAgICAgICAgIHRocm93ICJuYW1lZCBwaXBlcyBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tcHJvdG9jb2wiKSB7CisgICAgICAgICAgICAgICAgLy8gLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgaWYoIGFyZyA9PSAiYmluYXJ5IikgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IGJpbmFyeTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiY29tcGFjdCIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBjb21wYWN0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJqc29uIikgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IGpzb247CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1zc2wiKSB7CisgICAgICAgICAgICAgICAgLy8gLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAgICAgICAgICAgdGhyb3cgIlNTTCBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL1NlcnZlciBvbmx5IG9wdGlvbnM6CisgICAgICAgICAgICAgICAgaWYoIHNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBQYXJzZVNlcnZlckFyZ3VtZW50KCBhcmcsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFBhcnNlQ2xpZW50QXJndW1lbnQoIGFyZywgYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFBhcnNlU2VydmVyQXJndW1lbnQoIGFyZyA6IFN0cmluZywgYXJncyA6IEFycmF5PFN0cmluZz4pIDogVm9pZCB7CisgICAgICAgIGlmIChhcmcgPT0gIi0tdHJhbnNwb3J0IikgeworICAgICAgICAgICAgLy8gIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiggYXJnID09ICJidWZmZXJlZCIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiZnJhbWVkIikgeworICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiaHR0cCIpIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBodHRwOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImFub25waXBlIikgeworICAgICAgICAgICAgICAgIHRocm93ICJBbm9uIHBpcGVzIHRyYW5zcG9ydCBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tcHJvY2Vzc29yLWV2ZW50cyIpIHsKKyAgICAgICAgICAgIHRocm93ICJQcm9jZXNzb3IgZXZlbnRzIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tc2VydmVyLXR5cGUiKSB7CisgICAgICAgICAgICAvLyAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLAorICAgICAgICAgICAgLy8gb25lIG9mICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLCAidGhyZWFkZWQiLCAibm9uYmxvY2tpbmciCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiggYXJnID09ICJzaW1wbGUiKSB7CisgICAgICAgICAgICAgICAgc2VydmVydHlwZSA9IHNpbXBsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJ0aHJlYWQtcG9vbCIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBhcmcrIiBzZXJ2ZXIgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gInRocmVhZGVkIikgeworICAgICAgICAgICAgICAgIHRocm93IGFyZysiIHNlcnZlciBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAibm9uYmxvY2tpbmciKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYXJnKyIgc2VydmVyIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChhcmcgPT0gIi1uIikgfHwgKGFyZyA9PSAiLS13b3JrZXJzIikpIHsKKyAgICAgICAgICAgIC8vICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvcgorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgdmFyIHRtcCA9IFN0ZC5wYXJzZUludChhcmcpOworICAgICAgICAgICAgaWYoIHRtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IHRtcDsKKyAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBudW1iZXIgIithcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VDbGllbnRBcmd1bWVudCggYXJnIDogU3RyaW5nLCBhcmdzIDogQXJyYXk8U3RyaW5nPikgOiBWb2lkIHsKKyAgICAgICAgaWYgKGFyZyA9PSAiLS1ob3N0IikgeworICAgICAgICAgICAgLy8gIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKKyAgICAgICAgICAgIGhvc3QgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXRyYW5zcG9ydCIpIHsKKyAgICAgICAgICAgIC8vICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIGlmKCBhcmcgPT0gImJ1ZmZlcmVkIikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJmcmFtZWQiKSB7CisgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJodHRwIikgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IGh0dHA7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiZXZodHRwIikgeworICAgICAgICAgICAgICAgIHRocm93ICJldmh0dHAgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1hbm9uLXBpcGVzIikgeworICAgICAgICAgICAgLy8gIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQorICAgICAgICAgICAgdGhyb3cgIkFub24gcGlwZXMgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoYXJnID09ICItbiIpIHx8IChhcmcgPT0gIi0tdGVzdGxvb3BzIikpIHsKKyAgICAgICAgICAgIC8vICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICB2YXIgdG1wID0gU3RkLnBhcnNlSW50KGFyZyk7CisgICAgICAgICAgICBpZiggdG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gdG1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBudW1iZXIgIithcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGFyZyA9PSAiLXQiKSB8fCAoYXJnID09ICItLXRocmVhZHMiKSkgeworICAgICAgICAgICAgLy8gIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICB2YXIgdG1wID0gU3RkLnBhcnNlSW50KGFyZyk7CisgICAgICAgICAgICBpZiggdG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gdG1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBudW1iZXIgIithcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXNraXAtc3BlZWQtdGVzdCIpIHsKKyAgICAgICAgICAgIC8vICAtLXNraXAtc3BlZWQtdGVzdCAgICAgICAgICAgICAgU2tpcCB0aGUgc3BlZWQgdGVzdAorICAgICAgICAgICAgc2tpcFNwZWVkVGVzdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICNlbmQKKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBJbnZhbGlkQXJnKCBhcmcgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHRocm93ICdJbnZhbGlkIGFyZ3VtZW50ICRhcmcnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeCBiL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI4MjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKK2NsYXNzIE1haW4KK3sKKyAgICBzdGF0aWMgZnVuY3Rpb24gbWFpbigpIHsKKyAgICAgICAgI2lmIHBocHdlYnNlcnZlcgorICAgICAgICBpbml0UGhwV2ViU2VydmVyKCk7CisgICAgICAgIC8vY2hlY2sgbWV0aG9kCisgICAgICAgIGlmKHBocC5XZWIuZ2V0TWV0aG9kKCkgIT0gJ1BPU1QnKSB7CisgICAgICAgICAgU3lzLnByaW50bG4oJ2h0dHAgZW5kcG9pbnQgZm9yIHRocmlmdCB0ZXN0IHNlcnZlcicpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAjZW5kCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IEFyZ3VtZW50cygpOworCisgICAgICAgICAgICBpZiggYXJncy5wcmludEhlbHBPbmx5KQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKGFyZ3Muc2VydmVyKQorICAgICAgICAgICAgICAgIFRlc3RTZXJ2ZXIuRXhlY3V0ZShhcmdzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBUZXN0Q2xpZW50LkV4ZWN1dGUoYXJncyk7CisKKyAgICAgICAgICAgIHRyYWNlKCJDb21wbGV0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGUgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgI2lmIHBocHdlYnNlcnZlcgorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQaHBXZWJTZXJ2ZXIoKQorICAgIHsKKyAgICAgICAgLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKKyAgICAgICAgaGF4ZS5Mb2cudHJhY2UgPSBmdW5jdGlvbih2OkR5bmFtaWMsID9pbmZvczpoYXhlLlBvc0luZm9zKQorICAgICAgICB7CisgICAgICAgICAgLy8gaGFuZGxlIHRyYWNlCisgICAgICAgICAgdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKyAgICAgICAgICBpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKyAgICAgICAgICAgIHZhciBleHRyYTpTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgIGZvciggdiBpbiBpbmZvcy5jdXN0b21QYXJhbXMgKQorICAgICAgICAgICAgICBleHRyYSArPSAiLCIgKyB2OworICAgICAgICAgICAgbmV3VmFsdWUgPSB2ICsgZXh0cmE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmV3VmFsdWUgPSB2OworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKyAgICAgICAgICBTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kCisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMzMTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4CkBAIC0wLDAgKzEsOTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLlRpbWVyOworaW1wb3J0IGhheGUuZHMuSW50TWFwOworaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwOworaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisjaWYgY3BwCitpbXBvcnQgY3BwLnZtLlRocmVhZDsKKyNlbHNlCisvLyBubyB0aHJlYWQgc3VwcG9ydCAoeWV0KQorI2VuZAorCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKwordXNpbmcgU3RyaW5nVG9vbHM7CisKK2NsYXNzIFRlc3RSZXN1bHRzIHsKKyAgICBwcml2YXRlIHZhciBzdWNjZXNzQ250IDogSW50ID0gMDsKKyAgICBwcml2YXRlIHZhciBlcnJvckNudCA6IEludCA9IDA7CisgICAgcHJpdmF0ZSB2YXIgZmFpbGVkVGVzdHMgOiBTdHJpbmcgPSAiIjsKKyAgICBwcml2YXRlIHZhciBwcmludF9kaXJlY3QgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9TVUNDRVNTICAgICAgICAgICAgPSAweDAwOyAgLy8gbm8gZXJyb3JzIGJpdHMgc2V0CisgICAgLy8KKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyAgPSAweDAxOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUyAgICA9IDB4MDI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTID0gMHgwNDsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9GQUlMQklUX0VYQ0VQVElPTlMgPSAweDA4OworICAgIC8vCisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfQUxMX0ZBSUxCSVRTICAgICAgID0gMHgwRjsKKyAgICAvLworICAgIHByaXZhdGUgdmFyIHRlc3RzRXhlY3V0ZWQgOiBJbnQgPSAwOworICAgIHByaXZhdGUgdmFyIHRlc3RzRmFpbGVkIDogSW50ID0gMDsKKyAgICBwcml2YXRlIHZhciBjdXJyZW50VGVzdCA6IEludCA9IDA7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZGlyZWN0IDogQm9vbCkgeworICAgICAgICBwcmludF9kaXJlY3QgPSBkaXJlY3Q7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFN0YXJ0VGVzdEdyb3VwKCBncm91cEJpdCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgY3VycmVudFRlc3QgPSBncm91cEJpdDsKKyAgICAgICAgdGVzdHNFeGVjdXRlZCB8PSBncm91cEJpdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRXhwZWN0KCBleHByIDogQm9vbCwgbXNnIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICBpZiAoIGV4cHIpIHsKKyAgICAgICAgICAgICsrc3VjY2Vzc0NudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsrZXJyb3JDbnQ7CisgICAgICAgICAgICB0ZXN0c0ZhaWxlZCB8PSBjdXJyZW50VGVzdDsKKyAgICAgICAgICAgIGZhaWxlZFRlc3RzICs9ICJcbiAgIiArIG1zZzsKKyAgICAgICAgICAgIGlmKCBwcmludF9kaXJlY3QpIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRkFJTDogJG1zZycpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENhbGN1bGF0ZUV4aXRDb2RlKCkgOiBJbnQgeworICAgICAgICB2YXIgbm90RXhlY3V0ZWQgOiBJbnQgPSBFWElUQ09ERV9BTExfRkFJTEJJVFMgJiAofnRlc3RzRXhlY3V0ZWQpOworICAgICAgICByZXR1cm4gdGVzdHNGYWlsZWQgfCBub3RFeGVjdXRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUHJpbnRTdW1tYXJ5KCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHRvdGFsID0gc3VjY2Vzc0NudCArIGVycm9yQ250OworICAgICAgICB2YXIgc3AgPSBNYXRoLnJvdW5kKCgxMDAwICogc3VjY2Vzc0NudCkgLyB0b3RhbCkgLyAxMDsKKyAgICAgICAgdmFyIGVwID0gTWF0aC5yb3VuZCgoMTAwMCAqIGVycm9yQ250KSAvIHRvdGFsKSAvIDEwOworCisgICAgICAgIHRyYWNlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICAgICAgdHJhY2UoJ1Rlc3RzIGV4ZWN1dGVkICAgICR0b3RhbCcpOworICAgICAgICB0cmFjZSgnVGVzdHMgc3VjY2VlZGVkICAgJHN1Y2Nlc3NDbnQgKCRzcCUpJyk7CisgICAgICAgIHRyYWNlKCdUZXN0cyBmYWlsZWQgICAgICAkZXJyb3JDbnQgKCRlcCUpJyk7CisgICAgICAgIGlmICggZXJyb3JDbnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgICAgICAgICB0cmFjZSgnRkFJTEVEIFRFU1RTOiAkZmFpbGVkVGVzdHMnKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgfQorfQorCisKK2NsYXNzIFRlc3RDbGllbnQgeworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFeGVjdXRlKGFyZ3MgOiBBcmd1bWVudHMpIDogIFZvaWQKKyAgICB7CisgICAgICAgIHZhciBleGl0Q29kZSA9IDB4RkY7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGlmZnQgPSBUaW1lci5zdGFtcCgpOworCisgICAgICAgICAgICBpZiAoIGFyZ3MubnVtVGhyZWFkcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAjaWYgY3BwCisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBNdWx0aVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYWNlKCdUaHJlYWRzIG5vdCBzdXBwb3J0ZWQvaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0uJyk7CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleGl0Q29kZSA9IFNpbmdsZVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlmZnQgPSBNYXRoLnJvdW5kKCAxMDAwICogKFRpbWVyLnN0YW1wKCkgLSBkaWZmdCkpIC8gMTAwMDsKKyAgICAgICAgICAgIHRyYWNlKCd0b3RhbCB0ZXN0IHRpbWU6ICRkaWZmdCBzZWNvbmRzJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbjogJGUnKTsKKyAgICAgICAgICAgIGV4aXRDb2RlID0gMHhGRjsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFeGNlcHRpb246ICRlJyk7CisgICAgICAgICAgICBleGl0Q29kZSA9IDB4RkY7CisgICAgICAgIH0KKworICAgICAgICAjaWYgc3lzCisgICAgICAgIFN5cy5leGl0KCBleGl0Q29kZSk7CisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU2luZ2xlVGhyZWFkQ2xpZW50KGFyZ3MgOiBBcmd1bWVudHMpIDogIEludAorICAgIHsKKyAgICAgICAgdmFyIHJzbHQgPSBuZXcgVGVzdFJlc3VsdHModHJ1ZSk7CisgICAgICAgIFJ1bkNsaWVudChhcmdzLHJzbHQpOworICAgICAgICByc2x0LlByaW50U3VtbWFyeSgpOworICAgICAgICByZXR1cm4gcnNsdC5DYWxjdWxhdGVFeGl0Q29kZSgpOworICAgIH0KKworCisgICAgI2lmIGNwcAorICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTXVsdGlUaHJlYWRDbGllbnQoYXJncyA6IEFyZ3VtZW50cykgOiAgSW50CisgICAgeworICAgICAgICB2YXIgdGhyZWFkcyA9IG5ldyBMaXN0PFRocmVhZD4oKTsKKyAgICAgICAgZm9yKCB0ZXN0IGluIDAgLi4uIGFyZ3MubnVtVGhyZWFkcykgeworICAgICAgICAgICAgdGhyZWFkcy5hZGQoIFN0YXJ0VGhyZWFkKCBhcmdzKSk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGV4aXRDb2RlIDogSW50ID0gMDsKKyAgICAgICAgZm9yKCB0aHJlYWQgaW4gdGhyZWFkcykgeworICAgICAgICAgICAgZXhpdENvZGUgfD0gVGhyZWFkLnJlYWRNZXNzYWdlKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleGl0Q29kZTsKKyAgICB9CisgICAgI2VuZAorCisgICAgI2lmIGNwcAorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFN0YXJ0VGhyZWFkKGFyZ3MgOiBBcmd1bWVudHMpIDogVGhyZWFkIHsKKyAgICAgICAgdmFyIHRocmVhZCA9IFRocmVhZC5jcmVhdGUoCisgICAgICAgICAgICBmdW5jdGlvbigpIDogVm9pZCB7CisgICAgICAgICAgICAgICAgdmFyIHJzbHQgPSBuZXcgVGVzdFJlc3VsdHMoZmFsc2UpOworICAgICAgICAgICAgICAgIHZhciBtYWluIDogVGhyZWFkID0gVGhyZWFkLnJlYWRNZXNzYWdlKHRydWUpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUnVuQ2xpZW50KGFyZ3MscnNsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJyRlJyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlKCckZScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICckZScpOworICAgICAgICAgICAgICAgICAgICB0cmFjZSgnJGUnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFpbi5zZW5kTWVzc2FnZSggcnNsdC5DYWxjdWxhdGVFeGl0Q29kZSgpKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRocmVhZC5zZW5kTWVzc2FnZShUaHJlYWQuY3VycmVudCgpKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisgICAgI2VuZAorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJ1bkNsaWVudChhcmdzIDogQXJndW1lbnRzLCByc2x0IDogVGVzdFJlc3VsdHMpCisgICAgeworICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgIHN3aXRjaCAoYXJncy50cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KGFyZ3MuaG9zdCwgYXJncy5wb3J0KTsKKyAgICAgICAgICAgIGNhc2UgaHR0cDoKKyAgICAgICAgICAgICAgICB2YXIgdXJpID0gJ2h0dHA6Ly8ke2FyZ3MuaG9zdH06JHthcmdzLnBvcnR9JzsKKyAgICAgICAgICAgICAgICB0cmFjZSgnLSBodHRwIGNsaWVudCA6ICR7dXJpfScpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgaWYgKCBhcmdzLmZyYW1lZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFyZ3MuYnVmZmVyZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgc3dpdGNoKCBhcmdzLnByb3RvY29sKQorICAgICAgICB7CisgICAgICAgIGNhc2UgYmluYXJ5OgorICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgdHJhY2UoIi0ganNvbiBwcm90b2NvbCIpOworICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICBjYXNlIGNvbXBhY3Q6CisgICAgICAgICAgICB0cmFjZSgiLSBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzb21lIHF1aWNrIGFuZCBiYXNpYyB1bml0IHRlc3RzCisgICAgICAgIEhheGVCYXNpY3NUZXN0KCBhcmdzLCByc2x0KTsKKyAgICAgICAgTW9kdWxlVW5pdFRlc3RzKCBhcmdzLCByc2x0KTsKKworICAgICAgICAvLyBub3cgcnVuIHRoZSB0ZXN0IGNvZGUKKyAgICAgICAgdHJhY2UoJy0gJHthcmdzLm51bUl0ZXJhdGlvbnN9IGl0ZXJhdGlvbnMnKTsKKyAgICAgICAgZm9yKCBpIGluIDAgLi4uIGFyZ3MubnVtSXRlcmF0aW9ucykgeworICAgICAgICAgICAgQ2xpZW50VGVzdCggdHJhbnNwb3J0LCBwcm90b2NvbCwgYXJncywgcnNsdCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSGF4ZUJhc2ljc1Rlc3QoIGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykgOiBWb2lkCisgICAgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHRlc3QgYSBmZXcgYmFzaWMgdGhpbmdzIHVzZWQgaW4gdGhlIENsaWVudFRlc3QKKyAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBiZXlvbmQgdGhpcyBzY29wZSBzaG91bGQgZ28gaW50byAvbGliL2hheGUvIGluc3RlYWQKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOworCisgICAgICAgIHZhciBtYXAzMiA9IG5ldyBJbnRNYXA8SW50MzI+KCk7CisgICAgICAgIHZhciBtYXA2NCA9IG5ldyBJbnQ2NE1hcDxJbnQzMj4oKTsKKworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIua2V5cygpLmhhc05leHQoKSA9PSBtYXA2NC5rZXlzKCkuaGFzTmV4dCgpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDcxMSkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIucmVtb3ZlKCA0NzExKSA9PSBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQ3MTEpID09IG1hcDY0LmdldCggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzQiKTsKKworICAgICAgICBtYXAzMi5zZXQoIDQyLCA4MTUpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm1ha2UoMCw0MiksIDgxNSk7CisgICAgICAgIG1hcDMyLnNldCggLTUxNywgMjMpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSksIDIzKTsKKyAgICAgICAgbWFwMzIuc2V0KCAwLCAtMTIzKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5tYWtlKDAsMCksIC0xMjMpOworCisgICAgICAgIC8vdHJhY2UoJ21hcDMyID0gJG1hcDMyJyk7CisgICAgICAgIC8vdHJhY2UoJ21hcDY0ID0gJG1hcDY0Jyk7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmtleXMoKS5oYXNOZXh0KCkgPT0gbWFwNjQua2V5cygpLmhhc05leHQoKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxMCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0NzExKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxMSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAtNTE3KSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEyIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQyKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDApID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxNCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0NzExKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxNSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAtNTE3KSA9PSBtYXA2NC5nZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzE2Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQyKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgI0ludDY0Lm1ha2UoLTUsMTcpIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDApID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxOCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIucmVtb3ZlKCA0NzExKSA9PSBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxOSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIucmVtb3ZlKCAtNTE3KSA9PSBtYXA2NC5yZW1vdmUoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIwIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQ3MTEpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIxIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIC01MTcpID09IG1hcDY0LmV4aXN0cyggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjIiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDIpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjMiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggMCkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI0Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQ3MTEpID09IG1hcDY0LmdldCggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI1Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIC01MTcpID09IG1hcDY0LmdldCggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjYiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDIpID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggMCkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI4Iik7CisKKyAgICAgICAgbWFwMzIuc2V0KCA0MiwgMSk7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubWFrZSgwLDQyKSwgMSk7CisgICAgICAgIG1hcDMyLnNldCggLTUxNywgLTIpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSksIC0yKTsKKyAgICAgICAgbWFwMzIuc2V0KCAwLCAzKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5tYWtlKDAsMCksIDMpOworCisgICAgICAgIHZhciBjMzIgPSAwOworICAgICAgICB2YXIga3N1bTMyID0gMDsKKyAgICAgICAgZm9yIChrZXkgaW4gbWFwMzIua2V5cygpKSB7CisgICAgICAgICAgICArK2MzMjsKKyAgICAgICAgICAgIGtzdW0zMiArPSBrZXk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGM2NCA9IDA7CisgICAgICAgIHZhciBrc3VtNjQgPSBJbnQ2NC5tYWtlKDAsMCk7CisgICAgICAgIGZvciAoa2V5IGluIG1hcDY0LmtleXMoKSkgeworICAgICAgICAgICAgKytjNjQ7CisgICAgICAgICAgICBrc3VtNjQgPSBJbnQ2NC5hZGQoIGtzdW02NCwga2V5KTsKKyAgICAgICAgfQorICAgICAgICByc2x0LkV4cGVjdCggYzMyID09IGM2NCwgIkludDY0TWFwPEludDMyPiBUZXN0ICMzMCIpOworICAgICAgICByc2x0LkV4cGVjdCggJyRrc3VtNjQnID09ICcka3N1bTMyJywgJyRrc3VtNjQgPT0gJGtzdW0zMiAgIFRlc3QgIzMxJyk7CisKKyAgICAgICAgLy9jb21wYXJlIHdpdGhvdXQgc3BhY2VzIGJlY2F1c2UgZGlmZmVyIGluIHBocCBhbmQgY3BwCisgICAgICAgIHZhciBzMzIgPSBtYXAzMi50b1N0cmluZygpLnJlcGxhY2UoJyAnLCAnJyk7CisgICAgICAgIHZhciBzNjQgPSBtYXA2NC50b1N0cmluZygpLnJlcGxhY2UoJyAnLCAnJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBzMzIgPT0gczY0LCAiSW50NjRNYXA8SW50MzI+LnRvU3RyaW5nKCk6ICIgKyAnICgiJHMzMiIgPT0gIiRzNjQiKSBUZXN0ICMzMicpOworCisgICAgICAgIG1hcDMyLnJlbW92ZSggNDIpOworICAgICAgICBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoMCw0MikpOworICAgICAgICBtYXAzMi5yZW1vdmUoIC01MTcpOworICAgICAgICBtYXA2NC5yZW1vdmUoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpOworICAgICAgICBtYXAzMi5yZW1vdmUoIDApOworICAgICAgICBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoMCwwKSk7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmtleXMoKS5oYXNOZXh0KCkgPT0gbWFwNjQua2V5cygpLmhhc05leHQoKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5MCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0NzExKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5MSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAtNTE3KSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzkyIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQyKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzkzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDApID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0NzExKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAtNTE3KSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoLTUsMTcpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0MikgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAwKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCwgMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzk4Iik7CisgICAgfQorCisKKyAgICAvLyBjb3JlIG1vZHVsZSB1bml0IHRlc3RzCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNb2R1bGVVbml0VGVzdHMoIGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykgOiBWb2lkIHsKKyAgICAgICAgI2lmIGRlYnVnCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJpdENvbnZlcnRlci5Vbml0VGVzdCgpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICdCaXRDb252ZXJ0ZXIuVW5pdFRlc3QgIFRlc3QgIzEwMCcpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogRHluYW1pYykgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAnQml0Q29udmVydGVyLlVuaXRUZXN0OiAkZSAgVGVzdCAjMTAwJyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlnWmFnLlVuaXRUZXN0KCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ1ppZ1phZy5Vbml0VGVzdCAgVGVzdCAjMTAxJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKSB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICdaaWdaYWcuVW5pdFRlc3Q6ICRlICBUZXN0ICMxMDEnKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQnl0ZXNUb0hleChkYXRhIDogQnl0ZXMpIDogU3RyaW5nIHsKKyAgICAgICAgdmFyIGhleCA9ICIiOworICAgICAgICBmb3IgKCBpIGluIDAgLi4uIGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBoZXggKz0gU3RyaW5nVG9vbHMuaGV4KCBkYXRhLmdldChpKSwgMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhleDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFByZXBhcmVUZXN0RGF0YShyYW5kb21EaXN0IDogQm9vbCkgOiBCeXRlcyAgICB7CisgICAgICAgIHZhciByZXR2YWwgPSBCeXRlcy5hbGxvYygweDEwMCk7CisgICAgICAgIHZhciBpbml0TGVuIDogSW50ID0gKHJldHZhbC5sZW5ndGggPiAweDEwMCA/IDB4MTAwIDogcmV0dmFsLmxlbmd0aCk7CisKKyAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7CisgICAgICAgICAgICBmb3IgKGkgaW4gMCAuLi4gaW5pdExlbikgeworICAgICAgICAgICAgICAgIHJldHZhbC5zZXQoaSwgaSAlIDB4MTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgIGZvciAoaSBpbiAwIC4uLiBpbml0TGVuKSB7CisgICAgICAgICAgICByZXR2YWwuc2V0KGksIDApOworICAgICAgICB9CisgICAgICAgIGZvciAoaSBpbiAxIC4uLiBpbml0TGVuKSB7CisgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgeworICAgICAgICAgICAgICAgIHZhciBuZXh0UG9zID0gU3RkLnJhbmRvbShpbml0TGVuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsLmdldChuZXh0UG9zKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbC5zZXQoIG5leHRQb3MsIGkgJSAweDEwMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDbGllbnRUZXN0KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBwcm90b2NvbCA6IFRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykgOiBWb2lkCisgICAgeworICAgICAgICB2YXIgY2xpZW50ID0gbmV3IFRocmlmdFRlc3RJbXBsKHByb3RvY29sLHByb3RvY29sKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LmlzT3BlbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd1bmFibGUgdG8gb3BlbiB0cmFuc3BvcnQ6ICRlJyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd1bmFibGUgdG8gb3BlbiB0cmFuc3BvcnQ6ICRlJyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpOworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUyk7CisKKyAgICAgICAgLy8gaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgICAgIHRyYWNlKCd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgc2hvdWxkIHRocm93Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBYY2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGUubWVzc2FnZSA9PSAiWGNlcHRpb24iLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgZS5tZXNzYWdlID09ICJYY2VwdGlvbiInKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBlLmVycm9yQ29kZSA9PSAxMDAxLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgZS5lcnJvckNvZGUgPT0gMTAwMScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgJHtlfSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgIC0gICRlJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAgICAgdHJhY2UoJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSBzaG91bGQgdGhyb3cnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAndGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpICAtICAkZSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSAgLSAgJGUnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlb3BlbiB0aGUgdHJhbnNwb3J0LCBqdXN0IGluIGNhc2UgdGhlIHNlcnZlciBjbG9zZWQgaGlzIGVuZAorICAgICAgICBpZiAodHJhbnNwb3J0LmlzT3BlbigpKQorICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICAgICAgLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAgICAgdHJhY2UoJ3Rlc3RFeGNlcHRpb24oImJsYSIpJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiYmxhIik7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpIHNob3VsZCBub3QgdGhyb3cnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiYmxhIikgIC0gICRlJyk7CisgICAgICAgIH0KKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RWb2lkKCknKTsKKyAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgIHRyYWNlKCcgPSB2b2lkJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KHRydWUsInRlc3RWb2lkKCkiKTsgIC8vIGJ1bXAgY291bnRlcgorCisgICAgICAgIHRyYWNlKCd0ZXN0Qm9vbCgke3RydWV9KScpOworICAgICAgICB2YXIgYiA9IGNsaWVudC50ZXN0Qm9vbCh0cnVlKTsKKyAgICAgICAgdHJhY2UoJyA9ICRiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGIsICckYiA9PSAiJHt0cnVlfSInKTsKKyAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR7ZmFsc2V9KScpOworICAgICAgICBiID0gY2xpZW50LnRlc3RCb29sKGZhbHNlKTsKKyAgICAgICAgdHJhY2UoJyA9ICRiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIGIsICckYiA9PSAiJHtmYWxzZX0iJyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOworICAgICAgICB2YXIgcyA9IGNsaWVudC50ZXN0U3RyaW5nKCJUZXN0Iik7CisgICAgICAgIHRyYWNlKCcgPSAiJHMiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KHMgPT0gIlRlc3QiLCAnJHMgPT0gIlRlc3QiJyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RCeXRlKDEpJyk7CisgICAgICAgIHZhciBpOCA9IGNsaWVudC50ZXN0Qnl0ZSgxKTsKKyAgICAgICAgdHJhY2UoJyA9ICRpOCcpOworICAgICAgICByc2x0LkV4cGVjdChpOCA9PSAxLCAnJGk4ID09IDEnKTsKKworICAgICAgICB0cmFjZSgndGVzdEkzMigtMSknKTsKKyAgICAgICAgdmFyIGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKKyAgICAgICAgdHJhY2UoJyA9ICRpMzInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoaTMyID09IC0xLCAnJGkzMiA9PSAtMScpOworCisgICAgICAgIHRyYWNlKCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKKyAgICAgICAgdmFyIGk2NCA9IGNsaWVudC50ZXN0STY0KCBJbnQ2NC5tYWtlKCAweEZGRkZGRkY4LCAweDAwMDAwMDAwKSk7IC8vIC0zNDM1OTczODM2OAorICAgICAgICB0cmFjZSgnID0gJGk2NCcpOworICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggaTY0LCBJbnQ2NC5tYWtlKCAweEZGRkZGRkY4LCAweDAwMDAwMDAwKSkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIEludDY0LnRvU3RyKGk2NCkgKyIgPT0gIitJbnQ2NC50b1N0cihJbnQ2NC5tYWtlKCAweEZGRkZGRkY4LCAweDAwMDAwMDAwKSkpOworCisgICAgICAgIC8vIGVkZ2UgY2FzZTogdGhlIGxhcmdlc3QgbmVnYXRpdmUgSW50NjQgaGFzIG5vIHBvc2l0aXZlIEludDY0IGVxdWl2YWxlbnQKKyAgICAgICAgdHJhY2UoJ3Rlc3RJNjQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpJyk7CisgICAgICAgIGk2NCA9IGNsaWVudC50ZXN0STY0KCBJbnQ2NC5tYWtlKCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSk7IC8vIC05MjIzMzcyMDM2ODU0Nzc1ODA4CisgICAgICAgIHRyYWNlKCcgPSAkaTY0Jyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBpNjQsIEludDY0Lm1ha2UoIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIoaTY0KSArIiA9PSAiK0ludDY0LnRvU3RyKEludDY0Lm1ha2UoIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKSk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CisgICAgICAgIHZhciBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgICAgICAgIHRyYWNlKCcgPSAkZHViJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGR1YiA9PSA1LjMyNTA5ODIzNSwgJyRkdWIgPT0gNS4zMjUwOTgyMzUnKTsKKworICAgICAgICB2YXIgYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKHRydWUpOworICAgICAgICB0cmFjZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJpbkluID0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKKyAgICAgICAgICAgIHRyYWNlKCd0ZXN0QmluYXJ5KCkgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBiaW5Jbi5sZW5ndGggPT0gYmluT3V0Lmxlbmd0aCwgJyR7YmluSW4ubGVuZ3RofSA9PSAke2Jpbk91dC5sZW5ndGh9Jyk7CisgICAgICAgICAgICB2YXIgbGVuID0gKChiaW5Jbi5sZW5ndGggPCBiaW5PdXQubGVuZ3RoKSAgPyAgYmluSW4ubGVuZ3RoICA6IGJpbk91dC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChvZnMgaW4gMCAuLi4gbGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpbkluLmdldChvZnMpICE9IGJpbk91dC5nZXQob2ZzKSkgeworICAgICAgICAgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpOiBjb250ZW50IG1pc21hdGNoIGF0IG9mZnNldCAkb2ZzJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKTogJytlLmVycm9yTXNnKTsgIC8vIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIKKyAgICAgICAgfQorCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTKTsKKworICAgICAgICB0cmFjZSgndGVzdFN0cnVjdCh7Ilplcm8iLCAxLCAtMywgLTV9KScpOworICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgby5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgIG8uYnl0ZV90aGluZyA9IDE7CisgICAgICAgIG8uaTMyX3RoaW5nID0gLTM7CisgICAgICAgIG8uaTY0X3RoaW5nID0gSW50NjQubWFrZSgwLC01KTsKKyAgICAgICAgdmFyIGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgICAgICAgdHJhY2UoJyA9IHsiJyArIGkuc3RyaW5nX3RoaW5nICsgJyIsICcgKyBpLmJ5dGVfdGhpbmcgKycsICcKKyAgICAgICAgICAgICAgICAgICAgICArIGkuaTMyX3RoaW5nICsnLCAnKyBJbnQ2NC50b1N0cihpLmk2NF90aGluZykgKyAnfScpOworICAgICAgICByc2x0LkV4cGVjdCggaS5zdHJpbmdfdGhpbmcgPT0gby5zdHJpbmdfdGhpbmcsICJpLnN0cmluZ190aGluZyA9PSBvLnN0cmluZ190aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5ieXRlX3RoaW5nID09IG8uYnl0ZV90aGluZywgImkuYnl0ZV90aGluZyA9PSBvLmJ5dGVfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nLCAiaS5pNjRfdGhpbmcgPT0gby5pNjRfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nLCAiaS5pNjRfdGhpbmcgPT0gby5pNjRfdGhpbmciKTsKKworICAgICAgICB0cmFjZSgndGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pJyk7CisgICAgICAgIHZhciBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgIG8yLmJ5dGVfdGhpbmcgPSAxOworICAgICAgICBvMi5zdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICBvMi5pMzJfdGhpbmcgPSA1OworICAgICAgICB2YXIgaTIgPSBjbGllbnQudGVzdE5lc3QobzIpOworICAgICAgICBpID0gaTIuc3RydWN0X3RoaW5nOworICAgICAgICB0cmFjZSgiID0geyIgKyBpMi5ieXRlX3RoaW5nICsgIiwge1wiIiArIGkuc3RyaW5nX3RoaW5nICsgIlwiLCAiCisgICAgICAgICAgICAgICsgaS5ieXRlX3RoaW5nICsgIiwgIiArIGkuaTMyX3RoaW5nICsgIiwgIiArIEludDY0LnRvU3RyKGkuaTY0X3RoaW5nKSArICJ9LCAiCisgICAgICAgICAgICAgICsgaTIuaTMyX3RoaW5nICsgIn0iKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkyLmJ5dGVfdGhpbmcgPT0gbzIuYnl0ZV90aGluZywgImkyLmJ5dGVfdGhpbmcgPT0gbzIuYnl0ZV90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaTIuaTMyX3RoaW5nID09IG8yLmkzMl90aGluZywgImkyLmkzMl90aGluZyA9PSBvMi5pMzJfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuc3RyaW5nX3RoaW5nID09IG8uc3RyaW5nX3RoaW5nLCAiaS5zdHJpbmdfdGhpbmcgPT0gby5zdHJpbmdfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuYnl0ZV90aGluZyA9PSBvLmJ5dGVfdGhpbmcsICJpLmJ5dGVfdGhpbmcgPT0gby5ieXRlX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLmkzMl90aGluZyA9PSBvLmkzMl90aGluZywgImkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBpLmk2NF90aGluZywgby5pNjRfdGhpbmcpID09IDAsICJpLmk2NF90aGluZyA9PSBvLmk2NF90aGluZyIpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTKTsKKworICAgICAgICB2YXIgbWFwb3V0ID0gbmV3IEludE1hcDwgaGF4ZS5JbnQzMj4oKTsKKyAgICAgICAgZm9yICggaiBpbiAwIC4uLiA1KQorICAgICAgICB7CisgICAgICAgICAgICBtYXBvdXQuc2V0KGosIGogLSAxMCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoInRlc3RNYXAoeyIpOworICAgICAgICB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBrZXkgaW4gbWFwb3V0LmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+ICIgKyBtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9KSIpOworCisgICAgICAgIHZhciBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7CisKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGtleSBpbiBtYXBpbi5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiAiICsgbWFwaW4uZ2V0KGtleSkpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIG1hcGluLmdldChrZXkpID09IG1hcG91dC5nZXQoa2V5KSwgJyBtYXBpbi5nZXQoJGtleSkgPT0gbWFwb3V0LmdldCgka2V5KScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisgICAgICAgIGZvcigga2V5IGluIG1hcG91dC5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KG1hcGluLmV4aXN0cyhrZXkpLCAnbWFwaW4uZXhpc3RzKCRrZXkpJyk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbGlzdG91dCA9IG5ldyBMaXN0PEludD4oKTsKKyAgICAgICAgZm9yIChqIGluIC0yIC4uLiAzKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0b3V0LmFkZChqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgidGVzdExpc3QoeyIpOworICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciggaiBpbiBsaXN0b3V0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9KSIpOworCisgICAgICAgIHZhciBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7CisKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGogaW4gbGlzdGluKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisKKyAgICAgICAgcnNsdC5FeHBlY3QobGlzdGluLmxlbmd0aCA9PSBsaXN0b3V0Lmxlbmd0aCwgImxpc3Rpbi5sZW5ndGggPT0gbGlzdG91dC5sZW5ndGgiKTsKKyAgICAgICAgdmFyIGxpdGVyb3V0ID0gbGlzdG91dC5pdGVyYXRvcigpOworICAgICAgICB2YXIgbGl0ZXJpbiA9IGxpc3Rpbi5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSggbGl0ZXJpbi5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KGxpdGVyaW4ubmV4dCgpID09IGxpdGVyb3V0Lm5leHQoKSwgImxpdGVyaW5baV0gPT0gbGl0ZXJvdXRbaV0iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vc2V0CisgICAgICAgIHZhciBzZXRvdXQgPSBuZXcgSW50U2V0KCk7CisgICAgICAgIGZvciAoaiBpbiAtMiAuLi4gMykKKyAgICAgICAgeworICAgICAgICAgICAgc2V0b3V0LmFkZChqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgidGVzdFNldCh7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBqIGluIHNldG91dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSkiKTsKKworICAgICAgICB2YXIgc2V0aW4gPSBjbGllbnQudGVzdFNldChzZXRvdXQpOworCisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBqIGluIHNldGluKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICAgICAgcnNsdC5FeHBlY3Qoc2V0b3V0LmNvbnRhaW5zKGopLCAnc2V0b3V0LmNvbnRhaW5zKCRqKScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KHNldGluLnNpemUgPT0gc2V0b3V0LnNpemUsICJzZXRpbi5sZW5ndGggPT0gc2V0b3V0Lmxlbmd0aCIpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgIHZhciByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6Lk9ORSwgJyRyZXQgPT0gTnVtYmVyei5PTkUnKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6LlRXTywgJyRyZXQgPT0gTnVtYmVyei5UV08nKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oVEhSRUUpIik7CisgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5USFJFRSwgJyRyZXQgPT0gTnVtYmVyei5USFJFRScpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5GSVZFLCAnJHJldCA9PSBOdW1iZXJ6LkZJVkUnKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5FSUdIVCwgJyRyZXQgPT0gTnVtYmVyei5FSUdIVCcpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgIHZhciB1aWQgPSBjbGllbnQudGVzdFR5cGVkZWYoIEludDY0Lm1ha2UoIDB4MTE5RDAsIDB4N0UwODY3MUIpKTsgIC8vIDMwOTg1ODIzNTA4MjUyMworICAgICAgICB0cmFjZSgiID0gIiArIHVpZCk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCB1aWQsIEludDY0Lm1ha2UoIDB4MTE5RDAsIDB4N0UwODY3MUIpKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIodWlkKSsiID09ICIrSW50NjQudG9TdHIoSW50NjQubWFrZSggMHgxMTlEMCwgMHg3RTA4NjcxQikpKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgICAgdmFyIG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZvcigga2V5IGluIG1tLmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICB2YXIgbTIgPSBtbS5nZXQoa2V5KTsKKyAgICAgICAgICAgIGZvciggazIgaW4gbTIua2V5cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGsyICsgIiA9PiAiICsgbTIuZ2V0KGsyKSArICIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2UoIn0sICIpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisKKyAgICAgICAgdmFyIHBvcyA9IG1tLmdldCg0KTsKKyAgICAgICAgdmFyIG5lZyA9IG1tLmdldCgtNCk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAocG9zICE9IG51bGwpICYmIChuZWcgIT0gbnVsbCksICIocG9zICE9IG51bGwpICYmIChuZWcgIT0gbnVsbCkiKTsKKyAgICAgICAgZm9yIChpIGluIDEgLi4uIDUpIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBwb3MuZ2V0KGkpID09IGksICdwb3MuZ2V0KCRpKSA9PSAkaScpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIG5lZy5nZXQoLWkpID09IC1pLCAnbmVnLmdldCgtJGkpID09IC0kaScpOworICAgICAgICB9CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIHBvcy5leGlzdHMoMCksICchcG9zLmV4aXN0cygwKScpOworICAgICAgICByc2x0LkV4cGVjdCggISBuZWcuZXhpc3RzKC0wKSwgJyFuZWcuZXhpc3RzKC0wKScpOworICAgICAgICByc2x0LkV4cGVjdCggISBwb3MuZXhpc3RzKDQyKSwgJyFwb3MuZXhpc3RzKDQyKScpOworICAgICAgICByc2x0LkV4cGVjdCggISBuZWcuZXhpc3RzKC00MiksICchbmVnLmV4aXN0cygtNDIpJyk7CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX1NUUlVDVFMpOworCisgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSW50TWFwPCBJbnQ2ND4oKTsKKyAgICAgICAgaW5zYW5lLnVzZXJNYXAuc2V0KCBOdW1iZXJ6LkZJVkUsIEludDY0Lm1ha2UoMCw1MDAwKSk7CisgICAgICAgIHZhciB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7CisgICAgICAgIHRydWNrLmkzMl90aGluZyA9IDg7CisgICAgICAgIHRydWNrLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMCw4KTsKKyAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZCh0cnVjayk7CisgICAgICAgIHRyYWNlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICB2YXIgd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZm9yKCBrZXkgaW4gd2hvYS5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWwgPSB3aG9hLmdldChrZXkpOworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgIGZvciggazIgaW4gdmFsLmtleXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdjIgPSB2YWwuZ2V0KGsyKTsKKworICAgICAgICAgICAgICAgIHRyYWNlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgdmFyIHVzZXJNYXAgPSB2Mi51c2VyTWFwOworCisgICAgICAgICAgICAgICAgdHJhY2UoInsiKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrMyBpbiB1c2VyTWFwLmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoazMgKyAiID0+ICIgKyB1c2VyTWFwLmdldChrMykgKyAiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFjZSgibnVsbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICB2YXIgeHRydWN0cyA9IHYyLnh0cnVjdHM7CisKKyAgICAgICAgICAgICAgICB0cmFjZSgieyIpOworICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoIntcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB4LmJ5dGVfdGhpbmcgKyAiLCAiICsgeC5pMzJfdGhpbmcgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHguaTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJudWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNlKCJ9Iik7CisKKyAgICAgICAgICAgICAgICB0cmFjZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZSgifSwgIik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0iKTsKKworCisJCS8qKgorCQkqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworCQkqCisJCSogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisJCSogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorCQkqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKwkJKiAgICAgICAgICB9LAorCQkqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKwkJKiAgIH0KKwkJKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKwkJKi8KKwkJCisgICAgICAgIHZhciBmaXJzdF9tYXAgPSB3aG9hLmdldChJbnQ2NC5tYWtlKDAsMSkpOworICAgICAgICB2YXIgc2Vjb25kX21hcCA9IHdob2EuZ2V0KEludDY0Lm1ha2UoMCwyKSk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAoZmlyc3RfbWFwICE9IG51bGwpICYmIChzZWNvbmRfbWFwICE9IG51bGwpLCAiKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSIpOworICAgICAgICBpZiAoKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNyYXp5MiA9IGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pOworICAgICAgICAgICAgdmFyIGNyYXp5MyA9IGZpcnN0X21hcC5nZXQoTnVtYmVyei5USFJFRSk7CisgICAgICAgICAgICB2YXIgbG9vbmV5ID0gc2Vjb25kX21hcC5nZXQoTnVtYmVyei5TSVgpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIChjcmF6eTIgIT0gbnVsbCkgJiYgKGNyYXp5MyAhPSBudWxsKSAmJiAobG9vbmV5ICE9IG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIihjcmF6eTIgIT0gbnVsbCkgJiYgKGNyYXp5MyAhPSBudWxsKSAmJiAobG9vbmV5ICE9IG51bGwpIik7CisKKyAgICAgICAgICAgIHZhciBjcnoyaXRlciA9IGNyYXp5Mi54dHJ1Y3RzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB2YXIgY3J6M2l0ZXIgPSBjcmF6eTMueHRydWN0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCksICJjcnoyaXRlci5oYXNOZXh0KCkgJiYgY3J6M2l0ZXIuaGFzTmV4dCgpIik7CisgICAgICAgICAgICB2YXIgZ29vZGJ5ZTIgPSBjcnoyaXRlci5uZXh0KCk7CisgICAgICAgICAgICB2YXIgZ29vZGJ5ZTMgPSBjcnozaXRlci5uZXh0KCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggISAoY3J6Mml0ZXIuaGFzTmV4dCgpIHx8IGNyejNpdGVyLmhhc05leHQoKSksICIhIChjcnoyaXRlci5oYXNOZXh0KCkgfHwgY3J6M2l0ZXIuaGFzTmV4dCgpKSIpOworCisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkyLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIGluc2FuZS51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpKSA9PSAwLCAiY3JhenkyLnVzZXJNYXBbNV0gPT0gaW5zYW5lLnVzZXJNYXBbNV0iKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nLCAidHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUyLnN0cmluZ190aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUyLmJ5dGVfdGhpbmcsICJ0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMi5ieXRlX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMi5pMzJfdGhpbmcsICJ0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUyLmkzMl90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHRydWNrLmk2NF90aGluZywgZ29vZGJ5ZTIuaTY0X3RoaW5nKSA9PSAwLCAidHJ1Y2suaTY0X3RoaW5nICA9PSBnb29kYnllMi5pNjRfdGhpbmciKTsKKworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5My51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpLCBpbnNhbmUudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSkgPT0gMCwgImNyYXp5My51c2VyTWFwWzVdID09IGluc2FuZS51c2VyTWFwWzVdIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUzLnN0cmluZ190aGluZywgInRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMy5zdHJpbmdfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMy5ieXRlX3RoaW5nLCAidHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTMuYnl0ZV90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTMuaTMyX3RoaW5nLCAidHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMy5pMzJfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCB0cnVjay5pNjRfdGhpbmcsIGdvb2RieWUzLmk2NF90aGluZykgPT0gMCwgInRydWNrLmk2NF90aGluZyAgPT0gZ29vZGJ5ZTMuaTY0X3RoaW5nIik7CisJCQkKKwkJCXJzbHQuRXhwZWN0KCAhIGxvb25leS5pc1NldCgxKSwgIiEgbG9vbmV5LmlzU2V0KDEpIik7CisJCQlyc2x0LkV4cGVjdCggISBsb29uZXkuaXNTZXQoMiksICIhIGxvb25leS5pc1NldCgyKSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGFyZzAgPSAxOworICAgICAgICB2YXIgYXJnMSA9IDI7CisgICAgICAgIHZhciBhcmcyID0gSW50NjQubWFrZSggMHg3RkZGRkZGRiwweEZGRkZGRkZGKTsKKyAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBJbnRNYXA8IFN0cmluZz4oKTsKKyAgICAgICAgbXVsdGlEaWN0LnNldCgxLCAib25lIik7CisgICAgICAgIHZhciBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICB2YXIgYXJnNSA9IEludDY0Lm1ha2UoMCw1MDAwMDAwKTsKKyAgICAgICAgdHJhY2UoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgdmFyIG11bHRpUmVzcG9uc2UgPSBjbGllbnQudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSk7CisgICAgICAgIHRyYWNlKCIgPSBYdHJ1Y3QoYnl0ZV90aGluZzoiICsgbXVsdGlSZXNwb25zZS5ieXRlX3RoaW5nICsgIixzdHJpbmdfdGhpbmc6IiArIG11bHRpUmVzcG9uc2Uuc3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuaTMyX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICsgIixpNjRfdGhpbmc6IiArIEludDY0LnRvU3RyKG11bHRpUmVzcG9uc2UuaTY0X3RoaW5nKSArICIpIik7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG11bHRpUmVzcG9uc2Uuc3RyaW5nX3RoaW5nID09ICJIZWxsbzIiLCAnbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG11bHRpUmVzcG9uc2UuYnl0ZV90aGluZyA9PSBhcmcwLCAnbXVsdGlSZXNwb25zZS5CeXRlX3RoaW5nID09IGFyZzAnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG11bHRpUmVzcG9uc2UuaTMyX3RoaW5nID09IGFyZzEsICdtdWx0aVJlc3BvbnNlLkkzMl90aGluZyA9PSBhcmcxJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBtdWx0aVJlc3BvbnNlLmk2NF90aGluZywgYXJnMikgPT0gMCwgJ211bHRpUmVzcG9uc2UuSTY0X3RoaW5nID09IGFyZzInKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIDApOworCisgICAgICAgIHRyYWNlKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICBjbGllbnQudGVzdE9uZXdheSgxKTsKKworICAgICAgICBpZiggISBhcmdzLnNraXBTcGVlZFRlc3QpIHsKKyAgICAgICAgICAgIHRyYWNlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciBkaWZmdCA9IFRpbWVyLnN0YW1wKCk7CisgICAgICAgICAgICBmb3IgKCBrIGluIDAgLi4uIDEwMDApIHsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZmZ0ID0gTWF0aC5yb3VuZCggMTAwMCAqIChUaW1lci5zdGFtcCgpIC0gZGlmZnQpKSAvIDEwMDA7CisgICAgICAgICAgICB0cmFjZSgnJGRpZmZ0IG1zIHBlciB0ZXN0Vm9pZCgpIGNhbGwnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdE1hY3JvLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0TWFjcm8uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMDc2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdE1hY3JvLmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSA7CisKK2ltcG9ydCBoYXhlLm1hY3JvLkNvbnRleHQ7CitpbXBvcnQgaGF4ZS5tYWNyby5FeHByOworCisvKioqKgorICogSWYgeW91IGNhbGwgdGhlIFRocmlmdCBjb21waWxlciB0aGlzIHdheSAoZS5nLiBieSBjaGFuZ2luZyB0aGUgcHJlYnVpbGQgY29tbWFuZCkKKyAqCisgKiAgICAgdGhyaWZ0IC1yIC1nZW4gaGF4ZTpidWlsZG1hY3JvPVRlc3RNYWNyby5oYW5kbGUoKSAgIC4uL1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogdGhlIFRlc3RNYWNyby5oYW5kbGUoKSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBiZWxvdyBpcyBjYWxsZWQgZm9yIGVhY2ggZ2VuZXJhdGVkIGNsYXNzCisgKiBhbmQgaW50ZXJmYWNlLiBVc2UgInRocmlmdCAtLWhlbHAiIHRvIGdldCBtb3JlIGluZm8gYWJvdXQgb3RoZXIgYXZhaWxhYmxlIG9wdGlvbnMuCisgKi8KK2NsYXNzIFRlc3RNYWNybworeworICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZSggKSA6IEFycmF5PCBGaWVsZD4geworICAgIHRyYWNlKCdUZXN0TWFjcm8gY2FsbGVkIGZvciAnICsgQ29udGV4dC5nZXRMb2NhbFR5cGUoKSk7CisgICAgcmV0dXJuIENvbnRleHQuZ2V0QnVpbGRGaWVsZHMoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwYzhmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlci5oeApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworY2xhc3MgVGVzdFNlcnZlcgoreworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhlY3V0ZShhcmdzIDogQXJndW1lbnRzKSA6ICBWb2lkCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2goIGFyZ3MudHJhbnNwb3J0KSB7CisgICAgICAgICAgICBjYXNlIHNvY2tldDoKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBzb2NrZXQgcG9ydCAiK2FyZ3MucG9ydCk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIGFyZ3MucG9ydCk7CisgICAgICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gaHR0cCIpOworICAgICAgICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7CisgICAgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwU2VydmVyKCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9ICAgIG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFN0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgICAgIHZhciB0cmFuc2ZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGFyZ3MuZnJhbWVkKSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBhcmdzLmJ1ZmZlcmVkKSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgdHJhbnNmYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgICAgIHZhciBwcm90ZmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoKCBhcmdzLnByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgICAgIHRyYWNlKCItIGpzb24gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICBwcm90ZmFjdG9yeSA9IG5ldyBUSlNPTlByb3RvY29sRmFjdG9yeSgpOworICAgICAgICAgICAgY2FzZSBjb21wYWN0OgorICAgICAgICAgICAgICAgIHRyYWNlKCItIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICBwcm90ZmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgVGVzdFNlcnZlckhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdFByb2Nlc3NvcihoYW5kbGVyKTsKKworICAgICAgICAgICAgLy8gU2ltcGxlIFNlcnZlcgorICAgICAgICAgICAgdmFyIHNlcnZlciA6IFRTZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoKCBhcmdzLnNlcnZlcnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHNpbXBsZToKKyAgICAgICAgICAgICAgICB2YXIgc2ltcGxlU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgc2ltcGxlU2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBzaW1wbGVTZXJ2ZXI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCBzZXJ2ZXIgdHlwZSI7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIC8vIFNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAgICAgICBpZiggYXJncy5zZXJ2ZXJFdmVudHMpIHsKKyAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gbmV3IFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisgICAgICAgICAgICAgICAgaGFuZGxlci5zZXJ2ZXIgPSBzZXJ2ZXJFbmdpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgICAgICAgdHJhY2UoImRvbmUuIik7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoeCA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCckeCAke3guZXJyb3JJRH0gJHt4LmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICh4IDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJyR4Jyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJFdmVudEhhbmRsZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJFdmVudEhhbmRsZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NTY3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckV2ZW50SGFuZGxlci5oeApAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgoreworICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICBwdWJsaWMgdm9pZCBwcmVTZXJ2ZSgpCisgICAgeworICAgICAgICBjYWxsQ291bnQrKzsKKyAgICB9CisgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgIHsKKyAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICB7CisgICAgICAgIGNhbGxDb3VudCsrOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICB7CisgICAgICAgIGNhbGxDb3VudCsrOworICAgIH0KK30KKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTI1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4CkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7CisKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKK2ltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDsKK2ltcG9ydCBoYXhlLmRzLk9iamVjdE1hcDsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFRlc3RTZXJ2ZXJIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdCB7CisKKyAgICBwdWJsaWMgdmFyIHNlcnZlcjpUU2VydmVyOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZCgpOlZvaWQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0Vm9pZCgpIik7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RCb29sKCIlcyIpJyB3aGVyZSAnJXMnIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKyAgICAqIEBwYXJhbSBib29sICB0aGluZyAtIHRoZSBib29sIGRhdGEgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qm9vbCh0aGluZyA6IEJvb2wpIDogQm9vbAorICAgIHsKKyAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR0aGluZyknKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0U3RyaW5nKCIlcyIpJyB3aXRoIHRoaW5nIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisgICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZyh0aGluZzpTdHJpbmcpOlN0cmluZworICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RzdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgYnl0ZSB0byBwcmludAorICAgICogQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGUodGhpbmc6aGF4ZS5JbnQzMik6aGF4ZS5JbnQzMgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RCeXRlKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEkzMigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAorICAgICogQHJldHVybiBpMzIgLSByZXR1cm5zIHRoZSBpMzIgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzIodGhpbmc6aGF4ZS5JbnQzMik6aGF4ZS5JbnQzMgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RJMzIoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0STY0KCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICAqIEBwYXJhbSBpNjQgdGhpbmcgLSB0aGUgaTY0IHRvIHByaW50CisgICAgKiBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NCh0aGluZzpoYXhlLkludDY0KTpoYXhlLkludDY0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdEk2NCgiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3REb3VibGUoIiVmIiknIHdpdGggdGhpbmcgYXMgJyVmJworICAgICogQHBhcmFtIGRvdWJsZSB0aGluZyAtIHRoZSBkb3VibGUgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gZG91YmxlIC0gcmV0dXJucyB0aGUgZG91YmxlICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlKHRoaW5nOkZsb2F0KTpGbG9hdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3REb3VibGUoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyAndGVzdEJpbmFyeSgiJXMiKScgd2hlcmUgJyVzJyBpcyBhIGhleC1mb3JtYXR0ZWQgc3RyaW5nIG9mIHRoaW5nJ3MgZGF0YQorICAgICAqIEBwYXJhbSBiaW5hcnkgIHRoaW5nIC0gdGhlIGJpbmFyeSBkYXRhIHRvIHByaW50CisgICAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGluZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5KHRoaW5nIDogaGF4ZS5pby5CeXRlcykgOiBoYXhlLmlvLkJ5dGVzCisgICAgeworICAgICAgICB2YXIgaGV4ID0gIiI7CisgICAgICAgIGZvciAoIGkgaW4gMCAuLi4gdGhpbmcubGVuZ3RoKSB7CisgICAgICAgICAgICBoZXggKz0gU3RyaW5nVG9vbHMuaGV4KCB0aGluZy5nZXQoaSksIDIpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCd0ZXN0QmluYXJ5KCRoZXgpJyk7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMKKyAgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisgICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgdGhlIFh0cnVjdCAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdCh0aGluZzpYdHJ1Y3QpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RTdHJ1Y3QoeyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIodGhpbmcuaTY0X3RoaW5nKSArICJ9KSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3ROZXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKKyAgICAqIEBwYXJhbSBYdHJ1Y3QyIHRoaW5nIC0gdGhlIFh0cnVjdDIgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gWHRydWN0MiAtIHJldHVybnMgdGhlIFh0cnVjdDIgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0KG5lc3Q6WHRydWN0Mik6WHRydWN0MgorICAgIHsKKyAgICAgICAgdmFyIHRoaW5nOlh0cnVjdCA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgICAgICB0cmFjZSgidGVzdE5lc3QoeyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmJ5dGVfdGhpbmcgKyAiLCB7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5ieXRlX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQ2NC50b1N0cih0aGluZy5pNjRfdGhpbmcpICsgIn0sICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmkzMl90aGluZyArICJ9KSIpOworICAgICAgICByZXR1cm4gbmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdE1hcCgieyVzIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisgICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAgKiBAcGFyYW0gbWFwPGkzMixpMzI+IHRoaW5nIC0gdGhlIG1hcDxpMzIsaTMyPiB0byBwcmludAorICAgICogQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXAodGhpbmc6SW50TWFwPGhheGUuSW50MzI+KTpJbnRNYXA8aGF4ZS5JbnQzMj4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TWFwKHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGtleSBpbiB0aGluZy5rZXlzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4gIiArIHRoaW5nLmdldChrZXkpKTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2UoIn0pIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgICogQHBhcmFtIG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyAtIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwKHRoaW5nOlN0cmluZ01hcDxTdHJpbmc+KTpTdHJpbmdNYXA8U3RyaW5nPgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RTdHJpbmdNYXAoeyIpOworICAgICAgICB2YXIgZmlyc3Q6Qm9vbCA9IHRydWU7CisgICAgICAgIGZvciAoa2V5IGluIHRoaW5nLmtleXMoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiAiICsgdGhpbmcuZ2V0KGtleSkpOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0U2V0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgICogQHBhcmFtIHNldDxpMzI+IHRoaW5nIC0gdGhlIHNldDxpMzI+IHRvIHByaW50CisgICAgKiBAcmV0dXJuIHNldDxpMzI+IC0gcmV0dXJucyB0aGUgc2V0PGkzMj4gJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXQodGhpbmc6SW50U2V0KTpJbnRTZXQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGVsZW0gaW4gdGhpbmcpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGVsZW0pOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TGlzdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKyAgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICAqIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisgICAgKiBAcmV0dXJuIGxpc3Q8aTMyPiAtIHJldHVybnMgdGhlIGxpc3Q8aTMyPiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3QodGhpbmc6TGlzdDxoYXhlLkludDMyPik6TGlzdDxoYXhlLkludDMyPgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGVsZW0gaW4gdGhpbmcpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGVsZW0pOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0RW51bSgiJWQiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gaXQncyBudW1lcmljIHZhbHVlCisgICAgKiBAcGFyYW0gTnVtYmVyeiB0aGluZyAtIHRoZSBOdW1iZXJ6IHRvIHByaW50CisgICAgKiBAcmV0dXJuIE51bWJlcnogLSByZXR1cm5zIHRoZSBOdW1iZXJ6ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bSh0aGluZzpJbnQpOkludAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFR5cGVkZWYoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgICogQHBhcmFtIFVzZXJJZCB0aGluZyAtIHRoZSBVc2VySWQgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gVXNlcklkIC0gcmV0dXJucyB0aGUgVXNlcklkICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZih0aGluZzpoYXhlLkludDY0KTpoYXhlLkludDY0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TWFwTWFwKCIlZCIpJyB3aXRoIGhlbGxvIGFzICclZCcKKyAgICAqIEBwYXJhbSBpMzIgaGVsbG8gLSB0aGUgaTMyIHRvIHByaW50CisgICAgKiBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgICogICB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LAorICAgICogICAgIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgICoKKyAgICAqIEBwYXJhbSBoZWxsbworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXAoaGVsbG86aGF4ZS5JbnQzMik6SW50TWFwPEludE1hcDxoYXhlLkludDMyPj4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpIik7CisgICAgICAgIHZhciBtYXBtYXAgPSBuZXcgSW50TWFwPEludE1hcDxJbnQ+PigpOworICAgICAgICB2YXIgcG9zID0gbmV3IEludE1hcDxJbnQ+KCk7CisgICAgICAgIHZhciBuZWcgPSBuZXcgSW50TWFwPEludD4oKTsKKyAgICAgICAgZm9yIChpIGluIDEgLi4uIDUpIHsKKyAgICAgICAgICAgIHBvcy5zZXQoaSwgaSk7CisgICAgICAgICAgICBuZWcuc2V0KC1pLCAtaSk7CisgICAgICAgIH07CisgICAgICAgIG1hcG1hcC5zZXQoNCwgcG9zKTsKKyAgICAgICAgbWFwbWFwLnNldCgtNCwgbmVnKTsKKyAgICAgICAgcmV0dXJuIG1hcG1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgICoKKyAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgICogICAgICAgICAgfSwKKyAgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAqICAgfQorICAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgKgorICAgICogQHBhcmFtIGFyZ3VtZW50CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5KGFyZ3VtZW50IDogSW5zYW5pdHkpIDogSW50NjRNYXA8IEludE1hcDwgSW5zYW5pdHk+PgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgdmFyIGZpcnN0X21hcCA9IG5ldyBJbnRNYXA8IEluc2FuaXR5PigpOworICAgICAgICBmaXJzdF9tYXAuc2V0KE51bWJlcnouVFdPLCBhcmd1bWVudCk7CisgICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5USFJFRSwgYXJndW1lbnQpOworCisgICAgICAgIHZhciBzZWNvbmRfbWFwID0gbmV3IEludE1hcDwgSW5zYW5pdHk+KCk7CisgICAgICAgIHZhciBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICAgICAgc2Vjb25kX21hcC5zZXQoTnVtYmVyei5TSVgsIGxvb25leSk7CisKKyAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnQ2NE1hcDwgSW50TWFwPCBJbnNhbml0eT4+KCk7CisgICAgICAgIGluc2FuZS5zZXQoIEludDY0Lm1ha2UoMCwxKSwgZmlyc3RfbWFwKTsKKyAgICAgICAgaW5zYW5lLnNldCggSW50NjQubWFrZSgwLDIpLCBzZWNvbmRfbWFwKTsKKworICAgICAgICByZXR1cm4gaW5zYW5lOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TXVsdGkoKScKKyAgICAqIEBwYXJhbSBieXRlIGFyZzAgLQorICAgICogQHBhcmFtIGkzMiBhcmcxIC0KKyAgICAqIEBwYXJhbSBpNjQgYXJnMiAtCisgICAgKiBAcGFyYW0gbWFwPGkxNiwgc3RyaW5nPiBhcmczIC0KKyAgICAqIEBwYXJhbSBOdW1iZXJ6IGFyZzQgLQorICAgICogQHBhcmFtIFVzZXJJZCBhcmc1IC0KKyAgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyBhbiBYdHJ1Y3QKKyAgICAqICAgIHdpdGggc3RyaW5nX3RoaW5nID0gIkhlbGxvMiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEKKyAgICAqICAgIGFuZCBpNjRfdGhpbmcgPSBhcmcyCisgICAgKgorICAgICogQHBhcmFtIGFyZzAKKyAgICAqIEBwYXJhbSBhcmcxCisgICAgKiBAcGFyYW0gYXJnMgorICAgICogQHBhcmFtIGFyZzMKKyAgICAqIEBwYXJhbSBhcmc0CisgICAgKiBAcGFyYW0gYXJnNQorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNdWx0aShhcmcwOmhheGUuSW50MzIsIGFyZzE6aGF4ZS5JbnQzMiwgYXJnMjpoYXhlLkludDY0LAorICAgICAgICBhcmczOkludE1hcDxTdHJpbmc+LCBhcmc0OkludCwgYXJnNTpoYXhlLkludDY0KTpYdHJ1Y3QKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TXVsdGkoKSIpOworICAgICAgICB2YXIgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgcmV0dXJuIGhlbGxvOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICogaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgKgorICAgICogQHBhcmFtIGFyZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFeGNlcHRpb24oYXJnOlN0cmluZyk6Vm9pZAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RFeGNlcHRpb24oIiArIGFyZyArICIpIik7CisgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH07CisgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgICAgICB9OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludCAndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknIHdpdGggYXJnMCBhcyAnJXMnIGFuZCBhcmcxIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAgKiBpZiBhcmcwID09ICJYY2VwdGlvbiIKKyAgICAqIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICogZWxzZSBpZiBhcmcwID09ICJYY2VwdGlvbjIiCisgICAgKiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAqIEByZXR1cm4gWHRydWN0IC0gYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQorICAgICoKKyAgICAqIEBwYXJhbSBhcmcwCisgICAgKiBAcGFyYW0gYXJnMQorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwOlN0cmluZywgYXJnMTpTdHJpbmcpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIikiKTsKKyAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICB4LnN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIHguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9OworICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50ICd0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi4nIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworICAgICogc2xlZXAgJ3NlY29uZHNUb1NsZWVwJworICAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTMyIHNlY29uZHNUb1NsZWVwIC0gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwCisgICAgKgorICAgICogQHBhcmFtIHNlY29uZHNUb1NsZWVwCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDpoYXhlLkludDMyKTpWb2lkCisgICAgeworICAgICAgICB0cmFjZSgidGVzdE9uZXdheSgiICsgc2Vjb25kc1RvU2xlZXAgKyAiKSwgc2xlZXBpbmcuLi4iKTsKKyAgICAgICAgU3lzLnNsZWVwKHNlY29uZHNUb1NsZWVwKTsKKyAgICAgICAgdHJhY2UoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0b3AoKTpWb2lkCisgICAgeworICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjYTNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoaHNfdGVzdF9nZW4KKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0NvbnN0YW50c0RlbW9fQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Db25zdGFudHNEZW1vX1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9EZWJ1Z1Byb3RvVGVzdF9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0RlYnVnUHJvdG9UZXN0X1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5jbHVkZV9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luY2x1ZGVfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnZfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnYuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydl9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YV9JZmFjZS5ocworKQorCitzZXQoaHNfY3Jvc3N0ZXN0X2FwcHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVGVzdFNlcnZlcgorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9UZXN0Q2xpZW50CispCitzZXQoaHNfY3Jvc3N0ZXN0X2FyZ3MKKyAgICAtaWdlbi1ocworICAgIC1vZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgIC1oaWRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKykKKworaWYgKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgc2V0KGhzX29wdGltaXplIC1PMCkKK2Vsc2UoKQorICBzZXQoaHNfb3B0aW1pemUgLU8xKQorZW5kaWYoKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7aHNfY3Jvc3N0ZXN0X2FwcHN9CisgICAgQ09NTUFORCAke0dIQ30gJHtoc19vcHRpbWl6ZX0gJHtoc19jcm9zc3Rlc3RfYXJnc30gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1Rlc3RTZXJ2ZXIuaHMgLW8gVGVzdFNlcnZlcgorICAgIENPTU1BTkQgJHtHSEN9ICR7aHNfb3B0aW1pemV9ICR7aHNfY3Jvc3N0ZXN0X2FyZ3N9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9UZXN0Q2xpZW50LmhzIC1vIFRlc3RDbGllbnQKKyAgICBERVBFTkRTICR7aHNfdGVzdF9nZW59IGhhc2tlbGxfbGlicmFyeSBUZXN0U2VydmVyLmhzIFRlc3RDbGllbnQuaHMKKykKK2FkZF9jdXN0b21fdGFyZ2V0KGhhc2tlbGxfY3Jvc3N0ZXN0IEFMTAorICAgIENPTU1FTlQgIkJ1aWxkaW5nIEhhc2tlbGwgY3Jvc3MgdGVzdCBleGVjdXRhYmxlcyIKKyAgICBERVBFTkRTICR7aHNfY3Jvc3N0ZXN0X2FwcHN9CispCisKK3NldChoc190ZXN0X3NvdXJjZXMKKyAgICBDb25zdGFudHNEZW1vX01haW4uaHMKKyAgICBEZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCisgICAgSW5jbHVkZV9NYWluLmhzCisgICAgVGhyaWZ0VGVzdF9NYWluLmhzCispCitzZXQoaHNfdGVzdF9hcmdzCisgICAgLVdhbGwKKyAgICAtWFNjb3BlZFR5cGVWYXJpYWJsZXMKKyAgICAtaSR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvaHMvc3JjCisgICAgLWkke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzCispCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX3Rlc3RzIEFMTCBERVBFTkRTICR7aHNfdGVzdF9nZW59KQorZm9yZWFjaChTUkMgJHtoc190ZXN0X3NvdXJjZXN9KQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQkFTRSAke1NSQ30gTkFNRV9XRSkKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxUZXN0cy0ke0JBU0V9CisgICAgICAgIENPTU1BTkQgJHtSVU5fSEFTS0VMTH0gJHtoc190ZXN0X2FyZ3N9ICR7U1JDfQorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitlbmRmb3JlYWNoKCkKKworc2V0KGhzX3Rlc3RfZ2VuX3NvdXJjZXMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvSW5jbHVkZS50aHJpZnQKKykKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtoc190ZXN0X2dlbn0KKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvSW5jbHVkZS50aHJpZnQKKyAgICBERVBFTkRTICR7aHNfdGVzdF9nZW5fc291cmNlc30KKykKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvQ2xpZW50LmhzIGIvdGVzdC9ocy9DbGllbnQuaHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdC9ocy9DbGllbnQuaHMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzIGIvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCmluZGV4IDgxNmVlZTMuLmZiMjg5NjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocworKysgYi90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMKQEAgLTE3LDEyICsxNywxNiBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKIG1vZHVsZSBNYWluIHdoZXJlCiAKIAogaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbgogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBEQkwKLWltcG9ydCBxdWFsaWZpZWQgTWF5YmUKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKIGltcG9ydCBxdWFsaWZpZWQgTmV0d29yawogCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQpAQCAtNTksNjEgKzYzLDYxIEBACiAgICAgc3RydWN0TWV0aG9kIF8gPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICJHb3Qgc3RydWN0TWV0aG9kIGNhbGwiCiAgICAgICAgIHJldHVybiAkIFR5cGVzLkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYnl0ZSA9IEp1c3QgMHgwMSwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2kxNiA9IEp1c3QgMHgwMiwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2kzMiA9IEp1c3QgMHgwMywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2k2NCA9IEp1c3QgMHgwNCwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2RvdWJsZSA9IEp1c3QgMC4xLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2Ffc3RyaW5nID0gSnVzdCAiYWJjZGVmIiwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2JpbmFyeSA9IEp1c3QgREJMLmVtcHR5LAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3RydWVfZmllbGQgPSBKdXN0IFRydWUsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZmFsc2VfZmllbGQgPSBKdXN0IEZhbHNlLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2VtcHR5X3N0cnVjdF9maWVsZCA9IEp1c3QgVHlwZXMuRW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYnl0ZSA9IDB4MDEsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTE2ID0gMHgwMiwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9pMzIgPSAweDAzLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2k2NCA9IDB4MDQsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfZG91YmxlID0gMC4xLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX3N0cmluZyA9ICJhYmNkZWYiLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2JpbmFyeSA9IERCTC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfdHJ1ZV9maWVsZCA9IFRydWUsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2ZhbHNlX2ZpZWxkID0gRmFsc2UsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2VtcHR5X3N0cnVjdF9maWVsZCA9IFR5cGVzLkVtcHR5LAogICAgICAgICAgICAgCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMTZfbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9kb3VibGVfbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ib29sZWFuX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9saXN0ID0gSnVzdCBbVHlwZXMuRW1wdHldLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RydWN0X2xpc3QgPSBWZWN0b3IuZW1wdHksCiAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBTZXQuZW1wdHksCiAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMTZfYnl0ZV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2kzMl9ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9kb3VibGVfYnl0ZV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cmluZ19ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ib29sZWFuX2J5dGVfbWFwID0gTm90aGluZywKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9ieXRlX21hcCA9IE1hcC5lbXB0eSwKIAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTE2X21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pMzJfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2k2NF9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfZG91YmxlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zdHJpbmdfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2JpbmFyeV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfYm9vbGVhbl9tYXAgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2kxNl9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTMyX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pNjRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2RvdWJsZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfc3RyaW5nX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9iaW5hcnlfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2Jvb2xlYW5fbWFwID0gTWFwLmVtcHR5LAogCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfbGlzdF9ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc2V0X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9tYXBfYnl0ZV9tYXAgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9saXN0X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zZXRfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X21hcF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKIAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTm90aGluZyB9CisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTWFwLmVtcHR5IH0KIAogICAgIG1ldGhvZFdpdGhEZWZhdWx0QXJncyBfIGFyZyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IG1ldGhvZFdpdGhEZWZhdWx0QXJnczogIiArKyBzaG93IGFyZwpAQCAtMTI1LDcgKzEyOSw3IEBACiBpbnN0YW5jZSBJSWZhY2UuSW5oZXJpdGVkX0lmYWNlIEluaGVyaXRlZEhhbmRsZXIgd2hlcmUKICAgICBpZGVudGl0eSBfIGFyZyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IGlkZW50aXR5IG1ldGhvZDogIiArKyBzaG93IGFyZwotICAgICAgICByZXR1cm4gJCBNYXliZS5mcm9tSnVzdCBhcmcKKyAgICAgICAgcmV0dXJuIGFyZwogCiBjbGllbnQgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCiBjbGllbnQgYWRkciA9IGRvCmRpZmYgLS1naXQgYS90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocyBiL3Rlc3QvaHMvSW5jbHVkZV9NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTc3YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocwpAQCAtMCwwICsxLDcgQEAKK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBJbmNsdWRlX1R5cGVzCitpbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcworCittYWluIDo6IElPICgpCittYWluID0gcHV0U3RyTG4gKCJJbmNsdWRlcyB3b3JrOiAiICsrIChzaG93IChJbmNsdWRlVGVzdCAkIEJvb2xzIFRydWUgRmFsc2UpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0gYi90ZXN0L2hzL01ha2VmaWxlLmFtCmluZGV4IGQ2ZDhmZjQuLjE3NDg5MDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9ocy9NYWtlZmlsZS5hbQpAQCAtMTcsMTQgKzE3LDI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotc3R1YnM6IC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdAorc3R1YnM6ICQoVEhSSUZUKSAuLi9Db25zdGFudHNEZW1vLnRocmlmdCAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vSW5jbHVkZS50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vQ29uc3RhbnRzRGVtby50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL0luY2x1ZGUudGhyaWZ0CiAKIGNoZWNrOiBzdHVicwogCXNoIHJ1bi10ZXN0LnNoIENvbnN0YW50c0RlbW8KIAlzaCBydW4tdGVzdC5zaCBEZWJ1Z1Byb3RvVGVzdAogCXNoIHJ1bi10ZXN0LnNoIFRocmlmdFRlc3QKKwlzaCBydW4tdGVzdC5zaCBJbmNsdWRlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1ocworCSQoUk0pICouaGkKKwkkKFJNKSAqLm8KKworYWxsLWxvY2FsOiBzdHVicworCWdoYyAtaWdlbi1ocyBUZXN0U2VydmVyLmhzCisJZ2hjIC1pZ2VuLWhzIFRlc3RDbGllbnQuaHMKKworcHJlY3Jvc3M6IGFsbC1sb2NhbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9TZXJ2ZXIuaHMgYi90ZXN0L2hzL1NlcnZlci5ocwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0L2hzL1NlcnZlci5ocworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0L2hzL1Rlc3RDbGllbnQuaHMgYi90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmYjU5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvVGVzdENsaWVudC5ocwpAQCAtMCwwICsxLDMwNiBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncywgUmVjb3JkV2lsZENhcmRzLCBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorbW9kdWxlIE1haW4gd2hlcmUKKworaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCitpbXBvcnQgQ29udHJvbC5Nb25hZAoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuTGlzdC5TcGxpdAoraW1wb3J0IERhdGEuU3RyaW5nCitpbXBvcnQgTmV0d29yaworaW1wb3J0IE5ldHdvcmsuVVJJCitpbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CitpbXBvcnQgU3lzdGVtLkV4aXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCitpbXBvcnQgcXVhbGlmaWVkIFN5c3RlbS5JTyBhcyBJTworCitpbXBvcnQgVGhyaWZ0VGVzdF9JZmFjZQoraW1wb3J0IFRocmlmdFRlc3RfVHlwZXMKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdF9DbGllbnQgYXMgQ2xpZW50CisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgorCitkYXRhIE9wdGlvbnMgPSBPcHRpb25zCisgIHsgaG9zdCAgICAgICAgIDo6IFN0cmluZworICAsIHBvcnQgICAgICAgICA6OiBJbnQKKyAgLCBkb21haW5Tb2NrZXQgOjogU3RyaW5nCisgICwgdHJhbnNwb3J0ICAgIDo6IFN0cmluZworICAsIHByb3RvY29sICAgICA6OiBQcm90b2NvbFR5cGUKKyAgLS0gVE9ETzogSGFza2VsbCBsaWIgZG9lcyBub3QgaGF2ZSBTU0wgc3VwcG9ydAorICAsIHNzbCAgICAgICAgICA6OiBCb29sCisgICwgdGVzdExvb3BzICAgIDo6IEludAorICB9CisgIGRlcml2aW5nIChTaG93LCBFcSkKKworZGF0YSBUcmFuc3BvcnRUeXBlID0gQnVmZmVyZWQgSU8uSGFuZGxlCisgICAgICAgICAgICAgICAgICAgfCBGcmFtZWQgKEZyYW1lZFRyYW5zcG9ydCBJTy5IYW5kbGUpCisgICAgICAgICAgICAgICAgICAgfCBIdHRwIEh0dHBDbGllbnQKKyAgICAgICAgICAgICAgICAgICB8IE5vVHJhbnNwb3J0IFN0cmluZworCitnZXRUcmFuc3BvcnQgOjogU3RyaW5nIC0+IFN0cmluZyAtPiBJbnQgLT4gKElPIFRyYW5zcG9ydFR5cGUpCitnZXRUcmFuc3BvcnQgImJ1ZmZlcmVkIiBob3N0IHBvcnQgPSBkbworICBoIDwtIGhPcGVuIChob3N0LCBQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisgIElPLmhTZXRCdWZmZXJpbmcgaCAkIElPLkJsb2NrQnVmZmVyaW5nIE5vdGhpbmcKKyAgcmV0dXJuICQgQnVmZmVyZWQgaAorZ2V0VHJhbnNwb3J0ICJmcmFtZWQiIGhvc3QgcG9ydCA9IGRvCisgIGggPC0gaE9wZW4gKGhvc3QsIFBvcnROdW1iZXIgJCBmcm9tSW50ZWdyYWwgcG9ydCkKKyAgdCA8LSBvcGVuRnJhbWVkVHJhbnNwb3J0IGgKKyAgcmV0dXJuICQgRnJhbWVkIHQKK2dldFRyYW5zcG9ydCAiaHR0cCIgaG9zdCBwb3J0ID0gbGV0IHVyaVN0ciA9ICJodHRwOi8vIiArKyBob3N0ICsrICI6IiArKyBzaG93IHBvcnQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZVVSSSB1cmlTdHIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RoaW5nIC0+IGRvIHJldHVybiAoTm9UcmFuc3BvcnQgJCAiRmFpbGVkIHRvIHBhcnNlIFVSSTogIiArKyB1cmlTdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnVzdCh1cmkpIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IDwtIG9wZW5IdHRwQ2xpZW50IHVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQgSHR0cCB0CitnZXRUcmFuc3BvcnQgdCBob3N0IHBvcnQgPSBkbyByZXR1cm4gKE5vVHJhbnNwb3J0ICQgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydDogIiArKyB0KQorCitkYXRhIFByb3RvY29sVHlwZSA9IEJpbmFyeQorICAgICAgICAgICAgICAgICAgfCBDb21wYWN0CisgICAgICAgICAgICAgICAgICB8IEpTT04KKyAgICAgICAgICAgICAgICAgIHwgSGVhZGVyCisgICAgICAgICAgICAgICAgICBkZXJpdmluZyAoU2hvdywgRXEpCisKK2dldFByb3RvY29sIDo6IFN0cmluZyAtPiBQcm90b2NvbFR5cGUKK2dldFByb3RvY29sICJiaW5hcnkiICA9IEJpbmFyeQorZ2V0UHJvdG9jb2wgImNvbXBhY3QiID0gQ29tcGFjdAorZ2V0UHJvdG9jb2wgImpzb24iICAgID0gSlNPTgorZ2V0UHJvdG9jb2wgImhlYWRlciIgPSBIZWFkZXIKK2dldFByb3RvY29sIHAgPSBlcnJvciAkICJVbnN1cHBvcnRlZCBQcm90b2NvbDogIiArKyBwCisKK2RlZmF1bHRPcHRpb25zIDo6IE9wdGlvbnMKK2RlZmF1bHRPcHRpb25zID0gT3B0aW9ucworICB7IHBvcnQgICAgICAgICA9IDkwOTAKKyAgLCBkb21haW5Tb2NrZXQgPSAiIgorICAsIGhvc3QgICAgICAgICA9ICJsb2NhbGhvc3QiCisgICwgdHJhbnNwb3J0ICAgID0gImJ1ZmZlcmVkIgorICAsIHByb3RvY29sICAgICA9IEJpbmFyeQorICAsIHNzbCAgICAgICAgICA9IEZhbHNlCisgICwgdGVzdExvb3BzICAgID0gMQorICB9CisKK3J1bkNsaWVudCA6OiBQcm90b2NvbCBwID0+IHAgLT4gSU8gKCkKK3J1bkNsaWVudCBwID0gZG8KKyAgbGV0IHByb3QgPSAocCxwKQorICBwdXRTdHJMbiAiU3RhcnRpbmcgVGVzdHMiCisKKyAgLS0gVk9JRCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0Vm9pZCIKKyAgQ2xpZW50LnRlc3RWb2lkIHByb3QKKworICAtLSBTdHJpbmcgVGVzdAorICBwdXRTdHJMbiAidGVzdFN0cmluZyIKKyAgcyA8LSBDbGllbnQudGVzdFN0cmluZyBwcm90ICJUZXN0IgorICB3aGVuIChzIC89ICJUZXN0IikgZXhpdEZhaWx1cmUKKworICAtLSBCb29sIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCb29sIgorICBib29sIDwtIENsaWVudC50ZXN0Qm9vbCBwcm90IFRydWUKKyAgd2hlbiAobm90IGJvb2wpIGV4aXRGYWlsdXJlCisgIHB1dFN0ckxuICJ0ZXN0Qm9vbCIKKyAgYm9vbCA8LSBDbGllbnQudGVzdEJvb2wgcHJvdCBGYWxzZQorICB3aGVuIChib29sKSBleGl0RmFpbHVyZQorCisgIC0tIEJ5dGUgVGVzdAorICBwdXRTdHJMbiAidGVzdEJ5dGUiCisgIGJ5dGUgPC0gQ2xpZW50LnRlc3RCeXRlIHByb3QgMQorICB3aGVuIChieXRlIC89IDEpIGV4aXRGYWlsdXJlCisKKyAgLS0gSTMyIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RJMzIiCisgIGkzMiA8LSBDbGllbnQudGVzdEkzMiBwcm90ICgtMSkKKyAgd2hlbiAoaTMyIC89IC0xKSBleGl0RmFpbHVyZQorCisgIC0tIEk2NCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0STY0IgorICBpNjQgPC0gQ2xpZW50LnRlc3RJNjQgcHJvdCAoLTM0MzU5NzM4MzY4KQorICB3aGVuIChpNjQgLz0gLTM0MzU5NzM4MzY4KSBleGl0RmFpbHVyZQorCisgIC0tIERvdWJsZSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RG91YmxlIgorICBkdWIgPC0gQ2xpZW50LnRlc3REb3VibGUgcHJvdCAoLTUuMjA5ODUyMykKKyAgd2hlbiAoYWJzIChkdWIgKyA1LjIwOTg1MjMpID4gMC4wMDEpIGV4aXRGYWlsdXJlCisKKyAgLS0gQmluYXJ5IFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCaW5hcnkiCisgIGJpbiA8LSBDbGllbnQudGVzdEJpbmFyeSBwcm90IChMQlMucGFjayAuIHJldmVyc2UgJCBbLTEyOC4uMTI3XSkKKyAgd2hlbiAoKHJldmVyc2UgWy0xMjguLjEyN10pIC89IExCUy51bnBhY2sgYmluKSBleGl0RmFpbHVyZQorICAKKyAgLS0gU3RydWN0IFRlc3QKKyAgbGV0IHN0cnVjdEluID0gWHRydWN0eyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2J5dGVfdGhpbmcgICA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTMyX3RoaW5nICAgID0gLTMKKyAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTY0X3RoaW5nICAgID0gLTUKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICBwdXRTdHJMbiAidGVzdFN0cnVjdCIKKyAgc3RydWN0T3V0IDwtIENsaWVudC50ZXN0U3RydWN0IHByb3Qgc3RydWN0SW4KKyAgd2hlbiAoc3RydWN0SW4gLz0gc3RydWN0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIE5lc3RlZCBTdHJ1Y3QgVGVzdAorICBsZXQgbmVzdEluID0gWHRydWN0MnsgeHRydWN0Ml9ieXRlX3RoaW5nICAgPSAxCisgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3QyX3N0cnVjdF90aGluZyA9IHN0cnVjdEluCisgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3QyX2kzMl90aGluZyAgICA9IDUKKyAgICAgICAgICAgICAgICAgICAgICB9CisgIHB1dFN0ckxuICJ0ZXN0TmVzdCIKKyAgbmVzdE91dCA8LSBDbGllbnQudGVzdE5lc3QgcHJvdCBuZXN0SW4KKyAgd2hlbiAobmVzdEluIC89IG5lc3RPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gTWFwIFRlc3QKKyAgbGV0IG1hcEluID0gTWFwLmZyb21MaXN0ICQgbWFwIChcaSAtPiAoaSwgaS0xMCkpIFsxLi41XQorICBwdXRTdHJMbiAidGVzdE1hcCIKKyAgbWFwT3V0IDwtIENsaWVudC50ZXN0TWFwIHByb3QgbWFwSW4KKyAgd2hlbiAobWFwSW4gLz0gbWFwT3V0KSBleGl0RmFpbHVyZQorCisgIC0tIFNldCBUZXN0CisgIGxldCBzZXRJbiA9IFNldC5mcm9tTGlzdCBbLTIuLjNdCisgIHB1dFN0ckxuICJ0ZXN0U2V0IgorICBzZXRPdXQgPC0gQ2xpZW50LnRlc3RTZXQgcHJvdCBzZXRJbgorICB3aGVuIChzZXRJbiAvPSBzZXRPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gTGlzdCBUZXN0CisgIGxldCBsaXN0SW4gPSBWZWN0b3IuZnJvbUxpc3QgWy0yLi4zXQorICBwdXRTdHJMbiAidGVzdExpc3QiCisgIGxpc3RPdXQgPC0gQ2xpZW50LnRlc3RMaXN0IHByb3QgbGlzdEluCisgIHdoZW4gKGxpc3RJbiAvPSBsaXN0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIEVudW0gVGVzdAorICBwdXRTdHJMbiAidGVzdEVudW0iCisgIG51bXoxIDwtIENsaWVudC50ZXN0RW51bSBwcm90IE9ORQorICB3aGVuIChudW16MSAvPSBPTkUpIGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RFbnVtIgorICBudW16MiA8LSBDbGllbnQudGVzdEVudW0gcHJvdCBUV08KKyAgd2hlbiAobnVtejIgLz0gVFdPKSBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RW51bSIKKyAgbnVtejUgPC0gQ2xpZW50LnRlc3RFbnVtIHByb3QgRklWRQorICB3aGVuIChudW16NSAvPSBGSVZFKSBleGl0RmFpbHVyZQorCisgIC0tIFR5cGVkZWYgVGVzdAorICBwdXRTdHJMbiAidGVzdFR5cGVkZWYiCisgIHVpZCA8LSBDbGllbnQudGVzdFR5cGVkZWYgcHJvdCAzMDk4NTgyMzUwODI1MjMKKyAgd2hlbiAodWlkIC89IDMwOTg1ODIzNTA4MjUyMykgZXhpdEZhaWx1cmUKKworICAtLSBOZXN0ZWQgTWFwIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RNYXBNYXAiCisgIF8gPC0gQ2xpZW50LnRlc3RNYXBNYXAgcHJvdCAxCisKKyAgLS0gRXhjZXB0aW9uIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RFeGNlcHRpb24iCisgIGV4bjEgPC0gdHJ5ICQgQ2xpZW50LnRlc3RFeGNlcHRpb24gcHJvdCAiWGNlcHRpb24iCisgIGNhc2UgZXhuMSBvZgorICAgIExlZnQgKFhjZXB0aW9uIF8gXykgLT4gcmV0dXJuICgpCisgICAgXyAtPiBwdXRTdHJMbiAoc2hvdyBleG4xKSA+PiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgorICBleG4yIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgIlRFeGNlcHRpb24iCisgIGNhc2UgZXhuMiBvZgorICAgIExlZnQgKF8gOjogU29tZUV4Y2VwdGlvbikgLT4gcmV0dXJuICgpCisgICAgUmlnaHQgXyAtPiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgorICBleG4zIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgInN1Y2Nlc3MiCisgIGNhc2UgZXhuMyBvZgorICAgIExlZnQgKF8gOjogU29tZUV4Y2VwdGlvbikgLT4gZXhpdEZhaWx1cmUKKyAgICBSaWdodCBfIC0+IHJldHVybiAoKQorCisgIC0tIE11bHRpIEV4Y2VwdGlvbiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCisgIG11bHRpMSA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uIiAidGVzdCAxIgorICBjYXNlIG11bHRpMSBvZgorICAgIExlZnQgKFhjZXB0aW9uIF8gXykgLT4gcmV0dXJuICgpCisgICAgXyAtPiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCisgIG11bHRpMiA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uMiIgInRlc3QgMiIKKyAgY2FzZSBtdWx0aTIgb2YKKyAgICBMZWZ0IChYY2VwdGlvbjIgXyBfKSAtPiByZXR1cm4gKCkKKyAgICBfIC0+IGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RNdWx0aUV4Y2VwdGlvbiIKKyAgbXVsdGkzIDwtIHRyeSAkIENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24gcHJvdCAic3VjY2VzcyIgInRlc3QgMyIKKyAgY2FzZSBtdWx0aTMgb2YKKyAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IGV4aXRGYWlsdXJlCisgICAgUmlnaHQgXyAtPiByZXR1cm4gKCkKKworCittYWluIDo6IElPICgpCittYWluID0gZG8KKyAgb3B0aW9ucyA8LSBmbGlwIHBhcnNlRmxhZ3MgZGVmYXVsdE9wdGlvbnMgPCQ+IGdldEFyZ3MKKyAgY2FzZSBvcHRpb25zIG9mCisgICAgTm90aGluZyAtPiBzaG93SGVscAorICAgIEp1c3QgT3B0aW9uc3suLn0gLT4gZG8KKyAgICAgIHRyYW5zIDwtIE1haW4uZ2V0VHJhbnNwb3J0IHRyYW5zcG9ydCBob3N0IHBvcnQKKyAgICAgIGNhc2UgdHJhbnMgb2YKKyAgICAgICAgQnVmZmVyZWQgdCAtPiBydW5UZXN0IHRlc3RMb29wcyBwcm90b2NvbCB0CisgICAgICAgIEZyYW1lZCB0ICAgLT4gcnVuVGVzdCB0ZXN0TG9vcHMgcHJvdG9jb2wgdAorICAgICAgICBIdHRwIHQgICAgIC0+IHJ1blRlc3QgdGVzdExvb3BzIHByb3RvY29sIHQKKyAgICAgICAgTm9UcmFuc3BvcnQgZXJyIC0+IHB1dFN0ckxuIGVycgorICB3aGVyZQorICAgIG1ha2VDbGllbnQgcCB0ID0gY2FzZSBwIG9mCisgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeSAgLT4gcnVuQ2xpZW50ICQgQmluYXJ5UHJvdG9jb2wgdAorICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0IC0+IHJ1bkNsaWVudCAkIENvbXBhY3RQcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIEpTT04gICAgLT4gcnVuQ2xpZW50ICQgSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyICAtPiBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQgPj49IHJ1bkNsaWVudAorICAgIHJ1blRlc3QgbG9vcHMgcCB0ID0gZG8KKyAgICAgIGxldCBjbGllbnQgPSBtYWtlQ2xpZW50IHAgdAorICAgICAgcmVwbGljYXRlTV8gbG9vcHMgY2xpZW50CisgICAgICBwdXRTdHJMbiAiQ09NUExFVEVEIFNVQ0NFU1NGVUxMWSIKKworcGFyc2VGbGFncyA6OiBbU3RyaW5nXSAtPiBPcHRpb25zIC0+IE1heWJlIE9wdGlvbnMKK3BhcnNlRmxhZ3MgKGZsYWcgOiBmbGFncykgb3B0cyA9IGRvCisgIGxldCBwaWVjZXMgPSBzcGxpdE9uICI9IiBmbGFnCisgIGNhc2UgcGllY2VzIG9mCisgICAgIi0tcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcG9ydCA9IHJlYWQgYXJnIH0KKyAgICAiLS1kb21haW4tc29ja2V0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBkb21haW5Tb2NrZXQgPSByZWFkIGFyZyB9CisgICAgIi0taG9zdCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgaG9zdCA9IGFyZyB9CisgICAgIi0tdHJhbnNwb3J0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB0cmFuc3BvcnQgPSBhcmcgfQorICAgICItLXByb3RvY29sIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBwcm90b2NvbCA9IGdldFByb3RvY29sIGFyZyB9CisgICAgIi1uIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB0ZXN0TG9vcHMgPSByZWFkIGFyZyB9CisgICAgIi0taCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1oZWxwIiA6IF8gLT4gTm90aGluZworICAgICItLXNzbCIgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgc3NsID0gVHJ1ZSB9CisgICAgIi0tcHJvY2Vzc29yLWV2ZW50cyIgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0cworICAgIF8gLT4gTm90aGluZworcGFyc2VGbGFncyBbXSBvcHRzID0gSnVzdCBvcHRzCisKK3Nob3dIZWxwIDo6IElPICgpCitzaG93SGVscCA9IHB1dFN0ckxuCisgICJBbGxvd2VkIG9wdGlvbnM6XG5cCisgIFwgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZVxuXAorICBcICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0XG5cCisgIFwgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0XG5cCisgIFwgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLFxuXAorICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0XG5cCisgIFwgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHBcblwKKyAgXCAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb25cblwKKyAgXCAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMXG5cCisgIFwgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3MzFhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvVGVzdFNlcnZlci5ocwpAQCAtMCwwICsxLDMxMiBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyxSZWNvcmRXaWxkQ2FyZHMgIy19Cittb2R1bGUgTWFpbiB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5IYXNoTWFwLlN0cmljdCAoSGFzaE1hcCkKK2ltcG9ydCBEYXRhLkxpc3QKK2ltcG9ydCBEYXRhLkxpc3QuU3BsaXQKK2ltcG9ydCBEYXRhLlN0cmluZworaW1wb3J0IE5ldHdvcmsKK2ltcG9ydCBTeXN0ZW0uRW52aXJvbm1lbnQKK2ltcG9ydCBTeXN0ZW0uRXhpdAoraW1wb3J0IFN5c3RlbS5JTworaW1wb3J0IENvbnRyb2wuQ29uY3VycmVudCAodGhyZWFkRGVsYXkpCitpbXBvcnQgcXVhbGlmaWVkIFN5c3RlbS5JTyBhcyBJTworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIFRleHQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCisKK2ltcG9ydCBUaHJpZnRUZXN0CitpbXBvcnQgVGhyaWZ0VGVzdF9JZmFjZQoraW1wb3J0IFRocmlmdFRlc3RfVHlwZXMKKworaW1wb3J0IFRocmlmdAoraW1wb3J0IFRocmlmdC5TZXJ2ZXIKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCisKK2RhdGEgT3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBwb3J0ICAgICAgICAgOjogSW50CisgICwgZG9tYWluU29ja2V0IDo6IFN0cmluZworICAsIHNlcnZlclR5cGUgICA6OiBTZXJ2ZXJUeXBlCisgICwgdHJhbnNwb3J0ICAgIDo6IFN0cmluZworICAsIHByb3RvY29sICAgICA6OiBQcm90b2NvbFR5cGUKKyAgLCBzc2wgICAgICAgICAgOjogQm9vbAorICAsIHdvcmtlcnMgICAgICA6OiBJbnQKKyAgfQorCitkYXRhIFNlcnZlclR5cGUgPSBTaW1wbGUKKyAgICAgICAgICAgICAgICB8IFRocmVhZFBvb2wKKyAgICAgICAgICAgICAgICB8IFRocmVhZGVkCisgICAgICAgICAgICAgICAgfCBOb25CbG9ja2luZworICAgICAgICAgICAgICAgIGRlcml2aW5nIChTaG93LCBFcSkKKworaW5zdGFuY2UgSXNTdHJpbmcgU2VydmVyVHlwZSB3aGVyZQorICBmcm9tU3RyaW5nICJzaW1wbGUiICAgICAgPSBTaW1wbGUKKyAgZnJvbVN0cmluZyAidGhyZWFkLXBvb2wiID0gVGhyZWFkUG9vbAorICBmcm9tU3RyaW5nICJ0aHJlYWRlZCIgICAgPSBUaHJlYWRlZAorICBmcm9tU3RyaW5nICJub25ibG9ja2luZyIgPSBOb25CbG9ja2luZworICBmcm9tU3RyaW5nIF8gPSBlcnJvciAibm90IGEgdmFsaWQgc2VydmVyIHR5cGUiCisKK2RhdGEgVHJhbnNwb3J0VHlwZSA9IEJ1ZmZlcmVkIChTb2NrZXQgLT4gKElPIElPLkhhbmRsZSkpCisgICAgICAgICAgICAgICAgICAgfCBGcmFtZWQgKFNvY2tldCAtPiAoSU8gKEZyYW1lZFRyYW5zcG9ydCBJTy5IYW5kbGUpKSkKKyAgICAgICAgICAgICAgICAgICB8IE5vVHJhbnNwb3J0IFN0cmluZworCitnZXRUcmFuc3BvcnQgOjogU3RyaW5nIC0+IFRyYW5zcG9ydFR5cGUKK2dldFRyYW5zcG9ydCAiYnVmZmVyZWQiID0gQnVmZmVyZWQgJCBccyAtPiBkbworICAoaCwgXywgXykgPC0gKGFjY2VwdCBzKQorICBJTy5oU2V0QnVmZmVyaW5nIGggJCBJTy5CbG9ja0J1ZmZlcmluZyBOb3RoaW5nCisgIHJldHVybiBoCitnZXRUcmFuc3BvcnQgImZyYW1lZCIgPSBGcmFtZWQgJCBccyAtPiBkbworICAoaCwgXywgXykgPC0gKGFjY2VwdCBzKQorICBvcGVuRnJhbWVkVHJhbnNwb3J0IGgKK2dldFRyYW5zcG9ydCB0ID0gTm9UcmFuc3BvcnQgJCAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0OiAiICsrIHQKKworZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKKyAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAorICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgorCitnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKK2dldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKK2dldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiICA9IEhlYWRlcgorZ2V0UHJvdG9jb2wgcCA9IGVycm9yICQiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAorCitkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCitkZWZhdWx0T3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBwb3J0ICAgICAgICAgPSA5MDkwCisgICwgZG9tYWluU29ja2V0ID0gIiIKKyAgLCBzZXJ2ZXJUeXBlICAgPSBUaHJlYWRlZAorICAsIHRyYW5zcG9ydCAgICA9ICJidWZmZXJlZCIKKyAgLCBwcm90b2NvbCAgICAgPSBCaW5hcnkKKyAgLS0gVE9ETzogSGFza2VsbCBsaWIgZG9lcyBub3QgaGF2ZSBTU0wgc3VwcG9ydAorICAsIHNzbCAgICAgICAgICA9IEZhbHNlCisgICwgd29ya2VycyAgICAgID0gNAorICB9CisKK3N0cmluZ2lmeU1hcCA6OiAoU2hvdyBhLCBTaG93IGIpID0+IE1hcC5IYXNoTWFwIGEgYiAtPiBTdHJpbmcKK3N0cmluZ2lmeU1hcCA9IERhdGEuTGlzdC5pbnRlcmNhbGF0ZSAiLCAiIC4gRGF0YS5MaXN0Lm1hcCBqb2luS1YgLiBNYXAudG9MaXN0CisgIHdoZXJlIGpvaW5LViAoaywgdikgPSBzaG93IGsgKysgIiA9PiAiICsrIHNob3cgdgorCitzdHJpbmdpZnlTZXQgOjogU2hvdyBhID0+IFNldC5IYXNoU2V0IGEgLT4gU3RyaW5nCitzdHJpbmdpZnlTZXQgPSBEYXRhLkxpc3QuaW50ZXJjYWxhdGUgIiwgIiAuIERhdGEuTGlzdC5tYXAgc2hvdyAuIFNldC50b0xpc3QKKworc3RyaW5naWZ5TGlzdCA6OiBTaG93IGEgPT4gVmVjdG9yLlZlY3RvciBhIC0+IFN0cmluZworc3RyaW5naWZ5TGlzdCA9IERhdGEuTGlzdC5pbnRlcmNhbGF0ZSAiLCAiIC4gRGF0YS5MaXN0Lm1hcCBzaG93IC4gVmVjdG9yLnRvTGlzdAorCitkYXRhIFRlc3RIYW5kbGVyID0gVGVzdEhhbmRsZXIKK2luc3RhbmNlIFRocmlmdFRlc3RfSWZhY2UgVGVzdEhhbmRsZXIgd2hlcmUKKyAgdGVzdFZvaWQgXyA9IFN5c3RlbS5JTy5wdXRTdHJMbiAidGVzdFZvaWQoKSIKKworICB0ZXN0U3RyaW5nIF8gcyA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJpbmcoIiArKyBzaG93IHMgKysgIikiCisgICAgcmV0dXJuIHMKKworICB0ZXN0Qm9vbCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0Qm9vbCgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RCeXRlIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RCeXRlKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEkzMiBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0STMyKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEk2NCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0STY0KCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdERvdWJsZSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0RG91YmxlKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEJpbmFyeSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0QmluYXJ5KCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdFN0cnVjdCBfIHN0cnVjdEBYdHJ1Y3R7Li59ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFN0cnVjdCh7IiArKyBzaG93IHh0cnVjdF9zdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAiLCAiICsrIHNob3cgeHRydWN0X2J5dGVfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAiLCAiICsrIHNob3cgeHRydWN0X2kzMl90aGluZworICAgICAgICAgICAgICAgICAgICAgICsrICIsICIgKysgc2hvdyB4dHJ1Y3RfaTY0X3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIn0pIgorICAgIHJldHVybiBzdHJ1Y3QKKworICB0ZXN0TmVzdCBfIG5lc3RAWHRydWN0MnsuLn0gPSBkbworICAgIGxldCBYdHJ1Y3R7Li59ID0geHRydWN0Ml9zdHJ1Y3RfdGhpbmcKKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE5lc3QoeyIgKysgc2hvdyB4dHJ1Y3QyX2J5dGVfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAieywgIiArKyBzaG93IHh0cnVjdF9zdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAgIiwgIiArKyBzaG93IHh0cnVjdF9ieXRlX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgICIsICIgKysgc2hvdyB4dHJ1Y3RfaTMyX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgICIsICIgKysgc2hvdyB4dHJ1Y3RfaTY0X3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgIn0sICIgKysgc2hvdyB4dHJ1Y3QyX2kzMl90aGluZworICAgIHJldHVybiBuZXN0CisKKyAgdGVzdE1hcCBfIG0gPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TWFwKHsiICsrIHN0cmluZ2lmeU1hcCBtICsrICJ9KSIKKyAgICByZXR1cm4gbQorCisgIHRlc3RTdHJpbmdNYXAgXyBtID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFN0cmluZ01hcCgiICsrIHN0cmluZ2lmeU1hcCBtICsrICJ9KSIKKyAgICByZXR1cm4gbQorCisgIHRlc3RTZXQgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFNldCh7IiArKyBzdHJpbmdpZnlTZXQgeCArKyAifSkiCisgICAgcmV0dXJuIHgKKworICB0ZXN0TGlzdCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TGlzdCgiICsrIHN0cmluZ2lmeUxpc3QgeCArKyAifSkiCisgICAgcmV0dXJuIHgKKworICB0ZXN0RW51bSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0RW51bSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RUeXBlZGVmIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RUeXBlZGVmKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdE1hcE1hcCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TWFwTWFwKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiAkIE1hcC5mcm9tTGlzdCBbICgtNCwgTWFwLmZyb21MaXN0IFsgKC00LCAtNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgtMywgLTMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoLTIsIC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKC0xLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAsICg0LCAgTWFwLmZyb21MaXN0IFsgKDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoMiwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgzLCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDQsIDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXQorCisgIHRlc3RJbnNhbml0eSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAidGVzdEluc2FuaXR5KCkiCisgICAgcmV0dXJuICQgTWFwLmZyb21MaXN0IFsgKDEsIE1hcC5mcm9tTGlzdCBbIChUV08gICwgeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKFRIUkVFLCB4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoMiwgTWFwLmZyb21MaXN0IFsgKFNJWCwgZGVmYXVsdF9JbnNhbml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKworICB0ZXN0TXVsdGkgXyBieXRlIGkzMiBpNjQgXyBfIF8gPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAidGVzdE11bHRpKCkiCisgICAgcmV0dXJuIFh0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9IFRleHQucGFjayAiSGVsbG8yIgorICAgICAgICAgICAgICAgICAsIHh0cnVjdF9ieXRlX3RoaW5nICAgPSBieXRlCisgICAgICAgICAgICAgICAgICwgeHRydWN0X2kzMl90aGluZyAgICA9IGkzMgorICAgICAgICAgICAgICAgICAsIHh0cnVjdF9pNjRfdGhpbmcgICAgPSBpNjQKKyAgICAgICAgICAgICAgICAgfQorCisgIHRlc3RFeGNlcHRpb24gXyBzID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEV4Y2VwdGlvbigiICsrIHNob3cgcyArKyAiKSIKKyAgICBjYXNlIHMgb2YKKyAgICAgICJYY2VwdGlvbiIgICAtPiB0aHJvdyAkIFhjZXB0aW9uIDEwMDEgcworICAgICAgIlRFeGNlcHRpb24iIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbgorICAgICAgXyAtPiByZXR1cm4gKCkKKworICB0ZXN0TXVsdGlFeGNlcHRpb24gXyBzMSBzMiA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RNdWx0aUV4Y2VwdGlvbigiICsrIHNob3cgczEgKysgIiwgIiArKyBzaG93IHMyICsrICAiKSIKKyAgICBjYXNlIHMxIG9mCisgICAgICAiWGNlcHRpb24iICAgLT4gdGhyb3cgJCBYY2VwdGlvbiAxMDAxICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgIlhjZXB0aW9uMiIgIC0+IHRocm93ICQgWGNlcHRpb24yIDIwMDIgJCBYdHJ1Y3QgIlRoaXMgaXMgYW4gWGNlcHRpb24yIiAwIDAgMAorICAgICAgIlRFeGNlcHRpb24iIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbgorICAgICAgXyAtPiByZXR1cm4gZGVmYXVsdF9YdHJ1Y3R7IHh0cnVjdF9zdHJpbmdfdGhpbmcgPSBzMiB9CisKKyAgdGVzdE9uZXdheSBfIGkgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0T25ld2F5KCIgKysgc2hvdyBpICsrICIpOiBTbGVlcGluZy4uLiIKKyAgICB0aHJlYWREZWxheSAkIChmcm9tSW50ZWdyYWwgaSkgKiAxMDAwMDAwCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IGRvbmUgc2xlZXBpbmchIgorCittYWluIDo6IElPICgpCittYWluID0gZG8KKyAgb3B0aW9ucyA8LSBmbGlwIHBhcnNlRmxhZ3MgZGVmYXVsdE9wdGlvbnMgPCQ+IGdldEFyZ3MKKyAgY2FzZSBvcHRpb25zIG9mCisgICAgTm90aGluZyAtPiBzaG93SGVscAorICAgIEp1c3QgT3B0aW9uc3suLn0gLT4gZG8KKyAgICAgIGNhc2UgTWFpbi5nZXRUcmFuc3BvcnQgdHJhbnNwb3J0IG9mCisgICAgICAgIEJ1ZmZlcmVkIGYgLT4gcnVuU2VydmVyIHByb3RvY29sIGYgcG9ydAorICAgICAgICBGcmFtZWQgICBmIC0+IHJ1blNlcnZlciBwcm90b2NvbCBmIHBvcnQKKyAgICAgICAgTm9UcmFuc3BvcnQgZXJyIC0+IHB1dFN0ckxuIGVycgorICAgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgIlN0YXJ0aW5nIFwiIiArKyBzaG93IHNlcnZlclR5cGUgKysgIlwiIHNlcnZlciAoIiArKworICAgICAgICBzaG93IHRyYW5zcG9ydCArKyAiKSBsaXN0ZW4gb246ICIgKysgZG9tYWluU29ja2V0ICsrIHNob3cgcG9ydAorICAgICAgd2hlcmUKKyAgICAgICAgYWNjZXB0b3IgcCBmIHNvY2tldCA9IGRvCisgICAgICAgICAgdCA8LSBmIHNvY2tldAorICAgICAgICAgIHJldHVybiAocCB0LCBwIHQpCisKKyAgICAgICAgaGVhZGVyQWNjZXB0b3IgZiBzb2NrZXQgPSBkbworICAgICAgICAgIHQgPC0gZiBzb2NrZXQKKyAgICAgICAgICBwIDwtIGNyZWF0ZUhlYWRlclByb3RvY29sMSB0CisgICAgICAgICAgcmV0dXJuIChwLCBwKQorCisgICAgICAgIGRvUnVuU2VydmVyIHAgZiA9IGRvCisgICAgICAgICAgcnVuVGhyZWFkZWRTZXJ2ZXIgKGFjY2VwdG9yIHAgZikgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIC4gUG9ydE51bWJlciAuIGZyb21JbnRlZ3JhbAorCisgICAgICAgIHJ1blNlcnZlciBwIGYgcG9ydCA9IGNhc2UgcCBvZgorICAgICAgICAgIEJpbmFyeSAgLT4gZG9SdW5TZXJ2ZXIgQmluYXJ5UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgQ29tcGFjdCAtPiBkb1J1blNlcnZlciBDb21wYWN0UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSlNPTiAgICAtPiBkb1J1blNlcnZlciBKU09OUHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSGVhZGVyICAtPiBydW5UaHJlYWRlZFNlcnZlciAoaGVhZGVyQWNjZXB0b3IgZikgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIChQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisKK3BhcnNlRmxhZ3MgOjogW1N0cmluZ10gLT4gT3B0aW9ucyAtPiBNYXliZSBPcHRpb25zCitwYXJzZUZsYWdzIChmbGFnIDogZmxhZ3MpIG9wdHMgPSBkbworICBsZXQgcGllY2VzID0gc3BsaXRPbiAiPSIgZmxhZworICBjYXNlIHBpZWNlcyBvZgorICAgICItLXBvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHBvcnQgPSByZWFkIGFyZyB9CisgICAgIi0tZG9tYWluLXNvY2tldCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgZG9tYWluU29ja2V0ID0gcmVhZCBhcmcgfQorICAgICItLXNlcnZlci10eXBlIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBzZXJ2ZXJUeXBlID0gZnJvbVN0cmluZyBhcmcgfQorICAgICItLXRyYW5zcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgdHJhbnNwb3J0ID0gYXJnIH0KKyAgICAiLS1wcm90b2NvbCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCBhcmcgfQorICAgICItLXdvcmtlcnMiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHdvcmtlcnMgPSByZWFkIGFyZyB9CisgICAgIi1uIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB3b3JrZXJzID0gcmVhZCBhcmcgfQorICAgICItLWgiIDogXyAtPiBOb3RoaW5nCisgICAgIi0taGVscCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1zc2wiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHNzbCA9IFRydWUgfQorICAgICItLXByb2Nlc3Nvci1ldmVudHMiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHMKKyAgICBfIC0+IE5vdGhpbmcKK3BhcnNlRmxhZ3MgW10gb3B0cyA9IEp1c3Qgb3B0cworCitzaG93SGVscCA6OiBJTyAoKQorc2hvd0hlbHAgPSBTeXN0ZW0uSU8ucHV0U3RyTG4KKyAgIkFsbG93ZWQgb3B0aW9uczpcblwKKyAgXCAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlXG5cCisgIFwgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW5cblwKKyAgXCAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KVxuXAorICBcICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIixcblwKKyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiXG5cCisgIFwgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWRcblwKKyAgXCAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb25cblwKKyAgXCAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMXG5cCisgIFwgIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzXG5cCisgIFwgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yXG5cCisgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZSIKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzIGIvdGVzdC9ocy9UaHJpZnRUZXN0VXRpbHMuaHMKaW5kZXggOTNmYTEyMi4uOWMxOWI1NiAxMDA2NDQKLS0tIGEvdGVzdC9ocy9UaHJpZnRUZXN0VXRpbHMuaHMKKysrIGIvdGVzdC9ocy9UaHJpZnRUZXN0VXRpbHMuaHMKQEAgLTYwLDYgKzYwLDYgQEAKICAgICBDb250cm9sLkNvbmN1cnJlbnQudGhyZWFkRGVsYXkgJCA1MDAgKiAxMDAwIC0tIHVuaXQgaXMgaW4gX21pY3JvX3NlY29uZHMKICAgICBDb250cm9sLkNvbmN1cnJlbnQueWllbGQKIAotICAgIF8gPC0gY2xpZW50IHNlcnZlckFkZHJlc3MKKyAgICBjbGllbnQgc2VydmVyQWRkcmVzcwogCiAgICAgdGVzdExvZyAiU1VDQ0VTUyIKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzIGIvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKaW5kZXggNDE2MGMxNy4uNjcwMDIzZSAxMDA2NDQKLS0tIGEvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKKysrIGIvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKQEAgLTE4LDEyICsxOCwxNiBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKIG1vZHVsZSBNYWluIHdoZXJlCiAKIAogaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbgotaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCisKIGltcG9ydCBxdWFsaWZpZWQgTmV0d29yawogCiBpbXBvcnQgVGhyaWZ0CkBAIC00MywxMTcgKzQ3LDgwIEBACiBpbnN0YW5jZSBJZmFjZS5UaHJpZnRUZXN0X0lmYWNlIFRlc3RIYW5kbGVyIHdoZXJlCiAgICAgdGVzdFZvaWQgXyA9IHJldHVybiAoKQogCi0gICAgdGVzdFN0cmluZyBfIChKdXN0IHMpID0gZG8KLSAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyBzCisgICAgdGVzdFN0cmluZyBfIHMgPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyBzCiAgICAgICAgIHJldHVybiBzCiAKLSAgICB0ZXN0U3RyaW5nIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RTdHJpbmcgZm9ybSIKLQotICAgIHRlc3RCeXRlIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RCeXRlIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RCeXRlIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RCeXRlIGZvcm0iCi0KLSAgICB0ZXN0STMyIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RJMzIgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdEkzMiBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0STMyIGZvcm0iCi0KLSAgICB0ZXN0STY0IF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RJNjQgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdEk2NCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0STY0IGZvcm0iCi0KLSAgICB0ZXN0RG91YmxlIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3REb3VibGUgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdERvdWJsZSBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0RG91YmxlIGZvcm0iCi0KLSAgICB0ZXN0U3RydWN0IF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RCaW5hcnkgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdFN0cnVjdCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0U3RydWN0IGZvcm0iCi0KLSAgICB0ZXN0TmVzdCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0U3RydWN0IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3ROZXN0IF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3ROZXN0IGZvcm0iCi0KLSAgICB0ZXN0TWFwIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3ROZXN0IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RNYXAgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdE1hcCBmb3JtIgotCi0gICAgdGVzdFNldCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0TWFwIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RTZXQgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdFNldCBmb3JtIgotCi0gICAgdGVzdExpc3QgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdFN0cmluZ01hcCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0TGlzdCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0TGlzdCBmb3JtIgotCi0gICAgdGVzdEVudW0gXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdFNldCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0RW51bSBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0RW51bSBmb3JtIgotCi0gICAgdGVzdFR5cGVkZWYgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdExpc3QgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdFR5cGVkZWYgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdFR5cGVkZWYgZm9ybSIKKyAgICB0ZXN0RW51bSBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0TWFwTWFwIF8gKEp1c3QgXykgPSBkbworICAgIHRlc3RUeXBlZGVmIF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RNYXBNYXAgXyBfID0gZG8KICAgICAgICAgcmV0dXJuIChNYXAuZnJvbUxpc3QgWygxLCBNYXAuZnJvbUxpc3QgWygyLCAyKV0pXSkKIAotICAgIHRlc3RNYXBNYXAgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdE1hcE1hcCBmb3JtIgotCi0gICAgdGVzdEluc2FuaXR5IF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RJbnNhbml0eSBfIHggPSBkbwogICAgICAgICByZXR1cm4gKE1hcC5mcm9tTGlzdCBbKDEsIE1hcC5mcm9tTGlzdCBbKFR5cGVzLk9ORSwgeCldKV0pCiAKLSAgICB0ZXN0SW5zYW5pdHkgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdEluc2FuaXR5IGZvcm0iCi0KICAgICB0ZXN0TXVsdGkgXyBfIF8gXyBfIF8gXyA9IGRvCi0gICAgICAgIHJldHVybiAoVHlwZXMuWHRydWN0IE5vdGhpbmcgTm90aGluZyBOb3RoaW5nIE5vdGhpbmcpCisgICAgICAgIHJldHVybiAoVHlwZXMuWHRydWN0ICIiIDAgMCAwKQogCiAgICAgdGVzdEV4Y2VwdGlvbiBfIF8gPSBkbwotICAgICAgICBDb250cm9sLkV4Y2VwdGlvbi50aHJvdyAoVHlwZXMuWGNlcHRpb24gKEp1c3QgMSkgKEp1c3QgImJ5YSIpKQorICAgICAgICBDb250cm9sLkV4Y2VwdGlvbi50aHJvdyAoVHlwZXMuWGNlcHRpb24gMSAiYnlhIikKIAogICAgIHRlc3RNdWx0aUV4Y2VwdGlvbiBfIF8gXyA9IGRvCi0gICAgICAgIENvbnRyb2wuRXhjZXB0aW9uLnRocm93IChUeXBlcy5YY2VwdGlvbiAoSnVzdCAxKSAoSnVzdCAieHl6IikpCisgICAgICAgIENvbnRyb2wuRXhjZXB0aW9uLnRocm93IChUeXBlcy5YY2VwdGlvbiAxICJ4eXoiKQogCi0gICAgdGVzdE9uZXdheSBfIChKdXN0IGkpID0gZG8KKyAgICB0ZXN0T25ld2F5IF8gaSA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IGkKIAotICAgIHRlc3RPbmV3YXkgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdE9uZXdheSBmb3JtIgotCiAKIGNsaWVudCA6OiAoU3RyaW5nLCBOZXR3b3JrLlBvcnRJRCkgLT4gSU8gKCkKIGNsaWVudCBhZGRyID0gZG8KQEAgLTE2MSw3ICsxMjgsNyBAQAogICAgIGxldCBwcyA9IChCaW5hcnlQcm90b2NvbCB0bywgQmluYXJ5UHJvdG9jb2wgdG8pCiAKICAgICB2MSA8LSBDbGllbnQudGVzdFN0cmluZyBwcyAiYnlhIgotICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgdjEKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MQogCiAgICAgdjIgPC0gQ2xpZW50LnRlc3RCeXRlIHBzIDgKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MgpAQCAtMTg3LDE4ICsxNTQsMjMgQEAKICAgICB2OSA8LSBDbGllbnQudGVzdERvdWJsZSBwcyAoLTMuMTQpCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjkKIAorICAgIC0tIFRPRE86IENsaWVudC50ZXN0QmluYXJ5IC4uLgorCQogICAgIHYxMCA8LSBDbGllbnQudGVzdE1hcCBwcyAoTWFwLmZyb21MaXN0IFsoMSwxKSwoMiwyKSwoMywzKV0pCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEwCiAKLSAgICB2MTEgPC0gQ2xpZW50LnRlc3RMaXN0IHBzIFsxLDIsMyw0LDVdCisgICAgdjExIDwtIENsaWVudC50ZXN0U3RyaW5nTWFwIHBzIChNYXAuZnJvbUxpc3QgWygiYSIsIjEyMyIpLCgiYSBiIiwid2l0aCBzcGFjZXMgIiksKCJzYW1lIiwic2FtZSIpLCgiMCIsIm51bWVyaWMga2V5IildKQogICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxMQogCi0gICAgdjEyIDwtIENsaWVudC50ZXN0U2V0IHBzIChTZXQuZnJvbUxpc3QgWzEsMiwzLDQsNV0pCisgICAgdjEyIDwtIENsaWVudC50ZXN0TGlzdCBwcyAoVmVjdG9yLmZyb21MaXN0IFsxLDIsMyw0LDVdKQogICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxMgogCi0gICAgdjEzIDwtIENsaWVudC50ZXN0U3RydWN0IHBzIChUeXBlcy5YdHJ1Y3QgKEp1c3QgImhpIikgKEp1c3QgNCkgKEp1c3QgNSkgTm90aGluZykKKyAgICB2MTMgPC0gQ2xpZW50LnRlc3RTZXQgcHMgKFNldC5mcm9tTGlzdCBbMSwyLDMsNCw1XSkKICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTMKIAorICAgIHYxNCA8LSBDbGllbnQudGVzdFN0cnVjdCBwcyAoVHlwZXMuWHRydWN0ICJoaSIgNCA1IDApCisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjE0CisKICAgICAodGVzdEV4Y2VwdGlvbiBwcyAiYmFkIikgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0ZXN0RXhjZXB0aW9uSGFuZGxlcgogCiAgICAgKHRlc3RNdWx0aUV4Y2VwdGlvbiBwcyAib2siKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRlc3RNdWx0aUV4Y2VwdGlvbkhhbmRsZXIxCkBAIC0yMDgsNyArMTgwLDcgQEAKIAogICAgIHRDbG9zZSB0bwogICB3aGVyZSB0ZXN0RXhjZXB0aW9uIHBzIG1zZyA9IGRvCi0gICAgICAgICAgICBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcyAiZSIKKyAgICAgICAgICAgIF8gPC0gQ2xpZW50LnRlc3RFeGNlcHRpb24gcHMgImUiCiAgICAgICAgICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nIG1zZwogICAgICAgICAgICAgcmV0dXJuICgpCiAKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvcnVuLXRlc3Quc2ggYi90ZXN0L2hzL3J1bi10ZXN0LnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzhkZjBhOC4uZWNhZmMxOAotLS0gYS90ZXN0L2hzL3J1bi10ZXN0LnNoCisrKyBiL3Rlc3QvaHMvcnVuLXRlc3Quc2gKQEAgLTE5LDcgKzE5LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWlmIFsgIngiID09ICJ4JDEiIF07IHRoZW4KK2lmIFsgIngiID0gIngkMSIgXTsgdGhlbgogICBwcmludGYgInJ1bi10ZXN0LnNoIG5lZWRzIGFuIGFyZ3VtZW50LCB0aGUgbmFtZSBvZiB0aGUgdGVzdCB0byBydW4uIFRyeSAnVGhyaWZ0VGVzdCcgb3IgJ1Byb3RvRGVidWdUZXN0J1xuIgogICBleGl0IDIKIGZpCkBAIC0yOSwzMCArMjksNiBAQAogICAgIEJBU0U9Li4vLi4KIGZpCiAKLWlmIFsgLXogJFRIUklGVF9CSU4gXTsgdGhlbgotICAgIFRIUklGVF9CSU49JEJBU0UvY29tcGlsZXIvY3BwL3RocmlmdCAKLWZpCi0KLWlmIFsgISAteCAiJFRIUklGVF9CSU4iIF07IHRoZW4KLSAgICBwcmludGYgIkNvdWxkIG5vdCBmaW5kIHRocmlmdCBiaW5hcnk7IHBhc3MgaXQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGUgVEhSSUZUX0JJTlxuIgotICAgIGV4aXQgMQotZmkKLQotIyBGaWd1cmUgb3V0IHdoYXQgZmlsZSB0byBnZW5lcmF0ZSBiaW5kaW5ncyBmcm9tCi1pZiBbIC16ICRUSFJJRlRfRklMRSBdOyB0aGVuCi0gICAgVEhSSUZUX0ZJTEU9JEJBU0UvdGVzdC8kMS50aHJpZnQKLWZpCi0KLWlmIFsgISAtZSAkVEhSSUZUX0ZJTEUgXTsgdGhlbgotICAgIHByaW50ZiAiTWlzc2luZyB0aHJpZnQgZmlsZSAkVEhSSUZUX0ZJTEUgXG4iCi0gICAgZXhpdCAyCi1maQotCi1pZiBbICEgLWUgIiRUSFJJRlRfRklMRSIgXTsgdGhlbgotICAgIHByaW50ZiAiQ291bGQgbm90IGZpbmQgdGhyaWZ0IGZpbGUgdG8gcnVuOyBwYXNzIGl0IGFzIGVudmlyb25tZW50IHZhcmlhYmxlIFRIUklGVF9GSUxFXG4iCi0gICAgZXhpdCAxCi1maQotCiAjIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHRvIHJ1biBoYXMgYSBzZXJ2ZXIKIGlmIFsgLXogJFRFU1RfU09VUkNFX0ZJTEUgXTsgdGhlbgogICAgIFRFU1RfU09VUkNFX0ZJTEU9JEJBU0UvdGVzdC9ocy8kMV9NYWluLmhzCkBAIC02Myw5ICszOSw1IEBACiAgICAgZXhpdCAzCiBmaQogCi0jIEFjdHVhbGx5IHJ1biB0aGUgc2VydmVyIGJpdHMKLXByaW50ZiAiR2VuZXJhdGluZyBiaW5kaW5ncy4uLiBcbiIKLSRUSFJJRlRfQklOIC0tZ2VuIGhzICRUSFJJRlRfRklMRQotCiBwcmludGYgIlJ1bm5pbmcgdGVzdC4uLiBcbiIKLXJ1bmhhc2tlbGwgLVdhbGwgLVdlcnJvciAtaSRCQVNFL2xpYi9ocy9zcmMgLWlnZW4taHMgJFRFU1RfU09VUkNFX0ZJTEUKK3J1bmhhc2tlbGwgLVdhbGwgLVhTY29wZWRUeXBlVmFyaWFibGVzIC1pJEJBU0UvbGliL2hzL3NyYyAtaWdlbi1ocyAkVEVTVF9TT1VSQ0VfRklMRQpkaWZmIC0tZ2l0IGEvdGVzdC9pbmRleC5odG1sIGIvdGVzdC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTFhOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2tleXMvQ0EucGVtIGIvdGVzdC9rZXlzL0NBLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQ3YjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL0NBLnBlbQpAQCAtMCwwICsxLDgyIEBACitDZXJ0aWZpY2F0ZToKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDE2NTgyMDgwMDg4OTU0MzgxMjEyICgweGU2MWY2MWZjM2IzNDIzOWMpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgU1Q9TWFyeWxhbmQsIEw9Rm9yZXN0IEhpbGwsIE89VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBPVT1BcGFjaGUgVGhyaWZ0LCBDTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXByICA3IDE4OjU4OjAwIDIwMTQgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gMjQgMTg6NTg6MDAgMjAyMiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgU1Q9TWFyeWxhbmQsIEw9Rm9yZXN0IEhpbGwsIE89VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBPVT1BcGFjaGUgVGhyaWZ0LCBDTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgUHVibGljLUtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXM6CisgICAgICAgICAgICAgICAgICAgIDAwOmFhOjEzOmQ0OmM0OmY3OjAxOjE3OmE3OjkyOmQxOmI0OmI0OjE1OjBkOgorICAgICAgICAgICAgICAgICAgICAyMTo5MDoxOTo1ZTpmYzpmYjpiNjo2ZDozZjpmMjozZjo2NTphMjo3YTo0MzoKKyAgICAgICAgICAgICAgICAgICAgYTY6NDY6OTU6ZmM6NDM6MTY6ZjY6NjM6MTQ6NWU6Zjc6YjE6ZTM6NjE6MDI6CisgICAgICAgICAgICAgICAgICAgIGY5OjRhOjk1Ojg5OmJmOjhkOmY5OjQ4OjFkOjgyOmU3OjM0OmUwOmIyOjQ4OgorICAgICAgICAgICAgICAgICAgICBkZjowODpkOTo3YzozYToyZjpkMzoxYjowYjplODplZjpjMjo0MTowYTo3ZDoKKyAgICAgICAgICAgICAgICAgICAgMGE6Mzg6Nzg6M2E6MzE6NjY6NzM6OTk6OGM6ZDE6Nzk6Mjc6NWY6ZTU6NjY6CisgICAgICAgICAgICAgICAgICAgIGQwOjVlOjNhOjhjOjBjOjkyOjE4OjczOjA0OmMxOmY1OjQ1OmRiOjM3OmU3OgorICAgICAgICAgICAgICAgICAgICA1ZjpjNzo4YzphMzo2MDplOTo5MjphMDpkODoyOTo1ZDo3Nzo0ODpmYjoxZDoKKyAgICAgICAgICAgICAgICAgICAgYjA6ZWQ6MTI6MmM6NGU6MmU6MDI6ZGI6M2Q6MWE6NDE6NzE6YTY6MmI6MmU6CisgICAgICAgICAgICAgICAgICAgIGIzOjRjOjZhOmM3OmY3OjFkOmE5OjdlOmM3OmNmOmRiOmYyOmU3OmI2OmYzOgorICAgICAgICAgICAgICAgICAgICAxZjo3NzoxZDoyNDowMToxYTo2Njo2NjozMDo4NTozMDowMjoyOTpjNDpiYjoKKyAgICAgICAgICAgICAgICAgICAgZjc6Y2Q6M2Y6ODk6NGI6MWE6NWY6ZjQ6OTE6OTY6ZmI6ZTk6Mzk6ZjI6NDY6CisgICAgICAgICAgICAgICAgICAgIDk2OjEyOjNkOjhhOjIzOmI1OjJlOjgyOjllOjQxOmZlOjQwOmI2OjI3OmIxOgorICAgICAgICAgICAgICAgICAgICAxNDo0NDo1Yzo5NjozMDowZjo1NTplNDpiYjphZDo4Yjo4YTo5OToxNzpjMDoKKyAgICAgICAgICAgICAgICAgICAgMjk6MTE6NGU6NzY6Nzk6OWQ6NGI6MDM6MzE6N2U6ODU6M2M6YTg6MjM6NDA6CisgICAgICAgICAgICAgICAgICAgIDU0OjAyOjU4OjM1OmM2OmZjOmRkOjNkOmViOmUzOmQxOjUxOjAwOjAyOjg2OgorICAgICAgICAgICAgICAgICAgICAxYTpkNzpiMDo5ZjphMDoxNzo3Mzo2YTo1YTpkMDplNjpiNjpiODo1NTo0MDoKKyAgICAgICAgICAgICAgICAgICAgNWU6MjcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDI4OkYyOkZEOjMwOkNEOjAzOkYxOkRDOjQxOjFFOkM0OjkzOkM2Ojk3OjEzOkNBOkQ0OkZBOjYwOjJBCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDoyODpGMjpGRDozMDpDRDowMzpGMTpEQzo0MToxRTpDNDo5MzpDNjo5NzoxMzpDQTpENDpGQTo2MDoyQQorCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDQ2OjE1OjE4Ojg5OmIyOjU3OjE3OmQxOmEyOjY0OmMxOjlhOjczOjRmOjA0Ojk0Ojc2OjA3OgorICAgICAgICAgMWY6Mjk6YmE6NmY6MzQ6NDY6YzI6MzY6ZDU6Njg6ODU6ZjQ6MTU6NGM6OGU6MWE6ZmU6ODM6CisgICAgICAgICA3OTo1MzplYzphYTowZDo5Mjo2MDpkZTpmMzo5YTozYTplODo4MDo2NjphYzo4Nzo3MDo4OToKKyAgICAgICAgIDU5OmYyOmFjOjllOmIwOjI4OjExOjM3OjdkOjc4OjRlOjVlOjNmOjI1OjBmOmJlOjA5OjZmOgorICAgICAgICAgMjY6MmE6M2Q6NjY6Nzk6Mzg6Mjg6ZTU6ODE6NzE6NzE6OTY6MjY6NGY6ZGI6ZWM6MjM6NzA6CisgICAgICAgICBiZTozNzozOTpmYzplMDozMjowZDo4MDo4Zjo2NjpjNzphYzphNDpiNDo4Yjo3Nzo0MDplMjoKKyAgICAgICAgIDk5OjQ0OjNhOjczOmM4OmY5OjE0OmNmOjFiOjMyOjI3OmMyOjc4OmRiOmIwOmRhOjhhOjYwOgorICAgICAgICAgZWI6OGQ6MzQ6N2U6N2Q6M2M6MDM6ZDQ6Mzg6NzQ6Zjc6MTc6OWU6MzI6NzQ6OWE6ZTc6Mzc6CisgICAgICAgICA5NTpkNDo3MTowMzpjODo5NDplYTowOTo3YjphZDoyZDplYjo3MDo0MzpmMjozMjo3ZTo2MzoKKyAgICAgICAgIDAxOjg0OjhjOjdlOjllOmYwOjc5OjdmOmFlOmU5OmNmOmY5OmJlOjBlOmZlOjk1OmQyOmJkOgorICAgICAgICAgYzg6YTc6ODE6YzI6NzE6ZDk6YzM6NTA6MzE6ODk6NmQ6ZmE6YWQ6YTI6YWI6MDA6MDE6MzQ6CisgICAgICAgICAxMDo1ODplZjo5Njo1YTplYjozMDowNzphOTo4ZTo4NDozNjplZjozZDozYzo2MTo0Njo5NjoKKyAgICAgICAgIDZhOmU4OjA5OjIwOjVhOmFiOmY4OjRiOmViOmI3OjMzOjYxOjhlOmFmOjlhOjdkOjE2OmIwOgorICAgICAgICAgNjA6NmE6ZjA6MzA6ZTU6YjI6OGU6ZTc6ODA6YjQ6YTE6MDI6YTk6Mzc6ZmU6NWY6YjU6YWU6CisgICAgICAgICA2NTplOTo2YjozNAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9SRUFETUUubWQgYi90ZXN0L2tleXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxMDgzNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTAyIEBACisjIFRlc3QgS2V5cyBhbmQgQ2VydGlmaWNhdGVzCitUaGlzIGZvbGRlciBpcyBkZWRpY2F0ZWQgdG8gdGVzdCBrZXlzIGFuZCBjZXJ0aWZpY2F0ZXMgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZm9ybWF0cy4KK1ByaW1hcnkgdXNlIGFyZSB1bml0IHRlc3Qgc3VpdGVzIGFuZCBjcm9zcyBsYW5ndWFnZSB0ZXN0cy4KKworICAgIHRlc3Qva2V5cworCisqKlRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBtdXN0IG5ldmVyIGJlIHVzZWQgb24gcHJvZHVjdGlvbiBzeXN0ZW1zLioqCisKKyMjIFNTTCBLZXlzIGFuZCBDZXJ0aWZpY2F0ZXMKKworCisjIyBjcmVhdGUgY2VydGlmaWNhdGVzCisKK3dlIHVzZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgZm9yIHRlc3Qga2V5IGFuZCBjZXJ0aWZpY2F0ZSBjcmVhdGlvbgorCisgICAgQz1VUywKKyAgICBTVD1NYXJ5bGFuZCwKKyAgICBMPUZvcmVzdCBIaWxsLAorICAgIE89VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgIE9VPUFwYWNoZSBUaHJpZnQsCisgICAgQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKworIyMjIGNyZWF0ZSBzZWxmLXNpZ25lZCBzZXJ2ZXIga2V5IGFuZCBjZXJ0aWZpY2F0ZQorCisgICAgb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtbm9kZXMgIC1kYXlzIDMwMDAgLW91dCBzZXJ2ZXIuY3J0IC1rZXlvdXQgc2VydmVyLmtleQorICAgIG9wZW5zc2wgeDUwOSAtaW4gc2VydmVyLmNydCAtdGV4dCA+IENBLnBlbQorICAgIGNhdCBzZXJ2ZXIuY3J0IHNlcnZlci5rZXkgPiBzZXJ2ZXIucGVtCisKK0V4cG9ydCBwYXNzd29yZCBpcyAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMKKworICAgIG9wZW5zc2wgcGtjczEyIC1leHBvcnQgLWNsY2VydHMgLWluIHNlcnZlci5jcnQgLWlua2V5IHNlcnZlci5rZXkgLW91dCBzZXJ2ZXIucDEyCisKKyMjIyBjcmVhdGUgY2xpZW50IGtleSBhbmQgY2VydGlmaWNhdGUKKworICAgIG9wZW5zc2wgZ2VucnNhIC1vdXQgY2xpZW50LmtleQorCitjcmVhdGUgYSBzaWduaW5nIHJlcXVlc3Q6CisKKyAgICBvcGVuc3NsIHJlcSAtbmV3IC1rZXkgY2xpZW50LmtleSAtb3V0IGNsaWVudC5jc3IKKworc2lnbiB0aGUgY2xpZW50IGNlcnRpZmljYXRlIHdpdGggdGhlIHNlcnZlci5rZXkKKworICAgIG9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDMwMDAgLWluIGNsaWVudC5jc3IgLUNBIENBLnBlbSAtQ0FrZXkgc2VydmVyLmtleSAtc2V0X3NlcmlhbCAwMSAtb3V0IGNsaWVudC5jcnQKKworZXhwb3J0IGNlcnRpZmljYXRlIGluIFBLQ1MxMiBmb3JtYXQgKEV4cG9ydCBwYXNzd29yZCBpcyAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMpCisKKyAgICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1jbGNlcnRzIC1pbiBjbGllbnQuY3J0IC1pbmtleSBjbGllbnQua2V5IC1vdXQgY2xpZW50LnAxMgorCitleHBvcnQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdCBmb3IgT3BlblNTTCB1c2FnZQorCisgICAgb3BlbnNzbCBwa2NzMTIgLWluIGNsaWVudC5wMTIgLW91dCBjbGllbnQucGVtIC1jbGNlcnRzCisKKyMjIyBjcmVhdGUgY2xpZW50IGtleSBhbmQgY2VydGlmaWNhdGUgd2l0aCBhbHRuYW1lcworCitjb3B5IG9wZW5zc2wuY25mIGZyb20geW91ciBzeXN0ZW0gZS5nLiAvZXRjL3NzbC9vcGVuc3NsLmNuZiBhbmQgYXBwZW5kIGZvbGxvd2luZyB0byB0aGUgZW5kIG9mIFsgdjNfcmVxIF0KKworICAgIHN1YmplY3RBbHROYW1lPUBhbHRlcm5hdGVfbmFtZXMKKworICAgIFsgYWx0ZXJuYXRlX25hbWVzIF0KKyAgICBJUC4xPTEyNy4wLjAuMQorICAgIElQLjI9OjoxCisgICAgSVAuMz06OmZmZmY6MTI3LjAuMC4xCisKK2NyZWF0ZSBhIHNpZ25pbmcgcmVxdWVzdDoKKworICAgIG9wZW5zc2wgcmVxIC1uZXcgLWtleSBjbGllbnRfdjMua2V5IC1vdXQgY2xpZW50X3YzLmNzciAtY29uZmlnIG9wZW5zc2wuY25mIFwKKyAgICAgICAgLXN1YmogIi9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QiIC1leHRlbnNpb25zIHYzX3JlcQorCitzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgd2l0aCB0aGUgc2VydmVyLmtleQorCisgICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzAwMCAtaW4gY2xpZW50X3YzLmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50X3YzLmNydCAtZXh0ZW5zaW9ucyB2M19yZXEgLWV4dGZpbGUgb3BlbnNzbC5jbmYKKworIyMgSmF2YSBrZXkgYW5kIGNlcnRpZmljYXRlIGltcG9ydAorSmF2YSBUZXN0IEVudmlyb25tZW50IHVzZXMga2V5IGFuZCB0cnVzdCBzdG9yZSBwYXNzd29yZCAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMKKworbGlzdCBrZXlzdG9yZSBlbnRyaWVzCisKKyAgICBrZXl0b29sIC1saXN0IC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQorCitsaXN0IHRydXN0c3RvcmUgZW50cmllcworCisgICAga2V5dG9vbCAtbGlzdCAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQorCisKK2RlbGV0ZSBhbiBlbnRyeQorCisgICAga2V5dG9vbCAtZGVsZXRlIC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIC1hbGlhcyBzc2x0ZXN0CisKKworaW1wb3J0IGNlcnRpZmljYXRlIGludG8gdHJ1c3RzdG9yZQorCisgICAga2V5dG9vbCAtaW1wb3J0Y2VydCAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSAtYWxpYXMgbG9jYWxob3N0IC0tZmlsZSBzZXJ2ZXIuY3J0CisKK2ltcG9ydCBrZXkgaW50byBrZXlzdG9yZQorCisgICAga2V5dG9vbCAtaW1wb3J0a2V5c3RvcmUgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlIC1zcmNzdG9yZXR5cGUgcGtjczEyIC1zcmNrZXlzdG9yZSBzZXJ2ZXIucDEyCisKKyMgVGVzdCBTU0wgc2VydmVyIGFuZCBjbGllbnRzCisKKyAgICBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0IGxvY2FsaG9zdDo5MDkwCisgICAgb3BlbnNzbCBzX3NlcnZlciAtYWNjZXB0IDkwOTAgLXd3dworCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LmNydCBiL3Rlc3Qva2V5cy9jbGllbnQuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTlhZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LmNydApAQCAtMCwwICsxLDIzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQyRENDQXNBQ0FRRXdEUVlKS29aSWh2Y05BUUVMQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKK1ZRUUlEQWhOWVhKNWJHRnVaREVVTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm8KK1pTQkJjR0ZqYUdVZ1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm8KK2NtbG1kREVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHkKK2FXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UVXhNakl6TURjd056VXdXaGNOTWpRd016RXdNRGN3TnpVd1dqQ0IKK3NURUxNQWtHQTFVRUJoTUNWVk14RVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmwKK2MzUWdTR2xzYkRFbk1DVUdBMVVFQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXUKK01SWXdGQVlEVlFRTERBMUJjR0ZqYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWkKK0Jna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMbC9iSmhnMTdQdTF0Nzg1Skl1d2xoN2UyRTUxZW9XRnZ1eE1XZkgKK2RzVUFWcURhT3o5OU81c3Y4cGdXS1hya1BCdHRFOThUK014L1B3ejVKSHM0UWNyZTNBNWFkbTZjZGFiMEFLdWcKK2VWRzFQdkhyV3pWNGFoZWc0S1VmVlNpTXo4QkcySzNRMVZHdlprZ01SYS9RNDA5RktqVTZaNEQ5dkJHNFBhczMKK1BONUZ4bkFMNlA3MHlXQ0VyMlZ1L3RXSmxDTitxclJEZlNhRTJocW1UMWlyeGFvUGE2MUd2dVJWc0dRM1Rlb0UKK21HZkVOdHZGcUM2cVFXdVNDYkc1YUk0N1J2NjZwcW9XV3hxa3Jjb2xOYzcrdmh4NnJXK3dkRk8zSWxxSVQ4SUcKK3NkUVZwK1k0aXIvZEdwMmVqenFHWkNyZW1QSjF1RUtqTE1wSXVrZGcyNXltSEMwQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCY1Jkd2M5bWRZOXpPdlRpeHRUaEhyY2lWdnF3cDZSYWlRcU1FVm9tb3pZaWxaRFIKK0o5ME0zSDZLbmxBREpiQ3YwRlh1anNhQXBCNTNhd3E1STdzT2JBWVdGaERKWjlMS2x3MGxERjdLY2hMWGlBbGsKK1hWeXZMMm5KanVKY3hQQ0ZQV2t0d3J3NWJUZ3VSQ0J6RzEySHppa24reHM2dVB1cjdWUVlNMzNqYlhFZGE1UFMKK1VFcXZBVldhT05KQ1g4TURZT3NjVm9KRjBFU3lJK2ZOOTJpcEZhWFI3Zkdham9kL3JjMEFmZU4yR1ZNWkVUdmUKKzIxcGtVeUR3d0NHQTQ0dXZOVUNkMWUzMk54RTNhaDlVQXBDUm41c0dKNjRSNnVycEZUWFQzSUFMRjNrYU9PN1UKK1ZzTWhGclVpWjcrQnc1bkllaUswUU9GNkVpcGorYkp2ckxacFNnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQua2V5IGIvdGVzdC9rZXlzL2NsaWVudC5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkY2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQua2V5CkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUVvd0lCQUFLQ0FRRUF1WDlzbUdEWHMrN1czdnpra2k3Q1dIdDdZVG5WNmhZVys3RXhaOGQyeFFCV29ObzcKK1AzMDdteS95bUJZcGV1UThHMjBUM3hQNHpIOC9EUGtrZXpoQnl0N2NEbHAyYnB4MXB2UUFxNkI1VWJVKzhldGIKK05YaHFGNkRncFI5VktJelB3RWJZcmREVlVhOW1TQXhGcjlEalQwVXFOVHBuZ1AyOEViZzlxemM4M2tYR2NBdm8KKy92VEpZSVN2Wlc3KzFZbVVJMzZxdEVOOUpvVGFHcVpQV0t2RnFnOXJyVWErNUZXd1pEZE42Z1NZWjhRMjI4V28KK0xxcEJhNUlKc2Jsb2pqdEcvcnFtcWhaYkdxU3R5aVUxenY2K0hIcXRiN0IwVTdjaVdvaFB3Z2F4MUJXbjVqaUsKK3Y5MGFuWjZQT29aa0t0Nlk4blc0UXFNc3lraTZSMkRibktZY0xRSURBUUFCQW9JQkFGb3RiQ21YeXNVYWN6THMKK1ZtSUtnVWhxbjB4Z3hYR0xVNWtBUnpoZ2E0alI1VXRGVEZCTkhWRVFPaXRkZXNUWGQ3RU5rZjk4d2hNSU9TcWgKK1krN1RKb2p0VnFWVHJRZVE0RkZOaFpYcDZaQ2pQL3B6cEYrV0xsMVdSRitCbi9DYW85U2huR3pEZlRDOHlFaDIKK1R0cHQvbE5uR0dIUUJzbGFrTGM4amg1U09ERUZmYnVnWDhTZFRDd1pZc2VzS05yWG0xcFMvNUlFdW5QcWFSaTAKK0lJMEVjbnFIRXNncVNvK0NsanBXN3VOeFNyeUEydlNBVmRsUGVqNis5RlpqZElITFA1QUVLWXZrN2U5RDJDTVYKKzErZ3JOZS9Ra1FwcFNoaXpQaXJiYjkzdEhtODZ2NWJrREZDTTl5V3JoY01janZJTE1YRVR4SXBwTUdQbWFjUnUKK2pxdFljQUVDZ1lFQThWRHp5bFR6NGtTMytEM24zaFRnYjQxWFZZYTdmZVVzaDk5R1dSTzF3WElGcEhqQ0lSakEKKzlyL0JYVzkrUngzcHVWUGhTOGh3TFE0QkxkQTdsRnBWMUM4YWcwZTMrdm42elZpcm56MWp0SSt1SE12U3R6aE8KK2Q2aTBuZit3NEhZWG83bU42bzlaZEhFZkM4U0ZOYnltaENvVktoMkRJTER3YjRFWDlSWE5weTBDZ1lFQXhNajQKKyt2cmtsSi9pbEgrUnkxenN0NHpRWUl3bW0zUVdqYXJEcnlwR3VjSGdkNGpnNXY5QS9DSklLVWk4eDBNanJjdU4KK3dWYjdSOFhKeVl6RlFSWElVWFI2R25MZWVTbmZweHp0NFlsaWZDdlh4bk9pOHc0ZnY3S2VHQlY1bnAxRWdwbzgKK25XTnlaRnhkdlFEdUNvcHIzU1VvUzlKSThKUHdWZ0E3VCs3RGFRRUNnWUFHb2F2aGJvNDVOSnc5cFMzZkM0SFQKK2J2WHNjc1JxUkVjQ0FOL0ZDT2FneDBwaVo3TW1CN0VkMXMwd2pTVFNQWDh6eVp0U1l0SzZXajBzRGlIbEJNcUIKK0J6NWFSemxHRzJLS0RCckRTSU9aN2F6aU83T3h0MGxvdm1rZ1FtdVE3NDNjd1BlbWI0UU0wQ01EUnNaR1lNWE8KK3NmMWM1K3kzbEVVM096djJUMEFValFLQmdCbG56T1V5TVFLVEpjQ0FPOFZpaU5rbG45MW5HckRsS3VnOVRLZzMKK3NBdlpZTzV0eUlOcUh1eXVURnl3SEZjcGJ0aklOOVBuTStmUFBENytJcFZGaDZna2ZvTWRvMlZISjYyK2lXT2QKK3hnNDc1czZqTFQxdDdHRm1ZUXpBOFFPdVVDTUFZS1Q5S3M2VU1qSHRoYzNza3dKcEFxdlBTVVZ1QkJCR1ZXSDcKK2RGVUJBb0dCQUw2N0FSTHVqaUFFVk5IdDVyYWppeEI2bmNsNy9SK1oydWF3STFKZm1kbkNab25BS1ZaWUh1WFUKKy80ajIrbzRRaEpJUEx0V0lvYXhBa01pZ1F0QWtlc3Fpcm4zS2svYzdrWlJJb041NDlIVEp1d1pxWXFOcDdDQi8KK2tWaTVSMzM1K005ejQ5aTZxQTBSWnNKR1NvU0JrN1B1Zkc0Um1MaW1jUmJHd3JZOTNzUEQKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LnAxMiBiL3Rlc3Qva2V5cy9jbGllbnQucDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjY2OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LnAxMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LnBlbSBiL3Rlc3Qva2V5cy9jbGllbnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWY2MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LnBlbQpAQCAtMCwwICsxLDYwIEBACitCYWcgQXR0cmlidXRlcworICAgIGxvY2FsS2V5SUQ6IDM5IEVDIDNEIDVCIDI4IDE3IERBIEREIDA5IDdBIDYyIDY4IEQ1IDQ0IDFGIEM3IEUyIEY4IEUwIENEIAorc3ViamVjdD0vQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK2lzc3Vlcj0vQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAorVlFRSURBaE5ZWEo1YkdGdVpERVVNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSbworWlNCQmNHRmphR1VnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSbworY21sbWRERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeQorYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRVeE1qSXpNRGN3TnpVd1doY05NalF3TXpFd01EY3dOelV3V2pDQgorc1RFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbAorYzNRZ1NHbHNiREVuTUNVR0ExVUVDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dQorTVJZd0ZBWURWUVFMREExQmNHRmphR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaQorQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsL2JKaGcxN1B1MXQ3ODVKSXV3bGg3ZTJFNTFlb1dGdnV4TVdmSAorZHNVQVZxRGFPejk5TzVzdjhwZ1dLWHJrUEJ0dEU5OFQrTXgvUHd6NUpIczRRY3JlM0E1YWRtNmNkYWIwQUt1ZworZVZHMVB2SHJXelY0YWhlZzRLVWZWU2lNejhCRzJLM1ExVkd2WmtnTVJhL1E0MDlGS2pVNlo0RDl2Qkc0UGFzMworUE41RnhuQUw2UDcweVdDRXIyVnUvdFdKbENOK3FyUkRmU2FFMmhxbVQxaXJ4YW9QYTYxR3Z1UlZzR1EzVGVvRQorbUdmRU50dkZxQzZxUVd1U0NiRzVhSTQ3UnY2NnBxb1dXeHFrcmNvbE5jNyt2aHg2clcrd2RGTzNJbHFJVDhJRworc2RRVnArWTRpci9kR3AyZWp6cUdaQ3JlbVBKMXVFS2pMTXBJdWtkZzI1eW1IQzBDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJjUmR3YzltZFk5ek92VGl4dFRoSHJjaVZ2cXdwNlJhaVFxTUVWb21vellpbFpEUgorSjkwTTNINktubEFESmJDdjBGWHVqc2FBcEI1M2F3cTVJN3NPYkFZV0ZoREpaOUxLbHcwbERGN0tjaExYaUFsaworWFZ5dkwybkpqdUpjeFBDRlBXa3R3cnc1YlRndVJDQnpHMTJIemlrbit4czZ1UHVyN1ZRWU0zM2piWEVkYTVQUworVUVxdkFWV2FPTkpDWDhNRFlPc2NWb0pGMEVTeUkrZk45MmlwRmFYUjdmR2Fqb2QvcmMwQWZlTjJHVk1aRVR2ZQorMjFwa1V5RHd3Q0dBNDR1dk5VQ2QxZTMyTnhFM2FoOVVBcENSbjVzR0o2NFI2dXJwRlRYVDNJQUxGM2thT083VQorVnNNaEZyVWlaNytCdzVuSWVpSzBRT0Y2RWlwaitiSnZyTFpwU2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQmFnIEF0dHJpYnV0ZXMKKyAgICBsb2NhbEtleUlEOiAzOSBFQyAzRCA1QiAyOCAxNyBEQSBERCAwOSA3QSA2MiA2OCBENSA0NCAxRiBDNyBFMiBGOCBFMCBDRCAKK0tleSBBdHRyaWJ1dGVzOiA8Tm8gQXR0cmlidXRlcz4KKy0tLS0tQkVHSU4gRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KK01JSUZEakJBQmdrcWhraUc5dzBCQlEwd016QWJCZ2txaGtpRzl3MEJCUXd3RGdRSVJLb2w0MmJBUzNBQ0FnZ0EKK01CUUdDQ3FHU0liM0RRTUhCQWpPdWxjeUhNYVdzUVNDQk1nYmVYUThwSVlURU5LbTA4VVBlcXhrQ1Iybkx4U08KK2d0Um1CeERZanFZdjM1eTRLOEtoeWJCdlNCbElQZ0U1akVXeFVDY2MxUXZ5NXlkVVEvWDlwbWtVOGRubUFtREMKK28wendkM2x0MmVOUHkrNFdsaXFGRFZtSHJMZllRRk9vSXJIanV6QzBsSTRDMmlQT2p4aGZhMXpGdW1lZGd3R1MKK0d4MTBYNXVFVkg1TjY0Zlc2QjNCdnpRTTBybjJxcjBPTnVTUm10ZVJ0SThOc3puZmtnZUo5YTRDSUFGN0U1WjIKK0pUR0kxMmVkTnp6VUoxSmhYNDdaVzRtaVF3Q1U1TGN5MDFVWnFURnVVcG1LN0ZVUWVndEx5M2U1ZURLcStiSWcKK1pZcTZIeDdsdThoalQ1a1daR0t5NzFhWW1IS0VqSTBmNzI3Y0FicURURzV1WkJIQmp3Sy8zcC96blFWUVh4QmIKKzErRTlDaUtlRmRYajJFbHB0c25EeW9UdnJTd0ovSnF1MXdrWEJjSDVFbWJnN2FKTW9kMUlPczZPUUIxclBEdmQKK0ZGYTg0emJxUk5XSFN4eHhZWnhjQjhZWmluTDYvZFFKbmlzS3U5TE1RZDNCQkdzR1dxSDhaejV0RXZYalM1S3YKKzNnOUpSYTdRRGtTRjAwNXg2VStxLzY3OEcyTUcrVytOV3FqZTNOWng5UHNoL1B0bStoK3E5bjJHU3ZuaWJpSzUKK21FajlGSXdHcXVHcGJaVVRLNWFYSGNLTjY1N2RLaUlDc0VKZU5hcjFpWnpuUm16ck1iWkorRHhxSm5UdytHQXYKKzdZYjYzL0NOQXRxU3hpeU5IR1o2Tk0yWkE5dkFLWTFIWG4wUlZDMHkxKzlGbU5wU1J3djN1Lyt5ZFNDbkpvblIKK0dFS2p6T3FNOURuN3F4ZCtoNFVubkE3aFhXeElUYWdlQjZHNkttZmlYUnhoaVd5cXRPSUNkQ25lQ3dwcThVWjQKK2UwZm0wNU5SVzZNMm1xR1FIc01OU3ZUV2Rkd3o1Yjh3Z3c0ZVZzYit4UXl0eFZkajlscEJ1QjlLeWpRanhVZ1UKKzNvWng0S3lXTG9FV2prenRQQWlLM3V2NUdmb3ROSU1kem5SZk9OMSt4bTFNNXN3dG4zeTNSdTFmNlNUWkM3U3AKK3F2Ykc3alBtcEI1Z0xFVXJpK2NodythS1VZYkowYjgyME9kNEZMUVlud0xXcjQ2VmVsWW1WNDR4dVIwNndncVAKKzFIY2hNU3NIdFMrWmxJaVFRVTlqaGR5VHJsODZFUUhIMzNkaCtTdWE4QWhmZXdQUnkyVkZwM1prMzRBVXNXY1gKK0VmSVlHZW1ocVVEM2RyRzBTTVZiRkZOT2FGR3A5ZTB0UW91WU9DNi9xRkJ2L1NOZ1F6M21BRWtjaUpZYlV1VVoKK1Y0WVFQdnRkdlNySVNWMGU3YmpGZ2RTRWpHN1A3RjZDRnJXVHJqVWxIWnVXajYvckozKy8xUEhlSlZpeWhzckoKK1pZRmUxNFcvNDhQRHhCUmw0SUVBbXhjTjFFYjJFejllQ3F2MEhXNzdIdmlHNnpJZ25rUHJoV0hqRkdVcHhLazQKK2pMZnVCMlRmcTlGN296djRMMlFBbitGL3lLdDFSbTJIaDVKNjFlVUp0QVQ2MHBhamcrZ0p0am1wdTVQcjRIRG4KK2I2cDN4bVl3YUw1TGV0MXpDQWJiTWZkbERLMTRZamRPZE0vQkVLcFhiOXk0RUl1Ylg1QU1ZNGxqWGVHOWd4K1QKK0IxVHVRVmRKMFA1d0lLL0QxMFRRekFXREthbTBrdjNSWGlkbHpSeHBaM3NuUm5OL0wzRVZkNThSbnRqMU9jMHkKK0ZpSWlTS1JzekRiUHpLRHhRRTJzTmdRY2RPMjRKTkxTYS9zWll0cTJnUmdzcGwvWXFJRG80WllxaTl4OEY1T1MKK3JkUFU1RC9IOExXUjR2cEpMTDhEWXJIaDVxRkczQlgyT0pJaFBSUys0OHBEWXRyUmpwN1MvMVpVNjRPSkF5dGsKKzk5aERxU3JuMWoyYTZ5RkU4TDJQdHorNFVDRjJPUVhFYzlScXFlYjhRRVV1TVNrTkg0b1ErQTJGNnV6THBaaTAKK1hINjRSMm5pTkM1Nkx4VjJpKzNUNUtSRUZMYWh5azhlcExabHY4WWR4WVI0U2I3Si81eWlvb0szZzlobVlWS08KK3pMYz0KKy0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50X3YzLmNydCBiL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2YxNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50X3YzLmNydApAQCAtMCwwICsxLDI0IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVDRENDQXZDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0VUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psYzNRZ1NHbHNiREVuTUNVR0ExVUUKK0Nnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1TVJZd0ZBWURWUVFMREExQmNHRmoKK2FHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpQmdrcWhraUc5dzBCQ1FFV0ZXUmwKK2RrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6QWVGdzB4TmpBeU1qSXhNVFU0TkRGYUZ3MHlOREExTVRBeE1UVTQKK05ERmFNSUdMTVFzd0NRWURWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY00KK0MwWnZjbVZ6ZENCSWFXeHNNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWsKK1lYUnBiMjR4RmpBVUJnTlZCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXoKK2REQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxaMHdpUW5YZzVRTVpaV3VnZC8KK08zd29hdHlIdWN6SnVGU21ZaVJHV0xyM1B1Z0IreHR2ankwclRjRTJNTngvYmRzVnhyYXBDS0ErdE1GT1JiRWwKK3NGNmprMEgrQjdCekdvSXdIcjZOOEdQMVZPb0EyZXNyaHNORXoyMmFKSTAwVmFGVEZFOEcvcWdGY2loeWFWV0gKK1pzTGEzTWFrT3pGVW1PQmFWMnRMQmpDamF6bnFYdzNlbzNYd1VJMEJrZ1M5Yjl2cVhqU2NtZldYRHc1KzFpczQKK2JDZ3VtRzJ6ajlFcEx5cGM5cUNHTktGQk8yWUlnMFhzSUlKOFJwcmxpYW5qTDZQNE1mQzZHUE95VzROYlphTGQKK0VTdi9idW1wVnl1Vi9DL3hxa1BhaHZPd0J1UEUxbG94WlpQeDZRdjM2OHFuN1NWTlZaT0x5WDcyMnNwb29BNUcKKzZjc0NBd0VBQWFOUE1FMHdDUVlEVlIwVEJBSXdBREFMQmdOVkhROEVCQU1DQmVBd013WURWUjBSQkN3d0tvY0UKK2Z3QUFBWWNRQUFBQUFBQUFBQUFBQUFBQUFBQUFBWWNRQUFBQUFBQUFBQUFBQVAvL2Z3QUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCVUVtZVFrRy9QUzkzNWpNSERyZy81em00WDJ4cm5GdG1Ud2IwamR4ZmF1NnovN2gKK0FieEQ1aW95WTdGVVROQ3pJNlN5TW85dkpKdFlDVEN1RUdyODRKalQyUjcyMzJ6NjBrNGMxei9hdjAxVzNPcnYKK0V4SGZBWjhsbGhrZnUwMjA5VDVUYUlZQ0I3aERGajVLRGJ0YThjNmZFY3d0bWxIUVdqM00zMWxTTnNyNFp0V1cKK3dPYmhLM3NxVHNPbHVIYmhLTndsTkVhdDQ4bGJPUVVDMTlJMVdpM2RBUzZuOGxyMGxFaGZHS3ZxeHUwVmlBU1MKK04xbkxmZGtSRUdwMzliWXBLZzBuNkVGdzViWXlWNHFFM2NuSWVkRkpwN05JT00vNnhuZEpNaC9jNWw2TjJ1eVoKK3VwQXJSUXB3LzNqK0hrTDF4OWJzKzkwMFFLMEdJNkF4Z2pib3BBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5IGIvdGVzdC9rZXlzL2NsaWVudF92My5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4OWY3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5CkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUVwQUlCQUFLQ0FRRUF0blRDSkNkZURsQXhsbGE2QjM4N2ZDaHEzSWU1ek1tNFZLWmlKRVpZdXZjKzZBSDcKK0cyK1BMU3ROd1RZdzNIOXQyeFhHdHFrSW9ENjB3VTVGc1NXd1hxT1RRZjRIc0hNYWdqQWV2bzN3WS9WVTZnRFoKKzZ5dUd3MFRQYlpva2pUUlZvVk1VVHdiK3FBVnlLSEpwVllkbXd0cmN4cVE3TVZTWTRGcFhhMHNHTUtOck9lcGYKK0RkNmpkZkJRalFHU0JMMXYyK3BlTkp5WjlaY1BEbjdXS3poc0tDNlliYk9QMFNrdktsejJvSVkwb1VFN1pnaUQKK1Jld2dnbnhHbXVXSnFlTXZvL2d4OExvWTg3SmJnMXRsb3QwUksvOXU2YWxYSzVYOEwvR3FROXFHODdBRzQ4VFcKK1dqRmxrL0hwQy9mcnlxZnRKVTFWazR2SmZ2YmF5bWlnRGticHl3SURBUUFCQW9JQkFRQ0pweVVoYWFJSVluQkcKKzREK1JrR2dzajhHdmg2YWgzajUzZnQva1JqNkRNQzRCbEIwQzRmTy9QRUI1V0kwY2pmY3Zwd280bk9hcEh5WDQKK0FUbUxJTWdqWG4ybStDU005d28wMW1FYm1yS1dkMjBNN245NmNXaEd3ZzlNdlZKK1JkR2sySzBsd2owMlBvV1cKK0JsdDU3NkdUdU5OLytqKytRL2ppcXNYeGFMVE8wL1dqKzRiMmdRaDNuOEkwdTZia29sRExvRVJLSWRyTEdISCsKK0ZVM3NrOGJwVWhIbWVpVVRmd3djaStqdWh0T1k5ZTMwQUVzdDZ4YWtDSGJxMWxSUnlFWVB0V0w3b0xkczZ5djAKK1VBS1A3d1M5WWw2ZGNla1hTRjFSWnBCK2ZvdlRXK3FQWW44YUV1a3NhTXowd0s5NkZDT2pWTkdZeE1wK1hudmwKK3NLeDYzVVpCQW9HQkFPQ2JDYkp0TzBIc2dJYXV2Q3ZHWjUwYVoxdkR2UVJlQ3dyaTRpb3V0RWc0SkNBWEhFc1gKKytheHoySjVqM1VFUWhHS3IwRVg5Qkc2WWJ4R1cwTW1qZjNReGVSQiswV0xwTU1ZMlNGdDkzb0MyUjFBWDlsMEkKK2g1ME82dFl2NVNYbTk2cEt4d1J6MDFkODRtQ0pnd24vRytjWi9FSmo0cmZac05iUXN0NkpRRnZ6QW9HQkFNLzEKK2dMVlF0NWwrSUsrNnM2OEVuQURJNjZpN2NLZTZzajNyRlJUYWhaSnhMMnZZMjhKOUVCMm1GL1hFZ0FSU05KUVYKK1gvSDl6RHJ3S205TVg4Ny9lQ0gybkViYys1cVNHcERQUW00ODJDOURxc01pdHhDS0Q4YmJsZTFCbHBqRmI4aHIKK1IwUTN2NXE4dTV1b21MQmRzNWVVQmVSS010dTl0T01BOUtSU0RHakpBb0dBRjQ0SzJVeDlUMitYRndqU01TRVEKK2tyaEhLS2VCZGlqS3JheVhuV2JpZjBSci9YV1BBUTBWb1JGUklXTkZ1K0lZa0NTR3BpQmZ5NTF1NElCWml4djcKK2JOc1hZRFI4and2M2tvSDAycXQ3bnpIK2pwYkV2b0w3ZmV3bmtxalpOajFmc2RzL3ZlYkx2andablpndVJ1a2IKK0t3UmRvVFRLZlE5MmJVRGIwVnpCaENNQ2dZQjdIKzNPYkRYb0NRY3RSQ3N5aWxZYkdOcCtFa3hHNG9DNXJEL1YKK0V2UldtZkRydDMrVmpScEhrNWxJQjhtTHhXZ2Y3Ty9iaE5xd1lwV2RRK2pOMCsrNm5CbzIwb3VkSHJmZjJQYUoKKzhqaEU4NWxjNDJiandmcEpVS1ZaemFWdVdpY3UwR1ZuZkdKVEtUOGlrQlduQmpOWW9XbERtcksxNjRIM2pROUwKK1l0QzZFUUtCZ1FDYWJGWFhIeDVjSUoyWE9tNEsvblRPRzdDbHZEODB4YXBxeUdyb1FkOUUvY0pVSEhQcC93UTQKK2MxZE1PNUVWaU03SlJzS2Z4a2w5dk01bzlJTTdzd2xZaDRFTUZTTEpOanpnT1k5WFZrdlFoMHVHYmlKT0JPNGYKK2luVXVXbjFZV1VqL0hGdHJUKzBObytjWXZaVmNNS3JGQXkzSy9Bd3BUYmZLQ2s2cm91bGxOQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL3NlcnZlci5jcnQgYi90ZXN0L2tleXMvc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL3NlcnZlci5jcnQKQEAgLTAsMCArMSwyNSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5IGIvdGVzdC9rZXlzL3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5CkBAIC0wLDAgKzEsMjggQEAKKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcUU5VEU5d0VYcDVMUgordExRVkRTR1FHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeQorU044STJYdzZMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSAoraktOZzZaS2cyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQgorR21abU1JVXdBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYawordTYyTGlwa1h3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbQordHJoVlFGNG5BZ01CQUFFQ2dnRUFXL3k1MllZVzZ5cFJPR2JaOTREUXBGVjBrTE83cVQ4cTBLc3h3NXNQTmFJdAorZkVQUkl5bURhOGlreUhXSlM1T3htdzg0d281am5KVjI2amFMbXdlMkx1cHE3WGYxbHFlajhmNUxKdHV2N2NRUgoreGZ6cDF2TTY1S0pGRkpIcDZXcWpHcUo2SFNTWk9wVkRzblFZY1hRalFDZHB5QW1hU1dkM3ArRnFZU1oxbVFtRAorYkZOSTdqcXBjeldTWmhUZG90UTdwN0huOVRWQ2VoZmxQM3lHSUIzYlErd0NjQ0I4NWRPQnoyMDFMK1lnYUljaworU3o0M0E0TnZXYVFJUkxSRHc3czlHVzRqWTVUMEp2MjgyV0llQWxWcFZ4TEl3dTQ4cjRSNHlHVEl4OVlkb3d2cQorNTcrWTVpUFBqQVh4dTBWOXQwMG9TM2JZeERhS2gyRFVmYy81em93cThRS0JnUURZTlZQWG1hRzBhSUg0dmpROQorN2ZSZHcvVURrWWNRYm42Q25nbFFPdTc3L1M4b2dRenBLQ1ZKZ0pna1pOcU9WdFFNRVB6ZWtHRWNMVGJqZTFnVQorOEJreTJrK1BMOVV3YkZ5MGVtbk9WaDRycXJOWEhzUnZKY2VoTlQvUFJiNWhqRjNNVU1GVi8waUQ0YituYUZhRQoranJTV2laMlpYajJxZndBSzUyR0ZidE91QlFLQmdRREpZUXVHaVkwcjIyRTR3YUptQ1NLY3pvQlQzY3dsVnpXagorVjJsamdBOVJITE5UVmt2Tk5ZUUxHdTJxbmdGcnR3cGVhU25zTURlclZHNHdLQVFXeUNuWXp4VnJsbkM0dURySgorSFh1RkVsdEJXaTlGZmJnZnNuZDM3NDlBVDBvQlAxTlQydE1sZWd1eWY1REZnakNSM1ZSSkxkclZhYVo4cm93LworTHFLY0ZNcW5Pd0tCZ0IrT0lPOTlsN0U1ODRZM1ZHNlpkU25lT0x0Tm1SWFgycFQ3dGNaRTQ2NVpkSEdIN0RkMworU1lIaHg5Sy8rWG4reURIK3BMbGkveGxhckFFbGRtU1A2azJXdVRmZnRsQzc4QWZUT2ZBSWQ1ek43Q0RSOTc5MQorRng2N0k5WC9pdHEzM3RTOEVJdVpsNTdQNnVYbS80R1hSbG9XT2E4eHB2UmtWc0JBcHVZUGw4dDFBb0dBVFFEUworeTJzbGxET2JCWHpsZ0diVjJXZ05JZ1NaMzExdG9UdjNqSmlYUXNqYXVXOHlKUkhsbitsNEg5bXphV0Rna2lGYworYW5nMWtVb0RxRjVrMGVGUVB4dFFjWWRoS3dFbldXZndwMzNSYnpmeEEzMkRQbnVidXp6YlpoZnJrSGFLZ25JVworY3lvcjl1RllsbTJsN09EWkxmSmV6MlJLeVRwbFhuT1NzbVF3NmFrQ2dZQXozZGo5SHNreWorSFZKK2h0MU9jRQorYzdhaS9FU2tTQTdWYWpwMHRqSnAwRUtqVy96cThEdlVTWE90Y2RuSmdrS3ljRmx1THdibW5hTjR0eEJkczFDMQorUXI4UnQyc1VDQ0JOWmUxTDZESGUzWEJkYmtKZTlzZ1pWTlRqdFVTUXJ6eThVaHZzQ3FHNFlXZUN1MDdTemNiYworcmRQVVY5L3VRa2R4OFZyU2h4bEQ4QT09CistLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLnAxMiBiL3Rlc3Qva2V5cy9zZXJ2ZXIucDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTA4YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLnAxMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLnBlbSBiL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWE5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLnBlbQpAQCAtMCwwICsxLDUzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbiBiL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIyYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCkBAIC0wLDAgKzEsNDk0IEBACitbCisgICJjX2dsaWItcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpX2ZyYW1lZC1pcCIsCisgICJjbC1nb19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtZ29fYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfbXVsdGktYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX2pzb25faHR0cC1pcCIsCisgICJjcHAtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpaC1oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY2xfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtY2xfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLWNwcF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAiLAorICAiZC1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWRfanNvbl9odHRwLWlwIiwKKyAgImQtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZGFydF9qc29uX2h0dHAtaXAiLAorICAiZC1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1nb19qc29uX2h0dHAtaXAiLAorICAiZC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2pzb25faHR0cC1pcCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiZC1ub2RlanNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9odHRwLWlwIiwKKyAgImQtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25faHR0cC1pcCIsCisgICJkLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiZXJsLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2pzb25faHR0cC1pcCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1kX2pzb25faHR0cC1pcCIsCisgICJnby1kX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tcHkzX2JpbmFyeS1hY2NlbF96bGliLWlwLXNzbCIsCisgICJnby1weTNfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5X2NvbXBhY3QtYWNjZWxjX3psaWItaXAtc3NsIiwKKyAgImhzLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiaHMtY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiaHMtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiaHMtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZGFydF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJub2RlanMtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInBlcmwtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAicGVybC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJweS1jcHBfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9qc29uX2h0dHAtaXAiLAorICAicHktY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktZF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1kX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1kX2pzb25faHR0cC1pcCIsCisgICJweS1kX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktZGFydF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweS1oc19hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1oc19hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1oc19oZWFkZXJfaHR0cC1pcCIsCisgICJweS1oc19qc29uX2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2pzb25faHR0cC1pcCIsCisgICJweS1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktbHVhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWx1YV9qc29uX2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfaGVhZGVyX2h0dHAtaXAiLAorICAicHkzLWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9qc29uX2h0dHAtaXAiLAorICAicHkzLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAiLAorICAicHkzLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtZGFydF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZGFydF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZGFydF9qc29uX2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1oc19oZWFkZXJfaHR0cC1pcCIsCisgICJweTMtaHNfanNvbl9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtbHVhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1sdWFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfanNvbl9odHRwLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWRvbWFpbiIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAicmItY3BwX2pzb25fZnJhbWVkLWRvbWFpbiIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAiLAorICAicmItY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIKK10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2x1YS9NYWtlZmlsZS5hbSBiL3Rlc3QvbHVhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGM1YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1YS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworIyBSZW1vdmUgIk1hcFR5cGUgPSIgbGluZSB0byBpZ25vcmUgc29tZSBtYXAgYnVnIGZvciBub3cKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gbHVhICQ8CisJJChTRUQpIC1pLmJhayAncy9NYXBUeXBlID0vL2cnIGdlbi1sdWEvVGhyaWZ0VGVzdF90dHlwZXMubHVhCisJJChSTSkgZ2VuLWx1YS9UaHJpZnRUZXN0X3R0eXBlcy5sdWEuYmFrCisKK3ByZWNyb3NzOiBzdHVicworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tbHVhCmRpZmYgLS1naXQgYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkOGQwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQpAQCAtMCwwICsxLDE3OSBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQorcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKK3JlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCityZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKKworbG9jYWwgY2xpZW50CisKK2Z1bmN0aW9uIHRlYXJkb3duKCkKKyAgaWYgY2xpZW50IHRoZW4KKyAgICAtLSBjbG9zZSB0aGUgY29ubmVjdGlvbgorICAgIGNsaWVudDpjbG9zZSgpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIGFzc2VydEVxdWFsKHZhbDEsIHZhbDIsIG1zZykKKyAgYXNzZXJ0KHZhbDEgPT0gdmFsMiwgbXNnKQorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY0NsaWVudChyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKKyAgbG9jYWwgc29ja2V0ID0gVFNvY2tldDpuZXd7CisgICAgcG9ydCA9IHRvbnVtYmVyKG9wdC5wb3J0KQorICB9CisgIGFzc2VydChzb2NrZXQsICdGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCBzb2NrZXQnKQorICBzb2NrZXQ6c2V0VGltZW91dCg1MDAwKQorCisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnQsCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0gfj0gbmlsKQorICBsb2NhbCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3sKKyAgICB0cmFucyA9IHNvY2tldCwKKyAgICBpc1NlcnZlciA9IGZhbHNlCisgIH0KKworICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sLAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sLAorICAgIGpzb24gPSBUSlNPTlByb3RvY29sLAorICB9CisgIGFzc2VydChwcm90b2NvbHNbb3B0LnByb3RvY29sXSB+PSBuaWwpCisgIGxvY2FsIHByb3RvY29sID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3eworICAgIHRyYW5zID0gdHJhbnNwb3J0CisgIH0KKyAgYXNzZXJ0KHByb3RvY29sLCAnRmFpbGVkIHRvIGNyZWF0ZSBiaW5hcnkgcHJvdG9jb2wnKQorCisgIGNsaWVudCA9IFRocmlmdFRlc3RDbGllbnQ6bmV3eworICAgIHByb3RvY29sID0gcHJvdG9jb2wKKyAgfQorICBhc3NlcnQoY2xpZW50LCAnRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQnKQorCisgIC0tIE9wZW4gdGhlIHRyYW5zcG9ydAorICBsb2NhbCBzdGF0dXMsIF8gPSBwY2FsbCh0cmFuc3BvcnQub3BlbiwgdHJhbnNwb3J0KQorICBhc3NlcnQoc3RhdHVzLCAnRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyJykKKworICAtLSBTdHJpbmcKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJpbmcoJ2xhbGEnKSwgICdsYWxhJywgICdGYWlsZWQgdGVzdFN0cmluZycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0U3RyaW5nKCd3YWhvbycpLCAnd2Fob28nLCAnRmFpbGVkIHRlc3RTdHJpbmcnKQorCisgIC0tIEJvb2wKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCb29sKHRydWUpLCB0cnVlLCAnRmFpbGVkIHRlc3RCb29sIHRydWUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJvb2woZmFsc2UpLCBmYWxzZSwgJ0ZhaWxlZCB0ZXN0Qm9vbCBmYWxzZScpCisKKyAgLS0gQnl0ZQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHgwMSksIDEsICAgICdGYWlsZWQgdGVzdEJ5dGUgMScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDQwKSwgNjQsICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSAyJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4N2YpLCAxMjcsICAnRmFpbGVkIHRlc3RCeXRlIDMnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg4MCksIC0xMjgsICdGYWlsZWQgdGVzdEJ5dGUgNCcpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweGJmKSwgLTY1LCAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA1JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4ZmYpLCAtMSwgICAnRmFpbGVkIHRlc3RCeXRlIDYnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMTI4KSwgLTEyOCwgICdGYWlsZWQgdGVzdEJ5dGUgNycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgyNTUpLCAtMSwgICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA4JykKKworICAtLSBJMzIKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHgwMDAwMDAwMSksIDEsICAgICAgICAgICAnRmFpbGVkIHRlc3RJMzIgMScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4NDAwMDAwMDApLCAxMDczNzQxODI0LCAgJ0ZhaWxlZCB0ZXN0STMyIDInKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDdmZmZmZmZmKSwgMjE0NzQ4MzY0NywgICdGYWlsZWQgdGVzdEkzMiAzJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHg4MDAwMDAwMCksIC0yMTQ3NDgzNjQ4LCAnRmFpbGVkIHRlc3RJMzIgNCcpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4YmZmZmZmZmYpLCAtMTA3Mzc0MTgyNSwgJ0ZhaWxlZCB0ZXN0STMyIDUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweGZmZmZmZmZmKSwgLTEsICAgICAgICAgICdGYWlsZWQgdGVzdEkzMiA2JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMjE0NzQ4MzY0OCksIC0yMTQ3NDgzNjQ4LCAnRmFpbGVkIHRlc3RJMzIgNycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDQyOTQ5NjcyOTUpLCAtMSwgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STMyIDgnKQorCisgIC0tIEk2NCAobHVhIG9ubHkgc3VwcG9ydHMgMTYgZGVjaW1hbCBwcmVjaXNpb24gc28gbGFyZ2VyIG51bWJlcnMgYXJlCisgIC0tIGluaXRpYWxpemVkIGJ5IHRoZWlyIHN0cmluZyB2YWx1ZSkKKyAgbG9jYWwgbG9uZyA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoMHgwMDAwMDAwMDAwMDAwMDAxKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygxKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgMScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoMHg0MDAwMDAwMDAwMDAwMDAwKSksCisgICAgICAgICAgICAgICAgICAgbG9uZyg0NjExNjg2MDE4NDI3Mzg3OTA0KSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgMicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKCc5MjIzMzcyMDM2ODU0Nzc1ODA3JyksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDMnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKDB4ODAwMDAwMDAwMDAwMDAwMCkpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCA0JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygnMHhiZmZmZmZmZmZmZmZmZmZmJykpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoJy00NjExNjg2MDE4NDI3Mzg3OTA1JyksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKCcweGZmZmZmZmZmZmZmZmZmZmYnKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygtMSksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDYnKQorCisgIC0tIERvdWJsZQorICBhc3NlcnRFcXVhbCgKKyAgICAgIGNsaWVudDp0ZXN0RG91YmxlKDEuMjM0NTY3ODkpLCAxLjIzNDU2Nzg5LCAnRmFpbGVkIHRlc3REb3VibGUgMScpCisgIGFzc2VydEVxdWFsKAorICAgICAgY2xpZW50OnRlc3REb3VibGUoMC4xMjM0NTY3ODkpLCAwLjEyMzQ1Njc4OSwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDInKQorICBhc3NlcnRFcXVhbCgKKyAgICAgIGNsaWVudDp0ZXN0RG91YmxlKDAuMTIzNDU2Nzg5KSwgMC4xMjM0NTY3ODksICdGYWlsZWQgdGVzdERvdWJsZSAzJykKKworICAtLSBUT0RPIHRlc3RCaW5hcnkoKSAuLi4KKwkgIAorICAtLSBBY2N1cmFjeSBvZiAxNiBkZWNpbWFsIGRpZ2l0cyAocm91bmRzKQorICBsb2NhbCBhLCBiID0gMS4xMjM0NTY3ODkwNjY2NjY2MywgMS4xMjM0NTY3ODkwNjY2NjY2MQorICBhc3NlcnRFcXVhbChhLCBiKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdERvdWJsZShhKSwgYiwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDUnKQorCisgIC0tIFN0cnVjdAorICBsb2NhbCBvID0gWHRydWN0Om5ld3sKKyAgICBzdHJpbmdfdGhpbmcgPSAnWmVybycsCisgICAgYnl0ZV90aGluZyA9IDEsCisgICAgaTMyX3RoaW5nID0gLTMsCisgICAgaTY0X3RoaW5nID0gbG9uZygtNSkKKyAgfQorICBsb2NhbCByID0gY2xpZW50OnRlc3RTdHJ1Y3QobykKKyAgYXNzZXJ0RXF1YWwoby5zdHJpbmdfdGhpbmcsIHIuc3RyaW5nX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMScpCisgIGFzc2VydEVxdWFsKG8uYnl0ZV90aGluZywgci5ieXRlX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMicpCisgIGFzc2VydEVxdWFsKG8uaTMyX3RoaW5nLCByLmkzMl90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDMnKQorICBhc3NlcnRFcXVhbChvLmk2NF90aGluZywgci5pNjRfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCA0JykKKworICAtLSBUT0RPIGFkZCBsaXN0IG1hcCBzZXQgZXhjZXB0aW9uIGV0YyBldGMKK2VuZAorCit0ZXN0QmFzaWNDbGllbnQoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDJkNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKQEAgLTAsMCArMSwxNDIgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZXF1aXJlKCdUaHJpZnRUZXN0X1RocmlmdFRlc3QnKQorcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQorcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKK3JlcXVpcmUoJ1RTZXJ2ZXInKQorcmVxdWlyZSgnbGlibHVhbG9uZ251bWJlcicpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBIYW5kbGVyCitUZXN0SGFuZGxlciA9IFRocmlmdFRlc3RJZmFjZTpuZXd7fQorCistLSBTdG9wcyB0aGUgc2VydmVyCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0Vm9pZCgpCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdFN0cmluZyhzdHIpCisgIHJldHVybiBzdHIKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0Qm9vbChib29sKQorICByZXR1cm4gYm9vbAorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCeXRlKGJ5dGUpCisgIHJldHVybiBieXRlCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEkzMihpMzIpCisgIHJldHVybiBpMzIKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0STY0KGk2NCkKKyAgcmV0dXJuIGk2NAorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3REb3VibGUoZCkKKyAgcmV0dXJuIGQKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0QmluYXJ5KGJ5KQorICByZXR1cm4gYnkKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RydWN0KHRoaW5nKQorICByZXR1cm4gdGhpbmcKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVGVzdAorbG9jYWwgc2VydmVyCisKK2Z1bmN0aW9uIHRlYXJkb3duKCkKKyAgaWYgc2VydmVyIHRoZW4KKyAgICBzZXJ2ZXI6Y2xvc2UoKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBwYXJzZUFyZ3MocmF3QXJncykKKyAgbG9jYWwgb3B0ID0geworICAgIHByb3RvY29sPSdiaW5hcnknLAorICAgIHRyYW5zcG9ydD0nYnVmZmVyZWQnLAorICAgIHBvcnQ9JzkwOTAnLAorICB9CisgIGZvciBpLCBzdHIgaW4gcGFpcnMocmF3QXJncykgZG8KKyAgICBpZiBpID4gMCB0aGVuCisgICAgICBrLCB2ID0gc3RyaW5nLm1hdGNoKHN0ciwgJy0tKCV3Kyk9KCV3KyknKQorICAgICAgYXNzZXJ0KG9wdFtrXSB+PSBuaWwsICdVbmtub3duIGFyZ3VtZW50JykKKyAgICAgIG9wdFtrXSA9IHYKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBvcHQKK2VuZAorCitmdW5jdGlvbiB0ZXN0QmFzaWNTZXJ2ZXIocmF3QXJncykKKyAgbG9jYWwgb3B0ID0gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIC0tIEhhbmRsZXIgJiBQcm9jZXNzb3IKKyAgbG9jYWwgaGFuZGxlciA9IFRlc3RIYW5kbGVyOm5ld3t9CisgIGFzc2VydChoYW5kbGVyLCAnRmFpbGVkIHRvIGNyZWF0ZSBoYW5kbGVyJykKKyAgbG9jYWwgcHJvY2Vzc29yID0gVGhyaWZ0VGVzdFByb2Nlc3NvcjpuZXd7CisgICAgaGFuZGxlciA9IGhhbmRsZXIKKyAgfQorICBhc3NlcnQocHJvY2Vzc29yLCAnRmFpbGVkIHRvIGNyZWF0ZSBwcm9jZXNzb3InKQorCisgIC0tIFNlcnZlciBTb2NrZXQKKyAgbG9jYWwgc29ja2V0ID0gVFNlcnZlclNvY2tldDpuZXd7CisgICAgcG9ydCA9IG9wdC5wb3J0CisgIH0KKyAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgc2VydmVyIHNvY2tldCcpCisKKyAgLS0gVHJhbnNwb3J0ICYgRmFjdG9yeQorICBsb2NhbCB0cmFuc3BvcnRzID0geworICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnRGYWN0b3J5LAorICB9CisgIGFzc2VydCh0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdLCAnRmFpbGVkIHRvIGNyZWF0ZSBmcmFtZWQgdHJhbnNwb3J0IGZhY3RvcnknKQorICBsb2NhbCB0cmFuc19mYWN0b3J5ID0gdHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XTpuZXd7fQorICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKKyAgICBjb21wYWN0ID0gVENvbXBhY3RQcm90b2NvbEZhY3RvcnksCisgICAganNvbiA9IFRKU09OUHJvdG9jb2xGYWN0b3J5LAorICB9CisgIGxvY2FsIHByb3RfZmFjdG9yeSA9IHByb3RvY29sc1tvcHQucHJvdG9jb2xdOm5ld3t9CisgIGFzc2VydChwcm90X2ZhY3RvcnksICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCBmYWN0b3J5JykKKworICAtLSBTaW1wbGUgU2VydmVyCisgIHNlcnZlciA9IFRTaW1wbGVTZXJ2ZXI6bmV3eworICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvciwKKyAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBzb2NrZXQsCisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHRyYW5zX2ZhY3RvcnksCisgICAgcHJvdG9jb2xGYWN0b3J5ID0gcHJvdF9mYWN0b3J5CisgIH0KKyAgYXNzZXJ0KHNlcnZlciwgJ0ZhaWxlZCB0byBjcmVhdGUgc2VydmVyJykKKworICAtLSBTZXJ2ZQorICBzZXJ2ZXI6c2VydmUoKQorICBzZXJ2ZXIgPSBuaWwKK2VuZAorCit0ZXN0QmFzaWNTZXJ2ZXIoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+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/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDY0IEBACivvu79NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAiezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezUyQ0U5QTEyLUY2Q0ItNEYwQy1CQjQyLTAxMDU2MTJGNUZGNH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5zaCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sIGIvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbAppbmRleCAzZjVjOWVlLi5lZmUwZjRiIDEwMDY0NAotLS0gYS90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sCisrKyBiL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwKQEAgLTM2LDYgKzM2LDcgQEAKICAgbWV0aG9kIHRlc3RJMzIgeCA9IHAgInRlc3RJMzIoJWQpXG4iIChzb2QgeCk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RJNjQgeCA9IHAgInRlc3RJNjQoJXMpXG4iIChJbnQ2NC50b19zdHJpbmcgKHNvZCB4KSk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3REb3VibGUgeCA9IHAgInRlc3REb3VibGUoJWYpXG4iIChzb2QgeCk7IChzb2QgeCkKKyAgbWV0aG9kIHRlc3RCaW5hcnkgeCA9IHAgInRlc3RCaW5hcnkoJXMpXG4iIChzb2QgeCk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RTdHJ1Y3QgeCA9IHAgInRlc3RTdHJ1Y3QoLS0tKVxuIjsgKHNvZCB4KQogICBtZXRob2QgdGVzdE5lc3QgeCA9IHAgInRlc3ROZXN0KC0tLSlcbiI7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RNYXAgeCA9IHAgInRlc3RNYXAoLS0tKVxuIjsgKHNvZCB4KQpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL01ha2VmaWxlIGIvdGVzdC9wZXJsL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ4MWQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvcGVybC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIERlZmF1bHQgdGFyZ2V0IGlzIGV2ZXJ5dGhpbmcKLXRhcmdldDogYWxsCi0KLSMgVG9vbHMKLVRIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotYWxsOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBwZXJsIC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0KLWNsZWFuOgotCSQoUk0pIC1yIGdlbi1wZXJsCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUuYW0gYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1YjlhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NoZWNrOiBzdHVicworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tcGVybAorCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbCBiL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWY4MGQ0Ni4uOTZlM2JlYwotLS0gYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAorKysgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApAQCAtMTksMTAgKzE5LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiB1c2UgRGF0YTo6RHVtcGVyOwordXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKIHVzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOwogCiB1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwpAQCAtMzAsMTA0ICszMSwyMjcgQEAKIAogdXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdDo6U29ja2V0OwogdXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6U1NMU29ja2V0OwordXNlIFRocmlmdDo6U29ja2V0OwordXNlIFRocmlmdDo6VW5peFNvY2tldDsKIAordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7CiB1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKIHVzZSBUaHJpZnRUZXN0OjpUeXBlczsKIAogJHwrKzsKIAotbXkgJGhvc3QgPSAnbG9jYWxob3N0JzsKLW15ICRwb3J0ID0gOTA5MDsKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgPDwiRU9GIjsKK1VzYWdlOiAkMCBbT1BUSU9OU10KIAorT3B0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0KQorICAtLWNhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQSB0byB2YWxpZGF0ZSBzZXJ2ZXIgd2l0aC4KKyAgLS1jZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgdG8gdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KKyAgLS1jaXBoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0YWJsZSBjaXBoZXIgbGlzdC4KKyAgLS1kb21haW4tc29ja2V0IDxmaWxlPiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgdW5peCBkb21haW4gc29ja2V0LgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHVzYWdlLgorICAtLWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBrZXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLXBvcnQgPHBvcnRudW0+ICAgICAgICAgICAgICAgIDkwOTAgICAgICAgICBQb3J0IHRvIHVzZS4KKyAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgorICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NMLgorICAtLXRyYW5zcG9ydCB7YnVmZmVyZWR8ZnJhbWVkfSAgIGJ1ZmZlcmVkICAgICBUcmFuc3BvcnQgdG8gdXNlLgogCi1teSAkc29ja2V0ID0gbmV3IFRocmlmdDo6U29ja2V0KCRob3N0LCAkcG9ydCk7CitFT0YKK30KIAotbXkgJGJ1ZmZlcmVkU29ja2V0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7Ci1teSAkdHJhbnNwb3J0ID0gJGJ1ZmZlcmVkU29ja2V0OwotbXkgJHByb3RvY29sID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci1teSAkdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CitteSAlb3B0cyA9ICgKKyAgICAncG9ydCcgPT4gOTA5MCwKKyAgICAncHJvdG9jb2wnID0+ICdiaW5hcnknLAorICAgICd0cmFuc3BvcnQnID0+ICdidWZmZXJlZCcKKyk7CiAKLWV2YWx7Ci0kdHJhbnNwb3J0LT5vcGVuKCk7Ci19OyBpZigkQCl7CitHZXRPcHRpb25zKFwlb3B0cywgcXcgKAorICAgIGNhPXMKKyAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBrZXk9cworICAgIGRvbWFpbi1zb2NrZXQ9cworICAgIGhlbHAKKyAgICBob3N0PXMKKyAgICBwb3J0PWkKKyAgICBwcm90b2NvbD1zCisgICAgc3NsCisgICAgdHJhbnNwb3J0PXMKKykpIHx8IGV4aXQgMTsKKworaWYgKCRvcHRze2hlbHB9KSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDA7Cit9CisKK215ICRzb2NrZXQgPSB1bmRlZjsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJHNvY2tldCA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRvcHRzeydkb21haW4tc29ja2V0J30pOworfQorZWxzaWYgKCRvcHRze3NzbH0pIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygkb3B0c3tob3N0fSwgJG9wdHN7cG9ydH0pOworfQorCitteSAkdHJhbnNwb3J0OworaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCwgMTAyNCwgMTAyNCk7Cit9CitlbHNpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnZnJhbWVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRwcm90b2NvbDsKK215ICRwcm90b2NvbDI7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRzZWNvbmRTZXJ2aWNlID0gdW5kZWY7CitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICRwcm90b2NvbDIgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnU2Vjb25kU2VydmljZScpOworICAkcHJvdG9jb2wgICAgICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KCRwcm90b2NvbCwgJ1RocmlmdFRlc3QnKTsKKyAgJHNlY29uZFNlcnZpY2UgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlQ2xpZW50LT5uZXcoJHByb3RvY29sMik7Cit9CisKK215ICR0ZXN0Q2xpZW50ID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudC0+bmV3KCRwcm90b2NvbCk7CisKK2V2YWwgeworICAkdHJhbnNwb3J0LT5vcGVuKCk7Cit9OworaWYoJEApewogICAgIGRpZShEdW1wZXIoJEApKTsKIH0KKwordXNlIGNvbnN0YW50IEVSUl9CQVNFVFlQRVMgPT4gMTsKK3VzZSBjb25zdGFudCBFUlJfU1RSVUNUUyA9PiAyOwordXNlIGNvbnN0YW50IEVSUl9DT05UQUlORVJTID0+IDQ7Cit1c2UgY29uc3RhbnQgRVJSX0VYQ0VQVElPTlMgPT4gODsKK3VzZSBjb25zdGFudCBFUlJfUFJPVE9DT0wgPT4gMTY7Cit1c2UgY29uc3RhbnQgRVJSX1VOS05PV04gPT4gNjQ7CisKIG15ICRzdGFydCA9IGdldHRpbWVvZmRheSgpOwogCiAjCiAjIFZPSUQgVEVTVAogIwotcHJpbnQoInRlc3RWb2lkKCkiKTsKK3ByaW50KCd0ZXN0Vm9pZCgpJyk7CiAkdGVzdENsaWVudC0+dGVzdFZvaWQoKTsKIHByaW50KCIgPSB2b2lkXG4iKTsKIAogIwogIyBTVFJJTkcgVEVTVAogIwotcHJpbnQoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7Ci1teSAkcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCJUZXN0Iik7Ci1wcmludCgiID0gXCIkc1wiXG4iKTsKK3ByaW50KCd0ZXN0U3RyaW5nKCJUZXN0IiknKTsKK215ICRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoJ1Rlc3QnKTsKK3ByaW50KHFxfCA9ICIkcyJcbnwpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHMgbmUgJ1Rlc3QnKTsKKworIworIyBNVUxUSVBMRVhFRCBURVNUCisjCitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICAgcHJpbnQoJ3NlY29uZHRlc3RTdHJpbmcoIlRlc3QyIiknKTsKKyAgICAkcyA9ICRzZWNvbmRTZXJ2aWNlLT5zZWNvbmR0ZXN0U3RyaW5nKCdUZXN0MicpOworICAgIHByaW50KHFxfCA9ICIkcyJcbnwpOworICAgIGV4aXQoRVJSX1BST1RPQ09MKSBpZiAoJHMgbmUgJ3Rlc3RTdHJpbmcoIlRlc3QyIiknKTsKK30KKworIworIyBCT09MIFRFU1QKKyMKK3ByaW50KCd0ZXN0Qm9vbCgxKScpOworbXkgJHQgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMSk7CitwcmludCgiID0gJHRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHQgbmUgMSk7CitwcmludCgndGVzdEJvb2woMCknKTsKK215ICRmID0gJHRlc3RDbGllbnQtPnRlc3RCb29sKDApOworcHJpbnQoIiA9ICRmXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRmIG5lIHF8fCk7CisKIAogIwogIyBCWVRFIFRFU1QKICMKLXByaW50KCJ0ZXN0Qnl0ZSgxKSIpOworcHJpbnQoJ3Rlc3RCeXRlKDEpJyk7CiBteSAkdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7CiBwcmludCgiID0gJHU4XG4iKTsKIAogIwogIyBJMzIgVEVTVAogIwotcHJpbnQoInRlc3RJMzIoLTEpIik7CitwcmludCgndGVzdEkzMigtMSknKTsKIG15ICRpMzIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigtMSk7CiBwcmludCgiID0gJGkzMlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkaTMyIG5lIC0xKTsKIAogIwotI0k2NCBURVNUCisjIEk2NCBURVNUCiAjCi1wcmludCgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CitwcmludCgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CiBteSAkaTY0ID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKIHByaW50KCIgPSAkaTY0XG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpNjQgbmUgLTM0MzU5NzM4MzY4KTsKIAogIwogIyBET1VCTEUgVEVTVAogIwotcHJpbnQoInRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpIik7CitwcmludCgndGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCknKTsKIG15ICRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7CiBwcmludCgiID0gJGR1YlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkZHViIG5lIC04NTIuMjM0MjM0MjM0KTsKKworIworIyBCSU5BUlkgVEVTVCAgIC0tLSAgVE9ETworIworCiAKICMKICMgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKLW15ICRvdXQgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kb3V0LT5zdHJpbmdfdGhpbmcoIlplcm8iKTsKK3ByaW50KCd0ZXN0U3RydWN0KHsiWmVybyIsIDEsIC0zLCAtNX0pJyk7CitteSAkb3V0ID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyRvdXQtPnN0cmluZ190aGluZygnWmVybycpOwogJG91dC0+Ynl0ZV90aGluZygxKTsKICRvdXQtPmkzMl90aGluZygtMyk7CiAkb3V0LT5pNjRfdGhpbmcoLTUpOwogbXkgJGluID0gJHRlc3RDbGllbnQtPnRlc3RTdHJ1Y3QoJG91dCk7Ci1wcmludCgiID0ge1wiIi4kaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgorcHJpbnQoJyA9IHsiJy4kaW4tPnN0cmluZ190aGluZy4nIiwgJy4KKyAgICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAogIwogIyBORVNURUQgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSIpOwotbXkgJG91dDIgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0MigpOworcHJpbnQoJ3Rlc3ROZXN0KHsxLCB7Ilplcm8iLCAxLCAtMywgLTV9LCA1fScpOworbXkgJG91dDIgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QyLT5uZXcoKTsKICRvdXQyLT5ieXRlX3RoaW5nKDEpOwogJG91dDItPnN0cnVjdF90aGluZygkb3V0KTsKICRvdXQyLT5pMzJfdGhpbmcoNSk7CiBteSAkaW4yID0gJHRlc3RDbGllbnQtPnRlc3ROZXN0KCRvdXQyKTsKICRpbiA9ICRpbjItPnN0cnVjdF90aGluZzsKLXByaW50KCIgPSB7Ii4kaW4yLT5ieXRlX3RoaW5nLiIsIHtcIiIuCi0gICAgICAkaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAkaW4tPmJ5dGVfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCi0gICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KK3ByaW50KCcgPSB7Jy4kaW4yLT5ieXRlX3RoaW5nLicsIHsiJy4KKyAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAkaW4tPmkzMl90aGluZy4nLCAnLgorICAgICAgJGluLT5pNjRfdGhpbmcuJ30sICcuCiAgICAgICAkaW4yLT5pMzJfdGhpbmcuIn1cbiIpOwogCiAjCkBAIC0xMzcsMjggKzI2MSwzMCBAQAogZm9yIChteSAkaSA9IDA7ICRpIDwgNTsgKyskaSkgewogICAkbWFwb3V0LT57JGl9ID0gJGktMTA7CiB9Ci1wcmludCgidGVzdE1hcCh7Iik7CitwcmludCgndGVzdE1hcCh7Jyk7CiBteSAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwb3V0KSB7CiAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQoJywgJyk7CiAgICAgfQogICAgIHByaW50KCIka2V5ID0+ICR2YWwiKTsKIH0KLXByaW50KCJ9KSIpOworcHJpbnQoJ30pJyk7CiAKIAogbXkgJG1hcGluID0gJHRlc3RDbGllbnQtPnRlc3RNYXAoJG1hcG91dCk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIAogJGZpcnN0ID0gMTsKIHdoaWxlKCBteSgka2V5LCR2YWwpID0gZWFjaCAlJG1hcGluKXsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQpAQCAtMTcyLDExICsyOTgsMTEgQEAKICAgICBwdXNoKEAkc2V0b3V0LCAkaSk7CiB9CiAKLXByaW50KCJ0ZXN0U2V0KHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0U2V0KHsnLmpvaW4oJywnLEAkc2V0b3V0KS4nfSknKTsKIAogbXkgJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJHNldG91dCkuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkc2V0b3V0KS4ifVxuIik7CiAKICMKICMgTElTVCBURVNUCkBAIC0xODYsMTA1ICszMTIsMTExIEBACiAgICAgcHVzaChAJGxpc3RvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RMaXN0KHsiLmpvaW4oIiwiLEAkbGlzdG91dCkuIn0pIik7CitwcmludCgndGVzdExpc3Qoeycuam9pbignLCcsQCRsaXN0b3V0KS4nfSknKTsKIAogbXkgJGxpc3RpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0TGlzdCgkbGlzdG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJGxpc3RpbikuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkbGlzdGluKS4ifVxuIik7CiAKICMKICMgRU5VTSBURVNUCiAjCi1wcmludCgidGVzdEVudW0oT05FKSIpOworcHJpbnQoJ3Rlc3RFbnVtKE9ORSknKTsKIG15ICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6T05FKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRXTykiKTsKK3ByaW50KCd0ZXN0RW51bShUV08pJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShUSFJFRSkiKTsKK3ByaW50KCd0ZXN0RW51bShUSFJFRSknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VEhSRUUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRklWRSkiKTsKK3ByaW50KCd0ZXN0RW51bShGSVZFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKEVJR0hUKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEVJR0hUKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCk7CiBwcmludCgiID0gJHJldFxuIik7CiAKICMKICMgVFlQRURFRiBURVNUCiAjCi1wcmludCgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworcHJpbnQoJ3Rlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyknKTsKIG15ICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50KCIgPSAkdWlkXG4iKTsKIAogIwogIyBORVNURUQgTUFQIFRFU1QKICMKLXByaW50KCJ0ZXN0TWFwTWFwKDEpIik7CitwcmludCgndGVzdE1hcE1hcCgxKScpOwogbXkgJG1tID0gJHRlc3RDbGllbnQtPnRlc3RNYXBNYXAoMSk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIHdoaWxlKCBteSAoJGtleSwkdmFsKSA9IGVhY2ggJSRtbSkgewogICAgIHByaW50KCIka2V5ID0+IHsiKTsKICAgICB3aGlsZSggbXkoJGsyLCR2MikgPSBlYWNoICUkdmFsKSB7CiAgICAgICAgIHByaW50KCIkazIgPT4gJHYyLCAiKTsKICAgICB9Ci0gICAgcHJpbnQoIn0sICIpOworICAgIHByaW50KCd9LCAnKTsKIH0KIHByaW50KCJ9XG4iKTsKIAogIwogIyBJTlNBTklUWSBURVNUCiAjCi1teSAkaW5zYW5lID0gbmV3IFRocmlmdFRlc3Q6Okluc2FuaXR5KCk7CitteSAkaW5zYW5lID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldygpOwogJGluc2FuZS0+e3VzZXJNYXB9LT57VGhyaWZ0VGVzdDo6TnVtYmVyejo6RklWRX0gPSA1MDAwOwotbXkgJHRydWNrID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCgpOwotJHRydWNrLT5zdHJpbmdfdGhpbmcoIlRydWNrIik7Ci0kdHJ1Y2stPmJ5dGVfdGhpbmcoOCk7Ci0kdHJ1Y2stPmkzMl90aGluZyg4KTsKLSR0cnVjay0+aTY0X3RoaW5nKDgpOworbXkgJHRydWNrID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjay0+c3RyaW5nX3RoaW5nKCdIZWxsbzInKTsKKyR0cnVjay0+Ynl0ZV90aGluZygyKTsKKyR0cnVjay0+aTMyX3RoaW5nKDIpOworJHRydWNrLT5pNjRfdGhpbmcoMik7CitteSAkdHJ1Y2syID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjazItPnN0cmluZ190aGluZygnR29vZGJ5ZTQnKTsKKyR0cnVjazItPmJ5dGVfdGhpbmcoNCk7CiskdHJ1Y2syLT5pMzJfdGhpbmcoNCk7CiskdHJ1Y2syLT5pNjRfdGhpbmcoNCk7CiBwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrKTsKK3B1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2syKTsKIAotcHJpbnQoInRlc3RJbnNhbml0eSgpIik7CitwcmludCgndGVzdEluc2FuaXR5KCknKTsKIG15ICR3aG9hID0gJHRlc3RDbGllbnQtPnRlc3RJbnNhbml0eSgkaW5zYW5lKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJHdob2EpIHsKICAgICBwcmludCgiJGtleSA9PiB7Iik7CiAgICAgd2hpbGUoIG15KCRrMiwkdjIpID0gZWFjaCAlJHZhbCkgewogICAgICAgICBwcmludCgiJGsyID0+IHsiKTsKICAgICAgICAgbXkgJHVzZXJNYXAgPSAkdjItPnt1c2VyTWFwfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgIkhBU0giKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICdIQVNIJykgewogICAgICAgICAgICAgd2hpbGUoIG15KCRrMywkdjMpID0gZWFjaCAlJHVzZXJNYXApIHsKICAgICAgICAgICAgICAgICBwcmludCgiJGszID0+ICR2MywgIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAKICAgICAgICAgbXkgJHh0cnVjdHMgPSAkdjItPnt4dHJ1Y3RzfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgIkFSUkFZIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICR4IChAJHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBwcmludCgie1wiIi4keC0+e3N0cmluZ190aGluZ30uIlwiLCAiLgotICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uIiwgIi4keC0+e2kzMl90aGluZ30uIiwgIi4keC0+e2k2NF90aGluZ30uIn0sICIpOworICAgICAgICAgICAgICAgIHByaW50KCd7IicuJHgtPntzdHJpbmdfdGhpbmd9LiciLCAnLgorICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uJywgJy4keC0+e2kzMl90aGluZ30uJywgJy4keC0+e2k2NF90aGluZ30uJ30sICcpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9Iik7CisgICAgICAgIHByaW50KCd9Jyk7CiAKLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAgICAgfQotICAgIHByaW50KCJ9LCAiKTsKKyAgICBwcmludCgnfSwgJyk7CiB9CiBwcmludCgifVxuIik7CiAKICMKICMgRVhDRVBUSU9OIFRFU1QKICMKLXByaW50KCJ0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpIik7CitwcmludChxfHRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyl8KTsKIGV2YWwgewogICAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICAgIHByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwpAQCAtMjk3LDcgKzQyOSw3IEBACiAjIE5vcm1hbCB0ZXN0cyBkb25lLgogIwogbXkgJHN0b3AgPSBnZXR0aW1lb2ZkYXkoKTsKLW15ICRlbHAgID0gc3ByaW50ZigiJWQiLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CitteSAkZWxwICA9IHNwcmludGYoJyVkJywxMDAwKigkc3RvcCAtICRzdGFydCksIDApOwogcHJpbnQoIlRvdGFsIHRpbWU6ICRlbHAgbXNcbiIpOwogCiAjCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbCBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjlhMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbApAQCAtMCwwICsxLDQxMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgRGF0YTo6RHVtcGVyOwordXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKK3VzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOworCiskU0lHe0lOVH0gPSBcJnNpZ2ludF9oYW5kbGVyOworCit1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwordXNlIGxpYiAnZ2VuLXBlcmwnOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKKwordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7Cit1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKK3VzZSBUaHJpZnRUZXN0OjpUeXBlczsKKworJHwrKzsKKworc3ViIHVzYWdlIHsKKyAgICBwcmludCA8PCJFT0YiOworVXNhZ2U6ICQwIFtPUFRJT05TXQorCitPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCisgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChvcHRpb25hbCkuCisgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCisgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGUga2V5IGZpbGUgZm9yIGNlcnRpZmljYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbCBhbmQgcHJpdmF0ZSBrZXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGluIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAtLXBvcnQgPHBvcnRudW0+ICAgICAgICAgICAgICAgIDkwOTAgICAgICAgICBQb3J0IHRvIHVzZS4KKyAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgorICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NML1RMUy4KKyAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KKworRU9GCit9CisKK215ICVvcHRzID0gKAorICAgICdwb3J0JyA9PiA5MDkwLAorICAgICdwcm90b2NvbCcgPT4gJ2JpbmFyeScsCisgICAgJ3RyYW5zcG9ydCcgPT4gJ2J1ZmZlcmVkJworKTsKKworR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCisgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAgZG9tYWluLXNvY2tldD1zCisgICAgaGVscAorICAgIGhvc3Q9cworICAgIGtleT1zCisgICAgcG9ydD1pCisgICAgcHJvdG9jb2w9cworICAgIHNzbAorICAgIHRyYW5zcG9ydD1zCispKSB8fCBleGl0IDE7CisKK2lmICgkb3B0c3toZWxwfSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAwOworfQorCitpZiAoJG9wdHN7c3NsfSBhbmQgbm90IGRlZmluZWQgJG9wdHN7Y2VydH0pIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJGhhbmRsZXIgICAgPSBUaHJpZnRUZXN0SGFuZGxlci0+bmV3KCk7CitteSAkaGFuZGxlcjIgICA9IFNlY29uZFNlcnZpY2VIYW5kbGVyLT5uZXcoKTsKK215ICRwcm9jZXNzb3IgID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKK215ICRwcm9jZXNzb3IyID0gVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZVByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyMik7CisKK215ICRzZXJ2ZXJzb2NrZXQ7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgIHVubGluaygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhcJW9wdHMpOworfQorbXkgJHRyYW5zcG9ydDsKK2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorbXkgJHByb3RvY29sOworaWYgKCRvcHRze3Byb3RvY29sfSBlcSAnYmluYXJ5JyB8fCAkb3B0c3twcm90b2NvbH0gZXEgJ211bHRpJykgeworICAgICRwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgIG15ICRuZXdQcm9jZXNzb3IgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yLT5uZXcoJHByb3RvY29sKTsKKyAgJG5ld1Byb2Nlc3Nvci0+ZGVmYXVsdFByb2Nlc3NvcigkcHJvY2Vzc29yKTsKKyAgJG5ld1Byb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoJ1RocmlmdFRlc3QnLCAkcHJvY2Vzc29yKTsKKyAgJG5ld1Byb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoJ1NlY29uZFNlcnZpY2UnLCAkcHJvY2Vzc29yMik7CisgICRwcm9jZXNzb3IgPSAkbmV3UHJvY2Vzc29yOworfQorCitteSAkc3NsdGFnID0gJyc7CitpZiAoJG9wdHN7c3NsfSkgeworICAgICRzc2x0YWcgPSAnKFNTTCknOworfQorbXkgJGxpc3RlbmluZ19vbiA9ICIkb3B0c3twb3J0fSAkc3NsdGFnIjsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJGxpc3RlbmluZ19vbiA9ICRvcHRzeydkb21haW4tc29ja2V0J307Cit9CitteSAkc2VydmVyID0gVGhyaWZ0OjpTaW1wbGVTZXJ2ZXItPm5ldygkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0LCAkdHJhbnNwb3J0LCAkcHJvdG9jb2wpOworcHJpbnQgcXF8U3RhcnRpbmcgInNpbXBsZSIgc2VydmVyICgkb3B0c3t0cmFuc3BvcnR9LyRvcHRze3Byb3RvY29sfSkgbGlzdGVuIG9uOiAkbGlzdGVuaW5nX29uXG58OworJHNlcnZlci0+c2VydmUoKTsKK3ByaW50ICJkb25lLlxuIjsKKworc3ViIHNpZ2ludF9oYW5kbGVyIHsKKyAgcHJpbnQgInJlY2VpdmVkIFNJR0lOVCwgc3RvcHBpbmcuLi5cbiI7CisgICRzZXJ2ZXItPnN0b3AoKTsKK30KKworIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFRocmlmdFRlc3RIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdElmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiB0ZXN0Vm9pZCB7CisgIHByaW50KCJ0ZXN0Vm9pZCgpXG4iKTsKK30KKworc3ViIHRlc3RTdHJpbmcgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RTdHJpbmcoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0Qm9vbCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBteSAkc3RyID0gJHRoaW5nID8gJ3RydWUnIDogJ2ZhbHNlJzsKKyAgcHJpbnQoInRlc3RCb29sKCRzdHIpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCeXRlIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0Qnl0ZSgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RJMzIgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RJMzIoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0STY0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0STY0KCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdERvdWJsZSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdERvdWJsZSgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCaW5hcnkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHRoaW5nID0gc2hpZnQ7CisgICAgbXkgQGJ5dGVzID0gc3BsaXQgLy8sICR0aGluZzsKKyAgICBwcmludCAndGVzdEJpbmFyeSgnOworICAgIHByaW50ZiggJyUwMmx4Jywgb3JkICRfICkgZm9yZWFjaCAoQGJ5dGVzKTsKKyAgICBwcmludCAiKVxuIjsKKyAgICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFN0cnVjdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYocXF8dGVzdFN0cnVjdCh7IiVzIiwgJWQsICVkLCAlbGxkfSlcbnwsCisgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpNjRfdGhpbmd9KTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3ROZXN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJG5lc3QgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gJG5lc3QtPntzdHJ1Y3RfdGhpbmd9OworICBwcmludGYocXF8dGVzdE5lc3QoeyVkLCB7IiVzIiwgJWQsICVkLCAlbGxkfSwgJWR9KVxufCwKKyAgICAgICAgICAgJG5lc3QtPntieXRlX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57c3RyaW5nX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57Ynl0ZV90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2kzMl90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2k2NF90aGluZ30sCisgICAgICAgICAgICRuZXN0LT57aTMyX3RoaW5nfSk7CisgIHJldHVybiAkbmVzdDsKK30KKworc3ViIHRlc3RNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmICJ0ZXN0TWFwKHslc30pXG4iLAorICAgIGpvaW4oICcsICcsCisgICAgICAgICAgbWFwIHsgJF8gLiAnID0+ICcgLiAkdGhpbmctPnskX30gfQorICAgICAgICAgIHNvcnQga2V5cyAlJHRoaW5nCisgICAgKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTdHJpbmdNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmICJ0ZXN0U3RyaW5nTWFwKHslc30pXG4iLAorICAgIGpvaW4oICcsICcsCisgICAgICAgICAgbWFwIHsgJF8gLiAnID0+ICcgLiAkdGhpbmctPnskX30gfQorICAgICAgICAgIHNvcnQga2V5cyAlJHRoaW5nCisgICAgKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTZXQgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgbXkgQHJlc3VsdCA9IHNvcnQga2V5cyAlJHRoaW5nOworICBwcmludGYgInRlc3RTZXQoeyVzfSlcbiIsIGpvaW4oJywgJywgQHJlc3VsdCApOworICByZXR1cm4gXEByZXN1bHQ7Cit9CisKK3N1YiB0ZXN0TGlzdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCAidGVzdExpc3QoeyVzfSlcbiIsIGpvaW4oJywgJywgQCR0aGluZyk7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0RW51bSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCAidGVzdEVudW0oJHRoaW5nKVxuIjsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RUeXBlZGVmIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0VHlwZWRlZigkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RNYXBNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkaGVsbG8gPSBzaGlmdDsKKworICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCAkaGVsbG8pOworICBteSAkcmVzdWx0ID0geyA0ID0+IHsgMSA9PiAxLCAyID0+IDIsIDMgPT4gMywgNCA9PiA0IH0sIC00ID0+IHsgLTEgPT4gLTEsIC0yID0+IC0yLCAtMyA9PiAtMywgLTQgPT4gLTQgfSB9OworICByZXR1cm4gJHJlc3VsdDsKK30KKworc3ViIHRlc3RJbnNhbml0eSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmd1bWVudCA9IHNoaWZ0OworICBwcmludCgidGVzdEluc2FuaXR5KClcbiIpOworCisgIG15ICRoZWxsbyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0hlbGxvMicsIGJ5dGVfdGhpbmcgPT4gMiwgaTMyX3RoaW5nID0+IDIsIGk2NF90aGluZyA9PiAyfSk7CisgIG15IEBoZWxsb3M7CisgIHB1c2goQGhlbGxvcywgJGhlbGxvKTsKKyAgbXkgJGdvb2RieWUgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdHb29kYnllNCcsIGJ5dGVfdGhpbmcgPT4gNCwgaTMyX3RoaW5nID0+IDQsIGk2NF90aGluZyA9PiA0fSk7CisgIG15IEBnb29kYnllczsKKyAgcHVzaChAZ29vZGJ5ZXMsICRnb29kYnllKTsKKyAgbXkgJGNyYXp5ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldyh7dXNlck1hcCA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDggfSwgeHRydWN0cyA9PiBcQGdvb2RieWVzfSk7CisgIG15ICRsb29ueSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKKyAgbXkgJHJlc3VsdCA9IHsgMSA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyA9PiAkYXJndW1lbnQsIFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFID0+ICRhcmd1bWVudCB9LAorICAgICAgICAgICAgICAgICAyID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6U0lYID0+ICRsb29ueSB9IH07CisgIHJldHVybiAkcmVzdWx0OworfQorCitzdWIgdGVzdE11bHRpIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZzAgPSBzaGlmdDsKKyAgbXkgJGFyZzEgPSBzaGlmdDsKKyAgbXkgJGFyZzIgPSBzaGlmdDsKKyAgbXkgJGFyZzMgPSBzaGlmdDsKKyAgbXkgJGFyZzQgPSBzaGlmdDsKKyAgbXkgJGFyZzUgPSBzaGlmdDsKKworICBwcmludCgidGVzdE11bHRpKClcbiIpOworICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAkYXJnMCwgaTMyX3RoaW5nID0+ICRhcmcxLCBpNjRfdGhpbmcgPT4gJGFyZzJ9KTsKK30KKworc3ViIHRlc3RFeGNlcHRpb24geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0RXhjZXB0aW9uKCRhcmcpXG4iKTsKKyAgaWYgKCRhcmcgZXEgJ1hjZXB0aW9uJykgeworICAgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uLT5uZXcoe2Vycm9yQ29kZSA9PiAxMDAxLCBtZXNzYWdlID0+ICRhcmd9KTsKKyAgfQorICBlbHNpZiAoJGFyZyBlcSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIGRpZSAnYXN0cmluZyc7ICMgYWxsIHVuaGFuZGxlZCBleGNlcHRpb25zIGJlY29tZSBURXhjZXB0aW9ucworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZ30pOworICB9Cit9CisKK3N1YiB0ZXN0TXVsdGlFeGNlcHRpb24geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnMCA9IHNoaWZ0OworICBteSAkYXJnMSA9IHNoaWZ0OworCisgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsICRhcmcwLCAkYXJnMSk7CisgIGlmICgkYXJnMCBlcSAnWGNlcHRpb24nKSB7CisgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uLT5uZXcoe2Vycm9yQ29kZSA9PiAxMDAxLCBtZXNzYWdlID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uJ30pOworICB9CisgIGVsc2lmICgkYXJnMCBlcSAnWGNlcHRpb24yJykgeworICAgIG15ICRzdHJ1Y3RfdGhpbmcgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uMid9KTsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24yLT5uZXcoe2Vycm9yQ29kZSA9PiAyMDAyLCBzdHJ1Y3RfdGhpbmcgPT4gJHN0cnVjdF90aGluZ30pOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICRhcmcxfSk7CisgIH0KK30KKworc3ViIHRlc3RPbmV3YXkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkbnVtID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0T25ld2F5KCRudW0pOiByZWNlaXZlZFxuIik7Cit9CisKKyMjIworIyMjIFRlc3Qgc2VydmVyIGltcGxlbWVudGF0aW9uCisjIyMKKworcGFja2FnZSBTZWNvbmRTZXJ2aWNlSGFuZGxlcjsKKwordXNlIGJhc2UgcXcoIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VJZiApOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7fTsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgc2Vjb25kdGVzdFN0cmluZyB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdFN0cmluZygkdGhpbmcpXG4iKTsKKyAgcmV0dXJuIHFxfHRlc3RTdHJpbmcoIiR0aGluZyIpfDsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL01ha2VmaWxlIGIvdGVzdC9waHAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzVjNmUuLjAwMDAwMDAKLS0tIGEvdGVzdC9waHAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBEZWZhdWx0IHRhcmdldCBpcyBldmVyeXRoaW5nCi10YXJnZXQ6IGFsbAotCi0jIFRvb2xzCi1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWFsbDogbm9ybWFsIGlubGluZQotCi1ub3JtYWw6IHN0dWJzCi0KLWlubGluZTogc3R1YnMtaW5saW5lCi0KLXN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQotc3R1YnMtaW5saW5lOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBwaHA6aW5saW5lZCAuLi9UaHJpZnRUZXN0LnRocmlmdAotCi1jbGVhbjoKLQkkKFJNKSAtciBnZW4tcGhwIGdlbi1waHBpCmRpZmYgLS1naXQgYS90ZXN0L3BocC9NYWtlZmlsZS5hbSBiL3Rlc3QvcGhwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyZjdmYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHA6aW5saW5lZCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoTUtESVJfUCkgZ2VuLXBocC1jbGFzc21hcAorCSQoVEhSSUZUKSAtb3V0IGdlbi1waHAtY2xhc3NtYXAgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK3BocF9leHRfZGlyOgorCW1rZGlyIC1wIHBocF9leHRfZGlyCisJbG4gLXMgLi4vLi4vLi4vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbyBwaHBfZXh0X2Rpci8KKwlsbiAtcyAiJCQocGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXIpL3NvY2tldHMuc28iIHBocF9leHRfZGlyLworCitwcmVjcm9zczogc3R1YnMgcGhwX2V4dF9kaXIKKworY2hlY2s6IHN0dWJzIHBocF9leHRfZGlyCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1waHAgZ2VuLXBocGkgZ2VuLXBocC1jbGFzc21hcCBwaHBfZXh0X2RpcgorCitjbGllbnQ6IHN0dWJzIHBocF9leHRfZGlyCisJcGhwIFRlc3RDbGllbnQucGhwCmRpZmYgLS1naXQgYS90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwIGIvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQxNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKzw/cGhwCiskR0VOX0RJUiA9ICdnZW4tcGhwLWNsYXNzbWFwJzsKK2luY2x1ZGVfb25jZSgnVGVzdENsaWVudC5waHAnKTsKKz8+CmRpZmYgLS1naXQgYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggOGVjYTE3NS4uYWNkOTAxZAotLS0gYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAorKysgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocApAQCAtMSwzICsxLDI4IEBACis8P3BocAorCituYW1lc3BhY2UgdGVzdFxwaHA7CisKKy8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCiskbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworaWYgKCFpc3NldCgkR0VOX0RJUikpIHsKKyAgJEdFTl9ESVIgPSAnZ2VuLXBocCc7Cit9CitpZiAoIWlzc2V0KCRNT0RFKSkgeworICAkTU9ERSA9ICdub3JtYWwnOworfQorCisKK2lmICgkR0VOX0RJUiA9PSAnZ2VuLXBocCcpIHsKKyAgJGxvYWRlci0+YWRkUHNyNCgnJywgJEdFTl9ESVIpOworfSBlbHNlIHsKKyAgJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworICAkbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCAkR0VOX0RJUik7CisgICRsb2FkZXItPnJlZ2lzdGVyKCk7Cit9CisKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTcsNDEgKzQyLDQwIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi08P3BocAotCi1pZiAoIWlzc2V0KCRHRU5fRElSKSkgewotICAkR0VOX0RJUiA9ICdnZW4tcGhwJzsKLX0KLWlmICghaXNzZXQoJE1PREUpKSB7Ci0gICRNT0RFID0gJ25vcm1hbCc7Ci19Ci0KLS8qKiBTZXQgdGhlIFRocmlmdCByb290ICovCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXSA9ICcuLi8uLi9saWIvcGhwL3NyYyc7Ci0KIC8qKiBJbmNsdWRlIHRoZSBUaHJpZnQgYmFzZSAqLwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVGhyaWZ0LnBocCc7Ci0KLS8qKiBJbmNsdWRlIHRoZSBiaW5hcnkgcHJvdG9jb2wgKi8KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOworLyoqIEluY2x1ZGUgdGhlIHByb3RvY29scyAqLwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwogCiAvKiogSW5jbHVkZSB0aGUgc29ja2V0IGxheWVyICovCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwJzsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0UG9vbDsKIAogLyoqIEluY2x1ZGUgdGhlIHNvY2tldCBsYXllciAqLwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKIAotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKLWVjaG8gJyBTQUZFIFRPIElHTk9SRSBUSEVTRSBJTiBURVNUJy4iXG4iOwotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKK2Z1bmN0aW9uIG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pCit7CisgIGlmICgkUFJPVE8gPT0gJ2JpbmFyeScpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2NvbXBhY3QnKSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnanNvbicpIHsKKyAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdhY2NlbCcpIHsKKyAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICBlY2hvICJBY2NlbGVyYXRpb24gZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWRcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOworICB9CiAKLS8qKiBJbmNsdWRlIHRoZSBnZW5lcmF0ZWQgY29kZSAqLwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9UaHJpZnRUZXN0L1RocmlmdFRlc3RfdHlwZXMucGhwJzsKLQotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKLWVjaG8gJyBFTkQgT0YgU0FGRSBFUlJPUlMgU0VDVElPTicuIlxuIjsKLWVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLiJcblxuIjsKKyAgZWNobyAiLS1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiB7YmluYXJ5fGNvbXBhY3R8anNvbnxhY2NlbH1cbiI7CisgIGV4aXQoMSk7Cit9CiAKICRob3N0ID0gJ2xvY2FsaG9zdCc7CiAkcG9ydCA9IDkwOTA7CkBAIC02NCw2ICs4OCwxNiBAQAogICAkaG9zdCA9ICRhcmd2WzFdOwogfQogCitmb3JlYWNoICgkYXJndiBhcyAkYXJnKSB7CisgIGlmIChzdWJzdHIoJGFyZywgMCwgNykgPT0gJy0tcG9ydD0nKSB7CisgICAgJHBvcnQgPSBzdWJzdHIoJGFyZywgNyk7CisgIH0gZWxzZSBpZiAoc3Vic3RyKCRhcmcsIDAsIDEyKSA9PSAnLS10cmFuc3BvcnQ9JykgeworICAgICRNT0RFID0gc3Vic3RyKCRhcmcsIDEyKTsKKyAgfSBlbHNlIGlmIChzdWJzdHIoJGFyZywgMCwgMTEpID09ICctLXByb3RvY29sPScpIHsKKyAgICAkUFJPVE8gPSBzdWJzdHIoJGFyZywgMTEpOworICB9Cit9CisKICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKTsKIAogJHNvY2tldCA9IG5ldyBUU29ja2V0KCRob3N0LCAkcG9ydCk7CkBAIC03MiwxOCArMTA2LDI5IEBACiAKIGlmICgkTU9ERSA9PSAnaW5saW5lJykgewogICAkdHJhbnNwb3J0ID0gJHNvY2tldDsKLSAgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudCgkdHJhbnNwb3J0KTsKKyAgJHRlc3RDbGllbnQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdENsaWVudCgkdHJhbnNwb3J0KTsKK30gZWxzZSBpZiAoJE1PREUgPT0gJ2ZyYW1lZCcpIHsKKyAgJGZyYW1lZFNvY2tldCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KCRzb2NrZXQpOworICAkdHJhbnNwb3J0ID0gJGZyYW1lZFNvY2tldDsKKyAgJHByb3RvY29sID0gbWFrZVByb3RvY29sKCR0cmFuc3BvcnQsICRQUk9UTyk7CisgICR0ZXN0Q2xpZW50ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKIH0gZWxzZSB7CiAgICRidWZmZXJlZFNvY2tldCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7CiAgICR0cmFuc3BvcnQgPSAkYnVmZmVyZWRTb2NrZXQ7Ci0gICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICR0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKKyAgJHByb3RvY29sID0gbWFrZVByb3RvY29sKCR0cmFuc3BvcnQsICRQUk9UTyk7CisgICR0ZXN0Q2xpZW50ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKIH0KIAogJHRyYW5zcG9ydC0+b3BlbigpOwogCiAkc3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7CiAKK2RlZmluZSgnRVJSX0JBU0VUWVBFUycsIDEpOworZGVmaW5lKCdFUlJfU1RSVUNUUycsIDIpOworZGVmaW5lKCdFUlJfQ09OVEFJTkVSUycsIDQpOworZGVmaW5lKCdFUlJfRVhDRVBUSU9OUycsIDgpOworZGVmaW5lKCdFUlJfVU5LTk9XTicsIDY0KTsKKyRleGl0Y29kZSA9IDA7CiAvKioKICAqIFZPSUQgVEVTVAogICovCkBAIC05MSw0NiArMTM2LDYzIEBACiAkdGVzdENsaWVudC0+dGVzdFZvaWQoKTsKIHByaW50X3IoIiA9IHZvaWRcbiIpOwogCitmdW5jdGlvbiByb3VuZHRyaXAoJHRlc3RDbGllbnQsICRtZXRob2QsICR2YWx1ZSkgeworICBnbG9iYWwgJGV4aXRjb2RlOworICBwcmludF9yKCIkbWV0aG9kKCR2YWx1ZSkiKTsKKyAgJHJldCA9ICR0ZXN0Q2xpZW50LT4kbWV0aG9kKCR2YWx1ZSk7CisgIHByaW50X3IoIiA9IFwiJHJldFwiXG4iKTsKKyAgaWYgKCR2YWx1ZSAhPT0gJHJldCkgeworICAgIHByaW50X3IoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgfQorfQorCiAvKioKICAqIFNUUklORyBURVNUCiAgKi8KLXByaW50X3IoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7Ci0kcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCJUZXN0Iik7Ci1wcmludF9yKCIgPSBcIiRzXCJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdFN0cmluZycsICJUZXN0Iik7CisKKy8qKgorICogQk9PTCBURVNUCisgKi8KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCb29sJywgdHJ1ZSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qm9vbCcsIGZhbHNlKTsKIAogLyoqCiAgKiBCWVRFIFRFU1QKICAqLwotcHJpbnRfcigidGVzdEJ5dGUoMSkiKTsKLSR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKLXByaW50X3IoIiA9ICR1OFxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIDEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAtMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIDEyNyk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIC0xMjgpOwogCiAvKioKICAqIEkzMiBURVNUCiAgKi8KLXByaW50X3IoInRlc3RJMzIoLTEpIik7Ci0kaTMyID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoLTEpOwotcHJpbnRfcigiID0gJGkzMlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgLTEpOwogCiAvKioKICAqIEk2NCBURVNUCiAgKi8KLXByaW50X3IoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOwotJGk2NCA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KC0zNDM1OTczODM2OCk7Ci1wcmludF9yKCIgPSAkaTY0XG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAwKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAxKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAtMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgLTM0MzU5NzM4MzY4KTsKIAogLyoqCiAgKiBET1VCTEUgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KSIpOwotJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKLXByaW50X3IoIiA9ICRkdWJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdERvdWJsZScsIC04NTIuMjM0MjM0MjM0KTsKKworLyoqCisgKiBCSU5BUlkgVEVTVCAgLS0gIFRPRE8KKyAqLwogCiAvKioKICAqIFNUUlVDVCBURVNUCiAgKi8KIHByaW50X3IoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotJG91dCA9IG5ldyBYdHJ1Y3QoKTsKKyRvdXQgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCk7CiAkb3V0LT5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CiAkb3V0LT5ieXRlX3RoaW5nID0gMTsKICRvdXQtPmkzMl90aGluZyA9IC0zOwpAQCAtMTQxLDExICsyMDMsMTYgQEAKICAgICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn1cbiIpOwogCitpZiAoJGluICE9ICRvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KKwogLyoqCiAgKiBORVNURUQgU1RSVUNUIFRFU1QKICAqLwogcHJpbnRfcigidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7Ci0kb3V0MiA9IG5ldyBYdHJ1Y3QyKCk7Ciskb3V0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKCk7CiAkb3V0Mi0+Ynl0ZV90aGluZyA9IDE7CiAkb3V0Mi0+c3RydWN0X3RoaW5nID0gJG91dDsKICRvdXQyLT5pMzJfdGhpbmcgPSA1OwpAQCAtMTU4LDYgKzIyNSwxMSBAQAogICAgICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KICAgICAgICAgJGluMi0+aTMyX3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbjIgIT0gJG91dDIpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KKwogLyoqCiAgKiBNQVAgVEVTVAogICovCkBAIC0xOTAsMzYgKzI2Miw2OSBAQAogfQogcHJpbnRfcigifVxuIik7CiAKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiskbWFwb3V0ID0gYXJyYXkoKTsKK2ZvciAoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKSB7CisgICAgJG1hcG91dFsia2V5JGkiXSA9ICJ2YWwkaSI7Cit9CitwcmludF9yKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwb3V0IGFzICRrZXkgPT4gJHZhbCkgeworICBpZiAoJGZpcnN0KSB7CisgICAgJGZpcnN0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcHJpbnRfcigiLCAiKTsKKyAgfQorICBwcmludF9yKCJcIiRrZXlcIiA9PiBcIiR2YWxcIiIpOworfQorcHJpbnRfcigifSkiKTsKKyRtYXBpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nTWFwKCRtYXBvdXQpOworcHJpbnRfcigiID0geyIpOworJGZpcnN0ID0gdHJ1ZTsKK2ZvcmVhY2ggKCRtYXBpbiBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn1cbiIpOwora3NvcnQoJG1hcGluKTsKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiAvKioKICAqIFNFVCBURVNUCiAgKi8KICRzZXRvdXQgPSBhcnJheSgpOzsKIGZvciAoJGkgPSAtMjsgJGkgPCAzOyArKyRpKSB7Ci0gICRzZXRvdXQgW109ICRpOworICAkc2V0b3V0WyRpXT0gdHJ1ZTsKIH0KIHByaW50X3IoInRlc3RTZXQoeyIpOwotJGZpcnN0ID0gdHJ1ZTsKLWZvcmVhY2ggKCRzZXRvdXQgYXMgJHZhbCkgewotICBpZiAoJGZpcnN0KSB7Ci0gICAgJGZpcnN0ID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRfcigiLCAiKTsKLSAgfQotICBwcmludF9yKCR2YWwpOwotfQorZWNobyBpbXBsb2RlKCcsJywgYXJyYXlfa2V5cygkc2V0b3V0KSk7CiBwcmludF9yKCJ9KSIpOwogJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiBwcmludF9yKCIgPSB7Iik7Ci0kZmlyc3QgPSB0cnVlOwotZm9yZWFjaCAoJHNldGluIGFzICR2YWwpIHsKLSAgaWYgKCRmaXJzdCkgewotICAgICRmaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHByaW50X3IoIiwgIik7Ci0gIH0KLSAgcHJpbnRfcigkdmFsKTsKLX0KK2VjaG8gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRzZXRpbikpOwogcHJpbnRfcigifVxuIik7CisvLyBPcmRlciBvZiBrZXlzIGluIHNldCBkb2VzIG5vdCBtYXR0ZXIKK2tzb3J0KCRzZXRpbik7CitpZiAoJHNldG91dCAhPT0gJHNldGluKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGNvcnJ1cHRlZCBhcnJheQoraWYgKCRzZXRpblsyXSAhPT0gJHNldG91dFsyXSB8fCBpc19pbnQoJHNldGluWzJdKSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIExJU1QgVEVTVApAQCAtMjUxLDI5ICszNTYsNTMgQEAKICAgcHJpbnRfcigkdmFsKTsKIH0KIHByaW50X3IoIn1cbiIpOworaWYgKCRsaXN0aW4gIT09ICRsaXN0b3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogRU5VTSBURVNUCiAgKi8KIHByaW50X3IoInRlc3RFbnVtKE9ORSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6T05FKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRXTykiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6VFdPKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRIUkVFKSIpOwotJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShOdW1iZXJ6OjpUSFJFRSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VEhSRUUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oRklWRSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6RklWRSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEVJR0hUKSIpOwotJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShOdW1iZXJ6OjpFSUdIVCk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6RUlHSFQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBUWVBFREVGIFRFU1QKQEAgLTI4MSw2ICs0MTAsMTAgQEAKIHByaW50X3IoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50X3IoIiA9ICR1aWRcbiIpOworaWYgKCR1aWQgIT09IDMwOTg1ODIzNTA4MjUyMykgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiAvKioKICAqIE5FU1RFRCBNQVAgVEVTVApAQCAtMjk2LDEzICs0MjksMjEgQEAKICAgcHJpbnRfcigifSwgIik7CiB9CiBwcmludF9yKCJ9XG4iKTsKKyRleHBlY3RlZF9tbSA9IFsKKyAgLTQgPT4gWy00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xXSwKKyAgNCA9PiBbNCA9PiA0LCAzID0+IDMsIDIgPT4gMiwgMSA9PiAxXSwKK107CitpZiAoJG1tICE9ICRleHBlY3RlZF9tbSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIElOU0FOSVRZIFRFU1QKICAqLwotJGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwotJGluc2FuZS0+dXNlck1hcFtOdW1iZXJ6OjpGSVZFXSA9IDUwMDA7Ci0kdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CiskaW5zYW5lID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KCk7CiskaW5zYW5lLT51c2VyTWFwW1xUaHJpZnRUZXN0XE51bWJlcno6OkZJVkVdID0gNTAwMDsKKyR0cnVjayA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoKTsKICR0cnVjay0+c3RyaW5nX3RoaW5nID0gIlRydWNrIjsKICR0cnVjay0+Ynl0ZV90aGluZyA9IDg7CiAkdHJ1Y2stPmkzMl90aGluZyA9IDg7CkBAIC0zMTcsNyArNDU4LDcgQEAKICAgICBwcmludF9yKCIkazIgPT4geyIpOwogICAgICR1c2VyTWFwID0gJHYyLT51c2VyTWFwOwogICAgIHByaW50X3IoInsiKTsKLSAgICBpZiAoaXNfYXJyYXkoJHVzZXJtYXApKSB7CisgICAgaWYgKGlzX2FycmF5KCR1c2VyTWFwKSkgewogICAgICAgZm9yZWFjaCAoJHVzZXJNYXAgYXMgJGszID0+ICR2MykgewogICAgICAgICBwcmludF9yKCIkazMgPT4gJHYzLCAiKTsKICAgICAgIH0KQEAgLTM0NywxMCArNDg4LDI5IEBACiB0cnkgewogICAkdGVzdENsaWVudC0+dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKICAgcHJpbnRfcigiICB2b2lkXG5GQUlMVVJFXG4iKTsKLX0gY2F0Y2ggKFhjZXB0aW9uICR4KSB7CisgICRleGl0Y29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKK30gY2F0Y2ggKFxUaHJpZnRUZXN0XFhjZXB0aW9uICR4KSB7CiAgIHByaW50X3IoJyBjYXVnaHQgeGNlcHRpb24gJy4keC0+ZXJyb3JDb2RlLic6ICcuJHgtPm1lc3NhZ2UuIlxuIik7CiB9CiAKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgVEhSSUZULTQyNjMKK3ByaW50X3IoInRlc3RCaW5hcnlTZXJpYWxpemVyX0Rlc2VyaWFsaXplKCdmb28nKSIpOwordHJ5IHsKKyAgXFRocmlmdFxTZXJpYWxpemVyXFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShiYXNlNjRfZGVjb2RlKCdmb28nKSwgXFRocmlmdFRlc3RcWHRydWN0Mjo6Y2xhc3MpOworICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9IGNhdGNoIChcVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uICRoYXBweV9leGNlcHRpb24pIHsKKyAgLy8gV2UgZXhwZWN0ZWQgdGhpcyBkdWUgdG8gYmluYXJ5IGRhdGEgb2YgYmFzZTY0X2RlY29kZSgnZm9vJykgaXMgbGVzcyB0aGVuIDQKKyAgLy8gYnl0ZXMgYW5kIGl0IHRyaWVzIHRvIGZpbmQgdGhyaWZ0IHZlcnNpb24gbnVtYmVyIGluIHRoZSB0cmFuc3BvcnQgYnkKKyAgLy8gcmVhZGluZyBpMzIoKSBhdCB0aGUgYmVnaW5uaW5nLiAgQ2FzdGluZyB0byBzdHJpbmcgdmFsaWRhdGVzIHRoYXQKKyAgLy8gZXhjZXB0aW9uIGlzIHN0aWxsIGFjY2Vzc2libGUgaW4gbWVtb3J5IGFuZCBub3QgY29ycnVwdGVkLiAgV2l0aG91dCBwYXRjaCwKKyAgLy8gUEhQIHdpbGwgZXJyb3IgbG9nIHRoYXQgdGhlIGV4Y2VwdGlvbiBkb2Vzbid0IGhhdmUgYW55IHRvc3RyaW5nIG1ldGhvZCwKKyAgLy8gd2hpY2ggaXMgYSBsaWUgZHVlIHRvIGNvcnJ1cHRlZCBtZW1vcnkuCisgIGZvcigkaT05OTsgJGkgPiAwOyAkaS0tKSB7CisgICAgKHN0cmluZykkaGFwcHlfZXhjZXB0aW9uOworICB9CisgIHByaW50X3IoIiAgU1VDQ0VTU1xuIik7Cit9CiAKIC8qKgogICogTm9ybWFsIHRlc3RzIGRvbmUuCkBAIC0zNjQsMzUgKzUyNCwzNCBAQAogICogRXh0cmFuZW91cyAiSSBkb24ndCB0cnVzdCBQSFAgdG8gcGFjay91bnBhY2sgaW50ZWdlciIgdGVzdHMKICAqLwogCitpZiAoJHByb3RvY29sIGluc3RhbmNlb2YgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIHsKKyAgICAvLyBSZWdyZXNzaW9uIGNoZWNrOiBjaGVjayB0aGF0IG1ldGhvZCBuYW1lIGlzIG5vdCBkb3VibGUtZnJlZWQKKyAgICAvLyBNZXRob2QgbmFtZSBzaG91bGQgbm90IGJlIGFuIGludGVybmVkIHN0cmluZy4KKyAgICAkbWV0aG9kX25hbWUgPSAiVm9pZCI7CisgICAgJG1ldGhvZF9uYW1lID0gInRlc3QkbWV0aG9kX25hbWUiOworCisgICAgJHNlcWlkID0gMDsKKyAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCRwcm90b2NvbCwgJG1ldGhvZF9uYW1lLCBcVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOjpDQUxMLCAkYXJncywgJHNlcWlkLCAkcHJvdG9jb2wtPmlzU3RyaWN0V3JpdGUoKSk7CisgICAgJHRlc3RDbGllbnQtPnJlY3ZfdGVzdFZvaWQoKTsKKworfQorCiAvLyBNYXggSTMyCiAkbnVtID0gcG93KDIsIDMwKSArIChwb3coMiwgMzApIC0gMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgJG51bSk7CiAKIC8vIE1pbiBJMzIKICRudW0gPSAwIC0gcG93KDIsIDMxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJMzInLCAkbnVtKTsKIAogLy8gTWF4IEk2NAogJG51bSA9IHBvdygyLCA2MikgKyAocG93KDIsIDYyKSAtIDEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsICRudW0pOwogCiAvLyBNaW4gSTY0Ci0kbnVtID0gMCAtIHBvdygyLCA2Myk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19CiskbnVtID0gMCAtIHBvdygyLCA2MikgLSBwb3coMiwgNjIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsICRudW0pOwogCiAkdHJhbnNwb3J0LT5jbG9zZSgpOwotcmV0dXJuOwotCi0/PgorZXhpdCgkZXhpdGNvZGUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvdGVzdF9waHAuaW5pIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC90ZXN0X3BocC5pbmkKQEAgLTAsMCArMSwyIEBACitleHRlbnNpb249dGhyaWZ0X3Byb3RvY29sLnNvCitleHRlbnNpb249c29ja2V0cy5zbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCit0aHJpZnRfZ2VuOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAuLi9TbWFsbFRlc3QudGhyaWZ0CisKK2NoZWNrOiB0aHJpZnRfZ2VuCisJLi90ZXN0X3N1aXRlLnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1weS50b3JuYWRvCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQ3ZmRlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CkBAIC0wLDAgKzEsMjM2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCitiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorc3lzLnBhdGguaW5zZXJ0KDAsIGJhc2VwYXRoICsgJy9nZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihiYXNlcGF0aCwgJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJykpWzBdKQorCit0cnk6CisgICAgX19pbXBvcnRfXygndG9ybmFkbycpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIm1vZHVsZSBgdG9ybmFkb2Agbm90IGZvdW5kLCBza2lwcGluZyB0ZXN0IikKKyAgICBzeXMuZXhpdCgwKQorCitmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgorZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCitmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKKworCitjbGFzcyBUZXN0SGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2luc3RhbmNlKToKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlID0gdGVzdF9pbnN0YW5jZQorCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzKToKKyAgICAgICAgaWYgcyA9PSAndW5leHBlY3RlZF9lcnJvcic6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24ocykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIGIKKworICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBpMTYKKworICAgIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBpMzIKKworICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBpNjQKKworICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBkdWIKKworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHggPSBYY2VwdGlvbigpCisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDEKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKKyAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgZWxpZiBzID09ICd0aHJvd191bmRlY2xhcmVkJzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rlc3RpbmcgdW5kZWNsYXJlZCBleGNlcHRpb24nKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKworICAgICAgICBkZWYgZmlyZV9vbmV3YXkoKToKKyAgICAgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzZWxmLnRlc3RfaW5zdGFuY2Uuc3RvcCgoc3RhcnQsIGVuZCwgc2Vjb25kcykpCisKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlLmlvX2xvb3AuYWRkX3RpbWVvdXQoCisgICAgICAgICAgICBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1zZWNvbmRzKSwKKyAgICAgICAgICAgIGZpcmVfb25ld2F5KQorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3Rlc3RpbmcgZXhjZXB0aW9uIGluIG9uZXdheSBtZXRob2QnKQorCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgeWllbGQgZ2VuLm1vbWVudAorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKHRoaW5nKQorCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworCitjbGFzcyBUaHJpZnRUZXN0Q2FzZShBc3luY1Rlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRocmlmdFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisKKyAgICAgICAgc2VsZi5wb3J0ID0gZ2V0X3VudXNlZF9wb3J0KCkKKworICAgICAgICAjIHNlcnZlcgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBUZXN0SGFuZGxlcihzZWxmKQorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKHNlbGYuaGFuZGxlcikKKyAgICAgICAgc2VsZi5wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgICAgICBzZWxmLnNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHNlbGYucHJvY2Vzc29yLCBzZWxmLnBmYWN0b3J5LCBpb19sb29wPXNlbGYuaW9fbG9vcCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuYmluZChzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KDEpCisKKyAgICAgICAgIyBjbGllbnQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFRvcm5hZG8uVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCwgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgICAgICBzZWxmLmlvX2xvb3AucnVuX3N5bmModHJhbnNwb3J0Lm9wZW4pCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQodHJhbnNwb3J0LCBwZmFjdG9yeSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3ZvaWQoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgTm9uZSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgJ1B5dGhvbicpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9ieXRlKHNlbGYpOgorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgNjMpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9pMzIoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgMCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2k2NChzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0zNDM1OTczODM2OCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC01LjIzNTA5ODIzNSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYnl0ZV90aGluZywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmkzMl90aGluZywgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3Rfb25ld2F5KHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdEhhbmRsZXIudGVzdE1hcCBpcyBhIGNvcm91dGluZSwgdGhpcyB0ZXN0IGNoZWNrcyBpZiBnZW4uUmV0dXJuKCkgZnJvbSBhIGNvcm91dGluZSB3b3Jrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdGVkID0gezE6IDF9CisgICAgICAgIHJlcyA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RNYXAoZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBleHBlY3RlZCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rocm93X3VuZGVjbGFyZWQnKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKworICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRocmlmdFRlc3RDYXNlKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSdzdWl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggNDcyM2I3ZC4uZDExOTA4YyAxMDA2NDQKLS0tIGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpAQCAtMTcsMTQgKzE3LDE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RSSUFMID89IHRyaWFsCiAKIHN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAKIGNoZWNrOiBzdHVicwotCSQoVFJJQUwpIHRlc3Rfc3VpdGUucHkKKwkkKFRSSUFMKSAuL3Rlc3Rfc3VpdGUucHkKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLXB5LnR3aXN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC9zZXR1cC5jZmcgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMyBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAyODlkZTUuLjAyZWI3ZjEKLS0tIGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKKysrIGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKQEAgLTEsMyArMSw1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKwogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNywxMiArMTksMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Jhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnZ2VuLXB5LnR3aXN0ZWQnKSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQorCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogCiBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIApAQCAtMzAsNDAgKzM5LDQxIEBACiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyLCByZWFjdG9yCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IENsaWVudENyZWF0b3IKIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIKIAotaW1wb3J0IHJhbmRvbQogCitAaW1wbGVtZW50ZXIoVGhyaWZ0VGVzdC5JZmFjZSkKIGNsYXNzIFRlc3RIYW5kbGVyOgotICAgIGltcGxlbWVudHMoVGhyaWZ0VGVzdC5JZmFjZSkKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUgPSBkZWZlci5EZWZlcnJlZFF1ZXVlKCkKIAogICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKICAgICAgICAgcGFzcwotIAorCiAgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgcyk6CiAgICAgICAgIHJldHVybiBzCi0gCisKICAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYik6CiAgICAgICAgIHJldHVybiBiCi0gCisKICAgICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgogICAgICAgICByZXR1cm4gaTE2Ci0gCisKICAgICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgogICAgICAgICByZXR1cm4gaTMyCi0gCisKICAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgogICAgICAgICByZXR1cm4gaTY0Ci0gCisKICAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgogICAgICAgICByZXR1cm4gZHViCi0gCisKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCiAgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIHMpOgogICAgICAgICBpZiBzID09ICdYY2VwdGlvbic6CiAgICAgICAgICAgICB4ID0gWGNlcHRpb24oKQpAQCAtNzIsMzEgKzgyLDMyIEBACiAgICAgICAgICAgICByYWlzZSB4CiAgICAgICAgIGVsaWYgcyA9PSAidGhyb3dfdW5kZWNsYXJlZCI6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmb28iKQotIAorCiAgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CiAgICAgICAgIGRlZiBmaXJlT25ld2F5KHQpOgogICAgICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUucHV0KCh0LCB0aW1lLnRpbWUoKSwgc2Vjb25kcykpCiAgICAgICAgIHJlYWN0b3IuY2FsbExhdGVyKHNlY29uZHMsIGZpcmVPbmV3YXksIHRpbWUudGltZSgpKQotICAgICAgICByZXR1cm4gZAotIAorICAgICAgICByYWlzZSBFeGNlcHRpb24oJycpCisKICAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCi0gCisKICAgICBkZWYgdGVzdFNldChzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwotIAorCiAgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCi0gCisKICAgICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwogCisKIGNsYXNzIFRocmlmdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKQEAgLTEwNSwxNiArMTE2LDE1IEBACiAgICAgICAgIHNlbGYucHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3Ioc2VsZi5oYW5kbGVyKQogICAgICAgICBzZWxmLnBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0gICAgICAgIHNlbGYuc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoMCwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3Rvcnkoc2VsZi5wcm9jZXNzb3IsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLnNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICAgICAgMCwgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShzZWxmLnByb2Nlc3Nvciwgc2VsZi5wZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKIAogICAgICAgICBzZWxmLnBvcnRObyA9IHNlbGYuc2VydmVyLmdldEhvc3QoKS5wb3J0CiAKICAgICAgICAgc2VsZi50eGNsaWVudCA9IHlpZWxkIENsaWVudENyZWF0b3IocmVhY3RvciwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdENsaWVudFByb3RvY29sLAotICAgICAgICAgICAgVGhyaWZ0VGVzdC5DbGllbnQsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0Q2xpZW50UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKICAgICAgICAgc2VsZi5jbGllbnQgPSBzZWxmLnR4Y2xpZW50LmNsaWVudAogCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwpAQCAtMTI5LDcgKzEzOSw3IEBACiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJykpLCAnUHl0aG9uJykKLSAKKwogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKICAgICBkZWYgdGVzdEJ5dGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MykpLCA2MykKQEAgLTE0Nyw3ICsxNTcsOSBAQAogICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdERvdWJsZSgtNS4yMzUwOTgyMzUpKSwgLTUuMjM1MDk4MjM1KQogCi0gICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcyAKKyAgICAjIFRPRE86IGRlZiB0ZXN0QmluYXJ5KHNlbGYpIC4uLgorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgogICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKQEAgLTE1NSwzMCArMTY3LDMyIEBACiAgICAgICAgIHguaTMyX3RoaW5nID0gLTMKICAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQogICAgICAgICB5ID0geWllbGQgc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQotIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuc3RyaW5nX3RoaW5nLCAiWmVybyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuYnl0ZV90aGluZywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeS5pMzJfdGhpbmcsIC0zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5Lmk2NF90aGluZywgLTUpCi0gCisKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCiAgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgWGNlcHRpb24sIHg6CisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5lcnJvckNvZGUsIDEwMDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAjIHR5cGUgaXMgdW5kZWZpbmVkCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwotIAorCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgotICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDIpCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkKICAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHlpZWxkIHNlbGYuaGFuZGxlci5vbmV3YXlzUXVldWUuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoc2Vjb25kcywgKGVuZCAtIHN0YXJ0KSwgcGxhY2VzPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkpLCAtMSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzIyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAtRFRIUklGVENPTVBJTEVSPSQ8VEFSR0VUX0ZJTEU6dGhyaWZ0LWNvbXBpbGVyPgorICAgICAgICAgICAgLURNWV9QUk9KRUNUX0RJUj0ke1BST0pFQ1RfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9TT1VSQ0VfRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgLURNWV9DVVJSRU5UX0JJTkFSWV9ESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dlbmVyYXRlLmNtYWtlCispCisKK2FkZF90ZXN0KE5BTUUgcHl0aG9uX3Rlc3QKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SdW5DbGllbnRTZXJ2ZXIucHkgLS1nZW4tYmFzZT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CispCisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3IiIiIKK1BZVEhPTlBBVEg9Li9nZW4tcHk6Li4vLi4vbGliL3B5L2J1aWxkL2xpYi4uLiAuL0Zhc3RiaW5hcnlUZXN0LnB5CisiIiIKKworIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1laXQKKworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCisKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgorZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IEJhY2t3YXJkcywgQm9uaywgRW1wdHksIEhvbHlNb2xleSwgT25lT2ZFYWNoLCBSYW5kb21TdHVmZiwgV3JhcHBlcgorCisKK2NsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitvb2UxID0gT25lT2ZFYWNoKCkKK29vZTEuaW1fdHJ1ZSA9IFRydWUKK29vZTEuaW1fZmFsc2UgPSBGYWxzZQorb29lMS5hX2JpdGUgPSAweGQ2Citvb2UxLmludGVnZXIxNiA9IDI3MDAwCitvb2UxLmludGVnZXIzMiA9IDEgPDwgMjQKK29vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwCitvb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpCitvb2UxLnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISIKK29vZTEuem9tZ191bmljb2RlID0gdSJceGQ3XG5cYVx0IgorCitvb2UyID0gT25lT2ZFYWNoKCkKK29vZTIuaW50ZWdlcjE2ID0gMTYKK29vZTIuaW50ZWdlcjMyID0gMzIKK29vZTIuaW50ZWdlcjY0ID0gNjQKK29vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkgKyAxKSAvIDIKK29vZTIuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiCitvb2UyLnpvbWdfdW5pY29kZSA9IHUiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjN1x4ODNceGUyXHg4MFx4YmMiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgb29lMS56b21nX3VuaWNvZGUgPSBvb2UxLnpvbWdfdW5pY29kZS5lbmNvZGUoJ3V0ZjgnKQorICAgIG9vZTIuem9tZ191bmljb2RlID0gb29lMi56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKworaG0gPSBIb2x5TW9sZXkoKip7ImJpZyI6IFtdLCAiY29udGFpbiI6IHNldCgpLCAiYm9ua3MiOiB7fX0pCitobS5iaWcuYXBwZW5kKG9vZTEpCitobS5iaWcuYXBwZW5kKG9vZTIpCitobS5iaWdbMF0uYV9iaXRlID0gMHgyMgoraG0uYmlnWzFdLmFfYml0ZSA9IDB4MjIKKworaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCitobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKK2htLmNvbnRhaW4uYWRkKCgpKQorCitobS5ib25rc1sibm90aGluZyJdID0gW10KK2htLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMSwgIm1lc3NhZ2UiOiAiV2FpdC4ifSksCisgICAgQm9uaygqKnsidHlwZSI6IDIsICJtZXNzYWdlIjogIldoYXQ/In0pLAorXQoraG0uYm9ua3NbInBvZSJdID0gWworICAgIEJvbmsoKip7InR5cGUiOiAzLCAibWVzc2FnZSI6ICJxdW90aCJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNCwgIm1lc3NhZ2UiOiAidGhlIHJhdmVuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiA1LCAibWVzc2FnZSI6ICJuZXZlcm1vcmUifSksCitdCisKK3JzID0gUmFuZG9tU3R1ZmYoKQorcnMuYSA9IDEKK3JzLmIgPSAyCitycy5jID0gMworcnMubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgyMCkpCitycy5tYXBzID0gezE6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KSwgMjogV3JhcHBlcigqKnsiZm9vIjogRW1wdHkoKX0pfQorcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1Citycy50cmlwbGUgPSAzLjE0CisKKyMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKK3JzaHVnZSA9IFJhbmRvbVN0dWZmKCkKK3JzaHVnZS5teWludGxpc3QgPSBsaXN0KHJhbmdlKDEwMDAwKSkKKworbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoKip7InN1Y2Nlc3MiOiA1fSkKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhc3QsIHNsb3cpOgorICAgICAgICBzZWxmLl9mYXN0ID0gZmFzdAorICAgICAgICBzZWxmLl9zbG93ID0gc2xvdworCisgICAgZGVmIF9jaGVja193cml0ZShzZWxmLCBvKToKKyAgICAgICAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90X2Zhc3QgPSBzZWxmLl9mYXN0KHRyYW5zX2Zhc3QsIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBwcm90X3Nsb3cgPSBzZWxmLl9zbG93KHRyYW5zX3Nsb3cpCisKKyAgICAgICAgby53cml0ZShwcm90X2Zhc3QpCisgICAgICAgIG8ud3JpdGUocHJvdF9zbG93KQorICAgICAgICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCisgICAgICAgIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgT1JJRyAhPSBNSU5FOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAlc1xuZXhwZWN0ZWQ6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignd3JpdGUgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIF9jaGVja19yZWFkKHNlbGYsIG8pOgorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdyhUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKKyAgICAgICAgby53cml0ZShwcm90KQorCisgICAgICAgIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIGMgPSBvLl9fY2xhc3NfXygpCisgICAgICAgIGMucmVhZChwcm90KQorICAgICAgICBpZiBjICE9IG86CisgICAgICAgICAgICBwcmludCgiYWN0dWFsICA6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJleHBlY3RlZDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdyZWFkIHZhbHVlIG1pc21hdGNoJykKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICBkZWYgZG9fdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoSG9seU1vbGV5KCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoSG9seU1vbGV5KCkpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoaG0pCisgICAgICAgIG5vX3NldCA9IGRlZXBjb3B5KGhtKQorICAgICAgICBub19zZXQuY29udGFpbiA9IHNldCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobm9fc2V0KQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKGhtKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKHJzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzaHVnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChyc2h1Z2UpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUobXlfemVybykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChteV96ZXJvKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pKQorCisgICAgICAgICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgorICAgICAgICBvID0gQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pCisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBpZChPUklHKSAhPSBpZChNSU5FKQorCisgICAgICAgIHByb3QgPSBzZWxmLl9mYXN0KFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgby53cml0ZShwcm90KQorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdygKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihwcm90LnRyYW5zLmdldHZhbHVlKCkpKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImNvcHk6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJvcmlnOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisKKworZGVmIGRvX3Rlc3QoZmFzdCwgc2xvdyk6CisgICAgVGVzdChmYXN0LCBzbG93KS5kb190ZXN0KCkKKworCitkZWYgZG9fYmVuY2htYXJrKHByb3RvY29sLCBpdGVycz01MDAwLCBza2lwX3Nsb3c9RmFsc2UpOgorICAgIHNldHVwID0gIiIiCitmcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC57MH0gaW1wb3J0IHswfXsxfQordHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCitwcm90ID0gezB9ezF9KHRyYW5zezJ9KQorIiIiCisKKyAgICBzZXR1cF9mYXN0ID0gc2V0dXAuZm9ybWF0KHByb3RvY29sLCAnQWNjZWxlcmF0ZWQnLCAnLCBmYWxsYmFjaz1GYWxzZScpCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgc2V0dXBfc2xvdyA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJycsICcnKQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIEJlbmNobWFya3MiKQorCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgcHJpbnQoIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUKKyAgICAgICAgICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpKQorCisgICAgcHJpbnQoIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50KCdUZXN0aW5nIFRCaW5hcnlBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgVEJpbmFyeVByb3RvY29sKQorICAgIGRvX2JlbmNobWFyaygnVEJpbmFyeVByb3RvY29sJykKKyAgICBwcmludCgnVGVzdGluZyBUQ29tcGFjdEFjY2VsZXJhdGVkJykKKyAgICBkb190ZXN0KFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgVENvbXBhY3RQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RDb21wYWN0UHJvdG9jb2wnKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0KaW5kZXggNjNiN2E4OS4uODI5NjIwMCAxMDA2NDQKLS0tIGEvdGVzdC9weS9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3B5L01ha2VmaWxlLmFtCkBAIC0xNiwzMyArMTYsODIgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK0FVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXB5X3VuaXRfdGVzdHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU2VyaWFsaXphdGlvblRlc3QucHkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGVzdEVvZi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGVzdFN5bnRheC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUnVuQ2xpZW50U2VydmVyLnB5CitweV91bml0X3Rlc3RzID0gUnVuQ2xpZW50U2VydmVyLnB5CiAKIHRocmlmdF9nZW4gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5CisgICAgICAgIGdlbi1weS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZGVmYXVsdC9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weQorCisKK3ByZWNyb3NzOiAkKHRocmlmdF9nZW4pCitCVUlMVF9TT1VSQ0VTID0gJCh0aHJpZnRfZ2VuKQogCiBoZWxwZXJfc2NyaXB0cz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRlc3RDbGllbnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRlc3RTZXJ2ZXIucHkKIAogY2hlY2tfU0NSSVBUUz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAkKHRocmlmdF9nZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAkKHRocmlmdF9nZW4pIFwKICAgICAgICAgJChweV91bml0X3Rlc3RzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgJChoZWxwZXJfc2NyaXB0cykKIAogVEVTVFM9ICQocHlfdW5pdF90ZXN0cykKIAogCi1nZW4tcHkvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gcHkgJDwKK2dlbi1weS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcHkgICQ8CisKK2dlbi1weS1kZWZhdWx0LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LWRlZmF1bHQgfHwgJChNS0RJUl9QKSBnZW4tcHktZGVmYXVsdAorCSQoVEhSSUZUKSAtLWdlbiBweSAtb3V0IGdlbi1weS1kZWZhdWx0ICQ8CisKK2dlbi1weS1zbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1zbG90cyB8fCAkKE1LRElSX1ApIGdlbi1weS1zbG90cworCSQoVEhSSUZUKSAtLWdlbiBweTpzbG90cyAtb3V0IGdlbi1weS1zbG90cyAkPAorCitnZW4tcHktb2xkc3R5bGUvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktb2xkc3R5bGUgfHwgJChNS0RJUl9QKSBnZW4tcHktb2xkc3R5bGUKKwkkKFRIUklGVCkgLS1nZW4gcHk6b2xkX3N0eWxlIC1vdXQgZ2VuLXB5LW9sZHN0eWxlICQ8CisKK2dlbi1weS1ub191dGY4c3RyaW5ncy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1ub191dGY4c3RyaW5ncyB8fCAkKE1LRElSX1ApIGdlbi1weS1ub191dGY4c3RyaW5ncworCSQoVEhSSUZUKSAtLWdlbiBweTpub191dGY4c3RyaW5ncyAtb3V0IGdlbi1weS1ub191dGY4c3RyaW5ncyAkPAorCitnZW4tcHktZHluYW1pYy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1keW5hbWljIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWMKKwkkKFRIUklGVCkgLS1nZW4gcHk6ZHluYW1pYyAtb3V0IGdlbi1weS1keW5hbWljICQ8CisKK2dlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktZHluYW1pY3Nsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWNzbG90cworCSQoVEhSSUZUKSAtLWdlbiBweTpkeW5hbWljLHNsb3RzIC1vdXQgZ2VuLXB5LWR5bmFtaWNzbG90cyAkPAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tcHkKKwkkKFJNKSAtciBnZW4tcHkgZ2VuLXB5LXNsb3RzIGdlbi1weS1kZWZhdWx0IGdlbi1weS1vbGRzdHlsZSBnZW4tcHktbm9fdXRmOHN0cmluZ3MgZ2VuLXB5LWR5bmFtaWMgZ2VuLXB5LWR5bmFtaWNzbG90cwpkaWZmIC0tZ2l0IGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQppbmRleCAyYmQ2MDk0Li41NmE0MDhlIDEwMDc1NQotLS0gYS90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQorKysgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQpAQCAtMTksNDIgKzE5LDMwNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHRpbWUKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CiBpbXBvcnQgb3MKIGltcG9ydCBzaWduYWwKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAorCitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKK1NDUklQVFMgPSBbCisgICAgJ0Zhc3RiaW5hcnlUZXN0LnB5JywKKyAgICAnVGVzdEZyb3plbi5weScsCisgICAgJ1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weScsCisgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5JywKKyAgICAnU2VyaWFsaXphdGlvblRlc3QucHknLAorICAgICdUZXN0RW9mLnB5JywKKyAgICAnVGVzdFN5bnRheC5weScsCisgICAgJ1Rlc3RTb2NrZXQucHknLAorXQorRlJBTUVEID0gWyJUTm9uYmxvY2tpbmdTZXJ2ZXIiXQorU0tJUF9aTElCID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInLCAnVEh0dHBTZXJ2ZXInXQorU0tJUF9TU0wgPSBbJ1RIdHRwU2VydmVyJ10KK0VYVFJBX0RFTEFZID0gZGljdChUUHJvY2Vzc1Bvb2xTZXJ2ZXI9NS41KQorCitQUk9UT1MgPSBbCisgICAgJ2FjY2VsJywKKyAgICAnYWNjZWxjJywKKyAgICAnYmluYXJ5JywKKyAgICAnY29tcGFjdCcsCisgICAgJ2pzb24nLAorICAgICdoZWFkZXInLAorXQorCisKK2RlZiBkZWZhdWx0X3NlcnZlcnMoKToKKyAgICBzZXJ2ZXJzID0gWworICAgICAgICAnVFNpbXBsZVNlcnZlcicsCisgICAgICAgICdUVGhyZWFkZWRTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZFBvb2xTZXJ2ZXInLAorICAgICAgICAnVE5vbmJsb2NraW5nU2VydmVyJywKKyAgICAgICAgJ1RIdHRwU2VydmVyJywKKyAgICBdCisgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgorICAgICAgICBzZXJ2ZXJzLmFwcGVuZCgnVFByb2Nlc3NQb29sU2VydmVyJykKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RGb3JraW5nU2VydmVyJykKKyAgICByZXR1cm4gc2VydmVycworCiAKIGRlZiByZWxmaWxlKGZuYW1lKToKLSAgICByZXR1cm4gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIGZuYW1lKQorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgZm5hbWUpCiAKLUZSQU1FRCA9IFsiVE5vbmJsb2NraW5nU2VydmVyIl0KIAotZGVmIHJ1blRlc3Qoc2VydmVyX2NsYXNzKToKLSAgICBwcmludCAiVGVzdGluZyAiLCBzZXJ2ZXJfY2xhc3MKLSAgICBzZXJ2ZXJwcm9jID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoIlRlc3RTZXJ2ZXIucHkiKSwgc2VydmVyX2NsYXNzXSkKLSAgICB0aW1lLnNsZWVwKDAuMjUpCitkZWYgc2V0dXBfcHlwYXRoKGxpYmRpciwgZ2VuZGlyKToKKyAgICBkaXJzID0gW2xpYmRpciwgZ2VuZGlyXQorICAgIGVudiA9IGNvcHkuZGVlcGNvcHkob3MuZW52aXJvbikKKyAgICBweXBhdGggPSBlbnYuZ2V0KCdQWVRIT05QQVRIJywgTm9uZSkKKyAgICBpZiBweXBhdGg6CisgICAgICAgIGRpcnMuYXBwZW5kKHB5cGF0aCkKKyAgICBlbnZbJ1BZVEhPTlBBVEgnXSA9IG9zLnBhdGhzZXAuam9pbihkaXJzKQorICAgIGlmIGdlbmRpci5lbmRzd2l0aCgnZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzJyk6CisgICAgICAgIGVudlsnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnXSA9ICcxJworICAgIHJldHVybiBlbnYKKworCitkZWYgcnVuU2NyaXB0VGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzY3JpcHQpOgorICAgIGVudiA9IHNldHVwX3B5cGF0aChsaWJkaXIsIG9zLnBhdGguam9pbihnZW5iYXNlLCBnZW5weWRpcikpCisgICAgc2NyaXB0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoc2NyaXB0KV0KKyAgICBwcmludCgnXG5UZXN0aW5nIHNjcmlwdDogJXNcbi0tLS0nICUgKCcgJy5qb2luKHNjcmlwdF9hcmdzKSkpCisgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKHNjcmlwdF9hcmdzLCBlbnY9ZW52KQorICAgIGlmIHJldCAhPSAwOgorICAgICAgICBwcmludCgnKioqIEZBSUxFRCAqKionLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdMSUJESVI6ICVzJyAlIGxpYmRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnU0NSSVBUOiAlcycgJSBzY3JpcHQsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJTY3JpcHQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKHNjcmlwdF9hcmdzKSkpCisKKworZGVmIHJ1blNlcnZpY2VUZXN0KGxpYmRpciwgZ2VuYmFzZSwgZ2VucHlkaXIsIHNlcnZlcl9jbGFzcywgcHJvdG8sIHBvcnQsIHVzZV96bGliLCB1c2Vfc3NsLCB2ZXJib3NlKToKKyAgICBlbnYgPSBzZXR1cF9weXBhdGgobGliZGlyLCBvcy5wYXRoLmpvaW4oZ2VuYmFzZSwgZ2VucHlkaXIpKQorICAgICMgQnVpbGQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIHNlcnZlcl9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0U2VydmVyLnB5JyldCisgICAgY2xpX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoJ1Rlc3RDbGllbnQucHknKV0KKyAgICBmb3Igd2hpY2ggaW4gKHNlcnZlcl9hcmdzLCBjbGlfYXJncyk6CisgICAgICAgIHdoaWNoLmFwcGVuZCgnLS1wcm90b2NvbD0lcycgJSBwcm90bykgICMgYWNjZWwsIGJpbmFyeSwgY29tcGFjdCBvciBqc29uCisgICAgICAgIHdoaWNoLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpICAjIGRlZmF1bHQgdG8gOTA5MAorICAgICAgICBpZiB1c2VfemxpYjoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLS16bGliJykKKyAgICAgICAgaWYgdXNlX3NzbDoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLS1zc2wnKQorICAgICAgICBpZiB2ZXJib3NlID09IDA6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy1xJykKKyAgICAgICAgaWYgdmVyYm9zZSA9PSAyOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctdicpCisgICAgIyBzZXJ2ZXItc3BlY2lmaWMgb3B0aW9uIHRvIHNlbGVjdCBzZXJ2ZXIgY2xhc3MKKyAgICBzZXJ2ZXJfYXJncy5hcHBlbmQoc2VydmVyX2NsYXNzKQorICAgICMgY2xpZW50LXNwZWNpZmljIGNtZGxpbmUgb3B0aW9ucworICAgIGlmIHNlcnZlcl9jbGFzcyBpbiBGUkFNRUQ6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9ZnJhbWVkJykKKyAgICBlbHNlOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWJ1ZmZlcmVkJykKKyAgICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLWh0dHA9LycpCisgICAgaWYgdmVyYm9zZSA+IDA6CisgICAgICAgIHByaW50KCdUZXN0aW5nIHNlcnZlciAlczogJXMnICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKKyAgICBzZXJ2ZXJwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZXJ2ZXJfYXJncywgZW52PWVudikKKworICAgIGRlZiBlbnN1cmVTZXJ2ZXJBbGl2ZSgpOgorICAgICAgICBpZiBzZXJ2ZXJwcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCgnRkFJTDogU2VydmVyIHByb2Nlc3MgKCVzKSBmYWlsZWQgd2l0aCByZXRjb2RlICVkJykKKyAgICAgICAgICAgICAgICAgICUgKCcgJy5qb2luKHNlcnZlcl9hcmdzKSwgc2VydmVycHJvYy5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignU2VydmVyIHN1YnByb2Nlc3MgJXMgZGllZCwgYXJnczogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQorCisgICAgIyBXYWl0IGZvciB0aGUgc2VydmVyIHRvIHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucyBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAgICBzbGVlcF90aW1lID0gMC4xICAjIFNlY29uZHMKKyAgICBtYXhfYXR0ZW1wdHMgPSAxMDAKKyAgICBhdHRlbXB0ID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHNvY2s0ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNvY2s2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVDYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNvY2s0LmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgPT0gMCBcCisgICAgICAgICAgICAgICAgICAgIG9yIHNvY2s2LmNvbm5lY3RfZXgoKCc6OjEnLCBwb3J0KSkgPT0gMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYXR0ZW1wdCArPSAxCisgICAgICAgICAgICBpZiBhdHRlbXB0ID49IG1heF9hdHRlbXB0czoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRlc3RTZXJ2ZXIgbm90IHJlYWR5IG9uIHBvcnQgJWQgYWZ0ZXIgJS4yZiBzZWNvbmRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwb3J0LCBzbGVlcF90aW1lICogYXR0ZW1wdCkpCisgICAgICAgICAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCisgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3RpbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrNC5jbG9zZSgpCisgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCisKICAgICB0cnk6Ci0gICAgICAgIGFyZ3YgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoIlRlc3RDbGllbnQucHkiKV0KLSAgICAgICAgaWYgc2VydmVyX2NsYXNzIGluIEZSQU1FRDoKLSAgICAgICAgICAgIGFyZ3YuYXBwZW5kKCctLWZyYW1lZCcpCi0gICAgICAgIGlmIHNlcnZlcl9jbGFzcyA9PSAnVEh0dHBTZXJ2ZXInOgotICAgICAgICAgICAgYXJndi5hcHBlbmQoJy0taHR0cD0vJykKLSAgICAgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3YpCisgICAgICAgIGlmIHZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ1Rlc3RpbmcgY2xpZW50OiAlcycgJSAoJyAnLmpvaW4oY2xpX2FyZ3MpKSkKKyAgICAgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGNsaV9hcmdzLCBlbnY9ZW52KQogICAgICAgICBpZiByZXQgIT0gMDoKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic3VicHJvY2VzcyBmYWlsZWQiKQorICAgICAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcHJpbnQoJ0xJQkRJUjogJXMnICUgbGliZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDbGllbnQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKGNsaV9hcmdzKSkpCiAgICAgZmluYWxseToKLSAgICAgICAgIyBmaXhtZTogc2hvdWxkIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKLSAgICAgICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnbmFsLlNJR0tJTEwpCisgICAgICAgICMgY2hlY2sgdGhhdCBzZXJ2ZXIgZGlkbid0IGRpZQorICAgICAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCisgICAgICAgIGV4dHJhX3NsZWVwID0gRVhUUkFfREVMQVkuZ2V0KHNlcnZlcl9jbGFzcywgMCkKKyAgICAgICAgaWYgZXh0cmFfc2xlZXAgPiAwIGFuZCB2ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdHaXZpbmcgJXMgKHByb3RvPSVzLHpsaWI9JXMsc3NsPSVzKSBhbiBleHRyYSAlZCBzZWNvbmRzIGZvciBjaGlsZCcKKyAgICAgICAgICAgICAgICAgICdwcm9jZXNzZXMgdG8gdGVybWluYXRlIHZpYSBhbGFybScKKyAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgcHJvdG8sIHVzZV96bGliLCB1c2Vfc3NsLCBleHRyYV9zbGVlcCkpCisgICAgICAgICAgICB0aW1lLnNsZWVwKGV4dHJhX3NsZWVwKQorICAgICAgICBzaWcgPSBzaWduYWwuU0lHS0lMTCBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cycgZWxzZSBzaWduYWwuU0lHQUJSVAorICAgICAgICBvcy5raWxsKHNlcnZlcnByb2MucGlkLCBzaWcpCisgICAgICAgIHNlcnZlcnByb2Mud2FpdCgpCiAKLSAgICAjIHdhaXQgZm9yIHNodXRkb3duCi0gICAgdGltZS5zbGVlcCgxKQogCi1tYXAocnVuVGVzdCwgWwotICAiVFNpbXBsZVNlcnZlciIsCi0gICJUVGhyZWFkZWRTZXJ2ZXIiLAotICAiVFRocmVhZFBvb2xTZXJ2ZXIiLAotICAiVEZvcmtpbmdTZXJ2ZXIiLAotICAiVE5vbmJsb2NraW5nU2VydmVyIiwKLSAgIlRIdHRwU2VydmVyIiwKLSAgXSkKK2NsYXNzIFRlc3RDYXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5iYXNlLCBsaWJkaXIsIHBvcnQsIGdlbmRpcnMsIHNlcnZlcnMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLmdlbmJhc2UgPSBnZW5iYXNlCisgICAgICAgIHNlbGYubGliZGlyID0gbGliZGlyCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLmdlbmRpcnMgPSBnZW5kaXJzCisgICAgICAgIHNlbGYuc2VydmVycyA9IHNlcnZlcnMKKworICAgIGRlZiBkZWZhdWx0X2NvbmYoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZ2VuZGlyJzogc2VsZi5nZW5kaXJzWzBdLAorICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYuc2VydmVyc1swXSwKKyAgICAgICAgICAgICdwcm90byc6IFBST1RPU1swXSwKKyAgICAgICAgICAgICd6bGliJzogRmFsc2UsCisgICAgICAgICAgICAnc3NsJzogRmFsc2UsCisgICAgICAgIH0KKworICAgIGRlZiBydW4oc2VsZiwgY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgIHdpdGhfemxpYiA9IGNvbmZbJ3psaWInXQorICAgICAgICB3aXRoX3NzbCA9IGNvbmZbJ3NzbCddCisgICAgICAgIHRyeV9zZXJ2ZXIgPSBjb25mWydzZXJ2ZXInXQorICAgICAgICB0cnlfcHJvdG8gPSBjb25mWydwcm90byddCisgICAgICAgIGdlbnB5ZGlyID0gY29uZlsnZ2VuZGlyJ10KKyAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAorICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKKyAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdcblRlc3QgcnVuICMlZDogIChpbmNsdWRlcyAlcykgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJworICAgICAgICAgICAgICAgICAgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkpCisgICAgICAgIHJ1blNlcnZpY2VUZXN0KHNlbGYubGliZGlyLCBzZWxmLmdlbmJhc2UsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHNlbGYucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCwgc2VsZi52ZXJib3NlKQorICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ09LOiBGaW5pc2hlZCAoaW5jbHVkZXMgJXMpICAlcyAvICVzIHByb3RvIC8gemxpYj0lcyAvIFNTTD0lcy4gICAlZCBjb21iaW5hdGlvbnMgdGVzdGVkLicKKyAgICAgICAgICAgICAgICAgICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHRlc3RfZmVhdHVyZShzZWxmLCBuYW1lLCB2YWx1ZXMpOgorICAgICAgICB0ZXN0X2NvdW50ID0gMAorICAgICAgICBjb25mID0gc2VsZi5kZWZhdWx0X2NvbmYoKQorICAgICAgICBmb3IgdHJ5X3NlcnZlciBpbiB2YWx1ZXM6CisgICAgICAgICAgICBjb25mW25hbWVdID0gdHJ5X3NlcnZlcgorICAgICAgICAgICAgaWYgc2VsZi5ydW4oY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgICAgICAgICAgdGVzdF9jb3VudCArPSAxCisgICAgICAgIHJldHVybiB0ZXN0X2NvdW50CisKKyAgICBkZWYgcnVuX2FsbF90ZXN0cyhzZWxmKToKKyAgICAgICAgdGVzdF9jb3VudCA9IDAKKyAgICAgICAgZm9yIHRyeV9zZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJzOgorICAgICAgICAgICAgZm9yIGdlbnB5ZGlyIGluIHNlbGYuZ2VuZGlyczoKKyAgICAgICAgICAgICAgICBmb3IgdHJ5X3Byb3RvIGluIFBST1RPUzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHdpdGhfemxpYiBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2l0aF96bGliIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfWkxJQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHdpdGhfc3NsIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIFNTTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdpdGhfc3NsIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfU1NMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdcblRlc3QgcnVuICMlZDogIChpbmNsdWRlcyAlcykgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TZXJ2aWNlVGVzdChzZWxmLmxpYmRpciwgc2VsZi5nZW5iYXNlLCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBzZWxmLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ09LOiBGaW5pc2hlZCAoaW5jbHVkZXMgJXMpICAlcyAvICVzIHByb3RvIC8gemxpYj0lcyAvIFNTTD0lcy4gICAlZCBjb21iaW5hdGlvbnMgdGVzdGVkLicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkpCisgICAgICAgIHJldHVybiB0ZXN0X2NvdW50CisKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWFsbCcsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9J2FsbCcpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXJzJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXJzJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSdkZWZhdWx0LHNsb3RzLG9sZHN0eWxlLG5vX3V0ZjhzdHJpbmdzLGR5bmFtaWMsZHluYW1pY3Nsb3RzJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXJlY3RvcnkgZXh0ZW5zaW9ucyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHVzZWQgYXMgc3VmZml4ZXMgZm9yIFwiZ2VuLXB5LSpcIiBhZGRlZCBzeXMucGF0aCBmb3IgaW5kaXZpZHVhbCB0ZXN0cycpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLCBkZWZhdWx0PTkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1MJywgJy0tbGliZGlyJywgZGVzdD0ibGliZGlyIiwgZGVmYXVsdD1sb2NhbF9saWJwYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlyZWN0b3J5IHBhdGggdGhhdCBjb250YWlucyBUaHJpZnQgUHl0aG9uIGxpYnJhcnkiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbi1iYXNlJywgZGVzdD0iZ2VuX2Jhc2UiLCBkZWZhdWx0PVNDUklQVF9ESVIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlyZWN0b3J5IHBhdGggdGhhdCBjb250YWlucyBUaHJpZnQgUHl0aG9uIGxpYnJhcnkiKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHModmVyYm9zZT0xKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBnZW5lcmF0ZWRfZGlycyA9IFtdCisgICAgZm9yIGdwX2RpciBpbiBvcHRpb25zLmdlbnB5ZGlycy5zcGxpdCgnLCcpOgorICAgICAgICBnZW5lcmF0ZWRfZGlycy5hcHBlbmQoJ2dlbi1weS0lcycgJSAoZ3BfZGlyKSkKKworICAgICMgY29tbWFuZGxpbmUgcGVybWl0cyBhIHNpbmdsZSBjbGFzcyBuYW1lIHRvIGJlIHNwZWNpZmllZCB0byBvdmVycmlkZSBTRVJWRVJTPVsuLi5dCisgICAgc2VydmVycyA9IGRlZmF1bHRfc2VydmVycygpCisgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmIGFyZ3NbMF0gaW4gc2VydmVyczoKKyAgICAgICAgICAgIHNlcnZlcnMgPSBhcmdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgnVW5hdmFpbGFibGUgc2VydmVyIHR5cGUgIiVzIiwgcGxlYXNlIGNob29zZSBvbmUgb2Y6ICVzJyAlIChhcmdzWzBdLCBzZXJ2ZXJzKSkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICB0ZXN0cyA9IFRlc3RDYXNlcyhvcHRpb25zLmdlbl9iYXNlLCBvcHRpb25zLmxpYmRpciwgb3B0aW9ucy5wb3J0LCBnZW5lcmF0ZWRfZGlycywgc2VydmVycywgb3B0aW9ucy52ZXJib3NlKQorCisgICAgIyBydW4gdGVzdHMgd2l0aG91dCBhIGNsaWVudC9zZXJ2ZXIgZmlyc3QKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgcHJpbnQoJyBFeGVjdXRpbmcgaW5kaXZpZHVhbCB0ZXN0IHNjcmlwdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJykKKyAgICBwcmludCgnIERpcmVjdG9yaWVzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihnZW5lcmF0ZWRfZGlycykpCisgICAgcHJpbnQoJyBTY3JpcHRzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihTQ1JJUFRTKSkKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgZm9yIGdlbnB5ZGlyIGluIGdlbmVyYXRlZF9kaXJzOgorICAgICAgICBmb3Igc2NyaXB0IGluIFNDUklQVFM6CisgICAgICAgICAgICBydW5TY3JpcHRUZXN0KG9wdGlvbnMubGliZGlyLCBvcHRpb25zLmdlbl9iYXNlLCBnZW5weWRpciwgc2NyaXB0KQorCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIHByaW50KCcgRXhlY3V0aW5nIENsaWVudC9TZXJ2ZXIgdGVzdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJykKKyAgICBwcmludCgnIFNlcnZlcnMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKHNlcnZlcnMpKQorICAgIHByaW50KCcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKSkKKyAgICBwcmludCgnIFByb3RvY29scyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oUFJPVE9TKSkKKyAgICBwcmludCgnIE9wdGlvbnMgdG8gYmUgdGVzdGVkOiBaTElCKHllcy9ubyksIFNTTCh5ZXMvbm8pJykKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisKKyAgICBpZiBvcHRpb25zLmFsbDoKKyAgICAgICAgdGVzdHMucnVuX2FsbF90ZXN0cygpCisgICAgZWxzZToKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdnZW5kaXInLCBnZW5lcmF0ZWRfZGlycykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdzZXJ2ZXInLCBzZXJ2ZXJzKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3Byb3RvJywgUFJPVE9TKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3psaWInLCBbRmFsc2UsIFRydWVdKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3NzbCcsIFtGYWxzZSwgVHJ1ZV0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5IGIvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQppbmRleCA5ZTE4YWVhLi5lZjc5ODM1IDEwMDc1NQotLS0gYS90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CisrKyBiL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKQEAgLTE5LDEzNyArMTksNDM5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKAorICAgIEJvbmssCisgICAgQm9vbHMsCisgICAgTGFyZ2VEZWx0YXMsCisgICAgTGlzdEJvbmtzLAorICAgIE5lc3RlZExpc3RzQm9uaywKKyAgICBOZXN0ZWRMaXN0c0kzMngyLAorICAgIE5lc3RlZExpc3RzSTMyeDMsCisgICAgTmVzdGVkTWl4ZWR4MiwKKyAgICBOdW1iZXJ6LAorICAgIFZlcnNpb25pbmdUZXN0VjEsCisgICAgVmVyc2lvbmluZ1Rlc3RWMiwKKyAgICBYdHJ1Y3QsCisgICAgWHRydWN0MiwKKykKIAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBSZWNUcmVlCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFJlY0xpc3QKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgQ29SZWMKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgQ29SZWMyCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFZlY3RvclRlc3QKK2Zyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCBDb21wYWN0UHJvdG9UZXN0U3RydWN0LCBFbXB0eQogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wsIFRKU09OUHJvdG9jb2wKIGZyb20gdGhyaWZ0LlRTZXJpYWxpemF0aW9uIGltcG9ydCBzZXJpYWxpemUsIGRlc2VyaWFsaXplCitpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0aW1lCisKIAogY2xhc3MgQWJzdHJhY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICBzZWxmLnYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCi0gICAgICAgICAgKQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi52MW9iaiA9IFZlcnNpb25pbmdUZXN0VjEoCisgICAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAorICAgICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKKyAgICAgICAgICAgIGVuZF9pbl9ib3RoPTU0MzIxLAorICAgICAgICApCiAKLSAgICAgIHNlbGYudjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgbmV3aW50PTEsCi0gICAgICAgICAgbmV3Ynl0ZT0yLAotICAgICAgICAgIG5ld3Nob3J0PTMsCi0gICAgICAgICAgbmV3bG9uZz00LAotICAgICAgICAgIG5ld2RvdWJsZT01LjAsCi0gICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAotICAgICAgICAgIG5ld2xpc3Q9WzcsOCw5XSwKLSAgICAgICAgICBuZXdzZXQ9WzQyLDEsOF0sCi0gICAgICAgICAgbmV3bWFwPXsxOjIsMjozfSwKLSAgICAgICAgICBuZXdzdHJpbmc9IkhvbGEhIiwKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgICAgIHNlbGYudjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gIGRlZiBfc2VyaWFsaXplKHNlbGYsIG9iaik6Ci0gICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgICAgb2JqLndyaXRlKHByb3QpCi0gICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKKyAgICAgICAgc2VsZi5ib29sc19mbGlwcGVkID0gQm9vbHMoaW1fdHJ1ZT1GYWxzZSwgaW1fZmFsc2U9VHJ1ZSkKIAotICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgotICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgICByZXQgPSBvYmp0eXBlKCkKLSAgICAgIHJldC5yZWFkKHByb3QpCi0gICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYubGFyZ2VfZGVsdGFzID0gTGFyZ2VEZWx0YXMoCisgICAgICAgICAgICBiMT1zZWxmLmJvb2xzLAorICAgICAgICAgICAgYjEwPXNlbGYuYm9vbHNfZmxpcHBlZCwKKyAgICAgICAgICAgIGIxMDA9c2VsZi5ib29scywKKyAgICAgICAgICAgIGNoZWNrX3RydWU9VHJ1ZSwKKyAgICAgICAgICAgIGIxMDAwPXNlbGYuYm9vbHNfZmxpcHBlZCwKKyAgICAgICAgICAgIGNoZWNrX2ZhbHNlPUZhbHNlLAorICAgICAgICAgICAgdmVydHdvMjAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9J1dvcmxkIScsIHR5cGU9MzE0KSksCisgICAgICAgICAgICBhX3NldDI1MDA9c2V0KFsnbGF6eScsICdicm93bicsICdjb3cnXSksCisgICAgICAgICAgICB2ZXJ0d28zMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c2V0PXNldChbMiwgMywgNSwgNywgMTFdKSksCisgICAgICAgICAgICBiaWdfbnVtYmVycz1bMiAqKiA4LCAyICoqIDE2LCAyICoqIDMxIC0gMSwgLSgyICoqIDMxIC0gMSldCisgICAgICAgICkKIAotICBkZWYgdGVzdEZvcndhcmRzKHNlbGYpOgotICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjFvYmouYmVnaW5faW5fYm90aCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52MW9iai5lbmRfaW5fYm90aCkKKyAgICAgICAgc2VsZi5jb21wYWN0X3N0cnVjdCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgICBhX2J5dGU9MTI3LAorICAgICAgICAgICAgYV9pMTY9MzIwMDAsCisgICAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAorICAgICAgICAgICAgYV9pNjQ9MHhmZmZmZmZmZmZmLAorICAgICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAorICAgICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCisgICAgICAgICAgICB0cnVlX2ZpZWxkPVRydWUsCisgICAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKKyAgICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAorICAgICAgICAgICAgYnl0ZV9saXN0PVstMTI3LCAtMSwgMCwgMSwgMTI3XSwKKyAgICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKKyAgICAgICAgICAgIGkzMl9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHg3ZmZmZmZmZl0sCisgICAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCisgICAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCisgICAgICAgICAgICBzdHJpbmdfbGlzdD1bImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdLAorICAgICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKKyAgICAgICAgICAgIGJ5dGVfc2V0PXNldChbLTEyNywgLTEsIDAsIDEsIDEyN10pLAorICAgICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKKyAgICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCisgICAgICAgICAgICBpNjRfc2V0PXNldChbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0pLAorICAgICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKKyAgICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAorICAgICAgICAgICAgYm9vbGVhbl9zZXQ9c2V0KFtUcnVlLCBGYWxzZV0pLAorICAgICAgICAgICAgIyBzdHJ1Y3Rfc2V0PXNldChbRW1wdHkoKV0pLCAjIHVuaGFzaGFibGUgaW5zdGFuY2UKKyAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezE6IDJ9LAorICAgICAgICAgICAgaTE2X2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmOiAxfSwKKyAgICAgICAgICAgIGkzMl9ieXRlX21hcD17MTogMSwgLTE6IDEsIDB4N2ZmZmZmZmY6IDF9LAorICAgICAgICAgICAgaTY0X2J5dGVfbWFwPXswOiAxLCAxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZmZmZmZmZmZmOiAxfSwKKyAgICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMTogMSwgMS4xOiAxfSwKKyAgICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IjogMSwgInNlY29uZCI6IDIsICJ0aGlyZCI6IDMsICIiOiAwfSwKKyAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWU6IDEsIEZhbHNlOiAwfSwKKyAgICAgICAgICAgIGJ5dGVfaTE2X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZn0sCisgICAgICAgICAgICBieXRlX2kzMl9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTY0X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCisgICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA9ezE6IDAuMSwgMjogLTAuMSwgMzogMTAwMDAwMC4xfSwKKyAgICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MTogIiIsIDI6ICJibGFoIiwgMzogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAorICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MTogVHJ1ZSwgMjogRmFsc2V9LAorICAgICAgICAgICAgIyBsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICBieXRlX21hcF9tYXA9ezA6IHt9LCAxOiB7MTogMX0sIDI6IHsxOiAxLCAyOiAyfX0sCisgICAgICAgICAgICBieXRlX3NldF9tYXA9ezA6IHNldChbXSksIDE6IHNldChbMV0pLCAyOiBzZXQoWzEsIDJdKX0sCisgICAgICAgICAgICBieXRlX2xpc3RfbWFwPXswOiBbXSwgMTogWzFdLCAyOiBbMSwgMl19LAorICAgICAgICApCiAKLSAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6Ci0gICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52Mm9iai5iZWdpbl9pbl9ib3RoKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MiA9IE5lc3RlZExpc3RzSTMyeDIoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWzEsIDEsIDJdLAorICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICBbMywgNSwgOF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzID0gTmVzdGVkTGlzdHNJMzJ4MygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICAgICAgWzEsIDQsIDldCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5uZXN0ZWRfbWl4ZWR4MiA9IE5lc3RlZE1peGVkeDIoaW50X3NldF9saXN0PVsKKyAgICAgICAgICAgIHNldChbMSwgMiwgM10pLAorICAgICAgICAgICAgc2V0KFsxLCA0LCA5XSksCisgICAgICAgICAgICBzZXQoWzEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pLAorICAgICAgICAgICAgc2V0KFstMSwgMCwgMV0pCisgICAgICAgIF0sCisgICAgICAgICAgICAjIG5vdGUsIHRoZSBzZXRzIGJlbG93IGFyZSBzZXRzIG9mIGNoYXJzLCBzaW5jZSB0aGUgc3RyaW5ncyBhcmUgaXRlcmF0ZWQKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0PXsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9WworICAgICAgICAgICAgICAgIHsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgICAgICB7MTAwOiBzZXQoJ2xtbicpLCAyMDA6IHNldCgnb3BxJyksIDMwMDogc2V0KCdSU1QnKX0sCisgICAgICAgICAgICAgICAgezEwMDA6IHNldCgndXZ3JyksIDIwMDA6IHNldCgnd3h5JyksIDMwMDA6IHNldCgnWFlaJyl9XQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uayA9IE5lc3RlZExpc3RzQm9uaygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBmaXJzdCcsIHR5cGU9MSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgc2Vjb25kJywgdHlwZT0xKQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgZmlyc3QnLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIHNlY29uZCcsIHR5cGU9MikKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubGlzdF9ib25rcyA9IExpc3RCb25rcygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQicsIHR5cGU9MiksCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBDJywgdHlwZT0wKQorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgdGVzdEZvcndhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYxb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52MW9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYxb2JqKQorCisgICAgZGVmIHRlc3RTZXJpYWxpemVWMihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjJvYmopCisKKyAgICBkZWYgdGVzdEJvb2xzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYudjFvYmopCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKEJvb2xzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5ib29scykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzX2ZsaXBwZWQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHNfZmxpcHBlZCkKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmJvb2xzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGFyZ2VEZWx0YXMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxhcmdlX2RlbHRhcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZE1peGVkeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZE1peGVkeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9taXhlZHgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX21peGVkeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzQm9uayhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNCb25rLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19ib25rKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMaXN0Qm9ua3Moc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExpc3RCb25rcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGlzdF9ib25rcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5saXN0X2JvbmtzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGlzdF9ib25rcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgc2VsZi5fc2VyaWFsaXplKHNlbGYuY29tcGFjdF9zdHJ1Y3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5jb21wYWN0X3N0cnVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0SW50ZWdlckxpbWl0cyhzZWxmKToKKyAgICAgICAgaWYgKHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3lzLnZlcnNpb25faW5mb1sxXSA8PSA2KToKKyAgICAgICAgICAgIHByaW50KCdTa2lwcGluZyB0ZXN0SW50ZWdlckxpbWl0cyBmb3IgUHl0aG9uIDIuNicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmFkX3ZhbHVlcyA9IFtDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0xMjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0tMTI5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PTMyNzY4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0tMzI3NjkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9MjE0NzQ4MzY0OCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9LTIxNDc0ODM2NDkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9OTIyMzM3MjAzNjg1NDc3NTgwOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDkpCisgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIGZvciB2YWx1ZSBpbiBiYWRfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBzZWxmLl9zZXJpYWxpemUsIHZhbHVlKQorCisgICAgZGVmIHRlc3RSZWNUcmVlKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgcmVjdXJzaXZlIHRyZWUgbm9kZSBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY1RyZWUoaXRlbT1pZHgsIGNoaWxkcmVuPU5vbmUpCisgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQobm9kZSkKKworICAgICAgICBwYXJlbnQgPSBSZWNUcmVlKGl0ZW09MCwgY2hpbGRyZW49Y2hpbGRyZW4pCisgICAgICAgIHNlcmRlX3BhcmVudCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY1RyZWUsIHNlbGYuX3NlcmlhbGl6ZShwYXJlbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBzZXJkZV9wYXJlbnQuaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNCwgbGVuKHNlcmRlX3BhcmVudC5jaGlsZHJlbikpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZXJkZV9wYXJlbnQuY2hpbGRyZW46CisgICAgICAgICAgICAjIENhbm5vdCB1c2UgYXNzZXJ0SXNJbnN0YW5jZSBpbiBweXRob24gMi42PworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY2hpbGQsIFJlY1RyZWUpKQorCisgICAgZGVmIF9idWlsZExpbmtlZExpc3Qoc2VsZik6CisgICAgICAgIGhlYWQgPSBjdXIgPSBSZWNMaXN0KGl0ZW09MCkKKyAgICAgICAgZm9yIGlkeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIG5vZGUgPSBSZWNMaXN0KGl0ZW09aWR4KQorICAgICAgICAgICAgY3VyLm5leHRpdGVtID0gbm9kZQorICAgICAgICAgICAgY3VyID0gbm9kZQorICAgICAgICByZXR1cm4gaGVhZAorCisgICAgZGVmIF9jb2xsYXBzZUxpbmtlZExpc3Qoc2VsZiwgaGVhZCk6CisgICAgICAgIG91dF9saXN0ID0gW10KKyAgICAgICAgY3VyID0gaGVhZAorICAgICAgICB3aGlsZSBjdXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvdXRfbGlzdC5hcHBlbmQoY3VyLml0ZW0pCisgICAgICAgICAgICBjdXIgPSBjdXIubmV4dGl0ZW0KKyAgICAgICAgcmV0dXJuIG91dF9saXN0CisKKyAgICBkZWYgdGVzdFJlY0xpc3Qoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgbGlua2VkIGxpc3QgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIHJlY19saXN0ID0gc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCkKKyAgICAgICAgc2VyZGVfbGlzdCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY0xpc3QsIHNlbGYuX3NlcmlhbGl6ZShyZWNfbGlzdCkpCisgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KHNlcmRlX2xpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFswLCAxLCAyLCAzLCA0XSwgb3V0X2xpc3QpCisKKyAgICBkZWYgdGVzdENvUmVjKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgY28tcmVjdXJzaXZlIHN0cnVjdHVyZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIGl0ZW0xID0gQ29SZWMoKQorICAgICAgICBpdGVtMiA9IENvUmVjMigpCisKKyAgICAgICAgaXRlbTEub3RoZXIgPSBpdGVtMgorICAgICAgICBpdGVtMi5vdGhlciA9IGl0ZW0xCisKKyAgICAgICAgIyBOT1RFIFtlY29ubmVyNzI0LDIwMTctMDYtMjFdOiBUaGVzZSBvYmplY3RzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIHNlcmlhbGl6YXRpb24KKyAgICAgICAgIyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AuIGZidGhyaWZ0IGFsc28gc3VmZmVycyBmcm9tIHRoaXMKKyAgICAgICAgIyBwcm9ibGVtLgorCisgICAgZGVmIHRlc3RSZWNWZWN0b3Ioc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBhIGxpc3Qgb2YgcmVjdXJzaXZlIG5vZGVzIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBteWxpc3QgPSBbc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCksIHNlbGYuX2J1aWxkTGlua2VkTGlzdCgpXQorICAgICAgICBteXZlYyA9IFZlY3RvclRlc3QobGlzdGVyPW15bGlzdCkKKworICAgICAgICBzZXJkZV92ZWMgPSBzZWxmLl9kZXNlcmlhbGl6ZShWZWN0b3JUZXN0LCBzZWxmLl9zZXJpYWxpemUobXl2ZWMpKQorICAgICAgICBnb2xkZW5fbGlzdCA9IFswLCAxLCAyLCAzLCA0XQorICAgICAgICBmb3IgY3VyX2xpc3QgaW4gc2VyZGVfdmVjLmxpc3RlcjoKKyAgICAgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KGN1cl9saXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbGlzdCwgb3V0X2xpc3QpCiAKIAogY2xhc3MgTm9ybWFsQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKIAogY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKwogCiBjbGFzcyBDb21wYWN0UHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChBYnN0cmFjdFRlc3QpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpCisKKworY2xhc3MgSlNPTlByb3RvY29sVGVzdChBYnN0cmFjdFRlc3QpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwogCiBjbGFzcyBBY2NlbGVyYXRlZEZyYW1lZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgdGVzdFNwbGl0KHNlbGYpOgotICAgICIiIlRlc3QgRnJhbWVkVHJhbnNwb3J0IGFuZCBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCisgICAgZGVmIHRlc3RTcGxpdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKIAotICAgIFRlc3RzIHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIFRGcmFtZWRUcmFuc3BvcnQKLSAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCisgICAgICAgIFRlc3RzIHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAgICAgcGxheSBuaWNlbHkgdG9nZXRoZXIgd2hlbiBhIHJlYWQgc3BhbnMgYSBmcmFtZSIiIgogCi0gICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQotICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKyAgICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorICAgICAgICBiaWdzdHJpbmcgPSAiIi5qb2luKGNocihieXRlKSBmb3IgYnl0ZSBpbiByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikgKyAxKSkKIAotICAgIGRhdGFidWYgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGRhdGFidWYpCi0gICAgcHJvdC53cml0ZUkzMig0MikKLSAgICBwcm90LndyaXRlU3RyaW5nKGJpZ3N0cmluZykKLSAgICBwcm90LndyaXRlSTE2KDI0KQotICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKLSAgICBjdXRwb2ludCA9IGxlbihkYXRhKS8yCi0gICAgcGFydHMgPSBbIGRhdGFbOmN1dHBvaW50XSwgZGF0YVtjdXRwb2ludDpdIF0KKyAgICAgICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGRhdGFidWYpCisgICAgICAgIHByb3Qud3JpdGVJMzIoNDIpCisgICAgICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQorICAgICAgICBwcm90LndyaXRlSTE2KDI0KQorICAgICAgICBkYXRhID0gZGF0YWJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpIC8vIDIKKyAgICAgICAgcGFydHMgPSBbZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol1dCiAKLSAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBmcmFtZWRfd3JpdGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCi0gICAgZm9yIHBhcnQgaW4gcGFydHM6Ci0gICAgICBmcmFtZWRfd3JpdGVyLndyaXRlKHBhcnQpCi0gICAgICBmcmFtZWRfd3JpdGVyLmZsdXNoKCkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKKyAgICAgICAgZnJhbWVkX2J1ZmZlciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKKyAgICAgICAgZm9yIHBhcnQgaW4gcGFydHM6CisgICAgICAgICAgICBmcmFtZWRfd3JpdGVyLndyaXRlKHBhcnQpCisgICAgICAgICAgICBmcmFtZWRfd3JpdGVyLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSksIGxlbihkYXRhKSArIDgpCiAKLSAgICAjIFJlY3JlYXRlIGZyYW1lZF9idWZmZXIgc28gd2UgY2FuIHJlYWQgZnJvbSBpdC4KLSAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSkKLSAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZnJhbWVkX3JlYWRlcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkzMigpLCA0MikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRJMTYoKSwgMjQpCisgICAgICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSkKKyAgICAgICAgZnJhbWVkX3JlYWRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkzMigpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRTdHJpbmcoKSwgYmlnc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKwogCiBjbGFzcyBTZXJpYWxpemVyc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiB0ZXN0U2VyaWFsaXplVGhlbkRlc2VyaWFsaXplKHNlbGYpOgotICAgIG9iaiA9IFh0cnVjdDIoaTMyX3RoaW5nPTEsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCisgICAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6CisgICAgICAgIG9iaiA9IFh0cnVjdDIoaTMyX3RoaW5nPTEsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9ImZvbyIpKQogCi0gICAgczEgPSBzZXJpYWxpemUob2JqKQotICAgIGZvciBpIGluIHJhbmdlKDEwKToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMxLCBzZXJpYWxpemUob2JqKSkKLSAgICAgIG9iamNvcHkgPSBYdHJ1Y3QyKCkKLSAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorICAgICAgICBzMSA9IHNlcmlhbGl6ZShvYmopCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMxLCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgICAgIG9iamNvcHkgPSBYdHJ1Y3QyKCkKKyAgICAgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQogCi0gICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKLSAgICBvYmpjb3B5ID0gWHRydWN0KCkKLSAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIG9iaiA9IFh0cnVjdChzdHJpbmdfdGhpbmc9ImJhciIpCisgICAgICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQorICAgICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorCisgICAgICAgICMgdGVzdCBib29sZWFucworICAgICAgICBvYmogPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQorICAgICAgICBvYmpjb3B5ID0gQm9vbHMoKQorICAgICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorCisgICAgICAgICMgdGVzdCBlbnVtcworICAgICAgICBmb3IgbnVtLCBuYW1lIGluIE51bWJlcnouX1ZBTFVFU19UT19OQU1FUy5pdGVtcygpOgorICAgICAgICAgICAgb2JqID0gQm9uayhtZXNzYWdlPSdlbnVtIE51bWJlcnogdmFsdWUgJWQgaXMgc3RyaW5nICVzJyAlIChudW0sIG5hbWUpLCB0eXBlPW51bSkKKyAgICAgICAgICAgIG9iamNvcHkgPSBCb25rKCkKKyAgICAgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQogCiAKIGRlZiBzdWl0ZSgpOgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQ29tcGFjdFByb3RvY29sVGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEZyYW1lZFRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoU2VyaWFsaXplcnNUZXN0KSkKLSAgcmV0dXJuIHN1aXRlCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE5vcm1hbEJpbmFyeVRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZENvbXBhY3RUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQ29tcGFjdFByb3RvY29sVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05Qcm90b2NvbFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEZyYW1lZFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQorICAgIHJldHVybiBzdWl0ZQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkgYi90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTg3NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5CkBAIC0wLDAgKzEsMTA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IEJvbmssIFZlcnNpb25pbmdUZXN0VjEsIFZlcnNpb25pbmdUZXN0VjIKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKworaW1wb3J0IGpzb24KK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFNpbXBsZUpTT05Qcm90b2NvbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKworICAgIGRlZiBfYXNzZXJ0RGljdEVxdWFsKHNlbGYsIGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnYXNzZXJ0RGljdEVxdWFsJyk6CisgICAgICAgICAgICAjIGFzc2VydERpY3RFcXVhbCBvbmx5IGluIFB5dGhvbiAyLjcuIERlcGVuZHMgb24geW91ciBtYWNoaW5lLgorICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoYSwgYiwgbXNnKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTdWJzdGl0dXRlIGltcGxlbWVudGF0aW9uIG5vdCBhcyBnb29kIGFzIHVuaXR0ZXN0IGxpYnJhcnkncworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYSksIGxlbihiKSwgbXNnKQorICAgICAgICBmb3IgaywgdiBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gYiwgbXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYi5nZXQoayksIHYsIG1zZykKKworICAgIGRlZiBfc2VyaWFsaXplKHNlbGYsIG9iaik6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICAgICAgb2JqLndyaXRlKHByb3QpCisgICAgICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisKKyAgICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhKSkKKyAgICAgICAgcmV0ID0gb2JqdHlwZSgpCisgICAgICAgIHJldC5yZWFkKHByb3QpCisgICAgICAgIHJldHVybiByZXQKKworICAgIGRlZiB0ZXN0V3JpdGVPbmx5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXNlcmlhbGl6ZSwgVmVyc2lvbmluZ1Rlc3RWMSwgYid7fScpCisKKyAgICBkZWYgdGVzdFNpbXBsZU1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCisgICAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYxb2JqLmJlZ2luX2luX2JvdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc3RyaW5nPXYxb2JqLm9sZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12MW9iai5lbmRfaW5fYm90aCkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjFvYmopLmRlY29kZSgnYXNjaWknKSkKKworICAgICAgICBzZWxmLl9hc3NlcnREaWN0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKKworICAgIGRlZiB0ZXN0Q29tcGxpY2F0ZWQoc2VsZik6CisgICAgICAgIHYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEpCisgICAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYyb2JqLmJlZ2luX2luX2JvdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdpbnQ9djJvYmoubmV3aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Ynl0ZT12Mm9iai5uZXdieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2hvcnQ9djJvYmoubmV3c2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsb25nPXYyb2JqLm5ld2xvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdkb3VibGU9djJvYmoubmV3ZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3RydWN0PWRpY3QobWVzc2FnZT12Mm9iai5uZXdzdHJ1Y3QubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9djJvYmoubmV3c3RydWN0LnR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGlzdD12Mm9iai5uZXdsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2V0PWxpc3QodjJvYmoubmV3c2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld21hcD12Mm9iai5uZXdtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJpbmc9djJvYmoubmV3c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2luX2JvdGg9djJvYmouZW5kX2luX2JvdGgpCisKKyAgICAgICAgIyBOZWVkIHRvIGxvYWQvZHVtcCBiZWNhdXNlIG1hcCBrZXlzIGdldCBlc2NhcGVkLgorICAgICAgICBleHBlY3RlZCA9IGpzb24ubG9hZHMoanNvbi5kdW1wcyhleHBlY3RlZCkpCisgICAgICAgIGFjdHVhbCA9IGpzb24ubG9hZHMoc2VsZi5fc2VyaWFsaXplKHYyb2JqKS5kZWNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkgYi90ZXN0L3B5L1Rlc3RDbGllbnQucHkKaW5kZXggMGEzOGIwMy4uZGRjY2U4ZCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0Q2xpZW50LnB5CisrKyBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQpAQCAtMSw1ICsxLDUgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgotCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOSwxNDIgKzE5LDQyOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSHR0cENsaWVudAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5zZXRfZGVmYXVsdHMoZnJhbWVkPUZhbHNlLCBodHRwX3BhdGg9Tm9uZSwgdmVyYm9zZT0xLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTApCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCi0gICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIgYXQgcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1ob3N0IiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iaG9zdCIsCi0gICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tZnJhbWVkIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZnJhbWVkIiwKLSAgICBoZWxwPSJ1c2UgZnJhbWVkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1odHRwIiwgZGVzdD0iaHR0cF9wYXRoIiwKLSAgICBoZWxwPSJVc2UgdGhlIEhUVFAgdHJhbnNwb3J0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIikKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCi0gICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgaWYgb3B0aW9ucy5odHRwX3BhdGg6Ci0gICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KAotICAgICAgICAgIG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCBvcHRpb25zLmh0dHBfcGF0aCkKLSAgICBlbHNlOgotICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnaHR0cCc6CisgICAgICAgICAgICB1cmkgPSAnezB9Oi8vezF9OnsyfXszfScuZm9ybWF0KCgnaHR0cHMnIGlmIG9wdGlvbnMuc3NsIGVsc2UgJ2h0dHAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmh0dHBfcGF0aCBpZiBvcHRpb25zLmh0dHBfcGF0aCBlbHNlICcvJykpCisgICAgICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgICAgICBfX2NhZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgIkNBLnBlbSIpCisgICAgICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgImNsaWVudC5jcnQiKQorICAgICAgICAgICAgICAgIF9fa2V5ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgImNsaWVudC5rZXkiKQorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQodXJpLCBjYWZpbGU9X19jYWZpbGUsIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQodXJpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0CisgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCB2YWxpZGF0ZT1GYWxzZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgICAgICAgICAgIyBmcmFtZSBvciBidWZmZXIgZGVwZW5kaW5nIHVwb24gYXJncworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBpZiBvcHRpb25zLnRyYW5zID09ICdmcmFtZWQnOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuemxpYjoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0KHNlbGYudHJhbnNwb3J0LCA5KQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKKyAgICAgICAgcHJvdG9jb2wgPSBzZWxmLmdldF9wcm90b2NvbChzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICAgICAgIyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXM6CisgICAgICAgIHByb3RvY29sMiA9IHNlbGYuZ2V0X3Byb3RvY29sMihzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQyID0gU2Vjb25kU2VydmljZS5DbGllbnQocHJvdG9jb2wyKSBpZiBwcm90b2NvbDIgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAKLSAgICAgICMgZnJhbWUgb3IgYnVmZmVyIGRlcGVuZGluZyB1cG9uIGFyZ3MKLSAgICAgIGlmIG9wdGlvbnMuZnJhbWVkOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKIAotICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RWb2lkJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQogCi0gICAgcHJvdG9jb2wgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCi0gICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicgKiAyMCksICdQeXRob24nICogMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnJyksICcnKQorICAgICAgICBzMSA9IHUnXGJcdFxuL1xcXFxccnt9OuODkeOCpOOCveODsyInCisgICAgICAgIHMyID0gdSIiIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLAorICAgICAgICBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwKKyAgICAgICAg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLAorICAgICAgICDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sCisgICAgICAgIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywKKyAgICAgICAgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLAorICAgICAgICBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsCisgICAgICAgIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywKKyAgICAgICAgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwKKyAgICAgICAgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwKKyAgICAgICAgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLAorICAgICAgICDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsCisgICAgICAgIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywKKyAgICAgICAgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EKKyAgICAgICAgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhCisgICAgICAgIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqgorICAgICAgICBOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsCisgICAgICAgIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILAorICAgICAgICBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywKKyAgICAgICAg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZQorICAgICAgICBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssCisgICAgICAgIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywKKyAgICAgICAgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywKKyAgICAgICAgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywKKyAgICAgICAgQsOibi1sw6JtLWfDuiwg57K16KqeIiIiCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgICAgICAgICBzMSA9IHMxLmVuY29kZSgndXRmOCcpCisgICAgICAgICAgICBzMiA9IHMyLmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMSksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczIpLCBzMikKIAotICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgIyBDbG9zZSEKLSAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCisgICAgZGVmIHRlc3RNdWx0aXBsZXhlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbGllbnQyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aXBsZXhlZCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50Mi5zZWNvbmR0ZXN0U3RyaW5nKCdmb29iYXInKSwgJ3Rlc3RTdHJpbmcoImZvb2JhciIpJykKIAotICBkZWYgdGVzdFZvaWQoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQorICAgIGRlZiB0ZXN0Qm9vbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCb29sJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChUcnVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChGYWxzZSksIEZhbHNlKQogCi0gIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCeXRlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MyksIDYzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKC0xMjcpLCAtMTI3KQogCi0gIGRlZiB0ZXN0Qnl0ZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKSwgNjMpCisgICAgZGVmIHRlc3RJMzIoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STMyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKC0xKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKIAotICBkZWYgdGVzdEkzMihzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpLCAtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCisgICAgZGVmIHRlc3RJNjQoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STY0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KSwgLTM0MzU5NzM4MzY4KQogCi0gIGRlZiB0ZXN0STY0KHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCisgICAgZGVmIHRlc3REb3VibGUoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RG91YmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSksIC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkKIAotICBkZWYgdGVzdERvdWJsZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSwgLTUuMjM1MDk4MjM1KQorICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJpbmFyeScpCisgICAgICAgIHZhbCA9IGJ5dGVhcnJheShbaSBmb3IgaSBpbiByYW5nZSgwLCAyNTYpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlYXJyYXkoc2VsZi5jbGllbnQudGVzdEJpbmFyeShieXRlcyh2YWwpKSksIHZhbCkKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmKToKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDEKLSAgICB4LmkzMl90aGluZyA9IC0zCi0gICAgeC5pNjRfdGhpbmcgPSAtNQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0U3RydWN0JykKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5zdHJpbmdfdGhpbmcsICJaZXJvIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHkuYnl0ZV90aGluZywgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTMyX3RoaW5nLCAtMykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTY0X3RoaW5nLCAtNSkKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TmVzdCcpCisgICAgICAgIGlubmVyID0gWHRydWN0KHN0cmluZ190aGluZz0iWmVybyIsIGJ5dGVfdGhpbmc9MSwgaTMyX3RoaW5nPS0zLCBpNjRfdGhpbmc9LTUpCisgICAgICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3ROZXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBYY2VwdGlvbiwgeDoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICBkZWYgdGVzdE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXAnKQorICAgICAgICB4ID0gezA6IDEsIDE6IDIsIDI6IDMsIDM6IDQsIC0xOiAtMn0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXAoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBFeGNlcHRpb246ICMgdHlwZSBpcyB1bmRlZmluZWQKLSAgICAgIHBhc3MKKyAgICBkZWYgdGVzdFNldChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTZXQnKQorICAgICAgICB4ID0gc2V0KFs4LCAxLCA0Ml0pCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE9uZXdheShzZWxmKToKLSAgICBzdGFydCA9IHRpbWUudGltZSgpCi0gICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgwLjUpCi0gICAgZW5kID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAwLjIsCi0gICAgICAgICAgICAgICAgICAgICJvbmV3YXkgc2xlZXAgdG9vayAlZiBzZWMiICUgKGVuZCAtIHN0YXJ0KSkKLSAgCi0gIGRlZiB0ZXN0T25ld2F5VGhlbk5vcm1hbChzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDAuNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKyAgICBkZWYgdGVzdExpc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TGlzdCcpCisgICAgICAgIHggPSBbMSwgNCwgOSwgLTQyXQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdExpc3QoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi1jbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgZGVmIHRlc3RFbnVtKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEVudW0nKQorICAgICAgICB4ID0gTnVtYmVyei5GSVZFCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0RW51bSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLWNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFR5cGVkZWYnKQorICAgICAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZiAgIyA3IGJ5dGVzIG9mIDB4ZmYKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RUeXBlZGVmKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKworICAgIGRlZiB0ZXN0TWFwTWFwKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE1hcE1hcCcpCisgICAgICAgIHggPSB7CisgICAgICAgICAgICAtNDogey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisgICAgICAgICAgICA0OiB7NDogNCwgMzogMywgMjogMiwgMTogMX0sCisgICAgICAgIH0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXBNYXAoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKworICAgIGRlZiB0ZXN0TXVsdGkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TXVsdGknKQorICAgICAgICB4cGVjdGVkID0gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywgYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TXVsdGkoeHBlY3RlZC5ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwZWN0ZWQuaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwZWN0ZWQuaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiAnYWJjJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyei5GSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjBmMGYwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RFeGNlcHRpb24nKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZXJyb3JDb2RlLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCisgICAgICAgICAgICAjIFRPRE8gZW5zdXJlIHNhbWUgYmVoYXZpb3IgZm9yIHJlcHIgd2l0aGluIGdlbmVyYXRlZCBweXRob24gdmFyaWFudHMKKyAgICAgICAgICAgICMgZW5zdXJlIGV4Y2VwdGlvbidzIHJlcHIgbWV0aG9kIHdvcmtzCisgICAgICAgICAgICAjIHhfcmVwciA9IHJlcHIoeCkKKyAgICAgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbCh4X3JlcHIsICdYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1cJ1hjZXB0aW9uXCcpJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBURXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBTaG91bGQgbm90IHRocm93CisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3N1Y2Nlc3MnKQorCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aUV4Y2VwdGlvbicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24nLCAnaWdub3JlJykKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Lm1lc3NhZ2UsICdUaGlzIGlzIGFuIFhjZXB0aW9uJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uMicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24yIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5lcnJvckNvZGUsIDIwMDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdUaGlzIGlzIGFuIFhjZXB0aW9uMicpCisKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignc3VjY2VzcycsICdmb29iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuc3RyaW5nX3RoaW5nLCAnZm9vYmFyJykKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE9uZXdheScpCisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmQgLSBzdGFydCA8IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCisKKyAgICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5VGhlbk5vcm1hbCcpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgICMgdHlwZSBpcyBpbnQsIG5vdCBmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKworCitjbGFzcyBNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdChBYnN0cmFjdFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBKU09OVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEpTT05UZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgSGVhZGVyVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICBmYWN0b3J5ID0gVEhlYWRlclByb3RvY29sLlRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKQorICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIGlmIG9wdGlvbnMucHJvdG8gPT0gJ2JpbmFyeSc6ICAjIGxvb2sgZm9yIC0tcHJvdG8gb24gY21kbGluZQorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbCc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWxjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnY29tcGFjdCc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdoZWFkZXInOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSGVhZGVyVGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdqc29uJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05UZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWEnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlhYyc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGljJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlqJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkSlNPTlRlc3QpKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIHByb3RvY29sIGdpdmVuIHdpdGggLS1wcm90b2NvbDogJXMnICUgb3B0aW9ucy5wcm90bykKKyAgICByZXR1cm4gc3VpdGUKIAotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICByZXR1cm4gc3VpdGUKIAogY2xhc3MgT3duQXJnc1Rlc3RQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKICAgICBkZWYgcGFyc2VBcmdzKHNlbGYsIGFyZ3YpOgogICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSBhcmdzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChzZWxmLmRlZmF1bHRUZXN0LCkKKyAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKFtzZWxmLmRlZmF1bHRUZXN0XSkKICAgICAgICAgc2VsZi5jcmVhdGVUZXN0cygpCiAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIGF0IHBvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWh0dHAiLCBkZXN0PSJodHRwX3BhdGgiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgSFRUUCB0cmFuc3BvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGlhLCBtdWx0aWFjLCBtdWx0aWMsIG11bHRpaiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyhmcmFtZWQ9RmFsc2UsIGh0dHBfcGF0aD1Ob25lLCB2ZXJib3NlPTEsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgcHJvdG89J2JpbmFyeScpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdGlvbnMuZ2VucHlkaXI6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgb3B0aW9ucy5nZW5weWRpcikpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxvY2FsX2xpYnBhdGgoKSkKKworICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgorICAgICAgICBvcHRpb25zLnRyYW5zID0gJ2h0dHAnCisKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFNlY29uZFNlcnZpY2UKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKKyAgICBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QsIFh0cnVjdDIsIE51bWJlcnosIFhjZXB0aW9uLCBYY2VwdGlvbjIKKyAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUTXVsdGlwbGV4ZWRQcm90b2NvbAorCisgICAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RW9mLnB5IGIvdGVzdC9weS9UZXN0RW9mLnB5CmluZGV4IDdmZjBiNDIuLjBiNGE4MjkgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdEVvZi5weQorKysgYi90ZXN0L3B5L1Rlc3RFb2YucHkKQEAgLTE5LDExMyArMTksMTE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0aW1lCisKIAogY2xhc3MgVGVzdEVvZih1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIG1ha2VfZGF0YShzZWxmLCBwZmFjdG9yeT1Ob25lKToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgaWYgcGZhY3Rvcnk6Ci0gICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgZWxzZToKLSAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGRlZiBtYWtlX2RhdGEoc2VsZiwgcGZhY3Rvcnk9Tm9uZSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaWYgcGZhY3Rvcnk6CisgICAgICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCi0gICAgeC5ieXRlX3RoaW5nID0gMAorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMAogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJPbmUiCi0gICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCiAKLSAgICB4LndyaXRlKHByb3QpCisgICAgICAgIHgud3JpdGUocHJvdCkKIAotICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisgICAgICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCiAKLSAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YSgpKQotICAgIHRyYW5zLnJlYWRBbGwoMSkKKyAgICBkZWYgdGVzdFRyYW5zcG9ydFJlYWRBbGwoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEoKSkKKyAgICAgICAgdHJhbnMucmVhZEFsbCgxKQogCi0gICAgdHJ5OgotICAgICAgdHJhbnMucmVhZEFsbCgxMDAwMCkKLSAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJhbnMucmVhZEFsbCgxMDAwMCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCisgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKIAotICBkZWYgZW9mVGVzdEhlbHBlcihzZWxmLCBwZmFjdG9yeSk6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpKQotICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICBkZWYgZW9mVGVzdEhlbHBlcihzZWxmLCBwZmFjdG9yeSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KSkKKyAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5yZWFkKHByb3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIlplcm8iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQotCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5yZWFkKHByb3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIk9uZSIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDEpCi0KLSAgICB0cnk6Ci0gICAgICB4ID0gWHRydWN0KCkKLSAgICAgIHgucmVhZChwcm90KQotICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgIHJldHVybgotCi0gICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQotCi0gIGRlZiBlb2ZUZXN0SGVscGVyU3RyZXNzKHNlbGYsIHBmYWN0b3J5KToKLSAgICAiIiJUZWVzdCB0aGUgYWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wgdG8gZGVhbCB3aXRoIHRoZSByZW1vdmFsIG9mIGV2ZXJ5IGJ5dGUgaW4gdGhlIGZpbGUiIiIKLSAgICAjIFRPRE86IHdlIHNob3VsZCBtYWtlIHN1cmUgdGhpcyBjb3ZlcnMgbW9yZSBvZiB0aGUgY29kZSBwYXRocwotCi0gICAgZGF0YSA9IHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KQotICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF0YSkgKyAxKToKLSAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGFbMDppXSkKLSAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICAgIHRyeToKICAgICAgICAgeCA9IFh0cnVjdCgpCiAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiWmVybyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQorCisgICAgICAgIHggPSBYdHJ1Y3QoKQogICAgICAgICB4LnJlYWQocHJvdCkKLSAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBFT0ZFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMSkKIAotICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQogCi0gIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorICAgIGRlZiBlb2ZUZXN0SGVscGVyU3RyZXNzKHNlbGYsIHBmYWN0b3J5KToKKyAgICAgICAgIiIiVGVzdCB0aGUgYWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wgdG8gZGVhbCB3aXRoIHRoZSByZW1vdmFsIG9mIGV2ZXJ5IGJ5dGUgaW4gdGhlIGZpbGUiIiIKKyAgICAgICAgIyBUT0RPOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoaXMgY292ZXJzIG1vcmUgb2YgdGhlIGNvZGUgcGF0aHMKKworICAgICAgICBkYXRhID0gc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSArIDEpOgorICAgICAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YVswOmldKQorICAgICAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBFT0ZFcnJvciIpCisKKyAgICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKworICAgIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEJpbmFyeUVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorCisgICAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkQ29tcGFjdEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RW9mKSkKLSAgcmV0dXJuIHN1aXRlCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RW9mKSkKKyAgICByZXR1cm4gc3VpdGUKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmQyNTk1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVGVzdEZyb3plbi5weQpAQCAtMCwwICsxLDEyMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgRW1wdHksIFdyYXBwZXIKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEZyb3plbkRpY3QKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0RnJvemVuQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9yb3VuZHRyaXAoc2VsZiwgc3JjLCBkc3QpOgorICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBvcHRvcm8gPSBzZWxmLnByb3RvY29sKG90cmFucykKKyAgICAgICAgc3JjLndyaXRlKG9wdG9ybykKKyAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG90cmFucy5nZXR2YWx1ZSgpKQorICAgICAgICBpcHJvdG8gPSBzZWxmLnByb3RvY29sKGl0cmFucykKKyAgICAgICAgcmV0dXJuIGRzdC5yZWFkKGlwcm90bykgb3IgZHN0CisKKyAgICBkZWYgdGVzdF9kaWN0X2lzX2hhc2hhYmxlX29ubHlfYWZ0ZXJfZnJvemVuKHNlbGYpOgorICAgICAgICBkMCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShkMCwgY29sbGVjdGlvbnMuSGFzaGFibGUpKQorICAgICAgICBkMSA9IFRGcm96ZW5EaWN0KGQwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkMSwgY29sbGVjdGlvbnMuSGFzaGFibGUpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3dpdGhfY29sbGVjdGlvbl9maWVsZHMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3NldChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBzZXQgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChzZXRfYnl0ZV9tYXA9eworICAgICAgICAgICAgZnJvemVuc2V0KFs0MiwgMTAwLCAtMTAwXSk6IDk5LAorICAgICAgICAgICAgZnJvemVuc2V0KFswXSk6IDEwMCwKKyAgICAgICAgICAgIGZyb3plbnNldChbXSk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFs0MiwgMTAwLCAtMTAwXSldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFswXSldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbXSldLCAwKQorCisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIG1hcCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KG1hcF9ieXRlX21hcD17CisgICAgICAgICAgICBURnJvemVuRGljdCh7NDI6IDQyLCAxMDA6IC0xMDB9KTogOTksCisgICAgICAgICAgICBURnJvemVuRGljdCh7MDogMH0pOiAxMDAsCisgICAgICAgICAgICBURnJvemVuRGljdCh7fSk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3QoezQyOiA0MiwgMTAwOiAtMTAwfSldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3QoezA6IDB9KV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3Qoe30pXSwgMCkKKworICAgIGRlZiB0ZXN0X2xpc3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgbGlzdCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGxpc3RfYnl0ZV9tYXA9eworICAgICAgICAgICAgKDQyLCAxMDAsIC0xMDApOiA5OSwKKyAgICAgICAgICAgICgwLCk6IDEwMCwKKyAgICAgICAgICAgICgpOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoNDIsIDEwMCwgLTEwMCldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWygwLCldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoKV0sIDApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgZW1wdHkgc3RydWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoZW1wdHlfc3RydWN0X2ZpZWxkPUVtcHR5KCkpCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5lbXB0eV9zdHJ1Y3RfZmllbGQsIEVtcHR5KCkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgc3RydWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IFdyYXBwZXIoZm9vPUVtcHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIEVtcHR5KCkpCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIFdyYXBwZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuZm9vLCBFbXB0eSgpKQorCisKK2NsYXNzIFRlc3RGcm96ZW4oVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2NsYXNzIFRlc3RGcm96ZW5BY2NlbGVyYXRlZEJpbmFyeShUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2NsYXNzIFRlc3RGcm96ZW5BY2NlbGVyYXRlZENvbXBhY3QoVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbikpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW5BY2NlbGVyYXRlZEJpbmFyeSkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW5BY2NlbGVyYXRlZENvbXBhY3QpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5IGIvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5MDNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsMTc3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gRG91YmxlQ29uc3RhbnRzVGVzdCBpbXBvcnQgY29uc3RhbnRzCisKKyMKKyMgSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MuIFdlIG5lZWQgdG8gY3JlYXRlIHN5bWJvbGljIGxpbmsKKyMgbmFtZSAndGhyaWZ0JyB0byAnLi4vc3JjJyBmb2xkZXIgYnkgdXNpbmc6CisjCisjIG1rbGluayAvRCB0aHJpZnQgLi5cc3JjCisjCisKKworY2xhc3MgVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUID0gXAorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiCisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QgPVwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBsaXN0IGl0ZW0gYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiCisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0gInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIgorCisgICAgIyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgZGVmIHRlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTkKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjEKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorCisgICAgIyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgZGVmIHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3Qoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9MSVNUID0gWzEuMCwgLTEwMC4wLCAxMDAuMCwgOTIyMzM3MjAzNjg1NDc3NTgwNy4wLCAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wLCAzLjE0MTU5MjY1MzU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwLjEsIC0xMDAwMDAwLjEsIDEuN2UrMzA4LCAtMS43ZSszMDgsIDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVCksIGxlbihFWFBFQ1RFRF9ET1VCTEVfTElTVCkpCisgICAgICAgIGZvciBpLCBleHBlY3RlZFZhbHVlIGluIGVudW1lcmF0ZShFWFBFQ1RFRF9ET1VCTEVfTElTVCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUW2ldLCBleHBlY3RlZFZhbHVlLCBwbGFjZXM9NykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U2VydmVyLnB5IGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CmluZGV4IDNkMzc5ZWEuLmFiYTBkNDIgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weQorKysgYi90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKQEAgLTE4LDk4ICsxOCwzMjUgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotaW1wb3J0IHN5cywgZ2xvYiwgdGltZQotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgVEh0dHBTZXJ2ZXIKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAotY2xhc3MgVGVzdEhhbmRsZXI6CiAKLSAgZGVmIHRlc3RWb2lkKHNlbGYpOgotICAgIHByaW50ICd0ZXN0Vm9pZCgpJworY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKKyAgICBkZWYgdGVzdFZvaWQoc2VsZik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RWb2lkKCknKQogCi0gIGRlZiB0ZXN0U3RyaW5nKHNlbGYsIHN0cik6Ci0gICAgcHJpbnQgJ3Rlc3RTdHJpbmcoJXMpJyAlIHN0cgotICAgIHJldHVybiBzdHIKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RyaW5nKCVzKScgJSBzdHIpCisgICAgICAgIHJldHVybiBzdHIKIAotICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgcHJpbnQgJ3Rlc3RCeXRlKCVkKScgJSBieXRlCi0gICAgcmV0dXJuIGJ5dGUKKyAgICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCb29sKCVzKScgJSBzdHIoYm9vbGVhbikubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIGJvb2xlYW4KIAotICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgotICAgIHByaW50ICd0ZXN0STE2KCVkKScgJSBpMTYKLSAgICByZXR1cm4gaTE2CisgICAgZGVmIHRlc3RCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Qnl0ZSglZCknICUgYnl0ZSkKKyAgICAgICAgcmV0dXJuIGJ5dGUKIAotICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgotICAgIHByaW50ICd0ZXN0STMyKCVkKScgJSBpMzIKLSAgICByZXR1cm4gaTMyCisgICAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkxNiglZCknICUgaTE2KQorICAgICAgICByZXR1cm4gaTE2CiAKLSAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKLSAgICBwcmludCAndGVzdEk2NCglZCknICUgaTY0Ci0gICAgcmV0dXJuIGk2NAorICAgIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJMzIoJWQpJyAlIGkzMikKKyAgICAgICAgcmV0dXJuIGkzMgogCi0gIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgcHJpbnQgJ3Rlc3REb3VibGUoJWYpJyAlIGR1YgotICAgIHJldHVybiBkdWIKKyAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0STY0KCVkKScgJSBpNjQpCisgICAgICAgIHJldHVybiBpNjQKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6Ci0gICAgcHJpbnQgJ3Rlc3RTdHJ1Y3QoeyVzLCAlZCwgJWQsICVkfSknICUgKHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdERvdWJsZSglZiknICUgZHViKQorICAgICAgICByZXR1cm4gZHViCiAKLSAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgc3RyKToKLSAgICBwcmludCAndGVzdEV4Y2VwdGlvbiglcyknICUgc3RyCi0gICAgaWYgc3RyID09ICdYY2VwdGlvbic6Ci0gICAgICB4ID0gWGNlcHRpb24oKQotICAgICAgeC5lcnJvckNvZGUgPSAxMDAxCi0gICAgICB4Lm1lc3NhZ2UgPSBzdHIKLSAgICAgIHJhaXNlIHgKLSAgICBlbGlmIHN0ciA9PSAidGhyb3dfdW5kZWNsYXJlZCI6Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKCJmb28iKQorICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJpbmFyeSgpJykgICMgVE9ETzogaGV4IG91dHB1dAorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKLSAgICBwcmludCAndGVzdE9uZXdheSglZCkgPT4gc2xlZXBpbmcuLi4nICUgc2Vjb25kcwotICAgIHRpbWUuc2xlZXAoc2Vjb25kcykKLSAgICBwcmludCAnZG9uZSBzbGVlcGluZycKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJ1Y3QoeyVzLCAlcywgJXMsICVzfSknICUgKHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIGFyZyk6CisgICAgICAgICMgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RXhjZXB0aW9uKCVzKScgJSBhcmcpCisgICAgICAgIGlmIGFyZyA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9YXJnKQorICAgICAgICBlbGlmIGFyZyA9PSAnVEV4Y2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKG1lc3NhZ2U9J1RoaXMgaXMgYSBURXhjZXB0aW9uJykKIAotICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6Ci0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmLCBhcmcwLCBhcmcxKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknICUgKGFyZzAsIGFyZzEpKQorICAgICAgICBpZiBhcmcwID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT0nVGhpcyBpcyBhbiBYY2VwdGlvbicpCisgICAgICAgIGVsaWYgYXJnMCA9PSAnWGNlcHRpb24yJzoKKyAgICAgICAgICAgIHJhaXNlIFhjZXB0aW9uMigKKyAgICAgICAgICAgICAgICBlcnJvckNvZGU9MjAwMiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0nVGhpcyBpcyBhbiBYY2VwdGlvbjInKSkKKyAgICAgICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9YXJnMSkKIAotICBkZWYgdGVzdFNldChzZWxmLCB0aGluZyk6Ci0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RPbmV3YXkoJWQpID0+IHNsZWVwaW5nLi4uJyAlIHNlY29uZHMpCisgICAgICAgIHRpbWUuc2xlZXAoc2Vjb25kcyAvIDMpICAjIGJlIHF1aWNrCisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ2RvbmUgc2xlZXBpbmcnKQogCi0gIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6Ci0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE5lc3QoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE1hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6Ci0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RTdHJpbmdNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RyaW5nTWFwKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLXBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQotaGFuZGxlciA9IFRlc3RIYW5kbGVyKCkKLXByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U2V0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLWlmIHN5cy5hcmd2WzFdID09ICJUSHR0cFNlcnZlciI6Ci0gIHNlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCcnLCA5MDkwKSwgcGZhY3RvcnkpCi1lbHNlOgotICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoOTA5MCkKLSAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RMaXN0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgaWYgc3lzLmFyZ3ZbMV0gPT0gIlROb25ibG9ja2luZ1NlcnZlciI6Ci0gICAgc2VydmVyID0gVE5vbmJsb2NraW5nU2VydmVyLlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCkKLSAgZWxzZToKLSAgICBTZXJ2ZXJDbGFzcyA9IGdldGF0dHIoVFNlcnZlciwgc3lzLmFyZ3ZbMV0pCi0gICAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RW51bSglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi1zZXJ2ZXIuc2VydmUoKQorICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgLTQ6IHsKKyAgICAgICAgICAgICAgICAtNDogLTQsCisgICAgICAgICAgICAgICAgLTM6IC0zLAorICAgICAgICAgICAgICAgIC0yOiAtMiwKKyAgICAgICAgICAgICAgICAtMTogLTEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgNDogeworICAgICAgICAgICAgICAgIDQ6IDQsCisgICAgICAgICAgICAgICAgMzogMywKKyAgICAgICAgICAgICAgICAyOiAyLAorICAgICAgICAgICAgICAgIDE6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICB9CisKKyAgICBkZWYgdGVzdEluc2FuaXR5KHNlbGYsIGFyZ3VtZW50KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEluc2FuaXR5KCVzKScgJSBhcmd1bWVudCkKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIDE6IHsKKyAgICAgICAgICAgICAgICAyOiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAzOiBhcmd1bWVudCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAyOiB7NjogSW5zYW5pdHkoKX0sCisgICAgICAgIH0KKworICAgIGRlZiB0ZXN0TXVsdGkoc2VsZiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aSglcyknICUgW2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzVdKQorICAgICAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywKKyAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nPWFyZzAsIGkzMl90aGluZz1hcmcxLCBpNjRfdGhpbmc9YXJnMikKKworCitkZWYgbWFpbihvcHRpb25zKToKKyAgICAjIHNldCB1cCB0aGUgcHJvdG9jb2wgZmFjdG9yeSBmb3JtIHRoZSAtLXByb3RvY29sIG9wdGlvbgorICAgIHByb3RfZmFjdG9yaWVzID0geworICAgICAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdhY2NlbGMnOiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSwKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnaGVhZGVyJzogVEhlYWRlclByb3RvY29sLlRIZWFkZXJQcm90b2NvbEZhY3RvcnkoYWxsb3dlZF9jbGllbnRfdHlwZXM9WworICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNULAorICAgICAgICBdKSwKKyAgICAgICAgJ2pzb24nOiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCksCisgICAgfQorICAgIHBmYWN0b3J5ID0gcHJvdF9mYWN0b3JpZXMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCisgICAgaWYgcGZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90b2NvbCBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgdHJ5OgorICAgICAgICBwZmFjdG9yeS5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5zdHJpbmdfbGltaXQKKyAgICAgICAgcGZhY3RvcnkuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuY29udGFpbmVyX2xpbWl0CisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgIyBJZ25vcmUgZXJyb3JzIGZvciB0aG9zZSBwcm90b2NvbHMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGxlbmd0aCBsaW1pdAorICAgICAgICBwYXNzCisKKyAgICAjIGdldCB0aGUgc2VydmVyIHR5cGUgKFRTaW1wbGVTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgZXRjLi4uKQorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKKyAgICBzZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgc2VydmVyX3R5cGUgPSAnVEh0dHBTZXJ2ZXInCisKKyAgICAjIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKKyAgICBoYW5kbGVyID0gVGVzdEhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBnbG9iYWwgc2VydmVyCisKKyAgICAjIEhhbmRsZSBUSHR0cFNlcnZlciBhcyBhIHNwZWNpYWwgY2FzZQorICAgIGlmIHNlcnZlcl90eXBlID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5jcnQiKQorICAgICAgICAgICAgX19rZXlmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAic2VydmVyLmtleSIpCisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnksIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnkpCisgICAgICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAjIHNldCB1cCBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQorCisgICAgYWJzX2tleV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgJ2tleXMnLCAnc2VydmVyLnBlbScpCisKKyAgICBob3N0ID0gTm9uZQorICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFNTTFNvY2tldC5UU1NMU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCwgY2VydGZpbGU9YWJzX2tleV9wYXRoKQorICAgIGVsc2U6CisgICAgICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQpCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICBlbHNlOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgIyBpZiAtLXpsaWIsIHRoZW4gd3JhcCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgdXNlIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBmYWN0b3J5CisgICAgaWYgb3B0aW9ucy56bGliOgorICAgICAgICB0cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydCh0cmFuc3BvcnQpICAjIHdyYXAgIHdpdGggemxpYgorICAgICAgICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCisKKyAgICAjIGRvIHNlcnZlci1zcGVjaWZpYyBzZXR1cCBoZXJlOgorICAgIGlmIHNlcnZlcl90eXBlID09ICJUTm9uYmxvY2tpbmdTZXJ2ZXIiOgorICAgICAgICBzZXJ2ZXIgPSBUTm9uYmxvY2tpbmdTZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1wZmFjdG9yeSkKKyAgICBlbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgorICAgICAgICBpbXBvcnQgc2lnbmFsCisgICAgICAgIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCisgICAgICAgIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAgICAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKKworICAgICAgICBkZWYgc2V0X2FsYXJtKCk6CisgICAgICAgICAgICBkZWYgY2xlYW5fc2h1dGRvd24oc2lnbnVtLCBmcmFtZSk6CisgICAgICAgICAgICAgICAgZm9yIHdvcmtlciBpbiBzZXJ2ZXIud29ya2VyczoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnVGVybWluYXRpbmcgd29ya2VyOiAlcycgJSB3b3JrZXIpCisgICAgICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnUmVxdWVzdGluZyBzZXJ2ZXIgdG8gc3RvcCgpJykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSg0KQorICAgICAgICBzZXRfYWxhcm0oKQorICAgIGVsc2U6CisgICAgICAgICMgbG9vayB1cCBzZXJ2ZXIgY2xhc3MgZHluYW1pY2FsbHkgdG8gaW5zdGFudGlhdGUgc2VydmVyCisgICAgICAgIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzZXJ2ZXJfdHlwZSkKKyAgICAgICAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIGVudGVyIHNlcnZlciBtYWluIGxvb3AKKyAgICBzZXJ2ZXIuc2VydmUoKQorCisKK2RlZiBleGl0X2dyYWNlZnVsbHkoc2lnbnVtLCBmcmFtZSk6CisgICAgcHJpbnQoIlNJR0lOVCByZWNlaXZlZFxuIikKKyAgICBzZXJ2ZXIuc2h1dGRvd24oKSAgICMgZG9lc24ndCB3b3JrIHByb3Blcmx5LCB5ZXQKKyAgICBzeXMuZXhpdCgwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBleGl0X2dyYWNlZnVsbHkpCisKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWxpYnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nbGlicHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgdG8gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGxpYnJhcnkgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IHRvIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1jb250YWluZXItbGltaXQnLCBkZXN0PSdjb250YWluZXJfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tc3RyaW5nLWxpbWl0JywgZGVzdD0nc3RyaW5nX2xpbWl0JywgdHlwZT0naW50JywgZGVmYXVsdD1Ob25lKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMocG9ydD05MDkwLCB2ZXJib3NlPTEsIHByb3RvPSdiaW5hcnknLCB0cmFuc3BvcnQ9J2J1ZmZlcmVkJykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBQcmludCBUU2VydmVyIGxvZyB0byBzdGRvdXQgc28gdGhhdCB0aGUgdGVzdC1ydW5uZXIgY2FuIHJlZGlyZWN0IGl0IHRvIGxvZyBmaWxlcworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9b3B0aW9ucy52ZXJib3NlKQorCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYY2VwdGlvbiwgWGNlcHRpb24yLCBJbnNhbml0eQorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEhlYWRlclRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgVEh0dHBTZXJ2ZXIKKworICAgIHN5cy5leGl0KG1haW4ob3B0aW9ucykpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkgYi90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKaW5kZXggMmY3MzUzZi4uNjE5ZWIxMCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U29ja2V0LnB5CisrKyBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQpAQCAtMTksMjQgKzE5LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0aW1lCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgcmFuZG9tCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKKwogCiBjbGFzcyBUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNTApOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgIyBmaW5kIGEgcG9ydCB3ZSBjYW4gdXNlCiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKQEAgLTQ0LDcgKzM2LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmJpbmQoKCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpKQogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2subGlzdGVuKDUpCiAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgaWYgaSA9PSA0OToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKIApAQCAtNTMsMTIgKzQ1LDEyIEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbGVha3kgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgogICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KQogICAgICAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDEwKQogICAgICAgICAgICAgICAgIHNvY2tldC5vcGVuKCkKICAgICAgICAgICAgICAgICBsZWFreS5hcHBlbmQoc29ja2V0KQotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odGltZS50aW1lKCkgLSBzdGFydHRpbWUgPCA1LjApCiAKICAgICBkZWYgdGVzdFdyaXRlVGltZW91dChzZWxmKToKQEAgLTcwLDE1ICs2MiwxNyBAQAogICAgICAgICAgICAgc29ja2V0Lm9wZW4oKQogICAgICAgICAgICAgbHNvY2sgPSBzZWxmLmxpc3Rlbl9zb2NrLmFjY2VwdCgpCiAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHNvY2tldC53cml0ZSgiaGkiICogMTAwKQorICAgICAgICAgICAgICAgIGxzb2NrLndyaXRlKCJoaSIgKiAxMDApCiAKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCi1zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi1sb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRpbWVvdXRUZXN0KSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi10ZXN0UnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpCi10ZXN0UnVubmVyLnJ1bihzdWl0ZSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGltZW91dFRlc3QpKQorCisgICAgdGVzdFJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQorICAgIHRlc3RSdW5uZXIucnVuKHN1aXRlKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U3ludGF4LnB5IGIvdGVzdC9weS9UZXN0U3ludGF4LnB5CmluZGV4IGRmNjdkNDguLmRiZTc5NzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFN5bnRheC5weQorKysgYi90ZXN0L3B5L1Rlc3RTeW50YXgucHkKQEAgLTE5LDEwICsxOSw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCiAjIEp1c3QgaW1wb3J0IHRoZXNlIGdlbmVyYXRlZCBmaWxlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc3ludGFjdGljYWxseSB2YWxpZAotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgRW1wdHlTZXJ2aWNlCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEVtcHR5U2VydmljZSAgIyBub3FhCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQgICMgbm9xYQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaCBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2gKaW5kZXggMmU1YTRmMS4uNmQ3MzQ2MiAxMDA3NTUKLS0tIGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaAorKysgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoCkBAIC0yMiw2ICsyMiw3IEBACiBybSAtcmYgZ2VuLXB5CiAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHB5IHRlc3QxLnRocmlmdCB8fCBleGl0IDEKIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcHkgdGVzdDIudGhyaWZ0IHx8IGV4aXQgMQorLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBweSB0ZXN0My50aHJpZnQgJiYgZXhpdCAxICAjIEZhaWwgc2luY2UgdGVzdDMudGhyaWZ0IGhhcyBweXRob24ga2V5d29yZHMKIFBZVEhPTlBBVEg9Li9nZW4tcHkgcHl0aG9uIC1jICdpbXBvcnQgZm9vLmJhci5iYXonIHx8IGV4aXQgMQogUFlUSE9OUEFUSD0uL2dlbi1weSBweXRob24gLWMgJ2ltcG9ydCB0ZXN0MicgfHwgZXhpdCAxCiBQWVRIT05QQVRIPS4vZ2VuLXB5IHB5dGhvbiAtYyAnaW1wb3J0IHRlc3QxJyAmPi9kZXYvbnVsbCAmJiBleGl0IDEgICMgU2hvdWxkIGZhaWwuCmRpZmYgLS1naXQgYS90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0Nzg2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3Rlc3QzLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBweSB2YWxpZGF0aW9ucworCitzdHJ1Y3QgZnJvbSB7CisgIDE6IGkzMiBkZWY7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKK21hY3JvKEdFTkVSQVRFIEZJTEVOQU1FIEdFTkVSQVRPUiBPVVRQVVRESVIpCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtNWV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7T1VUUFVURElSfSkKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRDT01QSUxFUn0gLS1nZW4gJHtHRU5FUkFUT1J9IC1vdXQgJHtNWV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7T1VUUFVURElSfSAke0ZJTEVOQU1FfQorICAgICAgICAgICAgICAgICAgUkVTVUxUX1ZBUklBQkxFIENNRF9SRVNVTFQpCisgIGlmKENNRF9SRVNVTFQpCisgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkVycm9yIGdlbmVyYXRpbmcgJHtGSUxFTkFNRX0gd2l0aCBnZW5lcmF0b3IgJHtHRU5FUkFUT1J9IikKKyAgZW5kaWYoKQorZW5kbWFjcm8oR0VORVJBVEUpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCmRpZmYgLS1naXQgYS90ZXN0L3B5L3NldHVwLmNmZyBiL3Rlc3QvcHkvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvdXRpbC5weSBiL3Rlc3QvcHkvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmIzZjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS91dGlsLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK19TQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitfUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9TQ1JJUFRfRElSKSkKKworCitkZWYgbG9jYWxfbGlicGF0aCgpOgorICAgIGdsb2JkaXIgPSBvcy5wYXRoLmpvaW4oX1JPT1RfRElSLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykKKyAgICBmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2IoZ2xvYmRpcik6CisgICAgICAgIGlmIGxpYnBhdGguZW5kc3dpdGgoJy0lZC4lZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpOgorICAgICAgICAgICAgcmV0dXJuIGxpYnBhdGgKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvR2VtZmlsZSBiL3Rlc3QvcmIvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYwNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9HZW1maWxlCkBAIC0wLDAgKzEsNyBAQAorc291cmNlICJodHRwOi8vcnVieWdlbXMub3JnIgorCityZXF1aXJlICJydWJ5Z2VtcyIKKworZ2VtICdyYWNrJywgJ34+IDIuMCcsICc+PSAyLjAuNCcKK2dlbSAndGhpbicsICd+PiAxLjcnLCAnPj0gMS43LjInCitnZW0gJ3Rlc3QtdW5pdCcsICd+PiAzLjInLCAnPj0gMy4yLjcnCmRpZmYgLS1naXQgYS90ZXN0L3JiL01ha2VmaWxlLmFtIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQppbmRleCBhNmY0MzFjLi5jZmRjMTQ5IDEwMDY0NAotLS0gYS90ZXN0L3JiL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDEyICsxNywxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CitzdHViczogJChUSFJJRlQpIC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vU21hbGxUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9SZWN1cnNpdmUudGhyaWZ0CisKK3ByZWNyb3NzOiBzdHVicwogCiBjaGVjazogc3R1YnMKLQkkKFJVQlkpIHRlc3Rfc3VpdGUucmIKK2lmIEhBVkVfQlVORExFUgorCSQoQlVORExFUikgaW5zdGFsbAorCSQoQlVORExFUikgZXhlYyAkKFJVQlkpIC1JLiB0ZXN0X3N1aXRlLnJiCitlbmRpZgogCmRpZmYgLS1naXQgYS90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiIGIvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYgppbmRleCA1Mjc1NWMxLi4zN2FmYTg1IDEwMDY0NAotLS0gYS90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiCisrKyBiL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIKQEAgLTUxLDcgKzUxLDcgQEAKICAgCiAgICMgVE9ETzoKICAgIyBUaGlzIGRvZXNuJ3QgbmVjZXNzYXJpbHkgdGVzdCBoZSByaWdodCB0aGluZy4KLSAgIyBJdCBfbG9va3NfIGxpa2UgcmVhZCBpc24ndCBndWFyZW50ZWVkIHRvIHJldHVybiB0aGUgbGVuZ3RoCisgICMgSXQgX2xvb2tzXyBsaWtlIHJlYWQgaXNuJ3QgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIGxlbmd0aAogICAjIHlvdSBhc2sgZm9yIGFuZCByZWFkX2FsbCBpcy4gVGhpcyBtZWFucyBvdXIgdGVzdCBuZWVkcyB0byBjaGVjawogICAjIGZvciBibG9ja2luZy4gLS0gS2V2aW4gQ2xhcmsgMy8yNy8wOAogICBkZWYgdGVzdF9yZWFkX2FsbApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiIGIvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTJmNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCityZXF1aXJlICdyZWN1cnNpdmVfdHlwZXMnCisKK2NsYXNzIFRlc3RSZWN1cnNpdmVHZW5lcmF0aW9uIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgQ0hJTERfSVRFTSA9ICJjaGlsZCBpdGVtIgorICBQQVJFTlRfSVRFTSA9ICJwYXJlbnQgaXRlbSIKKworICBkZWYgdGVzdF9jYW5fY3JlYXRlX3JlY3Vyc2l2ZV90cmVlCisKKyAgICBjaGlsZF90cmVlID0gUmVjVHJlZS5uZXcKKyAgICBjaGlsZF90cmVlLml0ZW0gPSBDSElMRF9JVEVNCisKKyAgICBwYXJlbnRfdHJlZSA9IFJlY1RyZWUubmV3CisgICAgcGFyZW50X3RyZWUuaXRlbSA9IFBBUkVOVF9JVEVNCisgICAgcGFyZW50X3RyZWUuY2hpbGRyZW4gPSBbY2hpbGRfdHJlZV0KKworICAgIGFzc2VydF9lcXVhbChQQVJFTlRfSVRFTSwgcGFyZW50X3RyZWUuaXRlbSkKKyAgICBhc3NlcnRfZXF1YWwoMSwgcGFyZW50X3RyZWUuY2hpbGRyZW4ubGVuZ3RoKQorICAgIGFzc2VydF9lcXVhbChDSElMRF9JVEVNLCBwYXJlbnRfdHJlZS5jaGlsZHJlbi5maXJzdC5pdGVtKQorICAgIGFzc2VydF9uaWwocGFyZW50X3RyZWUuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjM5YWNhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgpAQCAtMCwwICsxLDM4MSBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyQ6LnB1c2ggRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4nCisKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworcmVxdWlyZSAndGhyaWZ0JworcmVxdWlyZSAndGhyaWZ0X3Rlc3QnCisKKyRkb21haW5fc29ja2V0ID0gbmlsCiskaG9zdCA9ICJsb2NhbGhvc3QiCiskcG9ydCA9IDkwOTAKKyRwcm90b2NvbFR5cGUgPSAiYmluYXJ5IgorJHNzbCA9IGZhbHNlCiskdHJhbnNwb3J0ID0gImJ1ZmZlcmVkIgorCitBUkdWLmVhY2ggZG98YXwKKyAgaWYgYSA9PSAiLS1oZWxwIgorICAgIHB1dHMgIkFsbG93ZWQgb3B0aW9uczoiCisgICAgcHV0cyAiXHQgLWggWyAtLWhlbHAgXSBcdCBwcm9kdWNlIGhlbHAgbWVzc2FnZSIKKyAgICBwdXRzICJcdC0tZG9tYWluLXNvY2tldCBhcmcgKD0pIFx0IFVuaXggZG9tYWluIHNvY2tldCBwYXRoIgorICAgIHB1dHMgIlx0LS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgXHQgSG9zdCB0byBjb25uZWN0IFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iCisgICAgcHV0cyAiXHQtLXNzbCBcdCB1c2Ugc3NsIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIgorICAgIGV4aXQKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1kb21haW4tc29ja2V0IikKKyAgICAkZG9tYWluX3NvY2tldCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWhvc3QiKQorICAgICRob3N0ID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcHJvdG9jb2wiKQorICAgICRwcm90b2NvbFR5cGUgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYSA9PSAiLS1zc2wiCisgICAgJHNzbCA9IHRydWUKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS10cmFuc3BvcnQiKQorICAgICR0cmFuc3BvcnQgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wb3J0IikKKyAgICAkcG9ydCA9IGEuc3BsaXQoIj0iKVsxXS50b19pCisgIGVuZAorZW5kCisKK2NsYXNzIFNpbXBsZUNsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBkZWYgc2V0dXAKKyAgICB1bmxlc3MgQHNvY2tldAorICAgICAgaWYgJGRvbWFpbl9zb2NrZXQudG9fcy5zdHJpcC5lbXB0eT8KKyAgICAgICAgaWYgJHNzbAorICAgICAgICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgICAgICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICAgICAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgICAgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgICAgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAiY2xpZW50LmNydCIpKSkKKyAgICAgICAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgICAgICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnc2VydmVyLnBlbScpKQorICAgICAgICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgImNsaWVudC5rZXkiKSkpCisgICAgICAgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgICAgICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldygkaG9zdCwgJHBvcnQsIG5pbCwgY3R4KQorICAgICAgICBlbHNlCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldygkaG9zdCwgJHBvcnQpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldygkZG9tYWluX3NvY2tldCkKKyAgICAgIGVuZAorICAgICAgCisgICAgICBpZiAkdHJhbnNwb3J0ID09ICJidWZmZXJlZCIKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpCisgICAgICBlbHNpZiAkdHJhbnNwb3J0ID09ICJmcmFtZWQiCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgJ1Vua25vd24gdHJhbnNwb3J0IHR5cGUnCisgICAgICBlbmQKKworICAgICAgaWYgJHByb3RvY29sVHlwZSA9PSAiYmluYXJ5IgorICAgICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyh0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgZWxzaWYgJHByb3RvY29sVHlwZSA9PSAiY29tcGFjdCIKKyAgICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBlbHNpZiAkcHJvdG9jb2xUeXBlID09ICJqc29uIgorICAgICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6Okpzb25Qcm90b2NvbC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGVsc2lmICRwcm90b2NvbFR5cGUgPT0gImFjY2VsIgorICAgICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQubmV3KHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlICdVbmtub3duIHByb3RvY29sIHR5cGUnCisgICAgICBlbmQKKyAgICAgIEBjbGllbnQgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQorICAgICAgQHNvY2tldC5vcGVuCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZWFyZG93bgorICAgIEBzb2NrZXQuY2xvc2UKKyAgZW5kCisKKyAgZGVmIHRlc3Rfdm9pZAorICAgIHAgJ3Rlc3Rfdm9pZCcKKyAgICBAY2xpZW50LnRlc3RWb2lkKCkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyaW5nCisgICAgcCAndGVzdF9zdHJpbmcnCisgICAgdGVzdF9zdHJpbmcgPQorICAgICAgJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKworICAgICAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcIiB9fX17IFtbWyAnCisgICAgdGVzdF9zdHJpbmcgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAgICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgICAgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKworICAgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgICAgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKworICAgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgICAgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsKKyAgICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAgICAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArCisgICAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgICAgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArCisgICAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgICAgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArCisgICAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAgICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICAgICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsKKyAgICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAgICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAgICAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKworICAgICAgIkLDom4tbMOibS1nw7osIOeyteiqniIKKworICAgIHJlc3VsdF9zdHJpbmcgPSBAY2xpZW50LnRlc3RTdHJpbmcodGVzdF9zdHJpbmcpCisgICAgYXNzZXJ0X2VxdWFsKHRlc3Rfc3RyaW5nLCByZXN1bHRfc3RyaW5nLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpVVEZfOCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X2Jvb2wKKyAgICBwICd0ZXN0X2Jvb2wnCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJvb2wodHJ1ZSksIHRydWUpCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJvb2woZmFsc2UpLCBmYWxzZSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYnl0ZQorICAgIHAgJ3Rlc3RfYnl0ZScKKyAgICB2YWwgPSAxMjAKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUoLXZhbCksIC12YWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X2kzMgorICAgIHAgJ3Rlc3RfaTMyJworICAgIHZhbCA9IDIwMDAwMDAwMzIKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQorICBlbmQKKworICBkZWYgdGVzdF9pNjQKKyAgICBwICd0ZXN0X2k2NCcKKyAgICB2YWwgPSA5MDAwMDAwMDAwMDAwMDAwMDY0CisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZG91YmxlCisgICAgcCAndGVzdF9kb3VibGUnCisgICAgdmFsID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCisgICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQorICBlbmQKKworICBkZWYgdGVzdF9iaW5hcnkKKyAgICBwICd0ZXN0X2JpbmFyeScKKyAgICB2YWwgPSAoMC4uLjI1NikucmV2ZXJzZV9lYWNoLnRvX2EKKyAgICByZXQgPSBAY2xpZW50LnRlc3RCaW5hcnkodmFsLnBhY2soJ0MqJykpCisgICAgYXNzZXJ0X2VxdWFsKHZhbCwgcmV0LmJ5dGVzLnRvX2EpCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcAorICAgIHAgJ3Rlc3RfbWFwJworICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RNYXAodmFsKSwgdmFsKQorICAgIGFzc2VydF9raW5kX29mKEhhc2gsIEBjbGllbnQudGVzdE1hcCh2YWwpKQorICBlbmQKKworICBkZWYgdGVzdF9zdHJpbmdfbWFwCisgICAgcCAndGVzdF9zdHJpbmdfbWFwJworICAgIHZhbCA9IHsnYScgPT4gJzInLCAnYicgPT4gJ2JsYWgnLCAnc29tZScgPT4gJ3RoaW5nJ30KKyAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJpbmdNYXAodmFsKQorICAgIGFzc2VydF9lcXVhbCh2YWwsIHJldCkKKyAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2xpc3QKKyAgICBwICd0ZXN0X2xpc3QnCisgICAgdmFsID0gWzEsMiwzLDQsNV0KKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TGlzdCh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIEBjbGllbnQudGVzdExpc3QodmFsKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfZW51bQorICAgIHAgJ3Rlc3RfZW51bScKKyAgICB2YWwgPSBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OlNJWAorICAgIHJldCA9IEBjbGllbnQudGVzdEVudW0odmFsKQorCisgICAgYXNzZXJ0X2VxdWFsKHJldCwgNikKKyAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfdHlwZWRlZgorICAgIHAgJ3Rlc3RfdHlwZWRlZicKKyAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyksIDMwOTg1ODIzNTA4MjUyMykKKyAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIEBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSkKKyAgICB0cnVlCisgIGVuZAorCisgIGRlZiB0ZXN0X3NldAorICAgIHAgJ3Rlc3Rfc2V0JworICAgIHZhbCA9IFNldC5uZXcoWzEsMiwzXSkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U2V0KHZhbCksIHZhbCkKKyAgICBhc3NlcnRfa2luZF9vZihTZXQsIEBjbGllbnQudGVzdFNldCh2YWwpKQorICBlbmQKKworICBkZWYgZ2V0X3N0cnVjdAorICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gJ2hpIScsICdpMzJfdGhpbmcnID0+IDQgfSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RydWN0CisgICAgcCAndGVzdF9zdHJ1Y3QnCisgICAgcmV0ID0gQGNsaWVudC50ZXN0U3RydWN0KGdldF9zdHJ1Y3QpCisKKyAgICAjIFRPRE86IG5vdCBzdXJlIHdoYXQgdW5zcGVjaWZpZWQgImRlZmF1bHQiIHJlcXVpcmVkbmVzcyB2YWx1ZXMgc2hvdWxkIGJlCisgICAgYXNzZXJ0KHJldC5ieXRlX3RoaW5nID09IG5pbCB8fCByZXQuYnl0ZV90aGluZyA9PSAwKQorICAgIGFzc2VydChyZXQuaTY0X3RoaW5nID09IG5pbCB8fCByZXQuaTY0X3RoaW5nID09IDApCisKKyAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCisgICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCisgICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbmVzdAorICAgIHAgJ3Rlc3RfbmVzdCcKKyAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLm5ldyh7J3N0cnVjdF90aGluZycgPT4gZ2V0X3N0cnVjdCwgJ2kzMl90aGluZycgPT4gMTB9KQorCisgICAgcmV0ID0gQGNsaWVudC50ZXN0TmVzdChzdHJ1Y3QyKQorCisgICAgIyBUT0RPOiBub3Qgc3VyZSB3aGF0IHVuc3BlY2lmaWVkICJkZWZhdWx0IiByZXF1aXJlZG5lc3MgdmFsdWVzIHNob3VsZCBiZQorICAgIGFzc2VydChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcgPT0gbmlsIHx8IHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyA9PSAwKQorICAgIGFzc2VydChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyA9PSBuaWwgfHwgcmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcgPT0gMCkKKworICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCisgICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQorICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKKworICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQorICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9pbnNhbml0eQorICAgIHAgJ3Rlc3RfaW5zYW5pdHknCisgICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoeworICAgICAgJ3VzZXJNYXAnID0+IHsKKyAgICAgICAgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgIFRocmlmdDo6VGVzdDo6TnVtYmVyejo6RUlHSFQgPT4gOCwKKyAgICAgIH0sCisgICAgICAneHRydWN0cycgPT4gWworICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeworICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCisgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQsCisgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKKyAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0LAorICAgICAgICB9KSwKKyAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKKyAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKKyAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMiwKKyAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAorICAgICAgICAgICdpNjRfdGhpbmcnID0+IDIsCisgICAgICAgIH0pCisgICAgICBdCisgICAgfSkKKworICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKKworICAgIGFzc2VydF9lcXVhbChpbnNhbmUsIHJldFsxXVsyXSkKKyAgICBhc3NlcnRfZXF1YWwoaW5zYW5lLCByZXRbMV1bM10pCisKKyAgICBhc3NlcnQocmV0WzJdWzZdLnVzZXJNYXAgPT0gbmlsIHx8IHJldFsyXVs2XS51c2VyTWFwLmxlbmd0aCA9PSAwKQorICAgIGFzc2VydChyZXRbMl1bNl0ueHRydWN0cyA9PSBuaWwgfHwgcmV0WzJdWzZdLnh0cnVjdHMubGVuZ3RoID09IDApCisgIGVuZAorCisgIGRlZiB0ZXN0X21hcF9tYXAKKyAgICBwICd0ZXN0X21hcF9tYXAnCisgICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCisgICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQorICAgIGV4cGVjdGVkID0geworICAgICAgLTQgPT4geworICAgICAgICAtNCA9PiAtNCwKKyAgICAgICAgLTMgPT4gLTMsCisgICAgICAgIC0yID0+IC0yLAorICAgICAgICAtMSA9PiAtMSwKKyAgICAgIH0sCisgICAgICA0ID0+IHsKKyAgICAgICAgNCA9PiA0LAorICAgICAgICAzID0+IDMsCisgICAgICAgIDIgPT4gMiwKKyAgICAgICAgMSA9PiAxLAorICAgICAgfQorICAgIH0KKyAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGkKKyAgICBwICd0ZXN0X211bHRpJworICAgIHJldCA9IEBjbGllbnQudGVzdE11bHRpKDQyLCA0MjQyLCA0MjQyNDIsIHsxID0+ICdibGFoJywgMiA9PiAndGhpbmcnfSwgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpFSUdIVCwgMjQpCisgICAgZXhwZWN0ZWQgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeworICAgICAgOnN0cmluZ190aGluZyA9PiAnSGVsbG8yJywKKyAgICAgIDpieXRlX3RoaW5nID0+ICAgNDIsCisgICAgICA6aTMyX3RoaW5nID0+ICAgIDQyNDIsCisgICAgICA6aTY0X3RoaW5nID0+ICAgIDQyNDI0MgorICAgIH0pCisgICAgYXNzZXJ0X2VxdWFsKGV4cGVjdGVkLCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X2V4Y2VwdGlvbgorICAgIHAgJ3Rlc3RfZXhjZXB0aW9uJworICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCisgICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKKyAgICBlbmQKKyAgICBiZWdpbgorICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykKKyAgICByZXNjdWUgPT4gZQorICAgICAgYXNzZXJ0IGUuY2xhc3MuYW5jZXN0b3JzLmluY2x1ZGU/KFRocmlmdDo6RXhjZXB0aW9uKQorICAgIGVuZAorICAgIGFzc2VydF9ub3RoaW5nX3JhaXNlZCBkbworICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCd0ZXN0JykKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RfbXVsdGlfZXhjZXB0aW9uCisgICAgcCAndGVzdF9tdWx0aV9leGNlcHRpb24nCisgICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KKyAgICAgIEBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKQorICAgIGVuZAorICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uMiBkbworICAgICAgQGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKQorICAgIGVuZAorICAgIGFzc2VydF9lcXVhbCggQGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlN1Y2Nlc3MiLCAidGVzdCAzIikuc3RyaW5nX3RoaW5nLCAidGVzdCAzIikKKyAgZW5kCisKKyAgZGVmIHRlc3Rfb25ld2F5CisgICAgcCAndGVzdF9vbmV3YXknCisgICAgdGltZTEgPSBUaW1lLm5vdy50b19mCisgICAgQGNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgdGltZTIgPSBUaW1lLm5vdy50b19mCisgICAgYXNzZXJ0X29wZXJhdG9yICh0aW1lMi10aW1lMSksIDo8LCAwLjEKKyAgZW5kCisKK2VuZAorCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NhZjZhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgpAQCAtMCwwICsxLDE4OCBAQAorIyEvdXNyL2Jpbi9lbnYgcnVieQorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJDoucHVzaCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLicKKworcmVxdWlyZSAndGVzdF9oZWxwZXInCityZXF1aXJlICd0aHJpZnQnCityZXF1aXJlICd0aHJpZnRfdGVzdCcKK3JlcXVpcmUgJ3RocmlmdF90ZXN0X3R5cGVzJworCitjbGFzcyBTaW1wbGVIYW5kbGVyCisgIFs6dGVzdFZvaWQsIDp0ZXN0U3RyaW5nLCA6dGVzdEJvb2wsIDp0ZXN0Qnl0ZSwgOnRlc3RJMzIsIDp0ZXN0STY0LCA6dGVzdERvdWJsZSwgOnRlc3RCaW5hcnksCisgICA6dGVzdFN0cnVjdCwgOnRlc3RNYXAsIDp0ZXN0U3RyaW5nTWFwLCA6dGVzdFNldCwgOnRlc3RMaXN0LCA6dGVzdE5lc3QsIDp0ZXN0RW51bSwgOnRlc3RUeXBlZGVmLAorICAgOnRlc3RFbnVtLCA6dGVzdFR5cGVkZWYsIDp0ZXN0TXVsdGlFeGNlcHRpb25dLmVhY2ggZG8gfG1ldGh8CisKKyAgICBkZWZpbmVfbWV0aG9kKG1ldGgpIGRvIHx0aGluZ3wKKyAgICAgIHAgbWV0aAorICAgICAgcCB0aGluZworICAgICAgdGhpbmcKKyAgICBlbmQKKworICBlbmQKKworICBkZWYgdGVzdFZvaWQoKQorICBlbmQKKworICBkZWYgdGVzdEluc2FuaXR5KHRoaW5nKQorICAgIHJldHVybiB7CisgICAgICAxID0+IHsKKyAgICAgICAgMiA9PiB0aGluZywKKyAgICAgICAgMyA9PiB0aGluZworICAgICAgfSwKKyAgICAgIDIgPT4geworICAgICAgICA2ID0+IFRocmlmdDo6VGVzdDo6SW5zYW5pdHk6Om5ldygpCisgICAgICB9CisgICAgfQorICBlbmQKKworICBkZWYgdGVzdE1hcE1hcCh0aGluZykKKyAgICByZXR1cm4geworICAgICAgLTQgPT4geworICAgICAgICAtNCA9PiAtNCwKKyAgICAgICAgLTMgPT4gLTMsCisgICAgICAgIC0yID0+IC0yLAorICAgICAgICAtMSA9PiAtMSwKKyAgICAgIH0sCisgICAgICA0ID0+IHsKKyAgICAgICAgNCA9PiA0LAorICAgICAgICAzID0+IDMsCisgICAgICAgIDIgPT4gMiwKKyAgICAgICAgMSA9PiAxLAorICAgICAgfQorICAgIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQorICAgIHJldHVybiBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeworICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAnYnl0ZV90aGluZycgPT4gYXJnMCwKKyAgICAgICdpMzJfdGhpbmcnID0+IGFyZzEsCisgICAgICAnaTY0X3RoaW5nJyA9PiBhcmcyLAorICAgIH0pCisgIGVuZAorCisgIGRlZiB0ZXN0RXhjZXB0aW9uKHRoaW5nKQorICAgIGlmIHRoaW5nID09ICJYY2VwdGlvbiIKKyAgICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDplcnJvckNvZGUgPT4gMTAwMSwgOm1lc3NhZ2UgPT4gdGhpbmcKKyAgICBlbHNpZiB0aGluZyA9PSAiVEV4Y2VwdGlvbiIKKyAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLCA6bWVzc2FnZSA9PiB0aGluZworICAgIGVsc2UKKyAgICAgICMgbm8tb3AKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwLCBhcmcxKQorICAgIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIKKyAgICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24yLCA6ZXJyb3JDb2RlID0+IDIwMDIsIDpzdHJ1Y3RfdGhpbmcgPT4gOjpUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeyA6c3RyaW5nX3RoaW5nID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uMicgfSkKKyAgICBlbHNpZiBhcmcwID09ICJYY2VwdGlvbiIKKyAgICAgIHJhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24sIDplcnJvckNvZGUgPT4gMTAwMSwgOm1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nCisgICAgZWxzZQorICAgICAgcmV0dXJuIDo6VGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiBhcmcxfSkKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIHRlc3RPbmV3YXkoYXJnMCkKKyAgICBzbGVlcChhcmcwKQorICBlbmQKKworZW5kCisKK2RvbWFpbl9zb2NrZXQgPSBuaWwKK3BvcnQgPSA5MDkwCitwcm90b2NvbCA9ICJiaW5hcnkiCitAcHJvdG9jb2xGYWN0b3J5ID0gbmlsCitzc2wgPSBmYWxzZQordHJhbnNwb3J0ID0gImJ1ZmZlcmVkIgorQHRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKKworQVJHVi5lYWNoIGRvfGF8CisgIGlmIGEgPT0gIi0taGVscCIKKyAgICBwdXRzICJBbGxvd2VkIG9wdGlvbnM6IgorICAgIHB1dHMgIlx0IC1oIFsgLS1oZWxwIF0gXHQgcHJvZHVjZSBoZWxwIG1lc3NhZ2UiCisgICAgcHV0cyAiXHQtLWRvbWFpbi1zb2NrZXQgYXJnICg9KSBcdCBVbml4IGRvbWFpbiBzb2NrZXQgcGF0aCIKKyAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4gXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIKKyAgICBwdXRzICJcdC0tc3NsIFx0IHVzZSBzc2wgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiCisgICAgZXhpdAorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWRvbWFpbi1zb2NrZXQiKQorICAgIGRvbWFpbl9zb2NrZXQgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wcm90b2NvbCIpCisgICAgcHJvdG9jb2wgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYSA9PSAiLS1zc2wiCisgICAgc3NsID0gdHJ1ZQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXRyYW5zcG9ydCIpCisgICAgdHJhbnNwb3J0ID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcG9ydCIpCisgICAgcG9ydCA9IGEuc3BsaXQoIj0iKVsxXS50b19pIAorICBlbmQKK2VuZAorCitpZiBwcm90b2NvbCA9PSAiYmluYXJ5IiB8fCBwcm90b2NvbC50b19zLnN0cmlwLmVtcHR5PworICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CitlbHNpZiBwcm90b2NvbCA9PSAiY29tcGFjdCIKKyAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcKK2Vsc2lmIHByb3RvY29sID09ICJqc29uIgorICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldworZWxzaWYgcHJvdG9jb2wgPT0gImFjY2VsIgorICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcKK2Vsc2UKKyAgcmFpc2UgJ1Vua25vd24gcHJvdG9jb2wgdHlwZScKK2VuZAorCitpZiB0cmFuc3BvcnQgPT0gImJ1ZmZlcmVkIiB8fCB0cmFuc3BvcnQudG9fcy5zdHJpcC5lbXB0eT8KKyAgQHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKK2Vsc2lmIHRyYW5zcG9ydCA9PSAiZnJhbWVkIgorICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKK2Vsc2UKKyAgcmFpc2UgJ1Vua25vd24gdHJhbnNwb3J0IHR5cGUnCitlbmQKKworQGhhbmRsZXIgPSBTaW1wbGVIYW5kbGVyLm5ldworQHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6UHJvY2Vzc29yLm5ldyhAaGFuZGxlcikKK0B0cmFuc3BvcnQgPSBuaWwKK2lmIGRvbWFpbl9zb2NrZXQudG9fcy5zdHJpcC5lbXB0eT8KKyAgaWYgc3NsCisgICAgIyB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHJ1YnkgY3Jvc3N0ZXN0IGlzIHRlc3QvcmIvZ2VuLXJiCisgICAga2V5c0RpciA9IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoRmlsZS5kaXJuYW1lKERpci5wd2QpKSwgImtleXMiKQorICAgIGN0eCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICBjdHguY2FfZmlsZSA9IEZpbGUuam9pbihrZXlzRGlyLCAiQ0EucGVtIikKKyAgICBjdHguY2VydCA9IE9wZW5TU0w6Olg1MDk6OkNlcnRpZmljYXRlLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJzZXJ2ZXIuY3J0IikpKQorICAgIGN0eC5jZXJ0X3N0b3JlID0gT3BlblNTTDo6WDUwOTo6U3RvcmUubmV3CisgICAgY3R4LmNlcnRfc3RvcmUuYWRkX2ZpbGUoRmlsZS5qb2luKGtleXNEaXIsICdjbGllbnQucGVtJykpCisgICAgY3R4LmtleSA9IE9wZW5TU0w6OlBLZXk6OlJTQS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAic2VydmVyLmtleSIpKSkKKyAgICBjdHgub3B0aW9ucyA9IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjIgfCBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYzCisgICAgY3R4LnNzbF92ZXJzaW9uID0gOlNTTHYyMworICAgIGN0eC52ZXJpZnlfbW9kZSA9IE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIKKyAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQubmV3KG5pbCwgcG9ydCwgY3R4KQorICBlbHNlCisgICAgQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyhwb3J0KQorICBlbmQKK2Vsc2UKKyAgQHRyYW5zcG9ydCA9IFRocmlmdDo6VU5JWFNlcnZlclNvY2tldC5uZXcoZG9tYWluX3NvY2tldCkKK2VuZAorCitAc2VydmVyID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCwgQHRyYW5zcG9ydEZhY3RvcnksIEBwcm90b2NvbEZhY3RvcnkpCisKK3B1dHMgIlN0YXJ0aW5nIFRlc3RTZXJ2ZXIgI3tAc2VydmVyLnRvX3N9IgorQHNlcnZlci5zZXJ2ZQorcHV0cyAiZG9uZS4iCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX2NsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfY2xpZW50LnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2VjMWRmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfY2xpZW50LnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBBY2NlbGVyYXRlZEJ1ZmZlcmVkQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0gIGRlZiBzZXR1cAotICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDkwOTApCi0gICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQubmV3KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpKQotICAgICAgQGNsaWVudCAgID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKLSAgICAgIEBzb2NrZXQub3BlbgotICAgIGVuZAotICBlbmQKLSAgCi0gIGRlZiB0ZXN0X3N0cmluZwotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTdHJpbmcoJ3N0cmluZycpLCAnc3RyaW5nJykKLSAgZW5kCi0KLSAgZGVmIHRlc3RfYnl0ZQotICAgIHZhbCA9IDgKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2kzMgotICAgIHZhbCA9IDMyCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMih2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMigtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTY0Ci0gICAgdmFsID0gNjQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9kb3VibGUKLSAgICB2YWwgPSAzLjE0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSgtdmFsKSwgLXZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihGbG9hdCwgQGNsaWVudC50ZXN0RG91YmxlKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcAotICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RNYXAodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIEBjbGllbnQudGVzdE1hcCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9saXN0Ci0gICAgdmFsID0gWzEsMiwzLDQsNV0KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TGlzdCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIEBjbGllbnQudGVzdExpc3QodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZW51bQotICAgIHZhbCA9IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6U0lYCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0RW51bSh2YWwpCi0KLSAgICBhc3NlcnRfZXF1YWwocmV0LCA2KQotICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF90eXBlZGVmCi0gICAgI1VzZXJJZCAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKLSAgICB0cnVlCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3NldAotICAgIHZhbCA9IFNldC5uZXcoWzEsMiwzXSkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U2V0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihTZXQsIEBjbGllbnQudGVzdFNldCh2YWwpKQotICBlbmQKLQotICBkZWYgZ2V0X3N0cnVjdAotICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gJ2hpIScsICdpMzJfdGhpbmcnID0+IDQgfSkKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc3RydWN0Ci0gICAgcmV0ID0gQGNsaWVudC50ZXN0U3RydWN0KGdldF9zdHJ1Y3QpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X25lc3QKLSAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLm5ldyh7J3N0cnVjdF90aGluZycgPT4gZ2V0X3N0cnVjdCwgJ2kzMl90aGluZycgPT4gMTB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TmVzdChzdHJ1Y3QyKQotCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDEwKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldC5zdHJ1Y3RfdGhpbmcpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2luc2FuZQotICAgIGluc2FuZSA9IFRocmlmdDo6VGVzdDo6SW5zYW5pdHkubmV3KHsKLSAgICAgICd1c2VyTWFwJyA9PiB7IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FID0+IDQ0IH0sCi0gICAgICAneHRydWN0cycgPT4gW2dldF9zdHJ1Y3QsCi0gICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7Ci0gICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2hpIGFnYWluJywKLSAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMgotICAgICAgICB9KQotICAgICAgXQotICAgIH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpCi0KLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdKQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF1bMV0pCi0KLSAgICBzdHJ1Y3QgPSByZXRbNDRdWzFdCi0KLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0LnVzZXJNYXBbVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkVdLCA0NCkKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uc3RyaW5nX3RoaW5nLCAnaGkgYWdhaW4nKQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5pMzJfdGhpbmcsIDEyKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgc3RydWN0LnVzZXJNYXApCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIHN0cnVjdC54dHJ1Y3RzKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6SW5zYW5pdHksIHN0cnVjdCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwX21hcAotICAgIHJldCA9IEBjbGllbnQudGVzdE1hcE1hcCg0KQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LCB7IDQgPT4geyA0ID0+IDR9fSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZXhjZXB0aW9uCi0gICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KLSAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignZm9vJykKLSAgICBlbmQKLSAgZW5kCi1lbmQKLQpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9zZXJ2ZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX3NlcnZlci5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhNjZlNS4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX3NlcnZlci5yYgorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0kOi5wdXNoIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL2dlbi1yYicKLSQ6LnB1c2ggRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi8uLi8uLi9saWIvcmIvbGliJykKLSQ6LnB1c2ggRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi8uLi8uLi9saWIvcmIvZXh0JykKLQotcmVxdWlyZSAndGhyaWZ0JwotcmVxdWlyZSAnVGhyaWZ0VGVzdCcKLQotY2xhc3MgU2ltcGxlSGFuZGxlcgotICBbOnRlc3RTdHJpbmcsIDp0ZXN0Qnl0ZSwgOnRlc3RJMzIsIDp0ZXN0STY0LCA6dGVzdERvdWJsZSwKLSAgIDp0ZXN0U3RydWN0LCA6dGVzdE1hcCwgOnRlc3RTZXQsIDp0ZXN0TGlzdCwgOnRlc3ROZXN0LAotICAgOnRlc3RFbnVtLCA6dGVzdFR5cGVkZWZdLmVhY2ggZG8gfG1ldGh8Ci0KLSAgICBkZWZpbmVfbWV0aG9kKG1ldGgpIGRvIHx0aGluZ3wKLSAgICAgIHRoaW5nCi0gICAgZW5kCi0KLSAgZW5kCi0KLSAgZGVmIHRlc3RJbnNhbml0eSh0aGluZykKLSAgICBudW0sIHVpZCA9IHRoaW5nLnVzZXJNYXAuZmluZCB7IHRydWUgfQotICAgIHJldHVybiB7dWlkID0+IHtudW0gPT4gdGhpbmd9fQotICBlbmQKLQotICBkZWYgdGVzdE1hcE1hcCh0aGluZykKLSAgICByZXR1cm4ge3RoaW5nID0+IHt0aGluZyA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0RW51bSh0aGluZykKLSAgICByZXR1cm4gdGhpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RUeXBlZGVmKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdEV4Y2VwdGlvbih0aGluZykKLSAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAnZXJyb3InCi0gIGVuZAotZW5kCi0KLUBoYW5kbGVyICAgPSBTaW1wbGVIYW5kbGVyLm5ldwotQHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6UHJvY2Vzc29yLm5ldyhAaGFuZGxlcikKLUB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoOTA5MCkKLUBzZXJ2ZXIgICAgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0LCBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcsIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3KQotCi1Ac2VydmVyLnNlcnZlCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL2J1ZmZlcmVkX2NsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vYnVmZmVyZWRfY2xpZW50LnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTkyNWNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYnVmZmVyZWRfY2xpZW50LnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBCdWZmZXJlZENsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgc2V0dXAKLSAgICB1bmxlc3MgQHNvY2tldAotICAgICAgQHNvY2tldCAgID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA5MDkwKQotICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcoQHNvY2tldCkpCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQotICAgICAgQHNvY2tldC5vcGVuCi0gICAgZW5kCi0gIGVuZAotICAKLSAgZGVmIHRlc3Rfc3RyaW5nCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQotICBlbmQKLQotICBkZWYgdGVzdF9ieXRlCi0gICAgdmFsID0gOAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTMyCi0gICAgdmFsID0gMzIKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STMyKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pNjQKLSAgICB2YWwgPSA2NAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RvdWJsZQotICAgIHZhbCA9IDMuMTQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQotICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwCi0gICAgdmFsID0gezEgPT4gMSwgMiA9PiAyLCAzID0+IDN9Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdE1hcCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgQGNsaWVudC50ZXN0TWFwKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2xpc3QKLSAgICB2YWwgPSBbMSwyLDMsNCw1XQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RMaXN0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgQGNsaWVudC50ZXN0TGlzdCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9lbnVtCi0gICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKLSAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKLQotICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3R5cGVkZWYKLSAgICAjVXNlcklkICB0ZXN0VHlwZWRlZigxOiBVc2VySWQgdGhpbmcpLAotICAgIHRydWUKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2V0Ci0gICAgdmFsID0gU2V0Lm5ldyhbMSwyLDNdKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTZXQodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiBnZXRfc3RydWN0Ci0gICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQotICBlbmQKLQotICBkZWYgdGVzdF9zdHJ1Y3QKLSAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKLQotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbmVzdAotICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCi0KLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zYW5lCi0gICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoewotICAgICAgJ3VzZXJNYXAnID0+IHsgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkUgPT4gNDQgfSwKLSAgICAgICd4dHJ1Y3RzJyA9PiBbZ2V0X3N0cnVjdCwKLSAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKLSAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnaGkgYWdhaW4nLAotICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyCi0gICAgICAgIH0pCi0gICAgICBdCi0gICAgfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKLQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF0pCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XVsxXSkKLQotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQotICBlbmQKLQotICBkZWYgdGVzdF9tYXBfbWFwCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQotICAgIGFzc2VydF9lcXVhbChyZXQsIHsgNCA9PiB7IDQgPT4gNH19KQotICBlbmQKLQotICBkZWYgdGVzdF9leGNlcHRpb24KLSAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwotICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdmb28nKQotICAgIGVuZAotICBlbmQKLWVuZAotCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9jbGllbnQucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9jbGllbnQucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjQ4MjIuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfY2xpZW50LnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBTaW1wbGVDbGllbnRUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKLSAgZGVmIHNldHVwICAgIAotICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDkwOTApCi0gICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhAc29ja2V0KQotICAgICAgQGNsaWVudCAgID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKLSAgICAgIEBzb2NrZXQub3BlbgotICAgIGVuZAotICBlbmQKLSAgCi0gIGRlZiB0ZXN0X3N0cmluZwotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTdHJpbmcoJ3N0cmluZycpLCAnc3RyaW5nJykKLSAgZW5kCi0KLSAgZGVmIHRlc3RfYnl0ZQotICAgIHZhbCA9IDgKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2kzMgotICAgIHZhbCA9IDMyCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMih2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMigtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTY0Ci0gICAgdmFsID0gNjQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9kb3VibGUKLSAgICB2YWwgPSAzLjE0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSgtdmFsKSwgLXZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihGbG9hdCwgQGNsaWVudC50ZXN0RG91YmxlKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcAotICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RNYXAodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIEBjbGllbnQudGVzdE1hcCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9saXN0Ci0gICAgdmFsID0gWzEsMiwzLDQsNV0KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TGlzdCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIEBjbGllbnQudGVzdExpc3QodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZW51bQotICAgIHZhbCA9IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6U0lYCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0RW51bSh2YWwpCi0KLSAgICBhc3NlcnRfZXF1YWwocmV0LCA2KQotICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF90eXBlZGVmCi0gICAgI1VzZXJJZCAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKLSAgICB0cnVlCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3NldAotICAgIHZhbCA9IFNldC5uZXcoWzEsMiwzXSkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U2V0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihTZXQsIEBjbGllbnQudGVzdFNldCh2YWwpKQotICBlbmQKLQotICBkZWYgZ2V0X3N0cnVjdAotICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gJ2hpIScsICdpMzJfdGhpbmcnID0+IDQgfSkKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc3RydWN0Ci0gICAgcmV0ID0gQGNsaWVudC50ZXN0U3RydWN0KGdldF9zdHJ1Y3QpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X25lc3QKLSAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLm5ldyh7J3N0cnVjdF90aGluZycgPT4gZ2V0X3N0cnVjdCwgJ2kzMl90aGluZycgPT4gMTB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TmVzdChzdHJ1Y3QyKQotCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDEwKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldC5zdHJ1Y3RfdGhpbmcpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2luc2FuZQotICAgIGluc2FuZSA9IFRocmlmdDo6VGVzdDo6SW5zYW5pdHkubmV3KHsKLSAgICAgICd1c2VyTWFwJyA9PiB7IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FID0+IDQ0IH0sCi0gICAgICAneHRydWN0cycgPT4gW2dldF9zdHJ1Y3QsCi0gICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7Ci0gICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2hpIGFnYWluJywKLSAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMgotICAgICAgICB9KQotICAgICAgXQotICAgIH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpCi0KLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdKQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF1bMV0pCi0KLSAgICBzdHJ1Y3QgPSByZXRbNDRdWzFdCi0KLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0LnVzZXJNYXBbVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkVdLCA0NCkKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uc3RyaW5nX3RoaW5nLCAnaGkgYWdhaW4nKQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5pMzJfdGhpbmcsIDEyKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgc3RydWN0LnVzZXJNYXApCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIHN0cnVjdC54dHJ1Y3RzKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6SW5zYW5pdHksIHN0cnVjdCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwX21hcAotICAgIHJldCA9IEBjbGllbnQudGVzdE1hcE1hcCg0KQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LCB7IDQgPT4geyA0ID0+IDR9fSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZXhjZXB0aW9uCi0gICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KLSAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignZm9vJykKLSAgICBlbmQKLSAgZW5kCi1lbmQKLQpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfc2VydmVyLnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfc2VydmVyLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE4ZDJlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX3NlcnZlci5yYgorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0kOi5wdXNoIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uL2dlbi1yYicKLSQ6LnB1c2ggRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi8uLi8uLi9saWIvcmIvbGliJykKLQotcmVxdWlyZSAndGhyaWZ0JwotcmVxdWlyZSAnVGhyaWZ0VGVzdCcKLQotY2xhc3MgU2ltcGxlSGFuZGxlcgotICBbOnRlc3RTdHJpbmcsIDp0ZXN0Qnl0ZSwgOnRlc3RJMzIsIDp0ZXN0STY0LCA6dGVzdERvdWJsZSwKLSAgIDp0ZXN0U3RydWN0LCA6dGVzdE1hcCwgOnRlc3RTZXQsIDp0ZXN0TGlzdCwgOnRlc3ROZXN0LAotICAgOnRlc3RFbnVtLCA6dGVzdFR5cGVkZWZdLmVhY2ggZG8gfG1ldGh8Ci0KLSAgICBkZWZpbmVfbWV0aG9kKG1ldGgpIGRvIHx0aGluZ3wKLSAgICAgIHRoaW5nCi0gICAgZW5kCi0KLSAgZW5kCi0KLSAgZGVmIHRlc3RJbnNhbml0eSh0aGluZykKLSAgICBudW0sIHVpZCA9IHRoaW5nLnVzZXJNYXAuZmluZCB7IHRydWUgfQotICAgIHJldHVybiB7dWlkID0+IHtudW0gPT4gdGhpbmd9fQotICBlbmQKLQotICBkZWYgdGVzdE1hcE1hcCh0aGluZykKLSAgICByZXR1cm4ge3RoaW5nID0+IHt0aGluZyA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0RW51bSh0aGluZykKLSAgICByZXR1cm4gdGhpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RUeXBlZGVmKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdEV4Y2VwdGlvbih0aGluZykKLSAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAnZXJyb3InCi0gIGVuZAotZW5kCi0KLUBoYW5kbGVyICAgPSBTaW1wbGVIYW5kbGVyLm5ldwotQHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6UHJvY2Vzc29yLm5ldyhAaGFuZGxlcikKLUB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoOTA5MCkKLUBzZXJ2ZXIgICAgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0KQotCi1Ac2VydmVyLnNlcnZlCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL3Rlc3Rfc2ltcGxlX2hhbmRsZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL3Rlc3Rfc2ltcGxlX2hhbmRsZXIucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGFhN2UuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi90ZXN0X3NpbXBsZV9oYW5kbGVyLnJiCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQotCi1yZXF1aXJlICd0aHJpZnQnCi1yZXF1aXJlICdUaHJpZnRUZXN0JwotCi1jbGFzcyBUZXN0SGFuZGxlcgotICBbOnRlc3RTdHJpbmcsIDp0ZXN0Qnl0ZSwgOnRlc3RJMzIsIDp0ZXN0STY0LCA6dGVzdERvdWJsZSwKLSAgIDp0ZXN0U3RydWN0LCA6dGVzdE1hcCwgOnRlc3RTZXQsIDp0ZXN0TGlzdCwgOnRlc3ROZXN0LAotICAgOnRlc3RFbnVtLCA6dGVzdFR5cGVkZWZdLmVhY2ggZG8gfG1ldGh8Ci0KLSAgICBkZWZpbmVfbWV0aG9kKG1ldGgpIGRvIHx0aGluZ3wKLSAgICAgIHRoaW5nCi0gICAgZW5kCi0KLSAgZW5kCi0KLSAgZGVmIHRlc3RJbnNhbml0eSh0aGluZykKLSAgICBudW0sIHVpZCA9IHRoaW5nLnVzZXJNYXAuZmluZCB7IHRydWUgfQotICAgIHJldHVybiB7dWlkID0+IHtudW0gPT4gdGhpbmd9fQotICBlbmQKLQotICBkZWYgdGVzdE1hcE1hcCh0aGluZykKLSAgICByZXR1cm4ge3RoaW5nID0+IHt0aGluZyA9PiB0aGluZ319Ci0gIGVuZAotCi0gIGRlZiB0ZXN0RW51bSh0aGluZykKLSAgICByZXR1cm4gdGhpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RUeXBlZGVmKHRoaW5nKQotICAgIHJldHVybiB0aGluZwotICBlbmQKLQotICBkZWYgdGVzdEV4Y2VwdGlvbih0aGluZykKLSAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6bWVzc2FnZSA9PiAnZXJyb3InCi0gIGVuZAotCi1lbmQKLWNsYXNzIFRlc3RUaHJpZnQgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotCi0gIEBASU5JVCA9IG5pbAotCi0gIGRlZiBzZXR1cAotICAgIGlmIEBASU5JVC5uaWw/Ci0gICAgICAjIEluaXRpYWxpemUgdGhlIHNlcnZlcgotICAgICAgQGhhbmRsZXIgICA9IFRlc3RIYW5kbGVyLm5ldygpCi0gICAgICBAcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQotICAgICAgQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyg5MDkwKQotICAgICAgQHNlcnZlciAgICA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQpCi0KLSAgICAgIEB0aHJlYWQgICAgPSBUaHJlYWQubmV3IHsgQHNlcnZlci5zZXJ2ZSB9Ci0KLSAgICAgICMgQW5kIHRoZSBDbGllbnQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkKLSAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KEBzb2NrZXQpCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQotICAgICAgQHNvY2tldC5vcGVuCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cmluZwotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTdHJpbmcoJ3N0cmluZycpLCAnc3RyaW5nJykKLSAgZW5kCi0KLSAgZGVmIHRlc3RfYnl0ZQotICAgIHZhbCA9IDgKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2kzMgotICAgIHZhbCA9IDMyCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMih2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMigtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTY0Ci0gICAgdmFsID0gNjQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9kb3VibGUKLSAgICB2YWwgPSAzLjE0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSgtdmFsKSwgLXZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihGbG9hdCwgQGNsaWVudC50ZXN0RG91YmxlKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcAotICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RNYXAodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIEBjbGllbnQudGVzdE1hcCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9saXN0Ci0gICAgdmFsID0gWzEsMiwzLDQsNV0KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TGlzdCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIEBjbGllbnQudGVzdExpc3QodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZW51bQotICAgIHZhbCA9IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6U0lYCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0RW51bSh2YWwpCi0KLSAgICBhc3NlcnRfZXF1YWwocmV0LCA2KQotICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF90eXBlZGVmCi0gICAgI1VzZXJJZCAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKLSAgICB0cnVlCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3NldAotICAgIHZhbCA9IFNldC5uZXcoWzEsIDIsIDNdKQotICAgIGFzc2VydF9lcXVhbCh2YWwsIEBjbGllbnQudGVzdFNldCh2YWwpKQotICAgIGFzc2VydF9raW5kX29mKFNldCwgQGNsaWVudC50ZXN0U2V0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiBnZXRfc3RydWN0Ci0gICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsnc3RyaW5nX3RoaW5nJyA9PiAnaGkhJywgJ2kzMl90aGluZycgPT4gNCB9KQotICBlbmQKLQotICBkZWYgdGVzdF9zdHJ1Y3QKLSAgICByZXQgPSBAY2xpZW50LnRlc3RTdHJ1Y3QoZ2V0X3N0cnVjdCkKLQotICAgIGFzc2VydF9uaWwocmV0LmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbmVzdAotICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIubmV3KHsnc3RydWN0X3RoaW5nJyA9PiBnZXRfc3RydWN0LCAnaTMyX3RoaW5nJyA9PiAxMH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3ROZXN0KHN0cnVjdDIpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCi0KLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zYW5lCi0gICAgaW5zYW5lID0gVGhyaWZ0OjpUZXN0OjpJbnNhbml0eS5uZXcoewotICAgICAgJ3VzZXJNYXAnID0+IHsgVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkUgPT4gNDQgfSwKLSAgICAgICd4dHJ1Y3RzJyA9PiBbZ2V0X3N0cnVjdCwKLSAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKLSAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnaGkgYWdhaW4nLAotICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyCi0gICAgICAgIH0pCi0gICAgICBdCi0gICAgfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSkKLQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF0pCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XVsxXSkKLQotICAgIHN0cnVjdCA9IHJldFs0NF1bMV0KLQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QudXNlck1hcFtUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORV0sIDQ0KQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5zdHJpbmdfdGhpbmcsICdoaSBhZ2FpbicpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLmkzMl90aGluZywgMTIpCi0KLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBzdHJ1Y3QudXNlck1hcCkKLSAgICBhc3NlcnRfa2luZF9vZihBcnJheSwgc3RydWN0Lnh0cnVjdHMpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpJbnNhbml0eSwgc3RydWN0KQotICBlbmQKLQotICBkZWYgdGVzdF9tYXBfbWFwCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TWFwTWFwKDQpCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQotICAgIGFzc2VydF9lcXVhbChyZXQsIHsgNCA9PiB7IDQgPT4gNH19KQotICBlbmQKLQotICBkZWYgdGVzdF9leGNlcHRpb24KLSAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbwotICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdmb28nKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVhcmRvd24KLSAgZW5kCi0KLWVuZApkaWZmIC0tZ2l0IGEvdGVzdC9yZWJ1aWxkX2tub3duX2ZhaWx1cmVzLnNoIGIvdGVzdC9yZWJ1aWxkX2tub3duX2ZhaWx1cmVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODY5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JlYnVpbGRfa25vd25fZmFpbHVyZXMuc2gKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAteiAkMSBdOyB0aGVuCisgIGVjaG8gVXNhZ2U6ICQwIExBTkdVQUdFCisgIGVjaG8gUmUtbGlzdCBhbGwgZmFpbHVyZXMgb2YgYSBzcGVjaWZpYyBMQU5HVUFHRSBpbnRvIGtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KKyAgZWNobyBMQU5HVUFHRSBzaG91bGQgYmUgbGlicmFyeSBuYW1lIGxpa2UgY3BwLCBqYXZhLCBweSBldGMKKyAgZXhpdCAxCitmaQorCitpZiBbIC16ICRQWVRIT05dOyB0aGVuCisgIFBZVEhPTj1weXRob24KK2ZpCisKK1RBUkdFVF9MQU5HPSQxCitPVVRfRklMRT1rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCitlY2hvIFJlYnVpbGRpbmcga25vd24gZmFpbHVyZXMgZm9yICRUQVJHRVRfTEFORworCitUTVBGSUxFPS5fX3RtcF9fcmVidWlsZF9fCitncmVwIC12IC1lICJcIiQxLSIgLWUgIlwtJDFfIiAkT1VUX0ZJTEUgPiAkVE1QRklMRQorbXYgJFRNUEZJTEUgJE9VVF9GSUxFCiskUFlUSE9OIHRlc3QucHkgLS1jbGllbnQgJDEKKyRQWVRIT04gdGVzdC5weSAtVSBtZXJnZQorJFBZVEhPTiB0ZXN0LnB5IC0tc2VydmVyICQxCiskUFlUSE9OIHRlc3QucHkgLVUgbWVyZ2UKZGlmZiAtLWdpdCBhL3Rlc3QvcmVzdWx0LmpzIGIvdGVzdC9yZXN1bHQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiMWE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVzdWx0LmpzCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCiskLmdldEpTT04oJ3Jlc3VsdHMuanNvbicsIGZ1bmN0aW9uKHJlc3VsdHMpIHsKKyAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IDM7CisgICAgICAgIHZhciBzb2NrZXQgPSA0OworICAgICAgICB2YXIgc3VjY2VzcyA9IDU7CisgICAgICAgIHZhciBleHBlY3RlZCA9IDY7CisgICAgICAgIHZhciByZXR1cm5Db2RlID0gNzsKKyAgICAgICAgdmFyIGxvZ0ZpbGUgPSA4OworICAgICAgICB0ZXN0VGFibGUgPSAkKCcjdGVzdF9yZXN1bHRzJykuRGF0YVRhYmxlKHsKKyAgICAgICAgICAgIGRhdGE6IHJlc3VsdHNbJ3Jlc3VsdHMnXSwKKyAgICAgICAgICAgIGNvbHVtbkRlZnM6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDMsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W3RyYW5zcG9ydF0gKyAnLScgKyByb3dbc29ja2V0XTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogNCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocm93W3N1Y2Nlc3NdID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoJyArIChyb3dbcmV0dXJuQ29kZV0gPT0gMTI4ID8gJ3RpbWVvdXQnIDogcm93W3JldHVybkNvZGVdKSArICcpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5zZXJ2ZXIgKyAnIj5TZXJ2ZXI8L2E+LCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicgKyByb3dbbG9nRmlsZV0uY2xpZW50ICsgJyI+Q2xpZW50PC9hPiknOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA1LAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3llcycgcmF0aGVyIHRoYW4gJ2V4cGVjdGVkJyB0byBlYXNlIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tleHBlY3RlZF0gPyAneWVzJyA6ICd1bmV4cGVjdGVkJzsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICB9KTsKKyAgICAgICAgJCgnI3Rlc3RfcmVzdWx0c19maWx0ZXIgbGFiZWwgaW5wdXQnKS5mb2N1cygpLnZhbCgndW5leHBlY3RlZCBmYWlsdXJlJyk7CisgICAgICAgICQoJyN0ZXN0X2luZm8nKS50ZXh0KAorICAgICAgICAgICAgIlRlc3QgRGF0ZTogICAgICIgKyByZXN1bHRzWydkYXRlJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJSZXZpc2lvbjogICAgICAiICsgcmVzdWx0c1sncmV2aXNpb24nXSArICJcbiIgKworICAgICAgICAgICAgIlBsYXRmb3JtOiAgICAgICIgKyByZXN1bHRzWydwbGF0Zm9ybSddICsgIlxuIiArCisgICAgICAgICAgICAiVGVzdCBkdXJhdGlvbjogIiArIHJlc3VsdHNbJ2R1cmF0aW9uJ10pICsgIiBzZWNvbmRzIjsKKyAgICB9KTsKK30pOworCmRpZmYgLS1naXQgYS90ZXN0L3JzL0NhcmdvLnRvbWwgYi90ZXN0L3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE3IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0LXRlc3QiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorZW52X2xvZ2dlciA9ICIwLjQuMCIKK2xvZyA9ICIwLjMuNyIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9NYWtlZmlsZS5hbSBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5MDViNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCisJJChDQVJHTykgYnVpbGQKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X3NlcnZlciBiaW4vdGVzdF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdGVzdF9jbGllbnQgYmluL3Rlc3RfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL3RocmlmdF90ZXN0LnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorICAgICAgICBzcmMvbGliLnJzIFwKKwlzcmMvYmluL3Rlc3Rfc2VydmVyLnJzIFwKKwlzcmMvYmluL3Rlc3RfY2xpZW50LnJzCisKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI1Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCkBAIC0wLDAgKzEsNjA1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKK2V4dGVybiBjcmF0ZSBlbnZfbG9nZ2VyOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90ZXN0OyAvLyBodWguIEkgaGF2ZSB0byBkbyB0aGlzIHRvIHVzZSBteSBsaWIKKwordXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OmZtdDo6RGVidWc7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbCwgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUUmVhZFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUY3BDaGFubmVsLCBUV3JpdGVUcmFuc3BvcnQsIFdyaXRlSGFsZn07Cit1c2UgdGhyaWZ0X3Rlc3Q6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZW52X2xvZ2dlcjo6aW5pdCgpLmV4cGVjdCgibG9nZ2VyIHNldHVwIGZhaWxlZCIpOworCisgICAgZGVidWchKCJpbml0aWFsaXplZCBsb2dnZXIgLSBydW5uaW5nIGNyb3NzLXRlc3QgY2xpZW50Iik7CisKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBpbmZvISgiY3Jvc3MtdGVzdCBjbGllbnQgc3VjY2VlZGVkIiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBpbmZvISgiY3Jvc3MtdGVzdCBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIC8vIHVuc3VwcG9ydGVkIG9wdGlvbnM6CisgICAgLy8gLS1kb21haW4tc29ja2V0CisgICAgLy8gLS1uYW1lZC1waXBlCisgICAgLy8gLS1hbm9uLXBpcGVzCisgICAgLy8gLS1zc2wKKyAgICAvLyAtLXRocmVhZHMKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X3Rlc3RfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlJ1c3QgVGhyaWZ0IHRlc3QgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiSG9zdCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxvY2F0ZWQiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJQb3J0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIikKKyAgICAgICAgKEBhcmcgdHJhbnNwb3J0OiAtLXRyYW5zcG9ydCArdGFrZXNfdmFsdWUgIlRocmlmdCB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJ1ZmZlcmVkXCIsIFwiZnJhbWVkXCIpIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyB0ZXN0bG9vcHM6IC1uIC0tdGVzdGxvb3BzICt0YWtlc192YWx1ZSAiTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biB0ZXN0cyIpCisgICAgKQorICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCB0ZXN0bG9vcHMgPSB2YWx1ZV90IShtYXRjaGVzLCAidGVzdGxvb3BzIiwgdTgpLnVud3JhcF9vcigxKTsKKyAgICBsZXQgdHJhbnNwb3J0ID0gbWF0Y2hlcy52YWx1ZV9vZigidHJhbnNwb3J0IikudW53cmFwX29yKCJidWZmZXJlZCIpOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJiaW5hcnkiKTsKKworCisgICAgbGV0IG11dCB0aHJpZnRfdGVzdF9jbGllbnQgPSB7CisgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gYnVpbGRfcHJvdG9jb2xzKGhvc3QsIHBvcnQsIHRyYW5zcG9ydCwgcHJvdG9jb2wsICJUaHJpZnRUZXN0Iik/OworICAgICAgICBUaHJpZnRUZXN0U3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KQorICAgIH07CisKKyAgICBsZXQgbXV0IHNlY29uZF9zZXJ2aWNlX2NsaWVudCA9IGlmIHByb3RvY29sLnN0YXJ0c193aXRoKCJtdWx0aSIpIHsKKyAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBidWlsZF9wcm90b2NvbHMoaG9zdCwgcG9ydCwgdHJhbnNwb3J0LCBwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKT87CisgICAgICAgIFNvbWUoU2Vjb25kU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgTm9uZQorICAgIH07CisKKyAgICBpbmZvISgKKyAgICAgICAgImNvbm5lY3RpbmcgdG8ge306e30gd2l0aCB7fSt7fSBzdGFjayIsCisgICAgICAgIGhvc3QsCisgICAgICAgIHBvcnQsCisgICAgICAgIHByb3RvY29sLAorICAgICAgICB0cmFuc3BvcnQKKyAgICApOworCisgICAgZm9yIF8gaW4gMC4udGVzdGxvb3BzIHsKKyAgICAgICAgbWFrZV90aHJpZnRfY2FsbHMoJm11dCB0aHJpZnRfdGVzdF9jbGllbnQsICZtdXQgc2Vjb25kX3NlcnZpY2VfY2xpZW50KT8KKyAgICB9CisKKyAgICBPaygoKSkKK30KKworZm4gYnVpbGRfcHJvdG9jb2xzKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorICAgIHRyYW5zcG9ydDogJnN0ciwKKyAgICBwcm90b2NvbDogJnN0ciwKKyAgICBzZXJ2aWNlX25hbWU6ICZzdHIsCispIC0+IHRocmlmdDo6UmVzdWx0PChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPik+IHsKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IHRjcF9jaGFubmVsKGhvc3QsIHBvcnQpPzsKKworICAgIGxldCAoaV90cmFuLCBvX3RyYW4pOiAoQm94PFRSZWFkVHJhbnNwb3J0PiwgQm94PFRXcml0ZVRyYW5zcG9ydD4pID0gbWF0Y2ggdHJhbnNwb3J0IHsKKyAgICAgICAgImJ1ZmZlcmVkIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSkpCisgICAgICAgIH0KKyAgICAgICAgImZyYW1lZCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSkpCisgICAgICAgIH0KKyAgICAgICAgdW5tYXRjaGVkID0+IHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBsZXQgKGlfcHJvdCwgb19wcm90KTogKEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KSA9IG1hdGNoIHByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSkpCisgICAgICAgIH0KKyAgICAgICAgIm11bHRpIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgICBCb3g6Om5ldygKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0KKyAgICAgICAgImNvbXBhY3QiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSkpCisgICAgICAgIH0KKyAgICAgICAgIm11bHRpYyIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoc2VydmljZV9uYW1lLCBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSksKSkKKyAgICAgICAgfQorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBwcm90b2NvbCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgT2soKGlfcHJvdCwgb19wcm90KSkKK30KKworLy8gRklYTUU6IGV4cG9zZSAib3BlbiIgdGhyb3VnaCB0aGUgY2xpZW50IGludGVyZmFjZSBzbyBJIGRvbid0IGhhdmUgdG8gZWFybHkKKy8vIG9wZW4KK2ZuIHRjcF9jaGFubmVsKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoUmVhZEhhbGY8VFRjcENoYW5uZWw+LCBXcml0ZUhhbGY8VFRjcENoYW5uZWw+KT4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKyAgICBjLnNwbGl0KCkKK30KKwordHlwZSBCdWlsZFRocmlmdFRlc3RDbGllbnQgPSBUaHJpZnRUZXN0U3luY0NsaWVudDxCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPj47Cit0eXBlIEJ1aWx0U2Vjb25kU2VydmljZUNsaWVudCA9IFNlY29uZFNlcnZpY2VTeW5jQ2xpZW50PEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+PjsKKworI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KGN5Y2xvbWF0aWNfY29tcGxleGl0eSkpXQorZm4gbWFrZV90aHJpZnRfY2FsbHMoCisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50OiAmbXV0IEJ1aWxkVGhyaWZ0VGVzdENsaWVudCwKKyAgICBzZWNvbmRfc2VydmljZV9jbGllbnQ6ICZtdXQgT3B0aW9uPEJ1aWx0U2Vjb25kU2VydmljZUNsaWVudD4sCispIC0+IFJlc3VsdDwoKSwgdGhyaWZ0OjpFcnJvcj4geworICAgIGluZm8hKCJ0ZXN0Vm9pZCIpOworICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3ZvaWQoKT87CisKKyAgICBpbmZvISgidGVzdFN0cmluZyIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cmluZygidGhpbmciLnRvX293bmVkKCkpLAorICAgICAgICAidGhpbmciLnRvX293bmVkKCksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdEJvb2wiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2Jvb2wodHJ1ZSksIHRydWUpPzsKKworICAgIGluZm8hKCJ0ZXN0Qm9vbCIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYm9vbChmYWxzZSksIGZhbHNlKT87CisKKyAgICBpbmZvISgidGVzdEJ5dGUiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2J5dGUoNDIpLCA0Mik/OworCisgICAgaW5mbyEoInRlc3RpMzIiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2kzMigxMTU5MzQ4Mzc0KSwgMTE1OTM0ODM3NCk/OworCisgICAgaW5mbyEoInRlc3RpNjQiKTsKKyAgICAvLyB0cnkhKHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTY0KC04NjUxODI5ODc5NDM4Mjk0NTY1KSwKKyAgICAvLyAtODY1MTgyOTg3OTQzODI5NDU2NSkpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2k2NChpNjQ6Om1pbl92YWx1ZSgpKSwKKyAgICAgICAgaTY0OjptaW5fdmFsdWUoKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0RG91YmxlIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZG91YmxlKE9yZGVyZWRGbG9hdDo6ZnJvbSg0Mi40MikpLAorICAgICAgICBPcmRlcmVkRmxvYXQ6OmZyb20oNDIuNDIpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3RUeXBlZGVmIik7CisgICAgeworICAgICAgICBsZXQgdV9zbmQ6IFVzZXJJZCA9IDIzNDg7CisgICAgICAgIGxldCB1X2NtcDogVXNlcklkID0gMjM0ODsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF90eXBlZGVmKHVfc25kKSwgdV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEVudW0iKTsKKyAgICB7CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZW51bShOdW1iZXJ6OjpUd28pLCBOdW1iZXJ6OjpUd28pPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEJpbmFyeSIpOworICAgIHsKKyAgICAgICAgbGV0IGJfc25kID0gdmVjIVsweDc3LCAweDMwLCAweDMwLCAweDc0LCAweDIxLCAweDIwLCAweDUyLCAweDc1LCAweDczLCAweDc0XTsKKyAgICAgICAgbGV0IGJfY21wID0gdmVjIVsweDc3LCAweDMwLCAweDMwLCAweDc0LCAweDIxLCAweDIwLCAweDUyLCAweDc1LCAweDczLCAweDc0XTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9iaW5hcnkoYl9zbmQpLCBiX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U3RydWN0Iik7CisgICAgeworICAgICAgICBsZXQgeF9zbmQgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxMiksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjE5MTI5KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgIH07CisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEyKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyMTkxMjkpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgfTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJ1Y3QoeF9zbmQpLCB4X2NtcCk/OworICAgIH0KKworICAgIC8vIFh0cnVjdCBhZ2Fpbiwgd2l0aCBvcHRpb25hbCB2YWx1ZXMKKyAgICAvLyBGSVhNRTogYXBwYXJlbnRseSB0aGUgZXJsYW5nIHRocmlmdCBzZXJ2ZXIgZG9lcyBub3QgbGlrZSBvcHQtaW4tcmVxLW91dAorICAgIC8vIHBhcmFtZXRlcnMgdGhhdCBhcmUgdW5kZWZpbmVkLiBKb3kuCisgICAgLy8geworICAgIC8vIGxldCB4X3NuZCA9IFh0cnVjdCB7IHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwgYnl0ZV90aGluZzogTm9uZSwKKyAgICAvLyBpMzJfdGhpbmc6IE5vbmUsIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCkgfTsKKyAgICAvLyBsZXQgeF9jbXAgPSBYdHJ1Y3QgeyBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksIGJ5dGVfdGhpbmc6CisgICAgLy8gU29tZSgwKSwgaTMyX3RoaW5nOiBTb21lKDApLCBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpIH07IC8vIHRoZSBDKysKKyAgICAvLyBzZXJ2ZXIgaXMgcmVzcG9uZGluZyBjb3JyZWN0bHkKKyAgICAvLyB0cnkhKHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RydWN0KHhfc25kKSwgeF9jbXApKTsKKyAgICAvLyB9CisgICAgLy8KKworICAgIGluZm8hKCJ0ZXN0TmVzdCIpOyAvLyAoRklYTUU6IHRyeSBYdHJ1Y3QyIHdpdGggb3B0aW9uYWwgdmFsdWVzKQorICAgIHsKKyAgICAgICAgbGV0IHhfc25kID0gWHRydWN0MiB7CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDMyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzMjQzODIwOTgpLAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5MzQ4MTA5OCksCisgICAgICAgIH07CisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdDIgeworICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgzMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzI0MzgyMDk4KSwKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOTM0ODEwOTgpLAorICAgICAgICB9OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X25lc3QoeF9zbmQpLCB4X2NtcCk/OworICAgIH0KKworICAgIC8vIGRvIHRoZSBtdWx0aXBsZXhlZCBjYWxscyB3aGlsZSBtYWtpbmcgdGhlIG1haW4gVGhyaWZ0VGVzdCBjYWxscworICAgIGlmIGxldCBTb21lKHJlZiBtdXQgY2xpZW50KSA9IHNlY29uZF9zZXJ2aWNlX2NsaWVudC5hc19tdXQoKSB7CisgICAgICAgIGluZm8hKCJTZWNvbmRTZXJ2aWNlIHNlY29uZHRlc3RTdHJpbmciKTsKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgICAgICBjbGllbnQuc2Vjb25kdGVzdF9zdHJpbmcoInRlc3Rfc3RyaW5nIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAidGVzdFN0cmluZyhcInRlc3Rfc3RyaW5nXCIpIi50b19vd25lZCgpLAorICAgICAgICAgICAgKT87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmZvISgidGVzdExpc3QiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgdl9zbmQ6IFZlYzxpMzI+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgdl9zbmQucHVzaCgyOTM4NCk7CisgICAgICAgIHZfc25kLnB1c2goMjM4KTsKKyAgICAgICAgdl9zbmQucHVzaCgzMjQ5OCk7CisKKyAgICAgICAgbGV0IG11dCB2X2NtcDogVmVjPGkzMj4gPSBWZWM6Om5ldygpOworICAgICAgICB2X2NtcC5wdXNoKDI5Mzg0KTsKKyAgICAgICAgdl9jbXAucHVzaCgyMzgpOworICAgICAgICB2X2NtcC5wdXNoKDMyNDk4KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2xpc3Qodl9zbmQpLCB2X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U2V0Iik7CisgICAgeworICAgICAgICBsZXQgbXV0IHNfc25kOiBCVHJlZVNldDxpMzI+ID0gQlRyZWVTZXQ6Om5ldygpOworICAgICAgICBzX3NuZC5pbnNlcnQoMjkzNDgxKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDIzKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDMyMzQpOworCisgICAgICAgIGxldCBtdXQgc19jbXA6IEJUcmVlU2V0PGkzMj4gPSBCVHJlZVNldDo6bmV3KCk7CisgICAgICAgIHNfY21wLmluc2VydCgyOTM0ODEpOworICAgICAgICBzX2NtcC5pbnNlcnQoMjMpOworICAgICAgICBzX2NtcC5pbnNlcnQoMzIzNCk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zZXQoc19zbmQpLCBzX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgyLCA0KTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDQsIDYpOworICAgICAgICBtX3NuZC5pbnNlcnQoOCwgNyk7CisKKyAgICAgICAgbGV0IG11dCBtX2NtcDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX2NtcC5pbnNlcnQoMiwgNCk7CisgICAgICAgIG1fY21wLmluc2VydCg0LCA2KTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDgsIDcpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbWFwKG1fc25kKSwgbV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdFN0cmluZ01hcCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjIiLnRvX293bmVkKCksICI0X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fc25kLmluc2VydCgiNCIudG9fb3duZWQoKSwgIjZfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCI4Ii50b19vd25lZCgpLCAiN19zdHJpbmciLnRvX293bmVkKCkpOworCisgICAgICAgIGxldCBtdXQgbV9yY3Y6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCIyIi50b19vd25lZCgpLCAiNF9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjQiLnRvX293bmVkKCksICI2X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiOCIudG9fb3duZWQoKSwgIjdfc3RyaW5nIi50b19vd25lZCgpKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cmluZ19tYXAobV9zbmQpLCBtX3Jjdik/OworICAgIH0KKworICAgIC8vIG5lc3RlZCBtYXAKKyAgICAvLyBleHBlY3QgOiB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIKKyAgICAvLyA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgIGluZm8hKCJ0ZXN0TWFwTWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fY21wX25lc3RlZF8wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluICgtNCBhcyBpMzIpLi4wIHsKKyAgICAgICAgICAgIG1fY21wX25lc3RlZF8wLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgbXV0IG1fY21wX25lc3RlZF8xOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIDEuLjUgeworICAgICAgICAgICAgbV9jbXBfbmVzdGVkXzEuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBtX2NtcDogQlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX2NtcC5pbnNlcnQoLTQsIG1fY21wX25lc3RlZF8wKTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDQsIG1fY21wX25lc3RlZF8xKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X21hcF9tYXAoNDIpLCBtX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGkiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPGkxNiwgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDEyOTgsICJmaXp6Ii50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KC0xNDgsICJidXp6Ii50b19vd25lZCgpKTsKKworICAgICAgICBsZXQgc19jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJIZWxsbzIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgtMTIzOTQ4KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTkyMzQxMjM5ODEpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aSgxLCAtMTIzOTQ4LCAtMTkyMzQxMjM5ODEsIG1fc25kLCBOdW1iZXJ6OjpFaWdodCwgODEpLAorICAgICAgICAgICAgc19jbXAsCisgICAgICAgICk/OworICAgIH0KKworICAgIC8vIEluc2FuaXR5CisgICAgLy8gcmV0dXJuczoKKyAgICAvLyB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgLy8gICAgICAgIH0sCisgICAgLy8gICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAvLyB9CisgICAgeworICAgICAgICBsZXQgbXV0IGFyZ19tYXBfdXNlcm1hcDogQlRyZWVNYXA8TnVtYmVyeiwgaTY0PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgYXJnX21hcF91c2VybWFwLmluc2VydChOdW1iZXJ6OjpPbmUsIDQyODkpOworICAgICAgICBhcmdfbWFwX3VzZXJtYXAuaW5zZXJ0KE51bWJlcno6OkVpZ2h0LCAxOSk7CisKKyAgICAgICAgbGV0IG11dCBhcmdfdmVjX3h0cnVjdHM6IFZlYzxYdHJ1Y3Q+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDgpLAorICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOSksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDkyMzg0KSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImJhciIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgyOCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTI4MSksCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJiYXoiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDM5NDg1MzkpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTI5Mzg0OTIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgICAgICBsZXQgbXV0IHNfY21wX25lc3RlZF8xOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGxldCBpbnNhbml0eSA9IEluc2FuaXR5IHsKKyAgICAgICAgICAgIHVzZXJfbWFwOiBTb21lKGFyZ19tYXBfdXNlcm1hcCksCisgICAgICAgICAgICB4dHJ1Y3RzOiBTb21lKGFyZ192ZWNfeHRydWN0cyksCisgICAgICAgIH07CisgICAgICAgIHNfY21wX25lc3RlZF8xLmluc2VydChOdW1iZXJ6OjpUd28sIGluc2FuaXR5LmNsb25lKCkpOworICAgICAgICBzX2NtcF9uZXN0ZWRfMS5pbnNlcnQoTnVtYmVyejo6VGhyZWUsIGluc2FuaXR5LmNsb25lKCkpOworCisgICAgICAgIGxldCBtdXQgc19jbXBfbmVzdGVkXzI6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGVtcHR5X2luc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IFNvbWUoQlRyZWVNYXA6Om5ldygpKSwKKyAgICAgICAgICAgIHh0cnVjdHM6IFNvbWUoVmVjOjpuZXcoKSksCisgICAgICAgIH07CisgICAgICAgIHNfY21wX25lc3RlZF8yLmluc2VydChOdW1iZXJ6OjpTaXgsIGVtcHR5X2luc2FuaXR5KTsKKworICAgICAgICBsZXQgbXV0IHNfY21wOiBCVHJlZU1hcDxVc2VySWQsIEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5Pj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHNfY21wLmluc2VydCgxIGFzIFVzZXJJZCwgc19jbXBfbmVzdGVkXzEpOworICAgICAgICBzX2NtcC5pbnNlcnQoMiBhcyBVc2VySWQsIHNfY21wX25lc3RlZF8yKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2luc2FuaXR5KGluc2FuaXR5LmNsb25lKCkpLCBzX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oIlhjZXB0aW9uIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24+KCkgeworICAgICAgICAgICAgICAgICAgICBTb21lKHgpID0+IE9rKHgpLAorICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleHBlY3RlZCBYY2VwdGlvbiBzdHJ1Y3QiLmludG8oKSksKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYY2VwdGlvbiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJURXhjZXB0aW9uIi50b19vd25lZCgpKTsKKyAgICAgICAgbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgaW5mbyEoInJlY2VpdmVkIGFuIHs6P30iLCBlKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHN1Y2NlZWRzIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiZm9vIi50b19vd25lZCgpKTsKKyAgICAgICAgbWF0Y2ggciB7CisgICAgICAgICAgICBPayhfKSA9PiBPaygoKSksCisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJyZWNlaXZlZCBhbiBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPQorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJYY2VwdGlvbiIudG9fb3duZWQoKSwgImlnbm9yZWQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbjIiKTsKKyAgICB7CisgICAgICAgIGxldCByID0KKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiWGNlcHRpb24yIi50b19vd25lZCgpLCAiaWdub3JlZCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uMj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uMiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDIwMDIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHN1Y2NlZWRzIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiaGFoYSIudG9fb3duZWQoKSwgIlJFVFVSTkVEIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycihlKSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihmb3JtYXQhKCJyZWNlaXZlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB7Oj99IiwgZSkuaW50bygpLCksKSwKKyAgICAgICAgICAgIF8gPT4gciwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiUkVUVVJORUQiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgwKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCB4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0T25lV2F5IC0gcmVtb3RlIHNsZWVwcyBmb3IgMSBzZWNvbmQiKTsKKyAgICB7CisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X29uZXdheSgxKT87CisgICAgfQorCisgICAgLy8gZmluYWwgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCB3cml0YWJsZSBhZnRlciB0aGUgb25lLXdheQorICAgIC8vIGNhbGwKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF92b2lkKCkKK30KKworI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KG5lZWRsZXNzX3Bhc3NfYnlfdmFsdWUpKV0KK2ZuIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQ8VDogRGVidWcgKyBQYXJ0aWFsRXEgKyBTaXplZD4oCisgICAgYWN0dWFsOiBSZXN1bHQ8VCwgdGhyaWZ0OjpFcnJvcj4sCisgICAgZXhwZWN0ZWQ6IFQsCispIC0+IFJlc3VsdDwoKSwgdGhyaWZ0OjpFcnJvcj4geworICAgIGluZm8hKCIqKiogRVhQRUNURUQ6IE9rKHs6P30pIiwgZXhwZWN0ZWQpOworICAgIGluZm8hKCIqKiogQUNUVUFMICA6IHs6P30iLCBhY3R1YWwpOworICAgIG1hdGNoIGFjdHVhbCB7CisgICAgICAgIE9rKHYpID0+IHsKKyAgICAgICAgICAgIGlmIHYgPT0gZXhwZWN0ZWQgeworICAgICAgICAgICAgICAgIGluZm8hKCIqKiogT0sgKioqIik7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8hKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKGZvcm1hdCEoImV4cGVjdGVkIHs6P30gYnV0IGdvdCB7Oj99IiwgJmV4cGVjdGVkLCAmdikuaW50bygpKSwpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXJyKGUpID0+IEVycihlKSwKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMWVjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycwpAQCAtMCwwICsxLDM5OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CitleHRlcm4gY3JhdGUgZW52X2xvZ2dlcjsKKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdGVzdDsKKwordXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OnRocmVhZDsKK3VzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OntUTXVsdGlwbGV4ZWRQcm9jZXNzb3IsIFRTZXJ2ZXJ9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2UgdGhyaWZ0X3Rlc3Q6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZW52X2xvZ2dlcjo6aW5pdCgpLmV4cGVjdCgibG9nZ2VyIHNldHVwIGZhaWxlZCIpOworCisgICAgZGVidWchKCJpbml0aWFsaXplZCBsb2dnZXIgLSBydW5uaW5nIGNyb3NzLXRlc3Qgc2VydmVyIik7CisKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBpbmZvISgiY3Jvc3MtdGVzdCBzZXJ2ZXIgc3VjY2VlZGVkIiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBpbmZvISgiY3Jvc3MtdGVzdCBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworCisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLXNzbAorICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0ZXN0IHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgdHJhbnNwb3J0OiAtLXRyYW5zcG9ydCArdGFrZXNfdmFsdWUgInRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgInByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmVyX3R5cGU6IC0tc2VydmVyX3R5cGUgK3Rha2VzX3ZhbHVlICJ0eXBlIG9mIHNlcnZlciBpbnN0YW50aWF0ZWQgKFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIikiKQorICAgICAgICAoQGFyZyB3b3JrZXJzOiAtbiAtLXdvcmtlcnMgK3Rha2VzX3ZhbHVlICJudW1iZXIgb2YgdGhyZWFkLXBvb2wgd29ya2VycyAoXCI0XCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgdHJhbnNwb3J0ID0gbWF0Y2hlcy52YWx1ZV9vZigidHJhbnNwb3J0IikudW53cmFwX29yKCJidWZmZXJlZCIpOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJiaW5hcnkiKTsKKyAgICBsZXQgc2VydmVyX3R5cGUgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2ZXJfdHlwZSIpLnVud3JhcF9vcigidGhyZWFkLXBvb2wiKTsKKyAgICBsZXQgd29ya2VycyA9IHZhbHVlX3QhKG1hdGNoZXMsICJ3b3JrZXJzIiwgdXNpemUpLnVud3JhcF9vcig0KTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIGluZm8hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IChpX3RyYW5zcG9ydF9mYWN0b3J5LCBvX3RyYW5zcG9ydF9mYWN0b3J5KTogKEJveDxUUmVhZFRyYW5zcG9ydEZhY3Rvcnk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g8VFdyaXRlVHJhbnNwb3J0RmFjdG9yeT4pID0KKyAgICAgICAgbWF0Y2ggJip0cmFuc3BvcnQgeworICAgICAgICAgICAgImJ1ZmZlcmVkIiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgImZyYW1lZCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5rbm93biA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBsZXQgKGlfcHJvdG9jb2xfZmFjdG9yeSwgb19wcm90b2NvbF9mYWN0b3J5KTogKEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+KSA9CisgICAgICAgIG1hdGNoICYqcHJvdG9jb2wgeworICAgICAgICAgICAgImJpbmFyeSIgfCAibXVsdGkiIHwgIm11bHRpOmJpbmFyeSIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgImNvbXBhY3QiIHwgIm11bHRpYyIgfCAibXVsdGk6Y29tcGFjdCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIGxldCB0ZXN0X3Byb2Nlc3NvciA9IFRocmlmdFRlc3RTeW5jUHJvY2Vzc29yOjpuZXcoVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbCB7fSk7CisKKyAgICBtYXRjaCAmKnNlcnZlcl90eXBlIHsKKyAgICAgICAgInNpbXBsZSIgfCAidGhyZWFkLXBvb2wiID0+IHsKKyAgICAgICAgICAgIGlmIHByb3RvY29sID09ICJtdWx0aSIgfHwgcHJvdG9jb2wgPT0gIm11bHRpYyIgeworICAgICAgICAgICAgICAgIGxldCBzZWNvbmRfc2VydmljZV9wcm9jZXNzb3IgPSBTZWNvbmRTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGwge30sKTsKKworICAgICAgICAgICAgICAgIGxldCBtdXQgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKCJUaHJpZnRUZXN0IiwgQm94OjpuZXcodGVzdF9wcm9jZXNzb3IpLCB0cnVlKT87CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcigiU2Vjb25kU2VydmljZSIsIEJveDo6bmV3KHNlY29uZF9zZXJ2aWNlX3Byb2Nlc3NvciksIGZhbHNlKT87CisKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgaV90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgd29ya2VycywKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBpX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMsCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVua25vd24gPT4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHNlcnZlciB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKSwKKyAgICB9Cit9CisKK3N0cnVjdCBUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsOworaW1wbCBUaHJpZnRUZXN0U3luY0hhbmRsZXIgZm9yIFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGwgeworICAgIGZuIGhhbmRsZV90ZXN0X3ZvaWQoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cmluZygmc2VsZiwgdGhpbmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RyaW5nKHt9KSIsICZ0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2Jvb2woJnNlbGYsIHRoaW5nOiBib29sKSAtPiB0aHJpZnQ6OlJlc3VsdDxib29sPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Qm9vbCh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2J5dGUoJnNlbGYsIHRoaW5nOiBpOCkgLT4gdGhyaWZ0OjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCeXRlKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfaTMyKCZzZWxmLCB0aGluZzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgaW5mbyEoInRlc3RpMzIoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9pNjQoJnNlbGYsIHRoaW5nOiBpNjQpIC0+IHRocmlmdDo6UmVzdWx0PGk2ND4geworICAgICAgICBpbmZvISgidGVzdGk2NCh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2RvdWJsZSgmc2VsZiwgdGhpbmc6IE9yZGVyZWRGbG9hdDxmNjQ+KSAtPiB0aHJpZnQ6OlJlc3VsdDxPcmRlcmVkRmxvYXQ8ZjY0Pj4geworICAgICAgICBpbmZvISgidGVzdERvdWJsZSh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2JpbmFyeSgmc2VsZiwgdGhpbmc6IFZlYzx1OD4pIC0+IHRocmlmdDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCaW5hcnkoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cnVjdCgmc2VsZiwgdGhpbmc6IFh0cnVjdCkgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RydWN0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9uZXN0KCZzZWxmLCB0aGluZzogWHRydWN0MikgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0Mj4geworICAgICAgICBpbmZvISgidGVzdE5lc3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X21hcCgmc2VsZiwgdGhpbmc6IEJUcmVlTWFwPGkzMiwgaTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8aTMyLCBpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TWFwKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zdHJpbmdfbWFwKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgdGhpbmc6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPj4geworICAgICAgICBpbmZvISgidGVzdFN0cmluZ01hcCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc2V0KCZzZWxmLCB0aGluZzogQlRyZWVTZXQ8aTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVTZXQ8aTMyPj4geworICAgICAgICBpbmZvISgidGVzdFNldCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbGlzdCgmc2VsZiwgdGhpbmc6IFZlYzxpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxWZWM8aTMyPj4geworICAgICAgICBpbmZvISgidGVzdExpc3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2VudW0oJnNlbGYsIHRoaW5nOiBOdW1iZXJ6KSAtPiB0aHJpZnQ6OlJlc3VsdDxOdW1iZXJ6PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RW51bSh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfdHlwZWRlZigmc2VsZiwgdGhpbmc6IFVzZXJJZCkgLT4gdGhyaWZ0OjpSZXN1bHQ8VXNlcklkPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0VHlwZWRlZih7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIC8vLyBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgIC8vLyB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIgPT4KKyAgICAvLy8gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKyAgICBmbiBoYW5kbGVfdGVzdF9tYXBfbWFwKCZzZWxmLCBoZWxsbzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RNYXBNYXAoe30pIiwgaGVsbG8pOworCisgICAgICAgIGxldCBtdXQgaW5uZXJfbWFwXzA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gLTQuLigwIGFzIGkzMikgeworICAgICAgICAgICAgaW5uZXJfbWFwXzAuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBpbm5lcl9tYXBfMTogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAxLi41IHsKKyAgICAgICAgICAgIGlubmVyX21hcF8xLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgcmV0X21hcDogQlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICByZXRfbWFwLmluc2VydCgtNCwgaW5uZXJfbWFwXzApOworICAgICAgICByZXRfbWFwLmluc2VydCg0LCBpbm5lcl9tYXBfMSk7CisKKyAgICAgICAgT2socmV0X21hcCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAgLy8vICAgICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgIC8vLyAgICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAvLy8gICAgICAgICAgICB9LAorICAgIC8vLyAgICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAvLy8gICAgIH0KKyAgICAvLy8gcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICBmbiBoYW5kbGVfdGVzdF9pbnNhbml0eSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGFyZ3VtZW50OiBJbnNhbml0eSwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+Pj4geworICAgICAgICBpbmZvISgidGVzdEluc2FuaXR5KHs6P30pIiwgYXJndW1lbnQpOworICAgICAgICBsZXQgbXV0IG1hcF8wOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1hcF8wLmluc2VydChOdW1iZXJ6OjpUd28sIGFyZ3VtZW50LmNsb25lKCkpOworICAgICAgICBtYXBfMC5pbnNlcnQoTnVtYmVyejo6VGhyZWUsIGFyZ3VtZW50LmNsb25lKCkpOworCisgICAgICAgIGxldCBtdXQgbWFwXzE6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGluc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IE5vbmUsCisgICAgICAgICAgICB4dHJ1Y3RzOiBOb25lLAorICAgICAgICB9OworICAgICAgICBtYXBfMS5pbnNlcnQoTnVtYmVyejo6U2l4LCBpbnNhbml0eSk7CisKKyAgICAgICAgbGV0IG11dCByZXQ6IEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgcmV0Lmluc2VydCgxLCBtYXBfMCk7CisgICAgICAgIHJldC5pbnNlcnQoMiwgbWFwXzEpOworCisgICAgICAgIE9rKHJldCkKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyBhbiBYdHJ1Y3Qgd2l0aDoKKyAgICAvLy8gc3RyaW5nX3RoaW5nID0gIkhlbGxvMiIsIGJ5dGVfdGhpbmcgPSBhcmcwLCBpMzJfdGhpbmcgPSBhcmcxIGFuZAorICAgIC8vLyBpNjRfdGhpbmcgPSBhcmcyCisgICAgZm4gaGFuZGxlX3Rlc3RfbXVsdGkoCisgICAgICAgICZzZWxmLAorICAgICAgICBhcmcwOiBpOCwKKyAgICAgICAgYXJnMTogaTMyLAorICAgICAgICBhcmcyOiBpNjQsCisgICAgICAgIF86IEJUcmVlTWFwPGkxNiwgU3RyaW5nPiwKKyAgICAgICAgXzogTnVtYmVyeiwKKyAgICAgICAgXzogVXNlcklkLAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIGxldCB4X3JldCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIkhlbGxvMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKGFyZzApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKGFyZzEpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKGFyZzIpLAorICAgICAgICB9OworCisgICAgICAgIE9rKHhfcmV0KQorICAgIH0KKworICAgIC8vLyBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPQorICAgIC8vLyBhcmcKKyAgICAvLy8gZWxzZSBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAvLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICBmbiBoYW5kbGVfdGVzdF9leGNlcHRpb24oJnNlbGYsIGFyZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBpbmZvISgidGVzdEV4Y2VwdGlvbih7fSkiLCBhcmcpOworCisgICAgICAgIG1hdGNoICYqYXJnIHsKKyAgICAgICAgICAgICJYY2VwdGlvbiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogU29tZShhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuaW50bygpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICJURXhjZXB0aW9uIiA9PiBFcnIoInRoaXMgaXMgYSByYW5kb20gZXJyb3IiLmludG8oKSksCisgICAgICAgICAgICBfID0+IE9rKCgpKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBpZiBhcmcwID09ICJYY2VwdGlvbiI6CisgICAgLy8vIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuCisgICAgLy8vIFhjZXB0aW9uIgorICAgIC8vLyBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiI6CisgICAgLy8vIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIHN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPQorICAgIC8vLyAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgLy8gZWxzZToKKyAgICAvLyAgIGRvIG5vdCB0aHJvdyBhbnl0aGluZyBhbmQgcmV0dXJuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICBmbiBoYW5kbGVfdGVzdF9tdWx0aV9leGNlcHRpb24oJnNlbGYsIGFyZzA6IFN0cmluZywgYXJnMTogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgbWF0Y2ggJiphcmcwIHsKKyAgICAgICAgICAgICJYY2VwdGlvbiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIlhjZXB0aW9uMiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uMiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMjAwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgT2soCisgICAgICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoYXJnMSksCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X29uZXdheSgmc2VsZiwgc2Vjb25kc190b19zbGVlcDogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICB0aHJlYWQ6OnNsZWVwKER1cmF0aW9uOjpmcm9tX3NlY3Moc2Vjb25kc190b19zbGVlcCBhcyB1NjQpKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitzdHJ1Y3QgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbDsKK2ltcGwgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVyIGZvciBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsIHsKKyAgICBmbiBoYW5kbGVfc2Vjb25kdGVzdF9zdHJpbmcoJnNlbGYsIHRoaW5nOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBpbmZvISgiKHNlY29uZCl0ZXN0U3RyaW5nKHt9KSIsICZ0aGluZyk7CisgICAgICAgIGxldCByZXQgPSBmb3JtYXQhKCJ0ZXN0U3RyaW5nKFwie31cIikiLCAmdGhpbmcpOworICAgICAgICBPayhyZXQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvbGliLnJzIGIvdGVzdC9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWJmOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK21vZCB0aHJpZnRfdGVzdDsKK3B1YiB1c2UgdGhyaWZ0X3Rlc3Q6Oio7CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QucHkgYi90ZXN0L3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU5MjU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdC5weQpAQCAtMCwwICsxLDE5MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIChjcm9zcykgdGVzdCBzdWl0ZQorIworIyB0ZXN0cyBkaWZmZXJlbnQgc2VydmVyLWNsaWVudCwgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBjb21iaW5hdGlvbnMKKyMKKyMgVGhpcyBzY3JpcHQgcmVxdWlyZXMgcHl0aG9uIDMueCBkdWUgdG8gdGhlIGltcHJvdmVtZW50cyBpbgorIyBzdWJwcm9jZXNzIG1hbmFnZW1lbnQgdGhhdCBhcmUgbmVlZGVkIGZvciByZWxpYWJpbGl0eS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCitpbXBvcnQganNvbgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2ltcG9ydCBjcm9zc3J1bm5lcgorZnJvbSBjcm9zc3J1bm5lci5jb21wYXQgaW1wb3J0IHBhdGhfam9pbgorCisjIDMuMyBpbnRyb2R1Y2VkIHN1YnByb2Nlc3MgdGltZW91dHMgb24gd2FpdGluZyBmb3IgY2hpbGQKK3JlcV92ZXJzaW9uID0gKDMsIDMpCitjdXJfdmVyc2lvbiA9IHN5cy52ZXJzaW9uX2luZm8KK2Fzc2VydCAoY3VyX3ZlcnNpb24gPj0gcmVxX3ZlcnNpb24pLCAiUHl0aG9uIDMuMyBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4iCisKKworUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSkKK1RFU1RfRElSX1JFTEFUSVZFID0gJ3Rlc3QnCitURVNUX0RJUiA9IHBhdGhfam9pbihST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUpCitGRUFUVVJFX0RJUl9SRUxBVElWRSA9IHBhdGhfam9pbihURVNUX0RJUl9SRUxBVElWRSwgJ2ZlYXR1cmVzJykKK0NPTkZJR19GSUxFID0gJ3Rlc3RzLmpzb24nCisKKworZGVmIHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcywgb25seV9rbm93bl9mYWlsdXJlcywgcmV0cnlfY291bnQsIHJlZ2V4KToKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW5nIHRlc3RzJykKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKFRFU1RfRElSLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGogPSBqc29uLmxvYWQoZnApCisgICAgdGVzdHMgPSBjcm9zc3J1bm5lci5jb2xsZWN0X2Nyb3NzX3Rlc3RzKGosIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCByZWdleCkKKyAgICBpZiBub3QgdGVzdHM6CisgICAgICAgIHByaW50KCdObyB0ZXN0IGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIHNlcnZlcnM6ICVzJyAlIHNlcnZlcl9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBjbGllbnRzOiAlcycgJSBjbGllbnRfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoVEVTVF9ESVIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIGluIGtub3duLCB0ZXN0cykpCisgICAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgbm90IGluIGtub3duLCB0ZXN0cykpCisKKyAgICBkaXNwYXRjaGVyID0gY3Jvc3NydW5uZXIuVGVzdERpc3BhdGNoZXIoVEVTVF9ESVIsIFJPT1RfRElSLCBURVNUX0RJUl9SRUxBVElWRSwgam9icykKKyAgICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyAlZCB0ZXN0cycgJSBsZW4odGVzdHMpKQorICAgIHRyeToKKyAgICAgICAgZm9yIHIgaW4gW2Rpc3BhdGNoZXIuZGlzcGF0Y2godGVzdCwgcmV0cnlfY291bnQpIGZvciB0ZXN0IGluIHRlc3RzXToKKyAgICAgICAgICAgIHIud2FpdCgpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBmb3IgY29tcGxldGlvbicpCisgICAgICAgIHJldHVybiBkaXNwYXRjaGVyLndhaXQoKQorICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICBsb2dnZXIuZGVidWcoJ0ludGVycnVwdGVkLCBzaHV0dGluZyBkb3duJykKKyAgICAgICAgZGlzcGF0Y2hlci50ZXJtaW5hdGUoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGJhc2VkaXIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFKQorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKGJhc2VkaXIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgajIgPSBqc29uLmxvYWQoZnApCisgICAgdGVzdHMgPSBjcm9zc3J1bm5lci5jb2xsZWN0X2ZlYXR1cmVfdGVzdHMoaiwgajIsIHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgcmVnZXgpCisgICAgaWYgbm90IHRlc3RzOgorICAgICAgICBwcmludCgnTm8gdGVzdCBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBzZXJ2ZXJzOiAlcycgJSBzZXJ2ZXJfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgZmVhdHVyZXM6ICVzJyAlIGZlYXR1cmVfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoYmFzZWRpcikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIG5vdCBpbiBrbm93biwgdGVzdHMpKQorCisgICAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBST09UX0RJUiwgRkVBVFVSRV9ESVJfUkVMQVRJVkUsIGpvYnMpCisgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgJWQgdGVzdHMnICUgbGVuKHRlc3RzKSkKKyAgICB0cnk6CisgICAgICAgIGZvciByIGluIFtkaXNwYXRjaGVyLmRpc3BhdGNoKHRlc3QsIHJldHJ5X2NvdW50KSBmb3IgdGVzdCBpbiB0ZXN0c106CisgICAgICAgICAgICByLndhaXQoKQorICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlci53YWl0KCkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbnRlcnJ1cHRlZCwgc2h1dHRpbmcgZG93bicpCisgICAgICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIGRlZmF1bHRfY29uY3VycmVudHkoKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBpbnQob3MuZW52aXJvbi5nZXQoJ1RIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1knKSkKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICMgU2luY2UgbXVjaCB0aW1lIGlzIHNwZW50IHNsZWVwaW5nLCB1c2UgbWFueSB0aHJlYWRzCisgICAgICAgIHJldHVybiBpbnQobXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpICogMS4yNSkgKyAxCisKKworZGVmIG1haW4oYXJndik6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2VydmVyJywgZGVmYXVsdD0nJywgbmFyZ3M9JyonLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbGlzdCBvZiBzZXJ2ZXJzIHRvIHRlc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tY2xpZW50JywgZGVmYXVsdD0nJywgbmFyZ3M9JyonLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbGlzdCBvZiBjbGllbnRzIHRvIHRlc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1GJywgJy0tZmVhdHVyZXMnLCBuYXJncz0nKicsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biBzZXJ2ZXIgZmVhdHVyZSB0ZXN0cyBpbnN0ZWFkIG9mIGNyb3NzIGxhbmd1YWdlIHRlc3RzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctUicsICctLXJlZ2V4JywgaGVscD0ndGVzdCBuYW1lIHBhdHRlcm4gdG8gcnVuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctbycsICctLW9ubHkta25vd25fZmFpbHVyZXMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdvbmx5X2tub3duX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J29ubHkgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcycsICctLXNraXAta25vd24tZmFpbHVyZXMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdza2lwX2tub3duX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RvIG5vdCBleGVjdXRlIHRlc3RzIHRoYXQgYXJlIGtub3duIHRvIGZhaWwnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmV0cnktY291bnQnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCwgaGVscD0nbWF4aW11bSByZXRyeSBvbiBmYWlsdXJlJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctaicsICctLWpvYnMnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdF9jb25jdXJyZW50eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbnVtYmVyIG9mIGNvbmN1cnJlbnQgdGVzdCBleGVjdXRpb25zJykKKworICAgIGcgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKHRpdGxlPSdBZHZhbmNlZCcpCisgICAgZy5hZGRfYXJndW1lbnQoJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0nc3RvcmVfY29uc3QnLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J2xvZ19sZXZlbCcsIGNvbnN0PWxvZ2dpbmcuREVCVUcsIGRlZmF1bHQ9bG9nZ2luZy5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgZGVidWcgb3V0cHV0IGZvciB0ZXN0IHJ1bm5lcicpCisgICAgZy5hZGRfYXJndW1lbnQoJy1QJywgJy0tcHJpbnQtZXhwZWN0ZWQtZmFpbHVyZXMnLCBjaG9pY2VzPVsnbWVyZ2UnLCAnb3ZlcndyaXRlJ10sCisgICAgICAgICAgICAgICAgICAgZGVzdD0ncHJpbnRfZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgIGhlbHA9ImdlbmVyYXRlIGV4cGVjdGVkIGZhaWx1cmVzIGJhc2VkIG9uIGxhc3QgcmVzdWx0IGFuZCBwcmludCB0byBzdGRvdXQiKQorICAgIGcuYWRkX2FyZ3VtZW50KCctVScsICctLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcycsIGNob2ljZXM9WydtZXJnZScsICdvdmVyd3JpdGUnXSwKKyAgICAgICAgICAgICAgICAgICBkZXN0PSd1cGRhdGVfZmFpbHVyZXMnLAorICAgICAgICAgICAgICAgICAgIGhlbHA9ImdlbmVyYXRlIGV4cGVjdGVkIGZhaWx1cmVzIGJhc2VkIG9uIGxhc3QgcmVzdWx0IGFuZCBzYXZlIHRvIGRlZmF1bHQgZmlsZSBsb2NhdGlvbiIpCisgICAgb3B0aW9ucyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCisKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcubG9nX3RvX3N0ZGVycigpCisgICAgbG9nZ2VyLnNldExldmVsKG9wdGlvbnMubG9nX2xldmVsKQorCisgICAgaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZSBhbmQgb3B0aW9ucy5jbGllbnQ6CisgICAgICAgIHByaW50KCdDYW5ub3Qgc3BlY2lmeSBib3RoIC0tZmVhdHVyZXMgYW5kIC0tY2xpZW50ICcsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIDEKKworICAgICMgQWxsb3cgbXVsdGlwbGUgYXJncyBzZXBhcmF0ZWQgd2l0aCAnLCcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICBzZXJ2ZXJfbWF0Y2ggPSBsaXN0KGNoYWluKCpbeC5zcGxpdCgnLCcpIGZvciB4IGluIG9wdGlvbnMuc2VydmVyXSkpCisgICAgY2xpZW50X21hdGNoID0gbGlzdChjaGFpbigqW3guc3BsaXQoJywnKSBmb3IgeCBpbiBvcHRpb25zLmNsaWVudF0pKQorCisgICAgaWYgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgb3Igb3B0aW9ucy5wcmludF9mYWlsdXJlczoKKyAgICAgICAgZGlyZSA9IHBhdGhfam9pbihST09UX0RJUiwgRkVBVFVSRV9ESVJfUkVMQVRJVkUpIGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmUgZWxzZSBURVNUX0RJUgorICAgICAgICByZXMgPSBjcm9zc3J1bm5lci5nZW5lcmF0ZV9rbm93bl9mYWlsdXJlcygKKyAgICAgICAgICAgIGRpcmUsIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzID09ICdvdmVyd3JpdGUnLAorICAgICAgICAgICAgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMsIG9wdGlvbnMucHJpbnRfZmFpbHVyZXMpCisgICAgZWxpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lOgorICAgICAgICBmZWF0dXJlcyA9IG9wdGlvbnMuZmVhdHVyZXMgb3IgWycuKiddCisgICAgICAgIHJlcyA9IHJ1bl9mZWF0dXJlX3Rlc3RzKHNlcnZlcl9tYXRjaCwgZmVhdHVyZXMsIG9wdGlvbnMuam9icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLm9ubHlfa25vd25fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmV0cnlfY291bnQsIG9wdGlvbnMucmVnZXgpCisgICAgZWxzZToKKyAgICAgICAgcmVzID0gcnVuX2Nyb3NzX3Rlc3RzKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCBvcHRpb25zLmpvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMsIG9wdGlvbnMub25seV9rbm93bl9mYWlsdXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmV0cnlfY291bnQsIG9wdGlvbnMucmVnZXgpCisgICAgcmV0dXJuIDAgaWYgcmVzIGVsc2UgMQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0cy5qc29uIGIvdGVzdC90ZXN0cy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDZkZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3RzLmpzb24KQEAgLTAsMCArMSw3NDkgQEAKK1sKKyAgeworICAgICJuYW1lIjogImNfZ2xpYiIsCisgICAgInBsYXRmb3JtcyI6IFsKKyAgICAgICJMaW51eCIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwLXNzbCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiY19nbGliIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY2wiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsiVGVzdFNlcnZlciJdLAorICAgICAgIndvcmtkaXIiOiAiY2wiLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5IiwgIm11bHRpIl0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiLCAiZnJhbWVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0Q2xpZW50Il0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfQorICB9LAorICB7CisgICAgIm5hbWUiOiAiZCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGhyaWZ0X3Rlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tdHJhY2UiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0aHJpZnRfdGVzdF9jbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJodHRwIiwKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2QvdGVzdCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImdvIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0c2VydmVyIiwKKyAgICAgICAgIi0tY2VydFBhdGg9Li4vLi4va2V5cyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiZ28vYmluIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiamF2YSIsCisgICAgImpvaW5fYXJncyI6IGZhbHNlLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZGVsYXkiOiAxNSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuc2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAianNvbjptdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMywKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuY2xpZW50IgorICAgICAgXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpajpqc29uIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiZnJhbWVkOmZhc3RmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9qYXZhIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9kZWpzIiwKKyAgICAiZW52IjogeworICAgICAgIk5PREVfUEFUSCI6ICIuLi9saWIiCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJub2RlIiwKKyAgICAgICAgInNlcnZlci5qcyIsCisgICAgICAgICItLXR5cGU9dGNwIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibm9kZSIsCisgICAgICAgICJjbGllbnQuanMiLAorICAgICAgICAiLS10eXBlPXRjcCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9ub2RlanMvdGVzdCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImhzIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImhlYWRlciIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiaHMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJweSIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJleHRyYV9hcmdzIjogWyJUU2ltcGxlU2VydmVyIl0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpOm11bHRpYSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGljOm11bHRpYWMiLAorICAgICAgICAibXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0OmFjY2VsYyIsCisgICAgICAiaGVhZGVyIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicHkiCisgIH0sCisgIHsKKyAgICAiY29tbWVudCI6ICJVc2luZyAncHl0aG9uMycgZXhlY3V0YWJsZSB0byB0ZXN0IHB5MiBhbmQgMyBhdCBvbmNlIiwKKyAgICAibmFtZSI6ICJweTMiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJweXRob24zIiwKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLWhvc3Q9bG9jYWxob3N0IiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpYzptdWx0aWFjIiwKKyAgICAgICAgIm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInB5IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY3BwIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAiaGVhZGVyOm11bHRpaCIsCisgICAgICAgICJqc29uOm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDgsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIsCisgICAgICAgICJtdWx0aWg6aGVhZGVyIiwKKyAgICAgICAgIm11bHRpajpqc29uIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImh0dHAiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJoZWFkZXIiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaCIsCisgICAgICAibXVsdGlqIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiY3BwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicmIiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1YnkiLAorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDUsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1YnkiLAorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiIsCisgICAgICAgICItLSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJkb21haW4iLAorICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicmIvZ2VuLXJiIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY3NoYXJwIiwKKyAgICAiZW52IjogeworICAgICAgIk1PTk9fUEFUSCI6ICIuLi8uLi9saWIvY3NoYXJwLyIKKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJtb25vIiwKKyAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKKyAgICAgICAgInNlcnZlciIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDksCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAorICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAorICAgICAgICAiY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiY3NoYXJwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibmV0Y29yZSIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRvdG5ldCIsCisgICAgICAgICJydW4iLAorICAgICAgICAiLS1uby1idWlsZCIsCisgICAgICAgICItLXByb2plY3Q9U2VydmVyL1NlcnZlci5jc3Byb2oiLAorICAgICAgICAic2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRvdG5ldCIsCisgICAgICAgICJydW4iLAorICAgICAgICAiLS1uby1idWlsZCIsCisgICAgICAgICItLXByb2plY3Q9Q2xpZW50L0NsaWVudC5jc3Byb2oiLAorICAgICAgICAiY2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgICAgICJ3b3JrZGlyIjogIm5ldGNvcmUiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJwZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCisgICAgICAiZG9tYWluIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgIm11bHRpIgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGVybCIsCisgICAgICAgICItSWdlbi1wZXJsLyIsCisgICAgICAgICItSS4uLy4uL2xpYi9wZXJsL2xpYi8iLAorICAgICAgICAiVGVzdENsaWVudC5wbCIsCisgICAgICAgICItLWNhPS4uL2tleXMvQ0EucGVtIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL2NsaWVudC5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9jbGllbnQua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwZXJsIiwKKyAgICAgICAgIi1JZ2VuLXBlcmwvIiwKKyAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCisgICAgICAgICJUZXN0U2VydmVyLnBsIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL3NlcnZlci5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9zZXJ2ZXIua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJwZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicGhwIiwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAiYmluYXJ5OmFjY2VsIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGhwIiwKKyAgICAgICAgIi1kZXh0ZW5zaW9uX2Rpcj1waHBfZXh0X2RpciIsCisgICAgICAgICItLXBocC1pbmk9dGVzdF9waHAuaW5pIiwKKyAgICAgICAgIi0tbm8tcGhwLWluaSIsCisgICAgICAgICItZGRpc3BsYXlfZXJyb3JzPXN0ZGVyciIsCisgICAgICAgICItZGxvZ19lcnJvcnM9MCIsCisgICAgICAgICItZGVycm9yX3JlcG9ydGluZz1FX0FMTCIsCisgICAgICAgICJUZXN0Q2xpZW50LnBocCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogInBocCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImRhcnQiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIsCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImpzb24iCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkYXJ0IiwKKyAgICAgICAgInRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJkYXJ0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X2NsaWVudCIsCisgICAgICAgICItcyIsCisgICAgICAgICJpbml0IiwKKyAgICAgICAgInN0b3AiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X3RocmlmdF9zZXJ2ZXIiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAianMiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBoYW50b21qcyIsCisgICAgICAgICJ0ZXN0L3BoYW50b20tY2xpZW50LmpzIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2pzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibHVhIiwKKyAgICAiVE9ETyI6ICJBZGQgZGxsIHRvIExVQV9DUEFUSCIsCisgICAgImVudiI6IHsKKyAgICAgICJMVUFfUEFUSCI6ICI7O2dlbi1sdWEvPy5sdWE7Li4vLi4vbGliL2x1YS8/Lmx1YSIsCisgICAgICAiTFVBX0NQQVRIIjogIjs7Li4vLi4vbGliL2x1YS8ubGlicy8/LnNvIgorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIiwKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAianNvbiIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImx1YSIsCisgICAgICAgICJ0ZXN0X2Jhc2ljX2NsaWVudC5sdWEiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJsdWEiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJycyIsCisgICAgImVudiI6IHsKKyAgICAgICJSVVNUX0JBQ0tUUkFDRSI6ICIxIiwKKyAgICAgICJSVVNUX0xPRyI6ICJpbmZvIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdCisgICAgfSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInJzL2JpbiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vZGV0cyIsCisgICAgImVudiI6IHsKKyAgICAgICJOT0RFX1BBVEgiOiAiLi4vbGliIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuU2VydmVyLnNoIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuQ2xpZW50LnNoIgorICAgICAgXQorICAgIH0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGV0cy90ZXN0IgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHMvTWFrZWZpbGUgYi90ZXN0L3RocmVhZHMvTWFrZWZpbGUKaW5kZXggMTRmMWE1OC4uZGY3MjM5NiAxMDA2NDQKLS0tIGEvdGVzdC90aHJlYWRzL01ha2VmaWxlCisrKyBiL3Rlc3QvdGhyZWFkcy9NYWtlZmlsZQpAQCAtNTQsMTAgKzU0LDEwIEBACiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAtLWdlbiBweSBUaHJlYWRzVGVzdC50aHJpZnQKIAogc2VydmVyOiBzdHVicwotCWcrKyAtbyBUaHJlYWRzU2VydmVyICQoQ0ZMKSBUaHJlYWRzU2VydmVyLmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3QuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdF90eXBlcy5jcHAKKwkkKENDKSAtbyBUaHJlYWRzU2VydmVyICQoQ0ZMKSBUaHJlYWRzU2VydmVyLmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3QuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdF90eXBlcy5jcHAKIAogY2xpZW50OiBzdHVicwotCWcrKyAtbyBUaHJlYWRzQ2xpZW50ICQoQ0ZMKSBUaHJlYWRzQ2xpZW50LmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3QuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdF90eXBlcy5jcHAKKwkkKENDKSAtbyBUaHJlYWRzQ2xpZW50ICQoQ0ZMKSBUaHJlYWRzQ2xpZW50LmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3QuY3BwIC4vZ2VuLWNwcC9UaHJlYWRzVGVzdF90eXBlcy5jcHAKIAogY2xlYW46CiAJJChSTSkgLXIgKi5vIFRocmVhZHNTZXJ2ZXIgVGhyZWFkc0NsaWVudCBnZW4tY3BwIGdlbi1weQpkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwIGIvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwCmluZGV4IDg1Mjc0YTYuLjkzMDZhM2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcAorKysgYi90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAKQEAgLTIxLDEzICsyMSwxNiBAQAogLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuCiAKICNpbmNsdWRlICJUaHJlYWRzVGVzdC5oIgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpZiBfV0lOMzIKKyAgICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwpAQCAtMzcsNiArNDAsOSBAQAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIGludCBwb3J0ID0gOTA5MDsKICAgc3RkOjpzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwogCmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAgYi90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAKaW5kZXggODczNGVlOC4uYTI2N2MzYiAxMDA2NDQKLS0tIGEvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwCisrKyBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcApAQCAtMjEsMTQgKzIxLDE3IEBACiAvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4KIAogI2luY2x1ZGUgIlRocmVhZHNUZXN0LmgiCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2lmIF9XSU4zMgorICAgI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKIAogdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CkBAIC04NSwxMSArODgsMTIgQEAKIHByb3RlY3RlZDoKICAgdm9pZCBnbzJzbGVlcChpbnQgdGhyZWFkLCBpbnQgc2Vjb25kcykgewogICAgIE1vbml0b3IgbTsKKyAgICBTeW5jaHJvbml6ZWQgcyhtKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7ICsraSkgewogICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJWQ6IHNsZWVwICVkXG4iLCB0aHJlYWQsIGkpOwogICAgICAgdHJ5IHsKICAgICAgICAgbS53YWl0KDEwMDApOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgeworICAgICAgfSBjYXRjaChjb25zdCBUaW1lZE91dEV4Y2VwdGlvbiYpIHsKICAgICAgIH0KICAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsICJUSFJFQUQgJWQgRE9ORVxuIiwgdGhyZWFkKTsKQEAgLTEwMSw2ICsxMDUsOSBAQAogfTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIGludCBwb3J0ID0gOTA5MDsKICAgc2hhcmVkX3B0cjxUaHJlYWRzVGVzdEhhbmRsZXI+IGhhbmRsZXIobmV3IFRocmVhZHNUZXN0SGFuZGxlcigpKTsKICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFRocmVhZHNUZXN0UHJvY2Vzc29yKGhhbmRsZXIpKTsKQEAgLTExMSw4ICsxMTgsOCBAQAogICAvKgogICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQogICAgIFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoMTApOwotICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9Ci0gICAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7CisgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0KKyAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC92YWxncmluZC5zdXBwcmVzcyBiL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxN2NiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MKQEAgLTAsMCArMSw1MyBAQAoreworICAgYm9vc3QvZ2V0X29uY2VfcGVyX3RocmVhZF9lcG9jaC9pZ25vcmUKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIG1hdGNoLWxlYWsta2luZHM6IHJlYWNoYWJsZQorICAgZnVuOm1hbGxvYworICAgZnVuOl9aTjVib29zdDZkZXRhaWwyNWdldF9vbmNlX3Blcl90aHJlYWRfZXBvY2hFdgorfQoreworICAgYm9vc3R0aHJlYWRzL29uY2UvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46X1pONWJvb3N0MTN0aHJlYWRfZGV0YWlsMTdlbnRlcl9vbmNlX3JlZ2lvbkVSTlNfOW9uY2VfZmxhZ0UKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjNnZXRfY3VycmVudF90aHJlYWRfZGF0YUV2CisgICBmdW46X1pONWJvb3N0NmRldGFpbDIwaW50ZXJydXB0aW9uX2NoZWNrZXJDMUVQMTVwdGhyZWFkX211dGV4X3RQMTRwdGhyZWFkX2NvbmRfdAorICAgZnVuOl9aTjVib29zdDIyY29uZGl0aW9uX3ZhcmlhYmxlX2FueTR3YWl0SU5TXzExdW5pcXVlX2xvY2tJTlNfMTF0aW1lZF9tdXRleEVFRUVFdlJUXworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGwxMXdhaXRGb3JldmVyRXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsMTl3YWl0Rm9yVGltZVJlbGF0aXZlRWwKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsNHdhaXRFbAorICAgZnVuOl9aTks2YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjR3YWl0RWwKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxMUJvb3N0VGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9Cit7CisgICBwdGhyZWFkL2NyZWF0aW9uLXRscy9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjptZW1wY3B5CisgICBmdW46X2RsX2FsbG9jYXRlX3Rsc19pbml0CisgICBmdW46Z2V0X2NhY2hlZF9zdGFjaworICAgZnVuOmFsbG9jYXRlX3N0YWNrCisgICBmdW46cHRocmVhZF9jcmVhdGVAQEdMSUJDXzIuMioKKyAgIG9iajovdXNyL2xpYi92YWxncmluZC92Z3ByZWxvYWRfaGVsZ3JpbmQtYW1kNjQtbGludXguc28KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxM1B0aHJlYWRUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KK3sKKyAgIGJvb3N0LXRocmVhZC9jcmVhdGlvbi10bHMvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46bWVtcGNweQorICAgZnVuOl9kbF9hbGxvY2F0ZV90bHNfaW5pdAorICAgZnVuOmdldF9jYWNoZWRfc3RhY2sKKyAgIGZ1bjphbGxvY2F0ZV9zdGFjaworICAgZnVuOnB0aHJlYWRfY3JlYXRlQEBHTElCQ18yLjIuNQorICAgb2JqOi91c3IvbGliL3ZhbGdyaW5kL3ZncHJlbG9hZF9oZWxncmluZC1hbWQ2NC1saW51eC5zbworICAgZnVuOl9aTjVib29zdDZ0aHJlYWQyMXN0YXJ0X3RocmVhZF9ub2V4Y2VwdEV2CisgICBmdW46X1pONWJvb3N0NnRocmVhZDEyc3RhcnRfdGhyZWFkRXYKKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkQzFJU3Q1X0JpbmRJRlBGUHZTM19FUzNfRUVFRU9UXworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTExQm9vc3RUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KKworCmRpZmYgLS1naXQgYS90dXRvcmlhbC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTk0NjAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPQorCitpZiBNSU5HVworIyBkbyBub3RoaW5nLCBqdXN0IGJ1aWxkIHRoZSBjb21waWxlcgorZWxzZQorCitpZiBXSVRIX0NfR0xJQgorU1VCRElSUyArPSBjX2dsaWIKK2VuZGlmCisKK2lmIFdJVEhfQ1BQCitTVUJESVJTICs9IGNwcAorZW5kaWYKKworaWYgV0lUSF9ECitTVUJESVJTICs9IGQKK2VuZGlmCisKK2lmIFdJVEhfSkFWQQorU1VCRElSUyArPSBqYXZhCitTVUJESVJTICs9IGpzCitlbmRpZgorCitpZiBXSVRIX1BZVEhPTgorU1VCRElSUyArPSBweQorU1VCRElSUyArPSBweS50d2lzdGVkCitTVUJESVJTICs9IHB5LnRvcm5hZG8KK2VuZGlmCisKK2lmIFdJVEhfUlVCWQorU1VCRElSUyArPSByYgorZW5kaWYKKworaWYgV0lUSF9IQVNLRUxMCitTVUJESVJTICs9IGhzCitlbmRpZgorCitpZiBXSVRIX0hBWEUKK1NVQkRJUlMgKz0gaGF4ZQorZW5kaWYKKworaWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKK2lmIFdJVEhfR08KK1NVQkRJUlMgKz0gZ28KK2VuZGlmCisKK2lmIFdJVEhfTk9ERUpTCitTVUJESVJTICs9IG5vZGVqcworZW5kaWYKKworaWYgV0lUSF9EQVJUCitTVUJESVJTICs9IGRhcnQKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK2VuZGlmCisKKyMKKyMgZ2VuZXJhdGUgaHRtbCBmb3IgVGhyaWZ0VGVzdC50aHJpZnQKKyMKK2FsbC1sb2NhbDoKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBodG1sIC1yICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCXJtIC1yZiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL2dlbi1odG1sCisKK2VuZGlmCisKKyMgQW55IGZvbGRlcnMgb3IgZmlsZXMgbm90IGxpc3RlZCBhYm92ZSBiZWluZyBhZGRlZCB0byBTVUJESVIgbmVlZCB0byBiZSBwbGFjZWQgaGVyZSBpbgorIyBFWFRSQV9ESVNUIHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZWxlYXNlCitFWFRSQV9ESVNUID0gXAorCWFzMyBcCisJY3NoYXJwIFwKKwlkIFwKKwlkZWxwaGkgXAorCWVybCBcCisJaHMgXAorCW9jYW1sIFwKKwlwZXJsIFwKKwlwaHAgXAorCXNoYXJlZC50aHJpZnQgXAorCXR1dG9yaWFsLnRocmlmdCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS90dXRvcmlhbC9SRUFETUUgYi90dXRvcmlhbC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWY5NzcuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotVGhyaWZ0IFR1dG9yaWFsCi0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVR1dG9yaWFsCi09PT09PT09PQotCi0xKSBGaXJzdCB0aGluZ3MgZmlyc3QsIHlvdSdsbCBuZWVkIHRvIGluc3RhbGwgdGhlIFRocmlmdCBjb21waWxlciBhbmQgdGhlCi0gICBsYW5ndWFnZSBsaWJyYXJpZXMuIERvIHRoYXQgdXNpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgdG9wIGxldmVsCi0gICBSRUFETUUgZmlsZS4KLQotMikgUmVhZCB0dXRvcmlhbC50aHJpZnQgdG8gbGVhcm4gYWJvdXQgdGhlIHN5bnRheCBvZiBhIFRocmlmdCBmaWxlCi0KLTMpIENvbXBpbGUgdGhlIGNvZGUgZm9yIHRoZSBsYW5ndWFnZSBvZiB5b3VyIGNob2ljZToKLQotICAgICAkIHRocmlmdAotICAgICAkIHRocmlmdCAtciAtLWdlbiBjcHAgdHV0b3JpYWwudGhyaWZ0Ci0KLTQpIFRha2UgYSBsb29rIGF0IHRoZSBnZW5lcmF0ZWQgY29kZS4KLQotNSkgTG9vayBpbiB0aGUgbGFuZ3VhZ2UgZGlyZWN0b3JpZXMgZm9yIHNhbXBsZSBjbGllbnQvc2VydmVyIGNvZGUuCi0KLTYpIFRoYXQncyBhYm91dCBpdCBmb3Igbm93LiBUaGlzIHR1dG9yaWFsIGlzIGludGVudGlvbmFsbHkgYnJpZWYuIEl0IHNob3VsZCBiZQotICAganVzdCBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkIGFuZCByZWFkeSB0byBidWlsZCB5b3VyIG93biBwcm9qZWN0LgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvUkVBRE1FLm1kIGIvdHV0b3JpYWwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzJiZjMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9SRUFETUUubWQKQEAgLTAsMCArMSw0MiBAQAorVGhyaWZ0IFR1dG9yaWFsCisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1R1dG9yaWFsCis9PT09PT09PQorCisxKSBGaXJzdCB0aGluZ3MgZmlyc3QsIHlvdSdsbCBuZWVkIHRvIGluc3RhbGwgdGhlIFRocmlmdCBjb21waWxlciBhbmQgdGhlCisgICBsYW5ndWFnZSBsaWJyYXJpZXMuIERvIHRoYXQgdXNpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgdG9wIGxldmVsCisgICBSRUFETUUubWQgZmlsZS4KKworMikgUmVhZCB0dXRvcmlhbC50aHJpZnQgdG8gbGVhcm4gYWJvdXQgdGhlIHN5bnRheCBvZiBhIFRocmlmdCBmaWxlCisKKzMpIENvbXBpbGUgdGhlIGNvZGUgZm9yIHRoZSBsYW5ndWFnZSBvZiB5b3VyIGNob2ljZToKKworICAgICAkIHRocmlmdAorICAgICAkIHRocmlmdCAtciAtLWdlbiBjcHAgdHV0b3JpYWwudGhyaWZ0CisKKzQpIFRha2UgYSBsb29rIGF0IHRoZSBnZW5lcmF0ZWQgY29kZS4KKworNSkgTG9vayBpbiB0aGUgbGFuZ3VhZ2UgZGlyZWN0b3JpZXMgZm9yIHNhbXBsZSBjbGllbnQvc2VydmVyIGNvZGUuCisKKzYpIFRoYXQncyBhYm91dCBpdCBmb3Igbm93LiBUaGlzIHR1dG9yaWFsIGlzIGludGVudGlvbmFsbHkgYnJpZWYuIEl0IHNob3VsZCBiZQorICAganVzdCBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkIGFuZCByZWFkeSB0byBidWlsZCB5b3VyIG93biBwcm9qZWN0LgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvYXMzL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2FzMy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlZDMyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2FzMy9idWlsZC54bWwKQEAgLTAsMCArMSw1MCBAQAorPHByb2plY3QgbmFtZT0idHV0b3JpYWwiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iPgorCisgIDxkZXNjcmlwdGlvbj5UaHJpZnQgYWN0aW9uc2NyaXB0IDMuMCB0dXRvcmlhbC48L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSJnZW4tYXMzIiAvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0ic3JjIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnNyYyIgbG9jYXRpb249Ii4uLy4uL2xpYi9hczMvc3JjLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRpc3QiIGxvY2F0aW9uPSJkaXN0IiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJmaW5hbC5uYW1lIiB2YWx1ZT0iYXMzLXR1dG9yaWFsIiAvPgorICA8cHJvcGVydHkgbmFtZT0ic3dmLm5hbWUiIHZhbHVlPSIke2Rpc3R9LyR7ZmluYWwubmFtZX0uc3dmIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iZmxleC5jaGVjayIgdW5sZXNzPSJGTEVYX0hPTUUiPgorICAgIDxmYWlsIG1lc3NhZ2U9J1lvdSBtdXN0IHNldCB0aGUgRkxFWF9IT01FIHByb3BlcnR5IHBvaW50aW5nIHRvIHlvdXIgZmxleCBTREssIGVnLiBhbnQgLURGTEVYX0hPTUU9Ii9BcHBsaWNhdGlvbnMvQWRvYmUgRmxleCBCdWlsZGVyIDMvc2Rrcy8zLjIuMCInLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmbGV4LmluaXQiIGRlcGVuZHM9ImZsZXguY2hlY2siIHVubGVzcz0iZmxleC5maW5pc2hlZCI+CisgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImZsZXhUYXNrcy50YXNrcyIgY2xhc3NwYXRoPSIke0ZMRVhfSE9NRX0vYW50L2xpYi9mbGV4VGFza3MuamFyIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmbGV4LmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDx0c3RhbXAgLz4KKyAgICA8bWtkaXIgZGlyPSIke2Rpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iZ2VuZXJhdGUsIGZsZXguaW5pdCwgaW5pdCI+CisgICAgPG14bWxjIG91dHB1dD0iJHtzd2YubmFtZX0iIGZpbGU9IiR7c3JjfS9DYWxjdWxhdG9yVUkuYXMiPgorICAgICAgPHNvdXJjZS1wYXRoIHBhdGgtZWxlbWVudD0iJHtnZW59IiAvPgorICAgICAgPHNvdXJjZS1wYXRoIHBhdGgtZWxlbWVudD0iJHtzcmN9IiAvPgorICAgICAgPHNvdXJjZS1wYXRoIHBhdGgtZWxlbWVudD0iJHt0aHJpZnQuc3JjfSIgLz4KKyAgICA8L214bWxjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KKyAgICA8IS0tIEdlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmEgc291cmNlIC0tPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4gYXMzIC4uL3NoYXJlZC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBhczMgLi4vdHV0b3JpYWwudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdH0iIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9hczMvc3JjL0NhbGN1bGF0b3JVSS5hcyBiL3R1dG9yaWFsL2FzMy9zcmMvQ2FsY3VsYXRvclVJLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTZkZjUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9hczMvc3JjL0NhbGN1bGF0b3JVSS5hcwpAQCAtMCwwICsxLDE0MiBAQAorcGFja2FnZSB7CisgIGltcG9ydCBmbGFzaC5kaXNwbGF5LlNwcml0ZTsKKyAgaW1wb3J0IGZsYXNoLnRleHQuVGV4dEZpZWxkOworICBpbXBvcnQgZmxhc2gudGV4dC5UZXh0RmllbGRUeXBlOworICBpbXBvcnQgZmxhc2guZXZlbnRzLk1vdXNlRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5zeXN0ZW0uU2VjdXJpdHk7CisKKyAgaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OworICBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisgIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisgIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CisKKyAgLyoqCisgICAqIFNpbXBsZSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Rpb24gbG9naWMgaW1wbGVtZW50YXRpb24gZm9yIHR1dG9yaWFsLgorICAgKi8KKyAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JVSSBleHRlbmRzIFNwcml0ZSB7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBCVVRUT05fUEFERElORzp1aW50ID0gNTsKKworICAgIHByaXZhdGUgdmFyIG1DYWxjdWxhdG9yQ2xpZW50OkNhbGN1bGF0b3I7IC8vIHdlIHVzZSBjYWxjdWxhdG9yIHRocm91Z2ggaW50ZXJmYWNlCisgICAgcHJpdmF0ZSB2YXIgbVRyYW5zcG9ydDpUVHJhbnNwb3J0OyAvLyBUcmFuc3BvcnQsIHVzZWQgdG8gY29tdW5pY2F0ZSB3aXRoIHNlcnZlcgorCisgICAgcHJpdmF0ZSB2YXIgbUFkZEJ1dHRvbjpTcHJpdGU7CisgICAgcHJpdmF0ZSB2YXIgbUxlZnQ6VGV4dEZpZWxkOworICAgIHByaXZhdGUgdmFyIG1SaWdodDpUZXh0RmllbGQ7CisgICAgcHJpdmF0ZSB2YXIgbVJlc3VsdDpUZXh0RmllbGQ7CisKKyAgICBwcml2YXRlIHZhciBwaW5nQnV0dG9uOlNwcml0ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBDYWxjdWxhdG9yVUkoKSB7CisgICAgICBidWlsZEludGVyZmFjZSgpOworICAgICAgaW5pdFNlY3VyaXR5KCk7CisgICAgICBpbml0Q29ubmVjdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaW5pdFNlY3VyaXR5KCk6dm9pZCB7CisgICAgICBTZWN1cml0eS5sb2FkUG9saWN5RmlsZSgieG1sc29ja2V0Oi8vMTI3LjAuMC4xOjkwOTIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGFtcGxlIG9mIGluaXRpYWxpemluZyBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gaW5pdENvbm5lY3Rpb24oKTp2b2lkIHsKKyAgICAgIG1UcmFuc3BvcnQgPSBuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgOTA5MCk7IC8vIHdlIGNvbm5lY3QgdG8gc2VydmVyCisgICAgICBtVHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIC8vIGluaXRpYWxpemUgcHJvdG9jb2w6CisgICAgICB2YXIgcHJvdG9jb2w6VFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChtVHJhbnNwb3J0LCBmYWxzZSwgZmFsc2UpOworICAgICAgbUNhbGN1bGF0b3JDbGllbnQgPSBuZXcgQ2FsY3VsYXRvckltcGwocHJvdG9jb2wpOyAvLyBmaW5hbGx5LCB3ZSBjcmVhdGUgY2FsY3VsYXRvciBjbGllbnQgaW5zdGFuY2UKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uUGluZ0NsaWNrKG1lOk1vdXNlRXZlbnQpOnZvaWQgeworICAgICAgaWYoIW1UcmFuc3BvcnQuaXNPcGVuKCkpIHJldHVybjsKKyAgICAgIG1DYWxjdWxhdG9yQ2xpZW50LnBpbmcob25QaW5nRXJyb3IsIG9uUGluZ1N1Y2Nlc3MpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25QaW5nRXJyb3IoZXJyb3I6RXJyb3IpOnZvaWQgeworICAgICAgdHJhY2UoIkVycm9yLCB3aGlsZSByZXF1ZXN0aW5nIHBpbmcuIik7CisgICAgICB0aHJvdyBlcnJvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uUGluZ1N1Y2Nlc3MoKTp2b2lkIHsKKyAgICAgIHRyYWNlKCJQaW5nIHJldHVybmVkIHN1Y2Nlc3NmdWxseSIpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25BZGRDbGljayhtZTpNb3VzZUV2ZW50KTp2b2lkIHsKKyAgICAgIGlmKCFtVHJhbnNwb3J0LmlzT3BlbigpKSByZXR1cm47CisgICAgICB2YXIgbnVtMTpOdW1iZXIgPSBOdW1iZXIobUxlZnQudGV4dCk7CisgICAgICB2YXIgbnVtMjpOdW1iZXIgPSBOdW1iZXIobVJpZ2h0LnRleHQpOworICAgICAgbVJlc3VsdC50ZXh0ID0gIlByb2Nlc3NpbmcuLi4iOworICAgICAgbUNhbGN1bGF0b3JDbGllbnQuYWRkKG51bTEsIG51bTIsIG9uQWRkRXJyb3IsIG9uQWRkU3VjY2Vzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvbkFkZEVycm9yKGVycm9yOkVycm9yKTp2b2lkIHsKKyAgICAgIHRyYWNlKCJFcnJvciwgd2hpbGUgcmVxdWVzdGluZyBhZGQuIik7CisgICAgICB0aHJvdyBlcnJvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uQWRkU3VjY2VzcyhyZXM6TnVtYmVyKTp2b2lkIHsKKyAgICAgIG1SZXN1bHQudGV4dCA9IFN0cmluZyhyZXMpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKTp2b2lkIHsKKyAgICAgIGFkZENoaWxkKHBpbmdCdXR0b24gPSBidWlsZEJ1dHRvbigiUElORyIpKTsKKyAgICAgIHBpbmdCdXR0b24ueCA9IChzdGFnZS5zdGFnZVdpZHRoIC0gcGluZ0J1dHRvbi53aWR0aCkgLyAyOworICAgICAgcGluZ0J1dHRvbi55ID0gMTA7CisgICAgICBwaW5nQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoTW91c2VFdmVudC5DTElDSywgb25QaW5nQ2xpY2spOworCisgICAgICB2YXIgdG9wOk51bWJlciA9IHBpbmdCdXR0b24ueSArIHBpbmdCdXR0b24uaGVpZ2h0ICsgMjA7CisgICAgICBhZGRDaGlsZChtTGVmdCA9IGJ1aWxkRGlnaXRJbnB1dCgpKTsKKyAgICAgIG1MZWZ0LnggPSAxNTsKKyAgICAgIG1MZWZ0LnkgPSB0b3AgKyBCVVRUT05fUEFERElORzsKKyAgICAgIGFkZENoaWxkKG1SaWdodCA9IGJ1aWxkRGlnaXRJbnB1dCgpKTsKKyAgICAgIG1SaWdodC54ID0gbUxlZnQueCArIG1MZWZ0LndpZHRoICsgMTU7CisgICAgICBtUmlnaHQueSA9IHRvcCArIEJVVFRPTl9QQURESU5HOworICAgICAgYWRkQ2hpbGQobUFkZEJ1dHRvbiA9IGJ1aWxkQnV0dG9uKCJBREQiKSk7CisgICAgICBtQWRkQnV0dG9uLnggPSBtUmlnaHQueCArIG1SaWdodC53aWR0aCArIDE1OworICAgICAgbUFkZEJ1dHRvbi55ID0gdG9wOworICAgICAgbUFkZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKE1vdXNlRXZlbnQuQ0xJQ0ssIG9uQWRkQ2xpY2spOworICAgICAgYWRkQ2hpbGQobVJlc3VsdCA9IGJ1aWxkRGlnaXRJbnB1dCgpKTsKKyAgICAgIG1SZXN1bHQueCA9IG1BZGRCdXR0b24ueCArIG1BZGRCdXR0b24ud2lkdGggKyAxNTsKKyAgICAgIG1SZXN1bHQueSA9IHRvcCArIEJVVFRPTl9QQURESU5HOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBkaWdpdC1vbmx5IGlucHV0IGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gYnVpbGREaWdpdElucHV0KCk6VGV4dEZpZWxkIHsKKyAgICAgIHZhciB0ZXh0RmllbGQ6VGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZDsKKyAgICAgIHRleHRGaWVsZC53aWR0aCA9IDc1OworICAgICAgdGV4dEZpZWxkLmhlaWdodCA9IDIwOworICAgICAgdGV4dEZpZWxkLnJlc3RyaWN0ID0gIjA5ODc2NTQzMjEuIjsKKyAgICAgIHRleHRGaWVsZC50eXBlID0gVGV4dEZpZWxkVHlwZS5JTlBVVDsKKyAgICAgIHRleHRGaWVsZC5iYWNrZ3JvdW5kID0gdHJ1ZTsKKyAgICAgIHRleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3IgPSAweGFhYWFmZjsKKyAgICAgIHRleHRGaWVsZC50ZXh0Q29sb3IgPSAweGZmZmYwMDsKKyAgICAgIHJldHVybiB0ZXh0RmllbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIGJ1dHRvbiBkcmF3aW5nLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gYnVpbGRCdXR0b24odGV4dDpTdHJpbmcpOlNwcml0ZSB7CisgICAgICB2YXIgYnV0dG9uOlNwcml0ZSA9IG5ldyBTcHJpdGU7CisgICAgICB2YXIgdGV4dEZpZWxkOlRleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQ7CisgICAgICB0ZXh0RmllbGQud2lkdGggPSA0MDAwOworICAgICAgdGV4dEZpZWxkLnRleHQgPSB0ZXh0OworICAgICAgdGV4dEZpZWxkLnRleHRDb2xvciA9IDB4ZmZmZjAwOworICAgICAgdGV4dEZpZWxkLndpZHRoID0gdGV4dEZpZWxkLnRleHRXaWR0aCArIDQ7CisgICAgICB0ZXh0RmllbGQuaGVpZ2h0ID0gdGV4dEZpZWxkLnRleHRIZWlnaHQgKyA0OworICAgICAgdGV4dEZpZWxkLm1vdXNlRW5hYmxlZCA9IGZhbHNlOworICAgICAgYnV0dG9uLmdyYXBoaWNzLmJlZ2luRmlsbCgweDAwMDBmZik7CisgICAgICBidXR0b24uZ3JhcGhpY3MubGluZVN0eWxlKDAsIDB4MDAwMDAwKTsKKyAgICAgIGJ1dHRvbi5ncmFwaGljcy5kcmF3Um91bmRSZWN0KDAsIDAsIHRleHRGaWVsZC53aWR0aCArIEJVVFRPTl9QQURESU5HICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZC5oZWlnaHQgKyBCVVRUT05fUEFERElORyAqIDIsIEJVVFRPTl9QQURESU5HKTsKKyAgICAgIGJ1dHRvbi5ncmFwaGljcy5lbmRGaWxsKCk7CisgICAgICBidXR0b24uYWRkQ2hpbGQodGV4dEZpZWxkKTsKKyAgICAgIHRleHRGaWVsZC54ID0gQlVUVE9OX1BBRERJTkc7CisgICAgICB0ZXh0RmllbGQueSA9IEJVVFRPTl9QQURESU5HOworICAgICAgYnV0dG9uLnVzZUhhbmRDdXJzb3IgPSBidXR0b24uYnV0dG9uTW9kZSA9IHRydWU7CisgICAgICByZXR1cm4gYnV0dG9uOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkYmU2NTUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBcCisJZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuaCBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuaCBcCisJZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5oCisKK0FNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgQEdDT1ZfQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbGliL2NfZ2xpYi9zcmMgLUlnZW4tY19nbGliCitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAkKE9QRU5TU0xfTERGTEFHUykgJChPUEVOU1NMX0xJQlMpIEBHQ09WX0xERkxBR1NACisKK25vaW5zdF9MVExJQlJBUklFUyA9IFwKKwlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhCisKK25vZGlzdF9saWJ0dXRvcmlhbGdlbmNnbGliX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmMgXAorCWdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIFwKKwlnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmMgXAorCWdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuaCBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuYyBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuaCBcCisJZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5jIFwKKwlnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmgKKworbGlidHV0b3JpYWxnZW5jZ2xpYl9sYV9MSUJBREQgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCitsaWJ0dXRvcmlhbGdlbmNnbGliX2xhX0NGTEFHUyA9IFwKKwkkKEFNX0NGTEFHUykgLVduby11bnVzZWQtZnVuY3Rpb24KKworbm9pbnN0X1BST0dSQU1TID0gXAorCXR1dG9yaWFsX3NlcnZlciBcCisJdHV0b3JpYWxfY2xpZW50CisKK3R1dG9yaWFsX3NlcnZlcl9TT1VSQ0VTID0gXAorCWNfZ2xpYl9zZXJ2ZXIuYwordHV0b3JpYWxfc2VydmVyX0xERkxBR1MgPSAkKE9QRU5TU0xfTElCUykKKwordHV0b3JpYWxfc2VydmVyX0xEQUREID0gXAorCWxpYnR1dG9yaWFsZ2VuY2dsaWIubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKwordHV0b3JpYWxfY2xpZW50X1NPVVJDRVMgPSBcCisJY19nbGliX2NsaWVudC5jCisKK3R1dG9yaWFsX2NsaWVudF9MREFERCA9IFwKKwlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKKworZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmMgZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmggZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5jIGdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuaCBnZW4tY19nbGliL3NoYXJlZF90eXBlcy5jIGdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5jIGdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliIC1yICQ8CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jX2dsaWIvKgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJLi90dXRvcmlhbF9zZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCS4vdHV0b3JpYWxfY2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJY19nbGliX3NlcnZlci5jIFwKKwljX2dsaWJfY2xpZW50LmMKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfY2xpZW50LmMgYi90dXRvcmlhbC9jX2dsaWIvY19nbGliX2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmQ1MTcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jX2dsaWIvY19nbGliX2NsaWVudC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmgiCisKK2ludCBtYWluICh2b2lkKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbDsKKyAgQ2FsY3VsYXRvcklmICpjbGllbnQ7CisKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEludmFsaWRPcGVyYXRpb24gKmludmFsaWRfb3BlcmF0aW9uID0gTlVMTDsKKworICBXb3JrICp3b3JrOworCisgIGdpbnQzMiBzdW07CisgIGdpbnQzMiBkaWZmOworCisgIGludCBleGl0X3N0YXR1cyA9IDA7CisKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIHNvY2tldCAgICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICAgICAgOTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgcHJvdG9jb2wgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKTsKKworCisgIC8qIEluIHRoZSBDIChHTGliKSBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQsIHNlcnZpY2UgbWV0aG9kcyBvbiB0aGUKKyAgICAgc2VydmVyIGFyZSBhY2Nlc3NlZCB2aWEgYSBnZW5lcmF0ZWQgY2xpZW50IGNsYXNzIHRoYXQgaW1wbGVtZW50cworICAgICB0aGUgc2VydmljZSBpbnRlcmZhY2UuIEluIHRoaXMgdHV0b3JpYWwsIHdlIGFjY2VzcyBhIENhbGN1bGF0b3IKKyAgICAgc2VydmljZSB0aHJvdWdoIGFuIGluc3RhbmNlIG9mIENhbGN1bGF0b3JDbGllbnQsIHdoaWNoIGltcGxlbWVudHMKKyAgICAgQ2FsY3VsYXRvcklmLiAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRZUEVfQ0FMQ1VMQVRPUl9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBFYWNoIG9mIHRoZSBjbGllbnQgbWV0aG9kcyByZXF1aXJlcyBhdCBsZWFzdCB0d28gcGFyYW1ldGVyczogQQorICAgICBwb2ludGVyIHRvIHRoZSBjbGllbnQtaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uICh0aGUgY2xpZW50CisgICAgIG9iamVjdCksIGFuZCBhIGhhbmRsZSB0byBhIEdFcnJvciBzdHJ1Y3R1cmUgdG8gcmVjZWl2ZQorICAgICBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMuCisKKyAgICAgT24gc3VjY2VzcywgY2xpZW50IG1ldGhvZHMgcmV0dXJuIFRSVUUuIEEgcmV0dXJuIHZhbHVlIG9mIEZBTFNFCisgICAgIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZCBhbmQgdGhlIGVycm9yIHBhcmFtZXRlciBoYXMgYmVlbgorICAgICBzZXQuICovCisgIGlmICghZXJyb3IgJiYgY2FsY3VsYXRvcl9pZl9waW5nIChjbGllbnQsICZlcnJvcikpIHsKKyAgICBwdXRzICgicGluZygpIik7CisgIH0KKworICAvKiBTZXJ2aWNlIG1ldGhvZHMgdGhhdCByZXR1cm4gYSB2YWx1ZSBkbyBzbyBieSBwYXNzaW5nIHRoZSByZXN1bHQKKyAgICAgYmFjayB2aWEgYW4gb3V0cHV0IHBhcmFtZXRlciAoaGVyZSwgInN1bSIpLiAqLworICBpZiAoIWVycm9yICYmIGNhbGN1bGF0b3JfaWZfYWRkIChjbGllbnQsICZzdW0sIDEsIDEsICZlcnJvcikpIHsKKyAgICBwcmludGYgKCIxKzE9JWRcbiIsIHN1bSk7CisgIH0KKworICAvKiBUaHJpZnQgc3RydWN0cyBhcmUgaW1wbGVtZW50ZWQgYXMgR09iamVjdHMsIHdpdGggZWFjaCBvZiB0aGUKKyAgICAgc3RydWN0J3MgbWVtYmVycyBleHBvc2VkIGFzIGFuIG9iamVjdCBwcm9wZXJ0eS4gKi8KKyAgd29yayA9IGdfb2JqZWN0X25ldyAoVFlQRV9XT1JLLCBOVUxMKTsKKworICBpZiAoIWVycm9yKSB7CisgICAgZ19vYmplY3Rfc2V0ICh3b3JrLAorICAgICAgICAgICAgICAgICAgIm51bTEiLCAxLAorICAgICAgICAgICAgICAgICAgIm51bTIiLCAwLAorICAgICAgICAgICAgICAgICAgIm9wIiwgICBPUEVSQVRJT05fRElWSURFLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAvKiBFeGNlcHRpb25zIGFyZSBwYXNzZWQgYmFjayBmcm9tIHNlcnZpY2UgbWV0aG9kcyBpbiBhIG1hbm5lcgorICAgICAgIHNpbWlsYXIgdG8gcmV0dXJuIHZhbHVlcy4gKi8KKyAgICBpZiAoY2FsY3VsYXRvcl9pZl9jYWxjdWxhdGUgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnZhbGlkX29wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgIHB1dHMgKCJXaG9hPyBXZSBjYW4gZGl2aWRlIGJ5IHplcm8hIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGludmFsaWRfb3BlcmF0aW9uKSB7CisgICAgICAgIGdjaGFyICp3aHk7CisKKyAgICAgICAgLyogTGlrZSBzdHJ1Y3RzLCBleGNlcHRpb25zIGFyZSBpbXBsZW1lbnRlZCBhcyBvYmplY3RzIHdpdGgKKyAgICAgICAgICAgcHJvcGVydGllcy4gKi8KKyAgICAgICAgZ19vYmplY3RfZ2V0IChpbnZhbGlkX29wZXJhdGlvbiwgIndoeSIsICZ3aHksIE5VTEwpOworCisgICAgICAgIHByaW50ZiAoIkludmFsaWRPcGVyYXRpb246ICVzXG4iLCB3aHkpOworCisgICAgICAgIGlmICh3aHkgIT0gTlVMTCkKKyAgICAgICAgICBnX2ZyZWUgKHdoeSk7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChpbnZhbGlkX29wZXJhdGlvbik7CisgICAgICAgIGludmFsaWRfb3BlcmF0aW9uID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgICB9CisgIH0KKworICBpZiAoIWVycm9yKSB7CisgICAgLyogU3RydWN0IG9iamVjdHMgY2FuIGJlIHJldXNlZCBhY3Jvc3MgbWV0aG9kIGludm9jYXRpb25zLiAqLworICAgIGdfb2JqZWN0X3NldCAod29yaywKKyAgICAgICAgICAgICAgICAgICJudW0xIiwgMTUsCisgICAgICAgICAgICAgICAgICAibnVtMiIsIDEwLAorICAgICAgICAgICAgICAgICAgIm9wIiwgICBPUEVSQVRJT05fU1VCVFJBQ1QsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGlmIChjYWxjdWxhdG9yX2lmX2NhbGN1bGF0ZSAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnZhbGlkX29wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgIHByaW50ZiAoIjE1LTEwPSVkXG4iLCBkaWZmKTsKKyAgICB9CisgIH0KKworICBnX29iamVjdF91bnJlZiAod29yayk7CisKKyAgaWYgKCFlcnJvcikgeworICAgIFNoYXJlZFN0cnVjdCAqc2hhcmVkX3N0cnVjdDsKKyAgICBnY2hhciAqdmFsdWU7CisKKyAgICBzaGFyZWRfc3RydWN0ID0gZ19vYmplY3RfbmV3IChUWVBFX1NIQVJFRF9TVFJVQ1QsIE5VTEwpOworCisgICAgLyogQXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IGZpbGUsIHRoZSBDYWxjdWxhdG9yIHNlcnZpY2UgZXh0ZW5kcworICAgICAgIHRoZSBTaGFyZWRTZXJ2aWNlIHNlcnZpY2UuIENvcnJlc3BvbmRpbmdseSwgaW4gdGhlIGdlbmVyYXRlZAorICAgICAgIGNvZGUgQ2FsY3VsYXRvcklmIGluaGVyaXRzIGZyb20gU2hhcmVkU2VydmljZUlmLCBhbmQgdGhlIHBhcmVudAorICAgICAgIHNlcnZpY2UncyBtZXRob2RzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggYSBzaW1wbGUgY2FzdC4gKi8KKyAgICBpZiAoc2hhcmVkX3NlcnZpY2VfY2xpZW50X2dldF9zdHJ1Y3QgKFNIQVJFRF9TRVJWSUNFX0lGIChjbGllbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJlZF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgZ19vYmplY3RfZ2V0IChzaGFyZWRfc3RydWN0LCAidmFsdWUiLCAmdmFsdWUsIE5VTEwpOworICAgICAgcHJpbnRmICgiQ2hlY2sgbG9nOiAlc1xuIiwgdmFsdWUpOworICAgICAgZ19mcmVlICh2YWx1ZSk7CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKHNoYXJlZF9zdHJ1Y3QpOworICB9CisKKyAgaWYgKGVycm9yKSB7CisgICAgcHJpbnRmICgiRVJST1I6ICVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKworICAgIGV4aXRfc3RhdHVzID0gMTsKKyAgfQorCisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKKworICByZXR1cm4gZXhpdF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jX2dsaWIvY19nbGliX3NlcnZlci5jIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JmNDdmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9zZXJ2ZXIuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJnZW4tY19nbGliL2NhbGN1bGF0b3IuaCIKKworR19CRUdJTl9ERUNMUworCisvKiBJbiB0aGUgQyAoR0xpYikgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0LCB0aGUgYWN0dWFsIHdvcmsgZG9uZSBieSBhCisgICBzZXJ2ZXItLS10aGF0IGlzLCB0aGUgY29kZSB0aGF0IHJ1bnMgd2hlbiBhIGNsaWVudCBpbnZva2VzIGEKKyAgIHNlcnZpY2UgbWV0aG9kLS0taXMgZGVmaW5lZCBpbiBhIHNlcGFyYXRlICJoYW5kbGVyIiBjbGFzcyB0aGF0CisgICBpbXBsZW1lbnRzIHRoZSBzZXJ2aWNlIGludGVyZmFjZS4gSGVyZSB3ZSBkZWZpbmUgdGhlCisgICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBDYWxjdWxhdG9ySWYKKyAgIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgdGhlIGJlaGF2aW9yIGV4cGVjdGVkIGJ5IHR1dG9yaWFsIGNsaWVudHMuCisgICAoVHlwaWNhbGx5IHRoaXMgY29kZSB3b3VsZCBiZSBwbGFjZWQgaW4gaXRzIG93biBtb2R1bGUgYnV0IGZvcgorICAgY2xhcml0eSB0aGlzIHR1dG9yaWFsIGlzIHByZXNlbnRlZCBlbnRpcmVseSBpbiBhIHNpbmdsZSBmaWxlLikKKworICAgRm9yIGVhY2ggc2VydmljZSB0aGUgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlcyBhbiBhYnN0cmFjdCBiYXNlCisgICBjbGFzcyBmcm9tIHdoaWNoIGhhbmRsZXIgaW1wbGVtZW50YXRpb25zIHNob3VsZCBpbmhlcml0LiBJbiBvdXIKKyAgIGNhc2UgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciBpbmhlcml0cyBmcm9tIENhbGN1bGF0b3JIYW5kbGVyLAorICAgZGVmaW5lZCBpbiBnZW4tY19nbGliL2NhbGN1bGF0b3IuaC4KKworICAgSWYgeW91J3JlIG5ldyB0byBHT2JqZWN0LCB0cnkgbm90IHRvIGJlIGludGltaWRhdGVkIGJ5IHRoZSBxdWFudGl0eQorICAgb2YgY29kZSBoZXJlLS0tbXVjaCBvZiBpdCBpcyBib2lsZXJwbGF0ZSBhbmQgY2FuIG1vc3RseSBiZQorICAgY29waWVkLWFuZC1wYXN0ZWQgZnJvbSBleGlzdGluZyB3b3JrLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0bworICAgdGhlIEdPYmplY3QgUmVmZXJlbmNlIE1hbnVhbCwgYXZhaWxhYmxlIG9ubGluZSBhdAorICAgaHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dvYmplY3QvLiAqLworCisjZGVmaW5lIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIFwKKyAgKHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIpKQorI2RlZmluZSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIpKQorI2RlZmluZSBJU19UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIpKQorI2RlZmluZSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzKSkKKworc3RydWN0IF9UdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyIHsKKyAgQ2FsY3VsYXRvckhhbmRsZXIgcGFyZW50X2luc3RhbmNlOworCisgIC8qIHByaXZhdGUgKi8KKyAgR0hhc2hUYWJsZSAqbG9nOworfTsKK3R5cGVkZWYgc3RydWN0IF9UdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXI7CisKK3N0cnVjdCBfVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzIHsKKyAgQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1R1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3M7CisKK0dUeXBlIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgZm9sbG93cy4gKi8KKworR19ERUZJTkVfVFlQRSAoVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciwKKyAgICAgICAgICAgICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlciwKKyAgICAgICAgICAgICAgIFRZUEVfQ0FMQ1VMQVRPUl9IQU5ETEVSKQorCisvKiBFYWNoIG9mIGEgaGFuZGxlcidzIG1ldGhvZHMgYWNjZXB0cyBhdCBsZWFzdCB0d28gcGFyYW1ldGVyczogQQorICAgcG9pbnRlciB0byB0aGUgc2VydmljZS1pbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gKHRoZSBoYW5kbGVyIG9iamVjdAorICAgaXRzZWxmKSBhbmQgYSBoYW5kbGUgdG8gYSBHRXJyb3Igc3RydWN0dXJlIHRvIHJlY2VpdmUgaW5mb3JtYXRpb24KKyAgIGFib3V0IGFueSBlcnJvciB0aGF0IG9jY3Vycy4KKworICAgT24gc3VjY2VzcywgYSBoYW5kbGVyIG1ldGhvZCByZXR1cm5zIFRSVUUuIEEgcmV0dXJuIHZhbHVlIG9mIEZBTFNFCisgICBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIHRoZSBlcnJvciBwYXJhbWV0ZXIgaGFzIGJlZW4KKyAgIHNldC4gKE1ldGhvZHMgc2hvdWxkIG5vdCByZXR1cm4gRkFMU0Ugd2l0aG91dCBmaXJzdCBzZXR0aW5nIHRoZQorICAgZXJyb3IgcGFyYW1ldGVyLikgKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX3BpbmcgKENhbGN1bGF0b3JJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHB1dHMgKCJwaW5nKCkiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogU2VydmljZS1tZXRob2QgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRocm91Z2ggYXMgcGFyYW1ldGVycyB0byB0aGUKKyAgIGhhbmRsZXIgbWV0aG9kLgorCisgICBJZiB0aGUgc2VydmljZSBtZXRob2QgcmV0dXJucyBhIHZhbHVlIGFuIG91dHB1dCBwYXJhbWV0ZXIsIF9yZXR1cm4sCisgICBpcyBhZGRpdGlvbmFsbHkgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG1ldGhvZC4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkCisgICBiZSBzZXQgYXBwcm9wcmlhdGVseSBiZWZvcmUgdGhlIG1ldGhvZCByZXR1cm5zLCB3aGVuZXZlciBpdAorICAgc3VjY2VlZHMuCisKKyAgIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCBoYXBwZW5zIHRvIGJlIG9mIGEgYmFzZSB0eXBlLAorICAgaTMyLCBidXQgbm90ZSBpZiBhIG1ldGhvZCByZXR1cm5zIGEgY29tcGxleCB0eXBlIHN1Y2ggYXMgYSBtYXAgb3IKKyAgIGxpc3QgKl9yZXR1cm4gd2lsbCBwb2ludCB0byBhIHByZS1hbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorICAgZG9lcyBub3QgbmVlZCB0byBiZSByZS1hbGxvY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgZGVzdHJveWVkLiAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfYWRkIChDYWxjdWxhdG9ySWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICBudW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgbnVtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoImFkZCglZCwlZClcbiIsIG51bTEsIG51bTIpOworICAqX3JldHVybiA9IG51bTEgKyBudW0yOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBBbnkgaGFuZGxlciBtZXRob2QgY2FuIHJldHVybiBhIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRvIHRoZQorICAgY2xpZW50IGJ5IHNldHRpbmcgaXRzIGVycm9yIHBhcmFtZXRlciBhcHByb3ByaWF0ZWx5IGFuZCByZXR1cm5pbmcKKyAgIEZBTFNFLiBTZWUgdGhlIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uRXJyb3IgZW51bWVyYXRpb24gZGVmaW5lZAorICAgaW4gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIGZvciBhIGxpc3Qgb2YgcmVjb2duaXplZAorICAgZXhjZXB0aW9uIHR5cGVzIChHRXJyb3IgY29kZXMpLgorCisgICBJZiBhIHNlcnZpY2UgbWV0aG9kIGNhbiBhbHNvIHRocm93IGEgY3VzdG9tIGV4Y2VwdGlvbiAodGhhdCBpcywgb25lCisgICBkZWZpbmVkIGluIHRoZSAudGhyaWZ0IGZpbGUpIGFuIGFkZGl0aW9uYWwgb3V0cHV0IHBhcmFtZXRlciB3aWxsIGJlCisgICBwcm92aWRlZCAoaGVyZSwgIm91Y2giKSB0byBob2xkIGFuIGluc3RhbmNlIG9mIHRoZSBleGNlcHRpb24sIHdoZW4KKyAgIG5lY2Vzc2FyeS4gTm90ZSB0aGVyZSB3aWxsIGJlIGEgc2VwYXJhdGUgcGFyYW1ldGVyIGFkZGVkIGZvciBlYWNoCisgICB0eXBlIG9mIGV4Y2VwdGlvbiB0aGUgbWV0aG9kIGNhbiB0aHJvdy4KKworICAgVW5saWtlIHJldHVybiB2YWx1ZXMsIGV4Y2VwdGlvbiBvYmplY3RzIGFyZSBuZXZlciBwcmUtY3JlYXRlZDsgdGhpcworICAgaXMgYWx3YXlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaGFuZGxlciBtZXRob2QuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9jYWxjdWxhdGUgKENhbGN1bGF0b3JJZiAgICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAgICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgIGxvZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yayAgICAgICAgKncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uICoqb3VjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqc2VsZjsKKworICBnaW50ICpsb2dfa2V5OworICBnY2hhciBsb2dfdmFsdWVbMTJdOworICBTaGFyZWRTdHJ1Y3QgKmxvZ19zdHJ1Y3Q7CisKKyAgZ2ludCBudW0xOworICBnaW50IG51bTI7CisgIE9wZXJhdGlvbiBvcDsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChJU19UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgc2VsZiA9IFRVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiAoaWZhY2UpOworCisgIC8qIFJlbWVtYmVyOiBFeGNlcHRpb24gb2JqZWN0cyBhcmUgbmV2ZXIgcHJlLWNyZWF0ZWQgKi8KKyAgZ19hc3NlcnQgKCpvdWNoID09IE5VTEwpOworCisgIC8qIEZldGNoIHRoZSBjb250ZW50cyBvZiBvdXIgV29yayBwYXJhbWV0ZXIuCisKKyAgICAgTm90ZSB0aGF0IGludGVnZXIgcHJvcGVydGllcyBvZiB0aGlydHktdHdvIGJpdHMgb3IgZmV3ZXIgaW4gd2lkdGgKKyAgICAgYXJlIF9hbHdheXNfIG9mIHR5cGUgZ2ludCwgcmVnYXJkbGVzcyBvZiB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHRoZXkKKyAgICAgaG9sZC4gQSBjb21tb24gZXJyb3IgaXMgdHJ5aW5nIHRvIHJldHJpZXZlLCBzYXksIGEgc3RydWN0dXJlCisgICAgIG1lbWJlciBkZWZpbmVkIGluIHRoZSAudGhyaWZ0IGZpbGUgYXMgdHlwZSBpMTYgaW50byBhIHZhcmlhYmxlIG9mCisgICAgIHR5cGUgZ2ludDE2LCB3aGljaCB3aWxsIGNsb2JiZXIgdmFyaWFibGVzIGFkamFjZW50IG9uIHRoZQorICAgICBzdGFjay4gUmVtZW1iZXI6IElmIHlvdSdyZSByZXRyaWV2aW5nIGFuIGludGVnZXIgcHJvcGVydHkgdGhlCisgICAgIHJlY2VpdmluZyB2YXJpYWJsZSBtdXN0IGJlIG9mIGVpdGhlciB0eXBlIGdpbnQgb3IgZ2ludDY0LCBhcworICAgICBhcHByb3ByaWF0ZS4gKi8KKyAgZ19vYmplY3RfZ2V0ICgoV29yayAqKXcsCisgICAgICAgICAgICAgICAgIm51bTEiLCAmbnVtMSwKKyAgICAgICAgICAgICAgICAibnVtMiIsICZudW0yLAorICAgICAgICAgICAgICAgICJvcCIsICAgJm9wLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIHByaW50ZiAoImNhbGN1bGF0ZSglZCx7JWQsJWQsJWR9KVxuIiwgbG9naWQsIG9wLCBudW0xLCBudW0yKTsKKworICBzd2l0Y2ggKG9wKSB7CisgIGNhc2UgT1BFUkFUSU9OX0FERDoKKyAgICAqX3JldHVybiA9IG51bTEgKyBudW0yOworICAgIGJyZWFrOworCisgIGNhc2UgT1BFUkFUSU9OX1NVQlRSQUNUOgorICAgICpfcmV0dXJuID0gbnVtMSAtIG51bTI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBPUEVSQVRJT05fTVVMVElQTFk6CisgICAgKl9yZXR1cm4gPSBudW0xICogbnVtMjsKKyAgICBicmVhazsKKworICBjYXNlIE9QRVJBVElPTl9ESVZJREU6CisgICAgaWYgKG51bTIgPT0gMCkgeworICAgICAgLyogRm9yIGVhY2ggY3VzdG9tIGV4Y2VwdGlvbiB0eXBlIGEgc3ViY2xhc3Mgb2YgVGhyaWZ0U3RydWN0IGlzCisgICAgICAgICBnZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlci4gVGhyb3cgYW4gZXhjZXB0aW9uIGJ5CisgICAgICAgICBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBwYXJhbWV0ZXIgdG8gYSBuZXcgaW5zdGFuY2UKKyAgICAgICAgIG9mIGl0cyB0eXBlIGFuZCByZXR1cm5pbmcgRkFMU0UuICovCisgICAgICAqb3VjaCA9IGdfb2JqZWN0X25ldyAoVFlQRV9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdE9wIiwgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoeSIsICBnX3N0cmR1cCAoIkNhbm5vdCBkaXZpZGUgYnkgMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgcmVzdWx0ID0gRkFMU0U7CisKKyAgICAgIC8qIE5vdGUgdGhlIGNhbGwgdG8gZ19zdHJkdXAgYWJvdmU6IEFsbCB0aGUgbWVtb3J5IHVzZWQgYnkgYQorICAgICAgICAgVGhyaWZ0U3RydWN0J3MgcHJvcGVydGllcyBiZWxvbmdzIHRvIHRoZSBvYmplY3QgaXRzZWxmIGFuZAorICAgICAgICAgd2lsbCBiZSBmcmVlZCBvbiBkZXN0cnVjdGlvbi4gUmVtb3ZpbmcgdGhpcyBjYWxsIHRvIGdfc3RyZHVwCisgICAgICAgICB3aWxsIGxlYWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQgYXMgdGhlIG9iamVjdCB0cmllcyB0bworICAgICAgICAgcmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHN0YXRpY2FsbHkgdG8gdGhlIHByb2dyYW0uICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgKl9yZXR1cm4gPSBudW0xIC8gbnVtMjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAqb3VjaCA9IGdfb2JqZWN0X25ldyAoVFlQRV9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXRPcCIsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2h5IiwgIGdfc3RyZHVwICgiSW52YWxpZCBPcGVyYXRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcmVzdWx0ID0gRkFMU0U7CisgIH0KKworICAvKiBPbiBzdWNjZXNzLCBsb2cgYSByZWNvcmQgb2YgdGhlIHJlc3VsdCB0byBvdXIgaGFzaCB0YWJsZSAqLworICBpZiAocmVzdWx0KSB7CisgICAgbG9nX2tleSA9IGdfbWFsbG9jIChzaXplb2YgKmxvZ19rZXkpOworICAgICpsb2dfa2V5ID0gbG9naWQ7CisKKyAgICBzbnByaW50ZiAobG9nX3ZhbHVlLCBzaXplb2YgbG9nX3ZhbHVlLCAiJWQiLCAqX3JldHVybik7CisKKyAgICBsb2dfc3RydWN0ID0gZ19vYmplY3RfbmV3IChUWVBFX1NIQVJFRF9TVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleSIsICAgKmxvZ19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiwgIGdfc3RyZHVwIChsb2dfdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfaGFzaF90YWJsZV9yZXBsYWNlIChzZWxmLT5sb2csIGxvZ19rZXksIGxvZ19zdHJ1Y3QpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogQSBvbmUtd2F5IG1ldGhvZCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIGFuIGVxdWl2YWxlbnQsIHJlZ3VsYXIKKyAgIG1ldGhvZCB0aGF0IHJldHVybnMgbm8gdmFsdWUuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl96aXAgKENhbGN1bGF0b3JJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHV0cyAoInppcCgpIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEFzIHNwZWNpZmllZCBpbiB0aGUgLnRocmlmdCBmaWxlICh0dXRvcmlhbC50aHJpZnQpLCB0aGUgQ2FsY3VsYXRvcgorICAgc2VydmljZSBleHRlbmRzIHRoZSBTaGFyZWRTZXJ2aWNlIHNlcnZpY2UuIENvcnJlc3BvbmRpbmdseSwgaW4gdGhlCisgICBnZW5lcmF0ZWQgY29kZSB0aGUgQ2FsY3VsYXRvciBpbnRlcmZhY2UsIENhbGN1bGF0b3JJZiwgZXh0ZW5kcyB0aGUKKyAgIFNoYXJlZFNlcnZpY2UgaW50ZXJmYWNlLCBTaGFyZWRTZXJ2aWNlSWYsIGFuZCBzdWJjbGFzc2VzIG9mCisgICBDYWxjdWxhdG9ySGFuZGxlciBzaG91bGQgaW1wbGVtZW50IGl0cyBtZXRob2RzIGFzIHdlbGwuCisKKyAgIEhlcmUgd2UgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdldFN0cnVjdCBtZXRob2QgZnJvbSB0aGUKKyAgIHBhcmVudCBzZXJ2aWNlLiAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3N0cnVjdCAoU2hhcmVkU2VydmljZUlmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkU3RydWN0ICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICBrZXkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgKiplcnJvcikKK3sKKyAgZ2ludCBrZXkgPSAoZ2ludClrZXkzMjsKKyAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqc2VsZjsKKyAgU2hhcmVkU3RydWN0ICpsb2dfc3RydWN0OworICBnaW50IGxvZ19rZXk7CisgIGdjaGFyICpsb2dfdmFsdWU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgIHNlbGYgPSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKTsKKworICAvKiBSZW1lbWJlcjogQ29tcGxleCByZXR1cm4gdHlwZXMgYXJlIGFsd2F5cyBwcmUtY3JlYXRlZCBhbmQgbmVlZAorICAgICBvbmx5IGJlIHBvcHVsYXRlZCAqLworICBnX2Fzc2VydCAoKl9yZXR1cm4gIT0gTlVMTCk7CisKKyAgcHJpbnRmICgiZ2V0U3RydWN0KCVkKVxuIiwga2V5KTsKKworICAvKiBJZiB0aGUga2V5IGV4aXN0cyBpbiBvdXIgbG9nLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbG9nZ2VkCisgICAgIGRhdGEgKG9yIGFuIGVtcHR5IFNoYXJlZFN0cnVjdCBzdHJ1Y3R1cmUgaWYgaXQgZG9lcyBub3QpLgorCisgICAgIEluY2lkZW50YWxseSwgbm90ZSB3ZSBfbXVzdF8gaGVyZSBjb3B5IHRoZSB2YWx1ZXMgZnJvbSB0aGUgaGFzaAorICAgICB0YWJsZSBpbnRvIHRoZSByZXR1cm4gc3RydWN0dXJlLiBBbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHJldHVybgorICAgICBzdHJ1Y3R1cmUgYmVsb25ncyB0byB0aGUgc3RydWN0dXJlIGl0c2VsZiBhbmQgd2lsbCBiZSBmcmVlZCBvbmNlCisgICAgIGEgcmVzcG9uc2UgaXMgc2VudCB0byB0aGUgY2xpZW50LiBJZiB3ZSBtZXJlbHkgZnJlZWQgKl9yZXR1cm4gYW5kCisgICAgIHNldCBpdCB0byBwb2ludCB0byBvdXIgaGFzaC10YWJsZSBlbnRyeSwgdGhhdCB3b3VsZCBtZWFuIG1lbW9yeQorICAgICB3b3VsZCBiZSByZWxlYXNlZCAoZWZmZWN0aXZlbHksIGRhdGEgZXJhc2VkKSBvdXQgb2YgdGhlIGhhc2gKKyAgICAgdGFibGUhICovCisgIGxvZ19zdHJ1Y3QgPSBnX2hhc2hfdGFibGVfbG9va3VwIChzZWxmLT5sb2csICZrZXkpOworICBpZiAobG9nX3N0cnVjdCAhPSBOVUxMKSB7CisgICAgZ19vYmplY3RfZ2V0IChsb2dfc3RydWN0LAorICAgICAgICAgICAgICAgICAgImtleSIsICAgJmxvZ19rZXksCisgICAgICAgICAgICAgICAgICAidmFsdWUiLCAmbG9nX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0ICgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICJrZXkiLCAgIGxvZ19rZXksCisgICAgICAgICAgICAgICAgICAidmFsdWUiLCBnX3N0cmR1cCAobG9nX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIncyBpbnN0YW5jZSBmaW5hbGl6ZXIgKGRlc3RydWN0b3IpICovCitzdGF0aWMgdm9pZAordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGYgPQorICAgIFRVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiAob2JqZWN0KTsKKworICAvKiBGcmVlIG91ciBjYWxjdWxhdGlvbi1sb2cgaGFzaCB0YWJsZSAqLworICBnX2hhc2hfdGFibGVfdW5yZWYgKHNlbGYtPmxvZyk7CisgIHNlbGYtPmxvZyA9IE5VTEw7CisKKyAgLyogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcyAqLworICBHX09CSkVDVF9DTEFTUyAodHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX3BhcmVudF9jbGFzcyktPgorICAgIGZpbmFsaXplIChvYmplY3QpOworfQorCisvKiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyJ3MgaW5zdGFuY2UgaW5pdGlhbGl6ZXIgKGNvbnN0cnVjdG9yKSAqLworc3RhdGljIHZvaWQKK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9pbml0IChUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpzZWxmKQoreworICAvKiBDcmVhdGUgb3VyIGNhbGN1bGF0aW9uLWxvZyBoYXNoIHRhYmxlICovCisgIHNlbGYtPmxvZyA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfdW5yZWYpOworfQorCisvKiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyJ3MgY2xhc3MgaW5pdGlhbGl6ZXIgKi8KK3N0YXRpYyB2b2lkCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3NfaW5pdCAoVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgU2hhcmVkU2VydmljZUhhbmRsZXJDbGFzcyAqc2hhcmVkX3NlcnZpY2VfaGFuZGxlcl9jbGFzcyA9CisgICAgU0hBUkVEX1NFUlZJQ0VfSEFORExFUl9DTEFTUyAoa2xhc3MpOworICBDYWxjdWxhdG9ySGFuZGxlckNsYXNzICpjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MgPQorICAgIENBTENVTEFUT1JfSEFORExFUl9DTEFTUyAoa2xhc3MpOworCisgIC8qIFJlZ2lzdGVyIG91ciBkZXN0cnVjdG9yICovCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2ZpbmFsaXplOworCisgIC8qIFJlZ2lzdGVyIG91ciBpbXBsZW1lbnRhdGlvbnMgb2YgQ2FsY3VsYXRvckhhbmRsZXIncyBtZXRob2RzICovCisgIGNhbGN1bGF0b3JfaGFuZGxlcl9jbGFzcy0+cGluZyA9CisgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX3Bpbmc7CisgIGNhbGN1bGF0b3JfaGFuZGxlcl9jbGFzcy0+YWRkID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfYWRkOworICBjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MtPmNhbGN1bGF0ZSA9CisgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2NhbGN1bGF0ZTsKKyAgY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzLT56aXAgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl96aXA7CisKKyAgLyogUmVnaXN0ZXIgb3VyIGltcGxlbWVudGF0aW9uIG9mIFNoYXJlZFNlcnZpY2VIYW5kbGVyJ3MgbWV0aG9kICovCisgIHNoYXJlZF9zZXJ2aWNlX2hhbmRsZXJfY2xhc3MtPmdldF9zdHJ1Y3QgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9nZXRfc3RydWN0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoYXQgZW5kcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlci4KKyAgIEV2ZXJ5dGhpbmcgYmVsb3cgaXMgZmFpcmx5IGdlbmVyaWMgY29kZSB0aGF0IHNldHMgdXAgYSBtaW5pbWFsCisgICBUaHJpZnQgc2VydmVyIGZvciB0dXRvcmlhbCBjbGllbnRzLiAqLworCisKKy8qIE91ciBzZXJ2ZXIgb2JqZWN0LCBkZWNsYXJlZCBnbG9iYWxseSBzbyBpdCBpcyBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUKKyAgIFNJR0lOVCBzaWduYWwgaGFuZGxlciAqLworVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCisvKiBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VydmVyIHdhcyBpbnRlcnJ1cHRlZCB3aXRoCisgICBTSUdJTlQgKGkuZS4gQ3RybC1DKSBzbyB3ZSBjYW4gdGVsbCB3aGV0aGVyIGl0cyB0ZXJtaW5hdGlvbiB3YXMKKyAgIGFibm9ybWFsICovCitnYm9vbGVhbiBzaWdpbnRfcmVjZWl2ZWQgPSBGQUxTRTsKKworLyogSGFuZGxlIFNJR0lOVCAoIkN0cmwtQyIpIHNpZ25hbHMgYnkgZ3JhY2VmdWxseSBzdG9wcGluZyB0aGUKKyAgIHNlcnZlciAqLworc3RhdGljIHZvaWQKK3NpZ2ludF9oYW5kbGVyIChpbnQgc2lnbmFsX251bWJlcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNpZ25hbF9udW1iZXIpOworCisgIC8qIFRha2Ugbm90ZSB3ZSB3ZXJlIGNhbGxlZCAqLworICBzaWdpbnRfcmVjZWl2ZWQgPSBUUlVFOworCisgIC8qIFNodXQgZG93biB0aGUgc2VydmVyIGdyYWNlZnVsbHkgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIHRocmlmdF9zZXJ2ZXJfc3RvcCAoc2VydmVyKTsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKmhhbmRsZXI7CisgIENhbGN1bGF0b3JQcm9jZXNzb3IgKnByb2Nlc3NvcjsKKworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKnRyYW5zcG9ydF9mYWN0b3J5OworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKnByb3RvY29sX2ZhY3Rvcnk7CisKKyAgc3RydWN0IHNpZ2FjdGlvbiBzaWdpbnRfYWN0aW9uOworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBpbnQgZXhpdF9zdGF0dXMgPSAwOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICAvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Ygb3VyIGhhbmRsZXIsIHdoaWNoIHByb3ZpZGVzIHRoZSBzZXJ2aWNlJ3MKKyAgICAgbWV0aG9kcycgaW1wbGVtZW50YXRpb24gKi8KKyAgaGFuZGxlciA9CisgICAgZ19vYmplY3RfbmV3IChUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSdzIHByb2Nlc3NvciwgYXV0b21hdGljYWxseQorICAgICBnZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlciwgd2hpY2ggcGFyc2VzIGluY29taW5nIG1lc3NhZ2VzCisgICAgIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBpbiB0aGUgaGFuZGxlciAqLworICBwcm9jZXNzb3IgPQorICAgIGdfb2JqZWN0X25ldyAoVFlQRV9DQUxDVUxBVE9SX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSBvdXIgc2VydmVyIHNvY2tldCwgd2hpY2ggYmluZHMgdG8gdGhlIHNwZWNpZmllZCBwb3J0IGFuZAorICAgICBsaXN0ZW5zIGZvciBjbGllbnQgY29ubmVjdGlvbnMgKi8KKyAgc2VydmVyX3RyYW5zcG9ydCA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgInBvcnQiLCA5MDkwLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogQ3JlYXRlIG91ciB0cmFuc3BvcnQgZmFjdG9yeSwgdXNlZCBieSB0aGUgc2VydmVyIHRvIHdyYXAgInJhdyIKKyAgICAgaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSB0aGUgY2xpZW50IChpbiB0aGlzIGNhc2Ugd2l0aCBhCisgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UpICovCisgIHRyYW5zcG9ydF9mYWN0b3J5ID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogQ3JlYXRlIG91ciBwcm90b2NvbCBmYWN0b3J5LCB3aGljaCBkZXRlcm1pbmVzIHdoaWNoIHdpcmUgcHJvdG9jb2wKKyAgICAgdGhlIHNlcnZlciB3aWxsIHVzZSAoaW4gdGhpcyBjYXNlLCBUaHJpZnQncyBiaW5hcnkgcHJvdG9jb2wpICovCisgIHByb3RvY29sX2ZhY3RvcnkgPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgdGhlIHNlcnZlciBpdHNlbGYgKi8KKyAgc2VydmVyID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsCisgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgInNlcnZlcl90cmFuc3BvcnQiLCAgICAgICAgIHNlcnZlcl90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSIsICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogSW5zdGFsbCBvdXIgU0lHSU5UIGhhbmRsZXIsIHdoaWNoIGhhbmRsZXMgQ3RybC1DIGJlaW5nIHByZXNzZWQgYnkKKyAgICAgc3RvcHBpbmcgdGhlIHNlcnZlciBncmFjZWZ1bGx5IChub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgYQorICAgICBuaWNlIHRvdWNoKSAqLworICBtZW1zZXQgKCZzaWdpbnRfYWN0aW9uLCAwLCBzaXplb2YgKHNpZ2ludF9hY3Rpb24pKTsKKyAgc2lnaW50X2FjdGlvbi5zYV9oYW5kbGVyID0gc2lnaW50X2hhbmRsZXI7CisgIHNpZ2ludF9hY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7CisgIHNpZ2FjdGlvbiAoU0lHSU5ULCAmc2lnaW50X2FjdGlvbiwgTlVMTCk7CisKKyAgLyogU3RhcnQgdGhlIHNlcnZlciwgd2hpY2ggd2lsbCBydW4gdW50aWwgaXRzIHN0b3AgbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKGZyb20gd2l0aGluIHRoZSBTSUdJTlQgaGFuZGxlciwgaW4gdGhpcyBjYXNlKSAqLworICBwdXRzICgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICB0aHJpZnRfc2VydmVyX3NlcnZlIChzZXJ2ZXIsICZlcnJvcik7CisKKyAgLyogSWYgdGhlIHNlcnZlciBzdG9wcGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gaGF2aW5nIGJlZW4KKyAgICAgaW50ZXJydXB0ZWQgYnkgdGhlIHVzZXIsIHJlcG9ydCB0aGUgZXJyb3IgKi8KKyAgaWYgKCFzaWdpbnRfcmVjZWl2ZWQpIHsKKyAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisgICAgICAgICAgICAgICBlcnJvciAhPSBOVUxMID8gZXJyb3ItPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgfQorCisgIHB1dHMgKCJkb25lLiIpOworCisgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKworICBnX29iamVjdF91bnJlZiAocHJvY2Vzc29yKTsKKyAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXIpOworCisgIHJldHVybiBleGl0X3N0YXR1czsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIyMDEzYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXR1cC1sb2NhbC1saXNwLWVudjogZW5zdXJlLWV4dGVybmFscy5zaAorCWJhc2ggZW5zdXJlLWV4dGVybmFscy5zaAorCitnZW4tY2w6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNsIC1yICQ8CisKK0FMTF9GSUxFX1BSRVJFUVMgPSBcCisJCSAgIGxvYWQtbG9jYWxseS5saXNwIFwKKwkJICAgbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBcCisJCSAgIG1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AgXAorCQkgICBzaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJCSAgIHRocmlmdC10dXRvcmlhbC5hc2QgXAorCQkgICB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCisKKyMgTk9URTogdGhlIHNlcnZlciBhbmQgY2xpZW50IGNhbm5vdCBiZSBidWlsdCBpbiBwYXJhbGxlbAorIyBiZWNhdXNlIG9uIGxvYWRpbmcgdGhlIG1ha2UtdHV0b3JpYWwtKiBzY3JpcHRzIFNCQ0wgd2lsbAorIyBhdHRlbXB0IHRvIGNvbXBpbGUgdGhlaXIgZGVwZW5kZW5jaWVzLiBVbmZvcnR1bmF0ZWx5LAorIyBiZWNhdXNlIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgc2hhcmVkLCBwYXJhbGxlbCBqb2JzIGNhbgorIyBlbmQgdXAgb3ZlcndyaXRpbmcgb3IgY29ycnVwdGluZyB0aGUgY29tcGlsZWQgZmlsZXMKK2FsbC1sb2NhbDogZ2VuLWNsIHNldHVwLWxvY2FsLWxpc3AtZW52ICQoQUxMX0ZJTEVfUFJFUkVRUykKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vVHV0b3JpYWxTZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCS4vVHV0b3JpYWxDbGllbnQKKworY2xlYW4tbG9jYWw6CisJLSQoUk0pIC1yIGdlbi0qCisJLSQoUk0pIC1yIGV4dGVybmFscworCS0kKFJNKSAtciBxdWlja2xpc3AKKwktJChSTSkgLXIgbGliCisJLSQoUk0pIHF1aWNrbGlzcC5saXNwCisJLSQoUk0pIGJhY2twb3J0LXVwZGF0ZS56aXAKKwktJChSTSkgc2hhcmVkLWltcGxlbWVudGF0aW9uLmZhc2wKKwktJChSTSkgdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAorCS0kKFJNKSBUdXRvcmlhbFNlcnZlcgorCS0kKFJNKSBUdXRvcmlhbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCXR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCXNoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwl0aHJpZnQtdHV0b3JpYWwuYXNkIFwKKwltYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIFwKKwltYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoIGIvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41YWU4YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxIEBACisuLi8uLi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwIGIvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyYTBhMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwCkBAIC0wLDAgKzEsMjIgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IEp1c3QgYSBzY3JpcHQgZm9yIGxvYWRpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCB1c2luZyBidW5kbGVkIGRlcGVuZGVuY2llcy4KKzs7OzsgVGhpcyBpcyBhbiBpZGVudGljYWwgY29weSBvZiB0aGUgZmlsZSBpbiBsaWIvY2wuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCkBAIC0wLDAgKzEsNTEgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJsb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9zaGFyZWQvdGhyaWZ0LWdlbi1zaGFyZWQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3R1dG9yaWFsL3RocmlmdC1nZW4tdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAidGhyaWZ0LXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdHV0b3JpYWwpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIHRoZSBiaW5hcnkuIgorICAodGhyaWZ0OndpdGgtY2xpZW50IChwcm90ICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkwIikKKyAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3QpCisgICAgKGZvcm1hdCB0ICJwaW5nKCl+JSIpCisgICAgKGZvcm1hdCB0ICIxICsgMSA9IH5hfiUiICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90IDEgMSkpCisgICAgKGxldCAoKHdvcmstaW5zdGFuY2UgKHR1dG9yaWFsOm1ha2Utd29yayA6bnVtMSA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtMiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3AgdHV0b3JpYWw6b3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbW1lbnQgIkJvb3lhISIpKSkKKyAgICAgIChoYW5kbGVyLWNhc2UgKGZvcm1hdCB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLyAwID0gfmEgLSBPaCwgcmVhbGx5PyBBbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gaGVyZS5+JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdCAxIHdvcmstaW5zdGFuY2UpKQorICAgICAgICAodHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbiAoZSkKKyAgICAgICAgICAoZm9ybWF0IHQgIi0tLX4lKEV4cGVjdGVkKSBJbnZhbGlkIE9wZXJhdGlvbiBjYXVnaHQ6IH4lfmF+JS0tLX4lIiBlKSkpKQorICAgIChsZXQgKCh3b3JrLWluc3RhbmNlICh0dXRvcmlhbDptYWtlLXdvcmsgOm51bTEgMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudW0yIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3AgdHV0b3JpYWw6b3BlcmF0aW9uLnN1YnRyYWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tbWVudCAiUGxheWluZyBuaWNlIHRoaXMgdGltZS4iKSkpCisgICAgICAoaGFuZGxlci1jYXNlIChmb3JtYXQgdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxNSAtIDEwID0gfmF+JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdCAxIHdvcmstaW5zdGFuY2UpKQorICAgICAgICAodHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbiAoZSkKKyAgICAgICAgICAoZm9ybWF0IHQgIi0tLX4lKFVuZXhwZWN0ZWQpIEludmFsaWQgT3BlcmF0aW9uIGNhdWdodDogfiV+YX4lLS0tfiUiIGUpKSkpCisgICAgKGZvcm1hdCB0ICJDaGVjayBsb2c6IH5hfiUiIChzaGFyZWQuc2hhcmVkLXNlcnZpY2U6Z2V0LXN0cnVjdCBwcm90IDEpKSkpCisKKyhjbG9uOmR1bXAgIlR1dG9yaWFsQ2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmMWE5MAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKQEAgLTAsMCArMSwyOSBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImxvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3NoYXJlZC90aHJpZnQtZ2VuLXNoYXJlZC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvdHV0b3JpYWwvdGhyaWZ0LWdlbi10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJ0aHJpZnQtdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10dXRvcmlhbCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3IgdGhlIGJpbmFyeS4iCisgICh0aHJpZnQ6c2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTAiIHR1dG9yaWFsOmNhbGN1bGF0b3IpKQorCisoY2xvbjpkdW1wICJUdXRvcmlhbFNlcnZlciIgbWFpbikKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIGIvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NzYyNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsMjUgQEAKKyhpbi1wYWNrYWdlICM6c2hhcmVkLWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ2YXIgKnN0cnVjdHMqIChtYWtlLWhhc2gtdGFibGUpKQorCisoZGVmdW4gc2hhcmVkLnNoYXJlZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmdldC1zdHJ1Y3QgKGtleSkKKyAgKGZvcm1hdCB0ICJnZXRTdHJ1Y3QofmEpfiUiIGtleSkKKyAgKGdldGhhc2gga2V5ICpzdHJ1Y3RzKikpCisKKyhkZWZ1biBhZGQtbG9nIChrZXkgdmFsdWUpCisgIChzZXRmIChnZXRoYXNoIGtleSAqc3RydWN0cyopCisgICAgICAgIChtYWtlLWluc3RhbmNlICdzaGFyZWQ6c2hhcmVkc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgIDprZXkga2V5CisgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSAod3JpdGUtdG8tc3RyaW5nIHZhbHVlKSkpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZCBiL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwMzUzNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QKQEAgLTAsMCArMSwxNyBAQAorOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoYXNkZjpkZWZzeXN0ZW0gIzp0aHJpZnQtdHV0b3JpYWwKKyAgOmRlcGVuZHMtb24gKCM6dGhyaWZ0LWdlbi10dXRvcmlhbCkKKyAgOnNlcmlhbCB0CisgIDpjb21wb25lbnRzICgoOmZpbGUgInNoYXJlZC1pbXBsZW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAoOmZpbGUgInR1dG9yaWFsLWltcGxlbWVudGF0aW9uIikpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcCBiL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5MmZlNAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSw0MSBAQAorKGluLXBhY2thZ2UgIzp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgIChmb3JtYXQgdCAicGluZygpfiUiKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246YWRkIChudW0xIG51bTIpCisgIChmb3JtYXQgdCAiYWRkKH5hLCB+YSl+JSIgbnVtMSBudW0yKQorICAoKyBudW0xIG51bTIpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpjYWxjdWxhdGUgKGxvZ2lkIHdvcmspCisgIChmb3JtYXQgdCAiY2FsY3VsYXRlKH5hLCB+YSl+JSIgbG9naWQgd29yaykKKyAgKGhhbmRsZXItY2FzZQorICAgICAgKGxldCogKChudW0xICh0dXRvcmlhbDp3b3JrLW51bTEgd29yaykpCisgICAgICAgICAgICAgKG51bTIgKHR1dG9yaWFsOndvcmstbnVtMiB3b3JrKSkKKyAgICAgICAgICAgICAob3AgKHR1dG9yaWFsOndvcmstb3Agd29yaykpCisgICAgICAgICAgICAgKHJlc3VsdAorICAgICAgICAgICAgICAoY29uZAorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uYWRkKSAoKyBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uc3VidHJhY3QpICgtIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5tdWx0aXBseSkgKCogbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLmRpdmlkZSkgKC8gbnVtMSBudW0yKSkpKSkKKyAgICAgICAgKHNoYXJlZC1pbXBsZW1lbnRhdGlvbjo6YWRkLWxvZyBsb2dpZCByZXN1bHQpCisgICAgICAgIHJlc3VsdCkKKyAgICAoZGl2aXNpb24tYnktemVybyAoKSAoZXJyb3IgJ3R1dG9yaWFsOmludmFsaWRvcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndoeSAiRGl2aXNpb24gYnkgemVyby4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aGF0LW9wICh0dXRvcmlhbDp3b3JrLW9wIHdvcmspKSkpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjp6aXAgKCkKKyAgKGZvcm1hdCB0ICJ6aXAoKX4lIikpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzNGI0MQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDU2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQorCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworc2V0KHR1dG9yaWFsZ2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwCisgICAgZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAKKyAgICBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5jcHAKKyAgICBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcAorKQorYWRkX2xpYnJhcnkodHV0b3JpYWxnZW5jcHAgU1RBVElDICR7dHV0b3JpYWxnZW5jcHBfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodHV0b3JpYWxnZW5jcHAgdGhyaWZ0KQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwIGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgLXIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorKQorCithZGRfZXhlY3V0YWJsZShUdXRvcmlhbFNlcnZlciBDcHBTZXJ2ZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyIHR1dG9yaWFsZ2VuY3BwKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFR1dG9yaWFsU2VydmVyIHRocmlmdCkKK2lmIChaTElCX0ZPVU5EKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxTZXJ2ZXIgJHtaTElCX0xJQlJBUklFU30pCitlbmRpZiAoKQorCithZGRfZXhlY3V0YWJsZShUdXRvcmlhbENsaWVudCBDcHBDbGllbnQuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50IHR1dG9yaWFsZ2VuY3BwKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFR1dG9yaWFsQ2xpZW50IHRocmlmdCkKK2lmIChaTElCX0ZPVU5EKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxDbGllbnQgJHtaTElCX0xJQlJBUklFU30pCitlbmRpZiAoKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAgYi90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcAppbmRleCA0ZGFjOTBjLi41MjA4NDExIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcAorKysgYi90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcApAQCAtMTcsMTMgKzE3LDExIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgogCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAKICNpbmNsdWRlICIuLi9nZW4tY3BwL0NhbGN1bGF0b3IuaCIKIApAQCAtMzUsMjIgKzMzLDE5IEBACiB1c2luZyBuYW1lc3BhY2UgdHV0b3JpYWw7CiB1c2luZyBuYW1lc3BhY2Ugc2hhcmVkOwogCi11c2luZyBuYW1lc3BhY2UgYm9vc3Q7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKK2ludCBtYWluKCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKICAgQ2FsY3VsYXRvckNsaWVudCBjbGllbnQocHJvdG9jb2wpOwogCiAgIHRyeSB7CiAgICAgdHJhbnNwb3J0LT5vcGVuKCk7CiAKICAgICBjbGllbnQucGluZygpOwotICAgIHByaW50ZigicGluZygpXG4iKTsKKyAgICBjb3V0IDw8ICJwaW5nKCkiIDw8IGVuZGw7CiAKLSAgICBpbnQzMl90IHN1bSA9IGNsaWVudC5hZGQoMSwxKTsKLSAgICBwcmludGYoIjErMT0lZFxuIiwgc3VtKTsKKyAgICBjb3V0IDw8ICIxICsgMSA9ICIgPDwgY2xpZW50LmFkZCgxLCAxKSA8PCBlbmRsOwogCiAgICAgV29yayB3b3JrOwogICAgIHdvcmsub3AgPSBPcGVyYXRpb246OkRJVklERTsKQEAgLTU4LDI3ICs1MywyOCBAQAogICAgIHdvcmsubnVtMiA9IDA7CiAKICAgICB0cnkgewotICAgICAgaW50MzJfdCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICBwcmludGYoIldob2E/IFdlIGNhbiBkaXZpZGUgYnkgemVybyFcbiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gJmlvKSB7Ci0gICAgICBwcmludGYoIkludmFsaWRPcGVyYXRpb246ICVzXG4iLCBpby53aHkuY19zdHIoKSk7CisgICAgICBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgICAgY291dCA8PCAiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvISIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uJiBpbykgeworICAgICAgY291dCA8PCAiSW52YWxpZE9wZXJhdGlvbjogIiA8PCBpby53aHkgPDwgZW5kbDsKKyAgICAgIC8vIG9yIHVzaW5nIGdlbmVyYXRlZCBvcGVyYXRvcjw8OiBjb3V0IDw8IGlvIDw8IGVuZGw7CisgICAgICAvLyBvciBieSB1c2luZyBzdGQ6OmV4Y2VwdGlvbiBuYXRpdmUgbWV0aG9kIHdoYXQoKTogY291dCA8PCBpby53aGF0KCkgPDwgZW5kbDsKICAgICB9CiAKICAgICB3b3JrLm9wID0gT3BlcmF0aW9uOjpTVUJUUkFDVDsKICAgICB3b3JrLm51bTEgPSAxNTsKICAgICB3b3JrLm51bTIgPSAxMDsKICAgICBpbnQzMl90IGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgIHByaW50ZigiMTUtMTA9JWRcbiIsIGRpZmYpOworICAgIGNvdXQgPDwgIjE1IC0gMTAgPSAiIDw8IGRpZmYgPDwgZW5kbDsKIAogICAgIC8vIE5vdGUgdGhhdCBDKysgdXNlcyByZXR1cm4gYnkgcmVmZXJlbmNlIGZvciBjb21wbGV4IHR5cGVzIHRvIGF2b2lkCiAgICAgLy8gY29zdGx5IGNvcHkgY29uc3RydWN0aW9uCiAgICAgU2hhcmVkU3RydWN0IHNzOwogICAgIGNsaWVudC5nZXRTdHJ1Y3Qoc3MsIDEpOwotICAgIHByaW50ZigiQ2hlY2sgbG9nOiAlc1xuIiwgc3MudmFsdWUuY19zdHIoKSk7CisgICAgY291dCA8PCAiUmVjZWl2ZWQgbG9nOiAiIDw8IHNzIDw8IGVuZGw7CiAKICAgICB0cmFuc3BvcnQtPmNsb3NlKCk7Ci0gIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgcHJpbnRmKCJFUlJPUjogJXNcbiIsIHR4LndoYXQoKSk7CisgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7CisgICAgY291dCA8PCAiRVJST1I6ICIgPDwgdHgud2hhdCgpIDw8IGVuZGw7CiAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAgYi90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcAppbmRleCA4NjAzODFlLi5mNzM3OWQ1IDEwMDY0NAotLS0gYS90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcAorKysgYi90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcApAQCAtMTcsMTQgKzE3LDE2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KQEAgLTM0LDYgKzM2LDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKQEAgLTQxLDIzICs0NCwxOSBAQAogdXNpbmcgbmFtZXNwYWNlIHR1dG9yaWFsOwogdXNpbmcgbmFtZXNwYWNlIHNoYXJlZDsKIAotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IHB1YmxpYyBDYWxjdWxhdG9ySWYgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ2FsY3VsYXRvckhhbmRsZXIoKSB7fQogCi0gIHZvaWQgcGluZygpIHsKLSAgICBwcmludGYoInBpbmcoKVxuIik7Ci0gIH0KKyAgdm9pZCBwaW5nKCkgeyBjb3V0IDw8ICJwaW5nKCkiIDw8IGVuZGw7IH0KIAogICBpbnQzMl90IGFkZChjb25zdCBpbnQzMl90IG4xLCBjb25zdCBpbnQzMl90IG4yKSB7Ci0gICAgcHJpbnRmKCJhZGQoJWQsJWQpXG4iLCBuMSwgbjIpOworICAgIGNvdXQgPDwgImFkZCgiIDw8IG4xIDw8ICIsICIgPDwgbjIgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIG4xICsgbjI7CiAgIH0KIAotICBpbnQzMl90IGNhbGN1bGF0ZShjb25zdCBpbnQzMl90IGxvZ2lkLCBjb25zdCBXb3JrICZ3b3JrKSB7Ci0gICAgcHJpbnRmKCJjYWxjdWxhdGUoJWQseyVkLCVkLCVkfSlcbiIsIGxvZ2lkLCB3b3JrLm9wLCB3b3JrLm51bTEsIHdvcmsubnVtMik7CisgIGludDMyX3QgY2FsY3VsYXRlKGNvbnN0IGludDMyX3QgbG9naWQsIGNvbnN0IFdvcmsmIHdvcmspIHsKKyAgICBjb3V0IDw8ICJjYWxjdWxhdGUoIiA8PCBsb2dpZCA8PCAiLCAiIDw8IHdvcmsgPDwgIikiIDw8IGVuZGw7CiAgICAgaW50MzJfdCB2YWw7CiAKICAgICBzd2l0Y2ggKHdvcmsub3ApIHsKQEAgLTczLDcgKzcyLDcgQEAKICAgICBjYXNlIE9wZXJhdGlvbjo6RElWSURFOgogICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CiAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW87Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOwogICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgdGhyb3cgaW87CiAgICAgICB9CkBAIC04MSw3NCArODAsMTAwIEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbzsKLSAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgIGlvLndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CiAgICAgICB0aHJvdyBpbzsKICAgICB9CiAKICAgICBTaGFyZWRTdHJ1Y3Qgc3M7CiAgICAgc3Mua2V5ID0gbG9naWQ7Ci0gICAgY2hhciBidWZmZXJbMTJdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCIsIHZhbCk7Ci0gICAgc3MudmFsdWUgPSBidWZmZXI7CisgICAgc3MudmFsdWUgPSB0b19zdHJpbmcodmFsKTsKIAogICAgIGxvZ1tsb2dpZF0gPSBzczsKIAogICAgIHJldHVybiB2YWw7CiAgIH0KIAotICB2b2lkIGdldFN0cnVjdChTaGFyZWRTdHJ1Y3QgJnJldCwgY29uc3QgaW50MzJfdCBsb2dpZCkgewotICAgIHByaW50ZigiZ2V0U3RydWN0KCVkKVxuIiwgbG9naWQpOworICB2b2lkIGdldFN0cnVjdChTaGFyZWRTdHJ1Y3QmIHJldCwgY29uc3QgaW50MzJfdCBsb2dpZCkgeworICAgIGNvdXQgPDwgImdldFN0cnVjdCgiIDw8IGxvZ2lkIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldCA9IGxvZ1tsb2dpZF07CiAgIH0KIAotICB2b2lkIHppcCgpIHsKLSAgICBwcmludGYoInppcCgpXG4iKTsKLSAgfQorICB2b2lkIHppcCgpIHsgY291dCA8PCAiemlwKCkiIDw8IGVuZGw7IH0KIAogcHJvdGVjdGVkOgogICBtYXA8aW50MzJfdCwgU2hhcmVkU3RydWN0PiBsb2c7Ci0KIH07CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworLyoKKyAgQ2FsY3VsYXRvcklmRmFjdG9yeSBpcyBjb2RlIGdlbmVyYXRlZC4KKyAgQ2FsY3VsYXRvckNsb25lRmFjdG9yeSBpcyB1c2VmdWwgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUKKyAgdHJhbnNwb3J0LiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIG1ha2luZyBwZXItY29ubmVjdGlvbiBzdGF0ZS4gIFdpdGhvdXQgdGhpcworICBDbG9uZUZhY3RvcnksIGFsbCBjb25uZWN0aW9ucyB3aWxsIGVuZCB1cCBzaGFyaW5nIHRoZSBzYW1lIGhhbmRsZXIgaW5zdGFuY2UuCisqLworY2xhc3MgQ2FsY3VsYXRvckNsb25lRmFjdG9yeSA6IHZpcnR1YWwgcHVibGljIENhbGN1bGF0b3JJZkZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q2FsY3VsYXRvckNsb25lRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgQ2FsY3VsYXRvcklmKiBnZXRIYW5kbGVyKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29jayA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNvY2tldD4oY29ubkluZm8udHJhbnNwb3J0KTsKKyAgICBjb3V0IDw8ICJJbmNvbWluZyBjb25uZWN0aW9uXG4iOworICAgIGNvdXQgPDwgIlx0U29ja2V0SW5mbzogIiAgPDwgc29jay0+Z2V0U29ja2V0SW5mbygpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVySG9zdDogIiAgICA8PCBzb2NrLT5nZXRQZWVySG9zdCgpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVyQWRkcmVzczogIiA8PCBzb2NrLT5nZXRQZWVyQWRkcmVzcygpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVyUG9ydDogIiAgICA8PCBzb2NrLT5nZXRQZWVyUG9ydCgpIDw8ICJcbiI7CisgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9ySGFuZGxlcjsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIDo6c2hhcmVkOjpTaGFyZWRTZXJ2aWNlSWYqIGhhbmRsZXIpIHsKKyAgICBkZWxldGUgaGFuZGxlcjsKKyAgfQorfTsKIAotICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgc2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4gaGFuZGxlcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpKTsKLSAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworaW50IG1haW4oKSB7CisgIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKIAotICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLQotCi0gIC8qKgotICAgKiBPciB5b3UgY291bGQgZG8gb25lIG9mIHRoZXNlCi0KLSAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KLSAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLSAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpOwotCi0gIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KKyAgLyoKKyAgLy8gaWYgeW91IGRvbid0IG5lZWQgcGVyLWNvbm5lY3Rpb24gc3RhdGUsIGRvIHRoZSBmb2xsb3dpbmcgaW5zdGVhZAorICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAgICovCiAKLSAgcHJpbnRmKCJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iKTsKKyAgLyoqCisgICAqIEhlcmUgYXJlIHNvbWUgYWx0ZXJuYXRlIHNlcnZlciB0eXBlcy4uLgorCisgIC8vIFRoaXMgc2VydmVyIG9ubHkgYWxsb3dzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZSwgYnV0IHNwYXducyBubyB0aHJlYWRzCisgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBjb25zdCBpbnQgd29ya2VyQ291bnQgPSA0OworCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KKyAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKyAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSgKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4oKSk7CisgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisKKyAgLy8gVGhpcyBzZXJ2ZXIgYWxsb3dzICJ3b3JrZXJDb3VudCIgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGFuZCByZXVzZXMgdGhyZWFkcworICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCksCisgICAgdGhyZWFkTWFuYWdlcik7CisgICovCisKKyAgY291dCA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIgPDwgZW5kbDsKICAgc2VydmVyLnNlcnZlKCk7Ci0gIHByaW50ZigiZG9uZS5cbiIpOworICBjb3V0IDw8ICJEb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzRkZWUuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUJPT1NUX0RJUiA9IC91c3IvbG9jYWwvYm9vc3QvaW5jbHVkZS9ib29zdC0xXzMzXzEvCi1USFJJRlRfRElSID0gL3Vzci9sb2NhbC9pbmNsdWRlL3RocmlmdAotTElCX0RJUiA9IC91c3IvbG9jYWwvbGliCi0KLUdFTl9TUkMgPSAuLi9nZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIC4uL2dlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCAuLi9nZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcCAuLi9nZW4tY3BwL0NhbGN1bGF0b3IuY3BwCi0KLWRlZmF1bHQ6IHNlcnZlciBjbGllbnQKLQotc2VydmVyOiBDcHBTZXJ2ZXIuY3BwCi0JZysrIC1vIENwcFNlcnZlciAtSSR7VEhSSUZUX0RJUn0gLUkke0JPT1NUX0RJUn0gIC1JLi4vZ2VuLWNwcCAtTCR7TElCX0RJUn0gLWx0aHJpZnQgQ3BwU2VydmVyLmNwcCAke0dFTl9TUkN9Ci0KLWNsaWVudDogQ3BwQ2xpZW50LmNwcAotCWcrKyAtbyBDcHBDbGllbnQgLUkke1RIUklGVF9ESVJ9IC1JJHtCT09TVF9ESVJ9ICAtSS4uL2dlbi1jcHAgLUwke0xJQl9ESVJ9IC1sdGhyaWZ0IENwcENsaWVudC5jcHAgJHtHRU5fU1JDfQotCi1jbGVhbjoKLQkkKFJNKSAtciBDcHBDbGllbnQgQ3BwU2VydmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDljZjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidHV0b3JpYWxnZW5jcHAubGEKK25vZGlzdF9saWJ0dXRvcmlhbGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgXAorCWdlbi1jcHAvQ2FsY3VsYXRvci5oIFwKKwlnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NoYXJlZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9zaGFyZWRfdHlwZXMuaCBcCisJZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5oCisKKworCitsaWJ0dXRvcmlhbGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworbm9pbnN0X1BST0dSQU1TID0gXAorCVR1dG9yaWFsU2VydmVyIFwKKwlUdXRvcmlhbENsaWVudAorCitUdXRvcmlhbFNlcnZlcl9TT1VSQ0VTID0gXAorCUNwcFNlcnZlci5jcHAKKworVHV0b3JpYWxTZXJ2ZXJfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitUdXRvcmlhbENsaWVudF9TT1VSQ0VTID0gXAorCUNwcENsaWVudC5jcHAKKworVHV0b3JpYWxDbGllbnRfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCitnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgLXIgJDwKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKExJQkVWRU5UX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUlnZW4tY3BwCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jcHAvKgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJLi9UdXRvcmlhbFNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJLi9UdXRvcmlhbENsaWVudAorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKKworRVhUUkFfRElTVCA9IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJQ3BwQ2xpZW50LmNwcCBcCisJQ3BwU2VydmVyLmNwcApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcwppbmRleCA4Y2UxMDg1Li4xMTNhNDcyIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcwpAQCAtMzcsNDUgKzM3LDUwIEBACiAgICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKIAogICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7Ci0KLSAgICAgICAgICAgICAgICBjbGllbnQucGluZygpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKLQotICAgICAgICAgICAgICAgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsIDEpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxKzE9ezB9Iiwgc3VtKTsKLQotICAgICAgICAgICAgICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7Ci0KLSAgICAgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRJVklERTsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTEgPSAxOwotICAgICAgICAgICAgICAgIHdvcmsuTnVtMiA9IDA7CiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby5XaHkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LnBpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInBpbmcoKSIpOwogCi0gICAgICAgICAgICAgICAgd29yay5PcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjE1LTEwPXswfSIsIGRpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLldoeSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjErMT17MH0iLCBzdW0pOwogCi0gICAgICAgICAgICAgICAgU2hhcmVkU3RydWN0IGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNoZWNrIGxvZzogezB9IiwgbG9nLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKIAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRJVklERTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0xID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICAgICAgICAgIHdvcmsuTnVtMSA9IDE1OworICAgICAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxNS0xMD17MH0iLCBkaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2hlY2sgbG9nOiB7MH0iLCBsb2cuVmFsdWUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvagppbmRleCA1MTdhZDgzLi4xZWE3ZmY2IDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2oKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3Nwcm9qCkBAIC0xLDg4ICsxLDExMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQotICAgIDxQcm9qZWN0R3VpZD57MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfTwvUHJvamVjdEd1aWQ+DQotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4NCi0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KLSAgICA8Um9vdE5hbWVzcGFjZT5Dc2hhcnBDbGllbnQ8L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwQ2xpZW50PC9Bc3NlbWJseU5hbWU+DQotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCi0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+DQotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCi0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCi0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPg0KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCi0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQotICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXGJpblxSZWxlYXNlXFRocmlmdC5kbGw8L0hpbnRQYXRoPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwQ2xpZW50LmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXENvbnN0YW50cy5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxXb3JrLmNzIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICAtLT4NCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+Q3NoYXJwQ2xpZW50PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwQ2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXENhbGN1bGF0b3IuY3MiPgorICAgICAgPExpbms+Q2FsY3VsYXRvci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIj4KKyAgICAgIDxMaW5rPkludmFsaWRPcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcT3BlcmF0aW9uLmNzIj4KKyAgICAgIDxMaW5rPk9wZXJhdGlvbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIj4KKyAgICAgIDxMaW5rPlNoYXJlZFNlcnZpY2UuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU3RydWN0LmNzIj4KKyAgICAgIDxMaW5rPlNoYXJlZFN0cnVjdC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFx0dXRvcmlhbC5Db25zdGFudHMuY3MiPgorICAgICAgPExpbms+dHV0b3JpYWwuQ29uc3RhbnRzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFdvcmsuY3MiPgorICAgICAgPExpbms+V29yay5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTllYjYzYy1kNzRjLTQ3ZTgtYWU0OC1hMmZjOTQ1MzhlOWR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnB1c2hkICIkKFNvbHV0aW9uRGlyKSIKK3RocmlmdCAgLWdlbiBjc2hhcnAgICAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Citwb3BkCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGZmYmM0MGQuLjFmZjY1OGMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMSw1NSArMSw1NSBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQotDQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZw0KLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwQ2xpZW50IildDQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJDc2hhcnBDbGllbnQiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQotDQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlDQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQ0KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4NCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQ0KLVthc3NlbWJseTogR3VpZCgiMWE0NjEyMTQtZmEyOC00NTJhLWJkMWQtZDIzY2E4ZTk0N2UzIildDQotDQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCi0vLw0KLS8vICAgICAgTWFqb3IgVmVyc2lvbg0KLS8vICAgICAgTWlub3IgVmVyc2lvbg0KLS8vICAgICAgQnVpbGQgTnVtYmVyDQotLy8gICAgICBSZXZpc2lvbg0KLS8vDQotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMNCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildDQorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNzaGFycENsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjFhNDYxMjE0LWZhMjgtNDUyYS1iZDFkLWQyM2NhOGU5NDdlMyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCmluZGV4IDBkMzdjOTkuLjQzOTc5MGEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCkBAIC0xNSwxMTUgKzE1LDExNSBAQAogICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KLXVzaW5nIFRocmlmdC5TZXJ2ZXI7DQotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsNCi0NCi1uYW1lc3BhY2UgQ1NoYXJwVHV0b3JpYWwNCi17DQotICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IENhbGN1bGF0b3IuSWZhY2UNCi0gICAgew0KLSAgICAgICAgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gbG9nOw0KLQ0KLSAgICAgICAgcHVibGljIENhbGN1bGF0b3JIYW5kbGVyKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHBpbmcoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGQoezB9LHsxfSkiLCBuMSwgbjIpOw0KLSAgICAgICAgICAgIHJldHVybiBuMSArIG4yOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspDQotICAgICAgICB7DQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImNhbGN1bGF0ZSh7MH0sIFt7MX0sezJ9LHszfV0pIiwgbG9naWQsIHdvcmsuT3AsIHdvcmsuTnVtMSwgd29yay5OdW0yKTsNCi0gICAgICAgICAgICBpbnQgdmFsID0gMDsNCi0gICAgICAgICAgICBzd2l0Y2ggKHdvcmsuT3ApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKyB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLSB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmsuTnVtMiA9PSAwKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXQgPSAoaW50KXdvcmsuT3A7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLyB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0ID0gKGludCl3b3JrLk9wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsNCi0gICAgICAgICAgICBlbnRyeS5LZXkgPSBsb2dpZDsNCi0gICAgICAgICAgICBlbnRyeS5WYWx1ZSA9IHZhbC5Ub1N0cmluZygpOw0KLSAgICAgICAgICAgIGxvZ1tsb2dpZF0gPSBlbnRyeTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdmFsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZ2V0U3RydWN0KHswfSkiLCBrZXkpOw0KLSAgICAgICAgICAgIHJldHVybiBsb2dba2V5XTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHppcCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInppcCgpIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGNsYXNzIENTaGFycFNlcnZlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7DQotICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKTsNCi0gICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsNCi0gICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7DQotDQotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyDQotICAgICAgICAgICAgICAgIC8vIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7DQotDQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7DQotICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4LlN0YWNrVHJhY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIENTaGFycFR1dG9yaWFsCit7CisgICAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIDogQ2FsY3VsYXRvci5JZmFjZQorICAgIHsKKyAgICAgICAgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gbG9nOworCisgICAgICAgIHB1YmxpYyBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYWRkKHswfSx7MX0pIiwgbjEsIG4yKTsKKyAgICAgICAgICAgIHJldHVybiBuMSArIG4yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjYWxjdWxhdGUoezB9LCBbezF9LHsyfSx7M31dKSIsIGxvZ2lkLCB3b3JrLk9wLCB3b3JrLk51bTEsIHdvcmsuTnVtMik7CisgICAgICAgICAgICBpbnQgdmFsID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAod29yay5PcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSArIHdvcmsuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgICAgICBpZiAod29yay5OdW0yID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2hhdE9wID0gKGludCl3b3JrLk9wOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLyB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0T3AgPSAoaW50KXdvcmsuT3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaHkgPSAiVW5rbm93biBvcGVyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2hhcmVkU3RydWN0IGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgICAgICAgICAgZW50cnkuS2V5ID0gbG9naWQ7CisgICAgICAgICAgICBlbnRyeS5WYWx1ZSA9IHZhbC5Ub1N0cmluZygpOworICAgICAgICAgICAgbG9nW2xvZ2lkXSA9IGVudHJ5OworCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImdldFN0cnVjdCh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiBsb2dba2V5XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHppcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ6aXAoKSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENTaGFycFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhpcyBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICAgICAgICAgICAgIC8vIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvagppbmRleCBhYTJhYzE1Li4wNzQ4MTgwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2oKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3Nwcm9qCkBAIC0xLDg4ICsxLDExMSBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQotICAgIDxQcm9qZWN0R3VpZD57NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fTwvUHJvamVjdEd1aWQ+DQotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4NCi0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KLSAgICA8Um9vdE5hbWVzcGFjZT5Dc2hhcnBTZXJ2ZXI8L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwU2VydmVyPC9Bc3NlbWJseU5hbWU+DQotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCi0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+DQotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCi0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCi0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPg0KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCi0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQotICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXGJpblxSZWxlYXNlXFRocmlmdC5kbGw8L0hpbnRQYXRoPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwU2VydmVyLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXENvbnN0YW50cy5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxXb3JrLmNzIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICAtLT4NCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+Q3NoYXJwU2VydmVyPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwU2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXENhbGN1bGF0b3IuY3MiPgorICAgICAgPExpbms+Q2FsY3VsYXRvci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIj4KKyAgICAgIDxMaW5rPkludmFsaWRPcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcT3BlcmF0aW9uLmNzIj4KKyAgICAgIDxMaW5rPk9wZXJhdGlvbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIj4KKyAgICAgIDxMaW5rPlNoYXJlZFNlcnZpY2UuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU3RydWN0LmNzIj4KKyAgICAgIDxMaW5rPlNoYXJlZFN0cnVjdC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFx0dXRvcmlhbC5Db25zdGFudHMuY3MiPgorICAgICAgPExpbms+dHV0b3JpYWwuQ29uc3RhbnRzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFdvcmsuY3MiPgorICAgICAgPExpbms+V29yay5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTllYjYzYy1kNzRjLTQ3ZTgtYWU0OC1hMmZjOTQ1MzhlOWR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnB1c2hkICIkKFNvbHV0aW9uRGlyKSIKK3RocmlmdCAgLWdlbiBjc2hhcnAgICAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Citwb3BkCisKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CiA8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggOTk4MTE2My4uNzRmYTQ3NiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0xLDU1ICsxLDU1IEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCi0NCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nDQotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24NCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuDQotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkNzaGFycFNlcnZlciIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0NCi0NCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUNCi0vLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tDQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLg0KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldDQotDQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NDQotW2Fzc2VtYmx5OiBHdWlkKCJlM2I0MjhmNC1iMmU5LTRmYzEtOGEzNC04NGFiYzQzMzk4NjAiKV0NCi0NCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KLS8vDQotLy8gICAgICBNYWpvciBWZXJzaW9uDQotLy8gICAgICBNaW5vciBWZXJzaW9uDQotLy8gICAgICBCdWlsZCBOdW1iZXINCi0vLyAgICAgIFJldmlzaW9uDQotLy8NCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycw0KLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQotLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0NCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwU2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZTNiNDI4ZjQtYjJlOS00ZmMxLThhMzQtODRhYmM0MzM5ODYwIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4gYi90dXRvcmlhbC9jc2hhcnAvdHV0b3JpYWwuc2xuCmluZGV4IDA1ZTQ5NTEuLmVjNTdhMTggMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4KKysrIGIvdHV0b3JpYWwvY3NoYXJwL3R1dG9yaWFsLnNsbgpAQCAtMSwzOSArMSwzOSBAQAot77u/DQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDANCi0jIFZpc3VhbCBDIyBFeHByZXNzIDIwMDgNCi1Qcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIiwgIns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9Ig0KLUVuZFByb2plY3QNCi1Qcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNzaGFycENsaWVudCIsICJDc2hhcnBDbGllbnRcQ3NoYXJwQ2xpZW50LmNzcHJvaiIsICJ7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfSINCi0JUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQ0KLQkJezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0gPSB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fQ0KLQlFbmRQcm9qZWN0U2VjdGlvbg0KLUVuZFByb2plY3QNCi1Qcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNzaGFycFNlcnZlciIsICJDc2hhcnBTZXJ2ZXJcQ3NoYXJwU2VydmVyLmNzcHJvaiIsICJ7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fSINCi0JUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0gPSB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfQ0KLQlFbmRQcm9qZWN0U2VjdGlvbg0KLUVuZFByb2plY3QNCi1HbG9iYWwNCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQotCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIiwgIns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDc2hhcnBDbGllbnQiLCAiQ3NoYXJwQ2xpZW50XENzaGFycENsaWVudC5jc3Byb2oiLCAiezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0iCisgICAgUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9CisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9ID0gezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0KKyAgICBFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDc2hhcnBTZXJ2ZXIiLCAiQ3NoYXJwU2VydmVyXENzaGFycFNlcnZlci5jc3Byb2oiLCAiezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0iCisgICAgUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9CisgICAgRW5kUHJvamVjdFNlY3Rpb24KK0VuZFByb2plY3QKK0dsb2JhbAorICAgIEdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisgICAgICAgIERlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIFJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorICAgIEVuZEdsb2JhbFNlY3Rpb24KKyAgICBHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorICAgICAgICB7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorICAgIEVuZEdsb2JhbFNlY3Rpb24KKyAgICBHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorICAgICAgICBIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKyAgICBFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzhiMjkKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMSUJfRF9ESVIgPSAkKHRvcF9zcmNkaXIpL2xpYi9kCisKK0dFTl9TUkMgPSBnZW4tZC9zaGFyZS9TaGFyZWRTZXJ2aWNlLmQgZ2VuLWQvc2hhcmUvc2hhcmVkX3R5cGVzLmQgXAorCWdlbi1kL3R1dG9yaWFsL3R1dG9yaWFsX3R5cGVzLmQgZ2VuLWQvdHV0b3JpYWwvQ2FsY3VsYXRvci5kCisKKyQoR0VOX1NSQyk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gZCAtciAkPAorCitzZXJ2ZXI6IHNlcnZlci5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgc2VydmVyLmQgJHtHRU5fU1JDfQorCitjbGllbnQ6IGNsaWVudC5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgY2xpZW50LmQgJHtHRU5fU1JDfQorCitQUk9HUyA9IHNlcnZlciBjbGllbnQKKworaWYgV0lUSF9EX0VWRU5UX1RFU1RTCithc3luY19jbGllbnQ6IGFzeW5jX2NsaWVudC5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQtZXZlbnQgLUwtbHRocmlmdGQgLUwtbGV2ZW50IGFzeW5jX2NsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgKz0gYXN5bmNfY2xpZW50CitlbmRpZgorCithbGwtbG9jYWw6ICQoUFJPR1MpCisKK2NsZWFuOgorCSQoUk0pIC1mICQoUFJPR1MpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL2FzeW5jX2NsaWVudC5kIGIvdHV0b3JpYWwvZC9hc3luY19jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGVmY2UwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9hc3luY19jbGllbnQuZApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgYXN5bmNfY2xpZW50OworCitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OworaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKKworaW1wb3J0IHR1dG9yaWFsLkNhbGN1bGF0b3I7CitpbXBvcnQgdHV0b3JpYWwudHV0b3JpYWxfdHlwZXM7CisKK3ZvaWQgbWFpbigpIHsKKyAgYXV0byBhc3luY01hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworCisgIC8vIElmIHdlIGFyZSBkb25lLCBncmFjZWZ1bGx5IHN0b3AgdGhlIGFzeW5jIG1hbmFnZXIgdG8gYXZvaWQgaGFuZ2luZyBvbgorICAvLyBhcHBwbGljYXRpb24gc2h1dGRvd24uCisgIHNjb3BlIChleGl0KSBhc3luY01hbmFnZXIuc3RvcCgpOworCisgIGF1dG8gc29ja2V0ID0gbmV3IFRBc3luY1NvY2tldChhc3luY01hbmFnZXIsICJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgYXV0byBjbGllbnQgPSBuZXcgVEFzeW5jQ2xpZW50IUNhbGN1bGF0b3IoCisgICAgc29ja2V0LAorICAgIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IVRCdWZmZXJlZFRyYW5zcG9ydAorICApOworCisgIHNvY2tldC5vcGVuKCk7CisKKyAgLy8gSW52b2tlIGFsbCB0aGUgbWV0aG9kcy4KKyAgYXV0byBwaW5nUmVzdWx0ID0gY2xpZW50LnBpbmcoKTsKKworICBhdXRvIGFkZFJlc3VsdCA9IGNsaWVudC5hZGQoMSwgMSk7CisKKyAgYXV0byB3b3JrID0gV29yaygpOworICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERTsKKyAgd29yay5udW0xID0gMTsKKyAgd29yay5udW0yID0gMDsKKyAgYXV0byBxdW90aWVudFJlc3VsdCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgd29yay5udW0xID0gMTU7CisgIHdvcmsubnVtMiA9IDEwOworICBhdXRvIGRpZmZSZXN1bHQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworCisgIGF1dG8gbG9nUmVzdWx0ID0gY2xpZW50LmdldFN0cnVjdCgxKTsKKworICAvLyBBd2FpdCB0aGUgcmVzcG9uc2VzLgorICBwaW5nUmVzdWx0LndhaXRHZXQoKTsKKyAgd3JpdGVsbigicGluZygpIik7CisKKyAgaW50IHN1bSA9IGFkZFJlc3VsdC53YWl0R2V0KCk7CisgIHdyaXRlZmxuKCIxICsgMSA9ICVzIiwgc3VtKTsKKworICB0cnkgeworICAgIHF1b3RpZW50UmVzdWx0LndhaXRHZXQoKTsKKyAgICB3cml0ZWxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7CisgICAgd3JpdGVsbigiSW52YWxpZCBvcGVyYXRpb246ICIgfiBpby53aHkpOworICB9CisKKyAgd3JpdGVmbG4oIjE1IC0gMTAgPSAlcyIsIGRpZmZSZXN1bHQud2FpdEdldCgpKTsKKworICAvLyBURnV0dXJlIGlzIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gdGhlIHJlc3VsdCB0eXBlIHZpYSDCu2FsaWFzIHRoaXPCqywKKyAgLy8gZm9yIHdoaWNoIGl0IChlYWdlcmx5LCBvZiBjb3Vyc2UpIGF3YWl0cyBjb21wbGV0aW9uLgorICB3cml0ZWZsbigiQ2hlY2sgbG9nOiAlcyIsIGxvZ1Jlc3VsdC52YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL2NsaWVudC5kIGIvdHV0b3JpYWwvZC9jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3YTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9jbGllbnQuZApAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgY2xpZW50OworCitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKK2ltcG9ydCB0dXRvcmlhbC5DYWxjdWxhdG9yOworaW1wb3J0IHR1dG9yaWFsLnR1dG9yaWFsX3R5cGVzOworCit2b2lkIG1haW4oKSB7CisgIGF1dG8gc29ja2V0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICBhdXRvIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KTsKKyAgYXV0byBwcm90b2NvbCA9IHRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBhdXRvIGNsaWVudCA9IHRDbGllbnQhQ2FsY3VsYXRvcihwcm90b2NvbCk7CisKKyAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICBjbGllbnQucGluZygpOworICB3cml0ZWxuKCJwaW5nKCkiKTsKKworICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLCAxKTsKKyAgd3JpdGVmbG4oIjEgKyAxID0gJXMiLCBzdW0pOworCisgIGF1dG8gd29yayA9IFdvcmsoKTsKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREU7CisgIHdvcmsubnVtMSA9IDE7CisgIHdvcmsubnVtMiA9IDA7CisgIHRyeSB7CisgICAgaW50IHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICB3cml0ZWxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKSB7CisgICAgd3JpdGVsbigiSW52YWxpZCBvcGVyYXRpb246ICIgfiBpby53aHkpOworICB9CisKKyAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgd29yay5udW0xID0gMTU7CisgIHdvcmsubnVtMiA9IDEwOworICBpbnQgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgIHdyaXRlZmxuKCIxNSAtIDEwID0gJXMiLCBkaWZmKTsKKworICBhdXRvIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisgIHdyaXRlZmxuKCJDaGVjayBsb2c6ICVzIiwgbG9nLnZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2Qvc2VydmVyLmQgYi90dXRvcmlhbC9kL3NlcnZlci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiY2VkY2MKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL3NlcnZlci5kCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgc2VydmVyOworCitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CisKK2ltcG9ydCBzaGFyZS5TaGFyZWRTZXJ2aWNlOworaW1wb3J0IHNoYXJlLnNoYXJlZF90eXBlczsKK2ltcG9ydCB0dXRvcmlhbC5DYWxjdWxhdG9yOworaW1wb3J0IHR1dG9yaWFsLnR1dG9yaWFsX3R5cGVzOworCisvKioKKyAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIENhbGN1bGF0b3IgaW50ZXJmYWNlIHRoYXQgaXMgY2FsbGVkIGJ5CisgKiB0aGUgc2VydmVyIHRvIGFuc3dlciB0aGUgcmVxdWVzdHMuCisgKi8KK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyIDogQ2FsY3VsYXRvciB7CisgIHZvaWQgcGluZygpIHsKKyAgICB3cml0ZWxuKCJwaW5nKCkiKTsKKyAgfQorCisgIGludCBhZGQoaW50IG4xLCBpbnQgbjIpIHsKKyAgICB3cml0ZWZsbigiYWRkKCVzLCVzKSIsIG4xLCBuMik7CisgICAgcmV0dXJuIG4xICsgbjI7CisgIH0KKworICBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgcmVmIGNvbnN0KFdvcmspIHdvcmspIHsKKyAgICB3cml0ZWZsbigiY2FsY3VsYXRlKCVzLCB7JXMsICVzLCAlc30pIiwgbG9naWQsIHdvcmsub3AsIHdvcmsubnVtMSwgd29yay5udW0yKTsKKyAgICBpbnQgdmFsOworCisgICAgc3dpdGNoICh3b3JrLm9wKSB7CisgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgeworICAgICAgICBhdXRvIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgIHRocm93IGlvOworICAgICAgfQorICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGF1dG8gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgIGlvLndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CisgICAgICB0aHJvdyBpbzsKKyAgICB9CisKKyAgICBhdXRvIHNzID0gU2hhcmVkU3RydWN0KCk7CisgICAgc3Mua2V5ID0gbG9naWQ7CisgICAgc3MudmFsdWUgPSB0byFzdHJpbmcodmFsKTsKKyAgICBsb2dbbG9naWRdID0gc3M7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgU2hhcmVkU3RydWN0IGdldFN0cnVjdChpbnQgbG9naWQpIHsKKyAgICB3cml0ZWZsbigiZ2V0U3RydWN0KCVzKSIsIGxvZ2lkKTsKKyAgICByZXR1cm4gbG9nW2xvZ2lkXTsKKyAgfQorCisgIHZvaWQgemlwKCkgeworICAgIHdyaXRlbG4oInppcCgpIik7CisgIH0KKworcHJvdGVjdGVkOgorICBTaGFyZWRTdHJ1Y3RbaW50XSBsb2c7Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgYXV0byBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSEoKTsKKyAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhQ2FsY3VsYXRvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIpOworICBhdXRvIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKworICBhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKAorICAgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworCisgIHdyaXRlbG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCA5MDkwLi4uIik7CisgIHNlcnZlci5zZXJ2ZSgpOworICB3cml0ZWxuKCJkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NWFjYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0CisKK2dlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQ6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBwdWItZ2V0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworcHViLWdldDogcHViLWdldC1nZW4gcHViLWdldC1jbGllbnQgcHViLWdldC1jb25zb2xlLWNsaWVudCBwdWItZ2V0LXNlcnZlcgorCitwdWItZ2V0LWdlbjogcHViLWdldC10dXRvcmlhbCBwdWItZ2V0LXNoYXJlZAorCitwdWItZ2V0LXR1dG9yaWFsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydAorCWNkIGdlbi1kYXJ0L3R1dG9yaWFsOyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNoYXJlZDogZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCWNkIGdlbi1kYXJ0L3NoYXJlZDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jbGllbnQ6CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LWNvbnNvbGUtY2xpZW50OgorCWNkIGNvbnNvbGVfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNlcnZlcjoKKwljZCBzZXJ2ZXI7ICR7REFSVFBVQn0gZ2V0CisKK3R1dG9yaWFsc2VydmVyOiBwdWItZ2V0LWdlbiBwdWItZ2V0LXNlcnZlcgorCSR7REFSVH0gc2VydmVyL2Jpbi9tYWluLmRhcnQKKwordHV0b3JpYWxjbGllbnQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IHNlcnZlCisKK3R1dG9yaWFsY29uc29sZWNsaWVudDogcHViLWdldC1jb25zb2xlLWNsaWVudAorCSR7REFSVH0gY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydAorCitFWFRSQV9ESVNUID0gXAorCWNsaWVudC93ZWIvY2xpZW50LmRhcnQgXAorCWNsaWVudC93ZWIvaW5kZXguaHRtbCBcCisJY2xpZW50L3dlYi9zdHlsZXMuY3NzIFwKKwljbGllbnQvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IFwKKwljb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgXAorCXNlcnZlci9iaW4vbWFpbi5kYXJ0IFwKKwlzZXJ2ZXIvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwlzZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWU7CitybSAtciBnZW4tZGFydCB8fCB0cnVlOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi9zaGFyZWQudGhyaWZ0OworY2QgZ2VuLWRhcnQvc2hhcmVkOworcHViIGdldDsKK2NkIC4uLy4uOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi90dXRvcmlhbC50aHJpZnQ7CitjZCBnZW4tZGFydC90dXRvcmlhbDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKworY2QgY2xpZW50OworcHViIGdldDsKK2NkIC4uOworCitjZCBjb25zb2xlX2NsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2Qgc2VydmVyOworcHViIGdldDsKK2NkIC4uOworCitkYXJ0Zm10IC13IGdlbi1kYXJ0OworCitlY2hvICJcbkVuam95IHRoZSBEYXJ0IHR1dG9yaWFsISI7CitlY2hvICJcblRvIHJ1biB0aGUgc2VydmVyOiI7CitlY2hvICI+IGRhcnQgc2VydmVyL2Jpbi9tYWluLmRhcnQiOworZWNobyAiXG5UbyBydW4gdGhlIGNsaWVudDoiOworZWNobyAiIyBTZXJ2ZSB0aGUgYXBwIGZyb20gdGhlIGNsaWVudCBkaXJlY3RvcnkgYW5kIHZpZXcgaW4gYSBicm93c2VyIjsKK2VjaG8gIj4gY2QgY2xpZW50OyI7CitlY2hvICI+IHB1YiBzZXJ2ZTsiOworZWNobyAiXG5UbyBydW4gdGhlIGNvbnNvbGUgY2xpZW50OiI7CitlY2hvICI+IGRhcnQgY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCI7CitlY2hvICIiOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgRGFydCBjbGllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYnJvd3NlcjogXjAuMTAuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDJkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQKQEAgLTAsMCArMSwyNzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6aHRtbCc7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfYnJvd3Nlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQvc2hhcmVkLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBBUzMgdHV0b3JpYWwKK3ZvaWQgbWFpbigpIHsKKyAgbmV3IENhbGN1bGF0b3JVSShxdWVyeVNlbGVjdG9yKCcjb3V0cHV0JykpLnN0YXJ0KCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JVSSB7CisgIGZpbmFsIERpdkVsZW1lbnQgb3V0cHV0OworCisgIENhbGN1bGF0b3JVSSh0aGlzLm91dHB1dCk7CisKKyAgVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworICBDYWxjdWxhdG9yIF9jYWxjdWxhdG9yQ2xpZW50OworCisgIHZvaWQgc3RhcnQoKSB7CisgICAgX2J1aWxkSW50ZXJmYWNlKCk7CisgICAgX2luaXRDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIF92YWxpZGF0ZSgpIHsKKyAgICBpZiAoIV90cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICB3aW5kb3cuYWxlcnQoIlRoZSB0cmFuc3BvcnQgaXMgbm90IG9wZW4hIik7CisgICAgfQorICB9CisKKyAgdm9pZCBfaW5pdENvbm5lY3Rpb24oKSB7CisgICAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgIG5ldyBUV2ViU29ja2V0KFVyaS5wYXJzZSgnd3M6Ly8xMjcuMC4wLjE6OTA5MC93cycpKSwKKyAgICAgICAgbmV3IFRNZXNzYWdlUmVhZGVyKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICAgIF90cmFuc3BvcnQub3BlbigpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIF9idWlsZEludGVyZmFjZSgpIHsKKyAgICBvdXRwdXQuY2hpbGRyZW4uZm9yRWFjaCgoZSkgeworICAgICAgZS5yZW1vdmUoKTsKKyAgICB9KTsKKworICAgIF9idWlsZFBpbmdDb21wb25lbnQoKTsKKworICAgIF9idWlsZEFkZENvbXBvbmVudCgpOworCisgICAgX2J1aWxkQ2FsY3VsYXRvckNvbXBvbmVudCgpOworCisgICAgX2J1aWxkR2V0U3RydWN0Q29tcG9uZW50KCk7CisgIH0KKworICB2b2lkIF9idWlsZFBpbmdDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJQaW5nIik7CisgICAgQnV0dG9uRWxlbWVudCBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIlBJTkciCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vblBpbmdDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChwaW5nQnV0dG9uKTsKKyAgfQorCisgIHZvaWQgX29uUGluZ0NsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQucGluZygpOworICB9CisKKyAgdm9pZCBfYnVpbGRBZGRDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJBZGQiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQxIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0xKTsKKyAgICBTcGFuRWxlbWVudCBvcCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQyIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTIpOworICAgIEJ1dHRvbkVsZW1lbnQgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIj0iCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uQWRkQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoYWRkQnV0dG9uKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGRSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25BZGRDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2FkZDEiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGQyIik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2FkZFJlc3VsdCIpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQKKyAgICAgICAgLmFkZChpbnQucGFyc2UobnVtMS52YWx1ZSksIGludC5wYXJzZShudW0yLnZhbHVlKSkKKyAgICAgICAgLnRoZW4oKGludCBuKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIkbiI7CisgICAgfSk7CisgIH0KKworICB2b2lkIF9idWlsZENhbGN1bGF0b3JDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJDYWxjdWxhdG9yIik7CisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsYzEiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTEpOworICAgIFNlbGVjdEVsZW1lbnQgb3AgPSBuZXcgU2VsZWN0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGNPcCIKKyAgICAgIC4ubXVsdGlwbGUgPSBmYWxzZQorICAgICAgLi5zZWxlY3RlZEluZGV4ID0gMAorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNnB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIE9wdGlvbkVsZW1lbnQgYWRkT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uQURELnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGFkZE9wLCAwKTsKKyAgICBPcHRpb25FbGVtZW50IHN1YnRyYWN0T3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLSIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uU1VCVFJBQ1QudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoc3VidHJhY3RPcCwgMSk7CisgICAgT3B0aW9uRWxlbWVudCBtdWx0aXBseU9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIioiCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLk1VTFRJUExZLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKG11bHRpcGx5T3AsIDIpOworICAgIE9wdGlvbkVsZW1lbnQgZGl2aWRlT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uRElWSURFLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGRpdmlkZU9wLCAzKTsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjMiIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0yKTsKKyAgICBCdXR0b25FbGVtZW50IGNhbGNCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiPSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25DYWxjQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoY2FsY0J1dHRvbik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsY1Jlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBMYWJlbEVsZW1lbnQgbG9nSWRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkxvZyBJRDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImxvZ0lkIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBMYWJlbEVsZW1lbnQgY29tbWVudExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiQ29tbWVudDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChjb21tZW50TGFiZWwpOworICAgIElucHV0RWxlbWVudCBjb21tZW50ID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNvbW1lbnQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjEwMHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQoY29tbWVudCk7CisgIH0KKworICB2b2lkIF9vbkNhbGNDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2NhbGMxIik7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBxdWVyeVNlbGVjdG9yKCIjY2FsYzIiKTsKKyAgICBTZWxlY3RFbGVtZW50IG9wID0gcXVlcnlTZWxlY3RvcigiI2NhbGNPcCIpOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjUmVzdWx0Iik7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gcXVlcnlTZWxlY3RvcigiI2xvZ0lkIik7CisgICAgSW5wdXRFbGVtZW50IGNvbW1lbnQgPSBxdWVyeVNlbGVjdG9yKCIjY29tbWVudCIpOworCisgICAgaW50IGxvZ0lkVmFsdWUgPSBpbnQucGFyc2UobG9nSWQudmFsdWUpOworICAgIGxvZ0lkLnZhbHVlID0gKGxvZ0lkVmFsdWUgKyAxKS50b1N0cmluZygpOworCisgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKKyAgICB3b3JrLm51bTEgPSBpbnQucGFyc2UobnVtMS52YWx1ZSk7CisgICAgd29yay5udW0yID0gaW50LnBhcnNlKG51bTIudmFsdWUpOworICAgIHdvcmsub3AgPSBpbnQucGFyc2Uob3Aub3B0aW9uc1tvcC5zZWxlY3RlZEluZGV4XS52YWx1ZSk7CisgICAgd29yay5jb21tZW50ID0gY29tbWVudC52YWx1ZTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50LmNhbGN1bGF0ZShsb2dJZFZhbHVlLCB3b3JrKS50aGVuKChpbnQgbikgeworICAgICAgcmVzdWx0LnRleHQgPSAiJG4iOworICAgIH0pOworICB9CisKKyAgdm9pZCBfYnVpbGRHZXRTdHJ1Y3RDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJHZXQgU3RydWN0Iik7CisgICAgTGFiZWxFbGVtZW50IGxvZ0lkTGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJTdHJ1Y3QgS2V5OiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAic3RydWN0S2V5IgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBCdXR0b25FbGVtZW50IGdldFN0cnVjdEJ1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJHRVQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uR2V0U3RydWN0Q2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoZ2V0U3RydWN0QnV0dG9uKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIFRleHRBcmVhRWxlbWVudCByZXN1bHQgPSBuZXcgVGV4dEFyZWFFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiZ2V0U3RydWN0UmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICIzMDBweCIKKyAgICAgIC4uc3R5bGUuaGVpZ2h0ID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25HZXRTdHJ1Y3RDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBzdHJ1Y3RLZXkgPSBxdWVyeVNlbGVjdG9yKCIjc3RydWN0S2V5Iik7CisgICAgVGV4dEFyZWFFbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNnZXRTdHJ1Y3RSZXN1bHQiKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50CisgICAgICAgIC5nZXRTdHJ1Y3QoaW50LnBhcnNlKHN0cnVjdEtleS52YWx1ZSkpCisgICAgICAgIC50aGVuKChTaGFyZWRTdHJ1Y3QgcykgeworICAgICAgcmVzdWx0LnRleHQgPSAiJHtzLnRvU3RyaW5nKCl9IjsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIxODRlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgVHV0b3JpYWw8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzLmNzcyI+CisgICAgPHNjcmlwdCBhc3luYyBzcmM9ImNsaWVudC5kYXJ0IiB0eXBlPSJhcHBsaWNhdGlvbi9kYXJ0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IGFzeW5jIHNyYz0icGFja2FnZXMvYnJvd3Nlci9kYXJ0LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisKKyAgPGRpdiBpZD0ib3V0cHV0Ij48L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMxNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90byk7CisKK2h0bWwsIGJvZHkgeworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7Cit9CisKK2gzIHsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IHRoaW47CisgICAgcGFkZGluZy10b3A6IDIwcHg7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNDkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKK1RUcmFuc3BvcnQgX3RyYW5zcG9ydDsKK0NhbGN1bGF0b3IgX2NhbGN1bGF0b3I7CitpbnQgbG9naWQgPSAwOworCitjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG9wZXJhdGlvbkxvb2t1cCA9IGNvbnN0IHsKKyAgJysnOiBPcGVyYXRpb24uQURELAorICAnLSc6IE9wZXJhdGlvbi5TVUJUUkFDVCwKKyAgJyonOiBPcGVyYXRpb24uTVVMVElQTFksCisgICcvJzogT3BlcmF0aW9uLkRJVklERQorfTsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisKKyAgX2luaXRDb25uZWN0aW9uKHBvcnQpLnRoZW4oKF8pID0+IF9ydW4oKSk7Cit9CisKK0Z1dHVyZSBfaW5pdENvbm5lY3Rpb24oaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICBuZXcgVFRjcFNvY2tldChzb2NrZXQpLCBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICBhd2FpdCBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICBfY2FsY3VsYXRvciA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKK30KKworRnV0dXJlIF9ydW4oKSBhc3luYyB7CisgIF9oZWxwKCk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGRvdXQud3JpdGUoIj4gIik7CisgICAgdmFyIGlucHV0ID0gc3RkaW4ucmVhZExpbmVTeW5jKCk7CisgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJyAnKTsKKyAgICB2YXIgY29tbWFuZCA9IHBhcnRzWzBdOworICAgIHZhciBhcmdzID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnN1Ymxpc3QoMSkgOiBbXTsKKworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgY2FzZSAncGluZyc6CisgICAgICAgIGF3YWl0IF9waW5nKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdhZGQnOgorICAgICAgICBhd2FpdCBfYWRkKGludC5wYXJzZShhcmdzWzBdKSwgaW50LnBhcnNlKGFyZ3NbMV0pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2NhbGMnOgorICAgICAgICBpbnQgb3AgPSBvcGVyYXRpb25Mb29rdXBbYXJnc1sxXV07CisgICAgICAgIGlmICghT3BlcmF0aW9uLlZBTElEX1ZBTFVFUy5jb250YWlucyhvcCkpIHsKKyAgICAgICAgICBzdGRvdXQud3JpdGVsbignVW5rbm93biBvcGVyYXRvciAke2FyZ3NbMV19Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrKCkKKyAgICAgICAgICAuLm51bTEgPSBpbnQucGFyc2UoYXJnc1swXSkKKyAgICAgICAgICAuLm9wID0gb3AKKyAgICAgICAgICAuLm51bTIgPSBpbnQucGFyc2UoYXJnc1syXSkKKyAgICAgICAgICAuLmNvbW1lbnQgPSBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogJyc7CisKKyAgICAgICAgYXdhaXQgX2NhbGMod29yayk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdzdHJ1Y3QnOgorICAgICAgICBhd2FpdCBfc3RydWN0KGludC5wYXJzZShhcmdzWzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdoZWxwJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9oZWxwKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIF9oZWxwKCkgeworICBzdGRvdXQud3JpdGVsbignQ29tbWFuZHM6Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGhlbHAnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgcGluZycpOworICBzdGRvdXQud3JpdGVsbignICBhZGQgeCB5Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGNhbGMgeCBvcCB5IFtjb21tZW50XScpOworICBzdGRvdXQud3JpdGVsbignICBzdHJ1Y3QgaWQnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJycpOworfQorCitGdXR1cmUgX3BpbmcoKSBhc3luYyB7CisgIGF3YWl0IF9jYWxjdWxhdG9yLnBpbmcoKTsKKyAgc3Rkb3V0LndyaXRlbG4oJ3Bpbmcgc3VjY2VlZGVkJyk7Cit9CisKK0Z1dHVyZSBfYWRkKGludCB4LCBpbnQgeSkgYXN5bmMgeworICBpbnQgcmVzdWx0ID0gYXdhaXQgX2NhbGN1bGF0b3IuYWRkKHgsIHkpOworICBzdGRvdXQud3JpdGVsbignPSAkcmVzdWx0Jyk7Cit9CisKK0Z1dHVyZSBfY2FsYyhXb3JrIHdvcmspIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmNhbGN1bGF0ZShsb2dpZCsrLCB3b3JrKTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX3N0cnVjdChpbnQga2V5KSBhc3luYyB7CisgIHZhciBzdHJ1Y3QgPSBhd2FpdCBfY2FsY3VsYXRvci5nZXRTdHJ1Y3Qoa2V5KTsKKyAgc3Rkb3V0LndyaXRlbG4oc3RydWN0LnRvU3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRlMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9jb25zb2xlX2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiA+CisgIEEgRGFydCBjb25zb2xlIGNsaWVudCB0byBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGNvbGxlY3Rpb246IF4xLjEuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWMzMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTYzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnNoYXJlZC9zaGFyZWQuZGFydCc7CisKK1RQcm90b2NvbCBfcHJvdG9jb2w7CitUUHJvY2Vzc29yIF9wcm9jZXNzb3I7CitXZWJTb2NrZXQgX3dlYlNvY2tldDsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGxpc3RlbiBvbicpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0eXBlJywKKyAgICAgIGRlZmF1bHRzVG86ICd3cycsCisgICAgICBhbGxvd2VkOiBbJ3dzJywgJ3RjcCddLAorICAgICAgaGVscDogJ1RoZSB0eXBlIG9mIHNvY2tldCcsCisgICAgICBhbGxvd2VkSGVscDogeyd3cyc6ICdXZWJTb2NrZXQnLCAndGNwJzogJ1RDUCBTb2NrZXQnfSk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXN1bHRzID0gbnVsbDsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBwcmludChwYXJzZXIudXNhZ2UpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpbnQgcG9ydCA9IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pOworICBTdHJpbmcgc29ja2V0VHlwZSA9IHJlc3VsdHNbJ3R5cGUnXTsKKworICBpZiAoc29ja2V0VHlwZSA9PSAndGNwJykgeworICAgIF9ydW5UY3BTZXJ2ZXIocG9ydCk7CisgIH0gZWxzZSBpZiAoc29ja2V0VHlwZSA9PSAnd3MnKSB7CisgICAgX3J1bldlYlNvY2tldFNlcnZlcihwb3J0KTsKKyAgfQorfQorCitGdXR1cmUgX3J1bldlYlNvY2tldFNlcnZlcihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgaHR0cFNlcnZlciA9IGF3YWl0IEh0dHBTZXJ2ZXIuYmluZCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIHByaW50KCdsaXN0ZW5pbmcgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucyBvbiAkcG9ydCcpOworCisgIGh0dHBTZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CisgICAgaWYgKHJlcXVlc3QudXJpLnBhdGggPT0gJy93cycpIHsKKyAgICAgIF93ZWJTb2NrZXQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc2Zvcm1lci51cGdyYWRlKHJlcXVlc3QpOworICAgICAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRXZWJTb2NrZXQoX3dlYlNvY2tldCkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgnSW52YWxpZCBwYXRoOiAke3JlcXVlc3QudXJpLnBhdGh9Jyk7CisgICAgfQorICB9KTsKK30KKworRnV0dXJlIF9ydW5UY3BTZXJ2ZXIoaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNlcnZlclNvY2tldCA9IGF3YWl0IFNlcnZlclNvY2tldC5iaW5kKCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgcHJpbnQoJ2xpc3RlbmluZyBmb3IgVENQIGNvbm5lY3Rpb25zIG9uICRwb3J0Jyk7CisKKyAgU29ja2V0IHNvY2tldCA9IGF3YWl0IHNlcnZlclNvY2tldC5maXJzdDsKKyAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7Cit9CisKK0Z1dHVyZSBfaW5pdFByb2Nlc3NvcihUU29ja2V0IHNvY2tldCkgYXN5bmMgeworICBUU2VydmVyU29ja2V0VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgIHRyYW5zcG9ydC5vbkluY29taW5nTWVzc2FnZS5saXN0ZW4oX3Byb2Nlc3NNZXNzYWdlKTsKKyAgX3Byb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yU2VydmVyKCkpOworICBfcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGF3YWl0IF9wcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworCisgIHByaW50KCdjb25uZWN0ZWQnKTsKK30KKworRnV0dXJlIF9wcm9jZXNzTWVzc2FnZShfKSBhc3luYyB7CisgIF9wcm9jZXNzb3IucHJvY2VzcyhfcHJvdG9jb2wsIF9wcm90b2NvbCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JTZXJ2ZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKyAgZmluYWwgTWFwPGludCwgU2hhcmVkU3RydWN0PiBfbG9nID0ge307CisKKyAgRnV0dXJlIHBpbmcoKSBhc3luYyB7CisgICAgcHJpbnQoJ3BpbmcoKScpOworICB9CisKKyAgRnV0dXJlPGludD4gYWRkKGludCBudW0xLCBpbnQgbnVtMikgYXN5bmMgeworICAgIHByaW50KCdhZGQoJG51bTEsICRudW0yKScpOworCisgICAgcmV0dXJuIG51bTEgKyBudW0yOworICB9CisKKyAgRnV0dXJlPGludD4gY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKSBhc3luYyB7CisgICAgcHJpbnQoJ2NhbHVsYXRlKCRsb2dpZCwgJHt3b3JrLnRvU3RyaW5nKCl9KScpOworCisgICAgaW50IHZhbDsKKworICAgIHN3aXRjaCAod29yay5vcCkgeworICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CisgICAgICAgICAgdmFyIHggPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gKHdvcmsubnVtMSAvIHdvcmsubnVtMikuZmxvb3IoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdmFyIGxvZyA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBsb2cua2V5ID0gbG9naWQ7CisgICAgbG9nLnZhbHVlID0gJyR2YWwgIiR7d29yay5jb21tZW50fSInOworICAgIHRoaXMuX2xvZ1tsb2dpZF0gPSBsb2c7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgRnV0dXJlIHppcCgpIGFzeW5jIHsKKyAgICBwcmludCgnemlwKCknKTsKKyAgfQorCisgIEZ1dHVyZTxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdChpbnQga2V5KSBhc3luYyB7CisgICAgcHJpbnQoJ2dldFN0cnVjdCgka2V5KScpOworCisgICAgcmV0dXJuIF9sb2dba2V5XTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDA3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9zZXJ2ZXIKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBEYXJ0IHNlcnZlciB0byBzdXBwb3J0IHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQwZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCkBAIC0wLDAgKzEsMTE0IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorcHJvZ3JhbSBEZWxwaGlDbGllbnQ7CisKK3skQVBQVFlQRSBDT05TT0xFfQoreyREICdDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ30KKwordXNlcworICBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgU2hhcmVkIGluICcuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMnLAorICBUdXRvcmlhbCBpbiAnLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMnOworCisKK3R5cGUKKyAgRGVscGhpVHV0b3JpYWxDbGllbnQgPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgTWFpbjsKKyAgZW5kOworCisKKy8vLS0tIERlbHBoaVR1dG9yaWFsQ2xpZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIHByb2NlZHVyZSBEZWxwaGlUdXRvcmlhbENsaWVudC5NYWluOwordmFyIHRyYW5zcG9ydCA6IElUcmFuc3BvcnQ7CisgICAgcHJvdG9jb2wgIDogSVByb3RvY29sOworICAgIGNsaWVudCAgICA6IFRDYWxjdWxhdG9yLklmYWNlOworICAgIHdvcmsgICAgICA6IElXb3JrOworICAgIHN1bSwgcXVvdGllbnQsIGRpZmYgOiBJbnRlZ2VyOworICAgIGxvZyAgICAgICA6IElTaGFyZWRTdHJ1Y3Q7CitiZWdpbgorICB0cnkKKyAgICB0cmFuc3BvcnQgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCAnbG9jYWxob3N0JywgOTA5MCk7CisgICAgcHJvdG9jb2wgIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFuc3BvcnQpOworICAgIGNsaWVudCAgICA6PSBUQ2FsY3VsYXRvci5UQ2xpZW50LkNyZWF0ZSggcHJvdG9jb2wpOworCisgICAgdHJhbnNwb3J0Lk9wZW47CisKKyAgICBjbGllbnQucGluZzsKKyAgICBXcml0ZUxuKCdwaW5nKCknKTsKKworICAgIHN1bSA6PSBjbGllbnQuYWRkKCAxLCAxKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoICcxKzE9JWQnLCBbc3VtXSkpOworCisgICAgd29yayA6PSBUV29ya0ltcGwuQ3JlYXRlOworCisgICAgd29yay5PcCAgIDo9IFRPcGVyYXRpb24uRElWSURFOworICAgIHdvcmsuTnVtMSA6PSAxOworICAgIHdvcmsuTnVtMiA6PSAwOworICAgIHRyeQorICAgICAgcXVvdGllbnQgOj0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgIFdyaXRlTG4oICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxLzA9JWQnLFtxdW90aWVudF0pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGlvOiBUSW52YWxpZE9wZXJhdGlvbgorICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICBlbmQ7CisKKyAgICB3b3JrLk9wICAgOj0gVE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgICB3b3JrLk51bTEgOj0gMTU7CisgICAgd29yay5OdW0yIDo9IDEwOworICAgIHRyeQorICAgICAgZGlmZiA6PSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKKyAgICAgIFdyaXRlTG4oIEZvcm1hdCgnMTUtMTA9JWQnLCBbZGlmZl0pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGlvOiBUSW52YWxpZE9wZXJhdGlvbgorICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICBlbmQ7CisKKyAgICBsb2cgOj0gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoICdDaGVjayBsb2c6ICVzJywgW2xvZy5WYWx1ZV0pKTsKKworICAgIHRyYW5zcG9ydC5DbG9zZSgpOworCisgIGV4Y2VwdAorICAgIG9uIGUgOiBFeGNlcHRpb24KKyAgICBkbyBXcml0ZUxuKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKK2VuZDsKKworCitiZWdpbgorICB0cnkKKyAgICBEZWxwaGlUdXRvcmlhbENsaWVudC5NYWluOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2Nzk5MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qCkBAIC0wLDAgKzEsMTE5IEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+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+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCkBAIC0wLDAgKzEsMTczIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorcHJvZ3JhbSBEZWxwaGlTZXJ2ZXI7CisKK3skQVBQVFlQRSBDT05TT0xFfQoreyREICdDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ30KKworeyRRK30gICAgIC8vIHRocm93cyBleGNlcHRpb25zIG9uIG51bWVyaWMgb3ZlcmZsb3dzCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFNoYXJlZCBpbiAnLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzJywKKyAgVHV0b3JpYWwgaW4gJy4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzJzsKKworCit0eXBlCisgIFRDYWxjdWxhdG9ySGFuZGxlciA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgVENhbGN1bGF0b3IuSWZhY2UpCisgIHByb3RlY3RlZAorICAgIEZMb2cgOiBURGljdGlvbmFyeTwgSW50ZWdlciwgSVNoYXJlZFN0cnVjdD47CisKKyAgICAvLyBUU2hhcmVkU2VydmljZS5JZmFjZQorICAgIGZ1bmN0aW9uICBnZXRTdHJ1Y3Qoa2V5OiBJbnRlZ2VyKTogSVNoYXJlZFN0cnVjdDsKKworICAgIC8vIFRDYWxjdWxhdG9yLklmYWNlCisgICAgcHJvY2VkdXJlIHBpbmcoKTsKKyAgICBmdW5jdGlvbiAgYWRkKG51bTE6IEludGVnZXI7IG51bTI6IEludGVnZXIpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uICBjYWxjdWxhdGUobG9naWQ6IEludGVnZXI7IGNvbnN0IHc6IElXb3JrKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgemlwKCk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgIGVuZDsKKworICBEZWxwaGlUdXRvcmlhbFNlcnZlciA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIHByb2NlZHVyZSBNYWluOworICBlbmQ7CisKKworLy8tLS0gVENhbGN1bGF0b3JIYW5kbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRDYWxjdWxhdG9ySGFuZGxlci5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTG9nIDo9IFREaWN0aW9uYXJ5PCBJbnRlZ2VyLCBJU2hhcmVkU3RydWN0Pi5DcmVhdGUoKTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRDYWxjdWxhdG9ySGFuZGxlci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRkxvZyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2FsY3VsYXRvckhhbmRsZXIucGluZzsKK2JlZ2luCisgIFdyaXRlTG4oICdwaW5nKCknKTsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuYWRkKG51bTE6IEludGVnZXI7IG51bTI6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgV3JpdGVMbiggRm9ybWF0KCAnYWRkKCAlZCwgJWQpJywgW251bTEsIG51bTJdKSk7CisgIHJlc3VsdCA6PSBudW0xICsgbnVtMjsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuY2FsY3VsYXRlKGxvZ2lkOiBJbnRlZ2VyOyBjb25zdCB3OiBJV29yayk6IEludGVnZXI7Cit2YXIgZW50cnkgOiBJU2hhcmVkU3RydWN0OworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVMbiggRm9ybWF0KCdjYWxjdWxhdGUoICVkLCBbJWQsJWQsJWRdKScsIFtsb2dpZCwgT3JkKHcuT3ApLCB3Lk51bTEsIHcuTnVtMl0pKTsKKworICAgIGNhc2Ugdy5PcCBvZgorICAgICAgVE9wZXJhdGlvbi5BREQgICAgICA6ICByZXN1bHQgOj0gdy5OdW0xICsgdy5OdW0yOworICAgICAgVE9wZXJhdGlvbi5TVUJUUkFDVCA6ICByZXN1bHQgOj0gdy5OdW0xIC0gdy5OdW0yOworICAgICAgVE9wZXJhdGlvbi5NVUxUSVBMWSA6ICByZXN1bHQgOj0gdy5OdW0xICogdy5OdW0yOworICAgICAgVE9wZXJhdGlvbi5ESVZJREUgICA6ICByZXN1bHQgOj0gUm91bmQoIHcuTnVtMSAvIHcuTnVtMik7CisgICAgZWxzZQorICAgICAgcmFpc2UgVEludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCBPcmQody5PcCksICdVbmtub3duIG9wZXJhdGlvbicpOworICAgIGVuZDsKKworICBleGNlcHQKKyAgICBvbiBlOlRocmlmdC5URXhjZXB0aW9uIGRvIHJhaXNlOyAgLy8gbGV0IFRocmlmdCBFeGNlcHRpb25zIHBhc3MgdGhyb3VnaAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIHJhaXNlIFRJbnZhbGlkT3BlcmF0aW9uLkNyZWF0ZSggT3JkKHcuT3ApLCBlLk1lc3NhZ2UpOyAgLy8gcmVwYWNrYWdlIGFsbCBvdGhlcgorICBlbmQ7CisKKyAgZW50cnkgOj0gVFNoYXJlZFN0cnVjdEltcGwuQ3JlYXRlOworICBlbnRyeS5LZXkgICA6PSBsb2dpZDsKKyAgZW50cnkuVmFsdWUgOj0gSW50VG9TdHIoIHJlc3VsdCk7CisgIEZMb2cuQWRkT3JTZXRWYWx1ZSggbG9naWQsIGVudHJ5KTsKK2VuZDsKKworCitmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuZ2V0U3RydWN0KGtleTogSW50ZWdlcik6IElTaGFyZWRTdHJ1Y3Q7CitiZWdpbgorICBXcml0ZUxuKCBGb3JtYXQoICdnZXRTdHJ1Y3QoJWQpJywgW2tleV0pKTsKKyAgcmVzdWx0IDo9IEZMb2dba2V5XTsKK2VuZDsKKworCitwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnppcDsKK2JlZ2luCisgIFdyaXRlTG4oICd6aXAoKScpOworZW5kOworCisKKy8vLS0tIERlbHBoaVR1dG9yaWFsU2VydmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBwcm9jZWR1cmUgRGVscGhpVHV0b3JpYWxTZXJ2ZXIuTWFpbjsKK3ZhciBoYW5kbGVyICAgOiBUQ2FsY3VsYXRvci5JZmFjZTsKKyAgICBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOworICAgIHRyYW5zcG9ydCA6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgc2VydmVyICAgIDogSVNlcnZlcjsKK2JlZ2luCisgIHRyeQorICAgIGhhbmRsZXIgICA6PSBUQ2FsY3VsYXRvckhhbmRsZXIuQ3JlYXRlOworICAgIHByb2Nlc3NvciA6PSBUQ2FsY3VsYXRvci5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIGhhbmRsZXIpOworICAgIHRyYW5zcG9ydCA6PSBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIDkwOTApOworICAgIHNlcnZlciAgICA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggcHJvY2Vzc29yLCB0cmFuc3BvcnQpOworCisgICAgV3JpdGVMbiggJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKTsKKyAgICBzZXJ2ZXIuU2VydmUoKTsKKworICBleGNlcHQKKyAgICBvbiBlOiBFeGNlcHRpb24gZG8gV3JpdGVMbiggZS5NZXNzYWdlKTsKKyAgZW5kOworCisgIFdyaXRlTG4oJ2RvbmUuJyk7CitlbmQ7CisKKworYmVnaW4KKyAgdHJ5CisgICAgRGVscGhpVHV0b3JpYWxTZXJ2ZXIuTWFpbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvaiBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNGE2YTEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagpAQCAtMCwwICsxLDExOCBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5EZWxwaGlTZXJ2ZXIuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpU2VydmVyLmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaVNlcnZlcjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlTZXJ2ZXIuZXhlPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaVNlcnZlci5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9UdXRvcmlhbC5ncm91cHByb2ogYi90dXRvcmlhbC9kZWxwaGkvVHV0b3JpYWwuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmEyMzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvVHV0b3JpYWwuZ3JvdXBwcm9qCkBAIC0wLDAgKzEsNDggQEAKK++7vyAgICA8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgICAgICAgPFByb3BlcnR5R3JvdXA+CisgICAgICAgICAgICA8UHJvamVjdEd1aWQ+ezNEMDQyQzdGLTNFRjItNDU3NC04MzA0LUFCN0ZCNzlGODE0Q308L1Byb2plY3RHdWlkPgorICAgICAgICA8L1Byb3BlcnR5R3JvdXA+CisgICAgICAgIDxJdGVtR3JvdXA+CisgICAgICAgICAgICA8UHJvamVjdHMgSW5jbHVkZT0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiI+CisgICAgICAgICAgICAgICAgPERlcGVuZGVuY2llcy8+CisgICAgICAgICAgICA8L1Byb2plY3RzPgorICAgICAgICAgICAgPFByb2plY3RzIEluY2x1ZGU9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiPgorICAgICAgICAgICAgICAgIDxEZXBlbmRlbmNpZXMvPgorICAgICAgICAgICAgPC9Qcm9qZWN0cz4KKyAgICAgICAgPC9JdGVtR3JvdXA+CisgICAgICAgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICAgICAgICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlZmF1bHQuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisgICAgICAgICAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisgICAgICAgICAgICA8Qm9ybGFuZFByb2plY3Q+CisgICAgICAgICAgICAgICAgPERlZmF1bHQuUGVyc29uYWxpdHkvPgorICAgICAgICAgICAgPC9Cb3JsYW5kUHJvamVjdD4KKyAgICAgICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXIiPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOkNsZWFuIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6TWFrZSI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQiPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50OkNsZWFuIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJDbGVhbiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6TWFrZSI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iTWFrZSIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJCdWlsZCI+CisgICAgICAgICAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJEZWxwaGlTZXJ2ZXI7RGVscGhpQ2xpZW50Ii8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkNsZWFuIj4KKyAgICAgICAgICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjpDbGVhbjtEZWxwaGlDbGllbnQ6Q2xlYW4iLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iTWFrZSI+CisgICAgICAgICAgICA8Q2FsbFRhcmdldCBUYXJnZXRzPSJEZWxwaGlTZXJ2ZXI6TWFrZTtEZWxwaGlDbGllbnQ6TWFrZSIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuR3JvdXAuVGFyZ2V0cyIvPgorICAgIDwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9SRUFETUUubWQgYi90dXRvcmlhbC9lcmwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTdjZDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsOCBAQAorVG8gdHJ5IHRoaW5ncyBvdXQsIHJ1bgorCislIC4vc2VydmVyLnNoCitFcmxhbmcgUjE0QiAoZXJ0cy01LjguMSkgW3NvdXJjZV0gWzY0LWJpdF0gW3NtcDo0OjRdIFtycTo0XSBbYXN5bmMtdGhyZWFkczowXSBbaGlwZV0gW2tlcm5lbC1wb2xsOmZhbHNlXQorCitFc2hlbGwgVjUuOC4xICAoYWJvcnQgd2l0aCBeRykKKz4gc2VydmVyOnN0YXJ0KCkuCis+IGNsaWVudDp0KCkuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCmluZGV4IGFkYWViZTQuLjAzNzQyMjAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgb2suCiAKIHQoKSAtPgotICAgIFBvcnQgPSA5OTk5LAorICAgIFBvcnQgPSA5MDkwLAogCiAgICAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoIjEyNy4wLjAuMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCwKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICB7Q2xpZW50Mywge29rLCBTdW0xfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgYWRkLCBbMSwgNF0pLAogICAgIGlvOmZvcm1hdCgiMSs0PX5wfm4iLCBbU3VtMV0pLAogCi0gICAgV29yayA9ICN3b3Jre29wPT90dXRvcmlhbF9TVUJUUkFDVCwKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAogICAgICAgICAgICAgICAgICBudW0xPTE1LAogICAgICAgICAgICAgICAgICBudW0yPTEwfSwKICAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLApAQCAtNTUsNyArNTUsNyBAQAogCiAgICAgQ2xpZW50NiA9CiAgICAgICAgIHRyeQotICAgICAgICAgICAgV29yazEgPSAjd29ya3tvcD0/dHV0b3JpYWxfRElWSURFLAorICAgICAgICAgICAgV29yazEgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0xPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCiAgICAgICAgICAgICB7Q2xpZW50UzEsIHtvaywgX1F1b3R9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ1LCBjYWxjdWxhdGUsIFsyLCBXb3JrMV0pLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGE0MTdlMGQuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNlcnZlci5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2ggYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3NWFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCkBAIC0wLDAgKzEsMzcgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVJMX1RIUklGVD0uLi8uLi9saWIvZXJsCisKK2lmICEgWyAtZCAke0VSTF9USFJJRlR9L2ViaW4gXTsgdGhlbgorICAgIGVjaG8gIlBsZWFzZSBidWlsZCB0aGUgVGhyaWZ0IGxpYnJhcnkgYnkgcnVubmluZyBcYG1ha2UnIGluICR7RVJMX1RIUklGVH0iCisgICAgZXhpdCAxCitmaQorCitpZiAhIFsgLWQgZ2VuLWVybCBdOyB0aGVuCisgIC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLXIgLS1nZW4gZXJsIC4uL3R1dG9yaWFsLnRocmlmdAorZmkKKworCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAke0VSTF9USFJJRlR9L2ViaW4gXAorICAgICAtSSBnZW4tZXJsIC1vIGdlbi1lcmwgZ2VuLWVybC8qLmVybCAmJgorICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSBnZW4tZXJsICouZXJsICYmCisgIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIGdlbi1lcmwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzljZWQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCkBAIC0wLDAgKzEsODkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIVFRQIGltcGxlbWVudGF0aW9uIHdhcyBjcmVhdGVkIGJ5CislJSBQZXRlciBOZXVtYXJrIDxuZXVtYXJrLnBldGVyQGdtYWlsLmNvbT4gYmFzZWQgb24KKyUlIHRoZSBiaW5hcnkgcHJvdG9jb2wgKyBzb2NrZXQgdHV0b3JpYWwuIFVzZSB3aXRoIHRoZSBzYW1lIHNlcnZlcgorJSUgdGhhdCB0aGUgSmF2YXNjcmlwdCB0dXRvcmlhbCB1c2VzIQorCistbW9kdWxlKGpzb25fY2xpZW50KS4KKworLWluY2x1ZGUoImNhbGN1bGF0b3JfdGhyaWZ0LmhybCIpLgorCistZXhwb3J0KFt0LzBdKS4KKworJSUgQ2xpZW50IGNvbnN0cnVjdG9yIGZvciB0aGUgaHR0cCB0cmFuc3BvcnRzCislJSB3aXRoIHRoZSBqc29uIHByb3RvY29sCituZXdfY2xpZW50KEhvc3QsIFBhdGgsIFNlcnZpY2UsIF9PcHRpb25zKSAtPgorICAgIHtQcm90b09wdHMsIFRyYW5zT3B0c30gPSB7W10sW119LAorICAgIFRyYW5zcG9ydEZhY3RvcnkgPSBmdW4oKSAtPiB0aHJpZnRfaHR0cF90cmFuc3BvcnQ6bmV3KEhvc3QsIFBhdGgsIFRyYW5zT3B0cykgZW5kLAorICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9qc29uX3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKyAgICB7b2ssIFByb3RvY29sfSA9IFByb3RvY29sRmFjdG9yeSgpLAorICAgIHRocmlmdF9jbGllbnQ6bmV3KFByb3RvY29sLCBTZXJ2aWNlKS4KKworcChYKSAtPgorICAgIGlvOmZvcm1hdCgifnB+biIsIFtYXSksCisgICAgb2suCisKK3QoKSAtPgorICAgIGluZXRzOnN0YXJ0KCksCisgICAge29rLCBDbGllbnQwfSA9IG5ld19jbGllbnQoIjEyNy4wLjAuMTo4MDg4IiwgIi90aHJpZnQvc2VydmljZS90dXRvcmlhbC8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3JfdGhyaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKSwKKyAgICB7Q2xpZW50MSwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAsIHBpbmcsIFtdKSwKKyAgICBpbzpmb3JtYXQoInBpbmd+biIsIFtdKSwKKworICAgIHtDbGllbnQyLCB7b2ssIFN1bX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEsIGFkZCwgIFsxLCAxXSksCisgICAgaW86Zm9ybWF0KCIxKzE9fnB+biIsIFtTdW1dKSwKKworICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCisgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCisKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAorICAgICAgICAgICAgICAgICBudW0xPTE1LAorICAgICAgICAgICAgICAgICBudW0yPTEwfSwKKyAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLAorICAgIGlvOmZvcm1hdCgiMTUtMTA9fnB+biIsIFtEaWZmXSksCisKKyAgICB7Q2xpZW50NSwge29rLCBMb2d9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ0LCBnZXRTdHJ1Y3QsIFsxXSksCisgICAgaW86Zm9ybWF0KCJMb2c6IH5wfm4iLCBbTG9nXSksCisKKyAgICBDbGllbnQ2ID0KKyAgICAgICAgdHJ5CisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKKyAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCisKKyAgICAgICAgICAgIGlvOmZvcm1hdCgiTEFNRTogZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGJyb2tlbn5uIiwgW10pLAorICAgICAgICAgICAgQ2xpZW50UzEKKyAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHRocm93OntDbGllbnRTMiwgWn0gLT4KKyAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIkdvdCBleGNlcHRpb24gd2hlcmUgZXhwZWN0aW5nIC0gdGhlICIgKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZyBpcyBOT1QgYSBwcm9ibGVtISEhfm4iKSwKKyAgICAgICAgICAgICAgICBwKFopLAorICAgICAgICAgICAgICAgIENsaWVudFMyCisgICAgICAgIGVuZCwKKworCisgICAge0NsaWVudDcsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ2LCB6aXAsIFtdKSwKKyAgICBpbzpmb3JtYXQoInppcH5uIiwgW10pLAorCisgICAge19DbGllbnQ4LCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDcpLAorICAgIG9rLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybAppbmRleCA1YTk5NGNlLi42NDdjYzI0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybApAQCAtMzYsMjUgKzM2LDI1IEBACiAgICAgTjErTjIuCiAKIGNhbGN1bGF0ZShMb2dpZCwgV29yaykgLT4KLSAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjd29yay5vcCwgV29yayN3b3JrLm51bTEsIFdvcmsjd29yay5udW0yIH0sCisgICAgeyBPcCwgTnVtMSwgTnVtMiB9ID0geyBXb3JrIydXb3JrJy5vcCwgV29yayMnV29yaycubnVtMSwgV29yayMnV29yaycubnVtMiB9LAogICAgIGRlYnVnKCJjYWxjdWxhdGUofnAsIHt+cCx+cCx+cH0pIiwgW0xvZ2lkLCBPcCwgTnVtMSwgTnVtMl0pLAogICAgIGNhc2UgT3Agb2YKLSAgICAgICAgP3R1dG9yaWFsX0FERCAgICAgIC0+IE51bTEgKyBOdW0yOwotCT90dXRvcmlhbF9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKLQk/dHV0b3JpYWxfTVVMVElQTFkgLT4gTnVtMSAqIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fQUREICAgICAgLT4gTnVtMSArIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QgLT4gTnVtMSAtIE51bTI7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fTVVMVElQTFkgLT4gTnVtMSAqIE51bTI7CiAKLQk/dHV0b3JpYWxfRElWSURFIHdoZW4gTnVtMiA9PSAwIC0+Ci0JICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXQ9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOwotCT90dXRvcmlhbF9ESVZJREUgLT4KLQkgICAgTnVtMSBkaXYgTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgd2hlbiBOdW0yID09IDAgLT4KKyAgICAgICAgICB0aHJvdygjJ0ludmFsaWRPcGVyYXRpb24ne3doYXRPcD1PcCwgd2h5PSJDYW5ub3QgZGl2aWRlIGJ5IDAifSk7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFIC0+CisgICAgICAgICAgTnVtMSBkaXYgTnVtMjsKIAotCV9FbHNlIC0+Ci0JICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXQ9T3AsIHdoeT0iSW52YWxpZCBvcGVyYXRpb24ifSkKKyAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICB0aHJvdygjJ0ludmFsaWRPcGVyYXRpb24ne3doYXRPcD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQogICAgIGVuZC4KIAogZ2V0U3RydWN0KEtleSkgLT4KICAgICBkZWJ1ZygiZ2V0U3RydWN0KH5wKSIsIFtLZXldKSwKLSAgICAjc2hhcmVkU3RydWN0e2tleT1LZXksIHZhbHVlPSJSQVJHIn0uCisgICAgIydTaGFyZWRTdHJ1Y3Qne2tleT1LZXksIHZhbHVlPSJSQVJHIn0uCiAKIHppcCgpIC0+CiAgICAgZGVidWcoInppcCIsIFtdKSwKQEAgLTYzLDcgKzYzLDcgQEAKICUlCiAKIHN0YXJ0KCkgLT4KLSAgICBzdGFydCg5OTk5KS4KKyAgICBzdGFydCg5MDkwKS4KIAogc3RhcnQoUG9ydCkgLT4KICAgICBIYW5kbGVyICAgPSA/TU9EVUxFLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5zaCBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuc2gKaW5kZXggMTA2Yzg5ZS4uNzc1YWZiNiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvZXJsL3NlcnZlci5zaAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLnNoCkBAIC0yNiwxMiArMjYsMTIgQEAKICAgICBleGl0IDEKIGZpCiAKLWlmICEgWyAtZCAuLi9nZW4tZXJsIF07IHRoZW4KLSAgICBlY2hvICJQbGVhc2UgcnVuIHRocmlmdCBmaXJzdCB0byBnZW5lcmF0ZSAuLi9nZW4tZXJsLyIKLSAgICBleGl0IDEKK2lmICEgWyAtZCBnZW4tZXJsIF07IHRoZW4KKyAgLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtLWdlbiBlcmwgLi4vdHV0b3JpYWwudGhyaWZ0CiBmaQogCiAKLWVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIC4uL2dlbi1lcmwgLW8gLi4vZ2VuLWVybCAuLi9nZW4tZXJsLyouZXJsICAmJgotICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAuLi9nZW4tZXJsICouZXJsICYmCi0gIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIC4uL2dlbi1lcmwgCitlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSAke0VSTF9USFJJRlR9L2ViaW4gXAorICAgICAtSSBnZW4tZXJsIC1vIGdlbi1lcmwgZ2VuLWVybC8qLmVybCAmJgorICBlcmxjIC1JICR7RVJMX1RIUklGVH0vaW5jbHVkZSAtSSBnZW4tZXJsICouZXJsICYmCisgIGVybCArSyB0cnVlIC1wYSAke0VSTF9USFJJRlR9L2ViaW4gLXBhIGdlbi1lcmwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1N2Q2NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tZ28vdHV0b3JpYWwvY2FsY3VsYXRvci5nbyBnZW4tZ28vc2hhcmVkL3NoYXJlZF9zZXJ2aWNlLmdvOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvCisKK2NoZWNrOiBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQgdGhpcmRwYXJ0eS1kZXAKKwkkKFRIUklGVCkgLXIgLS1nZW4gZ28kKENPTVBJTEVSX0VYVFJBRkxBRykgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwljcCAtciBnZW4tZ28vKiBzcmMvCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGdvLXR1dG9yaWFsIC4vc3JjCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGNhbGN1bGF0b3ItcmVtb3RlIHNyYy90dXRvcmlhbC9jYWxjdWxhdG9yLXJlbW90ZS9jYWxjdWxhdG9yLXJlbW90ZS5nbworCitzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQ6CisJbWtkaXIgLXAgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28KKwlsbiAtc2YgJChyZWFscGF0aCAkKHRvcF9zcmNkaXIpL2xpYi9nby90aHJpZnQpIHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdAorCit0aGlyZHBhcnR5LWRlcDoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIC1zZXJ2ZXI9dHJ1ZSAtc2VjdXJlPXRydWUKKwordHV0b3JpYWxzZWN1cmVjbGllbnQ6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlY3VyZT10cnVlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qIHNyYy9zaGFyZWQgc3JjL3R1dG9yaWFsIHNyYy9naXQuYXBhY2hlLm9yZyBnby10dXRvcmlhbCBjYWxjdWxhdG9yLXJlbW90ZQorCitFWFRSQV9ESVNUID0gXAorCXNyYy9jbGllbnQuZ28gXAorCXNyYy9oYW5kbGVyLmdvIFwKKwlzcmMvc2VydmVyLmdvIFwKKwlzcmMvbWFpbi5nbyBcCisJc2VydmVyLmNydCBcCisJc2VydmVyLmtleQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zZXJ2ZXIuY3J0IGIvdHV0b3JpYWwvZ28vc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc2VydmVyLmtleSBiL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkKQEAgLTAsMCArMSwyOCBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28gYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWJlMDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgorCSJmbXQiCisJInR1dG9yaWFsIgorCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgaGFuZGxlQ2xpZW50KGNsaWVudCAqdHV0b3JpYWwuQ2FsY3VsYXRvckNsaWVudCkgKGVyciBlcnJvcikgeworCWNsaWVudC5QaW5nKGRlZmF1bHRDdHgpCisJZm10LlByaW50bG4oInBpbmcoKSIpCisKKwlzdW0sIF8gOj0gY2xpZW50LkFkZChkZWZhdWx0Q3R4LCAxLCAxKQorCWZtdC5QcmludCgiMSsxPSIsIHN1bSwgIlxuIikKKworCXdvcmsgOj0gdHV0b3JpYWwuTmV3V29yaygpCisJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREUKKwl3b3JrLk51bTEgPSAxCisJd29yay5OdW0yID0gMAorCXF1b3RpZW50LCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQorCWlmIGVyciAhPSBuaWwgeworCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKKwkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKKwkJCWZtdC5QcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjoiLCB2KQorCQlkZWZhdWx0OgorCQkJZm10LlByaW50bG4oIkVycm9yIGR1cmluZyBvcGVyYXRpb246IiwgZXJyKQorCQl9CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnRsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAgd2l0aCBuZXcgdmFsdWU6IiwgcXVvdGllbnQpCisJfQorCisJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9TVUJUUkFDVAorCXdvcmsuTnVtMSA9IDE1CisJd29yay5OdW0yID0gMTAKKwlkaWZmLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQorCWlmIGVyciAhPSBuaWwgeworCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKKwkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKKwkJCWZtdC5QcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjoiLCB2KQorCQlkZWZhdWx0OgorCQkJZm10LlByaW50bG4oIkVycm9yIGR1cmluZyBvcGVyYXRpb246IiwgZXJyKQorCQl9CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnQoIjE1LTEwPSIsIGRpZmYsICJcbiIpCisJfQorCisJbG9nLCBlcnIgOj0gY2xpZW50LkdldFN0cnVjdChkZWZhdWx0Q3R4LCAxKQorCWlmIGVyciAhPSBuaWwgeworCQlmbXQuUHJpbnRsbigiVW5hYmxlIHRvIGdldCBzdHJ1Y3Q6IiwgZXJyKQorCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJZm10LlByaW50bG4oIkNoZWNrIGxvZzoiLCBsb2cuVmFsdWUpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyBydW5DbGllbnQodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgYWRkciBzdHJpbmcsIHNlY3VyZSBib29sKSBlcnJvciB7CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydAorCXZhciBlcnIgZXJyb3IKKwlpZiBzZWN1cmUgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWNmZy5JbnNlY3VyZVNraXBWZXJpZnkgPSB0cnVlCisJCXRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoYWRkciwgY2ZnKQorCX0gZWxzZSB7CisJCXRyYW5zcG9ydCwgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQoYWRkcikKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGxuKCJFcnJvciBvcGVuaW5nIHNvY2tldDoiLCBlcnIpCisJCXJldHVybiBlcnIKKwl9CisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlpZiBlcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwlvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXJldHVybiBoYW5kbGVDbGllbnQodHV0b3JpYWwuTmV3Q2FsY3VsYXRvckNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpKQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBlZWQwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28KQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkic2hhcmVkIgorCSJzdHJjb252IgorCSJ0dXRvcmlhbCIKKykKKwordHlwZSBDYWxjdWxhdG9ySGFuZGxlciBzdHJ1Y3QgeworCWxvZyBtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0Cit9CisKK2Z1bmMgTmV3Q2FsY3VsYXRvckhhbmRsZXIoKSAqQ2FsY3VsYXRvckhhbmRsZXIgeworCXJldHVybiAmQ2FsY3VsYXRvckhhbmRsZXJ7bG9nOiBtYWtlKG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QpfQorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJwaW5nKClcbiIpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKGN0eCBjb250ZXh0LkNvbnRleHQsIG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJhZGQoIiwgbnVtMSwgIiwiLCBudW0yLCAiKVxuIikKKwlyZXR1cm4gbnVtMSArIG51bTIsIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwgeyIsIHcuT3AsICIsIiwgdy5OdW0xLCAiLCIsIHcuTnVtMiwgIn0pXG4iKQorCXN3aXRjaCB3Lk9wIHsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9BREQ6CisJCXZhbCA9IHcuTnVtMSArIHcuTnVtMgorCQlicmVhaworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX1NVQlRSQUNUOgorCQl2YWwgPSB3Lk51bTEgLSB3Lk51bTIKKwkJYnJlYWsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9NVUxUSVBMWToKKwkJdmFsID0gdy5OdW0xICogdy5OdW0yCisJCWJyZWFrCisJY2FzZSB0dXRvcmlhbC5PcGVyYXRpb25fRElWSURFOgorCQlpZiB3Lk51bTIgPT0gMCB7CisJCQlvdWNoIDo9IHR1dG9yaWFsLk5ld0ludmFsaWRPcGVyYXRpb24oKQorCQkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQorCQkJb3VjaC5XaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorCQkJZXJyID0gb3VjaAorCQkJcmV0dXJuCisJCX0KKwkJdmFsID0gdy5OdW0xIC8gdy5OdW0yCisJCWJyZWFrCisJZGVmYXVsdDoKKwkJb3VjaCA6PSB0dXRvcmlhbC5OZXdJbnZhbGlkT3BlcmF0aW9uKCkKKwkJb3VjaC5XaGF0T3AgPSBpbnQzMih3Lk9wKQorCQlvdWNoLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKKwkJZXJyID0gb3VjaAorCQlyZXR1cm4KKwl9CisJZW50cnkgOj0gc2hhcmVkLk5ld1NoYXJlZFN0cnVjdCgpCisJZW50cnkuS2V5ID0gbG9naWQKKwllbnRyeS5WYWx1ZSA9IHN0cmNvbnYuSXRvYShpbnQodmFsKSkKKwlrIDo9IGludChsb2dpZCkKKwkvKgorCSAgIG9sZHZhbHVlLCBleGlzdHMgOj0gcC5sb2dba10KKwkgICBpZiBleGlzdHMgeworCSAgICAgZm10LlByaW50KCJSZXBsYWNpbmcgIiwgb2xkdmFsdWUsICIgd2l0aCAiLCBlbnRyeSwgIiBmb3Iga2V5ICIsIGssICJcbiIpCisJICAgfSBlbHNlIHsKKwkgICAgIGZtdC5QcmludCgiQWRkaW5nICIsIGVudHJ5LCAiIGZvciBrZXkgIiwgaywgIlxuIikKKwkgICB9CisJKi8KKwlwLmxvZ1trXSA9IGVudHJ5CisJcmV0dXJuIHZhbCwgZXJyCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBHZXRTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwga2V5IGludDMyKSAoKnNoYXJlZC5TaGFyZWRTdHJ1Y3QsIGVycm9yKSB7CisJZm10LlByaW50KCJnZXRTdHJ1Y3QoIiwga2V5LCAiKVxuIikKKwl2LCBfIDo9IHAubG9nW2ludChrZXkpXQorCXJldHVybiB2LCBuaWwKK30KKworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZm10LlByaW50KCJ6aXAoKVxuIikKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvbWFpbi5nbyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzBkN2IKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvbWFpbi5nbwpAQCAtMCwwICsxLDgyIEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJmbGFnIgorCSJmbXQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorCSJvcyIKKykKKworZnVuYyBVc2FnZSgpIHsKKwlmbXQuRnByaW50KG9zLlN0ZGVyciwgIlVzYWdlIG9mICIsIG9zLkFyZ3NbMF0sICI6XG4iKQorCWZsYWcuUHJpbnREZWZhdWx0cygpCisJZm10LkZwcmludChvcy5TdGRlcnIsICJcbiIpCit9CisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlVzYWdlID0gVXNhZ2UKKwlzZXJ2ZXIgOj0gZmxhZy5Cb29sKCJzZXJ2ZXIiLCBmYWxzZSwgIlJ1biBzZXJ2ZXIiKQorCXByb3RvY29sIDo9IGZsYWcuU3RyaW5nKCJQIiwgImJpbmFyeSIsICJTcGVjaWZ5IHRoZSBwcm90b2NvbCAoYmluYXJ5LCBjb21wYWN0LCBqc29uLCBzaW1wbGVqc29uKSIpCisJZnJhbWVkIDo9IGZsYWcuQm9vbCgiZnJhbWVkIiwgZmFsc2UsICJVc2UgZnJhbWVkIHRyYW5zcG9ydCIpCisJYnVmZmVyZWQgOj0gZmxhZy5Cb29sKCJidWZmZXJlZCIsIGZhbHNlLCAiVXNlIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpCisJYWRkciA6PSBmbGFnLlN0cmluZygiYWRkciIsICJsb2NhbGhvc3Q6OTA5MCIsICJBZGRyZXNzIHRvIGxpc3RlbiB0byIpCisJc2VjdXJlIDo9IGZsYWcuQm9vbCgic2VjdXJlIiwgZmFsc2UsICJVc2UgdGxzIHNlY3VyZSB0cmFuc3BvcnQiKQorCisJZmxhZy5QYXJzZSgpCisKKwl2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5CisJc3dpdGNoICpwcm90b2NvbCB7CisJY2FzZSAiY29tcGFjdCI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAic2ltcGxlanNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAianNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAiYmluYXJ5IiwgIiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJZGVmYXVsdDoKKwkJZm10LkZwcmludChvcy5TdGRlcnIsICJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCIsIHByb3RvY29sLCAiXG4iKQorCQlVc2FnZSgpCisJCW9zLkV4aXQoMSkKKwl9CisKKwl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKKwlpZiAqYnVmZmVyZWQgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODE5MikKKwl9IGVsc2UgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl9CisKKwlpZiAqZnJhbWVkIHsKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCX0KKworCWlmICpzZXJ2ZXIgeworCQlpZiBlcnIgOj0gcnVuU2VydmVyKHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgKmFkZHIsICpzZWN1cmUpOyBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGxuKCJlcnJvciBydW5uaW5nIHNlcnZlcjoiLCBlcnIpCisJCX0KKwl9IGVsc2UgeworCQlpZiBlcnIgOj0gcnVuQ2xpZW50KHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgKmFkZHIsICpzZWN1cmUpOyBlcnIgIT0gbmlsIHsKKwkJCWZtdC5QcmludGxuKCJlcnJvciBydW5uaW5nIGNsaWVudDoiLCBlcnIpCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwOGViCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIG1haW4KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgKAorCSJjcnlwdG8vdGxzIgorCSJmbXQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgorCSJ0dXRvcmlhbCIKKykKKworZnVuYyBydW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgYWRkciBzdHJpbmcsIHNlY3VyZSBib29sKSBlcnJvciB7CisJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydAorCXZhciBlcnIgZXJyb3IKKwlpZiBzZWN1cmUgeworCQljZmcgOj0gbmV3KHRscy5Db25maWcpCisJCWlmIGNlcnQsIGVyciA6PSB0bHMuTG9hZFg1MDlLZXlQYWlyKCJzZXJ2ZXIuY3J0IiwgInNlcnZlci5rZXkiKTsgZXJyID09IG5pbCB7CisJCQljZmcuQ2VydGlmaWNhdGVzID0gYXBwZW5kKGNmZy5DZXJ0aWZpY2F0ZXMsIGNlcnQpCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNlcnZlclNvY2tldChhZGRyLCBjZmcpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChhZGRyKQorCX0KKwkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlmbXQuUHJpbnRmKCIlVFxuIiwgdHJhbnNwb3J0KQorCWhhbmRsZXIgOj0gTmV3Q2FsY3VsYXRvckhhbmRsZXIoKQorCXByb2Nlc3NvciA6PSB0dXRvcmlhbC5OZXdDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZm10LlByaW50bG4oIlN0YXJ0aW5nIHRoZSBzaW1wbGUgc2VydmVyLi4uIG9uICIsIGFkZHIpCisJcmV0dXJuIHNlcnZlci5TZXJ2ZSgpCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYyNzEzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDk3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCitCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAorQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeCBnZW4taGF4ZS9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuaHg6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhheGUgLXIgJDwKKworYWxsLWxvY2FsOiAkKEJJTl9DUFApICQoQklOX1BIUCkgJChCSU5fUEhQX1dFQikKKworY2hlY2s6IGdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKworJChCSU5fQ1BQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQklOX0NQUCkgc2VydmVyCisKK3R1dG9yaWFsc2VydmVyX3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkkKEJJTl9DUFApCisKK3R1dG9yaWFsY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKKwkkKEJJTl9DUFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlY2xpZW50OiBhbGwKKwkkKEJJTl9DUFApIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZWNsaWVudF9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlY3VyZQorCit0dXRvcmlhbHNlcnZlcl9waHBfaHR0cDogYWxsCisJcGhwIC1TIDEyNy4wLjAuMTo5MDkwIHJvdXRlci5waHAKKwordHV0b3JpYWxjbGllbnRfaHR0cDogYWxsCisJJChCSU5fQ1BQKSBjbGllbnQgaHR0cAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4taGF4ZSBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCWNwcC5oeG1sIFwKKwljc2hhcnAuaHhtbCBcCisJZmxhc2guaHhtbCBcCisJamF2YS5oeG1sIFwKKwlqYXZhc2NyaXB0Lmh4bWwgXAorCXBocC13ZWItc2VydmVyLmh4bWwgXAorCW5la28uaHhtbCBcCisJcGhwLmh4bWwgXAorCXB5dGhvbi5oeG1sIFwKKwlyb3V0ZXIucGhwIFwKKwlwcm9qZWN0LmhpZGUgXAorCVR1dG9yaWFsLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9UdXRvcmlhbC5oeHByb2ogYi90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZmNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9UdXRvcmlhbC5oeHByb2oKQEAgLTAsMCArMSw2NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjIiPgorICA8IS0tIE91dHB1dCBTV0Ygb3B0aW9ucyAtLT4KKyAgPG91dHB1dD4KKyAgICA8bW92aWUgb3V0cHV0VHlwZT0iQXBwbGljYXRpb24iIC8+CisgICAgPG1vdmllIGlucHV0PSIiIC8+CisgICAgPG1vdmllIHBhdGg9ImJpbi9IYXhlVHV0b3JpYWwiIC8+CisgICAgPG1vdmllIGZwcz0iMzAiIC8+CisgICAgPG1vdmllIHdpZHRoPSI4MDAiIC8+CisgICAgPG1vdmllIGhlaWdodD0iNjAwIiAvPgorICAgIDxtb3ZpZSB2ZXJzaW9uPSIxIiAvPgorICAgIDxtb3ZpZSBtaW5vclZlcnNpb249IjAiIC8+CisgICAgPG1vdmllIHBsYXRmb3JtPSJDKysiIC8+CisgICAgPG1vdmllIGJhY2tncm91bmQ9IiNGRkZGRkYiIC8+CisgIDwvb3V0cHV0PgorICA8IS0tIE90aGVyIGNsYXNzZXMgdG8gYmUgY29tcGlsZWQgaW50byB5b3VyIFNXRiAtLT4KKyAgPGNsYXNzcGF0aHM+CisgICAgPGNsYXNzIHBhdGg9InNyYyIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iZ2VuLWhheGUiIC8+CisgICAgPGNsYXNzIHBhdGg9Ii4uLy4uL2xpYi9oYXhlL3NyYyIgLz4KKyAgPC9jbGFzc3BhdGhzPgorICA8IS0tIEJ1aWxkIG9wdGlvbnMgLS0+CisgIDxidWlsZD4KKyAgICA8b3B0aW9uIGRpcmVjdGl2ZXM9IiIgLz4KKyAgICA8b3B0aW9uIGZsYXNoU3RyaWN0PSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG5vSW5saW5lT25EZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBtYWluQ2xhc3M9Ik1haW4iIC8+CisgICAgPG9wdGlvbiBlbmFibGVkZWJ1Zz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBhZGRpdGlvbmFsPSIiIC8+CisgIDwvYnVpbGQ+CisgIDwhLS0gaGF4ZWxpYiBsaWJyYXJpZXMgLS0+CisgIDxoYXhlbGliPgorICAgIDwhLS0gZXhhbXBsZTogPGxpYnJhcnkgbmFtZT0iLi4uIiAvPiAtLT4KKyAgPC9oYXhlbGliPgorICA8IS0tIENsYXNzIGZpbGVzIHRvIGNvbXBpbGUgKG90aGVyIHJlZmVyZW5jZWQgY2xhc3NlcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQpIC0tPgorICA8Y29tcGlsZVRhcmdldHM+CisgICAgPCEtLSBleGFtcGxlOiA8Y29tcGlsZSBwYXRoPSIuLi4iIC8+IC0tPgorICA8L2NvbXBpbGVUYXJnZXRzPgorICA8IS0tIFBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB0cmVlIC0tPgorICA8aGlkZGVuUGF0aHM+CisgICAgPGhpZGRlbiBwYXRoPSJvYmoiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjcHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNzaGFycC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iZmxhc2guaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmEuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImphdmFzY3JpcHQuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLmJhdCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im1ha2VfYWxsLnNoIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iTWFrZWZpbGUuYW0iIC8+CisgICAgPGhpZGRlbiBwYXRoPSJuZWtvLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwaHAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InByb2plY3QuaGlkZSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InB5dGhvbi5oeG1sIiAvPgorICA8L2hpZGRlblBhdGhzPgorICA8IS0tIEV4ZWN1dGVkIGJlZm9yZSBidWlsZCAtLT4KKyAgPHByZUJ1aWxkQ29tbWFuZD50aHJpZnQgLXIgLWdlbiBoYXhlICAuLi90dXRvcmlhbC50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iVW5rbm93biIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9IiIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwgYi90dXRvcmlhbC9oYXhlL2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UdXRvcmlhbC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvZmxhc2guaHhtbCBiL3R1dG9yaWFsL2hheGUvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYwNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1R1dG9yaWFsLnN3ZgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworIyB3ZSBuZWVkIHNvbWUgZ29vZGllcyBmcm9tIHN5cy5uZXQKKyMgLS1tYWNybyBhbGxvd1BhY2thZ2UoInN5cyIpCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvamF2YS5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxNTU2NQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYyAKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UdXRvcmlhbC5qYXIKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvamF2YXNjcmlwdC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMzg3NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvamF2YXNjcmlwdC5oeG1sCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhU2NyaXB0IHRhcmdldAorLWpzIGJpbi9UdXRvcmlhbC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuYmF0IGIvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgIC4uXHR1dG9yaWFsLnRocmlmdAoraWYgZXJyb3JsZXZlbCAxIGdvdG8gU1RPUAorCityZW0gIyBpbnZva2UgSGF4ZSBjb21waWxlciBmb3IgYWxsIHRhcmdldHMKK2ZvciAlJWEgaW4gKCouaHhtbCkgZG8gKAorCXJlbSAqIGZpbHRlciBQeXRob24sIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgSGF4ZSAzLjEuMyAoYnV0IHdpbGwgYmUgaW4gMy4xLjQpCisJaWYgbm90ICIlJWEiPT0icHl0aG9uLmh4bWwiICgKKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQllY2hvIEJ1aWxkaW5nICUlYSAuLi4KKwkJZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQloYXhlICAtLWN3ZCAuICAlJWEKKwkpCispCisKKworZWNoby4KK2VjaG8gZG9uZS4KK3BhdXNlCitnb3RvIGVvZgorCis6Tk9USU5TVEFMTEVECitlY2hvIEZBVEFMOiBFaXRoZXIgSGF4ZSBpcyBub3QgaW5zdGFsbGVkLCBvciB0aGUgSEFYRVBBVEggdmFyaWFibGUgaXMgbm90IHNldC4KK3BhdXNlCitnb3RvIGVvZgorCis6TUlTU0lOR1ZBUlMKK2VjaG8gRkFUQUw6IFVuYWJsZSB0byBsb2NhdGUgaG9tZSBmb2xkZXIuCitlY2hvLgorZWNobyBCb3RoIEhPTUVEUklWRSBhbmQgSE9NRVBBVEggbmVlZCB0byBiZSBzZXQgdG8gcG9pbnQgdG8geW91ciBIb21lIGZvbGRlci4KK2VjaG8gVGhlIGN1cnJlbnQgdmFsdWVzIGFyZToKK2VjaG8gSE9NRURSSVZFPSVIT01FRFJJVkUlCitlY2hvIEhPTUVQQVRIPSVIT01FUEFUSCUKK3BhdXNlCitnb3RvIGVvZgorCis6U1RPUAorcGF1c2UKK2dvdG8gZW9mCisKKzplb2YKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2ggYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTY1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLnNoCkBAIC0wLDAgKzEsNDEgQEAKKyMhL2Jpbi9zaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uL3R1dG9yaWFsLnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBvaWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9uZWtvLmh4bWwgYi90dXRvcmlhbC9oYXhlL25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYxZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVHV0b3JpYWwubgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKQEAgLTAsMCArMSw0MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC13ZWItc2VydmVyLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI2RlZmluZXMKKy1EIHBocHdlYnNlcnZlcgorCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjY4ODcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3Byb2plY3QuaGlkZSBiL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNWQ0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDEwNSBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiQXBhY2hlIFRocmlmdCBUdXRvcmlhbCIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIgorICAgICwibGljZW5zZSIgOiAiQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgorICAgICwidXJsIiA6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UdXRvcmlhbC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1R1dG9yaWFsLm4iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicGhwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3BwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vTWFpbi1kZWJ1Zy5leGUiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YS5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNzaGFycC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxUdXRvcmlhbC5leGVcXGJpblxcTWFpbi1EZWJ1Zy5leGUiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1R1dG9yaWFsLnB5IgorICAgICAgICB9CisgICAgXQorICAgICwiZmlsZXMiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXG9yZ1xcYXBhY2hlXFx0aHJpZnRcXHNlcnZlclxcVFNlcnZlci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDc2CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxvcmdcXGFwYWNoZVxcdGhyaWZ0XFxzZXJ2ZXJcXFRTaW1wbGVTZXJ2ZXIuaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiAxMDAKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXHNoYXJlZFxcU2hhcmVkU2VydmljZVByb2Nlc3Nvci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDIwCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFx0dXRvcmlhbFxcQ2FsY3VsYXRvclByb2Nlc3Nvci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDc5CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxNYWluLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMAorICAgICAgICB9CisgICAgXQorICAgICwiYWN0aXZlRmlsZSIgOiAic3JjXFxNYWluLmh4IgorICAgICwib3BlbkZMVGFyZ2V0IiA6IG51bGwKKyAgICAsIm9wZW5GTEJ1aWxkTW9kZSIgOiAiRGVidWciCisgICAgLCJydW5BY3Rpb25UeXBlIiA6IG51bGwKKyAgICAsInJ1bkFjdGlvblRleHQiIDogbnVsbAorICAgICwiYnVpbGRBY3Rpb25Db21tYW5kIiA6IG51bGwKKyAgICAsImhpZGRlbkl0ZW1zIiA6IFsKKworICAgIF0KKyAgICAsInNob3dIaWRkZW5JdGVtcyIgOiBmYWxzZQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwgYi90dXRvcmlhbC9oYXhlL3B5dGhvbi5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3B5dGhvbi5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQeXRob24gdGFyZ2V0CistcHl0aG9uIGJpbi9UdXRvcmlhbC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwIGIvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKQEAgLTAsMCArMSwzMSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworCisKKy8vcm91dGVyIGZpbGUgdG8gcnVuIHRlc3Rpbmcgd2ViIHNlcnZlcgorCisvL3NldF90aW1lX2xpbWl0KDEpOworCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmh4IGIvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3NTJkYgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmh4CkBAIC0wLDAgKzEsMTAxIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHR1dG9yaWFsLio7CitpbXBvcnQgc2hhcmVkLio7CisKKworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKworICAgIHByaXZhdGUgdmFyIGxvZyA9IG5ldyBJbnRNYXA8U2hhcmVkU3RydWN0PigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcGluZygpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCJwaW5nKCkiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQoIG51bTEgOiBoYXhlLkludDMyLCBudW0yIDogaGF4ZS5JbnQzMikgOiBoYXhlLkludDMyIHsKKyAgICAgICAgdHJhY2UoJ2FkZCggJG51bTEsICRudW0yKScpOworICAgICAgICByZXR1cm4gbnVtMSArIG51bTI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSggbG9naWQgOiBoYXhlLkludDMyLCB3b3JrIDogV29yaykgOiBoYXhlLkludDMyICB7CisgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoICRsb2dpZCwgJyt3b3JrLm9wKyIsIit3b3JrLm51bTErIiwiK3dvcmsubnVtMisiKSIpOworCisgICAgICAgIHZhciB2YWwgOiBoYXhlLkludDMyID0gMDsKKyAgICAgICAgc3dpdGNoICh3b3JrLm9wKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworCisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKworICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgICAgICAgICAgIGlvLndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gU3RkLmludCggd29yay5udW0xIC8gd29yay5udW0yKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2YXIgaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgICAgICAgICAgaW8ud2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgICAgIGVudHJ5LnZhbHVlID0gJyR2YWwnOworICAgICAgICBsb2cuc2V0KGxvZ2lkLCBlbnRyeSk7CisKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RydWN0KCBrZXkgOiBoYXhlLkludDMyKSA6IFNoYXJlZFN0cnVjdCB7CisgICAgICAgIHRyYWNlKCdnZXRTdHJ1Y3QoJGtleSknKTsKKyAgICAgICAgcmV0dXJuIGxvZy5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvLyBvbmV3YXkgbWV0aG9kLCAgbm8gYXJncworICAgIHB1YmxpYyBmdW5jdGlvbiB6aXAoKSA6IFZvaWQgeworICAgICAgICB0cmFjZSgiemlwKCkiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHggYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWJlNzEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0dXRvcmlhbC4qOworaW1wb3J0IHNoYXJlZC4qOworCisKK2VudW0gUHJvdCB7CisgICAgYmluYXJ5OworICAgIGpzb247Cit9CisKK2VudW0gVHJucyB7CisgICAgc29ja2V0OworICAgIGh0dHA7Cit9CisKK2NsYXNzIE1haW4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHNlcnZlciA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgZnJhbWVkIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBidWZmZXJlZCA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgcHJvdCA6IFByb3QgPSBiaW5hcnk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRybnMgOiBUcm5zID0gc29ja2V0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHRhcmdldEhvc3QgOiBTdHJpbmcgPSAibG9jYWxob3N0IjsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGFyZ2V0UG9ydCA6IEludCA9IDkwOTA7CisKKyAgICBzdGF0aWMgZnVuY3Rpb24gbWFpbigpIHsKKworICAgICAgICAjaWYgISAoZmxhc2ggfHwganMgfHwgcGhwd2Vic2VydmVyKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICB0cmFjZShHZXRIZWxwKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiAgcGhwd2Vic2VydmVyCisgICAgICAgIC8vZm9yY2luZyBzZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgdHJucyA9IGh0dHA7CisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmQKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcnZlcikKKyAgICAgICAgICAgICAgICBSdW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBSdW5DbGllbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIH0KKworICAgICAgICB0cmFjZSgiQ29tcGxldGVkLiIpOworICAgIH0KKworICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGhwV2ViU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCisgICAgICAgIGhheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykKKyAgICAgICAgeworICAgICAgICAgIC8vIGhhbmRsZSB0cmFjZQorICAgICAgICAgIHZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisgICAgICAgICAgaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisgICAgICAgICAgICB2YXIgZXh0cmE6U3RyaW5nID0gIiI7CisgICAgICAgICAgICBmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKyAgICAgICAgICAgICAgZXh0cmEgKz0gIiwiICsgdjsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdiArIGV4dHJhOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gdjsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisgICAgICAgICAgU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZAorCisKKyAgICAjaWYgISAoZmxhc2ggfHwganMpCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBHZXRIZWxwKCkgOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gU3lzLmV4ZWN1dGFibGVQYXRoKCkrIiAgbW9kdXMgIHRybnNPcHRpb24gIHRyYW5zcG9ydCAgcHJvdG9jb2xcbiIKKyAgICAgICAgKyJPcHRpb25zOlxuIgorICAgICAgICArIiAgbW9kdXM6ICAgICAgIGNsaWVudCwgc2VydmVyICAgKGRlZmF1bHQ6IGNsaWVudClcbiIKKyAgICAgICAgKyIgIHRybnNPcHRpb246ICBmcmFtZWQsIGJ1ZmZlcmVkIChkZWZhdWx0OiBub25lKVxuIgorICAgICAgICArIiAgdHJhbnNwb3J0OiAgIHNvY2tldCwgaHR0cCAgICAgKGRlZmF1bHQ6IHNvY2tldClcbiIKKyAgICAgICAgKyIgIHByb3RvY29sOiAgICBiaW5hcnksIGpzb24gICAgIChkZWZhdWx0OiBiaW5hcnkpXG4iCisgICAgICAgICsiXG4iCisgICAgICAgICsiQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4iOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gUGFyc2VBcmdzKCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHN0ZXAgPSAwOworICAgICAgICBmb3IgKGFyZyBpbiBTeXMuYXJncygpKSB7CisKKyAgICAgICAgICAgIC8vIHNlcnZlcnxjbGllbnQKKyAgICAgICAgICAgIHN3aXRjaChzdGVwKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIGlmICggYXJnID09ICJjbGllbnQiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggYXJnID09ICJzZXJ2ZXIiKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImZyYW1lZCIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImJ1ZmZlcmVkIikgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYXJnID09ICJzb2NrZXQiKSB7CisgICAgICAgICAgICAgICAgICAgIHRybnMgPSBzb2NrZXQ7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImh0dHAiKSB7CisgICAgICAgICAgICAgICAgICAgIHRybnMgPSBodHRwOworICAgICAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gdHJhbnNwb3J0ICIrYXJnOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmICggYXJnID09ICJiaW5hcnkiKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3QgPSBiaW5hcnk7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gImpzb24iKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3QgPSBqc29uOworICAgICAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVua25vd24gcHJvdG9jb2wgIithcmc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIGFyZ3VtZW50ICIrYXJnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGZyYW1lZCAmJiBidWZmZXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiV046IGZyYW1lZCBzdXBlcnNlZGVzIGJ1ZmZlcmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgICNlbmQKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIENsaWVudFNldHVwKCkgOiBDYWxjdWxhdG9yIHsKKyAgICAgICAgIHRyYWNlKCJDbGllbnQgY29uZmlndXJhdGlvbjoiKTsKKworICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQ7CisgICAgICAgIHN3aXRjaCh0cm5zKQorICAgICAgICB7CisgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgIHRyYWNlKCctIHNvY2tldCB0cmFuc3BvcnQgJHRhcmdldEhvc3Q6JHRhcmdldFBvcnQnKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCB0YXJnZXRIb3N0LCB0YXJnZXRQb3J0KTsKKyAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHt0YXJnZXRIb3N0fToke3RhcmdldFBvcnR9JzsKKyAgICAgICAgICAgIHRyYWNlKCctIEhUVFAgdHJhbnNwb3J0ICR1cmknKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOworICAgICAgICB9CisKKworICAgICAgICAvLyBvcHRpbmFsIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgIGlmICggZnJhbWVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9IGVsc2UgaWYgKCBidWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHByb3RvY29sCisgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbDsKKyAgICAgICAgc3dpdGNoKHByb3QpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCB0cmFuc3BvcnQpOworICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICAgdHJhY2UoIi0gSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woIHRyYW5zcG9ydCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHByb3RvY29sIjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gcHV0IGV2ZXJ5dGhpbmcgdG9nZXRoZXIKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9ySW1wbChwcm90b2NvbCxwcm90b2NvbCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBSdW5DbGllbnQoKSA6IFZvaWQgeworICAgICAgICB2YXIgY2xpZW50ID0gQ2xpZW50U2V0dXAoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgICBjbGllbnQucGluZygpOworICAgICAgICAgICAgdHJhY2UoInBpbmcoKSBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgncGluZygpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgncGluZygpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHN1bSA9IGNsaWVudC5hZGQoIDEsIDEpOworICAgICAgICAgICAgdHJhY2UoJzErMT0kc3VtJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnYWRkKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdhZGQoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisKKworICAgICAgICB2YXIgd29yayA9IG5ldyB0dXRvcmlhbC5Xb3JrKCk7CisgICAgICAgIHdvcmsub3AgPSB0dXRvcmlhbC5PcGVyYXRpb24uRElWSURFOworICAgICAgICB3b3JrLm51bTEgPSAxOworICAgICAgICB3b3JrLm51bTIgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICAgICAgICB0cmFjZSgnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAhIFJlc3VsdCA9ICRxdW90aWVudCcpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmsub3AgPSB0dXRvcmlhbC5PcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgIHdvcmsubnVtMSA9IDE1OworICAgICAgICB3b3JrLm51bTIgPSAxMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7CisgICAgICAgICAgICB0cmFjZSgnMTUtMTA9JGRpZmYnKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgbG9nIDogU2hhcmVkU3RydWN0ID0gY2xpZW50LmdldFN0cnVjdCggMSk7CisgICAgICAgICAgICB2YXIgbG9ndmFsID0gbG9nLnZhbHVlOworICAgICAgICAgICAgdHJhY2UoJ0NoZWNrIGxvZzogJGxvZ3ZhbCcpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2dldFN0cnVjdCgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnZ2V0U3RydWN0KCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gU2VydmVyU2V0dXAoKSA6IFRTZXJ2ZXIgeworICAgICAgICAgdHJhY2UoIlNlcnZlciBjb25maWd1cmF0aW9uOiIpOworCisgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgIHN3aXRjaCh0cm5zKQorICAgICAgICB7CisgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgICAgIHRocm93ICdjdXJyZW50IHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgc29ja2V0IHNlcnZlcnMnOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICB0cmFjZSgnLSBzb2NrZXQgdHJhbnNwb3J0IHBvcnQgJHRhcmdldFBvcnQnKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCB0YXJnZXRQb3J0KTsKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgY2FzZSBodHRwOgorICAgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAvL3RyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgIHRyYWNlKCItIGh0dHAgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL2lucHV0IiwgUmVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAjZW5kCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgdmFyIHRyYW5zZmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgaWYgKCBmcmFtZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICB9IGVsc2UgaWYgKCBidWZmZXJlZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICB0cmFuc2ZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RmYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgICAgIHN3aXRjaChwcm90KQorICAgICAgICB7CisgICAgICAgIGNhc2UgYmluYXJ5OgorICAgICAgICAgICAgIHRyYWNlKCItIGJpbmFyeSBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgdHJhY2UoIi0gSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgIHByb3RmYWN0b3J5ID0gbmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHByb3RvY29sIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CisgICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgdmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CisgICAgICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgc2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAjZW5kCisKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFJ1blNlcnZlcigpIDogVm9pZCB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyID0gU2VydmVyU2V0dXAoKTsKKworICAgICAgICAgICAgdHJhY2UoIlxuU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnUnVuU2VydmVyKCkgZmFpbGVkOiAkZScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJkb25lLiIpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzIGIvdHV0b3JpYWwvaHMvSGFza2VsbENsaWVudC5ocwppbmRleCBhNTYxODdiLi5iZDI5ZGYwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzCisrKyBiL3R1dG9yaWFsL2hzL0hhc2tlbGxDbGllbnQuaHMKQEAgLTMwLDcgKzMwLDkgQEAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQogaW1wb3J0IFRocmlmdC5TZXJ2ZXIKIAoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCiBpbXBvcnQgRGF0YS5NYXliZQoraW1wb3J0IERhdGEuVGV4dC5MYXp5CiBpbXBvcnQgVGV4dC5QcmludGYKIGltcG9ydCBOZXR3b3JrCiAKQEAgLTQ2LDI4ICs0OCwyNyBAQAogICBwcmludGYgIjErMT0lZFxuIiBzdW0KIAogCi0gIGxldCB3b3JrID0gV29yayB7IGZfV29ya19vcCA9IEp1c3QgRElWSURFLAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMSA9IEp1c3QgMSwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX251bTIgPSBKdXN0IDAsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19jb21tZW50ID0gTm90aGluZworICBsZXQgd29yayA9IFdvcmsgeyB3b3JrX29wID0gRElWSURFLAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTEgPSAxLAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTIgPSAwLAorICAgICAgICAgICAgICAgICAgICB3b3JrX2NvbW1lbnQgPSBOb3RoaW5nCiAgICAgICAgICAgICAgICAgICB9CiAKLSAgLS0gVE9ETyAtIGdldCB0aGlzIG9uZSB3b3JraW5nCi0gIC0tY2F0Y2ggKENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yaykgKFxleGNlcHQgLT4KLSAgLS0gICAgIHByaW50ZiAiSW52YWxpZE9wICVzIiAoc2hvdyBleGNlcHQpKQorICBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaCAocHJpbnRmICIxLzA9JWRcbiIgPTw8IENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yaykKKyAgICAgICAgKFxlIC0+IHByaW50ZiAiSW52YWxpZE9wZXJhdGlvbiAlc1xuIiAoc2hvdyAoZSA6OiBJbnZhbGlkT3BlcmF0aW9uKSkpCiAKIAotICBsZXQgd29yayA9IFdvcmsgeyBmX1dvcmtfb3AgPSBKdXN0IFNVQlRSQUNULAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMSA9IEp1c3QgMTUsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19udW0yID0gSnVzdCAxMCwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX2NvbW1lbnQgPSBOb3RoaW5nCisgIGxldCB3b3JrID0gV29yayB7IHdvcmtfb3AgPSBTVUJUUkFDVCwKKyAgICAgICAgICAgICAgICAgICAgd29ya19udW0xID0gMTUsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfbnVtMiA9IDEwLAorICAgICAgICAgICAgICAgICAgICB3b3JrX2NvbW1lbnQgPSBOb3RoaW5nCiAgICAgICAgICAgICAgICAgICB9CiAKICAgZGlmZiA8LSBDbGllbnQuY2FsY3VsYXRlIGNsaWVudCAxIHdvcmsKICAgcHJpbnRmICIxNS0xMD0lZFxuIiBkaWZmCiAKICAgbG9nIDwtIFNDbGllbnQuZ2V0U3RydWN0IGNsaWVudCAxCi0gIHByaW50ZiAiQ2hlY2sgbG9nOiAlc1xuIiAgJCBmcm9tSnVzdCAkIGZfU2hhcmVkU3RydWN0X3ZhbHVlIGxvZworICBwcmludGYgIkNoZWNrIGxvZzogJXNcbiIgJCB1bnBhY2sgJCBzaGFyZWRTdHJ1Y3RfdmFsdWUgbG9nCiAKICAgLS0gQ2xvc2UhCiAgIHRDbG9zZSB0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMgYi90dXRvcmlhbC9ocy9IYXNrZWxsU2VydmVyLmhzCmluZGV4IDRmOWFiN2MuLmNmZTEzNDQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMKKysrIGIvdHV0b3JpYWwvaHMvSGFza2VsbFNlcnZlci5ocwpAQCAtMTcsNiArMTcsOCBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKIGltcG9ydCBxdWFsaWZpZWQgQ2FsY3VsYXRvcgogaW1wb3J0IENhbGN1bGF0b3JfSWZhY2UKIGltcG9ydCBUdXRvcmlhbF9UeXBlcwpAQCAtMjgsNiArMzAsOCBAQAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKIGltcG9ydCBUaHJpZnQuU2VydmVyCiAKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuU3RyaW5nCiBpbXBvcnQgRGF0YS5NYXliZQogaW1wb3J0IFRleHQuUHJpbnRmCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKHRocm93KQpAQCAtMzYsNyArNDAsNyBAQAogaW1wb3J0IERhdGEuTWFwICgoISkpCiBpbXBvcnQgRGF0YS5Nb25vaWQKIAotZGF0YSBDYWxjdWxhdG9ySGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyIHttYXRoTG9nIDo6IE1WYXIgKE0uTWFwIEludCBTaGFyZWRTdHJ1Y3QpfQorZGF0YSBDYWxjdWxhdG9ySGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyIHttYXRoTG9nIDo6IE1WYXIgKE0uTWFwIEludDMyIFNoYXJlZFN0cnVjdCl9CiAKIG5ld0NhbGN1bGF0b3JIYW5kbGVyID0gZG8KICAgbG9nIDwtIG5ld01WYXIgbWVtcHR5CkBAIC00NSw3ICs0OSw3IEBACiBpbnN0YW5jZSBTaGFyZWRTZXJ2aWNlX0lmYWNlIENhbGN1bGF0b3JIYW5kbGVyIHdoZXJlCiAgIGdldFN0cnVjdCBzZWxmIGsgPSBkbwogICAgIG15TG9nIDwtIHJlYWRNVmFyIChtYXRoTG9nIHNlbGYpCi0gICAgcmV0dXJuICQgKG15TG9nICEgKGZyb21KdXN0IGspKQorICAgIHJldHVybiAkIChteUxvZyAhIGspCiAKIAogaW5zdGFuY2UgQ2FsY3VsYXRvcl9JZmFjZSBDYWxjdWxhdG9ySGFuZGxlciB3aGVyZQpAQCAtNTMsOCArNTcsOCBAQAogICAgIHByaW50ICJwaW5nKCkiCiAKICAgYWRkIF8gbjEgbjIgPSBkbwotICAgIHByaW50ZiAiYWRkKCVkLCVkKVxuIiAoZnJvbUp1c3QgbjEpIChmcm9tSnVzdCBuMikKLSAgICByZXR1cm4gKChmcm9tSnVzdCBuMSkrKGZyb21KdXN0IG4yKSkKKyAgICBwcmludGYgImFkZCglZCwlZClcbiIgbjEgbjIKKyAgICByZXR1cm4gKG4xICsgbjIpCiAKICAgY2FsY3VsYXRlIHNlbGYgbWxvZ2lkIG13b3JrID0gZG8KICAgICBwcmludGYgImNhbGN1bGF0ZSglZCwgJXMpXG4iIGxvZ2lkIChzaG93IHdvcmspCkBAIC03MCwyNyArNzQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgbnVtMiB3b3JrID09IDAgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX0ludmFsaWRPcGVyYXRpb25fd2hhdCA9IEp1c3QgJCBmcm9tRW51bSAkIG9wIHdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX0ludmFsaWRPcGVyYXRpb25fd2h5ID0gSnVzdCAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZE9wZXJhdGlvbl93aGF0T3AgPSBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAkIG9wIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkT3BlcmF0aW9uX3doeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgbnVtMSB3b3JrIGBkaXZgIG51bTIgd29yawogCi0gICAgbGV0IGxvZ0VudHJ5ID0gU2hhcmVkU3RydWN0IChKdXN0IGxvZ2lkKSAoSnVzdCAoc2hvdyB2YWwpKQorICAgIGxldCBsb2dFbnRyeSA9IFNoYXJlZFN0cnVjdCBsb2dpZCAoZnJvbVN0cmluZyAkIHNob3cgJCB2YWwpCiAgICAgbW9kaWZ5TVZhcl8gKG1hdGhMb2cgc2VsZikgJCByZXR1cm4gLihNLmluc2VydCBsb2dpZCBsb2dFbnRyeSkKIAotICAgIHJldHVybiB2YWwKKyAgICByZXR1cm4gJCEgdmFsCiAKICAgIHdoZXJlCiAgICAgIC0tIHN0dXBpZCBkeW5hbWljIGxhbmd1YWdlcyBmJ2luZyBpdCB1cAotICAgICBudW0xID0gZnJvbUp1c3QgLiBmX1dvcmtfbnVtMQotICAgICBudW0yID0gZnJvbUp1c3QgLiBmX1dvcmtfbnVtMgotICAgICBvcCA9IGZyb21KdXN0IC4gZl9Xb3JrX29wCi0gICAgIGxvZ2lkID0gZnJvbUp1c3QgbWxvZ2lkCi0gICAgIHdvcmsgPSBmcm9tSnVzdCBtd29yawotCi0KLSAgICAtLXJldHVybiB2YWwKKyAgICAgbnVtMSA9IHdvcmtfbnVtMQorICAgICBudW0yID0gd29ya19udW0yCisgICAgIG9wID0gd29ya19vcAorICAgICBsb2dpZCA9IG1sb2dpZAorICAgICB3b3JrID0gbXdvcmsKIAogICB6aXAgXyA9CiAgICAgcHJpbnQgInppcCgpIgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTElDRU5TRSBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKQEAgLTAsMCArMSwyMzkgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKKworVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCitzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQorY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KKworUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgorCisjICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAorIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAorIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qczoKKworLyoKKyAgICBqc29uX3BhcnNlLmpzCisgICAgMjAxNS0wNS0wMgorICAgIFB1YmxpYyBEb21haW4uCisgICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorCisqLworKEJ5IERvdWdsYXMgQ3JvY2tmb3JkIDxkb3VnbGFzQGNyb2NrZm9yZC5jb20+KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTNlY2NjMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHMgLXIgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKENBQkFMKSBpbnN0YWxsCisKK2luc3RhbGwtZXhlYy1ob29rOgorCSQoQ0FCQUwpIGluc3RhbGwKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgSGFza2VsbCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCSQoQ0FCQUwpIGNsZWFuCisJJChSTSkgLXIgZ2VuLSoKKworY2hlY2stbG9jYWw6CisJJChDQUJBTCkgY2hlY2sKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCWRpc3QvYnVpbGQvSGFza2VsbFNlcnZlci9IYXNrZWxsU2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwlkaXN0L2J1aWxkL0hhc2tlbGxDbGllbnQvSGFza2VsbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCUxJQ0VOU0UKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL1NldHVwLmxocyBiL3R1dG9yaWFsL2hzL1NldHVwLmxocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMTgyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvU2V0dXAubGhzCkBAIC0wLDAgKzEsMjEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1bmhhc2tlbGwKKworPiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCis+IC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCis+IC0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCis+IC0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorPiAtLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCis+IC0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKz4gLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis+IC0tCis+IC0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis+IC0tCis+IC0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKz4gLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKz4gLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCis+IC0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCis+IC0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKz4gLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKKz4gaW1wb3J0IERpc3RyaWJ1dGlvbi5TaW1wbGUKKz4gbWFpbiA9IGRlZmF1bHRNYWluCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbCBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMTY1NWNlNy4uNjJlNjgyZgotLS0gYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbAorKysgYi90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbApAQCAtMTgsMzEgKzE4LDU2IEBACiAtLQogCiBOYW1lOiAgICAgICAgICAgVGhyaWZ0VHV0b3JpYWwKLVZlcnNpb246ICAgICAgICAwLjEuMAotQ2FiYWwtVmVyc2lvbjogID49IDEuMgotTGljZW5zZTogICAgICAgIEFwYWNoZTIKK1ZlcnNpb246ICAgICAgICAxLjAuMAorQ2FiYWwtVmVyc2lvbjogID49IDEuNAorTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQogQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KIEJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKIFN5bm9wc2lzOiAgICAgICBUaHJpZnQgVHV0b3JpYWwgbGlicmFyeSBwYWNrYWdlCitIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKK01haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCisKK0Rlc2NyaXB0aW9uOgorICBIYXNrZWxsIHR1dG9yaWFsIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCisKK2ZsYWcgbmV0d29yay11cmkKKyAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQorICAgZGVmYXVsdDogVHJ1ZQogCiBFeGVjdXRhYmxlIEhhc2tlbGxTZXJ2ZXIKICAgTWFpbi1pczogSGFza2VsbFNlcnZlci5ocwogICBIcy1Tb3VyY2UtRGlyczoKLSAgICAuLCAuLi9nZW4taHMvCisgICAgLiwgZ2VuLWhzLwogICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj00LCBuZXR3b3JrLCBnaGMtcHJpbSwgY29udGFpbmVycywgVGhyaWZ0Ci0gIGdoYy1vcHRpb25zOgotICAgIC1mZ2xhc2dvdy1leHRzCisgICAgYmFzZSA+PSA0LCBiYXNlIDwgNSwgZ2hjLXByaW0sIGNvbnRhaW5lcnMsIHRocmlmdCwgdmVjdG9yLCB1bm9yZGVyZWQtY29udGFpbmVycywgdGV4dCwgaGFzaGFibGUsIGJ5dGVzdHJpbmcsIFF1aWNrQ2hlY2sKICAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCiAKIEV4ZWN1dGFibGUgSGFza2VsbENsaWVudAogICBNYWluLWlzOiBIYXNrZWxsQ2xpZW50LmhzCiAgIEhzLVNvdXJjZS1EaXJzOgotICAgIC4sIC4uL2dlbi1ocy8KKyAgICAuLCBnZW4taHMvCiAgIEJ1aWxkLURlcGVuZHM6Ci0gICAgYmFzZSA+PTQsIG5ldHdvcmssIGdoYy1wcmltLCBjb250YWluZXJzLCBUaHJpZnQKLSAgZ2hjLW9wdGlvbnM6Ci0gICAgLWZnbGFzZ293LWV4dHMKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBnaGMtcHJpbSwgY29udGFpbmVycywgdGhyaWZ0LCB2ZWN0b3IsIFF1aWNrQ2hlY2sKKyAgaWYgZmxhZyhuZXR3b3JrLXVyaSkKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNgorICBlbHNlCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgPCAyLjYKICAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBTY29wZWRUeXBlVmFyaWFibGVzLAorICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQgYi90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjNTE4Y2YuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvamF2YS9KYXZhQ2xpZW50CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotVEhJU19ESVI9JChkaXJuYW1lICQwKQotTElCX0RJUj0kVEhJU19ESVIvLi4vLi4vbGliL2phdmEvCi1JVllfRElSPSRMSUJfRElSL2J1aWxkL2l2eS9saWIvCi0KLWphdmEgLWNwICRJVllfRElSLyo6JExJQl9ESVIvbGlidGhyaWZ0Lmphcjp0dXRvcmlhbC5qYXIgSmF2YUNsaWVudCAkMQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9KYXZhU2VydmVyIGIvdHV0b3JpYWwvamF2YS9KYXZhU2VydmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODIxNzE1Li4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2phdmEvSmF2YVNlcnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLVRISVNfRElSPSQoZGlybmFtZSAkMCkKLUxJQl9ESVI9JFRISVNfRElSLy4uLy4uL2xpYi9qYXZhLwotSVZZX0RJUj0kTElCX0RJUi9idWlsZC9pdnkvbGliLwotCi0jIE9wdGlvbmFsbHkgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGNvdWxkIGJlIHNldCBmb3IgU1NMIGluc3RlYWQKLSMgb2YgY29uZmlndXJpbmcgaXQgaW4gdGhlIGNvZGUKLSMgLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Li4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQotIyAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdAotIyAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9Li4vLi4vbGliL2phdmEvdGVzdC8ua2V5c3RvcmUKLSMgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0Ci0KLWphdmEgLWNwICRJVllfRElSLyo6JExJQl9ESVIvbGlidGhyaWZ0Lmphcjp0dXRvcmlhbC5qYXIgSmF2YVNlcnZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2phdmEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTU5MDhiMQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2phdmEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2V4cG9ydCBDTEFTU1BBVEgKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKworYWxsLWxvY2FsOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgY29tcGlsZQorCitjaGVjay1sb2NhbDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKK3R1dG9yaWFsOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsY2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJYnVpbGQueG1sIFwKKwlzcmMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9SRUFETUUgYi90dXRvcmlhbC9qYXZhL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNjIwYy4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9qYXZhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVN0ZXBzIGZvciBKYXZhIHR1dG9yaWFsCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0xKSBNYWtlIHN1cmUgdGhyaWZ0IGlzIGNvbXBpbGVkLCBib3RoIHRoZSBjb21waWxlciBhbmQgdGhlIEphdmEgbGlicmFyeS4gWW91IHNob3VsZAotYmUgYWJsZSB0byB2ZXJpZnkgdGhlIGZvbGxvd2luZzoKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGZpbGUgLi4vLi4vbGliL2phdmEvbGlidGhyaWZ0LmphciAKLS4uLy4uL2xpYi9qYXZhL2xpYnRocmlmdC5qYXI6IFppcCBhcmNoaXZlIGRhdGEsIGF0IGxlYXN0IHYxLjAgdG8gZXh0cmFjdAotCi10aHJpZnQvdHV0b3JpYWwvamF2YSQgZmlsZSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci0uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0OiBFTEYgNjQtYml0IExTQiBleGVjdXRhYmxlLCB4ODYtNjQsIHZlcnNpb24gMSAoU1lTViksIGR5bmFtaWNhbGx5IGxpbmtlZCAodXNlcyBzaGFyZWQgbGlicyksIGZvciBHTlUvTGludXggMi42LjE1LCBub3Qgc3RyaXBwZWQKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGxzIC4uLy4uL2xpYi9qYXZhL2J1aWxkL2l2eS9saWIvCi1jb21tb25zLWxhbmctMi41LmphciAganVuaXQtNC40LmphciAgc2VydmxldC1hcGktMi41LmphciAgc2xmNGotYXBpLTEuNS44LmphciAgc2xmNGotc2ltcGxlLTEuNS44LmphcgotCi0KLTIpIEdlbmVyYXRlIGNvZGUgZm9yIGphdmE6Ci0KLXRocmlmdC90dXRvcmlhbC9qYXZhJCBjZCAuLgotdGhyaWZ0L3R1dG9yaWFsJCB0aHJpZnQgLXIgLWdlbiBqYXZhIHR1dG9yaWFsLnRocmlmdAotCi0zKSBDb21waWxlIGV4YW1wbGUKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGFudAotCi00KSBSdW4gZXhhbXBsZToKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIC4vSmF2YVNlcnZlciAmCi10aHJpZnQvdHV0b3JpYWwvamF2YSQgLi9KYXZhQ2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL1JFQURNRS5tZCBiL3R1dG9yaWFsL2phdmEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDlmZWEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qYXZhL1JFQURNRS5tZApAQCAtMCwwICsxLDI0IEBACitUaHJpZnQgSmF2YSBUdXRvcmlhbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzEpIENvbXBpbGUgdGhlIEphdmEgbGlicmFyeQorCisgICAgdGhyaWZ0L2xpYi9qYXZhJCBtYWtlCitvcjoKKworICAgIHRocmlmdC9saWIvamF2YSQgYW50CisKKzQpIFJ1biB0aGUgdHV0b3JpYWw6CisKK3N0YXJ0IHNlcnZlciBhbmQgY2xpZW50IHdpdGggb25lIHN0ZXA6CisKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgbWFrZSB0dXRvcmlhbAorCitvcjoKKworICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBtYWtlIHR1dG9yaWFsc2VydmVyCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIG1ha2UgdHV0b3JpYWxjbGllbnQKKworb3I6CisKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgYW50IHR1dG9yaWFsc2VydmVyCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGFudCB0dXRvcmlhbGNsaWVudApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9idWlsZC54bWwgYi90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbAppbmRleCBlN2Q1YzhiLi41NWNkYjhmIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbAorKysgYi90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbApAQCAtMTgsMTUgKzE4LDIwIEBACiAtLT4KIDxwcm9qZWN0IG5hbWU9InR1dG9yaWFsIiBkZWZhdWx0PSJ0dXRvcmlhbCIgYmFzZWRpcj0iLiI+CiAKLSAgPGRlc2NyaXB0aW9uPlRocmlmdCBUdXRvcmlhbDwvZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj5UaHJpZnQgSmF2YSBUdXRvcmlhbDwvZGVzY3JpcHRpb24+CiAKICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Ii4uL2dlbi1qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWphdmEiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgogCiAgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL2xpYi9qYXZhL2xpYnRocmlmdC5qYXIiIC8+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9pdnkvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgIDwvcGF0aD4KQEAgLTM0LDIzICszOSw3NiBAQAogICAgIDxwYXRoIHJlZmlkPSJsaWJzLmNsYXNzcGF0aCIgLz4KICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtnZW59IiAvPgogICA8L3BhdGg+CisgIDxwYXRoIGlkPSJ0dXRvcmlhbC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJidWlsZC5jbGFzc3BhdGgiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGR9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSJ0dXRvcmlhbC5qYXIiIC8+CisgIDwvcGF0aD4KIAogICA8dGFyZ2V0IG5hbWU9ImluaXQiPgogICAgIDx0c3RhbXAgLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xvZyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiIC8+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIiAvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXNjcmlwdGlvbj0iUnVuIHRoZSB0dXRvcmlhbCIgZGVwZW5kcz0iY29tcGlsZSI+CiAgICAgPGphciBqYXJmaWxlPSJ0dXRvcmlhbC5qYXIiIGJhc2VkaXI9IiR7YnVpbGR9Ii8+CisgICAgPHBhcmFsbGVsPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhU2VydmVyIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvdHV0b3JpYWwubG9nIj4KKyAgICAgIDwvamF2YT4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgICAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2ltcGxlOjwvZWNobz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzaW1wbGUiLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2VjdXJlOjwvZWNobz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGFyZyBsaW5lPSJzZWN1cmUiLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvcGFyYWxsZWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgorICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UgLS0+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxjbGllbnQiIGRlc2NyaXB0aW9uPSJSdW4gYSB0dXRvcmlhbCBjbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzaW1wbGU6PC9lY2hvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iSmF2YUNsaWVudCIKKyAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9InNpbXBsZSIvPgorICAgIDwvamF2YT4KKyAgICA8ZWNobz50dXRvcmlhbCBjbGllbnQgc2VjdXJlOjwvZWNobz4KKyAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSJzZWN1cmUiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0dXRvcmlhbCBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhU2VydmVyIiBmb3JrPSJ0cnVlIgorICAgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy90dXRvcmlhbC5sb2ciPgorICAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgogICAgIDxkZWxldGUgZmlsZT0idHV0b3JpYWwuamFyIiAvPgogICA8L3RhcmdldD4KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YSBiL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEKaW5kZXggNDIxNmJlNS4uOTI5NDRiMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YQorKysgYi90dXRvcmlhbC9qYXZhL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgICAgY2FzZSBESVZJREU6CiAgICAgICBpZiAod29yay5udW0yID09IDApIHsKICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wLmdldFZhbHVlKCk7CisgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CiAgICAgICAgIHRocm93IGlvOwogICAgICAgfQpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgaW8ud2hhdCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKICAgICAgIGlvLndoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7CiAgICAgICB0aHJvdyBpbzsKICAgICB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL3NyYy9KYXZhQ2xpZW50LmphdmEgYi90dXRvcmlhbC9qYXZhL3NyYy9KYXZhQ2xpZW50LmphdmEKaW5kZXggYWQ0NzMwYS4uMmUzNWQ0MSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvamF2YS9zcmMvSmF2YUNsaWVudC5qYXZhCisrKyBiL3R1dG9yaWFsL2phdmEvc3JjL0phdmFDbGllbnQuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIC8qCi0gICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIHNlcnZlciwgeW91IGNhbiB1c2UgdGhlIHBhcmFtZXRycyB0byBzZXR1cCBjbGllbnQgcGFyYW1ldGVycyBvcgorICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBzZXJ2ZXIsIHlvdSBjYW4gdXNlIHRoZSBwYXJhbWV0ZXJzIHRvIHNldHVwIGNsaWVudCBwYXJhbWV0ZXJzIG9yCiAgICAgICAgICAqIHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gT24gdGhlIGNsaWVudCBzaWRlLCB5b3Ugd2lsbCBuZWVkIGEgVHJ1c3RTdG9yZSB3aGljaAogICAgICAgICAgKiBjb250YWlucyB0aGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBhbG9uZyB3aXRoIHRoZSBwdWJsaWMga2V5LiAKICAgICAgICAgICogRm9yIHRoaXMgZXhhbXBsZSBpdCdzIGEgc2VsZi1zaWduZWQgY2VydC4gCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2pzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmZTA4ODgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZXhwb3J0IENMQVNTUEFUSAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCithbGwtbG9jYWw6CisJJChBTlQpICQoQU5UX0ZMQUdTKSBjb21waWxlCisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdHV0b3JpYWxzZXJ2ZXIKKworRVhUUkFfRElTVCA9IFwKKwlidWlsZC54bWwgXAorCXNyYyBcCisJdHV0b3JpYWwuaHRtbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvYnVpbGQueG1sIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCmluZGV4IGY4NTY1MWEuLjAzYTZlN2MgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbAorKysgYi90dXRvcmlhbC9qcy9idWlsZC54bWwKQEAgLTIyLDE2ICsyMiwyMiBAQAogCiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhc3JjIiBsb2NhdGlvbj0iLi4vamF2YS9zcmMiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSIuLi9nZW4tamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Ii4uL2phdmEvZ2VuLWphdmEiIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgogCiAgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8iIC8+CisgIDwhLS0gSmF2YVNjcmlwdCB0dXRvcmlhbCBkZXBlbmRzIG9uIHRoZSBqYXZhIHR1dG9yaWFsIHRocmlmdCBoYW5kbGVyIGFuZCBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgogCiAgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGhyaWZ0LmphdmEuZGlyfS9saWJ0aHJpZnQuamFyIiAvPgotICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2l2eS9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICA8L3BhdGg+CkBAIC00NywzMCArNTMsMzkgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBzcmNkaXI9IiR7amF2YXNyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KICAgICAgIDxleGNsdWRlIG5hbWU9IkphdmFDbGllbnQuamF2YSIvPgogICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YVNlcnZlci5qYXZhIi8+CiAgICAgICA8aW5jbHVkZSBuYW1lPSJDYWxjdWxhdG9ySGFuZGxlci5qYXZhIi8+CiAgICAgPC9qYXZhYz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CiAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDphbGwiLz4KICAgICA8L2phdmFjPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9InR1dG9yaWFsIiAvPgorCiAgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWwiIGRlcGVuZHM9ImNvbXBpbGUiPgogICAgIDxqYXIgamFyZmlsZT0idHV0b3JpYWwtanMuamFyIiBiYXNlZGlyPSIke2J1aWxkfSIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGhlIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJ0dXRvcmlhbCI+CisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWxzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJydW4gdGhlIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJ0dXRvcmlhbCwgZ2VuZXJhdGUiPgogICAgIDxqYXZhIGNsYXNzbmFtZT0iSHR0cGQiIGZvcms9InRydWUiCiAgICAgICBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyB2YWx1ZT0iLi4vLi4vIiAvPgogICAgIDwvamF2YT4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqcyAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKwogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CisgICAgPGRlbGV0ZSBkaXI9Imdlbi1qcyIvPgogICAgIDxkZWxldGUgZmlsZT0idHV0b3JpYWwtanMuamFyIiAvPgogICA8L3RhcmdldD4KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbCBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhMzRjOWYzLi5kMDIwYmVkCi0tLSBhL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKKysrIGIvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbApAQCAtMjIsMTEgKzIyLDExIEBACiAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3MgLSBUdXRvcmlhbCBFeGFtcGxlPC90aXRsZT4KIAotICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2pzL3RocmlmdC5qcyIgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Ii4uL2dlbi1qcy90dXRvcmlhbF90eXBlcy5qcyIgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Ii4uL2dlbi1qcy9zaGFyZWRfdHlwZXMuanMiICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Ii4uL2dlbi1qcy9TaGFyZWRTZXJ2aWNlLmpzIiAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Ii4uL2dlbi1qcy9DYWxjdWxhdG9yLmpzIiAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9qcy9zcmMvdGhyaWZ0LmpzIiAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy90dXRvcmlhbF90eXBlcy5qcyIgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9zaGFyZWRfdHlwZXMuanMiICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9TaGFyZWRTZXJ2aWNlLmpzIiAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9DYWxjdWxhdG9yLmpzIiAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KIAogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNC4yL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogCkBAIC00OSw3ICs0OSw3IEBACiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKICAgICB2YXIgY2xpZW50ICAgID0gbmV3IENhbGN1bGF0b3JDbGllbnQocHJvdG9jb2wpOwogCi0gICAgdmFyIHdvcmsgPSBuZXcgV29yaygpCisgICAgdmFyIHdvcmsgPSBuZXcgV29yaygpOwogICAgIHdvcmsubnVtMSA9ICQoIiNudW0xIikudmFsKCk7CiAgICAgd29yay5udW0yID0gJCgiI251bTIiKS52YWwoKTsKICAgICB3b3JrLm9wID0gJCgiI29wIikudmFsKCk7CkBAIC05OCw3ICs5OCw3IEBACiAgIDwvdGFibGU+CiAgIDwvZm9ybT4KICAgCi0gIDxwPlRoaXMgSmF2YSBTY3JpcHQgZXhhbXBsZSB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQiPnR1dG9yaWFsLnRocmlmdDwvYT4gYW5kIGEgVGhyaWZ0IHNlcnZlciB1c2luZyBKU09OIHByb3RvY29sIGFuZCBIVFRQIHRyYW5zcG9ydC4KKyAgPHA+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+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZWQyOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkY2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuCkBAIC0wLDAgKzEsNzggQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2MTE0LjIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSW50ZXJmYWNlcyIsICJJbnRlcmZhY2VzXEludGVyZmFjZXMuY3Nwcm9qIiwgIntCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAie0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHswNzBBNUQxRC1CMjlELTQ2MDMtOTk5RC02OTNEQjQ0NEFEMER9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZCBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI1IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZAorCis6ZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworc2V0IC1lCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTZmZWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1ub2RlanMvQ2FsY3VsYXRvci5qcyBnZW4tbm9kZWpzL1NoYXJlZFNlcnZpY2UuanM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tbm9kZWpzL0NhbGN1bGF0b3IuanMKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZVNlcnZlci5qcworCit0dXRvcmlhbGNsaWVudDogYWxsCisJTk9ERV9QQVRIPSIkKHRvcF9idWlsZGRpcikvbGliL25vZGVqczokKHRvcF9idWlsZGRpcikvbGliL25vZGVqcy9saWI6JChOT0RFUEFUSCkiICQoTk9ERUpTKSBOb2RlQ2xpZW50LmpzCisKK3R1dG9yaWFsc2VydmVyX3Byb21pc2U6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZVNlcnZlclByb21pc2UuanMKKwordHV0b3JpYWxjbGllbnRfcHJvbWlzZTogYWxsCisJTk9ERV9QQVRIPSIkKHRvcF9idWlsZGRpcikvbGliL25vZGVqczokKHRvcF9idWlsZGRpcikvbGliL25vZGVqcy9saWI6JChOT0RFUEFUSCkiICQoTk9ERUpTKSBOb2RlQ2xpZW50UHJvbWlzZS5qcworCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJTm9kZVNlcnZlci5qcyBcCisJTm9kZUNsaWVudC5qcyBcCisJTm9kZVNlcnZlclByb21pc2UuanMgXAorCU5vZGVDbGllbnRQcm9taXNlLmpzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODg2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOworCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKKyAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LAorICBwcm90b2NvbCA6IHByb3RvY29sCit9KTsKKworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKKy8vIENyZWF0ZSBhIENhbGN1bGF0b3IgY2xpZW50IHdpdGggdGhlIGNvbm5lY3Rpb24KK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhbGN1bGF0b3IsIGNvbm5lY3Rpb24pOworCisKK2NsaWVudC5waW5nKGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgY29uc29sZS5sb2coJ3BpbmcoKScpOworfSk7CisKKworY2xpZW50LmFkZCgxLDEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgY29uc29sZS5sb2coIjErMT0iICsgcmVzcG9uc2UpOworfSk7CisKKword29yayA9IG5ldyB0dHlwZXMuV29yaygpOword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uRElWSURFOword29yay5udW0xID0gMTsKK3dvcmsubnVtMiA9IDA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaywgZnVuY3Rpb24oZXJyLCBtZXNzYWdlKSB7CisgIGlmIChlcnIpIHsKKyAgICBjb25zb2xlLmxvZygiSW52YWxpZE9wZXJhdGlvbiAiICsgZXJyKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zb2xlLmxvZygnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpOworICB9Cit9KTsKKword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1Q7Cit3b3JrLm51bTEgPSAxNTsKK3dvcmsubnVtMiA9IDEwOworCitjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmssIGZ1bmN0aW9uKGVyciwgbWVzc2FnZSkgeworICBjb25zb2xlLmxvZygnMTUtMTA9JyArIG1lc3NhZ2UpOworCisgIGNsaWVudC5nZXRTdHJ1Y3QoMSwgZnVuY3Rpb24oZXJyLCBtZXNzYWdlKXsKKyAgICBjb25zb2xlLmxvZygnQ2hlY2sgbG9nOiAnICsgbWVzc2FnZS52YWx1ZSk7CisKKyAgICAvL2Nsb3NlIHRoZSBjb25uZWN0aW9uIG9uY2Ugd2UncmUgZG9uZQorICAgIGNvbm5lY3Rpb24uZW5kKCk7CisgIH0pOworfSk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkYzE4NAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcwpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOworCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKKyAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LAorICBwcm90b2NvbCA6IHByb3RvY29sCit9KTsKKworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKKy8vIENyZWF0ZSBhIENhbGN1bGF0b3IgY2xpZW50IHdpdGggdGhlIGNvbm5lY3Rpb24KK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhbGN1bGF0b3IsIGNvbm5lY3Rpb24pOworCisKK2NsaWVudC5waW5nKCkKKyAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coJ3BpbmcoKScpOworICB9KTsKKworY2xpZW50LmFkZCgxLDEpCisgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisJICBjb25zb2xlLmxvZygiMSsxPSIgKyByZXNwb25zZSk7CisgIH0pOworCit3b3JrID0gbmV3IHR0eXBlcy5Xb3JrKCk7Cit3b3JrLm9wID0gdHR5cGVzLk9wZXJhdGlvbi5ESVZJREU7Cit3b3JrLm51bTEgPSAxOword29yay5udW0yID0gMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CisJY29uc29sZS5sb2coJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKTsKKyAgfSkKKyAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgY29uc29sZS5sb2coIkludmFsaWRPcGVyYXRpb24gIiArIGVycik7CisgIH0pOworCisKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUOword29yay5udW0xID0gMTU7Cit3b3JrLm51bTIgPSAxMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAudGhlbihmdW5jdGlvbih2YWx1ZSkgeworCSAgY29uc29sZS5sb2coJzE1LTEwPScgKyB2YWx1ZSk7CisJICByZXR1cm4gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgfSkKKyAgLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgeworICAgICAgY29uc29sZS5sb2coJ0NoZWNrIGxvZzogJyArIG1lc3NhZ2UudmFsdWUpOworICB9KQorICAuZmluKGZ1bmN0aW9uKCkgeworCSAgLy9jbG9zZSB0aGUgY29ubmVjdGlvbiBvbmNlIHdlJ3JlIGRvbmUKKyAgICAgIGNvbm5lY3Rpb24uZW5kKCk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXIuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWQzODE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXIuanMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yIik7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzIik7Cit2YXIgU2hhcmVkU3RydWN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL3NoYXJlZF90eXBlcyIpLlNoYXJlZFN0cnVjdDsKKwordmFyIGRhdGEgPSB7fTsKKwordmFyIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoQ2FsY3VsYXRvciwgeworICBwaW5nOiBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygicGluZygpIik7CisgICAgcmVzdWx0KG51bGwpOworICB9LAorCisgIGFkZDogZnVuY3Rpb24objEsIG4yLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiYWRkKCIsIG4xLCAiLCIsIG4yLCAiKSIpOworICAgIHJlc3VsdChudWxsLCBuMSArIG4yKTsKKyAgfSwKKworICBjYWxjdWxhdGU6IGZ1bmN0aW9uKGxvZ2lkLCB3b3JrLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCIsIHdvcmssICIpIik7CisKKyAgICB2YXIgdmFsID0gMDsKKyAgICBpZiAod29yay5vcCA9PSB0dHlwZXMuT3BlcmF0aW9uLkFERCkgeworICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5TVUJUUkFDVCkgeworICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5NVUxUSVBMWSkgeworICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5ESVZJREUpIHsKKyAgICAgIGlmICh3b3JrLm51bTIgPT09IDApIHsKKyAgICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworICAgICAgICByZXN1bHQoeCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgZW50cnkudmFsdWUgPSAiIit2YWw7CisgICAgZGF0YVtsb2dpZF0gPSBlbnRyeTsKKworICAgIHJlc3VsdChudWxsLCB2YWwpOworICB9LAorCisgIGdldFN0cnVjdDogZnVuY3Rpb24oa2V5LCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiZ2V0U3RydWN0KCIsIGtleSwgIikiKTsKKyAgICByZXN1bHQobnVsbCwgZGF0YVtrZXldKTsKKyAgfSwKKworICB6aXA6IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCJ6aXAoKSIpOworICAgIHJlc3VsdChudWxsKTsKKyAgfQorCit9KTsKKworc2VydmVyLmxpc3Rlbig5MDkwKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYyODdiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXJQcm9taXNlLmpzCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOwordmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvQ2FsY3VsYXRvciIpOwordmFyIHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcyIpOwordmFyIFNoYXJlZFN0cnVjdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9zaGFyZWRfdHlwZXMiKS5TaGFyZWRTdHJ1Y3Q7CisKK3ZhciBkYXRhID0ge307CisKK3ZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKENhbGN1bGF0b3IsIHsKKyAgcGluZzogZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coInBpbmcoKSIpOworICB9LAorCisgIGFkZDogZnVuY3Rpb24objEsIG4yKSB7CisgICAgY29uc29sZS5sb2coImFkZCgiLCBuMSwgIiwiLCBuMiwgIikiKTsKKyAgICByZXR1cm4gbjEgKyBuMjsKKyAgfSwKKworICBjYWxjdWxhdGU6IGZ1bmN0aW9uKGxvZ2lkLCB3b3JrKSB7CisgICAgY29uc29sZS5sb2coImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwiLCB3b3JrLCAiKSIpOworCisgICAgdmFyIHZhbCA9IDA7CisgICAgaWYgKHdvcmsub3AgPT0gdHR5cGVzLk9wZXJhdGlvbi5BREQpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1QpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uTVVMVElQTFkpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uRElWSURFKSB7CisgICAgICBpZiAod29yay5udW0yID09PSAwKSB7CisgICAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKKwkJdGhyb3cgeDsKKyAgICAgIH0KKyAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJzsKKyAgICAgIHRocm93IHg7CisgICAgfQorCisgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgIGVudHJ5LmtleSA9IGxvZ2lkOworICAgIGVudHJ5LnZhbHVlID0gIiIrdmFsOworICAgIGRhdGFbbG9naWRdID0gZW50cnk7CisgICAgcmV0dXJuIHZhbDsKKyAgfSwKKworICBnZXRTdHJ1Y3Q6IGZ1bmN0aW9uKGtleSkgeworICAgIGNvbnNvbGUubG9nKCJnZXRTdHJ1Y3QoIiwga2V5LCAiKSIpOworICAgIHJldHVybiBkYXRhW2tleV07CisgIH0sCisKKyAgemlwOiBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygiemlwKCkiKTsKKyAgfQorCit9KTsKKworc2VydmVyLmxpc3Rlbig5MDkwKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL0NhbGNDbGllbnQubWwgYi90dXRvcmlhbC9vY2FtbC9DYWxjQ2xpZW50Lm1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhODQ2N2IKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9DYWxjQ2xpZW50Lm1sCkBAIC0wLDAgKzEsNzQgQEAKKygqCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorKikKKworb3BlbiBBcmcKK29wZW4gVGhyaWZ0CitvcGVuIFR1dG9yaWFsX3R5cGVzCitvcGVuIFNoYXJlZF90eXBlcworCitleGNlcHRpb24gRGllOzsKK2xldCBzb2QgPSBmdW5jdGlvbgorICAgIFNvbWUgdiAtPiB2CisgIHwgTm9uZSAtPiByYWlzZSBEaWU7OworCit0eXBlIGNvbm5lY3Rpb24gPSB7CisgIHRyYW5zIDogVHJhbnNwb3J0LnQgOworICBwcm90byA6IFRocmlmdC5Qcm90b2NvbC50OworICBjYWxjIDogQ2FsY3VsYXRvci5jbGllbnQgOworfQorCitsZXQgY29ubmVjdCB+aG9zdCBwb3J0ID0KKyAgbGV0IHR4ID0gbmV3IFRTb2NrZXQudCBob3N0IHBvcnQgaW4KKyAgbGV0IHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC50IHR4IGluCisgIGxldCBjYWxjID0gbmV3IENhbGN1bGF0b3IuY2xpZW50IHByb3RvIHByb3RvIGluCisgICAgdHgjb3BuOworICAgIHsgdHJhbnMgPSB0eCA7IHByb3RvID0gcHJvdG87IGNhbGMgPSBjYWxjIH0KKzs7CisKK2xldCBkb2NsaWVudCAoKSA9CisgIGxldCBjbGkgPSBjb25uZWN0IH5ob3N0OiIxMjcuMC4wLjEiIDkwOTAgaW4KKyAgdHJ5CisgICAgY2xpLmNhbGMjcGluZyA7CisgICAgUHJpbnRmLnByaW50ZiAicGluZygpXG4iIDsgZmx1c2ggc3Rkb3V0IDsKKyAgICAobGV0IHN1bSA9IGNsaS5jYWxjI2FkZCAoSW50MzIub2ZfaW50IDEpIChJbnQzMi5vZl9pbnQgMSkgaW4KKyAgICAgICBQcmludGYucHJpbnRmICIxKzE9JWxkXG4iIHN1bSA7CisgICAgICAgZmx1c2ggc3Rkb3V0KSA7CisgICAgKGxldCB3ID0gbmV3IHdvcmsgaW4KKyAgICAgICB3I3NldF9vcCBPcGVyYXRpb24uRElWSURFIDsKKyAgICAgICB3I3NldF9udW0xIChJbnQzMi5vZl9pbnQgMSkgOworICAgICAgIHcjc2V0X251bTIgKEludDMyLm9mX2ludCAwKSA7CisgICAgICAgdHJ5CisJIGxldCBxdW90aWVudCA9IGNsaS5jYWxjI2NhbGN1bGF0ZSAoSW50MzIub2ZfaW50IDEpIHcgaW4KKwkgICBQcmludGYucHJpbnRmICJXaG9hPyBXZSBjYW4gZGl2aWRlIGJ5IHplcm8hXG4iIDsgZmx1c2ggc3Rkb3V0CisgICAgICAgd2l0aCBJbnZhbGlkT3BlcmF0aW9uIGlvIC0+CisJIFByaW50Zi5wcmludGYgIkludmFsaWRPcGVyYXRpb246ICVzXG4iIGlvI2dyYWJfd2h5IDsgZmx1c2ggc3Rkb3V0KSA7CisgICAgKGxldCB3ID0gbmV3IHdvcmsgaW4KKyAgICAgICB3I3NldF9vcCBPcGVyYXRpb24uU1VCVFJBQ1QgOworICAgICAgIHcjc2V0X251bTEgKEludDMyLm9mX2ludCAxNSkgOworICAgICAgIHcjc2V0X251bTIgKEludDMyLm9mX2ludCAxMCkgOworICAgICAgIGxldCBkaWZmID0gY2xpLmNhbGMjY2FsY3VsYXRlIChJbnQzMi5vZl9pbnQgMSkgdyBpbgorCSBQcmludGYucHJpbnRmICIxNS0xMD0lbGRcbiIgZGlmZiA7IGZsdXNoIHN0ZG91dCkgOworICAgIChsZXQgc3MgPSBjbGkuY2FsYyNnZXRTdHJ1Y3QgKEludDMyLm9mX2ludCAxKSBpbgorICAgICAgIFByaW50Zi5wcmludGYgIkNoZWNrIGxvZzogJXNcbiIgc3MjZ3JhYl92YWx1ZSA7IGZsdXNoIHN0ZG91dCkgOworICAgIGNsaS50cmFucyNjbG9zZQorICB3aXRoIFRyYW5zcG9ydC5FIChfLHdoYXQpIC0+CisgICAgUHJpbnRmLnByaW50ZiAiRVJST1I6ICVzXG4iIHdoYXQgOyBmbHVzaCBzdGRvdXQKKzs7CisKK2RvY2xpZW50KCk7OwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvQ2FsY1NlcnZlci5tbCBiL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVmYWNiNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwKQEAgLTAsMCArMSw4OSBAQAorKCoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisqKQorCitvcGVuIEFyZworb3BlbiBUaHJpZnQKK29wZW4gVHV0b3JpYWxfdHlwZXMKK29wZW4gU2hhcmVkX3R5cGVzCisKK2V4Y2VwdGlvbiBEaWU7OworbGV0IHNvZCA9IGZ1bmN0aW9uCisgICAgU29tZSB2IC0+IHYKKyAgfCBOb25lIC0+IHJhaXNlIERpZTs7CisKK2NsYXNzIGNhbGNfaGFuZGxlciA9CitvYmplY3QgKHNlbGYpCisgIGluaGVyaXQgQ2FsY3VsYXRvci5pZmFjZQorICB2YWwgbG9nID0gSGFzaHRibC5jcmVhdGUgMjMKKyAgbWV0aG9kIHBpbmcgID0gUHJpbnRmLnByaW50ZiAicGluZygpXG4iIDsgZmx1c2ggc3Rkb3V0CisgIG1ldGhvZCBhZGQgYSBiID0KKyAgICBQcmludGYucHJpbnRmImFkZCglbGQsJWxkKVxuIiAoc29kIGEpIChzb2QgYik7IGZsdXNoIHN0ZG91dCA7CisgICAgSW50MzIuYWRkIChzb2QgYSkgKHNvZCBiKQorICBtZXRob2QgY2FsY3VsYXRlIGxvZ2lkIHcgPQorICAgIGxldCB3ID0gc29kIHcgaW4KKyAgICAgIFByaW50Zi5wcmludGYgImNhbGN1bGF0ZSglbGQseyVsZCwlbGQsJWxkfSlcbiIgKHNvZCBsb2dpZCkgKE9wZXJhdGlvbi50b19pIHcjZ3JhYl9vcCkgdyNncmFiX251bTEgdyNncmFiX251bTI7IGZsdXNoIHN0ZG91dCA7CisgICAgbGV0IHJ2ID0KKyAgICAgIG1hdGNoIHcjZ3JhYl9vcCB3aXRoCisJICBPcGVyYXRpb24uQUREIC0+CisJICAgIEludDMyLmFkZCB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMgorCXwgT3BlcmF0aW9uLlNVQlRSQUNUIC0+CisJICAgIEludDMyLnN1YiB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMgorCXwgT3BlcmF0aW9uLk1VTFRJUExZIC0+CisJICAgIEludDMyLm11bCB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMgorCXwgT3BlcmF0aW9uLkRJVklERSAtPgorCSAgICBpZiB3I2dyYWJfbnVtMiA9IEludDMyLnplcm8gdGhlbgorCSAgICAgIGxldCBpbyA9IG5ldyBpbnZhbGlkT3BlcmF0aW9uIGluCisJCWlvI3NldF93aGF0T3AgKE9wZXJhdGlvbi50b19pIHcjZ3JhYl9vcCkgOworCQlpbyNzZXRfd2h5ICJDYW5ub3QgZGl2aWRlIGJ5IDAiIDsKKwkJcmFpc2UgKEludmFsaWRPcGVyYXRpb24gaW8pCisJICAgIGVsc2UKKwkgICAgICBJbnQzMi5kaXYgdyNncmFiX251bTEgdyNncmFiX251bTIgaW4KKworICAgIGxldCBzcyA9IG5ldyBzaGFyZWRTdHJ1Y3QgaW4KKyAgICAgIHNzI3NldF9rZXkgKHNvZCBsb2dpZCkgOworICAgIGxldCBidWZmZXIgPSBJbnQzMi50b19zdHJpbmcgcnYgaW4KKyAgICAgIHNzI3NldF92YWx1ZSBidWZmZXIgOworICAgICAgSGFzaHRibC5hZGQgbG9nIChzb2QgbG9naWQpIHNzIDsKKyAgICAgIHJ2CisKKyAgbWV0aG9kIHppcCA9CisgICAgUHJpbnRmLnByaW50ZiAiemlwKClcbiI7IGZsdXNoIHN0ZG91dAorCisgIG1ldGhvZCBnZXRTdHJ1Y3QgbG9naWQgPQorICAgIFByaW50Zi5wcmludGYgImdldFN0cnVjdCglbGQpXG4iIChzb2QgbG9naWQpIDsgZmx1c2ggc3Rkb3V0IDsKKyAgICBIYXNodGJsLmZpbmQgbG9nIChzb2QgbG9naWQpCisKK2VuZAorCitsZXQgZG9zZXJ2ZXIgKCkgPQorICBsZXQgaCA9IG5ldyBjYWxjX2hhbmRsZXIgaW4KKyAgbGV0IHByb2MgPSBuZXcgQ2FsY3VsYXRvci5wcm9jZXNzb3IgaCBpbgorICBsZXQgcG9ydCA9IDkwOTAgaW4KKyAgbGV0IHBmID0gbmV3IFRCaW5hcnlQcm90b2NvbC5mYWN0b3J5IGluCisgIGxldCBzZXJ2ZXIgPSBuZXcgVFRocmVhZGVkU2VydmVyLnQKKwkJIHByb2MKKwkJIChuZXcgVFNlcnZlclNvY2tldC50IHBvcnQpCisJCSAobmV3IFRyYW5zcG9ydC5mYWN0b3J5KQorCQkgcGYKKwkJIHBmCisgIGluCisgICAgc2VydmVyI3NlcnZlCis7OworCitkb3NlcnZlcigpOzsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL1JFQURNRS5tZCBiL3R1dG9yaWFsL29jYW1sL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhlODM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTUgQEAKKworVGhpcyBpcyB0aGUgb2NhbWwgdHV0b3JpYWwgZXhhbXBsZS4gIEl0IGFzc3VtZXMgdGhhdCB5b3UndmUgYWxyZWFkeQorYnVpbHQgYW5kIGluc3RhbGxlZCB0aGUgdGhyaWZ0IG9jYW1sIHJ1bnRpbWUgbGlicmFyaWVzIGluIGxpYi9vY2FtbC4KKworVG8gY29tcGlsZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIGdlbmVyYXRlIHRoZSBUaHJpZnQgc291cmNlcyBmb3IKK29jYW1sIGluIHRoaXMgZGlyZWN0b3J5IChkdWUgdG8gbGltaXRhdGlvbnMgaW4gdGhlIE9BU0lTIGJ1aWxkLXRvb2wpOgorCisgICUgdGhyaWZ0IC1yIC0tZ2VuIG9jYW1sIC4uL3R1dG9yaWFsLnRocmlmdAorICAlIG9hc2lzIHNldHVwCisgICUgbWFrZQorCitUaGlzIHdpbGwgcHJvZHVjZSB0d28gZXhlY3V0YWJsZXMgQ2FsY3tTZXJ2ZXIsQ2xpZW50fS48dHlwZT4gd2hlcmUKKzx0eXBlPiBpcyBvbmUgb2YgImJ5dGUiIG9yICJuYXRpdmUiLCBkZXBlbmRpbmcgb24geW91ciBvY2FtbAoraW5zdGFsbGF0aW9uLiAgSnVzdCBydW4gdGhlIHNlcnZlciBpbiB0aGUgYmFja2dyb3VuZCwgdGhlbiB0aGUgY2xpZW50CisoYXMgeW91IHdvdWxkIGRvIGZvciB0aGUgQysrIGV4YW1wbGUpLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvX29hc2lzIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NWMwOTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9fb2FzaXMKQEAgLTAsMCArMSwzMiBAQAorTmFtZTogdHV0b3JpYWwKK1ZlcnNpb246IDEuMC4wCitPQVNJU0Zvcm1hdDogMC4zCitTeW5vcHNpczogT0NhbWwgVHV0b3JpYWwgZXhhbXBsZQorQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitMaWNlbnNlOiBBcGFjaGUtMi4wCitIb21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWlsZFRvb2xzOiBvY2FtbGJ1aWxkCitQbHVnaW5zOiAgICAgTUVUQSAoMC4zKSwKKyAgRGV2RmlsZXMgKDAuMykKKworTGlicmFyeSB0dXRvcmlhbF90aHJpZnQKKyAgUGF0aDogZ2VuLW9jYW1sCisgIEZpbmRsaWJOYW1lOiB0dXRvcmlhbF90aHJpZnQKKyAgYnVpbGRUb29sczogb2NhbWxidWlsZAorICBCdWlsZERlcGVuZHM6IHRocmVhZHMsdGhyaWZ0CisgIE1vZHVsZXM6IENhbGN1bGF0b3IsU2hhcmVkX2NvbnN0cyxUdXRvcmlhbF9jb25zdHMsU2hhcmVkU2VydmljZSxTaGFyZWRfdHlwZXMsVHV0b3JpYWxfdHlwZXMKKyAgWE1FVEFSZXF1aXJlczogdGhyZWFkcworCitFeGVjdXRhYmxlIENhbGNDbGllbnQKKyAgUGF0aDogLgorICBNYWluSXM6IENhbGNDbGllbnQubWwKKyAgQnVpbGQkOiB0cnVlCisgIENvbXBpbGVkT2JqZWN0OiBiZXN0CisgIEJ1aWxkRGVwZW5kczogdGhyaWZ0LCB0dXRvcmlhbF90aHJpZnQsIHRocmVhZHMKKworRXhlY3V0YWJsZSBDYWxjU2VydmVyCisgIFBhdGg6IC4KKyAgTWFpbklzOiBDYWxjU2VydmVyLm1sCisgIEJ1aWxkJDogdHJ1ZQorICBDb21waWxlZE9iamVjdDogYmVzdAorICBCdWlsZERlcGVuZHM6IHRocmlmdCwgdHV0b3JpYWxfdGhyaWZ0LCB0aHJlYWRzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKaW5kZXggMWQ1OTY1Ni4uN2MyMzI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbApAQCAtMzcsMTAgKzM3LDEwIEBACiAKIHVzZSBEYXRhOjpEdW1wZXI7CiAKLW15ICRzb2NrZXQgICAgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJ2xvY2FsaG9zdCcsOTA5MCk7Ci1teSAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwxMDI0LDEwMjQpOwotbXkgJHByb3RvY29sICA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotbXkgJGNsaWVudCAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvckNsaWVudCgkcHJvdG9jb2wpOworbXkgJHNvY2tldCAgICA9IFRocmlmdDo6U29ja2V0LT5uZXcoJ2xvY2FsaG9zdCcsOTA5MCk7CitteSAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsMTAyNCwxMDI0KTsKK215ICRwcm90b2NvbCAgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7CitteSAkY2xpZW50ICAgID0gdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQtPm5ldygkcHJvdG9jb2wpOwogCiAKIGV2YWx7CkBAIC01Myw3ICs1Myw3IEBACiAgICAgbXkgJHN1bSA9ICRjbGllbnQtPmFkZCgxLDEpOwogICAgIHByaW50ICIxKzE9JHN1bVxuIjsKIAotICAgIG15ICR3b3JrID0gbmV3IHR1dG9yaWFsOjpXb3JrKCk7CisgICAgbXkgJHdvcmsgPSB0dXRvcmlhbDo6V29yay0+bmV3KCk7CiAKICAgICAkd29yay0+b3AodHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKTsKICAgICAkd29yay0+bnVtMSgxKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgJGNsaWVudC0+Y2FsY3VsYXRlKDEsICR3b3JrKTsKICAgICAgICAgcHJpbnQgIldob2EhIFdlIGNhbiBkaXZpZGUgYnkgemVybz9cbiI7CiAgICAgfTsgaWYoJEApIHsKLSAgICAgICAgd2FybiAiSW52YWxpZE9wZXJhdGlvbjogIi5EdW1wZXIoJEApOworICAgICAgICB3YXJuICdJbnZhbGlkT3BlcmF0aW9uOiAnLkR1bXBlcigkQCk7CiAgICAgfQogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OlNVQlRSQUNUKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbCBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbAppbmRleCBhNDBlYzY5Li5kZmU2Yjg5IDEwMDY0NAotLS0gYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKKysrIGIvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9wZXJsCisjIS91c3IvYmluL2VudiBwZXJsCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtNjcsMjAgKzY3LDIwIEBACiAgIH0gZWxzaWYgKCRvcCA9PSB0dXRvcmlhbDo6T3BlcmF0aW9uOjpESVZJREUpIHsKICAgICBpZiAoJG51bTIgPT0gMCkKICAgICB7Ci0gICAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKLSAgICAgICR4LT53aGF0KCRvcCk7CisgICAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKKyAgICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAgICR4LT53aHkoJ0Nhbm5vdCBkaXZpZGUgYnkgMCcpOwogICAgICAgZGllICR4OwogICAgIH0KICAgICAkdmFsID0gJG51bTEgLyAkbnVtMjsKICAgfSBlbHNlIHsKLSAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKLSAgICAkeC0+d2hhdCgkb3ApOworICAgIG15ICR4ID0gdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb24tPm5ldygpOworICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAkeC0+d2h5KCdJbnZhbGlkIG9wZXJhdGlvbicpOwogICAgIGRpZSAkeDsKICAgfQogCi0gIG15ICRsb2cgPSBuZXcgc2hhcmVkOjpTaGFyZWRTdHJ1Y3Q7CisgIG15ICRsb2cgPSBzaGFyZWQ6OlNoYXJlZFN0cnVjdC0+bmV3KCk7CiAgICRsb2ctPmtleSgkbG9naWQpOwogICAkbG9nLT52YWx1ZShpbnQoJHZhbCkpOwogICAkc2VsZi0+e2xvZ30tPnskbG9naWR9ID0gJGxvZzsKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAKIAogZXZhbCB7Ci0gIG15ICRoYW5kbGVyICAgICAgID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyOwotICBteSAkcHJvY2Vzc29yICAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3NvcigkaGFuZGxlcik7Ci0gIG15ICRzZXJ2ZXJzb2NrZXQgID0gbmV3IFRocmlmdDo6U2VydmVyU29ja2V0KDkwOTApOwotICBteSAkZm9ya2luZ3NlcnZlciA9IG5ldyBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXIoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CisgIG15ICRoYW5kbGVyICAgICAgID0gQ2FsY3VsYXRvckhhbmRsZXItPm5ldygpOworICBteSAkcHJvY2Vzc29yICAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworICBteSAkc2VydmVyc29ja2V0ICA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoOTA5MCk7CisgIG15ICRmb3JraW5nc2VydmVyID0gVGhyaWZ0OjpGb3JraW5nU2VydmVyLT5uZXcoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CiAgIHByaW50ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOwogICAkZm9ya2luZ3NlcnZlci0+c2VydmUoKTsKICAgcHJpbnQgImRvbmUuXG4iOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAppbmRleCBhNjYzOWQ1Li45MmRjM2NiIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocApAQCAtMSw1ICsxLDIyIEBACiAjIS91c3IvYmluL2VudiBwaHAKIDw/cGhwCisKK25hbWVzcGFjZSB0dXRvcmlhbFxwaHA7CisKK2Vycm9yX3JlcG9ydGluZyhFX0FMTCk7CisKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworJEdFTl9ESVIgPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uJykuJy9nZW4tcGhwJzsKKworJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7CiskbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ3NoYXJlZCcsICRHRU5fRElSKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbigndHV0b3JpYWwnLCAkR0VOX0RJUik7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDI5ICszNiwxMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSAnLi4vLi4vbGliL3BocC9zcmMnOwotCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RTb2NrZXQucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9USHR0cENsaWVudC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwotCi0vKioKLSAqIFN1cHByZXNzIGVycm9ycyBpbiBoZXJlLCB3aGljaCBoYXBwZW4gYmVjYXVzZSB3ZSBoYXZlIG5vdCBpbnN0YWxsZWQgaW50bwotICogJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy90dXRvcmlhbCcgbGlrZSB3ZSBhcmUgc3VwcG9zZWQgdG8hCi0gKgotICogTm9ybWFsbHkgd2Ugd291bGQgb25seSBoYXZlIHRvIGluY2x1ZGUgQ2FsY3VsYXRvci5waHAgd2hpY2ggd291bGQgcHJvcGVybHkKLSAqIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIGZyb20gdGhlaXIgcGFja2FnZXMvIGZvbGRlciBsb2NhdGlvbnMsIGJ1dCB3ZQotICogaW5jbHVkZSBldmVyeXRoaW5nIGhlcmUgZHVlIHRvIHRoZSBib2d1cyBwYXRoIHNldHVwLgotICovCi1lcnJvcl9yZXBvcnRpbmcoRV9OT05FKTsKLSRHRU5fRElSID0gJy4uL2dlbi1waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvc2hhcmVkL1NoYXJlZFNlcnZpY2UucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3NoYXJlZC9zaGFyZWRfdHlwZXMucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3R1dG9yaWFsL0NhbGN1bGF0b3IucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3R1dG9yaWFsL3R1dG9yaWFsX3R5cGVzLnBocCc7Ci1lcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEh0dHBDbGllbnQ7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwogCiB0cnkgewogICBpZiAoYXJyYXlfc2VhcmNoKCctLWh0dHAnLCAkYXJndikpIHsKQEAgLTUxLDcgKzUwLDcgQEAKICAgfQogICAkdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgJGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KCRwcm90b2NvbCk7CisgICRjbGllbnQgPSBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JDbGllbnQoJHByb3RvY29sKTsKIAogICAkdHJhbnNwb3J0LT5vcGVuKCk7CiAKQEAgLTYxLDIwICs2MCwyMCBAQAogICAkc3VtID0gJGNsaWVudC0+YWRkKDEsMSk7CiAgIHByaW50ICIxKzE9JHN1bVxuIjsKIAotICAkd29yayA9IG5ldyB0dXRvcmlhbF9Xb3JrKCk7CisgICR3b3JrID0gbmV3IFx0dXRvcmlhbFxXb3JrKCk7CiAKLSAgJHdvcmstPm9wID0gdHV0b3JpYWxfT3BlcmF0aW9uOjpESVZJREU7CisgICR3b3JrLT5vcCA9IFx0dXRvcmlhbFxPcGVyYXRpb246OkRJVklERTsKICAgJHdvcmstPm51bTEgPSAxOwogICAkd29yay0+bnVtMiA9IDA7CiAKICAgdHJ5IHsKICAgICAkY2xpZW50LT5jYWxjdWxhdGUoMSwgJHdvcmspOwogICAgIHByaW50ICJXaG9hISBXZSBjYW4gZGl2aWRlIGJ5IHplcm8/XG4iOwotICB9IGNhdGNoICh0dXRvcmlhbF9JbnZhbGlkT3BlcmF0aW9uICRpbykgeworICB9IGNhdGNoIChcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbiAkaW8pIHsKICAgICBwcmludCAiSW52YWxpZE9wZXJhdGlvbjogJGlvLT53aHlcbiI7CiAgIH0KIAotICAkd29yay0+b3AgPSB0dXRvcmlhbF9PcGVyYXRpb246OlNVQlRSQUNUOworICAkd29yay0+b3AgPSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpTVUJUUkFDVDsKICAgJHdvcmstPm51bTEgPSAxNTsKICAgJHdvcmstPm51bTIgPSAxMDsKICAgJGRpZmYgPSAkY2xpZW50LT5jYWxjdWxhdGUoMSwgJHdvcmspOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAppbmRleCAyMzViMTViLi41YTliNDliIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocApAQCAtMSw1ICsxLDIyIEBACiAjIS91c3IvYmluL2VudiBwaHAKIDw/cGhwCisKK25hbWVzcGFjZSB0dXRvcmlhbFxwaHA7CisKK2Vycm9yX3JlcG9ydGluZyhFX0FMTCk7CisKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworJEdFTl9ESVIgPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uJykuJy9nZW4tcGhwJzsKKworJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7CiskbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ3NoYXJlZCcsICRHRU5fRElSKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbigndHV0b3JpYWwnLCAkR0VOX0RJUik7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTMxLDMwICs0OCwxMSBAQAogICBpbmlfc2V0KCJkaXNwbGF5X2Vycm9ycyIsICJzdGRlcnIiKTsKIH0KIAotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uLy4uJykuJy9saWIvcGhwL3NyYyc7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRQaHBTdHJlYW07Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CiAKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwotCi0vKioKLSAqIFN1cHByZXNzIGVycm9ycyBpbiBoZXJlLCB3aGljaCBoYXBwZW4gYmVjYXVzZSB3ZSBoYXZlIG5vdCBpbnN0YWxsZWQgaW50bwotICogJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy90dXRvcmlhbCcgbGlrZSB3ZSBhcmUgc3VwcG9zZWQgdG8hCi0gKgotICogTm9ybWFsbHkgd2Ugd291bGQgb25seSBoYXZlIHRvIGluY2x1ZGUgQ2FsY3VsYXRvci5waHAgd2hpY2ggd291bGQgcHJvcGVybHkKLSAqIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIGZyb20gdGhlaXIgcGFja2FnZXMvIGZvbGRlciBsb2NhdGlvbnMsIGJ1dCB3ZQotICogaW5jbHVkZSBldmVyeXRoaW5nIGhlcmUgZHVlIHRvIHRoZSBib2d1cyBwYXRoIHNldHVwLgotICovCi1lcnJvcl9yZXBvcnRpbmcoRV9OT05FKTsKLSRHRU5fRElSID0gcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykuJy8uLicpLicvZ2VuLXBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9zaGFyZWQvU2hhcmVkU2VydmljZS5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvc2hhcmVkL3NoYXJlZF90eXBlcy5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvdHV0b3JpYWwvQ2FsY3VsYXRvci5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMucGhwJzsKLWVycm9yX3JlcG9ydGluZyhFX0FMTCk7Ci0KLWNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIGltcGxlbWVudHMgQ2FsY3VsYXRvcklmIHsKK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyIGltcGxlbWVudHMgXHR1dG9yaWFsXENhbGN1bGF0b3JJZiB7CiAgIHByb3RlY3RlZCAkbG9nID0gYXJyYXkoKTsKIAogICBwdWJsaWMgZnVuY3Rpb24gcGluZygpIHsKQEAgLTY2LDM1ICs2NCwzNSBAQAogICAgIHJldHVybiAkbnVtMSArICRudW0yOwogICB9CiAKLSAgcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSgkbG9naWQsICR3KSB7CisgIHB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGUoJGxvZ2lkLCBcdHV0b3JpYWxcV29yayAkdykgewogICAgIGVycm9yX2xvZygiY2FsY3VsYXRlKHskbG9naWR9LCB7eyR3LT5vcH0sIHskdy0+bnVtMX0sIHskdy0+bnVtMn19KSIpOwogICAgIHN3aXRjaCAoJHctPm9wKSB7Ci0gICAgICBjYXNlIHR1dG9yaWFsX09wZXJhdGlvbjo6QUREOgorICAgICAgY2FzZSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpBREQ6CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSArICR3LT5udW0yOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpTVUJUUkFDVDoKKyAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6U1VCVFJBQ1Q6CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSAtICR3LT5udW0yOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpNVUxUSVBMWToKKyAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6TVVMVElQTFk6CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSAqICR3LT5udW0yOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpESVZJREU6CisgICAgICBjYXNlIFx0dXRvcmlhbFxPcGVyYXRpb246OkRJVklERToKICAgICAgICAgaWYgKCR3LT5udW0yID09IDApIHsKLSAgICAgICAgICAkaW8gPSBuZXcgdHV0b3JpYWxfSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAgICRpby0+d2hhdCA9ICR3LT5vcDsKKyAgICAgICAgICAkaW8gPSBuZXcgXHR1dG9yaWFsXEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAkaW8tPndoYXRPcCA9ICR3LT5vcDsKICAgICAgICAgICAkaW8tPndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOwogICAgICAgICAgIHRocm93ICRpbzsKICAgICAgICAgfQogICAgICAgICAkdmFsID0gJHctPm51bTEgLyAkdy0+bnVtMjsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICAkaW8gPSBuZXcgdHV0b3JpYWxfSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAkaW8tPndoYXQgPSAkdy0+b3A7CisgICAgICAgICRpbyA9IG5ldyBcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAkaW8tPndoYXRPcCA9ICR3LT5vcDsKICAgICAgICAgJGlvLT53aHkgPSAiSW52YWxpZCBPcGVyYXRpb24iOwogICAgICAgICB0aHJvdyAkaW87CiAgICAgfQogCi0gICAgJGxvZyA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAkbG9nID0gbmV3IFxzaGFyZWRcU2hhcmVkU3RydWN0KCk7CiAgICAgJGxvZy0+a2V5ID0gJGxvZ2lkOwogICAgICRsb2ctPnZhbHVlID0gKHN0cmluZykkdmFsOwogICAgICR0aGlzLT5sb2dbJGxvZ2lkXSA9ICRsb2c7CkBAIC0xMDcsNyArMTA1LDcgQEAKICAgICAvLyBUaGlzIGFjdHVhbGx5IGRvZXNuJ3Qgd29yayBiZWNhdXNlIHRoZSBQSFAgaW50ZXJwcmV0ZXIgaXMKICAgICAvLyByZXN0YXJ0ZWQgZm9yIGV2ZXJ5IHJlcXVlc3QuCiAgICAgLy9yZXR1cm4gJHRoaXMtPmxvZ1ska2V5XTsKLSAgICByZXR1cm4gbmV3IFNoYXJlZFN0cnVjdChhcnJheSgia2V5IiA9PiAka2V5LCAidmFsdWUiID0+ICJQSFAgaXMgc3RhdGVsZXNzISIpKTsKKyAgICByZXR1cm4gbmV3IFxzaGFyZWRcU2hhcmVkU3RydWN0KGFycmF5KCJrZXkiID0+ICRrZXksICJ2YWx1ZSIgPT4gIlBIUCBpcyBzdGF0ZWxlc3MhIikpOwogICB9CiAKICAgcHVibGljIGZ1bmN0aW9uIHppcCgpIHsKQEAgLTEyMiw3ICsxMjAsNyBAQAogfQogCiAkaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpOwotJHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKCRoYW5kbGVyKTsKKyRwcm9jZXNzb3IgPSBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JQcm9jZXNzb3IoJGhhbmRsZXIpOwogCiAkdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChuZXcgVFBocFN0cmVhbShUUGhwU3RyZWFtOjpNT0RFX1IgfCBUUGhwU3RyZWFtOjpNT0RFX1cpKTsKICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCwgdHJ1ZSwgdHJ1ZSk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5IGIvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQppbmRleCBhZTI5ZmVkLi4wNzdkYWExIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKQEAgLTI2LDcgKzI2LDggQEAKICMgY2hkaXIoMikgaW50byB0aGUgdHV0b3JpYWwgZGlyZWN0b3J5Lgogb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpKQogCisKIGNsYXNzIEhhbmRsZXIoQ0dJSFRUUFNlcnZlci5DR0lIVFRQUmVxdWVzdEhhbmRsZXIpOgotICBjZ2lfZGlyZWN0b3JpZXMgID0gWycvcGhwJ10KKyAgICBjZ2lfZGlyZWN0b3JpZXMgPSBbJy9waHAnXQogCiBCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKCgnJywgODA4MCksIEhhbmRsZXIpLnNlcnZlX2ZvcmV2ZXIoKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI3M2MxZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1weS50b3JuYWRvL3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5LnRvcm5hZG8vc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkudG9ybmFkby90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25DbGllbnQucHkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25DbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDI2MTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CkBAIC0wLDAgKzEsMTA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIFdvcmssIEludmFsaWRPcGVyYXRpb24KKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4KK2Zyb20gdG9ybmFkbyBpbXBvcnQgaW9sb29wCisKKworQGdlbi5jb3JvdXRpbmUKK2RlZiBjb21tdW5pY2F0ZSgpOgorICAgICMgY3JlYXRlIGNsaWVudAorICAgIHRyYW5zcG9ydCA9IFRUb3JuYWRvLlRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KCdsb2NhbGhvc3QnLCA5MDkwKQorICAgICMgb3BlbiB0aGUgdHJhbnNwb3J0LCBiYWlsIG9uIGVycm9yCisgICAgdHJ5OgorICAgICAgICB5aWVsZCB0cmFuc3BvcnQub3BlbigpCisgICAgICAgIHByaW50KCdUcmFuc3BvcnQgaXMgb3BlbmVkJykKKyAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGV4OgorICAgICAgICBsb2dnaW5nLmVycm9yKGV4KQorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKCkKKworICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHRyYW5zcG9ydCwgcGZhY3RvcnkpCisKKyAgICAjIHBpbmcKKyAgICB5aWVsZCBjbGllbnQucGluZygpCisgICAgcHJpbnQoInBpbmcoKSIpCisKKyAgICAjIGFkZAorICAgIHN1bV8gPSB5aWVsZCBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoIjEgKyAxID0gezB9Ii5mb3JtYXQoc3VtXykpCisKKyAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRob3V0IGEgY2FsbGJhY2sgKHNjaGVkdWxlIHRoZSB3cml0ZSBhbmQgY29udGludWUKKyAgICAjIHdpdGhvdXQgYmxvY2tpbmcpCisgICAgY2xpZW50LnppcCgpCisgICAgcHJpbnQoInppcCgpIHdpdGhvdXQgY2FsbGJhY2siKQorCisgICAgIyBtYWtlIGEgb25ld2F5IGNhbGwgd2l0aCBhIGNhbGxiYWNrICh3ZSdsbCB3YWl0IGZvciB0aGUgc3RyZWFtIHdyaXRlIHRvCisgICAgIyBjb21wbGV0ZSBiZWZvcmUgY29udGludWluZykKKyAgICBjbGllbnQuemlwKCkKKyAgICBwcmludCgiemlwKCkgd2l0aCBjYWxsYmFjayIpCisKKyAgICAjIGNhbGN1bGF0ZSAxLzAKKyAgICB3b3JrID0gV29yaygpCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKKyAgICB3b3JrLm51bTEgPSAxCisgICAgd29yay5udW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoIldob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybyA/IC0+IHswfSIuZm9ybWF0KHF1b3RpZW50KSkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBpbzoKKyAgICAgICAgcHJpbnQoIkludmFsaWRPcGVyYXRpb246IHswfSIuZm9ybWF0KGlvKSkKKworICAgICMgY2FsY3VsYXRlIDE1LTEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKKworICAgIGRpZmYgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoIjE1IC0gMTAgPSB7MH0iLmZvcm1hdChkaWZmKSkKKworICAgICMgZ2V0U3RydWN0CisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCJDaGVjayBsb2c6IHswfSIuZm9ybWF0KGxvZy52YWx1ZSkpCisKKyAgICAjIGNsb3NlIHRoZSB0cmFuc3BvcnQKKyAgICBjbGllbnQuX3RyYW5zcG9ydC5jbG9zZSgpCisgICAgcmFpc2UgZ2VuLlJldHVybigpCisKKworZGVmIG1haW4oKToKKyAgICAjIGNyZWF0ZSBhbiBpb2xvb3AsIGRvIHRoZSBhYm92ZSwgdGhlbiBzdG9wCisgICAgaW9sb29wLklPTG9vcC5jdXJyZW50KCkucnVuX3N5bmMoY29tbXVuaWNhdGUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMjlhMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5CkBAIC0wLDAgKzEsMTAwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCisKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnRvcm5hZG8nKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IE9wZXJhdGlvbiwgSW52YWxpZE9wZXJhdGlvbgorCitmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAorCitmcm9tIHRocmlmdCBpbXBvcnQgVFRvcm5hZG8KK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0b3JuYWRvIGltcG9ydCBpb2xvb3AKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQorCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCJwaW5nKCkiKQorCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgiYWRkKHt9LCB7fSkiLmZvcm1hdChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgorCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCJjYWxjdWxhdGUoe30sIHt9KSIuZm9ybWF0KGxvZ2lkLCB3b3JrKSkKKworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAiSW52YWxpZCBvcGVyYXRpb24iCisgICAgICAgICAgICByYWlzZSB4CisKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgiZ2V0U3RydWN0KHt9KSIuZm9ybWF0KGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgiemlwKCkiKQorCisKK2RlZiBtYWluKCk6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHByb2Nlc3NvciwgcGZhY3RvcnkpCisKKyAgICBwcmludCgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpCisgICAgc2VydmVyLmJpbmQoOTA5MCkKKyAgICBzZXJ2ZXIuc3RhcnQoMSkKKyAgICBpb2xvb3AuSU9Mb29wLmluc3RhbmNlKCkuc3RhcnQoKQorICAgIHByaW50KCJkb25lLiIpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwY2QzNDIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weQorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJHtQWVRIT059IFB5dGhvblNlcnZlci5weQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtQWVRIT059IFB5dGhvbkNsaWVudC5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCVB5dGhvbkNsaWVudC5weSBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25TZXJ2ZXIudGFjCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5CmluZGV4IDI3YTNkNTMuLjYzZGRlN2UgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5CkBAIC0xOSw1MCArMTksNTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2ltcG9ydCBnbG9iCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weScpCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCiAKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5kZWZlciBpbXBvcnQgaW5saW5lQ2FsbGJhY2tzCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IHJlYWN0b3IKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgQ2xpZW50Q3JlYXRvcgogCi1mcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAKKwogQGlubGluZUNhbGxiYWNrcwogZGVmIG1haW4oY2xpZW50KToKLSAgeWllbGQgY2xpZW50LnBpbmcoKQotICBwcmludCAncGluZygpJworICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKIAotICBzdW0gPSB5aWVsZCBjbGllbnQuYWRkKDEsMSkKLSAgcHJpbnQgJzErMT0lZCcgJSAoc3VtKQorICAgIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCi0gIHdvcmsubnVtMSA9IDE1Ci0gIHdvcmsubnVtMiA9IDEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKIAotICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAnMTUtMTA9JWQnICUgKGRpZmYpCisgICAgZGlmZiA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCiAKLSAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQotICByZWFjdG9yLnN0b3AoKQorICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkpKQorICAgIHJlYWN0b3Iuc3RvcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZCA9IENsaWVudENyZWF0b3IocmVhY3RvciwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKaW5kZXggNjEzMGI5Mi4uMWIwZTJkNSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKQEAgLTE5LDExICsxOSwxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraW1wb3J0IGdsb2IKIGltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnLi4vZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgogCiBmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAogCkBAIC0zMiw2MSArMzQsNjMgQEAKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCisKIAogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6Ci0gIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkgIAotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5sb2cgPSB7fQorICAgIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkKIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQogCi0gIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKLSAgICBwcmludCAnYWRkKCVkLCVkKScgJSAobjEsIG4yKQotICAgIHJldHVybiBuMStuMgorICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKLSAgICBwcmludCAnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKQorICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgotICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgotICAgICAgaWYgd29yay5udW0yID09IDA6Ci0gICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgICAgeC53aGF0ID0gd29yay5vcAotICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCi0gICAgICAgIHJhaXNlIHgKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgotICAgIGVsc2U6Ci0gICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKLSAgICAgIHJhaXNlIHgKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCiAKLSAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQotICAgIGxvZy5rZXkgPSBsb2dpZAotICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQotICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgotICAgIHByaW50ICdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpCi0gICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiB6aXAoc2VsZik6Ci0gICAgcHJpbnQgJ3ppcCgpJworICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCiAgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKLSAgICBzZXJ2ZXIgPSByZWFjdG9yLmxpc3RlblRDUCg5MDkwLAotICAgICAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgIHBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorICAgIHNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICA5MDkwLAorICAgICAgICBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHByb2Nlc3NvciwgcGZhY3RvcnkpLAorICAgICAgICBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCiAgICAgcmVhY3Rvci5ydW4oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCmluZGV4IDExZjBmOGYuLjA0Nzk2MzYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYworKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKQEAgLTIyLDExICsyMiwxNCBAQAogZnJvbSB0d2lzdGVkLmFwcGxpY2F0aW9uIGltcG9ydCBpbnRlcm5ldCwgc2VydmljZQogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZAogCitpbXBvcnQgZ2xvYgogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHkudHdpc3RlZCcpCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgogZnJvbSBQeXRob25TZXJ2ZXIgaW1wb3J0IENhbGN1bGF0b3JIYW5kbGVyCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKIAogZGVmIG1ha2VfYXBwbGljYXRpb24oKToKICAgICBhcHBsaWNhdGlvbiA9IHNlcnZpY2UuQXBwbGljYXRpb24oJ0NhbGNTZXJ2ZXInKQpAQCAtMzQsOCArMzcsOSBAQAogICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCiAgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKIAotICAgIHNlcnZlckZhY3RvcnkgPSBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgc2VydmVyRmFjdG9yeSA9IFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkoCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKIAogICAgIGNhbGNTZXJ2aWNlID0gaW50ZXJuZXQuVENQU2VydmVyKDkwOTAsIHNlcnZlckZhY3RvcnkpCiAKQEAgLTQ1LDQgKzQ5LDUgQEAKIAogICAgIHJldHVybiBhcHBsaWNhdGlvbgogCi1hcHBsaWNhdGlvbiA9IG1ha2VfYXBwbGljYXRpb24oKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBhcHBsaWNhdGlvbiA9IG1ha2VfYXBwbGljYXRpb24oKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZGI4MTZkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5IGdlbi1weS9zaGFyZWQvU2hhcmVkU2VydmljZS5weTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHkgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weQorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJHtQWVRIT059IFB5dGhvblNlcnZlci5weQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtQWVRIT059IFB5dGhvbkNsaWVudC5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCXNldHVwLmNmZyBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25DbGllbnQucHkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQppbmRleCA5MTZlOTE1Li5hNmMxOTY2IDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKKysrIGIvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CkBAIC0yMCw2MyArMjAsNzAgQEAKICMKIAogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHknKQoraW1wb3J0IGdsb2IKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCiAKIGZyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAKLXRyeToKIAotICAjIE1ha2Ugc29ja2V0Ci0gIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0JywgOTA5MCkKK2RlZiBtYWluKCk6CisgICAgIyBNYWtlIHNvY2tldAorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0JywgOTA5MCkKIAotICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdwotICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCisgICAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKKyAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCiAKLSAgIyBXcmFwIGluIGEgcHJvdG9jb2wKLSAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAjIFdyYXAgaW4gYSBwcm90b2NvbAorICAgIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCiAKLSAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCi0gIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKQorICAgICMgQ3JlYXRlIGEgY2xpZW50IHRvIHVzZSB0aGUgcHJvdG9jb2wgZW5jb2RlcgorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKQogCi0gICMgQ29ubmVjdCEKLSAgdHJhbnNwb3J0Lm9wZW4oKQorICAgICMgQ29ubmVjdCEKKyAgICB0cmFuc3BvcnQub3BlbigpCiAKLSAgY2xpZW50LnBpbmcoKQotICBwcmludCAncGluZygpJworICAgIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKIAotICBzdW0gPSBjbGllbnQuYWRkKDEsMSkKLSAgcHJpbnQgJzErMT0lZCcgJSAoc3VtKQorICAgIHN1bV8gPSBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoJzErMT0lZCcgJSBzdW1fKQogCi0gIHdvcmsgPSBXb3JrKCkKKyAgICB3b3JrID0gV29yaygpCiAKLSAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKLSAgd29yay5udW0xID0gMQotICB3b3JrLm51bTIgPSAwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKKyAgICB3b3JrLm51bTEgPSAxCisgICAgd29yay5udW0yID0gMAogCi0gIHRyeToKLSAgICBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKLSAgICBwcmludCAnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycKLSAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24sIGlvOgotICAgIHByaW50ICdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBpbworICAgIHRyeToKKyAgICAgICAgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgICAgIHByaW50KCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JykKKyAgICAgICAgcHJpbnQoJ0ZZSSB0aGUgYW5zd2VyIGlzICVkJyAlIHF1b3RpZW50KQorICAgIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uIGFzIGU6CisgICAgICAgIHByaW50KCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKLSAgd29yay5udW0xID0gMTUKLSAgd29yay5udW0yID0gMTAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCisgICAgd29yay5udW0xID0gMTUKKyAgICB3b3JrLm51bTIgPSAxMAogCi0gIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gIHByaW50ICcxNS0xMD0lZCcgJSAoZGlmZikKKyAgICBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCcxNS0xMD0lZCcgJSBkaWZmKQogCi0gIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSkKLSAgcHJpbnQgJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkKKyAgICBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpCisgICAgcHJpbnQoJ0NoZWNrIGxvZzogJXMnICUgbG9nLnZhbHVlKQogCi0gICMgQ2xvc2UhCi0gIHRyYW5zcG9ydC5jbG9zZSgpCisgICAgIyBDbG9zZSEKKyAgICB0cmFuc3BvcnQuY2xvc2UoKQogCi1leGNlcHQgVGhyaWZ0LlRFeGNlcHRpb24sIHR4OgotICBwcmludCAnJXMnICUgKHR4Lm1lc3NhZ2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdHJ5OgorICAgICAgICBtYWluKCkKKyAgICBleGNlcHQgVGhyaWZ0LlRFeGNlcHRpb24gYXMgdHg6CisgICAgICAgIHByaW50KCclcycgJSB0eC5tZXNzYWdlKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CmluZGV4IDYzZjk5M2IuLmU2NDIxZWYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKQEAgLTE5LDExICsxOSwxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraW1wb3J0IGdsb2IKIGltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnLi4vZ2VuLXB5JykKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCiAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKQEAgLTMyLDY1ICszNCw3MCBAQAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCiAKKwogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmxvZyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CiAKLSAgZGVmIHBpbmcoc2VsZik6Ci0gICAgcHJpbnQgJ3BpbmcoKScKKyAgICBkZWYgcGluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3BpbmcoKScpCiAKLSAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgotICAgIHByaW50ICdhZGQoJWQsJWQpJyAlIChuMSwgbjIpCi0gICAgcmV0dXJuIG4xK24yCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKIAotICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKLSAgICBwcmludCAnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKQorICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKIAotICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6Ci0gICAgICBpZiB3b3JrLm51bTIgPT0gMDoKLSAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKLSAgICAgICAgcmFpc2UgeAotICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCi0gICAgZWxzZToKLSAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJwotICAgICAgcmFpc2UgeAorICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CiAKLSAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQotICAgIGxvZy5rZXkgPSBsb2dpZAotICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQotICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cua2V5ID0gbG9naWQKKyAgICAgICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZwogCi0gICAgcmV0dXJuIHZhbAorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgotICAgIHByaW50ICdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpCi0gICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQogCi0gIGRlZiB6aXAoc2VsZik6Ci0gICAgcHJpbnQgJ3ppcCgpJworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCiAKLWhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCi1wcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQotdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KDkwOTApCi10ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCi1wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKIAotc2VydmVyID0gVFNlcnZlci5UU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdD0nMTI3LjAuMC4xJywgcG9ydD05MDkwKQorICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKIAotIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCi0jc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKLSNzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgc2VydmVyID0gVFNlcnZlci5UU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCiAKLXByaW50ICdTdGFydGluZyB0aGUgc2VydmVyLi4uJwotc2VydmVyLnNlcnZlKCkKLXByaW50ICdkb25lLicKKyAgICAjIFlvdSBjb3VsZCBkbyBvbmUgb2YgdGhlc2UgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZGVkU2VydmVyKAorICAgICMgICAgIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRQb29sU2VydmVyKAorICAgICMgICAgIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisKKyAgICBwcmludCgnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpCisgICAgc2VydmVyLnNlcnZlKCkKKyAgICBwcmludCgnZG9uZS4nKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvc2V0dXAuY2ZnIGIvdHV0b3JpYWwvcHkvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzEyMGEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQoraWdub3JlID0gRTQwMgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzcyNDEzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1weS9jYWxjdWxhdG9yLnJiIGdlbi1weS9zaGFyZWRfc2VydmljZS5yYjogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcmIgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkvY2FsY3VsYXRvci5yYgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJHtSVUJZfSBSdWJ5U2VydmVyLnJiCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1JVQll9IFJ1YnlDbGllbnQucmIKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSoKKworRVhUUkFfRElTVCA9IFwKKwlSdWJ5U2VydmVyLnJiIFwKKwlSdWJ5Q2xpZW50LnJiCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9SdWJ5Q2xpZW50LnJiIGIvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYgppbmRleCBmZDcyNjk5Li45YTVhYTQzIDEwMDc1NQotLS0gYS90dXRvcmlhbC9yYi9SdWJ5Q2xpZW50LnJiCisrKyBiL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIKQEAgLTE5LDcgKzE5LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSQ6LnB1c2goJy4uL2dlbi1yYicpCiskOi5wdXNoKCdnZW4tcmInKQogJDoudW5zaGlmdCAnLi4vLi4vbGliL3JiL2xpYicKIAogcmVxdWlyZSAndGhyaWZ0JwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYiBiL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIKaW5kZXggMzBhYTdmMi4uMWQ3MDdkNyAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYgorKysgYi90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiCkBAIC0xOSw3ICsxOSw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0kOi5wdXNoKCcuLi9nZW4tcmInKQorJDoucHVzaCgnZ2VuLXJiJykKICQ6LnVuc2hpZnQgJy4uLy4uL2xpYi9yYi9saWInCiAKIHJlcXVpcmUgJ3RocmlmdCcKQEAgLTUyLDE0ICs1MiwxNCBAQAogICAgIGVsc2lmIHdvcmsub3AgPT0gT3BlcmF0aW9uOjpESVZJREUKICAgICAgIGlmIHdvcmsubnVtMiA9PSAwCiAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uLm5ldygpCi0gICAgICAgIHgud2hhdCA9IHdvcmsub3AKKyAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCiAgICAgICAgIHgud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKICAgICAgICAgcmFpc2UgeAogICAgICAgZW5kCiAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKICAgICBlbHNlCiAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbi5uZXcoKQotICAgICAgeC53aGF0ID0gd29yay5vcAorICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCiAgICAgICB4LndoeSA9ICJJbnZhbGlkIG9wZXJhdGlvbiIKICAgICAgIHJhaXNlIHgKICAgICBlbmQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwgYi90dXRvcmlhbC9ycy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGEwZGEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTYgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQtdHV0b3JpYWwiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+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+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyB6aXAiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycyBiL3R1dG9yaWFsL3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMDdlNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK3B1YiBtb2Qgc2hhcmVkOworcHViIG1vZCB0dXRvcmlhbDsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CmluZGV4IDQ3NWU3ZjguLmYxNjg1YmQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKKysrIGIvdHV0b3JpYWwvc2hhcmVkLnRocmlmdApAQCAtMjIsOSArMjIsMTUgQEAKICAqIHRoZXNlIGRlZmluaXRpb25zLgogICovCiAKK25hbWVzcGFjZSBjbCBzaGFyZWQKIG5hbWVzcGFjZSBjcHAgc2hhcmVkCituYW1lc3BhY2UgZCBzaGFyZSAvLyAic2hhcmVkIiB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGVwb255bW91cyBEIGtleXdvcmQuCituYW1lc3BhY2UgZGFydCBzaGFyZWQKIG5hbWVzcGFjZSBqYXZhIHNoYXJlZAogbmFtZXNwYWNlIHBlcmwgc2hhcmVkCituYW1lc3BhY2UgcGhwIHNoYXJlZAorbmFtZXNwYWNlIGhheGUgc2hhcmVkCituYW1lc3BhY2UgbmV0Y29yZSBzaGFyZWQKIAogc3RydWN0IFNoYXJlZFN0cnVjdCB7CiAgIDE6IGkzMiBrZXkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAppbmRleCAzZWE0OTZjLi5lMDI3NTQ2IDEwMDY0NAotLS0gYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKysrIGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CkBAIC0zMiw3ICszMiw3IEBACiAgKiBUaGUgZmlyc3QgdGhpbmcgdG8ga25vdyBhYm91dCBhcmUgdHlwZXMuIFRoZSBhdmFpbGFibGUgdHlwZXMgaW4gVGhyaWZ0IGFyZToKICAqCiAgKiAgYm9vbCAgICAgICAgQm9vbGVhbiwgb25lIGJ5dGUKLSAqICBieXRlICAgICAgICBTaWduZWQgYnl0ZQorICogIGk4IChieXRlKSAgIFNpZ25lZCA4LWJpdCBpbnRlZ2VyCiAgKiAgaTE2ICAgICAgICAgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCiAgKiAgaTMyICAgICAgICAgU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCiAgKiAgaTY0ICAgICAgICAgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCkBAIC02MiwxMCArNjIsMTYgQEAKICAqIFRocmlmdCBmaWxlcyBjYW4gbmFtZXNwYWNlLCBwYWNrYWdlLCBvciBwcmVmaXggdGhlaXIgb3V0cHV0IGluIHZhcmlvdXMKICAqIHRhcmdldCBsYW5ndWFnZXMuCiAgKi8KKworbmFtZXNwYWNlIGNsIHR1dG9yaWFsCiBuYW1lc3BhY2UgY3BwIHR1dG9yaWFsCituYW1lc3BhY2UgZCB0dXRvcmlhbAorbmFtZXNwYWNlIGRhcnQgdHV0b3JpYWwKIG5hbWVzcGFjZSBqYXZhIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGhwIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGVybCB0dXRvcmlhbAorbmFtZXNwYWNlIGhheGUgdHV0b3JpYWwKK25hbWVzcGFjZSBuZXRjb3JlIHR1dG9yaWFsCiAKIC8qKgogICogVGhyaWZ0IGxldHMgeW91IGRvIHR5cGVkZWZzIHRvIGdldCBwcmV0dHkgbmFtZXMgZm9yIHlvdXIgdHlwZXMuIFN0YW5kYXJkCkBAIC0xMTEsNyArMTE3LDcgQEAKICAqIFN0cnVjdHMgY2FuIGFsc28gYmUgZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgbmFzdHkuCiAgKi8KIGV4Y2VwdGlvbiBJbnZhbGlkT3BlcmF0aW9uIHsKLSAgMTogaTMyIHdoYXQsCisgIDE6IGkzMiB3aGF0T3AsCiAgIDI6IHN0cmluZyB3aHkKIH0KIAo=